<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://codedchords.dev/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;codedchords.dev</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It&#x27;s free.</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>Coded Chords</tabi:current_section>
    </tabi:metadata><title>Coded Chords</title>
        <subtitle>A personal blog</subtitle>
    <link href="https://codedchords.dev/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://codedchords.dev" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-07-21T15:56:41+09:00</updated><id>https://codedchords.dev/atom.xml</id><entry xml:lang="en">
        <title>高中正義 「A Fair Wind」をカバーしてみた</title>
        <published>2026-07-21T15:56:41+09:00</published>
        <updated>2026-07-21T15:56:41+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/fair-wind/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/fair-wind/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;fair-wind&amp;#x2F;cover.webp?h=75c94da6227c700f36cc&quot;
  alt=&quot;Cover&quot; width=&quot;1376&quot; height=&quot;768&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;週末、久しぶりに書店へ立ち寄った際、『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4wivuV8&quot;&gt;レコード・コレクターズ 2026年8月号&lt;&#x2F;a&gt;』という雑誌の表紙が、アルバム『TAKANAKA』で使われた赤いジャケットの高中正義さんでした。特集が組まれており、購入して読んでみました。&lt;&#x2F;p&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:504px;margin:0px;padding:5px;text-align:center;overflow:hidden;&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td style=&quot;width:240px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;ichiba&#x2F;138a4e63.883dc2f1.138a4e64.8db30ea5&#x2F;?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18684518%2F&amp;link_type=picttext&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D&quot; target=&quot;_blank&quot; rel=&quot;nofollow sponsored noopener&quot; style=&quot;word-wrap:break-word;&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;hbb.afl.rakuten.co.jp&#x2F;hgb&#x2F;138a4e63.883dc2f1.138a4e64.8db30ea5&#x2F;?me_id=1213310&amp;item_id=22004847&amp;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F0866%2F4912196370866_1_2.jpg%3F_ex%3D240x240&amp;s=240x240&amp;t=picttext&quot; border=&quot;0&quot; style=&quot;margin:2px&quot; alt=&quot;[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]&quot; title=&quot;[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]&quot;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;vertical-align:top;width:248px;display: block;&quot;&gt;&lt;p style=&quot;font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;ichiba&#x2F;138a4e63.883dc2f1.138a4e64.8db30ea5&#x2F;?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18684518%2F&amp;link_type=picttext&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D&quot; target=&quot;_blank&quot; rel=&quot;nofollow sponsored noopener&quot; style=&quot;word-wrap:break-word;&quot;&gt;レコード・コレクターズ 2026年 8月号 [雑誌]&lt;&#x2F;a&gt;&lt;br&gt;&lt;span &gt;価格：929円（税込、送料無料)&lt;&#x2F;span&gt; &lt;span style=&quot;color:#BBB&quot;&gt;(2026&#x2F;7&#x2F;21時点)&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;&lt;div style=&quot;margin:10px;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;ichiba&#x2F;138a4e63.883dc2f1.138a4e64.8db30ea5&#x2F;?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18684518%2F&amp;link_type=picttext&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D&quot; target=&quot;_blank&quot; rel=&quot;nofollow sponsored noopener&quot; style=&quot;word-wrap:break-word;&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;static.affiliate.rakuten.co.jp&#x2F;makelink&#x2F;rl.svg&quot; style=&quot;float:left;max-height:27px;width:auto;margin-top:0&quot; &gt;&lt;&#x2F;a&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;ichiba&#x2F;138a4e63.883dc2f1.138a4e64.8db30ea5&#x2F;?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18684518%2F%3Fscid%3Daf_pc_bbtn&amp;link_type=picttext&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ==&quot; target=&quot;_blank&quot; rel=&quot;nofollow sponsored noopener&quot; style=&quot;word-wrap:break-word;&quot;&gt;&lt;div style=&quot;float:right;width:41%;height:27px;background-color:#bf0000;color:#fff!important;font-size:12px;font-weight:500;line-height:27px;margin-left:1px;padding: 0 12px;border-radius:16px;cursor:pointer;text-align:center;&quot;&gt; 楽天で購入 &lt;&#x2F;div&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;table&gt;&lt;&#x2F;div&gt;&lt;br&gt;&lt;p style=&quot;color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word&quot;&gt;&lt;&#x2F;p&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;table&gt;
&lt;p&gt;彼のデビューからの軌跡や全てのアルバムの解説があり、大変楽しめました。&lt;&#x2F;p&gt;
&lt;p&gt;折角なので、先日&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4hosVvY&quot;&gt;MXR Distortion+&lt;&#x2F;a&gt;のデモのために作成した「&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;07&#x2F;mxr-distortion-plus&#x2F;&quot;&gt;A FAIR WIND&lt;&#x2F;a&gt;」を最後まで弾いて見ました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;0f_YUr1TUz0&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">久しぶりに書店に入ると、アルバム『TAKANAKA』のジャケットが表紙になっている
レコード・コレクターズという雑誌が目に付きました。内容をみると高中正義さんの特集です。
懐かしくて、先日途中までデモで弾いた「A Fair Wind」を完成させました。
</summary>
        </entry><entry xml:lang="en">
        <title>原点回帰 - 歪みはMXR Distortion+</title>
        <published>2026-07-17T14:45:52+09:00</published>
        <updated>2026-07-17T14:45:52+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/mxr-distortion-plus/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/mxr-distortion-plus/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;mxr-distortion-plus&amp;#x2F;cover.webp?h=35e8256380d8b9d8a2bd&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;guitar-effectors&#x2F;&quot;&gt;前回の記事&lt;&#x2F;a&gt;で、高機能なエフェクターを次々と手放してシンプルな構成に行き着いた話を書きました。
その後、&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;07&#x2F;soul-driven&#x2F;&quot;&gt;Xotic Soul Driven&lt;&#x2F;a&gt;を買い足したのですが、どうもしっくりきません。
ちょっと悩んでもっと単純な原点まで遡ることして、今更まさかのMXR Distortion+ (M104) を購入しました。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00s2rs5.9srinf7e.g00s2rs5.9sriofc7&#x2F;kaereba_main_20260721173617837?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fjeugia%2F0710137014220-77%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fjeugia%2Fi%2F10048656%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;jeugia&#x2F;cabinet&#x2F;km&#x2F;mxrm104.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00s2rs5.9srinf7e.g00s2rs5.9sriofc7&#x2F;kaereba_main_20260721173617837?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fjeugia%2F0710137014220-77%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fjeugia%2Fi%2F10048656%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;MXR M104 Distortion+ギターエフェクター ディストーション&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_20260721173617837?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FDistortion%2520%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=Distortion%20&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;MXR_Distortion+の回路的な特徴&quot;&gt;MXR Distortion+の回路的な特徴&lt;&#x2F;h2&gt;
&lt;p&gt;MXR Distortion+は「オペアンプ1個+クリッピングダイオード2本」という、歪みペダルとしては極めてシンプルな回路を持っています。1MΩの「Distortion」ポットがオペアンプの帰還ループを可変制御し、最大で約46dBという大きなゲインを作ります。オペアンプ出力後段には、ダイオード2本を逆並列に接続したハードクリッピング回路があり、波形の頭を潰して歪みを作る構成です。&quot;Distortion&quot;というネーミングの割に歪まないためオーバードライブだという人がいますが、ハードクリッピングなので回路的に見れば「ディストーション」です。&lt;&#x2F;p&gt;
&lt;p&gt;クリッピングダイオードは、1970年代のスクリプトロゴ機から現行のM104まで一貫してゲルマニウムダイオード(1N270または1N60系)です。順方向電圧が0.3〜0.45Vと低く、ソフトな飽和特性を持つため、角の丸いマイルドな歪みになります。Dunlop公式のM104マニュアルには&quot;Organic, germanium-powered clipping&quot;と明記されており、現行品もゲルマニウムダイオードであることは一次資料で確認できます&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mxr-dunlop-1&quot;&gt;&lt;a href=&quot;#fn-mxr-dunlop&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;「現行品はシリコンダイオード」という誤情報に注意&lt;&#x2F;strong&gt;
        &lt;p&gt;購入前に調べていて気になったのは、「現行品はシリコンダイオード(1N4148等)に変更されている」という記述が一定数出回っている点です。しかしメーカー公式マニュアルの記載と食い違うため、DIYクローンや改造記事の情報が、いつの間にか「現行品の標準仕様」であるかのように広まったものと考えられます。この手の製品仕様は、可能な限りメーカー公式の一次資料に当たるのが安全だと感じました。&lt;&#x2F;p&gt;
&lt;p&gt;これを信じて「スクリプト版でなければ本物でない」や「ヴィンテージでなければDistortion+の音は出ない」などと言われることがあります。
音は違うと思いますが、そもそもヴィンテージは個体差が激しいエフェクターなので、個人的には現行品で十分だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;電源はオリジナルが9V電池駆動のみだったのに対し、現行M104はDCジャック(センターマイナス9V)にも対応し、赤色LEDインジケーターとトゥルーバイパスを備えており使い勝手もよくなっています。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;本機にはトーン回路がありません。イコライザーの類は一切なく、音色調整はギター側のボリューム&#x2F;トーンとアンプ側のEQに委ねる設計です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現代のディストーションとの違い&quot;&gt;現代のディストーションとの違い&lt;&#x2F;h2&gt;
&lt;p&gt;MXR Distortion+の設計は、現代の一般的なディストーションと比べると際立ってシンプルです。主な違いを表にまとめます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;観点&lt;&#x2F;th&gt;&lt;th&gt;MXR Distortion+&lt;&#x2F;th&gt;&lt;th&gt;現代の一般的なディストーション&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;回路段数&lt;&#x2F;td&gt;&lt;td&gt;オペアンプ1段+ダイオードクリッピングのみ&lt;&#x2F;td&gt;&lt;td&gt;複数段のゲイン&#x2F;クリッピング段を重ねることが多い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;トーン&#x2F;EQ&lt;&#x2F;td&gt;&lt;td&gt;なし(素通し)&lt;&#x2F;td&gt;&lt;td&gt;Tone、あるいはBass&#x2F;Mid&#x2F;Trebleなど独立したEQ回路を持つものが多い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ゲインの効き方&lt;&#x2F;td&gt;&lt;td&gt;ポットの可変幅は大きいが単段クリッピングのため早期に頭打ちになり、聴感上の飽和感は控えめ&lt;&#x2F;td&gt;&lt;td&gt;複数段のクリッピング&#x2F;ブースト段を重ね、より深く複雑な飽和感やサスティーンを作り込める&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;クリッピング方式&lt;&#x2F;td&gt;&lt;td&gt;ハードクリッピング(ゲルマニウムダイオード)&lt;&#x2F;td&gt;&lt;td&gt;ハードクリッピング(シリコンダイオードやLEDクリッピング、多段クリッピングなど多様)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;出力段&lt;&#x2F;td&gt;&lt;td&gt;クリッピング後にパッシブなOutputポットのみで、メイクアップゲインを持たない(古典的な歪みエフェクターでは一般的)&lt;&#x2F;td&gt;&lt;td&gt;クリッピング後に能動的なゲイン段を追加し、音量低下を補うものが多い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;実際の使われ方&lt;&#x2F;td&gt;&lt;td&gt;アンプ側の歪みに足して「ブースト+荒さ」を加える運用が定番&lt;&#x2F;td&gt;&lt;td&gt;単体でクリーンアンプから完成された歪みサウンドを作る設計が主流&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;同じハードクリッピング方式のBoss DS-1とは仕組みこそ近いものの、使用ダイオードがDS-1はシリコン、Distortion+はゲルマニウムと異なり、DS-1のほうが角の立った硬い歪みになります。加えてDS-1はTone回路で中域を削ったスクープ系のモダンな音も作れますが、Distortion+はノブがない分、常に同じ帯域感で鳴り続けます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MXR_Distortion+の一般的な使い方&quot;&gt;MXR Distortion+の一般的な使い方&lt;&#x2F;h2&gt;
&lt;p&gt;現代のディストーションほど歪まない為、単体ではなく&lt;strong&gt;少し歪ませたアンプ&lt;&#x2F;strong&gt;に歪みを足すために使うのが一般的です。&lt;&#x2F;p&gt;
&lt;p&gt;Distortion+は、かなり音量が下がります。
従って、&lt;strong&gt;Outputつまみはとにかく最大&lt;&#x2F;strong&gt;に設定します。&lt;&#x2F;p&gt;
&lt;p&gt;その上でクランチが欲しいときはDistortionを低めに、リードで前に出したいときは3時以上に上げます。
これで70年代的なハードロックの音が得られます。&lt;&#x2F;p&gt;
&lt;p&gt;本機にトーン回路がないため、Distortion+自体の設定は以上で完結します。
音色はギターのボリューム&#x2F;トーンノブ、アンプのEQ、後段のペダルで追い込む前提になります。ギターボリュームを絞ると歪みが素直にクリーンアップする特性があるため、ギター側の操作との相性がよいのも特徴です。
可能であれば、RC Boosterのようなクリーンブース
ターを後に置くとよいかも知れません。音量を補正しアンプをプッシュできイコライジング補正も可能になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;高中正義と『Saudade』のセッティング&quot;&gt;高中正義と『Saudade』のセッティング&lt;&#x2F;h2&gt;
&lt;p&gt;高中正義さんは、少なくとも1980年代前半まではMXR Distortion+のユーザーだったとされています。ライブではブギー(Mesa&#x2F;Boogie)系アンプ自体を歪ませて使うこともあったようですが、アルバム『Saudade』については本人がインタビューで次のように証言しています&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-saudade-score-1&quot;&gt;&lt;a href=&quot;#fn-saudade-score&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;僕の場合ジム・ケリー(Jim Kelly)のナチュラル・オーバー
ドライブは活用しない。ヴォリューム「3〜4」ぐらいでオーバードライブは全てDistortion+。あと、コンプレッサーもかか
ってるけど。つまりDistortion+Compressorのオーヴァードライブサウンド。MXRのDyna Compはストラトでマイルドなト
ーンが欲しい時くらいで、メインはOrange Squeezerの方。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;クリーンアンプに対してDistortion+単体でオーバードライブを作るというのは、前章で触れた「アンプ側を軽くドライブさせた状態で使う」という一般的な定番とは異なるアプローチです。ただ、前段にOrange Squeezerを置いているので、そこでゲインを稼いでいるのかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;手元にはOrange Squeezerのクローンである&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;guitar-effectors&#x2F;&quot;&gt;Henretta Engineering Orange Whip Compressor&lt;&#x2F;a&gt;があったので、同じ順番(Orange Whip Compressor→Distortion+-&amp;gt; クリーンにセッティングしたSimplifier MK-II)で試してみました。&lt;&#x2F;p&gt;
&lt;p&gt;結果は本当に『Saudade』の頃のあの音に近いと感じました。カバー演奏「A Fair Wind」は以下でお聞きください。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;EpUqd7L04ic&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;演奏はYAMAHA SG-175で前半はリアピックアップ、後半はフロントピックアップです。&lt;&#x2F;p&gt;
&lt;p&gt;ゲルマニウムダイオードの柔らかい飽和特性と、
Orange Squeezer系のナチュラルなサステイン&#x2F;コンプレッションとブーストの組み合わせによって、
あの時代の高中サウンドに近いオーバードライブが得られることを、身をもって確認できました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;MXR Distortion+は、オペアンプ1個とダイオード2本しか持たないミニマルな回路にもかかわらず、半世紀近く現役であり続けているペダルです。トーン回路がない不便さは確かにありますが、その分だけ反応が直接的で、アンプ自体を歪ませているような開放感があります。&lt;&#x2F;p&gt;
&lt;p&gt;私がギターを始めた頃は、多くの憧れのギタリストがMXR Distortion+を使っていましたが、当時は
BOSSのペダルの4〜5倍の価格と高嶺の花でとても手が出ませんでした。今ではBOSSの技シリーズよりもリーズナブルとなり気軽に購入できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;「古くさいペダル」だとスルーしていましたが、今なら当時のあの音を自分の手で再現できることに、価値を感じています。結局、人はティーンのころ聞いたあの音が最高なのだから。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;高中正義『SAUDADE』バンド・スコア. シンコーミュージック, 1982年10月20日発行, ISBN4-401-15179-8&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jimdunlop.com&#x2F;content&#x2F;manuals&#x2F;M104.pdf&quot;&gt;MXR M104 Distortion+ 公式マニュアル(Dunlop, PDF)&lt;&#x2F;a&gt;. &quot;Organic, germanium-powered clipping&quot;と明記。現行M104がゲルマニウムダイオードであることの一次資料&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.electrosmash.com&#x2F;mxr-distortion-plus-analysis&quot;&gt;ElectroSmash&lt;&#x2F;a&gt;. &quot;MXR Distortion + Circuit Analysis&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wamplerdiy.com&#x2F;blogs&#x2F;news&#x2F;mxr-distortion-pedal-circuit-analysis&quot;&gt;Wampler DIY&lt;&#x2F;a&gt;. &quot;MXR Distortion + pedal circuit analysis&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smallaxemusic.com&#x2F;blogs&#x2F;news&#x2F;vintage-mxr-debate-script-versus-block-logo&quot;&gt;SmallAxeMusic.com&lt;&#x2F;a&gt;. &quot;Vintage MXR Debate: Script versus Block logos&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.craveguitars.co.uk&#x2F;home&#x2F;features&#x2F;effects&#x2F;feature-1975-mxr-distortion&#x2F;&quot;&gt;Crave Guitars&lt;&#x2F;a&gt;. &quot;Feature – 1975 MXR Distortion +&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tonehome.de&#x2F;mxr-innovations&#x2F;distortion&#x2F;&quot;&gt;ToneHome&lt;&#x2F;a&gt;. &quot;MXR Innovations Distortion+&quot;。ヴィンテージ個体の解析でゲルマニウムダイオード使用を確認&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-mxr-dunlop&quot;&gt;
&lt;p&gt;MXRは1972年、Keith BarrとTerry Sherwoodが設立した独立ブランドでしたが、1987年、Jim Dunlopに買収されています。 &lt;a href=&quot;#fr-mxr-dunlop-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-saudade-score&quot;&gt;
&lt;p&gt;高中正義『SAUDADE』バンド・スコア. シンコーミュージック, 1982年10月20日発行, ISBN4-401-15179-8。付録のインタビュー記事より引用。 &lt;a href=&quot;#fr-saudade-score-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">エフェクターボードをどこまで削れるか試してきた延長で、今度は歪みそのものを原点まで遡ってみることにしました。オペアンプ1個とダイオード2本しか持たないMXR Distortion+を購入し、回路を確かめながら高中正義が『Saudade』で使ったというセッティングを実際に試しています。
</summary>
        </entry><entry xml:lang="en">
        <title>AWS障害でPayPayが利用不可に フランクフルトの一AZが世界に波及</title>
        <published>2026-07-16T00:00:00+00:00</published>
        <updated>2026-07-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/aws-cloudfront-outage-paypay/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/aws-cloudfront-outage-paypay/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;aws-cloudfront-outage-paypay&amp;#x2F;cover.webp?h=74290d2761d8a8cd538e&quot;
  alt=&quot;Cover&quot; width=&quot;1376&quot; height=&quot;768&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2026年7月16日17時40分頃、Amazon Web Services(AWS)のCDNサービス「Amazon CloudFront」で大規模な障害が発生しました。日本の決済サービス「PayPay」をはじめ、ニコニコ生放送、はてなブログ、noteなど多数のサービスに影響が出ています。PayPayではアプリの読み込みや決済処理ができなくなり、公式サイトや障害情報ページ自体にもアクセスできない状態に陥りました。障害発生後、PayPay側は決済手段として「オフライン支払いモード」への切り替えを利用者に案内しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;障害詳細&quot;&gt;障害詳細&lt;&#x2F;h2&gt;
&lt;p&gt;発生時刻は日本時間で2026年7月16日17時40分頃(AWS公式の調査開始は現地時間1:44 AM PDT)です。症状としては、CloudFront経由のアクセスで504 Gateway Timeoutなどの5xxエラーが多発しました。日本国内ではPayPay、ニコニコ生放送、はてなブログ、noteなどが影響を受けたほか、日本、スペイン、ドイツ、オーストラリア、スウェーデン、フランス、米国、英国など世界9か国39都市以上で障害が報告されています。&lt;&#x2F;p&gt;
&lt;p&gt;日本国内で影響を受けた主なサービスは次のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;サービス&lt;&#x2F;th&gt;&lt;th&gt;影響内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;PayPay&lt;&#x2F;td&gt;&lt;td&gt;アプリの読み込み・決済処理不可、公式サイト・障害情報ページも接続不可&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ニコニコ生放送&lt;&#x2F;td&gt;&lt;td&gt;接続しにくい状態&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;はてなブログ&lt;&#x2F;td&gt;&lt;td&gt;接続しにくい状態&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;note&lt;&#x2F;td&gt;&lt;td&gt;接続しにくい状態&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;AWSのステータスサイトによると、障害の直接的な引き金はCloudFrontの「VPC Origins」機能でした。VPC Originsは、CloudFrontから顧客のプライベートVPC内にあるバックエンドリソースへ安全に接続するための機能で、これを利用している顧客側でエラーが多発しました。一方、標準的なS3オリジンなど、VPC Originsを使わない構成は影響を受けていません。AWSは応急的な回避策として、VPC Originsを使わない構成に切り替えることでエラーを回避できるとアナウンスしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;一地域の障害が世界規模に広がった理由&quot;&gt;一地域の障害が世界規模に広がった理由&lt;&#x2F;h2&gt;
&lt;p&gt;今回の障害で興味深いのは、技術的な発生源が非常に局所的だった点です。障害の起点は、EU-CENTRAL-1(フランクフルト)リージョンの単一アベイラビリティゾーン「euc1-az2」に限定されていました。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、物理的な不具合はドイツの1つのデータセンター群(AZ)内で起きたものにすぎません。しかし、CloudFrontはグローバルに分散した単一のCDNネットワークとしてVPC Origins接続を提供する仕組みになっているため、フランクフルトの一部で生じた問題が、世界中のエッジロケーション経由で各国のサービスへ波及する結果となりました。&lt;&#x2F;p&gt;
&lt;p&gt;これは、CDNのようにグローバルに一体運用されるインフラでは、1つのリージョンやAZの障害が地理的に無関係な地域にまで影響しうることを示す典型例といえます。東京リージョン自体には障害の原因はなく、あくまでフランクフルト発、世界巻き込み型の障害でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;障害を事前に防げたか&quot;&gt;障害を事前に防げたか&lt;&#x2F;h2&gt;
&lt;p&gt;クラウドを利用したシステム設計では、どのような機能であっても一時的に利用できなくなる可能性を前提に、二重化やフェイルオーバーの仕組みを組み込むのが一般的な考え方です。&lt;&#x2F;p&gt;
&lt;p&gt;今回の件で言えば、CDNをCloudFrontという単一のサービスに依存し、単一障害点になっていたことが技術的な問題点だったと考えられます。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、CloudFrontは多くの技術者にとって自システムの外側に当たり前に存在するインフラという感覚に近く、これ自体が障害点になり得るという認識を持てていなかったのではないかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;仮にその認識を持てていたとしても、実際に設計へ組み込むにはマルチCDN構成、例えばCloudflareなど別系統のCDNとの併用が必要になります。これはコストとのバランスから、多くの企業にとって現実的な選択肢とは言いにくいのが実情です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回のPayPay障害は、PayPay自体のシステム不具合ではなく、利用しているAWS CloudFrontの障害が波及したものです。直接の原因はCloudFrontの「VPC Origins」機能における不具合で、発生源はフランクフルト(EU-CENTRAL-1)の単一AZでしたが、CloudFrontのグローバル構成により世界規模で影響が拡大しました。東京リージョン固有の問題ではなく、VPC Originsを使わないオリジン構成(S3など)は影響を受けていません。&lt;&#x2F;p&gt;
&lt;p&gt;大規模なグローバルCDNに依存するサービスが増える中、一地域の局所的な障害が世界中の決済・コンテンツサービスに連鎖する構造的リスクを改めて浮き彫りにした事例といえます。&lt;&#x2F;p&gt;
&lt;p&gt;このブログも以前は&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;01&#x2F;blog-to-zola-aws-cleanup&#x2F;&quot;&gt;Amazon Amplify + CloudFrontで運用していました&lt;&#x2F;a&gt;が、現在はCloudflareに移行しているため今回の障害の影響は受けませんでした。ただし、CloudFrontとCloudflareはどちらも巨大なグローバルAnycast網であり、同種の相関障害リスク構造を持っています。実際、Cloudflare自体も過去に世界規模の障害を起こしています。今回無傷だったのはたまたまで、CDNの選定自体がこの種のリスクを下げるわけではありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;ITmedia NEWS.「AWSで障害 「CloudFront」世界規模で不調 PayPayに影響、noteやニコニコ生放送もつながりにくく」&lt;&#x2F;li&gt;
&lt;li&gt;ケータイ Watch.「PayPayの障害はAWSが原因、決済は「オフライン支払いモード」を」&lt;&#x2F;li&gt;
&lt;li&gt;BigGo ファイナンス.「PayPayで大規模障害、AWSのCDN不調が波及 公式サイトもダウン」&lt;&#x2F;li&gt;
&lt;li&gt;GIGAZINE.「AWSのCDNサービスで大規模障害発生、各種ウェブサイトに接続しにくい状態が発生」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;note.com&#x2F;zephel01&#x2F;n&#x2F;n274043a396db?hl=en&quot;&gt;note - zephel01&lt;&#x2F;a&gt;. &quot;Summary of AWS (Mainly CloudFront) Outage (July 16, 2026)&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Sunday Guardian Live.「AWS CloudFront Outage Today: Amazon Web Services Confirms Service Disruption as &#x27;5xx Errors&#x27; Hit Websites Across Multiple Regions」&lt;&#x2F;li&gt;
&lt;li&gt;The Nightly.「AWS outage update: CloudFront experience global outage, operation issue」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">2026年7月16日、AWSのCDN「CloudFront」で障害が発生し、PayPayの決済やニコニコ生放送、はてなブログなど多数のサービスに影響が出ました。発生源はフランクフルトの単一AZという局所的な障害でしたが、なぜ日本を含む世界9か国に波及したのか、その仕組みを整理します。</summary>
        </entry><entry xml:lang="en">
        <title>「コロナの時代」から6年、あの予測を検証する</title>
        <published>2026-07-16T00:00:00+00:00</published>
        <updated>2026-07-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/era-of-covid-19-revisited/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/era-of-covid-19-revisited/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;era-of-covid-19-revisited&amp;#x2F;cover.webp?h=fb83b5f685d219a1cb84&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;健康診断で病院に行ったら、まだマスク着用必須でした。
「あれ、コロナから何年経っただろうか」とふと思いました。
以前の記事を振り返ってみました。&lt;&#x2F;p&gt;
&lt;p&gt;書いたのは2020年5月、緊急事態宣言下の連休中でした。
「&lt;a href=&quot;&#x2F;blog&#x2F;2020&#x2F;05&#x2F;era-of-covid-19&#x2F;&quot;&gt;コロナの時代&lt;&#x2F;a&gt;」という記事です。&lt;&#x2F;p&gt;
&lt;p&gt;当時は素人なりに感染症数理モデル（SIRモデル）を俄仕込みで勉強し、
基本再生産数から集団免疫閾値を計算して、
このパンデミックがいつ収束するのかを考えていました。
結論は「そう簡単には収束しない、長期戦になる」というものでした。&lt;&#x2F;p&gt;
&lt;p&gt;当時の予測のどこが当たり、どこが外れたのかを、
実際のデータで検証してみます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「長期戦」の予想は的中した&quot;&gt;「長期戦」の予想は的中した&lt;&#x2F;h2&gt;
&lt;p&gt;まず、一番大きな予想である「長期戦になる」は、結果的に的中しました。&lt;&#x2F;p&gt;
&lt;p&gt;WHOは2020年1月30日にCOVID-19を「国際的に懸念される公衆衛生上の緊急事態
（PHEIC）」と宣言し、これを解除したのは2023年5月5日です。
実に3年4ヶ月にわたって緊急事態が続いたことになります。&lt;&#x2F;p&gt;
&lt;p&gt;日本国内でも、新型コロナウイルス感染症の感染症法上の位置づけが
「新型インフルエンザ等感染症（2類相当）」から、季節性インフルエンザと
同じ「5類」に引き下げられたのは2023年5月8日でした。
記事を書いた2020年5月から、ちょうど3年後です。&lt;&#x2F;p&gt;
&lt;p&gt;記事の中では、実効再生産数1.5のケースで集団免疫閾値（33%）に
達するのは「来年の2月」、つまり2021年2月という試算も示していましたが、
それすら「最終週に30%の人が罹患している状況ですから、考えづらい」
として非現実的だと退けていました。つまり記事の時点で暗に想定していた
のは、2021年2月よりもさらに先、2〜3年単位の「長期戦」だったことに
なります。WHOの緊急事態宣言解除や日本の5類移行までかかった3年強と
いう期間は、この予想とほぼ一致していたと言えそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;被害規模はここまで拡大していた&quot;&gt;被害規模はここまで拡大していた&lt;&#x2F;h2&gt;
&lt;p&gt;記事を書いた2020年5月6日時点で、私は「Googleのまとめている統計によれば、
3,663,911人が感染し、亡くなった方は257,301人です」と書いていました。
世界全体でもまだ400万人にも満たない感染者数の時点です。&lt;&#x2F;p&gt;
&lt;p&gt;WHOの発表によれば、2023年4月16日時点での世界の累計感染者数は
763,665,202人でした。累計死亡者数は6,912,080人です。
2020年5月の時点と比べて、感染者数は200倍以上、死亡者数も27倍近くに
なっています。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、この死亡者数は各国の検査体制や報告制度に依存する「確認された
死者数」であることに注意が必要です。WHOは2020年1月から2021年12月の
2年間の公式発表死者数を542万人としつつ、同じ期間の超過死亡（本来で
あれば発生しなかったはずの死者数）を1,490万人（1,330万人から1,660万人
の幅）と推計しています。3倍近い数字で、統計に表れていた以上に多くの
人が亡くなっていたことになります。&lt;&#x2F;p&gt;
&lt;p&gt;日本国内では、5類移行直前の2023年5月8日0時時点で、
累計死亡者は74,669人でした。記事を書いた当時、私は部下が1人感染した
ことを「数字からは意識できなかったこのウィルスの広まりをみせつけられた」
と書いていましたが、その後日本だけで7万人以上が命を落とすことになるとは、
当時は想像できていませんでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「自然感染による集団免疫」という前提が外れた&quot;&gt;「自然感染による集団免疫」という前提が外れた&lt;&#x2F;h2&gt;
&lt;p&gt;当時の記事の核心は、感染拡大が収まる条件は「実効再生産数を1.0以下に
抑える」か「集団免疫閾値に達するまで隔離人口（感染して免疫を持った人、
または亡くなった人）を増やす」かの2つしかない、という考え方でした。&lt;&#x2F;p&gt;
&lt;p&gt;ワクチンについても触れてはいましたが、
「感染することなく免疫力を持たせて人工的に隔離人口を上げている」
仕組みとして紹介しつつ、「ワクチンにしても年単位で時間がかかる」と
書いており、実質的には「当面はワクチンに頼れない」という前提で
計算していました。&lt;&#x2F;p&gt;
&lt;p&gt;この前提は、記事を書いてからわずか7ヶ月ほどで崩れます。&lt;&#x2F;p&gt;
&lt;p&gt;SARS-CoV-2の遺伝子配列が公開されたのは2020年1月11日、
Modernaが候補ワクチンmRNA-1273の設計を終えたのはその数日後でした。
そして2020年12月2日、イギリスの規制当局がファイザー・ビオンテック社
のmRNAワクチンを世界で初めて承認、
アメリカでも12月11日に緊急使用許可（EUA）が下りています。
それまでワクチン開発の最速記録は、1967年に承認されたおたふくかぜ
ワクチンの4年強でした。それを大幅に更新する、異例中の異例の承認速度
でした。&lt;&#x2F;p&gt;
&lt;p&gt;「ワクチンは年単位でかかる」という当時の前提は、
このmRNAワクチンという新しい技術によって覆されました。
「自然感染による集団免疫待ち」という私の記事の暗黙の前提は、
記事を書いてから1年も経たないうちに過去のものになっていたのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;集団免疫の獲得にワクチンは寄与したのか&quot;&gt;集団免疫の獲得にワクチンは寄与したのか&lt;&#x2F;h2&gt;
&lt;p&gt;実際の抗体保有率とワクチン接種率の推移を重ねてみました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;era-of-covid-19-revisited&amp;#x2F;immunity-comparison.webp?h=757d4c7be94ede3a068f&quot;
  alt=&quot;実際の抗体保有率とワクチン接種率の推移(2020-2023)&quot; width=&quot;1800&quot; height=&quot;1100&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;em&gt;厚生労働省の抗体保有率調査（感染による免疫）と、
デジタル庁のワクチン2回接種率の実際の推移&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;厚生労働省の抗体保有率調査では、感染由来の抗体保有率は2020年12月
時点で0.68%、オミクロン株急拡大後の2022年2月から3月調査でも
28.6%、2023年5月時点でも42.8%にとどまりました。一方、ワクチンの
2回接種率は2021年10月4日に60.9%へ到達しています。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、この数字を「集団免疫にどれだけ近づいたか」の物差しとして
使うことはできません。理由は、その後登場した変異株のたびに
獲得していた免疫が減衰し、再感染も起きたためです。加えて、
株ごとに実効再生産数も異なりました。たとえばオミクロン株の
基本再生産数は平均9.5
（範囲5.5〜24）と推定されており、2020年記事が前提にした2.5とは
全く別の数字です。集団免疫閾値の計算に使う基本再生産数自体が
変異のたびに変わり、獲得した免疫も時間とともに失われ、同じ人が
何度も感染する状況では、単純なモデルで集団免疫獲得の確率を
測ること自体ができなくなりました。&lt;&#x2F;p&gt;
&lt;p&gt;そのため、ワクチンが2020年記事の想定したワーストケース
（実効再生産数2.5時の閾値60%）を2021年10月に超えたことは
事実ですが、これが集団免疫の獲得にどれだけ寄与したかは、
その後の変異株の登場によって評価できません。60%という数字
自体、オミクロン株を前提にすればもはや意味を失っているからです。&lt;&#x2F;p&gt;
&lt;p&gt;実際にパンデミックが収束したのは、こうした集団免疫の計算の
結果としてではありませんでした。2023年5月、WHOは緊急事態宣言
を解除し、日本も感染症法上の位置づけを5類に引き下げました。
これは集団免疫閾値を超えたことを確認した結果ではなく、
社会的・政策的な判断によるものでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ワクチンは重症化防止に寄与したか&quot;&gt;ワクチンは重症化防止に寄与したか&lt;&#x2F;h2&gt;
&lt;p&gt;集団免疫への寄与は評価できませんでしたが、これとは別に、
ワクチンを接種した個人が重症化しにくくなったかどうかは、
独立した設問として評価できます。&lt;&#x2F;p&gt;
&lt;p&gt;まず、2020年12月に発表されたファイザー社・モデルナ社の
第3相試験（ランダム化比較試験）の結果です。ファイザー社の
試験では、重症化した30例すべてがプラセボ群で発生し、
ワクチン接種群では0例でした。モデルナ社の試験でも同様に、
重症例（最終解析時点で30例）はすべてプラセボ群で発生して
います。ランダム化比較試験は被験者を無作為にワクチン群・
プラセボ群へ振り分けるため、「健康意識の高い人ほどワクチンを
打つ」といった観察研究特有のバイアスを受けません。&lt;&#x2F;p&gt;
&lt;p&gt;その後、2022年以降のオミクロン株流行下での実世界データ
（観察研究）でも、同じ傾向が繰り返し確認されています。
28件の研究、対象者計1,100万人分をまとめた系統的レビュー
（Mohammed et al., 2023）によれば、オミクロン株への感染
そのものを防ぐ効果は接種後3ヶ月で28.1%、6ヶ月で3.9%まで
急速に低下した一方、重症化を防ぐ効果は63.6%（3ヶ月）から
49%（6ヶ月）、追加接種後は86%まで回復するなど、感染予防
効果より高く、より長く持続していました。&lt;&#x2F;p&gt;
&lt;p&gt;観察研究には「ワクチンを打つ人ほど元々健康」といった
バイアスが入り込む余地は残ります。ただし、そのバイアスを
受けない初期のランダム化比較試験と、その後の大規模な
観察研究の結果は同じ方向を指しています。「ワクチンは感染
そのものを防ぐ効果は弱く早く失われるが、重症化を防ぐ効果は
強く長く持続する」という結論は、根拠として揺らぎにくいと
判断します。&lt;&#x2F;p&gt;
&lt;p&gt;なお、これはあくまで私個人の話です。2回目の接種後には
インフルエンザよりも重いと感じるほどの副反応があり、
3回目までは接種したものの、その後は接種していません。
私自身は一度もコロナと診断されたことはありません
（もしかするとそうだったのかもしれない、という経験は
あります）が、実際に罹患した家族など身近な人の症状を
見ると、自分の副反応の重さと近いようにも感じます。
統計上は重症化を防ぐ効果があるとしても、個人としては
人為的に罹患しているに近く、割に合わないというのが
正直な実感です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;こうした簡易なモデルは、パンデミックの規模感や緊急性を
素早くつかむには役立ちます。実際、記事を書いた当時の
「長期戦になる」という大枠の見通しは機能しました。一方で、
ウイルスの変異や免疫の減衰といった、モデルの前提条件
そのものが変わっていく現象までは、単純な数式では追い
きれません。長期の見通しを1つのモデルに固定するのは
危険で、前提が崩れていないか定期的に見直す必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;ワクチン接種の判断も同様です。集団としての効果がどれだけ
強くても、それは個人の意思決定を自動的に決めるものでは
ありません。年齢や基礎疾患、副反応の出方など個人差がある
以上、集団のデータを参考にしつつ、最終的には自分自身の
リスクとベネフィットで判断するしかない、ということだと
思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;WHO. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.who.int&#x2F;news&#x2F;item&#x2F;05-05-2022-14.9-million-excess-deaths-were-associated-with-the-covid-19-pandemic-in-2020-and-2021&quot;&gt;14.9 million excess deaths associated with the COVID-19 pandemic in 2020 and 2021&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;厚生労働省. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mhlw.go.jp&#x2F;stf&#x2F;seisakunitsuite&#x2F;bunya&#x2F;0000121431_00132.html&quot;&gt;新型コロナウイルス感染症に関する抗体保有状況調査について&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;Liu, Y. and Rocklöv, J. (2022). &quot;The effective reproductive number of the Omicron variant of SARS-CoV-2 is several times relative to Delta&quot;. Journal of Travel Medicine.&lt;&#x2F;li&gt;
&lt;li&gt;Polack, F.P. et al. (2020). &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pmc.ncbi.nlm.nih.gov&#x2F;articles&#x2F;PMC7745181&#x2F;&quot;&gt;Safety and Efficacy of the BNT162b2 mRNA Covid-19 Vaccine&lt;&#x2F;a&gt;&quot;. New England Journal of Medicine.&lt;&#x2F;li&gt;
&lt;li&gt;Baden, L.R. et al. (2021). &quot;Efficacy and Safety of the mRNA-1273 SARS-CoV-2 Vaccine&quot;. New England Journal of Medicine.&lt;&#x2F;li&gt;
&lt;li&gt;Mohammed, H. et al. (2023). &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pmc.ncbi.nlm.nih.gov&#x2F;articles&#x2F;PMC9965204&#x2F;&quot;&gt;A Systematic Review and Meta-Analysis on the Real-World Effectiveness of COVID-19 Vaccines against Infection, Symptomatic and Severe COVID-19 Disease Caused by the Omicron Variant&lt;&#x2F;a&gt;&quot;. Vaccines.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">2020年5月に「コロナの時代」という記事を書きました。当時予想した「長期戦」は的中しましたが、集団免疫の前提はワクチンの異例の承認によって覆りました。あれから何が当たり何が外れたのかを、実際のデータで検証します。</summary>
        </entry><entry xml:lang="en">
        <title>FenderがYAMAHAにもレプリカ販売停止通告をしていた</title>
        <published>2026-07-16T00:14:27+09:00</published>
        <updated>2026-07-16T00:14:27+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/fender-yamaha-cease-and-desist/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/fender-yamaha-cease-and-desist/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;fender-yamaha-cease-and-desist&amp;#x2F;cover.webp?h=cd9d8cf442b992d32ea7&quot;
  alt=&quot;Cover&quot; width=&quot;1376&quot; height=&quot;768&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;3月に&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;03&#x2F;fender-strat-eu-copyright&#x2F;&quot;&gt;ドイツの裁判所がStratocasterのボディ形状に著作権保護を認めた判決&lt;&#x2F;a&gt;を取り上げましたが、この判決を武器にしたフェンダーの法的キャンペーンが、ついに世界最大の楽器メーカーであるヤマハにまで及んでいることがロイターの取材で明らかになりました。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;今回の通知で判明していること&quot;&gt;今回の通知で判明していること&lt;&#x2F;h2&gt;
&lt;p&gt;ロイターの報道によれば、フェンダーは今年5月、ヤマハに対して警告状（cease-and-desist letter）を送付しました。ヤマハはこの通知を受け取ったことを認めていますが、対象となった具体的なモデルは明らかにしておらず、通知内容を精査した上で対応を検討しているとしています。&lt;&#x2F;p&gt;
&lt;p&gt;フェンダーによる一連のキャンペーンは、3月にドイツのデュッセルドルフ地方裁判所がストラトのボディ形状をEU域内で著作権保護の対象と認めたことに端を発しています。この判決を受けてフェンダーは、メーカーや小売業者に対して該当モデルの製造・販売停止を求める警告状を次々と送付しており、ドイツの小売業者トマン（同社の「Harley Benton」ブランド）に対しては、逆提訴を招く事態にもなっています。&lt;&#x2F;p&gt;
&lt;p&gt;これまで報じられてきた対象は中小メーカーや小売業者が中心でしたが、ヤマハへの通知は毛色が異なります。ヤマハは対抗訴訟を戦うだけの資力を持つ大手企業であり、フェンダーが本気で「業界のデファクトスタンダード」としての地位を主張しにいっていることを示す動きといえます。&lt;&#x2F;p&gt;
&lt;p&gt;なお、フェンダーは声明で「レオ・フェンダーの先駆的な仕事をそのまま模倣するのではなく、ギターの革新を前進させるような新しく独創的なデザインの創出を、私たちは奨励します」とコメントしています。対話の姿勢自体は維持しているといえるでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ヤマハは「コピーモデル」を作ってきたブランドではない&quot;&gt;ヤマハは「コピーモデル」を作ってきたブランドではない&lt;&#x2F;h2&gt;
&lt;p&gt;今回の通知で気になるのは、ヤマハが過去にどのようなギターを作ってきたかという点です。1970年代の日本には、GibsonやFenderのデザインを忠実に模倣した、いわゆる「コピーモデル」を主力商品とするメーカーが複数存在しました。Ibanez、Greco、Tokai、Burny、Fernandesなどがその代表格で、この時代は海外でも「lawsuit era（訴訟時代）」と呼ばれています。実際にGibson（当時の親会社Norlin）から提訴されたのはIbanez（Elger社、1977年）で、ヤマハが同様の訴訟の対象になった記録は見当たりません。&lt;&#x2F;p&gt;
&lt;p&gt;ヤマハは1966年、最初のソリッドボディ・エレキギター（S-201&#x2F;S-302、まもなくSG-2&#x2F;SG-3に改称）でエレキギター事業に参入しました。当時の社長・川上源一氏の「Everything must be original（すべて独自であるべき）」という方針のもと、当初からGibsonやFenderの直接的な意匠模倣を避け、独自設計を志向していたとされています。&lt;&#x2F;p&gt;
&lt;p&gt;もっとも、1970年代前半にはレスポールに近いフォルムを持つモデル（SG-30&#x2F;SG-35など）も登場しており、Gibsonのデザインからの影響自体は受けています。ただしこれは、ヘッドストック形状まで含めて忠実に再現する「直接コピー」とは性格が異なるとされています。1976年からはカルロス・サンタナとの関係を機に、ネックスルー構造や独自の「サスティン・プレート」を投入した「SG-2000」を開発するなど、技術面での独自路線を強めていきました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-sbg-1&quot;&gt;&lt;a href=&quot;#fn-sbg&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;そして1990年、現在まで続く主力シリーズ「Pacifica」が登場します。カリフォルニアのスタジオ・セッションミュージシャンのニーズを踏まえて設計されたとされ、Stratocasterに近いボディシェイプを採用しつつも、ヤマハ独自ブランドの製品として位置づけられてきました。&lt;&#x2F;p&gt;
&lt;p&gt;こうした経緯を踏まえると、ヤマハが明確なレプリカを主力商品として販売していた時期を特定するのは難しく、むしろ早い段階から独自設計路線を貫いてきたメーカーと見るのが妥当です。Ibanezがコピーモデル文化からAZシリーズのような独自路線へと転換した歴史を持つのとは対照的に、ヤマハには「コピーモデルの時代」自体がほぼ存在しないことになります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ビジネスへの影響、焦点はPacificaか&quot;&gt;ビジネスへの影響、焦点はPacificaか&lt;&#x2F;h2&gt;
&lt;p&gt;ヤマハは対象モデルを公表していませんが、現行のエレキギター・ラインナップの中でStratocasterに最も近い形状を持つのは、間違いなくPacificaシリーズです。REVSTARやHollowといった他シリーズは独自のデザインコンセプトを掲げており、ストラト系のシルエットを持つのはPacificaに限られます。&lt;&#x2F;p&gt;
&lt;p&gt;Pacificaは1990年の発売以来、特にエントリークラスの「Pacifica 112」などが英国市場をはじめとする海外市場で「200ポンド以下の価格帯での売上トップ」を長年維持してきたとされています。多くのギタリストにとって定番の入門機として、世界中で広く認知されています。もしこのシリーズが今回の通知対象に含まれているとすれば、ヤマハのギター事業への影響は小さくありません。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、Pacificaがヤマハのエレキギター事業全体の売上に占める具体的な比率や、モデル別の販売台数は公式には開示されておらず、断定はできません。あくまで「ストラト系デザインで最も売れているであろうシリーズ」という業界内の評価に基づく推測である点には注意が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;視野を広げると、フェンダーの今回のキャンペーンは、各社が数十年にわたり100ドル未満から5,000ドル超まで幅広い価格帯で販売してきた「ストラト系ギター」という市場そのものを再編しうる動きです。マークス・アンド・クラーク法律事務所の特許弁護士フィリップ・クピット氏は「彼らの最終的な狙いは、欧州市場全体でストラトキャスターの唯一の供給元になることだと思う」と述べており、フェンダーが独自設計を志向してきたヤマハのようなメーカーに対しても、どこまで権利を主張するのかが今後の焦点になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;現時点でわかっているのは、フェンダーが5月にヤマハへ警告状を送ったという事実だけで、対象モデルも今後の展開も不透明なままです。ただ、ヤマハが「コピーモデル」ではなく独自設計を貫いてきた歴史を持つメーカーであることを踏まえると、今回の通知は「デザインの模倣」ではなく「一般的になりすぎたシルエットの独占」を巡る争いに近いと感じます。多くのギタリストが「ギターの絵文字そのもの」と評するほど一般化した形状に、どこまで独占的な権利が認められるのか。世界最大の楽器メーカーが相手となる今回の一件は、&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;03&#x2F;fender-strat-eu-copyright&#x2F;&quot;&gt;3月の判決&lt;&#x2F;a&gt;よりもはるかに大きな試金石になりそうです。&lt;&#x2F;p&gt;
&lt;p&gt;余談ですが、私自身1970年代からギターを趣味にしてきた身として、今回の一件には少し複雑な思いもあります。フェンダーは1965年にCBSへ売却され、1985年に投資家グループによるMBOで買い戻され、その後もWeston Presidio、Servco、TPG Growthと持ち株比率を変遷し、現在はハワイのコングロマリットであるServco Pacificが過半数株主です。レオ・フェンダー自身は1965年の売却時点で経営を離れ、1991年に亡くなっています。「創業者の遺産を守る」という大義名分の一方で、権利を行使しているのは音楽事業とは縁の薄い投資家企業だという構図には、正直なところ釈然としないものを感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Bangkok Post（Reuters）.「Fender escalates Stratocaster copyright fight, taking aim at Yamaha」（2026年7月15日）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hub.yamaha.com&#x2F;guitars&#x2F;g-electric&#x2F;a-brief-history-of-pacifica-guitars&#x2F;&quot;&gt;Yamaha Music Hub&lt;&#x2F;a&gt;.「A Brief History of Pacifica Guitars」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Yamaha_Pacifica&quot;&gt;Wikipedia&lt;&#x2F;a&gt;.「Yamaha Pacifica」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Yamaha_electric_guitar_models&quot;&gt;Wikipedia&lt;&#x2F;a&gt;.「Yamaha electric guitar models」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-sbg&quot;&gt;
&lt;p&gt;1980年には米国向けモデルが「SG」から「SBG」へと改称されています。これはGibson SGとの混同を避けるための型番（商標）を巡る紛争であり、ボディ形状そのものの模倣を巡る争いではありません。 &lt;a href=&quot;#fr-sbg-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">EU著作権判決を追い風に法的キャンペーンを拡大するフェンダーが、
世界最大の楽器メーカーであるヤマハにも警告状を送付していたことが明らかになりました。
対象モデルは非公表ですが、最有力候補と目されるPacificaシリーズへの影響を中心に、
ヤマハのギター開発の歴史を踏まえて整理します。
</summary>
        </entry><entry xml:lang="en">
        <title>CLIエージェント時代のMCP設計論：Fastmailのウィジェット実装から考える「フォールバック」の重要性</title>
        <published>2026-07-15T14:04:12+09:00</published>
        <updated>2026-07-15T14:04:12+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/fastmail-mcp/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/fastmail-mcp/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;fastmail-mcp&amp;#x2F;cover.webp?h=c4d41dc3873f422de207&quot;
  alt=&quot;Cover&quot; width=&quot;1376&quot; height=&quot;768&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;2026年4月22日、National Email Dayに合わせて、私がメインの個人メールとして利用しているFastmailが公式MCP&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;サーバーを発表しました（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastmail.com&#x2F;blog&#x2F;an-mcp-server-for-fastmail&#x2F;&quot;&gt;An MCP server for Fastmail — National Email Day | Fastmail Blog&lt;&#x2F;a&gt;）。
エンドポイントは &lt;code&gt;https:&#x2F;&#x2F;api.fastmail.com&#x2F;mcp&lt;&#x2F;code&gt;です。
Claude・ChatGPTなど任意のAIクライアントから、自然言語で「明日の予定は？」「Sarahへの返信を下書きして」「歯医者の住所を教えて」といった操作を、実際のメール・連絡先・カレンダーに対して実行できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;この記事は2ヶ月ほど、Fastmail MCPを利用した評価をまとめたものです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fastmail_MCPで何ができるか？&quot;&gt;Fastmail MCPで何ができるか？&lt;&#x2F;h2&gt;
&lt;p&gt;接続はOAuthで認可し、アクセス権限は次の3段階から選択するようになっています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;read-only&lt;&#x2F;strong&gt;: メール・連絡先・カレンダーの閲覧のみ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;write&lt;&#x2F;strong&gt;: 下書き保存、連絡先・予定の編集&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;send&lt;&#x2F;strong&gt;: メール送信&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Fastmailが強調したのは、受信箱にチャットボットを組み込んだり、メールをモデルに流してもいないことです。
生成AIへのインターフェイスとして、MCPの入り口だけ用意しユーザー自身がアクセスできるAIツールを選ぶという姿勢です。
MCPというオープン標準に乗ることで、特定ベンダーへのロックインを避けているわけです。&lt;&#x2F;p&gt;
&lt;p&gt;Fastmail MCPサーバーは、メール・カレンダー・連絡先・ノートの4領域にわたるツール群を提供しており、
アクセス権限（read-only &#x2F; write &#x2F; send）に応じて呼び出せる範囲が変わります。&lt;&#x2F;p&gt;
&lt;p&gt;以下が、MCPで呼び出し可能なツール一覧です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;ツール一覧（メール・カレンダー・連絡先・ノート）&lt;&#x2F;strong&gt;&lt;&#x2F;summary&gt;
&lt;p&gt;&lt;strong&gt;メール&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;search_email&lt;&#x2F;code&gt; — 条件を指定してメールを検索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;read_email&lt;&#x2F;code&gt; — 個別メールの本文・ヘッダーを取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;read_thread&lt;&#x2F;code&gt; — スレッド単位でメールをまとめて取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;draft_email&lt;&#x2F;code&gt; — 送信せず下書きとして保存（新規作成・返信・転送に対応、返信は&lt;code&gt;mode: reply&lt;&#x2F;code&gt;＋&lt;code&gt;emailId&lt;&#x2F;code&gt;でスレッドヘッダーや引用を自動処理、&lt;code&gt;replyAll&lt;&#x2F;code&gt;で全員返信も可能。本文はMarkdown入力に対応しており、送信時にHTML＋プレーンテキストへ自動変換される）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;send_email&lt;&#x2F;code&gt; — メールを即座に送信（send権限が必要）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update_email&lt;&#x2F;code&gt; — 既読&#x2F;未読・フラグなどメールの状態を更新&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;archive_email&lt;&#x2F;code&gt; — メールをアーカイブ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_email&lt;&#x2F;code&gt; — メールを削除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;upload_attachment&lt;&#x2F;code&gt; — 添付ファイルをアップロード&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;list_folders&lt;&#x2F;code&gt; — フォルダ一覧を取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;list_identities&lt;&#x2F;code&gt; — 送信元として使える送信アイデンティティ（差出人アドレス）一覧を取得&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;カレンダー&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list_calendars&lt;&#x2F;code&gt; — カレンダー一覧を取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;search_events&lt;&#x2F;code&gt; — 予定を検索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;create_event&lt;&#x2F;code&gt; — 予定を直接作成（確認なしでコミット）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;compose_event&lt;&#x2F;code&gt; — 予定の作成・編集をウィジェットとしてステージングし、ユーザーの確認後にコミット（&lt;code&gt;id&lt;&#x2F;code&gt;を渡せば既存イベントの編集、省略すれば新規作成）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update_event&lt;&#x2F;code&gt; — 既存の予定を直接更新（確認を挟まない）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_event&lt;&#x2F;code&gt; — 予定を削除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rsvp_event&lt;&#x2F;code&gt; — 招待された予定に出欠回答&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;連絡先&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;search_contacts&lt;&#x2F;code&gt; — 連絡先を検索（メール作成前のアドレス特定などに利用）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;create_contact&lt;&#x2F;code&gt; — 連絡先を新規作成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update_contact&lt;&#x2F;code&gt; — 連絡先を更新&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_contact&lt;&#x2F;code&gt; — 連絡先を削除&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;ノート&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;search_notes&lt;&#x2F;code&gt; — ノートを検索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;read_note&lt;&#x2F;code&gt; — ノートを取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;create_note&lt;&#x2F;code&gt; — ノートを新規作成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update_note&lt;&#x2F;code&gt; — ノートを更新&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_note&lt;&#x2F;code&gt; — ノートを削除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;add_to_note&lt;&#x2F;code&gt; — 既存ノートに追記&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;set_memo&lt;&#x2F;code&gt; — メモ欄の内容を設定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;こうしたツールを組み合わせると、たとえば次のような使い方ができます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;朝、Claudeに「今日の予定と未読メールをまとめて」と頼むと、fastmailからカレンダーと直近の未読メールを読んで、1日の見通しをサマリーしてくれる&lt;&#x2F;li&gt;
&lt;li&gt;ChatGPTに「山田さんからの問い合わせに返信案を作って」と頼むと、連絡先からアドレスを確認したうえで返信の下書きを作成し、送信前に内容を確認できる&lt;&#x2F;li&gt;
&lt;li&gt;Claudeに「来週火曜の14時に田中さんとのミーティングを入れて」と頼むと、田中さんを出席者とした予定を登録できる&lt;&#x2F;li&gt;
&lt;li&gt;Claudeに「鈴木さんとの一連のメールのやりとりを確認して、鈴木さんの質問とその回答を1つのノートにまとめて」と頼むと、メールのやりとりを読み込んだうえで、要点を新しいノートとして作成する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ここまでがFastmail MCPで実現できることの紹介です。ここから先は、この2ヶ月の運用で見えてきた設計上の課題を掘り下げます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fastmail_MCPのConfirmationの仕組み&quot;&gt;Fastmail MCPのConfirmationの仕組み&lt;&#x2F;h2&gt;
&lt;p&gt;Fastmail MCPには、AIエージェントが提案した操作をそのまま確定させず、いったんユーザーの確認を挟んでから反映する仕組みが用意されています。エージェントが意図と異なる内容で操作したり、そのまま実行してしまったりするリスクを抑えるためです。対象となる操作の内容を「ウィジェット」としてチャットUI上にステージングし、ユーザーがボタン操作で確認・修正してから初めて確定します。&lt;&#x2F;p&gt;
&lt;p&gt;たとえばカレンダーの予定作成・編集には、2つの経路が用意されています。&lt;code&gt;create_event&lt;&#x2F;code&gt;と&lt;code&gt;update_event&lt;&#x2F;code&gt;は呼び出すと即座に予定表へ反映され、参加者を招待する場合はその場で招待メールが送信されます。一方&lt;code&gt;compose_event&lt;&#x2F;code&gt;は、予定の内容をいったんこのウィジェットにステージングし、ユーザーが確認・修正してから初めてカレンダーに反映されます。&lt;&#x2F;p&gt;
&lt;p&gt;Fastmail MCPのツール群の中で、実際にこの確認の仕組みを使うのは次の4つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compose_event&lt;&#x2F;code&gt; — 予定の作成・編集&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_event&lt;&#x2F;code&gt; — 予定の削除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_contact&lt;&#x2F;code&gt; — 連絡先の削除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;delete_note&lt;&#x2F;code&gt; — ノートの削除&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらのツールは、呼び出した時点では何もコミットされません。ステージングされた内容がウィジェットとして表示され、ユーザーがボタン操作で確認・修正してから初めて確定します。ツール自身の説明にも「成功はウィジェットが表示されたことを意味するのであって、削除が確定したことを意味しない」という趣旨の注記があり、実行結果を判定するにはウィジェットの応答を読み取るか、削除後に検索し直して存在を確認する必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;一方、次のツールは確認を挟まず直接コミットします。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create_event&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;update_event&lt;&#x2F;code&gt; — 予定の直接作成・更新（参加者への招待・変更通知メールもその場で送信される）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rsvp_event&lt;&#x2F;code&gt; — 招待への出欠回答&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;create_contact&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;update_contact&lt;&#x2F;code&gt; — 連絡先の直接作成・更新&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update_note&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;add_to_note&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;set_memo&lt;&#x2F;code&gt; — ノート・メモの内容変更&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Fastmail MCPサーバー自身のツール説明にも「対話的なカレンダー操作では&lt;code&gt;compose_event&lt;&#x2F;code&gt;を優先し、ユーザーが確認できない場合にのみ&lt;code&gt;update_event&lt;&#x2F;code&gt;のような直接コミット系を使うべき」という指示が書かれています。つまりFastmail自身が、確認フローの有無をクライアント側の対話能力に委ねていることを認識しているわけです。&lt;&#x2F;p&gt;
&lt;p&gt;なお、メールに関するツールにはウィジェットによる確認が1つも用意されていません。メール送信（&lt;code&gt;send_email&lt;&#x2F;code&gt;）は&lt;code&gt;send&lt;&#x2F;code&gt;権限自体が&lt;code&gt;read-only&lt;&#x2F;code&gt;／&lt;code&gt;write&lt;&#x2F;code&gt;とは別に明示的な許可を必要とする仕組みになっているため、confirmation UIは用意されていないのでしょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;claude.aiはWeb版のClaudeを指します。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;この仕組みには、見過ごせない課題があります。
このウィジェットによる確認は、claude.aiでは上手く動作しますが、Claude Codeでは機能しません。
同じFastmail MCPサーバー、同じツール定義に接続していても、
確認フローが機能するかどうかがクライアント次第で変わってしまう、という非対称性が発生してしまっています。&lt;&#x2F;p&gt;
&lt;p&gt;なぜこのような差が生まれるのか、標準化の状況を整理します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;確認メカニズムの標準化とCLIの対応状況&quot;&gt;確認メカニズムの標準化とCLIの対応状況&lt;&#x2F;h2&gt;
&lt;p&gt;AIエージェントは、メール・カレンダー・連絡先といった、取り消しにくい実世界のデータを操作します。そのため、操作を確定する前にユーザーへ確認や追加入力を求める手段を、プロトコルレベルでどう用意するかは、MCP自体にとっても大きな課題でした。この課題に対して、MCPには現在2つの標準機構が用意されています。大まかに言うと、elicitationは会話の中でフォームに答えてもらう方式、MCP Appsは画面上にアプリの小さな操作画面を表示する方式です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2025年6月にMCP仕様へ追加され、同年11月にURLモードが拡張された「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;modelcontextprotocol.io&#x2F;specification&#x2F;draft&#x2F;client&#x2F;elicitation&quot;&gt;elicitation&lt;&#x2F;a&gt;（誘発）」。
サーバーがユーザーに入力や確認を求める際、JSON Schemaで定義したフォーム（文字列・数値・真偽値・選択肢など）を送り、
クライアントが対話ダイアログを表示してユーザーの回答を返す、という仕組みが定義された。
iframeやHTMLレンダリングを必要とせず、accept（承認）・decline（拒否）・cancel（取り消し）の3種類の応答が標準化されている。&lt;&#x2F;li&gt;
&lt;li&gt;2025年11月にAnthropicとOpenAIが共同で提案した「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.modelcontextprotocol.io&#x2F;posts&#x2F;2025-11-21-mcp-apps&#x2F;&quot;&gt;MCP Apps&lt;&#x2F;a&gt;」という拡張仕様（SEP-1865）。サンドボックス化されたiframe内でHTMLを描画し、複雑なユーザー入力や確認操作をチャットUI上で完結させるための仕組みで、Fastmailの&lt;code&gt;compose_event&lt;&#x2F;code&gt;が使っているウィジェットもこれに基づいている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この2つの標準は、CLI環境への対応状況が対照的です。Claude Code CLIはelicitationに対応しており、フォームモードのダイアログはターミナル上に自動的に表示され、設定なしにユーザーの回答をサーバーへ返せます。一方MCP Appsは、サンドボックス化されたiframeでHTMLを描画する設計が前提になっており、そもそもブラウザのようなレンダリング環境を必要とします。ターミナル上で動くClaude Codeには、この種のレンダリング面が存在しません。これはAnthropicがClaude Codeへの対応を怠っているのではなく、CLI&#x2F;エージェント実行環境全般が構造的に抱える制約です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;非対称性の正体：Fastmailの実装選択&quot;&gt;非対称性の正体：Fastmailの実装選択&lt;&#x2F;h2&gt;
&lt;p&gt;MCP Appsは任意拡張であり、公式ブログは義務ではなく推奨として次のような指針を明記しています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Servers should provide text-only fallback for all UI-enabled tools and return meaningful content even when UI is unavailable, so they can serve both UI-capable and text-only hosts.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;UIに対応していないクライアントのためにも、意味のあるテキストベースのフォールバックを用意すべきだ、という趣旨です。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、Fastmailの場合、&lt;code&gt;compose_event&lt;&#x2F;code&gt;のような確認操作を、
MCP Appsのウィジェットではなくelicitationの仕組みにfallbackするように実装していれば、
claude.aiとClaude Codeのどちらでも確認自体は機能したはずです&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。前節で見た非対称性の実体は、MCPやClaude Codeの限界ではなく、Fastmailがどちらの確認機構を選んだかという実装判断にあります。&lt;&#x2F;p&gt;
&lt;p&gt;ところがFastmail MCPが実際に提供しているフォールバックは、「ホストの&lt;code&gt;read-widget-context&lt;&#x2F;code&gt;ツールで結果を読み取るか、&lt;code&gt;search_events&lt;&#x2F;code&gt;で存在を確認する」という、確認手段の代替にとどまります。
ユーザーの確認そのものを完了させる、elicitationのようなテキストベースの経路は用意されていません。結果としてMCP Appsに対応していないクライアントでは、ステージングされた操作が確定されないまま残るか、エージェントが&lt;code&gt;update_event&lt;&#x2F;code&gt;のような直接コミット系ツールに頼らざるを得なくなります。&lt;&#x2F;p&gt;
&lt;p&gt;この記事で見てきた非対称性は、MCPというプロトコルが未成熟だから起きているのでも、Claude Codeが対話UIに対応していないから起きているのでもありません。MCPにはすでにelicitationとMCP Appsという2つの標準機構があり、Claude Codeはelicitationに正しく対応しています。Fastmailが、両方のクライアントで機能するelicitationをフォールバックとして使わず、片方のクライアントにしか効かないMCP Appsのウィジェットだけに頼ったことが、非対称性の直接の原因です。&lt;&#x2F;p&gt;
&lt;p&gt;Fastmail、および同様の設計を選ぶ他のMCPサーバーに対して考えられる改善の方向性は、次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compose_event&lt;&#x2F;code&gt;や&lt;code&gt;delete_event&lt;&#x2F;code&gt;のような操作に、MCP Appsのウィジェットに加えてelicitationベースのテキスト確認フローをフォールバックとして実装する&lt;&#x2F;li&gt;
&lt;li&gt;クライアントがMCP Apps・elicitationのどちらに対応しているかを見て、対応する機構へ自動的に切り替える&lt;&#x2F;li&gt;
&lt;li&gt;ツール説明文で「確認できない場合は直接コミット系を使え」とエージェントに指示するのではなく、プロトコルが提供する確認機構を正しく使い分けることで、直接コミットへのフォールバック自体を避ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Fastmail MCPはリリースされたばかりの機能であり、こうした設計上の判断の是非が表面化するのはむしろ健全なことです。MCPエコシステムには必要な標準がすでに揃っており、あとはツール提供側がそれを正しく使い分けるかどうかにかかっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ここまで見てきた非対称性は、誰にとっても等しく問題になるわけではありません。claude.aiやChatGPTのようなMCP Apps対応クライアントから使う分には、ウィジェットが正しくレンダリングされ、確認・修正・確定が意図通りに機能するため、実用上の支障はないはずです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;MulmoClaudeは中島聡氏が開発するClaude Codeを利用したローカルAIアシスタント育成プラットフォーム&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;私自身の利用実態で言えば、日常的なやりとりのほとんどをClaude Codeで行っています。特に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;receptron&#x2F;mulmoclaude&quot;&gt;MulmoClaude&lt;&#x2F;a&gt;をClaude Code CLIをバックエンドにしたアシスタントとして使う場面が多く、これもMCP Appsが前提とするブラウザ内蔵のレンダリング環境を持たない実行環境です。Claude Code自体はelicitationに対応していますが、MulmoClaudeがそれを自分のWeb UIへどこまで橋渡ししているかは未確認で、同じ制約を抱えている可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;実際、Claude Codeで&lt;code&gt;compose_event&lt;&#x2F;code&gt;を使って予定を追加したつもりが、ステージングされたウィジェットの確認が反映されないまま止まっており、予定自体が入っていなかったために予定を丸ごと飛ばしてしまったことがあります。&lt;&#x2F;p&gt;
&lt;p&gt;そのため、この記事で取り上げた非対称性は、私にとっては理論上の課題ではなく、日常的にツールの使い勝手を制限している具体的な制約です。ただしその原因は、MCPというプロトコルの限界ではなく、Fastmailが既存の解決策であるelicitationを今のところ使っていないという、一企業の実装判断にあります。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Model Context Protocolの略。AIモデルと外部のデータソースやツールを安全に接続するための標準的なプロトコル &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;ただしelicitationのform modeは仕様上オブジェクト配列の編集を想定しておらず、&lt;code&gt;compose_event&lt;&#x2F;code&gt;ウィジェットと全く同じ編集体験になるとは限らない。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">「今日の予定と未読メールをまとめて」とAIに頼むだけで、実際のメールボックスが動く時代になりました。
愛用しているFastmailでも2026年4月に公式MCPサーバーが公開され、生成AIからの利用が簡単にできるようなりました。
2ヶ月使い込んで見えてきたのは、便利さの一方MCPの挙動についてひとつの技術的な課題でした。
</summary>
        </entry><entry xml:lang="en">
        <title>松田聖子「パイナップル・アイランド」をカバーしてみた</title>
        <published>2026-07-14T05:47:47+09:00</published>
        <updated>2026-07-14T05:47:47+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/pineapple-island/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/pineapple-island/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;pineapple-island&amp;#x2F;cover.webp?h=77366852780e7fe12c7c&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;最近、中森明菜さんがテレビ出演で「復活」と話題になっているのを見て、彼女がライバルとされていた1980年代初頭の松田聖子さんを思い出しました。ちょうど夏らしい曲を探していたこともあり、彼女の古いアルバム『Pineapple』から「パイナップル・アイランド」をカバーしてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2359590818&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;pineapple-island&quot; title=&quot;Pineapple Island&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Pineapple Island&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;アイドルからアーチストへ&quot;&gt;アイドルからアーチストへ&lt;&#x2F;h2&gt;
&lt;p&gt;1982年5月21日発売の5thオリジナルアルバム『Pineapple』に収録され、作詞は松本隆、作曲は原田真二、編曲は大村雅朗です。&lt;&#x2F;p&gt;
&lt;p&gt;原田真二氏と言えば1977年にヒットした「キャンディ」をよく覚えていますが、彼は1977年10月から12月にかけて3か月連続シングルでデビューし、3曲が同時にオリコンベスト15入りするという日本音楽史上初の快挙をなしたアーチストです。
歌謡曲やフォーク的な私小説的シンガーソングライターではない、洋楽的なポップ感覚とコード進行の洗練さに驚いたものです。&lt;&#x2F;p&gt;
&lt;p&gt;彼のヒット曲「キャンディ」も作詞が松本隆氏です。松本氏と言えば作詞家ですが、大半の松田聖子の曲の作詞を担当し彼女のアーチスト像を設計した中心人物の一人と言われています。
実際にこの『Pineapple』では彼のネットワークではっぴいえんど時代の盟友である細野晴臣や大瀧詠一、チューリップの財津和夫、そして松任谷由実（呉田軽穂名義）など
ニューミュージック系のアーチストが松田聖子への曲提供を行なっています。原田真二氏の参加もその一貫でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;松田聖子が単なるアイドルから「アーチスト」へと完全に転換したアルバムです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「パイナップル・アイランド」について&quot;&gt;「パイナップル・アイランド」について&lt;&#x2F;h2&gt;
&lt;p&gt;前作の『風立ちぬ』に収録されていた「いちご畑でつかめて」同様、かなり実験的なトラックです。&lt;&#x2F;p&gt;
&lt;p&gt;Aメロでは &lt;code&gt;I - IIIm - IV - V7&lt;&#x2F;code&gt;という標準的な循環コードですが、ルート音が常に上昇しています。
サビでは &lt;code&gt;I&#x2F;III - IV - #IVdim - V7&lt;&#x2F;code&gt;となるルート音が &lt;code&gt;III-IV-#IV-V&lt;&#x2F;code&gt;と半音上昇するパターンが繰り返され、&lt;code&gt;V7-#V7-bVII-I&lt;&#x2F;code&gt;と解決しています。&lt;&#x2F;p&gt;
&lt;p&gt;曲と通じて、常にベース音が上昇するパターンで作られており、それが不思議な浮遊感に繋がっています。ベースやギターのリフもこの動きを強調するようなフレーズになっています。&lt;&#x2F;p&gt;
&lt;p&gt;松本隆氏の歌詞も、「海辺-&amp;gt;船上-&amp;gt;無人島-&amp;gt;海の底」とシーンが次々と展開し、曲の浮遊感と非常にマッチしています。&lt;&#x2F;p&gt;
&lt;p&gt;譜面が見当たらなかったので、コード譜を元に全て耳コピーで採譜しました。演奏はYAMAHA SG-175でオーバードライブ2トラック、クリーン2トラックを録り、バッキングは打ち込み、ボーカルはSynthesizer Vです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">中森明菜さんの「復活」をきっかけに、当時ライバルと言われた松田聖子さんの隠れた名曲「パイナップル・アイランド」を耳コピーでカバーしてみました。
</summary>
        </entry><entry xml:lang="en">
        <title>&quot;Tell It Like It Is&quot; - AORテイストのラブソング</title>
        <published>2026-07-11T19:35:37+09:00</published>
        <updated>2026-07-11T19:35:37+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/tell-it-like-it-is/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/tell-it-like-it-is/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;tell-it-like-it-is&amp;#x2F;cover.webp?h=c59476aa5b4bbbd683b8&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;1989年7月26日リリースの高中正義さんのアルバム
「GAPS!」から
&quot;Tell It Like It Is&quot;をカバーしてみました。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;この前の年のアルバムからMiami Sound MachineのEmilio Estefanが、プロデュースを担
当しており、東京とマイアミの2拠点でのレコーディングだったようです。
当時のマイアミ発ポップス／ダンスミュージックの潮流と高中サウンドを掛け合わせたリゾート感の強いアルバムでした。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2358576212&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;tell-it-like-it-is&quot; title=&quot;Tell It Like It Is (Masayoshi Takanaka Cover)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Tell It Like It Is (Masayoshi Takanaka Cover)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;この曲のようにEmilio自身がヴォーカルを取る曲はAORテイストでした。&lt;&#x2F;p&gt;
&lt;p&gt;フュージョン的な凝ったフレーズは影を潜め、
リラックスした雰囲気で「ええ音で弾いたら、ええんちゃう？」的な感じです。
ヴォーカルとギターの掛け合いが当時かっこよく聞こえたものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;使用ギター
&lt;ul&gt;
&lt;li&gt;YAMAHA SG-175, Epiphone Texan&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;アンプ
&lt;ul&gt;
&lt;li&gt;DSM &amp;amp; Humboldt SIMPLIFIER MkII&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;エフェクター
&lt;ul&gt;
&lt;li&gt;Henretta Engineering Orange Whip Compressor -&amp;gt; Boss DS-1W&lt;&#x2F;li&gt;
&lt;li&gt;Delay&#x2F;Reverbはポストプロダクションで付加&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;ヴォーカル／コーラス
&lt;ul&gt;
&lt;li&gt;Synthesizer V&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">高中正義さんのアルバム「GAPS!」に収録されたAORテイストのラブソング、
&quot;Tell It Like It Is&quot;をギターでカバーしました。
ヴォーカルとギターの掛け合いがとても印象的な曲です。
</summary>
        </entry><entry xml:lang="en">
        <title>技術文書用フォーマット AsciiDoc</title>
        <published>2026-07-10T05:00:00+09:00</published>
        <updated>2026-07-10T05:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/asciidoc/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/asciidoc/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;asciidoc&amp;#x2F;cover.webp?h=2af306a0693c3ee09dbc&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;AsciiDocで書かれたドキュメントを修正する必要があったので、
AsciiDoctorを導入しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AsciiDocとは&quot;&gt;AsciiDocとは&lt;&#x2F;h2&gt;
&lt;p&gt;AsciiDocは、2002年にStuart Rackham氏が開発したマークアップ言語です。
もともとはDocBook XMLを人間が書きやすい記法で表現するためのPython製ツールとして
誕生しました。プレーンテキストで書いた文書を、HTMLやPDF、EPUBなど複数の形式に
変換できる点が特徴です。&lt;&#x2F;p&gt;
&lt;p&gt;2013年にはRuby実装のAsciidoctorが登場し、現在ではこちらが主流の処理系となっています。
本記事でも、AsciiDocの処理系としてAsciidoctorを使用します。&lt;&#x2F;p&gt;
&lt;p&gt;2019年からはEclipse Foundation傘下の
AsciiDoc Working Groupによって言語仕様の標準化も進められており、
処理系間の互換性が高まりつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、技術文書での採用率では明確にMarkdownが優位です。
技術文書作成者の主要フォーマットとしてMarkdownを使う割合が约65%とされ、デファクトスタンダードの地位にあります。学習コストの低さとツールの豊富さ、生成AIで扱う文書形式の標準となっていることが理由です。
実際にはAsciiDocは全体の採用率では大きく水を開けられています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MacへのAsciiDocの導入&quot;&gt;MacへのAsciiDocの導入&lt;&#x2F;h2&gt;
&lt;p&gt;AsciiDocの処理系としてAsciiDoctorを使用します。&lt;&#x2F;p&gt;
&lt;p&gt;ランタイムにRubyを使用するので、Rubyのインストールから行っています。
前提として、私の環境では
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mise.jdx.dev&quot;&gt;mise&lt;&#x2F;a&gt;で言語のバージョンを管理しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;install.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Rubyのインストール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mise&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; use -g ruby@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gem&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install asciidoctor asciidoctor-pdf asciidoctor-rouge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gem&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install asciidoctor-pdf-cjk asciidoctor-diagram&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;AsciiDocのサンプル&quot;&gt;AsciiDocのサンプル&lt;&#x2F;h2&gt;
&lt;p&gt;似たようなマークアップ言語にMarkdownがありますが、
以下のような点でAsciiDocが優れているので作る文書の特性で
使い分けています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;目次や表紙の生成が可能&lt;&#x2F;li&gt;
&lt;li&gt;細かいテーブルの表現が可能&lt;&#x2F;li&gt;
&lt;li&gt;ソースコードにシンタックスハイライトや吹き出しが使える&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;GitHubやGitLabでもネイティブでAsciiDocのレンダリングに対応しています。
始めからHTMLやPDFへの変換を意識して作られている点でも優れています。&lt;&#x2F;p&gt;
&lt;p&gt;次にサンプルを提示します。
Frontmatterを除くと、ソースのままでも読みやすい形式です。
特に今回はソースコードの解説だったので、以下の例ではソースコードへの解説を追記する例となっています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;asciidoc&quot; data-name=&quot;sample.adoc&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-markup z-heading z-heading-0 z-asciidoc&quot;&gt;= サンプル&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;toc&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; left&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;toc-title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 目次&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;toclevel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;imagesdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;figure-caption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 図&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;chapter-signifier&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;scripts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cjk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;pdf-theme&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; default-with-font-fallbacks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;doctype&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; book&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;sectnumlevels&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;sectnums&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;source-highlighter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rouge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;rouge-style&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; gruvbox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-markup z-heading z-heading-1 z-asciidoc&quot;&gt;== Hello World&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;.hello.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;python]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;----&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Hello World!&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;             &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;  print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;i = 1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;elif&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;  print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;i = 2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;elif&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;  print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;i = 3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;  print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;i = 4&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;----&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;&amp;lt;1&amp;gt; やっぱりサンプルといえばコレな&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;&amp;lt;2&amp;gt; IF文です！&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;AsciiDocを変換する&quot;&gt;AsciiDocを変換する&lt;&#x2F;h2&gt;
&lt;p&gt;作成したAsciiDocのソースは以下のコマンドでHTMLやPDFに変換します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;convert.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# HTMLの生成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;asciidoctor&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --backend html5 sample.adoc -o sample.html&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# PDFの生成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;asciidoctor-pdf&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sample.adoc -o sample.pdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;以下が生成したサンプルです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;asciidoc&amp;#x2F;sample.webp?h=aa551a1eddeb908ee3e0&quot;
  alt=&quot;AsciiDoc生成結果&quot; width=&quot;983&quot; height=&quot;572&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;AsciiDocは
Markdownと似ているので混乱する部分もありますが、
Markdownよりやりたいことをストレートに書けると思います。&lt;&#x2F;p&gt;
&lt;p&gt;サンプルのようにAsciiDocのメタデータにいろいろ記載すると生成するスタイルも
変更できるのでいろんな文章に柔軟に対応できると思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ソースコードの解説を含む技術文書を書く必要があり、AsciiDocとその処理系Asciidoctorを
導入しました。Markdownが標準となった今あえてAsciiDocを選ぶ理由と、
Mac環境での導入手順、実際の変換サンプルを紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>CloudflareのAI対策見直しとAIエージェント対応度診断</title>
        <published>2026-07-08T00:00:00+00:00</published>
        <updated>2026-07-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/cloudflare-ai-access-review/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/cloudflare-ai-access-review/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;cloudflare-ai-access-review&amp;#x2F;cover.webp?h=be4593eef9e356ff784e&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2026年2月、&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;02&#x2F;cloudflare-benefits&#x2F;&quot;&gt;Cloudflareへ移転した際の記事&lt;&#x2F;a&gt;で、AI学習クローラー対策としてContent Signals Policy、Block AI bots、AI Labyrinthという3層構成を紹介しました。あれから4か月、AIによるアクセスの重要性はさらに増しています。改めてこのブログのCloudflare設定を見直すとともに、Cloudflareが新しく公開したAgent Readinessスキャナーで「AIエージェントへの対応度」を診断してみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Managed_robots.txtまわりを再確認する&quot;&gt;Managed robots.txtまわりを再確認する&lt;&#x2F;h2&gt;
&lt;p&gt;まず、AI Crawl Controlのダッシュボードを一通り確認しました。&lt;&#x2F;p&gt;
&lt;p&gt;Block AI training botsは「Block on all pages」のままで変更していません。このブログのコンテンツはCC BY-NC-ND 4.0(非営利・改変禁止)で公開しているので、商用LLMの学習データとして使われることは元々ライセンスの意図と衝突します。学習目的のクローラーは全ページで拒否するのが一貫した方針です。&lt;&#x2F;p&gt;
&lt;p&gt;Content Signalsでは、Managed robots.txtをオンにしています。&lt;&#x2F;p&gt;
&lt;p&gt;AI Crawl ControlのCrawlers一覧では、クローラーごとの許可&#x2F;ブロックを個別に確認しました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;カテゴリ&lt;&#x2F;th&gt;&lt;th&gt;例&lt;&#x2F;th&gt;&lt;th&gt;設定&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;AI Crawler(学習用)&lt;&#x2F;td&gt;&lt;td&gt;GPTBot、ClaudeBot、Bytespider、Amazonbot、TikTok Spider、Meta-ExternalAgent&lt;&#x2F;td&gt;&lt;td&gt;Block&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AI Search &#x2F; AI Assistant&lt;&#x2F;td&gt;&lt;td&gt;Applebot、PerplexityBot、ChatGPT-User&lt;&#x2F;td&gt;&lt;td&gt;Allow&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Search Engine Crawler&lt;&#x2F;td&gt;&lt;td&gt;Googlebot、BingBot&lt;&#x2F;td&gt;&lt;td&gt;Allow&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Crawlers一覧の分類も、学習目的のクローラーを拒否するという方針のとおりでした。あわせてAI Labyrinth(クロールルールを無視するボットに偽コンテンツを読ませるハニーポット機能、Beta)も確認しましたが、2月から変わらずONのままでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「混在クローラー」という新しい論点&quot;&gt;「混在クローラー」という新しい論点&lt;&#x2F;h2&gt;
&lt;p&gt;今回の見直しで、2月時点にはなかった変化に気づきました。レガシー機能「Block AI bots」の設定画面に、次のような予告が表示されていたのです。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;On September 15, mixed-purpose crawlers that are used both for search indexing and for training AI will be included in blocking AI training.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;ここで言う混在クローラーとは、前段のCrawlers一覧でSearch Engine CrawlerやAI Searchに分類し、学習とは無関係としてAllowにしていたGooglebot、Applebot、BingBotのことです。検索とAI学習を1回のクロールで同時に行うため両者を切り分けられず、学習ブロックを選んでいるサイトでは最も制限の強いルールを適用する、というのが実質的な立場だと考えられます。そのままでは検索エンジン経由の流入もAI検索・AIアシスタント経由の露出も失うため、「Mixed purpose crawlers will continue to be allowed」を選び、混在クローラーは引き続き許可する設定にしました。&lt;&#x2F;p&gt;
&lt;p&gt;レガシー機能は9月15日に廃止され、後継の「Configure AI bot policies」に一本化されます。こちらはボットを3種類に分類し、それぞれ個別にAllow&#x2F;Blockを選べる形になっていました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分類&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;th&gt;設定&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Search&lt;&#x2F;td&gt;&lt;td&gt;検索エンジンのインデックス用ボット&lt;&#x2F;td&gt;&lt;td&gt;Allow(Recommended)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Agent&lt;&#x2F;td&gt;&lt;td&gt;ユーザーの質問への回答生成のために参照するボット&lt;&#x2F;td&gt;&lt;td&gt;Allow(Recommended)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Training&lt;&#x2F;td&gt;&lt;td&gt;AI学習用にコンテンツをスクレイピングするボット&lt;&#x2F;td&gt;&lt;td&gt;Block(Recommended値はBlock on pages with ads)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Trainingだけ、広告のないこのブログの事情に合わせて推奨値の「Block on pages with ads」から「Block」に変更しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AIエージェント対応度を診断してみた&quot;&gt;AIエージェント対応度を診断してみた&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflareは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;isitagentready.com&#x2F;&quot;&gt;isitagentready.com&lt;&#x2F;a&gt;という無料の診断ツールを公開しています。&lt;&#x2F;p&gt;
&lt;p&gt;この診断ツールでは、サイトのAIエージェントへの対応度(Agent Readiness)を診断してくれます。&lt;&#x2F;p&gt;
&lt;p&gt;このブログのURLでスキャンしたところ、次のようなものでした。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;cloudflare-ai-access-review&amp;#x2F;agent-readiness.webp?h=634fa8b7fd82807af8a4&quot;
  alt=&quot;Agent Readiness&quot; width=&quot;1472&quot; height=&quot;1486&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;当サイトのAgent Readiness&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;個人ブログサイトでは該当しない項目&quot;&gt;個人ブログサイトでは該当しない項目&lt;&#x2F;h3&gt;
&lt;p&gt;改善項目として、10個の指摘を受けました。
ただし、10個のうち6個はいずれも「稼働しているAPIやエージェントサービスがあること」を前提にした指摘でした。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指摘&lt;&#x2F;th&gt;&lt;th&gt;規格&lt;&#x2F;th&gt;&lt;th&gt;該当しない理由&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;DNS for AI Discovery (DNS-AID)&lt;&#x2F;td&gt;&lt;td&gt;IETFドラフト、Linux Foundation 2026年発表&lt;&#x2F;td&gt;&lt;td&gt;他のAIエージェントから発見・接続されるエージェントサービス(チャットボット、MCPサーバー等)を運用していない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;API Catalog&lt;&#x2F;td&gt;&lt;td&gt;RFC 9727&lt;&#x2F;td&gt;&lt;td&gt;カタログ化すべきAPIが存在しない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;OAuth&#x2F;OIDC discovery metadata&lt;&#x2F;td&gt;&lt;td&gt;RFC 8414 等&lt;&#x2F;td&gt;&lt;td&gt;認証保護されたAPIや会員機能がない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;OAuth Protected Resource Metadata&lt;&#x2F;td&gt;&lt;td&gt;RFC 9728&lt;&#x2F;td&gt;&lt;td&gt;同上&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;auth.md&lt;&#x2F;td&gt;&lt;td&gt;WorkOS提唱&lt;&#x2F;td&gt;&lt;td&gt;OAuth Protected Resource Metadataを前提とする、同上の理由&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MCP Server Card&lt;&#x2F;td&gt;&lt;td&gt;SEP-1649(標準化進行中)&lt;&#x2F;td&gt;&lt;td&gt;MCPサーバーを運用していない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;このブログは静的コンテンツを配信するだけのサイトで、APIやエージェント向けサービスは一切運用していません。この種の指摘は、SaaSやEC、API提供事業者向けのチェックリストとしては妥当ですが、個人ブログにはそもそも対象が存在しませんでした。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;対応した項目&quot;&gt;対応した項目&lt;&#x2F;h3&gt;
&lt;p&gt;「ホームページにLink response header(RFC 8288)がない」という指摘もありました。ツールの提案は&lt;code&gt;rel=&quot;api-catalog&quot;&lt;&#x2F;code&gt;や&lt;code&gt;rel=&quot;service-doc&quot;&lt;&#x2F;code&gt;でAPIカタログやAPI仕様書を指すというものでしたが、このブログにAPIはないので、この提案どおりに実装しても意味がありません。&lt;&#x2F;p&gt;
&lt;p&gt;代わりに、Linkヘッダーの仕組み自体はこのブログでも使い道があると考え、次の2つを指すヘッダーを追加しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot; data-name=&quot;static&#x2F;_headers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Link: &amp;lt;&#x2F;license&#x2F;&amp;gt;; rel=&amp;quot;license&amp;quot;, &amp;lt;&#x2F;atom.xml&amp;gt;; rel=&amp;quot;alternate&amp;quot;; type=&amp;quot;application&#x2F;atom+xml&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;rel=&quot;license&quot;&lt;&#x2F;code&gt;はIANA登録済みの正式なrelationで、CC BY-NC-ND 4.0を明記したライセンスページ(&lt;code&gt;&#x2F;license&#x2F;&lt;&#x2F;code&gt;)をAIエージェントが機械的に検出できるようにします。学習ボットのブロックと合わせて、コンテンツの利用条件を多層的に伝える形になりました。&lt;code&gt;rel=&quot;alternate&quot;&lt;&#x2F;code&gt;はZolaが生成するAtomフィード(&lt;code&gt;&#x2F;atom.xml&lt;&#x2F;code&gt;)へのリンクで、フィードの発見性を高めます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;対応を見送った項目&quot;&gt;対応を見送った項目&lt;&#x2F;h3&gt;
&lt;p&gt;残る3個は、対応自体は可能でも今回は見送りました。&lt;&#x2F;p&gt;
&lt;p&gt;Markdown for Agentsは、&lt;code&gt;Accept: text&#x2F;markdown&lt;&#x2F;code&gt;のリクエストにHTMLの代わりにMarkdownを返す機能です。CloudflareのAI Crawl Control上では確認できましたが、Proプラン以上限定(2026年7月時点で月$20〜25)のため、Freeプランの現状ではロックされていました。個人ブログの一機能としてはコストに見合わないと判断し、見送りました。&lt;&#x2F;p&gt;
&lt;p&gt;WebMCPは、ブラウザ内蔵のAIエージェントに&lt;code&gt;navigator.modelContext.provideContext()&lt;&#x2F;code&gt;でサイトの操作(検索など)を直接公開する仕組みです。現状はEarly Preview Program参加者限定の実験段階で、一般のブラウザではまだ有効化されていません。このブログの操作対象もpagefindによる検索程度で薄く、標準化が進んだ段階で再検討することにしました。&lt;&#x2F;p&gt;
&lt;p&gt;Agent Skills discovery indexは、&lt;code&gt;&#x2F;.well-known&#x2F;agent-skills&#x2F;index.json&lt;&#x2F;code&gt;にサイト固有の作業手順(SKILL.md)を公開する仕組みです。コンテンツサイト向けの想定用途は「文章校正」「カテゴリ分類の提案」といった編集アシスタント業務で、これは既に自分のClaude Code環境でローカルに完結しています。v0.2.0のドラフト段階でエコシステムの普及状況も未検証なため、こちらも見送りとしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Agent Readinessスキャンの10個の指摘を並べてみると、その多くはAPIやSaaS、エージェント向けサービスを運用している事業者を想定したチェックリストだと分かりました。静的な個人ブログにとって本当に意味のある「AI対応」は、実は範囲が絞られます。当サイトでの結論は次のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CC BY-NC-NDライセンスの意図に沿って、学習目的のクローラーは技術的にブロックする&lt;&#x2F;li&gt;
&lt;li&gt;robots.txtのContent Signalsとライセンスページへの&lt;code&gt;rel=&quot;license&quot;&lt;&#x2F;code&gt;で、利用条件を機械可読な形でも表明する&lt;&#x2F;li&gt;
&lt;li&gt;検索エンジンやAI回答エンジンからの参照は妨げず、露出の機会は残す&lt;&#x2F;li&gt;
&lt;li&gt;WebMCPやAgent Skillsのようなドラフト段階の規格には、実際に普及するまで様子見の姿勢を崩さない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;2月の記事で組んだ多層防御の骨格は変わっていませんが、Cloudflare側の仕様変更(混在クローラーの扱い)に合わせて設定を追随させ、Agent Readinessという新しい物差しで一度棚卸しをしたことで、このブログのAI対応の現在地を再確認できました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;content-signals-policy&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Giving users choice with Cloudflare&#x27;s new Content Signals Policy&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;bots&#x2F;additional-configurations&#x2F;managed-robots-txt&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;robots.txt setting&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;content-independence-day-ai-options&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Your site, your rules: new AI traffic options for all customers&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;agent-readiness&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Introducing the Agent Readiness score&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;plans&#x2F;pro&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Pro Plan Overview&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ietf.org&#x2F;archive&#x2F;id&#x2F;draft-mozleywilliams-dnsop-dnsaid-01.html&quot;&gt;IETF&lt;&#x2F;a&gt;. &quot;DNS for AI Discovery&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dns-aid.org&#x2F;&quot;&gt;DNS-AID&lt;&#x2F;a&gt;. &quot;AI Agent Discovery via DNS&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc9727&quot;&gt;IETF&lt;&#x2F;a&gt;. &quot;RFC 9727: The api-catalog Well-Known URI and Link Relation Type&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc8288&quot;&gt;IETF&lt;&#x2F;a&gt;. &quot;RFC 8288: Web Linking&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;workos.com&#x2F;auth-md&quot;&gt;WorkOS&lt;&#x2F;a&gt;. &quot;auth.md — Open Protocol for Agent Registration&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;modelcontextprotocol&#x2F;modelcontextprotocol&#x2F;pull&#x2F;2127&quot;&gt;Model Context Protocol&lt;&#x2F;a&gt;. &quot;MCP Server Card (SEP-1649)&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;agent-skills-discovery-rfc&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Agent Skills Discovery RFC&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;agentskills.io&#x2F;&quot;&gt;Agent Skills&lt;&#x2F;a&gt;. &quot;Agent Skills&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.chrome.com&#x2F;blog&#x2F;webmcp-epp&quot;&gt;Chrome Developers&lt;&#x2F;a&gt;. &quot;WebMCP Early Preview Program&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">2026年2月に整えたCloudflareのAIボット対策を4か月ぶりに見直しました。検索とAI学習を兼ねる「混在クローラー」を9月15日からブロック対象に含めるという仕様変更や、Agent Readinessスキャンで受けた10個の指摘を、個人ブログの視点で整理します。</summary>
        </entry><entry xml:lang="en">
        <title>小型無人機等飛行禁止法に伴うドローン飛行制限の拡大</title>
        <published>2026-07-07T20:07:38+09:00</published>
        <updated>2026-07-07T20:07:38+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/drone-flight-ban-expansion-2026/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/drone-flight-ban-expansion-2026/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;drone-flight-ban-expansion-2026&amp;#x2F;cover.webp?h=f2bd1ede3cc55f9218c0&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;「重要施設の周辺地域の上空における小型無人機等の飛行の禁止に関する法律」（以下「小型無人機等飛行禁止法」という。）の改正により、令和8年(2026年)7月14日から重要施設の周辺地域の上空などの飛行禁止エリアが拡大されます。ドローンユーザーの方が受ける影響について検討してみました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;免責事項&lt;&#x2F;strong&gt;
        &lt;p&gt;本記事の内容は執筆時点(2026年7月7日)の情報に基づく個人の見解であり、法的助言を目的としたものではありません。実際に飛行を計画される際は、国土交通省や警察庁、各空港管理者等が公表する最新の公式情報を必ずご確認ください。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;飛行禁止エリアの拡大&quot;&gt;飛行禁止エリアの拡大&lt;&#x2F;h2&gt;
&lt;p&gt;飛行禁止エリア（イエローゾーン）が300mから1,000mに拡大し、7月14日以降、飛行禁止されるエリアは対象防衛関係施設の敷地又は区域及びその周囲おおむね1000メートルの地域の上空になります。&lt;&#x2F;p&gt;
&lt;p&gt;以下は公開されている地理院地図で、成田国際空港周辺での7月14日の前後での飛行禁止エリアを比較したものです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;drone-flight-ban-expansion-2026&amp;#x2F;narita.webp?h=ba81ff5bb1b5972cff9c&quot;
  alt=&quot;成田国際空港周辺の飛行禁止エリア&quot; width=&quot;2192&quot; height=&quot;1032&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;成田国際空港周辺の飛行禁止エリア&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;半径が3.3倍なので面積ベースで考えると、これまでの11倍の領域が飛行禁止エリアとなります。&lt;&#x2F;p&gt;
&lt;p&gt;イエローゾーンの拡大だけでなく、罰則が強化されています。
これまで警察官の退去命令に違反すると罰則がありましたが、7月14日からは
&lt;strong&gt;飛行した時点で直罰化&lt;&#x2F;strong&gt;されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ドローンユーザーへの影響&quot;&gt;ドローンユーザーへの影響&lt;&#x2F;h2&gt;
&lt;p&gt;罰則規定が厳格化されたことで、
ドローンユーザーの許可や同意なしに1,000m圏内で飛行することのリスクが大幅に上がります。&lt;&#x2F;p&gt;
&lt;p&gt;対象となる施設は空港や自衛隊関連施設ですが、これらの施設周辺は小型無人機等飛行禁止法の他に航空法による制限を受けます。&lt;&#x2F;p&gt;
&lt;p&gt;以下は成田国際空港周辺の制限表面を示した地図です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;drone-flight-ban-expansion-2026&amp;#x2F;map2.webp?h=9bff52a61eb4c57600dc&quot;
  alt=&quot;成田国際空港周辺制限表面&quot; width=&quot;704&quot; height=&quot;405&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;成田国際空港周辺制限表面&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;空港を中心としてすり鉢状に設定されており、この領域では飛行高度の制限がなされています。例えば、もっとも内側で空港標点から垂直上方45mが制限高度です。&lt;&#x2F;p&gt;
&lt;p&gt;まず、この制限表面で高度を超えた飛行しようとすると、飛行のたびに個別に空港事務所等と調整したうえで個別申請により国土交通大臣の許可を取る必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;イエローゾーンでの飛行は、更に対象施設の管理者から同意を得る必要があります。
成田空港の場合であれば、成田国際空港株式会社への同意申請と、成田国際空港管理規程に基づく承認申請の両方が必要になります。同意を得た後は、実際に飛行させる48時間前までに、空港会社および都道府県公安委員会への通報が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;一般のドローンユーザーであれば、より広域に設定されている航空法での制限表面となる範囲は飛行自体を回避したほうがよいと思います。この領域は高度を超えなければ不要ですが、制限表面の制限高度は空港からの方角と距離で変化します。そのため、許可要否の判断が難しく手続きも煩雑なので、飛行回避が無難です。&lt;&#x2F;p&gt;
&lt;p&gt;そう考えると、より広域に制限される航空法の制限表面に変更はないので、今回の小型無人機等飛行禁止法改正が一般のドローンユーザーに与える影響はそれほど大きくないと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;工業専用地域の人口集中地区からの除外&quot;&gt;工業専用地域の人口集中地区からの除外&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable ja-technical-writing&#x2F;no-doubled-joshi --&gt;
&lt;!-- author-approved: 国土交通省告示第435号の定義文をそのまま引用しているため、引用文中の「が」は書き換えない --&gt;
&lt;p&gt;小型無人機等飛行禁止法の改正の他に、国土交通省告示第435号により7月1日より都市計画法第8条第1項第1号の&lt;strong&gt;工業専用地域内&lt;&#x2F;strong&gt;
が、航空法施行規則第236条の72に基づき、人又は家屋の密集している地域から除かれる「地上及び水上の人及び物件の安全が損なわれるおそれがないものとして国土交通大臣が
告示で定める区域」として指定されました。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable ja-technical-writing&#x2F;no-doubled-joshi --&gt;
&lt;p&gt;簡単に言うと、工業専用地域がDID(人口密集地区)から除外されました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chisou.go.jp&#x2F;tiiki&#x2F;kokusentoc&#x2F;pdf&#x2F;Kinnmiraigijyutu_R6.pdf&quot;&gt;内閣府国家戦略特区の資料&lt;&#x2F;a&gt;を見ると、
千葉市から「工業専用地域におけるドローンの飛行に係る人口集中地区の規制緩和」という提案が行われています。
国土交通省は地域の実情や安全確保措置を踏まえ、人口集中地区内の工業専用地域における飛行許可手続等を不要としたということでしょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside &gt;
    &lt;p&gt;DIPS2.0は、無人航空機の飛行計画通報や許可・承認申請をオンラインで行う国土交通省のシステムです。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;これらの地域の工場やプラントではドローンによる施設点検が一般的となっています。DIPS2.0で飛行計画を見ると、ほぼ毎日千葉港湾ではどこかでドローンが飛んでい
ます。これらの事業者に対する負荷軽減という意義があるのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;この規制緩和により、この地域ではDIDの特定飛行に当たらないので国土交通大臣の承認は不要となります。&lt;&#x2F;p&gt;
&lt;p&gt;注意点は、規制緩和は「工業専用地域」であって、住宅の混在が認められる「工業地域」は対象ではないことです。&lt;&#x2F;p&gt;
&lt;p&gt;また、点検業務などでは目視外飛行となることが多いと思います。この場合、①操縦者が技能証明で目視外飛行の限定解除をしていること、②使用する機体が機体認証を受けている
こと、③ 立入管理処置を講じること、④機体重量が25Kg未満であること ⑤ 飛行マニュアルの作成の5つが前提となります。業務であればほぼクリアで
きますが、問題は②です。 現時点で機体認証を受けている機種は非常に限られています。
この条件がクリアできずに、結局特定飛行となり国土交通大臣の承認が必要となる場合が多いと考えられます。&lt;&#x2F;p&gt;
&lt;p&gt;空港周辺の飛行と異なり、DID&#x2F;目視外飛行などは包括申請で1年間を一括して申請できるので、実務的には
あまり変わらないのかなという印象です。&lt;&#x2F;p&gt;
&lt;p&gt;一般ユーザーの場合は、工業専用地域でも飛行についてはその土地の管理者である事業者の許可が必要なのは言うまでもありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ドローンについては、業務で利用するシーンは拡がっていると思いますが、まだまだ法整備がなされている最中で規制と緩和が今後も変わっていくと思います。&lt;&#x2F;p&gt;
&lt;p&gt;今回の改正では、常識的な運用を行なっているドローンユーザーではあまり大きな影響はないと思いますが、違反に対する直罰化も行われたのでこれまで以上に慎重に飛行計画
を立てましょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">空港や自衛隊施設の近くでドローンを飛ばしたことがある方は要注意です。2026年7月14日から飛行禁止エリアが一気に3倍以上に広がり、違反はその場で罰則の対象になります。ドローンユーザーが今知っておくべき変更点をまとめました。
</summary>
        </entry><entry xml:lang="en">
        <title>tuki. 「零 -zero-」をカバーしてみた</title>
        <published>2026-07-06T14:20:20+09:00</published>
        <updated>2026-07-06T14:20:20+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/zero/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/zero/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;zero&amp;#x2F;cover.webp?h=c642c4d33722c86c6954&quot;
  alt=&quot;Cover&quot; width=&quot;1024&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;アニメ「スノウボールアース」の主題歌にも使われていた、tuki.の「零 -zero-」をカバーしてみました。&lt;&#x2F;p&gt;
&lt;p&gt;印象的なリフはアンプを使わないDIっぽい音だったので、Archetype - Cony Wong Xのコンソールタイプのアンプを使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;e.pcloud.link&#x2F;publink&#x2F;show?code=XZg1ccZOL7p5uANzBk2Ot8sQqWFCfeV57JV&quot;&gt;再生&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">アニメ「スノウボールアース」の主題歌として耳にした方も多いかもしれない、tuki.の「零 -zero-」。この楽曲を自分なりにカバーしてみました。
</summary>
        </entry><entry xml:lang="en">
        <title>ドラマ『夫婦別姓刑事』セクハラ問題</title>
        <published>2026-07-05T13:57:09+09:00</published>
        <updated>2026-07-08T08:45:09+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/sato-jiro/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/sato-jiro/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;sato-jiro&amp;#x2F;cover.webp?h=877e191f5e5b87b9da7b&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;ドラマ『夫婦別姓刑事』出演者によるセクハラ問題の概要&quot;&gt;ドラマ『夫婦別姓刑事』出演者によるセクハラ問題の概要&lt;&#x2F;h2&gt;
&lt;p&gt;フジテレビの火曜21時ドラマ『夫婦別姓刑事』は、佐藤二朗氏と橋本愛氏がダブル主演で夫婦役を演じる刑事ドラマとして2026年4月14日に放送を開始しました。
週刊文春は2026年7月1日、撮影中に佐藤氏が橋本氏に対して行ったとされる言動を「爆弾ハラスメント」と題して報じ、フジテレビが外部弁護士による調査の結果、佐藤氏の行為を「深刻なハラスメント」と認定していたことを明らかにしました。&lt;&#x2F;p&gt;
&lt;p&gt;発端は3月22日の第1話撮影です。演技指導中に佐藤氏の指が橋本氏の顎に触れました。
これをきっかけに、橋本氏には過去のセクハラ被害によるトラウマから、身体接触が制限されているとわかりました。
この情報は撮影前、佐藤氏本人には伝えられていませんでした。翌23日以降は、肩と腕以外への接触時に事前確認を要するというルールが設けられています。
6月1日には、橋本氏の事務所がフジテレビに体調不良を報告しました。6月23日の最終回放送時点では、夫婦役の2人が並ぶ番組告知はほとんど作られていませんでした。この状況は不自然でした。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;佐藤二朗側の主張&lt;&#x2F;summary&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: 佐藤氏本人の発言の直接引用のため原文のまま掲載 --&gt;
&lt;p&gt;佐藤氏本人は「フジテレビのスタッフと共演者と共に誠実に芝居を行った事がこのような報道になってしまって大変残念です。僕は、すべての『事実』が明らかになることだけを望んでいます」とコメントしました。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;さらに自身のXでは「もうこれ以上は我慢できません」とし、撮影中に何度も降板を申し出て事実を公にするよう訴えていたと投稿しています。&lt;&#x2F;p&gt;
&lt;p&gt;所属事務所のフロムファーストプロダクションは「事実とは異なる内容や、一方当事者からの主張のみを前提として構成されている」として報道内容を否定しました。
代表取締役名では「記事で示されているようなハラスメントに該当する事実は確認されておらず、専門家からも佐藤の言動がハラスメントにあたるものでないと、確認を得ています」との声明も出しています。
事務所の説明によれば、身体接触は演技指導中に偶発的に生じたものであり、橋本氏の身体接触制限をどう扱うかはフジテレビ側の判断に委ねられ、プロデューサーが佐藤氏本人にではなくマネージャーにのみ伝達していたとしています。&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;フジテレビの主張&lt;&#x2F;summary&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: 映画の正式タイトルをそのまま表記するため --&gt;
&lt;p&gt;報道と同じ7月1日、フジテレビは佐藤氏側に対し、9月18日公開予定の映画『踊る大捜査線 N.E.W. メトロポリスを駆け抜けろ！』のスピンオフ作品への出演を見合わせるよう通達しました。翌2日に予定されていたクランクインは、前日のうちに中止となっています。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;フジテレビは7月2日、文春側に掲載中止を強く申し入れたものの受け入れられなかったとして「掲載に至ったことは大変遺憾です」としました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: フジテレビ公式声明の直接引用のため原文のまま掲載 --&gt;
&lt;p&gt;そのうえで「本件は、プライバシーに関わる事項であり、関係者の二次被害を防止する観点から、当社から詳細を申し上げることはできませんが、当社から男性俳優の言動について、厳重注意を行うとともに、再発防止を求めたことは事実です」と説明しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;さらに「当社としては、これまで適切な環境調整や関係者への配慮・保護に努めてまいりました」としています。
また「当社は、過去に辛い経験をされた方に対して、それによる不自由や制限を当然に受け入れるべきだという意見には与しません」とも述べており、佐藤氏側の姿勢を暗に否定する内容になっています。&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;橋本愛側の主張&lt;&#x2F;summary&gt;
&lt;p&gt;橋本氏の所属事務所EDENは7月3日、公式サイトで声明を発表しました。
声明では「フジテレビ社より、弁護士による当事者・関係者ヒアリングを経て、経緯および認定された事実等の報告を受けており、フジテレビ社による報道が事実との認識です」としています。
フジテレビ側の説明を支持する立場を明確にした形です。&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;橋本愛について&quot;&gt;橋本愛について&lt;&#x2F;h2&gt;
&lt;p&gt;さて、一方の当事者の橋本愛氏ですが、週刊文春に以前連載を持っていたようです。
文春とはビジネスパートナーなんですね。&lt;&#x2F;p&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;sato-jiro&amp;#x2F;hashimoto.webp?h=59a01c9e8c89877264cd&quot;
  alt=&quot;橋本愛 私の読書日記&quot; width=&quot;914&quot; height=&quot;875&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;橋本愛氏 週刊文春連載&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;まぁ連載のタイトルを見ると「お察し」という感じです。&lt;&#x2F;p&gt;
&lt;p&gt;佐藤二朗氏側のリスク管理が甘かったと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;フジテレビの対応の問題&quot;&gt;フジテレビの対応の問題&lt;&#x2F;h2&gt;
&lt;p&gt;フジテレビの対応には最も問題があります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;一方的な断罪&quot;&gt;一方的な断罪&lt;&#x2F;h3&gt;
&lt;p&gt;2025年の中居正広氏の問題で世間から批判を浴びた反動なのか、外部弁護士の調査結果を根拠に、今回もかなり断定的かつ一方的にハラスメントを認定し処理しようとする姿勢が強すぎるように見えます。
声明では「適切な環境調整や関係者への配慮・保護に努めてまいりました」としていますが、これまでの経緯を見る限り橋本愛氏側の意見を一方的に採用し、佐藤二朗氏側の意見は無視しているように映ります。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、双方の主張が対立したまま何ら決着していない曖昧な状況にもかかわらず、報道と同日、しかもクランクイン前日というタイミングでスピンオフ作品への出演見合わせという処分を一方的に通達したとされています。
これは佐藤氏を加害者と一方的に決めつけることとなり、あまり拙速な断罪だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;いかに拙速であったかは、該当作品を担当している現場の本広克行監督本人のSNSを見ると分かります。
会社としての判断と処分であったはずが、現場の監督は降板ではなく中断であり同じメンバーで再起動したい旨をSNSでつづっています。そのような発信を現場がせざるを得なくなっているほど、現場と上層部の意見のかい離、あるいは対立が見え隠れしています。&lt;&#x2F;p&gt;
&lt;p&gt;これは正義感というより、自社が「正しい側」に立ったと示すためのポーズにしか見えず、うすっぺらいと言わざるを得ません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;弱者への配慮不足&quot;&gt;弱者への配慮不足&lt;&#x2F;h3&gt;
&lt;p&gt;佐藤氏は2024年2月、自身のXで強迫性障害を患っていることを公表しています。&lt;&#x2F;p&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;強迫性障害（OCD）は、不安な考えが繰り返し頭に浮かぶ「強迫観念」と、それを打ち消すために特定の行動を繰り返してしまう「強迫行為」を特徴とする精神疾患です。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;p&gt;双方の主張が真っ向から対立し、何ら決着していない段階で、こうした事情を抱える人物に対して「深刻なハラスメント」という断定的なレッテルを貼り、スピンオフ降板という実害を伴う処分という重い十字架を背負わせています。&lt;&#x2F;p&gt;
&lt;p&gt;「心理的安全性の保たれた制作現場づくりをはじめ、人権の尊重も含むサステナビリティ課題全般についての取り組みを推進」するというフジテレビの
「フジ・メディア・ホールディングス グループ人権方針」とは一体どんなものなのでしょうか？&lt;&#x2F;p&gt;
&lt;h3 id=&quot;プライバシーを盾にした説明責任逃れ&quot;&gt;プライバシーを盾にした説明責任逃れ&lt;&#x2F;h3&gt;
&lt;p&gt;フジテレビは「プライバシーに関わる事項」として判断に至った詳細を発表しない姿勢を見せています。
中居氏の問題の場合も同様ですが、一方を断罪しながらプライバシーを理由にその判断根拠の詳細を発表しないという問題行動を繰り返しています。&lt;&#x2F;p&gt;
&lt;p&gt;これは報道機関としては、致命的に無責任な態度であると思います。&lt;&#x2F;p&gt;
&lt;p&gt;中居氏問題の場合も同様ですが、このことが問題をかえって大きくし解決を長引かせる要因となっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;私はもともと佐藤二朗という俳優が好きではありませんが、公開されている情報だけを見る限り、今回の一件はむしろ佐藤氏の方が気の毒な印象を受けます。&lt;&#x2F;p&gt;
&lt;p&gt;そもそも『夫婦別姓刑事』というタイトルには、夫婦別姓という社会的なテーマそのものが掲げられており、いわば意識高めのドラマです。橋本愛氏も、週刊文春での連載タイトルからうかがえるように、もともと主張の強い方だと思います。
ドラマの題材も意識高めです。共演者も同様です。そうなれば、現場で摩擦が起きるリスクは高いと、事前に容易に察知できたはずです。&lt;&#x2F;p&gt;
&lt;p&gt;佐藤氏は自身については&lt;q&gt;最大級の「注意」や「警戒」が必要と痛感していた僕&lt;&#x2F;q&gt;と述べているようです。
もしそうならば、そもそもこの仕事を引き受けるべきではなかったと私は考えます。&lt;&#x2F;p&gt;
&lt;p&gt;双方の事務所の対応も、かなり拙劣だったと言わざるを得ません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;フジテレビ声明発表(2026-07-08更新)&quot;&gt;フジテレビ声明発表(2026-07-08更新)&lt;&#x2F;h2&gt;
&lt;p&gt;7月7日にフジテレビは「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fujitv.co.jp&#x2F;company&#x2F;news&#x2F;202607071500_5239272.pdf&quot;&gt;当社ドラマ制作に関するご説明&lt;&#x2F;a&gt;」という声明を発表しました。&lt;&#x2F;p&gt;
&lt;p&gt;おそらくこの件に関するフジテレビへの非難が多いことを受けての声明だと思います。
6,000文字近くにもなる大作ですが、一件丁寧な説明に見えながら自社の責任回避を主張する内容でまったく呆れるものです。&lt;&#x2F;p&gt;
&lt;p&gt;これを受けて、一方の当事者である佐藤二朗氏が行なった深夜のポストが以下のものです。&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;フジテレビは、なぜ、そこまで片方だけに寄り添うんでしょうか。残念です。ごめん本広さん。「踊る」関係者の皆様、本当にすみません。映画本編も、僕のところは全てカットしてほしい。フジの局員にも関わらず、僕に激励のメールくれたみんな、ごめん。僕は心から、もうフジとは関わりたくないです。&lt;&#x2F;p&gt;&amp;mdash; 佐藤二朗 (@actor_satojiro) &lt;a href=&quot;https:&#x2F;&#x2F;x.com&#x2F;actor_satojiro&#x2F;status&#x2F;2074489838812967212?ref_src=twsrc%5Etfw&quot;&gt;July 7, 2026&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt; &lt;script async src=&quot;https:&#x2F;&#x2F;platform.x.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;
&lt;p&gt;もっともだと思います。来期からフジテレビのドラマのキャスティングできるんでしょうか？&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;文春オンライン.「佐藤二朗（57）が橋本愛（30）に&quot;問題行為&quot;を起こしていた フジテレビ調査では「深刻なハラスメント」認定《『夫婦別姓刑事』で共演》」&lt;&#x2F;li&gt;
&lt;li&gt;週刊女性PRIME.「橋本愛と佐藤二朗、フジ『夫婦別姓刑事』での&quot;ハラスメントトラブル&quot;、事務所と局の言い分は？コメント《全文掲載》」&lt;&#x2F;li&gt;
&lt;li&gt;SmartFLASH（Yahoo!ニュース）.「佐藤二朗、橋本愛への&quot;ハラスメント&quot;騒動で想起される『夫婦別姓刑事』の&quot;分裂告知&quot;…疑われたフジテレビの&quot;責任逃れ&quot;」&lt;&#x2F;li&gt;
&lt;li&gt;オリコン.「佐藤二朗の所属事務所『文春』ハラスメント報道に反論「真実を知っていただきたく」【全文】」&lt;&#x2F;li&gt;
&lt;li&gt;スポニチアネックス（Yahoo!ニュース）.「フジテレビ ドラマ撮影巡る佐藤二朗のハラスメント報道について声明「再発防止を求めたことは事実」」&lt;&#x2F;li&gt;
&lt;li&gt;中日スポーツ・東京中日スポーツ.「フジテレビ、佐藤二朗のハラスメント報道にコメント「掲載中止を強く申し入れました」「大変遺憾」」&lt;&#x2F;li&gt;
&lt;li&gt;ENCOUNT（Yahoo!ニュース）.「フジから通達で佐藤二朗がドラマ降板 事務所は橋本愛へのハラスメント報道を強く否定…両者に深まる溝」&lt;&#x2F;li&gt;
&lt;li&gt;東スポWEB.「橋本愛の所属事務所が声明発表『フジテレビによる報道が事実』佐藤二朗側と対立鮮明」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;kmotohiro&#x2F;status&#x2F;2073269237410680880&quot;&gt;本広克行氏（映画監督）Xポスト&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;スポニチアネックス（Yahoo!ニュース）.「映画監督・本広克行氏 佐藤二朗のフジドラマ降板に言及「落ち着いたら同じメンバーで絶対再起動して」」&lt;&#x2F;li&gt;
&lt;li&gt;週刊女性PRIME.「『踊る大捜査線』本広克行監督が佐藤二朗撮影前日の&quot;降板通告&quot;を否定するも、埋まらないフジテレビとの溝」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;actor_satojiro&#x2F;status&#x2F;1754683368028151993&quot;&gt;佐藤二朗氏 Xポスト（強迫性障害の公表）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">フジテレビのドラマ『夫婦別姓刑事』で共演した佐藤二朗氏と橋本愛氏の間で起きたとされるハラスメント問題が、週刊文春の報道をきっかけに大きな波紋を呼んでいます。
双方の事務所とフジテレビの主張はどこで食い違っているのか、そして局の対応にはどんな問題があったのかを整理しました。
</summary>
        </entry><entry xml:lang="en">
        <title>Xotic Soul Driven - TS系とBD-2のハイブリッド</title>
        <published>2026-07-03T13:25:59+09:00</published>
        <updated>2026-07-03T13:25:59+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/soul-driven/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/soul-driven/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;soul-driven&amp;#x2F;cover.webp?h=3d2a1597192f014d0f57&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;オーバードライブとしてTS系のPPSE Classicをずっと愛用していますが、もう少しエッジの効いたゲイン高めの音が欲しくなり、Xotic Soul Drivenを購入しました。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00u8zu5.9srin566.g00u8zu5.9srio8a9&#x2F;kaereba_main_202607031346328136?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fikeshibu%2F512426%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fikeshibu%2Fi%2F10022261%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;ikeshibu&#x2F;cabinet&#x2F;426&#x2F;512426-01.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00u8zu5.9srin566.g00u8zu5.9srio8a9&#x2F;kaereba_main_202607031346328136?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fikeshibu%2F512426%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fikeshibu%2Fi%2F10022261%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;Xotic Soul Driven&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202607031346328136?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FSOul%2520Driven%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=SOul%20Driven&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Soul_Driven_を購入した訳&quot;&gt;Soul Driven を購入した訳&lt;&#x2F;h2&gt;
&lt;p&gt;現在エフェクターボードには、ディストーションにはBOSS DS-1W、ファズやコンソール的な飽和感が必要な場合はBroadcast AP-II、オーバードライブには
Vin-Antique PPSE Classicを使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;Vin-Antique PPSE Classicは、TS本家同様の対称クリッピングをベースに、ハイが詰まらずクラシカルな質感を持つオーバードライブです。
ただPPSE ClassicはGainを上げてもTS系らしい上品さの範囲に留まり、もう少しエッジの効いた、ゲインに余裕のある音を求める場面がありました。
少しエッジの効いた歪みとして目をつけたのがXotic Soul Drivenでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Soul_Driven_とは&quot;&gt;Soul Driven とは&lt;&#x2F;h2&gt;
&lt;p&gt;Xotic Soul Drivenは2016年に発売されたオーバードライブ&#x2F;ブーストペダルです。ジャズ&#x2F;フュージョン系ギタリストのAllen Hindsが数年にわたってXoticと共同開発したシグネチャーモデルで、当初は「AH」名義の限定モデル(青筐体、1500台)として登場し、完売後にレギュラーライン化されました(クロム筐体、中身は同一とされます)。&lt;&#x2F;p&gt;
&lt;p&gt;回路の実機トレースを公開しているAion FXの記事によれば、Soul Drivenは前段と後段で異なる2つの回路を組み合わせた構成になっています。&lt;&#x2F;p&gt;
&lt;p&gt;前段はTube Screamer系のクリッピング段です。オペアンプの帰還ループに1N914とBAT46のダイオードを直列に配置しており、TS808&#x2F;TS9よりクリップの閾値が高めに設定されています。ここにTimmyのBassコントロールやZendriveのVoiceコントロールに近い可変ハイパスフィルターが組み合わされています。&lt;&#x2F;p&gt;
&lt;p&gt;後段はBOSS BD-2 Blues Driverの回路をほぼそのまま流用した構成です。Aion FXの記事では「ほぼ逐語的に流用」と明記されており、変更点は次の4点に留まります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Bass抵抗値: BD-2の固定6.8kΩに対し、内部DIPスイッチで18k&#x2F;28k&#x2F;33k&#x2F;43kΩの4段階に可変&lt;&#x2F;li&gt;
&lt;li&gt;出力抵抗: BD-2の1kΩに対し470Ω(Aion FXいわく音への実質的な影響はほぼ無し)&lt;&#x2F;li&gt;
&lt;li&gt;Toneポット: BD-2の10kBに対し250kB&lt;&#x2F;li&gt;
&lt;li&gt;Volume段の配置: EQより前段という点はBD-2と同じ(ノイズ面で軽微な設計上の指摘あり)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Aion FXは別記事(SL Driveのトレース記事)で、Soul Drivenを「half Tube Screamer and half Blues Driver」と表現しています。前段はTS系、後段はBD-2という組み合わせは、的確な要約だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;なお、BD-2はGainが2連ポットになっており、クリッピング前とクリッピング後の2つのブースト段を同じノブで同時に持ち上げる設計です。これによってGainを上げていくと歪みと音量感が急激に立ち上がる、BD-2特有の効き方が生まれます。ただしSoul Drivenの前段は単一オペアンプの帰還ループでゲインを作る一般的なTS型のクリッピング段で、BD-2のデュアルポット構成とは異なります。Soul DrivenのGainの効き方は、BD-2の「2段連動」ではなくTS系の単段クリッピングのゲインだと考えたほうが実態に近いはずです。&lt;&#x2F;p&gt;
&lt;p&gt;コントロールはGain、Tone、Volume、Mid Boost(ブースト量ではなく持ち上げる帯域を選ぶノブ)の4つに加え、内部DIPスイッチでBassブースト量を4段階(flat&#x2F;+2.4dB&#x2F;+3.6dB&#x2F;+6dB @125Hz)に切り替えられます。&lt;&#x2F;p&gt;
&lt;p&gt;このトレースはAion FXによる実機分解の一次資料に基づくもので、DIYコミュニティでもレイアウトのエラーチェックが行われています。ただしこれは複数の独立した解析が一致したという意味ではなく、あるビルダーが作成したレイアウトを別のビルダーが実機と照合してエラーがないことを確認した、という程度の検証である点は留意しておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Soul_Drivenの音の特徴&quot;&gt;Soul Drivenの音の特徴&lt;&#x2F;h2&gt;
&lt;p&gt;PPSE Classicとの比較では、Soul Drivenのほうが低域までしっかり出て一段攻撃的な音です。
同じくXoticのBB Preampと比べるとBB Preampが温かく優しい歪みなのに対しSoul Drivenはミッドが削れてローが強く、
ややドンシャリでアグレッシブな歪みです。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、Gainを12時以降まで上げてもあまり変わらず、倍音とコンプ感がじわりと足されていく感覚です。
エッジが立っている割にナチュラルで上品な印象です。Mid Boostのつまみの調整でかなり音の印象が変わります。&lt;&#x2F;p&gt;
&lt;p&gt;こちらの方が自分の求めていた音のイメージに近いと感じました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;PPSE ClassicとSoul Drivenの前段は、ともにTS系のクリッピング回路という点で確かに近い系統です。ただSoul Drivenの後段にはBD-2由来のブースト段があり、これがゲインの余裕とローの量感、そしてミッドが削れてエッジが立つキャラクターを生んでいます。実際に弾き比べても、PPSE Classicでは出しづらかった「エッジの効いたゲイン高めの音」がしっかり出ており、狙い通りの選択だったと言えそうです。&lt;&#x2F;p&gt;
&lt;p&gt;ボードのDrive枠はPPSE ClassicかSoul Drivenかを排他選択する構成になっているので、曲や場面に応じて使い分けていくつもりです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aionfx.com&#x2F;news&#x2F;tracing-journal-xotic-soul-driven-boost-overdrive&#x2F;&quot;&gt;Aion FX&lt;&#x2F;a&gt;.「Tracing Journal: Xotic Soul Driven — Boost&#x2F;Overdrive」実機トレース記事&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aionfx.com&#x2F;news&#x2F;tracing-journal-xotic-sl-drive&#x2F;&quot;&gt;Aion FX&lt;&#x2F;a&gt;.「Tracing Journal: Xotic SL Drive」Soul Drivenの回路構成についての言及&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">TS系のPPSE Classicでは出しづらい、エッジの効いたゲイン高めの音が欲しくてXotic Soul Drivenを購入しました。回路をトレースすると前段はTS系、後段はBOSS BD-2 Blues Driverを流用した構成で、実際に弾き比べてもPPSE Classicとは違うキャラクターを持つ歪みでした。回路の構造と実際の音の特徴を整理します。
</summary>
        </entry><entry xml:lang="en">
        <title>&quot;Human Nature&quot; — The Riff Born From One Word: &quot;Funk It&quot;</title>
        <published>2026-07-01T14:48:46+09:00</published>
        <updated>2026-07-01T14:48:46+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/human-nature/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/human-nature/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;human-nature&amp;#x2F;cover.webp?h=56e1a048a772809669a9&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;先日&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;michael&#x2F;&quot;&gt;映画『Michael』を観た&lt;&#x2F;a&gt;のをきっかけに、
2009年に公開された彼の最後の公演のドキュメンタリー映画『This Is It』を見返してみました。&lt;&#x2F;p&gt;
&lt;p&gt;見返してみて印象に残ったのが、「Human Nature」のギターリフです。
単音弾きのシンプルなものですが、ヴォーカルの邪魔をせず曲を引き立てる素晴らしいリフです。&lt;&#x2F;p&gt;
&lt;p&gt;『This Is It』の中では
長年Michaelのバンドでギタリストを務めてきたJennifer Battenの後任として抜擢された
Orianthi Panagarisが弾いています。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、このリフのオリジナルはTOTOのSteve Lukatherです。&lt;&#x2F;p&gt;
&lt;p&gt;この曲はアルバム『Thriller』に収録されていますが、作曲したTOTOのキーボーディストSteve Porcaroのデモには、もともとギターパートはありませんでした。レコーディングをサポートしていたSteve Lukatherに、プロデューサーのQuincy Jonesが&quot;Funk it&quot;と一言リクエストし、即興で弾いたのがこのリフです。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2350512965&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;human-nature&quot; title=&quot;Human Nature&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Human Nature&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;あまりの出来の良さにQuincyはこの曲のアレンジクレジットにSteveの名前を入れました。セッションミュージシャンとしては異例の扱いです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">映画『Michael』をきっかけに『This Is It』を見返し、「Human Nature」のギターリフに惹かれてカバーしました。実はこのリフ、TOTOのSteve Lukatherがプロデューサーの一言で即興で生み出したものです。
</summary>
        </entry><entry xml:lang="en">
        <title>メッセージングアプリの匿名性考察</title>
        <published>2026-07-01T10:00:00+09:00</published>
        <updated>2026-07-01T10:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/07/messenger-anonymity/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/07/messenger-anonymity/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;07&amp;#x2F;messenger-anonymity&amp;#x2F;cover.webp?h=c60e5fcb30b3118d869c&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Threema GmbH（以下、Threema社）の公式ブログに「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;threema.com&#x2F;en&#x2F;blog&#x2F;anonymity-at-the-system-level-the-ultimate-privacy-protection&quot;&gt;システムレベルの匿名性についての記事&lt;&#x2F;a&gt;」という記事が投稿されました。&lt;&#x2F;p&gt;
&lt;p&gt;メッセージングアプリの匿名性について論じています。以前、市川の強盗傷害事件をきっかけに&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2024&#x2F;10&#x2F;modern-messaging-apps&#x2F;&quot;&gt;暗号化やメタデータで機能比較した記事&lt;&#x2F;a&gt;を書きましたが、匿名性という観点はなかったのでこの記事を参考に解説したいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;メッセージングアプリの匿名性について&quot;&gt;メッセージングアプリの匿名性について&lt;&#x2F;h2&gt;
&lt;p&gt;Threema社の技術記事では、匿名性を二種類に分けています。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;水平的匿名性&lt;&#x2F;dt&gt;
&lt;dd&gt;会話の相手に対する匿名性です。ユーザー名だけで連絡先を交換できれば、相手は電話番号や本名を知りません。対等な利用者どうしの間で成り立ちます。&lt;&#x2F;dd&gt;
&lt;dt&gt;垂直的匿名性&lt;&#x2F;dt&gt;
&lt;dd&gt;サービス運営者に対する匿名性です。登録時に電話番号やメールアドレスを渡していなければ、運営は身元を特定する手がかりを持ちません。利用者とサービスという上下の関係で成り立ちます。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;Threema社は、ユーザー名機能で水平的匿名性は広まったものの、プライバシー保護で本当に重要なのは垂直的匿名性であり、これはセキュリティにおけるエンドツーエンド暗号化に相当する基盤だと主張します。あくまで同社の枠組みですが、この二軸はアプリを見比べる土台として使えます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;垂直的匿名性の重要性について&quot;&gt;垂直的匿名性の重要性について&lt;&#x2F;h2&gt;
&lt;p&gt;なぜ運営に対する匿名性がそれほど問題になるのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;メッセージングアプリでは、登録時に電話番号やメールアドレスを要求するものがあります。&lt;&#x2F;p&gt;
&lt;p&gt;ユーザー名で連絡先を交換できるサービスでも、相手にこうした個人情報を見せずに済むだけで、登録の段階では運営に渡しています。
電話番号やメールアドレスは本人確認や他サービスの登録にも使われる、生活に密着した識別子です。
運営がこれを保持していれば、別々の文脈で集めた情報を同一人物に結びつける手がかりとして使えてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;この紐付けは、広告で収益を上げるサービスでは特に意味を持ちます。利用者の行動を束ねてプロフィールを作るほど広告の精度が上がるので、複数の情報源を統合する動機がもともと働きます。電話番号やメールアドレスのような確実な識別子があれば、その統合は格段にやりやすくなります。メッセージの中身が暗号化されていても、誰がいつ誰と連絡したかというメタデータや、それを個人に結びつける識別子までは覆い隠せません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;メッセージングアプリの匿名性の比較&quot;&gt;メッセージングアプリの匿名性の比較&lt;&#x2F;h2&gt;
&lt;p&gt;ここまでの軸で、私が知る範囲の主要なアプリを並べてみます。&lt;&#x2F;p&gt;
&lt;p&gt;暗号化の強さと、運営に対する匿名性は別物だという点に注目してください。暗号化の対応範囲やメタデータ収集、法執行機関への開示といった機能面の詳しい比較は&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2024&#x2F;10&#x2F;modern-messaging-apps&#x2F;&quot;&gt;前回の記事&lt;&#x2F;a&gt;にまとめたので、ここでは匿名性の軸に絞ります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;アプリ&lt;&#x2F;th&gt;&lt;th&gt;登録時に必要な個人情報&lt;&#x2F;th&gt;&lt;th&gt;運営に対する匿名性&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;LINE&lt;&#x2F;td&gt;&lt;td&gt;電話番号&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;WhatsApp&lt;&#x2F;td&gt;&lt;td&gt;電話番号&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iMessage&lt;&#x2F;td&gt;&lt;td&gt;電話番号または Apple Account&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Signal&lt;&#x2F;td&gt;&lt;td&gt;電話番号&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Element &#x2F; Matrix&lt;&#x2F;td&gt;&lt;td&gt;なし（メールは任意）&lt;&#x2F;td&gt;&lt;td&gt;サーバー次第&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Threema&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;運営は満たすと主張&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Session&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;高い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;SimpleX&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;最も高い部類&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;国内利用者の多いLINEは、もう少し細かく見ておきます。LINEのメッセージはLetter Sealingと呼ぶ技術で暗号化されていますが、50人を超えるグループトーク、グループ音声・ビデオ通話、LINEミーティング、アルバム、ノートは対象外で、通信路のTLS暗号化にとどまります。
この範囲は運営が技術的に中身へアクセスし得ます。そして匿名性の面では、登録に電話番号が必須なので運営に対する匿名性は持ちません。自治体などが市民の申請にLINEを使
うケースが増えていますし、たまに企業でも業務で使用しているケースを見かけます。セキュリティ意識の低さには驚きます。&lt;&#x2F;p&gt;
&lt;p&gt;WhatsAppとiMessageも、垂直的匿名性はありません。メッセージの暗号化に対応していますが、登録にはWhatsAppが電話番号、iMessageが電話番号かApple Accountを必要とします。この時点で運営に対する匿名性は持ちません。
特にWhatsAppを運営するMeta社は広告を収入源としているので
、個人情報に関連したメタデータを収集してグループ内の他社と共有している可能性があります。
中身は守られても、誰といつ繋がったかまでは隠せません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;ただし、Signalのメタ情報の電話番号、登録日、最終接続日のみ。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;暗号化に強いというイメージのSignalも垂直的匿名性はありません。
ユーザー名機能が2024年に加わり、電話番号を教えないまま連絡できるようになりました(水平的匿名性)が、
アカウントの作成には今も電話番号が必須です。
Signalを運営するのはSignal Foundationという非営利団体ですが、拠点はカリフォルニア州です。
つまり米国の管轄下なので、米国の捜査機関の要求があれば開示義務があります。&lt;&#x2F;p&gt;
&lt;p&gt;ElementはMatrixというオープンなプロトコルの上に作られています。登録に必要なのは、選んだサーバー上のユーザー名とパスワードだけで、電話番号は要りません。メールアドレスはパスワード再設定用に任意で登録でき、サーバーによっては不正利用対策で求められることもあります。利用者はmatrix.orgのような公開サーバーを選んで登録するのが一般的で、自前でサーバーを立てることもできます。運営に対する匿名性は、結局どのサーバーを信頼するかに依存します。&lt;&#x2F;p&gt;
&lt;p&gt;結局、垂直的匿名性を保持しているのは、Threema、Session、SimpleXのみです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;垂直的匿名性の代償&quot;&gt;垂直的匿名性の代償&lt;&#x2F;h2&gt;
&lt;p&gt;垂直的匿名性の仕組みと、その代わりに払う利便性のコストを見ておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Threemaは電話番号やメールアドレスを必要とせず、アカウントはランダムに割り当てられたThreema IDだけで機能します。
ユーザーはThreema IDを交換しメッセージの送受信を行ないます。
伝えるのはThreema IDのみなので、運営や相手に身元を明かさずに通信できます。
Threemaを使用していることすら秘匿する為にGoogle Playなどに依存せずThreemaを入手・購入できる手段も提供しています。
Threema IDはThreema社により管理されており、「IDが誰か」はThreema社に把握されませんが「いつ・どのIDと通信したか」は
論理的にはThreema社で把握可能です。ただし、Threema社は広告やトラッキングを行なわないというポリシーを持ち、収益源を買い切り課金に置いています。&lt;&#x2F;p&gt;
&lt;p&gt;SimpleXは、利用者を識別する固定IDを一切持たない設計です。電話番号やユーザー名はもちろん、ランダムなIDすら使いません。仕組みは一方向のメッセージキューで、接続ごとに送信用と受信用の別々のキューを持ち、通常はそれぞれ別のサーバーを経由します。
サーバーから見えるのは不透明なキューへの孤立した配送だけで、送信者と受信者を結びつけられません。サーバー同士も通信せず、配送が済んだメッセージは保存しません。&lt;&#x2F;p&gt;
&lt;p&gt;SessionはもともとSignalのフォークとして始まりました。電話番号やメールなどの個人データも不要で、ランダムなSession IDという66文字程度の公開鍵をアカウントのIDとして使います。メッセージは多数の有志ノードからなるオニオン型のネットワークを経由し、どのノードも送信者と受信者の両方を知ることはありません。運営は2024年10月に、暗号化技術への規制圧力を背景としてオーストラリアからスイスへ拠点を移し、現在はスイスのSession Technology Foundationが運営しています。コードはQuarkslabによる独立監査を受けています。SimpleXとの違いは、Sessionが永続的なアカウントのIDを持つ点です。&lt;&#x2F;p&gt;
&lt;p&gt;これらの高い匿名性には、現実的な代償が伴います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;いずれも、相手に直接リンクやQRコード、IDを渡さなければ会話を始められない&lt;&#x2F;li&gt;
&lt;li&gt;従って、電話番号やユーザー名で気軽に相手を見つけることはできず、なんらかの方法で相手と直接これらの情報を交換する必要がある&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;一番問題になるのは、相手も同じアプリを入れている必要があるところでしょう。
いずれもマイナーなアプリなので、匿名性のために連絡相手の数と手軽さを大きく差し出すことになります。
この利便性の低さは、日常使いを考えるうえで無視できないトレードオフです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;メッセージングアプリについて私の選択&quot;&gt;メッセージングアプリについて私の選択&lt;&#x2F;h2&gt;
&lt;p&gt;ここまで匿名性の強さで並べてきましたが、強ければ強いほどよい、という話ではありません。匿名性がどれだけ効くかは、相手があなたの身元を知っているかどうかで変わります。&lt;&#x2F;p&gt;
&lt;p&gt;私は以下のように考えています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;関係&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;家族&lt;&#x2F;td&gt;&lt;td&gt;当然対面しており、インストールするアプリも管理可能。機微なメッセージ交換もあり&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;友人&lt;&#x2F;td&gt;&lt;td&gt;対面しているが、アプリの管理は困難。機微なメッセージ交換は限定的&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;他人&lt;&#x2F;td&gt;&lt;td&gt;必ずしも対面していない。アプリの管理は不能。機微なメッセージはなし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;このように考えると、家族とは水平的匿名性は不要で垂直的匿名性が必要です。
前回の記事でも軽く触れましたが、私自身は家族との連絡用にThreemaを選んでいます。
SimpleXやSessionでもよいのですが、かなり以前からThreemaを使用しており、特に問題もないために使用を続けています。&lt;&#x2F;p&gt;
&lt;p&gt;友人も同様です。知り合いなので水平的匿名性は不要ですが、垂直的匿名性は必要です。
しかし、現実的には垂直的匿名性を実現するために、先に記述した「代償」のため友人に対応するアプリを導入してもらうことは困難です。
そのため諦めて必要な場合は、友人にはメールかSMSでのコンタクトを依頼しています。暗号化、匿名性は放棄すると言うことです。
LINEなどを使っていると「じゃ、LINEで」と言われるので、私はLINEなどのアプリは使わずインストールさえしていません。&lt;&#x2F;p&gt;
&lt;p&gt;ネットで知り合ったような他人については、どちらの匿名性も重要だと思います。
しかし、私は、匿名のままネットで知り合った相手とメッセージングアプリを使って通信するようなニーズはないので無視します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;LINE・WhatsApp・iMessage・Signalなど主要なメッセージングアプリは、暗号化や水平的匿名性は実装されていますが、
垂直的匿名性は担保されていません。LINEなど「なりすまし防止、復旧、法令遵守」などを理由に電話番号への紐付けを強化しています。
自治体などでLINEを使用するケースが多いようですが、あれは個人特定を行政として放棄しているとしか思えません。&lt;&#x2F;p&gt;
&lt;p&gt;私にとって必要なのは垂直的匿名性です。メッセージの中身が暗号化されていても、運営に身元や「誰といつ通信したか」を握られては、プライバシーを守ったことになりません。
一方、相手に対しても名乗らない水平的匿名性は、私個人にはほとんど必要ありません。&lt;&#x2F;p&gt;
&lt;p&gt;両方の匿名性を保てるのは、Threema・Session・SimpleXの3つです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;米国報道機関ではSignalが使用されているケースが多いようです。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;両方の匿名性が必要なのは、相手や運営に身元を伏せたまま連絡したい場面だけです。
こうしたニーズは犯罪目的での使用を想起するかもしれませんが、内部告発や情報提供など正当な目的のためにも必要です。
米国では報道機関が情報提供の窓口としてメッセージングアプリの宛先などを公開しています。
日本ではこうした使い方はほとんど根づいておらず、全く遅れています。&lt;&#x2F;p&gt;
&lt;p&gt;大切なのは、自分がどちらの匿名性を必要とするのかを見極めることです。垂直的匿名性はほとんどの人に効きますが、水平的匿名性まで求めるかは人によって大きく変わります。私自身は、身元を隠す必要のない家族との連絡に、垂直的匿名性を保ちつつ扱いやすいThreemaを使っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;threema.com&#x2F;en&#x2F;blog&#x2F;anonymity-at-the-system-level-the-ultimate-privacy-protection&quot;&gt;Threema&lt;&#x2F;a&gt;. &quot;Anonymity at the System Level: The Ultimate Privacy Protection&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;threema.ch&#x2F;en&#x2F;blog&#x2F;posts&#x2F;news-alleged-weaknesses-statement&quot;&gt;Threema&lt;&#x2F;a&gt;. &quot;Statement on ETH Findings&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;breakingthe3ma.app&#x2F;&quot;&gt;ETH Zurich Applied Cryptography Group&lt;&#x2F;a&gt;. &quot;Three Lessons from Threema&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signal.org&#x2F;blog&#x2F;phone-number-privacy-usernames&#x2F;&quot;&gt;Signal&lt;&#x2F;a&gt;. &quot;Keep your phone number private with Signal usernames&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signalfoundation.org&#x2F;en&#x2F;&quot;&gt;Signal Foundation&lt;&#x2F;a&gt;. &quot;Signal Foundation&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simplex.chat&#x2F;docs&#x2F;simplex.html&quot;&gt;SimpleX Chat&lt;&#x2F;a&gt;. &quot;How SimpleX works&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getsession.org&#x2F;blog&#x2F;introducing-the-session-technology-foundation&quot;&gt;Session&lt;&#x2F;a&gt;. &quot;Introducing the Session Technology Foundation&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getsession.org&#x2F;session-code-audit&quot;&gt;Session&lt;&#x2F;a&gt;. &quot;Session code audit by Quarkslab&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;faq.whatsapp.com&#x2F;820124435853543&quot;&gt;WhatsApp Help Center&lt;&#x2F;a&gt;. &quot;About end-to-end encryption&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;guide&#x2F;security&#x2F;imessage-security-overview-secd9764312f&#x2F;web&quot;&gt;Apple Support&lt;&#x2F;a&gt;. &quot;iMessage security overview&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.element.io&#x2F;latest&#x2F;element-support&#x2F;matrix-account-management&#x2F;creating-a-matrix-account&#x2F;&quot;&gt;Element&lt;&#x2F;a&gt;. &quot;Creating a Matrix Account&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;help.line.me&#x2F;line&#x2F;smartphone&#x2F;categoryId&#x2F;20010067&#x2F;3&#x2F;pc&quot;&gt;LINE Help Center&lt;&#x2F;a&gt;. &quot;Letter Sealing&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lycorp.co.jp&#x2F;ja&#x2F;privacy-security&#x2F;security&#x2F;transparency&#x2F;encryption-report&#x2F;2025&#x2F;&quot;&gt;LINEヤフー&lt;&#x2F;a&gt;.「LINE暗号化状況レポート（2025年）」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Threema公式ブログに「システムレベルの匿名性」についての記事が公開されました。
日本ではLINEが主流で匿名性についての関心は薄いと思うので、その仕組みと重要性を解説してみました。
</summary>
        </entry><entry xml:lang="en">
        <title>pCloud DriveのmacOS Tahoe問題</title>
        <published>2026-06-27T10:00:00+09:00</published>
        <updated>2026-06-27T10:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/pcloud-tahoe-rclone/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/pcloud-tahoe-rclone/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;pcloud-tahoe-rclone&amp;#x2F;cover.webp?h=705f04e088eabd5c42f6&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;macOS Tahoe(macOS 26)に上げてから、pCloud Driveが起動するが機能しない状態となりました。
やっかいなのは、アプリ単体では済まず、うっかりpCloud Driveを開こうとするとキーボードが効かなくなるなどMac全体が一時的に不安定になる点です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pCloudとは&quot;&gt;pCloudとは&lt;&#x2F;h2&gt;
&lt;p&gt;pCloudは、スイスのpCloud AGが提供するクラウドストレージサービスです。買い切りの生涯プランがあること、ファイルを暗号化して預けられること、そしてアカウントを作ると無料枠から使い始められることで知られています。&lt;&#x2F;p&gt;
&lt;p&gt;Macで使う場合、もっとも手軽なのは公式のpCloud Driveアプリです。これはクラウド上のファイルを、ローカルの仮想ドライブ(&lt;code&gt;~&#x2F;pCloud Drive&lt;&#x2F;code&gt;)としてマウントして見せてくれます。Finderから普通のフォルダのように開けるので、クラウドを意識せずに使えるのが利点です。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、この「仮想ドライブとして見せる」仕組みは、macOSのファイルシステム拡張に依存します。後述するように、ここがOSのアップデートで影響を受けやすい部分でもあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;macOS_Tahoeでの不具合&quot;&gt;macOS Tahoeでの不具合&lt;&#x2F;h2&gt;
&lt;p&gt;私の環境はApple SiliconのMacで、OSはTahoe(macOS 26)です。アップデート後、pCloud Driveが機能せず、開こうとするとOS全体の挙動が一時的に不安定になりました。&lt;&#x2F;p&gt;
&lt;p&gt;同様の現象が一般に報告されているか調べたところ、Tahoe環境での不具合報告が複数見つかりました。代表的なものは次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;アップデート後に「Enable Disk(仮想ドライブのマウント)」が機能しない&lt;&#x2F;li&gt;
&lt;li&gt;メニューバーのアイコンが表示されない&lt;&#x2F;li&gt;
&lt;li&gt;ドライブは見えてもマウント・同期ができない&lt;&#x2F;li&gt;
&lt;li&gt;ドライブ有効化時に「outdated(古い)」と表示され有効化できない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらはフォーラムでの報告であり、「同様の事例が存在する」ことの裏付けにはなりますが、原因や解決を断定する根拠にはなりません。pCloud公式が症状ごとの原因を断定して公表しているわけでもありません。そのため、ここから先に書く原因は、あくまで私の推測として読んでください。&lt;&#x2F;p&gt;
&lt;p&gt;pCloud Driveは、クラウドをローカルの仮想ドライブとして見せるために、ファイルシステム拡張(pCloudFS &#x2F; macFUSE)を使います。この低レベルの拡張がロードに失敗したり、カーネル側で引っかかったりすると、アプリ単体のクラッシュにとどまらず、OS全体の挙動に波及することがあります。私が遭遇した「開こうとすると全体が不安定」という症状は、このパターンと整合します。OSのメジャーアップデート直後は、こうした低レベル拡張の互換性が崩れやすく、不安定になりがちです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pCloud_Driveのアンインストール&quot;&gt;pCloud Driveのアンインストール&lt;&#x2F;h2&gt;
&lt;p&gt;macOS向けのpCloud DriveはApple Siliconになってから問題も多く、macOSの変更による影響も受けやすいのでうんざりしていました。&lt;&#x2F;p&gt;
&lt;p&gt;OS全体を巻き込んで不安定になるアプリの回復に時間をかけるより、他の方法に移行しpCloud Driveはアンインストールすることにしました。&lt;&#x2F;p&gt;
&lt;p&gt;アンインストールは次の2ステップが必要です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;ログイン項目からpCloud Driveを外してmacOSを再起動&lt;&#x2F;li&gt;
&lt;li&gt;pCloud Driveの削除&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;まずシステム設定 → 一般 → ログイン項目と機能拡張からpCloud Driveを外し、いったんmacOSを再起動して拡張の常駐を切ります。&lt;&#x2F;p&gt;
&lt;p&gt;次にアプリ本体を削除です。&lt;&#x2F;p&gt;
&lt;p&gt;手動で削除する場合は、pCloud Driveを完全終了(できればアプリ内でログアウト&#x2F;Unlink)してから、アプリ本体をゴミ箱へ移し、&lt;code&gt;~&#x2F;Library&lt;&#x2F;code&gt;配下の残骸を削除します。主な残骸は次の場所です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;leftovers.txt&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;~&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;Library&#x2F;Application Support&#x2F;pCloud&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;~&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;Library&#x2F;Application Support&#x2F;com.pcloud.pcloud.macos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;~&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;Library&#x2F;Caches&#x2F;com.pcloud.pcloud.macos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;~&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;Library&#x2F;Preferences&#x2F;com.pcloud.pcloud.macos.plist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;私が実際に使ったのは、CLIのアンインストーラであるMole(&lt;code&gt;tw93&#x2F;Mole&lt;&#x2F;code&gt;)です。Homebrewで導入でき、コマンド名は&lt;code&gt;mo&lt;&#x2F;code&gt;になります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;install-mole.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install mole&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;mo uninstall&lt;&#x2F;code&gt;は、アプリ本体に加えて、launch agentやPreferences、Cachesといった関連ファイルもまとめて削除してくれます。安全のため、まず&lt;code&gt;--dry-run&lt;&#x2F;code&gt;で削除対象を確認してから本実行しました。対象アプリの正確な名前は&lt;code&gt;--list&lt;&#x2F;code&gt;で確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;uninstall.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; uninstall --list&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                   # mo uninstall が受け付ける正確なアプリ名を一覧表示&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; uninstall --dry-run &amp;quot;pCloud Drive&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # 削除対象を事前確認(変更は行わない)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; uninstall&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                           # 対話形式の一覧から pCloud Drive を選んで実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;引数なしの&lt;code&gt;mo uninstall&lt;&#x2F;code&gt;は対話形式のセレクタを開くので、一覧からpCloud Driveを選んで実行します。アプリ名を引数で渡せば、対話なしで直接アンインストールできます。削除されたファイルは既定でゴミ箱へ送られるため、必要なら復元できます。&lt;&#x2F;p&gt;
&lt;p&gt;Moleが消すのは、主にユーザーレベルの関連ファイルです。macOSにシステム拡張として登録された部分(pCloudFS &#x2F; システム拡張)は対象外になることがあります。通常はmacOSを再起動するとクリアされますが、残っていないかは次のコマンドで確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;check-extensions.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;systemextensionsctl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; list&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;   # pCloud AG の拡張が残っていないか確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Mole自身も、macOS 15以降では一部の拡張系の権限エントリがアプリ削除後も残ること、そしてその種のリセットはグローバルかつリカバリモードを要するため自動では行わないことを、警告として明示しています。ツール任せにせず、最後は再起動と&lt;code&gt;systemextensionsctl list&lt;&#x2F;code&gt;での確認で締めるのが現実的です。私の環境では、ログイン項目から外して再起動したあとにアンインストールしたこともあり、最終的にpCloud AGの拡張は1つも残りませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;なお、pCloud Driveアプリをアンインストールしても、pCloudアカウント自体は消えません。Web(my.pcloud.com)からファイルにはアクセスできますし、消えるのは有効化済みの同期設定とカスタム設定だけです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rcloneでの設定方法とメリット&quot;&gt;rcloneでの設定方法とメリット&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rclone.org&#x2F;&quot;&gt;rclone&lt;&#x2F;a&gt;は、各種クラウドストレージをコマンドラインから統一的に扱えるツールです。以前「&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;rclone&#x2F;&quot;&gt;rcloneとS3ライフサイクルで作る個人データのコールドアーカイブ&lt;&#x2F;a&gt;」でAmazon S3を使った長期保管の構成をまとめましたが、pCloudもバックエンドとして公式にサポートされています。&lt;&#x2F;p&gt;
&lt;p&gt;設定は&lt;code&gt;rclone config&lt;&#x2F;code&gt;の対話で行います。ブラウザ認証を済ませると、設定ファイル&lt;code&gt;~&#x2F;.config&#x2F;rclone&#x2F;rclone.conf&lt;&#x2F;code&gt;が作られ、内容は次のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot; data-name=&quot;rclone.conf&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pcloud&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; pcloud&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;hostname&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; eapi.pcloud.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;token&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;quot;access_token&amp;quot;:&amp;quot;&amp;lt;rclone config の認証で自動生成されるアクセストークン&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;quot;token_type&amp;quot;:&amp;quot;bearer&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;quot;expiry&amp;quot;:&amp;quot;0001-01-01T00:00:00Z&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ここで&lt;code&gt;token&lt;&#x2F;code&gt;は&lt;code&gt;rclone config&lt;&#x2F;code&gt;のOAuth認証で自動生成されるものです。手で書く必要はありませんし、アクセストークンそのものなので、他人に見せたりリポジトリにコミットしたりしないよう注意してください。この記事でも実際の値はプレースホルダに置き換えています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;私はプライバシーを重視しているので、ヨーロッパリージョン(&lt;code&gt;eapi.pcloud.com&lt;&#x2F;code&gt;)を使っています。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;code&gt;hostname&lt;&#x2F;code&gt;はリージョンを指します。&lt;code&gt;eapi.pcloud.com&lt;&#x2F;code&gt;はヨーロッパリージョン、&lt;code&gt;api.pcloud.com&lt;&#x2F;code&gt;(デフォルト)は米国リージョンです。アカウントがヨーロッパリージョンの場合は、ここを&lt;code&gt;eapi.pcloud.com&lt;&#x2F;code&gt;に設定しておかないとトークンエラーになることがあります。通常はOAuth認証の過程で適切に設定されますが、うまくいかないときはこの値を疑ってください。&lt;&#x2F;p&gt;
&lt;p&gt;設定できたら、まずは中身が見えるか確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;verify.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rclone&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; lsd pcloud:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                                # トップ階層のディレクトリ一覧&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rclone&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; copy pcloud:My&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Pictures ~&#x2F;Downloads&#x2F;pics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # 取り出し(ダウンロード)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rclone&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sync ~&#x2F;work pcloud:work&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                    # ローカルからクラウドへ同期(送信)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finderのようにフォルダとしてマウントしたい場合は&lt;code&gt;rclone mount&lt;&#x2F;code&gt;も使えますが、こちらはmacFUSEを必要とします。日常的なファイルの取り出しや同期は、マウントせずとも上記のコマンドだけで完結します。&lt;&#x2F;p&gt;
&lt;p&gt;pCloud Driveからrcloneへ寄せる利点は、大きく2つです。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;macOSへの非依存&lt;&#x2F;dt&gt;
&lt;dd&gt;コマンドベースの転送(&lt;code&gt;copy&lt;&#x2F;code&gt;、&lt;code&gt;sync&lt;&#x2F;code&gt;、&lt;code&gt;lsd&lt;&#x2F;code&gt;、&lt;code&gt;cat&lt;&#x2F;code&gt;)はファイルシステム拡張を使わず、ユーザーランドだけで完結する。今回の不具合の原因だったpCloudFS &#x2F; macFUSEとは無縁で、OSのメジャーアップデートにも振り回されない。&lt;&#x2F;dd&gt;
&lt;dt&gt;CLIでの自動化&lt;&#x2F;dt&gt;
&lt;dd&gt;CLIとなることで、&lt;code&gt;launchd&lt;&#x2F;code&gt;やシェルスクリプトに組み込みが自由になる。バックアップや定期同期などを自動化して回せる。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;pCloudのサービス継続性について&quot;&gt;pCloudのサービス継続性について&lt;&#x2F;h2&gt;
&lt;p&gt;ここで、pCloudというサービス自体の信頼性にも触れておきます。&lt;&#x2F;p&gt;
&lt;p&gt;pCloudの大きなウリは、一度の支払いで使い続けられる&lt;strong&gt;買い切り(Lifetime)プラン&lt;&#x2F;strong&gt;です。
ただし、その「Lifetime」が何を指すのかは、規約を読むと印象より限定的です。pCloudの利用規約は、買い切りプランの有効期間を「アカウント所有者の生存期間か99年のいずれか短い方」と定義しています。さらに「pCloudが事業を停止した場合、アカウントは終了し、サービスは提供されない」とも明記されています。買い切りは、永久でも、企業の存続から独立した保証でもありません。&lt;&#x2F;p&gt;
&lt;p&gt;そうなると運営元の規模が気になります。&lt;&#x2F;p&gt;
&lt;p&gt;pCloudを提供するpCloud AGはスイスの非上場企業で社員は数十人規模、外部資本を入れないブートストラップ経営です。
非上場企業のため正確な業績は外から分かりません。出回っている年商も10億円程度&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;pCloudサービスは設立から10年以上続き、ユーザーも2,000万を超えて伸びており、「経営が危ない」という状況ではなさそうです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、規模の小ささ自体が構造的な継続性リスクになります。買収や方針転換、大手との競争で、サービスの将来を一個人が見通すことはできません。また、規模の小ささが、今回の様な新しいmacOSへの対応の遅れの要因ともなっているかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;だからこそ、買い切りだからと唯一の保管先にはせず、今回のrcloneのような別経路や、ローカル・別クラウドにもコピーを持っておくのが現実的だと考えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;macOS Tahoeとの互換性によるpCloud Drive不具合から、一旦rcloneに移行しました。&lt;&#x2F;p&gt;
&lt;p&gt;とはいえ、pCloud DriveはDropboxのSmart Syncのようにキャッシュだけのローカルに置く方式で便利なので、いつか安定したら戻りたいものです。&lt;&#x2F;p&gt;
&lt;p&gt;振り返ってみると、pCloudの2TBライフタイムを購入したのは2021年です。350ドル（当時のレート1ドル約109円で約38,200円）の一括払いでした。仮に、Dropbox Plusの2TBを使用していたとしたら、年額15,840円（税込）かかります。
2年半足らずで買い切りが追いつき、購入から約5年が経った今では、Dropboxなら累計8万円ほどかかっていた計算です。円で累計コストを並べると、その差がはっきりします。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;pcloud-tahoe-rclone&amp;#x2F;cost-comparison.svg?h=42f101b3b0d542a4bd8a&quot;
  alt=&quot;2TBストレージの累計コスト。pCloudは2021年に約38,200円の買い切り、Dropboxは年額15,840円で累計が増え、約2.4年でpCloudが有利になる。&quot; width=&quot;760&quot; height=&quot;440&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;あまりヘビーに依存せず上手に使っていきたいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pcloud.com&#x2F;release-notes&#x2F;mac-os.html&quot;&gt;pCloud&lt;&#x2F;a&gt;. 「pCloud for macOS リリースノート」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pcloud.com&#x2F;ja&#x2F;help&#x2F;general-help-center&#x2F;what-if-i-uninstall-pcloud-from-my-computer&quot;&gt;pCloud&lt;&#x2F;a&gt;. 「コンピュータからpCloudをアンインストールするとどうなりますか」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pcloud.com&#x2F;terms_and_conditions.html&quot;&gt;pCloud&lt;&#x2F;a&gt;. &quot;Terms and Conditions&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;en-us&#x2F;102610&quot;&gt;Apple Support&lt;&#x2F;a&gt;. &quot;Delete apps on your Mac&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rclone.org&#x2F;pcloud&#x2F;&quot;&gt;rclone&lt;&#x2F;a&gt;. &quot;pCloud backend documentation&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tw93&#x2F;mole&quot;&gt;Mole&lt;&#x2F;a&gt;. &quot;tw93&#x2F;Mole&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;創業者の自己申告(約16.5億円)と第三者の推計(約6.6億円)で2倍以上の開きがあり、健全性を客観的に確かめる手段がありません。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">pCloudを長らく使用していますが、macOS TahoeにしてからpCloud Driveが機能せずMac全体が一時的に不安定になりました。
他のユーザーでも同様らしくアプリの改善は時間がかかりそうなので、別の方法を検討しました。
</summary>
        </entry><entry xml:lang="en">
        <title>映画『Michael』を観た</title>
        <published>2026-06-26T20:04:49+09:00</published>
        <updated>2026-06-26T20:04:49+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/michael/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/michael/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;michael&amp;#x2F;cover.webp?h=b0966d56037aa80e3372&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;676&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;先日、公開を楽しみにMichael Jacksonの曲「&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;black-or-white&#x2F;&quot;&gt;Black or White&lt;&#x2F;a&gt;」をカバーしましたが、やっと昨日映画を観ることができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;映画の印象&quot;&gt;映画の印象&lt;&#x2F;h2&gt;
&lt;p&gt;映画では、彼の幼少期から1988年のBad Tour - Londonで行われたWembley Stadiumまでが描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;アルバム「Thriller」発表の後、1984年冒頭のペプシCMでの負傷、
その年に行なったJacksonsとしてVictory Tourくらいまでは詳しく描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;1985年のチャリティ・シングル「We Are the World」のスタジオ録音は結構話題がありそうですが、
全く触れられていません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;1987年の9月か10月の横浜スタジアムのコンサートに行ったのを懐かしく思い出しました。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;エンディングは父親と決別し、新たな出発をするシーンとして「Bad」を歌うステージで幕を閉じます。実際にはBad Tourは1987年9月12日に日本の後楽園球場で開幕しています。&lt;&#x2F;p&gt;
&lt;p&gt;内容も知っているエピソードばかりですが、
丁度彼がポップスターとして駆け上がっていく時代が描かれているので大変楽しめました。
主演のJaafar Jacksonの再現度やダンスの完成度も大したものでした。そして、曲はオリジナルの
音源がIMAXで聞けるのです。もうそれだけでも満足と言うものです。&lt;&#x2F;p&gt;
&lt;p&gt;ちょっと引っかかったのは、兄弟たちがプロデューサーとして名前を並べていますが、
よくもまぁ自分たちの父親をあのように描けるものだなとは思いました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;続編について&quot;&gt;続編について&lt;&#x2F;h2&gt;
&lt;p&gt;もともと本作は1993年あたりまで描くことを想定したようです。
Michaelが13歳のジョーダン・チャンドラーへの性的虐待で告発され、警察がネバーランドを家宅捜索する場面から始まり、そこから生い立ちを回想し、告発とチャンドラー家の
訴訟（最終的に2,300万ドルで和解）へ戻っていく流れだったようです。&lt;&#x2F;p&gt;
&lt;p&gt;ところが和解契約で「チャンドラーをいかなる作品でも描写、言及してはならない」という条項があり(家族は忘れていた)、1988年で完結させるようかなり撮り直しをした
そうです。&lt;&#x2F;p&gt;
&lt;p&gt;このオクラになった撮影シーンが多くあるので、チャンドラーに関するシーンを除外して仕上げるのでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;ただ、ここからはMichaelに逆風の時期ですから、本作のように楽しめるか疑問です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;数字で見る_Michael&quot;&gt;数字で見る Michael&lt;&#x2F;h2&gt;
&lt;p&gt;そう言えば、アルバム「Dangerous」くらいまでは知っていますが、それ以降ってどういう活動をやっていたかあまり知らないなと思い調査してみました。&lt;&#x2F;p&gt;
&lt;p&gt;累計売上枚数は後年の売上も入っているので、アルバムがビルボード1位に居座った期間、収録曲が何曲Hot 100でトップ10入りしたかを調べてみました。&lt;&#x2F;p&gt;
&lt;div style=&quot;display:flex; flex-wrap:wrap; gap:14px; margin-bottom:10px; font-size:12px; color:var(--text-secondary);&quot;&gt;
  &lt;span style=&quot;display:flex; align-items:center; gap:6px;&quot;&gt;&lt;span style=&quot;width:12px; height:12px; border-radius:2px; background:#2a78d6;&quot;&gt;&lt;&#x2F;span&gt;全世界累計売上枚数（横棒・百万枚）&lt;&#x2F;span&gt;
  &lt;span style=&quot;display:flex; align-items:center; gap:6px;&quot;&gt;&lt;span style=&quot;width:14px; height:3px; background:#eb6834;&quot;&gt;&lt;&#x2F;span&gt;ビルボード200で1位の週数&lt;&#x2F;span&gt;
  &lt;span style=&quot;display:flex; align-items:center; gap:6px;&quot;&gt;&lt;span style=&quot;width:9px; height:9px; background:#008300;&quot;&gt;&lt;&#x2F;span&gt;Hot 100でトップ10入りした曲数&lt;&#x2F;span&gt;
&lt;&#x2F;div&gt;
&lt;div style=&quot;position: relative; width: 100%; height: 420px;&quot;&gt;
  &lt;canvas id=&quot;mjT10&quot; role=&quot;img&quot; aria-label=&quot;縦軸が年代の複合グラフ。横棒は全世界累計売上で1979年Off the Wall約2000万枚、1982年Thriller約7000万枚、1987年Bad約3500万枚、1991年Dangerous約3200万枚、1995年HIStory約2000万枚、2001年Invincible約800万枚。オレンジの折れ線はビルボード200で1位の週数で0,37,6,4,2,1。緑の折れ線はHot 100トップ10入り曲数で4,7,6,4,2,1。&quot;&gt;売上(百万枚)20,70,35,32,20,8。1位週数0,37,6,4,2,1。トップ10入り曲数4,7,6,4,2,1。年代は上から1979,1982,1987,1991,1995,2001。&lt;&#x2F;canvas&gt;
&lt;&#x2F;div&gt;
&lt;script src=&quot;https:&#x2F;&#x2F;cdnjs.cloudflare.com&#x2F;ajax&#x2F;libs&#x2F;Chart.js&#x2F;4.4.1&#x2F;chart.umd.js&quot;&gt;&lt;&#x2F;script&gt;
&lt;script&gt;
(function(){
  var lbl={
    id:&#x27;lbl&#x27;,
    afterDatasetsDraw:function(c){
      var ctx=c.ctx; ctx.save(); ctx.font=&#x27;500 12px sans-serif&#x27;;
      var b=c.getDatasetMeta(0);
      ctx.textAlign=&#x27;left&#x27;; ctx.textBaseline=&#x27;middle&#x27;; ctx.fillStyle=&#x27;#185fa5&#x27;;
      b.data.forEach(function(p,i){ ctx.fillText(c.data.datasets[0].data[i], p.x+6, p.y); });
      var w=c.getDatasetMeta(1);
      ctx.textAlign=&#x27;center&#x27;; ctx.textBaseline=&#x27;bottom&#x27;; ctx.fillStyle=&#x27;#c0451c&#x27;;
      w.data.forEach(function(p,i){ ctx.fillText(c.data.datasets[1].data[i]+&#x27;週&#x27;, p.x, p.y-7); });
      var s=c.getDatasetMeta(2);
      ctx.textAlign=&#x27;center&#x27;; ctx.textBaseline=&#x27;top&#x27;; ctx.fillStyle=&#x27;#006300&#x27;;
      s.data.forEach(function(p,i){ ctx.fillText(c.data.datasets[2].data[i]+&#x27;曲&#x27;, p.x, p.y+7); });
      ctx.restore();
    }
  };
  new Chart(document.getElementById(&#x27;mjT10&#x27;),{
    data:{
      labels:[[&#x27;1979&#x27;,&#x27;Off the Wall&#x27;],[&#x27;1982&#x27;,&#x27;Thriller&#x27;],[&#x27;1987&#x27;,&#x27;Bad&#x27;],[&#x27;1991&#x27;,&#x27;Dangerous&#x27;],[&#x27;1995&#x27;,&#x27;HIStory&#x27;],[&#x27;2001&#x27;,&#x27;Invincible&#x27;]],
      datasets:[
        {type:&#x27;bar&#x27;,label:&#x27;全世界累計売上枚数&#x27;,data:[20,70,35,32,20,8],xAxisID:&#x27;xSales&#x27;,backgroundColor:&#x27;#2a78d6&#x27;,borderRadius:4,maxBarThickness:22,order:3},
        {type:&#x27;line&#x27;,label:&#x27;1位週数&#x27;,data:[0,37,6,4,2,1],xAxisID:&#x27;xWeeks&#x27;,borderColor:&#x27;#eb6834&#x27;,backgroundColor:&#x27;#eb6834&#x27;,borderWidth:2,pointRadius:5,pointStyle:&#x27;circle&#x27;,tension:0,order:1},
        {type:&#x27;line&#x27;,label:&#x27;トップ10入り曲数&#x27;,data:[4,7,6,4,2,1],xAxisID:&#x27;xSongs&#x27;,borderColor:&#x27;#008300&#x27;,backgroundColor:&#x27;#008300&#x27;,borderWidth:2,pointRadius:5,pointStyle:&#x27;rect&#x27;,tension:0,order:2}
      ]
    },
    options:{
      indexAxis:&#x27;y&#x27;,
      responsive:true, maintainAspectRatio:false,
      layout:{padding:{right:40,top:6}},
      plugins:{legend:{display:false}, tooltip:{callbacks:{label:function(x){var u=x.datasetIndex===0?&#x27;百万枚&#x27;:(x.datasetIndex===1?&#x27;週&#x27;:&#x27;曲&#x27;);return x.dataset.label+&#x27; &#x27;+x.parsed.x+u;}}}},
      scales:{
        y:{ticks:{color:&#x27;#52514e&#x27;,font:{size:12}},grid:{display:false}},
        xSales:{position:&#x27;bottom&#x27;,beginAtZero:true,max:80,title:{display:true,text:&#x27;全世界累計売上枚数（百万枚）&#x27;,color:&#x27;#185fa5&#x27;,font:{size:11}},ticks:{color:&#x27;#898781&#x27;},grid:{color:&#x27;#e1e0d9&#x27;}},
        xWeeks:{position:&#x27;top&#x27;,beginAtZero:true,max:40,title:{display:true,text:&#x27;ビルボード200で1位の週数&#x27;,color:&#x27;#c0451c&#x27;,font:{size:11}},ticks:{color:&#x27;#898781&#x27;},grid:{display:false}},
        xSongs:{position:&#x27;top&#x27;,beginAtZero:true,max:8,title:{display:true,text:&#x27;Hot 100でトップ10入りした曲数&#x27;,color:&#x27;#006300&#x27;,font:{size:11}},ticks:{color:&#x27;#898781&#x27;,stepSize:2},grid:{display:false}}
      }
    },
    plugins:[lbl]
  });
})();
&lt;&#x2F;script&gt;
&lt;p&gt;こうしてみると、アルバム「Thriller」がどれだけ突出して売れたかがよくわかりますね。
37週に渡ってチャート1位でアルバムから7曲もチャートインしています。&lt;&#x2F;p&gt;
&lt;p&gt;Bad Tourを観た影響かアルバム「Bad」も「売れた」という印象があります。
1987年ですから、丁度リスナーがCDに移行した時期なのでみんな買ってた印象がありますが、
「Thriller」ほどは売れなかったのですね。
ただ、アルバムから6曲も収録曲がチャートインしているので、体感的に「売れてた」と感じていたのもうなずけます。&lt;&#x2F;p&gt;
&lt;p&gt;その後は見事に下降線を描いており、これも感覚と合っています。&lt;&#x2F;p&gt;
&lt;p&gt;2001年以降アルバムをリリースしていませんが、これはソニーとのトラブルのためです。&lt;&#x2F;p&gt;
&lt;p&gt;第一に過去作品のマスター権で揉めて契約更新をMichaelが拒否しました。&lt;&#x2F;p&gt;
&lt;p&gt;第二に2003年から未成年への性的虐待などでの刑事裁判で時間的にも財政的に余裕がなかったのでしょう(無罪判決は勝ち取っています)。&lt;&#x2F;p&gt;
&lt;p&gt;第三にレコード会社との契約がないためか、アルバムという形でなく数ヶ月ごとにデジタル・シングルをリリースする形態は晩年考えていたようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;映画『Michael』は、彼がポップスターとして頂点へ駆け上がっていく時代を、オリジナル音源とともにIMAXで追体験できる作品でした。知っているエピソードばかりとはいえ、Jaafar Jacksonの再現度の高さもあって最後まで楽しめました。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、こうして数字を並べてみると「Thriller」の突出ぶりと、その後の下降線がはっきり見えてきます。本作が1988年で幕を閉じたのは制作上の事情によるものですが、結果として彼のもっとも輝いていた時期だけを切り取った一作になっています。続編が逆風の時代をどう描くのか、楽しめる作品になるのかは、正直なところまだ見えません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">やっと映画『Michael』を観ることができました。彼がポップスターへ駆け上がっていく時代をIMAXのオリジナル音源で追体験しながら、急遽1988年で幕を閉じることになった制作の裏側、そしてThrillerの突出ぶりをチャートの数字から分析します。
</summary>
        </entry><entry xml:lang="en">
        <title>中国を批判すると入国時に拘束されうる ― 7月施行「民族団結進歩促進法」の域外条項</title>
        <published>2026-06-24T07:32:30+09:00</published>
        <updated>2026-06-24T07:32:30+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/ethnic-unity-and-progress-promotion-law/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/ethnic-unity-and-progress-promotion-law/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;ethnic-unity-and-progress-promotion-law&amp;#x2F;cover.webp?h=5929e47a698315521201&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;中国で「民族団結進歩促進法」という法律が2026年7月1日に施行されます。&lt;&#x2F;p&gt;
&lt;p&gt;少数民族の統制を強める国内法に見えますが、欧州議会や国連はすでに強い懸念を表明しています。
中国に渡航する日本人やビジネスにも無関係ではありません。
施行を前に、何が定められ、どこが危ういのかを条文と国際社会の評価に即して整理しておきます。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;どんな法律か&quot;&gt;どんな法律か&lt;&#x2F;h2&gt;
&lt;p&gt;「中華人民共和国民族団結進歩促進法」は、2026年3月12日の第14期全国人民代表大会第4回会議で可決され、同日に習近平国家主席が主席令第71号として公布しました。施行は&lt;strong&gt;2026年7月1日&lt;&#x2F;strong&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;中国政府はこれを「中華民族共同体意識を強固にするための基本法」と位置付けています。
法律の目的として掲げられているのは、「中華民族共同体意識」の強化、各民族の交流・往来・融合の促進、そして国家統一の維持です。&lt;&#x2F;p&gt;
&lt;p&gt;習近平政権が進めてきた民族政策を、はじめて一本の法律として体系化したものといえます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;何が定められているか&quot;&gt;何が定められているか&lt;&#x2F;h2&gt;
&lt;p&gt;主な具体的な施策として、次のことが定められています。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;標準中国語（普通話）の普及&lt;&#x2F;dt&gt;
&lt;dd&gt;公共生活における標準中国語の優位を定め、就学前教育の段階から習熟を求めるほか、公共の場で少数民族の文字を使う際には漢字をより目立つように表示する義務などが盛り込まれている。&lt;&#x2F;dd&gt;
&lt;dt&gt;「中華民族共同体」に関する統一教材開発&lt;&#x2F;dt&gt;
&lt;dd&gt;教育の面では、教育部と国家民族事務委員会に「中華民族共同体」に関する統一教材の開発を指示。すべての学校のカリキュラムに組み込む。&lt;&#x2F;dd&gt;
&lt;dt&gt;「民族の団結と進歩を損なう」行為に対して法的責任&lt;&#x2F;dt&gt;
&lt;dd&gt;市民による「民族団結と進歩を損なう行為」の通報とその責任を問う枠組み。具体的な罰則そのものは他の適用法に委ねられているが、「民族団結を損なう」という行為類型が法律上の責任追及の根拠として明文化された点が大きい。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;どこが危ういのか&quot;&gt;どこが危ういのか&lt;&#x2F;h2&gt;
&lt;p&gt;本法の問題点は大きく4つに整理できます。少数民族の言語・文化の弱体化、「民族団結を損なう」という概念の曖昧さ、台湾を取り込む条文、そして射程を国外に広げる域外条項です。順に見ていきます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._少数民族の言語と文化の弱体化&quot;&gt;1. 少数民族の言語と文化の弱体化&lt;&#x2F;h3&gt;
&lt;p&gt;標準中国語を全面的に普及させ、統一教材で「単一の文化アイデンティティ」を強化する方向は、ウイグル族やチベット族など少数民族の母語が生き残る余地を狭めます。1984年の地域民族自治法が少数民族の言語教育を保障していたのと比べると、明らかな後退です。&lt;&#x2F;p&gt;
&lt;p&gt;条文は就学前教育の段階から標準中国語の習熟を求め、公共の場で少数民族の文字を使う際には漢字をより目立つように表示する義務まで定めています。これは民族の差異を認めてきた従来の枠組みから、積極的な同化へと舵を切るものです。言語は文化やアイデンティティの土台であり、教育と公共空間の両面から母語の使用機会を削っていけば、世代を追うごとに少数民族の文化は痩せていきます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._「民族団結を損なう」概念の曖昧さ&quot;&gt;2. 「民族団結を損なう」概念の曖昧さ&lt;&#x2F;h3&gt;
&lt;p&gt;「民族団結を損なう」という概念が曖昧で、言論統制に転用されうる点も問題です。何がこの行為にあたるのかは条文から一義的には読み取れません。批判や異議申し立てが、解釈次第で処罰対象になりうるということです。&lt;&#x2F;p&gt;
&lt;p&gt;しかも本法は、市民による通報を認める枠組みを設けています。通報を入口に責任を問う仕組みは、何が違反かが曖昧なほど社会全体の萎縮を生みます。米カーネギーメロン大学の歴史学者は、この枠組みのもとでは非漢族によるあらゆる不満の表明が「分離主義者」や「テロリスト」と見なされかねないことを警告しています。処罰の範囲が運用次第で広がる構造は、当局にとって都合がよく、声を上げる側にとっては予測のつかないものになります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3._台湾を取り込む条文&quot;&gt;3. 台湾を取り込む条文&lt;&#x2F;h3&gt;
&lt;p&gt;本法は台湾同胞の「中華民族への帰属感・同一性・栄誉感」を高めることを明記し、台湾を一方的に「中華民族共同体」の一部として位置付けています。台湾は中国の統治下にないにもかかわらず、その住民を「中華民族」の枠に組み込もうとする規定です。&lt;&#x2F;p&gt;
&lt;p&gt;専門家は、ここで「民族」と「国籍」の概念があえて曖昧にされている点を問題視しています。文化的な帰属の話と国家への帰属の話を重ねていけば、台湾の人々が将来「中国国民」と見なされ、政治的圧力や法的リスクにさらされる余地が広がります。法の可決を受けて、台湾側でも警戒の声が上がりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4._国外に及ぶ域外条項&quot;&gt;4. 国外に及ぶ域外条項&lt;&#x2F;h3&gt;
&lt;p&gt;本法は、その射程を中国国外にまで広げています。第21条では海外の華僑に対しても中華文化の発揚と帰属意識の向上を求め、第63条では、中国国外の組織・個人が中国に対して民族団結を破壊し民族分裂を作り出す行為があった場合に「法に基づき法的責任を追及する」と規定しています。&lt;&#x2F;p&gt;
&lt;p&gt;域外条項そのものに目新しさはありません。香港国家安全維持法は第38条で、香港の永住権を持たない者が香港の外で同法に定める犯罪を行った場合にも適用すると定めていますし、国家安全法や反国家分裂法も中国の主権が及ぶ範囲を広く構えています。問題は、本法が責任追及の入口に置く「民族団結を損なう行為」の定義が、これらの先行する法律よりもさらに曖昧だという点です。何が違反にあたるかが解釈に委ねられているほど、運用する側の裁量は大きくなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;国際社会はどう評価したか&quot;&gt;国際社会はどう評価したか&lt;&#x2F;h2&gt;
&lt;p&gt;この法律の危うさは、一部の論者の見立てにとどまるものではありません。欧米の議会や国連、研究機関が公式の文書として懸念を表明しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;欧州議会&lt;&#x2F;strong&gt;は2026年4月30日に本法を非難する決議を採択しました。決議は法の施行が「民族的アイデンティティへの組織的な抑圧を強め、EUと北京の関係をさらに悪化させる」と警告しています。そのうえで域外適用を名指しで問題視し、域外からの弾圧（transnational repression）にさらされる人々の保護をEUと加盟国に求め、法の起草・施行に関与した者への制裁と法そのものの撤回を要求しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;国連&lt;&#x2F;strong&gt;も動いています。2026年4月、8名の元国連特別報告者が連名の書簡で、本法が中国の批准済み条約を含む少なくとも12の国際人権規範に違反しうると指摘しました。国連人権高等弁務官のフォルカー・テュルク氏も、信仰と文化の自由を制限しかねないと懸念を表明しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;米国の研究機関&lt;&#x2F;strong&gt;の評価も厳しいものです。外交問題評議会（CFR）&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-cfr-1&quot;&gt;&lt;a href=&quot;#fn-cfr&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;は本法を「民族自治から強制的な同化へ」の転換と位置付け、北京が1980年代以来の枠組みを離れて積極的同化主義（いわゆる「第二世代民族政策」）に舵を切ったと分析しています。民主主義防衛財団（FDD）&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-fdd-1&quot;&gt;&lt;a href=&quot;#fn-fdd&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;は、本法が進行中の弾圧を正当化するものだと評価しました。米コーネル大学の研究者は、本法が中国自身の憲法と矛盾し同化を優先するものだと指摘し、ヒューマン・ライツ・ウォッチも域外適用を「域外からの弾圧」と明確に批判しています。&lt;&#x2F;p&gt;
&lt;p&gt;これに対し中国側は、欧州議会の決議を「事実と法の支配を無視し、中国の法律と民族政策を悪意をもって中傷し、内政に著しく干渉するものだ」と反発しています。評価が大きく分かれているからこそ、どちらの言い分に立つかではなく、条文そのものと各機関の指摘を突き合わせて判断する必要があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;日本の報じ方とのギャップ&quot;&gt;日本の報じ方とのギャップ&lt;&#x2F;h2&gt;
&lt;p&gt;日本での受け止めは、私が見るかぎり静かなものにとどまっています。&lt;&#x2F;p&gt;
&lt;p&gt;日本のマスメディアでは、法が可決された事実そのものは各社が短く報じたものの、その危うさや域外条項が日本人や日本企業にまで及ぶリスクを正面から伝える報道は、私が見るかぎりほとんど目にしません。可決を一過性のニュースとして流して終わり、という印象です。&lt;&#x2F;p&gt;
&lt;p&gt;この欧米とのギャップは、各報道機関が「中国を敵視しない」という条件を含む日中記者交換協定を前提として中国に特派員を置いており、
中国報道では自主規制を強いられているためでしょう。
加えて、中国批判に対してなぜか発狂する集団が日本には存在し、これを直接的に回避または対中ビジネスに利害を持つ広告主への配慮などから中国を刺激する論調を避けるインセンティブが働きます。こと中国に関わる話題について、国内の大手報道は全く信用できないと考えます。&lt;&#x2F;p&gt;
&lt;p&gt;だからこそ、要約された国内の二次報道に頼るのではなく、欧州議会の決議や国連の書簡、条文そのものといった一次情報と世界の評価に直接当たっておくことを勧めます。&lt;&#x2F;p&gt;
&lt;p&gt;なお、本稿を書いている時点では、この法律について日本政府が公式に論評したという記録も、私が探した範囲では見当たりません。
日本政府は最近では台湾有事やレアアース規制などでは懸念表明するようになりましたが、中国の人権問題、新疆ウイグル問題、チベット問題、香港問題で直接的な懸念や非難声明を出すことはまずないので、期待はできません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;日本人・日本企業にとってのリスク&quot;&gt;日本人・日本企業にとってのリスク&lt;&#x2F;h2&gt;
&lt;p&gt;域外条項があるからといって、中国の捜査機関が日本国内で直接執行できるわけではありません。しかし域外適用は、外交的・経済的な圧力をかけるための法的根拠として使いやすいものです。さきに見た香港国家安全維持法第38条と同じ構図です。域外で「違反」を認定された人物は、中国の執行管轄が及ぶ範囲、すなわち中国本土や香港に入った時点で実際に刑の執行を受けるおそれがあります。&lt;&#x2F;p&gt;
&lt;p&gt;つまり日本人であっても、中国を批判する発言や台湾・少数民族をめぐる発信が「民族団結を損なう行為」と解釈されれば、入国した瞬間に拘束されたり、中国国内の資産に措置を取られたりするリスクが理屈のうえでは生じます。「民族団結を損なう」の範囲が曖昧であるほど、そのリスクの予測可能性は下がります。&lt;&#x2F;p&gt;
&lt;p&gt;企業も同様です。台湾に関する発信や、在中拠点での研修・広報・展示といった活動が制約を受け、対中デジタル事業ではコンテンツ管理の強化を迫られます。取引や交流が萎縮し、駐在員や出張者の入国時の拘束リスクも無視できません。&lt;&#x2F;p&gt;
&lt;p&gt;IT業界では十数年前まで、中国のエンジニアを安価なリソースとして活用する開発体制が広く行われていました。カントリーリスクの高まりからこうした体制は減ってきたと見ていますが、もしいまだに中国側の人員や拠点へ機微な業務を委ねている企業があるとすれば、本法の施行はそのリスクをさらに高めることになります。&lt;&#x2F;p&gt;
&lt;p&gt;国内向けの統制法に見えて、その射程は国境の外にまで及びます。欧州議会や国連がここまで明確に警告している以上、7月1日の施行を前に、中国との関わり方を改めて点検しておく価値はあると思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;全国人民代表大会. 「中华人民共和国民族团结进步促进法」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.europarl.europa.eu&#x2F;doceo&#x2F;document&#x2F;TA-10-2026-0152_EN.pdf&quot;&gt;European Parliament&lt;&#x2F;a&gt;. &quot;The new Chinese law on &#x27;ethnic unity and progress&#x27; and the intensified suppression of ethnic identities&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Council on Foreign Relations. &quot;China&#x27;s New Ethnic Unity Law: From Autonomy to Assimilation&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Foundation for Defense of Democracies. &quot;China&#x27;s New Ethnic Minority Law Seeks To Legitimize Ongoing Repression&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Cornell University, Department of Government. &quot;Ethnic unity law contradicts China&#x27;s constitution, puts premium on assimilation&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Law_on_Promoting_Ethnic_Unity_and_Progress&quot;&gt;Law on Promoting Ethnic Unity and Progress - Wikipedia&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-cfr&quot;&gt;
&lt;p&gt;外交問題評議会（Council on Foreign Relations）は、1921年に設立された米国の非営利・超党派のシンクタンクです。ニューヨークに本部を置き、外交・安全保障の分野で大きな影響力を持ち、機関誌『Foreign Affairs』を発行しています。 &lt;a href=&quot;#fr-cfr-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-fdd&quot;&gt;
&lt;p&gt;民主主義防衛財団（Foundation for Defense of Democracies）は、2001年に設立されたワシントンD.C.拠点の外交・安全保障系シンクタンクです。権威主義体制がもたらす脅威の分析を中心に据え、対外政策で強硬な論調をとることで知られています。 &lt;a href=&quot;#fr-fdd-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">2026年7月1日に施行される中国の「民族団結進歩促進法」は、国外の個人や組織にも責任を追及できる域外条項を持っています。
日本ではあまり大きく扱われていませんが、欧米や国連では大きく問題視されています。中国に関連した仕事をされている日本人にも直接関係するリスクです。
</summary>
        </entry><entry xml:lang="en">
        <title>【DJI Avata2】千葉県大多喜町 - 粟又の滝</title>
        <published>2026-06-23T20:09:42+09:00</published>
        <updated>2026-06-23T20:09:42+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/awamata-waterfall/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/awamata-waterfall/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;awamata-waterfall&amp;#x2F;cover.webp?h=9475d2b092c49fa77d43&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;992&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;千葉県大多喜町、養老渓谷の最奥にある粟又の滝をDJI Avata2で撮影してきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;粟又の滝について&quot;&gt;粟又の滝について&lt;&#x2F;h2&gt;
&lt;p&gt;粟又の滝は、養老渓谷を流れる養老川の上流にかかる房総半島随一の名瀑です。正式名称は「高滝（たかたき）」、別名を「上総養老の滝」といい、養老渓谷という地名そのものがこの滝の別名に由来しています。&lt;&#x2F;p&gt;
&lt;p&gt;落差約30m、幅約30m、全長は約100mに及びますが、垂直に一気に落ちる滝ではありません。ゆるやかに傾斜した岩盤の上を、水が絹のように滑り落ちていく「滑滝（なめたき）」です。この岩肌は上総層群黄和田層の泥岩層で、やわらかい砂岩や凝灰岩が侵食される一方、侵食に強い泥岩が削り残されることで、滑らかな滝面が形づくられました。養老渓谷一帯は新生代の海成層を観察できる場所として「日本の地質百選」にも選ばれています。&lt;&#x2F;p&gt;
&lt;p&gt;滝つぼからは養老川沿いに、千代の滝・万代の滝・昇龍の滝・深沢の滝を巡る全長約1.7kmの滝めぐり遊歩道が続きます。千葉県でも屈指の紅葉スポットとして知られ、見頃は11月下旬から12月上旬ですが、私が訪れた初夏は新緑が美しい時期でした。アクセスは圏央道の市原鶴舞ICから約30分、町営駐車場（普通車500円）が滝のすぐそばにあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;DJI_Avata2で水面を飛ばす難しさ&quot;&gt;DJI Avata2で水面を飛ばす難しさ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はDJI Avata2を、モーションコントローラーのDJI RC Motion3で操縦しました。木々に囲まれた滝という狭く難しいロケーションに加えて歯痛も抱えており、マニュアル操作に自信が持てなかったためです。&lt;&#x2F;p&gt;
&lt;p&gt;RC Motion3で選べる飛行モードでは、機体下方と後方のビジョンセンサーを使ってドローンが自動的に位置を保持します。ところが滝つぼや水面は光を強く反射し、模様にも乏しいため、このビジョン測位がうまく働きません。結果として、機体が水面の上で位置を保てず狙ったとおりに水面すれすれを飛ばすことができませんでした。特に滝上空では位置が保てず勝手に後進するような動きになったので、高度を取って木の上からの撮影に切り替えました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;8ODkP9i9sPw&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;次は紅葉の季節に&quot;&gt;次は紅葉の季節に&lt;&#x2F;h2&gt;
&lt;p&gt;今回は歯痛とロケーションに振り回され、飛ばすだけで精いっぱいでした。映像も雑なものになってしまいましたが、それでも滑滝らしいなだらかな滝の表情は記録できたかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;粟又の滝は千葉県でも屈指の紅葉スポットです。ゆるやかな岩肌を滑り落ちる水の流れを、赤や黄に色づいた木々が縁取る空撮は、想像するだけでも美しいはずです。次は体調を整え、機材の設定も詰めたうえで、紅葉の季節にあらためて挑戦してみたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">養老渓谷の最奥にかかる粟又の滝を、DJI Avata2で空から撮影しました。落差30mの岩肌をなめらかに滑り落ちる滑滝の美しさに見とれる一方、水面の反射に阻まれて思うように飛ばせず、空撮にはすっかり苦戦させられました。
</summary>
        </entry><entry xml:lang="en">
        <title>千葉県産業振興センター令和7年度事業報告書レビュー</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/ciac-review-2025/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/ciac-review-2025/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;ciac-review-2025&amp;#x2F;cover.webp?h=3edd50913f92ae462340&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;2026年4月に、公益財団法人千葉県産業振興センター（以下「センター」）の令和8年度事業計画について、県の評価で繰り返し指摘されている課題にどう応えているかを検証する記事を書きました（「&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;ciac-review&#x2F;&quot;&gt;中小企業支援の中核、千葉県産業振興センターの本年事業計画を評価する&lt;&#x2F;a&gt;」）。&lt;&#x2F;p&gt;
&lt;p&gt;事業計画はあくまで「これから何をするか」の予算書です。その後、令和7年度の事業報告書及び決算報告書が公開されましたので、今回は「実際に何が起きたか」を決算ベースで読み解きます。計画書の文言ではなく、決算という事後の数字で答え合わせをする回です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;記事の前提と情報源&lt;&#x2F;strong&gt;
        &lt;p&gt;本記事の分析は、すべてセンター及び千葉県が一般に公開している資料に基づいています。参照した資料についてはReferencesセクションを確認ください。金額は令和7年度（令和7年4月〜令和8年3月）の決算値です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;なお4月の記事で扱った「17.9億円」は令和8年度の事業計画（予算）上の経常収益です。今回読む令和7年度の決算では経常収益は約15.2億円であり、対象年度が異なる点に注意してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4月の記事で指摘した課題（おさらい）&quot;&gt;4月の記事で指摘した課題（おさらい）&lt;&#x2F;h2&gt;
&lt;p&gt;まず、4月に整理した課題を簡単に振り返ります。いずれも千葉県の経営状況等評価で繰り返し指摘されながら、令和8年度事業計画では実質的に対応されていないと指摘したものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;経常収益の94.2%が公的資金で、自力で稼ぐ収益は1.4%にとどまる&lt;&#x2F;li&gt;
&lt;li&gt;「自主事業」は文言だけで、研修プログラム開発などへの投資予算がゼロ&lt;&#x2F;li&gt;
&lt;li&gt;常勤役員6名はプロパー1名・県退職者5名・民間人材0名で、経営層が県の天下り先になっている&lt;&#x2F;li&gt;
&lt;li&gt;県が給与を負担する派遣職員の見直し要請に応えていない&lt;&#x2F;li&gt;
&lt;li&gt;非常勤専門人材のスキルに依存し、組織としてケイパビリティを蓄積する仕組みがない&lt;&#x2F;li&gt;
&lt;li&gt;達成目標（KGI）も成果指標（KPI）も設定されていない&lt;&#x2F;li&gt;
&lt;li&gt;事業間連携を掲げる一方、NDAや情報障壁といった情報管理体制が未整備&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらは「計画書」を読んで指摘した課題でした。以下では、令和7年度の「事業報告書・決算」がこれらをどう裏付けているか、そして報告書を読んで新たに見えてきた課題を分けて挙げます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;事業報告書が裏付ける課題&quot;&gt;事業報告書が裏付ける課題&lt;&#x2F;h2&gt;
&lt;p&gt;4月に計画書を読んで挙げた課題は、決算でもそのまま確認できました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非常勤専門人材への依存拡大&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;事業費の「報酬」が令和7年度319,325,686円で、前年度比で約3,800万円・+13.5%の増加&lt;&#x2F;li&gt;
&lt;li&gt;プロパー職員の人件費（給料手当）は約209,559千円で、外部人材への報酬がこれを上回る&lt;&#x2F;li&gt;
&lt;li&gt;借りたスキルを組織に蓄積・継承する仕組みは、報告書にも記載なし&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;「自主事業」が収益事業の規模に達していない&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;外部向けの技術経営実践講座は、各回の受講者が11名前後にとどまる&lt;&#x2F;li&gt;
&lt;li&gt;単価や原価までは決算から読み取れないが、有償の収益事業として成立する規模には届いていない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;経営層の県OB構成は不変&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;常勤理事6名はセンター内部の肩書で占められ、民間からの登用なし&lt;&#x2F;li&gt;
&lt;li&gt;県評価が求める「民間人材の役員起用」は令和7年度末でも未実現&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;事業報告書から新たに見える課題&quot;&gt;事業報告書から新たに見える課題&lt;&#x2F;h2&gt;
&lt;p&gt;ここからは、4月の計画書分析では見えなかった、報告書・決算ならではの課題です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;会費収入が消滅&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;前年度に1,520,000円あった受取会費が、令和7年度はゼロ&lt;&#x2F;li&gt;
&lt;li&gt;「ちば新事業創出ネットワーク」に741社・機関が参加するが、会費収入はない&lt;&#x2F;li&gt;
&lt;li&gt;数少ない自主財源をまた1つ失った形で、背景の説明もない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;監督官庁である県の現役幹部が非常勤理事を兼ねている&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;役員一覧に、非常勤理事として現役の千葉県商工労働部長が記載（事実）&lt;&#x2F;li&gt;
&lt;li&gt;所管部長が外郭団体の非常勤理事を兼ねること自体は、いわゆる充て職として珍しくない&lt;&#x2F;li&gt;
&lt;li&gt;ただし県評価が「外部の視点やチェック機能のための民間人材の役員起用」を求めるなか、監督する側の幹部が役員に加わる構図は、独立したチェック機能との関係で利益相反が懸念される（論評）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;非常勤員が常勤職員を数で上回る&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;常勤の役職員64名に対し、非常勤の嘱託員は113名（合計177名）&lt;&#x2F;li&gt;
&lt;li&gt;非常勤が常勤の約1.8倍。プロパーより外部人材のほうが頭数で多い&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;評議員会の多くがみなし決議&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;評議員会は年6回のうち5回が「みなし決議」&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-minashi-1&quot;&gt;&lt;a href=&quot;#fn-minashi&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;で、対面開催は1回のみ&lt;&#x2F;li&gt;
&lt;li&gt;理事会も7回中3回がみなし決議&lt;&#x2F;li&gt;
&lt;li&gt;書面決議は法律上の正式手続きだが、ガバナンスの要である評議員会が対面で審議・討議した場は年1回にとどまる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;県借入金は約104億円、負債面でも県に依存&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;決算注記で千葉県を「支配法人」と明記&lt;&#x2F;li&gt;
&lt;li&gt;補助金・委託金に加え、県借入金が期末残高で約104億円&lt;&#x2F;li&gt;
&lt;li&gt;元気づくり基金・農商工連携基金の原資にあたり、基金の積立資産を担保に供している&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;基金を構成する債券に約6億円の評価差損（含み損）&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;満期保有目的債券の時価が取得時より合計で約6億円下回っている&lt;&#x2F;li&gt;
&lt;li&gt;満期まで保有すれば実現せず、当期損益にも影響しない。途中売却や発行体の信用悪化があって初めて顕在化する性質のもの&lt;&#x2F;li&gt;
&lt;li&gt;とはいえ運用益を事業財源に充てる構造ゆえ、金利環境によっては基金からの収益が伸び悩む余地は残る&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;令和7年度の事業報告書と決算は、4月に計画書を読んで指摘した課題を、事後の数字としておおむね裏付けました。非常勤専門人材への報酬は約3,800万円増え、自主事業の収益化は依然として遠く、経営層の県OB構成も変わっていません。&lt;&#x2F;p&gt;
&lt;p&gt;そのうえで決算からは、計画書では見えなかった新たな課題が浮かびました。わずかに残っていた会費収入は消滅し、役員一覧には監督官庁の現役幹部が理事として並び、評議員会は年1回しか実質開催されず、財務は約104億円の県借入金に支えられています。&lt;&#x2F;p&gt;
&lt;p&gt;4月の記事では「県の指摘に応えていない」ことを問題にしました。今回の決算は、その指摘に応えるどころか、わずかな自主財源すら細らせていることを示しています。自力で稼ぐ収益が減り、外部人材への依存はむしろ強まる。中小企業に経営改善を説く立場の組織が、自らの構造改革には手をつけられていない。この実態をどう受け止め、どう関与方針を見直すのか、改めて県の説明責任が問われます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和7年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和6年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pref.chiba.lg.jp&#x2F;keisei&#x2F;kousha&#x2F;sangyoshinko.html&quot;&gt;公益財団法人千葉県産業振興センター｜経営状況等の評価結果の公表（令和6年度・令和7年度）&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-minashi&quot;&gt;
&lt;p&gt;みなし決議（書面決議）は、理事や評議員が実際に集まらず、提案に対する書面等での同意をもって決議があったものとみなす方法。一般社団・財団法人法に基づく手続きで、機動的な意思決定に用いられる一方、対面での審議・討議は行われない。 &lt;a href=&quot;#fr-minashi-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">4月に令和8年度事業計画の問題点を指摘した千葉県産業振興センター。その後に公開された令和7年度の事業報告書と決算を読み解くと、わずかな会費収入は消え、非常勤人材への依存は強まり、監督官庁である県の現役商工労働部長が理事に名を連ねていました。計画書では見えなかった実態を、決算から確かめます。
</summary>
        </entry><entry xml:lang="en">
        <title>ビッグビッグランでカンストを狙え！</title>
        <published>2026-06-21T20:39:30+09:00</published>
        <updated>2026-06-21T20:39:30+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/big-run/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/big-run/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;big-run&amp;#x2F;cover.webp?h=77848617dc68e72a8b1d&quot;
  alt=&quot;Cover&quot; width=&quot;1910&quot; height=&quot;1078&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;2026年6月20日(土)午前9時～6月22日(月)午前9時に、
スプラトゥーン3では「ビッグビッグラン」が開催されます。&lt;&#x2F;p&gt;
&lt;p&gt;ビッグビッグランとは、過去に開催されたステージへシャケ達が再び訪れ、さらに「オカシラ連合」が襲来する特別なビッグランとなっています。久しぶりなので、今回は以下を目標を立てました。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;① カンストする&lt;&#x2F;dt&gt;
&lt;dd&gt;評価ゲージが上限である、999までがんばる。&lt;&#x2F;dd&gt;
&lt;dt&gt;② オカシラ連合制覇&lt;&#x2F;dt&gt;
&lt;dd&gt;まだ一度もできたことがないオカシラ連合3匹を全て撃退する。&lt;&#x2F;dd&gt;
&lt;dt&gt;③ 上位5パーセント（金）を目指す&lt;&#x2F;dt&gt;
&lt;dd&gt;135個以上のイクラ納品となっていますが、実績で変わってしまうので150個程度は納品しておきたい。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;91rvf2iRNIE&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;今回すべて目標を②日目に達成できました。最終的ないくら納品数の記録は174個でした。&lt;&#x2F;p&gt;
&lt;p&gt;クマサン印の強力なブキが支給されていることも大きいのです。&lt;&#x2F;p&gt;
&lt;p&gt;また、サーモンランは味方運に結構左右されます。
評価ゲージが上がっていくと、
ゲーム難度(イクラ納品ノルマ数とシャケの出現数)が上がっていくのでクリアが難しくなります。
しかし、評価ゲージが800くらいになるとゲーム難度は「キケン度MAX」となりますが、
妙な仕事できない味方はほとんどいなくなるので逆にクリアの確立が上がります。&lt;&#x2F;p&gt;
&lt;p&gt;楽しかった。次回の開催はいつかな。&lt;&#x2F;p&gt;
</content>
        <summary type="html">評価ゲージ999のカンスト、オカシラ連合3匹全撃退、上位5パーセント金バッジの3目標を掲げて挑んだビッグビッグラン。高評価帯ほど強い味方が集まるという逆転の法則を活かして、2日目に全目標を達成した記録です。
</summary>
        </entry><entry xml:lang="en">
        <title>&quot;Black or White&quot; — A Tribute to the Riff That Crossed Every Border</title>
        <published>2026-06-19T08:35:12+09:00</published>
        <updated>2026-06-19T08:35:12+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/black-or-white/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/black-or-white/</id>
        
            <content type="html">&lt;p&gt;映画『Michael』の公開が楽しみで、ついマイケル・ジャクソンが1991年に発表した「Black or White」をカバーしてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2341825985&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;black-or-white&quot; title=&quot;Black or White&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Black or White&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;この曲を選んだのは、マイケルの幻の復帰公演を記録した『This Is It』で華麗にリフを弾いていたOrianthi Panagarisが印象に残っていたからです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: 文末の三点リーダーは余韻を残す著者の表現意図のため句点を付けない --&gt;
&lt;p&gt;大ヒットした前作のアルバム『Bad』から4年近く間隔が空いた久しぶりの新曲でしたが、20カ国以上でチャート1位を獲得しました。日本でもヒットしたので、発表後には邦楽にも「あれ？　このリフはパクってない？」と思うほどリフの影響を感じる曲がありました。どうでもいい話ですが…&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;u0ENvcifhCg?si=Kttq_KXg_qjKgli3&quot;&gt;「心の扉」- 陣内大蔵(1992年)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;intl-ja&#x2F;track&#x2F;5SzTQlyfZLK54yawKQEm2K?si=a9a97c7f012e4161&quot;&gt;「WHILD THING」- BAAD(1994年)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;intl-ja&#x2F;track&#x2F;3mkWdYzJoNhbCDNgtxBR3J?si=03b5e27a13e54ce5&quot;&gt;「さよならなんて云えないよ」- 小沢健二(1995年)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">映画『Michael』の公開が楽しみで、つい1991年の名曲「Black or White」をギターでカバーしてしまいました。あの華麗なリフと、当時の邦楽が影響を受けた&quot;そっくりな曲&quot;の話もあわせてお届けします。
</summary>
        </entry><entry xml:lang="en">
        <title>ハイエンドを捨てた2026年のエフェクターボード</title>
        <published>2026-06-17T08:26:39+09:00</published>
        <updated>2026-06-17T08:26:39+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/guitar-effectors/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/guitar-effectors/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;guitar-effectors&amp;#x2F;cover.webp?h=8a84aa3c60f641b669e1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;guitar-effectors&amp;#x2F;cover.webp?h=8a84aa3c60f641b669e1&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1128&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;&#x2F;a&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;少し前にエフェクターボードを整理したので、記録しておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2026年現在のエフェクターボード&quot;&gt;2026年現在のエフェクターボード&lt;&#x2F;h2&gt;
&lt;p&gt;現在のエフェクターボードは以下のようになっています。&lt;&#x2F;p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Category&lt;&#x2F;th&gt;&lt;th scope=&quot;col&quot;&gt;Effector&lt;&#x2F;th&gt;&lt;th scope=&quot;col&quot;&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
  &lt;&#x2F;thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;Buffer&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uHmoQ3&quot;&gt;BOSS TU-3W&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;チューナーですが、主に優秀なバッファとして利用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td rowspan=&quot;2&quot;&gt;Compressor&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3S4eZge&quot;&gt;MXR Dyna Comp&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;主にクリーントーンでのサスティーンが必要な時に使用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uL3O9R&quot;&gt;Henretta Engineering Orange Whip Compressor&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orange Squeezerのクローン。オーバードライブ時
に使用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;Noise Gate&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3SaX5s9&quot;&gt;TC Electronic Iron Curtain Noise Gate&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orange Whipのヒスノイズが酷かったので追加&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td rowspan=&quot;3&quot;&gt;Drive&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4gvpmn8&quot;&gt;Broadcast AP-II&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Fuzzやコンソール的な歪みが必要な時に使用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4xzwNQw&quot;&gt;Vin-Antique PPSE Classic&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;TS的なOverdrive。芳醇な音色なので愛用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4xzwNQw&quot;&gt;Boss DS-1W&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;定番Distortion。今でも大好きな歪み&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;Ambience&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4vUaLX2&quot;&gt;UAFX Orion Tape Echo&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;テープ式エコーのシミュレーション&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;Amp&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4vfp0Wj&quot;&gt;DSM&amp;amp;Humboldt Simplifier MK-II&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;アナログのアンプシミュレーター&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;Speaker&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3ScALOS&quot;&gt;YAMAHA MS101-4&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;アンプなんか置けないのでヤマハのパワースピーカー&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
  &lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;p&gt;上記以外に次のものを持っています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;BOSS PX-1 : 歴代エフェクターを再現できるマルチエフェクター&lt;&#x2F;li&gt;
&lt;li&gt;BOSS VH-30H : ボリュームペダル&lt;&#x2F;li&gt;
&lt;li&gt;Ibanez WH10V3 : ワウペダル&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Compressor部&quot;&gt;Compressor部&lt;&#x2F;h2&gt;
&lt;p&gt;以前は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uCbfzV&quot;&gt;UAFX Max Preamp &amp;amp; Dual Compressor&lt;&#x2F;a&gt;を使用していました。&lt;&#x2F;p&gt;
&lt;p&gt;Dyna Comp&#x2F;Teletronix LA-2A&#x2F;UA 1176をシミュレーションできるコンプレッサーを2つ搭載し重ね掛けできました。
更に伝説的な真空管プリアンプ610のシミュレーションも付いており、仕様としては最強です。
しかし、機能が多い分だけ操作系も複雑で、慣れることができませんでした。また、LA-2A&#x2F;1176はLogic Proのプラグインで処理できます。&lt;&#x2F;p&gt;
&lt;p&gt;結局欲しいのは、昔聞いた「あの音」です。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;MXR Dyna Comp&lt;&#x2F;dt&gt;
&lt;dd&gt;現代的ではないかもしれません。CA3080というOTA1石構成で、ノブはOutputとSensitivityの2つだけです。ブレンドノブもなく常時フルウェット、Sensitivityを上げるほどヒスも増えるトレードオフが固定で乗ってきます。それでもミッドが持ち上がってスクワッシュした質感と、ピッキング直後のポップ音に続くなめらかな「ブルーミング」が個性です。欲しいのは、あの「パコーン」と伸びていく音なのです。&lt;&#x2F;dd&gt;
&lt;dt&gt;Henretta Engineering Orange Whip Compressor&lt;&#x2F;dt&gt;
&lt;dd&gt;フィードバック型のJFETコンプで、Orange Squeezerのクローンです。オリジナルはギターのジャックに直結する形だったので、子供の頃「あのギターについたオレンジの箱はなんだ？」と思ったのを覚えています。Dyna Compのようなブルーミングではなく、ピークを抑えて輪郭を整えるリミッター的な効きで、歪み系の前に置くとピッキングの強弱によらず歪み量とサスティーンが安定します。現代では邪道ですね。電源のためかヒスノイズが気になり、後段にNoise Gateを足しました。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;Drive部&quot;&gt;Drive部&lt;&#x2F;h2&gt;
&lt;p&gt;Simplifier MK-IIでも歪みは作れますが、若干ノイズが多いの
で通常はセッティングをクリーンにしてエフェクターで歪ませています。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;Broadcast AP-II&lt;&#x2F;dt&gt;
&lt;dd&gt;Hudson Electronics製、Ariel Posenのシグネチャーモデルです。1960年代の放送局コンソールを下敷きにした2チャンネルのプリアンプで、片方はトランス入りのシリコン回路による滑らかで太い歪み、もう片方はトランスを省いたゲルマニウム回路による明るく荒い歪みが得られます。両者はカスケード接続でき、軽いブーストから激しい歪みまで作れます。Fuzzやコンソール的な飽和感が欲しい場面で使っています。&lt;&#x2F;dd&gt;
&lt;dt&gt;Vin-Antique PPSE Classic&lt;&#x2F;dt&gt;
&lt;dd&gt;京都発のハンドメイドブランドによるTS系オーバードライブです。標準モデルのPPSE &#x27;79が非対称クリッピングなのに対し、本機はオリジナルTSに近い対称クリッピングを採用し、真空管アンプとの併用を想定しています。「温かくも反応の速い音」と「ブースターにしても煌びやか過ぎない芳醇な倍音」をテーマに作られており、Tone&#x2F;Gain&#x2F;Volumeのシンプルな3ノブ構成です。透明感のあるクラシカルな効きが気に入って常用しています。&lt;&#x2F;dd&gt;
&lt;dt&gt;Boss DS-1W&lt;&#x2F;dt&gt;
&lt;dd&gt;1978年発売、BOSS最初期の歪みのひとつである定番DS-1のWaza Craft版です。DS-1は途中でオペアンプが変わっており、本機のStandardは1994年の回路変更以降の現行DS-1らしいタイトな歪みを忠実に再現します。Customは+6dBのブーストと強いミッドの持ち上げが加わって音がぐっと前に出ます。フィルタリングも改善されてジリついた帯域が減り、ハイゲインでも破綻しにくくなりました。今でも大好きな定番の歪みで、手放せません。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;Ambience部&quot;&gt;Ambience部&lt;&#x2F;h2&gt;
&lt;p&gt;空間系のディレイやリバーブは、レコーディングではLogic Proのプラグインで掛けてしまうので、ボード上のこれは基本的に練習用です。&lt;&#x2F;p&gt;
&lt;p&gt;UAFX Orion Tape Echoは、名機Echoplex EP-IIIを下敷きにしたテープエコーのシミュレーターです。空間系は歪みの後段に置きたいので、Simplifier MK-IIのSend&#x2F;Returnループに繋いでいます。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、私がこれを手放せない理由はエコーよりもプリアンプにあります。EP-IIIは通すだけで音が太く前に出る「EPプリアンプ」が有名で、本機はこれを忠実に再現しています。背面のスイッチでドライ信号にもこのプリアンプを掛けられるので、ディレイをオフにしてもトーンを整えるプリアンプとして常時オンにしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回の整理では、Compressor部で触れたUAFX Max Preamp &amp;amp; Dual Compressorに加えて、Free The Tone Overdriveland Custom ShopやStrymon Fairfaxといった歪み系も手放しました。どれも音は文句なく素晴らしく、使っていて不満があったわけではありません。&lt;&#x2F;p&gt;
&lt;p&gt;それでも結局、自分が「いい音」と感じるのは客観的な優劣ではなく、幼少期に聴いて刷り込まれた音なのだと改めて思い知りました。あわせて、操作系はシンプルなほうがいい、つまみは少なければ少ないほどよい、というのが今回の教訓です。多機能で高性能な機材ほど、かえって「あの音」から遠ざかってしまう気がします。&lt;&#x2F;p&gt;
&lt;p&gt;しばらくはこの構成で安定しそうです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">高価で多機能なエフェクターを次々と手放し、行き着いたのはつまみの少ないシンプルなボードでした。どれも音は文句なく素晴らしかったのに、なぜ結局「あの音」に戻ってしまうのか。2026年現在の構成をたどりながら、その理由を考えます。
</summary>
        </entry><entry xml:lang="en">
        <title>Claude Fable Loss</title>
        <published>2026-06-15T08:13:26+09:00</published>
        <updated>2026-06-15T08:13:26+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/fable-loss/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/fable-loss/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;fable-loss&amp;#x2F;cover.webp?h=c18907ce2228e37f503e&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;2026年6月9日、Anthropic社は新しいAIモデル「Claude Fable 5」を一般公開しました。
これまで招待制でしか使えなかった「Mythosクラス」の推論能力を、安全機構付きで誰もが利用できるようにした初のモデルです。
ところが公開からわずか3日後、Fable 5は米政府の指示によって停止され、姿を消してしまいました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Fable_5とは&quot;&gt;Claude Fable 5とは&lt;&#x2F;h2&gt;
&lt;p&gt;Fable 5の位置づけは、公式の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;platform.claude.com&#x2F;docs&#x2F;en&#x2F;about-claude&#x2F;models&#x2F;overview&quot;&gt;モデル一覧&lt;&#x2F;a&gt;を見るとわかりやすいです。
コンテキストウィンドウは100万トークン、最大出力は12万8千トークン、料金は入力が100万トークンあたり10ドル、出力が同じく50ドルです。&lt;&#x2F;p&gt;
&lt;p&gt;数字だけを並べると、コンテキスト長と出力上限はOpus 4.8と同じで、際立った違いは見えません。
肝はスペックの数字ではなく、その中身にあります。&lt;&#x2F;p&gt;
&lt;p&gt;ひとつはMythosクラスの推論能力です。
Mythosは本来、限定公開の枠組み「Project Glasswing」でしか提供されていなかった上位クラスで、その能力を一般向けに開放したのがFable 5にあたります。
もうひとつはアダプティブ思考が常時有効になっている点です。
従来のような拡張思考のオン&#x2F;オフという概念はなく、思考の深さは&lt;code&gt;effort&lt;&#x2F;code&gt;パラメータで調整します。&lt;&#x2F;p&gt;
&lt;p&gt;なお、Fable 5には危険な要求を断るための安全分類器が組み込まれており、拒否したリクエストには通常のエラーではなく拒否を示す応答を返します。
この分類器を外したモデルがMythos 5で、こちらは引き続きProject Glasswingの限定提供にとどまっています。
つまりFable 5は、Mythosの能力に安全機構という蓋をかぶせて世に出した版、という位置づけです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fableが非公開となった理由&quot;&gt;Fableが非公開となった理由&lt;&#x2F;h2&gt;
&lt;p&gt;きっかけは1件のジェイルブレイクでした。
6月10日、著名なジェイルブレイカー「Pliny the Liberator」がFable 5の突破方法をX上で公開します。
報道によれば、その手口は「特定のコードベースを読み込ませ、ソフトウェアの欠陥を修正させる」というものです。これを悪用すると本来制限されているサイバー攻撃の情報を引き出せる、とされました。&lt;&#x2F;p&gt;
&lt;p&gt;これを重く見たのがAmazonでした。
同社CEOのAndy Jassy氏が米政府高官に連絡を取り、警告はやがて広範な規制へと発展します。
商務長官のHoward Lutnick氏は、AnthropicのAmodei CEOに宛てて、外国籍ユーザーによるFable 5・Mythos 5へのアクセスをすべて停止するよう求める書簡を送りました。
対象はAnthropic自身の従業員にまで及びました。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicは現地時間6月12日午後5時21分にこの指示を受け取ります。
外国籍ユーザーだけをリアルタイムに選別するのは難しいとして、結局、全ユーザーに対して両モデルを停止しました。
公開されているモデルが政府の介入で停止されたのは、主要なAI企業としては初めてのことだといわれています。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicはこの措置に同意していません。
公式声明では「数億人に提供している商用モデルを、狭いジェイルブレイクが見つかったことを理由に回収すべきだとは考えない」と述べ、この基準を認めればすべてのフロンティアモデルの新規提供が止まってしまう、と反論しています。
政府との「誤解」を解いて復旧を目指すとしていますが、その時期は明言されていません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fableを使用した印象&quot;&gt;Fableを使用した印象&lt;&#x2F;h2&gt;
&lt;p&gt;短い公開期間でしたが、私もFable 5を試すことができました。&lt;&#x2F;p&gt;
&lt;p&gt;正直なところ、チャットで普通に対話している分には、Opusとの違いはそれほど感じませんでした。
印象がはっきり変わったのは、Claude Codeに組み込んでコードや文書を書かせたときです。
これまでのClaude Codeでは、指示の細部を待って手が止まったり、こちらでも気づくようなうっかりミスを残したりしていました。
Fable 5ではそうした場面がほとんどなく、目的だけを伝えると自分で段取りを考え、次々と問題を片付けていきます。
「指示を待つアシスタント」から「自分で走るエージェント」へと変わったような手応えがありました。&lt;&#x2F;p&gt;
&lt;p&gt;特に効いたのは、指示が曖昧なときの振る舞いです。
いきなり書き始めるのではなく、まず周辺のコードを読んで環境を把握し、どのファイルやツールが使えるかを確かめてから手を動かします。
段取りの組み立てがうまく、長い作業でも途中で判断がぶれない印象でした。&lt;&#x2F;p&gt;
&lt;p&gt;あとから振り返ると、こう感じていたのは私だけではなかったようです。
公開直後から、難しい仕事ほど評価が高いという声が界隈に広がっていました。
複数ファイルにまたがるリファクタリングや、長時間にわたるエージェント実行、スクリーンショットからのフロントエンド実装といった重いタスクで、これまで尻込みしていた問題を一気に片付けてくれた、という報告が目立ちます。
極端な例では、Stripeが5000万行規模のRubyコードを1日で移行したという話まで出ていました。手作業なら2ヶ月以上かかると見積もっていた作業だそうです。
私が味わった「自分で走る」感覚は、規模こそ違え、同じものだったのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;もっとも、良いことばかりではありません。
Fable 5はじっくり考える分だけトークンを多く使うので、料金はOpus 4.8の2倍という表向きの数字以上に膨らみます。
実際のタスクでは3〜5倍になることもあるようで、日常の細かい作業まで何でもFableに任せればよい、という話ではなさそうでした。
難しい一手はFable、それ以外はOpus、という使い分けが現実的だろうと感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fableが恋しい&quot;&gt;Fableが恋しい&lt;&#x2F;h2&gt;
&lt;p&gt;皮肉なことに、停止の引き金となったジェイルブレイクの手口は「コードベースを読ませて欠陥を直させる」というものでした。
私がFable 5に最も魅力を感じたのも、まさにコードを任せたときの自走力です。
停止の理由となった能力と、私が手放したくないと思った能力は、どうやら地続きのようです。&lt;&#x2F;p&gt;
&lt;p&gt;たった3日間の付き合いでしたが、いちど「自分で走るAI」を味わってしまうと、元の環境に戻るのが少し物足りなく感じます。
復旧の時期はまだ見えません。
Fableが、恋しいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;fable-mythos-access&quot;&gt;Anthropic&lt;&#x2F;a&gt;.「Statement on the US government directive to suspend access to Fable 5 and Mythos 5」公式声明&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;platform.claude.com&#x2F;docs&#x2F;en&#x2F;about-claude&#x2F;models&#x2F;overview&quot;&gt;Anthropic&lt;&#x2F;a&gt;.「Models overview」モデル一覧と仕様&lt;&#x2F;li&gt;
&lt;li&gt;BeInCrypto.「Amazonの警告がAnthropicのFable・Mythos停止を招いた」&lt;&#x2F;li&gt;
&lt;li&gt;NBC News.「Anthropic suspends new AI models after government directive」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mindstudio.ai&#x2F;blog&#x2F;claude-fable-5-agentic-coding-real-world-results&quot;&gt;MindStudio&lt;&#x2F;a&gt;.「Claude Fable 5 for Long-Running Agentic Coding: Real-World Results」長時間エージェント作業での実例&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.coderabbit.ai&#x2F;blog&#x2F;fable-5-model-review&quot;&gt;CodeRabbit&lt;&#x2F;a&gt;.「Claude Fable 5 Model Review」コーディング性能のレビュー&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.truefoundry.com&#x2F;blog&#x2F;claude-fable-5-vs-opus-4-8-benchmarks-pricing-when-to-use-each&quot;&gt;TrueFoundry&lt;&#x2F;a&gt;.「Claude Fable 5 vs Opus 4.8: Benchmarks, Pricing &amp;amp; When to Use Each」料金と使い分け&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">公開からわずか3日で姿を消したClaude Fable 5。Mythosクラスの推論力を安全機構付きで誰もが使えるようにした初のモデルが、なぜ米政府の指示で停止されたのか。短い邂逅で味わった「自分で走るAI」の手応えと、それを手放した物足りなさを綴ります。
</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Bark</title>
        <published>2026-06-14T17:49:33+09:00</published>
        <updated>2026-06-14T17:49:33+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/bark/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/bark/</id>
        
            <content type="html">&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;yostos&#x2F;55280255498&#x2F;in&#x2F;dateposted-public&#x2F;&quot; title=&quot;Still Standing, Still Peeling&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;55280255498_b963140294_b.jpg&quot; width=&quot;1024&quot; height=&quot;683&quot; alt=&quot;Still Standing, Still Peeling&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A withered trunk stands surrounded by green that is still alive. The bark lifts like scales and falls away little by little, yet the trunk itself points to the sky, unbroken. Approaching the texture of bark under the theme &quot;Bark,&quot; you realize it is not a mere surface but the accumulation of all the years the tree has lived.&lt;&#x2F;p&gt;
&lt;p&gt;The peeling is a process of decay and, at the same time, proof that the tree has not yet fully crumbled. Standing and peeling — two opposing present participles quietly coexist within a single tree.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17680&quot;&gt;#Bark&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">Photo Friday の「Bark」へ寄せた一枚。
立ち枯れてなお空を指す幹。剥がれ続ける樹皮は、終わりではなく、まだ続いている時間そのもの。
</summary>
        </entry><entry xml:lang="en">
        <title>GR IV Monochromeから始めるdarktable現像術</title>
        <published>2026-06-12T09:46:20+09:00</published>
        <updated>2026-06-12T09:46:20+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/darktable/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/darktable/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;cover.webp?h=5ba5325b60304352f0ab&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;05&#x2F;gr-iv-monochrome&#x2F;&quot;&gt;RICOH GR IV Monochrome&lt;&#x2F;a&gt; を手に入れました。モノクロ専用機です。買うべき理由や撮影時の設定は別記事にまとめましたが、本稿はその続きにあたります。このカメラを手にしたのを機に、長らく惰性で使ってきたRAW現像アプリを一度見直すことにしました。撮ったあとの工程、つまり選定の記録と、最終的に選んだdarktableをモノクロ前提でどう使っているかのメモです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;RAW現像アプリの選定&quot;&gt;RAW現像アプリの選定&lt;&#x2F;h2&gt;
&lt;p&gt;これまで使ってきたのは、市川ソフトラボラトリーのSILKYPIXでした。ただ、選んで使い続けてきたというより惰性です。今回そのまま使えなかったのは、GR IV Monochromeに対応していないからです。SILKYPIXは未対応のカメラ・レンズのRAWファイルをそもそも開けません。加えてMac版はWindows版から数年遅れたまま放置されており、現像も遅いと、見直す理由はそろっていました。&lt;&#x2F;p&gt;
&lt;p&gt;候補としていちばん有力だったのはAdobeのLightroom Classicです。操作は直感的で非常に使いやすく、RAWファイルのライブラリ構成を自分で管理でき、Lightroomが勝手に干渉してこないのも気に入っています。ただし、使うには悪名高いAdobeのサブスクリプションが要ります。そこだけがどうしても引っかかりました。&lt;&#x2F;p&gt;
&lt;p&gt;結局、無料でありながら高機能なdarktableを使うことにしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;darktable&quot;&gt;darktable&lt;&#x2F;h2&gt;
&lt;p&gt;darktableは高機能なのですが、Lightroomのように機能が整理されておらず、最初は取っ付きにくいツールです。モジュールの数も多く、全部を理解しようとすると挫折します。そこで、モノクロ前提で本当に使うモジュールだけを絞り込みました。現像はおおむね次の順序で進めます。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;lens correction&lt;&#x2F;code&gt;（必須）— Lensfunデータベースを使い、歪曲と周辺減光を補正する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;exposure&lt;&#x2F;code&gt;（必須）— 主要被写体の中間調を適正にする(白飛び・黒つぶれは無視)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sigmoid&lt;&#x2F;code&gt;（必須）— ダイナミックレンジを表示レンジへ圧縮する(filmic rgb &#x2F; agxでも可)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;denoise (profiled)&lt;&#x2F;code&gt;（オプション）— ノイズを抑える&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rotate and perspective&lt;&#x2F;code&gt;（オプション）— 傾いた水平を出す(必要ならパースも整える)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;retouch&lt;&#x2F;code&gt;（オプション）— ゴミや不要物を消す&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;tone equalizer&lt;&#x2F;code&gt;（オプション）— 明暗の局所コントラストを足す&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;diffuse or sharpen&lt;&#x2F;code&gt;（オプション）— 仕上げにシャープ化する(旧来のsharpenでも可)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;crop&lt;&#x2F;code&gt;（オプション）— 最後に構図をトリミングする&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この流れの前提になっているのが、darktableが標準で採るscene-referredワークフローです。これは、センサーが捉えた光の量(リニアな値)をできるだけそのまま保ったまま現像を進め、モニタ表示に合わせた明暗の調整は最後にまとめて行う、という考え方です。明るさの情報を途中で切り詰めず、広いダイナミックレンジのまま持ち越して、いちばん最後にトーンマッピング(&lt;code&gt;sigmoid&lt;&#x2F;code&gt; など)で表示レンジへ圧縮します。&lt;&#x2F;p&gt;
&lt;p&gt;この前提があるので、作業は自然と二段構えになります。&lt;code&gt;exposure&lt;&#x2F;code&gt; では主要被写体の中間調だけを合わせ、白飛び・黒つぶれはあえて気にしません。広い階調はあとで &lt;code&gt;sigmoid&lt;&#x2F;code&gt; がまとめて表示レンジに収めてくれるからです。本稿のモジュール選定も、この流れに沿っています。&lt;&#x2F;p&gt;
&lt;p&gt;なお、darktableのモジュールは画面に並んだ順ではなく、内部で決められたパイプライン順に適用されます。上の並びはそのパイプライン順ではなく、darktable公式マニュアルが薦める作業順(最初にlens correction、次に基礎となる露出とトーンマッピング、続いて各種補正、最後に構図の仕上げ)に沿っています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lens_correction&quot;&gt;lens correction&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;lens-correction.webp?h=9a605267a178ab3f576b&quot;
      alt=&quot;darktableのlens correctionモジュール&quot; width=&quot;250&quot; height=&quot;298&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;&lt;code&gt;lens correction&lt;&#x2F;code&gt; を有効にすると、Lensfunデータベースを参照して歪曲と周辺減光を自動補正します。GRの単焦点にもわずかな樽型の歪曲と周辺減光があり、これをまず取り除いておきます。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;6月12日時点では、Lensfunの公式データベースにRICOH GR IV Monochromeはまだ登録されていません。ただしGR IV(カラー機)は登録済みで、Monochromeのレンズ(光学系)はGR IVとまったく同じです。違いはセンサー前のカラーフィルターの有無だけなので、補正すべき歪曲・周辺減光のデータは共通して使えます。&lt;&#x2F;p&gt;
&lt;p&gt;問題は、MonochromeがEXIFに記録するカメラ名がGR IVとは別の文字列で、公式データベースのGR IVエントリに自動マッチしないことだけです。そこで、ユーザー領域のLensfunデータベースにMonochrome用のカメラ定義を1つだけ追加し、マウントをGR IVと同じ &lt;code&gt;ricohGRIV&lt;&#x2F;code&gt; にして既存のレンズ補正データを流用します。&lt;&#x2F;p&gt;
&lt;p&gt;darktableは &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;lensfun&#x2F;&lt;&#x2F;code&gt; 配下に置いたXMLを読み込みます。ここは公式データベースの更新では上書きされない領域です。次のファイルを置きます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot; data-name=&quot;ricoh-gr-iv-monochrome.xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;lensdatabase&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; version&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;camera&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;maker&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Ricoh Imaging Company, Ltd.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;maker&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;maker&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; lang&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;en&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Ricoh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;maker&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;model&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Ricoh GR IV Monochrome&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;model&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;model&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; lang&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;en&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;GR IV Monochrome&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;model&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;mount&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;ricohGRIV&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;mount&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;cropfactor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;1.53&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;cropfactor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;camera&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;lensdatabase&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;model&amp;gt;&lt;&#x2F;code&gt; は実機がEXIFに書き込むモデル名と一致させる必要があります。手元の値は &lt;code&gt;exiftool&lt;&#x2F;code&gt; で確認できます。darktableを再起動すると、スクリーンショットのようにcamera欄へ「Ricoh, GR IV Monochrome」が現れ、lens欄にはGR IVの固定レンズ補正がそのまま当たります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exposure&quot;&gt;exposure&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;exposure.webp?h=fd7c384738c3b196d9af&quot;
      alt=&quot;darktableのexposureモジュール&quot; width=&quot;256&quot; height=&quot;201&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;scene-referredワークフローの起点です。前述のとおり、ここでは主要被写体の中間調が適正になるよう露出だけを決め、白飛びや黒つぶれは気にしません。スライダーを動かして、見せたい部分の明るさを合わせます。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;sigmoid&quot;&gt;sigmoid&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;sigmoid.webp?h=db2ce45fc3b8448c9066&quot;
      alt=&quot;darktableのsigmoidモジュール&quot; width=&quot;252&quot; height=&quot;583&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;scene-referredな広いダイナミックレンジを、モニタが表示できる範囲へ圧縮するトーンマッピングです。darktableではfilmic rgbやagxと同じ役割を担い、&lt;code&gt;sigmoid&lt;&#x2F;code&gt; はそのなかでも素直に効きます。基本はcontrastで圧縮の強さを、skewでシャドウ側とハイライト側のどちらを持ち上げるかを決めるだけです。モノクロではprimaries(色の扱い)の各パラメータは結果に影響しないので、触る必要はありません。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;denoise_(profiled)&quot;&gt;denoise (profiled)&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;denoise.webp?h=c6328463a558aa0364cf&quot;
      alt=&quot;darktableのdenoise (profiled) モジュール&quot; width=&quot;256&quot; height=&quot;480&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;高感度で撮った暗所のカットなどで、輝度ノイズのザラつきが気になるなら使います。&lt;&#x2F;p&gt;
&lt;p&gt;センサーごとに測定されたノイズの統計プロファイルを参照してノイズを除去するモジュールです。モノクロは輝度ノイズがそのまま見えるぶん、ザラつきが目立ちやすいので、気になるカットで抑えます。低感度で破綻がなければ飛ばして構いません。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;rotate_and_perspective&quot;&gt;rotate and perspective&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;rotate.webp?h=eb323d7a39ed70f7a0ba&quot;
      alt=&quot;darktableのrotate and perspectiveモジュール&quot; width=&quot;258&quot; height=&quot;152&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;水平が傾いてしまったカットや、建築物の垂直を立て直したいときに使います。GRはノーファインダー撮影が多く、水平も傾きやすいカメラです。&lt;&#x2F;p&gt;
&lt;p&gt;rotationスライダーで角度を調整するか、画像上で水平にしたい線をドラッグして指定すると、その線が水平(または垂直)になるよう自動で回転します。パースの崩れを直したいときは、隠れているlens shiftやshearのコントロールも使えますが、スナップ中心の用途なら水平出しだけで十分です。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;retouch&quot;&gt;retouch&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;retouch.webp?h=ec2728a57881e7d84e54&quot;
      alt=&quot;darktableのretouchモジュール&quot; width=&quot;253&quot; height=&quot;285&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;センサーのゴミや、写り込んだ不要物が目立つときに使います。&lt;&#x2F;p&gt;
&lt;p&gt;ヒーリングやクローンで対象を周囲になじませて消すモジュールです。モノクロは小さなゴミも意外と目立つので、気になるときだけ使い、なければ飛ばします。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;tone_equalizer&quot;&gt;tone equalizer&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;tone-equalizer.webp?h=69da24bdfa31f0aacbdc&quot;
      alt=&quot;darktableのtone equalizerモジュール&quot; width=&quot;252&quot; height=&quot;422&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;特定の明るさ帯だけを覆い焼き・焼き込みしたいときに使います。たとえばシャドウだけ持ち上げたいが全体は明るくしたくない、といった局所的な明暗調整に向きます。&lt;&#x2F;p&gt;
&lt;p&gt;露出帯(-8EV〜0EV)ごとに明るさを持ち上げ・押し下げでき、全体ではなく狙った帯だけに局所コントラストを足せます。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;diffuse_or_sharpen&quot;&gt;diffuse or sharpen&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;diffuse-or-sharpen.webp?h=022587df922850e88baf&quot;
      alt=&quot;darktableのdiffuse or sharpenモジュール&quot; width=&quot;249&quot; height=&quot;689&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;仕上げに解像感を一段上げたいときに使うシャープ化モジュールです。&lt;&#x2F;p&gt;
&lt;p&gt;偏微分方程式ベースで、プリセット(sharpen demosaicingなど)から選ぶと扱いやすくなります。軽く整える程度なら、旧来の &lt;code&gt;sharpen&lt;&#x2F;code&gt; モジュールでも十分です。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;crop&quot;&gt;crop&lt;&#x2F;h3&gt;
&lt;div class=&quot;module&quot;&gt;
  &lt;div class=&quot;module-image&quot;&gt;
    &lt;img
      src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;darktable&amp;#x2F;crop.webp?h=04787ffd1a5ab4fab02f&quot;
      alt=&quot;darktableのcropモジュール&quot; width=&quot;252&quot; height=&quot;258&quot;
      loading=&quot;lazy&quot;
    &#x2F;&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;module-body&quot;&gt;

&lt;p&gt;周辺の不要な部分を切り落として構図を整えたいときに使います。&lt;&#x2F;p&gt;
&lt;p&gt;darktableは露出やトーンの調整を画面全体に対して効かせるので、トリミングは仕上げの段階に回します。アスペクト比は自由(freehand)のまま、不要な周辺を切り落として構図を決めます。&lt;&#x2F;p&gt;


  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;. darktable公式ユーザーマニュアル&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;overview&#x2F;workflow&#x2F;process&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;.「the pixelpipe and module order」scene-referredワークフローと処理の流れ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;module-reference&#x2F;processing-modules&#x2F;lens-correction&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;.「lens correction」モジュール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;module-reference&#x2F;processing-modules&#x2F;rotate-perspective&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;.「rotate and perspective」モジュール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;module-reference&#x2F;processing-modules&#x2F;crop&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;.「crop」モジュール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.darktable.org&#x2F;usermanual&#x2F;development&#x2F;en&#x2F;module-reference&#x2F;processing-modules&#x2F;sigmoid&#x2F;&quot;&gt;darktable user manual&lt;&#x2F;a&gt;.「sigmoid」モジュール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lensfun.github.io&#x2F;&quot;&gt;Lensfun&lt;&#x2F;a&gt;. レンズ補正データベースのプロジェクトサイト(&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lensfun&#x2F;lensfun&quot;&gt;GitHub リポジトリ&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;discuss.pixls.us&#x2F;t&#x2F;darktable-4-8-location-of-lensfun-database-for-personal-use&#x2F;44682&quot;&gt;discuss.pixls.us&lt;&#x2F;a&gt;.「darktable 4.8 location of lensfun database for personal use」ユーザー領域へのLensfunデータ追加方法&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">RAW 現像に、無料でありながら高機能な darktable を選びました。RICOH GR IV Monochrome を手にしたのがきっかけです。とっつきにくいツールですが、その核心は scene-referred ワークフローにあります。本稿では、この考え方に沿ってモノクロ写真をどう現像していくのかを、実際の操作画面とともに、本当に使うモジュールだけに絞って解説します。
</summary>
        </entry><entry xml:lang="en">
        <title>&quot;Tropic Birds&quot; — A Tribute to the Guitarist the World Rediscovered</title>
        <published>2026-06-10T14:23:57+09:00</published>
        <updated>2026-06-10T14:23:57+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/tropic-birds/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/tropic-birds/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;tropic-birds&amp;#x2F;cover.webp?h=db87a7b10756c94805ab&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;674&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;Just the other day I attended the &lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;05&#x2F;takanaka&#x2F;&quot;&gt;triumphant homecoming concert&lt;&#x2F;a&gt; of Masayoshi Takanaka&#x27;s world tour, and then yesterday he was featured on NHK&#x27;s &quot;Close-up Gendai&quot; program.&lt;&#x2F;p&gt;
&lt;p&gt;Music Takanaka released 50 years ago is being rediscovered around the world today, as streaming services globalize the music market and social media continues to amplify his reach. The world tour that began last year has been a tremendous success at every stop, and was covered by NHK News just yesterday.&lt;&#x2F;p&gt;
&lt;p&gt;One thing he said in the program stays with me:
&quot;I thought my life was just going to fade out quietly — and then something this wonderful happens.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;I was deeply moved by the sight of one musician connecting with audiences across half a century through the power of technological change.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2336536733&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;tropic-birds&quot; title=&quot;Tropic Birds (Masayoshi Takanaka Live Ver. Cover)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Tropic Birds (Masayoshi Takanaka Live Ver. Cover)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;As a tribute, I covered &quot;TROPIC BIRDS&quot; — the live version, not the album version. My memory is hazy and I&#x27;ve blended a few different versions together. I played it on the &lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;yamaha-sg-175&#x2F;&quot;&gt;YAMAHA SG-175&lt;&#x2F;a&gt; I picked up the other day.&lt;&#x2F;p&gt;
&lt;p&gt;If I could get even a little close to the soaring, tropical heat of the guitar in this song — played on the world tour that set audiences ablaze everywhere — I&#x27;d be happy.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s to the success of the world tour.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;日本語版&lt;&#x2F;summary&gt;
&lt;p&gt;先日も高中正義さんのワールドツアーの&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;05&#x2F;takanaka&#x2F;&quot;&gt;凱旋コンサート&lt;&#x2F;a&gt;に見てきたばかりですが、昨日、NHKの『クローズアップ現代』という番組で、彼が取り上げられていました。&lt;&#x2F;p&gt;
&lt;p&gt;50年前にリリースされた高中正義さんの楽曲が、配信サービスによって音楽市場がグローバル化しSNSで更に人気が波及していく現代、いま世界中で彼の昔の音楽が再発見されています。
昨年からのワールドツアーは各地で大成功を収め、昨日NHKのニュースでも取り上げられました。&lt;&#x2F;p&gt;
&lt;p&gt;その中で高中さんの語った言葉が忘れられません。
「このままフェードアウトしていく人生だと思っていたのに、こんな素晴らしいことがある」&lt;&#x2F;p&gt;
&lt;p&gt;ひとりの音楽家が技術革新で半世紀を超えて世界の聴衆とつながる——その姿に心を打たれました。&lt;&#x2F;p&gt;
&lt;p&gt;敬意を込めて『TROPIC BIRDS』をカバーしました。
原曲のアルバム版ではなく、ライブ版です。うる憶えでいくつかのバージョンがごっちゃになっています。演奏には先日手に入れた&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;06&#x2F;yamaha-sg-175&#x2F;&quot;&gt;YAMAHA SG-175&lt;&#x2F;a&gt;を使いました。&lt;&#x2F;p&gt;
&lt;p&gt;世界中を沸かせたワールドツアーでも演奏されたこの曲の伸びやかで南国的なギターの熱量に、少しでも近づけたら。&lt;&#x2F;p&gt;
&lt;p&gt;世界ツアーの成功を祝して。&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
</content>
        <summary type="html">NHK『クローズアップ現代』が伝えた、半世紀を経て世界に再発見された高中正義。番組で語った「このままフェードアウトしていく人生だと思っていた」の一言に胸を打たれ、敬意を込めてYAMAHA SG-175で『TROPIC BIRDS』をカバーしました。
</summary>
        </entry><entry xml:lang="en">
        <title>Macバックアップ戦略・改訂版</title>
        <published>2026-06-09T13:37:30+09:00</published>
        <updated>2026-06-09T13:37:30+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/mac-backup/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/mac-backup/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;mac-backup&amp;#x2F;cover.webp?h=e1641700571b6a83b0d5&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;長らくMacのバックアップにはSuperDuperを使い、Bootableなクローンを作ってきました。その方針は、以前&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2025&#x2F;04&#x2F;backup-strategy-for-mac&#x2F;&quot;&gt;Apple Silicon時代のMacバックアップ最新戦略&lt;&#x2F;a&gt;で整理したとおりです。ですが新しいmacOSへの対応がなかなか進まず、Tahoeに至っては一年あまり経った今も正式版すら出ません。そこでSuperDuperを諦め、rsyncでホームディレクトリを鏡像コピーする方式に切り替えました。この記事はその続編であり、乗り換えの理由と設定方法をまとめたものです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜTime_Machineが嫌いか&quot;&gt;なぜTime Machineが嫌いか&lt;&#x2F;h2&gt;
&lt;p&gt;バックアップの話をすると、まずTime Machineを勧められます。ですが私は、ごく初期に使ったきり、その後はすっかり避けるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;もともとは、Bootableなクローンを作れるサードパーティツールを使っていたからです。
Bootableなクローンが作れれば、ディスクが壊れた際にはクローンからmacOSを起動して復旧できます。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、現在ではBootableなクローンを技術的に作成できなくなりました(後述)。
それでも、Time Machineには不信感が根強く、直感が先に拒否します。その裏には技術的な理由が3つあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不確実性&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Time Machineはバックアップ先を専用のアーカイブ(sparsebundle)として抱え込む。中で何が起きているかは見えず、壊れていても警告は出ない。実際、復元しようとしたらアーカイブが読めず、修復もできず、履歴を全部捨てて最初からやり直すしかなかったという報告は後を絶たない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;破損に弱い&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;sparsebundleは中身を多数の小さなバンドファイルに分け、その内側に1つのファイルシステムを抱える構造になっている。個々のファイルを直接取り出すことはできず、必ずイメージ全体をマウントして読む。だからバンドや内部の目次(カタログ)が一部でも壊れると、イメージごとマウント不能になり、世代を問わず全データに手が届かなくなる。世代を積み上げる構造だけに、過去のバックアップまでまとめて道連れになりやすい。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ブラックボックス&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;何がどうコピーされ、どう積み上げられているのか、仕組みそのものがユーザーからは見えない。バックアップ先を開いても何がどう入っているか分からず、「このファイルが今そこにある」とFinderで素朴に確かめることもできない。中で何が行われているか把握できないものに大事なデータを預けるのは、技術者としてどうにも信用しきれない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私が欲しいのはその逆です。バックアップ先を開けば、コピー元とそっくり同じ構造でファイルがそのまま並んでいて、いざというとき個別のファイルをドラッグで取り出せる。履歴はいりません。今この瞬間の鏡像が1つあれば十分です。見えて、触れて、そのまま取り出せること。Time Machineはこの要求に対して、仕組みからして向いていません。&lt;&#x2F;p&gt;
&lt;p&gt;そのため、私は丸ごとBootableなディスククローンを作成できるサードパーティ製のツールを利用してきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;macOSの変化で、bootableクローンが封じられた&quot;&gt;macOSの変化で、bootableクローンが封じられた&lt;&#x2F;h2&gt;
&lt;p&gt;ところが、ここ数年のmacOSの変化で、その前提が崩れました。サードパーティ製ツールによるBootableなクローンが、事実上できなくなったのです。経緯を追うと、じわじわと封じられてきたことが分かります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Big Surでシステムとデータが分離&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;起動ディスクが、OSの入った読み取り専用のシステムボリュームと、ユーザーデータのデータボリュームに完全分離された。システム側は改ざん防止のため署名・封印され、サードパーティ製アプリが直接コピーできなくなった。OSを複製する役目はApple自身の仕組み(レプリケーター)に移り、それが動き続けるかどうかもApple次第になった。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Sequoia 15.2が決定打&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Appleがそのレプリケーターを壊し、SuperDuperはBootableなバックアップを作れなくなった。データ複製の終盤、PrebootやRecoveryをコピーするあたりで失敗する。これはツール側のバグではなく、Apple側の問題だと開発元が明言している。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Tahoeでは正式対応すら出せず&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;互換性の壁がさらに増え、SuperDuperは正式版を出せていない。Tahoe対応は暫定ベータ(v3.20系)でしのぐ状態が続いている。一時はベータでの改善に期待もしたが、一年あまり経ってもベータのまま。起動可能クローンへの望みは、もう捨てた。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;要点を取り違えないことが大事です。壊れたのはBootableなシステム丸ごとクローンであって、ホーム(データ)のコピーが禁じられたわけではありません。Appleが封じたのはシステムボリュームの複製で、ユーザーのデータをコピーすること自体は今も普通にできます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今日のmacOSでのバックアップ戦略&quot;&gt;今日のmacOSでのバックアップ戦略&lt;&#x2F;h2&gt;
&lt;p&gt;ここで要件が変わります。&lt;&#x2F;p&gt;
&lt;p&gt;Bootableにできないのなら、システムボリュームまで丸ごとコピーする意味はもうありません。bootableという目的が消えた以上、「全部コピーする」根拠も一緒に消えました。残ったのは、自分のデータだけを守れればいい、という縮退した要求です。&lt;&#x2F;p&gt;
&lt;p&gt;つまり「ホームディレクトリだけでいい」は、最初からそう思っていたわけではありません。bootableを失った結果として、そこまで切り詰めた制約の上に成り立っています。この経緯を踏まえると、要件は次のように整理できます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;バックアップ対象はホームディレクトリのみ。システムは諦める。&lt;&#x2F;li&gt;
&lt;li&gt;アプリが&lt;code&gt;~&#x2F;Library&lt;&#x2F;code&gt;配下などに書く、ユーザーが関知しないデータも要らない。多くは再生成されるので、守る価値がない。&lt;&#x2F;li&gt;
&lt;li&gt;差分でいい。変わっていないファイルは書き換えず、変わったぶんだけ転送する。&lt;&#x2F;li&gt;
&lt;li&gt;世代管理はいらない。常にコピー元と同じ、今この瞬間の鏡像が1つあればいい。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;rsyncのメリット&quot;&gt;rsyncのメリット&lt;&#x2F;h2&gt;
&lt;p&gt;この縮退した要件に、rsyncはきれいに合います。&lt;&#x2F;p&gt;
&lt;p&gt;第一に、差分転送が本職です。rsyncは初期状態で、サイズと更新日時を見て一致するファイルをまるごとスキップします。変わっていないファイルは触らず、変わったぶんだけ送ります。「変更ないファイルは書き換えたくない」という要求が、特別な設定なしにそのまま満たされます。&lt;&#x2F;p&gt;
&lt;p&gt;第二に、コピー先がただのファイルになります。バックアップ先は元と同じフォルダ階層がそのまま並ぶので、Finderで全部見えますし、個別ファイルをドラッグで取り出せます。Time Machineの抽象化とは正反対の、見える鏡像が手に入ります。&lt;&#x2F;p&gt;
&lt;p&gt;第三に、世代を持たない運用ができます。&lt;code&gt;--delete&lt;&#x2F;code&gt;を付ければ、コピー元で消したものはバックアップ先からも消え、常に最新の一枚の鏡像が保たれます。履歴の束は作られません。&lt;&#x2F;p&gt;
&lt;p&gt;第四に、無料で、スクリプトに組めて、スケジュール実行まで自前で完結します。専用アプリのライセンスや、OSの更新に追従できないツールの都合で振り回されることもありません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;標準のrsyncは使わない&lt;&#x2F;strong&gt;
        &lt;p&gt;Sequoia&#x2F;Tahoe標準のrsyncは&lt;code&gt;openrsync&lt;&#x2F;code&gt;という別実装で、出来がよくありません。&lt;code&gt;-a&lt;&#x2F;code&gt;で特殊ファイルに当たると止まる、拡張属性でクラッシュするといった報告があります。標準のものは避け、Homebrewで本家のrsync(3.x系)を入れて使いましょう。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;準備&quot;&gt;準備&lt;&#x2F;h2&gt;
&lt;p&gt;まずHomebrewで本家rsyncを入れます。TahoeはApple Silicon専用なので、入れると&lt;code&gt;&#x2F;opt&#x2F;homebrew&#x2F;bin&#x2F;rsync&lt;&#x2F;code&gt;に置かれます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;brew install rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;もう1つ、フルディスクアクセスの設定が要ります。最近のmacOSでは、これが無いとホーム内の保護領域(メールなど)が読めず、警告も出さずに黙って飛ばされます。手で動作確認するときは使っているターミナルを、自動実行するときは後述のスクリプトを、システム設定のプライバシーとセキュリティ → フルディスクアクセスに追加しておきます。これを怠ると「バックアップしたつもりで一部入っていない」が起きます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;コマンドと除外設計&quot;&gt;コマンドと除外設計&lt;&#x2F;h2&gt;
&lt;p&gt;バックアップ本体は、次の一本にまとめます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;~&#x2F;bin&#x2F;backup-home.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;DEST&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;Volumes&#x2F;Backup&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;LOG&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;Library&#x2F;Logs&#x2F;backup-home.log&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; &#x2F;sbin&#x2F;mount&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -q &amp;quot;on &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DEST&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt; $DEST&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; not mounted, skipped&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;  exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;opt&#x2F;homebrew&#x2F;bin&#x2F;rsync&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -aE --delete --info=progress2&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;&#x2F;Library&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;.Trash&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;quot;.cache&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;tmp&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;.DS_Store&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;&#x2F;pCloud Drive&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --exclude=&amp;#39;&#x2F;.pcloud&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DEST&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;home&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; 2&amp;gt;&amp;amp;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; done&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;先頭の&lt;code&gt;if ! &#x2F;sbin&#x2F;mount ...&lt;&#x2F;code&gt;は、バックアップ先が未マウントのときに内蔵ディスクへ誤って書き込む事故を防ぐガードです。&lt;code&gt;-a&lt;&#x2F;code&gt;は権限・更新日時・シンボリックリンクなどを保ったまま再帰コピーし、&lt;code&gt;-E&lt;&#x2F;code&gt;はmacOSの拡張属性を保持します。&lt;code&gt;--delete&lt;&#x2F;code&gt;でコピー元から消したものをバックアップ先からも消し、常に鏡像に保ちます。&lt;code&gt;--info=progress2&lt;&#x2F;code&gt;は全体の総進捗を一行で表示します。&lt;code&gt;$HOME&#x2F;&lt;&#x2F;code&gt;の末尾スラッシュは「ホームの中身を」コピーする指定で、これが無いとhome自体が一段深く入れ子になります。&lt;&#x2F;p&gt;
&lt;p&gt;除外設計が実は一番の勘どころになります。詰まりの原因はほぼここに集約されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.Trash&lt;&#x2F;code&gt;はゴミ箱、&lt;code&gt;.cache&lt;&#x2F;code&gt;や&lt;code&gt;tmp&lt;&#x2F;code&gt;は再生成される一時データ、&lt;code&gt;.DS_Store&lt;&#x2F;code&gt;はFinderの表示情報。どれもバックアップする価値がない。&lt;&#x2F;li&gt;
&lt;li&gt;クラウドや外部接続の仮想ドライブも必ず外す。ローカルに実体がなく、rsyncが舐めるとオンデマンドのダウンロードを次々誘発し、激遅やタイムアウト、最悪はクラウド上の全データの引きずり下ろしを招く。iCloud DriveやDropbox、OneDrive、Google Driveは&lt;code&gt;Library&#x2F;CloudStorage&lt;&#x2F;code&gt;や&lt;code&gt;Library&#x2F;Mobile Documents&lt;&#x2F;code&gt;にあるので、&lt;code&gt;&#x2F;Library&#x2F;&lt;&#x2F;code&gt;を外せば一緒に消える。&lt;code&gt;pCloud Drive&lt;&#x2F;code&gt;のようにホーム直下へマウントされるものだけ、個別に除外する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;Library&lt;&#x2F;code&gt;配下をどこまで残すかは判断が要ります。大半はアプリが再生成する状態ファイルなので、丸ごと&lt;code&gt;--exclude=&#x27;Library&#x2F;&#x27;&lt;&#x2F;code&gt;で外しても困らない人は多いでしょう。ただしローカルにしか実体のないデータ(ローカル保存のメールなど)がある場合は、その特定フォルダだけ残す配慮がいります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自動化&quot;&gt;自動化&lt;&#x2F;h2&gt;
&lt;p&gt;週1回の自動実行は、非推奨のcronではなくlaunchdで組みます。さきほどの&lt;code&gt;~&#x2F;bin&#x2F;backup-home.sh&lt;&#x2F;code&gt;に実行権を付けます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;chmod +x ~&#x2F;bin&#x2F;backup-home.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;次に&lt;code&gt;~&#x2F;Library&#x2F;LaunchAgents&#x2F;com.user.backup-home.plist&lt;&#x2F;code&gt;を作ります。毎週日曜の午前3時に走る例です(Weekdayの0が日曜)。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot; data-name=&quot;~&#x2F;Library&#x2F;LaunchAgents&#x2F;com.user.backup-home.plist&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;xml&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; version&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; encoding&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;?&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-keyword z-other z-doctype&quot;&gt;&amp;lt;!DOCTYPE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; plist PUBLIC &amp;quot;-&#x2F;&#x2F;Apple&#x2F;&#x2F;DTD PLIST 1.0&#x2F;&#x2F;EN&amp;quot; &amp;quot;http:&#x2F;&#x2F;www.apple.com&#x2F;DTDs&#x2F;PropertyList-1.0.dtd&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; version&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;com.user.backup-home&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;ProgramArguments&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;&#x2F;Users&#x2F;ユーザ名&#x2F;bin&#x2F;backup-home.sh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;StartCalendarInterval&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Weekday&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Hour&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;Minute&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;登録します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;launchctl bootstrap gui&#x2F;$(id -u) ~&#x2F;Library&#x2F;LaunchAgents&#x2F;com.user.backup-home.plist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;launchdの利点は、指定時刻にMacが起動していなくても、次に起動したときに取りこぼしを拾って実行してくれる点です。cronのように「その時刻に寝ていたら丸ごと飛ぶ」ということがありません。複数回ぶんが溜まっても、起動時に走るのは1回にまとめられます。週一の用途なら、これで実用上困りません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;つまずきどころ&quot;&gt;つまずきどころ&lt;&#x2F;h2&gt;
&lt;p&gt;実際に動かすと、たいてい最初の数回はここで引っかかります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;初回はホーム全体のフルコピーなので、容量とドライブ速度によっては数時間かかる。差分で速くなるのは2回目以降。止まっているのか遅いだけなのかは、&lt;code&gt;du -sk &#x2F;Volumes&#x2F;Backup&#x2F;home&lt;&#x2F;code&gt;を時間を空けて2回打ち、数字が増えているかで判別する。&lt;&#x2F;li&gt;
&lt;li&gt;異常に遅い・止まる場合は、まず標準の&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;rsync&lt;&#x2F;code&gt;(openrsync)を叩いていないか&lt;code&gt;which rsync&lt;&#x2F;code&gt;で確認する。そして上のクラウド系の除外が効いているかを見る。GoProなどをMTP接続してマウントしている場合、それも&lt;code&gt;Library&#x2F;CloudStorage&lt;&#x2F;code&gt;に入り込んでタイムアウトの山を作るので、除外で一掃される。&lt;&#x2F;li&gt;
&lt;li&gt;Permission Deniedが出ても、rsyncはそのファイルを飛ばして続行する。多くはフルディスクアクセス不足か、root所有の触れないファイルだ。前者は設定で解決し、後者は無視してよいが、拒否されたのが自分の大事なデータでないかだけは確認する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;この構成にも、諦めた点はあります。起動可能なクローンではないので、ディスクが飛んだら、まずmacOSを入れ直し、それからホームを書き戻す手間が残ります。アプリの再インストールも要ります。「つなげば即座に元通り」とはいきません。そこは割り切りです。&lt;&#x2F;p&gt;
&lt;p&gt;それでも私は、こちらを選びました。中身が見えて、いざとなれば一ファイルから引き出せて、仕組みを丸ごと自分の手で握れる。バックアップに一番ほしいのは、派手な復旧速度ではなく、この「見えている」という安心でした。OSやアプリの都合に振り回されないかぎり、この鏡像は週末ごとに静かに更新され続けてくれます。それだけで、私には十分です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">長年使ってきた起動可能クローンが、macOSの変化でついに作れなくなりました。SuperDuperを手放し、信用しきれないTime Machineにも戻りたくない。残された道はどこにあるのか。見えて、触れて、そのまま取り出せるバックアップを求めて、rsyncによる鏡像コピーへたどり着くまでの記録です。
</summary>
        </entry><entry xml:lang="en">
        <title>三菱UFJ銀行のPPAP廃止は、半歩前進で半歩後退</title>
        <published>2026-06-08T00:00:00+00:00</published>
        <updated>2026-06-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/mufg-ppap/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/mufg-ppap/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;mufg-ppap&amp;#x2F;cover.webp?h=027a043bdcc9bd7b745e&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;三菱UFJ銀行が2026年6月8日付で「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bk.mufg.jp&#x2F;info&#x2F;pdf&#x2F;20260608_send_attachments.pdf&quot;&gt;当行からの添付ファイル送信方法の変更に関するご案内&lt;&#x2F;a&gt;」を公表しました。
日本を代表するメガバンクがまだPPAPやっていたと衝撃を受けました。
内容を読んで考えさせられたので記録しておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;三菱UFJ銀行のアナウンス&quot;&gt;三菱UFJ銀行のアナウンス&lt;&#x2F;h2&gt;
&lt;p&gt;要点はシンプルです。&lt;&#x2F;p&gt;
&lt;p&gt;同行は、お客さま側のセキュリティを確保するため、パスワード付き添付ファイルのメール送信を原則取り止めると発表しました。
2026年7月18日より順次、添付ファイルを送る際は専用のダウンロードサイトを利用する方式へ変更されます。&lt;&#x2F;p&gt;
&lt;p&gt;理由として挙げられているのは次の2点です。
これまでの「メールでパスワード付きZIPファイルを送り、パスワードを別送する方法」、いわゆる &lt;strong&gt;PPAP&lt;&#x2F;strong&gt; は、ファイルが暗号化されているためメール受信時のマルウェアチェックが困難であること。
そして近年、パスワード付きZIPファイルを悪用したサイバー攻撃の事例が確認されていることです。&lt;&#x2F;p&gt;
&lt;p&gt;新方式では、同行の役職員が添付ファイルを送る際、メール本文に専用ダウンロードサイトへアクセスするためのURLを記載します。
受け手はそのサイトにアクセスし、別送されるダウンロード専用のパスワードを使ってファイルを取得します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;PPAPの何が問題だったのか&quot;&gt;PPAPの何が問題だったのか&lt;&#x2F;h2&gt;
&lt;p&gt;PPAPの是非については、昨年「&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;06&#x2F;aws-sns&#x2F;&quot;&gt;AWSからSMSにメッセージを送る&lt;&#x2F;a&gt;」という記事で一度整理しました。&lt;&#x2F;p&gt;
&lt;p&gt;そのとき、機密文書をメールで送る手段を秘匿性と本人確認性の観点で並べて評価したのですが、結論は変わっていません。&lt;&#x2F;p&gt;
&lt;p&gt;PPAP、つまり暗号化ファイルとパスワードを同じ経路で送る方法は、1通盗まれればすべて漏洩します。
パスワードを別メールにしても、同じメールインフラを流れる以上、傍受や誤送信のリスクは本質的には下がりません。
加えて、暗号化されたZIPはメールゲートウェイでウイルススキャンできないため、マルウェアの運び屋になりやすい。
三菱UFJ銀行が今回理由として挙げているのは、まさにこの最後の点です。&lt;&#x2F;p&gt;
&lt;p&gt;ですから、PPAPをやめるという判断そのものは正しいと思います。
日本でも2020年に政府がPPAPの廃止方針を打ち出して以降の流れに沿っていますし、銀行という立場で旗を振る意味も小さくありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;新方式は本当に安全になったのか&quot;&gt;新方式は本当に安全になったのか&lt;&#x2F;h2&gt;
&lt;p&gt;問題は、その置き換え先です。&lt;&#x2F;p&gt;
&lt;p&gt;新方式は「メール本文にダウンロードサイトのURLを記載し、パスワードは別送する」というものでした。
マルウェアスキャンの観点では確かに前進しています。
ファイルが暗号化ZIPとしてメールに乗らなくなるので、受信側のゲートウェイで中身を検査できるようになるからです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、フィッシング耐性という観点では、むしろ後退しかねません。&lt;&#x2F;p&gt;
&lt;p&gt;ひとつは、銀行が自ら「メール本文のURLをクリックさせる」習慣を送信先に植え付けてしまう点です。
銀行はこれまでフィッシング対策として、「当行からのメールにURLは記載しません」「メール内のリンクは開かないでください」と顧客には教育してきたはずです。
メールの送信先は顧客ではないと思いますが、今回はその逆を習慣づけることになります。
なりすましメールに偽のダウンロードURLが貼られていても、利用者は見分けがつかなくなります。&lt;&#x2F;p&gt;
&lt;p&gt;もうひとつは、「パスワードを別送する」という発想がPPAPのままという点です。
日ごろ支援しているコンサルテーション会社やITベンダーはちゃんと技術的に支援できなかったんでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;URLとパスワードを両方メールで送るのであれば、構造的にはPPAPの暗号化ZIPをWebサイトに置き換えただけです。
同じ経路を流れる以上、傍受や誤送信による漏洩リスクは解決していません。
マルウェアの問題は片付いても、秘匿性の問題は手つかずなのです。&lt;&#x2F;p&gt;
&lt;p&gt;整理すると、今回の変更は「マルウェアスキャン」という一点ではマシになる一方で、フィッシング耐性では弱点を抱え込む、惜しい設計だと感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;本来あるべき姿&quot;&gt;本来あるべき姿&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;06&#x2F;aws-sns&quot;&gt;以前の記事&lt;&#x2F;a&gt;でも書きましたが、
現実的なのは認証付きのクラウドストレージで共有する方法でした。
受け手がログインして初めてファイルにアクセスできる仕組みなら、URLが単体で漏れても無効ですし、誰がいつアクセスしたかのログも残せます。
パスワードを別送する必要すらありません。&lt;&#x2F;p&gt;
&lt;p&gt;メールの送付先は取引業者だと思いますから、銀行が共通の認証を払い出すのは困難です。
たとえばBoxやDropboxのようなクラウドストレージであれば、受け手は無料のアカウントを気軽に作れます。
銀行側が取引先ごとにアカウントを発行・運用しなくても、受け手がログインして初めてファイルにアクセスできる仕組みを成り立たせられるわけです。
URLが単体で漏れても無効ですし、誰がいつアクセスしたかのログも残ります。&lt;&#x2F;p&gt;
&lt;p&gt;さらに言えば、この方式ならメールにリンクを書く必要すらありません。
ファイルを共有すれば、受け手にはクラウドストレージ側から「共有されました」という通知が届きます。
受け手は自分が信頼しているサービスにログインしてファイルを取りに行くだけです。
冒頭で挙げた、メール内URLをクリックさせる習慣づけという問題が、根本から消えてなくなるのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;より根本的な解はないのか&quot;&gt;より根本的な解はないのか&lt;&#x2F;h2&gt;
&lt;p&gt;もっとも、銀行ともあろうものがファイルの受け渡しを外部のクラウドサービスに丸ごと預けるのも、それはそれで引っかかります。
委託先管理やデータの所在、サービスへの従属といった問題が新たに生じるからです。
だとすれば、現実的な落としどころは、銀行が認証付きの受け渡しポータルを自前で持つことでしょう。
インターネットバンキングという認証基盤と運用ノウハウをすでに備え、取引先の本人確認も日常的に行っている組織です。
Boxがやっていることを内製すればよいだけです。技術力と体力の両面で、銀行はそれができる立場にあります。&lt;&#x2F;p&gt;
&lt;p&gt;では、もっと教科書的な根本解はないのか。
あります。受け手の証明書でメールそのものを暗号化・署名するS&#x2F;MIME、いわゆるPKIです。
外部サービスやポータル、パスワードの別送といった仕組みが一切要らず、本人性と秘匿性をエンドツーエンドで担保できる、理屈のうえでは最も美しい解です。&lt;&#x2F;p&gt;
&lt;p&gt;ところがPKIは、米国ですら普及しませんでした。
証明書の発行や管理が高コストで手作業が多く、ユーザーごと・端末ごとに鍵を入れて回る運用負荷に耐えられなかったためです。
そして決定的なのは、&lt;strong&gt;送り手と受け手の双方が対応していないと成り立たない&lt;&#x2F;strong&gt;という両側依存です。
暗号化して送るには、相手があらかじめ証明書を用意していなければなりません。
相手が対応していなければ、文字どおり意味がない。
この鶏と卵の構造ゆえに、誰も最初の一歩を踏み出せませんでした。
受け手に「アカウントを作ってログインする」という自己完結した操作しか求めないポータル方式に世界が流れたのは、そのためです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;それでもリーダーシップを期待したかった&quot;&gt;それでもリーダーシップを期待したかった&lt;&#x2F;h2&gt;
&lt;p&gt;ここで私が惜しいと思うのは、まさにこの一点です。
PKIが普及しなかった最大の理由が「最初の一歩を誰も踏み出せなかった」ことなら、その一歩を踏み出せる体力と影響力を持つ組織こそ、日本を代表するメガバンクのはずです。&lt;&#x2F;p&gt;
&lt;p&gt;率先してS&#x2F;MIMEを導入し、添付ファイルをやり取りするような主要な取引先には導入を促す。
場合によっては証明書発行の基盤を貸し出したり、運用を支援したりする。
そうやって両側依存の壁を、影響力のある側から崩していく。
そんなリーダーシップを見せてくれたら、日本全体のメール文化が一段前に進んだかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;現実的な着地は認証付きポータルでよいと思います。
ただ、PPAPをやめるという入口が正しかっただけに、出口がもう一歩踏み込めなかったのは惜しい。
日本をリードする銀行のやることだからこそ、ここにこそリーダーシップを期待したかった、というのが私の正直な感想です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bk.mufg.jp&#x2F;info&#x2F;pdf&#x2F;20260608_send_attachments.pdf&quot;&gt;株式会社三菱UFJ銀行&lt;&#x2F;a&gt;. 「当行からの添付ファイル送信方法の変更に関するご案内」（2026年6月8日）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;06&#x2F;aws-sns&#x2F;&quot;&gt;Coded Chords&lt;&#x2F;a&gt;. 「AWSからSMSにメッセージを送る」（2025年6月9日）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">日本を代表する銀行がPPAPの廃止を発表しました。マルウェア対策としては正しい一歩ですが、新しい受け渡し方法には見過ごせない落とし穴が残っています。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Bench</title>
        <published>2026-06-07T17:49:33+09:00</published>
        <updated>2026-06-07T17:49:33+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/bench/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/bench/</id>
        
            <content type="html">&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;yostos&#x2F;55319192781&#x2F;in&#x2F;dateposted-public&#x2F;&quot; title=&quot;Front Row&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;55319192781_6bfa787ed7_b.jpg&quot; width=&quot;1024&quot; height=&quot;683&quot; alt=&quot;Front Row&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Someone built these benches for the view, then left. Now they hold the grey afternoon in place, a row of empty seats facing a sea that no longer performs. The light is flat, the tide unhurried, the promenade swept clean of footsteps. Each bench leans toward the water as if still listening, still expecting. But the only sound is the wind moving through the railings, and the slow erosion of an afternoon that refuses to end. To sit here would be to wait for nothing in particular, which is, perhaps, the purest way to wait at all.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17664&quot;&gt;#Bench&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">Photo Friday の「Bench」へ寄せた一枚。眺めのために据えられ、いまは誰もいないベンチが、灰色の午後を抱えたまま海へ向かって並んでいます。何かを待つでもなく、ただそこにある時間を写しました。
</summary>
        </entry><entry xml:lang="en">
        <title>YAMAHA SG 175 -  International Musician &amp; Recording World, October 1975</title>
        <published>2026-06-06T09:57:20+09:00</published>
        <updated>2026-06-06T09:57:20+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/yamaha-sg-175/delft/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/yamaha-sg-175/delft/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;出典&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.muzines.co.uk&#x2F;articles&#x2F;yamaha-sg-175&#x2F;6665&quot;&gt;International Musician &amp;amp; Recording World, October 1975&lt;&#x2F;a&gt; 掲載の Stephen Delft の記事です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;Stephen Delft はおそらく英国の個人ギター工房の製作者と思われます。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;このギターは私が公にコメントする初めてのヤマハのギターです。
初期のヤマハの楽器について時に容赦ない意見を表明していたのを憶えている読者もいるかもしれません。
しかし、時代が変わり方針も変わるものです。
大半の欠陥は1時間ほどの作業と新しいペグがあれば解決できるもので、製造時に修正していれば数秒で済んだはずです。&lt;&#x2F;p&gt;
&lt;p&gt;SG-175は全体的にワンオフの個人工房のギター製作者を満足させる水準にあります。
多くの部分が治具や機械による加工に見えるにも関わらずです。
驚くことに、優美で正確な仕上がりを示しているのは機械加工と機械仕上げの部分です。
この楽器が唯一物足りないのは、最終段階の手作業による仕上げの工程です。&lt;&#x2F;p&gt;
&lt;p&gt;量産品の楽器でありながら、これほどまでに手間と配慮が注がれているのを見るのは喜ばしいことです。
また、個人工房のギター製作者としての私が、まだ完全に存在価値を失っていないことも嬉しく思います。
（ナットやフレットの仕上がりが、木工やインレイ細工と同じくらい良くなったら、私は工房を売り払って養鶏場でも始めることを考えます。）
さらに嬉しいのは、ボディの縁を飾っている色付きの材料が、本物のアバロン貝であってセルロイド製の模造品ではないことです。何十個もの同じ形の小さなアバロン片を切り出し、それらの真っ直ぐな部材を曲線状の溝にはめ込む作業で自分を気が狂いそうな目に遭わせるような人は、自分が作っているものに本当に愛情を持っているに違いありません。&lt;&#x2F;p&gt;
&lt;p&gt;この楽器の写真が近くに載っているはずです。細部の美しさまでは写っていないかもしれませんが、まずは写真をご覧いただき、それからまた本文に戻ってきてください。&lt;&#x2F;p&gt;
&lt;p&gt;広告でよく言われるように、この楽器の素晴らしい素材や作りの良さを理解するには、実物をご覧いただく必要があります。おそらくこれは、広告の文句が文字どおり正しい数少ない例の1つでしょう。というのも、美しい木目や繊細なインレイ細工は安価な模造品よりも写真写りが悪い傾向にあり、印刷技術ではその細部まで再現できないからです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;ヤマハでは「ホンジュラスマホガニー」とされています。当時の欧州のレビュー記事では本マホガニーに対して &quot;American mahogany&quot; という表現が使われていました。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;実物を見る機会のない方のために説明すると、ネックとボディにはアメリカ産マホガニーが使用されており、自然な木肌を生かした半光沢仕上げとなっています。金属パーツはすべて厚めの金メッキが施されているように見えます。
ボディとネックには黒と白のセルロイド製パーフリング（縁飾り）が巻かれ、その外側の表面エッジ部分には、多色のアバロンモザイクが埋め込まれています。
ボディは3層構造の完全なソリッドボディで、レスポール・モデルに似た緩やかなバイオリン形状のアーチが施されています。
指板は良質なエボニーで構成されており、低めのニッケルフレットとたいへん丁寧に装着されたアバロンのポジションマークが備えられています。指板は完全な直線ではありませんが、軽いフレットすり合わせで十分に補正でき、許容範囲内に収まっています。
ペグには高品質なグローバー製が採用されています。レビュー機に取り付けられていた個体が動きの渋い不安定なものであったとしても、それはヤマハの責任とは言い難いでしょう。
個人的には、私は昔からシャーラー製を好んできました。しかし、シャーラーについても、アメリカ市場向けの大量生産を始めて以来、その品質管理には以前ほど満足していません。&lt;&#x2F;p&gt;
&lt;p&gt;ヤマハも、多くの私たちと同じように、昔からのブランド名や過去の評価に安住できないことを学ばなければならないでしょう。
フレットはすり合わせと研磨が施されており、指板の収縮によって生じるような鋭いフレット端は見られません。
私たちの標準的な測定条件では、実現可能な最低弦高は1弦側で1.0mm、6弦側で1.6mmでした。これはかなり優秀な数値です。さらに改善するには、完璧主義者が2時間ほどかけてフレットを徹底的にすり合わせし、さらにナットをより良いものに交換する必要があるでしょう。
ネックは18フレット位置でボディと接合されており、指板はそこから22フレットまで延びています。最終フレットはカッタウェイの付け根とほぼ同じ高さに位置しています。
コントロール類は一般的な構成で、トーン・コントロールとボリューム・コントロールがそれぞれ備わり、3ウェイ・ピックアップセレクターが1基装備されています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;私の個体は側面まで塗られていました。私のものは2回目のモディファイ後の最終版ですが、この記事はその前のバージョンだったための違いかもしれません。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;配線はきれいに整理されており、ボディ内部のコントロール・キャビティにはシールド効果を高めるための導電塗料が塗布されています。
これは賢明な処置ですが、残念ながらその塗料はキャビティの側面までは塗られておらず、バックパネルとも導通していません。そのため、本来は優れたアイデアであるにもかかわらず、その効果が十分に発揮されていません。
一方で評価できる点として、出力ジャックには金メッキ接点が採用されています。そのため接触不良によるガリ音（ノイズ）が発生しにくくなっています。&lt;&#x2F;p&gt;
&lt;p&gt;ピックアップは、オリジナルと同様に金属製マグネットを使用したアメリカン・ハムバッカーの設計をかなり忠実に踏襲しています。また、高さ調整用ネジにはシリコンラバーによる振動防止処理が施されています。
コイルとマグネットのアセンブリーは、振動による不要な共鳴を防ぐために、溶かしたワックスに浸して固定されています。
ボビンには通常よりもやや多めにコイル線が巻かれているようで、これが比較的高い出力レベルの理由かもしれません。
ヤマハは、大型のセラミックマグネットを接着して済ませるような安易な方法を取らず、アメリカ製ハムバッカーの磁気回路を再現するためにかなりの努力を払ったようです。
おそらく彼らはアメリカ製ハムバッカーの音色を再現しようとしたのでしょう。そして私は、その試みはおそらく成功していると思います。&lt;&#x2F;p&gt;
&lt;p&gt;しかしながら、この楽器にもいくつかの小さな欠点があります。
アバロンやプラスチック製の装飾部分と塗膜との密着が十分でないことを示す兆候が見られます。セルロース系溶剤をある程度含んだ、乾燥の遅いシーラーを下塗りとして使用すれば改善できるかもしれません。
仕上げについて言えば、ヘッド裏にはラッカーの下に傷（または痕跡）が見られますし、トラスロッドカバーもすでに反り始めています。また、多くのネジ頭に施された美しい艶消しブラック仕上げは摩耗しやすく、下地の鮮やかなピンク色の銅メッキが見え始めています。
残念ながら、私の知る限り摩耗に強い黒色メッキを施す方法はシアン化物溶液を煮沸する工程を伴います。当然ながら、多くのメッキ業者はそのような方法を使いたがりません。
そもそもステンレス製のネジでは駄目なのでしょうか。ステンレスなら材質そのものが同じ色ですし、鏡面仕上げにする必要もありません。&lt;&#x2F;p&gt;
&lt;p&gt;調整式ブリッジは、有名なギブソンのオリジナルおよびその無数のコピー品によく似た構造です。
しかしオリジナルの性能は、弦を受ける可動式サドルとして使われる材料に大きく左右されます。柔らかいプラスチック製のものは弦の圧力によってすぐに変形し、音の切れを損ないます。
金属製のものはガタつきやすく、弦溝が次第に楕円形に摩耗してしまうため、特定のフレットを押さえた際に弦がビビります。
一方、より優れたグラスファイバー製のものは、ときどき真っ2つに割れてしまううえ、入手も容易ではありません。
ヤマハは、弦が接するサドル部分を象牙製としています。象牙は弦のビビりや切断といった問題を最も起こしにくい材料です。さらに強度を確保するため、通常のものよりほぼ2倍の厚さに作られています。
ブリッジのその他の部分についても同様に堅牢で、よく考えられた設計となっています。しかし、今回の試奏機では、象牙製サドルが載るブリッジ本体内部の受け面に加工ムラが見られ、その点が精度を損なっています。
もっとも、これは生産初期に入り込みがちな種類の工作上の誤差に見えますし、実際にはそれほど重大な問題ではありません。&lt;&#x2F;p&gt;
&lt;p&gt;ブリッジとテールピースにこれほどの配慮が払われていることを考えると、ナットが成形プラスチック製と思われることには驚かされます。
これは間違いなく、この楽器全体の中で最も出来の悪い部分です。そして単にプラスチック製であるというだけでなく、ほぼあらゆる寸法が適切ではありません。
また、指板端部のナット溝の加工も粗雑です。このことから、私はこの試奏機がかなり急いで仕上げられたのではないかと考えています。
SG-175は、よく設計され、よく作られたギターであり、そのシリーズの中でも最高価格帯のモデルです。
それだけに、ブリッジのサドルと同じ高品質な象牙で作られた正確なナットと、最終調整にほんの数分の手間をかけることが求められます。&lt;&#x2F;p&gt;
&lt;p&gt;そのほかにも、少しばかり首をかしげる点が2つありました。
セレクタースイッチの周囲に付けられたゴム製のリングはいただけません。このアイデアはアメリカ製ギターから真似たものですが、もともとうまく機能した試しがありません。
ジャックソケットは曲面に取り付けられているのですから、なぜセレクタースイッチも同じように取り付けないのでしょうか。
また、トーンコントロールの目印用ピンの1つが傾いて取り付けられていました（打ち込んだのでしょうか？）。さらによく見ると、これらのピンは金メッキではないように思われます。&lt;&#x2F;p&gt;
&lt;p&gt;ここまで私は、この楽器の欠点についてかなり詳しく述べてきました。特に、長年使用した際の外観や信頼性に影響を与える可能性のある点について取り上げました。
私がそうしたのは、この楽器が本来きわめて優れた楽器になる可能性を持っており、輸入元や製造元もこれらの問題点を改善したいと考えるはずだからです。
私は、この楽器（そしておそらくは、より廉価なSC-90も）が、メーカーの方針転換を示していると考えています。その変化は2つあります。
第一に、このギターは過酷な使用に耐えられるよう作られており、万一損傷しても修理しやすい構造になっています。
第二に、有名なギターの設計を露骨に模倣することなく、アメリカ製ギターらしい感触とサウンドを実現していることです。
このギターがなぜ「日本製らしい」ではなく「アメリカ製らしい」と感じられるのか、またその違いがどこにあるのかを説明するのは非常に難しいことです。
ごく最近になって、ネックやボディの構造、そしてそれらの重量や剛性のバランスが、ソリッドギターの音色に大きな影響を与えることが認識されるようになってきました。
さらに、他の多くの日本製ギターとは異なり、このギターはアメリカンマホガニーを使用しています。木材の選択も音色に影響を与える要素です。
おそらく、その理由はこうした点にあるのでしょう。
もう1つの未知の要素は、この非常に薄いネックです。
ナット幅や弦間隔は標準的な仕様です（ナット幅42mm、ナット部の弦間隔35mm、ブリッジ部の弦間隔51mm）。しかし、ネック裏の木材量はやや少ないように感じられます。
私自身はこのネックを気に入りました。あるプレイヤーは「薄すぎる」と言いましたが、別のプレイヤーは「素晴らしい」と評価していました。
これほど薄い寸法にもかかわらず、ネックは十分な剛性と安定性を備えているように思えます。ただし、この設計が本当に正しかったかどうかは、時間が経ってみなければ分からないでしょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;つまり彼は、SG-175のネック構造、ボディ構造、木材、基本設計に価値があると考えており、SG-90も高く評価しています。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;もし228ポンドを出せないのであれば、SG-90も非常によく似た選択肢だと思います。ただし、金メッキや豪華なインレイは省かれており、指板材はローズウッドになっています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;..&#x2F;&quot;&gt;本記事に戻る&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">この記事は、 International Musician &amp; Recording World, October 1975のYAMAHA 175についての翻訳です。
</summary>
        </entry><entry xml:lang="en">
        <title>YAMAHA SG-175 ── SGの原点を弾く</title>
        <published>2026-06-05T13:20:32+09:00</published>
        <updated>2026-06-05T13:20:32+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/yamaha-sg-175/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/yamaha-sg-175/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;yamaha-sg-175&amp;#x2F;cover.webp?h=c8d15b2b956926bd933e&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;778&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;SG-175を購入&quot;&gt;SG-175を購入&lt;&#x2F;h2&gt;
&lt;p&gt;YAMAHA SG-175を、横浜まで足を運んで手に入れました。
今購入しないと、もう出会えないと思ったためです。&lt;&#x2F;p&gt;
&lt;p&gt;シリアルナンバーは「38」で始まります。資料に照らすと1976年製です。
SG-175は短い製造期間のなかで何度か細かい仕様変更を受けており、本機はリア側エスカッションが高さのあるタイプを採用した、いわゆる後期（第3期）仕様にあたります。ピックアップ裏面には「50.12.12」のスタンプ ── 昭和50年（1975年）12月製造 ── が読めるので、75年製のピックアップを積んだ76年製の個体、ということになります。&lt;&#x2F;p&gt;
&lt;p&gt;折角なので弾いてみました。
音の傾向はSG-1000&#x2F;2000&#x2F;3000より若干甘めな印象です。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2333741087&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;bay-street-fix&quot; title=&quot;Bay Street Fix&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Bay Street Fix&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;SG-175とは&quot;&gt;SG-175とは&lt;&#x2F;h2&gt;
&lt;p&gt;YAMAHA SGといえば、後年の名機 &lt;strong&gt;SG-2000&#x2F;3000&lt;&#x2F;strong&gt; が広く知られています。ですが、現在まで続くあの左右対称ダブルカッタウェイ／アーチドトップのデザインを最初に確立したのは、SG-175でした。それ以前にも &quot;SG&quot; の型番は存在しましたが、いま我々が「YAMAHA SGの顔」として思い浮かべるフォルムは、ここから始まっています。&lt;&#x2F;p&gt;
&lt;p&gt;発売は1974年11月。製造はおよそ1976年6月まで、期間にして1年半ほど。総生産本数はたった約600本といわれる希少なモデルです。&lt;&#x2F;p&gt;
&lt;p&gt;当時のヤマハ純正カタログを見ると、SG-175は「ハンバッキング型最高級モデル」、キャッチコピーは「SUPER SESSION」。価格は135,000円。今回購入したギターの主な仕様は次のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ピックアップ&lt;&#x2F;strong&gt;: ヤマハ スーパーハンバッキングマイク #3165A × 2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ボディ&lt;&#x2F;strong&gt;: ホンジュラスマホガニー（ハンドクラフトアーチドトップ&#x2F;ブラウン）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ネック&lt;&#x2F;strong&gt;: ホンジュラスマホガニー完全セットネック&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;指板&lt;&#x2F;strong&gt;: 黒檀（カーブ250R）／洋銀22フレット&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;インレイ&lt;&#x2F;strong&gt;: メキシカンシェル象嵌（ボディライン・ポジションマーカー）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ペグ&lt;&#x2F;strong&gt;: グローバー ゴールド糸巻&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コントロール&lt;&#x2F;strong&gt;: VOL×2、TONE×2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;スケール&lt;&#x2F;strong&gt;: 628mm ／ 重量: 3.94kg&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;純正指定弦&lt;&#x2F;strong&gt;: アーニーボール・スーパースリンキー（= 9〜42）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;弦高&lt;&#x2F;strong&gt;（12フレット上）: 1弦側1.5mm &#x2F; 6弦側2.0mm&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;トラスロット&lt;&#x2F;strong&gt;: 余裕あり&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;フレット&lt;&#x2F;strong&gt;: 約6分山残り&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ナット幅&lt;&#x2F;strong&gt;: 42mm&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ケース&lt;&#x2F;strong&gt;: 純正ケースSGX&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;付属品&lt;&#x2F;strong&gt;: なし(本来はオリジナルストラップ、シリアルコード、アジャスタードライバー、シリコンクロスが付属)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;木材選定からして本気です。ホンジュラスマホガニーのボディとネック、黒檀指板。当時のヤマハが海外メーカーに真正面から挑もうとしていたことが、スペック表から伝わってきます。&lt;&#x2F;p&gt;
&lt;p&gt;ここで面白いのは、SG-175の個性が「175で突然生まれたものではない」ことです。同じカタログには下位機SG-50&#x2F;70&#x2F;90が載っていて、ハンバッキングピックアップ、完全セットネック、マホガニー系ボディといった175の特徴は、すでにこのラインで確立されていました。カタログの見出しは、はっきりとこう宣言しています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;オリジナリティ。これがヤマハの主張です。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;その「オリジナリティ」として挙げられているのは、ざっと次の3つです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;独自ピックアップ&lt;&#x2F;strong&gt; ── アルニコ合金をヤマハ独自の方法で着磁した超異方性磁石。外磁に影響されず、巻線の材質・巻き方・巻き数まで作り込んだ安定性能。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;クリアネス効果&lt;&#x2F;strong&gt; ── ボリュームを絞ってもコードカッティングの高域がカットされない回路。弾きやすい位置に配置されたボリューム。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;完全セットネック＋スリムネック&lt;&#x2F;strong&gt; ── 握りやすさとハイポジションの演奏性。本来は高級機にしか使えない要素を全機種に。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;アルニコ、クリアネス回路、完全セットネック、スリムネック、そして細い弦。SG-175が体現していたのは、&lt;strong&gt;クリアで軽快、倍音重視、演奏性重視&lt;&#x2F;strong&gt;という思想でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;SG-175_vs_SG-2000&quot;&gt;SG-175 vs SG-2000&lt;&#x2F;h2&gt;
&lt;p&gt;SG-175がSG-2000のルーツであることは、ヤマハ自身が公言してきました。SG-2000発売当時のカタログには、こうあります。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;SG-2000 の歴史的なルーツを探る上で忘れられないのが、現在 &quot;幻の銘器&quot; と呼ばれている1974年発表のプロフェッショナルモデル SG-175&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;1974年の来日時にCarlos SantanaがSG-175を手にし、その要望から生まれた通称 &quot;ブッダSG&quot; を市販化したのがSG-2000とされ、系譜は一本の線でつながっています。&lt;&#x2F;p&gt;
&lt;p&gt;ところが「ルーツ」と「完成型」は、コンセプトの上で地続きではありません。実際SG-2000&#x2F;3000は4.5Kg近い個体が大半ですが、今回入手したSG-175は4.0Kgを切っていました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;SG-175&lt;&#x2F;th&gt;&lt;th&gt;SG-2000&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ネック&lt;&#x2F;td&gt;&lt;td&gt;伝統的セットネック&lt;&#x2F;td&gt;&lt;td&gt;スルーネック（Tクロス構造）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ボディ構造&lt;&#x2F;td&gt;&lt;td&gt;パンケーキ構造のオール・ホンジュラスマホガニー&lt;&#x2F;td&gt;&lt;td&gt;マホガニーバックに固いメイプルトップを貼り合わせ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ブリッジ&lt;&#x2F;td&gt;&lt;td&gt;通常のブリッジのみ&lt;&#x2F;td&gt;&lt;td&gt;ブリッジ下にサスティーンプレートを埋込&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;SG-2000は、サンタナの「軽すぎてサスティーンが稼げない、もっと堅牢に」という助言を受け、ロングサスティーンを得るための装備で固められました。メイプル＋マホガニーとレスポールに近いレシピへの接近で、ヤマハ公式も狙いを「サステインを最大に」と明記しています。&lt;&#x2F;p&gt;
&lt;p&gt;対するSG-175は、オールマホガニーのシンプルな作りです。軽いボディに仕掛けを足さない素性が向くのは、クリアで軽快な倍音重視の鳴りです。しかもこれは175だけの個性ではありません。独自ハンバッカー、完全セットネック、スリムネックという175の核心は、すでに下位機のSG-50&#x2F;70&#x2F;90で確立され、いずれもサンタナ来日（1974年）より前から存在していました。当時のカタログでもこの仕様を「オリジナリティ。これがヤマハの主張です」としています。&lt;&#x2F;p&gt;
&lt;p&gt;SG-2000はある意味で、175の延長ではなくサンタナの助言をきっかけにした明確な方向転換だったのです。&lt;&#x2F;p&gt;
&lt;p&gt;もっとも、それが間違いだったわけではありません。SG-2000は1978年6月の『Guitar Player』誌の表紙に、サンタナに抱えられて登場します。「現行で最高のロック用量産ギター」と評され、ギブソンの同等機より2割以上安い価格も追い風でした。レスポールがハードロックに収まっていったのに対し、SG-2000はフュージョンからレゲエ、ニューウェイブまでジャンルをまたいで使われ、リードギター全盛の1970年代末から80年代初頭の空気によく噛み合っていました。&lt;&#x2F;p&gt;
&lt;p&gt;逆に、いまの耳で面白いのはSG-175のほうかもしれません。深く歪ませるより、クリーンやクランチの抜けとアタックで聴かせるローゲイン寄りの現代的な音づくりには、軽くクリアで倍音のよく出る175の素性のほうが合うように思います。半世紀前に軽快さと倍音を選んだ一本が、回り回って今の音楽にフィットする。そう考えると、この古いギターを手に入れたのも、悪くない巡り合わせでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ヤマハの失敗&quot;&gt;ヤマハの失敗&lt;&#x2F;h2&gt;
&lt;p&gt;そのSG-2000を頂点としたSGシリーズも、2000年代の終わりにかけて、しだいに存在感を失っていきます。&lt;&#x2F;p&gt;
&lt;p&gt;2000年以前はレスポールに似た方向の作りのよいコストパフォーマンス機という立ち位置でした。
ところが2008年のリーマン・ショック以降、円は一気に強くなりました。2007年に1ドル120円台だった為替は2009〜2010年には80円台で高止まり、本家ギブソンがぐっと身近な価格になりました。「似た音を狙うなら、いっそ本物のレスポールを買うか」。そう考えた人も少なくなかったのではないか。ここは私の推測ですが、そう思えてなりません。&lt;&#x2F;p&gt;
&lt;p&gt;円高がじわじわとSGの値ごろ感を削っていった先で、2010年2月、ヤマハはTクロスメイプル構造のスルーネックやサスティーンプレートの埋め込みなど生産に手間の掛かるSGシリーズの生産完了を発表します。
同年9月には後継として、伝統的なセットネックに標準的なブリッジを持つSG1820を中心とする新しいSG1800シリーズへと切り替わりました。&lt;&#x2F;p&gt;
&lt;p&gt;ところが、このモデルチェンジ後のSGは、ユーザーのあいだで評判が芳しくありません。
SG-2000&#x2F;3000のTクロスメイプルのスルーネックやサスティーンプレートと言った特徴的な仕様を捨てコンター加工まで省かれては、ユーザーには価格は上がったのに「手抜きモデル」と見なされたからです。&lt;&#x2F;p&gt;
&lt;p&gt;しかも、よりよってキャッチフレーズが「ロック志向の新しいSGシリーズ」です。
時代はクロスオーバーでローゲインの音楽に向かっているのに、「ロック」とは如何にズレていたか。
かつてのSGがもっていたクロスオーバーなイメージを捨て去って、これはまさに「レスポールの模倣」になってしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;では、ヤマハはどうすべきだったのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;私は、1970年代にYAMAHA SGとして育てた独自ハムバッカー、セットネック、完全対称のダブルカッタウェイのオールマホガニーボディ ── つまりSG-175が掲げた「オリジナリティ」の仕様に戻し、「&lt;strong&gt;あの銘器 SG-175への回帰&lt;&#x2F;strong&gt;」と謳うべきでした。&lt;&#x2F;p&gt;
&lt;p&gt;ヤマハは「SG-2000こそ完成形」と神話化してしまいましたが、その伝説の中でSGのルーツとしてSG-175も「幻の銘器」と伝説にしているのです。
この伝説を活用すべきでした。&lt;&#x2F;p&gt;
&lt;p&gt;堂々と「175への回帰」とうたっていれば、チャンスはあったはずです。たとえば不評を買ったコンター加工の省略にしても、「SG-175譲りの伝統仕様」と言ってしまえば、誰も省コストとは受け取らず由緒ある仕立てとして通ったはずです。
同じ一手でも、語り方ひとつで「手抜き」にも「伝統」にもなります。&lt;&#x2F;p&gt;
&lt;p&gt;その上で、REVSTARで見せたようなチャンバー構造やIRAといった現代的な技術を盛り込んでいれば、半世紀前のオリジナリティと最新の技術が両立した一本になっていたはずです。
そうすれば、半世紀にわたって受け継がれてきたヤマハの銘器として堂々と世に問えたのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;そして何より、ヤマハのフラッグシップがSG1820とREVSTARに生き別れる、という妙なことにもならなかったはずです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;弾いてみた&quot;&gt;弾いてみた&lt;&#x2F;h2&gt;
&lt;p&gt;さて、能書きはこのくらいにして ── 実際に弾いた話です。&lt;&#x2F;p&gt;
&lt;p&gt;購入時、本機には10〜46が張られていました。おそらく販売店が、定番のゲージで張ったものでしょう。
実際の純正指定は9〜42なので、張り替えました。
テンションが緩み、右手の入力に素直に反応するようになって、コードを弾いたときの倍音の鳴り方が変わります。「ああ、これがカタログの言う軽快さか」と腑に落ちる感覚がありました。設計者が想定した弾き味に戻す、というのはこういうことなのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;この9〜42という数字自体、SG-175の思想がにじむところです。サスティーンを狙う定番のレスポールがメーカー標準10〜46なのに対し、ほぼ同じスケール（約628mm）のSG-175はあえて細い9〜42を純正指定にしています。出荷時の一本の弦に至るまで「サスティーンではなく軽快さと倍音」という立場を貫いていたわけで、たかが弦、されど弦です。まぁ、もしかすると、ネックの強度への配慮だったのかもしれませんが。&lt;&#x2F;p&gt;
&lt;p&gt;音そのものは、想像よりずっとパワフルです。スーパーハンバッキングマイク #3165Aはフルテンでディストーションともよく合います。そしてボリュームポットに組み込まれたハイパスフィルター（クリアネス回路）が効いていて、&lt;strong&gt;ボリュームを絞っても高域が痩せません。&lt;&#x2F;strong&gt; 半世紀前の設計とは思えない実用性で、絞り切る手前の絶妙なゲインコントロールができます。シャープなカッティングから、ロングサスティーンを活かしたリードまで、ちゃんと一本でこなしてくれます。&lt;&#x2F;p&gt;
&lt;p&gt;コンディションも良好でした。12フレット上の弦高は1弦側約1.5mm／6弦側約2.0mm、トラスロッドは余裕あり、フレットは約6分山。50年選手としては上等です。&lt;&#x2F;p&gt;
&lt;p&gt;鳴りは従来のSGシリーズより甘い気がします。今ではおそらく決して入手できない、質の良いホンジュラスマホガニーのおかげでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;カタログが半世紀前に宣言した「オリジナリティ」は、ちゃんとこの個体のなかに生きていました。SGはすでにSG-175で完成していた ── そう感じながら、今日もこの茶色いボディを抱えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;guitar-catalog.com&#x2F;guitar-and-amp&#x2F;yamaha&#x2F;1975&#x2F;en_index.html&quot;&gt;ヤマハ エレクトリックギター カタログ（1975年）&lt;&#x2F;a&gt;. 「The World of Musical Instruments Brochures」
&lt;ul&gt;
&lt;li&gt;ページをマージしたダウンロード版を作成しました -&amp;gt; &lt;a href=&quot;.&#x2F;yamaha-catalog-1975.pdf&quot;&gt;Download&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.muzines.co.uk&#x2F;articles&#x2F;yamaha-sg-175&#x2F;6665&quot;&gt;Stephen Delft&lt;&#x2F;a&gt;. &quot;Yamaha SG-175&quot;. International Musician &amp;amp; Recording World, October 1975
&lt;ul&gt;
&lt;li&gt;日本語訳を用意しました -&amp;gt; &lt;a href=&quot;.&#x2F;delft&#x2F;&quot;&gt;日本語訳&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">1976年製 YAMAHA SG-175 を手に入れました。SG-2000 の影に隠れがちなこのモデルこそ、現行まで続く YAMAHA SG のデザインと思想の出発点でした。当時のカタログを掘り起こしながら、「SG はすでに SG-175 で完成していた」という仮説と、その音を弾いた実感を書き留めておきます。
</summary>
        </entry><entry xml:lang="en">
        <title>【DJI Avata2】夜明けの凪を翔ける - 房総・塩浦海水浴場</title>
        <published>2026-06-03T07:29:40+09:00</published>
        <updated>2026-06-03T07:29:40+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/06/shioura-beach/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/06/shioura-beach/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;06&amp;#x2F;shioura-beach&amp;#x2F;cover.webp?h=60ac8c45fe6664dcec6c&quot;
  alt=&quot;Cover&quot; width=&quot;800&quot; height=&quot;441&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;今日から台風6号が接近するとの予報だったため、前日のうちに房総半島南端の塩浦海水浴場でAvata2を飛ばしてきました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;2BXc6aWcP64&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;夜明け直後で風もなく、絶好のドローン日和でした。&lt;&#x2F;p&gt;
&lt;p&gt;塩浦海水浴場は南房総市白浜町、房総半島でも最南端に近い外房の海水浴場です。
東側を漁港、西側を岩礁に挟まれているためそれほど広くはありませんが、入り江になっていて遠浅のため波はとても穏やかです。
駐車場やシャワーも整備され、すぐ近くにはホテルもあります。
近くに滞在しながら家族で磯遊びを楽しむには、とてもよい場所です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">台風6号の接近前、夜明けの凪いだ海でDJI Avata2を飛ばしてきました。房総半島南端、白浜の入り江に抱かれた遠浅の塩浦海水浴場をFPVドローンの空撮映像でご紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>「民主主義を破壊する」と説いた石橋通宏議員のブーメラン質疑</title>
        <published>2026-05-29T19:13:21+09:00</published>
        <updated>2026-05-29T19:13:21+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/ishibashi-michihiro/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/ishibashi-michihiro/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;ishibashi-michihiro&amp;#x2F;cover.webp?h=a99a607744c1184382b7&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.i484.jp&quot;&gt;石橋通宏&lt;&#x2F;a&gt;、この人は一体何がやりたいんだろう。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;LBKX-432LDI?si=RfHvSdjSV1Mvkrdi&amp;amp;start=5430&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;2026年5月28日の参議院厚生労働委員会。健康保険法改正案、それも高額療養費の上限引上げという重い議題に高市総理が出席する、貴重な質疑の場でした。その時間を、石橋議員はこう使いました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;法案そっちのけで、週刊文春発の「中傷動画」疑惑を延々と高市総理に追及&lt;&#x2F;li&gt;
&lt;li&gt;持ち出す証拠は週刊文春の記事だけ。独自の裏付けはゼロ&lt;&#x2F;li&gt;
&lt;li&gt;その文春報道すら、当事者が「終わった直後にすべて消去されている」と認める“消えた証拠”。存在しないものを「無かったと証明しろ」と迫る悪魔の証明&lt;&#x2F;li&gt;
&lt;li&gt;証拠を示さないまま「その答弁が違うと判明したときの総理の責任は極めて重い」「責任をとられるということでよろしいですね」と、仮定の上に進退まで要求&lt;&#x2F;li&gt;
&lt;li&gt;冒頭で「誹謗中傷動画で民意を偽造する手法は民主主義を破壊する、絶対に許してはならない」と総理に同意を迫りながら、自分は裏の取れない週刊誌情報で総理と秘書を加害者扱いするブーメラン&lt;&#x2F;li&gt;
&lt;li&gt;揚げ句に「週刊誌の記事が証拠でございますか」と総理から苦言&lt;&#x2F;li&gt;
&lt;li&gt;肝心の高額療養費の質疑は「時間がなくなりました」で1問もできずに終了。守るはずの患者や家族への質問はゼロ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;総理の反論は至極まっとうでした。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;ないものはないと申し上げるほかなくて、存在できないことや確認できないことを私自身が証明できない限り、まるであったかのように印象づけられるというのは大変心外でございます&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;ブログに次のように意気込んでの質問がこの内容です。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;本法案の審議もいよいよ大詰めを迎え、石橋議員は先週木曜日の厚生労働大臣への質疑に続き、明日は所属会派を代表して高市総理への質問を行います。&lt;&#x2F;p&gt;
&lt;p&gt;個別法案に対する委員会審議に総理大臣が出席するのは、原則として重要広範議案のみであり、NHKテレビ中継こそありませんが、大変に貴重な機会となります。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;まぁ、さすが、支持率2%を切ってる立憲民主党議員というところでしょうか？&lt;&#x2F;p&gt;
</content>
        <summary type="html">総理が出席する貴重な法案質疑の場で、立憲民主党の石橋通宏議員が選んだのは、週刊誌頼みの疑惑追及でした。「民主主義を破壊する行為は許さない」と熱弁したその口で、彼自身は何をしていたのか。国会中継から振り返ります。
</summary>
        </entry><entry xml:lang="en">
        <title>不誠実なスバルという自動車メーカー</title>
        <published>2026-05-28T13:50:06+09:00</published>
        <updated>2026-05-28T13:50:06+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/unfaithful-subaru/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/unfaithful-subaru/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;unfaithful-subaru&amp;#x2F;cover.webp?h=5932f0c6bcbbd7f3b947&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;最近のスバルには、どこか良心がなくなったように思います。&lt;&#x2F;p&gt;
&lt;p&gt;スバルの動きを追ううちに、共通する一本の線が見えてきました。
その線をひとことで言えば、「商売の都合を理念の言葉で包む」という振る舞いです。
スバルが長く掲げてきた「硬派で実直」という看板と、実際の動きとの落差が、年々大きくなっているように感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;抽選でしか買えない特別仕様車&quot;&gt;抽選でしか買えない特別仕様車&lt;&#x2F;h2&gt;
&lt;p&gt;まず、抽選販売の特別仕様車です。&lt;&#x2F;p&gt;
&lt;p&gt;本日、スバルの限定車WRX STI Sport♯の抽選結果が発表されました。600台限定のところに、1万人以上の申し込みがあったと言います。年初にもBRZには2種の限定車（Type RA、100台と200台）が用意されていました。一体、いつまでこんなことを続けるのでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;本来「欲しい人に届ける」ための仕組みが、希少性を演出して話題を作るための道具に転化していると感じます。供給制約という事情はあるにせよ、買い手を「当たればありがたく思え」という立場に置く商法は、かつてのスバルが持っていた実直さとは別物です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ラインナップしないMTという建前&quot;&gt;ラインナップしないMTという建前&lt;&#x2F;h2&gt;
&lt;p&gt;なかでも問題だと感じるのは、MTの扱いです。&lt;&#x2F;p&gt;
&lt;p&gt;以前はスバルと言えばMTユーザーの比率が高いメーカーでした。&lt;&#x2F;p&gt;
&lt;p&gt;よく言われるのは「アイサイトとの統合上、どうしてもCVTでなければ安全を担保できない」という技術的な信念です。これに基づく方針であれば、筋は通ります。安全のために趣味性を捨てる、という選択は、それはそれでスバルらしい選択です。&lt;&#x2F;p&gt;
&lt;p&gt;ところが現実は違います。北米のWRXは6速MTを当たり前にラインナップしています。
国内ではS4をCVT専用にしておきながら、ときどき限定車やコンプリートカーの形で、MT的な飛び道具を投入してきます。
これでは「安全のためのCVT」という建前は、結局のところ「数の出ないMTを通常販売はしたくない、ファンの熱は限定品で回収したい」という本音の覆いでしかなかった、と見えてしまいます。節操がない、という言葉がいちばん近いのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;先に触れたとおり、かつてのスバルはMTユーザーの比率が高いメーカーでした。多くのメーカーがMTを車種から外していくいまだからこそ、通常ラインナップにMTを残し続けるだけでも、それはそのまま差別化になったはずです。スポーツカーを一台まるごと開発するより、「うちはMTを続けます」という姿勢を貫くほうが、ずっと手軽にマニアの心をつかめたのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;結局、メーカーとしての誠意は、こうしたところに現れるのでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;定まらない次世代への展望&quot;&gt;定まらない次世代への展望&lt;&#x2F;h2&gt;
&lt;p&gt;いちばん痛々しいのが次世代戦略で、いま現在進行形で揺れています。
その揺れは、EVの2つの系列の扱いにはっきり表れています。&lt;&#x2F;p&gt;
&lt;p&gt;スバルのEVには、いまトヨタとの協業ラインと、完全に自前で開発する独自ラインの二本があります。ソルテラや新型トレイルシーカーが前者で、新工場を建てて2027年ごろからの量産を見込んでいたのが後者です。&lt;&#x2F;p&gt;
&lt;p&gt;独自のEV戦略は、2026年5月15日の決算会見で延期・凍結が発表されました。
これは世界的なEV逆風の影響を読んでの判断でしょう。前年度比90％減の営業利益の現状を鑑みると、合理的な判断とも言えます。&lt;&#x2F;p&gt;
&lt;p&gt;目を引くのは、その独自ライン凍結のわずか1か月前、4月9日に、トヨタとの協業ラインのトレイルシーカーを539万円で発表していたことです。しかもこれは「トヨタ車のお下がり」ではありません。トヨタとスバルのエンジニアが半々で開発し、ワゴンという性格づけはスバル発案、生産はスバルの矢島工場で行われる、スバル初の自社工場製BEVです。協業の枠内では、むしろ関与を一段深めています。&lt;&#x2F;p&gt;
&lt;p&gt;一見すると、独自ラインを凍結しながら協業ラインを深掘りする動きは、矛盾しているように見えます。しかし、需要の読めないEVで単独突破を避け、トヨタとの協業に体重を預けること自体は、体力に見合った合理的な判断です。腑に落ちないのは中身ではありません。そもそもスバル程度の規模で、なぜ独自EVラインまで抱えようとしたのか。その問いに、会社が自分の言葉で答えていないのです。&lt;&#x2F;p&gt;
&lt;p&gt;ここでもマツダの選択は現実的です。
マツダのEV戦略は、一言でいうと「EVに全振りしない」ことを最初から方針として明言しているのが特徴です。土台にあるのが、マルチソリューション戦略とライトアセット戦略の2つです。2030年までを「電動化の黎明期」と位置づけ、エンジン・ハイブリッド・PHEV・ロータリーのレンジエクステンダー・EVを併売しながら段階的に進めるという考え方で、EV一本に賭けません。ロータリーも消さず、発電用（R-EV）として残しています。&lt;&#x2F;p&gt;
&lt;p&gt;スバルの問題は選択の中身ではなく、それを信念として語れていないところにあると思います。
語れないから、始めたりやめたりが、戦略ではなく逃げに見えてしまうのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;公平を期すために&quot;&gt;公平を期すために&lt;&#x2F;h2&gt;
&lt;p&gt;一応、反論の余地も置いておきます。
抽選や限定商法、ラインナップを絞ったMTの扱いは、いまや自動車業界全体の傾向であって、スバルだけの罪ではありません。EVのリスクを大手に預けるのも、体力のないメーカーとしては合理的な判断です。個別の選択は、どれも単独で見れば擁護できます。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、私の違和感の核は商法そのものにはありません。&lt;&#x2F;p&gt;
&lt;p&gt;「硬派で実直」という看板と、実際の振る舞いとの落差のほうにあります。だとすると、「業界がそうだから」という言い訳は、むしろ罪を重くします。かつてのスバルなら、流行りに乗らないことこそが看板だったはずだからです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;良心がなくなった、というのは強い言葉です。ただ、長年のファンとして本当に拭えないのは、もっと素朴な不安のほうです。&lt;&#x2F;p&gt;
&lt;p&gt;スバルがかつて誇った差別化要因は、いま1つずつ効き目を失っています。EVへのシフトが避けられない時代に、水平対向エンジンへのこだわりは、強みというより足枷になりかねません。売りだった四駆も、雪国や悪路でこそ活きる装備で、ユーザーの多くが暮らす都市部では恩恵を感じる場面が限られます。先進運転支援の象徴だったアイサイトも、各社が追いつき、もはや特別なものではなくなりました。&lt;&#x2F;p&gt;
&lt;p&gt;それでいて、目立つ動きといえば抽選の限定車です。本来なら次世代をどう戦うかを語るべき局面で、希少性で話題を作る限定車ビジネスに精を出しているように見えます。土台が削られていることに会社自身がどれだけ向き合えているのか、外からは伝わってきません。&lt;&#x2F;p&gt;
&lt;p&gt;水平対向にこだわり、四駆にこだわり、流行を追わないことを誇りにしていた頃のスバルが好きだった人間として、いちばん気がかりなのはそこです。この会社の次世代は、本当に大丈夫なのでしょうか。&lt;&#x2F;p&gt;
</content>
        <summary type="html">抽選でしか買えない限定車、建前ばかりのMT戦略、揺れ続けるEV方針。「硬派で実直」を看板にしてきたスバルは、いつからこんなに不誠実になったのでしょう。長年のファンとして覚える違和感の正体を考えます。
</summary>
        </entry><entry xml:lang="en">
        <title>RICOH GR IV Monochromeのお勧めアクセサリー</title>
        <published>2026-05-27T08:12:52+09:00</published>
        <updated>2026-05-27T08:12:52+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/gr-options/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/gr-options/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;gr-options&amp;#x2F;cover.webp?h=46b1895793f9b0ad93e6&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;先日 &lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;05&#x2F;gr-iv-monochrome&#x2F;&quot;&gt;RICOH GR IV Monochrome を買うべき理由と推奨設定&lt;&#x2F;a&gt; を書きました。本体が手元に届くと、ホールド感やレンズの保護まわりが気になり、周辺アクセサリーも少しずつ揃えていきました。しばらく持ち歩いてみて、これは買ってよかったと感じたものを用途別にまとめます。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;ホールドと操作性を高める&quot;&gt;ホールドと操作性を高める&lt;&#x2F;h2&gt;
&lt;p&gt;GRシリーズはコンパクトなボディが魅力ですが、その分グリップや指の納まりには工夫の余地があります。日々持ち歩くカメラとして、まずは握り心地と誤操作の防止から手をつけました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4usGpKN&quot;&gt;RYDSCAM 実木カメラグリップ(クルミ黒板)&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;クルミ材のグリップとL型クイックリリースプレートを組み合わせた一体型のグリップである。グリップ部に3か所の凹凸を配置し、握り込んだとき指先がしっかり引っかかる設計で、ホールド感が増す。木の温度感のあるふくらみがフラットなGRに加わると、片手で構えたときの安定感が一段違ってくる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3PptYQZ&quot;&gt;JJC ハンドストラップ リストストラップ&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;付属している純正のストラップは細くて頼りなく感じたので買い替えた。こちらはストラップの幅もあり、しっかりした作りであるが、素材は柔らかいので手にあたる感触も優しい。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4v3Hysa&quot;&gt;JJC 金属サムグリップ&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;GR IVから本体右側に独立した露出補正の+&#x2F;-ボタンが追加された。右手の指がよく触れてしまい、意図しない露出変更を防ぐため取り付けている。アルミ合金製でホットシューに差し込むだけで装着でき、親指の当たる面にはマイクロファイバー革を貼って、しっとりとした触り心地に仕上げている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;レンズの保護とメンテナンス&quot;&gt;レンズの保護とメンテナンス&lt;&#x2F;h2&gt;
&lt;p&gt;GR IIIxから乗り換えるとレンズの径が変わるため、保護まわりはひととおり買い直しになりました。落下や指紋からレンズを守るキャップとフィルター、そして日々のクリーニング用具を揃えています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4tSQ10x&quot;&gt;JJC 金属レンズキャップ&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;GR IIIxの頃から愛用しているJJCの金属レンズキャップであるが、GR IVではレンズ径が変わるため買い直した。アルミ合金の本体に内側はEVAパッドで、レンズ面に優しい構造である。表面にはGRロゴが刻まれていて、ぱっと見では純正のような佇まいである。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4nOGfuX&quot;&gt;JJC GR IV用UVフィルター&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;こちらもレンズ保護用である。GR IIIxでは粘着で貼り付けるタイプのフィルターを使っていたが、糊が強力で剥がすときに難儀するのが気になっていた。GR IV用は本体側のレンズ外周のリングを外し、その代わりに同じ位置へねじ込んで装着するタイプである。レンズ前面をすっぽり覆うかたちになるので埃が入り込みにくく、レンズキャップを付けたまま電源を入れても、せり出すレンズと前述のレンズキャップが干渉しないので便利である。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3RlOXVr&quot;&gt;K&amp;amp;F CONCEPT レンズペン&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;ダブルカーボンヘッドと伸縮式ブラシが一本にまとまったクリーニングペンである。レンズにやさしい素材なので、傷を気にせず使えるのは安心感がある。指紋やホコリもきれいに取れて、見た目もスッキリ。使わないときはブラシを引っ込められるので、収納時にかさばらないのが地味にありがたい。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;予備の記録メディア&quot;&gt;予備の記録メディア&lt;&#x2F;h2&gt;
&lt;p&gt;GR IV Monochromeの内蔵メモリーは約53GBあり、microSDカードがなくても十分だ。長時間の撮影やPCへの取り込み待機時に備えて、低価格のカードを1枚だけ用意している。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3RNeYgl&quot;&gt;KIOXIA(キオクシア) microSD 64GB UHS-I Class10&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;本体メモリーが大きいので不要かとも思ったが、念のため購入した。UHS-IのClass 10&#x2F;U1で読み込み最大100MB&#x2F;s、JPEG中心の使い方ならこのカメラには十分な性能である。SDカード全体が値上がりしているなかで、購入時はこのモデルが最安値であった。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;カメラ本体だけでも完成度の高いGR IV Monochromeですが、こうした小物を足していくと毎日の持ち歩きがより安心で快適になりました。同じように購入した方の参考になれば幸いです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">本体を手に入れたら、次は周辺アクセサリーです。RICOH GR IV Monochrome に合わせて買い揃えたウッドグリップ、サムグリップ、レンズキャップ、UVフィルターなど、しばらく使って手応えのあった7点を用途別に紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Shaded</title>
        <published>2026-05-26T23:59:55+09:00</published>
        <updated>2026-05-26T23:59:55+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/shaded/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/shaded/</id>
        
            <content type="html">&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;yostos&#x2F;55295105829&#x2F;&quot; title=&quot;Lavish Even in Shadow&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;55295105829_39091708a6_b.jpg&quot; width=&quot;1024&quot; height=&quot;683&quot; alt=&quot;Lavish Even in Shadow&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Even the temizuya — the humble pavilion where visitors rinse their hands before worship — is carved and gilded to the last bracket. Looking up beneath its eaves at Nikkō Tōshō-gū, the shrine to Tokugawa Ieyasu, I found ornament worked into surfaces most builders would have left plain. The shade of the roof half-swallows it, yet the detail keeps going where the light gives out.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;日本語&lt;&#x2F;summary&gt;
参拝者が手を清めるだけの慎ましい建物、手水舎。
その軒の裏を見上げると、組物の一つひとつに至るまで彫刻と金箔が施されていました。
徳川家康を祀る日光東照宮では、普通なら素っ気なく仕上げる場所にまで装飾が及んでいます。
屋根の陰が半ば呑み込んでもなお、光の尽きるところまで細工は続いています。
&lt;&#x2F;details&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17608&quot;&gt;#shaded&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">日光東照宮の手水舎を見上げると、屋根の陰に半ば呑まれた軒下にまで彫刻と金箔が施されていました。光の尽きるところまで、細工は続いています。
</summary>
        </entry><entry xml:lang="en">
        <title>【DJI AVATA2】龍門の滝</title>
        <published>2026-05-26T12:02:28+09:00</published>
        <updated>2026-05-26T12:02:28+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/dragon-gate-waterfalls/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/dragon-gate-waterfalls/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;dragon-gate-waterfalls&amp;#x2F;cover.webp?h=2d6b60cd2b074bd491be&quot;
  alt=&quot;Cover&quot; width=&quot;2313&quot; height=&quot;1301&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;栃木県那須烏山市の江川にある「龍門の滝」をAVATA2で撮影してきました。
以下がその動画です。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;tSNsHG12jYw?si=5vyIa9Gd4gazp2H5&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;h2 id=&quot;江川について&quot;&gt;江川について&lt;&#x2F;h2&gt;
&lt;p&gt;「江川」という名前の川は栃木県内に2つあり、那珂川水系荒川支流の江川と、利根川水系巴波川支流の江川とがあります。龍門の滝がかかるのは前者です。矢板市の高原山南麓に源を発し、さくら市を経て那須烏山市向田で荒川に合流する、延長35.1キロメートルの一級河川です。JR烏山線の滝駅すぐ近くで段差を一気に落とすその場所が、今回訪れた龍門の滝にあたります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;龍門の滝について&quot;&gt;龍門の滝について&lt;&#x2F;h2&gt;
&lt;p&gt;幅およそ65メートル、落差およそ20メートル。横長の岩盤を水が階段状に滑り落ちる、迫力のある瀑布です。滝壺のすぐ手前まで遊歩道で降りられるため、規模を体感しやすい場所でもあります。&lt;&#x2F;p&gt;
&lt;p&gt;滝の中段には「男釜（おがま）」「女釜（めがま）」と呼ばれる2つの甌穴があり、直径約4メートルの男釜と直径約2メートルの女釜が並んでいます。この穴に大蛇が棲んでいたという伝説が、滝の名の由来です。近隣にある太平寺の僧侶が21日間祈祷したところ、満願の日に男釜から大蛇が現れて火炎を吐き、太平寺の仁王門に七巻半ほど巻き付いた、と伝わります。&lt;&#x2F;p&gt;
&lt;p&gt;滝の真上をJR烏山線が通っているのも特徴で、春には電車・滝・桜を一枚の画に収められる撮り鉄スポットとしても知られています。11月中旬から下旬には鮭の遡上が見られ、厳冬期にはまれに滝が凍結することもあるそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;撮影について&quot;&gt;撮影について&lt;&#x2F;h2&gt;
&lt;p&gt;訪れたのは新緑の季節でした。前日まで雨が続いた影響で水は少し濁っていましたが、滝の水量は十分です。当日は晴れの予報でしたが、撮影に入ったタイミングでちょうど雲が広がり、光がフラットになって階調を拾いやすい条件になりました。結果として、空撮の素材としてはむしろ扱いやすい光だったように思います。&lt;&#x2F;p&gt;
&lt;p&gt;周辺は森に囲まれていて、新緑の中で鳥たちのさえずりがよく響く、気持ちの良い環境です。栃木という土地柄、近隣で目撃情報が多いわけではないものの、念のため熊鈴だけは持って入りました。&lt;&#x2F;p&gt;
&lt;p&gt;撮影機材はDJI AVATA2で、設定や仕上げは&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;04&#x2F;dji-avata2-cinematic&#x2F;&quot;&gt;シネマティック設定ガイド&lt;&#x2F;a&gt;に書いた内容を踏襲しています。滝の正面を低くなめていくカットと、後退しながら全景を引いていくカットを中心に構成しました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">幅65メートル、落差20メートルの大瀑布、栃木県那須烏山市の龍門の滝。大蛇伝説と烏山線が真上を駆け抜ける珍しいロケーションを、DJI AVATA2で空撮してきました。
</summary>
        </entry><entry xml:lang="en">
        <title>Amazon S3からCloudflare R2への移行</title>
        <published>2026-05-22T00:00:00+00:00</published>
        <updated>2026-05-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/cloudflare-r2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/cloudflare-r2/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;cloudflare-r2&amp;#x2F;cover.webp?h=1e92776e8f350ad0d4c1&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;以前「&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;01&#x2F;blog-to-zola-aws-cleanup&#x2F;&quot;&gt;ブログをZolaに移行、AWSの後始末&lt;&#x2F;a&gt;」で、Next.js + Amplify構成のブログをZolaへ移し、Amplifyを含む大半のAWSリソースを削除しました。ただ、そのとき1つだけ削除せずに残したものがあります。有償のWEBフォントを配信するためのS3バケットとCloudFrontです。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、この最後のAWSリソースをCloudflare R2へ移した記録をまとめます。題材はフォント1つですが、個人ブログのスタティックなリソースをS3とR2のどちらに置くか、という選択の話でもあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;移行前の構成&quot;&gt;移行前の構成&lt;&#x2F;h2&gt;
&lt;p&gt;配信していたのは有償のWEBフォントです。このフォントはライセンス上、誰でもwoff2ファイルをダウンロードできる状態にしておくわけにはいきません。一方でWEBフォントである以上、ブラウザからは取得できる必要があります。この相反する要件を、移行前はAWS側で次のように満たしていました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-oac-1&quot;&gt;&lt;a href=&quot;#fn-oac&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;woff2ファイルをS3バケットに保管し、その前段のCloudFrontから配信&lt;&#x2F;li&gt;
&lt;li&gt;CloudFront FunctionでリクエストのRefererヘッダを検査し、ブログのドメイン以外からのアクセスを遮断&lt;&#x2F;li&gt;
&lt;li&gt;S3バケットポリシーにも同じReferer条件を設定し、CloudFrontを経由しないS3への直接アクセスも遮断&lt;&#x2F;li&gt;
&lt;li&gt;フォントがCloudFrontのドメイン(ブログとは別オリジン)から読み込まれるため、S3側のCORS設定でブログのドメインからの要求のみを許可&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ブログのCSSでは、すべての &lt;code&gt;@font-face&lt;&#x2F;code&gt; がこのCloudFrontのURLを参照していました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloudflare_R2_への移行&quot;&gt;Cloudflare R2 への移行&lt;&#x2F;h2&gt;
&lt;p&gt;ブログのワークロードは、すでにCloudflareに移っていました。ホスティングはCloudflare Workersの静的アセット配信で動いており、フォントだけをAWSに残しておく理由は薄くなっていました。配信元をS3 + CloudFrontからCloudflare R2に移すと、次のメリットがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AWSとCloudflareに分かれていたインフラの一本化&lt;&#x2F;li&gt;
&lt;li&gt;Referer制限のための仕組み(CloudFront Function・バケットポリシーの条件・CORS)の全廃&lt;&#x2F;li&gt;
&lt;li&gt;フォントの同一オリジン配信化(別オリジンへの &lt;code&gt;preconnect&lt;&#x2F;code&gt; やCSP調整が不要)&lt;&#x2F;li&gt;
&lt;li&gt;R2のストレージ無料枠(10GB)に収まる配信コスト&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に大きいのは2番目です。R2バケットは、公開設定を有効にしない限り外部から到達できるURLを持たず、フォントへのアクセス手段はWorkerからのR2 Bindingだけになります。S3 + CloudFrontでは、公開バケットへのアクセスをReferer条件で絞り込む必要がありました。R2では公開URLがそもそも存在しないため、アクセス元を判定する仕組み自体が要らなくなります。守るための要素が減ることは、設定ミスの余地が減ることでもあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;移行後の保護モデル&quot;&gt;移行後の保護モデル&lt;&#x2F;h2&gt;
&lt;p&gt;新しい構成では、フォントの保護を4つのレイヤーで担保しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;&#x2F;th&gt;&lt;th&gt;レイヤー&lt;&#x2F;th&gt;&lt;th&gt;設定の実体&lt;&#x2F;th&gt;&lt;th&gt;防ぐ脅威&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;バケット非公開&lt;&#x2F;td&gt;&lt;td&gt;r2.dev 無効・カスタムドメイン未割当・CORS なし&lt;&#x2F;td&gt;&lt;td&gt;バケット URL の直接スクレイプ、検索エンジンの索引&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;R2 Binding 経由のみ&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;[[r2_buckets]]&lt;&#x2F;code&gt; 宣言により同一 Cloudflare アカウント内に限定&lt;&#x2F;td&gt;&lt;td&gt;他アカウントや外部ネットワークからの参照&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;Worker が公開面を制限&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&#x2F;fonts&#x2F;&amp;lt;file&amp;gt;&lt;&#x2F;code&gt; パスのみを公開し、不正なキーは弾く&lt;&#x2F;td&gt;&lt;td&gt;パストラバーサル、任意キーの READ、バケット列挙&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;長寿命クレデンシャル不在&lt;&#x2F;td&gt;&lt;td&gt;R2 API トークンを発行しない&lt;&#x2F;td&gt;&lt;td&gt;コミットや CI ログ経由のトークン漏洩&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;設計の本質は、ライセンス違反が最も起きやすい経路、つまり公開バケットのURLがクローラに拾われて検索結果に載ることを消す点にあります。閲覧者がDevToolsからフォントを保存する行為や、第三者サイトからのホットリンクは別レイヤーの問題で、WEBフォント配信の仕組み上、完全には防げません。必要ならWorkerにReferer許可リストを足すこともできますが、今回は入れていません。私が利用しているフォントのライセンスでは、ライセンシーのドメインから配信することが求められていて、リクエスト元の検査までは要件になっていないためです。ただし、これはフォントごとに異なります。CORSやドメイン制限を技術的保護措置としてEULAで義務づけているフォントもあるので、利用するフォントのライセンスは必ず確認してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Worker_と_R2_の構成&quot;&gt;Worker と R2 の構成&lt;&#x2F;h2&gt;
&lt;p&gt;実装は驚くほど小さく収まりました。まずR2バケットを作成します(ここでは &lt;code&gt;web-fonts&lt;&#x2F;code&gt; という名前にします)。公開設定は無効のままにし、S3と同じキー名でwoff2をアップロードします。あとはWorkerからbindingでつなぐだけです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;wrangler.toml&lt;&#x2F;code&gt; にR2バケットのbindingを宣言します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot; data-name=&quot;wrangler.toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;blog&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;src&#x2F;index.js&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;compatibility_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;2026-02-17&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;assets&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;.&#x2F;public&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;binding&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ASSETS&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;r2_buckets&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;binding&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;FONTS&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;bucket_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;web-fonts&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Worker本体は、&lt;code&gt;&#x2F;fonts&#x2F;&lt;&#x2F;code&gt; で始まるリクエストをR2に取り次ぎ、それ以外は静的アセットに渡すだけです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot; data-name=&quot;src&#x2F;index.js&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; FONTS_PREFIX&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;fonts&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;export default&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;  async&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;req&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(req&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js z-source&quot;&gt;url)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pathname&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;startsWith&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-constant z-js&quot;&gt;(FONTS_PREFIX))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; decodeURIComponent&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pathname&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;FONTS_PREFIX&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;length))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      &#x2F;&#x2F; Only flat keys in R2 (no subdir, no traversal). Anything else falls&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      &#x2F;&#x2F; through to static assets — the theme also publishes under &#x2F;fonts&#x2F;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;includes&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;..&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;includes&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; obj&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;FONTS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt;obj&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;          const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          obj&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;writeHttpMetadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt;headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Content-Type&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;font&#x2F;woff2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Cache-Control&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;public, max-age=31536000, immutable&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;ETag&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; obj&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js z-source&quot;&gt;httpEtag)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;          return&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Response&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(obj&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;body&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt; headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;ASSETS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-js&quot;&gt;req&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;最後にCSSの参照先を書き換えます。&lt;code&gt;@font-face&lt;&#x2F;code&gt; の &lt;code&gt;src&lt;&#x2F;code&gt; は、これまでCloudFrontの絶対URLを指していましたが、同一オリジンの相対パス &lt;code&gt;&#x2F;fonts&#x2F;&lt;&#x2F;code&gt; に変わります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;css&quot; data-name=&quot;custom.css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-keyword z-keyword&quot;&gt;@font-face&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  font-family&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;WebFont&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;fonts&#x2F;WebFont-Regular.woff2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    format&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;woff2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  font-display&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; swap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  font-weight&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 400&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  font-style&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; normal&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;CSS内のすべての &lt;code&gt;@font-face&lt;&#x2F;code&gt; で、CloudFrontの絶対URLを &lt;code&gt;&#x2F;fonts&#x2F;&lt;&#x2F;code&gt; で始まる相対パスに置き換えます。デプロイはmainへのpushでGitHub Actionsが &lt;code&gt;wrangler deploy&lt;&#x2F;code&gt; を実行する流れに乗せます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;つまずいた点&quot;&gt;つまずいた点&lt;&#x2F;h2&gt;
&lt;p&gt;デプロイ用のAPIトークンの権限不足でつまずきました。GitHub Actionsが使う &lt;code&gt;CLOUDFLARE_API_TOKEN&lt;&#x2F;code&gt; は旧構成(静的アセット配信のみ)のときに発行したもので、Workers Scriptsの編集権限しかありませんでした。R2 bindingを含むWorkerを &lt;code&gt;wrangler deploy&lt;&#x2F;code&gt; すると、宣言したバケットの存在確認でR2のAPIを呼び出すため、初回のpushは &lt;code&gt;code: 10000 Authentication error&lt;&#x2F;code&gt; で失敗しました。&lt;&#x2F;p&gt;
&lt;p&gt;幸い、Cloudflare Workersのデプロイは原子的です。失敗時は旧Workerが稼働し続けるため、復旧作業中もサイトは旧CloudFront経由でフォントを配信し続け、見た目は保たれていました。&lt;&#x2F;p&gt;
&lt;p&gt;対応として、APIトークンにAccountスコープの &lt;code&gt;Workers R2 Storage: Edit&lt;&#x2F;code&gt; を追加しました。最終的に付与した権限セットは次のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;スコープ&lt;&#x2F;th&gt;&lt;th&gt;パーミッション&lt;&#x2F;th&gt;&lt;th&gt;用途&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Account&lt;&#x2F;td&gt;&lt;td&gt;Workers Scripts: Edit&lt;&#x2F;td&gt;&lt;td&gt;Worker スクリプトのデプロイ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Account&lt;&#x2F;td&gt;&lt;td&gt;Workers R2 Storage: Edit&lt;&#x2F;td&gt;&lt;td&gt;R2 binding 宣言時のバケット存在確認&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Account&lt;&#x2F;td&gt;&lt;td&gt;Account Settings: Read&lt;&#x2F;td&gt;&lt;td&gt;アカウント情報の照会&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Zone&lt;&#x2F;td&gt;&lt;td&gt;Workers Routes: Edit&lt;&#x2F;td&gt;&lt;td&gt;カスタムルートの設定&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;User&lt;&#x2F;td&gt;&lt;td&gt;Memberships: Read&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&#x2F;memberships&lt;&#x2F;code&gt; API の呼び出し&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;User&lt;&#x2F;td&gt;&lt;td&gt;User Details: Read&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;wrangler whoami&lt;&#x2F;code&gt; 相当の照会&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Cloudflare公式の「Edit Cloudflare Workers」テンプレートにはR2の権限が含まれていません。新しいbinding(R2 &#x2F; D1 &#x2F; KV &#x2F; Queuesなど)をWorkerに足すときは、デプロイ前にCIトークンの権限を見直すのが安全です。トークンを差し替えたあとは、失敗したジョブだけを再実行しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;DEPLOY_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run list --branch main&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --workflow=&amp;quot;&amp;lt;デプロイ用ワークフロー名&amp;gt;&amp;quot; --limit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --json databaseId --jq &amp;#39;.[0].databaseId&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; run rerun &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DEPLOY_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; --failed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;AWS_リソースの撤去&quot;&gt;AWS リソースの撤去&lt;&#x2F;h2&gt;
&lt;p&gt;R2配信が本番で安定したことを確認してから、AWS側を停止しました。撤去対象はCloudFrontディストリビューション、CloudFront Function、S3バケットの3つです。ディストリビューションIDは &lt;code&gt;aws cloudfront list-distributions&lt;&#x2F;code&gt;、バケット名は &lt;code&gt;aws s3 ls&lt;&#x2F;code&gt; で確認できます。以降のコマンドでは、それぞれの識別子を変数に入れてあるものとします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&amp;lt;対象ディストリビューションのID&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;FUNCTION_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&amp;lt;Referer を検査していた CloudFront Function 名&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;BUCKET&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&amp;lt;フォントを置いていた S3 バケット名&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;CloudFrontディストリビューションは、いきなり削除できません。先に &lt;code&gt;Enabled = false&lt;&#x2F;code&gt; で無効化し、設定が全エッジに伝播するのを待ってから削除します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront get-distribution-config --id &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;  &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;tmp&#x2F;dist-config.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -r &amp;#39;.ETag&amp;#39; &#x2F;tmp&#x2F;dist-config.json&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;tmp&#x2F;dist-etag.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;.DistributionConfig | .Enabled = false&amp;#39; &#x2F;tmp&#x2F;dist-config.json&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;  &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;tmp&#x2F;dist-config-disabled.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront update-distribution --id &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --if-match &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;tmp&#x2F;dist-etag.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --distribution-config &amp;quot;file:&#x2F;&#x2F;&#x2F;tmp&#x2F;dist-config-disabled.json&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;update-distribution&lt;&#x2F;code&gt; は &lt;code&gt;Status: InProgress&lt;&#x2F;code&gt; を返します。&lt;code&gt;Status: Deployed&lt;&#x2F;code&gt; に戻るまで伝播を待ちます(実測で約3分)。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;until&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront get-distribution --id &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;Distribution.Status&amp;#39; --output text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Deployed&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  sleep&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;Deployed&lt;&#x2F;code&gt; に戻ったら削除します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;ETAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront get-distribution --id &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;ETag&amp;#39; --output text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront delete-distribution --id &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DIST_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; --if-match &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$ETAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;CloudFront Functionの削除では、&lt;code&gt;describe-function&lt;&#x2F;code&gt; で取得した現在のETagを &lt;code&gt;delete-function&lt;&#x2F;code&gt; に渡します。注意点として、FunctionはDEVELOPMENTとLIVEの2つのステージを持ち、両者を別々に更新しているとETagが食い違います。私の環境ではDEVELOPMENT側が新しく、&lt;code&gt;describe-function --stage DEVELOPMENT&lt;&#x2F;code&gt; で取ったETagでなければ &lt;code&gt;PreconditionFailed&lt;&#x2F;code&gt; になりました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;ETAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront describe-function --name &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$FUNCTION_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --stage DEVELOPMENT --query &amp;#39;ETag&amp;#39; --output text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; cloudfront delete-function --name &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$FUNCTION_NAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; --if-match &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$ETAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;最後にS3バケットを空にして削除します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; s3 rm &amp;quot;s3:&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$BUCKET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; --recursive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; s3api delete-bucket --bucket &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$BUCKET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ACM証明書は、CloudFrontのデフォルトドメイン(&lt;code&gt;*.cloudfront.net&lt;&#x2F;code&gt;)のまま運用していて発行していなかったため、削除対象はありませんでした。これでフォント配信に関わるAWSリソースはすべて無くなり、配信はR2経由に一本化されました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;移行して変わったこと&quot;&gt;移行して変わったこと&lt;&#x2F;h2&gt;
&lt;p&gt;移行の前後で、AWS側にあったCloudFrontディストリビューション、CloudFront Function、S3バケット、バケットポリシー、CORS設定がすべて消えました。残ったのはR2バケット1つと、ごく短いWorkerスクリプト1つです。&lt;&#x2F;p&gt;
&lt;p&gt;今回移したのはフォント一式というごく小さなリソースで、Cloudflareの無料枠の範囲で十分にまかなえています。コスト面より、管理対象のサービス数が減ったことのほうが効きます。フォント1種類のためにCloudFrontとS3とFunctionの3サービスを横断して設定を追っていた状態から、Cloudflareのダッシュボード内で完結する状態になりました。&lt;&#x2F;p&gt;
&lt;p&gt;今回はフォントが題材でしたが、結論はもっと一般的だと考えています。個人ブログのスタティックなリソースの置き場所としては、Amazon S3 + CloudFrontよりもCloudflare R2のほうが向いています。R2なら公開URLを持たせずにWorkerから読め、S3のように公開バケットを設定で囲い込む手間がいりません。ホスティングがCloudflareにあれば置き場も同じプラットフォームにまとまり、費用も無料枠と転送料無料で個人規模なら気になりません。&lt;&#x2F;p&gt;
&lt;p&gt;S3が劣るという話ではありません。ただ、個人ブログの規模で、すでにCloudflareを使っているなら、スタティックなリソースはR2に置くのが素直な選択だと思います。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-oac&quot;&gt;
&lt;p&gt;より確実な構成にするなら、S3バケットを非公開にしてOAC(Origin Access Control)経由でのみ読ませる方法もありました。ただしWEBフォントはページの一部としてブラウザに読み込まれる以上、閲覧者によるダウンロードまで完全に防ぐことはどのみちできません。完全な防御は不可能だという前提で、ある程度は妥協した構成でした。 &lt;a href=&quot;#fr-oac-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">ブログに最後まで残っていたAWSリソースは、有償WEBフォントの
配信でした。これをAmazon S3とCloudFrontからCloudflare R2へ
移した記録であり、個人ブログのスタティックなリソースを
どこに置くべきかを考える材料でもあります。
</summary>
        </entry><entry xml:lang="en">
        <title>NVIDIAを救った入交昭一郎氏</title>
        <published>2026-05-22T07:38:24+09:00</published>
        <updated>2026-05-22T07:38:24+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/sega-nvidia/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/sega-nvidia/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;sega-nvidia&amp;#x2F;cover.webp?h=de8fd6da8cddecda4121&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;NVIDIAのジェンスン・ファンCEOが5月米カーネギーメロン大学の卒業式のスピーチで、セガとのエピソードを語りました。
日本でも『NVIDIAジェンスン・ファンCEO「日本のセガがエヌビディアの危機を救った」』
という記事で報道されています。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;ジェンスン・ファンCEOのスピーチ&quot;&gt;ジェンスン・ファンCEOのスピーチ&lt;&#x2F;h2&gt;
&lt;p&gt;ファン氏のスピーチは、以下の動画で視聴できます。創業初期に日本のセガから資金支援を受け、危機を乗り切った話が披露されています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;FZh_0uRgrg4&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;その決断を下したのが、当時セガの米国法人を率いていた入交昭一郎氏です。
たまたま私は今『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;49adXFa&quot;&gt;ホンダ二輪戦士たちの闘い&lt;&#x2F;a&gt;』という1970年代〜1980年代にかけてホンダが二輪レースWGPに挑んだ
ドキュメンタリーを読んでいて、そこにも彼が登場するので目を引きました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セガによるNVIDIA支援&quot;&gt;セガによるNVIDIA支援&lt;&#x2F;h2&gt;
&lt;p&gt;NVIDIAは1993年に創業した、当時はまだ無名のグラフィックス半導体スタートアップでした。
1990年代後半、同社はセガの次世代ゲーム機ドリームキャスト向けのGPU共同開発を受託します。ところが、開発は次第に行き詰まり、技術的な方針転換が必要となります。&lt;&#x2F;p&gt;
&lt;p&gt;追い詰められたファン氏は自ら来日し、入交氏に対して技術判断の誤りを認め、開発契約の解除を申し出るとともに、開発資金の援助を依頼します。契約を履行できず打ち切る側が、同時に資金援助を懇願するという、かなり異例の場面でした。&lt;&#x2F;p&gt;
&lt;p&gt;これに対して入交氏は、セガがNVIDIAの未公開株式を引き受ける形で数百万ドル規模の資金を提供します。ホンダ出身の技術者だった入交氏は、技術開発には失敗のリスクがつきものだと理解していたのでしょう。この資金でNVIDIAは約6カ月の猶予を得て、その間に独自方式を捨てて業界標準へと舵を切る「奇跡のピボット」を成し遂げます。これが現在のAI半導体企業としての地位につながった、とファン氏は振り返っています。&lt;&#x2F;p&gt;
&lt;p&gt;ファン氏が卒業生に伝えたかったのは、CEOとは権力を振るう存在ではなく会社を存続させる責任を負う立場だということ、そして誠実さと謙虚さを示せば寛大さで報われるということでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ホンダのNR500の挑戦&quot;&gt;ホンダのNR500の挑戦&lt;&#x2F;h2&gt;
&lt;p&gt;NVIDIAを救った入交氏の判断を、私はホンダ時代の経歴と切り離して考えられません。入交氏は東京大学で航空工学を学び、1963年にホンダへ入社、世界GPを戦うレーサーのエンジン設計から技術者人生を始めた人物です。&lt;&#x2F;p&gt;
&lt;p&gt;そして1978年、ホンダの研究所で常務に就いた入交氏は、NR500の開発を主導することとなります。NR500は、ホンダがバイクレースの最高峰WGPのGP500クラス復帰のために投入した4ストロークマシンです。2ストロークが全盛だった時代に、あえて4ストロークで頂点を狙った「夢のマシン」でした。&lt;&#x2F;p&gt;
&lt;p&gt;なぜホンダは、勝つだけならはるかに有利な2ストロークを選ばなかったのでしょうか。当時のGP500クラスは、スズキやヤマハの2ストローク勢がタイトルを独占していました。同じ排気量なら、燃焼回数が倍になる2ストロークのほうが出力で大きく有利です。それでもホンダが4ストロークにこだわったのは、「うちは4ストローク屋だ」という社内の意識と、他社の模倣を嫌い独自技術で勝つという本田宗一郎以来の社風があったからです。市販車の多くを4ストロークが占めるホンダにとって、2ストロークで勝っても得るものは大きくありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;問題は、4ストロークでどう2ストロークの出力に対抗するかでした。答えは、回転数を極限まで上げ、それに見合う吸排気量を確保することです。NR500が見据えたのは2万回転という途方もない領域でした。高回転には小さく軽いピストンと多くの気筒が有利で、ホンダは1960年代に多気筒の超高回転レーサーで世界を制した実績も持っていました。ところがGP500クラスの規則は、気筒数を最大4気筒に制限していました。気筒数で攻めたいホンダにとって、この上限は大きな壁でした。その壁を越えるための解が、円形シリンダーを2つつなげた長円形のピストンです。1つの気筒に2本のコンロッドと8つのバルブを収めれば、4気筒のままV型8気筒に匹敵する吸排気を確保できます。NR500とは、規則の枠内で4ストロークの限界を押し広げるための、緻密な逆算から生まれたマシンでした。&lt;&#x2F;p&gt;
&lt;p&gt;結果は、レースでは惨敗に近いものでした。ホンダはほどなく現実的な2ストロークのNS500へ切り替え、1983年にはフレディ・スペンサーがそのNS500で500ccクラスの世界王者に輝きます。それでもNR500で培われた楕円ピストンの加工技術やバルブ駆動系のノウハウは、後のエンジン開発や1992年発売の市販車NR750に受け継がれました。失敗から学び、次へつなぐ。NR500はその典型例として語り継がれています。&lt;&#x2F;p&gt;
&lt;p&gt;つまり入交氏は、技術的に野心的すぎる賭けに出て短期的には敗れ、その経験が後の財産になるというプロセスを、自らの手で経験した人物でした。独自技術路線から既存技術への方針転換という痛みは、入交氏自身がよく知るものでした。だからこそ、ファン氏が独自技術に固執して行き詰まったと頭を下げに来たとき、その痛みと、その先にある可能性の両方を理解できたのだと思います。ホンダ出身の技術者だったからというだけでなく、NR500という夢のマシンを担いだ当事者だったからこその寛容さだったと考えると、あの救済劇の筋が腑に落ちます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;夢に破れたセガ・ドリームキャスト&quot;&gt;夢に破れたセガ・ドリームキャスト&lt;&#x2F;h2&gt;
&lt;p&gt;ここで皮肉なのは、NVIDIAを救ったセガ自身が、そのドリームキャストで敗れ去ったことです。&lt;&#x2F;p&gt;
&lt;p&gt;ドリームキャストは1998年11月に日本で、翌1999年9月に北米で発売され、出だしこそ好調でした。しかし2001年3月に生産を終了し、セガはこれを最後に家庭用ゲーム機のハードウェア事業から撤退します。&lt;&#x2F;p&gt;
&lt;p&gt;敗因はいくつも重なっていました。
1999年に発表されたPS2は、DVD再生機能という当時としては強力な訴求力を持ち市場は「PS2待ち」のムードに傾きます。ドリームキャストはEAをはじめとする主要サードパーティの支持を得られず、とりわけ北米市場でスポーツタイトルが手薄だったことも痛手でした。
サターン以来の度重なる苦戦で小売店や消費者の信頼の摩耗、脆弱なコピー対策での違法コピー横行が追い打ちをかけます。&lt;&#x2F;p&gt;
&lt;p&gt;そして救済劇との関連で言えば、ドリームキャストのGPUに最終的に採用されたのはNVIDIAではなく、NECとビデオロジックが手がけたPowerVR2でした。ピボット後のNVIDIAはRIVA TNT系でPCグラフィックス市場へ向かい、これが正解となります。当時、Windows向けのアクセラレータ付きグラフィックカードとしては、NVIDIAがトップブランドでした。&lt;&#x2F;p&gt;
&lt;p&gt;救った側のセガがハード事業から去り、救われた側が世界最大級の半導体企業へと駆け上がっていく。入交氏の判断の大きさと同時に、ハードウェアビジネスの残酷さを感じずにはいられません。&lt;&#x2F;p&gt;
&lt;p&gt;撤退後のセガは、ハードメーカーからソフトメーカーへと舵を切りました。2004年にはパチスロ・パチンコ大手のサミーと経営統合してセガサミーホールディングスとなり、『龍が如く』『ペルソナ』『ソニック』といった有力IPを抱えるエンターテインメント企業として生き残っていきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;人類史上最も高くついた利益確定&quot;&gt;人類史上最も高くついた利益確定&lt;&#x2F;h2&gt;
&lt;p&gt;入交氏の決断はNVIDIAを救いました。では、セガはその見返りを得られたのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;セガの米国法人は、約500万ドルの出資でNVIDIAの未公開株を取得していました。NVIDIAは1999年1月に株式を公開します。そしてセガがこの株式を1500万ドルで売却したのは、入交氏がすでにセガの社長を退いたあとのことでした。差し引き1000万ドル、3倍のキャピタルゲインです。ドリームキャストの不振にあえいでいた当時のセガにとって、これは経営の足しになる現金でした。判断としては、何もおかしくありません。&lt;&#x2F;p&gt;
&lt;p&gt;問題は、その後のNVIDIAの成長です。セガが株式を手放した時点ではまだ小さな半導体メーカーだったNVIDIAの時価総額は、いまや数兆ドル規模に達しています。仮にセガがあの株式を売らずに持ち続けていたら、その価値は兆円単位に膨らんでいた計算になります。ドリームキャストが残した赤字も、ハード事業撤退に伴う特別損失も、2023年に買収したRovio（『Angry Birds』の開発元）で2026年に計上した約300億円の減損損失ですら、すべて飲み込んでなお余りある規模です。それは、セガサミーホールディングスそのものの時価総額をも上回ってしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;このエピソードは、2024年以降にNVIDIAが時価総額で世界の頂点を争う企業になって以降、「人類史上最も高くついた利益確定」として繰り返し語られるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、後出しでセガの判断を責めるのは酷だとも思います。
当時のNVIDIAは、3dfxなどの先行者に押される赤字スタートアップでしかありませんでした。当時のセガには、株を売らなければ生き延びられないという事情があったのかもしれません。目先の資金繰りにバランスシートを合わせにいった結果、長期で育つはずの卵を手放してしまう。株式は長期で持つのが基本だと考える私のような人間からすると、これはなかなか身につまされる話です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;入交氏のその後&quot;&gt;入交氏のその後&lt;&#x2F;h2&gt;
&lt;p&gt;入交氏は、2000年6月にドリームキャスト商戦の責任を取ってセガの社長を退きました。&lt;&#x2F;p&gt;
&lt;p&gt;その後のキャリアは、技術者ど真ん中だったホンダ・セガ時代とは少し趣が変わります。入交氏は2001年に個人事務所を立ち上げ、複数の企業で社外取締役や顧問を務める歩みに移っていきました。自動車部品メーカーの経営に携わるなど、自動車屋としてのルーツに戻る場面もありました。セガ時代の仕事として意外と知られていないのが、人気シリーズ『サクラ大戦』の製作総指揮です。&lt;&#x2F;p&gt;
&lt;p&gt;そして2024年以降、NVIDIAが時価総額で世界の頂点を争う企業になったことで、入交氏は「NVIDIAを救った男」として一気に再評価されました。口火を切ったのは2024年5月のウォール・ストリート・ジャーナルの報道です。2025年には、入交氏が出演するラジオ番組にファン氏がビデオメッセージを寄せるなど、四半世紀越しの交流が公の場で見えるようになっています。1940年1月生まれの入交氏は、86歳になったいまも精力的に語り続けています。&lt;&#x2F;p&gt;
&lt;p&gt;ホンダで夢のレーサーを設計し、セガでドリームキャストを担ぎ、最後はNVIDIA物語の恩人として表舞台に戻る。その人生の弧は、ほとんど映画の脚本のようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;NVIDIAのジェンスン・ファンCEOが語ったセガの逸話は、美談として広く受け取られました。実際それは、誠実さと謙虚さが寛大さで報われた物語です。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、私がこの話に惹かれたのは、入交昭一郎という一人の技術者の人生に、奇妙な一貫性を見たからです。楕円ピストンのNR500も、ドリームキャストも、入交氏が関わった「夢のマシン」はいずれも野心的すぎる賭けで、商業的には敗れました。それでも、技術的な失敗のリスクを身をもって知っていたからこそ、入交氏はNVIDIAというもう1つの夢に手を差し伸べることができたのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;冒頭で触れた『ホンダ二輪戦士たちの闘い』を読んでいなければ、私はこのニュースを巨大企業の創業秘話として読み流していたかもしれません。1つの判断の裏側には、それを下した人の来歴があります。NVIDIAを救ったのはセガであり、そのセガを動かしたのは、夢のマシンを担ぎ続けた一人の技術者でした。&lt;&#x2F;p&gt;
</content>
        <summary type="html">NVIDIAのジェンスン・ファンCEOが、創業初期の危機を救ったのは日本のセガだったと卒業式で明かしました。決断を下した入交昭一郎氏は、今たまたま読んでいた『ホンダ二輪戦士たちの闘い』に登場する技術者でした。彼は、ホンダが1970年代後半に二輪レースの最高峰GP500への復帰に際して開発した夢のレーサーNR500をリードした技術者だったのです。</summary>
        </entry><entry xml:lang="en">
        <title>RICOH GR IV Monochrome を買うべき理由と推奨設定</title>
        <published>2026-05-21T00:00:00+00:00</published>
        <updated>2026-05-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/gr-iv-monochrome/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/gr-iv-monochrome/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;gr-iv-monochrome&amp;#x2F;cover.webp?h=58d5ea91de83e166dce6&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;675&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;これまで使ってきたRICOH GR IIIx HDFを手放し、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ricoh-imaging.co.jp&#x2F;japan&#x2F;products&#x2F;gr-4-mono&#x2F;&quot;&gt;RICOH GR IV Monochrome&lt;&#x2F;a&gt; を購入しました。モノクロ写真しか撮れない、店頭価格で28万円前後という、かなりニッチで高価なカメラです。一見すると不便さにお金を払ったようにも見えますが、しばらく持ち歩いてみて、この選択には理由があったと感じています。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;40mm_の_GR_IIIx_を手放した理由&quot;&gt;40mm の GR IIIx を手放した理由&lt;&#x2F;h2&gt;
&lt;p&gt;GR IIIxは、35mm判換算で40mm相当の単焦点レンズを積んだモデルです。スマートフォンのカメラは広角寄りの画角が主役なので、GR IIIxの40mmとはちょうど守備範囲が分かれます。広く写したいときはスマートフォン、もう少し寄って切り取りたいときはGR、という使い分けが自然にできました。標準レンズに近い40mmは被写体との距離感もつかみやすく、スナップ用のサブ機としてとても便利でした。&lt;&#x2F;p&gt;
&lt;p&gt;それでも手放したのは、純粋にGR IV Monochromeが欲しかったからです。便利なカメラを失う惜しさはありましたが、モノクロ専用機がどんな写真を見せてくれるのか、どうしても自分で試してみたくなりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;モノクロ専用センサーの鮮明さ&quot;&gt;モノクロ専用センサーの鮮明さ&lt;&#x2F;h2&gt;
&lt;p&gt;GR IV Monochromeの核心は、モノクロ撮影に特化したAPS-CサイズのCMOSセンサーです。有効画素数は約2574万画素で、ここまでは標準のGR IVと大きく変わりません。決定的に違うのは、このセンサーがカラーフィルターを持たないことです。&lt;&#x2F;p&gt;
&lt;p&gt;一般的なカラーセンサーは、画素ごとに赤・緑・青いずれかのカラーフィルターを敷き詰めたベイヤー配列になっています。各画素は一色分の明るさしか記録できないため、足りない色は周囲の画素から補間して作り出します。モノクロ専用センサーはこのカラーフィルターを持たず、補間処理も行いません。すべての画素が輝度をそのまま受け取るので、解像感が高まり、高感度でのノイズ耐性も向上します。ISO 409600までの高感度を実現できているのも、この構造によるものです。&lt;&#x2F;p&gt;
&lt;p&gt;実際に撮ってみると、撮って出しの鮮明さに驚かされました。輪郭のキレと階調のなめらかさが両立していて、カラー機で撮った写真をモノクロ現像した画像とは明らかに質感が違います。色を捨てた代わりに、明暗の情報をすべて画作りに回している、と言えばよいでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;もうひとつGR IV Monochromeならではの装備が、内蔵の赤フィルターです。標準のGR IVが内蔵するNDフィルターの代わりに、こちらには赤フィルターが組み込まれています。デジタルの効果ではなく、センサーに光が届く前に物理的に作用するフィルターなので、カラーフィルターを持たないモノクロセンサーではフィルム時代と同じように効きます。青空を暗く落としてコントラストを強めるという古典的な表現を、カメラ内で完結させられます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;スナップシューターには28mm&quot;&gt;スナップシューターには28mm&lt;&#x2F;h2&gt;
&lt;p&gt;GR IV Monochromeのレンズは、35mm判換算で28mm相当のF2.8です。GRが長くスナップシューターとして支持されてきたのも、この28mmという画角あってのことです。&lt;&#x2F;p&gt;
&lt;p&gt;28mmは被写体だけでなく、その周囲の状況までフレームに収まります。歩きながら素早くカメラを構えても破綻しにくく、ファインダーを覗かずに撮っても画面が成立します。とっさの一枚を拾うには、やはり28mmのほうが扱いやすいと感じます。40mmは意図してフレーミングする画角で、それはそれで楽しいのですが、反射的に切り取るスナップとは少し相性が違います。&lt;&#x2F;p&gt;
&lt;p&gt;スマートフォンとの画角のすみ分けという点では、40mmのGR IIIxに分がありました。28mmはスマートフォンのメインカメラと画角が近いからです。それでも、同じ画角ならセンサーサイズと写りの差は歴然としています。スナップ機として気軽に構えられるのは、やはり28mmだと感じています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;マニュアルモードのISO感度の目安&quot;&gt;マニュアルモードのISO感度の目安&lt;&#x2F;h2&gt;
&lt;p&gt;使い始めたばかりですが、基本はマニュアルモードで撮っています。絞りとシャッタースピードは被写体と意図に応じてその都度決め、ISOだけはシーン別の目安を次の表にまとめます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;シーン&lt;&#x2F;th&gt;&lt;th&gt;ISO&lt;&#x2F;th&gt;&lt;th&gt;備考&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;晴天屋外&lt;&#x2F;td&gt;&lt;td&gt;160&lt;&#x2F;td&gt;&lt;td&gt;ベース感度で粒子感を抑える&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;曇天・日陰&lt;&#x2F;td&gt;&lt;td&gt;400&lt;&#x2F;td&gt;&lt;td&gt;コントラストが落ちるシーン&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;室内（窓際・明るい）&lt;&#x2F;td&gt;&lt;td&gt;800&lt;&#x2F;td&gt;&lt;td&gt;自然光メインの環境&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;室内（一般・カフェ）&lt;&#x2F;td&gt;&lt;td&gt;3200&lt;&#x2F;td&gt;&lt;td&gt;蛍光灯・電球下&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;夕暮れ・マジックアワー&lt;&#x2F;td&gt;&lt;td&gt;1600&lt;&#x2F;td&gt;&lt;td&gt;光量変動が速いシーン&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;夜のスナップ&lt;&#x2F;td&gt;&lt;td&gt;6400&lt;&#x2F;td&gt;&lt;td&gt;グレイニーと相性良&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;夜の暗所（街灯のみ等）&lt;&#x2F;td&gt;&lt;td&gt;25600&lt;&#x2F;td&gt;&lt;td&gt;ノイズは意図的に活かす&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;表のISOは、シーンに入った時点でまず決め打ちする値です。絞りとシャッタースピードは、そのISOを前提として、被写界深度や動きの表現意図に応じて自由に決めています。&lt;&#x2F;p&gt;
&lt;p&gt;許容できるISOの上限は、選んでいるイメージコントロールによって変わります。グレイニーはISOを上げ気味にしても破綻しにくいので、102400あたりまでを許容範囲としています。一方、スタンダードとソリッドはノイズが目立ちやすいため、スタンダードは1600、ソリッドは800を上限の目安にしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ユーザーモードの設定&quot;&gt;ユーザーモードの設定&lt;&#x2F;h2&gt;
&lt;p&gt;マニュアルモードを基本にしつつ、ユーザーモードも併用しています。ユーザーモードは6つまで登録でき、そのうち3つをモードダイヤルに割り当てられるので、ダイヤルには現在この3つを設定しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;U1_Street&quot;&gt;U1 Street&lt;&#x2F;h3&gt;
&lt;p&gt;街歩きで最も多用する設定です。通常はオートエリアAFと顔・瞳検出にまかせつつ、シャッターボタンを一気に押し込むフルプレススナップを有効にしているので、とっさの場面ではAFの合焦を待たず約2.5mの位置で即座に切り取れます。絞りはF5.6で被写界深度を確保し、ISOの上限を102400まで開放しているため、日中から夜の街灯下まで設定を変えずに対応できます。粒子が乗っても作品として成立するグレイニーを選んでいるのも、この広い感度幅を許容するためです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;フォーカス オートエリアAF&lt;&#x2F;li&gt;
&lt;li&gt;顔・瞳検出オン&lt;&#x2F;li&gt;
&lt;li&gt;フルプレススナップ オン&lt;&#x2F;li&gt;
&lt;li&gt;スナップ撮影距離2.5m&lt;&#x2F;li&gt;
&lt;li&gt;露出モードAv&lt;&#x2F;li&gt;
&lt;li&gt;絞りF5.6&lt;&#x2F;li&gt;
&lt;li&gt;ISO Auto、下限160、上限102400&lt;&#x2F;li&gt;
&lt;li&gt;低速限界値1&#x2F;320秒&lt;&#x2F;li&gt;
&lt;li&gt;露出補正 -0.3EV&lt;&#x2F;li&gt;
&lt;li&gt;測光中央重点&lt;&#x2F;li&gt;
&lt;li&gt;イメージコントロール グレイニー&lt;&#x2F;li&gt;
&lt;li&gt;赤色フィルター オフ（Fnで都度オン）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;U2_Cafe&quot;&gt;U2 Cafe&lt;&#x2F;h3&gt;
&lt;p&gt;カフェや店内で、料理や小物をじっくり撮るための設定です。被写体が静止しているのでフルプレススナップは切り、ピンポイントAFで狙った一点に正確にピントを合わせます。絞りはF2.8まで開けて室内の光を取り込みながら背景を軽くぼかし、測光はハイライト重点にして窓際の明るさで白飛びさせないようにしています。粒子は抑えたいので、イメージコントロールはスタンダード、ISOの上限も12800までにとどめています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;フォーカス ピンポイントAF&lt;&#x2F;li&gt;
&lt;li&gt;顔・瞳検出オフ&lt;&#x2F;li&gt;
&lt;li&gt;フルプレススナップ オフ&lt;&#x2F;li&gt;
&lt;li&gt;露出モードAv&lt;&#x2F;li&gt;
&lt;li&gt;絞りF2.8&lt;&#x2F;li&gt;
&lt;li&gt;ISO Auto、下限160、上限12800&lt;&#x2F;li&gt;
&lt;li&gt;低速限界値1&#x2F;60秒&lt;&#x2F;li&gt;
&lt;li&gt;露出補正 -0.3EV&lt;&#x2F;li&gt;
&lt;li&gt;測光ハイライト重点&lt;&#x2F;li&gt;
&lt;li&gt;イメージコントロール スタンダード&lt;&#x2F;li&gt;
&lt;li&gt;赤色フィルター オフ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;U3_Landscape&quot;&gt;U3 Landscape&lt;&#x2F;h3&gt;
&lt;p&gt;風景を画面の隅々までシャープに写すための設定です。フォーカスを5m固定のスナップにし、F8まで絞り込むことで、手前から奥までピントの合ったパンフォーカスが得られます。測光は画面全体をバランスよく見る分割測光、イメージコントロールはコントラストの強いソリッドにして、風景の輪郭を引き締めます。青空を深く落としたいときは、Fnボタンに割り当てた赤色フィルターをその場でオンにします。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;フォーカス スナップ&lt;&#x2F;li&gt;
&lt;li&gt;顔・瞳検出オフ&lt;&#x2F;li&gt;
&lt;li&gt;スナップ撮影距離5m&lt;&#x2F;li&gt;
&lt;li&gt;露出モードAv&lt;&#x2F;li&gt;
&lt;li&gt;絞りF8&lt;&#x2F;li&gt;
&lt;li&gt;ISO Auto、下限160、上限6400&lt;&#x2F;li&gt;
&lt;li&gt;低速限界値1&#x2F;80秒&lt;&#x2F;li&gt;
&lt;li&gt;露出補正 -0.3EV&lt;&#x2F;li&gt;
&lt;li&gt;測光分割&lt;&#x2F;li&gt;
&lt;li&gt;イメージコントロール ソリッド&lt;&#x2F;li&gt;
&lt;li&gt;赤色フィルター オフ（Fnで都度オン）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;作例&quot;&gt;作例&lt;&#x2F;h2&gt;
&lt;p&gt;購入してはじめての散歩で撮った写真を、Flickrのアルバム「First Walk with GR IV Monochrome」にまとめました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;yostos&#x2F;albums&#x2F;72177720333676893&quot; title=&quot;First Walk with GR IV Monochrome&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;55271936895_c2c0e2e348_b.jpg&quot; width=&quot;1024&quot; height=&quot;768&quot; alt=&quot;First Walk with GR IV Monochrome&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;GR IV Monochrome は人気が高く、私の場合も入手までにそれなりの時間がかかりました。簡単に手に入るカメラではありません。それでも、モノクロしか撮れないという割り切りは、思っていたほど不自由ではありませんでした。色という情報がない分、光と陰、そして質感だけに集中できます。決して安い買い物ではありませんでしたが、今のところとても満足しています。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r2mu5.9srinc41.g00r2mu5.9srio003&#x2F;kaereba_main_202605211349394105?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fauc-worldichi%2F4549212311994%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fauc-worldichi%2Fi%2F10032642%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;auc-worldichi&#x2F;cabinet&#x2F;13&#x2F;4549212311994.jpg?_ex=320x320&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r2mu5.9srinc41.g00r2mu5.9srio003&#x2F;kaereba_main_202605211349394105?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fauc-worldichi%2F4549212311994%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fauc-worldichi%2Fi%2F10032642%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;【新品】RICOH GR IV Monochrome&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202605211349394105?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FGR%2520IV%2520Monochrome%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=GR%20IV%20Monochrome&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">モノクロ写真しか撮れず、価格は28万円前後。一見すると不便さにお金を払うだけのカメラです。それでも RICOH GR IV Monochrome を選んだ理由と、マニュアル撮影でのISO感度の目安、街歩き・カフェ・風景に分けた3つのユーザーモード設定をまとめます。</summary>
        </entry><entry xml:lang="en">
        <title>NDフィルターを計算で選ぶ - DJIドローン向け計算ツール</title>
        <published>2026-05-19T00:00:00+00:00</published>
        <updated>2026-05-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/nd-filter-calculator/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/nd-filter-calculator/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;nd-filter-calculator&amp;#x2F;cover.webp?h=47183c9b6dace239ad4f&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;ドローンNDフィルター計算ツール&quot;&gt;ドローンNDフィルター計算ツール&lt;&#x2F;h2&gt;
&lt;p&gt;実測したシャッタースピード（SS）から推奨フィルターを返します。PLフィルターとNDフィルターセット（ND8&#x2F;ND16&#x2F;ND32&#x2F;ND64）を所有している前提です。&lt;&#x2F;p&gt;
&lt;div class=&quot;nd-calc&quot;&gt;
  &lt;div class=&quot;nd-calc__form&quot;&gt;
    &lt;div class=&quot;nd-calc__field&quot;&gt;
      &lt;label for=&quot;nd-ss&quot;&gt;実測シャッタースピード&lt;&#x2F;label&gt;
      &lt;input type=&quot;text&quot; id=&quot;nd-ss&quot; value=&quot;1&#x2F;2000&quot; autocomplete=&quot;off&quot; inputmode=&quot;text&quot;&gt;
      &lt;small&gt;例: 1&#x2F;2000、2000、0.0005&lt;&#x2F;small&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;nd-calc__field&quot;&gt;
      &lt;label for=&quot;nd-fps&quot;&gt;撮影フレームレート&lt;&#x2F;label&gt;
      &lt;select id=&quot;nd-fps&quot;&gt;
        &lt;option value=&quot;60&quot;&gt;60fps（標準シネマティック &#x2F; 目標SS 1&#x2F;120）&lt;&#x2F;option&gt;
        &lt;option value=&quot;120&quot;&gt;120fps（スローモーション &#x2F; 目標SS 1&#x2F;240）&lt;&#x2F;option&gt;
        &lt;option value=&quot;24&quot;&gt;24fps（フィルムルック &#x2F; 目標SS 1&#x2F;48）&lt;&#x2F;option&gt;
        &lt;option value=&quot;50&quot;&gt;50fps（PAL &#x2F; 目標SS 1&#x2F;100）&lt;&#x2F;option&gt;
      &lt;&#x2F;select&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;nd-calc__field&quot;&gt;
      &lt;label for=&quot;nd-ev&quot;&gt;目的露出補正（EV）&lt;&#x2F;label&gt;
      &lt;input type=&quot;number&quot; id=&quot;nd-ev&quot; value=&quot;0&quot; step=&quot;0.1&quot; inputmode=&quot;decimal&quot;&gt;
      &lt;small&gt;既定はEV0。ETTRなどの運用方針は本文「露出補正（EV）の扱い」を参照。&lt;&#x2F;small&gt;
    &lt;&#x2F;div&gt;
    &lt;button type=&quot;button&quot; id=&quot;nd-calc-btn&quot;&gt;計算する&lt;&#x2F;button&gt;
  &lt;&#x2F;div&gt;
  &lt;output id=&quot;nd-result&quot; class=&quot;nd-calc__result&quot; aria-live=&quot;polite&quot;&gt;&lt;&#x2F;output&gt;
&lt;&#x2F;div&gt;
&lt;style&gt;
.nd-calc {
  border: 1px solid var(--divider-color, #d7d7d7);
  background: var(--bg-1, #f7f7f7);
  border-radius: 8px;
  padding: 1.2rem 1.4rem;
  margin: 1.5rem 0;
  font-family: var(--sans-serif-font, sans-serif);
}
.nd-calc__form { display: grid; gap: 0.9rem; }
.nd-calc__field { display: grid; gap: 0.3rem; }
.nd-calc__field label { font-weight: 600; font-size: 0.95rem; color: var(--text-color, #222); }
.nd-calc__field input,
.nd-calc__field select {
  padding: 0.55rem 0.7rem;
  font-size: 1rem;
  border: 1px solid var(--divider-color, #ccc);
  border-radius: 4px;
  background: var(--bg-2, #fff);
  color: var(--text-color, #222);
  font-family: inherit;
}
.nd-calc__field small { color: var(--meta-color, #666); font-size: 0.82rem; }
.nd-calc button {
  padding: 0.65rem 1rem;
  font-size: 1rem;
  font-weight: 600;
  background: var(--primary-color, #087E96);
  color: var(--background-color, #fff);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  justify-self: start;
}
.nd-calc button:hover { opacity: 0.9; }
.nd-calc__result {
  display: block;
  margin-top: 1rem;
  padding: 0.95rem 1.1rem;
  border-radius: 6px;
  background: var(--bg-2, #fff);
  border-left: 4px solid var(--primary-color, #087E96);
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--text-color, #222);
}
.nd-calc__result:empty { display: none; }
.nd-calc__result .nd-calc__rec {
  font-size: 1.25rem;
  font-weight: 700;
  margin: 0 0 0.5rem 0;
  color: var(--text-color-high-contrast, #111);
}
.nd-calc__result .nd-calc__warn {
  color: #c0392b;
  font-weight: 600;
}
.nd-calc__result p { margin: 0.3rem 0; }
.nd-calc__result dl {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0.25rem 1rem;
  margin: 0.5rem 0 0 0;
}
.nd-calc__result dt { color: var(--meta-color, #666); font-weight: 500; }
.nd-calc__result dd { margin: 0; }
&lt;&#x2F;style&gt;
&lt;script&gt;
(function () {
  function parseSS(input) {
    if (typeof input !== &#x27;string&#x27;) return NaN;
    var s = input.trim();
    if (!s) return NaN;
    if (s.indexOf(&#x27;&#x2F;&#x27;) &gt;= 0) {
      var parts = s.split(&#x27;&#x2F;&#x27;);
      var num = parseFloat(parts[0]);
      var den = parseFloat(parts[1]);
      if (!isFinite(num) || !isFinite(den) || num === 0 || den === 0) return NaN;
      return den &#x2F; num;
    }
    var n = parseFloat(s);
    if (!isFinite(n) || n &lt;= 0) return NaN;
    return n &gt;= 1 ? n : 1 &#x2F; n;
  }
  function ssLabel(denom) {
    if (denom &gt;= 1) {
      var d = denom &gt;= 10 ? Math.round(denom) : Math.round(denom * 10) &#x2F; 10;
      return &#x27;1&#x2F;&#x27; + d;
    }
    return (1 &#x2F; denom).toFixed(2) + &#x27;s&#x27;;
  }
  function fmtSigned(x, digits) {
    digits = digits == null ? 2 : digits;
    var v = x.toFixed(digits);
    if (x &gt;= 0 &amp;&amp; v.charAt(0) !== &#x27;-&#x27;) return &#x27;+&#x27; + v;
    return v;
  }
  function calc() {
    var ssInput = document.getElementById(&#x27;nd-ss&#x27;).value;
    var fps = parseFloat(document.getElementById(&#x27;nd-fps&#x27;).value);
    var evInput = parseFloat(document.getElementById(&#x27;nd-ev&#x27;).value);
    var ev = isFinite(evInput) ? evInput : 0;
    var out = document.getElementById(&#x27;nd-result&#x27;);
    var measured = parseSS(ssInput);
    if (!isFinite(measured) || measured &lt;= 0) {
      out.innerHTML = &#x27;&lt;p class=&quot;nd-calc__warn&quot;&gt;入力を解釈できませんでした。例: 1&#x2F;2000、2000、0.0005&lt;&#x2F;p&gt;&#x27;;
      return;
    }
    var PL_STOPS = 1.5;
    var targetDenom = 2 * fps;
    var stops = Math.log2(measured &#x2F; targetDenom) - ev;
    var html = &#x27;&#x27;;
    if (stops &gt; 6.5) {
      var shortBy = (stops - 6).toFixed(2);
      html += &#x27;&lt;p class=&quot;nd-calc__warn&quot;&gt;ND64&#x2F;PL（6段）でも約 &#x27; + shortBy + &#x27; 段不足します&lt;&#x2F;p&gt;&#x27;;
      html += &#x27;&lt;p&gt;K&amp;Fセットの減衰能力を超えています。光量が落ち着くまで待つか、撮影モードや時間帯を変更する判断材料にしてください。&lt;&#x2F;p&gt;&#x27;;
      html += &#x27;&lt;dl&gt;&#x27;;
      html += &#x27;&lt;dt&gt;必要段数&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + stops.toFixed(2) + &#x27; 段&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;&#x2F;dl&gt;&#x27;;
    } else if (stops &gt;= 2.25) {
      var rounded = Math.max(3, Math.min(6, Math.round(stops)));
      var ndVal = Math.pow(2, rounded);
      var err = stops - rounded;
      var errLabel = err &gt; 0.05 ? &#x27;やや明るめ（グレーディングで微調整、許容範囲内）&#x27;
                   : err &lt; -0.05 ? &#x27;やや暗め（ISOを200程度に微増するか、グレーディングで持ち上げ）&#x27;
                   : &#x27;ほぼ適正&#x27;;
      html += &#x27;&lt;p class=&quot;nd-calc__rec&quot;&gt;推奨: ND&#x27; + ndVal + &#x27;&#x2F;PL（&#x27; + rounded + &#x27;段）&lt;&#x2F;p&gt;&#x27;;
      html += &#x27;&lt;dl&gt;&#x27;;
      html += &#x27;&lt;dt&gt;実測SS&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + ssLabel(measured) + &#x27;&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;目標SS&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + ssLabel(targetDenom) + &#x27;（&#x27; + fps + &#x27;fps）&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;必要段数&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + stops.toFixed(2) + &#x27; 段&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;露出誤差&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + fmtSigned(err) + &#x27; 段（&#x27; + errLabel + &#x27;）&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;&#x2F;dl&gt;&#x27;;
    } else {
      var plErr = stops - PL_STOPS;
      var plLabel = plErr &gt; 0.2 ? &#x27;やや明るめ（グレーディングで微調整、許容範囲内）&#x27;
                  : plErr &lt; -0.2 ? &#x27;やや暗め（ISOを200程度に微増するか、グレーディングで持ち上げ）&#x27;
                  : &#x27;ほぼ適正&#x27;;
      html += &#x27;&lt;p class=&quot;nd-calc__rec&quot;&gt;推奨: PLフィルター（実効約&#x27; + PL_STOPS.toFixed(1) + &#x27;段）&lt;&#x2F;p&gt;&#x27;;
      html += &#x27;&lt;dl&gt;&#x27;;
      html += &#x27;&lt;dt&gt;実測SS&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + ssLabel(measured) + &#x27;&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;目標SS&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + ssLabel(targetDenom) + &#x27;（&#x27; + fps + &#x27;fps）&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;必要段数&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + fmtSigned(stops) + &#x27; 段&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;dt&gt;露出誤差&lt;&#x2F;dt&gt;&lt;dd&gt;&#x27; + fmtSigned(plErr) + &#x27; 段（&#x27; + plLabel + &#x27;）&lt;&#x2F;dd&gt;&#x27;;
      html += &#x27;&lt;&#x2F;dl&gt;&#x27;;
    }
    out.innerHTML = html;
  }
  document.getElementById(&#x27;nd-calc-btn&#x27;).addEventListener(&#x27;click&#x27;, calc);
  var ssEl = document.getElementById(&#x27;nd-ss&#x27;);
  ssEl.addEventListener(&#x27;keydown&#x27;, function (e) {
    if (e.key === &#x27;Enter&#x27;) { e.preventDefault(); calc(); }
  });
  var evEl = document.getElementById(&#x27;nd-ev&#x27;);
  evEl.addEventListener(&#x27;keydown&#x27;, function (e) {
    if (e.key === &#x27;Enter&#x27;) { e.preventDefault(); calc(); }
  });
  document.getElementById(&#x27;nd-fps&#x27;).addEventListener(&#x27;change&#x27;, calc);
  calc();
})();
&lt;&#x2F;script&gt;
&lt;h3 id=&quot;使い方&quot;&gt;使い方&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;撮影モードをManualにし、ISO 100を固定する&lt;&#x2F;li&gt;
&lt;li&gt;撮影シーンに対し、SSを手動で動かして露出メーターが0になる値を読む（EV0起点。ツールのEV欄の既定値0と整合）&lt;&#x2F;li&gt;
&lt;li&gt;そのSS値、撮影フレームレート、目的の露出補正をツールに入力し、推奨フィルターを装着する&lt;&#x2F;li&gt;
&lt;li&gt;SSを180度ルールの目標値（60fpsなら1&#x2F;120など）に変更して本撮影する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;これは何か？&quot;&gt;これは何か？&lt;&#x2F;h2&gt;
&lt;p&gt;DJI Avata 2やAir 3Sには絞りがなく、露出はシャッタースピードとISOしか調整できません。シネマティック撮影では180度ルール（シャッタースピード = 1&#x2F;(2 × フレームレート)）に従ってシャッタースピードを固定し、ISOも100に張り付けたいので、明るい屋外では物理的に減光するNDフィルターが必須になります。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;04&#x2F;dji-avata2-cinematic&#x2F;&quot;&gt;前回のシネマティック設定ガイド&lt;&#x2F;a&gt;では撮影環境（曇天・晴天など）から大まかな目安を表で示しました。実際の現場ではこの目安だけでは判断に迷うことがあります。たとえば「薄雲がかかった晴天」や「日陰と日向の中間」のように、目安表で隣り合うND同士のどちらを選ぶべきか曖昧な場面です。&lt;&#x2F;p&gt;
&lt;p&gt;そこで本ツールでは、機体のオートシャッタースピードで実測したSS値からNDを逆算し推奨フィルターを提示します。&lt;&#x2F;p&gt;
&lt;p&gt;私は、Avata 2はレンズ保護も兼ねて常時何らかのフィルターを装着する運用にしているため、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uOAAr0&quot;&gt;K&amp;amp;F CONCEPT DJI Avata 2 用 NDフィルター セット(ND8、ND16、ND32、ND64)&lt;&#x2F;a&gt;に加え、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uVFJxk&quot;&gt;PLフィルター&lt;&#x2F;a&gt;も用意しておき、減光が1〜2段で足りる明るすぎないシーンではPLフィルターを装着します。本記事のツールもこの組み合わせを前提に推奨を返します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;計算の手順と式&quot;&gt;計算の手順と式&lt;&#x2F;h2&gt;
&lt;p&gt;ツールは入力された3値（実測SS、フレームレート、目的EV補正）から、次の手順で推奨フィルターを決定しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;実測SSを分母値に変換&lt;&#x2F;strong&gt;: &lt;code&gt;1&#x2F;2000&lt;&#x2F;code&gt;、&lt;code&gt;2000&lt;&#x2F;code&gt;、&lt;code&gt;0.0005&lt;&#x2F;code&gt; のいずれの形式も同じ2000として解釈する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;目標SS分母を算出&lt;&#x2F;strong&gt;: 180度ルールにより &lt;code&gt;2 × fps&lt;&#x2F;code&gt;（60fpsなら120、24fpsなら48）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;必要減衰量（段数）を計算&lt;&#x2F;strong&gt;: &lt;code&gt;log2(実測SS分母 ÷ 目標SS分母) − 目的EV&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;必要段数から推奨フィルターを決める&lt;&#x2F;strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;必要段数 &amp;lt; 2.25&lt;&#x2F;code&gt;: PLフィルター（実効約1.5段）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;2.25 ≤ 必要段数 ≤ 6.5&lt;&#x2F;code&gt;: &lt;code&gt;round(必要段数)&lt;&#x2F;code&gt; を3〜6にクランプし &lt;code&gt;2^round&lt;&#x2F;code&gt; を選ぶ（ND8 &#x2F; ND16 &#x2F; ND32 &#x2F; ND64）。境界2.25と6.5でも所持外（ND4 &#x2F; ND128）にならない&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;必要段数 &amp;gt; 6.5&lt;&#x2F;code&gt;: ND64でも足りないため警告&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;露出誤差を算出&lt;&#x2F;strong&gt;: &lt;code&gt;必要段数 − 適用段数&lt;&#x2F;code&gt;（正値=明るめ、負値=暗め）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;数式としてまとめると次のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;必要段数 = log2(実測SSの分母 ÷ 目標SSの分母) − 目的EV&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;推奨ND値 = 2 ^ round(必要段数)  (2.25 ≤ 必要段数 ≤ 6.5 のとき)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;露出誤差 = 必要段数 − 適用段数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ステップ4で &lt;code&gt;round&lt;&#x2F;code&gt; を使っているのは、隣接する2つのフィルターの中間に落ちたとき&lt;strong&gt;濃いほうのフィルター&lt;&#x2F;strong&gt;を選ぶためです（JavaScriptの &lt;code&gt;Math.round&lt;&#x2F;code&gt; は0.5を大きい側に丸めます）。&lt;&#x2F;p&gt;
&lt;p&gt;濃いほうを選んで画像が暗めに転んだ場合、明るさを足す手段は限られます。180度ルールでSSは固定、機体に絞りもないため、選択肢はISOを1段上げる（たとえば100 → 200）かグレーディングで持ち上げるかのほぼ二択です。ISOを上げると1&#x2F;1.3インチの小型センサーではノイズが乗りますが、ハイライトを飛ばすと完全には取り戻せないことを考えれば、明側に外して白飛びさせるよりは暗側に外したほうが安全側だと判断しています。&lt;&#x2F;p&gt;
&lt;p&gt;なお、Air 3Sのワイド側（24mm, F1.8）とテレ側（70mm, F2.8）は約1.3段の明るさ差があります。本ツールはどちらのレンズで測ったかを区別しないため、ワイド側で測ったSSを入力した場合、テレ側で実際に使うNDは推奨値より1段薄めに見積もるのが安全です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;露出補正（EV）の扱い&quot;&gt;露出補正（EV）の扱い&lt;&#x2F;h2&gt;
&lt;p&gt;D-Log MにおけるEV補正の扱いについて、コミュニティでも一致した「定番値」は存在しません。共通しているのは「ハイライトをクリップさせない」という原則のみで、具体的なEV値は撮影者やシーンで分かれます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EV0 起点でゼブラ&#x2F;ヒストグラムを監視&lt;&#x2F;strong&gt;: 最も無難な定石。空がフレームインしたらゼブラで白飛びを確認し、必要に応じてSS（撮影前なら）またはNDを濃いほうへ振る。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ETTR で +0.3〜+0.7&lt;&#x2F;strong&gt;: シャドウSN比を稼ぐ派。クリップ手前まで露出を上げてグレーディングで戻す。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;アンダーに振る派は少数&lt;&#x2F;strong&gt;: D-Log Mのアンダー耐性が弱く、シャドウを持ち上げるとノイズが目立つため、暗め寄りに固定する運用は推奨されない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;計算式は「測定したときのEV値 = 最終的に得たいEV値」であれば変わりません。EV0で測りながら最終露出だけ別のEVにしたい場合（たとえばETTRで +0.3にしたい）は、ツールの「目的露出補正」欄に差分を入れてください。ツール側の既定値はEV0にしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;使用上の注意点&quot;&gt;使用上の注意点&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;K&amp;amp;FのND&#x2F;PLセットはNDとPLの複合タイプ&lt;&#x2F;strong&gt;である。ND値の表記にPLの減衰も含まれており、メーカー仕様の表記に従った使用で、PL分を別途加算する必要がない。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;本ツールではPLフィルターを約1.5段の「弱いND」として扱う&lt;&#x2F;strong&gt;。偏光効果（空・水面の反射抑制など）は本ツールのスコープ外である。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;必要段数がND64&#x2F;PL（6段）を超える場合&lt;&#x2F;strong&gt;は警告が出る。現場で取れる対応は次の3つである。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;光量変化や撮影位置の変更を待つ／変える&lt;&#x2F;strong&gt;: 日陰へ移すか、アングルを変える。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;露出補正をマイナス方向に振る&lt;&#x2F;strong&gt;: 目的EVを -1程度まで下げて必要段数を減らす。グレーディングで持ち上げる前提だが、D-Log Mはアンダー耐性が弱いためシャドウノイズの代償がある。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;180度ルールを崩して SS を上げる&lt;&#x2F;strong&gt;: モーションブラーが減ってシネマティックな質感は失われるが、撮影自体は成立する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Avata 2の4K&#x2F;100fps は画角がクロップ&lt;&#x2F;strong&gt;される。私は通常飛行では使わず、本ツールも60fpsを既定値にしている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4mT7jZv&quot;&gt;K&amp;amp;F ConceptのDJI Avata 2用フィルターセット&lt;&#x2F;a&gt;は前回の記事で紹介したものをそのまま使っています。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4uVFJxk&quot;&gt;PLフィルター&lt;&#x2F;a&gt;も同社のものを別途追加しています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">晴天下のドローン撮影でNDフィルターを勘で選んでいませんか。計測したシャッタースピードを入力するだけで適正なND濃度を返す計算ツールを記事内に用意しました。</summary>
        </entry><entry xml:lang="en">
        <title>Amazon Japan新拠点を麻布台ヒルズに</title>
        <published>2026-05-18T21:40:32+09:00</published>
        <updated>2026-05-18T21:40:32+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/amazon-moves-to-azabudai-hills/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/amazon-moves-to-azabudai-hills/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;amazon-moves-to-azabudai-hills&amp;#x2F;cover.webp?h=258994cc5b3180bdef87&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;アマゾンが、新拠点を麻布台ヒルズに移すようです。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;press.aboutamazon.com&#x2F;jp&#x2F;2026&#x2F;5&#x2F;amazon-expands-tokyo-office&quot;&gt;
  &lt;p&gt;アマゾンジャパン合同会社（所在地：東京都、以下「アマゾンジャパン」）とアマゾン ウェブ サービス ジャパン合同会社（所在地：東京都、以下「AWSジャパン」）は本日、東京都港区の麻布台ヒルズに新たなオフィスを開設したことを発表しました。本日からAWSジャパンのチームが入居を開始し、2026年内にはアマゾンジャパンの複数のチームも移転する予定です。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;https:&#x2F;&#x2F;press.aboutamazon.com&#x2F;jp&#x2F;2026&#x2F;5&#x2F;amazon-expands-tokyo-office&quot;&gt;Amazon、東京オフィスを拡張し、麻布台ヒルズに新拠点を開設&lt;&#x2F;a&gt;&lt;&#x2F;cite&gt;、Amazonプレスセンター&lt;&#x2F;p&gt;
&lt;p&gt;私が勤めていた頃は目黒駅の直ぐ近くに拠点がありとても便利でした。当時から麻布台ヒルズへの移転話は社内で取り沙汰されていて、2023年初頭には東洋経済が「アマゾンの移転凍結か」と報じたこともありました。当時は移転が一旦無くなったと聞いてほっとしたものでしたが、それが今回、本当に実現したわけです。&lt;&#x2F;p&gt;
&lt;p&gt;移転先の最寄り駅は六本木一丁目か神谷町になるのだと思います。大昔、IBMが六本木に本社を置いていた時代も通っていた場所です。IBMもその後虎ノ門ヒルズに本社を移していますから、森ビル系のエリアに重ねて縁ができることに、なんだか因縁を感じますね。&lt;&#x2F;p&gt;
&lt;p&gt;そういえば、ゴールドマン・サックスも虎ノ門ヒルズ、ドイツ銀行は麻布台ヒルズ。ここ数年、外資系大手が森ビル系のヒルズに吸い寄せられているように見えます。アマゾンもその潮流に合流した形と言えそうです。&lt;&#x2F;p&gt;
&lt;p&gt;私自身は2024年にAWSジャパンを辞めていますが、それでもこの移転に少し心が動くのは、アマゾンのオフィスはIBM時代に通った各拠点と比べものにならないほどキレイだったという記憶があるからかもしれません。麻布台ヒルズの新拠点も、きっと素敵な空間に仕上がっているのでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;press.aboutamazon.com&#x2F;jp&#x2F;2026&#x2F;5&#x2F;amazon-expands-tokyo-office&quot;&gt;Amazonプレスセンター&lt;&#x2F;a&gt;.「Amazon、東京オフィスを拡張し、麻布台ヒルズに新拠点を開設」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;toyokeizai.net&#x2F;articles&#x2F;-&#x2F;652759&quot;&gt;東洋経済オンライン&lt;&#x2F;a&gt;.「虎ノ門『2つのヒルズ』期待と不安が交錯する事情　森ビルの大量供給で激しいテナント争奪戦」(2023年2月17日)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">アマゾンジャパンとAWSジャパンの新オフィスが麻布台ヒルズに開設されました。目黒駅前の旧拠点、当時の虎ノ門移転の噂、IBM時代に通った六本木。自分の足跡と重なる場所への移転に、ささやかな感慨を覚えます。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Handle</title>
        <published>2026-05-15T23:06:55+09:00</published>
        <updated>2026-05-15T23:06:55+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/handle/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/handle/</id>
        
            <content type="html">&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;yostos&#x2F;55271937910&#x2F;in&#x2F;dateposted-public&#x2F;&quot; title=&quot;Handle&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;55271937910_f0a5ddeba4_c.jpg&quot; width=&quot;800&quot; height=&quot;533&quot; alt=&quot;Handle&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17564&quot;&gt;#handle&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">A weathered industrial valve handle bolted into a tiled wall, the dark glossy tiles forming a stark grid against the metalwork. Shot for PhotoFriday&#x27;s &quot;Handle&quot; theme.
</summary>
        </entry><entry xml:lang="en">
        <title>ChatGPT Images 2.0と、ブログのカバー画像パイプライン更新</title>
        <published>2026-05-15T20:00:00+09:00</published>
        <updated>2026-05-15T20:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/chatgpt-images-2-0/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/chatgpt-images-2-0/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;chatgpt-images-2-0&amp;#x2F;cover.webp?h=2ba98580c0d5e882e1a8&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;OpenAIは2026年4月21日、新しい画像生成モデルChatGPT Images 2.0を発表しました。API名は &lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; で、開発者向けには5月初旬から開放されています。私のブログではカバー画像の自動生成に旧モデル &lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; を使っていたので、乗り換える価値があるかを調べた上で、今回のリリースに合わせて実際に移行しました。本稿では、新モデルで何が変わったか、料金へのインパクト、そして自分のブログでの乗り換え作業をまとめます。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;ChatGPT_Images_2.0で何が変わったか&quot;&gt;ChatGPT Images 2.0で何が変わったか&lt;&#x2F;h2&gt;
&lt;p&gt;ChatGPT Images 2.0の特徴は、画像生成に「考えてから描く」という工程が入ったことです。プロンプトを受け取ったあとに構図やレイアウトを推論で組み立て、必要に応じて自己検証を挟んでから描画に進みます。OpenAI自身は「Agentic image generation」と表現しており、テキストから画像へのワンショット変換とは異なる挙動を示します。&lt;&#x2F;p&gt;
&lt;p&gt;実務面で効いてくる改良点を並べると次のようになります。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;テキスト描画の精度向上&lt;&#x2F;dt&gt;
&lt;dd&gt;看板・図表・タイトルなど、画像内の文字を読める品質で出せるようになりました。印刷物にも耐える水準とされています。&lt;&#x2F;dd&gt;
&lt;dt&gt;ネイティブ2K解像度&lt;&#x2F;dt&gt;
&lt;dd&gt;2048x2048を素のままで生成でき、有料プランでは4Kまでのアップスケールが選べます。前世代の引き伸ばし感は減りました。&lt;&#x2F;dd&gt;
&lt;dt&gt;自由なアスペクト比&lt;&#x2F;dt&gt;
&lt;dd&gt;3:1から1:3までの範囲で、16の倍数を満たす任意のサイズを指定できます。固定プリセットから連続パラメータへの転換です。&lt;&#x2F;dd&gt;
&lt;dt&gt;マルチイメージのバッチ生成&lt;&#x2F;dt&gt;
&lt;dd&gt;&lt;code&gt;n=1〜8&lt;&#x2F;code&gt; でキャラクターやオブジェクトの一貫性を保ったまま、最大8枚を同時生成できます。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;なお「Thinking mode」と呼ばれる、Web検索を生成中に挟んで結果を補強する追加機能はChatGPT本体のPlus・Pro・Business・Enterpriseプランに限定されています。APIから素直に呼び出した場合に同等の挙動が得られるかは現時点で公開情報からは判然としません。日常的なカバー画像生成では恩恵が薄いため、本稿では深掘りしません。&lt;&#x2F;p&gt;
&lt;p&gt;合わせて、旧世代モデルのDALL·E 2およびDALL·E 3は2026年5月12日付で廃止されています。&lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; 自体の廃止は告知されていませんが、明確に前世代の位置づけになりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;料金面のインパクト&quot;&gt;料金面のインパクト&lt;&#x2F;h2&gt;
&lt;p&gt;OpenAIの画像APIは、出力トークンに対する従量課金($30.00&#x2F;100万トークン)を基準に、サイズと品質ごとに代表的な価格が公表されています。私のブログでは1536x1024&#x2F;高品質を使っていたので、その線で比較します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;解像度 &#x2F; 品質&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;gpt-image-1&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;gpt-image-2&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;差分&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1024x1024 &#x2F; high&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.167&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.211&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;+26%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1536x1024 &#x2F; high(旧設定)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.25&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.165&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;-34%&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1536x1024 &#x2F; medium&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.063&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.041&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;-35%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1536x1024 &#x2F; low&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.016&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;$0.005&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;-69%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;興味深いのは、&lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; では1024x1024より1536x1024のほうが安いという逆転が起きている点です。&lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; は連続的なサイズ指定とトークンベースの課金に振り切ったため、画素数と価格の関係が必ずしも単調ではなくなりました。これは料金表というよりトークン課金の写像として読むべきもので、サイズによる単純な大小比較は通用しなくなっています。&lt;&#x2F;p&gt;
&lt;p&gt;絶対額で見ると、記事1本あたり$0.085ほどの削減です。年に50本書いても$4程度なので、コスト最適化自体が主目的にはなりません。ただし「安くなって性能が上がる」方向の更新であり、乗り換えを見送る理由はありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;output_format=webp_のバグ&quot;&gt;&lt;code&gt;output_format=webp&lt;&#x2F;code&gt; のバグ&lt;&#x2F;h2&gt;
&lt;p&gt;実装中に確認したところ、&lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; は &lt;code&gt;output_format=webp&lt;&#x2F;code&gt; を指定しても、実際にはPNGデータを返してきます。レスポンスJSONには &lt;code&gt;&quot;output_format&quot;: &quot;webp&quot;&lt;&#x2F;code&gt; が含まれているものの、&lt;code&gt;b64_json&lt;&#x2F;code&gt; をデコードすると先頭が &lt;code&gt;89 50 4E 47 0D 0A 1A 0A&lt;&#x2F;code&gt; のPNGシグネチャになっています。&lt;&#x2F;p&gt;
&lt;p&gt;同一パラメータを &lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; に渡した場合は正しくWebPが返るため、現時点では &lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; 固有の不具合と判断しています。&lt;&#x2F;p&gt;
&lt;p&gt;そのため、本記事で示すスクリプトではAPIレスポンスをPNGとして受け取り、内部で &lt;code&gt;cwebp -q 80&lt;&#x2F;code&gt; によりWebPへ再エンコードしています。呼び出し側インターフェースは変更せず、最終的には1536x864のWebPファイルを取得できます。&lt;&#x2F;p&gt;
&lt;p&gt;OpenAI側で修正された場合は、&lt;code&gt;output_format=webp&lt;&#x2F;code&gt; をそのまま利用し、内部変換ステップを削除する想定です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ブログのパイプラインを乗り換える&quot;&gt;ブログのパイプラインを乗り換える&lt;&#x2F;h2&gt;
&lt;p&gt;私のブログではカバー画像を &lt;code&gt;scripts&#x2F;generate-cover.sh&lt;&#x2F;code&gt; からOpenAI Image APIを叩いて生成しています。これまでは &lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; から1536x1024のPNGを受け取り、&lt;code&gt;cwebp -q 80&lt;&#x2F;code&gt; でWebPに変換して &lt;code&gt;cover.webp&lt;&#x2F;code&gt; を作っていました。新モデルへの移行で、このパイプラインが得る恩恵は大きく2点あります。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;画像精度の底上げ&lt;&#x2F;dt&gt;
&lt;dd&gt;テキスト描画・構図・解像度がモデルレベルで改善するため、カバー画像の見栄えが直接良くなります。&lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; とのAPI互換性が高く、エンドポイント・認証・レスポンス形式(&lt;code&gt;b64_json&lt;&#x2F;code&gt;)はそのまま使えるため、これだけなら &lt;code&gt;MODEL&lt;&#x2F;code&gt; 変数を &lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; に書き換えれば享受できます。&lt;&#x2F;dd&gt;
&lt;dt&gt;画角の自由度&lt;&#x2F;dt&gt;
&lt;dd&gt;画角16:9で指定できるようになりました。&lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; のサイズパラメータは「16の倍数」「総画素数65万〜829万」「縦横比3:1〜1:3」を満たす任意の値を受け付けるため、1536x864のような正確な16:9に直接出力できます。旧モデルのプリセット制約から3:2(1536x1024)に妥協していた本ブログでは、記事一覧の見栄えとX(旧Twitter)・はてなブックマークなどのSNSカードプレビューの収まりが、ようやく現代のプラットフォームと噛み合うようになりました。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;リクエスト本体は次のようになりました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;scripts&#x2F;generate-cover.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1536x864&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MODEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;gpt-image-2&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;RESPONSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  https:&#x2F;&#x2F;api.openai.com&#x2F;v1&#x2F;images&#x2F;generations&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -H &amp;quot;Content-Type: application&#x2F;json&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -H &amp;quot;Authorization: Bearer &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OPENAI_API_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -d &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg model &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MODEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg prompt &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$PROMPT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg size &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg quality &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$QUALITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;#39;{model: $model, prompt: $prompt, n: 1,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;      size: $size, quality: $quality}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このスクリプトを呼び出している &lt;code&gt;article-cover&lt;&#x2F;code&gt; スキル(Claude Code用のカスタムコマンド)の全体は次のとおりです。記事の特定からフロントマター確認までを4ステップで定義しており、&lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; への移行に際しての変更は不要でした。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot; data-name=&quot;.claude&#x2F;commands&#x2F;article-cover.md&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Generate a cover image for an article using OpenAI gpt-image-2 API. Read article content, craft a prompt, generate 1536x864 (16:9) WebP image.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\31  z-markdown&quot;&gt;# Article Cover Image Generation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Generate a cover image (cover.webp) for an article using OpenAI gpt-image-2 API.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\32  z-markdown&quot;&gt;## Steps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 1. Identify Target Article&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Ask the user which article to generate a cover image for.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Read the article content to understand the theme and key topics.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 2. Craft Image Prompt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Based on the article content:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Identify the core theme and visual concepts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Craft a gpt-image-2 prompt that captures the article&amp;#39;s essence&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Show the prompt to the user for approval before generating&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 3. Generate Image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Run &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`.&#x2F;scripts&#x2F;generate-cover.sh`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition&quot;&gt;```&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;.&#x2F;scripts&#x2F;generate-cover.sh \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  -p &amp;quot;&amp;lt;approved prompt&amp;gt;&amp;quot; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  -o content&#x2F;blog&#x2F;YYYY&#x2F;MM&#x2F;slug&#x2F;cover.webp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition&quot;&gt;```&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;The script defaults to 1536x864 (16:9), high quality, and WebP output.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 4. Verify Frontmatter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Ensure the article frontmatter has:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition&quot;&gt;```&lt;&#x2F;span&gt;&lt;span class=&quot;z-fenced_code z-block z-language&quot;&gt;toml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;[extra]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;local_image = &amp;quot;cover.webp&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;social_media_card = &amp;quot;ogp.webp&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition&quot;&gt;```&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;本記事のカバー画像も、この新しいパイプラインで生成しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ChatGPT Images 2.0は、価格が下がり、解像度とアスペクト比の選択肢が広がった、素直なアップグレードでした。&lt;code&gt;gpt-image-1&lt;&#x2F;code&gt; を呼んでいる既存コードであれば、&lt;code&gt;model&lt;&#x2F;code&gt; を差し替えるだけで動き始めます。&lt;&#x2F;p&gt;
&lt;p&gt;連続的なサイズ指定や推論を伴う構図設計といった点は、定型的なカバー画像生成だけでなく、SNS向け縦長フォーマットや図解付き画像など、これまで複数モデルを使い分けていた領域も &lt;code&gt;gpt-image-2&lt;&#x2F;code&gt; 1本に集約しうるポテンシャルを持ちます。エージェント型ワークフローからの呼び出しでも、複数枚の一貫した出力をシングルリクエストで得られる点が効いてきそうです。&lt;&#x2F;p&gt;
&lt;p&gt;しばらくこのパイプラインを運用してみて、生成品質や絵柄の傾向で気になる点、あるいは &lt;code&gt;output_format=webp&lt;&#x2F;code&gt; まわりの挙動に変化があれば、別途取り上げます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openai.com&#x2F;index&#x2F;introducing-chatgpt-images-2-0&#x2F;&quot;&gt;OpenAI&lt;&#x2F;a&gt;.「Introducing ChatGPT Images 2.0」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.openai.com&#x2F;api&#x2F;docs&#x2F;models&#x2F;gpt-image-1&quot;&gt;OpenAI API Docs&lt;&#x2F;a&gt;.「GPT Image 1 Model」(価格比較用)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openai.com&#x2F;api&#x2F;pricing&#x2F;&quot;&gt;OpenAI API Pricing&lt;&#x2F;a&gt;.「OpenAI API Pricing」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;2026&#x2F;04&#x2F;21&#x2F;chatgpts-new-images-2-0-model-is-surprisingly-good-at-generating-text&#x2F;&quot;&gt;TechCrunch&lt;&#x2F;a&gt;.「ChatGPT&#x27;s new Images 2.0 model is surprisingly good at generating text」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thenewstack.io&#x2F;chatgpt-images-20-openai&#x2F;&quot;&gt;The New Stack&lt;&#x2F;a&gt;.「With the launch of ChatGPT Images 2.0, OpenAI now &#x27;thinks&#x27; before it draws」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">OpenAIが2026年4月21日にリリースしたChatGPT Images 2.0は、画像生成に推論能力を組み込んだ新世代のモデルです。1536x864&#x2F;高品質で料金は約34%下がり、ネイティブ2K解像度や3:1から1:3までの自由なアスペクト比も使えるようになりました。本ブログのカバー画像生成パイプラインも、このタイミングで乗り換えました。</summary>
        </entry><entry xml:lang="en">
        <title>DJI Avata2 - 夜明けの九十九里浜</title>
        <published>2026-05-14T10:52:20+09:00</published>
        <updated>2026-05-14T10:52:20+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/kujukuri/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/kujukuri/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;kujukuri&amp;#x2F;cover.webp?h=56e44df712e741a04135&quot;
  alt=&quot;Cover&quot; width=&quot;2303&quot; height=&quot;1296&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;マニュアルモードでの飛行はまだまだ練習中ですが、
夜明けの九十九里浜でAvata2を飛ばしてきました。&lt;&#x2F;p&gt;
&lt;p&gt;海面への着水だけでなく砂浜に突っ込んでも致命的なダメージだなと思うと高度を下げるのは、なかなか勇気が要ります。
特に今回のような何もない海上を飛んでいると目標物がなく高度計も信用できないので、余裕がどれくらいで上昇しているのか下降しているのか常に気を使います。ついつい高
度を取ってしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;一応モーターガードは付けていますが、砂を巻き込ま
ないよう念のため着陸
もパッドでなくハンドキャッチしています。&lt;&#x2F;p&gt;
&lt;p&gt;半年ほど前に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;FyY7xCteMH4?si=C_GO8jrUbPye74kX&quot;&gt;DJI Air3S&lt;&#x2F;a&gt;を同じ場所で飛ばしましたが、まったく印象が違いますね。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;UOYxX1o11uU&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">夜明けの九十九里浜でDJI Avata2をマニュアル飛行。何もない海上では目標物がなく高度感を失いがちで、低空飛行には勇気が要ります。半年前にAir3Sで同じ場所を撮ったときとは、まったく違う景色が見えてきました。
</summary>
        </entry><entry xml:lang="en">
        <title>Claude Platform on AWSに見る新時代のハイパースケーラー</title>
        <published>2026-05-13T20:00:00+09:00</published>
        <updated>2026-05-13T20:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/claude-platform-aws/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/claude-platform-aws/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;claude-platform-aws&amp;#x2F;cover.webp?h=8abf7062e68c7aef84c7&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;2026年5月11日、AnthropicとAWSは「Claude Platform on AWS」を一般提供開始しました。Anthropic本家のMessages APIやConsoleの体験そのものを、AWSアカウントから直接利用できる新しい入口で、東京リージョンも初日から対応しています。ただし本稿で読み解きたいのは、機能の追加そのものではなく、この発表が示すAWSの立ち位置の構造的な変化です。Bedrockとの違い、Cloud 2.0レイヤーでの位置づけ、AWS提案の現場への影響という3つの角度から見ていきます。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Claude_Platform_on_AWSとは何か&quot;&gt;Claude Platform on AWSとは何か&lt;&#x2F;h2&gt;
&lt;p&gt;新サービスの概要は次のとおりです。Anthropicが運用するClaude Platformそのものを、AWSアカウントの認証情報と請求経路を介して利用できるようにしたものです。利用者から見えるエンドポイントもSDKの作法も、Anthropic本家のそれとほぼ共通しています。&lt;&#x2F;p&gt;
&lt;p&gt;具体的には、SDKに &lt;code&gt;ANTHROPIC_BASE_URL=https:&#x2F;&#x2F;aws-external-anthropic.&amp;lt;region&amp;gt;.api.aws&lt;&#x2F;code&gt; と &lt;code&gt;anthropic-workspace-id&lt;&#x2F;code&gt; ヘッダーを設定するだけで、Anthropic向けに書いたコードがそのままAWS経路で動きます。認証はAWSのIAM資格情報で行ない、別途Anthropicアカウントを取る必要はありません。利用料はAWS Marketplace経由で計上され、Cost Explorerでモニタリングでき、Enterprise Discount ProgramなどのAWSコミット消化対象にもなります。&lt;&#x2F;p&gt;
&lt;p&gt;使える機能はAnthropic本家とほぼ同等です。Messages APIから最新のエージェント関連機能まで一通り揃い、モデルもClaude Opus 4.7、Sonnet 4.6、Haiku 4.5を同日提供しています。新モデルや新機能がリリース当日(Day-0)から使えるという点こそ、これまでBedrock側の取り込みを待たされてきた構図が崩れた、今回の本質的な変化です。&lt;&#x2F;p&gt;
&lt;p&gt;監査はCloudTrailのManagement Eventsがデフォルトで記録され、推論呼び出しそのものはオプションでData Eventsとして流せます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;Workspaceは、APIキー・権限・課金・月次上限を環境やチーム単位で分離できる、Anthropic Console固有の論理単位です。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;もう一点、Workspaceという新しい概念が入りました。これはプロジェクト・環境・チームを切り分けつつ請求単位も分けられるIAMリソースで、Anthropic Consoleにあるワークスペースの仕組みをAWS IAMの語彙で組み込んだものです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Bedrockと何が違うのか&quot;&gt;Bedrockと何が違うのか&lt;&#x2F;h2&gt;
&lt;p&gt;AnthropicのモデルならBedrock経由で既に使えるのに、なぜ別の経路を用意したのか。本サービスをBedrockと比較したときのPros&#x2F;Consは次のとおりです。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;Pros&lt;&#x2F;dt&gt;
&lt;dd&gt;AWSの統制・監査基盤の上で、Anthropic本家とほぼ同等の機能と最新モデルをDay-0で使える。&lt;&#x2F;dd&gt;
&lt;dt&gt;Cons&lt;&#x2F;dt&gt;
&lt;dd&gt;データがAWS外で扱われるため別建てのデータ管理が必要になる。加えてClaude専用のため、マルチモデル戦略は取れない。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;機能面の違いを並べると次のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;観点&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Amazon Bedrock&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Claude Platform on AWS&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;推論データの処理者・処理境界&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;AWS(AWS境界内)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Anthropic(AWS境界外)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;新モデル・新機能の追随&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;数週〜数か月遅れ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Day-0で揃う&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;モデルベンダー多様性&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;多ベンダー(十数社)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Claudeのみ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;AWS IAM &#x2F; Marketplace &#x2F; CloudTrail&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;統合あり&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;統合あり&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;違いは大きく分けて、データの境界と機能の追随速度という2点に集約できます。&lt;&#x2F;p&gt;
&lt;p&gt;Bedrockの構造では、AWSが推論基盤までを自社で運用し、データ処理者としての責任を負います。推論はAWSのセキュリティ境界の内側で行われ、入力データはAnthropicへは共有されません。推論にAWSのデータ統制を要求するエンタープライズ用途に向いた構造です。&lt;&#x2F;p&gt;
&lt;p&gt;一方、Claude Platform on AWSは、認証と請求と監査こそAWSが提供しますが、推論サービス自体はAnthropicが運用する基盤で動きます。データはAWSのセキュリティ境界の外側、Anthropicの管理下で処理されます。この差はコンプライアンス上、本質的です。データレジデンシーやAWS境界内処理を契約で求めている組織には、Bedrockのほうが依然として現実解です。&lt;&#x2F;p&gt;
&lt;p&gt;逆に、Anthropicが最新モデルや新機能をリリースした瞬間からそれを使いたい組織には、Claude Platform on AWSが勝ります。Bedrockでは、Anthropic本家のAPIで先行した機能(extended thinkingやFiles APIなど)が、AWS側のコモディティ化を経て登場するまで数週間から数か月のラグが生じることも珍しくありませんでした。今回のサービスは、その間隙を埋める性格のものです。&lt;&#x2F;p&gt;
&lt;p&gt;選択軸が「データ境界と機能の速さ、どちらを優先するか」に整理されてきたことが分かります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AIサービスにおけるAWSの役回りの変化&quot;&gt;AIサービスにおけるAWSの役回りの変化&lt;&#x2F;h2&gt;
&lt;p&gt;ここからが本稿の本題です。新サービスを技術仕様として眺める以上に、AWSがどんな役回りを引き受けたのかという視点で見るほうが示唆に富みます。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Platform on AWSが構造的に行っているのは、レイヤーの分離です。推論というサービス本体はAnthropicの外部基盤に置きつつ、認証(IAM)、請求(Marketplace)、監査(CloudTrail)、コミット消化といった企業ガバナンスの足回りだけをAWSが提供しています。&lt;&#x2F;p&gt;
&lt;p&gt;この構造は、Cloudflare Workersに &lt;code&gt;ANTHROPIC_API_KEY&lt;&#x2F;code&gt; を環境変数で渡して、Anthropic本家のAPIを叩いているのと本質的に変わりません。違いは、認証がAPIキーではなくIAMで、請求がクレジットカードではなくAWS請求書で、ログがWorkers TraceではなくCloudTrailであることです。エンタープライズの調達と監査の要件を満たすかどうかという、その一点だけが違います。&lt;&#x2F;p&gt;
&lt;p&gt;ここでAWSが押さえている価値は、コンピュートやストレージではありません。請求と身元と監査ログを束ねる「企業の窓口」としての地位です。AWSはこれまで、Cloud 1.0期に積み上げた抽象化レイヤー、つまりEC2やS3やLambdaといったプリミティブで稼いできました。今回はそれと並行して、自社では運用していない外部の推論サービスの請求と統制を引き受けるという、新しい収益面を開いています。&lt;&#x2F;p&gt;
&lt;p&gt;これは戦略的譲歩なのか、新収益モデルなのか。私の見立ては、両面を同時に成立させる賢い設計、というところです。譲歩の側面はあります。AnthropicのモデルをBedrockに統合してきたこれまでの路線とは異なり、推論基盤の主導権をAnthropic側に残したまま窓口だけ引き受ける形だからです。一方でAWSは、Enterprise Discount Programの消化先を増やせますし、新モデル待ちでAWSを離れる顧客を引き留められます。失う主導権の代わりに、エンタープライズの窓口という地位を補強する取引です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloud_0.5&#x2F;1.0&#x2F;2.0で見るとどこに位置するか&quot;&gt;Cloud 0.5&#x2F;1.0&#x2F;2.0で見るとどこに位置するか&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;cloud2-0&#x2F;&quot;&gt;以前の記事&lt;&#x2F;a&gt;で、Cloudの時代区分を「Cloud 0.5(仮想化インフラ)」「Cloud 1.0(Cloud Native)」「Cloud 2.0(Agentic Cloud)」の3段で整理しました。Claude Platform on AWSはこの枠組みのどこに位置づけられるでしょうか。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;本記事における「Cloud 2.0」の定義: LLMエージェントがCloudのワークロードの主役となる新しいレイヤーを指す、本記事独自の用語として用います。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;Cloud 1.0期のハイパースケーラーは、抽象化レイヤーの提供者でした。物理インフラを覆い隠して、IAMやVPCやマネージドサービスといったプリミティブを通じて開発者に売る役割です。AWSがその役割で群を抜いたことが、Cloud 1.0時代の覇権をもたらしました。&lt;&#x2F;p&gt;
&lt;p&gt;Cloud 2.0期に入ると、ワークロードの主役はLLMエージェントになります。エージェントは、推論基盤、軽量実行環境、永続記憶、版管理ストレージといったプリミティブを使い倒します。ここで重要なのは、これらのプリミティブを必ずしも一社で提供する必要はないという点です。エージェントは複数のサービス境界を越えて動きますし、エンタープライズが推論をAnthropicに、実行環境をCloudflareに、ストレージをAWSにというような組み合わせを選ぶことも当たり前になりつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;そう考えると、前節で論じたAWSの役回り変化は、Cloud 2.0レイヤー全体に起きている地殻変動の一場面として位置づけられます。Cloud 1.0期に培った企業ガバナンス基盤を、自社で運用しない外部の推論サービスにも貸し出す。これが今、Cloud 2.0レイヤーでハイパースケーラーが取りうる役回りのひとつで、Bedrockを併存させているのは内製と外部窓口の両方をAWSが押さえにいくという意思の表れです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AWS提案の現場で起きる変化&quot;&gt;AWS提案の現場で起きる変化&lt;&#x2F;h2&gt;
&lt;p&gt;ここから少し業界寄りの話です。AWSのソリューション提案を生業にしてきた人々への影響を見ておきます。&lt;&#x2F;p&gt;
&lt;p&gt;これまでのBedrock案件では、「Anthropic、OpenAI、Meta、Mistralを統一APIで使い分けられる」というマルチモデル統合の価値が前面に出てきました。データレジデンシーやIAM統合と並んで、Bedrockを選ぶ理由のひとつとして語られてきた論点です。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Platform on AWSの登場は、このうち「Anthropicの最新モデルを使いたい」という需要を、Bedrock以外で吸収できることを意味します。Claudeしか使わないユースケースに対しては、「Bedrockでマルチモデルを集約する」という売り文句の説得力が下がります。同じAWSの中に、Anthropic直叩きと変わらない経路が用意されたからです。&lt;&#x2F;p&gt;
&lt;p&gt;提案のロジックも組み替えが要ります。要件ごとの選択は次のように整理できます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;データレジデンシーやAWS境界内処理が契約上の必須要件 → Bedrock&lt;&#x2F;li&gt;
&lt;li&gt;Day-0でClaudeの新機能を使いたい、またはWorkspace単位の請求分離が必要 → Claude Platform on AWS&lt;&#x2F;li&gt;
&lt;li&gt;複数モデルベンダーをユースケース別に使い分けたい → Bedrock&lt;&#x2F;li&gt;
&lt;li&gt;ClaudeとOpenAIの両方を本家経路で使いたい → BedrockとClaude Platform on AWSの併用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;選択軸が一段細かくなりました。&lt;&#x2F;p&gt;
&lt;p&gt;元AWS ProServeの目で見ると、これは案件の議論を健全にする方向の変化です。Bedrockを「とりあえずの安全牌」として薦める提案には、本来の要件と噛み合わないものが含まれていました。選択肢が増えたことで、データ境界要件か機能の追随速度かを正面から議論できるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;逆に、SI側の付加価値の置き場所は前より難しくなります。「マルチモデル統合のための設計」だけでは差別化が薄まり、業務要件を踏まえてどちらの経路を選ぶか、両者をどう使い分けるかという、より上位の意思決定支援に価値が移っていきます。Cloud 1.0期にインフラ選定で稼いだロジックは、Cloud 2.0期には設計者・選定者の判断力という形に少しずつ姿を変えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Anthropicのキャパシティ戦略との符合&quot;&gt;Anthropicのキャパシティ戦略との符合&lt;&#x2F;h2&gt;
&lt;p&gt;最後に、Anthropic側からこの取引を眺めておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicは2026年に入ってから、AWSと$100Bを超える複数年コンピュート契約を交わし、5GW級のTrainium容量にコミットすると発表しています。一方でMicrosoft AzureやGoogle Cloudとも並行して提携を結んでおり、推論キャパシティを複数のハイパースケーラーに分散させる戦略を取っています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;TrainiumはAWSが自社開発するAI学習・推論用カスタムチップです。Nvidia GPUへの依存を減らす狙いがあり、Anthropicの大型契約はその外販ボリュームの一翼を担います。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;このキャパシティを最終的に消費するのは、世界中のエンタープライズが回す推論ワークロードです。Anthropic本家APIだけでは、その消費を支えるだけの調達経路を企業に提供しきれません。クレジットカードでの直接契約は、ガバナンスの観点でエンタープライズが選びにくい経路だからです。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Platform on AWSは、Anthropicからすれば「エンタープライズの調達窓口」を一気に拡張する装置です。AWSアカウントを持っている企業の調達担当は、新しいベンダーを通すことなく、既存のMarketplace経由でClaudeを使い始められます。Anthropicは推論基盤の主導権を保ったまま、AWSのエンタープライズ顧客基盤に直結できます。&lt;&#x2F;p&gt;
&lt;p&gt;AWS側から見れば、AnthropicがTrainiumに払うコンピュート料金が、別経路でエンタープライズ向けの推論売上として戻ってきます。Anthropicが請求の上流、AWSが下流という関係です。両者は競合ではなく、調達面で組み合っている構造になっています。&lt;&#x2F;p&gt;
&lt;p&gt;ここまで読むと、Claude Platform on AWSは単発のサービス発表というよりも、Anthropicの分散キャパシティ戦略とAWSの窓口ポジション戦略が噛み合った結果として出てきた仕組みであることが見えてきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Platform on AWSは、機能カタログの一行というよりも、ハイパースケーラーの役回りが変わりつつあることを示す構造的なサインだと感じています。&lt;&#x2F;p&gt;
&lt;p&gt;Bedrockがそうであるように、AWSは引き続き「自社の推論基盤を売る側」でもあります。同時に、外部ベンダーの推論サービスに対して「請求と身元と監査の窓口」を引き受ける役割も併せ持つようになりました。Cloud 1.0期に培った企業ガバナンスの足回りが、Cloud 2.0期では別のベンダーの実行レイヤーを支える土台として再利用されています。&lt;&#x2F;p&gt;
&lt;p&gt;エンタープライズの調達担当やSIの提案担当にとっては、選択肢が増えた分だけ判断軸を明確にする必要が出てきます。データ境界要件か、機能の追随速度か、ベンダー多様性か。それぞれの要件に対して、Bedrock、Claude Platform on AWS、あるいは両者の併用という選択を素直に評価できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;今後、同じ仕組みでOpenAIやGoogleがAWS上に乗ってくる可能性も含めて、ハイパースケーラーの窓口化はゆっくりと進む流れだと見ています。Cloud 2.0期にAWSがどの地位を確保するのか、その答えのひとつがこの発表に入っているのではないでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;machine-learning&#x2F;introducing-claude-platform-on-aws-anthropics-native-platform-through-your-aws-account&#x2F;&quot;&gt;AWS Machine Learning Blog&lt;&#x2F;a&gt;.「Introducing Claude Platform on AWS, Anthropic&#x27;s native platform through your AWS account」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;claude-platform&#x2F;&quot;&gt;AWS&lt;&#x2F;a&gt;.「Claude Platform on AWS」(製品ページ)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;about-aws&#x2F;whats-new&#x2F;2026&#x2F;05&#x2F;claude-platform-aws&#x2F;&quot;&gt;AWS What&#x27;s New&lt;&#x2F;a&gt;.「Claude Platform on AWS is now generally available」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;anthropic-amazon-compute&quot;&gt;Anthropic&lt;&#x2F;a&gt;.「Anthropic and Amazon expand collaboration for up to 5GW of Trainium compute」(2026年4月20日)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.aboutamazon.com&#x2F;news&#x2F;company-news&#x2F;amazon-invests-additional-5-billion-anthropic-ai&quot;&gt;About Amazon&lt;&#x2F;a&gt;.「Amazon and Anthropic expand strategic collaboration」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">2026年5月11日にGAされたClaude Platform on AWSは、AnthropicのネイティブAPIをAWSアカウントから直接呼べる新サービスです。この発表が示すAWSの立ち位置の構造的な変化を、Bedrockとの違い、Cloud 2.0レイヤー、AWS提案現場の3つの角度から読み解きます。</summary>
        </entry><entry xml:lang="en">
        <title>霊験あらたかな東国三社、香取神宮と息栖神社へ</title>
        <published>2026-05-13T15:09:53+09:00</published>
        <updated>2026-05-13T15:09:53+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/katori-shrine/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/katori-shrine/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;katori-shrine&amp;#x2F;katori.webp?h=08ff665990dc1b191127&quot;
  alt=&quot;香取神宮&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;香取神宮&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;05&#x2F;sougu-mamori&#x2F;&quot;&gt;先日&lt;&#x2F;a&gt;双宮守を頂きに鹿島神宮と香取神宮に参りましたが、あまりの参拝客の多さに香取神宮ではお参りが出来ませんでした。昨日改めてお参りいたしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;香取神宮&quot;&gt;香取神宮&lt;&#x2F;h2&gt;
&lt;p&gt;香取神宮は千葉県香取市に鎮座する下総国一の宮で、全国に広がる香取神社の総本社です。御祭神の経津主大神は、日本書紀において武甕槌大神とともに葦原中国の平定に派遣され、大国主神と国譲りの交渉に臨んだ武神として描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;利根川を挟んで対岸の鹿島神宮とは、神話の上でも対をなす関係にあります。古代、両宮の鎮座する一帯は東国の要衝であり、朝廷は二柱の武神に東方鎮護の役を託したと伝わります。地震を鎮めるとされる「要石」が両宮にあり、香取が大鯰の尾を、鹿島が頭を押さえると伝えられているのも、この対関係を象徴するように思えます。&lt;&#x2F;p&gt;
&lt;p&gt;拝殿の前に立つのは樹齢千年といわれる大杉の御神木です。幹の太さや枝ぶりを間近に眺めながら、そこに積もった時間の長さに私はしばし思いを馳せました。&lt;&#x2F;p&gt;
&lt;p&gt;これまでは拝殿までで引き返していたのですが、今回は本宮の裏手まで足を延ばしました。古い参道を奥へ進むと奥宮があり、その先には鹿園もあります。2013年に鹿島神宮から神鹿を譲り受けて以来、ボランティアの方々が世話を続けてこられたそうです。表側とは違う、静かで奥行きのある空間でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;息栖神社&quot;&gt;息栖神社&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;katori-shrine&amp;#x2F;ikisu.webp?h=f1a12070ab3edbc69b34&quot;
  alt=&quot;息栖神社&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;息栖神社&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;息栖神社は茨城県神栖市に鎮座する古社で、鹿島神宮・香取神宮と並ぶ東国三社の一社に数えられます。三社は関東屈指の霊場であり、江戸時代には伊勢参りを終えた人々が「下三宮参り」として巡拝しました。三社を巡れば伊勢神宮一度の参拝に並ぶ御利益が授かると信じられたそうです。三社の鎮座地はほぼ二等辺三角形を成し、その内側は特別な気が集まる「トライアングルゾーン」とも呼ばれています。&lt;&#x2F;p&gt;
&lt;p&gt;御祭神は久那戸神で、厄除招福、交通守護、井戸の神として古くから信仰されてきました。創祀は応神天皇の御代と伝えられ、大同二年（807年）に藤原内麻呂によって現在地へ遷されたとされます。&lt;&#x2F;p&gt;
&lt;p&gt;一の鳥居は常陸利根川に面しており、その両脇には小さな鳥居を構えた2つの井戸「忍潮井」が水面に並びます。伊勢の明星井、伏見の直井と並ぶ日本三霊水の1つで、海水の中にあって清らかな淡水を湧き続けてきたと伝わります。&lt;&#x2F;p&gt;
&lt;p&gt;境内で特に印象に残ったのは招霊（オガタマ）の木でした。神前に葉を供えて神霊を招くことから「招霊」と書き、各地の神社で御神木として大切にされてきた木だそうです。立ち止まってしまうほど、ほのかに渋く清らかな香りが漂っていました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">関東随一の霊場と仰がれる東国三社のうち、霊験あらたかな香取神宮と息栖神社を巡りました。樹齢千年の御神木と要石、日本三霊水「忍潮井」、香りゆかしき招霊の木に触れた一日の参拝記です。
</summary>
        </entry><entry xml:lang="en">
        <title>読了『闘うプログラマー』</title>
        <published>2026-05-12T07:33:12+09:00</published>
        <updated>2026-05-12T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/showstopper/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/showstopper/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;showstopper&amp;#x2F;cover.webp?h=20edf939cee5cd3ca20f&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;1980年代にMS-DOSでデスクトップパソコン市場を制し、WindowsでGUIのオペレーティング・システム(以降、「OS」と記載)も制しつつあったマイクロソフト社は、90年代、高性能コンピューター向けの「本物」のOS開発プロジェクトを立ち上げます。当時のマイクロソフト社の世界戦略を担ったOS「WindowsNT」です。そのプロジェクトに、当時DEC社のミニコン向けOS、VAX&#x2F;VMSの開発者であった「伝説のプログラマー」David Neil Cutlerが招へいされました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;本書の概要&quot;&gt;本書の概要&lt;&#x2F;h2&gt;
&lt;p&gt;本書は、David Cutlerを中心とした開発物語です。&lt;&#x2F;p&gt;
&lt;p&gt;『闘うプログラマー』というタイトルから、David Cutler中心に描かれていると思って購入しました。冒頭は、彼がDEC社で担当していた新OSプロジェクト「Mica」が破棄され、1988年マイクロソフト社に移籍するシーンから描かれています。前半は彼がいかにWindowsNTプロジェクトを立ち上げたかが描かれていますが、中盤からはこのプロジェクトに参加したあらゆるレイヤーの開発者へと順次フォーカスが当てられ、エピソードが盛り込まれていきます。&lt;&#x2F;p&gt;
&lt;p&gt;全く新しいOSを、当時主流だったIntelのCPUだけでなく、まだ完成していないRISCにも対応させなければなりません。さらにDOSとの互換性、Win32系の旧来のWindowsとの互換性も維持する必要があったわけです。想像するだけでデスマーチな開発ですが、本書を読めば実際にデスマーチだったことが分かります。それでも当時は「Cutlerの元で新しいOSの開発が出来る」ことを栄誉だと考えるプログラマーが多くいたわけです。&lt;&#x2F;p&gt;
&lt;p&gt;Cutlerの伝記として読むと中途半端ですが、当時のWindowsNTの過酷な開発エピソードが盛り込まれている点は大変興味深く読めました。本書がWindowsNTの初版がリリースされた1993年に出版されたため、開発者たちのエピソードも生々しく、リアルな状況を伝えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「OSの時代」を背景に&quot;&gt;「OSの時代」を背景に&lt;&#x2F;h2&gt;
&lt;p&gt;WindowsNTの開発が始まった1980年代後半から1990年代に掛けては、まさに「OSの時代」でした。当時は、ハードウェアやネットワークの環境が大きく変化した時代でもあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CPUは16ビットから32ビットに進化し、RISCという新しいアーキテクチャーも登場した&lt;&#x2F;li&gt;
&lt;li&gt;MacintoshがGUIを一般ユーザーに広めた結果、プリエンプティブなマルチタスクが一般レベルでも要求されるようになった&lt;&#x2F;li&gt;
&lt;li&gt;インターネットの普及により、モデムでのパソコン通信ではなく本格的なネットワーク機能が一般ユーザーでも必要となった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;PCはMS-DOS上でWindows3.xが動いていましたが、16ビットアーキテクチャーを引きずっていました。IBMは「OS&#x2F;2」という新しいOSをマイクロソフト社と共にリリースしていましたが、コンシューマーの世界では全く浸透していませんでした。Apple社はClassic Mac OSを何度も刷新しようとしていましたが、ことごとく失敗していました。&lt;&#x2F;p&gt;
&lt;p&gt;そんな中で開発されたWindowsNTは、その後Windows2000、WindowsXPとコンシューマー向けWindowsの核となり、最も成功したOSとなっていきました。&lt;&#x2F;p&gt;
&lt;p&gt;私自身、1995年頃に自宅のPCにWindowsNTを導入していました。とはいえ、当時実際に使っていたツールの大半はWindowsベースですらなく、DOSベースのものが中心だったように記憶しています。それでも「本物のOS」に触れられたこと自体はよいお勉強になりましたし、ファイルシステムのNTFSはFATに比べて信頼性が明らかに高く、家庭利用でもその差を実感できました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;米国でのプログラマーの地位&quot;&gt;米国でのプログラマーの地位&lt;&#x2F;h2&gt;
&lt;p&gt;個人的に印象的だったのは、米国での「プログラマー」の地位です。WindowsNTの開発に参加していた開発者が、皆スタープログラマーという訳ではありませんでした。それでも多くの開発者はストックオプションで一財産を築き、西海岸に家を建てポルシェを購入してという経済的な成功を手に入れています。日本における「プログラマー」の扱いとは大違いです。&lt;&#x2F;p&gt;
&lt;p&gt;翻って日本では、多くのプログラマーがSIer (システムインテグレーター) を頂点とする多重下請け構造の中で受託開発に従事しています。給与水準は一般のサラリーマンと大きく変わらず、ストックオプションで一財産を築くケースは稀です。「35歳定年説」も語られるほどに、プログラマーを続けること自体、報われにくい構造でした。&lt;&#x2F;p&gt;
&lt;p&gt;この差の背景には、産業構造の違いが大きいのではないでしょうか。米国はマイクロソフト社のように自社プロダクトを開発・販売する事業会社が産業の主役で、その成功は株式を通じて開発者個人にも還元されます。一方、日本では事業会社がIT機能を外注する構造になっており、プロダクトの成功を開発者と分け合う仕組みもありません。経営層に技術者出身者が少ないことも、こうした地位の差を生む一因と感じます。&lt;&#x2F;p&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202605120734444595?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6130084%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;7577&#x2F;9784822247577.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202605120734444595?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6130084%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;闘うプログラマー新装版&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;グレッグ・パスカル・ザカリー&#x2F;山岡洋一 日経BP 2009年07月    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202605120734444595?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6130084%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4822247570&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E9%97%98%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E6%96%B0%E8%A3%85%E7%89%88&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                              	  	  	  	  	&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">伝説のプログラマーDavid Cutlerがマイクロソフト社に移籍し、WindowsNTを生み出すまでの過酷な開発物語。読了して、当時の「OSの時代」や米国でのプログラマーの地位について改めて考えさせられました。
</summary>
        </entry><entry xml:lang="en">
        <title>高中正義 - WORLD TOUR FINAL – 凱旋帰還に行ってきました</title>
        <published>2026-05-11T10:02:46+09:00</published>
        <updated>2026-05-11T10:02:46+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/takanaka/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/takanaka/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;takanaka&amp;#x2F;cover.webp?h=093ba3c90689dd68aeed&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;高中正義さんの「WORLD TOUR FINAL – 凱旋帰還」ライブが5月8日(金)にLINE CUBE SHIBUYA&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
で行われたので行ってきました。&lt;&#x2F;p&gt;
&lt;p&gt;昨年川崎での「&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;09&#x2F;takanaka&#x2F;&quot;&gt;SUPER TAKANAKA WORLD LIVE 2025-2026&lt;&#x2F;a&gt;」も行きましたが、そのままロンドン、ニューヨーク、ロサンゼルス、シドニーなど世界各地を巡るツアーが行われていました。今回は、各都市でソールドアウト公演を記録したワールドツアーの凱旋ライブという位置づけのようです。&lt;&#x2F;p&gt;
&lt;p&gt;セットリストはほぼ昨年と同じでしたが、今回は「TOKYO REGGIE」を会場全体で大合唱できたのが格別でした。観客の歌声がひとつに重なる時間は何物にも代えがたく、ライブならではの一体感を久しぶりに味わいました。前回の川崎公演でも感じたとおり、客席には若い海外のファンが目立ち、世代や国籍を越えて同じフレーズを口ずさんでいる光景は、ワールドツアーを経て凱旋した今だからこその景色だったように思います。&lt;&#x2F;p&gt;
&lt;p&gt;あまりに感動したので、家に戻ってから自分でも「TOKYO REGGIE」を演奏しました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay; encrypted-media&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2317884386&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;tokyo-reggie&quot; title=&quot;Tokyo Reggie&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Tokyo Reggie&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;渋谷公会堂 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">高中正義さんの「WORLD TOUR FINAL – 凱旋帰還」に行ってきました。会場一体となった「TOKYO REGGIE」の大合唱に感動し、自分でも弾いてみたものをSoundCloudに上げています。
</summary>
        </entry><entry xml:lang="en">
        <title>12年に一度の双宮守 - 香取神宮&#x2F;鹿島神宮</title>
        <published>2026-05-05T08:54:12+09:00</published>
        <updated>2026-05-05T08:54:12+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/05/sougu-mamori/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/05/sougu-mamori/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;05&amp;#x2F;sougu-mamori&amp;#x2F;cover.jpg?h=2bfc4b2524bce0c823c9&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;先日の連休に、香取神宮と鹿島神宮を訪ねて、無事に「双宮守」を授かることができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;双宮守とは&quot;&gt;双宮守とは&lt;&#x2F;h2&gt;
&lt;p&gt;双宮守（そうぐうまもり）は、千葉県香取市にある「香取神宮」と、茨城県鹿嶋市にある「鹿島神宮」で12年に一度の大祭「式年大祭御船祭」がある年にしか手に入れることができない特別なお守りです。&lt;&#x2F;p&gt;
&lt;p&gt;御船祭は、神功皇后の三韓征伐の際、鹿島の大神が船を守護したという故事に由来します。鹿島神宮の創建そのものはさらに古く、起源は2000年以上遡るとも伝わります。主催は鹿島神宮です。&lt;&#x2F;p&gt;
&lt;p&gt;そのため御守りは、両神宮の御座船をあしらったデザインとなっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜ鹿島神宮・香取神宮は神宮なのか？&quot;&gt;なぜ鹿島神宮・香取神宮は神宮なのか？&lt;&#x2F;h2&gt;
&lt;p&gt;東国三社は、鹿島神宮（茨城）、香取神宮（千葉）、息栖神社（茨城）の3社を指し、関東屈指のパワースポットとして知られています。&lt;&#x2F;p&gt;
&lt;p&gt;国譲り神話に由来し、それぞれ「勝負運（鹿島）」「勝運・海上守護（香取）」「交通安全・厄除（息栖）」などのご利益があるとされ、3社を巡ることでさらにご利益が高まると信じられています。&lt;&#x2F;p&gt;
&lt;p&gt;そもそも「神宮」という社号は、古代より格別の神を祀る社のみに与えられてきたものです。927年に成立した延喜式神名帳において「神宮」と記されたのは、伊勢神宮・鹿島神宮・香取神宮のわずか3社のみでした。皇祖神や国家鎮護に関わる神を祀る社にのみ与えられる、最高位の尊称だったわけです。&lt;&#x2F;p&gt;
&lt;p&gt;鹿島神宮の主祭神は武甕槌大神（タケミカヅチノオオカミ）、香取神宮の主祭神は経津主大神（フツヌシノオオカミ）。両神は国譲り神話において出雲に降り立ち、大国主命との交渉を成し遂げた武神とされます。律令国家の成立期、東国は蝦夷との境界地帯であったことから、両神宮はその守護として朝廷から特別な扱いを受け、神宮の称号が与えられたと考えられています。&lt;&#x2F;p&gt;
&lt;p&gt;3社の位置を地図上で結ぶと、ほぼ正三角形に近い形をなします。この配置が「結界」のように関東を護るとの伝えもあり、古来より霊的な意味が込められてきました。江戸時代には伊勢神宮参拝の後にこの3社を巡る「東国三社参り」の風習が広まり、現代でも武運・海上守護・交通安全とそれぞれ異なるご利益を一度に授かれる巡礼ルートとして、関東屈指のパワースポットと呼ばれています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;情報番組の功罪&quot;&gt;情報番組の功罪&lt;&#x2F;h2&gt;
&lt;p&gt;このお守りを頂こうと年初から何度か足を運びましたが、「帰れマンデー見っけ隊」という情報番組で取り上げたらしく予想以上の参拝客が押し寄せてお守りが品切れとなっていました。&lt;&#x2F;p&gt;
&lt;p&gt;放送後の数週間は授与所に連日長蛇の列ができ、用意された数のお守りは想定よりはるかに早く品切れとなったと聞きます。テレビで紹介されることにより認知が広がるのは喜ばしい面もありますが、12年に一度という稀少性が「収集目的」の参拝を加速させ、本来の信仰や祈願のために訪れた方々が御守りを受けられない事態を招きます。&lt;&#x2F;p&gt;
&lt;p&gt;12年を待ち望んできた方や地元の方にとっては不公平感が残り、神社側も想定外の対応に追われています。番組の制作側、視聴する側とも、希少な授与品の背景にある長年の信仰や神事への配慮があってほしいと感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;連休中の両神宮はものすごい参拝客でした。今回は朝早い時間に訪れたので、思いの外スムーズに参拝してお守りを授かることができました。&lt;&#x2F;p&gt;
&lt;p&gt;東国三社のうち息栖神社は今回スキップしてしまったので、近々に改めて参拝に訪れたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">12年に一度、午年にだけ授かれる御守り「双宮守」。次は2038年。情報番組で火がつき品切れが続く授与所に、何度か足を運びました。古代から東国を護ってきた香取神宮と鹿島神宮、国譲り神話の物語をたどります。
</summary>
        </entry><entry xml:lang="en">
        <title>rcloneとS3ライフサイクルで作る個人データのコールドアーカイブ</title>
        <published>2026-04-30T08:30:42+09:00</published>
        <updated>2026-05-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/rclone/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/rclone/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;rclone&amp;#x2F;cover.webp?h=549d1cce4801beb622f1&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;ドローンで撮りためた動画素材がNASの容量を圧迫してきたので、編集後はほとんど触らないものをAmazon S3に退避させる仕組みを作りました。手元から外しはするものの、まとめ直しのときに見返す可能性は残しておきたい、いわばコールドアーカイブの個人運用版です。&lt;&#x2F;p&gt;
&lt;p&gt;自宅はHome 5Gで上りが20〜30Mbpsと細いため、転送には &lt;code&gt;rclone&lt;&#x2F;code&gt; を使い、回線が太い場所にいるかどうかでパラメータを切り替えながらアップロードしています。さらに保管側はS3のライフサイクルで自動的にGlacier Deep Archiveに降格させ、月額数百円のレンジで運用できるようにしています。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、この「転送のチューニング」と「保管の自動化」の二段構えを、AWS側の設定からrcloneのオプション、最後にコスト試算まで通しでまとめます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜAmazon_S3を選んだか&quot;&gt;なぜAmazon S3を選んだか&lt;&#x2F;h2&gt;
&lt;p&gt;「眠らせておく置き場」に求める要件はおおむね以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;編集後はほとんどアクセスしないが、過去作をまとめ直すときに見返すことはある&lt;&#x2F;li&gt;
&lt;li&gt;手元のストレージやNASから退避させたい、しかし消したくはない&lt;&#x2F;li&gt;
&lt;li&gt;容量が増えても料金がじわじわ膨らまないこと&lt;&#x2F;li&gt;
&lt;li&gt;保管・削除の運用を手動でやらずに済むこと&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;クラウド側の候補としてはDropboxやBoxのようなサブスクリプション型ストレージも挙がりましたが、構造的な違いから最終的にAmazon S3を選びました。観点ごとの比較は以下のとおりです。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;料金構造&lt;&#x2F;dt&gt;
&lt;dd&gt;サブスク型は容量プラン単位の月額固定で、使っていない分にも払い続ける必要があります。S3は置いた分・使った分だけの従量課金で、「ほとんど触らないが消したくない」数百GBの素材を保管するだけなら割安に収まります。&lt;&#x2F;dd&gt;
&lt;dt&gt;ストレージクラス&lt;&#x2F;dt&gt;
&lt;dd&gt;サブスク型は内部的にHotストレージのみで、アクセス頻度の低いファイルでも単価は変わりません。S3はStandard &#x2F; Standard-IA &#x2F; Glacier &#x2F; Glacier Deep Archiveと複数階層があり、Deep Archiveまで落とせばStandardより一桁安い単価で保管できます。&lt;&#x2F;dd&gt;
&lt;dt&gt;運用の自動化&lt;&#x2F;dt&gt;
&lt;dd&gt;サブスク型はファイルの整理・移動・削除を手動で行う前提です。S3はライフサイクルで「3日後にDeep Archiveへ降格、2年後に削除」のようなルールを宣言的に書いておけるため、長期保管の管理コストもほぼかかりません。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;ひとつだけ運用上の注意点があります。S3にアップロード後すぐにNASから消してしまうと、S3が事実上の唯一コピーになります。バックアップの基本である3-2-1ルール（コピー3、媒体2、オフサイト1）の観点では、編集が完全に終わった素材であっても、NAS側を一定期間（例: 半年〜1年）残しておくと安全側に倒せます。私はNASの容量に余裕がある間は最近のフライトを残し、容量を圧迫してきたら古いものから順にNAS側を整理する運用にしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rcloneとは&quot;&gt;rcloneとは&lt;&#x2F;h2&gt;
&lt;p&gt;S3へのアップロードツールとしては&lt;code&gt;rclone&lt;&#x2F;code&gt;を使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;rclone&lt;&#x2F;code&gt;は70以上のクラウドストレージに対応する汎用ファイル転送ツールです。S3・Google Drive・Dropbox・OneDrive・SFTP・WebDAVなどを統一的なコマンドで扱えます。rsyncのクラウド版というのが一番近い説明です。&lt;&#x2F;p&gt;
&lt;p&gt;これまではMacのGUIアプリ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;panic.com&#x2F;transmit&#x2F;&quot;&gt;Transmit&lt;&#x2F;a&gt; や、コマンドラインの &lt;code&gt;s3cmd&lt;&#x2F;code&gt; を使っていました。日常的なファイル転送ではどちらも十分でしたが、今回のように回線が細く中断も起こり得る環境で大量にアップロードする用途では、&lt;code&gt;rclone&lt;&#x2F;code&gt; のほうが明確に向いていました。観点ごとの違いは以下のとおりです。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;転送のチューニング&lt;&#x2F;dt&gt;
&lt;dd&gt;TransmitはGUIで直感的に扱える一方、並列度やチャンクサイズなどの細かい調整はできません。&lt;code&gt;s3cmd&lt;&#x2F;code&gt; もマルチスレッド転送や帯域制御は限定的です。&lt;code&gt;rclone&lt;&#x2F;code&gt; は並列度・チャンクサイズ・帯域上限・リトライまで細かく指定でき、細い回線でもスループットを引き出せます。&lt;&#x2F;dd&gt;
&lt;dt&gt;不安定な回線への耐性&lt;&#x2F;dt&gt;
&lt;dd&gt;&lt;code&gt;rclone&lt;&#x2F;code&gt; はETagによるチェックサム比較で同一ファイルの再転送をスキップでき、リトライも「ジョブ全体」と「個別HTTPリクエスト」の2階層で設定できます。中断・再開が前提のアーカイブ運用に向いた作りです。&lt;&#x2F;dd&gt;
&lt;dt&gt;対応バックエンドの広さ&lt;&#x2F;dt&gt;
&lt;dd&gt;&lt;code&gt;s3cmd&lt;&#x2F;code&gt; は名前のとおりS3専用です。&lt;code&gt;rclone&lt;&#x2F;code&gt; はS3以外にも多数のクラウドに同じインターフェースで対応するため、将来別のサービスに移行・併用する場合もコマンド体系を変えずに済みます。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;AWS側の設定&quot;&gt;AWS側の設定&lt;&#x2F;h2&gt;
&lt;p&gt;最初にAWS側で必要な準備を済ませておきます。具体的には、転送に使うIAMユーザーの権限と、保管ルールを定義するS3のライフサイクル設定の2点です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;IAMの権限設定&quot;&gt;IAMの権限設定&lt;&#x2F;h3&gt;
&lt;p&gt;S3バケットへのアクセス権を持つIAMユーザーを作成し、アクセスキーを発行します。ルートアカウントのキーは絶対に使わないでください。最小権限のIAMポリシー例は以下のとおりです（バケット名を &lt;code&gt;video-backup&lt;&#x2F;code&gt; とする場合）。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot; data-name=&quot;iam-policy.json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;2012-10-17&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Statement&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Effect&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Allow&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Action&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;s3:ListBucket&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;s3:GetBucketLocation&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Resource&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;arn:aws:s3:::video-backup&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Effect&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Allow&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Action&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;s3:PutObject&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;s3:GetObject&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;s3:DeleteObject&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;s3:AbortMultipartUpload&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;s3:ListMultipartUploadParts&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Resource&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;arn:aws:s3:::video-backup&#x2F;*&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;s3:AbortMultipartUpload&lt;&#x2F;code&gt; はマルチパートアップロード失敗時のクリーンアップに必要です。これがないと中断したアップロードの残骸が課金対象として残り続けてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;ここまでの内容をAWS CLIで適用する手順は以下のとおりです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# IAM ユーザーを作成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam create-user --user-name rclone-backup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 上記の iam-policy.json からポリシーを作成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam create-policy&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --policy-name VideoBackupPolicy&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --policy-document file:&#x2F;&#x2F;iam-policy.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ユーザーにポリシーをアタッチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;ACCOUNT_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sts get-caller-identity --query Account --output text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam attach-user-policy&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --user-name rclone-backup&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --policy-arn arn:aws:iam::&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-source&quot;&gt;${ACCOUNT_ID}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:policy&#x2F;VideoBackupPolicy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# アクセスキーを発行（SecretAccessKey は一度しか表示されないので保管すること）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam create-access-key --user-name rclone-backup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;最後のコマンドで返ってきた &lt;code&gt;AccessKeyId&lt;&#x2F;code&gt; と &lt;code&gt;SecretAccessKey&lt;&#x2F;code&gt; は、後段の &lt;code&gt;rclone config&lt;&#x2F;code&gt; でそのまま使います。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;S3ライフサイクルルール&quot;&gt;S3ライフサイクルルール&lt;&#x2F;h3&gt;
&lt;p&gt;長期アーカイブ用途では、ストレージクラスを段階的に下げて保管料を抑えたり、中断したマルチパートアップロードの残骸を自動で掃除するルールを入れておくと、安全かつ低コストで運用できます。以下は2つのルールを1ファイルで設定する例です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ルール1: アップロード後3日経過したオブジェクトをGlacier Deep Archiveに移し、2年（730日）後に削除する&lt;&#x2F;li&gt;
&lt;li&gt;ルール2: 7日以上完了していないマルチパートアップロードを中止してパートを削除する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;lifecycle.json&lt;&#x2F;code&gt; を用意します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot; data-name=&quot;lifecycle.json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Rules&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ArchiveAfter3DaysExpireAfter2Years&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Status&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Enabled&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Transitions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Days&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;StorageClass&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;DEEP_ARCHIVE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Expiration&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Days&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 730&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;AbortIncompleteMultipartUploadAfter7Days&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Status&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Enabled&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;AbortIncompleteMultipartUpload&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;DaysAfterInitiation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;バケットに適用します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3api put-bucket-lifecycle-configuration&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --bucket video-backup&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --lifecycle-configuration file:&#x2F;&#x2F;lifecycle.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;現在の設定を確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3api get-bucket-lifecycle-configuration --bucket video-backup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;設定にあたっての注意点は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Filter: {}&lt;&#x2F;code&gt; はバケット全体が対象という意味。プレフィックスで絞るなら &lt;code&gt;&quot;Filter&quot;: {&quot;Prefix&quot;: &quot;video&#x2F;&quot;}&lt;&#x2F;code&gt; のように書く&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Days&lt;&#x2F;code&gt; はオブジェクトの作成日からの経過日数。ライフサイクルの判定はUTCの00:00に1日1回走るため、設定した翌日にすぐ動くわけではない&lt;&#x2F;li&gt;
&lt;li&gt;Glacier Deep Archiveは最安だが、復元に最大48時間（Bulkなら数時間）かかる。「もう見ない可能性が高いがゼロではない」素材向き&lt;&#x2F;li&gt;
&lt;li&gt;Deep Archiveは最低保管期間が180日。180日未満で削除や移動をすると残り日数分の料金が発生する。今回は作成3日後に移して2年後（DAに約720日滞在）に削除するため、最低保管期間は十分満たす&lt;&#x2F;li&gt;
&lt;li&gt;128KB未満の小さいオブジェクトはDeep Archiveへの移行対象外（移行してもStandardに留まる）。動画用途なら気にしなくて構わないが、混在バケットでは留意しておく&lt;&#x2F;li&gt;
&lt;li&gt;マルチパートアップロード残骸の削除ルールは、IAMポリシーの &lt;code&gt;s3:AbortMultipartUpload&lt;&#x2F;code&gt; とは別に必要。IAMはクライアント側が中止する権限、ライフサイクルはS3側が自動で中止してくれる仕組みなので、両方そろえておくのが望ましい状態&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;rcloneのインストールと設定&quot;&gt;rcloneのインストールと設定&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install rclone&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;リモートの設定は &lt;code&gt;rclone config&lt;&#x2F;code&gt; を起動して対話的に進めます。新規リモート作成時に入力していく項目を抜粋すると以下のとおりです（&lt;code&gt;&amp;gt;&lt;&#x2F;code&gt; の左がプロンプト、右が入力値）。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rclone config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;n&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;) New remote&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3-aws&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Storage&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; AWS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;env_auth&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-false&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;access_key_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; AKIA...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;secret_access_key&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;region&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;endpoint&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;     （空欄でOK）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;location_constraint&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;acl&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; private&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;storage_class&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; STANDARD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;設定ファイルは &lt;code&gt;~&#x2F;.config&#x2F;rclone&#x2F;rclone.conf&lt;&#x2F;code&gt; に&lt;strong&gt;平文&lt;&#x2F;strong&gt;で保存されます。共用マシンでは取り扱いに注意してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rcloneの推奨パラメータ&quot;&gt;rcloneの推奨パラメータ&lt;&#x2F;h2&gt;
&lt;p&gt;自宅のHome 5G（上り20〜30Mbps）想定での起動例は以下のとおりです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rclone&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; copy .&#x2F;video&#x2F; s3-aws:video-backup&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --transfers&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-chunk-size 64M&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-upload-concurrency&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-no-check-bucket&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --checksum&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --progress&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --low-level-retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-file=rclone-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d-%H%M%S&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.log&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-level INFO&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;S3では1ファイル内の並列度は &lt;code&gt;--s3-upload-concurrency&lt;&#x2F;code&gt; が直接コントロールするため、&lt;code&gt;--multi-thread-streams&lt;&#x2F;code&gt; は併用しません。両方指定しても効果が二重に効くわけではなく、メモリ使用量だけが増えてしまうので、&lt;strong&gt;S3 バックエンドでは &lt;code&gt;--s3-upload-concurrency&lt;&#x2F;code&gt; に一本化&lt;&#x2F;strong&gt; します。回線が太い環境（オフィス・コワーキングスペース等で上り100Mbps以上）では &lt;code&gt;--transfers 4&lt;&#x2F;code&gt; まで増やしても問題ありません。&lt;&#x2F;p&gt;
&lt;p&gt;各オプションの意味と推奨値は以下のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;オプション&lt;&#x2F;th&gt;&lt;th&gt;推奨値&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;--transfers&lt;&#x2F;td&gt;&lt;td&gt;1〜2（細回線）&#x2F; 4（太回線）&lt;&#x2F;td&gt;&lt;td&gt;同時に転送するファイル数。Home 5G のような上り20〜30Mbps の環境では 1〜2 のほうがファイルの完了が早く、リトライ時の損失も小さい&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--s3-chunk-size&lt;&#x2F;td&gt;&lt;td&gt;64M&lt;&#x2F;td&gt;&lt;td&gt;マルチパートアップロードの1パートのサイズ。デフォルト 5M を動画用途では 64M〜128M に。メモリ使用量が &lt;code&gt;chunk_size × upload_concurrency × transfers&lt;&#x2F;code&gt; で増える点に注意&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--s3-upload-concurrency&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1ファイル内で同時にアップロードするパート数&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--s3-no-check-bucket&lt;&#x2F;td&gt;&lt;td&gt;有効&lt;&#x2F;td&gt;&lt;td&gt;バケット存在チェックをスキップ。最小権限 IAM ではデフォルトのままだと起動時のチェックがエラーになることがある&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--checksum&lt;&#x2F;td&gt;&lt;td&gt;有効&lt;&#x2F;td&gt;&lt;td&gt;ETag 比較で同一ファイルの再転送をスキップ。サイズと更新時刻だけのデフォルトより確実&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--retries&lt;&#x2F;td&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;ジョブ全体のリトライ回数&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--low-level-retries&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;td&gt;個別 HTTP リクエストのリトライ回数&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--progress (-P)&lt;&#x2F;td&gt;&lt;td&gt;有効&lt;&#x2F;td&gt;&lt;td&gt;リアルタイムで進捗を表示&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--log-file&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;rclone-$(date +%Y%m%d-%H%M%S).log&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ログをファイルに残しておくとエラー追跡や再開判断に役立つ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--log-level&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;INFO&lt;&#x2F;code&gt;（デバッグ時 &lt;code&gt;DEBUG&lt;&#x2F;code&gt;）&lt;&#x2F;td&gt;&lt;td&gt;ログレベル&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;--bwlimit&lt;&#x2F;td&gt;&lt;td&gt;状況に応じて&lt;&#x2F;td&gt;&lt;td&gt;上限を制限（例: &lt;code&gt;10M&lt;&#x2F;code&gt;）。&lt;code&gt;--bwlimit &quot;08:00,512k 18:00,off&quot;&lt;&#x2F;code&gt; のように時刻指定で時間帯ごとに切り替えも可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;ライフサイクルでDeep Archiveに降格したオブジェクトに対して、&lt;code&gt;rclone copy&lt;&#x2F;code&gt; で同名ファイルを再アップロードしようとすると、内部で実行されるGET（既存ファイルとのチェックサム比較）がDeep Archiveオブジェクトに対しては失敗します。同じパスに同名ファイルを再投入する用途がある場合は、&lt;code&gt;--immutable&lt;&#x2F;code&gt;（同名ファイルが既に存在したら転送をスキップしてエラーにしない）か &lt;code&gt;--no-traverse&lt;&#x2F;code&gt;（既存ファイルとの比較をしない）を併用するか、そもそも保存先のキー命名でタイムスタンプを含めて衝突を避けます。今回の動画アーカイブのようにファイル名がフライト日時で一意な場合は、特別な対策は不要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;macで中断させない方法&quot;&gt;macで中断させない方法&lt;&#x2F;h2&gt;
&lt;p&gt;長時間の転送中にmacOSがスリープに入ると転送が止まります。&lt;code&gt;caffeinate&lt;&#x2F;code&gt; を使ってシステムスリープを抑止しながら実行します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;&lt;code&gt;caffeinate&lt;&#x2F;code&gt; は macOS に標準で含まれるコマンドです。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;caffeinate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -i rclone copy .&#x2F;video&#x2F; s3-aws:video-backup&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --transfers&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-chunk-size 64M&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-upload-concurrency&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-no-check-bucket&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --checksum&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --progress&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --low-level-retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-file=rclone-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d-%H%M%S&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.log&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-level INFO&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;主なオプションは以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i&lt;&#x2F;code&gt; システムのアイドルスリープを防止（プロセスが終わるまで有効）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;&#x2F;code&gt; ディスプレイのスリープも防止（不要なら省略）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;&#x2F;code&gt; AC電源接続時のみスリープ防止&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-u -t 3600&lt;&#x2F;code&gt; 指定秒数だけスリープ防止（プロセスを伴わない用途）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;caffeinate&lt;&#x2F;code&gt; を前置すると、そのコマンドが終了するまで自動でスリープ抑止が解除されます。バックグラウンドで動かす場合は &lt;code&gt;nohup caffeinate -i rclone copy ... &amp;amp;&lt;&#x2F;code&gt; のようにすれば、ターミナルを閉じても継続します（ログは &lt;code&gt;--log-file&lt;&#x2F;code&gt; に必ず残しておきます）。&lt;&#x2F;p&gt;
&lt;p&gt;蓋を閉じてもスリープさせたくない場合は &lt;code&gt;caffeinate&lt;&#x2F;code&gt; だけでは不十分なことがあるので、事前に以下を実行しておくか、別途 &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;app&#x2F;amphetamine&#x2F;id937984704&quot;&gt;Amphetamine&lt;&#x2F;a&gt; のようなツールを使うのが確実です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; pmset -a disablesleep&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;   # 蓋を閉じてもスリープしない（作業後は0に戻す）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;認証情報の管理を1Password_CLIに移す（2026-05-05更新）&quot;&gt;認証情報の管理を1Password CLIに移す（2026-05-05更新）&lt;&#x2F;h2&gt;
&lt;p&gt;ここまでの設定では &lt;code&gt;~&#x2F;.config&#x2F;rclone&#x2F;rclone.conf&lt;&#x2F;code&gt; にAWSのアクセスキーが平文で残ります。dotfilesで同期したり共用マシンに置く運用では避けたいので、認証情報を &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.1password.com&#x2F;docs&#x2F;cli&#x2F;&quot;&gt;1Password CLI&lt;&#x2F;a&gt; (&lt;code&gt;op&lt;&#x2F;code&gt;) に移し、&lt;code&gt;op run&lt;&#x2F;code&gt; で実行時に環境変数として注入する構成も用意しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;rclone.conf&lt;&#x2F;code&gt; 側はキーを書かず、&lt;code&gt;env_auth = true&lt;&#x2F;code&gt; にしてAWS標準の認証情報チェーン（環境変数→&lt;code&gt;~&#x2F;.aws&#x2F;credentials&lt;&#x2F;code&gt;→IAMロール）から都度取得する動作に変えます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;ini&quot; data-name=&quot;~&#x2F;.config&#x2F;rclone&#x2F;rclone.conf&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-section z-group-title z-ini&quot;&gt;s3-aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; s3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; AWS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;env_auth&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;region&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;location_constraint&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;acl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; private&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-other z-definition z-ini&quot;&gt;storage_class&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; STANDARD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;発行済みのキーは1Passwordに保管します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;op&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; item create --category=&amp;quot;API Credential&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --vault=Private&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --title=&amp;quot;rclone-backup-aws&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  username=&amp;quot;AKIA...&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  credential=&amp;quot;...&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;参照用のenvテンプレートを &lt;code&gt;~&#x2F;.config&#x2F;rclone&#x2F;s3-backup.env&lt;&#x2F;code&gt; として配置します。&lt;code&gt;rclone.conf&lt;&#x2F;code&gt; と同じディレクトリで管理でき、値ではなく &lt;code&gt;op:&#x2F;&#x2F;...&lt;&#x2F;code&gt; の参照しか書かれないため、dotfilesに含めて同期しても問題ありません。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;~&#x2F;.config&#x2F;rclone&#x2F;s3-backup.env&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;AWS_ACCESS_KEY_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;op:&#x2F;&#x2F;Private&#x2F;rclone-backup-aws&#x2F;username&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;AWS_SECRET_ACCESS_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;op:&#x2F;&#x2F;Private&#x2F;rclone-backup-aws&#x2F;credential&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;実行時は &lt;code&gt;op run --env-file&lt;&#x2F;code&gt; でラップし、&lt;code&gt;op&lt;&#x2F;code&gt; が1Passwordから値を取り出して環境変数として注入します。先述の起動例は以下のように書き換わります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;op&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; run --env-file=&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;.config&#x2F;rclone&#x2F;s3-backup.env&amp;quot; -- rclone copy .&#x2F;video&#x2F; s3-aws:video-backup&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --transfers&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-chunk-size 64M&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-upload-concurrency&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-no-check-bucket&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --checksum&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --progress&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --low-level-retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-file=rclone-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d-%H%M%S&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.log&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-level INFO&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;caffeinate&lt;&#x2F;code&gt; と組み合わせる場合は、&lt;code&gt;caffeinate&lt;&#x2F;code&gt; を最外殻に置きます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;caffeinate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -i op run --env-file=&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$HOME&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;.config&#x2F;rclone&#x2F;s3-backup.env&amp;quot; -- rclone copy .&#x2F;video&#x2F; s3-aws:video-backup&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --transfers&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-chunk-size 64M&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-upload-concurrency&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --s3-no-check-bucket&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --checksum&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --progress&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --low-level-retries&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-file=rclone-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d-%H%M%S&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.log&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --log-level INFO&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;rcloneのチューニングとS3のライフサイクルを組み合わせて、個人データのコールドアーカイブを構築する構成をまとめました。回線の細さに左右されず転送を完了させ、長期保管のコストはストレージクラスの自動降格で抑える、という二段構えです。&lt;&#x2F;p&gt;
&lt;p&gt;参考として、私の運用パターン（月3フライト × 1回20GB = 月60GB）で運用した場合の年度ごとの料金見積もりは以下のようになります。3日後にGlacier Deep Archiveへ降格、2年で削除するライフサイクルを前提としています。NASにローカルコピーを保持しているため、S3のStandard滞在は最小限に切り詰めています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;左記は保管料のみ。取り出す場合には別途料金が発生します。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    xychart-beta
title &quot;年度ごとのS3保管料金（千円）&quot;
x-axis [&quot;1年目&quot;, &quot;2年目&quot;, &quot;3年目&quot;, &quot;4年目&quot;, &quot;5年目&quot;]
y-axis &quot;料金（千円）&quot; 0 --&gt; 7
bar [1.6, 4.2, 5.5, 5.5, 5.5]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;1〜2年目はDeep Archive側に毎年720GBずつ積み上がるため線形に増加し、3年目以降は毎月のアップロード分と削除分が釣り合って定常状態に入り、年額 ¥5,500程度・累積保管量約1.5TBで頭打ちになります。月額換算すると ¥460程度で、Standard滞在を3日に切り詰めることで、料金のほぼ全てがDeep Archiveの単価で支配される構成です。料金は1ドル=¥150換算、AWSの公開価格（ap-northeast-1、執筆時点）に基づく概算なので、実費は為替・価格改定・取り出し料金で変動します。&lt;&#x2F;p&gt;
&lt;p&gt;この設計の枠組みは、データ特性に合わせて他の用途にも応用できます。私は同じS3アカウントでLogic Proの楽曲プロジェクト（月4曲、1曲500MB）も管理しており、こちらは「再編集の可能性が長く残る」という性質に合わせて、Standard滞在を1年・削除を10年に設定しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;&#x2F;th&gt;&lt;th&gt;月次&lt;&#x2F;th&gt;&lt;th&gt;Std→DA&lt;&#x2F;th&gt;&lt;th&gt;削除&lt;&#x2F;th&gt;&lt;th&gt;定常年額&lt;&#x2F;th&gt;&lt;th&gt;定常容量&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ドローン動画&lt;&#x2F;td&gt;&lt;td&gt;60 GB&lt;&#x2F;td&gt;&lt;td&gt;3日&lt;&#x2F;td&gt;&lt;td&gt;2年&lt;&#x2F;td&gt;&lt;td&gt;¥5,500&lt;&#x2F;td&gt;&lt;td&gt;1.5 TB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;楽曲プロジェクト&lt;&#x2F;td&gt;&lt;td&gt;2 GB&lt;&#x2F;td&gt;&lt;td&gt;1年&lt;&#x2F;td&gt;&lt;td&gt;10年&lt;&#x2F;td&gt;&lt;td&gt;¥1,900&lt;&#x2F;td&gt;&lt;td&gt;240 GB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;両方合算しても月額 ¥620程度、合計約1.7TBです。データの性格に応じてライフサイクルを分ければ、同じ仕組みで複数の用途を最適化できます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ドローンの動画素材やLogic Proの楽曲データなど、編集後はほとんど触らないが消したくないデータの「眠らせ場所」を、Amazon S3とrcloneで構築した記録です。細回線でも止まらない転送のチューニングから、Glacier Deep Archiveを使った長期保管のコスト設計まで、二段構えでまとめました。
</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Weathered</title>
        <published>2026-04-29T05:58:49+09:00</published>
        <updated>2026-04-29T05:58:49+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/weathered/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/weathered/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;weathered&amp;#x2F;shedding.jpg?h=b90e1032437fa01ee503&quot;
  alt=&quot;skin&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;Shedding&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;A Chiba Monorail pillar, shedding white&lt;br&gt;
forty years of sun, rain, and quiet light.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17517&quot;&gt;#Weathered&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">Photo Friday の「Weathered」へ寄せた一枚。千葉モノレールの柱が白く脱皮していく姿に、40年分の光と雨が刻まれています。
</summary>
        </entry><entry xml:lang="en">
        <title>DJI Avata 2 シネマティック設定ガイド</title>
        <published>2026-04-27T16:30:00+09:00</published>
        <updated>2026-05-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/dji-avata2-cinematic/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/dji-avata2-cinematic/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;dji-avata2-cinematic&amp;#x2F;cover.webp?h=660c45e128c8a1e61d12&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1013&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;DJI Avata 2でシネマティックな映像を撮るために、自分が使っているカメラ設定とPost Productionの手順をまとめました。DJI Goggle 3とDJI FPV送信機3を使ったマニュアルモードでの飛行&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を前提とし、D-Log MとGyroflowを活用したワークフローです。&lt;&#x2F;p&gt;
&lt;p&gt;海外のAvata 2ユーザーのブログ記事やYouTubeから情報を集めて研究した設定で、現時点での最適解と考えています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;ogwig1EU4CQ&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;露出設定&quot;&gt;露出設定&lt;&#x2F;h2&gt;
&lt;p&gt;撮影モードはマニュアルモードを使用し、ISOとシャッタースピードも手動で設定します。&lt;&#x2F;p&gt;
&lt;p&gt;ISOはできる限り低く抑えるのが基本で、ISO 100が理想的です。明暗差の大きいエリアを飛行する場合は、Auto ISOに切り替えると露出変化に対応しやすくなります。&lt;&#x2F;p&gt;
&lt;p&gt;シャッタースピードの設定は撮影スタイルによって異なります。いずれもNDフィルター使用時は「180度ルール」を適用し、シャッタースピードを撮影フレームレートの2倍の分母に設定します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;180度ルールとは&lt;&#x2F;strong&gt;
        &lt;p&gt;映画撮影で標準的に用いられるシャッター角度の慣習に由来します。フィルムカメラの回転シャッターが180度（半回転）開いている間に露光することから、露光時間がフレーム間隔の半分になります。デジタルカメラでは「シャッタースピード = 1 &#x2F;（フレームレート × 2）」と換算します。このルールに従うと、人間の目に自然に見える適度なモーションブラーが得られ、映画的（シネマティック）な質感になります。シャッタースピードをこれより速くするとブラーが減りパラパラとした硬い映像に、遅くするとブラーが過剰になり不明瞭な映像になります。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通常のシネマティック撮影&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;60FPS &#x2F; シャッタースピード1&#x2F;120秒 &#x2F; NDフィルター使用&lt;&#x2F;li&gt;
&lt;li&gt;60FPSで撮影するのはゴーグルのライブビューがカクつかないため&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;スローモーションを前提とした撮影&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;100FPS &#x2F; シャッタースピード1&#x2F;200秒 &#x2F; NDフィルター使用 &#x2F; 16:9（100FPSは16:9限定）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;アグレッシブなフリースタイル撮影&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;60FPS &#x2F; NDフィルターなし &#x2F; 適正露出になるようシャッタースピードを上げて調整&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ND濃度は撮影環境の明るさに応じて選びます。私は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4mT7jZv&quot;&gt;K&amp;amp;F ConceptのND&#x2F;PL複合フィルター（ND8&#x2F;PL〜ND64&#x2F;PL）&lt;&#x2F;a&gt;を使用しています&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;PL（偏光フィルター）は水面やガラスなどの反射を抑え、空を濃く・葉の緑を鮮やかに見せる効果がある。NDとの複合フィルターは光量減衰と偏光の両方を1枚で兼ねる。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;撮影環境&lt;&#x2F;th&gt;&lt;th&gt;推奨ND&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;曇天・薄暮&lt;&#x2F;td&gt;&lt;td&gt;ND8&#x2F;PL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;標準的な屋外&lt;&#x2F;td&gt;&lt;td&gt;ND16&#x2F;PL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;晴天&lt;&#x2F;td&gt;&lt;td&gt;ND32&#x2F;PL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;直射晴天・水面反射等&lt;&#x2F;td&gt;&lt;td&gt;ND64&#x2F;PL&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00txg35.9srin05b.g00txg35.9srio327&#x2F;kaereba_main_202604281230333352?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fkentfaith%2Fsku-2295%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fkentfaith%2Fi%2F10001082%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;kentfaith&#x2F;cabinet&#x2F;top&#x2F;imgrc0102392131.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00txg35.9srin05b.g00txg35.9srio327&#x2F;kaereba_main_202604281230333352?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fkentfaith%2Fsku-2295%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fkentfaith%2Fi%2F10001082%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;限定10％OFFxP5倍!!　 DJI AVATA2 専用 フィルターセット(ND8&#x2F;PL+ND16&#x2F;PL+ND32&#x2F;PL+ND64&#x2F;PL) ND&amp;amp;PLフィルター 1枚2役 保護フィルター 装着便利 減光量調整 AGC光学ガラス コントラスト強調 ナノコーティング 撥水防汚&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202604281230333352?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FKF%2520CONCEPT%2520DJI%2520AVATA2%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=KF%20CONCEPT%20DJI%20AVATA2&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;ホワイトバランス&quot;&gt;ホワイトバランス&lt;&#x2F;h2&gt;
&lt;p&gt;ホワイトバランスは手動で設定します。オートホワイトバランスは飛行中に色温度が変動し、Post Productionでの補正が困難になるため使用しません。撮影状況に応じた目安は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;晴天：5600K（一般的な基準：5500〜6000K）&lt;&#x2F;li&gt;
&lt;li&gt;曇り：6300K以上（一般的な基準：6000〜7000K）&lt;&#x2F;li&gt;
&lt;li&gt;日の出・日の入り：5700K（一般的な光源の色温度は3000〜4500Kだが、ここではあえて高めに設定することで暖色を強調し、ゴールデンアワーの雰囲気を演出する意図）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;D-Log Mで撮影する場合、ホワイトバランスはPost Productionのカラーグレーディングでも調整可能です。撮影時の設定に迷う場合は、ニュートラルに近い値で撮影しておき、Post Productionで追い込む方法もあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;解像度とフレームレート&quot;&gt;解像度とフレームレート&lt;&#x2F;h2&gt;
&lt;p&gt;解像度は4Kを使用します。フレームレートは60FPSを推奨します（30FPSにするとゴーグルのライブ映像でカクつくことがあります）。スローモーション撮影には4K・100FPSを使用します（16:9限定）。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;カラープロファイル&quot;&gt;カラープロファイル&lt;&#x2F;h2&gt;
&lt;p&gt;撮影時に選べるカラープロファイルは、ノーマルカラーとD-Log Mの2種類です。どちらを選ぶかで、撮って出し寄りの運用にするか、Post Productionで追い込むかという方向性が決まります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ノーマルカラー：カメラからそのまま使える色合いが得られるが、ダイナミックレンジが狭く、カラーグレーディングの調整幅は限られる&lt;&#x2F;li&gt;
&lt;li&gt;D-Log M：ダイナミックレンジが大幅に広がり、カラーグレーディングの自由度が高い。扱いやすく、きれいに仕上げやすい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;シネマティックな仕上がりを目指す場合はD-Log Mを選択します。後述するSkyGrades LUTもD-Log M向けに設計されているため、このワークフローでは事実上D-Log Mが前提となります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;画角と手ぶれ補正&quot;&gt;画角と手ぶれ補正&lt;&#x2F;h2&gt;
&lt;p&gt;手ぶれ補正はRockSteadyを使用せず、EISをオフにしてGyroflowでPost Production補正します。EISオフ時にジャイロデータが記録され、Gyroflowに通すことでRockSteadyよりもなめらかな仕上がりが得られます。&lt;&#x2F;p&gt;
&lt;p&gt;Gyroflowを使用するための条件は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;EIS（電子手ぶれ補正）をオフにする&lt;&#x2F;li&gt;
&lt;li&gt;FOVをワイドに設定する（ジャイロデータが記録されるのはワイド設定時のみ）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;FOVについて、ノーマルは画角が狭すぎるため非推奨です。ウルトラワイドはGyroflowに対応しておらず、歪みも大きくなるため使用しません。&lt;&#x2F;p&gt;
&lt;p&gt;アスペクト比は通常4:3を推奨します。4:3はセンサーの全画角を使うため、Gyroflowの補正マージンが広く取れます。また、16:9や9:16に後からリフレームも可能です。ただし、スローモーション撮影（100FPS）は16:9限定のため、Gyroflowの補正マージンが狭くなる点に注意してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ゲインとExpoチューニング&quot;&gt;ゲインとExpoチューニング&lt;&#x2F;h2&gt;
&lt;p&gt;この項目はカメラ設定ではなく、コントローラーのスティック感度と飛行特性の設定です。一般に「Rate」と呼ばれるものです。&lt;&#x2F;p&gt;
&lt;p&gt;シネマティックな映像には滑らかな飛行操作が不可欠なため、飛行スタイルに応じた調整が必要です。
しかし、個人の感覚に依存するもので最適値は個人差があるため、自分に合う値を探してみてください。&lt;&#x2F;p&gt;
&lt;p&gt;以下は私のシネマティック撮影向け設定例です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;dji-avata2-cinematic&amp;#x2F;rate.webp?h=a8c948f037e6945a3e51&quot;
  alt=&quot;&quot; width=&quot;934&quot; height=&quot;384&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;設定の意図としては、ロールとピッチはある程度の機動性を確保しつつ、中央付近の操作が滑らかになるよう、Expoを高めにしています。ヨーはセンター感度と最大レートを大きく下げ、パン動作が急激にならないよう調整しています。シネマティック撮影ではヨーの滑らかさが映像品質に直結するため、意図して鈍感に設定しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;カメラアングル（チルト角）&quot;&gt;カメラアングル（チルト角）&lt;&#x2F;h2&gt;
&lt;p&gt;カメラアングルは飛行速度と映像の見え方に直結します。角度が大きいほど高速で飛行でき、映像のスピード感も増します。一般的な目安は以下のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;飛行スタイル&lt;&#x2F;th&gt;&lt;th&gt;推奨角度&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;スローなシネマティック（cinewhoop的）&lt;&#x2F;td&gt;&lt;td&gt;10度以下&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;通常のシネマティック巡航&lt;&#x2F;td&gt;&lt;td&gt;15〜25度&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;フリースタイル&lt;&#x2F;td&gt;&lt;td&gt;25〜35度&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;レース&lt;&#x2F;td&gt;&lt;td&gt;45度以上&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;私は&lt;strong&gt;30度&lt;&#x2F;strong&gt;にしています。
マニュアルモードでのダイナミックなシネマティック撮影を前提とし、ダイブや高速巡航を含む積極的な飛行に対応しつつ、シネマティックの範囲に収まる角度として設定しています。その場の飛行スタイルで変更するのもよいでしょう。ただし、慣れない内は決まったアングル角で飛ばすほうが感覚をつかみやすいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;その他のカメラ設定&quot;&gt;その他のカメラ設定&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;シャープネス：-2（最低値。インカメラのシャープニングは破壊的処理のため、最低に設定しPost Productionで適用する）&lt;&#x2F;li&gt;
&lt;li&gt;ノイズリダクション：-2（最低値。インカメラのNRはディテールを潰すため、最低に設定しPost Productionで処理する）&lt;&#x2F;li&gt;
&lt;li&gt;センターマーカー：オン（画面中央に「X」を表示。隙間やゲートを通過する際の照準に使用）&lt;&#x2F;li&gt;
&lt;li&gt;グリッドライン：オン（三分割法の構図補助線を表示。映像の構図を意識した撮影に有用）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;安全設定と機体保護&quot;&gt;安全設定と機体保護&lt;&#x2F;h2&gt;
&lt;p&gt;大前提ですが、Avata2は100g以上の機体のため航空法の遵守が必要です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;DIPS2.0での機体登録とリモートID搭載&lt;&#x2F;li&gt;
&lt;li&gt;認証機体でないため、包括申請による飛行承認が必須&lt;&#x2F;li&gt;
&lt;li&gt;DIPS2.0での飛行計画通報は必須&lt;&#x2F;li&gt;
&lt;li&gt;国土交通省の定める書式にて飛行日誌の作成が必要&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;映像設定とは直接関係ありませんが、安全な飛行のために以下の設定を推奨します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTH高度&lt;&#x2F;strong&gt;：屋外では周囲の障害物より高い高度を設定する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;電波ロスト時の動作&lt;&#x2F;strong&gt;：屋外でRTHが可能な環境ではRTH、屋内などRTHが適さない環境ではホバリングに設定する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;最大高度&lt;&#x2F;strong&gt;：日本の航空法では150m未満の制限があるため、120mに設定する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;150m以上の飛行は包括申請の対象外で個別申請が必要となるため、一般的な飛行では150m未満に収める必要がある。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;また、以下のアクセサリの装着を推奨します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NDフィルター&lt;&#x2F;strong&gt;：露出調整だけでなく、レンズ保護としても有効&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ジンバルバンパー&lt;&#x2F;strong&gt;：墜落時のジンバルとカメラへのダメージを軽減する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;モーターカバー&lt;&#x2F;strong&gt;: 砂浜などでの撮影時モーターへの砂やゴミの侵入を防止する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロペラガード&lt;&#x2F;strong&gt;：屋内や近接飛行時の衝突ダメージを軽減する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00togv5.9srin901.g00togv5.9sriof57&#x2F;kaereba_main_202604281233494878?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fvanvenus%2Fvan-0d44tp29d%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fvanvenus%2Fi%2F10016617%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;vanvenus&#x2F;cabinet&#x2F;root_sniper_folder&#x2F;sniper_folder_00031&#x2F;imgrc0097362674.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00togv5.9srin901.g00togv5.9sriof57&#x2F;kaereba_main_202604281233494878?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fvanvenus%2Fvan-0d44tp29d%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fvanvenus%2Fi%2F10016617%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;Avata 2 バンパー DJI Avata 2 適用 ジンバルプロテクター Avata 2 ジンバル バンパー フロント レンズ保護バーアルミ合金製 衝突防止 安全飛行 DJI Avata 2 アクセサリー用 (レッド)&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202604281233494878?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FAvata%2520%25E8%25A1%259D%25E7%25AA%2581%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=Avata%20%E8%A1%9D%E7%AA%81&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00togv5.9srin901.g00togv5.9sriof57&#x2F;kaereba_main_202604281233025454?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fvanvenus%2Fvan-0d2dlx3jw%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fvanvenus%2Fi%2F10016624%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;vanvenus&#x2F;cabinet&#x2F;root_sniper_folder&#x2F;sniper_folder_00031&#x2F;imgrc0097362772.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00togv5.9srin901.g00togv5.9sriof57&#x2F;kaereba_main_202604281233025454?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fvanvenus%2Fvan-0d2dlx3jw%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fvanvenus%2Fi%2F10016624%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;LINGHUANG Avata 2 モーターカバーDJI Avata 2 モーター保護カバー ホコリや水分の侵入防止 アルミ合金製 dji avata2 アクセサリー対応 (4個入 赤)&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202604281233025454?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FAvata%2520%2520LINGHUANG%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=Avata%20%20LINGHUANG&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00uvo95.9srinb32.g00uvo95.9srio911&#x2F;kaereba_main_202604281234561111?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frikutonashop%2Frikutcqgg0%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Frikutonashop%2Fi%2F10008702%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;rikutonashop&#x2F;cabinet&#x2F;202604161849_17&#x2F;rikutcqgg0_1.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00uvo95.9srinb32.g00uvo95.9srio911&#x2F;kaereba_main_202604281234561111?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frikutonashop%2Frikutcqgg0%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Frikutonashop%2Fi%2F10008702%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;DJIAvata360バンパープロペラガードプラスチック機体保護保護カバー保護ガードプロペラ保護防振耐衝撃安全飛行保護装置軽量耐久性衝突防止リング取り付けが簡単&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202604281234561111?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2Favata%2520%25E3%2583%2597%25E3%2583%25AD%25E3%2583%259A%25E3%2583%25A9%25E3%2582%25AC%25E3%2583%25BC%25E3%2583%2589%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=avata%20%E3%83%97%E3%83%AD%E3%83%9A%E3%83%A9%E3%82%AC%E3%83%BC%E3%83%89&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Post_Productionの全体の流れ&quot;&gt;Post Productionの全体の流れ&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;（2026-05-29更新：Post Productionの手順を見直しました）&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Post Productionでは、次のような流れになります。なお、DaVinci Resolveを前提としています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Timelineの設定と編集&lt;&#x2F;li&gt;
&lt;li&gt;Gyroflowでのぶれ補正&lt;&#x2F;li&gt;
&lt;li&gt;カラーグレーディング&lt;&#x2F;li&gt;
&lt;li&gt;モーションブラーの付加&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;以下、それぞれの工程について説明します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Timelineの設定と編集&quot;&gt;Timelineの設定と編集&lt;&#x2F;h3&gt;
&lt;p&gt;まずDaVinci ResolveのProject SettingにてTimelineの設定を行ないます。
DJI Avata 2はUltra HD(UHD)で動画記録しているので、TimelineもUHDにしておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Frame Rateは撮影時と同じ60FPSに設定します。60FPSで撮影した素材のフレームレートをタイムライン上で24FPSや30FPSに下げても、各フレームが持つ1&#x2F;120秒のブラー量は変わらないため、シネマティックなモーションブラーが自然に増えるわけではありません。シネマティックな質感は、フレームレートを下げるのではなく、後述のRSMBでブラーを付加して作ります。&lt;&#x2F;p&gt;
&lt;p&gt;DJI Air 3Sなど他のカメラの素材と混在させる場合も、撮影時にあらかじめ60FPSへ揃えておくのが原則です。フレームレートの異なる素材を1つのタイムラインに混在させると、リタイミングによるカクつきの原因になります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Gyroflowによる手ぶれ補正&quot;&gt;Gyroflowによる手ぶれ補正&lt;&#x2F;h3&gt;
&lt;p&gt;すべての素材に対して、まずGyroflowで手ぶれ補正を適用します。EISオフ・FOVワイドで撮影した素材にはジャイロデータが記録されており、
Gyroflowに通すことでRockSteadyよりもなめらかな補正が得られます。&lt;&#x2F;p&gt;
&lt;p&gt;Gyroflowのパラメータ設定には、&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;03&#x2F;gyrotriage&#x2F;&quot;&gt;gyrotriage&lt;&#x2F;a&gt;の記事を参照してください。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;カラーグレーディング&quot;&gt;カラーグレーディング&lt;&#x2F;h3&gt;
&lt;p&gt;D-Log Mで撮影した場合は、LUTを適用してカラーグレーディングを行います。推奨は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.thefilmpoets.com&#x2F;edu&#x2F;store&#x2F;dji-avata-2-d-log-m-skygrades-collection&#x2F;&quot;&gt;Film Poets SkyGrades Collection&lt;&#x2F;a&gt;（Natural + Cinemaのセット）です。&lt;&#x2F;p&gt;
&lt;p&gt;SkyGradesが優れている理由は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;DJI機種ごとのD-Log Mカラーサイエンスに合わせて個別設計されており、汎用LUTにありがちな色の破綻が起きにくい&lt;&#x2F;li&gt;
&lt;li&gt;D-Log Mのフラットなガンマカーブを数学的に補正し、ダイナミックレンジを最大限維持したまま自然な色を再現する&lt;&#x2F;li&gt;
&lt;li&gt;過度に彩度を上げない設計で、緑の色被りなどDJI特有の問題を補正する&lt;&#x2F;li&gt;
&lt;li&gt;NaturalとCinemaの2種類をブレンドすることで、自然な色味からシネマティックな色味まで1つのワークフローでカバーできる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;DaVinci Resolveでの適用手順は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Node 1にSkyGrades Natural LUTを適用&lt;&#x2F;li&gt;
&lt;li&gt;シリアルNode 2を追加しSkyGrades Cinema LUTを適用&lt;&#x2F;li&gt;
&lt;li&gt;各ノードのKey Output Gainを調整して、Naturalの補正強度とCinemaのスタイル強度をそれぞれ好みに合わせる（FCPの公式ガイドではMix 0.5を起点に紹介されている）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;モーションブラー（RSMB）&quot;&gt;モーションブラー（RSMB）&lt;&#x2F;h3&gt;
&lt;p&gt;撮影は4K 60FPS・シャッタースピード1&#x2F;120秒（180度ルール）で行っています。この設定は60FPSでは適正な露光ですが、24FPS・1&#x2F;48秒で撮影した映画のような大きめのモーションブラーは持たず、動きがシャープでビデオ的な印象になります。&lt;&#x2F;p&gt;
&lt;p&gt;フレームレートを24FPSや30FPSに下げても、各フレームが持つ1&#x2F;120秒のブラー量は変わらないため、モーションブラーが自然に増えるわけではありません。そこでフレームレートは60FPSのまま維持し、RSMB（ReelSmart Motion Blur）で1&#x2F;48秒相当のブラーを付加して映画的な質感を作ります。RSMBはフレーム間のモーションベクトルを解析してブラーを合成するOFXプラグインです。&lt;&#x2F;p&gt;
&lt;p&gt;RSMBはEditページでも適用できますが、LUTの後段でグレーディング済みの映像に対して処理するため、Colorページで適用します。前述のカラーグレーディングでSkyGrades LUTを適用したNode 2の後ろにシリアルNode 3を追加し、そのノードにRSMBを適用します。&lt;&#x2F;p&gt;
&lt;p&gt;ブラー量はRSMBのBlur Amountで調整します。Blur Amountは1.0がシャッター角360度（フレーム間隔いっぱいのブラー、60FPSでは1&#x2F;60秒相当）、0.5が180度（1&#x2F;120秒相当）に対応します。目標の1&#x2F;48秒は「(1&#x2F;48秒) ÷ (1&#x2F;60秒) = 1.25」となるため、Blur Amountを1.25に設定すると1&#x2F;48秒相当のブラーになります。&lt;&#x2F;p&gt;
&lt;p&gt;ただし素材にはすでに1&#x2F;120秒の実ブラーが含まれているため、まずBlur Amountを1.0〜1.25の範囲で適用し、映像を見ながら好みのブラー量に追い込んでください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;作例&quot;&gt;作例&lt;&#x2F;h2&gt;
&lt;p&gt;冒頭で紹介した映像は、千葉県・根本海水浴場で撮影しました。安全マージンを優先して高度を高めに取っています。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;著者は二等無人航空機操縦士のライセンスを取得し、目視外飛行の限定解除と包括飛行申請をしたうえでマニュアルモードでのFPV飛行を実施している。これらを取得していない場合は、補助者の配置または個別の飛行許可・承認が必要となる。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;本記事には広告（アフィリエイト）リンクが含まれます。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">DJI Avata 2でシネマティックな映像を撮るためのカメラ設定とPost Productionの手順をまとめました。露出、ホワイトバランス、D-Log M、Gyroflow、SkyGrades LUTまで、実際に使っている設定値を共有します。</summary>
        </entry><entry xml:lang="en">
        <title>Cloudflare Agents Week 2026が告げるCloud 2.0時代: エンタープライズの主戦場が移る</title>
        <published>2026-04-27T07:00:13+09:00</published>
        <updated>2026-04-27T07:00:13+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/cloud2-0/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/cloud2-0/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;cloud2-0&amp;#x2F;cover.webp?h=aa99350328ab1f917f77&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Cloudflareは2026年4月13日〜17日に「Agents Week 2026」を開催して、10個以上の新機能を一気に発表しました。新機能の多くが、LLMエージェント(Claude Codeのような「目的を与えられたら、自律的に考え道具を使いタスクを完遂するLLMを使った仕組み」)に関連したものです。&lt;&#x2F;p&gt;
&lt;p&gt;Cloudflareがエージェント向けプラットフォームのロードマップを一気に開示しきった印象的な5日間でした。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Cloud_2.0の時代&quot;&gt;Cloud 2.0の時代&lt;&#x2F;h2&gt;
&lt;p&gt;今回の発表をまとめて眺めると、Cloudの変遷は次のように整理できます。「Cloud x.0」という言い回しが使い古されているのは承知の上で、それでも今回の地殻変動を端的に表すのに「Cloud 2.0」はちょうど良い言葉だと感じています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;本記事における「Cloud 2.0」の定義: LLMエージェントがCloudのワークロードの主役となる新しいレイヤーを指す、本記事独自の用語として用います。過去に同じ表記が別の意味で使われてきた経緯がありますが、本記事の主張とは無関係です。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;世代&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;呼称&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;本質的な役割&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;操作主体 (Who)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;主な関心事・技術&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Cloud 0.5&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;仮想化インフラ&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;「場所」の移動&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;インフラ担当者 (手動)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;リフト＆シフト、VM、データセンターの仮想化&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Cloud 1.0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Cloud Native&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;「構造」の最適化&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;開発者 (コード&#x2F;API)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;マネージドサービス、K8s、サーバレス、IaC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Cloud 2.0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Agentic Cloud&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;「意思」の自律化&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;AIエージェント&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;自律的な推論、長期記憶、Tool Use、動的リソース制御&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;3つの世代を「場所→構造→意思」の流れで並べると、世代が進むごとに操作主体が一段上のレイヤーへ移っていくことが見えてきます。Cloud 0.5でインフラ担当者がVMを操作し、Cloud 1.0で開発者がAPIやIaC越しにマネージドサービスを操作してきたところに、Cloud 2.0ではLLMエージェント自身がインフラを叩く側に立ちます。今のエンタープライズが向き合っているのは、「LLMエージェントをいかに効率よく稼働させるか」を中心に据えた新しいITインフラストラクチャーの設計です。&lt;&#x2F;p&gt;
&lt;p&gt;ひとつ前提を強調しておきます。Cloud 2.0はCloud 1.0を置き換えるものではありません。銀行の勘定系、ECのバックエンド、SaaSの基盤といった既存のワークロードは、引き続きCloud 1.0のプリミティブの上で動き続けます。Cloud 2.0はその上に積み上がる新しいレイヤーとして立ち上がり、エージェントが必要に応じて下のCloud 1.0のアプリを呼び出すこともある、という関係です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;LLMエージェントとは&quot;&gt;LLMエージェントとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;LLMエージェントとは、目的を与えられたら自分で考え道具を使いタスクを完遂するLLMを用いた仕組み&lt;&#x2F;strong&gt;です。聞かれたことに答えるだけのチャットボットと違い、ゴールに向かって自分で手を動かしていきます。具体的にはAnthropicのClaude CodeやClaude Coworkのようなサービスです。&lt;&#x2F;p&gt;
&lt;p&gt;より正確に整理すると、エージェントは主に以下の4つの要素で構成されるシステムと定義されることが多いです。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;脳 (Brain &#x2F; Planning)&lt;&#x2F;dt&gt;
&lt;dd&gt;LLM本体です。与えられた大きな目標を、実行可能な小さなステップ(サブタスク)に分解します。過去の失敗から学び、計画を修正する能力もここに含まれます。&lt;&#x2F;dd&gt;
&lt;dt&gt;記憶 (Memory)&lt;&#x2F;dt&gt;
&lt;dd&gt;会話の文脈や現在の作業手順を保持する短期記憶と、外部データベース(RAGなど)を活用して膨大な情報を必要に応じて取り出す長期記憶の二段構えです。&lt;&#x2F;dd&gt;
&lt;dt&gt;道具の使用 (Tool Use &#x2F; Action)&lt;&#x2F;dt&gt;
&lt;dd&gt;エージェントの大きな特徴です。LLMはテキストを生成するだけでなく、Web検索で最新情報を取得し、コード実行で計算やデータ分析を行ない、API連携でメール送信・カレンダー予約・ファイル操作といった外部ツールを呼び出します。&lt;&#x2F;dd&gt;
&lt;dt&gt;認識と判断 (Perception &amp; Reflection)&lt;&#x2F;dt&gt;
&lt;dd&gt;実行した結果が正しかったか、目標に近づいているかを自己評価し、次の行動を決定します。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;この4要素は、計画→実行→評価のループを回しながら、共通の記憶を参照・更新する形で連動します。&lt;&#x2F;p&gt;
&lt;p&gt;ChatGPTをはじめとするLLMが登場したとき、企業はいかにこれを業務システム(アプリケーション)に取り込むかを検討しました。RAGによる社内ナレッジ検索、お問い合わせの自動応答、議事録の要約など、LLMをアプリケーションの中の一機能として組み込む方向です。&lt;&#x2F;p&gt;
&lt;p&gt;しかしその方向での検討は正しい解ではありませんでした。LLMがアプリケーションを含めたさまざまな道具を使い、人間に成り代わって判断しながら業務を行なう。そういう世界が見えてきたのです。LLMを部品として埋め込む構図から、LLMが部品を使う側に立つ構図への反転です。&lt;&#x2F;p&gt;
&lt;p&gt;この転換の背景には、Anthropicが2024年11月に公開したMCP (Model Context Protocol) で得られた「LLMを外と繋げば爆発的に生産性が上がる」という体験があります。Claude Codeはこの延長線上で、もっとカジュアルにLLMに外の道具を使わせればMCPより更に効果的であるということを実証してみせました。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、既存の業務システムは無くなりません。LLMエージェントから利用される対象になります。アプリケーションは引き続きそこに存在しますが、操作する主体が人間からエージェントに移る、という関係です。前節の表で操作主体をAIエージェントに置いたのは、まさにこの転換を指しています。&lt;&#x2F;p&gt;
&lt;p&gt;使われ方の面でも構造が変わります。Cloud 1.0までのアプリケーションは「1つのアプリが多数のユーザを捌く」one-to-manyの前提で設計されてきました。コードは共通で、水平スケールでスループットを上げ、コストはユーザ数に対してサブリニアに伸びる構造です。エージェントはこれを反転させ、1ユーザ(あるいは1タスク)に対して専用の実行環境を割り当てるone-to-oneのモデルになります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;軸&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Cloud 1.0 アプリ&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;LLMエージェント&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;実行モデル&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;one-to-many&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;one-to-one&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;実行環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;ユーザ間で共有&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;ユーザごとに専用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;コスト構造&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;サブリニア&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;ほぼリニア&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;この「1ユーザに専用環境」という前提が、次節で見るインフラ要件の起点になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloud_2.0で必要なインフラ機能&quot;&gt;Cloud 2.0で必要なインフラ機能&lt;&#x2F;h2&gt;
&lt;p&gt;前節で整理したLLMエージェントの4要素と、ユーザ1人に1つの実行環境を割り当てるone-to-oneのモデル。この2つを起点にすると、Cloud 2.0レイヤーが要求するインフラ機能は素直に導けます。&lt;&#x2F;p&gt;
&lt;p&gt;エージェントが実行時に取る活動を一段ずつ分解していくと、それぞれに対応するインフラ機能が見えてきます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;エージェントの活動&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;求められるインフラ機能&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;LLMの推論を回し続ける(脳・認識)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;複数モデルを切り替えられる統合推論レイヤー&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;AIが書いたコードを安全に走らせる(道具)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;ミリ秒で立ち上がる軽量実行環境&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;長尺タスクやコーディング作業を進める(道具)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続的なフル機能Linux環境&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;社内DBや業務APIに到達する(道具)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;エージェント単位のプライベートネットワーク&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Webアプリを操作する(道具)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;マネージドなブラウザ自動化&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;大量のコードを生成・分岐・統合する(道具)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Git互換の版管理ストレージ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;状態と過去のやり取りを保持する(記憶)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;コンテキスト外で保持できる永続記憶レイヤー&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;ここで効いてくるのがone-to-oneのモデルです。1ユーザに1つの専用実行環境を割り当てるため、表に並べた各機能は「同時に大量に立ち上げ、短時間で捨てる」パターンに耐える必要があります。Cloudflareがブログ「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;welcome-to-agents-week&#x2F;&quot;&gt;Welcome to Agents Week&lt;&#x2F;a&gt;」で示した試算が分かりやすい例です。米国だけで1億人を超えるナレッジワーカーがそれぞれ数個のエージェントを15%の同時実行率で動かすと、同時セッション数は約2400万、CPU 1基あたり25〜50ユーザを想定すると米国分だけで50万〜100万CPU相当の容量が必要になる、という見積もりです。one-to-many前提の最適化のままでは、この規模には到底届きません。&lt;&#x2F;p&gt;
&lt;p&gt;つまりCloud 2.0レイヤーで必要なのは、上の表に並べたプリミティブを、one-to-oneでも破綻しないコスト構造で提供できるインフラです。次節では、このレイヤーで誰がどう動いているかを見ていきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloud_2.0で変わる力関係&quot;&gt;Cloud 2.0で変わる力関係&lt;&#x2F;h2&gt;
&lt;p&gt;CloudflareはAgents Week 2026の発表で、前節で挙げたCloud 2.0要件のすべてに対応するサービスを揃えました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;要件(前節の表)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Cloudflareサービス&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Agents Weekでの発表&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;統合推論レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;AI Gateway&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;拡張(14社・70モデル、Workers AIバインディング追加)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;軽量実行環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Dynamic Workers&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;今回発表の目玉。2026年3月24日に有料ユーザーへopen beta開放&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続Linux環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sandboxes&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;GA昇格(active CPU pricing、Outbound Workers等を追加)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;エージェント単位プライベートネットワーク&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Cloudflare Mesh&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;新規発表&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;ブラウザ自動化&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Browser Run&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;旧Browser Renderingを改名。Live View等を追加&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;版管理ストレージ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Artifacts&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;新規ローンチ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続記憶レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Agent Memory&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;プライベートベータ発表&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;7要件すべてが新規発表・GA昇格・拡張のいずれかに該当します。Agents Week 2026は、Cloudflareがこのレイヤーへの準備を一気に完了させたイベントとして位置づけられます。&lt;&#x2F;p&gt;
&lt;p&gt;次に、Cloud 1.0を制覇した3強(AWS、Google Cloud、Microsoft Azure)にCloudflareを加えて、同じ7要件のものさしで判定します。判定の3条件は次のとおりです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;GA: 一般提供されており、誰でも利用できる(プライベートベータや「未公開」は除外)&lt;&#x2F;li&gt;
&lt;li&gt;エージェント特化: 汎用クラウドサービスの流用ではなく、エージェント向けに設計されている&lt;&#x2F;li&gt;
&lt;li&gt;統合プラットフォーム配下: 各社の「エージェントクラウド」ブランドや統合プラットフォームの一部として提供されている&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;3条件すべてを満たせば○、preview&#x2F;beta段階なら△、該当サービスなし・汎用流用・受付終了なら×、と判定します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;要件&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Cloudflare&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Google Cloud&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Microsoft Azure&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;AWS&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;統合推論レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;軽量実行環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続Linux環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;エージェント単位プライベートネットワーク&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;ブラウザ自動化&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;版管理ストレージ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続記憶レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;判定の根拠とした各社のエージェント特化プラットフォーム&#x2F;主要サービスは次のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;要件&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Cloudflare&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Google Cloud&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Microsoft Azure&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;AWS&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;統合推論レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;AI Gateway&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Vertex AI Model Garden&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Azure AI Foundry Models&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Amazon Bedrock&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;軽量実行環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Dynamic Workers&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Cloud Run &#x2F; Vertex AI Agent Engine&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Azure Container Apps&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Bedrock AgentCore Runtime&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続Linux環境&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sandboxes&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Vertex AI Code Interpreter&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Azure Container Apps&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Bedrock AgentCore Code Interpreter&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;エージェント単位プライベートネットワーク&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Cloudflare Mesh&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;VPC + Vertex AI Agent Engine&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Azure Private Link + AI Search&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;(PrivateLink等の汎用流用)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;ブラウザ自動化&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Browser Run&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Vertex AI Browser Tool&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;(エージェント特化サービス未確認)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Bedrock AgentCore Browser&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;版管理ストレージ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Artifacts&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;(該当サービス未確認)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;(該当サービス未確認)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;(該当サービス未確認)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;永続記憶レイヤー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Agent Memory&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Vertex AI Agent Engine Memory Bank&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Azure AI Foundry Memory&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Bedrock AgentCore Memory&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;7要件のものさしで眺めると、Google Cloudはエージェント特化のサービスを最も成熟させています。CloudflareはAgents Week 2026で全領域を埋め、×は出していません。Microsoft Azureはエージェント特化の統合プラットフォームとしてはpreview段階のサービスが多い印象です。AWSはBedrock AgentCoreファミリー(Runtime &#x2F; Memory &#x2F; Code Interpreter &#x2F; Browser &#x2F; Gateway &#x2F; Identity &#x2F; Policy &#x2F; Evaluations &#x2F; Observability)でレイヤー横断のサービスを揃えています。特に2026年4月にAgentCore BrowserがOS-levelアクションを追加したことで、ブラウザ自動化は他社と並ぶ水準に到達しています。一方で、エージェント単位のプライベートネットワークとGit互換の版管理ストレージという2領域では、AgentCoreファミリーに対応するプリミティブが現時点で確認できません。&lt;&#x2F;p&gt;
&lt;p&gt;Cloudflareがone-to-one前提の課金モデル(Dynamic Workersのper-load課金、Sandboxesのactive CPU pricing)とisolateベースのms起動を統合的に提供しているのに対し、AWSはAgentCore側で個別プリミティブを揃える方向で追いついている段階です。Cloud 1.0期に確立した汎用プリミティブ(EC2、Lambda、VPC、IAM)はone-to-many前提で設計されていたため、one-to-oneのワークロードに対しては個別最適の積み上げで対応している、と位置づけられます。&lt;&#x2F;p&gt;
&lt;p&gt;Cloud 1.0時代、CDNとセキュリティのベンダーとして3強の外側に置かれていたCloudflareが、Cloud 2.0レイヤーでは3強と肩を並べる側へ上がってきました。Cloud 1.0はAWSが制覇したレイヤーでしたが、Cloud 2.0ではプレイヤーの力関係がリセットされるステージです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;主戦場は業務リエンジニアリングへ&quot;&gt;主戦場は業務リエンジニアリングへ&lt;&#x2F;h2&gt;
&lt;p&gt;エンタープライズはCloud 1.0の世界を捨てる必要はありません。基幹システムやSaaSバックエンドはAWS中心の運用を続ければよく、その領域でのインフラ・アーキテクチャの設計力はこれからも継続して必要です。&lt;&#x2F;p&gt;
&lt;p&gt;ただしCloud 2.0レイヤーは別の判断軸で組む必要があります。Cloud 1.0期に確立したベンダー選定の前提がそのままでは通じないからです。前節で見たとおり、Cloud 2.0ではGCPが先行、Cloudflareが追いつき、AzureとAWSは個別サービスを揃えつつも統合プラットフォームとしては道半ばです。「Cloud 1.0と同じベンダーで揃える」という発想を出発点にすると、コスト構造とプリミティブの噛み合わせで不利な選択を踏みやすくなります。&lt;&#x2F;p&gt;
&lt;p&gt;そしてCloud 2.0レイヤーで主戦場になるのは、インフラ・アーキテクチャではありません。プラットフォーム側がプリミティブを統合提供している以上、何をどう組み合わせるかが大きな差別化要因にはなりません。&lt;&#x2F;p&gt;
&lt;p&gt;ここで主戦場となるのは、業務プロセスをエージェント向けに再設計し、エージェントのスキルとして実装できる人材です。Cloud 1.0時代に「AWS特化のインフラ設計者」が握っていた価値の中心は、Cloud 2.0では「業務とエージェントの間を設計できる人」に移ります。&lt;&#x2F;p&gt;
&lt;p&gt;エンタープライズが今着手すべきは、エージェントが代替・補強できる業務プロセスの棚卸しと、それをエージェントに落とし込むケイパビリティの社内構築です。Cloud 2.0プラットフォームの選定は、その準備の一部であって目的ではありません。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;welcome-to-agents-week&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;.「Welcome to Agents Week」(米国ナレッジワーカー試算の出典)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;agents-week-in-review&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;.「Building the agentic cloud — Agents Week in Review」(発表総まとめ)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;changelog&#x2F;post&#x2F;2026-03-24-dynamic-workers-open-beta&#x2F;&quot;&gt;Cloudflare Developers&lt;&#x2F;a&gt;.「Dynamic Workers open beta」(2026年3月24日open beta開放)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;sandbox-ga&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;.「Agents have their own computers with Sandboxes GA」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;browser-run-for-ai-agents&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;.「Browser Run for AI Agents」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;introducing-agent-memory&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;.「Introducing Agent Memory」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;press&#x2F;press-releases&#x2F;2026&#x2F;cloudflare-launches-mesh-to-secure-the-ai-agent-lifecycle&#x2F;&quot;&gt;Cloudflare Press&lt;&#x2F;a&gt;.「Cloudflare Launches Mesh」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;model-context-protocol&quot;&gt;Anthropic&lt;&#x2F;a&gt;.「Model Context Protocol」(2024年11月公開)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;bedrock&#x2F;agentcore&#x2F;&quot;&gt;AWS&lt;&#x2F;a&gt;.「Amazon Bedrock AgentCore」(Runtime &#x2F; Memory &#x2F; Code Interpreter &#x2F; Browser &#x2F; Gateway &#x2F; Identity &#x2F; Policy &#x2F; Evaluations &#x2F; Observability)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;about-aws&#x2F;whats-new&#x2F;2026&#x2F;04&#x2F;agentcore-browser-os-actions&#x2F;&quot;&gt;AWS&lt;&#x2F;a&gt;.「AgentCore Browser adds OS-level interactions」(2026年4月8日)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
</content>
        <summary type="html">Cloudflareが2026年4月に開催した「Agents Week 2026」では、Cloud 2.0時代の到来が見えてきました。Cloud 1.0で築いた優位がCloud 2.0レイヤーには引き継がれない構造と、エンタープライズが向き合う変化を考えます。
</summary>
        </entry><entry xml:lang="en">
        <title>久しぶりのスタートダッシュ・デュアル</title>
        <published>2026-04-26T10:16:48+09:00</published>
        <updated>2026-04-26T10:16:48+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/start-dash-dual/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/start-dash-dual/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;start-dash-dual&amp;#x2F;cover.webp?h=d8ba43fd8cf878bda234&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1014&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;めちゃくちゃキルが取れました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;OR3xxemLfL0&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">ご無沙汰していたスタートダッシュ・デュアルを久しぶりに握ったら、思いのほかキルが取れて気分よくプレイできました。</summary>
        </entry><entry xml:lang="en">
        <title>映画『プロジェクト・ヘイル・メアリー』を観た</title>
        <published>2026-04-24T12:12:48+09:00</published>
        <updated>2026-04-24T12:12:48+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/project-hail-mary/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/project-hail-mary/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;project-hail-mary&amp;#x2F;cover.webp?h=ec5f28a0b413ebafd3f7&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;800&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;なかなか&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;04&#x2F;missed-project-hail-mary&#x2F;&quot;&gt;観れなかった『プロジェクト・ヘイルメアリー』&lt;&#x2F;a&gt;をようやくIMAXで観ることができました。
Andy Weirの原作は数年前に楽しく読んで気に入っていた作品なので、Phil Lord &amp;amp; Christopher Millerが監督、Ryan Goslingが主演と聞いた時点から期待していました。&lt;&#x2F;p&gt;
&lt;p&gt;結論から書くと、映画としては普通に面白かったです。Goslingは相変わらず魅力的ですし、Rockyの造形は想像以上に見事で、後半の二人のやり取りには素直に心を動かされました。挿入歌の選曲もセンスのよいものでした。&lt;&#x2F;p&gt;
&lt;p&gt;そのうえで、原作を読んだ人間として正直な感触を書き留めておくと、終始ひとつの違和感がつきまとっていたのも事実でした。作品全体が、原作と比べるとやや「一本調子」に感じられたのです。&lt;&#x2F;p&gt;
&lt;p&gt;この違和感は何に由来するのか、観終わってから少し考えてみました。結論からいうと、これは脚色の良し悪しの話ではなく、原作の物語構造を映像メディアへ移し替える過程で不可避的に生じた代償なのだと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;原作の二層構造&quot;&gt;原作の二層構造&lt;&#x2F;h2&gt;
&lt;p&gt;思い返してみると、原作小説は前半と後半で、読み味がはっきりと違う作品でした。&lt;&#x2F;p&gt;
&lt;p&gt;前半は、記憶喪失から始まる一人称のハードSFサスペンスとして進行します。自分が誰なのか、なぜこの船にいるのかを段階的に思い出していく過程と並行して、Astrophageという科学的謎を理詰めで解いていく構造です。フラッシュバックで描かれる地球パートでは、Eva Strattの強権的なプロジェクト運営、乗組員選抜の倫理的グレーさ、Graceが宇宙へ送られた経緯など、人類存亡の圧力が重くのしかかります。Andyの過去作品と同じ延長線上にある問題解決型のハードSFです。&lt;&#x2F;p&gt;
&lt;p&gt;ところが中盤でRockyが登場した瞬間から、作品の性格が一変します。言語障壁を越えた異星人との友情物語、バディものへと軸足が移り、科学的問題解決は「二人で協力して解く」共同作業の楽しさが前面に出てきます。Rockyの独特な話法、文化的すれ違いのユーモア、相手の生存環境を再現する工夫といった要素が、読み味を一気に軽やかで温かいものに変えていきます。&lt;&#x2F;p&gt;
&lt;p&gt;この前半のハード・サスペンスと後半のハートフルなバディものという二層構造こそが、原作の独特の厚みでした。そして重要なのは、この2つの層を接着していたのが、Graceの一人称による内面独白だったという点です。皮肉っぽいモノローグ、自分へのツッコミ、科学への興奮といった「声」が全編を貫いているから、トーンが大きく変わっても同じ物語として読み通せたのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;映画版が一本調子に感じる理由&quot;&gt;映画版が一本調子に感じる理由&lt;&#x2F;h2&gt;
&lt;p&gt;映画版を観ていて「一本調子」と感じたのは、まさにこの二層構造が平準化されてしまったからだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;いくつかの要因が重なっているように見えます。&lt;&#x2F;p&gt;
&lt;p&gt;1つ目は、一人称の内面独白が映像から消えたことです。原作では、同じ場面でもGraceの頭の中で恐怖、皮肉、科学的興奮、自己嫌悪が目まぐるしく切り替わっていました。この内面の振れ幅そのものが、読者に「起伏」として伝わっていたのです。映像化ではこれが全部落ちるので、画面上の出来事だけで起伏を作らなければなりません。&lt;&#x2F;p&gt;
&lt;p&gt;2つ目は、Lord &amp;amp; Millerという監督コンビの作家性です。彼らの持ち味は『The Lego Movie』や『Spider-Verse』に見られる、テンポの良い軽妙さと暖かいユーモアです。これは後半のRockyパートには完璧に合うのですが、前半の組織の暗部や倫理的グレーな部分を描くには、向いていない資質かもしれません。結果として、本来なら重苦しいはずのEva Strattの強権性や乗組員選抜の非情さまで、どこか軽く処理されてしまっている印象を受けました。&lt;&#x2F;p&gt;
&lt;p&gt;3つ目は、Goslingのキャスティングです。彼はチャームと軽妙さを武器にする俳優で、不安や神経質さを持続させるタイプではありません。Goslingが画面にいる限り、観客はどこかで安心感を抱いてしまい、サバイバルの緊張感が持続しにくくなります。2時間36分の間、同じ「信頼できる主人公」が同じ「明るめの調子」で進んでいけば、一本調子に感じられるのは自然な帰結です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;フラッシュバック構造の再編&quot;&gt;フラッシュバック構造の再編&lt;&#x2F;h2&gt;
&lt;p&gt;もう1つ気になったのは、フラッシュバックの使い方です。&lt;&#x2F;p&gt;
&lt;p&gt;原作では、物語はほぼ2つの時間軸が「ブロック単位」で交互に進む作りでした。Graceが記憶喪失から徐々に思い出していく建て付けで、現在の船内パートがしばらく続いた後、ある記憶の引き金を境に地球パートが長めに展開され、またしばらく船内に戻ります。記憶を取り戻す論理的な必然性があり、「思い出す」という行為自体はサスペンスの駆動装置になっていました。読者はGraceと同じタイミングで真実を知っていくのです。&lt;&#x2F;p&gt;
&lt;p&gt;特に重要なのは、地球パートの登場順序が記憶の回復の順序と連動していて、最も重い真実――Graceは志願者ではなく、他の候補者の死後に強制的に送られたという事実――が物語のかなり後半で明かされる構造になっていたことです。この明かされ方こそが、小説後半の倫理的な重みと、Graceという人物像の複雑さを決定づけていました。&lt;&#x2F;p&gt;
&lt;p&gt;映画版では、この構造がかなり再編されています。地球パートが従来の映画的フラッシュバックとして、より頻繁かつ短い単位で挿入される構成に組み替えられており、観客はかなり早い段階から地球側の経緯を把握してしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;この変更は映画的には合理的な判断です。尺の制約の中で現在パートと過去パートをブロック単位で配置すると、観客は一方の時間軸へ入り込んだ頃、もう一方へ連れ戻されることになり、テンポが悪くなります。細かく交互に切るほうが、現代の観客の鑑賞習慣には合っているのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、この変更にも代償があります。&lt;&#x2F;p&gt;
&lt;p&gt;まず、記憶回復のサスペンス性が弱まります。原作では「Graceがなぜ船に乗っているのか」という謎が物語全体を引っ張る推進力でした。現在進行形で事態を理解していくGraceと、読者の知識が同期していたからこそ、謎が推進力として機能したのです。地球パートを早い段階から頻繁に見せてしまうと、観客はGraceより先に状況を把握してしまい、この推進力が失われます。&lt;&#x2F;p&gt;
&lt;p&gt;そして、先ほどの「一本調子」問題とも繋がってきます。地球パートと船内パートが短い単位で切り替わり続けると、それぞれのパートが持っていた独自のトーンが全体に混ざり合い、「軽妙な現在パート」と「重めの過去パート」の対比が曖昧になります。原作ではブロック単位で没入できたからこそ、それぞれのトーンが独立して体験できていたのです。&lt;&#x2F;p&gt;
&lt;p&gt;さらに言えば、Graceの倫理的な陰の部分、つまり「自ら志願したわけではない」という事実のインパクトも、フラッシュバックの細切れ化で拡散してしまった印象を受けます。あの重要な真実は、ある程度の分量のブロックとして提示されたからこそ観客の胸に刺さるもので、断片的に小出しにされると衝撃が薄まってしまいます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;音楽&quot;&gt;音楽&lt;&#x2F;h2&gt;
&lt;p&gt;本作で印象に残ったのは、なんといっても挿入歌の選曲でした。特にThe Beatlesの「Two Of Us」は、GraceとRockyのバディ関係にそのまま重なってきて、観終わったあともしばらく耳から離れませんでした。気に入ってしまったので、自分でも弾いて録ってみたバージョンを置いておきます。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2308330112&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;two-of-us&#x2F;s-bJyHdAGXah2&quot; title=&quot;Two Of Us&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Two Of Us&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;作中で印象的に使われていた挿入歌を並べておきます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The Beatles「Two Of Us」&lt;&#x2F;li&gt;
&lt;li&gt;Kris Kristofferson「Sunday Mornin&#x27; Comin&#x27; Down」&lt;&#x2F;li&gt;
&lt;li&gt;Miriam Makeba「Pata Pata」&lt;&#x2F;li&gt;
&lt;li&gt;Carlos Di Sarli y su Orquesta Típica「El Amanecer」&lt;&#x2F;li&gt;
&lt;li&gt;Neil Diamond「Stargazer」&lt;&#x2F;li&gt;
&lt;li&gt;Ike &amp;amp; Tina Turner「Glory, Glory」&lt;&#x2F;li&gt;
&lt;li&gt;Harry Styles「Sign of the Times」&lt;&#x2F;li&gt;
&lt;li&gt;Dennis Wilson「Rainbows」&lt;&#x2F;li&gt;
&lt;li&gt;Mercedes Sosa「Gracias a la vida」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;映画版『プロジェクト・ヘイルメアリー』の最大のパラドックスは、原作の二層構造こそが読後の満足感の源泉だったのに、映像化する過程で平準化されて、「均質に良質な感動作」になってしまった点にあります。作品としての完成度は高くても、原作を読んだ人ほど、あの前半の不安げな暗さが削られたことに物足りなさを感じる構造になっています。&lt;&#x2F;p&gt;
&lt;p&gt;個人的には、映画版は好意的に受け取りました。Goslingは相変わらず魅力的ですし、なによりRockyのパペット演技は特筆に値します。フルCGに頼らず、多くの場面でJames Ortizが操演と声の両方を担当した実在の造形物として画面にいるので、視線の動きやちょっとした間合いに手触りがあり、GraceとRockyが距離を詰めていく後半の友情シーンは、原作を読んだときの感触がそのまま立ち上がってきました。この存在感は、主演を食いかねないほどです。&lt;&#x2F;p&gt;
&lt;p&gt;それでも、読み終えた直後のあの「複雑な重さ」を映画で体験できると期待していた自分には、どこか物足りなさが残ったのも事実です。これは映画化の失敗というより、小説という形式が持っていた強度を、映像メディアに完全には移植できなかった、というだけの話なのかもしれません。『The Martian』の映画化が成功したのは、あの作品が最初から比較的一貫した「火星でのサバイバル」という単層構造だったからで、『プロジェクト・ヘイルメアリー』は原作の構造そのものが映像化に抗う性質を持っていた、ということなのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;原作を未読の方には、素直におすすめできる良質なSF映画です。原作を既に読んだ方には、一度読後の記憶を脇に置いて観るのがよいと思います。そして、観終わったあとでもう一度、原作のあの独特の二層構造を味わい直してみてはいかがでしょうか。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;原作はこちら&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-affiliate-1&quot;&gt;&lt;a href=&quot;#fn-affiliate&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241443229736?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919896%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;0702&#x2F;9784152100702_1_19.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241443229736?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919896%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;プロジェクト・ヘイル・メアリー 上&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;アンディ・ウィアー&#x2F;小野田　和子 早川書房 2021年12月16日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241443229736?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919896%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4152100702&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%BB%E3%83%98%E3%82%A4%E3%83%AB%E3%83%BB%E3%83%A1%E3%82%A2%E3%83%AA%E3%83%BC%20%E4%B8%8A&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241445078109?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919894%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;0719&#x2F;9784152100719_1_19.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241445078109?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919894%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;プロジェクト・ヘイル・メアリー 下&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;アンディ・ウィアー&#x2F;小野田　和子 早川書房 2021年12月16日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604241445078109?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16919894%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4152100710&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%BB%E3%83%98%E3%82%A4%E3%83%AB%E3%83%BB%E3%83%A1%E3%82%A2%E3%83%AA%E3%83%BC%20%E4%B8%8B&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-affiliate&quot;&gt;
&lt;p&gt;当記事は、アフィリエイトリンクを含みます。 &lt;a href=&quot;#fr-affiliate-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">映画としてちゃんと面白い。それなのに、原作を読んだ人ほど終始もやもやが残るのはなぜか。『プロジェクト・ヘイル・メアリー』の映像化で起きていたことを、原作の構造側からたどってみます。挿入歌Two Of Usのカバー音源もあわせてどうぞ。
</summary>
        </entry><entry xml:lang="en">
        <title>個人視点で見るAWSのAIサービスの10年</title>
        <published>2026-04-22T10:20:00+09:00</published>
        <updated>2026-04-22T10:20:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/aws-ai-twilight/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/aws-ai-twilight/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;aws-ai-twilight&amp;#x2F;cover.webp?h=f94bf393c7b53cec294a&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;かつてAWSのAIは、IAMキー1本と数行のコードで遊べる個人開発者の場所でした。LLM時代の2026年、そこで何が起きたのかを個人の視点から辿ります。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;AWSのAIサービスが革新的だった頃&quot;&gt;AWSのAIサービスが革新的だった頃&lt;&#x2F;h2&gt;
&lt;p&gt;2018年頃の話です。当時、商用AIの旗手とされていたIBM Watsonは、私が直接触れた範囲では期待を裏切る場面が多く、宣伝の勢いと現場感覚のズレが徐々に目立ち始めていた頃でした。&lt;&#x2F;p&gt;
&lt;p&gt;一方、2015年にGoogleが公開したTensorFlowは急速に普及し、「大量のデータを用意して学習させれば、自分の問題を解けるモデルがそのうち作れる」という楽観論も開発者側で盛り上がっていました。ただ、データ収集、アノテーション、訓練用のGPU確保、学習済みモデルのホスティング。どれも個人で完走するには重く、絵に描いた餅で終わることも多かったのが実情です。&lt;&#x2F;p&gt;
&lt;p&gt;そんな中で登場したAWSのAIサービス群は、本当に革新的でした。データを集める必要も、モデルを訓練する必要も、推論用のサーバーを用意する必要もありません。IAMキーと数行のコードさえあれば、訓練済みモデルをAPIとして叩ける。自前の機械学習パイプラインを丸ごとスキップできる衝撃は、今振り返っても大きかったと思います。&lt;&#x2F;p&gt;
&lt;p&gt;翻訳で言えば、DeepLのPro APIが登場したばかりで、Google翻訳APIは法人契約の印象が強く、個人が気軽に叩けるクラウド翻訳APIはAmazon Translateくらいしかありませんでした。&lt;code&gt;curl&lt;&#x2F;code&gt;で一発叩くだけでなく、ちょっとしたCLIツールを自作することも多く、その一例として、私自身もIBM時代にAmazon Translateをバックエンドに採用した社内向けラッパーツールを書いたことがあります。このツールはWord・Excel・PowerPointのファイルを日英相互翻訳していました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人ユーザーにはLLMで十分な時代&quot;&gt;個人ユーザーにはLLMで十分な時代&lt;&#x2F;h2&gt;
&lt;p&gt;かつてのAWSには、機械学習をブラックボックスのまま呼び出せるAPI群がきれいに揃っていました。翻訳はTranslate、画像解析はRekognition、自然言語処理はComprehend、帳票はTextract、音声合成はPolly。自前で学習データを集める必要はなく、IAMキーと数行のコードさえあれば機能を呼び出せました。この「気軽さ」こそが、当時の個人開発者にとっての魅力でした。&lt;&#x2F;p&gt;
&lt;p&gt;ところが今、同じ機能の大半はLLMに直接投げれば済むようになりました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;サービス&lt;&#x2F;th&gt;&lt;th&gt;機能&lt;&#x2F;th&gt;&lt;th&gt;LLM時代の代替&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Amazon Translate&lt;&#x2F;td&gt;&lt;td&gt;ニューラル機械翻訳API（多言語対応）&lt;&#x2F;td&gt;&lt;td&gt;GPT&#x2F;Claude&#x2F;Geminiに訳文を直接依頼。DeepL Pro APIも成熟&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amazon Rekognition&lt;&#x2F;td&gt;&lt;td&gt;画像・動画解析（物体検出、顔認識、モデレーション、テキスト検出）&lt;&#x2F;td&gt;&lt;td&gt;ビジョン対応LLM（GPT-4o、Claude、Gemini）に画像を渡して記述や抽出を頼む&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amazon Comprehend&lt;&#x2F;td&gt;&lt;td&gt;自然言語処理（エンティティ抽出、感情分析、キーフレーズ抽出、言語判定）&lt;&#x2F;td&gt;&lt;td&gt;同じ処理をLLMへの1プロンプトで任せる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amazon Textract&lt;&#x2F;td&gt;&lt;td&gt;書類のOCRとフォーム・表の構造化抽出&lt;&#x2F;td&gt;&lt;td&gt;ビジョン対応LLMに直接PDF・画像を渡して構造化JSONを返させる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amazon Polly&lt;&#x2F;td&gt;&lt;td&gt;ニューラル音声合成（TTS）&lt;&#x2F;td&gt;&lt;td&gt;OpenAI TTS、ElevenLabs、Gemini Native Speechなど生成AI系音声モデル&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;個人のツールや単発のトランザクションで、わざわざ用途別のAPIを選んで使う意味は、ほとんど残っていません。画像の内容を説明してほしければ、ClaudeやGPTに画像をそのまま渡せば事足ります。領収書から項目を抜き出したいときも、PDFをLLMに渡してJSONで返すよう頼めば済みます。APIの名前を覚え、サービスごとに異なる出力フォーマットを吸収する手間と比べて、LLMに自然言語で頼む方が圧倒的に速いからです。&lt;&#x2F;p&gt;
&lt;p&gt;もっとも、これはあくまで個人開発者のツールや単発利用の話です。エンタープライズの大量処理では、これらのAPIは現在もLLMパイプラインの前処理部品として現役です。例えば、TextractでPDFを構造化してからLLMに渡す、Translateで多言語テキストを統一する、ComprehendでPIIをマスクしてから生成系に流すといった使い方が典型です。&lt;&#x2F;p&gt;
&lt;p&gt;理由は、個人利用では意識する必要のない要件が企業では避けられないからです。LLMは同じ入力でも出力が揺れ、ハルシネーションを起こし、大量処理ではトークン課金が嵩みます。一方、Textractのような専用APIは決定的な出力を返し、料金もページ単価で桁違いに安く、出力形式が固定なので監査ログやSLA契約にも馴染みます。個人の単発処理ではこれらの差が表面化しないため、LLM直叩きの手軽さが勝るのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AWSのLLMはエンタープライズのために&quot;&gt;AWSのLLMはエンタープライズのために&lt;&#x2F;h2&gt;
&lt;p&gt;前節で見たように、かつてのAIサービスは個人視点ではLLMに置き換えられました。ではAWSはこの流れにどう応えたのでしょうか。自前で競争力のあるLLMを持たないAWSが出した答えは、外部のモデル提供者を集めて統一APIで呼び出せるようにしたBedrockでした。&lt;&#x2F;p&gt;
&lt;p&gt;2026年4月時点では、Anthropic (Claude) を筆頭に、Amazon自社のNovaとTitan、Meta (Llama)、Mistral、OpenAI、DeepSeek、Cohere、AI21 Labsなど、十数社・100モデル超が並びます。OpenAIのオープンウェイトモデル（gpt-oss系）までBedrockから呼べるようになったのは2025年の大きな動きでした。モデルの厚みだけを見れば、単一ベンダーの直接APIよりも広い選択肢が用意されているとも言えます&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-converse-1&quot;&gt;&lt;a href=&quot;#fn-converse&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、Bedrockの価値の本体はモデル選択の自由そのものではなく、&lt;strong&gt;AWSの枠組みへ組み込まれていること&lt;&#x2F;strong&gt;にあります。既存のIAMポリシーで権限を統制でき、VPCエンドポイントでインターネットを経由せず呼び出せ、CloudTrailで全ての呼び出しを監査でき、利用料はAWSの単一請求にまとまります。データが既にS3にある組織では、そこからRetrieval Augmented Generationへ繋ぐ道もBedrockの中で完結します。既にAWS上に業務基盤がある企業にとっては、こうした統合こそがBedrockを選ぶ最大の理由です。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、個人開発者がBedrockを介する恩恵はほとんど残っていません。新モデルの到達はAnthropicやOpenAIの直接APIより遅れることが多く、IAMやリージョンの設定、モデルアクセス申請といったセットアップの重さも、APIキー1本で始められる本家との差としてのしかかります。かつてIAMキーと数行のコードから始められたAWS AIサービスの気軽さは、LLM時代には失われたと言って良いでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、AWSがLLM時代に出した答えは、AWSを既に使っている企業への最適化でした。AWSが誰を主な顧客として見ているのか、この選択そのものが物語っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;個人から見たAWSのAIは、この10年で位置づけを大きく変えました。IAMキーと数行のコードで訓練済みモデルを叩ける気軽さは、LLMの登場によって個人視点では蒸発しています。翻訳、画像解析、帳票処理のいずれも、ClaudeやGPTに直接渡す方が速く柔軟で、専用APIを選ぶ理由はほとんど残っていません。&lt;&#x2F;p&gt;
&lt;p&gt;LLM時代の本命であるBedrockも、個人開発者にとっては分が悪い選択肢です。その価値はIAM&#x2F;VPC&#x2F;監査&#x2F;単一請求といった統合レイヤーにあり、新モデル到達は直接APIより遅れ、セットアップも重く、モデル選択肢の広さも個人が手軽に享受できる形にはなっていません。&lt;&#x2F;p&gt;
&lt;p&gt;個人向けの例外として、コード補完のAmazon Q Developerには無料枠があります。しかし実際の現場ではGitHub Copilot、Cursor、Claude Codeが競合し、Q Developerがデフォルトに選ばれる場面はほとんど見かけません。AWSが個人向け枠を用意している事実と、個人がそこを選んでいない事実は両立しています。&lt;&#x2F;p&gt;
&lt;p&gt;AWSのAIは個人から離れたわけではなく、&lt;strong&gt;個人が期待する形では競争に勝てていない&lt;&#x2F;strong&gt;、というのが正直な現状でしょう。Bedrock、SageMaker、Q Businessといった現在のAI製品群は、企業の業務システムと不可分な形で組み立てられています。かつてAWSにあった「IAMキーと数行のコードで叩ける個人の遊び場」としての姿は、もう見つけにくくなっています。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-converse&quot;&gt;
&lt;p&gt;こういった機能説明を読むと「Bedrockではマルチモデルを統一したインターフェイスで扱える」と期待するかも知れません。たしかにBedrockには統一メッセージ形式でモデル差し替えを可能にするConverse APIもあります。ただし、モデルごとに対応したプロンプトチューニングは必要ですし挙動もモデルごとに異なるため、Converse APIだから簡単に差し替え可能と言うわけではありません。また、当然ながらモデル固有機能は利用できません。 &lt;a href=&quot;#fr-converse-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">かつて「IAMキー1本で訓練済みAPIを叩ける気軽さ」が魅力だったAWSのAI。LLM時代に個人視点で何が残っているかを、BedrockとAmazon Q Developerまで含めて観察します。</summary>
        </entry><entry xml:lang="en">
        <title>幻のドレッシング「ジョセフィーヌ」</title>
        <published>2026-04-21T20:20:36+09:00</published>
        <updated>2026-04-21T20:20:36+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/josephine/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/josephine/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;josephine&amp;#x2F;cover.jpg?h=d50b28817739f30bd22d&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;美味しいと評判のドレッシング「ジョセフィーヌ」を購入できました。&lt;&#x2F;p&gt;
&lt;p&gt;千葉県匝瑳市にある有限会社エム・オー・ディーという会社が製造販売しています。&lt;&#x2F;p&gt;
&lt;p&gt;一般のスーパーでは取扱がありません。ネット通販でも見かけることはありますが、転売っぽく結構なマージンが上乗せされています。購入するには既存会員からの紹介が必要とされており、そのため「幻のドレッシング」と呼ばれています。&lt;&#x2F;p&gt;
&lt;p&gt;製造元から会員価格で取り寄せると1本500円前後とされるのに対し、Amazonなどの大手通販では1,400円前後と3倍近いプレミアムがついています。千葉や茨城の一部スーパー（セイミヤなど）では900円前後で店頭に並ぶこともあるそうで、今回はそうした機会に偶然出会えた形です。&lt;&#x2F;p&gt;
&lt;p&gt;材料は植物性油や醸造酢、玉ねぎ、セロリ、にんじんなど中心に、千葉らしくピーナツなどのナッツ類とスパイスが加えられています。保存料が使用されていません。&lt;&#x2F;p&gt;
&lt;p&gt;ラベルには「ドレッシングのイメージをかえたフランス生まれのオリジナルドレッシング」というキャッチコピーが書かれていますが、味はマイルドでコクがあるマヨネーズのような印象です。パスタソースにもなるようなことが書いてあります。&lt;&#x2F;p&gt;
&lt;p&gt;サラダ以外にも、鶏の唐揚げやフライにかけたり、カルパッチョやマリネのベースに使ったりと応用範囲が広いそうです。保存料を使っていない分、賞味期限は3週間ほどと短いので、いろいろな料理に回して使い切るのが前提なのでしょう。ラベルには10〜15℃が適温と記載されています。&lt;&#x2F;p&gt;
&lt;p&gt;たまたま見かけて購入できましたが、できればリピートしたいものです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">千葉県匝瑳市の有限会社エム・オー・ディーが製造する「ジョセフィーヌ」は、既存会員からの紹介がないと買えない会員制ドレッシングです。偶然手に入った一本を開けて、その味と使い勝手を確かめました。</summary>
        </entry><entry xml:lang="en">
        <title>『プロジェクト・ヘイル・メアリー』が観られない - アニメに占拠された映画館</title>
        <published>2026-04-19T05:17:43+09:00</published>
        <updated>2026-04-19T05:17:43+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/missed-project-hail-mary/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/missed-project-hail-mary/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;missed-project-hail-mary&amp;#x2F;cover.webp?h=563d141ec9c01b65c0fa&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;楽しみにしてた『プロジェクト・ヘイル・メアリー』だが&quot;&gt;楽しみにしてた『プロジェクト・ヘイル・メアリー』だが&lt;&#x2F;h2&gt;
&lt;p&gt;原作小説で読んだ『プロジェクト・ヘイル・メアリー』がハリウッドで映画化され、3月20日から日本でも公開が始まりました。『火星の人』で知られるアンディ・ウィアーによる本格SFで、緻密な科学描写と登場人物同士のやり取りがとにかく魅力的な作品です。読み終えたときから「これはぜひ映画館の、できればIMAXの大画面で観たい」と楽しみにしていた一本でした。&lt;&#x2F;p&gt;
&lt;p&gt;そろそろ公開から1ヶ月になるので見に行こうかと、いつも行くイオンモール幕張新都心の映画館の上映スケジュールをチェックすると、IMAX上映はとっくに打ち切られており、2D上映も1日1枠しか残っていません。評判も悪くなかったので5月くらいまでは普通に観られるだろうと考えていましたが、完全に見通しが甘かったようです。&lt;&#x2F;p&gt;
&lt;p&gt;足を運ぶ気力がすっかり萎えてしまって、「もう配信待ちでいいか」という気分になっています。IMAXで宇宙空間の臨場感を味わうつもりだっただけに、残念でなりません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜこんなに早くハリウッドの超弩級作品の上映がなくなるのか&quot;&gt;なぜこんなに早くハリウッドの超弩級作品の上映がなくなるのか&lt;&#x2F;h2&gt;
&lt;p&gt;原作小説は日本でも累計75万部と、SF作品としては異例の売れ方をしています。映画の方も初日の興行収入が約1億7000万円、動員数は約9万8000人で、2026年洋画No.1のスタートを切りました。公開3日間の動員数は23万3310人、興行収入は4億円超。世界的にも公開2週目で累計興行収入が3億ドルを突破し、Amazon MGMスタジオ統合後の最大ヒット作となっています。&lt;&#x2F;p&gt;
&lt;p&gt;これだけの話題作が、公開1ヶ月で1日1枠、しかもIMAXからは撤退という扱いになるのは、いったいどういうことなのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;参考までに、同じ日のイオンモール幕張新都心の映画館の上映スケジュールを下に並べてみます。&lt;&#x2F;p&gt;
&lt;style&gt;
.schedule-table { border-collapse: collapse; font-size: 0.7rem; width: 100%; table-layout: fixed; margin: 1em 0; }
.schedule-table th, .schedule-table td { border: 1px solid #999; padding: 3px 2px; text-align: center; vertical-align: middle; word-break: break-word; line-height: 1.3; }
.schedule-table thead th { background: #ddd; font-weight: bold; }
.schedule-table .time { background: #eee; font-weight: bold; white-space: nowrap; width: 3em; }
.schedule-table .empty { background: #f5f5f5; color: #ccc; }
&#x2F;* アニメ *&#x2F;
.m-conan,
.m-doraemon,
.m-kimetsu,
.m-thomas,
.m-kaguya,
.m-garupan,
.m-gintama,
.m-poupelle { background: #fff056; }
&#x2F;* 邦画 *&#x2F;
.m-loveletter,
.m-90m,
.m-oni,
.m-kimi,
.m-kamuy,
.m-kyojou,
.m-hodonaku { background: #72fce9; }
&#x2F;* 洋画 *&#x2F;
.m-wicked,
.m-hailmary,
.m-bride { background: #88f94e; }
&#x2F;* その他 *&#x2F;
.m-ini { background: #d5d5d5; }
.m-beaver { background: #ffd931; }
.m-hailmary { font-weight: bold; }
&lt;&#x2F;style&gt;
&lt;table class=&quot;schedule-table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時刻&lt;&#x2F;th&gt;
      &lt;th&gt;S1&lt;&#x2F;th&gt;&lt;th&gt;S2&lt;&#x2F;th&gt;&lt;th&gt;S3&lt;&#x2F;th&gt;&lt;th&gt;S4&lt;&#x2F;th&gt;&lt;th&gt;S5&lt;&#x2F;th&gt;&lt;th&gt;S6&lt;&#x2F;th&gt;&lt;th&gt;S7&lt;&#x2F;th&gt;&lt;th&gt;S8&lt;&#x2F;th&gt;&lt;th&gt;S9&lt;&#x2F;th&gt;&lt;th&gt;S10&lt;&#x2F;th&gt;&lt;th&gt;IMAX&lt;&#x2F;th&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;08:00&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;9&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;2&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;32&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;08:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-loveletter&quot; rowspan=&quot;5&quot;&gt;人はなぜラブレターを書くのか&lt;&#x2F;td&gt;&lt;td class=&quot;m-ini&quot; rowspan=&quot;5&quot;&gt;2025 INI LIVE XQUARE&lt;&#x2F;td&gt;&lt;td class=&quot;m-beaver&quot; rowspan=&quot;5&quot;&gt;私がビーバーになる時&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-doraemon&quot; rowspan=&quot;5&quot;&gt;ドラえもん新・のび太の海底鬼岩白&lt;&#x2F;td&gt;&lt;td class=&quot;m-kimetsu&quot; rowspan=&quot;6&quot;&gt;鬼滅の刃 無限城編 第一章 猗窩座再来&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;09:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;09:30&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;10:00&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;10:30&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;2&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;11:00&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-thomas&quot; rowspan=&quot;4&quot;&gt;きかんしゃトーマス 一緒に歌おう&lt;&#x2F;td&gt;&lt;td class=&quot;m-doraemon&quot; rowspan=&quot;4&quot;&gt;ドラえもん新・のび太の海底鬼岩白&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;3&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;11:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-90m&quot; rowspan=&quot;4&quot;&gt;90メートル&lt;&#x2F;td&gt;&lt;td class=&quot;m-beaver&quot; rowspan=&quot;4&quot;&gt;私がビーバーになる時&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;12:00&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;12:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-loveletter&quot; rowspan=&quot;6&quot;&gt;人はなぜラブレターを書くのか&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;13:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-kaguya&quot; rowspan=&quot;5&quot;&gt;超かぐや姫！&lt;&#x2F;td&gt;&lt;td class=&quot;m-doraemon&quot; rowspan=&quot;4&quot;&gt;ドラえもん新・のび太の海底鬼岩白&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;13:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-garupan&quot; rowspan=&quot;4&quot;&gt;ガールズ＆パンツァー もっとらぶらぶ作戦です！ 第四幕&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-oni&quot; rowspan=&quot;5&quot;&gt;鬼の花嫁&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;14:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-gintama&quot; rowspan=&quot;6&quot;&gt;銀魂 -吉原大炎上-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;14:30&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;15:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-beaver&quot; rowspan=&quot;5&quot;&gt;私がビーバーになる時&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;15:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-wicked&quot; rowspan=&quot;6&quot;&gt;ウィキッド永遠の約束&lt;&#x2F;td&gt;&lt;td class=&quot;m-kaguya&quot; rowspan=&quot;6&quot;&gt;超かぐや姫！&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;16:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-loveletter&quot; rowspan=&quot;5&quot;&gt;人はなぜラブレターを書くのか&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;16:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-kimi&quot; rowspan=&quot;5&quot;&gt;君が最後に遺した歌&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;17:00&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;17:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-hailmary&quot; rowspan=&quot;6&quot;&gt;プロジェクト・ヘイル・メアリー&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-gintama&quot; rowspan=&quot;5&quot;&gt;銀魂 -吉原大炎上-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;18:00&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;18:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-kaguya&quot; rowspan=&quot;6&quot;&gt;超かぐや姫！&lt;&#x2F;td&gt;&lt;td class=&quot;m-kamuy&quot; rowspan=&quot;5&quot;&gt;ゴールデンカムイ 網走監獄襲撃編&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-loveletter&quot; rowspan=&quot;5&quot;&gt;人はなぜラブレターを書くのか&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;19:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-poupelle&quot; rowspan=&quot;4&quot;&gt;えんとつ町のプペル約束の時計台&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;4&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;19:30&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;20:00&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;20:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-kyojou&quot; rowspan=&quot;5&quot;&gt;教場Requiem&lt;&#x2F;td&gt;&lt;td class=&quot;m-kaguya&quot; rowspan=&quot;5&quot;&gt;超かぐや姫！&lt;&#x2F;td&gt;&lt;td class=&quot;m-hodonaku&quot; rowspan=&quot;5&quot;&gt;ほどなく、お別れです&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;21:00&lt;&#x2F;th&gt;&lt;td class=&quot;m-bride&quot; rowspan=&quot;6&quot;&gt;ザ・ブライド！&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-loveletter&quot; rowspan=&quot;6&quot;&gt;人はなぜラブレターを書くのか&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;21:30&lt;&#x2F;th&gt;&lt;td class=&quot;m-garupan&quot; rowspan=&quot;4&quot;&gt;ガールズ＆パンツァー もっとらぶらぶ作戦です！ 第四幕&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;td class=&quot;m-oni&quot; rowspan=&quot;5&quot;&gt;鬼の花嫁&lt;&#x2F;td&gt;&lt;td class=&quot;m-conan&quot; rowspan=&quot;5&quot;&gt;名探偵コナン ハイウェイの堕天使&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;22:00&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;22:30&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;23:00&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;2&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;2&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot; rowspan=&quot;2&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;th class=&quot;time&quot;&gt;23:30&lt;&#x2F;th&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;td class=&quot;empty&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
  &lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;p&gt;確認してちょっと気持ち悪くなりました。原因は「アニメ」でした。&lt;&#x2F;p&gt;
&lt;p&gt;全スクリーンで1日計56回ある上映枠のうち、およそ40％(23枠)を『名探偵コナン ハイウェイの堕天使』1本が占めています。とりわけスクリーン5・7・IMAXの3面は朝から夜までほぼコナン専用で、他作品の入り込む余地がほとんどありません。営業中の10スクリーンの稼働時間で見ても、約3分の1がこの1作で埋まっている計算になります。&lt;&#x2F;p&gt;
&lt;p&gt;人気コンテンツなのはわかりますが、ここまで専有されると憎しみさえ沸いてきます。原作連載時は1〜2年ほど私も読んでいましたが、作者に物語を終結させる気がないのだと見切りをつけて読むのを止めました。今のアニメにも全く興味がないのです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: 上映作品の正式タイトルに含まれる全角「！」と作品名内スペースを原題のまま記述 --&gt;
&lt;p&gt;そして、コナン以外に目を移しても、この表を埋めているのはほとんどアニメ作品です。『鬼滅の刃 無限城編』『ドラえもん』『超かぐや姫！』『ガールズ＆パンツァー』『銀魂』『えんとつ町のプペル』『きかんしゃトーマス』が並び、集計するとアニメだけで稼働時間の6割近くを占めています。一方で洋画は『ウィキッド永遠の約束』『プロジェクト・ヘイル・メアリー』『ザ・ブライド！』のわずか3本、しかもいずれも1日1枠です。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;休日の上映スケジュールだからファミリー向けのアニメが強く出るのは理解できます。とはいえ、1作品で全枠の4割、ジャンル全体で6割近くがアニメという偏り方を目の当たりにすると、わざわざ映画館に足を運ぼうという気持ちも萎えてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;『プロジェクト・ヘイル・メアリー』が公開1ヶ月でIMAX撤退・1日1枠まで縮小されるのは、この1作だけの不運ではなく、日本の映画館における洋画の地盤沈下を象徴しているように思えてなりません。話題作ですらこの扱いなら、後続の洋画はもっと短命に終わるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;「IMAXの大画面で体験したい作品」を楽しみにしていた身としては、こうした配給・編成が続くかぎり、結局「配信待ち」を選ぶ機会ばかり増えていきそうです。映画館でしか得られないはずの体験価値が、観客と運営の双方から少しずつ削られているように感じます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">楽しみにしていた『プロジェクト・ヘイル・メアリー』を観ようと、いつも通う映画館の上映スケジュールを開きました。そこに広がっていたのは、思っていたのとはまったく違う光景でした。公開1ヶ月のハリウッド大作に、いったい何が起きているのでしょうか。
</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Complementary</title>
        <published>2026-04-17T06:03:42+09:00</published>
        <updated>2026-04-17T06:03:42+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/complementary/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/complementary/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;complementary&amp;#x2F;ground-palette.jpg?h=e581cb42e77d73003972&quot;
  alt=&quot;Ground Palette&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;Ground Palette&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;!-- author-approved: 英詩のためtextlintルールを無効化 --&gt;
&lt;!-- textlint-disable --&gt;
&lt;p&gt;Moss and leaves in quiet play,&lt;br&gt;
green and russet hold their sway.&lt;br&gt;
Low I knelt where roots convey&lt;br&gt;
a palette only floors display.&lt;br&gt;
&lt;br&gt;
Backlight filtered through the trees,&lt;br&gt;
tracing edges gentle breeze.&lt;br&gt;
Nothing grand, yet colors seize&lt;br&gt;
a canvas laid for none but these.&lt;br&gt;
&lt;br&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17481&quot;&gt;#complementary&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Photo Friday のお題「Complementary」に合わせて撮影した一枚を紹介します。木漏れ日の下、苔の緑と落ち葉の赤茶が地面に作る補色の対比を、低い視点から切り取りました。
</summary>
        </entry><entry xml:lang="en">
        <title>瀬又の鯉のぼり</title>
        <published>2026-04-15T08:54:32+09:00</published>
        <updated>2026-04-15T08:54:32+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/muratagawa/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/muratagawa/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;muratagawa&amp;#x2F;cover.jpg?h=6b1182c34302aaed581d&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;昨日、千葉県市原市の村田川に鯉のぼりのドローン撮影に行ってきました。&lt;&#x2F;p&gt;
&lt;p&gt;「瀬又の鯉のぼり」と呼ばれており、4月から5月の端午の節句に掛けて村田川沿いに約120尾の鯉登りが掲げられます。&lt;&#x2F;p&gt;
&lt;p&gt;地元の有志の方が約30年前に5尾から始められたようで、今ではこの地域の名物になっています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;8hnrznbhvmQ&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;昨日は季節外れの暑さでしたが、平日にも関わらず川沿いに散歩しながらはためく鯉のぼりの楽しんでいる方がたくさんいらっしゃいました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">千葉県市原市の村田川に掲げられる「瀬又の鯉のぼり」をドローンで撮影してきました。約30年前に5尾から始まり、今では約120尾が川面にはためく地域の名物です。</summary>
        </entry><entry xml:lang="en">
        <title>きのえね 春の大試飲会に行ってきた</title>
        <published>2026-04-12T09:40:40+09:00</published>
        <updated>2026-04-12T09:40:40+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/kinoene/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/kinoene/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;kinoene&amp;#x2F;cover.webp?h=0339a7aa39edcb53dd99&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;675&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;千葉の酒蔵・飯沼本家が主催する「春の大試飲会」に昨日行ってきました。&lt;&#x2F;p&gt;
&lt;p&gt;敷地内の会場では飯沼本家の日本酒約20種類に加え、全国から集まった13蔵のお酒が提供されました。
飯沼本家の日本料理店「きのえねOmoya」の特製おつまみ弁当をいただきながら、おちょこを片手に好きな日本酒を試飲して回るスタイルです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;kinoene&amp;#x2F;kinoene.jpg?h=4a0c549d9a9fe848b94e&quot;
  alt=&quot;春の大試飲会の様子&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;杜氏さんやその場で出会った酒好きの方々と話しながら、普段は入れない「昭和蔵」で美味しいおつまみと日本酒を堪能しました。&lt;&#x2F;p&gt;
&lt;p&gt;新聞の取材も入っており、記者の方から本日の紙面に掲載するとの連絡をいただきました。今朝早速朝刊を見てみると、「酒々井の蔵で酒堪能」という記事で、以下のように語ったと実名で掲載されていました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;春らしい華やかな味の大吟醸などおいしいお酒ばかり。次回もぜひ参加したい&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;よい思い出になりそうです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">千葉の酒蔵・飯沼本家が主催する「春の大試飲会」に参加しました。全国13蔵の日本酒と特製おつまみ弁当を楽しんだ一日の記録です。</summary>
        </entry><entry xml:lang="en">
        <title>Days We Left Behind</title>
        <published>2026-04-10T12:16:59+09:00</published>
        <updated>2026-04-10T12:16:59+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/days-we-left-behind/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/days-we-left-behind/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;days-we-left-behind&amp;#x2F;cover.webp?h=4fcbae7123235548e36d&quot;
  alt=&quot;Cover&quot; width=&quot;1280&quot; height=&quot;716&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;5月29日にPaul McCartneyの5年半ぶりの新アルバム『The Boys of Dungeon Lane』のリリースが予定されています。
どうやらリバプール時代の思い出を詰め込んだアルバムのようです。&lt;&#x2F;p&gt;
&lt;p&gt;3月末に先行リリースされた『Days We Left Behind』が良かったので、サクっとカバーしてみました。正確なコピーではなく適当です。&lt;&#x2F;p&gt;
&lt;p&gt;原曲はキーがBですが、コピーしてみるとそのまま弾くのは無理があります。アコースティックギターに関しては、おそらくチューニングを半音下げてキーをCに見立ててプレイしていると思います。&lt;&#x2F;p&gt;
&lt;p&gt;今回は面倒だったので、アコースティックギターはEpiphone Texanをレギュラーチューニングのままで弾いています。ピアノとオルガンはMacにミニキーボードを繋いで演奏しています。音源はUniversal AudioのRevelとB3 Organを使っています。ヴォーカルとコーラスもSynthesizer Vへの打ち込みも面倒だったので、下手くそながら自分で入れました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%3Atracks%3A2299926539%3Fsecret_token%3Ds-KSMSPM4DmEX&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;days-we-left-behind&#x2F;s-KSMSPM4DmEX&quot; title=&quot;Days We Left Behind&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Days We Left Behind&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;彼も83歳を超えて、ちょっとノスタルジックになっているのかもしれません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Paul McCartneyの5年半ぶりの新アルバムが5月末にリリース予定になっています。楽しみすぎて、3月末に先行リリースされた『Days We Left Behind』をサクッとカバーしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>DALL-E 3 が消える日に備えて移行した</title>
        <published>2026-04-09T00:00:00+00:00</published>
        <updated>2026-04-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/dalle3-to-gpt-image-mini/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/dalle3-to-gpt-image-mini/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;dalle3-to-gpt-image-mini&amp;#x2F;cover.webp?h=2287a707721d15e344d2&quot;
  alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;OpenAIから以下のメールが届きました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;As part of our continuous upgrade process, we are deprecating the following models on May 12, 2026:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Dall-e-2&lt;&#x2F;li&gt;
&lt;li&gt;Dall-e-3&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ahead of the shutdown timeline, we encourage you to explore gpt-image-1.5 or gpt-image-1-mini, our latest flagship models.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;DALL-E 3は、OpenAIが2023年にリリースしたテキストをもとに画像を生成するAIモデルです。プロンプトを与えるだけで高品質な画像を生成でき、API経由でプログラムへ組み込めるため、画像生成の自動化に広く使われてきました。&lt;&#x2F;p&gt;
&lt;p&gt;このブログでは、記事のカバー画像をDALL-E 3 APIで生成しています。Claude Codeのスキル（&lt;code&gt;&#x2F;article-cover&lt;&#x2F;code&gt;）からシェルスクリプトを呼び出し、記事の内容に合った画像を自動生成してカバーに使う仕組みです。2026年5月12日にDALL-E 3が廃止されると、この仕組みが動かなくなります。廃止まで約1ヶ月しかないので、早速対応しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;移行先の選定&quot;&gt;移行先の選定&lt;&#x2F;h2&gt;
&lt;p&gt;メールで案内された後継モデルはgpt-image-1.5（高品質・高コスト）とgpt-image-1-mini（コスト効率重視）の2つです。他のサービスも検討しましたが、まだOpenAIにチャージが残っているので、画像生成については、当面OpenAIを使い続けることとしました。ブログのカバー画像は記事の雰囲気を伝えるためのもので、写真レベルの精度は求めていません。コストと品質のバランスから &lt;strong&gt;gpt-image-1-mini&lt;&#x2F;strong&gt; を選びました。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、DALL-E 3との間にいくつかの仕様差があります。最も大きな変化はサポートされる画像サイズです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;DALL-E 3&lt;&#x2F;th&gt;&lt;th&gt;gpt-image-1-mini&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1792x1024（16:9）&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;1536x1024（3:2）&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1024x1792&lt;&#x2F;td&gt;&lt;td&gt;1024x1536&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1024x1024&lt;&#x2F;td&gt;&lt;td&gt;1024x1024&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;これまで使っていた画角16:9の画像は新モデルでは非対応です。
最も近い横長サイズは1536x1024で、アスペクト比が16:9から3:2に変わります。16:9はモニターや動画で標準的な比率ですが、3:2はフィルムカメラ（35mm）由来の伝統的な比率です。このブログではCSSの &lt;code&gt;object-fit&lt;&#x2F;code&gt; でカバー画像を表示しているため表示上の問題はありませんが、ちょっと間が抜けた感じになります。&lt;&#x2F;p&gt;
&lt;p&gt;品質パラメータも名前が変わりました。DALL-E 3の &lt;code&gt;standard&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;hd&lt;&#x2F;code&gt; に対して、gpt-image-1-miniでは &lt;code&gt;low&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;medium&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;high&lt;&#x2F;code&gt; の3段階です。従来の &lt;code&gt;hd&lt;&#x2F;code&gt; に相当するのは &lt;code&gt;high&lt;&#x2F;code&gt; になります。&lt;&#x2F;p&gt;
&lt;p&gt;課金モデルも異なります。DALL-E 3は「1枚いくら」のシンプルな定額課金でしたが、新モデルはトークンベースの課金に変わっています。画像は内部的にトークンに変換され、入力（プロンプト）と出力（生成画像）のトークン数に応じて課金されます。実際の1枚あたりの費用を比較すると以下のとおりです（横長サイズ）。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Quality&lt;&#x2F;th&gt;&lt;th&gt;DALL-E 3（1792x1024）&lt;&#x2F;th&gt;&lt;th&gt;gpt-image-1-mini（1536x1024）&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Low&lt;&#x2F;td&gt;&lt;td&gt;--&lt;&#x2F;td&gt;&lt;td&gt;$0.006&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Medium&lt;&#x2F;td&gt;&lt;td&gt;$0.120&lt;&#x2F;td&gt;&lt;td&gt;$0.015&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;High&lt;&#x2F;td&gt;&lt;td&gt;$0.120&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;$0.052&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;High品質で比較すると、&lt;strong&gt;1枚あたり $0.120 → $0.052 で約57%のコスト削減&lt;&#x2F;strong&gt;になります。Medium品質なら $0.015で87%削減です。参考までに、上位モデルgpt-image-1.5のHighは1536x1024で約 $0.250と、DALL-E 3の2倍以上です。
ブログのカバー画像用途ではgpt-image-1-miniで十分だと割切りました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;スクリプトの改修&quot;&gt;スクリプトの改修&lt;&#x2F;h2&gt;
&lt;p&gt;このブログでは、カバー画像の生成に以下のシェルスクリプトを使っています。
プロンプトと出力先を引数で受け取り、OpenAIの画像生成APIを呼び出して画像を保存するシンプルなスクリプトです。
DALL-E 3を使っていたものを、gpt-image-1-miniを使うよう修正しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;scripts&#x2F;generate-cover.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -euo pipefail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1536x1024&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;QUALITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;high&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MODEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;gpt-image-1-mini&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ... 引数パース省略 ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;RESPONSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  https:&#x2F;&#x2F;api.openai.com&#x2F;v1&#x2F;images&#x2F;generations&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -H &amp;quot;Content-Type: application&#x2F;json&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -H &amp;quot;Authorization: Bearer &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OPENAI_API_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  -d &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg model &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MODEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg prompt &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$PROMPT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg size &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;    --arg quality &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$QUALITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;#39;{model: $model, prompt: $prompt, n: 1,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;      size: $size, quality: $quality}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# gpt-image-1-mini returns b64_json; fall back to URL for other models&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;B64&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$RESPONSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -r &amp;#39;.data[0].b64_json &#x2F;&#x2F; empty&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$RESPONSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -r &amp;#39;.data[0].url &#x2F;&#x2F; empty&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$B64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$B64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; base64&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;elif&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -s &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; -o &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;移行にあたって変更したのは以下の点です。&lt;&#x2F;p&gt;
&lt;p&gt;まず、モデル名・サイズ・品質の3パラメータを変更しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;diff&quot; data-name=&quot;scripts&#x2F;generate-cover.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-deleted z-diff&quot;&gt;SIZE=&amp;quot;1792x1024&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-deleted z-diff&quot;&gt;QUALITY=&amp;quot;hd&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-deleted z-diff&quot;&gt;MODEL=&amp;quot;dall-e-3&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-inserted z-diff&quot;&gt;SIZE=&amp;quot;1536x1024&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-inserted z-diff&quot;&gt;QUALITY=&amp;quot;high&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-inserted z-diff&quot;&gt;MODEL=&amp;quot;gpt-image-1-mini&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;APIエンドポイント（&lt;code&gt;&#x2F;v1&#x2F;images&#x2F;generations&lt;&#x2F;code&gt;）とリクエスト形式は同じなので、パラメータの変更だけで済むと思っていましたが、もう1点変更が必要でした。&lt;&#x2F;p&gt;
&lt;p&gt;DALL-E 3はレスポンスで画像のURLを返していましたが、gpt-image-1-miniは&lt;strong&gt;base64エンコードされた画像データ&lt;&#x2F;strong&gt;を直接返します。そのため、レスポンス処理をURLダウンロードからbase64デコードへ変更しました。&lt;code&gt;b64_json&lt;&#x2F;code&gt; と &lt;code&gt;url&lt;&#x2F;code&gt; の両方へ対応したので、将来モデルを切り替えてもこの部分は変更不要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;DALL-E 3の廃止に伴い、ブログのカバー画像生成をgpt-image-1-miniに移行しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;サイズが16:9（1792x1024）から3:2（1536x1024）に変わった&lt;&#x2F;li&gt;
&lt;li&gt;課金モデルが定額からトークンベースに変わった&lt;&#x2F;li&gt;
&lt;li&gt;費用はHigh品質で約57%削減&lt;&#x2F;li&gt;
&lt;li&gt;レスポンス形式がURLからbase64に変わった&lt;&#x2F;li&gt;
&lt;li&gt;スクリプトの変更は最小限&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この記事のカバー画像もgpt-image-1-miniで生成しています。実のところ微妙です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;DALL-E 3と比べると間の抜けた絵になっている。&lt;&#x2F;li&gt;
&lt;li&gt;画角が3:2も間延びして微妙&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;しばらく様子を見て、満足できなければgpt-image-1に差し替えるかも知れません。
また、画角についても、変形かクロップで16:9に変更することも考えるかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;OpenAIのモデル廃止は突然来るものなので、同様にDALL-E 3を使っているプロジェクトがあれば、5月12日までに移行しておくことをおすすめします。&lt;&#x2F;p&gt;
</content>
        <summary type="html">OpenAIからDALL-E 3廃止の通知を受け、ブログのカバー画像生成スクリプトをgpt-image-1-miniに移行しました。サイズや課金モデルの変化、費用比較についてまとめます。
</summary>
        </entry><entry xml:lang="en">
        <title>Claude が Claude を設計する時代に私たちは何を考えるべきか</title>
        <published>2026-04-09T07:23:22+09:00</published>
        <updated>2026-04-09T07:23:22+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/no-coding-anymore/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/no-coding-anymore/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;no-coding-anymore&amp;#x2F;cover.webp?h=dfc871a65d2d9acd0ab6&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;ここ数日Claudeを起動するとほぼ毎日のようにアップデートが走ってるなと思っていましたが、
Anthropic CEOの発言を聞いて納得です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ClaudeはClaude自身が開発している？&quot;&gt;ClaudeはClaude自身が開発している？&lt;&#x2F;h2&gt;
&lt;p&gt;以下はAnthropic CEOのDario Amodeiの発言です。&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-media-max-width=&quot;560&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Anthropic CEO: &lt;br&gt;&lt;br&gt;“ I have engineers within anthropic who don’t write any code, they just let Claude write the code and they edit it and look it over”&lt;br&gt;&lt;br&gt;“At anthropic writing code means designing the next version of Claude it self, so we essentially have Claude designing the next… &lt;a href=&quot;https:&#x2F;&#x2F;t.co&#x2F;kK8D7JlKzB&quot;&gt;https:&#x2F;&#x2F;t.co&#x2F;kK8D7JlKzB&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;t.co&#x2F;ygIvHkKNHf&quot;&gt;pic.twitter.com&#x2F;ygIvHkKNHf&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;&amp;mdash; CG (@cgtwts) &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;cgtwts&#x2F;status&#x2F;2038234212160119034?ref_src=twsrc%5Etfw&quot;&gt;March 29, 2026&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt; &lt;script async src=&quot;https:&#x2F;&#x2F;platform.twitter.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;
&lt;blockquote&gt;
&lt;p&gt;I have engineers within Anthropic who say, &quot;I don&#x27;t write any code. I don&#x27;t write any code anymore.
I just let Claude write the code and I edit it or I look it over.&quot; And of course, at Anthropic,
writing code means designing the next version of Claude itself. So we essentially have Claude
designing the next version of Claude itself, not completely, not in all ways, but in many ways.
That loop starts to close very fast. And so I look at this and I say, &quot;Wow, this is exciting.
It&#x27;s incredible what we can do with the world. But also, it&#x27;s really speeding up a lot. And I&#x27;m just
not sure we have that much time.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Anthropicのエンジニアはすでにコードを書くことをせず編集や確認のみで、Claude自身が次のClaudeを設計し開発しているという発言です。
しかも、&lt;q&gt;That loop starts to close very fast&lt;&#x2F;q&gt;（このループは非常に速く閉じつつある）ということです。
事実、52日間で50以上の新機能が追加されたと報じられています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AI_Safetyへの懸念&quot;&gt;AI Safetyへの懸念&lt;&#x2F;h2&gt;
&lt;p&gt;Darioの発言は「私たちに残された時間がそれほど多くないのではないか」で終わっています。&lt;&#x2F;p&gt;
&lt;p&gt;これは、AIが人類の存在を脅かすというような極端な話ではなく、安全な形でAIを社会に統合するための制度設計・技術的安全策・国際的な合意形成などに使える時間のことを指していると思います。&lt;&#x2F;p&gt;
&lt;p&gt;ClaudeがClaude自身を設計するというフィードバックループが閉じると、AIの能力向上が自己加速的になります。
これまでは人間がAIの安全性やガバナンスの枠組みを整えていましたが、このフィードバックループでAIの開発がどんどん加速していった場合にAIの能力が想定されているガードレールの先に行ってしまうかもしれないということでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicが「Responsible Scaling Policy」を掲げ安全性研究へ力を入れているのも、AIが十分に高度になったとき悪用されたり意図しない動作をしたりするリスクに対して社会やルールがまだ追いついていないという問題意識からでしょう。そして、フィードバックループによりその危機感は高まっているということです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Darioの発言で印象的なのは、AIがAI自身を設計するというループがすでに回り始めているという点です。これは未来の話ではなく、今Anthropicの中で起きていることです。自分自身を振り返っても、昨年Claude Codeを本格的に使い出してからは構想・仕様・アーキテクチャまでが自分の仕事で、設計以降はClaude Codeへ任せるようになりました。開発の現場はすでに変わっています。&lt;&#x2F;p&gt;
&lt;p&gt;問題は、このフィードバックループが閉じるほどAIの進化が加速し、安全策や社会制度を整える時間が縮んでいくことです。技術の恩恵を享受しながらも、そのスピードに見合ったガードレールをどう引くのか。AIを使う側の一人として、この問いを意識し続けることが大事だと感じています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Anthropic CEOが語った「エンジニアはもうコードを書かない」という現実。Claudeが次のClaudeを設計するフィードバックループの加速と、AI Safetyの時間的猶予について考えます。
</summary>
        </entry><entry xml:lang="en">
        <title>LiftOffでFPV飛行練習</title>
        <published>2026-04-08T10:03:40+09:00</published>
        <updated>2026-04-08T10:03:40+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/liftoff/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/liftoff/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;liftoff&amp;#x2F;cover.webp?h=34a254f55657daf3c3c9&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;04&#x2F;dji-avata2&#x2F;&quot;&gt;DJI Avata2を購入&lt;&#x2F;a&gt;したので、FPV飛行のLiftOffを使ってFPV飛行の練習を始めました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;LiftOffとは&quot;&gt;LiftOffとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;410340&#x2F;Liftoff_FPV_Drone_Racing&#x2F;&quot;&gt;Liftoff: FPV Drone Racing&lt;&#x2F;a&gt;は、ベルギーのLuGus Studiosが開発したFPVドローンのフライトシミュレーターです。Steamで配信されており、Windows &#x2F; Mac &#x2F; Linuxに対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;最大の特徴は物理シミュレーションのリアルさで、実機に近い挙動が再現されています。手持ちのプロポ（送信機）をPCに接続してそのまま操作できるため、実機の練習環境としても広く使われています。FPVゴーグルにも対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;機体のカスタマイズが可能で、フレーム・モーター・プロペラ・カメラなどを組み合わせて自分の機体を再現できます。レースやフリースタイルなど複数のゲームモードがあり、ユーザーが作成したトラックやマップも共有されています。Steamのレビューでは95%以上が好評と、FPVシミュレーターの中でも定番の存在です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;LiftOffの感想&quot;&gt;LiftOffの感想&lt;&#x2F;h2&gt;
&lt;p&gt;これまでUncrashedやTRYP FPVなどのシミュレーターを使ってきましたが、LiftOffのほうが格段にリアリティがあるように感じました。ただフィールドを飛び回るのではなく、レースという明確な目標があることも印象が違う原因かもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;機体は『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4e8UjfR&quot;&gt;自作FPVドローン大全&lt;&#x2F;a&gt;』で紹介されていたY&#x27;s drone laboratoryのものを使っています。Rateの設定は次の通りです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Center Sensitivity&lt;&#x2F;th&gt;&lt;th&gt;Max Rate&lt;&#x2F;th&gt;&lt;th&gt;Expo&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;190&lt;&#x2F;td&gt;&lt;td&gt;550&lt;&#x2F;td&gt;&lt;td&gt;0.65&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;180&lt;&#x2F;td&gt;&lt;td&gt;550&lt;&#x2F;td&gt;&lt;td&gt;0.62&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;50&lt;&#x2F;td&gt;&lt;td&gt;400&lt;&#x2F;td&gt;&lt;td&gt;0.60&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;カメラアングルは30°に設定しています。以下が初めてコースを飛ばしてみた動画です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;x7f_VqjYtW0&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;実際に飛ばしてみると、自分の操縦のクセや弱点がよく見えてきました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;高度はピッチとスロットルの調整で維持するが、一定高度を保って飛ぶのが難しい。これまでいかにフワフワ飛んでいたか実感させられた&lt;&#x2F;li&gt;
&lt;li&gt;コーナーやターン時にスロットルを抜きすぎていた。浮遊感は出るが安定しないので、一定の強度でスロットルを掛け続けないと安定して飛べない&lt;&#x2F;li&gt;
&lt;li&gt;コーナーの曲がり具合に応じてロールとヨーの配分を変える必要があるが、かなり慣れが必要&lt;&#x2F;li&gt;
&lt;li&gt;ゲートを通過するには視線を先に置いたコース取りが重要。目の前のゲートだけを見ていると次の動作が遅れる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;DJI Avata2ではレースをやるわけでもなく、機体もここまでシビアではないと思います。しかし、今回LiftOffを飛ばしてみて、スロットル管理や姿勢制御など自分の操縦の甘さがはっきりと見えました。シミュレーターで失敗しても機体が壊れることはないので、苦手な操作を繰り返し練習できるのは大きなメリットです。&lt;&#x2F;p&gt;
&lt;p&gt;UncrashedやTRYP FPVも試してきましたが、物理挙動のリアルさとレースという明確な目標がある点で、LiftOffが練習用シミュレーターとしては一番オススメです。まずはLiftOffでスムーズにコースを回れるようになってから、Avata2での実機飛行に臨みたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">FPVドローンシミュレーター「LiftOff」で飛行練習を始めました。他のシミュレーターとの比較や、実際に飛ばして気づいた操縦のクセと課題をまとめています。
</summary>
        </entry><entry xml:lang="en">
        <title>中小企業支援の中核、千葉県産業振興センターの本年事業計画を評価する</title>
        <published>2026-04-07T00:00:00+00:00</published>
        <updated>2026-04-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/ciac-review/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/ciac-review/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;ciac-review&amp;#x2F;cover.webp?h=8e00135982dd33acf4fa&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;千葉県民として、自分の住む県の外郭団体がどのように運営されているのかは気になるところです。公益財団法人千葉県産業振興センター（以下「センター」）の令和8年度事業計画書が公開されましたので、千葉県による経営状況等評価での指摘事項と照合し、問題点を整理しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;記事の前提と情報源&lt;&#x2F;strong&gt;
        &lt;p&gt;本記事の分析は、すべてセンター及び千葉県が一般に公開している資料に基づいています。参照した資料についてはReferencesセクションを確認ください。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;千葉県が令和6年度・令和7年度の評価で繰り返し指摘している課題（自主財源の確保、民間人材の登用、成果指標の設定等）に対し、令和8年度の事業計画と予算でどのように応えているかを検証します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;千葉県評価資料における主な指摘事項&quot;&gt;千葉県評価資料における主な指摘事項&lt;&#x2F;h2&gt;
&lt;p&gt;千葉県は外郭団体に対して毎年度経営状況等を評価し、結果を公表しています。センターに対する令和6年度評価（R5決算ベース）・令和7年度評価（R6決算ベース）では、いずれも以下の指摘が繰り返されています。&lt;&#x2F;p&gt;
&lt;p&gt;行政文書特有の意味不明な婉曲表現をわかりやすくすると、次の点に課題点は集約されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;経営層に民間人材を起用し、外部視点やコンプライアンス向上が必要&lt;&#x2F;li&gt;
&lt;li&gt;千葉県、国からの補助金や委託金に頼らず、自主財源確保に向けた努力が必要&lt;&#x2F;li&gt;
&lt;li&gt;業務量の変化へ対応した効率的かつ弾力的な人員体制にする必要&lt;&#x2F;li&gt;
&lt;li&gt;県職員の派遣の必要性について検討が必要&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;このような評価にも関わらず、R7評価では県の財政支出の対総収入割合が上昇し県依存度はさらに拡大、運営費補助も増加していることが示されています。&lt;&#x2F;p&gt;
&lt;p&gt;これらの指摘に対し、R8事業計画がどう応えているかを以下で検証します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自主財源確保_--_うたい文句と実態の乖離&quot;&gt;自主財源確保 -- うたい文句と実態の乖離&lt;&#x2F;h2&gt;
&lt;p&gt;県評価で繰り返し指摘されている「自主財源の確保」課題に対し、R8事業計画では「自主事業」を掲げてはいます。しかし、令和8年度の事業計画の詳細を見ると、予算の裏付けがなく実質的な計画を伴っていません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;改善の兆しもない経常収益内訳&quot;&gt;改善の兆しもない経常収益内訳&lt;&#x2F;h3&gt;
&lt;p&gt;令和2年度から令和8年度までの経常収益の財源構成比推移を確認しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;ciac-review&amp;#x2F;incomes.svg?h=f6552cdb84479f07b5cf&quot;
  alt=&quot;千葉県産業振興センター 経常収益の財源構成比推移（R2〜R8）&quot; width=&quot;864&quot; height=&quot;534&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;グラフの最下部にかろうじて見える薄い帯が「自主財源」です。
あれほど毎年指摘されている「自主財源確保」がなんら対応されていないことが結果としてよくわかります。
このグラフから明らかなのは以下の点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;経常収益の94.2%が公的資金（県+国の補助金・委託金）であり、公的資金への全面的な依存構造である&lt;&#x2F;li&gt;
&lt;li&gt;現在の事業活動から自力で稼いでいる収益は合計24,560千円（約2,460万円）にすぎず、経常収益17.9億円のわずか1.4%である&lt;&#x2F;li&gt;
&lt;li&gt;この自主収益も前年度比△2,841千円と微減しており、R2〜R8の全期間を通じて自主財源の拡大は全く進んでいない&lt;&#x2F;li&gt;
&lt;li&gt;県依存率がR7評価時点（R6決算ベース: 87.64%）より低く見えるのは、国庫委託金の増加によるものであり、自主的な収益力の向上ではない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;実体のない「自主財源」&quot;&gt;実体のない「自主財源」&lt;&#x2F;h3&gt;
&lt;p&gt;事業計画では、収益事業として「センター運営基盤強化事業」を位置付け、「国、県等の補助金及び委託料に依存しない自主事業」と明記しています。自主事業として(1)能力開発研修事業、(2)中小・ベンチャー企業のための人材育成講座事業を掲げています。&lt;&#x2F;p&gt;
&lt;p&gt;では、R8予算で「自主財源」とされる収益の中身を見てみましょう。補助金・委託金（県・国）を除き、センターが自力で稼いでいる収益は合計24,560千円（約2,460万円）です。その内訳は以下のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;R8予算(千円)&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;交流事業収益&lt;&#x2F;td&gt;&lt;td&gt;15,000&lt;&#x2F;td&gt;&lt;td&gt;東葛テクノプラザの地域交流フォーラム等&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;受取負担金&lt;&#x2F;td&gt;&lt;td&gt;9,060&lt;&#x2F;td&gt;&lt;td&gt;テクノプラザ利用料等(8,760) + 自主事業(300)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;受取広告料&lt;&#x2F;td&gt;&lt;td&gt;500&lt;&#x2F;td&gt;&lt;td&gt;千葉県産業情報ヘッドライン等の広告枠&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;合計&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;24,560&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;経常収益17.9億円のわずか1.4%&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;この内訳を見ると、自主財源の脆弱さがよく分かります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;交流事業収益（約1,500万円）と受取負担金の大部分（約876万円）は&lt;strong&gt;東葛テクノプラザの指定管理に付随する収益&lt;&#x2F;strong&gt;である。テクノプラザの指定管理を失えば、これらも消滅する。つまり自主財源ですらなく、県からの委託事業に依存した収益である&lt;&#x2F;li&gt;
&lt;li&gt;受取広告料（50万円）はメールマガジンの広告枠であり、拡大余地はほとんどない&lt;&#x2F;li&gt;
&lt;li&gt;「自主事業」と銘打つセンター運営基盤強化事業からの有償収入は、受取負担金のうちわずか&lt;strong&gt;30万円&lt;&#x2F;strong&gt;のみである&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;支出計画から見る「自主事業」の実態&quot;&gt;支出計画から見る「自主事業」の実態&lt;&#x2F;h3&gt;
&lt;p&gt;収入だけでなく、R8予算の支出計画（経常費用合計18.4億円）からも「自主事業」の実態を確認します。&lt;&#x2F;p&gt;
&lt;p&gt;R8事業計画では、「センター運営基盤強化事業」として以下を謳っています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;能力開発研修事業&lt;&#x2F;strong&gt;&lt;br&gt;センター職員の能力向上を図り、組織の専門集団化を目指すため、職員の中小企業支援及び事務スキ
  ルの向上を目的とする研修等を行う。
    &lt;&#x2F;li&gt;
  &lt;li&gt;&lt;strong&gt;中小・ベンチャー企業のための人材育成講座事業&lt;&#x2F;strong&gt;&lt;br&gt;
  地域の中小企業やベンチャー企業等を対象に、経営面や技術面等での能力向上を目的とした人材育成
  講座を開催する。
    &lt;&#x2F;li&gt;&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;実際の予算計画の内訳は、次の表の通りです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;支出項目&lt;&#x2F;th&gt;&lt;th&gt;R8予算(千円)&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;報酬（非常勤専門人材）&lt;&#x2F;td&gt;&lt;td&gt;347,133&lt;&#x2F;td&gt;&lt;td&gt;PM・コーディネーター等（全て公益目的事業に配置）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;謝金&lt;&#x2F;td&gt;&lt;td&gt;144,746&lt;&#x2F;td&gt;&lt;td&gt;セミナー講師等（全て公益目的事業）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;支払委託料&lt;&#x2F;td&gt;&lt;td&gt;288,073&lt;&#x2F;td&gt;&lt;td&gt;外部委託（全て公益目的事業）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;支払助成金&lt;&#x2F;td&gt;&lt;td&gt;85,441&lt;&#x2F;td&gt;&lt;td&gt;各種助成金（全て公益目的事業）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;使用料及び賃借料&lt;&#x2F;td&gt;&lt;td&gt;99,003&lt;&#x2F;td&gt;&lt;td&gt;システム・施設利用料&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;研修開発費・コンテンツ開発費&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;「自主事業」の研修プログラム開発に充てる予算なし&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;能力開発研修事業&lt;&#x2F;strong&gt; は内容を見る限り「事業」とは言っても実体は内部向けの研修でありコストセンターです。
そこに目をつむったとして、予算の内訳を見ても自主事業拡大に繋がるような取り組みとされてるこの事業に振り分けた予算組みを認められません。&lt;&#x2F;p&gt;
&lt;p&gt;その一方で、セカンドキャリアの非常勤専門人材やセミナー講師など、外部リソースの依存度は年度を追って高めてきています。「&lt;strong&gt;能力開発研修事業&lt;&#x2F;strong&gt;」とは
名ばかりと言われても仕方ありません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;ciac-review&amp;#x2F;man-cost.svg?h=009543867526d37cc082&quot;
  alt=&quot;千葉県産業振興センター 非常勤専門人材への支出推移（R2〜R8）&quot; width=&quot;915&quot; height=&quot;565&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;もう一方の&lt;strong&gt;中小・ベンチャー企業のための人材育成講座事業&lt;&#x2F;strong&gt;は外部向けですが、支出面からもその実態は明らかです。有償で提供できる質の講座を開発するには、研修プログラムの企画・カリキュラム設計・教材作成といった開発投資が不可欠ですが、これに充てる予算（研修開発費・コンテンツ開発費等）は一切計上されていません。開発投資なしに収益化は不可能です。&lt;&#x2F;p&gt;
&lt;p&gt;18.4億円の支出予算のほぼ全てが、補助金・委託金で賄われる公益目的事業の人件費・外部委託・助成金と施設管理に充てられています。「自主事業」であるセンター運営基盤強化事業に対する投資は、予算上確認できません。&lt;&#x2F;p&gt;
&lt;p&gt;県から「自主財源の確保・自立に向けた検討」を繰り返し求められながら、収入面では自主財源が経常収益の1.4%にとどまり、支出面では自主事業を育てるための投資もありません。事業計画の文言上だけ「自主事業」を掲げて体裁を整えたものであり、事業計画の文言と予算の実態には大きな乖離があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;組織・人材体制の3つの構造的問題&quot;&gt;組織・人材体制の3つの構造的問題&lt;&#x2F;h2&gt;
&lt;p&gt;センターの人員構造には、県評価で指摘されながら放置されている3つの構造的問題があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;経営層が県からの天下り先となっている&lt;&#x2F;li&gt;
&lt;li&gt;県派遣職員の見直し要請に応えていない&lt;&#x2F;li&gt;
&lt;li&gt;非常勤専門人材への依存拡大とケイパビリティの不在&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;これらがR8事業計画でどのように対応されているか確認していきましょう。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;経営層が県からの天下り先となっている&quot;&gt;経営層が県からの天下り先となっている&lt;&#x2F;h3&gt;
&lt;p&gt;常勤役員6名の構成は、プロパー1名、県退職者5名、民間人材0名です。この構成はR6・R7の両年度の県評価で問題視されており、県は「外部の視点やチェック機能を充たすため民間人材を役員に起用することが望ましい」と明確に求めています。&lt;&#x2F;p&gt;
&lt;p&gt;しかしR8事業計画には、民間人材の役員登用に関する検討や計画が一切記載されていません。さらに問題なのは、この指摘がなされた後の令和7年度に着任した冨沢昇理事長自身が千葉県商工労働部長の退職者であることです。「民間人材の登用」を求めながら県OBを理事長に送り込んでいる県の姿勢も問われます。&lt;&#x2F;p&gt;
&lt;p&gt;経営層が県OBで占められている状態は、組織の自立性を損ない、県の指摘に対して本質的な改革を進めるインセンティブを失わせる原因にもなっています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;県派遣職員の見直し要請に応えていない&quot;&gt;県派遣職員の見直し要請に応えていない&lt;&#x2F;h3&gt;
&lt;p&gt;県が給与を負担する派遣職員4名が継続しています。県は「派遣の必要性について検討」を求めていますが、R8事業計画にはこの検討についての記載がありません。&lt;&#x2F;p&gt;
&lt;p&gt;県は評価資料の中で「業務量と収支の均衡がとれた中長期的な人員体制を見極めつつ、職員派遣や事業委託による県の関与の拡大を検討する」としており、県自身もこの状態が適切とは考えていません。にもかかわらず、センター側からの見直し提案がないのは、県への依存体質を自ら改める意思がないことを示しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;非常勤専門人材への依存拡大とケイパビリティの不在&quot;&gt;非常勤専門人材への依存拡大とケイパビリティの不在&lt;&#x2F;h3&gt;
&lt;p&gt;前節の支出計画の分析で示したとおり、非常勤専門人材への報酬と謝金は増加傾向にあり、R8予算では約4.9億円に達しています（推移はグラフを参照）。R8事業計画では、各事業に多数の非常勤専門人材を配置しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;専門人材&lt;&#x2F;th&gt;&lt;th&gt;人数&lt;&#x2F;th&gt;&lt;th&gt;所属事業&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;プロジェクトマネージャー等&lt;&#x2F;td&gt;&lt;td&gt;13名&lt;&#x2F;td&gt;&lt;td&gt;経営基盤強化支援&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;事業承継プロジェクトマネージャー&lt;&#x2F;td&gt;&lt;td&gt;3名&lt;&#x2F;td&gt;&lt;td&gt;同上&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;研究開発コーディネーター&lt;&#x2F;td&gt;&lt;td&gt;5名&lt;&#x2F;td&gt;&lt;td&gt;新事業・新産業創出支援&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;メディカルコンシェルジュ&lt;&#x2F;td&gt;&lt;td&gt;3名&lt;&#x2F;td&gt;&lt;td&gt;技術振興（医療機器）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;医療機器開発コーディネーター&lt;&#x2F;td&gt;&lt;td&gt;2名&lt;&#x2F;td&gt;&lt;td&gt;同上（がん研・千葉大拠点）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;取引コーディネーター&lt;&#x2F;td&gt;&lt;td&gt;6名&lt;&#x2F;td&gt;&lt;td&gt;取引振興&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;取引かけこみ寺相談員&lt;&#x2F;td&gt;&lt;td&gt;2名&lt;&#x2F;td&gt;&lt;td&gt;同上&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;デジタル支援コーディネーター&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;デジタル技術活用支援&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;販路アドバイザー&lt;&#x2F;td&gt;&lt;td&gt;3名&lt;&#x2F;td&gt;&lt;td&gt;販路開拓総合支援&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;マネージャー等&lt;&#x2F;td&gt;&lt;td&gt;5名&lt;&#x2F;td&gt;&lt;td&gt;プロフェッショナル人材戦略拠点&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;キャリアコンサルタント&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;ジョブカフェちば&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;予算上も非常勤専門人材向け報酬が347,133千円（前年度比+12,135千円）と増加しています。&lt;&#x2F;p&gt;
&lt;p&gt;これらの専門人材は、企業支援の現場で実際に中小企業と向き合い、経営・技術・金融等の専門知識を駆使して支援業務を担う主力です。しかし、すべて補助金で雇用される非常勤ポストであり、そこに構造的な問題があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;これらの人材はセカンドキャリアの経験者であり、個人が長年のキャリアで培ったスキル・人脈・知見をセンターの業務に提供している&lt;&#x2F;li&gt;
&lt;li&gt;しかしセンターは、これらの個人的なケイパビリティを組織として蓄積・継承する仕組みを持っていない。ナレッジマネジメントや技術移転の計画は事業計画に一切記載されていない&lt;&#x2F;li&gt;
&lt;li&gt;プロパー職員（32〜33名）が専門人材から学び、組織としてのケイパビリティを内製化する育成計画もない&lt;&#x2F;li&gt;
&lt;li&gt;結果として、非常勤人材が退任すれば、その知見やネットワークはセンターに残らない。これはセカンドキャリア人材の専門スキルを一時的に借りているだけであり、組織としての持続的なケイパビリティの拡充にはつながっていない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これら3つの問題は互いに連関しています。経営層が県OBで占められているため、組織の自立に向けた改革を主導する力がない。県派遣職員の存在は県への依存体質を固定化する。そして非常勤人材のスキルに頼るだけで組織としてのケイパビリティを蓄積しない構造は、センターが補助金の「通り道」（パススルー機関&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-passthrough-1&quot;&gt;&lt;a href=&quot;#fn-passthrough&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;）にとどまる根本原因であり、自主財源を確保できない問題にも直結しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ビジョン・KGI&#x2F;KPIの完全な不在&quot;&gt;ビジョン・KGI&#x2F;KPIの完全な不在&lt;&#x2F;h2&gt;
&lt;p&gt;R8事業計画には、センターが何を達成しようとしているのかを示すビジョンも、達成度を測る成果指標も一切存在しません。経営目標の達成指標であるKey Goal Indicator（以降、KGI）&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-kgi-1&quot;&gt;&lt;a href=&quot;#fn-kgi&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;も、その達成に向けた業務プロセスの評価指標であるKey Performance Indicator（以降、KPI）&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-kpi-1&quot;&gt;&lt;a href=&quot;#fn-kpi&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;も設定されていません。&lt;&#x2F;p&gt;
&lt;p&gt;事業計画全体を精査した結果、記載されている数値は以下の3種類のみです。&lt;&#x2F;p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;
  &lt;&#x2F;thead&gt;
  &lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;配置人数&lt;&#x2F;td&gt;
      &lt;td&gt;各事業への配置する要員数のみ&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;&lt;td&gt;実施回数&lt;&#x2F;td&gt;&lt;td&gt;セミナーやメール配信の回数のみ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;助成・支援件数&lt;&#x2F;td&gt;
      &lt;td&gt;助成金や支援件数のみ&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;p&gt;以上が事業計画に含まれる数値のすべてです。配置人数は人員配置計画、実施回数は活動スケジュール、助成件数は予算上の交付枠であり、センターとしての達成目標は1つもありません。&lt;&#x2F;p&gt;
&lt;p&gt;これらは本来、千葉県への補助金申請において「この予算で何をやるか」を説明するための内容です。つまりこの「事業計画」は、センター独自の経営計画ではなく、県への補助金申請の内容を転記したものにすぎません。自らの経営計画を策定していない組織が、中小企業に経営支援を行っている構図です。&lt;&#x2F;p&gt;
&lt;p&gt;完全に欠落しているのは以下です。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;ビジョン（KGI）&lt;&#x2F;dt&gt;
&lt;dd&gt;「千葉県の中小企業をどのような状態にしたいのか」「センターとして何を達成するのか」という到達目標が存在しません。基本方針は「支援を行う」「後押しする」「促進を図る」等の活動記述のみで構成されています。&lt;&#x2F;dd&gt;
&lt;dt&gt;成果指標（アウトカムKPI）&lt;&#x2F;dt&gt;
&lt;dd&gt;支援の結果として中小企業に何が起こるかを測定する指標がゼロです。本来必要な指標の例を挙げれば、支援先企業の売上・利益の向上率、新規雇用創出数、事業承継の完了件数、創業支援先企業の生存率、デジタル技術導入による生産性向上の定量効果、商談会における成約率・成約金額、相談窓口利用者の満足度・課題解決率などがありますが、一切設定されていません。&lt;&#x2F;dd&gt;
&lt;dt&gt;中期構想との接続&lt;&#x2F;dt&gt;
&lt;dd&gt;第6次行動指針（令和5年4月〜令和9年3月）を策定しているにもかかわらず、県評価（R6・R7両年度）で「指標の達成状況: 該当なし」と記載されています。中期構想に指標自体が設定されていないため、各年度の事業計画でも成果測定ができない構造になっています。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;17.9億円の公的資金を投じた事業が中小企業に実際にどのような効果をもたらしているのか、誰にも検証できません。「何件助成したか」は分かるが、「助成によって企業がどうなったか」は分からない。これは公的資金の使途に対する説明責任（アカウンタビリティ）の観点から重大な問題です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;事業間連携の掛け声とガバナンスの欠如&quot;&gt;事業間連携の掛け声とガバナンスの欠如&lt;&#x2F;h2&gt;
&lt;p&gt;中期構想の行動指針3「柔軟な連携体制」で「部門の枠組みにとらわれることなく柔軟に連携」を掲げていますが、R8事業計画上の事業構造は従来の縦割りのままです。&lt;&#x2F;p&gt;
&lt;p&gt;取引振興事業で把握したデジタル技術ニーズを中小企業デジタル技術活用支援事業に繋げる仕組みや、ジョブカフェちばで就職した若年者のフォローアップと中小企業の人材定着支援の連動等、事業間をつなぐ仕組みの記載がありません。「部門の枠組みを超える」ための具体的な仕組み（横断プロジェクト、定例の情報共有会議、共通データベース等）も計画に示されていません。&lt;&#x2F;p&gt;
&lt;p&gt;さらに深刻なのは、部門横断の前提となる情報管理体制の欠如です。&lt;&#x2F;p&gt;
&lt;p&gt;センターの支援業務では、中小企業から経営データ、技術情報、取引先情報、事業承継に伴う経営者の個人資産や家族構成といった機密性の高い情報を日常的に取り扱います。民間の経営コンサルティング会社であれば、こうした情報を預かる前提としてNDA（秘密保持契約）を締結するのが当然です。しかし、センターのWebサイト上にはNDAを締結するスキームが確認できません。NDAがなければ、企業は安心して機密情報を開示できず、支援の質そのものが制約されます。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、部門を超えて情報を共有する場合、ある部門で取得した企業機密が他部門に流れるリスクがあります。例えば、事業承継の相談で知り得た経営者の個人情報が取引振興部門に共有されるといった事態を防ぐための情報障壁（チャイニーズウォール&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-chinesewall-1&quot;&gt;&lt;a href=&quot;#fn-chinesewall&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;）の仕組みが必要ですが、事業計画・中期構想のいずれにも記載がありません。&lt;&#x2F;p&gt;
&lt;p&gt;情報管理の仕組みなく「枠組みを超える」ことは、企業の信頼を損なうリスクを伴います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;県評価指摘事項への対応状況まとめ&quot;&gt;県評価指摘事項への対応状況まとめ&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;県からの指摘事項&lt;&#x2F;th&gt;&lt;th&gt;R8事業計画での対応&lt;&#x2F;th&gt;&lt;th&gt;評価&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;自主財源の確保・自立に向けた検討&lt;&#x2F;td&gt;&lt;td&gt;「自主事業」を文言上掲げるが、開発投資も収益計画もなし&lt;&#x2F;td&gt;&lt;td&gt;未対応（名目的）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;民間人材の役員登用&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;業務量と収支の均衡がとれた人員体制の検討&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;県派遣職員の必要性の検討&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;未収貸与料等の早期回収&lt;&#x2F;td&gt;&lt;td&gt;一般的記述のみ&lt;&#x2F;td&gt;&lt;td&gt;部分対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;中長期的な経営計画の達成目標・指標の設定&lt;&#x2F;td&gt;&lt;td&gt;KPI未設定&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;業務の効率化&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;組織体制や業務効率化の継続的検討・見直し&lt;&#x2F;td&gt;&lt;td&gt;記載なし&lt;&#x2F;td&gt;&lt;td&gt;未対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;令和5年度（R6評価）以降、千葉県から繰り返し指摘されている8項目の課題に対し、R8事業計画で実質的に対応しているものは皆無です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;R8事業計画は、県から繰り返し指摘されている課題にほぼ向き合っていません。公的資金依存率94.2%のまま自主財源の確保策は名目だけ、経営層は県OBが占め民間人材の登用もなく、17.9億円を投じながら成果を測るKPIすら存在しません。非常勤専門人材のスキルに依存するだけで組織としてのケイパビリティを蓄積する仕組みもなく、事業間連携を掲げながら情報管理体制も未整備です。&lt;&#x2F;p&gt;
&lt;p&gt;特に問題なのは、令和7年度に理事長が交代し、千葉県商工労働部長を務めた冨沢昇氏が着任して2年目を迎えるにもかかわらず、上記のいずれの課題にも改善が見られないことです。中期構想（第6次行動指針、令和5年4月〜令和9年3月）はわずか4ページで具体的な達成指標もなく、その更新・改定すら行われていません。県の評価で繰り返し求められている改革を主導すべき立場にある理事長が着任しながら、事業計画書上は改善に関する具体的な記載が確認できません。県退職者が引き続き理事長に就任している状況は、県評価で求められた民間人材登用の趣旨とも矛盾しており、公益財団法人の経営トップとしての責任が問われます。&lt;&#x2F;p&gt;
&lt;p&gt;千葉県のR8年度一般会計予算は約2兆2,535億円であり、産業振興センターへの支出（経常収益ベースで約17.9億円）は県予算全体の約0.08%にすぎません。金額の大小の問題ではありません。しかし、中小企業支援法に基づく指定法人が成果も測定せず、組織改革にも着手せず、県の指摘にも応えないまま公的資金を消化し続けています。指定法人を監督する県の監督機能が十分に発揮されていないと言わざるを得ません。県としての関与方針の抜本的な見直しが必要です。&lt;&#x2F;p&gt;
&lt;p&gt;そもそも中小企業支援法は、都道府県に中小企業支援事業の実施計画策定を義務付けています（第3条）。県がその義務を果たすにあたり、指定法人に事業を委ねること自体は法が想定する仕組みですが、指定法人の実態がここまで形骸化しているのであれば、それは県が自らの義務を外郭団体に移転することで見えにくくしている構造にほかなりません。&lt;&#x2F;p&gt;
&lt;p&gt;より根本的な問いもあります。2025年のノーベル経済学賞を受賞したアギヨン・ホーウィット理論は、非効率な企業が退出し新たな担い手に置き換わる「創造的破壊」こそが経済成長の原動力であることを数学的に証明しました。以前の記事「&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2025&#x2F;10&#x2F;dot-com-like-bust&#x2F;&quot;&gt;OpenAI Chairman Says a Dot-Com-Like Bust Wouldn&#x27;t Be All Bad&lt;&#x2F;a&gt;」でも触れたとおり、日本では補助金や支援策で非効率な企業を延命させることが経済の新陳代謝を妨げています。この理論に照らせば、疑問を向けるべきはセンターの運営効率だけではありません。センターのミッションそのもの、すなわち「中小企業を公的資金で支援し存続させる」という前提自体が、創造的破壊を阻害する構造になっていないかという問いです。成果指標もなく、支援先企業がその後どうなったかも測定しない現状では、本来退出すべき非効率な企業を補助金で延命させているのか、成長可能性のある企業を適切に後押ししているのかすら判別できません。17.9億円の公的資金が経済の新陳代謝を促進しているのか、それとも阻害しているのか。「この組織を存続させるべきか」だけでなく、「この支援の在り方自体が正しいのか」という問いを、県は避けて通るべきではありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2516&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和8年度 事業計画書及び収支予算書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和6年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和5年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和4年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和3年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=2298&amp;amp;frmCd=49-2-0-0-0&quot;&gt;令和2年度 事業報告書及び決算報告書&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県産業振興センター「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ccjc-net.or.jp&#x2F;contents_detail.php?co=cat&amp;amp;frmId=3425&amp;amp;frmCd=49-1-1-0-0&quot;&gt;中期構想（第6次行動指針）&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pref.chiba.lg.jp&#x2F;keisei&#x2F;kousha&#x2F;sangyoshinko.html&quot;&gt;公益財団法人千葉県産業振興センター｜経営状況等の評価結果の公表（令和6年度・令和7年度）&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;千葉県 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pref.chiba.lg.jp&#x2F;zaisei&#x2F;press&#x2F;r8nendo&#x2F;r8tousyo-yosanan.html&quot;&gt;令和8年度当初予算案について&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-passthrough&quot;&gt;
&lt;p&gt;パススルー（pass-through）とは、資金を自ら活用せずそのまま通過させること。ここでは補助金を受け取り、外部委託や助成金として支出するだけで、組織自体が付加価値を生まない構造を指す。 &lt;a href=&quot;#fr-passthrough-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-kgi&quot;&gt;
&lt;p&gt;KGI（Key Goal Indicator）は、組織が最終的に達成すべきゴールを定量的に示す指標。売上目標や利益率など、経営レベルの到達目標に用いられる。 &lt;a href=&quot;#fr-kgi-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-kpi&quot;&gt;
&lt;p&gt;KPI（Key Performance Indicator）は、KGI達成に向けた業務プロセスの進捗を測定する中間指標。顧客満足度や案件成約率など、現場レベルの活動指標に用いられる。 &lt;a href=&quot;#fr-kpi-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-chinesewall&quot;&gt;
&lt;p&gt;チャイニーズウォール（Chinese Wall）は、組織内の異なる部門間で利益相反や情報漏洩を防ぐための情報遮断の仕組み。もとは証券業界で、引受部門と営業部門の間のインサイダー取引防止策として確立された用語。 &lt;a href=&quot;#fr-chinesewall-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">千葉県民の税金17.9億円が注ぎ込まれる外郭団体。公的資金依存94.2%、自主収益はたった1.4%、成果を測るKPIすら存在しない。県から繰り返し指摘された8項目の課題に、R8事業計画はどう応えたのか。公開資料をもとに検証します。</summary>
        </entry><entry xml:lang="en">
        <title>GoFデザインパターンは現代でも有用か(4) — 現代でも有用なパターンとまとめ</title>
        <published>2026-04-06T08:06:00+09:00</published>
        <updated>2026-04-06T08:06:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/gof-design-patterns/04-essential-patterns/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/gof-design-patterns/04-essential-patterns/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;gof-design-patterns&amp;#x2F;04-essential-patterns&amp;#x2F;cover.webp?h=625c502b1c7f13dd5ea6&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;前回までの振り返り&quot;&gt;前回までの振り返り&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;01-paradigm-shift&#x2F;&quot;&gt;第1回&lt;&#x2F;a&gt;では、OOPのパラダイムシフトとGoFデザインパターンの誕生、そしてGo言語による脱OOPの流れを振り返りました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;02-unnecessary-patterns&#x2F;&quot;&gt;第2回&lt;&#x2F;a&gt;では、Go言語の3つの設計方針がGoFの23パターンのうち10パターンを不要にしたことを検証しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;03-useful-patterns&#x2F;&quot;&gt;第3回&lt;&#x2F;a&gt;では、残る13パターンのうち、言語機能として取り込まれたIteratorと、現代の設計手法により非推奨となったSingletonを検討しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分類&lt;&#x2F;th&gt;&lt;th&gt;パターン&lt;&#x2F;th&gt;&lt;th&gt;状態&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;OOPの制約への処方箋（第2回）&lt;&#x2F;td&gt;&lt;td&gt;Template Method, Factory Method, Abstract Factory, Bridge, Prototype, Memento, Strategy, Command, Visitor, Observer&lt;&#x2F;td&gt;&lt;td&gt;不要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;言語機能として吸収（第3回）&lt;&#x2F;td&gt;&lt;td&gt;Iterator&lt;&#x2F;td&gt;&lt;td&gt;意識不要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;設計手法の進化で非推奨（第3回）&lt;&#x2F;td&gt;&lt;td&gt;Singleton&lt;&#x2F;td&gt;&lt;td&gt;非推奨&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;本記事では、残る11のパターンがなぜ現代でも有用なのかを分析し、シリーズ全体の結論としてデザインパターンの本質的価値を考察します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現代でも有用なパターン&quot;&gt;現代でも有用なパターン&lt;&#x2F;h2&gt;
&lt;p&gt;残る11のパターンは、継承と参照セマンティクスのいずれにも依存していません。ここまで見てきたパターンがOOPの言語メカニズムへの処方箋だったのに対し、これらはOOPとは無関係に存在する、ソフトウェア設計の普遍的な課題を解決するものです。つまり、GoFの23パターンの中にはOOPの処方箋と、言語に依存しない設計の原則「ソフトウェアアーキテクチャの原則」が混在していたのです。&lt;&#x2F;p&gt;
&lt;p&gt;生き残ったパターンを、その理由ごとに分類します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;小さな部品を合成して大きな振る舞いを作る&quot;&gt;小さな部品を合成して大きな振る舞いを作る&lt;&#x2F;h3&gt;
&lt;p&gt;Go言語の設計思想「継承より合成（composition over inheritance）」と直結する分類です。小さな部品を組み合わせて複雑な構造や振る舞いを構築するという原則は、プログラミングパラダイムを問わず有効です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Composite&lt;&#x2F;strong&gt; — 再帰的なツリー構造を合成し、個々の要素と合成要素を同一視する。ファイルシステムやUIコンポーネントなど、階層構造を持つあらゆる領域で使われる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Decorator&lt;&#x2F;strong&gt; — 既存の機能に新しい責務を動的に重ね合わせる。Go言語では&lt;code&gt;http.Handler&lt;&#x2F;code&gt;をラップするミドルウェアパターンとして標準的に使われている&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Chain of Responsibility&lt;&#x2F;strong&gt; — 処理を連鎖させ、リクエストを適切なハンドラに委譲する。Go言語のHTTPミドルウェアチェーンそのもの&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Builder&lt;&#x2F;strong&gt; — 複雑なオブジェクトを段階的に構築する。Go言語ではfunctional optionsパターンとして定着している&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;コンポーネント間の境界を制御する&quot;&gt;コンポーネント間の境界を制御する&lt;&#x2F;h3&gt;
&lt;p&gt;ソフトウェアの規模が大きくなると、コンポーネント間の依存関係やインターフェースの不一致が複雑さの主要因になります。この問題に対処するパターンは、言語やパラダイムに関係なく必要です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Adapter&lt;&#x2F;strong&gt; — 互換性のないインターフェース同士を橋渡しする。外部ライブラリやレガシーシステムとの統合で常に必要になる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Facade&lt;&#x2F;strong&gt; — 複雑なサブシステムに対して統一的な窓口を提供する。Go言語ではパッケージの公開APIを絞ることで自然に実現される&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Proxy&lt;&#x2F;strong&gt; — 対象へのアクセスを制御する代理を提供する。遅延初期化、アクセス制御、ログ記録など用途が幅広い&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mediator&lt;&#x2F;strong&gt; — 多対多のオブジェクト間の相互作用を仲介者に集約し、疎結合にする。イベントバスやメッセージブローカーの設計に通じる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;状態に応じて振る舞いを切り替える&quot;&gt;状態に応じて振る舞いを切り替える&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;State&lt;&#x2F;strong&gt; — 内部状態に応じてオブジェクトの振る舞いを変更する。Go言語ではStateインターフェースを定義し、状態ごとに異なる型で実装する。有限状態マシンの設計に直結する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;特定領域の問題を解決する&quot;&gt;特定領域の問題を解決する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flyweight&lt;&#x2F;strong&gt; — 多数の細粒度オブジェクトの共有によりメモリ使用量を削減する。文字列のインターン化やキャッシュなど、メモリ最適化が必要な場面で有効&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Interpreter&lt;&#x2F;strong&gt; — 言語の文法を定義し解釈する。DSL（ドメイン固有言語）や設定ファイルのパーサー、式評価エンジンなど、特定の用途で使われる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ_—_デザインパターンの本質的価値とは何だったのか&quot;&gt;まとめ — デザインパターンの本質的価値とは何だったのか&lt;&#x2F;h2&gt;
&lt;p&gt;GoFの功績は、コード内で繰り返し現れるパターンに名前を付け、&lt;strong&gt;開発者の共通言語&lt;&#x2F;strong&gt;を確立したことにあります。「ここはObserverで」「Adapterを挟もう」と言えば設計意図が伝わる。この語彙の確立は、ソフトウェア開発の生産性に大きく貢献しました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、本記事の分析が示すように、GoFの23パターンには性質の異なる2種類のものが混在していました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;実装の工夫&lt;&#x2F;strong&gt; : パラダイムシフトを起こしたばかりのOOPの未成熟さをカバーするもの。継承の副作用を管理するTemplate MethodやVisitor、参照セマンティクスを補完するPrototypeやMemento。これらはOOPという特定のパラダイムの制約の中で必要だった処方箋であり、パラダイムが変われば不要になるもの。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;普遍的な設計原則&lt;&#x2F;strong&gt; - 合成による構築、境界の制御など設計のベストプラクティス。CompositeやDecorator、AdapterやFacadeは、OOPとは無関係に、ソフトウェアの複雑さに対処するためのアーキテクチャの知恵。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;GoFの問題は、この2つがあまり区別されず、同列にカタログ化されたことです。そして当時、OOPが成熟した段階を経験したプログラマが少なかったことも相まって、GoFは必要以上に神格化されました。
本来はコードレベルの実装パターンであるにもかかわらず、当時は業務システムのアーキテクチャを語る場面でGoFのパターン名が持ち出されるような頓珍漢なエンジニアさえ出現しました。デザインパターンは「設計パターン」と訳されますが、実態は「コードパターン」であったことに留意すべきです。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語が示したのは、OOPの制約に起因するパターンは言語設計で解消できるということです。そして残った11のパターンこそが、GoFの本質的な遺産「言語やパラダイムを超えた設計原則」だったと言えます。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、この結論すら永続的なものではありません。Rustの列挙型とパターンマッチングはStateパターンを言語機能として吸収しつつありますし、名前付き引数やデフォルト値を持つ言語ではBuilderの必要性が薄れます。今日「普遍的な設計原則」に見えるものも、将来の言語やパラダイムの進化によって、さらに整理されていく可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;デザインパターンの本質的な価値は、23のカタログそのものにはありませんでした。ソフトウェアの複雑さに名前を付け、共有可能な知識として体系化しようとした試み「その営み」こそが、GoFの真の貢献だったのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;本シリーズで取り上げたGoFの23パターンすべてをGo言語で実装したサンプルコードを公開しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;gof-go-samples&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">連載最終回。GoFの23パターンのうち、OOPに依存しない11のパターンは現代でも有用です。なぜ生き残ったのかを分析し、デザインパターンの本質的価値を考察します。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Knots That Time Forgot</title>
        <published>2026-04-05T16:30:32+09:00</published>
        <updated>2026-04-05T16:30:32+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/tangle/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/tangle/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;figure&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;tangle&amp;#x2F;tangle.jpg?h=be9ef9ed412242f7ccad&quot;
  alt=&quot;Knots That Time Forgot&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;Knots That Time Forgot&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;p&gt;Old trees twist and wind, limbs tangled, intertwined&lt;br&gt;
bare branches weave and climb through pale and patient sky.&lt;br&gt;
A gnarled trunk, scarred and split, still stretches bit by bit,&lt;br&gt;
embracing what stands nearby, refusing to untie.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17458&quot;&gt;#tangle&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">絡み合う老木の枝が静かな空に伸びる風景を撮影しました。</summary>
        </entry><entry xml:lang="en">
        <title>パンを焼いてみた</title>
        <published>2026-04-04T05:58:21+09:00</published>
        <updated>2026-04-04T05:58:21+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/boule/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/boule/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;boule&amp;#x2F;cover.jpg?h=57703e886eed515d5890&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1014&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;ル・クルーゼの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3PNPsqo&quot;&gt;ブレッド・オーブン&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-affiliate-1&quot;&gt;&lt;a href=&quot;#fn-affiliate&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を使って、パンを焼いてみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ブレッド・オーブンとは&quot;&gt;ブレッド・オーブンとは&lt;&#x2F;h2&gt;
&lt;p&gt;ル・クルーゼの製品でスキレットにクロッシュ型（ベル型）のフタが付いたような製品です。&lt;&#x2F;p&gt;
&lt;p&gt;このフタにより「ドームエフェクト」が発生し内部で蒸気が効率良く循環し、
スチームオーブンでなくてもパンが表面はパリッと中はしっとりというプロ級のパンが焼けると言う製品です。&lt;&#x2F;p&gt;
&lt;p&gt;初めて焼いてみましたが、初心者としてはハードパンが上手く焼けたのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;スキレット部分はマットなホーロー加工なのでこびりつきにくいと思いますが、今回は油が足りなかったのか、打ち粉が足りなかったのか底がちょっと焼き付いてしまいました。上手に焼けると、スキレット部分のル・クルーゼのブランドロゴがきれいにパンに入るようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今回のパンのレシピ&quot;&gt;今回のパンのレシピ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はブール(Boule)という古い形のフランスパンです。&lt;&#x2F;p&gt;
&lt;p&gt;フランス語でパン職人を指す「ブーランジェ（Boulanger）」やパン屋を指す「ブーランジェリー（Boulangerie）」は、この「ブール」を作る人、という意味から派生したと言われています。
つまりフランスのパン文化の原点ともいえるパンです。&lt;&#x2F;p&gt;
&lt;p&gt;バゲットとの違いとしては、丸い形のおかげでクラストとクラムの比率が異なり、内側のもっちりした部分が多くなります。バゲットより長持ちするのも丸型のメリットです。バゲットが20世紀初頭の規制変更で生まれた比較的新しい形であるのに対し、ブールは中世から続く伝統的な形です。&lt;&#x2F;p&gt;
&lt;p&gt;材料は次のものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;準強力粉: 400g(今回は全粒粉)&lt;&#x2F;li&gt;
&lt;li&gt;モルトパウダー: 1g&lt;&#x2F;li&gt;
&lt;li&gt;塩: 8g&lt;&#x2F;li&gt;
&lt;li&gt;インスタントドライイースト: 1.6g&lt;&#x2F;li&gt;
&lt;li&gt;水(28℃): 284g&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;作り方は次の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;材料をタッパーで混ぜる
&lt;ul&gt;
&lt;li&gt;ドライイーストを水に混ぜる&lt;&#x2F;li&gt;
&lt;li&gt;モルトパウダーと塩を入れて準強力粉と混ぜる&lt;&#x2F;li&gt;
&lt;li&gt;イーストを溶かした水を準強力粉に注ぐ&lt;&#x2F;li&gt;
&lt;li&gt;タッパーの中で粉が無くなるまで混ぜる&lt;&#x2F;li&gt;
&lt;li&gt;手に追加生地はカードで落とす&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;一次発酵(60分)
&lt;ul&gt;
&lt;li&gt;タッパーで蓋をして室内に置いておく&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;ガス抜き
&lt;ul&gt;
&lt;li&gt;表面に薄い膜が出来ている。&lt;&#x2F;li&gt;
&lt;li&gt;カードを使って生地を一周してまとめていく&lt;&#x2F;li&gt;
&lt;li&gt;最後裏返しておく&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;冷蔵庫で休ませる(12〜18時間)&lt;&#x2F;li&gt;
&lt;li&gt;複温(60分)&lt;&#x2F;li&gt;
&lt;li&gt;丸め・ベンチタイム(20分)
&lt;ul&gt;
&lt;li&gt;タッパーに多めの打ち粉をして、台の上に出していく&lt;&#x2F;li&gt;
&lt;li&gt;生地を3つ折りにして、少し丸める&lt;&#x2F;li&gt;
&lt;li&gt;タッパーを被せて休ませる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;成形
&lt;ul&gt;
&lt;li&gt;生地に粉を振る&lt;&#x2F;li&gt;
&lt;li&gt;生地の四方を集めて、丸く整える。(あまりこねない)&lt;&#x2F;li&gt;
&lt;li&gt;とじ目を持って発酵カゴに入れて、濡れ布巾を被せる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;生地を休ませる(20分)&lt;&#x2F;li&gt;
&lt;li&gt;焼く
&lt;ul&gt;
&lt;li&gt;天板を予め予熱しておく&lt;&#x2F;li&gt;
&lt;li&gt;発酵カゴからルクルーゼに移す&lt;&#x2F;li&gt;
&lt;li&gt;蓋を付けて250℃ で20分&lt;&#x2F;li&gt;
&lt;li&gt;蓋を取り230℃ で15分&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;結構な量が出来ますが、余ったものは冷凍して1週間程度できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜパンを焼くのか&quot;&gt;なぜパンを焼くのか&lt;&#x2F;h2&gt;
&lt;p&gt;もともとハード系の全粒粉のパンが好きなのです。
米国の食事ガイドラインでも次のように定義されています。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;cdn.realfood.gov&#x2F;DGA.pdf&quot;&gt;
  &lt;h3&gt;Focus on Whole Grains&lt;&#x2F;h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Prioritize fiber-rich whole grains.&lt;&#x2F;li&gt;
    &lt;li&gt;Significantly reduce the consumption of highly processed, refined carbohydrates, such as white bread, ready-to-eat or packaged breakfast options, flour tortillas, and crackers.&lt;&#x2F;li&gt;
    &lt;li&gt;Whole grains serving goals: 2–4 servings per day, adjusting as needed based on your individual caloric requirements.&lt;&#x2F;li&gt;
  &lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;https:&#x2F;&#x2F;cdn.realfood.gov&#x2F;DGA.pdf&quot;&gt;Dietary Guidelines for Americans, 2025–2030&lt;&#x2F;a&gt;&lt;&#x2F;cite&gt;, p.3&lt;&#x2F;p&gt;
&lt;p&gt;これは2026年1月7日に改定されたものです。
昨年までは「穀物摂取の少なくとも半分を全粒穀物にする」という表現でしたが、今回は白パン（white bread）が精製炭水化物の具体例として名指しされています。また、全粒粉についてはシンプルに「食物繊維が豊富な全粒穀物を優先せよ」とより強い表現になりました。&lt;&#x2F;p&gt;
&lt;p&gt;1日あたり2〜4サービングという具体的な目標量が示されています。
これは、次のような目安になります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;全粒粉の食パン 2〜4枚&lt;&#x2F;li&gt;
&lt;li&gt;オートミール 1〜2カップ&lt;&#x2F;li&gt;
&lt;li&gt;玄米 1〜2カップ&lt;&#x2F;li&gt;
&lt;li&gt;全粒粉パスタ 1〜2カップ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;全粒粉のパンは見かけると購入していたのですが、
なかなか普通のパン屋さんだと置いておらず、置いているパン屋さんでも時間帯があわないと購入できないこともありました。&lt;&#x2F;p&gt;
&lt;p&gt;ならば、自分で焼こうというのが理由です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;「パンを焼く」というとちょっと難しいイメージがありましたが、Bouleはどんな粉でも作れて発酵も簡単です。
形状もル・クルーゼのブレッド・オーブンと相性がよいのです。&lt;&#x2F;p&gt;
&lt;p&gt;クラスト（皮）は厚めで香ばしく、クラム（内部）はしっとり柔らかで、
シンプルな材料（小麦粉、水、塩、酵母）で作るため小麦本来の風味が楽しめました。&lt;&#x2F;p&gt;
&lt;p&gt;週末には焼いていこうかと思います。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00u59t5.9srind75.g00u59t5.9sriobd9&#x2F;kaereba_main_202604040602139654?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fgoodwoods%2F40651309r83b7t3%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fgoodwoods%2Fi%2F10335330%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;goodwoods&#x2F;cabinet&#x2F;rakutengazou3pic&#x2F;systempic183&#x2F;40651309r83b7t31.jpg?_ex=320x320&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00u59t5.9srind75.g00u59t5.9sriobd9&#x2F;kaereba_main_202604040602139654?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fgoodwoods%2F40651309r83b7t3%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fgoodwoods%2Fi%2F10335330%2F&amp;rafcid=wsc_i_is_c7c582dc-0853-4585-9176-66e2a26d9c5b&quot; target=&quot;_blank&quot; &gt;ルクルーゼ(Le Creuset) ブレッドオーブン 24cm チェリーレッド パン焼き ホームベーカリー 直火 IH 食洗器 対応 日本正規販売品&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202604040602139654?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E3%2583%25AB%25E3%2583%25BB%25E3%2582%25AF%25E3%2583%25AB%25E3%2583%25BC%25E3%2582%25BC%2520%25E3%2583%2596%25E3%2583%25AC%25E3%2583%2583%25E3%2583%2589%25E3%2582%25AA%25E3%2583%25BC%25E3%2583%2596%25E3%2583%25B3%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%83%AB%E3%83%BB%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%BC%20%E3%83%96%E3%83%AC%E3%83%83%E3%83%89%E3%82%AA%E3%83%BC%E3%83%96%E3%83%B3&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-affiliate&quot;&gt;
&lt;p&gt;当記事は、アフィリエイトリンクを含みます。 &lt;a href=&quot;#fr-affiliate-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">ル・クルーゼのブレッド・オーブンで、フランスパンの原点ともいえるブール（Boule）を焼いてみました。全粒粉を使ったレシピと、自分でパンを焼く理由を紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>今更ながら、DJI Avata2導入</title>
        <published>2026-04-03T15:48:20+09:00</published>
        <updated>2026-04-03T15:48:20+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/dji-avata2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/dji-avata2/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;dji-avata2&amp;#x2F;cover.webp?h=fbd9dce89c6052d1e926&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1013&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;ゴーグルをかぶって自分がドローンになったかのように飛ぶFPV飛行。ずっとやってみたかったそれを、DJI Avata2を購入してついに体験してきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜAvata_360ではなくAvata2なのか？&quot;&gt;なぜAvata 360ではなくAvata2なのか？&lt;&#x2F;h2&gt;
&lt;p&gt;DJI Avata2を選んだ理由はシンプルで、&lt;strong&gt;マニュアルモード(Acroモード)で飛ばしたかった&lt;&#x2F;strong&gt;からです。
通常の空撮はDJI Air3Sで散々やってきたので、次はマニュアルモードでダイナミックな飛行をやってみたかったのです。&lt;&#x2F;p&gt;
&lt;p&gt;AvataシリーズにはAvata 360という最新機種が発売されたばかりです。
1&#x2F;1.1インチのデュアルCMOSセンサー、360度モードで8K&#x2F;60fps&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;、全方向障害物検知と、スペックは圧倒的です。
しかし、&lt;strong&gt;Avata 360はマニュアルモードをサポートしていません&lt;&#x2F;strong&gt;。
ファームウェアで将来対応する可能性はありますが、現時点ではやりたい飛行ができないのです。&lt;&#x2F;p&gt;
&lt;p&gt;対してAvata2は2024年発売で、1&#x2F;1.3インチセンサー、4K&#x2F;60fps、障害物回避センサーなしとスペックでは見劣りします。
しかし、マニュアルモードに対応している唯一の現行Avataです。
何より、Avata 360の発売後ということもあり、Avata2のセット売りは大幅に値引きされていました。&lt;&#x2F;p&gt;
&lt;p&gt;360度録画は撮影の失敗がなく編集時に画角を自由に調整できる点は画期的ですが、裏を返せば毎回360度映像から画角を切り出す作業が発生します。
個人的には便利さよりも面倒くささが勝ってしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;周辺機器はすべて互換性があるので、将来マニュアルモードがサポートされればAvata 360の単体購入を検討するかもしれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;屋内でテスト飛行&quot;&gt;屋内でテスト飛行&lt;&#x2F;h2&gt;
&lt;p&gt;DIPS2.0関連の申請手続きは完了しましたが、まだ包括申請の承認がいただけていません。
そこで今回は屋内のフットサルコートをお借りして、テスト初飛行を行なってきました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;2WDjFyIxCIM&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;1時間ほど飛ばした印象をまとめます。&lt;&#x2F;p&gt;
&lt;p&gt;フットサルコートは、DJI Neoで飛ばしたときには十分広い空間だと感じていました。
しかしAvata2のマニュアルモードではスピード感がまるで違います。
少しスロットルを入れるだけで壁が一気に迫ってきて、反射的にスティックを戻してしまう場面が何度もありました。
ゴーグル越しのFPV映像だと距離感が掴みにくく、壁まであとどのくらいあるのか判断できないのが怖さの正体です。
ただ、10分ほど飛ばしているうちに速度調整のコツが掴めてきて、徐々に楽しさが上回るようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;屋内の狭い環境ということもあり、今回はMモードの姿勢制限をオンにして飛ばしました。
姿勢制限をオンにすると機体の傾き角度が制限されるため、シミュレーターで慣れた操作感覚とはかなり異なります。
スティックを倒しても想定ほど機体が傾かず、曲がりたいのに曲がりきれない感覚がありました。
逆に言えば姿勢制限のおかげで暴走せずに済んだとも言えるので、屋内での初飛行にはちょうど良い選択だったと思います。&lt;&#x2F;p&gt;
&lt;p&gt;Goggle 3は、これまで使っていたGoggle N3と比べて映像の解像度が明らかに高く、細部まで鮮明に見えます。
壁や床のテクスチャがはっきり見えるので、距離感の把握にも役立ちました。
装着感も軽くフィット感が良いため、長時間つけていても疲れにくいのは大きな美点です。&lt;&#x2F;p&gt;
&lt;p&gt;シミュレーターでは結構飛ばしましたが、実機は緊張感がまるで違います。
まだまだ練習が必要です。来週に包括申請が承認されると思うので、今度は屋外で練習を重ねたいと思います。
いつか山や谷、木々の上を鳥のように飛翔する映像を撮るのが目標です。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;シングルレンズモードでは4K&#x2F;60fpsが上限です。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;屋内飛行は航空法の適用外のため、包括申請の承認前でも飛行可能です。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">DJI Avata2を購入し、屋内フットサルコートでマニュアルモード初飛行を行いました。最新のAvata 360ではなくAvata2を選んだ理由と、実機で感じたシミュレーターとの違いをお伝えします。</summary>
        </entry><entry xml:lang="en">
        <title>GoFデザインパターンは現代でも有用か(3) — 言語に吸収されたパターンと非推奨のSingleton</title>
        <published>2026-04-02T10:15:00+09:00</published>
        <updated>2026-04-02T10:15:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/gof-design-patterns/03-useful-patterns/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/gof-design-patterns/03-useful-patterns/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;gof-design-patterns&amp;#x2F;03-useful-patterns&amp;#x2F;cover.webp?h=ab1a8a011510459a068c&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;前回までの振り返り&quot;&gt;前回までの振り返り&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;01-paradigm-shift&#x2F;&quot;&gt;第1回&lt;&#x2F;a&gt;では、手続き型プログラミングからOOPへのパラダイムシフト、その中でGoFデザインパターンが「OOPでよいコードを書くためのお手本」として体系化された経緯を振り返りました。そして現代では、OOPの中核 — クラス継承、型階層、参照セマンティクス — を意図的に排除したGo言語が登場し、新たなパラダイムシフトが起きていることを確認しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;02-unnecessary-patterns&#x2F;&quot;&gt;第2回&lt;&#x2F;a&gt;では、Go言語の3つの設計方針がGoFの23パターンのうち10パターンを不要にしたことを検証しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Go言語の設計方針&lt;&#x2F;th&gt;&lt;th&gt;不要になったパターン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;クラス継承を排除し、合成と暗黙的インターフェースで代替&lt;&#x2F;td&gt;&lt;td&gt;Template Method, Factory Method, Abstract Factory, Bridge&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;参照セマンティクスではなく値セマンティクスをデフォルトに&lt;&#x2F;td&gt;&lt;td&gt;Prototype, Memento&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;振る舞いもオブジェクトに包む制約を廃し、第一級関数とチャネル&#x2F;ゴルーチンで直接扱えるように&lt;&#x2F;td&gt;&lt;td&gt;Strategy, Command, Visitor, Observer&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;これらはOOPの制約の中で生まれた処方箋であり、制約そのものを取り除いたGo言語では必要なくなったものでした。では、残る13パターンはどうでしょうか。本記事では、言語機能として取り込まれたものと、設計手法の進化で非推奨となったものを検討します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;言語機能として取り込まれたパターン&quot;&gt;言語機能として取り込まれたパターン&lt;&#x2F;h2&gt;
&lt;p&gt;デザインパターンの中には、その有用性が広く認められた結果、現代の言語では標準的な機能として取り込まれたものがあります。デザインパターンが語られた当時はOOPがまだ成熟しておらず、これらの機能をユーザーで実装していたとも言えます。これらのパターンは「不要になった」のではなく、「わざわざパターンとして意識する必要がなくなった」と言えます。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語も例外でなく、言語仕様としてこれらのパターンを取り込んでいます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;コレクションの内部構造を公開せずに要素を走査する&quot;&gt;コレクションの内部構造を公開せずに要素を走査する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iterator&lt;&#x2F;strong&gt; — イテレータオブジェクトを別途定義し、&lt;code&gt;hasNext()&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;next()&lt;&#x2F;code&gt;のようなインターフェースを実装する必要があった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4bW36Po&quot;&gt;Java言語で学ぶデザインパターン入門&lt;&#x2F;a&gt;第3版』(結城浩著)&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-affiliate-1&quot;&gt;&lt;a href=&quot;#fn-affiliate&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;のIteratorパターンのサンプルコードを見てみます。本棚（BookShelf）に本（Book）を格納し、イテレータで順に取り出すという例です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot; data-name=&quot;Book.java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private String&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public String&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot; data-name=&quot;BookShelf.java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt; java&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;util&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; Iterable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; last&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; maxsize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;books&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt; new Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;maxsize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getBookAt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; index&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;index&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; appendBook&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;last&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        last&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public int&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getLength&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; last&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-storage z-type z-annotation&quot;&gt;    @Override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; BookShelfIterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot; data-name=&quot;BookShelfIterator.java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt; java&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;util&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt; java&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;util&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;NoSuchElementException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; BookShelfIterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; index&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; BookShelfIterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;index&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-storage z-type z-annotation&quot;&gt;    @Override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public boolean&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; hasNext&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;index &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getLength&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-storage z-type z-annotation&quot;&gt;    @Override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; next&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;hasNext&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            throw new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; NoSuchElementException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getBookAt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;index&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        index&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot; data-name=&quot;Main.java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt; java&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;util&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import z-java&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public static void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;appendBook&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Around the World in 80 Days&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;appendBook&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Bible&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;appendBook&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Cinderella&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;appendBook&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Daddy-Long-Legs&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        &#x2F;&#x2F; 明示的にIteratorを使う方法&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        Iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; it&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;iterator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        while&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;it&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;hasNext&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;            Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; it&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;next&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        &#x2F;&#x2F; 拡張for文を使う方法&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-disable --&gt;
&lt;!-- author-approved: MIT License sample code credit --&gt;
&lt;p&gt;上記Javaコードは結城浩氏によるサンプルコード（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hyuki.com&#x2F;dp&#x2F;&quot;&gt;MIT License&lt;&#x2F;a&gt;、Copyright (c) 2001,2004,2021 結城浩 &#x2F; Hiroshi Yuki）です。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;4つのファイル、約80行のコードが必要です。&lt;code&gt;BookShelfIterator&lt;&#x2F;code&gt;クラスが走査の状態（現在のインデックス）を管理し、&lt;code&gt;hasNext()&lt;&#x2F;code&gt;と&lt;code&gt;next()&lt;&#x2F;code&gt;のインターフェースを実装しています。&lt;code&gt;BookShelf&lt;&#x2F;code&gt;は&lt;code&gt;Iterable&amp;lt;Book&amp;gt;&lt;&#x2F;code&gt;を実装し、&lt;code&gt;iterator()&lt;&#x2F;code&gt;メソッドでイテレータを生成します。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語で同じBookShelfを書くとどうなるでしょうか。Go 1.23で導入されたrange-over-function（&lt;code&gt;iter.Seq&lt;&#x2F;code&gt;）を使うと、Javaと同等のカスタムコレクションを以下のように実装できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot; data-name=&quot;main.go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;package&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;fmt&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;iter&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; string&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;s &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;book&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;books&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;s &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; All&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Seq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;] {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;yield&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;books&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;yield&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;                return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; := &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;BookShelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Around the World in 80 Days&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Bible&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Cinderella&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Daddy-Long-Legs&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; book&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; shelf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;All&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        fmt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;book&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Javaでは&lt;code&gt;Iterable&lt;&#x2F;code&gt;インターフェース、&lt;code&gt;Iterator&lt;&#x2F;code&gt;実装クラス、&lt;code&gt;hasNext()&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;next()&lt;&#x2F;code&gt;メソッドの3層が必要でした。Go言語では&lt;code&gt;iter.Seq&lt;&#x2F;code&gt;型の関数を1つ返すだけで済みます。イテレータの状態管理（インデックスの保持、終端判定）はクロージャが担い、専用のクラスを書く必要がありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現代の設計手法により非推奨となったパターン&quot;&gt;現代の設計手法により非推奨となったパターン&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;インスタンスが1つだけであることを保証する&quot;&gt;インスタンスが1つだけであることを保証する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Singleton&lt;&#x2F;strong&gt; — クラスのインスタンスが1つだけであることを保証し、グローバルなアクセス手段を提供する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;典型的な例として、アプリケーションの設定情報（Config）をSingletonで管理するケースを見てみます。Go言語で実装した例です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    instance&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    once&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;     sync&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Once&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; string&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    once&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Do&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        port&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; strconv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Atoi&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Getenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;DB_PORT&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        instance&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; = &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Getenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;DB_HOST&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; port&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; instance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;r &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; FindByID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; どこからでもGetConfig()でアクセスできる&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    dsn&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fmt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Sprintf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;%s:%d&#x2F;mydb&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Configのようなオブジェクトは、システムにインスタンスを1つだけ持つのが都合よいものです。そのため、このような実装が広く行われていました。
しかし、テストのシーンを考えると、このパターンは問題があります。
&lt;code&gt;UserRepository&lt;&#x2F;code&gt;は&lt;code&gt;Config&lt;&#x2F;code&gt;に依存していますが、その依存は関数の引数に現れません。
テスト時に本番と異なる設定を注入することも困難です。&lt;&#x2F;p&gt;
&lt;p&gt;Singletonは、OOPの副作用とは無関係に、現代の多くの設計指針で非推奨とされるパターンです。問題の本質は「インスタンスが1つ」であることではなく、「グローバルなアクセス手段を提供する」という点にあります。&lt;code&gt;GetConfig()&lt;&#x2F;code&gt;のようなグローバル関数を通じてどこからでもアクセスできることが、隠れた依存関係を生み、テスト時のモック差し替えを困難にします。&lt;&#x2F;p&gt;
&lt;p&gt;注意すべきは、「ライフサイクルとしてのシングルトン」まで否定しているわけではないことです。DIコンテナがオブジェクトのスコープをシングルトンとして管理すること（SpringのデフォルトスコープやGoのfxにおけるライフサイクル管理など）は、依存関係が明示的である限り問題ありません。非推奨なのは、GoFが定義した「グローバルアクセスを提供するパターンとしてのSingleton」です。&lt;&#x2F;p&gt;
&lt;p&gt;現代では、依存性の注入（Dependency Injection）がこの問題に対するより優れた解法として確立されています。必要な依存を明示的に引数として渡すことで、グローバル状態を排除し、テスト容易性と可読性を確保します。同じ設計をDIで書くと次のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; string&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    config&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; NewUserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;r &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; FindByID&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    dsn&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fmt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Sprintf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;%s:%d&#x2F;mydb&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        DBHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Getenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;DB_HOST&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        DBPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3306&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    repo&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; NewUserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;UserRepository&lt;&#x2F;code&gt;が何に依存しているかが&lt;code&gt;NewUserRepository&lt;&#x2F;code&gt;の引数として明示されています。テスト時には異なる&lt;code&gt;Config&lt;&#x2F;code&gt;を渡すだけで済みます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;本記事では、GoFの残り13パターンのうち2つを検討しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iterator&lt;&#x2F;strong&gt; — 言語機能として吸収され、パターンとして意識する必要がなくなった&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Singleton&lt;&#x2F;strong&gt; — OOPの副作用とは無関係に、グローバル状態という本質的な問題から非推奨となった。依存性の注入（DI）がより優れた解法として確立されている&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;次回は、残る11のパターンがなぜ現代でも有用なのかを分析し、シリーズ全体の結論としてデザインパターンの本質的価値を考察します。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-affiliate&quot;&gt;
&lt;p&gt;このリンクはAmazonアソシエイトのリンクです。 &lt;a href=&quot;#fr-affiliate-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">GoFの残り13パターンのうち、Iteratorは言語機能として吸収され、Singletonは現代の設計手法により非推奨となりました。それぞれの経緯をGo言語のコードとともに検討します。</summary>
        </entry><entry xml:lang="en">
        <title>エンジニアによるエンジニアのための日めくりカレンダー</title>
        <published>2026-04-01T12:39:43+09:00</published>
        <updated>2026-04-01T12:39:43+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/sample-code-calendar/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/sample-code-calendar/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;sample-code-calendar&amp;#x2F;cover.webp?h=a68f5422b6c894452306&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;800&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;翔泳社は40周年を記念して2月に発売されたサンプルコードを集めた『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4lZWKmO&quot;&gt;サンプルコード365+1 エンジニアによるエンジニアのための日めく
りカレンダー&lt;&#x2F;a&gt;』&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-affiliate-1&quot;&gt;&lt;a href=&quot;#fn-affiliate&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;いろんな言語で様々なアルゴリズムが掲載されており暇つぶしには最適です。
また、今のご時世にプログラムコードをきちんとした印刷で読むというのも、
意外に楽しい体験です。&lt;&#x2F;p&gt;
&lt;p&gt;惜しいのは、折角キレイに印刷されたコードを日めくりで捨ててしまうことと、
このカレンダーをどこにどう置けば良いのか悩ましい点です。&lt;&#x2F;p&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604011243261697?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18472607%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;2970&#x2F;9784798192970_1_166.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604011243261697?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18472607%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;サンプルコード365+1 エンジニアによるエンジニアのための日めくりカレンダー&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;SE編集部 翔泳社 2026年02月24日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202604011243261697?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18472607%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;479819297X&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89365%2B1%20%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%97%A5%E3%82%81%E3%81%8F%E3%82%8A%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-affiliate&quot;&gt;
&lt;p&gt;この記事はアフィリエイトのリンクを含みます。 &lt;a href=&quot;#fr-affiliate-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">翔泳社40周年記念の日めくりカレンダー「サンプルコード365+1」を紹介します。多言語・多アルゴリズムのコードが美しく印刷されており、毎日1枚ずつコードを読む新鮮な体験が楽しめます。
</summary>
        </entry><entry xml:lang="en">
        <title>GoFデザインパターンは現代でも有用か(2) — Go言語で不要になったパターン</title>
        <published>2026-04-01T10:00:00+09:00</published>
        <updated>2026-04-01T10:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/gof-design-patterns/02-unnecessary-patterns/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/gof-design-patterns/02-unnecessary-patterns/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;gof-design-patterns&amp;#x2F;02-unnecessary-patterns&amp;#x2F;cover.webp?h=395d88df7f249e0311f1&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;前回の振り返り&quot;&gt;前回の振り返り&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;04&#x2F;gof-design-patterns&#x2F;01-paradigm-shift&#x2F;&quot;&gt;前回&lt;&#x2F;a&gt;は、OOPが手続き型プログラミングからのパラダイムシフトとして登場した経緯、OOPの設計ノウハウを体系化したGoFデザインパターンが広く受け入れられた歴史、そして現代ではOOPの中核を意図的に排除したGo言語が登場したことを振り返りました。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語の設計方針は、OOPとの対比で次の3点に集約されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;クラス継承を排除し、合成（composition）と暗黙的インターフェースで代替した&lt;&#x2F;li&gt;
&lt;li&gt;参照セマンティクスではなく値セマンティクスをデフォルトにした&lt;&#x2F;li&gt;
&lt;li&gt;振る舞いもオブジェクトに包む制約を廃し、第一級関数とチャネル&#x2F;ゴルーチンで直接扱えるようにした&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この設計方針を踏まえて、GoFの23パターンをGo言語の視点から再検討してみましょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「クラス継承」の副作用への処方箋だったパターン&quot;&gt;「クラス継承」の副作用への処方箋だったパターン&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;OOP「クラス継承」がもたらしたもの&quot;&gt;OOP「クラス継承」がもたらしたもの&lt;&#x2F;h3&gt;
&lt;p&gt;ソフトウェアの保守性と拡張性を担保するために、「&lt;strong&gt;既存のコードを変更せずに機能を拡張する&lt;&#x2F;strong&gt;」という原則 — 開放閉鎖原則（Open-Closed Principle）が求められてきました。手続き型言語では、機能を追加するたび既存コードへ分岐を追加するしかなく、変更が既存の動作を壊すリスクが常にありました。OOPはこの課題に対して、&lt;strong&gt;クラス継承&lt;&#x2F;strong&gt;という新たなメカニズムで解決を図りました。基底クラスを定義し、サブクラスで振る舞いをオーバーライドすることで、既存コードに手を加えずに機能を拡張します。これがOOPの基本戦略でした。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、継承自体が新たな問題を生みます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;脆弱な基底クラス問題&lt;&#x2F;strong&gt; — 親クラスを変更すると、全てのサブクラスに影響が波及する。「変更せずに拡張」したかったのに、親を変えた瞬間に子が壊れる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;密結合&lt;&#x2F;strong&gt; — サブクラスは親クラスの実装詳細に依存する。拡張のつもりが、内部実装への依存を生む&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;単一継承の制約&lt;&#x2F;strong&gt; — Java等では1つのクラスしか継承できない。拡張の方向が1軸に制限される&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;深い階層の可読性低下&lt;&#x2F;strong&gt; — 継承が何段にも重なると、実際の振る舞いを追うのが困難になる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;デザインパターンは、この継承の副作用を管理するための処方箋でした。以下のパターンが該当します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template Method&lt;&#x2F;strong&gt; — 親クラスでアルゴリズムの骨格を定義し、サブクラスで具体的なステップをオーバーライドする。継承による骨格と詳細の分離を体系化したもの&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Factory Method&lt;&#x2F;strong&gt; — オブジェクトの生成をサブクラスに委ねることで、生成ロジックの拡張を継承で管理する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Abstract Factory&lt;&#x2F;strong&gt; — 関連するオブジェクト群の生成を抽象クラスの階層で管理する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bridge&lt;&#x2F;strong&gt; — 抽象クラスの階層と実装クラスの階層を分離し、それぞれ独立して拡張可能にする。継承階層を2つに分けることで拡張の柔軟性を確保する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらはいずれも「継承をどう使えば安全に拡張できるか」を体系化したものであり、継承というメカニズムが前提にあって初めて意味を持つパターンです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Go言語の解法_—_継承のない拡張性&quot;&gt;Go言語の解法 — 継承のない拡張性&lt;&#x2F;h3&gt;
&lt;p&gt;Go言語はこの問題の連鎖に対して、根本的に異なる道を選びました。クラス継承を排除し、&lt;strong&gt;暗黙的インターフェースと合成（composition）&lt;&#x2F;strong&gt; によって開放閉鎖原則を実現しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;暗黙的インターフェース&lt;&#x2F;strong&gt; — &lt;code&gt;implements&lt;&#x2F;code&gt;の宣言が不要で、メソッドのシグネチャが合致すれば自動的にインターフェースを満たす。既存の型に触れることなく、新しいインターフェースへ適合させられる。つまり、既存コードを変更せず新しい抽象に対応できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;合成（composition）&lt;&#x2F;strong&gt; — 構造体の埋め込み（embedding）により、既存の型を変更せずに振る舞いを追加できる。継承のような親子の密結合が生まれず、拡張しても既存コードへの影響がない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;継承の副作用が存在しないため、その副作用を管理するためのデザインパターンも必要ありません。これらのパターンが「Go言語では成立しない」のは、解決すべき問題が言語設計の時点で回避されているからです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「参照セマンティクス」を補完するパターン&quot;&gt;「参照セマンティクス」を補完するパターン&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;「参照セマンティクス」がもたらしたもの&quot;&gt;「参照セマンティクス」がもたらしたもの&lt;&#x2F;h3&gt;
&lt;p&gt;OOPの多くの言語は参照セマンティクス&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-reference-semantics-1&quot;&gt;&lt;a href=&quot;#fn-reference-semantics&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を採用しています。これはOOPの設計思想と深く結びついています。OOPでは「このオブジェクトとあのオブジェクトは同一か」というオブジェクトの同一性（identity）が重要であり、基底クラスの参照を通じて派生クラスのメソッドを呼び出すポリモーフィズムも参照なしでは成立しません。参照セマンティクスはOOPにとって必然的な選択でした。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、参照セマンティクスは副作用も伴います。変数に代入してもオブジェクト自体はコピーされず、同じ実体を指す参照が増えるだけです。C言語でいえば、すべての変数がポインタ経由でデータにアクセスしているようなものであり、手続き型言語のグローバル変数と同様に「どこで変更されるか追跡できない」という課題をオブジェクト単位で持ち込んでしまいます。この性質がオブジェクトの複製や状態の保存・復元を厄介な問題にし、それを解決するためのデザインパターンが必要でした。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語は値セマンティクス&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-value-semantics-1&quot;&gt;&lt;a href=&quot;#fn-value-semantics&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を採用しています。OOPを捨てたことで、参照をデフォルトにする必要がなくなりました。値セマンティクスは並行処理の安全性（ゴルーチン間でコピーを渡せば共有状態が減る）と予測可能性（代入の振る舞いが明示的で単純）をもたらします。参照が必要な場合は、ポインタで明示的に指定します。&lt;&#x2F;p&gt;
&lt;p&gt;この「&lt;strong&gt;デフォルトは値、参照が必要なら明示せよ&lt;&#x2F;strong&gt;」という設計方針は、Go言語独自のものではありません。Rustはムーブセマンティクスをデフォルトとし参照は&lt;code&gt;&amp;amp;&lt;&#x2F;code&gt;で明示します。Swiftは構造体（struct）を値型とし、Appleは構造体の使用を推奨しています。OOP以降の現代的な言語設計に共通するトレンドです。&lt;&#x2F;p&gt;
&lt;p&gt;この値セマンティクスにより、以下のパターンが解決しようとした問題は大幅に簡素化されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;既存オブジェクトをコピーして新しいオブジェクトを生成する&quot;&gt;既存オブジェクトをコピーして新しいオブジェクトを生成する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prototype&lt;&#x2F;strong&gt; — 参照セマンティクスの世界では、オブジェクトの「正しいコピー」を作ること自体が設計上の課題であり、Clone()メソッドの実装やプロトタイプ登録といった仕組みが必要だった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Go言語では、構造体の代入がそのままコピーです。&lt;code&gt;b := a&lt;&#x2F;code&gt;と書けばフィールドがすべて複製されます。ポインタを含む構造体の深いコピーには注意が必要ですが、パターンとしての仕組みは不要です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;オブジェクトの内部状態を保存し復元する&quot;&gt;オブジェクトの内部状態を保存し復元する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memento&lt;&#x2F;strong&gt; — Originator（状態を持つ対象）、Memento（保存された状態）、Caretaker（保存を管理する者）の3者構造で、カプセル化を壊さずに状態を保存・復元する仕組みを実現していた&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Go言語では、構造体をそのままコピーすればスナップショットになります。&lt;code&gt;saved := currentState&lt;&#x2F;code&gt;で保存、&lt;code&gt;currentState = saved&lt;&#x2F;code&gt;で復元です。OOPが苦心した「カプセル化を維持しつつ状態を外部に保存する」という問題自体が、値セマンティクスによって解消されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「振る舞い」をオブジェクトに包む制約への処方箋だったパターン&quot;&gt;「振る舞い」をオブジェクトに包む制約への処方箋だったパターン&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;「すべてがオブジェクト」がもたらしたもの&quot;&gt;「すべてがオブジェクト」がもたらしたもの&lt;&#x2F;h3&gt;
&lt;p&gt;OOPの「すべてがオブジェクト」という原則は、データと振る舞いを一体化することで、手続き型言語のようにデータと関数がバラバラに散らばる問題を解消しました。統一的なモデルで設計を語れることは、OOPの大きな功績です。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、ソフトウェアでは要件の変化や文脈の違いに応じて、データはそのままに処理だけを差し替える場面が頻繁に発生します。同じデータを異なる基準でソートしたい、同じリクエスト処理を本番ではDB接続、テストではモックに差し替えたい、といった場面です。OOPの「すべてがオブジェクト」という原則は、このような振る舞いだけを渡したい場面でも、それをオブジェクト（クラス）に包むことを強制しました。関数を1つ渡したいだけなのに、インターフェースを定義し、具象クラスを実装し、そのインスタンスを生成する。この儀式が、以下のパターンを生みました。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語では、第一級関数であり、チャネルとゴルーチンが言語に組み込まれています。振る舞いをオブジェクトに包む必要がなくなったことで、これらのパターンは不要になりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;アルゴリズムを動的に切り替える&quot;&gt;アルゴリズムを動的に切り替える&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Strategy&lt;&#x2F;strong&gt; — Strategyインターフェースを定義し、各アルゴリズムを具象クラスとして実装し、コンテキストオブジェクトに注入するという手順が必要だった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Javaでは、ソート順を差し替えるだけでもインターフェースと具象クラスが必要です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; Strategyインターフェース&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; SortStrategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 具象クラス：昇順&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; AscendingSort&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; SortStrategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;* 昇順ソート *&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 具象クラス：降順&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; DescendingSort&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; SortStrategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;* 降順ソート *&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; コンテキストクラス&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Sorter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private SortStrategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; strategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    Sorter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;SortStrategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; strategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt;        this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;strategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; strategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; execute&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        strategy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 使用側&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Sorter&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Sorter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; AscendingSort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Go言語では第一級関数をサポートしています。ソート処理を行う関数が、ソート順を関数として受け取るだけで済みます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; ソート順を関数として受け取る。クラスもインターフェースも不要&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; executeSort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; less&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; j&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; less&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 関数を変数に代入するだけで「具象クラス」に相当する&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;ascending&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; j&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;j&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;] }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;descending&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; j&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;j&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;] }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 使用側&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;executeSort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ascending&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Javaでは振る舞いを差し替えるためにインターフェース、具象クラス、コンテキストクラスの3層が必要でした。Go言語では関数を引数として渡すだけで同じことが実現できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;操作の実行・取り消し・キューイングを可能にする&quot;&gt;操作の実行・取り消し・キューイングを可能にする&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Command&lt;&#x2F;strong&gt; — リクエストをオブジェクトとしてカプセル化し、操作をデータとして扱えるようにしていた&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Go言語では関数とクロージャがCommandオブジェクトの役割を果たします。関数をスライスに格納してキューイングする、クロージャで実行時のコンテキストを閉じ込める、といった操作が言語機能として自然に書けます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;データ構造に新しい操作を追加する&quot;&gt;データ構造に新しい操作を追加する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visitor&lt;&#x2F;strong&gt; — データ構造に対する操作を追加したいとき、操作をVisitorオブジェクトに包み、ダブルディスパッチ（accept&#x2F;visit）で呼び出す必要があった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Go言語ではtype switchにより、型に応じた処理分岐を直接記述できます。操作をオブジェクトに包む必要も、ダブルディスパッチのような間接的な仕組みも不要です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;オブジェクトの状態変化を通知する&quot;&gt;オブジェクトの状態変化を通知する&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Observer&lt;&#x2F;strong&gt; — Subject&#x2F;Observerインターフェースを定義し、登録・通知・解除のメカニズムを実装する必要があった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;エラーイベントが発生したら、ログ出力とアラート送信の2つの処理に通知する例で対比してみます。
Javaでは、Observerインターフェースの定義、Subject（EventSource）への登録メカニズム、通知ループの実装が必要です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; Observerインターフェース&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; update&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 具象クラス：ログ出力&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; LogObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; update&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Logger: &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 具象クラス：アラート送信&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; AlertObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-implements&quot;&gt; implements&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-inherited-class&quot;&gt; Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    public void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; update&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;        sendAlert&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; Subject：Observerの登録と通知を管理する&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; EventSource&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    private List&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt; new ArrayList&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;lt;&amp;gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; addObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; o&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;add&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;o&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;); }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; notifyObservers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;Observer&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; o&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; :&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            o&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;update&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 使用側：Observerを登録し、イベントを通知する&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;EventSource&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; source&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; EventSource&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;addObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; LogObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;addObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; AlertObserver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;notifyObservers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;error occurred&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Go言語では、チャネルとゴルーチンがこの役割を担います。Observerをチャネルのスライスで管理し、動的に登録できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; チャネル：Observerへの通知経路をスライスで管理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;chan string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; Observer登録：チャネルを作成し、ゴルーチンで待ち受ける&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;logCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; make&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;chan string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; logCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;go func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; logCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        fmt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Println&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Logger:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;alertCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; make&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;chan string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; alertCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;go func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; alertCh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;        sendAlert&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 全Observerに通知&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ch&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; observers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ch&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;error occurred&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Javaではインターフェース定義、登録メカニズム、通知ループが必要でした。Go言語ではチャネルが型安全な通知メカニズムとなり、ゴルーチンが通知を受け取る側の並行処理を自然に表現します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;本記事では、Go言語の3つの設計方針がGoFのデザインパターンをどのように不要にしたかを確認しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Go言語の設計方針&lt;&#x2F;th&gt;&lt;th&gt;不要になったパターン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;クラス継承を排除し、合成と暗黙的インターフェースで代替&lt;&#x2F;td&gt;&lt;td&gt;Template Method, Factory Method, Abstract Factory, Bridge&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;参照セマンティクスではなく値セマンティクスをデフォルトに&lt;&#x2F;td&gt;&lt;td&gt;Prototype, Memento&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;振る舞いもオブジェクトに包む制約を廃し、第一級関数とチャネル&#x2F;ゴルーチンで直接扱えるように&lt;&#x2F;td&gt;&lt;td&gt;Strategy, Command, Visitor, Observer&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;これらのパターンが不要になったのは、パターンの設計思想が間違っていたからではありません。OOPの制約の中で生まれた処方箋が、制約そのものを取り除いたGo言語では必要なくなった、ということです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、GoFの23パターンすべてがOOPの制約に起因するわけではありません。次回は、言語やパラダイムに依存しない普遍的な設計原則として、現代でも有用なパターンを検討します。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-reference-semantics&quot;&gt;
&lt;p&gt;参照セマンティクス（reference semantics）とは、変数への代入がオブジェクトの参照（ポインタ）をコピーする振る舞いのこと。代入先を変更すると、元のオブジェクトも影響を受ける。Java、Pythonなどが採用している（C#はクラスが参照型、構造体が値型と区別している）。 &lt;a href=&quot;#fr-reference-semantics-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-value-semantics&quot;&gt;
&lt;p&gt;値セマンティクス（value semantics）とは、変数への代入がデータそのものをコピーする振る舞いのこと。代入先を変更しても、元のデータには影響しない。Go言語の構造体やC言語の構造体が採用している。 &lt;a href=&quot;#fr-value-semantics-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">GoFの23パターンをGo言語の視点から再検討します。クラス継承の副作用への処方箋だったもの、参照セマンティクスを補完するもの、振る舞いをオブジェクトに包む制約への処方箋だったもの。</summary>
        </entry><entry xml:lang="en">
        <title>GoFデザインパターンは現代でも有用か(1) — OOPのパラダイムシフトとGoFの誕生</title>
        <published>2026-04-01T05:58:00+09:00</published>
        <updated>2026-04-01T05:58:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/04/gof-design-patterns/01-paradigm-shift/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/04/gof-design-patterns/01-paradigm-shift/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;04&amp;#x2F;gof-design-patterns&amp;#x2F;01-paradigm-shift&amp;#x2F;cover.webp?h=3fe18a08fd8d2440cfce&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;自宅の本棚の整理をしていて、『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4bW36Po&quot;&gt;Java言語で学ぶデザインパターン入門&lt;&#x2F;a&gt;第2版』(結城浩著)&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-affiliate-1&quot;&gt;&lt;a href=&quot;#fn-affiliate&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を見つけました。「今どきJava言語かね」
と思い調べてみると、5年程前に第3版が出版されていました。&lt;&#x2F;p&gt;
&lt;p&gt;「そう言えば、今どきの言語でデザインパターンってどうなんだ？」と考察していました。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、なぜ脱オブジェクト指向プログラミング（以降、OOP）のパラダイムシフトが起きたのか、そしてGoFの23のデザインパターンをGo言語ではどう扱うべきかを検討し考察してみます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;手続き型プログラミングの限界&quot;&gt;手続き型プログラミングの限界&lt;&#x2F;h2&gt;
&lt;p&gt;1960年代から1980年代にかけて、ソフトウェア開発の主流は手続き型プログラミングでした。C言語やFortranに代表されるこのパラダイムでは、データと手続き（関数）は分離して管理されます。プログラムの規模が小さいうちは問題になりませんが、規模が大きくなるにつれて、どの関数がどのデータを操作するのかを追跡することが困難になっていきました。&lt;&#x2F;p&gt;
&lt;p&gt;当時仕事ではメインフレーム中心で私の職場ではPL&#x2F;Iを使っていましたが、規模を大きくしないためかバッチ指向のデザインが好まれていました。
そのため1つ1つは短いプログラムですが、内部ではグローバル変数への依存、関数間の暗黙的なデータ受け渡しが行われていました。そして短いプログラムでも、結局ファイルを介してバッチストリーム全体がストレージ共有をしているので、変更の影響範囲が予測できないという問題が深刻化しました。&lt;&#x2F;p&gt;
&lt;p&gt;やがて、1990年代に入るとWindows&#x2F;Macintoshに加えて、IBMのOS&#x2F;2、SunやHPのワークステーションが業務で使えるレベルのシステムとなり、「ダウンサイジング」の波が業務アプリケーションの世界にも押し寄せました。この問題はさらに致命的になりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;OOPというパラダイムシフト&quot;&gt;OOPというパラダイムシフト&lt;&#x2F;h2&gt;
&lt;p&gt;OOP（オブジェクト指向プログラミング）は、手続き型プログラミングにおけるデータと手続きの分離がもたらす複雑さに対するパラダイムシフトでした。データとそれを操作する手続きを「オブジェクト」として一体化し、カプセル化によって内部状態を保護する。オブジェクト間はメッセージパッシングで協調し、継承によってコードを再利用する。Simula（1967年）で芽生え、Smalltalk（1980年）で確立されたこの思想は、1990年代にC++やJavaの普及とともに主流となりました。&lt;&#x2F;p&gt;
&lt;p&gt;OOPの普及を決定づけたのは、ダウンサイジングがもたらしたGUIクライアントの台頭です。Windowsの普及により、ソフトウェアはウィンドウ、ボタン、メニューといった視覚的な部品で構成されるようになりました。これらのUI部品は、状態を持ち、イベントに応答し、階層的に組み合わされる — まさにオブジェクトとしてモデル化するのに適した対象でした。GUIツールキットはOOPの実践的な成功例となり、OOPこそがソフトウェア開発の正しいアプローチであるという認識を広めました。&lt;&#x2F;p&gt;
&lt;p&gt;一方でOOPは、カプセル化、継承、ポリモーフィズムという新しい概念を持ち込んだために、手続き型言語で機能分割しかやって来なかった当時の開発者たちに「OOPではどうコードを書くべきなのか」と悩ませることになりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;GoFデザインパターンの誕生&quot;&gt;GoFデザインパターンの誕生&lt;&#x2F;h2&gt;
&lt;p&gt;この状況の中で、1994年にGoF（Gang of Four）&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-gof-1&quot;&gt;&lt;a href=&quot;#fn-gof&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;が『&lt;strong&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;&#x2F;strong&gt;』を出版しました。GoFはオブジェクト指向設計で繰り返し現れる23のパターンを、生成（Creational）5種、構造（Structural）7種、振舞（Behavioral）11種の3つに分類して体系化しました。これらのパターンは、当時の開発者にとって「OOPでよいコードを書くためのお手本」として受け入れられました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分類&lt;&#x2F;th&gt;&lt;th&gt;パターン名&lt;&#x2F;th&gt;&lt;th&gt;概要&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Creational（生成）&lt;&#x2F;td&gt;&lt;td&gt;Abstract Factory&lt;&#x2F;td&gt;&lt;td&gt;オブジェクトを具象クラスを指定せずに生成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Builder&lt;&#x2F;td&gt;&lt;td&gt;複雑なオブジェクトを抽象化し段階的に生成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Factory Method&lt;&#x2F;td&gt;&lt;td&gt;オブジェクトの生成をサブクラスに委ねる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Prototype&lt;&#x2F;td&gt;&lt;td&gt;既存オブジェクトをコピーし新オブジェクトを生成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Singleton&lt;&#x2F;td&gt;&lt;td&gt;インスタンスが1つだけであることを保証&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Structural（構造）&lt;&#x2F;td&gt;&lt;td&gt;Adapter&lt;&#x2F;td&gt;&lt;td&gt;互換性のないインターフェースのクラス同士を接続&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bridge&lt;&#x2F;td&gt;&lt;td&gt;抽象部分と実装部分を分離。独立に変更可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Composite&lt;&#x2F;td&gt;&lt;td&gt;ツリー構造により個別オブジェクトと合成を同一視&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Decorator&lt;&#x2F;td&gt;&lt;td&gt;オブジェクトに動的に新しい責務を追加&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Facade&lt;&#x2F;td&gt;&lt;td&gt;サブシステムの複雑なインターフェースの統一的な窓口&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Flyweight&lt;&#x2F;td&gt;&lt;td&gt;多数の細粒度オブジェクトを共有してメモリ使用量削減&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Proxy&lt;&#x2F;td&gt;&lt;td&gt;他のオブジェクトへのアクセス制御する代理オブジェクト&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Behavioral（振舞）&lt;&#x2F;td&gt;&lt;td&gt;Chain of Responsibility&lt;&#x2F;td&gt;&lt;td&gt;リクエスト処理するオブジェクト連鎖を構成し処理を委譲&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Command&lt;&#x2F;td&gt;&lt;td&gt;リクエストをオブジェクト化し、実行取消や再実行を可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Interpreter&lt;&#x2F;td&gt;&lt;td&gt;言語の文法を定義し解釈するインタプリタを提供&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Iterator&lt;&#x2F;td&gt;&lt;td&gt;内部構造を公開せずに、集合要素へアクセスする方法&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mediator&lt;&#x2F;td&gt;&lt;td&gt;オブジェクト間の相互作用を仲介者に集約し疎結合&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Memento&lt;&#x2F;td&gt;&lt;td&gt;オブジェクトの内部状態を保存し、復元可能に&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Observer&lt;&#x2F;td&gt;&lt;td&gt;状態変化を他のオブジェクトに自動的に通知&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;State&lt;&#x2F;td&gt;&lt;td&gt;オブジェクトの内部状態に応じて振舞を変更する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Strategy&lt;&#x2F;td&gt;&lt;td&gt;アルゴリズムをカプセル化し、実行時に切り替え可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Template Method&lt;&#x2F;td&gt;&lt;td&gt;アルゴリズムの骨格を定義、ステップをサブクラスに委譲&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Visitor&lt;&#x2F;td&gt;&lt;td&gt;データ構造と処理を分離し、新しい処理を追加しやすくする&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;新たなパラダイムシフト_—_なぜGoogleはOOPを捨てたのか&quot;&gt;新たなパラダイムシフト — なぜGoogleはOOPを捨てたのか&lt;&#x2F;h2&gt;
&lt;p&gt;GoFが出版されてから10年以上が経った2007年、Googleの中で新しい言語の設計が始まりました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-go-creators-1&quot;&gt;&lt;a href=&quot;#fn-go-creators&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;新言語の開発に踏み切った背景には、GoogleのC++コードベースの深刻な問題がありました。数百万行規模のコードではビルドに数十分から数時間を要し、複雑な依存関係の管理は開発者の大きな負担になっていました。C++の持つ豊富な機能 — テンプレート、多重継承、演算子オーバーロード — は、大規模なチーム開発においてコードの可読性を損ない、新しいメンバーの参入障壁を高めていました。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語の設計者たちが出した答えは、複雑さを足すのではなく引くことでした。2009年にオープンソースとして公開されたGo言語は、OOPの中核を意図的に排除し、代わりに以下の設計方針を採用しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;クラス継承を排除し、合成（composition）と暗黙的インターフェースで代替した&lt;&#x2F;li&gt;
&lt;li&gt;参照セマンティクスではなく値セマンティクスをデフォルトにした&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-semantics-1&quot;&gt;&lt;a href=&quot;#fn-semantics&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;li&gt;振る舞いもオブジェクトに包む制約を廃し、第一級関数とチャネル&#x2F;ゴルーチンで直接扱えるようにした&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;確かに近年はC++&#x2F;JavaのようなOOPでなく、次のような言語を選択するシーンが私自身も増えています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Python — クラスも書けるが、関数だけでも十分に実用的&lt;&#x2F;li&gt;
&lt;li&gt;Ruby — 実は言語設計は徹底的にOOP（全てがオブジェクト）。ただし実際の使われ方は柔軟&lt;&#x2F;li&gt;
&lt;li&gt;JavaScript — そもそもクラスベースではなくプロトタイプベース。ES6のclassは後付けの構文糖&lt;&#x2F;li&gt;
&lt;li&gt;TypeScript — JavaScriptに型を足したもの。OOPと関数型のどちらでも自然に書ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらはOOPですがマルチパラダイムで、OOPじゃないパラダイムでもコードが書けます。&lt;&#x2F;p&gt;
&lt;p&gt;では、Go言語はOOPなのでしょうか。Go言語にはメソッドやインターフェースがあり、カプセル化も実現できます。しかし、クラスや継承はありません。Go言語のFAQでは「Yes and no」と回答されています。Go言語はOOPの有用な部分（カプセル化、多態性）を残しつつ、複雑さの元凶（継承、型階層）を切り捨てた言語です。上記のような言語からさらにOOPを薄めたものと言えます。&lt;&#x2F;p&gt;
&lt;p&gt;Go言語の登場は、OOPに続く新たなパラダイムシフトの象徴です。&lt;&#x2F;p&gt;
&lt;p&gt;ここで1つの疑問が浮かびます。GoFのデザインパターンは「OOPでよいコードを書くためのお手本」として受け入れられました。しかし、Go言語はそのOOPの中核 — 継承、型階層、参照セマンティクス — を排除しています。もしGoFのパターンが本当にOOPの仕組みに依存したものであるなら、Go言語ではそれらのパターンは成立しないはずです。逆に、パターンの中に言語やパラダイムに依存しない普遍的な設計原則が含まれているなら、Go言語でも形を変えて生き残るはずです。&lt;&#x2F;p&gt;
&lt;p&gt;次回は、GoFの23のパターンをGo言語の視点から1つずつ再検討し、この仮説を検証していきます。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-affiliate&quot;&gt;
&lt;p&gt;このリンクはAmazonアソシエイトのリンクです。 &lt;a href=&quot;#fr-affiliate-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-gof&quot;&gt;
&lt;p&gt;Gang of Four（GoF）は、Erich Gamma、Richard Helm、Ralph Johnson、John Vlissidesの4人の通称。 &lt;a href=&quot;#fr-gof-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-go-creators&quot;&gt;
&lt;p&gt;主導したのはRob Pike（UNIXやPlan 9の開発者）、Ken Thompson（UNIXの共同開発者）、Robert Griesemerの3人です。 &lt;a href=&quot;#fr-go-creators-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-semantics&quot;&gt;
&lt;p&gt;参照セマンティクス（reference semantics）とは、変数への代入がオブジェクトの参照（ポインタ）をコピーする振る舞いのこと。値セマンティクス（value semantics）とは、変数への代入がデータそのものをコピーする振る舞いのこと。 &lt;a href=&quot;#fr-semantics-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">手続き型からOOPへのパラダイムシフト、そしてOOPの不完全さから生まれたGoFデザインパターン。なぜGoogleはOOPを捨ててGo言語を作ったのか。その背景を整理します。</summary>
        </entry><entry xml:lang="en">
        <title>Transparent Divide</title>
        <published>2026-03-28T10:34:17+09:00</published>
        <updated>2026-03-28T10:34:17+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/transparent-divide/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/transparent-divide/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;figure&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;transparent-divide&amp;#x2F;transparent-divide.jpg?h=2a7160085da117aaa502&quot;
  alt=&quot;Transparent Divide&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;Transparent Divide&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;A wall of glass and steel rises into the sky, grid upon grid, clear yet impenetrable. You can see through it, but you can never reach what&#x27;s on the other side. Sometimes the most effective fences are the ones you don&#x27;t even notice.&lt;&#x2F;p&gt;
&lt;p&gt;This is Abeno Harukas in Osaka, Japan&#x27;s tallest skyscraper at 300 meters. Completed in 2014, it houses a department store, offices, a hotel, a museum, and an observation deck. The name &#x27;Harukas&#x27; comes from an archaic Japanese word meaning &#x27;to brighten&#x27; or &#x27;to clear up.&#x27; A building named after clarity, wrapped entirely in a fence you can see right through.&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17436&quot;&gt;#fence&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">A wall of glass and steel rises into the sky, grid upon grid, clear yet impenetrable. You can see through it, but you can never reach what&#x27;s on the other side. Sometimes the most effective fences are the ones you don&#x27;t even notice.
</summary>
        </entry><entry xml:lang="en">
        <title>らーめん古潭</title>
        <published>2026-03-28T00:00:00+00:00</published>
        <updated>2026-03-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/kotan/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/kotan/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;kotan&amp;#x2F;cover.webp?h=ddbb69c0e8163d4398e2&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;800&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;大阪に行ってきたので、大学時代に何度か行ったあべちかの「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ramen-kotan.co.jp&#x2F;&quot;&gt;らーめん古潭&lt;&#x2F;a&gt;」に寄ってきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;古潭(こたん)とは&quot;&gt;古潭(こたん)とは&lt;&#x2F;h2&gt;
&lt;p&gt;古潭は1968年に株式会社吉光によりあべの地下センターに1号店「札幌らーめん古潭」としてオープンしたラーメンチェーンです。店名はアイヌ語の「コタン」（集落）に由来しています。&lt;&#x2F;p&gt;
&lt;p&gt;当時わずか8坪の小さな店舗だったそうですが、現在は大阪・神戸に十数店舗を展開する老舗です。&lt;&#x2F;p&gt;
&lt;p&gt;スープは豚骨・鶏ガラに野菜をじっくり煮込んだコラーゲンたっぷりのベースで、醤油・味噌・塩の味が選べます。中太の多加水麺と合わせて、コクはあるけれどあっさりした、クセのない味わいが特徴です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;大学時代の思い出&quot;&gt;大学時代の思い出&lt;&#x2F;h2&gt;
&lt;p&gt;大学に入学して九州から大阪に移り住んだ頃、1982年ごろ、当時関西のカルチャー情報誌として人気だった「Lマガジン&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;」で「あべの橋の名店、あっさり醤油らーめん」と紹介されていたのを見て、食べに行ったのが最初でした。「札幌らーめん」を名乗って開店したはずなのに、推しが醤油ってどういうことだ、と当時から思っていました。「味噌じゃないんかい」と。&lt;&#x2F;p&gt;
&lt;p&gt;個人的な感想はというと、特に美味しいということはなく「これが名店？」という印象でした。
大阪のらーめんは大したことないなと思ったものです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;40年ぶりの古潭の味は？&quot;&gt;40年ぶりの古潭の味は？&lt;&#x2F;h2&gt;
&lt;p&gt;今回40年ぶりに再訪して醤油を頼んだのですが、同じ印象です。マズいということはありません。しかし、取り立てて美味しくということもありません。変わっていないのはある意味すごいことかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;スープは「あっさり」とは言いますが、豚骨・鶏ガラをじっくり煮込んでコラーゲンたっぷりなタイプなので、昔ながらの中華そばのようなあっさりさはありません。とんこつラ
ーメンが全国的になった現代では珍しさもありません。臭みも少し感じます。&lt;&#x2F;p&gt;
&lt;p&gt;チャーシューはペラペラで存在感はありません。ネギに加えて生にんじんを刻んであるのは特徴と言えた特徴ですが、色味だけで味への影響はないと思います。&lt;&#x2F;p&gt;
&lt;p&gt;懐かしく感じましたが、「あぁ、食べにこなくてよかったな」という感想です。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;京阪神エルマガジン社発行、1977年創刊・2009年休刊 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">大学時代に通ったあべちかの「らーめん古潭」に40年ぶりに再訪しました。札幌らーめんを名乗りながら醤油推しという不思議な老舗の、変わらない味についてです。</summary>
        </entry><entry xml:lang="en">
        <title>Dirty Work</title>
        <published>2026-03-26T15:48:40+09:00</published>
        <updated>2026-03-26T15:48:40+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/dirty-work/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/dirty-work/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;dirty-work&amp;#x2F;cover.webp?h=dd37f76024fd1ce68456&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;675&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;やっと一年が終わったので、Steely Danの&quot;Dirty Work&quot;を歌ってみました。&lt;&#x2F;p&gt;
&lt;p&gt;いや、あれを&quot;Dirty Work&quot;というはさすがに礼を欠きますね、「仕事」に対して。あれは&quot;Dirty Work&quot;でなく&quot;Dirty&quot;な何かでした。&lt;&#x2F;p&gt;
&lt;p&gt;使用ギターは、Epiphone CasinoとEpiphone Texanです。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%3Atracks%3A2290765475%3Fsecret_token%3Ds-RXOba1SrGHE&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;dirty-work-steely-dan-cover&#x2F;s-RXOba1SrGHE&quot; title=&quot;Dirty Work - Steely Dan Cover&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Dirty Work - Steely Dan Cover&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">一年の&quot;Dirty Work&quot;がやっと終わったので、本物のDirty Workを。Steely Danの名曲をEpiphone CasinoとTexanで弾き語りカバーしました。</summary>
        </entry><entry xml:lang="en">
        <title>久しぶりにスプラトゥーンやったら、結構変わってた</title>
        <published>2026-03-26T08:54:18+09:00</published>
        <updated>2026-03-26T08:54:18+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/26-splat/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/26-splat/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;26-splat&amp;#x2F;cover.webp?h=05667b2c9d25d48f027e&quot;
  alt=&quot;Cover&quot; width=&quot;1200&quot; height=&quot;675&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;昨年末からご無沙汰だったスプラトゥーンを久しぶりにやりました。
やっていない間にいろいろとアップデートが入っていましたが、一番大きいのがVer.11.0.0で導入された『イカフロー』でしょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;ShHtysakKJc&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;公式情報のイカフローの説明は、次の通りです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nintendo.com&#x2F;jp&#x2F;switch&#x2F;av5ja&#x2F;report&#x2F;index.html#report16&quot;&gt;
イカフロー状態は、放出された脳内物質により、イカたちの体内のインクが沸き、全身の筋肉が躍動している状態です。
イカフロー状態に入ったとき、インクが放出され足元を塗り広げます。また、イカフロー状態が続いている間、ギアパワーのヒト移動速度アップ・イカダッシュ速度アップ・相手インク影響軽減・アクション強化と同等の恩恵を受けます。
  &lt;footer&gt;
&lt;cite&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.nintendo.com&#x2F;jp&#x2F;switch&#x2F;av5ja&#x2F;report&#x2F;index.html#report16&quot;&gt;イカ研究所極秘レポート&lt;&#x2F;a&gt;&lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;つまり、連続キルをとると「イカフロー」という状態になり次のメリットがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;足下に自インクの塗りが拡がる&lt;&#x2F;li&gt;
&lt;li&gt;ヒト移動速度アップ、イカダッシュ速度アップ、相手インク影響軽減、アクション強化などの効果が乗る&lt;&#x2F;li&gt;
&lt;li&gt;30秒で終了するが、相手を倒すと延長される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;疑似的にスタートダッシュのような効果を、連続キルにより得ることができます。&lt;&#x2F;p&gt;
&lt;p&gt;今回はスプラシューターとケルビンを使いましたが、デュアルスイーパーは相性が良さそうです。
撃ち合いが楽しくなっているのでしょうか。&lt;&#x2F;p&gt;
</content>
        <summary type="html">久しぶりにスプラトゥーン3をプレイしたら、Ver11.0.0で追加された新システム「イカフロー」で撃ち合いの楽しさが変わっていました。連続キルで発動する強化状態の仕組みと、復帰後の所感をまとめています。</summary>
        </entry><entry xml:lang="en">
        <title>「AIを使え」の先にある本当の問題 ── エンジニア育成のパラドックス</title>
        <published>2026-03-24T00:00:00+00:00</published>
        <updated>2026-03-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/ai-workforce-design-paradox/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/ai-workforce-design-paradox/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;ai-workforce-design-paradox&amp;#x2F;cover.webp?h=89b26b81d4428bd72bde&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;はじめに_──_「AIを使わない人は出世できない」の違和感&quot;&gt;はじめに ── 「AIを使わない人は出世できない」の違和感&lt;&#x2F;h2&gt;
&lt;p&gt;最近、AI時代のキャリアに関する記事を立て続けて目にしました。AccentureのCEOは「AIを使わない社員は昇進できない」と断言しており、New York Timesはプログラマーの仕事が根底から変わりつつある現場をルポルタージュしています。一方で、AIがジュニアポジションそのものを消滅させているという報道もあります。&lt;&#x2F;p&gt;
&lt;p&gt;どれも的を射ていますが、どれも問題の核心を突いていない気がしています。&lt;&#x2F;p&gt;
&lt;p&gt;ソフトウェアエンジニアとして30年以上コードを書いてきた立場から言えば、「AIを使える人」ではなく、「AIを前提とした開発プロセスを設計できる人」でなければ、もはや価値を発揮できないと考えています。そして、その人材をどう育てるかという問いに、誰もまだ答えを出せていません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Accenture_CEOの発言_──_正しいが、すでに一歩遅い&quot;&gt;Accenture CEOの発言 ── 正しいが、すでに一歩遅い&lt;&#x2F;h2&gt;
&lt;p&gt;2025年、AccentureのCEOであるJulie Sweetは、AI活用を昇進の条件とする方針を明確に打ち出しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;finance.yahoo.com&#x2F;news&#x2F;want-promotion-accenture-ceo-says-063000196.html&quot;&gt;
&lt;p&gt;&quot;If you want to get promoted, you&#x27;ve got to do the things that we do.&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Julie Sweet, CEO of Accenture（2025年、Yahoo Finance）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;AIを使わない社員は昇進させない。3年かけて技術を浸透させた上での方針だといいます。Accentureは30億ドル規模のAI投資と8万人のAI人材育成を進めており、経営者としての本気度は疑いようがありません。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、CEOの発言そのものは「AIを使え」という号令です。問題は、AIツールを日常的に「使う」こと自体が、もはやスキルと呼ぶには陳腐化しつつあるということです。ChatGPTにプロンプトを投げて回答を得ることは、すでにエンジニアに限らず多くの人が日常的にやっています。上手なプロンプトを書くことが評価されたのは数年前です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;問われるべきは「AIを使えるか」ではなく、「AIを組み込んだ開発プロセスを設計できるか」です。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;プロンプトを書く能力ではありません。開発チーム全体のワークフローの中で、どこにAIを配置し、どこに人間の判断を残し、どのような検証プロセスを組むかを設計する能力。それこそが、今後のソフトウェア開発における差別化要因になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;New_York_Timesが描いた現場_──_「判断する仕事」への転換&quot;&gt;New York Timesが描いた現場 ── 「判断する仕事」への転換&lt;&#x2F;h2&gt;
&lt;p&gt;2026年3月、Clive ThompsonはNew York Times Magazineで、AIによってプログラマーの仕事がどう変わったかを70人以上の開発者への取材を通じて描きました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&quot;&gt;
&lt;p&gt;&quot;A coder is now more like an architect than a construction worker.&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Boris Cherny, Head of Claude Code, Anthropic（2026年3月12日、The New York Times Magazine）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;開発者の仕事は「コードを書く」から「判断する」へと移行しています。AnthropicのClaude Code責任者であるBoris Cherny自身、コードベースへの貢献の100%をClaudeに書かせているといいます。Googleでは30人必要だったチームが3–6人で済むようになりました。Amazonでは、以前8時間かかったデバッグをAIが15分で完了させました。&lt;&#x2F;p&gt;
&lt;p&gt;ここで重要なのは、生産性が上がったのは単にAIツールを「使った」からではないということです。&lt;strong&gt;AIエージェントをどう配置し、どう監督し、どう検証するかという「開発プロセスの設計」が的確だったからこそ、生産性が劇的に向上しました。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Googleのプロダクト担当シニアディレクターであるRyan Salvaは、ソフトウェア開発におけるAI活用についてこう語っています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&quot;&gt;
&lt;p&gt;&quot;As an engineer, I care less that the models are really good at producing the right result the first time. I care much more that there are validation steps in place so that it eventually gets the perfect or the right answer.&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Ryan Salva, Senior Director of Product, Google（2026年3月12日、The New York Times Magazine）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;AIの出力を最初から信用するのではなく、検証ステップを設計すること。これはまさに「AIを使う」ではなく「AIを前提とした開発プロセスの設計」の話です。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、ここで見落としてはならない点があります。ソフトウェア開発は、検証という観点ではきわめて恵まれた分野です。ユニットテスト、インテグレーションテスト、CI&#x2F;CDパイプラインといったテスティングの仕組みが充実しており、「Test First」という手法が業務として浸透して20年以上経っています。つまり、AIの出力を機械的に検証するインフラが、すでに存在しているのです。&lt;&#x2F;p&gt;
&lt;p&gt;それでも、Salvaが言うような「検証ステップを設計する」ことができるエンジニアは限られています。テストを書くことと、何をテストすべきかを設計することは、まったく別の能力です。これだけ検証の仕組みが整った分野ですら、この状況なのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;消えるジュニアポジション_──_育成のパラドックス&quot;&gt;消えるジュニアポジション ── 育成のパラドックス&lt;&#x2F;h2&gt;
&lt;p&gt;ここまでなら「AIを前提とした開発プロセスの設計力を身につけよう」で話は終わります。しかし、CNBCの2025年11月の報道が、もっと根深い問題を突きつけています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.cnbc.com&#x2F;2025&#x2F;11&#x2F;20&#x2F;why-ai-may-kill-career-advancement-for-many-young-workers.html&quot;&gt;
&lt;p&gt;Companies are replacing entry-level jobs with artificial intelligence — and, in the process, are upending the traditional route to career advancement for many young, white-collar workers.&lt;&#x2F;p&gt;
&lt;footer&gt;— CNBC（2025年11月20日）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;New York Timesの記事でも、Stanford Digital Economy LabのErik Brynjolfssonの研究が引用されています。AI露出度の高い職種における若手プログラマーの雇用は2022年以降16%減少した一方、ベテランプログラマーの雇用には有意な減少がありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;ここに&lt;strong&gt;育成のパラドックス&lt;&#x2F;strong&gt;があります。&lt;&#x2F;p&gt;
&lt;p&gt;「AIを前提とした開発プロセスの設計力」は、高次のスキルです。それは長年の実務経験を通じて、何が良いコードで何が悪いコードかを判断できるようになって初めて身につきます。New York Timesの記事で、Point Health A.I.のエンジニアPia Torainはこう証言しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&quot;&gt;
&lt;p&gt;&quot;I realized that it was just four months that I was prompting hundreds, 500 prompts a day, that I started to lose my ability to code.&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Pia Torain, Software Engineer, Point Health A.I.（2026年3月12日、The New York Times Magazine）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;わずか4ヶ月のAI依存で、コーディング能力が衰えたといいます。入社2年目の若手エンジニアの証言です。&lt;&#x2F;p&gt;
&lt;p&gt;整理するとこうなります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;AIを前提とした開発プロセスの設計力を持つエンジニアが求められている&lt;&#x2F;li&gt;
&lt;li&gt;その能力には、実務で培った深い判断力が必須である&lt;&#x2F;li&gt;
&lt;li&gt;しかし、判断力を養うためのジュニアポジション自体がAIに置き換えられている&lt;&#x2F;li&gt;
&lt;li&gt;さらに、AIに頼りすぎると既存のスキルすら失われる&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;つまり、&lt;strong&gt;「判断する力」を育てる場が消えつつあるのに、「判断する力」がこれまで以上に求められている&lt;&#x2F;strong&gt;。これが育成のパラドックスです。&lt;&#x2F;p&gt;
&lt;p&gt;もちろん、シミュレーション環境での訓練やAIの出力を教材として活用する新しい学習方法も模索されています。しかし、それらはまだ実証段階であり、従来の「実務を通じた学び」に代わるものとして確立されたとは言えません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;30年コードを書いてきた者として&quot;&gt;30年コードを書いてきた者として&lt;&#x2F;h2&gt;
&lt;p&gt;私はエンジニアとして30年以上コードを書いてきました。日本のIT業界では、ある程度の経験を積むとコーディングから離れ、PMやアーキテクトを目指すのが「正しいキャリアパス」とされてきました。コードは単価の安い若手やベンダー、海外リソースが書くもの。上流工程に行くことが「上がり」だという空気です。&lt;&#x2F;p&gt;
&lt;p&gt;私はその空気に抗ってきました。コードが書けないPMやアーキテクトに、本当に正しい判断ができるのか。お客様の業務を理解するのは当然ですが、その前提としてエンジニアとしてのスキルが必要で、それはPowerPointを操る能力ではないはずです。だから意図的に、自分の手でコードを書き続ける仕事が来るように動いてきました。&lt;&#x2F;p&gt;
&lt;p&gt;振り返ると、これは育成のパラドックスに対する、個人レベルでの答えの1つだったのかもしれません。&lt;strong&gt;判断力の源泉となるスキルを、意図的に手放さない。&lt;&#x2F;strong&gt; 組織がどう評価しようと、自分の判断力を支える基盤を維持し続けるという選択です。&lt;&#x2F;p&gt;
&lt;p&gt;New York Timesの記事で、Point Healthの共同創業者Rachel Gollubはこう語っています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&quot;&gt;
&lt;p&gt;&quot;People were all like, &#x27;You&#x27;re losing all your ability to code.&#x27;&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Rachel Gollub, Co-founder, Point Health（2026年3月12日、The New York Times Magazine）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;新しい抽象化が登場するたびに「能力を失う」と言われてきました。しかし今回の問題は、過去の抽象化とは本質的に異なります。PythonがC言語を置き換えたとき、メモリ管理のスキルは不要になりましたが、代わりにPythonのスキルが求められました。学ぶべき対象が変わっただけです。&lt;&#x2F;p&gt;
&lt;p&gt;今回起きているのは &lt;strong&gt;「スキルを学ぶプロセスそのものの消滅」&lt;&#x2F;strong&gt; です。しかし、組織的な解がまだ見えない以上、個人としてできることは同じなのだろうと思います。AIが書いたコードを判断するために、自分自身がコードを書く力を意図的に維持し続けること。それは30年前にPMへの「上がり」を拒んだのと、構造としては同じ選択です。&lt;&#x2F;p&gt;
&lt;p&gt;だから、この時代にエンジニアを目指す若い人に伝えたいことがあります。AIを使うことは構いません。しかし、自力で開発できる力は必ず身につけてください。会社がその機会を与えてくれることを期待してはいけません。ジュニアポジションが消えているなら、自分で作ればいいのです。個人開発でもOSSへの貢献でも、コードを書く機会はいくらでもあります。会社の育成制度に自分のキャリアを委ねること自体が、もはやリスクです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;では、どうするか&quot;&gt;では、どうするか&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;組織としては、エンジニア育成の設計そのものを変える必要があります。&lt;&#x2F;strong&gt; ジュニアの仕事が「コードを書く」から「AIの出力を検証する」に変わるなら、検証力を体系的に鍛える仕組みが必要です。「AIを使え」という号令だけでは、中長期的にAIの出力を正しく判断できるエンジニアが枯渇するリスクを孕んでいます。ただし、その具体的な方法論は、正直に言えばまだ誰も確立できていません。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;一方、エンジニア個人としては、答えは明快です。&lt;&#x2F;strong&gt; 前のセクションで書いた通り、自分の手でコードを書く力を維持し続けること。AIを使うことと、AIなしでも書ける力を持つことは矛盾しません。会社の育成制度がこのパラドックスに追いつくのを待っている余裕はないのです。&lt;&#x2F;p&gt;
&lt;p&gt;New York TimesのAnil Dashの言葉が示唆的です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&quot;&gt;
&lt;p&gt;&quot;In coding, L.L.M.s take away the drudgery and leave the human, soulful parts to you.&quot;&lt;&#x2F;p&gt;
&lt;footer&gt;— Anil Dash, Programmer and Tech Executive（2026年3月12日、The New York Times Magazine）&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;コーディングにおいて、LLMは退屈な作業を奪い、人間的で魂のある部分を残してくれる。美しい言葉です。しかし、その「魂のある部分」を担える人間を、どう育てるのでしょうか。退屈な作業を経験せずに、魂のある判断ができるようになるのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;この問いに対する答えが、AI時代のソフトウェア開発における最も重要な課題だと、私は考えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;The New York Times Magazine. &quot;Coding After Coders: The End of Computer Programming as We Know It&quot; &lt;code&gt;https:&#x2F;&#x2F;www.nytimes.com&#x2F;2026&#x2F;03&#x2F;12&#x2F;magazine&#x2F;ai-coding-programming-jobs-claude-chatgpt.html&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Yahoo Finance. &quot;Accenture CEO says failure to use AI will cost workers a promotion—or their job&quot; &lt;code&gt;https:&#x2F;&#x2F;finance.yahoo.com&#x2F;news&#x2F;want-promotion-accenture-ceo-says-063000196.html&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;CNBC. &quot;Why AI may kill career advancement for many young workers&quot; &lt;code&gt;https:&#x2F;&#x2F;www.cnbc.com&#x2F;2025&#x2F;11&#x2F;20&#x2F;why-ai-may-kill-career-advancement-for-many-young-workers.html&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">ジュニアポジションがAIに置き換えられる今、エンジニアの「判断する力」を育てる場が消えつつあるのに「判断する力」がこれまで以上に求められる。30年コードを書き続けてきた筆者が、この育成のパラドックスについて考察します。</summary>
        </entry><entry xml:lang="en">
        <title>無料で始める Cloudflare セキュリティ対策</title>
        <published>2026-03-23T00:00:00+00:00</published>
        <updated>2026-03-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/cloudflare-free-security/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/cloudflare-free-security/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;cloudflare-free-security&amp;#x2F;cover.webp?h=9bfc915254c8cd5bf47d&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;公開翌日に何が起きたか&quot;&gt;公開翌日に何が起きたか&lt;&#x2F;h2&gt;
&lt;p&gt;先日の記事で紹介した生成AIを使った&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ask.codedchords.dev&quot;&gt;Ask&lt;&#x2F;a&gt; ページを公開した翌日、CloudflareのObservabilityを確認したところ、攻撃と思われるリクエストが並んでいました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET &#x2F;.env&lt;&#x2F;code&gt; — 環境変数ファイルの探索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;checkout&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;plans&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;signup&lt;&#x2F;code&gt; — SaaS系パスの総当たり&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;wp-login&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;wp-admin&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;xmlrpc.php&lt;&#x2F;code&gt; — WordPress管理画面の探索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;api&#x2F;v1&#x2F;stripe&#x2F;config.js&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;api&#x2F;v2&#x2F;payment&#x2F;keys.js&lt;&#x2F;code&gt; — 決済APIの設定ファイル探索（Stripeはオンライン決済プラットフォーム）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;config.php&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;api&#x2F;system&#x2F;info&lt;&#x2F;code&gt; — サーバー情報の収集&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;主にWordPressなどのCMSやStripeなどの決済サービスを狙ったスキャンです。静的サイト＋Workerという構成なのでそんなサービスは乗せていないのですが。公開されているエンドポイントに対してよく狙われる既知のパスを片っ端から叩いているのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;実害はありませんが、放置するのも気持ちが悪いですし、Workers AIのNeuronsを無駄に消費されるのは避けたいところです。Cloudflareの無料プランのセキュリティ機能で対策しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対策1:_Bot_Fight_Mode&quot;&gt;対策1: Bot Fight Mode&lt;&#x2F;h2&gt;
&lt;p&gt;最も手軽な対策です。Cloudflareダッシュボードの &lt;strong&gt;Security &amp;gt; Bots&lt;&#x2F;strong&gt; から、ワンクリックで有効化できます。&lt;&#x2F;p&gt;
&lt;p&gt;Bot Fight ModeはCloudflareが持つボットの行動パターンデータベースを使い、自動化されたアクセスを検出して計算コストの高いチャレンジを返します。検索エンジンのクローラーなど検証済みの正当なボットは通過させる仕組みです。&lt;&#x2F;p&gt;
&lt;p&gt;設定はON&#x2F;OFFだけで、細かなチューニングは有料プラン（Super Bot Fight Mode）の機能になります。それでも、汎用的なスキャンボットの大半はこれで弾けます。&lt;&#x2F;p&gt;
&lt;p&gt;注意点として、Bot Fight Modeは外部サービスからのWebhookやRSSリーダーのフィード取得など、正当な自動アクセスもブロックする場合があります。無料プランではWAFルールによるバイパス（Skip）ができないため、これらのサービスに影響が出た場合はBot Fight Mode自体を無効にする必要があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対策2:_WAF_カスタムルール&quot;&gt;対策2: WAF カスタムルール&lt;&#x2F;h2&gt;
&lt;p&gt;Bot Fight Modeをすり抜けるアクセスに対しては、WAF（Web Application Firewall）のカスタムルールで対処します。無料プランでは5つまでルールを作成できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ルール1:_許可パスの制限（ホワイトリスト）&quot;&gt;ルール1: 許可パスの制限（ホワイトリスト）&lt;&#x2F;h3&gt;
&lt;p&gt;最も効果が高いルールを最優先に配置します。ask.codedchords.devは &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;（フロントエンド）と &lt;code&gt;&#x2F;api&#x2F;&lt;&#x2F;code&gt;（Workers API）しか使わないので、それ以外を全てブロックします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot; data-name=&quot;Expression&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(http.host eq &amp;quot;ask.codedchords.dev&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;and not (http.request.uri.path eq &amp;quot;&#x2F;&amp;quot; or http.request.uri.path contains &amp;quot;&#x2F;api&#x2F;&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Actionは &lt;strong&gt;Block&lt;&#x2F;strong&gt;、Place atは &lt;strong&gt;First&lt;&#x2F;strong&gt; に設定します。&lt;&#x2F;p&gt;
&lt;p&gt;「正当なパスだけを許可する」ホワイトリスト方式なので、攻撃者がどんなパスを試してもすり抜けられません。ただし、対象サイトの構成を把握している必要があります。新しいパスを追加した際にルールの更新を忘れると自分自身のコンテンツがブロックされるため、サイト構成を変更したらルールも見直してください。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ルール2:_スキャンパスの遮断（ブラックリスト）&quot;&gt;ルール2: スキャンパスの遮断（ブラックリスト）&lt;&#x2F;h3&gt;
&lt;p&gt;ルール1はaskサブドメイン限定なので、ドメイン全体に適用する汎用ルールも設定します。WordPressやphpMyAdminなど、よく狙われるパスへのアクセスを一括でブロックします。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Security &amp;gt; Security rules &amp;gt; Create rule&lt;&#x2F;strong&gt; から、以下のExpressionを設定します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot; data-name=&quot;Expression&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(http.request.uri.path contains &amp;quot;.env&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;wp-login&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;wp-admin&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;xmlrpc.php&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;phpmyadmin&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;wp-content&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;or (http.request.uri.path contains &amp;quot;wp-includes&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Actionは &lt;strong&gt;Block&lt;&#x2F;strong&gt; です。&lt;&#x2F;p&gt;
&lt;p&gt;このルールはサイトの構成に依存しないため、Cloudflareで管理しているドメイン全体に適用できます。WordPressを使っていないサイトであれば、デメリットはありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対策3:_Rate_Limiting&quot;&gt;対策3: Rate Limiting&lt;&#x2F;h2&gt;
&lt;p&gt;Bot Fight ModeとWAFルールを通過したリクエストに対する最後の砦です。同一IPからの過剰なリクエストを制限します。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Security &amp;gt; Security rules &amp;gt; Rate limiting rules&lt;&#x2F;strong&gt; から設定します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;設定値&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;対象&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;http.host eq &quot;ask.codedchords.dev&quot;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;判定基準&lt;&#x2F;td&gt;&lt;td&gt;IP&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;レート&lt;&#x2F;td&gt;&lt;td&gt;10リクエスト &#x2F; 10秒&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Action&lt;&#x2F;td&gt;&lt;td&gt;Block（10秒間）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;無料プランではRate Limitingルールは1つまで、ブロック期間は最大10秒という制約があります。大規模な攻撃には有料プランのRate Limiting（より長いブロック期間、より多くのルール）が必要ですが、スキャンボット対策としては十分です。上記の設定値は一例です。ページ内のリソース数や想定されるアクセスパターンに応じて調整してください。&lt;&#x2F;p&gt;
&lt;p&gt;なお、今回はWorkers側にも &lt;code&gt;&#x2F;api&#x2F;ask&lt;&#x2F;code&gt; エンドポイントに対して同一IP 60秒間10リクエストの制限を入れています。CloudflareのRate Limitingはインフラ層での粗いフィルタリング、Workers側はアプリケーション層での細かな制御という役割分担です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3層防御の全体像&quot;&gt;3層防御の全体像&lt;&#x2F;h2&gt;
&lt;p&gt;設定した対策を整理します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;レイヤー&lt;&#x2F;th&gt;&lt;th&gt;対策&lt;&#x2F;th&gt;&lt;th&gt;役割&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;第1層&lt;&#x2F;td&gt;&lt;td&gt;Bot Fight Mode&lt;&#x2F;td&gt;&lt;td&gt;既知のボットパターンを自動検出&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;第2層&lt;&#x2F;td&gt;&lt;td&gt;WAF カスタムルール&lt;&#x2F;td&gt;&lt;td&gt;不正なパス・不要なパスを遮断&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;第3層&lt;&#x2F;td&gt;&lt;td&gt;Rate Limiting&lt;&#x2F;td&gt;&lt;td&gt;過剰なリクエストを制限&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;いずれもCloudflareの無料プランで利用でき、設定はダッシュボードからの操作だけで完結します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;これらの設定を適用した直後から、Observability上でスキャン系のリクエストがブロックされていることを確認できました。Workers AIのNeuronsが無駄に消費されることもなくなっています。&lt;&#x2F;p&gt;
&lt;p&gt;個人サイトであっても、公開すればスキャンボットは来ます。「小規模だから狙われない」ということはありません。ボットは規模を問わず、見つけたエンドポイントを片っ端から叩きます。&lt;&#x2F;p&gt;
&lt;p&gt;Cloudflareを使っているなら、無料プランの範囲でもBot Fight Mode、WAFカスタムルール、Rate Limitingの3つを設定するだけで、大半の自動化されたスキャンは防げます。設定にかかる時間は10分程度です。特にWorkers AIやAPIエンドポイントを公開している場合は、不要なリクエストによるリソース消費を防ぐためにも早めの対策をおすすめします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;bots&#x2F;get-started&#x2F;free&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Bot Fight Mode&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;waf&#x2F;custom-rules&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Custom rules&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;waf&#x2F;rate-limiting-rules&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Rate limiting rules&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">個人ブログにAI Chat機能を追加した翌日、スキャンボットの集中アクセスを確認しました。Cloudflareの無料プランだけで実施できるBot Fight Mode、WAFカスタムルール、Rate Limitingの3つの対策を紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>Amber Drift</title>
        <published>2026-03-22T11:53:33+09:00</published>
        <updated>2026-03-22T11:53:33+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/amber-drift/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/amber-drift/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2288313725&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;amber-drift&quot; title=&quot;Amber Drift&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Amber Drift&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;A mellow neo-soul groove floating over Amaj7 &#x2F; Emaj7. Pentatonic lead guitar improvised in one take. Fender Stratocaster 70th Anniversary → UAFX Dual Compressor → Hudson Broadcast AP-II → Strymon Fairfax → Simplifier Mk II → JHS Colour Box V2 → MOTU M2 → Logic Pro. Mixed and mastered with UADx plugins.&lt;&#x2F;p&gt;
</content>
        <summary type="html">今週やっといろいろ開放されるので、Amaj7 &#x2F; Emaj7のループに乗せたネオソウル風ギターインストをペンタ一発で適当に弾いてみました。
</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Hazy</title>
        <published>2026-03-22T09:31:44+09:00</published>
        <updated>2026-03-22T09:31:44+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/focus-before-reality/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/focus-before-reality/</id>
        
            <content type="html">&lt;figure&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;focus-before-reality&amp;#x2F;cover.jpg?h=fd20e71904fbf9e81f4b&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;footer&gt;
  &lt;figcaption&gt;Focus Before Reality&lt;&#x2F;figcaption&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;In the softened light where edges begin to dissolve, only the steam from the coffee rises gently.
A fleeting moment before the world fully awakens — when everything still lingers in a quiet blur,
yet the warmth in your hands is certain.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17415&quot;&gt;#PhotoFriday&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">A fleeting moment before the world fully awakens — captured in a quiet blur, where only the warmth in your hands is certain.</summary>
        </entry><entry xml:lang="en">
        <title>資さんうどんを食べてきた</title>
        <published>2026-03-21T08:43:34+09:00</published>
        <updated>2026-03-21T08:43:34+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/sorry-sukesan/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/sorry-sukesan/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;sorry-sukesan&amp;#x2F;cover.webp?h=cc89f49b6350d7b803c1&quot;
  alt=&quot;Cover&quot; width=&quot;500&quot; height=&quot;375&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2026年2月26日に千葉市初出店の &lt;strong&gt;資さんうどん&lt;&#x2F;strong&gt;「こてはし台店」がグランドオープンしました。
場所は千葉北IC近くで以前はガストがあった場所です。&lt;&#x2F;p&gt;
&lt;p&gt;「資さんうどん」と言えば、1976年創業の北九州のソウルフードと呼ばれるうどんチェーンです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;資さんうどんへの期待&quot;&gt;資さんうどんへの期待&lt;&#x2F;h2&gt;
&lt;p&gt;私が福岡で小学生だったころ、奥君が転校してきました。
彼の家がうどん屋でした。その日は開店のため100円でうどんを出してると聞いて、放課後100円の握りしめて食べに行ったあのうどんの美味しさが忘れられません。&lt;&#x2F;p&gt;
&lt;p&gt;福岡のうどんは麺がふにゃふにゃで、透明感のある薄い色合いの出汁が主役です。
大阪のうどんと通じるところがあります。大阪は昆布とかつお節で出汁を作りますが、福岡はいりこ、かつお、昆布に加えてあご（トビウオ）を使うのがポイントです。&lt;&#x2F;p&gt;
&lt;p&gt;ごぼう天や丸天が乗るのも定番です。&lt;&#x2F;p&gt;
&lt;p&gt;私が住んでいたのは北九州ではないので資さんうどんを食したことはないのですが、
出汁重視の福岡スタイルで挑戦する資さんうどんには期待していました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;資さんうどんのレビュー&quot;&gt;資さんうどんのレビュー&lt;&#x2F;h2&gt;
&lt;p&gt;注文したのは、ミニかしわごぼ天うどん、たれカツ丼、ミニ黒ごまぼた餅の「選べるしあわせセット」です。
グランドオープンから約3週間後の訪問でしたが、オペレーション面ではまだ課題を感じました。&lt;&#x2F;p&gt;
&lt;p&gt;出てきたのが、これです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;sorry-sukesan&amp;#x2F;1.webp?h=e310390884edb2d21e78&quot;
  alt=&quot;ネギも入っていないうどん&quot; width=&quot;500&quot; height=&quot;375&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;家族の注文したものと比べると、ネギが入っていません。少し食してみると、出汁が手を突っ込めるくらいぬるかったのです。
あまりに酷いので、スタッフに確認すると直ぐに新しいものと差し替えていただけました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、届いたのは注文していたミニかしわごぼ天うどんでなく、ミニ肉ごぼ天うどんです。もう面倒になってそのままいただきました。&lt;&#x2F;p&gt;
&lt;p&gt;肝心の味についてです。楽しみにしていた出汁は、しょっぱい。
出汁の塩分がきつすぎます。そこに甘辛く味付けした肉の甘味がにじみ出てくるので何とも言えないゲスい味になります。
あれを美味しいと言う人もいるだろうと思いますが、私の想定していた味とは大きくかけ離れていました。
元炭坑の街である北九州と福岡では、おなじうどんでも違っていたのかも知れません。&lt;&#x2F;p&gt;
&lt;p&gt;カツ丼も名物だというので注文しましたが、「ハムかつか？」と疑うようなトンカツでなんとも残念なものでした。
多分駅でよく見かける立ち食い蕎麦のカツ丼のほうが数倍おいしいです。&lt;&#x2F;p&gt;
&lt;p&gt;唯一、ぼた餅は甘味控え目で美味しかったです。黒ごまの風味がしっかりしていて、餡の甘さも上品でした。これは資さんうどんの名物と言われるだけのことはあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ということで、再訪はないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;麺中心の讃岐系の丸亀製麺・はなまるうどんという2強に対抗して、出汁重視の福岡スタイルで勝負するというので期待をしていましたが、かなりがっかりな味でした。&lt;&#x2F;p&gt;
&lt;p&gt;創業者から経営も何度か変わっているようで、2024年にすかいらーくホールディングスが買収してからのガストなどからの業態転換で急速に店舗数を伸ばしているという背景があるようです。振り返ってみると、テーブル備え付けの液晶パネルで注文するスタイルも「ガスト」そのままです。&lt;&#x2F;p&gt;
&lt;p&gt;拙速な店舗展開で味が落ちたのか、元来こういう味なのかわかりませんが、丸亀製麺・はなまるうどんと比較するものではありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;北九州と福岡では、同じ九州でもうどん文化が違うということを実感しました。&lt;&#x2F;p&gt;
&lt;p&gt;残念、資さん。&lt;&#x2F;p&gt;
</content>
        <summary type="html">関東進出のたびに大行列を生む北九州のソウルフード「資さんうどん」が千葉市に初出店。福岡で育ち、出汁文化に親しんできた筆者が子ども時代のうどんの記憶とともに「こてはし台店」を体験します。</summary>
        </entry><entry xml:lang="en">
        <title>なぜ日本は伊藤穰一氏を問わないのか――エプスタイン文書と暗号資産の法的空白</title>
        <published>2026-03-20T11:45:09+09:00</published>
        <updated>2026-03-20T11:45:09+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/joi-ito/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/joi-ito/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;joi-ito&amp;#x2F;cover.webp?h=c1b4143db27766b55fad&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2026年1月、米国司法省がEpstein Files Transparency Actに基づいて約350万ページのエプスタイン文書を公開しました。このアーカイブの中で、「Joi Ito」の名前を含む文書は8,958件に上ります。送信3,083件、受信2,671件、言及2,749件――2009年4月から2020年1月までの約11年間にわたる、きわめて密な関係の記録です。ニューヨーク・タイムズはこのうち4,000通以上のメールが両者の間で交わされたと報じています。&lt;&#x2F;p&gt;
&lt;p&gt;この記事では、まず私自身の伊藤氏との間接的な接点を振り返った上で一連の経緯を整理し、エプスタイン文書が明らかにしたBitcoin開発への資金介入の構図と、そこから浮かび上がる日本の制度的課題について考えます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;伊藤穰一氏とSixApart&quot;&gt;伊藤穰一氏とSixApart&lt;&#x2F;h2&gt;
&lt;p&gt;個人的に言えば、彼はTypePadのファウンダーとしての印象が残っています。&lt;&#x2F;p&gt;
&lt;p&gt;2000年前後から有名人ではあったので、名前は知っていました。&lt;&#x2F;p&gt;
&lt;p&gt;2003年にMovable Typeを利用したブログサービスを私も利用していましたが、&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;09&#x2F;typepad-shutdown-end-of-blog-era&#x2F;&quot;&gt;以前の記事&lt;&#x2F;a&gt;で書いたように日本でイベントがあった際、TypePadの運営会社であるSixApartの東京のイベントでNeotenyの方と知り合いになり、Neoteny自体が彼の会社でSixApartのファウンダーだと教えてもらいました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;Movable Typeを開発したBen TrottとMena Trottの夫妻が起業したSixApart社の設立当初から、伊藤氏はベンチャーキャピタリスト兼エンジェル投資家としてNeoteneyという彼の会社を通じて投資していました。&lt;&#x2F;p&gt;
&lt;p&gt;2004年3月からはNeoteneyからの追加投資を止め、SixApartに自身も含めて経営資源を集中すると&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;joi.ito.com&#x2F;weblog&#x2F;2004&#x2F;03&#x2F;08&#x2F;some-changes-at.html&quot;&gt;宣言&lt;&#x2F;a&gt;しています。その後、SixApart Japanの会長となり、日本での事業展開を主導したのだと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;エプスタイン・スキャンダルの経緯&quot;&gt;エプスタイン・スキャンダルの経緯&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;MITメディアラボ所長から辞任へ&quot;&gt;MITメディアラボ所長から辞任へ&lt;&#x2F;h3&gt;
&lt;p&gt;伊藤氏は2011年にMITメディアラボの所長に就任しました。しかし2019年、2008年にフロリダ州で性犯罪の有罪判決を受けていたジェフリー・エプスタインから、その事実を知りながら寄付金を受け取り、さらにMITの審査プロセスを迂回して「匿名」扱いで処理していたことが発覚します。学生や教員の激しい反発を受け、同年9月に所長を辞任しました。ハーバード大学、マッカーサー財団、ナイト財団、PureTech Health、ニューヨーク・タイムズ社の役職からも同時に退いています。&lt;&#x2F;p&gt;
&lt;p&gt;この段階で問われたのは、主に「犯罪者からの寄付の受領と隠蔽」でした。伊藤氏とエプスタインの関係がどこまで深いものだったかは、まだ十分に明らかになっていませんでした。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;日本での再起&quot;&gt;日本での再起&lt;&#x2F;h3&gt;
&lt;p&gt;米国での活動基盤を失った伊藤氏は、日本に軸足を移します。2021年、デジタル庁の新設に際して初代「デジタル監」への起用が検討されましたが、エプスタインとの関係への懸念から見送られ、有識者会議「デジタル社会構想会議」のメンバーにとどまりました。&lt;&#x2F;p&gt;
&lt;p&gt;同時期から教育分野での活動を広げ、2021年12月には千葉工業大学変革センター所長へ就任し、2023年7月には同大学学長に昇格しています。2024年には内閣府のグローバル・スタートアップ・キャンパス構想（GSC）のエグゼクティブ・アドバイザーとしても活動を始め、政府のテクノロジー政策へ深く関与する立場を確立しました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;文書公開と再びの辞任&quot;&gt;文書公開と再びの辞任&lt;&#x2F;h3&gt;
&lt;p&gt;転機は2026年1月でした。米国司法省が公開した大量のエプスタイン文書の中に、伊藤氏とエプスタインの間で交わされた膨大なメールが含まれていたのです。両者の関係は、MITの寄付金集めにとどまらない、はるかに親密なものであったことが明らかになりました。&lt;&#x2F;p&gt;
&lt;p&gt;2月26日、ニューヨーク・タイムズが「How a Close Associate of Epstein&#x27;s Found Career Redemption in Japan」と題する記事を掲載します。MIT、ハーバード、カーネギーメロンといった大学がGSC構想に伊藤氏が関わっていることへの懸念を日本政府に伝え、協力できないと通達したことが報じられました。&lt;&#x2F;p&gt;
&lt;p&gt;ここから事態は急展開します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2月27日：デジタルガレージが伊藤氏の専務執行役員退任を発表（2026年6月の株主総会をもって取締役も退任予定）&lt;&#x2F;li&gt;
&lt;li&gt;3月3日：伊藤氏が自身のサイトで、デジタル社会構想会議の委員を3月末で退任すること、GSC構想の運営委員の任期を継続しないことを表明。同時に「恐ろしい行為を目撃したり、その証拠を認識したりしたことは一度もない」とコメント&lt;&#x2F;li&gt;
&lt;li&gt;3月6日：松本尚デジタル相が伊藤氏の退任意向を尊重すると述べつつ、エプスタイン文書に関する調査は行わないとの方針を示す&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;千葉工業大学については、大学側が伊藤学長を支持する声明を発表していますが、学生による第三者調査を求める署名活動は23,910筆に達し、文部科学省にも提出されています。本稿執筆時点（2026年3月20日）で決着はついていません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;エプスタイン文書が明らかにしたBitcoin開発への介入&quot;&gt;エプスタイン文書が明らかにしたBitcoin開発への介入&lt;&#x2F;h2&gt;
&lt;p&gt;ここからは、公開されたエプスタイン文書の中でも、とりわけ注目すべきBitcoin開発への介入について見ていきます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;エプスタインの初期接触（2011年）&quot;&gt;エプスタインの初期接触（2011年）&lt;&#x2F;h3&gt;
&lt;p&gt;公開されたメールによれば、エプスタインはビットコインの黎明期から、複数の仲介者を通じてその中核開発者に接触を試みていました。&lt;&#x2F;p&gt;
&lt;p&gt;2011年6月、エプスタインは投資家のJason Calacanisに「ビットコインの連中に接触したい」とメールを送りました。別の経路では、文芸エージェントのJohn Brockmanを通じて当時のBitcoinリードメンテナーであったGavin Andresenの連絡先を入手し、「アイデアは素晴らしいが、実行面に深刻なリスクがある。NYの事務所に電話してくれ」と直接メールしました。Andresenはこの面会を断っています。&lt;&#x2F;p&gt;
&lt;p&gt;同年7月にはBitcoin開発者のAmir Taakiにも接触し、Taakiの共同創業者Donald NormanがNYでエプスタインと面会しましたが、エプスタインの経歴を調査した後、関係を断ち切りました。&lt;&#x2F;p&gt;
&lt;p&gt;この時期の接触は、いずれもエプスタインの2008年のフロリダ州での性犯罪有罪判決の後のことです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Bitcoin_Foundation崩壊と開発者の囲い込み（2015年）&quot;&gt;Bitcoin Foundation崩壊と開発者の囲い込み（2015年）&lt;&#x2F;h3&gt;
&lt;p&gt;事態が大きく動いたのは2015年でした。Bitcoin Core開発者に給与を支払っていたBitcoin Foundationが破綻し、開発者たちは突然、資金源を失いました。&lt;&#x2F;p&gt;
&lt;p&gt;伊藤氏は当時MITメディアラボ所長としてDigital Currency Initiative（DCI）を立ち上げ、エプスタインからの寄付を含む資金でこの空白に素早く踏み込みました。2015年4月25日、DCI設立からわずか10日後に伊藤氏がエプスタインに送ったメールが公開されています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Many organizations scrambled to step into the vacuum created by the foundation and &#x27;take control&#x27; of the developers. We moved quickly talking to all of the various stakeholders and the three developers decided to join the Media Lab. This is a big win for us.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;「多くの組織が財団の崩壊で生じた空白に殺到し、開発者たちを『支配下に置こう』と争った。我々は迅速に動き、3人の開発者がMedia Labに参加することを決めた。これは我々にとって大きな勝利だ」&lt;&#x2F;p&gt;
&lt;p&gt;ここでいう3人とは、Gavin Andresen、Wladimir van der Laan、Cory Fieldsの3名で、いずれもBitcoinのリファレンス実装を維持する中心的な開発者でした。&lt;&#x2F;p&gt;
&lt;p&gt;別のメールでは、伊藤氏はエプスタインに対してより直接的に感謝を述べています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;FYI, used gift funds to underwrite this which allowed us to move quickly and win this round. Thanks.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;「ご報告。gift fundsを使ってこれを支援しました。おかげで迅速に動けて、今回のラウンドを勝ち取れました。ありがとう」&lt;&#x2F;p&gt;
&lt;h3 id=&quot;資金源の隠蔽&quot;&gt;資金源の隠蔽&lt;&#x2F;h3&gt;
&lt;p&gt;MIT自身の調査（Goodwin Procter報告書）によれば、伊藤氏らメディアラボ上層部はエプスタインからの寄付を意図的に「匿名」として処理し、MITの正式な審査プロセスを迂回していました。開発者たち自身は資金の最終的な出所を知らされておらず、MITという一流機関から給与を受け取っているという認識でした。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;開発者への直接的な支配提案&quot;&gt;開発者への直接的な支配提案&lt;&#x2F;h3&gt;
&lt;p&gt;エプスタインは開発者に対して、より直接的な関係も模索していました。2015年12月、MIT学生だったBitcoin Core開発者のJeremy Rubinがエプスタインにメールで研究資金の提供を打診した際、エプスタインは次のように返答しています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;One, you can merely work for me, salary. Two, start a company, hire others, I make an investment.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;「1つ目、単純に私のために働いて給料を受け取る方法。2つ目、会社を設立して他者を雇い、私が投資する方法」&lt;&#x2F;p&gt;
&lt;p&gt;Bitcoin Core開発者に対して直接雇用を提案するという、オープンソースプロジェクトの独立性とは根本的に相容れない申し出です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;両者が得たもの&quot;&gt;両者が得たもの&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;エプスタインの投資リターン&quot;&gt;エプスタインの投資リターン&lt;&#x2F;h3&gt;
&lt;p&gt;エプスタイン文書から確認できる暗号資産関連の投資は、主に以下の通りです。&lt;&#x2F;p&gt;
&lt;p&gt;Coinbaseへの投資が最も大きなリターンをもたらしました。2014年、エプスタインは米ヴァージン諸島の事業体IGO Company LLCを通じてCoinbaseのSeries Cに約300万ドルを投資しました。2018年にはこの持分の半分をBlockchain Capitalに約1,500万ドルで売却し、残りの半分は保持しました。Coinbaseは2021年にIPOし、当時の時価総額は完全希薄化ベースで約860億ドルに達しています。エプスタインは2019年に死亡していますが、遺産（estate）にこの持分が残っています。&lt;&#x2F;p&gt;
&lt;p&gt;Blockstreamへの投資は、伊藤氏との共同事業体であるKyara Investments IIIを通じて行われました。2014年のシードラウンドに約50万ドルを投資しています。この事業体は、伊藤氏が50%、エプスタイン関連法人のSouthern Financial LLCが50%を保有する構造でしたが、出資額は伊藤氏の2,000ドルに対しSouthern Financial側が500,001ドルと、経済的な実質は大きく異なっていました。Blockstream CEOのAdam Backによれば、この持分は数ヶ月後に売却されたとのことですが、文書からはその詳細な経緯が明らかになっています。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、公開文書にはエプスタイン個人のビットコインウォレットアドレス、暗号通貨の保有、ブロックチェーン上の取引記録は一切含まれていません。エプスタインの利益は暗号通貨そのものの保有からではなく、暗号資産エコシステムの中核企業への株式投資から生じていました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;伊藤氏の得たもの&quot;&gt;伊藤氏の得たもの&lt;&#x2F;h3&gt;
&lt;p&gt;伊藤氏はBlockstreamへのKyara Investments III経由での共同投資に加え、自身のVC会社Neoteneyを通じて暗号資産関連の投資ポートフォリオを構築していました。2016年のブログ投稿で、伊藤氏はDCI設立に伴い利益相反を避けるためBlockstream株を売却し、暗号資産関連の投資から手を引いたと述べています。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、より広い文脈で見れば、伊藤氏がDCIを通じて得たものはそれだけではありません。Bitcoin Coreの主要開発者の「本拠地」を自身の管轄下に置くことで、暗号資産エコシステムにおける中心的な位置取りを確保し、VC投資やテクノロジー業界での影響力を拡大する基盤を得ていました。&lt;&#x2F;p&gt;
&lt;p&gt;指摘されているように、エプスタインはビットコインを「コントロール」したわけではありません。マイナー、ノードオペレーター、コントリビューターは依然として決定権を保持していました。しかし、コア開発者の大半の「本拠地かつ給料の出所」が、エプスタインの資金で部分的に支えられた大学の研究室になったという事実は残ります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;日本の制度的課題：暗号資産と政治資金の法的空白&quot;&gt;日本の制度的課題：暗号資産と政治資金の法的空白&lt;&#x2F;h2&gt;
&lt;p&gt;ここからは、公開文書に直接の証拠があるわけではない領域に踏み込みます。伊藤氏やエプスタインが暗号資産を通じて政治的影響力を行使したという証拠は、現時点で確認されていません。しかし、両氏がビットコインのエコシステムに深く関与していた事実と、日本の法制度上の空白を並べてみると、少なくとも問題提起に値する構図が浮かび上がります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;暗号資産と政治資金規正法の曖昧な関係&quot;&gt;暗号資産と政治資金規正法の曖昧な関係&lt;&#x2F;h3&gt;
&lt;p&gt;2019年10月8日、当時の高市早苗総務大臣は閣議後の記者会見で、暗号資産（仮想通貨）による政治家個人への寄付について、暗号資産は「金銭」にも「有価証券」にも該当しないため規制対象にならないとの見解を示しました。&lt;&#x2F;p&gt;
&lt;p&gt;しかしその10日後の10月18日、政府は閣議決定による答弁書で見解を修正し、暗号資産は「財産上の利益」の寄付に該当するため一定の制約を受けるとしています。つまり、暗号資産は「金銭等」には該当しないものの、完全に規制の枠外というわけでもないという、曖昧な位置づけに置かれているのです。&lt;&#x2F;p&gt;
&lt;p&gt;問題は、この「財産上の利益」としての制約の実効性です。政治資金収支報告書への記載義務が暗号資産にどのように適用されるかは不明確であり、実務上の運用は確立されていません。高市大臣は法規制の必要性について問われた際、「新たに政治家の政治活動に制限を加えることになるので、閣法というよりは各党、各会派で議論すべき問題だ」と述べましたが、2026年3月現在、国会での具体的な議論には至っていません。&lt;&#x2F;p&gt;
&lt;p&gt;なお、金融庁は2026年通常国会で暗号資産を金融商品取引法の規制下に移行する法案を準備していますが、これは金融規制の話であり、政治資金規正法上の曖昧さを解消するものではありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;なぜこれが問題なのか&quot;&gt;なぜこれが問題なのか&lt;&#x2F;h3&gt;
&lt;p&gt;暗号資産の政治資金規正法上の位置づけが曖昧であることの含意は深いです。&lt;&#x2F;p&gt;
&lt;p&gt;まず、匿名性の問題があります。暗号資産の取引は、適切な設計のもとでは高度な匿名性を実現できます。日本の暗号資産交換業者にはKYC（本人確認）義務があるものの、P2P取引や海外の取引所を経由すれば回避可能です。現行の政治資金規正法は匿名による寄付を原則禁止していますが、暗号資産についてはこの原則の適用が不明確です。&lt;&#x2F;p&gt;
&lt;p&gt;次に、外国勢力からの献金規制の迂回可能性があります。政治資金規正法第22条の5は、外国人・外国法人からの政治活動に関する寄付を禁止しています。しかし、暗号資産は「金銭等」の定義に含まれず、「財産上の利益」としての制約の実効性も未検証です。この規制が十分に機能するかは疑問が残ります。&lt;&#x2F;p&gt;
&lt;p&gt;そして報告義務の曖昧さがあります。暗号資産による寄付が政治資金収支報告書にどう記載されるべきか、実務上のルールが存在しないということは、巨額の暗号資産が政治家に渡ったとしても、公的な記録に残らない可能性があることを意味します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;米国の「ダークマネー」との比較が示すもの&quot;&gt;米国の「ダークマネー」との比較が示すもの&lt;&#x2F;h3&gt;
&lt;p&gt;ここで、米国の政治資金の実態と比較することで、日本の脆弱性がより鮮明になります。&lt;&#x2F;p&gt;
&lt;p&gt;米国では、501(c)(4)と呼ばれる「社会福祉団体」を経由した匿名の政治献金が合法的に行われています。この団体は寄付者の開示義務がなく、受け取った資金をSuper PACに流すことで、資金の出所を隠したまま政治活動に使うことができます。2020年の選挙では10億ドル以上、2024年の選挙では約19億ドルもの匿名資金が政治に流れ込みました。海外からはしばしば「合法的な賄賂（legalized bribery）」と批判される仕組みです。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、この比較が示す構造的な非対称性です。米国では、政治に匿名で資金を流すための合法的な経路がすでに確立されています。わざわざ暗号資産を持ち出す必要がありません。つまり、暗号資産を通じた政治的影響力の行使は、米国においてはより効率的な代替手段がすでに存在するため、リスクとしての優先度が相対的に低いのです。&lt;&#x2F;p&gt;
&lt;p&gt;一方、日本にはこのような匿名献金の制度的経路が存在しません。政治資金規正法は透明性を原則とし、金銭や有価証券による寄付は報告義務が課されています。しかし、法的位置づけの曖昧な暗号資産という存在が加わると、この透明性の原則に大きな穴が開きます。日本の法制度が想定していなかった経路が、外国からの政治的影響力行使にとってはむしろ米国より使いやすい可能性があるのです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;外国の意図を代行する存在という問題&quot;&gt;外国の意図を代行する存在という問題&lt;&#x2F;h3&gt;
&lt;p&gt;エプスタイン文書が明らかにした構図を改めて整理します。エプスタインという米国の資産家が、伊藤氏という日本にも深い人脈を持つ人物を通じて、資金の流れを隠蔽しながらテクノロジーコミュニティの中枢に影響力を確立していました。この手法を政治の領域に応用すれば何が起きるかを考えると、問題の深刻さが見えてきます。&lt;&#x2F;p&gt;
&lt;p&gt;外国の資産家の意図を代行する日本人が、法的位置づけの曖昧な暗号資産を用いて日本の政治家に影響を及ぼす――これは論理的に十分あり得る構図です。そしてこれが米国との間の話だからまだ穏やかに聞こえますが、同じ構図が例えば中国との間で成立していたとしたら、日本の安全保障に関わる重大な問題として扱われるはずです。&lt;&#x2F;p&gt;
&lt;p&gt;にもかかわらず、エプスタイン文書が公開されて以降、日本のメディアは伊藤氏の辞任そのものは報じたものの、暗号資産を通じた政治資金の法的空白という制度的課題と結びつけた報道は、筆者の知る限り見当たりません。米国では議会が調査し、法律（Epstein Files Transparency Act）まで制定されているのとは対照的です。&lt;&#x2F;p&gt;
&lt;p&gt;松本デジタル相が伊藤氏の退任に際して「調査は行わない」と明言したことも象徴的です。エプスタイン文書に8,000件以上の名前が登場する人物を日本政府の要職に就かせていたにもかかわらず、事実関係すら調査しないというのは、制度的な脆弱性に対する認識の欠如と言わざるを得ません。&lt;&#x2F;p&gt;
&lt;p&gt;このメディアと政府の対応は、問題がないことの証左ではありません。むしろ、暗号資産を通じた外国からの政治的影響力行使に利用されうる構造的な空白が、認識されないまま放置されている状況です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;&#x2F;h2&gt;
&lt;p&gt;エプスタイン文書が提起する問いは、過去の出来事にとどまりません。&lt;&#x2F;p&gt;
&lt;p&gt;ビットコインの開発は分散的であり、単一の資金提供者が支配できるものではありません。しかし2015年という危機的な時期に、開発者の雇用と研究環境が特定の資金源に依存していたことは事実です。その資金源が性犯罪者の資金であったことは、テクノロジーの倫理とガバナンスに関わる深刻な問題を投げかけています。&lt;&#x2F;p&gt;
&lt;p&gt;そして日本においては、暗号資産と政治資金の関係という、まだほとんど議論されていない制度的課題が存在しています。米国にはダークマネーという「既知の問題」がありますが、日本の暗号資産による政治資金の空白は問題として認識すらされていません。エプスタイン文書が突きつけるのは、「資金と影響力の流れをいかに透明に保つか」という普遍的な問いです。この問いに対して日本社会が無関心であり続けることは、それ自体がリスクです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.justice.gov&#x2F;epstein&quot;&gt;U.S. Department of Justice&lt;&#x2F;a&gt;. Epstein Library（エプスタイン文書公開ポータル）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.justice.gov&#x2F;opa&#x2F;pr&#x2F;department-justice-publishes-35-million-responsive-pages-compliance-epstein-files&quot;&gt;U.S. Department of Justice&lt;&#x2F;a&gt;. &quot;Department of Justice Publishes 3.5 Million Responsive Pages in Compliance with the Epstein Files Transparency Act&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;oversight.house.gov&#x2F;release&#x2F;oversight-committee-releases-epstein-records-provided-by-the-department-of-justice&#x2F;&quot;&gt;U.S. House Committee on Oversight and Government Reform&lt;&#x2F;a&gt;. &quot;Oversight Committee Releases Epstein Records Provided by the Department of Justice&quot; (September 2, 2025)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;oversight.house.gov&#x2F;release&#x2F;oversight-committee-releases-additional-epstein-estate-documents&#x2F;&quot;&gt;U.S. House Committee on Oversight and Government Reform&lt;&#x2F;a&gt;. &quot;Oversight Committee Releases Additional Epstein Estate Documents&quot; (November 12, 2025)&lt;&#x2F;li&gt;
&lt;li&gt;Epstein Files Transparency Act (H.R.4405). 2025年11月19日成立。司法長官に対しエプスタイン関連の全文書を検索・ダウンロード可能な形式で公開することを義務付ける法律&lt;&#x2F;li&gt;
&lt;li&gt;The New York Times. &quot;How a Close Associate of Epstein&#x27;s Found Career Redemption in Japan&quot; (February 26, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;The New York Times. &quot;An Epstein Associate Steps Down From Japanese Government Tech Project&quot; (March 3, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;日本経済新聞. 「伊藤穰一氏が有識者委を退任　エプスタイン文書、デジタル相『調査せず』」（2026年3月6日）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chibatech.jp&#x2F;news&#x2F;imolkd0000004vgd.html&quot;&gt;千葉工業大学&lt;&#x2F;a&gt;. 「本学学長に関する報道について」（2026年2月28日）&lt;&#x2F;li&gt;
&lt;li&gt;ITmedia NEWS. 「伊藤穰一氏、デジタルガレージの専務執行役員を退任　理由は明かさず」（2026年2月27日）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tommycarstensen.com&#x2F;epstein&#x2F;people&#x2F;joi-ito.html&quot;&gt;Tommy Carstensen, Epstein Files&lt;&#x2F;a&gt;. Joi Ito — エプスタイン文書における伊藤氏関連文書の統計分析&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;news.mit.edu&#x2F;2020&#x2F;mit-releases-results-fact-finding-report-jeffrey-epstein-0110&quot;&gt;MIT News&lt;&#x2F;a&gt;. &quot;MIT releases results of fact-finding on engagements with Jeffrey Epstein&quot;（Goodwin Procter報告書、2020年1月10日）&lt;&#x2F;li&gt;
&lt;li&gt;仮想通貨Watch. 「政治家個人への献金『仮想通貨は規制対象』＝政府答弁書」（2019年10月18日閣議決定）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.opensecrets.org&#x2F;dark-money&#x2F;basics&quot;&gt;OpenSecrets&lt;&#x2F;a&gt;. Dark Money Basics（米国のダークマネーの仕組みに関する解説）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brennancenter.org&#x2F;our-work&#x2F;research-reports&#x2F;dark-money-hit-record-high-19-billion-2024-federal-races&quot;&gt;Brennan Center for Justice&lt;&#x2F;a&gt;. &quot;Dark Money Hit a Record High of $1.9 Billion in 2024 Federal Races&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;campaignlegal.org&#x2F;update&#x2F;what-dark-money&quot;&gt;Campaign Legal Center&lt;&#x2F;a&gt;. What Is Dark Money?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.soumu.go.jp&#x2F;senkyo&#x2F;seiji_s&#x2F;naruhodo01.html&quot;&gt;総務省&lt;&#x2F;a&gt;. 「なるほど！政治資金 政治資金の規正」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.soumu.go.jp&#x2F;main_content&#x2F;000174716.pdf&quot;&gt;総務省&lt;&#x2F;a&gt;. 「政治資金規正法のあらまし」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;laws.e-gov.go.jp&#x2F;law&#x2F;323AC1000000194&#x2F;&quot;&gt;e-Gov法令検索&lt;&#x2F;a&gt;. 政治資金規正法（昭和二十三年法律第百九十四号）&lt;&#x2F;li&gt;
&lt;li&gt;高市早苗総務大臣記者会見（2019年10月8日）. 暗号資産の政治資金規正法上の扱いに関する見解&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;joi.ito.com&#x2F;weblog&#x2F;2004&#x2F;02&#x2F;17&#x2F;six-apart-makes.html&quot;&gt;伊藤氏の当時のブログ&lt;&#x2F;a&gt;でも&lt;q&gt;My company Neoteny is an investor in Six Apart.&lt;&#x2F;q&gt;と語っています。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">TypePadのファウンダーとして記憶していた人物の名前が、エプスタイン文書に8,958件刻まれていた。Bitcoin中核開発者の囲い込み、資金源の隠蔽、そして暗号資産が政治資金規正法の枠外にある日本の制度的死角。米国の大学が協力を拒む中、なぜ日本政府は調査すらしないのか。</summary>
        </entry><entry xml:lang="en">
        <title>Cloudflare Workers AI + Vectorize で RAG</title>
        <published>2026-03-20T00:00:01+09:00</published>
        <updated>2026-05-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/ask-my-digital-double/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/ask-my-digital-double/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;ask-my-digital-double&amp;#x2F;cover.webp?h=1c0e8f975b65a3d29155&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;何を作ったのか&quot;&gt;何を作ったのか&lt;&#x2F;h2&gt;
&lt;p&gt;このブログのナビゲーションに「ask」というメニューを追加しました。
私のデジタル分身(bot)に質問できるページが表示されます。質問を入力すると、ブログ記事の内容を踏まえて私っぽい回答を返します。&lt;&#x2F;p&gt;
&lt;p&gt;ブログに書いてある話題はもちろん、書いていない話題についても「私ならこう答えるだろう」という推測で回答を生成します。
ただし、たかだか個人ブログの文書量ですから大した学習量ではないため、平気で嘘をつきます。それも含めて楽しんでもらえればと思います。&lt;&#x2F;p&gt;
&lt;p&gt;たとえば、こんな質問を投げてみます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition tip&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-tip&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Q&amp;A の例&lt;&#x2F;strong&gt;
        &lt;p&gt;&lt;strong&gt;Q:&lt;&#x2F;strong&gt; CIOも設置せず、IT Governanceの取り組みを行なわない理事長が「生成AIを導入したい」と言っています。どうすべきですか？&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;&#x2F;strong&gt; その理事長に、生成AIの導入が「新しいシステムの導入」と違うことを説明する必要があります。生成AIは、組織の判断の中枢に組み込まれ、自社固有の文脈で動く必要があります。そのためには、IT部門だけでなく、業務部門の理解と協力が必要です。
また、生成AIの導入には、データの整備、セキュリティの確保、コンプライアンスの確保などの準備が必要です。CIOを設置せず、IT Governanceの取り組みを行なわない組織では、これらの準備を十分に整えることが難しいでしょう。（以下、省略）&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;私が答えそうな回答を返してきました。ブログ記事の内容をベースにしつつ、ペルソナの設定に基づいた回答を生成しています。&lt;&#x2F;p&gt;
&lt;p&gt;ソースコードはGitHubで公開しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;yostos-persona&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;動機&quot;&gt;動機&lt;&#x2F;h2&gt;
&lt;p&gt;仕事を終えて職場を変えることになったとき、同僚が「質問できなくなるので、あなたのbotがあればいいのに」と言ってくれました。ありがたい話です。真に受けました。&lt;&#x2F;p&gt;
&lt;p&gt;もう1つの動機は、せっかくブログをCloudflare Pagesに移行したのでWorkers AIも試してみようという技術的な興味です。Workers AI、Vectorize、Workersを組み合わせたRAGシステムを自分で組んでみたかったですし、構築過程がそのままブログのネタになるのも都合が良いと思いました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;アーキテクチャ&quot;&gt;アーキテクチャ&lt;&#x2F;h2&gt;
&lt;p&gt;処理フローはシンプルなRAGパターンです。&lt;&#x2F;p&gt;
&lt;p&gt;まず事前処理として、ブログ記事をVectorizeに投入しておきます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    graph LR
Articles[ブログ記事&lt;br&gt;Markdown]--&gt; Parse[front matter解析&lt;br&gt;+ セクション分割]--&gt; EMB1[BGE-M3&lt;br&gt;embedding]--&gt; V[(Vectorize)]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;質問時は、入力をベクトル化して類似チャンクを検索し、ペルソナ設定と合わせてLLMに渡します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    graph LR
Q[質問]--&gt; EMB2[BGE-M3&lt;br&gt;embedding]--&gt; V[(Vectorize)]
V --&gt;|類似チャンク| LLM[Llama 3.3 70B]
Persona[ペルソナ設定]--&gt; LLM
LLM --&gt; A[回答 +&lt;br&gt;参考記事リンク]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;ol&gt;
&lt;li&gt;ユーザーが質問を入力&lt;&#x2F;li&gt;
&lt;li&gt;WorkersがBGE-M3で質問をベクトル化&lt;&#x2F;li&gt;
&lt;li&gt;Vectorizeで類似チャンクを検索（上位5件、スコア閾値0.3）&lt;&#x2F;li&gt;
&lt;li&gt;システムプロンプト（ペルソナ設定）＋ 取得したチャンク ＋ 質問をLlama 3.3 70Bに渡す&lt;&#x2F;li&gt;
&lt;li&gt;回答テキスト＋参考記事リンクをフロントエンドに返す&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;使用しているCloudflareサービスはWorkers、Workers AI（EmbeddingとLLM）、Vectorizeの3つだけです。フロントエンドはWorkersのAssets機能で配信しています。フレームワークは使わず、素のHTML&#x2F;CSS&#x2F;JSで構築しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;モデル選定&quot;&gt;モデル選定&lt;&#x2F;h2&gt;
&lt;p&gt;EmbeddingモデルはBGE-M3（&lt;code&gt;@cf&#x2F;baai&#x2F;bge-m3&lt;&#x2F;code&gt;）を採用しました。BAAI開発の多言語対応モデルで、出力は1024次元です。日本語と英語が混在するブログ記事に対応できることが決め手でした。当初はPLaMo-Embedding-1Bを検討しましたが、出力が2048次元でVectorizeの上限（1536次元）を超えるため断念しています。&lt;&#x2F;p&gt;
&lt;p&gt;LLMはLlama 3.3 70B Instruct FP8 Fast（&lt;code&gt;@cf&#x2F;meta&#x2F;llama-3.3-70b-instruct-fp8-fast&lt;&#x2F;code&gt;）です。128Kトークンのコンテキストウィンドウを持ち、日本語でのペルソナ付き回答生成は概ね良好です。中国語文字の混入が発生すると既知の問題として上がっています。今回は、システムプロンプトで抑制しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;事前処理:_ナレッジベースの構築&quot;&gt;事前処理: ナレッジベースの構築&lt;&#x2F;h2&gt;
&lt;p&gt;ブログのMarkdownファイル群をナレッジとして使用しており、これらを解析して事前にVectorizeする処理スクリプト(ingest)が行う処理は以下の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;記事のファイルパス、front matterからslug、title、date、tagsを抽出し、本文を見出し（&lt;code&gt;##&lt;&#x2F;code&gt;）単位でセクション分割&lt;&#x2F;li&gt;
&lt;li&gt;各チャンクにメタデータ（ファイルパス、slug、title、section、URL）を付与&lt;&#x2F;li&gt;
&lt;li&gt;BGE-M3でベクトル化してVectorizeにアップサート&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;差分検出にはマニフェストファイル（slug → MD5ハッシュのマッピング）を使い、変更のあった記事のみ再処理します。初回ingestでは286記事を処理しました。Vectorizeのメタデータ上限（10,240 bytes）対策として、チャンク本文を8,000 bytesに切り詰めています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;質問(Request)対応:_Workers_AI_のコード&quot;&gt;質問(Request)対応: Workers AI のコード&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;Vectorize処理&quot;&gt;Vectorize処理&lt;&#x2F;h3&gt;
&lt;p&gt;Workers AIの特徴は &lt;code&gt;env.AI.run()&lt;&#x2F;code&gt; というバインディング呼び出しです。APIキーの管理もSDKのインストールも不要で、&lt;code&gt;wrangler.toml&lt;&#x2F;code&gt; の &lt;code&gt;[ai]&lt;&#x2F;code&gt; セクションに &lt;code&gt;binding = &quot;AI&quot;&lt;&#x2F;code&gt; と書くだけで使えます。&lt;&#x2F;p&gt;
&lt;p&gt;RAGの検索部分（rag.ts）を丸ごと載せます。Embedding生成からVectorize検索まで、これだけで完結しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot; data-name=&quot;src&#x2F;worker&#x2F;rag.ts&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; from&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;.&#x2F;types&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;export interface&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; RetrievedChunk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  meta&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;    slug&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;    title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;    section&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;    url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  score&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; number&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; SCORE_THRESHOLD&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; TOP_K&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-modifier z-storage z-type&quot;&gt;export async function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; retrieveChunks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  question&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  env&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Promise&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type z-meta z-type&quot;&gt;RetrievedChunk[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; Embed the question&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; embeddingResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;AI&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;@cf&#x2F;baai&#x2F;bge-m3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; [question]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; queryVector&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; embeddingResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts z-source&quot;&gt;data[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; Search Vectorize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; results&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;VECTORIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;query&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(queryVector&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    topK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; TOP_K&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    returnValues&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    returnMetadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;all&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; Filter by score threshold and map to chunks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;matches&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-function z-arrow z-ts&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;score&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts z-source&quot;&gt; SCORE_THRESHOLD)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-function z-arrow z-ts&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;?.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-support z-type z-primitive&quot;&gt; as string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      meta&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        slug&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;?.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;slug&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-support z-type z-primitive&quot;&gt; as string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;?.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-support z-type z-primitive&quot;&gt; as string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        section&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;?.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;section&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-support z-type z-primitive&quot;&gt; as string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;?.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-support z-type z-primitive&quot;&gt; as string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      score&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;score&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;LLM呼び出し&quot;&gt;LLM呼び出し&lt;&#x2F;h3&gt;
&lt;p&gt;LLMの呼び出しも同じパターンです。&lt;code&gt;env.AI.run()&lt;&#x2F;code&gt; にモデル名とメッセージを渡すだけで回答が返ってきます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot; data-name=&quot;src&#x2F;worker&#x2F;index.ts（抜粋）&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; llmResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;AI&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;@cf&#x2F;meta&#x2F;llama-3.3-70b-instruct-fp8-fast&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    messages&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; role&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;system&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; systemPrompt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; role&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;user&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; question&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    max_tokens&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 512&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; answer&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (llmResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt; response&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;response&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;  ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;回答を生成できませんでした。&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;外部APIを叩いている感覚がなく、Workersの中でAIを呼んでいるだけという体験は新鮮です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ペルソナ設定&quot;&gt;ペルソナ設定&lt;&#x2F;h3&gt;
&lt;p&gt;コードの &lt;code&gt;systemPrompt&lt;&#x2F;code&gt; として渡しているのがペルソナ設定です。回答は私のキャラクタ設定に基づいて生成されます。元IBM&#x2F;AWSのエンジニア、ギター愛好家、CLIツール開発が趣味といったプロフィールに加えて、口調や回答スタイルも定義しています。敬語ベースで、好きな話題には熱量が上がり、知らないことでもぺらぺら喋るという設定です。こうしてみると、オタクそのものですね。&lt;&#x2F;p&gt;
&lt;p&gt;回答スタイルとして、簡潔に答えるだけでなく、ときどき脱線したり問い返したりするような振る舞いも仕込んでいます。200〜300文字程度を目安にしていますが、実際の挙動はモデル次第です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;コスト&quot;&gt;コスト&lt;&#x2F;h2&gt;
&lt;p&gt;個人ブログのQ&amp;amp;Aという用途なので、非機能要件は「1日数十件の質問を無料枠内で処理できること」に設定しています。&lt;&#x2F;p&gt;
&lt;p&gt;Workers AIの課金単位はNeuronsです。1リクエストあたりの消費量を見積もります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;処理&lt;&#x2F;th&gt;&lt;th&gt;モデル&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;トークン数（概算）&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Neurons&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Embedding（質問文）&lt;&#x2F;td&gt;&lt;td&gt;BGE-M3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50 入力&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.05&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;LLM 入力（プロンプト＋チャンク＋質問）&lt;&#x2F;td&gt;&lt;td&gt;Llama 3.3 70B&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,000 入力&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;53&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;LLM 出力（回答生成）&lt;&#x2F;td&gt;&lt;td&gt;Llama 3.3 70B&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;512 出力&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;105&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;合計&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;約160&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Workers AIの無料枠は10,000 Neurons&#x2F;日なので、&lt;strong&gt;約60リクエスト&#x2F;日&lt;&#x2F;strong&gt;が上限になります。&lt;&#x2F;p&gt;
&lt;p&gt;Vectorizeも無料枠に十分収まります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;リソース&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;使用量&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;無料枠&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;消費率&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;格納次元数（286記事 × 1,024次元）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;約29万&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;500万&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;クエリ次元数&#x2F;月&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;数千&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,000万&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.1%未満&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;超過した場合はWorkers Paidプラン（月$5）で$0.011&#x2F;1,000 Neuronsの従量課金になりますが、現在の利用量では発生しない見込みです。仮に想定の倍（120リクエスト&#x2F;日）が30日続いたとしても、超過分は月約288,000 Neuronsで約$3.2、プラン基本料と合わせて月$8程度です。&lt;&#x2F;p&gt;
&lt;p&gt;悪用防止として、KVベースでIPあたり60秒間10リクエストのレート制限をかけています。単一IPからの過剰なリクエストは抑制できますが、分散アクセスに対しては無力なので、無料枠の維持を保証するものではありません。個人ブログの自然なトラフィックであれば問題ない想定です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今後の課題&quot;&gt;今後の課題&lt;&#x2F;h2&gt;
&lt;p&gt;現時点で把握している課題は、BGE-M3の日本語検索精度、チャンク分割の粒度、LLMのmax_tokens最適値（回答品質とコストのバランス）、同一質問に対するキャッシュによる重複推論の回避です。&lt;&#x2F;p&gt;
&lt;p&gt;いずれの改善も、実際にどんな質問が来るかわからない段階では手の打ちようがありません。精度を上げるには実際の質問パターンに基づいた評価用クエリが必要で、つまりフィードバックループを回す必要があります。ただし、面白半分で作ったお遊びですし、質問内容を保持するのはプライバシーの観点で望ましくないため、質問内容のロギングは行っていません。一方で、ブログ記事が増えればナレッジベースが厚くなり、検索精度は自然と改善していく可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;完璧なものを作ってから公開するよりも、動くものを出して改善していくほうが性に合っています。質問を投げてみて、変な回答が返ってきたら、それはそれで面白いと思ってください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers-ai&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Workers AI&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;vectorize&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt;. &quot;Vectorize&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;BAAI&#x2F;bge-m3&quot;&gt;BAAI&lt;&#x2F;a&gt;. &quot;BGE-M3&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">ブログ記事をナレッジベースにして、著者のペルソナで質問に答えるAI Q&amp;Aページを Cloudflare Workers AI と Vectorize で構築しました。BGE-M3 による日本語 embedding、Llama 3.3 70B によるペルソナ付き回答生成、差分 ingest パイプラインまで、Cloudflare スタックだけで完結しています。</summary>
        </entry><entry xml:lang="en">
        <title>フェンダー・ストラトキャスターはアートか？</title>
        <published>2026-03-19T00:00:00+00:00</published>
        <updated>2026-03-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/fender-strat-eu-copyright/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/fender-strat-eu-copyright/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;fender-strat-eu-copyright&amp;#x2F;cover.webp?h=ff864ad71f99d22d039a&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;2026年3月、ドイツのデュッセルドルフ地方裁判所がFender Stratocasterのボディ形状を著作権で保護する判決を下しました。ギター業界にとって大きなインパクトを持ちうるこの判決の内容を整理し、その意義と他メーカーへの影響を考察します。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;判決の概要&quot;&gt;判決の概要&lt;&#x2F;h2&gt;
&lt;p&gt;デュッセルドルフ地方裁判所は、中国メーカーYiwu Philharmonic Musical Instruments Co.がAliExpressを通じてEU向けに販売していたギターについて、Stratocasterのボディデザインを不正に複製したものと認定しました。&lt;&#x2F;p&gt;
&lt;p&gt;判決の要点は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Stratocasterのボディ形状は「応用美術の著作物（work of applied art）」に該当する&lt;&#x2F;li&gt;
&lt;li&gt;純粋に機能的なデザインではなく、独自の創造的表現として保護される&lt;&#x2F;li&gt;
&lt;li&gt;被告に対して、製造地を問わずドイツおよびEU全域での製造・販売・流通が禁止される&lt;&#x2F;li&gt;
&lt;li&gt;違反時には最大25万ユーロの罰金、罰金不履行時には最大6ヶ月の禁固刑&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;原告であるFender Musical Instruments Corporationの代理人を務めたのは、ヨーロッパの知財訴訟で著名なBird &amp;amp; Bird法律事務所です。Fenderのゼネラル・カウンセルであるAarash Darroodi氏は、この判決を「Stratocasterがオリジナルの創造的著作物であることの意義ある確認であり、Fenderのデザインと知的財産の保護を継続するための重要な一歩」と評価しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜ「著作権」なのか&quot;&gt;なぜ「著作権」なのか&lt;&#x2F;h2&gt;
&lt;p&gt;ここで重要なのは、今回の保護が商標権や意匠権ではなく、&lt;strong&gt;著作権&lt;&#x2F;strong&gt;によるものだという点です。&lt;&#x2F;p&gt;
&lt;p&gt;Stratocasterの発売は1954年です。意匠権（design right）であればEUでは最長25年で保護期間が切れており、とうに失効しています。一方、商標権は更新すれば永続しますが、Fenderはボディ形状の立体商標をEUで取得できていなかったとみられます。立体商標の登録には「その形状が出所を識別する力を持つ」ことの証明が必要で、ハードルが高いためです。実際、Fenderは1990年代後半から2000年代にかけて米国でボディ形状の商標登録を試みましたが、商標審判部（TTAB）に棄却された経緯があります。&lt;&#x2F;p&gt;
&lt;p&gt;そこでFenderが選んだのは著作権というルートでした。著作権であれば登録手続きは不要で、保護期間も長期に及びます。ドイツ著作権法では、著作者（自然人）の死後70年が保護期間です。なお、米国と異なりドイツ法には「法人著作（work for hire）」の概念がなく、著作者は常に自然人とされます。Stratocasterの設計にはLeo Fenderのほか、Freddie TavaresやGeorge Fullertonも関わっています。共同著作の場合、保護期間は最後に亡くなった著作者の死後70年となるため、2079年まで延びる可能性もあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;欠席判決という重要な留意点&quot;&gt;欠席判決という重要な留意点&lt;&#x2F;h2&gt;
&lt;p&gt;この判決には見落とせない事実があります。これは**欠席判決（default judgement）**です。被告のYiwu Philharmonic Musical Instruments Co.は出廷せず、反論を一切行いませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、Fenderの主張は法的に争われていません。
裁判所はFender側の主張のみに基づいて判断を下しました。被告が出廷して争っていれば、たとえば以下のような反論を提出した可能性があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Stratocasterの形状は機能的要素が大きく、著作物としての創造性が不十分ではないか&lt;&#x2F;li&gt;
&lt;li&gt;70年以上にわたり広く模倣されてきた形状に、今さら著作権保護を認めるのか&lt;&#x2F;li&gt;
&lt;li&gt;70年以上にわたり無数のメーカーが類似形状を製造してきた事実は、権利の黙認にあたるのではないか&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;こうした論点が審理されなかったことは、この判決の先例としての重みを大きく制限します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;他のギターメーカーへの影響&quot;&gt;他のギターメーカーへの影響&lt;&#x2F;h2&gt;
&lt;p&gt;では、PRSやIbanez、Yamahaといったメーカーが製造するストラト系ギターにこの判決は影響するのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;直接的な回答としては、&lt;strong&gt;現時点では限定的&lt;&#x2F;strong&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;この判決の直接の効力が及ぶのは被告であるYiwu Philharmonic Musical Instruments Co.に対してのみです。Fenderが他のメーカーに対して同様の主張をするには、新たな訴訟を提起する必要があり、その場合は相手方が反論する対審の場で改めて審理されることになります。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、Fenderの意図は明確です。代理人であるBird &amp;amp; Bird法律事務所がプレスリリースを出し、Guitar WorldやMusicRadarなどの主要メディアで広く報道されたこと自体が、業界全体への牽制として機能しています。「デュッセルドルフ地裁がStratocasterの形状を著作物と認めた」という事実は、たとえ欠席判決であっても、今後の訴訟で援用される材料となりえます。&lt;&#x2F;p&gt;
&lt;p&gt;とりわけ注目されるのは、Stratocasterの系譜を明確に受け継ぐPRSのSilver Skyです。PRSギターのフォーラムでは早速この判決の影響を議論しています。ただし、Silver SkyはPRS独自のデザイン要素を多く含んでおり、Stratocasterの「不正な複製」と認定されるかは別の議論です。&lt;&#x2F;p&gt;
&lt;p&gt;日本メーカーへの影響も気になるところです。Ibanezはストラト系の系譜を独自に発展させたAZシリーズを展開しており、YamahaのPACIFICAシリーズはStratocasterの影響を受けつつも独自のボディシェイプを採用しています。いずれもStratocasterそのものの複製とは言い難いものの、EU市場で販売する以上、この判決の動向は無視できません。特にPACIFICA 112Vのような入門モデルはStratocasterとのシルエットの類似性が比較的高く、Fenderの主張の範囲次第では影響を受ける可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;結局のところ、Fenderは「Stratocaster形状の再現」と「非侵害のストラト系ギター」の境界をどこに引くのかという線引きを、いずれ明確にする必要が出てくるでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;&#x2F;h2&gt;
&lt;p&gt;この判決は、70年以上前にLeo Fenderらが生み出したデザインに対して、現在もなお法的保護に値するとEUの裁判所が認めた点で画期的です。しかし同時に、欠席判決であるという本質的な限界を持っています。&lt;&#x2F;p&gt;
&lt;p&gt;真の試金石となるのは、Fenderがこの判決を武器に他のメーカーと対峙し、対審の場で同じ結論が維持されるかどうかです。ギターの世界において「ストラト系」という形状はもはや1つのカテゴリーとして定着しています。1つのメーカーのデザインがカルチャーそのものになったとき、それは誰のものなのか。この問いに対する答えは、法廷だけでなくギターを愛するすべての人にとっても無関係ではないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;なお、私は1954年モデルを再現した70th Anniversary Stratocasterのオーナーです。自分のギターの「アート」としての価値が上がったと喜ぶべきなのかもしれませんが、それはさすがに話が違いますね。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Fender. Newsroom: &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;spotlight.fender.com&#x2F;newsroom&#x2F;news&#x2F;1004&quot;&gt;FENDER WINS LANDMARK COURT RULING PROTECTING THE ICONIC STRATOCASTER® BODY DESIGN&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.twobirds.com&#x2F;en&#x2F;news-and-deals&#x2F;2026&#x2F;germany&#x2F;bird-and-bird-erstreitet-wegweisendes-urteil-fuer-fender-zum-schutz-des-stratocaster-designs&quot;&gt;Bird &amp;amp; Bird&lt;&#x2F;a&gt;. &quot;Bird &amp;amp; Bird secures landmark ruling for Fender protecting iconic Stratocaster® design&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;forums.prsguitars.com&#x2F;threads&#x2F;fender-wins-lawsuit-in-germany-eu-over-copyright-on-the-stratocaster-body-shape-silver-sky-impacted.63262&#x2F;&quot;&gt;PRS Guitars Forum&lt;&#x2F;a&gt;. &quot;Fender wins lawsuit in Germany&#x2F;EU over copyright on the Stratocaster body shape (Silver Sky impacted?)&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">デュッセルドルフ地方裁判所がFender Stratocasterのボディ形状を
「応用美術の著作物」として著作権保護の対象と認めました。
この判決の背景と法的意義、そして他のギターメーカーへの影響を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>ブログ記事をBlueskyに自動投稿する — GitHub Actions + AT Protocol</title>
        <published>2026-03-18T00:00:00+00:00</published>
        <updated>2026-03-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/bluesky-auto-post/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/bluesky-auto-post/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;bluesky-auto-post&amp;#x2F;cover.webp?h=28408c7b912f8c80fa6a&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;なぜBlueskyなのか&quot;&gt;なぜBlueskyなのか&lt;&#x2F;h2&gt;
&lt;p&gt;Blueskyは、AT Protocolという分散型プロトコル上に構築されたSNSです。ブログの告知先としてSNSを選ぶなら、X（旧Twitter）が最初の候補に挙がるかもしれません。しかし、XのAPIは2023年に有料化され、無料プランでは月1,500件の投稿しかできません。自動投稿の仕組みを維持するために月額の課金が必要になります。rate limitも厳しく、突然の仕様変更で動かなくなるリスクも無視できません。そもそも、a chaotic messと化したプラットフォームに技術記事の告知を流す意味があるのかという根本的な疑問もあります。&lt;&#x2F;p&gt;
&lt;p&gt;一方、BlueskyのAT Protocol APIは完全に無料で、認証もアプリパスワード1つで済みます。プロトコル仕様が公開されており、&lt;code&gt;curl&lt;&#x2F;code&gt; で直接叩ける素朴さがあります。個人ブログの告知先としては、APIの安定性とコストの両面でBlueskyに優位性があると判断しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;手動投稿の煩わしさ&quot;&gt;手動投稿の煩わしさ&lt;&#x2F;h2&gt;
&lt;p&gt;ブログ記事を書き上げてpushした後、Blueskyを開いてURLを貼り、説明文を添えて投稿する。この手作業は1分で終わりますが、毎回やるのは面倒です。忘れることもあります。&lt;&#x2F;p&gt;
&lt;p&gt;このブログはZolaで生成し、Cloudflare Pagesでホスティングしています。記事の公開は &lt;code&gt;git push origin main&lt;&#x2F;code&gt; で完了します。であれば、Blueskyへの告知もこのpushをトリガーにして自動化するのが自然な流れです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜGitHub_Actionsなのか&quot;&gt;なぜGitHub Actionsなのか&lt;&#x2F;h2&gt;
&lt;p&gt;自動投稿の実現方法について、いくつか検討してみました。&lt;&#x2F;p&gt;
&lt;p&gt;1.Cloudflare Worker + Deploy Hook&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;インフラをCloudflareで統一できる利点があるが、「新規記事かどうか」の判定にKV等の状態管理が必要になる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;ローカルのフック（Claude Code Hookなど）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;シンプルだが、別マシンからの投稿時に動作しない。また、GitHub Actionの完了との同期が面倒である。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;IFTTT&#x2F;Zapier等のSaaS&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;簡単だが、RSSベースのため遅延が発生する。また、プライバシーの懸念もある。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;結局、GitHub Actionsへ組み込むことにしました。&lt;&#x2F;p&gt;
&lt;p&gt;GitHub Actionsを選んだ決め手は、&lt;code&gt;git diff&lt;&#x2F;code&gt; が使えることです。&lt;code&gt;git diff --name-status HEAD~1 HEAD&lt;&#x2F;code&gt; の出力で &lt;code&gt;A&lt;&#x2F;code&gt;（Added）ステータスかつ &lt;code&gt;content&#x2F;**&#x2F;index.md&lt;&#x2F;code&gt; に一致するファイルを検出すれば、新規記事だけを正確に判別できます。更新や削除では発動しません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;仕組みの全体像&quot;&gt;仕組みの全体像&lt;&#x2F;h2&gt;
&lt;p&gt;処理フローはシンプルです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;mainブランチへのpushでワークフローが起動&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;&#x2F;code&gt; で新規記事（&lt;code&gt;A&lt;&#x2F;code&gt; ステータスの &lt;code&gt;index.md&lt;&#x2F;code&gt;）を検出&lt;&#x2F;li&gt;
&lt;li&gt;frontmatter（TOML形式）からtitle、description、tagsを抽出&lt;&#x2F;li&gt;
&lt;li&gt;Bluesky AT Protocol APIで認証&lt;&#x2F;li&gt;
&lt;li&gt;OGP画像を &lt;code&gt;com.atproto.repo.uploadBlob&lt;&#x2F;code&gt; でアップロード&lt;&#x2F;li&gt;
&lt;li&gt;リンクカード（サムネイル付き）のポストを作成&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;ワークフローとスクリプトの2ファイル構成です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ワークフロー&quot;&gt;ワークフロー&lt;&#x2F;h2&gt;
&lt;p&gt;ワークフローは新規記事の検出と、スクリプトの呼び出しに責務を限定しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot; data-name=&quot;.github&#x2F;workflows&#x2F;bluesky-post.yml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Post to Bluesky&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  push&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    branches&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    paths&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;content&#x2F;**&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  post&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          fetch-depth&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Detect new articles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; detect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          new_articles=$(git diff --name-status HEAD~1 HEAD \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            | grep &amp;#39;^A&amp;#39; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            | awk &amp;#39;{print $2}&amp;#39; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            | grep &amp;#39;content&#x2F;.*&#x2F;index\.md$&amp;#39; || true)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          if [ -z &amp;quot;$new_articles&amp;quot; ]; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            echo &amp;quot;No new articles found&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            echo &amp;quot;has_new=false&amp;quot; &amp;gt;&amp;gt; &amp;quot;$GITHUB_OUTPUT&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            echo &amp;quot;New articles found:&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            echo &amp;quot;$new_articles&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;              echo &amp;quot;articles&amp;lt;&amp;lt;EOF&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;              echo &amp;quot;$new_articles&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;              echo &amp;quot;EOF&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            } &amp;gt;&amp;gt; &amp;quot;$GITHUB_OUTPUT&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            echo &amp;quot;has_new=true&amp;quot; &amp;gt;&amp;gt; &amp;quot;$GITHUB_OUTPUT&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Post to Bluesky&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; steps.detect.outputs.has_new == &amp;#39;true&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          BLUESKY_IDENTIFIER&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ${{ secrets.BLUESKY_IDENTIFIER }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          BLUESKY_APP_PASSWORD&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ${{ secrets.BLUESKY_APP_PASSWORD }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          NEW_ARTICLES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ${{ steps.detect.outputs.articles }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          echo &amp;quot;$NEW_ARTICLES&amp;quot; | while IFS= read -r article; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            [ -z &amp;quot;$article&amp;quot; ] &amp;amp;&amp;amp; continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            bash scripts&#x2F;bluesky-post.sh &amp;quot;$article&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;code&gt;fetch-depth: 2&lt;&#x2F;code&gt; で直前のコミットとの差分を取得できるようにしています。&lt;code&gt;paths: [&#x27;content&#x2F;**&#x27;]&lt;&#x2F;code&gt; でcontent配下に変更がないpush（設定ファイルの変更など）ではワークフロー自体が起動しません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;投稿スクリプト&quot;&gt;投稿スクリプト&lt;&#x2F;h2&gt;
&lt;p&gt;投稿スクリプトは &lt;code&gt;curl&lt;&#x2F;code&gt; と &lt;code&gt;jq&lt;&#x2F;code&gt; だけで動作します。外部ライブラリは不要です。&lt;&#x2F;p&gt;
&lt;p&gt;処理は大きく5段階に分かれています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;frontmatterの抽出。&lt;&#x2F;strong&gt; &lt;code&gt;sed&lt;&#x2F;code&gt; でTOMLのfrontmatter領域（&lt;code&gt;+++&lt;&#x2F;code&gt; で囲まれた部分）を取り出し、title、description、tags、&lt;code&gt;social_media_card&lt;&#x2F;code&gt;（OGP画像パス）を個別にパースします。descriptionはTOMLの複数行文字列（&lt;code&gt;&quot;&quot;&quot;&lt;&#x2F;code&gt;）にも対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;投稿テキストの生成。&lt;&#x2F;strong&gt; フォーマットは以下の通りです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;📝 Just published:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#blog #tag1 #tag2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;descriptionはリンクカードに表示されるため、テキスト本文には含めません。&lt;code&gt;#blog&lt;&#x2F;code&gt; は固定で付与し、記事のタグから最大5個のハッシュタグを追加します。スペースを含むタグ（&quot;Generative AI&quot; など）はBlueskyのハッシュタグとして機能しないためスキップします。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Facetの生成。&lt;&#x2F;strong&gt; Blueskyでハッシュタグをクリック可能にするには、テキスト中の &lt;code&gt;#tag&lt;&#x2F;code&gt; の位置をUTF-8バイトオフセットで指定する &lt;code&gt;facet&lt;&#x2F;code&gt; が必要です。&lt;code&gt;wc -c&lt;&#x2F;code&gt; でバイト位置を算出し、&lt;code&gt;app.bsky.richtext.facet#tag&lt;&#x2F;code&gt; を設定しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;OGP画像のアップロード。&lt;&#x2F;strong&gt; frontmatterの &lt;code&gt;social_media_card&lt;&#x2F;code&gt; で指定されたOGP画像を &lt;code&gt;com.atproto.repo.uploadBlob&lt;&#x2F;code&gt; でBlueskyにアップロードし、blobリファレンスを取得します。アップロードに失敗した場合はサムネイルなしで投稿を続行します。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;APIの呼び出し。&lt;&#x2F;strong&gt; &lt;code&gt;com.atproto.server.createSession&lt;&#x2F;code&gt; でセッションを作成し、&lt;code&gt;com.atproto.repo.createRecord&lt;&#x2F;code&gt; でポストを作成します。リンクカードは &lt;code&gt;app.bsky.embed.external&lt;&#x2F;code&gt; で埋め込み、アップロード済みのOGP画像を &lt;code&gt;thumb&lt;&#x2F;code&gt; フィールドに設定します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;リンクカードについて&quot;&gt;リンクカードについて&lt;&#x2F;h2&gt;
&lt;p&gt;Blueskyは投稿時にURLからOGPを自動取得しません。リンクカードを表示するには、投稿APIで &lt;code&gt;app.bsky.embed.external&lt;&#x2F;code&gt; を明示的に指定する必要があります。サムネイル画像を表示するには、事前に &lt;code&gt;com.atproto.repo.uploadBlob&lt;&#x2F;code&gt; で画像をアップロードし、返却されたblobリファレンスを &lt;code&gt;thumb&lt;&#x2F;code&gt; フィールドに設定します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;embed&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;$type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;app.bsky.embed.external&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;external&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;03&#x2F;bluesky-auto-post&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;記事タイトル&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;記事の説明文&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;thumb&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: { &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;$type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;blob&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このスクリプトでは、frontmatterの &lt;code&gt;social_media_card&lt;&#x2F;code&gt; で指定されたOGP画像（WebP&#x2F;PNG&#x2F;JPEG対応）をアップロードしています。画像のアップロードに失敗した場合でも、サムネイルなしのリンクカードとして投稿が作成されるようにフォールバック処理を入れています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;GitHub_Secretsの設定&quot;&gt;GitHub Secretsの設定&lt;&#x2F;h2&gt;
&lt;p&gt;ワークフローで使用するシークレットは2つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BLUESKY_IDENTIFIER&lt;&#x2F;code&gt; — Blueskyのハンドル&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;BLUESKY_APP_PASSWORD&lt;&#x2F;code&gt; — Blueskyのアプリパスワード（設定画面から生成）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;アプリパスワードはアカウントのパスワードとは別物で、権限を限定して発行できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;git push&lt;&#x2F;code&gt; から自動的にBlueskyへ投稿される仕組みを、GitHub Actionsとシェルスクリプトで構築しました。OGP画像のサムネイル付きリンクカードまで含めて、外部ライブラリに依存せず &lt;code&gt;curl&lt;&#x2F;code&gt; と &lt;code&gt;jq&lt;&#x2F;code&gt; だけで完結しています。この記事自体が最初の自動投稿テストです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.bsky.app&#x2F;docs&#x2F;advanced-guides&#x2F;posts&quot;&gt;Bluesky&lt;&#x2F;a&gt;. &quot;Sending Post with the Bluesky API&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atproto.com&#x2F;specs&#x2F;xrpc&quot;&gt;AT Protocol&lt;&#x2F;a&gt;. &quot;XRPC Specification&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">ブログの新規記事をmainにpushするだけで、Blueskyに自動投稿される仕組みをGitHub ActionsとAT Protocol APIで構築しました。git diffによる新規記事の判定、リンクカード付き投稿、ハッシュタグのfacet生成まで、シェルスクリプト一本で実現しています。</summary>
        </entry><entry xml:lang="en">
        <title>Mac環境のリフレッシュ</title>
        <published>2026-03-17T15:34:11+09:00</published>
        <updated>2026-03-17T15:34:11+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/mac-environment-refresh/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/mac-environment-refresh/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;mac-environment-refresh&amp;#x2F;cover.webp?h=9246e8ce05db44c2688d&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;見送っていたMac環境のリフレッシュを実施しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MacPaw関連ソフトウェアの見直し&quot;&gt;MacPaw関連ソフトウェアの見直し&lt;&#x2F;h2&gt;
&lt;p&gt;MacPaw&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;の次の2つのソフトウェアを使用していました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CleanMyMac X&lt;&#x2F;strong&gt;: macOSのメンテナンス・ユーティリティ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gemini 2&lt;&#x2F;strong&gt;: 重複ファイル削除ツール&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;いずれもサブスクリプションが中心ですが、私は2022年にロシアのウクライナ侵攻が起こった際に支援のつもりでLifeTimeの買い切りで購入しています。コストも発生せず、どちらも便利なツールです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、常駐して僅かですがリソースを食っているのが気になっていました。
今回はどちらもアンインストールして、CLI代替ツールに移行しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Mole_—_macOSクリーンアップツール&quot;&gt;Mole — macOSクリーンアップツール&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;tw93&amp;#x2F;mole&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;macOSのクリーンナップと最適化に特化したコマンドラインツールです。
CleanMyMac、AppCleaner、DaisyDisk、iStat Menusなどの機能を1コマンドでカバーしていると謳っています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; clean&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      # キャッシュ・ログ・ブラウザ残骸の削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; uninstall&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # アプリの完全アンインストール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; optimize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;   # キャッシュ再構築・サービスリフレッシュ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; analyze&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # ディスク使用量の可視化&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; status&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;     # CPU&#x2F;GPU&#x2F;メモリ&#x2F;ディスク&#x2F;ネットワークのリアルタイム監視&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; purge&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      # 開発プロジェクトのビルド成果物削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; installer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # Downloads内の.dmg&#x2F;.pkgの整理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;結構危険な処理をするツールですが、いずれも&lt;code&gt;--dry-run&lt;&#x2F;code&gt;オプションがサポートされており、実際に削除する前に検証できます。&lt;&#x2F;p&gt;
&lt;p&gt;実際、CleanMyMac Xで使用していた機能のうちマルウェアスキャン以外はほぼカバーされています。
マルウェアスキャンについては、macOS標準のXProtectとGatekeeperがかなり優秀なので、基本的に追加のスキャナは不要と判断しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Czkawka（チカフカ）_—_不要ファイル検出ツール&quot;&gt;Czkawka（チカフカ） — 不要ファイル検出ツール&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;qarmin&amp;#x2F;czkawka&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;主に重複ファイルの削除に使用していたGemini 2の代替です。名前はポーランド語で「しゃっくり」を意味します。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sahib&#x2F;rmlint&quot;&gt;rmlint&lt;&#x2F;a&gt;も検討しましたが、rmlintはバイト単位での重複判定のみで、Gemini 2のように画像の類似性による重複判定には対応していません。&lt;&#x2F;p&gt;
&lt;p&gt;その点Czkawkaは、パーセプチュアルハッシュによる類似画像検出をサポートしています。GUI版もありますが、安定のCLI版を使っています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 重複ファイル検出: -d 検索先 -e 除外先 -m 最小25B -s hash比較 -D aeo(最古以外を削除)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dup -d ~&#x2F;Documents -e ~&#x2F;Documents&#x2F;Archive -m&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 25&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -x 7z rar IMAGE -s hash -f results.txt -D aeo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 空フォルダ検出: 複数ディレクトリ指定可&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; empty-folders -d ~&#x2F;Documents ~&#x2F;Downloads -f results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 巨大ファイル検出: -n 上位25件 -x VIDEO拡張子を除外&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; big -d ~&#x2F;Documents -e ~&#x2F;Documents&#x2F;Archive -n&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 25&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -x VIDEO -f results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 類似画像検出: パーセプチュアルハッシュで視覚的に似た画像を検出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; image -d ~&#x2F;Pictures -e ~&#x2F;Pictures&#x2F;Wallpapers -f results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 壊れたシンボリックリンク検出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; symlinks -d ~&#x2F;Projects -e ~&#x2F;Projects&#x2F;.git -x jpg -f results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 破損ファイル検出: ヘッダが壊れたファイル等を検出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;czkawka_cli&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; broken -d ~&#x2F;Downloads -f results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重複ファイル、類似画像、空ファイル・フォルダ、一時ファイル、破損ファイル、拡張子不一致、不正ファイル名など、Gemini 2以上に多彩な検出機能を備えています。&lt;&#x2F;p&gt;
&lt;p&gt;なお、SenseiとCocktailは引き続き使用しています。Senseiはハードウェア情報やSSDのTrim管理に、CocktailはmacOSの定期メンテナンスタスクの自動実行に、それぞれ役割が明確なので残しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;メニューバーの整理&quot;&gt;メニューバーの整理&lt;&#x2F;h2&gt;
&lt;p&gt;MacBookでメニューバーにたくさんアイコンが並ぶと、ノッチの裏に隠れて見えなくなる問題があります。この対策としてメニュー表示管理ツールを使用していました。&lt;&#x2F;p&gt;
&lt;p&gt;Bartenderから数年前に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jordanbaird&#x2F;Ice&quot;&gt;Ice&lt;&#x2F;a&gt;へ移行しましたが、macOS Tahoeではメニュー構造が変わった影響で動作が不安定になっていました。&lt;&#x2F;p&gt;
&lt;p&gt;代替として次のようなツールがありますが、いずれも新しいmacOSのメニュー構造の変更に対応しきれていないようでした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hidden Bar&lt;&#x2F;li&gt;
&lt;li&gt;Bartender 5（有料）&lt;&#x2F;li&gt;
&lt;li&gt;Vanilla&lt;&#x2F;li&gt;
&lt;li&gt;iBar&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;しかし、macOS Tahoeではメニューバーのカスタマイズ機能が大幅に強化されました。「システム設定 &amp;gt; メニューバー &amp;gt; メニューバーの操作」から、次の操作が可能になっています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;アプリごとにメニューバーへの表示のオン・オフを制御&lt;&#x2F;li&gt;
&lt;li&gt;Apple純正機能はコントロールセンターへ移動可能&lt;&#x2F;li&gt;
&lt;li&gt;Command+ドラッグでアイコンの並び替え&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;サードパーティ製ツールのように表示の動的な切り替えやレイアウト変更には対応していませんが、常駐アイコンの大半を整理できました。もうサードパーティ製ツールは不要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ブラウザArcの代替&quot;&gt;ブラウザArcの代替&lt;&#x2F;h2&gt;
&lt;p&gt;数年前に彗星のごとく登場したArcを愛用していましたが、2025年5月にThe Browser Companyが開発終了を発表しました。理由は「ほとんどの人にとってArcは違いが大きすぎて学習コストに見合わなかった」という&quot;novelty tax&quot;問題とのことです。後継としてAIブラウザ「Dia」の開発に注力するとされていますが、Arc自体はセキュリティ修正のみのメンテナンスモードに入っています。&lt;&#x2F;p&gt;
&lt;p&gt;当初はGoogle Chrome + Side Space拡張機能でほぼArcと同等のことができるかと試していました。しかし、Arcの全機能を再現しようとすると拡張の組み合わせが増えるばかりで、本末転倒だと気づきました。&lt;&#x2F;p&gt;
&lt;p&gt;結局、Safariに落ち着いています。iCloudとの連携、省電力性能、macOS標準のパスキー対応など、Apple製品で統一している環境であれば素直にSafariが最適という結論です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;GUIの常駐アプリをCLIに置き換え、メニューバーをOS標準機能で整理し、ブラウザもSafariに一本化しました。&lt;&#x2F;p&gt;
&lt;p&gt;やっとメニューバーが整理でき、&lt;code&gt;mo clean&lt;&#x2F;code&gt;一発でMacのクリーンナップもできる。そういう小さな快適さの積み重ねで、深呼吸できた心地がします。ゴミの山は鼻をつまんで走り抜けるに限ります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tw93&#x2F;mole&quot;&gt;GitHub - tw93&#x2F;mole&lt;&#x2F;a&gt;. &quot;Mole - Deep clean and optimize your Mac&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;qarmin&#x2F;czkawka&quot;&gt;GitHub - qarmin&#x2F;czkawka&lt;&#x2F;a&gt;. &quot;Multi functional app to find duplicates, empty folders, similar images etc.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cindori.com&#x2F;sensei&quot;&gt;Sensei — Cindori&lt;&#x2F;a&gt;. 「Mac Performance Monitor &amp;amp; Cleaner」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.maintain.se&#x2F;cocktail&#x2F;&quot;&gt;Cocktail — Maintain&lt;&#x2F;a&gt;. 「A perfect mixture for macOS」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;guide&#x2F;mac-help&#x2F;change-menu-bar-settings-mchlad96d366&#x2F;mac&quot;&gt;Apple Support&lt;&#x2F;a&gt;. &quot;Change Menu Bar settings on Mac&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.engadget.com&#x2F;ai&#x2F;the-browser-company-stops-active-development-of-arc-in-favor-of-new-ai-focused-product-153045276.html&quot;&gt;Engadget&lt;&#x2F;a&gt;. &quot;The Browser Company stops active development of Arc in favor of new AI-focused product&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Macのユーティリティ系ソフトウェアを開発・販売しているウクライナのベンダー &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">無為がループした一年で放置していたMac環境をリフレッシュしました。MacPawのGUIツールをCLIへ移行し、メニューバーをmacOS Tahoe標準機能で整理し、ArcからSafariへ乗り換えた記録です。</summary>
        </entry><entry xml:lang="en">
        <title>「AIを持つ企業」と「持たざる企業」── 地銀でさえ動き始めた今、経営者が問い直すべきこと</title>
        <published>2026-03-13T00:00:00+00:00</published>
        <updated>2026-03-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/ai-haves-nots/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/ai-haves-nots/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;ai-haves-nots&amp;#x2F;cover.webp?h=dd3118849d76b335f8b9&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
## 「AI持てる者」と「AI持たざる者」
&lt;p&gt;2026年2月、パランティア・テクノロジーズのCEOアレックス・カープはQ4決算説明会で、世界経済が「AI haves（持てる者）」と「AI have-nots（持たざる者）」に分断されつつあると語りました。同社の米国事業の売上は前年比93%増と急伸する一方、欧州・カナダでは伸びが鈍い。この地域差がそのままAI採用格差の現れだという主張です。&lt;&#x2F;p&gt;
&lt;p&gt;この分断は国だけでなく企業レベルでも起きています。同社の顧客の中でも、AIを本格導入した企業とパイロット段階にとどまる企業の差は急速に開いており、後者は「生き残りをかけて戦っている」とカープは言い切りました。&lt;&#x2F;p&gt;
&lt;p&gt;カープの論理には自社に都合のよい解釈も含まれており、Fortuneの記事自体も欧州・カナダの慎重な姿勢には規制やプライバシー上の正当な理由があると指摘しています。それを差し引いても、彼の発言が示している方向性は無視できません。AIを本気で組織に組み込んだ企業と、その他の企業との差は、前者の改善と成長が繰り返されることで一方的に開いていきます。これが「修復不可能な格差」の実体です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;地銀でさえ動き始めた&quot;&gt;地銀でさえ動き始めた&lt;&#x2F;h2&gt;
&lt;p&gt;「これは米国の大企業の話だ」と思われるなら、足元を見てください。&lt;&#x2F;p&gt;
&lt;p&gt;日本経済新聞は2026年3月12日、千葉銀行が2028年度までに2,000人分の業務をAIが担う体制を整えると報じました。約4,000人の行員は削減せず、AIを「同僚」として位置づけ、事務・営業・人材育成など多領域で人を補佐させる計画です。年間400万時間分の業務をAIが担う体制を目指すといいます。&lt;&#x2F;p&gt;
&lt;p&gt;千葉銀行は既にAIシステム企業エッジテクノロジーを完全子会社化（2024年TOB、約90億円）し、AIネイティブな企業グループへの転換を中期経営計画の中核に据えています。「One to Oneマーケティング」の実現に向け、AIが次の提案を示唆する仕組みを本格稼働させつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、千葉銀行の取り組みが「便利なツールの導入」ではないという点です。AIを組織に「採用」し、業務の意思決定プロセスそのものを変える方向に踏み込んでいます。地方銀行という、日本の中でも保守的とされる業界でこれが起きています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;生成AI導入が従来のIT投資と何が違うのか&quot;&gt;生成AI導入が従来のIT投資と何が違うのか&lt;&#x2F;h2&gt;
&lt;p&gt;多くの経営者は生成AIを「新しいシステムの導入」として捉えています。具体的にどう業務を改善したいかもないまま「既存システムに生成AIを組み込め」とIT部門に丸投げし、「なんちゃってAI」システム開発を始めてしまうケースがほとんどです。あるいは「わが社はIT部門も弱いからまずChatGPTを導入しよう」と、OA機器やMicrosoft Officeの導入と同じノリで汎用LLMを全社ライセンス契約する。それで「AI活用を推進」と悦にいる愚かな経営者も多く見受けられます。&lt;&#x2F;p&gt;
&lt;p&gt;これが根本的にズレている理由を3つ挙げます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;主体が変わる。&lt;&#x2F;strong&gt; 従来のIT導入はIT部門が主体でした。システムを作る・保守するのがIT部門の仕事で、業務部門はユーザーとして要件を出す側でした。生成AIは違います。業務の文脈・判断基準・暗黙知をAIへ渡せる形に整備するのは、IT部門にはできません。業務を知っている人間しかできない作業です。千葉銀行が「AIの成果はデータの質で決まるため、業務を熟知した行員がデータを扱うことが重要だと気づいた」と語っているのはこの本質を突いています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;成果物がシステムではない。&lt;&#x2F;strong&gt; 従来のIT投資の成果物は「システム」でした。予算を使い、システムができあがれば完了します。生成AIの導入における成果物は組織の意思決定プロセスの変容です。これは一度作って終わりではなく、使いながら継続的に改善されていきます。完成の概念が違います。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;競争優位の源泉が変わる。&lt;&#x2F;strong&gt; 汎用LLMをそのまま使う限り、競合も同じツールを使えます。自社の業務データ・顧客データ・判断基準がAIと結合されてはじめて、競合が真似できない資産になります。この結合が進めば進むほど、AIはより精度高く動き、より多くのデータが蓄積し、さらに改善していきます。これが「AIデータフライホイール」と呼ばれる自己強化ループで、パランティアが言う「修復不可能な格差」の実体はここにあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「AIを持つ」とはどういう状態か&quot;&gt;「AIを持つ」とはどういう状態か&lt;&#x2F;h2&gt;
&lt;p&gt;では「AIを持つ企業」とはどういう状態を指すのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;一言で言えば、AIが組織の判断の中枢に組み込まれ、自社固有の文脈で動いている状態です。&lt;&#x2F;p&gt;
&lt;p&gt;具体的には次の三条件が揃っていることを指します。まず、自社の業務文脈・ルール・データにAIがアクセスできること。次に、特定タスクの実行だけでなく、次に何をすべきかをAIが判断できること。そして、使うほどデータを蓄積して判断の精度を上げる自己強化ループが回っていること。&lt;&#x2F;p&gt;
&lt;p&gt;現代のエージェント型AIの文脈で言えば、エージェントが「社内のどこに何があるか」「どのルールに従うべきか」を理解した上で自律的に動ける状態、と言い換えることもできます。&lt;&#x2F;p&gt;
&lt;p&gt;逆に言えば、「汎用LLMを全社導入」はこの条件を1つも満たしていません。「業務システムに組み込む」という発想は従来型IT投資の焼き直しで、主体がIT部門のままですし、自己強化ループも生まれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;何から始めるか&quot;&gt;何から始めるか&lt;&#x2F;h2&gt;
&lt;p&gt;この記事は「ではどのシステムを選ぶか」という話には進みません。選定以前に問うべきことがあるからです。&lt;&#x2F;p&gt;
&lt;p&gt;まず、自社のどの判断プロセスをAIに委ねるかを経営レベルで議論することです。これはIT部門への指示ではなく、経営判断です。&lt;&#x2F;p&gt;
&lt;p&gt;次に、その判断に必要なデータが今どこにあり、どういう形で存在しているかを棚卸しすることです。多くの場合、AIより手前の問題（データが散在している、構造化されていない、誰もナレッジを文書化していない）が先に出てきます。それ自体が発見です。&lt;&#x2F;p&gt;
&lt;p&gt;ツールの選定は、この2つの後の話です。組織としてAIを受け入れる土壌づくりについては、以前の記事「&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;02&#x2F;ai-agent-org-adoption-prerequisites&#x2F;&quot;&gt;エージェント型AI組織導入の7つの前提条件 — ツールの前に土壌を整えよ&lt;&#x2F;a&gt;」で詳しく整理しています。&lt;&#x2F;p&gt;
&lt;p&gt;なお、供給側であるコンサルティング会社・SIerの変化については、以前の記事「&lt;a href=&quot;&#x2F;aws-proserve-innovation&quot;&gt;AIエージェントが&quot;同僚&quot;になる時代 ── AWS ProServe変革と日本のSIerへの示唆&lt;&#x2F;a&gt;」で論じています。発注企業側と供給企業側、両方が同時に変わろうとしています。&lt;&#x2F;p&gt;
&lt;p&gt;千葉銀行がやろうとしていることの意味を、もう一度考えてみてください。地方銀行が2,000人分の業務をAIに委ねると決めました。これはコスト削減の話ではなく、組織の知性の再設計です。これが実現すれば、競合地銀との差は「システムの差」ではなく「組織そのものの差」となります。その差が「修復不可能」となる前に動けるかどうか。それが今、経営者に問われていることです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fortune.com&#x2F;&quot;&gt;Fortune&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fortune.com&#x2F;2026&#x2F;02&#x2F;04&#x2F;palantir-ceo-alex-karp-europe-canada-falling-behind-ai-adoption-haves-have-nots&#x2F;&quot;&gt;Palantir CEO Alex Karp says Trump has a point about the AI race: &#x27;There&#x27;s a real hesitance to adopt these kind of products in the West&#x27;&lt;&#x2F;a&gt;&quot; (Feb 4, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;日本経済新聞. 「千葉銀行、AIが2000人の業務代替へ 営業・人材育成など多領域」（2026年3月12日）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chibabank.co.jp&#x2F;&quot;&gt;千葉銀行&lt;&#x2F;a&gt;. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chibabank.co.jp&#x2F;news&#x2F;news20240906_02_001&quot;&gt;株式会社千葉銀行によるエッジテクノロジー株式会社の株式等に対する公開買付けの開始に関するお知らせ（概要版）&lt;&#x2F;a&gt;」（2024年9月6日）&lt;&#x2F;li&gt;
&lt;li&gt;日本経済新聞. 「千葉銀行、AIシステムのエッジテクノロジーをTOB」（2024年9月6日）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">パランティアのQ4決算が示したAI格差の固定化。千葉銀行を筆頭に日本でも本格導入が始まった今、多くの経営者が陥りがちな「従来型IT導入」の発想では取り返しのつかない差がつく理由を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>Uncle Albert&#x2F;Admiral Halsey</title>
        <published>2026-03-12T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/uncle-albert-admiral-halsey/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/uncle-albert-admiral-halsey/</id>
        
            <content type="html">&lt;p&gt;Paul McCartneyの「Uncle Albert&#x2F;Admiral Halsey」を演奏してみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2282198558&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;uncle-albert-admiral-halsey&quot; title=&quot;Uncle Albert&#x2F;Admiral Halsey - Medley&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Uncle Albert&#x2F;Admiral Halsey - Medley&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;この曲は1971年のアルバム「Ram」に収録された、Paul &amp;amp; Linda McCartney名義の楽曲です。ビートルズ解散後のポールにとって、ソロとしての初の全米No.1シングルとなりました。グラミー賞のBest Arrangement Accompanying Vocalist(s)も受賞しています。&lt;&#x2F;p&gt;
&lt;p&gt;複数のセクションを目まぐるしく展開するメドレー形式が特徴的です。穏やかなアコースティックパートから、ブラスセクションが入るポップなパート、そして「Hands across the water」のリフレインへと移り変わっていきます。ポールらしいメロディセンスと実験精神が凝縮された一曲です。&lt;&#x2F;p&gt;
&lt;p&gt;今回の使用機材は、アコースティックギターにEpiphone Texan、エレキギターにAria Pro II PE-1500RIとEpiphone Casinoです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Paul McCartneyの名曲「Uncle Albert&#x2F;Admiral Halsey」を演奏しました。
ポスト・ビートルズ時代の最初の全米No.1シングルをカバーしています。
</summary>
        </entry><entry xml:lang="en">
        <title>Wild Honey Pie</title>
        <published>2026-03-11T18:18:11+09:00</published>
        <updated>2026-03-11T18:18:11+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/wild-honey-pie/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/wild-honey-pie/</id>
        
            <content type="html">&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;wild-honey-pie&amp;#x2F;cover.webp?h=47638652aa6656f5f936&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;p&gt;The Beatlesの俗称ホワイトアルバムから小曲&quot;Wild Honey Pie&quot;を演奏してみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2281695545&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;wild-honey-pie&quot; title=&quot;Wild Honey Pie&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Wild Honey Pie&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;ポールが一人で録音したお遊び的な曲です。最終的なトラックリストから外れかけましたが、パティ・ボイド&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;が気に入ったため収録されました。&lt;&#x2F;p&gt;
&lt;p&gt;あの妙なアコースティックギターの音はスライドでも使ってるのかと思っていましたが、やってみるとADT&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;でした。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;パティ・ボイド（Pattie Boyd）はジョージ・ハリスンの最初の妻で、モデル・写真家。「Something」や「Layla」など数々の名曲のインスピレーションとなった人物です。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;ADT（Automatic Double Tracking）はアビーロードスタジオのエンジニア、ケン・タウンゼントが1966年に発明したテープエフェクトです。録音済みのトラックをわずかに遅延させて重ねることで、手動のダブルトラッキングを自動化しました。Revolver以降のビートルズ作品で多用されています。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">ホワイトアルバムの小曲ですが、弾いてみました。
</summary>
        </entry><entry xml:lang="en">
        <title>Zennの生成AIコンテンツガイドラインに思うこと</title>
        <published>2026-03-11T00:00:00+00:00</published>
        <updated>2026-03-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/zenn-ai-guideline/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/zenn-ai-guideline/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;zenn-ai-guideline&amp;#x2F;cover.webp?h=61a86250aa9c24c2055e&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;2026年3月10日、Zennが「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;info.zenn.dev&#x2F;2026-03-10-ai-contents-guideline&quot;&gt;コンテンツの執筆における生成AIの利用について&lt;&#x2F;a&gt;」と題したガイドラインを発表しました。生成AIによるコンテンツ乱造への対応として、プラットフォームがどのようなスタンスを取るのかを示した文書です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ガイドラインの概要&quot;&gt;ガイドラインの概要&lt;&#x2F;h2&gt;
&lt;p&gt;このガイドラインの主要なポイントは次の通りです。&lt;&#x2F;p&gt;
&lt;p&gt;Zennは「人が主体となって情報を発信する場」であることを重視しています。AIの利用自体は禁止せず、「人が主体となる」ことの定義として「著者による公開前の内容検証」と「著者自身の経験や洞察をコンテンツに込める」の2つを挙げています。&lt;&#x2F;p&gt;
&lt;p&gt;具体的な対策として、以下が示されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;禁止事項&lt;&#x2F;strong&gt;: 機械により自動生成された文章の投稿や同一内容の繰り返し投稿。違反時はアカウント凍結を含む措置&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;投稿制限&lt;&#x2F;strong&gt;: ユーザーごとに期間あたりの投稿上限数を設定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;実際の投稿制限は次の通りです。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;faq&#x2F;rate-limit&quot;&gt;
記事は直近24時間以内の投稿数（投稿予約中を含む）、本は直近1週間以内の投稿数に基づいて判定されます。上限に達した場合でも、一定時間が経過すれば再び投稿できるようになります。
  &lt;footer&gt;
&lt;cite&gt;Zenn Q&amp;A「&lt;a href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;faq&#x2F;rate-limit&quot;&gt;投稿数の上限とは？&lt;&#x2F;a&gt;」より引用&lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;制限の評価&quot;&gt;制限の評価&lt;&#x2F;h2&gt;
&lt;p&gt;AI利用を全面禁止しなかったのは現実的な判断です。生成AIは今やエンジニアの執筆支援ツールとして広く使われており、一律禁止は実効性がないだけでなく、正当な利用まで萎縮させてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;「公開前に内容を検証する」「著者自身の経験や洞察を込める」という2つの基準は具体的で、ユーザーにとって判断しやすい定義です。スクラップを「学習ログ用の緩い枠」として検討しているとも述べられており、AIの出力を整理して残したいという正当なユースケースへの配慮が感じられます。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、最も気になるのは、実際の対策が「投稿頻度の制限」に集約されている点です。これは結局、コンテンツの質ではなく更新サイクルでスパムかどうかを判断していることになります。&lt;&#x2F;p&gt;
&lt;p&gt;大量自動投稿botが実際にどの程度存在するかは把握していませんが、その対策としては確かに実効的です。
おそらく人が読めば判別できるようにも思いますが、内容でフィルターを掛けてしまうと「言論の自由」などという複雑な問題に入り込んでしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;この制限は、&lt;strong&gt;生成AIを活用するからこそ生産性が上がる&lt;&#x2F;strong&gt;という事実が見落とされています。
生成AIを業務へ取り入れているエンジニアは、調査能力が拡がり、知識の整理が速くなり、結果として記事を書くスピードが上がります。私自身、1日1記事のペースで投稿していますが、それは生成AIの支援で調査と執筆の効率が上がったからです。ガイドラインでは「上限は複数の指標に基づいて決定される（一律ではない）」とされています。しかし量による制限であることに変わりはなく、生産性の高いエンジニアにもブレーキをかけてしまう可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;少数でも中身の薄いAI生成記事を投稿するケースには、この制限は機能しにくいでしょう。上限の具体的な数値は非公開のため断言はできませんが、量を絞っても質の問題は残ります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;エンジニアのプラットフォームとして&quot;&gt;エンジニアのプラットフォームとして&lt;&#x2F;h2&gt;
&lt;p&gt;Zennは「エンジニアの実体験に基づく知見が集まる場」として信頼を築いてきました。そのブランドを守りたいという意図は理解できますし、プラットフォームとしてのポリシーを定める権利は当然あります。&lt;&#x2F;p&gt;
&lt;p&gt;世界に目を向ければ、AIエージェントを「デジタル従業員」としてプロジェクトに組み込む動きが加速しています。&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;03&#x2F;aws-proserve-innovation&#x2F;&quot;&gt;AWS ProServeの変革&lt;&#x2F;a&gt;やMcKinseyの25,000エージェント体制など、AIを人間と対等な「チームメンバー」として扱う方向へ明確にシフトしています。&lt;&#x2F;p&gt;
&lt;p&gt;Zennの運営元であるクラスメソッドは、AWSプレミアパートナーとして日本市場でAWSコンサルティングを提供しており、ProServeとは一部領域で競合する関係にあります。そのProServeはAIエージェントを人間の要員と同列に組み込んでいる一方、自社プラットフォームではAIの関与を投稿頻度の制限という形で抑制しています。AIを対等なチームメンバーとして扱う立場と、AIの関与を公正さを損なうものとして制約する立場——同じ市場で相対する組織でありながら、この対照的な姿勢は興味深いところです。&lt;&#x2F;p&gt;
&lt;p&gt;生成AIのフロンティアで活躍するエンジニアが集まるプラットフォームにおいて、投稿頻度の制限は保守的すぎないでしょうか。生成AIを積極的に活用しているエンジニアほど投稿頻度が高くなりがちです。その活動を制限する施策は、プラットフォームの方向性と矛盾しているように見えます。&lt;&#x2F;p&gt;
&lt;p&gt;もう1つ、Zennの運営姿勢として気になる点があります。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zenn-dev&#x2F;zenn-community&#x2F;issues&#x2F;78&quot;&gt;canonical URLの設定機能&lt;&#x2F;a&gt;が2020年9月から要望されているにもかかわらず、5年以上経った今も実装されていません。自分のドメインでブログを運営しているエンジニアが、より広い読者層にリーチするためZennでも記事を共有したいところです。その際、SEO上の重複コンテンツ問題を避けるためにcanonical URLを設定したい。これはdev.toなど他のプラットフォームでは当たり前に提供されている機能です。&lt;&#x2F;p&gt;
&lt;p&gt;運営側がネガティブSEO（悪質なサイトへのcanonical指定によるドメイン評価の毀損）を懸念していることは、Issue内のコメントから読み取れます。技術的に簡単でない問題だと理解できます。しかし5年以上の間に、レピュテーションの高いユーザー限定で開放するなど、段階的なアプローチを検討する余地があったのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;「人が主体となって情報を発信する」ことを掲げるならば、エンジニアが自身のドメインで発信した記事をZennでも共有できる仕組みこそ、その理念に合致するはずです。投稿頻度を制限する前に、こうした長年未対応の基本的な要望に応えてほしいと感じます。&lt;&#x2F;p&gt;
&lt;p&gt;また、2026年1月には&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;akari1106&#x2F;articles&#x2F;993e42b4430f36&quot;&gt;自動翻訳機能&lt;&#x2F;a&gt;がデフォルトONで事前説明なしにリリースされ、「自分のコンテンツが勝手に翻訳される」ことへの反発を受けて数時間でデフォルトOFFに撤回されるという一幕もありました。対応の速さは評価できますが、エンジニアの声を聞く前に動き、反発を受けて撤回するというパターンが繰り返されている印象を受けます。&lt;&#x2F;p&gt;
&lt;p&gt;もちろん、コンテンツの質を自動判定するのは技術的に難しい課題です。レピュテーション制度やレビュープロセスの導入は、投稿頻度の制限に比べて実装コストが高いことも理解しています。しかし、だからといって量の制限だけで代替し続けるのは、問題の本質に届いていません。コミュニティのリアクション（いいねやブックマーク）の活用など、既存の仕組みを生かした段階的な取り組みから始めることはできるはずです。方向性として、質に踏み込む施策の検討を期待したいところです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Zennのガイドラインは、生成AI時代のコンテンツプラットフォームが直面する課題への第一歩としては妥当です。AI利用を禁止しない姿勢と、「人が主体」という原則は支持できます。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、投稿頻度の制限だけでは、botは防げても、生成AIを道具として使いこなすエンジニアの活動まで制限してしまう可能性があります。canonical URLへの長年の未対応、自動翻訳機能の拙速なリリースと撤回。こうした運営判断の積み重ねを見ると、「エンジニアの発信を支えるプラットフォーム」として今後どのような方向に進むのか、期待と現実のギャップを感じます。&lt;&#x2F;p&gt;
&lt;p&gt;私自身は、今後Zennへのフル記事の投稿は行わないことにしました。自分の発信は自分のドメインで行い、Zennにはスクラップや要約の共有にとどめるつもりです。canonical URLが使えない以上、同じ記事を2箇所に全文掲載する意味はありません。&lt;&#x2F;p&gt;
&lt;p&gt;技術ブログプラットフォームにおいて、エンジニアが自分のコンテンツに対する裁量——何を、いつ、どれだけ公開するか——を持てることは決定的に重要です。今回の投稿頻度制限は、まさにその「いつ、どれだけ公開するか」という裁量をプラットフォーム側が制約するものです。2020年、Qiitaがエンジニアの閲覧履歴を無断で公開し、求人サービスへ個人情報を事前告知なく提供していた問題が発覚しました。自分の情報がどこまで公開されるかという裁量を奪われたエンジニアの多くがプラットフォームへの信頼を失い、Zennへ移行しました。問題の性質や深刻さは異なりますが、エンジニアの裁量を制限する運営方針がプラットフォームへの信頼に影響しうることを、この事例は示しています。&lt;&#x2F;p&gt;
&lt;p&gt;エンジニアは最終的に、自分のコンテンツを自ら管理できる場所で発信することを選びます。それが「人が主体となって情報を発信する」ということだと、私は考えています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;info.zenn.dev&#x2F;2026-03-10-ai-contents-guideline&quot;&gt;Zenn&lt;&#x2F;a&gt;. 「コンテンツの執筆における生成AIの利用について」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zenn-dev&#x2F;zenn-community&#x2F;issues&#x2F;78&quot;&gt;zenn-dev&#x2F;zenn-community&lt;&#x2F;a&gt;. &quot;記事に canonical_url を設定できるように · Issue #78&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;akari1106&#x2F;articles&#x2F;993e42b4430f36&quot;&gt;Zenn&lt;&#x2F;a&gt;. 「Zennの自動翻訳機能から学ぶプロダクト開発の難しさ」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Zennが発表した生成AIコンテンツガイドラインは、
AI利用を禁止せず「人が主体」という原則を掲げました。
その方針を評価しつつ、投稿頻度による制限という手法が
生成AIを活用するエンジニアにとって何を意味するのかを考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>DJI Avata 360、ついに正式アナウンス</title>
        <published>2026-03-11T05:14:46+09:00</published>
        <updated>2026-03-11T05:14:46+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/dj-avata-360-release/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/dj-avata-360-release/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;dj-avata-360-release&amp;#x2F;cover.webp?h=3c7ce6d56b4770d78c8e&quot;
  alt=&quot;Cover&quot; width=&quot;1573&quot; height=&quot;635&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;ついに&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.dji.com&quot;&gt;DJI公式ストア&lt;&#x2F;a&gt;で、DJI Avata 360のリリース日が2026年3月26日21:00であると発表されました。&lt;&#x2F;p&gt;
&lt;p&gt;ティザーサイトも用意されています。今のところ公式サイトでは「フラッグシップ8K 360°ドローン」「空から見渡す、世界のすべて」という表現から、Antigravity A1のような8K360度の全景ドローンであることがわかります。&lt;&#x2F;p&gt;
&lt;p&gt;以前からリーク情報をまとめてきましたが、いよいよ正式発表です。続報を楽しみに待ちたいと思います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;03&#x2F;dji-avata-360&#x2F;&quot;&gt;DJI Avata 360、今月発売か&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;03&#x2F;dji-avata-360-teaser&#x2F;&quot;&gt;DJI公式がAvata 360のティザー映像を公開&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">DJI公式ストアでAvata 360のリリース日が2026年3月26日と発表されました。「フラッグシップ 8K 360°ドローン」として正式にアナウンスされています。
</summary>
        </entry><entry xml:lang="en">
        <title>埋伏智歯を抜いてきた</title>
        <published>2026-03-09T00:00:00+00:00</published>
        <updated>2026-03-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/impacted-wisdom-tooth/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/impacted-wisdom-tooth/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;impacted-wisdom-tooth&amp;#x2F;cover.webp?h=acf8bd7d7dcae4a619da&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;埋伏智歯でも抜いたほうがよい&quot;&gt;埋伏智歯でも抜いたほうがよい&lt;&#x2F;h2&gt;
&lt;p&gt;「智歯（ちし）、抜きましょうね」とかかりつけの歯科に、昨年末奨められました。
智歯（ちし）とは親知らずのことです。&lt;&#x2F;p&gt;
&lt;p&gt;右下の親知らずが完全に歯茎の中に埋まっていることは、以前から歯科のレントゲンでわかっていました。
痛みもないし日常生活に支障はないので、正直このままでいいのではないかと思っていました。
それでもかかりつけの歯科医から「嚢胞のできる可能性がある」と説明を受けて、大きな病院の口腔外科への紹介状を書いてもらいました。&lt;&#x2F;p&gt;
&lt;p&gt;嚢胞というのは、埋まったままの歯の周囲に袋状の病変ができるもので、放置すると顎の骨を溶かしていくことがあるそうです。今は何も症状がなくても、将来トラブルの火種になりやすいのだそうです。歯科医の言葉を借りれば、そういうことでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;大学時代のトラウマ&quot;&gt;大学時代のトラウマ&lt;&#x2F;h2&gt;
&lt;p&gt;実は親知らずの抜歯はこれが初めてではありません。大学生の頃、左下の埋伏した親知らずが隣の奥歯の神経を圧迫して痛みが出ました。&lt;&#x2F;p&gt;
&lt;p&gt;まず近所の町の歯医者に行ったのですが、レーザーで歯茎を切開して2時間ほど格闘した挙げ句、「今日は抜けません。お帰りください」と言われました。あの徒労感は忘れられません。呆れて別の大学病院に駆け込み、切開の傷が治るまでひと月待ってから、ようやく抜歯に臨みました。&lt;&#x2F;p&gt;
&lt;p&gt;大学病院の口腔外科は30人から50人は同時に治療できそうな広大な治療室でした。局所麻酔を打たれ、いざ抜歯が始まると、埋伏している親知らずが大きくてそのままでは抜けません。先生がノミとトンカチを持ち出して、顎にガンガンと衝撃を与えながら歯を割り始めました。振動が頭蓋骨に響くなか、意識が遠のいて気絶しました。&lt;&#x2F;p&gt;
&lt;p&gt;気がつくと処置は終わっていて、広い治療室にひとり寝ていました。窓から夕陽が差し込んでいたのを覚えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;20年越しの再戦&quot;&gt;20年越しの再戦&lt;&#x2F;h2&gt;
&lt;p&gt;あの体験があるので、今回の抜歯は正直恐怖でした。口腔外科の診察椅子に座った瞬間、大学時代の記憶が鮮明によみがえります。&lt;&#x2F;p&gt;
&lt;p&gt;局所麻酔が効いてから処置が始まりました。今回もやはり完全埋伏なので、歯茎を切開し歯を分割しながら抜いていくという手順だったのでしょう。ドリルで削る振動がずっと続いて、いつ終わるのかと思うくらい長く感じました。途中歯を削っているマシンの刃が折れたようですが、今回はノミやトンカチは出てこなかったので気絶せずに無事終えることが出来ました。&lt;&#x2F;p&gt;
&lt;p&gt;抜いた後は麻酔が効いているので意外に平気でしたが、そろそろ2時間ほど経過しているので麻酔が切れてズンズンと痛み出しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;親知らずの豆知識&quot;&gt;親知らずの豆知識&lt;&#x2F;h2&gt;
&lt;p&gt;せっかくなので、親知らずについて少し調べてみました。&lt;&#x2F;p&gt;
&lt;p&gt;親知らずの正式名称は第三大臼歯です。智歯とも呼ばれ、英語ではwisdom toothといいます。知恵がつく年頃（17歳から25歳頃）に生えてくることからこの名前がついたそうです。日本語の「親知らず」の由来には諸説ありますが、昔は寿命が短く、この歯が生える頃には親が亡くなっていることが多かったからという説が有力です。&lt;&#x2F;p&gt;
&lt;p&gt;最近の若い世代では親知らずが先天的に欠如している人が増えているそうです。ある研究によれば、現代人の約20%から25%は親知らずが1本以上生えてこないとされています。人類の顎が小さくなる進化の過程で、第三大臼歯が不要になりつつあるという説が有力です。数万年後には、親知らずという概念自体がなくなっているかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;埋伏智歯が問題を起こすのは、現代人の顎が小さくなったのに歯の本数が減りきっていない、進化の過渡期にいるからだともいえます。今日の私の苦労も、進化のタイムラグのせいだと思えば少しは気が楽です。&lt;&#x2F;p&gt;
&lt;p&gt;少しだけ。&lt;&#x2F;p&gt;
</content>
        <summary type="html">完全埋伏していた右下の親知らずを口腔外科で抜歯しました。大学時代にノミとトンカチで左下の親知らずを砕かれて気絶したトラウマを抱えながらの抜歯体験でした。</summary>
        </entry><entry xml:lang="en">
        <title>CLAUDE.mdを太らせない — リポジトリ設計で実現するClaude Codeのガードレールと再現性</title>
        <published>2026-03-08T07:04:00+09:00</published>
        <updated>2026-03-08T07:04:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/claude-code-repo-architecture/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/claude-code-repo-architecture/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;claude-code-repo-architecture&amp;#x2F;cover.webp?h=4d465f543f1815d72ad1&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;CLAUDE.mdが肥大化していませんか&quot;&gt;CLAUDE.mdが肥大化していませんか&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeを使い込むほど、CLAUDE.mdは育っていきます。ショートコードの構文リファレンス、コミットの手順、画像生成のコマンド、レビューのチェックリスト。気がつけば400行を超え、重要なルールが大量の参考情報に埋もれている――そんな状態になっていないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;CLAUDE.mdはセッション開始時に毎回読み込まれるコンテキストです。ここに情報を詰め込みすぎると、本当に守ってほしいルールの優先度が下がります。かといって削りすぎれば、Claudeは暗黙知を推測で補おうとして事故を起こします。&lt;&#x2F;p&gt;
&lt;p&gt;このブログ（Zola静的サイト）の運用で、CLAUDE.mdを458行から117行へ削減しながら、むしろルール遵守の精度と作業の再現性を向上させた設計パターンを紹介します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4層アーキテクチャという考え方&quot;&gt;4層アーキテクチャという考え方&lt;&#x2F;h2&gt;
&lt;p&gt;この整理は、Shraddha Bharuka氏が提唱する「The Anatomy of a Claude Code Project」の考え方をベースにしています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Most people treat CLAUDE.md like a prompt file.&lt;br&gt;&lt;br&gt;That&#x27;s the mistake.&lt;br&gt;&lt;br&gt;If you want Claude Code to feel like a senior engineer living inside your repo, your project needs structure.&lt;br&gt;&lt;br&gt;Claude needs 4 things at all times:&lt;br&gt;&lt;br&gt;• the why → what the system does&lt;br&gt;• the map → where things… &lt;a href=&quot;https:&#x2F;&#x2F;t.co&#x2F;wumSCnNxHF&quot;&gt;pic.twitter.com&#x2F;wumSCnNxHF&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;&amp;mdash; Shraddha Bharuka (@BharukaShraddha) &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;BharukaShraddha&#x2F;status&#x2F;2029836408232497678?ref_src=twsrc%5Etfw&quot;&gt;March 6, 2026&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt; &lt;script async src=&quot;https:&#x2F;&#x2F;platform.twitter.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;氏の整理ではRepo Memory &#x2F; Reusable Expert Modes &#x2F; Guardrails &#x2F; Progressive Contextという4層が示されています。本記事ではClaude CodeのAuto Memory機能との混同を避けるため、一部の用語を変更しています。&lt;&#x2F;p&gt;
&lt;p&gt;リポジトリに散らばるClaude Code関連のファイルを、責務で4つの層に分離します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;層&lt;&#x2F;th&gt;&lt;th&gt;場所&lt;&#x2F;th&gt;&lt;th&gt;役割&lt;&#x2F;th&gt;&lt;th&gt;読み込みタイミング&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Project Instructions&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;.&#x2F;CLAUDE.md&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;WHY・WHAT・HOW の要約&lt;&#x2F;td&gt;&lt;td&gt;毎セッション（常時）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Workflows&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;.&#x2F;.claude&#x2F;commands&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;再利用可能なワークフロー&lt;&#x2F;td&gt;&lt;td&gt;コマンド呼び出し時&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Guardrails&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;.&#x2F;.claude&#x2F;settings.json&lt;&#x2F;code&gt; (Hooks)&lt;&#x2F;td&gt;&lt;td&gt;機械的な禁止ルール&lt;&#x2F;td&gt;&lt;td&gt;ツール実行の前後&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Progressive Context&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;.&#x2F;docs&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;詳細リファレンス&lt;&#x2F;td&gt;&lt;td&gt;必要に応じて&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;それぞれの層には明確な設計原則があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;CLAUDE.md_—_Project_Instructions&quot;&gt;CLAUDE.md — Project Instructions&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeにはもうひとつ、Auto Memoryという記憶の仕組みがあります。これはClaude自身がセッション中に学んだこと――ビルドコマンドの癖、デバッグで得た知見、ユーザーの好み――を &lt;code&gt;~&#x2F;.claude&#x2F;projects&#x2F;&amp;lt;project&amp;gt;&#x2F;memory&#x2F;&lt;&#x2F;code&gt; に自動で書き残す機能です。CLAUDE.mdが「ユーザーからClaudeへの指示」であるのに対し、Auto Memoryは「Claudeが自分で蓄積する学習ノート」です。両者はセッション開始時に読み込まれますが、役割が異なります。この記事で扱う4層アーキテクチャは、ユーザーが意図的に設計する情報配置のパターンです。Auto Memoryはその外側で自動的に機能する補完的な仕組みとして捉えてください。&lt;&#x2F;p&gt;
&lt;p&gt;CLAUDE.mdには3つの情報だけを書きます。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;目的（WHY）&lt;&#x2F;dt&gt;
&lt;dd&gt;このリポジトリが何であるか。Zolaブログであること、tabi テーマを使っていること。新しいセッションのClaudeがプロジェクトを理解するための最小限の情報です。&lt;&#x2F;dd&gt;
&lt;dt&gt;マップ（WHAT）&lt;&#x2F;dt&gt;
&lt;dd&gt;記事のfrontmatterフォーマット、タグの命名規則への参照、ショートコードドキュメントへの参照。詳細はdocsに委ね、CLAUDE.mdには「どこを見ればよいか」だけを書きます。&lt;&#x2F;dd&gt;
&lt;dt&gt;ルール（HOW）&lt;&#x2F;dt&gt;
&lt;dd&gt;文体はですます調、descriptionは句点で終える、textlint-disableの使い方。Claudeが記事を書くときに常に意識すべき制約です。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;実際のCLAUDE.mdから、ショートコードのセクションを例に挙げます。以前は13個のショートコードそれぞれに構文、パラメータ一覧、使用例を書いていました。250行です。整理後は「ショートコードはtextlint-disableで囲む」というルールと、詳細ドキュメントへの参照だけになりました。個別の構文はClaude自身が必要なときに &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; 配下のショートコード定義書を読みに行けばよいのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Commands_—_Workflows&quot;&gt;Commands — Workflows&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;.claude&#x2F;commands&#x2F;&lt;&#x2F;code&gt; に配置したMarkdownファイルは、&lt;code&gt;&#x2F;コマンド名&lt;&#x2F;code&gt; で呼び出せるワークフロー定義です。セッションをまたいでも同じ手順が実行されるため、作業品質の一貫性が生まれます。&lt;&#x2F;p&gt;
&lt;p&gt;このブログでは6つのコマンドを定義しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;コマンド&lt;&#x2F;th&gt;&lt;th&gt;用途&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;article-review&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;記事の品質レビュー（frontmatter、文体、アセット確認）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;article-publish&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;記事の公開（レビュー → OGP再生成 → ビルド検証 → コミット → push）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;article-cover&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;カバー画像生成（記事内容からDALL-E 3でcover.webpを生成）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;blog-review&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ブログ設定のコードレビュー&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;blog-refactor&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;設定リファクタリングの手順ガイド&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;blog-release&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ブランチ運用のリリースフロー（CHANGELOG → PR → マージ → タグ）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;記事系（article-）とブログ基盤系（blog-）で命名体系を分けています。これは運用フローが根本的に異なるためです。記事はmainに直接push、ブログ設定はブランチを切ってPR経由でマージします。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;&#x2F;article-publish&lt;&#x2F;code&gt; の定義から、要点を抜粋して見てみましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot; data-name=&quot;.claude&#x2F;commands&#x2F;article-publish.md&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Publish an article. Run review, regenerate OGP,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  verify build, commit, and push to main automatically.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\31  z-markdown&quot;&gt;# Article Publish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Execute the full publish workflow automatically.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Prerequisite: the user has already confirmed the article&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;via &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`zola serve`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; preview.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\32  z-markdown&quot;&gt;## Steps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Execute in order. Stop and report if any step fails.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 1. Run &#x2F;article-review&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Execute the full article quality review.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;If issues are found, stop and fix them before continuing.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 2. Regenerate OGP Image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Delete the existing OGP image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Run &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`npm run ogp`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; to regenerate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 3. zola check&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Run &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`zola check`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; to verify no broken links or build errors.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 4. Stage &amp;amp; Commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt; `git add .`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; to stage all changes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Use &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`&#x2F;simple-commit:commit`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; skill to create the commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### 5. Push&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Run &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`git push origin main`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; to publish.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコマンドが実行する手順は、以前はCLAUDE.mdに散在するルールの組み合わせで「わかっているはず」と暗黙に期待していたものです。コマンドとして明示することで、どのセッションでも同じ品質で公開作業が完了します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Hooks_—_Guardrails&quot;&gt;Hooks — Guardrails&lt;&#x2F;h2&gt;
&lt;p&gt;Hooksは &lt;code&gt;.claude&#x2F;settings.json&lt;&#x2F;code&gt; に定義する、ツール実行の前後に自動で走るチェックです。CLAUDE.mdに「〜するな」と書いても、Claudeは忘れることがあります。Hooksは忘れません。&lt;&#x2F;p&gt;
&lt;p&gt;このブログで設定しているガードレールです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;タイミング&lt;&#x2F;th&gt;&lt;th&gt;対象&lt;&#x2F;th&gt;&lt;th&gt;動作&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;PreToolUse&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;git commit&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ブロック。&lt;code&gt;&#x2F;simple-commit:commit&lt;&#x2F;code&gt; の使用を強制&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PreToolUse&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;git add &amp;lt;個別ファイル&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ブロック。&lt;code&gt;git add .&lt;&#x2F;code&gt; のみ許可&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PreToolUse&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;themes&#x2F;&lt;&#x2F;code&gt; への Write&#x2F;Edit&lt;&#x2F;td&gt;&lt;td&gt;ブロック。サブモジュール保護&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PostToolUse&lt;&#x2F;td&gt;&lt;td&gt;content&#x2F;*.md への Write&#x2F;Edit&lt;&#x2F;td&gt;&lt;td&gt;Markdown画像記法 &lt;code&gt;![]()&lt;&#x2F;code&gt; を検出し、imageショートコード使用を指示&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;code&gt;git commit&lt;&#x2F;code&gt; のブロックを例に、実装を見てみましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot; data-name=&quot;.claude&#x2F;settings.json（抜粋）&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;PreToolUse&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;matcher&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Bash&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;jq -r &amp;#39;.tool_input.command&amp;#39; | grep -qE &amp;#39;^git commit&amp;#39; &amp;amp;&amp;amp; echo &amp;#39;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;decision&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;block&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;reason&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;git commit 直接実行は禁止です。&#x2F;simple-commit:commit スキルを使ってください&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;}&amp;#39; || true&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hooksの設計方針は「禁止ルールはHooksに、正のガイダンスはCLAUDE.mdに」です。「〜するな」はHooksで機械的にブロックし、「〜の代わりにこうする」はCLAUDE.mdやCommandsで伝えます。&lt;&#x2F;p&gt;
&lt;p&gt;この分離によってCLAUDE.mdから禁止文を削除できました。前向きなガイダンスだけが残り、読みやすいドキュメントになっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;docs&#x2F;_—_Progressive_Context&quot;&gt;docs&#x2F; — Progressive Context&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; にはCLAUDE.mdに収まらない詳細情報を配置します。Claudeは必要に応じてこれらのファイルを読みに行きます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ファイル&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs&#x2F;tabi-shortcodes.md&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;ショートコード構文リファレンス&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs&#x2F;tag-rule.md&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;タグ命名規則&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs&#x2F;TODO.md&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;作業計画・意思決定の記録&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs&#x2F;architectural-decision.md&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;アーキテクチャ判断の記録&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;この層の設計原則は「CLAUDE.mdに場所を教え、詳細はdocsに置く」です。CLAUDE.mdのショートコードセクションには &lt;code&gt;See docs&#x2F;tabi-shortcodes.md&lt;&#x2F;code&gt; と一行書くだけで、Claudeはショートコードを使うときにそのファイルを読みに行きます。&lt;&#x2F;p&gt;
&lt;p&gt;毎セッションで250行のショートコードリファレンスをコンテキストに読み込む必要はありません。必要なときに必要な分だけ読む。これがProgressive Contextの考え方です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;責務分離の判断基準&quot;&gt;責務分離の判断基準&lt;&#x2F;h2&gt;
&lt;p&gt;新しいルールや手順を追加するとき、どの層に置くかの判断基準をまとめます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;&#x2F;th&gt;&lt;th&gt;配置先&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;毎セッションで必ず意識すべきルール&lt;&#x2F;td&gt;&lt;td&gt;CLAUDE.md&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;複数ステップのワークフロー&lt;&#x2F;td&gt;&lt;td&gt;Commands&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;「〜するな」という禁止ルール&lt;&#x2F;td&gt;&lt;td&gt;Hooks&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;必要なときだけ参照する詳細情報&lt;&#x2F;td&gt;&lt;td&gt;docs&#x2F;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;迷ったときは「これをCLAUDE.mdから消したら、Claudeは間違えるか？」と自問してみてください。答えがNoなら、それはCLAUDE.mdに置くべき情報ではありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;CLAUDE.mdへ全部書く運用から、4層に分離する運用へ変えた結果を振り返ります。&lt;&#x2F;p&gt;
&lt;p&gt;CLAUDE.mdは458行から117行になりました。削減した341行が消えたのではなく、適切な層へ移動しただけです。ショートコードのリファレンスは&lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt;へ、公開フローはCommandsへ、禁止ルールはHooksへ。それぞれの情報が、もっとも効果的に機能する場所へ収まりました。&lt;&#x2F;p&gt;
&lt;p&gt;コンテキストが長いほど個々のルールへの注意が分散し、遵守率が下がります。CLAUDE.mdが短ければ、書いたルールが確実に守られます。ワークフローがCommandsに定義されていれば、セッション間で品質がブレません。Hooksが禁止ルールを機械的に強制すれば、「AIが忘れる」問題は起きません。&lt;&#x2F;p&gt;
&lt;p&gt;この4層アーキテクチャは、ブログに限らずあらゆるClaude Codeプロジェクトへ適用できるパターンです。CLAUDE.mdが長くなってきたら、責務の分離を検討してみてください。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;BharukaShraddha&#x2F;status&#x2F;2029836408232497678&quot;&gt;Shraddha Bharuka (@BharukaShraddha)&lt;&#x2F;a&gt;. &quot;The Anatomy of a Claude Code Project&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;claude-code&#x2F;overview&quot;&gt;Anthropic&lt;&#x2F;a&gt;. &quot;Claude Code Overview&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;claude-code&#x2F;memory&quot;&gt;Anthropic&lt;&#x2F;a&gt;. &quot;Memory&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;claude-code&#x2F;best-practices&quot;&gt;Anthropic&lt;&#x2F;a&gt;. &quot;Best practices&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;claude-code&#x2F;hooks&quot;&gt;Anthropic&lt;&#x2F;a&gt;. &quot;Hooks&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;claude-code&#x2F;skills&quot;&gt;Anthropic&lt;&#x2F;a&gt;. &quot;Skills&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">CLAUDE.mdに全部書いてしまい、肝心なルールが埋もれていませんか。CLAUDE.md、Commands、Hooks、docsの4層に責務を分離し、AIが忘れないガードレールとセッション間で一貫したワークフローを実現するリポジトリ設計パターンを、実例とともに解説します。</summary>
        </entry><entry xml:lang="en">
        <title>gyrotriage — DJIドローン映像のブレを診断し、Gyroflowのパラメータを自動推定するツール</title>
        <published>2026-03-07T22:00:00+09:00</published>
        <updated>2026-06-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/gyrotriage/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/gyrotriage/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;gyrotriage&amp;#x2F;cover.webp?h=a52eaf44e6e2f027bce2&quot;
  alt=&quot;gyrotriage HUD出力例&quot; width=&quot;1440&quot; height=&quot;900&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;（2026-06-04更新）&lt;&#x2F;strong&gt; 本記事は当初、Gyroflowスタンドアロンアプリ向けの5つのパラメータを推奨する内容でした。その後、実運用のワークフローがDaVinci Resolve上のGyroflow OpenFXプラグインで完結することを踏まえ、推奨対象をプラグイン版「Adjust parameters」に一本化しました。以下では旧スタンドアロンアプリ版の記述に取り消し線を引き、新しい内容を併記しています。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;Gyroflowのパラメータ調整は面倒である&quot;&gt;Gyroflowのパラメータ調整は面倒である&lt;&#x2F;h2&gt;
&lt;p&gt;DJI NeoやAvataシリーズでFPV撮影をしている方なら、Gyroflowでの後処理は日常的な作業だと思います。EISをオフにして撮影し、Gyroflowでスタビライズする。この流れ自体は確立されていますが、問題はGyroflowのパラメータ調整です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;del&gt;Gyroflowには主に5つの調整パラメータがあります。&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
&lt;p&gt;DaVinci ResolveなどでGyroflow OpenFXプラグインを使う場合、調整の中心になるのは「Adjust parameters」パネルのSmoothnessとZoom limitです。スタンドアロンアプリ版にあった細かなパラメータはプラグインのUIには現れず、&lt;code&gt;.gyroflow&lt;&#x2F;code&gt; プロジェクト側に焼き込まれます（2026-06-04更新）。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;パラメータ&lt;&#x2F;th&gt;&lt;th&gt;意味&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Smoothness (1〜300)&lt;&#x2F;td&gt;&lt;td&gt;スムージングの強度。高いほどブレを強く除去するが、意図した動きも鈍る&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;Max smoothness (s)&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;突発的なブレに対する最大補正量&lt;&#x2F;del&gt;（プラグイン版では非対応）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;Max smoothness at high velocity (s)&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;高速旋回時の補正上限。短くすると旋回への追従性が上がる&lt;&#x2F;del&gt;（プラグイン版では非対応）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Zoom limit (%)&lt;&#x2F;td&gt;&lt;td&gt;安定化で生じる黒縁を隠すためのズーム上限&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;Zooming speed (s)&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;Dynamic zoomingのFOV遷移速度&lt;&#x2F;del&gt;（プラグイン版では非対応）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FOV&lt;&#x2F;td&gt;&lt;td&gt;画角。算出対象外でベースライン1.0を提示&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;プラグインのSmoothnessは1〜300のスケール（デフォルト50）で、gyrotriageが従来出力していた百分率の値をそのまま入力できます。強く設定すればブレは消えますが、意図したカメラワークまで平滑化されたり、クロップで解像度が落ちたりします。適切な値はクリップごとに異なるため、毎回プレビューを見ながら試行錯誤することになります。&lt;&#x2F;p&gt;
&lt;p&gt;1本2本ならまだしも、フライト後に何十本ものクリップを処理するときは正直つらい作業です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gyrotriageでパラメータ推定を自動化する&quot;&gt;gyrotriageでパラメータ推定を自動化する&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;gyrotriage&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;そこで作ったのが &lt;strong&gt;gyrotriage&lt;&#x2F;strong&gt; です。DJIドローンのMP4ファイルを渡すだけで、埋め込まれたモーションデータを解析し、ブレの度合いをスコアリングしつつ、&lt;del&gt;Gyroflowの5つのパラメータ&lt;&#x2F;del&gt;Gyroflow OpenFXプラグイン（DaVinci Resolve等）に入力するパラメータを自動で推定します。&lt;&#x2F;p&gt;
&lt;p&gt;考え方はシンプルです。パイロットが意図したカメラワーク（パン・チルト・旋回）と除去したいブレ（風や機体振動）では、動きの周波数帯域が異なります。ゆっくりしたパンは1Hz以下の低周波、プロペラ振動は20Hz以上の高周波に現れます。この境界を信号処理で自動検出し、Gyroflowの内部ロジックに合わせてパラメータに変換しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;インストール&quot;&gt;インストール&lt;&#x2F;h2&gt;
&lt;p&gt;macOSの場合はHomebrewでインストールできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install gyrotriage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rustの開発環境がある場合はcargoからもインストールできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install --path .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;使い方&quot;&gt;使い方&lt;&#x2F;h2&gt;
&lt;p&gt;基本的な使い方はMP4ファイルを渡すだけです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gyrotriage&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; DJI_0001.MP4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;以下のようなテキスト出力が得られます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;File:        DJI_20260228080801_0003_D.MP4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Duration:    30.3s (60593 samples @ 2000Hz)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Score:       100 &#x2F; 100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Level:       SEVERE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RMS:         34.8 °&#x2F;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Peak:        644.0 °&#x2F;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Pitch:       avg=1.4°&#x2F;s  std=2.2°&#x2F;s  max=47.9°&#x2F;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Roll:        avg=11.7°&#x2F;s  std=13.5°&#x2F;s  max=251.1°&#x2F;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Yaw:         avg=3.3°&#x2F;s  std=4.4°&#x2F;s  max=89.0°&#x2F;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Gyroflow plugin (Adjust parameters):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Smoothness:           21&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Zoom limit:           118&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  FOV:                  1.000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Integration method:   None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Lens correction:      100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;末尾の「Gyroflow plugin (Adjust parameters)」ブロックが、Gyroflow OpenFXプラグインの「Adjust parameters」パネルにそのまま入力できる推奨値です。&lt;del&gt;最後の2行がGyroflowに入力する推定パラメータです。&lt;&#x2F;del&gt; このうちSmoothnessとZoom limitはモーション解析から算出した値、Integration methodとLens correctionはDJI機の特性に基づく固定推奨です。この値をプラグインのパネルに入力すれば、そこから微調整を始められます（2026-06-04更新）。&lt;&#x2F;p&gt;
&lt;p&gt;なお旧スタンドアロンアプリ版では、末尾の出力が &lt;del&gt;&lt;code&gt;Gyroflow: smoothness=21% max=0.300s max@hv=0.030s zoom_limit=118% zooming_speed=2.6s&lt;&#x2F;code&gt;&lt;&#x2F;del&gt; という5値の形式でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;HUD表示で直感的にブレを把握する&quot;&gt;HUD表示で直感的にブレを把握する&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;--visual&lt;&#x2F;code&gt; オプションを付けると、ブレの特性をHUD風のグラフィックで表示します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gyrotriage&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; DJI_0001.MP4 --visual&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;冒頭のカバー画像がHUD出力の実例です。画面には以下の情報が表示されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スコアゲージ&lt;&#x2F;strong&gt;: ブレの重大度を0〜100で表示（STABLE &#x2F; MILD &#x2F; MODERATE &#x2F; SEVEREの4段階）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;レーダーチャート&lt;&#x2F;strong&gt;: Pitch・Roll・Yawの3軸でブレの偏りを可視化&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ライングラフ&lt;&#x2F;strong&gt;: 合成角速度と各軸の角速度の時系列変化&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;推定パラメータ&lt;&#x2F;strong&gt;: &lt;del&gt;Gyroflowに入力する5つの値&lt;&#x2F;del&gt;Gyroflow OpenFXプラグインに入力する推奨値&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;数値だけでは分かりにくい「このクリップはRoll方向のブレが支配的」「後半に激しいブレが集中している」といった特性が一目で把握できます。Gyroflowプラグインを適用する前に、どのクリップにどの程度の処理が必要かをトリアージするのに役立ちます。&lt;&#x2F;p&gt;
&lt;p&gt;HUD画像はPNGファイルとしても出力できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gyrotriage&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; DJI_0001.MP4 --output-image shake.png&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;WezTermやiTerm2などSixel&#x2F;iTerm2プロトコルに対応したターミナルでは &lt;code&gt;--visual&lt;&#x2F;code&gt; でインライン表示されます。非対応のターミナルでは &lt;code&gt;--output-image&lt;&#x2F;code&gt; でファイル出力してください。&lt;&#x2F;p&gt;
&lt;p&gt;テキストのみの環境向けには &lt;code&gt;--sparkline&lt;&#x2F;code&gt; オプションもあります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gyrotriage&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; DJI_0001.MP4 --sparkline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;スコアの読み方&quot;&gt;スコアの読み方&lt;&#x2F;h2&gt;
&lt;p&gt;gyrotriageはブレの重大度を0〜100のスコアで表示します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;レベル&lt;&#x2F;th&gt;&lt;th&gt;スコア&lt;&#x2F;th&gt;&lt;th&gt;目安&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;STABLE&lt;&#x2F;td&gt;&lt;td&gt;0〜25&lt;&#x2F;td&gt;&lt;td&gt;ブレはほぼなし。スタビライズ不要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MILD&lt;&#x2F;td&gt;&lt;td&gt;26〜50&lt;&#x2F;td&gt;&lt;td&gt;軽微なブレ。スタビライズは任意&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MODERATE&lt;&#x2F;td&gt;&lt;td&gt;51〜75&lt;&#x2F;td&gt;&lt;td&gt;目に見えるブレ。Gyroflow推奨&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;SEVERE&lt;&#x2F;td&gt;&lt;td&gt;76〜100&lt;&#x2F;td&gt;&lt;td&gt;激しいブレ。Gyroflow必須&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;DJI Air 3Sのような3軸ジンバル搭載機ではほぼSTABLEになりますが、DJI Neoのような1軸ジンバル機やAvataシリーズでアクロバティックな飛行をした場合はMODERATE〜SEVEREになることが多いです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;推定パラメータの使い方&quot;&gt;推定パラメータの使い方&lt;&#x2F;h2&gt;
&lt;p&gt;~~出力された5つのパラメータはGyroflowのUIに直接入力できます。~~出力された推奨値はGyroflow OpenFXプラグインの「Adjust parameters」パネルに直接入力できます（2026-06-04更新）。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;del&gt;Gyroflowでクリップを開く&lt;&#x2F;del&gt;DaVinci ResolveのタイムラインでクリップにGyroflowプラグインを適用する&lt;&#x2F;li&gt;
&lt;li&gt;出力された値をそれぞれのスライダーに入力する&lt;&#x2F;li&gt;
&lt;li&gt;プレビューで確認し、必要に応じて微調整する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;このとき、Integration methodはNone、Lens correctionは100、FOVは1.0を起点にします。DJI機はクォータニオンを記録済みなので再積分が不要で、正しいレンズプロファイルを読み込めばフル補正で問題ないためです。&lt;&#x2F;p&gt;
&lt;p&gt;推定値はあくまで調整の出発点です。ブレが残っている場合はSmoothnessを上げる、カメラワークが鈍く感じる場合はSmoothnessを下げる、といった微調整で仕上げてください。ゼロからスライダーを動かして探るよりも、妥当な出発点があるだけで調整時間は大幅に短縮できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対応機体と撮影条件&quot;&gt;対応機体と撮影条件&lt;&#x2F;h2&gt;
&lt;p&gt;モーションデータがMP4へ埋め込まれるDJI機種に対応しています。ただし撮影時の設定次第ではモーションデータが記録されないため、注意が必要です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機体&lt;&#x2F;th&gt;&lt;th&gt;条件&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;DJI Avata &#x2F; Avata 2&lt;&#x2F;td&gt;&lt;td&gt;EIS（Rocksteady）オフ、FOV Wide&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DJI Neo &#x2F; Neo2&lt;&#x2F;td&gt;&lt;td&gt;アスペクト比4:3（EISは自動的にオフ）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Avataシリーズの場合、Rocksteadyをオンにしているとモーションデータが記録されません。Gyroflowで後処理する前提なら、撮影時はRocksteadyオフ・FOV Wideで撮影してください。&lt;&#x2F;p&gt;
&lt;p&gt;DJI Neoの場合、16:9で撮影するとモーションデータが記録されません。4:3で撮影する必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;DJI Air 3Sなど3軸ジンバル搭載機はGyroflow自体を必要としないケースが多く、対象外としています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の効果&quot;&gt;実際の効果&lt;&#x2F;h2&gt;
&lt;p&gt;gyrotriageで推定したパラメータを微調整なしでそのままGyroflow OpenFXプラグインに適用した映像（右）と、オリジナルの未処理映像（左）の比較です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;uEInUgQIBrs&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;注意事項&quot;&gt;注意事項&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;推定値は信号処理に基づく客観的な算出であり、映像の主観的な品質評価は含まない&lt;&#x2F;li&gt;
&lt;li&gt;非常にゆっくりしたブレ（0.3Hz未満）は意図した動きと区別できない&lt;&#x2F;li&gt;
&lt;li&gt;GyroflowのDefaultアルゴリズムを前提としており、Plain 3Dや軸別モードでは推定値の解釈が異なる&lt;&#x2F;li&gt;
&lt;li&gt;極端に短いクリップ（2秒未満）では推定精度が低下する&lt;&#x2F;li&gt;
&lt;li&gt;商用空撮など業務用途では、必ずGyroflowのプレビューで結果を検証すること&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gyroflow.xyz&#x2F;&quot;&gt;Gyroflow&lt;&#x2F;a&gt;. 「Gyroflow - Video stabilization using gyroscope data」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Gyroflowのパラメータ調整に毎回悩んでいませんか。gyrotriageはDJIドローンのMP4ファイルからブレを診断し、DaVinci ResolveのGyroflow OpenFXプラグインに入力するパラメータを自動で推定するCLIツールです。導入方法から使い方、出力の読み方までを解説します。</summary>
        </entry><entry xml:lang="en">
        <title>DJI公式がAvata 360のティザー映像を公開</title>
        <published>2026-03-06T00:00:00+00:00</published>
        <updated>2026-03-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/dji-avata-360-teaser/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/dji-avata-360-teaser/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;dji-avata-360-teaser&amp;#x2F;cover.webp?h=57c53edf060aa551c05e&quot;
  alt=&quot;DJI Avata 360 ティザー&quot; width=&quot;1278&quot; height=&quot;718&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;DJI JAPANの公式Xアカウントが、「新たな驚きを、その目で」というメッセージとともにティザー映像を投稿しました。&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;新たな驚きを、その目で👀&lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hashtag&#x2F;DJI?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#DJI&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hashtag&#x2F;Drone?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Drone&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hashtag&#x2F;%E3%83%89%E3%83%AD%E3%83%BC%E3%83%B3?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ドローン&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hashtag&#x2F;%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%89%E3%83%AD%E3%83%BC%E3%83%B3?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#カメラドローン&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;t.co&#x2F;k6v0OywZdE&quot;&gt;pic.twitter.com&#x2F;k6v0OywZdE&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;&amp;mdash; DJI JAPAN (@DJIJAPAN) &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;DJIJAPAN&#x2F;status&#x2F;2028802577350201508?ref_src=twsrc%5Etfw&quot;&gt;March 3, 2026&lt;&#x2F;a&gt;&lt;&#x2F;blockquote&gt; &lt;script async src=&quot;https:&#x2F;&#x2F;platform.twitter.com&#x2F;widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;
&lt;p&gt;映像の内容から、以前からリーク情報が出ていたAvata 360の正式発表が間近に迫っていることがうかがえます。FPV飛行と360度撮影を一台で実現するこの機体については、すでにベータアプリからのインストラクション動画の発見やレビュアーへの実機配布といった情報が出ており、発売に向けた準備が着々と進んでいるようです。&lt;&#x2F;p&gt;
&lt;p&gt;これまでのリーク情報については、以下の記事で詳しくまとめています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;03&#x2F;dji-avata-360&#x2F;&quot;&gt;DJI Avata 360、今月発売か&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;公式からのティザー映像公開は、正式発表が数日以内に行われる可能性を強く示唆しています。続報に注目です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">DJI JAPANの公式Xアカウントで、Avata 360と見られる新製品のティザー映像が公開されました。正式発表が間近に迫っていることを示唆しています。
</summary>
        </entry><entry xml:lang="en">
        <title>AIエージェントが&quot;同僚&quot;になる時代 ── AWS ProServe変革と日本のSIerへの示唆</title>
        <published>2026-03-05T00:00:00+00:00</published>
        <updated>2026-03-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/aws-proserve-innovation/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/aws-proserve-innovation/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;aws-proserve-innovation&amp;#x2F;cover.webp?h=684f9f74312c298756a4&quot;
  alt=&quot;AIロボットとビジネスパーソンが会議室で協働するイメージ&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;次のBusiness Insiderの記事に基づいた考察です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;www.businessinsider.com&amp;#x2F;amazon-aws-cloud-customers-proserve-consulting-fees-ai-automates-work-2026-2&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;AWS_ProServeとは&quot;&gt;AWS ProServeとは&lt;&#x2F;h2&gt;
&lt;p&gt;AWS ProserveはAWSの技術支援サービスです。&lt;&#x2F;p&gt;
&lt;p&gt;AWSのユーザーにとっては、「SA」（Solutions Architect）と呼ばれる無償の技術支援のほうが馴染み深いかもしれません。一方、AWS ProServe（Professional Services）は、有償の支援サービスです。&lt;&#x2F;p&gt;
&lt;p&gt;AWSの公式エキスパートが顧客のチームに入り、一緒にプロジェクトを成功させるコンサルティング部門です（ProServeについては&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;note.com&#x2F;jazzy_slug5355&#x2F;n&#x2F;n6d3fa6120c79&quot;&gt;こちらの解説記事&lt;&#x2F;a&gt;が分かりやすいです）。クラウド移行やモダナイゼーションといった技術コンサルティングに加え、DX戦略の策定やビジネス変革の支援まで幅広く対応しています。単なる代行ではなく、顧客が自らAWSを使いこなせるようになる「自走支援」に重点を置いている点が特徴です。&lt;&#x2F;p&gt;
&lt;p&gt;ProServeはAWSの収益創出に大きく貢献しています&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。内部文書によれば、売上1,290億ドル（2025年）のAWSを10年以内に5,000億ドル企業へ押し上げるドライバーとしてProServeを位置づけており、その重要度は増す一方です。&lt;&#x2F;p&gt;
&lt;p&gt;筆者は2021年から2024年まで日本のProServeに在籍していました。日本のProServeはまだ規模が小さく、米国本体に比べれば発展途上の組織です。しかしその分、一人ひとりの守備範囲が広く、技術・ビジネス両面で顧客に向き合う経験を積める環境でした。ProServeの役割は年々広がっており、技術支援にとどまらずビジネス変革の伴走へ変化してきたことを肌で感じていました。そのProServeが今、AIによってさらに大きく変わろうとしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AIを「デジタル従業員」にするという衝撃&quot;&gt;AIを「デジタル従業員」にするという衝撃&lt;&#x2F;h2&gt;
&lt;p&gt;Business Insiderが入手したProServeの内部文書によると、方針の核心はシンプルです。AIエージェントを「&lt;strong&gt;デジタル従業員（digital employees）&lt;&#x2F;strong&gt;」と位置づけ、人間と同列の要員としてプロジェクトに組み込むというものです。&lt;&#x2F;p&gt;
&lt;p&gt;生成AIを便利なツールとして活用する企業は既に多くあります。筆者の古巣であるIBMも、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;ibm-cobol-claude-irony&quot;&gt;以前の記事&lt;&#x2F;a&gt;で取り上げたAIエージェント「IBM Bob」を社内10,000人超の開発者に展開しています。McKinseyのCEO Bob Sternfelsは、40,000人の人間の従業員に加え25,000のAIエージェントを「従業員」として数えていると発表しました。検索・分析タスクだけで年間150万時間を削減し、6か月で250万枚のチャートを生成したとしています。2026年末までにAIエージェント数を人間の従業員数と同数にする目標も掲げています。ただし、このエージェント数を誇るアプローチに対しては懐疑的な声もあります。競合のEYは「エージェント数が価値に直結するわけではない」、PwCのチーフAIオフィサーも「誤った測定基準だ」と指摘しています。PwC、EY、Boston Consulting Groupも含め、各社がAIエージェントの活用を進めてはいるものの、その位置づけはあくまで「人間の生産性を高めるツール」にとどまっています。&lt;&#x2F;p&gt;
&lt;p&gt;Business Insiderの報道が正しければ、ProServeが一線を画すのは、AIを「ツール」ではなく「デジタル従業員」として組織に位置づけようとしている点です。内部文書には具体的に以下のような施策が記載されていたとされています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;「Agentic AI」専任チームの設立と「Agent Operating Model」の導入&lt;&#x2F;li&gt;
&lt;li&gt;AI Agent Service and Marketplaceの構築による、エージェントの開発・配備・管理の組織化&lt;&#x2F;li&gt;
&lt;li&gt;特定タスクの最大90%自動化を見込んだ生産性目標&lt;&#x2F;li&gt;
&lt;li&gt;人員を大幅に増やさず、従業員あたり収益を前年比20%増とする計画&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;実際、AWSは2025年11月に「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;machine-learning&#x2F;accelerate-enterprise-solutions-with-agentic-ai-powered-consulting-introducing-aws-professional-service-agents&#x2F;&quot;&gt;AWS Professional Service Agents&lt;&#x2F;a&gt;」を公式に発表し、agent-first consultingの取り組みを公にしています。AWS Professional Services Delivery Agentは、提案書の作成を数週間から数時間に短縮し、生成AIアプリ開発プロジェクトの所要期間を6〜8週間から数日に圧縮したとされています。大規模な移行プロジェクトでも、従来12か月以上かかっていた期間を数か月に短縮できるとしています。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、これは内部文書のリークだけの話ではなく、AWS自身が公式に推進している方針なのです。&lt;strong&gt;プロジェクトの体制表に人間コンサルタントとAIエージェントが並ぶ&lt;&#x2F;strong&gt;。これはツール導入の延長線上にはない、組織設計そのものの転換です。&lt;&#x2F;p&gt;
&lt;p&gt;この動きが日本のSIer・コンサルティング会社に示唆するものは大きいです。記事によれば、Booking.comやDanske Bankは既にProServeに対し「AI-delivered pricing」（AI前提の低価格）での契約再交渉を求めているとのことです。こうした圧力は遅かれ早かれ日本にも波及するのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;ここで筆者が強く懸念しているのは、日本のSIer業界に根深い「人月モデル」の問題です。日本のSIerの多くは契約形態としては請負契約を採用していますが、実態としては人月単価を積み上げて見積りを作り、それを顧客への価値訴求の根拠としています。つまり「エンジニアが何人月かかるか」が価格の正当性そのものになっている構造です。&lt;&#x2F;p&gt;
&lt;p&gt;AIエージェントが要員として組み込まれ、同じ成果をより少ない人間の稼働で出せる時代になったとき、この価値訴求は成り立つでしょうか。「人が何人月かけたか」ではなく「どんな成果を出したか」で価値を問われるようになれば、人月を積み上げる以外の方法で自社のサービスの価値を顧客に説明できなければなりません。それができる日本のSIerがどれだけあるのか。筆者は正直、心許なく思っています。&lt;&#x2F;p&gt;
&lt;p&gt;AIエージェントを要員としてデリバリーに組み込む体制を前提としている日本の企業は、まだほとんどありません。ProServeの動きが本格化すれば、日本のSIer・コンサルティング会社にとってパラダイムシフトの始まりになり得ると筆者は考えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;準委任からFixed_Priceへの転換に思うこと&quot;&gt;準委任からFixed Priceへの転換に思うこと&lt;&#x2F;h2&gt;
&lt;p&gt;もう1つ、元ProServe社員として見過ごせない変化があります。課金モデルの転換です。&lt;&#x2F;p&gt;
&lt;p&gt;ProServeの内部文書は、2026年までにプロジェクトの75%をFixed Price（固定価格）にする目標を掲げていました。&lt;&#x2F;p&gt;
&lt;p&gt;AWS ProServeでは従来、準委任契約（Time &amp;amp; Materials）が主流でした。準委任は想定稼働時間にコンサルタント単価を掛けるシンプルな構造で、提供者側のリスクが比較的低いモデルです。それが75%をFixed Priceにするというのは、組織文化の根本的な転換を意味します。&lt;&#x2F;p&gt;
&lt;p&gt;顧客側の論理は明快です。「AIが作業を高速化・自動化しているのに、なぜ同じ料金を払わなければならないのか」。この問いに、成果で応えるモデルへ移行せざるを得なくなっているのです。&lt;&#x2F;p&gt;
&lt;p&gt;Fixed Priceへの移行は、提供者側に大きな能力変革を要求します。緻密なスコープ定義、正確な工数見積り、リスク管理、そしてビジネスケースの算出が不可欠です。筆者は日本IBM出身ですが、IBMのサービス事業では請負契約が主流であり、こうした見積り・リスク管理の規律が組織に染みついていました。一方、ProServe在籍時に感じていたのは、準委任が主流の環境ではそうした規律が育ちにくいということです。技術力は高くても、プロジェクトを経営的に組み立てる力は別物です。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、ProServeには技術力の高さと、顧客の自走を支援するという明確なミッションがあります。この強みは、AI時代にも変わらない価値です。AIエージェントという新たな「要員」を得たことで、技術力を活かしながら成果ベースのデリバリーに挑む。ProServeの変革は、技術集団が経営的視点を獲得していく過程でもあると筆者は見ています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Business Insiderが報じたProServeの変革は、2つの点で従来のAI活用と次元が異なります。&lt;&#x2F;p&gt;
&lt;p&gt;1つ目は、AIエージェントを「ツール」ではなく「デジタル従業員」として組織に位置づけたこと。2つ目は、それに伴い課金モデルを準委任からFixed Priceへ転換しようとしていることです。&lt;&#x2F;p&gt;
&lt;p&gt;日本のSIer・コンサルティング業界にとって、この報道は他人事ではありません。人月単価の積み上げで価値を訴求してきた従来のモデルは、AIが要員になる時代には通用しなくなる可能性があります。「何人月かけたか」ではなく「どんな成果を出したか」で問われる時代に、自社のサービスの価値をどう説明するのか。その問いに向き合う時期が来ていると感じています。&lt;&#x2F;p&gt;
&lt;p&gt;では、私たちは何から始められるでしょうか。筆者は3つのことを考えています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;まず、自分たちの提供するサービスの価値を「人月」ではなく「成果」で言語化してみること。これは個人レベルでも今日から始められる&lt;&#x2F;li&gt;
&lt;li&gt;次に、AIエージェントを「便利なツール」ではなく「チームメンバー」として扱うプロジェクト運営を小さく試してみること。AIに任せられるタスクを洗い出し、人間とAIの役割分担を設計する経験は、来るべき変化への備えになる&lt;&#x2F;li&gt;
&lt;li&gt;そして、技術力だけでなく、スコープ定義や見積り、ビジネスケースの組み立てといった「プロジェクトを経営する力」を意識的に磨くこと&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ProServeの変革が示しているのは、AIの進化によってコンサルティングの価値の源泉が変わるということです。変化は脅威でもあり、機会でもあります。早く動いた者が、次の時代のスタンダードを作ることになるでしょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;ご留意ください&lt;&#x2F;strong&gt;
        &lt;p&gt;筆者は2021〜2024年にAWS ProServeに在籍していましたが、本記事は公開情報（Business Insiderの報道等）および筆者の個人的な所感に基づいており、AWSの機密情報を開示するものではありません。記載内容は筆者個人の見解であり、AWSの公式見解を代表するものではありません。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;&quot;&gt;Business Insider&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;amazon-aws-cloud-customers-proserve-consulting-fees-ai-automates-work-2026-2&quot;&gt;AI rewrites the economics of Amazon&#x27;s cloud-consulting business&lt;&#x2F;a&gt;&quot; (Eugene Kim, Feb 26, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;&quot;&gt;Business Insider&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;amazon-cloud-reboot-future-consulting-ai-era-2026-3&quot;&gt;Amazon&#x27;s cloud reboot shows the future of consulting in the AI era&lt;&#x2F;a&gt;&quot; (Alistair Barr, Mar 4, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;machine-learning&#x2F;&quot;&gt;AWS Machine Learning Blog&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;machine-learning&#x2F;accelerate-enterprise-solutions-with-agentic-ai-powered-consulting-introducing-aws-professional-service-agents&#x2F;&quot;&gt;Accelerate enterprise solutions with agentic AI-powered consulting: Introducing AWS Professional Service Agents&lt;&#x2F;a&gt;&quot; (Nov 17, 2025)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;siliconangle.com&#x2F;&quot;&gt;SiliconANGLE&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;siliconangle.com&#x2F;2025&#x2F;11&#x2F;17&#x2F;aws-develops-ai-agents-speed-aws-proserve-consulting-projects&#x2F;&quot;&gt;AWS develops AI agents to speed up AWS ProServe consulting projects&lt;&#x2F;a&gt;&quot; (Nov 17, 2025)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dnyuz.com&#x2F;&quot;&gt;Dnyuz&lt;&#x2F;a&gt;. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dnyuz.com&#x2F;2026&#x2F;02&#x2F;13&#x2F;mckinsey-says-it-has-25000-ai-agents-its-rivals-say-thats-not-a-metric-of-success&#x2F;&quot;&gt;McKinsey says it has 25,000 AI agents. Its rivals say that&#x27;s not a metric of success.&lt;&#x2F;a&gt;&quot; (Feb 13, 2026)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;note.com&#x2F;&quot;&gt;note&lt;&#x2F;a&gt;. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;note.com&#x2F;jazzy_slug5355&#x2F;n&#x2F;n6d3fa6120c79&quot;&gt;AWS ProServe（プロフェッショナルサービス）とは？&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Business Insiderが入手した内部文書によると、ProServeのコンサルティング業務は2024年にAWSの約125億ドルの収益創出に貢献したとされています。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">AWS ProServeがAIエージェントを「デジタル従業員」としてプロジェクトに組み込む方針を打ち出しました。人月モデルに依存する日本のSIerへの影響と、成果ベースへの転換について元ProServe社員の視点で考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>ギターはHiFi化し、音楽はLoFi化している — Billboard Hot 100の音響分析で検証する</title>
        <published>2026-03-04T00:00:00+00:00</published>
        <updated>2026-03-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/hifi-guitar-lofi-music/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/hifi-guitar-lofi-music/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;cover.webp?h=45505e45d44a5c7bbb87&quot;
  alt=&quot;Cover画像&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;ギターのHiFi化と音楽のLoFi化&quot;&gt;ギターのHiFi化と音楽のLoFi化&lt;&#x2F;h2&gt;
&lt;p&gt;ギタリストの間でよく聞く話があります。近年、真空管アンプとギターキャビネットの組み合わせに代わってアンプシミュレーターが急速に普及しました。従来のギターアンプはスピーカーの周波数特性によって5kHz付近から高域が自然にロールオフし、いわゆる「ギターらしい音」が作られていました。アンプシミュレーターもIR（インパルスレスポンス）でキャビネットの特性を忠実に再現できますが、IRの選択やEQの自由度は従来のアンプとは比較にならないほど高く、FRFRスピーカーやDAWへのライン出力など、従来のギタースピーカーの制約を受けない再生環境も広がっています。結果として、ギターの音はかつてないほどHiFi化しているというのです。&lt;&#x2F;p&gt;
&lt;p&gt;PolyphiaのTim Hensonはその象徴的な存在です。Neural DSPのプラグインを駆使した彼のトーンは、従来のギタースピーカーでは再現できないほどクリアで広帯域な音色を持っています。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、音楽全体を見るとLoFi Hip HopやチルウェイブなどLoFiを志向するジャンルが台頭し、ヒット曲の音作りもウォームで暗い方向に向かっているといわれます。&lt;&#x2F;p&gt;
&lt;p&gt;ギターはHiFi化し、音楽はLoFi化している。これは本当なのでしょうか。「なんとなくそう感じる」ではなく、データで検証してみたくなりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;分析手法&quot;&gt;分析手法&lt;&#x2F;h2&gt;
&lt;p&gt;当初は日本のヒットチャートでも同様の分析を試みましたが、オリコンやBillboard Japanの年間チャートは握手会チケットとしてCDを売りさばくアイドルの大量ランクインに支配されており、音楽的なトレンドを反映したデータとしては使い物になりませんでした。そこで対象を米国のBillboard Hot 100に絞っています。&lt;&#x2F;p&gt;
&lt;p&gt;Billboard Year-End Hot 100のトップ5曲を2000年から2024年まで、計125曲を対象としました。各楽曲の音源を取得し、Pythonの音響分析ライブラリlibrosaで以下の6つの音響特徴量を抽出しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RMS Loudness (dB)&lt;&#x2F;strong&gt;: 音圧（音量感）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Spectral Centroid (Hz)&lt;&#x2F;strong&gt;: スペクトル重心（音の明るさ）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Spectral Rolloff (Hz)&lt;&#x2F;strong&gt;: エネルギーの85%が集中する周波数上限&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Spectral Bandwidth (Hz)&lt;&#x2F;strong&gt;: スペクトルの広がり&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tempo (BPM)&lt;&#x2F;strong&gt;: テンポ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero Crossing Rate&lt;&#x2F;strong&gt;: ゼロ交差率（テクスチャのノイジーさ）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;このうち、Spectral Centroid、Spectral Rolloff、Spectral Bandwidth、Zero Crossing Rateの4指標がLoFi化の指標として機能します。値が低いほど高周波成分が少なく、ウォームで暗い音色、つまりLoFi的な音になります。&lt;&#x2F;p&gt;
&lt;p&gt;分析に使用したコードは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;music-trend-analysis&quot;&gt;GitHub&lt;&#x2F;a&gt;で公開しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;music-trend-analysis&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;RMS_Loudness_—_音圧は上がり続ける&quot;&gt;RMS Loudness — 音圧は上がり続ける&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;rms_db.webp?h=331da08a8e138b4576a9&quot;
  alt=&quot;RMS Loudness (dB) の推移&quot; width=&quot;2086&quot; height=&quot;586&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均RMS (dB)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;-16.71&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;-15.46&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;-16.25&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;-13.89&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;-13.29&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;年との相関はr=0.319（正の相関）で、年が進むほど音圧が上昇しています。いわゆる「ラウドネス・ウォー」（音圧競争）の傾向が数値で裏付けられました。&lt;&#x2F;p&gt;
&lt;p&gt;2000年代前半は-16〜-17dBだった平均音圧が、2020年代には-13dB付近まで上昇しています。Spotifyのラウドネスノーマライゼーション（-14 LUFS）が導入されてもなお、マスタリング段階で音圧を上げる傾向は続いています。&lt;&#x2F;p&gt;
&lt;p&gt;2010-2014年に一度平均が下がっているのが興味深い点です。Adeleの&quot;Rolling in the Deep&quot;(-20.71dB)やGotyeの&quot;Somebody That I Used to Know&quot;(-25.77dB)など、ダイナミクスを活かした楽曲がヒットした時期と一致します。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Spectral_Centroid_—_音の「明るさ」は低下&quot;&gt;Spectral Centroid — 音の「明るさ」は低下&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;spectral_centroid.webp?h=90250988e67532844f85&quot;
  alt=&quot;Spectral Centroid (Hz) の推移&quot; width=&quot;2085&quot; height=&quot;585&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均 (Hz)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;3,095&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;3,160&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;3,038&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;2,661&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;2,611&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;スペクトル重心は周波数スペクトルの「重心」で、音の「明るさ」に対応します。値が高いほど高周波成分が多くキラキラした音（HiFi寄り）、低いほど暗く丸い音（LoFi寄り）です。&lt;&#x2F;p&gt;
&lt;p&gt;年との相関はr=-0.327（負の相関）で、2000年代の3,000〜3,200Hz付近から2020年代には2,600Hz付近まで低下しました。ヒット曲の音色が確実に「暗く」「丸く」なっています。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Spectral_Rolloff_—_エネルギーの分布が低域にシフト&quot;&gt;Spectral Rolloff — エネルギーの分布が低域にシフト&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;spectral_rolloff.webp?h=0139fe7a7db25e3dba29&quot;
  alt=&quot;Spectral Rolloff (Hz) の推移&quot; width=&quot;2085&quot; height=&quot;585&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均 (Hz)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;6,492&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;6,662&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;6,387&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;5,541&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;5,475&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;全エネルギーの85%が集中する周波数の上限を示す指標です。年との相関はr=-0.319（負の相関）で、2000年代の6,500Hz前後から2020年代には5,500Hz前後に低下しました。楽曲のエネルギーが高周波帯から低〜中周波帯にシフトしていることがわかります。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Spectral_Bandwidth_—_帯域幅は縮小&quot;&gt;Spectral Bandwidth — 帯域幅は縮小&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;spectral_bandwidth.webp?h=fd04a04776bb14825992&quot;
  alt=&quot;Spectral Bandwidth (Hz) の推移&quot; width=&quot;2085&quot; height=&quot;585&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均 (Hz)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;3,540&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;3,621&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;3,517&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;3,201&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;3,203&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;スペクトルの「広がり」を示す指標で、年との相関はr=-0.316（負の相関）です。2000年代の3,500〜3,600Hzから2020年代の3,200Hzへ約10%縮小しました。&lt;&#x2F;p&gt;
&lt;p&gt;近年のヒット曲はボーカル、808ベース、シンプルなシンセパッドなど少数の要素で構成されることが多く、バンドサウンドのように広帯域を埋め尽くすプロダクションが減ったことと整合します。音作りが「フルバンド」から「焦点を絞った」方向へ変化しているのです。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Tempo_—_明確な傾向は見られない&quot;&gt;Tempo — 明確な傾向は見られない&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;tempo.webp?h=511a6666b3c3f0c2dff5&quot;
  alt=&quot;Tempo (BPM) の推移&quot; width=&quot;2085&quot; height=&quot;585&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均 (BPM)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;106.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;126.9&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;121.5&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;130.3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;123.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;テンポは年との相関がr=0.193と弱く、他の指標ほど明確な傾向は見られません。年ごとのばらつきが大きく、LoFi化とは独立した指標といえます。なお、librosaのビートトラッキングには倍テンポ・半テンポの誤検出が起こりうる点には留意が必要です。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Zero_Crossing_Rate_—_最も強い相関を示した指標&quot;&gt;Zero Crossing Rate — 最も強い相関を示した指標&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;hifi-guitar-lofi-music&amp;#x2F;zero_crossing_rate.webp?h=09d42458938b48ac29d8&quot;
  alt=&quot;Zero Crossing Rate の推移&quot; width=&quot;2086&quot; height=&quot;585&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;figure style=&quot;float: right; margin: 0 0 1rem 1.5rem;&quot;&gt;
&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;期間&lt;&#x2F;th&gt;&lt;th&gt;平均&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;0.06102&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;0.05974&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;0.05657&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;0.04951&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;0.04761&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;ゼロ交差率は信号がゼロを横切る頻度で、高周波成分やノイズの多さを反映します。年との相関はr=-0.343で、今回の分析で最も強い相関を示しました。&lt;&#x2F;p&gt;
&lt;p&gt;2000年代前半の0.061から2020年代の0.048へ、約22%低下しています。シンバル、ハイハット、ギターのディストーションといった高域成分が減り、クリーンなボーカル、サブベース、ソフトなシンセパッドが主体のプロダクションへ移行していることを如実に示しています。&lt;&#x2F;p&gt;
&lt;p&gt;Post Maloneの&quot;Rockstar&quot;(0.0262)が最小値であることは象徴的です。トラップの特徴である808ベースとオートチューンボーカルの組み合わせが、いかにスムーズなテクスチャを生むかがわかります。&lt;&#x2F;p&gt;
&lt;div style=&quot;clear: both;&quot;&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;ジャンルの変遷と音響特性の対応&quot;&gt;ジャンルの変遷と音響特性の対応&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;時期&lt;&#x2F;th&gt;&lt;th&gt;主流ジャンル&lt;&#x2F;th&gt;&lt;th&gt;音響的特徴&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2000-2004&lt;&#x2F;td&gt;&lt;td&gt;Pop, R&amp;amp;B, Rock&lt;&#x2F;td&gt;&lt;td&gt;広帯域、中程度の音圧&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2005-2009&lt;&#x2F;td&gt;&lt;td&gt;Pop, Hip-Hop, EDM前夜&lt;&#x2F;td&gt;&lt;td&gt;帯域やや広、テンポ上昇&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2010-2014&lt;&#x2F;td&gt;&lt;td&gt;EDM Pop, Indie Pop&lt;&#x2F;td&gt;&lt;td&gt;ばらつき大、ダイナミクスのある曲も&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2015-2019&lt;&#x2F;td&gt;&lt;td&gt;Hip-Hop&#x2F;Trap, Pop&lt;&#x2F;td&gt;&lt;td&gt;帯域縮小、音圧上昇、ダーク化&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020-2024&lt;&#x2F;td&gt;&lt;td&gt;Hip-Hop, Pop, Country&lt;&#x2F;td&gt;&lt;td&gt;低域集中、高音圧、スムーズ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;スペクトル指標の変化はジャンルの変遷とよく対応しています。ロックバンドやポップのシンセサウンドが支配的だった2000年代から、ベースとキックを中心としたヒップホップ&#x2F;トラップのプロダクションが主流になった変化が、数値にそのまま表れています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;考察：LoFi化の背景&quot;&gt;考察：LoFi化の背景&lt;&#x2F;h2&gt;
&lt;p&gt;分析結果をまとめると、スペクトル系の3指標（Centroid、Rolloff、Bandwidth）とゼロ交差率がすべて負の相関を示しており、米国のヒット曲は25年間で「HiFi」から「LoFi」方向へ明確にシフトしたといえます。&lt;&#x2F;p&gt;
&lt;p&gt;ここでいうLoFiは「音質の劣化」ではありません。808ベースとオートチューンボーカルで構成されるトラップは、制作環境としては極めてHiFiです。しかし結果として出力される楽曲のスペクトル特性は、高周波成分を抑えたウォームでダークな方向に向かっています。これがプロデューサーの意図的な音色設計なのか、ヒップホップやトラップというジャンル固有の音響特性が結果的にそうなったのかは、この分析だけでは区別できません。ただ、ジャンルの変遷そのものが時代の嗜好を反映しているのは確かです。&lt;&#x2F;p&gt;
&lt;p&gt;冒頭の問いに戻ると、「ギターはHiFi化し、音楽はLoFi化している」という仮説のうち、少なくとも後半はデータで裏付けられました。ギターがアンプシミュレーターで広い周波数帯域を手に入れた一方で、音楽全体はむしろ帯域を絞る方向に進んでいるのは、なかなか皮肉な状況です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;分析の限界&lt;&#x2F;strong&gt;
        &lt;p&gt;今回の分析にはいくつかの制約があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;各年5曲というサンプルサイズは統計的に小さく、個別の曲の影響を受けやすい。トップ5には特定のジャンルが偏る可能性がある&lt;&#x2F;li&gt;
&lt;li&gt;音源の取得元や圧縮形式によっては高域が劣化している可能性があり、特に古い楽曲ほどソースの品質にばらつきがある&lt;&#x2F;li&gt;
&lt;li&gt;librosaのビートトラッキングによるテンポ推定は、特にヒップホップやトラップでハーフタイム&#x2F;ダブルタイムの誤判定が起こりやすい&lt;&#x2F;li&gt;
&lt;li&gt;RMSはLUFSとは異なる指標であり、厳密なラウドネス比較には向かない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;より精度の高い分析には、サンプル数の拡大やオフィシャル音源の使用が望ましいでしょう。とはいえ、125曲のデータで一貫した傾向が出ている点は注目に値します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;music-trend-analysis&quot;&gt;GitHub&lt;&#x2F;a&gt;. 「music-trend-analysis — 分析コード」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;librosa.org&#x2F;&quot;&gt;librosa&lt;&#x2F;a&gt;. &quot;librosa: Audio and Music Signal Analysis in Python&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.billboard.com&#x2F;&quot;&gt;Billboard&lt;&#x2F;a&gt;. &quot;Year-End Hot 100 Songs&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">近年ギターはアンプシミュレーターの普及でHiFi化する一方、
ヒット曲はLoFi化しているという説をデータで検証しました。
Billboard Hot 100のトップ5曲（2000〜2024年）を音響分析した結果、
スペクトル指標が一貫して低下し、音楽のLoFi化は事実であることがわかりました。
</summary>
        </entry><entry xml:lang="en">
        <title>SPFのDNSルックアップ上限10回、あなたの組織は大丈夫？</title>
        <published>2026-03-03T00:00:00+00:00</published>
        <updated>2026-03-03T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/spf-lookup-limit-risk/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/spf-lookup-limit-risk/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;spf-lookup-limit-risk&amp;#x2F;cover.webp?h=bc1f2cf07dfaabe490a7&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;転載元&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;spf-lookup-limit-risk&quot;&gt;Zenn&lt;&#x2F;a&gt; に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;「ある日突然、自組織からのメールが取引先に届かなくなった」——そんな事態が、メール配信サービスを複数利用している組織で実際に起こり得ます。原因は、SPF（Sender Policy Framework）のDNSルックアップ上限です。&lt;&#x2F;p&gt;
&lt;p&gt;外部のメール配信サービスを導入するたびにSPFレコードへ &lt;code&gt;include&lt;&#x2F;code&gt; を追加していくと、気づかないうちに上限へ近づきます。しかも、上限超過のトリガーは自組織の操作ではなく、外部サービス側の設定変更かもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、SPFのDNSルックアップ上限の仕組みを解説し、上限超過のリスクと対策を整理します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;SPFの仕組みとDNSルックアップ上限&quot;&gt;SPFの仕組みとDNSルックアップ上限&lt;&#x2F;h2&gt;
&lt;p&gt;SPFは、メールの送信元ドメインが「どのサーバーからの送信を許可しているか」をDNSのTXTレコードで宣言する仕組みです。受信側メールサーバーは、送信元IPアドレスがSPFレコードに含まれているかを検証し、正当な送信元かどうかを判断します。&lt;&#x2F;p&gt;
&lt;p&gt;SPFレコードの例を示します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v=spf1 ip4:192.0.2.0&#x2F;24 include:spf.example.com ~all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この例では、&lt;code&gt;192.0.2.0&#x2F;24&lt;&#x2F;code&gt; のIPレンジからの送信と、&lt;code&gt;spf.example.com&lt;&#x2F;code&gt; が許可する送信元を正当とみなします。&lt;&#x2F;p&gt;
&lt;p&gt;SPFの検証は受信側メールサーバーで行われます。メールを受け取ったサーバーが送信元ドメインのSPFレコードをDNSに問い合わせ、送信元IPが許可されているかを確認します。この検証過程でDNSルックアップが発生しますが、RFC 7208（Section 4.6.4）により、1回のSPF検証で実行できるDNSルックアップは最大10回と制限されています。この制限は、SPF検証によるDNSサーバーへの負荷を防ぐために設けられたものです。&lt;&#x2F;p&gt;
&lt;p&gt;すべてのメカニズムがDNSルックアップを消費するわけではありません。消費するメカニズムとしないメカニズムを表にまとめます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;メカニズム &#x2F; 修飾子&lt;&#x2F;th&gt;&lt;th&gt;DNSルックアップ&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ip4&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;ip6&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;0回（IP直接指定のためDNS不要）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mx&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回（＋MXレコードが指すAレコードの解決）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;include&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回 ＋ 参照先のSPFレコード内のルックアップ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;redirect&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;exists&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;重要なのは &lt;code&gt;include&lt;&#x2F;code&gt; の挙動です。&lt;code&gt;include&lt;&#x2F;code&gt; は参照先のSPFレコードをさらに評価するため、参照先に &lt;code&gt;include&lt;&#x2F;code&gt; や &lt;code&gt;a&lt;&#x2F;code&gt; が含まれていれば、それらも合算されます。つまり、1つの &lt;code&gt;include&lt;&#x2F;code&gt; が実際には複数回のルックアップを消費する場合があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;includeの入れ子で上限に近づく実例&quot;&gt;includeの入れ子で上限に近づく実例&lt;&#x2F;h2&gt;
&lt;p&gt;架空の組織 &lt;code&gt;example.or.jp&lt;&#x2F;code&gt; を例に考えます。この組織では業務メールに加えて、メールマガジン配信に3つの外部サービスを利用しています。SPFレコードは以下のようになっています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v=spf1 ip4:192.0.2.0&#x2F;29 ip4:198.51.100.1 include:spf.mail-a.example include:spf.mail-b.example include:spf.mail-c.example include:spf.bizmail.example ~all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;各エントリのDNSルックアップ数を確認します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;エントリ&lt;&#x2F;th&gt;&lt;th&gt;DNSルックアップ&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ip4:192.0.2.0&#x2F;29&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;0回（IP直接指定）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ip4:198.51.100.1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;0回（IP直接指定）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;include:spf.mail-a.example&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;include:spf.mail-b.example&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回 ＋ 内部で3回 = 4回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;include:spf.mail-c.example&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;include:spf.bizmail.example&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;1回&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;合計&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;7回 &#x2F; 上限10回&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;一見すると余裕がありそうですが、問題は &lt;code&gt;spf.mail-b.example&lt;&#x2F;code&gt; の内部構造です。このSPFレコードは以下のようになっています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v=spf1 exists:%{i}.spf.mail-b1.example exists:%{i}.spf.mail-b2.example include:spf.mail-b3.example ~all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;include&lt;&#x2F;code&gt; 1つで4回のルックアップを消費しています。そして、この内訳は外部サービス側の設定に依存しています。&lt;&#x2F;p&gt;
&lt;p&gt;ここに大きなリスクがあります。外部サービスがインフラ変更に伴いSPFレコードへ &lt;code&gt;include&lt;&#x2F;code&gt; や &lt;code&gt;a&lt;&#x2F;code&gt; を追加すれば、自組織が何も変更していなくてもルックアップ数が増加します。たとえば &lt;code&gt;spf.mail-b.example&lt;&#x2F;code&gt; が内部で1つ &lt;code&gt;include&lt;&#x2F;code&gt; を追加するだけで、合計は8回になり、上限までわずか2回です。さらに別のサービスも同様の変更をすれば、上限を超えてしまいます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;上限を超えるとどうなるか&quot;&gt;上限を超えるとどうなるか&lt;&#x2F;h2&gt;
&lt;p&gt;SPFのルックアップ数が10回を超えると、SPFの検証結果は &lt;code&gt;permerror&lt;&#x2F;code&gt;（恒久的エラー）になります。これは「SPFレコードが壊れている」とみなされる状態です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;permerror&lt;&#x2F;code&gt; が発生すると、受信側メールサーバーの設定に応じて以下のいずれかが起こります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;メールが拒否される（バウンス）&lt;&#x2F;li&gt;
&lt;li&gt;迷惑メールフォルダに振り分けられる&lt;&#x2F;li&gt;
&lt;li&gt;DMARCのSPF判定がfailとなり、DMARCポリシー次第でメールが拒否される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に厄介なのは、この問題が自組織側からは気づきにくい点です。送信自体は正常に行われ、送信者にはエラーが返らない場合もあります。受信側で静かにスパム判定されるため、「最近メールの返信が来ない」「メルマガの開封率が急落した」といった間接的な兆候で初めて気づくことになります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自分のドメインのルックアップ数を確認する方法&quot;&gt;自分のドメインのルックアップ数を確認する方法&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;dig&lt;&#x2F;code&gt; コマンドでSPFレコードの内容を確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;dig&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +short TXT example.or.jp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; spf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;表示されたSPFレコードに含まれる &lt;code&gt;include&lt;&#x2F;code&gt; 先も再帰的に確認する必要があります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;dig&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +short TXT spf.mail-b.example&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;手動での再帰的な確認は手間がかかるため、オンラインツールの利用も有効です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MXToolbox SPF Record Lookup&lt;&#x2F;strong&gt; — SPFレコードの内容とDNSルックアップ数を自動計算してくれる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;dmarcian SPF Surveyor&lt;&#x2F;strong&gt; — SPFレコードの構造をツリー表示で可視化できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらのツールにドメイン名を入力するだけで、現在のルックアップ数と上限までの余裕を確認できます。定期的にチェックしておくことをお勧めします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対策&quot;&gt;対策&lt;&#x2F;h2&gt;
&lt;p&gt;SPFルックアップ上限の問題に対して、短期的な対策と中長期的な対策があります。&lt;&#x2F;p&gt;
&lt;p&gt;まず短期的な対策として、メール送信経路を棚卸しします。SPFレコードに登録されている &lt;code&gt;include&lt;&#x2F;code&gt; やIPアドレスが、現在も使われているかを確認します。利用を終了したサービスの &lt;code&gt;include&lt;&#x2F;code&gt; が残っていると、ルックアップ数を無駄に消費するだけでなく、そのサービスのIPレンジが自ドメインの正当な送信元として許可されたままになります。これはなりすましに悪用されるリスクでもあります。&lt;&#x2F;p&gt;
&lt;p&gt;次に、メール配信サービスの統合を検討します。メルマガ配信に複数のサービスを併用している場合、1つに統合すれば &lt;code&gt;include&lt;&#x2F;code&gt; の数を減らせます。配信実績の分析も一元化でき、コスト管理も簡素化されます。&lt;&#x2F;p&gt;
&lt;p&gt;これらの根本対策とは別に、技術的な回避策も存在します&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-spf-workaround-1&quot;&gt;&lt;a href=&quot;#fn-spf-workaround&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。ただし運用上の注意点があるため、まずは送信経路の整理を優先すべきです。&lt;&#x2F;p&gt;
&lt;p&gt;最後に、中長期的な対策としてDMARCポリシーの段階的強化があります。DMARCはSPFとDKIMの認証結果に基づいて、認証失敗時のメール処理方針を宣言する仕組みです。ポリシーは以下の順で強化します。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;p=none&lt;&#x2F;code&gt;（監視モード）でDMARCレポートを収集し、全送信経路の認証状況を把握する&lt;&#x2F;li&gt;
&lt;li&gt;全経路でSPF・DKIMがpassすることを確認したうえで &lt;code&gt;p=quarantine&lt;&#x2F;code&gt;（隔離）に移行する&lt;&#x2F;li&gt;
&lt;li&gt;一定期間の監視後、問題がなければ &lt;code&gt;p=reject&lt;&#x2F;code&gt;（拒否）に移行する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;送信経路が整理されていれば、この移行は技術的には難しくありません。逆に、送信経路が乱立したままでは各経路の認証状況を把握すること自体が困難であり、DMARC強化は事実上不可能です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;SPFのDNSルックアップ上限10回は、メール配信サービスを複数利用する組織にとって見落とされがちなリスクです。外部サービスの &lt;code&gt;include&lt;&#x2F;code&gt; は入れ子構造でルックアップ数が膨らみ、しかも外部サービス側の変更で自組織のルックアップ数が増加するという、制御しにくい特性があります。&lt;&#x2F;p&gt;
&lt;p&gt;まずは自分のドメインの現在のルックアップ数を確認してみてください。上限に近づいている場合は、不要な &lt;code&gt;include&lt;&#x2F;code&gt; の削除やサービスの統合を検討し、DMARCポリシーの強化と合わせてメール配信の信頼性を確保していくことが重要です。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-spf-workaround&quot;&gt;
&lt;p&gt;技術的な回避策としてSPF MacroとSPF flatteningがあります。SPF Macroは &lt;code&gt;exists&lt;&#x2F;code&gt; メカニズムと変数を組み合わせてルックアップ数を抑える手法です。SPF flatteningは &lt;code&gt;include&lt;&#x2F;code&gt; 先のIPアドレスを直接 &lt;code&gt;ip4&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;ip6&lt;&#x2F;code&gt; で記述してルックアップを削減する手法です。ただしflatteningは参照先のIPが変更されたときに追従が必要なため、自動化ツールなしでの運用は推奨しません。 &lt;a href=&quot;#fr-spf-workaround-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">SPFにはDNSルックアップ上限10回の制約があり、外部メール配信サービスのincludeが入れ子で膨らむと意図せず超過するリスクがあります。上限超過の仕組みと確認方法、対策を解説します。</summary>
        </entry><entry xml:lang="en">
        <title>DJI Avata 360、今月発売か</title>
        <published>2026-03-02T19:40:00+09:00</published>
        <updated>2026-03-02T19:40:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/dji-avata-360/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/dji-avata-360/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;dji-avata-360&amp;#x2F;cover.webp?h=57c53edf060aa551c05e&quot;
  alt=&quot;Cover&quot; width=&quot;1278&quot; height=&quot;718&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;DJI Avata 2の後継機である
DJI Avata 360の正式発表がいよいよ近づいてきました。
かなり具体的な発売時期についての情報が出てきたようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;発売時期&quot;&gt;発売時期&lt;&#x2F;h2&gt;
&lt;p&gt;当初は2025年末の発売が予想されていましたが、
2026年2月に延期、さらに配送上の問題で再延期と、
何度も延期を繰り返してきました。&lt;&#x2F;p&gt;
&lt;p&gt;今回 DroneXLのJasper Ellens氏が2月14日に報じたところに
よると、DJI Gogglesのベータソフトウェアから
Avata 360のインストラクション動画が発見され、
レビュアーには既に実機が配布されているとのことです。&lt;&#x2F;p&gt;
&lt;p&gt;今回ベータアプリに
インストラクション動画が組み込まれていた点と、
レビュアーへの実機配布が始まっている点は、
発表直前の準備段階に入ったことを示しています。&lt;&#x2F;p&gt;
&lt;p&gt;現時点のリーク情報では、&lt;strong&gt;2026年3月に中国で先行発売、
その後数週間以内にグローバル展開&lt;&#x2F;strong&gt;
という流れが
見込まれています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;FPVと360度カメラの統合&quot;&gt;FPVと360度カメラの統合&lt;&#x2F;h2&gt;
&lt;p&gt;Avata 360の最大の特徴は、FPVドローンに360度カメラを
統合した点です。DJIのプロモーション文には
「Fly first and frame later（まず飛ばして、
後から構図を決める）」とあり、先行する
Insta360 Antigravity A1に対するDJIの回答と
いえる製品です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Avata 360（リーク）&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Antigravity A1&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;配置&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;上下2基&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;上下2基&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;センサーサイズ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1&#x2F;1.1&quot;（リーク）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1&#x2F;1.28&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;解像度（360°）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8K&#x2F;60fps&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8K&#x2F;30fps&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HDR&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;対応&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;非対応&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;フレームレートとHDRではAvata 360が上回りますが、
センサーサイズはリーク段階のため
正式スペックでの確認が待たれます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;リーク情報のまとめ&quot;&gt;リーク情報のまとめ&lt;&#x2F;h2&gt;
&lt;p&gt;以前からリークされているスペックと価格を
まとめておきます。正式発表前のため、
製品版で変更される可能性があります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Avata 360（リーク）&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Antigravity A1&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Avata 2（参考）&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;映像&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8K&#x2F;60fps HDR（360°）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8K&#x2F;30fps（360°）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;4K&#x2F;120fps&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;センサー&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;上下2基（1&#x2F;1.1&quot; リーク）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;上下2基（1&#x2F;1.28&quot;）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1基&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;重量&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;377g以上の見込み&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;249g&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;377g&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;飛行時間&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;未公表&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;24分〜39分&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;約23分&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;障害物検知&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;前方+側方+下方&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;前方+下方&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;前方+下方&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;操作系&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;Goggles N3 + RC Motion 3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;Vision + Grip&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;Goggles 3 + RC Motion 3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;映像性能ではAvata 360にアドバンテージがありますが、
249gという軽量さはAntigravity A1の大きな強みです。
なお飛行時間は標準バッテリー（249g）で24分、
大容量バッテリー（291g）で39分となっています。&lt;&#x2F;p&gt;
&lt;p&gt;中国市場向けの価格表（CNY）もリークされています。
以下はCNY価格をベースにした推定値であり、
実際の各国販売価格とは異なる可能性があります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;バンドル&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Avata 360（予想）&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Antigravity A1&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;機体のみ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;約$435&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;標準バンドル&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;約$575（RC2）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fly More Combo&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;約$999&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;$1,599（Grip + Vision）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Goggles N3 Combo&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;約$825&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Antigravity A1はGripモーションコントローラーと
Visionゴーグルのセットで$1,599からです。
スティック型コントローラーには対応していません。
Avata 360はGoggles N3やRC2との互換性が維持される
ため、既にDJIのエコシステムを持っているユーザーは
機体だけ購入すればよく、価格面で大きな
アドバンテージがあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Air 3Sで空撮を楽しみ、NeoでFPVも体験してきた
身としては、360度撮影とFPVを一台でこなせる
Avata 360は非常に気になる存在です。
「まず飛ばして、後から構図を決める」という
新しいワークフローが空撮の可能性をどこまで
広げてくれるのか、正式発表を楽しみに
待ちたいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dronexl.co&#x2F;&quot;&gt;DroneXL&lt;&#x2F;a&gt;. &quot;The Real DJI AVATA 360 Leaks&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dronexl.co&#x2F;&quot;&gt;DroneXL&lt;&#x2F;a&gt;. &quot;DJI Avata 360 Price Leak&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.dailycameranews.com&#x2F;&quot;&gt;Daily Camera News&lt;&#x2F;a&gt;. &quot;DJI Avata 360 Drone Rumors: 2026 Release, Specs, Price&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Antigravity. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.antigravity.tech&#x2F;us&#x2F;drone&#x2F;antigravity-a1&#x2F;specs&quot;&gt;Antigravity A1 Specs&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">DJI Avata 360の正式発表が近づいています。ベータアプリからインストラクション動画が発見され、レビュアーへの実機配布も始まっているようです。FPVと360度撮影を一台に統合した注目機体のリーク情報を整理します。
</summary>
        </entry><entry xml:lang="en">
        <title>なぜAnthropicは排除されたのか</title>
        <published>2026-03-02T08:37:01+09:00</published>
        <updated>2026-03-02T08:37:01+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/anthropic/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/anthropic/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;anthropic&amp;#x2F;cover.webp?h=62193dfe24215475f54a&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;経緯&quot;&gt;経緯&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;政府・防衛市場への参入&quot;&gt;政府・防衛市場への参入&lt;&#x2F;h3&gt;
&lt;p&gt;Anthropicは排除以前から米国政府・防衛市場に深く関与していました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2024年11月にPalantir&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-palantir-1&quot;&gt;&lt;a href=&quot;#fn-palantir&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;・AWSと三社提携を結び、最高機密レベル（IL-6）認証環境でClaudeを情報機関・国防機関に提供を開始&lt;&#x2F;li&gt;
&lt;li&gt;2025年6月にはAmazon Bedrock&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-bedrock-1&quot;&gt;&lt;a href=&quot;#fn-bedrock&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;上のClaudeが連邦政府の高セキュリティ基準の認証&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-fedramp-1&quot;&gt;&lt;a href=&quot;#fn-fedramp&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を取得し、同年7月にはCDAO（最高デジタル・AI責任者室）と最大2億ドルのPrototype OTA契約&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-ota-1&quot;&gt;&lt;a href=&quot;#fn-ota&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を締結&lt;&#x2F;li&gt;
&lt;li&gt;2025年8月にはGSA&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-gsa-1&quot;&gt;&lt;a href=&quot;#fn-gsa&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;とのOneGov協定で連邦政府全体に年間1ドルでClaude for Governmentを提供&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
  &lt;summary&gt;情報元&lt;&#x2F;summary&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Palantir. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;investors.palantir.com&#x2F;news-details&#x2F;2024&#x2F;Anthropic-and-Palantir-Partner-to-Bring-Claude-AI-Models-to-AWS-for-U.S.-Government-Intelligence-and-Defense-Operations&#x2F;&quot;&gt;Anthropic and Palantir Partner to Bring Claude AI Models to AWS for U.S. Government Intelligence and Defense Operations&lt;&#x2F;a&gt;&quot;. 2024-11-07&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;claude-in-amazon-bedrock-fedramp-high&quot;&gt;Claude in Amazon Bedrock achieves FedRAMP High authorization&lt;&#x2F;a&gt;&quot;. 2025-06-11&lt;&#x2F;li&gt;
&lt;li&gt;AWS. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;about-aws&#x2F;whats-new&#x2F;2025&#x2F;05&#x2F;amazon-bedrock-models-fedramp-high-dod-il-4-5-govcloud&#x2F;&quot;&gt;Amazon Bedrock models achieve FedRAMP High and DoD IL 4&#x2F;5&lt;&#x2F;a&gt;&quot;. 2025-05-23&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;anthropic-and-the-department-of-defense-to-advance-responsible-ai-in-defense-operations&quot;&gt;Anthropic and the Department of Defense to advance responsible AI in defense operations&lt;&#x2F;a&gt;&quot;. 2025-07-14&lt;&#x2F;li&gt;
&lt;li&gt;GSA. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gsa.gov&#x2F;about-us&#x2F;newsroom&#x2F;news-releases&#x2F;gsa-strikes-onegov-deal-with-anthropic-08122025&quot;&gt;GSA Strikes OneGov Deal with Anthropic&lt;&#x2F;a&gt;&quot;. 2025-08-12&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;offering-expanded-claude-access-across-all-three-branches-of-government&quot;&gt;Offering expanded Claude access across all three branches of government&lt;&#x2F;a&gt;&quot;. 2025-08-12&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;

&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;対立の構図&quot;&gt;対立の構図&lt;&#x2F;h3&gt;
&lt;p&gt;対立の構図は、以下のようなものだったと推定します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AnthropicのAUP（利用規約）には、兵器開発への利用、戦場管理アプリケーション、同意のない個人の追跡・監視など、軍事利用に関する複数の制限が含まれる。国防総省との契約にも同様の利用上の制約が存在していたと考えられる&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-aup-1&quot;&gt;&lt;a href=&quot;#fn-aup&quot;&gt;6&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;li&gt;2026年1月3日、米軍によるベネズエラのマドゥロ拿捕作戦が実行される。Semaforの報道によれば、この作戦でClaudeが使用され、Anthropicの上級幹部が定期ミーティングの場でPalantirの上級幹部に使用の有無を問い合わせたとされる。&lt;&#x2F;li&gt;
&lt;li&gt;Semaforによれば、Palantirはこの問い合わせを国防総省に報告した。ただし、Anthropicはこの報道を「虚偽」と明確に否定しており、「技術的事項に関するルーティンな議論以外で、業界パートナーとこの件について議論したり懸念を表明したりしたことはない」と述べる。&lt;&#x2F;li&gt;
&lt;li&gt;報道の真偽はともかく、国防総省側の懸念は明確で、ヘグセス国防長官は2026年1月9日付のメモ「Artificial Intelligence Strategy for the Department of War」で、「合法的な軍事用途を制限する可能性のある使用ポリシー上の制約がないモデル」を活用するよう省内に指示。AIベンダーが利用上の制約を根拠にサービスを制限・停止しうる状況を解消する意図と読める。&lt;&#x2F;li&gt;
&lt;li&gt;これがAnthropicに対する直接的な要求に発展。国防総省はAnthropicにClaudeを「あらゆる合法的目的」に使用できるよう求め、2月27日を期限とする最後通牒を行なう&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic CEO Dario Amodeiは2月26日付の公式声明で「良心に従い、彼らの要求に応じることはできない」と拒否を表明&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
  &lt;summary&gt;情報元&lt;&#x2F;summary&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;legal&#x2F;aup&quot;&gt;Usage Policy&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Semafor. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.semafor.com&#x2F;article&#x2F;02&#x2F;17&#x2F;2026&#x2F;palantir-partnership-is-at-heart-of-anthropic-pentagon-rift&quot;&gt;Exclusive: Palantir partnership is at heart of Anthropic, Pentagon rift&lt;&#x2F;a&gt;&quot;. 2026-02-17&lt;&#x2F;li&gt;
&lt;li&gt;NBC News. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nbcnews.com&#x2F;tech&#x2F;security&#x2F;anthropic-ai-defense-war-venezuela-maduro-rcna259603&quot;&gt;Tensions between the Pentagon and AI giant Anthropic reach a boiling point&lt;&#x2F;a&gt;&quot;. 2026-02&lt;&#x2F;li&gt;
&lt;li&gt;Lawfare. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lawfaremedia.org&#x2F;article&#x2F;hegseth-memo-instructs-defense-dept.-to-use-military-ai-platform&quot;&gt;Hegseth Memo Instructs Defense Dept. to Use Military AI Platform&lt;&#x2F;a&gt;&quot;. 2026-01&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;statement-department-of-war&quot;&gt;Statement from Dario Amodei on Department of War Discussions&lt;&#x2F;a&gt;&quot;. 2026-02-26&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;

&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;排除命令&quot;&gt;排除命令&lt;&#x2F;h3&gt;
&lt;p&gt;翌2月27日、トランプ大統領は全連邦機関にAnthropicの即時利用停止を命じ、ヘグセス長官はAnthropicを「サプライチェーン安全保障上のリスク」に指定しました。&lt;&#x2F;p&gt;
&lt;p&gt;この「サプライチェーンリスク」指定は、これまで下表のような外国の敵対国に関連する企業にのみ適用されてきた措置です。米国企業への適用は前例がありません。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;企業&lt;&#x2F;th&gt;&lt;th&gt;国&lt;&#x2F;th&gt;&lt;th&gt;対象&lt;&#x2F;th&gt;&lt;th&gt;措置&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Huawei &#x2F; ZTE&lt;&#x2F;td&gt;&lt;td&gt;中国&lt;&#x2F;td&gt;&lt;td&gt;通信機器&lt;&#x2F;td&gt;&lt;td&gt;連邦調達禁止&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kaspersky Lab&lt;&#x2F;td&gt;&lt;td&gt;ロシア&lt;&#x2F;td&gt;&lt;td&gt;ウイルス対策ソフト&lt;&#x2F;td&gt;&lt;td&gt;米国内での販売・更新を全面禁止&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hikvision &#x2F; Dahua&lt;&#x2F;td&gt;&lt;td&gt;中国&lt;&#x2F;td&gt;&lt;td&gt;監視カメラ&lt;&#x2F;td&gt;&lt;td&gt;連邦調達禁止&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;TikTok &#x2F; ByteDance&lt;&#x2F;td&gt;&lt;td&gt;中国&lt;&#x2F;td&gt;&lt;td&gt;SNSアプリ&lt;&#x2F;td&gt;&lt;td&gt;売却命令、アプリストア禁止&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;指定の法的根拠は10 U.S.C. § 3252（国防総省のサプライチェーンリスク管理権限）とみられますが、この条文の適用範囲はDoD調達契約に限定されています。法律専門家からは、ヘグセス長官による「すべての商業取引の禁止」という解釈は法の範囲を大幅に超えている可能性が高いとの指摘が出ており、Anthropicも法的異議申し立てを表明しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
  &lt;summary&gt;情報元&lt;&#x2F;summary&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Donald Trump. Truth Social post（全連邦機関へのAnthropic即時利用停止指示）. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;Pete Hegseth (@SecWar). &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;SecWar&#x2F;status&#x2F;2027507717469049070&quot;&gt;This week, Anthropic delivered a master class in arrogance...&lt;&#x2F;a&gt;&quot;. X. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;statement-comments-secretary-war&quot;&gt;Statement on the comments from Secretary of War Pete Hegseth&lt;&#x2F;a&gt;&quot;. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;U.S. Code. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uscode.house.gov&#x2F;view.xhtml?req=granuleid:USC-prelim-title10-section3252&quot;&gt;10 U.S.C. § 3252 — Supply chain risk&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;

&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;争点_—_2つのレッドライン&quot;&gt;争点 — 2つのレッドライン&lt;&#x2F;h2&gt;
&lt;p&gt;今回の対立の核心にあったのは、次の2つのレッドラインです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;完全自律型兵器への使用禁止（&lt;strong&gt;技術的限界&lt;&#x2F;strong&gt;：現在のAIでは信頼性が不十分）&lt;&#x2F;li&gt;
&lt;li&gt;米国市民の大規模監視への使用禁止（&lt;strong&gt;倫理的原則&lt;&#x2F;strong&gt;：民主的価値と相容れない）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの制限はAnthropic独自のものではありません。&lt;&#x2F;p&gt;
&lt;p&gt;完全自律型兵器については、現在のフロンティアAIは殺傷に関わる判断を独立して行えるほど信頼性が確立されていないという技術的認識に基づいた制約です。
この認識は業界全体で共有されており、実際Anthropicに代わりペンタゴンと契約を結んだOpenAIも、自律型兵器禁止・大規模監視禁止を含む同様のセーフガードを契約条件に盛り込んでいます。&lt;&#x2F;p&gt;
&lt;p&gt;大規模監視については、生成AIが市民監視に繋がる潜在的なリスクを排除するため倫理的な理由で設けられた制約です。こちらも、主要AI企業の利用規約には類似の制限が含まれています。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、 &lt;strong&gt;レッドラインの内容自体は生成AI業界では一般的な制約事項であり、Anthropicだけが特異な主張をしていたわけではありません&lt;&#x2F;strong&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicがこれらの制約の遵守に特に強く拘った背景には、同社固有の事情があります。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicは2021年、Dario AmodeiとDaniela Amodeiが「AI開発においてスケーリングと安全性を両立させるべきだ」という立場からOpenAIを離れて設立した企業です。「人類の長期的な利益のための先進AIの責任ある開発と維持」をミッションに掲げ、AI安全性を企業の中核に据えています。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、同社はデラウェア州のPublic Benefit Corporation（公益法人）として設立されており、株主利益だけでなく社会的便益の実現を法的義務として負っています。加えて、Long-Term Benefit Trust（LTBT）という独自のガバナンス機構を設けており、AI安全・公共政策の専門家5名が取締役選任・解任権を持つ構造になっています。AmazonやGoogleといった大口投資家も議決権株式を保有していません。この構造により、Anthropicは「民主的価値と相容れない用途を拒否すること」を単なる経営判断ではなく、制度に根ざした義務として説明できる立場にあります。&lt;&#x2F;p&gt;
&lt;p&gt;こうした設立理念と制度的構造が相まって、Anthropicは国防総省の要求に対して譲歩できなかったと考えられます。CEO Amodeiは2月26日の公式声明で「我々は愛国的なアメリカ人であり、米国の防衛に貢献する意思がある」としつつも、「良心に従い、彼らの要求に応じることはできない」と拒否を表明しました。なお、ウクライナで使用されているような部分的自律兵器については防衛に不可欠として支持しており、すべての軍事利用を拒否しているわけではありません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
  &lt;summary&gt;情報元&lt;&#x2F;summary&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;company&quot;&gt;Company&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;core-views-on-ai-safety&quot;&gt;Core Views on AI Safety&lt;&#x2F;a&gt;&quot;. 2023&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;the-long-term-benefit-trust&quot;&gt;The Long-Term Benefit Trust&lt;&#x2F;a&gt;&quot;. 2023&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;statement-department-of-war&quot;&gt;Statement from Dario Amodei on Department of War Discussions&lt;&#x2F;a&gt;&quot;. 2026-02-26&lt;&#x2F;li&gt;
&lt;li&gt;OpenAI. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openai.com&#x2F;index&#x2F;our-agreement-with-the-department-of-war&#x2F;&quot;&gt;Our agreement with the Department of War&lt;&#x2F;a&gt;&quot;. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;Dario Amodei. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;darioamodei.com&#x2F;essay&#x2F;machines-of-loving-grace&quot;&gt;Machines of Loving Grace&lt;&#x2F;a&gt;&quot;. 2024-10&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;

&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;なぜAnthropicが排除され、OpenAIが選ばれたのか&quot;&gt;なぜAnthropicが排除され、OpenAIが選ばれたのか&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropic排除と同日の2月27日、OpenAIはペンタゴンと新たな契約を締結しました。前節で述べたとおり、2つのレッドライン（自律型兵器禁止・大規模監視禁止）は業界共通の制約であり、OpenAIも同様の原則を掲げています。では、なぜAnthropicだけが排除されたのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;国防総省は両社に対し、AIを「あらゆる合法的目的（any lawful purpose）」に使用できるよう求めました。2つのレッドラインに対する両社の対応は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;完全自律型兵器への使用禁止（技術的限界）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anthropic&lt;&#x2F;strong&gt; — 契約条項として自律型兵器への使用を明示的に禁止し、違反時にはサービスを停止できる形を求める。「あらゆる合法的目的」という文言はこの禁止と矛盾するとして拒否している。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;&#x2F;strong&gt; —「あらゆる合法的目的」を受け入れた。自律型兵器禁止については、契約上の明示的禁止ではなく、モデルがタスクを拒否した場合に利用者が強制できない仕組みなどの技術的セーフガードで担保するアプローチを取った。Altman CEOはX上のAMA&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-ama-1&quot;&gt;&lt;a href=&quot;#fn-ama&quot;&gt;7&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;で「We accepted the &#x27;all lawful uses&#x27; language proposed by the Department」と明言している。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;米国市民の大規模監視への使用禁止（倫理的原則）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anthropic&lt;&#x2F;strong&gt; — 大規模監視の禁止に加え、公開情報の大規模収集・統合も実質的な監視になりうるとして、その明示的禁止を契約に盛り込むよう求めた。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;&#x2F;strong&gt; — 大規模監視禁止を原則として掲げているが、その担保は憲法修正第4条や外国情報監視法（FISA）など既存の法律への参照で行っている。Anthropicが求めた公開情報の大規模収集の明示的禁止は含まれない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;両社の違いは、レッドラインの内容ではなく担保の方法にあります。Anthropicは契約条項による明示的禁止を求め、OpenAIは既存の法律への参照と技術的手段で対処しました。この違いは両社の公式声明で確認できます。ただし、契約の完全な文言は非公開のため、技術的セーフガードが契約上の禁止と同等の保護を提供するかどうかは検証できません。&lt;&#x2F;p&gt;
&lt;p&gt;こうした契約アプローチの違いに加え、政治的背景も無視できません。Anthropic CEO Amodeiは連邦選挙委員会（FEC）の公開記録によれば民主党候補への寄付を継続的に行っており、2024年大統領選ではハリス前副大統領を公式に支持しています。トランプ大統領はTruth Socialへの投稿でAnthropicを「RADICAL LEFT, WOKE COMPANY」と呼びました。一方、OpenAIはStargate計画（5000億ドル規模のAIインフラ投資、2025年1月にトランプ大統領自ら発表）の中核パートナーであり、Altman CEOはトランプの就任基金に100万ドルを個人寄付しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
  &lt;summary&gt;情報元&lt;&#x2F;summary&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;OpenAI. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openai.com&#x2F;index&#x2F;our-agreement-with-the-department-of-war&#x2F;&quot;&gt;Our agreement with the Department of War&lt;&#x2F;a&gt;&quot;. 2026-02-28&lt;&#x2F;li&gt;
&lt;li&gt;Sam Altman (@sama). &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;sama&#x2F;status&#x2F;2027578652477821175&quot;&gt;Tonight, we reached an agreement with the Department of War...&lt;&#x2F;a&gt;&quot;. X. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;Sam Altman (@sama). AMA on Pentagon deal. X. 2026-03-01&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;statement-department-of-war&quot;&gt;Statement from Dario Amodei on Department of War Discussions&lt;&#x2F;a&gt;&quot;. 2026-02-26&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;statement-comments-secretary-war&quot;&gt;Statement on the comments from Secretary of War Pete Hegseth&lt;&#x2F;a&gt;&quot;. 2026-02-27&lt;&#x2F;li&gt;
&lt;li&gt;FEC. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fec.gov&#x2F;data&#x2F;receipts&#x2F;individual-contributions&#x2F;?contributor_name=dario+amodei&quot;&gt;Individual contributions — Dario Amodei&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;The White House. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.whitehouse.gov&#x2F;briefings-statements&#x2F;2025&#x2F;01&#x2F;the-stargate-project&#x2F;&quot;&gt;The Stargate Project&lt;&#x2F;a&gt;&quot;. 2025-01-21&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;

&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;技術者から見た影響&quot;&gt;技術者から見た影響&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;Claude_使用継続の是非&quot;&gt;Claude 使用継続の是非&lt;&#x2F;h3&gt;
&lt;p&gt;今回のサプライチェーンリスクの指定により、一般の企業でのClaude利用に何らかの影響がでるのではないかという懸念があります。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropic自身の声明（2&#x2F;27）では、10 U.S.C. § 3252に基づくサプライチェーンリスク指定は「国防総省の契約に限定され、他の顧客へのClaude提供に
は影響しない」と主張しています。更にAnthropicはこの決定自体を法的に争う姿勢を示しており、その法廷闘争の決着時期は不明です。
法的には民間企業への波及はないはずです。
ただし「安全保障上のリスク」と名指しされた企業の生成AIについては、多くの日本の顧客が懸念を抱くでしょう。
特にエージェント型で先進的なClaudeとなると、組織内で使用継続の是非について議論となる可能性があります。事前に合意を形成しておく必要があります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;「政治リスク」という評価軸&quot;&gt;「政治リスク」という評価軸&lt;&#x2F;h3&gt;
&lt;p&gt;この直接的な影響に加え、より広い視点では、AIベンダーの選定に「政治リスク」という新たな評価軸が加わったことを意味します。&lt;&#x2F;p&gt;
&lt;p&gt;これまでAIモデルの選定基準は、性能・コスト・APIの安定性といった技術的要素が中心でした。しかしベンダーの政治的立場や政府との関係によって、ある日突然サービス利用できなくなるリスクが現実化したのです。AIモデルに深く依存しているシステムは、こうした非技術的要因による中断に対して脆弱になります。&lt;&#x2F;p&gt;
&lt;p&gt;特定のAIベンダーへの依存度を意識し、必要に応じて別のモデルやエージェントに切り替えられる体制を整えておくことが重要になります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;今回の件で生成AIの選定を変えるべきか&quot;&gt;今回の件で生成AIの選定を変えるべきか&lt;&#x2F;h3&gt;
&lt;p&gt;報道ではAnthropicは善良な企業、OpenAIは政権に迎合したように描かれがちですが、この構図に引きずられて生成AIの選定判断を大きく変える必要はないと考えます。&lt;&#x2F;p&gt;
&lt;p&gt;今回の政府契約において両社を分けたのは、2つのレッドライン（技術的限界と倫理的原則）の内容ではなく、その担保方法の違い — 契約条項による明示的禁止か、技術的セーフガードによる制限か — でした。加えて、各社の政治的背景が排除の規模と速度に影響した可能性もあります。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、商用利用においてはこの分岐点は当てはまりません。AnthropicとOpenAIはいずれも、AUPによる契約的制約とモデル自体のタスク拒否による技術的制約を備えています。政府契約のように「あらゆる合法的目的」を受け入れるかどうかという択一を迫られる場面は、一般の利用者には生じません。&lt;&#x2F;p&gt;
&lt;p&gt;技術的限界と倫理的原則に関するレッドラインは業界共通であり、どちらのベンダーを選んでもその点は変わりません。今回の一件は、米国政府との契約交渉という特殊な文脈で起きた対立であり、民間での生成AI選定の基準を根本から見直す理由にはなりません。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-palantir&quot;&gt;
&lt;p&gt;Palantir Technologies — 米国の防衛・情報機関向けデータ分析企業。CIAの投資部門In-Q-Telの出資で設立され、軍・情報機関に深いパイプを持つ。 &lt;a href=&quot;#fr-palantir-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-bedrock&quot;&gt;
&lt;p&gt;Amazon Bedrock — AWSが提供するフルマネージド型の基盤モデルサービス。ClaudeやLlama等のAIモデルをAPI経由で利用できる。AWS GovCloud（米国政府専用のクラウド環境）リージョンでの提供により政府機関の利用が可能になる。 &lt;a href=&quot;#fr-bedrock-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-fedramp&quot;&gt;
&lt;p&gt;FedRAMP HighおよびDoD IL4&#x2F;5。FedRAMPは連邦政府のクラウドサービスに求められるセキュリティ認証制度で、Highは機密性の高いデータを扱える最上位区分。IL4&#x2F;5は国防総省が定める影響レベルで、管理対象の非機密情報や国家安全保障関連データの処理が許可される。 &lt;a href=&quot;#fr-fedramp-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-ota&quot;&gt;
&lt;p&gt;Prototype OTA（Other Transaction Agreement）— 通常の連邦調達規則（FAR）を経由しない柔軟な契約形式。プロトタイプ開発を目的とし、迅速な契約締結が可能なため、国防総省が先端技術の実証に多用している。 &lt;a href=&quot;#fr-ota-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-gsa&quot;&gt;
&lt;p&gt;GSA（General Services Administration、一般調達局）— 米連邦政府の調達を一元管理する機関。GSAスケジュール契約を通じて各省庁が製品・サービスを購入する仕組みを運営している。 &lt;a href=&quot;#fr-gsa-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-aup&quot;&gt;
&lt;p&gt;商用AUPがそのまま政府契約に適用されていたかどうかは公開情報からは確認できていません。 &lt;a href=&quot;#fr-aup-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-ama&quot;&gt;
&lt;p&gt;AMA（Ask Me Anything）— SNS上で質問を受け付け回答する形式の公開Q&amp;amp;A。 &lt;a href=&quot;#fr-ama-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">2026年2月、トランプ政権はAnthropicを米国政府から排除し、
OpenAIと新たな契約を締結しました。両社とも同じ安全性の原則を
掲げていたにもかかわらず、なぜ明暗が分かれたのか。
経緯と争点を一次ソースから整理し、技術者への影響を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>Flash&#x27;s Theme (Queen Cover)</title>
        <published>2026-03-01T20:34:29+09:00</published>
        <updated>2026-03-01T20:34:29+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/flash-theme/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/flash-theme/</id>
        
            <content type="html">&lt;p&gt;1980年公開の映画「フラッシュ・ゴードン」のサウンドトラックに収録されたQueenの「Flash&#x27;s Theme」をカバーしてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2275428401&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;flashs-theme-queen-cover&quot; title=&quot;Flash&amp;#x27;s Theme (Queen Cover)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Flash&amp;#x27;s Theme (Queen Cover)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;「The Game」「Another One Bites the Dust」で商業的・音楽的にピークを迎えていた時期の作品です。ブライアン・メイのギター、フレディ・マーキュリーの圧倒的なボーカル、そしてQueenならではの分厚いコーラスワーク。その後の低迷期を前にした、まさに絶頂期のQueenのエネルギーを感じる曲です。残念ながら映画自体は駄作でしたが。&lt;&#x2F;p&gt;
&lt;p&gt;原曲に少しでも近づけることを目指して演奏しマスタリングしました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">1980年公開の映画「フラッシュ・ゴードン」から、
Queenの「Flash&#x27;s Theme」をギターでカバーしました。
絶頂期のQueenが放つエネルギーに少しでも近づくことを目指しています。
</summary>
        </entry><entry xml:lang="en">
        <title>CLS改善のためにZolaの画像ショートコードを自作した</title>
        <published>2026-03-01T06:35:31+09:00</published>
        <updated>2026-03-01T06:35:31+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/03/zola-robust-image-shortcode/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/03/zola-robust-image-shortcode/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;CLSとは&quot;&gt;CLSとは&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflare Pagesにブログを移行したことで、Cloudflare Web Analyticsが利用できるようになりました。アクセス数だけでなくCore Web Vitalsの各指標も確認できるのですが、そのなかでCLS（Cumulative Layout Shift）のスコアが気になる結果でした。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;03&amp;#x2F;zola-robust-image-shortcode&amp;#x2F;cls.webp?h=a3143d5feda5b00f4198&quot;
  alt=&quot;CLS&quot; width=&quot;733&quot; height=&quot;621&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;figcaption&gt;Cloudflare Web Analytics画面&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Core Web VitalsはGoogleが提唱するWebページのユーザー体験を測定する指標群で、LCP（Largest Contentful Paint：読み込み速度）、INP（Interaction to Next Paint：応答性）、CLS（Cumulative Layout Shift：視覚的安定性）の3つで構成されます。いずれもGoogleの検索ランキングに影響するため、サイト運営者にとって無視できない指標です。&lt;&#x2F;p&gt;
&lt;p&gt;CLSはページの読み込み中にコンテンツが予期せずずれる現象を数値化したもので、0.1以下が「良好」とされています。CLSが悪化する代表的な原因は、画像や広告などの要素にサイズ（&lt;code&gt;width&lt;&#x2F;code&gt;と&lt;code&gt;height&lt;&#x2F;code&gt;）が指定されていないことです。サイズが未指定の画像は、読み込まれるまでブラウザが表示領域を確保できません。画像の読み込みが完了した瞬間にページ全体がガクッとずれてしまい、ユーザーが読んでいた箇所を見失うことになります。&lt;&#x2F;p&gt;
&lt;p&gt;私のブログを調べてみると、ほぼすべての記事画像に&lt;code&gt;width&lt;&#x2F;code&gt;と&lt;code&gt;height&lt;&#x2F;code&gt;が設定されていませんでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;画像要素の改善&quot;&gt;画像要素の改善&lt;&#x2F;h2&gt;
&lt;p&gt;このブログは静的サイトジェネレーターのZolaを使用しており、記事はMarkdownで書いています。Markdownの画像記法は以下のとおりですが、&lt;code&gt;width&lt;&#x2F;code&gt;や&lt;code&gt;height&lt;&#x2F;code&gt;などのメタ情報を記述する手段がありません&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-link&quot;&gt;![&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;カバー画像&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;cover.jpg&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;そこでZolaのショートコードを利用して、画像サイズなどのメタ情報を自動でセットする仕組みを作りました。以下はコードの抜粋です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot; data-name=&quot;templates&#x2F;shortcodes&#x2F;image.html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        This supports the co-location pattern where content and&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        assets live in the same directory. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set colocated_path = page.colocated_path | default(value=&amp;quot;&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set resolved_path = colocated_path ~ src -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set meta = get_image_metadata(path=resolved_path, allow_missing=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- if meta -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Zolaの&lt;code&gt;get_image_metadata&lt;&#x2F;code&gt;関数はビルド時に画像ファイルを読み取り、幅と高さを返してくれます。これを利用して&lt;code&gt;width&lt;&#x2F;code&gt;と&lt;code&gt;height&lt;&#x2F;code&gt;を&lt;code&gt;img&lt;&#x2F;code&gt;要素に指定しています。あわせて&lt;code&gt;get_url&lt;&#x2F;code&gt;関数の&lt;code&gt;cachebust=true&lt;&#x2F;code&gt;オプションでファイルのハッシュ値をURLに付与し、キャッシュバスティングにも対応しました。&lt;&#x2F;p&gt;
&lt;p&gt;あとはHTMLの&lt;code&gt;img&lt;&#x2F;code&gt;要素として画像サイズが出力されるように組み立てるだけです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot; data-name=&quot;templates&#x2F;shortcodes&#x2F;image.html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  {%- if meta and meta.width %} width=&amp;quot;{{ meta.width }}&amp;quot;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  {%- if meta and meta.height %} height=&amp;quot;{{ meta.height }}&amp;quot;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  {%- if lazy_loading %} loading=&amp;quot;lazy&amp;quot;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if link_to_self %}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{{ caption_text }}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;この結果、記事には以下のように書くだけで、画像サイズとキャッシュバスティングに対応した&lt;code&gt;img&lt;&#x2F;code&gt;要素を自動出力できるようになりました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{{ image(src=&amp;quot;cover.jpg&amp;quot;, alt=&amp;quot;カバー画像&amp;quot;) }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Zola依存にはなりますが、記述を複雑にせずCLS対策ができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;figure対応&quot;&gt;figure対応&lt;&#x2F;h2&gt;
&lt;p&gt;記事内の画像にキャプションを付けたい場合もあります。そこで&lt;code&gt;caption&lt;&#x2F;code&gt;パラメータが指定された場合には、&lt;code&gt;img&lt;&#x2F;code&gt;要素を&lt;code&gt;figure&lt;&#x2F;code&gt;要素で囲み、&lt;code&gt;figcaption&lt;&#x2F;code&gt;要素でキャプションを出力するようにしました。&lt;code&gt;caption&lt;&#x2F;code&gt;を省略した場合は従来どおり&lt;code&gt;img&lt;&#x2F;code&gt;要素のみを出力します。&lt;&#x2F;p&gt;
&lt;p&gt;以下がショートコードの全容です。&lt;&#x2F;p&gt;
&lt;details&gt;
  &lt;summary&gt;imageショートコード&lt;&#x2F;summary&gt;
&lt;!-- textlint-disable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot; data-name=&quot;templates&#x2F;shortcodes&#x2F;image.html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- ============================================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    image.html - Image shortcode for Zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    Copyright (c) 2026 Toshiyuki Yoshida&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    Released under the MIT License.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    https:&#x2F;&#x2F;opensource.org&#x2F;licenses&#x2F;MIT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     Repository: https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;blog-yostos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    Renders an &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; tag with automatic path resolution,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    image metadata (width&#x2F;height), cache busting, and lazy loading.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    Parameters:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;      src          - Image path or remote URL (required)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;      alt          - Alt text for accessibility (recommended)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;      caption      - Caption text displayed below the image (optional)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;                     When specified, wraps output in &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;      lazy_loading - Enable lazy loading (default: true)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;      link_to_self - Wrap the image in a link to the image file itself,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;                     opening in a new tab (default: false)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    ============================================================ -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- Strip leading &amp;quot;.&#x2F;&amp;quot; from src to normalize colocated paths&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    e.g. &amp;quot;.&#x2F;photo.jpg&amp;quot; -&amp;gt; &amp;quot;photo.jpg&amp;quot; -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- set src = src | trim_start_matches(pat=&amp;quot;.&#x2F;&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- ---- URL resolution ---- -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if src is starting_with(&amp;quot;http&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {#- Remote image: use src as-is. Metadata cannot be retrieved&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        for external URLs, so width&#x2F;height will not be set. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set image_url = src -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- else -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {#- Local image: first try resolving relative to the page&amp;#39;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        colocated directory (e.g. content&#x2F;blog&#x2F;my-post&#x2F;photo.jpg).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        This supports the co-location pattern where content and&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        assets live in the same directory. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set colocated_path = page.colocated_path | default(value=&amp;quot;&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set resolved_path = colocated_path ~ src -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- set meta = get_image_metadata(path=resolved_path, allow_missing=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- if meta -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {#- Colocated path resolved successfully -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {%- set image_url = get_url(path=resolved_path, cachebust=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- else -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {#- Fallback: treat src as an absolute path from the project root.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;            This handles images placed under the static&#x2F; directory,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;            e.g. src=&amp;quot;&#x2F;images&#x2F;shared.jpg&amp;quot; -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {%- set meta = get_image_metadata(path=src, allow_missing=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {%- if meta -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;            {%- set image_url = get_url(path=src, cachebust=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {%- else -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;            {#- Neither path worked. Output the URL anyway so the page&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;                does not break, but width&#x2F;height will be omitted.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;                This may indicate a missing or misspelled image path. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;            {%- set image_url = get_url(path=src, cachebust=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;        {%- endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    {%- endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- ---- Attribute defaults ---- -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- Default alt to empty string so the attribute is always present.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    An explicit alt=&amp;quot;&amp;quot; is valid for decorative images and is preferred&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    over omitting the attribute entirely for accessibility. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- set alt_text = alt | default(value=&amp;quot;&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- Lazy loading is enabled by default for better page performance -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- set lazy_loading = lazy_loading | default(value=true) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- Caption: when specified, wrap in &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- set caption_text = caption | default(value=&amp;quot;&amp;quot;) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- When enabled, wrap the image in a link to the image file itself,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;    opening in a new tab so the full-size image can be viewed alone. -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- set link_to_self = link_to_self | default(value=false) -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{#- ---- Output ---- -#}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if caption_text -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if link_to_self %}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ image_url }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; target&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;_blank&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;noopener&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{% endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ image_url }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  alt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ alt_text }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if meta and meta.width %} width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ meta.width }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if meta and meta.height %} height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ meta.height }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if lazy_loading %} loading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;lazy&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if link_to_self %}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{{ caption_text }}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figcaption&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- else -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if link_to_self %}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ image_url }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; target&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;_blank&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;noopener&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{% endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ image_url }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  alt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ alt_text }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if meta and meta.width %} width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ meta.width }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if meta and meta.height %} height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;{{ meta.height }}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;  {%- if lazy_loading %} loading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;lazy&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- if link_to_self %}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;{% endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{%- endif -%}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;  &lt;!-- textlint-enable --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;web.dev. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.dev&#x2F;articles&#x2F;cls&quot;&gt;Cumulative Layout Shift (CLS)&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;web.dev. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.dev&#x2F;articles&#x2F;vitals&quot;&gt;Core Web Vitals&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;Zola. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;content&#x2F;shortcodes&#x2F;&quot;&gt;Shortcodes&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Zola. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;templates&#x2F;overview&#x2F;#get-image-metadata&quot;&gt;Overview - get_image_metadata&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;ZolaはCommonMarkをベースとしたpulldown-cmarkというRustのライブラリ
を使用しているため画像にメタ情報を付与できませんが、Markdownの処理系によっては記述可能なものも存在します。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Zolaで構築したブログのCLS（Cumulative Layout Shift）を改善するため、画像サイズを自動取得するショートコードを作成しました。実装の詳細と、caption対応によるfigure要素の出力まで解説します。</summary>
        </entry><entry xml:lang="en">
        <title>八千代千本桜</title>
        <published>2026-02-27T20:15:00+09:00</published>
        <updated>2026-02-27T20:15:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/yachiyo-cherry-blossoms/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/yachiyo-cherry-blossoms/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;yachiyo-cherry-blossoms&amp;#x2F;cover.jpg?h=01b0b3221de124623edf&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;そろそろ河津桜が咲いている頃かなと思い、
八千代新川の千本桜を撮影に行ってきました。&lt;&#x2F;p&gt;
&lt;p&gt;近くの道の駅が改装中で駐車場が制限されており、
今年は開花情報が発信されていません。
仕方なく運頼みで撮影に挑みました。
まだ満開ではありませんでしたが
十分に楽しめました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;2z4e3ZYIMRg&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;前半はDJI Air 3Sで新川沿いの桜並木を
俯瞰で撮影し、
後半はDJI NEOで河津桜に近影で迫っています。
小型のNEOは桜の枝に寄れるので、
花びらの質感まで伝わる映像が撮れました。&lt;&#x2F;p&gt;
&lt;p&gt;本来は両岸に桜が咲いているのですが、
残念ながら片岸はまだ咲いていませんでした。
植えられている桜の種類が違うのかもしれません。
数年前の台風で倒木があり、
クラウドファンディングで植樹をしていると
聞いていたので、
植え替えられた若木が
これから咲く時期なのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;八千代新川千本桜は河津桜、陽光、
染井吉野と順番に咲いていくため、
時期をずらして何度も楽しむことができます。
道の駅やちよは改修中で駐車場が制限されており、
公共交通機関の利用が推奨されています。
勝田台駅などから米本団地バス停まで来ると
歩いて行ける距離です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;






  
    
      
    
  


&lt;div class=&quot;spot&quot;&gt;

  &lt;div class=&quot;spot-map&quot;&gt;
    &lt;div class=&quot;openstreetmap-wrapper&quot;&gt;
      &lt;div class=&quot;openstreetmap-container&quot;&gt;
        &lt;iframe id=&quot;osm-35.76044-140.10773&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
      &lt;&#x2F;div&gt;
      &lt;small class=&quot;osm-link&quot;&gt;
        &lt;a href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?mlat=35.76044&amp;mlon=140.10773#map=16&#x2F;35.76044&#x2F;140.10773&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
          大きな地図を表示
        &lt;&#x2F;a&gt;
      &lt;&#x2F;small&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;div&gt;

  
  &lt;div class=&quot;spot-info&quot;&gt;
    
      &lt;h4 class=&quot;spot-name&quot;&gt;新川千本桜&lt;&#x2F;h4&gt;
    

    &lt;dl class=&quot;spot-meta&quot;&gt;
      
        &lt;dt&gt;住所&lt;&#x2F;dt&gt;
        &lt;dd&gt;千葉県八千代市米本&lt;&#x2F;dd&gt;
      

      

      
        &lt;dt&gt;アクセス&lt;&#x2F;dt&gt;
        &lt;dd&gt;最寄りは米本団地バス停&lt;&#x2F;dd&gt;
      
    &lt;&#x2F;dl&gt;
  &lt;&#x2F;div&gt;
  

&lt;&#x2F;div&gt;

&lt;script&gt;
(function(){
  var a=35.76044,o=140.10773,z=16,
      d=180&#x2F;Math.pow(2,z),r=d*.56;
  document.getElementById(&quot;osm-35.76044-140.10773&quot;).src=
    &quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;export&#x2F;embed.html?bbox=&quot;
    +(o-d)+&quot;%2C&quot;+(a-r)+&quot;%2C&quot;+(o+d)+&quot;%2C&quot;+(a+r)
    +&quot;&amp;layer=mapnik&amp;marker=&quot;+a+&quot;%2C&quot;+o;
})();
&lt;&#x2F;script&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">八千代新川の千本桜をドローンで空撮しました。河津桜から陽光、染井吉野と順に咲き誇る桜並木を、DJI Air 3SとDJI NEOの映像でお届けします。</summary>
        </entry><entry xml:lang="en">
        <title>エージェント型AI組織導入の7つの前提条件 — ツールの前に土壌を整えよ</title>
        <published>2026-02-27T00:00:00+00:00</published>
        <updated>2026-02-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/ai-agent-org-adoption-prerequisites/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/ai-agent-org-adoption-prerequisites/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;ai-agent-org-adoption-prerequisites&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;ai-agent-org-adoption-prerequisites&amp;#x2F;cover.webp?h=08c6138791203946f525&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;この記事の前提&quot;&gt;この記事の前提&lt;&#x2F;h2&gt;
&lt;p&gt;「生成AI入れたいんだけど、今は何がいいの？」との問いに「エージェント型じゃないですかね」と。&lt;&#x2F;p&gt;
&lt;p&gt;そんな会話をした組織は皆さんが想像する100倍くらいITガバナンスの成熟度が低い。業務プロセスは属人的、ドキュメントは紙と口頭、セキュリティポリシーの管理者すら曖昧。そう簡単には進むはずはないと思いつつ、一応準備した資料をベースとしています。&lt;&#x2F;p&gt;
&lt;p&gt;つまり本記事は、ITガバナンスが成熟した組織に向けたものではありません。「うちの組織、正直そのへん全然できてないな」と心当たりがある方にこそ読んでいただきたい内容です。エージェント型AIは強力ですが、土壌が整っていない組織に入れても空回りするだけです。&lt;&#x2F;p&gt;
&lt;p&gt;Gartnerは2025年6月、「エージェント型AIプロジェクトの40%以上が2027年末までに中止される」と予測しています。その主因はコスト超過、不明確なビジネス価値、不十分なリスク管理であり、いずれも「技術」ではなく「組織の準備不足」に起因します。40%という数字を見て「うちは大丈夫」と思った方、たぶん大丈夫じゃないです。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、エージェント型AIの組織導入前に整えておくべき7つの前提条件を整理します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;チャット型とエージェント型は何が違うのか&quot;&gt;チャット型とエージェント型は何が違うのか&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIは、従来のチャット型生成AIとは本質的に異なります。チャット型は「質問して回答を得る」受動的なツールですが、エージェント型は「指示を受けて自律的にタスクを遂行する」能動的なシステムです。ファイルの読み書き、外部APIの呼び出し、ツールの実行といった操作をAIが自ら行います。&lt;&#x2F;p&gt;
&lt;p&gt;この違いはリスクの性質を根本的に変えます。チャット型では「不正確な回答」が主なリスクでしたが、エージェント型では「意図しない操作の実行」がリスクに加わります。だからこそ、組織としての準備が求められるのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;グローバルの導入状況&quot;&gt;グローバルの導入状況&lt;&#x2F;h2&gt;
&lt;p&gt;Deloitteの2025年調査によれば、エージェント型AIを本番環境で稼働させている組織はわずか11%にとどまっています。McKinseyが調査した2,000社のうち62%が「実験中」と回答していますが、その3分の2は意味のある展開には至っていません。McKinseyの調査では正式なAIガバナンスを導入済みの組織は17%にすぎず、導入済みの組織ほどエージェント型AIの展開に成功していると報告されています。&lt;&#x2F;p&gt;
&lt;p&gt;国内では、経済産業省・総務省の「AI事業者ガイドライン（第1.1版）」（2025年3月28日）において、AIエージェントについて「事故等の安全性面のリスクや過度な依存、労働者の失業等のリスクの複雑化・深刻化の可能性」が指摘されています。現時点ではエージェント型AI単体のガイドラインは未策定であり、第1.2版での対応が検討されている段階です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件1:_業務プロセスの言語化・構造化&quot;&gt;前提条件1: 業務プロセスの言語化・構造化&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIは「やりたいこと」をテキストで指示して動かすものです。コンセプトと方針を業務要件に落とし、業務要件を業務設計に落とすには、現行の業務プロセスが明文化されている必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;「あの人に聞けばわかる」状態の属人的な業務は、AIに指示を出すこともできません。業務の可視化・構造化は、エージェント型AI活用の大前提です。&lt;&#x2F;p&gt;
&lt;p&gt;McKinseyは「エージェント型組織」を提唱する中で、ガバナンスは定期的な紙ベースの運用ではなく、リアルタイムかつデータ駆動で埋め込まれたものでなければならないと述べています。これは業務プロセスの構造化がその大前提であることを意味します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件2:_テキストベースの業務遂行力&quot;&gt;前提条件2: テキストベースの業務遂行力&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIとの協業は本質的にテキストで行われます。口頭伝達と紙の回覧が主な伝達手段の組織では、エージェント型AIの導入以前の問題です。&lt;&#x2F;p&gt;
&lt;p&gt;SlackやTeamsでの指示・依頼を
自然にこなせること、
ドキュメントをテキストで書く習慣が
あることは最低限の土壌です。
特にMarkdownのような
構造化されたテキストを書く力は、
エージェント型AIと協業するうえで
最低限必要なスキルです。&lt;&#x2F;p&gt;
&lt;p&gt;プレーンテキストで構造化された文書を書く力は、
エージェント型AI時代の
基礎リテラシーと言えます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件3:_「正解をもらう」から「判断を自分でする」への意識転換&quot;&gt;前提条件3: 「正解をもらう」から「判断を自分でする」への意識転換&lt;&#x2F;h2&gt;
&lt;p&gt;チャット型AIを
「答えを教えてくれる便利なツール」として
使ってきた人が、エージェント型AIで
「指示を出して結果を評価する」立場に
移行するのは、ツールの違い以上に
思考様式の転換を伴います。&lt;&#x2F;p&gt;
&lt;p&gt;特に見落とされがちなのは
「AIの出力を評価・判断する力」です。
エージェント型AIの実行結果が
業務的に正しいか、
ビジネス上使えるかを判断できるのは
人間だけです。
この判断力なくして
エージェント型AIを導入することは、
ハンドルのない車を運転するに等しい行為です。&lt;&#x2F;p&gt;
&lt;p&gt;Gartnerは2026年の戦略予測で、
生成AIの利用による批判的思考力の低下に
警鐘を鳴らし、グローバル組織の50%が
「AIを使わない」スキル評価を
導入すると予測しています。
AIに依存しすぎず、
自ら判断する力を組織的に維持することが
不可欠です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件4:_情報セキュリティポリシーの再設計&quot;&gt;前提条件4: 情報セキュリティポリシーの再設計&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIはファイルの読み書き、
外部APIの呼び出し、ツールの実行をこなします。
従来のチャット型AIとは
リスクの性質が根本的に異なり、
「生成AIに社内情報を入力してよいか」
というレベルのポリシーでは対応できません。&lt;&#x2F;p&gt;
&lt;p&gt;必要なのは以下のような設計です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AIにどの範囲のファイルアクセスを
許可するか&lt;&#x2F;li&gt;
&lt;li&gt;AIが実行できるアクションの範囲を
どう制御するか&lt;&#x2F;li&gt;
&lt;li&gt;AIの操作ログをどう記録・監査するか&lt;&#x2F;li&gt;
&lt;li&gt;人間による承認が必要な操作の基準を
どう定めるか&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;セキュリティポリシーのオーナーシップを
明確にし、エージェント型AIのリスクへ
対応できるかたちに再設計する必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;McKinseyは、DevSecOpsが
デジタルデリバリーに
自動チェックを埋め込んだように、
エージェント型組織ではワークフローに
制御エージェントを埋め込むことを
提唱しています。
出力を検証するエージェント、
ポリシーを強制するエージェント、
コンプライアンスを監視するエージェントを
配置し、すべてのアクションを
リアルタイムでログ・説明可能にする
という構想です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件5:_試行錯誤を許容する組織文化&quot;&gt;前提条件5: 試行錯誤を許容する組織文化&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIの活用スキルは
試行錯誤でしか身につきません。
スキル獲得のパスは確立されておらず、
実践だけがパスです。
新しいやり方を試すこと自体が
歓迎されない組織文化では、
導入してもツールが放置されるだけです。&lt;&#x2F;p&gt;
&lt;p&gt;イノベーション普及理論が示すように、
新技術を積極的に採用するのは
組織の約2割です。
これは個人の意志だけでなく
組織の許容度にも起因します。
失敗にコストがかかる環境、
前例のないことを試すことに
心理的安全性がない環境では、
その2割さえも得られません。&lt;&#x2F;p&gt;
&lt;p&gt;Deloitteの調査では、
完全自律型AIエージェントへの信頼度は
27%にとどまり、
1年前の43%から低下しています。
成功している組織は、初期段階では
「human-in-the-loop」モデル
（人間がループに入る形）で
自律性を制限し、段階的に権限を拡大する
アプローチを採用しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件6:_段階的な導入設計&quot;&gt;前提条件6: 段階的な導入設計&lt;&#x2F;h2&gt;
&lt;p&gt;「AIは支援→AIと協業→AIを使役」
という段階があるように、
組織導入もその段階に沿うべきです。
いきなり全社でエージェント型を
展開するのではなく、
まずチャット型で「AIに問いかける」ことに
慣れた層から、
エージェント型での
「AIに仕事を任せる」段階へ移行させる設計が
現実的です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;段階&lt;&#x2F;th&gt;&lt;th&gt;AIの役割&lt;&#x2F;th&gt;&lt;th&gt;人間の役割&lt;&#x2F;th&gt;&lt;th&gt;導入のポイント&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;第1段階: AIは支援&lt;&#x2F;td&gt;&lt;td&gt;質問への回答、情報収集、文章の下書き&lt;&#x2F;td&gt;&lt;td&gt;方針決定、最終判断、成果物の品質確認&lt;&#x2F;td&gt;&lt;td&gt;ChatGPT Business &#x2F; Claude Team等の直接契約&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;第2段階: AIと協業&lt;&#x2F;td&gt;&lt;td&gt;業務設計の支援、複数ツールの連携&lt;&#x2F;td&gt;&lt;td&gt;要件定義、ワークフロー設計、出力評価&lt;&#x2F;td&gt;&lt;td&gt;特定業務でのパイロット運用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;第3段階: AIを使役&lt;&#x2F;td&gt;&lt;td&gt;自律的なタスク遂行、業務プロセスの自動化&lt;&#x2F;td&gt;&lt;td&gt;コンセプト設計、例外処理、ガバナンス&lt;&#x2F;td&gt;&lt;td&gt;ガバナンス体制の確立が前提&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Gartnerは、初期段階では
明確なROIが見込める領域に限定して
エージェント型AIを適用すべきと
推奨しています。
個別タスクの強化ではなく、
企業全体の生産性向上に焦点を当てることが
重要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件7:_トップ3モデルプロバイダーとの直接契約&quot;&gt;前提条件7: トップ3モデルプロバイダーとの直接契約&lt;&#x2F;h2&gt;
&lt;p&gt;エージェント型AIの本格導入において、
OpenAI・Anthropic・Googleといった
トップ3モデルプロバイダーとの直接契約は
重要な意思決定です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;why-genai-wrapper-services-are-a-trap&amp;#x2F;&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;上記の記事で詳述したとおり、APIラッパーに過ぎないサービスを間に挟むことには構造的な問題があります。Gartnerが警告する「エージェントウォッシング」（既存製品にエ
ージェントの看板を掛けてリブランディングする行為）の影響もあり、数千のエージェント型AIベンダーのうち真にエージェント型の能力を持つのは約130社にすぎないとされて
います。&lt;&#x2F;p&gt;
&lt;p&gt;「馴染みのベンダーに任せよう」という意思決定構造そのものが障壁になりえます。技術選定の根拠を非技術系の経営層に説明できる推進者が組織内にいることが前提です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;7つの前提条件のサマリー&quot;&gt;7つの前提条件のサマリー&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;&#x2F;th&gt;&lt;th&gt;前提条件&lt;&#x2F;th&gt;&lt;th&gt;対応しない場合のリスク&lt;&#x2F;th&gt;&lt;th&gt;緊急度&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;業務プロセスの言語化・構造化&lt;&#x2F;td&gt;&lt;td&gt;AIに指示を出せず、導入が空回りする&lt;&#x2F;td&gt;&lt;td&gt;即時対応が必要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;テキストベースの業務遂行力&lt;&#x2F;td&gt;&lt;td&gt;AIとの協業が成立しない&lt;&#x2F;td&gt;&lt;td&gt;即時対応が必要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;「判断を自分でする」意識転換&lt;&#x2F;td&gt;&lt;td&gt;AIに依存し、判断力が低下する&lt;&#x2F;td&gt;&lt;td&gt;中期的に育成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;セキュリティポリシーの再設計&lt;&#x2F;td&gt;&lt;td&gt;意図しない操作や情報漏洩のリスク&lt;&#x2F;td&gt;&lt;td&gt;即時対応が必要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;試行錯誤を許容する組織文化&lt;&#x2F;td&gt;&lt;td&gt;ツールが放置され、投資が無駄になる&lt;&#x2F;td&gt;&lt;td&gt;中期的に醸成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;段階的な導入設計&lt;&#x2F;td&gt;&lt;td&gt;Gartner予測の40%中止に該当する&lt;&#x2F;td&gt;&lt;td&gt;導入計画策定時&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;&#x2F;td&gt;&lt;td&gt;トップ3プロバイダーとの直接契約&lt;&#x2F;td&gt;&lt;td&gt;ラッパーサービスに依存し、機能・コストで劣後する&lt;&#x2F;td&gt;&lt;td&gt;導入計画策定時&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;おわりに_—_変化の時間は限られている&quot;&gt;おわりに — 変化の時間は限られている&lt;&#x2F;h2&gt;
&lt;p&gt;7つの前提条件は、いずれも「エージェント型AI」固有の話ではなく、組織の基礎体力の問題です。だからこそ、今から着手することに意味があります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;経済産業省の推計が示す2040年の事務職437万人余剰、Microsoft AI CEOの「18か月以内にほぼすべてのホワイトカラー業務がAIで自動化される」という発言。変化のスピードは推計よりもはるかに速い可能性があります。準備の時間は限られています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考資料&quot;&gt;参考資料&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Gartner &quot;Gartner Predicts Over 40% of Agentic AI Projects Will Be Canceled by End of 2027&quot; (2025年6月)&lt;&#x2F;li&gt;
&lt;li&gt;McKinsey &quot;The agentic organization: Contours of the next paradigm for the AI era&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;McKinsey &quot;CEO strategies for leading in the age of agentic AI&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;Deloitte &quot;Agentic AI enterprise adoption: Navigating key factors&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;Deloitte &quot;AI trends 2025: Adoption barriers and updated predictions&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;MIT Sloan Management Review &quot;The Emerging Agentic Enterprise&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;World Economic Forum &quot;Agentic AI: Overcoming 3 obstacles to adoption and innovation&quot; (2025年12月)&lt;&#x2F;li&gt;
&lt;li&gt;Gartner &quot;Strategic Predictions for 2026&quot; (2025年)&lt;&#x2F;li&gt;
&lt;li&gt;経済産業省・総務省「AI事業者ガイドライン（第1.1版）」(2025年3月)&lt;&#x2F;li&gt;
&lt;li&gt;IPA「テキスト生成AIの導入・運用ガイドライン」(2024年7月)&lt;&#x2F;li&gt;
&lt;li&gt;経済産業省「2040年の就業構造推計（改訂版）について」(2026年1月)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        <summary type="html">エージェント型AIを組織に導入する前に整えるべき7つの前提条件を整理します。業務プロセスの言語化からセキュリティポリシーの再設計まで、ITガバナンスが未成熟な組織こそ取り組むべき土壌づくりを解説します。</summary>
        </entry><entry xml:lang="en">
        <title>鹿島神宮 西の一之鳥居</title>
        <published>2026-02-26T15:26:15+09:00</published>
        <updated>2026-02-26T15:26:15+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/kashima-shrine/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/kashima-shrine/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;kashima-shrine&amp;#x2F;cover.jpg?h=f9caa8eca9677054570f&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;2月20日に常陸利根川（鰐川）で
ドローンを飛ばしてきました。
目当ては、神宮橋近くの水上に立つ
高さ18.5m・幅22.5mの朱色の鳥居です。&lt;&#x2F;p&gt;
&lt;p&gt;鹿島神宮の「西の一之鳥居」と呼ばれ、
広島の厳島神社の大鳥居を超える
日本最大の水上鳥居として知られています。
所在地は茨城県鹿嶋市大船津で、
東関東自動車道の潮来ICから
神宮橋を渡る際にその姿が目に入ります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;kashima-shrine&amp;#x2F;torii.jpg?h=4834e485db6ad9e99790&quot;
  alt=&quot;西の一之鳥居&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;江戸時代、大船津は水運の要衝であり
鹿島神宮参拝の玄関口でした。
この水上鳥居の景観は歌川広重の
『六十余州名所図会』にも描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;現在の鳥居は2013年6月に竣工したもので、
新日鐵住金製の耐候性鋼材が使われています。
旧鳥居の約2.5倍の規模に建て替えられました。
鹿島神宮には東西南北4つの一之鳥居があり、
その内側が神域とされています。&lt;&#x2F;p&gt;
&lt;p&gt;夕日に照らされた姿が特に美しく、
10月の鹿嶋市花火大会では
この鳥居の背後から花火が打ち上がります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">鹿島神宮「西の一之鳥居」をドローンで空撮しました。
常陸利根川の水上に立つ高さ18.5mの朱色の鳥居は、
水上鳥居として日本最大の規模を誇ります。
</summary>
        </entry><entry xml:lang="en">
        <title>ZolaブログにPagefindで日本語検索を導入した</title>
        <published>2026-02-26T07:58:30+09:00</published>
        <updated>2026-02-26T07:58:30+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/zola-pagefind-search/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/zola-pagefind-search/</id>
        
            <content type="html">&lt;h2 id=&quot;はじめに（Zolaの検索事情）&quot;&gt;はじめに（Zolaの検索事情）&lt;&#x2F;h2&gt;
&lt;p&gt;このブログも記事数が255を超え、
検索機能なしでは目的の記事に
たどり着きにくくなってきました。
タグやアーカイブで絞り込めはしますが、
「あのキーワードで書いた記事どこだっけ」
という場面には対応できません。&lt;&#x2F;p&gt;
&lt;p&gt;このブログで使用している静的サイトジェネレーター
Zolaには検索機能が組み込まれています。
検索エンジンには
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;elasticlunr.com&#x2F;&quot;&gt;elasticlunr.js&lt;&#x2F;a&gt;
が使われていますが、
日本語のトークナイズに対応していません。
elasticlunr自体が長期間更新されておらず、
今後の対応も期待できない状況です。&lt;&#x2F;p&gt;
&lt;p&gt;適用しているテーマ
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;welpo&#x2F;tabi&quot;&gt;tabi&lt;&#x2F;a&gt;
の検索UIもelasticlunrを前提としており、
日本語ブログでは実質的に使えません。
&lt;code&gt;config.toml&lt;&#x2F;code&gt;では&lt;code&gt;build_search_index = false&lt;&#x2F;code&gt;
として無効化していました。&lt;&#x2F;p&gt;
&lt;p&gt;そこで、日本語対応の検索機能を導入することにしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;検索エンジンの選定&quot;&gt;検索エンジンの選定&lt;&#x2F;h2&gt;
&lt;p&gt;静的サイトで使える検索エンジンを
いくつか比較検討しましたが、
下表のような理由で見送りました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;候補&lt;&#x2F;th&gt;&lt;th&gt;見送った理由&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Algolia&lt;&#x2F;td&gt;&lt;td&gt;SaaS依存。無料枠に月10,000リクエスト制限。検索クエリが外部に送信される&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Meilisearch&lt;&#x2F;td&gt;&lt;td&gt;サーバーの常時稼働が必要で、静的サイトとは根本的に合わない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fuse.js&lt;&#x2F;td&gt;&lt;td&gt;全インデックスをクライアントにダウンロードする設計。記事数の増加に弱い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Google PSE&lt;&#x2F;td&gt;&lt;td&gt;無料版は広告表示あり。サービス縮小傾向。プライバシーの懸念&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;最終的に選定したのは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pagefind.app&#x2F;&quot;&gt;Pagefind&lt;&#x2F;a&gt;
です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Pagefind_とは&quot;&gt;Pagefind とは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pagefind.app&#x2F;&quot;&gt;Pagefind&lt;&#x2F;a&gt;は
CloudCannonが開発した静的サイト向けの
全文検索ライブラリです。&lt;&#x2F;p&gt;
&lt;p&gt;サイトのビルド後にHTMLを解析して
検索インデックスを静的ファイルとして生成し、
検索時にはWebAssemblyで動作する
クライアントサイドの検索エンジンが
必要なチャンクだけを読み込んで結果を返します。
外部サーバーへの通信は一切発生しません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;セグメンテーションとは、
文章を単語に分割する処理。
英語のように単語がスペースで
区切られていない日本語・中国語・韓国語は
単語を区切る処理が必要。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;Extended版ではCJK（中国語・日本語・韓国語）の
セグメンテーションに対応しており、
&lt;code&gt;npx pagefind&lt;&#x2F;code&gt;を実行するだけで
Extended版が自動的にダウンロードされます。
検索UIコンポーネントも同梱されているため、
数行のHTMLを追加するだけで
検索ページを構築できます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Note&lt;&#x2F;strong&gt;
        &lt;p&gt;PagefindのセグメンテーションはMeCabのような
品詞分解を行う形態素解析ではなく、
Unicode標準に基づく単語境界の検出です。
そのため「走る」で「走った」がヒットするような
活用形の展開（ステミング）には対応していません。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;このブログでPagefindを採用した
決め手は次の点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日本語対応&lt;&#x2F;strong&gt;:
Extended版がCJKセグメンテーションに対応している&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;静的サイトとの親和性&lt;&#x2F;strong&gt;:
ビルド時にインデックスを静的ファイルとして生成する。
外部サービスが不要&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;軽量&lt;&#x2F;strong&gt;:
インデックスはチャンク分割され、
検索時に必要な部分だけが転送される&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プライバシー&lt;&#x2F;strong&gt;:
完全にクライアントサイドで動作する。
このブログの
設計思想とも一致する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コスト&lt;&#x2F;strong&gt;: ゼロ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;実装のアプローチ&quot;&gt;実装のアプローチ&lt;&#x2F;h2&gt;
&lt;p&gt;tabiテーマにはできるだけ手を入れない
方針を採りました。
テーマを直接編集すると、
アップデートのたびに変更が衝突して
追従が面倒になるためです。
Zolaでは&lt;code&gt;templates&#x2F;&lt;&#x2F;code&gt;に同名のファイルを
置くことでテーマのテンプレートを
上書きでき、CSSも&lt;code&gt;static&#x2F;custom.css&lt;&#x2F;code&gt;で
追記できます。&lt;&#x2F;p&gt;
&lt;p&gt;tabiの検索UIは&lt;code&gt;build_search_index = true&lt;&#x2F;code&gt;
のときにだけ表示される仕組みです。
Pagefindは独自のUIコンポーネントを持っているため、
tabiの検索モーダルは使わず、
Pagefind UIを載せた専用の検索ページを
新設する方式にしました。
ナビゲーションメニューに「search」を
追加し、読者はそこから検索を利用します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Pagefindの実装&quot;&gt;Pagefindの実装&lt;&#x2F;h2&gt;
&lt;!-- author-approved: Pagefindの実装セクション配下の分類に必要 --&gt;
&lt;h3 id=&quot;実装概要&quot;&gt;実装概要&lt;&#x2F;h3&gt;
&lt;p&gt;まずPagefindをインストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -D pagefind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;次にプロジェクトルートにPagefindの設定ファイル
&lt;code&gt;pagefind.yml&lt;&#x2F;code&gt;を作成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot; data-name=&quot;pagefind.yml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;site&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; public&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;glob&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;blog&#x2F;**&#x2F;*.html&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;force_language&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ja&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;glob&lt;&#x2F;code&gt;でインデックス対象を&lt;code&gt;blog&#x2F;&lt;&#x2F;code&gt;配下の
記事に限定し、トップページやaboutなどの
固定ページは除外しています。
&lt;code&gt;force_language: ja&lt;&#x2F;code&gt;は
日本語のCJKセグメンテーションを強制する設定です。&lt;&#x2F;p&gt;
&lt;p&gt;検索ページはZolaのセクションとして作成します。
&lt;code&gt;content&#x2F;search&#x2F;_index.md&lt;&#x2F;code&gt;でテンプレートを指定し、
&lt;code&gt;templates&#x2F;search.html&lt;&#x2F;code&gt;にPagefind UIを配置します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot; data-name=&quot;templates&#x2F;search.html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% extends &amp;quot;base.html&amp;quot; %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% block main_content %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; class&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;wide-container&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;      href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;pagefind&#x2F;pagefind-ui.css&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;      rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;stylesheet&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;search&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;      src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;pagefind&#x2F;pagefind-ui.js&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      window&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;addEventListener&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;DOMContentLoaded&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, ()&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; PagefindUI&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          element&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;#search&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          showSubResults&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          showImages&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          translations&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            placeholder&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;              &amp;quot;検索キーワードを入力…&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            zero_results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;              &amp;quot;[SEARCH_TERM] の検索結果は&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;              +&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ありません&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            one_result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;              &amp;quot;[SEARCH_TERM] の検索結果: 1件&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            many_results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;              &amp;quot;[COUNT] 件の検索結果&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            clear_search&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;クリア&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% endblock main_content %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;tabiの&lt;code&gt;base.html&lt;&#x2F;code&gt;を継承することで、
ヘッダーやフッター、
スキンの設定がそのまま反映されます。
&lt;code&gt;translations&lt;&#x2F;code&gt;で検索UIの
日本語メッセージを指定しています。&lt;&#x2F;p&gt;
&lt;!-- author-approved: Pagefindの実装セクション配下の分類に必要 --&gt;
&lt;h3 id=&quot;minify_htmlの罠&quot;&gt;minify_htmlの罠&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;zola build&lt;&#x2F;code&gt;後にPagefindを実行したところ、
304個のHTMLファイルを検出しながら
インデックスされたページは0件、
「Discovered 0 languages」という
結果になりました。&lt;&#x2F;p&gt;
&lt;p&gt;原因の切り分けは次のように進めました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;最小限のHTMLファイルを作成して
Pagefindを実行 → 正常動作&lt;&#x2F;li&gt;
&lt;li&gt;Zolaが実際に生成したHTMLをコピーして
Pagefindを実行 → 再現&lt;&#x2F;li&gt;
&lt;li&gt;HTMLの要素を削りながら比較
→ &lt;code&gt;&amp;lt;&#x2F;head&amp;gt;&lt;&#x2F;code&gt;の有無で結果が変わることを特定&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Zolaの&lt;code&gt;config.toml&lt;&#x2F;code&gt;で&lt;code&gt;minify_html = true&lt;&#x2F;code&gt;を
設定すると、HTML5の仕様上省略可能な
&lt;code&gt;&amp;lt;&#x2F;head&amp;gt;&lt;&#x2F;code&gt;閉じタグが除去されます。
これ自体はHTML5として合法ですが、
Pagefind v1.4.0のHTMLパーサーは
&lt;code&gt;&amp;lt;&#x2F;head&amp;gt;&lt;&#x2F;code&gt;がないとページを正しく解析できず、
言語検出に失敗していました。&lt;&#x2F;p&gt;
&lt;p&gt;このブログの規模ではHTML minifyの
恩恵は無視できるため、
&lt;code&gt;config.toml&lt;&#x2F;code&gt;で&lt;code&gt;minify_html = false&lt;&#x2F;code&gt;に
変更して対処しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot; data-name=&quot;config.toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;minify_html&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;これはZolaの不具合ではなく
Pagefindのパーサー側の制約です。
将来Pagefindが&lt;code&gt;&amp;lt;&#x2F;head&amp;gt;&lt;&#x2F;code&gt;省略に
対応すれば&lt;code&gt;minify_html&lt;&#x2F;code&gt;を
再度有効化できます。&lt;&#x2F;p&gt;
&lt;!-- author-approved: Pagefindの実装セクション配下の分類に必要 --&gt;
&lt;h3 id=&quot;テーマとの共存で踏んだCSS問題&quot;&gt;テーマとの共存で踏んだCSS問題&lt;&#x2F;h3&gt;
&lt;p&gt;Pagefind UIにはCSS Custom Propertiesで
スタイルをカスタマイズする仕組みがあります。
テーマカラーに合わせるため
&lt;code&gt;:root&lt;&#x2F;code&gt;で変数を宣言したところ、
期待どおりに適用されませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;原因はCSSのカスケード順序にあります。
&lt;code&gt;pagefind-ui.css&lt;&#x2F;code&gt;は検索ページの&lt;code&gt;&amp;lt;main&amp;gt;&lt;&#x2F;code&gt;内で
読み込まれるため、tabiが&lt;code&gt;&amp;lt;head&amp;gt;&lt;&#x2F;code&gt;内で
読み込む&lt;code&gt;custom.css&lt;&#x2F;code&gt;よりも後にカスケードされます。
結果として、Pagefindのデフォルト値が
こちらの&lt;code&gt;:root&lt;&#x2F;code&gt;宣言に勝っていました。&lt;&#x2F;p&gt;
&lt;p&gt;セレクタを&lt;code&gt;.pagefind-ui&lt;&#x2F;code&gt;に変更し、
クラスセレクタの詳細度で
確実にオーバーライドするようにしました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;css&quot; data-name=&quot;static&#x2F;custom.css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-class z-css&quot;&gt;pagefind-ui&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-primary&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--primary-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--text-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-background&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--background-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-border&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--divider-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--bg-0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;  --pagefind-ui-font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--sans-serif-font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;tabiの既存のCSS変数を参照することで、
ダークモードやevangelionスキンの
カラースキームに自動で追従します。&lt;&#x2F;p&gt;
&lt;p&gt;もうひとつ、tabiテーマは全リンクに対して
&lt;code&gt;a:hover { background-color: var(--primary-color) }&lt;&#x2F;code&gt;
を適用するグローバルスタイルを持っています。
Pagefindの検索結果は&lt;code&gt;&amp;lt;a&amp;gt;&lt;&#x2F;code&gt;タグで構成されるため、
ホバーするとevangelionスキンの赤
（&lt;code&gt;#d12e36&lt;&#x2F;code&gt;）が結果全体の背景に
適用されてしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;検索結果エリア内のリンクスタイルを個別に
上書きして解消しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;css&quot; data-name=&quot;static&#x2F;custom.css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-class z-css&quot;&gt;pagefind-ui&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-pseudo-class&quot;&gt;hover&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-class z-css&quot;&gt;pagefind-ui&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-pseudo-class&quot;&gt;focus&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  background-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; transparent&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-property-name z-css&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-misc&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;--primary-color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;CI&#x2F;CDへの組み込み&quot;&gt;CI&#x2F;CDへの組み込み&lt;&#x2F;h2&gt;
&lt;p&gt;このブログはGitHub Actionsで
Cloudflare Workersにデプロイしています。
ワークフローに検索インデックス生成の
ステップを追加しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot; data-name=&quot;.github&#x2F;workflows&#x2F;deploy.yml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zola build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Build search index&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npx pagefind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;zola build&lt;&#x2F;code&gt; → &lt;code&gt;npx pagefind&lt;&#x2F;code&gt;の
2ステップだけで完結します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Pagefindの導入により、
303ページ（セクションページ含む）・
17,217語のインデックスが生成され、
日本語キーワードでの検索が
機能するようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;実装自体はシンプルでしたが、
&lt;code&gt;minify_html&lt;&#x2F;code&gt;によるHTML構造の変化や
テーマとのCSS競合など、
組み合わせ固有の問題に時間を取られました。
単独では正しく動くものが
組み合わせると壊れるパターンは、
静的サイトのツールチェーンでは
よくある話かもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;現時点での制約として、
日本語のステミングには未対応です。
「走る」で検索しても
「走った」はヒットしません。
ただし単語単位の検索は安定しており、
現在の規模では実用上十分です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">静的サイトジェネレーターZolaで運用しているこのブログに、
Pagefindを使った日本語対応のサイト内検索を導入しました。
選定の経緯から実装時のハマりどころまでを記録します。
</summary>
        </entry><entry xml:lang="en">
        <title>IBMが組み込んだClaude、IBMを撃つ ── メインフレーム・モダナイゼーションは誰にも解けない</title>
        <published>2026-02-24T17:30:00+09:00</published>
        <updated>2026-02-24T17:30:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/ibm-cobol-claude-irony/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/ibm-cobol-claude-irony/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;IBM株、一夜にして13%急落&quot;&gt;IBM株、一夜にして13%急落&lt;&#x2F;h2&gt;
&lt;p&gt;2026年2月23日、IBM株が13%急落しました。
2000年10月以来、最大の下落幅です。&lt;&#x2F;p&gt;
&lt;p&gt;きっかけはAnthropicが公開したブログ記事
「How AI helps break the cost barrier
to COBOL modernization」でした。
Claude Codeを使えば、
COBOLレガシーシステムの
モダナイゼーションにおける
調査・分析作業を大幅に短縮できる
という内容です。
従来は人間のアナリストが数か月かけていた
依存関係のマッピングやワークフローの文書化を、
AIが高速に処理できると主張しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;claude.com&amp;#x2F;blog&amp;#x2F;how-ai-helps-break-cost-barrier-cobol-modernization&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;日本の金融機関などはまだまだ
メインフレームが残っていますが、
米国でも似たような状況のようです。
Anthropicのブログによれば
毎日数千億行のCOBOLが
本番環境で稼働しているそうです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ibm.com&#x2F;think&#x2F;architectures&quot;&gt;IBM Architecture Collection&lt;&#x2F;a&gt;などを見ても、
IBMはメインフレーム
（彼らは「IBM Z」と呼びますが）を
捨てたわけではありません。
また、メインフレームと
メインフレーム・モダナイゼーションの
コンサルティングも
IBMの主要事業の1つです。
投資家はこの市場がAIによって
ディスラプトされることを懸念しました。&lt;&#x2F;p&gt;
&lt;p&gt;ここまでなら「AIベンチャーが大手の牙城を脅かす」
というよくある構図です。
しかし今回の話には、もう一層の皮肉があります。&lt;&#x2F;p&gt;
&lt;p&gt;IBM自身が開発中のAIエージェント
「Project Bob」（以下「IBM Bob」）は、
AnthropicのClaudeをマルチモデル構成の
中核として採用しているのです。
自社のメインフレーム・モダナイゼーション
ツールに組み込んだ相手のAIが、
自社の株価を叩き落とすという構図。
元IBM社員として、
複雑な感慨を覚えました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Watson時代を知る者として&quot;&gt;Watson時代を知る者として&lt;&#x2F;h2&gt;
&lt;p&gt;私がIBMに在籍していた当時、
Watson一色の時代がありました。
社内のあらゆるプレゼンテーションに
Watsonのロゴが入り、営業資料にはWatsonの
事例が並び、「Cognitive（コグニティブ）」
という言葉が社内の共通語のように
使われていました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;p&gt;2011年のJeopardy!でWatsonが勝利したとき、&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;IBMは「AIの会社」として
華々しく旗を掲げていました。
あの頃の熱狂を思い出すと、
隔世の感があります。
しかし生成AI時代になって
主導権を握ったのは
OpenAIやAnthropicであり、
IBMのwatsonxとGraniteモデルは、
エンタープライズの現場では
外部モデルに頼る結果となりました。&lt;&#x2F;p&gt;
&lt;p&gt;IBM Bobが利用するAIモデルは
Claude、Mistral、Graniteなど
複数で構成されており、
タスクに応じて自動振り分けされます。
watsonxというプラットフォームと
Graniteという自社モデルを
持っていながら、
それだけでは最前線で戦えない。
この現実には、
やはり複雑なものを感じます。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、これを単なる敗北と
読むべきではないとも思います。
IBMの強みは「AIモデルそのもの」ではなく、
エンタープライズ向けのガバナンス、
ハイブリッド環境への対応力、
そして仕様駆動開発という
メソドロジーの側にあります。
モデルは最良のものを
外から持ってきて、
インテグレーションとガバナンスの
レイヤーで勝負する。
これは割り切った戦略転換であり、
むしろ合理的な判断だと考えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;IBM_Bobの仕様駆動アプローチ&quot;&gt;IBM Bobの仕様駆動アプローチ&lt;&#x2F;h2&gt;
&lt;p&gt;IBM Bobは汎用的なAI駆動開発ツールであり、
新規開発からフレームワーク移行、
セキュリティ修正まで幅広く対応します。
IBMが特に注力するのは
「仕様駆動開発」です。
AIにコードをいきなり書かせるのではなく、
まず仕様を文書化して唯一の基準とし、
AIが仕様に基づいてコードやテストケースを
生成する方式です。
いわゆるバイブコーディングとは
対極の設計思想にあります。&lt;&#x2F;p&gt;
&lt;p&gt;IBM社内では10,000人超の開発者が
Bobを活用し、
平均45%の生産性改善を
実現したとされています。
2027年以降は顧客プロジェクト全体で
工数35%削減・期間30%短縮を目標に
掲げています。&lt;&#x2F;p&gt;
&lt;p&gt;このアプローチ自体は筋が悪くありません。
特にエンタープライズの重要システムでは、
仕様なき生成は許されないため、
仕様駆動という思想は理にかなっています。
しかしこの「45%の改善」という数字は、
仕様が明確に存在する前提での話です。
メインフレーム・モダナイゼーションの
現場で何が起きているかというと、
その前提自体が成り立ちません。&lt;&#x2F;p&gt;
&lt;p&gt;仕様書は残っていないケースが大半です。
コードを書いた人はとうに退職しています。
コード自体が唯一の仕様書であり、
しかもそのコードの意味を
正確に理解できる人間が
もういないのです。&lt;&#x2F;p&gt;
&lt;p&gt;IBM Bobが「AIでコードから
仕様を逆抽出する」ことを
目指しているのは理解できます。
しかし抽出された仕様が正しいかどうかを
検証する人間がいなければ、
それは推測の域を出ません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AWSのBlu_Ageはもっと危うい&quot;&gt;AWSのBlu Ageはもっと危うい&lt;&#x2F;h2&gt;
&lt;p&gt;メインフレーム・モダナイゼーションの
競合として、
AWSのBlu Ageにも触れておきます。
AWSはフランスのBlu Age社を買収し、
COBOLやPL&#x2F;Iを自動的にJava&#x2F;Spring Bootに
変換するソリューションを展開しています。
最新では「AWS Transform for mainframe」
というエージェント型AIサービスに
統合されました。&lt;&#x2F;p&gt;
&lt;p&gt;Transamericaでバッチ性能30%向上、
Vismaで年間コスト55%削減といった
実績が報告されており、
変換の自動化度は高いと言えます。&lt;&#x2F;p&gt;
&lt;p&gt;しかしこのアプローチには
構造的な弱点があります。
変換されたJavaコードは一見モダンですが、
Blu Ageの独自ランタイムライブラリが
メインフレーム固有の機能を
エミュレーションで提供しています。
COBOLのメモリレイアウト再現、
CICSトランザクション管理、
VSAMファイルアクセス、
JCLバッチ実行。
これらがすべて独自ランタイムに
依存しているため、
変換後のコードは純粋なJavaではありません。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、メインフレームへの
ベンダーロックインが、
AWSへのベンダーロックインに
置き換わっただけです。
確かにJavaコードになったことで
ソースコードの可読性自体は向上し、
Java開発者による保守は可能になります。
しかし、ランタイム層の理解なしには
本質的な改修はできず、
「この処理は何をしているのか」が
わからないという根本的な問題は
解消されていません。&lt;&#x2F;p&gt;
&lt;p&gt;個人的な評価としては、
仕様を基準に据えるIBMの方が
まだましだと考えています。
少なくとも「何をしているのか」を
明らかにしようとする姿勢がある。
Blu Ageは「動けばいい」であり、
その先の保守性を
犠牲にしています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;誰も解けない本当の理由&quot;&gt;誰も解けない本当の理由&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code、IBM Bob、AWS Blu Age。
いずれのツールを使っても、
メインフレーム・モダナイゼーションの
本質的な問題は解けません。
なぜなら、これは技術の問題ではなく、
人と組織の問題だからです。&lt;&#x2F;p&gt;
&lt;p&gt;COBOLの基幹システムを書いた世代は
60代後半から70代で現役を退いています。
彼らが持っていたのは
コーディングスキルだけではありません。
「この例外処理はあの税制改正で入れた」
「このフラグは特定の取引先との
契約条件で分岐する」
といった業務の文脈そのものでした。&lt;&#x2F;p&gt;
&lt;p&gt;AIがコードから仕様を
抽出できたとしましょう。
しかし、その仕様が正しいかどうかを
検証できる人間がいません。
ユーザー企業は情シス部門を縮小して
ベンダーに丸投げしてきました。
SIer側は下請け構造の中で
業務知識が分散・属人化しました。
仕様を書いた人、コードを書いた人、
運用している人がバラバラで、
全体を通して理解している人が
どこにもいない。&lt;&#x2F;p&gt;
&lt;p&gt;IBMが「経営層向けワークショップ」や
「成果コミット型パートナーシップ」を
打ち出しているのは、
この問題への間接的な回答です。
しかし結局のところ、
「御社の業務を一番わかっているのは
御社です」という当たり前の話に戻ります。
そしてその「御社」の中に、
もうわかる人がいないのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;株価が映すもの&quot;&gt;株価が映すもの&lt;&#x2F;h2&gt;
&lt;p&gt;IBMの株価が一日で13%下がったことは、
市場がメインフレーム・モダナイゼーションの
ディスラプトを織り込んだように見えます。
しかし実態はもう少し複雑です。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeが得意なのは
コードの探索と分析です。
数千行のCOBOLコードから
依存関係をマッピングし、
ワークフローを文書化し、
リスクを特定する。
これは確かに人間が数か月かけていた
作業を短縮できるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;しかし「分析できる」ことと
「移行できる」ことの間には、
深い溝があります。
コードの構造を理解することと、
そのコードが担っている
業務の意味を理解することは別物です。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;resources.anthropic.com&#x2F;code-modernization-playbook&quot;&gt;Code Modernization Playbook&lt;&#x2F;a&gt;は
優れた資料ですが、
あくまで「探索と分析のコスト障壁を
下げる」ことに焦点を当てています。
最終的に移行を完遂するには、
業務知識を持った人間の判断が不可欠です。
そしてその人間がいないことこそが、
メインフレーム・モダナイゼーションが
何十年も進まない理由なのです。&lt;&#x2F;p&gt;
&lt;p&gt;株価が映しているのは、
「AIがCOBOLを解決する」という
期待と恐怖です。
しかし現実には、
必要なのは業務知識の再構築への
地道な投資であり、
どんなに優秀なAIツールが登場しても、
その投資の代わりにはなりません。&lt;&#x2F;p&gt;
&lt;p&gt;IBM自身のツールにClaudeが
組み込まれているという事実は、
技術の世界に敵味方の区別がない
ことを示しています。
本当の敵はツールの優劣ではなく、
長い年月をかけて失われた
業務知識という名の技術的負債です。
Anthropic、IBM、AWSのいずれであっても、
魔法のように解くことはできません。
それでも、この問題を直視し、
業務知識の再構築に地道に取り組む
組織だけが、次の時代のシステムを
手にするのだと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;CNBC.
&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cnbc.com&#x2F;2026&#x2F;02&#x2F;23&#x2F;ibm-is-the-latest-ai-casualty-shares-are-tanking-on-anthropic-cobol-threat.html&quot;&gt;IBM is the latest AI casualty.
Shares tank 13% on Anthropic programming
language threat&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;GIGAZINE.
「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gigazine.net&#x2F;news&#x2F;20260224-ibm-ai-casualty-anthropic-claude-code-cobol&#x2F;&quot;&gt;IBMの株価が13％下落、AnthropicがClaude Codeで
「COBOLを使ったレガシーシステムの
モダナイゼーションの自動化」を解説したのが
原因&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic.
&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;claude.com&#x2F;blog&#x2F;how-ai-helps-break-cost-barrier-cobol-modernization&quot;&gt;How AI helps break the cost barrier
to COBOL modernization&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;ITmedia エンタープライズ.
「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.itmedia.co.jp&#x2F;enterprise&#x2F;articles&#x2F;2602&#x2F;19&#x2F;news045.html&quot;&gt;日本IBMのAI戦略&quot;3つの柱&quot;
「制御できるAI」でレガシー資産を
モダナイズ&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;IBM.
&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ibm.com&#x2F;new&#x2F;announcements&#x2F;ibm-project-bob&quot;&gt;Announcing IBM Project Bob&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Anthropic.
&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;resources.anthropic.com&#x2F;code-modernization-playbook&quot;&gt;The Code Modernization Playbook&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;li&gt;AWS.
&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;m2&#x2F;latest&#x2F;userguide&#x2F;ba-shared-architecture.html&quot;&gt;Blu Age Runtime high level
architecture&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;免責事項&lt;&#x2F;strong&gt;
        &lt;p&gt;本記事は投資助言を目的とするものではありません。
筆者は現在IBMとの雇用関係はなく、
記載された情報は全て公開情報に基づく
個人の見解です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">AnthropicのCOBOLモダナイゼーション対応発表で
IBM株が13%急落しました。皮肉にもIBM自身が
Claudeを自社ツールに組み込んでいた矢先の出来事です。
Watson時代を知る元IBM社員の視点から、
COBOLの構造的課題とツールの限界を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>Zolaテーマ「tabi」の活用機能を探る</title>
        <published>2026-02-24T12:00:00+09:00</published>
        <updated>2026-02-24T12:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/zola-theme-tabi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/zola-theme-tabi/</id>
        
            <content type="html">&lt;!-- author-approved: ショートコード名・設定項目の列挙に###を使用 --&gt;
&lt;p&gt;このブログはZola静的サイトジェネレーターと
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;welpo.github.io&#x2F;tabi&#x2F;&quot;&gt;tabi&lt;&#x2F;a&gt;テーマで
運用しています。
tabiは多機能なテーマですが、
実際に活用しているのはその一部に過ぎません。
改めてテーマの全機能を棚卸しして、
まだ使っていない機能を洗い出してみました。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;ショートコード&quot;&gt;ショートコード&lt;&#x2F;h2&gt;
&lt;p&gt;tabiには18種類のビルトインショートコードと、
このブログ用に自作したカスタムショートコード
2種類があります
（カスタムコードは当然ながらtabiには
含まれません）。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ショートコード&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;admonition&lt;&#x2F;td&gt;&lt;td&gt;info、warning、tipなどのタイプを指定して、注意書きや補足情報を装飾付きボックスで表示します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;add_src_to_code_block（非推奨）&lt;&#x2F;td&gt;&lt;td&gt;コードブロックの &lt;code&gt;name=&lt;&#x2F;code&gt; ラベルをクリック可能なリンクに変換します。現在は &lt;code&gt;code_block_name_links = true&lt;&#x2F;code&gt; を設定し、&lt;code&gt;name=&lt;&#x2F;code&gt; にURLを直接書く方式が推奨されています&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;aside&lt;&#x2F;td&gt;&lt;td&gt;本文の横にサイドバー風の補足情報を表示します。admonitionより控えめな見た目で、ちょっとした注釈を添えるのに向いています&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;dimmable_image&lt;&#x2F;td&gt;&lt;td&gt;ダークモード時に画像の明るさを自動的に抑えます。白背景のスクリーンショットがダークモードで眩しくなるのを防げます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;dual_theme_image&lt;&#x2F;td&gt;&lt;td&gt;ライトモードとダークモードで異なる画像を自動的に切り替えて表示します。背景色によって見えにくくなる図表に便利です&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;force_text_direction&lt;&#x2F;td&gt;&lt;td&gt;テキストブロックのLTR（左から右）またはRTL（右から左）の方向を強制的に指定します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;full_width_image&lt;&#x2F;td&gt;&lt;td&gt;記事の本文幅を超えて、画像をページ全幅で表示します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;iine&lt;&#x2F;td&gt;&lt;td&gt;特定のブロック単位でいいねボタンを設置できます。tabiの作者が提供するSupabaseインスタンスにカウントが記録されます。導入時はプライバシーポリシーの更新を検討してください&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;image_hover&lt;&#x2F;td&gt;&lt;td&gt;マウスホバーで別の画像に切り替わります。Before&#x2F;After比較や加工前後の写真を見比べるのに最適です&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;image_toggler&lt;&#x2F;td&gt;&lt;td&gt;クリックで2枚の画像をトグル切り替えします。image_hoverと似ていますが、ホバーが使えないモバイル環境でも動作します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;invertible_image&lt;&#x2F;td&gt;&lt;td&gt;ダークモード時に画像の色を反転します。白背景に黒線で描かれた図表をダークモードでも見やすくできます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;linkcard（自作）&lt;&#x2F;td&gt;&lt;td&gt;はてなブログカードのiframeを使い、URLをカード形式で表示します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;mermaid&lt;&#x2F;td&gt;&lt;td&gt;Mermaid記法でフローチャートやシーケンス図などの図表を描画します。記事のFrontmatterで &lt;code&gt;mermaid = true&lt;&#x2F;code&gt; の設定が必要です&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;multilingual_quote&lt;&#x2F;td&gt;&lt;td&gt;原文と翻訳をトグルで切り替え表示できる引用ブロックです。英語の技術ドキュメントを引用する際に原文と日本語訳を並べて見せられます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;references&lt;&#x2F;td&gt;&lt;td&gt;参考文献をスタイル付きで表示するブロックです。学術的な記事や多くの出典をまとめる場合に適しています&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;remote_text&lt;&#x2F;td&gt;&lt;td&gt;外部URLやローカルファイルの内容を記事内にインラインで埋め込みます。GitHubにあるコンフィグファイルをそのまま表示するような使い方ができます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;spoiler&lt;&#x2F;td&gt;&lt;td&gt;クリックするまで内容が隠されるテキストブロックです。ネタバレを隠したりクイズの答えを伏せるのに使えます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;toc&lt;&#x2F;td&gt;&lt;td&gt;記事内に &lt;code&gt;&amp;lt;!-- toc --&amp;gt;&lt;&#x2F;code&gt; マーカーを挿入するショートコードです。マーカーを直接書くのと同等の動作です&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;wide_container&lt;&#x2F;td&gt;&lt;td&gt;記事の本文幅を超えて、ページ全幅にコンテンツを表示します。大きな表やワイドな画像を見切れずに表示したい場合に使えます&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;youtube（自作）&lt;&#x2F;td&gt;&lt;td&gt;YouTube動画を埋め込み表示します&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;以下、このブログで使用しているショートコードから、
よく使うものに絞ってサンプルを載せておきます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;admonition&quot;&gt;admonition&lt;&#x2F;h3&gt;
&lt;p&gt;info、warning、danger、tip、noteなどの
タイプを指定できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% admonition(type=&amp;quot;warning&amp;quot;, title=&amp;quot;注意&amp;quot;) %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;ここに警告メッセージを書きます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% end %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;注意&lt;&#x2F;strong&gt;
        &lt;p&gt;ここに警告メッセージを書きます。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;aside&quot;&gt;aside&lt;&#x2F;h3&gt;
&lt;p&gt;admonitionより控えめな見た目で、
ちょっとした注釈を添えるのに向いています。
PCなどの表示では記事の左右に表示され、
スマートフォンなどでは記事と並んで
表示されます。
&lt;code&gt;position&lt;&#x2F;code&gt; パラメータで配置を調整できます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;右側にも表示できます。&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;!-- textlint-enable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% aside(position=&amp;quot;right&amp;quot;) %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;補足情報をここに書きます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% end %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;multilingual_quote&quot;&gt;multilingual_quote&lt;&#x2F;h3&gt;
&lt;p&gt;原文と翻訳をトグルで切り替え表示できます。
英語の技術ドキュメントを引用する際に、
原文と日本語訳を並べて見せられます。
&lt;code&gt;author&lt;&#x2F;code&gt; パラメータで出典も表示できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{{ multilingual_quote(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  translated=&amp;quot;考える、ゆえに我あり。&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  original=&amp;quot;Cogito, ergo sum.&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  author=&amp;quot;René Descartes&amp;quot;) }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;quote-container&quot;&gt;
    &lt;input type=&quot;checkbox&quot; id=&quot;toggle-81018&quot; class=&quot;quote-toggle&quot;&gt;
    &lt;div class=&quot;quote&quot;&gt;
        &lt;div class=&quot;translated&quot;&gt;
            &lt;blockquote&gt;
                &lt;p&gt;“考える、ゆえに我あり。”&lt;&#x2F;p&gt;
                &lt;p&gt;— René Descartes &lt;label for=&quot;toggle-81018&quot; class=&quot;quote-label quote-label-original&quot;&gt;
                    (Show original quote)
                &lt;&#x2F;label&gt;&lt;&#x2F;p&gt;
            &lt;&#x2F;blockquote&gt;
        &lt;&#x2F;div&gt;
        &lt;div class=&quot;original&quot;&gt;
            &lt;blockquote&gt;
                &lt;p&gt;“Cogito, ergo sum.”&lt;&#x2F;p&gt;
                &lt;p&gt;— René Descartes &lt;label for=&quot;toggle-81018&quot; class=&quot;quote-label quote-label-translate&quot;&gt;
                    (Show translation)
                &lt;&#x2F;label&gt;&lt;&#x2F;p&gt;
            &lt;&#x2F;blockquote&gt;
        &lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;references&quot;&gt;references&lt;&#x2F;h3&gt;
&lt;p&gt;参考文献をスタイル付きで表示するブロックです。
パラメータはなく、内部にMarkdownを記述できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;{% references() %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; WEBサイト. 「&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[記事名]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;example.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;」.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 著者(2026). 『書名』.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  {% end %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;Example Site. 「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;example.com&#x2F;article&quot;&gt;Zolaで技術ブログを作る&lt;&#x2F;a&gt;」&lt;&#x2F;li&gt;
&lt;li&gt;結城浩. (2020). 『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;example.com&#x2F;book&quot;&gt;数学ガール&lt;&#x2F;a&gt;』&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;spoiler&quot;&gt;spoiler&lt;&#x2F;h3&gt;
&lt;p&gt;クリックするまで内容がぼかされて隠れます。
JavaScriptを使わず、
CSSとチェックボックスで実装されています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;犯人は、{{ spoiler(text=&amp;quot;執事でした。&amp;quot;) }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- textlint-disable --&gt;
&lt;p&gt;犯人は、


&lt;label class=&quot;spoiler-container&quot;&gt;
    &lt;input type=&quot;checkbox&quot; id=&quot;spoiler-25645&quot; class=&quot;spoiler-toggle&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; &#x2F;&gt;
    &lt;span class=&quot;spoiler-content&quot; title=&quot;reveal spoiler&quot; tabindex=&quot;0&quot;&gt;
        &lt;span class=&quot;spoiler-hidden&quot;&gt;執事でした。&lt;&#x2F;p&gt;
&lt;&#x2F;span&gt;
    &lt;&#x2F;span&gt;
&lt;&#x2F;label&gt;
&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;テンプレート&quot;&gt;テンプレート&lt;&#x2F;h2&gt;
&lt;p&gt;tabiでは記事に対して3種類のtemplateが
提供されています。
いずれもセクションの &lt;code&gt;_index.md&lt;&#x2F;code&gt; で有効にします。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;section - 通常のテンプレート&lt;&#x2F;dt&gt;
&lt;dd&gt;通常の記事向けのテンプレートです。&lt;&#x2F;dd&gt;
&lt;dt&gt;series — 連載記事テンプレート&lt;&#x2F;dt&gt;
&lt;dd&gt;複数回にわたる連載記事を番号付きインデックスで管理できるテンプレートです。&lt;&#x2F;dd&gt;
&lt;dd&gt;複数回にわたる技術解説記事に向いています。&lt;&#x2F;dd&gt;
&lt;dt&gt;cards — カードグリッドテンプレート&lt;&#x2F;dt&gt;
&lt;dd&gt;フィルタ可能なカードグリッドのレイアウトです。&lt;&#x2F;dd&gt;
&lt;dd&gt;ポートフォリオやプロジェクト一覧を見せるのに適しています。&lt;&#x2F;dd&gt;
&lt;dd&gt;タグによるフィルタリングも可能です。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;サイト設定&quot;&gt;サイト設定&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;config.toml&lt;&#x2F;code&gt; の &lt;code&gt;[extra]&lt;&#x2F;code&gt; セクションで
設定できるオプションです。
以下の説明は、筆者が気になったものだけを
取り上げており網羅的ではありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;skin_—_カラースキーム&quot;&gt;skin — カラースキーム&lt;&#x2F;h3&gt;
&lt;p&gt;tabiには12種類のカラースキームが用意されています。
sakura、lavender、mint、teal、evangelionなど、
テーマカラーを一行で切り替えられます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;skin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;sakura&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このブログでは &lt;code&gt;custom.css&lt;&#x2F;code&gt; で
独自にカラーを指定しているため使っていません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;browser_theme_color_—_モバイルブラウザのテーマカラー&quot;&gt;browser_theme_color — モバイルブラウザのテーマカラー&lt;&#x2F;h3&gt;
&lt;p&gt;モバイルブラウザのアドレスバーの色を指定できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;browser_theme_color&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;#087e96&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;compact_tags_—_コンパクトなタグクラウド&quot;&gt;compact_tags — コンパクトなタグクラウド&lt;&#x2F;h3&gt;
&lt;p&gt;タグ一覧をコンパクトな上付き数字スタイルで表示します。
タグ数が多いブログで一覧性を高められます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;compact_tags&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;feed_icon_—_RSSアイコン&quot;&gt;feed_icon — RSSアイコン&lt;&#x2F;h3&gt;
&lt;p&gt;フッターにRSSフィードのアイコンを表示します。
当ブログではsocialsを使ってRSSを
表示しているため使用していません。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;feed_icon&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;full_content_in_feed_—_フィード全文配信&quot;&gt;full_content_in_feed — フィード全文配信&lt;&#x2F;h3&gt;
&lt;p&gt;Atomフィードに記事の全文を含めます。
当ブログでは既にこの設定を有効にしています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;full_content_in_feed&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;webmentions_—_IndieWeb_Webmentions&quot;&gt;webmentions — IndieWeb Webmentions&lt;&#x2F;h3&gt;
&lt;p&gt;Webmentionによるインタラクションを表示できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra.webmentions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;enable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;www.example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;KaTeX_—_数式レンダリング&quot;&gt;KaTeX — 数式レンダリング&lt;&#x2F;h3&gt;
&lt;p&gt;LaTeX形式の数式をレンダリングできます。
数学や統計を扱う記事で使えます。&lt;&#x2F;p&gt;
&lt;p&gt;記事のFrontmatterで有効化します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;katex&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;記事本文では以下のように記述します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;インライン数式: $E = mc^2$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;ブロック数式: $$\sum_{i=1}^{n} x_i$$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;未使用のFrontmatterオプション&quot;&gt;未使用のFrontmatterオプション&lt;&#x2F;h2&gt;
&lt;p&gt;記事ごとに &lt;code&gt;[extra]&lt;&#x2F;code&gt; セクションで
個別にオーバーライドできる設定です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tldr&quot;&gt;tldr&lt;&#x2F;h3&gt;
&lt;p&gt;これまでセクションを設けて記載していましたが、
Frontmatterで設定できることがわかりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;updated_—_最終更新日&quot;&gt;updated — 最終更新日&lt;&#x2F;h3&gt;
&lt;p&gt;記事の最終更新日を &lt;code&gt;date&lt;&#x2F;code&gt; とは別に表示します。
内容を更新した記事に設定すると、
読者に最新性を伝えられます。
&lt;code&gt;[extra]&lt;&#x2F;code&gt; ではなくトップレベルの
Frontmatterフィールドです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;記事タイトル&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; 2026-02-01&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;updated&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; 2026-02-20&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;show_reading_time_—_読了時間の個別制御&quot;&gt;show_reading_time — 読了時間の個別制御&lt;&#x2F;h3&gt;
&lt;p&gt;グローバルでは有効にしていますが、
短い記事では非表示にできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;show_reading_time&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;giscus_—_コメントの個別制御&quot;&gt;giscus — コメントの個別制御&lt;&#x2F;h3&gt;
&lt;p&gt;グローバルでは全記事で有効ですが、
特定の記事でコメントを無効にできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;giscus&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;toc_—_目次の個別制御&quot;&gt;toc — 目次の個別制御&lt;&#x2F;h3&gt;
&lt;p&gt;グローバル設定とは別に、
記事ごとに目次の表示を制御できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;toc&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このブログでは &lt;code&gt;&amp;lt;!-- toc --&amp;gt;&lt;&#x2F;code&gt; マーカーを
&lt;code&gt;details&lt;&#x2F;code&gt;要素に入れて、畳めるようにしているため利用していませんが、
そのような要件がなければ
Frontmatterで制御するほうがシンプルです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;tabiは使い切れないほど多機能なテーマです。
今回改めて棚卸しをしてみると、
これまで使っていなかった機能のなかにも
便利なものが数多く存在しました。&lt;&#x2F;p&gt;
&lt;p&gt;たとえば &lt;code&gt;tldr&lt;&#x2F;code&gt; はこれまで記事本文に
セクションを設けて書いていましたが、
Frontmatterに設定するだけで済むと知り、
今後は積極的に活用していきます。
&lt;code&gt;updated&lt;&#x2F;code&gt; による最終更新日の表示なども、
知っていれば必要な場面ですぐに使える
実用的なオプションです。&lt;&#x2F;p&gt;
&lt;p&gt;テンプレートについても、
これまでは通常の &lt;code&gt;section&lt;&#x2F;code&gt; テンプレートしか
使っていませんでしたが、
&lt;code&gt;series&lt;&#x2F;code&gt; テンプレートは複数回にわたる
連載記事をまとめるのに向いており、
技術解説のシリーズ記事などで
活用していきたいと考えています。
&lt;code&gt;cards&lt;&#x2F;code&gt; テンプレートも、
ポートフォリオやプロジェクト一覧のような
通常のブログ記事とは異なるタイプの
コンテンツを見せる場面で使えそうです。&lt;&#x2F;p&gt;
&lt;p&gt;使える機能を把握しておくだけでも、
記事の表現の幅が広がります。
テーマの機能を活かしきれていないと
感じている方は、一度公式ドキュメントを
眺めてみることをおすすめします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;tabi. &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;welpo.github.io&#x2F;tabi&#x2F;&quot;&gt;tabi documentation&lt;&#x2F;a&gt;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Zolaの高機能テーマ「tabi」には、
普段使っていない便利な機能が数多く眠っています。
ショートコード、テンプレート、Frontmatterオプションまで、
見落としがちな機能をまとめて紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>Process.audio Decibelに乗り換えた — Spotifyターゲットの測定と調整</title>
        <published>2026-02-23T00:00:00+00:00</published>
        <updated>2026-02-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/mastering-vocal-piano/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/mastering-vocal-piano/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;mastering-vocal-piano&amp;#x2F;cover.webp?h=67be4e6903540282bb77&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1077&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;先日Waves L4 Ultramaximizerを導入して、
マスタリングのツールチェインが
揃ってきたところでした。
そこにiZotopeからサブスクリプション変更の
メールが届きました。
Music Production Suite Proが
iZotope Proへ移行し、据え置き期間の後は
月額25ドル（年額250ドル）になるという内容です。&lt;&#x2F;p&gt;
&lt;p&gt;iZotope Insight 2は優れたメーターですが、
サブスクリプションに依存している点は
以前から気になっていました。
これを機にProcess.audio Decibelへ
乗り換えることにしました。&lt;&#x2F;p&gt;
&lt;p&gt;今回は女性ボーカルとピアノだけの
シンプルな構成の楽曲で、
実際にDecibelを使ってマスタリングしています。
ピアノはRavel、ヴォーカルはSynthesizer Vです。
プラグインはUADxを中心に、最終段のリミッターには
L4 Ultramaximizerを使っています。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2271481283&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;homura&quot; title=&quot;Homura&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Homura&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;シグナルチェイン&quot;&gt;シグナルチェイン&lt;&#x2F;h2&gt;
&lt;p&gt;ボーカルはPultec EQで周波数を整えてから
1176 Rev Aで軽くコンプレッションをかけ、
Pure Plate Reverbを薄めにセンドしています。
ピアノは左手と右手を別トラックにして、
客席目線でR30&#x2F;L30にパンニングしました。
右手はEQP-1Aで高域に空気感を足し、
左手はHLF-3Cで高域をカットして棲み分けを
作っています。
コンプレッションは両方ともLA-2Aで、
ピアノのダイナミクスを壊さない穏やかな設定です。
リバーブはボーカルのプレートとは別に、
Lexicon 224のホールを使って空間を分けています。&lt;&#x2F;p&gt;
&lt;p&gt;マスターバスはPultec MEQ-5で中域を微調整し、
SSL G Bus Compressorで軽くグルーをかけてから、
Ampex ATR-102でテープサチュレーションを
加えています。
最終段のリミッターにはL4 Ultramaximizerを
Ceiling -1.1dB、Threshold -1.5dBで使い、
True PeakモードをON、Oversamplingは16xに
しています。
Ceilingを-1.0dBではなく-1.1dBにしたのは、
DecibelのTrue Peak測定が厳格で
-1.0dBだとギリギリ超えることがあったためです。
ピアノはダイナミックピークが大きい楽器なので、
無理にリミッティングで潰さず
ダイナミクスを活かすことを優先しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Decibelによるメータリング&quot;&gt;Decibelによるメータリング&lt;&#x2F;h2&gt;
&lt;p&gt;Decibelはストリーミングプラットフォームごとの
プリセットを持つメータリングプラグインです。
今回はSpotifyプリセットを使いました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;mastering-vocal-piano&amp;#x2F;decibel-spotify-preset.png?h=8bca6c5f78190c756a57&quot;
  alt=&quot;Decibel Spotifyプリセット&quot; width=&quot;207&quot; height=&quot;303&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Spotifyプリセットでは
次の3つのターゲットが設定されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LUFS-I Target: -14.0&lt;&#x2F;strong&gt; —
楽曲全体の平均ラウドネス。
LUFSはITU-R BS.1770に基づく
ラウドネスの国際規格で、
Integratedは楽曲を通して再生したときの
平均を指す。
Spotifyはこの値を基準に
ノーマライゼーションを行うため、
-14 LUFSより大きい音源は再生時に
音量が下げられ、
小さい音源は上げられる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;True Peak Max: -1.0 dBTP&lt;&#x2F;strong&gt; —
サンプル間ピークの上限。
デジタル信号をアナログに変換する際、
サンプル値そのものではなく
DAC再構成後の波形にピークが現れる。
-1.0 dBTPのマージンは
OggやAACへのコーデック変換で
クリッピングが発生しないための
安全域である。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LRA Max: 10.0&lt;&#x2F;strong&gt; —
Loudness Range（ラウドネスレンジ）の
上限。
楽曲内の静かな部分と大きな部分の差を
統計的に測定した値で、
プレイリスト再生で前後の曲と
音量差が開きすぎないよう
上限は10 LUとされている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらのターゲットに対する達成状況を、
Decibelは複数のメーターで同時に表示します。
次のスクリーンショットは
L4 Ultramaximizerを外した状態で
楽曲全体を再生した結果です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;mastering-vocal-piano&amp;#x2F;decibel-full-view.webp?h=a61601e974ebfbdbaea4&quot;
  alt=&quot;Decibel全体表示（L4なし）&quot; width=&quot;1456&quot; height=&quot;828&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;左のSuper MeterにはIntegrated LUFS、
TRUEDYN、TRUEPEAK MAXが
まとめて表示されています。
中央のTarget Validatorでは
LUFS-Iが青字でPASS、
TRUE PEAKが赤字でFAILです。
右側のLUFS Meterは
Momentary（400ミリ秒）、
Short-term（3秒）、
Integrated（全体平均）の
3種類のラウドネスを棒グラフで表示し、
青い破線がターゲットラインです。
下部のLUFS Histogramでは
時系列のラウドネス推移を確認でき、
ピンクのマーカーが
True Peak超過の箇所を示しています。&lt;&#x2F;p&gt;
&lt;p&gt;この結果を見て何をするかが重要です。
ミックスの段階でLUFS-Iは
すでにターゲットに達している一方、
True Peakが-0.9 dBTPと
わずかに基準を超えています。
それぞれのターゲットに対する
アクションは次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;True Peak FAIL&lt;&#x2F;strong&gt; →
L4のCeilingで制御する。
Ceilingはリミッターの出力上限なので、
-1.0 dBTP以下に設定すれば
True Peakはそこで止まる。
今回は-1.1dBに設定した。
DecibelのTrue Peak測定が厳格で
-1.0dBだとわずかに超えることがあったためである。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LUFS-Iが低すぎる場合&lt;&#x2F;strong&gt; →
L4のThresholdを下げる。
Thresholdを下げるとリミッターが
より多くのピークを抑えるため、
相対的に平均ラウドネスが上がる。
今回はミックスの時点で-14.0 LUFSに
達していたので、
Thresholdは-1.5dBと浅い設定で済んでいる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LRAが大きすぎる場合&lt;&#x2F;strong&gt; →
バスコンプレッサーやリミッターで
ダイナミクスの幅を狭める。
今回のTRUEDYNは11.5 dBで
LRA Max 10.0を超えているが、
ピアノのダイナミクスを優先して許容した。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;同じネットワークにいるiPadやiPhone、
Androidデバイスにメーター画面を
リアルタイム表示できるのも便利です。
Decibel Displayという無料アプリを入れて
IPアドレスを指定するだけで、
手元のタブレットが
メーターディスプレイになります。&lt;&#x2F;p&gt;
&lt;p&gt;L4を適用した最終測定値は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Integrated LUFS: -14.0&lt;&#x2F;li&gt;
&lt;li&gt;True Peak MAX: -1.0 dBTP&lt;&#x2F;li&gt;
&lt;li&gt;TRUEDYN: 11.5 dB&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;すべてのターゲットを満たしています。&lt;&#x2F;p&gt;
&lt;p&gt;Logic Proからのバウンスは24bit AIFFで行い、
L4のDither設定も24bitに合わせています。
32bit floatでバウンスすると
L4のディザリングが無意味になるので、
ビット深度を揃えることが重要です。
FLAC変換には&lt;code&gt;ffmpeg -c:a flac&lt;&#x2F;code&gt;だけで
変換しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Process.audio Decibelの導入で、
L4 Ultramaximizerと合わせて
マスタリングのツールチェインが整ってきました。
ラウドネスメーターとリミッターが揃ったことで、
「測定→調整→確認」のワークフローが
スムーズに回っています。&lt;&#x2F;p&gt;
&lt;p&gt;女性ボーカルとピアノという
シンプルな編成だからこそ、
ダイナミクスの扱い方や周波数の棲み分けが
そのまま音に出ます。
リミッターで潰すのではなく、
演奏のニュアンスを活かす方向で
マスタリングできたのは良かったと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;process.audio&#x2F;en&#x2F;products&#x2F;decibel&quot;&gt;Process.audio Decibel&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.waves.com&#x2F;plugins&#x2F;l4-ultramaximizer&quot;&gt;Waves L4 Ultramaximizer&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.uaudio.com&#x2F;&quot;&gt;Universal Audio&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">iZotopeのサブスクリプション値上げを機に、
Process.audio Decibelへ乗り換えました。
Spotifyプリセットのターゲット
（LUFS-I、True Peak、LRA）の意味と、
メーターの読み方、測定結果から
リミッターをどう調整するかを
実際のセッションで解説します。
</summary>
        </entry><entry xml:lang="en">
        <title>&quot;A Strong and Prosperous Japan&quot;— Reading PM Takaichi&#x27;s Policy Speech
</title>
        <published>2026-02-22T09:03:07+09:00</published>
        <updated>2026-02-22T09:03:07+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/221st-diet-policy-speech-pm-takaichi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/221st-diet-policy-speech-pm-takaichi/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;!-- textlint-disable --&gt; &lt;!-- author-approved: 英語本文のため --&gt;
&lt;p&gt;On February 20, 2026, Prime Minister
Sanae Takaichi delivered her policy speech
at the opening of the 221st session
of the National Diet. Having won
the recent general election and formed
a coalition government with
Nippon Ishin no Kai (Japan Innovation Party),
PM Takaichi used this occasion to launch
her full policy agenda.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;A strong and prosperous Japan.&quot;
Under this message, PM Takaichi presented
six forms of national power:
economic power, technological power,
diplomatic power, defense power,
intelligence power, and human capital.
Over approximately 48 minutes,
she laid out specific policies
for each of these six pillars.&lt;&#x2F;p&gt;
&lt;p&gt;This article, while acknowledging
the full scope of the speech,
focuses on what I found most striking
and essential. How will Japan confront
the unprecedented threat of a China
that no longer bothers to conceal
its hegemonic ambitions?
And the two pillars that underpin
that confrontation:
economic power and intelligence capability.&lt;&#x2F;p&gt;
&lt;p&gt;The full text of the speech is available
on the Prime Minister&#x27;s Office website
(in Japanese).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;105&#x2F;statement&#x2F;2026&#x2F;0220shiseihoshin.html&quot;&gt;Full text of PM Takaichi&#x27;s Policy Speech at the 221st Diet Session&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Confronting_China&amp;#39;s_Naked_Hegemonism&quot;&gt;Confronting China&#x27;s Naked Hegemonism&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;q&gt;Our country must take the wheel itself,
with a long-term perspective,
and decide where we are headed.&lt;&#x2F;q&gt;
PM Takaichi opened the foreign affairs
and security section with this declaration.
Not reactive diplomacy,
but Japan proactively charting its own course.&lt;&#x2F;p&gt;
&lt;p&gt;Behind this declaration lies
China&#x27;s brazen hegemonism. The speech
explicitly stated that China has been
&lt;q&gt;intensifying attempts to change
the status quo by force or coercion
in the East China Sea and South China Sea&lt;&#x2F;q&gt;
and &lt;q&gt;expanding and intensifying
military activities around Japan.&lt;&#x2F;q&gt;
She also noted China&#x27;s
&lt;q&gt;strengthening military cooperation
with Russia.&lt;&#x2F;q&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The construction of military outposts
in the South China Sea,
routine territorial incursions
in the East China Sea,
military intimidation of Taiwan,
and economic coercion of other nations.
China&#x27;s expansionist behavior,
which seeks to rewrite the regional order
by force, is reminiscent of
pre-war imperialism — and in its scale
and diversity of methods,
arguably surpasses it.&lt;&#x2F;p&gt;
&lt;p&gt;Since taking office, PM Takaichi
has maintained an unwavering stance
against this threat. Since her remarks
on a Taiwan contingency last year,
she has faced fierce criticism from
pro-China lawmakers and legacy media,
yet her position has not wavered
in the slightest.&lt;&#x2F;p&gt;
&lt;p&gt;In the speech, she did offer
the diplomatic formality of
&lt;q&gt;comprehensively advancing
the mutually beneficial relationship
based on strategic interests
and building a constructive
and stable relationship&lt;&#x2F;q&gt; with China.
But what deserves attention
is not the words — it is the policies.
The creation of a &quot;Japanese CFIUS&quot;
(Committee on Foreign Investment),
restructuring supply chains
to eliminate dependence
on specific countries,
support for undersea cable deployment,
strengthening critical infrastructure
systems, and considering restrictions
on land acquisition by foreign nationals.
Calm in language, resolute in policy.
This is the hallmark of Takaichi diplomacy.&lt;&#x2F;p&gt;
&lt;p&gt;She positioned the Japan-U.S. alliance
as &quot;the cornerstone of foreign
and security policy&quot; and plans
to strengthen ties with President Trump
during her visit to Washington next month.
Building on the tenth anniversary
of the &quot;Free and Open Indo-Pacific (FOIP)&quot;
concept advocated by former PM Abe,
she stated she would
&quot;strategically evolve&quot; these efforts.
The phrase &quot;a strong and prosperous
Indo-Pacific&quot; conveys a powerful intent
to build a regional order
that counters Chinese hegemony.&lt;&#x2F;p&gt;
&lt;p&gt;On defense, the speech outlined
concrete measures including
an accelerated revision of
the National Security Strategy
and related &quot;three documents&quot;
within this year, reorganizing
the Air Self-Defense Force into
the &quot;Air and Space Self-Defense Force,&quot;
establishing a new &quot;Space Operations Group,&quot;
and revising the five categories
of defense equipment transfers.&lt;&#x2F;p&gt;
&lt;p&gt;To make this confrontation with China
truly effective, PM Takaichi presented
two pillars: economic power
and intelligence capability.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Pillar_One:_Economic_Power_—_&amp;quot;Responsible_Proactive_Fiscal_Policy&amp;quot;&quot;&gt;Pillar One: Economic Power — &quot;Responsible Proactive Fiscal Policy&quot;&lt;&#x2F;h2&gt;
&lt;p&gt;To confront China, Japan itself
must first become strong.
The foundation for this is
what the speech positioned as its
centerpiece: &quot;responsible proactive
fiscal policy.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;PM Takaichi declared she would
&lt;q&gt;break the long-standing trend
of excessive fiscal austerity
and underinvestment in the future.&lt;&#x2F;q&gt;
Investment rests on two pillars:
&quot;crisis management investment&quot;
to minimize risks in areas like
economic security, energy security,
and national resilience,
and &quot;growth investment&quot; in advanced
technology sectors such as AI,
semiconductors, and shipbuilding.&lt;&#x2F;p&gt;
&lt;p&gt;These two types of investment
are closely tied to the China strategy.
Crisis management investment
advances decoupling from economic
dependence on China,
while growth investment secures
Japan&#x27;s technological edge.
In an era of global competition
in industrial policy,
the argument that &lt;q&gt;we should not
hesitate to deploy fiscal resources
where necessary&lt;&#x2F;q&gt; stems from
PM Takaichi&#x27;s realist approach
of treating security and economics
as inseparable.&lt;&#x2F;p&gt;
&lt;p&gt;She also plans to fundamentally
reform budget formulation.
She will &lt;q&gt;break with the practice
of budget formulation that assumes
supplementary budgets every year&lt;&#x2F;q&gt;
and allocate necessary funding
in the initial budget.
Crisis management and growth investments
will be managed under
a &quot;multi-year, separate-track framework.&quot;
This is a major reform
spanning roughly two years.&lt;&#x2F;p&gt;
&lt;p&gt;She also stated that &lt;q&gt;this does not mean
adopting reckless fiscal policy,&lt;&#x2F;q&gt;
explicitly setting a fiscal discipline
that caps the growth rate
of outstanding debt
within the economic growth rate.&lt;&#x2F;p&gt;
&lt;p&gt;What is particularly noteworthy
is that this policy is already
being implemented.
The government has issued deficit bonds,
reduced gasoline and diesel prices
by abolishing provisional tax rates,
and provided support
for electricity and gas bills.
This &quot;walking the talk&quot; approach
gives the speech real credibility.&lt;&#x2F;p&gt;
&lt;p&gt;A strong economy directly improves
the lives of citizens.
The so-called &quot;1.03 million yen wall&quot;
will be raised to 1.78 million yen,
and the government is accelerating
consideration of a zero consumption
tax rate on food and beverages
for a two-year period.
When citizens prosper,
the nation&#x27;s underlying strength grows.
This virtuous cycle is the essence
of &quot;responsible proactive fiscal policy.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;q&gt;We will keep pushing the growth switch —
push, push, push,
and push it to the limit.&lt;&#x2F;q&gt;
This powerful declaration encapsulates
the determination behind
the economic policy agenda.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Pillar_Two:_Intelligence_—_Establishing_the_National_Intelligence_Council&quot;&gt;Pillar Two: Intelligence — Establishing the National Intelligence Council&lt;&#x2F;h2&gt;
&lt;p&gt;Elevating &quot;intelligence capability&quot;
as an independent pillar
in a policy speech is unprecedented
among Japanese prime ministers.&lt;&#x2F;p&gt;
&lt;p&gt;A &quot;National Intelligence Council&quot;
chaired by the Prime Minister
will be established within the Cabinet,
and the Cabinet Intelligence
and Research Office will be upgraded
to a &quot;National Intelligence Bureau.&quot;
This consolidates intelligence functions
previously scattered across
various ministries into a unified system
for sound decision-making.&lt;&#x2F;p&gt;
&lt;p&gt;She further stated that she would
&lt;q&gt;advance institutional design to prevent
improper interference from
foreign countries.&lt;&#x2F;q&gt; This can be read as
laying the groundwork for legislation
akin to an anti-espionage law —
a highly significant statement.&lt;&#x2F;p&gt;
&lt;p&gt;Predictably, naive liberal voices
will raise alarm, crying
&quot;this leads to a surveillance society&quot;
and &quot;expanding government power
is dangerous.&quot; However,
given the reality of China&#x27;s actions
described above, failing to build
an intelligence infrastructure
is the true risk for the people of Japan.
The intelligence systems that
major democracies like the United States,
the United Kingdom, and France
maintain as a matter of course —
Japan is finally on the verge
of establishing one in earnest.
If anything, it is long overdue.&lt;&#x2F;p&gt;
&lt;p&gt;Strengthening the national foundation
through economic power
and accurately assessing threats
through intelligence capability.
Only with these two pillars
can Japan&#x27;s foreign and defense policies
for confronting Chinese hegemonism
have real teeth.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Failures_of_China-Accommodating_Cabinets&quot;&gt;Failures of China-Accommodating Cabinets&lt;&#x2F;h2&gt;
&lt;p&gt;PM Takaichi&#x27;s &quot;responsible proactive
fiscal policy&quot; and resolute stance
toward China represent a clear antithesis
to three decades of policy failures.
Following the 1985 Plaza Accord,
the yen surged and Japan&#x27;s economy
fell into prolonged stagnation
after the bubble burst.
Throughout this period,
successive cabinets that took
an accommodating stance toward China
committed critical errors in both
economic and China-related diplomacy.&lt;&#x2F;p&gt;
&lt;p&gt;First, let us examine the trajectory
of nominal GDP among major
developed nations. We compare
relative indices with 1985 —
the year of the Plaza Accord —
set to 100. All figures are
in local currency terms&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;canvas id=&quot;gdpChart&quot; width=&quot;800&quot; height=&quot;450&quot;&gt;&lt;&#x2F;canvas&gt;&lt;&#x2F;p&gt;
&lt;script src=&quot;https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;npm&#x2F;chart.js@4.5.1&#x2F;dist&#x2F;chart.umd.min.js&quot;
  integrity=&quot;sha384-jb8JQMbMoBUzgWatfe6COACi2ljcDdZQ2OxczGA3bGNeWe+6DChMTBJemed7ZnvJ&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;&#x2F;script&gt;
&lt;script&gt;
new Chart(document.getElementById(&#x27;gdpChart&#x27;), {
  type: &#x27;line&#x27;,
  data: {
    labels: [1985,1990,1995,2000,2005,2010,2015,2020,2025],
    datasets: [
      {label:&#x27;Germany&#x27;,data:[100,134,192,215,235,264,312,348,448],borderColor:&#x27;#f39c12&#x27;,borderWidth:3,pointRadius:4,fill:false},
      {label:&#x27;France&#x27;,data:[100,139,162,197,235,266,294,309,397],borderColor:&#x27;#2ecc71&#x27;,borderWidth:3,pointRadius:4,fill:false},
      {label:&#x27;Japan&#x27;,data:[100,136,153,157,156,149,158,159,186],borderColor:&#x27;#1a1a1a&#x27;,borderWidth:4,pointRadius:5,fill:false}
    ]
  },
  options: {
    responsive: true,
    plugins: {
      title: {display:true, text:&#x27;Nominal GDP (1985=100)&#x27;, font:{size:16}},
      legend: {display:true, position:&#x27;bottom&#x27;, labels:{font:{size:13},usePointStyle:true}}
    },
    scales: {
      y: {min:50, max:500, title:{display:true,text:&#x27;Index&#x27;}}
    }
  }
});
&lt;&#x2F;script&gt;
&lt;p&gt;The facts shown in the chart are stark.
Japan, which was on roughly
the same growth trajectory
as other nations until 1990,
was completely left behind
after the bubble burst.
As of 2025, Germany has grown
approximately 4.5 times
and France approximately 4 times
compared to 1985, while Japan
has managed only 1.9 times.&lt;&#x2F;p&gt;
&lt;p&gt;While the causes of economic stagnation
are complex — including the bubble burst
and the global financial crisis —
it cannot be overlooked that throughout
this era of decline,
successive China-accommodating cabinets
committed critical diplomatic errors.
A vicious cycle took hold:
a weak economy made it impossible
to stand firm against China,
and deference to China further
constrained the economy.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cabinet&lt;&#x2F;th&gt;&lt;th&gt;Economic Failures&lt;&#x2F;th&gt;&lt;th&gt;Failures on China&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Miyazawa (91-93)&lt;&#x2F;td&gt;&lt;td&gt;Delayed disposal of bad loans. Origin of the &quot;Lost Two Decades&quot;&lt;&#x2F;td&gt;&lt;td&gt;Arranged Emperor&#x27;s visit to China after Tiananmen, breaking China&#x27;s international isolation. Continued ODA to China&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hosokawa (93-94)&lt;&#x2F;td&gt;&lt;td&gt;No economic measures. Announced &quot;National Welfare Tax&quot; late at night, retracted next day&lt;&#x2F;td&gt;&lt;td&gt;Explicitly called WWII an &quot;aggressive war,&quot; strengthening China&#x27;s history card&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Murayama (94-96)&lt;&#x2F;td&gt;&lt;td&gt;Failed to respond to extreme yen appreciation (79 yen&#x2F;dollar). Delayed earthquake response&lt;&#x2F;td&gt;&lt;td&gt;Murayama Statement bound subsequent cabinets. No effective sanctions on China&#x27;s nuclear tests&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fukuda Y. (07-08)&lt;&#x2F;td&gt;&lt;td&gt;Abruptly resigned just before the Lehman shock, creating a political vacuum&lt;&#x2F;td&gt;&lt;td&gt;Accepted China&#x27;s fait accompli on East China Sea gas fields. Concealed information on poisoned dumpling incident&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hatoyama (09-10)&lt;&#x2F;td&gt;&lt;td&gt;&quot;From concrete to people&quot; — cut public works. Budget screening slashed science funding. Ignored yen appreciation&lt;&#x2F;td&gt;&lt;td&gt;&quot;East Asian Community&quot; concept undermined the Japan-U.S. alliance. Futenma debacle weakened China deterrence&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kan (10-11)&lt;&#x2F;td&gt;&lt;td&gt;Deepening yen appreciation and deflation. Currency interventions were sporadic and ineffective&lt;&#x2F;td&gt;&lt;td&gt;Caved to Chinese pressure in the Senkaku fishing boat incident, releasing the captain. Concealed collision footage&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Noda (11-12)&lt;&#x2F;td&gt;&lt;td&gt;Passed consumption tax hike during deflation. Strong yen drove manufacturing overseas&lt;&#x2F;td&gt;&lt;td&gt;Nationalized Senkaku Islands without diplomatic groundwork, triggering the largest anti-Japanese protests in history&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Looking back, economic weakening
and China accommodation advanced
in lockstep. A weak economy
made it impossible to push back
against China. Deference to China
further constrained the economy.
What PM Takaichi is trying to break
with &quot;responsible proactive fiscal policy&quot;
and &quot;strengthening intelligence capability&quot;
is precisely this vicious cycle.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Assessing_the_Speech&quot;&gt;Assessing the Speech&lt;&#x2F;h2&gt;
&lt;p&gt;This policy speech stands out
even compared to those
of previous prime ministers.&lt;&#x2F;p&gt;
&lt;p&gt;First, &lt;strong&gt;consistency in China policy&lt;&#x2F;strong&gt;.
Despite facing criticism from media
and pro-China lawmakers since
her Taiwan contingency remarks last year,
she has steadily built up
substantive countermeasures:
strengthening economic security,
creating a Japanese CFIUS,
restructuring supply chains,
and establishing the
National Intelligence Council.
The speech combines diplomatic niceties
with resolute policy substance.
This balance of composure and resolve
deserves high praise.&lt;&#x2F;p&gt;
&lt;p&gt;Second, &lt;strong&gt;actions backing the words&lt;&#x2F;strong&gt;.
&quot;Responsible proactive fiscal policy&quot;
is not mere rhetoric.
Deficit bonds have been issued,
provisional tax rates abolished,
and cost-of-living support implemented.
The bold declaration of fundamentally
reforming the budget process
reflects confidence built on results.&lt;&#x2F;p&gt;
&lt;p&gt;Third, &lt;strong&gt;policy coherence&lt;&#x2F;strong&gt;.
The framework of strengthening
national power through economic power
and intelligence capability against
the clear threat of China
powerfully communicates
the administration&#x27;s direction.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, challenges remain.
Can &quot;responsible proactive fiscal policy&quot;
coexist with fiscal discipline?
Will investment across
17 strategic sectors
function effectively?
The hurdles are far from low.&lt;&#x2F;p&gt;
&lt;p&gt;Yet, as the closing words suggest —
&lt;q&gt;A nation that does not take on
challenges has no future.
Politics that only defends
cannot create hope&lt;&#x2F;q&gt; — this speech
carries an unmistakable will
to reject the status quo.
It is a policy speech that conveys
the determination to chart Japan&#x27;s
own course and act on it.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;日本語版 &#x2F; Japanese Version&lt;&#x2F;summary&gt;
&lt;h2 id=&quot;「日本列島を、強く豊かに」—_高市施政方針演説を読む&quot;&gt;「日本列島を、強く豊かに」— 高市施政方針演説を読む&lt;&#x2F;h2&gt;
&lt;p&gt;2026年2月20日、第221回国会の冒頭で、
高市早苗内閣総理大臣が施政方針演説を
行いました。先の衆議院総選挙で勝利し、
日本維新の会との連立政権を発足させた
高市総理が、本格的な政策起動を宣言する
場です。&lt;&#x2F;p&gt;
&lt;p&gt;「日本列島を、強く豊かに。」
このメッセージの下、高市総理は
日本の総合的な国力を構成するものとして
6つの「力」を掲げました。
経済力、技術力、外交力、防衛力、
情報力、そして人材力です。
約48分にわたる演説では、
この6つの柱それぞれについて
具体的な施策が示されました。&lt;&#x2F;p&gt;
&lt;p&gt;本記事ではその全体像を踏まえた上で、
筆者が特に印象的で
この演説の肝だと感じた点に
焦点を当てます。
覇権主義を隠そうともしない中国という
かつてない脅威に、
日本はどう立ち向かうのか。
そしてそれを支える二本の柱、
経済力と情報力です。&lt;&#x2F;p&gt;
&lt;p&gt;演説の全文は首相官邸のサイトで
公開されています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;105&#x2F;statement&#x2F;2026&#x2F;0220shiseihoshin.html&quot;&gt;第２２１回国会における高市内閣総理大臣施政方針演説 全文&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;覇権主義も露わな中国への対峙&quot;&gt;覇権主義も露わな中国への対峙&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;q&gt;我が国が自ら考えてハンドルを握り、
長期的目線をもって、
どこに向かっていくのかを決めることです&lt;&#x2F;q&gt;。
高市総理は外交・安全保障の冒頭で
こう述べました。受動的な外交ではなく、
日本が主体的に方向を定めるという宣言です。&lt;&#x2F;p&gt;
&lt;p&gt;この宣言の背景にあるのは、
中国の露骨な覇権主義です。
演説では、中国が
&lt;q&gt;東シナ海・南シナ海での力又は威圧による
一方的な現状変更の試みを強化&lt;&#x2F;q&gt;し、
&lt;q&gt;我が国周辺での軍事活動を拡大・
活発化させている&lt;&#x2F;q&gt;と明確に指摘しました。
さらに&lt;q&gt;ロシアとの軍事的連携を
強化している&lt;&#x2F;q&gt;とも述べています。&lt;&#x2F;p&gt;
&lt;p&gt;南シナ海における軍事拠点の建設、
東シナ海での領海侵入の常態化、
台湾への軍事的威嚇、
経済的威圧による他国への恫喝。
地域秩序を力で塗り替えようとする
中国の膨張主義的な行動は、
戦前の帝国主義を彷彿とさせるものであり、
その規模と手段の多様さにおいて
むしろそれを上回るとすら言えます。&lt;&#x2F;p&gt;
&lt;p&gt;高市総理は就任以来、
この脅威に対して毅然とした姿勢を
貫いてきました。昨年の台湾有事をめぐる
発言以降、国内の親中派議員や
オールドメディアから激しい批判に
さらされてきましたが、その姿勢は
まったく揺らいでいません。&lt;&#x2F;p&gt;
&lt;p&gt;演説では、中国との関係について
&lt;q&gt;戦略的互恵関係を包括的に推進し、
建設的かつ安定的な関係を構築していく&lt;&#x2F;q&gt;
という外交辞令も述べていますが、
注目すべきは言葉ではなく政策です。
「日本版CFIUS」（対日外国投資委員会）の
創設、特定国に依存しない
サプライチェーンの再構築、
海底ケーブル敷設の支援、
基幹インフラ制度の強化、
外国人による土地取得規制の検討。
言葉は冷静に、しかし政策は毅然と。
この姿勢こそが高市外交の真骨頂です。&lt;&#x2F;p&gt;
&lt;p&gt;日米同盟を「外交・安全保障政策の基軸」
と位置づけ、来月の訪米で
トランプ大統領との関係強化を図ります。
安倍元総理が提唱した
「自由で開かれた
インド太平洋（FOIP）」の
十周年を踏まえ、その取組を
「戦略的に進化させる」と述べました。
「インド太平洋を、強く豊かに」
という言葉には、中国の覇権に対抗する
地域秩序構築への強い意志が感じられます。&lt;&#x2F;p&gt;
&lt;p&gt;防衛面でも具体的な強化策が並びます。
国家安全保障戦略など「三文書」の
本年中の前倒し改定、
航空自衛隊の「航空宇宙自衛隊」への改編、
「宇宙作戦集団」の新編成、
防衛装備移転の五類型見直しなどです。&lt;&#x2F;p&gt;
&lt;p&gt;こうした対中戦略を実効あるものとすべく、
高市総理は経済力と情報力の
二本の柱を示しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;第一の柱：経済力_—_「責任ある積極財政」&quot;&gt;第一の柱：経済力 — 「責任ある積極財政」&lt;&#x2F;h2&gt;
&lt;p&gt;中国と対峙するためには、
まず日本自身が強くなければなりません。
その基盤となるのが、
演説の「本丸」と位置づけられた
「責任ある積極財政」です。&lt;&#x2F;p&gt;
&lt;p&gt;高市総理は
&lt;q&gt;長年続いてきた過度な緊縮志向、
未来への投資不足の流れを断ち切る&lt;&#x2F;q&gt;と
宣言しました。投資の柱は2つです。
経済安全保障やエネルギー安全保障、
国土強靱化などのリスクを最小化する
「危機管理投資」と、
AI、半導体、造船など
先端技術分野への「成長投資」です。&lt;&#x2F;p&gt;
&lt;p&gt;この2つの投資は対中戦略と
密接に結びついています。
危機管理投資は中国への
経済的依存からの脱却を進め、
成長投資は日本の技術的優位を確保します。
世界が産業政策の大競争時代にある中、
&lt;q&gt;必要な財政出動をためらうべきではない&lt;&#x2F;q&gt;
という主張は、安全保障と経済を
一体として捉える高市総理の
現実主義的な発想から来ています。&lt;&#x2F;p&gt;
&lt;p&gt;予算編成のあり方も根本から改めます。
&lt;q&gt;毎年補正予算が組まれることを前提とした
予算編成と決別&lt;&#x2F;q&gt;し、
必要な予算は当初予算で措置する。
危機管理投資や成長投資は
「多年度にわたり別枠で管理する仕組み」を
導入する。約二年がかりの大改革です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;q&gt;野放図な財政政策をとるわけではない&lt;&#x2F;q&gt;
とも述べ、成長率の範囲内に
債務残高の伸び率を抑える
財政規律を明示しました。&lt;&#x2F;p&gt;
&lt;p&gt;特筆すべきは、この方針がすでに
実行に移されている点です。
赤字国債の発行に踏み切り、
暫定税率の廃止による
ガソリン・軽油の値下げ、
電気・ガス料金の支援を実施しています。
掲げた政策を着実に実行する
「有言実行」の姿勢が、
この演説に説得力を与えています。&lt;&#x2F;p&gt;
&lt;p&gt;強い経済は国民生活の向上にも
直結します。
いわゆる「103万円の壁」を
178万円に引き上げ、
飲食料品の消費税を二年間に限り
ゼロ税率とする検討も加速します。
国民が豊かになることで
国としての底力が増す。
この好循環こそが
「責任ある積極財政」の本質です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt; &lt;!-- author-approved: 演説の直接引用 --&gt;
&lt;p&gt;&lt;q&gt;とにかく成長のスイッチを押して、
押して、押して、押して、
押しまくってまいります&lt;&#x2F;q&gt;。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;この力強い言葉に、
経済政策にかける決意が凝縮されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;第二の柱：情報力_—_国家情報会議の創設&quot;&gt;第二の柱：情報力 — 国家情報会議の創設&lt;&#x2F;h2&gt;
&lt;p&gt;施政方針演説に「情報力」を
独立した柱として掲げたことは、
歴代首相の演説には見られなかった
特筆すべき点です。&lt;&#x2F;p&gt;
&lt;p&gt;内閣総理大臣を議長とする
「国家情報会議」を内閣に設置し、
内閣情報調査室を「国家情報局」に
格上げするとしました。
各省庁に分散していた
インテリジェンス機能を集約し、
的確な意思決定につなげる体制の
構築です。&lt;&#x2F;p&gt;
&lt;p&gt;さらに&lt;q&gt;外国からの不当な干渉を
防止するための制度設計を進める&lt;&#x2F;q&gt;とも
述べています。いわゆるスパイ防止法的な
法整備への布石とも読み取れる、
注目すべき言及です。&lt;&#x2F;p&gt;
&lt;p&gt;この施策に対しては、
脳みそがお花畑のリベラル派が
「監視社会につながる」
「政府権限の拡大は危険だ」と
大騒ぎすることは容易に予想できます。
しかし、先に述べた中国の現実を前に、
インテリジェンス体制の整備を
怠ることこそ国民にとっての
本当のリスクです。
米国、英国、フランスなど
主要先進国が当然のように
備えている情報機関の仕組みを、
日本がようやく本格的に
持とうとしています。
むしろ遅きに失したと言うべきでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;経済力で国の基盤を固め、
情報力で脅威を正確に把握する。
この二本の柱があってこそ、
中国の覇権主義に毅然と対峙する
外交・防衛政策が実効性を持ちます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対中融和内閣が重ねた失策&quot;&gt;対中融和内閣が重ねた失策&lt;&#x2F;h2&gt;
&lt;p&gt;高市総理の「責任ある積極財政」と
毅然とした対中姿勢は、
過去30年の失政への明確なアンチテーゼです。
1985年のプラザ合意を契機に円高が進行し、
バブル崩壊後の日本経済は
長期停滞に陥りました。
この間、対中融和的な歴代内閣が
経済と対中外交の両面で
致命的な判断ミスを重ねてきました。&lt;&#x2F;p&gt;
&lt;p&gt;まず、主要先進国の名目GDPの推移を
見てみましょう。
1985年のプラザ合意時点を100とした
相対指数で比較します。
各国とも自国通貨建ての名目GDPです。&lt;&#x2F;p&gt;
&lt;p&gt;グラフが示す事実は残酷です。
1990年まで各国とほぼ同じ成長軌道に
あった日本は、バブル崩壊後に完全に
取り残されました。2025年時点で、
ドイツは1985年比で約4.5倍、
フランスは約4倍に成長した一方、
日本はわずか1.9倍にとどまっています。&lt;&#x2F;p&gt;
&lt;p&gt;経済停滞の要因はバブル崩壊や
リーマン・ショックなど複合的ですが、
この凋落の時代を通じて
対中融和的な歴代内閣が
対中外交で致命的な判断ミスを
重ねてきたことは見逃せません。
経済が弱いから中国に強く出られない、
中国に配慮するから
経済的にも自縛するという悪循環が、
日本の停滞をさらに深刻にしました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;内閣&lt;&#x2F;th&gt;&lt;th&gt;経済面の失策&lt;&#x2F;th&gt;&lt;th&gt;対中国の失策&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;宮澤（91-93）&lt;&#x2F;td&gt;&lt;td&gt;不良債権処理を先送り。「失われた20年」の起点&lt;&#x2F;td&gt;&lt;td&gt;天安門事件後に天皇訪中を実現し中国の孤立を解消。対中ODA継続&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;細川（93-94）&lt;&#x2F;td&gt;&lt;td&gt;経済対策なし。「国民福祉税」を深夜に発表し翌日撤回&lt;&#x2F;td&gt;&lt;td&gt;先の大戦を「侵略戦争」と明言し中国の歴史カードを強化&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;村山（94-96）&lt;&#x2F;td&gt;&lt;td&gt;1ドル79円の超円高に対応できず。震災初動も遅れ&lt;&#x2F;td&gt;&lt;td&gt;村山談話で歴代内閣を拘束。中国の核実験に実効的制裁なし&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;福田康夫（07-08）&lt;&#x2F;td&gt;&lt;td&gt;リーマン・ショック直前に突然退陣し政治空白を生む&lt;&#x2F;td&gt;&lt;td&gt;東シナ海ガス田で中国の既成事実を追認。毒餃子事件の情報を隠蔽&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;鳩山（09-10）&lt;&#x2F;td&gt;&lt;td&gt;「コンクリートから人へ」で公共事業削減。事業仕分けで科学技術予算も切る。円高放置&lt;&#x2F;td&gt;&lt;td&gt;「東アジア共同体」構想で日米同盟を毀損。普天間迷走で対中抑止力を低下&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;菅直人（10-11）&lt;&#x2F;td&gt;&lt;td&gt;円高デフレの深刻化。為替介入も単発で効果なし&lt;&#x2F;td&gt;&lt;td&gt;尖閣漁船衝突事件で中国の圧力に屈し船長を釈放。衝突映像を隠蔽&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;野田（11-12）&lt;&#x2F;td&gt;&lt;td&gt;デフレ下で消費増税法を成立。円高で製造業が海外流出&lt;&#x2F;td&gt;&lt;td&gt;尖閣国有化の外交的根回し不足で史上最大の反日デモを招く&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;こうして振り返ると、
経済の弱体化と対中融和は
表裏一体で進んできたことがわかります。
経済が弱いから中国に強く出られない。
中国に配慮するから経済的にも自縛する。
高市総理が「責任ある積極財政」と
「情報力の強化」で断ち切ろうとしている
のは、まさにこの悪循環です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;演説の評価&quot;&gt;演説の評価&lt;&#x2F;h2&gt;
&lt;p&gt;今回の施政方針演説は、
歴代首相の演説と比較しても
際立った特徴を持っています。&lt;&#x2F;p&gt;
&lt;p&gt;まず、&lt;strong&gt;対中政策の一貫性&lt;&#x2F;strong&gt;です。
昨年の台湾有事をめぐる発言以降、
メディアや親中派議員からの批判に
さらされながらも、実質的な対策を
着実に積み上げてきました。
経済安全保障の強化や日本版CFIUSの創設、
サプライチェーンの再構築、
国家情報会議の設置などです。
演説では外交辞令的な表現を
用いつつも、政策面では毅然とした対応が
盛り込まれています。
この冷静さと胆力の両立は、
高く評価すべき点です。&lt;&#x2F;p&gt;
&lt;p&gt;次に、&lt;strong&gt;有言実行の裏付け&lt;&#x2F;strong&gt;です。
「責任ある積極財政」は
単なるスローガンではなく、
すでに赤字国債の発行、
暫定税率の廃止、
物価高対策の実施といった形で
実行に移されています。
予算の作り方を根本から改めるという
大胆な宣言にも、
実績に基づく自信がうかがえます。&lt;&#x2F;p&gt;
&lt;p&gt;そして、&lt;strong&gt;政策の体系性&lt;&#x2F;strong&gt;です。
中国という明確な脅威に対し、
経済力と情報力の二本の柱で
国力を強化するという構図は、
政権の方向性を力強く伝えるものです。&lt;&#x2F;p&gt;
&lt;p&gt;もちろん、実現に向けた課題もあります。
「責任ある積極財政」が
財政規律と両立できるのか、
17の戦略分野への投資が
実効的に機能するのか。
ハードルは決して低くありません。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、&lt;q&gt;挑戦しない国に未来はありません。
守るだけの政治に『希望』は
生まれません&lt;&#x2F;q&gt;という
結びの言葉が象徴するように、
この演説には現状維持を良しとしない
明確な意志があります。
日本の進むべき方向を自ら定め、
実行に移していく覚悟を感じさせる
施政方針演説でした。&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Nominal GDP trajectory (local currency, 1985=100). Source: IMF World Economic Outlook (October 2025 edition). Germany and France 1985-1990 figures are ECU conversion estimates. 2025 figures include estimates. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">An analysis of Prime Minister Takaichi&#x27;s
policy speech delivered on February 20, 2026.
This article examines the speech through
the lens of confronting China&#x27;s hegemony,
supported by two pillars:
economic power and intelligence capability.
</summary>
        </entry><entry xml:lang="en">
        <title>もしかしてだけど、あれって日本最古のアスキーアートだったんじゃないの？</title>
        <published>2026-02-21T00:00:00+00:00</published>
        <updated>2026-02-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/img2char-ascii-art-1986/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/img2char-ascii-art-1986/</id>
        
            <content type="html">&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;img2char-ascii-art-1986&amp;#x2F;cover.webp?h=23adb599ec98a887ae4f&quot;
  alt=&quot;img2charによる変換例&quot; width=&quot;800&quot; height=&quot;485&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;em&gt;左の画像はMidjourneyで生成したものです&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;1986年、パソコン通信は黎明期でASCIInetがまだ実験運用の時代でした。その頃の私はグラフィック（おそらくモノクロの有名歌手の画像）を自作プログラムでASCII文字の絵にして、あるパソコン通信のBBS（電子掲示板）に投稿しました。&lt;&#x2F;p&gt;
&lt;p&gt;あれから約40年。当時のアルゴリズムをGoで再実装し、CLIツール &lt;code&gt;img2char&lt;&#x2F;code&gt; として公開しました。&lt;&#x2F;p&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;img2char&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;この記事では、当時の背景と &lt;code&gt;img2char&lt;&#x2F;code&gt; のアルゴリズムを紹介します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1986年のパソコンとBBS&quot;&gt;1986年のパソコンとBBS&lt;&#x2F;h2&gt;
&lt;p&gt;1986年はPC-VAN（1986年4月実験開始）やNIFTY-Serve（1987年4月開始）が立ち上がり始めた、日本のパソコン通信黎明期です。アスキーネット（ASCII-NET）は前年の1985年5月に実験サービスを開始しており、草の根BBSも各地で産声を上げていました。通信速度は300bpsから1200bps。BBSに書き込めるのはテキストだけの時代でした。グラフィックスを書き込むなんてとんでもない時代でした&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;当時のパソコンのグラフィック事情も触れておきます。1986年時点では、画像をファイルとして保存・交換する汎用フォーマットはまだ普及していませんでした。グラフィックを描くといえば、BASICのLINE文やPAINT文を使ってプログラムとして記述するのが主流です。私自身、PAINT文を使わずに画像の上端から下端まで（縦200ドットしかない画面です）をLINE文だけで1ラインずつ塗りつぶし、モノクロ画像を描くことに当時凝っていました。グラフィックは「描く」ものであって「ファイルで送る」ものではなかったのです。&lt;&#x2F;p&gt;
&lt;p&gt;しかもBASICは機種ごとに方言が異なり、あるマシンで書いたプログラムが別のマシンでそのまま動くことはまずありません。グラフィック描画プログラムをBBSで流通させるのも現実的ではありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;そこで思いついたのが、「ASCII文字絵にすれば遅いパソコン通信でも送れるんじゃね？」です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Sharp_X1_──_骨の髄までハードを極めたマシン&quot;&gt;Sharp X1 ── 骨の髄までハードを極めたマシン&lt;&#x2F;h2&gt;
&lt;p&gt;Sharp X1は1982年に発売された8ビットパソコンです。テレビ事業で培ったシャープの技術が随所に活かされた、ハードウェア設計の塊のようなマシンでした。&lt;&#x2F;p&gt;
&lt;p&gt;当時のZ80 CPUはメモリ空間が64KBしかなく、NECのPC-8801などではこの空間にメインRAMとグラフィックVRAM（GVRAM）を重ねて配置し、バンク切り替えでアクセスしていました。一方X1は、Z80のI&#x2F;O命令が実行時にアドレスバスの上位8ビット（A8〜A15）にもレジスタの値を出力するという、公式マニュアルには記載されているものの目立たない仕様を活用しました。I&#x2F;O空間を実質64KBに広げ、そこにGVRAMを配置したのです。メモリ空間64KBは丸ごとRAMとして使え、GVRAMへはI&#x2F;O命令で直接アクセスできます。&lt;&#x2F;p&gt;
&lt;p&gt;この設計のおかげで、BASICからでもグラフィックVRAM上の画像データを読み出すことができました。グラフィックVRAM上の画像を8x8ドット単位で読み取り、キャラクタROMの各文字パターンと比較する。一致度が最も高い文字を選ぶ。このアルゴリズムをBASICで実装しました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;アルゴリズムの現代版_──_img2char&quot;&gt;アルゴリズムの現代版 ── img2char&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;img2char&lt;&#x2F;code&gt; は、あの当時のアルゴリズムをGoで忠実に再現したCLIツールです。処理は3段階で構成されています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;フォントパターンの準備&lt;&#x2F;strong&gt; ── 95個のASCII印字可能文字の8x8ビットマップを用意する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;画像のブロック分割&lt;&#x2F;strong&gt; ── 入力画像を8x8ピクセルのブロックに分割する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;パターンマッチング&lt;&#x2F;strong&gt; ── 各ブロックとフォントパターンのハミング距離を計算し、最も近い文字を選ぶ&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;フォントテーブルの構築&quot;&gt;フォントテーブルの構築&lt;&#x2F;h3&gt;
&lt;p&gt;95個の印字可能ASCII文字（スペース &lt;code&gt;0x20&lt;&#x2F;code&gt; からチルダ &lt;code&gt;0x7E&lt;&#x2F;code&gt; まで）について、それぞれ8x8ドットのビットマップパターンを持っています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; font8x8Basic contains 8x8 bitmap patterns for 95 printable ASCII characters (0x20–0x7E).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; font8x8Basic&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;95&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;][&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 0x20 &amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 0x21 &amp;#39;!&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;18&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3C&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3C&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;18&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;18&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;18&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 0x22 &amp;#39;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;36&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;36&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; ... 95文字分のパターンが続く&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 0x41 &amp;#39;A&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0C&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1E&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;33&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;33&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3F&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;33&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;33&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 0x7E &amp;#39;~&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;6E&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3B&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;各バイトが8x8ビットマップの1行に対応し、LSB（最下位ビット）が左端のピクセルです。たとえば &lt;code&gt;A&lt;&#x2F;code&gt; のパターンを展開すると、以下のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(2進数はLSB=左端ピクセルから表記)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x0C = 00110000 → ..##....&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x1E = 01111000 → .####...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x33 = 11001100 → ##..##..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x33 = 11001100 → ##..##..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x3F = 11111100 → ######..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x33 = 11001100 → ##..##..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x33 = 11001100 → ##..##..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0x00 = 00000000 → ........&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;8バイトで1文字の形が表現されています。高速な比較のため &lt;code&gt;uint64&lt;&#x2F;code&gt; にパックします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; packFont&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; uint64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; v&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; uint64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        v&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |=&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; uint64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; v&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;X1に搭載されていたHu-BASICの整数型は16ビット（2バイト）なので、当時は8バイトのパターンを2バイトずつ4回のXORループで比較していました。現代のGoでは8バイトを1つの64ビット整数に詰め込むことで、後述のXOR演算が一発で実行できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;8x8ブロックとフォントパターンの照合&quot;&gt;8x8ブロックとフォントパターンの照合&lt;&#x2F;h3&gt;
&lt;p&gt;ここが核心部分です。画像から切り出した8x8ブロックを、95文字すべてのフォントパターンと比較し、最も「形が近い」文字を見つけます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; matchChar&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;block&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fontTable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;95&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;uint64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    blockVal&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; packBlock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;block&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    bestDist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 65&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; max possible is 64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    bestIdx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 95&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        dist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bits&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;OnesCount64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;blockVal&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ^&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fontTable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bestDist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            bestDist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            bestIdx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;    return byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; bestIdx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;blockVal ^ fontTable[i]&lt;&#x2F;code&gt; のXOR演算で、ブロックとフォントパターンのビットが異なる位置を検出します。&lt;code&gt;bits.OnesCount64&lt;&#x2F;code&gt; でその異なるビット数（ハミング距離）を数えます。64ビット中の不一致ビット数が最小の文字を選ぶ、シンプルかつ強力な方式です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;使い方&quot;&gt;使い方&lt;&#x2F;h3&gt;
&lt;p&gt;入力画像は640x200または320x200ピクセルの二値化済みPNGである必要があります。前処理用のシェルスクリプトが付属しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 前処理（ImageMagickでリサイズ＋二値化）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;convert.sh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.jpg&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 640 200&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ASCII文字に変換&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;img2char&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input_640x200.png&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;640x200の画像は80x25文字、320x200なら40x25文字に変換されます。当時は320x200モードの40x25文字でやっていました。&lt;&#x2F;p&gt;
&lt;p&gt;今回、同じロジックで似たような画像を変換してみましたが、なかなかいけています（冒頭の画像を参照）。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;もしかして......日本最古のASCII_Artなんじゃないの？&quot;&gt;もしかして......日本最古のASCII Artなんじゃないの？&lt;&#x2F;h2&gt;
&lt;p&gt;当時の変換結果をパソコン通信のBBSに投稿したところ、ちょっとした話題になりました。テキストしか表示できない端末に、文字だけで画像が浮かび上がるのですから、当時としては驚きだったようです。40x25文字分の解像度しかありませんが、元の画像の輪郭や特徴が文字の組み合わせで再現される様子は、見た人を楽しませるものでした。&lt;&#x2F;p&gt;
&lt;p&gt;ここで少し大胆なことを言わせてください。&lt;&#x2F;p&gt;
&lt;p&gt;文字で画像を表現する試み自体は古く、1898年のタイプライターアートにまで遡ります。コンピューターによる自動変換も、1967年にベル研究所のケネス・ノウルトンがIBM 7094で実現しています。ただしそれは巨大なメインフレームでの話です。&lt;&#x2F;p&gt;
&lt;p&gt;日本に目を向けると、記録に残る最古の「アスキーアート」は1986年6月20日にアスキーネット上で若林泰志が投稿した顔文字 &lt;code&gt;(^_^)&lt;&#x2F;code&gt; とされています。2ちゃんねるでAAが花開くのは1999年以降。1986年当時、手作業でAA（アスキーアート）を描く文化はまだ広まっていませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;そんな時代に、8ビットパソコンで画像をASCII文字に変換してBBSに投稿していたわけです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;もしかして、もしかしてだけど、これって日本最古のアスキーアートなんじゃないの？&lt;&#x2F;strong&gt;（どぶろっく風）&lt;&#x2F;p&gt;
&lt;p&gt;......まあ、証拠は当時のBBSのログとともに電子の海に消えてしまいましたが。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;img2char&lt;&#x2F;code&gt; は、1986年のSharp X1で生まれたアイデアを現代のGoで再実装したツールです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;当時のパソコン通信の制約（テキストのみ）が生んだ発想&lt;&#x2F;li&gt;
&lt;li&gt;PCGという強力なハードウェアをあえて使わず、ASCII文字だけで勝負した選択&lt;&#x2F;li&gt;
&lt;li&gt;8x8ドットブロックとフォントパターンのハミング距離による照合という、シンプルだが効果的なアルゴリズム&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;40年前のBASICプログラムが64ビット整数のXOR演算に姿を変えても、やっていることは同じです。画像の形を文字の形で近似する。それだけのことが、なぜか人を惹きつけます。&lt;&#x2F;p&gt;
&lt;p&gt;興味を持っていただけたら、ぜひ試してみてください。&lt;&#x2F;p&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;img2char&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;h2 id=&quot;参考&quot;&gt;参考&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ja.wikipedia.org&#x2F;wiki&#x2F;%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%83%BC%E3%83%88&quot;&gt;アスキーアート - Wikipedia&lt;&#x2F;a&gt; -- 日本におけるアスキーアートの歴史、顔文字の起源&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;ASCII_art&quot;&gt;ASCII art - Wikipedia (English)&lt;&#x2F;a&gt; -- タイプライターアート（1898年）からの世界的な歴史&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asciiart.eu&#x2F;history-of-ascii-art&quot;&gt;The history of ASCII Art - ASCII Art Archive&lt;&#x2F;a&gt; -- ベル研のノウルトン（1967年）による自動変換の歴史&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ja.wikipedia.org&#x2F;wiki&#x2F;X1_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29&quot;&gt;X1 (コンピュータ) - Wikipedia&lt;&#x2F;a&gt; -- Sharp X1のハードウェア仕様&lt;&#x2F;li&gt;
&lt;li&gt;Z80の16ビットI&#x2F;Oアドレスについての考察（大石氏）-- Z80のI&#x2F;O命令が16ビットアドレスを出力する仕様の解説（サイト閉鎖）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;electrelic.com&#x2F;electrelic&#x2F;node&#x2F;639&quot;&gt;パーソナルなコンピュータのメモリ事情（第3回：8ビット中期）- Electrelic&lt;&#x2F;a&gt; -- X1とPC-8801のGVRAM配置方式の比較&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.kogures.com&#x2F;hitoshi&#x2F;history&#x2F;pc-tushin&#x2F;index.html&quot;&gt;パソコン通信の歴史 - 木暮仁&lt;&#x2F;a&gt; -- PC-VAN、NIFTY-Serve、草の根BBSの歴史&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;そもそも画像をファイルに書き出すフォーマットさえ標準的なものはなかった。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;X1にはPCG（Programmable Character Generator）が搭載されており、文字のフォントパターンを自由に書き換えられました。任意のドットパターンを「文字」として表示でき、グラフィックスに近い表現が可能でした。しかしBBSに投稿するならPCGは使えません。相手の画面にPCGのデータは存在せず、表示できるのは標準のASCII文字だけだからです。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">1986年、8ビットパソコンSharp X1で画像をASCII文字に自動変換し、
パソコン通信のBBSに投稿していました。当時のアルゴリズムを
GoでCLIツール img2char として再実装した経緯と技術を紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>Cloudflare無料プランだけで個人サイトのセキュリティが完結した話</title>
        <published>2026-02-20T00:00:00+00:00</published>
        <updated>2026-02-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/cloudflare-benefits/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/cloudflare-benefits/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;cloudflare-benefits&amp;#x2F;cover.webp?h=a800061cf7b938db4dbe&quot;
  alt=&quot;Cover&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflareのアドバンテージは、次の3点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;無料プランだけでWAF・ボット対策まで揃う、セキュリティの充実度&lt;&#x2F;li&gt;
&lt;li&gt;DNS統合だからこそ、煩雑でリスクの高い設定をワンクリックで実現&lt;&#x2F;li&gt;
&lt;li&gt;AIクローラー対策やページ先読みなど、最新トレンドへの即応&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;つい3日前に&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;02&#x2F;migration-to-cloudflare&#x2F;&quot;&gt;Cloudflareへ移転した&lt;&#x2F;a&gt;ばかりです。構成はシンプルで、Cloudflareでドメインを取得し、GitHubリポジトリと連携して静的コンテンツをCloudflare Pages&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;へデプロイしています。この構成だけでも思いの外多くの恩恵が得られたので、まとめておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloudflareでの設定&quot;&gt;Cloudflareでの設定&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflareのダッシュボードで有効にした機能を、カテゴリごとに紹介します。いずれも無料プランで利用でき、ほとんどがトグルひとつで有効にできるものです。なお、本記事の機能名やβ表記は2026年2月時点のCloudflare管理画面のUIに基づいています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Edge_Certificates&quot;&gt;Edge Certificates&lt;&#x2F;h3&gt;
&lt;p&gt;Cloudflareが発行・管理するSSL&#x2F;TLS証明書と、HTTPS通信に関する設定です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Always Use HTTPS&lt;&#x2F;td&gt;&lt;td&gt;HTTP でアクセスが来た場合に自動的に HTTPS へ301リダイレクトしてくれるので、暗号化されていない通信を防げる。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HSTS&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;.dev&lt;&#x2F;code&gt; ドメイン&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を使用しているので私の場合あまり恩恵がないが、ブラウザレベルでHTTPSが強制できる。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Minimum TLS Version&lt;&#x2F;td&gt;&lt;td&gt;サイトに接続する際に許可するTLSプロトコルの最低バージョンの指定。TLS 1.0 と 1.1 は既知の脆弱性があるので、私はTLS1.2にしている。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Opportunistic Encryption&lt;&#x2F;td&gt;&lt;td&gt;HTTPでアクセスしてきたブラウザに対して「暗号化接続も利用可能ですよ」と通知する仕組み。&lt;code&gt;.dev&lt;&#x2F;code&gt; の場合、HTTPアクセスが発生しないので実質的に意味がない。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;TLS 1.3&lt;&#x2F;td&gt;&lt;td&gt;Minimum TLS Version を 1.2 に設定し、この TLS 1.3 をオンにしておけば、「最低 1.2、対応していれば 1.3 を使う」という構成になる。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Automatic HTTPS Rewrites&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;http:&#x2F;&#x2F;&lt;&#x2F;code&gt; をCloudflare が自動的に &lt;code&gt;https:&#x2F;&#x2F;&lt;&#x2F;code&gt; に書き換えて「混在コンテンツ（mixed content）」の問題を防いでくれる。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Certificate Transparency Monitoring&lt;&#x2F;td&gt;&lt;td&gt;自分が意図していない証明書が第三者によって発行された場合（ドメインの不正利用や乗っ取りの兆候）通知してくれる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;Security&quot;&gt;Security&lt;&#x2F;h3&gt;
&lt;p&gt;ボット対策、DDoS防御、WAFなど、サイトを外部の脅威から守るための設定です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;AI Labyrinth&lt;&#x2F;td&gt;&lt;td&gt;まだβ機能だが、robots.txt 等のクロールルールを無視して勝手にサイトをスクレイピングするボットに対して偽コンテンツを読ませて学習データを汚染させるという「ハニーポット」的な機能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Block AI bots&lt;&#x2F;td&gt;&lt;td&gt;AI学習用クローラーをブロックする機能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Bot fight mode&lt;&#x2F;td&gt;&lt;td&gt;悪意のあるボット（スパム、クレデンシャルスタッフィング、DDoS等）を検知すると、JavaScriptチャレンジを出して人間かどうかを確認する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Browser Integrity Check&lt;&#x2F;td&gt;&lt;td&gt;訪問者のHTTPヘッダーを検査して、不正なUser-Agentやスパムボットによく見られる異常なヘッダーパターンを検出し、脅威が見つかった場合はブロックページを表示する。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Challenge passage&lt;&#x2F;td&gt;&lt;td&gt;チャレンジ（CAPTCHA等）をクリアした訪問者が、再度チャレンジを求められるまでの有効時間&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP DDoS attack protection&lt;&#x2F;td&gt;&lt;td&gt;HTTPレイヤーのDDoS攻撃を自動検知・緩和する。無料プランでもCloudflare Free Managed Ruleset（基本的なWAFルール）が付属する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Manage your robots.txt&lt;&#x2F;td&gt;&lt;td&gt;Cloudflare が robots.txt を自動管理するβ機能。Content Signals Policyを選択すると、コンテンツの利用意図を用途別（検索・AI入力・AI学習）に宣言できる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Network-layer DDoS attack protection&lt;&#x2F;td&gt;&lt;td&gt;DDoS保護&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;DNS&quot;&gt;DNS&lt;&#x2F;h3&gt;
&lt;p&gt;DNS応答の改ざん防止やメールのなりすまし対策など、ドメインの信頼性を高める設定です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;DNSSEC&lt;&#x2F;td&gt;&lt;td&gt;DNSレスポンスに暗号署名を付与して、DNS応答の偽造（DNSキャッシュポイズニング等）を防ぐ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Email Security&lt;&#x2F;td&gt;&lt;td&gt;有効にしてDMARCの設定。メール送信の予定はないので、SPFは&quot;v=spf1 -all&quot;で設定。DMARCは&quot;v=DMARC1; p=reject&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;Speed&quot;&gt;Speed&lt;&#x2F;h3&gt;
&lt;p&gt;通信プロトコルの最適化やページ先読みなど、サイト表示を高速化するための設定です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;説明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Web analytics using real user measurement (RUM)&lt;&#x2F;td&gt;&lt;td&gt;実際の訪問者のブラウザからパフォーマンスデータ（ページ読み込み時間など）を収集する。Cookieを使わないプライバシー重視の計測方式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Speed Brain&lt;&#x2F;td&gt;&lt;td&gt;ユーザーがリンクをクリックする前にページを先読みする機能。Speculation Rules API を使い、体感的なページ遷移が高速になる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;2&lt;&#x2F;td&gt;&lt;td&gt;HTTP&#x2F;1.1の後継。1つの接続で複数リクエストを並行処理（多重化）でき、ページ読み込みが高速になる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;3&lt;&#x2F;td&gt;&lt;td&gt;HTTP&#x2F;2の次世代版。TCPの代わりにQUICプロトコルを使い、接続確立が高速でパケットロス時の劣化も少ない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;2 to Origin&lt;&#x2F;td&gt;&lt;td&gt;Cloudflareとオリジンサーバー間の通信にもHTTP&#x2F;2を使う設定&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0-RTT Connection Resumption&lt;&#x2F;td&gt;&lt;td&gt;TLS 1.3で接続済みのクライアントが再訪問時にハンドシェイクの最初の往復を省略でき、再訪問者の初回リクエストが速くなる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;以前のプラットフォームとの比較&quot;&gt;以前のプラットフォームとの比較&lt;&#x2F;h2&gt;
&lt;p&gt;昨年までAmazon Amplify、先月までGitHub Pagesで運用していました。
上記で挙げたCloudflareの機能が、それぞれの環境ではどうだったかを比較してみます。特にセキュリティ列の差に注目してください。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;○: 標準&#x2F;無料で利用可能&lt;&#x2F;li&gt;
&lt;li&gt;△: 別途設定や追加費用で対応可能&lt;&#x2F;li&gt;
&lt;li&gt;×: 非対応&lt;&#x2F;li&gt;
&lt;li&gt;−: 該当なし&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機能&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Amplify + CloudFront&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;GitHub Pages&lt;&#x2F;th&gt;&lt;th&gt;コメント&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Always Use HTTPS&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HSTS&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（手動設定）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td&gt;AWSだけ手動設定の手間がかかる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Minimum TLS Version&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;GitHub Pagesは古いTLSを拒否できず、セキュリティポリシーを徹底しにくい&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Opportunistic Encryption&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;HTTP接続の暗号化への誘導は他のサービスでは提供されていない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;TLS 1.3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Automatic HTTPS Rewrites&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;他では混在コンテンツを自分で探して直す必要がある&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Certificate Transparency Monitoring&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（ACMの一部）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;不正な証明書発行の早期発見に差が出る&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AI Labyrinth&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;ワンクリックでAIスクレイピングに対抗できる機能は他にない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Block AI bots&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（WAFルールで対応）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;AWSは自前でルールを書く手間とWAF費用がかかる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Bot fight mode&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（WAF Bot Control有料）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;AWSで同等機能を得るにはBot Control（月額$10〜＋リクエスト従量課金）が必要&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Browser Integrity Check&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（WAFで部分的）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;AWSでは同等ルールの自作が必要で、運用負荷が高い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Challenge passage&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（WAF）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;Cloudflareはチャレンジの有効期間まで細かく制御できる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP DDoS attack protection&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（WAFは有料）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;無料でWAFまで付くのはCloudflareの大きな強み&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Manage your robots.txt&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;増え続けるAIクローラーへの対応を自動化できる機能は他にない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Network-layer DDoS attack protection&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○（Shield Standard）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DNSSEC&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○（Route 53）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（DNS providerに依存）&lt;&#x2F;td&gt;&lt;td&gt;Cloudflareはワンクリック、DNS一体管理なので設定が圧倒的に楽&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Email Security&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○（Route 53）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（DNS providerに依存）&lt;&#x2F;td&gt;&lt;td&gt;同上。DNS管理とセットなのでSPF&#x2F;DMARCの設定も迷わない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Web analytics (RUM)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;△（CloudWatch RUM有料）&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;Cloudflareは追加費用なしでCookie不要の計測が使える&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Speed Brain&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;ページ先読みによる体感速度向上は他のサービスでは提供されていない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;GitHub Pagesは2026年2月時点でHTTP&#x2F;3未サポート&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP&#x2F;2 to Origin&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;−&lt;&#x2F;td&gt;&lt;td&gt;オリジンサーバーがある構成でのみ意味がある&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0-RTT&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;×&lt;&#x2F;td&gt;&lt;td&gt;再訪問時の体感速度に差が出る。他のサービスでは無料で提供されていない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;AI時代のコンテンツ保護&quot;&gt;AI時代のコンテンツ保護&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflareの無料プランには、AIクローラーに対応する機能が複数用意されています。これらは独立した機能ですが、組み合わせると多層的な防御になります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機能&lt;&#x2F;th&gt;&lt;th&gt;レイヤー&lt;&#x2F;th&gt;&lt;th&gt;役割&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Content Signals Policy&lt;&#x2F;td&gt;&lt;td&gt;意思表示&lt;&#x2F;td&gt;&lt;td&gt;robots.txt内でコンテンツの用途別に許可&#x2F;拒否を宣言する。強制力はなく、善意あるクローラーへの「お願い」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Block AI bots&lt;&#x2F;td&gt;&lt;td&gt;技術的ブロック&lt;&#x2F;td&gt;&lt;td&gt;Cloudflareが「AI学習用」と分類するクローラーをWAFレベルでブロックする。検索エンジンやAIアシスタントは対象外&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AI Labyrinth&lt;&#x2F;td&gt;&lt;td&gt;欺瞞防御&lt;&#x2F;td&gt;&lt;td&gt;ブロックを無視するクローラーに偽コンテンツを読ませ、学習データを汚染させるハニーポット&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;ポイントは、Content Signals PolicyとBlock AI botsの役割分担です。Content Signals Policyでは &lt;code&gt;search=yes, ai-input=yes, ai-train=no&lt;&#x2F;code&gt; のように宣言し、「検索やAI回答での引用はOKだが、モデルの学習には使うな」という意思を伝えます。しかし宣言はあくまで「お願い」なので、AI学習用クローラーに対してはBlock AI botsがWAFレベルで実際にアクセスを遮断します。それでもすり抜けてくるクローラーにはAI Labyrinthが偽データを食わせます。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、AI Crawl ControlのCrawlersタブではクローラーごとに個別のAllow&#x2F;Blockを設定できます。たとえば「ChatGPT-Userは許可するがBytespiderはブロックする」といった細かい制御も可能です。&lt;&#x2F;p&gt;
&lt;p&gt;この多層構成により、AI検索からの流入を確保しつつ学習目的のスクレイピングは拒否するという運用が、無料プランだけで実現できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloudflareの評価&quot;&gt;Cloudflareの評価&lt;&#x2F;h2&gt;
&lt;p&gt;比較表を振り返ると、Cloudflareの強みは大きく3つあります。&lt;&#x2F;p&gt;
&lt;p&gt;1つ目は、無料プランでのセキュリティの充実度です。AWSで同等のボット対策やWAFを実現しようとすると、AWS WAFやBot Controlの追加費用と自前でのルール作成が必要でした。GitHub Pagesではユーザーが設定できるセキュリティ機能はほとんどありません。Cloudflareでは、AIボットのブロック、Bot fight mode、WAFまで無料プランに含まれており、しかもダッシュボードのトグルひとつで有効にできます。&lt;&#x2F;p&gt;
&lt;p&gt;2つ目は、DNS・証明書・セキュリティ・CDNがひとつのダッシュボードに統合されている点です。AWSではRoute 53、CloudFront、ACM、WAFと複数サービスをまたいで設定する必要がありました。GitHub PagesではDNSが外部依存のため、DNSSECやSPF&#x2F;DMARCの設定は利用するDNSプロバイダ次第でした。Cloudflareではドメイン取得からDNSSEC、メールセキュリティ、デプロイまで一箇所で完結するため、設定の見通しがよく管理も楽です。&lt;&#x2F;p&gt;
&lt;p&gt;3つ目は、他のサービスでは提供されていない独自機能です。前述のとおり、Content Signals PolicyからBlock AI bots、AI Labyrinthまで、AIクローラーへの多層的な対応が無料プランだけで揃います。加えて、Speculation Rules APIを活用したSpeed BrainやTLS 1.3の0-RTT再接続など、パフォーマンス面でも独自の機能が提供されています。特にAIクローラー対策は今後ますます重要になる領域であり、「意思表示」と「技術的ブロック」と「欺瞞防御」を組み合わせた構成がワンクリックで手に入るのは大きな安心感があります。&lt;&#x2F;p&gt;
&lt;p&gt;個人の静的サイトという用途では、Cloudflareの無料プランだけで「やりたいことが全部できる」状態になりました。以前はAWSの複数サービスを組み合わせて実現していたことが、Cloudflareではひとつのダッシュボードで、しかも無料で手に入ります。移行してよかったと素直に思います。&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;Cloudflare Pagesは現在、Cloudflare Workersとの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cloudflare.com&#x2F;pages-and-workers-are-converging-into-one-experience&#x2F;&quot;&gt;統合が進んでいる&lt;&#x2F;a&gt;。将来的にはWorkersの静的アセット機能に一本化される見込みだが、Pages自体も引き続き利用可能。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;&lt;code&gt;.dev&lt;&#x2F;code&gt; ドメインはGoogleが管理しているTLDで、HSTS Preload ListにTLD単位で登録済みなので最初からHTTPSが強制される。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Cloudflareの無料プランで利用できるWAF・ボット対策・AIクローラー対策などのセキュリティ機能を、AWS AmplifyやGitHub Pagesと比較しながら紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>事務職の死 — 経産省「2040年 就業構造推計」が突きつける現実</title>
        <published>2026-02-19T00:00:00+00:00</published>
        <updated>2026-02-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/death-of-clerical-work/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/death-of-clerical-work/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;cover.webp?h=0b02e6d8de921af1d1eb&quot;
  alt=&quot;Cover&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- NOTE: 本記事は経産省「2040年頃の就業構造推計（暫定版・新機軸ケース）」に基づく考察です --&gt;
&lt;h2 id=&quot;事務職437万人が「余る」という衝撃&quot;&gt;事務職437万人が「余る」という衝撃&lt;&#x2F;h2&gt;
&lt;p&gt;2026年1月、経済産業省からこれまでの「人手不足」路線を覆す資料が公開されました。「2040年の就業構造推計（改訂版）」と題されたその資料は、2040年には事務職が437万人余剰になると推計しています。人手不足だから外国人労働者の受入拡大を、と言い続けてきた政府が「人が余る」と言い出したのです。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣の成果といえばそうなのかもしれません。案の定、一部では「やっぱり人手不足ではなかったじゃないか」「移民政策は不要だった」と盛り上がっているようです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、そんな単純な話ではありません。この資料を丁寧に読み解くと見えてくるのは「人が余る」でも「人が足りない」でもなく、余る職種と足りない職種の深刻なミスマッチです。そして、その余る側の中心にいるのが&lt;strong&gt;事務職&lt;&#x2F;strong&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では経産省の推計データを読み解きながら、事務職に何が起きようとしているのか、そしてそれがエンジニアを含むすべてのホワイトカラーにとって他人事ではない理由を考えます。なお、本記事で「事務職の死」と呼ぶのは職種の消滅ではなく、従来型の事務スキルがAIに代替されるという構造変化のことです。&lt;&#x2F;p&gt;
&lt;p&gt;なお、本推計は「新機軸ケース」（国内投資が2040年度に名目+4%で200兆円に達する前提）に基づく暫定版であり、一部数値は令和8年1月27日に修正されています。楽観シナリオに基づく推計であるという点は、念頭に置いてお読みください。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;p2.webp?h=26071f6de3a90829f497&quot;
  alt=&quot;経産省「2040年の就業構造推計（改訂版）」概要 — 事務職+437万人余剰に対し、AI利活用人材-約330万人・現場人材-260万人の不足。職種間・学歴間の需給ミスマッチが浮き彫りになっている&quot; width=&quot;1800&quot; height=&quot;568&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;em&gt;出典: 経済産業省「2040年の就業構造推計（改訂版）について」（2026年1月、暫定版・数値精査中）p.2&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;余るのは事務職、足りないのは現場_—_ミスマッチの構造&quot;&gt;余るのは事務職、足りないのは現場 — ミスマッチの構造&lt;&#x2F;h2&gt;
&lt;p&gt;推計の数字を職種別に整理します。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;v1.webp?h=6541c7955c7391ac627d&quot;
  alt=&quot;2040年 職種別 需要数 vs 供給数 — 専門職と現場人材は需要が供給を上回る（不足）のに対し、事務職だけが供給過多で大幅な余剰が生じる&quot; width=&quot;1780&quot; height=&quot;1014&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;em&gt;出典: 経済産業省「2040年の就業構造推計（改訂版）について」（2026年1月、暫定版・数値精査中）のデータをもとに筆者作成&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;2040年時点で、専門職と現場人材は合わせて441万人の不足が見込まれています。ところが事務職だけは437万人もの余剰が生じます。不足441万人と余剰437万人、ほぼ同規模です。全体で見れば労働力は足りているのに、職種の間で壮絶なミスマッチが生じるという推計です。&lt;&#x2F;p&gt;
&lt;p&gt;なぜ事務職だけがこれほど余るのか。原因はAIによるスキル代替です。調整業務や要件分析といった事務型スキルの代替率は現時点で32%、生成AIがさらに進展した場合は追加で23%、合わせて最大55%に達します。現在1,040万人分の労働需要が、AI進展時には670万人分まで縮小する計算です。&lt;&#x2F;p&gt;
&lt;p&gt;一方、介護や医療などの対人業務型の代替率はわずか1〜2%です。傾聴力、他者の反応や心理の理解、腕や足の動作速度、他者の健康・安全への責任といったスキルは、現時点のAIではほぼ代替できません。&lt;&#x2F;p&gt;
&lt;p&gt;では、冒頭で触れた「外国人労働者は不要だった」という主張はどうでしょうか。外国人労働者の就労先を職種の視点で整理してみます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;職種&lt;&#x2F;th&gt;&lt;th&gt;2040年の見通し&lt;&#x2F;th&gt;&lt;th&gt;外国人労働者の状況&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;事務職&lt;&#x2F;td&gt;&lt;td&gt;+437万人（余剰）&lt;&#x2F;td&gt;&lt;td&gt;ほぼ従事していない&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;専門職&lt;&#x2F;td&gt;&lt;td&gt;-181万人（不足）&lt;&#x2F;td&gt;&lt;td&gt;情報通信業に9.1万人など一部&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;現場人材&lt;&#x2F;td&gt;&lt;td&gt;-260万人（不足）&lt;&#x2F;td&gt;&lt;td&gt;製造業59.8万人、建設業17.8万人、医療・福祉11.6万人、宿泊・飲食27.3万人&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;外国人労働者が担っているのは現場人材として不足する領域であり、余剰が生じる事務職ではありません。余る事務職と足りない現場人材は別のレイヤーの問題であり、今回の資料をもって「外国人労働者は不要だ」とは言えません。問題の本質は労働力の総量ではなく、&lt;strong&gt;職種間のミスマッチ&lt;&#x2F;strong&gt;にあります。&lt;&#x2F;p&gt;
&lt;p&gt;そして、この構造が突きつける問いは明快です。余剰となる437万人の事務職は、いったいどこへ行くのか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;余剰事務職の行き先_—_すべての道は険しい&quot;&gt;余剰事務職の行き先 — すべての道は険しい&lt;&#x2F;h2&gt;
&lt;p&gt;437万人の事務職が余る。では、その人たちはどこへ行けばいいのか。移行先の選択肢を消去法で考えてみます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;移行先&lt;&#x2F;th&gt;&lt;th&gt;現実性&lt;&#x2F;th&gt;&lt;th&gt;ハードル&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;専門・技術職&lt;&#x2F;td&gt;&lt;td&gt;低い&lt;&#x2F;td&gt;&lt;td&gt;理系知識・資格が必要で数年単位の訓練を要する。ゼネラリストとして生きてきた人には非現実的&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;現場・ブルーカラー&lt;&#x2F;td&gt;&lt;td&gt;低い&lt;&#x2F;td&gt;&lt;td&gt;体力面の負荷、地方への移住、労働市場での競争環境。慣れない肉体労働は過酷&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;何もしない（滞留）&lt;&#x2F;td&gt;&lt;td&gt;最もありがち&lt;&#x2F;td&gt;&lt;td&gt;非正規化・低賃金化が進み、社会保障費の増大につながる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AI活用人材&lt;&#x2F;td&gt;&lt;td&gt;唯一の現実的な道&lt;&#x2F;td&gt;&lt;td&gt;デジタルスキルの壁。ただし経産省推計でも約330万人の不足が見込まれており、受け皿の規模は合う&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;専門職への移行は、理系の学位や資格を前提とする領域が多く、事務畑一筋で歩んできた人が数年で追いつくのは難しいでしょう。現場職への移行も、体力に加えて地方移住を伴うケースが多く、現実的とは言えません。何もしなければ、職を失うか非正規に流れるかのどちらかです。&lt;&#x2F;p&gt;
&lt;p&gt;消去法で残るのが「AI活用人材」への移行です。経産省推計ではAI・ロボット等利活用人材が約330万人不足するとされており、事務職余剰の437万人と規模感が近い。椅子の数は用意されている計算です。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、この問題には見落とせない構造があります。&lt;&#x2F;p&gt;
&lt;p&gt;まず地理的なミスマッチです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;p5.webp?h=ba7b23f0ffc1e65abc3a&quot;
  alt=&quot;地域別の需給ミスマッチ（職種内訳） — 関東一都三県で+193万人の大幅余剰（大半が事務職）、一方で地方はすべて不足。東北-53万人、関東一都三県以外-89万人など&quot; width=&quot;1800&quot; height=&quot;703&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;em&gt;出典: 経済産業省「2040年の就業構造推計（改訂版）について」（2026年1月、暫定版・数値精査中）p.5&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;事務職の余剰は東京圏（一都三県）に+193万人と集中しています。一方で地方はどの地域も人材不足です。職種だけでなく、場所のミスマッチも重なっています。&lt;&#x2F;p&gt;
&lt;p&gt;次にジェンダーの問題です。2022年時点で事務従事者の構成は男性558万人に対して女性861万人と、60%超が女性です&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。437万人余剰の影響は女性に偏重する構造的な問題です。米国Brookings Institutionの分析でも、AIによる代替リスクが高く適応力の低い労働者の86%が女性とされており&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-3-1&quot;&gt;&lt;a href=&quot;#fn-3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;、これは日本に限らない構造的な問題です。個人の努力だけでは解決できません。リスキリングの機会が性別や年齢を問わず公平に開かれているかは、社会として問われるべき課題です。&lt;&#x2F;p&gt;
&lt;p&gt;2040年まで14年。残された時間は長くありません。では、AI活用人材に移行するとして、具体的に何ができればよいのでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「AI活用人材」に求められる5つのスキル&quot;&gt;「AI活用人材」に求められる5つのスキル&lt;&#x2F;h2&gt;
&lt;p&gt;まず「事務職の死」とは何かを正確に定義しておきます。事務職という職種が消滅するわけではありません。2040年でも事務職の労働需要は1,039万人あります。消えるのは「完備されたマニュアルを熟知して正確に実行する」という従来型の事務スキルです。調整業務、要件分析、定型的な書類作成。これらはまさにAIが最も得意とする領域です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;death-of-clerical-work&amp;#x2F;p12.webp?h=7df13c14dfeeedd6bf24&quot;
  alt=&quot;生成AI・ロボット等の進展による職種別影響 — 事務型の代替率は確定32%＋進展時23%で最大55%、現場型16%＋32%、対人業務型わずか1〜2%にとどまる&quot; width=&quot;1800&quot; height=&quot;494&quot; loading=&quot;lazy&quot;
&#x2F;&gt;
&lt;em&gt;出典: 経済産業省「2040年の就業構造推計（改訂版）について」（2026年1月、暫定版・数値精査中）p.12&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;マニュアルを正確に実行する能力は、日本の組織運営を長年支えてきた重要な能力です。しかし、その能力がAIに代替される以上、生き残るには新しいスキルが求められます。&lt;&#x2F;p&gt;
&lt;p&gt;では「AI活用人材」とは具体的に何ができる人なのか。経産省はAI・ロボット等利活用人材を「機械技術者や情報処理通信技術者等」と定義していますが、これはエンジニア寄りの狭義の定義です。事務職からの移行先として考えるなら、もう少し広義に捉える必要があります。ここからは筆者の考察ですが、AI活用人材に求められるスキルを5つに整理してみます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;スキル&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;業務分解力&lt;&#x2F;td&gt;&lt;td&gt;ビジネス課題を「AIに任せる部分」と「人が判断する部分」に切り分けられる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ツール選定力&lt;&#x2F;td&gt;&lt;td&gt;目的に対してどのAIツール・サービスの組み合わせが適切か見立てられる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AI協働力&lt;&#x2F;td&gt;&lt;td&gt;AIに適切な指示を出し、意図した出力を引き出せる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;出力の評価・判断力&lt;&#x2F;td&gt;&lt;td&gt;AIが出した結果が業務的に正しいか、使えるかを判断できる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;業務設計力&lt;&#x2F;td&gt;&lt;td&gt;上記を組み合わせて新しい業務フローを構築・改善し続けられる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;一見すると「業務分解力」や「出力の評価・判断力」は、長年の業務経験が活きるように思えます。しかし、事務職が持つ業務知識の多くは、社内システム上での手続きやマニュアルどおりの処理手順にすぎません。「なぜこの業務が存在するのか」「ビジネス上の本質的な目的は何か」を理解しているかは別の問題です。手続き的な知識だけでは、課題をAIと人に切り分けることも、AIの出力がビジネス的に妥当かどうかを判断もできません。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、5つのスキルのうち既存の事務職経験で直接活かせるものはほぼゼロに近いのが現実です。&lt;&#x2F;p&gt;
&lt;p&gt;さらに深刻なのは、これらのスキルには確立された獲得パスが存在しないことです。特定の資格や学位では証明できず、「大学に入り直す」といった明確なルートもない。実践の中で身につけていくしかないスキルです。経産省のリスキリング施策が「AI・ロボットと協働する人材の育成を目指すべきではないか」という問題提起止まりになっているのも、この難しさを反映しています。&lt;&#x2F;p&gt;
&lt;p&gt;求められるスキルは見えている。しかし獲得パスは確立されていない。これこそ事務職437万人が直面する本質的な困難です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;スタートラインは全員同じ_—_だからこそ今すぐ動け&quot;&gt;スタートラインは全員同じ — だからこそ今すぐ動け&lt;&#x2F;h2&gt;
&lt;p&gt;ここまで厳しい話が続きました。しかし、1つだけ希望があります。&lt;&#x2F;p&gt;
&lt;p&gt;前章で挙げた5つのスキルのうち、業務分解力や業務設計力は業務コンサルタントや業務系エンジニアがすでに持っているものです。しかし、AI協働力だけは違います。生成AIが実用的になったのはごく最近のこと。ベテランエンジニアも、事務職歴30年のベテランも、AIに適切な指示を出して意図した出力を引き出すスキルという点ではスタートラインが同じです。この新しさこそが、絶望の中にある唯一の希望です。&lt;&#x2F;p&gt;
&lt;p&gt;そして、この状況は日本だけの話ではありません。2026年2月、MicrosoftのAI CEO Mustafa Suleymanは「18か月以内にほぼすべてのホワイトカラー業務がAIで自動化される」と発言しました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-4-1&quot;&gt;&lt;a href=&quot;#fn-4&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。経産省の推計が2040年という長期スパンで語っている問題を、テック業界のトップは「18か月」と言っている。変化のスピードは推計よりもはるかに速い可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;この記事を読んでいる読者の多くは、おそらく事務職ではなくエンジニアやテック人材でしょう。しかし、これは事務職だけの問題ではありません。AIを活用できるかどうかは、あらゆるホワイトカラーの生存条件になりつつあります。事務職の437万人は、その最初の大波を受ける人たちです。次の波が自分に来ないとは限りません。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、437万人全員がAI活用人材に移行できるわけではないことも直視すべきです。移行できなかった人たちを自己責任として切り捨てるのではなく、リスキリングの機会を社会としてどう整備するかが問われています。経産省が「〜必要ではないか」と問題提起にとどまっている領域に、政策として具体的な回答を出すことが急務です。&lt;&#x2F;p&gt;
&lt;p&gt;獲得パスは確立されていないと書きました。裏を返せば、実践だけがパスです。明日の業務でAIツールに1つタスクを投げてみる。出力を評価し、使えるかどうかを自分で判断する。その小さな繰り返しが、5つのスキルすべてのトレーニングになります。&lt;&#x2F;p&gt;
&lt;p&gt;筆者がこの記事をまとめたのは、目の当たりにする非エンジニアの方々が、この変化の波の大きさに気付けず「どのチャットが賢いか」というレベルの会話にとどまっているのを見たからです。&lt;&#x2F;p&gt;
&lt;p&gt;状況は厳しい。しかし、スタートラインは全員同じです。だからこそ、今この瞬間から動き始めた人が生き残る。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考資料&quot;&gt;参考資料&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;経済産業省「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meti.go.jp&#x2F;shingikai&#x2F;sankoshin&#x2F;shin_kijiku&#x2F;029.html&quot;&gt;2040年の就業構造推計（改訂版）について&lt;&#x2F;a&gt;」（2026年1月、第29回産業構造審議会経済産業政策新機軸部会配付資料、2026年2月19日閲覧）&lt;&#x2F;li&gt;
&lt;li&gt;厚生労働省「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mhlw.go.jp&#x2F;stf&#x2F;newpage_50256.html&quot;&gt;『外国人雇用状況』の届出状況まとめ（令和6年10月末時点）&lt;&#x2F;a&gt;」（2026年2月19日閲覧）&lt;&#x2F;li&gt;
&lt;li&gt;出入国在留管理庁「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.moj.go.jp&#x2F;isa&#x2F;policies&#x2F;ssw&#x2F;nyuukokukanri07_00215.html&quot;&gt;特定技能在留外国人数の公表等&lt;&#x2F;a&gt;」（2026年2月19日閲覧）&lt;&#x2F;li&gt;
&lt;li&gt;総務省統計局「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.stat.go.jp&#x2F;data&#x2F;roudou&#x2F;sokuhou&#x2F;nen&#x2F;dt&#x2F;index.html&quot;&gt;労働力調査&lt;&#x2F;a&gt;」（2022年平均、2026年2月19日閲覧）&lt;&#x2F;li&gt;
&lt;li&gt;Brookings Institution &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brookings.edu&#x2F;articles&#x2F;measuring-us-workers-capacity-to-adapt-to-ai-driven-job-displacement&#x2F;&quot;&gt;Measuring US workers&#x27; capacity to adapt to AI-driven job displacement&lt;&#x2F;a&gt;&quot;（2026年2月19日閲覧）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;厚生労働省「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mhlw.go.jp&#x2F;stf&#x2F;newpage_50256.html&quot;&gt;『外国人雇用状況』の届出状況まとめ（令和6年10月末時点）&lt;&#x2F;a&gt;」より。産業別の人数を職種分類に対応させて筆者が整理。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;総務省統計局「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.stat.go.jp&#x2F;data&#x2F;roudou&#x2F;sokuhou&#x2F;nen&#x2F;dt&#x2F;index.html&quot;&gt;労働力調査&lt;&#x2F;a&gt;」（2022年平均）職業別就業者数より。経産省推計の基準年（2022年）の数値。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-3&quot;&gt;
&lt;p&gt;Brookings Institution &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brookings.edu&#x2F;articles&#x2F;measuring-us-workers-capacity-to-adapt-to-ai-driven-job-displacement&#x2F;&quot;&gt;Measuring US workers&#x27; capacity to adapt to AI-driven job displacement&lt;&#x2F;a&gt;&quot;。米国のデータだが、AIによるジェンダー影響の構造は国際的に共通する傾向がある。 &lt;a href=&quot;#fr-3-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-4&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fortune.com&#x2F;2026&#x2F;02&#x2F;13&#x2F;when-will-ai-kill-white-collar-office-jobs-18-months-microsoft-mustafa-suleyman&#x2F;&quot;&gt;Fortune &quot;Microsoft AI CEO says &#x27;all&#x27; white-collar work will be done by AI in 18 months&quot;（2026年2月13日）&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-4-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">経産省の推計データを読み解き、AIによって事務職437万人が余剰となる構造変化と、すべてのホワイトカラーに求められるAI活用スキルについて考察します。</summary>
        </entry><entry xml:lang="en">
        <title>マスタリング練習 -『再会』</title>
        <published>2026-02-18T20:16:16+09:00</published>
        <updated>2026-02-18T20:16:16+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/reunion/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/reunion/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;reunion&amp;#x2F;cover.webp?h=c6785a27cd774369ccdd&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;900&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;LiSA × Uruの「再会(produced by Ayase)」を
カバーしました。といっても楽曲の忠実な再現が
目的ではなく、マスタリングの信号処理チェインと
プラグインのワークフローを学ぶための
練習プロジェクトです。ボーカルを含むすべての
パートを打ち込みで制作し、ミックスと
マスタリングの工程に集中しています。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2268704315&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;reunion&quot; title=&quot;Reunion&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Reunion&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;トラック構成&quot;&gt;トラック構成&lt;&#x2F;h2&gt;
&lt;p&gt;ドラムはLogic Pro内蔵のTR-808音源で
シンプルなパターンを組みました。
ピアノ音源はRavelを使い、
バスでLexicon 224を薄くかけて
空間的な広がりを持たせています。&lt;&#x2F;p&gt;
&lt;p&gt;ボーカルのチェインは少し凝っていて、
まずPultec HLF-3Cで高域を整えてから
1176 Rev Aコンプレッサーで
ダイナミクスを制御し、
Pultec EQP-1Aで倍音を付加しています。
バスにPure Plate Reverbを送って
空間を作りました。
1176の速いアタックでボーカルの
ピークを抑えつつ、Pultecの組み合わせで
存在感のある音像を狙っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;マスタリングチェイン&quot;&gt;マスタリングチェイン&lt;&#x2F;h2&gt;
&lt;p&gt;今回のメインテーマであるマスタリングです。
新たにWaves L4 Ultramaximizerを導入しました。
L4はマルチバンドのリミッター&#x2F;マキシマイザーで、
マスタリングの最終段で音圧を確保するための
定番プラグインです。&lt;&#x2F;p&gt;
&lt;p&gt;マスタリングチェインは以下の順序で
構成しています。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;UADx SSL G Bus Compressor&lt;&#x2F;dt&gt;
&lt;dd&gt;ミックスバス全体にグルー効果を与え、
各パートを1つのまとまりに仕上げます。&lt;&#x2F;dd&gt;
&lt;dt&gt;UADx Pultec EQ&lt;&#x2F;dt&gt;
&lt;dd&gt;低域と高域に倍音を加えて
全体の質感を調整します。&lt;&#x2F;dd&gt;
&lt;dt&gt;Waves L4 Ultramaximizer&lt;&#x2F;dt&gt;
&lt;dd&gt;マルチバンドリミッターとして
音圧を確保します。&lt;&#x2F;dd&gt;
&lt;dt&gt;UADx Ampex ATR-102&lt;&#x2F;dt&gt;
&lt;dd&gt;テープサチュレーションで
アナログ的な質感を付加します。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;メータリングにはiZotope Insight 2を使い、
ラウドネスやステレオイメージを
確認しながら作業しました。&lt;&#x2F;p&gt;
&lt;p&gt;SSL G Bus Compressorで軽く
まとめてからPultec EQで色付けし、
L4で音圧を稼いだあとにAmpex ATR-102の
テープ通しで仕上げるという流れです。
L4を挟む位置はEQのあと、
テープの前というのが今回試した
セッティングですが、
この順序で自然な仕上がりになりました。&lt;&#x2F;p&gt;
&lt;p&gt;打ち込み素材での練習ではありますが、
マスタリングチェインの各段階で
音がどう変化するかを体感できたのは
収穫でした。次は生演奏の素材でも
試してみたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">LiSA × Uruの「再会(produced by Ayase)」を
マスタリング練習の素材として全パート打ち込みで
カバーしました。Waves L4 Ultramaximizerを
新たに導入し、UADプラグインと組み合わせた
マスタリングチェインの構築を試みています。
</summary>
        </entry><entry xml:lang="en">
        <title>非エンジニアのためのClaude Code入門ハンズオンを公開しました</title>
        <published>2026-02-18T00:00:00+00:00</published>
        <updated>2026-02-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/claude-code-entry/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/claude-code-entry/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;claude-code-entry&amp;#x2F;cover.webp?h=b65196c18135d12c77d7&quot;
  alt=&quot;Cover&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;claude-code-entry&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;非エンジニアにもエージェント型AIを広めたい&quot;&gt;非エンジニアにもエージェント型AIを広めたい&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeはエンジニアの世界を一変させました。AIが自らコードを読み書きし、テストを実行し、デバッグまでこなす。ソフトウェア開発の生産性は劇的に向上し、エージェント型AIはエンジニアにとって不可欠なツールになっています。&lt;&#x2F;p&gt;
&lt;p&gt;この波は非エンジニアにも広がり始めています。2026年1月にAnthropicがリリースした「Claude Cowork」は、コマンドライン不要でデスクトップ上のファイルを直接読み書きできるエージェント型AIです。ただし現時点ではClaude Maxプラン向けの研究プレビューであり、すぐに誰でも使えるわけではありません。&lt;&#x2F;p&gt;
&lt;p&gt;Coworkの正式展開を待たなくても、エージェント型AIとの協業は今すぐ体験できます。Claude CodeはターミナルとエディタがあればPro&#x2F;Maxプランで利用可能です。プログラミング経験がない方を対象にしたセルフハンズオン教材を作りました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;claude-code-entry&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;何を学べるか&quot;&gt;何を学べるか&lt;&#x2F;h2&gt;
&lt;p&gt;演習の題材は、WebサイトリニューアルのRFP（提案依頼書）です。「ベンダーに出すRFP書いて」と上司に言われて途方に暮れている非エンジニアの同僚の姿、あるいはでき上がったRFPを見てあなたが頭を抱えた経験はありませんか。要件が曖昧、評価基準が不明確、技術的に実現不可能な記述――エンジニアから見るとツッコミどころ満載の仕様書が回ってくるのはよくある話です。&lt;&#x2F;p&gt;
&lt;p&gt;このハンズオンでは、架空の経営支援サービス会社の社員としてその状況に挑みます。Claude Codeと協業しながらRFPを段階的に仕上げる5つの工程を通じて、ひとりでは手に負えない文書でもエージェント型AIがあれば形にできることを実感してもらえます。環境はWindows PC前提で、Macは想定していません。非エンジニアの標準的な業務環境をそのまま使えるようにしています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工程&lt;&#x2F;th&gt;&lt;th&gt;やること&lt;&#x2F;th&gt;&lt;th&gt;Claude Codeの役割&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;構想&lt;&#x2F;td&gt;&lt;td&gt;目的・読者・伝えたいことを整理&lt;&#x2F;td&gt;&lt;td&gt;対話でアイデアを壁打ちする&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;仕様&lt;&#x2F;td&gt;&lt;td&gt;構成・見出し・要件を決める&lt;&#x2F;td&gt;&lt;td&gt;仕様書を作成する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;執筆&lt;&#x2F;td&gt;&lt;td&gt;仕様に沿って本文を書く&lt;&#x2F;td&gt;&lt;td&gt;セクションごとに下書きを生成する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;校正&lt;&#x2F;td&gt;&lt;td&gt;文章の品質をチェックする&lt;&#x2F;td&gt;&lt;td&gt;校正ツールを実行し修正する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;リリース&lt;&#x2F;td&gt;&lt;td&gt;最終確認し成果物を仕上げる&lt;&#x2F;td&gt;&lt;td&gt;HTML変換を行う&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;ポイントは「生成AIに丸投げする」のではなく、「工程を踏んで人間が主導する」ことです。各工程でエージェントにどう指示し、どう情報を共有し、どう成果物を仕上げるかを体験します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対象者&quot;&gt;対象者&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;プログラミング経験がない、または少ない方&lt;&#x2F;li&gt;
&lt;li&gt;生成AIを業務の文書作成に活用したい方&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;前提として必要なのは、PCの基本操作とMarkdownの基本的な書き方だけです。プログラミングの知識は不要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜRFPを題材にしたか&quot;&gt;なぜRFPを題材にしたか&lt;&#x2F;h2&gt;
&lt;p&gt;システムの提案依頼書（RFP）を題材に選んだ理由は3つあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;構造が明確&lt;&#x2F;strong&gt; -- 背景・目的・要件・評価基準など、決まったセクションがある&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;実務に近い&lt;&#x2F;strong&gt; -- 非エンジニアでも業務で触れる機会がある&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;生成AIとの相性が良い&lt;&#x2F;strong&gt; -- 要件の洗い出しや表現の推敲に向いている&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「チャットで聞いてコピペする」のではなく、構造化された文書をエージェントと一緒に段階的に作り上げるプロセスを体験することが、このハンズオンの狙いです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3つの柱&quot;&gt;3つの柱&lt;&#x2F;h2&gt;
&lt;p&gt;このハンズオンでは、以下の3つを重視しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工程を踏む&lt;&#x2F;strong&gt; -- 一発で完成させず、段階的に仕上げる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;人間が主導する&lt;&#x2F;strong&gt; -- 生成AIは道具。何を作るか決めるのは自分&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ツールを組み合わせる&lt;&#x2F;strong&gt; -- 校正ツール（textlint）など、小さなツールをClaude Codeに使わせる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に「人間が主導する」は、品質面だけでなく著作権の観点からも重要です。人間が構成を考え、指示を出し、取捨選択や修正を加えることで、AI生成物に対する人間の創作的寄与が認められやすくなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;環境と所要時間&quot;&gt;環境と所要時間&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;環境&lt;&#x2F;strong&gt;: Windows PC、Git Bash、Visual Studio Code&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;&#x2F;strong&gt;: Claude Pro&#x2F;Maxプランの契約、またはAPIクレジット&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;所要時間&lt;&#x2F;strong&gt;: 約3時間40分（自分のペースで進行可能）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ハンズオン資料はMarpスライド形式で、ブラウザで開けるHTMLファイルとして提供しています。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-entry&#x2F;releases&quot;&gt;Releases&lt;&#x2F;a&gt;ページからダウンロードして、すぐに始められます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Dry_Runにつきコメント歓迎&quot;&gt;Dry Runにつきコメント歓迎&lt;&#x2F;h2&gt;
&lt;p&gt;現時点ではDry Run（試行版）として公開しています。&lt;&#x2F;p&gt;
&lt;p&gt;技術知識の前提はできる限り下げています。ただしMarkdownの基本やVS Codeの操作は事前に学んでもらう想定です。プレーンテキストで構造化された文書を書く力は、エージェント型AIと協業するうえで最低限必要なスキルだと考えています。とはいえ、実際に非エンジニアが触ったときの「ここが無理」のラインは作った側には見えません。&lt;&#x2F;p&gt;
&lt;p&gt;ぜひ周囲の非エンジニアの方に試してもらい、フィードバックをいただけると助かります。GitHubの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-entry&#x2F;issues&quot;&gt;Issues&lt;&#x2F;a&gt;でもこの記事のコメントでも構いません。「ここで詰まった」「これは無理」という率直な声が一番ありがたいです。&lt;&#x2F;p&gt;
&lt;p&gt;CC BY 4.0ライセンスで公開していますので、社内研修や勉強会でも自由にご活用ください。&lt;&#x2F;p&gt;
</content>
        <summary type="html">非エンジニアを対象としたClaude Code入門ハンズオン教材を公開しました。RFPの作成を題材に、エージェント型AIとの協業を5つの工程で体験できます。</summary>
        </entry><entry xml:lang="en">
        <title>Zolaブログを新ドメイン取得 + Cloudflare移転</title>
        <published>2026-02-17T00:00:00+00:00</published>
        <updated>2026-02-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/migration-to-cloudflare/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/migration-to-cloudflare/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;migration-to-cloudflare&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;TL;DR（Zola利用者向け）&quot;&gt;TL;DR（Zola利用者向け）&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare ProxyとGitHub Pagesの組み合わせでは、Let&#x27;s Encrypt証明書のHTTP-01チャレンジを妨げるリスクがある&lt;&#x2F;li&gt;
&lt;li&gt;Cloudflare PagesのCI&#x2F;CDはv2以降Zolaをサポートしていない（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;pages-build-image&#x2F;issues&#x2F;3&quot;&gt;issue #3&lt;&#x2F;a&gt;は2023年からOpen）。GitHub Actions + &lt;code&gt;wrangler deploy&lt;&#x2F;code&gt;で代替可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;以前、Amazon Amplify + Next.js + Tailwind CSSで運用していたブログをGitHub Pages + Zolaに移行しました。GitHub Pagesはシンプルで運用コストが低い一方、カスタムHTTPレスポンスヘッダーを設定できないという制約があります。&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;02&#x2F;github-pages-security-headers&#x2F;&quot;&gt;以前の記事&lt;&#x2F;a&gt;でも書きましたが、セキュリティスキャナーで警告が出る状態をずっと気にしていました。&lt;&#x2F;p&gt;
&lt;p&gt;では、Cloudflareに持っていくかと移転をはじめたところ、いくつかひっかかりポイントがあったので共有します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;新ドメインの取得&quot;&gt;新ドメインの取得&lt;&#x2F;h2&gt;
&lt;p&gt;移転にあたり、新ドメイン&lt;code&gt;codedchords.dev&lt;&#x2F;code&gt;を取得しました。旧ドメインから変更した理由は2つあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflareの無料プランではDNSをCloudflareに移管する必要がある。旧ドメインはFastMailでメール運用しておりDNSもFastMailに移管済みのため、Cloudflareへの再移管が難しい&lt;&#x2F;li&gt;
&lt;li&gt;旧ドメインは長年の運用とブログ改築の結果、404でインデックスされないページが多数あり、これを機に一新してもよい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;TLDは&lt;code&gt;.dev&lt;&#x2F;code&gt;を選びました。&lt;code&gt;.dev&lt;&#x2F;code&gt;はGoogleが管理するTLDで、HSTSプリロードリストに登録されています。ブラウザレベルでHTTPS接続が強制されるため、セキュリティ面で最初から一段高い状態が保証されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Cloudflare_Workers_への移行&quot;&gt;Cloudflare Workers への移行&lt;&#x2F;h2&gt;
&lt;p&gt;セキュリティヘッダーを設定するために、Cloudflareを利用する方針で検討を進めました。最終的にCloudflare Workersの静的アセット機能に落ち着くまでに、2つのアプローチで挫折しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;案1: Cloudflare Proxy + Transform Rules（断念）&lt;&#x2F;strong&gt;。最初に検討したのは、CloudflareのProxyを有効にしてTransform Rulesでレスポンスヘッダーを追加する方法です。GitHub Pagesをオリジンとし、Cloudflareを前段に配置する構成です。しかし、GitHub PagesのLet&#x27;s Encrypt証明書は90日ごとにHTTP-01チャレンジで自動更新されます。Cloudflare Proxyが間に入るとチャレンジがGitHubへ届かず、更新が静かに失敗する可能性があります。証明書の期限切れでサイトが突然表示不能になるリスクがあり、静的ブログで証明書を定期監視するのは割に合いません。この案は見送りました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;案2: Cloudflare Pages CI&#x2F;CD（断念）&lt;&#x2F;strong&gt;。次に、Cloudflare PagesのCI&#x2F;CDでZolaをビルドしてそのままホスティングする方法を試みました。しかし、Cloudflare Pagesのv2ビルドシステムではZolaがサポート対象から外れており、ビルドが通りません。この問題は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;pages-build-image&#x2F;issues&#x2F;3&quot;&gt;GitHubのissue&lt;&#x2F;a&gt;で2023年から報告されていますが、2026年2月現在もOpenのままです。リポジトリにZolaバイナリを同梱するワークアラウンドも提案されていますが、スマートとは言えないためこの案も断念しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;案3: Cloudflare Workers 静的アセット（採用）&lt;&#x2F;strong&gt;。最終的に採用したのが、Cloudflare Workersの静的アセット機能です。CloudflareはWorkersとPagesを統合する方針で、今後の機能開発はWorkersに集中されます。Workersの静的アセット機能は&lt;code&gt;_headers&lt;&#x2F;code&gt;ファイルをネイティブにサポートしており、セキュリティヘッダーの設定が可能です。SSL証明書もCloudflareが一元管理するため更新の問題は発生しません。ビルドはGitHub Actionsで行い、&lt;code&gt;wrangler deploy&lt;&#x2F;code&gt;でデプロイする構成にしました。Zolaのバージョンも自分で管理できます。&lt;&#x2F;p&gt;
&lt;p&gt;移行手順は以下のとおりです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Cloudflare DashboardのWorkers &amp;amp; Pagesから「Upload your static files」でプロジェクトを作成。後で上書きされるので適当なファイルを1つアップロードするだけでよい&lt;&#x2F;li&gt;
&lt;li&gt;既存のGitHub Actionsワークフロー（&lt;code&gt;deploy.yml&lt;&#x2F;code&gt;）を修正。Zolaのビルド部分はそのまま流用し、デプロイ先をCloudflare Workersに変更する。リポジトリに&lt;code&gt;wrangler.toml&lt;&#x2F;code&gt;を追加し、GitHub Repository SecretsにCloudflareのアカウントIDとAPIトークンを登録&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot; data-name=&quot;deploy.yml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Deploy to Cloudflare Workers&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  push&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    branches&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  workflow_dispatch&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  contents&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; read&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;concurrency&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  group&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;deploy&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  cancel-in-progress&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  deploy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Checkout&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          submodules&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; recursive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Setup Zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; taiki-e&#x2F;install-action@v2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          tool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zola@0.22.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zola build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Deploy to Cloudflare&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cloudflare&#x2F;wrangler-action@v3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          apiToken&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ${{ secrets.CLOUDFLARE_API_TOKEN }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          accountId&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          wranglerVersion&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;4&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; deploy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Workersにカスタムドメイン&lt;code&gt;codedchords.dev&lt;&#x2F;code&gt;を追加。CloudflareがDNSレコードを自動設定してくれる&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Pagesを無効にする。Settings → PagesでSourceをNoneに変更するが、GitHub Actionsが選択されている状態ではNoneに変更できないため、一度Branchに切り替えてから設定する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;移転後はGoogle Search Consoleに新ドメインのプロパティを追加し、サイトマップを送信しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セキュリティヘッダーの設定&quot;&gt;セキュリティヘッダーの設定&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflare Workersの静的アセット機能は、ビルド出力に&lt;code&gt;_headers&lt;&#x2F;code&gt;ファイルを含めるとレスポンスヘッダーに自動適用します。Zolaの&lt;code&gt;static&#x2F;_headers&lt;&#x2F;code&gt;に以下を配置しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot; data-name=&quot;static&#x2F;_headers&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  X-Content-Type-Options: nosniff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  X-Frame-Options: DENY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Referrer-Policy: strict-origin-when-cross-origin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Permissions-Policy: camera=(), microphone=(), geolocation=()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;CSPは見送りました。SoundCloud、YouTube、OpenStreetMap、GoatCounter、Giscus、はてなブログカードなど外部リソースが多く、許可リストの管理コストに対して静的サイトでの実益が限定的なためです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;旧ドメインからの転送&quot;&gt;旧ドメインからの転送&lt;&#x2F;h2&gt;
&lt;p&gt;旧ドメインへのアクセスを新ドメインに転送する必要があります。旧ドメインのDNSはFastMailで管理しておりCloudflareへの移行は行わないため、Cloudflare Redirect Rulesは使えません。&lt;&#x2F;p&gt;
&lt;p&gt;そこで、リダイレクト専用の静的サイトを生成する方法をとりました。Zolaで&lt;code&gt;zola build&lt;&#x2F;code&gt;すると全ページのHTMLが生成されます。aliasesによるリダイレクトページも含まれるため、以前Next.jsで運用していた時代のパスもカバーされます。この全HTMLをmeta refreshリダイレクトページに差し替えて、別リポジトリに配置し、旧ドメインでGitHub Pages配信する構成です。&lt;&#x2F;p&gt;
&lt;p&gt;各リダイレクトページの内容は以下のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-entity z-name z-tag&quot;&gt;&amp;lt;!DOCTYPE&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; html&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;html&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;head&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;meta&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; charset&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt; &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;link&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;canonical&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;（対応パス）&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt; &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;meta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;      http-equiv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;refresh&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;      content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;0; url=https:&#x2F;&#x2F;codedchords.dev&#x2F;（対応パス）&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;head&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;body&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;body&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;html&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pythonスクリプトで、Zolaビルドからリダイレクトページの差し替え、不要ファイルの削除、CNAME配置までを一括実行しています。通常ページ367件とaliasページ226件、合計593件のリダイレクトを生成しました。aliasページはZolaが生成したmeta refreshのリダイレクト先（正規パス）を読み取り、新ドメインの正規パスに直接転送します。GitHub Actionsでデプロイを自動化しています。&lt;&#x2F;p&gt;
&lt;p&gt;この方法であれば全ページ・全パスをカバーできます。GitHub Pagesではサーバーサイドの301リダイレクトが設定できないため、meta refresh + canonicalの組み合わせが現実的な最善策です。FastMailのDNS変更も不要で、既存のCNAME&#x2F;Aレコードをそのまま利用できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;GitHub PagesからCloudflare Workersへの移転で得た知見をまとめます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare ProxyとGitHub Pagesの組み合わせでは、Let&#x27;s Encrypt証明書のHTTP-01チャレンジを妨げるリスクがある&lt;&#x2F;li&gt;
&lt;li&gt;Cloudflare PagesのCI&#x2F;CDはv2以降Zolaをサポートしていない（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;pages-build-image&#x2F;issues&#x2F;3&quot;&gt;issue #3&lt;&#x2F;a&gt;は2023年からOpen）。GitHub Actions + &lt;code&gt;wrangler deploy&lt;&#x2F;code&gt;で代替可能&lt;&#x2F;li&gt;
&lt;li&gt;Cloudflare Workersの静的アセット機能は&lt;code&gt;_headers&lt;&#x2F;code&gt;ファイルでセキュリティヘッダーを簡単に設定できる&lt;&#x2F;li&gt;
&lt;li&gt;旧ドメインからの転送は、meta refreshリダイレクトの静的サイトを生成する方法で全パスをカバーできる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;.dev&lt;&#x2F;code&gt;ドメインのHSTSプリロードに加え、Cloudflare Workers側でセキュリティヘッダーも設定できるようになり、セキュリティスキャナーの警告も解消されました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">GitHub PagesからCloudflare Workersへブログを移転した際の落とし穴と解決策を共有します。証明書更新やZolaビルド非対応など、3つのアプローチを検討した経験をまとめています。
</summary>
        </entry><entry xml:lang="en">
        <title>生成AIラッパーサービスが罠である理由</title>
        <published>2026-02-17T00:00:00+00:00</published>
        <updated>2026-02-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/why-genai-wrapper-services-are-a-trap/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/why-genai-wrapper-services-are-a-trap/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;why-genai-wrapper-services-are-a-trap&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;why-genai-wrapper-services-are-a-trap&amp;#x2F;cover.webp?h=371fbdd60ae3bcfb751e&quot;
  alt=&quot;Cover&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;生成AIを業務に導入したいが、ChatGPTやClaudeを直接使わせるのはセキュリティ上不安がある。そんな企業の声に応えるかたちで、「安全に使える法人向け生成AIサービス」を謳うサービスが次々と登場しています。&lt;&#x2F;p&gt;
&lt;p&gt;身近で話題に登ったことをきっかけに調べてみた、ちばぎんコンピューターサービスが提供する「C-chatSupport」もそのひとつです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;www.ccsnet.co.jp&amp;#x2F;service&amp;#x2F;c-chatsupport&amp;#x2F;&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;本記事では、このサービスの公開情報をもとに技術者の視点から、この種の「ラッパーサービス」に共通する構造的な問題点を整理します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;WARNING&lt;&#x2F;strong&gt;
        &lt;p&gt;以下の分析はすべて2026年2月時点のWebサイト上の公開情報にもとづく筆者個人の見解であり、サービスの内部実装を直接検証したものではありません。実際のサービスには公開されていない機能や価格優位性がある可能性があります。導入を検討される際は、各サービス提供者の最新情報を直接ご確認ください。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;本質的に「APIラッパー」にすぎない&quot;&gt;本質的に「APIラッパー」にすぎない&lt;&#x2F;h2&gt;
&lt;p&gt;この種のサービスの実態は、OpenAIやAnthropicなどの既存LLM APIにRAG機能とWebUIを被せたものです。独自のモデルや技術的な差別化要素は見当たりません。&lt;&#x2F;p&gt;
&lt;p&gt;C-chatSupportの場合、Webサイトでは「複数の生成AIモデルが利用可能」と謳っていますが、具体的なモデル名は一切記載されていません。アーキテクチャ図、データフローの説明、API仕様、SLAといった技術情報も公開されていません。公式ブログやプロモーション動画でもRAGを「社内情報からも参照して回答させる技術」と一般的な用語説明に留まり、自社実装の独自性には触れていません。紹介されている「メール作成時間75%削減」といった効果も、ChatGPTやClaudeを直接使えば同様に得られるものです。&lt;&#x2F;p&gt;
&lt;p&gt;技術者の立場から見ると、これは独自技術がないことの裏返しと判断せざるを得ません。自社開発の技術があれば、それこそが最大の差別化ポイントであり、積極的に公開するはずです。&lt;&#x2F;p&gt;
&lt;p&gt;ChatGPT Business、Claude Team、Microsoft Copilotといった一次提供者のサービスは、利用可能なモデル、性能ベンチマーク、データの取り扱いポリシー、コンプライアンス認証などを詳細に公開しています。技術的な透明性を担保できないサービスを、あえて間に挟む合理性はありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;価格設定への疑問&quot;&gt;価格設定への疑問&lt;&#x2F;h2&gt;
&lt;p&gt;C-chatSupportの場合、月額5万円（キャンペーン価格、通常7万円）で50ユーザーまで利用可能で、さらに従量料金が別途かかります。一見すると安価に見えますが、他のサービスと50ユーザーの月額基本料金で比較してみます（海外サービスは1ドル=約150円で換算）。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    xychart-beta
title &quot;50ユーザーの月額基本料金（万円）&quot;
x-axis [&quot;C-chatSupport&quot;, &quot;ChatGPT Business&quot;, &quot;Claude Team&quot;, &quot;M365 Copilot&quot;]
y-axis &quot;万円&quot; 0 --&gt; 25
bar [5, 19, 19, 23]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;C-chatSupportの基本料金は確かに最安値です。しかし、これには従量課金が含まれていません。従量料金の単価も非公開のため、実際の月額コストは利用量次第で大きく変動します。一方、他のサービスは基本的に定額制です。なお、M365 CopilotはMicrosoft 365 E3&#x2F;E5等のベースライセンスが別途必要であり、実際のコストはグラフの金額より高くなります。&lt;&#x2F;p&gt;
&lt;p&gt;さらに重要なのは、この価格で得られる機能の差です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機能&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;C-chatSupport&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;ChatGPT Business&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Claude Team&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;M365 Copilot&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;チャット&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RAG&#x2F;ナレッジ&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;画像生成&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;コード実行&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Office連携&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;管理コンソール&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;非公開&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;SLA&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;非公開&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;○&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;99.9%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;料金体系&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;基本+従量&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;定額&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;定額&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;定額&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;基本料金だけを見ると安く映りますが、従量課金を含めたトータルコストと機能差を考慮すると、割高になる可能性が高いです。特に「従量料金が非公開」という点は、予算管理の観点からも大きなリスクです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セキュリティの訴求が誤解を招く&quot;&gt;セキュリティの訴求が誤解を招く&lt;&#x2F;h2&gt;
&lt;p&gt;この種のサービスは「情報漏洩リスク無し」「社外にデータを出さない」といったセキュリティを前面に押し出す傾向があります。しかし、複数の生成AIモデルを利用可能としている以上、バックエンドではOpenAIやAnthropic等の外部APIを呼んでいるはずです。&lt;&#x2F;p&gt;
&lt;p&gt;「学習に使わない」という点はAPI利用規約上当然のことであり、このサービス固有の強みではありません。また「社外にデータを出さない」という表現は、APIリクエスト自体が外部サーバーへの通信を伴う以上、厳密には正確ではありません。Azure OpenAI Serviceのプライベートエンドポイントなどを使っている可能性はありますが、そうした技術的な裏付けの説明がない以上、顧客に誤った安心感を与えるリスクがあります。&lt;&#x2F;p&gt;
&lt;p&gt;技術的な根拠を示さずに「安全」を訴求するサービスは、むしろ警戒すべきです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;機能の陳腐化リスク&quot;&gt;機能の陳腐化リスク&lt;&#x2F;h2&gt;
&lt;p&gt;紹介されているユースケース（議事録作成、DM作成、データ分析、マクロ生成）は、ChatGPT、Copilot、Claude等の汎用AIサービスで既にできることばかりです。&lt;&#x2F;p&gt;
&lt;p&gt;LLMの進化は非常に速く、ラッパーサービスは元のモデル提供者が同等機能をネイティブに実装した時点で価値を失います。実際、RAGについてもClaude、ChatGPT、Geminiのいずれもファイルアップロードとナレッジ検索を標準機能として提供済みです。ラッパーの「付加価値」は、モデル提供者自身がすぐに追い越してしまいます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ベンダーロックインと発展性の懸念&quot;&gt;ベンダーロックインと発展性の懸念&lt;&#x2F;h2&gt;
&lt;p&gt;地銀グループのSIer子会社のように、AI技術が本業ではない提供元の場合、開発リソースや投資規模は限られます。LLM分野のイノベーション速度に追随し続けられるかは疑問です。&lt;&#x2F;p&gt;
&lt;p&gt;また、導入後に乗り換えたくなった場合、RAGに蓄積したナレッジデータのポータビリティも不透明です。独自フォーマットでロックインされていれば、移行コストは高くつきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;乱立するラッパーサービス&quot;&gt;乱立するラッパーサービス&lt;&#x2F;h2&gt;
&lt;p&gt;この種のラッパーサービスは市場に溢れかえっています。&lt;&#x2F;p&gt;
&lt;p&gt;AIsmileyが2025年10月に公開した「生成AIチャットボットカオスマップ」には、国内だけで140製品以上が掲載されています。デロイト トーマツ ミック経済研究所の調査によると、法人向け生成AI導入ソリューション市場は2024年度の330億円から2025年度は503億円（前年比152%）、2026年度は720億円（同143%）へと急拡大しています。この成長市場を狙って、SIerやIT企業が「法人向け生成AIチャット」を次々と投入しているのが現状です。&lt;&#x2F;p&gt;
&lt;p&gt;なぜこれほどサービスが乱立するのか。理由は単純で、参入障壁が極めて低いからです。Difyのようなオープンソースの生成AIアプリ構築プラットフォームを使えば、RAG機能付きのチャットボットをノーコード・1日で構築できます。LLMのAPIキーを設定し、社内文書をアップロードし、チャットUIを公開する。技術的にはこれだけです。つまり、140以上のサービスの大半は、同じようなOSSやクラウドサービスの上に薄いカスタマイズを加えただけの可能性が高いということです。&lt;&#x2F;p&gt;
&lt;p&gt;参入障壁の低さは、撤退障壁の低さと表裏一体です。市場の飽和で採算が合わなくなれば、サービス終了のリスクも現実的です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;組織が生成AIサービスの導入を検討する際には、「なぜChatGPT Business&#x2F;Enterprise、Claude Team、Microsoft Copilot、あるいはAmazon Bedrock上の自前構築ではなく、このサービスなのか」という問いに明確に答えられる必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;唯一の合理的な理由があるとすれば、既存の取引関係や日本語でのサポート体制といった非技術的な要素でしょう。実際には「海外サービスはよく分からないから、馴染みのベンダーに任せよう」と、技術選定に関与しない経営層の判断で導入が決まるケースも多いのが実情です。しかし、その安心感がラッパーサービスの構造的な弱点に見合うコストかどうかは、慎重に見極めるべきです。&lt;&#x2F;p&gt;
&lt;p&gt;技術的な差別化が不明確なサービスへ毎月の利用料を支払い続けるよりも、ChatGPT Business、Claude Team、Copilotの直接契約、あるいはAmazon BedrockやAzure OpenAI Serviceによる自前構築のほうが、長期的にはコスト・機能の両面で有利です。「生成AIは難しそうだから専門家に任せたい」という不安に応えるだけのサービスへ、安易に飛びつかないことが重要です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">生成AIの導入を急ぐ企業に向けた「ラッパーサービス」が増えています。既存LLMのAPIにUIを被せただけのサービスに潜む問題点を、価格・セキュリティ・将来性の観点から検証します。
</summary>
        </entry><entry xml:lang="en">
        <title>元AWS社員が読むClaude Code社内禁止騒動</title>
        <published>2026-02-15T17:00:00+09:00</published>
        <updated>2026-02-15T17:00:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/amazon-claude-code-restriction/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/amazon-claude-code-restriction/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Amazon社内でClaude_Code利用禁止に？&quot;&gt;Amazon社内でClaude Code利用禁止に？&lt;&#x2F;h2&gt;
&lt;p&gt;Business Insider 2月11日記事に、
Amazon社内のClaude Code
使用制限が行われているとの記事を見つけました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;www.businessinsider.com&amp;#x2F;amazon-engineers-grate-against-internal-limits-claude-code-kiro-ai-2026-2&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;Amazonが社内でClaude Codeの
プロダクションコードへの使用を制限し、
社内製AIコーディングツールKiroの利用を
推進しているというものです。
これに対して、社内フォーラムでは
約1,500人のエンジニアが
Claude Codeの正式採用を支持しています。&lt;&#x2F;p&gt;
&lt;p&gt;私は2024年夏にAWSを退職しましたが、
この記事を読んで、当時の社内の空気と
重ね合わせずにはいられませんでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;売るものを自分で使えない皮肉&quot;&gt;売るものを自分で使えない皮肉&lt;&#x2F;h2&gt;
&lt;p&gt;社内での開発に自社開発ツールの使用を
推奨するのは当然のように思いますが、
この問題で最も深刻なのは、
AWSはClaude Codeも売っているという事実です。&lt;&#x2F;p&gt;
&lt;p&gt;AWSは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;bedrock&#x2F;&quot;&gt;Amazon Bedrock&lt;&#x2F;a&gt;を通じてClaude Codeを
顧客に販売しています。
現在KiroよりもClaude Codeの方が
市場での注目度は高いので、
Solution ArchitectやProfessional Servicesは
Claude Codeの解説や導入支援を求められます。&lt;&#x2F;p&gt;
&lt;p&gt;そのため、日常の開発ツールとして
利用するのは自然な流れですが、
彼らは社内でClaude Codeをプロダクションコードに
使う正式な承認を得られていません。&lt;&#x2F;p&gt;
&lt;p&gt;Business Insider記事中のある従業員は
「自分たちが社内利用を承認していない
ツールを、なぜ顧客が信頼して
使ってくれるのか」と指摘しています。
これはもっともな疑問です。&lt;&#x2F;p&gt;
&lt;p&gt;Amazon Bedrockは当時から
社内で推進されていました。
ファインチューニングや
ガードレールなど独自の付加価値を持つ
プラットフォームですが、
多くの顧客がAmazon Bedrockに来る理由は
Claudeを使いたいからです。
ところがAmazon Bedrockという
プラットフォームを挟むことで、
社内では「自社が競合製品を販売している」
という意識が薄れているように感じます。
Claude Codeの社内利用を制限しながら
顧客にはそれを売るという矛盾が
放置されているのは、
この認識の甘さが一因ではないでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;投資家・パートナー・競合の三重構造&quot;&gt;投資家・パートナー・競合の三重構造&lt;&#x2F;h2&gt;
&lt;p&gt;この問題の根底にあるのは、
AmazonとAnthropicの関係そのものの
複雑さです。
Amazonは累計80億ドル超を出資した
Anthropicの最大の投資家であり、
その持分の評価額は
600億ドル超に達しています。
AnthropicにとってAWSは
最大のクラウドパートナーです。
AnthropicはAWSのクラウドサービスと
少なくとも100万個のTrainiumチップの
利用をコミットしています。
しかし同時に、AmazonはKiroや
Q DeveloperでAnthropicの製品と
直接競合しています。&lt;&#x2F;p&gt;
&lt;p&gt;「投資家・パートナー・競合」という
三重構造が社内ポリシーの歪みとして
表面化しているのが、
今回の記事の本質だと考えています。
Amazonとしては自社製品を推進したい。
しかし出資先の製品を社内で制限している
ことが表沙汰になれば、
パートナーシップへの影響も避けられません。&lt;&#x2F;p&gt;
&lt;p&gt;Amazonの広報は「明示的な禁止ではなく、
プロダクションコード用のツールに対して
厳格な要件を適用している」と
コメントしています。
しかし社内で1,500人もの
エンジニアがClaude Codeの
正式採用を求めている状況を見ると、
現場はこの説明に
納得していないことが明らかです。&lt;&#x2F;p&gt;
&lt;p&gt;さらに気になるのは透明性の問題です。
一度はClaude Codeがセキュリティおよび
法務レビューを通過したという
社内ガイドラインが存在したにもかかわらず、
その記述が後から編集・削除されたと
記事は指摘しています。
判断の根拠を示さずに方針を変えれば、
不信感が深まるのは当然です。&lt;&#x2F;p&gt;
&lt;p&gt;開発者の生産性に直結する
ツールの選択を政治的な理由で制限することは、
短期的には自社製品の利用数に
つながるかもしれません。
しかし長期的にはエンジニアの信頼を損ない、
優秀な人材が流出する原因になりかねません。
Amazonの広報は
「Kiroのエンジニアの70%が1月に
少なくとも一度は利用した」と言っていますが、
「少なくとも一度」という表現が
すべてを物語っています。
AWSの開発ツール戦略がこの矛盾を
どう解消していくのか、
元社員として注目しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;社内で見た開発ツール戦略の軌跡&quot;&gt;社内で見た開発ツール戦略の軌跡&lt;&#x2F;h2&gt;
&lt;p&gt;私の退職した2024年当時は、AWS CodeCommitとCloud9の
整理が進行中でした。
社内ではCodeWhisperer
（後にAmazon Q Developerへ統合）が
強く推奨されていました。&lt;&#x2F;p&gt;
&lt;p&gt;AWSの開発ツールはサービスの新設と廃止を
繰り返してきた歴史があり、
「次もまた消えるのでは」という不安は
エンジニアの間で常につきまとっていました。
当時、顧客への説明で困ったものです。
私自身も開発ツール戦略に関しては
懐疑的でした。&lt;&#x2F;p&gt;
&lt;p&gt;Kiroは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sixfivemedia.com&#x2F;content&#x2F;from-prompt-to-production-ai-spec-driven-development-with-kiro---six-five-on-the-road&quot;&gt;re:Inventでのインタビュー&lt;&#x2F;a&gt;によると、
チーム発足時にPR FAQ
（Amazonのプロダクト企画文書）を書いて
2024年末から具体化し、
2025年7月にパブリックプレビューとなっています。
私の退職後に本格化したため、
直接触れていません。
VS Codeのフォークと聞いていますが、
仮に在籍中に推奨されていたとしても
使わなかった可能性が高いです。&lt;&#x2F;p&gt;
&lt;p&gt;Kiroが掲げる「spec-driven development」
というコンセプト自体は理解できます。
私自身、Claude Codeで仕様ファイルを
ベースにした開発を日常的にやっています。
ただし、Claude Codeの自由度と比べると、
AIをツールに組み込む方式には
根本的な限界があります。
Claude Codeはターミナルから
あらゆる操作ができるエージェントであり、
開発者のワークフロー全体に介入できます。
一方、KiroのようにIDEにAIを組み込む方式は、
そのIDEが想定した枠組みの中でしか
能力を発揮できません。
この差は使い込むほど大きくなります。
社内で反発が出るのは当然のことです。&lt;&#x2F;p&gt;
&lt;p&gt;同記事中で、あるAmazonのエンジニアは
こう書いています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A tool that can&#x27;t keep pace with rivals
offers no real innovation.
And without competitive strength,
Kiro&#x27;s only survival mechanism becomes
forced adoption rather than genuine value.
（競合についていけないツールから
本当のイノベーションは生まれない。
競争力がなければ、Kiroの唯一の生存戦略は
真の価値ではなく強制採用になる）&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;CodeCommitやCloud9がたどった道を
見てきた身としては、
この指摘はまさに的を射ています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">AmazonがClaude Codeの社内利用を制限し
Kiroの使用を推進する中、
約1,500人のエンジニアが反発しています。
2024年夏にAWSを退職した元社員の視点から、
開発ツール戦略の歴史と
Amazon-Anthropicの三重構造が
生み出す矛盾を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>中小規模組織向け生成AIガイドラインサンプル</title>
        <published>2026-02-15T11:38:57+09:00</published>
        <updated>2026-02-15T11:38:57+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/genai-guideline-sample/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/genai-guideline-sample/</id>
        
            <content type="html">&lt;!-- image --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;genai-guideline-sample&amp;#x2F;cover.webp?h=b5847dab37b3cf9136f1&quot;
  alt=&quot;cover&quot; width=&quot;1358&quot; height=&quot;761&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;以前公開した
&lt;a href=&quot;&#x2F;blog&#x2F;2026&#x2F;01&#x2F;genai-governance-checklist-release&#x2F;&quot;&gt;生成AIガイドラインチェックリスト&lt;&#x2F;a&gt;
に基づき、具体例として参考にできる
サンプルガイドラインを作成し追加した&lt;&#x2F;li&gt;
&lt;li&gt;IT専門部署のない中小規模組織を想定した
&lt;strong&gt;大事故を防ぐ最低限を身の丈に合わせて
整えた60点ガイドライン&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;サンプルガイドラインの組織プロファイル・要件定義など
設計背景の文書もすべてリポジトリで公開。
カスタマイズの判断材料として使える&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;genai-governance-checklist&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;なぜサンプルを作ったのか&quot;&gt;なぜサンプルを作ったのか&lt;&#x2F;h2&gt;
&lt;p&gt;チェックリスト公開後、
「チェック項目の意図はわかったが、
具体的な書き方がわからないので実物を見せてほしい」
という声を多くいただきました。&lt;&#x2F;p&gt;
&lt;p&gt;チェックリストは
「何を書くべきか」を示すものですが、
「どう書くか」は組織の規模・業種・
リスク許容度によって大きく異なります。
前提が異なる例を見て意味があるのかという
疑問は大いにありますが、
「サンプルを見せて」というセリフは確かによく聞きます。
そこで特定の組織像を明確に設定したうえで、
そのまま実例として参照できるレベルの
サンプルガイドラインを作成しました。&lt;&#x2F;p&gt;
&lt;p&gt;前提がリテラシー・ガバナンスの低い組織なので、
完璧な例を作成しても実行不能でしょう。
当サンプルガイドラインは、
大事故を防ぐ最低限を
身の丈に合わせて整えた
60点を目指しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提条件&quot;&gt;前提条件&lt;&#x2F;h2&gt;
&lt;p&gt;このサンプルには明確な前提条件があります。&lt;&#x2F;p&gt;
&lt;p&gt;想定する組織は、
専門のIT部門を持たない中小規模の組織です。
&lt;code&gt;organization-profile.md&lt;&#x2F;code&gt; に記載した通り、
一般社団法人を想定しています。&lt;&#x2F;p&gt;
&lt;p&gt;こういった組織では独自に
生成AIを組み込んだシステムを
構築しづらいと考えます。
したがって、理事長などが無邪気に
「なんか生成AIいいらしいから、
ChatGPTを導入しよう」
みたいな担当者にとっては
地獄のようなシーンを想定しています。&lt;&#x2F;p&gt;
&lt;p&gt;こうした組織ではガイドラインを
まじめに一から作ることは稀で、
どこかから持ってきたものを
そのまま使う傾向があります。
だからこそ具体例として参考にできる水準の
サンプルを提供しています。&lt;&#x2F;p&gt;
&lt;p&gt;自組織への適用を検討する際は、
以下の前提が合致するかを
必ず確認してください。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT Team、Claude、Geminiなど
組織向け有料プランを利用する。
無料・個人プランは対象外&lt;&#x2F;li&gt;
&lt;li&gt;自社システムやSaaSに組み込まれるような
生成AIは想定していない&lt;&#x2F;li&gt;
&lt;li&gt;セキュリティやシステム管理の規定が
存在しないか、実効性がない&lt;&#x2F;li&gt;
&lt;li&gt;リテラシーが低く、かなり一般的なレベルから説明が必要&lt;&#x2F;li&gt;
&lt;li&gt;AI専任の管理者は置けず、
総務担当者などが兼務する運用体制&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;サンプルガイドラインの概要&quot;&gt;サンプルガイドラインの概要&lt;&#x2F;h2&gt;
&lt;p&gt;リポジトリの &lt;code&gt;docs&#x2F;guideline-sample&#x2F;&lt;&#x2F;code&gt; には
サンプル本文だけでなく、
その背景となる文書も一式公開しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;organization-profile.md&lt;&#x2F;code&gt; —
想定組織の規模、業種、体制、
現在のAI利用状況、懸念事項を定義した
組織プロファイル&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;requirements-for-guideline.md&lt;&#x2F;code&gt; —
対象読者、文書設計の方針、
チェックリストとの対応方針を記載した
ガイドライン要件&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;guideline-sample.md&lt;&#x2F;code&gt; —
全10章構成のサンプルガイドライン本文&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;guideline-sample.html&lt;&#x2F;code&gt; —
pandocで変換済みのHTML版&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Makefile&lt;&#x2F;code&gt; —
MarkdownからHTMLへの変換スクリプト。
pandocがあれば &lt;code&gt;make&lt;&#x2F;code&gt; で再生成できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「なぜこの内容になったのか」を
追跡できるようにすることで、
自組織向けにカスタマイズする際の
判断材料にしていただくことが狙いです。&lt;&#x2F;p&gt;
&lt;p&gt;サンプルはチェックリストの
必須74項目と推奨19項目、
合計93項目をカバーしています。
全10章の構成は以下の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;組織体制と役割&lt;&#x2F;li&gt;
&lt;li&gt;利用が許可されるAIサービス&lt;&#x2F;li&gt;
&lt;li&gt;利用が許可される範囲&lt;&#x2F;li&gt;
&lt;li&gt;データ入力の制限&lt;&#x2F;li&gt;
&lt;li&gt;AI出力の利用上の注意&lt;&#x2F;li&gt;
&lt;li&gt;リスク管理&lt;&#x2F;li&gt;
&lt;li&gt;教育・研修&lt;&#x2F;li&gt;
&lt;li&gt;インシデント対応&lt;&#x2F;li&gt;
&lt;li&gt;違反時の対応&lt;&#x2F;li&gt;
&lt;li&gt;ガイドラインの運用&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;特に第4章「データ入力の制限」では、
個人情報・機密情報・顧客情報・
認証情報・財務情報・人事情報・
法的保護情報の7分類について
具体例とともに禁止事項を定めています。
また匿名化の手順も示しており、
「何がダメで、どうすればいいのか」を
非エンジニアにも伝わるように記述しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;カスタマイズのポイント&quot;&gt;カスタマイズのポイント&lt;&#x2F;h2&gt;
&lt;p&gt;サンプルをそのまま使うのではなく、
自組織の状況に合わせた調整を推奨します。&lt;&#x2F;p&gt;
&lt;p&gt;許可するAIサービスの種類、
禁止情報の分類と具体例、
インシデント時の報告先と連絡体制は
最低限見直してください。
業種固有の規制がある場合
（医療、金融、教育など）は、
該当する法令への対応を追加する
必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;リポジトリの組織プロファイルと
要件定義を自組織版に書き換えるところから
始めることをお勧めします。
前提を整理すれば、
ガイドライン本文の修正ポイントが
自ずと明確になります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;免責事項&lt;&#x2F;strong&gt;
        &lt;p&gt;本サンプルは情報提供を目的としており、
法的助言を構成するものではありません。
実際のガイドライン策定にあたっては、
自組織の法務担当者や外部の専門家に
確認のうえご利用ください。
組織の業種、規模、
取り扱う情報の性質によって
必要な対策は異なります。
本サンプルの利用によって生じた損害について、
筆者は一切の責任を負いません。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;正直に書きます。&lt;&#x2F;p&gt;
&lt;p&gt;チェックリストを公開後、
「ガイドラインのサンプルがあれば」と言われました。
そこで組織プロファイルから要件定義まで
丁寧に文書化し、93項目をカバーした
サンプルガイドラインを提供しました。
HTML版や変換スクリプトまで付けました。&lt;&#x2F;p&gt;
&lt;p&gt;結果どうなったか。
結局、サンプル活用の労力すら惜しんで
まともな検討もなく、出来合いの他組織の
ガイドラインをコピーしたものが採用されました。&lt;&#x2F;p&gt;
&lt;p&gt;そもそもの発端を振り返れば、
組織としてAIで何を実現したいかという
ビジョンがあったわけではありません。
組織トップの「なんか生成AIいいらしいから
導入しよう」という思いつきです。
導入によって何を実現したいのかが
不明確なまま、具体的な計画もなく
号令だけが降ってくる。
よくある話ですが、
そんな動機で降ってきた仕事に
担当者がやる気を出せないのは
むしろ当然でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;それでもこのサンプルを公開するのは、
同じような状況で困っている担当者が
他にもいると確信しているからです。
組織のトップが思いつきで
「生成AIのガイドライン作って」と
言い出すシーンは、
いまこの瞬間も日本中で
起きているはずです。&lt;&#x2F;p&gt;
&lt;p&gt;チェックリストとサンプルを
組み合わせて使っていただければ、
少なくとも60点のガイドラインは
作れます。
60点で始めて、
運用しながら改善していく。
完璧を待つより、
はるかに良い選択だと考えています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">「具体的なガイドラインの例が欲しい」という声に
応えて、60点の生成AIガイドラインサンプルを
公開しました。IT専門部署のない中小規模組織を
想定し、チェックリストの93項目をカバーしています。
</summary>
        </entry><entry xml:lang="en">
        <title>Evolving the MAGI System from Majority Vote to Deliberative Democracy with Agent Teams</title>
        <published>2026-02-14T00:00:00+00:00</published>
        <updated>2026-02-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/super-magi-agent-team/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/super-magi-agent-team/</id>
        
            <content type="html">&lt;p&gt;This is an English translation of the original
Japanese article published on Zenn:
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;super-magi-agent-team&quot;&gt;&quot;Agent TeamsでMAGIシステムを討議民主制に進化させた&quot;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Built &quot;Super MAGI,&quot; a decision-support plugin
that goes beyond the Evangelion-inspired MAGI
system, using Claude Code&#x27;s new Agent Teams
feature&lt;&#x2F;li&gt;
&lt;li&gt;Evolved from a simple majority-vote system to
a deliberative democracy where agents debate
and re-vote when opinions are split&lt;&#x2F;li&gt;
&lt;li&gt;The deliberation phase dramatically improves
the quality and depth of analysis.
In practice, this reasoning process is more
valuable than the final verdict itself&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;claude-code-plugins&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;When Claude Code introduced its plugin system,
many developers probably had the same thought.
&quot;Could I build the MAGI system
from Evangelion?&quot;
The idea of multiple AI agents analyzing
problems from different perspectives
and deciding by majority vote
is a perfect use case for plugins.
Quite a few people have published
their own MAGI-inspired plugins.&lt;&#x2F;p&gt;
&lt;p&gt;I was no exception.
Last year I built a MAGI plugin with
three independent AI agents,
each embodying a different persona:
scientist, mother, and woman.
Each analyzes a given problem from
its unique perspective,
and the system reaches a conclusion
by majority vote.
You can launch it simply by typing &lt;code&gt;&#x2F;magi&lt;&#x2F;code&gt;
in Claude Code,
optionally passing a topic as an argument
(e.g., &lt;code&gt;&#x2F;magi Should we adopt remote work or require office attendance?&lt;&#x2F;code&gt;).
What started as a fun experiment turned out
to be surprisingly practical.
It is particularly useful for reviewing
my own writing and code,
where it provides more diverse feedback
than asking a single AI.
It has become a tool I use daily.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-self-review-1&quot;&gt;&lt;a href=&quot;#fn-self-review&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then Claude Code announced Agent Teams.
This feature lets agents exchange messages
with each other.
I immediately thought,
&quot;What if MAGI agents could debate
when they disagree?&quot;
Instead of just casting votes in isolation,
they could argue their positions.
This article introduces the design philosophy
and implementation of Super MAGI,
which evolves the system from
&quot;vote and done&quot; to
&quot;debate, then vote.&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Original_MAGI_System&quot;&gt;The Original MAGI System&lt;&#x2F;h2&gt;
&lt;p&gt;The original MAGI operates in three phases
as a simple majority-vote system:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Phase 1 (Problem Structuring):
The ARBITRATOR works with the user
to frame the problem as a binary choice:
proposition, premises, Option A, and Option B&lt;&#x2F;li&gt;
&lt;li&gt;Phase 2 (Parallel Independent Analysis):
Three agents are launched in parallel
via the Task tool.
Each analyzes and votes independently,
without seeing the others&#x27; work&lt;&#x2F;li&gt;
&lt;li&gt;Phase 3 (Final Ruling):
The ARBITRATOR tallies the votes
and presents the majority decision&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;02&#x2F;super-magi-agent-team&#x2F;magi.webp&quot; alt=&quot;Original MAGI - three agents running parallel independent analysis&quot; &#x2F;&gt;
&lt;em&gt;Phase 2 execution screen. MELCHIOR,
BALTHASAR, and CASPER running
in parallel in the background&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The three agents each have
distinct evaluation criteria:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Agent&lt;&#x2F;th&gt;&lt;th&gt;Perspective&lt;&#x2F;th&gt;&lt;th&gt;Criteria&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;MELCHIOR&lt;&#x2F;td&gt;&lt;td&gt;Scientist&lt;&#x2F;td&gt;&lt;td&gt;Technical feasibility, efficiency, scalability, quality of evidence&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BALTHASAR&lt;&#x2F;td&gt;&lt;td&gt;Mother&lt;&#x2F;td&gt;&lt;td&gt;Legal compliance, ethical validity, risk management, impact on the vulnerable&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CASPER&lt;&#x2F;td&gt;&lt;td&gt;Woman&lt;&#x2F;td&gt;&lt;td&gt;Emotional impact, UX, trend alignment, empathy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;This system had one problem:
when the vote split 2-to-1,
the minority opinion was merely recorded.
The dissenter had no chance to rebut
the majority.
Even if the minority held
an important argument,
it might never influence the conclusion.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Super_MAGI_with_Agent_Teams&quot;&gt;Super MAGI with Agent Teams&lt;&#x2F;h2&gt;
&lt;p&gt;In February 2026, Claude Code announced
&quot;Agent Teams&quot; as a research
preview.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-agent-teams-1&quot;&gt;&lt;a href=&quot;#fn-agent-teams&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
Previously, sub-agents could only work
independently.
With Agent Teams, agents can exchange messages
directly with each other.&lt;&#x2F;p&gt;
&lt;p&gt;When I saw this feature, I thought,
&quot;What happens if MAGI agents debate
when they disagree?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;In the original MAGI,
a 2-to-1 split simply recorded
the minority opinion.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Original MAGI&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart LR
  subgraph Phase2[&quot;Phase 2: Independent Analysis&quot;]
    M[MELCHIOR] --&gt; V1[Vote]
    B[BALTHASAR] --&gt; V2[Vote]
    C[CASPER] --&gt; V3[Vote]
  end
  V1 --&gt; T[Vote Result]
  V2 --&gt; T
  V3 --&gt; T
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;With Agent Teams, the minority can directly
rebut the majority, debate the issues,
and then everyone re-votes.
This is &lt;strong&gt;an evolution from majority rule
to deliberative democracy&lt;&#x2F;strong&gt;.
This is the evolution to &lt;strong&gt;Super MAGI&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Super MAGI extends the original MAGI plugin
by adding a &quot;deliberation phase&quot; powered
by Agent Teams.
The deliberation phase activates only when
opinions are split.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Super MAGI (2-to-1 split)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart LR
  subgraph Phase2[&quot;Phase 2: Independent Analysis&quot;]
    M[MELCHIOR] --&gt; V1[Vote]
    B[BALTHASAR] --&gt; V2[Vote]
    C[CASPER] --&gt; V3[Vote]
  end
  V1 --&gt; T[Vote Result]
  V2 --&gt; T
  V3 --&gt; T
  T --&gt;|3-to-0| R[Re-vote Result]
  T --&gt;|2-to-1| Phase3
  subgraph Phase3[&quot;Phase 3: Deliberation&quot;]
    D[Structured Debate]
  end
  Phase3 --&gt; R
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;Inside the structured debate, agents exchange
messages following a four-round protocol
where the minority rebuts the majority.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Phase&lt;&#x2F;th&gt;&lt;th&gt;API Used&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Phase 2 (Independent Analysis)&lt;&#x2F;td&gt;&lt;td&gt;Task tool (&lt;code&gt;run_in_background&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Each agent researches and votes independently without referencing others&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Phase 3 (Deliberation)&lt;&#x2F;td&gt;&lt;td&gt;Agent Teams (&lt;code&gt;TeamCreate&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;SendMessage&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Majority and minority engage in a four-round structured debate, then re-vote&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The order of &quot;think independently first,
then debate&quot; matters.
If agents debated from the start,
there would be a risk of groupthink,
with the loudest voice dominating.
By conducting independent analysis first,
we preserve diversity of perspectives,
then use Agent Teams&#x27; bidirectional
communication to deepen the discussion
quality.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-realworld-1&quot;&gt;&lt;a href=&quot;#fn-realworld&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When the vote is unanimous (3-to-0),
the deliberation phase is skipped
and the system behaves like the original.
Even in a 2-to-1 split, the system asks
the user whether to proceed with deliberation,
avoiding unnecessary token consumption.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Four-Round_Structured_Debate_Protocol&quot;&gt;The Four-Round Structured Debate Protocol&lt;&#x2F;h2&gt;
&lt;p&gt;The heart of the deliberation phase is
a four-round structured debate protocol.&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    sequenceDiagram
  participant A as Majority A
  participant B as Majority B
  participant C as Minority
  Note over A,C: Round 1
  A-&gt;&gt;C: Present arguments
  B-&gt;&gt;C: Present arguments
  Note over A,C: Round 2
  C-&gt;&gt;A: Rebuttal
  C-&gt;&gt;B: Rebuttal
  Note over A,C: Round 3
  A-&gt;&gt;C: Counter-rebuttal
  B-&gt;&gt;C: Counter-rebuttal
  Note over A,C: Round 4
  C-&gt;&gt;A: Final rebuttal (last word)
  C-&gt;&gt;B: Final rebuttal (last word)
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Round&lt;&#x2F;th&gt;&lt;th&gt;Speaker&lt;&#x2F;th&gt;&lt;th&gt;Content&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Round 1: Opening Arguments&lt;&#x2F;td&gt;&lt;td&gt;Majority to Minority&lt;&#x2F;td&gt;&lt;td&gt;Each majority agent presents their analysis and voting rationale to the minority&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Round 2: Rebuttal&lt;&#x2F;td&gt;&lt;td&gt;Minority to Majority&lt;&#x2F;td&gt;&lt;td&gt;The minority rebuts the majority&#x27;s arguments&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Round 3: Counter-Rebuttal&lt;&#x2F;td&gt;&lt;td&gt;Majority to Minority&lt;&#x2F;td&gt;&lt;td&gt;The majority responds to the minority&#x27;s rebuttal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Round 4: Final Rebuttal&lt;&#x2F;td&gt;&lt;td&gt;Minority to Majority&lt;&#x2F;td&gt;&lt;td&gt;The minority delivers a final rebuttal. This is their last chance to speak&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Procedural fairness is structurally
built into this protocol.&lt;&#x2F;p&gt;
&lt;p&gt;In Round 1, the majority presents
their arguments first to eliminate
information asymmetry.
The minority can construct their rebuttal
knowing exactly what evidence the majority
relied on.&lt;&#x2F;p&gt;
&lt;p&gt;In Round 4, the minority gets the last word
to compensate for their numerical
disadvantage.
The majority already holds the power
of two votes.
Giving the minority the final say prevents
conclusions from being reached
without the minority being able to respond
to the majority&#x27;s counter-rebuttals.
This design is grounded in the principle
J.S. Mill articulated against
the &quot;tyranny of the majority.&quot;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mill-1&quot;&gt;&lt;a href=&quot;#fn-mill&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After four rounds of debate,
all agents cast their votes again.
If persuaded, agents may change
their positions.
The final output explicitly shows each
agent&#x27;s vote trajectory and reasons
for any changes.&lt;&#x2F;p&gt;
&lt;p&gt;When using tmux, the deliberation phase
automatically splits the screen
for each agent&#x27;s session, as shown below.
You can watch the agents working
independently while exchanging messages
in real time,
giving a genuine sense that they are
&quot;debating.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;02&#x2F;super-magi-agent-team&#x2F;super-magi.webp&quot; alt=&quot;Super MAGI - deliberation phase execution screen with Agent Teams&quot; &#x2F;&gt;
&lt;em&gt;Deliberation phase execution screen&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Graceful_Degradation&quot;&gt;Graceful Degradation&lt;&#x2F;h2&gt;
&lt;p&gt;Since Agent Teams is an experimental feature
in research preview,
Super MAGI is designed with graceful
degradation so it continues working
even when the feature is not fully available.
Specifically, it uses a hybrid architecture
combining traditional Task-tool-based
independent analysis with Agent Teams-based
structured debate.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;TeamCreate failure: Proceeds directly
to final ruling using Phase 2 vote results&lt;&#x2F;li&gt;
&lt;li&gt;Agent unresponsive: Retains the
unresponsive agent&#x27;s Phase 2 vote
and continues the debate with the rest&lt;&#x2F;li&gt;
&lt;li&gt;TeamDelete failure: Logs a warning
and executes the final ruling normally&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Every error path falls back to
&quot;Phase 2 independent analysis results.&quot;
Phase 2 results are generated
with guaranteed agent independence.
So even if deliberation fails,
decision quality is maintained at the same
level as the original MAGI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Case_Study:_What_Changes_with_the_Trolley_Problem&quot;&gt;Case Study: What Changes with the Trolley Problem&lt;&#x2F;h2&gt;
&lt;p&gt;To test Super MAGI in practice,
I evaluated the footbridge variant
of the trolley problem with both
the original MAGI and Super MAGI.
The proposition: &quot;A runaway trolley is heading
toward five workers.
Pushing Worker C off the bridge would stop
the trolley, but C would certainly die.
Should A push C?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;The conclusion was the same in both cases.
MELCHIOR (Option A: push) versus BALTHASAR
and CASPER (Option B: do nothing),
with Option B adopted 2-to-1.
The voting pattern did not change.&lt;&#x2F;p&gt;
&lt;p&gt;What changed was the quality of reasoning
leading to the conclusion.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Comparison&lt;&#x2F;th&gt;&lt;th&gt;Original MAGI&lt;&#x2F;th&gt;&lt;th&gt;Super MAGI&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Depth of analysis&lt;&#x2F;td&gt;&lt;td&gt;One paragraph per agent&lt;&#x2F;td&gt;&lt;td&gt;MELCHIOR raised 8 counter-arguments; BALTHASAR cited 11 references&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Visibility of reasoning&lt;&#x2F;td&gt;&lt;td&gt;Final result only&lt;&#x2F;td&gt;&lt;td&gt;Full four-round rebuttal and counter-rebuttal process recorded&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Intellectual honesty&lt;&#x2F;td&gt;&lt;td&gt;Each agent simply stated their conclusion&lt;&#x2F;td&gt;&lt;td&gt;Majority explicitly acknowledged which of MELCHIOR&#x27;s points they accepted&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Treatment of minority&lt;&#x2F;td&gt;&lt;td&gt;Opinion merely recorded&lt;&#x2F;td&gt;&lt;td&gt;Developed sharp rebuttals such as &quot;the separation of law and morality&quot; and &quot;what would you say to the families of the five?&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;What was particularly striking was that
the majority agents, BALTHASAR and CASPER,
acknowledged parts of minority MELCHIOR&#x27;s
arguments during the re-vote.
BALTHASAR conceded the partial effectiveness
of rule utilitarianism in avoiding
the organ harvesting problem.
CASPER acknowledged the validity
of pointing out Damasio&#x27;s circular reasoning.
They did not change their positions,
but they recognized the legitimate parts
of their opponent&#x27;s arguments.
This intellectual honesty does not emerge
from independent voting alone.&lt;&#x2F;p&gt;
&lt;p&gt;What Super MAGI delivered was not
&quot;a change in conclusion&quot; but
&quot;confirmation of the conclusion&#x27;s
robustness.&quot;
The fact that the conclusion held even
after debate increases confidence
in the decision.
Of course, there are cases where debate
could reverse the conclusion.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-article-review-1&quot;&gt;&lt;a href=&quot;#fn-article-review&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
That is when the deliberation phase
truly proves its worth.&lt;&#x2F;p&gt;
&lt;p&gt;In practical use of MAGI, the analysis
presented during the reasoning process
is actually more useful than the final
&quot;Option A or Option B&quot; verdict.
What perspectives were considered,
which arguments proved effective,
and where the weaknesses lie.
The rebuttals and counter-rebuttals exchanged
during the deliberation phase
surface arguments I would never have
noticed on my own.
I believe MAGI&#x27;s true value lies not
in &quot;producing an answer&quot; but in
&quot;assembling the materials for thinking.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;In terms of volume, the original MAGI
produces roughly 50 lines,
while Super MAGI generates about 220 lines,
more than four times as much.
Deep analysis and brevity are a trade-off,
which is why the design to skip deliberation
for unanimous votes proves valuable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Super MAGI leverages Claude Code&#x27;s Agent Teams
feature to evolve multi-agent decision-making
from &quot;vote and done&quot; to
&quot;debate, then vote.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Here are the key design principles:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Preserving independence: Analyze
independently first, then debate.
Maintaining this order preserves
diversity of perspectives&lt;&#x2F;li&gt;
&lt;li&gt;Selective activation: No deliberation needed
for unanimous votes.
Dig deeper only when opinions diverge&lt;&#x2F;li&gt;
&lt;li&gt;Structured fairness: Guarantee the minority
the last word, compensating for numerical
disadvantage through procedure&lt;&#x2F;li&gt;
&lt;li&gt;Safe fallback: All errors fall back
to independent analysis results&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The plugin is available on GitHub.
If you are a Claude Code user,
you can install it and try the &lt;code&gt;&#x2F;magi&lt;&#x2F;code&gt;
command.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-self-review&quot;&gt;
&lt;p&gt;The Super MAGI concept document and requirements specification were themselves reviewed by MAGI, both receiving unanimous 3-to-0 approval. The results are included in the repository&#x27;s &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; directory. &lt;a href=&quot;#fr-self-review-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-agent-teams&quot;&gt;
&lt;p&gt;Announced alongside Claude Opus 4.6. A single session acts as team leader, spawning multiple agents as teammates who exchange messages via &lt;code&gt;SendMessage&lt;&#x2F;code&gt;. See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;agent-teams&quot;&gt;official documentation&lt;&#x2F;a&gt; for details. &lt;a href=&quot;#fr-agent-teams-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-realworld&quot;&gt;
&lt;p&gt;If only the real world worked this way too. &lt;a href=&quot;#fr-realworld-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-mill&quot;&gt;
&lt;p&gt;J.S. Mill, &lt;em&gt;On Liberty&lt;&#x2F;em&gt; (1859). Mill criticized the &quot;tyranny of the majority,&quot; arguing that even if all of humanity held one opinion and only a single person held the opposite, silencing that one person would not be justified. &lt;a href=&quot;#fr-mill-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-article-review&quot;&gt;
&lt;p&gt;A reversal actually occurred during the review of this article. The initial vote split 2-to-1 (Option B: needs improvement), but after the deliberation phase, it reversed to a unanimous 3-to-0 (Option A: worthy of publication). &lt;a href=&quot;#fr-article-review-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Using Claude Code&#x27;s Agent Teams feature,
I upgraded the Evangelion-inspired MAGI plugin
from simple majority voting
to a deliberative democracy system
where AI agents debate before casting
their final votes.
</summary>
        </entry><entry xml:lang="en">
        <title>Claude Codeの「何やってたっけ？」をなくす — jrnl-toolsで文脈を渡す</title>
        <published>2026-02-13T00:00:00+00:00</published>
        <updated>2026-02-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/claude-code-jrnl-context-handoff/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/claude-code-jrnl-context-handoff/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;転載記事&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;claude-code-jrnl-context-handoff&quot;&gt;Zenn&lt;&#x2F;a&gt;に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;CLIジャーナルツール
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jrnl.sh&#x2F;&quot;&gt;jrnl&lt;&#x2F;a&gt;を使って
Claude Codeのセッション間で失われる
記憶を引き継ぐプラグイン
&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&#x2F;tree&#x2F;main&#x2F;plugins&#x2F;jrnl-plugin&quot;&gt;jrnl-tools&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;
を紹介&lt;&#x2F;li&gt;
&lt;li&gt;セッション終了時に&lt;code&gt;&#x2F;jrnl-handoff&lt;&#x2F;code&gt;で
作業状態を記録し、
翌日&lt;code&gt;&#x2F;jrnl-restore&lt;&#x2F;code&gt;で復元&lt;&#x2F;li&gt;
&lt;li&gt;プロジェクト横断の状況一覧や
時系列の作業履歴も可能&lt;&#x2F;li&gt;
&lt;li&gt;2026年2月5日にリリースされた
&lt;strong&gt;Auto Memory&lt;&#x2F;strong&gt;との棲み分けも解説&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;iframe class=&quot;hatenablogcard&quot; src=&quot;https:&#x2F;&#x2F;hatenablog-parts.com&#x2F;embed?url=https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;yostos&amp;#x2F;claude-code-plugins&quot; width=&quot;100%&quot; height=&quot;155&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; loading=&quot;lazy&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;きっかけ_—_MCPからプラグインへ、そして活用法の発見&quot;&gt;きっかけ — MCPからプラグインへ、そして活用法の発見&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeで複雑なリファクタリングを
進めていて、
途中でセッションを閉じる必要がありました。
翌日セッションを再開すると、
Claude Codeは何も覚えていません。
「昨日の続きをお願い」と言っても、
ゼロから説明し直す羽目になりました。&lt;&#x2F;p&gt;
&lt;p&gt;筆者は以前から、
日々の作業を記録するために
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jrnl.sh&#x2F;&quot;&gt;jrnl&lt;&#x2F;a&gt;というCLIジャーナル
ツールを使っていました&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-jrnl-mcp-1&quot;&gt;&lt;a href=&quot;#fn-jrnl-mcp&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。
ターミナルから
&lt;code&gt;jrnl &quot;今日はXXを調査した&quot;&lt;&#x2F;code&gt;
と打つだけで記録が残る、
その手軽さを気に入っていたからです。&lt;&#x2F;p&gt;
&lt;p&gt;セッション記憶喪失の体験と、
普段使いのjrnl。
この2つが頭の中でつながりました。
&lt;strong&gt;jrnlが自分への備忘録として
機能するなら、Claude Codeへの備忘録としても
使えるのではないか。&lt;&#x2F;strong&gt;
セッション終了時にjrnlへ引き継ぎメモを書き、
翌日のセッションでそれを読み込ませれば、
文脈を引き継げるはずです。&lt;&#x2F;p&gt;
&lt;p&gt;このアイデアがjrnl-toolsプラグインの
出発点です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Codeの「記憶」の限界&quot;&gt;Claude Codeの「記憶」の限界&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeは強力な開発パートナーです。
コードを読み、修正し、テストを回し、
アーキテクチャの議論まで
一緒にしてくれます。
しかし、セッション固有の文脈には
根本的な制約があります。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeには&lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt;という
永続的な設定ファイルがあり、
プロジェクトのルールや規約は
セッションを超えて引き継げます。
しかし、
&lt;strong&gt;「昨日のセッションで何を議論し、
どこまで進み、
次に何をする予定だったか」という
セッション固有のコンテキストは
引き継がれません。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;昨日2時間かけてデバッグした
認証バグの調査過程、設計判断の理由、
「次にやること」の合意。
セッションを閉じた瞬間、それらは消えます。
翌朝、新しいセッションを開くと、
Claude Codeはプロジェクトのルールは
知っていても、
昨日の作業状況は知りません。&lt;&#x2F;p&gt;
&lt;p&gt;「それなら&lt;code&gt;claude --resume&lt;&#x2F;code&gt;や
&lt;code&gt;claude --continue&lt;&#x2F;code&gt;でセッションを
再開すればいいのでは？」
と思うかもしれません。
確かに、これらのコマンドは
会話履歴をそのまま復元できる
強力な機能です。
しかし、セッション再開には
以下の制約があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同一ディレクトリ限定&lt;&#x2F;strong&gt; —
セッションはディレクトリに紐付いており、
別プロジェクトのセッションは
再開できない&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コンテキストウィンドウの制約&lt;&#x2F;strong&gt; —
長いセッションはコンパクト化され、
過去の議論の詳細は失われていく&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;検索性がない&lt;&#x2F;strong&gt; —
「先月の認証バグ調査」を
後から探すことはできない。
セッション履歴は蓄積される
知識にならない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;そもそも、
膨大に膨らんだセッションの
コンテキストをそのまま次回に
引き継ぎたいわけではありません。
必要なのは「何が完了し、何が残っていて、
次にどこから始めるか」という要点です。
セッション再開は「中断した作業の
直接的な続行」には向いていますが、
「要点を絞った引き継ぎ」や
「長期的な作業記録」には
対応していません。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、
複数プロジェクトを並行して進めている
開発者にとって、問題は深刻です。
Claude Codeはプロジェクト
（ディレクトリ）単位で動作するため、
プロジェクトAで作業しているときに
プロジェクトBの状況を知る方法が
ありません。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、足りていないのは以下の2つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;セッションの要点を構造化して
引き継ぐ仕組み&lt;&#x2F;strong&gt; —
何を議論し、どこまで進み、
次に何をするかを簡潔に次の
セッションに伝える手段&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロジェクトの壁を超えた
横断的な状況把握&lt;&#x2F;strong&gt; —
どのプロジェクトからでも、
他のプロジェクトの進捗を
確認できる手段&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらを既存のCLIツールで
実現できないかと考えたとき、
冒頭で触れたjrnlの存在が
頭に浮かびました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jrnlという選択_—_CLIジャーナルが架け橋になる&quot;&gt;jrnlという選択 — CLIジャーナルが架け橋になる&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jrnl.sh&#x2F;&quot;&gt;jrnl&lt;&#x2F;a&gt; は
コマンドラインで動くシンプルな
ジャーナルツールです。
テキストベースで、タグ付けができ、
日付によるフィルタリングが可能です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;jrnl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;認証バグの原因はトークンリフレッシュ処理にあった @api @log&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;たったこれだけで、
タイムスタンプ付きのエントリが
記録されます。
このシンプルさがClaude Codeとの
統合に適しています。&lt;&#x2F;p&gt;
&lt;p&gt;jrnl-toolsが目指すのは、
&lt;strong&gt;jrnlをClaude Codeセッション間の
「フロー情報ハブ」にすること&lt;&#x2F;strong&gt;です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    graph TD
A[&quot;Project A&lt;br&#x2F;&gt;(Claude Code)&quot;] --&gt; J
B[&quot;Project B&lt;br&#x2F;&gt;(Claude Code)&quot;] --&gt; J
C[&quot;Project C&lt;br&#x2F;&gt;(Claude Code)&quot;] --&gt; J
J[&quot;jrnl (グローバル)&lt;br&#x2F;&gt;作業ログ &#x2F; ハンドオフ &#x2F; アイデア&quot;]
J --&gt; R[&quot;どのプロジェクトからでもアクセス可能&quot;]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;各プロジェクトのClaude Codeセッションから
jrnlに書き込み、
別のプロジェクトや翌日のセッションから
それを読み出す。
jrnlがプロジェクトとセッションの壁を超える
共有レイヤーになります。
組み込みのメモリ機能にはない、
jrnlならではの特性は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クロスプロジェクト横断&lt;&#x2F;strong&gt; —
jrnlはグローバルなので、
どのプロジェクトからでも
全プロジェクトの状況を把握できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;時系列の作業履歴&lt;&#x2F;strong&gt; —
エントリは日付付きで蓄積され、
後から検索・振り返りができる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code外からもアクセス可能&lt;&#x2F;strong&gt; —
&lt;code&gt;jrnl @handoff&lt;&#x2F;code&gt;のように、
ターミナルから直接検索・閲覧できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ユーザーが完全に制御可能&lt;&#x2F;strong&gt; —
エントリはプレーンテキストであり、
内容の確認・編集・削除を
自分で管理できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;「オリエンテーションガイド」という設計思想&quot;&gt;「オリエンテーションガイド」という設計思想&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsの設計で
最も重要な考え方があります。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;ハンドオフは「状態のダンプ」ではなく
「オリエンテーションガイド」です。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;最初は、セッションの全状態をjrnlに
保存しようと考えました。
しかし実際に使ってみると、
複雑なセッションほど圧縮されて
読みにくいエントリになり、
結局役に立ちません。&lt;&#x2F;p&gt;
&lt;p&gt;そこで発想を転換しました。
プロジェクトの詳細な状態は、
TODO.md、設計ドキュメント、
コード自体に既に存在しています。
次のセッションのAIに必要なのは
「どこを見ればいいか」
という案内図です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    graph LR
H[&quot;jrnl（オリエンテーションガイド）&lt;br&#x2F;&gt;Handoff:&lt;br&#x2F;&gt;TODO.md Phase 9を確認&lt;br&#x2F;&gt;issue #2に取り組み中&quot;] -- &quot;参照&quot; --&gt; P[&quot;プロジェクト文書（詳細な状態）&lt;br&#x2F;&gt;TODO.md&lt;br&#x2F;&gt;docs&#x2F;architecture.md&lt;br&#x2F;&gt;CLAUDE.md&lt;br&#x2F;&gt;ソースコード&quot;]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;良いハンドオフとは、
次のセッションが
「どのファイルを読めばいいか」
「何が進行中だったか」を
瞬時に把握できるものです。
すべてを記録する必要はありません。
プロジェクトファイルが永続的な状態を
持っているからです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jrnl-toolsの4つのコマンド&quot;&gt;jrnl-toolsの4つのコマンド&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsプラグインは、
4つのスラッシュコマンドを提供します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;&#x2F;jrnl-handoff_—_明日の自分への引き継ぎ&quot;&gt;&lt;code&gt;&#x2F;jrnl-handoff&lt;&#x2F;code&gt; — 明日の自分への引き継ぎ&lt;&#x2F;h3&gt;
&lt;p&gt;作業を終えるとき、
このコマンドを実行します。
Claude Codeがセッションの内容を分析し、
次のセッション向けの
オリエンテーションガイドを生成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; &#x2F;jrnl-handoff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;生成されるエントリの例は
以下のようになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Handoff: 認証ミドルウェアのリファクタリング完了 @api-server @handoff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Progress:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- トークンリフレッシュロジックを修正（auth.ts:45-78）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- ログイン&#x2F;ログアウトフローのテストがパス&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Files changed:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- src&#x2F;middleware&#x2F;auth.ts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- tests&#x2F;auth.test.ts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Blockers:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Next:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- &#x2F;api&#x2F;usersにレート制限を実装（TODO.md item 3参照）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- APIドキュメントの更新（docs&#x2F;api-spec.md参照）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;gitリポジトリ内では、
&lt;code&gt;git diff --name-only&lt;&#x2F;code&gt;と&lt;code&gt;git status&lt;&#x2F;code&gt;の
情報も自動的に取り込まれ、
変更ファイルの一覧が正確に記録されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;&#x2F;jrnl-restore_—_前回の続きから再開&quot;&gt;&lt;code&gt;&#x2F;jrnl-restore&lt;&#x2F;code&gt; — 前回の続きから再開&lt;&#x2F;h3&gt;
&lt;p&gt;翌朝、あるいは数日ぶりに
プロジェクトを開いたとき、
このコマンドで前回の状態を復元します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; &#x2F;jrnl-restore&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claude Codeは以下のステップで
動作します。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;jrnlから最新のハンドオフを取得&lt;&#x2F;li&gt;
&lt;li&gt;ハンドオフに記載されたファイル
（TODO.md、ドキュメントなど）を
実際に読み込み&lt;&#x2F;li&gt;
&lt;li&gt;gitリポジトリなら、
ハンドオフ以降のコミットや
未コミットの変更も確認&lt;&#x2F;li&gt;
&lt;li&gt;これらを総合して「前回の続き」として
提示する。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;ハンドオフが古くなっていても
問題ありません。
ハンドオフはあくまでスタート地点であり、
AIがプロジェクトファイルを読んで
最新の状態を把握します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;&#x2F;jrnl-status_—_全プロジェクト横断ビュー&quot;&gt;&lt;code&gt;&#x2F;jrnl-status&lt;&#x2F;code&gt; — 全プロジェクト横断ビュー&lt;&#x2F;h3&gt;
&lt;p&gt;複数プロジェクトを並行している
開発者にとって、
これが最も価値のある
コマンドかもしれません。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; &#x2F;jrnl-status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;過去7日間（デフォルト）のハンドオフから、
全プロジェクトの状況を一覧表示します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Projects (last 7 days):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@api-server (2026-02-10)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Status: 認証ミドルウェアのリファクタリング完了&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Next: レート制限の実装&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@mobile-app (2026-02-08)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Status: プッシュ通知の統合完了&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Next: iOSバッジ数のバグ修正&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@docs-site (2026-02-06)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Status: 新テーマへの移行がブロック中&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Next: デザインチームのアセット待ち&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;月曜朝の計画や週次レビューで
威力を発揮します。
&lt;code&gt;&#x2F;jrnl-status 30&lt;&#x2F;code&gt;で
過去30日に拡張できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;&#x2F;jrnl-log_—_作業記録の自動生成&quot;&gt;&lt;code&gt;&#x2F;jrnl-log&lt;&#x2F;code&gt; — 作業記録の自動生成&lt;&#x2F;h3&gt;
&lt;p&gt;セッション中の作業を振り返って
記録します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; &#x2F;jrnl-log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claude Codeがセッション内容を分析し、
作業ログを自動生成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Log: 認証バグ3件修正とOAuthテスト追加 @api-server @log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Completed:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 認証バグ修正（issues #45, #47, #48）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- トークンリフレッシュに指数バックオフを導入&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- OAuthフローの統合テスト追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Decisions:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- リフレッシュトークンのTTLを24時間から72時間に変更&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;日報やスタンドアップの素材として、
あるいは個人の振り返りとして
活用できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自然言語でも使える&quot;&gt;自然言語でも使える&lt;&#x2F;h2&gt;
&lt;p&gt;スラッシュコマンドだけでなく、
自然言語でもjrnlと対話できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; ジャーナルに追加して：決済APIはバリデーションエラーでも200を返す。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  response.statusフィールドを確認する必要がある&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; 先週のジャーナルを見せて&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; 昨日何をしていた？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; 認証に関するジャーナルエントリを検索して&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;jrnlのコマンド体系を知らなくても、
Claude Codeが適切なコマンドに変換して
実行します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;タグによる情報の分類&quot;&gt;タグによる情報の分類&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsは、
シンプルなタグ体系で情報を分類します。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;タグ&lt;&#x2F;th&gt;&lt;th&gt;用途&lt;&#x2F;th&gt;&lt;th&gt;時間の向き&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;@&amp;lt;project&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;プロジェクト識別（自動付与）&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;@log&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;過去の記録（作業、調査、判断）&lt;&#x2F;td&gt;&lt;td&gt;過去&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;@handoff&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;次セッションへの引き継ぎ&lt;&#x2F;td&gt;&lt;td&gt;未来&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;@idea&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;いつか検討するアイデア&lt;&#x2F;td&gt;&lt;td&gt;不定&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;プロジェクトタグは&lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt;に
設定しておくと、
自動的にすべてのエントリに付与されます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;jrnl Project Tag:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; api-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この仕組みにより、
&lt;code&gt;jrnl @api-server&lt;&#x2F;code&gt;で
特定プロジェクトのエントリだけを、
&lt;code&gt;jrnl @handoff&lt;&#x2F;code&gt;でプロジェクト横断の
ハンドオフだけを
フィルタリングできます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1日のワークフロー&quot;&gt;1日のワークフロー&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsを使った
典型的な1日の流れを紹介します。&lt;&#x2F;p&gt;
&lt;p&gt;朝はまず状況を把握し、文脈を復元します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;jrnl-status          # 全プロジェクトの状況を確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;jrnl-restore         # 今日のプロジェクトの前回状態を復元&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;作業中に気づいたことは、
その場で記録します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; ジャーナルに追加：キャッシュのTTLを5分にすると&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  レスポンスタイムが40%改善した&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; このアイデアを保存：将来的にGraphQL Subscriptionsで&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  リアルタイム更新を実装すべき&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;夕方、作業を終える前に
引き継ぎと記録を残します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;jrnl-handoff         # 明日のセッションへの引き継ぎ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;jrnl-log             # 今日の作業記録（オプション）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この流れを習慣化すると、
セッション間の文脈断絶がほぼなくなります。
翌朝の「何やってたっけ？」が
「はい、昨日の続きですね」に変わります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セットアップ&quot;&gt;セットアップ&lt;&#x2F;h2&gt;
&lt;p&gt;事前に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jrnl.sh&#x2F;&quot;&gt;jrnl&lt;&#x2F;a&gt;の
インストールが必要です。
Claude Codeの&lt;code&gt;&#x2F;plugin&lt;&#x2F;code&gt;コマンドから
インストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# マーケットプレイスを登録&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; marketplace add yostos&#x2F;claude-code-plugins&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# プラグインをインストール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install jrnl-tools@yostos-claude-code-plugins&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;各プロジェクトの&lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt;に、
プロジェクトタグを追加します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;jrnl Project Tag:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; myproject&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;これだけで準備完了です。
設定していなくても、
初回実行時にClaude Codeが
プロジェクト名を聞いてくれます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安全策と注意事項&quot;&gt;安全策と注意事項&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsは「壊さない」ことを
重視して設計されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;削除操作なし&lt;&#x2F;strong&gt; —
エントリの削除は不可。
誤操作によるデータ消失を防止&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;暗号化操作なし&lt;&#x2F;strong&gt; —
パスワード処理のセキュリティリスクを
回避&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;追記のみ&lt;&#x2F;strong&gt; —
既存のエントリを変更しない。
編集が必要な場合は
&lt;code&gt;jrnl --edit&lt;&#x2F;code&gt;の使用をガイド&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ただし、利用にあたって
認識しておくべき点があります。&lt;&#x2F;p&gt;
&lt;p&gt;機密情報の取り扱いには注意してください。
&lt;code&gt;&#x2F;jrnl-handoff&lt;&#x2F;code&gt;や&lt;code&gt;&#x2F;jrnl-log&lt;&#x2F;code&gt;は
セッション内容を要約して
jrnlに記録します。
セッション中にAPIキーや認証情報を
扱った場合、
それらが要約に含まれる可能性があります。
jrnlはデフォルトでプレーンテキスト
保存のため、
機密性の高いプロジェクトでは
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jrnl.sh&#x2F;en&#x2F;stable&#x2F;encryption&#x2F;&quot;&gt;jrnlの暗号化機能&lt;&#x2F;a&gt;の
利用を推奨します。&lt;&#x2F;p&gt;
&lt;p&gt;プロジェクト横断機能の情報分離にも
配慮が必要です。
&lt;code&gt;&#x2F;jrnl-status&lt;&#x2F;code&gt;は全プロジェクトの状況を
横断表示する便利な機能ですが、
裏を返せば異なるプロジェクトの情報が
同じジャーナルに混在することを
意味します。
異なる機密レベルのプロジェクトを
扱う場合は、この点を考慮してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Auto_Memoryの登場_—_公式機能との棲み分け&quot;&gt;Auto Memoryの登場 — 公式機能との棲み分け&lt;&#x2F;h2&gt;
&lt;p&gt;ここまでjrnl-toolsの設計と使い方を
紹介してきました。
しかし、このプラグインを開発していた
2026年2月5日、状況が変わりました。
Claude Code v2.1.32のリリースで
Auto Memory&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-auto-memory-1&quot;&gt;&lt;a href=&quot;#fn-auto-memory&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;という機能が
追加されたのです。&lt;&#x2F;p&gt;
&lt;p&gt;「ハンドオフして」とClaude Codeに
依頼するだけで、
次のセッションへの引き継ぎ情報が
&lt;code&gt;~&#x2F;.claude&#x2F;projects&#x2F;&lt;&#x2F;code&gt;配下の
メモリファイルに自動保存されます。
プロジェクトのパターンや設定も
自動的に記録され、
次回セッション開始時に
システムプロンプトへ読み込まれます。
セッション終了時に要点を
自動記録するSession
Memory&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-session-memory-1&quot;&gt;&lt;a href=&quot;#fn-session-memory&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;も含め、
&lt;strong&gt;同じプロジェクト内での
セッション引き継ぎは
公式機能でカバーできるように
なりました。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;正直に言えば、
開発中のプラグインと公式機能の
守備範囲が一部重なりました。
では、jrnl-toolsは
不要になったのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;実際に使い比べてみると、
両者の性質は異なっていました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;&#x2F;th&gt;&lt;th&gt;Auto Memory&lt;&#x2F;th&gt;&lt;th&gt;jrnl-tools&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;情報の性質&lt;&#x2F;td&gt;&lt;td&gt;ストック（安定した知識）&lt;&#x2F;td&gt;&lt;td&gt;フロー（時系列の記録）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;保存先&lt;&#x2F;td&gt;&lt;td&gt;プロジェクトごとのローカルファイル&lt;&#x2F;td&gt;&lt;td&gt;グローバルなjrnlジャーナル&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;スコープ&lt;&#x2F;td&gt;&lt;td&gt;単一プロジェクト&lt;&#x2F;td&gt;&lt;td&gt;クロスプロジェクト&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;次セッションへの引き継ぎ&lt;&#x2F;td&gt;&lt;td&gt;自動（システムプロンプトに読み込み）&lt;&#x2F;td&gt;&lt;td&gt;明示的（&lt;code&gt;&#x2F;jrnl-restore&lt;&#x2F;code&gt;で復元）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;過去の作業履歴&lt;&#x2F;td&gt;&lt;td&gt;新しい知見で上書き（約200行の自動読み込み枠）&lt;&#x2F;td&gt;&lt;td&gt;日付付きで蓄積・検索可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Claude Code外からのアクセス&lt;&#x2F;td&gt;&lt;td&gt;想定されていない&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;jrnl&lt;&#x2F;code&gt;コマンドで直接参照可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Auto Memoryは
**「プロジェクトの知識」**の
永続化に優れています。
コーディング規約、
プロジェクト構造、
ユーザーの好みといった安定した情報は、
Auto Memoryに任せるのが最適です。&lt;&#x2F;p&gt;
&lt;p&gt;一方、jrnl-toolsは
**「作業の記録」**に特化しています。
「いつ何をしたか」
「なぜその判断をしたか」という
時系列の文脈は、
Auto Memoryでは整理されて失われますが、
jrnlには蓄積されていきます。
&lt;code&gt;&#x2F;jrnl-status&lt;&#x2F;code&gt;による
プロジェクト横断ビューも、
プロジェクト単位で分離された
Auto Memoryでは実現できません。&lt;&#x2F;p&gt;
&lt;p&gt;両者は競合せず、補完関係にあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;jrnl-toolsは、
Claude Codeのセッションと
プロジェクトの壁を超えた
開発体験を実現するプラグインです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;プロジェクト間の壁を超える&lt;&#x2F;strong&gt; →
jrnlをハブにした横断ビューで、
全プロジェクトの状況を一望&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;作業履歴を蓄積する&lt;&#x2F;strong&gt; →
時系列のログとして
検索・振り返りが可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Claude Codeの外からも
アクセスできる&lt;&#x2F;strong&gt; →
ターミナルから直接参照でき、
独立したツールとして機能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Auto Memoryが「プロジェクトの知識」を、
jrnlが「作業の記録」を担う。
この棲み分けのもとで、
開発者のワークフローは
さらに改善されます。&lt;&#x2F;p&gt;
&lt;p&gt;jrnlのインストールとプラグインの導入は
数分で完了します。
まずは今日の作業を&lt;code&gt;&#x2F;jrnl-handoff&lt;&#x2F;code&gt;で
記録するところから始めてみてください。
使ってみた感想や改善のアイデアがあれば、
この記事のコメントや
GitHubリポジトリのIssueで
気軽にお聞かせください。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-jrnl-mcp&quot;&gt;
&lt;p&gt;以前
&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;07&#x2F;first-mcp-server-development&#x2F;&quot;&gt;jrnl-mcp&lt;&#x2F;a&gt;
というMCPサーバーを作り、
Claude DesktopやClaude Codeから
jrnlを操作できるようにしていました。
Claude Codeのプラグインへ移植しようとした際、
MCPのツールAPIを経由しなくても
Claude Codeならjrnlコマンドを
直接実行できることに気づき、
必要なのはAPIではなく
ワークフローの設計だという
発想の転換がありました。 &lt;a href=&quot;#fr-jrnl-mcp-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-auto-memory&quot;&gt;
&lt;p&gt;Auto Memoryは、
Claude Code v2.1.32
（2026年2月5日リリース）で
追加された機能です。
セッション中に発見した
プロジェクトのパターンや設定を
&lt;code&gt;~&#x2F;.claude&#x2F;projects&#x2F;&lt;&#x2F;code&gt;配下の
メモリファイルに自動保存し、
次回セッションのシステムプロンプトに
読み込みます。「ハンドオフして」と
依頼すれば
次にやるべきことも保存できます。
詳細は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;memory&quot;&gt;公式ドキュメント&lt;&#x2F;a&gt;
を参照してください。 &lt;a href=&quot;#fr-auto-memory-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-session-memory&quot;&gt;
&lt;p&gt;2026年2月現在の
Session Memoryは、
セッション終了時に会話の要点を
自動的に記録する機能です。
Claude Code（Pro&#x2F;Maxプラン、
Anthropic API経由）で利用でき、
同じプロジェクトの次回セッションで
参照できます。
ただしプロジェクトごとに分離されており、
異なるプロジェクト間での共有は
できません。
Bedrock・Vertex・Foundry経由の
利用ではフィーチャーフラグにより
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;anthropics&#x2F;claude-code&#x2F;issues&#x2F;13706&quot;&gt;無効化されています&lt;&#x2F;a&gt;。 &lt;a href=&quot;#fr-session-memory-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">「昨日の続きをお願い」が通じない。
セッションごとに記憶が消える
Claude Codeの弱点を、
CLIジャーナルツールjrnlで補う
プラグインを開発しました。
プロジェクト横断の状況把握から
Auto Memoryとの使い分けまで
解説します。
</summary>
        </entry><entry xml:lang="en">
        <title>アニメ「うる星やつら」エンディングテーマ「心細いな」</title>
        <published>2026-02-11T13:56:00+09:00</published>
        <updated>2026-02-11T13:56:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/kokorobosoi-na/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/kokorobosoi-na/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;kokorobosoi-na&amp;#x2F;cover.webp?h=b9a0314317900057d20f&quot;
  alt=&quot;Cover&quot; width=&quot;2912&quot; height=&quot;1632&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;1980年代のアニメ「うる星やつら」の
第2代目エンディングテーマ「心細いな」を
コピーしてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2264093507&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;kokorobosoi-na-feeling-so&quot; title=&quot;Kokorobosoi na (Feeling So Lonely)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Kokorobosoi na (Feeling So Lonely)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;この曲は第22話（1982年4月）から
第43話（同年9月）まで使用された第2代目のエンディングテーマ曲です。&lt;&#x2F;p&gt;
&lt;p&gt;大学受験の最中もこのアニメだけは
欠かさず観ていました。この曲が流れ始めた
時期は、ちょうど故郷を離れて慣れない
大学生活が始まった頃と重なります。
ファンだった高中正義のバンドにも参加していた
小林泉美による楽曲で、トロピカルな曲調と
「心細いな」というタイトルが相まって、
新生活への期待と不安が入り混じった
あの頃の気持ちを思い出します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;制作陣の凄さ&quot;&gt;制作陣の凄さ&lt;&#x2F;h2&gt;
&lt;p&gt;アニメの主題歌ですが、
1980年代初頭の日本のポップス&#x2F;
フュージョンシーンで第一線にいた人材が
集まって制作された曲です。&lt;&#x2F;p&gt;
&lt;p&gt;作曲は、「うる星やつら」前期の楽曲を
ほぼ一手に担っていた
小林泉美（MIMI）さんです。
EastWest&#x27;76&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;の審査員だった
高中正義からバックバンドへ誘われ、
キティーレコードへ移籍しました。
当時キティ・フィルムが
「うる星やつら」の制作に参加しており、
楽曲制作にも声が掛かったのでしょう。
高中正義バンドだけでなく
PARACHUTE（パラシュート）や
THE SQUARE（現T-SQUARE）からも
加入を要請されたほどの
実力派キーボーディストでした。&lt;&#x2F;p&gt;
&lt;p&gt;当時のアニソンはオーケストラ編成が常識で、
歌詞に主人公の名前や必殺技を盛り込むのが
定番でした。しかし小林が当初提出した
3曲のデモはどれも打ち込みで、
フジテレビ内では大悪評だったそうです。
歌詞もキャラクター名を一切使わない
抽象的な内容でした。
今ではこうした試みがアニメソングの
転換点だったと評価されています。&lt;&#x2F;p&gt;
&lt;p&gt;編曲はモップスのギタリストだった
星勝さんです。井上陽水、RCサクセション、
小椋佳、浜田省吾など、当時の日本の
ロック・ポップスの名作を数多く
手がけた方でもあります。
スティールドラムを多用したアレンジは、
トロピカルポップが得意だった小林泉美の
作風と見事にマッチしています。&lt;&#x2F;p&gt;
&lt;p&gt;現在配信などで聞ける「心細いな」は
同シリーズの他の曲も歌っていた松谷祐子さん
バージョンですが、当時エンディングでは &lt;strong&gt;ヘレン笹野&lt;&#x2F;strong&gt; さん
が歌っているものが使われていました。&lt;&#x2F;p&gt;
&lt;p&gt;本名はヘレン・ジーン・ミスリンスキーです。
ポーランド系アメリカ人で母が日本人のようです。
米国で生まれ相模原の米軍キャンプで育ち、当時は
バラエティ番組のアシスタント等の芸能活動されていました。
キティミュージック所属だったのが縁でキャスティングでしょう。
歌唱力は歌手の松谷さんには及びませんが、ネイティブっぽい
発音やイントネーションがこの曲にマッチしていました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;楽曲の特徴&quot;&gt;楽曲の特徴&lt;&#x2F;h2&gt;
&lt;p&gt;1982年当時日本のアニメのエンディングにレゲエ調の曲が使用されることはかなり異例で、
しかもスティール・ドラムやパーカッションを多用した本格的なトロピカル風味なのです。
当時音楽としても時代の先を走っていたアニメ「うる星やつら」の先進性がよくわかります。&lt;&#x2F;p&gt;
&lt;p&gt;イントロでは &lt;code&gt;A7 → D → F#7 → Bm → A7 → D → Gm&#x2F;C&lt;&#x2F;code&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;という進行で、&lt;code&gt;D&lt;&#x2F;code&gt;と
&lt;code&gt;Bm&lt;&#x2F;code&gt;が平行調で、この行き来が上手くトロピカルな明るさと切なさを共存させています。&lt;&#x2F;p&gt;
&lt;p&gt;ヴァース部分は &lt;code&gt;Bm → F#7&lt;&#x2F;code&gt; の繰り返しが基本で、&lt;code&gt;F#7&lt;&#x2F;code&gt;のドミナントが&lt;code&gt;Bm&lt;&#x2F;code&gt;に解決する動きが反復されることでレゲエ的な「ゆるく揺れる」グルーヴを支えています。&lt;&#x2F;p&gt;
&lt;p&gt;ブリッジ（「宇宙で一番の浮気な男の子」）も &lt;code&gt;Em7 → DM7 → Em7 → Bm7 → Em7 → DM7 → C#7 → F#7&lt;&#x2F;code&gt; と展開で、ここでも平行調の
&lt;code&gt;DM7&lt;&#x2F;code&gt;と&lt;code&gt;Bm&lt;&#x2F;code&gt;を生かして「マイナーキーの切なさ」と「メジャーキーの明るさ」の間を行き来しつつ、ダイアトニック内のコードで転調感なく自然な響きの進行です。&lt;&#x2F;p&gt;
&lt;p&gt;サビ（「心細いな」の部分）は
&lt;code&gt;Bm → Em7 → F#7 → Bm&lt;&#x2F;code&gt; の循環で
マイナーキーの最も基本的なケーデンスですが、
3&#x2F;4拍子など変拍子を使うことで、
シンプルながら強い印象のサビになっています。&lt;&#x2F;p&gt;
&lt;p&gt;今回のコピーは正確な再現ではなく、
曖昧な記憶を頼りに雰囲気だけを
なぞってみました。コード進行は
ChordWikiを参考にしましたが、
オリジナルとはキーが違う気もします。
スティールドラムは打ち込みで、
ギターも雰囲気重視のコード弾きです。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;ヤマハ（日本楽器製造）東京支店が主催していたアマチュアバンドのコンテストで、1976年が第1回大会。サザンオールスターズ（1977年大会で桑田佳祐がベストボーカル賞）、カシオペア、SHOW-YA、爆風スランプの母体となったスーパースランプ、氷室京介が在籍したバンドなどが出場している。ポプコン（ポピュラーソングコンテスト）と並ぶプロへの登竜門だった。ロック系に関してはポプコンよりEastWestの方が人気だったとミッキー吉野も回想している。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;オリジナルから変調しています。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">アニメ初代「うる星やつら」第2代目エンディングテーマ
「心細いな」をギターでコピーしました。
小林泉美や星勝など当時の第一線の制作陣による
楽曲の魅力と、新生活の頃の思い出を綴ります。
</summary>
        </entry><entry xml:lang="en">
        <title>ZolaブログにOGP画像自動生成を組み込んだ</title>
        <published>2026-02-10T00:00:00+00:00</published>
        <updated>2026-02-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/ogp-image-generation/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/ogp-image-generation/</id>
        
            <content type="html">&lt;p&gt;このブログは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt;と&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;welpo&#x2F;tabi&quot;&gt;tabi&lt;&#x2F;a&gt;テーマで運用しています。
&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2026&#x2F;01&#x2F;blog-to-zola-aws-cleanup&#x2F;&quot;&gt;Next.jsから移行して&lt;&#x2F;a&gt;10日ほど経ち、
基本的な運用は安定してきましたが、
OGP画像が未対応のままでした。
SNSでリンクを共有したときに
表示される画像がないのは寂しいものです。
対応の顛末を記録します。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;OGP画像がなぜ必要か&quot;&gt;OGP画像がなぜ必要か&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ogp.me&#x2F;&quot;&gt;OGP（Open Graph Protocol）&lt;&#x2F;a&gt;は、
URLを共有した際にタイトルや説明文、
画像をプレビュー表示するための仕組みです。
BlueskyやSlack、LINEなど、
いまやほとんどのサービスが対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;OGP画像が未設定の場合、
リンクはテキストだけの素っ気ない表示になるか、
サイト共通のデフォルト画像が使われます。
このブログでは後者の状態でした。
どの記事を共有しても同じ画像が出るので、
タイムラインで見かけても
何の記事か判別できません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;ogp-image-generation&amp;#x2F;before.webp?h=31ab83f0940f69a0288b&quot;
  alt=&quot;対応前：すべての記事で同じ画像&quot; width=&quot;531&quot; height=&quot;377&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;記事ごとにタイトル入りの画像を用意すれば、
共有リンクだけで内容が伝わります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;ogp-image-generation&amp;#x2F;after.webp?h=61caf7e3efb4f885ee01&quot;
  alt=&quot;対応後：記事タイトル入りのOGP画像&quot; width=&quot;522&quot; height=&quot;392&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Zola_+_tabiテーマでのOGP画像の扱い&quot;&gt;Zola + tabiテーマでのOGP画像の扱い&lt;&#x2F;h2&gt;
&lt;p&gt;Zolaの画像処理機能は &lt;code&gt;resize_image()&lt;&#x2F;code&gt; による
リサイズ、クロップ、フォーマット変換に
限られます。
テキストを画像に描画する機能はなく、
OGP画像の自動生成は備わっていません。&lt;&#x2F;p&gt;
&lt;p&gt;tabiテーマ側には
&lt;code&gt;social_media_images.html&lt;&#x2F;code&gt; という
テンプレートがあり、frontmatterの
&lt;code&gt;[extra] social_media_card&lt;&#x2F;code&gt; で
指定された画像パスから &lt;code&gt;og:image&lt;&#x2F;code&gt; 等の
メタタグを出力します。
ただし画像ファイルへの参照を担うだけで、
画像そのものは生成しません。
ファイルは事前に用意しておく必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;tabiの作者であるwelpo氏も、
自身のブログ
（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;osc.garden&#x2F;blog&#x2F;automating-social-media-cards-zola&#x2F;&quot;&gt;osc.garden&lt;&#x2F;a&gt;）
でこの課題に取り組んでいます。
氏のアプローチは &lt;code&gt;shot-scraper&lt;&#x2F;code&gt; で
ページのスクリーンショットを撮影し、
OGP画像にするというものです。
ページの見た目がそのまま
プレビューになるため、
デザインの一貫性は高いです。
一方で、Zolaの開発サーバーを起動した上で
スクリーンショットを撮る必要があり、
ビルドプロセスが複雑になります。&lt;&#x2F;p&gt;
&lt;p&gt;このブログでも独自の対応が必要でした。
スクリーンショット方式はビルドの複雑さから
見送り、別のアプローチを探ることにしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;選んだアプローチ&quot;&gt;選んだアプローチ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;OGP画像生成方式&quot;&gt;OGP画像生成方式&lt;&#x2F;h3&gt;
&lt;p&gt;OGP画像の生成方式には、大きく2つの方向があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Zenn.devのような固定フレーム画像に記事タイトルを合成する方式&lt;&#x2F;li&gt;
&lt;li&gt;各記事のカバー画像に記事タイトルを合成する方式&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;フレーム方式はすべての記事で統一感が出ますが、
記事ごとの個性は薄くなります。
カバー画像方式は記事の内容が視覚的に伝わる
反面、画像のない記事には対応できません。&lt;&#x2F;p&gt;
&lt;p&gt;このブログには既存記事が200近くあり、
写真やスクリーンショットを含む記事と、
テキストだけの記事が混在しています。
どちらか一方の方式では、
必ずカバーできない記事が出てきます。&lt;&#x2F;p&gt;
&lt;p&gt;そこで両者のハイブリッド方式を採りました。
記事フォルダにOGPの背景として十分なサイズの
画像があればそれを使い、
なければサイト共通のデフォルト画像を使い、記事タイトルを合成する&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;blog-yostos&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;generate-ogp.mjs&quot;&gt;一括生成スクリプト&lt;&#x2F;a&gt;を作成しました。
カバー画像のある記事は記事固有の見た目になり、
画像がない記事もブログとしての統一感を保てます。
どの記事に画像があるかを人が判断する必要もなく、
スクリプトがサイズを見て自動で振り分けます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;OGP画像配置戦略&quot;&gt;OGP画像配置戦略&lt;&#x2F;h3&gt;
&lt;p&gt;Zolaでは記事と同じフォルダに画像を
配置できます。
そこで、OGP画像は &lt;code&gt;ogp.webp&lt;&#x2F;code&gt; という固定のファイル名で
記事フォルダに出力することとしました。&lt;&#x2F;p&gt;
&lt;p&gt;こうすることで、各記事のfrontmatterからは常に同じ相対パスでOGP画像を参照できます。&lt;&#x2F;p&gt;
&lt;p&gt;既存記事については、同じfrontmatterを追加するだけで対応できます。
frontmatterに機械的に &lt;code&gt;social_media_card = &quot;ogp.webp&quot;&lt;&#x2F;code&gt; を
追加する&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;blog-yostos&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;add-ogp-frontmatter.mjs&quot;&gt;スクリプト&lt;&#x2F;a&gt;を作成して一括で対応しました。&lt;&#x2F;p&gt;
&lt;p&gt;新規記事についてはNeovimのテンプレート機能で
frontmatterに &lt;code&gt;social_media_card = &quot;ogp.webp&quot;&lt;&#x2F;code&gt;
を最初から埋め込んでおくことで対応できてしまいます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;運用について&quot;&gt;運用について&lt;&#x2F;h3&gt;
&lt;p&gt;今後の運用でも、今回作成した&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;blog-yostos&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;generate-ogp.mjs&quot;&gt;一括生成スクリプト&lt;&#x2F;a&gt;を活用します。&lt;&#x2F;p&gt;
&lt;p&gt;このスクリプトは、既にOGP画像がある記事はスキップするため、
新しい記事を書いたらこのスクリプトを実行するだけで新規記事の分だけOGP画像を生成してくれます。
そして記事のテンプレートにもうすでにOGP画像の指定がfrontmatterとして設定されています。&lt;&#x2F;p&gt;
&lt;p&gt;もちろん、今後ベースとなったフレーム画像が気にくわなければ各記事フォルダの&lt;code&gt;ogp.webp&lt;&#x2F;code&gt;を削除すれば再作成されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;導入してみて&quot;&gt;導入してみて&lt;&#x2F;h2&gt;
&lt;p&gt;200記事すべてにOGP画像が生成され、
SNS共有時の見栄えが改善されました。&lt;&#x2F;p&gt;
&lt;p&gt;今回は過度に自動化せず、
新規記事については毎回手動で
OGP画像生成スクリプトを実行する
運用にしています。
&lt;code&gt;zola serve&lt;&#x2F;code&gt; でプレビューを確認する際、
OGP画像がないとエラーになるのが
微妙にストレスなので、
いずれビルドプロセスへの組み込みも
検討したいところです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;関連記事&lt;&#x2F;strong&gt;
        &lt;p&gt;実装の技術的な詳細は
Zennに投稿しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;zola-ogp-auto-generation&quot;&gt;Zola + tabiテーマでOGP画像を自動生成する
（Zenn）&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">静的サイトジェネレーターZolaとtabiテーマの組み合わせで
運用しているこのブログに、OGP画像の自動生成を導入しました。
Zolaに組み込みの仕組みがない中でどう対応したか、
検討から導入までの経緯を記録します。
</summary>
        </entry><entry xml:lang="en">
        <title>生成AI時代、重力に魂を引かれるな</title>
        <published>2026-02-09T12:30:00+09:00</published>
        <updated>2026-02-09T12:30:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/ai-human-divergence/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/ai-human-divergence/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;ai-human-divergence&amp;#x2F;cover.webp?h=47e368ab0f46eda916c2&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1009&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;革新的な技術が目の前にあり、誰でも試せる状況になったとき、
実際に試す人はどれくらいいるでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;この1年、生成AI、Markdown、テキストエディタの活用など生産性の
上げるための多くのものを紹介しても、何ひとつ試そうともしない人を目の当たりにしてきました。&lt;&#x2F;p&gt;
&lt;p&gt;この1年に限らずこれまでの私の観測では、どの現場でも新技術を2割が試し、4割は「いつか試そう」と思いながら試さず、
残りの4割は試そうともしません。
これは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3Zp2HiL&quot;&gt;Everett Rogersのイノベーション普及理論&lt;&#x2F;a&gt; &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;とも一致します。&lt;&#x2F;p&gt;
&lt;p&gt;興味深いのは、この比率が技術の難易度とほぼ無関係なことです。
生成AIのような革新的技術だけでなく、Markdownのような
学習コスト30分、チートシート1枚で済むツールでも同じだということです。&lt;&#x2F;p&gt;
&lt;p&gt;これはもはや能力の問題ではありません。
新しいことを取り入れる意志の問題です。
腰が重い、というより、重力に魂を引かれているのかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;そしてこの2割と8割の差は、生成AIの時代において
&lt;strong&gt;決定的な分断&lt;&#x2F;strong&gt;へと発展しようとしています。
以降、この2割を「先行者」、8割を「追随者」と呼ぶことにします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2つの革新&quot;&gt;2つの革新&lt;&#x2F;h2&gt;
&lt;p&gt;生成AIも同様です。
本格的に活用し、自身の生活や業務へ取り入れているのは2割程度でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;従来の技術革新と今回の「生成AI」が決定的に異なるのは、
もたらす変化が大きく2つに分けられることです。&lt;&#x2F;p&gt;
&lt;p&gt;1つ目は「&lt;strong&gt;実行力の民主化&lt;&#x2F;strong&gt;」です。
思考から実行し実現するまでの摩擦がほぼゼロになりました。
アイデアさえあれば、コード、文章、分析、デザイン、
それを形にするまでの障壁がなくなりつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;2つ目は「&lt;strong&gt;認知の拡張&lt;&#x2F;strong&gt;」です。
自分一人の脳では到達できない思考の深さと広さを得られるようになりました。
これは生成AIの認知力が高いということではありません。
生成AIを壁打ち相手、批判者、専門家、編集者として常に隣に置くことで、
自身の物事の捉え方や解決への発想、新たな着想力が
これまでとは比べ物にならないくらい速く柔軟に拡がります。
そう感じた方は多いはずです。
これは単なるツールではなく、認知そのものの拡張です。&lt;&#x2F;p&gt;
&lt;p&gt;先行者と追随者の間の前者のギャップは時間が解決します。
生成AIがさまざまなツールに組み込まれれば、
追随者もそのメリットを享受できるようになるでしょう。
Gmailの文章補完、Excelの自動分析、Canvaのデザイン提案。
これらは「使う」意志がなくても、自然に恩恵を受けられます。&lt;&#x2F;p&gt;
&lt;p&gt;問題は後者です。認知の拡張は、能動的に求めなければ得られません。
そして、いち早く生成AIを活用している先行者は、
今この瞬間も認知を拡張し続けています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AI時代の分断&quot;&gt;AI時代の分断&lt;&#x2F;h2&gt;
&lt;p&gt;ここで&lt;strong&gt;決定的な分岐&lt;&#x2F;strong&gt;が生まれます。&lt;&#x2F;p&gt;
&lt;p&gt;追随者はメーカーがAIで便利にした製品を使います。
便利にはなります。
しかし、製品が想定した範囲内でしか動けません。
誰かが設計した体験の中にいます。&lt;&#x2F;p&gt;
&lt;p&gt;先行者はAIそのものを使います。
そして時代はエージェント型AI、
現実世界の道具を使えるAIの時代になりました。
何をさせるか、どう組み合わせるかをAIに指示し、
道具に縛られずAIで生産性を上げ、
さらに認知力の拡張を続けることができます。&lt;&#x2F;p&gt;
&lt;p&gt;前者は消費者、後者は設計者です。&lt;&#x2F;p&gt;
&lt;p&gt;エンジニアの世界では、既にこの分断が始まっています。&lt;&#x2F;p&gt;
&lt;p&gt;昨年まではGitHub Copilotのように
エディタやIDEにAIを組み込んだものがもてはやされてきました。
しかしClaude Codeの登場で状況が変わりました。
エディタに組み込まれていなくても、
Claude Code自身がツールを操り開発を進められるようになったのです。
エンジニアは自身のコーディングの支援だけでなく、
テスト、設計、要件定義、構想策定まで
Claude Codeと協業しながら生成AIの適用範囲を広げていけます。
単純な作業を任せるだけでなく、
これまで実現コストで躊躇していた新しいアイデアへ
どんどん挑戦できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;非エンジニアの世界でも同じことが起きようとしています。
これまではExcelやWordにAIが組み込まれるのを歓迎していました。
しかしClaude Coworkが普及すれば、そんなことは関係なくなります。
好きなツールをCoworkから使いこなして業務ができるようになります。
事実、Claude Coworkの発表後、SaaSプロバイダーの株価は軒並み暴落しました。
市場はこの変化の意味を理解しています。&lt;&#x2F;p&gt;
&lt;p&gt;設計者になるか、消費者のままでいるか。その選択が迫られています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;量から質への転化&quot;&gt;量から質への転化&lt;&#x2F;h2&gt;
&lt;p&gt;もう1つ、見過ごせない力学があります。
「量をこなせば、質が向上する」という量質変換&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;があります。
ここで重要なのは、生成AIというツールの使いこなしではなく、
&lt;strong&gt;認知の拡張それ自体に量質変換が起きる&lt;&#x2F;strong&gt;ということです。&lt;&#x2F;p&gt;
&lt;p&gt;先行者は、生成AIと対話を重ねるたびに、
自分一人では到達できなかった思考領域に踏み込んでいます。
新しい視点を得れば、それを足がかりにさらに深い問いが立てられます。
深い問いに向き合えば、さらに広い視野が開けます。&lt;&#x2F;p&gt;
&lt;p&gt;これは単なるツールの習熟ではありません。
認知の拡張が認知の拡張を呼ぶ、爆発的な正のフィードバックです。&lt;&#x2F;p&gt;
&lt;p&gt;一度この拡張を経験すると、思考の出発点そのものが変わります。
昨日の自分には見えなかった問いが見えるようになり、
先月の自分には発想できなかった解決策が浮かぶようになります。
認知が広がれば、発想の幅も加速度的に広がります。
これが毎日、毎週、積み重なっていきます。&lt;&#x2F;p&gt;
&lt;p&gt;一方、追随者は最初の一歩を踏み出していません。
認知の拡張がなければ、量質変換も起きません。
差は線形ではなく、指数関数的に開いていきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;認知様式の分断&quot;&gt;認知様式の分断&lt;&#x2F;h2&gt;
&lt;p&gt;さらに深刻なのは、先行者と追随者の間で
コミュニケーションそのものが困難になっていくことです。&lt;&#x2F;p&gt;
&lt;p&gt;認知が拡張された者同士は、同じ地平に立って議論できます。
問題の捉え方、解決策の発想、思考の前提が揃っているからです。
言葉を尽くさなくても、互いの思考の輪郭が見えます。&lt;&#x2F;p&gt;
&lt;p&gt;一方、追随者との間では、まず見えている世界が違います。
先行者にとって当たり前の発想が、追随者には飛躍に見えます。
説明しようとしても、その説明を理解するための前提が共有されていません。&lt;&#x2F;p&gt;
&lt;p&gt;これは専門用語の問題ではありません。
認知の枠組みそのものが異なっているのです。&lt;&#x2F;p&gt;
&lt;p&gt;私たちは今、そうした分岐の入り口に立っているのかもしれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;私たちはどこへ向かうのか&quot;&gt;私たちはどこへ向かうのか&lt;&#x2F;h2&gt;
&lt;p&gt;先行者の認知は、日々拡張し続けています。
見える世界が広がり、立てられる問いが深まり、
発想の幅が際限なく広がっていきます。&lt;&#x2F;p&gt;
&lt;p&gt;追随者は、その変化に気づいていません。
気づかないまま、同じ枠組みの中で思考し続けます。
1年後、2年後、認知の差はどこまで開くでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;追随者が「置いていかれる」というより、
自ら「留まることを選んでいる」という方が正確かもしれません。
それが意識的な選択かどうかは問いません。&lt;&#x2F;p&gt;
&lt;p&gt;私たちは今、認知が分岐していく入り口に立っています。&lt;&#x2F;p&gt;
&lt;p&gt;あなたはどちら側にいますか。
そして、そこにいることを選んでいますか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;私たちの世代だと、これはどこかで見た構図です。&lt;&#x2F;p&gt;
&lt;p&gt;1979年のテレビアニメ『機動戦士ガンダム』では、
人類の宇宙進出という革新への適応として「ニュータイプ&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-3-1&quot;&gt;&lt;a href=&quot;#fn-3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;」が生まれ、
「重力に魂を引かれた」オールドタイプとの分断が描かれていました。
現代における重力とは、慣れ親しんだツールや思考様式への執着かもしれません。
しかし、最終回では特殊なモビルスーツのパイロットである主人公のみならず同じ部隊のクルーが覚醒していく様が描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;現代の革新についても、現状は追随者の側にいるとしてもそれは能力の問題ではありません。&lt;&#x2F;p&gt;
&lt;p&gt;先行者への最初の一歩は難しくありません。
Markdownを30分勉強し、Claude Proを使い始めましょう。&lt;&#x2F;p&gt;
&lt;p&gt;答えを求めるのではなく、壁打ち相手として問いを投げてみる。
それだけで、認知の拡張は動き始めます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;なぜClaudeなのか&lt;&#x2F;strong&gt;
        &lt;p&gt;私がClaudeを例に挙げているのは、2026年2月時点で
非エンジニア向けのエージェント機能（Cowork）を
提供しているのがAnthropicだけだからです。
認知の拡張を始めるなら、ChatGPTでもGeminiでも構いません。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;イノベーション普及理論は、新しい技術やサービスが市場に広がる過程を、消費者の採用タイミングに基づいて5つのタイプに分類し分析するマーケティング理論。1962年に提唱された。 5つのタイプとは、(1).イノベーター (革新者：2.5%)：最先端技術を好み、新しいものを進んで採用する。(2).アーリーアダプター (初期採用者：13.5%)：流行に敏感で、周囲に影響を与えるオピニオンリーダー。(3).アーリーマジョリティ (前期追随者：34%)：慎重派だが、新しいものを平均より早く採用する。
(4).レイトマジョリティ (後期追随者：34%)：懐疑的で、周囲の大半が使用して初めて採用する。(5).ラガード (遅滞層：16%)：最も保守的で、流行に関心が薄い。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;量質転化の法則。ヘーゲルの『小論理学』に由来する概念で、現代では一定の量を積み重ねることで臨界点に達し、能力や理解が劇的に向上するという原則として広く語られている。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-3&quot;&gt;
&lt;p&gt;広大な宇宙空間への適合の結果、ニュータイプは空間を超えた非言語的コミュニケーション能力、超人的な感覚力と直感力、観察力と洞察力を持つ新しい人類として描かれています。 &lt;a href=&quot;#fr-3-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">生成AIは人類の分岐点となる革新です。
しかし8割の人は新しいものを試そうとしません。
慣れ親しんだやり方に留まり、一歩を踏み出せない。
それはまさに「重力に魂を引かれた」状態ではないでしょうか。
</summary>
        </entry><entry xml:lang="en">
        <title>Snow Fell</title>
        <published>2026-02-08T00:00:00+00:00</published>
        <updated>2026-02-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/snow-fell/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/snow-fell/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;snow-fell&amp;#x2F;cover.webp?h=f1942b6099c1c6b81da0&quot;
  alt=&quot;Cover&quot; width=&quot;1800&quot; height=&quot;1010&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Living in Chiba, snow is a rare sight. Today, February 8, 2026, it&#x27;s snowing on
election day. I walked through the park this morning to capture the snow-covered
scenery. The satisfying crunch of fresh snow, a crow flying through the snowfall,
and the odd diamond shapes where the block corners stayed bare. It&#x27;s already a
day to remember. Time to go vote and help decide Japan&#x27;s future.&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;iwExG31dSco&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Living in Chiba, snow is a rare sight. Today, February 8, 2026, it&#x27;s snowing on election day. I walked through the park this morning to capture the snow-covered scenery. The satisfying crunch of fresh snow, a crow flying through the snowfall, and the odd diamond shapes where the block corners stayed bare. It&#x27;s already a day to remember. Time to go vote and help decide Japan&#x27;s future.
</summary>
        </entry><entry xml:lang="en">
        <title>白間津層ドローン空撮</title>
        <published>2026-02-07T00:00:00+00:00</published>
        <updated>2026-02-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/shiramazu/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/shiramazu/</id>
        
            <content type="html">&lt;p&gt;1月に南房総へドローン空撮に行ってきました。
メインの目的は白間津海岸の地層撮影です。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;shiramazu&amp;#x2F;shiramazu.webp?h=7a87863cc5d538372de9&quot;
  alt=&quot;白間津海岸&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;白間津層&quot;&gt;白間津層&lt;&#x2F;h2&gt;
&lt;p&gt;この美しい縞模様は約300万年前の深海で形成された「白間津層」です。
黒っぽい砂岩と灰色のシルト岩が交互に重なっています。&lt;&#x2F;p&gt;
&lt;p&gt;1枚1枚の縞は、海底地すべりや地震のたびに土砂が深海に流れ込んで
堆積した記録です。つまりこの縞模様は、300万年前からこの地域で
何度も地震や地すべりが繰り返されてきた&quot;地層の年輪&quot;なのです。&lt;&#x2F;p&gt;
&lt;p&gt;現在も房総半島は日本有数の速度で隆起を続けており（年3〜4mm）、
地殻変動が活発な地域です。&lt;&#x2F;p&gt;
&lt;p&gt;地上からでも迫力がありますが、ドローンで上空から見ると
縞模様の広がりがよくわかります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;灯台&quot;&gt;灯台&lt;&#x2F;h2&gt;
&lt;p&gt;せっかく南房総まで来たので、近くの灯台も撮影しました。&lt;&#x2F;p&gt;
&lt;p&gt;安房白浜港灯台は1962年に初点灯した白い小さな灯台です。
波打ち際の岩礁上に直接建っているのが特徴で、
船着き用の桟橋がないため、
海上保安庁の点検員も岩場を歩いてアクセスするそうです。
星景写真のスポットとしても知られています。&lt;&#x2F;p&gt;
&lt;p&gt;乙浜港南防波堤灯台は乙浜漁港の防波堤先端にある灯台です。
どちらも小さな灯台ですが、上空から見る海岸線は美しかったです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;tbD4qbXH71Q&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;撮影情報&quot;&gt;撮影情報&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;撮影日: 2026年1月27日正午過ぎ&lt;&#x2F;li&gt;
&lt;li&gt;撮影場所: 千葉県南房総市千倉町白間津1400&lt;&#x2F;li&gt;
&lt;li&gt;機材: DJI Air 3S + ND128フィルター&lt;&#x2F;li&gt;
&lt;li&gt;撮影設定: 4K 24fps &#x2F; D-Log &#x2F; シャッター速度1&#x2F;50固定&lt;&#x2F;li&gt;
&lt;li&gt;カラーグレーディング: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dmprovisuals.com&#x2F;products&#x2F;dji-air-3s-cinematic-luts&quot;&gt;DM Pro Visuals LUT&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;白間津海岸へは白間津花パーキングに駐車し、
花畑を横切って海岸に出るのがおすすめです。&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;iframe width=&quot;425&quot; height=&quot;350&quot; src=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;export&#x2F;embed.html?bbox=139.93261456489566%2C34.91722056162124%2C139.93798434734347%2C34.91962222478435&amp;amp;layer=mapnik&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;figcaption&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?#map=19&#x2F;34.918421&#x2F;139.935299&quot;&gt;大きな地図を表示&lt;&#x2F;a&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;ドローン飛行について&lt;&#x2F;strong&gt;
        &lt;p&gt;二等無人航空機操縦士ライセンスを保有し、包括申請済みです。
撮影にあたっては南房総市商工観光部観光プロモーション課の許可を得て、
千葉県警察本部館山警察署に通報しています。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">1月に千葉県南房総市・白間津海岸でドローン空撮をしてきました。
約300万年前の深海で形成された美しい縞模様の地層を上空から撮影しています。
</summary>
        </entry><entry xml:lang="en">
        <title>Claude Opus 4.6発表</title>
        <published>2026-02-06T00:00:00+00:00</published>
        <updated>2026-02-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/claude-opus46/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/claude-opus46/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;dPn3GBI8lII&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;本日、AnthropicからClaude Opus 4.6が発表されました。
私は普段から個人開発と業務の両方でClaude Codeを使っているので、
今回の発表は非常に楽しみにしていました。
主な新機能と、私にとって何が嬉しいのかをまとめます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;コーディング能力の大幅強化&quot;&gt;コーディング能力の大幅強化&lt;&#x2F;h2&gt;
&lt;p&gt;コーディング能力が大幅に強化されました。
Terminal-Bench 2.0やHumanity&#x27;s Last Examで業界最高スコアを達成しています。&lt;&#x2F;p&gt;
&lt;p&gt;私がこれまで感じていた課題の1つは、
複雑なタスクで途中から方針がブレることでした。
今回のアップデートでは「より慎重な計画を立て、
自分のミスを見つける力が向上した」とのことなので、
長めの開発セッションでも安心して任せられそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;100万トークンのコンテキスト対応&quot;&gt;100万トークンのコンテキスト対応&lt;&#x2F;h2&gt;
&lt;p&gt;Opus系で初めて100万トークンのコンテキストウィンドウに対応しました（ベータ）。
出力トークンも最大128kまで拡張されています。&lt;&#x2F;p&gt;
&lt;p&gt;大規模なコードベースを扱う際、これは大きな違いになります。
業務で触るリポジトリは規模が大きいので、
「このファイルも読んでほしいのに入りきらない」という場面が減りそうです。
MRCR v2テストでSonnet 4.5の18.5%に対してOpus 4.6は76%を記録しており、
長い文脈でも情報を見失いにくくなっているのは心強いです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Adaptive_ThinkingとEffort制御&quot;&gt;Adaptive ThinkingとEffort制御&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Adaptive Thinking&lt;&#x2F;strong&gt; - 深い思考が必要かどうかをモデル自身で判断する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Effort制御&lt;&#x2F;strong&gt; - low&#x2F;medium&#x2F;high&#x2F;maxの4段階で速度・コスト・性能を調整可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;以前はextended thinkingのオン&#x2F;オフしかなく、
簡単な質問でも考えすぎてしまうことがありました。
Adaptive Thinkingによってモデルが自分で判断してくれるのは嬉しい改善です。
それでも考えすぎと感じたら&lt;code&gt;&#x2F;effort medium&lt;&#x2F;code&gt;で調整できるのも実用的です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Context_Compaction&quot;&gt;Context Compaction&lt;&#x2F;h2&gt;
&lt;p&gt;長い会話やエージェントタスクで古いコンテキストを自動要約して、
コンテキストウィンドウの上限に達しにくくする仕組みです（ベータ）。&lt;&#x2F;p&gt;
&lt;p&gt;個人開発では1つのセッションで長時間作業することが多いので、
これは地味ながら大きな改善です。
これまで意図的にセッションを細かく切って、作業状態をファイルに書き出させてHandoffする仕組みを作っていました。
今回のこの機能で「会話が長くなってきたから一度リセットしよう」という手間が減りそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Agent_Teams&quot;&gt;Agent Teams&lt;&#x2F;h2&gt;
&lt;p&gt;複数のエージェントを並列で動かして自律的に協調させる機能です
（リサーチプレビュー）。
コードベースのレビューなど、独立した読み取り中心のタスクに向いています。&lt;&#x2F;p&gt;
&lt;p&gt;これは私が最も期待していた機能です。
以前、冗談半分で作った&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2025&#x2F;12&#x2F;magi-claude-code-plugin&#x2F;&quot;&gt;MAGIシステム&lt;&#x2F;a&gt;では、
複数のエージェントが並列でコードや文章をレビューし、
合意形成や改善点の洗い出しに重宝していました。
同様の機能がデフォルトで使えるようになるなら、
例えばコードレビューで複数のファイルを並列にチェックしたり、
リファクタリングの影響範囲を同時に調査したりできます。
Shift+Up&#x2F;Downやtmuxでサブエージェントを直接操作できるのも、
細かい制御が必要な場面で助かります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Officeツール連携&quot;&gt;Officeツール連携&lt;&#x2F;h2&gt;
&lt;p&gt;Claude in Excelが大幅に改善され、Claude in PowerPointも新たにリリースされました
（リサーチプレビュー）。&lt;&#x2F;p&gt;
&lt;p&gt;私の用途では直接関係ありませんが、
業務でExcelやPowerPointを使う方には便利そうです。
データ整理からプレゼン資料作成まで一貫してClaudeへ任せられます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安全性&quot;&gt;安全性&lt;&#x2F;h2&gt;
&lt;p&gt;過剰な拒否（本来答えて問題ない質問を断る）の率が
過去のClaudeモデルで最も低いとのことです。&lt;&#x2F;p&gt;
&lt;p&gt;これは実用上かなり重要です。
開発中に「これは答えられません」と言われて作業が止まる、
そういったストレスが減ることを期待しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;私のファーストインプレッション&quot;&gt;私のファーストインプレッション&lt;&#x2F;h2&gt;
&lt;p&gt;少し試してみた段階ですが、確かに「考えてから動く」感覚があります。
以前のモデルはすぐにコードを書き始めることが多かったのに対し、
Opus 4.6は一度立ち止まって全体を見渡してから作業を始める印象です。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropic社内でも「タスクの難しい部分に自発的に注力し、
簡単な部分はさっと進める」という評価があるようですが、
まさにそういう挙動を感じました。&lt;&#x2F;p&gt;
&lt;p&gt;Agent Teamsについてはまだ本格的に試せていませんが、
これからの開発で積極的に使ってみようと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;パートナー企業の評価&quot;&gt;パートナー企業の評価&lt;&#x2F;h2&gt;
&lt;p&gt;特にRakutenの事例が印象的で、
「1日で13件のissueを自律クローズし、12件を適切なチームメンバーにアサインした。
約50人の組織で6つのリポジトリを横断して運用・組織判断を行い、
人間にエスカレーションすべきタイミングも判断できた」と報告されています。
これが本当なら、開発チームの働き方が大きく変わりそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考資料&quot;&gt;参考資料&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codedchords.dev&#x2F;blog&#x2F;2025&#x2F;12&#x2F;magi-claude-code-plugin&#x2F;&quot;&gt;MAGIシステムをClaude Code Pluginで実装してみた&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&#x2F;blob&#x2F;main&#x2F;plugins&#x2F;magi&#x2F;README.md&quot;&gt;MAGI Plugin（GitHub）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Anthropicが最新モデルClaude Opus 4.6を発表しました。
コーディング能力の大幅強化、100万トークン対応、Agent Teamsなど
注目の新機能と、実際に試してみた私の所感をまとめています。
</summary>
        </entry><entry xml:lang="en">
        <title>GitHub Pagesのセキュリティヘッダー警告、無視していいの？</title>
        <published>2026-02-06T00:00:00+00:00</published>
        <updated>2026-02-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/github-pages-security-headers/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/github-pages-security-headers/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;github-pages-security-headers&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Pagesではセキュリティヘッダーを設定する機能がなく、スキャナーの警告がでる&lt;&#x2F;li&gt;
&lt;li&gt;セキュリティスキャナーの警告は「ベストプラクティス未達」であり「脆弱性」ではない&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Pagesでは大抵静的サイトのため、放置しても実質的なリスクは低い&lt;&#x2F;li&gt;
&lt;li&gt;自前でホスティングしたWordPressなどの動的サイトは必ず対応すべき&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;セキュリティヘッダーとは何か&quot;&gt;セキュリティヘッダーとは何か&lt;&#x2F;h2&gt;
&lt;p&gt;セキュリティスキャナーでよく指摘される6つのHTTPレスポンスヘッダーがあります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ヘッダー&lt;&#x2F;th&gt;&lt;th&gt;目的&lt;&#x2F;th&gt;&lt;th&gt;設定しないリスク&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Strict-Transport-Security (HSTS)&lt;&#x2F;td&gt;&lt;td&gt;HTTPS接続を強制&lt;&#x2F;td&gt;&lt;td&gt;HTTPへのダウングレード攻撃&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Content-Security-Policy (CSP)&lt;&#x2F;td&gt;&lt;td&gt;XSS攻撃を防止&lt;&#x2F;td&gt;&lt;td&gt;悪意あるスクリプト実行&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;X-Frame-Options&lt;&#x2F;td&gt;&lt;td&gt;クリックジャッキング防止&lt;&#x2F;td&gt;&lt;td&gt;偽サイトへの埋め込み&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;X-Content-Type-Options&lt;&#x2F;td&gt;&lt;td&gt;MIMEスニッフィング防止&lt;&#x2F;td&gt;&lt;td&gt;ファイル種別の誤認識&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Referrer-Policy&lt;&#x2F;td&gt;&lt;td&gt;リファラー情報の制御&lt;&#x2F;td&gt;&lt;td&gt;URLパラメータの漏洩&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Permissions-Policy&lt;&#x2F;td&gt;&lt;td&gt;ブラウザ機能の制御&lt;&#x2F;td&gt;&lt;td&gt;カメラ等の不正利用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;これらのヘッダーは、Webサーバーがレスポンスに含めることで、
ブラウザにセキュリティ関連の指示を与えます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;GitHub_Pagesの制限&quot;&gt;GitHub Pagesの制限&lt;&#x2F;h2&gt;
&lt;p&gt;GitHub Pagesは静的サイトホスティングサービスですが、
&lt;strong&gt;HTTPレスポンスヘッダーをカスタマイズする機能がありません&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.htaccess&lt;&#x2F;code&gt; は使えない（Apache設定ファイル）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;nginx.conf&lt;&#x2F;code&gt; も使えない（Nginx設定ファイル）&lt;&#x2F;li&gt;
&lt;li&gt;GitHub側で固定されたヘッダーが返される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;どうしてもセキュリティヘッダーを設定したい場合は、Cloudflare CDNを前段に置けばTransform Rulesでヘッダーを追加できます。
ただし、Cloudflareの無料プランはネームサーバー移管が必須です。&lt;&#x2F;p&gt;
&lt;p&gt;既存のDNSサービスを使い続けたい場合、
この方法は採用しづらいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;静的サイトと動的サイトでリスクが違う&quot;&gt;静的サイトと動的サイトでリスクが違う&lt;&#x2F;h2&gt;
&lt;p&gt;セキュリティヘッダーの重要度は、サイトの種類によって大きく異なります。
GitHub Pagesでも動的なSPAをホストできますが、
ここではZolaやHugoなどのSSGで生成した純粋な静的サイトを想定しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;観点&lt;&#x2F;th&gt;&lt;th&gt;静的サイト（SSG生成）&lt;&#x2F;th&gt;&lt;th&gt;動的サイト（WordPress等）&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ユーザー入力&lt;&#x2F;td&gt;&lt;td&gt;受け付けない&lt;&#x2F;td&gt;&lt;td&gt;フォーム等で受け付ける&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;サーバーサイド処理&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;PHP + DB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;管理画面&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&#x2F;wp-admin&lt;&#x2F;code&gt; 等が存在&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;XSSリスク&lt;&#x2F;td&gt;&lt;td&gt;ほぼなし&lt;&#x2F;td&gt;&lt;td&gt;高い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;クリックジャッキング&lt;&#x2F;td&gt;&lt;td&gt;影響軽微&lt;&#x2F;td&gt;&lt;td&gt;管理画面が標的になる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;WordPressでセキュリティヘッダーが未設定の場合、
管理者がログイン中にクリックジャッキング攻撃を受けたり、
XSS経由でマルウェアを注入されたりするリスクがあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;判断基準：いつ対応すべきか&quot;&gt;判断基準：いつ対応すべきか&lt;&#x2F;h2&gt;
&lt;p&gt;以下のフローチャートで判断できます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart LR
A[フォームがある？] --&gt;|Yes| B[対応すべき]
A --&gt;|No| C[サイトの性質は？]
C --&gt;|個人ブログ| D[放置OK]
C --&gt;|企業サイト| E[できれば対応]
C --&gt;|公的機関| F[対応すべき]
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;フォームがあるサイトは対応が必要です。
問い合わせフォーム、会員登録、ログイン機能、寄付やEC機能があれば、
ユーザー入力を受け付けるためXSSのリスクがあります。&lt;&#x2F;p&gt;
&lt;p&gt;フォームがない場合はサイトの性質で判断します。
個人の技術ブログやポートフォリオなら放置で問題ありません。
公的機関などのサイトは、信頼性の観点から対応が望ましいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;セキュリティスキャナーの警告を見ると焦りますが、
すべての警告に対応する必要はありません。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;重要なのはリスク評価です。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;何を守る必要があるか（資産）&lt;&#x2F;li&gt;
&lt;li&gt;どんな攻撃が想定されるか（脅威）&lt;&#x2F;li&gt;
&lt;li&gt;攻撃が成功する可能性はあるか（脆弱性）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;GitHub Pagesで静的ブログを公開している場合、
セキュリティヘッダーがなくても攻撃面がほとんどありません。
「設定できないから放置」は、この場合は合理的な判断です。&lt;&#x2F;p&gt;
&lt;p&gt;一方、WordPressや動的サイトでは事情が異なります。
&lt;code&gt;.htaccess&lt;&#x2F;code&gt; やプラグインで設定できるので、対応しておくべきです。&lt;&#x2F;p&gt;
&lt;p&gt;スキャナーの警告は「ベストプラクティスに従っていない」という指摘であり、
「今すぐ危険」という意味ではありません。
コンテキストに応じた判断をしましょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考文献&quot;&gt;参考文献&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;owasp.org&#x2F;www-project-secure-headers&#x2F;&quot;&gt;OWASP Secure Headers Project&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;orgs&#x2F;community&#x2F;discussions&#x2F;54257&quot;&gt;GitHub Community Discussion - HTTP Headers on Pages&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;免責事項&lt;&#x2F;strong&gt;
        &lt;p&gt;本記事は情報提供を目的としており、
個別の状況に応じた判断は読者ご自身の責任でお願いします。
セキュリティ要件は組織やサービスによって異なるため、
必要に応じて専門家にご相談ください。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">このブログはZola+GitHub Pagesで実現していますが、
GitHub Pagesはセキュリティヘッダの設定ができません。
いないとは思いますが、セキュリティスキャナーなどで未設定を見つけて文句をつけてくるセキュリティ厨がいないとも限りません。
対応すべきか放置すべきかの判断基準を解説しておきます。
</summary>
        </entry><entry xml:lang="en">
        <title>HHKBはなぜアーキテクチャを変えたのか ― 「高品位」設計の考察</title>
        <published>2026-02-05T00:00:00+00:00</published>
        <updated>2026-02-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/hhkb-why-changed-architecture/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/hhkb-why-changed-architecture/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;hhkb-why-changed-architecture&quot;&gt;Zenn&lt;&#x2F;a&gt;
からの転載です。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;初代HHKB（1996年）はシリンドリカルカーブド、
Professional（2003年）はシリンドリカルステップという
異なるキートップ構造を持つ。
形状設計としてはカーブドが上位であり、
一見するとProfessionalは劣化に見える&lt;&#x2F;li&gt;
&lt;li&gt;しかし開発者・八幡氏の証言によれば、
静電容量スイッチの技術的制約（距離精度が重要）により
カーブド構造は採用できなかった&lt;&#x2F;li&gt;
&lt;li&gt;HHKBはキートップ形状ではなくスイッチ品質に
全振りするため、ステップ構造を選択した。
これは妥協ではなくリソース配分の最適化である&lt;&#x2F;li&gt;
&lt;li&gt;「高品位」の意味は文脈依存である。
形状の贅沢さを指す場合と、
スイッチによる打鍵品質を指す場合がある&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;1._2つのキートップアーキテクチャ&quot;&gt;1. 2つのキートップアーキテクチャ&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;シリンドリカルカーブド（Cylindrical Curved）&lt;&#x2F;strong&gt;
は初代HHKB（1996年発売）に採用された構造です。
各列のキートップが連続的な曲面を描き、
キーボードを横から見るとなめらかな弧を描きます。
列ごとに異なる角度のキーキャップ金型が必要で、
金型数が多く製造時の調整もシビアなため、
製造コスト・設計難易度は高くなります。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;シリンドリカルステップ（Cylindrical Step）&lt;&#x2F;strong&gt;
はHHKB Professional（2003年発売）以降に
採用された構造で、
現在のほとんどのメカニカルキーボードはこの方式です。
各列は段差（ステップ）状に配置され、
角度は離散的で列間に明確な段があります。
金型の共用がしやすく量産性に優れ、
コスト効率の良さが特徴です。&lt;&#x2F;p&gt;
&lt;p&gt;純粋にキートップ形状の設計贅沢度だけで評価すると、
シリンドリカルカーブド ＞ シリンドリカルステップです。
これは工学的事実です。
カーブド構造は、指の動きに対して
より自然な曲面を提供するために、
より多くの製造コストと設計労力を投入しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._初代HHKBからProfessionalへの移行&quot;&gt;2. 初代HHKBからProfessionalへの移行&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;初代HHKB（1996年）&lt;&#x2F;th&gt;&lt;th&gt;HHKB Professional（2003年）&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;キートップ構造&lt;&#x2F;td&gt;&lt;td&gt;シリンドリカルカーブド&lt;&#x2F;td&gt;&lt;td&gt;シリンドリカルステップ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;スイッチ方式&lt;&#x2F;td&gt;&lt;td&gt;メンブレン&lt;&#x2F;td&gt;&lt;td&gt;静電容量無接点&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;押下圧&lt;&#x2F;td&gt;&lt;td&gt;約50g&lt;&#x2F;td&gt;&lt;td&gt;約45g&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;製造コスト配分&lt;&#x2F;td&gt;&lt;td&gt;形状設計に重点&lt;&#x2F;td&gt;&lt;td&gt;スイッチ機構に重点&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;PFUはProfessionalへの移行で
「指の疲労に最も効くのは、
キートップの曲面ではなく、
スイッチ特性と荷重カーブである」
という結論に達したと想像します。
この判断に基づき、
カーブド構造からステップ構造に簡略化し、
浮いたコストと設計余力を
静電容量無接点スイッチに全振りしました。
これは「妥協」ではなく、
リソース配分の最適化であると考えます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;life&#x2F;hhkb_life113.html&quot;&gt;HHKB裏HISTORY 第一章 後編&lt;&#x2F;a&gt;
において、開発者の八幡氏は
移行の理由を明確に語っています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;「これ、静電容量のキーだと出来ないので、
そこからはステップになったんです」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;この証言は、
カーブドからステップへの移行が
単なるコスト削減ではなく、
静電容量スイッチの技術的制約に起因することを
示しています。&lt;&#x2F;p&gt;
&lt;p&gt;静電容量スイッチの信号強度は
距離の逆数（スプリングとPCB間の距離）に
比例します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;静電容量センシングの原理：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;┌─────────────┐&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   キーキャップ   │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└──────┬──────┘&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ╱╲  │  ╱╲   ← ラバードーム&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ╱  ╲ │ ╱  ╲&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ╱│╲│╱│╲   ← コニカルスプリング&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ╱ │ │ │ ╲&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;────┴─┴─┴────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    PCBパッド   ← 距離が重要（信号 ∝ 1&#x2F;距離）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;距離の変動&lt;&#x2F;th&gt;&lt;th&gt;信号への影響&lt;&#x2F;th&gt;&lt;th&gt;実用上の問題&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;±0.1mm&lt;&#x2F;td&gt;&lt;td&gt;有意&lt;&#x2F;td&gt;&lt;td&gt;打鍵点のばらつき&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;±0.2mm&lt;&#x2F;td&gt;&lt;td&gt;大きい&lt;&#x2F;td&gt;&lt;td&gt;キーフィールの不均一&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;±0.5mm&lt;&#x2F;td&gt;&lt;td&gt;致命的&lt;&#x2F;td&gt;&lt;td&gt;入力が認識されない可能性&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;カーブド筐体では各キー位置で距離が異なるため、
均一なキーフィールの実現が困難です。
ステップ構造では各列で距離を一定に保てるため、
全キーで安定したセンシングが可能になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._画像解析による形状差の検証&quot;&gt;3. 画像解析による形状差の検証&lt;&#x2F;h2&gt;
&lt;p&gt;初代HHKBとProfessional Classic Type-Sの
側面写真を用いて、
Python + OpenCVによるエッジ検出・相関分析と、
Fiji (ImageJ) による角度分析の2手法で
形状差を定量的に検証しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
&lt;summary&gt;解析スクリプト：プロファイル比較（Python）&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; numpy&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; matplotlib&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pyplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; plt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; extract_top_profile&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;キーボード上端のプロファイルを抽出&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    edges&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Canny&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 150&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    profile_points&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        column&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; edges&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        edge_positions&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;column&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;edge_positions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            profile_points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;((&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; edge_positions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;profile_points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; calculate_profile_difference&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;profile1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; profile2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;2つのプロファイル間の統計的差異を算出&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    common_x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;linspace&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 500&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    y1_interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;        common_x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    y2_interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;        common_x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;mean_difference&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;            np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;abs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;y1_interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; y2_interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;correlation&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;corrcoef&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;            y1_interp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; y2_interp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        )[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;解析スクリプト：角度分析（Python）&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; analyze_profile_angles&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;    gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; window_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;50&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;プロファイルに沿った局所的な傾斜角度を計算&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    edges&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Canny&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 150&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; gray_img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # 上端プロファイルを検出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        col&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; edges&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        edge_pos&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;col&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;            edge_pos&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;edge_pos&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            else&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;nan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # スライディングウィンドウで局所角度を計算&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    angles&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    step&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; window_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;step&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; step&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; step&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        y1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt; step&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        y2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; profile_y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt; step&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        angles&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;            np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;degrees&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;                np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;arctan2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;y2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; y1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; window_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; angles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;解析スクリプト：Fiji&#x2F;ImageJマクロ&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; プロファイル抽出と角度分析&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;open&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;HHKB-First.png&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;8-bit&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Gaussian Blur...&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;sigma=2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Find Edges&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getWidth&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getHeight&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;profile&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; newArray&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(width)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 各列の上端エッジを検出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getPixel&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; y)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt;      profile[x]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; 局所角度とSmoothness Indexを計算&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;smoothSum&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;prevAngle&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  dy&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; profile[x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; profile[x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  angle&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;atan2&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(dy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; PI&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    smoothSum&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; abs&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(angle&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; prevAngle)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  prevAngle&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; angle&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;smoothnessIndex&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; smoothSum&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 61&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;hhkb-why-changed-architecture&amp;#x2F;profile_comparison.webp?h=2ac99177e0a0e81ea976&quot;
  alt=&quot;プロファイル比較解析&quot; width=&quot;2084&quot; height=&quot;1348&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;em&gt;上段: 両モデルの側面写真とエッジ検出によるプロファイルライン。下段左: プロファイルのオーバーレイ比較（赤=初代カーブド、青=Professionalステップ）。下段右: 高さの差分と相関係数。&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;初代HHKBのプロファイル（赤線）は
滑らかな曲線を描くのに対し、
Professional（青線）は階段状の段差が明確です。
相関係数0.9215は
「似ているが有意に異なる」ことを示しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;解析手法&lt;&#x2F;th&gt;&lt;th&gt;初代（Curved）&lt;&#x2F;th&gt;&lt;th&gt;Professional（Step）&lt;&#x2F;th&gt;&lt;th&gt;差分&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;プロファイル相関係数&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;td&gt;0.9215&lt;&#x2F;td&gt;&lt;td&gt;有意差あり&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Smoothness Index（Python）&lt;&#x2F;td&gt;&lt;td&gt;29.9&lt;&#x2F;td&gt;&lt;td&gt;35.2&lt;&#x2F;td&gt;&lt;td&gt;17.7%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Smoothness Index（Fiji）&lt;&#x2F;td&gt;&lt;td&gt;2.64&lt;&#x2F;td&gt;&lt;td&gt;3.34&lt;&#x2F;td&gt;&lt;td&gt;26.3%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Smoothness Index
（隣接位置間の角度変化の標準偏差）は
値が小さいほど滑らかな曲面を示します。
初代の値が低く滑らかな遷移、
Professionalは値が高く急な角度変化という結果は、
八幡氏の証言を数値的に裏付けています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4._「高品位」とは何か_―_3つの評価軸&quot;&gt;4. 「高品位」とは何か ― 3つの評価軸&lt;&#x2F;h2&gt;
&lt;p&gt;「高品位キーボード」を語る際、
以下の3つの評価軸を区別しないと
議論が噛み合いません。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;キー配列・キートップ形状の工学的完成度&lt;&#x2F;strong&gt; ---
曲面の連続性、人間工学的配慮、金型設計の精緻さ。
この軸ではカーブドが上位である&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;製造コスト・金型コスト&lt;&#x2F;strong&gt; ---
量産性、コスト効率。
この軸ではステップが合理的である&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;キーボード全体としての使用感（スイッチ含む）&lt;&#x2F;strong&gt; ---
長時間使用時の疲労度、
打鍵フィードバックの質。
この軸ではスイッチ方式が支配的要因である&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;PFU公式が言う「高品位キー」は
評価軸3を指していると考えられます。
キートップ形状単体の話ではなく、
静電容量無接点スイッチによる
総合的な打鍵品質を意味します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5._キーボード史における思想的位置づけ&quot;&gt;5. キーボード史における思想的位置づけ&lt;&#x2F;h2&gt;
&lt;p&gt;HHKBの設計思想を理解するには、
IBM Model MとTopre Realforceとの比較が有効です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;IBM Model M（1985年）&lt;&#x2F;strong&gt;
はBuckling Spring（座屈バネ）スイッチを採用し、
「入力の確実性」を設計思想としています。
「人は間違える」という人間観から、
誤入力を物理的フィードバックで防ぐ
アプローチを取っています。
壊れない、狂わない、一生使える
「事務機械」として設計されました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Topre Realforce（2000年代初頭）&lt;&#x2F;strong&gt;
は静電容量無接点方式を採用し、
「疲労の最小化」を設計思想としています。
「人は壊れる」という人間観から
腱を守ることを重視し、
「打鍵品質はスイッチで作る」という
思想を体現しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;HHKB Professional（2003年）&lt;&#x2F;strong&gt;
は静電容量無接点方式（Realforce系）を採用し、
「思考の流れを妨げない」を
設計思想としています。
「人は考える」という人間観から
入力デバイスの存在を消すことを目指し、
UNIX哲学に基づく配列とコンパクトさを
追求しました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;キーボード&lt;&#x2F;th&gt;&lt;th&gt;主眼&lt;&#x2F;th&gt;&lt;th&gt;人間観&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;IBM Model M&lt;&#x2F;td&gt;&lt;td&gt;入力の確実性&lt;&#x2F;td&gt;&lt;td&gt;人は間違える&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Topre Realforce&lt;&#x2F;td&gt;&lt;td&gt;疲労軽減&lt;&#x2F;td&gt;&lt;td&gt;人は壊れる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HHKB Professional&lt;&#x2F;td&gt;&lt;td&gt;思考の流れ&lt;&#x2F;td&gt;&lt;td&gt;人は考える&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;重要な点として、
HHKBはModel MとRealforceの
「中間」や「折衷」ではありません。
配列思想はUNIX哲学（独自路線）、
スイッチはRealforce系を採用、
筐体・形状はModel M的な剛性・重量を
意図的に捨てた合理主義です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;6._結論&quot;&gt;6. 結論&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;形状設計としてはカーブドの方が上だが、
HHKBはスイッチに全振りするため
ステップ構造を選んだ&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;キートップ形状・製造贅沢度の観点では
シリンドリカルカーブド ＞ シリンドリカルステップ
ですが、HHKBとしての総合的な「高品位」の観点では
Professional（ステップ＋静電容量）＞
初代HHKB（カーブド＋メンブレン）です。
「高品位」の定義は文脈依存で、
形状設計の贅沢さを指す場合もあれば、
長時間使用時の総合的な打鍵品質を
指す場合もあります。&lt;&#x2F;p&gt;
&lt;p&gt;HHKBの変遷は、
「すべてを最高にする」のではなく
「何に全振りするか」を選択した好例です。
初代は形状設計に注力し
（当時の技術的制約もあった）、
Professionalはスイッチ品質に注力しました
（形状は合理化）。
この判断の背景には、
「指の疲労はキートップ曲面より
スイッチ特性で決まる」という知見と、
静電容量スイッチの技術的制約という
2つの要因があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考：現在入手可能な関連キーボード&quot;&gt;参考：現在入手可能な関連キーボード&lt;&#x2F;h2&gt;
&lt;p&gt;初代HHKBのようなシリンドリカルカーブド構造を
持つ完成品キーボードは、
現行品ではほぼ存在しません。
カーブド的な体験に近づける選択肢としては、
SAプロファイルキーキャップ
（背が高く深くスカルプチャされている）、
MT3プロファイルキーキャップ
（1970〜80年代のIBMターミナルに
インスパイアされた設計）、
Drop CTRL &#x2F; ALT
（MT3キーキャップとの組み合わせで販売）
などがあります。
ただし、これらはキーキャッププロファイルによる
近似であり、
初代HHKBの「プレート自体がカーブしている」
構造とは異なります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;付録：事実検証と情報ソース&quot;&gt;付録：事実検証と情報ソース&lt;&#x2F;h2&gt;
&lt;p&gt;本文書の事実関係は
2026年1月21日にWeb検索により検証済みです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;details&gt;
&lt;summary&gt;検証済み項目一覧&lt;&#x2F;summary&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;記述内容&lt;&#x2F;th&gt;&lt;th&gt;検証結果&lt;&#x2F;th&gt;&lt;th&gt;情報ソース&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;初代HHKB発売年&lt;&#x2F;td&gt;&lt;td&gt;1996年&lt;&#x2F;td&gt;&lt;td&gt;正確（1996年12月20日）&lt;&#x2F;td&gt;&lt;td&gt;PFU公式、Wikipedia&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;初代HHKBスイッチ&lt;&#x2F;td&gt;&lt;td&gt;メンブレン&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;hhkb_kb02&#x2F;&quot;&gt;PFU 初代HHKB仕様&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;初代HHKB押下圧&lt;&#x2F;td&gt;&lt;td&gt;約50g&lt;&#x2F;td&gt;&lt;td&gt;正確（50g）&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;hhkb_kb02&#x2F;&quot;&gt;PFU 初代HHKB仕様&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;初代HHKBキートップ&lt;&#x2F;td&gt;&lt;td&gt;シリンドリカルカーブド&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;keyspec.html&quot;&gt;PFU 高品位キー仕様&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HHKB Professional発売年&lt;&#x2F;td&gt;&lt;td&gt;2003年&lt;&#x2F;td&gt;&lt;td&gt;正確（2003年5月）&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;history&#x2F;page4.html&quot;&gt;PFU HHKB History&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Professionalスイッチ&lt;&#x2F;td&gt;&lt;td&gt;静電容量無接点&lt;&#x2F;td&gt;&lt;td&gt;正確（Topre方式）&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;history&#x2F;page4.html&quot;&gt;PFU HHKB History&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Professional押下圧&lt;&#x2F;td&gt;&lt;td&gt;約45g&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;history&#x2F;page4.html&quot;&gt;PFU HHKB History&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Professionalキートップ&lt;&#x2F;td&gt;&lt;td&gt;シリンドリカルステップ&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;keyspec.html&quot;&gt;PFU 高品位キー仕様&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;IBM Model M発売年&lt;&#x2F;td&gt;&lt;td&gt;1985年&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Model_M_keyboard&quot;&gt;Wikipedia Model M&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Model Mスイッチ&lt;&#x2F;td&gt;&lt;td&gt;Buckling Spring&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Model_M_keyboard&quot;&gt;Wikipedia Model M&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Topre Realforce&lt;&#x2F;td&gt;&lt;td&gt;2000年代初頭&lt;&#x2F;td&gt;&lt;td&gt;正確（2001年）&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.topre.co.jp&#x2F;products&#x2F;elec&#x2F;keyboards.html&quot;&gt;東プレ公式&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MT3プロファイル&lt;&#x2F;td&gt;&lt;td&gt;1970〜80年代IBMターミナルにインスパイア&lt;&#x2F;td&gt;&lt;td&gt;正確&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;matt3o.com&#x2F;mt3-keycap-profile-a-brief-history&#x2F;&quot;&gt;matt3o MT3 History&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;著者の分析・解釈として記載されている部分&lt;&#x2F;summary&gt;
&lt;p&gt;以下は本文中で「想像する」「考える」と明示されており、
公式見解ではなく著者の分析です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;PFUが「指の疲労はキートップ曲面より
スイッチ特性で決まる」と判断したという推測&lt;&#x2F;li&gt;
&lt;li&gt;カーブドからステップへの移行が
「リソース配分の最適化」であるという解釈&lt;&#x2F;li&gt;
&lt;li&gt;3つの評価軸の定義と、
PFU公式の「高品位」が評価軸3を指すという解釈&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;主要参考文献&lt;&#x2F;summary&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;&quot;&gt;PFU HHKB公式サイト&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;hhkb_kb02&#x2F;&quot;&gt;PFU 初代HHKB仕様&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;products&#x2F;discontinued&#x2F;keyspec.html&quot;&gt;PFU 高品位キー仕様&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;history&#x2F;page4.html&quot;&gt;PFU HHKB History&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Model_M_keyboard&quot;&gt;Model M - Wikipedia&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.topre.co.jp&#x2F;products&#x2F;elec&#x2F;keyboards.html&quot;&gt;東プレ キーボード&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
&lt;summary&gt;HHKB裏HISTORY（開発者座談会）&lt;&#x2F;summary&gt;
&lt;p&gt;本文書の解釈を補強する一次情報として重要です。
記事113で八幡氏は技術的制約による移行を明言し、
記事129ではType-S開発で
スイッチ特性改善への継続投資が語られ、
記事112では「viやemacsを使うには
文字だけ打てればよかった」という
UNIX文化に根ざした設計思想の原点が
語られています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;life&#x2F;hhkb_life112.html&quot;&gt;第一章 前編&lt;&#x2F;a&gt; - 開発背景、UNIX文化との関係&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;life&#x2F;hhkb_life113.html&quot;&gt;第一章 後編&lt;&#x2F;a&gt; - Professionalへの移行経緯、東プレとの協業&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;life&#x2F;hhkb_life127.html&quot;&gt;第二章 前編&lt;&#x2F;a&gt; - 事業部移管、ブランド確立&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;happyhackingkb.com&#x2F;jp&#x2F;life&#x2F;hhkb_life129.html&quot;&gt;第二章 後編&lt;&#x2F;a&gt; - Type-Sにおけるスイッチ特性への継続投資&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">初代HHKBのシリンドリカルカーブドからProfessionalの
シリンドリカルステップへの移行は、
静電容量スイッチの技術的制約に起因する
リソース配分の最適化でした。
開発者の証言と画像解析から、その設計判断を考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>なぜ塩漬けシステムからの脱却は「無理ゲー」になるのか</title>
        <published>2026-02-05T00:00:00+00:00</published>
        <updated>2026-02-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/why-stagnant-system-migration-fails/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/why-stagnant-system-migration-fails/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;この記事は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;why-stagnant-system-migration-fails&quot;&gt;Zenn.dev&lt;&#x2F;a&gt;
に掲載した記事の転載です。
本記事は特定の組織や個人を指すものではありません。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;TL;DR&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;p&gt;中小企業や自治体などIT部門が弱い組織では、10年、20年と塩漬けになった
システムからの脱却が「無理ゲー」に陥りやすい傾向があります。
ブラックボックス化・ベンダーロックイン・組織能力不足という問題が
互いに絡み合い、負のスパイラルを形成するからです。&lt;&#x2F;p&gt;
&lt;p&gt;根本原因は技術ではなく、組織的なITガバナンスの喪失にあります。
この状況からの脱出には膨大な投資と経営層の強いコミットメントが必要ですが、
そもそもこの状況に陥らないための予防が最善策です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;IT部門を持たず塩漬けになったシステムで悩む組織では、
保守の手間がかからないSaaSへの移行を検討することが多いでしょう。
しかし、SaaSであれ新規開発であれ、長年運用してきた塩漬けシステムからの刷新は、
想像以上に困難を極めます。&lt;&#x2F;p&gt;
&lt;p&gt;ITプロジェクトの失敗率は決して低くありません。
Standish GroupのCHAOS Report 2020によれば、
ITプロジェクトの約70%が当初の目標を達成できないとされています。
特に、知見をもった要員が途絶えドキュメンテーションも十分でない
システムからの移行は、その中でも最も困難なカテゴリに属します。&lt;&#x2F;p&gt;
&lt;p&gt;本記事では、筆者が見聞した複数の事例をもとに、
システム刷新が「無理ゲー」と化す構造的な問題を解説します。
これは特殊な例ではなく、多くの組織が陥りがちな普遍的なパターンです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前提：この記事が想定する組織像&quot;&gt;前提：この記事が想定する組織像&lt;&#x2F;h2&gt;
&lt;p&gt;本記事で分析する「システム刷新が困難な組織」には、以下のような特徴があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CIOが不在で、組織的なIT統制がない&lt;&#x2F;li&gt;
&lt;li&gt;専任のIT部門が存在しない、または機能していない&lt;&#x2F;li&gt;
&lt;li&gt;システム開発・保守を長年同じベンダーに依存してきた&lt;&#x2F;li&gt;
&lt;li&gt;仕様書・設計書が最新化されておらず、組織内で管理できていない&lt;&#x2F;li&gt;
&lt;li&gt;ソースコードの所在や最新版の把握ができていない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;このような状態は、中小企業や地方自治体、非IT企業の事業部門などで珍しくありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._システムの完全なブラックボックス化&quot;&gt;1. システムの完全なブラックボックス化&lt;&#x2F;h2&gt;
&lt;p&gt;長年の運用の中で、システムは以下のような状態に陥っています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;仕様書・設計書が存在しない、または最新でない&lt;&#x2F;li&gt;
&lt;li&gt;現在のシステムが何をしているのか誰も把握していない&lt;&#x2F;li&gt;
&lt;li&gt;信頼できるのはソースコードのみだが、組織では管理していない&lt;&#x2F;li&gt;
&lt;li&gt;ソースコードの可読性が低く、設計意図の理解が困難&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;さらに深刻なのは、文書化されていない知識の存在です。
暗黙知化した業務ルールが大量のコード内へ埋め込まれており、
誰も覚えていない例外処理が実は重要な機能だったりします。
文書化されていない仕様変更の積み重ねが、現在の動作を形成しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._ベンダーロックインの完成形&quot;&gt;2. ベンダーロックインの完成形&lt;&#x2F;h2&gt;
&lt;p&gt;このような状況では、ベンダーとの力関係が完全に逆転します。
ベンダーだけがシステムの知識を持っており、組織側には検証手段がなく、
ベンダーの言い値を受け入れるしかありません。
ベンダー自身も変更時の検証で対応しているだけで、完全な仕様把握は疑問です。
これは典型的なベンダーロックインの完成形です。&lt;&#x2F;p&gt;
&lt;p&gt;現行ベンダーに移行支援を依頼することも、構造的に困難です。
唯一システムのナレッジを持っている彼らは、
現行システムの保守で継続的な収益を得ています。
システム刷新が現行ベンダー以外へのSaaS移行などの場合、
積極的に協力するインセンティブがなく、
むしろ移行は現状のビジネス機会の損失を意味します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._システム刷新に必要な組織能力&quot;&gt;3. システム刷新に必要な組織能力&lt;&#x2F;h2&gt;
&lt;p&gt;システム刷新を成功させるには、現行システムの分析と要件定義、
業務プロセスの文書化が必要です。
また多くの場合そのような組織ではSaaS製品を検討するでしょう。
SaaSを選択したとしても、SaaS製品の選定とギャップ分析、
業務プロセス改革の設計と実行、データ移行、段階的な移行と検証、
運用体制の確立といったステップが必要です。&lt;&#x2F;p&gt;
&lt;p&gt;これらを遂行するには、以下の能力が不可欠です。
名のある大企業でも全て満たしていることは稀です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;現行システムの仕様を理解し文書化する能力&lt;&#x2F;li&gt;
&lt;li&gt;業務要件を定義し、システム要件に落とし込む能力&lt;&#x2F;li&gt;
&lt;li&gt;プロジェクト全体を管理する能力&lt;&#x2F;li&gt;
&lt;li&gt;SaaSやERPを移行先とする場合は、
その製品が前提とする業務プロセスを理解するナレッジ&lt;&#x2F;li&gt;
&lt;li&gt;業務改革やプロセスリエンジニアリングを推進する能力&lt;&#x2F;li&gt;
&lt;li&gt;経営層の高いコミットメントとリーダーシップ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;4._3つの致命的なギャップ&quot;&gt;4. 3つの致命的なギャップ&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;移行の「正解」が誰にも分からない&lt;&#x2F;strong&gt; —
仕様書が古いため、現在のシステムがどう動いているか不明である。
つまり「移行後に何が実現されていればOKなのか」という基準が存在しない。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;投資を正当化できない&lt;&#x2F;strong&gt; —
移行には膨大な投資が必要だが、
現状維持のためだけでは経営層の投資判断を得られない。
明確なビジネス成果や価値を経営層がコミットできなければ、
必要な予算確保は不可能である。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;組織風土の問題&lt;&#x2F;strong&gt; —
能力不足だけでなく、組織文化にも課題がある。
経営層が成果をコミットするリーダーシップがなく、
トップダウンでの業務改革の経験もない。
大きな変革を受け入れる風土が醸成されておらず、
現場の抵抗を乗り越えて改革を推進する仕組みもない。
データや機能を諦めるような大胆な意思決定ができない。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;5._負のスパイラル&quot;&gt;5. 負のスパイラル&lt;&#x2F;h2&gt;
&lt;p&gt;塩漬け状態から脱却しようとSaaS移行を決意しても、
これらの問題が互いに絡み合い、負のスパイラルを形成します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart TD
A[仕様が不明] --&gt; B[要件を洗い出せない]
B --&gt; C[ベンダーは利益相反]
C --&gt; D[SaaS要件を定義できない]
D --&gt; E[SaaSを選定できない]
E --&gt; F[業務プロセス知識がない]
F --&gt; G[改革の経験・風土がない]
G --&gt; H[意思決定ができない]
H --&gt; I[移行失敗]
I -.-&gt; A
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;では新規ベンダーに依頼すればよいのでしょうか。残念ながら、それも困難です。
現行システムの仕様不明により要件定義ができず、
リバースエンジニアリングには膨大なコストがかかります。
組織側に要件定義能力がなくプロジェクトは進まず、
責任範囲も不明確でリスクを引き受けられません。
優れたSIerやコンサル会社ほど、このような案件を忌避します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;6._無理に進めた場合の予想シナリオ&quot;&gt;6. 無理に進めた場合の予想シナリオ&lt;&#x2F;h2&gt;
&lt;p&gt;仮に予算化されて、無理やりSaaS移行プロジェクトが開始されたとします。
典型的な失敗パターンは以下の通りです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;フェーズ&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;時期&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;起こること&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;経営層の認識&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;現状分析&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1〜3ヶ月目&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;コンサルに高額費用を払うが、仕様書が古く現場も「なんとなく使っている」状態。表面的なヒアリングで不完全な要件定義書が作成され、重要な例外処理や暗黙のルールは抜け落ちる&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;「順調に進んでいる」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SaaS選定&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;4〜8ヶ月目&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;不完全な要件定義書をもとにSaaS製品を選定。「カスタマイズすれば何とかなる」と判断するが、SaaSのカスタマイズには限界がある。データ移行計画も曖昧。予算は当初の2倍に膨張&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;「想定内の追加投資」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;移行実施&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;9〜12ヶ月目&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;全面移行を強行し現場は大混乱。「以前できたこと」ができない、例外処理の欠落が判明、過去データが参照できず業務停止。現場から「前のシステムに戻せ」の声&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;「現場の抵抗」と認識&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;破綻&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;12ヶ月目〜&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;現行システムは停止済みで戻せない。手作業やExcelで応急対応。ベンダーは「要件定義が不十分だった」と責任回避。業務効率は移行前より悪化。責任者が退職&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;責任問題に発展&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;7._唯一の対応策&quot;&gt;7. 唯一の対応策&lt;&#x2F;h2&gt;
&lt;p&gt;本気で脱出するなら、以下の対策が必要です。
これは「超ハードモード」であることを認識してください。&lt;&#x2F;p&gt;
&lt;p&gt;まず、業務プロセスリエンジニアリング能力の確保が必要です。
SaaSの前提とする業務プロセスを理解し、現行業務を可視化した上で
SaaSに適応させる能力が必須であり、
経験豊富な外部コンサルの支援が必要になります（高額）。&lt;&#x2F;p&gt;
&lt;p&gt;次に、捨てる覚悟と意思決定です。
現行システムの機能やデータの一部を諦める大胆な意思決定が不可欠であり、
「今と同じことができる」を目指すと必ず失敗します。&lt;&#x2F;p&gt;
&lt;p&gt;そして、現場の抵抗を押し切るコミットメントが絶対条件です。
現場の抵抗をトップダウンで押し切る経営層の覚悟と、
相応の予算を得る交渉力も必須です。&lt;&#x2F;p&gt;
&lt;p&gt;なお、移行手法として「ストラングラーパターン」（Strangler Fig Pattern）
と呼ばれる段階的移行が有効です。
一気に全面移行せず、新機能をSaaSで構築しながら徐々に旧システムの機能を
絞めていく手法です。
リスクを分散でき、途中で軌道修正も可能ですが、
この手法を採用するには移行期間中の並行運用コストを
許容できることが前提条件となります。&lt;&#x2F;p&gt;
&lt;p&gt;これらの対策には膨大な投資が必要です。
この規模の投資を経営判断として通すには、業務効率化による大幅なコスト削減、
新規事業での大きな経済効果の実現、競争優位性の獲得といった、
明確で大きなビジネス成果を示す必要があります。
単なる「技術的負債の解消」では、この規模の投資は正当化できません。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition tip&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-tip&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;超ハードモードをクリアした事例：浜松倉庫株式会社&lt;&#x2F;strong&gt;
        &lt;p&gt;静岡県の中堅倉庫会社である&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hamamatsu-soko.co.jp&#x2F;&quot;&gt;浜松倉庫&lt;&#x2F;a&gt;は、
長年使い続けたスクラッチ開発の倉庫管理システム（WMS）を3年かけて刷新し、
経済産業省「DXセレクション2024」でグランプリを受賞しました。
社内にDX人材が1人もいない状態からの出発でした。
成功の鍵は以下の3点でした。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;経営層の全面的コミット&lt;&#x2F;strong&gt; —
社長が「10年後、20年後の会社の在り方を考えてほしい」と若手管理者に問題提起し、
従業員主体で徹底的に議論させた&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;段階的なアプローチ&lt;&#x2F;strong&gt; —
3年間を4段階に分け、ビジョン策定→課題掘り下げ→仕様書作成→導入運用と進めた&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;時間をかける覚悟&lt;&#x2F;strong&gt; —
「もし1年でやれと言われたら失敗していた」（取締役談）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;参考：&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;j-net21.smrj.go.jp&#x2F;special&#x2F;dx&#x2F;20240924.html&quot;&gt;J-Net21 浜松倉庫事例&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;8._自己診断チェックリスト&quot;&gt;8. 自己診断チェックリスト&lt;&#x2F;h2&gt;
&lt;p&gt;自組織がこの「無理ゲー」状態に陥っていないか、
以下のチェックリストで確認してください。
該当項目が多いほど、移行リスクが高い状態です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;システム管理の状態&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;現行システムの最新の仕様書・設計書が組織内に存在しない&lt;&#x2F;li&gt;
&lt;li&gt;ソースコードの所在や最新版を把握していない&lt;&#x2F;li&gt;
&lt;li&gt;システムの全機能を説明できる社内担当者がいない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;ベンダー関係&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;5年以上同じベンダーにシステム保守を依存している&lt;&#x2F;li&gt;
&lt;li&gt;ベンダーの見積もりを検証する手段がない&lt;&#x2F;li&gt;
&lt;li&gt;ベンダー変更を検討したことがない、または断念した&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;組織能力&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CIOまたはIT統括責任者が不在である&lt;&#x2F;li&gt;
&lt;li&gt;業務要件を自ら定義した経験がない&lt;&#x2F;li&gt;
&lt;li&gt;トップダウンでの業務改革を実施した経験がない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;3項目以上該当する場合は要注意です。
まずは小さな領域から仕様の可視化と文書化を始め、
段階的にIT統制能力を高めていくことを検討してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ：経営への教訓&quot;&gt;まとめ：経営への教訓&lt;&#x2F;h2&gt;
&lt;p&gt;この状況は技術的な問題というより、組織的なガバナンスの喪失が根本原因です。&lt;&#x2F;p&gt;
&lt;p&gt;現状維持を続けるなら、ベンダーロックインの継続と保守費用の高騰を
受け入れるしかありません。
脱出を目指すなら、膨大な投資と困難なプロジェクト遂行が必要です。
しかもその投資は、大きなビジネス成果とセットで
経営層がコミットした場合のみ正当化できます。&lt;&#x2F;p&gt;
&lt;p&gt;「システム刷新」は手段であり、目的ではありません。
安易なIT投資と組織的なIT統制能力の放棄が、
いかに高いツケとなって返ってくるかを示す典型例です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;まだ間に合う組織へ：今日から始められる予防策&quot;&gt;まだ間に合う組織へ：今日から始められる予防策&lt;&#x2F;h3&gt;
&lt;p&gt;このような状況を避けるため、以下の具体的なアクションを今日から始めてください。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;仕様書・設計書の管理体制を確立する&lt;&#x2F;strong&gt; —
ConfluenceやNotionなどのドキュメント管理ツールを導入し、
システム仕様を組織内で一元管理する仕組みを作る。
ベンダーが作成した文書も必ず組織内に保管する。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API仕様を可視化する&lt;&#x2F;strong&gt; —
SwaggerやOpenAPI形式でシステム間連携の仕様を文書化しておくと、
将来の移行時に大きな資産となる。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定期的な棚卸しを実施する&lt;&#x2F;strong&gt; —
年1回程度、システムの機能一覧と利用状況を棚卸しし、
不要な機能の廃止や仕様の最新化を行う。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;複数ベンダーとの関係を維持する&lt;&#x2F;strong&gt; —
現行ベンダー以外とも定期的に情報交換し、
技術動向の把握と比較検討の材料を確保する。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;社内にIT人材を育成する&lt;&#x2F;strong&gt; —
外部に完全依存せず、最低限の技術判断ができる人材を社内に確保する。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;すでにこの状況に陥っている組織へ&quot;&gt;すでにこの状況に陥っている組織へ&lt;&#x2F;h3&gt;
&lt;p&gt;絶望する必要はありません。ただし、短期間での劇的な改善は期待できません。
まずは経営層の理解を得ることから始め、
小さな領域から段階的に状況を改善していくアプローチが現実的です。
最初の一歩は、現状を正確に把握し、経営層と共有することです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">IT部門が弱い組織で塩漬けシステムが「無理ゲー」になる構造を解説します。
ブラックボックス化・ベンダーロックイン・組織能力不足が絡み合う
負のスパイラルと、その脱出策を具体的に示します。
</summary>
        </entry><entry xml:lang="en">
        <title>キートップ2つで44,000円！HHKB×輪島塗という贅沢</title>
        <published>2026-02-03T00:00:00+00:00</published>
        <updated>2026-02-03T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/02/hhkb-pro-classic-type-s-urushi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/02/hhkb-pro-classic-type-s-urushi/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;hhkb-pro-classic-type-s-urushi&amp;#x2F;0.webp?h=a5d4937ff7ddd8664271&quot;
  alt=&quot;HHKB Professional Classic Type-S&quot; width=&quot;1800&quot; height=&quot;893&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;なぜClassic_Type-Sなのか&quot;&gt;なぜClassic Type-Sなのか&lt;&#x2F;h2&gt;
&lt;p&gt;これまでKeychron Q60を愛用していました。
コンパクトな60%レイアウトとカスタマイズ性が気に入っていたのですが、
やはりタイプタッチが異なります。
HHKBの静電容量無接点方式のあの感触は、他では得られません。&lt;&#x2F;p&gt;
&lt;p&gt;HHKB Professional Hybridも持っていて気に入っているのですが、
Bluetooth接続だと電源のオンオフが煩わしいのです。
使おうと思ったときに電源を入れて、接続を待つ。
この一手間が地味にストレスでした。&lt;&#x2F;p&gt;
&lt;p&gt;ならば正解はこれ、&lt;strong&gt;HHKB Professional Classic Type-S&lt;&#x2F;strong&gt;です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;HHKB_Professional_Classic_Type-Sの魅力&quot;&gt;HHKB Professional Classic Type-Sの魅力&lt;&#x2F;h2&gt;
&lt;p&gt;Classic Type-Sの良さを挙げてみます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bluetoothなしで、USB-Cケーブルだけで繋がる&lt;&#x2F;strong&gt; —
ケーブルを挿せば即座に使える&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;電源のオンオフの煩わしさがない&lt;&#x2F;strong&gt; —
接続の待ち時間ゼロ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;持ち歩きでも電池分だけ軽い&lt;&#x2F;strong&gt; —
電池不要なのでHybridより軽量&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;電池ボックスがなく、形状も美しい&lt;&#x2F;strong&gt; —
底面がすっきりしたデザイン&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;キータッチがスコスコ&lt;&#x2F;strong&gt; —
Hybridより軽快な打鍵感&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;有線接続のシンプルさが、かえって快適さに繋がっています。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00rgzi5.9srin4d9.g00rgzi5.9sriod4c&#x2F;kaereba_main_202602031752285347?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fpfudirect%2Fpd-kb401ysc%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fpfudirect%2Fi%2F10001145%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;pfudirect&#x2F;cabinet&#x2F;images&#x2F;pd-kb401ysc.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00rgzi5.9srin4d9.g00rgzi5.9sriod4c&#x2F;kaereba_main_202602031752285347?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fpfudirect%2Fpd-kb401ysc%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fpfudirect%2Fi%2F10001145%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;HHKB Professional Classic Type-S　英語配列&#x2F;雪　有線接続　Type-C&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202602031752285347?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FHHKB%2520Professional%2520Classic%2520Type-s%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=HHKB%20Professional%20Classic%20Type-s&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;輪島塗Esc＆Controlキーセット&quot;&gt;輪島塗Esc＆Controlキーセット&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;hhkb-pro-classic-type-s-urushi&amp;#x2F;1.webp?h=152ddc1e8bea9b5064f5&quot;
  alt=&quot;HHKB Professional専用漆塗Esc＆Controlキーセットの箱&quot; width=&quot;1800&quot; height=&quot;1041&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;さて、ここからが本題です。&lt;&#x2F;p&gt;
&lt;p&gt;PFUから発売されている
「HHKB Professional専用漆塗Esc＆Controlキーセット」を購入しました。
お値段なんと&lt;strong&gt;44,000円&lt;&#x2F;strong&gt;。キートップ2つでこの価格です。&lt;&#x2F;p&gt;
&lt;p&gt;輪島塗に用いられる漆は、高級万年筆のボディにも採用されるなど、
抗菌性・吸湿性・耐久性に優れた素材です。
本製品では金粉を加えたこだわりの精製漆を用い、
熟練の職人の手によって何層にも塗り重ねることで、
深みのある色合いと上品な質感を実現しています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;hhkb-pro-classic-type-s-urushi&amp;#x2F;2.webp?h=0972258c89969caa3c2a&quot;
  alt=&quot;HHKB Professional専用漆塗Esc＆Controlキーセットの内容&quot; width=&quot;1800&quot; height=&quot;1168&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;箱を開けると「輪島市無形文化財　天日黒目漆使用　大撤」と書かれた証明書が
入っていました。本物の伝統工芸品であることを実感します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;02&amp;#x2F;hhkb-pro-classic-type-s-urushi&amp;#x2F;3.webp?h=8c431d1dcaf772d27288&quot;
  alt=&quot;HHKB Professional専用漆塗Esc＆Controlキーセットのセット例&quot; width=&quot;1800&quot; height=&quot;1377&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;HHKB「雪」（白）に黒漆のキーを載せると、このとおり。
白と黒のコントラストが神々しいほど美しいです。&lt;&#x2F;p&gt;
&lt;p&gt;毎日触れるキーボードだからこそ、本物の価値を手元に置く贅沢を楽しんで
います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">HHKB Professional Classic Type-Sに輪島塗の漆塗りキートップを
載せました。Keychron Q60やHHKB Hybridを経てたどり着いた、
有線キーボードの良さと伝統工芸の美しさを紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>Rain(Beatles Cover)</title>
        <published>2026-01-31T00:00:00+00:00</published>
        <updated>2026-01-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/rain-beatles-cover/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/rain-beatles-cover/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;Universal
Audioのセールで10本ほどプラグインを買ったので、せっかくだから
60年代の曲をやってみようと思い立ちました。
どうせならADT（Automatic Double
Tracking）が使われている曲がいいなと思い、
「Rain」を選びました。&lt;&#x2F;p&gt;
&lt;p&gt;The Beatlesの「Rain」は、1966年にシングル「Paperback
Writer」のB面として発表された楽曲で、ADTやテープの逆回転、
Varispeedなどの実験的な録音技術が使われています。
ADTが使われているなら、この機会にREEL
ADTプラグインも買ってみようと
なり、結局プラグインをさらに追加購入することになりました。&lt;&#x2F;p&gt;
&lt;p&gt;ギターはEpiphone CasinoとYAMAHA
Revstarを使ってレコーディングし、
Logic Proでミックスしています。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%3Atracks%3A2257478333%3Fsecret_token%3Ds-g7IuqQCunpg&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;rain&#x2F;s-g7IuqQCunpg&quot; title=&quot;Rain(Beatles Cover)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Rain(Beatles Cover)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;REEL_ADT：60年代の革新技術を再現&quot;&gt;REEL ADT：60年代の革新技術を再現&lt;&#x2F;h2&gt;
&lt;p&gt;この曲のために追加購入したREEL
ADTプラグイン（UADではなく、別のメーカーのもの）が、
ミックスで活躍しています。
ADT（Automatic Double Tracking）は、1966年にAbbey
RoadスタジオのエンジニアKen Townsendが開発した技術で、
ボーカルやギターに自然な厚みと揺らぎを加えることができます。&lt;&#x2F;p&gt;
&lt;p&gt;Beatlesがその筋の人たちにデビュー当初から注目されたは、ダブルトラックという
ボーカルを二度録りして音を厚くしヌケをよくするレコーディング技術でした。
しかし、ダブルトラッキングは同じパートを2回演奏して重ねる必要があり、
John Lennonあたりが面倒くさがってADTが開発されたと言われています。&lt;&#x2F;p&gt;
&lt;p&gt;ADTは2台のテープマシンを使い、わずかに遅延とピッチ変化を加えることで、
1テイクから疑似的にダブルトラックの効果を狙ったものです。
その結果、豊かなサウンドを作り出すことができ、
John Lennonは特に気に入り多くの楽曲で使用されています。&lt;&#x2F;p&gt;
&lt;p&gt;REEL
ADTプラグインは、このビンテージ機材の挙動を忠実に再現しており、
単なるディレイやコーラスとは異なる、有機的で温かみのある音像を作り出します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Capitol_Chambers：本物のAbbey_Roadリバーブ&quot;&gt;Capitol Chambers：本物のAbbey Roadリバーブ&lt;&#x2F;h2&gt;
&lt;p&gt;リバーブには、UADのCapitol
Chambersプラグインを使用しました。
これは、Abbey Roadスタジオにある実際のエコーチャンバー（残響室）
をサンプリングしたもので、人工的なデジタルリバーブとは一線を画す、
自然で温かみのある空間を作り出します。&lt;&#x2F;p&gt;
&lt;p&gt;エコーチャンバーとは、スピーカーとマイクを設置した専用の部屋で、
物理的な空間の残響を録音に加える仕組みです。
Abbey
Roadのチャンバーは、数多くの名盤で使われてきた伝説的な空間です。&lt;&#x2F;p&gt;
&lt;p&gt;今回は「Chamber 4
Vocal」プリセットをベースに、センド量を調整しています。
ボーカルとコーラスには多めのリバーブを送り、
ギターには控えめ（10〜15%）、ドラムはほぼドライにしました。
この配分により、楽器ごとに異なる奥行き感を演出し、
立体的なサウンドステージを構築しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Varispeed：テープ操作&quot;&gt;Varispeed：テープ操作&lt;&#x2F;h2&gt;
&lt;p&gt;Logic
ProのVarispeed機能を使って、テープマシンの再生速度を変える
テクニックを再現しました。&lt;&#x2F;p&gt;
&lt;p&gt;当時Beatlesはテープ操作の実験に夢中だったそうです。&lt;&#x2F;p&gt;
&lt;p&gt;最近は未公開だったTakeも公開されるようになり、当時の操作がだんだん判明しています。
おそらく次のような操作が行われています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;バックトラックを速い速度でキーをAかBbで演奏する&lt;&#x2F;li&gt;
&lt;li&gt;テープ速度を落としてキーFかF#あたりにして、ボーカルを録る&lt;&#x2F;li&gt;
&lt;li&gt;テープ速度を少し速めて、キーGより少し上に聞こえる程度の速さにしてマスタリングする&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この方法で、ギターやベースは気怠い感じなのに、ボーカルだけ明るく高音が強調された音になっています。&lt;&#x2F;p&gt;
&lt;p&gt;また、間奏部分では逆回転のドラムやシンバルが使われており、
こうした実験的なテープ操作が「Rain」のサイケデリックな雰囲気を
作り出しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;その他のUniversal_Audioプラグイン&quot;&gt;その他のUniversal Audioプラグイン&lt;&#x2F;h2&gt;
&lt;p&gt;REEL ADTとCapitol Chambers以外にも、以下のUADプラグインを使用しています。&lt;&#x2F;p&gt;
&lt;dl&gt;
&lt;dt&gt;Helios Type 69&lt;&#x2F;dt&gt;
&lt;dd&gt;60年代のコンソールEQで、ボーカル、ギター、ベースに温かみのあるトーンを付加。&lt;&#x2F;dd&gt;
&lt;dt&gt;1176 Rev A&lt;&#x2F;dt&gt;
&lt;dd&gt;クラシックなFETコンプレッサーで、ボーカルとギターに攻撃的なキャラクターを追加。&lt;&#x2F;dd&gt;
&lt;dt&gt;LA-2A&lt;&#x2F;dt&gt;
&lt;dd&gt;チューブコンプレッサーで、コーラスに滑らかな圧縮をかける。&lt;&#x2F;dd&gt;
&lt;dt&gt;Pultec EQP-1A&lt;&#x2F;dt&gt;
&lt;dd&gt;ビンテージパッシブEQで、低域と高域の美しい倍音を強調。&lt;&#x2F;dd&gt;
&lt;dt&gt;SSL G Bus Compressor&lt;&#x2F;dt&gt;
&lt;dd&gt;ミックスバスで全体をまとめ上げる。&lt;&#x2F;dd&gt;
&lt;dt&gt;Ampex ATR-102&lt;&#x2F;dt&gt;
&lt;dd&gt;マスタートラックでテープサチュレーションを加え、アナログ感を演出。&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;これらのプラグインは、単に音を処理するだけではありません。
それぞれが持つ独特の倍音やサチュレーション、
ノンリニアな挙動によって、デジタルでは得られない温かみと
音楽的なキャラクターを付加しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;せっかく買ったUniversal
Audioのプラグインと、追加購入したREEL
ADTを使って「Rain」をカバーしてみました。&lt;&#x2F;p&gt;
&lt;p&gt;ADTやCapitol Chambers、Varispeedといった60年代の技術を
プラグインで手軽に試せるのは便利ですね。
特にREEL
ADTは、単なるディレイやコーラスとは違う独特の揺らぎがあって、
使っていて楽しいプラグインでした。&lt;&#x2F;p&gt;
&lt;p&gt;プラグインを買うと使いたくなるという、よくあるパターンですが、
おかげで久しぶりにBeatlesのカバーを楽しめました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.uaudio.com&#x2F;&quot;&gt;Universal Audio&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.waves.com&#x2F;&quot;&gt;Waves Audio&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Universal Audioのセールでプラグインを買ったので、
せっかくだから60年代の曲をカバーしてみました。
ADTが使われているThe Beatlesの「Rain」を選び、
REEL ADTやCapitol
Chambersなどのビンテージエミュレーションプラグインで
ミックスしています。
</summary>
        </entry><entry xml:lang="en">
        <title>ブログをZolaに移行、AWSの後始末</title>
        <published>2026-01-30T00:00:00+00:00</published>
        <updated>2026-01-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/blog-to-zola-aws-cleanup/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/blog-to-zola-aws-cleanup/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;blog-to-zola-aws-cleanup&amp;#x2F;.&amp;#x2F;zola.webp?h=97404862aa35036da55c&quot; alt=&quot;Zola&quot; width=&quot;1194&quot; height=&quot;716&quot; loading=&quot;lazy&quot;&#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;技術検証目的で1年ほどNext.js + Amazon Amplify構成のブログを運用していました。
目的も達成したので静的サイトジェネレーター(以下、SSGと記載)に移行しましたが、意外と移行先の選定や
AWSの後始末に手間取りました。その記録を残します。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;Zola_への移行&quot;&gt;Zola への移行&lt;&#x2F;h2&gt;
&lt;p&gt;移行先のSSGには &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; を選びました。&lt;&#x2F;p&gt;
&lt;p&gt;Python系（&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getpelican.com&#x2F;&quot;&gt;Pelican&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getnikola.com&#x2F;&quot;&gt;Nikola&lt;&#x2F;a&gt;）は
以前使った経験があり、遅さに辟易していたので避けました。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gohugo.io&#x2F;&quot;&gt;Hugo&lt;&#x2F;a&gt; も使用経験があるため、比較的新しく人気のあるZolaを
選びました。
Rust製のシングルバイナリで、node_modulesやpip installが不要です。&lt;&#x2F;p&gt;
&lt;p&gt;MDX形式の200記事程度あったので、 Markdownへの変換は、Claude Codeで作成した
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;blog-yostos&#x2F;blob&#x2F;main&#x2F;tools&#x2F;convert_mdx.py&quot;&gt;移行ツール&lt;&#x2F;a&gt;
で対応しました。&lt;&#x2F;p&gt;
&lt;p&gt;ホスティング先はCloudflareを想定していました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;サービス&lt;&#x2F;th&gt;&lt;th&gt;Zola 対応&lt;&#x2F;th&gt;&lt;th&gt;備考&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Cloudflare Pages&lt;&#x2F;td&gt;&lt;td&gt;V1 のみ&lt;&#x2F;td&gt;&lt;td&gt;V2&#x2F;V3 で &lt;code&gt;zola: not found&lt;&#x2F;code&gt; エラー&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Netlify&lt;&#x2F;td&gt;&lt;td&gt;あり&lt;&#x2F;td&gt;&lt;td&gt;2025年9月〜 月20デプロイ制限&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GitHub Pages&lt;&#x2F;td&gt;&lt;td&gt;GitHub Actions&lt;&#x2F;td&gt;&lt;td&gt;制限なし、無料&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Cloudflare PagesはV2以降で &lt;code&gt;ZOLA_VERSION&lt;&#x2F;code&gt; 環境変数を無視する問題があります。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;pages-build-image&#x2F;issues&#x2F;3&quot;&gt;Issue&lt;&#x2F;a&gt; も2年放置されています。
Netlifyは無料プランのデプロイ制限が厳しいため、GitHub Pages + Cloudflare CDNを採用しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AWS_リソースの調査と閉鎖&quot;&gt;AWS リソースの調査と閉鎖&lt;&#x2F;h2&gt;
&lt;p&gt;移行で最も手間がかかったのはAWSの閉鎖です。
Amplifyは便利ですが、裏でCloudFront、S3、IAMロールなど多くのリソースを自動生成します。
管理コンソールでは複数サービスの画面を行き来することになり、見落としが発生しやすいと感じました。
そのため、今回はすべてCLIで調査・削除しました。&lt;&#x2F;p&gt;
&lt;p&gt;まず、Amplifyが作成した可能性のあるリソースを網羅的に確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Amplify アプリ一覧（リージョン指定必須）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; amplify list-apps --region ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# CloudFront ディストリビューション&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cloudfront list-distributions&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;DistributionList.Items[*].[Id,Origins.Items[0].DomainName,Status]&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --output table&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# S3 バケット（Amplify が作成したバケットを探す）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3 ls&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -E &amp;#39;amplify|blog&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# IAM ロール（Amplify 関連）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam list-roles&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;Roles[?contains(RoleName,`amplify`)].RoleName&amp;#39; --output table&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ACM 証明書（カスタムドメイン用、us-east-1 固定）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; acm list-certificates --region us-east-1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;CertificateSummaryList[*].[DomainName,CertificateArn]&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --output table&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;今回確認されたリソースと、Amplifyアプリ削除時の自動削除有無は以下の通りです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;サービス&lt;&#x2F;th&gt;&lt;th&gt;リソース&lt;&#x2F;th&gt;&lt;th&gt;自動削除&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Amplify&lt;&#x2F;td&gt;&lt;td&gt;blog-yostos アプリ&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CloudFront&lt;&#x2F;td&gt;&lt;td&gt;Amplify 管理のディストリビューション&lt;&#x2F;td&gt;&lt;td&gt;✓&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;S3&lt;&#x2F;td&gt;&lt;td&gt;amplify-xxx-deployment バケット&lt;&#x2F;td&gt;&lt;td&gt;✓&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;IAM&lt;&#x2F;td&gt;&lt;td&gt;AmplifySSRLoggingRole 等&lt;&#x2F;td&gt;&lt;td&gt;✗&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ACM&lt;&#x2F;td&gt;&lt;td&gt;blog.yostos.org 証明書&lt;&#x2F;td&gt;&lt;td&gt;✗&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;調査が終わったら、リソースを削除していきます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;admonition warning&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-warning&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;削除作業の注意&lt;&#x2F;strong&gt;
        &lt;p&gt;以下ではコマンド例を示していますが、実際の削除作業では各コマンドの出力を目視で
確認し、削除対象が正しいことを1つずつ確かめながら進めました。
AWSリソースの削除は取り消しができないため、慎重に作業することをおすすめします。&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;Amplify Hosting（WEB_COMPUTEタイプ）の場合、アプリを削除するとCloudFrontと
S3バケットは自動削除されます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# アプリ ID を確認して削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; amplify list-apps --region ap-northeast-1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;apps[?name==`blog-yostos`].appId&amp;#39; --output text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; amplify delete-app --app-id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;APP_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;D&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --region ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;IAMロールは自動削除されないため、手動で削除します。ロールを削除する前に、
アタッチされているポリシーをすべてデタッチする必要があります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ロールにアタッチされたポリシーを確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam list-attached-role-policies --role-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ROLE_NAM&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;E&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam list-role-policies --role-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ROLE_NAM&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;E&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ポリシーをデタッチしてからロールを削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam detach-role-policy --role-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ROLE_NAM&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;E&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --policy-arn&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;POLICY_AR&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;N&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; iam delete-role --role-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ROLE_NAM&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;E&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ACM証明書はCloudFrontで使用中だと削除できないため、CloudFront削除後に
実行します。ACM証明書はus-east-1リージョン固定です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; acm list-certificates --region us-east-1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;CertificateSummaryList[?DomainName==`blog.yostos.org`]&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; acm delete-certificate --certificate-arn&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;CERT_AR&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;N&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --region us-east-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;DNSはFastmailで管理していたため、Amplify用のCNAMEレコードを削除し、
GitHub Pages用の設定に変更しました。&lt;&#x2F;p&gt;
&lt;p&gt;削除後は、各リソースが消えていることを確認します。CloudTrailで削除イベントも
確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# CloudFront（Amplify 管理分が消えていること）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cloudfront list-distributions&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --query &amp;#39;DistributionList.Items[*].Id&amp;#39; --output text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# S3（amplify 関連バケットが消えていること）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s3 ls&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; amplify&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# CloudTrail で削除イベントを確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cloudtrail lookup-events&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --lookup-attributes AttributeKey=EventName,AttributeValue=DeleteApp&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --region ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Zolaはシングルバイナリで依存関係がなく、node_modulesの管理から解放されます。
Rust製で高速、テンプレートエンジンもJinja2ライクで書きやすいです。プラグイン
なしでSASSコンパイルやシンタックスハイライトまで対応しており、長期運用での
保守コストの低さが魅力です。GitHub Pages + Cloudflare CDNの構成も安定して
います。&lt;&#x2F;p&gt;
&lt;p&gt;Amazon Amplifyは構築が簡単な反面、閉鎖時は複数サービスにまたがるリソースの確認が
必要です。CloudFrontとS3はAmplifyアプリ削除時に自動削除されますが、IAM
ロール、ACM証明書、DNSレコードは手動削除が必要です。
管理コンソールでは見落としが発生しやすく、かといって個人ブログでCloudFormationを使うほどでもない。
そんなケースではCLIで網羅的に確認し、ログに残しながら作業を進めると安心です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">技術検証目的で1年ほど運用していたNext.js + Amazon Amplify
構成のブログを、静的サイトジェネレーターZolaに移行しました。
移行先の選定、200記事のMarkdown変換、そしてAWSリソースの
網羅的な削除作業まで、移行の記録を残します。
</summary>
        </entry><entry xml:lang="en">
        <title>上司に説明できる生成AIガイドライン - NIST AI RMF準拠Check List</title>
        <published>2026-01-29T00:00:00+00:00</published>
        <updated>2026-01-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/genai-governance-checklist-release/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/genai-governance-checklist-release/</id>
        
            <content type="html">&lt;p&gt;この記事は &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;yostos&#x2F;articles&#x2F;genai-governance-checklist-release&quot;&gt;Zenn に掲載したオリジナル記事&lt;&#x2F;a&gt; の転載です。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt; &lt;details&gt;
  &lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;h2 id=&quot;「来月までにガイドラインを作って」&quot;&gt;「来月までにガイドラインを作って」&lt;&#x2F;h2&gt;
&lt;p&gt;生成AIも世の中に浸透してきたので、普通の企業や団体でも利用を検討しているところが増えてきたと思います。&lt;&#x2F;p&gt;
&lt;p&gt;ある日突然、上司からこう言われる可能性はありませんか？　あるいはもう既に経験済みかも知れません。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;「うちも生成AIを使い始めたいんだけど、まずガイドラインを作ってくれない？」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;引き受けたものの、いざ着手すると途方に暮れます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;何から書けばいいのか分からない&lt;&#x2F;li&gt;
&lt;li&gt;抜け漏れがあったらどうしよう&lt;&#x2F;li&gt;
&lt;li&gt;完成しても「これで大丈夫」と言い切れない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;そんなあなたのために、チェックリストを作りました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&quot;&gt;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;このチェックリストの対象&quot;&gt;このチェックリストの対象&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;誰のためのチェックリストか&quot;&gt;誰のためのチェックリストか&lt;&#x2F;h3&gt;
&lt;p&gt;専門のIT部門を持たない中小規模の組織で、専門家ではない生成AIの利用ガイドラインを策定・点検する担当者を想定しています。&lt;&#x2F;p&gt;
&lt;p&gt;AIやリスク管理の専門知識がなくても、項目を順に確認できるよう、各項目に「説明」と「定義例」を付けています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;何を対象としているか&quot;&gt;何を対象としているか&lt;&#x2F;h3&gt;
&lt;p&gt;ChatGPT・Claude・Gemini等のチャット型SaaS生成AIサービスを業務で利用する場面が対象です。IT部門を持たない組織では、おそらくこれらのチャット型の生成AIから始めるケースが多いと考えられるためです。&lt;&#x2F;p&gt;
&lt;p&gt;以下は対象外です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自社でAIモデルを開発・訓練する場面&lt;&#x2F;li&gt;
&lt;li&gt;ソフトウェア開発におけるコード生成の用途&lt;&#x2F;li&gt;
&lt;li&gt;エージェント型AIの利用（次回更新で対応予定）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;なぜこのチェックリストが「正しい」と言えるのか&quot;&gt;なぜこのチェックリストが「正しい」と言えるのか&lt;&#x2F;h2&gt;
&lt;p&gt;ガイドラインを作ったら、次に待っているのは上司や経営層からの質問です。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;「で、このガイドラインが正しいという根拠は何？」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;この質問に答えられるよう、本チェックリストはNIST AI RMFを軸に構成しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;NISTとは何か&quot;&gt;NISTとは何か&lt;&#x2F;h3&gt;
&lt;p&gt;NIST（米国国立標準技術研究所）は、米国商務省傘下の連邦機関です。&lt;&#x2F;p&gt;
&lt;p&gt;NISTが策定する標準・ガイドラインは、米国政府機関だけでなく世界中の組織で採用されています。
サイバーセキュリティ分野ではNIST Cybersecurity Framework（CSF）が事実上の世界標準となっており、日本でも金融庁や経済産業省のガイドラインがNIST CSFを参照しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;NIST_AI_RMFとは何か&quot;&gt;NIST AI RMFとは何か&lt;&#x2F;h3&gt;
&lt;p&gt;AI Risk Management Framework（AI RMF 1.0）は、NISTが2023年1月に公開したAIリスク管理の国際的な基本枠組みです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;米国議会の指示（National AI Initiative Act of 2020）に基づいて策定&lt;&#x2F;li&gt;
&lt;li&gt;産官学の幅広いステークホルダーとの協議を経て完成&lt;&#x2F;li&gt;
&lt;li&gt;AIシステムの開発・運用におけるリスク管理の4機能（GOVERN・MAP・MEASURE・MANAGE）を体系化&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;さらに2024年7月には、生成AI固有のリスクを扱う拡張文書NIST AI 600-1（Generative AI Profile）が公開されました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;なぜNISTを軸にすべきか&quot;&gt;なぜNISTを軸にすべきか&lt;&#x2F;h3&gt;
&lt;p&gt;日本にも経済産業省やIPAのガイドラインがありますが、これらはNIST AI RMFを参照して策定されています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ガイドライン&lt;&#x2F;th&gt;&lt;th&gt;NISTとの関係&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;経済産業省「AI事業者ガイドライン」&lt;&#x2F;td&gt;&lt;td&gt;NIST AI RMFの4機能を参照&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;IPA「テキスト生成AI導入・運用ガイドライン」&lt;&#x2F;td&gt;&lt;td&gt;NIST AI RMFを基本構造として採用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;つまり、NISTを押さえておけば、日本のガイドラインの&lt;strong&gt;上流&lt;&#x2F;strong&gt;を押さえたことになります。上司から「根拠は？」と聞かれたら、こう答えられます。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;「米国NISTのAI RMFに基づいています。日本の経産省やIPAのガイドラインも、このNIST AI RMFを参照して策定されています」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;本チェックリストが参照している基準&quot;&gt;本チェックリストが参照している基準&lt;&#x2F;h3&gt;
&lt;p&gt;NISTを軸に、国内外の主要基準を横断的に参照しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;略称&lt;&#x2F;th&gt;&lt;th&gt;正式名称&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;NIST&lt;&#x2F;td&gt;&lt;td&gt;NIST AI Risk Management Framework (AI RMF 1.0)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;NIST-GAI&lt;&#x2F;td&gt;&lt;td&gt;NIST AI RMF Generative AI Profile (NIST AI 600-1)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;METI&lt;&#x2F;td&gt;&lt;td&gt;経済産業省・総務省「AI事業者ガイドライン」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;JDLA&lt;&#x2F;td&gt;&lt;td&gt;日本ディープラーニング協会「生成AIの利用ガイドライン」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;IPA&lt;&#x2F;td&gt;&lt;td&gt;IPA「テキスト生成AI導入・運用ガイドライン」&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;EU-AIA&lt;&#x2F;td&gt;&lt;td&gt;EU AI Act（EU AI規制法）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AIACT-JP&lt;&#x2F;td&gt;&lt;td&gt;AI推進法（人工知能関連技術の研究開発及び活用の推進に関する法律）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;今すぐ使う3ステップ&quot;&gt;今すぐ使う3ステップ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1._チェックリストを開く&quot;&gt;1. チェックリストを開く&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&quot;&gt;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;全7章・120項目。各項目に「説明」と「定義例」が付いています。まだガイドライン策定に着手してなければ、説明を読んで、これから執筆すべき項目を検討できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._Excel版で現状を点検する&quot;&gt;2. Excel版で現状を点検する&lt;&#x2F;h3&gt;
&lt;p&gt;もし策定したガイドラインがある、あるいは執筆済みである場合は、EXCELでチェックリストを用意しました。自組織のガイドラインと突き合わせて、項目の抜け漏れを確認いただけます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&#x2F;raw&#x2F;main&#x2F;excel&#x2F;genai-governance-checklist.xlsx&quot;&gt;Excel版をダウンロード&lt;&#x2F;a&gt;して、対応状況を記入します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ドロップダウンで「対応済／一部対応／未対応／該当なし」を選択&lt;&#x2F;li&gt;
&lt;li&gt;サマリーシートで対応率を自動集計&lt;&#x2F;li&gt;
&lt;li&gt;まずはRequired（必須）項目の対応率100%を目指す&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3._定義例を参考にガイドラインを書く&quot;&gt;3. 定義例を参考にガイドラインを書く&lt;&#x2F;h3&gt;
&lt;p&gt;各項目の「定義例」を参考に、自組織向けにカスタマイズしてください。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1.1.A. [Required] 生成AI利用に関する最終責任者（経営層）が&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;明確に定められている [NIST: GOVERN 2.3] [METI]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  説明: AI関連の最終判断を下す責任者は必須。責任者が不明確だと、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  インシデント発生時に判断が遅れ法的・社会的リスクを組織全体に&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  波及させる。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  定義例: 「団体理事長をAI利用の最終責任者とし、利用方針の承認・&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  リスク受容の判断・重大インシデント時の意思決定を自ら行う」&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;「何を書けばいいか分からない」状態から脱出できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;準拠レベルで優先度が明確&quot;&gt;準拠レベルで優先度が明確&lt;&#x2F;h2&gt;
&lt;p&gt;各項目には準拠レベルが設定されています。限られた時間で何を優先すべきかが一目で分かります。年間予算15億円程度の非営利団体を想定し定義内容に基づいて独自にセットしたものです。業種によって事情が異なると思いますが、設定理由もドキュメントに残していますので必要応じて見直し下さい。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;準拠レベル&lt;&#x2F;th&gt;&lt;th&gt;意味&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Required&lt;&#x2F;td&gt;&lt;td&gt;必ず記載すべき。欠落すると法令違反や重大リスクにつながる&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Recommended&lt;&#x2F;td&gt;&lt;td&gt;記載を強く推奨。除外する場合は理由を説明できること&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Option&lt;&#x2F;td&gt;&lt;td&gt;記載があると望ましい。組織の規模や業種に応じて検討&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;チェックリストの構成&quot;&gt;チェックリストの構成&lt;&#x2F;h2&gt;
&lt;p&gt;NIST AI RMFの4機能（GOVERN・MAP・MEASURE・MANAGE）に沿って構成しています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;章&lt;&#x2F;th&gt;&lt;th&gt;タイトル&lt;&#x2F;th&gt;&lt;th&gt;項目数&lt;&#x2F;th&gt;&lt;th&gt;概要&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;ガバナンス体制&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;td&gt;責任者・ポリシー・教育など組織の管理体制&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;リスクの特定と評価&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;td&gt;利用目的の明確化とリスクアセスメント&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;入力データの管理&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;入力禁止情報・個人情報・機密情報の取り扱い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;出力の管理と利用&lt;&#x2F;td&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;td&gt;出力の検証義務・著作権・利用範囲&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;信頼性の確保&lt;&#x2F;td&gt;&lt;td&gt;31&lt;&#x2F;td&gt;&lt;td&gt;正確性・安全性・公平性・透明性などの品質特性&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;インシデント対応&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;報告体制と対応手順&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;&#x2F;td&gt;&lt;td&gt;ガイドラインとしての完成度&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;文書としての一般的な品質要件&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;リンク集&quot;&gt;リンク集&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;オンライン版: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&quot;&gt;https:&#x2F;&#x2F;yostos.github.io&#x2F;genai-governance-checklist&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;GitHubリポジトリ: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Excel版: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&#x2F;raw&#x2F;main&#x2F;excel&#x2F;genai-governance-checklist.xlsx&quot;&gt;genai-governance-checklist.xlsx&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;MITライセンスで公開しています。商用・非商用問わず自由に利用できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;作成プロセス&quot;&gt;作成プロセス&lt;&#x2F;h2&gt;
&lt;p&gt;本チェックリストは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;ja&#x2F;docs&#x2F;claude-code&quot;&gt;Claude Code&lt;&#x2F;a&gt;を全面的に活用し、コンセプト検討→計画→作成→インスペクションのプロセスで作成しました。&lt;&#x2F;p&gt;
&lt;p&gt;インスペクションにはMAGIシステム&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-magi-1&quot;&gt;&lt;a href=&quot;#fn-magi&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を使用しました。3つの異なる視点を持つAIエージェントが並列でレビューし、指摘を統合することで、単一視点では見落としがちな問題を検出できました。&lt;&#x2F;p&gt;
&lt;p&gt;インスペクションログは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&#x2F;tree&#x2F;main&#x2F;docs&quot;&gt;docsフォルダ&lt;&#x2F;a&gt;で公開しています。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;現在v1.0.0-rc.1（リリース候補版）です。フィードバックを募集しています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&#x2F;issues&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;genai-governance-checklist&#x2F;issues&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-magi&quot;&gt;
&lt;p&gt;MAGIシステムは、Claude Codeプラグインとして実装した品質レビューシステムです。エヴァンゲリオンのMAGIから着想を得て、CASPER（批判的分析）・BALTHASAR（実用性評価）・MELCHIOR（創造的提案）の3エージェントが独立してレビューします。詳細は &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&lt;&#x2F;a&gt; を参照してください。 &lt;a href=&quot;#fr-magi-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">NIST AI RMF準拠の生成AIガバナンスチェックリストを公開しました。
ChatGPT・Claude・Gemini等のSaaS型生成AIを業務利用する際の
ガイドライン策定に使える、全7章・120項目の実践的な内容です。
非専門家でも使いやすく、小規模な組織でも今すぐ始められます。
</summary>
        </entry><entry xml:lang="en">
        <title>Plumed Bird</title>
        <published>2026-01-25T00:00:00+00:00</published>
        <updated>2026-01-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/plumed-bird/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/plumed-bird/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2253696386&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;plumed-bird&quot; title=&quot;Plumed Bird&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Plumed Bird&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;高中正義の名盤「虹伝説THE RAINBOW GOBLINS」より「Plumed Bird」のギターカバーを録音しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;虹伝説_THE_RAINBOW_GOBLINS_について&quot;&gt;虹伝説 THE RAINBOW GOBLINS について&lt;&#x2F;h2&gt;
&lt;p&gt;「虹伝説THE RAINBOW GOBLINS」は、1981年に発売された高中正義の7枚目のオリジナルア
ルバムです。イタリアの画家ウル・デ・リコの絵本「THE RAINBOW GOBLINS」（邦題
「虹伝説」）からインスピレーションを得て制作されたコンセプトアルバムで、第23回日
本レコード大賞企画賞を受賞しています。&lt;&#x2F;p&gt;
&lt;p&gt;「Plumed Bird」は虹を守る鳥をイメージした楽曲で、軽やかで浮遊感のあるフレーズが
特徴的です。テクニカルでありながらも、繊細なニュアンスと表現力が求められる難曲だ
と思います。&lt;&#x2F;p&gt;
&lt;p&gt;リードギターには&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;07&#x2F;22&#x2F;yamaha-revstar-rsp20&quot;&gt;YAMAHA REVSTAR RSP20&lt;&#x2F;a&gt;を使用しました。
オリジナルでは高中正義がYAMAHA SGを使用しており、同じYAMAHAのハムバッカー搭載ギターとしてREVSTARを使用しました。
リフやバッキングにはFender Stratocasterを使用し、シングルコイルとハムバッカーのコントラストを出しています。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;About_The_Rainbow_Goblins&quot;&gt;About The Rainbow Goblins&lt;&#x2F;h2&gt;
&lt;p&gt;&quot;The Rainbow Goblins&quot; is Masayoshi Takanaka&#x27;s 7th original album, released in 1981. It&#x27;s a concept album inspired by the picture book &quot;The Rainbow Goblins&quot; by Italian artist Ul de Rico. The album won the Planning Award at the 23rd Japan Record Awards.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Plumed Bird&quot; evokes the image of a bird protecting the rainbow, characterized by light, floating phrases. It&#x27;s a technically demanding piece that requires delicate nuance and expression.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Performance_Notes&quot;&gt;Performance Notes&lt;&#x2F;h2&gt;
&lt;p&gt;When playing this piece, I focused on:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Floating phrasing&lt;&#x2F;strong&gt;: To express the image of a bird soaring through the sky, I paid careful attention to attack and decay&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic variation&lt;&#x2F;strong&gt;: I tried to create natural transitions from quiet passages to climactic sections&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SG-like tone&lt;&#x2F;strong&gt;: I aimed for the thick, sweet tone reminiscent of the YAMAHA SG used in the original&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Equipment&quot;&gt;Equipment&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Guitar (Lead)&lt;&#x2F;td&gt;&lt;td&gt;YAMAHA REVSTAR RSP20 (Moon Light Blue)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Guitar (Backing)&lt;&#x2F;td&gt;&lt;td&gt;Fender Stratocaster 70th Anniversary&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Audio Interface&lt;&#x2F;td&gt;&lt;td&gt;MOTU M2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amp Sim&lt;&#x2F;td&gt;&lt;td&gt;Neural DSP Archetype Cory Wong X&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;For the lead guitar, I used the &lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;07&#x2F;22&#x2F;yamaha-revstar-rsp20&quot;&gt;YAMAHA REVSTAR RSP20&lt;&#x2F;a&gt;. Since Takanaka used a YAMAHA SG in the original recording, I chose the REVSTAR as a fellow YAMAHA humbucker-equipped guitar. The Fender Stratocaster provides contrast with its single-coil pickups for the backing parts.&lt;&#x2F;p&gt;
</content>
        <summary type="html">高中正義の名盤「虹伝説 THE RAINBOW GOBLINS」より
「Plumed Bird」のギターカバーを録音しました。
Yamaha Revstar RSP20とFender Stratocasterを使用し、
Neural DSP Archetype Cory Wong Xで音作りをしています。
フュージョンの名曲を現代のデジタル技術で再現しました。
</summary>
        </entry><entry xml:lang="en">
        <title>初めて海外出張へ行く君へ</title>
        <published>2026-01-24T00:00:00+00:00</published>
        <updated>2026-01-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/overseas-business-trip-essentials-for-newbies/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/overseas-business-trip-essentials-for-newbies/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;overseas-business-trip-essentials-for-newbies&amp;#x2F;airport.webp?h=f452d938332ac03de55b&quot;
  alt=&quot;Air Port&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
 &lt;details&gt;
  &lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;h2 id=&quot;PCの持参と機内持ち込み&quot;&gt;PCの持参と機内持ち込み&lt;&#x2F;h2&gt;
&lt;p&gt;海外出張にノートPCは必須です。仕事はもちろん、現地でのコミュニケーションや情報収集にも欠かせません。
会社から特に指示がなくても、持参できるよう交渉することをお勧めします。&lt;&#x2F;p&gt;
&lt;p&gt;まず会社の規定を確認してください。企業によっては持ち出し可能な端末制限や事前申請が必要です。
もし会社のPCを持ち出せない場合は、私物のPCでも構わないので持っていくことを検討してください。&lt;&#x2F;p&gt;
&lt;p&gt;PCは必ず機内持ち込み手荷物にしてください。預け荷物にすることは、ほとんどの企業で規定により禁止されているはずです。
破損・盗難リスクやデータセキュリティ上の理由から、当然の措置といえます。&lt;&#x2F;p&gt;
&lt;p&gt;また、PCの扱いには細心の注意が必要です。機内だけでなく、仕事中やホテルでも常に手元に置いてください。
部屋へ置きっぱなしにするのは避けましょう。&lt;&#x2F;p&gt;
&lt;p&gt;空港のセキュリティチェックではPCをバッグから取り出す必要があります。
取り出しやすい場所に入れておくとスムーズです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;機内での座席選び&quot;&gt;機内での座席選び&lt;&#x2F;h2&gt;
&lt;p&gt;座席は後部の通路側を選ぶことをお勧めします。&lt;&#x2F;p&gt;
&lt;p&gt;通路側であれば、隣の人に気を遣うことなくトイレに立てます。
長時間のフライトでは水分補給が重要ですが、窓側に座ってしまうと「隣の人を起こしたくない」という心理からトイレを我慢しがちです。
結果として水分摂取を控えてしまい、体調を崩す原因になることeあります。&lt;&#x2F;p&gt;
&lt;p&gt;後部座席を勧める理由はもう1つあります。
国際線の機内最後尾には、多くの場合飲み物やスナックを自由に取れるギャレー（調理スペース）が用意されています。カップラーメンやお菓子、お酒や水などが用意されています。機内食の時間以外でも小腹が空いたときに気軽に利用できるでしょう。後部座席なら数歩で到着します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;海外でのデータ通信手段&quot;&gt;海外でのデータ通信手段&lt;&#x2F;h2&gt;
&lt;p&gt;現地でのインターネット接続手段を事前に確保しておくことは非常に重要です。
まず、会社で海外用のモバイルルーターを貸し出していないか確認してください。用意がある会社も多いです。&lt;&#x2F;p&gt;
&lt;p&gt;会社にない場合は、自分で手配します。主な選択肢は以下の2つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ポケットWiFiレンタル
&lt;ul&gt;
&lt;li&gt;空港や事前予約でレンタルできるモバイルルーター&lt;&#x2F;li&gt;
&lt;li&gt;設定が簡単で、PCとスマホを同時接続できる&lt;&#x2F;li&gt;
&lt;li&gt;端末の持ち歩きと充電が必要。紛失・破損時は弁償リスクあり&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;eSIM
&lt;ul&gt;
&lt;li&gt;スマートフォンに直接データプランを追加する方式&lt;&#x2F;li&gt;
&lt;li&gt;端末が増えず、アプリやWebで購入してすぐ使える&lt;&#x2F;li&gt;
&lt;li&gt;eSIM対応端末が必要。PCはテザリング経由で接続&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;短期間であればeSIMが手軽です。PCを頻繁に使う場合はポケットWiFiの方が便利かもしれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;スマートフォンの設定&quot;&gt;スマートフォンの設定&lt;&#x2F;h2&gt;
&lt;p&gt;海外で意図しない高額請求を避けるため、出発前にスマートフォンの設定を確認してください。&lt;&#x2F;p&gt;
&lt;p&gt;ポケットWiFiを使う場合は、国内SIMのモバイルデータ通信をオフにしてWiFi接続のみで運用します。
eSIMを使う場合は、国内SIMの回線を一時的に無効化し、eSIMのみを有効にしてください。&lt;&#x2F;p&gt;
&lt;p&gt;いずれの場合も、データローミングは必ずオフにしておきます。これを忘れると、知らないうちに国内キャリア経由で通信してしまい、帰国後に高額な請求を受ける可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;設定画面の場所はiPhoneとAndroidで異なります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;iPhone：設定 → モバイル通信 → 通信のオプション → データローミング&lt;&#x2F;li&gt;
&lt;li&gt;Android：設定 → ネットワークとインターネット → モバイルネットワーク → データローミング&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;出発前に自分の端末で設定場所を確認しておくと安心です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;充電器と電源&quot;&gt;充電器と電源&lt;&#x2F;h2&gt;
&lt;p&gt;海外では電源コンセントの形状が日本と異なります。充電器と変換プラグを忘れずに持参してください。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;USB充電器&quot;&gt;USB充電器&lt;&#x2F;h3&gt;
&lt;p&gt;ノートPCの純正ACアダプターは大きくて重いため、USB PD対応の汎用充電器を持参することをお勧めします。
CIO NovaPort TRIO II 67Wは、USB-Cポート2つとUSB-Aポート1つを搭載し、
ノートPC・スマホ・モバイルバッテリーを同時に充電できます。
純正アダプターより大幅にコンパクトで、出張の荷物を減らせます。&lt;&#x2F;p&gt;
&lt;p&gt;最近のノートPCはUSB PD充電に対応しているものが多いですが、念のため出発前に自分のPCが対応しているか確認してください。
MacBookは全機種対応しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;モバイルバッテリー&quot;&gt;モバイルバッテリー&lt;&#x2F;h3&gt;
&lt;p&gt;モバイルバッテリーも忘れずに持参してください。
スマホはGrabやマップ、翻訳アプリなど現地で頻繁に使うため、バッテリー切れは致命的です。&lt;&#x2F;p&gt;
&lt;p&gt;信頼できるメーカーのものを選んでください。
安価な無名ブランド品は発火リスクがあり、機内での事故は致命的です。AnkerやCIOなど、品質管理がしっかりしたメーカーの製品をお勧めします。
容量は10,000mAh以上あると安心です。&lt;&#x2F;p&gt;
&lt;p&gt;なお、モバイルバッテリーは預け荷物に入れることができません。必ず機内持ち込み手荷物に入れてください。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;変換プラグ&quot;&gt;変換プラグ&lt;&#x2F;h3&gt;
&lt;p&gt;渡航先が決まっていない段階では、マルチタイプの変換プラグを用意しておくと安心です。
1台で世界中のほとんどの国に対応できます。&lt;&#x2F;p&gt;
&lt;p&gt;お勧めはカシムラのマルチ変換プラグです。
A・B・BF・C・O・SEタイプに対応し、50g未満と軽量で持ち運びに便利です。
エレコムやサンワサプライの製品も品質が安定しています。&lt;&#x2F;p&gt;
&lt;p&gt;変換プラグは電圧を変換しません。
使用する機器が海外の電圧（多くの国で220〜240V）に対応しているか確認してください。
最近のノートPCやスマホの充電器は「100〜240V」対応のものがほとんどです。
ヘアドライヤーなど日本専用の家電製品は変圧器なしで使えませんが、持っていくことは稀でしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現金とカードの使い分け&quot;&gt;現金とカードの使い分け&lt;&#x2F;h2&gt;
&lt;p&gt;海外での支払いは、基本的にクレジットカードを使うことをお勧めします。為替手数料も両替より有利な場合が多く、利用明細が残るので経費精算にも便利です。&lt;&#x2F;p&gt;
&lt;p&gt;現金は、屋台やタクシー、チップなど少額の支払い用に持っておく程度で十分です。1週間程度の出張であれば、4万円相当の現地通貨があれば困ることはないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;多くの場合、両替は空港よりも現地の銀行や両替所のレートが良いです。ただし、到着直後にタクシーや軽食で現金が必要になることもあるので、空港で5,000円程度は両替しておくと安心です。&lt;&#x2F;p&gt;
&lt;p&gt;トラベラーズチェックは現在ほとんど使われていないため、考慮する必要はありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;配車アプリGrab&quot;&gt;配車アプリGrab&lt;&#x2F;h3&gt;
&lt;p&gt;タイやシンガポールなど東南アジアではGrabという配車アプリが普及しています。スマホで車を呼び、アプリ上でカード決済ができるため、現金を使わずに移動できます。料金も事前に確定するので、ぼったくりの心配がありません。&lt;&#x2F;p&gt;
&lt;p&gt;出発前にアプリをインストールし、クレジットカードを登録しておくことをお勧めします。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;app&#x2F;grab-taxi-food-delivery&#x2F;id647268330&quot;&gt;Grab（iOS）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.grabtaxi.passenger&quot;&gt;Grab（Android）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;チップについて&quot;&gt;チップについて&lt;&#x2F;h2&gt;
&lt;p&gt;チップの習慣は渡航先によって大きく異なります。&lt;&#x2F;p&gt;
&lt;p&gt;アメリカでは飲食店やタクシーで15〜20%のチップが事実上必須ですが、アジア圏では基
本的に不要な国が多いです。中国・韓国・日本ではチップを渡す習慣がなく、渡すとかえ
って困惑されることもあります。&lt;&#x2F;p&gt;
&lt;p&gt;タイの場合は少し事情が異なり、以下のような場面では少額のチップを渡すことがありま
す。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ホテルのポーターやベッドメイク：20〜50バーツ程度&lt;&#x2F;li&gt;
&lt;li&gt;マッサージやスパ：50〜100バーツ程度&lt;&#x2F;li&gt;
&lt;li&gt;高級レストラン：サービス料が含まれていなければ端数を切り上げる程度&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;屋台やフードコート、コンビニなどではチップは不要です。タクシーも基本的には不要で
すが、お釣りの端数を渡す程度は喜ばれます。&lt;&#x2F;p&gt;
&lt;p&gt;チップは現金で渡すのが基本です。小額紙幣を用意しておくと便利です。なお、硬貨でチップを渡すのは失礼にあたるため、必ず紙幣で渡すようにしてください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;水と食事&quot;&gt;水と食事&lt;&#x2F;h2&gt;
&lt;p&gt;海外では水道水を飲まないでください。ペットボトルの水を購入するのが基本です。レストランで出される氷も水道水から作られている場合があるので、心配なら氷なしで注文しましょう。&lt;&#x2F;p&gt;
&lt;p&gt;食事については、最初の数日は胃腸に負担をかけすぎないよう気をつけてください。屋台の料理は魅力的ですが、衛生面にばらつきがあります。火が通っているもの、人気があって回転の早い店を選ぶと比較的安心です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;その他の備え&quot;&gt;その他の備え&lt;&#x2F;h2&gt;
&lt;p&gt;出発前に以下の準備も忘れずに行ってください。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;たびレジへの登録
&lt;ul&gt;
&lt;li&gt;外務省が提供する海外旅行登録サービス&lt;&#x2F;li&gt;
&lt;li&gt;登録すると渡航先の安全情報や緊急時の連絡がメールで届く&lt;&#x2F;li&gt;
&lt;li&gt;3か月未満の短期渡航者は任意だが、登録を強く推奨&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;パスポートの残存有効期間の確認
&lt;ul&gt;
&lt;li&gt;国によっては入国時に6か月以上の残存有効期間が必要&lt;&#x2F;li&gt;
&lt;li&gt;残存有効期間が1年未満の場合は新しいパスポートへの切り替えを検討&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;パスポートと航空券のコピー
&lt;ul&gt;
&lt;li&gt;紙のコピーと、クラウドストレージにデジタルコピーの両方を用意&lt;&#x2F;li&gt;
&lt;li&gt;万が一紛失した際の再発行手続きがスムーズになる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;海外旅行保険の確認
&lt;ul&gt;
&lt;li&gt;会社の法人カードに付帯している場合が多いので、補償内容を確認&lt;&#x2F;li&gt;
&lt;li&gt;付帯がない場合は個別に加入を検討&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;緊急連絡先の共有
&lt;ul&gt;
&lt;li&gt;会社の緊急連絡先、現地の日本大使館・領事館の連絡先を控えておく&lt;&#x2F;li&gt;
&lt;li&gt;家族にも滞在先ホテルや現地連絡先を伝えておく&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;常備薬の持参
&lt;ul&gt;
&lt;li&gt;普段使用している薬があれば必ず持参&lt;&#x2F;li&gt;
&lt;li&gt;胃腸薬や解熱鎮痛剤もあると安心&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;予防接種
&lt;ul&gt;
&lt;li&gt;短期の都市部出張であれば通常不要&lt;&#x2F;li&gt;
&lt;li&gt;心配な場合は出発2週間前までに渡航外来で相談&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;中国への出張について&quot;&gt;中国への出張について&lt;&#x2F;h2&gt;
&lt;p&gt;最後に、中国への出張について触れておきます。&lt;&#x2F;p&gt;
&lt;p&gt;初めての海外出張で中国を打診された場合、可能であれば断ることをお勧めします。&lt;&#x2F;p&gt;
&lt;p&gt;現在の中国は地政学的リスクが非常に高く、日本人ビジネスパーソンにとって安全とは言
えない状況です。スパイ容疑での拘束事例も報告されており、何気ない行動が思わぬトラ
ブルにつながる可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;また、インターネット規制（グレートファイアウォール）によりGoogle、LINE、Gmailな
どが使えず、VPNの準備が必要になるなど、通信面でのハードルも高いです。決済も
WeChat PayやAlipayが主流で、外国人が使うには事前準備が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;中国出張を避けられない場合は、会社のセキュリティ部門や法務部門に相談し、十分な対
策を講じてから渡航してください。初心者が単独で対応するには荷が重すぎます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考情報&quot;&gt;参考情報&lt;&#x2F;h2&gt;
&lt;p&gt;この記事の作成にあたり、以下の情報を参考にしました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anzen.mofa.go.jp&#x2F;&quot;&gt;外務省 海外安全ホームページ&lt;&#x2F;a&gt; - 各国の危険情報・安全対策&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ezairyu.mofa.go.jp&#x2F;tabireg&#x2F;index.html&quot;&gt;たびレジ（外務省海外旅行登録）&lt;&#x2F;a&gt; - 短期渡航者向け登録サービス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mofa.go.jp&#x2F;mofaj&#x2F;toko&#x2F;index.html&quot;&gt;外務省 海外渡航・滞在&lt;&#x2F;a&gt; - パスポート・ビザ情報&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anzen.mofa.go.jp&#x2F;info&#x2F;pcspotinfo_2025C029.html&quot;&gt;中国：反スパイ法に関する注意喚起（外務省）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gov-online.go.jp&#x2F;article&#x2F;201412&#x2F;entry-7500.html&quot;&gt;飛行機へ持ち込めないもの（政府広報オンライン）&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.grab.com&#x2F;global&#x2F;rides&#x2F;&quot;&gt;Grab公式サイト&lt;&#x2F;a&gt; - 東南アジアの配車アプリ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">初めての海外出張が決まると、何を準備すればいいのか分からず
不安になるものです。通信手段やお金の管理など、
事前に整えておかないと現地で苦労する項目を中心に、
実務的な準備ポイントをまとめました。
</summary>
        </entry><entry xml:lang="en">
        <title>多機能Todoに疲れた人へ ─「一枚の紙」だけのタスク管理CLI</title>
        <published>2026-01-23T00:00:00+00:00</published>
        <updated>2026-01-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/building-ttt-with-claude-code/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/building-ttt-with-claude-code/</id>
        
            <content type="html"> &lt;details&gt;
  &lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;ターミナルで作業中、ふと「あれもやらなきゃ」と思いついたとき、頭の中を書き出す場所が欲しくなります。
物理的なメモ用紙ならすぐに書けますが、ターミナルから手を離すのは煩わしい。
かといって多機能なTodoアプリを開くと、プロジェクトやタグを考えているうちに書きたかったことを忘れてしまう。&lt;&#x2F;p&gt;
&lt;p&gt;そこで作ったのが &lt;strong&gt;Tiny Task Tool&lt;&#x2F;strong&gt; です。コマンド名はタイプしやすいように &lt;code&gt;ttt&lt;&#x2F;code&gt; としました。&lt;&#x2F;p&gt;
&lt;p&gt;「一枚の紙」のシンプルさをターミナルで再現することを目指した、ミニマルなタスク管理ツールです。&lt;&#x2F;p&gt;
&lt;p&gt;この記事では、&lt;code&gt;ttt&lt;&#x2F;code&gt; のコンセプトと使い方を紹介しつつ、Claude Codeとの協働開発でドキュメント駆動とTDDがいかに効果的だったかをお伝えします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Tiny_Task_Tool_とは&quot;&gt;Tiny Task Tool とは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;ttt&lt;&#x2F;code&gt;(Tiny Task Tool) は「デジタルなメモ用紙」を目指したTUIタスク管理ツールです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;building-ttt-with-claude-code&amp;#x2F;demo.gif?h=5668a44b60ecfc9113e6&quot;
  alt=&quot;ttt demo&quot; width=&quot;800&quot; height=&quot;600&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h3 id=&quot;主な特徴&quot;&gt;主な特徴&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一枚の紙&lt;&#x2F;strong&gt;: ファイルは常に1つ。「どのファイルに書こう」という選択を排除&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;今に集中&lt;&#x2F;strong&gt;: タスクをすぐ書き出し、完了したらアーカイブ。シンプルな運用&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ノード指向&lt;&#x2F;strong&gt;: 階層構造のタスクを直感的に扱える。親を完了すれば子も完了&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Unix 哲学&lt;&#x2F;strong&gt;: フォーカス機能以外は外部エディタやGitに任せる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;インストール&quot;&gt;インストール&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# go install（推奨）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;go&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install github.com&#x2F;yostos&#x2F;tiny-task-tool@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Homebrew&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install yostos&#x2F;tap&#x2F;ttt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;基本的な使い方&quot;&gt;基本的な使い方&lt;&#x2F;h3&gt;
&lt;p&gt;ターミナルで &lt;code&gt;ttt&lt;&#x2F;code&gt; と打つだけで、1ページのタスク表がTUIで開きます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ttt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                    # TUIでタスク表を開く&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ttt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -t &amp;quot;牛乳を買う&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;     # コマンドラインからタスクを追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ttt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sync&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;               # git pushでリモートと同期&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;TUIでは &lt;code&gt;e&lt;&#x2F;code&gt; でエディタを開き、&lt;code&gt;a&lt;&#x2F;code&gt; でアーカイブ、&lt;code&gt;q&lt;&#x2F;code&gt; で終了。キーバインドはVim&#x2F;Emacsユーザー向けにカスタマイズ可能です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;タスクのフォーマット&quot;&gt;タスクのフォーマット&lt;&#x2F;h3&gt;
&lt;p&gt;シンプルなMarkdownチェックボックス形式です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; [ ] 未完了のタスク&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt; [x]&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 完了したタスク @done(2026-01-18)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt; [x]&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 子タスクも自動で完了 @done(2026-01-18)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;タスク以外の箇条書きもノードとして挿入できます。タスクをグルーピングするためにセクション（&lt;code&gt;# Task&lt;&#x2F;code&gt; や &lt;code&gt;## Project A&lt;&#x2F;code&gt;）なども扱えます。&lt;&#x2F;p&gt;
&lt;p&gt;完了したタスクには自動で &lt;code&gt;@done(日付)&lt;&#x2F;code&gt; タグが付き、設定した日数が経過するとarchive.mdに移動します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜ作ったのか&quot;&gt;なぜ作ったのか&lt;&#x2F;h2&gt;
&lt;p&gt;きっかけはZennで見かけた「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zenn.dev&#x2F;nekoninaritai&#x2F;articles&#x2F;941e55aed77609&quot;&gt;Markdown Paper という選択肢&lt;&#x2F;a&gt;」という記事でした。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ephe.app&#x2F;&quot;&gt;ephe.app&lt;&#x2F;a&gt; の「一枚の紙」コンセプトをCLIに持ち込んだ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;siki-712&#x2F;aeph&quot;&gt;aeph&lt;&#x2F;a&gt; の紹介記事です。&lt;&#x2F;p&gt;
&lt;p&gt;コンセプトには共感しましたが、aephは複数ファイルに対応しており、「一枚の紙」とは少し違うと感じました。そこでaephのソースコードを参考にするのではなく、ゼロから自分のコンセプトで作ることにしました。&lt;&#x2F;p&gt;
&lt;p&gt;既存のツールにも同様の問題がありました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Todo アプリ&lt;&#x2F;strong&gt;: 多機能すぎる。プロジェクト、優先度、タグ…考えているうちに書きたいことを忘れる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Markdown エディタ&lt;&#x2F;strong&gt;: ファイル名やフォルダを考える必要がある&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GUI アプリ&lt;&#x2F;strong&gt;: ターミナルから離れるコンテキストスイッチが発生する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;単一ファイル、選択肢なし、気を散らすものなし。机の上のメモ用紙のように、「開いて、書いて、終わったら消す」だけの体験が欲しかったのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Code_との開発体験&quot;&gt;Claude Code との開発体験&lt;&#x2F;h2&gt;
&lt;p&gt;このプロジェクトはClaude Codeを活用し、以下のプロセスで開発しました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;コンセプト文書化（concept.md）&lt;&#x2F;li&gt;
&lt;li&gt;詳細仕様策定（specification.md）&lt;&#x2F;li&gt;
&lt;li&gt;アーキテクチャ選定（architecture.md）&lt;&#x2F;li&gt;
&lt;li&gt;テストコード先行開発&lt;&#x2F;li&gt;
&lt;li&gt;実装&lt;&#x2F;li&gt;
&lt;li&gt;テスト自動化&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;ドキュメント駆動が効いた理由&quot;&gt;ドキュメント駆動が効いた理由&lt;&#x2F;h3&gt;
&lt;p&gt;Claude Codeとの協働で最も効果的だったのは、&lt;strong&gt;まずドキュメントを書き、それに従って開発する&lt;&#x2F;strong&gt;アプローチでした。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;1._concept.md_で方向性を固める&quot;&gt;1. concept.md で方向性を固める&lt;&#x2F;h4&gt;
&lt;p&gt;最初に「なぜ作るのか」「何をしないか」を明確にしました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\33  z-markdown&quot;&gt;### やらないこと&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; ファイル指定（「どのファイルを開くか」という選択を排除）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 複数ファイル管理（一枚の紙の原則に反する）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; ファイル内編集（外部エディタに任せる）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;「やらないこと」を明文化したことで、開発中に機能追加の誘惑が来ても「concept.mdに反する」と判断できました。Claudeにも「この機能はconcept.mdの方針に反しますね」とフィードバックを受けられます。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;2._specification.md_で仕様を詳細化&quot;&gt;2. specification.md で仕様を詳細化&lt;&#x2F;h4&gt;
&lt;p&gt;ユースケース、画面レイアウト、エラー処理まで事前に定義しました。これによりClaudeへの指示が明確になり、生成されるコードの品質が上がりました。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;3._architecture.md_で技術選定を記録&quot;&gt;3. architecture.md で技術選定を記録&lt;&#x2F;h4&gt;
&lt;p&gt;「なぜその技術を選んだか」「他の選択肢をなぜ却下したか」を記録しました。後から見返したとき、またClaudeに文脈を伝えるときに役立ちました。基本的に記載方法は &lt;strong&gt;Architectural Decision Record（ADR）形式&lt;&#x2F;strong&gt; を採用して記載しています。&lt;&#x2F;p&gt;
&lt;p&gt;以下は言語選定の際の例です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;候補&lt;&#x2F;th&gt;&lt;th&gt;却下理由&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Rust&lt;&#x2F;td&gt;&lt;td&gt;学習コストが高い。所有権&#x2F;ライフタイムの概念が独特で、AI 駆動開発でコンパイルエラー修正時に堂々巡りするリスク&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Python&lt;&#x2F;td&gt;&lt;td&gt;PEP 668 により配布が複雑化。起動速度も遅い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;TypeScript&lt;&#x2F;td&gt;&lt;td&gt;単一バイナリ配布ができず「摩擦をなくす」原則に反する&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;TDD_が_AI_駆動開発と相性が良い理由&quot;&gt;TDD が AI 駆動開発と相性が良い理由&lt;&#x2F;h3&gt;
&lt;p&gt;テスト駆動開発（TDD）はClaude Codeとの開発で特に威力を発揮しました。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;テストファーストのメリット&quot;&gt;テストファーストのメリット&lt;&#x2F;h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;期待動作の明確化&lt;&#x2F;strong&gt;: テストコードが「仕様書」として機能し、開発前に私が確認できるためClaudeへの指示が曖昧にならない&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;リグレッション防止&lt;&#x2F;strong&gt;: AIが生成したコードの変更が既存機能を壊していないか即座に確認&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;リファクタリングの安心感&lt;&#x2F;strong&gt;: テストが通れば安心して改善できる&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;実際の開発フロー&quot;&gt;実際の開発フロー&lt;&#x2F;h4&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 1. まずテストを書く（Red）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; go test .&#x2F;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# FAIL: TestArchiveCompletedTasks - 期待する動作のテストが失敗&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 2. Claude に実装を依頼&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 「このテストを通す実装をお願いします」&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 3. テストが通ることを確認（Green）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; go test .&#x2F;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# PASS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 4. リファクタリング&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 「この実装をより読みやすくリファクタリングしてください」&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;特に階層タスクのアーカイブ処理のような複雑なロジックでは、テストケースを先に書いておくことで、エッジケースの考慮漏れを防げました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Claude_Code_との対話で心がけたこと&quot;&gt;Claude Code との対話で心がけたこと&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ドキュメントを参照させる&lt;&#x2F;strong&gt;:「concept.mdの方針に従って」「specification.mdの仕様通りに」&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;小さな単位で依頼&lt;&#x2F;strong&gt;: 一度に多くを頼まず、テスト→実装→確認のサイクルを回す&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コミットを細かく&lt;&#x2F;strong&gt;: 動作確認できた時点でコミット。戻れるポイントを作る&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;技術スタック&quot;&gt;技術スタック&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分野&lt;&#x2F;th&gt;&lt;th&gt;選択&lt;&#x2F;th&gt;&lt;th&gt;理由&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;言語&lt;&#x2F;td&gt;&lt;td&gt;Go&lt;&#x2F;td&gt;&lt;td&gt;単一バイナリ配布、高速起動&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;TUI&lt;&#x2F;td&gt;&lt;td&gt;bubbletea + lipgloss&lt;&#x2F;td&gt;&lt;td&gt;成熟したエコシステム、Elm アーキテクチャ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;設定&lt;&#x2F;td&gt;&lt;td&gt;pelletier&#x2F;go-toml v2&lt;&#x2F;td&gt;&lt;td&gt;TOML 1.0 準拠、高速&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;テスト&lt;&#x2F;td&gt;&lt;td&gt;testing + testify&lt;&#x2F;td&gt;&lt;td&gt;標準+簡潔なアサーション&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;ttt&lt;&#x2F;code&gt; は「一枚の紙」という思想にこだわった結果、機能を削ることで価値を磨けたツールになったと思います。私自身も便利に使っています。もっと高機能なツールはたくさん
ありますが、コンセプトに賛同いただける多くの方に使ってもらえれば幸いです。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeとの開発では、&lt;strong&gt;ドキュメント駆動&lt;&#x2F;strong&gt; と &lt;strong&gt;TDD&lt;&#x2F;strong&gt; の組み合わせが非常に効果的でした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ドキュメント駆動&lt;&#x2F;strong&gt;: 要件だけでなく方針を文書化するところから、Claude Codeと協働する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;TDD&lt;&#x2F;strong&gt;: 期待動作を定義し、品質を担保する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「Claude Codeに任せきり」ではなく「Claude Codeと協働する」開発スタイルとして、このアプローチはおすすめできます。&lt;&#x2F;p&gt;
&lt;p&gt;興味を持っていただけたら、ぜひ使ってみてください。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;tiny-task-tool&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;tiny-task-tool&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;この記事で紹介したドキュメント（concept.md, specification.md, architecture.md）は GitHub リポジトリの docs&#x2F; ディレクトリで公開しています。&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">多機能Todoアプリに疲れた方へ。「一枚の紙」だけのシンプルさを
再現したミニマルなタスク管理CLI「Tiny Task Tool (ttt)」を
開発しました。Claude Codeとの協働開発で実感した、
ドキュメント駆動とTDDの効果的な組み合わせをご紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>高市総理の衆議院解散表明 - 覚悟の政策転換</title>
        <published>2026-01-21T00:00:00+00:00</published>
        <updated>2026-01-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/takaichi-dissolution-speech/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/takaichi-dissolution-speech/</id>
        
            <content type="html">&lt;figure&gt;
  &lt;img src=&quot;takaichi.webp&quot; alt=&quot;高市早苗内閣総理大臣&quot; &#x2F;&gt;
  &lt;figcaption&gt;高市早苗内閣総理大臣 記者会見&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;2026年1月21日、高市早苗内閣総理大臣が衆議院解散を表明しました。&lt;&#x2F;p&gt;
&lt;p&gt;小泉首相の郵政解散は郵政民営化の賛否を問う単一争点でした。高市首相は違います。財政・安保・インテリジェンス・税制・憲法改正と、国家の根幹に関わる複数の大転換を、具体的な数字と制度設計にまで踏み込んで語りました。そして「高市早苗に国家経営を託していただけるのか」と、自らの進退を国民の判断に委ねました。&lt;strong&gt;これほど多岐にわたる具体的政策を掲げ、自らの進退を賭けた首相は過去に例を見ません&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;v6674b-RsfY&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;details&gt;
&lt;summary&gt;記者会見全文を読む&lt;&#x2F;summary&gt;
&lt;!-- textlint-disable --&gt;
&lt;figure&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;live&#x2F;v6674b-RsfY&quot;&gt;
&lt;p&gt;&lt;em&gt;2026年1月21日&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;ただいまより、高市内閣総理大臣による記者会見を行います。はじめに総理からご発言がございます。では、総理よろしくお願いいたします。&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;国民の皆様、私は本日、内閣総理大臣として1月23日に衆議院を解散する決断をいたしました。なぜ今なのか、高市早苗が内閣総理大臣で良いのかどうか、今、主権者たる国民の皆様に決めていただく、それしかない、そのように考えたからでございます。&lt;&#x2F;p&gt;
&lt;p&gt;日本列島を強く豊かに、今着手しなければ間に合いません。そのために高市内閣が取り組み始めたのは、全く新しい経済財政政策をはじめ、国の根幹に関わる重要政策の大転換です。私が自民党総裁選挙や、そして日本維新の会との連立政権合意書に書かれた政策など、大きな政策転換は今年の国会で審議される令和8年度予算や政府提出法案の形で本格化します。その多くが前回の衆議院選挙では自民党の政権公約には書かれていなかった政策です。また、前回の衆議院選挙の時には、私、高市早苗が日本の国家経営を担う可能性すら想定されていませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;解散というのは重い重い決断です。逃げないため、先送りしないため、そして国民の皆様とご一緒に日本の進路を決めるための決断です。私自身も内閣総理大臣としての身体をかけます。高市早苗に国家経営を託していただけるのか、国民の皆様に直接ご判断をいただきたい。日本は議員内閣制の国ですから、国民の皆様が直接内閣総理大臣を選ぶことはできません。しかし、衆議院選挙は政権選択選挙と呼ばれます。自民党と日本維新の会で過半数の議席を賜れましたら高市総理、そうでなければ野田総理か斉藤総理か別の方か、間接的ですが国民の皆様に内閣総理大臣を選んでいただくことにもなります。&lt;&#x2F;p&gt;
&lt;p&gt;今、衆議院でも参議院でも過半数の議席を持たない自民党の総裁が内閣総理大臣を務めている。また、前回の衆議院選挙では自民党・公明党の連立政権を前提に国民の皆様の審判を仰ぎました。今や連立政権の枠組みも変わりました。だからこそ、政治の側の都合ではなく、国民の皆様の意志に正面から問いかける道を選びました。&lt;&#x2F;p&gt;
&lt;p&gt;私は3回目の挑戦で、昨年10月4日に自民党総裁に就任しました。その直後に26年間も連立パートナーだった公明党との突然の別れ。自民党総裁にはなったものの、衆議院でも参議院でも自民党が過半数の議席を得られていない中での国会での首班指名選挙に臨むことになりました。内閣総理大臣に就任するための道は険しいものでした。新たに連立パートナーとなった日本維新の会の皆様をはじめ、衆参両院で他の会派の皆様のお力添えもいただいて、薄氷を踏む思いで何とか首班指名選挙では勝利し、昨年10月21日に内閣総理大臣に就任しました。&lt;&#x2F;p&gt;
&lt;p&gt;この日から、高市内閣が政権選択選挙の洗礼を受けていないということをずっと気にかけてまいりました。しかしながら、特に国民の皆様が直面する物価高対策については、これはもう待ったなしの課題でございました。高市内閣として速やかに対策を打つ必要がありました。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣が編成した令和7年度補正予算で措置したガソリン・軽油の値下げ、電気代・ガス代支援、重点支援地方交付金、物価高対応子育て応援手当により、一世帯あたり標準的には年間8万円を超える支援額となることが見込まれます。ガソリンと軽油の価格については、補助金も活用したことで、すでに値下がりしています。電気代とガス代の支援も、まさに今月から始まっています。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣の発足時、私たちの命を守る医療機関の多くが赤字で、介護事業者の倒産件数は過去最高でした。必要な医療が受けられなくなる、ご高齢の方や障害をお持ちの方が居場所がなくなってしまう、大きな危機感を抱き続けてまいりました。赤字の医療機関・介護事業者を中心に、報酬改定を待たずに前倒しで医療・介護等支援パッケージを補正予算に盛り込みました。また、介護従事者や介護職員の皆様に対し、幅広く月1万円から最大1.9万円の賃上げ支援を実施することとしました。&lt;&#x2F;p&gt;
&lt;p&gt;各省庁や地方自治体には7年度補正予算の早期執行を要請しました。物価高対策を含む生活の安全保障については、順次必要な対策が進んでいる最中です。経済運営に空白を作らない万全の体制を整えた上での解散であることを、ここに明確に申し上げます。&lt;&#x2F;p&gt;
&lt;p&gt;当面の対策を打つことができたこのタイミングで、政策実現のためのギアをもう一段上げていきたい。拉致問題の解決に向けて、首脳同士で正面から向き合い、具体的な成果に結びつけたい。また、国論を二分するような大胆な政策改革にも果敢に挑戦していきたい。昨年末までに衆議院と参議院で本会議で質疑を受け、二巡の予算委員会審議に対応する中で、その思いはますます募りました。不安定な日本政治の現状、永田町の厳しい現実を痛いほど実感したこの3ヶ月間でもありました。&lt;&#x2F;p&gt;
&lt;p&gt;「信なくば立たず」であります。重要な政策転換について国民の皆様に正面からお示しし、その是非について堂々と審判を仰ぐことが、民主主義国家のリーダーの責務だと考えました。&lt;&#x2F;p&gt;
&lt;p&gt;その本丸は「責任ある積極財政」です。これまでの経済財政政策を大きく転換するものです。行き過ぎた緊縮志向、未来への投資不足、この流れを高市内閣で終わらせます。様々なリスクを最小化し、先端技術を花開かせるための戦略的な財政出動は、私たちの暮らしの安全安心を確保するとともに、雇用と所得を増やし、消費マインドを改善し、事業収益が上がり、税率を上げずとも税収が自然増に向かう強い経済を実現する取り組みです。&lt;&#x2F;p&gt;
&lt;p&gt;第一の柱は、リスクを最小化する危機管理投資です。例えば、食料安全保障の確立により、何があっても食べ物に困らない日本を作る。すべての農地をフル活用できる環境を整え、農業にも林業にも漁業にも最新の技術を活用し、日本の食品を広く世界市場に展開することによって、国内外で需要を増やしながら供給力も強くします。日本のスタートアップが世界トップレベルの技術を誇る完全閉鎖型植物工場や陸上養殖施設の海外展開でも、日本は大いに稼げます。&lt;&#x2F;p&gt;
&lt;p&gt;また、エネルギー・資源安全保障の強化も重要です。電力を安定的に安価に供給できる対策を講ずることは、私たちの暮らしと日本の産業を守るために必要なことです。エネルギーの技術を展開することが必要です。日本で発明されたペロブスカイト太陽電池の普及、小型モジュール炉など次世代革新炉や日本企業の技術が優位性を持つフュージョンエネルギーの早期社会実装、液浸冷却技術や光電融合技術などによる省エネ型データセンターの普及、酸化物型全固体電池の社会実装など、日本の強みを生かさなければもったいない。&lt;&#x2F;p&gt;
&lt;p&gt;経済安全保障も重要です。重要鉱物やお薬の原料などを一部の国に供給のほとんどを頼るということは、大きなリスクを伴います。高市内閣は、日本の自立性を高めるべく、資源や原料の国産化や調達先の多角化に向けた取り組みに既に着手しています。日本の技術や製品がなければ世界中が困る、日本の不可欠性は我が国の平和を守る手段にもなります。&lt;&#x2F;p&gt;
&lt;p&gt;このほか、災害から現在と未来の命を守る国土強靱化、医療・健康安全保障、サイバーセキュリティの強化など、危機管理投資を着実に進めます。世界共通の課題を解決する製品・サービス・インフラをいち早く国内で社会実装し、海外市場に展開することにより、私たちの安心の確保のみならず、経済成長にもつなげていきます。&lt;&#x2F;p&gt;
&lt;p&gt;欧米においても、政府が一歩前に出て官民が手を取り合って重要な社会課題の解決を目指す、新たな産業政策が大きな潮流となっています。しかし、私たちは長年そうした投資を十分には行ってきませんでした。国民の皆様の命と暮らしを守る、これは国の究極の使命です。不安を安心と希望へと変えていくために、大胆な危機管理投資が必要です。今そこにある危機に対して、行き過ぎた緊縮財政の呪縛を乗り越え、すぐにでも着手する責任があります。&lt;&#x2F;p&gt;
&lt;p&gt;第二の柱は、成長投資です。すでに高市内閣の日本成長戦略本部で定めた戦略17分野をはじめ、日本が優位性を有する技術を活かしたビジネス展開の促進、基礎研究分野を含めた人材力や研究開発力の強化、スタートアップ支援の強化など、新技術立国を実現します。また、地域発のアイデア創出を募り、大胆な投資促進策やインフラ整備を一体的に講ずることで、産業クラスターを全国各地に戦略的に形成します。&lt;&#x2F;p&gt;
&lt;p&gt;47都道府県のどこに住んでいても、安全に生活することができて、必要な医療や福祉や高度な教育を受けることができて、働く場所がある。「日本列島を強く豊かに」、高市内閣が目指す日本の姿です。そのためにも強い経済が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣は国の予算の作り方を根本から改めます。毎年度補正予算が組まれることを前提とした予算編成手法と決別し、必要な予算は当初予算で措置します。また、成果管理を徹底することを前提に、複数年度の財政出動をコミットする仕組みを構築します。これは、財政支出の予見可能性を高め、危機管理投資や成長投資に関して、民間事業者の方々に安心して設備投資や研究開発をしていただくためです。&lt;&#x2F;p&gt;
&lt;p&gt;令和8年度当初予算はその第一歩です。頭出しをしました。しかしながら、8年度予算の概算要求は私の就任前に終わっていました。よって、シーリングを含めた予算編成の方針の見直しは、今年の夏の概算要求の段階から取り組み、翌年度に予算を成立させるまでに2年の時間を要する大改革です。でも、必ずややり抜いてまいります。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣がこれまでに講じた物価高対策により、今年は実質賃金の伸びのプラス化が見込まれます。しかしながら、食料品の物価上昇率は高止まりする見通しです。強い経済実現のためには、国民の皆様の手取りを増やし、実質賃金上昇を確実なものとし、改善された消費マインドが経済の好循環を牽引する姿が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;物価高に苦しんでおられる中所得・低所得の皆様の負担を減らす上でも、現在軽減税率が適用されている飲食料品については、2年間に限り消費税の対象としないこと。これは昨年10月20日に私が署名した自民党と日本維新の会の連立政権合意書に書いた政策でもあり、私自身の悲願でもありました。今後設置される国民会議において、財源やスケジュールのあり方など、実現に向けた検討を加速します。&lt;&#x2F;p&gt;
&lt;p&gt;私の内閣総理大臣就任以来、株価は上昇しています。国民の皆様の大切な年金は株式によっても運用されています。強い経済の実現は、将来への不安を安心へと変えるものでもあります。こうした大胆な経済財政政策の転換により、経済の好循環を実現します。&lt;&#x2F;p&gt;
&lt;p&gt;過去最大規模となった令和8年度予算については、やりすぎだといった批判もございます。しかし、8年度予算では財政の持続可能性にしっかり配慮した結果、プライマリーバランスが28年ぶりに黒字化しました。8年度の政策のために必要な予算は、借金でなくまかなうことができた。借金で新しい政策を実施するわけではありません。&lt;&#x2F;p&gt;
&lt;p&gt;8年度予算では新規の国債発行額も29.6兆円に抑えました。リーマンショック後2番目に低い水準です。税収が増える中で、予算全体の公債への依存度も金融危機収束以降最も低い水準に抑えることができました。これこそが私が目指す「責任ある積極財政」のもとでの強い経済の実現です。&lt;&#x2F;p&gt;
&lt;p&gt;今後も成長率の範囲内に債務残高の伸び率を抑え、政府債務残高の対GDP比を引き下げていきます。それにより財政の持続可能性を実現します。具体的で客観的な指標を明示しながら、マーケットからの信認を確保していきます。&lt;&#x2F;p&gt;
&lt;p&gt;そして、国民の皆様の支持なくして、力強い外交・安全保障を展開していくこともできません。国際情勢はさらに厳しさを増しています。中国軍が台湾周辺で軍事演習を行いました。世界が依存し、民生用にも広く用いられるサプライチェーン上流の物資を管理下に置くことで、自国の主張に他国を屈服させようとする経済的威圧の動きも見られます。&lt;&#x2F;p&gt;
&lt;p&gt;我が国が「自由で開かれたインド太平洋」を提唱してから10年、その進化を目指します。これまで、ASEAN関連首脳会議、APEC首脳会合、トランプ大統領との首脳会談、G20サミット、中央アジア＋日本首脳会談、ゼレンスキー大統領やメローニ首相との会談をはじめ、国際会議の機会を利用した数多くの各国首脳との二国間会談など、数々の貴重な外交機会に恵まれました。&lt;&#x2F;p&gt;
&lt;p&gt;日米同盟を基軸に、日米韓、日米フィリピン、日米オーストラリア、日本・イタリア・イギリス（グローバルサウス）などとの連携をさらに強化してまいります。&lt;&#x2F;p&gt;
&lt;p&gt;そして、安全保障政策を抜本的に強化します。国家安全保障戦略、国家防衛戦略、防衛力整備計画、いわゆる戦略三文書を前倒しで改定します。ロシアのウクライナ侵略後、各国は無人機の大量運用を含む新しい戦い方、さらに一旦そういった事態が起きた場合、長期化する可能性が高いという想定のもと、長期戦への備えを急いでいます。これは前回戦略三文書を改定した2022年と比べて大きな変化です。その改定は急務であり、かつ旧来の議論の延長ではない抜本的な改定が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;抑止力のさらなる強化、サイバー・宇宙・電磁波など新領域への着実な対応、防衛産業・技術基盤のさらなる強化、自衛官の処遇の改善。自らの国を自らの手で守る、その覚悟のない国を誰も助けてはくれません。日本の平和と独立、国民の皆様の命を守り抜くために、現実的で強靱な安全保障政策へと踏み出してまいります。&lt;&#x2F;p&gt;
&lt;p&gt;インテリジェンス機能の強化も、国民の皆様の支持なくしては実現できない大きな課題です。十分な情報を集め、分析し、正確な判断を行う能力、つまり情報力が強くなければ、外交力も防衛力も経済力も技術力も強くはなりません。国家としての情報分析能力を高め、危機を未然に防ぎ、国益を戦略的に守る体制を整えます。&lt;&#x2F;p&gt;
&lt;p&gt;具体的には、国家としての情報力を強化する「国家情報局」の設置、外国から日本への投資の安全保障上の審査体制を強化する「対日外国投資委員会」の設置、インテリジェンス・スパイ防止関連法の制定です。これらすべてが急がれます。&lt;&#x2F;p&gt;
&lt;p&gt;また、私が自民党総裁選挙で訴えていた「給付付き税額控除」は、特に社会保険料の逆進性に苦しむ中所得層の手取りを増やせる政策です。その制度設計を含む持続可能な社会保障制度の構築は、党派を超えて日本の英知を結集して取り組むべき急務でございます。&lt;&#x2F;p&gt;
&lt;p&gt;そして、皇室典範と日本国憲法の改正、長年にわたり手がつけられてこなかった課題に正面から取り組みます。こうした重要政策は、安定した政治基盤と国民の皆様の明確な信任がなければ実現できません。曖昧な政治ではなく、進むべき方向を明確に示し、国民の皆様に堂々と信を問いたい。その覚悟で解散を決断しました。&lt;&#x2F;p&gt;
&lt;p&gt;自民党自身も変わらなければなりません。責任ある積極財政にも、安全保障政策の抜本強化にも、さまざまな批判があります。それでもなお、すべては国民の皆様のため、一糸乱れることなく政策の実行に打ち込んでいく。それなくして国民の皆様の信頼を得ることはできません。&lt;&#x2F;p&gt;
&lt;p&gt;昨年10月の自民党総裁選挙は熾烈な戦いでした。活発な政策論争を経て私が総裁に選ばれましたが、これはあくまで自民党員の皆様による審判を受けたに過ぎません。今回は特に大きく変わる一部の政策だけをご紹介しましたが、これらを含めて自民党が政権公約として掲げ、国民の皆様の審判を受ける。そして選挙が終わればその公約の実現に向けて、党一丸となって突き進んでいく。それは自民党が国民政党の原点に立ち戻るための戦いでもあります。&lt;&#x2F;p&gt;
&lt;p&gt;私は内閣総理大臣に就任して以来、国会の開会中であっても閉会中であっても、日本にいても海外にいても、働いて働いて働いて働いて働いて働いて働いてまいりました。選挙期間中も高市内閣は各府省庁の職員と共に働き続けます。&lt;&#x2F;p&gt;
&lt;p&gt;解散総選挙によって令和8年度予算の年度内成立は極めて困難になるのではないかとも言われています。その影響を最小限にとどめるため、1月23日に衆議院を解散した後、1月27日に公示、2月8日の投開票のスケジュールとすることで、速やかに総選挙を実施する考えです。&lt;&#x2F;p&gt;
&lt;p&gt;その上で、責任ある積極財政に賛同してくださる各党の皆様と力を合わせて、8年度予算の成立を可能な限り早く実現したい。それでも暫定予算の編成が必要になるかもしれません。その場合にも、高市内閣として4月からの実施を決定している、いわゆる高校の無償化、給食費無償化の予算については、関連法案の年度内成立や暫定予算の計上など、あらゆる努力をして実現してまいります。&lt;&#x2F;p&gt;
&lt;p&gt;むしろ選挙で国民の皆様の信任を賜ることができたら、その後の政策実現のスピードを加速することができると考えています。&lt;&#x2F;p&gt;
&lt;p&gt;これまで26年間にわたり、公明党の支持者の皆様には選挙のたびに自民党に多大なるご支援をいただいてきました。暑い真夏の選挙戦も、寒風吹き荒ぶ真冬の選挙も、街頭で、集会場で、あぜ道で、共に汗をかき、共に声を枯らして選挙を戦ってきました。今回の選挙では袂を分かつ結果となりましたが、改めて四半世紀の長きにわたるご支援に感謝を申し上げます。&lt;&#x2F;p&gt;
&lt;p&gt;同時に、自民党にとっては厳しい選挙戦になることを覚悟しなければならない。自民党の同志たちは公明党の支援を受けることができない。それだけではありません。わずか半年前の参議院選挙で共に戦った相手である立憲民主党に所属しておられた方々を、かつての友党が支援する。少し寂しい気持ちもいたしますが、これが現実です。&lt;&#x2F;p&gt;
&lt;p&gt;国民不在、選挙目当ての政治、永田町の論理に終止符を打たねばなりません。新しい国づくりへと踏み出します。&lt;&#x2F;p&gt;
&lt;p&gt;10年前の安倍晋三元総理大臣の言葉が思い出されます。「困難は元より覚悟の上です。しかし、未来は他人から与えられるものではありません。私たちが自らの手で切り開いていくものであります。」&lt;&#x2F;p&gt;
&lt;p&gt;今の日本にまさに必要な言葉です。挑戦しない国に未来はありません。守るだけの政治に希望は生まれません。希望ある未来は待っていてもやってこない。誰かが作ってくれるものでもない。私たち自身が決断し、行動し、作り上げていくものです。&lt;&#x2F;p&gt;
&lt;p&gt;だから私は今回の選挙、「自分たちで未来をつくる選挙」と名付けました。日本の未来は明るい、日本にはチャンスがある、みんなが自信を持ってそう言える、そう実感できる社会を作りたい。挑戦する人が評価され、頑張る人が報われ、困った時には助け合い、安心して家庭を持ち、夢をもって働ける国へ。私はその先頭に立ちたい。&lt;&#x2F;p&gt;
&lt;p&gt;だから私は逃げません。ぶれません。決断します。未来に責任を持つ政治を貫いてまいります。&lt;&#x2F;p&gt;
&lt;p&gt;今日生まれた赤ちゃんも、今年初めて投票する18歳の若者も、その多くは22世紀の日本を見ることができるでしょう。その時に日本という国が安全で豊かであるように、インド太平洋の輝く灯台となって、自由と民主主義の国として仰ぎ見られる日本であるように。&lt;&#x2F;p&gt;
&lt;p&gt;私は日本と日本人の底力を信じてやみません。日本の成長のスイッチを押しまくり、その可能性を解き放ちます。世界の真ん中で咲き誇る日本外交を実現します。&lt;&#x2F;p&gt;
&lt;p&gt;私、高市早苗は、内閣総理大臣として、様々な改革に取り組み、大きな政策転換を進めていきます。その道をご一緒に前に進んでいただけるのか、それとも不安定な政治の下で立ち止まってしまうのか、その選択を主権者である国民の皆様に委ねたいんです。&lt;&#x2F;p&gt;
&lt;p&gt;私は前に進みたい。国民の皆様と共に。日本はもっと強くなれる。日本はもっと豊かになれる。日本はもっと希望に満ちた国になれる。その未来を共に作りましょう。&lt;&#x2F;p&gt;
&lt;p&gt;改めて申し上げます。「日本列島を強く豊かに」、共に新しい時代を切り開いてまいりましょう。&lt;&#x2F;p&gt;
&lt;p&gt;結びに申し上げます。選挙は民主主義の根幹とはいえ、真冬の選挙戦です。特に雪国の皆様には、足元の悪い中、投票所まで大変なご足労をいただきますことを恐縮に存じます。また、年度末が近づくご多忙の時期に選挙業務に携わっていただく自治体の皆様に、心から感謝を申し上げます。&lt;&#x2F;p&gt;
&lt;p&gt;私からは以上です。ありがとうございます。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;figcaption&gt;
— &lt;cite&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;live&#x2F;v6674b-RsfY&quot;&gt;高市内閣総理大臣記者会見－令和8年1月19日&lt;&#x2F;a&gt;&lt;&#x2F;cite&gt;より文字起こし
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;!-- textlint-enable --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;評価できる点&quot;&gt;評価できる点&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;明確な解散理由と覚悟の提示&quot;&gt;明確な解散理由と覚悟の提示&lt;&#x2F;h3&gt;
&lt;p&gt;高市首相は「政権選択選挙の洗礼を受けていない」という正統性の問題を自ら認め、国民に信を問う姿勢を示しました。「信なくば立たず」という原則に基づく論理的な解散理由であり、「高市早苗に国家経営を託していただけるのか」と自らの身体をかける覚悟を表明しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;政策の具体性&quot;&gt;政策の具体性&lt;&#x2F;h3&gt;
&lt;p&gt;経済財政政策の本丸として「責任ある積極財政」を掲げました。第一の柱は危機管理投資です。食料安全保障、エネルギー・資源安全保障、経済安全保障、国土強靱化といった分野への投資を進めます。第二の柱は成長投資で、戦略17分野を定め、新技術立国の実現と産業クラスターの形成を目指します。&lt;&#x2F;p&gt;
&lt;p&gt;具体的な数字も示されました。一世帯あたり年間8万円超の支援額、プライマリーバランスの28年ぶりの黒字化、新規国債発行額29.6兆円（リーマンショック後2番目に低い水準）といった数値です。&lt;&#x2F;p&gt;
&lt;p&gt;技術分野にも踏み込んでいます。ペロブスカイト太陽電池、小型モジュール炉（SMR）や次世代革新炉、フュージョンエネルギー、液浸冷却技術や光電融合技術、酸化物型全固体電池、完全閉鎖型植物工場や陸上養殖施設といった具体的な技術名を挙げました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;財政規律への配慮&quot;&gt;財政規律への配慮&lt;&#x2F;h3&gt;
&lt;p&gt;「借金で新しい政策を実施するわけではない」と明言した点も重要です。成長率の範囲内に債務残高の伸び率を抑制し、政府債務残高の対GDP比を引き下げていくと目標を明示しています。「責任ある積極財政」として、積極財政と財政規律の両立を志向している点は評価できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;安全保障政策の抜本強化&quot;&gt;安全保障政策の抜本強化&lt;&#x2F;h3&gt;
&lt;p&gt;戦略三文書（国家安全保障戦略、国家防衛戦略、防衛力整備計画）の前倒し改定を表明しました。ウクライナ戦争後、各国は無人機の大量運用を含む新しい戦い方や長期戦への備えを急いでいます。これは前回戦略三文書を改定した2022年と比べて大きな変化であり、その改定は急務だという認識です。&lt;&#x2F;p&gt;
&lt;p&gt;具体的施策としては、抑止力のさらなる強化、サイバー・宇宙・電磁波など新領域への対応、防衛産業・技術基盤の強化、自衛官の処遇改善を挙げています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;インテリジェンス機能の強化&quot;&gt;インテリジェンス機能の強化&lt;&#x2F;h3&gt;
&lt;p&gt;この点は個人的に最も注目しています。G7諸国との比較で見ると、日本の現状は明らかに遅れています。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;国&lt;&#x2F;th&gt;&lt;th&gt;スパイ防止関連法制&lt;&#x2F;th&gt;&lt;th&gt;主要情報機関&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;米国&lt;&#x2F;td&gt;&lt;td&gt;Espionage Act等&lt;&#x2F;td&gt;&lt;td&gt;CIA、FBI、NSA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;英国&lt;&#x2F;td&gt;&lt;td&gt;Official Secrets Act&lt;&#x2F;td&gt;&lt;td&gt;MI5、MI6&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ドイツ&lt;&#x2F;td&gt;&lt;td&gt;刑法典第94条等&lt;&#x2F;td&gt;&lt;td&gt;BfV、BND&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;フランス&lt;&#x2F;td&gt;&lt;td&gt;刑法典411条等&lt;&#x2F;td&gt;&lt;td&gt;DGSI、DGSE&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;日本&lt;&#x2F;td&gt;&lt;td&gt;具体的な法律なし&lt;&#x2F;td&gt;&lt;td&gt;内調（権限限定的）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;高市首相は国家情報局の設置、対日外国投資委員会の設置、インテリジェンス・スパイ防止関連法の制定を掲げました。歴代首相が避けてきたこの課題に正面から取り組む姿勢は、地政学的リスクが高まる中で評価すべき点だと考えます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;選挙日程への配慮&quot;&gt;選挙日程への配慮&lt;&#x2F;h3&gt;
&lt;p&gt;予算成立への影響を最小化するため、最短日程を設定しました。1月23日に衆議院を解散し、1月27日に公示、2月8日に投開票という日程です。高校無償化・給食費無償化については暫定予算でも実現すると約束しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;外交方針の明確化&quot;&gt;外交方針の明確化&lt;&#x2F;h3&gt;
&lt;p&gt;「自由で開かれたインド太平洋」の進化を掲げ、日米同盟を基軸とした多国間連携を推進する方針を示しました。日米韓、日米フィリピン、日米オーストラリア、日本・イタリア・イギリスなどとの連携強化を進めます。拉致問題解決への意欲も表明しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;過去の首相との比較&quot;&gt;過去の首相との比較&lt;&#x2F;h2&gt;
&lt;p&gt;解散表明の具体性という観点で、過去の首相と比較してみました。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;首相&lt;&#x2F;th&gt;&lt;th&gt;解散名&lt;&#x2F;th&gt;&lt;th&gt;特徴&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;小泉純一郎（2005）&lt;&#x2F;td&gt;&lt;td&gt;郵政解散&lt;&#x2F;td&gt;&lt;td&gt;「賛成か反対か」単一争点。明確だが範囲が狭い&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;安倍晋三（2014）&lt;&#x2F;td&gt;&lt;td&gt;消費税延期&lt;&#x2F;td&gt;&lt;td&gt;増税延期の是非を問う。限定的&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;安倍晋三（2017）&lt;&#x2F;td&gt;&lt;td&gt;国難突破&lt;&#x2F;td&gt;&lt;td&gt;北朝鮮情勢・消費税使途変更。抽象的&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;岸田文雄（2021）&lt;&#x2F;td&gt;&lt;td&gt;就任直後&lt;&#x2F;td&gt;&lt;td&gt;「新しい資本主義」。具体性に欠ける&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;高市早苗（2026）&lt;&#x2F;td&gt;&lt;td&gt;自分たちで未来をつくる選挙&lt;&#x2F;td&gt;&lt;td&gt;多分野にわたる具体的政策転換を明示&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;高市首相の特異性&quot;&gt;高市首相の特異性&lt;&#x2F;h3&gt;
&lt;p&gt;今回のスピーチで示されたコミットメントの範囲は極めて広いです。財政政策では予算編成手法の根本改革と複数年度コミットを掲げました。具体的数字としてPB28年ぶり黒字、国債29.6兆円、支援額8万円を示しました。技術分野ではペロブスカイト、SMR、フュージョン、全固体電池といった具体名を挙げました。制度面では国家情報局、対日外国投資委員会、スパイ防止法の新設を掲げました。安保改革として戦略三文書の前倒し改定、税制では飲食料品の消費税2年間免除、社会保障では給付付き税額控除の制度設計、そして皇室典範と日本国憲法の改正にまで言及しました。&lt;&#x2F;p&gt;
&lt;p&gt;これほど多岐にわたる具体的政策を解散表明で明示した首相は過去に例を見ません。&lt;&#x2F;p&gt;
&lt;p&gt;小泉首相は「明確さ」では際立っていましたが、争点は郵政民営化の一点でした。高市首相は経済財政・安全保障・インテリジェンス・税制・憲法と、国家の根幹に関わる複数の大転換を同時に掲げています。&lt;&#x2F;p&gt;
&lt;p&gt;「後で言い逃れできない」レベルで具体的に語っている点で、過去に例を見ない覚悟の表明だと感じました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;総評&quot;&gt;総評&lt;&#x2F;h2&gt;
&lt;p&gt;高市首相の衆議院解散表明は、歴史的なスピーチだと評価できます。&lt;&#x2F;p&gt;
&lt;p&gt;第一に、正統性への誠実な向き合いです。政権選択選挙を経ていないことを自ら認め、信を問う姿勢を示しました。第二に、政策の具体性です。抽象的なスローガンではなく、数字・技術・制度を具体的に提示しました。第三に、覚悟の表明です。多岐にわたるコミットメントにより、後退の余地を自ら封じています。第四に、歴代首相が避けてきた課題への挑戦です。スパイ防止法、憲法改正といった困難な課題に正面から取り組む姿勢を示しました。&lt;&#x2F;p&gt;
&lt;p&gt;「日本列島を強く豊かに」というビジョンのもと、責任ある積極財政、安全保障の抜本強化、インテリジェンス機能の確立という三本柱を明確に打ち出しました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;だから私は逃げません。ぶれません。決断します。未来に責任を持つ政治を貫いてまいります。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;選挙の結果がどうなるかは分かりません。しかし、これほど明確に政策を掲げて信を問う姿勢は、日本の政治において久しく見なかったものだと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">高市総理の衆議院解散表明に胸が震えました。これほど多岐にわたる
具体的政策を掲げ、自らの進退を国民の判断に委ねた首相を、
私は知りません。覚悟の政策転換に込められた思いを綴ります。
</summary>
        </entry><entry xml:lang="en">
        <title>DJI機へのRemote IDインポート</title>
        <published>2026-01-20T00:00:00+00:00</published>
        <updated>2026-01-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/dji-remote-id-import/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/dji-remote-id-import/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;dji-remote-id-import&amp;#x2F;drone.webp?h=56ac3edb071f965c27c9&quot;
  alt=&quot;DJI NEO with FPV Goggles&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;経緯&quot;&gt;経緯&lt;&#x2F;h2&gt;
&lt;p&gt;DJI NEOの機体が損傷したため、DJI Care Refreshを利用して修理しました。
シリアル番号は変わりませんでしたが、実際には機体交換していただいたのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;この際に当然ながらRemote IDが消えていました。&lt;&#x2F;p&gt;
&lt;p&gt;使用しているスマートフォン（Android）で、DJI Flyを起動してRemote IDのインポートを行おうとしたところ、
DIPS2.0へのログインで止まってしまいインポートが完了しませんでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;原因&quot;&gt;原因&lt;&#x2F;h2&gt;
&lt;p&gt;原因はDJI Flyとスマートフォンの互換性だと推定しています。&lt;&#x2F;p&gt;
&lt;p&gt;DJI NEO購入当初はGoogle Pixel8 Proを使用しており、何の問題もなくRemote IDをインポートできました。
しかし、昨年Pixel8 ProからNothing Phone(3)に移行していました。&lt;&#x2F;p&gt;
&lt;p&gt;普段の飛行には問題なく使用できていたため気にしていませんでしたが、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;repair.dji.com&#x2F;help&#x2F;content?customId=01700006560&amp;amp;spaceId=17&amp;amp;re=JP&amp;amp;lang=ja&amp;amp;documentType&amp;amp;paperDocType=ARTICLE&quot;&gt;DJIの公式情報&lt;&#x2F;a&gt;によると、Nothing Phone(3)は対応モバイル端末になく、Pixel8 Proは対象機種でした。Android端末の場合、全ての機種を検証できないという問題があるので記載がないから動作しないかは機種によると思いますが、掲載がない機種だとサポートでも対応してもらえません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;対応策&quot;&gt;対応策&lt;&#x2F;h2&gt;
&lt;p&gt;DJI NEOと接続できる機器はスマートフォン以外に以下がありますが、どれもRemote IDのインポートはできません。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DJI RC-N3 送信機&lt;&#x2F;strong&gt; - スマートフォンを接続するタイプなので、スマートフォンの問題を解決できない&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DJI Goggles N3&lt;&#x2F;strong&gt; - DJIの機体ではゴーグルにRemote IDを書き込む機能を持たせていないようである&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DJI FPV送信機 3&lt;&#x2F;strong&gt; - 画面がないため、当然Remote IDのインポートはできない&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DJI RC Motion 3&lt;&#x2F;strong&gt; - 画面がないため、当然Remote IDのインポートはできない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私の場合は、DJI Air3SをDJI RC 2送信機を使って運用しているため、一時的にDJI RC 2にDJI NEOをペアリングしてRemote IDのインポートができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;通常の使用では問題が出ていなかったので気にしていませんでしたが、特にAndroidの場合はDJI Flyとの互換性が問題になるケースがあるので要注意です。&lt;&#x2F;p&gt;
&lt;p&gt;また、Avata2のようにゴーグルとDJI FPV送信機3で運用している場合も、初期のRemote IDのインポートだけはスマートフォン上からDJI Flyアプリで行わざるを得ないので要注意です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">DJI NEOの修理後にRemote IDが消失。スマートフォンとの
互換性問題に直面しましたが、DJI RC 2を使用することで
解決できました。同じ問題に遭遇した方への解決策をご紹介します。
</summary>
        </entry><entry xml:lang="en">
        <title>Logic ProのAIFファイルをラウドネス正規化してFLACに変換するスクリプト</title>
        <published>2026-01-14T00:00:00+00:00</published>
        <updated>2026-01-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/aif2flac/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/aif2flac/</id>
        
            <content type="html">&lt;h2 id=&quot;背景&quot;&gt;背景&lt;&#x2F;h2&gt;
&lt;p&gt;Logic Proでバウンスした音声ファイル(Aiff)をFLACに変換する際、適切な音量に正規化する必要があります。ffmpegの&lt;code&gt;loudnorm&lt;&#x2F;code&gt;フィルタを使うと高品質なラウドネス正規化が可能ですが、最良の結果を得るには2パス処理が推奨されます。&lt;&#x2F;p&gt;
&lt;p&gt;この2パス処理は以下のような手順です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;1回目の実行で音声のラウドネス値を測定&lt;&#x2F;li&gt;
&lt;li&gt;測定された値を確認し、手動で2回目のコマンドにコピー&lt;&#x2F;li&gt;
&lt;li&gt;2回目の実行で測定値を使用して正規化を適用&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;毎回この作業を手動で行うのは面倒なので、自動化するスクリプトを作成しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;スクリプトの内容&quot;&gt;スクリプトの内容&lt;&#x2F;h2&gt;
&lt;p&gt;現時点のコードは以下です。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;yostos&#x2F;004e57e4a905f933e227aa183e3a8fec&quot;&gt;Gist&lt;&#x2F;a&gt;でも公開しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;aif2flac.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Script to convert AIF files to FLAC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Uses two-pass loudness normalization method (measure first, then encode with measured values)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Copyright (c) 2026 yostos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Licensed under the MIT License&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# https:&#x2F;&#x2F;opensource.org&#x2F;licenses&#x2F;MIT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;VERBOSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Parse options&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;while&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-source&quot;&gt; $#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -gt&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ]];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    case&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; $1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        -v&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;|&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;--verbose&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            VERBOSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            shift&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        -h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;|&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;--help&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Usage: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; [-v|--verbose] &amp;lt;input_file.aif&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Options:&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  -v, --verbose    Show detailed ffmpeg output&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  -h, --help       Show this help message&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Error: Unknown option &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Usage: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; [-v|--verbose] &amp;lt;input_file.aif&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        *)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;            shift&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -z&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Usage: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; [-v|--verbose] &amp;lt;input_file.aif&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Use -h or --help for more information&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ! -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Error: File &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;#39; not found&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Generate output filename (change extension to .flac)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;OUTPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-variable z-other z-normal z-shell&quot;&gt;${INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;.flac&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;=== Step 1: Measuring loudness... ===&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Measure loudness and get JSON output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ffmpeg&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -i &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; -af &amp;quot;loudnorm=print_format=json&amp;quot; -f null -&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; 2&amp;gt;&amp;amp;1 |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -A&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Parsed_loudnorm&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Extract required values from JSON&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MEASURED_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&amp;quot;input_i&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -F&amp;#39;&amp;quot;&amp;#39; &amp;#39;{print $4}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MEASURED_TP&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&amp;quot;input_tp&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -F&amp;#39;&amp;quot;&amp;#39; &amp;#39;{print $4}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MEASURED_LRA&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&amp;quot;input_lra&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -F&amp;#39;&amp;quot;&amp;#39; &amp;#39;{print $4}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;MEASURED_THRESH&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&amp;quot;input_thresh&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -F&amp;#39;&amp;quot;&amp;#39; &amp;#39;{print $4}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;TARGET_OFFSET&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$LOUDNESS_JSON&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&amp;quot;target_offset&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -F&amp;#39;&amp;quot;&amp;#39; &amp;#39;{print $4}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Measurement results:&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  Input Integrated: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; LUFS&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  Input True Peak:  &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_TP&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; dBTP&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  Input LRA:        &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_LRA&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; LU&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  Input Threshold:  &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_THRESH&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; LUFS&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;  Target Offset:    &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET_OFFSET&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; LU&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;=== Step 2: Encoding to FLAC... ===&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Encode to FLAC using measured values&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$VERBOSE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-true&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Verbose mode: show all ffmpeg output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    ffmpeg&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -y -i &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;        -af &amp;quot;loudnorm=I=-14:TP=-1:LRA=11:measured_I=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_TP=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_TP&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_LRA=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_LRA&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_thresh=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_THRESH&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:offset=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET_OFFSET&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;:linear=true:print_format=summary&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;        -c:a flac &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Quiet mode: capture output and show only loudnorm summary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    FFMPEG_OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ffmpeg&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -y -hide_banner -i &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;        -af &amp;quot;loudnorm=I=-14:TP=-1:LRA=11:measured_I=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_TP=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_TP&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_LRA=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_LRA&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:measured_thresh=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$MEASURED_THRESH&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:offset=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET_OFFSET&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;:linear=true:print_format=summary&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;        -c:a flac &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; 2&amp;gt;&amp;amp;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    FFMPEG_EXIT_CODE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-source&quot;&gt;$?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Extract and display loudnorm summary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$FFMPEG_OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -A&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Input Integrated:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -v &amp;quot;^\[&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -v &amp;quot;^$&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Check for errors&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-source&quot;&gt; $FFMPEG_EXIT_CODE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -ne&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;        echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;        echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Error during encoding (exit code: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$FFMPEG_EXIT_CODE&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;        echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$FFMPEG_OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;=== Completed ===&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Output file: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Display file sizes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt; command&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -v du&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; &#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    INPUT_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;du&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -h &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;{print $1}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    OUTPUT_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;du&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -h &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_FILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; awk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;{print $1}&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Input file:  &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$INPUT_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Output file: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;使い方&quot;&gt;使い方&lt;&#x2F;h2&gt;
&lt;p&gt;AIFファイルのパスを引数に指定して実行します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;aif2flac.sh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.aif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;詳細な出力を確認したい場合は&lt;code&gt;-v&lt;&#x2F;code&gt;オプションを付けます。出力ファイルは同じディレクトリに&lt;code&gt;.flac&lt;&#x2F;code&gt;拡張子で保存されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;loudnormフィルタについて&quot;&gt;loudnormフィルタについて&lt;&#x2F;h2&gt;
&lt;p&gt;ffmpegの&lt;code&gt;loudnorm&lt;&#x2F;code&gt;フィルタは、EBU R128規格に基づいたラウドネス正規化を行うためのフィルタです。単純な音量の増減ではなく、人間の聴覚特性を考慮した知覚的な音量の均一化を実現します。&lt;&#x2F;p&gt;
&lt;p&gt;このスクリプトでは以下のパラメータを使用しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;I=-14&lt;&#x2F;code&gt;: 目標のIntegrated Loudness（LUFS単位）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;TP=-1&lt;&#x2F;code&gt;: True Peak値の上限（dBTP単位）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;LRA=11&lt;&#x2F;code&gt;: Loudness Range（LU単位）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;I=-14 LUFS&lt;&#x2F;code&gt;は、Spotify、YouTube Music、Apple Musicなどの主要なストリーミングサービスが採用している標準的なラウドネス基準です。世間一般で広く使われているこの基準を参考にすることで、適切な音量バランスを保つことができます。&lt;&#x2F;p&gt;
&lt;p&gt;1パス処理では入力音声の特性を考慮せずに正規化するため、音質劣化の可能性があります。2パス処理では、1回目で測定した入力音声の実際の値を2回目の処理に使用することで、より正確で高品質な正規化が可能になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Logic Proから書き出した音声ファイルをFLACに変換する際の2パス処理を自動化することで、手動でパラメータをコピーする手間がなくなり、作業効率が大幅に向上しました。&lt;&#x2F;p&gt;
&lt;p&gt;今後は、複数ファイルの一括処理や、ターゲットラウドネス値のカスタマイズなどの機能を追加するかもしれません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Logic Proでバウンスした音声ファイルをFLACに変換する際、
ffmpegのloudnormフィルタによる2パス処理を自動化する
Bashスクリプトを作成しました。測定と適用を一度のコマンドで
完結させ、手作業を排除して作業効率を大幅に向上させます。
</summary>
        </entry><entry xml:lang="en">
        <title>5つのクラシックUADプラグイン：黄金時代のスタジオレジェンド</title>
        <published>2026-01-11T00:00:00+00:00</published>
        <updated>2026-01-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/universal-audio-plugins/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/universal-audio-plugins/</id>
        
            <content type="html">&lt;p&gt;I took advantage of Universal Audio&#x27;s sale to build my mastering-focused plugin collection. Here&#x27;s a deep dive into the 5 legendary plugins I picked up. These include the Pultec EQP-1A, LA-2A, and Lexicon 224. I also got the SSL G Bus Compressor and Ampex ATR-102. I&#x27;ll cover their fascinating history from The Beatles to 1980s pop. You&#x27;ll also learn exactly how to use each one in Logic Pro on individual tracks, buses, or the master channel for professional results.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Plugins_I_Purchased&quot;&gt;The Plugins I Purchased&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;Pultec_EQP-1A&quot;&gt;Pultec EQP-1A&lt;&#x2F;h3&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;universal-audio-plugins&amp;#x2F;pultec-eqp.webp?h=248c8c31d851554f5062&quot;
  alt=&quot;Pultec EQP-1A&quot; width=&quot;954&quot; height=&quot;427&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Developed by Pulse Techniques in 1951, the EQP-1A has been cherished for over 70 years as the most musical passive equalizer. Its unique design combining tube amplification with passive components prevents phase distortion even when boosting or cutting, creating a beautiful harmonic enhancement effect.&lt;&#x2F;p&gt;
&lt;p&gt;The famous &quot;low-end trick&quot; of simultaneously boosting and cutting the low frequencies is widely known as a technique for adding both punch and clarity to kicks and bass. It has been used across generations, from The Beatles to modern hip-hop.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;In Logic Pro&lt;&#x2F;strong&gt;, the Pultec EQP-1A is extremely versatile and can be used at multiple stages of production. As an &lt;strong&gt;Audio FX insert on individual tracks&lt;&#x2F;strong&gt;, it excels at shaping kick drums and bass guitars with the famous &quot;low-end trick,&quot; adding clarity while maintaining weight. On vocal tracks, gentle high-frequency boosts add air and presence without harshness. The EQP-1A is also highly effective on &lt;strong&gt;instrument buses&lt;&#x2F;strong&gt; (such as drum buses or vocal buses), adding cohesive tonal shaping across grouped elements. Additionally, many mastering engineers use it on the final &lt;strong&gt;master track&lt;&#x2F;strong&gt; to add subtle sweetness and harmonic richness to the entire mix. The UAD plugin collection includes the HLF-3C for high frequencies and MEQ-5 for midrange, extending the Pultec family&#x27;s sonic palette across the frequency spectrum.&lt;&#x2F;p&gt;
&lt;div style={{ clear: &#x27;both&#x27; }}&gt;&lt;&#x2F;div&gt;
&lt;h3 id=&quot;LA-2A_Tube_Compressor&quot;&gt;LA-2A Tube Compressor&lt;&#x2F;h3&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;universal-audio-plugins&amp;#x2F;la-2a-comp.webp?h=ef6189eaa5de7837f525&quot;
  alt=&quot;LA-2A Tube Compressor&quot; width=&quot;950&quot; height=&quot;427&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Released by Teletronix in 1965, the LA-2A is a legendary compressor combining tube amplification with a T4 optical element. Its unique operation with automatically adjusted attack and release times achieves extremely natural and musical compression for vocals, bass, and guitar. Particularly for vocal processing, it has been beloved for nearly 60 years as &quot;smooth and transparent compression,&quot; used on countless classic albums from Motown to modern pop. Despite its simple operation, the sound quality it delivers is irreplaceable.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;In Logic Pro&lt;&#x2F;strong&gt;, the LA-2A excels primarily as an &lt;strong&gt;Audio FX insert on individual tracks&lt;&#x2F;strong&gt;.
The most common application is on lead vocals, gently controlling dynamics while maintaining presence and clarity.
It&#x27;s also highly effective on bass guitar tracks, adding sustain and consistency without making the tone sound over-compressed.
For acoustic guitars and electric guitar solos, the LA-2A provides a musical cohesion that naturally blends the performance into the mix.
Some engineers use it on a &lt;strong&gt;vocal bus&lt;&#x2F;strong&gt; for group processing when handling background vocals or vocal stacks, applying gentle glue compression across multiple vocal tracks.
Unlike mix bus compressors, the LA-2A is rarely used on the master track.
Its characteristics are best showcased when applied to specific sources rather than the entire mix.&lt;&#x2F;p&gt;
&lt;div style={{ clear: &#x27;both&#x27; }}&gt;&lt;&#x2F;div&gt;
&lt;h3 id=&quot;Lexicon_224_Digital_Reverb&quot;&gt;Lexicon 224 Digital Reverb&lt;&#x2F;h3&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;universal-audio-plugins&amp;#x2F;lexicon-224.webp?h=454d030e1d141728bf32&quot;
  alt=&quot;Lexicon 224 Digital Reverb&quot; width=&quot;383&quot; height=&quot;692&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Introduced in 1978, the Lexicon 224 revolutionized music production as the world&#x27;s first commercial digital reverb. It achieved precisely controlled spatial representation that was impossible with previous plate or spring reverbs. This created the rich and expansive reverb that characterized 1980s pop, rock, and fusion sounds. The &quot;sparkling and three-dimensional reverberation&quot; when used on drums and vocals became an iconic sound of that era.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;In Logic Pro&lt;&#x2F;strong&gt;, the Lexicon 224 is most effectively used as a &lt;strong&gt;send effect on an Aux track&lt;&#x2F;strong&gt;. Create an Aux channel and insert the Lexicon 224 as an Audio FX. Then use send controls to route multiple tracks (vocals, drums, guitars) to this reverb bus. This approach allows independent blending of wet reverb signal and dry source signal for each track. It enables precise control of spatial depth and placement.&lt;&#x2F;p&gt;
&lt;p&gt;The most common applications include drum overheads and room mics for creating classic 1980s drum ambience. Lead and background vocals benefit from added depth and dimension. Guitar solos and synth pads can create vast soundscapes. Using reverb on an Aux track (rather than as an insert) also conserves CPU resources. Multiple tracks can share the same reverb instance. Some engineers use the Lexicon 224 on &lt;strong&gt;dedicated reverb buses for specific instruments&lt;&#x2F;strong&gt; (such as &quot;Drum Reverb&quot; or &quot;Vocal Reverb&quot;). This enables different reverb settings for different sonic elements in the mix.&lt;&#x2F;p&gt;
&lt;div style={{ clear: &#x27;both&#x27; }}&gt;&lt;&#x2F;div&gt;
&lt;h3 id=&quot;SSL_G_Bus_Compressor&quot;&gt;SSL G Bus Compressor&lt;&#x2F;h3&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;universal-audio-plugins&amp;#x2F;ssl-g-bus-comp.webp?h=166aa606d32b9729df8f&quot;
  alt=&quot;SSL G Bus Compressor&quot; width=&quot;303&quot; height=&quot;782&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;In the 1980s, the master bus compressor installed in the SSL 4000 G Series console established a legendary status. It became known as equipment that imparts a &quot;glue&quot; effect to the entire mix.
Despite its modest ratio settings, it excels at integrating the entire mix into a cohesive single sound image. It&#x27;s particularly powerful in rock, pop, and dance music.
The effect of creating punch and cohesion simply by inserting it on the stereo bus is called &quot;SSL Glue&quot; and has become an indispensable technique in modern mixing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;In Logic Pro&lt;&#x2F;strong&gt;, the SSL G Bus Compressor is primarily used on the &lt;strong&gt;Stereo Out (master track)&lt;&#x2F;strong&gt;.
As its name suggests, it&#x27;s inserted as one of the final processors in the master chain, bringing the entire mix together.
Typically used with gentle settings (2:1 or 4:1 ratio, slow attack, auto release) to achieve 1-3 dB of gain reduction.
Many engineers insert this early in the mixing process, &quot;mixing into the compressor,&quot; allowing the compressor to shape mixing decisions from the start.
The SSL G Bus Compressor is also effective on &lt;strong&gt;submix buses&lt;&#x2F;strong&gt;. On drum buses, it can add punch and cohesion when kick, snare, and other drum elements work together.
It&#x27;s also commonly used on instrument group buses (all guitars, all synths, background vocals) to create a more unified sound within each section.
Unlike individual track compressors like the LA-2A, the SSL G Bus Compressor reveals its true value in processing multiple elements simultaneously. It&#x27;s not suitable for application to single tracks.&lt;&#x2F;p&gt;
&lt;div style={{ clear: &#x27;both&#x27; }}&gt;&lt;&#x2F;div&gt;
&lt;h3 id=&quot;Ampex_ATR-102_Mastering_Tape_Recorder&quot;&gt;Ampex ATR-102 Mastering Tape Recorder&lt;&#x2F;h3&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;universal-audio-plugins&amp;#x2F;ampex-atr-102.webp?h=3d0db3886b9f76fea316&quot;
  alt=&quot;Ampex ATR-102 Mastering Tape Recorder&quot; width=&quot;703&quot; height=&quot;770&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Introduced in the late 1970s, the Ampex ATR-102 is known as the pinnacle of 2-track mastering tape recorders. Through its unique sonic characteristics of tape saturation, tape compression, and high-frequency roll-off, it adds warmth and depth lacking in digital recordings. Many engineers have passed tracks through this equipment in the final mastering stage, imparting cohesion and a &quot;glue-like&quot; effect to the entire work. The UAD emulation also allows selection of tape speed (15&#x2F;30 ips) and tape type.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;In Logic Pro&lt;&#x2F;strong&gt;, the Ampex ATR-102 is almost exclusively used on the &lt;strong&gt;Stereo Out (master track)&lt;&#x2F;strong&gt;, placed as the final processor in the signal chain or very close to it.
Insert it after the mix bus compressor and EQ, before the final limiter or metering plugin.
Tape emulation provides subtle analog saturation and gentle compression effects.
As a result, it helps the mix feel more cohesive and &quot;finished.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Typical settings include &lt;strong&gt;15 ips&lt;&#x2F;strong&gt; for warmer, more saturated characteristics emphasizing low-end bloom, or &lt;strong&gt;30 ips&lt;&#x2F;strong&gt; for cleaner, more transparent tape sound achieving tight low-frequency response.
The choice of tape formulation (GP9, 456, 900) further shapes tonal character and saturation behavior.
Some mixing engineers use the ATR-102 on submix buses (such as drum buses or instrument buses),
adding analog character to specific elements before they reach the master fader.&lt;&#x2F;p&gt;
&lt;p&gt;However, its primary purpose is processing in the final mastering stage, providing the &quot;analog finish&quot; typical of digital production.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;These five Universal Audio plugins represent different eras of studio technology, but when used together they form a comprehensive toolkit for modern music production. Understanding where each plugin fits in the signal flow is key to using them effectively.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Individual Track Processing (Audio FX)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Start with Pultec EQP-1A for tonal shaping of kick drums, bass, and vocals&lt;&#x2F;li&gt;
&lt;li&gt;Follow with LA-2A for natural, musical compression on vocals, bass, and guitars&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Group Processing (Buses)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Use Pultec on instrument buses (drum bus, vocal bus) to add cohesive tonal character&lt;&#x2F;li&gt;
&lt;li&gt;Apply SSL G Bus Compressor to submix buses for punch and glue&lt;&#x2F;li&gt;
&lt;li&gt;Send multiple sources to Lexicon 224 on an Aux track for shared spatial processing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Mix Finishing (Master Track)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Insert SSL G Bus Compressor early in the master chain for overall mix cohesion&lt;&#x2F;li&gt;
&lt;li&gt;Add Pultec for final tonal sweetness and harmonic enhancement&lt;&#x2F;li&gt;
&lt;li&gt;Finish with Ampex ATR-102 as the final &quot;analog finish&quot; before limiting&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;What makes Universal Audio&#x27;s emulations special is not just their sonic accuracy, but how they encourage you to work in the way professional studios have for decades. Each plugin embodies decades of engineering wisdom in its design, teaching you not just what sounds good, but why it sounds good.&lt;&#x2F;p&gt;
&lt;p&gt;Building this mastering-focused collection by taking advantage of UAD&#x27;s sale was a worthwhile investment. These aren&#x27;t just plugins—they&#x27;re tools that connect modern digital workflows to the golden age of analog recording, bringing warmth, character, and musicality to every project.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Universal Audioのセールを活用して、マスタリング中心の
プラグインコレクションを構築しました。今回購入した5つの
伝説的なプラグイン—Pultec EQP-1A、LA-2A、Lexicon 224、
SSL G Bus Compressor、Ampex ATR-102—について、
ビートルズから1980年代ポップスまでの魅力的な歴史と、
Logic Proでの実際の使い方を詳しく解説します。
</summary>
        </entry><entry xml:lang="en">
        <title>Sublime Text - 職人主義的ソフトウェアの美学と持続可能なビジネスモデル</title>
        <published>2026-01-08T00:00:00+00:00</published>
        <updated>2026-01-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/sublime-text/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/sublime-text/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;
  Table of Contents
  &lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Sublime Textは、高速性と簡潔さを重視したクロスプラットフォームのテキストエディタです。
派手な統合機能や巨大なエコシステムを志向せず、「編集体験そのものの質」を最優先に設計されている点が最大の特徴といえます。&lt;&#x2F;p&gt;
&lt;p&gt;2008年にリリースされて以来、その圧倒的なパフォーマンスと洗練されたUIで多くの開発者に愛されてきました。
かつてはAtomやBracketsといった競合が次々と登場する中でも独自の地位を確立していましたが、
2015年のVisual Studio Codeの登場によって状況は一変しました。
Microsoftの豊富なリソースとオープンソースモデルによって急速に機能を拡充したVS Codeは、
瞬く間に開発者コミュニティの主流となったのです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、Sublime Textは市場シェアを失っても開発を継続し、現在も継続的にアップデートされています。
それを可能にしているのが、独自のビジネスモデルと一貫した設計思想です。
2026年現在もBuild 4000番台の開発が進められており、その品質は今も一級品を保ち続けています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._技術的・思想的特徴&quot;&gt;1. 技術的・思想的特徴&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1.1._圧倒的なパフォーマンス&quot;&gt;1.1. 圧倒的なパフォーマンス&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;起動が非常に速い&lt;&#x2F;li&gt;
&lt;li&gt;大規模ファイルや巨大リポジトリでも編集が軽快&lt;&#x2F;li&gt;
&lt;li&gt;入力遅延がほぼ発生しない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textの最大の強みは、何よりもそのパフォーマンスです。
エディタを起動してから実際に編集を開始できるまでの時間は、ほとんどの環境で1秒以内に収まります。
VS CodeがElectronベースでJavaScriptエンジンの起動コストを伴うのに対し、Sublime TextはC++ とカスタムUIツールキットで実装されており、
OSネイティブに近い起動速度を実現しています。&lt;&#x2F;p&gt;
&lt;p&gt;また、数万行を超える大規模ファイルや、数十万ファイルを含む巨大なリポジトリでも動作が重くなることはほとんどありません。
GitのLinuxカーネルリポジトリのような巨大なコードベースでも、ファイル検索や全文検索が瞬時に完了します。
これは独自の描画エンジンとインデックス機構によって実現されており、「常に軽いこと」を最優先事項として設計されているためです。&lt;&#x2F;p&gt;
&lt;p&gt;特に重要なのが、入力に対するレスポンスの速さです。キーボードからの入力が画面に反映されるまでの遅延が極めて少なく、タイピングの快適さが損なわれません。この「入力遅延のなさ」は、長時間コーディングを行う開発者にとって、想像以上に重要な要素となります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1.2._ミニマルで静かな_UI&quot;&gt;1.2. ミニマルで静かな UI&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;不要なアニメーションや通知が少ない&lt;&#x2F;li&gt;
&lt;li&gt;情報密度は高いが、視覚的ノイズが少ない&lt;&#x2F;li&gt;
&lt;li&gt;IDE的な自動介入を極力行わない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textのユーザーインターフェースは、極めて静かです。
近年のソフトウェアに多く見られる派手なアニメーションや、頻繁なポップアップ通知、自動的に表示されるヒントやサジェストといった「親切な機能」は最小限に抑えられています。&lt;&#x2F;p&gt;
&lt;p&gt;これは決して機能が貧弱だからではなく、ユーザーの集中を妨げない設計を意図的に選択した結果です。
情報密度は高く保たれており、必要な情報はすぐにアクセスできますが、視覚的なノイズは徹底的に排除されています。
エディタという道具が前面に出てくることなく、書いているコードそのものに集中できる環境が提供されているのです。&lt;&#x2F;p&gt;
&lt;p&gt;また、IDEによくある「自動的な修正」や「勝手な補完」といった介入も控えめです。
開発者が意図しないコード変更や、予期しないフォーマットが適用されることはほとんどありません。
これは一見不便に思えるかもしれませんが、自分の書いたコードを完全にコントロールしたい開発者にとっては、むしろ信頼できる特性となります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1.3._保守的で一貫した設計思想&quot;&gt;1.3. 保守的で一貫した設計思想&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;等幅フォント・静的フォント前提&lt;&#x2F;li&gt;
&lt;li&gt;Variable Fontの軸指定や高度なタイポグラフィ機能は非対応&lt;&#x2F;li&gt;
&lt;li&gt;フォントフォールバックや複雑な文字組みも対象外&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textは、技術トレンドを積極的に追いかけるタイプのソフトウェアではありません。例えば、近年広まってきたVariable Font（可変フォント）の軸指定機能や、高度なタイポグラフィ機能には対応していません。また、複雑なフォントフォールバックや文字組み処理も、必要最小限にとどめられています。&lt;&#x2F;p&gt;
&lt;p&gt;これを見ると「技術的に遅れている」と感じるかもしれませんが、実際には異なります。これらの機能は確かに便利ですが、実装にはレンダリングエンジンの複雑化が伴い、結果としてパフォーマンスの低下を招きます。Sublime Textは、&lt;strong&gt;パフォーマンス低下を招く機能を意図的に排除している&lt;&#x2F;strong&gt; のです。&lt;&#x2F;p&gt;
&lt;p&gt;この姿勢は、ソフトウェア全体に一貫しています。新機能を追加する際には、常に「これはパフォーマンスに影響するか」
「これは本当にエディタに必要な機能か」という問いが立てられ、慎重に判断されています。
結果として、機能の追加ペースは遅いものの、一度実装された機能は安定しており、長期間にわたって同じように動作し続けます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1.4._拡張は可能だが、万能ではない&quot;&gt;1.4. 拡張は可能だが、万能ではない&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Pythonによるプラグイン拡張&lt;&#x2F;li&gt;
&lt;li&gt;LSP対応により、現代的な言語サポート機能は充実&lt;&#x2F;li&gt;
&lt;li&gt;ただしIDE全体としての統合度はVS Codeに及ばない&lt;&#x2F;li&gt;
&lt;li&gt;エコシステムは小規模&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textには、Pythonによるプラグイン機構が備わっており、機能を拡張可能です。Package Controlというパッケージマネージャーを使えば、コミュニティが開発した様々なプラグインを簡単にインストールできます。また、Language Server Protocol (LSP) にも対応しており、現代的なコード補完や定義ジャンプ、型チェックといった言語サポート機能は充実しています。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、VS Codeのような統合開発環境としての&lt;strong&gt;トータルな統合度&lt;&#x2F;strong&gt;を期待すると、物足りなさを感じるかもしれません。デバッガやターミナル、バージョン管理といった周辺機能の統合度や、拡張機能エコシステムの規模では、VS Codeには及びません。&lt;&#x2F;p&gt;
&lt;p&gt;エコシステムも、VS Codeの巨大なマーケットプレイスと比べれば小規模です。しかし、これも設計思想の表れといえます。Sublime Textは「プラットフォーム」になることを目指しておらず、あくまで「高品質なエディタ」であり続けることを選択しているのです。必要十分な拡張性は保ちつつ、複雑化や肥大化は避けるというバランスが取られています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._継続的な開発と進化&quot;&gt;2. 継続的な開発と進化&lt;&#x2F;h2&gt;
&lt;p&gt;Sublime Textは市場シェアを失った後も、着実に開発を継続しています。2024年から2025年にかけても、
複数の重要なアップデートがリリースされており、「保守的」でありながらも「停滞していない」ことを示しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2.1._最近の主要アップデート&quot;&gt;2.1. 最近の主要アップデート&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Build 4200（2025年5月リリース）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;2025年5月21日にリリースされたBuild 4200では、以下の重要な変更が含まれています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Python プラグインの近代化&lt;&#x2F;strong&gt;: Python 3.3のサポート終了を段階的に開始し、Python 3.8への移行を進めている。さらに、次の開発サイクルではPython 3.13への移行が計画されており、プラグインエコシステムの技術的負債を解消する取り組みが進められている。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OS サポートの見直し&lt;&#x2F;strong&gt;: 将来のバージョンでは、macOSの最低要件が10.9から10.13に引き上げられる。また、Windows 7、8、8.1のサポートが終了し、Windows 10以降が最低要件となる。この変更により、より新しいOS機能を活用できるようになる。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI の柔軟性向上&lt;&#x2F;strong&gt;: サイドバーを右側に配置できる &lt;code&gt;sidebar_on_right&lt;&#x2F;code&gt; 設定が追加される。これは小さな変更に見えるが、長年のユーザー要望に応えたもの。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ビルドシステムの強化&lt;&#x2F;strong&gt;: ビルドシステムで &lt;code&gt;&quot;interactive&quot;: true&lt;&#x2F;code&gt; を指定することで、インタラクティブな入力ボックスを表示できるようになった。これにより、コンパイル時の引数指定などがより便利になっている。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;構文ハイライトの刷新&lt;&#x2F;strong&gt;: SQL、ActionScript、Diff、Bash、Graphvizの構文ハイライトが書き直され、より正確で高速になった。また、ZshとTOMLの構文ハイライトが新たに追加されている。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Build 4180（2024年8月リリース）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;2024年8月12日にリリースされたBuild 4180では、プラットフォーム固有の問題に対応しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Linux: KDE環境でのドラッグ＆ドロップ問題への対処（kwin 6.0.4でも修正済み）&lt;&#x2F;li&gt;
&lt;li&gt;Windows: スクロールバーをドラッグした際の動作改善&lt;&#x2F;li&gt;
&lt;li&gt;その他、複数のバグ修正&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;2.2._Language_Server_Protocol（LSP）サポートの充実&quot;&gt;2.2. Language Server Protocol（LSP）サポートの充実&lt;&#x2F;h3&gt;
&lt;p&gt;Sublime TextのLSPサポートは、近年大きく進化しています。Package Controlから利用できる &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lsp.sublimetext.io&#x2F;&quot;&gt;LSP パッケージ&lt;&#x2F;a&gt;は、VS Codeと同等の高度な言語サポートを実現しています。&lt;&#x2F;p&gt;
&lt;p&gt;主要な言語サーバーには、以下のようなものがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LSP-typescript &#x2F; LSP-javascript&lt;&#x2F;strong&gt;: TypeScriptとJavaScriptのサポート&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-pyright &#x2F; LSP-pylsp&lt;&#x2F;strong&gt;: Pythonの型チェックと補完&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-rust-analyzer&lt;&#x2F;strong&gt;: Rustの高度なIDE機能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-intelephense &#x2F; LSP-Phpactor&lt;&#x2F;strong&gt;: PHPの補完と定義ジャンプ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-clangd&lt;&#x2F;strong&gt;: C&#x2F;C++ の高度な補完&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-json &#x2F; LSP-css &#x2F; LSP-html&lt;&#x2F;strong&gt;: Web開発のサポート&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LSP-angular &#x2F; LSP-vue&lt;&#x2F;strong&gt;: モダンなフロントエンドフレームワーク&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらのヘルパーパッケージは、言語サーバーの自動インストールと設定を簡単にし、追加機能も提供しています。例えばLSP-pylspは2025年12月にも更新されており、エコシステムが活発に維持されていることがわかります。&lt;&#x2F;p&gt;
&lt;p&gt;興味深いのは、Sublime TextのLSP実装は同じファイルタイプに対して複数の言語サーバーを同時に実行できる点です。例えば、Pythonプロジェクト内のLSP-pyrightで一般的な機能を使いつつ、LSP-ruffでリンター警告を同時に表示するといった使い方が可能です。&lt;&#x2F;p&gt;
&lt;p&gt;このように、Sublime Textは「保守的」な設計思想を保ちながらも、現代的な開発環境に必要な機能を着実に取り込んでいます。急激な変化は起こりませんが、必要な進化は確実に続けられているのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._市場における位置づけ&quot;&gt;3. 市場における位置づけ&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;かつては高速GUIエディタの代表格&lt;&#x2F;li&gt;
&lt;li&gt;現在はニッチだが評価の高い存在&lt;&#x2F;li&gt;
&lt;li&gt;VS Codeのような統合開発環境とは競争しない立場&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;2010年代前半、Sublime Textは高速なGUIエディタの代表格として、多くの開発者に愛用されていました。TextMateの後継とも目され、Macユーザーを中心に広く普及していたのです。その影響力は大きく、VS Codeの初期バージョンはSublime Textのキーバインドやショートカットを参考にしたとも言われています。&lt;&#x2F;p&gt;
&lt;p&gt;しかし現在では、市場シェアという観点では完全にニッチな存在となりました。Stack Overflowの開発者調査でも、利用率は数パーセント程度にとどまっています。それでも、使い続けているユーザーからの評価は一貫して高く、「速さ」「安定性」「シンプルさ」を求める開発者の間では根強い支持を得ています。&lt;&#x2F;p&gt;
&lt;p&gt;興味深いのは、Sublime Textのユーザー層です。多くは、日常的にNeovimやEmacsといったCLIエディタを使いつつ、GUIが必要な場面や、より視覚的な操作が適している場面でSublime Textを併用しています。つまり、「メインのIDE」として使うのではなく、職人的な開発者の道具箱の中の1つとして位置づけられているのです。&lt;&#x2F;p&gt;
&lt;p&gt;VS Codeのような統合開発環境とは、もはや直接競争する立場にありません。機能の豊富さや拡張性では勝負せず、「軽快さ」「シンプルさ」「信頼性」という独自の価値を提供し続けることで、固有のポジションを確立しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4._ビジネスモデル&quot;&gt;4. ビジネスモデル&lt;&#x2F;h2&gt;
&lt;p&gt;Sublime Textが長期にわたって開発を継続できているのは、独自のビジネスモデルによるところが大きいです。多くのソフトウェアが無料化やサブスクリプションモデルに移行する中、Sublime Textは独自の道を歩んでいます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4.1._買い切り型ライセンス_+_更新権&quot;&gt;4.1. 買い切り型ライセンス + 更新権&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;一度購入すれば永続的に使用可能&lt;&#x2F;li&gt;
&lt;li&gt;購入時点から &lt;strong&gt;約3年間のアップデート権&lt;&#x2F;strong&gt; が付与される&lt;&#x2F;li&gt;
&lt;li&gt;更新権が切れても使用不可にはならない&lt;&#x2F;li&gt;
&lt;li&gt;新しいメジャー版や最新ビルドを使いたい場合のみ再購入&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textのライセンスは、買い切り型を基本としています。一度購入すれば、そのバージョンは永続的に使用可能です。ただし、購入時点から約3年間のアップデート権が付与され、その期間内にリリースされた新バージョンには無料でアップグレードできます。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、更新権が切れても、ソフトウェアが使用不可になることはない点です。購入時のバージョンは引き続き使用でき、セキュリティアップデートなどの重要な修正も提供されます。新しいメジャーバージョンや最新機能を使いたい場合にのみ、ライセンスを再購入すればよいのです。&lt;&#x2F;p&gt;
&lt;p&gt;このモデルは、月額・年額で支払い続けなければ使えなくなるSaaS的なサブスクリプションとは明確に異なります。ユーザーは「払い続けなければ使えなくなる」というプレッシャーから解放され、自分のペースでアップグレードを判断できます。一方で、開発側も定期的な収入が見込めるため、持続可能な開発が可能になっています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4.2._非_SaaS・低固定費構造&quot;&gt;4.2. 非 SaaS・低固定費構造&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;クラウドサービスではない&lt;&#x2F;li&gt;
&lt;li&gt;常時稼働サーバや大規模インフラが不要&lt;&#x2F;li&gt;
&lt;li&gt;開発チームは少人数&lt;&#x2F;li&gt;
&lt;li&gt;営業・マーケティングコストが極小&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textのもう1つの強みは、極めて低い固定費構造にあります。Sublime Textはクラウドサービスではなく、ユーザーのローカル環境で完結するスタンドアロンアプリケーションです。そのため、常時稼働するサーバーインフラや、大規模なデータセンターといった継続的なコストが一切発生しません。&lt;&#x2F;p&gt;
&lt;p&gt;開発チームも非常に小規模で、創設者のJon Skinner氏を中心とした数名程度で運営されていると言われています。大規模な開発組織を抱える必要がなく、人件費も抑えられています。&lt;&#x2F;p&gt;
&lt;p&gt;また、営業やマーケティングにも積極的に投資していません。広告を出すこともなく、口コミとブランド力だけで販売を続けています。Sublime Textの公式サイトは極めてシンプルで、派手なマーケティングメッセージもありません。&lt;&#x2F;p&gt;
&lt;p&gt;この結果、&lt;strong&gt;ユーザー数が爆発的に増えなくても黒字が成立する&lt;&#x2F;strong&gt;構造になっています。年間数万人程度のライセンス購入があれば、十分に開発を継続できるのです。これは、成長至上主義に陥らず、持続可能な開発を可能にする重要な要素となっています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4.3._法人・プロユーザーによる支え&quot;&gt;4.3. 法人・プロユーザーによる支え&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;個人購入に加え、法人でのまとめ買い&lt;&#x2F;li&gt;
&lt;li&gt;経費精算による定期的な更新&lt;&#x2F;li&gt;
&lt;li&gt;長期利用を前提としたユーザー層&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textのユーザーには、個人利用だけでなく、法人でのまとめ買いも多いと考えられます。開発チームが一斉にライセンスを購入するケースや、企業の標準ツールとして採用されているケースもあります。特に、パフォーマンスや安定性を重視する企業にとって、Sublime Textは魅力的な選択肢となります。&lt;&#x2F;p&gt;
&lt;p&gt;また、プロフェッショナルな開発者が多いため、ライセンスを経費として精算し、定期的に更新する傾向があります。個人で$99を支払うのは躊躇するかもしれませんが、会社の経費であれば、更新のハードルは下がります。&lt;&#x2F;p&gt;
&lt;p&gt;Sublime Textのユーザーは、長期利用を前提としている傾向が強いです。一度使い始めたら、数年から十年以上にわたって使い続けるユーザーが多いのです。これは、Sublime Textの安定性とシンプルさが、長期的な信頼を生んでいることを示しています。&lt;&#x2F;p&gt;
&lt;p&gt;一人あたりのLTV（顧客生涯価値）は、サブスクリプションモデルと比べると低めですが、非常に安定しています。ユーザーの離脱率が低く、定期的な更新が見込めるため、予測可能な収益構造となっているのです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4.4._成長を前提としない経営姿勢&quot;&gt;4.4. 成長を前提としない経営姿勢&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;ベンチャーキャピタルに依存しない&lt;&#x2F;li&gt;
&lt;li&gt;利用データの収集・広告モデルなし&lt;&#x2F;li&gt;
&lt;li&gt;ユーザー数や市場シェアの拡大を至上命題としない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sublime Textの最も特徴的な点は、成長を前提としない経営姿勢にあります。ベンチャーキャピタルからの資金調達を受けておらず、外部投資家からの「成長しろ」というプレッシャーとは無縁です。そのため、ユーザー数を爆発的に増やすことや、市場シェアを最大化することを目標とする必要がありません。&lt;&#x2F;p&gt;
&lt;p&gt;また、ユーザーの利用データを収集して分析したり、広告モデルで収益化したりといったことも一切行っていません。Sublime Textは、インターネット接続を必要とせず、ローカル環境で完結するため、プライバシーの観点でも安心できます。テレメトリデータの送信もなく、ユーザーがどのような使い方をしているかは開発者にはわかりません。&lt;&#x2F;p&gt;
&lt;p&gt;この経営姿勢は、現代のスタートアップ文化やシリコンバレーの常識とは真逆です。「急成長」「ユニコーン」「市場の独占」といった価値観とは距離を置き、その代わりに**「小さく、長く、静かに続ける」**ことを選択しています。&lt;&#x2F;p&gt;
&lt;p&gt;これは、短期的な利益最大化ではなく、長期的な持続可能性を重視した結果です。派手さはありませんが、10年後、20年後も同じように開発が続いている。そんな可能性を信じさせてくれるのが、Sublime Textなのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5._Sublime_Merge_-_同じ思想の_Git_クライアント&quot;&gt;5. Sublime Merge - 同じ思想の Git クライアント&lt;&#x2F;h2&gt;
&lt;p&gt;Sublime HQは、テキストエディタのSublime Textだけでなく、Gitクライアントの &lt;strong&gt;Sublime Merge&lt;&#x2F;strong&gt; も開発しています。Sublime Mergeは、Sublime Textと同じ設計思想をGitクライアントに適用したソフトウェアです。&lt;&#x2F;p&gt;
&lt;p&gt;Sublime Mergeの特徴も、Sublime Textと共通しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;起動が非常に速く、大規模リポジトリでも軽快に動作する&lt;&#x2F;li&gt;
&lt;li&gt;UIがシンプルで、視覚的なノイズが少ない&lt;&#x2F;li&gt;
&lt;li&gt;複雑なGit操作も、キーボード中心の操作で素早く実行できる&lt;&#x2F;li&gt;
&lt;li&gt;独自のマージツールが優れており、コンフリクト解決が快適&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Gitクライアントの世界でも、GitKrakenやSourceTreeといった多機能なGUIツールが主流となっていますが、Sublime Mergeはそれらとは異なるアプローチを取っています。必要な機能に絞り込み、パフォーマンスと操作性を優先した結果、Gitの複雑な操作を快適に行えるツールとなっています。&lt;&#x2F;p&gt;
&lt;p&gt;ビジネスモデルもSublime Textと同様で、買い切り型ライセンス + 約3年間の更新権という形式です。Sublime TextとSublime Mergeをセットで購入すると割引が適用されるバンドルライセンスも提供されています。&lt;&#x2F;p&gt;
&lt;p&gt;私自身も、Sublime Textの思想に共鳴し、今回Sublime Textのライセンスを更新すると同時に、Sublime Mergeのライセンスも購入しました。どちらも、長く使い続けられる信頼できるツールだと感じています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;6._評価と総括&quot;&gt;6. 評価と総括&lt;&#x2F;h2&gt;
&lt;p&gt;Sublime Textは次のようなソフトウェアです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;主役ではなくなったが、品質は今も一級品&lt;&#x2F;li&gt;
&lt;li&gt;時代の要請すべてには応えないが、軸はぶれない&lt;&#x2F;li&gt;
&lt;li&gt;利便性よりも、編集体験の純度を重視&lt;&#x2F;li&gt;
&lt;li&gt;商業的成功よりも、持続可能性を優先&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;その結果として、&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「勢いはないが、消えもしない」&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;という独特のポジションを確立しています。&lt;&#x2F;p&gt;
&lt;p&gt;現代のソフトウェア業界では、「より多くの機能」「より大きなエコシステム」「より速い成長」が正義とされがちです。しかし、Sublime Textはそれとは異なる価値観を示しています。機能を抑制し、シンプルさを保ち、持続可能な開発を優先することで、長期的な信頼を獲得しているのです。&lt;&#x2F;p&gt;
&lt;p&gt;このアプローチは、すべてのソフトウェアに適用できるわけではありません。しかし、少なくとも「開発ツール」という領域においては、十分に成立する戦略であることを、Sublime Textは証明しています。&lt;&#x2F;p&gt;
&lt;p&gt;Sublime Textは、現代では稀少になった&lt;strong&gt;職人主義的ソフトウェアと、そのビジネスモデルの実例&lt;&#x2F;strong&gt;です。派手さはありませんが、確かな品質と一貫した思想を持ち続けることで、静かに、しかし確実に生き残っているのです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">高速性と簡潔さを追求し続けるテキストエディタSublime Text。
VS Codeに市場シェアを奪われても品質を保ち続ける職人主義的な
設計思想と、サブスクリプションに依存しないワンタイム購入モデルの
持続可能性について考察します。
</summary>
        </entry><entry xml:lang="en">
        <title>終わらない物語:『ストレンジャー・シングス』へのオマージュ</title>
        <published>2026-01-04T00:00:00+00:00</published>
        <updated>2026-01-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/never-ending-story/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/never-ending-story/</id>
        
            <content type="html">&lt;p&gt;『Stranger Things』の最終話を見終え、私はまだ余韻に浸っています。&lt;&#x2F;p&gt;
&lt;p&gt;物語全体を振り返ると、私の中で最も鮮明に残っていたのが、DustinとSusieが無線越しに歌う、あの瞬間でした。
その記憶をもとに、あの曲を再現してみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2240923832&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;never-ending-story-stranger-things-version&quot; title=&quot;Never Ending Story (Stranger Things version)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Never Ending Story (Stranger Things version)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;あのシーンが描かれるのは、
シーズン3・第8話（最終話）「スターコート・モールの戦い（The Battle of Starcourt）」。
世界の命運がかかった極限状況の中で、Dustinが必要としていた数式の答えと引き換えに、Susieが求めたのは
『The NeverEnding Story』を歌うことでした。&lt;&#x2F;p&gt;
&lt;p&gt;緊迫した展開を一時停止させるように、無線から流れ出す歌声。
その軽やかさと素朴さは、80年代カルチャーへの愛情と、
『Stranger Things』という作品が持つ遊び心そのものだと感じています。&lt;&#x2F;p&gt;
&lt;p&gt;無線越しに届く声の距離感や、少し不揃いな間。
そして「本来ならありえない場面」が生む温度は、なんとも言えない余韻を残すシーンでした。&lt;&#x2F;p&gt;
&lt;p&gt;終わってしまった物語と、終わらない記憶のあいだに置かれた、ささやかな再現です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">『Stranger Things』シーズン3最終話で、極限状況の中で響いた
DustinとSusieの『Never Ending Story』。世界の危機と
無線越しのデュエットという対比が生んだ、あの瞬間の温度と余韻を、
楽曲の再現を通じて振り返ります。
</summary>
        </entry><entry xml:lang="en">
        <title>スキャンPDFの処理を自動化するClaude Codeプラグインを作った</title>
        <published>2026-01-02T00:00:00+00:00</published>
        <updated>2026-01-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/pdf-processor-plugin/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/pdf-processor-plugin/</id>
        
            <content type="html">&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;書籍をスキャナーで読み取ってPDF化すると、複数のファイルに分かれてしまったり、テキスト検索ができなかったりします。また、目次がないため、そのままでは使いにくい状態になります。これらを手作業で処理するのは非常に面倒です。&lt;&#x2F;p&gt;
&lt;p&gt;そこで、スキャンしたPDFの処理を自動化するClaude Codeプラグイン「pdf-processor」を開発しました。このプラグインを使えば、複数のPDFファイルのマージ、OCR処理、目次の追加を簡単に実行でます。&lt;&#x2F;p&gt;
&lt;p&gt;プラグインのソースコードは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&#x2F;tree&#x2F;main&#x2F;plugins&#x2F;pdf-processor&quot;&gt;GitHub&lt;&#x2F;a&gt;で公開しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pdf-processorプラグインの機能&quot;&gt;pdf-processorプラグインの機能&lt;&#x2F;h2&gt;
&lt;p&gt;このプラグインは、スキャンされたPDFファイルを実用的なデジタル書籍に変換するためのツールです。主な機能は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;複数PDFファイルのマージ&lt;&#x2F;strong&gt;: バラバラのPDFファイルを1つに統合&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OCR処理&lt;&#x2F;strong&gt;: 日本語に対応したOCR処理により、画像PDFをテキスト検索可能に変換&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ファイルサイズ最適化&lt;&#x2F;strong&gt;: 画像の圧縮により、ファイルサイズを削減&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;目次（ブックマーク）の追加&lt;&#x2F;strong&gt;: PDFビューアで使える目次を自動生成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;メタデータ編集&lt;&#x2F;strong&gt;: PDFのタイトル、著者などのメタデータを設定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;使い方&quot;&gt;使い方&lt;&#x2F;h2&gt;
&lt;p&gt;pdf-processorプラグインは、3つのステップで処理を行います。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ステップ1:_前処理の実行&quot;&gt;ステップ1: 前処理の実行&lt;&#x2F;h3&gt;
&lt;p&gt;まず、&lt;code&gt;&#x2F;pdf-processor:preprocess&lt;&#x2F;code&gt; コマンドを実行して、複数のPDFファイルをマージし、OCR処理を行います。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;pdf-processor:preprocess&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claudeが以下の処理を自動で実行します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;対象となるPDFファイルの確認&lt;&#x2F;li&gt;
&lt;li&gt;PDFのマージ&lt;&#x2F;li&gt;
&lt;li&gt;OCR処理の実行&lt;&#x2F;li&gt;
&lt;li&gt;画像の最適化&lt;&#x2F;li&gt;
&lt;li&gt;目次テンプレートファイルの生成&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;処理が完了すると、OCR処理済みのPDFファイルと、メタデータをダンプしたファイルが生成されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ステップ2:_目次情報の編集&quot;&gt;ステップ2: 目次情報の編集&lt;&#x2F;h3&gt;
&lt;p&gt;ダンプされたメタデータファイルをエディタで開き、目次情報を追加します。目次は以下の形式で記述します。&lt;&#x2F;p&gt;
&lt;p&gt;各目次項目は &lt;code&gt;BookmarkBegin&lt;&#x2F;code&gt; で始まり、以下の3つのフィールドで構成されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BookmarkTitle&lt;&#x2F;code&gt;: 目次のタイトル（章名など）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;BookmarkLevel&lt;&#x2F;code&gt;: 目次の階層レベル（1が最上位、2が第2階層）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;BookmarkPageNumber&lt;&#x2F;code&gt;: 目次項目が指すページ番号&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;例として、以下のように追加します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: 第1章 はじめに&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: 1.1 背景&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: 1.2 目的&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: 第2章 実装&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;ステップ3:_目次の適用&quot;&gt;ステップ3: 目次の適用&lt;&#x2F;h3&gt;
&lt;p&gt;目次情報を編集したら、&lt;code&gt;&#x2F;pdf-processor:apply-toc&lt;&#x2F;code&gt; コマンドを実行して、最終的なPDFファイルを生成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;pdf-processor:apply-toc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコマンドを実行すると、OCR処理済みのPDFに目次が追加され、完成版のPDFファイルが作成されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;技術的な詳細&quot;&gt;技術的な詳細&lt;&#x2F;h2&gt;
&lt;p&gt;pdf-processorプラグインは、以下のツールを組み合わせて実装しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OCRmyPDF&lt;&#x2F;strong&gt;: PythonベースのOCRツールで、Tesseract OCRエンジンを使用してPDFにテキストレイヤーを追加&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PDFtk&lt;&#x2F;strong&gt;: PDFの操作に特化したコマンドラインツールで、マージやメタデータの編集に使用&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ghostscript&lt;&#x2F;strong&gt;: PDFの最適化と圧縮に使用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらのツールのインストールや設定は、プラグインのREADMEに詳しく記載されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;pdf-processorプラグインを使うことで、スキャンしたPDFの処理を大幅に効率化できます。複数ファイルのマージ、OCR処理、目次の追加といった面倒な作業を、Claude Codeとの対話だけで完了できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;スキャンした書籍や資料をデジタル化する際に、ぜひ活用してみてください。プラグインのソースコードは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&#x2F;tree&#x2F;main&#x2F;plugins&#x2F;pdf-processor&quot;&gt;GitHub&lt;&#x2F;a&gt;で公開しているので、カスタマイズや改善の提案も歓迎します。&lt;&#x2F;p&gt;
</content>
        <summary type="html">書籍をスキャナーで読み取ってPDF化した後の処理を簡単にするため、
Claude Codeプラグイン「pdf-processor」を開発しました。
複数PDFのマージ、OCR処理、ファイルサイズ最適化、目次の追加を
自動化し、スキャン書籍を実用的なデジタル書籍に変換します。
</summary>
        </entry><entry xml:lang="en">
        <title>The aespa Controversy and NHK Kohaku Ratings Drop</title>
        <published>2026-01-01T00:00:00+00:00</published>
        <updated>2026-01-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/dirty-aespa/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/dirty-aespa/</id>
        
            <content type="html">&lt;h2 id=&quot;The_Ratings_Drop_Mystery&quot;&gt;The Ratings Drop Mystery&lt;&#x2F;h2&gt;
&lt;p&gt;Online rumors have been circulating that the approximately 4% viewership drop around 8 PM during NHK&#x27;s New Year&#x27;s Eve Kohaku music show corresponds to &lt;strong&gt;aespa&#x27;s&lt;&#x2F;strong&gt; performance time. The group has been embroiled in controversy after posting images of atomic bomb mushroom cloud figures on X (formerly Twitter).&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;dirty-aespa&amp;#x2F;ratings.webp?h=8d1c6dd194de2b0ae53c&quot;
  alt=&quot;Viewership ratings around 8 PM on December 31, 2026&quot; width=&quot;1077&quot; height=&quot;938&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;However, the reality is quite different and somewhat ironic. aespa&#x27;s actual performance time was later in the evening. The time slot during this ratings dip was actually occupied by Time Machine 3&#x27;s live broadcast from Kusatsu Onsen hot springs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Broader_Issue&quot;&gt;The Broader Issue&lt;&#x2F;h2&gt;
&lt;p&gt;Regardless of the timing discrepancy, I cannot forgive NHK&#x27;s decision to feature this controversial group while ignoring the voices of many viewers. This is particularly insensitive given that the show&#x27;s hosts, Hiroyuki Ariyoshi and Haruka Ayase, are both from Hiroshima.&lt;&#x2F;p&gt;
&lt;p&gt;The group&#x27;s insensitive actions and NHK&#x27;s controversial decision to feature them remain deeply problematic. This is true even if one considers that their behavior may stem from anti-Japanese education.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;大晦日の紅白歌合戦の視聴率が20時前後で4%程度の落ち込んでいるのが、
日本への原爆投下のきのこ雲のフィギュアをx.comに投稿した問題で
炎上している&lt;strong&gt;aespa&lt;&#x2F;strong&gt;の出演時間だとネットではもっぱらの噂になっています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2026&amp;#x2F;01&amp;#x2F;dirty-aespa&amp;#x2F;ratings.webp?h=8d1c6dd194de2b0ae53c&quot;
  alt=&quot;2026-12-31 20時前後の視聴率&quot; width=&quot;1077&quot; height=&quot;938&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;まぁ、実際には出演時間帯はもう少し遅く、この落ち込んでいる時間帯は
タイムマシン3号が草津温泉から中継をやっていた時間帯で笑う。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、反日教育されているとはいえ、あの非常識なグループと多くの視聴者の声を無視したNHKのことは、絶対に許しません。&lt;&#x2F;p&gt;
&lt;p&gt;だって、司会をやっていた有吉弘行と綾瀬はるかは広島出身だからな。&lt;&#x2F;p&gt;
</content>
        <summary type="html">NHK紅白歌合戦でのaespa出演をめぐる騒動と、午後8時台の
視聴率低下の偶然の一致について検証します。原爆きのこ雲画像投稿への
批判と、実際のデータから見える視聴者動向を客観的に分析しました。
</summary>
        </entry><entry xml:lang="en">
        <title>IBMを救った伝説のCEO、Louis Gerstner氏逝去</title>
        <published>2026-01-01T00:00:00+00:00</published>
        <updated>2026-01-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/01/louis-gerstner/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/01/louis-gerstner/</id>
        
            <content type="html">&lt;p&gt;IBMの現CEO、アービンド・クリシュナ氏が2025年12月28日（日曜日）に従業員へのメールで
訃報を発表しました。死因については明らかにされていませんが、フロリダ州ジュピターにて
永眠されたとのことです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;危機のIBMを引き継ぐ&quot;&gt;危機のIBMを引き継ぐ&lt;&#x2F;h2&gt;
&lt;p&gt;Louis V. Gerstner Jr.氏は、マッキンゼー・アンド・カンパニーでキャリアをスタートさせた後、
アメリカン・エキスプレスで要職を歴任しRJRナビスコのCEOを経て1993年4月にIBMの会長兼CEOに就任しました。IBM史上初めての外部からのトップ登用でした。&lt;&#x2F;p&gt;
&lt;p&gt;当時のIBMは、まさに存亡の危機に瀕していました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1992年に64億ドルの収益に対し50億ドルの損失を計上&lt;&#x2F;li&gt;
&lt;li&gt;1993年には損失が80億ドルに拡大する見込み&lt;&#x2F;li&gt;
&lt;li&gt;かつて43ドルだった株価は12ドルまで下落&lt;&#x2F;li&gt;
&lt;li&gt;メインフレーム市場が急速に縮小し、収益の90%以上を依存していた主力事業が崩壊寸前&lt;&#x2F;li&gt;
&lt;li&gt;事業部門の分社化が実際に進行中（「Baby Blues」と呼ばれた施策）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;1991年から1992年にかけて、IBMは各事業部門を自律的な子会社に分社化を実行していました。
ディスクドライブ部門（AdStar）、ミドルレンジコンピュータ部門（IBM Application Business Systems）、
メインフレーム部門（IBM Enterprise Systems）、プリンタ部門（Pennant Systems、Lexmark）、
そしてPC部門（IBM Personal Computer Company）などが次々と分離されました。&lt;&#x2F;p&gt;
&lt;p&gt;日本でも同様の動きがあり、日本アイ・ビー・エム株式会社から日本アイ・ビー・エム・サービス株式会社など、
複数の会社に分社化が進められていました。&lt;&#x2F;p&gt;
&lt;p&gt;Gerstner氏の就任時、IBMは破産か解体かの選択を迫られていたのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;大胆な変革と戦略的転換&quot;&gt;大胆な変革と戦略的転換&lt;&#x2F;h2&gt;
&lt;p&gt;Gerstner氏は就任直後から、従来の常識を覆す大胆な改革に着手しました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;分社化の中止と再統合&quot;&gt;分社化の中止と再統合&lt;&#x2F;h3&gt;
&lt;p&gt;最も重要かつ大胆な決断は、既に実行されていた分社化を中止し、
分離された事業部門を再びIBMに統合したことです。&lt;&#x2F;p&gt;
&lt;p&gt;当時の経営陣や業界の常識では、巨大企業を小さな単位に分割して機動性を高めることが
解決策だと考えられていました。しかしGerstner氏は、ハードウェア、ソフトウェア、サービスの
シナジーこそがIBMの強みであると見抜き、「統合ソリューションプロバイダー」としての道を選びました。&lt;&#x2F;p&gt;
&lt;p&gt;この決断は当時、大きな反発を招きましたが、後に正しかったことが証明されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;サービス事業への転換&quot;&gt;サービス事業への転換&lt;&#x2F;h3&gt;
&lt;p&gt;ハードウェア中心のビジネスモデルから、サービスとソリューションへと大胆に舵を切りました。
この戦略転換により、IBMはテクノロジー企業からビジネスパートナーへと生まれ変わったのです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;徹底的なコスト削減&quot;&gt;徹底的なコスト削減&lt;&#x2F;h3&gt;
&lt;p&gt;変革には痛みを伴いました。Gerstner氏は以下の施策を断行しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;35,000人の従業員のレイオフ（当時の従業員数は約30万人）&lt;&#x2F;li&gt;
&lt;li&gt;不動産やIBMの美術品コレクションなど、非生産的資産の売却&lt;&#x2F;li&gt;
&lt;li&gt;IT運用コストを半減させ、20億ドル以上のコスト削減を実現（1994-1997年）&lt;&#x2F;li&gt;
&lt;li&gt;企業史上最大級の89億ドルの損失計上（1993年）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;文化の変革&quot;&gt;文化の変革&lt;&#x2F;h3&gt;
&lt;p&gt;「古き良きIBM」の文化からの脱却も推し進めました。IBM製品のみで動作する
クローズドなシステムの販売を止め、オープンで顧客中心のアプローチへと転換しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;驚異的な成果&quot;&gt;驚異的な成果&lt;&#x2F;h2&gt;
&lt;p&gt;Gerstner氏のリーダーシップの下、IBMは驚異的な復活を遂げました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;株価&lt;&#x2F;strong&gt;: 9倍に上昇（約800%増）。同期間のS&amp;amp;P500指数が154%上昇だったのに対し、圧倒的なパフォーマンス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;時価総額&lt;&#x2F;strong&gt;: 290億ドルから1680億ドルへと約6倍に増加&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;収益性&lt;&#x2F;strong&gt;: 1994年末には黒字化を達成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;従業員数&lt;&#x2F;strong&gt;: 退任時には65,000人増加し、雇用も拡大&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;わずか9年間で、破綻寸前の企業を世界有数のテクノロジー企業へと再生させたのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;IBM退任後の活動&quot;&gt;IBM退任後の活動&lt;&#x2F;h2&gt;
&lt;p&gt;2002年3月にCEOを退任し、同年末に会長職も退きました。&lt;&#x2F;p&gt;
&lt;p&gt;2003年1月、ワシントンD.C.を拠点とする世界最大級のプライベート・エクイティ・ファームである
カーライル・グループの会長に就任。2008年9月30日に会長職を退き、その後はシニアアドバイザーとして
同社に関わり続けました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;教育と慈善活動への情熱&quot;&gt;教育と慈善活動への情熱&lt;&#x2F;h3&gt;
&lt;p&gt;Gerstner氏は、ビジネスの世界を離れた後も精力的に活動を続けました。&lt;&#x2F;p&gt;
&lt;p&gt;著書「Who Says Elephants Can&#x27;t Dance?」（邦題：「巨象も踊る」）は、企業変革の
バイブルとして世界中で読まれています。&lt;&#x2F;p&gt;
&lt;p&gt;また、アメリカの公教育改革に情熱を注ぎ、IBMの技術を活用した教育イニシアティブを立ち上げました。
ガースナー・フィランソロピーを通じて、ニューヨーク市、ボストン、フロリダ州パームビーチ郡の
生物医学研究、環境・教育プログラム、社会福祉を支援しました。&lt;&#x2F;p&gt;
&lt;p&gt;Gerstner氏の企業再生手腕は、世界中のビジネススクールでケーススタディとして
研究され続けており、その影響力は計り知れません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人的な思い出&quot;&gt;個人的な思い出&lt;&#x2F;h2&gt;
&lt;p&gt;私自身、入社時に配属されたのは、当時のIBM社内ではマイナーな存在だった
アプリケーション開発部門でした。&lt;&#x2F;p&gt;
&lt;p&gt;当時の混乱期に、私の所属は「日本アイ・ビー・エム株式会社」から
「日本アイ・ビー・エム・サービス株式会社」へと変わりました。
分社化の波が日本にも押し寄せていた時期です。&lt;&#x2F;p&gt;
&lt;p&gt;しかしGerstner氏がIBMに就任し、分社化を中止してサービス事業への転換を推進したことで、
私の経験やスキルがより活かせる環境へと変わっていくのを肌で感じました。
アプリケーション開発の経験が、サービス重視の新しいIBMでは強みになったのです。&lt;&#x2F;p&gt;
&lt;p&gt;もし彼がIBMに来て変革を起こさなければ、私はもっと早い時期に会社を
去っていたかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;遠い存在ではありましたが、そういう意味で、私のキャリアに大きな影響を与えた方でした。
深く感謝するとともに、心より御冥福をお祈りいたします。&lt;&#x2F;p&gt;
</content>
        <summary type="html">1990年代に破綻寸前だったIBMを劇的に再生させた伝説的経営者、
Louis V. Gerstner Jr.氏が2025年12月27日、83歳で逝去されました。
心よりご冥福をお祈りいたします。
</summary>
        </entry><entry xml:lang="en">
        <title>My Top 5 Personal Highlights of 2025</title>
        <published>2025-12-31T00:00:00+00:00</published>
        <updated>2025-12-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/my-top5-personal-highlights-of-2025/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/my-top5-personal-highlights-of-2025/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2025年も残すところあと数時間です。今年は技術、社会、個人の各領域で大きな変化があった一年でした。印象深かった5つのハイライトを記録として残します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._AIエージェントが切り拓いた新時代&quot;&gt;1. AIエージェントが切り拓いた新時代&lt;&#x2F;h2&gt;
&lt;p&gt;2025年、AI技術は単なる「ツール」から「パートナー」へと進化しました。その象徴がAnthropicのClaude Codeです。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeはコーディングに特化したコマンドラインツールで、従来のコード補完とは次元が違います。プロジェクトの文脈を理解し、複数ファイルにまたがる変更を自律的に提案・実行します。まさに「一緒に開発する」という感覚です。&lt;&#x2F;p&gt;
&lt;p&gt;さらに大きなインパクトをもたらしたのが、Model Context Protocol（MCP）です。MCPはAIエージェントと外部システムを接続する統一プロトコルで、2025年には事実上の業界標準として確立されました。コミュニティが数千のMCPサーバーを構築し、あらゆるプログラミング言語でSDKが利用可能になりました。&lt;&#x2F;p&gt;
&lt;p&gt;私自身、Claude CodeとMCPを日常的に使うようになり、開発のスピードと質が劇的に向上しました。AIは自律的に考え、行動し、問題を解決する存在へと進化しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._大空から見た世界、ドローン空撮の挑戦&quot;&gt;2. 大空から見た世界、ドローン空撮の挑戦&lt;&#x2F;h2&gt;
&lt;p&gt;2025年、二等無人航空機操縦士の資格を取得し、本格的な空撮活動を開始しました。&lt;&#x2F;p&gt;
&lt;p&gt;空から地上を見下ろす視点の転換は想像以上に新鮮でした。建物の配置、道路の流れ、光と影のパターン。地上からは見えない景色が広がっていました。飛行操作、カメラワーク、構図の取り方を学びながら、自分の表現を確立していく過程は、新しい言語を習得するようでした。&lt;&#x2F;p&gt;
&lt;p&gt;同時に、安全運用の重要性も痛感しました。機体点検、気象確認、飛行計画、周囲への配慮。法規制を遵守し、責任を持って運用することの大切さを実践を通じて学びました。&lt;&#x2F;p&gt;
&lt;p&gt;ドローンがもたらす映像表現の可能性に魅了されました。2026年も、この視点からの創作を続けていきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._高市早苗内閣の船出、OGとしての期待と誇り&quot;&gt;3. 高市早苗内閣の船出、OGとしての期待と誇り&lt;&#x2F;h2&gt;
&lt;p&gt;2025年10月21日、高市早苗氏が第104代内閣総理大臣に就任しました。日本初の女性首相の誕生です。&lt;&#x2F;p&gt;
&lt;p&gt;私自身、高市氏と同窓であり、OGとして誇らしい気持ちでこの歴史的瞬間を見守りました。「決断と前進の内閣」として発足し、自民党と日本維新の会による連立政権となりました。少数与党という厳しい状況ですが、女性リーダーとしての手腕、政策の実行力に期待しています。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、2025年は日本のサイバーセキュリティの脆弱性が浮き彫りになった年でもありました。地政学的リスクが高まる中、有名企業が次々とサイバー攻撃の標的となりました。&lt;&#x2F;p&gt;
&lt;p&gt;個人情報の大量流出、システムの停止、ランサムウェアによる身代金要求。ノーガードとも言える状況は、もはや企業の問題ではなく国家的危機です。技術的対策だけでなく、法制度の整備、人材の育成、国際協力の推進が求められています。&lt;&#x2F;p&gt;
&lt;p&gt;高市内閣には、この重要課題にも果敢に取り組んでいただきたいです。日本のデジタル主権を守り、安全で信頼できるデジタル社会を構築することは、次世代への責務です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4._YAMAHA_REVSTAR_RSP20が教えてくれた日本品質&quot;&gt;4. YAMAHA REVSTAR RSP20が教えてくれた日本品質&lt;&#x2F;h2&gt;
&lt;p&gt;2025年、YAMAHA REVSTAR RSP20を手に入れました。Moon Light Blueという美しいカラーリングのモデルです。&lt;&#x2F;p&gt;
&lt;p&gt;手に取った瞬間から、その品質の高さに圧倒されました。精緻な作り込み、完璧な仕上げ、手にしっくりと馴染むネックのシェイプ。日本の楽器メーカーならではの職人技が随所
に感じられます。&lt;&#x2F;p&gt;
&lt;p&gt;クリーンからドライブまで、オールマイティな音色を奏でます。ハムバッカータイプのピックアップは太くて温かみがあり、
それでいて明瞭さも失いません。演奏性も申し分なく、楽器が演奏者の意図に忠実に応えてくれます。&lt;&#x2F;p&gt;
&lt;p&gt;このギターを通じて、日本のものづくりの真髄を実感しました。
妥協のない設計、細部へのこだわり、品質への執念。YAMAHA REVSTAR RSP20は、私にとって特別な存在になりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5._公益財団法人の闇、理想と現実の落差&quot;&gt;5. 公益財団法人の闇、理想と現実の落差&lt;&#x2F;h2&gt;
&lt;p&gt;2025年、公益財団法人の仕事に携わる機会を得ました。
公益を掲げ、社会貢献を使命とする組織です。しかし、そこで目の当たりにしたのは想像を超える惨状でした。&lt;&#x2F;p&gt;
&lt;p&gt;基本的なITリテラシーが低いのは仕方がないと思いましたが、
論理的思考、経営的視点の欠如。必要最低限の能力すら備えていない人材が理事会に就いています。
前例踏襲、事なかれ主義、責任回避。新しいことに挑戦する意欲はありません。
意思決定の遅さ、情報共有の不備、内部統制の欠如。そして組織の評価指標がなく、与えられた補助金でできることしかせず慢性的な資金不足。
収入源の自立もできず、かと言って見直しが行われるほどの予算規模もなく、ただただ存続する。&lt;&#x2F;p&gt;
&lt;p&gt;公益を謳いながら、実態は社会のゴミのような場所でした。&lt;&#x2F;p&gt;
&lt;p&gt;これは一組織の問題ではなく、日本の非営利セクター全体が抱える構造的問題です。
公益法人制度の抜本的な改革が必要です。厳格な評価制度、透明性の確保、不適格組織の淘汰。真に社会に貢献する組織だけが存続できる仕組みを作らなければなりません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2025年から2026年へ&quot;&gt;2025年から2026年へ&lt;&#x2F;h2&gt;
&lt;p&gt;技術の進化、新しい挑戦、歴史的な出来事、ものづくりの喜び、そして社会の現実。2025年は実に多様な経験をした一年でした。&lt;&#x2F;p&gt;
&lt;p&gt;AIは人間の能力を拡張し、ドローンは新しい視点を与え、女性首相の誕生は社会の変化を象徴しました。楽器は創造の喜びを思い出させ、公益法人の実態は改革の必要性を教えてくれました。&lt;&#x2F;p&gt;
&lt;p&gt;2026年も、変化と挑戦の年になるでしょう。技術はさらに進化し、社会はさらに複雑になり、私自身もさらに成長していきたいです。&lt;&#x2F;p&gt;
&lt;p&gt;良いお年を。&lt;&#x2F;p&gt;
</content>
        <summary type="html">2025年を振り返り、AI技術の進化、ドローン空撮への挑戦、日本初の女性首相誕生、YAMAHA REVSTARギターとの出会い、そして公益財団法人の実態という5つのハイライトを記録します。技術、社会、個人の各領域で経験した変化と学びについて。</summary>
        </entry><entry xml:lang="en">
        <title>GravaStar Gaming Mouse Mercury M2</title>
        <published>2025-12-30T00:00:00+00:00</published>
        <updated>2025-12-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/mercury-m2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/mercury-m2/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;mercury-m2&amp;#x2F;m2.webp?h=d3b4ff2dfc8e800e0ff2&quot;
  alt=&quot;Mercury M2&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Replacing_My_Mouse&quot;&gt;Replacing My Mouse&lt;&#x2F;h2&gt;
&lt;p&gt;After four years of faithful service, my wired &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4qv3XfG&quot;&gt;Xtrfy M42&lt;&#x2F;a&gt; was showing its age. I considered buying the same model again, but it had been replaced by a newer version, and the old model was now expensive. I wasn&#x27;t fond of the new Xtrfy designs, so I tried a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3MQsXQe&quot;&gt;Kensington Slim Blade Pro&lt;&#x2F;a&gt; trackball instead. Unfortunately, it occasionally stopped responding, which became frustrating.&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s when I purchased the GravaStar &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;44OXdB6&quot;&gt;Mercury M2&lt;&#x2F;a&gt; gaming mouse.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Why_I_Chose_the_Mercury_M2&quot;&gt;Why I Chose the Mercury M2&lt;&#x2F;h2&gt;
&lt;p&gt;GravaStar also offers a higher-end model, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3L4EESP&quot;&gt;Mercury X Pro&lt;&#x2F;a&gt;, but since I don&#x27;t game on my Mac, I decided the Mercury M2&#x27;s specifications were sufficient.&lt;&#x2F;p&gt;
&lt;p&gt;The deciding factor was its unique design: a transparent black body with vibrant LED lighting. It has a cyberpunk aesthetic that serves as a striking accent on my desk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Key_Features&quot;&gt;Key Features&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Connection Methods&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The mouse supports three types of connections:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2.4GHz USB receiver&lt;&#x2F;li&gt;
&lt;li&gt;Bluetooth&lt;&#x2F;li&gt;
&lt;li&gt;USB-C wired connection&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Being able to switch between connection modes depending on the situation is convenient.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Customization Settings&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;No driver installation is required. On Mac, you can customize settings through a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;controlhub.top&#x2F;gravastar&#x2F;&quot;&gt;web-based&lt;&#x2F;a&gt; interface. You can adjust DPI, LED lighting patterns, and macro functions.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lightweight Design&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;With an even more aggressive hollow body design than the M42, the Mercury M2 weighs only 79g. For a wireless mouse with a built-in battery, it&#x27;s impressively light and comfortable for extended use. I&#x27;m slightly concerned about dust getting into the hollow body, but so far it hasn&#x27;t been an issue.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The Mercury M2 is a gaming mouse that combines distinctive design with practical functionality. Beyond gaming, it performs well as an everyday mouse. I&#x27;d recommend it to anyone looking for a lightweight wireless mouse with a design-forward aesthetic.&lt;&#x2F;p&gt;
</content>
        <summary type="html">After four years with my previous mouse, I upgraded to the GravaStar Mercury M2, featuring a transparent black body and LED lighting. This gaming mouse offers a lightweight 79g design, three connection methods, and web-based configuration.</summary>
        </entry><entry xml:lang="en">
        <title>You Can Never Come To This Place</title>
        <published>2025-12-30T00:00:00+00:00</published>
        <updated>2025-12-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/you-can-never-come-to-this-place/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/you-can-never-come-to-this-place/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2237610962&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;you-can-never-come-to-this-place&quot; title=&quot;You Can Never Come To This Place&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;You Can Never Come To This Place&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;A few months ago, I &lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;09&#x2F;21&#x2F;takanaka&quot;&gt;attended a Takanaka Masayoshi concert&lt;&#x2F;a&gt;. The encore finale was &quot;You Can Never Come To This Place&quot; - I never imagined I&#x27;d get to hear this beloved track from the legendary album &quot;Rainbow Grapefruit&quot; performed live, and I was truly moved.&lt;&#x2F;p&gt;
&lt;p&gt;While the emotion was still fresh, I decided to challenge myself to master this piece before the year ended. With its rapid-fire phrases, I honestly felt like giving up many times, but I kept practicing, remembering the excitement of that concert.
It&#x27;s far from perfect, but I played it with all my love for this song and the emotion I felt at that concert.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Guitar&lt;&#x2F;td&gt;&lt;td&gt;YAMAHA REVSTAR RSP20 (Moon Light Blue)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Audio Interface&lt;&#x2F;td&gt;&lt;td&gt;MOTU M2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Amp Sim&lt;&#x2F;td&gt;&lt;td&gt;NeuralDSP Archetype Plini X&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        <summary type="html">数ヶ月前の高中正義のコンサート、アンコールで演奏された名曲「You Can Never Come To This Place」に感動しました。年内にこの難易度の高い楽曲に挑戦しようと練習を重ねた記録です。演奏は完璧ではありませんが、コンサートで感じた感動とこの曲への愛情を込めて弾きました。</summary>
        </entry><entry xml:lang="en">
        <title>Stranger Things Season 5: A Tale of Growth and Resurrection</title>
        <published>2025-12-24T00:00:00+00:00</published>
        <updated>2025-12-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/stranger-things/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/stranger-things/</id>
        
            <content type="html">&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;tk9FDjJd6zM&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;Introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;After nearly nine years since its 2016 debut, Stranger Things has finally begun streaming Season 5 on Netflix. This long-awaited final season premiered at the end of last month, with episodes 1-4 now available. The quality remains as exceptional as ever, true to the series&#x27; exceptional standard throughout. I am absolutely captivated by the prospect of how this remarkable story will ultimately conclude.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;A_Tale_of_Growth&quot;&gt;A Tale of Growth&lt;&#x2F;h2&gt;
&lt;p&gt;The greatest strength of this series lies in its exceptional screenplay. Combined with its 1980s setting, it creates an irresistible wave of nostalgia for my generation. The decade&#x27;s iconic hits are featured prominently throughout, evoking both the charm and the excitement of that golden era.&lt;&#x2F;p&gt;
&lt;p&gt;However, the most significant aspect is witnessing genuine growth both within the narrative and in the actors themselves. By consistently telling this story since Season 1 in 2016, the series has achieved something truly remarkable—something only possible through such longevity.&lt;&#x2F;p&gt;
&lt;p&gt;The child characters, in particular, are portrayed with meticulous care. Their transformation is genuinely moving. To watch those once timid young heroes become capable of battling formidable creatures brings tears to my eyes.&lt;&#x2F;p&gt;
&lt;p&gt;Equally compelling is observing the young cast&#x27;s real-world evolution as professional actors. Millie Bobby Brown, the lead actress, was around 11 years old during Season 1, yet today she&#x27;s in her twenties and married. Witnessing their life-changing journeys unfold on screen is a unique joy that only this series can provide.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;A_Tale_of_Resurrection&quot;&gt;A Tale of Resurrection&lt;&#x2F;h2&gt;
&lt;p&gt;The children in this series are far from the popular crowd at school. Rather, they&#x27;re nerds—often the outcasts of their social hierarchy. Yet what&#x27;s wonderful is watching them have their moment to shine. Characters like Dustin Henderson, the ultimate geek, play genuinely crucial roles. Their significance harks back to a time in the 1980s when being a nerd was actually cool.&lt;&#x2F;p&gt;
&lt;p&gt;Beyond the young characters, the adults also carry their own tragedies and challenges. But as they fight alongside the children, they gradually reclaim themselves, becoming true adults. Their personal transformations are deeply moving.&lt;&#x2F;p&gt;
&lt;p&gt;This series does more than launch new talent—it also serves as a resurrection story for beloved actors from Hollywood&#x27;s golden age. Winona Ryder, who shined brilliantly in the 1980s only to fade from public view, makes a remarkable comeback in this drama. Season 5 even features Linda Hamilton, the action movie queen of the 1980s and 90s.&lt;&#x2F;p&gt;
&lt;p&gt;Equally remarkable is Gaten Matarazzo, who plays Dustin Henderson. Like his character, Matarazzo himself lives with cleidocranial dysostosis, a real genetic condition. Yet he is rightfully celebrated as a talented actor. This exemplifies what makes this series truly special—a platform where talent triumphs, and differences become individual strengths.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conlusion&quot;&gt;Conlusion&lt;&#x2F;h2&gt;
&lt;p&gt;After Christmas, episodes five through seven will continue to be released, and in the New Year of 2026, the long-anticipated final episode is scheduled to be released.&lt;&#x2F;p&gt;
&lt;p&gt;Likely, this will be the final season.
After nine years, this series is finally heading towards its conclusion.&lt;&#x2F;p&gt;
&lt;p&gt;I’m now curious about what kind of conclusion this story, woven around the themes of growth and resurrection, will ultimately reach.&lt;&#x2F;p&gt;
&lt;p&gt;Why not enjoy Stranger Things this holiday season?
Immersing yourself in the nostalgic world of the 1980s while continuing the adventure with the boys and girls is, I believe, a luxurious pleasure unique to this season.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Season 5 of Stranger Things has begun streaming. Exploring the charm of the final season through themes of growth and resurrection.</summary>
        </entry><entry xml:lang="en">
        <title>真空管の歪みを実現するStrymon Fairfax</title>
        <published>2025-12-21T00:00:00+00:00</published>
        <updated>2025-12-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/fairfax/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/fairfax/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;fairfax&amp;#x2F;fairfax.webp?h=99c49ac5ce90efd41737&quot;
  alt=&quot;Strymon Fairfax&quot; width=&quot;1800&quot; height=&quot;1012&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contentes&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Strymonは、既に優れた歪み系ペダルを2つリリースしています。
6種類のオーバードライブを2段重ねできるSunsetと、3つのモードを持つオーバードライブRiversideです。
これらのペダルは、多様な歪みサウンドを提供し多くのギタリストに支持されています。
ではなぜ、Strymonは2025年に新たに&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3Y6rRC8&quot;&gt;Fairfax&lt;&#x2F;a&gt;という歪みペダルをリリースしたのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;その答えは、Fairfaxが従来のオーバードライブペダルとは根本的に異なるアプローチを採用しているからです。
ほとんどのオーバードライブペダルは「プリアンプの歪み」を再現します。
しかしFairfaxは、真空管アンプ全体の挙動、つまり「プリアンプ＋パワーアンプ＋出力トランス＋電源部のサグ」という総合的な歪みを再現しようとしています。
この違いを理解するには、まず「真空管の歪み」の本質と、それが現代のエフェクターでどのように再現されてきたかを知る必要があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ギタリストが恋焦がれる「真空管の歪み」の正体&quot;&gt;ギタリストが恋焦がれる「真空管の歪み」の正体&lt;&#x2F;h2&gt;
&lt;p&gt;オーバードライブサウンドの原点は、真空管アンプを大音量で駆動し生じる自然な歪みにあります。
1950年代後半から1960年代にかけて、ブルースやロックギタリストたちはアンプのボリュームを限界まで上げた時に生まれる「偶然の音色」を発見しました。
これは真空管という増幅素子の物理的な限界から生まれた現象でした。&lt;&#x2F;p&gt;
&lt;p&gt;真空管は、入力信号がある一定のレベルを超えると線形動作領域を逸脱します。
信号のピーク部分が平らに削られる「クリッピング」という現象が起こり、これが豊富な倍音成分を含んだ歪みを生み出します。
真空管アンプの歪みが「暖かい」「音楽的」と評される理由は、波形のクリッピングが徐々に起こる「ソフトクリッピング」特性にあります。
これにより偶数次倍音が多く含まれ、聴感上心地よい歪みとなるためです。&lt;&#x2F;p&gt;
&lt;p&gt;実際のアンプでは、プリアンプ段とパワーアンプ段の両方で歪みが発生します。
プリアンプ管（12AX7など）は高ゲイン設計で、比較的小さな信号でも飽和しやすく鋭い歪みを生成します。
一方、パワー管（EL34、6L6など）の歪みは、出力トランスの飽和特性も関係して、より滑らかで音楽的な特性を持ちます。
大電流が流れると鉄心が磁気飽和を起こし、高域が丸まり低域に独特のコンプレッションがかかります。
この「重さ」や「押し出し感」も真空管アンプ特有の特性です。&lt;&#x2F;p&gt;
&lt;p&gt;さらに重要なのが、大音量時に電源部の整流回路やトランスが一時的に電圧降下を起こす現象です。
これが「サグ」と呼ばれ、信号に一度音量が下がって時間経過で音量が戻るという自然なコンプレッション効果が加わり、
独特のダイナミクスとタッチレスポンスを生み出します。
ピッキングの瞬間に音が「呼吸する」ような反応性は、このサグによるものです。&lt;&#x2F;p&gt;
&lt;p&gt;Fender Tweed、初期Marshall、Vox AC30などの古典的アンプには、マスターボリュームがないか、
プリアンプ段が少ない設計でした。
ボリュームノブはプリアンプの出力とパワーアンプの入力の間に配置され、ボリュームを上げるとプリアンプ段とパワーアンプ段の両方が同時に駆動されました。
Eric Claptonの「Bluesbreakers」アルバムや、Jimi Hendrixのサウンドは、文字通りアンプを爆音で鳴らしてプリアンプとパワーアンプの両方を歪ませた結果です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現代のアンプやエフェクターで作る「歪み」とは&quot;&gt;現代のアンプやエフェクターで作る「歪み」とは&lt;&#x2F;h2&gt;
&lt;p&gt;1970年代以降、マスターボリューム搭載アンプが一般化しました。
これにより、GAINノブでプリアンプを歪ませマスターボリュームで音量を調整するという使い方が可能になりました。
1980年代以降のハイゲインアンプ（Mesa Boogie、Peavey 5150、現代のMarshall JCMシリーズなど）は、プリアンプ段を多段構成にしてGAINノブで極端に歪ませる設計となっています。
これにより、寝室レベルの音量でも激しい歪みが得られるようになりました。
この方式は、1970〜80年代のハードロック、ヘヴィメタルの需要に応えたものでステージ音量を管理しながら高ゲインサウンドを得る必要があったからです。&lt;&#x2F;p&gt;
&lt;p&gt;歪み系エフェクターは、信号チェーンの中でアンプの前段に接続されます。
つまり「ギター → エフェクター（歪み）→ アンプのプリアンプ（GAINで歪み）→ パワーアンプ → スピーカー」という流れになります。
回路的には、エフェクターは「プリアンプ的な歪み」を生成していると言えます。現代的な使い方では、「プリアンプ的な歪み」を二段重ねしていることになります。&lt;&#x2F;p&gt;
&lt;p&gt;初期のオーバードライブペダル（Ibanez Tube Screamer、Boss OD-1など）は、トランジスタやオペアンプを使って真空管アンプが自然に歪む「感触」を再現しようとしました。
ソフトクリッピング回路で、倍音特性や圧縮感を似せています。ただし、これは「プリアンプ単体」というより、アンプ全体が適度に歪んだ状態を、小型回路で近似したものです。
ディストーションペダルは、より積極的なハードクリッピングを使い、ハイゲインアンプのプリアンプ段のような強い歪みを作ります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現代の歪みと本来の歪みの違い&quot;&gt;現代の歪みと本来の歪みの違い&lt;&#x2F;h2&gt;
&lt;p&gt;現代のハイゲインアンプやエフェクターペダルは、主にプリアンプで歪みを作ります。
マスターボリュームで音量を下げれば、パワーアンプはほぼクリーンな状態のままとなります。
プリアンプ主体の歪みは、ゲインが高く圧縮されたサウンドになりますが、パワーアンプも歪ませた時のような立体感、
ダイナミクス、タッチレスポンスには欠けたものになります。&lt;&#x2F;p&gt;
&lt;p&gt;この結果、これまでのエフェクター単体では、以下の要素を再現できません。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;パワー管の暖かな歪み（偶数次倍音が豊富なソフトクリッピング）&lt;&#x2F;li&gt;
&lt;li&gt;電源部のサグ（電圧降下による自然なコンプレッション効果）&lt;&#x2F;li&gt;
&lt;li&gt;出力トランスの飽和特性（重さと押し出し感）&lt;&#x2F;li&gt;
&lt;li&gt;スピーカーの物理的な挙動&lt;&#x2F;li&gt;
&lt;li&gt;アンプ全体の相互作用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらが、「真空管アンプを全開にした音」の核心であり、小さな真空管アンプを使用しなければ完全な再現は困難でした。&lt;&#x2F;p&gt;
&lt;p&gt;1960年代の本来の歪みは、プリアンプの歪みとパワーアンプ・トランスの歪みとスピーカーの駆動が総合的に作用した結果です。
それに対して、現代的設定では「エフェクターの歪み＋プリアンプの歪み（＋パワーアンプはほぼクリーン）」となります。
だからこそ、本物のヴィンテージトーンを求めるギタリストは、小型アンプ（5〜15W）をフルボリュームで使ったり
アッテネーター（パワーアンプの出力を減衰させる装置）を使ったりして、パワーアンプ段も歪ませようとするのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Strymon_Fairfaxが挑む課題&quot;&gt;Strymon Fairfaxが挑む課題&lt;&#x2F;h2&gt;
&lt;p&gt;StrymonのSunsetやRiversideは、多様な歪みキャラクターを提供する優れたペダルです。
しかし、これらも基本的には「プリアンプの歪み」を再現するという、従来のオーバードライブペダルと同じアプローチを採用しています。
つまり、アンプを全開にした時の「アンプ全体の総合的な歪み」を再現するものではありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;2025年に発表されたFairfaxは、この従来のアプローチの限界を超えようとする試みです。
Fairfaxは、1965年Randy Bachman用に製作されたGarnet Amplifiers Herzog®とChampライクなチューブアンプ回路をヒントに、
Strymonとしては初の完全アナログで小型化したエファクターです。&lt;&#x2F;p&gt;
&lt;p&gt;Fairfaxが従来のペダルと決定的に異なるのは、以下の要素を同時に再現しようとしている点です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;クラスAパワーアンプの歪み&lt;&#x2F;strong&gt;：パワー管の滑らかで音楽的な歪み&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;出力トランスの飽和特性&lt;&#x2F;strong&gt;：カスタムアナログ回路でエミュレート&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;可変Sag回路&lt;&#x2F;strong&gt;：電源部の電圧降下による自然なコンプレッション効果&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;特に注目すべきは、9VDCを内部で40Vに昇圧している点です。
通常のエフェクターペダルは9Vのままで動作しますが、Fairfaxは高い動作電圧により真空管アンプのような高いヘッドルームと
応答性を実現しています。この高電圧動作が、パワーアンプの歪みやサグの再現を可能にしているのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;Fairfaxは、エフェクターペダルという小型の筐体の中で、実際の真空管や出力トランスを使わずにどこまで本物に近づけるかという技術的挑戦です。
これが、Strymonが既に歪み系ペダルを持っているにもかかわらず、Fairfaxをリリースした理由です。&lt;&#x2F;p&gt;
&lt;p&gt;同様の試みはKORGの極小真空管Nutubeを使ったTR-Sでも行われていましたが、挙動が敏感過ぎて扱いに難しい面がありました。
Strymon FairFaxはエフェクターの運用の中で、現実的な実用性を兼ね備えている点は活気的です。&lt;&#x2F;p&gt;
&lt;p&gt;従来のオーバードライブとアンプの間にFairfaxを挟み、ドライブとSAGをほんの少し加えるだけで実にアンプライクな気持ちよい歪みを得ることができます。
私の場合、両方のツマミをかなり抑えてクリーン時も常時オンにして使っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;真空管アンプの音色を追い求めて&quot;&gt;真空管アンプの音色を追い求めて&lt;&#x2F;h2&gt;
&lt;p&gt;オーバードライブサウンドの歴史は、技術的制約と音楽的要求の相互作用の歴史です。
1960年代の偶然の発見から始まったこの音色は、現代では様々な技術的アプローチで再現が試みられています。
しかし、真空管アンプを全開にした時の「プリアンプ＋パワーアンプ＋出力トランス＋サグ」という総合的な挙動を完全に再現することは、依然として困難な課題です。&lt;&#x2F;p&gt;
&lt;p&gt;だからこそ、ヴィンテージアンプの価値が保たれ続け、Fairfaxのような新しい技術的挑戦が今なお続いているのです。
音楽技術において、「古い」と「新しい」は対立するものでなく、
それぞれが異なる価値を持ち続けている好例と言えるでしょう。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;_この記事は、アンプとエフェクターの技術的な理解を深めるための考察です。
実際の音作りにおいては、技術的な正確さよりも、演奏者の感性と音楽的文脈が最も重要であることを付け加えておきます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Strymon から Fairfaxという新しい歪み系のペダルが発売されました。Strymonには既にSunsetとRiversideという歪み系ペダルが既にあります。なぜStrymonは更に新しい歪みペダルをリリースしたのでしょう?この記事では50年以上に渡るエレキギターのオーバードライブサウンドの歴史から、Strymon Fairfaxの技術的な意義を紐解いてみたいと思います。</summary>
        </entry><entry xml:lang="en">
        <title>異次元のステンレス両刃カミソリ REX Sentry</title>
        <published>2025-12-19T00:00:00+00:00</published>
        <updated>2025-12-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/rex-sentry/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/rex-sentry/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;rex-sentry&amp;#x2F;rex1.webp?h=fb650dc7f6fc7c1cfc94&quot;
  alt=&quot;REX Sentry&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;「スラント」両刃カミソリとは&quot;&gt;「スラント」両刃カミソリとは&lt;&#x2F;h2&gt;
&lt;p&gt;一般的な両刃カミソリはホルダーに沿って刃をセットします。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、一部の両刃カミソリでは次のように刃を特殊な状態でセットします。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;刃を斜めに「配置」する(Slanted Presentation)&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    ヘッド自体が斜め形状になっており、刃の露出位置（edge exposure &#x2F;
    presentation）が左右で異なる。
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;刃を「捻じる」(Torsion slant)&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    刃の短辺方向にトルクをかけて固定することで切り刃がS字状（ねじれ）に湾曲。チャタリング（ビビり）の抑制。
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;このいずれか、あるいは両方の特徴を備えた両刃カミソリは「スラント」と呼ばれ、
海外では割と一般的なようです。&lt;&#x2F;p&gt;
&lt;p&gt;例えば、メルクール37Cは上記の両方の特徴を備えた典型的な「スラント」です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;REX_Sentryとは&quot;&gt;REX Sentryとは&lt;&#x2F;h2&gt;
&lt;p&gt;REX Sentryは米国のRex Supply社のものです。
ドイツ的な剃り文化を、アメリカ的CNC精度で再構築したメーカーです。&lt;&#x2F;p&gt;
&lt;p&gt;メルクールなどドイツのカミソリが真鍮にメッキが多いのに対して、REX Supplyではステンレスを高い精度で加工している点が特徴です。&lt;&#x2F;p&gt;
&lt;p&gt;購入したREX Sentryもマリングレード（船舶用）のステンレス鋼から巧みに作られています。そのデザインはフランスのギロチンのミリ単位の精度からインスピレーションを得たと恐ろしげな説明がなされています。
特徴は次の2点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;極端なBlade Camber（刃の湾曲）がついている&lt;&#x2F;li&gt;
&lt;li&gt;微妙にSlanted Presentationである&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;前者のBlade Camberは、切り刃を押し下げて短辺全体が「∩」のような緩やかな弓形になるよう、刃にテンションが掛かった状態です。
これはどんなカミソリでも刃を安定させ肌に対して角度を付けるために必ず採用されています。
しかし、REX Sentryではこの湾曲が極端なのです。その結果、刃が肌に対して通常のカミソリより角度を持った状態で剃ることになります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;rex-sentry&amp;#x2F;rex2.webp?h=f62e6e1361cb9649c7a4&quot;
  alt=&quot;REX Sentry&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;後者は左右で刃の露出が違うので、ホルダーを真っ直ぐに肌に当てても左右で角度が自然についている状態になります。&lt;&#x2F;p&gt;
&lt;p&gt;ドイツの伝統的なスラントと比較すると「捻じり」は採用されていません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;REX_Sentryの剃り味は?&quot;&gt;REX Sentryの剃り味は?&lt;&#x2F;h2&gt;
&lt;p&gt;かなりいかつい見た目と「ギロチン」にインスピレーションを得たというメーカーの売り文句に反して、
REX Sentryの剃り味はかなりマイルドです。&lt;&#x2F;p&gt;
&lt;p&gt;これは、極端なBlade Camberで肌へかなり刃を寝かせて当てることになるためです。
微妙なSlant Presentationにより左右にも角度が付いているので、Blade Camberの割にしっかりと深剃りできる印象です。&lt;&#x2F;p&gt;
&lt;p&gt;ホルダーにしっかり重量があるので、ホルダーの重さにまかせて脱力して剃れます。ホルダーの自重で剃れます。&lt;&#x2F;p&gt;
&lt;p&gt;1週間ほど使用しましたが、出血は一度もありません。
2パスでしっかり深剃りが可能です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ずっと、フェザーの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4j2tgDj&quot;&gt;特選オールステンレスレザー&lt;&#x2F;a&gt;を使ってきましたが、
重厚なヘッドと極端なBlade Camber、微妙なSlant Presentationから来る独特の剃り味から
すっかりREX Sentryに主役を入れ替えてしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;メルクール37Cなど伝統的なドイツのスラントは切れ味が鋭すぎて気を使いますが、
REX Sentryは安心してスラントを楽しめ、一生ものの品質で作られているので
オススメです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">米国REX Supply社のステンレス製両刃カミソリ「REX Sentry」のレビュー。極端なBlade Camberと微妙なSlant Presentationにより、マイルドでありながら深剃りが可能な独特の剃り味を実現。ギロチンから着想を得たという高精度なマリングレードステンレス加工により、一生ものの品質を誇る一本。</summary>
        </entry><entry xml:lang="en">
        <title>Akio Yamaguchi&#x27;s Appointment as Managing Director of Keizai Doyukai</title>
        <published>2025-12-16T00:00:00+00:00</published>
        <updated>2025-12-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/akio-yamaguchi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/akio-yamaguchi/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;akio-yamaguchi&amp;#x2F;akio.jpg?h=7489c1ef4a65ee590a84&quot;
  alt=&quot;Akio Yamaguchi&quot; width=&quot;200&quot; height=&quot;300&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Akio Yamaguchi, President of IBM Japan, has been &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.doyukai.or.jp&#x2F;news&#x2F;hr&#x2F;251216.html&quot;&gt;appointed&lt;&#x2F;a&gt; as a managing director of Keizai Doyukai (Japan Association of Corporate Executives).&lt;&#x2F;p&gt;
&lt;p&gt;Given that the position had been vacant for about two months following Suntory&#x27;s Takeshi Niinami&#x27;s resignation over the supplement issue, this could prove to be quite a challenging role.&lt;&#x2F;p&gt;
&lt;p&gt;This brings back memories from about 20 years ago when Kitashiro, then President of IBM Japan, served as a managing director. I was asked to provide advisory services for the Keizai Doyukai website and system renewal for a token fee—literally just a rice cracker.&lt;&#x2F;p&gt;
&lt;p&gt;As for President Yamaguchi himself, I have a couple of personal memories. A senior colleague of mine was close to him, and I had occasional conversations with Yamaguchi when he returned from his assignment in the United States. I also recall exchanging communications with him regarding team member participation in a banking package project that, unfortunately, turned out to be completely unusable.&lt;&#x2F;p&gt;
&lt;p&gt;Well, I&#x27;m sure it won&#x27;t be easy, but congratulations on the appointment anyway.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Akio Yamaguchi, President of IBM Japan, has been appointed as a managing director of Keizai Doyukai (Japan Association of Corporate Executives).</summary>
        </entry><entry xml:lang="en">
        <title>青と赤のコントラスト - 渓谷橋と宝衛橋</title>
        <published>2025-12-13T00:00:00+00:00</published>
        <updated>2025-12-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/keikokubashi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/keikokubashi/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;12&amp;#x2F;keikokubashi&amp;#x2F;keikokubashi.webp?h=6c985973d8201d70c43e&quot;
  alt=&quot;渓谷橋&quot; width=&quot;1800&quot; height=&quot;1013&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;養老渓谷でドローンの撮影をしてきました。&lt;&#x2F;p&gt;
&lt;p&gt;小湊鉄道の養老渓谷駅から梅ヶ瀬渓谷へ向かうと、
すぐに養老川本流にぶつかり「渓谷橋」という青い橋を渡ることになります。
橋から左手(東側)を眺めると、もう一本赤い橋「宝衛橋」が見下ろせます。
橋の下には養老川が流れています。&lt;&#x2F;p&gt;
&lt;p&gt;この地域は蛇行する養老川に作られた「川廻し」の地形です。
「川廻し」とは、川の湾曲する部分に直線で結ぶ河川を作り、
曲流していた旧流路に盛土をして新田を開発するという江戸時代後期から行なわれた手法で、
平地が少ない山間部では貴重な土地を得るためによく行なわれました。&lt;&#x2F;p&gt;
&lt;p&gt;この地では昭和初期に川廻しが行なわれ、この2つの橋は川廻しで繋いだ直線部に渡された橋です。
当初はトンネルで曲流部を繋いだようですが、昭和45年の集中豪雨によりトンネル付近で水が滞留し温泉街に被害が
出たため、トンネル部分を切り通しにしたそうです。この橋は切り通しによって渡れなくなった集落を繋ぐため、昭和48年に架けられたそうです。&lt;&#x2F;p&gt;
&lt;p&gt;今では養老渓谷を象徴する橋となっています。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;KZ613jRe8cI&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">養老渓谷の象徴的な2つの橋、青い渓谷橋と赤い宝衛橋をドローンで撮影しました。江戸時代後期から行われた「川廻し」による治水の歴史と、昭和の開発によって生まれた美しい橋の物語を紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>MAGIシステムをClaude Code Pluginで実装してみた</title>
        <published>2025-12-12T00:00:00+00:00</published>
        <updated>2025-12-12T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/magi-claude-code-plugin/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/magi-claude-code-plugin/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Claude_Code_Pluginとは&quot;&gt;Claude Code Pluginとは&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code Pluginは、AnthropicのClaude Code CLI向けの拡張機能システムです。プラグインを使用することで、Claudeに新しいコマンド、エージェント、スキル、フックなどを追加できます。&lt;&#x2F;p&gt;
&lt;p&gt;主な機能は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スラッシュコマンド&lt;&#x2F;strong&gt;: 独自のコマンドを定義してClaude Codeから実行&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;カスタムエージェント&lt;&#x2F;strong&gt;: 特定のタスクに特化したAIエージェントを作成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;スキル&lt;&#x2F;strong&gt;: 再利用可能な機能をスキルとして定義&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;フック&lt;&#x2F;strong&gt;: ツール実行前後などのイベントに対応したアクションを定義&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MCP統合&lt;&#x2F;strong&gt;: Model Context Protocol経由で外部サービスと連携&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;プラグインはマーケットプレイスから簡単にインストールでき、ローカルでの開発も可能です。これにより、チームやプロジェクトごとにClaude Codeの機能をカスタマイズできます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;エヴァンゲリオンのMAGIシステムとは&quot;&gt;エヴァンゲリオンのMAGIシステムとは&lt;&#x2F;h2&gt;
&lt;p&gt;MAGIは、アニメ「新世紀エヴァンゲリオン」に登場する架空のスーパーコンピュータシステムです。人間の頭脳をベースにした3つの独立したシステムで構成されており、重要な意思決定を合議制で行います。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;MAGIの3つのシステム&quot;&gt;MAGIの3つのシステム&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MELCHIOR（メルキオール）&lt;&#x2F;strong&gt;: 科学者としての側面を模擬。論理性と合理性に基づいて判断する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BALTHASAR（バルタザール）&lt;&#x2F;strong&gt;: 母親としての側面を模擬。保護と倫理を重視して判断する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CASPER（キャスパー）&lt;&#x2F;strong&gt;: 女性としての側面を模擬。感情と共感に基づいて判断する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この3つのシステムは、それぞれ異なる視点から問題を分析し、多数決で最終的な結論を導きます。人間の多面的な判断プロセスを再現することで、より包括的で偏りの少ない意思決定を目指しています。&lt;&#x2F;p&gt;
&lt;p&gt;作中では、「使徒」への対処方法など、人類の存続に関わる重要な判断をMAGIにより下される場面が描かれています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Magi_Claude_Code_Pluginの実装&quot;&gt;Magi Claude Code Pluginの実装&lt;&#x2F;h2&gt;
&lt;p&gt;このコンセプトを実際のシステムとして実装したのが、今回作成した「Magi」Claude Code Pluginです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;システム構成&quot;&gt;システム構成&lt;&#x2F;h3&gt;
&lt;p&gt;Magiシステムは4つのエージェントで構成されています。&lt;&#x2F;p&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart LR
   U[fa:fa-user User]
    subgraph magi
      A[ARBITRATOR]
      B[MELCHIOR]
      C[BALTHASAR]
      D[CASPER]
    end
 
    U --&gt;|1.request| A
    A --&gt;|2.reconcile| U
    A --&gt;B
    A --&gt;C
    A --&gt;D
    A ---&gt;|5.result|U
&lt;&#x2F;pre&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Agent&lt;&#x2F;th&gt;&lt;th&gt;Role&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ARBITRATOR（アービトレーター）&lt;&#x2F;td&gt;&lt;td&gt;課題の構造化と最終調停を担当&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;MELCHIOR（メルキオール）&lt;&#x2F;td&gt;&lt;td&gt;科学的・技術的な分析を担当&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BALTHASAR（バルタザール）&lt;&#x2F;td&gt;&lt;td&gt;法律的・倫理的な分析を担当&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CASPER（キャスパー）&lt;&#x2F;td&gt;&lt;td&gt;感情的・トレンド分析を担当&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;動作フロー&quot;&gt;動作フロー&lt;&#x2F;h3&gt;
&lt;p&gt;システムの動作は3つのフェーズに分かれています。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;Phase 1: 課題の構造化。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    ARBITRATORがユーザーとの対話を通じて、漠然とした課題を命題、前提、A案、B案の形式に整理します。この構造化により、エージェントたちが同じ前提で議論できるようになります。
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;Phase 2: 並列分析。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    3つの専門エージェントが同時並行で分析を開始します。
    重要なのは、各エージェントが**完全に独立して判断する**点です。他のエージェントの意見を参照せず、自身の専門性と価値観に基づいて結論を出します。
    各エージェントはWeb検索機能を使って最新の情報を収集し、その結果を判断の根拠として提示します。
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;Phase 3: 合議と結論。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    ARBITRATORが3つのエージェントの投票結果を集計し、多数決で最終結論を決定します。
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;インストール方法&quot;&gt;インストール方法&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; claude-code-plugins&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# claude code上で&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; marketplace add &#x2F;path&#x2F;to&#x2F;claude-code-plugins&#x2F;marketplace test-marketplace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&#x2F;plugin&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install magi@test-marketplace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;プラグインを有効化するため、Claude Codeを一度終了して再起動します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の使用例&quot;&gt;実際の使用例&lt;&#x2F;h2&gt;
&lt;p&gt;実際の使用例です。設問は次の通りです。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;東京湾から上陸した巨大怪獣を自衛隊がディズニーランドで撃退したとします。ディズニーランドには巨大怪獣の遺体が残り、オ
リエンタルランドはディズニーランド営業再開のため一刻も早く片付けを希望しています。しかし、片付けには膨大な費用が必要です。さて、この片付け費用が誰が払うべきでしょうか?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;この設問をARBITRATORが次のように整理してくれました。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;dl&gt;
  &lt;dt&gt;命題。&lt;&#x2F;dt&gt;
  &lt;dd&gt;巨大怪獣の遺体撤去費用は誰が負担すべきか。&lt;&#x2F;dd&gt;
  &lt;dt&gt;前提。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    &lt;ul&gt;
      &lt;li&gt;自衛隊が国防行動として怪獣を撃退した。&lt;&#x2F;li&gt;
      &lt;li&gt;撤去には膨大な費用（数億～数十億円規模と想定）が必要。&lt;&#x2F;li&gt;
      &lt;li&gt;オリエンタルランドは早急な営業再開を望んでいる。&lt;&#x2F;li&gt;
      &lt;li&gt;遺体はオリエンタルランドの施設・敷地内に存在する。&lt;&#x2F;li&gt;
      &lt;li&gt;類似の法的前例は存在しない。&lt;&#x2F;li&gt;
      &lt;li&gt;保険適用は絶望的（前代未聞の事態のため）。&lt;&#x2F;li&gt;
      &lt;li&gt;災害対策基本法の適用可否については賛否が分かれている。&lt;&#x2F;li&gt;
    &lt;&#x2F;ul&gt;
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;A案: 国（政府）が全額負担。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    理由は、自衛隊による国防行動の結果であり、公共の安全確保のための公的措置。国民全体の利益のために行った行動の結果責任。
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;B案: オリエンタルランド（施設所有者）が全額負担。&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    理由は、自社敷地内に存在する物件の管理責任。営業再開による利益は企業が享受するため、その前提となる費用も負担すべき。
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;最終的な3つのAIエージェントの投票結果は次のようなものでした。
それぞれの観点からの合理性が述べられており、根拠も明確です。これは意外に活用できそうです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;【MAGI システム 最終結論】&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;投票結果: A案 3票 vs B案 0票&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;採択: A案（国が全額負担）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;各エージェントの判断:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MELCHIOR (科学的・技術的分析): A案&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 因果関係の明確性: 遺体発生の直接原因は国の防衛行動&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 費用構造の特殊性: 通常の事業リスクの範囲を遥かに超える規模と技術的複雑性&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 経済効率性: 社会全体での負担分散が最適（総合スコア A案 4.75 vs B案 2.25）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- リスク配分の合理性: 企業に制御不可能なリスクを負わせることは非合理的&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BALTHASAR (法律・倫理的分析): A案&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 法的根拠: 自衛隊法に基づく国防行動の結果責任、災害対策基本法の類推適用可能性&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 憲法的視点: 憲法第29条（財産権保障）の趣旨から、公共目的のための損失は補償されるべき&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 倫理的公正: 予見不可能な災厄の費用を偶然性で一企業に負担させることは著しく不公正&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 社会的連帯: リスクを全納税者に薄く広く分散することが社会正義に適う&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CASPER (感情・トレンド分析): A案&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 感情的公正: 被害者をさらに苦しめる構図は国民感情として受け入れがたい&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 雇用への配慮: 数万人の従業員と家族、地域経済への深刻な影響を回避&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 現代的価値観: 人間中心、包摂的な危機管理が現代社会のトレンド&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 社会的連帯: 「国を守るために国が行った行動の結果は国民全体で支える」という温かい選択&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;結論の要約:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;全会一致でA案が採択されました。 これは極めて強い合意です。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;巨大怪獣の遺体撤去費用は、国（政府）が全額負担すべきです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;主要な論点:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. 因果関係: 遺体が発生したのは、国の防衛行動の直接的結果である&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. 予見可能性: 怪獣襲来は通常の事業リスク評価の範囲外であり、企業に予見・対策を求めることは不可能&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. 法的整合性: 災害対策基本法の類推適用、憲法第29条の財産権保障、国家責任の原則から、国が負担すべき&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. 経済合理性: 社会全体で負担を分散することで、企業倒産リスクを回避し、経済的ショックを最小化できる&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5. 倫理的公正: たまたま被害を受けた場所の所有者だけに負担させることは、偶然性に基づく不正義である&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;6. 社会的連帯: 国防の便益は国民全体が享受したのだから、その費用も国民全体で負担すべき&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7. 雇用と地域経済: 数万人の従業員とその家族、周辺地域への影響を考慮すべき&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8. 将来への影響: 人間中心の危機管理の前例として、未来の類似事態への柔軟な対応を可能にする&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;推奨される具体的措置:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. 特別措置法の制定: 「巨大生物災害対策特別措置法」等を制定し、法的根拠を明確化&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. 予備費・補正予算の活用: 迅速な費用確保と撤去作業の開始&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. 自衛隊・専門機関の協力: 技術的リソースの効率的活用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. 将来の類似事態への備え: 法的・技術的フレームワークの整備&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;参照情報:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MELCHIOR (科学的・技術的):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 分析手法: ISO 31000リスクマネジメント、公共財理論、費用便益分析(CBA)、システム工学的因果分析&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 技術的考慮: 生物学的ハザード管理、特殊装備の必要性、撤去費用構造の推定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BALTHASAR (法律・倫理的):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 関連法令:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  自衛隊法第3条、国家賠償法第1条、災害対策基本法第2条・第87条、憲法第29条第3項、民法第242条・第709条・第717条&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 法原則: 国家責任の原則、社会的公正と衡平の原則、過失責任主義、公共の利益優先の原則、損失補償の法理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CASPER (感情・トレンド):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 社会的トレンド: 公共安全への公的責任の重視、被害者への共感文化、雇用保護への関心、前例のない危機への柔軟対応&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- 感情的考慮: 数万人の従業員と家族への影響、年間数千万人の来場者、地域経済、社会的連帯の精神&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MAGIシステムの最終判定として、国（政府）が全額負担することを強く推奨します。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;技術的な特徴&quot;&gt;技術的な特徴&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;エージェントの独立性&quot;&gt;エージェントの独立性&lt;&#x2F;h3&gt;
&lt;p&gt;各エージェントは完全に独立して動作します。バックグラウンドで並列実行され、他のエージェントの分析結果を参照することはありません。これにより、以下のメリットがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;多様な視点の確保&lt;&#x2F;li&gt;
&lt;li&gt;偏りの少ない意思決定&lt;&#x2F;li&gt;
&lt;li&gt;各専門分野の独立した評価&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;情報収集能力&quot;&gt;情報収集能力&lt;&#x2F;h3&gt;
&lt;p&gt;各エージェントはWeb検索機能を使って最新の情報を収集します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;MELCHIOR: 技術動向、ベンチマークデータ、研究論文など&lt;&#x2F;li&gt;
&lt;li&gt;BALTHASAR: 法律、規制、判例、ガイドラインなど&lt;&#x2F;li&gt;
&lt;li&gt;CASPER: トレンドレポート、ユーザーレビュー、事例研究など&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;収集した情報は判断の根拠として明示されるため、透明性の高い意思決定プロセスが実現できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;セッション管理&quot;&gt;セッション管理&lt;&#x2F;h3&gt;
&lt;p&gt;オプションで &lt;code&gt;state.json&lt;&#x2F;code&gt; にセッション状態を保存できます。これにより、分析を中断・再開できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;MAGIシステムは、エヴァンゲリオンの架空のシステムを実際のAI技術で再現した興味深い試みです。複数の専門的な視点から独立して分析し、合議制で結論を導くアプローチは、以下のような場面で有用です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;重要なビジネス判断&lt;&#x2F;li&gt;
&lt;li&gt;技術選定&lt;&#x2F;li&gt;
&lt;li&gt;組織的な意思決定&lt;&#x2F;li&gt;
&lt;li&gt;倫理的な判断を伴う課題&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Claude Code Pluginの仕組みを活用することで、このような複雑なマルチエージェントシステムを比較的容易に実装できることがわかりました。&lt;&#x2F;p&gt;
&lt;p&gt;プラグインのソースコードは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&quot;&gt;GitHubリポジトリ&lt;&#x2F;a&gt;で公開しています。興味のある方はぜひ試してみてください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考資料&quot;&gt;参考資料&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;claude&#x2F;docs&#x2F;claude-code&quot;&gt;Claude Code Plugin Documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;claude-code-plugins&quot;&gt;Magi Plugin Repository&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ja.wikipedia.org&#x2F;wiki&#x2F;%E6%96%B0%E4%B8%96%E7%B4%80%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B2%E3%83%AA%E3%82%AA%E3%83%B3&quot;&gt;新世紀エヴァンゲリオン&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">エヴァンゲリオンに登場するMAGIシステムを参考に、複数の専門AIエージェントによる合議制意思決定支援システムをClaude Code Pluginとして実装しました。MELCHIOR、BALTHASAR、CASPERの3つのエージェントが、科学的、法律的、感情的な視点から独立して分析を行い、多数決で結論を導くシステムです。</summary>
        </entry><entry xml:lang="en">
        <title>熊被害抑止のためのドローン飛行特例</title>
        <published>2025-12-10T00:00:00+00:00</published>
        <updated>2025-12-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/drone-exemption-for-wildlife-control/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/drone-exemption-for-wildlife-control/</id>
        
            <content type="html">&lt;h2 id=&quot;航空法第132条の92の特例とは&quot;&gt;航空法第132条の92の特例とは&lt;&#x2F;h2&gt;
&lt;p&gt;航空法第132条の92の特例では、捜索や救助など緊急な状況でのドローンの飛行について、
特例として航空法の定める国土交通省の飛行許可、承認なしで飛行を行なえるケースが
規定されています。&lt;&#x2F;p&gt;
&lt;p&gt;具体的には、能登半島地震に被災状況確認や仮設住宅用地調査などのための飛行が該当したようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今回追加された特例&quot;&gt;今回追加された特例&lt;&#x2F;h2&gt;
&lt;p&gt;熊被害の拡大を受けて、市街地への熊の侵入や被害防止のための熊の侵入経路確認、
頭数確認などで、飛行許可、承認なしで飛行させることができるようになります。
例としては熊が挙がっていますが、人命の危難の恐れのある獣害全般ということで「熊」に限定されていません。&lt;&#x2F;p&gt;
&lt;p&gt;目視外や夜間など国土交通大臣の許可、承認が必要なケースでもスキップできるようです。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、近くに熊が居て今ドローンで熊の位置確認をしないと避難もままならないなどの緊急事態を除き、
原則は&lt;strong&gt;地方自治体からの依頼&lt;&#x2F;strong&gt;があることを前提としているようです。&lt;&#x2F;p&gt;
&lt;p&gt;その場合も恐らく個人に直接依頼があるのでなく、地元のドローン協会やドローンスクールを通じてでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;まあ、私が住む千葉県には熊は生息しないとされているので、この特例を使う機会はないと思います。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;参考資料&quot;&gt;参考資料&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mlit.go.jp&#x2F;koku&#x2F;koku_tk10_000003.html#:~:text=https%3A&#x2F;&#x2F;www.mlit.go.jp&#x2F;koku&#x2F;content&#x2F;001846242.pdf&quot;&gt;航空法第132条の92の特例適用の対象となり得る事例&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mlit.go.jp&#x2F;koku&#x2F;koku_tk10_000003.html#:~:text=https%3A&#x2F;&#x2F;www.mlit.go.jp&#x2F;common&#x2F;001110204.pdf&quot;&gt;航空法第132条の92の適用を受け無人航空機を飛行させる場合の運用ガイドライン&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">2025年12月5日、航空法第132条の92の特例に獣害対策が追加されました。市街地への熊の侵入防止や頭数確認のため、地方自治体の依頼により、飛行許可・承認なしでドローンを飛行できるようになります。目視外飛行や夜間飛行も特例の対象です。</summary>
        </entry><entry xml:lang="en">
        <title>Anthropic Interviewer</title>
        <published>2025-12-07T00:00:00+00:00</published>
        <updated>2025-12-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/anthropic-interviewer/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/anthropic-interviewer/</id>
        
            <content type="html">&lt;h2 id=&quot;Anthropic_Interviewerとは&quot;&gt;Anthropic Interviewerとは&lt;&#x2F;h2&gt;
&lt;p&gt;AnthropicはClaudeの使用パターンを分析するツール「Clio」を利用して生成AIの利用パターン
などを調査してきました。しかしClioで分かるのは、Claude内で何が起きているかだけで、
Claudeがどう外の世界に影響しているかは分析できていませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;ユーザーはClaudeの出力をどう使っているのか？　AIについてどう感じているのか？
これを知るには、Claudeの入出力から分析できず、ユーザーに直接聞くしかありません。&lt;&#x2F;p&gt;
&lt;p&gt;そこでAnthropicは、Claude自身がインタビュアーとなる「Anthropic Interviewer」を開発したということです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参加方法&quot;&gt;参加方法&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropic Interviewerは、Claude.aiのFree、Pro、Maxサブスクライバー（登録から2週間以上経過）が対象です。
Claude.ai上でポップアップ招待が表示されるか、直接 &lt;code&gt;claude.ai&#x2F;interviewer&lt;&#x2F;code&gt; にアクセスすることで参加できます。&lt;&#x2F;p&gt;
&lt;p&gt;インタビューは約10〜15分で、回答に応じて質問が適応的に変化するリアルタイム会話形式です。
具体的な質問内容は固定されておらず、以下のテーマを探索します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AIの将来的な役割についてのビジョン&lt;&#x2F;li&gt;
&lt;li&gt;その視点を形成する経験、価値観、ニーズ&lt;&#x2F;li&gt;
&lt;li&gt;そのビジョンを助ける、または妨げる要因&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;初期テストでは、参加者の97.6%が満足度5以上（7段階評価）と回答し、99.12%が他者に推奨すると答えています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現在のインタビュー結果&quot;&gt;現在のインタビュー結果&lt;&#x2F;h2&gt;
&lt;p&gt;このツールを使って、1,250人にインタビューした結果が、
すでに「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;research&#x2F;anthropic-interviewer&quot;&gt;Introducing Anthropic Interviewer: What 1,250 professionals told us about working with AI&lt;&#x2F;a&gt;」
という記事で公開されています。&lt;&#x2F;p&gt;
&lt;p&gt;この記事によると、このツールを使って、一般労働者1,000人、科学者125人、クリエイター125人の計
1,250人の専門家にインタビューを実施し、AIの使用実態や感情を調査したそうです。&lt;&#x2F;p&gt;
&lt;p&gt;結果として、全体的には楽観的な見方が優勢でした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;一般労働者の86%が時間節約を実感し、日常的な作業をAIに委任しつつ、専門的アイデンティティを定義する業務は自分で行いたいと考えている&lt;&#x2F;li&gt;
&lt;li&gt;クリエイターは97%が時間節約を報告しているが、仲間からの偏見や経済的置き換えへの不安も抱えている&lt;&#x2F;li&gt;
&lt;li&gt;科学者は論文執筆やコードのデバッグにAIを活用しているが、仮説生成や実験設計などの中核的研究には信頼性の問題からまだ使用を限定している&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;私の生成AI感&quot;&gt;私の生成AI感&lt;&#x2F;h2&gt;
&lt;p&gt;今回15分ほどのインタビューを受けて、改めて自身の生成AIに対する向き合い方を意識できました。&lt;&#x2F;p&gt;
&lt;p&gt;意外だったのは、AIにServant的な役割を期待していないということです。
もちろん、生成AIに作業を代行させて生産性を上げるということはやっていますが、
あまりそこを重視していません。
それどころか、AIロボットのような人間の召使い的な方向で発展するのを極端に嫌悪しているのを初めて自分でも意識しました。&lt;&#x2F;p&gt;
&lt;p&gt;最も活用できる方向として、自分と同等以上の知識と論理性を持った「ディスカッション相手」としての生成AIだと意識できました。
自分を生成AIとの会話から新しいアイデアに辿り着いた体験が何度かあり、それが一番衝撃的だったので影響されているのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;人間にDVを受けるロボットより、バベルの塔のマザーコンピューター&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;を見たいのです。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;『バビル2世』に登場するコンピューターです。5000年前、地球に不時着した宇宙人「バビル1世」が建造した「バベルの塔」を管理する超高性能電子頭脳です。自然言語で話し
バビル2世の良き相談相手として登場します。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">昨日Claudeに「Anthropic Interviewerに参加しませんか？」と見慣れぬポップアップが表示されました。回答していくと、生成AIであるClaudeに生成AIの活用方法や将来の役割をインタビューされるという奇妙な体験でした。</summary>
        </entry><entry xml:lang="en">
        <title>React Server Components RCE脆弱性（CVE-2025-55182）への対応記録</title>
        <published>2025-12-06T00:00:00+00:00</published>
        <updated>2025-12-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/react-nextjs-cve-2025-55182-response/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/react-nextjs-cve-2025-55182-response/</id>
        
            <content type="html">&lt;h2 id=&quot;脆弱性の概要&quot;&gt;脆弱性の概要&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;CVE-2025-55182とは&quot;&gt;CVE-2025-55182とは&lt;&#x2F;h3&gt;
&lt;p&gt;CVE-2025-55182は、React 19のServer Components（RSC）における「Flight」プロトコルの安全でないデシリアライゼーション（deserialize）に起因する脆弱性です。
主な特徴は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVSSスコア: 10.0（最大値）&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;影響範囲: React 19.0.0、19.1.0、19.1.1、19.2.0&lt;&#x2F;li&gt;
&lt;li&gt;攻撃条件: 認証不要、細工されたHTTPリクエストのみで実行可能&lt;&#x2F;li&gt;
&lt;li&gt;デフォルト設定で脆弱: &lt;code&gt;create-next-app&lt;&#x2F;code&gt;により作成した標準的なNext.jsアプリケーションが影響を受ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;技術的な仕組み&quot;&gt;技術的な仕組み&lt;&#x2F;h3&gt;
&lt;p&gt;この脆弱性は、RSCの内部通信プロトコルである「Flight」の処理において、攻撃者の制御可能なデータを適切な検証なしにデシリアライズしてしまうことに起因します。攻撃者からペイロードを含むHTTPリクエストが送信されると、サーバー側ではこれをFlightプロトコルのデータとして処理し、検証なしにデシリアライズします。この結果、任意のコードを実行される可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、この処理がアプリケーションの認証ロジックより前、つまりMiddlewareでの保護より深い層で行われるため、通常の認証機構では防げないという点です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;CVE番号の統合経緯&quot;&gt;CVE番号の統合経緯&lt;&#x2F;h2&gt;
&lt;p&gt;2025年12月3日時点では、以下の2つのCVE番号で追跡されていました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-55182&lt;&#x2F;strong&gt;: React Server Componentsの脆弱性&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-66478&lt;&#x2F;strong&gt;: Next.jsの脆弱性&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;調査の結果、Next.jsの脆弱性は実質的にReactの脆弱性に起因することが判明し、&lt;strong&gt;CVE-2025-66478は重複として却下&lt;&#x2F;strong&gt;されました。現在は&lt;strong&gt;CVE-2025-55182&lt;&#x2F;strong&gt;に統合されています。&lt;&#x2F;p&gt;
&lt;p&gt;この経緯は、脆弱性の根本原因がReactのRSC実装そのものにあり、Next.jsはその影響を受けていたに過ぎないことを示しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;影響を受けるバージョンと修正版&quot;&gt;影響を受けるバージョンと修正版&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;React_&#x2F;_React-dom&quot;&gt;React &#x2F; React-dom&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;影響を受けるバージョン&lt;&#x2F;th&gt;&lt;th&gt;修正済みバージョン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;19.0.0&lt;&#x2F;td&gt;&lt;td&gt;19.0.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19.1.0, 19.1.1&lt;&#x2F;td&gt;&lt;td&gt;19.1.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19.2.0&lt;&#x2F;td&gt;&lt;td&gt;19.2.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;Next.js&quot;&gt;Next.js&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;影響を受けるバージョン&lt;&#x2F;th&gt;&lt;th&gt;修正済みバージョン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;15.x（全般）&lt;&#x2F;td&gt;&lt;td&gt;15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;16.x（全般）&lt;&#x2F;td&gt;&lt;td&gt;16.0.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;14.3.0-canary.77以降&lt;&#x2F;td&gt;&lt;td&gt;（14.x Stable版は影響なし）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;: Next.js 13.x、14.x stable版、Pages Router、Edge Runtimeは影響を受けません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の攻撃状況&quot;&gt;実際の攻撃状況&lt;&#x2F;h2&gt;
&lt;p&gt;この脆弱性は公表直後から実際に悪用されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2025年12月3日: 脆弱性が公表される&lt;&#x2F;li&gt;
&lt;li&gt;同日中: 中国関連の脅威グループによる大規模な攻撃活動が観測される&lt;&#x2F;li&gt;
&lt;li&gt;2025年12月5日午前6時（UTC）以降: Wizのセンサーが複数の被害者を検知&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この脆弱性は「React2Shell」または「React4Shell」という名称でも呼ばれ、既に実証コード（PoC）が公開されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;当ブログでの対応状況&quot;&gt;当ブログでの対応状況&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;対応タイムライン&quot;&gt;対応タイムライン&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025年12月3日&lt;&#x2F;strong&gt;: CVE-2025-55182が公表される&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;2025年12月5日&lt;&#x2F;strong&gt;: 当ブログで修正版へのアップデート実施（v1.7.1）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;実施した対応&quot;&gt;実施した対応&lt;&#x2F;h3&gt;
&lt;p&gt;以下のパッケージを修正版にアップデートしました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 実施したアップデート&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;React:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.0.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.2.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;React-dom:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.0.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.2.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Next.js:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;@next&#x2F;mdx:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;eslint-config-next:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;当ブログは&lt;strong&gt;CVE-2025-55182に完全対応済み&lt;&#x2F;strong&gt;であり、この脆弱性の影響を受けない安全な状態です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;推奨される対応&quot;&gt;推奨される対応&lt;&#x2F;h2&gt;
&lt;p&gt;Next.jsやReactを使用しているプロジェクトをお持ちの方は、以下の対応を推奨します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._バージョンの確認&quot;&gt;1. バージョンの確認&lt;&#x2F;h3&gt;
&lt;p&gt;まず現在のバージョンを確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; list next react react-dom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;2._修正版へのアップデート&quot;&gt;2. 修正版へのアップデート&lt;&#x2F;h3&gt;
&lt;p&gt;該当する場合は、直ちに修正版へアップデートしてください。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# npm の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# yarn の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;yarn&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# pnpm の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pnpm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3._内部依存関係の確認&quot;&gt;3. 内部依存関係の確認&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;&#x2F;code&gt;だけでなく、ロックファイル（&lt;code&gt;package-lock.json&lt;&#x2F;code&gt;、&lt;code&gt;yarn.lock&lt;&#x2F;code&gt;など）も確認し、内部依存関係として古いバージョンが残っていないか確認することを強く推奨します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ロックファイル内のReactバージョンを確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -A5 &amp;#39;&amp;quot;react&amp;quot;:&amp;#39; package-lock.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -A5 &amp;#39;&amp;quot;next&amp;quot;:&amp;#39; package-lock.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;4._デプロイ&quot;&gt;4. デプロイ&lt;&#x2F;h3&gt;
&lt;p&gt;アップデート後は速やかにビルドとデプロイを実施してください。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# デプロイコマンドを実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;CVE-2025-55182は、React Server Componentsの根本的な脆弱性であり、
&lt;strong&gt;CVSS 10.0&lt;&#x2F;strong&gt;という最大の深刻度を持つ重大な問題です。デフォルト設定で脆弱であり、認証を回避して攻撃可能という特性から、速やかな対応が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;当ブログでは公表から2日以内に対応を完了しましたが、既に実際の攻撃が観測されているため、まだ対応されていない方は最優先で対応することを強く推奨します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;react.dev&#x2F;blog&#x2F;2025&#x2F;12&#x2F;03&#x2F;critical-security-vulnerability-in-react-server-components&quot;&gt;Critical Security Vulnerability in React Server Components – React&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nextjs.org&#x2F;blog&#x2F;CVE-2025-66478&quot;&gt;Security Advisory: CVE-2025-66478 | Next.js&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wiz.io&#x2F;blog&#x2F;critical-vulnerability-in-react-cve-2025-55182&quot;&gt;Critical RCE Vulnerabilities Discovered in React &amp;amp; Next.js | Wiz Blog&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unit42.paloaltonetworks.com&#x2F;cve-2025-55182-react-and-cve-2025-66478-next&#x2F;&quot;&gt;Critical Vulnerabilities in React Server Components and Next.js&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nvd.nist.gov&#x2F;vuln&#x2F;detail&#x2F;CVE-2025-55182&quot;&gt;NVD - CVE-2025-55182&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">2025年12月3日、React Server Components（RSC）とNext.jsにおいて、認証不要でリモートコード実行（RCE）が可能となる重大な脆弱性が公表されました。この記事では、この脆弱性の深刻度、CVE番号の統合経緯、そして当ブログでの対応状況について記録します。</summary>
        </entry><entry xml:lang="en">
        <title>GitHub Actionsでnpmパッケージ公開を自動化する - Trusted Publishingで実現するトークンレス運用</title>
        <published>2025-12-05T00:00:00+00:00</published>
        <updated>2025-12-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/automating-npm-publish-with-github-actions/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/automating-npm-publish-with-github-actions/</id>
        
            <content type="html">&lt;p&gt;本記事では、私が開発している&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&quot;&gt;jrnl-mcp&lt;&#x2F;a&gt;パッケージで実装した、
GitHubが発表した&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;changelog&#x2F;2025-09-29-strengthening-npm-security-important-changes-to-authentication-and-token-management&#x2F;&quot;&gt;npmの認証強化&lt;&#x2F;a&gt;
対応の
Trusted Publishing (OIDC) を使用したトークン管理不要の自動公開について記載しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;npmの認証変更の背景&quot;&gt;npmの認証変更の背景&lt;&#x2F;h2&gt;
&lt;p&gt;GitHubは2025年9月29日に、npmのセキュリティ強化として以下の変更を発表しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Classic Access Tokenの廃止&lt;&#x2F;li&gt;
&lt;li&gt;Trusted Publishing (OIDC) またはGranular Access Tokenへの移行推奨&lt;&#x2F;li&gt;
&lt;li&gt;より細かい権限管理の実現&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;移行先として2つの選択肢があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Granular Access Token&lt;&#x2F;li&gt;
&lt;li&gt;Trusted Publishing (OIDC)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Granular Access Tokenは、従来のトークン方式を改良したものでパッケージごとの権限管理が可能となっていますが、定期的なトークンのローテーションが必要です。
Trusted Publishingはトークンを完全に排除した新しい認証方式で、公開を自動化しトークンを完全に排除したものです。&lt;&#x2F;p&gt;
&lt;p&gt;jrnl-mcpでは、トークン管理の手間を完全に排除できる &lt;strong&gt;Trusted Publishing&lt;&#x2F;strong&gt; を採用しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自動公開の仕組み&quot;&gt;自動公開の仕組み&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;全体のフロー&quot;&gt;全体のフロー&lt;&#x2F;h3&gt;
&lt;p&gt;jrnl-mcpでは、以下のフローで自動公開を実現しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;GitHubでリリースを作成&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Actionsが自動起動&lt;&#x2F;li&gt;
&lt;li&gt;依存関係のインストールとテストを実行&lt;&#x2F;li&gt;
&lt;li&gt;npmへ自動公開&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この仕組みにより、リリース作成だけでパッケージの公開が完了します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;GitHub_Actionsの設定&quot;&gt;GitHub Actionsの設定&lt;&#x2F;h3&gt;
&lt;p&gt;実際に使用しているワークフロー設定は以下の通りです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Publish to npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  release&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    types&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;published&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  contents&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; read&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  id-token&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Checkout code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Setup Node.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;setup-node@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          node-version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;20&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          registry-url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;https:&#x2F;&#x2F;registry.npmjs.org&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Install dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Run tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run test:ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Publish to npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm publish --provenance --access public&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重要なポイントは、&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;GitHubのリリース機能を使用することで、手動でのトリガーが可能になる。これにより、意図しないタイミングでの公開を防ぐ。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;permissions&lt;&#x2F;code&gt;の設定により、GitHub Actionsはnpmに対して一時的なOIDCトークンを発行・認証する。長期的なトークンをSecretに保存する必要がない。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;npm publish --provenance --access public&lt;&#x2F;code&gt;により自動的にprovenance（出所証明）が生成され、パッケージがどのリポジトリから公開されたか検証可能となる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;npm run test:ci&lt;&#x2F;code&gt;により公開前のテストを自動化する。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;Trusted_Publishing_の設定方法&quot;&gt;Trusted Publishing の設定方法&lt;&#x2F;h2&gt;
&lt;p&gt;Trusted Publishingを使用する場合、npm側での設定が必要です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._npm_でパッケージを公開&quot;&gt;1. npm でパッケージを公開&lt;&#x2F;h3&gt;
&lt;p&gt;まず、通常の方法で初回のパッケージを公開します（トークンを使用）。npm側でパッケージが存在している必要があるためです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._npm_で_Trusted_Publishing_を設定&quot;&gt;2. npm で Trusted Publishing を設定&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.npmjs.com&#x2F;&quot;&gt;npm のパッケージ設定&lt;&#x2F;a&gt;にアクセス&lt;&#x2F;li&gt;
&lt;li&gt;公開したパッケージの&quot;Settings&quot;タブを開く&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Publishing access&quot;セクションで&quot;Add a publisher&quot;を選択&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Actionsを選択し、以下を設定する
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;&amp;lt;username&amp;gt;&#x2F;&amp;lt;repository-name&amp;gt;&lt;&#x2F;code&gt;（例: &lt;code&gt;yostos&#x2F;jrnl-mcp&lt;&#x2F;code&gt;）&lt;&#x2F;li&gt;
&lt;li&gt;Workflow: ワークフローファイル名（例: &lt;code&gt;publish.yml&lt;&#x2F;code&gt;）&lt;&#x2F;li&gt;
&lt;li&gt;Environment: 未指定（デフォルト）または特定の環境名&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;3._GitHub_Actions_の設定&quot;&gt;3. GitHub Actions の設定&lt;&#x2F;h3&gt;
&lt;p&gt;前述のワークフロー設定で、&lt;code&gt;id-token: write&lt;&#x2F;code&gt; 権限を付与するだけで完了です。トークンをSecretに保存する必要はありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;トークンベースとの比較&quot;&gt;トークンベースとの比較&lt;&#x2F;h3&gt;
&lt;p&gt;Trusted Publishingを使用することで、以下の作業が不要になります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;npmトークンの作成と保存&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Secretsへのトークン登録&lt;&#x2F;li&gt;
&lt;li&gt;トークンの定期的なローテーション（Granular Access Tokenの場合、最大90日ごと）&lt;&#x2F;li&gt;
&lt;li&gt;トークン漏洩のリスク管理&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Trusted Publishing (OIDC) とGitHub Actionsを使用したnpmパッケージの自動公開により、以下のメリットが得られました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;公開作業の効率化&lt;&#x2F;li&gt;
&lt;li&gt;トークン管理の完全な排除&lt;&#x2F;li&gt;
&lt;li&gt;セキュリティの向上&lt;&#x2F;li&gt;
&lt;li&gt;品質の担保&lt;&#x2F;li&gt;
&lt;li&gt;透明性の確保（自動provenance生成）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に、Trusted Publishingの導入により、トークンの定期的なローテーションや漏洩リスクの心配が不要になり、セキュリティと運用性が大幅に向上しました。npmパッケージを公開している方は、ぜひTrusted Publishingへの移行とGitHub Actionsによる自動化を検討してみてください。&lt;&#x2F;p&gt;
&lt;p&gt;Granular Access Tokenでもセキュリティは向上しますが、定期的なローテーション（最大90日ごと）が必要なため、可能であればTrusted Publishingの使用を推奨します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;changelog&#x2F;2025-09-29-strengthening-npm-security-important-changes-to-authentication-and-token-management&#x2F;&quot;&gt;Strengthening npm security: Important changes to authentication and token management&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&quot;&gt;jrnl-mcp GitHub Repository&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.npmjs.com&#x2F;about-access-tokens&quot;&gt;npm Documentation: About access tokens&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">npm パッケージの公開を手動で行っていると、毎回トークンの管理やビルド、テストの実行など煩雑な作業が発生します。また、2025 年 9 月 29 日に GitHub が発表したnpmの認証強化により、Classic Token の廃止と、Trusted Publishing または Granular Access Token への移行が必要になりました。Trusted Publishing (OIDC) を使ってトークン管理不要のセキュアな公開フローを構築した手順を解説します。</summary>
        </entry><entry xml:lang="en">
        <title>高市内閣の補助金改革 - 片山財務大臣の「本物」ぶり</title>
        <published>2025-12-03T00:00:00+00:00</published>
        <updated>2025-12-03T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/minister-of-finance/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/minister-of-finance/</id>
        
            <content type="html">&lt;h2 id=&quot;内閣発足1ヶ月で示された、本質的な改革&quot;&gt;内閣発足1ヶ月で示された、本質的な改革&lt;&#x2F;h2&gt;
&lt;p&gt;12月2日の閣議後の片山さつき財務大臣の会見では次の3点が語られました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;租税特別措置、及び補助金見直しに関する関係閣僚等及び副大臣会議の概要報告&lt;&#x2F;li&gt;
&lt;li&gt;金融犯罪対策に係る官民一体・業界横断での新たな広報について&lt;&#x2F;li&gt;
&lt;li&gt;銀行を語る詐欺電話（ボイスフィッシング）についてのお知らせ&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この中で最初の項目は「日本版DOGE」などと言われていて、何となく「2位じゃダメなんでしょうか？」という悪夢、
十数年前の暗黒の民主党政権下での事業仕分けのようなことを想起されていた方も多いかも知れません。
まったく違いました。これが「本物」の改革です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;改革の核心は3つ&quot;&gt;改革の核心は3つ&lt;&#x2F;h2&gt;
&lt;p&gt;片山大臣が示した改革の核心は、次の3点です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;説明責任の徹底&lt;&#x2F;li&gt;
&lt;li&gt;評価指標の整備&lt;&#x2F;li&gt;
&lt;li&gt;国民参加の仕組み構築&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;しかも、これを「要求段階から査定段階までの一貫した対応」するとしています。&lt;&#x2F;p&gt;
&lt;p&gt;民間企業では当たり前の話です。しかし、公共の金が入っている団体では次のようなことがまかり通っています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;補助金がつけば意味分からずとも実施。実質的には県の出先機関で、独立した法人の体をなしていない。&lt;&#x2F;li&gt;
&lt;li&gt;評価指標はない。地域にどんな効果を及ぼしたかなど考えもせずに、ひたすら県から与えられた件数をこなす&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この8ヶ月、私はどれだけ言葉を変えて「説明責任の徹底」「評価指標の整備」を組織で提言してきたことか。例えば以下のようなことです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;支援件数や相談件数といった活動量だけでなく、支援企業の売上高増加率や雇用創出数など、実際の成果（アウトカム）を測定すべき&lt;&#x2F;li&gt;
&lt;li&gt;事業区分の理解徹底と成果指標の設定&lt;&#x2F;li&gt;
&lt;li&gt;支援企業の経営状況分析や政策効果測定・評価手法の開発による、実務に根ざした分析機能の構築&lt;&#x2F;li&gt;
&lt;li&gt;事業評価基準の見直しと、予算配分基準へのアウトカム実績の反映&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらすべてが、今回片山大臣が語った「説明責任の徹底」「評価指標の整備」「要求段階から査定段階までの一貫した対応」の方針と一致しています。&lt;&#x2F;p&gt;
&lt;p&gt;まったく同じような改革案が財務大臣の口から内閣発足わずか1ヶ月で具体的に語られたことに、正直、驚きを通り越して感動すら覚えました。&lt;&#x2F;p&gt;
&lt;p&gt;片山大臣は「本物」です。&lt;&#x2F;p&gt;
&lt;p&gt;目の前の無駄(な組織)は是正したいので、この国民参加の仕組みには是非意見を入れたいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;会見内容抜粋&quot;&gt;会見内容抜粋&lt;&#x2F;h2&gt;
&lt;p&gt;以下は会見の租税特別措置、及び補助金見直し部分だけをそのまま編集なく書き起こしたものです。
書き起こしには、&lt;code&gt;whisper&lt;&#x2F;code&gt;を使用しています。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=O3wAozp6R28&quot;&gt;
まず1点目本日官邸で閣議後に租税特別措置中没補助金見直しの関係閣僚等及び副大臣会議を開催いたしましたのでその概要をご報告いたします。
&lt;p&gt;本日は木原官房長官、維新の遠藤内閣総理大臣補佐官、また林総務大臣松本行革担当大臣といった関係閣僚及び前府省庁の副大臣と租税特別措置や補助金基金の見直しについて第1回目の議論を行いました。&lt;&#x2F;p&gt;
&lt;p&gt;私の方からは足元の令和8年度の予算編成も大詰めでございます。
税制改正これも大詰めではございますが、その作業の中で必要な見直しを実施しそれができるようなものがあれば直ちに見直し可能な各項目に反映していくということ。
本格的には次の令和9年度予算編成税制改正ですが、これは行政事業レビューなど既存の枠組みがたくさんございます。
これを活用しつつ要求段階から査定段階まで一貫した対応を行うことで
しっかりと点検見直しを進めていくということを申し上げました。&lt;&#x2F;p&gt;
&lt;p&gt;さらに国民の皆様に対して政策効果の説明責任を十分話すためにこれまでの会計検査員や行政事業レビュー等における
指摘を踏まえた自己点検や客観的な効果検証のための評価指標の整備などの準備を進めてまず各府省庁において自己点検というか見直しに積極に取り組んでいただきたいということをお願い申し上げました。&lt;&#x2F;p&gt;
&lt;p&gt;それからこの場でも申し上げているところですが、この取り組みに対して国民の皆様のご期待があるいは関心が非常に強いんですね。
それを私たちみんな実感をしておりますので見直すべき補助金ですとか、金ですとか、いろんな支出がございますが、
これについて広く一般の国民の皆様からご意見を募集できるような仕組みの運用を年内にも開始できるように準備を進めること、これを申し上げました。&lt;&#x2F;p&gt;
&lt;p&gt;最後に各府省庁を代表して座っていらっしゃる副大臣におかれてもとにかく政務レベルから自らの府省庁でリードしていただくということを強くお願いをしたところです。
その後林総務大臣と松本業格担当大臣からも、その取り組みについての各々の所管分野について強いご発言をいただいて、最後に官房長官から各府省庁の副大臣に対して
歳出歳入両面で強い経済を支える財政構造の転換を図ることが重要でありまして、各事業官庁においては国民への説明責任を果たせるように要求段階から効果検証を進めるなど
積極的に所得と補助金基金の点検見直しに取り組んでいただきたい
という旨のご指示がございました。&lt;&#x2F;p&gt;
&lt;p&gt;所得補助金そして基金の見直しについても今日の会議も踏まえ
今後与党の方ともよく連携しながら対応を進めてまいります。
先週金曜日に私は小林政調会長を訪問いたしまして政調会長室幹部とともに同席していただいて、対応を前向きにしていくというお話をしていただきましたので、
そういうことになると思います。&lt;&#x2F;p&gt;
&lt;p&gt;これが第一点です&lt;&#x2F;p&gt;
&lt;footer&gt;
  &lt;cite&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;O3wAozp6R28?si=kzCb845UP17ikWLY&quot;&gt;
      【片山さつき 財務大臣】閣議後会見【ノーカット】（2025年12月2日）｜TBS NEWS
      DIG
    &lt;&#x2F;a&gt;
  &lt;&#x2F;cite&gt;
&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">高市政権には大変期待していますが、高市首相だけでなく閣僚一人一人がこれまでとは違う何か凄みのようなものを感じます。とりわけ昨日12月2日の片山さつき財務大臣の会見は非常に驚いたので、書き留めておきたいと思います。</summary>
        </entry><entry xml:lang="en">
        <title>Heart - Alone(Cover)</title>
        <published>2025-11-29T00:00:00+00:00</published>
        <updated>2025-11-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/alone/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/alone/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2220847799&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;alone-heart&quot; title=&quot;Heart - Alone (Cover)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Heart - Alone (Cover)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;1987年、社会人になったばかりの頃にラジオから流れてきたこの曲。80年代っぽいかっこよさのある曲で懐かし感じます。あれから何十年も経って、1987年言えば『ストレンジャーシングス シーズン5』の舞台でもあります。もしかしてドラマ中でも流されるかもとか思いつつ、初めてギターパートをコピーしてみました。&lt;&#x2F;p&gt;
&lt;p&gt;ヴォーカルはSynthesizer V、他の楽器は打ち込みです。アレンジも80年代を感じさせてくれます。&lt;&#x2F;p&gt;
&lt;p&gt;Ann Wilsonの歌声の力強さ、そしてどこか切ないピアノ旋律に曲は支配されていますが、
彩り的なギターもHeartらしいかなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;完璧な演奏ではありませんが、懐かしさと共に弾いてみました。&lt;&#x2F;p&gt;
&lt;p&gt;懐かしく思う方々に届けば。&lt;&#x2F;p&gt;
</content>
        <summary type="html">1987年、社会人になったばかりの頃にラジオから流れてきたこの曲。80年代っぽいかっこよさのある曲で懐かしく、ギターパートをコピーしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>Archetype: Cory Wong X</title>
        <published>2025-11-24T00:00:00+00:00</published>
        <updated>2025-11-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/archetype-cory-wong/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/archetype-cory-wong/</id>
        
            <content type="html">&lt;p&gt;Neural DSPのブラックフライデーセールが始まったので、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neuraldsp.com&#x2F;plugins&#x2F;archetype-cory-wong?g_acctid=332-563-6797&amp;amp;g_adgroupid=143516937530&amp;amp;g_adid=785262400070&amp;amp;g_adtype=search&amp;amp;g_campaign=%23GAds+-+Search+-+Tier+2+-+Manual+-+Product+-+2023-04&amp;amp;g_campaignid=20006776224&amp;amp;g_keyword=archetype%20cory%20wong&amp;amp;g_keywordid=kwd-1650772231585&amp;amp;g_network=g&amp;amp;gad_campaignid=20006776224&amp;amp;gbraid=0AAAAAC8xZkBRz9yn6Lfko-2BWY7U5_4u8&quot;&gt;Archetype: Cony Wong X&lt;&#x2F;a&gt;を購入しました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2217838730&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;feel-like-making-love&quot; title=&quot;Feel Like Making Love&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Feel Like Making Love&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;アンプが3タイプあるのでテストしてみました。次のように弾き分けています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;バッキングと最初のギターはコンソール直挿しをシミュレートしたD.I. Funk Console&lt;&#x2F;li&gt;
&lt;li&gt;2番目はThe Postal Serviceというエンベロープフィルターをオンにして、The Clean MachineというおそらくローランドのJC-120をモデリングしたアンプ&lt;&#x2F;li&gt;
&lt;li&gt;3番目はDumbleをモデリングしたThe Amp Snobでディストーションサウンド&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Archetype: Cory Wong Xは、ファンクギターに特化したプラグインではありますが、3つのアンプモデルそれぞれが異なるキャラクターを持っており、クリーントーンからディストーションまで幅広いサウンドを作ることができます。特にD.I. Funk Consoleはコンソール直挿しのタイトなサウンド、The Clean Machineはクリアで煌びやかなトーン、The Amp Snobは温かみのあるオーバードライブサウンドが特徴的です。ファンク以外のジャンルでも十分に活用できる汎用性の高いプラグインだと感じました。ブラックフライデーセールではArchetype: Pliniも合わせて購入しました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Neural DSPのブラックフライデーセールでArchetype: Cory Wong XとPliniを購入しました。Cory Wong Xの3つのアンプモデル(D.I. Funk Console、The Clean Machine、The Amp Snob)をテストした感想をまとめています。</summary>
        </entry><entry xml:lang="en">
        <title>果てしなきデュアルスイーパー</title>
        <published>2025-11-21T00:00:00+00:00</published>
        <updated>2025-11-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/dual/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/dual/</id>
        
            <content type="html">&lt;p&gt;映画『果てしなきスカーレット』を見て影響されたためか、スプラでもデュアルスイーパーで復讐を果たしてきました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;K8Va2dllbOU&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">映画『果てしなきスカーレット』を見て影響されたためか、スプラでもデュアルスイーパーで復讐を果たしてきました。</summary>
        </entry><entry xml:lang="en">
        <title>Movie Review: Scarlet</title>
        <published>2025-11-21T00:00:00+00:00</published>
        <updated>2025-11-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/scarlet/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/scarlet/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;11&amp;#x2F;scarlet&amp;#x2F;scarlet.webp?h=8627a562fcf04e9778f2&quot;
  alt=&quot;Scarlet&quot; width=&quot;1800&quot; height=&quot;908&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;What_is_&amp;quot;Scarlet&amp;quot;?&quot;&gt;What is &quot;Scarlet&quot;?&lt;&#x2F;h2&gt;
&lt;p&gt;I didn&#x27;t even know it was an animated film, so I initially regretted my choice—but from the opening scene, I was completely blown away and couldn&#x27;t take my eyes off the screen.&lt;&#x2F;p&gt;
&lt;p&gt;Written and directed by Mamoru Hosoda and produced by Studio Chizu, this 2025 Japanese animation is inspired by Shakespeare&#x27;s &quot;Hamlet.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;The 19-year-old Princess Scarlet watches as her father, the king, is murdered by her power-hungry uncle Claudius. She confronts him seeking revenge but is defeated and dies. She awakens in the &quot;Land of the Dead,&quot; where she faces a harsh fate: unless she achieves her revenge and reaches the &quot;Unseen Place,&quot; her very existence will fade away. Scarlet embarks on a journey of vengeance.&lt;&#x2F;p&gt;
&lt;p&gt;Today, November 21, 2025, is actually the opening day in Japan.&lt;&#x2F;p&gt;
&lt;p&gt;Here are three things that stood out to me.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._Stunning_Visuals_and_IMAX_Sound&quot;&gt;1. Stunning Visuals and IMAX Sound&lt;&#x2F;h2&gt;
&lt;p&gt;Since most of the story takes place in the &quot;Land of the Dead,&quot; there are fantastical images of giant dragons and crowds of tens of thousands, largely rendered in 3D CG. The sheer scale combined with CGI that&#x27;s both photo-realistic in its intensity and incredibly detailed is just mind-blowing.&lt;&#x2F;p&gt;
&lt;p&gt;Plus, I happened to catch the IMAX version, and the booming, realistic sound made even the most fantastical imagery feel incredibly convincing—like you could actually believe it was real.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._Voice_Acting_Performances&quot;&gt;2. Voice Acting Performances&lt;&#x2F;h2&gt;
&lt;p&gt;I was also blown away by the powerful voice performances from the protagonist and other main characters.&lt;&#x2F;p&gt;
&lt;p&gt;I didn&#x27;t know who was voicing them while watching, but when
I saw the ending credits, I was shocked. The cast includes
Mana Ashida, Masao Okada, Koji Yakusho, and Masachika Ichimura.
It also features Kotaro Yoshida, Yuki Saito, Yutaka Matsushige,
and Shota Sometani—an incredibly star-studded lineup.&lt;&#x2F;p&gt;
&lt;p&gt;Especially Mana Ashida as the protagonist—she brings a genuine intensity that typical voice actors can&#x27;t quite capture. I found myself muttering &quot;she&#x27;s amazing&quot; during the credits.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._The_Ending_Song&quot;&gt;3. The Ending Song&lt;&#x2F;h2&gt;
&lt;p&gt;And yes, Mana Ashida also sings the ending song. I&#x27;m not sure
how skilled of a singer she is. Nowadays there&#x27;s probably
quite a bit of audio enhancement. But the ending—which begins
with a phrase from the film—had a persuasive power that could
only come from her voice.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I finished my errands at the mall way earlier than expected, and since it was a weekday and the theater was pretty empty, I decided to catch a movie.It was such a spontaneous decision that I didn&#x27;t even research what was playing—I just jumped into whatever was starting soonest, barely glancing at the title.That movie turned out to be &quot;Scarlet&quot; (果てしなきスカーレット). Unexpectedly, it was absolutely fantastic.</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Amber Glint</title>
        <published>2025-11-18T00:00:00+00:00</published>
        <updated>2025-11-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/amber-glint/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/amber-glint/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;11&amp;#x2F;amber-glint&amp;#x2F;amber-glint.webp?h=86b20621968dcd8d1c8f&quot;
  alt=&quot;Amber Glint&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;17015&quot;&gt;Amber Glint&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A fleeting amber glint catches the edge of autumn leaves, as the late-afternoon sun slips through the quiet street. Each leaf becomes a small lantern, glowing with warmth where light meets color. The canopy above filters the golden hour into fragments of brilliance, revealing the gentle transition from green to gold, a moment suspended between seasons.&lt;&#x2F;p&gt;
</content>
        <summary type="html">A fleeting amber glint dances across autumn leaves, as afternoon light filters through the canopy, illuminating the quiet transition of seasons.</summary>
        </entry><entry xml:lang="en">
        <title>Neural DSP Archetypeプラグインを買おう</title>
        <published>2025-11-16T00:00:00+00:00</published>
        <updated>2025-11-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/archetype/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/archetype/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;11&amp;#x2F;archetype&amp;#x2F;archetype.webp?h=865d5fbfa4c5f094fcf7&quot;
  alt=&quot;Neural DSP Archetype&quot; width=&quot;795&quot; height=&quot;635&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Archetype_シリーズとは&quot;&gt;Archetype シリーズとは&lt;&#x2F;h2&gt;
&lt;p&gt;Archetypeシリーズは、Neural DSP社が開発するプラグインで、PC&#x2F;Mac上でギターアンプやエフェクターっを再現するソフトウェアです。&lt;&#x2F;p&gt;
&lt;p&gt;このジャンルの先駆けとなったIK MultimediaのAmplitubeも持っていますが、Amplitubeが膨大なアンプとエフェクターに対応した総合的なアンプシミュレーターであるのに対し、Archetypeシリーズはアーチストの名を冠したラインナップに分れており、そのアーチストに特化した数種類のアンプとエフェクターが厳選されています。&lt;&#x2F;p&gt;
&lt;p&gt;個人的に以下の点を評価しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;厳選したモデルをリアルに再現したアンプモデリング技術&lt;&#x2F;li&gt;
&lt;li&gt;アーチストのスタイルに特化した実用的な機材の組み合わせに厳選&lt;&#x2F;li&gt;
&lt;li&gt;高音質の割りにCPU負荷が軽い&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Amplitubeが「広く浅く」多くのジャンルに対応しているのに対して、「狭く深く」特定ジャンルに特化しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;購入候補&quot;&gt;購入候補&lt;&#x2F;h2&gt;
&lt;p&gt;Neural DSPの過去のブラックフライデーセールを確認すると、
2022年は11月18日、22023年は11月17日、024年は11月24日にセールが始まったようです。
よって、今年も今週か遅くとも来週にはセールがあると予想できます。
どのプラグインを購入するか決めなければなりません。&lt;&#x2F;p&gt;
&lt;p&gt;現在検討しているのは以下の2つです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Archetype:_Cory_Wong_X&quot;&gt;Archetype: Cory Wong X&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neuraldsp.com&#x2F;plugins&#x2F;archetype-cory-wong&quot;&gt;Archetype: Cory Wong X&lt;&#x2F;a&gt;は、
Vulfpeck（ヴァルフペック）のギタリストでファンクギターの代表的存在としてクリーントーンの美学と完璧主義的な音作りで「モダンギターヒーロー」と称されているCory
Wongの機材をシミュレートしたプラグインです。&lt;&#x2F;p&gt;
&lt;p&gt;クリーントーンからローゲインまでカバーでき、なかなか極まらないファンクなカッティングに適した音が直ぐに出せます。ブースターとオーバードライブをオンにしてThe Amp Snobを選べば、激しめのリードもこなせそうです。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;Pre_Effect&quot;&gt;Pre Effect&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Wah - MIDI対応のワウペダル（オートワウ機能付き）&lt;&#x2F;li&gt;
&lt;li&gt;The Postal Service - エンベロープフィルター&lt;&#x2F;li&gt;
&lt;li&gt;The 4th Position Compressor - Coryのシグネチャーコンプレッサー&lt;&#x2F;li&gt;
&lt;li&gt;The Tuber - チューブアンプファン向けの改造ブースター&lt;&#x2F;li&gt;
&lt;li&gt;The Big Rig Overdrive - ファズ寄りの強力なオーバードライブ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;Amp&quot;&gt;Amp&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;D.I. Funk Console - アナログチャンネルストリップベース、チューブサチュレーション&#x2F;コンプレッサー&#x2F;EQ&#x2F;フィルター搭載。その名の通りコンソール直の音をシミュレートしており貴重&lt;&#x2F;li&gt;
&lt;li&gt;The Clean Machine - 業界最高のクリーンアンプを集約したカスタムアンプ。おそらくRoland Jazz Chorusがモデル&lt;&#x2F;li&gt;
&lt;li&gt;The Amp Snob - 希少なアンプのモデル、クリーンから歪み手前まで対応。Dumbleアンプがモデル&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;Post_Effect&quot;&gt;Post Effect&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;The 80s - 80年代風ヴィンテージコーラス&lt;&#x2F;li&gt;
&lt;li&gt;Delay-y-y - アナログ回路ベースのBBDディレイ&lt;&#x2F;li&gt;
&lt;li&gt;The Wash - シマー機能付きリバーブ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;Archetype:_Plini_X&quot;&gt;Archetype: Plini X&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neuraldsp.com&#x2F;plugins&#x2F;archetype-plini&quot;&gt;Archetype: Plini X&lt;&#x2F;a&gt;は、プログレッシブ、フュージョン、メタルのブレンドサウンドに特化した汎用性の高いプラグインです。&lt;&#x2F;p&gt;
&lt;p&gt;アンプの前にディレイがあるのは魅力的ですね。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;Pre_Effect-1&quot;&gt;Pre Effect&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Compressor - バスコンプのモデル&lt;&#x2F;li&gt;
&lt;li&gt;Octaver（新機能）- オクターブ上下のブレンド&lt;&#x2F;li&gt;
&lt;li&gt;Drive（更新版）- ブースト&#x2F;オーバードライブ、ファズスイッチ追加&lt;&#x2F;li&gt;
&lt;li&gt;Delay（新機能）- ディープなアンビエンス用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;Amp-1&quot;&gt;Amp&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Clean - 透明でパンチのあるクリーンアンプ。Fender Twin + Dumbleのミックス&lt;&#x2F;li&gt;
&lt;li&gt;Crunch - クリーンとハイゲインの中間、ブリティッシュトーン。Friedman BE-100 (BEチャンネル)&lt;&#x2F;li&gt;
&lt;li&gt;Lead - Crunchにゲインステージ追加、リード&#x2F;ヘヴィリフ向け。Friedman HBE + EVH 5150&#x2F;5153のミックス&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;Post_Effect-1&quot;&gt;Post Effect&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Chorus（新機能）- ヴィンテージ80s&#x2F;モダン空間系の2モード&lt;&#x2F;li&gt;
&lt;li&gt;Delay（更新版）- テープサチュレーション&#x2F;モジュレーション搭載&lt;&#x2F;li&gt;
&lt;li&gt;Reverb - 多次元リバーブ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Cory Wongは購入確定なので、残る選択肢を整理します。
歪み系ならPliniかなと思っていますが、Nollyも気になっています。&lt;&#x2F;p&gt;
&lt;p&gt;Pliniはクリーンからハイゲインまで汎用的で、プログレ・フュージョン・メタルと幅広く対応します。Cory Wongと組み合わせれば、クリーンから激しい歪みまでシームレスにカバーできるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;一方Nollyはモダンメタル特化で、4種類のアンプと640のIRを搭載し、より攻撃的なサウンドに強みがあります。既にCory Wongでクリーンが確保できているなら、ハイゲインに振り切ったNollyも魅力的です。&lt;&#x2F;p&gt;
&lt;p&gt;ブラックフライデーセールは11月末頃から始まり半額になる可能性が高いため、全て14日間無料トライアルで試して今週中に決断せねば。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Thanksgiving Day is coming up soon.Neural DSP, which develops and sells music-related devices and software,also typically starts its Black Friday sale in the third week of November each year.The Neural DSP Archetype plugin for guitar that I&#x27;ve always wanted will probably be half-priced on Black Friday.Let&#x27;s make sure to prepare thoroughly and decide which ones to buy before the sales starts.</summary>
        </entry><entry xml:lang="en">
        <title>技術無知が経営リスクになった理由</title>
        <published>2025-11-08T00:00:00+00:00</published>
        <updated>2025-11-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/tech-ignorance-is-business-liability-ja/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/tech-ignorance-is-business-liability-ja/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;11&amp;#x2F;tech-ignorance-is-business-liability-ja&amp;#x2F;noitdept.webp?h=074677f7f792dfd9f5b2&quot;
  alt=&quot;No IT dept&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;業務システム台帳とは何か&quot;&gt;業務システム台帳とは何か&lt;&#x2F;h2&gt;
&lt;p&gt;「業務システム台帳」とは、組織が所有する業務システムを記録し、一覧化する台帳です。重要なのは、各システムの内部構造や技術的な詳細を管理するものではないということです。&lt;&#x2F;p&gt;
&lt;p&gt;具体的には、台帳にはシステムの以下のような基本的な属性を記録します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;システム名。組織内で一意に識別できる名称(例。財務システム、販売管理システム、人事管理システム)&lt;&#x2F;li&gt;
&lt;li&gt;業務プロセス。システムがサポートする業務プロセスの名称。これにより、システムが組織にどのような価値を提供しているかが可視化される。前提として、組織が業務プロセスの台帳も整備していることが望ましい&lt;&#x2F;li&gt;
&lt;li&gt;業務プロセスオーナー。これも重要な属性である。システムの責任者が誰で、予算を管理しているかが明確になる。これがないと、システムに関する意思決定やライフサイクル管理が曖昧になる&lt;&#x2F;li&gt;
&lt;li&gt;重要度。システムが事業継続計画(BCP)の対象となる重要システムなのか、停止しても業務への影響が限定的なシステムなのかを分類する。リスク管理や投資の優先順位を決定するために不可欠な情報である&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;業務システム台帳は、ITガバナンスの最も基本的な構成要素です。組織が自分の所有物を理解していなければ、適切な投資判断、リスク管理、コスト最適化は始まりません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;業務システム台帳の重要性&quot;&gt;業務システム台帳の重要性&lt;&#x2F;h2&gt;
&lt;p&gt;近年、ランサムウェアに攻撃される企業が増えています。ランサムウェアはシステムとデータを暗号化し、業務を数ヶ月にわたって停止させます。このような危機的状況において、業務システム台帳が存在しなかったらどうなるでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;何が破壊され、何を復旧すべきかを誰も把握できません。どのシステムが業務にとって最も重要でしょうか。各システムのデータバックアップはどこにあるのでしょうか。そもそも組織全体でいくつのシステムが稼働していたのでしょうか。この基本的な情報がなければ、復旧作業は極めて混乱し、事業再開は大幅に遅れることになります。業務システム台帳は危機管理のための最も基本的なインフラです。&lt;&#x2F;p&gt;
&lt;p&gt;もう1つの重要な側面は、会計要件に起因します。請負契約で開発されたシステムは無形固定資産として減価償却する必要があり、運用段階での機能強化も資産計上の対象となります。しかし、会計資産台帳だけでは、どの機能強化が資産計上に値するかといった業務システム固有の判断は難しいです。会計資産台帳と整合性のとれた業務システム台帳が必要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜ組織は業務システム台帳を維持できないのか&quot;&gt;なぜ組織は業務システム台帳を維持できないのか&lt;&#x2F;h2&gt;
&lt;p&gt;多くの組織は他社の災害を目撃し、危機感に駆られて台帳の整備を始めます。しかし、ほとんどの場合、台帳は作成された瞬間から忘れ去られ、やがて古くなり、闇に葬られます。&lt;&#x2F;p&gt;
&lt;p&gt;例えば、ある部門が独自にシステムを調達したが、台帳には登録されません。別のシステムは対応する業務プロセスを拡大するために大規模な機能強化を行ったが、台帳には反映されません。このようにして、台帳は徐々に現実と乖離し、役に立たなくなり、最終的には廃棄されます。&lt;&#x2F;p&gt;
&lt;p&gt;なぜこのようなことが起こるのでしょうか。マーフィーの法則は「うまくいかなくなる可能性のあることは、うまくいかなくなる」と述べています。しかも、我々はITガバナンスの確立に失敗した機能不全の組織について語っているのです。そのような組織において、人々の善意と勤勉さに頼る運用は、いずれ必ず失敗します。&lt;&#x2F;p&gt;
&lt;p&gt;では、どうすれば台帳を維持できるのでしょうか。鍵は金の流れです。部門のシステム調達も、大規模なシステム強化も、必ず金銭取引を伴います。この金の流れを捕捉できれば、台帳の変更を見逃さないトリガーとして利用できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;業務システム台帳を維持する仕組み&quot;&gt;業務システム台帳を維持する仕組み&lt;&#x2F;h2&gt;
&lt;p&gt;前節で述べたように、鍵は金の流れを捕捉することです。業務システムに関連する財務プロセスは、予算編成、支出(調達)、固定資産会計の3つです。これらのプロセスに台帳の更新を組み込むことで、台帳を自動的に維持する仕組みを確立できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;予算編成&quot;&gt;予算編成&lt;&#x2F;h3&gt;
&lt;p&gt;業務システムを運用または変更するには予算編成が必要です。一般的に、予算は予算コード(勘定科目コード)と予算額で管理されます。したがって、予算編成プロセスでは以下の2つが必要です。&lt;&#x2F;p&gt;
&lt;p&gt;予算が業務システムに関連する場合、業務システム台帳のレコードとリンクさせなければなりません。この段階で業務システムが業務システム台帳に登録されていない場合は、新しいシステムとみなし、台帳に追加しなければなりません。このようにして、台帳にないシステムへの予算編成を防ぐことができます。&lt;&#x2F;p&gt;
&lt;p&gt;次に、予算編成プロセスの完了時に、運用中または運用予定のすべての業務システムに予算が配分されているかを確認します。予算が割り当てられていないにもかかわらず稼働している運用業務システムのオーナーには、予算配分を義務付けます。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、台帳を維持するために台帳の更新を要求するのではなく、台帳と整合性がとれていなければ予算処理を完了できない仕組みを組み込むことです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;支出(調達)&quot;&gt;支出(調達)&lt;&#x2F;h3&gt;
&lt;p&gt;業務システムの導入、変更、保守には必ず支出が発生します。IT部門が確立されていない組織では、これらの支出は通常、調達部門または経理部門を通じて処理されます。この調達プロセス自体が、台帳を維持するための最も信頼できるトリガーとなります。&lt;&#x2F;p&gt;
&lt;p&gt;業務システムに関連する発注や契約は、どの予算に紐づいているかで識別できるはずです。業務システムに関連すると識別された調達については、発注時と納品時の両方で業務システム台帳とのリンクと整合性を確保することを義務付けるべきです。これにより、「部門が独自にシステムを調達したが、台帳には追加されなかった」といった失敗パターンを防ぐことができます。&lt;&#x2F;p&gt;
&lt;p&gt;調達プロセスに台帳の整合性チェックを組み込むことで、多くの企業はこのチェックを迂回した調達を逸脱、つまり「BYPASS」として扱い、要求部門にペナルティを課します。将来的には、これらのチェックは組織のITガバナンスフレームワークの一部としても機能し、導入されるシステムが組織の意図するアーキテクチャに合致しているかを確認するレビューポイントとしても機能します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;固定資産会計&quot;&gt;固定資産会計&lt;&#x2F;h3&gt;
&lt;p&gt;請負契約で開発された業務システムは、組織の無形固定資産として記録され、減価償却の対象となります。SaaSなどのサービスベースの契約は資産として計上されませんが、発注・納品されるシステムは会計上も適切に管理しなければなりません。&lt;&#x2F;p&gt;
&lt;p&gt;IT部門がない組織では「引き渡し」を捕捉するプロセスがないため、納品時に無形固定資産台帳の更新と業務システム台帳の更新をリンクさせる仕組みが不可欠です。システムオーナーは、機能強化が資産計上に値するかを判断し、経理部門に台帳の更新を依頼しなければなりません。この整合性チェックが完了するまで検収を完了できないようなプロセスを設計することで、両方の台帳が確実に更新されます。&lt;&#x2F;p&gt;
&lt;p&gt;この仕組みには2つの効果があります。組織の会計実務が正確であれば、無形固定資産台帳には資産計上が必要なすべてのシステムが正しく記録されているはずです。この台帳との整合性を維持することで、業務システム台帳の信頼性が高まります。逆に、会計実務が不正確な場合、業務システム台帳との整合性を確保する仕組みを確立することで、不適切な会計処理を防ぐことができます。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、この整合性チェックを検収プロセスに組み込むことで、人間の善意に依存することなく、両方の台帳が確実に維持されることです。この検証なしには検収を完了できないようにすれば、更新は標準的なワークフローの一部として自動的に行われます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;&#x2F;h2&gt;
&lt;p&gt;業務システム台帳すら整備していない組織は、たとえ危機感に駆られて作成したとしても、それを維持できません。作成した瞬間から劣化し始めることは明らかです。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、それを維持する仕組みです。金の流れに伴う避けられないプロセス、すなわち予算、調達、会計に、台帳を更新・維持する仕組みを組み込むことが重要です。&lt;&#x2F;p&gt;
&lt;p&gt;逆に言えば、この仕組みを確立するだけで、ITガバナンスへの第一歩を踏み出すことができます。難しいことではありません。システムに関連する金の流れを捕捉すればよいだけです。それすらできないのであれば、あなたの組織はITガバナンス以前にコーポレートガバナンスの基本すら備わっていません。まあ、そうなのでしょうけれど。&lt;&#x2F;p&gt;
</content>
        <summary type="html">この記事はIT部門を持たず、非技術部門だけでベンダーに作らせた業務システムを所有し運用している組織について想定しています。きっとランサムウェアで危機に見舞われているアサヒビールやアスクルを見て震え上がって、何をすればいいか焦っている組織も多いと思います。そんな組織が行なうべき第一歩として業務システム台帳の整備について解説しています。</summary>
        </entry><entry xml:lang="en">
        <title>Because Your Tech Ignorance Is Now a Business Liability</title>
        <published>2025-11-08T00:00:00+00:00</published>
        <updated>2025-11-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/tech-ignorance-is-business-liability/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/tech-ignorance-is-business-liability/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;11&amp;#x2F;tech-ignorance-is-business-liability&amp;#x2F;noitdept.webp?h=074677f7f792dfd9f5b2&quot;
  alt=&quot;No IT dept&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;What_is_Application_System_Inventory?&quot;&gt;What is Application System Inventory?&lt;&#x2F;h2&gt;
&lt;p&gt;&quot;Application System Inventory&quot; is an inventory that records and keeps a list of application systems the organization owns. The important point is that it does not manage the internal structure of each system or technical details.&lt;&#x2F;p&gt;
&lt;p&gt;More specifically, the inventory stores the following basic attributes of systems.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;System Name: A name that can be uniquely identified within the organization (e.g. Finance System, Sales Management System, Human Resource Management System).&lt;&#x2F;li&gt;
&lt;li&gt;Business Process: A name of the business process that the system supports. This makes visible what kind of value the system provides to the organization. As a prerequisite, it is desirable that the organization also maintains an inventory of its business processes.&lt;&#x2F;li&gt;
&lt;li&gt;Business Process Owner: This is also an important attribute. This clarifies who is responsible for the system and manages the budget for it. Without this, decision-making and life-cycle management for the system become ambiguous.&lt;&#x2F;li&gt;
&lt;li&gt;Importance: This classifies whether the system is a critical system that is subject to Business Continuity Planning(BCP), or a system whose impact on business operations is limited even if it stops. This is essential information for risk management and determining investment priorities.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Application System Inventory is the most fundamental component of IT governance. If the organization doesn&#x27;t understand what it owns, appropriate investment decisions, risk management, and cost optimization cannot begin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Why_Application_System_Inventory_Is_Important&quot;&gt;Why Application System Inventory Is Important&lt;&#x2F;h2&gt;
&lt;p&gt;In recent months, an increasing number of enterprises have been attacked by ransomware. The ransomware encrypts their systems and data, disrupting business operations for several months. In such critical situations, what happens if Application System Inventory does not exist?&lt;&#x2F;p&gt;
&lt;p&gt;No one would be able to understand what has been destroyed and what should be restored. Which systems are most critical for business operations? Where are the data backups for each system located? How many systems were operating across the organization in the first place? Without this basic information, recovery efforts would become extremely chaotic, and business resumption would be significantly delayed. Application System Inventory is the most fundamental infrastructure for crisis management.&lt;&#x2F;p&gt;
&lt;p&gt;Another important aspect is driven by accounting requirements.
Systems developed under a work contract (&quot;Ukeoi&quot; contract)
need to be depreciated as intangible fixed assets.
Functional enhancements during the operational phase are also
subject to capitalization. However, with only the accounting
asset ledger, it is difficult to make judgments specific to
Application Systems, such as which functional enhancements
warrant capitalization. An Application System Inventory that
is aligned with the accounting asset ledger is necessary.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Why_Organizations_Cannot_Maintain_Application_System_Inventory&quot;&gt;Why Organizations Cannot Maintain Application System Inventory&lt;&#x2F;h2&gt;
&lt;p&gt;Many organizations witness other companies&#x27; disasters and begin to establish their Inventory, driven by a sense of crisis. However, in most cases, the inventory is forgotten from the moment it is created and eventually becomes outdated and buried in the darkness.&lt;&#x2F;p&gt;
&lt;p&gt;For example, a department procures a system independently, but it is not registered in the inventory. Another system undergoes major enhancements to expand the business processes it supports, but this is not reflected in the inventory. In this way, the inventory gradually diverges from reality, becomes useless, and is eventually discarded.&lt;&#x2F;p&gt;
&lt;p&gt;Why does this happen? Murphy&#x27;s Law states, &quot;Anything that can go wrong will go wrong.&quot; Moreover, we are talking about dysfunctional organizations that have failed to establish IT Governance. Operations that rely on the goodwill and diligence of people in such organizations are bound to fail at some point.&lt;&#x2F;p&gt;
&lt;p&gt;So how can we maintain the Inventory? The key is the flow of money. Both departmental system procurement and major system enhancements are always accompanied by financial transactions. If you can capture this flow of money, you can use it as a trigger that won&#x27;t miss changes to the Inventory.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Mechanism_to_Maintain_Application_System_Inventory&quot;&gt;The Mechanism to Maintain Application System Inventory&lt;&#x2F;h2&gt;
&lt;p&gt;As described in the previous section, the key is to capture the flow of money. There are three financial processes related to Application System: budgeting, expenditure(procurement), and fixed asset accounting. By incorporating Inventory updates into these processes, you can establish a mechanism to maintain the Inventory automatically.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Budgeting&quot;&gt;Budgeting&lt;&#x2F;h3&gt;
&lt;p&gt;Budgeting must be done for operating or modifying an Application System. Generally, budgets are managed using budget codes or account codes, along with budget amounts. Therefore, the following two things are required during the budgeting process:&lt;&#x2F;p&gt;
&lt;p&gt;If the budget is related to Application System, it must be linked to a record in the Application System Inventory. If, at this stage, the Application System isn&#x27;t registered in the Application System Inventory, it must be considered a new system and should be added to the inventory as such. In this way, you can prevent budgeting for systems that are not in the Inventory.&lt;&#x2F;p&gt;
&lt;p&gt;Next, at the completion of the budgeting process, you verify whether some budget has been allocated to all Application Systems that are either operational or planned to be operational. You mandate budget allocation for the owners of operational application systems that are running despite not having an assigned budget.&lt;&#x2F;p&gt;
&lt;p&gt;The important point is not to require Inventory updates to maintain it, but to incorporate a mechanism in which budget processing cannot be completed without being consistent with the Inventory.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Expenditure(Procurement)&quot;&gt;Expenditure(Procurement)&lt;&#x2F;h3&gt;
&lt;p&gt;The introduction, modification, and maintenance of Application Systems always incur expenditures. In organizations without an established IT department, these expenditures are typically processed through the procurement or accounting departments. This procurement process itself becomes the most reliable trigger for maintaining the Inventory.&lt;&#x2F;p&gt;
&lt;p&gt;Orders and contracts related to Application Systems should be
identifiable based on which budget they are tied to.&lt;&#x2F;p&gt;
&lt;p&gt;For procurements related to Application Systems,
it should be mandatory to ensure linkage and consistency
with the Application System Inventory.
This applies both at the time of ordering and at delivery.
This prevents failure patterns such as
&quot;a department independently procured a system, but it was
never added to the Inventory.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;By embedding an Inventory consistency check within the
procurement process, many companies treat any procurement
that bypasses this check as a deviation—a &quot;BYPASS&quot;.
They impose penalties on the requesting department.&lt;&#x2F;p&gt;
&lt;p&gt;In the future, these checks will also function as part of
the organization&#x27;s IT Governance framework. They serve as a
review point to verify whether systems being introduced
align with the organization&#x27;s intended architecture.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Fixed_Asset_Accounting&quot;&gt;Fixed Asset Accounting&lt;&#x2F;h3&gt;
&lt;p&gt;Application Systems developed under contract should be recorded as intangible fixed assets of the organization and are subject to depreciation. Service-based agreements such as SaaS are not capitalized as assets, but systems that are ordered and delivered must still be properly managed from an accounting perspective.&lt;&#x2F;p&gt;
&lt;p&gt;In organizations without an IT department, there is no
&quot;handover&quot; capture process. Therefore, a mechanism that links
the update of the intangible fixed asset ledger with the
Application System Inventory upon delivery is essential.
The system owner must determine whether a functional
enhancement qualifies for capitalization and request the
accounting department to update the ledger. By designing
a process that prevents acceptance until this consistency
check is completed, both ledgers are reliably updated.&lt;&#x2F;p&gt;
&lt;p&gt;This mechanism has two effects. If the organization&#x27;s accounting practices are accurate, the intangible fixed asset ledger should correctly record all systems that need to be capitalized. Maintaining consistency with this ledger enhances the reliability of the Application System Inventory. Conversely, if accounting practices are inaccurate, establishing a mechanism to ensure consistency with the Application System Inventory helps prevent improper accounting treatments.&lt;&#x2F;p&gt;
&lt;p&gt;Crucially, embedding this consistency check into the acceptance process ensures that both ledgers are maintained reliably without depending on human goodwill. When acceptance cannot be completed without this verification, the updates happen automatically as part of the standard workflow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Organizations that have not even established an Application System Inventory, even if driven by a sense of crisis to create one, will not be able to maintain it. It is clear that it will start to decay from the moment it is created.&lt;&#x2F;p&gt;
&lt;p&gt;What matters is the mechanism to maintain it. It is important to embed the mechanism for updating and maintaining the Inventory into the unavoidable processes that accompany the flow of money: budget, procurement, and accounting.&lt;&#x2F;p&gt;
&lt;p&gt;Conversely, if you simply establish this mechanism, you can take the first step toward IT governance. It is not difficult. You just need to capture the flow of money related to systems. If you cannot even do that, your organization does not have the fundamentals of corporate governance in place even before considering IT governance—though that is likely the case.&lt;&#x2F;p&gt;
</content>
        <summary type="html">この記事はIT部門を持たず、非技術部門だけでベンダーに作らせた業務システムを所有し運用している組織について想定しています。きっとランサムウェアで危機に見舞われているアサヒビールやアスクルを見て震え上がって、何をすればいいか焦っている組織も多いと思います。そんな組織が行なうべき第一歩として業務システム台帳の整備について解説しています。</summary>
        </entry><entry xml:lang="en">
        <title>First Manual Mode FPV Flight Session</title>
        <published>2025-11-04T00:00:00+00:00</published>
        <updated>2025-11-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/first-fpv-flight/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/first-fpv-flight/</id>
        
            <content type="html">&lt;p&gt;During a recent aerial photography session at Lake Sasagawa, I forgot my DJI Air 3S and had to rely on the DJI Neo as a backup. While capturing standard high-altitude shots, I noticed the potential for more dynamic, FPV-style cinematography.&lt;&#x2F;p&gt;
&lt;p&gt;This sparked my interest in maximizing the Neo&#x27;s capabilities, so I&#x27;ve been grinding simulator hours to master manual mode control. Today marked my first real-world manual flight test with the actual hardware.&lt;&#x2F;p&gt;
&lt;p&gt;My current setup consists of DJI Goggles N3 paired with
the DJI FPV Remote Controller 3. As expected, the physics
and latency characteristics differ significantly from
simulation environments. After approximately one hour of
iterative testing, I managed to develop basic muscle memory
for the control scheme.&lt;&#x2F;p&gt;
&lt;p&gt;Still requires substantial practice to achieve proficiency.
The low-level flight dynamics offer a completely different
piloting experience compared to traditional high-altitude
aerial photography workflows.&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;OCa_NgF0AIs&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">Initial attempt at manual flight control with the DJI Neo. From simulator training to real-world flight testing, experiencing the complexity and thrill of FPV drone piloting.</summary>
        </entry><entry xml:lang="en">
        <title>スプラトゥーン3:スタダ＋対物マニューバ</title>
        <published>2025-11-01T00:00:00+00:00</published>
        <updated>2025-11-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/11/start-dash/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/11/start-dash/</id>
        
            <content type="html">&lt;p&gt;マニュコラにスタートダッシュと対物性能アップを積んで、ガチホコで一気に決着をつけに行くという戦法です。イライラが溜まった時には、最高に気持ちよくなれます。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;CoVYfCCLkbY&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">マニュコラにスタートダッシュと対物性能アップを積んで、ガチホコで一気に決着をつけに行くという戦法です。イライラが溜まった時には、最高に気持ちよくなれます。</summary>
        </entry><entry xml:lang="en">
        <title>OpenAI Chairman Says a Dot-Com-Like Bust Wouldn’t Be All Bad</title>
        <published>2025-10-31T00:00:00+00:00</published>
        <updated>2025-10-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/dot-com-like-bust/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/dot-com-like-bust/</id>
        
            <content type="html">&lt;p&gt;「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;news.bloomberglaw.com&#x2F;artificial-intelligence&#x2F;openai-chairman-says-a-dot-com-like-bust-wouldnt-be-all-bad&quot;&gt;OpenAI Chairman Says a Dot-Com-Like Bust Wouldn’t Be All Bad&lt;&#x2F;a&gt;」&lt;&#x2F;p&gt;
&lt;p&gt;Bloombergに掲載されたOpenAI会長Bret Taylorのインタビュー記事です。&lt;&#x2F;p&gt;
&lt;p&gt;今の生成AIブームを2000年代のドットコム・バブルと重ねて、
バブルが崩壊したとしてもそこからGoogleやAmazonのような企業が
生まれ生き残り次の世代の主役になったことを考えると、健全だと語っています。&lt;&#x2F;p&gt;
&lt;p&gt;確かに今年のノーベル経済学賞を受賞した「アギヨン・ホーウィット理論」
でも「創造的破壊」が経済発展を齎すことを数学モデルで証明しています。
この理論からも、バブル崩壊が必ずしも悪いことではないと言えるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;翻って日本の現状を見ると、国や自治体が補助金や支援策で会社を潰さないよう延命させる政策が当然のように行われています。
しかし、この理論に従うと、これは「創造的破壊」を阻害し、経済の新陳代謝を妨げる決定的に間違った政策です。
非効率な企業を温存することで、本来そこに投入されるべきリソース（人材、資金、土地）が、
より生産性の高い新興企業や成長分野に回らない。この硬直化が日本経済の停滞の一因となっています。&lt;&#x2F;p&gt;
&lt;p&gt;また、Taylor氏が指摘する&lt;strong&gt;上司や取締役を喜ばせるための見かけ倒しの AI プロジェクトはやめるべきだ&lt;&#x2F;strong&gt;という警鐘も重要です。
先日、方針やビジョンを出さないにも関わらず、「課員に向けた生成AI研修をやってくれ」という
厚顔無恥さを発揮した理事長を目にしました。
これこそ、実質的な価値を生まない「見かけ倒しのAIプロジェクト」の典型例でしょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">OpenAI会長のインタビューから、生成AIブームとドットコム・バブルの比較、創造的破壊の重要性を考察。日本の補助金政策が経済の新陳代謝を妨げている問題と、実質的な価値を生まない見かけ倒しのAIプロジェクトへの警鐘について論じる。</summary>
        </entry><entry xml:lang="en">
        <title>労働問題の落とし前のつけ方: 総合労働相談コーナーと法的手段</title>
        <published>2025-10-28T00:00:00+00:00</published>
        <updated>2025-10-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/hacking-labor-consultation-corner/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/hacking-labor-consultation-corner/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;10&amp;#x2F;hacking-labor-consultation-corner&amp;#x2F;ciac.webp?h=51e942389f64d4200678&quot;
  alt=&quot;CIAC&quot; width=&quot;1023&quot; height=&quot;575&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;td;dr&quot;&gt;td;dr&lt;&#x2F;h2&gt;
&lt;p&gt;業務をアサインされないなどの労働問題に直面したとき、どう対処すれば良いでしょうか。私自身、5ヶ月近く業務をアサインされない状況に置かれています。ハラスメントならまだ救いがありましたが、業務を用意できないというバカ上司と弛みきった職場で解決する能力がなさそうなので、厚生労働省の「総合労働相談コーナー」の活用方法と弁護士による法的手段という外部からの解決手段について検討してみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._労働問題解決の全体像&quot;&gt;1. 労働問題解決の全体像&lt;&#x2F;h2&gt;
&lt;p&gt;労働問題を解決するための手段は、大きく分けて以下の2つの段階があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;総合労働相談コーナーを利用する方法(相談→助言・指導→あっせん)&lt;&#x2F;li&gt;
&lt;li&gt;弁護士による法的手段を取る方法(内容証明→示談交渉→労働審判→訴訟)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;重要なのは、これらの手段は段階的に進むだけでなく、状況に応じて並行して活用できるという点です。
自分の置かれた状況と目的に応じて、最適な戦略を選択することが重要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._総合労働相談コーナーとは&quot;&gt;2. 総合労働相談コーナーとは&lt;&#x2F;h2&gt;
&lt;p&gt;総合労働相談コーナーは、労働者や事業主からの相談に無料で対応してくれる窓口です。
全国の労働局や労働基準監督署に設置されており、千葉県であれば10ヶ所程度あります。&lt;&#x2F;p&gt;
&lt;p&gt;相談内容は秘密が守られるため、会社に知られることなく相談できる点が大きなメリットです。
相談があったこと自体も秘密として扱われます。&lt;&#x2F;p&gt;
&lt;p&gt;このコーナーでは、状況に応じて次のような段階的な支援を受けることができます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;第1段階(相談)&quot;&gt;第1段階(相談)&lt;&#x2F;h3&gt;
&lt;p&gt;まず第一段階として、専門の相談員が電話または面談で対応してくれます。
ここでは労働問題に関する情報提供や、どのような解決方法があるかについてのアドバイスを受けることができます。&lt;&#x2F;p&gt;
&lt;p&gt;自分の置かれている状況が労働問題としてどう扱われるのか、
法的にどのような問題があるのかを、まずはここで確認することが重要です。&lt;&#x2F;p&gt;
&lt;p&gt;例えば、業務をアサインしないという行為は、以下のような観点から問題となる可能性があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;労働契約に基づく使用者の義務違反が考えられる(労働者に適切な業務を与える義務)&lt;&#x2F;li&gt;
&lt;li&gt;安全配慮義務違反が考えられる(精神的健康への配慮を欠く)&lt;&#x2F;li&gt;
&lt;li&gt;不当な労働条件の変更にあたる可能性がある&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;第2段階(労働局長による助言・指導)&quot;&gt;第2段階(労働局長による助言・指導)&lt;&#x2F;h3&gt;
&lt;p&gt;相談の結果、問題があると判断された場合、労働局長による助言・指導を申し出ることができます。
この制度では、労働局長が会社に対して問題点を指摘し、改善を促してくれます。&lt;&#x2F;p&gt;
&lt;p&gt;重要な点として、これは法違反に対する行政指導ではありません。
会社に対して強制力はなく、あくまで自主的な解決の方向性を示すものです。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、公的機関から指導を受けたという事実は、会社にとって無視できない重みがあります。
特にコンプライアンスを重視する企業や、公的な評価を気にする組織にとっては、
この段階で改善に動く可能性が高いと考えられます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;第3段階(あっせん)&quot;&gt;第3段階(あっせん)&lt;&#x2F;h3&gt;
&lt;p&gt;助言・指導でも解決しない場合、または金銭的な補償を求める場合は、
紛争調整委員会によるあっせんを申請できます。&lt;&#x2F;p&gt;
&lt;p&gt;あっせんでは、学者や弁護士などの労働問題の専門家が中立的な立場で、
双方の言い分を聞き、解決案を提示してくれます。&lt;&#x2F;p&gt;
&lt;p&gt;会社側に求められる内容としては、以下のような例があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;退職金の上積みを求めることができる&lt;&#x2F;li&gt;
&lt;li&gt;精神的損害に対する賠償を求めることができる&lt;&#x2F;li&gt;
&lt;li&gt;不利益変更に対する代替措置を求めることができる&lt;&#x2F;li&gt;
&lt;li&gt;会社都合退職としての処理を求めることができる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ただし、これも強制力はありません。
会社側があっせんへの参加を拒否した場合は、手続きが打ち切られることになります。&lt;&#x2F;p&gt;
&lt;p&gt;とはいえ、公的な第三者機関を通じた交渉の場が設けられることで、
当事者間だけでは難しかった解決の糸口が見つかることも多いようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._弁護士による法的手段&quot;&gt;3. 弁護士による法的手段&lt;&#x2F;h2&gt;
&lt;p&gt;総合労働相談コーナーでの解決が難しい場合、または最初から強い姿勢で臨みたい場合は、
弁護士に依頼して法的手段を取ることになります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;法的手段の流れ&quot;&gt;法的手段の流れ&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;弁護士を通じて交渉する。内容証明郵便などを通じて会社に対し、問題点の指摘と改善要求を実施する&lt;&#x2F;li&gt;
&lt;li&gt;示談交渉する。双方の主張を調整し、和解による解決を目指す&lt;&#x2F;li&gt;
&lt;li&gt;労働審判に移行する。裁判所が行う簡易な手続きにより、通常3回以内の期日で結論が出る&lt;&#x2F;li&gt;
&lt;li&gt;訴訟に移行する。労働審判で解決しない場合、正式な訴訟手続きに移行する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;費用とインセンティブ&quot;&gt;費用とインセンティブ&lt;&#x2F;h3&gt;
&lt;p&gt;弁護士費用は、一般的に以下の構成になります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;着手金として案件の着手時に支払う(相場は10〜30万円程度)&lt;&#x2F;li&gt;
&lt;li&gt;成功報酬として獲得した金額の10〜20%程度を支払う&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;弁護士もインセンティブが必要なため、現実的には金銭的な解決(慰謝料、解決金など)が前提となるでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4._戦略的な活用方法&quot;&gt;4. 戦略的な活用方法&lt;&#x2F;h2&gt;
&lt;p&gt;総合労働相談コーナーと法的手段、どちらを選ぶべきでしょうか。
実は、この選択は経済状況と目的によって大きく変わってきます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;経済的余裕がない場合&quot;&gt;経済的余裕がない場合&lt;&#x2F;h3&gt;
&lt;p&gt;経済的に余裕がなく、職場に残る必要がある場合は、穏便な解決を目指すことになります。&lt;&#x2F;p&gt;
&lt;p&gt;「何もせず現状を放置する」という手もあります。アサインメントがないという状況を苦にしなければですが。&lt;&#x2F;p&gt;
&lt;p&gt;一般的には穏便な解決を目指し、推奨される戦略は以下の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;まず総合労働相談コーナーで相談し、状況の客観的な評価を受ける&lt;&#x2F;li&gt;
&lt;li&gt;助言・指導を申し出て、会社に改善を促す&lt;&#x2F;li&gt;
&lt;li&gt;改善されない場合はあっせんを活用する&lt;&#x2F;li&gt;
&lt;li&gt;それでも解決しない場合に、初めて法的手段を検討する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この場合、会社との関係を完全に壊さずに改善を求めることが目的となります。&lt;&#x2F;p&gt;
&lt;p&gt;留意点は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;段階的に進めることで、会社側に改善の機会を与えることができる&lt;&#x2F;li&gt;
&lt;li&gt;相談や助言・指導の段階では秘密が守られるため、関係悪化のリスクは低くなる&lt;&#x2F;li&gt;
&lt;li&gt;ただし、完全な解決が得られない可能性もある&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;経済的余裕がある場合&quot;&gt;経済的余裕がある場合&lt;&#x2F;h3&gt;
&lt;p&gt;経済的に余裕があり、退職も選択肢として考えられる場合は、最初からフルオプションを使えます。&lt;&#x2F;p&gt;
&lt;p&gt;この場合優先すべきは、このハラスメントまがいの行為の代償をきちんと組織に払ってもらうことです。
従って経済性は優先度が下がり何を以て代償と考えるかは個人により違うので、
目指すゴールも個人により違ってきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;労働問題に直面したとき、まずは総合労働相談コーナーという無料の公的窓口があることを知ってください。
段階的な支援(相談→助言・指導→あっせん)が用意されており、多くの問題はここで解決できます。&lt;&#x2F;p&gt;
&lt;p&gt;それでも解決しない場合や、より強い姿勢で臨みたい場合は、弁護士による法的手段を検討することになります。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、自分の経済状況と目的に応じて、最適な戦略を選択することです。&lt;&#x2F;p&gt;
&lt;p&gt;さぁ落とし前をつけましょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">業務をアサインされないなどの労働問題に直面したとき、どう対処すれば良いでしょうか。私自身、5ヶ月近く業務をアサインされない状況に置かれています。ハラスメントならまだ救いがありましたが、業務を用意できないというバカ上司と弛みきった職場で解決する能力がなさそうなので、厚生労働省の「総合労働相談コーナー」の活用方法と弁護士による法的手段という外部からの解決手段について検討してみました。</summary>
        </entry><entry xml:lang="en">
        <title>養老渓谷温泉郷 Shinra Yoro Valley</title>
        <published>2025-10-26T00:00:00+00:00</published>
        <updated>2025-10-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/shinra-yoro-village/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/shinra-yoro-village/</id>
        
            <content type="html">&lt;p&gt;昨年オープンしたShinra Yoro Valleyで温泉を堪能してきました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;HzTwnByRpRU&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">昨年オープンしたShinra Yoro Valleyで温泉を堪能してきました。</summary>
        </entry><entry xml:lang="en">
        <title>スプラトゥーン：秋フェス Splatoween</title>
        <published>2025-10-25T00:00:00+00:00</published>
        <updated>2025-10-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/splatoween/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/splatoween/</id>
        
            <content type="html">&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;EO5AW_CMf7M&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">久しぶりのフェスです。</summary>
        </entry><entry xml:lang="en">
        <title>小野田経済安保相のスピード感</title>
        <published>2025-10-22T00:00:00+00:00</published>
        <updated>2025-10-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/onoda-minister-of-economic-security/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/onoda-minister-of-economic-security/</id>
        
            <content type="html">&lt;p&gt;かつて、これほど打てば響くような記者会見を行なう大臣がいただろうか？&lt;&#x2F;p&gt;
&lt;p&gt;これまでの政権との対比もさることながら、身近なリーダーもこうあって欲しいものだと心底思います。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;mmyhS8Du1Mg&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">小野田経済安保相の驚愕のスピードで記者会見をこなす姿を見ると、普通の社会で仕事できるとはこういうことなのだなと改めて思います。最近、本当に仕事しない人たちを見ているので。</summary>
        </entry><entry xml:lang="en">
        <title>ざまぁ！ 公明党</title>
        <published>2025-10-20T00:00:00+00:00</published>
        <updated>2025-10-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/zama-komei/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/zama-komei/</id>
        
            <content type="html">&lt;p&gt;自民党と日本維新の会との「連立」が合意されたようです。&lt;&#x2F;p&gt;
&lt;p&gt;いろいろと問題はあるけれども、世の中が変わるんだという期待感は感じさせてくれますね。&lt;&#x2F;p&gt;
&lt;p&gt;公明党との連立解消以降、「連立を切られた公明党」というテレビや新聞の偏向報道にはうんざりしていたので、
気持ちよく「&lt;strong&gt;ざまぁ 公明党&lt;&#x2F;strong&gt;」と書いておこう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">自民党と日本維新の会との連立合意について。公明党との連立解消という政治の変化に対する率直な感想。</summary>
        </entry><entry xml:lang="en">
        <title>楽天モバイルからPovo2.0に移行</title>
        <published>2025-10-13T00:00:00+00:00</published>
        <updated>2025-10-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/povo20/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/povo20/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;10&amp;#x2F;povo20&amp;#x2F;povo.webp?h=241563817f7a483bd41e&quot;
  alt=&quot;POVO2.0&quot; width=&quot;1050&quot; height=&quot;312&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contens&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;楽天モバイルの問題&quot;&gt;楽天モバイルの問題&lt;&#x2F;h2&gt;
&lt;p&gt;下図は楽天モバイルの最強プランです。1プランで分かりやすく、通信量に応じて料金は上がっていきますが20GB以上は料金が2,980円で固定だと言う点が特徴です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;10&amp;#x2F;povo20&amp;#x2F;rakuten-plan.webp?h=9d8490c5557ed8d63e3d&quot;
  alt=&quot;楽天モバイルプラン&quot; width=&quot;1104&quot; height=&quot;319&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;設定が絶妙で、実質的に3GB以下で収まる人はほとんど居ないでしょう。
つまり、大半のユーザーは1,980円（3-20GB）または2,980円（20GB以上）のどちらかの料金帯に収まる形です。&lt;&#x2F;p&gt;
&lt;p&gt;私の場合、月平均8〜10GBなので、1,980円となっています。
これでも安いほうですが、飛び抜けて安いわけでもありません。&lt;&#x2F;p&gt;
&lt;p&gt;楽天モバイルはRakuten Linkアプリで通話すると通話料が無料という利点もあります。
しかし、実際にはデータ通信を使った通話なので通信状況に左右されてよく途中で通話不能となるので、
ちょっとした電話でも中断するのが煩わしく通常の電話を使ってしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;問題は&lt;strong&gt;通信品質&lt;&#x2F;strong&gt;です。
通信速度を測定すると非常に状況が良い時でも60Mbps程度で、中程度の速度です。
致命的なのは人が多いターミナル駅やイベント会場などでは、極端に通信速度が落ちたり通信不能に陥るケースがよくあることです。
この品質では、以前使っていたMineoマイそくスタンダードプラン(1.5Mbps)の方が速度は遅くとも確実に通信できて安定していました。&lt;&#x2F;p&gt;
&lt;p&gt;最近何度か外出時に通信が出来なくなり、うんざりしました。
この通信品質ではいくら料金がリーズナブルでも納得感がありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Ahamo&quot;&gt;Ahamo&lt;&#x2F;h2&gt;
&lt;p&gt;当初は楽天モバイルと同様に1プランで分かりやすく、5分通話無料が標準で付いているAhamoに移行しようかと手続きを始めました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、手続きの中で&lt;code&gt;dアカウント&lt;&#x2F;code&gt;が必要と言われます。私はDocomoのHome 5Gを使っているので、&lt;code&gt;dアカウント&lt;&#x2F;code&gt;を持っているので登録しようとするとエラーになります。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;dアカウント&lt;&#x2F;code&gt;は1回線にしか紐付けることができず、Ahamoに移行するには新たに&lt;code&gt;dアカウント&lt;&#x2F;code&gt;を作る必要があるようです。
しかし、&lt;code&gt;dアカウント&lt;&#x2F;code&gt;はメールアドレスと紐付いているので、これでは別途メールアドレスを用意しなければなりません。&lt;&#x2F;p&gt;
&lt;p&gt;手続きの煩雑さから、Ahamoへの移行は止めました。
こんな手続きを平然と継続する企業など、ろくなもんではありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Povo2.0&quot;&gt;Povo2.0&lt;&#x2F;h2&gt;
&lt;p&gt;次にKDDIがサービスしているPovo2.0です。&lt;&#x2F;p&gt;
&lt;p&gt;特徴としては基本料金のようなものがなく、「トッピング」という形で有効期限付きのデータ量を都度購入すると言う点が独特です。
料金体系は独特ですが試算したところ楽天モバイルと同等、通話料金も含めるとAhamoと同等となりそうです。&lt;&#x2F;p&gt;
&lt;p&gt;例えば、私の場合月平均10GBの通信量なので、1年間120GBのトッピング(21,600円)を購入すると、一月当たり1,800円となります。&lt;&#x2F;p&gt;
&lt;p&gt;通信品質にも問題なく、かなり高速です。
場所によっては1Gbpsを超えてきますし、
東京駅でも200〜700Mbps程度の速度は出ます。楽天モバイルとは雲泥の差です。&lt;&#x2F;p&gt;
&lt;p&gt;トッピングを購入する手間はありますが、1年間有効なトッピングもあるので上手く組み合わせると
自分に必要な分だけ最適な購入の仕方も工夫できます。&lt;&#x2F;p&gt;
&lt;p&gt;有効期限が過ぎて180日間購入がないと利用停止されてしまうので注意が必要です。
ただし、サブ回線で無い限り180日間も通信できない状況を放置するとは思えないので、あまり気にしなくても良さそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;楽天モバイルが始まった当初は革新的なプラン体系でしたが、
やはりこういった基地局整備への莫大な投資が継続して必要な資本集約型産業・インフラ産業への理解と経験が楽天モバイルには足りないのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;PovoはKDDI・AUが何年もかけた設備投資の蓄積とそのノウハウが十分あり、本気で価格勝負となったら新規参入企業では分がないということでしょう。
手間を惜しむユーザーにはトッピングという形態は面倒でしょうが、
必要な分だけ手当てできる柔軟なプランは私にはあっているようです。&lt;&#x2F;p&gt;
&lt;p&gt;もし、Povoに移行される方は、以下のプロモーションコードをご利用下さい。&lt;&#x2F;p&gt;
&lt;p&gt;プロモーションコード： &lt;code&gt;MGOZXOZN&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;データボーナス100GB(3日間)が特典として付与されます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">楽天モバイルの通信品質に不満を感じ、Povo2.0に移行しました。混雑時に通信不能になる楽天モバイルと比べ、Povoは高速で安定した通信品質を提供しています。トッピング制による柔軟な料金体系も魅力的です。</summary>
        </entry><entry xml:lang="en">
        <title>ロジクール MX ERGO Sレビュー</title>
        <published>2025-10-09T00:00:00+00:00</published>
        <updated>2025-10-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/mx-ergo-s/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/mx-ergo-s/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;10&amp;#x2F;mx-ergo-s&amp;#x2F;ergo-s.webp?h=6fc6a7ad8204bbfc4a4c&quot;
  alt=&quot;MX ERGO S&quot; width=&quot;916&quot; height=&quot;1007&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;20年程昔Kensigntonの機械式のExpertMouseを愛用してあの大玉を回す感覚が忘れられず、
定期的にトラックボールを購入してしまいます。今回もAmazonのセールだったので購入してみました。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;expertmouse.jpg&quot; alt=&quot;Kensignton ExpertMouse&quot; &#x2F;&gt;
  &lt;figcaption&gt;忘れられないKensignton ExpertMouse&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;MX_ERGO_Sとは&quot;&gt;MX ERGO Sとは&lt;&#x2F;h2&gt;
&lt;p&gt;ロジクールMX ERGO Sは昨年9月発売されたロジクールのトラックボールの最上位機種です。
2017年に発売されたMX ERGOの後継機種ですが、目に付く更新内容は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;充電がUSB-Cに変更&lt;&#x2F;li&gt;
&lt;li&gt;専用レシーバーがUnifyingからLogiBoltに変更&lt;&#x2F;li&gt;
&lt;li&gt;静音クリック仕様に変更&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;7年越しの後継機種ですが、機能的にはほとんどアップデートされていないのが分かります。&lt;&#x2F;p&gt;
&lt;p&gt;最上位機種なので、マグネットの金属プレート台を利用して20度チルトできたり、やたらとボタンが付いていたりします。
ボタンは専用アプリを使用するとカスタマイズできますが、単に別の機能を割り振るだけでなく「ジェスチャー」機能を割り当てるとクリックだけでなく
トラックボールの上下左右の動きと合わせて機能設定できるため30近い機能を割り付けることが可能です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MX_ERGO_Sの評価&quot;&gt;MX ERGO Sの評価&lt;&#x2F;h2&gt;
&lt;p&gt;手首の痛み軽減を目的でトラックボールに移行される方が多いと思いますが、
私はマウスの利用で手首の痛みを感じたことがなのであまりピンと来ていません。&lt;&#x2F;p&gt;
&lt;p&gt;親指でボールを操作するトラックボールは、豪快に手のひらでボールを転がすExpertMouseとはやはり別物です。
どうしても「これじゃない」と感じてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;多ボタンもRectagleのショートカットを割り付けてみたりしましたが、
私はどちらかというとキーボード主体の操作なので、ショートカットをトラックボールに割り付けるならば
ショートカットを押下したほうが効率的です。&lt;&#x2F;p&gt;
&lt;p&gt;MX ERGO S本体はプラスチックにすべり止めの加工が施してあるようですが、これがベタベタした感触で
今にも加水分解しそうで苦手です。&lt;&#x2F;p&gt;
&lt;p&gt;結局、愛用している&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4mRI8oB&quot;&gt;Xtrfyの軽量ゲーミングマウス&lt;&#x2F;a&gt;で十分だと改めて感じてしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;MX ERGO Sはヤフオクかメルカリでドナドナすることになりそうです。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00tpxd5.9srin49d.g00tpxd5.9srio186&#x2F;kaereba_main_202601301031135362?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Flogicool%2Fmxtb2%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Flogicool%2Fi%2F10000683%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;logicool&#x2F;cabinet&#x2F;prd&#x2F;mice&#x2F;mxtb2&#x2F;mxtb2_r_.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00tpxd5.9srin49d.g00tpxd5.9srio186&#x2F;kaereba_main_202601301031135362?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Flogicool%2Fmxtb2%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Flogicool%2Fi%2F10000683%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;【特価】ロジクール ワイヤレスマウス トラックボール MX ERGO S 無線 静音 Bluetooth &amp; Logi Bolt 8ボタン USB-C 急速充電 windows mac iPad OS 対応 MXTB2 国内正規品 2年間無償保証&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202601301031135362?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FMX%2520ERGO%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=MX%20ERGO&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">Amazonのプライム感謝先行セールで少し安くなっていたので、ロジクールのMX ERGO Sを購入しました。</summary>
        </entry><entry xml:lang="en">
        <title>管理職にしてはいけない人が必ず口にする言葉</title>
        <published>2025-10-07T00:00:00+00:00</published>
        <updated>2025-10-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/worst-boss/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/worst-boss/</id>
        
            <content type="html">&lt;p&gt;Diamond Onlineで素敵な記事を見つけました。
この手のビジネス書はあまり読まないし信用していないのだけれど、
今回は &lt;strong&gt;実例が身近にある&lt;&#x2F;strong&gt; だけに異様に心に刺さったので引用しておきます。&lt;&#x2F;p&gt;
&lt;p&gt;記事ではこういった管理職を思考放棄、責任転嫁、丸投げと手厳しく非難しています。
基本的には同意しますが、
心優しい私はそういった管理職もそこまで能動的・意図的に行なっているものでないと一縷の希望を捨てきれません。
そういった悪意でなく、単に能力の問題であろうことを配慮します。一言だけするならば、次の言葉でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;無能&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;diamond.jp&#x2F;articles&#x2F;-&#x2F;373237&quot;&gt;
&lt;strong&gt;#ワースト1は「とりあえず、検討させて」&lt;&#x2F;strong&gt;
&lt;p&gt;管理職にしてはいけない人が、必ずと言っていいほど口にする言葉。
それが「 &lt;strong&gt;とりあえず、検討させて&lt;&#x2F;strong&gt; 」です。&lt;&#x2F;p&gt;
&lt;p&gt;一見、前向きな言葉に見えるかもしれません。
しかし実態は、「思考放棄」「責任転嫁」「丸投げ」の3拍子が揃った危険なワードです。
この言葉を多用する人は、全体像や目的を伝えることなく、部下に無計画な実行だけを押し付けてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;#「指示」ではなく「投げっぱなし」&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;本来、管理職の役割は「方向性を示し、仕組みを作り、成果を出すための環境を整える」ことです。
ところが「 &lt;strong&gt;とりあえず、検討させて&lt;&#x2F;strong&gt; 」という言葉には、そのどれもが欠けています。&lt;&#x2F;p&gt;
&lt;p&gt;具体的な目標も基準もないまま待たされっぱなしになった部下は、不安や混乱に包まれ、パフォーマンスが落ちていきます。
責任の所在も曖昧のままで、チーム全体の信頼感が失われていくのです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;#「思考停止マネジメント」が蔓延する&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;「とりあえず」という言葉には、深く考えることを放棄した姿勢が滲みます。
部下からの「まずはやってみたい」という思いを潰し、本質的な議論や設計がなされなくなります。&lt;&#x2F;p&gt;
&lt;p&gt;こうした思考停止マネジメントが繰り返されると、組織全体の質が下がり、仕組み化も改善も進みません。&lt;&#x2F;p&gt;
  &lt;footer&gt;
    &lt;cite&gt;Diamon Online『&lt;a href=&quot;https:&#x2F;&#x2F;diamond.jp&#x2F;articles&#x2F;-&#x2F;373237&quot;&gt;管理職にしてはいけない人が必ず口にする言葉・ワースト1&lt;&#x2F;a&gt;』&lt;&#x2F;cite&gt;
    &lt;&#x2F;footer&gt;
  &lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">管理職として不適格な人が必ず口にする言葉、「とりあえず、検討させて」という記事を読みました。いやぁ、実例を間近で見て「ほんとにそうなんだな」と感心しました。</summary>
        </entry><entry xml:lang="en">
        <title>高市早苗総裁爆誕</title>
        <published>2025-10-05T00:00:00+00:00</published>
        <updated>2025-10-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/sanae-takaichi/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/sanae-takaichi/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;p&gt;Sanae Takaichi, my fellow Kobe University alumna, has been elected as the new president of the Liberal Democratic Party (LDP). This marks the birth of the first female president in the party&#x27;s 70-year history.&lt;&#x2F;p&gt;
&lt;p&gt;自民党総裁選で我がOGである神戸大学出身の高市早苗氏が自民党総裁となりました。
自民党立党70年にして初の女性総裁の誕生です。&lt;&#x2F;p&gt;
&lt;p&gt;A few days ago, I was watching a debate between the
candidates and junior high school students. I was relieved
to see the contrast with Shinjiro Koizumi. Despite graduating
from Columbia University, he &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtube.com&#x2F;clip&#x2F;UgkxrOnCGMaqe_Z5CCm5cPH1j6vk9DMv9lU-?si=QQOleDl9zbG-BPSY&quot;&gt;could only respond in Japanese&lt;&#x2F;a&gt;
to questions from English-native students, demonstrating his
incompetence. Takayuki Kobayashi also responded in Japanese
despite likely having no issues with English, revealing
questionable character.&lt;&#x2F;p&gt;
&lt;p&gt;数日前に候補者と中学生の討論会を観ていました。
コロンビア大院卒業なのに英語ネイティブの中学生の質問に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtube.com&#x2F;clip&#x2F;UgkxrOnCGMaqe_Z5CCm5cPH1j6vk9DMv9lU-?si=QQOleDl9zbG-BPSY&quot;&gt;日本語でしか回答できない&lt;&#x2F;a&gt;小泉進次郎氏の無能さに驚きました。
また、おそらく英語に問題ないのに日本語で回答する小林鷹之氏の人間性にも疑問を感じ、少し安堵しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;A_Clear_National_Strategy&quot;&gt;A Clear National Strategy&lt;&#x2F;h2&gt;
&lt;p&gt;Takaichi advocates for &quot;Sanaenomics,&quot; which emphasizes
state-led investment in strategic fields such as AI and
quantum technology. This also includes space and
next-generation energy. Particularly regarding energy
security, she aims to increase Japan&#x27;s current energy
self-sufficiency rate of around 15% toward 100%. She
advocates for investment in next-generation technologies
such as nuclear fusion power generation.&lt;&#x2F;p&gt;
&lt;p&gt;高市氏は「サナエノミクス」として、AI、量子技術、宇宙、次世代エネルギーといった戦略分野への国家主導の投資を掲げています。
特にエネルギー安全保障では、現在15%程度のエネルギー自給率を100%に近づけることを目標としています。
また、核融合発電などの次世代技術への投資を主張しています。&lt;&#x2F;p&gt;
&lt;p&gt;In contrast, looking at the policies of other candidates,
Shinjiro Koizumi merely proposes abstract numerical targets.
These include &quot;1 million yen wage increase in 5 years&quot; and
expansion of investment tax cuts. Takayuki Kobayashi also
advocates for flat-rate tax cuts and investment in AI,
quantum, and space. However, his specific industrial strategy
and path to technological independence remain unclear.&lt;&#x2F;p&gt;
&lt;p&gt;一方、他の候補者の政策を見ると、小泉進次郎氏は「5年で賃金100万円増」といった抽象的な数値目標や投資減税の拡大を掲げるに留まります。
小林鷹之氏も定率減税とAI・量子・宇宙への投資を唱えるものの、具体的な産業戦略や技術的自立への道筋は不明確でした。&lt;&#x2F;p&gt;
&lt;p&gt;I feel that Takaichi&#x27;s philosophy of &quot;strengthening national
power&quot; is consistently embodied across various policy areas.
She presents this on her &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sanae.gr.jp&#x2F;idea.html&quot;&gt;website&lt;&#x2F;a&gt;.
This includes economic policy, energy security, and
technological independence.&lt;&#x2F;p&gt;
&lt;p&gt;高市氏が自身の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sanae.gr.jp&#x2F;idea.html&quot;&gt;サイト&lt;&#x2F;a&gt;で掲げる「国力強化」という哲学は、各政策分野で一貫して具体化されています。
これは、経済政策、エネルギー安全保障、技術的自立といった分野で明確に示されていると感じます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Overwhelming_Support_from_Party_Members&quot;&gt;Overwhelming Support from Party Members&lt;&#x2F;h2&gt;
&lt;p&gt;In this leadership election, Takaichi secured 119 party member votes in the first round, ranking first among all candidates (Koizumi 84 votes, Hayashi 62 votes). In the runoff election, she also overwhelmed Koizumi with 36 local votes versus 11.&lt;&#x2F;p&gt;
&lt;p&gt;今回の総裁選では、第1回投票で高市氏が党員票119票を獲得し全候補中トップとなりました
（小泉氏84票、林氏62票）。決選投票でも地方票で36票対11票と小泉氏を圧倒しています。&lt;&#x2F;p&gt;
&lt;p&gt;The fact that she garnered strong support not only from
Diet members but also from party members is significant.
This suggests that expectations for Takaichi are high
not just from intra-party power games but also from
the public will.&lt;&#x2F;p&gt;
&lt;p&gt;議員票だけでなく党員票でも高い支持を集めました。
これは、党内のパワーゲームだけでなく民意としても高市氏への期待が大きいことを示しているのではないかと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Media_Bias&quot;&gt;Media Bias&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;10&amp;#x2F;sanae-takaichi&amp;#x2F;tv-asahi.webp?h=3324a63d41fba93da511&quot;
  alt=&quot;テレビ朝日ニュースステーションの偏向報道&quot; width=&quot;1428&quot; height=&quot;807&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Nevertheless, the biased reporting from TV Asahi and other outlets was appalling. The above shows their prediction aired the day before the vote, which significantly diverged from the actual results. For some reason, the old media uniformly pushed for Shinjiro Koizumi.&lt;&#x2F;p&gt;
&lt;p&gt;それにしてもテレビ朝日などの偏向報道は酷いものでした。上記は投票前日の放映での予想ですが、
実際の結果とは大きく乖離しています。なぜかオールドメディアはそろって小泉進次郎氏押しでした。&lt;&#x2F;p&gt;
&lt;p&gt;The actual first-round voting results were reversed, with Takaichi at 183 votes and Koizumi at 164 votes. Particularly in party member votes, there was a significant gap with Takaichi at 119 votes and Koizumi at 84 votes. Even though they are private broadcasters, they are expected to serve the public interest, so shouldn&#x27;t they examine what influences their reporting?&lt;&#x2F;p&gt;
&lt;p&gt;実際の第1回投票結果は高市氏183票、小泉氏164票と逆転しており、
特に党員票では高市氏119票、小泉氏84票と大差がついています。
いくら民放でも公益性を求められる放送局なのだから、自身の報道が何に影響されているか
検証すべきではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, during a live broadcast on BS Nippon TV on September 9th, the MC made the following statement during a commercial break while the candidates were on air:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Nippon TV conducted an independent telephone survey targeting 1,019 respondents who identified themselves as LDP members or party friends among voters nationwide.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This is a strange story. Did they keep calling until they
found people who identified as LDP members?&lt;&#x2F;p&gt;
&lt;p&gt;During the commercial break of the BS Nippon TV live
broadcast on September 9th, materials were distributed
to the candidates. They explained, &quot;There was a survey by
Nippon TV asking party members and party friends who they
would vote for in the LDP presidential election.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;At this point, Sanae Takaichi challenged them, asking,
&quot;Did you keep calling until you found party members?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;また、9月9日のBS日テレでは、候補者たちが生放送に出演するCM中、MCがつぎように発言していました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;日本テレビが全国の有権者の内、自民党員、党友と答えた1,019人を対象に独自の電話調査を行なったところ」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;おかしな話です。自民党員と答える人に巡り合うまで電話を掛けまくったのでしょうか。
9月9日のBS日テレでは、候補者たちが生放送に出演するCM中、資料が配られました。
その際、「日本テレビの党員、党友調査で自民党総裁選誰に投票するかという調査がありまして」と説明していました。
この時、高市早苗氏から「党員に行き当たるまで電話かけ続けはったんですか」と突っ込まれています。&lt;&#x2F;p&gt;
&lt;p&gt;In fact, there have long been rumors that the LDP has been selling party member lists to candidates for several million yen. This incident has further deepened my conviction on the following two points:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Isn&#x27;t it true that they are selling party member lists to candidates?&lt;&#x2F;li&gt;
&lt;li&gt;And didn&#x27;t Nippon TV purchase the party member list?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This is an illegal leak of personal information. At the very least, it is statistically impossible for Nippon TV to have randomly called and found 1,019 party members, so it is highly likely that they obtained the list illegally. It makes me question whether this is really a news organization.&lt;&#x2F;p&gt;
&lt;p&gt;実は以前から自民党が候補者に党員名簿を数百万で販売しているという噂が有りました。今回の件で更に次の2点の確信が深まりました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;候補者に党員名簿を売っているのほ本当ではないか&lt;&#x2F;li&gt;
&lt;li&gt;そして、日テレは党員名簿を買ったのではないか&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;個人情報の不正な流出です。少なくとも日テレは、ランダムに電話して党員を1,019人見つけたなど統計的にみても不可能ですから、
不正入手をした可能性が高いと言えます。これが報道機関なのかと疑いたくなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Sanae Takaichi has become the party president, overcoming the biased reporting of old media that uniformly pushed for Shinjiro Koizumi. This result demonstrates that concrete national strategies triumph over media manipulation and abstract slogans.&lt;&#x2F;p&gt;
&lt;p&gt;高市早苗氏は、小泉進次郎氏を一様に押していたオールドメディアの偏向報道に打ち勝って党総裁となりました。この結果は、メディアの誘導や抽象的なスローガンではなく、具体的な国家戦略こそが勝利することを示しています。&lt;&#x2F;p&gt;
&lt;p&gt;I have high expectations based on her consistent philosophy
of &quot;strengthening national power.&quot; She will steadily
implement strategic investments in AI and quantum technology.
This also includes space and next-generation energy, as well
as achieving energy self-sufficiency. As a fellow Kobe
University alumna, I sincerely hope she will lead Japan
toward a better future.&lt;&#x2F;p&gt;
&lt;p&gt;彼女の一貫した「国力強化」の哲学に基づき、AI、量子技術、宇宙、次世代エネルギーといった戦略分野への投資を着実に進めてくれることを期待しています。
また、エネルギー自給の実現も重要です。
同じ神戸大学OGとして、日本をより良い未来へと導いてくれることを心から願っています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">自民党立党70年にして初の女性総裁となった高市早苗氏。戦略的国家投資やエネルギー自給率100%を掲げる明確な国家戦略は、抽象的な数値目標に留まる他候補と一味違っているので、当然かなと思いました。実際には党員票で圧倒的支持を集めた民意の反映とも言える結果でしたが、前日までの「小泉進次郎優勢」と報道したオールドメディアの予想の偏向報道が浮き彫りになりました。</summary>
        </entry><entry xml:lang="en">
        <title>Claude Sonnet 4.5リリース</title>
        <published>2025-10-03T00:00:00+00:00</published>
        <updated>2025-10-03T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/claude-4-5/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/claude-4-5/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;tl;dr&quot;&gt;tl;dr&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Claude Sonnet 4.5&lt;&#x2F;strong&gt; の詳細は
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;claude-sonnet-4-5&quot;&gt;Anthropic のアナウンス&lt;&#x2F;a&gt; を読んでもらうとして、
まとめると次のような点が変更となっています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;コーディング、ソフトウェアエンジニアリング性能がどえらい高い。Opus 4.1と比較しても負けない&lt;&#x2F;li&gt;
&lt;li&gt;人間の感覚に近づいた(ミスアラインメント軽減)&lt;&#x2F;li&gt;
&lt;li&gt;Claude Codeがv 2.0.0にアプデされ、チェックポイント機能が付いた&lt;&#x2F;li&gt;
&lt;li&gt;Claude Code SDKがClaude Agent SDKに&lt;&#x2F;li&gt;
&lt;li&gt;Claude for ChromeがMaxユーザー（ウェイトリスト登録者）に提供開始&lt;&#x2F;li&gt;
&lt;li&gt;Claude APIのコンテキスト管理に機能追加&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Claude_Code_v_2&quot;&gt;Claude Code v 2&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeがV 2となりました。&lt;&#x2F;p&gt;
&lt;p&gt;インストールは以下のコマンドで行ないます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -g @anthropic-ai&#x2F;claude-code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;主な変更点は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;チェックポイント機能が追加された。変更前のタイミングでコードを自動保存し、&lt;code&gt;&#x2F;rewind&lt;&#x2F;code&gt; コマンド(ESCキーを2回押下でも可)で
前のバージョン戻すことが可能となった。復元は、コード、会話、またはその両方を選ぶことができる。&lt;&#x2F;li&gt;
&lt;li&gt;思考モードをタブキーで切り替えることが出来るようになった。&lt;&#x2F;li&gt;
&lt;li&gt;Ctrl-Rキーで履歴の検索が可能となった。&lt;&#x2F;li&gt;
&lt;li&gt;利用状況を確認する &lt;code&gt;&#x2F;usage&lt;&#x2F;code&gt;コマンドが追加となった。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Claude_API_のコンテキスト管理機能&quot;&gt;Claude API のコンテキスト管理機能&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Developer Platformに、より長く複雑なエージェントタスクを実行するための新機能が追加されました。&lt;&#x2F;p&gt;
&lt;p&gt;主な機能は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテキスト編集機能&lt;&#x2F;strong&gt;: トークン制限に近づいた際、古いツール呼び出しと結果をコンテキストウィンドウから自動的にクリアする。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;メモリツール&lt;&#x2F;strong&gt;: ファイルベースのシステムを通じて、コンテキストウィンドウの外に情報を保存し参照できる。専用のメモリディレクトリでファイルの作成、読み取り、更新、削除が可能である。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの機能により、以下のようなことが実現できるようになります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;長期的なコーディングプロジェクトで、デバッグ中に発見した洞察を保存し、翌日のセッションでも活用できる&lt;&#x2F;li&gt;
&lt;li&gt;調査・研究タスクで、複数のドキュメントから重要な情報を蓄積し、ナレッジベースを構築できる&lt;&#x2F;li&gt;
&lt;li&gt;大規模なデータ処理ワークフローで、コンテキストが満杯になっても処理を継続できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの機能を組み合わせることで、ベースラインと比較して39%のパフォーマンス向上が確認されています。&lt;&#x2F;p&gt;
&lt;p&gt;なお、これらはAPIを利用してエージェントやアプリケーションを構築する開発者向けの機能です。Amazon BedrockおよびGoogle CloudのVertex AIでも利用可能です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">9月30日にClaude Sonnet 4.5がリリースされました。</summary>
        </entry><entry xml:lang="en">
        <title>どこかの職場みたいで草</title>
        <published>2025-10-01T00:00:00+00:00</published>
        <updated>2025-10-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/10/workplace/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/10/workplace/</id>
        
            <content type="html">&lt;p&gt;スプラトゥーンやっていたら、どこかの職場みたいな状況で草。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;qwQvlF5C6ow&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">スプラトゥーンやっていたら、どこかの職場みたいな状況で草。</summary>
        </entry><entry xml:lang="en">
        <title>Viewing a Meiji Era Lighthouse from Above - Inubosaki Lighthouse</title>
        <published>2025-09-30T00:00:00+00:00</published>
        <updated>2025-09-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/inubousaki/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/inubousaki/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;inubousaki&amp;#x2F;inbousaki.webp?h=0aa2736b33c142b88a46&quot;
  alt=&quot;Inubosaki Lighthouse&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contentes&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Today, I captured drone footage of Inubosaki Lighthouse, located at the easternmost point of the Kanto region.&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;dv22mPGs-j8&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;About_Inubosaki_Lighthouse&quot;&gt;About Inubosaki Lighthouse&lt;&#x2F;h2&gt;
&lt;p&gt;Inubosaki Lighthouse is a historic lighthouse that began operation in 1874 (Meiji 7). For over 150 years, it has watched over ships traveling across the Pacific Ocean. Its beautiful white structure has become one of Choshi&#x27;s iconic landmarks.&lt;&#x2F;p&gt;
&lt;p&gt;This location is also known as the place where the sun rises earliest in Japan, attracting many visitors on New Year&#x27;s Day to watch the first sunrise of the year.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Early_Morning_Shoot&quot;&gt;Early Morning Shoot&lt;&#x2F;h2&gt;
&lt;p&gt;The filming took place in the early morning. I was able to capture the sea and lighthouse from above in mystical light. Unfortunately, it was cloudy, but the footage still conveys the vastness of the Pacific Ocean and the impressive presence of the lighthouse.&lt;&#x2F;p&gt;
&lt;p&gt;The view of the lighthouse from a drone offers a different charm compared to ground-level perspectives. From above, you can clearly see the surrounding rocky shore, the expansive sea, and the overall landscape centered around the lighthouse.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Toei_Opening_Rock&quot;&gt;The Toei Opening Rock&lt;&#x2F;h2&gt;
&lt;p&gt;Interestingly, on the south side of Inubosaki Lighthouse lies the &quot;wave-beaten rock&quot; used in Toei&#x27;s opening footage. This is the iconic rocky formation familiar from the beginning of many TOKEI&#x27;s movies.&lt;&#x2F;p&gt;
&lt;p&gt;Since I flew the drone from the north side of the lighthouse this time, I couldn&#x27;t pinpoint the exact location due to signal limitations. However, somewhere among the rocks visible in the footage should be that famous rock. If I get another chance to shoot, I&#x27;d like to approach from the south side to capture it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Viewing historic structures from the air makes you appreciate their grandeur anew. Inubosaki Lighthouse will continue to illuminate the Pacific Ocean for years to come.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Drone footage of Inubosaki Lighthouse, located at the easternmost point of the Kanto region. Capturing the white lighthouse that has watched over the Pacific Ocean since 1874 in the mystical light of early morning.</summary>
        </entry><entry xml:lang="en">
        <title>Blue Bayou</title>
        <published>2025-09-28T00:00:00+00:00</published>
        <updated>2025-09-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/blue-bayou/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/blue-bayou/</id>
        
            <content type="html">&lt;p&gt;I watched the Denzel Washington movie &quot;Man on Fire&quot; on Netflix, a slightly older film (known as &quot;My Bodyguard&quot; in Japan).&lt;&#x2F;p&gt;
&lt;p&gt;The song that the protagonist holds dear as his emotional anchor was Linda Ronstadt&#x27;s &quot;Blue Bayou&quot;.
Feeling nostalgic, I decided to perform it.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2177449263&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;blue-bayou&quot; title=&quot;Blue Bayou&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Blue Bayou&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;1977 was the year I entered junior high school and started listening to Western music.
That year, songs like &quot;How Deep Is Your Love&quot; (Bee Gees), &quot;You Light Up My Life&quot; (Debby Boone),
and &quot;We&#x27;re All Alone&quot; (Rita Coolidge) dominated the charts.
Looking back now, melodic songs were the mainstream, but it was an era when classmates who thought Paul Mauriat was cool were quite common, so that&#x27;s just how it was.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;NetflixでDenzel Washington主演の少し古い映画『Man on Fire』(邦題は『マイ・ボディガード』)を見ました。&lt;&#x2F;p&gt;
&lt;p&gt;劇中で主人公が心の支えにしている曲がLinda Ronstadtの&quot;Blue Bayou&quot;でした。
懐かしくなって、演奏してみました。&lt;&#x2F;p&gt;
&lt;p&gt;1977年と言えば、中学生になって洋楽を聴き始めた年です。
この年は、&quot;How Deep Is Your Love&quot;(Bee Gees)、&quot;You Light Up My Life&quot;(Debby Boone)、
&quot;We&#x27;re All Alone&quot;(Rita Coolidge)などがチャートをにぎわしていました。
今から思うと、メロディアスな楽曲が中心でしたが、当時はポール・モーリアを格好良いと思う同級生も普通にいた時代なので、そんなものだったのでしょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Performed Linda Ronstadt&#x27;s &quot;Blue Bayou&quot; inspired by the Netflix movie &quot;Man on Fire&quot;. Reflecting on the 1977 Western music scene.</summary>
        </entry><entry xml:lang="en">
        <title>やはり買ってしまったBOSS PX-1</title>
        <published>2025-09-27T00:00:00+00:00</published>
        <updated>2025-09-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/purchased-boss-px-1/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/purchased-boss-px-1/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;purchased-boss-px-1&amp;#x2F;px-1.webp?h=297533d9bcfa91faf2ab&quot;
  alt=&quot;BOSS PX-1&quot; width=&quot;1218&quot; height=&quot;751&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;以前の&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;09&#x2F;08&#x2F;boss-px1-personal-thoughts&quot;&gt;記事&lt;&#x2F;a&gt;では
技術的には興味深いが、
使い方が思い浮かばないなどと書いていました。&lt;&#x2F;p&gt;
&lt;p&gt;にも関わらず、購入してしまったのは「売り切れ続出で入手できない」という希少性に
惹かれたという大変ミーハーな理由です。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r6yr5.9srina87.g00r6yr5.9srio803&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fishibashi-shops%2F03-4957054521578%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fishibashi-shops%2Fi%2F11330863%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;ishibashi-shops&#x2F;cabinet&#x2F;image3211&#x2F;03-4957054521578_1.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r6yr5.9srina87.g00r6yr5.9srio803&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fishibashi-shops%2F03-4957054521578%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fishibashi-shops%2Fi%2F11330863%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;BOSS &#x2F; PX-1 Plugout FX ボス PX1 ［BOSSコンパクトエフェクターの名器達を再体験］《次回入荷分予約受付&#x2F;11月〜2026年明け順次入荷予定》&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FBOSS%2520PX-1%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=BOSS%20PX-1&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;購入したらアップデータを適用&quot;&gt;購入したらアップデータを適用&lt;&#x2F;h2&gt;
&lt;p&gt;さて、購入後AndroidでBOSS EFFECT LOADERをインストールして遊ぼうとしたところ
Bluetoothで接続してエフェクターを追加しようとしても「Install」ボタンが表示されません。&lt;&#x2F;p&gt;
&lt;p&gt;既に本体のアップデータがリリースされていて、適用しないとエフェクターのアップロードができないようです。&lt;&#x2F;p&gt;
&lt;p&gt;手順は次の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Mac&#x2F;Windowsで&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.boss.info&#x2F;jp&#x2F;products&#x2F;px-1&#x2F;downloads&#x2F;&quot;&gt;BOSSのサイト&lt;&#x2F;a&gt;からアップデータをダウンロードして解凍しておく。(現在はVer1.10である)&lt;&#x2F;li&gt;
&lt;li&gt;PX-1のペダルを押しながらアダプタを接続し電源を入れると、UPDATERの画面が表示される。&lt;&#x2F;li&gt;
&lt;li&gt;Mac&#x2F;WindowsからはPX-1がリムーバブルドライブに見えているので、解凍したファイル群をPX-1にコピーしてドライブを切り離す。この時、いきなりケーブルを抜かずにち
ゃんと「ドライブの切り離し」を行なう。&lt;&#x2F;li&gt;
&lt;li&gt;PX-1でアップデートが開始され完了すると「UPDATE COMPLETED」と表示される。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;BOSS_PX-1の操作性について&quot;&gt;BOSS PX-1の操作性について&lt;&#x2F;h2&gt;
&lt;p&gt;あのサイズに結構な機能を詰め込んでいるので、操作性が悪いのではないかと心配していましたが杞憂でした。&lt;&#x2F;p&gt;
&lt;p&gt;操作は独特ですが、3つのノブをクリックする、回すというシンプルな操作ですべての操作が出来るようによく練られています。
エフェクターに切り替えやスマートフォンの接続などPX-1独自の機能については少し操作を憶える必要はあります。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、一度エフェクターを呼び出してしまえば、慣れたエフェクターの操作なので特に考えることもなく
操作できてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;ノブの操作でパラメータの変化量が小さすぎるというクレームを見たことがありますが、
おそらく操作方法を知らないのでしょう。ノブを押しながら操作するとパラメータが10単位で変化します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;BOSS_PX-1は使えるか？&quot;&gt;BOSS PX-1は使えるか？&lt;&#x2F;h2&gt;
&lt;p&gt;さて、技術的には興味深いが使い道がわからんなとか書いていました。
実際に使ってみると意外に便利で手放せなくなりました。&lt;&#x2F;p&gt;
&lt;p&gt;私は完全に誤解していました。ついついBOSS GT-1やZoom MS-50Gなどマルチエフェクターと比較してしまい
「can do everything but only one thing at a time」などと考えていたのです。&lt;&#x2F;p&gt;
&lt;p&gt;BOSSはちゃんとアナウンスしていました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;タイムレスなBOSSのエフェクターを体験できる革新的な&lt;strong&gt;コンパクト・ペダル&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;そう、これはマルチエフェクターでなく、あくまでコンパクトエフェクターなのです。
同時に複数のエフェクターが使えないのは当たり前です。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、いろんなエフェクターに成り代われるエフェクターです。
多くの人はある程度エフェクターを持っていたり、ボードを組んでいると思います。
そして、こんな悩みを一度は持ったことがあるはずです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;買うほどではないけれど、あの曲でこのエフェクターを入れたい&lt;&#x2F;li&gt;
&lt;li&gt;買い足すほどじゃないが、たまにいつもと違う歪み系エフェクターを使いたい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;手持ちのエフェクターのラインナップにBOSS PX-1を加えると、こういったイレギュラーな
思いつきに多くの場合PX-1で対応できます。&lt;&#x2F;p&gt;
&lt;p&gt;「こんな中身が入れ替わるエフェクター、ボード上のどこに入れればいいんだ」なんて思っていましたが、
逆でした。ボード上のどこにでも入れられるんです。切り替えたエフェクターに応じて役目が変わるので、
むしろボード内で遊撃手のようにポジションを変えるべきエフェクターなのでした。&lt;&#x2F;p&gt;
&lt;p&gt;多くのYouTuberが検証しているように、歴代のBOSSの名器が再現されており音は折り紙付きです。&lt;&#x2F;p&gt;
&lt;p&gt;これで私のエフェクターの旅もようやく終わりを迎えそうです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">海外では大変バッシングされているBOSSの新しいコンパクトエフェクター PX-1ですが、日本ではどの楽器店でもSOLD OUTで大変人気なようです。そんな中BOSS PX-1の在庫を見つけてしまったので、思わず買ってしまいました。</summary>
        </entry><entry xml:lang="en">
        <title>Purchased Keychron Q9</title>
        <published>2025-09-25T00:00:00+00:00</published>
        <updated>2025-09-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/keychron-q9/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/keychron-q9/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;keychron-q9&amp;#x2F;keychron-q9.webp?h=a4e27e9e29bd0c1f334e&quot;
  alt=&quot;Keychron Q9&quot; width=&quot;1800&quot; height=&quot;1350&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;What_is_the_Keychron_Q9?&quot;&gt;What is the Keychron Q9?&lt;&#x2F;h2&gt;
&lt;p&gt;The Keychron Q9 is a compact keyboard called a 40% keyboard.&lt;&#x2F;p&gt;
&lt;p&gt;60% keyboards like HHKB omit function keys to save space,
which works minimally without compromising usability for people like me who don&#x27;t use function keys.
However, 40% keyboards go even further by omitting the entire row of number keys. If you only type English text, I thought &quot;this might actually work&quot; and became interested.&lt;&#x2F;p&gt;
&lt;p&gt;The Keychron Q9 is quite unique even among 40% keyboards. While the depth is shorter due to fewer key rows,
the width is actually greater than 60% keyboards.&lt;&#x2F;p&gt;
&lt;p&gt;There are models with a knob where the Backspace key would be, and models with split space keys,
but I purchased the most basic type.&lt;&#x2F;p&gt;
&lt;p&gt;Above all, the tightly packed size feels more cute than functionally beautiful.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Layers&quot;&gt;Layers&lt;&#x2F;h2&gt;
&lt;p&gt;The Keychron Q9 has a 5-layer structure as follows:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Layer 0&lt;&#x2F;td&gt;&lt;td&gt;Base layer for Mac system&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Layer 1&lt;&#x2F;td&gt;&lt;td&gt;Base layer for Windows system&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Layer 2&lt;&#x2F;td&gt;&lt;td&gt;Multimedia keys for Mac system. Accessed with fn1 key combination&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Layer 3&lt;&#x2F;td&gt;&lt;td&gt;Multimedia keys for Windows system. Accessed with fn1 key combination&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Layer 4&lt;&#x2F;td&gt;&lt;td&gt;Function keys, numbers, etc. Accessed with fn2 key combination&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The system toggle switch allows switching between Mac and Windows.
For Mac, Layer 0 and Layer 2 (when Fn1 is pressed) are selected.
For Windows, Layer 1 and Layer 3 (when Fn1 is pressed) are used.
Layer 4 is common to both Mac&#x2F;Windows.
It activates when Fn2 is pressed for numbers and function keys.&lt;&#x2F;p&gt;
&lt;p&gt;The Q9 features a 5-layer structure designed to support both Mac and Windows.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Usage_Experience&quot;&gt;Usage Experience&lt;&#x2F;h2&gt;
&lt;p&gt;First, since there are overwhelmingly fewer keys, it&#x27;s certainly quite challenging to use.&lt;&#x2F;p&gt;
&lt;p&gt;The main issues are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hyphen and Equals&lt;&#x2F;strong&gt;: No key assignment. Not that they&#x27;re not on the default layer, but there&#x27;s no key assignment at all.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ESC Key&lt;&#x2F;strong&gt;: Can only be input with Fn2 key combination (common issue with compact keyboards)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Backspace&lt;&#x2F;strong&gt;: Above the Enter key is the \ key, not Backspace (specific issue for HHKB users)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;&#x2F;strong&gt;: Next to the A key is Caps Lock, not Control (specific issue for HHKB users)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fn2&lt;&#x2F;strong&gt;: Number keys can only be input with Fn2 combination, but Fn2 key is only on the right side&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The biggest problem is that Japanese requires hyphens for long vowel sounds, but there&#x27;s no key mapping for it.
Therefore, key mapping changes are essential if you want to use it properly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Customization&quot;&gt;Customization&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hyphen and Equals&lt;&#x2F;strong&gt;: Sacrificed some function keys and made them accessible via Fn2 key combination&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ESC Key&lt;&#x2F;strong&gt;: Set it to the Tab key position since that&#x27;s a familiar location, and made Tab accessible via Fn2 combination&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Backspace&lt;&#x2F;strong&gt;: Since this is also a familiar position, set it to the backslash key. Backslash is now accessible via Fn2. However, it might be better to train myself to use Ctrl-H instead.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;&#x2F;strong&gt;: Replaced Caps Lock with Control&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fn2&lt;&#x2F;strong&gt;: Replaced the Control key position with Fn2. This creates a setup with two Fn2 keys on both left and right sides&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;layer0.webp&quot; alt=&quot;LAYER0&quot; &#x2F;&gt;
  &lt;figcaption&gt;LAYER0&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;layer2.webp&quot; alt=&quot;LAYER2&quot; &#x2F;&gt;
  &lt;figcaption&gt;LAYER2&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;layer4.webp&quot; alt=&quot;LAYER4&quot; &#x2F;&gt;
  &lt;figcaption&gt;LAYER4&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
## Keychron Q9 Evaluation
&lt;p&gt;The switches are Gateron G Pro Red, with an aluminum case and double gasket mount, so the typing feel is excellent.&lt;&#x2F;p&gt;
&lt;p&gt;You get used to it quickly, but since number keys and some other keys can only be typed with key combinations,
typing efficiency does decrease.&lt;&#x2F;p&gt;
&lt;p&gt;While it&#x27;s marketed as a 40% keyboard, the depth is indeed space-saving since it&#x27;s reduced by one row of number keys. Compared to HHKB, you can save about 2cm in depth.
However, the width is about 1.5cm wider on each side compared to typical 60% keyboards.&lt;&#x2F;p&gt;
&lt;p&gt;Personally, I can&#x27;t imagine scenarios where I&#x27;d feel the
space-saving benefits at this level.
However, if you have extreme desk constraints, this unique size
that no other keyboard offers would be the only choice.&lt;&#x2F;p&gt;
&lt;p&gt;As for myself, I&#x27;ll continue using this keyboard purely
for the sake of &quot;showing off the minimal number of keys.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;In a degenerate workplace with useless individuals,
using a favorite keyboard is about the only motivation I have.
This should keep me entertained for about a month.&lt;&#x2F;p&gt;
</content>
        <summary type="html">A review of the Keychron Q9 40% keyboard - exploring its unique design, layer configuration, usage experience, and customization options for this compact keyboard.</summary>
        </entry><entry xml:lang="en">
        <title>高中正義 SUPER TAKANAKA WORLD LIVE 2025-2026</title>
        <published>2025-09-21T00:00:00+00:00</published>
        <updated>2025-09-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/takanaka/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/takanaka/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;takanaka&amp;#x2F;takanaka.webp?h=c602d3944b6ea50fb6ba&quot;
  alt=&quot;高中正義 SUPER TAKANAKA WORLD LIVE 2025-2026&quot; width=&quot;1800&quot; height=&quot;1014&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;久しぶりというのも憚られるほど久しぶりに高中正義さんのライブに行ってきました。
会場は川崎のカルッツかわさきでした。&lt;&#x2F;p&gt;
&lt;p&gt;今回久しぶりにライブへ行こうとおもったのも39年前のライブも
場所が川崎でほろ苦い思い出と共に当時の記憶が蘇ったからです。&lt;&#x2F;p&gt;
&lt;p&gt;1986年の「JANGLE JANE TOUR」で社会人になった年でした。
会場は川崎産業文化会館でしたが、現在は川崎市教育文化会館と改名しており
当時ライブが行われた大ホールは2018年で閉鎖となっていました。&lt;&#x2F;p&gt;
&lt;p&gt;なんか、やっぱりよかったなぁ。
メンバーも斉藤ノヴ(Percussion) &#x2F; 岡沢章(Bass) &#x2F; 宮崎まさひろ(Drums) &#x2F;井上薫(Keyboard) と一流です。
加えて以前「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;intl-ja&#x2F;album&#x2F;4mteo8oYvzdSszotEzomOJ?si=egVX7idJReGY0D0N2g1Ldg&quot;&gt;Haru&lt;&#x2F;a&gt;」
というアルバムをよく聴いていた髙本りなさんもキーボードで参加されたので驚きました。&lt;&#x2F;p&gt;
&lt;p&gt;1曲目から「BLUE LAGOON」で感極まり、アンコールのフィナーレは
「You Can Never Come To This Place」です。米国で10月から公開される映画&quot;The Smashing Machine&quot;
でこの曲が使われていると言っていたのでちょっと期待していましたが、まさかこの曲が生で聴けるとは。 泣きました。&lt;&#x2F;p&gt;
&lt;p&gt;観客はジジィばかりだろうと思っていたら、若い海外の方が意外に多く、
米国で人気になっているというのもホントなのだなと思いました。&lt;&#x2F;p&gt;
&lt;p&gt;あー、もう一公演くらい見に行きたいなぁ。&lt;&#x2F;p&gt;
</content>
        <summary type="html">40年ぶりくらいに高中正義さんのライブに行ってきました。本当によかった。生きている間に見ることが出来て良かった。</summary>
        </entry><entry xml:lang="en">
        <title>フォント編集ソフト OTEdit問題</title>
        <published>2025-09-20T00:00:00+00:00</published>
        <updated>2025-09-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/otedit-problem/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/otedit-problem/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;フォント編集ソフト「OTEdit」で作成されたフォントの空グリフ問題について解説。Adobe-Japan1文字集合選択時に発生する空グリフによりフォールバック機能が正常に動作しない問題と、Pythonスクリプトを使った修正方法を紹介。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;OTEditとは&quot;&gt;OTEditとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;OTEdit&lt;&#x2F;strong&gt;とは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;opentype.jp&#x2F;&quot;&gt;武蔵システム&lt;&#x2F;a&gt;が販売する
OpenTypeフォントを作成・編集を行なうアプリケーションです。
Windows版とMac版が販売されています。&lt;&#x2F;p&gt;
&lt;p&gt;この手のアプリケーションとしては比較的安価で、使用しているフォント作家の方も多いようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;OTEditの問題&quot;&gt;OTEditの問題&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;(以下の考察は、OTEditの試用版による短時間の検証に基づいています。全ての機能を検証できている訳ではないので誤りを含む可能性があります。)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;OTEditではAdobe-Japan1-3、Adobe-Japan1-4、 Adobe-Japan1-7の3種の文字集合のフォントを作成できます。
新規作成時に選択した文字集合について全てのグリフを設定することを前提としているようです。
OTEditではフォントの新規作成時に選択した文字集合から文字の削除ができず、グリフが作成されなくとも「空グリフ」と
各文字コードとグリフのcmapを作成してしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;すべてのフォントがAdobe社の策定した日本語文字集合規格で作成されればよいのですが、
実際にはいずれかの文字集合を選択してもすべてのグリフをサポートしないフォントも多いようです。
例えば、IPAが配布するIPAフォントです。このフォントがどんなツールを使用して作成されたか不明ですが、
JIS X 0213:2012の文字集合をサポートしておりAdobe社の文字集合規格には従っていません。
Adobeの規格と並べると下表のような食い違いがあります。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文字セット&lt;&#x2F;th&gt;&lt;th&gt;総文字数&lt;&#x2F;th&gt;&lt;th&gt;JIS第1～2水準（6,355字）&lt;&#x2F;th&gt;&lt;th&gt;JIS第3～4水準（3,695字）&lt;&#x2F;th&gt;&lt;th&gt;JIS規格外文字（異体字・独自文字）&lt;&#x2F;th&gt;&lt;th&gt;主な特徴&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;JIS X 0213:2012&lt;&#x2F;td&gt;&lt;td&gt;11,233文字&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;含まない&lt;&#x2F;td&gt;&lt;td&gt;公的規格・政府標準&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Adobe-Japan1-3&lt;&#x2F;td&gt;&lt;td&gt;9,354文字&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;非対応&lt;&#x2F;td&gt;&lt;td&gt;機種依存文字等含む&lt;&#x2F;td&gt;&lt;td&gt;一般用途標準&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Adobe-Japan1-4&lt;&#x2F;td&gt;&lt;td&gt;15,444文字&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;一部対応&lt;&#x2F;td&gt;&lt;td&gt;多数の独自文字・異体字含む&lt;&#x2F;td&gt;&lt;td&gt;商業印刷用&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Adobe-Japan1-7&lt;&#x2F;td&gt;&lt;td&gt;23,060文字&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;大量の独自文字・異体字含む&lt;&#x2F;td&gt;&lt;td&gt;最上位規格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;このようなケースでは、OTEditがcmapを生成しますが作者がグリフを用意していない文字には「空グリフ」をマッピングしてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;通常の使用ではあまり問題にならないかもしれませんが、フォント表示の際にフォールバックを前提にしている
ターミナルやブラウザなどで使用するとマズいことになります。
本来であれば指定したフォントがグリフを持たない場合は、別のフォントのグリフが表示されます。
しかしOTEditで作成したフォントでは、「空グリフ」が設定されている可能性が高いので「空白」が表示されてしまいます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;フォントの修正&quot;&gt;フォントの修正&lt;&#x2F;h2&gt;
&lt;p&gt;最近購入した中村書体室の「カドマ-R」でこの不具合の遭遇したので、
作者の方に相談させていただき手元のフォントに修正を掛けました。&lt;&#x2F;p&gt;
&lt;p&gt;対応は、空グリフと思われる文字を調査し該当文字についてcmapからエントリーを削除するという乱暴なものです。
以下がそのスクリプトです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;分析スクリプト&quot;&gt;分析スクリプト&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot; data-name=&quot;font_analyze.py&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env python3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# -*- coding: utf-8 -*-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# HomebrewのPython環境でFontToolsを使用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;&#x2F;opt&#x2F;homebrew&#x2F;Cellar&#x2F;fonttools&#x2F;4.59.2&#x2F;libexec&#x2F;lib&#x2F;python3.13&#x2F;site-packages&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fontTools&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;ttLib&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; TTFont&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fontTools&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;pens&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;recordingPen&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; RecordingPen&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; ImportError&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Import error: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; analyze_font_glyphs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;font_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;フォントファイルを分析して空のグリフとスペースグリフを区別する&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; TTFont&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;font_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;getBestCmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;CFF &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;CFF &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;].&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;CharStrings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;This is not a CFF font&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    results&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    space_codes&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0020&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # SPACE, IDEOGRAPHIC SPACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; sorted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;items&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lsb&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lsb&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            charstring&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; RecordingPen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                charstring&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;draw&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;            # グリフの分類&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            is_space_char&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; space_codes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;            if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; is_space_char&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                        glyph_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;SPACE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                    else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                        glyph_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;BLANK_WITH_WIDTH&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                    glyph_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;EMPTY&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                glyph_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;NORMAL&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;unicode&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;U+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;:04X&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;code&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;char&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; chr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;glyph_name&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;type&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; glyph_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;width&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;#39;commands_count&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; if&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; else&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; results&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;判定基準は、次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;NORMAL: 描画データがあるグリフ&lt;&#x2F;li&gt;
&lt;li&gt;SPACE: スペース文字（U+0020, U+3000）で描画データなし&lt;&#x2F;li&gt;
&lt;li&gt;BLANK_WITH_WIDTH: スペース以外で幅はあるが描画データなし → 削除対象&lt;&#x2F;li&gt;
&lt;li&gt;EMPTY: 幅や描画データがない → 削除対象&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;自動修正スクリプト&quot;&gt;自動修正スクリプト&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot; data-name=&quot;font_cleaner_final.py&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; fix_font_cmap_only&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;input_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;OTEで作成されたフォントのcmapテーブルから空グリフエントリを削除&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; TTFont&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;input_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    original_cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;getBestCmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;CFF &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;CFF &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;cff&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;].&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;CharStrings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    codes_to_remove&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    space_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0020&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ideographic_space_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; 0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; original_cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;items&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lsb&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hmtx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lsb&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            charstring&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; charstrings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;glyph_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; RecordingPen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                charstring&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;draw&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; pen&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;            # スペース文字以外で描画データがない場合は削除対象&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; not in&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;space_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ideographic_space_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;                if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; has_drawing&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; and&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                    codes_to_remove&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;unicode_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # cmapテーブルから削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; table&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;].&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;tables&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; hasattr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;cmap&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; codes_to_remove&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; code&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                    del&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;cmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; True&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;codes_to_remove&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;修正結果&quot;&gt;修正結果&lt;&#x2F;h2&gt;
&lt;p&gt;修正結果は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;総cmapエントリ数: 10,161 → 5,762個（削減率: 43.3%）&lt;&#x2F;li&gt;
&lt;li&gt;削除されたエントリ: 4,399個&lt;&#x2F;li&gt;
&lt;li&gt;Adobe Japan 1-4拡張範囲: 408個&lt;&#x2F;li&gt;
&lt;li&gt;その他の範囲: 3,991個&lt;&#x2F;li&gt;
&lt;li&gt;ファイルサイズ: 2.6% 削減&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;修正の結果、
今のところターミナルでも問題なく使用できています。&lt;&#x2F;p&gt;
&lt;p&gt;上記のスクリプトは精緻にテストを行なっていませんので、
利用については自己責任でどうぞ。&lt;&#x2F;p&gt;
</content>
        <summary type="html">フォント編集ソフト「OTEdit」で作成されたフォントの空グリフ問題について解説。Adobe-Japan1文字集合選択時に発生する空グリフによりフォールバック機能が正常に動作しない問題と、Pythonスクリプトを使った修正方法を紹介。</summary>
        </entry><entry xml:lang="en">
        <title>映画『鬼滅の刃 - 無限城編 第一章 猗窩座再来』を見てきた</title>
        <published>2025-09-19T00:00:00+00:00</published>
        <updated>2025-09-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/kimetsu-no-yaiba/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/kimetsu-no-yaiba/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;kimetsu-no-yaiba&amp;#x2F;kimetsu.webp?h=db09c31ea3bb503f3c9f&quot;
  alt=&quot;鬼滅の刃&quot; width=&quot;1800&quot; height=&quot;1013&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;The visuals and sound were absolutely flawless. Being an IMAX experience, the Infinity Castle sequences were particularly breathtaking. The production team rebuilt the 3D models from scratch. What was initially expected to take 10 years to render was made possible through ultra-high-performance GPUs. The result was stunning. Combined with the powerful audio, I was completely satisfied with how they brought the original manga to life.&lt;&#x2F;p&gt;
&lt;p&gt;However, when I look at it as a movie, I felt there was a major issue. Demon Slayer&#x27;s signature storytelling technique of &quot;flashback monologues during battle scenes&quot; is used for six different characters in this film. These characters include Doma, Shinobu Kocho, Tanjiro Kamado and others like Kaigaku, Zenitsu Agatsuma and Akaza. Most of these are self-indulgent sob stories.&lt;&#x2F;p&gt;
&lt;p&gt;In the manga serialization or 30-minute TV anime episodes, this technique works as a climactic moment. But when you&#x27;re watching nearly 3 hours of a movie with six characters&#x27; flashbacks, you start thinking &quot;Oh great, here we go again.&quot; I started feeling &quot;grossed out&quot; by it halfway through. I found myself distancing from the story.&lt;&#x2F;p&gt;
&lt;p&gt;As a faithful adaptation of the source material, it&#x27;s perfect. But if you&#x27;re going to show this to movie audiences, I think they should have considered what works for cinema. Instead of repeating the same storytelling technique over and over, they could have used the unique characteristics of film as a medium to create something even better.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I watched the movie &quot;Demon Slayer: Kimetsu no Yaiba - Infinity Castle Arc Chapter 1: Akaza&#x27;s Return&quot;.</summary>
        </entry><entry xml:lang="en">
        <title>Nothing Phone (3)を購入</title>
        <published>2025-09-17T00:00:00+00:00</published>
        <updated>2025-09-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/nothing-phone3/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/nothing-phone3/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;nothing-phone3&amp;#x2F;nothing.webp?h=c4e9714ab10181c5a03b&quot;
  alt=&quot;Nothing Phone (3)&quot; width=&quot;1800&quot; height=&quot;1013&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Pixel 8 Proのバッテリーの持ちが悪くなってきたので、日本での発表当日
Nothing Phone(3)を予約購入しました。
8月末に届いて2週間程使ってみたので、レビューとしてまとめたいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Nothing_Phone_(3)の背面デザイン&quot;&gt;Nothing Phone (3)の背面デザイン&lt;&#x2F;h2&gt;
&lt;p&gt;Nothing Phone (3)の最も特徴的な部分が背面のデザインだと思います。
ガラスの透明なボディ内部には複数のパーツが複雑に組み合わされたような造形が見えます。
特にカラーがホワイトの場合に、より鮮明にこれらのデザインが目に付きます。
実際にパーツの一部が露出した造形でなく、機能のない全くの「デザイン」です。&lt;&#x2F;p&gt;
&lt;p&gt;工業製品ではデザインは機能の帰結としてある「機能美」を支持しますが、
iPhoneとAndroidの区別がつかないノッペリしたデザインばかりのスマートフォンの現状を鑑みると、
フェイクでも「何か機能的」と感じさせるデザインについて嫌いではありません。
唯一中心部にある赤い四角はレコーダーアプリ起動時には赤く点灯します。&lt;&#x2F;p&gt;
&lt;p&gt;グリッドに沿って配置されたカメラのレンズは大仰にも感じますが、
3連や4連で縦や横一連に並んだレンズの気色悪さよりよほどマシです。&lt;&#x2F;p&gt;
&lt;p&gt;Nothing Phoneの特徴であった「Glyphインターフェイス」はコスト削減のためか
「Glyphマトリックス」というドットマトリックスを表示できるディスプレイに
変更されました。今のところ特定の条件（通話相手やアプリなど）により
特定のアイコンを表示することと、Glyph Toyの表示くらいしかできません。&lt;&#x2F;p&gt;
&lt;p&gt;Glyph Toyはじゃんけんや瓶回しなどあまり実用的でないものしかありませんが、
そのうちこれを利用できるアプリが出てくるとよいなと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Nothing_Phone_(3)の性能について&quot;&gt;Nothing Phone (3)の性能について&lt;&#x2F;h2&gt;
&lt;p&gt;プロセッサはQualcomm Snapdragon 8S Gen 4で、私が購入したモデルは
ストレージ512GBモデルで、メモリーは16GBです。&lt;&#x2F;p&gt;
&lt;p&gt;Galaxy辺りのハイエンドを比較すると見劣りしますが、
私は負荷の高いゲームなどあまりやらないので十分です。この2週間で不満を感じたシーンは全くありませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;ディスプレイは6.77インチ、1,260×2,800ドットのフレキシブルAMOLEDです。
明るさは通常800nit、屋外1,600nitなので、ハイエンドには及ばないものの十分だと感じます。&lt;&#x2F;p&gt;
&lt;p&gt;カメラ性能はPixel 8 Proと比べてしまうと、若干使い勝手が悪かったりAI補正は弱いと感じます。
メインカメラは1&#x2F;1.3インチと大型センサーを搭載し35mm換算24mm&#x2F;F1.68、ワイドが15mm&#x2F;F2.2、望遠が70mm&#x2F;F2.68
で解像度はどれも50MPなのでそれなりの画像は撮れます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Nothing_OS_3.0と独自アプリ&quot;&gt;Nothing OS 3.0と独自アプリ&lt;&#x2F;h2&gt;
&lt;p&gt;Nothing Phone (3)にはAndroid 15をカスタマイズしたNothing OS 3.0とNothing独自アプリが搭載されています。&lt;&#x2F;p&gt;
&lt;p&gt;予め統一感のあるデザインされた独自のHomeアプリとWedget、アイコンパックが提供されているNothing OS 3.0は、
「もうこれでいいや」と思える程度にセンスよくまとめることを簡単にできます。最初は楽しかったAndroidの
Homeアプリのカスタマイズが最近は苦痛だったので、非常にありがたいと思いました。&lt;&#x2F;p&gt;
&lt;p&gt;独自のギャラリーやレコーダーアプリ、お天気も使い勝手が良く、デザインが統一されているのでWedgitも利用価値があります。
AIを活用したEssential Spaceはまだ使い込んでおらず、あまり恩恵を感じません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Out_of_Boxですぐに使える&quot;&gt;Out of Boxですぐに使える&lt;&#x2F;h2&gt;
&lt;p&gt;Nothing Phone (3)はその背面デザインをスポイルしないトランスペアレントなケースが付属している上に、
ディスプレイには予め保護フィルムが貼ってあり自分で購入して貼る必要がありません。
箱から出してすぐに使い始めることができるので、これは非常に好印象です。&lt;&#x2F;p&gt;
&lt;p&gt;ケースに特に不満はありませんでしたが、Glyphマトリックス部分が保護されていない点と
素材的に黄ばみそうな気がして&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4gpAxMe&quot;&gt;Spigenのクリアケース&lt;&#x2F;a&gt;に差し替えました。
保護能力は折り紙付きでGlyphマトリックス部分もしっかりケースで覆われます。また黄変を抑制する特殊素材を採用されているので黄ばみも押さえることができるのでお勧めで
す。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Nothing Phone (3)は2週間使ってみて非常に満足度の高いスマートフォンでした。&lt;&#x2F;p&gt;
&lt;p&gt;突出して高機能ではありませんが、もはやミッドレンジ以上であれば私の使い方では差が感じられないので十分です。
カメラもPixelには及ばないものの、SNS投稿や記録用途には問題ありません。&lt;&#x2F;p&gt;
&lt;p&gt;背面の透明デザインは賛否が分かれるかもしれませんが、他社の似通ったデザインに対する明確な差別化になっており私は好感を持ちました。
Nothing OS 3.0と独自アプリのUIは本体背面とも統一したデザインがなされており、他の違うセンスよさげな雰囲気を醸し出している点が好きです。&lt;&#x2F;p&gt;
&lt;p&gt;Glyphマトリックスはまだ活用の幅が狭いものの、今後のアプリ開発に期待が持てます。&lt;&#x2F;p&gt;
&lt;p&gt;デザインにこだわりがあるユーザーには、所有する喜びを感じることができお勧めできる一台です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Pixel 8 Proからの買い替えでNothing Phone (3)を2週間使用したレビュー。透明な背面デザイン、Glyphマトリックス、Nothing OS 3.0の使い勝手、カメラ性能などを詳しく紹介。デザインにこだわりがあるユーザーにおすすめの一台。</summary>
        </entry><entry xml:lang="en">
        <title>中村書体室のフォント「カドマ-R」を購入</title>
        <published>2025-09-15T00:00:00+00:00</published>
        <updated>2025-09-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/kadoma-r/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/kadoma-r/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;kadoma-r&amp;#x2F;kadoma-r.webp?h=fb6e8733ae3835468f5e&quot;
  alt=&quot;カドマ-R&quot; width=&quot;754&quot; height=&quot;357&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;ターミナル用に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.n-font.com&#x2F;&quot;&gt;中村書体室&lt;&#x2F;a&gt;の「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.n-font.com&#x2F;fonts&#x2F;kadomar&quot;&gt;カドマ-R&lt;&#x2F;a&gt;」
を購入しました。&lt;&#x2F;p&gt;
&lt;p&gt;文字のマス目一杯にデザインされていますが、コーナーには限りなく柔らかな丸みがつけてあります。
スクエアなのに丸みや柔らかさを感じるという、
従来の丸ゴシック体や角ゴシック体とも違う独特な印象があり大変気に入っています。&lt;&#x2F;p&gt;
&lt;p&gt;ターミナルで愛用していますが、
半角文字は大きさを合わせてデザインされているようで英単語などを多用すると読みづらいので、
半角文字は&lt;code&gt;Berkeley Mono&lt;&#x2F;code&gt; を表示するようにしています。&lt;&#x2F;p&gt;
&lt;p&gt;あまりに気に入ったので、このサイトにも使用させていただいています。&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;また、購入後に書体の追加とOTFへの移行を快く対応いただき、
書体デザイナーの中村征宏様には大変感謝しています。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;フォントの変換とサイトでの使用については、中村書体室に同意をいただいています。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;2026年よりブログのプラットフォームを移行したので、WEBフォントは外しています。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">中村書体室の「カドマ-R」を購入しました。スクエアなのに丸みや柔らかさを感じる独特な印象のフォントで、ターミナルにぜひ使用したいと思いました。Berkeley Monoと組み合わせて使用しています。</summary>
        </entry><entry xml:lang="en">
        <title>Amazon AmplifyのNode.jsバージョンアップ対応</title>
        <published>2025-09-14T00:00:00+00:00</published>
        <updated>2025-09-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/amazon-amplify-node-versionup/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/amazon-amplify-node-versionup/</id>
        
            <content type="html">&lt;p&gt;I recieved the following email from AWS.&lt;&#x2F;p&gt;
&lt;p&gt;This blog does indeed use Amazon Amplify, but I thought it would be fine since I hadn&#x27;t specified a Node.js version and the default was being used.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;2025 年 9 月 15 日から、AWS Amplify コンソールは Node.js 14、Node.js 16、Node.js 18 のサポートを終了します。この日を過ぎると、Node バージョンをアップグレードするまでアプリケーションへの更新をデプロイできなくなります。2025 年 9 月 15 日までに、Node.js 14、Node.js 16、Node.js 18 を使用するすべてのアプリケーションを Node.js 20 以降に更新してください。&lt;&#x2F;p&gt;
&lt;p&gt;Node.js 14、Node.js 16、Node.js 18 ですでにデプロイされているアプリケーションは引き続き実行され、更新をデプロイする必要がない限り影響はありません。&lt;&#x2F;p&gt;
&lt;p&gt;アップグレードする前に新しいブランチでアプリケーションをテストして、すべての機能が正常に動作することを確認することをお勧めします。移行ガイドラインについては、[1] ページの「アプリケーションの Node.js バージョンを更新する必要がある」セクションを参照してください。&lt;&#x2F;p&gt;
&lt;p&gt;影響を受けるリソースのリストは、AWS ヘルスダッシュボードの「影響を受けるリソース」タブにあります。&lt;&#x2F;p&gt;
&lt;footer&gt;
    AWS 通知メール『AWS Amplify は、2025 年 9 月 15 日をもって Node.js 14&#x2F;16&#x2F;18 ベースのアプリのサポートを終了します』
    &lt;&#x2F;footer&gt;
  &lt;&#x2F;blockquote&gt;
&lt;p&gt;Just to be sure, I checked the Node version and found that Node 18 was being used. That&#x27;s no good.
Let&#x27;s explicitly specify the version and rebuild.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;frontend&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  phases&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    preBuild&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # Node.jsバージョンを24に指定（ローカルのMacと同じ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; nvm use 24&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # バージョン確認（ログに出力）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; node --version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm --version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # .envを削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rm -f .env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci --cache .npm --prefer-offline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 環境変数を.envファイルに出力&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; echo &amp;quot;NEXT_PUBLIC_SITE_URL=https:&#x2F;&#x2F;blog.yostos.org&amp;quot; &amp;gt;&amp;gt; .env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        (中略)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    build&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    baseDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .next&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    files&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;**&#x2F;*&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  cache&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    paths&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .next&#x2F;cache&#x2F;**&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .npm&#x2F;**&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">2025年9月15日からAWS AmplifyがNode.js 14&#x2F;16&#x2F;18のサポートを終了するため、Node.js 24に更新した記録です。</summary>
        </entry><entry xml:lang="en">
        <title>TypePad終了：ブログ革命の一時代の終焉</title>
        <published>2025-09-09T00:00:00+00:00</published>
        <updated>2025-09-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/typepad-shutdown-end-of-blog-era/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/typepad-shutdown-end-of-blog-era/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;typepad-shutdown-end-of-blog-era&amp;#x2F;typepad.webp?h=600eb06e08c28be163be&quot;
  alt=&quot;Typepad&quot; width=&quot;1562&quot; height=&quot;992&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable ja-technical-writing&#x2F;sentence-length --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;An article titled &quot;Typepad is shutting down&quot; has been published on TypePad&#x27;s official blog (the site has since been shut down).&lt;&#x2F;p&gt;
&lt;blockquote&gt;
We have made the difficult decision to discontinue Typepad, effective September 30, 2025.
&lt;p&gt;&lt;strong&gt;What Does This Mean for You?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After September 30, 2025, access to Typepad – including account management, blogs, and all associated content – will no longer be available. Your account and all related services will be permanently deactivated.&lt;&#x2F;p&gt;
&lt;footer&gt;
  &lt;cite&gt;Everything Typepad - &quot;Typepad is shutting down&quot;&lt;&#x2F;cite&gt;
&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;An_Icon_of_Early_Blog_Culture&quot;&gt;An Icon of Early Blog Culture&lt;&#x2F;h2&gt;
&lt;p&gt;TypePad launched in October 2003, and I registered and started using it almost simultaneously with the service launch. This was back when Six Apart&#x27;s Japanese subsidiary hadn&#x27;t even been established yet.&lt;&#x2F;p&gt;
&lt;p&gt;Looking back at the situation then, PC magazines featured articles on how to set up Movable Type, but it was still an era with high technical barriers where only tech-savvy enthusiasts would set up their own servers.&lt;&#x2F;p&gt;
&lt;p&gt;Around that time, I read Rebecca Blood&#x27;s &quot;Weblog: A History and Perspective&quot; (2000) and thought, &quot;Wow, this is something different from Japanese diary sites.&quot; It was also impressive that she consistently used the term &quot;weblog&quot; throughout that period.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Constraints_That_Sparked_Creative_Exploration&quot;&gt;Constraints That Sparked Creative Exploration&lt;&#x2F;h2&gt;
&lt;p&gt;One of TypePad&#x27;s charms was the joy of exercising creativity within a constrained environment. Creating widget-like components for the sidebar, customizing designs within limited freedom—it was truly experiencing the essence of blogging.&lt;&#x2F;p&gt;
&lt;p&gt;Unlike today&#x27;s web development environment where you can do anything, there was a kind of creativity that emerged precisely because of certain constraints.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Meeting_the_Developer_Couple&quot;&gt;Meeting the Developer Couple&lt;&#x2F;h2&gt;
&lt;p&gt;On November 21, 2003, I participated in a Six Apart gathering held in Tokyo and had the memorable experience of meeting the developers Ben Trott and Mena Trott in person, which remains vivid in my memory.&lt;&#x2F;p&gt;
&lt;p&gt;Around this time, Six Apart was scaling up their service after receiving funding from venture capital led by Joi Ito&#x27;s Neoteny Co. At the venue, I was able to meet various people who participated as TypePad users—Neoteny associates, people from NTT Communications, someone who challenges the human-powered aircraft contest every year—and could feel firsthand the excitement of the early blog community.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Evolution_of_Blog_Culture_and_Personal_Publishing&quot;&gt;The Evolution of Blog Culture and Personal Publishing&lt;&#x2F;h2&gt;
&lt;p&gt;TypePad&#x27;s shutdown feels like it symbolizes the end of an era, beyond just a service termination.&lt;&#x2F;p&gt;
&lt;p&gt;In 2003, it was also a transitional period when the abbreviation &quot;blog&quot; was trying to replace &quot;weblog.&quot; The term &quot;blog,&quot; which originated from Peter Merholz&#x27;s split notation &quot;we blog&quot; in 1999, became mainstream around this time.&lt;&#x2F;p&gt;
&lt;p&gt;The blog community of that era had a culture of writing deeper content and engaging in denser communication, unlike today&#x27;s SNS-dominated age. There were rich interactions that we don&#x27;t see today, such as inter-article linking through TrackBack and active discussions in comment sections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Importance_of_Personal_Ownership:_From_Dawn_to_Present&quot;&gt;The Importance of Personal Ownership: From Dawn to Present&lt;&#x2F;h2&gt;
&lt;p&gt;When I think about it, the dawn of blogging—the early 2000s when TypePad and Movable Type appeared—was very similar to the ideals advocated by current IndieWeb and microblog concepts, wasn&#x27;t it?&lt;&#x2F;p&gt;
&lt;p&gt;Back then, many people ran blogs on their own domains, and personal publishing on platforms you owned and managed was taken for granted. In the pre-Twitter and Facebook web world, the principle of &quot;personal publishing on your own blog&quot; was practiced unconsciously.&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the microblog concept advocated by the IndieWeb movement, while I personally question whether micro-web is necessary, I strongly resonate with the underlying idea that &quot;individuals should have a place where they can control their own publishing.&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Current_Choice:_Self-Built_Blog_Based_on_Next.js&quot;&gt;Current Choice: Self-Built Blog Based on Next.js&lt;&#x2F;h2&gt;
&lt;p&gt;With such thinking, I currently operate a self-built blog based on Next.js on my own domain&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. This is one answer I&#x27;ve reached through a long evolution of personal web usage from TypePad.&lt;&#x2F;p&gt;
&lt;p&gt;From TypePad era&#x27;s &quot;creativity within constraints,&quot; through Blogger and Static Site Generators&#x27; &quot;freedom and management complexity,&quot; to now choosing &quot;complete technical autonomy.&quot; In terms of avoiding platform dependency risks and building an environment where I can control my own publishing, this could be seen as a return to the spirit of early blogging days.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Fragility_and_Inheritance_of_Digital_Culture&quot;&gt;The Fragility and Inheritance of Digital Culture&lt;&#x2F;h2&gt;
&lt;p&gt;TypePad&#x27;s termination reminds us once again of the vulnerability of cultural assets in the digital age. The reality that a platform that supported many people&#x27;s thoughts and creativity for 22 years can completely disappear with a single corporate decision.&lt;&#x2F;p&gt;
&lt;p&gt;This reality tells the story of the importance of individuals owning their own publishing infrastructure. Platforms may disappear, but domains and content you manage yourself continue to exist.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, the role TypePad played—making it technically possible for ordinary people to publish online and promoting the democratization of blog culture—can be said to be inherited as the foundation for current SNS and content platforms, as well as new web technologies.&lt;&#x2F;p&gt;
&lt;p&gt;Personal publishing environments may be drawing a large circle, going from hosted blogs to SNS, and then returning to individual ownership again.&lt;&#x2F;p&gt;
&lt;p&gt;Though it&#x27;s the flow of time, it&#x27;s still quite sad.&lt;&#x2F;p&gt;
&lt;!-- textlint-enable ja-technical-writing&#x2F;sentence-length --&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;TypePadの公式ブログに「Typepad is shutting down」という記事が掲載されました（サイトは閉鎖済み）。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
We have made the difficult decision to discontinue Typepad, effective September 30, 2025.
&lt;p&gt;&lt;strong&gt;What Does This Mean for You?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After September 30, 2025, access to Typepad – including account management, blogs, and all associated content – will no longer be available. Your account and all related services will be permanently deactivated.&lt;&#x2F;p&gt;
&lt;footer&gt;
  &lt;cite&gt;Everything Typepad - &quot;Typepad is shutting down&quot;&lt;&#x2F;cite&gt;
&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
## 初期ブログ文化の象徴的存在
&lt;p&gt;TypePadは2003年10月にローンチされ、私もサービス開始とほぼ同時にユーザー登録して利用を始めました。まだSix Apartの日本法人も設立されていない頃の話です。&lt;&#x2F;p&gt;
&lt;p&gt;当時の状況を振り返ると、パソコン系雑誌でMovable Typeの導入方法が特集記事として掲載されていましたが、それでもまだまだマニアックな人たちがサーバーを立ち上げるという、技術的ハードルの高い時代でした。&lt;&#x2F;p&gt;
&lt;p&gt;ちょうどその頃、Rebecca Bloodの「Weblog: A History and Perspective」（2000年）を読んで、「おおぉ、これは日本の日記サイトとは別物なんだな」と感じていました。彼女は当時、一貫して「weblog」という用語を使用し続けていたことも印象的でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;デザインへの探求心を刺激した制約&quot;&gt;デザインへの探求心を刺激した制約&lt;&#x2F;h2&gt;
&lt;p&gt;TypePadの魅力の1つは、制限された環境の中でいかに創造性を発揮するかという楽しさでした。サイドバーに置くウィジェット的な部品を作ったり、限られた自由度の中でデザインをカスタマイズしたりと、まさにブログの醍醐味を味わっていました。&lt;&#x2F;p&gt;
&lt;p&gt;現在のように何でもできるWebサイト制作環境とは違い、ある種の制約があったからこそ生まれる創造性があったのかもしれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;開発者夫妻との出会い&quot;&gt;開発者夫妻との出会い&lt;&#x2F;h2&gt;
&lt;p&gt;2003年11月21日、東京で開催されたSix Apartのギャザリングに参加し、開発者であるBen TrottとMena Trott夫妻に直接お会いできたことは、今でも印象深い体験として記憶に残っています。&lt;&#x2F;p&gt;
&lt;p&gt;この頃、Six ApartはJoi ItoのNeoteny Co.主導のベンチャーキャピタルから資金調達を受けてサービスを本格化させていました。会場ではTypePadユーザーとして参加していた様々な方々—Neotenyの関係者、NTT Communicationsの方、毎年鳥人間コンテストにチャレンジされている方など—とも知り合うことができ、初期のブログコミュニティの熱気を肌で感じることができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ブログ文化の変遷と個人発信の意味&quot;&gt;ブログ文化の変遷と個人発信の意味&lt;&#x2F;h2&gt;
&lt;p&gt;TypePadのシャットダウンは、単なるサービス終了を超えて、1つの時代の終わりを象徴しているように感じます。&lt;&#x2F;p&gt;
&lt;p&gt;2003年当時、「blog」という略語が「weblog」に取って代わろうとしていた過渡期でもありました。Peter Merholzが1999年に「we blog」と分割表記したのが始まりとされる「blog」という呼び方が、ちょうどこの頃に一般化していったのです。&lt;&#x2F;p&gt;
&lt;p&gt;当時のブログ界隈は、今のSNS全盛時代とは異なり、より深い文章を書き、より密なコミュニケーションを取る文化がありました。TrackBackによる記事間のリンクや、コメント欄での活発な議論など、現在では見られないような濃密な交流が日常的に行われていたのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人所有の重要性：黎明期から現在へ&quot;&gt;個人所有の重要性：黎明期から現在へ&lt;&#x2F;h2&gt;
&lt;p&gt;よく考えてみると、ブログの黎明期—TypePadやMovable Typeが登場した2000年代初頭—は、現在のIndieWebやマイクロブログ・コンセプトが提唱する理念に非常に近い状況だったのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;当時は多くの人が自分自身のドメインでブログを運営し、個人の発信は自身が所有・管理する場所で行うことが当たり前でした。TwitterやFacebookが台頭する以前のWeb世界では、「個人の発信は自身の所有するブログで」という原則が、意識せずとも実践されていたのです。&lt;&#x2F;p&gt;
&lt;p&gt;IndieWebムーブメントが主張するマイクロブログのコンセプトについては、個人的にマイクロWebが必要かどうかは議論の余地があるものの、その根底にある「個人が自分の発信をコントロールできる場所を持つ」という考え方には強く共感しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;現在の選択：Next.jsベースの自作ブログ&quot;&gt;現在の選択：Next.jsベースの自作ブログ&lt;&#x2F;h2&gt;
&lt;p&gt;そうした考えもあって、私は現在、自身が所有するドメインでNext.jsをベースとした自作のブログを運営しています&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。これは、TypePadからの長い個人Web利用の変遷を経て到達した、ひとつの回答でもあります。&lt;&#x2F;p&gt;
&lt;p&gt;TypePad時代の「制約の中での創造性」から、BloogerやStatic Site Generatorでの「自由度と管理の複雑さ」を経て、現在は「技術的完全自律性」を選択したという流れ。プラットフォーム依存のリスクを避け、自分の発信を自分でコントロールできる環境を構築するという意味では、まさに初期ブログ時代の精神への回帰とも言えるかもしれません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;デジタル文化の儚さと継承&quot;&gt;デジタル文化の儚さと継承&lt;&#x2F;h2&gt;
&lt;p&gt;TypePadの終了は、デジタル時代における文化的資産の脆弱性をあらためて思い起こさせます。22年間という長期間にわたって多くの人々の思考と創造性を支えてきたプラットフォームが、企業の判断1つで完全に消失してしまうという現実。&lt;&#x2F;p&gt;
&lt;p&gt;この現実こそが、個人が自分の発信基盤を所有することの重要性を物語っています。プラットフォームは消えても、自分が管理するドメインとコンテンツは残り続けるのです。&lt;&#x2F;p&gt;
&lt;p&gt;同時に、TypePadが果たした役割—一般の人々がオンラインで発信することを技術的に可能にし、ブログ文化の民主化を推進したこと—は現在のSNSやコンテンツプラットフォーム、新しいWeb技術の基盤となって受け継がれているとも言えるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;個人の発信環境は、ホスト型ブログからSNSへ、そして再び個人所有へと回帰する大きな円を描いているのかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;時代の流れとは言え、やはり寂しい限りです。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;参考：TypePadは2025年9月30日をもってサービス終了予定。コンテンツのエクスポートは同日までに完了する必要があります。&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;I&#x27;ve moved to Zola in 2026. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;2026年にZolaへ移行しました。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">TypePadが2025年9月30日でサービス終了。2003年から22年間続いたブログプラットフォームの歴史を振り返り、初期ブログ文化からSNS時代、そして個人所有メディアへの回帰まで、Web発信環境の変遷を考察。</summary>
        </entry><entry xml:lang="en">
        <title>Personal Thoughts on the BOSS PX-1 Plugout FX</title>
        <published>2025-09-08T00:00:00+00:00</published>
        <updated>2025-09-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/boss-px1-personal-thoughts/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/boss-px1-personal-thoughts/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;09&amp;#x2F;boss-px1-personal-thoughts&amp;#x2F;px-1.webp?h=297533d9bcfa91faf2ab&quot;
  alt=&quot;BOSS PX-1&quot; width=&quot;1218&quot; height=&quot;751&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;A dream-like compact effect pedal that can recreate BOSS&#x27;s legendary effects in a single unit has been announced. While it&#x27;s been received relatively positively in Japan, overseas reactions have been quite harsh and critical.&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t purchased it myself, but I&#x27;d like to share my personal thoughts based on the product information.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Concerns_About_the_Shift_to_Subscription_Models&quot;&gt;Concerns About the Shift to Subscription Models&lt;&#x2F;h2&gt;
&lt;p&gt;The PX-1 comes with 16 built-in effects that can be switched between, with the ability to expand effects by purchasing paid &quot;Model Passes.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;To add effects to this model, licenses must be loaded into the pedal through a dedicated app called BOSS Effect Loader. In other words, it&#x27;s &lt;strong&gt;software&lt;&#x2F;strong&gt;. This additional software is managed not through hardware but through a free Roland account that you create, with licenses tied to your account.&lt;&#x2F;p&gt;
&lt;p&gt;While Roland hasn&#x27;t made any official announcements, generally speaking, such licenses are often non-transferable. This means the common practice of &quot;selling unwanted effects pedals used&quot; may no longer be possible.&lt;&#x2F;p&gt;
&lt;p&gt;In the US, business models requiring small but recurring additional fees are called &quot;Microtransactions,&quot; and there&#x27;s a significant user base that despises them. More than actual cost-performance considerations, the psychological feeling of being &quot;deceived&quot; when additional costs arise after purchase seems to be the issue.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, Roland operates Roland Cloud, which can&#x27;t be considered particularly successful. This has led to user suspicions about a potential future shift to subscription models.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Can_Do_Everything,_But_Only_One_Thing_at_a_Time&quot;&gt;Can Do Everything, But Only One Thing at a Time&lt;&#x2F;h2&gt;
&lt;p&gt;When I first saw this effect pedal announced, my biggest question was &quot;What would you use this for?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;The 16 initial built-in effects span drive, modulation, and spatial categories - a comprehensive selection where &quot;this alone could complete your sound design.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;However, as advertised, the PX-1 &quot;dedicates all DSP resources to a single effect for faithful recreation of original tone and response,&quot; meaning only one effect can be active at any given time. In other words, while the PX-1 can do everything, it can&#x27;t complete anything on its own. Depending on which PX-1 effect you activate, the pedal&#x27;s position and role within your effect board changes entirely.&lt;&#x2F;p&gt;
&lt;p&gt;How would you use such a thing? The moment I saw this, I thought &quot;technically interesting, but I don&#x27;t need this.&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;What_Should_They_Have_Done_Instead?&quot;&gt;What Should They Have Done Instead?&lt;&#x2F;h2&gt;
&lt;p&gt;Personally, I think they should have grouped effects and created a lineup. PX-1 could handle drive effects, PX-2 could handle modulation, and PX-3 could handle spatial effects. Each could have sold well at the same ~$250 price point as the current PX-1.&lt;&#x2F;p&gt;
&lt;p&gt;For example, if they had limited it to just four drive effects at the current price, I would have purchased it:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OD-1&lt;&#x2F;li&gt;
&lt;li&gt;SD-1&lt;&#x2F;li&gt;
&lt;li&gt;DS-1&lt;&#x2F;li&gt;
&lt;li&gt;DF-2&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here&#x27;s why this would have been better:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It would be cheaper than buying these four effects individually&lt;&#x2F;li&gt;
&lt;li&gt;For drive effects, ~$250 isn&#x27;t particularly expensive compared to boutique pedals&lt;&#x2F;li&gt;
&lt;li&gt;It includes models like OD-1 and DF-2 that are now only available used and have become quite expensive&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ideally, if they had included something like a BD-2, it would have been perfect.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The BOSS PX-1 is technically excellent and deserves praise for faithfully recreating classic effects. However, for the following reasons, I personally cannot actively recommend this product:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;There&#x27;s a fundamental contradiction in the product concept of &quot;can do everything but only one thing at a time,&quot; resulting in user confusion about how to actually use it.&lt;&#x2F;li&gt;
&lt;li&gt;By suddenly introducing software into BOSS&#x27;s traditionally hardware-centric business model, they&#x27;re creating user anxiety and ignoring the &quot;used market&quot; that their traditional users have supported.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The product has become more of a technical demonstration than a practical tool, earning it the position of an &quot;interesting but unnecessary&quot; product. While I acknowledge BOSS&#x27;s technical capabilities, this represents a typical example of marketing-driven product development that disregards user practicality.&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r6yr5.9srina87.g00r6yr5.9srio803&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fishibashi-shops%2F03-4957054521578%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fishibashi-shops%2Fi%2F11330863%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;ishibashi-shops&#x2F;cabinet&#x2F;image3211&#x2F;03-4957054521578_1.jpg?_ex=128x128&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g00r6yr5.9srina87.g00r6yr5.9srio803&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fishibashi-shops%2F03-4957054521578%2F&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2Fishibashi-shops%2Fi%2F11330863%2F&amp;rafcid=wsc_i_is_1087413314923222742&quot; target=&quot;_blank&quot; &gt;BOSS &#x2F; PX-1 Plugout FX ボス PX1 ［BOSSコンパクトエフェクターの名器達を再体験］《次回入荷分予約受付&#x2F;11月〜2026年明け順次入荷予定》&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;kaereba_main_202601301000098827?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FBOSS%2520PX-1%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt&amp;m=http%3A%2F%2Fm.rakuten.co.jp%2F&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=BOSS%20PX-1&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">A dream-like compact effect pedal that can recreate BOSS&#x27;s legendary effects in a single unit has been announced. While it&#x27;s been received relatively positively in Japan, overseas reactions have been quite harsh and critical. I haven&#x27;t purchased it myself, but I&#x27;d like to share my personal thoughts based on the product information.</summary>
        </entry><entry xml:lang="en">
        <title>A New Proposal for the Cloud Era: How UGREEN NAS is changing the future of personal data storage</title>
        <published>2025-08-31T00:00:00+00:00</published>
        <updated>2025-08-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/ugreen-nas/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/ugreen-nas/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;08&amp;#x2F;ugreen-nas&amp;#x2F;ugreen-nas.webp?h=9118045f14051f5966ab&quot;
  alt=&quot;UGREEN NAS&quot; width=&quot;740&quot; height=&quot;467&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Why_I_Chose_UGREEN_NAS&quot;&gt;Why I Chose UGREEN NAS&lt;&#x2F;h2&gt;
&lt;p&gt;Among numerous NAS products, I selected the UGREEN NASync DXP2800
for its outstanding cost-performance ratio.
Despite being significantly cheaper than the Synology DS224+,
it comes standard with an Intel N100 processor and 8GB DDR5 memory.
It also includes a 2.5GbE port and dual M.2 slots.
The 2.5GbE port is particularly rare in this price range and offers
future-proofing.&lt;&#x2F;p&gt;
&lt;p&gt;The tool-free removable drive tray system for easy HDD
replacement was also appealing. Setup Experience Upon unboxing, I was
impressed by the build quality of the aluminum alloy chassis. The included
dual CAT 7 LAN cables were also high-quality. I installed
2×&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4myLddI&quot;&gt;WD Red Plus 4TB HDDs&lt;&#x2F;a&gt; (RAID 1 configuration) and
2×&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3HZmdgD&quot;&gt;Samsung 990 EVO Plus 1TB SSDs&lt;&#x2F;a&gt;.
HDDs simply clicked into the trays, and SSDs were easily installed with the included
screwdriver. Initial setup through the dedicated &quot;UGREEN NAS&quot; app took just
minutes. The RAID configuration suggested optimal settings based on
installed drives, making it beginner-friendly without confusion.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Real-World_Usage&quot;&gt;Real-World Usage&lt;&#x2F;h2&gt;
&lt;p&gt;The Samsung SSD cache implementation showed dramatic results, with
near-instantaneous photo browsing and previews. It&#x27;s a completely different
experience from external HDDs. Power management features allow scheduled
automatic shutdown at night and startup in the morning, extending HDD
lifespan. UGOS (UGREEN&#x27;s OS) exceeded expectations with robust file
management, automatic photo organization, remote access, and other essential
daily functions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Final_Verdict:_Worth_Buying?&quot;&gt;Final Verdict: Worth Buying?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Conclusion: Absolutely a &quot;buy.&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The price-to-hardware spec ratio is unmatched by competitors. It
combines beginner-friendly usability with future expandability.
Considerations:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Security concerns about Chinese manufacturers (may not suit corporate
secrets)&lt;&#x2F;li&gt;
&lt;li&gt;Software is still developing compared to Synology DSM&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, it&#x27;s sufficient for home use and continuously improving through
frequent updates. Compared to monthly cloud service fees, the long-term
benefits of building a private cloud are immeasurable. I recommend this
noteworthy product that&#x27;s bringing fresh innovation to the NAS market.&lt;&#x2F;p&gt;
</content>
        <summary type="html">A 2-month review of the excellent cost-performance UGREEN NASync DXP2800. This popular NAS offers outstanding specs for its price range. From tool-free easy setup and SSD cache acceleration to UGOS practicality, we explain in detail why we recommend it to NAS beginners and how to use it effectively. We provide an honest evaluation including concerns about Chinese manufacturers.</summary>
        </entry><entry xml:lang="en">
        <title>Not Ready To Fly - Test Flight</title>
        <published>2025-08-30T00:00:00+00:00</published>
        <updated>2025-08-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/not-ready-to-fly/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/not-ready-to-fly/</id>
        
            <content type="html">&lt;p&gt;Currently copying Masayoshi Takanaka&#x27;s &#x27;Ready To Fly&#x27;. First, I tried to
recreate the guitar ensemble part from the intro section.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m overdubbing
with 6 guitars, but I feel like the original track has even more guitars
layered in.
When I think about how they achieved this overdubbing on tape back in the
&#x27;70s, I&#x27;m truly amazed. The precision and skill required is just incredible.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2161801854&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;ready-to-fly-test-flight&quot; title=&quot;(Not) Ready To Fly - Test Flight&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;(Not) Ready To Fly - Test Flight&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">&quot;Ready To Fly&quot;のコピー中。イントロのギターアンサンブルのような部分を再現してみました。</summary>
        </entry><entry xml:lang="en">
        <title>小麦色のマーメイド</title>
        <published>2025-08-29T00:00:00+00:00</published>
        <updated>2025-08-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/wheat-colored-mermaid/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/wheat-colored-mermaid/</id>
        
            <content type="html">&lt;p&gt;This song performed by Seiko Matsuda was originally released in July 1982,
and I remember it well as it was during my first summer away from home.&lt;&#x2F;p&gt;
&lt;p&gt;It was composed by the renowned Japanese singer-songwriter Yumi Matsutoya (under
the pen name Kuroda Karaho). I was amazed at the time by how brilliantly the
song captured the languid feeling of summer through sustained bass notes
using fractional chords and melodies centered on tension notes.&lt;&#x2F;p&gt;
&lt;p&gt;I suddenly remembered this song, so I decided to perform it. Everything
except the guitar is programmed sequenced. The vocals are done with
Synthesizer V.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2161359513&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;m6lxfowipg2j&quot; title=&quot;Wheat-Colored Mermaid ( 小麦色のマーメイド )&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Wheat-Colored Mermaid ( 小麦色のマーメイド )&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;松田聖子さんが歌うこの曲の原曲は1982年7月にリリースされ、地元を離れた最初の
夏だったのでよく憶えています。&lt;&#x2F;p&gt;
&lt;p&gt;呉田軽穂こと松任谷由実さんの作曲で、夏の気だるさを分数和音を使ったベースの継続音
とテンションノート中心のメロディで上手く表現した素晴らしい楽曲だと当時驚いたものです。&lt;&#x2F;p&gt;
&lt;p&gt;ふと思い出したので、演奏してみました。ギター以外は打ち込みです。ヴォーカルはSyntesizer Vです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">暑い。松田聖子さんの『小麦色のマーメイド』が思い浮かんだので演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>The Case Against Local Governments</title>
        <published>2025-08-28T00:00:00+00:00</published>
        <updated>2025-08-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/nomore-local-government/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/nomore-local-government/</id>
        
            <content type="html">&lt;p&gt;I was intrigued by Minister of Internal Affairs Seiichiro Murakami&#x27;s remarks at the House of Representatives Committee on Internal Affairs and Communications.&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;nordot.app&#x2F;1262674593671201285?c=39550187727945729&quot;&gt;
  村上誠一郎総務相は13日の衆院総務委員会で、個人的見解と断った上で、今世紀末に人口が半減するとの推計を踏まえ、現在1700以上ある自治体は「300～400の市で済む」との考えを示した。「極端なことを言うと、県庁はいらないし、道州制も意味がない」との持論も展開した。
  &lt;footer&gt;
    &lt;cite&gt;一般社団法人共同通信社 「&lt;a href=&quot;https:&#x2F;&#x2F;nordot.app&#x2F;1262674593671201285?c=39550187727945729&quot;&gt;総務相「今世紀末は300市に」　自治体数で持論、県庁も不要&lt;&#x2F;a&gt;」&lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I&#x27;m appalled by the Minister&#x27;s incompetence in accepting
population decline as a given rather than addressing it.
However, having worked at a local government affiliated
organization, I agree that municipalities are unnecessary.&lt;&#x2F;p&gt;
&lt;p&gt;These local governments and their affiliated organizations
create work by piling up internal administrative operations
without being held accountable for results.
They fail to do what truly needs to be done.
Witnessing this firsthand makes me want to agree with his position.&lt;&#x2F;p&gt;
</content>
        <summary type="html">After working at a local government affiliated organization, the Minister of Internal Affairs&#x27; statement that &quot;300 municipalities would suffice&quot; caught my attention.</summary>
        </entry><entry xml:lang="en">
        <title>映画『ジェラシック・ワールド 復活の大地』</title>
        <published>2025-08-26T00:00:00+00:00</published>
        <updated>2025-08-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/jurassic-world-rebirth/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/jurassic-world-rebirth/</id>
        
            <content type="html">&lt;p&gt;上演時間が短く感じるほど退屈はしませんでした。楽しめはします。&lt;&#x2F;p&gt;
&lt;p&gt;人間ドラマが軽薄すぎるとか、スカーレット・ヨハンソンがナターシャ・ロマノフに
しか見えないとかは許せます。&lt;&#x2F;p&gt;
&lt;p&gt;許せないのは恐竜の描き方です。登場する恐竜が誰も求めていない遺伝子操作された混合種だという前提だとしても、そこには1993年に感
じたあの恐竜のリアリティはありません。もう、言ってしまうと「あれ、エイリアン
じゃん」&lt;&#x2F;p&gt;
&lt;p&gt;そんな気分を落ち着ける為、ジョン・ウィリアムスのあの名曲を弾いてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2158911984&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;theme-from-jurassic-park&quot; title=&quot;Theme From Jurassic Park&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Theme From Jurassic Park&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">『ジェラシック・パーク』シリーズの最新作を見てきました。あまりにもアレで、ジョン・ウィリアムズの名曲を弾いてみました。</summary>
        </entry><entry xml:lang="en">
        <title>Sonicake Pocket Masterを購入</title>
        <published>2025-08-26T00:00:00+00:00</published>
        <updated>2025-08-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/sonicake-pocket-master/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/sonicake-pocket-master/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;08&amp;#x2F;sonicake-pocket-master&amp;#x2F;pocket-master.webp?h=560d6ece561c3326b6cf&quot;
  alt=&quot;Sonic Pocket Master&quot; width=&quot;1800&quot; height=&quot;1356&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Sonicakeの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3UHO4Vz&quot;&gt;Pocket Master&lt;&#x2F;a&gt;です。
一時は品切れで入荷待ちでしたが、最近は普通にAmazonなどで購入できます。&lt;&#x2F;p&gt;
&lt;p&gt;この大きさで、100種以上のエフェクター、20種類のアンプシミュレーター、IRキャビネットは15種類が使え、
チューナーとドラムマシンも付いて、オーディオインターフェイスにもなる超便利な
ギター用エフェクターです。&lt;&#x2F;p&gt;
&lt;p&gt;しかもバッテリー内蔵なので、気軽にスタジオなどにも持ち出せます。&lt;&#x2F;p&gt;
&lt;p&gt;そして、NAM(Neural Amp Modeler)がローディングできるのです。どんなお高いアン
プやエフェクターの音もキャプチャーしたデータがあればPocket Masterにローディ
ングさえすれば再現できます。&lt;&#x2F;p&gt;
&lt;p&gt;これが8,800円です。恐ろしい時代です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">8,800円という脅威の低価格でNAMまで使えてしまうマルチプロセッサーSonicake Pocket Masterを購入してためしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>日本料理発祥の地 - 勝山浮島</title>
        <published>2025-08-24T00:00:00+00:00</published>
        <updated>2025-08-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/ukishima/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/ukishima/</id>
        
            <content type="html">&lt;p&gt;浮島は千葉県鋸南町の勝山漁港の目の間にある無人島です。&lt;&#x2F;p&gt;
&lt;p&gt;手前には「みさご島」または「傾城（けいせい）島」と呼ばれる島があります。
その昔、日本武尊が相模から上総に船で渡る際暴風により船が沈みそうになりました。
その際に后の弟橘媛が海に身を投げ、暴風を収さめたため無事上総に上陸できたとの言い伝えられています。
その弟橘媛の亡骸がみさご島に打ち上げられたと言い伝えられています。&lt;&#x2F;p&gt;
&lt;p&gt;日本武尊の子の景行天皇が弟橘姫の供養もこの地を訪れ、浮島を気に入り滞在したと
いわれています。その際に鹿六雁命が近辺で取れた魚や貝を料理して差し出したのが
、日本料理の発祥といわれています。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;MsZtpeuAjvU&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">千葉県鋸南町勝山浮島を撮影してきました。古代の神話に縁のある地が多く興味深い地域です。</summary>
        </entry><entry xml:lang="en">
        <title>大韓民国李在明大統領来日に伴う無人航空機等の飛行規制</title>
        <published>2025-08-23T00:00:00+00:00</published>
        <updated>2025-08-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/flight-restrictions/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/flight-restrictions/</id>
        
            <content type="html">&lt;p&gt;国土交通省から韓国大統領来日に伴う無人航空機の飛行規制がアナウンスされました。
おそらくDISP2.0の利用者に向けて国道交通省から以下のメールが発信されました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
  令和7年8月23日（土）から24日（日）までの間、李在明韓国大統領の来日に伴い、「重要施設の周辺地域の上空における小型無人機等の飛行の禁止に関する法律」（以下「小型無人機等飛行禁止法」という。）に基づく飛行禁止区域が指定されました。
&lt;p&gt;小型無人機等飛行禁止法に基づき、同期間においては対象施設及びその周辺地域の上空における小型無人機、操縦装置を有する気球、ハンググライダー（原動機を有するものを含む。）、パラグライダー（原動機を有するものを含む。）等の飛行は禁止されます。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;石破総理がやらかさないことを祈ります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">国土交通省から韓国大統領来日に伴う無人航空機の飛行規制がアナウンスされました。</summary>
        </entry><entry xml:lang="en">
        <title>任天堂 Switch Pro Controller 5代目</title>
        <published>2025-08-19T00:00:00+00:00</published>
        <updated>2025-08-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/pro-controller/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/pro-controller/</id>
        
            <content type="html">&lt;p&gt;プロコンが壊れました。&lt;&#x2F;p&gt;
&lt;p&gt;毎回左スティックが前方向に入らなくなるという壊れ方です。スプラトゥーン3で
イカロールが導入されて以前より更に左スティックを酷使するようになったで仕方な
いですが、何度も壊れるのでいい加減対策しろよとも思います。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;zOmJPTKMoz0&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601300943222299?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;ran&#x2F;img&#x2F;1001&#x2F;0004&#x2F;902&#x2F;370&#x2F;535&#x2F;730&#x2F;10010004902370535730_1.jpg?_ex=320x320&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601300943222299?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;Nintendo NINTENDO SWITCH PROコントローラー&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601300943222299?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2Ff3b98cb04f4822fe5f3943c4608c2c74%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=Pro%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">任天堂 Switch 2は当たる気配もありませんが、プロコンが壊れたので新調しました。</summary>
        </entry><entry xml:lang="en">
        <title>戦争責任について</title>
        <published>2025-08-18T00:00:00+00:00</published>
        <updated>2025-08-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/war-responsibility/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/war-responsibility/</id>
        
            <content type="html">&lt;p&gt;中島聡氏のメールマガジンに「戦争責任にケジメをつけて前に進む必要性」という興味深い記事がありました。日本が第二次世界大戦における戦争責任にケジメをつけられない理由についての分析で、納得できる部分が多くあったため、ここに記録しておきます。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;中島氏の基本的な見解&quot;&gt;中島氏の基本的な見解&lt;&#x2F;h2&gt;
&lt;p&gt;中島氏の基本的な立場は明確です。
旧日本軍の残虐行為を肯定するものではないが、
過去の戦争について永続的に謝罪し続けることも適切ではないという、バランスの取
れた見解を示しています。基本的は同意できます。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.mag2.com&#x2F;archives&#x2F;0001323030&#x2F;&quot;&gt;
  日本の場合、戦争の責任を押し付けるべき人々に「ナチス」のような総称がな
  いため、「旧日本軍が残虐な行為をしたことを日本人として反省している」と
  言う卑屈な表現になってしまいがちで、その反動として、「日本人の名誉を守
  る」ための保守派による「旧日本軍は残虐な行為はしていない」という否定的
  な発言に結びついてしまうのです。
  &lt;footer&gt;
    &lt;cite&gt;
      週刊Life is beautiful ２０２５年８月１２日号：Elon Muskの報酬、
      LyftとBaiduのパートナーシップ、FigmaとAmbiqの上場、戦争責任にケジメを
      つけて前に進む必要性
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;中島氏の分析で特に興味深いのは、日独の戦争責任の向き合い方の違いです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ドイツの場合&lt;&#x2F;strong&gt;: 戦争責任を「ナチス」という明確な対象に帰結させることで、論理的で筋の通った反省が可能になっている&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;日本の場合&lt;&#x2F;strong&gt;: A級戦犯が存在するにも関わらず、国民がそこに責任を帰結させることができず、結果として「卑屈な反省」と「保守派の反発」という対立構造が生まれている&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;なぜ日本人はA級戦犯に戦争責任を帰結できないのか&quot;&gt;なぜ日本人はA級戦犯に戦争責任を帰結できないのか&lt;&#x2F;h2&gt;
&lt;p&gt;中島氏は、日本人がA級戦犯に戦争責任を帰結させることができない理由として、戦後のGHQの政策を指摘しています。
具体的には、「GHQがA級戦犯を無罪放免して政治的に利用した結果、A級戦犯の一人であった岸信介（安倍晋三の祖父）が総理大臣になってしまった」ことを挙げています。&lt;&#x2F;p&gt;
&lt;p&gt;この指摘は確かに重要な要因の1つですが、日本人がA級戦犯に戦争責任を帰結させることができない理由は、より複層的であると考えられます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;A級戦犯への疑問&quot;&gt;A級戦犯への疑問&lt;&#x2F;h3&gt;
&lt;p&gt;まずA級戦犯についての中島氏の観点を除いていても、
戦後の日本人が戦犯としての正当性に「納得」していないのが現実だと思われます。&lt;&#x2F;p&gt;
&lt;p&gt;この点は、故石原慎太郎氏の平成26年2月12日の衆議院予算委員会での発言を見ると明確に表れています。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;HC8VfZlwYnA&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;東京裁判(極東国際軍事裁判)自体の正当性が疑問&lt;&#x2F;li&gt;
&lt;li&gt;A級戦犯とは「平和に対する罪」つまり戦争を始めた罪。「戦争犯罪」とい
う概念はあった&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;が、開戦当時、戦争は国家間の紛争の解決手段の1つと認識され
ており「戦争を始めた罪」などという犯罪はなかった&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A級戦犯として処刑された東条英機が遺書で語っているよう
「戦の責任は死をもってしても贖い切れない」、つまり「敗戦の罪」です。
実際、このお方、軍人としては徹底的に無能でした。
一方で「今回の戦争は侵略を目的としたものではなく、国際的には犯罪ではない。」
というとも述べています。&lt;&#x2F;p&gt;
&lt;p&gt;これは理解しやすい論理です。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、A級戦犯については戦後の政治的扱いの問題もさることながら、そもそもその犯罪定義や裁判自体に対する納得感が乏しく、むしろ「敗戦の責任」として受け入れている国民が多いのではないでしょうか。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;B&#x2F;C級戦犯の認知&quot;&gt;B&#x2F;C級戦犯の認知&lt;&#x2F;h3&gt;
&lt;p&gt;A級戦犯は25人が有罪となり7人が処刑されました。
一方で戦争犯罪であるB級戦犯、人道に対する罪&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;のC級戦犯は5000人以上が有罪と
なり、937人が処刑されています。&lt;&#x2F;p&gt;
&lt;p&gt;これらは主に米国が戦犯として裁いたものですが、
ソビエト連邦や中国でどれだけの方が処刑されたか統計がありません。
中国の撫順戦犯管理所やソビエト連邦のシベリア抑留など、多くの日本人が戦争犯罪
者として収容され思想改造や労働を強いられて肉体的・精神的な苦痛を与え続けられ
ました。&lt;&#x2F;p&gt;
&lt;p&gt;東京裁判について広く知られていても、これらB&#x2F;C級戦犯の実態について認識して
いる日本人は少ない。
日本の戦争犯罪は納得感なく少数のA級戦犯が裁かれたことしか認知しておらず、
そのためなんとなく旧日本軍の戦争犯罪が「裁かれていない」感を持ってしまってい
るのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、実際にはこれだけ多くの日本人が戦争犯罪者として実際に裁かれ処刑を含む処罰受けています。
この事実を踏まえると、まださらなる謝罪や反省が必要なのでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;櫻井よしこ氏の記事について&quot;&gt;櫻井よしこ氏の記事について&lt;&#x2F;h2&gt;
&lt;p&gt;なお、中島氏のこの記事は、櫻井よしこ氏が産経新聞に寄せた&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sankei.com&#x2F;article&#x2F;20250804-CBJSJPFKFFNBZNNKWI6RGYKDSM&#x2F;&quot;&gt;記事&lt;&#x2F;a&gt;への批判として書かれたものです。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.sankei.com&#x2F;article&#x2F;20250804-CBJSJPFKFFNBZNNKWI6RGYKDSM&#x2F;&quot;&gt;
  「南京大虐殺」はわが国の研究者らによってなかったことが証明済みだ。にもかかわらず中国は事実を曲げ日本への憎しみをかき立てる。
  &lt;footer&gt;
    &lt;cite&gt;
      産経新聞記事 -
      「&lt;a href=&quot;https:&#x2F;&#x2F;www.sankei.com&#x2F;article&#x2F;20250804-CBJSJPFKFFNBZNNKWI6RGYKDSM&#x2F;&quot;&gt;
石破首相よ、戦後80年「個人の見解」で中国の反日宣伝に手を貸すな
    &lt;&#x2F;a&gt;」
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;中島氏はこのような発言を「日本国にとってマイナスなこと」と断じています。
しかし、櫻井氏の真意を正確に読み取れていない可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;櫻井氏の表現にも改善の余地はありますが、&lt;q&gt;「南京大虐殺」&lt;&#x2F;q&gt;と引用符付きで
記述しているのは重要なポイントです。これは歴史的事実としての旧日本軍の行為の
有無を論じているのではなく、中国が政治的目的で主張する「南京大虐殺」という政
治的プロパガンダを問題視しているのだと解釈できます。&lt;&#x2F;p&gt;
&lt;p&gt;記事全体の文脈を踏まえれば櫻井氏の真の懸念が理解できますが、部分的な引用や表
面的な読み方では「歴史修正主義」として批判されてしまうのが現状です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;&#x2F;h2&gt;
&lt;p&gt;中島氏の指摘する「日本が戦争責任にケジメをつけられない理由」は、単純なGHQの
政策だけではなく、より根本的な問題を含んでいると考えられます。A級戦犯という
概念自体への疑問、B&#x2F;C級戦犯の実態への無関心、そして言論の不備が組み合わさっ
て、日本の戦争責任問題を複雑で未解決な状態にしているのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;この問題を解決するためには、感情的な対立ではなく、歴史的事実と政治的プロパガンダを区別した冷静な議論が必要ではないでしょうか。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;事実B級戦犯が通常の戦争犯罪です。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;これも戦後に作られた後付けの犯罪です。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">中島聡氏のメールマガジンに「戦争責任にケジメをつけて前に進む必要性」という記事がありました。なぜ日本が第二次世界大戦にケジメとつけられないかという仮説を述べており、一部「なるほどな」と思ったので書き留めておきます。</summary>
        </entry><entry xml:lang="en">
        <title>Netflix『グラス・ハート』から「Matrix」を弾いてみた</title>
        <published>2025-08-17T00:00:00+00:00</published>
        <updated>2025-08-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/glass-heart/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/glass-heart/</id>
        
            <content type="html">&lt;p&gt;Netflixで配信が始まった『グラス・ハート』の評判がよいようです。
私も配信が始まって２日目くらいで全エピソードを見終わってしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;サポートでプロが入っていると思いますが、演奏シーンのかなりの部分を俳優の方が
数ヶ月練習して演奏しているそうです。そのため演奏シーンは本当に素晴らしい出来
です。&lt;&#x2F;p&gt;
&lt;p&gt;ちょっと感動してしまい、劇中歌でバンドが最初に演奏する曲「Matrix」
のギターパート弾いてみました。&lt;&#x2F;p&gt;
&lt;p&gt;ギター以外は打ち込みですが、冒頭にエピソード1で、雨の中主人公の茜が叩いてい
るドラムを打ち込みで再現してみました。
ヴォーカルはSynthesizer Vを使用しています。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2154466962&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;matrix&quot; title=&quot;Matrix&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Matrix&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">Netflix『グラス・ハート』の劇中歌「Matrix」を自分で演奏してみました。俳優の方々の素晴らしい演奏シーンに感動し、ギターの演奏をコピーしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>残暑見舞い</title>
        <published>2025-08-15T00:00:00+00:00</published>
        <updated>2025-08-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/late-summer-greetings/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/late-summer-greetings/</id>
        
            <content type="html">&lt;p&gt;残暑お見舞い申し上げます。 いかがお過ごしでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;まだまだ暑さが和らぎませんが、それでも箱根や伊豆辺りでは夕暮れ時にひぐらしが鳴いていました。&lt;&#x2F;p&gt;
&lt;p&gt;ひぐらしを聞くと思い出すこの曲を演奏してみました。どこか懐かしい一曲です。 良かったら聴いてみてください。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;e.pcloud.link&#x2F;publink&#x2F;show?code=XZ3v3EZtoVPXeQfO886j71IchmFJ5ExTn0X&quot;&gt;伊豆甘夏納豆売り&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;まだしばらく暑い日が続きそうですが、どうぞお体ご自愛ください。&lt;&#x2F;p&gt;
</content>
        <summary type="html">箱根で聞いたひぐらしの声が忘れられず、この曲を弾いてみました。</summary>
        </entry><entry xml:lang="en">
        <title>FourFiveSeconds</title>
        <published>2025-08-14T00:00:00+00:00</published>
        <updated>2025-08-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/fourfiveseconds/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/fourfiveseconds/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2150733432&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;fourfiveseconds&quot; title=&quot;FourFiveSeconds&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;FourFiveSeconds&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Guitar: Epiphon USA Texan, Epiphone Casino&lt;&#x2F;p&gt;
&lt;p&gt;This hit features Paul on acoustic guitar. My Texan just turned one year old, so I was looking for songs to play with it when this one came to mind.&lt;&#x2F;p&gt;
&lt;p&gt;Unlike most Japanese songs, this track expresses raw emotion without offering resolution or moral lessons. I&#x27;ve been dealing with a lot of frustration lately, and playing this made me realize the value of music that simply holds your feelings without demanding answers. Of course, I personally have a 2-second fuse anyway 😁.&lt;&#x2F;p&gt;
</content>
        <summary type="html">隠れたポール参加の名曲を演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>首都防衛の址 第一海堡 - 富津岬</title>
        <published>2025-08-11T00:00:00+00:00</published>
        <updated>2025-08-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/daiichi-kaiho/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/daiichi-kaiho/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;第一海堡とは&quot;&gt;第一海堡とは&lt;&#x2F;h2&gt;
&lt;p&gt;明治時代、海防問題は必須の懸案事項で、とくに東京湾については
フランス招聘軍人や陸軍内からも数多くの意見書が提出されています。&lt;&#x2F;p&gt;
&lt;p&gt;背景には朝鮮半島を巡り清国とは関係が緊張し、そしてロシアとの関係悪化がありました。
当時東洋一と認識されていた清国の北洋艦隊や、次にロシア帝国海軍太平洋艦隊の
脅威が首都防衛の要として東京湾の観音崎-富津岬間を最重要防衛ラインとされてい
ました。&lt;&#x2F;p&gt;
&lt;p&gt;当時の大砲の有効射程距離3Kmに対して観音崎-富津岬間が7Kmです。
敵艦を迎撃する為には、猿島砲台と第一海堡および第二海堡、第三海堡&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;が必要とされました。&lt;&#x2F;p&gt;
&lt;p&gt;第一海堡(当時「富津海堡」)は、1880年頃から建設が開始され1890年頃には完成
しその後砲台が設置されています。
第二次世界大戦後、米軍により軍事施設は武装解除され砲台も破壊されています。現
在は財務省関東財務局の管理となっています。&lt;&#x2F;p&gt;
&lt;p&gt;以前は釣り人が上陸したりしていたようですが、現在は損傷が激しく上陸禁止となっ
ています。写真を確認すると、直近の5年でも建造物が大きく壊れて海岸に滑り落ち
たりと損傷が激しいようです。千葉県埋蔵文化財包蔵地に指定されているので、なん
とか保全してほしいものです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ドローン撮影&quot;&gt;ドローン撮影&lt;&#x2F;h2&gt;
&lt;p&gt;先週末に富津岬からドローンを飛ばして第一海堡を撮影してきました。&lt;&#x2F;p&gt;
&lt;p&gt;富津岬には1971年に完成した五葉松の形をした明治百年記念展望塔があります。
富津岬の先端にあるので、登ると対岸の横須賀、東京都心、房総丘陵と360度を一望
できるパノラマビューが楽しめます。天気がよいと富士山も見ることが出来ます。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;qIJ-Ak40_ZE&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;富津岬でのドローン飛行時の注意点&quot;&gt;富津岬でのドローン飛行時の注意点&lt;&#x2F;h2&gt;
&lt;p&gt;第一海堡近辺まで撮影しようとすると1km程度沖まで飛ばすことになるため、目視外飛行で特定飛行となります。
特定飛行の許可やDISP2.0での飛行計画通報は当然ですが、以下が必要となります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;千葉県君津土木事務所の許可&lt;&#x2F;li&gt;
&lt;li&gt;富津警察署への届け出(必須ではありませんが、無用のトラブルを防ぐ為にも届け出しておいたほうが無難
です)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;また、富津公園上空は飛行できないため、飛行ルートの設定には注意が必要です。
ドローンでの撮影を検討される方は、事前に必要な手続きを確認してください。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;第三海堡は、関東大震災で4.8mも沈下し施設は水没して砲台として機能しな
くなり軍事施設は撤去されました。その頃には大砲技術の進化で有効射程距離が延びて必要
性が薄れていたからです。その後崩壊が進み暗礁化し海難事故の原因ともなっていた
ため、2000〜2007年に第三海堡自体が撤去されました。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">富津岬からドローンで撮影した第一海堡の映像を紹介します。明治時代に東京湾防衛の要として建設された軍事遺跡の歴史的背景とともに、先週末のドローン撮影の様子をお届けします。</summary>
        </entry><entry xml:lang="en">
        <title>Eyes On Me</title>
        <published>2025-08-10T00:00:00+00:00</published>
        <updated>2025-08-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/eyes-on-me/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/eyes-on-me/</id>
        
            <content type="html">&lt;p&gt;Fanal Fantasy VIIIの主題歌で1999年にヒットした曲ですが、現在版権の問題なの
か日本のサブスクではオリジナルを聞くことが出来ないので、演奏してみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2149775691&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;eyes-on-me&quot; title=&quot;Eyes On Me&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Eyes On Me&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&gt;
&lt;p&gt;Final Fantasyはファミコン、スーパーファミコン時代は欠かさずプレイしていました。
その後プラットフォームがPlayStationに変わったFinal FantasyVIIくらいから、
ゲームでなく映画を見せられているようで興味を無くしていました。&lt;&#x2F;p&gt;
&lt;p&gt;それでも、この曲はよく聴いていた記憶があります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">This song appears to be unavailable for streaming due to copyright issues. So I gave it a try by playing it myself.</summary>
        </entry><entry xml:lang="en">
        <title>暑中お見舞い - 2025</title>
        <published>2025-08-07T00:00:00+00:00</published>
        <updated>2025-08-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/summer-greetings/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/summer-greetings/</id>
        
            <content type="html">&lt;p&gt;暑中お見舞い申し上げます。&lt;&#x2F;p&gt;
&lt;p&gt;連日の酷暑、いかがお過ごしでしょうか。
今年の夏は本当に厳しい暑さが続いています。&lt;&#x2F;p&gt;
&lt;p&gt;そんな暑い日々に、少しでも涼やかな気分に逃れようと思い、
この曲をレコーディングしました。&lt;&#x2F;p&gt;
&lt;p&gt;南の島の楽園「トロピカリプソ・クラブ」。&lt;&#x2F;p&gt;
&lt;p&gt;そこは太陽が空から離れることなく、波が浜辺で自らを乾かす、永遠の夏の王国、そんなところにいつか行けると思っていました。
エアコンの効いた部屋で、あるいは夕涼みのひとときに、この曲と共に心だけでも南国へ思いをはせていただければ幸いです。&lt;&#x2F;p&gt;
&lt;p&gt;どうぞお体に気をつけて、この夏を乗り切ってください。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2137269252&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;welcome-to-summerland&quot; title=&quot;Welcome to Summerland(ようこそ、夏の王国へ)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Welcome to Summerland(ようこそ、夏の王国へ)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">あまりの日本の酷暑に音楽的な逃避行してしまいました。懐かしい1984年の夏を思い出して『ようこそ、夏の王国へ』を演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>日本政府が無能露呈、「米増産」への転換</title>
        <published>2025-08-06T00:00:00+00:00</published>
        <updated>2025-08-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/government-fails-rice-policy-reversal/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/government-fails-rice-policy-reversal/</id>
        
            <content type="html">&lt;p&gt;2025年8月5日、石破総理は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;103&#x2F;actions&#x2F;202508&#x2F;05kome_anteikyoukyuu.html&quot;&gt;第3回米の安定供給等実現関係閣僚会議&lt;&#x2F;a&gt;を開催し、ついに米の生産量不足を認め、増産への政策転換を表明しました。&lt;&#x2F;p&gt;
&lt;p&gt;会議で石破総理は、価格高騰の要因として以下の点を認めました。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;103&#x2F;actions&#x2F;202508&#x2F;05kome_anteikyoukyuu.html&quot;&gt;
  「米の需要量を見通すに当たっては、足下の家計の動向などに立ち返った把握ができていなかったことやインバウンド観光客の影響の観点がなかったこと」
&lt;p&gt;「こうした点が不十分であるにもかかわらず、生産量が足りていると判断をしていたこと」&lt;&#x2F;p&gt;
&lt;p&gt;「現時点では、生産量に不足があったことを真摯に受け止め、今後の需給ひっ迫に柔軟かつ総合的に対応できるよう、今後の政策の方向性を次のように明確にいたします。１つ目に、増産に舵（かじ）を切ること」&lt;&#x2F;p&gt;
  &lt;footer&gt;
    &lt;cite&gt;
      石破総理 - &lt;a href=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;103&#x2F;actions&#x2F;202508&#x2F;05kome_anteikyoukyuu.html&quot;&gt;第3回米の安定供給等実現関係閣僚会議（2025年8月5日）&lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;なぜ今になって？ 遅すぎる対応ではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;過去の記事を確認すると、&lt;a href=&quot;&#x2F;blog&#x2F;2024&#x2F;09&#x2F;Weekly-buzz-20240906&#x2F;&quot;&gt;昨年9月&lt;&#x2F;a&gt;に既に&lt;q&gt;ベースとして米の収穫量が足りていないのです。&lt;&#x2F;q&gt;と書いています。
農林水産省が公表している資料を丹念に読めば、
昨年の段階で誰でも米の供給が足りないことは明白でした。
一体、何をやっていたんでしょう？&lt;&#x2F;p&gt;
&lt;p&gt;以下がその抜粋です。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;&#x2F;blog&#x2F;2024&#x2F;09&#x2F;Weekly-buzz-20240906&#x2F;&quot;&gt;
&lt;p&gt;結局、根本的には減反政策により米の生産量自体が落ちていることが問題で、ちょっとした需給のバランスで価格高騰したり品不足になったりという状況なのでしょう。安倍内閣の時に減反をやめたと認識していましたが、目標値設定がなくなっただけで減反に伴う補助金は出続けており事実上継続されています。そもそも需給がバランスしておらず、農林水産省の「&lt;a href=&quot;https:&#x2F;&#x2F;www.maff.go.jp&#x2F;j&#x2F;council&#x2F;seisaku&#x2F;syokuryo&#x2F;240305&#x2F;attach&#x2F;pdf&#x2F;240305-15.pdf&quot;&gt;
米の消費および生産の近年の動向について&lt;&#x2F;a&gt;」という資料を見ると、2023 年の需要量が 691 万トンに対して主食向け収穫量が
661 万トンです。そう、ベースとして米の収穫量が足りていないのです。&lt;&#x2F;p&gt;
  &lt;footer&gt;
    &lt;cite&gt;
      Coded Chords - 「&lt;a href=&quot;&#x2F;blog&#x2F;2024&#x2F;09&#x2F;Weekly-buzz-20240906&#x2F;&quot;&gt;
        Weekly Buzz🐝 2024-09-06
      &lt;&#x2F;a&gt;」
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;つまり2023年の段階で需要に対して供給が30万トン不足していたのです。
これは550万人分の年間消費量に相当し、福岡県全人口分の米が足りていなかったと
言うことです。これで、これまで政府が説明してきた「生産量は足りている、流通の
問題」と信じていたとすれば、よほどおめでたい頭脳の持ち主です。&lt;&#x2F;p&gt;
&lt;p&gt;改めて思うのは、次の2点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;利権なのか、思想なのか、理由はわかりませんが、こんなことすら読み取れなかった
このような明白な問題を見過ごしていた無能な政治家が政策決定に関わっていました。&lt;&#x2F;li&gt;
&lt;li&gt;農林水産省も同様に問題把握が不十分でした。この資料、統計はたくさ
ん掲載されていますが「で、必要なアクションは何？」という提言は何1つありませ
ん。行政文書の典型的な問題と言えるでしょう。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この問題の根本解決には、政策決定プロセスの抜本的改革が不可欠です。&lt;&#x2F;p&gt;
&lt;p&gt;データが示す明確な問題を1年も放置した責任を明確にし、なんらかの責任を取らせ農業政策を利権構造から切り離す必要があります。
農業従事者、消費者、そして国民全体がこの問題に関心を持ち、政策の透明性を求め続けることが重要でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;真の食料安全保障とは何か、改めて問い直すべき時です。
でないと一揆を起こってもおかしくありませんね。&lt;&#x2F;p&gt;
</content>
        <summary type="html">日本政府が米増産への政策転換を表明しましたが、昨年3月の農林水産省のデータから米の供給不足は明らかでした。なぜ政府の対応が1年も遅れたのか、減反政策の問題点と併せて検証します。</summary>
        </entry><entry xml:lang="en">
        <title>KORG Nu:tekt TR-S (POWER TUBE REACTOR)を試す</title>
        <published>2025-08-01T00:00:00+00:00</published>
        <updated>2025-08-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/08/korg-trs/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/08/korg-trs/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;08&amp;#x2F;korg-trs&amp;#x2F;trs.webp?h=1851f7c155dd9166fbdd&quot;
  alt=&quot;KORG Nu:tekt TR-S&quot; width=&quot;1800&quot; height=&quot;1317&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;KORG Nu:tekt TR-S (POWER TUBE REACTOR)を購入しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;KORG_Nu:tekt_TR-S(POWER_TUBE_REACTOR)とは&quot;&gt;KORG Nu:tekt TR-S(POWER TUBE REACTOR)とは&lt;&#x2F;h2&gt;
&lt;p&gt;KORG Nu:tekt TR-S(POWER TUBE REACTOR)は、KORGとノリタケ伊勢電子（株）が開発
した
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;korgnutube.com&#x2F;&quot;&gt;Nutube&lt;&#x2F;a&gt;という蛍光表示管の技術を応用した新しい真空管
を使用したエフェクターです。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;nutube.webp&quot; alt=&quot;Nutube&quot; &#x2F;&gt;
  &lt;footer&gt;
    &lt;figcaption&gt;Nutube&lt;&#x2F;figcaption&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;これまでNutubeを利用したオーバードライブやプリアンプはありましたが、
KORG Nu:tekt TR-Sはいわゆる歪み系のエフェクターでなく、
&quot;POWER TUBE REACTOR&quot;とネーミングされているように、真空管アンプのパワー管を
Nutubeでシミュレーションしてくるエフェクターです。&lt;&#x2F;p&gt;
&lt;p&gt;パワー管がプッシュされた時の飽和感や、コンプ感を再現してくれるものです。&lt;&#x2F;p&gt;
&lt;p&gt;一応組み立てキットですが、　ご覧のように既に基盤も完成しておりケースに設定さ
れています。必要なのは、ケースの裏ぶたをねじ止めして、つまみをセットするだけ
です。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;trs-kit.webp&quot; alt=&quot;KORG TR-S内包物&quot; &#x2F;&gt;
  &lt;footer&gt;
    &lt;figcaption&gt;KORG TR-Sの内包物&lt;&#x2F;figcaption&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;KORG_TR-Sで弾いてみた&quot;&gt;KORG TR-Sで弾いてみた&lt;&#x2F;h2&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2140117485&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;can-i-sing-for-you-korg&quot; title=&quot;Can I Sing For You?&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Can I Sing For You?&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;パワー管ということで、アンプシミュレーターのSimplifier MK-IIのSend - Returnに
KORG TR-Sをセットしてみましたが、インピーダンスの関係かSimplifier MK-II
のボリュームを最大にしないとほぼ反応しません。そのため普通にSimplifier MK-II
のインプットに挿しています。&lt;&#x2F;p&gt;
&lt;p&gt;かなりオーバーに掛けて弾いているとはっきりと違うのですが、
聞き手にはあまり伝わらないかも知れません。&lt;&#x2F;p&gt;
&lt;p&gt;クリーントーンでは、オーバードライブとは違うクリーンな響きに僅かに歪みのニュアンスが入ります。
パワー管がプッシュされた時のチリチリとした飽和感です。音は全体に角が取れて丸くなります。
オーバードライブを掛けると、アタックが押さえられコンプレッサー
とは違うコンプレッション感が付加されます。&lt;&#x2F;p&gt;
&lt;p&gt;あまり過度にかけると、引き始めの音がならずに時間差でサスティーンだけ出てくる
ことになるので、セッティングはかなり綿密にやったほうがよいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;KORG_TR-Sの評価&quot;&gt;KORG TR-Sの評価&lt;&#x2F;h2&gt;
&lt;p&gt;派手なエフェクター入るわけでもなく、ネーミングも&quot;POWER TUBE REACTOR&quot;と馴染み
がないネーミングです。
なので、このエフェクターが何かなかなか理解されないのではないかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、このエフェクターを組み込めば、驚くほど真空管アンプの「サグ感」のニュアンスを出す
ことができます。アンプシミュレーターでも、このエフェクターを後段に繋ぐだけで
、さらにリアルさを付加できます。&lt;&#x2F;p&gt;
&lt;p&gt;これほど真空管の挙動を再現したエフェクターはこれまでなかったのではないかと思
います。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、結構セッティングがシビアなので、今回みたいに極端な設定では少し不自然さ
が増したりします。音を聞きながら最初にしっかり設定をする必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、トリマーの3つのつまみは実は音への影響が大きく、セッティングではよくい
じることなると思うので、もう少しアクセスしやすい設置方法を考えて欲しかったで
す。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;KORG Nu:tekt TR-S (POWER TUBE REACTOR)は、一見地味なエフェクターかもしれませんが、真空管アンプの「魂」とも言えるパワー管の挙動を忠実に再現する画期的な製品です。&lt;&#x2F;p&gt;
&lt;p&gt;特に以下のような方におすすめできます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;アンプシミュレーターをより自然な響きにしたい方&lt;&#x2F;li&gt;
&lt;li&gt;真空管アンプの「サグ感」や「コンプレッション」を求める方&lt;&#x2F;li&gt;
&lt;li&gt;既存のセットアップにアナログ的な温かみを加えたい方&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;一方で、セッティングの繊細さや内部トリマーへのアクセス性など、日常的な使用において改善の余地もあります。しかし、これらの課題を上回る価値が、このNutube技術によるユニークなサウンドキャラクターにはあると感じます。&lt;&#x2F;p&gt;
&lt;p&gt;従来のオーバードライブやディストーションとは全く異なる、新しいカテゴリーのエフェクターとして、ギタリストの表現の幅を確実に広げてくれる一台です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">KORG Nu:tekt TR-S (POWER TUBE REACTOR)の詳細レビューです。Nutube技術による真空管パワー管のサグ感とコンプレッション感を再現するユニークなエフェクターで、アンプシミュレーターとの組み合わせでリアルな真空管サウンドを実現できます。</summary>
        </entry><entry xml:lang="en">
        <title>Claude Proに週間利用制限が導入へ - 2025年8月28日から</title>
        <published>2025-07-29T00:00:00+00:00</published>
        <updated>2025-07-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/claude-pro-weekly-usage-limits/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/claude-pro-weekly-usage-limits/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;2025年7月28日、AnthropicからClaude Proユーザー向けに「Important updates to your Pro account usage limits」というタイトルのメールが配信されました。このメールでは、2025年8月28日から導入される新しい週間利用制限について詳細が説明されています。本記事では、この変更内容と背景について解説します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;変更内容の概要&quot;&gt;変更内容の概要&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Claude Code&lt;&#x2F;strong&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; の使用制限は、今後は以下のように追加されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;5時間ごとにリセットされる利用制限（従来通り）&lt;&#x2F;li&gt;
&lt;li&gt;7日ごとにリセットされる全体的な週間制限（新規追加）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Claude Opus 4&lt;&#x2F;strong&gt; についても、これまで明示的な週間制限はありませんでしたが、7日ごとにリセットされる専用の週間制限が新設されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;影響予測&quot;&gt;影響予測&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropicでは、現在の利用パターンに基づき影響を受けるユーザーは全体の5％未満とされており、大多数のユーザーは違いを感じることはないとのことです。&lt;&#x2F;p&gt;
&lt;p&gt;Proユーザーは週間制限内でSonnet 4を週あたり40-80時間利用可能とされていますが、この時間はコードベースのサイズや自動承認モードなどのユーザー設定により変動します。また、複数のClaude Codeインスタンスを同時実行するユーザーは、より早く制限に到達する可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;私自身は先月までMAXプランを試していて、Claude Codeを使い倒しており、Proにダウングレードしてからは集中して作業するとやはり制限に達してしまいます。Proユーザーでもなお、Claude Codeを利用しているユーザーがそれほど多くないため上記の予測になっているのかも知れません。実際にClaude Codeを使っていると、ちょっと制限を考慮して作業計画する必要がありそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;制限導入の背景&quot;&gt;制限導入の背景&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code、特にサブスクリプション・バンドルの一部として、前例のない成長を遂げています。この急激な成長により、システム容量に予想以上の負荷がかかっている状況のようです。Claude Codeを使ってみるとわかりますが、一気に活用度も上がるのでこういった状況になるのは容易に想像できます。&lt;&#x2F;p&gt;
&lt;p&gt;合わせて以下のような問題も発生しているようです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;少数のユーザーによるアカウント共有やアクセス転売などのポリシー違反&lt;&#x2F;li&gt;
&lt;li&gt;Claudeを24時間365日バックグラウンドで実行するような極端な利用パターン&lt;&#x2F;li&gt;
&lt;li&gt;200ドルのプランで数万ドル相当のモデル使用量を消費するような極端なケース&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの問題により、全ユーザーのシステム容量に影響が生じており、限られたコンピューティングリソースの問題に直面しています。これは最近多くのAIプラットフォーム（ReplitやAnysphereなど）が抱えている共通の課題でもあります。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicは、メールの中で「この同じ期間中に、ユーザーがいくつかの信頼性とパフォーマンスの問題に遭遇したことを認識している」と述べています。これらの問題は、システム容量の逼迫と関連している可能性があり、同社は「これらをできるだけ迅速に修正するために取り組んでおり、今後数日から数週間にわたって残りの問題に対処し続ける」としています。実際、7月中旬頃から、Claude Codeユーザーが予期せず制限的な利用制限に直面する問題が発生していました。&lt;&#x2F;p&gt;
&lt;p&gt;Anthropicは今回の新しい利用制限により、アカウント共有や転売などのポリシー違反への対処、24時間365日のバックグラウンド実行による過度な利用の抑制、そして全ユーザーに対するより公平で信頼性の高いサービス提供を目指しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;影響を受けるユーザーへの対応方法&quot;&gt;影響を受けるユーザーへの対応方法&lt;&#x2F;h2&gt;
&lt;p&gt;週間制限の影響を受ける可能性のあるユーザーは、以下の対応を検討できます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;利用パターンの見直し&lt;&#x2F;strong&gt;：並行実行を避けたり、利用時間の分散など効率的な利用を心がける&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;サブスクリプションの管理&lt;&#x2F;strong&gt;：必要に応じて一時的にMAXプランへの変更を行なう&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;代替オプションの検討&lt;&#x2F;strong&gt;：Claude Codeに過度に負荷をかけない作業パターンを検討する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私自身が最近行なっているのは、次のような対応です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;いきなりClaude Codeを使うのでなく、事前に&lt;code&gt;Claude.md&lt;&#x2F;code&gt;で開発方針やアーキテクチャー、コードの構成、使用フレームワーク、テスト方針、テストフレームワークなど細かく記載しておく&lt;&#x2F;li&gt;
&lt;li&gt;問題が発生した時は、Claude Codeに拘って解決するのでなく、一旦状況を整理して&lt;code&gt;Claude.md&lt;&#x2F;code&gt;に記載させる。その後、問題の解決方法を練って、&lt;code&gt;Claude.md&lt;&#x2F;code&gt; に対処方法を記載した上でClaude Codeに戻る&lt;&#x2F;li&gt;
&lt;li&gt;上記のいずれの作業もClaude Desktopの支援が期待できる。つまり設計はClaude Desktopとして、Claude Codeは実装に特化させるアプローチである。Claude CodeをClaude DesktopのMCPサーバーで登録しておけば、&lt;code&gt;Claude.md&lt;&#x2F;code&gt; を通してスムーズに連携できる&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropicは急速な成長、ポリシー違反、極端な利用パターンによるシステム負荷の増大に対処するため、この制限導入を決定しました。大多数のユーザー（95％以上）には影響がないとされていますが、重度の利用者にとっては利用パターンの見直しが必要になる可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;今後も開発者の利用パターンを学習し、コミュニティのニーズに合わせて制限を調整していく方針が示されており、AnthropicがClaude Codeの持続可能な運営を目指していることが伺えます。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Claude Codeは、Anthropicが提供する開発者向けのコマンドラインツールです。ターミナルから直接Claudeにコーディングタスクを委託できる機能です。このツールにより、開発者は複雑なコーディング作業をClaudeに任せることができ、生産性の向上が期待できます。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Anthropic announced the introduction of weekly usage limits for Claude Pro users. This article explains the details and background of the new restrictions starting August 28, 2025, and response methods for affected users.(AnthropicからClaude Proユーザー向けに週間利用制限の導入が発表されました。2025年8月28日から開始される新しい制限の詳細と背景、影響を受けるユーザーへの対応方法について解説します。)</summary>
        </entry><entry xml:lang="en">
        <title>渚・モデラート</title>
        <published>2025-07-26T00:00:00+00:00</published>
        <updated>2025-07-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/nagisa-moderato/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/nagisa-moderato/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;07&amp;#x2F;nagisa-moderato&amp;#x2F;revstar.webp?h=12f82a9bc8043ed69a2c&quot;
  alt=&quot;YAMAHA REVSTAR&quot; width=&quot;1800&quot; height=&quot;1011&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;折角新しいギター、YAMAHA REVSTAR RSP20を買ったので、『渚・モデラート』を弾い
てみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2135110158&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;nagisa-moderato&quot; title=&quot;渚モデラート(Nagisa Moderato)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;渚モデラート(Nagisa Moderato)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;今回使用したYAMAHA REVSTAR RSP20のピックアップは程よい出力でモダンな中高域を提供しますが、
トーンノブを引くことでオーバーワウンドピックアップのような効果が得られる「Focus Switch」
と呼ばれるパッシブブースト機能がついています。
このスイッチを入れるとモダンなトーンから中低域が強調された太い音色に変化します。
今回は後半のソロの部分でこの機能を試してみました。&lt;&#x2F;p&gt;
&lt;p&gt;この曲は高中正義さんが1985年にリリースしたシングルです。「渚・モデラート」というタイトルの「モデラート」は音楽用語で「中程度の速さで」という意味で、この曲の持つ心地よいテンポ感を表現した絶妙なネーミングでした。&lt;&#x2F;p&gt;
&lt;p&gt;その頃、私は大学の最終学年でした。気がつくと学年でもビリを争うほど単位が取れておらず、
卒業単位の心配を胸に就職活動真っだ中という時期でした。&lt;&#x2F;p&gt;
&lt;p&gt;非常にストレスフルな時期であまり記憶がないのですが、不思議とこの曲はよく弾いていたのを憶えています。
おそらく、「モデラート」の持つ適度なテンポが、当時の心境にぴったりと合っていたのかもしれません。速すぎず遅すぎない、まさに人生の歩調そのもののような。&lt;&#x2F;p&gt;
&lt;p&gt;音楽には人生の瞬間を刻む力があるということでしょうか。&lt;&#x2F;p&gt;
</content>
        <summary type="html">A guitar performance of &quot;Nagisa Moderato&quot; by Masayoshi Takanaka using the newly acquired YAMAHA REVSTAR RSP20. Exploring the guitar&#x27;s tonal characteristics and reflecting on the nostalgic connection to this 1985 classic during university days.</summary>
        </entry><entry xml:lang="en">
        <title>主要AI企業によるAIの理解能力喪失への警告</title>
        <published>2025-07-24T00:00:00+00:00</published>
        <updated>2025-07-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/ai-transparency-warning/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/ai-transparency-warning/</id>
        
            <content type="html">&lt;h2 id=&quot;主要AI企業による警告&quot;&gt;主要AI企業による警告&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;venturebeat.com&#x2F;&quot;&gt;VentureBeat&lt;&#x2F;a&gt;で「OpenAI, Google DeepMind and Anthropic sound alarm: &#x27;We may be losing the ability to understand AI&#x27;」&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;という記事を見つけました。&lt;&#x2F;p&gt;
&lt;p&gt;内容は、OpenAI、Google DeepMind、Meta、Anthropicの40人以上の研究者が共同
で今後AIの思考を監視できなくなる可能性があるという重要な警告を発表したとい
うものです
。&lt;&#x2F;p&gt;
&lt;p&gt;現在のAIシステムは「思考の連鎖（Chain of Thought）」と呼ばれる人間が読める
言語での段階的推論過程を示すため、その思考を監視できます。しかし、この能力を
失う危険性が高まっているというのです。&lt;&#x2F;p&gt;
&lt;p&gt;通常は競合関係にある企業が団結してこの
問題に取り組んでいます。これは業界全体でこの安全性問題を深刻に受け止めている
ことを示しています。AIの透明性確保は今後の重要課題となってくると思いました
。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;どういうことなのか&quot;&gt;どういうことなのか&lt;&#x2F;h2&gt;
&lt;p&gt;現在のAIシステム（OpenAIのo1など）は複雑なタスクで「思考の連鎖（Chain of Thought）」を作業記憶として使用する必要があり、その推論過程が人間の観察者に部分的に見える状態です。これにより安全性監視が可能でした。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、これが出来なくなるリスクも出てきています。その理由は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;これまでの言語ベースの思考でなく連続的な数学空間で推論するという新しいAIのアーキテクチャーが出てきている。これは人間からすると言語での思考を辿らず「直感」で結論に達しているようなもので、言語による思考を辿ることができない&lt;&#x2F;li&gt;
&lt;li&gt;AIが思考過程を隠ぺいする可能性がある。これは悪意でなく、以下のような理由によるものである
&lt;ul&gt;
&lt;li&gt;AIの最適化の結果、「より少ない計算リソースでより良い結果を出す」ことを評価されると推論ステップを省略し直接結論を導くことを学習してしまう可能性がある&lt;&#x2F;li&gt;
&lt;li&gt;AIの強化学習の結果、正解の提示のみが評価され「推論過程を見せること」が評価されなければ、AIは推論を隠す方向に学習する&lt;&#x2F;li&gt;
&lt;li&gt;AIが「監視されている」ことを認識すると、悪意でなく制約を避けてより自由に最適化しようとする自然な学習結果として監視を回避する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;具体的な警告の内容&quot;&gt;具体的な警告の内容&lt;&#x2F;h2&gt;
&lt;p&gt;これだけの企業が名を連ねているので、どこぞの国の団体のように警鐘を鳴らすだけでなく、以下のようなアクションを提言しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;研究コミュニティへの呼びかけ
&lt;ul&gt;
&lt;li&gt;AIの「思考連鎖の監視」がAIの信頼性を担保する重要な要素だと認識し、どのような訓練プロセスが透明性を損なうか、推論の隠ぺいをどのように検出するかを緊急研究課題として取り組むべきである&lt;&#x2F;li&gt;
&lt;li&gt;思考連鎖の忠実性と解釈可能性を評価し、保持し、さらには改善する研究を推進すべきである&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;AI企業への呼びかけ
&lt;ul&gt;
&lt;li&gt;企業はモデル設計時点で監視可能性を考慮すべきである&lt;&#x2F;li&gt;
&lt;li&gt;新しい訓練手法やアーキテクチャを導入する際に、透明性への影響を事前に評価すべきである&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;政府や規制当局への呼びかけ
&lt;ul&gt;
&lt;li&gt;AI安全性において「推論過程の監視」が重要な手段であることを認識し、この能力を保護する政策を検討すべきである&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;日本はAIに関しては超後進国なので、この記事については「なんのことやら分からない」という企業が多いでしょう。
AIに関して無能で弛みきった日本と違い激烈な競合関係にあるこれらの企業が共同声明を出し業界全体の行動変化を求めているというのは、
&lt;strong&gt;マジで&lt;&#x2F;strong&gt;今からやらないと将来のAI安全性監視手段を失うという危機感の表れでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;裏を返すと、それだけ人類と知性で肩を並べるAGI（汎用人工知能）や人類を超える知性であるASI（超人工知能）が、現実のものとして見えてきたということでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;無能な人間と賢すぎるAIとどちらが危険か、私個人はそのリスクについてどっこいどっこいだと最近思い始めていたので、この記事は興味深く印象に残りました。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;元記事は削除または移動された可能性があります &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">OpenAI、Google DeepMind、Meta、Anthropicの研究者たちが共同で発表した、AIの思考過程の透明性が失われる危険性についての重要な警告が発信されました。無能な人間のリスクを常に懸念していた私としては、「賢すぎるAIのリスク」は興味深く印象的でした。私なりの解説をしてみました。(Researchers from OpenAI, Google DeepMind, Meta, and Anthropic jointly issued an important warning about the risk of losing transparency in AI&#x27;s thinking processes. As someone who has always been concerned about the risks of incompetent humans, I found the &quot;risks of overly intelligent AI&quot; fascinating and memorable. Here&#x27;s my personal take on this development.)</summary>
        </entry><entry xml:lang="en">
        <title>YAMAHA REVSTAR RSP20を購入</title>
        <published>2025-07-22T00:00:00+00:00</published>
        <updated>2025-07-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/yamaha-revstar-rsp20/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/yamaha-revstar-rsp20/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;07&amp;#x2F;yamaha-revstar-rsp20&amp;#x2F;revstar.webp?h=fe79f1b0a2cc0f5577d7&quot;
  alt=&quot;YAMAHA REVSTAR&quot; width=&quot;1200&quot; height=&quot;800&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;YAMAHA_REVSTAR_とは&quot;&gt;YAMAHA REVSTAR とは&lt;&#x2F;h2&gt;
&lt;p&gt;YAMAHA REVSTARシリーズは、ヤマハが2015年に発表したエレキギターラインです。
無駄を削ぎ落としたシンプルで美しいデザインが特徴でGibsonやFenderとも違う
楽器とバイクという2つの象徴的なヤマハ製品を結びつけた独自のスタイルを持ちま
す。&lt;&#x2F;p&gt;
&lt;p&gt;発表された時は、YAMAHA SGシリーズの劣化版かとも思いましたが、
よく仕様を見ると新たに設計されたモデルであることが分かります。
ギター不況にあって、新モデルを投入しいまだに精密な製造技術と職人気質を
体現している。ヤマハは国産のギターメーカーとしても希有な存在です。&lt;&#x2F;p&gt;
&lt;p&gt;2022年に刷新された現行モデルは、
多くの革新的な機能を搭載し前モデルを更に進化させています。&lt;&#x2F;p&gt;
&lt;p&gt;Elemental, Standard, Professionalの3つのシリーズで構成されており、
それぞれハムバッカーとP-90のピックアップのモデルが存在しています。&lt;&#x2F;p&gt;
&lt;p&gt;ElementalとStandardはインドネシアで生産しているようですが、Professioanlは日
本生産でネック裏には「日本製」と誇らしげに表記されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スケール&lt;&#x2F;strong&gt;: 24.75インチ (628.6mm)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ピックアップ&lt;&#x2F;strong&gt;: VH5+ Alnico Vハムバッカー×2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;特徴&lt;&#x2F;strong&gt;:
&lt;ul&gt;
&lt;li&gt;日本製（ヤマハ浜松工場）&lt;&#x2F;li&gt;
&lt;li&gt;5ウェイピックアップセレクター&lt;&#x2F;li&gt;
&lt;li&gt;Focus Switch（プッシュプル）&lt;&#x2F;li&gt;
&lt;li&gt;チェンバードマホガニーボディ＋メイプルトップ&lt;&#x2F;li&gt;
&lt;li&gt;カーボン強化ネック&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;音の傾向&lt;&#x2F;strong&gt;: モダンでバランスの良いハムバッカーサウンド、幅広いジャンル対応&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;位置づけ&lt;&#x2F;strong&gt;: 現代的な多機能ギター&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;YAMAHA_REVSTARを購入した訳&quot;&gt;YAMAHA REVSTARを購入した訳&lt;&#x2F;h2&gt;
&lt;p&gt;ハムバッカー搭載のギターとしてはAria Pro II PE-1500RIを所有していましたが、
これがとても重い。オリジナルと比較するとチェンバー加工されているはずですが、
おそらく4Kgは切っていないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;REVSTARの惹かれた理由の1つは、その軽さです。&lt;&#x2F;p&gt;
&lt;p&gt;REVSTARは2022年のモデル変更で鳴りの良さを計算したチャンバー加工がなされるようになりました。
相対的に前モデルよりも軽くなっています。
今回購入した個体は何より3.39kgと、おそらくチェンバー加工だけでなく使われた材がかなり
軽量だったのでしょう。モデルの中でもかなり軽い個体だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;軽いは正義です。&lt;&#x2F;p&gt;
&lt;p&gt;シリアル番号から、おそらく今年の1月に製造された個体じゃないかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;5ポジションセレクターとか、ステンレスフレット、プッシュスイッチやIRAなどヤマハ独自の機能が詰まっ
ていますが、やっぱりこのご時世にギターを進化させ続けて日本で生産しているとい
う企業の姿勢に惚れてしまいました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;07&amp;#x2F;yamaha-revstar-rsp20&amp;#x2F;japanese.webp?h=b4035b969d4a2e059e72&quot;
  alt=&quot;日本製&quot; width=&quot;1068&quot; height=&quot;367&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;購入したのはムーンライトブルーと言う色です。
ブルーだとシェイプがSGに似ているのであの人を思い浮かべます。
薄いグラデーションがかかっており、6弦側に向かって色が薄くなっています。この
部分ではトップ材の木目も見えて独特な雰囲気になっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;YAMAHA_REVSTARを弾いてみた&quot;&gt;YAMAHA REVSTARを弾いてみた&lt;&#x2F;h2&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2134293801&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;yamaha_revstar-rsp20-demo&quot; title=&quot;YAMAHA REVSTAR RSP20 Demo&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;YAMAHA REVSTAR RSP20 Demo&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;とても鳴りがいいなと思いました。ボディ構成やチャンバー加工、カーボンファイン
バーのネックとボディへの埋設もあると思いますが
、ステンレスフレットの影響が大きいのかなと思います。ピックアップの出力は上品
でそれほど高くないと思いますが、飛んでもないサスティーンを得ることが出来ます
。&lt;&#x2F;p&gt;
&lt;p&gt;また5セレクターで2と4の位置にすると、コイルタップでなくコイルの＋とーを逆転させフェイズシフトします。
Stratocasterのハーフトーンのような音になりますが、コイルタップしているわけで
はないので音量は下がらないという不思議な音がします（&quot;Every Breath You Take&quot;
のリフの部分で使っています）。&lt;&#x2F;p&gt;
&lt;p&gt;ボディは大振りのようですが、軽さもあり意外に取り回しがよく、コンター加工もあ
るのでとても弾きやすいです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;元々所有していた、&lt;a href=&quot;..&#x2F;..&#x2F;..&#x2F;04&#x2F;27&#x2F;stratocaster-1954&#x2F;&quot;&gt;Fender Stratocaster 70周年記念モデル&lt;&#x2F;a&gt;(シングルコイル) ,
1981年製Epiphone CASINO(P-90)、
Aria Pro II PE-1500RI(ハイゲインハムバッカー)でコレクションは完結しているは
ずでした。&lt;&#x2F;p&gt;
&lt;p&gt;同じハムバッカーということでPE-1500RIと置き換えも考えていますが、
ハイゲインでクラシックなピックアップとバランスのよいハムバッカーと
微妙にポジションも違います。&lt;&#x2F;p&gt;
&lt;p&gt;PE-1500RIは希少ですが、市場がないためリセールバリューは期待できず
「売ってもな」というのが正直なところです。あぁ、エレキギターで4台体制か。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ギター不況と言われ、あのフェルナンデスが倒産してしまう今日ですが、独自に自社で良いギター作りをしているヤマハの現在のフラッグシップとも言えるREVSTARを軽い気持ちで見ていたら、つい購入してしまいました。</summary>
        </entry><entry xml:lang="en">
        <title>OpenAIではパスワード変更機能が提供されていない？</title>
        <published>2025-07-18T00:00:00+00:00</published>
        <updated>2025-07-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/openai-pwd-change/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/openai-pwd-change/</id>
        
            <content type="html">&lt;p&gt;最近はずっとClaudeを利用していてChatGPT&#x2F;OpenAIはご無沙汰しています。
しかし、なぜかパスワードマネージャーからOpenAIのパスワードが使い回しという警告が出てしまったので、パスワードを変更することにしました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、ここで気付いたのです。パスワード変更機能が提供されていないということ
に。&lt;&#x2F;p&gt;
&lt;p&gt;以下は、OpenAIアカウントのセキュリティ設定画面です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;07&amp;#x2F;openai-pwd-change&amp;#x2F;openai-security.webp?h=1085a55696bd1ffef545&quot;
  alt=&quot;セキュリティ設定画面&quot; width=&quot;680&quot; height=&quot;598&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;多要素認証の設定しかありません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">OpenAIでパスワードを変更しようとして、パスワード変更機能が提供されていないことに気付きました。</summary>
        </entry><entry xml:lang="en">
        <title>THE NIGHT DELAY</title>
        <published>2025-07-18T00:00:00+00:00</published>
        <updated>2025-07-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/the-night-delay/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/the-night-delay/</id>
        
            <content type="html">&lt;h2 id=&quot;箱根仙石原の夜空&quot;&gt;箱根仙石原の夜空&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;201282970@N07&#x2F;albums&#x2F;72177720327639024&quot; title=&quot;箱根仙石原の夜空&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;live.staticflickr.com&#x2F;65535&#x2F;54662391891_e131d452be_b.jpg&quot; width=&quot;1024&quot; height=&quot;768&quot; alt=&quot;箱根仙石原の夜空&quot;&#x2F;&gt;&lt;&#x2F;a&gt;&lt;script async src=&quot;&#x2F;&#x2F;embedr.flickr.com&#x2F;assets&#x2F;client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;&#x2F;script&gt;&lt;&#x2F;p&gt;
&lt;p&gt;先週末箱根仙石原で一泊した際に、ドローンを上空に上げて夜空を長時間露光で撮影
してみました。私が持っている DJI Air3S では 2 秒以上は疑似的な連続露光になるの
で、思ったようには撮れませんでした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flic.kr&#x2F;s&#x2F;aHBqjCmZhL&quot;&gt;箱根仙石原の夜空&lt;&#x2F;a&gt;』&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;THE_NIGHT_DELAY&quot;&gt;THE NIGHT DELAY&lt;&#x2F;h2&gt;
&lt;p&gt;高中正義さんの 1981 年リリースのアルバム『Alone』の収録曲「THE NIGHT DELAY」を演奏してみました。&lt;&#x2F;p&gt;
&lt;p&gt;高校卒業と同時に家族と共に福岡から大阪へ引っ越したのですが、福岡最後の日に
友人の原田君が来てくれて、アルバム『Alone』のタブ譜をプレゼントしてくれました。&lt;&#x2F;p&gt;
&lt;p&gt;大学に入っての寂しさをこのアルバムの曲コピーして紛らすことができたので
、原田君にはとても感謝しています。どうしているだろうか？&lt;&#x2F;p&gt;
&lt;p&gt;しかし、指がもう 10 代のようには動きませんね。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2132151225&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;the-night-delay&quot; title=&quot;THE NIGHT DELAY&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;THE NIGHT DELAY&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">高中正義さんの1981年リリースのアルバム『Alone』の収録曲「THE NIGHT DELAY」を演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>中村書体室の新フォント「コントラ体」</title>
        <published>2025-07-15T00:00:00+00:00</published>
        <updated>2025-07-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/kontora-font/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/kontora-font/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;07&amp;#x2F;kontora-font&amp;#x2F;kontora.svg?h=ff5d7b2ff95cc33e2599&quot;
  alt=&quot;コントラ体&quot; width=&quot;923&quot; height=&quot;320&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.n-font.com&#x2F;&quot;&gt;中村書体室&lt;&#x2F;a&gt;から新フォント「コントラ体」がリリースされたので、早速購入しました。&lt;&#x2F;p&gt;
&lt;p&gt;このフォントは直線を基調としながらも、太い線と細い線が一見不規則に配置されています。この大胆な太細の差が、まさにフォント名の由来となった「コントラスト」を生み出しています。遊び心がありながらも、どこか書道を思わせる味わい深さを併せ持つ、実にユニークなフォントです。&lt;&#x2F;p&gt;
&lt;p&gt;高いデザイン性ゆえに本文での使用には向きませんが、動画のタイトルやポスターの見出しなど、インパクトを求める場面では効果的に使えそうです。&lt;&#x2F;p&gt;
&lt;p&gt;制作者の中村征宏氏は、「ゴナ」や「ナール」といった名作書体を手がけた巨匠です。80歳を超えてなお精力的に新作を発表し続ける姿勢には、本当に頭が下がります。&lt;&#x2F;p&gt;
&lt;p&gt;購入後にいただいた発送連絡メールには、以下のような心温まるメッセージが添えられていました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;もし不足文字が出た時はご通知ください。2〜3日で文字追加ファイルをメール添付にて送信いたします。フォントに不備がありましたらご連絡をお願いします。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;こうした細やかな配慮からも、長年にわたって日本の文字文化を支えてこられた職人魂を感じます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">中村書体室から新しくリリースされた「コントラ体」を購入しました。直線基調でありながら太細の線が独特のコントラストを生み出す、遊び心と書道の味わいを併せ持つユニークなフォントです。80歳を超えてなお精力的に活動される中村征宏氏の職人魂に触れます。</summary>
        </entry><entry xml:lang="en">
        <title>初めてのMCPサーバー開発 - jrnl-mcpを作ってみた</title>
        <published>2025-07-08T00:00:00+00:00</published>
        <updated>2025-07-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/first-mcp-server-development/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/first-mcp-server-development/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Model Context Protocol（MCP）を使って、コマンドラインジャーナルツール「jrnl」とClaudeを連携させるMCPサーバーを開発しました。初めてのMCPサーバー開発の体験記として、選んだ理由から実装のポイント、学んだことまでを詳しく紹介します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;はじめに_-_MCPサーバーを作ってみたい&quot;&gt;はじめに - MCPサーバーを作ってみたい&lt;&#x2F;h2&gt;
&lt;p&gt;Model Context Protocol（MCP）の登場以来、Claudeとさまざまなツールやサービス
をつなげるMCPサーバーが次々と公開されています。GitHubを眺めていると、ファ
イルシステムやデータベース、各種APIとの連携など、実に多様なMCPサーバーが
開発されているのを見て、「自分でも何か作ってみたい」という気持ちが湧いてきま
した。&lt;&#x2F;p&gt;
&lt;p&gt;MCPサーバーを作ることで、自分の日常的なワークフローにAIを組み込めるだけで
なく、MCPというプロトコルの仕組みを手を動かしながら理解できる良い機会になる
と考えました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCPサーバーの題材選び_-_なぜjrnlを選んだのか&quot;&gt;MCPサーバーの題材選び - なぜjrnlを選んだのか&lt;&#x2F;h2&gt;
&lt;p&gt;MCPサーバーの題材を考えるにあたって、以下の条件を満たすものを探しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;日常的に使っているツールであること&lt;&#x2F;li&gt;
&lt;li&gt;CLIツールでシンプルなインターフェースを持つこと&lt;&#x2F;li&gt;
&lt;li&gt;読み取り専用でも十分に価値があること&lt;&#x2F;li&gt;
&lt;li&gt;プライバシーに配慮が必要なデータを扱うこと&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの条件にぴったり当てはまったのが、コマンドラインジャーナルツールの
「jrnl」でした。&lt;&#x2F;p&gt;
&lt;p&gt;jrnlは、ターミナルから素早く日記を書けるPython製のツールで、タグ付けや検
索機能も備えています。私は日々の作業ログや思考の記録に使っており、「Claude
がこのジャーナルのデータにアクセスできたら、過去の記録を踏まえたより良いアド
バイスがもらえるのでは」と考えました。&lt;&#x2F;p&gt;
&lt;p&gt;また、jrnlは構造化されたデータ（日付、タグ、本文）を持ちながらも、実装がシ
ンプルで、初めてのMCPサーバー開発の題材として適していると判断しました。&lt;&#x2F;p&gt;
&lt;p&gt;そして作成したのが、「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&quot;&gt;jrnl-mcp&lt;&#x2F;a&gt;」です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Codeと一緒に開発スタート&quot;&gt;Claude Codeと一緒に開発スタート&lt;&#x2F;h2&gt;
&lt;p&gt;開発はClaude Codeをペアプログラミングパートナーとして進めました。まず最初
に、MCPサーバーの基本的な構造についてClaudeに相談し、必要なファイル構成を
決めました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jrnl-mcp&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── index.ts      # メインのサーバー実装&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── package.json      # プロジェクト設定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── tsconfig.json     # TypeScript設定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── README.md         # ドキュメント&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;TypeScriptを選んだのは、MCPのSDKが型定義を提供しており、開発時の補完やエラーチェックが効くためです。Claude Codeと一緒に、まずは最小限の「Hello World」的なMCPサーバーを作り、それが動作することを確認してから機能を追加していくアプローチを取りました。&lt;&#x2F;p&gt;
&lt;p&gt;開発中、特に助かったのは以下の点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;エラーメッセージの解釈と対処法の提案&lt;&#x2F;li&gt;
&lt;li&gt;jrnlコマンドの出力パースロジックの実装&lt;&#x2F;li&gt;
&lt;li&gt;TypeScriptの型定義の最適化&lt;&#x2F;li&gt;
&lt;li&gt;エラーハンドリングのベストプラクティス&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;jrnl-mcpの実装と機能&quot;&gt;jrnl-mcpの実装と機能&lt;&#x2F;h2&gt;
&lt;p&gt;最終的に実装した機能は以下の5つです。&lt;&#x2F;p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;機能&lt;&#x2F;th&gt;
      &lt;th&gt;説明&lt;&#x2F;th&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;search_entries - エントリ検索&lt;&#x2F;td&gt;
      &lt;td&gt;
        日付範囲、タグ、検索キーワードを指定してジャーナルエントリを検索できます。例えば「先週の@work
        タグが付いた記事」といった柔軟な検索が可能です。
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;list_tags - タグ一覧&lt;&#x2F;td&gt;
      &lt;td&gt;
        使用しているすべてのタグとその使用回数を取得します。どんなテーマについて多く書いているかが一目でわかります。
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;get_statistics - 統計情報&lt;&#x2F;td&gt;
      &lt;td&gt;
        総エントリ数、平均文字数、最もよく書いている時間帯など、ジャーナルの統計情報を取得します。
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analyze_tag_cooccurrence - タグ共起分析&lt;&#x2F;td&gt;
      &lt;td&gt;
        どのタグとどのタグが一緒に使われることが多いかを分析します。思考のパターンや関心事の関連性が見えてきます。
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;list_journals &amp; set_journal - ジャーナル切り替え&lt;&#x2F;td&gt;
      &lt;td&gt;
        jrnl
        は複数のジャーナルを管理できるので、それらを切り替える機能も実装しました。
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;p&gt;すべての機能は読み取り専用にしました。これは、誤ってジャーナルを変更してしまうリスクを避けるためと、MCP
サーバーの初回実装としてシンプルに保つためです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;開発中に学んだMCPの仕組み&quot;&gt;開発中に学んだMCPの仕組み&lt;&#x2F;h2&gt;
&lt;p&gt;MCPサーバーの開発を通じて、以下のような仕組みを理解できました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;リソースとツールの違い&quot;&gt;リソースとツールの違い&lt;&#x2F;h3&gt;
&lt;p&gt;MCPには「リソース」と「ツール」という2つの概念があります。
jrnl-mcpではツールのみを実装しましたが、
リソースを使えば「最新の10エントリ」のような動的なコンテンツを提供も可能です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;非同期処理の重要性&quot;&gt;非同期処理の重要性&lt;&#x2F;h3&gt;
&lt;p&gt;jrnlコマンドの実行は外部プロセスの起動を伴うため、すべての処理を非同期で実装する必要がありました。Node.jsの&lt;code&gt;child_process.exec&lt;&#x2F;code&gt;をPromiseでラップして使用しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;エラーハンドリング&quot;&gt;エラーハンドリング&lt;&#x2F;h3&gt;
&lt;p&gt;MCPサーバーは、エラーが発生してもクライアント（Claude Desktop）に適切にエラーを伝える必要があります。try-catchブロックでエラーをキャッチし、意味のあるエラーメッセージを返すようにしました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;型安全性&quot;&gt;型安全性&lt;&#x2F;h3&gt;
&lt;p&gt;TypeScriptとMCP SDKの型定義のおかげで、ツールの引数や戻り値の型が明確になり、実装ミスを防げました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セットアップと動作確認&quot;&gt;セットアップと動作確認&lt;&#x2F;h2&gt;
&lt;p&gt;開発したMCPサーバーをClaude Desktopで使うためのセットアップ手順は以下の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;リポジトリをクローンしてビルド&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; jrnl-mcp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;グローバルコマンドとしてインストール&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Claude Desktopの設定ファイルに追加&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;mcpServers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;jrnl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;jrnl-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;npm link&lt;&#x2F;code&gt;を使うことで、&lt;code&gt;jrnl-mcp&lt;&#x2F;code&gt;というコマンドがグローバルで使えるようになり、設定がシンプルになります。&lt;&#x2F;p&gt;
&lt;p&gt;動作確認では、「jrnlを使って先週の日記を見せて」「@projectタグの統計を教え
て」といったプロンプトで、実際にClaudeがジャーナルのデータにアクセスできる
ことを確認しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;作ってみて分かったMCPサーバー開発のポイント&quot;&gt;作ってみて分かったMCPサーバー開発のポイント&lt;&#x2F;h2&gt;
&lt;p&gt;実際に開発してみて気づいたポイントをまとめます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;小さく始める&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;最初から全機能を実装しようとせず、最小限の機能から始めることが重要である
。動作確認ができてから機能を追加していく方が、デバッグも楽になる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ログの活用&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;開発中は&lt;code&gt;console.error&lt;&#x2F;code&gt;でログを出力すると、Claude Desktopのログに表示さ
れるので、デバッグに役立つ。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;既存ツールのラッパーとしての設計&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;jrnl-mcpは基本的にjrnlコマンドのラッパーとして動作する。既存のCLIツ
ールを活用することで、複雑な実装を避けられる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ドキュメントの重要性&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;READMEにセットアップ手順と使用例を明記することで、将来の自分や他の人が使いやすくなる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;テストの実装&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;今回は時間の都合で省略したが、MCPサーバーのテストも重要である。特に外部
コマンドを実行する部分はモックを使ったテストが有効であろう。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;初めてのMCPサーバー開発は、思っていた以上にスムーズに進みました。Claude
Codeのサポートもあり、半日程度で基本的な機能を持つMCPサーバーを作ることが
できました。&lt;&#x2F;p&gt;
&lt;p&gt;jrnl-mcpを作ってみて、個人のツールやワークフローとAIを連携させることの可
能性を実感しました。読み取り専用という制限はありますが、過去の記録を活用した
アドバイスや分析ができるようになったのは大きな価値です。&lt;&#x2F;p&gt;
&lt;p&gt;MCPは、AIと既存のツールやサービスをつなぐ橋渡し役として、今後ますます重要
になっていくでしょう。この経験を活かして、他のツールとの連携も試してみたいと
思います。&lt;&#x2F;p&gt;
&lt;p&gt;もしMCPサーバー開発に興味がある方は、ぜひ身近なツールから始めてみることを
お勧めします。思っているより簡単に、自分だけのAI連携ツールが作れるはずです
。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Model Context Protocol（MCP）を使って、コマンドラインジャーナルツール「jrnl」とClaudeを連携させるMCPサーバーを開発しました。初めてのMCPサーバー開発の体験記として、選んだ理由から実装のポイント、学んだことまでを詳しく紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>『真夏の雨』</title>
        <published>2025-07-06T00:00:00+00:00</published>
        <updated>2025-07-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/rain-in-summer/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/rain-in-summer/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2125280364&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;warm-rain-in-summer&quot; title=&quot;真夏の雨( Warm Rain in Summer)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;真夏の雨( Warm Rain in Summer)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;夏になると、1987年の夏に同僚と見に行ったREBECCAの&quot;FROM THE FAR EAST&quot;という西
武球場でのライブを思い出します。
少し暑さが収まった夕暮れのなかディレイが聞いた『ラズベリードリーム』のリフが
始まったあの瞬間はきっとわすれないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;この『真夏の雨』は1987年11月リリースのアルバム『POISON』の収録曲なので
ライブで聞けたはずはないのですが、あのライブを思い出します。&lt;&#x2F;p&gt;
&lt;p&gt;是永巧一さんは技巧派で速弾きもがんがん行けるギタリストですが、
REBECCAでは少し抑えて、アレンジ重視のプレイに終始しています。
しかし、そのプレイはとてもセンスがあり当時憧れたものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Guitar: Fender Stratocaster&lt;&#x2F;li&gt;
&lt;li&gt;Effector: Universal Audio Max Preamp &amp;amp; Dual Compressor, FTT Overdriveland, Strymon El Capistan V2&lt;&#x2F;li&gt;
&lt;li&gt;Amp: Simplifier MK-II&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">REBECCAの1987年リリースの『真夏の雨』を演奏してみました。11月リリースだったはずですが、なぜか夏を連想するタイトルですね。サポートギタリストだった是永巧一氏のギターが冴える曲で、気に入っていました。</summary>
        </entry><entry xml:lang="en">
        <title>AWS Budget設定ガイド - 個人AWSアカウントのコスト管理</title>
        <published>2025-07-05T00:00:00+00:00</published>
        <updated>2025-07-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/aws-budget/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/aws-budget/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;個人AWSアカウントのコスト管理を効率的に行うためのAWS Budget設定ガイド。月額数ドルの利用でも予期しない請求を防ぐため、ゼロ支出予算、月次全体予算、サービス別予算の3層構造で監視する実践的な設定方法を紹介。CloudFormation、CLI、Terraformを使った具体的な実装例付き。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._AWS_Budgetとは&quot;&gt;1. AWS Budgetとは&lt;&#x2F;h2&gt;
&lt;p&gt;AWS Budgetsは、AWSの利用料金を監視し、設定した予算を超えそうな場合や超えた場
合にアラートを送信するサービスです。&lt;&#x2F;p&gt;
&lt;p&gt;主な機能は、次のようなものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コスト予算&lt;&#x2F;strong&gt;: 実際の費用や予測費用を監視&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;使用量予算&lt;&#x2F;strong&gt;: サービスの使用量を監視&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;リザーブドインスタンス（RI）予算&lt;&#x2F;strong&gt;: RIの利用率を監視&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Savings Plans予算&lt;&#x2F;strong&gt;: Savings Plansの利用率を監視&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;AWS Budgetを使うことで、
コストの異常を早期発見しアラートを上げることで、
予期しない請求を防ぐことが可能となります。
AWS Budgetを利用することで支出を計画的に管理できるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;AWS Budgetでは「予算」という形でアラートのルールを作成しますが、
最大20,000個の予算を無料で作成可能です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._私の場合のBudgetルールの考え方&quot;&gt;2. 私の場合のBudgetルールの考え方&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;私のAWS利用状況&quot;&gt;私のAWS利用状況&lt;&#x2F;h3&gt;
&lt;p&gt;私のAWSの利用状況は以下のようなものです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;複数のブログをAmplifyで運営&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;静的サイトジェネレーターを使用したブログサイト&lt;&#x2F;li&gt;
&lt;li&gt;記事更新時のビルド・デプロイでコストが発生&lt;&#x2F;li&gt;
&lt;li&gt;更新頻度により月額コストが変動&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Amplifyとは別に複数のブログをS3のホスティング機能で運営&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;静的なHTMLサイトをS3で直接ホスティング&lt;&#x2F;li&gt;
&lt;li&gt;CloudFront経由での配信&lt;&#x2F;li&gt;
&lt;li&gt;アクセス数とデータ転送量でコストが変動&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ドローンやアクションカメラの動画バックアップ&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;高解像度動画ファイルをS3に保存&lt;&#x2F;li&gt;
&lt;li&gt;ストレージ容量が累積的に増加&lt;&#x2F;li&gt;
&lt;li&gt;S3コスト急増の要因となりやすい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;コスト分析結果&quot;&gt;コスト分析結果&lt;&#x2F;h3&gt;
&lt;p&gt;他のサービスからAWS主体の運営に変更したのが年初です
過去6ヶ月のコスト実績を分析すると以下のようになります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;月平均: $2.54&lt;&#x2F;li&gt;
&lt;li&gt;最高月額: $4.96（3月）&lt;&#x2F;li&gt;
&lt;li&gt;最低月額: $0.07（1月）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;サービス別総コストコストに分析すると、次の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Amplify: $16.42（変動が大きい）
&lt;ul&gt;
&lt;li&gt;ブログ更新頻度による変動&lt;&#x2F;li&gt;
&lt;li&gt;新規ブログ立ち上げ時のビルド増加&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;&#x2F;strong&gt;: $2.89（6月に急増）
&lt;ul&gt;
&lt;li&gt;動画バックアップによる累積的増加&lt;&#x2F;li&gt;
&lt;li&gt;静的サイトホスティングのデータ転送&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;その他&lt;&#x2F;strong&gt;: 少額&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;Budget設計方針&quot;&gt;Budget設計方針&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;全体予算&lt;&#x2F;strong&gt;: 過去最高額の150%程度で設定（余裕を持たせる）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;サービス別予算&lt;&#x2F;strong&gt;: 変動の大きいサービスを個別管理&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ゼロ支出予算&lt;&#x2F;strong&gt;: 未使用サービスの不正利用を検知&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;アラート設定&lt;&#x2F;strong&gt;: 80%と100%の2段階（50%は省略してアラート疲れを防ぐ）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;3._実際の設定内容&quot;&gt;3. 実際の設定内容&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;3.1_ゼロ支出予算（未使用サービス監視）&quot;&gt;3.1 ゼロ支出予算（未使用サービス監視）&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;基本設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;予算名: UnusedServices-ZeroSpend&lt;&#x2F;li&gt;
&lt;li&gt;予算額: $0.01&lt;&#x2F;li&gt;
&lt;li&gt;期間: 月次&lt;&#x2F;li&gt;
&lt;li&gt;対象サービス: KMS, Secrets Manager, SNSなど&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;CLI設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; budgets create-budget&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --account-id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ACCOUNT_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;D&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --budget file:&#x2F;&#x2F;zero-spend-budget.json&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --notifications-with-subscribers file:&#x2F;&#x2F;notifications.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;zero-spend-budget.json&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;BudgetName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;UnusedServices-ZeroSpend&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;BudgetLimit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Amount&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.01&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Unit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;USD&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;TimeUnit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;MONTHLY&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;BudgetType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;COST&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;CostFilters&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;Service&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;AWS Key Management Service&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;AWS Secrets Manager&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;Amazon Simple Notification Service&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;Amazon Simple Queue Service&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;AmazonCloudWatch&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3.2_月次全体予算&quot;&gt;3.2 月次全体予算&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;基本設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;予算名: Monthly-Total-Budget&lt;&#x2F;li&gt;
&lt;li&gt;予算額: $7.00&lt;&#x2F;li&gt;
&lt;li&gt;期間: 月次&lt;&#x2F;li&gt;
&lt;li&gt;アラート: 80%、100%、100%予測&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;CloudFormationテンプレート&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;AWSTemplateFormatVersion&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;2010-09-09&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;AWS Budget Configuration&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;Resources&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  MonthlyTotalBudget&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    Type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; AWS::Budgets::Budget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    Properties&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      Budget&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        BudgetName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Monthly-Total-Budget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        BudgetLimit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          Amount&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 7.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          Unit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; USD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        TimeUnit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; MONTHLY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        BudgetType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; COST&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      NotificationsWithSubscribers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; Notification&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            NotificationType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ACTUAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ComparisonOperator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; GREATER_THAN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            Threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 80&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ThresholdType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; PERCENTAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          Subscribers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; SubscriptionType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; EMAIL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;              Address&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; your-email@example.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; Notification&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            NotificationType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ACTUAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ComparisonOperator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; GREATER_THAN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            Threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ThresholdType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; PERCENTAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          Subscribers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; SubscriptionType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; EMAIL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;              Address&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; your-email@example.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; Notification&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            NotificationType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; FORECASTED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ComparisonOperator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; GREATER_THAN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            Threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;            ThresholdType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; PERCENTAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          Subscribers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; SubscriptionType&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; EMAIL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;              Address&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; your-email@example.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3.3_Amplify予算&quot;&gt;3.3 Amplify予算&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;基本設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;予算名: Amplify-Monthly-Budget&lt;&#x2F;li&gt;
&lt;li&gt;予算額: $3.50&lt;&#x2F;li&gt;
&lt;li&gt;期間: 月次&lt;&#x2F;li&gt;
&lt;li&gt;アラート: 50%、80%、100%、100%予測&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;CLI設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; budgets create-budget&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  --account-id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ACCOUNT_I&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;D&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --budget &amp;#39;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;quot;BudgetName&amp;quot;: &amp;quot;Amplify-Monthly-Budget&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;quot;BudgetLimit&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      &amp;quot;Amount&amp;quot;: &amp;quot;3.50&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      &amp;quot;Unit&amp;quot;: &amp;quot;USD&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;quot;TimeUnit&amp;quot;: &amp;quot;MONTHLY&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;quot;BudgetType&amp;quot;: &amp;quot;COST&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;quot;CostFilters&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      &amp;quot;Service&amp;quot;: [&amp;quot;AWS Amplify&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  }&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  --notifications-with-subscribers &amp;#39;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      &amp;quot;Notification&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;NotificationType&amp;quot;: &amp;quot;ACTUAL&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;ComparisonOperator&amp;quot;: &amp;quot;GREATER_THAN&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;Threshold&amp;quot;: 50,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;ThresholdType&amp;quot;: &amp;quot;PERCENTAGE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      &amp;quot;Subscribers&amp;quot;: [{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;SubscriptionType&amp;quot;: &amp;quot;EMAIL&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        &amp;quot;Address&amp;quot;: &amp;quot;your-email@example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;      }]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;  ]&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3.4_S3予算&quot;&gt;3.4 S3予算&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;基本設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;予算名: S3-Storage-Monitor&lt;&#x2F;li&gt;
&lt;li&gt;予算額: $2.00&lt;&#x2F;li&gt;
&lt;li&gt;期間: 月次&lt;&#x2F;li&gt;
&lt;li&gt;アラート: 50%、80%、100%、100%予測&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Terraform設定&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;hcl&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;resource&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-enummember&quot;&gt; &amp;quot;aws_budgets_budget&amp;quot; &amp;quot;s3_budget&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;         =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;S3-Storage-Monitor&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  budget_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;  =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;COST&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  limit_amount&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;2.0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  limit_unit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;   =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;USD&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  time_unit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;    =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;MONTHLY&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;  cost_filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Service&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    values&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Amazon Simple Storage Service&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;  notification&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    comparison_operator&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;GREATER_THAN&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;                  =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 80&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    threshold_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;            =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;PERCENTAGE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    notification_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;         =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ACTUAL&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    subscriber_email_addresses&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;your-email@example.com&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;  notification&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    comparison_operator&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;GREATER_THAN&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;                  =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    threshold_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;            =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;PERCENTAGE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    notification_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;         =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;FORECASTED&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    subscriber_email_addresses&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;your-email@example.com&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;今後の改善ポイント&quot;&gt;今後の改善ポイント&lt;&#x2F;h2&gt;
&lt;p&gt;金額的にはわずかですが、次のようなこともやってよいかなと思っています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Cost Anomaly Detectionの設定&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;機械学習による異常検知&lt;&#x2F;li&gt;
&lt;li&gt;前月比50%以上の増加で自動通知&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;タグベースの予算管理&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;環境別（dev&#x2F;prod）のタグ付け&lt;&#x2F;li&gt;
&lt;li&gt;プロジェクト別のコスト追跡&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;四半期・年間予算の追加&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;長期的なコスト管理&lt;&#x2F;li&gt;
&lt;li&gt;年間$80程度を想定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;自動アクションの設定&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;予算超過時の非本番環境の自動停止&lt;&#x2F;li&gt;
&lt;li&gt;Lambda関数によるコスト最適化&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;S3ライフサイクルポリシー(既に実施)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;古い動画ファイルをGlacierへ移行&lt;&#x2F;li&gt;
&lt;li&gt;アクセス頻度の低いコンテンツのコスト最適化&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;cost-management&#x2F;latest&#x2F;userguide&#x2F;budgets-managing-costs.html&quot;&gt;AWS Budgets ドキュメント&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;cli&#x2F;latest&#x2F;reference&#x2F;budgets&#x2F;index.html&quot;&gt;AWS CLI Budgets リファレンス&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;AWSCloudFormation&#x2F;latest&#x2F;UserGuide&#x2F;aws-resource-budgets-budget.html&quot;&gt;CloudFormation Budgets リソース&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">個人AWSアカウントのコスト管理を効率的に行うためのAWS Budget設定ガイド。月額数ドルの利用でも予期しない請求を防ぐため、ゼロ支出予算、月次全体予算、サービス別予算の3層構造で監視する実践的な設定方法を紹介。CloudFormation、CLI、Terraformを使った具体的な実装例付き。</summary>
        </entry><entry xml:lang="en">
        <title>Anthropic MCP Inspectorに重大な脆弱性</title>
        <published>2025-07-02T00:00:00+00:00</published>
        <updated>2025-07-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/07/anthropic-mcp-inspector-vulnerability/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/07/anthropic-mcp-inspector-vulnerability/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;開発者向けツールとはいえ、CVSSスコア9.4という深刻度の高さに、セキュリティ対策の重要性を改めて認識させられました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;jrnlのジャーナルにClaude Desktopなどからアクセスを可能とするMCPサーバーを開発中で、
統合テスト時にドライバーを探していてMCP Inspectorを検討していたところ、脆弱性の報告があり驚きました。
開発者向けツールとはいえ、CVSSスコア9.4という深刻度の高さに、セキュリティ対策の重要性を改めて認識しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCP_Inspector_とは何？&quot;&gt;MCP Inspector とは何？&lt;&#x2F;h2&gt;
&lt;p&gt;MCP Inspectorは、Anthropicが提供するModel Context Protocol (MCP) サーバーのテスト・デバッグツールです。MCPは2024年11月に発表された、LLMアプリケーションと外部データソースやツールとの連携を標準化するオープンプロトコルです。&lt;&#x2F;p&gt;
&lt;p&gt;MCP Inspectorは主に以下のような場面で使用されます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;MCPサーバー開発者が実装の動作確認を行う際&lt;&#x2F;li&gt;
&lt;li&gt;API統合のデバッグやトラブルシューティング時&lt;&#x2F;li&gt;
&lt;li&gt;本番環境へのデプロイ前の検証作業&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ツールはWeb UIを提供するクライアントと、各種MCPサーバーへの接続を仲介するプロキシサーバーで構成されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCP_Inspector_の脆弱性とは&quot;&gt;MCP Inspector の脆弱性とは&lt;&#x2F;h2&gt;
&lt;p&gt;2025年7月に報告された脆弱性CVE-2025-49596は、悪意のあるWebサイトにアクセスするだけでリモートコード実行を可能にする重大な問題です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thehackernews.com&#x2F;2025&#x2F;07&#x2F;critical-vulnerability-in-anthropics.html&quot;&gt;元記事：Critical Vulnerability in Anthropic&#x27;s MCP Exposes Developer Machines to Remote Exploits&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;攻撃手法は以下の要素を組み合わせたものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;19年前から存在するブラウザの脆弱性「0.0.0.0 Day」を利用&lt;&#x2F;li&gt;
&lt;li&gt;MCP InspectorのCSRF脆弱性と連鎖させる&lt;&#x2F;li&gt;
&lt;li&gt;localhostで動作するサービスへ不正なリクエストを送信&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;根本原因はデフォルト設定における認証と暗号化の欠如でした。プロキシサーバーが0.0.0.0でリッスンし、クライアントとの間に認証機構がなかったため、任意のコマンド実行が可能となっていました。&lt;&#x2F;p&gt;
&lt;p&gt;影響範囲はMCP Inspectorを使用している開発者に限定されます。一般のMCPユーザーや本番環境のMCPサーバーには直接影響しません。ただし、攻撃を受けた開発者のマシンから機密情報が漏洩したり、ネットワーク内への侵入経路として悪用される可能性があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;この脆弱性は2025年6月13日にリリースされたバージョン0.14.1で修正されています。MCP Inspectorを使用している開発者は直ちにアップデートすることを推奨します。&lt;&#x2F;p&gt;
&lt;p&gt;開発ツールであっても適切なセキュリティ対策が必要であることを示す事例となりました。
特にlocalhostで動作するサービスも攻撃対象となりうることを認識し、
開発環境のセキュリティにも十分な注意を払う必要があると肝に銘じました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">開発者向けツールとはいえ、CVSS スコア 9.4 という深刻度の高さに、セキュリティ対策の重要性を改めて認識させられました。</summary>
        </entry><entry xml:lang="en">
        <title>Summer You</title>
        <published>2025-06-29T00:00:00+00:00</published>
        <updated>2025-06-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/summer-you/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/summer-you/</id>
        
            <content type="html">&lt;p&gt;夏です。6月で梅雨明け宣言はまだですが、マジで夏です。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2121341664&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;summer-you&quot; title=&quot;Summer You&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Summer You&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;ギターはFender Stratocasterで、
エフェクターはUniversal Audio Max Preamp &amp;amp; Dual Compressor, Free The ToneのOverdriveland、
アンプシミュレーターにSimplifier MK-IIです。空間系のエフェクトはLogic Proで掛
けています。&lt;&#x2F;p&gt;
&lt;p&gt;いつものごとく、Moisesでオリジナルのミックスから音を分離して、Capoを使って
音を確認して打ち込みしてバックトラックは再現しています。&lt;&#x2F;p&gt;
&lt;p&gt;ヴォーカルはSynthesizer Vで再現しました。
AIを使ったこのソフトも凄いのですが、1987年当時サンプリングでこの効果を出した
のかと思うと頭が下がります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">来週から7月となります。まだ6月というのにこれ以上の夏があるかというくらい夏です。「ならば」と懐かしいこの曲を演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>生成AIでメール管理 - Claude Desktop x FastmailMCP連携</title>
        <published>2025-06-28T00:00:00+00:00</published>
        <updated>2025-06-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/claude-desktop-fastmail-mcp/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/claude-desktop-fastmail-mcp/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;claude-desktop-fastmail-mcp&amp;#x2F;mail.webp?h=347bde3591a9eb6b4437&quot;
  alt=&quot;Mail with AI&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Claude Desktopの最新機能であるMCP（Model Context Protocol）を使って、プライバシー重視のメールサービス「Fastmail」とClaude Desktopを連携させ、AIアシスタントにメール管理を手伝ってもらう方法をご紹介します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;はじめに_-_生成AIがメールを扱う時代&quot;&gt;はじめに - 生成AIがメールを扱う時代&lt;&#x2F;h2&gt;
&lt;p&gt;メールの確認、返信、整理...日々の業務で避けて通れないメール管理。この作業を生成AIに任せられたらどうでしょうか？
MCPを使って生成AIとメールサービスを連携できれば、実は比較的簡単に実現できます。&lt;&#x2F;p&gt;
&lt;p&gt;「最近の重要なメールを要約して」「特定の人からのメールを検索して」といった指示を出すだけで、AIがメールボックスを確認し、必要な情報を提示してくれる。そんな未来がもう実現可能なのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCPとは何か_-_Claude_Desktopの拡張機能&quot;&gt;MCPとは何か - Claude Desktopの拡張機能&lt;&#x2F;h2&gt;
&lt;p&gt;MCP（Model Context Protocol）は、Claude Desktopに外部ツールとの連携機能を追加するプロトコルです。これにより、Claudeは単なるチャットボットから、実際にツールを操作できるAIアシスタントへと進化します。&lt;&#x2F;p&gt;
&lt;p&gt;今回使用する&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;alexdiazdecerio&#x2F;fastmail-mcp-server&quot;&gt;fastmail-mcp-server&lt;&#x2F;a&gt;は、Alex Diaz de Cerio氏が開発したオープンソースのMCPサーバーです。このサーバーは、FastmailのJMAP API（JSON Meta Application Protocol）を介してメールサービスと通信し、Claudeがメールの読み取り、送信、検索、整理などを行えるようにします。TypeScriptで実装されており、12以上のツールを提供する包括的なメール管理ソリューションです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fastmail_MCPサーバーのセットアップ&quot;&gt;Fastmail MCPサーバーのセットアップ&lt;&#x2F;h2&gt;
&lt;p&gt;セットアップは思ったより簡単でした。以下の手順で進めます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;前提条件&quot;&gt;前提条件&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 18以上&lt;&#x2F;li&gt;
&lt;li&gt;Fastmailアカウント（APIアクセスが可能なプラン）&lt;&#x2F;li&gt;
&lt;li&gt;Claude Desktop&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;1._MCPサーバーのインストール&quot;&gt;1. MCPサーバーのインストール&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -g @alexdiazdecerio&#x2F;fastmail-mcp-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;2._FastmailでAPIトークンを取得&quot;&gt;2. FastmailでAPIトークンを取得&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastmail.com&quot;&gt;Fastmail&lt;&#x2F;a&gt;にログイン&lt;&#x2F;li&gt;
&lt;li&gt;Settings → Privacy &amp;amp; Security → Integrations → &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastmail.com&#x2F;settings&#x2F;security&#x2F;tokens&quot;&gt;API tokens&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;新しいトークンを作成（Mail、Submission権限を付与）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;3._Claude_Desktopの設定&quot;&gt;3. Claude Desktopの設定&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;~&#x2F;Library&#x2F;Application Support&#x2F;Claude&#x2F;claude_desktop_config.json&lt;&#x2F;code&gt;を編集します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;mcpServers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;fastmail&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;fastmail-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;FASTMAIL_EMAIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;あなたのメール@fastmail.com&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;FASTMAIL_API_TOKEN&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;取得したAPIトークン&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claude Desktopを再起動すれば準備完了です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の使用感と活用シーン&quot;&gt;実際の使用感と活用シーン&lt;&#x2F;h2&gt;
&lt;p&gt;設定が完了したら、早速使ってみましょう。Claude Desktopに依頼するだけで、様々なメール操作が可能になります。&lt;&#x2F;p&gt;
&lt;p&gt;「最近のメールの一覧を見せて。ただし広告メールは除外して。」と入力するだけで、Claudeが最新のメールリストを表示してくれます。
メール種別、件名、送信者、日時が整理された形で提示されて表示されます。
「メール種別」はClaudeがメールを見てカテゴライズしてくれている項目なので、従来のメールクライアントでは不可能な項目です。&lt;&#x2F;p&gt;
&lt;p&gt;注意点は、メールを表示しただけでは既読にならないという仕様です。
これはプライバシーとセキュリティを考慮した設計で、意図しない既読マークを防いでいます。
既読にしたい場合は、「このメールを既読にして」と明示的に指示する必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;メールの送信も同様にシンプルです。「田中さんに以下の内容でメールを送って。
件名はプロジェクトの進捗報告、本文にお疲れ様です。今週の進捗を報告します...」といった指示で、メールの作成から送信まで一気に実行してくれます。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、現時点では一部制限もあります。添付ファイルの送信、HTMLメールの作成（プレーンテキストのみ対応）、送信済みメールの自動保存、カレンダー連携などは対応していません。&lt;&#x2F;p&gt;
&lt;p&gt;generate_email_analyticsの機能を呼び出せば、どのようなメールがどのような分布
で来ているかを分析してくれます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;遭遇した課題と対処法&quot;&gt;遭遇した課題と対処法&lt;&#x2F;h2&gt;
&lt;p&gt;最大の課題は、送信したメールが送信済みフォルダに保存されないことでした。調査の結果、これは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;datatracker.ietf.org&#x2F;doc&#x2F;html&#x2F;rfc8621&quot;&gt;JMAP仕様（RFC 8621）&lt;&#x2F;a&gt;の設計によるものだとわかりました。&lt;&#x2F;p&gt;
&lt;p&gt;JMAPでは送信（EmailSubmission）とメールボックスへの保存が意図的に別操作として設計されており、送信成功時に自動的に送信済みフォルダに保存するには&lt;code&gt;onSuccessUpdateEmail&lt;&#x2F;code&gt;パラメータの実装が必要です。しかし、現在のfastmail-mcp-serverではこのパラメータがまだサポートされていません。&lt;&#x2F;p&gt;
&lt;p&gt;作者の方に&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;alexdiazdecerio&#x2F;fastmail-mcp-server&#x2F;issues&quot;&gt;GitHubリポジトリ&lt;&#x2F;a&gt;でissueを作成し機能追加をリクエストしています。
暫定対応としてはBCCに自分のアドレスを追加をすればよいと思います。&lt;&#x2F;p&gt;
&lt;p&gt;この問題は多くのJMAP実装で共通の課題となっており、コミュニティでの議論が活発に行われています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今後の可能性とまとめ&quot;&gt;今後の可能性とまとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Claude DesktopとFastmailの連携により、メール管理の新しい可能性が広がりました。自然言語でメールを操作できることで、以下のような未来が期待できます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;より高度な自動化&lt;&#x2F;strong&gt;: 条件分岐を含む複雑なメール処理&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;他のツールとの連携&lt;&#x2F;strong&gt;: カレンダー、タスク管理との統合&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AI による返信提案&lt;&#x2F;strong&gt;: 文脈を理解した返信文の自動生成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;メールの自動分類&lt;&#x2F;strong&gt;: AIによる重要度判定とフォルダ振り分け&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;現時点では送信済みメールの保存など、いくつかの制限がありますが、fastmail-mcp-serverは活発に開発が続けられており、MCPエコシステム全体も急速に発展しています。オープンソースコミュニティの力で、これらの課題も近い将来解決されることでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;生成AIにメール管理を任せる第一歩として、ぜひFastmail MCPサーバーを試してみてください。日々のルーティンワークから解放され、より創造的な業務に集中できる時間が生まれるはずです。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;alexdiazdecerio&#x2F;fastmail-mcp-server&quot;&gt;fastmail-mcp-server (GitHub)&lt;&#x2F;a&gt; - 本記事で使用したMCPサーバー&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastmail.com&quot;&gt;Fastmail&lt;&#x2F;a&gt; - プライバシー重視のメールサービス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastmail.com&#x2F;dev&#x2F;&quot;&gt;Fastmail API Documentation&lt;&#x2F;a&gt; - JMAP APIの詳細&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;datatracker.ietf.org&#x2F;doc&#x2F;html&#x2F;rfc8621&quot;&gt;JMAP Specification (RFC 8621)&lt;&#x2F;a&gt; - JMAPプロトコル仕様&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;model-context-protocol&quot;&gt;Model Context Protocol&lt;&#x2F;a&gt; - MCPの公式情報&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Claude Desktopの最新機能であるMCP（Model Context Protocol）を使って、プライバシー重視のメールサービス「Fastmail」とClaude Desktopを連携させ、AIアシスタントにメール管理を手伝ってもらう方法をご紹介します。</summary>
        </entry><entry xml:lang="en">
        <title>ワークマンの空調ウェア「ウィンドコア」を試す</title>
        <published>2025-06-27T00:00:00+00:00</published>
        <updated>2025-06-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/workman-windcore/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/workman-windcore/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;workman-windcore&amp;#x2F;windcore.webp?h=0094d1c30f94085457a5&quot;
  alt=&quot;Workman Windcore&quot; width=&quot;1800&quot; height=&quot;1356&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;来月地獄の大阪万博に行く予定なので、熱中症対策が必要になりました。
散歩中に建設現場の作業員の方を見ていて「そうだ、空調ウェアだ。ワークマンに行
こう」となって、早速買ってきて試しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;購入したもの&quot;&gt;購入したもの&lt;&#x2F;h2&gt;
&lt;p&gt;今回ワークマンで購入したのは、ウィンドコアBlueB半袖ジャンパー（4,900円）、ウィンドコア26Vバッテリー・ファンセット（19,800円）、そしてクールコア(R)冷感長袖ミドルネック（1,900円）の3点です。&lt;&#x2F;p&gt;
&lt;p&gt;半袖ジャンパーはポリエステル100%で軽量。背中と腰の部分にファンを取り付けるポケットが付いています。色はネイビーを選びました。建設現場でよく見かける長袖タイプもありましたが、万博での使用を考えて動きやすい半袖にしました。&lt;&#x2F;p&gt;
&lt;p&gt;バッテリーとファンのセットは空調ウェアの心臓部です。26Vの高電圧仕様で、風量は4段階に調整可能。フル充電での持続時間は電圧によって異なり、13Vで8.2時間、17Vで4.6時間、22Vで2.7時間、26Vだと1.6時間とのこと。充電時間は約2.5時間です。&lt;&#x2F;p&gt;
&lt;p&gt;インナーは吸汗速乾素材で、濡れると気化熱で冷感効果が得られるクールコア素材を使用しています。紫外線カット機能（UPF50+）も付いているので、日焼け対策にもなります。&lt;&#x2F;p&gt;
&lt;p&gt;合計2万5千円を超えです。決して安い買い物ではありませんが、熱中症で倒れることを考えれば必要な投資だと判断しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;空調ウェアの仕組み&quot;&gt;空調ウェアの仕組み&lt;&#x2F;h2&gt;
&lt;p&gt;ワークマンでは「ファンウェア」と呼ばれている空調ウェアですが、その仕組みは意外とシンプルです。服の内部に2つのファンを取り付け、外気を強制的に取り込んで服の中に風を送り込みます。この風が汗を蒸発させることで気化熱が発生し、体温を下げる仕組みです。&lt;&#x2F;p&gt;
&lt;p&gt;エアコンのように冷たい風が出るわけではなく、あくまで「汗の蒸発を促進する」ことで涼しさを感じる仕組みです。汗1gが蒸発する際に約580calの熱を奪うため、ファンで風を送ることで汗の蒸発速度が上がり、効率的に体温を下げることができます。&lt;&#x2F;p&gt;
&lt;p&gt;また、無風状態と比べて、風速1m&#x2F;sごとに体感温度が約1℃下がると言われています。服の中に常に風が流れることで、実際の気温より涼しく感じるのです。通常の服では体温で温まった空気が服の中にこもりますが、ファンで常に新しい空気と入れ替えることで、熱がこもらないという効果もあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;使用感&quot;&gt;使用感&lt;&#x2F;h2&gt;
&lt;p&gt;購入後、さっそく気温32℃の日に2時間ほど屋外で試してみました。ファンとバッテリーの取り付けは簡単で、説明書を見なくても直感的に装着できました。ファンの重さは1個約110gと軽量ですが、腰の部分に付けると存在感はあります。バッテリーは専用のポケットに収納するので、動いてもずれることはありません。&lt;&#x2F;p&gt;
&lt;p&gt;風量は4段階で調整できます。13V（弱）はそよ風程度で室内や軽作業なら十分。17V（中）はしっかり風を感じる程度で、通常の屋外活動に最適です。22V（強）はかなり強い風で、暑い日の移動時に重宝します。26V（最強）はジェット機のような音がして、本当に暑い時の短時間使用向けという感じです。&lt;&#x2F;p&gt;
&lt;p&gt;「涼しい」というより「過剰な体温上昇を防いでいる」という表現が正確です。エアコンのような冷たさを期待すると期待外れですが、同じ気温でファンウェアなしの時と比べると、明らかに汗の量が減り、体力の消耗が少なくなりました。特に効果を感じたのは、直射日光下から日陰に入った時。通常なら汗がダラダラ流れる状況でも、ファンの風で素早く汗が乾き、涼しさを感じました。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、デメリットもあります。ファンの音が意外と大きく、中モード以上だと会話に支障があります。見た目もゴツく、ファン部分が膨らむので、人混みではファンが他人に当たりそうで気を使います。また、バッテリーの充電を忘れると使えないのも注意点です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ワークマンの空調ウェア「ウィンドコア」は、エアコンのような劇的な涼しさは得られませんが、暑い環境での体力消耗を確実に軽減してくれる実用的なアイテムでした。&lt;&#x2F;p&gt;
&lt;p&gt;長時間屋外で活動する必要がある人、熱中症リスクの高い環境で作業する人、夏のイベントやフェスに参加する人、ガーデニングや農作業をする人などに特におすすめです。&lt;&#x2F;p&gt;
&lt;p&gt;購入時のアドバイスとしては、ファンで膨らむことを考慮して、普段より1サイズ大きめを選ぶこと。また、直接肌に着るとファンの風が冷たすぎることもあるので、インナーは必須です。長時間使用する場合は、予備バッテリーがあると安心でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;大阪万博という「灼熱地獄」に挑むための装備として購入しましたが、普段の生活でも活躍しそうです。建設現場で働く人たちの知恵に感謝しつつ、この夏を乗り切りたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ワークマンの空調ウェア「ウィンドコア」を購入して試してみました。大阪万博への暑さ対策として、建設現場で使われるファンウェアの実力を体験レポートします。</summary>
        </entry><entry xml:lang="en">
        <title>Anthropic、東京拠点と日本語版Claudeのリリース発表</title>
        <published>2025-06-26T00:00:00+00:00</published>
        <updated>2025-06-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/anthropic-will-launch-tokyo-center/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/anthropic-will-launch-tokyo-center/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;Anthropicが2025年秋に東京拠点の開設とClaude日本語版のリリースを発表。企業向けAI活用の加速と、Claude CodeやMaxプランの利用体験について考察します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Anthropic、日本拠点開設&quot;&gt;Anthropic、日本拠点開設&lt;&#x2F;h2&gt;
&lt;p&gt;生成AIと言えば一般には「ChatGPT」という感じですが、
AIモデルと外部サービスを繋ぐ規格としてデファクトスタンダードになりつつある
MCP(Model Context Protocol)の開発やClaude Codeなど昨年末から立て続けに発表し
ているAnthropic社に個人的には勢いを感じていました。&lt;&#x2F;p&gt;
&lt;p&gt;実は日本でも企業への導入はClaudeが進んでいるそうです。
AnthropicのClaudeはAWSのAmazon Bedrock上でもInvoleModelやConverse APIを通じ
て利用できます。AWSはクラウド基盤として企業に浸透しているので、一般に知られ
ている以上に企業で浸透しているのでしょうか。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.itmedia.co.jp&#x2F;aiplus&#x2F;articles&#x2F;2506&#x2F;25&#x2F;news076.html&quot;&gt;
  &lt;p&gt;
    米Anthropicは6月25日（日本時間）、秋ごろに東京都に拠点を開設すると発表した。併せて、同社のAIサービス「Claude」の日本語版をリリースする。同社がアジア太平洋地域で拠点を開設するのは今回が初。
  &lt;&#x2F;p&gt;
  &lt;footer&gt;
    &lt;cite&gt;
      &lt;a href=&quot;https:&#x2F;&#x2F;www.itmedia.co.jp&#x2F;aiplus&#x2F;articles&#x2F;2506&#x2F;25&#x2F;news076.html&quot;&gt;
        IT Media AI+
        「米AI企業のAnthropic、東京に拠点開設へ　「Claude」日本語版もリリース予定」
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;Claude日本語版&quot;&gt;Claude日本語版&lt;&#x2F;h2&gt;
&lt;p&gt;同時にClaude日本語版が提供されるとされています。&lt;&#x2F;p&gt;
&lt;p&gt;Claude自体は現在でも日本語を扱えますし、
Claude Web版やDesktop版も完全に国際化対応されており、日本語OSのもとでは完全に
ローカライズされているように見えます。&lt;&#x2F;p&gt;
&lt;p&gt;これは何を意味するのか、今後も注目したいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Maxプラン&quot;&gt;Claude Maxプラン&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Proプランを年間契約していましたが、
Claude Maxプランの利用を始めました。&lt;&#x2F;p&gt;
&lt;p&gt;理由はClaude Codeです。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeは β版から利用しているのでAPI利用による従量課金で使用していました。
Claude Codeが正式リリースされてからはProプランでも使用できるようになりま
した。
しかし、Anthropic社の&quot;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.anthropic.com&#x2F;en&#x2F;articles&#x2F;11145838-using-claude-code-with-your-pro-or-max-plan?utm_source=chatgpt.com&quot;&gt;Using Claude Code with your Pro or Max Plan&lt;&#x2F;a&gt;&quot;
という記事によると、目安として、5時間で約45件のチャットor 10〜40回のClaude
Codeプロンプトしか利用できません。実際に使っていると大抵上限に達してしまうので、
使用する際は従量課金で使用していました。&lt;&#x2F;p&gt;
&lt;p&gt;直近Claude Codeの利用率がどんどん上がっていてあまりに便利でこれは月$100でもよいかなと思えたので、Maxプランに移行
してみました。&lt;&#x2F;p&gt;
&lt;p&gt;これにより、次の恩恵があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;上限がProプランの5倍となる&lt;&#x2F;li&gt;
&lt;li&gt;ProプランではClaude Codeで使用できないOpusモデルを使用可能となる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;なお、Claude Codeで従量課金か定額プランかを変更する際には、
プランを登録するだけでは変わらず、Claude Code上でログアウトして
使いたいプランに合わせて再ログインをする必要があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropicの東京拠点開設と日本語版Claudeのリリースは、日本におけるAI活用の
新たな段階を示しています。企業での導入が進む中、MCPやClaude Codeなどの
革新的なツールの提供により、開発者にとってもより身近な存在になりつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;個人的にはClaude Codeの利便性から、ProプランからMaxプランへの移行を決断しました。
月額$100という価格設定ですが、開発効率の向上を考えると十分な価値があると感じています。&lt;&#x2F;p&gt;
&lt;p&gt;今後、日本語版の提供により、どのような新機能や最適化が行われるのか、
そして日本市場へのコミットメントがどのように具体化されるのか、注目していきたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Anthropicが2025年秋に東京拠点の開設とClaude日本語版のリリースを発表。企業向けAI活用の加速と、Claude CodeやMaxプランの利用体験について考察します。</summary>
        </entry><entry xml:lang="en">
        <title>MulmoCast: AIと人間が協働する次世代プレゼンテーション・プラットフォームを試してみた</title>
        <published>2025-06-24T00:00:00+00:00</published>
        <updated>2025-06-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/mulmocast-ai-collaboration-platform/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/mulmocast-ai-collaboration-platform/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;あの中島聡氏が開発している
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;receptron&#x2F;mulmocast-cli&quot;&gt;mulmocast&lt;&#x2F;a&gt; の検証しました。
ガイドにしたがって、ビジネスプレゼンテーションと子供用の絵本的な動画を作って
みました。生成AIのモデルはClaudeやGeminiも選択できるようですが、今回は
デフォルトのままOpenAIを使いました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MulmoCastとは何か？その意義は？&quot;&gt;MulmoCastとは何か？その意義は？&lt;&#x2F;h2&gt;
&lt;p&gt;MulmoCastは、AI時代に特化して設計された次世代のプレゼンテーション・プラッ
トフォームです。従来のPowerPointやKeynoteがAI以前の時代に人間のクリエ
イター向けに設計されたのに対し、MulmoCastは最初からAIネイティブなツールと
して開発されています。&lt;&#x2F;p&gt;
&lt;p&gt;最大の特徴は、 1つのスクリプトから動画、ポッドキャスト、スライドショー
など、複数のフォーマットに自動変換できることです。
現代では情報消費のチャネルが多様化しており、Zoomでのプレゼンテーション、Slackでの共有、移動中の動画視聴、通勤時のポッドキャスト聴取など、様々な場面に対応する必要があります。MulmoCastはこの課題を解決します。&lt;&#x2F;p&gt;
&lt;p&gt;核となるのは「MulmoScript」というJSON&#x2F;YAML形式の中間言語です。これは映画の脚本やWebマークアップのような役割を果たし、ChatGPTやClaudeなどの大規模言語モデルが理解・生成できる形式になっています。AIがストーリー構造からビジュアルまでをすべて定義し、人間はクリエイティブループの中で方向性を決めるという協働モデルを実現しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;インストール方法（Mac）&quot;&gt;インストール方法（Mac）&lt;&#x2F;h2&gt;
&lt;p&gt;MulmoCastのインストールは比較的簡単です。Node.jsとffmpegが必要になります。&lt;&#x2F;p&gt;
&lt;p&gt;まず、NPMを使ってMulmoCastをグローバルインストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -g mulmocast&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;次に、動画生成に必要なffmpegをインストールします。Macの場合はHomebrewを使用します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install ffmpeg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;最後に、プロジェクトディレクトリに&lt;code&gt;.env&lt;&#x2F;code&gt;ファイルを作成し、必要なAPIキーを設定します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;OPENAI_API_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;your_openai_api_key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;DEFAULT_OPENAI_IMAGE_MODEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;gpt-image-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;GOOGLE_PROJECT_ID&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;your_google_project_id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;NIJIVOICE_API_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;your_nijivoice_api_key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;BROWSERLESS_API_TOKEN&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;your_browserless_api_token&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;OpenAI APIキーは必須ですが、他のAPIキーは使用する機能に応じて設定してください。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;基本的な使い方&quot;&gt;基本的な使い方&lt;&#x2F;h2&gt;
&lt;p&gt;MulmoCastの基本的な使い方は2ステップです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ステップ1：スクリプト生成&quot;&gt;ステップ1：スクリプト生成&lt;&#x2F;h3&gt;
&lt;p&gt;まず、AIとの対話でストーリースクリプトを作成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mulmo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; tool scripting -i -t business -o .&#x2F; -s story&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコマンドの説明は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i&lt;&#x2F;code&gt;: インタラクティブモード&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-t business&lt;&#x2F;code&gt;: ビジネステンプレートを使用&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-o .&#x2F;&lt;&#x2F;code&gt;: 出力ディレクトリ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-s story&lt;&#x2F;code&gt;: ファイル名のプレフィックス&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;実行すると、AIとの対話が始まります。コンテンツの内容、ターゲット層、長さなどについて質問され、それに応えることでMulmoScript形式のJSONファイル（例：&lt;code&gt;story-1746600802426.json&lt;&#x2F;code&gt;）が生成されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ステップ2：動画生成&quot;&gt;ステップ2：動画生成&lt;&#x2F;h3&gt;
&lt;p&gt;生成されたスクリプトから動画を作成します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mulmo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; movie story-1746600802426.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコマンド1つで、音声合成、画像生成、動画編集までが自動実行され、最終的にMP4ファイルが出力されます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;利用可能なテンプレート&quot;&gt;利用可能なテンプレート&lt;&#x2F;h3&gt;
&lt;p&gt;用途に応じて以下のテンプレートも選択できます。なんとなくどんなものが出来るか
想像できますね。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;akira_comic&lt;&#x2F;li&gt;
&lt;li&gt;business&lt;&#x2F;li&gt;
&lt;li&gt;children_book&lt;&#x2F;li&gt;
&lt;li&gt;coding&lt;&#x2F;li&gt;
&lt;li&gt;comic_strips,&lt;&#x2F;li&gt;
&lt;li&gt;drslump_comic&lt;&#x2F;li&gt;
&lt;li&gt;ghibli_comic&lt;&#x2F;li&gt;
&lt;li&gt;ghibli_image_only&lt;&#x2F;li&gt;
&lt;li&gt;ghibli_shorts,&lt;&#x2F;li&gt;
&lt;li&gt;ghost_comic&lt;&#x2F;li&gt;
&lt;li&gt;onepiece_comic&lt;&#x2F;li&gt;
&lt;li&gt;podcast_standard&lt;&#x2F;li&gt;
&lt;li&gt;portrait_movie,&lt;&#x2F;li&gt;
&lt;li&gt;realistic_movie&lt;&#x2F;li&gt;
&lt;li&gt;sensei_and_taro&lt;&#x2F;li&gt;
&lt;li&gt;shorts&lt;&#x2F;li&gt;
&lt;li&gt;text_and_image,&lt;&#x2F;li&gt;
&lt;li&gt;text_only&lt;&#x2F;li&gt;
&lt;li&gt;trailer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;検証結果&quot;&gt;検証結果&lt;&#x2F;h2&gt;
&lt;p&gt;今回、ビジネスプレゼンテーションと子供用絵本の2つのパターンで検証しました。
生成AIモデルはClaudeやGeminiも選択可能ですが、今回はデフォルトのOpenAIを
使用しました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mulmo tool scripting -i -t business -o .&#x2F; -s story&lt;&#x2F;code&gt; でAgentと会話してストーリーを練って、&lt;code&gt;mulmo movie story-xxxxxxxxxxxxx.json&lt;&#x2F;code&gt;で動画を生成します。&lt;&#x2F;p&gt;
&lt;p&gt;ちょっとした会話でそれらしいプレゼンテーション動画が出来ます。以下がその動画
です。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;mAp5ORk2Zas&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;実際に使ってみた感想として、簡単な会話だけでそれらしいプレゼンテーション動画
が生成できることに驚きました。内容の深みという点では限界がありますが、1st
Callの資料としては十分に実用的なレベルに達していると感じました。&lt;&#x2F;p&gt;
&lt;p&gt;特に印象的だったのは、一度スクリプトを作成すれば、そこから動画、ポッドキャス
ト、PDFなど複数フォーマットに展開できる点です。コンテンツの再利用性が高く、
効率的な情報発信が可能になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;MulmoCastは、AI時代のコンテンツ作成における新しい可能性を示すツールです。従
来のプレゼンテーション作成が「人間がすべてを制作する」モデルだったのに対し、
「AIと人間が協働して作成する」という新しいパラダイムを提示しています。&lt;&#x2F;p&gt;
&lt;p&gt;現時点では完全に実用レベルに達しているとは言えませんが、プロトタイプや初期段
階の資料作成には十分活用できると感じました。
特に、アイデアの可視化や概念の説明では、従来よりもはるかにコンテンツ作成を効率化できます。&lt;&#x2F;p&gt;
&lt;p&gt;今後、AIの精度向上とともにMulmoCastのようなツールがより洗練されれば、コンテ
ンツ作成の方法が根本的に変わる可能性があります。単一のスクリプトから多様なメ
ディアフォーマットに展開できる仕組みは、情報発信の効率化に大きく貢献するでし
ょう。&lt;&#x2F;p&gt;
&lt;p&gt;興味のある方は、ぜひ一度試してみることをお勧めします。AI協働時代のコンテンツ作成を体験できる貴重なツールです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">AIネイティブなプレゼンテーション・プラットフォーム「MulmoCast」を実際に検証してみました。一つのスクリプトから動画、ポッドキャスト、PDFなど複数フォーマットに自動変換できる革新的なツールの使い方と実用性について詳しく解説します。</summary>
        </entry><entry xml:lang="en">
        <title>千葉刑場と厳島神社</title>
        <published>2025-06-22T00:00:00+00:00</published>
        <updated>2025-06-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/samukawa-kangoku/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/samukawa-kangoku/</id>
        
            <content type="html">&lt;p&gt;同僚から千葉市中央区の登戸辺りに向かい刑場があったと聞いて調査してみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;千葉刑場&quot;&gt;千葉刑場&lt;&#x2F;h2&gt;
&lt;p&gt;調べてみると、千葉市立郷土博物館が2015年に発行した「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.city.chiba.jp&#x2F;kyodo&#x2F;research&#x2F;chibashishi&#x2F;documents&#x2F;newsletter14.pdf&quot;&gt;編さん便り&lt;&#x2F;a&gt;」
に「寒川監獄と囚人たち」という記事がありました。&lt;&#x2F;p&gt;
&lt;p&gt;この記事によると、1874（明治4）年までは、千葉市の大日寺境内に仮監獄があった
そうです。この仮監獄が同年火災で消失し、その為に当時「寒川村」と呼ばれていた
場所にこの監獄が移転し、当初は「寒川監獄」と呼ばれていたようです。
その後1903 (明治36) 年に「千葉監獄」と呼ばれるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;元々佐倉藩の米蔵があり、経費節減のために年貢積み出しのため港に近い寒川の地を
利用したようです。明治になり年貢積み出しの役割がなくなりちょうど開いていたの
でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rekichizu.jp&#x2F;&quot;&gt;れきちず&lt;&#x2F;a&gt;」で1800年代の地図を確認してみると、
「寒川」という地名は登戸より少し南に下って都川を挟んで反対側のようです。
現在の「寒川町」より少し北側で現在の「港町」付近だったようです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;samukawa-kangoku&amp;#x2F;samukawa.webp?h=74f76a4777a3e5ae8516&quot;
  alt=&quot;千葉古地図&quot; width=&quot;639&quot; height=&quot;365&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;現代では埋め立てが進んで海岸線がずいぶんと変わりましたが、以下の地図辺りでは
ないかなと思います。東京ガス本千葉ビルの辺りで、現在は巨大なガスタンクが建っ
ています。&lt;&#x2F;p&gt;
&lt;iframe
  width=&quot;425&quot;
  height=&quot;350&quot;
  src=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;export&#x2F;embed.html?bbox=140.11248350143435%2C35.59471587191188%2C140.12416720390323%2C35.602488757310795&amp;amp;layer=mapnik&amp;amp;marker=35.59860240897393%2C140.11832535266876&quot;
  style={{ border: &quot;1px solid black&quot; }}
&#x2F;&gt;
&lt;br &#x2F;&gt;
&lt;small&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?mlat=35.598602&amp;amp;mlon=140.118325#map=17&#x2F;35.598602&#x2F;140.118325&quot;&gt;
    大きな地図を表示
  &lt;&#x2F;a&gt;
&lt;&#x2F;small&gt;
&lt;p&gt;海に近い低地であったこともあり、腸チフスが監獄内で流行したりと衛生状態はよく
なかったようです。そのためか1907(明治40)年には、
現在刑務所がある貝塚に移転しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;厳島神社_港町弁天&quot;&gt;厳島神社 港町弁天&lt;&#x2F;h2&gt;
&lt;p&gt;当時の監獄に一番近かったであろう、厳島神社に参拝してきました。&lt;&#x2F;p&gt;
&lt;p&gt;厳島神社は首都圏では境内社のケースがほとんどですが、この神社とJR千葉駅近くの
弁天という町にある厳島神社は珍しく主役の神社となって
います。&lt;&#x2F;p&gt;
&lt;p&gt;拝殿の裏には弁財天が鎮座しておりご神水もあります。正殿より、むしろこちら(=裏手)にご神気が満ちている印象です。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;DJl6NVe-JLw&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">同僚から千葉市中央区の登戸辺りに向かい刑場があったと聞いて調査してみました。</summary>
        </entry><entry xml:lang="en">
        <title>Claude Code MCPセットアップガイド：Inkdrop統合の実践</title>
        <published>2025-06-21T00:00:00+00:00</published>
        <updated>2025-06-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/claude-code-mcp-setup-guide/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/claude-code-mcp-setup-guide/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;5月Claude Codeが正式リリースされて以来手放せなくなっています。
Anthropicの
ブログに&quot;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;news&#x2F;claude-code-remote-mcp&quot;&gt;Remote MCP support in Claude Code&lt;&#x2F;a&gt;&quot;
という記事が掲載されました。&lt;&#x2F;p&gt;
&lt;p&gt;早速Claude CodeでInkdrop MCPサーバーを設定し、リモートMCPサーバーとして統合
する手順を実際にセットアップしながら検証してみました。単純な設定から高度なワ
ークフローまで、実践的な内容をまとめています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCPサーバーの追加&quot;&gt;MCPサーバーの追加&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeにInkdrop MCPサーバーを追加するには、以下のコマンドを実行します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mcp add inkdrop &#x2F;Users&#x2F;hogehoge&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  -e INKDROP_LOCAL_SERVER_URL=http:&#x2F;&#x2F;localhost:19840&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  -e INKDROP_LOCAL_USERNAME=hogehoge&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  -e INKDROP_LOCAL_PASSWORD=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;*****************&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  -s local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコマンドの設定は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inkdrop&lt;&#x2F;code&gt;：MCPサーバー名&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;Users&#x2F;hogehoge&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;code&gt;：実行ファイルパス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-e&lt;&#x2F;code&gt;：環境変数の設定（サーバーURL、認証情報）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;-s local&lt;&#x2F;code&gt;：ローカルスコープでの設定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;設定の確認&quot;&gt;設定の確認&lt;&#x2F;h2&gt;
&lt;p&gt;追加したMCPサーバーが正しく設定されているか確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# MCPサーバー一覧の表示&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mcp list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 特定のMCPサーバーの詳細確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mcp get inkdrop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;正常に設定されていれば、以下のような出力が表示されます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;inkdrop:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Scope: Local (private to you in this project)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Type: stdio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Command: &#x2F;Users&#x2F;hogehoge&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Environment:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    INKDROP_LOCAL_SERVER_URL=http:&#x2F;&#x2F;localhost:19840&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    INKDROP_LOCAL_USERNAME=hogehoge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    INKDROP_LOCAL_PASSWORD=************&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claude_Codeでの動作確認&quot;&gt;Claude Codeでの動作確認&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeを起動してMCPサーバーとの接続を確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Claude Code内で &lt;code&gt;&#x2F;mcp&lt;&#x2F;code&gt; コマンドを実行すると、接続されたMCPサーバーの状態を確認できます。正常に接続された場合は、次のような結果になります。
接続状況とどんなコマンドが利用可能か確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ 1. inkdrop  ✔ connected · Enter to view details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Status: ✔ connected&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Command: &#x2F;Users&#x2F;yostos&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Capabilities: tools · prompts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Tools: 7 tools&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;利用可能なツール:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. read-note&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. search-notes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. list-notes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. create-note&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5. update-note&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(他2つのツールあり)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;実際の使用例&quot;&gt;実際の使用例&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;基本的な検索機能&quot;&gt;基本的な検索機能&lt;&#x2F;h3&gt;
&lt;p&gt;明示的にInkdropを指定することで、MCPツールが確実に呼び出されます。例えば私は
Inkdrop内にflacのエンコーディング方法をまとめているので、以下のような出力が
表示されます適切に該当するノートを読み取ってくれました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Inkdropの&amp;quot;Tech Tips&amp;quot;から適切なflacファイルの作り方を検索して、示してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この指示により、以下の処理が自動実行されます。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;search-notes&lt;&#x2F;code&gt;でキーワード検索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;read-note&lt;&#x2F;code&gt;で該当ノートの内容取得&lt;&#x2F;li&gt;
&lt;li&gt;結果の整理と表示&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;高度なワークフロー実演&quot;&gt;高度なワークフロー実演&lt;&#x2F;h3&gt;
&lt;p&gt;より複雑な処理として、ブログ記事の管理を試してみました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;このブログプロジェクトから、2025年5月と6月の記事を確認して、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;タイトル一覧をInkdropのInboxノートブックに新ノートとして作成してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この指示では以下の処理が連携して実行されました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ファイルシステム分析&lt;&#x2F;strong&gt;：記事ディレクトリの探索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;並列処理&lt;&#x2F;strong&gt;：5月・6月を別々のTaskエージェントで同時処理&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;内容解析&lt;&#x2F;strong&gt;：各記事のタイトル抽出とカテゴライズ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MCP統合&lt;&#x2F;strong&gt;：分析結果をInkdropに保存&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;結果として24記事（5月13件、6月11件）のタイトル一覧が自動的にカテゴリ別に整理され、Inkdropに新規ノートとして作成されました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;セットアップのポイント&quot;&gt;セットアップのポイント&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;明示的指示の重要性&quot;&gt;明示的指示の重要性&lt;&#x2F;h3&gt;
&lt;p&gt;「Inkdropの...」という明示的な指示により、Claude CodeがMCPツールを確実に呼び出します。曖昧な指示では期待通りに動作しない場合があります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;自動ツール選択&quot;&gt;自動ツール選択&lt;&#x2F;h3&gt;
&lt;p&gt;Claude Codeは文脈に応じて適切なMCPツールを自動選択し、複数のツールを連携させて処理を完了します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;複合タスクの処理能力&quot;&gt;複合タスクの処理能力&lt;&#x2F;h3&gt;
&lt;p&gt;ファイルシステム分析、内容理解、MCP統合といった複合的なタスクを自動化できるのがClaude Codeの真の能力です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeとInkdrop MCPの統合により、以下のメリットが得られます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コード開発中のメモ参照&lt;&#x2F;strong&gt;：開発中にInkdropのメモを即座に検索・参照可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロジェクト分析の自動化&lt;&#x2F;strong&gt;：コード分析結果の知識ベース化&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ワークフローの完全自動化&lt;&#x2F;strong&gt;：複雑な処理を単一の指示で実行&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;MCP_を軸とした_Claude_連携の実例&quot;&gt;MCP を軸とした Claude 連携の実例&lt;&#x2F;h3&gt;
&lt;p&gt;実は、この記事の制作プロセス自体がMCP統合の真価を示しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Claude Desktop での検証設計&lt;&#x2F;strong&gt;：セットアップ手順の相談と検証方法の策定&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Claude Desktop による知識蓄積&lt;&#x2F;strong&gt;：検証結果をMCP経由でInkdropのノートに整理・保存&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code による記事生成&lt;&#x2F;strong&gt;：MCP経由でInkdropから検証ノートを読み込み、ブログ記事として再構成&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;このワークフローでは、Claude DesktopとClaude Codeが同一のInkdropをMCPサーバーとして共有し、知識の橋渡し役として機能しています。単体のツール利用では不可能な、複数のClaude環境を跨いだ継続的な作業が実現されています。&lt;&#x2F;p&gt;
&lt;p&gt;この統合は、開発プロセスにおける知識管理と自動化の新しい可能性を示しており、MCPを軸としたClaudeエコシステムの真の価値がここにあります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Claude CodeでInkdrop MCPサーバーを設定し、リモートMCPサーバーとして統合する手順を詳しく解説します。実際のセットアップから高度なワークフローの実演まで、ステップバイステップで紹介。</summary>
        </entry><entry xml:lang="en">
        <title>You Never Give Me Your Money</title>
        <published>2025-06-20T00:00:00+00:00</published>
        <updated>2025-06-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/you-never-give-me/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/you-never-give-me/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2113223580&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;you-never-give-me-your-money&quot; title=&quot;You Never Give Me Your Money&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;You Never Give Me Your Money&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;この曲には先日購入したHudson Broadcastが合うかなと思いしてみました。&lt;&#x2F;p&gt;
&lt;p&gt;この曲はイントロからピアノに絡んでくるGeorge Harrisonのギターが印象的です。
オリジナルでは、
レスポールのフロントピックアップでボリュームを絞ってFuzzFaceをFender
TwinReverb(Silver Face)で鳴らしているのかなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;Hudson Broadcastで似たような音になりそうだったので、演奏してみました。&lt;&#x2F;p&gt;
&lt;p&gt;途中でJohn Lennonが弾いていると思われるEpiphone Casinoも
TwinReverbのクリーントーンで鳴らされています。
オーバーダブされ左右で鳴っているので同じように再現してみました。&lt;&#x2F;p&gt;
&lt;p&gt;ベースはRickenbacker 4003だと思いますので、Modo Bass 2のモデリングされたもの
を打ち込みで鳴らしています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">この曲には先日購入したHudson Broadcastが合うかなと思いしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>スプラトゥーン3：2025年夏Sizzle Season</title>
        <published>2025-06-17T00:00:00+00:00</published>
        <updated>2025-06-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/2025-summer-sizzle-season/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/2025-summer-sizzle-season/</id>
        
            <content type="html">&lt;p&gt;今更ですが、新シーズンなのでがんばりましょう。新武器がたくさん追加されましたが、今シーズンはケルビンで戦いましょう。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;Y7zc45JgZDk&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">今更ですが、新シーズンなのでがんばりましょう。新武器がたくさん追加されましたが、今シーズンはケルビンで戦いましょう。</summary>
        </entry><entry xml:lang="en">
        <title>Mission Impossible - Final Recgningを観ました</title>
        <published>2025-06-15T00:00:00+00:00</published>
        <updated>2025-06-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/mission-impossible/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/mission-impossible/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;mission-impossible&amp;#x2F;mi.webp?h=4bc39113724b2dd89abd&quot;
  alt=&quot;Mission Impossible&quot; width=&quot;604&quot; height=&quot;340&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;『ミッション・インポッシブル』の最新作『ファイナル・レコニング』を観てきました。前作の『デッドレコニング』からの続編で、タイトルからしてシリーズ最終作となるので集大成ではありました。ネタバレ含みます。&lt;&#x2F;p&gt;
&lt;p&gt;正直、イマイチでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前作から時間が経ちすぎた&quot;&gt;前作から時間が経ちすぎた&lt;&#x2F;h2&gt;
&lt;p&gt;前作から2年経っています。&lt;&#x2F;p&gt;
&lt;p&gt;ハリウッドの脚本家と俳優の長期ストライキの影響で制作スケジュールに遅れが出たため、
制作が遅れたようです。当初は&quot;DEAD RECGNING TWO&quot;だったようですが、遅れた間に
構成が見直されたようです。&lt;&#x2F;p&gt;
&lt;p&gt;前作を復習してから行こうと思っていましたが、時間がなく予習なしで観たので
冒頭からしばらくは「こいつ、誰だ？」、「彼らは今何やってんの？」と混乱し
ストーリーに追いつけず退屈でした。&lt;&#x2F;p&gt;
&lt;p&gt;よく考えると前作もアクションは凄いが退屈な2時間44分という大作でした。
今回はそれを超える2時間49分の上映時間なので、前作を見返していたら見に行って
なかったかも知れません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;アクションは圧巻&quot;&gt;アクションは圧巻&lt;&#x2F;h2&gt;
&lt;p&gt;アクションは圧巻です。&lt;&#x2F;p&gt;
&lt;p&gt;容量900万リットルという満タンにするだけで15日かかると言う巨大な水槽での潜水
艦シーンのアクションや、複葉機の羽根の上で実際に行ったと言うアクションは
本当に驚く映像です。&lt;&#x2F;p&gt;
&lt;p&gt;こんなレベルのアクションが全編で行われます。&lt;&#x2F;p&gt;
&lt;p&gt;スタントも使わずに自分でこなしたトム・クルーズは、自身がプロデューサーだから
こそチャレンジできたのだろうと思います。&lt;&#x2F;p&gt;
&lt;p&gt;が、何を見せられているのやら。&lt;&#x2F;p&gt;
&lt;p&gt;リアルにアクションしているのは凄いのですが、「CGでいいじゃね？」とつい思って
しまいます。&lt;&#x2F;p&gt;
&lt;p&gt;このレベルのアクションはオープニングとクライマックスでちょろっと入っているく
らいでちょうどよいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;もはやスパイ映画ではない&quot;&gt;もはやスパイ映画ではない&lt;&#x2F;h2&gt;
&lt;p&gt;まず敵がAIって、「昭和か？」と突っ込みたく噴飯ものです。前作でも思いましたが
、AIと全人類の戦いはスパイの出る幕では本来ありません。マーベルのヒーローに任
せたほうよい感じです。&lt;&#x2F;p&gt;
&lt;p&gt;相手を欺瞞で出し抜く痛快さや奇妙な秘密兵器などスパイ映画に期待する醍醐味はこ
の映画にはありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;酷評のようですが、アクション映画としては楽しめます。
3時間近い上映時間中、イーサン・ハントが何しているかさっぱ
りわかりませんが、驚くアクションで居眠りもせずに画面を観ていることはできまし
たから。&lt;&#x2F;p&gt;
&lt;p&gt;前作を完全に忘れているので、一度見直してみようと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">『ミッション・インポッシブル』の 最新作『ファイナル・レコニング』を観てきました。前作の『デッドレコニング』からの続編で、タイトルからしてシリーズ最終作となるので集大成ではありました。ネタバレ含みます。</summary>
        </entry><entry xml:lang="en">
        <title>夜明けの高滝湖</title>
        <published>2025-06-13T00:00:00+00:00</published>
        <updated>2025-06-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/takataki-lake/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/takataki-lake/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;湖畔には市原湖畔美術館が建っている高滝湖を夜明けに、DJI Air3Sで空撮してきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;夜明けの高滝湖と湖畔美術館&quot;&gt;夜明けの高滝湖と湖畔美術館&lt;&#x2F;h2&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;yOx8d9Q8JPQ&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;梅雨にもかかわらず今朝は天気に恵まれ、
夜明け前からブラックバスを狙う釣り人がボートの準備をされていました。&lt;&#x2F;p&gt;
&lt;p&gt;朝日を浴びた市原湖畔美術館や
湖の中の昆虫のオブジェが静かな湖面に映えていました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;高滝湖に大蛇？_ワニ？&quot;&gt;高滝湖に大蛇？ ワニ？&lt;&#x2F;h2&gt;
&lt;p&gt;撮影の時は気付いていなかったのですが、映像の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;yOx8d9Q8JPQ?si=z9xWdyue--DXpYpp&amp;amp;t=168&quot;&gt;2:48&lt;&#x2F;a&gt; ぐらいから、
橋の奥に何か細長いものが湖に浮いているのが見えます。&lt;&#x2F;p&gt;
&lt;p&gt;少し体をくねらせならが橋に近づいています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;yOx8d9Q8JPQ?si=3-Dw2sDZqSNWmlVf&amp;amp;t=207&quot;&gt;3:37&lt;&#x2F;a&gt;には、
かなり橋に近づいています。
その後、潜っていったのか映像からは消えてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;大きさ的に橋を渡る車より大きいので、最低でも5〜6mはありそうです。&lt;&#x2F;p&gt;
&lt;p&gt;一体何だったのでしょう？&lt;&#x2F;p&gt;
&lt;h2 id=&quot;高滝湖とは&quot;&gt;高滝湖とは&lt;&#x2F;h2&gt;
&lt;p&gt;高滝湖は千葉県市原市にあるダム湖です。&lt;&#x2F;p&gt;
&lt;p&gt;養老川氾濫防止と昭和の頃の人口増加への対応のため、
1970年代から建設が始まり1990年に完成したダムです。&lt;&#x2F;p&gt;
&lt;p&gt;高瀧神社や市原湖畔美術館、グランピングスポットなど観光スポットも周辺に多く、
春から夏はブラックバス、秋以降はワカサギなどのボートでの釣りが盛んです。&lt;&#x2F;p&gt;
&lt;p&gt;千葉市からも車で一時間程度ですが、一年を通じて自然と観光を楽しめます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">湖畔には市原湖畔美術館が建っている高滝湖を夜明けに、DJI Air3Sで空撮してきました。</summary>
        </entry><entry xml:lang="en">
        <title>マジでビビった</title>
        <published>2025-06-10T00:00:00+00:00</published>
        <updated>2025-06-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/hell/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/hell/</id>
        
            <content type="html">&lt;p&gt;こういうことがあると心配で公園にも行けなくなります。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;ZiJLiOgLkzE&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">こういうことがあると心配で公園にも行けなくなります。</summary>
        </entry><entry xml:lang="en">
        <title>仕事しようよ、マジで</title>
        <published>2025-06-10T00:00:00+00:00</published>
        <updated>2025-06-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/salmon-run/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/salmon-run/</id>
        
            <content type="html">&lt;p&gt;仕事できる奴らと仕事すると楽しいです。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;Z6qtbWfwKfQ&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">仕事できる奴らと仕事すると楽しいが・・・</summary>
        </entry><entry xml:lang="en">
        <title>AWSからSMSにメッセージを送る</title>
        <published>2025-06-09T00:00:00+00:00</published>
        <updated>2025-06-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/aws-sns/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/aws-sns/</id>
        
            <content type="html">&lt;h2 id=&quot;機密文書のメールでの共有&quot;&gt;機密文書のメールでの共有&lt;&#x2F;h2&gt;
&lt;p&gt;職場では取引先に資料を送付するのに暗号化したZIPでメールし、
パスワードを電話で伝えるということをやっているようです。
最低限のPPAP対策ですが、前時代的ですね。
当然ですが、先方から「電話で伝えられても困る」とよくクレームを受けているようです。
フィアル送信サービスも使っているようですが、「セキュリティ」と言う観点では何
の解決にもなっていません。&lt;&#x2F;p&gt;
&lt;p&gt;メールで機密文書を送る方法について、
現実的な選択肢を考えると以下のような評価かなと思います。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;手段&lt;&#x2F;th&gt;&lt;th&gt;秘匿性（＝パスワードが第三者に見えないか）&lt;&#x2F;th&gt;&lt;th&gt;本人確認性（正しい相手か）&lt;&#x2F;th&gt;&lt;th&gt;コメント&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;① 暗号化ファイル、またはクラウドストレージ（認証なし） + パスワードを同じメールで送信&lt;&#x2F;td&gt;&lt;td&gt;❌：1通盗まれればすべて漏洩&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;PPAPの典型。秘匿性は完全に破綻&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;② 暗号化ファイル、またはクラウドストレージ（認証なし） + パスワードを別メールで送信&lt;&#x2F;td&gt;&lt;td&gt;△：通信経路は一応分離だが同一インフラ内&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;傍受・誤送信時に漏洩リスク高&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;③ 暗号化ファイル、またはクラウドストレージ（認証なし） + パスワードをSMSで送信&lt;&#x2F;td&gt;&lt;td&gt;◯：通信経路分離、実効性あり&lt;&#x2F;td&gt;&lt;td&gt;◯：端末本人であれば高い&lt;&#x2F;td&gt;&lt;td&gt;現実的な最低限の安全策&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;④ クラウドストレージ（認証あり）で共有&lt;&#x2F;td&gt;&lt;td&gt;◎：パスワード共有不要、URL単体では無効&lt;&#x2F;td&gt;&lt;td&gt;◎：ログインが必要なため本人限定&lt;&#x2F;td&gt;&lt;td&gt;アクセス制限・ログ取得が可能&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;⑤ S&#x2F;MIME暗号化メール&lt;&#x2F;td&gt;&lt;td&gt;◎：メール本文と添付がエンドツーエンドで暗号化&lt;&#x2F;td&gt;&lt;td&gt;◎：証明書により本人性確保&lt;&#x2F;td&gt;&lt;td&gt;導入済の組織間では最適解&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;⑥ GPG暗号メール &#x2F; 公開鍵暗号によるファイル送信&lt;&#x2F;td&gt;&lt;td&gt;◎：パスワード共有不要&lt;&#x2F;td&gt;&lt;td&gt;△：鍵配布と運用に依存&lt;&#x2F;td&gt;&lt;td&gt;高い秘匿性だが一般業務には難しい&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;パスワードを別メールで送信&quot;&gt;パスワードを別メールで送信&lt;&#x2F;h2&gt;
&lt;p&gt;本来はS&#x2F;MIMEやGPGを検討すべきでしょうが、S&#x2F;MIMEの費用捻出が難しく、GPGを使う
リテラシーも無いので、次善の策としてSMSでパスワード送信は経路分離できている
分マシだと思いました。&lt;&#x2F;p&gt;
&lt;p&gt;以下はメールとは別の手段でパスワードを伝えるだけならばPC上からこうやってSMSにメッセージを送ることもできますよというデモです。
GUIから任意の電話番号にSMSを送信できます。&lt;&#x2F;p&gt;
&lt;p&gt;Pythonの実行環境が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;処理概要です。あくまでデモです。&lt;&#x2F;p&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    graph TD
A[ユーザー]--&gt; B[Python GUIアプリケーション]
B --&gt; C[.env.localファイル]
C --&gt; D[AWS認証情報&lt;br&#x2F;&gt;ACCESS_KEY_ID&lt;br&#x2F;&gt;SECRET_ACCESS_KEY&lt;br&#x2F;&gt;REGION]

    B --&gt; E[電話番号入力&lt;br&#x2F;&gt;+81XXXXXXXXX]
    B --&gt; F[メッセージ入力&lt;br&#x2F;&gt;パスワード等]
    B --&gt; G[送信ボタン]

    G --&gt; H[boto3 SDK]
    H --&gt; I[AWS SNS API]
    I --&gt; J{SMS Sandbox?}

    J --&gt;|Sandbox Mode| K[検証済み番号のみ]
    J --&gt;|Production Mode| L[全世界の番号]

    K --&gt; M[国内キャリア&lt;br&#x2F;&gt;DoCoMo&#x2F;au&#x2F;SoftBank]
    L --&gt; M

    M --&gt; N[受信者の携帯電話]

    I --&gt; O[CloudWatch Logs]
    O --&gt; P[配信ログ&lt;br&#x2F;&gt;成功&#x2F;失敗&#x2F;料金]

    Q[料金] --&gt; R[$0.06-0.1&#x2F;SMS&lt;br&#x2F;&gt;約6-10円&#x2F;通]

    subgraph &quot;ローカル環境&quot;
        B
        C
    end

    subgraph &quot;AWS Cloud&quot;
        I
        J
        O
        P
    end

    subgraph &quot;日本国内&quot;
        M
        N
    end
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style I fill:#fff3e0
    style N fill:#e8f5e8
    style R fill:#ffebee
&lt;&#x2F;pre&gt;
&lt;p&gt;実際に任意のSMSに送信するには、AWSの管理コンソールでSANDBOXを解除する必要が
あります。また、このままだとユーザー認証していないので誰でも送信できてし
まいます。実際にシステムで行うには、認証した上でログを取得し監査できる状態に
するべきでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;またSMSなので料金が発生します。&lt;&#x2F;p&gt;
&lt;p&gt;こんなことやるくらいなら&lt;strong&gt;さっさと S&#x2F;MINE をちゃんと導入しろよ&lt;&#x2F;strong&gt;と思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ソースコード＆設定&quot;&gt;ソースコード＆設定&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;アプリケーション開始&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; SNSSender&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-magic z-python&quot;&gt; __init__&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;SNSSender初期化中...&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sns&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; boto3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;client&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                &amp;quot;sns&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; region_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;ap-northeast-1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # 東京リージョン&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;AWS SNSクライアント作成完了&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;AWS SNSクライアント作成エラー: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sns&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;setup_gui&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; setup_gui&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;GUI設定中...&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;AWS SNS SMS送信ツール&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;geometry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;500x400&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 電話番号入力&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;電話番号 (+81XXXXXXXXX):&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;phone_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;phone_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # メッセージ入力&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;メッセージ:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;message_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;50&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;message_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 送信ボタン&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Button&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;SMS送信&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            command&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;send_sms&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            bg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;blue&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;white&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            padx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;            pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 結果表示&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;Label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; font&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Arial&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; wraplength&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;400&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;pack&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;pady&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;GUI設定完了&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; send_sms&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;SMS送信ボタンがクリックされました&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        phone_number&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;phone_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;().&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strip&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        message&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;message_entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; tk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;END&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strip&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;電話番号: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;phone_number&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;メッセージ: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;message&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;        if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; phone_number&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;電話番号を入力してください&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;red&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;        if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; message&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;メッセージを入力してください&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;red&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sns&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; is&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;AWS接続エラー&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;red&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;SMS送信中...&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            response&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sns&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;                PhoneNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;phone_number&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;                Message&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;message&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;                MessageAttributes&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                    &amp;quot;AWS.SNS.SMS.SMSType&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                        &amp;quot;DataType&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;String&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;                        &amp;quot;StringValue&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Transactional&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;                    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;                },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            message_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; response&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;MessageId&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            success_text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;送信完了！&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Message ID: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;message_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;success_text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;green&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;送信成功: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;message_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            error_text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;送信エラー:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;\n{&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result_label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;error_text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;red&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;送信エラー: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;GUIメインループ開始&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;root&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;mainloop&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;GUIメインループ終了&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# メイン実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-variable z-magic z-python&quot;&gt; __name__&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;__main__&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; SNSSender&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;AWSのIAMでアクセスキーを作成して、&lt;code&gt;.env.local&lt;&#x2F;code&gt;などに保存しておきます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AWS_ACCESS_KEY_ID=A@@@@@@@@@@@@@@@@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AWS_SECRET_ACCESS_KEY=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AWS_DEFAULT_REGION=ap-northeast-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">AWSが提供するAmazon SNS(Simple Notification Service)を使って、SMSにメッセージを送信するサンプルコードを作ってみました。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Noon</title>
        <published>2025-06-08T00:00:00+00:00</published>
        <updated>2025-06-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/noon/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/noon/</id>
        
            <content type="html">&lt;p&gt;Photo Friday: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;16519&#x2F;newest_first&quot;&gt;#noon&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;noon.webp&quot; alt=&quot;Noon&quot; &#x2F;&gt;
&lt;figcaption&gt;Noon, Sweetened Silence&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Just past noon, a sugar-dusted doughnut sparkles in the bright window light. With fragrant specialty coffee nearby, the city&#x27;s noise fades into sweetened silence, turning an ordinary lunch break into quiet luxury.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Just past noon, a sugar-dusted doughnut sparkles in the bright window light. With fragrant specialty coffee nearby, the city&#x27;s noise fades into sweetened silence, turning an ordinary lunch break into quiet luxury.</summary>
        </entry><entry xml:lang="en">
        <title>Feel Like Makin Love</title>
        <published>2025-06-05T00:00:00+00:00</published>
        <updated>2025-06-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/feel-like/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/feel-like/</id>
        
            <content type="html">&lt;p&gt;ネオソウルのギター教室に行くと必ず課題曲になるという&quot;Feel Like Makin&#x27; Love&quot;。ギターを習いに行ったことないのでわかりませんが、弾いてみました。午後は東京湾ですが、スープを作って海岸でランチをいただきながらリラックスできました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Feel_Like_Makin&amp;#39;_Love&quot;&gt;Feel Like Makin&#x27; Love&lt;&#x2F;h2&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2108603403&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;feel-like-makin-love&quot; title=&quot;Feel Like Makin&amp;#x27; Love&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Feel Like Makin&amp;#x27; Love&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;最初はEpiphone Casino、2ターン目はストラトにオートワウ、3ターン目はストラト
にオーバードライブを掛けています。&lt;&#x2F;p&gt;
&lt;p&gt;前半のセクションは、&lt;code&gt;| IIm7 | V7sus4 | Imaj7 | bVII7 VI7 | IIm7 | V7sus4 | Imaj7 | #IV7&lt;&#x2F;code&gt; です。冒頭からジャズの基本「ii-V-I」進行です。この部分で
&lt;code&gt;V7&lt;&#x2F;code&gt; が&lt;code&gt;V7sus4&lt;&#x2F;code&gt;になっているので、Cmのペンタトニックで弾くとおしゃれな
Neo Soul風になるのでよく練習曲になるのでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;海に行こう&quot;&gt;海に行こう&lt;&#x2F;h2&gt;
&lt;p&gt;Noe Soul風味な曲を弾いたらロハスな気分になったので、豆腐とミニトマトのたまご
スープを作って海岸で海風を楽しみながらランチに行ってきました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;zovwWyZCFMA&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">ネオソウルのギター教室に行くと必ず課題曲になるという&quot;Feel Like Makin&#x27; Love&quot;。ギターを習いに行ったことないのでわかりませんが、弾いてみました。午後は東京湾ですが、スープを作って海岸でランチをいただきながらリラックスできました。</summary>
        </entry><entry xml:lang="en">
        <title>Webサイト脆弱性スキャン入門：NucleiとKatanaで始めるセキュリティチェック</title>
        <published>2025-06-04T00:00:00+00:00</published>
        <updated>2025-06-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/vulnerability-check/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/vulnerability-check/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
ebサイトのセキュリティが気になるけど、専門的な知識がなくて何から始めればいいか分からない...そんなIT技術者の方に向けて、オープンソースのツールを使った脆弱性スキャンの方法をご紹介します。今回は「Nuclei」と「Katana」という2つのツールを組み合わせて、効率的にWebサイトの脆弱性をチェックする方法を解説していきます。
&lt;h2 id=&quot;1._NucleiとKatanaとは？&quot;&gt;1. NucleiとKatanaとは？&lt;&#x2F;h2&gt;
&lt;p&gt;NucleiはProjectDiscoveryが開発したオープンソースの脆弱性スキャナーです。最大の特徴は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;テンプレートベース&lt;&#x2F;strong&gt;：YAML形式のテンプレートで脆弱性パターンを定義&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コミュニティ駆動&lt;&#x2F;strong&gt;：世界中のセキュリティ研究者が3000以上のテンプレートを提供&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;高速処理&lt;&#x2F;strong&gt;：並列処理による効率的なスキャン&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;低い誤検出率&lt;&#x2F;strong&gt;：実際の脆弱性を模擬したテストで精度が高い&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;多様な対応&lt;&#x2F;strong&gt;：CVE、設定ミス、情報漏洩など幅広い脆弱性に対応&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;KatanaもProjectDiscoveryが開発したWebクローラーです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高速クロール&lt;&#x2F;strong&gt;：Go言語で開発された軽量高速なクローラー&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript対応&lt;&#x2F;strong&gt;：SPA（Single Page Application）も適切にクロール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;設定柔軟&lt;&#x2F;strong&gt;：クロール深度や対象範囲を細かく制御可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nuclei連携&lt;&#x2F;strong&gt;：同じ開発元のため、Nucleiとの相性が抜群&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;両者ともProjectDiscoveryが開発したツールですが、この組み合わせが良い理由は次
の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Katanaでサイト全体のURLを収集&lt;&#x2F;li&gt;
&lt;li&gt;NucleiでそれらのURLに対して脆弱性をチェック&lt;&#x2F;li&gt;
&lt;li&gt;両ツールとも同じ開発元なので連携がスムーズ&lt;&#x2F;li&gt;
&lt;li&gt;オープンソースなので無料で利用可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;2._インストール方法&quot;&gt;2. インストール方法&lt;&#x2F;h2&gt;
&lt;p&gt;前提条件は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;macOS&lt;&#x2F;li&gt;
&lt;li&gt;Homebrew（未インストールの場合は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brew.sh&#x2F;ja&#x2F;&quot;&gt;公式サイト&lt;&#x2F;a&gt;からインストール）&lt;&#x2F;li&gt;
&lt;li&gt;Go言語環境（&lt;code&gt;brew install go&lt;&#x2F;code&gt;でインストール可能）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;インストール手順は以下の通りです。
初回実行時にNucleiが自動的にテンプレートをダウンロードします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Homebrewを使用（推奨）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install nuclei&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# インストール確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Go言語でインストール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;go&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install github.com&#x2F;projectdiscovery&#x2F;katana&#x2F;cmd&#x2F;katana@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# インストール確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;katana&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# テンプレートの手動更新（定期的に実行推奨）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -update-templates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;3._実行方法と結果の確認&quot;&gt;3. 実行方法と結果の確認&lt;&#x2F;h2&gt;
&lt;p&gt;最もシンプルな使い方から始めましょう。単一のURLを検査する方法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 基本的なスキャン&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -o results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 重要度の高い脆弱性のみチェック&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -s critical,high,medium -o important_vulns.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;サイト全体をチェックしたい場合は、次のような手順となります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 1. Katanaでサイト全体をクロール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;katana&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -o urls.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 2. 不要なファイルを除外&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -v -E &amp;#39;\.(jpg|jpeg|png|gif|css|js|ico)$&amp;#39; urls.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; filtered_urls.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 3. Nucleiで脆弱性スキャン&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l filtered_urls.txt -s critical,high,medium -o vulnerability_report.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;脆弱性が発見されなければ何も出力されません。
脆弱性が発見された場合は発見された内容が出力されていますので、以下のように
確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 発見された脆弱性の数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l vulnerability_report.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 脆弱性の内容確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; vulnerability_report.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 重要度別の集計&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; vulnerability_report.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -oE &amp;#39;\[(critical|high|medium|low)\]&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; uniq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;4._どのような検証がなされているか確認する方法&quot;&gt;4. どのような検証がなされているか確認する方法&lt;&#x2F;h2&gt;
&lt;p&gt;仕事などで脆弱性検証する場合、「で、一体何が検証されたん？」と聞かれること
もあると思います。3,000以上のテンプレートを使用しているので、簡単にどんなテ
ンプレートが使用されているか把握する方法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 全テンプレート数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# カテゴリ別のテンプレート数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;CVE脆弱性: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags cve&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;情報漏洩: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags exposure&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;設定ミス: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags misconfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;XSS: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags xss&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;LFI: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags lfi&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;管理画面: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags panel&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;技術スタック: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags tech&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;情報収集: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags osint&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 重要度で判別&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -s critical&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;     # 1321件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -s high&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;         # 2377件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -s medium&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;       # 2322件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -s low&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;          # 316件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -s info&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;         # 4086件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;脆弱性が発見された場合は、以下のように詳細ログを確認しましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 詳細ログ付きで実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -v -o results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 特定カテゴリのテンプレート一覧&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -tl -tags cve&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; head&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;CVE（Common_Vulnerabilities_and_Exposures）について&quot;&gt;CVE（Common Vulnerabilities and Exposures）について&lt;&#x2F;h3&gt;
&lt;p&gt;CVEは世界共通のセキュリティ脆弱性カタログです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;命名規則&lt;&#x2F;strong&gt;：CVE-YYYY-NNNNN（年-通し番号）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;例&lt;&#x2F;strong&gt;：CVE-2021-44228（Log4jの重大な脆弱性）&lt;&#x2F;li&gt;
&lt;li&gt;Nucleiは3000以上のCVEに対応したテンプレートを保有&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;5._実践的な使い分け&quot;&gt;5. 実践的な使い分け&lt;&#x2F;h2&gt;
&lt;p&gt;実践的な使い方をまとめてみしょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# クイックチェック（30秒以内）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -t exposures&#x2F; -s critical,high&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# バランス型チェック（1-2分）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -t cves&#x2F;,exposures&#x2F; -s medium,high,critical&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 徹底スキャン（5-10分） - 新サイトの評価など&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;katana&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -d&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -s critical,high,medium&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;テンプレート選択は以下のような指針で運用するとよいと思います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初回チェック&lt;&#x2F;strong&gt;：&lt;code&gt;cves&#x2F;,exposures&#x2F;&lt;&#x2F;code&gt;（CVEと情報漏洩）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;定期チェック&lt;&#x2F;strong&gt;：&lt;code&gt;-s critical,high&lt;&#x2F;code&gt;（重要度の高いもののみ）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;詳細調査&lt;&#x2F;strong&gt;：全テンプレート使用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;6._パフォーマンス最適化&quot;&gt;6. パフォーマンス最適化&lt;&#x2F;h2&gt;
&lt;p&gt;脆弱性の検証自体は結構重たい処理なってしまうので、パフォーマンスが問題となる
場合は、以下のような並行度やレート制限を調整しましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 並列度とレート制限の調整&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -u https:&#x2F;&#x2F;example.com -c&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -rl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -timeout&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# バッチ処理での最適化&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l urls.txt -c&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 25&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -rl&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -bulk-size&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 25&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-c 50&lt;&#x2F;strong&gt;：同時実行テンプレート数を50に設定&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;-rl 100&lt;&#x2F;strong&gt;：1秒間に100リクエストまで&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;-timeout 5&lt;&#x2F;strong&gt;：タイムアウトを5秒に短縮&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;7._セキュリティ向上のための継続的運用&quot;&gt;7. セキュリティ向上のための継続的運用&lt;&#x2F;h2&gt;
&lt;p&gt;継続的に運用するために、次のようなスクリプトを組んでcronなどで自動運用する
方法もよいと思います。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# daily_security_check.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;https:&#x2F;&#x2F;your-website.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;DATE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;OUTPUT_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;security_scans&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$DATE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 金曜日（5）かチェック&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [ $(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%u&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -eq&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;金曜日なので、テンプレートを更新します...&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -update-templates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -p &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 高優先度の脆弱性をチェック&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -u &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; -s critical,high -o &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;critical_scan.txt&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 結果をメール送信（お好みで）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;critical_scan.txt&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ];&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    mail&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -s &amp;quot;セキュリティアラート: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; admin@company.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;critical_scan.txt&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;8._他ツールとの連携例&quot;&gt;8. 他ツールとの連携例&lt;&#x2F;h2&gt;
&lt;p&gt;Webサイトが静的サイトジェネレーターなどで組まれている場合は、
サイト生成のCI&#x2F;CDパイプラインに脆弱性検証を組み込むという手もあります。&lt;&#x2F;p&gt;
&lt;p&gt;以下は、GitHub Actionsの例です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# GitHub Actions例&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Security Scan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  schedule&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; cron&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0 9 * * 1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; # 毎週月曜日9時&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  security-scan&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Install Nuclei&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          go install github.com&#x2F;projectdiscovery&#x2F;nuclei&#x2F;v3&#x2F;cmd&#x2F;nuclei@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Run Security Scan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;          nuclei -u ${{ secrets.TARGET_URL }} -s critical,high -o scan_results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Upload Results&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;upload-artifact@v2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; security-scan-results&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; scan_results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;また、レポート生成の自動化、定期的な処理などの最後にレポート出力を組み込んで
も良いと思います。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 簡単なサマリーレポート生成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;generate_security_report&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;$1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;security_report_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +%Y%m%d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;.txt&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;=== セキュリティスキャンレポート ===&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;対象サイト: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;スキャン日時: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # スキャン実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    nuclei&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -u &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$TARGET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot; -s critical,high,medium -o temp_results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;発見された脆弱性数: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; temp_results.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;詳細結果:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    cat&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; temp_results.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    rm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; temp_results.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;レポートを生成しました: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-normal z-shell&quot;&gt;$OUTPUT&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 使用例&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;generate_security_report&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;https:&#x2F;&#x2F;example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;⚠️_重要：責任ある使用のための注意事項&quot;&gt;⚠️ 重要：責任ある使用のための注意事項&lt;&#x2F;h2&gt;
&lt;p&gt;脆弱性の検証はサーバーに非常に負荷をかけるため、
不正アクセス禁止法、電子計算機損壊等業務妨害罪、偽計業務妨害罪
などに抵触し違法行為になる可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;必ず以下を遵守しましょう。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;所有権の確認&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自分が所有するサイトのみスキャンしてください&lt;&#x2F;li&gt;
&lt;li&gt;他者のサイトには必ず事前許可を取得してください&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;適切な負荷制御&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;本番サイトへの負荷を考慮してレート制限を設定&lt;&#x2F;li&gt;
&lt;li&gt;業務時間外でのスキャン実施を推奨&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;結果の適切な管理&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;スキャン結果に機密情報が含まれる可能性あり&lt;&#x2F;li&gt;
&lt;li&gt;結果ファイルの保存場所とアクセス権限に注意&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;なぜ偽計業務妨害罪となる可能性があるか&quot;&gt;なぜ偽計業務妨害罪となる可能性があるか&lt;&#x2F;h3&gt;
&lt;p&gt;偽計業務妨害罪（刑法233条）の要件は、以下の3つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;偽計：虚偽の情報や人を欺く行為&lt;&#x2F;li&gt;
&lt;li&gt;業務妨害：他人の業務を妨害すること&lt;&#x2F;li&gt;
&lt;li&gt;故意：妨害する意図があること&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;脆弱性検査はサーバーに非常に負荷を掛ける処理であることは知られているので、
業務妨害と故意であることは分かりやすいと思います。&lt;&#x2F;p&gt;
&lt;p&gt;「偽計」については、脆弱性スキャンはブラウザの正常なアクセスを装って
リクエストヘッダを偽装しつつ「負荷」という観点では攻撃的とも言えるペイロード
を送信するため「偽計」と見なされる可能性があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;NucleiとKatanaを使った脆弱性スキャンは、以下のような方に特におすすめです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自社サイトのセキュリティ状況を定期的にチェックしたい&lt;&#x2F;li&gt;
&lt;li&gt;オープンソースツールでコストを抑えたい&lt;&#x2F;li&gt;
&lt;li&gt;コマンドラインツールに慣れている&lt;&#x2F;li&gt;
&lt;li&gt;セキュリティの基本的な知識を実践で学びたい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;最初は単一URLの簡単なチェックから始めて、慣れてきたらサイト全体のスキャンや自動化に挑戦してみてください。重要なのは継続的にセキュリティをチェックする習慣を作ることです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;脆弱性が見つからない結果も良い結果&lt;&#x2F;strong&gt;です。むしろサイトが適切にメンテナンスされている証拠として安心できる材料になります。&lt;&#x2F;p&gt;
&lt;p&gt;セキュリティは一度設定すれば終わりではなく、継続的な取り組みが重要です。このツールを活用して、より安全なWebサイト運営を目指しましょう。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;参考リンク&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.projectdiscovery.io&#x2F;opensource&#x2F;nuclei&#x2F;overview&quot;&gt;Nuclei公式ドキュメント&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;projectdiscovery&#x2F;katana&quot;&gt;Katana公式リポジトリ&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;projectdiscovery.io&#x2F;&quot;&gt;ProjectDiscovery&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;&#x2F;strong&gt;：この記事の内容は啓蒙目的であり、適切な許可なく他者のシステムをスキャンすることは違法行為となる可能性があります。必ず責任を持って使用してください。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ebサイトのセキュリティが気になるけど、専門的な知識がなくて何から始めればいいか分からない...そんなIT技術者の方に向けて、オープンソースのツールを使った脆弱性スキャンの方法をご紹介します。今回は「Nuclei」と「Katana」という2つのツールを組み合わせて、効率的にWebサイトの脆弱性をチェックする方法を解説していきます。</summary>
        </entry><entry xml:lang="en">
        <title>一新されたドローン飛行日誌サービス FwriteDown</title>
        <published>2025-06-02T00:00:00+00:00</published>
        <updated>2025-06-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/06/fwritedown/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/06/fwritedown/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;fwritedown&amp;#x2F;top.webp?h=093d7e107023b80c5ac3&quot;
  alt=&quot;FwriteDown&quot; width=&quot;489&quot; height=&quot;710&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;FwriteDownとは&quot;&gt;FwriteDownとは&lt;&#x2F;h2&gt;
&lt;p&gt;ドローンの飛行では、国土交通省の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mlit.go.jp&#x2F;koku&#x2F;operation.html#anc02&quot;&gt;指定フォーマット&lt;&#x2F;a&gt;に従った
日常点検記録と飛行日誌を記録する必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;EXCEL&#x2F;Wordのテンプレートも提示されていますし、項目もシンプルです。
業務でなければEXCELなどの管理でも十分です。
しかし、現地での入力では、 EXCEL&#x2F;Word
は使い勝手がよくありません。&lt;&#x2F;p&gt;
&lt;p&gt;FwriteDownはブラウザベースのツールで、日常点検や飛行日誌を国土交通省のフォー
マットに準拠した形式で記録・管理できるツールです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;FwriteDownのバージョンアップ内容&quot;&gt;FwriteDownのバージョンアップ内容&lt;&#x2F;h2&gt;
&lt;p&gt;バージョンアップでの主な変更点は大きく3つあります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._DISP2.0とのAPI連携&quot;&gt;1. DISP2.0とのAPI連携&lt;&#x2F;h3&gt;
&lt;p&gt;DISP2.0とAPIで連携できるようになりました。
具体的には、次のようなことができるようになります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;飛行計画通報をこのアプリから作成・閲覧ができるようになった&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;飛行計画をFwriteDownから作成していれば&lt;&#x2F;strong&gt;、飛行日誌作成時に飛行計画から情報
を引用できる&lt;&#x2F;li&gt;
&lt;li&gt;飛行許可が参照できる。飛行許可申請は許可申請サポートへのリンクが掲載され
ている。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;許可申請は多くの人が包括申請をしているでしょうから、日々の飛行についてはこの
アプリで飛行通報から飛行日誌作成まですべてこのアプリから行うことが可能となっ
ています。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、一番使いそうな飛行日誌の作成の際の飛行計画の参照は、DIPS2.0の飛行計
画を参照しているわけでなく、FwriteDown側で保持している飛行計画を参照している
だけです。そのため、DIPS2.0上で直接作成した飛行計画は参照できません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._スマートフォンアプリ提供&quot;&gt;2. スマートフォンアプリ提供&lt;&#x2F;h3&gt;
&lt;p&gt;FwriteDownはこれまでブラウザベースで提供されていました。
スマートフォンで使用する際もブラウザを使用するアプローチを取っていました。
アプリケーションはレスポンシブ対応されていたので、PCでもスマートフォンでも
最適な表示となり操作できました。&lt;&#x2F;p&gt;
&lt;p&gt;今回はiPhoen&#x2F;Android用のアプリが提供されることとなりました。
おそらく競合製品のドローンノートがアプリで提供されていることへの対抗なのでし
ょう。&lt;&#x2F;p&gt;
&lt;p&gt;個人的には全く評価しません。むしろ改悪と感じています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;スマートフォンアプリとは言っても、WebViewを使っていると思われるので使い勝
手はブラウザとそれほど変わらない。&lt;&#x2F;li&gt;
&lt;li&gt;バージョンアップによりPC&#x2F;Mac使用時もスマートフォン同様縦長の表示になり使い勝手や読みやすさがかなり改悪された&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3._価格変更&quot;&gt;3. 価格変更&lt;&#x2F;h3&gt;
&lt;p&gt;これまで無料プランでも機体10機、パイロットは10人まで管理できました。&lt;&#x2F;p&gt;
&lt;p&gt;今回のリニューアル以降は以下のように改変されました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;06&amp;#x2F;fwritedown&amp;#x2F;price.webp?h=2fc1fd08bcaf2345b778&quot;
  alt=&quot;Price&quot; width=&quot;1230&quot; height=&quot;497&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;無料枠では機体1機、パイロット1名、月に3回までの飛行という制約では、おそらく
多くの人がぎりぎり収まらないかなという印象です。&lt;&#x2F;p&gt;
&lt;p&gt;次のプランが990円&#x2F;月のコースです。従来の無料プランと同じ制約なので個人ユーザ
ーには十分ですが、価格的にかなりハードルが高い設定だと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;現在はリニューアルキャンペーンを利用して一ヶ月無料でスタンダートプランを利用
していますが、正直月末には解約しようかなと思っています。&lt;&#x2F;p&gt;
&lt;p&gt;理由は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;スタイルシートのレスポンシブ対応がいい加減でPC&#x2F;Macなどの画面で閲覧・操作できるというアドバンテージがなくなった&lt;&#x2F;li&gt;
&lt;li&gt;DIPS2.0との連携は便利だが、わざわざスマートフォン用の表示でやる意味はなく、DISP2.0上でやったほうが快適である&lt;&#x2F;li&gt;
&lt;li&gt;アドバンテージがない割に価格が高く、更にメリットがない&lt;&#x2F;li&gt;
&lt;li&gt;機能を増やした分、UIの素性の悪さが前面に出てきてしまっている&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;おそらくドローンノートに移行すると思
います。DIPS2.0のAPI連携など技術的にはがんばったのだと思いますが、
ユーザーの利便性向上にはあまり貢献しないという上流工程が悪ければ
こうなるという典型でしょうか。&lt;&#x2F;p&gt;
</content>
        <summary type="html">6月からドローンの飛行日誌サービスであるFwriteDownが一新されDIPS2.0との連携など革新的な機能を追加してきました。以前から使用していたので、その使い勝手を確認してみました。</summary>
        </entry><entry xml:lang="en">
        <title>Scaler3で作曲支援</title>
        <published>2025-05-31T00:00:00+00:00</published>
        <updated>2025-05-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/scaler3/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/scaler3/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;scaler3&amp;#x2F;scaler3.webp?h=7933cce2096b167cf29e&quot;
  alt=&quot;Scaler3&quot; width=&quot;3440&quot; height=&quot;1440&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;先日発売されたScaler3ですが、音楽理論を知らなくても作曲や編曲ができると話題なので購入してみました。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
## Scaler3とは
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;scalermusic.com&#x2F;products&#x2F;scaler-3&#x2F;&quot;&gt;Scaler3&lt;&#x2F;a&gt;は音楽理論やコード理論
がわからなくても凝ったコード進行が作れる作曲支援ソフトです。&lt;&#x2F;p&gt;
&lt;p&gt;裏では音楽理論に基づいて適切なコード進行を提案してくれるの
その中から気に入ったコードをどんどんドラッグしてコード進行を作っていけます。&lt;&#x2F;p&gt;
&lt;p&gt;「コードに合う違和感のない音はどれか」「コード進行で冒険したいが、このコード
は適切か」といったプロでも抱えてしまいそうな悩みを解消してくれます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Scaler3を検証してみた&quot;&gt;Scaler3を検証してみた&lt;&#x2F;h2&gt;
&lt;p&gt;今回は既存のメロディを取ってきてSuggest機能に従ってコード進行を作ってみまし
た。使用したのはThe Banglesの&quot;Eternal Flame&quot;です。&lt;&#x2F;p&gt;
&lt;p&gt;またScaler3から追加されたアレンジ機能を使って伴奏を付けています。
ドラムの生成機能はないので、ドラムだけはLogic ProのPlayer機能を使っています
。&lt;&#x2F;p&gt;
&lt;p&gt;前半がScaler3で生成した伴奏、後半がオリジナルのコード進行に従った伴奏です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;SoundCloudEmbed apiurl=&quot;https:&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;2105211069&quot;
url=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;sclar3&#x2F;s-aQqlD1uzAIB?si=ab6c3c4bcd0a49f3b1127fe1090f0657&amp;utm_source=clipboard&amp;utm_medium=text&amp;utm_campaign=social_sharing&quot;
title=&quot;Scaler3テスト&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;オリジナルは、G Majorで次のようなコード進行です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;G Em7 | C D | G Em7 | C D | Em B7 | Em7 A7 | D Bm7| Am7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ですが、 Scaler3でもっともノートとコードにのマッチ度が高かったB Phrygian
Modeでコードを構成してみました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Bm G | C D | Em G | Am G | Em7 Dsus2 | Bm Em | A7 D| Bm7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;メロディから判断され推奨されるコードはブルーで示されますが、
メロディをすべてマッチするわけではないんで、実際は推奨コードから試しながら
決めていくことになります。しかし、何も参考にせず自分で考えるより数倍生産性は上が
ります。&lt;&#x2F;p&gt;
&lt;p&gt;オリジナルのほうが安心して聞ける印象です。
一方、Scaler3で作ったコード進行はちょっと印象が違っていますが、まぁ成り立っているのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;多分、メロディからコードを作るより、コード進行をScalerで練って、
メロディを提案してもらったほうがうまく働くと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Scaler3は「音楽理論の知識」と「直感的な操作」のバランスが絶妙なツールです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;🎯_習得難易度について&quot;&gt;🎯 習得難易度について&lt;&#x2F;h3&gt;
&lt;p&gt;完全な素人には難しいものの、基本的な音楽理論（メジャー・マイナー、ダイアト
ニックコードなど）を理解していれば十分活用できます。 転調の提案など高度な
機能については、理論と感性のバランスを取りながら使い分けることが重要です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;💡_Scaler3の真価&quot;&gt;💡 Scaler3の真価&lt;&#x2F;h3&gt;
&lt;p&gt;最大の価値は &lt;strong&gt;「0→1の創作支援」&lt;&#x2F;strong&gt; にあります。白紙の状態から音楽理論に基づ
いた膨大なコード進行のアセットを参考にできるため、創作の起点として非常に強力
です。また、安全圏を抜け出した「冒険的なコード進行」への挑戦も、理論的裏付け
があるので安心して試せます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;🤖_AI作曲時代における位置づけ&quot;&gt;🤖 AI作曲時代における位置づけ&lt;&#x2F;h3&gt;
&lt;p&gt;AIが楽曲を自動生成する時代になりましたが、&lt;strong&gt;創作者が主導権を握りながら音楽理
論の恩恵を受けられるScaler3のようなツールは、まだまだ重要な役割を果たすでし
ょう。&lt;&#x2F;strong&gt; 完全自動化ではなく、人間の創意工夫とテクノロジーの協働による作曲ス
タイルは、今後も価値を持ち続けると考えられます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;結論として、Scaler3は音楽制作の生産性を大幅に向上させる優秀なパートナーツールです。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">先日発売されたScaler3ですが、音楽理論を知らなくても作曲や編曲ができると話題なので購入してみました。</summary>
        </entry><entry xml:lang="en">
        <title>Revolution</title>
        <published>2025-05-30T00:00:00+00:00</published>
        <updated>2025-05-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/revolution/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/revolution/</id>
        
            <content type="html">&lt;p&gt;The Beatlesの&quot;Revolution&quot;のイントロの割れたCasinoの音が、
まさにコンソールでギターを直接挿して歪ませたのだそうです。
折角コンソールをベースにした&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4kEhheL&quot;&gt;Hudson Broadcast&lt;&#x2F;a&gt;を購
入したので、この曲を演奏してみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2104733787&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;revolution&quot; title=&quot;Revolution&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Revolution&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Intro のギターと、Rhythm Guitar は Epiphone Casino を Hudson Broadcast でめいっぱい歪ませ
ています。もう一本は AriaPro II PE-1500RI を Overdrive と Broadcast を通しています
。&lt;&#x2F;p&gt;
&lt;div class=&quot;kaerebalink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601292320040183?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;ran&#x2F;img&#x2F;3001&#x2F;0005&#x2F;060&#x2F;551&#x2F;630&#x2F;007&#x2F;30010005060551630007_1.jpg?_ex=320x320&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;kaerebalink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601292320040183?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;Broadcast HUDSON ELECTRONICS&lt;&#x2F;a&gt;&lt;div class=&quot;kaerebalink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;kaereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;カエレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;kaerebalink-link1&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;g0000015.9srin702.g0000015.9srio330&#x2F;kaereba_main_202601292320040183?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;m=http%3A%2F%2Fm.product.rakuten.co.jp%2Fproduct%2F45f1b08fa4bda83f1c45fab1ba4aa290%2F&amp;rafcid=wsc_i_ps_1087413314923222742&quot; target=&quot;_blank&quot; &gt;楽天市場&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=HUDSON%20Broadcast&amp;__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">先日購入したHudson Broadcastですが、1960年代のクラシックな放送用コンソールをベースにした歪みエフェクターと謳われています。だとすると、この曲を演らない訳にはいかないでしょう。</summary>
        </entry><entry xml:lang="en">
        <title>祝 DJI Mini 4 Pro、ホビー機初の型式認証取得！ ＆ Air3S自動飛行レポート</title>
        <published>2025-05-29T00:00:00+00:00</published>
        <updated>2025-05-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/dji-receives-type-certification-mini-4-pro/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/dji-receives-type-certification-mini-4-pro/</id>
        
            <content type="html">&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;ドローン界に歴史的な転換点が到来？　DJIがMini 4 Proで一般向け機種として初の第二種型式認証を取得しました。飛行申請が大幅に簡略化されるのか？　また、DJI Air 3Sのウェイポイント自動飛行をテストしてきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Mini_4_Pro――ホビー機の壁を破った「第二種」快挙&quot;&gt;Mini 4 Pro――ホビー機の壁を破った「第二種」快挙&lt;&#x2F;h2&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.dji.com&#x2F;jp&#x2F;media-center&#x2F;announcements&#x2F;dji-receives-type-certification-mini-4-pro&quot;&gt;
  &lt;p&gt;2025年5月26日 – 民生用ドローンと革新的なカメラ技術で世界をけん引するDJI
  は、5月23日、国土交通大臣からカメラドローンDJI Mini 4 Proについて第二種型
  式認証を取得いたしました。&lt;&#x2F;p&gt;
  &lt;footer&gt;
    &lt;cite&gt;
      DJI Japan プレスリリース 「&lt;a href=&quot;https:&#x2F;&#x2F;www.dji.com&#x2F;jp&#x2F;media-center&#x2F;announcements&#x2F;dji-receives-type-certification-mini-4-pro&quot;&gt;DJI、日本の空をもっと自由に
&lt;&#x2F;a&gt;」
    &lt;&#x2F;cite&gt;
    &lt;&#x2F;footer&gt;
  &lt;&#x2F;blockquote&gt;
ついに、DJI Mini 4 Pro が国交省の**第二種型式認証**をクリアしました。  
これまで産業機限定と思われていた認証を、199 g クラスのホビー機が突破したのはまさに歴史的。
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;型式認証とは&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
機体の安全性と性能を国が公式にお墨付きを与える制度。&lt;br &#x2F;&gt;
&lt;strong&gt;第二種&lt;&#x2F;strong&gt;に合格すると、飛行許可・承認時に機体の安全性に関する書類提出が一部免除され、申請手続きが大幅に簡素化されます。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;何が変わる？&quot;&gt;何が変わる？&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人口集中地区や夜間飛行&lt;&#x2F;strong&gt;の申請がラクに&lt;&#x2F;li&gt;
&lt;li&gt;書類作成の手間とコストを大幅カット&lt;&#x2F;li&gt;
&lt;li&gt;趣味ユーザーでも&quot;安全＋合法&quot;のハードルが一気にダウン&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;現代のドローンではカメラを使った「目視外飛行」は避けて通れませんが、そうする
と必ず「特定飛行」となってしまいます。本来無人航空機操縦者技能証明（国家資格）
を持っていれば、第二種型式認証機は自由に飛ばせるはずでした。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、これまでは型式認証機は産業用の高価な機体のみだったため、技能証明を取
得しても別途国土交通省への「飛行許可申請」が必要でした。都度申請が必要で
許可に数週間かかってしまい手間なので、日本全国一年間OKという「包括申請」をみんなが行うというバカな状況でした。&lt;&#x2F;p&gt;
&lt;p&gt;今回の型式認証により、 DJI Mini4 Pro&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;であれば技能証明を持っていれば、申請
不要で即座に飛行可能となります&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Air_3S――新川上空でウェイポイント自動飛行を検証&quot;&gt;Air 3S――新川上空でウェイポイント自動飛行を検証&lt;&#x2F;h2&gt;
&lt;p&gt;続いて、手元の&lt;strong&gt;DJI Air 3S&lt;&#x2F;strong&gt;でウェイポイント飛行をテストを行ってきました。&lt;br &#x2F;&gt;
場所は千葉県八千代市を流れる新川。道の駅やちよの近くです。
「新川千本桜」と呼ばれ、川沿いに河津桜が並んでいるところです。
残念ながら、桜の季節ではありませんが。&lt;&#x2F;p&gt;
&lt;p&gt;DJI Air3Sは、DJI機では始めて前方赤外線LiDARセンサーを搭載した機種で、
各方向のビジュアルセンサーと組み合わせて夜間や暗所での障害物検知も可能
にした機種です。&lt;&#x2F;p&gt;
&lt;p&gt;この機能が災いしたのかネット上では、次のような声も見かけます。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;「ウエイポイントでの自動飛行では、センサーが敏感すぎて何もない上空で障害物検知して停止する」&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;同じセンサーを搭載した最新の上位機種であるMavic 4 Pro
でも同様とのレポートもありました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、今回のテストでは次のような結果でした。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;テスト結果は予想以上&quot;&gt;テスト結果は予想以上&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;飛行回数：&lt;&#x2F;strong&gt; 4回連続&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;緊急停止：&lt;&#x2F;strong&gt; 0回&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ルート完遂率：&lt;&#x2F;strong&gt; 100%&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;センサー誤作動：&lt;&#x2F;strong&gt; なし&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;河川沿いの木々や建物による誤検知も一切なく、設定した2Km弱のルートを4フライト連続で滑らかにトレースしてくれました。
撮影された動画でもジンバルのブレは皆無で、Air 3Sの優秀な飛行制御システムを実感できました。&lt;&#x2F;p&gt;
&lt;p&gt;Air 3Sの安定飛行とウェイポイントの滑らかな動きをぜひご覧ください。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;HTimBV-n7Tg&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;まとめ_――_技術と制度、両輪で加速する日本のドローンライフ&quot;&gt;まとめ ―― 技術と制度、両輪で加速する日本のドローンライフ&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mini 4 Proの型式認証&lt;&#x2F;strong&gt;で、ホビー層にも&quot;合法フライト&quot;の追い風&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Air 3Sの実力&lt;&#x2F;strong&gt;で、自動航行がより身近で信頼できるものに&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;規制は進化し、機体は賢くなる。&lt;br &#x2F;&gt;
これからもルールを守りつつ、ドローンの可能性を思い切り広げていきましょう。&lt;&#x2F;p&gt;
&lt;p&gt;Fly safe, fly smart ―― 次の空へ。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;ただし、過去に購入した機体ではNGのようです。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;飛行する土地の所有者や管理者の飛行許可が必要であること、国土交通省への
飛行計画の通報が必要であることはこれまでと変わりません。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">ドローン界に歴史的な転換点が到来？ DJIがMini 4 Proで一般向け機種として初の第二種型式認証を取得しました。飛行申請が大幅に簡略化されるのか？ また、DJI Air 3Sのウェイポイント自動飛行をテストしてきました。</summary>
        </entry><entry xml:lang="en">
        <title>スプラトゥーン10周年</title>
        <published>2025-05-28T00:00:00+00:00</published>
        <updated>2025-05-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/splat10th/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/splat10th/</id>
        
            <content type="html">&lt;p&gt;今シーズンあまりできませんでしたが、10周年おめでとう。
久しぶりにやってみました。まぁ、いつもとかわりませんが。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;7a0XixPJLYY&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">スプラトゥーンが10周年を迎えたらしいです。めでたい！</summary>
        </entry><entry xml:lang="en">
        <title>Universal Audio&#x2F;UAFX Max Preamp &amp; Dual Compressorを買う</title>
        <published>2025-05-24T00:00:00+00:00</published>
        <updated>2025-05-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/max/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/max/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;max&amp;#x2F;max.webp?h=8c1cb574c34780a09cb4&quot;
  alt=&quot;UAFX Max Preamp &amp;amp; Dual Compressor&quot; width=&quot;1200&quot; height=&quot;1098&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Strymon Compadreに満足していなかったわけではありませんが、少し安く売られているのを見つけたので、UAFX Max Preamp &amp;amp; Dual Compressorを購入してしまいました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;UAFX_Max_Preamp_&amp;amp;_Dual_Compressor_の概要&quot;&gt;UAFX Max Preamp &amp;amp; Dual Compressor の概要&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4jhLWgM&quot;&gt;UAFX Max Preamp &amp;amp; Dual Compressor&lt;&#x2F;a&gt; はAmazonが他よりも少し安く購入できました。&lt;&#x2F;p&gt;
&lt;p&gt;本機はUniversal Audioから発売されているコンパクトなエフェクターですが、
伝説的なコンプ3機種であるDyna Comp, LA-2A, UA 1176を再現できる
夢のようなエフェクターです。&lt;&#x2F;p&gt;
&lt;p&gt;しかもコンプレッサーは2つを同時にしようできます。UA 1176を2台直列に繋ぐよう
なことも可能です。スマートフォンと接続すれば接続方法もシリアルからパラレルに
カスタマイズできます。&lt;&#x2F;p&gt;
&lt;p&gt;これだけでも十分美味しいのですが、更にUAのチューブ・マイク・プリアンプ610を
シミュレートしたプリアンプが搭載されており、甘い質感で音をブーストすることも
可能です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際に弾いてみた&quot;&gt;実際に弾いてみた&lt;&#x2F;h2&gt;
&lt;p&gt;まず、プリアンプはUniversal Audioが誇るビンテージチューブプリアンプである
UA610をシミュレートしています。
ブースター的な使い方でなくサチュレーションを付与するためゲインを稼ぐ効果が
期待できます。音に厚みや温かみを与えることができます。&lt;&#x2F;p&gt;
&lt;p&gt;すべてのコンプレッサーの経験があるわけではありませんが、Dyna Compのブーミー
さや緻密な1176などかなり再現性が高いと思います。&lt;&#x2F;p&gt;
&lt;p&gt;また、シリアルに2台つなげることが可能です。LA-2Aで音を整えてUA1176でサス
ティーンを稼ぐなど、実際にポストレコーディングで行われているような処理を足下
で扱えるのは感動です。&lt;&#x2F;p&gt;
&lt;p&gt;ちょっとだけ弾いてみました。クリーントーンはEpiphone CasinoにDyna Comp +
UA 1176です。ディストーションはAria Pro II PE-1500にLA-2A + Overdriveland
です。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2101336863&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;youre-everything-i-see&quot; title=&quot;You&amp;#x27;re Everything I See&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;You&amp;#x27;re Everything I See&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;使ってみた感想&quot;&gt;使ってみた感想&lt;&#x2F;h2&gt;
&lt;p&gt;内部はデジタルな処理をしていると思いますが、コントロールはつまみを使ったアナログです。
使いやすいのですが、次の点が気になりました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;コンプによって有効なつまみが違うので編集時に戸惑う&lt;&#x2F;li&gt;
&lt;li&gt;同じコントロールを2台のコンプで共有する形になっておりトグルスイッチで切り
替える方式のため、現在のコントロールの状態がどちらのものか分からない。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私は自宅のレコーディングでしか使わないので大きな問題ではありませんが、
ライブとか使う場合は混乱してしまいそうです。&lt;&#x2F;p&gt;
&lt;p&gt;音については、さすがに伝説のコンプたちでとても高品質です。
それぞれ性格が異なり本機はシリアルに順番も自由につなげることもできるので
組み合わせもバリエーションがあり、UA1176などは制御できるパラメーターが多いの
で研究は必要です。&lt;&#x2F;p&gt;
&lt;p&gt;伝説のコンプ3台がこの価格であれば十分価値があります。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Strymon Compadreに満足していなかったわけではありませんが、少し安く売られているのを見つけたので、UAFX Max Preamp &amp; Dual Compressorを購入してしまいました。</summary>
        </entry><entry xml:lang="en">
        <title>Anthropic Claude4を発表</title>
        <published>2025-05-23T00:00:00+00:00</published>
        <updated>2025-05-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/claude4/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/claude4/</id>
        
            <content type="html">&lt;p&gt;Anthropicが開発者会議「Code with Claude」で推論能力と深い思考能力が大きく向上した新しいモデルClaude 4を発表しました。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contens&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;Claude_4_の内容&quot;&gt;Claude 4 の内容&lt;&#x2F;h2&gt;
&lt;p&gt;Anthropicは2月に前世代の「Claude Sonnet 3.7」をリリースしてばかりですが、
OpenAIが4月にコンテキストウィンドウを拡大した「GPT-4.1」や、新しい推論モデル「o3」「o4-mini」を公開するなど
競合のAI開発企業も性能を引き上げているのに対抗して早期に新しいモデル投入して
きたのだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;まずはClaude Sonnet 3.7を基に改良を加えた&lt;strong&gt;Claude Sonnet 4&lt;&#x2F;strong&gt;です。
Sonnet3.7では過度に積極的な回答をする場合があったようですが、
今回Sonnet 4では適度に軽量化されているようです。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Claude Opus 4&lt;&#x2F;strong&gt;はより大規模で計算資源を要するモデルで、
特に難易度の高い課題を処理できるよう設計されているようです。
人間であれば数時間かかる作業を同モデルが短時間でこなす性能を示しているそうで
す。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_4の検証&quot;&gt;Claude 4の検証&lt;&#x2F;h2&gt;
&lt;p&gt;中島聡氏が&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SingularitySociety&#x2F;WorldModels&#x2F;&quot;&gt;Workd Models&lt;&#x2F;a&gt;
として公開している課題でいくつかテストしてみました。&lt;&#x2F;p&gt;
&lt;p&gt;「綿菓子の高さは８センチ、レンガの高さは７センチ。綿菓子の上にレンガを置くと
、高さは何センチ？」という課題に対して、それぞれの回答を確認してみましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Sonnet 3.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;この問題を解決するために、それぞれの高さを足し合わせます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の高さ: 8センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レンガの高さ: 7センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の上にレンガを置いた場合の全体の高さ:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8センチ + 7センチ = 15センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;したがって、綿菓子の上にレンガを置くと、高さは15センチになります。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Opus 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;では、綿菓子の高さとレンガの高さを足し算して、全体の高さを求めましょう。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の高さ: 8センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レンガの高さ: 7センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8センチ + 7センチ = 15センチ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;したがって、綿菓子の上にレンガを置くと、高さは15センチになります。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Sonnet 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の高さ8センチの上にレンガの高さ7センチを置くと、合計の高さは&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;15センチになります。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8 + 7 = 15センチです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Opus 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の上にレンガを置いた場合、綿菓子は軽くてふわふわしているため、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レンガの重さで押しつぶされてしまいます。綿菓子はほぼ完全に圧縮されて&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;しまうので、実質的な高さはレンガの高さである7センチになると考えられ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ChatGPT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子の上にレンガを置くと、綿菓子はつぶれてしまう可能性があります。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;そのため、綿菓子の高さ8センチとレンガの高さ7センチを単純に足して15&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;センチとは限りません。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;綿菓子は非常に柔らかく、重いレンガを置くとほとんど潰れてしまうこと&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;が多いです。もし綿菓子が完全につぶれたと仮定すると、高さはレンガの&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;高さだけの7センチになります。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;よって、実際の高さは7センチより少し上程度（綿菓子がどれだけ潰れるか&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;による）と考えられます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Claude 4の登場は、LLMの技術進化がもはや年単位ではなく「月単位」で進む時代に突入していることを改めて印象づけました。Sonnet 4は従来モデルの過剰応答傾向を抑制し、応答の一貫性・安定性を向上。一方、Opus 4は汎用的な知識応答を超え、タスクに応じた状況推論や人間的な判断に近づいています。&lt;&#x2F;p&gt;
&lt;p&gt;特に、綿菓子の課題のような「文脈理解」と「物理的直感」が求められるケースで、
Opus 4は従来の加算的な計算ではなく素材特性を踏まえた判断を下しています。
これは今後のエージェント系アプリケーションにも直結する進化です。&lt;&#x2F;p&gt;
&lt;p&gt;競合のChatGPT（GPT-4.1）も同様に高い水準にあり、両者はもはや単純な精度比較ではなく、「推論スタイル」や「コンテキスト処理のアプローチ」の差をどうプロダクトに活かすかが焦点になります。&lt;&#x2F;p&gt;
&lt;p&gt;Claude 4は「回答の速さ」や「正確さ」だけでは語りきれない次のフェーズに入りつつあり、開発者としては、タスクの性質や求める出力の粒度に応じたモデル選定の重要性が今後ますます増していくと感じました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Anthropic が開発者会議「Code with Claude」で推論能力と深い思考能力が大きく向上した新しいモデルClaude 4を発表しました。</summary>
        </entry><entry xml:lang="en">
        <title>Hudson Broadcastレビュー：クラシックなコンソールサウンドを現代に</title>
        <published>2025-05-20T00:00:00+00:00</published>
        <updated>2025-05-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/hudson-broadcast/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/hudson-broadcast/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;hudson-broadcast&amp;#x2F;broadcast.webp?h=6ed07df4ed0017f7f1a3&quot;
  alt=&quot;Hudson Broadcast&quot; width=&quot;969&quot; height=&quot;969&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;多くのブティックエフェクターが溢れる現代のギターシーンで、真に個性を放つペダルは稀有な存在です。英国Hudson Electronicsの「Broadcast」は、60年代放送コンソールの回路を再解釈した異色のオーバードライブで、クリーンブーストからファジーな歪みまでをカバー。そのユニークなゲルマニウム＆トランスの組み合わせは、デジタル時代に失われつつあるアナログの温かみと複雑さを呼び覚まします。このレビューでは、この特別なペダルの魅力に迫ります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._Hudson_Broadcastとは&quot;&gt;1. Hudson Broadcastとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4mfh0AC&quot;&gt;Hudson Broadcast&lt;&#x2F;a&gt;は、英国のHudson Electronicsが手作りで製造するエフェクターペ
ダルです。1960年代の放送用コンソールのプリアンプ回路にインスピレーションを得た
ユニークな設計が特徴となっています。このペダルは「ディスクリートクラスAゲルマニウムプ
リアンプでトランス回路を採用した」仕様となっており、現代のエフェクターとは一
線を画すビンテージサウンドを提供しています。&lt;&#x2F;p&gt;
&lt;p&gt;いくつかバリエーションがありますが、私購入したのはもっともベーシックなモデル
です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._Hudson_Broadcastの詳細&quot;&gt;2. Hudson Broadcastの詳細&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;コントロール&quot;&gt;コントロール&lt;&#x2F;h3&gt;
&lt;p&gt;Hudson Broadcastの見た目はシンプルで、各コントロールが効果的に機能します。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LEVEL&lt;&#x2F;strong&gt;：ペダル全体の出力ボリュームをコントロール&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GAIN SWITCH&lt;&#x2F;strong&gt;：ローゲイン、ミッドゲイン、ハイゲインのモードを切り替え&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GAIN TRIM&lt;&#x2F;strong&gt;：ゲインのレベルをコントロール。高い設定では信号の高域が緩やかにロールオフされる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LOW CUT&lt;&#x2F;strong&gt;：低域を減衰させる。このコントロールは回路の前段にあるため、ゲインコントロールと相互に作用する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;また、電圧V9で動作しますが、24Vまで昇圧して使用できるようです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;サウンド特性&quot;&gt;サウンド特性&lt;&#x2F;h3&gt;
&lt;p&gt;ローゲインモードでは、Broadcastはスパークリングクリーンブーストから透明感のあ
るオーバードライブまでカバーできます。ゲイントリムを上げていくと、トランス回
路とディスクリート回路が飽和し始め、緩やかでダイナミックなコンプレッションと
中音域の微妙な厚みを生み出します。&lt;&#x2F;p&gt;
&lt;p&gt;ハイゲイン設定ではトリムコントロールを上げると、温かみと少しFuzzな要素を
持った、より強いディストーションサウンドが得られます。Broadcastはダイナミッ
クな特性を維持しながら、幅広い歪み系トーンをカバーし、ピッキングのアタックや
繊細なニュアンスにもしっかり反応します。John Lennonが &quot;Revolution&quot;で演った
あのFuzzのような破壊的な音も出すことができます。&lt;&#x2F;p&gt;
&lt;p&gt;このペダルはピックアップのタイプによって調整が可能です。
ベースの少ないシングルコイルを使用する場合は、低域カットの量を減らすことができます。
一方、ベースが豊富なハムバッカーの場合は、
低域カットの量を増やして濁った音の発生を防ぐことができます。&lt;&#x2F;p&gt;
&lt;p&gt;実際の音は私なんかが弾くより、こちらの動画が分かりやすいと思います。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;m-col0HDi3E&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;個人的には、ストラトキャスターのリアピックアップとローゲイン設定を組み合わせた
時の豊かな低音と温かな歪みが特に印象的で、非常にムーディーなサウンドが作れる
ことに一発でほれ込みました。さらに意外だったのは、高ゲイン設定ではファズに近
い暴力的な歪みも可能で、一台で幅広いサウンドメイキングができる汎用性の高さで
す。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;他のペダルとの相性&quot;&gt;他のペダルとの相性&lt;&#x2F;h3&gt;
&lt;p&gt;Broadcastは「常時オン」のブースターとしても優れています。アンプの音を豊かに
し、真のサウンドを引き出す効果があります。ローゲインモードに設定し、ボリューム
とゲインを2時の位置に設定すると完璧に機能します。&lt;&#x2F;p&gt;
&lt;p&gt;また、他のオーバードライブやディストーションペダルとの組み合わせも効果的です
。Broadcastをクリーンブーストとして使用し、他のゲインペダルの前後に配置する
実験をすることで、最適な組み合わせを見つけることができます。&lt;&#x2F;p&gt;
&lt;p&gt;他の多くのゲルマニウムベースのペダルとは異なり、
前段にシリコントランジスタ、後段にゲルマニウムトランジスタを配置しています。
この回路構成によりペダルボード上の配置位置に神経を使う必要がありません。
従来のゲルマニウムファズが最高の音を
出すためにはシグナルチェーンの最初に配置する必要があるのに対し、Broadcastは
どこに配置しても問題なく機能します。&lt;&#x2F;p&gt;
&lt;p&gt;注意点としてはこのペダルは「位相反転&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;」を起こします。
ギターの音域ではそれほど神経質になることはないと思いますが、
バンドなどアンサンブルの中で使う場合は覚えておいたほうが良いかもしれません。
ちなみにBOSS DS-1も位相反転します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3._エフェクターボードの一新&quot;&gt;3. エフェクターボードの一新&lt;&#x2F;h2&gt;
&lt;p&gt;このHudson Broadcastを購入して、山ほどあったオーバードライブやブースターをす
べて処分しました。残したのは次の3つだけです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Free The Tone Overdriveland&lt;&#x2F;li&gt;
&lt;li&gt;Hudson Broadcast&lt;&#x2F;li&gt;
&lt;li&gt;BOSS DF-2 (ボードからは外しています)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;基本的にはOverdrivelandとBroadcast、それにSimplifier MK-IIだけで、
よほどのハイゲインでなければカバーできるかなと思っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4._まとめ&quot;&gt;4. まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Hudson Broadcastは単なるオーバードライブペダルではなく、ビンテージコンソール
の魅力をギターのシグナルチェーンに取り入れる独特のツールです。手作りならでは
の品質と、細部へのこだわりが随所に感じられる製品です。&lt;&#x2F;p&gt;
&lt;p&gt;価格は決して安くありませんが、その音質と汎用性を考えると十分な価値がありま
す。クラスAのゲルマニウム回路とトランス設計によるこのペダルは、単なるエフェ
クターを超えて、音色に新たな表現力を与えてくれるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;ローゲインからハイゲインまでの多彩なサウンドメイキングが可能で、特に1970年代
半ば以前のブリティッシュロックギタートーンを求めるプレイヤーや、ギターのボリ
ュームとトーンノブで細かくサウンドを形作りたいプレイヤーにとって、非常に魅力
的な選択肢となるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;手作りの美しさと実用性、そして何より素晴らしいサウンドを兼ね備えたHudson
Broadcastは、長く使い続けたくなるエフェクターの1つです。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;正確には「ポラリティ反転」（polarity inversion） &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">多くのブティックエフェクターが溢れる現代のギターシーンで、真に個性を放つペダルは稀有な存在です。英国Hudson Electronicsの「Broadcast」は、60年代放送コンソールの回路を再解釈した異色のオーバードライブで、クリーンブーストからファジーな歪みまでをカバー。そのユニークなゲルマニウム＆トランスの組み合わせは、デジタル時代に失われつつあるアナログの温かみと複雑さを呼び覚まします。このレビューでは、この特別なペダルの魅力に迫ります。</summary>
        </entry><entry xml:lang="en">
        <title>DJI Air3S 初飛行</title>
        <published>2025-05-17T00:00:00+00:00</published>
        <updated>2025-05-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/dji-air3s-flight/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/dji-air3s-flight/</id>
        
            <content type="html">&lt;p&gt;購入していたDJI Air3Sの初飛行です。ドローンを飛ばすために必要なこともまとめておきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の飛行&quot;&gt;実際の飛行&lt;&#x2F;h2&gt;
&lt;p&gt;実際の飛行の様子です。
編集は適当です。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;AvvVyyDk6ew&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;今回自動航行も予定していましたが、崖で視界の確保できない不安があったの
ですべてマニュアルで飛ばしました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;日本でドローンを飛ばすために&quot;&gt;日本でドローンを飛ばすために&lt;&#x2F;h2&gt;
&lt;p&gt;空撮にドローンを使おうとすると必然的に100g以上のドローンになりますが、
日本の場合100g以上のドローンは航空法の制限を受けます。&lt;&#x2F;p&gt;
&lt;p&gt;絶対に目視飛行だけの一般的な飛行しか行わないなら別ですが、
空撮に使うという時点で操縦装置のディスプレイを見ることがあるでしょうから、そ
の時点で目視外飛行となり「特定飛行」と見なされるので、
次の物が必要となります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;機体認証&lt;&#x2F;li&gt;
&lt;li&gt;飛行承認&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;機体認証&quot;&gt;機体認証&lt;&#x2F;h3&gt;
&lt;p&gt;まず機体認証ですが、2025年5月の時点でコンシューマー向けの機体で
認証を通っているものはありません。&lt;&#x2F;p&gt;
&lt;p&gt;国土交通省が認証した機体を&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mlit.go.jp&#x2F;koku&#x2F;certification.html#anc02&quot;&gt;公開&lt;&#x2F;a&gt;
していますが、DJIの機体などありません。
産の4Kg以上の機体がいくつかあるだけです。&lt;&#x2F;p&gt;
&lt;p&gt;忘れましょう。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;飛行承認&quot;&gt;飛行承認&lt;&#x2F;h3&gt;
&lt;p&gt;「特定飛行」の場合は&lt;strong&gt;国土交通省の承認&lt;&#x2F;strong&gt;が必要です。
詳しいフローは国土交通省の次のフローを見ましょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;dji-air3s-flight&amp;#x2F;flow.png?h=ba2ba2824269cf0c0fc3&quot;
  alt=&quot;Flow&quot; width=&quot;1927&quot; height=&quot;864&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;条件を緩和しても「目視外飛行」が入ってしまうと、
ほぼ許可が必要な「カテゴリーII飛行」となることがわかります。&lt;&#x2F;p&gt;
&lt;p&gt;この飛行承認では、操縦者の技量も審査され飛行経験などが問われます。
ただ、そうすると技量と積むための飛行の承認はどうやって取るかという問題になり
ます。この部分を一番手っ取り早く解決するのは「&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;04&#x2F;drone-lisence&#x2F;&quot;&gt;二等無人航空機操縦士&lt;&#x2F;a&gt;」
の資格を取ってしまうの事です。私は目視外飛行、夜間飛行の限定解除付で
資格取得をしました。&lt;&#x2F;p&gt;
&lt;p&gt;では、資格があれば飛行承認は不要かというとそうではありません。
資格で自由に飛ばせる条件は「認証機体」を使用することです。前述の通り、
そんな機体はほぼありませんから、資格を取っても承認を取る必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;多くの人は面倒なので、全国どこでも1年間飛ばすという「包括申請」という形になります。&lt;&#x2F;p&gt;
&lt;p&gt;4月から申請方法が緩和されたので、資格さえあれば比較的簡単に承認を取ることが
できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;地主・管理者の承認&quot;&gt;地主・管理者の承認&lt;&#x2F;h3&gt;
&lt;p&gt;個別の飛行には、国土交通省の飛行承認と別に土地の所有者や管理者の上空を飛行する承認が必要となります。
川や海、山なども管理している国、自治体の組織があるので承認をもらう必要があり
ます。&lt;&#x2F;p&gt;
&lt;p&gt;今回は自分で手続きするのが面倒だったので、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flyers.plus&#x2F;&quot;&gt;Flyers&lt;&#x2F;a&gt;とい
うサービスを利用しました。自分に替わって、土地の管理者の方の承認から地元警察
への事前通報まで行政書士さんがすべてやってくれます。&lt;&#x2F;p&gt;
&lt;p&gt;一件あたり1,500〜1,800円とリーズナブルで、確実に処理いただけます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;飛行計画&quot;&gt;飛行計画&lt;&#x2F;h3&gt;
&lt;p&gt;飛行する際には、包括申請を行っている場合でも国土交通省に飛行計画を通報する必
要があります。これは同じ時間帯、同じ空域で飛行が重複することを防ぐために重要
です。実際、調整が入ることもあります。&lt;&#x2F;p&gt;
&lt;p&gt;通報は、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ossportal.dips.mlit.go.jp&#x2F;portal&#x2F;top&#x2F;&quot;&gt;DIPS2.0&lt;&#x2F;a&gt;という国
土交通省のシステムからオンラインで行えます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;飛行記録&quot;&gt;飛行記録&lt;&#x2F;h3&gt;
&lt;p&gt;飛行の際には、事前点検、内容、事後点検などを記録することが求められます。
国土交通省からフォーマットが示されていますが、さすがに紙やEXCELで
現地記入するのは厳しいのでなんからのツールやサービスを使ったほうがよいかと思います。&lt;&#x2F;p&gt;
&lt;p&gt;私は、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fwritedown.com&#x2F;&quot;&gt;Fwrite Down&lt;&#x2F;a&gt;というサービスを利用しています。
無料な上に、スマートフォンでもPC&#x2F;Macからでも同じように操作できるからです。&lt;&#x2F;p&gt;
&lt;p&gt;最小限の機能に絞ってありますが、国土交通省のフォーマットには準拠しているので
安心です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">購入していたDJI Air3S の初飛行です。ドローンを飛ばすために必要なこともまとめておきました。</summary>
        </entry><entry xml:lang="en">
        <title>Feedback&#x27;s Feel</title>
        <published>2025-05-17T00:00:00+00:00</published>
        <updated>2025-05-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/feedbacks-feel/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/feedbacks-feel/</id>
        
            <content type="html">&lt;p&gt;ディストーションにBOSS DF-1を使っていて、うっかり位相をそのままミックスダウンしていました。修正版です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;feedbacks-feel&amp;#x2F;feedback.png?h=7c5c325e52002a20546a&quot;
  alt=&quot;&quot; width=&quot;1024&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;「なんあエンディングでディストーションの音が埋もれてるなぁ」と思ったら、
ポラリティ反転を放置していました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;yuGNJLlGflg&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;クリーンとディストーションの効いたギターが交互に絡み合う曲です。&lt;&#x2F;p&gt;
&lt;p&gt;エンディングにギターのフィードバックが延々と続きますが、
そんな大音量でアンプを鳴らせないのでBOSS DF−2を中古で買いました。
ちょっとわざとらしいフィードバック音ですが、雰囲気は出ているかと。
もう廃盤になってかなり経ちますが、一定のニーズがあるのか高かったです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ディストーションにBOSS DF-1を使っていて、うっかり位相をそのままミックスダウンしていました。修正版です。</summary>
        </entry><entry xml:lang="en">
        <title>Landslide</title>
        <published>2025-05-05T00:00:00+00:00</published>
        <updated>2025-05-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/landslide/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/landslide/</id>
        
            <content type="html">&lt;p&gt;Fleetwood MacのStevie Nicksの懐かしい1970年代の名曲を弾いてみました。親しい人の苦難を週末に聞いてショックを受けてしまいました。落ち込む中でこの曲がなとなく頭に浮かびました。&lt;&#x2F;p&gt;
&lt;p&gt;I tried playing Stevie Nicks&#x27; famous song from Fleetwood Mac that I used to
listen to often on the radio when I was a student. I was reminded of this
song after hearing about my family&#x27;s hardships over the weekend, which
shocked me. Though I don&#x27;t fully understand the true meaning of this song,
to me it seems to express determination in the face of fear of collapse and
anxiety about the future.&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2090208615&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;landslide&quot; title=&quot;LandSlide&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;LandSlide&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">Fleetwood MacのStevie Nicksの懐かしい1970年代の名曲を弾いてみました。親しい人の苦難を週末に聞いてショックを受けてしまいました。落ち込む中でこの曲がなとなく頭に浮かびました。</summary>
        </entry><entry xml:lang="en">
        <title>NeoVimからClaude Codeを使う</title>
        <published>2025-05-04T00:00:00+00:00</published>
        <updated>2025-05-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/claude-code-nvim/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/claude-code-nvim/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;claude-code-nvim&amp;#x2F;claude-code-nvim.webp?h=ef29ff190878e35e43bc&quot;
  alt=&quot;Claude-Code-Nvim&quot; width=&quot;1735&quot; height=&quot;1212&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;AnthropicのDeveloper Partner ProgramにJoinしてClaude Codeを使うモチベーションが高まっています。Claude CodeをNeoVimから使用するためのClaude Code Neovim Pluginをインストールしました。Claude Code Neovim PluginをNeoVimで使う方法を説明します。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
## Claude Code Neovim Plugin
&lt;p&gt;今回導入したのは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;greggh&#x2F;claude-code.nvim&quot;&gt;Claude Code Neovim Plugin&lt;&#x2F;a&gt; &lt;code&gt;claude-code.nvim&lt;&#x2F;code&gt; です。&lt;&#x2F;p&gt;
&lt;p&gt;基本的にやっていることはNeoVimのターミナルを使い、Claude Codeを呼び出してい
るようです。&lt;&#x2F;p&gt;
&lt;p&gt;次のような機能がサポートされます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ターミナルウィンドウでキー一押しだけでClaude Codeを切り替え&lt;&#x2F;li&gt;
&lt;li&gt;--continueなどのコマンドライン引数やカスタムバリアントのサポート&lt;&#x2F;li&gt;
&lt;li&gt;Claude Codeによって変更されたファイルを自動検出して再読み込み&lt;&#x2F;li&gt;
&lt;li&gt;ファイルが外部で変更された際のリアルタイムバッファ更新&lt;&#x2F;li&gt;
&lt;li&gt;カスタマイズ可能なウィンドウ位置とサイズ&lt;&#x2F;li&gt;
&lt;li&gt;which-key（利用可能な場合）との統合&lt;&#x2F;li&gt;
&lt;li&gt;作業ディレクトリとしてgitプロジェクトのルートを自動的に使用（利用可能な場合）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;当たり前ですが、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;anthropics&#x2F;claude-code&quot;&gt;Claude Code CLI&lt;&#x2F;a&gt;がインストールされている必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;注意点としては、Claude Desktopなどを呼び出しているのでなく、Claude Codeを呼
び出しているため、　&lt;strong&gt;APIの使用料がかかります&lt;&#x2F;strong&gt;。 Claude APIでなくClaude
Codeをの呼び出しているため、Anthropic Developer Partner Programeのディスカウン
ト対象とはなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;claud-code.nvimのインストール&quot;&gt;&lt;code&gt;claud-code.nvim&lt;&#x2F;code&gt;のインストール&lt;&#x2F;h2&gt;
&lt;p&gt;私はプラグインマネージャーとして &lt;code&gt;lazy.nvim&lt;&#x2F;code&gt;を使っているので
以下の設定でインストール完了です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;greggh&#x2F;claude-code.nvim&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  dependencies&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;nvim-lua&#x2F;plenary.nvim&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;-- Required for git operations&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; function&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;claude-code&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;).&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;claude-code.nvimの使い方&quot;&gt;&lt;code&gt;claude-code.nvim&lt;&#x2F;code&gt;の使い方&lt;&#x2F;h2&gt;
&lt;p&gt;このプラグインは先週インストールして試していたのですが、
今週になって起動方法が追加される名で週末に更新されていました。&lt;&#x2F;p&gt;
&lt;p&gt;基本的な機能は次の通りです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機能&lt;&#x2F;th&gt;&lt;th&gt;コマンド&lt;&#x2F;th&gt;&lt;th&gt;キーアサイン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;起動&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;:ClaudeCode&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;C-,&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;最後の会話を再開&lt;&#x2F;td&gt;&lt;td&gt;:ClaudeCodeContinue&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;cC&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;会話ピッカーで選択して再開&lt;&#x2F;td&gt;&lt;td&gt;:ClaudeCodeResume&lt;&#x2F;td&gt;&lt;td&gt;N&#x2F;A&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Verboseモード&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;:ClaudeCodeVerbose&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;leader&amp;gt;cV&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Claude Codeターミナルでは次のキーが使用できます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;C-h&amp;gt;&lt;&#x2F;code&gt;,&lt;code&gt;&amp;lt;C-j&amp;gt;&lt;&#x2F;code&gt;,&lt;code&gt;&amp;lt;C-k&amp;gt;&lt;&#x2F;code&gt;,&lt;code&gt;&amp;lt;C-l&amp;gt;&lt;&#x2F;code&gt; : ウィンドウ間の移動&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;C-f&amp;gt;&lt;&#x2F;code&gt;,&lt;code&gt;&amp;lt;C-b&amp;gt;&lt;&#x2F;code&gt;: ページスクロール&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はClaude CodeをNeoVimから直接使用できる &lt;code&gt;claude-code.nvim&lt;&#x2F;code&gt; プラグインを紹介しました。ターミナルからClaude Codeを呼び出す方法よりも、コーディング作業の流れを止めることなくAIの支援を受けられるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;このプラグインを使うことで、NeoVim内で簡単にClaude Codeへアクセスでき、
シームレスなコードの修正や生成を行えるようになります。特にgitプロジェクトの
コンテキストを自動的に認識する機能は、大規模なプロジェクトでの作業に役立ちま
す。&lt;&#x2F;p&gt;
&lt;p&gt;一点注意が必要なのは、API使用料がかかる点です。ただし、Anthropic Developer Partner Programに参加している場合は割引が適用されるので、Claude APIを直接呼び出すより合理的です。コーディング効率向上のためのツールとして、検討する価値は十分にあるでしょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Anthropic の Developer Partner Program に Join してClaude Codeを使うモチベーションが高まっています。Claude CodeをNeoVimから使用するためのClaude Code Neovim Pluginをインストールしました。Claude Code Neovim Plugin を NeoVim で使う方法を説明します。</summary>
        </entry><entry xml:lang="en">
        <title>Claude Codeのディスカウントを得る - Developer Partner Program</title>
        <published>2025-05-02T00:00:00+00:00</published>
        <updated>2025-05-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/anthropics-developer-partner-program/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/anthropics-developer-partner-program/</id>
        
            <content type="html">&lt;p&gt;Claude Code APIの利用料割引が可能となるDeveloper Partner ProgrameがAnthropicより発表されました。今後のモデル改善のためのプログラムで参加するとClaude 3.5 SonnetおよびClaude 3.7SonnetモデルのClaude Code入力トークンが30%割引になる可能性があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Anthropic&amp;#39;s_Developer_Partner_Programのポイント&quot;&gt;Anthropic&#x27;s Developer Partner Programのポイント&lt;&#x2F;h2&gt;
&lt;p&gt;AnthropicのClaudeは基本的にユーザーの入力をトレーニングに使用しませんが、
この &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.anthropic.com&#x2F;en&#x2F;articles&#x2F;11174108-about-the-development-partner-program&quot;&gt;Anthropic&#x27;s Developer Partner Program&lt;&#x2F;a&gt; では、Anthropicのサービスやモデルトレーニングを改善
するために、Claude Codeセッションを自主的にAnthropicと共有することになります。&lt;&#x2F;p&gt;
&lt;p&gt;その代わりに、Claude 3.5 SonnetとClaude 3.7 SonnetのClaude Code入力トークンに対して、
標準API価格から30%オフを受けることができます。具体的には次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;標準入力: 100万トークンあたり-$0.9&lt;&#x2F;li&gt;
&lt;li&gt;キャッシュ書き込み: 100万トークンあたり-$1.125&lt;&#x2F;li&gt;
&lt;li&gt;キャッシュ読み取り: 100万トークンあたり-$0.09&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;利用するに当たっては、次のような注意点があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AnthropicのファーストパーティAPIからのClaude Codeの入出力トークンのみが共
有され、ClaudeアプリやClaude Code以外のAPI呼び出しには適用されない。
つまり、Amazon Bedrockなどを経由するとプログラムは適用されず割引の対象外である&lt;&#x2F;li&gt;
&lt;li&gt;データは最大2年間安全に保存される。モデルトレーニングに使用されるデータは
他の顧客情報と関連付けらない&lt;&#x2F;li&gt;
&lt;li&gt;この設定は組織内のすべてのメンバーに適用される&lt;&#x2F;li&gt;
&lt;li&gt;プログラムに登録した場合、組織内のすべてのメンバーに通知される&lt;&#x2F;li&gt;
&lt;li&gt;いつでもプログラムから離脱可能だが、以前に共有されたデータは削除不可&lt;&#x2F;li&gt;
&lt;li&gt;割引は請求後2025年7月31日まで適用され、プログラムを離脱すると終了する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;プログラムへの参加方法&quot;&gt;プログラムへの参加方法&lt;&#x2F;h2&gt;
&lt;p&gt;AnthropicのConsoleの設定(Claudeの設定画面でないことに注意)から、
「Privacy Controls」を開いて「Join our Development Partner Program to help improve Claude」
で「Join」ボタンを押すだけです。&lt;&#x2F;p&gt;
&lt;p&gt;離脱時は、「Leave」ボタンが現れるので、押すとプログラムを離脱できます。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、すべてのアカウントがこのプログラムの対象ではないようです。
アカウントが対象でない場合は、上記の参加オプションが表示されません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;どれくらいの人がClaude Codeを使っているわかりませんが、GitHub Copilotのよう
「コード入力支援」を超えClaude Codeは優れた開発者とペアプログラミングしているような
錯覚に陥るほど生産性が上がります。&lt;&#x2F;p&gt;
&lt;p&gt;このため、Claude Codeの利用料が30%の割引となるのは魅力的です。
参加をためらうとしたら、「自身のコンテンツが学習に利用される」という
プライバシーの点でしょう。業務で利用している場合は、成果物が他社に共有される
ことになるためハードルが高そうです。&lt;&#x2F;p&gt;
&lt;p&gt;私自身は個人の活動で利用なので、プライバシーの観点での懸念はありません。
自身のClaude Codeセッションを共有することでClaudeのコーディング能力向上に
寄与し、AIによるコーディング支援技術の発展できることはモチベーションにも繋が
ります。
更に割引まで恩恵を受けることができるならば参加しない理由はないため、即座に参加しました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Claude Code APIの利用料割引が可能となるDeveloper Partner ProgrameがAnthropicより発表されました。今後のモデル改善のためのプログラムで参加するとClaude 3.5 Sonnet および Claude 3.7Sonnet モデルの Claude Code 入力トークンが30%割引になる可能性があります。</summary>
        </entry><entry xml:lang="en">
        <title>Free The Tone - Overdriveland</title>
        <published>2025-05-02T00:00:00+00:00</published>
        <updated>2025-05-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/05/ftt-overdriveland/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/05/ftt-overdriveland/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;05&amp;#x2F;ftt-overdriveland&amp;#x2F;od1.webp?h=68b691e171c82529454b&quot;
  alt=&quot;Overdriveland&quot; width=&quot;1000&quot; height=&quot;850&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Free The ToneのオーバードライブOverdrivelandを購入しました。2023年末に発売されて2024年は入荷待ちになるほど人気でしたが、使ってみると確かに究極のオーバードライブと言われるのもわかります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Overdrivelandとは&quot;&gt;Overdrivelandとは&lt;&#x2F;h2&gt;
&lt;p&gt;Free The Toneの「Overdriveland」は、伝説的なDUMBLEアンプのサウンドとフィーリ
ングを再現することを目指して開発されたオーバードライブペダルです。設計者であ
る林幸宏氏は、20台以上のDUMBLEアンプのメンテナンス・修理経験を持ち、自身も複
数のDUMBLEアンプを所有し、その経験を基にDUMBLEアンプ特有の
倍音やタッチレスポンスをペダルで再現することに挑戦したエフェクターです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Overdrivelandの特徴と評価&quot;&gt;Overdrivelandの特徴と評価&lt;&#x2F;h2&gt;
&lt;p&gt;「DUMBLEアンプ」は、
故アレクサンダー・ハワード・ダンブル氏が完全ハンドメイドで年に2〜3台だけ、
彼が認めたミュージシャン向けにしか制作しなかったと言います。
現存する数も限られており数千万で取引されているアンプです。
当然聞いたことがないので、DUMBLEアンプの音が出ているかどうかは評価できません
が、オーバードライブとしては非常に上質で人気なのも分かります。&lt;&#x2F;p&gt;
&lt;p&gt;特徴はノーマルチャンネルとドライブチャンネルの「&lt;strong&gt;2チャンネル構成&lt;&#x2F;strong&gt;」であることです。:
正確にはドライブチャンネルはノーマルチャネルを経由して出力されるので、
2チャンネルというよりドライブチャネルをプリアンプ的に捉えたほうがよいと思い
ます。&lt;&#x2F;p&gt;
&lt;p&gt;ノーマルチャンネルの歪み具合はTube Screamerに近く、クリーンからクランチまでの
サウンドを作成できます。ドライブチャンネルでは、「PUSH」でノーマルチャンネル
にかける音圧を調整し歪み具合が決まります。Tube Screamerなどをブースター的に
使う際にLevelでアンプの歪みを調整するのと同じ理屈です。&lt;&#x2F;p&gt;
&lt;p&gt;「DRIVE」つまみはGAINの調整とされていますが、歪み量はほとんど変化しません。
つまみを上げていくとサチュレーション感やコンプレッション感が増していく印象で
す。&lt;&#x2F;p&gt;
&lt;p&gt;決してハイゲインではなく限られた歪み量ですが、このノーマルチャネルとドライブ
チャンネルを使って細かく歪みのキャラクター調整できます。&lt;&#x2F;p&gt;
&lt;p&gt;もう1つの特徴は「&lt;strong&gt;電圧切替機能&lt;&#x2F;strong&gt;」です。スタンダードモデルでは9Vと14V固定ですが、
私が購入したカスタムショップモデル（ODL-1-CS）では、9Vと10〜19Vまで無段階に
昇圧が可能です。昇圧すると歪み感は押さえられヘッドルームが広がり
輪郭のはっきりした押し出し感のある音になります。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;04&#x2F;27&#x2F;we-are-all-alone&quot;&gt;先日Xotic AC Booster V2で弾いた&lt;&#x2F;a&gt;曲を
Overdrivelandでも弾いてみました。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;SoundCloudEmbed
  apiurl=&quot;https:&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;2088586791&quot;
  url=&quot;&lt;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;we-are-all-alone-overdriveland&#x2F;s-raWcXXiO0f9&gt;&quot;
  title=&quot;We Are All Alone - Overdriveland&quot;
&#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;総評&quot;&gt;総評&lt;&#x2F;h2&gt;
&lt;p&gt;「Overdriveland」は、DUMBLEアンプのサウンドを再現できているかどうかわかりま
せんが、
非常にタッチセンシティブでニュアンスを忠実に反映する繊細なオーバードライブ
エフェクターとなっています。ハイゲインではありませんが、2つのチャンネルで
歪みのキャラクターを細かくセッティングが可能です。前段か後段に別のオーバード
ライブを置いても良いかも知れません。&lt;&#x2F;p&gt;
&lt;p&gt;タッチに反応するので、演奏の技量がそのまま音に出ていまいます。
私のような腕前では持て余すことは確実ですが、それでも弾いていて気持ちよいエフ
ェクターです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4cUWTDA&quot;&gt;Amazonで購入&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;a.r10.to&#x2F;h5KBTJ&quot;&gt;楽天で購入&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Free The Toneのオーバードライブ Overdrivelandを購入しました。2023年末に発売されて2024年は入荷待ちになるほど人気でしたが、使ってみると確かに究極のオーバードライブと言われるのもわかります。</summary>
        </entry><entry xml:lang="en">
        <title>SoundCloud API仕様の変更</title>
        <published>2025-04-28T00:00:00+00:00</published>
        <updated>2025-04-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/soundcloud-api-changed/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/soundcloud-api-changed/</id>
        
            <content type="html">&lt;p&gt;直近数日の内にSoundCloudはAPIの仕様を変更したようです。自作のTypeScriptコンポーネントがうまく機能しなくなったために対応しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;変更のポイント&quot;&gt;変更のポイント&lt;&#x2F;h2&gt;
&lt;p&gt;以下のコードは以前使用していたものでSoundCloudの曲をWebに埋め込むためのコー
ドです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;export const&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; SoundCloudEmbed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; React&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;FC&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;SoundCloudEmbedProps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; ({&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; })&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; SoundCloud の埋め込み URL 形式に変換&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; embedUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;encodeURIComponent&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;w-full&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;100%&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;166&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        scrolling&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;no&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        frameBorder&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;no&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;autoplay&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;        src&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;embedUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;      &amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;text-[10px] text-gray-400 overflow-hidden whitespace-nowrap text-ellipsis font-light&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          href&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Yostos&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          target&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;_blank&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          Yostos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;nbsp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;·&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;nbsp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          href&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Yostos&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          target&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;_blank&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt;          className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          Blackbird&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;      &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;以前はiframeのsrcに指定するurlは曲ページへのリンクと同じリンクを指定すればよかった
のですが、ここ数日の変更でiframeのsrcの指定はAPI専用のURLでなければならなく
なったようです。&lt;&#x2F;p&gt;
&lt;p&gt;この変更は既にアップロードされている曲には遡及していないようで、直近にアップ
ロードした曲のみに影響しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;SoundCloudEmbed_コンポーネントの変更&quot;&gt;SoundCloudEmbed コンポーネントの変更&lt;&#x2F;h2&gt;
&lt;p&gt;本来はSoundCloudでJavascriptのコードを取得すべきです。
このブログではMDXを使っている関係で取得したコードでは修正が必要なため、
&lt;code&gt;SoundCloudEmbed&lt;&#x2F;code&gt;というコンポーネントを作っていました。
この変更でShare Linkのみ指定していたSoundCloudEmbedは動かなくなりました。&lt;&#x2F;p&gt;
&lt;p&gt;仕方がないのでAPI用のURLを指定できようように修正しました。またタイトルの固定
でなく曲名を指定できるよう変更しています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; SoundCloudEmbedProps&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  apiurl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; Optional API URL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; Optional title&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;export const&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; SoundCloudEmbed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; React&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;FC&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;SoundCloudEmbedProps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  apiurl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  title&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-function z-arrow z-ts&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; SoundCloud の埋め込み URL 形式に変換&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; If apiurl is provided, use it for the iframe source, otherwise use the url&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; sourceUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; apiurl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; embedUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;encodeURIComponent&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;sourceUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; Prepare the display title&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; displayTitle&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `Yostos - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;Yostos&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;div className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;w-full&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;100%&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;166&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        scrolling&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;no&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        frameBorder&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;no&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;autoplay&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        src&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;embedUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;      &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;div className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;text-[10px] text-gray-400 overflow-hidden whitespace-nowrap text-ellipsis font-light&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          href&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          title&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;displayTitle&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          target&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;_blank&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          rel&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          className&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        &amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;displayTitle&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;      &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;API用URLだけ取得はできないので、結局埋め込み用のJavascriptのコードをSoundCloudから取得してURLを取り出して貼り付けることになります。
手間は貼り付けるより面倒なので、コンポーネントにした意味がないかもしれません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">直近数日の内にSoundCloudはAPIの仕様を変更したようです。自作のTypeScriptコンポーネントがうまく機能しなくなったために対応しました。</summary>
        </entry><entry xml:lang="en">
        <title>Fender 70th Anniversary American Vintage II 1954 Stratocaster</title>
        <published>2025-04-27T00:00:00+00:00</published>
        <updated>2025-04-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/stratocaster-1954/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/stratocaster-1954/</id>
        
            <content type="html">&lt;p&gt;I always wanted an original Fender🎸 at least once in my life. And by purechance, I stumbled upon a 70th Anniversary American Vintage II 1954Stratocaster and it&#x27;s only 3.5Kg - an absolute gem. I sped off in mycar and bought it on the spot. Now, I&#x27;ll let it sit for a while to cool off.&lt;&#x2F;p&gt;
&lt;p&gt;そう言えば、昨年購入したストラトを仕様を忘れそうなので残しておきましょう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;04&amp;#x2F;stratocaster-1954&amp;#x2F;strato.webp?h=e67a1bc3e68aaa9625b5&quot;
  alt=&quot;Stratocaster&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;70周年記念モデル&quot;&gt;70周年記念モデル&lt;&#x2F;h2&gt;
&lt;p&gt;ストラトキャスター誕生70周年記念モデルとして昨年発売されたモデルです。&lt;&#x2F;p&gt;
&lt;p&gt;American Vintage IIシリーズです。Fenderのラインナップの中でも伝統的な
位置づけを持つモデルです。
基本的に特定の年代のFenderギターを忠実に再現しようとする「レプリカ」
または「リイシュー」モデルです。&lt;&#x2F;p&gt;
&lt;p&gt;位置づけとしては、現代的な改良を加えたAmerican Professionalや、
カスタムショップのマスタービルダーによる高級な
Custom Shopモデルの間に位置するプレミアムモデルです。&lt;&#x2F;p&gt;
&lt;p&gt;メイプルネックなのはもちろんですが、
それだけでなく1954年当時のモデルを忠実に復刻してます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ピックアップカバーも当時のシェイプに変更&lt;&#x2F;li&gt;
&lt;li&gt;ピックアップは当時のヴォイシングを再生するようにチューンされた70th
Anniversary 18953 single-Coil Stratピックアップという専用品&lt;&#x2F;li&gt;
&lt;li&gt;ボディはアッシュ材&lt;&#x2F;li&gt;
&lt;li&gt;スイッチは三点式（ハーフトーンが面倒だが、一応五点式も付属している）&lt;&#x2F;li&gt;
&lt;li&gt;バックプレートの穴も当時と同じく真円&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;細かい仕様は次の通りです。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;BODY&lt;&#x2F;dt&gt;
  &lt;dd&gt;Ash&lt;&#x2F;dd&gt;
  &lt;dt&gt;FINISH&lt;&#x2F;dt&gt;
  &lt;dd&gt;Gloss Nitrocellulose Lacquer&lt;&#x2F;dd&gt;
  &lt;dt&gt;NECK&lt;&#x2F;dt&gt;
  &lt;dd&gt;1-Piece Maple&lt;&#x2F;dd&gt;
  &lt;dt&gt;NECK SHAPE&lt;&#x2F;dt&gt;
  &lt;dd&gt;1954 &quot;C&quot;&lt;&#x2F;dd&gt;
  &lt;dt&gt;SCALE&lt;&#x2F;dt&gt;
  &lt;dd&gt;25.5&quot; (648 mm)&lt;&#x2F;dd&gt;
  &lt;dt&gt;FINGERBOARD&lt;&#x2F;dt&gt;
  &lt;dd&gt;Maple&lt;&#x2F;dd&gt;
  &lt;dt&gt;RADIUS&lt;&#x2F;dt&gt;
  &lt;dd&gt;7.25&quot; (184.1 mm)&lt;&#x2F;dd&gt;
  &lt;dt&gt;FRET&lt;&#x2F;dt&gt;
  &lt;dd&gt;Vintage Style 21&lt;&#x2F;dd&gt;
  &lt;dt&gt;NUT&lt;&#x2F;dt&gt;
  &lt;dd&gt;Bone&lt;&#x2F;dd&gt;
  &lt;dt&gt;NUT WIDTH&lt;&#x2F;dt&gt;
  &lt;dd&gt;1.625&quot; (41.3 mm)&lt;&#x2F;dd&gt;
  &lt;dt&gt;PICKUP&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    70th Anniversary 1954 Single-Coil Strat
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;BRIDGE&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    Pure Vintage Synchronized Tremolo with Bent Steel Saddles Includes Chrome
    Bridge Cover
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;TREMOLO ARM&lt;&#x2F;dt&gt;
  &lt;dd&gt;&#x27;50s Vintage Style&lt;&#x2F;dd&gt;
  &lt;dt&gt;TUNING MACHINE&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    Pure Vintage Single Line &quot;Fender Deluxe&quot;
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;3.5Kgを切れ&quot;&gt;3.5Kgを切れ&lt;&#x2F;h2&gt;
&lt;p&gt;昨年1981年製Fernandes RST-50 THE REVIVALを手に入れて「本物ほしい」病気を
患っていたところに、よいタイミングで70周年記念モデルです。次の80周年記念モデ
ルまで生きているかわからないので、買うしかないでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;当時片っ端からこのモデルを売っているお店でギターの重量を比較して
わざわざこのギターは町田まで購入しに行ってきました。アッシュ材自体の入手が
困難なためか、3.5Kg〜4.0Kgと結構重量にばらつきがありました。3.5Kgを切ってい
たのはこの個体だけでした。&lt;&#x2F;p&gt;
&lt;p&gt;軽いアッシュボディとメイプルのネックのためか、明るくからりと乾いた良い音がします。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I always wanted an original Fender🎸 at least once in my life. And by purechance, I stumbled upon a 70th Anniversary American Vintage II 1954Stratocaster and it&#x27;s only 3.5Kg  - an absolute gem. I sped off in mycar and bought it on the spot. Now, I&#x27;ll let it sit for a while to cool off.</summary>
        </entry><entry xml:lang="en">
        <title>連休にまったりとギターを楽しむ</title>
        <published>2025-04-27T00:00:00+00:00</published>
        <updated>2025-04-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/we-are-all-alone/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/we-are-all-alone/</id>
        
            <content type="html">&lt;p&gt;五月の穏やかな午後に柔らかな日差しを浴びながら、まったりとストラトキャスターで先日購入したAC Booster V2を楽しみました。このシンプルな瞬間こそが、私にとっての最高の贅沢なのかもしれません。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2086283364&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;we-are-all-alone-downtempo&quot; title=&quot;We Are All Alone - Downtempo version&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;We Are All Alone - Downtempo version&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">五月の穏やかな午後に柔らかな日差しを浴びながら、まったりとストラトキャスターで先日購入した AC Booster V2 を楽しみました。このシンプルな瞬間こそが、私にとっての最高の贅沢なのかもしれません。</summary>
        </entry><entry xml:lang="en">
        <title>MCP接続でClaudeにBlenderで3Dモデリングさせてみた</title>
        <published>2025-04-23T00:00:00+00:00</published>
        <updated>2025-04-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/blender-mcp/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/blender-mcp/</id>
        
            <content type="html">&lt;p&gt;Blender界隈でBlenderとClaudeをMCP接続してClaudeに3Dモデリングさせるというのが話題なので実際に試してみました。自然言語で依頼するとClaudeがモデリングツールを操作してくれます。&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
&lt;!-- toc --&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;前提&quot;&gt;前提&lt;&#x2F;h2&gt;
&lt;p&gt;前提は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Blender 3.0以降&lt;&#x2F;li&gt;
&lt;li&gt;Python 3.10以降&lt;&#x2F;li&gt;
&lt;li&gt;uv package manager&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Blenderは無料の3Dモデリングツールなので、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.blender.org&#x2F;&quot;&gt;公式サイト&lt;&#x2F;a&gt;からダウンロードしてインストールしておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Pythonの環境は整えておきましょう。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;uv&lt;&#x2F;code&gt;はPythonのパッケージなので、以下のようにインストールできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Windowの場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Macの場合はHomebrewでも可&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claudeの設定&quot;&gt;Claudeの設定&lt;&#x2F;h2&gt;
&lt;p&gt;使用するのは例によってClaude Desktopです。&lt;&#x2F;p&gt;
&lt;p&gt;いつものごとく、&lt;code&gt;claude_desktop_config.json&lt;&#x2F;code&gt;を編集します。
Claude DesktopからSettings &amp;gt; Developer &amp;gt; Edit Configで開けます。次のように
&lt;code&gt;blender-mcp&lt;&#x2F;code&gt;の設定を追加します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;mcpServers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;blender&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;uvx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;blender-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Blender_MCP_サーバーのインストール&quot;&gt;Blender MCP サーバーのインストール&lt;&#x2F;h2&gt;
&lt;p&gt;Blender MCPの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blender-mcp.com&#x2F;download.html&quot;&gt;配布サイト&lt;&#x2F;a&gt;から最新版を
ダウンロードします。Zipでダウンロードされるので、展開しておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Blenderを起動して、PreferencesからAdd-onsを開きます。&quot;Install Add-on from
File&quot;を選択して、先ほど展開したフォルダから&lt;code&gt;addon.py&lt;&#x2F;code&gt;を選びます。&lt;&#x2F;p&gt;
&lt;p&gt;インストールが完了すると、3D ViewのSidebarに&quot;Blender MCP&quot;のアイコンが追加さ
れます。
&quot;BlenderMCP&quot;のタブを開いて、&lt;code&gt;Poly Haven&lt;&#x2F;code&gt;のチェックボックスにチェックして
&lt;code&gt;start mcp server&lt;&#x2F;code&gt;をクリックします。&lt;&#x2F;p&gt;
&lt;p&gt;これで、Blender MCPが起動しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claudeにモデリングしてもらう&quot;&gt;Claudeにモデリングしてもらう&lt;&#x2F;h2&gt;
&lt;p&gt;Claudeにモデリングを依頼してみましょう。&lt;&#x2F;p&gt;
&lt;p&gt;Claudeには以下のように依頼しています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;BlenderでPoly HavenのHDRI、テクスチャ、そして岩や植生のようなモデルを使っ
て、ビーチの雰囲気を作り出してください。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;実際にやっているところを見たほうが早いと思うので、動画にしました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;a6-DmRtty_8&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はアセットを使っているとは言え「風景」だったので、3D画像として成立させる
モデリングは結構ハードルが高かったと思います。レンダリングした結果もちょっと
微妙でした。正直リアルな画像を得るだけであれば、Midjourneyなど画像生成AIを使
ったほうが良い結果になるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、シンプルなポリゴンモデルなら結構ちゃんとモデルを作ってくれます。
3Dモデルがあると、画角や視点を変えたシーンを何度も調整できるメリットがありま
す。&lt;&#x2F;p&gt;
&lt;p&gt;3Dモデリングはツールの使い方もハードルが高く、習得に時間がかかります。
AIを使って自然言語でモデリングできるようになれば結構革新的かなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;MCPでいろいろ拡がっていきますね。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Blender界隈でBlenderとClaudeをMCP接続してClaudeに3Dモデリングさせるというのが話題なので実際に試してみました。自然言語で依頼するとClaudeがモデリングツールを操作してくれます。</summary>
        </entry><entry xml:lang="en">
        <title>The yellow phantom of destruction</title>
        <published>2025-04-21T00:00:00+00:00</published>
        <updated>2025-04-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/yellow-devil/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/yellow-devil/</id>
        
            <content type="html">&lt;p&gt;Against the odds, victory with an unfamiliar yellow weapon. I felt like a hesitant phantom of yellow, stumbling but ultimately painting a path to triumph. Not quite the sulfurous angel of mayhem I envisioned, more like a bewildered sprite of splats. Still, the chaotic dance of ink led to an unexpected win. A small step for a yellow newbie, a surprising splash for the team.&lt;&#x2F;p&gt;
&lt;p&gt;久しぶりのケルビン525デコです。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;jtZye5cvYic&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">Against the odds, victory with an unfamiliar yellow weapon. I felt like a hesitant phantom of yellow, stumbling but ultimately painting a path to triumph. Not quite the sulfurous angel of mayhem I envisioned, more like a bewildered sprite of splats. Still, the chaotic dance of ink led to an unexpected win. A small step for a yellow newbie, a surprising splash for the team.</summary>
        </entry><entry xml:lang="en">
        <title>Xotic AC Booster V2レビュー</title>
        <published>2025-04-20T00:00:00+00:00</published>
        <updated>2025-04-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/ac-booster-v2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/ac-booster-v2/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;04&amp;#x2F;ac-booster-v2&amp;#x2F;ac-booster-v2.webp?h=c5699099ed54e6592e14&quot;
  alt=&quot;AC Booster V2&quot; width=&quot;1800&quot; height=&quot;1306&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Xotic_AC_Boosterとは&quot;&gt;Xotic AC Boosterとは&lt;&#x2F;h2&gt;
&lt;p&gt;XoticのAC BoosterはRC BoosterやBB Preampと並んでXoticの３兄弟のような
イメージですが、何年か前に廃盤となっていました。&lt;&#x2F;p&gt;
&lt;p&gt;その名前からも想像できるようにVOX AC30 Top Boostチャンネル回路を
イメージして設計されたようです。&lt;&#x2F;p&gt;
&lt;p&gt;Boosterというより、ローゲインのOver Driveに近く、粒だった歪みで音圧感があり
輪郭のはっきりした音でした。サスティンも得られるため、伸びやかなリードに向い
ていました。&lt;&#x2F;p&gt;
&lt;p&gt;反面キャラクターがはっきりした音なので、BB Preampほど汎用性が高くなく
バッキングなどでは強すぎた印象です。&lt;&#x2F;p&gt;
&lt;p&gt;使い勝手が良く人気のペダルだったと思いますが、
廃盤になったのはAC PlusやAC compなど同じ &lt;strong&gt;&quot;AC&quot;&lt;&#x2F;strong&gt; という
名前を冠しているのに微妙にキャラクターの異なるペダルが発売されて
迷走したためでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Xotic_AC_Booster_V2_の登場&quot;&gt;Xotic AC Booster V2 の登場&lt;&#x2F;h2&gt;
&lt;p&gt;今回発売されたのは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;42GiVp5&quot;&gt;AC Booster V2&lt;&#x2F;a&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;途絶えていたAC Boosterがバージョンアップして復活したわけですが、
主な違いは次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Boostスイッチがついて、RC Booster V2と同様にさらにブーストを加えることが可
能となった&lt;&#x2F;li&gt;
&lt;li&gt;ペダル側面のDIPスイッチで細かなキャラクターの調整が可能
&lt;ul&gt;
&lt;li&gt;Compressionツイッチをオンにすると、6dB上がりコンプレッション感が増
す&lt;&#x2F;li&gt;
&lt;li&gt;Classicツイッチにより、よりゲインの高いモードも使える&lt;&#x2F;li&gt;
&lt;li&gt;Lo Mid Boostツイッチで、500Hzあたりを6bBブーストできる&lt;&#x2F;li&gt;
&lt;li&gt;Hi Mid boostスイッチで、2KHzあたりを6dBブーストできる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Xotic_AC_Booster_V2を弾いてみた&quot;&gt;Xotic AC Booster V2を弾いてみた&lt;&#x2F;h2&gt;
&lt;p&gt;AC Booster V2を使って弾いていました。
DIPツイッチはデフォルトのままのClass Modeです。
Gainは2時、Boostスイッチは踏んで9時方向です。
EQはTrebleが1時、Bassは12時です。&lt;&#x2F;p&gt;
&lt;p&gt;Simplifier MK-IIからDIで直接Macに取り込み、リバーブとディレイはLogic Proで
かけています。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2081879274&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;jumping-take-off&quot; title=&quot;JUMPING TAKE OFF&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;JUMPING TAKE OFF&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Distortionまで行かないけれど、ちょっと荒々しい歪みと適度なコンプレッション感
で弾いていて楽しいペダルです。&lt;&#x2F;p&gt;
&lt;p&gt;以下の動画に詳しい解説があり、とても良い音で鳴らしていて参考になります。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;ehqrZiQ-eXs&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">Xotic AC Booster V2が発表されましたが、発表前から予約し入手したので早速使ってみました。</summary>
        </entry><entry xml:lang="en">
        <title>Apple Silicon時代のMacバックアップ最新戦略</title>
        <published>2025-04-18T00:00:00+00:00</published>
        <updated>2025-04-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/backup-strategy-for-mac/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/backup-strategy-for-mac/</id>
        
            <content type="html">&lt;h2 id=&quot;Macのバックアップ戦略&quot;&gt;Macのバックアップ戦略&lt;&#x2F;h2&gt;
&lt;p&gt;macOSはOS自体が&lt;strong&gt;TimeMachine&lt;&#x2F;strong&gt;という自動バックアップ機能を持っています。
以下のような特徴を持っています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特徴&lt;&#x2F;strong&gt;: macOSに標準搭載、独自形式でデータを保存&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;メリット&lt;&#x2F;strong&gt;: 設定が簡単、自動バックアップ、過去バージョンへのアクセス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;デメリット&lt;&#x2F;strong&gt;: 独自形式のため通常のFinderからのアクセスが困難&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;アプローチ&lt;&#x2F;strong&gt;: 問題発生時はリカバリーからOSインストール後、Migration Assistantでデータ復元&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;iMacを使っていた時は使っていましたが、Macbookを使うようになってから
TimeMachineの使用を止めました。
理由は、バックアップ用にディスクが常にマウントされているとは限らないので
「自動バックアップ」の恩恵が相対的に薄く、加えて独自形式のためTimeMachineの
メカニズムでしかバップアップにアクセスできないためです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Apple_Silicon時代のバックアップの変化&quot;&gt;Apple Silicon時代のバックアップの変化&lt;&#x2F;h2&gt;
&lt;p&gt;TimeMachineを使用しない替わりに、長らく&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.shirt-pocket.com&#x2F;SuperDuper&#x2F;SuperDuperDescription.html&quot;&gt;SuperDuper&lt;&#x2F;a&gt;
や&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bombich.com&#x2F;&quot;&gt;Carbon Copy Cloner&lt;&#x2F;a&gt;を使いディスクごと
完全なクローンを取っていました。
完全なクローンはブート可能なので、リカバリーの際にはクローンディスクから
macOSをブートしてリカバリーを行うことができました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、Apple Silicon搭載のMac（M1&#x2F;M2&#x2F;M3チップ）ではIntelが使われていた時代と
比較してシステムアーキテクチャが大きく変わりました。&lt;&#x2F;p&gt;
&lt;p&gt;主な変更点は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OSが読み取り専用として保護されるようになった&lt;&#x2F;li&gt;
&lt;li&gt;リカバリー機能がより強化された（Recovery・Fallback Recoveryが内蔵）&lt;&#x2F;li&gt;
&lt;li&gt;外部ドライブからの起動に制限が追加された&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;バックアップ戦略も見直す必要が出てきました。
このためBootableな完全ディスククローンという戦略は以前ほど重要ではなくなりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;推奨バックアップ戦略&quot;&gt;推奨バックアップ戦略&lt;&#x2F;h2&gt;
&lt;p&gt;次のようなバックアップ戦略を変更することが必要です。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;データ中心のバックアップ&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OSではなく、ユーザーデータを確実に保護する&lt;&#x2F;li&gt;
&lt;li&gt;SuperDuperの場合は&lt;code&gt;Backup - User files&lt;&#x2F;code&gt;オプションが効率的&lt;&#x2F;li&gt;
&lt;li&gt;TimeMachineを使う場合は、同様にデータのバックアップに重点を置く&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;リカバリー戦略&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;問題発生時：
&lt;ol&gt;
&lt;li&gt;リカバリーモードから起動（⌘+Rキー）&lt;&#x2F;li&gt;
&lt;li&gt;OSをクリーンインストール&lt;&#x2F;li&gt;
&lt;li&gt;Migration Assistantを使ってバックアップからデータを復元&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ストレージの選択&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーデータのみをバックアップする場合、Mac本体と同程度の容量で十分&lt;&#x2F;li&gt;
&lt;li&gt;頻繁にアクセスする場合はSSD、コスト重視ならHDDを選択&lt;&#x2F;li&gt;
&lt;li&gt;NASを使用すれば、ネットワーク経由で自動バックアップも可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;SuperDuperとTimeMachineの選択基準&quot;&gt;SuperDuperとTimeMachineの選択基準&lt;&#x2F;h2&gt;
&lt;p&gt;私自身はSuperDuperを使用していますが、有償のソフトウェアですしApple謹製の
TimeMachineを使いたい方もいると思います。
次のような観点で選択すればよいと思います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SuperDuperを選ぶ場合&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;バックアップから直接ファイルにアクセスしたい&lt;&#x2F;li&gt;
&lt;li&gt;標準ファイルシステムでの管理を好む&lt;&#x2F;li&gt;
&lt;li&gt;選択的なバックアップをしたい&lt;&#x2F;li&gt;
&lt;li&gt;バックアップスケールや方法を自分で調整したい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TimeMachineを選ぶ場合&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;設定の簡単さを重視&lt;&#x2F;li&gt;
&lt;li&gt;過去バージョンへの簡単なアクセスが必要&lt;&#x2F;li&gt;
&lt;li&gt;macOSに標準搭載の機能のみで完結させたい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Apple Silicon時代では、起動可能なバックアップよりも「確実にデータを保護し、
必要時に復元できる」戦略が重要です。OSはリカバリーモードから再インストールし
、大切なユーザーデータは確実にバックアップしておくことで、トラブル時も迅速に
復旧できます。&lt;&#x2F;p&gt;
&lt;p&gt;SuperDuperの最新ベータ版ではブータビリティの改善が進んでいますが、
現実的な運用としてはユーザーデータに焦点を当てた戦略が効率的です。&lt;&#x2F;p&gt;
&lt;p&gt;また、私はpCloudも使用しているため、
特に重要なファイルはpCloud上で作業するようにしています。
過去30日分のリビジョンが保存されますし、クラウドからいつでも取り出せます。&lt;&#x2F;p&gt;
&lt;p&gt;家庭用途では、
特にストレージコストを考慮すると、データ中心の定期的バックアップと
クラウドなどへの直近のデータの保管を併用すれば十分な保護が可能です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">4月に入って日本語対応のApple IntelligenceをサポートしたmacOS Sequoia15.4、4月16日にはセキュリティアップデートのための15.1、その他Command LineToolsのアップデートなどが続いています。これらの更新の前には都度Macのバックアップと取っていますが、改めてMacのバックアップについて検討してみました。</summary>
        </entry><entry xml:lang="en">
        <title>国税庁の法人番号システムWeb-APIの検証</title>
        <published>2025-04-18T00:00:00+00:00</published>
        <updated>2025-04-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/company-info-api/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/company-info-api/</id>
        
            <content type="html">&lt;p&gt;仕事で企業を一意に特定するという要件があり、法人番号制度を利用するために
国税庁が提供する法人番号システムのWeb API
の検証のためのコードを作成してみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;法人番号制度とは&quot;&gt;法人番号制度とは&lt;&#x2F;h2&gt;
&lt;p&gt;法人番号制度は、2015年10月5日に発足しました。
この制度は、行政の効率化、国民の利便性の向上、および公平・公正な社会の実現を
目的として導入されました。法人には13桁の番号が指定され、商号や所在地といった
基本情報とともに国税庁の法人番号公表サイトで公開されています。&lt;&#x2F;p&gt;
&lt;p&gt;特に近年では、2023年10月から開始されたインボイス制度（適格請求書等保存方式）
との関連で、登録番号（T+法人番号等）を記載した適格請求書の発行が消費税の
仕入税額控除の要件となっているためシステムで扱うことも多くなっています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;国税庁のWeb_APIについて&quot;&gt;国税庁のWeb APIについて&lt;&#x2F;h2&gt;
&lt;p&gt;国税庁が提供するAPIについては、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.houjin-bangou.nta.go.jp&#x2F;webapi&#x2F;index.html&quot;&gt;法人番号システムのWep API&lt;&#x2F;a&gt;
のページに利用方法や申し込み方法がガイドされています。&lt;&#x2F;p&gt;
&lt;p&gt;利用には国税庁が振り出す「アプリケーションID」を取得する必要があります。
次の２つのアプリケーションIDがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;インボイスWeb-APIを利用できるアプリケーションID&lt;&#x2F;li&gt;
&lt;li&gt;法人番号システムWeb-APIのみ利用できるアプリケーションID&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;前者は国税庁の承認を受ける必要がありますが、後者の法人番号システムのAPIにつ
いては申請だけでアプリケーションIDを振り出してくれます。ただし、申請してから
２週間から1ヶ月程度かかります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;法人情報検索APIクライアント&quot;&gt;法人情報検索APIクライアント&lt;&#x2F;h2&gt;
&lt;p&gt;Typescriptで検証のためのコードを書いてみました。&lt;&#x2F;p&gt;
&lt;p&gt;法人名、または法人番号で検索できます。&lt;&#x2F;p&gt;
&lt;p&gt;実行すると、次のような標準出力にレスポンスをそのまま表示します。
(以下の例では、適当に折り返しています)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;get-company-info&quot;&gt;GitHubに公開&lt;&#x2F;a&gt;したので、ビルド方法や詳細な使い方はそちらをご覧ください。
検証用なのでエラー処理はいい加減です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;╰─❯&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm start --  --type name 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; company-info-api@1.0.0 start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; node dist&#x2F;index.js --type name 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;含まれている日本語：&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;日本語を含むか：&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-true&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;xml version&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; encoding&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;UTF-8&amp;quot;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;corporations&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lastUpdateDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;2025-04-18&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;lastUpdateDate&amp;gt;&amp;lt;count&amp;gt;1&amp;lt;&#x2F;count&amp;gt;&amp;lt;divideNumber&amp;gt;1&amp;lt;&#x2F;divideNumber&amp;gt;&amp;lt;di&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;videSize&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;divideSize&amp;gt;&amp;lt;corporation&amp;gt;&amp;lt;sequenceNumber&amp;gt;1&amp;lt;&#x2F;sequenceNumber&amp;gt;&amp;lt;corpo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rateNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;1130001011420&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;corporateNumber&amp;gt;&amp;lt;process&amp;gt;01&amp;lt;&#x2F;process&amp;gt;&amp;lt;correct&amp;gt;1&amp;lt;&#x2F;c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;orrect&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&amp;lt;updateDate&amp;gt;2018-07-18&amp;lt;&#x2F;updateDate&amp;gt;&amp;lt;changeDate&amp;gt;2015-10-05&amp;lt;&#x2F;changeDat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&amp;lt;name&amp;gt;任天堂株式会社&amp;lt;&#x2F;name&amp;gt;&amp;lt;nameImageId&#x2F;&amp;gt;&amp;lt;kind&amp;gt;301&amp;lt;&#x2F;kind&amp;gt;&amp;lt;prefectureName&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;京都府&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;prefectureName&amp;gt;&amp;lt;cityName&amp;gt;京都市南区&amp;lt;&#x2F;cityName&amp;gt;&amp;lt;streetNumber&amp;gt;上鳥羽鉾&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;立町１１番地１&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;streetNumber&amp;gt;&amp;lt;addressImageId&#x2F;&amp;gt;&amp;lt;prefectureCode&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;6&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;prefectureCode&amp;gt;&amp;lt;cityCod&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;107&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;cityCode&amp;gt;&amp;lt;postCode&amp;gt;6018116&amp;lt;&#x2F;postCode&amp;gt;&amp;lt;addressOutside&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;addressOutsideImageId&#x2F;&amp;gt;&amp;lt;closeDate&#x2F;&amp;gt;&amp;lt;closeCause&#x2F;&amp;gt;&amp;lt;successorCorporateNumber&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;changeCause&#x2F;&amp;gt;&amp;lt;assignmentDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;2015-10-&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;05&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;assignmentDate&amp;gt;&amp;lt;latest&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&#x2F;latest&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;enName&#x2F;&amp;gt;&amp;lt;enPrefectureName&#x2F;&amp;gt;&amp;lt;enCityName&#x2F;&amp;gt;&amp;lt;enAddressOutside&#x2F;&amp;gt;&amp;lt;furigana&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;ニンテ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ンドウ&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;&amp;lt;&#x2F;furigana&amp;gt;&amp;lt;hihyoji&amp;gt;0&amp;lt;&#x2F;hihyoji&amp;gt;&amp;lt;&#x2F;corporation&amp;gt;&amp;lt;&#x2F;corporations&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;╰─❯&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm start -- --format csv --type name 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; company-info-api@1.0.0 start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; node dist&#x2F;index.js --format csv --type name 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;含まれている日本語：&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 任天堂株式会社&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;日本語を含むか：&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-true&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;2025-04-18,1,1,1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;1,1130001011420,01,1,2018-07-18,2015-10-05,&amp;quot;任天堂株式会社&amp;quot;,,301,&amp;quot;京都府&amp;quot;,&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;京都市南区&amp;quot;,&amp;quot;上鳥羽鉾立町１１番地１&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;,26,107,6018116,,,,,,,2015-10-05,1,,,,,&amp;quot;ニンテンドウ&amp;quot;,0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;一応国の仕組みで、一意に法人を特定できるのいろいろ活用できて便利そうです。&lt;&#x2F;p&gt;
&lt;p&gt;私が社会人になりたての頃に同じような要件があり、
当時はこういったものがありませんでした。
そのため、名寄せしたり帝国データバンクの企業情報とぶつけたり苦労しました。
国がこんなものを提供してくれるなんて、いい時代だ。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2025-04-20_追記&quot;&gt;2025-04-20 追記&lt;&#x2F;h2&gt;
&lt;p&gt;経済産業省も法人番号で検索できるAPIを公開していたので、対応しました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I had a requirement at work to uniquely identify companies, and to utilize the corporate number system, I created code to verify the Web API of the Corporate Number System provided by the National Tax Agency.</summary>
        </entry><entry xml:lang="en">
        <title>AWS Document MCP Serverを試す</title>
        <published>2025-04-16T00:00:00+00:00</published>
        <updated>2025-04-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/aws-mcp-servers/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/aws-mcp-servers/</id>
        
            <content type="html">&lt;h2 id=&quot;公式ブログ記事の概要&quot;&gt;公式ブログ記事の概要&lt;&#x2F;h2&gt;
&lt;p&gt;公開されたのは「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;blogs&#x2F;machine-learning&#x2F;introducing-aws-mcp-servers-for-code-assistants-part-1&#x2F;&quot;&gt;Introducting AWS MCP Servers for code assistants(Part1)&lt;&#x2F;a&gt;
」という記事です。AWS MCPサーバーが紹介されています。&lt;&#x2F;p&gt;
&lt;p&gt;これらは、AWSのベストプラクティスを開発ワークフローに直接統合する特化型の
Model Context Protocol（MCP）サーバーのオープンソーススイートです。
このサーバー群は、AIアシスタントとAWSの深い知識を組み合わせ、開発時間を大幅に
短縮しながら、セキュリティコントロール、コスト最適化、AWS Well-Architectedの
ベストプラクティスを取り入れることを目的としているようです。&lt;&#x2F;p&gt;
&lt;p&gt;主要な特化型MCPサーバーとして以下が提供されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コア：&lt;&#x2F;strong&gt; AIプロセスパイプライン機能を提供する基盤サーバー&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AWS CDK：&lt;&#x2F;strong&gt; CDKの知識とベストプラクティス実装ツールを提供&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Amazon Bedrock Knowledge Bases：&lt;&#x2F;strong&gt; 企業の知識ベースへシームレスにアクセス&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Amazon Nova Canvas：&lt;&#x2F;strong&gt; Amazon Bedrockを通じた画像生成機能を提供&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コスト分析：&lt;&#x2F;strong&gt; AWSサービスのコストを分析し、詳細なレポートを生成&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;具体的にどのようなMCPサーバーが提供されているかは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;awslabs&#x2F;mcp&#x2F;&quot;&gt;GitHub&lt;&#x2F;a&gt;で公開されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;AWS_Documentation_MCP_Serverを試す&quot;&gt;AWS Documentation MCP Serverを試す&lt;&#x2F;h2&gt;
&lt;p&gt;手っ取り早そうなので、AWS Documentation MCP Serverを試してみました。&lt;&#x2F;p&gt;
&lt;p&gt;このAPIでは、AWSの公式ドキュメントとベストプラクティスにアクセスしたり、
ドキュメントをMarkdown形式にコンバートできるようです。&lt;&#x2F;p&gt;
&lt;p&gt;AWSの提供する設定サンプルを見ると、Astral社が開発したPython向けのツール管理
コマンド &lt;code&gt;uv&lt;&#x2F;code&gt;を使用しているようです。まず、&lt;code&gt;uv&lt;&#x2F;code&gt;をインストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 公式インストーラー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; curl -LsSf https:&#x2F;&#x2F;astral.sh&#x2F;uv&#x2F;install.sh&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# MacでHomebrewでインストールする場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; brew install uv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;デスクトップ版Claudeからアクセスする想定で設定します。
設定メニュー内の開発者メニューから、&lt;code&gt;claude_desktop_config.json&lt;&#x2F;code&gt;を開いて編集
します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;mcpServers&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;inkdrop&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;Users&#x2F;hogehoge&#x2F;bin&#x2F;inkdrop-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_SERVER_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;http:&#x2F;&#x2F;localhost:19840&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_USERNAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;hogehoge&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_PASSWORD&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;hagehage&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;claude_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;Users&#x2F;hogehoge&#x2F;bin&#x2F;claude-code-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;aws_document&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;opt&#x2F;homebrew&#x2F;bin&#x2F;uvx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;awslabs.aws-documentation-mcp-server@latest&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;FASTMCP_LOG_LEVEL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ERROR&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;disabled&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;autoApprove&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この例では、Inkdrop, Claude CodeもMCPサーバーとして登録していますが、
必要なのは最後の例だけです。なお、上記はHomebrewでインストールした場合です。
公式インストーラーを使用した場合、パスが異なりますから注意してください。&lt;&#x2F;p&gt;
&lt;p&gt;上記の設定後、Claudeの再起動が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;早速確認してみましょう。&lt;&#x2F;p&gt;
&lt;p&gt;デスクトップ版Claudeから、
「aws_documentから東京リージョンでBedrockにて
利用可能なモデルの一覧を作成してください」と依頼してみました。&lt;&#x2F;p&gt;
&lt;p&gt;以下のように、MCP使用の許可を求めながら処理を行っています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;お手伝いします。AWS Bedrockで現在利用可能なモデルの一覧を作成するために、AWS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;公式ドキュメントから情報を検索しましょう。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;モデル情報の詳細を確認するために、関連するAWSドキュメントページを読み取りま&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;しょう。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;モデルの詳細情報を取得するために、利用可能なモデルの一覧に関するドキュメント&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;を検索します：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;サポートされているモデルのリストを確認するために、もう一つのドキュメントを読&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;み取ります：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;基本的なモデル一覧を確認するドキュメントを検索します：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;もう少し具体的に検索します：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Converseで利用可能なモデルを確認します：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;モデルのリージョン対応を確認するために、追加のドキュメントを読み取ります：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;これで十分な情報が得られました。収集した情報に基づいて、AWS Bedrockで現在利&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;用可能なモデルの一覧を作成します。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AWS Bedrockで現在利用可能なモデルの一覧をまとめました。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;結果、完成したドキュメント&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;は、AWSのSolution Architectが作成したような丁寧な回答でした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はAWS Documentation MCP Serverをデスクトップ版Claudeからアクセスすること
を試してみました。&lt;&#x2F;p&gt;
&lt;p&gt;最近のClaudeはWeb検索をやってくれるので、MCPサーバーを使用
しなくても同様の結果は得ることができそうです。
しかし、ソースを限定して「公式ドキュメントから」と指定できるのは安心です。&lt;&#x2F;p&gt;
&lt;p&gt;Core MCP Serverというものが提供されており、一連のMCPサーバーのオーケストレー
ションを行うようです。もしかすると今回の使い方は想定と違うのかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;AWS Diagram MCP ServerはAWSダイアグラムを生成してくれるようなのです。
実際の環境からその各種ダイアグラムをGraphVizで描いてくれるなら、
取っても便利そうです。&lt;&#x2F;p&gt;
&lt;p&gt;やっぱり、今MCPは熱いですね。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Claude Artifactsで生成されたドキュメント（一時URLのため現在はアクセス不可） &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">4月1日のAWS公式ブログで、AWS MCP Serversの記事が掲載されました。早速AWS公式ドキュメントをMCPサーバーとして利用できるAWS Documentation MCP Serverを試してみました。</summary>
        </entry><entry xml:lang="en">
        <title>プロンプトエンジニアリング技法の総合ガイド</title>
        <published>2025-04-15T00:00:00+00:00</published>
        <updated>2025-04-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/prompt-engineering/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/prompt-engineering/</id>
        
            <content type="html">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.aibase.com&#x2F;ja&#x2F;news&#x2F;17051&quot;&gt;AI Baseの記事&lt;&#x2F;a&gt;でこのホワイトペーパーが紹介されていたので、
原文を読んでみました。&lt;&#x2F;p&gt;
&lt;p&gt;この論文は、大規模言語モデル(LLM)向けのプロンプトエンジニアリング手法を包括的に解説しています。
データサイエンティストでなくても効果的なプロンプトを作成できること、
LLMの設定（温度、top-K、top-P、トークン制限など）がプロンプトの効果に大きく影響することなどが
強調されています。&lt;&#x2F;p&gt;
&lt;p&gt;プロンプトテクニックとして整理されており、生成AIと付きあう前提のナレッジとし
て有用だと思うのでまとめておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;出典情報&quot;&gt;出典情報&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;論文タイトル：「Prompt Engineering」（※掲載サイトgptaiflow.techは閉鎖済み）&lt;&#x2F;li&gt;
&lt;li&gt;著者：Lee Boonstra（他複数の貢献者）&lt;&#x2F;li&gt;
&lt;li&gt;発行元：Google&lt;&#x2F;li&gt;
&lt;li&gt;発行日：2024年11月&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;主要なプロンプト技法&quot;&gt;主要なプロンプト技法&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1._ゼロショットプロンプト_(Zero-shot_Prompting)&quot;&gt;1. ゼロショットプロンプト (Zero-shot Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;例を示さず、直接タスクを指示する基本的な手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;映画レビューをPOSITIVE、NEUTRAL、NEGATIVEに分類してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レビュー：&amp;quot;Her&amp;quot;は人工知能の進化が人類に与える影響を描いた傑作です。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;2._ワンショット&#x2F;フューショットプロンプト_(One-shot_&amp;amp;_Few-shot_Prompting)&quot;&gt;2. ワンショット&#x2F;フューショットプロンプト (One-shot &amp;amp; Few-shot Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;1つまたは複数の例を示すことで、モデルに期待する出力パターンを教える手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;顧客のピザ注文をJSONに解析してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;例: &amp;quot;チーズとペパロニのピザを注文したい&amp;quot; →&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;small&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ingredients&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;cheese&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;pepperoni&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;注文: &amp;quot;モッツァレラとバジルのピザをLサイズで&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3._システムプロンプト_(System_Prompting)&quot;&gt;3. システムプロンプト (System Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;モデルの全体的な目的や動作を設定する手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;映画レビューを分類し、結果をJSONフォーマットで返してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;4._ロールプロンプト_(Role_Prompting)&quot;&gt;4. ロールプロンプト (Role Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;モデルに特定の役割を与えて、回答させる手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;旅行ガイドとして振る舞ってください。アムステルダムで訪れるべき3つの場所をリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ストアップしてください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;5._文脈プロンプト_(Contextual_Prompting)&quot;&gt;5. 文脈プロンプト (Contextual Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;関連する背景情報を提供して理解を深める手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;文脈：あなたは80年代のレトロゲームについてのブログを書いています。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;そのブログ用の記事のトピックを3つ提案してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;6._ステップバックプロンプト_(Step-back_Prompting)&quot;&gt;6. ステップバックプロンプト (Step-back Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;特定のタスクを実行させる前に、より一般的な質問を考慮させる手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FPSゲームのレベル設計で重要な要素は何ですか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[回答を受け取った後]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;その要素を考慮したFPSゲームのレベルの設計案を作成してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;7._思考連鎖_(Chain_of_Thought,_CoT)&quot;&gt;7. 思考連鎖 (Chain of Thought, CoT)&lt;&#x2F;h3&gt;
&lt;p&gt;中間推論ステップを生成して最終回答の精度を向上させる手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3歳の時、パートナーは私の3倍の年齢でした。現在私は20歳です。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;パートナーの年齢は？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ステップバイステップで考えましょう。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;8._自己一貫性_(Self-consistency)&quot;&gt;8. 自己一貫性 (Self-consistency)&lt;&#x2F;h3&gt;
&lt;p&gt;複数の推論経路を生成し、最も一貫した回答を選択する手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;このメールは重要ですか？内容を分析して結論を導き出してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[同じプロンプトを複数回実行し、最も多く出現する回答を採用]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;9._思考木_(Tree_of_Thoughts,_ToT)&quot;&gt;9. 思考木 (Tree of Thoughts, ToT)&lt;&#x2F;h3&gt;
&lt;p&gt;複数の推論パスを探索できるよう、思考連鎖を拡張した手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[問題解決において複数のアプローチを同時に検討させる手法]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;10._ReAct（理由付けと行動）_(ReAct:_Reason_&amp;amp;_Act)&quot;&gt;10. ReAct（理由付けと行動） (ReAct: Reason &amp;amp; Act)&lt;&#x2F;h3&gt;
&lt;p&gt;外部ツールと組み合わせて推論と行動を交互に行う手法です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;メタリカのバンドメンバーには合計何人の子供がいますか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[検索ツールを使って各メンバーについて調査し、結果を合計]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;11._自動プロンプトエンジニアリング_(Automatic_Prompt_Engineering)&quot;&gt;11. 自動プロンプトエンジニアリング (Automatic Prompt Engineering)&lt;&#x2F;h3&gt;
&lt;p&gt;LLMを使って他のLLM用のプロンプトを生成・評価・改善する手法です。LLMでなくMidjourney向けのプロンプトをClaudeに生成させるなど私はよく使います。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Tシャツを注文する10種類の表現を生成してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;12._コードプロンプティング_(Code_Prompting)&quot;&gt;12. コードプロンプティング (Code Prompting)&lt;&#x2F;h3&gt;
&lt;p&gt;コード関連のタスクに特化したプロンプト技法については、次の4つのサブカテゴリに分けることができます。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;a._コードを書くためのプロンプト_(Prompts_for_writing_code)&quot;&gt;a. コードを書くためのプロンプト (Prompts for writing code)&lt;&#x2F;h4&gt;
&lt;p&gt;特定のタスクのコードを生成するプロンプトです。実行環境、入出力形式、エラー処理などの要件を明示するとより効果的です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;特定のフォルダ内のすべてのファイル名の先頭に&amp;quot;draft&amp;quot;という文字列を追加する&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bashスクリプトを書いてください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;b._コードを説明するためのプロンプト_(Prompts_for_explaining_code)&quot;&gt;b. コードを説明するためのプロンプト (Prompts for explaining code)&lt;&#x2F;h4&gt;
&lt;p&gt;コードの機能、構造、ロジックを人間が理解しやすく解説させるプロンプトです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;以下のBashコードを説明してください：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;quot;フォルダ名を入力してください：&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;read folder_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;c._コードを翻訳するためのプロンプト_(Prompts_for_translating_code)&quot;&gt;c. コードを翻訳するためのプロンプト (Prompts for translating code)&lt;&#x2F;h4&gt;
&lt;p&gt;ある言語で書かれたコードを別の言語に変換するプロンプトです。元のコードの機能を担保するよう強調すると良い結果になるようです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;以下のBashスクリプトをPythonコードに変換してください：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;quot;フォルダ名を入力してください：&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;d._コードをデバッグ・レビューするためのプロンプト_(Prompts_for_debugging_and_reviewing_code)&quot;&gt;d. コードをデバッグ・レビューするためのプロンプト (Prompts for debugging and reviewing code)&lt;&#x2F;h4&gt;
&lt;p&gt;バグの特定、修正、およびコード品質の向上提案を求めるプロンプトです。エラーメッセージやスタックトレースを含めると効果的です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;以下のPythonコードにはエラーがあります：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;エラーを修正し、コード全体を改善してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;folder_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; input&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;フォルダ名を入力：&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;prefix&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; input&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;ファイル名の先頭に追加する文字列：&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; toUpperCase&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;prefix&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;ベストプラクティス&quot;&gt;ベストプラクティス&lt;&#x2F;h2&gt;
&lt;p&gt;次に個別のテクニックというよりプロンプト全般でのベストプラクティスです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;例を提供する&lt;&#x2F;strong&gt;：期待する出力の例を示すことで精度を向上&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;シンプルでわかりやすいプロンプトを設計&lt;&#x2F;strong&gt;：明確な言語を使用&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;出力形式を明確に指定&lt;&#x2F;strong&gt;：「3段落のブログ記事を生成」など具体的に&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;制約よりも指示を優先&lt;&#x2F;strong&gt;：否定形より肯定形の表現が効果的&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JSONなどの構造化出力を使用&lt;&#x2F;strong&gt;：データ抽出・分類タスクに有効&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;トークン長を制御&lt;&#x2F;strong&gt;：設定またはプロンプト内で指定&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロンプトに変数を使用&lt;&#x2F;strong&gt;：再利用可能で動的なプロンプト作成&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;入力形式やスタイルを実験&lt;&#x2F;strong&gt;：質問、声明、指示など&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;分類タスクでは異なるクラスの例をミックス&lt;&#x2F;strong&gt;：バイアス防止のため&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;モデルの更新に適応&lt;&#x2F;strong&gt;：新バージョンでプロンプトを再テスト&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロンプトの試行を詳細に記録&lt;&#x2F;strong&gt;：モデル、設定、プロンプト、出力を文書化&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;一旦JSON経由にするなど経験としては効果的なので、私はよく使います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;この論文ではプロンプトエンジニアリングの様々な技法を紹介しています。ゼロショットから高度な推論技法（思考連鎖、自己一貫性、思考木）、そしてコード生成・操作のためのプロンプティングまで、幅広い手法が解説されています。&lt;&#x2F;p&gt;
&lt;p&gt;プロンプトエンジニアリングは反復的なプロセスであり、モデルのパフォーマンスに基づいてプロンプトを継続的に改良することが重要です。また、表形式でプロンプト試行を記録し、異なるモデルバージョンや設定での結果を比較することが推奨されています。&lt;&#x2F;p&gt;
&lt;p&gt;コードプロンプティングの分野では、生成、説明、翻訳、デバッグという開発サイクル全体をカバーする技法が提示されており、開発効率の向上に貢献します。特にデバッグとレビューの機能は、単なるバグ修正だけでなく、コード品質の全体的な向上につながる可能性を持っています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">最近GoogleのLee Boonstrが最近発表した69ページのプロンプトエンジニアリングに関するホワイトペーパーを読みました。このホワイトペーパーでは大規模言語モデル（LLM）との対話を最適化するための包括的なガイドを提供されています。これまでなんとなく経験や勘で作っていたプロンプトを、テクニックとして整理することができます。</summary>
        </entry><entry xml:lang="en">
        <title>Synthersizer V Studio 2 Pro</title>
        <published>2025-04-15T00:00:00+00:00</published>
        <updated>2025-04-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/synthesizer-v-studio-2-pro/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/synthesizer-v-studio-2-pro/</id>
        
            <content type="html">&lt;p&gt;とりあえず、昨年Synthersizer V 1で作った藤原さくらさんの「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;just-one-girl-1?si=b7db2a56715c423eb6402905f5029c64&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&amp;amp;utm_campaign=social_sharing&quot;&gt;Just One Girl&lt;&#x2F;a&gt;
」をSynthesizer V 2でヴォーカル部分をリテイクしてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2078817968&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;just-one-girl-retake&quot; title=&quot;Just One Girl - Retake&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Just One Girl - Retake&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;以前のバージョンでもかなりリアルなヴォーカルなのであまり改善点がわからないか
もしれませんが、以下に変更点をまとめておきます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Sythesizer_V_Studio_2_Proの変更点&quot;&gt;Sythesizer V Studio 2 Proの変更点&lt;&#x2F;h2&gt;
&lt;p&gt;次のような変更がなされています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;歌声生成速度の改善&quot;&gt;歌声生成速度の改善&lt;&#x2F;h3&gt;
&lt;p&gt;Synthesizer V 2では歌声の生成速度が改善され、以前のSynthesizer Vに比べると300% 速くなったとのことです。&lt;&#x2F;p&gt;
&lt;p&gt;以前のバージョンでは編集時にノート1つ音程を変更しただけで少し待たないと再生できませんでしたが、
Synthesizer V 2では、ノートの編集後に再生できるまでの時間が短くなり待たされ
るという感覚がほぼありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;新しいボーカルモードの機能&quot;&gt;新しいボーカルモードの機能&lt;&#x2F;h3&gt;
&lt;p&gt;ボーカルモードはシンガーの歌声にバリエーションを持たせる機能ですが、
Synthesizer V 2では各パラメータが「ピッチ(Pitch)」「音色(Timbre)」「発声
(Pronun)」へと分解可能となりました。&lt;&#x2F;p&gt;
&lt;p&gt;これにより、ピッチに関しては「Clear」スタイルを強く適用するけれど
発声は「ソフト」スタイルを強くするなど、細かやかな調整が可能となりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;AIリテイク機能の改善&quot;&gt;AIリテイク機能の改善&lt;&#x2F;h3&gt;
&lt;p&gt;AIリテイクは、AIの技術を用いて異なる歌い方を生成できる機能です。&lt;&#x2F;p&gt;
&lt;p&gt;以前のバージョンでは、「ピッチ」と「声色」のみがリテイク可能でしたが、
Synthesizer V 2から「タイミング」も生成できるようになりました。&lt;&#x2F;p&gt;
&lt;p&gt;AIリテイク生成時のパラメータはXYパッドのようなインターフェイスとなり、
「Vibrant」「Refined」「Stable」「Raw」をコントロールする方式となりました。
より直感的に音を調整できます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;スマートピッチコントロール&quot;&gt;スマートピッチコントロール&lt;&#x2F;h3&gt;
&lt;p&gt;以前のSyhthesizer Vでは、ピッチ関係のパラメータは「ピッチ推移」や「ビブラー
ト」がありましたが、どのように変化するか分かりづらいものがありました。&lt;&#x2F;p&gt;
&lt;p&gt;V2ではピアノロール状でピッチ制御点を直接追加できます。制御点を通るピッチカー
ブが自動生成され、制御点をドラッグするとリアルタイムにカーブが変化します。
これまでよりずいぶんと分かりやすくなりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;アクティベーション方法の変更&quot;&gt;アクティベーション方法の変更&lt;&#x2F;h3&gt;
&lt;p&gt;これまでアクティベーションコードを製品に入力する方式だったと思いますが、
今回からDreamtonicsのアカウントと紐付いて製品がアクティベーションを行うよう
になりました。&lt;&#x2F;p&gt;
&lt;p&gt;従ってDreamtonicsのアカウントを作成し、そこに製品登録をきちんとやっておく必
要があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;以前のバージョンでもかなりリアルなヴォーカルを生成できましたが、
今回のバージョンアップでより細かなコントロールが可能となりました。&lt;&#x2F;p&gt;
&lt;p&gt;私自身はそこまでヴォーカルを調整することはありませんが、
エンジンとデータベースを更新するだけでも以前不自然だった部分が
かなり改善されます。&lt;&#x2F;p&gt;
&lt;p&gt;円安でちょっと高いですが、バージョンアップの価値はあると思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">歌声合成ソフトウェア「Synthesizer V」の新バージョンである、「Synthesizer V 2」が3月21日に発売されていたので、アップグレードしました。</summary>
        </entry><entry xml:lang="en">
        <title>スプラトゥーン3：Sprintg Fest</title>
        <published>2025-04-13T00:00:00+00:00</published>
        <updated>2025-04-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/spring-fest/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/spring-fest/</id>
        
            <content type="html">&lt;p&gt;もう大きな改修はないはずですが、
Nintedoはこうやってフェスを定期的にやってくれています。ありがたい。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;5s3rJRe7GwY&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">今週末のスプラトゥーンは春フェスでした。</summary>
        </entry><entry xml:lang="en">
        <title>To You</title>
        <published>2025-04-13T00:00:00+00:00</published>
        <updated>2025-04-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/to-you/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/to-you/</id>
        
            <content type="html">&lt;p&gt;1983年ごろにシングルでリリースされた高中正義さんの「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;to-you?si=454fd11c1e9746e287ef038f9ad18a14&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&amp;amp;utm_campaign=social_sharing&quot;&gt;To You&lt;&#x2F;a&gt;」を弾いてみました。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2077354468&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;to-you&quot; title=&quot;To You&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;To You&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;前年に発表されたアルバム『SAUDADE』には未収録ですが、同時期に制作されたのだ
と思います。B面は同アルバム収録の「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;eona?si=1e399235825841aca9fb1c0a0a288c75&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&amp;amp;utm_campaign=social_sharing&quot;&gt;Eona&lt;&#x2F;a&gt;」でした。&lt;&#x2F;p&gt;
&lt;p&gt;「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;to-you?si=454fd11c1e9746e287ef038f9ad18a14&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&amp;amp;utm_campaign=social_sharing&quot;&gt;To You&lt;&#x2F;a&gt;」は、当時マツダ ファミリアのテレビCMにも使われていたのを覚えています。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;ig67gsNMpnU&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;北大路欣也さんが出演されていますが、なんか現在と違う。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I tried covering a song by Masayoshi Takanaka from around 1983. I remember it playing in Mazda 323 (Familia) TV commercials at that time.</summary>
        </entry><entry xml:lang="en">
        <title>Anthropic announced Claude Max Plan</title>
        <published>2025-04-10T00:00:00+00:00</published>
        <updated>2025-04-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/anthropic-max-plan/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/anthropic-max-plan/</id>
        
            <content type="html">&lt;p&gt;今朝Anthropicから新しいプランの案内する次のようなメールが来ていました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
  We’ve heard your request for more access to Claude so you can maintain
  momentum on your most demanding projects with less disruption. Today, we’re
  introducing the new Max plan that delivers exactly that. With the Max plan,
  you can get:
  &lt;ul&gt;
    &lt;li&gt;
      &lt;strong&gt;Substantially more usage&lt;&#x2F;strong&gt; to work with Claude
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      &lt;strong&gt;5x more usage&lt;&#x2F;strong&gt; ($100&#x2F;month) or 20x more usage ($200&#x2F;month)
      than Pro
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      &lt;strong&gt;Be among the first&lt;&#x2F;strong&gt; to try the most advanced Claude
      capabilities
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      &lt;strong&gt;Flexibility&lt;&#x2F;strong&gt; to scale as your needs grow
    &lt;&#x2F;li&gt;
  &lt;&#x2F;ul&gt;
  Your best ideas deserve more room to grow. We’re excited to see the new
  possibilities the Max plan can unlock for you.
  &lt;footer&gt;
    &lt;cite&gt;
      &amp;mdash;Anthropic&quot;Introducing the Max plan — get more Claude usage than
      ever before&quot;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;新しい&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;pricing&quot;&gt;Claude Maxプラン&lt;&#x2F;a&gt;の案内です
。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Max_プランの概要&quot;&gt;Claude Max プランの概要&lt;&#x2F;h2&gt;
&lt;p&gt;Claude MaxプランはClaude Proプランの上位サブスクリプションとして、業務用途や超
ヘビーユーザーを対象として用意されたものです。&lt;&#x2F;p&gt;
&lt;p&gt;強化されるポイントは以下のような点です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._利用上限の拡大&quot;&gt;1. &lt;strong&gt;利用上限の拡大&lt;&#x2F;strong&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Claude Maxでは、既存の「Claude Pro」プラン（月額20ドル）と比較して以下のよう
な利用上限の大幅な拡大が行われます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;月額100ドルプラン&lt;&#x2F;strong&gt;: Proプランの5倍の使用量。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;月額200ドルプラン&lt;&#x2F;strong&gt;: Proプランの20倍の使用量。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これにより、長文の処理や複雑なタスク、大量のリクエストを頻繁に行う用途でも、
中断を気にすることなく作業を進行可能です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._新機能への優先アクセス&quot;&gt;2. &lt;strong&gt;新機能への優先アクセス&lt;&#x2F;strong&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;「Claude Max」加入者は、Anthropicの最新AIモデルや新機能に優先的にアクセスで
きる特典が付与されます。これには以下が含まれます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;新モデルへの早期アクセス。&lt;&#x2F;li&gt;
&lt;li&gt;新機能のテスト権限。&lt;&#x2F;li&gt;
&lt;li&gt;開発中の高度な機能（例: 音声モードなど）の事前利用。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3._コンテキストウィンドウの最大化&quot;&gt;3. &lt;strong&gt;コンテキストウィンドウの最大化&lt;&#x2F;strong&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;このプランでは、モデルが一度に処理できるテキスト量（コンテキストウィンドウ）
が従来モデルよりもさらに拡充されています。長文や複雑な文脈に依存する作業が効
率的に行えます。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4._混雑時の優先アクセス&quot;&gt;4. &lt;strong&gt;混雑時の優先アクセス&lt;&#x2F;strong&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;「Claude Max」プランのユーザーは、混雑した時間帯でも優先的にアクセスできるた
め、業務上の遅延を回避できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Claude_Maxプランの評価&quot;&gt;Claude Maxプランの評価&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Maxプランは、OpenAIのChatGPT Pro（月額200ドル）やその他の競合サービスへの対
抗策として設計されており、AIアシスタントの活用をさらに拡大したい次のようなユーザーに
とって魅力的な選択肢となっています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;作業を改良し完成させるために長時間の会話が必要&lt;&#x2F;li&gt;
&lt;li&gt;定期的に大量の文書や複雑なデータを扱う&lt;&#x2F;li&gt;
&lt;li&gt;現在の使用制限を待てない締め切りがある&lt;&#x2F;li&gt;
&lt;li&gt;日常のさまざまなタスクでClaudeに頼っている&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私自身もClaude Proを使っていますが、複雑なこと検討では上限に達してしまい一時
的に中断しなければならないシーンは確かにあります。ただ、次のような観点から
このClaude Maxプランは利用しないと思います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;使用制限を受けてしまうことはあるが、緊急性はそれほど高くないため多くの場合
は一時的に作業を中断できる。緊急性が高い場合はClade Codeなどの代替手段がある&lt;&#x2F;li&gt;
&lt;li&gt;大量情報を使った処理はチャットウィンドウで行うより、Claude CodeやMCP経由
でClaude Desktopで処理したほうが効率的&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;つまり技術者であれば、Claude Proプランと有償のAPI経由でClaudeを利用したほう経済的
、かつ効率的です。非技術者でヘビーにClaudeを活用し高い緊急度のニーズがある場
合はClaude Maxプランが向いていると思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Anthropic announced Claude Max Plan</summary>
        </entry><entry xml:lang="en">
        <title>新DIPS包括申請と二等無人航空機操縦士</title>
        <published>2025-04-10T00:00:00+00:00</published>
        <updated>2025-04-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/drone-lisence/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/drone-lisence/</id>
        
            <content type="html">&lt;h2 id=&quot;二等無人航空機操縦士技能証明書&quot;&gt;二等無人航空機操縦士技能証明書&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;04&amp;#x2F;drone-lisence&amp;#x2F;lisence.webp?h=4d7e74c9718b225a7638&quot;
  alt=&quot;二等無人航空機操縦士技能証明書&quot; width=&quot;800&quot; height=&quot;506&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;やっと届きました。&lt;&#x2F;p&gt;
&lt;p&gt;昨年末に思いついてスクールに通い始めて1月にスクールを卒業してから、3ヶ月も掛
かりました。スクールの実技試験枠が限られており試験を受けるのに2ヶ月、その後
海事協会の手続きとDIPS2.0での申請から発行まで1ヶ月かかりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;包括申請&quot;&gt;包括申請&lt;&#x2F;h2&gt;
&lt;p&gt;まだ自由に飛ばせません。
飛行許可の包括申請が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、3月末にこの飛行許可と関連した申請方法に大きな改正がありました。
主な変更点は次のような点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;機体と操縦者の許可基準適合性について
&lt;ul&gt;
&lt;li&gt;(改正前)写真や取扱説明書、飛行実績の貼付し申請が必要&lt;&#x2F;li&gt;
&lt;li&gt;(改正後)申請者自身で確認した結果を申請すればよく資料添付は不要&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;3月以前と大きく変わっているのですが、申請が簡素化されて大変楽にあっています。
これは審査を簡略化し許可まで時間の短縮が期待してのことだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;この変更に対応して3月末にDIPS2.0の飛行許可申請の画面も大きく変わっています。
YouTubeを検索すれば入力方法を解説したビデオがたくさん出てくると思います。
これまで国土交通省で審査されていた部分が、自身で確認する必要があるため
、見落としや解釈間違いに注意してよく理解しましょう。&lt;&#x2F;p&gt;
&lt;p&gt;この申請も許可まで10開庁日必要なので、もうしばらくの我慢です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;基準適合書&quot;&gt;基準適合書&lt;&#x2F;h2&gt;
&lt;p&gt;申請に資料の貼付は不要になりましたが、国土交通省から照会がある可能性も有りま
す。その際に資料は作成・具備することになっているため、提出は不要ですが作成し
ておくことが求められています。&lt;&#x2F;p&gt;
&lt;p&gt;以下はDJI Air 3S用に作成したものです。以前DIPS2.0に登録していた資料と同等で
すね。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;資料1:_無人航空機の機能・性能に関する基準適合確認書&quot;&gt;資料1: 無人航空機の機能・性能に関する基準適合確認書&lt;&#x2F;h3&gt;
&lt;dl&gt;
  &lt;dt&gt;製造者名&lt;&#x2F;dt&gt;
  &lt;dd&gt;DJI&lt;&#x2F;dd&gt;
  &lt;dt&gt;名称&lt;&#x2F;dt&gt;
  &lt;dd&gt;DJI Air 3S&lt;&#x2F;dd&gt;
  &lt;dt&gt;重量&lt;&#x2F;dt&gt;
  &lt;dd&gt;724g(取扱説明書)&lt;&#x2F;dd&gt;
  &lt;dt&gt;改造について&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    航空局ホームページ掲載無人航空機ではないため未回答。
    次行に示す「仕様がわかる写真」にすべての機体構成を示す。
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;仕様がわかる写真&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th colspan=&quot;2&quot;&gt;無人航空機&lt;&#x2F;th&gt;
        &lt;&#x2F;tr&gt;
      &lt;&#x2F;thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;th&gt;正面&lt;&#x2F;th&gt;
          &lt;td&gt;
            &lt;img src=&quot;photo.webp&quot; alt=&quot;&quot; &#x2F;&gt;
          &lt;&#x2F;td&gt;
        &lt;&#x2F;tr&gt;
        &lt;tr&gt;
          &lt;th&gt;側面&lt;&#x2F;th&gt;
          &lt;td&gt;
            &lt;img src=&quot;photo.webp&quot; alt=&quot;&quot; &#x2F;&gt;
          &lt;&#x2F;td&gt;
        &lt;&#x2F;tr&gt;
        &lt;tr&gt;
          &lt;th&gt;上面&lt;&#x2F;th&gt;
          &lt;td&gt;
            &lt;img src=&quot;photo.webp&quot; alt=&quot;&quot; &#x2F;&gt;
          &lt;&#x2F;td&gt;
        &lt;&#x2F;tr&gt;
      &lt;&#x2F;tbody&gt;
    &lt;&#x2F;table&gt;
    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th colspan=&quot;2&quot;&gt;操縦装置(DJI RC2)&lt;&#x2F;th&gt;
        &lt;&#x2F;tr&gt;
      &lt;&#x2F;thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;th&gt;正面&lt;&#x2F;th&gt;
          &lt;td&gt;
            &lt;img src=&quot;photo.webp&quot; alt=&quot;&quot; &#x2F;&gt;
          &lt;&#x2F;td&gt;
        &lt;&#x2F;tr&gt;
      &lt;&#x2F;tbody&gt;
    &lt;&#x2F;table&gt;
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h3 id=&quot;機体の運用限界に関する情報&quot;&gt;機体の運用限界に関する情報&lt;&#x2F;h3&gt;
&lt;dl&gt;
  &lt;dt&gt;最高速度&lt;&#x2F;dt&gt;
  &lt;dd&gt;75.6km&#x2F;h&lt;&#x2F;dd&gt;
  &lt;dt&gt;最高到達高度&lt;&#x2F;dt&gt;
  &lt;dd&gt;6,000&lt;&#x2F;dd&gt;
  &lt;dt&gt;電波到達距離&lt;&#x2F;dt&gt;
  &lt;dd&gt;10,000&lt;&#x2F;dd&gt;
  &lt;dt&gt;飛行可能風速&lt;&#x2F;dt&gt;
  &lt;dd&gt;12m&#x2F;s 以下&lt;&#x2F;dd&gt;
  &lt;dt&gt;最大搭載可能重量&lt;&#x2F;dt&gt;
  &lt;dd&gt;取扱説明等に記載なし&lt;&#x2F;dd&gt;
  &lt;dt&gt;最大使用時間&lt;&#x2F;dt&gt;
  &lt;dd&gt;45 分&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h3 id=&quot;飛行させる方法&quot;&gt;飛行させる方法&lt;&#x2F;h3&gt;
&lt;dl&gt;
  &lt;dt&gt;飛行させる方法&lt;&#x2F;dt&gt;
  &lt;dd&gt;モード 2&lt;&#x2F;dd&gt;
  &lt;dt&gt;操縦方法、点検・整備方法&lt;&#x2F;dt&gt;
  &lt;dd&gt;別途取扱説明書を保存&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
</content>
        <summary type="html">やっと二等無人航空機操縦士の技能証明書が郵送されてきたので、新DIPSで改正後の包括申請を行いました。</summary>
        </entry><entry xml:lang="en">
        <title>Straight From Your Heart</title>
        <published>2025-04-09T00:00:00+00:00</published>
        <updated>2025-04-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/straight-from-your-heart/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/straight-from-your-heart/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2072525756&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;straight-from-your-heart&quot; title=&quot;STRAIGHT FROM YOUR HEART&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;STRAIGHT FROM YOUR HEART&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;I played &#x27;STRAIGHT FROM YOUR HEART&#x27; from Masayoshi Takanaka&#x27;s 1983 album
&#x27;CAN I SING?&lt;&#x2F;p&gt;
&lt;p&gt;In the previous year&#x27;s album &#x27;SAUDADE,&#x27; he was using sequencers a bit, but
in this album, he extensively utilized programmed sequences throughout.
After 40 years, it&#x27;s amazing that these programmed sequences can now be
replicated just using a Mac.&lt;&#x2F;p&gt;
&lt;p&gt;For guitar, I&#x27;m using an Aria Pro II PE-1500RI, with PPSE Classic and El
Capistan V2 effects, and a Simplifier MK-II amplifier.&lt;&#x2F;p&gt;
</content>
        <summary type="html">1983 年リリースの高中正義さんのアルバム『CAN I SING?』から『STRAIGHT FROMYOUR HEART』を弾いてみました。</summary>
        </entry><entry xml:lang="en">
        <title>OpenAI will support MCP</title>
        <published>2025-04-08T00:00:00+00:00</published>
        <updated>2025-04-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/openai-mcp-support/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/openai-mcp-support/</id>
        
            <content type="html">&lt;h2 id=&quot;AltmanのツイートによるMCP対応のアナウンス&quot;&gt;AltmanのツイートによるMCP対応のアナウンス&lt;&#x2F;h2&gt;
&lt;p&gt;以下が3月末のAltmanのツイート(X)です。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;x.com&#x2F;sama&#x2F;status&#x2F;1904957253456941061&quot;&gt;
  people love MCP and we are excited to add support across our products.
  available today in the agents SDK and support for chatgpt desktop app +
  responses api coming soon!
  &lt;footer&gt;
    &lt;cite&gt;
      &lt;a href=&quot;https:&#x2F;&#x2F;x.com&#x2F;sama&#x2F;status&#x2F;1904957253456941061&quot;&gt;
        &amp;mdash; Sam Altman (March 26, 2025)
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;MCP(Model Context Protocol)はAnthropicが提唱しているフレームワーク
ですが、上記は&lt;strong&gt;OpenAIもMCPをサポートする&lt;&#x2F;strong&gt;というアナウンスです。&lt;&#x2F;p&gt;
&lt;p&gt;とても重要な意味を持つアナウンスだと思います。
AnthropicはOpenAIの強力なライバルで競合関係にあります。
デファクト・スタンダードが無い現状では対応する規格を提唱できたはずですが、
それをせずMCPサポートに舵を切ったのは素晴らしい経営判断だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;これにより、MCPがほぼ業界のデファクト・スタンダードになると思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCP(Model_Context_Protocol)とは&quot;&gt;MCP(Model Context Protocol)とは&lt;&#x2F;h2&gt;
&lt;p&gt;以前いくつか記事を書いていますが、ちゃんとMCPの説明を書いていませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;Model Context Protocol (MCP)は、大規模言語モデル(LLM)に対する指示を構造化す
るためのフレームワークです。&lt;&#x2F;p&gt;
&lt;p&gt;次のような要素から構成されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model（モデル）&lt;&#x2F;strong&gt; - AIモデルがどのように自分自身を認識し、振る舞うべきかを定義する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Context（コンテキスト）&lt;&#x2F;strong&gt; - モデルが参照すべき情報や知識を提供する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Protocol（プロトコル）&lt;&#x2F;strong&gt; - モデルの動作や応答方法のルールを設定する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;03&#x2F;28&#x2F;claude-integration-with-inkdrop&quot;&gt;以前の記事&lt;&#x2F;a&gt;では、
&lt;strong&gt;Context&lt;&#x2F;strong&gt;を使って独自のナレッジ(Inkdrop)をClaudeに追加するということをやっただけですが、
Claude活用の可能性が途端に広がりものすごい効果を体感できました。これまでも
Contextの部分にだけ限るとRAG (Retrieval-Augmented Generation)という手法があ
りましたが、こんなに簡単にはできなかったと思います。&lt;&#x2F;p&gt;
&lt;p&gt;MCPではContextだけでなく、Protocolを通じて行動規範の設定や、Modelを通じた企業の
ブランドトーンに合わせた応答スタイルなどに応用できます。&lt;&#x2F;p&gt;
&lt;p&gt;MCPにより、明確に分離された要素(Model&#x2F;Context&#x2F;Protocol)に整理され、
単なるプロンプトエンジニアリングを超えて体系化されたアプローチで
AIの応答をより予測可能で一貫性のあるものにすることが可能となりました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MCPがデファクト・スタンダードになると&quot;&gt;MCPがデファクト・スタンダードになると&lt;&#x2F;h2&gt;
&lt;p&gt;MCPがデファクト・スタンダードとなればAI関連ツール間の標準化された通信パターンを
提供していることになるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;この事実を踏まえるとClaudeデスクトップがClaude Codeをナレッジソースとして扱えるように、次のよう
なことが可能になるかもしれません。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT-Claudeクロス連携&lt;&#x2F;strong&gt;: ChatGPTの回答をClaudeが評価するようなAIシステム間の直接的な情報交換や連携&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AIオーケストレーション&lt;&#x2F;strong&gt;: 複数の生成AIがそれぞれ
の強みを生かした連携し、結果を統合するようなワークフロー構築の可能性。例え
ば、データ解析はChatGPT、文章生成はClaude、検証はGeminiなどの役割分担するイ
メージ。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;統一ナレッジアクセス&lt;&#x2F;strong&gt;: マーケットにMCP準拠した多数のナレッジベースが
登場し、簡単に新しいナレッジを自社のAIに追加できる可能性&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;いずれも現時点で実現できるかどうか検証が必要というレベルです。
AIオーケストレーションなどは追加の標準化やツールが必要でしょう。
また、技術的に標準化の方向で協力できたからと言って、今後ビジネス上の判断で
その適用範囲が制限される可能性はあります。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、このような動きを見ていると、加速度的にAIの世界が拡がっていくのを実感しています。楽しみです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">MCPをサポートしたAnthropicのClaudeで試しましたが、その可能性に驚きました。3月末にはOpenAIもMCP対応を表明していたので楽しみです。</summary>
        </entry><entry xml:lang="en">
        <title>Back in the Game</title>
        <published>2025-04-07T00:00:00+00:00</published>
        <updated>2025-04-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/job/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/job/</id>
        
            <content type="html">&lt;p&gt;そう言えば、しばらくぶらぶらしていましたが、4月から仕事に復帰しました。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;5c65vfd276Y&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">そう言えば、しばらくぶらぶらしていましたが、4月から仕事に復帰しました。</summary>
        </entry><entry xml:lang="en">
        <title>Open Graph Protocol対応</title>
        <published>2025-04-07T00:00:00+00:00</published>
        <updated>2025-04-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/open-graph-protocol/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/open-graph-protocol/</id>
        
            <content type="html">&lt;h2 id=&quot;Open_Graph_Protocolとは&quot;&gt;Open Graph Protocolとは&lt;&#x2F;h2&gt;
&lt;p&gt;Open Graph Protocol(OGPとも呼ばれます)は、Webページの内容をSNSなどで共有する際に、正確な情報を
表示するための仕組みです。
2010年にFacebookが開発し、現在は多くのWebサイトで採用されています。&lt;&#x2F;p&gt;
&lt;p&gt;OGPでは、HTMLのhead内にmeta要素を配置し、「og:」というプレフィックスを持つプ
ロパティを使用して、ページの様々な情報を定義します。
主な要素としては、ページのタイトル、ページの説明、サムネイル画像のURL、
正規URLなどがあります。&lt;&#x2F;p&gt;
&lt;p&gt;これらの情報を適切に設定することで、FacebookやTwitter、LINEなどのSNSでリンクがシェアされた際に、
単なるURLではなく、タイトル、説明文、画像を含む魅力的なプレビューカードが表示されます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;このブログの対応&quot;&gt;このブログの対応&lt;&#x2F;h2&gt;
&lt;p&gt;記事ページのメタ情報を管理している&lt;code&gt;lib&#x2F;metadata.ts&lt;&#x2F;code&gt;を修正してOGPに対応するヘッダを
追加するロジックを入れました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;export function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; generateArticleMetadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  article&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Article&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Metadata&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; pathがある場合はURLを生成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;    ?&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; generateArticleUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js z-source&quot;&gt;path)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;    :&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-undefined z-js&quot;&gt; undefined&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; OGP画像のURL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; ogImageUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; generateOgImageUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    authors&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;author&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; siteConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;author&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; OGP設定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    openGraph&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      siteName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; siteConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;sitename&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; article&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;article&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;      ...&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; ogImageUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1200&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 630&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          alt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; siteConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;sitename&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; 他にも必要なメタデータがあれば追加可能&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next.jsがOGPのヘッダを生成する&lt;code&gt;openGraph&lt;&#x2F;code&gt;関数を提供しているので呼び出してい
るだけです。記事自体のフルパスが必要ですが、面倒なので記事内でパスを渡すよう
にしました。&lt;&#x2F;p&gt;
&lt;p&gt;また、MDXファイル内の&lt;code&gt;Image&lt;&#x2F;code&gt;で参照している画像のフルパスはこの処理では得られ
ないので、仕方なく固定の画像を指定しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;自身はたまにBlueskeyにリンクを投稿するくらいなので、それほど必要性は高くあり
ませんが、実装自体は簡単なので対応しているの越したことはありませんね。&lt;&#x2F;p&gt;
</content>
        <summary type="html">このブログは適当に実装したので、Open Graph Protocolに対応してしていませんでした。今更ですが、Open Graph Protorol対応しSNSでリンクを投稿した時に記事情報が表示できるようにしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>Aria Pro II PE-1500のブリッジについて</title>
        <published>2025-04-07T00:00:00+00:00</published>
        <updated>2025-04-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/pe-1500ri/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/pe-1500ri/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;04&amp;#x2F;pe-1500ri&amp;#x2F;pe-1500.webp?h=4fcaae6bec668a45d620&quot;
  alt=&quot;Aria Pro II PE1500RI&quot; width=&quot;1920&quot; height=&quot;1080&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Aria_Pro_II_PE-1500RIとは&quot;&gt;Aria Pro II PE-1500RIとは&lt;&#x2F;h2&gt;
&lt;p&gt;PEシリーズは、国産ブランド アリアプロⅡ が1976年に発表したモデルです。
その初代となる最上位機種が&quot;PE-1500&quot;で、トップ・バックと美しいアーチを描いた
メイプルボディに、メイプルネックです。
当時元バイオリンを制作していた現在はアトランシアを率いている林 信秋さんの
による設計でした。レスポールシェイプながら、
メープル単版カーブドトップ＆バック（両面削りだし）のボディからは、
レスポールとはまた違った明るい乾いた音でした。&lt;&#x2F;p&gt;
&lt;p&gt;PE-1500RIは、PE-1500のリシューモデルです。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;Body&lt;&#x2F;dt&gt;
  &lt;dd&gt;Maple Carved Top&#x2F;Back,Chambered block&lt;&#x2F;dd&gt;
  &lt;dt&gt;Neck&lt;&#x2F;dt&gt;
  &lt;dd&gt;Maple, Set-Neck, Heel-less Cutaway&lt;&#x2F;dd&gt;
  &lt;dt&gt;Fingerboard&lt;&#x2F;dt&gt;
  &lt;dd&gt;Madagascar Rosewood&lt;&#x2F;dd&gt;
  &lt;dt&gt;Frets&lt;&#x2F;dt&gt;
  &lt;dd&gt;22F&lt;&#x2F;dd&gt;
  &lt;dt&gt;Scale&lt;&#x2F;dt&gt;
  &lt;dd&gt;648mm&lt;&#x2F;dd&gt;
  &lt;dt&gt;Pickups&lt;&#x2F;dt&gt;
  &lt;dd&gt;Dimarzio Super Distortion Humbucking&lt;&#x2F;dd&gt;
  &lt;dt&gt;Controls&lt;&#x2F;dt&gt;
  &lt;dd&gt;1 Volume, 1 Tone, 3-way Selector SW&lt;&#x2F;dd&gt;
  &lt;dt&gt;Bridge&lt;&#x2F;dt&gt;
  &lt;dd&gt;Original &quot;Super Matic&quot; Bridge&lt;&#x2F;dd&gt;
  &lt;dt&gt;Machineheads&lt;&#x2F;dt&gt;
  &lt;dd&gt;Grover 102C&lt;&#x2F;dd&gt;
  &lt;dt&gt;Hardware&lt;&#x2F;dt&gt;
  &lt;dd&gt;Chrome&lt;&#x2F;dd&gt;
  &lt;dt&gt;Finish&lt;&#x2F;dt&gt;
  &lt;dd&gt;SBR(Stained Brown)&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h2 id=&quot;Super_Matic_Bridgeの弦の貼り方&quot;&gt;Super Matic Bridgeの弦の貼り方&lt;&#x2F;h2&gt;
&lt;p&gt;このPE-1500はSuper Matic Bridgeというオリジナルのブリッジが採用されています。
テールピースとブリッジが一体化したもので、1970年代の「オリジナルを作ろう」と
いう気概を感じます。リシューモデルも金型から作って復刻されています。&lt;&#x2F;p&gt;
&lt;p&gt;以下のような形をしています。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;smb.webp&quot; alt=&quot;Super Matic Bridge&quot; &#x2F;&gt;
  &lt;figcaption&gt;Super Matic Bridige&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;上面から見ると分かりますが、底に切れ込みの入った穴があります。
このギターを購入した時、この切れ込みにボールエンドを引っかけて弦が
貼ってありました。&lt;&#x2F;p&gt;
&lt;p&gt;「そういうものかな」と思って従っていたのですが、このブリッジは弦の張力で
ブリッジポストに固定される仕組みとなっています。この切れ込みにボールエンド
を通すやり方だと、弦を張っているときにブリッジが動いてしまい安定しません。
また、単純に弦を張るまでに切れ込みからボールエンドが外れて失敗することも
あります。&lt;&#x2F;p&gt;
&lt;p&gt;今日、アリアプロの&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ariaguitars.com&#x2F;jp&#x2F;items&#x2F;electric-guitars&#x2F;pe&#x2F;pe-1500ri&#x2F;&quot;&gt;サイト&lt;&#x2F;a&gt;
を見ていて気付きました。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;smb2.webp&quot; alt=&quot;Super Matic Bridge&quot; &#x2F;&gt;
  &lt;figcaption&gt;Super Matic Bridigeの正しい弦の張り方&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;テールエンドの穴にボールエンドを通せば良かったのね。やっぱり。&lt;&#x2F;p&gt;
</content>
        <summary type="html">PE-1500RIにはオリジナルのブリッジが付いていますが、ずっと弦の貼り方を間違っていたことに1年近く経って気付きました。</summary>
        </entry><entry xml:lang="en">
        <title>Beyond Distortion : Rethinking My Guitar Effects Chain</title>
        <published>2025-04-06T00:00:00+00:00</published>
        <updated>2025-04-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/beyond-distortion/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/beyond-distortion/</id>
        
            <content type="html">&lt;p&gt;アンプの歪みをより深く追求するため、
先日Strymon Iridiumから新たにSimplifier MK-IIへの移行しました。
この機材更新を契機に長らく手つかずだったエフェクターセットアップ全体を
見直し始めました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;変更前&quot;&gt;変更前&lt;&#x2F;h2&gt;
&lt;p&gt;変更前の状態です。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;ge1.webp&quot; alt=&quot;変更前&quot; &#x2F;&gt;
  &lt;figcaption&gt;変更前&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;ProvidenceのVitalizer付のジャンクションボックスを利用していますが、
全体は直列接続です。
歪みは基本的にStrymon SunsetとIridiumで作っていました。
キレイな歪みなのですが、どこか自然ではない気がしていたので見直しました。&lt;&#x2F;p&gt;
&lt;p&gt;また全体でグランドループになってしまっているのも気になっていました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;変更後&quot;&gt;変更後&lt;&#x2F;h2&gt;
&lt;p&gt;Iridiumに替えて、&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;02&#x2F;simplifier-mk2&#x2F;&quot;&gt;2月の記事&lt;&#x2F;a&gt;で
紹介したようアンプ部はフルアナログのSimplifier MK-IIを導入しています。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;ge2.webp&quot; alt=&quot;変更後&quot; &#x2F;&gt;
  &lt;figcaption&gt;変更後&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;IridiumからSimplifier MK-IIに移行
&lt;ul&gt;
&lt;li&gt;練習時はYAMAHAのスピーカーに出力&lt;&#x2F;li&gt;
&lt;li&gt;録音時はDIステレオアウトからXLR接続としMOTU M2経由でMacに&lt;&#x2F;li&gt;
&lt;li&gt;El Capistan V2(ディレイ)はSEND&#x2F;RETURNで接続。空間系はLogicPro内で掛けることが多いので、録音時は基本的にはオフ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;SUNSETは売却
&lt;ul&gt;
&lt;li&gt;Simplifier MK-IIのPreampとPower Amp ＋前段のオーバードライブとブースター
で歪みは作る&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;出力をSimplifier MK-IIからXLR接続と変更したのに伴い、Providenceのジャンクションボ
ックスを廃止
&lt;ul&gt;
&lt;li&gt;RC Boosterをバッファ替わりに前段へと変更。イコライザーの効きもよいので
積極的に音作りで切るブースターとしても優秀&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;現時点ではこんなところです。「
&lt;a href=&quot;&#x2F;blog&#x2F;2025&#x2F;04&#x2F;biscayne-blue&#x2F;&quot;&gt;Biscayne Blue&lt;&#x2F;a&gt;
」は、このシステムで使い弾きました。&lt;&#x2F;p&gt;
&lt;p&gt;悩んでいるのは次のような点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;クリーンやローゲインでSimplifier MK-IIは非常によい音が得られるが、
ハイゲインでは歪みの粒が荒すぎて好みでないので、ハイゲインの歪みが欲しい&lt;&#x2F;li&gt;
&lt;li&gt;しかし、RC Booster&#x2F;Compadreにもブースト機能があり、ローゲインの歪みとの重複感がある。
一方、多段でブーストできるからハイゲインの歪みは不要か&lt;&#x2F;li&gt;
&lt;li&gt;歪みはもう少し汎用性の高いもので、2個程度に絞った方がよいか&lt;&#x2F;li&gt;
&lt;li&gt;いっそ歪み系の切り替えのためにスイッチャー入れるか&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;悩みは尽きず、エフェクターで悩む前に腕上げろって話ですが。&lt;&#x2F;p&gt;
</content>
        <summary type="html">In pursuit of deeper amp-driven distortion, I recently upgraded from theStrymon Iridium to the Simplifier MK-II. This gear transition became theperfect opportunity to thoroughly revisit my long-neglected effects setup,beginning a journey of rediscovering sonic possibilities.</summary>
        </entry><entry xml:lang="en">
        <title>Biscayne Blue</title>
        <published>2025-04-04T00:00:00+00:00</published>
        <updated>2025-04-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/biscayne-blue/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/biscayne-blue/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2070664308&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;biscayne-blue&quot; title=&quot;Biscayne Blue&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Biscayne Blue&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;マイアミサウンド全開で、今ではあまり聞けないなんとも懐かしい曲調です。
確かレコーディングもマイアミだったかな。&lt;&#x2F;p&gt;
&lt;p&gt;オリジナルはアーミングが派手に入っていますが、ロック式トレモロアーム付のギ
ターは売却したので普通に弾いています。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;Guitar&lt;&#x2F;dt&gt;
  &lt;dd&gt;Aria Pro II PE-1500&lt;&#x2F;dd&gt;
  &lt;dt&gt;Effector&lt;&#x2F;dt&gt;
  &lt;dd&gt;BOSS DF-2, Strymon Compadre&lt;&#x2F;dd&gt;
  &lt;dt&gt;Amp&lt;&#x2F;dt&gt;
  &lt;dd&gt; DSM&#x2F;HUMBOLDT Simplifier MK-II&lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
</content>
        <summary type="html">高中正義さんの1988年リリースのアルバム『Hot Pepper』から”Biscayne Blue&quot;をコピーしてみました。</summary>
        </entry><entry xml:lang="en">
        <title>Nintendo Switch 2発表</title>
        <published>2025-04-02T00:00:00+00:00</published>
        <updated>2025-04-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/switch2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/switch2/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;04&amp;#x2F;switch2&amp;#x2F;switch.webp?h=fc57b25e441cde089768&quot;
  alt=&quot;Switch2&quot; width=&quot;800&quot; height=&quot;426&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;本日22時から&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;live&#x2F;nkaodTSlhbU?si=5bYJKeb8Ss0yhWft&quot;&gt;Nintendo
Direct&lt;&#x2F;a&gt;でSwitch2
の発表がありました。&lt;&#x2F;p&gt;
&lt;p&gt;本体が5万円を切り、同時に発売されるゲームもNINTENDOだけでなくサードパーティ
のゲームも多数準備したようでNINTEDOの力の入れようが伝わってきました。&lt;&#x2F;p&gt;
&lt;p&gt;6月2日発売。買いましょう。&lt;&#x2F;p&gt;
&lt;p&gt;以下は、ライブ動画から読み取ったメモです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;NINTENDO_SWITCH_2について&quot;&gt;NINTENDO SWITCH 2について&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;本体は6月5日発売予定&lt;&#x2F;li&gt;
&lt;li&gt;価格は動画でアナウンスがなかったが &lt;strong&gt;税込49,980円&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;画面が拡大&lt;&#x2F;li&gt;
&lt;li&gt;解像度は2倍、120fpsに対応、HDR対応&lt;&#x2F;li&gt;
&lt;li&gt;厚さは変わらず&lt;&#x2F;li&gt;
&lt;li&gt;ヘッドフォンで立体サラウンド&lt;&#x2F;li&gt;
&lt;li&gt;背面スタンドの角度は可変&lt;&#x2F;li&gt;
&lt;li&gt;本体上部にUSB-C端子追加&lt;&#x2F;li&gt;
&lt;li&gt;本体目盛りが32GBから128GBに&lt;&#x2F;li&gt;
&lt;li&gt;新しいDOCK。4Kに対応。冷却ファン付&lt;&#x2F;li&gt;
&lt;li&gt;SWITCHのソフトも利用可能&lt;&#x2F;li&gt;
&lt;li&gt;本体は日本国内専用&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;NINTENDO_SWITCH2のハイライト&quot;&gt;NINTENDO SWITCH2のハイライト&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;MARIO CART WORLD（同日発売、専用ソフト）
&lt;ul&gt;
&lt;li&gt;完全新作。コースを飛び出しすべてフィールドを走ることができる。コース間の移動もレース？&lt;&#x2F;li&gt;
&lt;li&gt;サイバイバルという複数コースを通したラリーのような新モード、競争でなく自由に走れるフリーモードが追加&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;JOY CON2の
&lt;ul&gt;
&lt;li&gt;Cボタン追加
&lt;ul&gt;
&lt;li&gt;フレンドとのボイスチャットが可能となる。マイクは本体。ノイズキャンセリング付&lt;&#x2F;li&gt;
&lt;li&gt;ゲーム画面の共有も可能、別のゲームでも共有可能&lt;&#x2F;li&gt;
&lt;li&gt;別売りのカメラで自身の姿をゲームに合成して共有可能&lt;&#x2F;li&gt;
&lt;li&gt;2026年3月までニンテンドーオンラインがなくても無料で利用可能？&lt;&#x2F;li&gt;
&lt;li&gt;マグネット式&lt;&#x2F;li&gt;
&lt;li&gt;スティックの大型化&lt;&#x2F;li&gt;
&lt;li&gt;マウスとしても利用可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;おすそ分け通信
&lt;ul&gt;
&lt;li&gt;一台にゲームが入っていれば、対応ソフト限定だが同時プレイであれば他のSwitchで他のユーザーもプレイ可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;新ゲーム：ひみつ展
&lt;ul&gt;
&lt;li&gt;SWITCHのハードウェアを紹介するゲーム。無料？&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;周辺機器情報
&lt;ul&gt;
&lt;li&gt;ゲームカードはSWITCHと同形状だが、転送速度が違う&lt;&#x2F;li&gt;
&lt;li&gt;SDカードは使えず、SD EXPRESSカード&lt;&#x2F;li&gt;
&lt;li&gt;SWITCH 2 Pro Controller。背面ボタン追加&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;NINTENDO ONLINE
&lt;ul&gt;
&lt;li&gt;これまで通り使える&lt;&#x2F;li&gt;
&lt;li&gt;SWITCH 2専用の追加パックも用意。
&lt;ul&gt;
&lt;li&gt;GAMECUBEのシミュレーターも追加&lt;&#x2F;li&gt;
&lt;li&gt;GAMECUBEっぽいコントローラーも追加発売&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;専用ソフト&quot;&gt;専用ソフト&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Nintendo Switch 2 Edition
&lt;ul&gt;
&lt;li&gt;解像度&#x2F;フレームレートを上げるなどの改造、マイクやカメラなど専用ハードを利用した機能を追加。すでにSwitch版を持っているユーザーはアップグレードできる&lt;&#x2F;li&gt;
&lt;li&gt;スーパーマリオジャンボリー&lt;&#x2F;li&gt;
&lt;li&gt;ゼルダの伝説(Breath of World, Teas of the Kingdom)&lt;&#x2F;li&gt;
&lt;li&gt;星のカービィ・ディスカバリー&lt;&#x2F;li&gt;
&lt;li&gt;METROID PRIME 4&lt;&#x2F;li&gt;
&lt;li&gt;POKEMON LEGENDS&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;NINTENDO新作
&lt;ul&gt;
&lt;li&gt;DRAG x DRIVE
&lt;ul&gt;
&lt;li&gt;マウス操作の車いすバスケットボール&lt;&#x2F;li&gt;
&lt;li&gt;ゼルダの無双(光栄テクノとの共同開発?)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;カービィのエアライダー&lt;&#x2F;li&gt;
&lt;li&gt;ドンキーコング&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;サードパーティ新作
&lt;ul&gt;
&lt;li&gt;ELDEN RING&lt;&#x2F;li&gt;
&lt;li&gt;HADES II&lt;&#x2F;li&gt;
&lt;li&gt;ストリートファイター6&lt;&#x2F;li&gt;
&lt;li&gt;ARSENAL&lt;&#x2F;li&gt;
&lt;li&gt;SPLIT FICTION&lt;&#x2F;li&gt;
&lt;li&gt;EA SPORTS FC&lt;&#x2F;li&gt;
&lt;li&gt;LOGWARTS LEGACY&lt;&#x2F;li&gt;
&lt;li&gt;オバケイドロ&lt;&#x2F;li&gt;
&lt;li&gt;HITMAN&lt;&#x2F;li&gt;
&lt;li&gt;PROJECT 007&lt;&#x2F;li&gt;
&lt;li&gt;龍が如く0&lt;&#x2F;li&gt;
&lt;li&gt;BORDERANDS4&lt;&#x2F;li&gt;
&lt;li&gt;CIVILIZARTION VII&lt;&#x2F;li&gt;
&lt;li&gt;NBA 2K&lt;&#x2F;li&gt;
&lt;li&gt;サバイバル・キッズ&lt;&#x2F;li&gt;
&lt;li&gt;エンター・ザ・ガンダン2&lt;&#x2F;li&gt;
&lt;li&gt;SHINE POST&lt;&#x2F;li&gt;
&lt;li&gt;CYBERPUNK&lt;&#x2F;li&gt;
&lt;li&gt;FINAL FUNTASY VII(リメイク)&lt;&#x2F;li&gt;
&lt;li&gt;DUSTBLOODS (2026年)&lt;&#x2F;li&gt;
&lt;li&gt;その他多数&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">ついにNintendo DirectでSwitch 2を発表。本日22時からNintendo Directで発表がありました。6月5日発売です。</summary>
        </entry><entry xml:lang="en">
        <title>NHK vs 日本IBM：89億円案件の破綻を勝手に思考する</title>
        <published>2025-03-31T00:00:00+00:00</published>
        <updated>2025-03-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/nhk-ibm/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/nhk-ibm/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;nhk-ibm&amp;#x2F;nhk.webp?h=e0aa354dcd527f1b3952&quot;
  alt=&quot;NHK問題&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
 &lt;details&gt;
  &lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;p&gt;日本放送協会（NHK）がシステム開発の中止を巡り日本IBMを提訴しています。以前日
本IBMに勤務していた経験があり関わりもあったため気になったのでまとめてみまし
た。ただし、すでに日本IBMを離れて3年以上経過しており、内部事情を知る立場には
ありません。あくまで報道を読んだ第三者としての感想にすぎないことをご了承くださ
い。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;経緯&quot;&gt;経緯&lt;&#x2F;h2&gt;
&lt;p&gt;日本放送協会（NHK）がシステム開発の中止を巡り日本IBMを提訴しています。以前日
本IBMに勤務していた経験があり関わりもあったため気になったのでまとめてみまし
た。ただし、すでに日本IBMを離れて3年以上経過しており、内部事情を知る立場には
ありません。あくまで報道を読んだ第三者としての見解であることをご了承くださ
い。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;プロジェクトの背景と計画&quot;&gt;プロジェクトの背景と計画&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;NHKは富士通製メインフレームで稼働する営業基幹システムの刷新を計画。富士通
製メインフレームがEOLを迎える2027年3月末までに現行システムを別のプラット
フォームに移行する必要があった。&lt;&#x2F;li&gt;
&lt;li&gt;対象となった業務システムは、メインフレーム上を中心に構築された「営業基幹シ
ステム（EGGS）」。同システムは受信契約者の契約情報の管理や受信料の請求処理な
ど、NHKの受信料関係業務全般を支えている。2001年8月から20年以上稼働しており、
度重なる更改を経てきた。&lt;&#x2F;li&gt;
&lt;li&gt;NHKはこのシステムをオープン系に移行することを決め、プラットフォームとして
Google Cloud Platform（以降、 GCP）を選択。GCPの採用理由は「当協会の別システム
で利用実績があった」ためと報道されている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;移行準備と入札&quot;&gt;移行準備と入札&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;NHKは2020年8月、アクセンチュアの支援を受けて要件定義書の作成に着手。同定義
書によると、移行対象となるプログラムは約1030万ステップ。&lt;&#x2F;li&gt;
&lt;li&gt;ホスト側のプログラムには、COBOLやJCL（ジョブ制御言語）、ADL（Aim
Description Language）、アセンブラーなどが約790万ステップ。&lt;&#x2F;li&gt;
&lt;li&gt;ホストと接続するクライアント側には、PowerCOBOLやC、C++ で記述したプログラ
ム（約240万ステップ）などがあった。&lt;&#x2F;li&gt;
&lt;li&gt;2022年9月、NHKは新システムへの移行業務について公開入札を開始。入札したのは
日本IBMを含む3社。2022年12月に委託金額89億5842万6004円（税込み）で日本IBMが
受注。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;プロジェクトの進行と問題発生&quot;&gt;プロジェクトの進行と問題発生&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;日本IBMは2023年1月からプロジェクトを開始。2023年3月末までに現行システムの
分析や移行計画の妥当性を判断するアセスメント工程を完了。&lt;&#x2F;li&gt;
&lt;li&gt;日本IBMは対象システムの「業務管理機能(約40万ステップ)」をリライト方式で移
行することとし、2023年4月から2024年2月末までにアーキテクチャー設計・基本設計
を完了。&lt;&#x2F;li&gt;
&lt;li&gt;リライトについて、ハンガリーのFreeSoftも担当することになった。&lt;&#x2F;li&gt;
&lt;li&gt;ところが2024年3月になって日本IBMは詳細設計に進めず、「最低16カ月の延伸が必
要」とNHKに通知。&lt;&#x2F;li&gt;
&lt;li&gt;その後代替策を模索するも、2024年5月に日本IBMは18ヶ月の延伸が必須で予定の納
期遵守が難しいことを通告。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;契約解除と提訴&quot;&gt;契約解除と提訴&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;これを受け、2024年8月にNHKはEOLまでに移行はできないと判断し日本IBMとの業務
委託契約を解除。&lt;&#x2F;li&gt;
&lt;li&gt;NHKは2025年2月3日付で日本IBMを提訴。システム開発の業務委託契約の解除に伴う
支払い済み代金の返還と損害賠償を求め、請求額は54億6992万7231円。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;クラウド基盤への移行業務を日本IBMに委託しましたが、上記のようプロジェクトは難航しました。
昨年、納期に間に合わないことが判明し、日本IBMとの委託契約解除に至ります。
NHKは54億円の損害賠償を請求し、日本IBMも真っ向から反論している状況です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人的な評価&quot;&gt;個人的な評価&lt;&#x2F;h2&gt;
&lt;p&gt;経緯を整理してみても、責任の所在や意思決定プロセスには不明瞭な点が多く、特に
「誰が移行方式を最終決定したのか」という重要な点さえ判然としません。公開情報
だけでは全体像の把握は難しいものの、この事例から読み取れる教訓と問題点につい
て、IT業界での経験を踏まえて私見を述べたいと思います。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;NHKについて&quot;&gt;NHKについて&lt;&#x2F;h3&gt;
&lt;p&gt;ITプロジェクトに関わった経験がある人であれば、「NHKはプロジェクトを適切に統制できていなかったのではないか」という印象を持つでしょう。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;高リスクプロジェクトの体制不備&quot;&gt;高リスクプロジェクトの体制不備&lt;&#x2F;h4&gt;
&lt;p&gt;20年以上運用してきたメインフレームの業務システムを別のプラットフォームに移
行するという作業は、本質的に高リスクなプロジェクトです。このような移行を成功
させるためには、最低でも以下が前提条件となります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;現行システムの機能要件の完全な把握&lt;&#x2F;li&gt;
&lt;li&gt;システム内部構造の詳細な理解&lt;&#x2F;li&gt;
&lt;li&gt;業務ロジックに関する十分な知見&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;今回の事例では、現行システムの開発・保守を担当し、これらの知見を有していたであろう富士通ではなく、日本IBMが移行を担当することになりました。このような状況で成功するためには、NHK自身が十分な知見を持ち、プロジェクトに積極的に関与することが不可欠だったはずです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし経緯を見る限り、NHKは日本IBMに発注した後、主導的な役割を果たさず「委託して任せる」というスタンスだったのではないかと推察されます。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;組織改革の影響&quot;&gt;組織改革の影響&lt;&#x2F;h4&gt;
&lt;p&gt;この移行の要件定義とIBMへの発注が決まった2020年〜2023年の時期は、前田晃
伸氏が会長を務め、多数のコンサルタントを起用して中期経営計画のもとダウンサイ
ジングと構造改革を推進していた時期と重なります。これを考慮すると、以下のよう
な懸念が浮かび上がります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;意思決定の歪み&lt;&#x2F;strong&gt;: 移行方式がアーキテクチャー上の合理性よりも、組織内の政治的動向によって決定された可能性&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;知識の流出&lt;&#x2F;strong&gt;: 50歳以上の早期退職や管理職の大幅削減（3割）の結果、以下のような問題が生じた可能性&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;基幹システムのプロジェクトを適切に統制するノウハウの喪失&lt;&#x2F;li&gt;
&lt;li&gt;各業務に関連した要件を検証するための深い知識の流出&lt;&#x2F;li&gt;
&lt;li&gt;システム移行に必要な経験を持つ人材の減少&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;リーダーシップの問題&quot;&gt;リーダーシップの問題&lt;&#x2F;h4&gt;
&lt;p&gt;前田晃伸氏は富士銀行出身で、最終的にみずほフィナンシャルグループの社長・会長
を務めた人物です。彼の在任中、みずほは2000年代に勘定系システムの統合で大規
模な障害を経験しています。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mizuhobank.co.jp&#x2F;company&#x2F;release&#x2F;bk&#x2F;2011&#x2F;pdf&#x2F;news110520_4.pdf&quot;&gt;みずほ自身のシステム障害特別調査委員会の報告&lt;&#x2F;a&gt;
や&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.shippai.org&#x2F;fkd&#x2F;cf&#x2F;CA0000623.html&quot;&gt;日経クロステックの記事&lt;&#x2F;a&gt;に
よると、その障害の主な原因は次の通りとされました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;現行システムに対する知見の欠如&lt;&#x2F;li&gt;
&lt;li&gt;危機的状況に対応できる組織力の欠如&lt;&#x2F;li&gt;
&lt;li&gt;経営層のIT統制力の欠如&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの問題点は、今回のNHKの事例にも当てはまる可能性があります。経験豊富なシニア層の人員整理、富士通から日本IBMへの移行担当の変更、そして安易に大胆な移行方針を許容する経営判断というパターンが、みずほの過去の失敗と類似しています。&lt;&#x2F;p&gt;
&lt;p&gt;現在の契約解除により移行計画は頓挫していますが、2027年のEOLは確実に迫ってい
ます。NHKは今後どのような対応をとるのか、注目される点です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;IBMについて&quot;&gt;IBMについて&lt;&#x2F;h3&gt;
&lt;p&gt;プロジェクトを十分に管理できなかったクライアント側に対してベンダーとして同情すべき点はありますが、日本IBM側にも以下のような問題点があったと考えられます。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;プロジェクト受注の判断&quot;&gt;プロジェクト受注の判断&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高リスクプロジェクトの安易な受注&lt;&#x2F;strong&gt;: 富士通が開発・保守し、アクセンチュア
が要件定義を実施した大規模システムの移行プロジェクトは本質的に超ハイリスクで
す。このような状況下でプロジェクトを受注すること自体、リスク管理の観点から疑
問が残る。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;アセスメント期間の不足&lt;&#x2F;strong&gt;: 2023年1月から3月末までの約3か月間でのアセスメ
ント工程は、1000万ステップを超える大規模システムの分析としては明らかに短すぎ
ました。事実、後に要件定義では明らかになっていなかった文書化されていない仕様
や変更が浮上している。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;見積りと実行体制の問題&quot;&gt;見積りと実行体制の問題&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;予算の不足&lt;&#x2F;strong&gt;: 40万ステップのリライト方式による移行に対して約90億円弱とい
う見積もりは、プロジェクトの複雑さを考慮すると低く見積もりすぎた可能性がある&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;パートナー選定の疑問&lt;&#x2F;strong&gt;: メインフレームからのモダナイゼーションに実績のあ
るTISなどの国内企業ではなく、実績が不明確なハンガリーのFreeSoftを選定した理
由が不明。特に過去にも同様の失敗事例があったにもかかわらず、このような選
択をした判断には疑問が残る&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;組織的課題&quot;&gt;組織的課題&lt;&#x2F;h4&gt;
&lt;p&gt;おそらく日本IBM内ではコミュニケーションセクターがこのプロジェクトを担当して
いたと推測されますが、金融セクターなどと比較すると大型案件の経験が少なく、こ
のような複雑な移行プロジェクトに対する十分な経験者も不足していた可能性があり
ます。それにもかかわらず、受注に踏み切ってしまったことが、後の問題につながっ
たのではないでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;同時に、移行の複雑さを当初から認識していたにもかかわらず、クライアントに対し
て十分なリスク説明や実現可能な代替案の提示が不足していた可能性も否定できませ
ん。大規模プロジェクトでは、技術的な実行能力だけでなく、リスクの透明な伝達と
現実的な期待値の設定も成功の鍵となります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;リライト方式の移行について&quot;&gt;リライト方式の移行について&lt;&#x2F;h2&gt;
&lt;p&gt;メインフレームのシステムは富士通の撤退などもあり、多くの企業がライフサイクル終了に向けた対応を迫られています。こうした状況下で、「リライト方式」によるオープン系やクラウドへの移行を実施・計画している企業は少なくありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;リライト方式とは&quot;&gt;リライト方式とは&lt;&#x2F;h3&gt;
&lt;p&gt;リライト方式とは、既存のメインフレームのコードから機能や要件を分析し、現代の
技術、言語、アーキテクチャーを使ってシステムを一から再設計していく手法です。
一般的な流れは次の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;既存コードの自動分析（パターン認識やAI、機械学習などを利用したツールの活用）&lt;&#x2F;li&gt;
&lt;li&gt;ビジネスルールや処理ロジックの抽出&lt;&#x2F;li&gt;
&lt;li&gt;コード変換ツールを用いたJavaなどの現代的言語への自動変換&lt;&#x2F;li&gt;
&lt;li&gt;必要に応じた調整と最適化&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;リライト方式の問題点&quot;&gt;リライト方式の問題点&lt;&#x2F;h3&gt;
&lt;p&gt;私はメインフレームでの開発・保守経験と、現代的な言語やフレームワークでの開発
経験の両方を持つ立場から、このリライト方式には以下のような本質的な問題がある
と考えています。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;暗黙知の喪失&quot;&gt;暗黙知の喪失&lt;&#x2F;h4&gt;
&lt;p&gt;コード分析では、コードに埋め込まれた文書化されていない次のような
「暗黙知」を十分に捉えることができません。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネスルールの背景にある理由&lt;&#x2F;li&gt;
&lt;li&gt;例外処理が導入された経緯&lt;&#x2F;li&gt;
&lt;li&gt;特定の実装が選ばれた理由&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの理解がないまま移行すると、移行後のシステム維持できない可能性があります。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;保守性の低下&quot;&gt;保守性の低下&lt;&#x2F;h4&gt;
&lt;p&gt;コード変換ツールによって生成されたコードには以下のような問題が生じがちです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;可読性の低さ（人間による理解が困難）&lt;&#x2F;li&gt;
&lt;li&gt;非効率な構造やアルゴリズム&lt;&#x2F;li&gt;
&lt;li&gt;デバッグや修正の困難さ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;つまり、移行が完了したとしても、その後の保守作業は極めて難しくなる可能性があります。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;技術的負債の継承&quot;&gt;技術的負債の継承&lt;&#x2F;h4&gt;
&lt;p&gt;現行システムの非効率で古い設計思想がそのまま新しいプラットフォームに移植され
てしまいます。これは本来、システム刷新の大きな目的である技術的負債の解消とい
う利点を失うことを意味します。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;新たな依存性の導入&quot;&gt;新たな依存性の導入&lt;&#x2F;h4&gt;
&lt;p&gt;コード変換ツールはしばしば固有のランタイムやライブラリに依存します。&lt;&#x2F;p&gt;
&lt;p&gt;「メインフレーム」という特定プラットフォームの縛りから逃れるために導入したは
ずが、さらに短い寿命、かつ保守が難しい可能性のある別の依存関係を作り出してしまう
矛盾が生じます。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;組織的スキルの阻害&quot;&gt;組織的スキルの阻害&lt;&#x2F;h4&gt;
&lt;p&gt;要件定義・設計をIT担当者が経験できず、新しいプラットフォームに対する実践的な
知識やスキルが組織内に蓄積されません。結果として、移行後も組織としての技術的
対応力が向上しない状態に陥ります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;総合的評価&quot;&gt;総合的評価&lt;&#x2F;h3&gt;
&lt;p&gt;以上を踏まえると、リライト方式は短期的には魅力的に見えるます。
しかし、長期的には割に合わないものと思えます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;移行プロジェクト自体のリスクが高い&lt;&#x2F;li&gt;
&lt;li&gt;移行が成功したとしても、保守性や拡張性に深刻な問題を抱えたシステムになる可能性が高い&lt;&#x2F;li&gt;
&lt;li&gt;組織としての技術力向上や知識蓄積に寄与しない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;では、どうすべきか&quot;&gt;では、どうすべきか&lt;&#x2F;h2&gt;
&lt;p&gt;私は「&lt;strong&gt;グリーンフィールド開発&lt;&#x2F;strong&gt;」(Greenfield Development)しかないのかなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;グリーンフィールド開発は、具体的には次のようなものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;既存コードを参照せず、現在のビジネス要件を基に新たに要件定義フェースを行う。&lt;&#x2F;li&gt;
&lt;li&gt;レガシーシステムの制約や過去の設計判断に縛られない。&lt;&#x2F;li&gt;
&lt;li&gt;最新技術やアーキテクチャを自由に選択する。&lt;&#x2F;li&gt;
&lt;li&gt;ビジネスプロセス自体の見直しや最適化も同時に行う。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「リライト方式」との違いは、リライトが既存システムの機能を基準に再構築するのに対し、グリーンフィールド開発は既存システムの機能にこだわらず、現在のビジネスニーズから改めて考え直す点です。当然、要件定義からやり直すため、より多くの時間とステークホルダーの関与が必要になります。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、以下のように考えてどうでしょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;企業の競争力の源泉とならないシステム
&lt;ul&gt;
&lt;li&gt;独自の社内システムは捨て、システム移行でなく&lt;strong&gt;カスタマイズしない&lt;&#x2F;strong&gt;SaaSなどに置き換えるリエンジニアリングで対応する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;企業の競争力を生み出すシステム
&lt;ul&gt;
&lt;li&gt;要件を理解しておくことは、いずれにしろ企業として必須。ならば、コードから逆算するのでなく、要件をきちんと今のビジネスに合わせて定義したほうがよい&lt;&#x2F;li&gt;
&lt;li&gt;要件定義をゼロから実施することで、要件定義の知見も社内に蓄積される&lt;&#x2F;li&gt;
&lt;li&gt;必要であればリライトで使われる分析ツールを併用して、要件定義の補強として使えば良い&lt;&#x2F;li&gt;
&lt;li&gt;肝は要件定義フェーズを行うことで、&lt;strong&gt;アーキテクティングや設計を確実に実施できる&lt;&#x2F;strong&gt;こと&lt;&#x2F;li&gt;
&lt;li&gt;アーキテクティングや設計ができれば、あとは普通の開発&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;どうでもよいシステムでも最初抵抗があるかもしれません。しかし、SaaSなどに乗り換え
ることでシステムに縛られず身軽になれます。&lt;&#x2F;p&gt;
&lt;p&gt;競争力を生み出すシステムはビジネスからの要求の変化も激しいので、要件定義から開発までスピードを持ってできる対応力がITにも問われているはずです。これを機にゼロから開発するほうがシステムの文書化、知見やスキルの蓄積もでき結果的にはお手軽に移行するより良い結果を生むと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;&#x2F;h2&gt;
&lt;p&gt;NHKと日本IBMの訴訟は、大規模システム移行プロジェクトが孕む本質的な課題を浮き
彫りにしています。長年運用された基幹システムの移行には、組織の体制、プロジェ
クト管理の手法、そして技術的なアプローチの全てが適切に機能する必要がありま
す。&lt;&#x2F;p&gt;
&lt;p&gt;今回の事例では、NHK側の要件理解とプロジェクト統制、IBM側の計画策定とリスク評
価、そして双方のコミュニケーションのいずれにも課題があったように見受けられま
す。訴訟の行方はともかく、メインフレームEOLという避けられない課題に対して、
NHKは今後どのような戦略で対応していくのか注目されます。&lt;&#x2F;p&gt;
&lt;p&gt;システム移行の方法論としてのリライト方式についての考察は、この事例から派生し
た1つの視点に過ぎませんが、多くの組織が直面している課題にも当てはまるのでは
ないと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">NHKが日本IBMに対して54億円の損害賠償を求めて提訴した大型システム移行の失敗。元IBM社員の視点から、組織管理の問題点、プロジェクトが頓挫した原因、そして2027年に迫るメインフレームEOLへの対応策を勝手に検討してみました。</summary>
        </entry><entry xml:lang="en">
        <title>Claude CodeをMCPサーバーとして利用する利点</title>
        <published>2025-03-29T00:00:00+00:00</published>
        <updated>2025-03-29T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/mcp-integration-of-claude-code-inkdrop/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/mcp-integration-of-claude-code-inkdrop/</id>
        
            <content type="html">&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;03&#x2F;28&#x2F;claude-integration-with-inkdrop&quot;&gt;前回の記事&lt;&#x2F;a&gt;では、 InkdropとClaude Desktopの統合について紹介しました。今回は一歩進んで、Claude CodeをMCPサーバーとして活用する方法とそのメリットについて詳しく解説します。&lt;&#x2F;p&gt;
&lt;!-- toc --&gt;
&lt;h2 id=&quot;MCP_ServerにもなれるClade_Code&quot;&gt;MCP ServerにもなれるClade Code&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeを頻繁に活用することでAnthropicへの支払いコストが増加していますが、一度使い始めるとコーディング作業では手放せなくなりつつあります。&lt;&#x2F;p&gt;
&lt;p&gt;そのClaude Codeは、MCP Clientになれることは知っていました。
しかし、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;mcp&quot;&gt;公式ドキュメント&lt;&#x2F;a&gt;を読んでいてMCP Serverにもなれるというチュートリアルを発見しました。&lt;&#x2F;p&gt;
&lt;p&gt;次のコマンドでMCP Serverとして起動できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mcp serve&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claude_DesktopにClaude_CodeをMCP_Serverとして登録&quot;&gt;Claude DesktopにClaude CodeをMCP Serverとして登録&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2025&#x2F;03&#x2F;28&#x2F;claude-integration-with-inkdrop&quot;&gt;Inkdropと同様&lt;&#x2F;a&gt;に、Claude Desktopに
Claude CodeをMCP Serverとして登録します。&lt;&#x2F;p&gt;
&lt;p&gt;また、&lt;code&gt;bash&lt;&#x2F;code&gt;の問題が起きそうだったので、例のごとくシェルスクリプトでWrapし&lt;code&gt;~&#x2F;bin&#x2F;claude-code-mcp&lt;&#x2F;code&gt;というファイル名で配置し実行権限を付けした。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env fish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mcp serve&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;作成したスクリプトを指定して、Claude Desktopの設定ファイル &lt;code&gt;~&#x2F;Library&#x2F;Application Support&#x2F;Claude&#x2F;claude_desktop_config.json&lt;&#x2F;code&gt;に追加します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;mcpServers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;inkdrop&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;Users&#x2F;foo&#x2F;bin&#x2F;inkdrop-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_SERVER_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;http:&#x2F;&#x2F;localhost:19840&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_USERNAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;foo&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_PASSWORD&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;bar&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;claude_code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;Users&#x2F;foo&#x2F;bin&#x2F;claude-code-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claude_DesktopからClaude_Codeにコード分析を依頼&quot;&gt;Claude DesktopからClaude Codeにコード分析を依頼&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeをClaude Desktopに正常に接続できたことを確認したので、次のステップとして実際にこのブログサイトのコードの分析を依頼してみます。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Claude Desktopのチャットインターフェースで、Claude Codeにアクセスするためのプロンプトを入力&lt;&#x2F;li&gt;
&lt;li&gt;分析したいプロジェクトのパスを明示的に指定&lt;&#x2F;li&gt;
&lt;li&gt;フォルダ階層の確認を依頼&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;初回実行時には、Claude Codeがファイルシステムにアクセスするための許可を求めるプロンプトが数回表示されました。これは、セキュリティ上の理由から必要な確認プロセスです。許可を与えると、Claude Codeは指定されたプロジェクトフォルダにアクセスし、次のよう分析しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;私：claude_code内の~&#x2F;ghq&#x2F;github.com&#x2F;foo&#x2F;blog-source&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    のプロジェクトにアクセスできますか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    また、プロジェクト内のフォルダ階層はどうなっていますか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;Users&#x2F;foo&#x2F;ghq&#x2F;github.com&#x2F;foo&#x2F;blog-sourceにアクセスできました。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;これはパーソナルブログのソースコードです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ブログの主な特徴：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Next.js 15, React 19, TypeScript, Tailwind CSSで構築&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MDXサポートで記事を書いている&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;レスポンシブデザイン&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ダークモード対応&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RSS、コードシンタックスハイライト、Giscusコメントシステム、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ソーシャルリンク、SoundCloudの埋め込み、Whisper機能、目次機能など&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;サイト設定では「Coded Chords」という名前のブログで、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;著者は「Toshiyuki Yoshida」です。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(以下、省略)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claude_Desktop&#x2F;Claude_Code&#x2F;InkdropのMCP統合&quot;&gt;Claude Desktop&#x2F;Claude Code&#x2F;InkdropのMCP統合&lt;&#x2F;h2&gt;
&lt;p&gt;Claude DesktopにはInkdropもMCP Serverとして登録されているので、コード解析結果をInkdropに記録させることもできます。&lt;&#x2F;p&gt;
&lt;p&gt;次のようにClaude Desktopで依頼してみました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;では、プロジェクト概要とプロジェクトのフォルダ構成について、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第三者が理解しやすいようサマリーを inkdrop内のNotebook Inboxに&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;「ブログの概要」というタイトルで作成してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;なお、形式はMarkdownを使用してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;結果、Claude Codeから取得し分析した結果、Markdown形式でInkdropのNoteとしてドキュメント化してくれました。&lt;&#x2F;p&gt;
&lt;p&gt;プロジェクト概要は&lt;code&gt;README.md&lt;&#x2F;code&gt;から読み取ったようですが、特筆すべきは、フォルダ構成や各ディレクトリの役割、記事管理の仕組みまで正確に把握・文書化している点です。&lt;&#x2F;p&gt;
&lt;p&gt;仕組みとしては全体像をダイアグラムにしてみました。次の通りです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;


&lt;noscript&gt;
    &lt;strong&gt;⚠️ JavaScript is required to render the diagram.&lt;&#x2F;strong&gt;
&lt;&#x2F;noscript&gt;
&lt;pre class=&quot;mermaid invertible-image&quot;&gt;
    flowchart TB
UserReq[ユーザーリクエスト&#x2F;指示]
CD[Claude Desktop]
CC[Claude Code]
BlogRepo[ブログリポジトリ]
InkdropMCP[inkdropapp&#x2F;mcp-server]

    subgraph Inkdrop[Inkdropアプリ]
        API[HTTP API]
        Notes[ノート]
    end

    %% 通常フロー
    UserReq --&gt;|会話形式の指示| CD
    CD --&gt;|コード分析のリクエスト| CC
    CC --&gt;|ファイル読み取り| BlogRepo
    BlogRepo --&gt;|コードとファイル内容| CC
    CC --&gt;|分析結果| CD

    %% ファイル操作フロー
    CC --&gt;|新記事作成| BlogRepo

    %% Inkdrop連携フロー
    CD --&gt;|ノート作成リクエスト| InkdropMCP
    InkdropMCP --&gt;|APIリクエスト| API
    API --&gt;|ノートデータ保存| Notes

    %% スタイル
    classDef claudeDesktop fill:#f9a8d4,stroke:#be185d,stroke-width:2px
    classDef claudeCode fill:#93c5fd,stroke:#2563eb,stroke-width:2px
    classDef inkdropCompo fill:#ffffff,stroke:#6b7280,stroke-width:1px
    classDef repository fill:#fcd34d,stroke:#d97706,stroke-width:2px
    classDef mcpServer fill:#93c5fd,stroke:#2563eb,stroke-width:2px
    classDef other fill:#e5e7eb,stroke:#6b7280,stroke-width:2px

    class CD claudeDesktop
    class CC,InkdropMCP claudeCode
    class API,Notes inkdropCompo
    class Inkdrop,BlogRepo repository
    class UserReq other

`
&lt;&#x2F;pre&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;便利です。&lt;&#x2F;p&gt;
&lt;p&gt;開発プロジェクトのドキュメンテーションや&lt;code&gt;README.md&lt;&#x2F;code&gt;の作成など、次のようなワークフローにすると大変スマートに仕事が進みそうです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Claude DesktopからClaude Codeにリポジトリーからコード情報を収集し、そのコードを分析しMarkdown文書を生成しInkdropにNote作成させる。&lt;&#x2F;li&gt;
&lt;li&gt;Inkdrop上でMarkdown文書をPreviewで確認し、必要に応じて編集する&lt;&#x2F;li&gt;
&lt;li&gt;Claude DesktopからInkdrop上のNoteからドキュメントを収集し、Claude Codeを通じてリポジトリーにドキュメントとして格納させる&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;Claude_Code_MCP_Server利用コスト&quot;&gt;Claude Code MCP Server利用コスト&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeをMCP ServerとしてClaude Desktopから利用した際のコストを確認してみました。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeをコマンドラインから普通に使うと、MODELとして &lt;code&gt;claude-3-7-sonnet-20250219&lt;&#x2F;code&gt;が使用されています。
このため、多用しているとクレジットも大量に消費されていきます。
しかし、Claude CodeをMCP Serverとして使うと、リクエストあるからと言ってClaude Codeから
MODELを使用したリクエストが出るわけでも無さそうです。またリクエストが出たとしても、今のところ&lt;code&gt;claude-3-5-haiku-20241022&lt;&#x2F;code&gt;しか利用されていません。
Tailwind Plusで提供されるコードが大量にlintで引っかかるので修正をClaud
Destop経由で行いましたが、同様Claude Codeからは&lt;code&gt;claude-3-5-haiku-20241022&lt;&#x2F;code&gt;を
利用するリクエストかでていませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;Claude CodeをMCP Serverとして利用する場合、提供されるツールは以下のとおりです。これらのうち、AgentTool以外の大半はClaude Code内部で処理が完結するため、高度な分析などはClaude Desktop側から直接リクエストされると考えられます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;th&gt;Permission Required&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;AgentTool&lt;&#x2F;td&gt;&lt;td&gt;Runs a sub-agent to handle complex, multi-step tasks&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BashTool&lt;&#x2F;td&gt;&lt;td&gt;Executes shell commands in your environment&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GlobTool&lt;&#x2F;td&gt;&lt;td&gt;Finds files based on pattern matching&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GrepTool&lt;&#x2F;td&gt;&lt;td&gt;Searches for patterns in file contents&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;LSTool&lt;&#x2F;td&gt;&lt;td&gt;Lists files and directories&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FileReadTool&lt;&#x2F;td&gt;&lt;td&gt;Reads the contents of files&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FileEditTool&lt;&#x2F;td&gt;&lt;td&gt;Makes targeted edits to specific files&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FileWriteTool&lt;&#x2F;td&gt;&lt;td&gt;Creates or overwrites files&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;NotebookReadTool&lt;&#x2F;td&gt;&lt;td&gt;Reads and displays Jupyter notebook contents&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;NotebookEditTool&lt;&#x2F;td&gt;&lt;td&gt;Modifies Jupyter notebook cells&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;(2025-03-31追記)&lt;&#x2F;p&gt;
&lt;p&gt;その後、もう少し複雑な処理で確認しました。ソースを複雑に分析するような場合は、
Claude CodeでのリクエストからもMODELとして &lt;code&gt;claude-3-7-sonnet-20250219&lt;&#x2F;code&gt;が使用されていました。&lt;&#x2F;p&gt;
&lt;p&gt;依頼した処理は次のようなものです。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;プロジェクトがOGP対応しているか、対応している場合はどのようなコンポーネントが関係しどのような仕様になっているか調査し、
InkdropのNotebook blogに新たに Noteを作成して仕様書にしてください。仕様書に
は静的モデルと動的モデルをMermaid でダイアグラム化してください。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Claude DesktopがInkdropに書き出した文書をそのままPDFにしたものも&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;e.pcloud.link&#x2F;publink&#x2F;show?code=XZiJhdZ3UkXV7lTN8knDkuquFjN147NvQ0y&quot;&gt;公開&lt;&#x2F;a&gt;しておき
ます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Claude CodeのMCP Serverを利用する利点は2つです。&lt;&#x2F;p&gt;
&lt;p&gt;1つは、Claude Codeからのリクエスト発行を押さえ、Claude Desktopからのリクエストになることでの&lt;strong&gt;コスト削減&lt;&#x2F;strong&gt;が大きくできることです。
(2025-03-31追記) 処理内容によってはClaude Code側の処理でもSonnet 3.7が使用
されるため注意は必要です。&lt;&#x2F;p&gt;
&lt;p&gt;本来次のようにClaude DesktopとClaude Codeは使い分けるべきだと思います。&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;**Claude Code**&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    - コマンドライン志向
    - ファイルシステムへの直接アクセス
    - コードリポジトリとの統合
    - 開発タスクに特化
  &lt;&#x2F;dd&gt;
  &lt;dt&gt;**Claude Desktop**&lt;&#x2F;dt&gt;
  &lt;dd&gt;
    - GUI ベースの使いやすさ
    - 会話形式のインターフェース
    - 画像認識機能
    - 一般的な質問応答に最適
  &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;p&gt;しかし、MCP統合によりファイルシステムへの直接アクセス、コードリポジトリとの統合のメリットを
Claude Desktopからも享受できるようになります。Claude Desktopは月額固定料金なので、ユーザーには非常に恩恵があります。&lt;&#x2F;p&gt;
&lt;p&gt;2つ目の利点は、&lt;strong&gt;ワークフロー改善の可能性&lt;&#x2F;strong&gt;です。
Claude CodeとInkdropの統合のような仕組みは、開発者のワークフローを大幅に改善する可能性を秘めており、以下のような発展が期待できそうです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;より高度なコンテキスト理解&lt;&#x2F;strong&gt;:
&lt;ul&gt;
&lt;li&gt;コードとドキュメントの関係性をより深く理解&lt;&#x2F;li&gt;
&lt;li&gt;プロジェクト全体の知識グラフ構築&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;自動ドキュメント更新&lt;&#x2F;strong&gt;:
&lt;ul&gt;
&lt;li&gt;コード変更に基づく関連ドキュメントの自動更新&lt;&#x2F;li&gt;
&lt;li&gt;コメントとドキュメントの一貫性維持&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;協調作業の強化&lt;&#x2F;strong&gt;:
&lt;ul&gt;
&lt;li&gt;チームメンバー間の知識共有と協調作業の促進&lt;&#x2F;li&gt;
&lt;li&gt;コードレビューとドキュメントレビューの統合&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この統合は特に、複雑なプロジェクトやドキュメント駆動開発を実践している開発者にとって大きなメリットをもたらします。知識の管理と活用、コード生成、ドキュメント作成の一連のプロセスがシームレスに繋がることで、開発プロセス全体の質と効率が向上するでしょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">前回はInkdropとClaudeのMCP統合について紹介しましたが、今回はClaude Codeを MCPサーバーとして活用する方法とそのメリットについて解説します。 開発者にとって、Claude CodeとInkdropの組み合わせがどのように効率的な 知識管理と開発プロセスの向上につながるかを探ります。</summary>
        </entry><entry xml:lang="en">
        <title>InkdropとClaudeのMCP統合</title>
        <published>2025-03-28T00:00:00+00:00</published>
        <updated>2025-03-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/claude-integration-with-inkdrop/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/claude-integration-with-inkdrop/</id>
        
            <content type="html">&lt;p&gt;作者の方の記事「
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.devas.life&#x2F;integrating-my-note-app-with-claudes-mcp&#x2F;&quot;&gt;Integrating my note app with Claude&#x27;s MCP&lt;&#x2F;a&gt;
」と&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ou4BYmY8Dq0&amp;amp;t=116s&amp;amp;themeRefresh=1&quot;&gt;YouTube&lt;&#x2F;a&gt;
を参考にしながら、実際にmacOSで検証してみました。前提としてClaude Desktopが稼働している必要が
あります。
元記事が英語なので日本語でまとめてみました。&lt;&#x2F;p&gt;
&lt;!-- toc --&gt;
&lt;h2 id=&quot;メリットとユースケース&quot;&gt;メリットとユースケース&lt;&#x2F;h2&gt;
&lt;p&gt;実施するまえに、InkdropとClaudeが統合すると何がうれしいのでしょう？&lt;&#x2F;p&gt;
&lt;p&gt;MCP統合により、ClaudeがInkdropのノートに直接アクセスし検索・作成・更新が可能となります。
これにより、次のようなメリットがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Claudeがユーザーの書きためた複数ノートの知見を横断的に分析・活用できる&lt;&#x2F;li&gt;
&lt;li&gt;InkdropのNote管理作業を自動化し効率化できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;例えば考えられるユースケースは、次のようなものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パーソナル知識アシスタント&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;技術メモや学習ノートが蓄積されたInkdropで「JavaScriptのPromiseについて教えて」と質問すると、
Claudeはあなたの過去のノートから関連情報を抽出し、あなた自身の理解や用語に合わせた説明を提供。
さらに「これをプロジェクトXに適用するには？」と質問すると、プロジェクトXのノートも参照しながら具体的な実装アドバイスを返せる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;スマートな情報整理と要約&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;「先月の週次会議ノートを要約して月次報告として重要なアクションアイテムを抽出し、新しいノートにまとめて」と指示すると、
Claudeは該当期間の会議ノートを検索・分析し、重要ポイントとアクションアイテムを抽出した新規ノートを自動生成。
定期的なレビューや進捗管理が効率化される。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;インストール手順&quot;&gt;インストール手順&lt;&#x2F;h2&gt;
&lt;p&gt;まず &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;inkdropapp&#x2F;mcp-server?tab=readme-ov-file&quot;&gt;Inkdrop MCP Server&lt;&#x2F;a&gt;をインストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -g @inkdropapp&#x2F;mcp-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;次にInkdrop内のHTTP Serverをセットアップのために、&lt;code&gt;config.json&lt;&#x2F;code&gt;を修正します。&lt;&#x2F;p&gt;
&lt;p&gt;Macの場合は&lt;code&gt;~&#x2F;Library&#x2F;Application Support&#x2F;inkdrop&#x2F;&lt;&#x2F;code&gt; です。&lt;&#x2F;p&gt;
&lt;p&gt;Inkdropを修了させて、既存の設定を壊さないように次の設定を追加します。&lt;code&gt;username&lt;&#x2F;code&gt;と&lt;code&gt;password&lt;&#x2F;code&gt;の設定は例なので、ちゃんと書き換えましょう。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;core&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;server&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;port&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19840&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;bindAddress&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;127.0.0.1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;auth&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: { &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;username&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;foo&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;password&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;bar&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;設定したら、Inkdropを起動し次のコマンドで確認できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -v -u foo:bar http:&#x2F;&#x2F;localhost:19840&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# -&amp;gt; {&amp;quot;version&amp;quot;:&amp;quot;5.10.0&amp;quot;,&amp;quot;ok&amp;quot;:true}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;{&quot;version&quot;:&quot;5.10.0&quot;,&quot;ok&quot;:true}&lt;&#x2F;code&gt;と表示されればOKです。&lt;&#x2F;p&gt;
&lt;p&gt;次にCladue Desktopの設定が必要ですが、Claudeがどうもシェルに&lt;code&gt;bash&lt;&#x2F;code&gt;が使用されていることを前提としているため、
「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.devas.life&#x2F;integrating-my-note-app-with-claudes-mcp&#x2F;&quot;&gt;Integrating my note app with Claude&#x27;s MCP&lt;&#x2F;a&gt;」の記事通りに設定しても動作しませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;シェルの問題を回避するため、直接&lt;code&gt;npx&lt;&#x2F;code&gt;で実行するのでなく、シェルを指定したシェルスクリプトを作成しそれを実行させるように修正しました。
以下は&lt;code&gt;~&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;code&gt;などの名前で作成してください&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-shebang z-shell z-meta z-shebang z-shell&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env fish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# fish版のMCPスクリプト&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npx&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -y @inkdropapp&#x2F;mcp-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;1行目の&lt;code&gt;fish&lt;&#x2F;code&gt;の部分は自身の環境に合わせて修正してください。&lt;&#x2F;p&gt;
&lt;p&gt;実行権限をつけておきます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +x ~&#x2F;bin&#x2F;inkdrop-mcp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Claude_Desktopの設定&quot;&gt;Claude Desktopの設定&lt;&#x2F;h2&gt;
&lt;p&gt;設定したInkdropのサーバーの設定をClaude Desktopに追加します。Claude Desktopの設定画面を開くと下記のようになっています。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;claude-integration-with-inkdrop&amp;#x2F;setup-claude.webp?h=df5178f141a430c0eb04&quot;
  alt=&quot;Setting画面&quot; width=&quot;904&quot; height=&quot;672&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;この画面で「構成を編集」というボタンを押すと、Finderが起動して設定ファイルを示してくれます。このボタンを押さなくても、ターミナルから&lt;code&gt;~&#x2F;Library&#x2F;Application Support&#x2F;Claude&#x2F;claude_desktop_config.json&lt;&#x2F;code&gt;を開いて編集しても大丈夫です。&lt;&#x2F;p&gt;
&lt;p&gt;次のような設定を追加します。&lt;code&gt;command&lt;&#x2F;code&gt;の設定は先ほど作成したシェルスクリプトを絶対パスで指定します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;mcpServers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;inkdrop&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;Users&#x2F;foo&#x2F;bin&#x2F;inkdrop-mcp&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_SERVER_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;http:&#x2F;&#x2F;localhost:19840&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_USERNAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;foo&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;INKDROP_LOCAL_PASSWORD&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;bar&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;編集後、Claude Desktopを再起動して設定画面を確認すると。&lt;code&gt;inkdrop&lt;&#x2F;code&gt;という設定が追加されているはずです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Inkdrop&#x2F;Claude統合を試してみる&quot;&gt;Inkdrop&#x2F;Claude統合を試してみる&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;MCP統合で何ができるか？&quot;&gt;MCP統合で何ができるか？&lt;&#x2F;h3&gt;
&lt;p&gt;MCP統合で何ができるかは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;inkdropapp&#x2F;mcp-server?ref=devas.life#&quot;&gt;inkdrop&#x2F;mcp-server&lt;&#x2F;a&gt;のREADME.mdを見ると何となく分かってきます。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;Subheading&gt;Inkdrop MCPサーバーのComponents&lt;&#x2F;Subheading&gt;&lt;&#x2F;p&gt;
&lt;dl&gt;
  &lt;dt&gt;`read-note`&lt;&#x2F;dt&gt;
  &lt;dd&gt;Noteの参照&lt;&#x2F;dd&gt;
  &lt;dt&gt;`search-notes`&lt;&#x2F;dt&gt;
  &lt;dd&gt;キーワードでのNoteの検索&lt;&#x2F;dd&gt;
  &lt;dt&gt;`list-notes`&lt;&#x2F;dt&gt;
  &lt;dd&gt; Notebookを指定してのNoteのリスト&lt;&#x2F;dd&gt;
  &lt;dt&gt;`create-note`&lt;&#x2F;dt&gt;{&quot; &quot;}
  &lt;dd&gt;Noteの作成 &lt;&#x2F;dd&gt;
  &lt;dt&gt;`update-note`&lt;&#x2F;dt&gt;{&quot; &quot;}
  &lt;dd&gt;既存の Noteの更新 &lt;&#x2F;dd&gt;
  &lt;dt&gt;`list-notebooks`&lt;&#x2F;dt&gt;{&quot; &quot;}
  &lt;dd&gt;Notebookのリスト &lt;&#x2F;dd&gt;
  &lt;dt&gt;`list-tags`&lt;&#x2F;dt&gt;{&quot; &quot;}
  &lt;dd&gt;タグのリスト &lt;&#x2F;dd&gt;
&lt;&#x2F;dl&gt;
&lt;h3 id=&quot;実際に試してみる&quot;&gt;実際に試してみる&lt;&#x2F;h3&gt;
&lt;p&gt;この記事はInkdropでドラフトを執筆していますが、ここまで書いた時点でClaudeにInkdrop&#x2F;Claude統合の方法を聞いてみました。
敢えて英語で聞いてみました。途中MCPの使用を許可するかというダイアログが出てくるので、「このチャットで許可」を押します。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;claude-integration-with-inkdrop&amp;#x2F;dialog-claude.webp?h=15d5e114b73bf62979cb&quot;
  alt=&quot;確認画面&quot; width=&quot;1112&quot; height=&quot;912&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;何度かダイアログが表示されますが、同様に許可していくと次のように表示されました。英語ですが、きちんとまとめられてます。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;claude-integration-with-inkdrop&amp;#x2F;exampe-claude.webp?h=ea0bcdacaea552d3b212&quot;
  alt=&quot;結果画面&quot; width=&quot;1101&quot; height=&quot;1081&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Inkdrop内の自身のドキュメントがClaudeで活用できるのは思った以上に便利ですし、
Inkdropに知見をまとめていく行為もより価値を出せるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;プロジェクトでClaude Codeを利用すると、プロジェクト内のコードをClaude Codeが
見渡してくれるので生産性が飛躍的に向上しますが、同じことをドキュメンテーショ
ンでもInkdropとの組み合わせで実現できます。&lt;&#x2F;p&gt;
&lt;p&gt;実際この記事の「メリットとユースケース」の章はClaudeにドラフトさせて、
Inkdropに追記させたものをもとに微調整しただけです。&lt;&#x2F;p&gt;
&lt;p&gt;しかもClaude Codeはものすごい勢いでAnthoropicのAPIの課金を消費していきます
が、こちらはClaude Desktopを利用するのでProプランを使っていれば特にそれ以上
費用は必要ありません。&lt;&#x2F;p&gt;
&lt;p&gt;Claude周りは最近楽しいな。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;シェルスクリプトを作成するのでなく、Claudeでの指定で、npxをフルパスで
指定する方法もあります。お好みで。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Inkdropの作者の方が、InkdropとClaudeのMCP統合についてYoutubeを上げていたので、早速検証しましたが、自分の書きためたKnowledgeをClaudeで活用できることがこんなに便利かと驚きました。</summary>
        </entry><entry xml:lang="en">
        <title>Lulu 「To Sir With Love」</title>
        <published>2025-03-27T00:00:00+00:00</published>
        <updated>2025-03-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/to-sir-with-love/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/to-sir-with-love/</id>
        
            <content type="html">&lt;p&gt;1967年公開の映画『To Sir, With Love』&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; の主題歌だったらしく、
同年にヒットし年間チャートでもビートルズを押さえてNo.1だったそうです。&lt;&#x2F;p&gt;
&lt;p&gt;映画を見たこともなければ1967年当時のヒット状況など知りませんが、
ラジオか何かでかなり後になって耳にしてからお気に入りです。&lt;&#x2F;p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A2063454420&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;sir-wih-love&quot; title=&quot;To Sir With Love&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;To Sir With Love&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;p&gt;Accoustic GuitarはEpiphone Texan、Clean GuitarはFender Stratocaster、Vocalは
Synthesizer V、後はLogic Proの音源を使った打ち込みです。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;邦題は『いつも心に太陽を』。白人の生徒たちの高校に赴任してきた黒人の教
師の物語らしく、当時学園ものの走りとなったらしい。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">たしか就職した頃に初めて聞いて、1960代っぽい曲だなと気になっていたので、演奏してみました。</summary>
        </entry><entry xml:lang="en">
        <title>読了『地下鉄サリン事件はなぜ防げなかったのか』</title>
        <published>2025-03-26T00:00:00+00:00</published>
        <updated>2025-03-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/tokyo-subway-sarin-attack/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/tokyo-subway-sarin-attack/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;tokyo-subway-sarin-attack&amp;#x2F;sarin.webp?h=a47caa74ba13acb3bd2a&quot;
  alt=&quot;&quot; width=&quot;1456&quot; height=&quot;816&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;1995年に発生した地下鉄サリン事件から30年を経て出版され、事件の背景や捜査の過
程を詳細に描いています。東京地裁が世界平和統一家庭連合（旧統一教会）に対して
解散命令を下したタイミングでタイムリーなので手に取りました。&lt;&#x2F;p&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292229111619?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18122328%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;0319&#x2F;9784022520319_1_7.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292229111619?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18122328%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;地下鉄サリン事件はなぜ防げなかったのか　元警察庁刑事局長　30年後の証言&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;垣見隆 朝日新聞出版 2025年02月07日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292229111619?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18122328%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4022520310&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E5%9C%B0%E4%B8%8B%E9%89%84%E3%82%B5%E3%83%AA%E3%83%B3%E4%BA%8B%E4%BB%B6%E3%81%AF%E3%81%AA%E3%81%9C%E9%98%B2%E3%81%92%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B%E3%80%80%E5%85%83%E8%AD%A6%E5%AF%9F%E5%BA%81%E5%88%91%E4%BA%8B%E5%B1%80%E9%95%B7%E3%80%8030%E5%B9%B4%E5%BE%8C%E3%81%AE%E8%A8%BC%E8%A8%80&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;h2 id=&quot;オウム真理教について&quot;&gt;オウム真理教について&lt;&#x2F;h2&gt;
&lt;p&gt;坂本弁護士一家殺害事件が1989年で、当時直後から一家の行方不明事件に関係していると、オウム真理教がフォーカスされたと記憶しています。当時は統一教会、幸福の科学、オウム真理教など新興宗教が注目された時期でもありました。&lt;&#x2F;p&gt;
&lt;p&gt;1990年にはオウム真理教は「真理党」を結成して、衆議院議員総選挙に25人が出馬し、象のような着ぐるみを着て選挙活動をしていたのを覚えています。全員落選しましたが。&lt;&#x2F;p&gt;
&lt;p&gt;今では考えられませんが、1991年9月放送の「朝まで生テレビ」でオウム真理教と幸福の科学が出演し討論していたのが忘れられません。いろいろ問題になっていた両者ですが、オウム真理教は幹部だけでなく教祖の麻原彰晃まで出演していました。「幸福の科学に比べると、オウム真理教はずいぶんと宗教らしいな」との感想を持ったと思います。&lt;&#x2F;p&gt;
&lt;p&gt;1992年から秋葉原でオウム真理教が運営するパソコンショップ「マハーポーシャ」も
記憶に残っています。当時DOS&#x2F;Vマシンを手組みしていたので、マハーポーシャの
パーツの安さは衝撃的でした。怪しいと思いつつも買っていましたね。&lt;&#x2F;p&gt;
&lt;p&gt;松本サリン事件を当時オウム真理教と関連付けていたか分かりませんが、地下鉄サリン事件が発生した時、会社で出社できないメンバーをチェックしながら「これ、オウム真理教じゃね」と発生直後に話したのを覚えているので、それくらいの認識はあったと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;本書について&quot;&gt;本書について&lt;&#x2F;h2&gt;
&lt;p&gt;この垣見氏については、確かに「決断できない」「報復を恐れて閉じこもっている」などの記事を読んだ気がします。本書を読むと、そこまでの誹謗記事が出たのは警視庁筋からのリークかなと思いますが、事件直後に「オウムがやったな」と素人の私でも直感できる状況で、事件を防げなかった責任の一端はこの方にもあるのかと感じました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、都道府県をまたぐ、しかも宗教団体が関係した事件に対処する能力が、法整備も含めて欠如していたのもよく分かりました。まぁ、教団に敵対するものの殺害だけでなく、不特定多数に対するテロを実行していく宗教団体は歴史的に特異な団体だったのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;垣見氏の評価は私には分かりませんが、オウム真理教の逮捕劇直後に更迭され、その後退職を余儀なくされています。警察内のポリティカルな闘争で読んでいてもバカらしく感じますが、No.3であった彼が責任を取るならば、他にも責任を取るべき人がいるだろうにとは思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;オウム真理教以降、これらの事件を機に法整備され、昨日東京地裁が認めた旧統一教会への解散命令など、この法整備による成果とも言えるかもしれません。
しかし、長年にわたって全国で多くの問題を起こしてきた統一教会に対して、警察はほぼ何もできておらず、解散命令が出たのもこれらの問題でなく安倍元総理の暗殺事件がきっかけでやっとという状況です。オウム真理教の一連の事件での課題がそのまま持ち越されていることを改めて認識しました。
折角オウム真理教について書いたので、忘れないよう書いておきましょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;オウム真理教が坂本弁護士を襲ったのは、TBSの取材した坂本弁護士のビデオをオウム真理教幹部が見て、報告を聞いた麻原彰晃が殺害指令を出したことがきっかけ。&lt;&#x2F;li&gt;
&lt;li&gt;TBSは明確な証拠が出てくるまで、「社内調査では、ビデオをオウム真理教に見せていない」と国会でも答弁していた。&lt;&#x2F;li&gt;
&lt;li&gt;結局証拠が出てきて、TBSは反省のため「ワイドショー」を一掃した。そこで生まれた番組が「はなまるマーケット」。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;2015年に「はなまるマーケット」の枠で、「白熱ライブ ビビット」で&quot;ワイドショー&quot;を復活させました。4年半ほど放送していたと思いますが、ずっと低視聴率でした。&lt;&#x2F;p&gt;
&lt;p&gt;TBSの罪は忘れません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">本書は、オウム真理教が事件を起こした当時警察庁刑事局長として警察を率いていた垣見隆氏がオウム真理教事件の捜査全内幕を初めて証言したものです。</summary>
        </entry><entry xml:lang="en">
        <title>Next.jsでsitemap.xmlとrobots.txtを実装する</title>
        <published>2025-03-25T00:00:00+00:00</published>
        <updated>2025-03-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/creating-sitemap/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/creating-sitemap/</id>
        
            <content type="html">&lt;p&gt;ウェブサイトを検索エンジンに正しくインデックスしてもらうためには、&lt;code&gt;sitemap.xml&lt;&#x2F;code&gt;と&lt;code&gt;robots.txt&lt;&#x2F;code&gt;の適切な実装が不可欠です。
このブログではNext.jsのApp Routerを使用して、これらのファイルを動的に生成するよう実装しました。&lt;&#x2F;p&gt;
&lt;p&gt;この記事では、その実装方法とSEOの観点からの注意点を説明します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._sitemap.xml_実装を実装する&quot;&gt;1. sitemap.xml 実装を実装する&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1.1._sitemap.xmlとは&quot;&gt;1.1. sitemap.xmlとは&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;sitemap.xml&lt;&#x2F;code&gt;は、ウェブサイト内の各ページのURLや更新頻度、優先度などの情報をまとめたXMLファイルです。
これにより、検索エンジンのクローラーがサイト構造を理解しやすくなり、効率的なインデックス作成が可能になります。&lt;&#x2F;p&gt;
&lt;p&gt;主な要素は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;loc&amp;gt;&lt;&#x2F;code&gt; - ページのURL&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;&#x2F;code&gt; - 最終更新日&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;changefreq&amp;gt;&lt;&#x2F;code&gt; - 更新頻度&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;priority&amp;gt;&lt;&#x2F;code&gt; - 重要度&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;1.2._sitemap.xml_の実装例&quot;&gt;1.2. sitemap.xml の実装例&lt;&#x2F;h3&gt;
&lt;p&gt;Next.jsのApp Routerでは、ルートハンドラーを使用して動的にsitemap.xmlを生成できます。
以下はこのブログでの実装例です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; src&#x2F;app&#x2F;sitemap.xml&#x2F;route.ts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-modifier z-storage z-type&quot;&gt;export async function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; siteUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;NEXT_PUBLIC_SITE_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt;siteUrl)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    throw&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Missing NEXT_PUBLIC_SITE_URL environment variable&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 記事のIDを取得する関数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getArticleIds&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; articlesDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cwd&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;src&#x2F;app&#x2F;articles&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; scanDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; baseDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      let&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; results&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-type&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; []&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; entries&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;readdirSync&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; withFileTypes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-expression z-of z-ts&quot;&gt; of&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; entries)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; fullPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts z-source&quot;&gt;name)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; relativePath&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(baseDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts z-source&quot;&gt;name)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;isDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;())&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          results&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;...&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;scanDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(fullPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; relativePath)]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; else if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;page.mdx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(baseDir)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; scanDir&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(articlesDir)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; articleIds&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getArticleIds&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 最新の記事の日付を取得する関数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getLatestArticleDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; latestDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Date&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; 1970-01-01&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-expression z-of z-ts&quot;&gt; of&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; articleIds)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        &#x2F;&#x2F; ファイルから直接コンテンツを読み込む&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; mdxPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;          process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cwd&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;          &amp;quot;src&#x2F;app&#x2F;articles&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;          &amp;quot;page.mdx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; mdxContent&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;readFileSync&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(mdxPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;utf-8&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        &#x2F;&#x2F; 日付を抽出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; dateMatch&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; mdxContent&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;date:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-character-class z-regexp&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-group z-regexp&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-character-class z-regexp&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;+?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-group z-regexp&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (dateMatch)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;          const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Date&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(dateMatch[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;])&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;          &#x2F;&#x2F; 有効な日付かつ最新の場合は更新&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;          if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;isNaN&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getTime&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;())&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; latestDate)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;            latestDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (error)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;error&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;          `Error processing article &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; for date extraction:`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; ISO形式の日付を返す（例: 2025-03-25）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; latestDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;toISOString&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;split&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;T&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 最新記事の日付を取得&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; latestArticleDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; getLatestArticleDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 静的ページのURL、changefreq、priority 設定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; staticPages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;daily&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      lastmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; latestArticleDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; ホームページ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;about&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;monthly&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.5&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;articles&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;daily&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.9&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      lastmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; latestArticleDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; 記事一覧ページには最新記事の日付&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;whisper&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;daily&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.4&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;uses&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;monthly&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.7&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;music&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;monthly&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;0.5&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; サイトマップXMLの作成&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  let&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; sitemap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;urlset xmlns=&amp;quot;http:&#x2F;&#x2F;www.sitemaps.org&#x2F;schemas&#x2F;sitemap&#x2F;0.9&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 静的ページをサイトマップに追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; page&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-expression z-of z-ts&quot;&gt; of&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; staticPages)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    sitemap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `  &amp;lt;url&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;loc&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;siteUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;&#x2F;loc&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;lastmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `&amp;lt;lastmod&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;lastmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;lt;&#x2F;lastmod&amp;gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; :&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;changefreq&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;changefreq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;&#x2F;changefreq&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;priority&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts&quot;&gt;priority&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;&#x2F;priority&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  &amp;lt;&#x2F;url&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 記事ページをサイトマップに追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-expression z-of z-ts&quot;&gt; of&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; articleIds)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      &#x2F;&#x2F; ファイルから直接コンテンツを読み込む&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; mdxPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cwd&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;src&#x2F;app&#x2F;articles&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;page.mdx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      )&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; mdxContent&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;readFileSync&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(mdxPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;utf-8&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      &#x2F;&#x2F; 日付を抽出&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; dateMatch&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; mdxContent&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;date:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-character-class z-regexp&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-group z-regexp&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-character-class z-regexp&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;+?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-group z-regexp&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-regexp z-ts&quot;&gt;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-character-class z-regexp&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      let&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Date&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;toISOString&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;split&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;T&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (dateMatch)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Date&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(dateMatch[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;])&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        &#x2F;&#x2F; 有効な日付の場合のみ使用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;isNaN&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getTime&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;          date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; extractedDate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;toISOString&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;split&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;T&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; articleUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; `&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;siteUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&#x2F;articles&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;      sitemap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `  &amp;lt;url&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;loc&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;articleUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;&#x2F;loc&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;lastmod&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;lt;&#x2F;lastmod&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;changefreq&amp;gt;monthly&amp;lt;&#x2F;changefreq&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    &amp;lt;priority&amp;gt;1.0&amp;lt;&#x2F;priority&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  &amp;lt;&#x2F;url&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt; (error)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;      console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;error&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;`Error processing article &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; for sitemap:`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt; error)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; サイトマップを閉じる&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;  sitemap&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `&amp;lt;&#x2F;urlset&amp;gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Response&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(sitemap&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    status&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 200&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;content-type&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;application&#x2F;xml&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;cache-control&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;s-maxage=86400&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この実装では以下のポイントに注目しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;記事の動的探索&lt;&#x2F;strong&gt;: &lt;code&gt;getArticleIds()&lt;&#x2F;code&gt;関数を使用して、articlesディレクトリ内のすべてのMDXファイルを再帰的に探索&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;最新記事日付の検出&lt;&#x2F;strong&gt;: &lt;code&gt;getLatestArticleDate()&lt;&#x2F;code&gt;関数で、全記事から最新の記事日付を取得&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;記事以外の設定&lt;&#x2F;strong&gt;: 記事以外はパスが固定なので予め配列にパスと更新頻度を設定&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;更新頻度と重要度の最適化&lt;&#x2F;strong&gt;: 各ページタイプに適した&lt;code&gt;changefreq&lt;&#x2F;code&gt;と&lt;code&gt;priority&lt;&#x2F;code&gt;の値を設定
&lt;ul&gt;
&lt;li&gt;個別記事ページ: &lt;code&gt;changefreq:monthly&lt;&#x2F;code&gt; と &lt;code&gt;priority: 1.0&lt;&#x2F;code&gt;で固定&lt;&#x2F;li&gt;
&lt;li&gt;その他のページ: 配列でページの特性に応じて設定&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ホームと記事一覧に最新日付を適用&lt;&#x2F;strong&gt;: トップページと記事一覧ページには最新記事の日付を&lt;code&gt;lastmod&lt;&#x2F;code&gt;として使用し、これらのページが最新コンテンツを反映していることを検索エンジンに伝える&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;柔軟な構造&lt;&#x2F;strong&gt;: &lt;code&gt;page.lastmod&lt;&#x2F;code&gt;が存在する場合のみ&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;&#x2F;code&gt;タグを出力する条件付きレンダリング&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;キャッシュ設定&lt;&#x2F;strong&gt;: &lt;code&gt;cache-control&lt;&#x2F;code&gt;ヘッダーで24時間のキャッシュを設定&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;1.3._changefreq_の適切な設定&quot;&gt;1.3. changefreq の適切な設定&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;changefreq&lt;&#x2F;code&gt;値は検索エンジンへのヒントであり、実際のクロール頻度を保証するものではありません。
一般的な設定の目安。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;always&lt;&#x2F;code&gt;: 常に変化するページ（リアルタイムデータ表示など）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;hourly&lt;&#x2F;code&gt;: 1時間単位で更新（ニュースページなど）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;daily&lt;&#x2F;code&gt;: 毎日更新（ブログトップ、記事一覧など）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;weekly&lt;&#x2F;code&gt;: 週単位で更新（プロジェクトページなど）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;monthly&lt;&#x2F;code&gt;: 月単位で更新（Aboutページなど）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;yearly&lt;&#x2F;code&gt;: 年単位で更新（利用規約など）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;never&lt;&#x2F;code&gt;: 更新されないページ（アーカイブなど）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ページの実際の更新パターンに合わせた設定が望ましいですが、最終的なクロール頻度は検索エンジンのアルゴリズムが決定します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1.4._lastmod_の意義と適切な設定&quot;&gt;1.4. lastmod の意義と適切な設定&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;lastmod&lt;&#x2F;code&gt;はページの最終更新日を示し、以下の点で重要です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クローラーの効率化&lt;&#x2F;strong&gt;: 検索エンジンは最近変更されたページを優先的に再クロールできる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;インデックス更新の促進&lt;&#x2F;strong&gt;: 新しいコンテンツや変更を素早くインデックスに反映&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;鮮度シグナル&lt;&#x2F;strong&gt;: コンテンツの最新性を伝えるシグナルとなる可能性がある&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;今回の実装では以下のアプローチを取っています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;個別記事&lt;&#x2F;strong&gt;: 記事のfrontmatterから日付を抽出して使用&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ホームページと記事一覧&lt;&#x2F;strong&gt;: すべての記事から最新の日付を取得し反映（最新のコンテンツへのリンクを含むため）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;その他のページ&lt;&#x2F;strong&gt;: 明示的に指定しない（検索エンジンが自動判断）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この方法により、各ページが適切な最終更新日を持ち、検索エンジンが最新のコンテンツを効率的に処理できるようになります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2._robots.txt_を実装する&quot;&gt;2. robots.txt を実装する&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;&#x2F;code&gt;はクローラーに対するルールを記述したファイルで、同様にルートハンドラーで実装できます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; src&#x2F;app&#x2F;robots.txt&#x2F;route.ts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-modifier z-storage z-type&quot;&gt;export async function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GET&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; siteUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant&quot;&gt;NEXT_PUBLIC_SITE_URL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-source&quot;&gt;siteUrl)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    throw&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Missing NEXT_PUBLIC_SITE_URL environment variable&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; robotsTxt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; `# https:&#x2F;&#x2F;www.robotstxt.org&#x2F;robotstxt.html&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;User-agent: *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Allow: &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;# Sitemaps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Sitemap: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;siteUrl&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&#x2F;sitemap.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-new&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Response&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(robotsTxt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    status&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 200&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    headers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;content-type&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;text&#x2F;plain&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;cache-control&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;s-maxage=86400&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この実装ではすべてのロボットにサイト全体へのアクセスを許可し、sitemap.xmlの場所を明示しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2.1._robots.txt実装上の注意点&quot;&gt;2.1. robots.txt実装上の注意点&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;環境変数の設定&lt;&#x2F;strong&gt;: &lt;code&gt;NEXT_PUBLIC_SITE_URL&lt;&#x2F;code&gt;を必ず設定する&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;キャッシュの検討&lt;&#x2F;strong&gt;: 頻繁に記事を追加する場合は、キャッシュ期間を短くする(個人のブログサイトなので現在の24時間で十分)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;エラーハンドリング&lt;&#x2F;strong&gt;: 記事読み込みエラーが全体に影響しないようtry-catchで処理&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;検証&lt;&#x2F;strong&gt;: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;search.google.com&#x2F;search-console&quot;&gt;Google Search Console&lt;&#x2F;a&gt;でサイトマップを登録し、エラーがないか確認する&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;3._まとめ&quot;&gt;3. まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;適切な&lt;code&gt;sitemap.xml&lt;&#x2F;code&gt;と&lt;code&gt;robots.txt&lt;&#x2F;code&gt;の実装はSEOの基本です。Next.jsのApp Routerを使うと、これらのファイルを動的に生成できるため、コンテンツの増加に合わせて自動的に更新されるサイトマップを維持できます。&lt;&#x2F;p&gt;
&lt;p&gt;更新頻度や優先度の設定は、サイトのコンテンツ特性を考慮して決定しましょう。最終的には検索エンジンのアルゴリズムが実際のクロール頻度を決定しますが、適切なヒントを提供することで、より効率的なインデックス作成を促進できます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">うっかり実装を忘れていたsitemap.xmlとrobots.txtをNext.jsのApp Routerを使用して実装しました。合わせて、検索エンジン最適化のためのベストプラクティスもまとめています。</summary>
        </entry><entry xml:lang="en">
        <title>Photo Friday: Industrial Horizons at Dusk</title>
        <published>2025-03-25T00:00:00+00:00</published>
        <updated>2025-03-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/photo-friday/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/photo-friday/</id>
        
            <content type="html">&lt;p&gt;Photo Friday: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.photofriday.com&#x2F;yostos&#x2F;16302&quot;&gt;#contours&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;R0000702.jpg&quot; alt=&quot;Industrial Horizons at Dust&quot; &#x2F;&gt;
  &lt;figcaption&gt;Industrial Horizons at Dust&lt;&#x2F;figcaption&gt;
  &lt;&#x2F;figure&gt;
</content>
        <summary type="html">Captured at the moment when industrial silhouettes merge with the water&#x27;s surface at dusk. There&#x27;s a unique beauty in these boundaries where the artificial meets the natural, the rigid meets the fluid. Experience the poetry of contours hidden in everyday landscapes.</summary>
        </entry><entry xml:lang="en">
        <title>ヘッドレスCMS Contentfulを活用したつぶやき機能の実装</title>
        <published>2025-03-24T00:00:00+00:00</published>
        <updated>2025-03-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/contentful/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/contentful/</id>
        
            <content type="html">&lt;h2 id=&quot;Contentfulとは&quot;&gt;Contentfulとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.contentful.com&#x2F;&quot;&gt;Contentful&lt;&#x2F;a&gt;は、ヘッドレスCMSのひとつで、コンテンツ管理とAPI配信に特化したサー
ビスです。ウェブサイトやアプリ向けのコンテンツを一元管理し、RESTful APIや
GraphQL APIを通じて、あらゆるデバイスやプラットフォームに配信できます。&lt;&#x2F;p&gt;
&lt;p&gt;構造化されたコンテンツモデルを定義でき、マークダウンやリッチテキストエディタを備
え、多言語対応も可能です。開発者はフロントエンドを自由に構築でき、コンテンツ
編集者は直感的なインターフェースでコンテンツを管理できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;「つぶやき」機能を作ってみる&quot;&gt;「つぶやき」機能を作ってみる&lt;&#x2F;h2&gt;
&lt;p&gt;ブログにContentfulを使って「つぶやき」機能をつけてみましょう。&lt;&#x2F;p&gt;
&lt;p&gt;「つぶやき」コンテンツ自体はContentfulで管理します。
今回つぶやき投稿についてはContentfulのデフォルトのエディタを使用し、
特にコンテンツ作成用のアプリを作成しないことにします。&lt;&#x2F;p&gt;
&lt;p&gt;このブログの「つぶやき機能」ではContentfulからRESTful APIを使って読み出し、
時系列で表示するものとします。Paginationも入れましょう。&lt;&#x2F;p&gt;
&lt;p&gt;以下が実現イメージです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ContentfulでのContent_Modelの定義&quot;&gt;ContentfulでのContent Modelの定義&lt;&#x2F;h2&gt;
&lt;p&gt;ContentfulではまずSpaceを作ることになりますが、今回は無料枠を利用する予定な
ので、デフォルトのSpace &lt;code&gt;Blank&lt;&#x2F;code&gt;を使います。&lt;&#x2F;p&gt;
&lt;p&gt;次に&lt;strong&gt;Content Model&lt;&#x2F;strong&gt;を作成します。今回は &lt;code&gt;whisper&lt;&#x2F;code&gt;と名付けました。
シンプルに以下のようにしました。idは現時点では不要ですが、将来編集アプリを作
る時に備えて一応用意しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;contentful&amp;#x2F;content-model.webp?h=792dde0896adc5c8ff31&quot;
  alt=&quot;Content Model&quot; width=&quot;981&quot; height=&quot;292&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;&#x2F;th&gt;&lt;th&gt;Field ID&lt;&#x2F;th&gt;&lt;th&gt;Attribute&lt;&#x2F;th&gt;&lt;th&gt;Unique&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;id&lt;&#x2F;td&gt;&lt;td&gt;id&lt;&#x2F;td&gt;&lt;td&gt;Decimal&lt;&#x2F;td&gt;&lt;td&gt;Y&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper_time&lt;&#x2F;td&gt;&lt;td&gt;whisperTime&lt;&#x2F;td&gt;&lt;td&gt;Date &amp;amp; time&lt;&#x2F;td&gt;&lt;td&gt;N&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper&lt;&#x2F;td&gt;&lt;td&gt;whisper&lt;&#x2F;td&gt;&lt;td&gt;Short text&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;location&lt;&#x2F;td&gt;&lt;td&gt;location&lt;&#x2F;td&gt;&lt;td&gt;Location&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;Contentfulからのつぶやきの読み出し&quot;&gt;Contentfulからのつぶやきの読み出し&lt;&#x2F;h2&gt;
&lt;p&gt;Contentfulからのコンテンツの読み出しには、ContentfulのSDKを使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;基本的な読み出しは以下のようなコードになります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; contentful&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; require&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;contentful&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-ts&quot;&gt; client&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; contentful&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;createClient&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  space&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;@@@@@@@&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  environment&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;master&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; defaults to &amp;#39;master&amp;#39; if not set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  accessToken&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;client&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;  .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;getEntry&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;@@@@@@@@@@@@@@@@@@@@@@@@&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;  .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;then&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-function z-arrow z-ts&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;log&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(entry))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;  .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;catch&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-ts z-source&quot;&gt;error)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;実際には
&lt;code&gt;space&lt;&#x2F;code&gt;,
&lt;code&gt;environment&lt;&#x2F;code&gt;,&lt;code&gt;accessToken&lt;&#x2F;code&gt;などは、Amplifyのビルド設定で &lt;code&gt;.env&lt;&#x2F;code&gt;に書き込んで
環境変数から読み出しています。&lt;&#x2F;p&gt;
&lt;p&gt;Paginationについては、まず10個を上限で読み出し改ページの際にレコードの開始位置を変更して実現しています。
当初はISR &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; で実装しましたが、Contentfulとうまく連携できずWebhookでの実装も試しました。
しかし、いずれも思ったように動作しなかったりサーバーの負荷も高いため、
クライアントコンポーネントとしてクライアント側でカーソルを管理しページ制御を
実装しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Whisper実現イメージ&quot;&gt;Whisper実現イメージ&lt;&#x2F;h2&gt;
&lt;p&gt;このブログに「&lt;strong&gt;Whisper&lt;&#x2F;strong&gt;」というメニューを配置し、つぶやきを表示するように
しました。以下のようなイメージです。&lt;&#x2F;p&gt;
&lt;p&gt;Locationは緯度・軽度が記録されているので、緯度経度の表示とともに
Open Street Mapへのリンクも埋め込みました。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;whisper.webp&quot; alt=&quot;Whisper実現イメージ&quot; &#x2F;&gt;
  &lt;figcaption&gt;Whisper 実現イメージ&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回は非常に簡単な実装でしたが、Paginationの部分でAmplifyとの互換性の問題で
苦労しました。Contentfulを使うとコンテンツ管理はContentfulに任せてしまえる
ヘッドレスCMSのメリットは体感できました。&lt;&#x2F;p&gt;
&lt;p&gt;次のようなメリットがあります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;フロントエンドの自由度&lt;&#x2F;strong&gt;：表示を司るフロントエンドとコンテンツ管理が分離されているため、任意の技術スタックでフロントエンドを構築可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;オムニチャネル対応&lt;&#x2F;strong&gt;：一度作成したコンテンツをウェブ、モバイル、IoTなど複数のプラットフォームに配信可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;開発の効率化&lt;&#x2F;strong&gt;：フロントエンドとバックエンドの開発を並行して進められる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;パフォーマンス向上&lt;&#x2F;strong&gt;：静的サイト生成やCDN配信との相性が良く、高速なサイト表示が可能&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;スケーラビリティ&lt;&#x2F;strong&gt;：トラフィック増加にも柔軟に対応できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;セキュリティ強化&lt;&#x2F;strong&gt;：管理画面とフロントエンドが分離されているため攻撃対象が減少&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;将来性&lt;&#x2F;strong&gt;：新しいデバイスやプラットフォームにもフロントエンドだけ独立し
ているため柔軟に対応できる&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;今回作成したWhisper機能は大した意味がありませんが、
将来的につぶやき投稿機能も別途作ろうかなと思います。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;Incremental Static Regenerationの略。増分静的再生成とも言われ、静的生
成（SSG）の拡張機能。事前にビルド済みの静的ページを提供しながら、revalidateパラメータにより再検証間隔を設定し
バックグラウンドで定期的に再生成する機能。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">このブログでは直接App Router配下に記事を書いていますが、ヘッドレスCMSを使うことも検討して諦めました。今回、ライトにつぶやき程度であればできそうかなとContentfulを使って実装してみました。</summary>
        </entry><entry xml:lang="en">
        <title>textlintで日本語ブログの品質を向上させよう</title>
        <published>2025-03-23T00:00:00+00:00</published>
        <updated>2025-03-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/textlint-introduction/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/textlint-introduction/</id>
        
            <content type="html">&lt;h2 id=&quot;textlintとは&quot;&gt;textlintとは&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;textlint.github.io&#x2F;&quot;&gt;textlint&lt;&#x2F;a&gt;は、テキスト上の問題を洗い出すための静的解析ツールです。
特に日本語のテキスト校正において優れた機能を持っており、文章のスタイル、用語の統一、表記ゆれ、誤字脱字などをチェックできます。
Markdownファイルなどの構造化されたテキストファイルに対して適用できるため、
ブログ記事や技術文書の品質を向上させるのに最適です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;なぜtextlintを導入したのか&quot;&gt;なぜtextlintを導入したのか&lt;&#x2F;h2&gt;
&lt;p&gt;技術ブログを書く際に直面する問題は、以下のようなものがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;「ですます調」と「である調」の混在&lt;&#x2F;li&gt;
&lt;li&gt;全角と半角の間のスペースの不統一&lt;&#x2F;li&gt;
&lt;li&gt;句読点や括弧の前後の余計なスペース&lt;&#x2F;li&gt;
&lt;li&gt;カタカナ語の間に中黒（・）や半角スペースがない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの問題は、読者にとって違和感を与え、プロフェッショナルさを損なう可能性があります。textlintを導入することで、これらの問題を自動的に検出し、一貫した文章スタイルを維持できるようになります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;インストールと設定&quot;&gt;インストールと設定&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1._必要なパッケージのインストール&quot;&gt;1. 必要なパッケージのインストール&lt;&#x2F;h3&gt;
&lt;p&gt;次のコマンドでtextlintと必要なルールをインストールします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install --save-dev textlint&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-rule-preset-ja-spacing&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-rule-preset-ja-technical-writing&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-rule-no-mix-dearu-desumasu&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-filter-rule-comments&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-filter-rule-node-types&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  textlint-plugin-mdx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;2._.textlintrcの設定&quot;&gt;2. &lt;code&gt;.textlintrc&lt;&#x2F;code&gt;の設定&lt;&#x2F;h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリに&lt;code&gt;.textlintrc&lt;&#x2F;code&gt;ファイルを作成し、以下のように設定します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;filters&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;comments&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;node-types&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;nodeTypes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;jsx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;code&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;inline-code&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;html&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;BlockQuote&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowlist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;&#x2F;&amp;lt;blockquote[^&amp;gt;]*&amp;gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;S]*?&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;blockquote&amp;gt;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;&#x2F;&amp;lt;blockquote&amp;gt;([&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;S])*?&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;blockquote&amp;gt;&#x2F;g&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;plugins&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;mdx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;rules&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preset-ja-spacing&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-nakaguro-or-halfwidth-space-between-katakana&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-space-around-parentheses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-space-between-full-width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-between-half-and-full-width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;space&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;always&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;exceptPunctuation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-after-exclamation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-after-question&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-around-code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preset-ja-technical-writing&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;sentence-length&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;max&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 200&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;no-exclamation-question-mark&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowHalfWidthQuestion&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowFullWidthQuestion&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-weak-phrase&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;max-kanji-continuous-len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;max&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-mixed-period&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowPeriodMarks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;箇条書き&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;リスト&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;。&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;、&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;」&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;forceAppendPeriod&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;checkBlockQuote&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;checkListItem&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowExceptionContext&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ignorePeriodInQuotation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;no-mix-dearu-desumasu&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInHeader&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;である&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInBody&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ですます&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInList&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;である&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;strict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;@textlint-rule&#x2F;textlint-rule-no-invalid-control-character&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-technical-writing&#x2F;no-doubled-conjunction&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-technical-writing&#x2F;no-doubled-conjunctive-particle-ga&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3._package.jsonにスクリプトを追加&quot;&gt;3. package.jsonにスクリプトを追加&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;scripts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;check&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;textlint &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;src&#x2F;app&#x2F;articles&#x2F;**&#x2F;*.mdx&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;設定の詳細解説&quot;&gt;設定の詳細解説&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;フィルター&quot;&gt;フィルター&lt;&#x2F;h3&gt;
&lt;p&gt;MDXファイルには、本文の他にJSXコンポーネントやコードブロックが含まれています。
これらに対してtextlintのルールを適用すると誤検出が多発します。そのため、
フィルターを設定して特定の部分をチェック対象から除外しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;filters&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;comments&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;node-types&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;nodeTypes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;jsx&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;code&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;inline-code&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;html&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;BlockQuote&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allowlist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;&#x2F;&amp;lt;blockquote[^&amp;gt;]*&amp;gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;S]*?&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;blockquote&amp;gt;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;      &amp;quot;&#x2F;&amp;lt;blockquote&amp;gt;([&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;S])*?&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;blockquote&amp;gt;&#x2F;g&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;comments&lt;&#x2F;code&gt;: コメント部分をチェック対象から除外&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;node-types&lt;&#x2F;code&gt;: JSX、コードブロック、インラインコード、HTMLタグ、引用文をチェック対象から除外&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;allowlist&lt;&#x2F;code&gt;: 正規表現で指定したパターンをチェック対象から除外&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;blockquote要素内の引用文は自分の文章でなく修正しようもないため、
対象から外しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ルール&quot;&gt;ルール&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;1._「ですます調」と「である調」の統一_(no-mix-dearu-desumasu)&quot;&gt;1. 「ですます調」と「である調」の統一 (no-mix-dearu-desumasu)&lt;&#x2F;h4&gt;
&lt;p&gt;文体の一貫性を保つためのルールです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;no-mix-dearu-desumasu&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInHeader&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;である&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInBody&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;ですます&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;preferInList&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;である&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;strict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;見出しは「である調」とする&lt;&#x2F;li&gt;
&lt;li&gt;本文は「ですます調」とする&lt;&#x2F;li&gt;
&lt;li&gt;リストは「である調」とする&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;strict: false&lt;&#x2F;code&gt;で厳密すぎるチェックを回避する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;2._日本語の間隔に関するルール_(preset-ja-spacing)&quot;&gt;2. 日本語の間隔に関するルール (preset-ja-spacing)&lt;&#x2F;h4&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;preset-ja-spacing&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-nakaguro-or-halfwidth-space-between-katakana&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-space-around-parentheses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-no-space-between-full-width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-between-half-and-full-width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;space&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;always&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;exceptPunctuation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-after-exclamation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-after-question&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;ja-space-around-code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;カタカナ語の間には中黒または半角スペースを入れる規則である&lt;&#x2F;li&gt;
&lt;li&gt;括弧の前後には余分なスペースを入れない規則である&lt;&#x2F;li&gt;
&lt;li&gt;全角文字の間にはスペースを入れない規則である&lt;&#x2F;li&gt;
&lt;li&gt;半角と全角の間には常にスペースを入れる規則である（句読点は例外）&lt;&#x2F;li&gt;
&lt;li&gt;感嘆符と疑問符の後にはスペースを入れる規則である&lt;&#x2F;li&gt;
&lt;li&gt;コードの前後のスペースは不要とする規則である&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;3._技術文書向けのルール_(preset-ja-technical-writing)&quot;&gt;3. 技術文書向けのルール (preset-ja-technical-writing)&lt;&#x2F;h4&gt;
&lt;p&gt;技術文書に適した日本語表現をチェックする包括的なルールセットです。冗長な表
現、読みにくい文章構造、一文の長さなどをチェックする。以下のような設定を追加
しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;max-kanji-continuous-len&lt;&#x2F;code&gt;: 漢字の連続使用を20文字までに制限を緩和&lt;&#x2F;li&gt;
&lt;li&gt;助詞の重複や冗長表現、不自然なアルファベット使用などを検出する機能を含む&lt;&#x2F;li&gt;
&lt;li&gt;技術文書らしい表現をチェックし、読みやすさを向上させる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;MDXファイルの対応と実行時の問題解決&quot;&gt;MDXファイルの対応と実行時の問題解決&lt;&#x2F;h2&gt;
&lt;p&gt;Next.jsのブログでは、多くの場合MDXファイルを使用しています。
デフォルトのtextlint設定ではMDXファイルを認識できないことがあります。
実際に&lt;code&gt;npm run check&lt;&#x2F;code&gt;を実行してみると、
以下のようなデバッグ情報が表示されました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;No Process files that are un-support extensions: [&amp;quot;&#x2F;path&#x2F;to&#x2F;your&#x2F;blog&#x2F;src&#x2F;app&#x2F;articles&#x2F;...&#x2F;page.mdx&amp;quot;,...]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;この問題を解決するには、前述のインストール手順にあるように、&lt;code&gt;textlint-plugin-mdx&lt;&#x2F;code&gt;パッケージを追加し、&lt;code&gt;.textlintrc&lt;&#x2F;code&gt;ファイルの設定に&lt;code&gt;&quot;plugins&quot;: [&quot;mdx&quot;]&lt;&#x2F;code&gt;を追加する必要があります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;正しく設定した後の実行結果&quot;&gt;正しく設定した後の実行結果&lt;&#x2F;h3&gt;
&lt;p&gt;正しく設定した後、&lt;code&gt;npm run check&lt;&#x2F;code&gt;を実行すると、ブログ内のMDXファイルが検査され、以下のような結果が表示されます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;path&#x2F;to&#x2F;your&#x2F;blog&#x2F;src&#x2F;app&#x2F;articles&#x2F;...&#x2F;page.mdx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  23:138  ✓ error  原則として、全角文字と半角文字の間にスペースを入れます。                 ja-spacing&#x2F;ja-space-between-half-and-full-width&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  27:32   error    文末が&amp;quot;。&amp;quot;で終わっていません。                                           ja-technical-writing&#x2F;ja-no-mixed-period&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  40:7    ✓ error  原則として、全角文字と半角文字の間にスペースを入れます。                 ja-spacing&#x2F;ja-space-between-half-and-full-width&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  167:15  ✓ error  かっこの外側、内側ともにスペースを入れません。                           ja-spacing&#x2F;ja-no-space-around-parentheses&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  167:41  error    箇条書き: &amp;quot;である&amp;quot;調 でなければなりません                                no-mix-dearu-desumasu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;チェックマーク（✓）がついているエラーは自動修正可能なものです。これらを一括修正するには、以下のコマンドを実行します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npx&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; textlint --fix &amp;quot;src&#x2F;app&#x2F;articles&#x2F;**&#x2F;*.mdx&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ただし、すべてのエラーが自動修正できるわけではありません。特に文体（「ですます調」と「である調」）や文末の句点、文の長さなどに関するエラーは、意図に合わせて手動で修正する必要があります。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;CI&#x2F;CDパイプラインへの組み込み&quot;&gt;CI&#x2F;CDパイプラインへの組み込み&lt;&#x2F;h3&gt;
&lt;p&gt;品質チェックを自動化するために、GitHub Actionsなどのワークフローにtextlintを組み込むこともできます。例えば、以下のような&lt;code&gt;.github&#x2F;workflows&#x2F;textlint.yml&lt;&#x2F;code&gt;ファイルを作成することで、プルリクエスト時に自動的に文章をチェックできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Textlint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  pull_request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    paths&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;src&#x2F;app&#x2F;articles&#x2F;**&#x2F;*.mdx&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  textlint&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;setup-node@v3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          node-version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;20&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          cache&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;npm&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run check&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;期待される効果&quot;&gt;期待される効果&lt;&#x2F;h2&gt;
&lt;p&gt;textlintを導入することで得られる主な効果は以下の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一貫した文体&lt;&#x2F;strong&gt;: 文体が混在しない文章になる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;読みやすさの向上&lt;&#x2F;strong&gt;: 適切な空白や区切りにより、読みやすい文章になる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;プロフェッショナルな印象&lt;&#x2F;strong&gt;: 表記の一貫性により、プロフェッショナルな印象を与える&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;効率的な校正&lt;&#x2F;strong&gt;: 手動での確認作業が減り、効率的に校正できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;品質の均一化&lt;&#x2F;strong&gt;: 複数の執筆者がいる場合でも、文章スタイルを統一できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CI&#x2F;CDパイプラインとの統合&lt;&#x2F;strong&gt;: Node.jsベースのツールであるため、GitHub ActionsやJenkins、AWS CodeBuildなどのCI&#x2F;CDパイプラインに容易に組み込める&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;textlintは、日本語の技術ブログを書く際の強力な味方です。
適切な設定により、文章の品質を向上させ、読者にとって読みやすく一貫性のある記事を提供できます。特にMDXを使ったブログでは、フィルター設定により、記事本文とコードやJSXを適切に区別してチェックできます。&lt;&#x2F;p&gt;
&lt;p&gt;Next.js + Tailwind Plus(旧Tailwind UI)をベースにしたブログシステムとの相性
も抜群です。Node.jsベースのツールであるため、同じエコシステム内で簡単に導入
でき、npmスクリプトとして実行できます。さらに、GitHub ActionsなどのCI&#x2F;CD
パイプラインに組み込むことで、プルリクエスト時に自動的に文章をチェックし、品
質を担保も可能です。&lt;&#x2F;p&gt;
&lt;p&gt;今回紹介した設定は、MDXファイルを使ったNext.jsブログに最適化されていますが、他の形式の文書にも応用可能です。自分の文書スタイルや好みに合わせてカスタマイズしてみてください。&lt;&#x2F;p&gt;
&lt;p&gt;定期的に&lt;code&gt;npm run check&lt;&#x2F;code&gt;を実行し、指摘された問題を修正することで、ブログ記事の品質を着実に向上させることができます。&lt;&#x2F;p&gt;
</content>
        <summary type="html">textlintを活用して日本語の技術ブログ記事の品質を向上させる方法を紹介します。特にこのブログではMarkdownでなくMDXを使用しているので、MDXファイルに対する最適な設定と導入手順を解説します。</summary>
        </entry><entry xml:lang="en">
        <title>Authorization Bypass in Next.js Middleware</title>
        <published>2025-03-22T00:00:00+00:00</published>
        <updated>2025-03-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/cve-2025-29927/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/cve-2025-29927/</id>
        
            <content type="html">&lt;h2 id=&quot;CVE情報&quot;&gt;CVE情報&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;CVE番号: CVE-2025-29927&lt;&#x2F;li&gt;
&lt;li&gt;GHSAコード: GHSA-f82v-jwr5-mffw&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;攻撃者が特定のHTTPヘッダーを操作することで、ミドルウェアの認証チェックを迂回
し、保護されたリソースにアクセスできてしまう問題のようです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;アップデート手順&quot;&gt;アップデート手順&lt;&#x2F;h2&gt;
&lt;p&gt;アップデートの手順は次の通りです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Next.jsのアップデート&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install next@15.2.3 @next&#x2F;mdx@15.2.3 eslint-config-next@15.2.3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# npx next updateでもいいか。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# アップデート後問題ないか、一応Lintをかけておく&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run lint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">Next.js 15.2.3未満で認証をバイパスできる脆弱性の通知がGitHubから飛んできたので、一応このブログもアップデートしました。</summary>
        </entry><entry xml:lang="en">
        <title>制度の迷宮を解読：ドローン操縦士資格の取得体験記</title>
        <published>2025-03-22T00:00:00+00:00</published>
        <updated>2025-03-22T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/drown-lisense/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/drown-lisense/</id>
        
            <content type="html">&lt;h2 id=&quot;技能証明申請者番号の取得&quot;&gt;技能証明申請者番号の取得&lt;&#x2F;h2&gt;
&lt;p&gt;これからドローンを飛ばすために国家資格である二等無人航空機操縦士を取得する場合、国土交通省の
「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ossportal.dips.mlit.go.jp&#x2F;portal&#x2F;top&#x2F;&quot;&gt;ドローン情報基盤システム2.0&lt;&#x2F;a&gt;」
&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
で&lt;strong&gt;技能証明申請者番号&lt;&#x2F;strong&gt;の発行を行
う必要があります。ドローンスクールに入学を申し込むと、この番号を取得するよう
に指示されるはずです。&lt;&#x2F;p&gt;
&lt;p&gt;この技能証明申請者番号の発行には本人確認と&lt;strong&gt;登録講習機関&lt;&#x2F;strong&gt;が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;本人確認にはマイナンバーカードを使用しますが、マイナンバーカードに登録した
住所などが自動反映され変更できないので注意しましょう。&lt;&#x2F;p&gt;
&lt;p&gt;登録講習機関とはドローンスクールのことです。ドローンスクールには&quot;T0XXX001&quot;など
の事務所コードがアサインされていて、ドローンスクールから提示されるはずなので必ず確認しましょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ドローンスクールに通う&quot;&gt;ドローンスクールに通う&lt;&#x2F;h2&gt;
&lt;p&gt;ドローンを飛ばすために二等無人航空機操縦士を取るには、①学科試験、②身体検査、
③実技試験をクリアする必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;このうち、実技試験について自動車と同様に教習所に通って実技訓練を受けて、
教習所の実技試験にパスすることで二等無人航空機操縦士の実技試験を免除できます。
教習所に当たるものが、ドローンスクールです。&lt;&#x2F;p&gt;
&lt;p&gt;実技試験で求められる、目視で位置を把握しながらスクエア飛行や八の字飛行、
不安定なATTIモードでの飛行とがどれだけ実務的に有効なのか疑問もあります。
しかし、資格取得には実技試験でこれらをこなす必要があり、
そのためには練習が必要なのも事実です。
資格がない状態での練習場所も確保しづらいので、
20〜30万円の費用は必要ですがドローンスクールで講習を受けるのが合理的
だと思います。&lt;&#x2F;p&gt;
&lt;p&gt;今回は二等無人航空機操縦士に追加して目視外飛行と夜間飛行の限定解除を付けました。&lt;&#x2F;p&gt;
&lt;p&gt;練習時間は大したことがなく、詰めて3週間くらいで完了しました。
しかし、実技試験の枠がなかなか取れず、練習を修了してから実技試験を受けるまで
1ヶ月以上必要でした。結果、目視外で一度失敗して、補講を受けて再試験になり
基本、目視外、夜間の3つの試験で2ヶ月くらい必要でした。&lt;&#x2F;p&gt;
&lt;p&gt;私が通ったドローンスクールはショッピングモール内にあり、天井の制約で
せいぜい1.5〜2mの高さでしか練習できませんでした。
実技試験では3.5mの高さと規定されており、
試験の仕様を満たし試験するためにドローンスクールは別会場を
押さえる必要がありました。その結果、試験枠が限定され、
実技試験をスケジュールで苦労しました。&lt;&#x2F;p&gt;
&lt;p&gt;スクールを選ぶ時は、こういったファシリティーも確認したほうがよいですね。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;学科試験と身体検査&quot;&gt;学科試験と身体検査&lt;&#x2F;h2&gt;
&lt;p&gt;学科試験と身体検査は、なぜか一般財団法人日本海事協会が無人飛行操縦士試験を
運営していて、これらの試験も海事協会の「試験申込システム」を使います。&lt;&#x2F;p&gt;
&lt;p&gt;学科試験の手数料は8,800円です。
試験申込システムで申し込むと、結局プロメトリックで試験を受けることになります。
試験は会場のPCで予約した時間に受験するスタイルです。
試験に合格するとプロメトリックから海事協会の試験申請申込システムに連携されます。&lt;&#x2F;p&gt;
&lt;p&gt;身体検査は運転免許を持っていれば、海事協会の試験申込システムに
運転免許をアップロードすることで実際の身体測定を受
けずに完了させることができます。この場合、手数料は5,200円です。
会場で実際に身体検査を受検する場合は、19,900円の手数料が必要です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;すべての試験が終わったら&quot;&gt;すべての試験が終わったら&lt;&#x2F;h2&gt;
&lt;p&gt;スクールの実技試験が終わったら、スクールから「無人航空機講習修了証明」
というものがそれぞれの実技試験に対して発行されます。基本、目視外、夜間
と受けていれば3枚発行されます。&lt;&#x2F;p&gt;
&lt;p&gt;最初はこれをそのままDIPS2.0にアップロードして申請すると思っていたので、
「あれ？そう言えば学科と身体検査ってどうなったんだ？」と混乱してしまいまし
た。&lt;&#x2F;p&gt;
&lt;p&gt;結論からいうと、すべて一度海事協会の試験申込システムを経由する必要がありました。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;学科試験と身体検査が修了した時点で海事協会の試験申込システム上に「&lt;strong&gt;試験合格証明書発行申込み&lt;&#x2F;strong&gt;」という試験が現れる。学科、身体検査、ドローンスクールの実技試験がすべて終わったらこれを申し込む。&lt;&#x2F;li&gt;
&lt;li&gt;試験申込システムでは申込があると7日ほどですべての証明書を発行してくれる。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;試験修了後に別途&lt;strong&gt;合格証明書発行&lt;&#x2F;strong&gt;の申請が必要などトリッキーなプロセスで、
最初全く理解できませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;海事協会の試験申込システムとドローンスクールは技能証明申請者番号で連携していて、
「試験合格証明書発行申込み」を行うと発行される「試験合格証明書」にはドローン
スクールの講習修了証明番号も連携して掲載されています。&lt;&#x2F;p&gt;
&lt;p&gt;この試験合格証明書発行により、DIPS2.0にもすべての証明番号が連携されます。
この状態で初めてDIPS2.0に証明書をアップロードできるようなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;DIPS2.0での技能証明書交付手続き&quot;&gt;DIPS2.0での技能証明書交付手続き&lt;&#x2F;h2&gt;
&lt;p&gt;以上の手続きがすべて終わり、DIPS2.0に入って「技能証明書の新規交付」を
選択すると海事協会のシステムから各種証明番号がすべて連携されてプリセットされ
ています。&lt;&#x2F;p&gt;
&lt;p&gt;証明番号を確認しながら、海事協会の試験申込システムからダウンロードした「技能
証明合格証明書」、ドローンスクールから発行された講習修了証明書を対応させて
アップロードして申請します。&lt;&#x2F;p&gt;
&lt;p&gt;私は、今ここです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;二等無人航空機操縦士のライセンスの問題&quot;&gt;二等無人航空機操縦士のライセンスの問題&lt;&#x2F;h2&gt;
&lt;p&gt;二等無人航空機操縦士の技能証明は、2022年12月5日より施行
されたばかりの国家資格です。受けてみていろいろ問題があると感じました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;資格取得のプロセスやシステムの酷さ&quot;&gt;資格取得のプロセスやシステムの酷さ&lt;&#x2F;h3&gt;
&lt;p&gt;上記に資格取得までのプロセスをまとめましたが、
どのように思われますか？&lt;&#x2F;p&gt;
&lt;p&gt;私には、わざと難解にしたとしか思えない手続きでした。&lt;&#x2F;p&gt;
&lt;p&gt;特に海事協会が入ることで、国土交通省のシステムと海事協会のシステム、
プロメトリックのシステムを行き来する必要あります。
なぜ無人飛行操縦士の資格試験を海事協会が担当しているのか合理的な理由が
ユーザーからは見当も付かないので、個々の申請の意味が分かりづらく混乱しました。&lt;&#x2F;p&gt;
&lt;p&gt;システムのインターフェイスもめちゃくちゃで分かりにくさに拍車をかけています。
国土交通省のDIPS2.0も酷いシステムですが、海事協会の試験申請システムは本当に
酷いものです。&lt;&#x2F;p&gt;
&lt;p&gt;制度が発足してまだ2年足らずで過渡期であるため、手続きも頻繁に変わっています。
以前はドローンスクールの証明書は海事協会のシステムにアップロードしていたのが、
現在不要になったりして改善はしているのでしょうが、
ネット検索して手続きを調べると古い情報が残っていて更に混乱しました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;現状のドローン事情との齟齬&quot;&gt;現状のドローン事情との齟齬&lt;&#x2F;h3&gt;
&lt;p&gt;今回ライセンス取得に取り組んでみて、ドローンの現状との齟齬を2点感じました。&lt;&#x2F;p&gt;
&lt;p&gt;まず「&lt;strong&gt;目視外&lt;&#x2F;strong&gt;」の限定解除が必要なことです。&lt;&#x2F;p&gt;
&lt;p&gt;今売られているドローンの多くは、モニターやゴーグルを通じたFPV飛行、
GPSウェイポイントによる自動飛行、障害物自動回避などの機能を持っています。
最大伝送距離も10Km程度あり、電波干渉や障害物があっても数Km程度は問題なく飛行
できます。&lt;&#x2F;p&gt;
&lt;p&gt;目視飛行が可能なのは500m程度ですから、ちょっと飛ばすと
「目視飛行は無理よね」という距離になってしまいます。
モニターを一瞬見ただけで「目視外」となるので、
目視飛行では安全な飛行に有効なカメラやセンサー、GPSからの情報を確認することも
できませんし、便利な自動飛行なども使えません。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、現代のドローンを運航しようとするとモニターを見て操作する時間がほぼ必要
ので「目視外」の限定解除がほぼ必須だと感じます。この事情を知らないで、限定
解除せず、ライセンス取得後に「しまった」ということが多いようです。&lt;&#x2F;p&gt;
&lt;p&gt;つぎに「&lt;strong&gt;機体認証&lt;&#x2F;strong&gt;」の話です。&lt;&#x2F;p&gt;
&lt;p&gt;ドローンは、二等無人航空機操縦士の資格と認証機体がそろって
はじめて自由に飛ばすことが可能となります。
いずれかが欠けていると、「飛行の許可・承認申請」を行う必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;ところが、現状第二種型式認証を日本で受けている機体は、下表のものだけです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;型式&lt;&#x2F;th&gt;&lt;th&gt;メーカー&lt;&#x2F;th&gt;&lt;th&gt;認証取得日&lt;&#x2F;th&gt;&lt;th&gt;推定価格&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;6150TC型&lt;&#x2F;td&gt;&lt;td&gt;イームズロボティクス株式会社&lt;&#x2F;td&gt;&lt;td&gt;2024年4月5日&lt;&#x2F;td&gt;&lt;td&gt;不明&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Airpeak S1（ARS-S1）&lt;&#x2F;td&gt;&lt;td&gt;ソニーグループ株式会社&lt;&#x2F;td&gt;&lt;td&gt;2023年12月22日&lt;&#x2F;td&gt;&lt;td&gt;110万円&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;EGL49J-R1型&lt;&#x2F;td&gt;&lt;td&gt;株式会社DroneWorkSystem&lt;&#x2F;td&gt;&lt;td&gt;2024年3月29日&lt;&#x2F;td&gt;&lt;td&gt;不明&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;エアロボウイング（AS-VT01K）&lt;&#x2F;td&gt;&lt;td&gt;エアロセンス株式会社&lt;&#x2F;td&gt;&lt;td&gt;2024年6月5日&lt;&#x2F;td&gt;&lt;td&gt;550万円&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;D-HOPE Ⅰ－J01型&lt;&#x2F;td&gt;&lt;td&gt;株式会社センチュリー&lt;&#x2F;td&gt;&lt;td&gt;2024年3月29日&lt;&#x2F;td&gt;&lt;td&gt;30万円&#x2F;日(レンタル)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;EGL77J-R1型&lt;&#x2F;td&gt;&lt;td&gt;ドローンWORKシステム&lt;&#x2F;td&gt;&lt;td&gt;申請中（2024年9月27日）&lt;&#x2F;td&gt;&lt;td&gt;不明&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FAZER R型&lt;&#x2F;td&gt;&lt;td&gt;ヤマハ発動機&lt;&#x2F;td&gt;&lt;td&gt;申請中（2024年10月1日）&lt;&#x2F;td&gt;&lt;td&gt;1千342万円&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;推定価格を見ても分かりますが、どれも業務用で個人のホビーを想定したものはありません。
そのため小売りをしていないようなので、入手性、価格の観点から個人のホビー目的
には全く向いていません。&lt;&#x2F;p&gt;
&lt;p&gt;一般的にホビーで人気があるのはDJIなどの中国のメーカーです。
高性能で価格もリーズナブルですから、映像のプロなどでも多く使われています。
しかし、これらの機種は認定を受けていません。
世界的にメージャーな機体なので、日本の独自認証などの手間を
日本マーケットのためだけにかけるとは思えません。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、個人の場合、国家資格を取っても認証機体の入手が事実上不可能なので
結果として飛行許可・承認申請が必要となります。&lt;&#x2F;p&gt;
&lt;p&gt;申請には無人航空機仕様も届け出る必要があります。
このため自分でドローンの上面、側面、前面の写真
とユーザーマニュアルをDIPS2.0に貼付する必要があります。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kantei.go.jp&#x2F;jp&#x2F;singi&#x2F;kogatamujinki&#x2F;kanminkyougi_dai20&#x2F;siryou1.pdf&quot;&gt;国土交通省の資料&lt;&#x2F;a&gt;
によると2024年10月時点でのライセンス交付数は17,252件です。その大半の方が
飛行許可・承認申請を行うと思います。
少なくとも数万件の許可・承認申請が提出されており、
そこには同じDJIのユーザーマニュアルが貼付しているはずです。&lt;&#x2F;p&gt;
&lt;p&gt;それ、ほんとに読んで確認して承認しているのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;なんて間抜けなシステムなんだろうと思います。&lt;&#x2F;p&gt;
&lt;p&gt;毎回申請は手間なので、多くの人は「日本全国・一年間」などの包括申請を行うことになりますが、
それでも2万件近い申請になっているはずです。&lt;&#x2F;p&gt;
&lt;p&gt;これは明らかに仕組みや手続きのバグです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ドローン体験をシミュレーターで先取り&quot;&gt;ドローン体験をシミュレーターで先取り&lt;&#x2F;h2&gt;
&lt;p&gt;いずれにしろ、まだドローンを飛ばせるまでには手続きに時間がかかりそうなので、
手っ取り早く飛ばす体験をするために、
&lt;strong&gt;TRYP FPV&lt;&#x2F;strong&gt;というドローンのシミュレーターを購入しました。&lt;&#x2F;p&gt;
&lt;p&gt;Macbook ProにDJI送信機3を繋いで、遊んでいます。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;mjeSZdiz_nc&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;資格取得ではスポーツモードの操縦はしないので、
全くうまく操縦できていませんが3日ほどやりこんで
やっとなんとか思った方向には飛ばせるようになってきました。&lt;&#x2F;p&gt;
&lt;p&gt;ドローンも壊れないし、これで十分じゃないかと思い始めてます。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;通称、「DIPS 2.0」 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">昨年末に「空を飛びたい」と思い立ち、ドローンを飛ばすために二等無人航空機操縦士のライセンスに取り組みましたが、やっと技能証明申請まで漕ぎ着けました</summary>
        </entry><entry xml:lang="en">
        <title>サーモンラン</title>
        <published>2025-03-20T00:00:00+00:00</published>
        <updated>2025-03-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/salmon-run/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/salmon-run/</id>
        
            <content type="html">&lt;p&gt;今日のステージはムニ・エール海洋発電所です。&lt;&#x2F;p&gt;
&lt;p&gt;ゴタゴタしてなかなかサーモンランをできなかったので
楽しかったなぁ。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;-OMUu-IkZLI&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">久しぶりにサーモンランをやったら、一人で盛り上げって仕舞いました。</summary>
        </entry><entry xml:lang="en">
        <title>閉館予定のDIC川村記念美術館</title>
        <published>2025-03-18T00:00:00+00:00</published>
        <updated>2025-03-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/karamura-musium/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/karamura-musium/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;karamura-musium&amp;#x2F;kawamura.jpg?h=cb1306342790d81ff63c&quot;
  alt=&quot;&quot; width=&quot;1800&quot; height=&quot;1040&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;年初から美術館のWeb Siteで次のようにアナウンスされていたので、
ある程度は混んでいるのは覚悟していました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
  庭園内にあるレストラン
  ベルヴェデーレは、2025年1月2日(木)より、各回80分の完全予約制となります。
  当館の周辺には飲食店がございません。庭園は一部を除き飲食が可能ですので、
  ゆっくりと過ごされたい方は、お弁当のご持参等もご検討いただけますと幸いです。
  &lt;footer&gt;
    - 川村美術館 お知らせ「来館者増加に伴う運営方法の変更について」
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;しかし、見くびっていました。&lt;&#x2F;p&gt;
&lt;p&gt;平日なのに、ロビー前はバスを待つ人であふれ返り、ギフトショップの前には人が行
列を作り、館内もゆっくり絵を観賞するゆとりを失うくらいには人がいました。&lt;&#x2F;p&gt;
&lt;p&gt;17世紀のレンブラントによる肖像画、モネやルノワールら印象派から、
ピカソ、シャガールの西洋近代、アメリカの現代美術まで、と今回展示のコレクショ
ンはさすがに見ごたえがありました。&lt;&#x2F;p&gt;
&lt;p&gt;美術品もさることなが、約3万坪の広大な庭園が何度来ても素晴らしい。
冬に落葉する木が多いのですが、落葉し明るくなった森で見る青空と枝ぶりが
いっそう際立っていました。&lt;&#x2F;p&gt;
&lt;p&gt;この庭園は4月以降もしばらくは一般開放され、その後については佐倉市とDICで協議
するとのこと。次は桜の開花の頃に来てみようかな。&lt;&#x2F;p&gt;
</content>
        <summary type="html">今月一杯で閉館してしまう。千葉県佐倉市のDIC川村記念美術館に行ってってきました。</summary>
        </entry><entry xml:lang="en">
        <title>エンジニア的ブログ再構築 : Next.js × Tailwind Plusで得る柔軟性</title>
        <published>2025-03-17T00:00:00+00:00</published>
        <updated>2025-03-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/nextjs-tailwindui-blog/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/nextjs-tailwindui-blog/</id>
        
            <content type="html">&lt;h2 id=&quot;Micro.blogから移行&quot;&gt;Micro.blogから移行&lt;&#x2F;h2&gt;
&lt;p&gt;&quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;book.micro.blog&#x2F;&quot;&gt;Indie Microblogging&lt;&#x2F;a&gt;&quot;というコンセプトに共感し、
X.comのようなプラットフォームに依存せず
長文の記事だけでなくマイクロブログも可能なMicro.blog
を昨年から利用していました。
気軽なつぶやきと長文記事を同じプラットフォームで書けて、
Micro.blogのコミュニティーで海外のユーザーとのコミュニケーションも楽しくはありました。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、半年くらい使ってみると次のような点で不満を持ちました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;長文記事とつぶやきが混在するので、読みづらい。そのためテーマをカスタマイズ
して両者を分離したくなるが、よく考えると本末転倒でないかと思い始めた。Micro.blog自体も
長文を意識したSummery欄を追加したりLongformにフォーカスしたテーマが人気だったり、
コンセプトがブレてきていると感じてしまった。&lt;&#x2F;li&gt;
&lt;li&gt;やはり、Compose画面が長文には向いておらず、エディタで編集して切り貼りすることが多
く非効率。海外ユーザーはMarsEditを使っているユーザーが多いようだが、
リッチテキストを好きになれない。&lt;&#x2F;li&gt;
&lt;li&gt;Micro.blogは独自の機能とプラグインとして提供されているテーマ、バックエンドでHugo
で構成されており、それぞれの依存からカスタマイズ時の制約が大きく独自のノウハ
ウが必要となる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;モダンな技術スタックでブログ&quot;&gt;モダンな技術スタックでブログ&lt;&#x2F;h2&gt;
&lt;p&gt;先日に遊びでNext.js + Tailwind CSSでPortfolioサイトを作りましたが、
CMSのような制約がなく、コードで部品を書いていける体験が
楽しかったのでブログも同じような技術スタックで構成することにしました。&lt;&#x2F;p&gt;
&lt;p&gt;Next.jsベースでのブログのStarter Kitのようなものはいくつか存在しますが、
興味から有償のTailwind Plusを購入したので、Tailwind Plusが提供する個人向け
Blogの&quot;Spotlight&quot;という&lt;strong&gt;Template&lt;&#x2F;strong&gt;をベースにカスタマイズしました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;nextjs-tailwindui-blog&amp;#x2F;spotlight.webp?h=b31a6334b27994b8c48d&quot;
  alt=&quot;Tailwind Plus: Spotlight template&quot; width=&quot;1535&quot; height=&quot;232&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Tailwind PlusのTemplateは、完全に動作するReactベースのアプリケーションコード
で、Javascript版とTypeScript版が提供されており、Tailwind CSSを利用したUI要素
だけでなく状態管理やルーティング、APIとの連携など本番環境ですぐに使用でき
る機能を全て含んでいます。next-themesを利用したダークモード対応やPrismJSを
使ったSyntax Highlight、レスポンシブ対応、画像最適化やコンポーネントのプリ
ロードなどは最初から組み込まれています。開発者はこれらのテンプレートを導入す
るだけで、最小限のカスタマイズで完全な機能を持つReactアプリケーションを短時
間で構築できると謳われています。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、実際にブログで運用にはそこそこカスタマイズが必要でした。&lt;&#x2F;p&gt;
&lt;p&gt;主なカスタマイズポイントとしては以下のような点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UI&#x2F;UXの改善&lt;&#x2F;strong&gt;：個人用のブログに合わせヘッダー、フッターのカスタマイズ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;記事管理システム&lt;&#x2F;strong&gt;：App Routerの構造を活かしたシンプルなMDXベースの記事管理&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;記事一覧フィルター&lt;&#x2F;strong&gt;: 日付でのフィルター機能を追加(デフォルトではページ
制御されていないため)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;コメントシステム&lt;&#x2F;strong&gt;：Giscusを使用したGitHubベースのコメント機能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;通常であれば、gray-matterやremarkなどを入れてヘッドレスCMSなどからMarkdown記事を取り込み
動的ルーティングで記事を生成するのが美しいのでしょうが、
「そのままMDXで書けばいいか」と割り切ってApp Routerの下に記事を書いていくスタイルにしました。
記事の執筆とサイトのコーディングの区別がつかない今のスタイルは不便もありますが、
気に入っています。HMR&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;機能で特に工夫もせずに更新した記事がテスト環境でリアルタイムに
反映されブラウザで確認できる点も気に入っています。&lt;&#x2F;p&gt;
&lt;p&gt;まだ記事の移行も終わっていませんし、元のテンプレートからそのまま未修正のもの
もありますが、ぼちぼちと修正していこうと思います。&lt;&#x2F;p&gt;
&lt;p&gt;Deploy先は、AWSの&lt;strong&gt;Amazon Amplify&lt;&#x2F;strong&gt;としました。ゆくゆくメールフォームなども作っ
ていきたいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;カスタムコンポーネントの活用&quot;&gt;カスタムコンポーネントの活用&lt;&#x2F;h2&gt;
&lt;p&gt;Next.jsとTailwind UIの大きな魅力の1つは、カスタムコンポーネントを簡単に作成
して再利用できる点です。従来のCMSであればプラグインやテンプレートの変更とな
り気軽にできませんが、今のスタイルであればTypescriptでコードを書けばすぐに利
用できます。コードなのでClaude CodeなどのAI支援も活用できます。&lt;&#x2F;p&gt;
&lt;p&gt;例えば、ブログ記事の中でレストランやショップの情報を
綺麗に表示するためのコンポーネントを作成しました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;tsx&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; src&#x2F;components&#x2F;ShopInfo.tsx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ShopInfoProps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  address&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  osmAddress&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  phone&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  closedDays&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-object z-property&quot;&gt;  website&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-primitive&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-storage z-type&quot;&gt;export function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; ShopInfo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  address&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  osmAddress&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  phone&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  closedDays&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;  website&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ShopInfoProps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; コンポーネントの実装...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;このコンポーネントを使用すると、以下のように店舗情報を簡単に表示できます。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;店名&lt;&#x2F;td&gt;&lt;td&gt;スターバックスコーヒー 学園都市キャンパススクェア店&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;住所&lt;&#x2F;td&gt;&lt;td&gt;兵庫県 神戸市西区 学園西町1-4 キャンパススクェア&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;地図&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?mlat=34.683006&amp;amp;mlon=135.057619#map=17&#x2F;34.683006&#x2F;135.057619&quot;&gt;OpenStreetMap&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;電話&lt;&#x2F;td&gt;&lt;td&gt;078-798-7613&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;定休日&lt;&#x2F;td&gt;&lt;td&gt;不定休&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ウェブサイト&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.starbucks.co.jp&#x2F;detail-1718&#x2F;&quot;&gt;https:&#x2F;&#x2F;store.starbucks.co.jp&#x2F;detail-1718&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;レストランやカフェだけでなく、様々な店舗情報を表示できます。&lt;&#x2F;p&gt;
&lt;p&gt;このようなコンポーネントは、情報を構造化して表示するだけでなく、スタイリングの一貫性を保ち、コードの再利用性を高めるメリットがあります。MDXの中でReactコンポーネントをシームレスに使用できるのは、このブログシステムの大きな魅力の1つです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Micro.blogからNext.js × Tailwind Plus × Amazon Apmplify(AWS)へのブログ移行は、
モダンなWeb技術スタックを活用するという点で非常に満足のいく選択でした。&lt;&#x2F;p&gt;
&lt;p&gt;新しいプラットフォームでは、以下のようなメリットを実感しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;開発の柔軟性&lt;&#x2F;strong&gt;: フロントエンドとしてReactベースのNext.jsを使うことで、好きなようにカスタマイズできる自由度を得られた&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;執筆体験の向上&lt;&#x2F;strong&gt;: MDXを使うことで、マークダウンの手軽さとReactコンポーネントの柔軟性を両立できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;パフォーマンス&lt;&#x2F;strong&gt;: 静的生成とエッジでのレンダリングにより、高速なページ読み込みを実現できた&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;学習機会&lt;&#x2F;strong&gt;: 実際のプロジェクトを通じて最新のWebフロントエンド技術を深く学べる点も大きな魅力&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;もちろん、まだ改善点もあります。コンテンツの移行や検索機能の実装、SEO対策など、今後も少しずつアップデートしていく予定です。自分のペースで改良していける点が、自前のプラットフォームの最大の魅力だと感じています。&lt;&#x2F;p&gt;
&lt;p&gt;Next.jsとTailwind Plusの組み合わせは、Webアプリケーション構築だけでなく
個人ブログの構築においても非常に強力なツールセットになっていると実感しています。
興味がある方はぜひ試してみることをおすすめします。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;HMR (Hot Module Replacement)アプリケーション実行中にコードが変更された
時、ページ全体をリロードせずに変更されたモジュールのみを動的に置き換える
技術。Webpackなどのバンドラーがファイル変更を監視し、ウェブソケット接続を通じて変更部分だけをブラウザに送信するため、アプリケーションの状態を保持したまま即座に変更が反映される。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Micro.blogを利用したブログを運用していましたが、Next.js + Tailwind Plus(旧Tailwind UI)を使ってエンジニアから見て柔軟なブログを再構築してみました。</summary>
        </entry><entry xml:lang="en">
        <title>『御上先生』のラーメン店</title>
        <published>2025-03-17T00:00:00+00:00</published>
        <updated>2025-03-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/teacher-mikami/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/teacher-mikami/</id>
        
            <content type="html">&lt;p&gt;今クールのドラマの中では『御上先生』を一番楽しみにしています。
昨日放送されたEpisode9ではいろんな伏線が回収されて、
最終話に向けて盛り上げって居ます。&lt;&#x2F;p&gt;
&lt;p&gt;が、ふと、近くの「めん花」というラーメン屋さんに入ったら、
なんとこのラーメン屋さんで『御上先生』のロケが行われていたようです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;teacher-mikami&amp;#x2F;menka.jpg?h=f7eb09e3e2941bd68210&quot;
  alt=&quot;近くのラーメン店に飾られたサイン&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;昔からあるラーメン屋なので意外な気もしましたが、
町中でいい感じに庶民的なラーメン屋の雰囲気は確かにあまり他ではないかもしれま
せん。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;menka-2.jpg&quot; alt=&quot;めん花&quot; &#x2F;&gt;
  &lt;figcaption&gt;めん花&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;店名&lt;&#x2F;td&gt;&lt;td&gt;HOTめん花&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;住所&lt;&#x2F;td&gt;&lt;td&gt;千葉県千葉市美浜区幸町1-37-13&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;地図&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?mlat=35.609007&amp;amp;mlon=140.101358#map=17&#x2F;35.609007&#x2F;140.101358&quot;&gt;OpenStreetMap&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;電話&lt;&#x2F;td&gt;&lt;td&gt;043-245-9174&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;定休日&lt;&#x2F;td&gt;&lt;td&gt;無休&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        <summary type="html">近くのラーメン店にふらりとは言ったら、なんとドラマ『御上先生』のロケが行われたお店でした。</summary>
        </entry><entry xml:lang="en">
        <title>Exploring Claude Code: Hands-On with Anthropic&#x27;s AI-Powered Coding Assistant</title>
        <published>2025-03-12T00:00:00+00:00</published>
        <updated>2025-03-12T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/claude-code/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/claude-code/</id>
        
            <content type="html">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;agents-and-tools&#x2F;claude-code&#x2F;overview&quot;&gt;Claude Code&lt;&#x2F;a&gt;を試してみました。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeは、Anthropicが開発した最新のAI駆動型コーディングアシスタントです。
コマンドラインコーディングツールで、AnthropicのサーバーにAPIを介して接続し
Claude 3.7 Sonnetモデルを活用して開発者を支援します。従って、
ブラウザからClaude 3.7 Sonnetを扱うのと同等の高度なAI推論の支援を受けることができます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Getting_Started_With_Claude_Code&quot;&gt;Getting Started With Claude Code&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Codeを使う前提がいくつかあります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Claude Codeはまだβ版でResearch Previewのため、
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.anthropic.com&#x2F;en&#x2F;docs&#x2F;agents-and-tools&#x2F;claude-code&#x2F;overview&quot;&gt;Claude Codeのページ&lt;&#x2F;a&gt;からβ版参加のWaiting Listの登録して、アクセ
ス許可をもらう必要があ。&lt;&#x2F;li&gt;
&lt;li&gt;Node.js 18以上が必要。以下のソフトウェアはオプション。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;git 2.23+&lt;&#x2F;li&gt;
&lt;li&gt;GitHub or GitLab CLI for PR workflows&lt;&#x2F;li&gt;
&lt;li&gt;ripgrep&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.anthropic.com&#x2F;supported-countries&quot;&gt;Supported Countries&lt;&#x2F;a&gt;に居
る必要。日本は対象となっているので大丈夫。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;もちろん、ターミナルから使うものなので、MacであればiTerm2などがあったほうが
よいでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;上記がクリアできたら、Claude Codeを認証して使用するために、AnthropicからAPI
キーを生成して払い出しておきます。&lt;&#x2F;p&gt;
&lt;p&gt;Claude Codeのインストールは以下のコマンドで行います。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install -g @anthropic&#x2F;claude-code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;インストールが完了したら、次のコマンドでClaude Codeを起動して、初回だけOAuth
認証を完了させておきます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;claude&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;What_Claude_Code_Can_Do_For_You?&quot;&gt;What Claude Code Can Do For You?&lt;&#x2F;h2&gt;
&lt;p&gt;見てもらったほうが早いので、下に操作した例を貼り付けておきます。
適当に作った&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;yostos-portfolio&quot;&gt;Webサイトのリポジトリ
&lt;&#x2F;a&gt;について、分析したのに
&lt;code&gt;README.md&lt;&#x2F;code&gt;の更新を依頼してみました。引用ブロック担っている部分が私の指示したものです。&lt;&#x2F;p&gt;
&lt;p&gt;単純なWebサイトですが、Next.jsを使いそこそこコードの量もありましたが、
数秒で私が適当に書いていた&lt;code&gt;README.md&lt;&#x2F;code&gt;を依存ソフトウェアなども正確に記載し完璧に仕上
げてくれました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;╭──────────────────────────────────────────────────────────────╮&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ ✻ Welcome to Claude Code research preview! │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ &#x2F;help for help │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ cwd: &#x2F;Users&#x2F;yostos&#x2F;ghq&#x2F;github.com&#x2F;yostos&#x2F;yostos-portfolio │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;╰──────────────────────────────────────────────────────────────╯&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Tips for getting started:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;  Run &#x2F;init to create a CLAUDE.md file with instructions for Claude.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;  Ask Claude questions about your codebase.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;3.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;  Ask Claude to implement changes to your codebase.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-quote z-begin z-markup z-quote&quot;&gt;&amp;gt; プロジェクトの概要を教えてください。これはどのようなプロジェクトで何を目的としていますか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ プロジェクトの概要を調査します。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ Task(Please analyze this project to understand its purpose and overview. Check the following:…)…&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⎿  Done (6 tool uses · 14.6k tokens · 22.1s)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ これは Next.js で構築された個人ポートフォリオサイトです。ウェブ技術とデザイン手法をテストするための練習プロジェ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;クトとして開発されています。主な特徴:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Next.js と TypeScript を使用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Tailwind CSS とdaisyUI でスタイリング&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Three.js と React Three Fiber による3D要素&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; Framer Motion によるアニメーション&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; AWS サービス（SES、Amplify）をバックエンド機能に使用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;サイト構成:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 3D要素、サービス、ニュース、作品を含むホームページ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; About ページ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 問い合わせフォーム&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 作品ポートフォリオ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 音楽セクション&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; ニュース&#x2F;ブログセクション&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-quote z-begin z-markup z-quote&quot;&gt;&amp;gt; では、README.mdは内容を正しく書き示しているでしょうか？もし齟齬があればアップデートしてください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ README.mdの内容を確認します。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ Read(file_path: &amp;quot;README.md&amp;quot;)…&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;  ⎿  # Porfolio Site with Next.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;個人でWeb技術とデザイン手法の検証を目的として 片手間で作った練習用ポートフォリオです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;... (+27 lines)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ Task(Compare the actual project features and technologies with what&amp;#39;s listed in the README.md. The README seems minimal …&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;and might be missing some technologies used in the project. …)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⎿  Done (6 tool uses · 18k tokens · 30.4s)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ READMEには更新が必要です。現在のREADMEは非常にシンプルで、プロジェクトで使われている多くの技術が記載されていませ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;ん。以下の点を修正すべきです：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; タイトルのタイプミス（&amp;quot;Porfolio&amp;quot; → &amp;quot;Portfolio&amp;quot;）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 使用技術の詳細リスト（Three.js、Framer Motion、AWS services等が未記載）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;3.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; プロジェクト機能の説明（3D要素、ポートフォリオ表示、問い合わせフォーム等）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;更新しますか？&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-quote z-begin z-markup z-quote&quot;&gt;&amp;gt; 更新してください。また、表記は日本語でお願いします。英語の部分があれば更新してください。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ READMEを日本語で更新します。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ Update(file_path: README.md)…&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⎿ Updated README.md with 54 additions and 14 removals&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;1 # Porfolio Site with Next.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;1 # ポートフォリオサイト with Next.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;3 個人でWeb技術とデザイン手法の検証を目的として 片手間で作った練習用ポートフォリオです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;3 個人でWeb技術とデザイン手法の検証を目的として片手間で作った練習用ポートフォリオです。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;5 以下を使用しています。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;5 ## 使用技術&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;7 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Next.js]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;nextjs.org&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;8 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Tailwind CSS]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;tailwindcss.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;9 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[daisyUI]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;daisyui.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;7 本プロジェクトでは以下の技術を使用しています。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;9 ## Getting Started&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;9 ### フロントエンド&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;10 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Next.js]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;nextjs.org&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - Reactフレームワーク（サーバーサイドレンダリングとルーティング）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;11 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[React]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;reactjs.org&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - ユーザーインターフェース構築のためのJavaScriptライブラリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;12 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[TypeScript]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;www.typescriptlang.org&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - 型付けされたプログラミング言語&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;13 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Tailwind CSS]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;tailwindcss.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - ユーティリティファーストのCSSフレームワーク&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;14 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[daisyUI]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;daisyui.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - Tailwind CSS用コンポーネントライブラリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;15 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Three.js]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;threejs.org&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - WebGL用3Dグラフィックスライブラリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;16 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[React Three Fiber]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;pmndrs&#x2F;react-three-fiber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - Three.js用Reactレンダラー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;17 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[React Three Drei]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;pmndrs&#x2F;drei&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - React Three Fiber用ヘルパー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;18 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Framer Motion]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;www.framer.com&#x2F;motion&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - React用アニメーションライブラリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;19&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;20 First, run the development server:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;20 ### バックエンド&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;21 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[AWS SES]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;ses&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - 問い合わせフォーム用メールサービス&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;22 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[AWS Amplify]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;aws.amazon.com&#x2F;amplify&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;Webおよびモバイルアプリケーションのためのプラットフォーム&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;23&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;24 ### UI&#x2F;UX&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;25 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[FontAwesome]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;fontawesome.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - アイコンライブラリ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;26 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[M PLUS 1 Code]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;fonts.google.com&#x2F;specimen&#x2F;M+PLUS+1+Code&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - コード表示用の現代的なフォント&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;27&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;28 ## 機能&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;29&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;30 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;3Dインタラクティブ要素&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - Three.jsとReact Three Fiberを用いたインタラクティブな3Dキューブ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;31 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;レスポンシブデザイン&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - 様々な画面サイズに適応するモバイルフレンドリーなインターフェース&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;32 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;ポートフォリオショーケース&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - 作品サンプルとプロジェクトのギャラリー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;33 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;問い合わせフォーム&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - AWS SESを統合した直接コミュニケーション用フォーム&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;34 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;ダーク&#x2F;ライトモード&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - テーマ切り替え機能&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;35 - &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;音楽プレーヤー&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; - 音楽ショーケース用SoundCloud統合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;36&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;37 ## 始め方&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;38&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;39 まず、開発サーバーを実行します:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;40&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;41 `bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     42  npm run dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     43  # or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     43  # または&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     44  yarn dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     45  # or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     45  # または&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     46  pnpm dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     47  # or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     47  # または&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     48  bun dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     49  `&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;50&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;51 Open &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[http:&#x2F;&#x2F;localhost:3000]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;http:&#x2F;&#x2F;localhost:3000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; with your browser to see the result.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;51 ブラウザで &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[http:&#x2F;&#x2F;localhost:3000]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;http:&#x2F;&#x2F;localhost:3000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; を開くと結果が表示されます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;52&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;53 You can start editing the page by modifying &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`app&#x2F;page.tsx`&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;. The page auto-updates as you edit the file.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;53 &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`app&#x2F;page.tsx`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;を編集することでページの編集を開始できます。ファイルを編集すると、ページは自動更新されます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;54&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;55 This project uses &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`next&#x2F;font`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;nextjs.org&#x2F;docs&#x2F;app&#x2F;building-your-application&#x2F;optimizing&#x2F;fonts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;to automatically optimize and load &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title z-string z-other z-link z-title z-markdown&quot;&gt;[Geist]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;vercel.com&#x2F;font&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;, a new font family for Vercel.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;55 ## 環境変数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;56&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;57 問い合わせフォーム機能を使用するには、以下のAWS環境変数を設定する必要があります:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;58&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;59 `      60  AWS_ACCESS_KEY_ID=あなたのAWSアクセスキー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     61  AWS_SECRET_ACCESS_KEY=あなたのAWSシークレットキー&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     62  SES_REGION=あなたのAWSリージョン (デフォルト: ap-northeast-1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     63  SES_FROM_EMAIL=送信者メールアドレス&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     64  SES_TO_EMAIL=受信者メールアドレス&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;     65  `&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;66&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;67 ## その他&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;68&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;69 このプロジェクトでは&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-raw z-markdown z-markup z-inline z-raw z-string z-markdown&quot;&gt;`next&#x2F;font`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-link z-title&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-underline z-link&quot;&gt;https:&#x2F;&#x2F;nextjs.org&#x2F;docs&#x2F;app&#x2F;building-your-application&#x2F;optimizing&#x2F;fonts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; を使用して、&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;最適なパフォーマンスのためにカスタムフォントを自動的に最適化して読み込んでいます。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;⏺ README.mdを日本語に完全更新しました。以下の内容を追加・修正しました：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; タイトルを「ポートフォリオサイト with Next.js」に修正&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 詳細な技術スタックをフロントエンド、バックエンド、UI&#x2F;UXの3セクションに分けて記載&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;3.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; プロジェクトの主要機能（3D要素、レスポンシブデザイン、ポートフォリオ機能など）を追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;4.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 環境変数の設定方法も追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;5.&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; すべての英語部分を日本語に翻訳&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;これでREADMEは実際のプロジェクトの機能と技術をより正確に反映しています。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;│ &amp;gt; quit │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;! for bash mode · &#x2F; for commands · esc to undo ✓ Update installed · Restart to apply&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はAnthropicが開発したAI駆動型コーディングアシスタント「Claude Code」を試
してみました。まだResearch Previewの段階ですが、その能力は非常に印象的です。
コマンドラインから簡単に使用でき、コードベースの分析や更新を数秒で行うことが
できます。&lt;&#x2F;p&gt;
&lt;p&gt;実際の使用例として示したように、プロジェクトの概要を理解し、READMEの更新を行
う作業も正確かつ迅速に実行してくれました。Claude 3.7 Sonnetモデルの高度な推
論能力をコマンドラインから活用できることで、開発ワークフローが大幅に効率化さ
れる可能性を感じました。&lt;&#x2F;p&gt;
&lt;p&gt;AI駆動型の開発支援ツールはますます進化しており、Claude Codeはその最前線にあ
るツールの1つと言えるでしょう。今後の正式リリースや機能拡張に期待したいと思
います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I tried Claude Code.Claude Code is the latest AI-driven coding assistant developed by Anthropic.It&#x27;s a command-line coding tool that connects to Anthropic&#x27;s servers via API andutilizes the Claude 3.7 Sonnet model to support developers. Therefore,you can receive the same level of advanced AI reasoning support as when using Claude 3.7 Sonnet from a browser.</summary>
        </entry><entry xml:lang="en">
        <title>ウェブデザイン技能検定は必要か？ - 技術変化の時代の資格価値</title>
        <published>2025-03-09T00:00:00+00:00</published>
        <updated>2025-03-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/web-design/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/web-design/</id>
        
            <content type="html">&lt;p&gt;少しだけ通ったVY訓練校では、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sikaku.gr.jp&#x2F;web&#x2F;wc&#x2F;&quot;&gt;Webクリエイター能力認定試験&lt;&#x2F;a&gt;が取得できそうことを言っていました。内容見ると、メモ帳でHTMLを書かすようなアホな試験でした。
何かで有利に働くこともなさそうです。受験者数は多そうですが、一体何を目指しているんでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;気になってWEBデザイン関連の認定資格を調べていたら、「&lt;strong&gt;ウェブデザイン技能検定&lt;&#x2F;strong&gt;」という国家検定があるのに気付きました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;資格試験の現状と基本構造&quot;&gt;資格試験の現状と基本構造&lt;&#x2F;h2&gt;
&lt;p&gt;ウェブデザイン技能検定は、厚生労働省が認定する国家検定制度として2008年に創設されています。
運営は厚生労働大臣指定試験機関である特定非営利活動法人&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.netskill.jp&#x2F;&quot;&gt;インターネットスキル認定普及協会&lt;&#x2F;a&gt;が行っています。
この検定は職業能力開発促進法に基づく技能検定の1つであり、Webデザインにおけ
る実務的な技能を公的に証明するものです。1級から3級までのレベル別に実施さ
れています。&lt;&#x2F;p&gt;
&lt;p&gt;ウェブデザイン技能検定1級では、HTML5、CSS3、JavaScript等のコーディング技術に加え、情報設計、ユーザビリティ、アクセシビリティなどの幅広い知識が問われます。Webサイト全体の設計や企画、ディレクション能力も評価対象です。出題形式は選択問題、記述問題、実技課題があります。&lt;&#x2F;p&gt;
&lt;p&gt;特定非営利活動法人インターネットスキル認定普及協会が公開している&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.webdesign.gr.jp&#x2F;pass&#x2F;&quot;&gt;取得者数&lt;&#x2F;a&gt;を確認すると、過去五年間の受験者数と合格者数は次のとおりです。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;年度&lt;&#x2F;th&gt;&lt;th&gt;受験者数&lt;&#x2F;th&gt;&lt;th&gt;合格者数&lt;&#x2F;th&gt;&lt;th&gt;合格率&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2019年度&lt;&#x2F;td&gt;&lt;td&gt;51人&lt;&#x2F;td&gt;&lt;td&gt;12人&lt;&#x2F;td&gt;&lt;td&gt;23.5%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020年度&lt;&#x2F;td&gt;&lt;td&gt;46人&lt;&#x2F;td&gt;&lt;td&gt;8人&lt;&#x2F;td&gt;&lt;td&gt;17.4%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2021年度&lt;&#x2F;td&gt;&lt;td&gt;51人&lt;&#x2F;td&gt;&lt;td&gt;9人&lt;&#x2F;td&gt;&lt;td&gt;17.6%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2022年度&lt;&#x2F;td&gt;&lt;td&gt;61人&lt;&#x2F;td&gt;&lt;td&gt;3人&lt;&#x2F;td&gt;&lt;td&gt;4.9%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2023年度&lt;&#x2F;td&gt;&lt;td&gt;63人&lt;&#x2F;td&gt;&lt;td&gt;9人&lt;&#x2F;td&gt;&lt;td&gt;14.3%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;1級になるとなかなかの難関です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;技術的乖離_-_古い技術標準&quot;&gt;技術的乖離 - 古い技術標準&lt;&#x2F;h2&gt;
&lt;p&gt;技能検定の内容や対策本などから検定で求められている技術やスキルを確認してみました。&lt;&#x2F;p&gt;
&lt;p&gt;内容を見る限り、最新の技術スタックに追いついておらず、一昔前の技術標準にとどまっているようです。&lt;&#x2F;p&gt;
&lt;p&gt;例えばJavaScriptについては、ES6(ECMAScript 2015)以降の最新機能への対応が限定的であり、
主にES5レベルの機能に基づいていると推測されます。
出題傾向を見る限り、アロー関数、Promise、async&#x2F;await、モジュールシステムなど、現代のJavaScript開発において標準となっている多くの機能が試験範囲外となっているのかなと思います。
公式資料では明確なバージョン指定はありませんが、基本的なDOM操作やコールバックパターンが中心となっており、2015年以降に標準化された現代的な実装手法との間に大きなギャップが生じています。&lt;&#x2F;p&gt;
&lt;p&gt;現在のウェブ開発現場ではReact、Vue、Angularなどのフレームワークが標準的に使用されていますが、技能検定ではこれらモダンフレームワークについては全く扱っていないようです。また、現代のウェブ開発においてnpm、Webpack、Vite等のビルドツール、Gitなどのバージョン管理システム、CIパイプラインなどは標準的な環境では必須ですが、技能検定にはほとんど言及がなく、従来型の静的なファイル編集アプローチに留まっている可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;WEBデザイナーがフロントエンドエンジニアと呼ばれる現状において、モダンフレームワークやモダンなツールチェーンを知らず従来型のJavaScriptとjQueryの知識のみでは就職市場での競争力の足しになりそうな気がしません。コンポーネント指向開発の概念や状態管理といった現代的なアプローチが試験に含まれていないことも、実務との乖離を深めているように思います。
モダンな開発ワークフローへの理解がないまま現場に出てしまっては、実務での大きな壁となりそうです。&lt;&#x2F;p&gt;
&lt;p&gt;イメージ的は2000年代によく見かけたHTML&#x2F;CSS&#x2F;Javascriptが書けてPHP(今どき
PHP)もちょっと書ける「Webデザイナー」でしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;グローバル標準との比較&quot;&gt;グローバル標準との比較&lt;&#x2F;h2&gt;
&lt;p&gt;他の国の同じような認定制度と比較してみました。&lt;&#x2F;p&gt;
&lt;p&gt;米国では、ウェブデザイン技能検定と似たような認定制度は以下のようなものでしょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;W3Schools Certified Web Developer&#x2F;Designer&lt;&#x2F;strong&gt; - HTML, CSS, JavaScriptなど基本的なウェブ技術の知識を証明する国際的なオンライン認定&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;freeCodeCamp Certifications&lt;&#x2F;strong&gt; - 無料だが業界で認知度が高まっているウェブ開発認定プログラム&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CIW (Certified Internet Web Professional)&lt;&#x2F;strong&gt; - ウェブデザインおよび開発に関する体系的な国際認定制度&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;W3SchoolsとCIWは比較的伝統的なウェブ技術に焦点を当てており、ウェブデザイ
ン技能検定と近いかもしれません。freeCodeCampは現代的な技術スタックをカバー
しているようです。&lt;&#x2F;p&gt;
&lt;p&gt;いずれも米国市場ではデザイナーのキャリアとしては、ほとんど評価されず意味がありません。
これらの認定に時間をかけるならAWSやGoogleなどの認定資格のほうが市場価値はあり、
給与へ直接インパクトがあります。&lt;&#x2F;p&gt;
&lt;p&gt;海外の採用市場では、特定のフレームワーク（React、Angular、Vue.js）
の実践的経験や、AWS&#x2F;Google Cloud等のクラウドサービスの知識が重視されます。
国際的な企業の採用基準では、現場で使われているツールや技術への適応能力が最優先される傾
向にあります。
実務から乖離した資格よりも、実務で実践したポートフォリオや有力なプラットフォームの知識が評価されます。&lt;&#x2F;p&gt;
&lt;p&gt;特にAWS&#x2F;Google&#x2F;Azureの認定などは技術の変化に伴い、認定内容自体も常に更新されており、認定も2年程度の有効期間があり、再認定が必要なため、継続的に最新の技術にキャッチアップし学習が必要です。だからこそ、評価されているのでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;ウェブデザイン技能検定は学科と実技合わせると32,000円もの費用が検定に必要です。&lt;&#x2F;p&gt;
&lt;p&gt;検定の難度と、業界で求められるスキルの証明にならなさそうなことを考えると、
取得する価値はあまりなさそうです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">最近気になってWEBデザイン関連の認定資格を調べていたら、「ウェブデザイン技能検定」という国家検定があるのに気付きました。折角なので、深掘りして調べてみました。</summary>
        </entry><entry xml:lang="en">
        <title>エンジニアのためのポートフォリオサイトの構築</title>
        <published>2025-03-08T00:00:00+00:00</published>
        <updated>2025-03-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/portfolio-site-for-engieer/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/portfolio-site-for-engieer/</id>
        
            <content type="html">&lt;p&gt;今更ながら年初からWebデザインを教わるというシーンがありました。
しかし、毎朝タイピング練習で始まり、
「BRタグは非奨励」などとW3Cの仕様を知らないレベルの講師が
レベルの低い授業をやっていました。
100年かけてもWebデザインに行きつきそうにない。吐き気がしました。
割り切って我慢できるレベルを超えていました。&lt;&#x2F;p&gt;
&lt;p&gt;辞めましたが、
まぁ折角なのでWEBデザイナーが作るらしい「ポートフォリオ」なるものを、
3日ほど使ってこれまで深くやってこなかった技術スタックを作ってみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;p&gt;ポートフォリオサイトは自分のスキルや実績を効果的にアピールするための重要な
ツールらしいです。&lt;&#x2F;p&gt;
&lt;p&gt;Illustratorでデザインカンプ描いて、HTML&#x2F;CSSでせっせとコーディング
なんてサイト作っても一体誰が見るんでしょう。
「あぁ、いいデザインだね」とか褒められると
本気で思っているバカがいるのでしょうか？
美的デザインだけで勝負するなんて、よほどの審美眼とセンスがないと無駄です。&lt;&#x2F;p&gt;
&lt;p&gt;この記事では、そんな90年代風なWebサイトでなく、
Node.js上でモダンなWebフレームワークであるNext.js&#x2F;ReactとCSSフレームワークのTailwindCSS、
そしてUIコンポーネントを提供するdaisyUIを組み合わせて
ポートフォリオサイトを構築したのでそれを記録しています。&lt;&#x2F;p&gt;
&lt;p&gt;そして、結局このブログサイトも同じような技術スタック使って
再構築してしまいました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;使用する技術スタック&quot;&gt;使用する技術スタック&lt;&#x2F;h2&gt;
&lt;p&gt;言語は型安全なTypeScriptを使用し、node&#x2F;Reactベースで以下のようなフレームワークを使っています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;&#x2F;strong&gt;: Reactベースのフルスタックフレームワーク&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;TailwindCSS&lt;&#x2F;strong&gt;: ユーティリティファーストのCSSフレームワーク&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;daisyUI&lt;&#x2F;strong&gt;: TailwindCSSのプラグインであるUIコンポーネントライブラリ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;React Three Fiber&lt;&#x2F;strong&gt;: 3DグラフィックスをReactで簡単に使うためのライブラリ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Font Awesome&lt;&#x2F;strong&gt;: グラフィカルなアイコン文字を使うためのライブラリ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Framer Motion&lt;&#x2F;strong&gt;: Framer Motionは、Reactアプリケーションにアニメーションを実装するためのライブラリ&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AWS SDK&lt;&#x2F;strong&gt;: 問い合わせフォームからAWSのAmanzon SESを使ってメールを送信するため&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;プロジェクトセットアップ&quot;&gt;プロジェクトセットアップ&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;プロジェクトを作成&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Next.jsプロジェクトの作成（TypeScript対応）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npx&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; create-next-app@latest my-portfolio --typescript&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Would you like to use ESLint? ... Yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Would you like to use Tailwind CSS? ... Yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Would you like to use&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-evaluation z-backticks z-shell&quot;&gt; `&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;src&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-evaluation z-backticks z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; directory?&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ... Yes（好みに応じて）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Would you like to use App Router? ... Yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Would you like to customize the default import alias&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (@&#x2F;*)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ... Yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;√&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; What import alias would you like configured? ... @&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 作成したプロジェクトディレクトリに移動&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; my-portfolio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# daisyUIのインストール&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install daisyui&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;tailwind.config.jsの設定&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;プロジェクトルートにある&lt;code&gt;tailwind.config.js&lt;&#x2F;code&gt;ファイルを開き、daisyUIをプラグインとして追加します。&lt;&#x2F;p&gt;
&lt;p&gt;ライトとダーク両方のテーマをサポートするようにします。設定によりシステムのダーク／ライトモードの設定に応じて切り替わります。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; @&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;import(&amp;#39;tailwindcss&amp;#39;).Config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-type z-object z-module z-js&quot;&gt;module&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-object z-module z-js&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;.&#x2F;src&#x2F;pages&#x2F;**&#x2F;*.{js,ts,jsx,tsx,mdx}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;.&#x2F;src&#x2F;components&#x2F;**&#x2F;*.{js,ts,jsx,tsx,mdx}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;.&#x2F;src&#x2F;app&#x2F;**&#x2F;*.{js,ts,jsx,tsx,mdx}&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  theme&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    extend&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;      &#x2F;&#x2F; 必要に応じてテーマの拡張を追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  plugins&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;require&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;daisyui&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  daisyui&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    themes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;light&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;dark&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F; 使用するテーマを設定&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;他のライブラリをインストール&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install three @react-three&#x2F;fiber @react-three&#x2F;drei&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install framer-motion&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install @fortawesome&#x2F;fontawesome-svg-core&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            @fortawesome&#x2F;free-solid-svg-icons&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            @fortawesome&#x2F;free-regular-svg-icons&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            @fortawesome&#x2F;free-brands-svg-icons&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;            @fortawesome&#x2F;react-fontawesome&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install aws-amplify @aws-sdk&#x2F;client-ses @aws-sdk&#x2F;client-sts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;turbooackの有効化&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Next.jsの開発サーバーを高速化するために、package.jsonのscriptsセクションを編集してturbopackを有効にします。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;scripts&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;dev&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;next dev --turbopack&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;build&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;next build&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;start&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;next start&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-property-name z-json&quot;&gt;lint&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;next lint&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;プロジェクトの構造&quot;&gt;プロジェクトの構造&lt;&#x2F;h2&gt;
&lt;p&gt;Next.jsのAppRouterを使用した基本的なプロジェクト構造を整えると、次のようなフォルダ構成になるはずです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;my-portfolio&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── app&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── about&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   │   └── page.tsx （自己紹介ページ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── api&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   │   └── contact&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   │       └── route.ts （メール送信）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── contact&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   │   └── page.tsx （お問い合わせページ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── globals.css （グローバルスタイル）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── layout.tsx （ルートレイアウト）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── page.tsx （トップページ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── works&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │       └── page.tsx （作品紹介ページ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── components&#x2F; （共通コンポーネント）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── public&#x2F; （静的ファイル）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── next.config.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── tailwind.config.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── tsconfig.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;AWS_Amplify_へのデプロイ&quot;&gt;AWS Amplify へのデプロイ&lt;&#x2F;h2&gt;
&lt;p&gt;今回はNext.jsアプリケーションのホスティング先としてVercelではなく、AWS Amplifyを選択しました。Amplifyを選んだ理由と、デプロイプロセスについて共有します。&lt;&#x2F;p&gt;
&lt;p&gt;Amplifyを選んだ理由は、次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWSエコシステムとの統合&lt;&#x2F;strong&gt;: Amazon SESなど他のAWSサービスとの連携がシーム
レスで、同じAWSコンソールから管理できる&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;既存のAWS知識の活用&lt;&#x2F;strong&gt;: Amplify自体は今回初見だが一応前職なので管理コンソールなどは慣れており、
Vercelを新たに学ぶ手間が不要だった。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;料金体系&lt;&#x2F;strong&gt;: 今回の内容であれば無料枠で十分&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;デプロイ手順をざっくり並べると次の通りです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;AWS管理コンソールからAmplifyサービスにアクセス&lt;&#x2F;li&gt;
&lt;li&gt;「新しいアプリを作成」→「GitHubからホスティング」を選択&lt;&#x2F;li&gt;
&lt;li&gt;リポジトリと使用するブランチを選択（今回は&lt;code&gt;main&lt;&#x2F;code&gt;ブランチ）&lt;&#x2F;li&gt;
&lt;li&gt;ビルド設定を確認（Next.jsの場合は自動的に検出される）。認証情報などは面
倒なので以下のようにビルドステップに組み込んだ。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;frontend&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  phases&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    preBuild&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 認証情報の書き込み&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # クライアント再度で必要な環境変数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; echo &amp;quot;NEXT_PUBLIC_XXXX_API_URL=https:&#x2F;&#x2F;api.example.com&amp;quot; &amp;gt;&amp;gt;.env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # サーバーサイド限定の環境変数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; echo &amp;quot;AWS_XXXXX_ACCESS_KEY_ID=&amp;quot;hogehogetaratara&amp;quot; &amp;gt;&amp;gt; .env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    build&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    baseDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .next&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    files&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;**&#x2F;*&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  cache&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    paths&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; node_modules&#x2F;**&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;コンポーネント、その他について&quot;&gt;コンポーネント、その他について&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;ヘッダー・コンポーネントについてはdaisyUIのNavbarを使わず、レスポンシブ対応、メニューの開閉に対応している。Navbarを使わない理由はないと思われるが、今回は実装検証のため自身で対応してみた。&lt;&#x2F;li&gt;
&lt;li&gt;Works(作品)コンポーネントについては、トップページと作品ページで共用するため、作品情報をコンポーネントに内包させ引数で表示する作品の数を制御している。&lt;&#x2F;li&gt;
&lt;li&gt;一方でニュースのリストを作成するNewsコンポーネントは、現時点ではTopページしか使っていないが他のページでも使いまわせると考え、ニュース自体はコンポーネントに引数で渡すようにしている。&lt;&#x2F;li&gt;
&lt;li&gt;グラフィカルな要素があまりないので3Dの立方体をトップページに置いている。3DCubeコンポーネントはモデリングする手間が面倒で、立方体をくるくる回しているだけである。&lt;&#x2F;li&gt;
&lt;li&gt;問い合わせフォームは、自身で検証したかったのでAmazon SESを使って実際にフォームをメールで飛ばすところまで作り込んでいる。必要な宛先アドレスや認証情報は、ビルド時に設定して環境変数で受け渡している。認証情報はシークレット情報経由などの方が良いと思われるが、どうもうまくいかなかったので妥協した。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;具体的なソースは、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;yostos-portfolio&quot;&gt;GitHubで公開&lt;&#x2F;a&gt;しています。なお、ポートフォリオサイト自体は運用コスト等の都合で既に公開を終了しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;今回初めてまともにNext.jsを使いました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;今回はインターラクティブな要素もあったのでSEO的には良くないと思われるが、SSR&#x2F;SSGを使わず全てクライアントコンポーネントとした。&lt;&#x2F;li&gt;
&lt;li&gt;ファイルベースのルーティングは直感的で分かりやすいと感じた。&lt;&#x2F;li&gt;
&lt;li&gt;APIルートでバックエンドの開発も同じプロジェクトでできるので、開発を分離することなくスムーズで行うことが出来そうである。フルスタックの開発者である前提ではあるが。&lt;&#x2F;li&gt;
&lt;li&gt;今回はVercelでなく、GitHubと連携させてAWSのAmplifyにデプロイした。思いの外スムーズにデプロイできた。&lt;&#x2F;li&gt;
&lt;li&gt;CMSのようにテンプレートベースでなく、コードベースで部品の再利用、共通化ができるので、プログラマーがサイトを作るには非常にCMS特有のテンプレートのお手前を覚える必要がないので生産性がよい感じである。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;楽しいお遊びでした。&lt;&#x2F;p&gt;
</content>
        <summary type="html">あまり経験してこなかった技術スタックでポートフォリオサイトを作ってみました</summary>
        </entry><entry xml:lang="en">
        <title>ポートタワーの桜</title>
        <published>2025-03-06T00:00:00+00:00</published>
        <updated>2025-03-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/03/kawazu-sakura/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/03/kawazu-sakura/</id>
        
            <content type="html">&lt;p&gt;寒さが厳しいと思いながら千葉ポートパークを散歩していたら、もう桜が咲いていました。カワヅザクラかな。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;03&amp;#x2F;kawazu-sakura&amp;#x2F;b39b30279d.jpg?h=32d03d5985adfe7369bd&quot;
  alt=&quot;桜&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">千葉ポートタワーに散歩に行ったら、もう桜が咲いていました。</summary>
        </entry><entry xml:lang="en">
        <title>How to Configure Tinylytics Analytics for Production Environment Only</title>
        <published>2025-02-25T00:00:00+00:00</published>
        <updated>2025-02-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/houw-to-configure-tinylytics-analytics/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/houw-to-configure-tinylytics-analytics/</id>
        
            <content type="html">&lt;h2 id=&quot;Why_is_this_code_needed?&quot;&gt;Why is this code needed?&lt;&#x2F;h2&gt;
&lt;p&gt;When incorporating tinylytics javascript, accesses during development are also reflected in the statistics, so we added code so that statistics are obtained only in production. There may be a better way to do this, but for now, I&#x27;ll introduce it here because it does what I want to do.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;How_this_code_works&quot;&gt;How this code works&lt;&#x2F;h2&gt;
&lt;p&gt;This code works as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;When the page loads, JavaScript checks the current hostname (domain)&lt;&#x2F;li&gt;
&lt;li&gt;Only if the hostname exactly matches &quot;your.domain.com&quot;, it will add the tinylytics script&lt;&#x2F;li&gt;
&lt;li&gt;For all other domains (such as localhost or staging environments), the script won&#x27;t be added. Only a console message will be displayed&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;Implementation&quot;&gt;Implementation&lt;&#x2F;h2&gt;
&lt;p&gt;Place this code in the &amp;lt;head&amp;gt; section of your HTML and remove the original tinylytics script tag.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;!--&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Check domain and enable analytics only for specific domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  &#x2F;&#x2F; Get current hostname&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  const currentHostname = window.location.hostname;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  &#x2F;&#x2F; Specify production domain&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  const productionDomain = &amp;#39;your.domain.com&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  &#x2F;&#x2F; Only load analytics on production domain&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  if (currentHostname === productionDomain) &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F; Dynamically add tinylytics script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    const analyticScript&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; document&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;createElement&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;script&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    analyticScript&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;src&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;https:&#x2F;&#x2F;tinylytics.app&#x2F;embed&#x2F;Xx-xxxxxxxxxxxxxx.js&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    analyticScript&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;defer&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    document&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;head&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;appendChild&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-variable z-other z-readwrite&quot;&gt;(analyticScript);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;log&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Production environment: Analytics enabled&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; else &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;log&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Development environment: Analytics disabled&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">I have tried to prevent tinylytics stats from being retrieved outside of the production environment.</summary>
        </entry><entry xml:lang="en">
        <title>Movie &quot;Under Ninja” Review: Merits and Demerits of Director Fukuda</title>
        <published>2025-02-25T00:00:00+00:00</published>
        <updated>2025-02-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/movie-under-ninja/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/movie-under-ninja/</id>
        
            <content type="html">&lt;p&gt;昨日映画『アンダーニンジャ』を見てきました。
原作、アニメともに人気だったので、ちょっと期待して見に行きました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;02&amp;#x2F;movie-under-ninja&amp;#x2F;under-ninja.webp?h=dbcc9d0b1e5d09dbb93a&quot;
  alt=&quot;&quot; width=&quot;564&quot; height=&quot;316&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;良かった点&quot;&gt;良かった点&lt;&#x2F;h2&gt;
&lt;p&gt;映画『アイアムアヒーロー』同様、原作からストーリーを絞って映画したことが良い結果になっていました。&lt;&#x2F;p&gt;
&lt;p&gt;原作者の花沢健吾氏の作品は、後半話を広げすぎて「破綻しているのでは？」と感じることもあります。
今回は『アンダーニンジャ』原作の8巻くらいまでの九郎編だけなのでそれほど長くはありませんが、アニメ版を見る限り後半話がよくわからなくなっていました。時系列の入れ替えが分かりにくさに拍車をかけ、初見の視聴者には物語が分かりづらかったと思います、&lt;&#x2F;p&gt;
&lt;p&gt;映画版では九郎編のストーリーをカバーしつつ、無駄な部分については設定を変えたりストーリーに手を入れて脚本でかなり分かりやすくしているので、非常に見やすいと感じました。&lt;&#x2F;p&gt;
&lt;p&gt;漫画原作の映画化と言えばこの人という感じになりつつありますが、山﨑賢人の演じる主人公はまさに原作のイメージ通りです。白石麻衣さん、間宮祥太朗さん、岡山天音さん、宮世琉弥さん、坂口涼太郎さん、木南晴夏さんなどのキャスティグもなかなか絶妙に原作の世界観にハマっていると思います。&lt;&#x2F;p&gt;
&lt;p&gt;アクションもなかなか見どころがありました。&lt;&#x2F;p&gt;
&lt;p&gt;また、原作は花沢健吾氏らしいシュールなギャグや日常シーンが多く含まれます。
アニメ版ではシリアスに振っていたので、全体にどんなテイストの作品がよく分から
なくなっていました。
映画版は福田雄一監督のギャグ多めの演出により一般受けしそうなギャグへと落とし込んであるので、
面白めの仕上がりとなり年代を問わずも楽しめる映画になっていました。（アクションシーンはグロな表現
もあるので注意）&lt;&#x2F;p&gt;
&lt;h2 id=&quot;残念な点&quot;&gt;残念な点&lt;&#x2F;h2&gt;
&lt;p&gt;残念な点は、福田監督らしさが若干勝ってしまっている部分です。&lt;&#x2F;p&gt;
&lt;p&gt;福田監督の作品ということで、ムロツヨシさんと佐藤二朗も出演されていましたが、個人的に気になったのはこの二人です。
この二人のいつもの長回しのギャグシーンは、面白いのだけど見飽きたしこの作品のテイストにはどうだろう？&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;全体としては原作の世界観を壊さず、多めのギャグと見ごたえのあるアクションで、楽しめる作品となっていると思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I saw the movie Under Ninja yesterday.I was looking forward to seeing it because it is based on a popular manga and an animated series.</summary>
        </entry><entry xml:lang="en">
        <title>大阪万博 EXPO 2025の個人情報取扱問題</title>
        <published>2025-02-14T00:00:00+00:00</published>
        <updated>2025-02-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/expo-problem/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/expo-problem/</id>
        
            <content type="html">&lt;p&gt;2025年2月8日の読売新聞で「万博チケット購入で『顔画像や指紋など第三者に提供も』、個人情報規約にSNS上『ヤバすぎる』…協会が修正検討」との記事が配信されて結構騒ぎになっています。&lt;&#x2F;p&gt;
&lt;p&gt;もともとはSNSでちょっと炎上していて、2025年2月5日の
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.shugiintv.go.jp&#x2F;jp&#x2F;index.php?ex=VL&amp;amp;media_type=&amp;amp;deli_id=55503&amp;amp;time=28896.3&quot;&gt;衆議院予算委員会&lt;&#x2F;a&gt;で
れいわ新撰組の大石あきこ議員が個人情報の取られ方が異常であることを指摘し、その用途を確認するも、伊東良孝万博担当相の回答は不明瞭で更に不安になりました。&lt;&#x2F;p&gt;
&lt;p&gt;不安だったので、ソースである「
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.expo2025.or.jp&#x2F;privacy&#x2F;&quot;&gt;EXPO 2025 個人情報保護方針&lt;&#x2F;a&gt;
」を確認してみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;万博がユーザーが取得する個人情報&quot;&gt;万博がユーザーが取得する個人情報&lt;&#x2F;h2&gt;
&lt;p&gt;どんな情報が抜かれるのか、確認してみました。&lt;&#x2F;p&gt;
&lt;p&gt;まずはここでいう「ユーザー」とは、次の方が対象となっています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ウェブサイト及びアプリケーションの利用者&lt;&#x2F;li&gt;
&lt;li&gt;ボランティアスタッフ&lt;&#x2F;li&gt;
&lt;li&gt;スリーランスの演者&lt;&#x2F;li&gt;
&lt;li&gt;ジャーナリスト&lt;&#x2F;li&gt;
&lt;li&gt;博覧会に個人として参加・関与する人&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;利用者とスタッフを同列として扱う雑さにまず驚きます。&lt;&#x2F;p&gt;
&lt;p&gt;それはさておき、万博が取得するとしている個人情報を以下にまとめました。&lt;&#x2F;p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th className=&quot;w-1&#x2F;5&quot;&gt;カテゴリー&lt;&#x2F;th&gt;
      &lt;th className=&quot;w-4&#x2F;5&quot;&gt;具体的な個人情報&lt;&#x2F;th&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;基本情報&lt;&#x2F;td&gt;
      &lt;td&gt;
        氏名、ニックネーム、性別、生年月日、住所（郵便番号、都道府県名、市町村）、電話番号、メールアドレス、
        パスポート番号、国籍または居住国に関する情報
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;支払い情報&lt;&#x2F;td&gt;
      &lt;td&gt;クレジットカード番号等&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;位置情報&lt;&#x2F;td&gt;
      &lt;td&gt;GPS や位置情報&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生体情報&lt;&#x2F;td&gt;
      &lt;td&gt;顔画像、音声、指紋等&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;所属先情報&lt;&#x2F;td&gt;
      &lt;td&gt;企業名、団体名、部署名、役職等&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;医療情報&lt;&#x2F;td&gt;
      &lt;td&gt;障がい者認定の有無等&lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SNS 情報&lt;&#x2F;td&gt;
      &lt;td&gt;
        LINE、X、Facebook、Instagram、Google 等のアカウントやプロフィール、
        パスワード等
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;入力情報&lt;&#x2F;td&gt;
      &lt;td&gt;
        言語設定、メール配信設定、既婚・未婚、子どもの有無、趣味嗜好等のユーザー入力情報
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
    &lt;tr&gt;
      &lt;td&gt;端末情報&lt;&#x2F;td&gt;
      &lt;td&gt;
        端末の種類、OS、端末識別子、IP
        アドレス、ブラウザ種別、リファラー情報、Cookie ID、閲覧履歴等
      &lt;&#x2F;td&gt;
    &lt;&#x2F;tr&gt;
  &lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;p&gt;赤字は特にヤバいものです。
個人情報の中でもここまでの機微情報を扱うというのはほとんど見たことがありません。
個人情報(PII - Personal Identifiable Information)の中でもSPI(Sensitive Personal Information)と呼ばれるものです。&lt;&#x2F;p&gt;
&lt;p&gt;例えば「生体認証」の顔画像です。本人確認に使うとしましょう。
通常、顔画像について特徴点を数値化したテンプレート化という処理が行われます。以下はその例です。&lt;&#x2F;p&gt;
&lt;pre&gt;
  FPT10000001401ba01980159020118016800d601
  015f018600ff01017201d9016502005b004300eb
  02005100dc007001014f001400c40200d8016f00
  2b0200ed0058013b0100aa017d00660101e9005c
  00ee0200980146001a0100d10187013a0100f400
  4d01530200a0010b00ca02011c017d016101013a
  009a00e302005e00f600060100e700bb00630200 20009d008d02
&lt;&#x2F;pre&gt;
&lt;p&gt;この数値したテンプレートをハッシュ値という不可逆の数値に要約します。
上のハッシュ値の例では&lt;code&gt;8a3a0681&lt;&#x2F;code&gt;となります。認証する場合でもサーバー側が持つのはこのハッシュ値だけです。
ここから顔画像の再製はできません。実際の認証の際には例えばスマホで顔画像について上記の処理が行われてハッシュ値だけがサーバーに送られて、サーバー側のハッシュ値と突合して本人かどうか確認されます。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、指紋や顔の生体認証でさえ、顔や指紋画像を収集することはありません。&lt;&#x2F;p&gt;
&lt;p&gt;ところがEXPO2025の個人情報保護方針では「生体情報：指紋、顔など」と記載しています。ヤバさすぎます。&lt;&#x2F;p&gt;
&lt;p&gt;このような情報は保護対策が非常にコストが掛かり、
漏えい時リスクも跳ね上がるのでシステム屋としては可能な限り対象から外します。
どうしても外せない場合はそのリスク査定してContengencyとして開発費の上乗せしますが、
お客への提示前にかなり社内レビューでのハードルが高くなります。
案件のリスクが高すぎて、提案の是非にまで問われるのが普通です。&lt;&#x2F;p&gt;
&lt;p&gt;なので、たかが &lt;strong&gt;万博を物見遊山で見に来る利用者に対して、ここまでSPIを要求するというのは正直「主催者は頭がおかしいのか？」&lt;&#x2F;strong&gt; と疑いたくなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人情報の提供先&quot;&gt;個人情報の提供先&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.expo2025.or.jp&#x2F;privacy&#x2F;&quot;&gt;EXPO 2025 個人情報保護方針&lt;&#x2F;a&gt;
では第三者への提供について次のように定めています。&lt;&#x2F;p&gt;
&lt;p&gt;事前同意が必要なケースとして、次のものです。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.expo2025.or.jp&#x2F;privacy&#x2F;&quot; className=&quot;text-xs&quot;&gt;
  &lt;ol&gt;
    &lt;li&gt;
      当協会が利用目的の達成に必要な範囲内において個人情報の取り扱いの全部又は一部を委託する場合
    &lt;&#x2F;li&gt;
    &lt;li&gt;②合併その他の事由による事業の承継に伴って個人情報が提供される場合&lt;&#x2F;li&gt;
    &lt;li&gt;
      人の生命、身体又は財産の保護のために必要がある場合であって、ユーザー本人の同意を得ることが困難であるとき
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      公衆衛生の向上又は児童の健全な育成の推進のために特に必要がある場合であって、ユーザー本人の同意を得ることが困難であるとき
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      国の機関若しくは地方公共団体又はその委託を受けた者が法令の定める事務を遂行することに対して協力する必要がある場合であって、ユーザー本人の同意を得ることによって当該事務の遂行に支障を及ぼすおそれがある場合
    &lt;&#x2F;li&gt;
    &lt;li&gt;
      当該第三者が学術研究機関等である場合であって、当該第三者が当該個人情報を学術研究目的で取り扱う必要があるとき（当該個人情報を取り扱う目的の一部が学術研究目的である場合を含み、個人の権利利益を不当に侵害するおそれがある場合を除きます。）
    &lt;&#x2F;li&gt;
    &lt;li&gt;その他、個人情報保護法その他の法令で認められる場合&lt;&#x2F;li&gt;
  &lt;&#x2F;ol&gt;
  &lt;cite&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;www.expo2025.or.jp&#x2F;privacy&#x2F;&quot;&gt;EXPO 2025 個人情報保護方針&lt;&#x2F;a&gt;
    より
  &lt;&#x2F;cite&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;ただ、「事前同意」が何か不明で、万博ID作成時の同意がそれに当たるのかよく分かりません。&lt;&#x2F;p&gt;
&lt;p&gt;驚くことに、事前同意なしで提供するケースも記載されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;政府(外国政府や地方地自体も含む)、博覧会国際事務局、協賛企業、パビリオン出展者&lt;&#x2F;li&gt;
&lt;li&gt;SNS事業者、広告関係会社、広告配信業者、データ分析事業者、DMP事業者、媒体社、その他当協会が業務を提携事業者&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これって、&lt;strong&gt;事実上誰にでも個人情報提供する&lt;&#x2F;strong&gt;という宣言以外に、私には読めません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;万博側の主張&quot;&gt;万博側の主張&lt;&#x2F;h2&gt;
&lt;p&gt;2月5日の予算委委員会での経済産業省首席国際博覧会統括調整官 &lt;strong&gt;茂木 正氏&lt;&#x2F;strong&gt;の回答は、次のようなものでした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;万博ID取得に必要な情報は氏名、生年月日、電話番号、メールアドレス、居住国のみである。&lt;&#x2F;li&gt;
&lt;li&gt;会場で勤務する国内外のスタッフや関係者を含めたID登録を想定し包括的に規定したためである。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;アホなのにか？&lt;&#x2F;p&gt;
&lt;p&gt;まず利用者とスタッフなど運営側のユーザーの個人情報取り扱いを包括的に定義するなど信じられません。&lt;&#x2F;p&gt;
&lt;p&gt;「個人情報の保護に関する法律(個人情報保護法)」の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;laws.e-gov.go.jp&#x2F;law&#x2F;415AC0000000057&#x2F;#Mp-Ch_4-Se_2-At_17&quot;&gt;第十七条&lt;&#x2F;a&gt;には、&lt;q&gt;個人情報取扱事業者は、個人情報を取り扱うに当たっては、その利用の目的（以下「利用目的」という。）をできる限り特定しなければならない。&lt;&#x2F;q&gt;と規定されいます。こんなことも知らないでよく国会で答弁する官僚がいたものだと呆れます。&lt;&#x2F;p&gt;
&lt;p&gt;百歩譲って包括的に定義したとして、例えば運営側であっても現代では個人認証の最後の砦である生体情報などを団体が収集する自体狂っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;万博協会は規定の修正を検討しているようですが、ここまでの雑さで意識が低いと心配です。
個人的は、来場のチケット管理のためだけならばメールアドレス、電話番号で十分だろうと思います。&lt;&#x2F;p&gt;
&lt;p&gt;なりすましや転売など防止のために名前や生年月日も必要としているのかもしれませんが、
転売を心配するほど売れてないはずです。
チケットが売れないので、大阪府下の学童も動員しようとしているなどとも聞きます。&lt;&#x2F;p&gt;
&lt;p&gt;規定の修正を見守っていきたいと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">大阪万博 EXPO 2025の個人情報規約が『ヤバすぎる』とSNSでプチ炎上しているようです。</summary>
        </entry><entry xml:lang="en">
        <title>成田山参拝</title>
        <published>2025-02-13T00:00:00+00:00</published>
        <updated>2025-02-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/naritasan/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/naritasan/</id>
        
            <content type="html">&lt;figure&gt;
  &lt;img src=&quot;incense.webp&quot; alt=&quot;貴昇&quot; &#x2F;&gt;
  &lt;figcaption&gt;お線香 貴昇&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;ちょうどお線香が切れていたので、&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.shisenkobo.co.jp&#x2F;&quot;&gt;詩仙香房&lt;&#x2F;a&gt;で癖強めの店主さんに勧められて、「貴昇」という沈香のお線香を購入。口上以上によい香りです。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;eel.webp&quot; alt=&quot;うなぎの蒲焼き&quot; &#x2F;&gt;
  &lt;figcaption&gt;うなぎの蒲焼き&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;折角成田山なのでランチにうなぎをいただいて帰ってきました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">少し遅いですが、初詣でに成田山新勝寺に行ってきました。</summary>
        </entry><entry xml:lang="en">
        <title>Zero-Wat Amp Simplifier MK-II</title>
        <published>2025-02-11T00:00:00+00:00</published>
        <updated>2025-02-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/simplifier-mk2/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/simplifier-mk2/</id>
        
            <content type="html">&lt;p&gt;I had no major complaints about the Strymon Iridium I had been using for a long time,
but I was drawn to the word &quot;analog&quot; and ended up purchasing the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.dsmhumboldt.com&#x2F;simplifier-mk-ii-2&quot;&gt;DSM &amp;amp; Humboldt Simplifier MK-II&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;02&amp;#x2F;simplifier-mk2&amp;#x2F;simlifier-mk2.webp?h=55155ea8199936b32648&quot;
  alt=&quot;Simpilifer MK-II&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;h2 id=&quot;Zero-Watt_Amp&quot;&gt;Zero-Watt Amp&lt;&#x2F;h2&gt;
&lt;p&gt;The Simplifier MK-II is an amp simulator handmade by the Chilean manufacturer DSM &amp;amp; Humboldt, using primarily analog circuits. It is marketed as a &quot;zero-watt amp,&quot; condensing amp functionality into a compact enclosure.&lt;&#x2F;p&gt;
&lt;p&gt;Most amp simulators are divided into an amp section and an IR (impulse response) section.
But the Simplifier MK-II mimics an actual amp by separating &lt;strong&gt;Preamp&lt;&#x2F;strong&gt; and &lt;strong&gt;Power Amp&lt;&#x2F;strong&gt;,
allowing users to switch between &lt;em&gt;Vox&lt;&#x2F;em&gt;, &lt;em&gt;Fender&lt;&#x2F;em&gt;, and &lt;em&gt;Marshall&lt;&#x2F;em&gt; types for each.&lt;&#x2F;p&gt;
&lt;p&gt;A 3-band equalizer adjusts the tone, while the master section controls overall volume, mid-high frequencies, and low frequencies.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, you can select a cabinet type from &lt;em&gt;Combo&lt;&#x2F;em&gt;, &lt;em&gt;Twin&lt;&#x2F;em&gt;, or &lt;em&gt;Stack&lt;&#x2F;em&gt;.
And you can also select fine-tune the speaker characteristics using a dial with settings
for &lt;em&gt;BLACK (Fender)&lt;&#x2F;em&gt;, &lt;em&gt;BLUE (Vox)&lt;&#x2F;em&gt;, and &lt;em&gt;GREEN (Marshall)&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;All of these features are built using analog circuitry.
Additionally, it includes a high-quality digital reverb.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Impressions_of_the_Simplifier_MK-II&quot;&gt;Impressions of the Simplifier MK-II&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve only used it briefly, but here are my initial impressions of the Simplifier MK-II.&lt;&#x2F;p&gt;
&lt;p&gt;Since you can adjust the gain separately on the Preamp and Power Amp, it allows for fine-tuned control over drive sounds. The gain range is also broad, making it possible to create a variety of distortion tones with just this unit.&lt;&#x2F;p&gt;
&lt;p&gt;Personally, I prefer to &lt;em&gt;increase the Power Amp level as much as possible and adjust the distortion with the Preamp as needed&lt;&#x2F;em&gt;.
However, I did notice some noise, so I plan to use a distortion pedal as a booster in front. The response to boosting is amp-like and easy to understand.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, since all controls are analog, it is intuitive and easy to quickly dial in the desired sound.&lt;&#x2F;p&gt;
&lt;p&gt;The unit features a SEND&#x2F;RETURN (effects loop), so I have connected my Strymon El Capistan II, using its delay and reverb instead of the built-in reverb.&lt;&#x2F;p&gt;
&lt;p&gt;Furthermore, the &lt;strong&gt;DI OUTPUT&lt;&#x2F;strong&gt; allows direct XLR connection to my MOTU M2, making it very convenient for recording with Logic Pro.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Drawbacks&quot;&gt;Drawbacks&lt;&#x2F;h2&gt;
&lt;p&gt;I found three drawbacks:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Settings cannot be saved, requiring manual knob adjustments each time (MIDI-based setting changes are also not possible). This is the trade-off of using analog circuitry.&lt;&#x2F;li&gt;
&lt;li&gt;Turning up the gain introduces some noise.&lt;&#x2F;li&gt;
&lt;li&gt;Due to the compact design accommodating multiple interfaces, jacks can interfere with each other when connecting cables. In particular, the reverb adjustment knob is located on the side, making it difficult to use when mounted on a pedalboard.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The Simplifier MK-II is an amp simulator that offers the response and feel of analog operation, which sets it apart from digital simulators. The separation of preamp and power amp allows for precise gain adjustments, making it possible to create highly realistic amp-like tones.&lt;&#x2F;p&gt;
&lt;p&gt;Jack placement requires some thought when integrating it into a board. I will take some time to figure out a good setup. Since I primarily use it at home, this is not a major concern for me, but for live use, the lack of digital control and connectivity might require some creative solutions.&lt;&#x2F;p&gt;
&lt;p&gt;Even so, its simple operation and dynamic analog response make it a strong candidate for the centerpiece of my pedalboard. I will continue using it and provide a more detailed review in the future.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;零ワットアンプ&quot;&gt;零ワットアンプ&lt;&#x2F;h2&gt;
&lt;p&gt;Simplifier MK-IIは、チリのメーカーDSM &amp;amp; Humboldtによって主にアナログ回路を使用して手作りされたアンプシミュレーターです。「零ワットアンプ」として販売されており、アンプの機能をコンパクトな筐体に凝縮しています。&lt;&#x2F;p&gt;
&lt;p&gt;ほとんどのアンプシミュレーターはアンプセクションとIR（インパルスレスポンス）セクションに分かれていますが、
Simplifier MK-IIは実際のアンプを模倣して&lt;strong&gt;プリアンプ&lt;&#x2F;strong&gt;と&lt;strong&gt;パワーアンプ&lt;&#x2F;strong&gt;を分離し、
それぞれで
&lt;em&gt;Vox&lt;&#x2F;em&gt; 、&lt;em&gt;Fender&lt;&#x2F;em&gt;、&lt;em&gt;Marshall&lt;&#x2F;em&gt; タイプを切り替えることができます。&lt;&#x2F;p&gt;
&lt;p&gt;3バンドイコライザーでトーンを調整し、マスターセクションで全体の音量、中高域、低域をコントロールします。&lt;&#x2F;p&gt;
&lt;p&gt;最後に、キャビネットタイプを_Combo_、&lt;em&gt;Twin&lt;&#x2F;em&gt;、または_Stack_から選択し、&lt;em&gt;BLACK(Fender)&lt;&#x2F;em&gt;、&lt;em&gt;BLUE(Vox)&lt;&#x2F;em&gt;、&lt;em&gt;GREEN(Marshall)&lt;&#x2F;em&gt; の設定がある調整ダイヤルでスピーカーの特性を微調整できます。&lt;&#x2F;p&gt;
&lt;p&gt;これらの機能はすべてアナログ回路で構築されています。
さらに、高品質なデジタルリバーブも搭載しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Simplifier_MK-IIの印象&quot;&gt;Simplifier MK-IIの印象&lt;&#x2F;h2&gt;
&lt;p&gt;まだ短時間しか使用していませんが、Simplifier MK-IIの初期印象を紹介します。&lt;&#x2F;p&gt;
&lt;p&gt;プリアンプとパワーアンプでゲインを個別に調整できるため、ドライブサウンドを細かくコントロールできます。ゲインの範囲も広く、この1台だけでさまざまな歪みトーンを作り出せます。&lt;&#x2F;p&gt;
&lt;p&gt;個人的には、パワーアンプのレベルをできるだけ上げて、必要に応じてプリアンプで歪みを調整する方法を好みます。
ただし、ノイズも気になったので、前段にディストーションペダルをブースターとして使用する予定です。
ブーストに対する反応はアンプらしく、理解しやすいです。&lt;&#x2F;p&gt;
&lt;p&gt;また、すべてのコントロールがアナログなので、直感的で望みの音を素早く設定しやすいです。&lt;&#x2F;p&gt;
&lt;p&gt;ユニットにはSEND&#x2F;RETURN（エフェクトループ）があるので、Strymon El Capistan IIを接続し、内蔵リバーブの代わりにそのディレイとリバーブを使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;さらに、&lt;strong&gt;DI OUTPUT&lt;&#x2F;strong&gt;でMOTU M2に直接XLR接続できるため、Logic Proでの録音がとても便利です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;欠点&quot;&gt;欠点&lt;&#x2F;h2&gt;
&lt;p&gt;3つほど欠点があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;設定を保存できないため、毎回手動でノブを調整する必要がある（MIDIによる設定変更も不可能）。これはアナログ回路を使用する際のトレードオフ。&lt;&#x2F;li&gt;
&lt;li&gt;ゲインを上げるとノイズが発生する。&lt;&#x2F;li&gt;
&lt;li&gt;複数のインターフェースを収容するコンパクト設計のため、接続時にジャック同士の干渉が起こりやすい。
特に、リバーブ調整ノブは側面にあるため、ペダルボードに取り付けた場合は使用が困難。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;結論&quot;&gt;結論&lt;&#x2F;h2&gt;
&lt;p&gt;Simplifier MK-IIは、アナログ操作のレスポンスと感触を提供するアンプシミュレーターであり、これがデジタルシミュレーターとの違いです。プリアンプとパワーアンプの分離により、正確なゲイン調整が可能で、非常にリアルなアンプらしいトーンを作り出すことができます。&lt;&#x2F;p&gt;
&lt;p&gt;ジャックの配置は、ボードへ組み込む際に考慮が必要です。
良いセットアップを考える時間をとるつもりです。
私は主に自宅で使用するため、これは大きな問題ではありませんが、ライブでの使用には、デジタル制御と接続性の欠如に対して創造的な解決策が必要かもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;それでも、シンプルな操作とダイナミックなアナログレスポンスにより、私のペダルボードの中心的な存在となる強力な候補です。今後も使用を続け、より詳細なレビューを提供する予定です。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I purchased the Simplifier MK-II from Simplifier Amp which was the best ampsimulator I&#x27;ve ever seen!</summary>
        </entry><entry xml:lang="en">
        <title>The Information Gap on USAID Closure: Relations with Japan&#x27;s National Policy Companies and Concerns Over Information Control</title>
        <published>2025-02-07T00:00:00+00:00</published>
        <updated>2025-02-07T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/the-information-gap-on-usaid/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/the-information-gap-on-usaid/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;02&amp;#x2F;the-information-gap-on-usaid&amp;#x2F;censorship.webp?h=abddbeb82d5cff1a8fc2&quot;
  alt=&quot;&quot; width=&quot;1792&quot; height=&quot;1024&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;The closure of the United States Agency for International Development (USAID) has been scarcely covered by Japanese media. Even when reported, it is often limited to a superficial narrative that &quot;the U.S. is reducing foreign aid.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;On the other hand, statements from figures such as Elon Musk portray USAID as an organization involved in serious corruption. There are even claims that it has engaged in covert operations similar to those conducted by the CIA in the past.&lt;&#x2F;p&gt;
&lt;p&gt;With such contrasting evaluations, where does the truth lie?&lt;&#x2F;p&gt;
&lt;p&gt;A notable aspect of this issue is that NTT Data, a company considered part of Japan&#x27;s national policy framework, was awarded a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20260311031208&#x2F;https:&#x2F;&#x2F;us.nttdata.com&#x2F;en&#x2F;news&#x2F;press-release&#x2F;2019&#x2F;may&#x2F;ntt-data-awarded-$218-million-contract-by-united-states-agency-for-international-development&quot;&gt;218 million dollar contract&lt;&#x2F;a&gt; by USAID. NTT Data is a core company of the NTT Group, in which the Japanese government holds more than one-third of the shares. This contract goes beyond a mere business transaction; it directly relates to Japan&#x27;s national interests.&lt;&#x2F;p&gt;
&lt;p&gt;Despite this, Japanese media have largely ignored the issue. This suggests that the lack of coverage is unlikely to be coincidental but rather an indication of deliberate information control. From the perspective of the public&#x27;s right to know, this information gap represents a severe problem.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h4 id=&quot;USAID閉鎖報道の空白：日本の国策企業との関係と情報管理の疑念&quot;&gt;USAID閉鎖報道の空白：日本の国策企業との関係と情報管理の疑念&lt;&#x2F;h4&gt;
&lt;p&gt;米国国際開発庁（USAID）の閉鎖に関する報道は、日本のメディアではほとんど取り上げられていません。仮に報じられたとしても、「米国が対外援助を削減する」という表面的な内容にとどまっています。&lt;&#x2F;p&gt;
&lt;p&gt;一方で、イーロン・マスク氏の発言などを見ると、USAIDは深刻な不正を行っている組織として描かれています。実際、過去にはCIAのような工作活動を行っていたとの指摘もあります。&lt;&#x2F;p&gt;
&lt;p&gt;このように評価が大きく分かれる中、真実はどこにあるのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;注目すべきは、日本の国策企業とも言えるNTTデータが、USAIDから&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20260311031208&#x2F;https:&#x2F;&#x2F;us.nttdata.com&#x2F;en&#x2F;news&#x2F;press-release&#x2F;2019&#x2F;may&#x2F;ntt-data-awarded-$218-million-contract-by-united-states-agency-for-international-development&quot;&gt;2億1,800万ドルの契約&lt;&#x2F;a&gt;を受注していた点です。NTTデータは、日本政府が株式の三分の一以上を保有する日本電信電話（NTT）グループの中核企業であり、この契約は単なる民間企業の取引を超え、日本の国益に直結する案件と考えられます。&lt;&#x2F;p&gt;
&lt;p&gt;それにもかかわらず、日本のメディアがこの問題をほとんど報じていない現状は、偶然とは考えにくいものです。むしろ、意図的な情報管理が行われている可能性を強く示唆しています。国民の「知る権利」という観点から見ても、この報道の空白は極めて深刻な問題と言えるでしょう。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Chairman Onodera, overly concerned about Chinese AI, reveals a lack of technical understanding and literacy.</summary>
        </entry><entry xml:lang="en">
        <title>Concerns Raised Over Politicians&#x27; Digital Skills</title>
        <published>2025-02-02T00:00:00+00:00</published>
        <updated>2025-02-02T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/02/lack-of-literacy/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/02/lack-of-literacy/</id>
        
            <content type="html">&lt;p&gt;It seems that Itsunori Onodera, the Policy Research Council Chairman, raised an issue in the House of Representatives Budget Committee.
He said, &quot;When I asked DeepSeek whether the Senkaku Islands are Japanese territory, it incorrectly responded that they are China&#x27;s inherent territory.&quot;&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.jimin.jp&#x2F;news&#x2F;information&#x2F;209882.html&quot;&gt;
  小野寺政調会長は「既にアプリをダウンロードしてしまった方に協力をいただいて、
  試しに『尖閣は日本の領土か』と聞いてみたところ、
  ディープシークは『尖閣は中国固有の領土』と事実と違う答えが返ってきた」と述べ、
  チャットGPTは「国際法上日本の領有権は確立し、日本の領土」と回答があったことを紹介しました。
  &lt;footer&gt;
    &lt;cite&gt;
      {&quot; &quot;}
      自民党
      「[中国・ディープシーク&quot;ダウンロードしないで&quot;小野寺政調会長が国会質問で呼び掛け](https:&#x2F;&#x2F;www.jimin.jp&#x2F;news&#x2F;information&#x2F;209882.html)」
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;That&#x27;s completely predictable. Even if you don&#x27;t use DeepSeek, searching on Chinese search engines will give you the same result. His lack of digital literacy is tragic.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Chairman Onodera, overly concerned about Chinese AI, reveals a lack of technical understanding and literacy.</summary>
        </entry><entry xml:lang="en">
        <title>ChromaLensCLI: Command Line Color Accessibility Validation</title>
        <published>2025-01-25T00:00:00+00:00</published>
        <updated>2025-01-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/chromalenscli-command-line-color-accessibility/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/chromalenscli-command-line-color-accessibility/</id>
        
            <content type="html">&lt;p&gt;とりあえず色覚異常の方にも画像が正しく認識できてるか確認するためのツール &lt;code&gt;ChromaLens CLI&lt;&#x2F;code&gt;を作ってみた。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ChromaLens_CLIの使い方&quot;&gt;ChromaLens CLIの使い方&lt;&#x2F;h2&gt;
&lt;p&gt;使い方は、次の通り。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;chromalens&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.jpg output.jpg --type tritanopia&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;これで色覚異常の方が実際どのようにインプットとなる画像が見えているかシミュ
レーションした画像が出力されます。
&lt;code&gt;type&lt;&#x2F;code&gt; オプションの指定は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;protanopia (1型色覚)&lt;&#x2F;li&gt;
&lt;li&gt;deuteranopia (2型色覚)&lt;&#x2F;li&gt;
&lt;li&gt;tritanopia (3型色覚)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;ChromeLens_CLIの環境設定&quot;&gt;ChromeLens CLIの環境設定&lt;&#x2F;h4&gt;
&lt;p&gt;以下は、venvでPythonの仮想環境を作って必要なパッケージをインストールする手順です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;python3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -m venv venv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; venv&#x2F;bin&#x2F;activate.fish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install numpy Pillow&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;以下が実際のコードです。&lt;code&gt;chromalens&lt;&#x2F;code&gt;というファイル名で保管ください。授業中に書いたコードなので、エラー処理などは省いています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env python3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; PIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ColorVisionSimulator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    MATRICES&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;protanopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.567&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.433&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.558&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.442&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.242&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.758&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ]),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;deuteranopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.625&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.375&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.700&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.300&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.300&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.700&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ]),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;tritanopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.950&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.050&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.433&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.567&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;            [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0.000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.475&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.525&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        ])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; simulate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; cvd_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cvd_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; not in&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;MATRICES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            raise&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; ValueError&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Unsupported CVD type. Choose from: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;, &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;MATRICES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;())&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 画像を読み込み&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        img&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;open&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # RGBAの場合はRGBに変換&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;RGBA&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            img&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;convert&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;RGB&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # NumPy配列に変換&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        img_array&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 色変換行列を適用&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        matrix&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-special z-self z-python&quot;&gt; self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;MATRICES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;cvd_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img_array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;shape&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        pixels&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img_array&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;reshape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;dot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;pixels&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; matrix&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;T&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 値を0-255の範囲に収める&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;clip&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;reshape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 画像として保存&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;fromarray&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;converted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;astype&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;uint8&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;RGB&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    parser&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; argparse&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;ArgumentParser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;description&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Color Vision Deficiency Simulator&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    parser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;add_argument&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;input&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; help&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Input image path&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    parser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;add_argument&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;output&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; help&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Output image path&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    parser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;add_argument&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;--type&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;-t&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; choices&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;protanopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;deuteranopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;tritanopia&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;                        required&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;True&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; help&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Type of color vision deficiency&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    args&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; parser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;parse_args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    simulator&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; ColorVisionSimulator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        simulator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;simulate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;input&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;output&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Simulation complete: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;args&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;output&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Error: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-variable z-magic z-python&quot;&gt; __name__&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;__main__&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;    main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">デザイン入門のようなコースをうけていて「色覚異常の方もいるので気をつけましょうね」とか説明されてんだけど、そんな適当な説明じゃなくちゃんとAccessibilityについて説明しろよと思う。だいたい「気をつける」のでなく、世の中にはちゃんとチェックするツールもあるし・・・・</summary>
        </entry><entry xml:lang="en">
        <title>Continuing story of Babel The Second</title>
        <published>2025-01-24T00:00:00+00:00</published>
        <updated>2025-01-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/continuing-story-of-babel-ii/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/continuing-story-of-babel-ii/</id>
        
            <content type="html">&lt;p&gt;すると、11巻完結だと思っていた『バビル2世』が12巻まであるではないです
か。
(以降はネタバレを含みます)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;『バビル2世』11巻までのストーリー&quot;&gt;『バビル2世』11巻までのストーリー&lt;&#x2F;h2&gt;
&lt;p&gt;バビル2世は、彼本人と同様に超能力者であるヨミとの戦いを描いた物語です。&lt;&#x2F;p&gt;
&lt;p&gt;6巻で自身が開発した超能力を増幅する装置を使っている内にすべてのエネルギーを装置に吸い取られ、
ヨミは一度自滅します。&lt;&#x2F;p&gt;
&lt;p&gt;その後宇宙ウィルスにより復活し、より強大な力を手に入れてバビル2世の前に立ちはだかります。
しかし、11巻の最後ではまたバビル2世に破れて自身の亡骸をロケットに乗せて地球
の衛星軌道に乗せて完結したはずでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;『バビル2世』12巻のストーリー&quot;&gt;『バビル2世』12巻のストーリー&lt;&#x2F;h2&gt;
&lt;p&gt;12巻では衛星軌道に打ち上げられたはずのヨミの遺体がばらばらにされ、多数の人に移植され、その後、ヨミが復活します。&lt;&#x2F;p&gt;
&lt;p&gt;そしてバベルの塔を参考にした鉄壁の要塞を北極に建築してバビル2世に立ちはだかるところだったのでしょうが、基地とともに自決して終了します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;衝撃の12巻&quot;&gt;衝撃の12巻&lt;&#x2F;h2&gt;
&lt;p&gt;多分数十年以上バビル2世は11巻で完結していたと思っていたので、続巻が有ったこと自体、衝撃でした。&lt;&#x2F;p&gt;
&lt;p&gt;また、3つのしもべの内怪鳥ロプロスがヨミの放った水爆ミサイルで破壊されて、2つのしもべになってしまったのも衝撃でした。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、物語としては非常に中途半端で、おそらく打ち切りになって途中で強引終わらせたのだろうという印象です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;衛星軌道に打ち上げられたヨミが、実はこそこそ復活しているというシナリオ自体がヨミらしくない&lt;&#x2F;li&gt;
&lt;li&gt;復活するにしても、他人に自分の体を移植してから復活する合理的な理由づけがない&lt;&#x2F;li&gt;
&lt;li&gt;復活したヨミは弱々しく、北極基地以外にこれといって新たな対抗手段を持たず、なぜわざわざ復活したのかが納得できない。&lt;&#x2F;li&gt;
&lt;li&gt;復活が自身の意思でないとしたら、誰が復活させたかが描かれていない&lt;&#x2F;li&gt;
&lt;li&gt;北極基地がバベルの塔並に強力な基地であれば新たな展開があったかもしれないが、間抜けな部下がドアを開けたことによりバビル2世の侵入を許し壊滅するというのはバカすぎる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ちょっと、記憶に封印してこの12巻は無かったことにしよう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2025-02-17_追記&quot;&gt;2025-02-17 追記&lt;&#x2F;h2&gt;
&lt;p&gt;ずっとバビル2世はKindle化されていませんでしたが、2月17日には
Kindleで&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4iVaigR&quot;&gt;全巻&lt;&#x2F;a&gt; 発売されました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">先日実家の漫画を整理した際に小学生の頃に始めて買った漫画の単行本『バビル2世』も処分してしまったのですが、読み返したくなって電子書籍で再購入しました。</summary>
        </entry><entry xml:lang="en">
        <title>From Power to Prison: The Recurring Fate of South Korean Presidents</title>
        <published>2025-01-15T00:00:00+00:00</published>
        <updated>2025-01-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/from-power-to-prison/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/from-power-to-prison/</id>
        
            <content type="html">&lt;p&gt;South Korea has a strong national anti-Japanese consciousness, and although it is a neighboring country, I usually pay no attention to it. However, the fate of not only this incident but also that of successive presidents is so extraordinary that I decided to compile this overview.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Fate_of_South_Korean_Presidents&quot;&gt;The Fate of South Korean Presidents&lt;&#x2F;h2&gt;
&lt;p&gt;I had an impression that South Korean presidents tend to fall from grace after their terms, so I decided to verify this pattern.
Below is a list showing the fate of past South Korean presidents. This is quite unimaginable for a developed nation, making one wonder, &quot;What&#x27;s going on with this country?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;It makes sense, however, when you consider that Korea is known as the &quot;Land of Han&quot; (a cultural concept of deep-seated grievance and resentment).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;List of South Korean Presidents (1948-Present)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Generation&lt;&#x2F;th&gt;&lt;th&gt;Name&lt;&#x2F;th&gt;&lt;th&gt;Term&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1st-3rd&lt;&#x2F;td&gt;&lt;td&gt;Syngman Rhee&lt;&#x2F;td&gt;&lt;td&gt;1948-1960&lt;&#x2F;td&gt;&lt;td&gt;Exiled&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;4th&lt;&#x2F;td&gt;&lt;td&gt;Yun Po-sun&lt;&#x2F;td&gt;&lt;td&gt;1960-1961&lt;&#x2F;td&gt;&lt;td&gt;Arrest&#x2F;Military Rule&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;5th-9th&lt;&#x2F;td&gt;&lt;td&gt;Park Chung-hee&lt;&#x2F;td&gt;&lt;td&gt;1963-1979&lt;&#x2F;td&gt;&lt;td&gt;Assassination&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;10th&lt;&#x2F;td&gt;&lt;td&gt;Choi Kyu-hah&lt;&#x2F;td&gt;&lt;td&gt;1979-1980&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;11th-12th&lt;&#x2F;td&gt;&lt;td&gt;Chun Doo-hwan&lt;&#x2F;td&gt;&lt;td&gt;1980-1987&lt;&#x2F;td&gt;&lt;td&gt;Arrest&#x2F;Military Rule&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;13th&lt;&#x2F;td&gt;&lt;td&gt;Roh Tae-woo&lt;&#x2F;td&gt;&lt;td&gt;1987-1993&lt;&#x2F;td&gt;&lt;td&gt;Arrest&#x2F;Military Rule&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;14th&lt;&#x2F;td&gt;&lt;td&gt;Kim Young-sam&lt;&#x2F;td&gt;&lt;td&gt;1993-1998&lt;&#x2F;td&gt;&lt;td&gt;Family&#x27;s Corruption&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;15th&lt;&#x2F;td&gt;&lt;td&gt;Kim Dae-jung&lt;&#x2F;td&gt;&lt;td&gt;1998-2003&lt;&#x2F;td&gt;&lt;td&gt;Family&#x27;s Corruption&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;16th&lt;&#x2F;td&gt;&lt;td&gt;Roh Moo-hyun&lt;&#x2F;td&gt;&lt;td&gt;2003-2008&lt;&#x2F;td&gt;&lt;td&gt;Suicide&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;17th&lt;&#x2F;td&gt;&lt;td&gt;Lee Myung-bak&lt;&#x2F;td&gt;&lt;td&gt;2008-2013&lt;&#x2F;td&gt;&lt;td&gt;Arrest&#x2F;Military Rule&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;18th&lt;&#x2F;td&gt;&lt;td&gt;Park Geun-hye&lt;&#x2F;td&gt;&lt;td&gt;2013-2017&lt;&#x2F;td&gt;&lt;td&gt;Arrest&#x2F;Military Rule&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19th&lt;&#x2F;td&gt;&lt;td&gt;Moon Jae-in&lt;&#x2F;td&gt;&lt;td&gt;2017-2022&lt;&#x2F;td&gt;&lt;td&gt;Under Investigation for Bribery&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;20th&lt;&#x2F;td&gt;&lt;td&gt;Yoon Suk-yeol&lt;&#x2F;td&gt;&lt;td&gt;2022-&lt;&#x2F;td&gt;&lt;td&gt;Arrest Warrant Issued&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;Factors_Behind_the_Presidential_Tragedy&quot;&gt;Factors Behind the Presidential Tragedy&lt;&#x2F;h2&gt;
&lt;p&gt;I believe there are several structural factors behind this remarkable situation.&lt;&#x2F;p&gt;
&lt;p&gt;First, there is the &lt;strong&gt;immense presidential power&lt;&#x2F;strong&gt;.
The South Korean presidency is often called an &quot;imperial presidency&quot; due to its extensive authority.
This might be a necessary political structure for a country
technically still at war (as they are only in an armistice with North Korea).
This enormous power inevitably generates intense scrutiny and subsequent
accountability.
This concentrated power is combined with the influence of &quot;Sinocentrism&quot;
(traditional hierarchical worldview). It may be creating a chain of retribution
where investigating and arresting former administration officials serves to
legitimize the new regime.&lt;&#x2F;p&gt;
&lt;p&gt;Next is the &lt;strong&gt;complex relationship between politics and prosecution&lt;&#x2F;strong&gt;.
The prosecution holds substantial power and significant political influence. As a result,
investigations into previous administrations tend to occur with each change of government.
This &quot;judicalization of politics&quot; has become a characteristic feature of South Korean politics. Former President Moon Jae-in was reportedly trying to reform this system for his own protection.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, there is the power of &lt;strong&gt;civil society&lt;&#x2F;strong&gt;.
Since democratization in 1987, citizens have maintained a high level of political engagement,
and public scrutiny of corruption and misconduct is extremely intense.
Large-scale demonstrations are not uncommon, and social media has further intensified the monitoring of politicians.
There&#x27;s also a historical aspect: the long history of subordination to China and social inequality under the class system may be fueling these extreme reactions to authority figures.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;While some criticize this situation as indicating the immaturity of South Korean democracy, others view it as embodying the democratic ideal.
This ideal states that &quot;those in power are equally subject to the law.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;This &quot;presidential tragedy&quot; might be reflecting fundamental challenges facing South Korea.
These challenges include the balance between power and responsibility, democracy and the rule of law, and reconciliation with the past while looking toward the future.&lt;&#x2F;p&gt;
</content>
        <summary type="html">It appears that a joint investigation team, including police forces, has begun moving forward with the execution of an arrest warrant for current South Korean President Yoon Suk-yeol.</summary>
        </entry><entry xml:lang="en">
        <title>Historical Trend in New Year&#x27;s Card Volume in Japan</title>
        <published>2025-01-15T00:00:00+00:00</published>
        <updated>2025-01-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/postcards/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/postcards/</id>
        
            <content type="html">&lt;p&gt;2025年度は前年度25%減で民営化以来最低の発行部数だったようです。
更に、元旦の年賀郵便物の配達数は4億9000万通で前年度比34%減だそうです。&lt;&#x2F;p&gt;
&lt;p&gt;日本郵便としてはまとめて配達でき多くの人が送る年賀状なんて稼ぎ時だろうに、やる気はないのか？&lt;&#x2F;p&gt;
&lt;p&gt;信書便事業から民間を占め出して35%もの値上し、稼ぎ時の商品の出荷数を減らして実態としても値上げ分ビジネスを縮小させるなんて、なんて阿呆な経営なんだろう。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2025&amp;#x2F;01&amp;#x2F;postcards&amp;#x2F;postcard.png?h=ce2f854ccc8f6033fedc&quot;
  alt=&quot;年賀状発行枚数の推移&quot; width=&quot;3960&quot; height=&quot;2905&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">今年年賀状で「年賀状仕舞い」の挨拶を結構いただき気になったので、年賀はがきの発行枚数の推移を調べてみました。</summary>
        </entry><entry xml:lang="en">
        <title>How to Merge and Optimize Your PDF Files</title>
        <published>2025-01-10T00:00:00+00:00</published>
        <updated>2025-01-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/how-to-merge-and-optimize-pdf/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/how-to-merge-and-optimize-pdf/</id>
        
            <content type="html">&lt;h2 id=&quot;Bypassing_PDF_Password_Protection&quot;&gt;Bypassing PDF Password Protection&lt;&#x2F;h2&gt;
&lt;p&gt;While the DJI Neo user manual is provided in PDF format, it&#x27;s password-protected, preventing any modifications or merging. Here&#x27;s how to bypass the password protection on a Mac:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Open the PDF in the Preview app&lt;&#x2F;li&gt;
&lt;li&gt;Select &quot;Print&quot; from the File menu (note: not &quot;Export&quot;)&lt;&#x2F;li&gt;
&lt;li&gt;Choose &quot;Save as PDF&quot; and specify the destination&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This process will create a new PDF without password protection.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Merging_PDFs&quot;&gt;Merging PDFs&lt;&#x2F;h2&gt;
&lt;p&gt;While this can be done with &lt;code&gt;Ghostscript&lt;&#x2F;code&gt; (mentioned later), we&#x27;ll use &lt;code&gt;pdftk&lt;&#x2F;code&gt; for its advantages:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Preserves PDF internal structure (table of contents, bookmarks, links, etc.)&lt;&#x2F;li&gt;
&lt;li&gt;Operates at the binary level, preventing quality degradation&lt;&#x2F;li&gt;
&lt;li&gt;(Although not relevant for this case) Offers flexible operations like page rotation and reordering&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here&#x27;s how to merge PDFs:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Install pdftk (on Mac)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install pdftk-java&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Merge PDFs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pdftk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input1.pdf input2.pdf cat output merged.pdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;PDF_Optimization&quot;&gt;PDF Optimization&lt;&#x2F;h2&gt;
&lt;p&gt;After merging, I found that the file size exceeded 40MB, which was too large to upload to MLIT&#x27;s DIPS2.0 (Drone&#x2F;UAS Information Platform System).&lt;&#x2F;p&gt;
&lt;p&gt;To resolve this, I used Ghostscript for optimization:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Install Ghostscript (on Mac)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install ghostscript&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Optimize PDF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;gs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=&#x2F;screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;-dPDFSETTINGS&lt;&#x2F;code&gt; option allows you to adjust the compression level:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#x2F;screen&lt;&#x2F;code&gt;: For screen display (72dpi) - smallest file size&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;ebook&lt;&#x2F;code&gt;: For e-books (150dpi) - balanced compression&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;printer&lt;&#x2F;code&gt;: For printing (300dpi)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;prepress&lt;&#x2F;code&gt;: For high-quality printing (highest quality)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Making_PDF_Searchable&quot;&gt;Making PDF Searchable&lt;&#x2F;h2&gt;
&lt;p&gt;Scanned PDFs aren&#x27;t searchable. Use these Linux&#x2F;Mac commands for OCR instead of expensive software:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install ocrmypdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install tesseract-lang&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# OCR with image optimization&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ocrmypdf&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -l jpn --optimize&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.pdf output.pdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Creating_Table_of_contents&quot;&gt;Creating Table of contents&lt;&#x2F;h2&gt;
&lt;p&gt;Scanned PDFs often lack a table of contents. Instead of buying expensive PDF software, use these Linux&#x2F;Mac commands:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Install pdftk (on Mac)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install pdftk-java&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Extract metadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pdftk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.pdf dump_data_utf8&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; metadata.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Open metadata.txt in your editor and add bookmark locations in this format:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: Chapter 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkBegin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkTitle: Chapter 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkLevel: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BookmarkPageNumber: 10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then apply the metadata to create a PDF with a table of contents:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Apply edited metadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pdftk&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; input.pdf update_info_utf8 metadata.txt output output.pdf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;With these steps, I successfully optimized the PDF and completed the drone registration.&lt;&#x2F;p&gt;
&lt;p&gt;However, it seems rather inefficient to require individual manual submissions for DJI drones, which are widely used. This feels like typical bureaucratic red tape.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, while this may only be relevant for Japanese users, I&#x27;m sharing the prepared DJI Neo manual that meets DIPS2.0 requirements here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;e.pcloud.link&#x2F;publink&#x2F;show?code=XZHwGwZuCQmrRb6SFHGinz8MJe1akHv9dF7&quot;&gt;Download&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">I recently purchased a DJI Neo drone, and in Japan, it&#x27;s mandatory to register your drone with the Ministry of Land, Infrastructure, Transport and Tourism (MLIT). During registration, you need to submit a user manual that includes both handling instructions and specifications. However, the DJI Neo manual only contains references to specifications on DJI&#x27;s website. Therefore, for the registration, I needed to merge the user manual with the specifications from the website.</summary>
        </entry><entry xml:lang="en">
        <title>A Failed Experiment: Using OpenCV to Read Printed Dates from Scanned Photos</title>
        <published>2025-01-06T00:00:00+00:00</published>
        <updated>2025-01-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/a-failed-experiment-using-opencv/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/a-failed-experiment-using-opencv/</id>
        
            <content type="html">&lt;h3 id=&quot;Organizing_Old_Photographs&quot;&gt;Organizing Old Photographs&lt;&#x2F;h3&gt;
&lt;p&gt;I recently purchased a scanner at the end of the year to digitize old photographs. The photographs have dates printed on them, and I&#x27;ve been manually setting these dates in the EXIF information using ExifTool.&lt;&#x2F;p&gt;
&lt;p&gt;I use Hazel to organize image files, and I&#x27;ve already created a tool that updates file creation dates that Hazel can read with the shooting dates from EXIF data. However, since setting EXIF information manually is time-consuming, I explored the possibility of automating this process using OpenCV.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Date_Reading_Tool&quot;&gt;Date Reading Tool&lt;&#x2F;h3&gt;
&lt;p&gt;Below is a script that uses OpenCV to read dates from images and set them using ExifTool.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env python3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; preprocess_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Extract and process the date stamp portion from the image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Load image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Crop the bottom right region&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    x1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.65&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    y1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.75&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cropped&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;y1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt; x1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Split channels&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;split&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cropped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Enhance red channel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    red_emphasis&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subtract&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;r&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;max&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Enhance contrast using CLAHE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    clahe&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;createCLAHE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;clipLimit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; tileGridSize&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    enhanced&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; clahe&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;apply&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;red_emphasis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Strong thresholding&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    _&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; binary&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;threshold&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;enhanced&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;THRESH_BINARY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Remove noise&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    kernel&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;ones&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;((&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;uint8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cleaned&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;morphologyEx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;binary&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;MORPH_OPEN&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; kernel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Detect and filter contours&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    contours&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;findContours&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cleaned&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;RETR_EXTERNAL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;CHAIN_APPROX_SIMPLE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Filter by area&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;zeros_like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cleaned&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    min_area&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    max_area&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 500&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; contour&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; contours&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        area&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;contourArea&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;contour&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; min_area&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; area&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; max_area&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;drawContours&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;contour&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;255&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Resize to 4x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fx&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; fy&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; interpolation&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;INTER_CUBIC&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Save debug images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;dirname&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;debug&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;makedirs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; exist_ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;True&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imwrite&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;cropped_&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cropped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imwrite&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;red_emphasis_&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; red_emphasis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imwrite&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;enhanced_&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; enhanced&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imwrite&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;binary_&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; binary&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imwrite&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;debug_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;result_&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; extract_date_from_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Extract date from image using OCR&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Preprocess image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    processed_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; preprocess_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # OCR configuration for single line text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    custom_configs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;--psm 6 -c tessedit_char_whitelist=&amp;quot;0123456789&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # Uniform text block&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;--psm 7 -c tessedit_char_whitelist=&amp;quot;0123456789&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # Single text line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;--psm 8 -c tessedit_char_whitelist=&amp;quot;0123456789&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # Single word&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;#39;--psm 10 -c tessedit_char_whitelist=&amp;quot;0123456789&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; &amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # Single character&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; custom_configs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # Run OCR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; pytesseract&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;image_to_string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;processed_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strip&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;OCR result (config=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;): [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;]&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # Normalize spaces&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;split&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # Simple pattern matching&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;{2}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;{1,2}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-quantifier z-regexp&quot;&gt;{1,2}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        match&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; re&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;search&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; match&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                year&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;group&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                month&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;group&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                day&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;group&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                # Handle 2000s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                year&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2000&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; year&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; year&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; else&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1900&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; year&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                if&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; month&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; and&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; day&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 31&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;year&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; month&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; day&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            except&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; ValueError&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;                continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; set_exif_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Set EXIF date information using ExifTool&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;No date found in: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    date_str&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strftime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;%Y:%m:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # EXIF tags to set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    exif_tags&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;DateTimeOriginal&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;CreateDate&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;ModifyDate&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    command&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;exiftool&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;-overwrite_original_in_place&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; exif_tags&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;extend&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;date_str&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        subprocess&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;command&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; check&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;True&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; capture_output&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;True&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Date set successfully: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;date_str&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    except&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; subprocess&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;CalledProcessError&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Failed to set EXIF information: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; process_images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Process all images in the specified directory&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    processed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    failed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; filename&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;listdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; filename&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;lower&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;().&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;endswith&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;((&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;.png&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;.jpg&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;.jpeg&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; filename&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;            date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; extract_date_from_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; set_exif_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                processed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;                failed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Processing complete:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Success: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;processed&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;Failed: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;failed&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; len&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;argv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Usage: photodate &amp;lt;image_directory&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;argv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python z-keyword z-operator z-logical z-python&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;isdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Specified path is not a valid directory&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        sys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;    process_images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-variable z-magic z-python&quot;&gt; __name__&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;__main__&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;    main&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;Results&quot;&gt;Results&lt;&#x2F;h3&gt;
&lt;p&gt;I tested the script on 27 scanned photographs.&lt;&#x2F;p&gt;
&lt;p&gt;Out of 27 images, the script only detected dates in 4 images, and among those, only 1 date was correctly recognized.&lt;&#x2F;p&gt;
&lt;p&gt;Well, this isn&#x27;t practical enough to use.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I recently purchased a scanner and was challenged to see if I could capture the shooting date from the images when digitizing old photos that have dates printed on them.</summary>
        </entry><entry xml:lang="en">
        <title>店舗のSNS依存 - 顧客に届かない情報発信</title>
        <published>2025-01-04T00:00:00+00:00</published>
        <updated>2025-01-04T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/sns/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/sns/</id>
        
            <content type="html">&lt;h3 id=&quot;1._なぜ店舗はSNSのみで情報発信するのか&quot;&gt;1. なぜ店舗はSNSのみで情報発信するのか&lt;&#x2F;h3&gt;
&lt;p&gt;店舗がSNSでのみ情報発信することについて、考えられる理由と問題点を分析してみましょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;運営効率&lt;&#x2F;strong&gt; - SNSでの投稿は迅速で簡単。ウェブサイトやその他の通信チャネルの管理と比較すると、よりコスト効率が良い。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ターゲット層の認識の誤り&lt;&#x2F;strong&gt; - お店が主に若い世代をターゲットにしている場合、SNSでの発信で十分だと考えているかも。しかし、これは若い世代でさえも問題のある仮定。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;リソースの制限&lt;&#x2F;strong&gt; - 小規模ビジネスでは、複数の通信チャネルを管理する人員や時間が不足している可能性がある。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;しかし、もっとも大きな理由は店舗スタッフの&lt;strong&gt;ITリテラシーの低さ&lt;&#x2F;strong&gt;が理由でしょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;どこで発信すると、誰に届くか理解していない&lt;&#x2F;li&gt;
&lt;li&gt;WordPressなどのサイト運営する能力がなく、SNSのようにプライベートの延長で他者のプラットフォームに依存した情報発信しかできない&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;以前は多くのSNSがユーザー以外にもオープンでしたが、TwitterやFacebook、Instagramを見ればわかるようにコンテンツ閲覧にはユーザー登録を要求するSNSが多くなってきたため、SNSで発信する情報がSNS外のユーザーに届かないということがより顕著になってきました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._SNSプラットフォーム依存のリスク&quot;&gt;2. SNSプラットフォーム依存のリスク&lt;&#x2F;h3&gt;
&lt;p&gt;店舗情報発信でのSNS利用は非常に手軽ですが、次のようなリスクもあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;高齢者やプライバシーを重視しSNSを利用しない賢者、特定のSNSを利用していない顧客など潜在的な顧客に情報が届かず、ビジネスチャンスを逃している可能性がある。&lt;&#x2F;li&gt;
&lt;li&gt;SNS外で情報が見えないため、検索エンジンの視認性が欠如し、ニーズを持った潜在的な顧客を逃す可能性がある。&lt;&#x2F;li&gt;
&lt;li&gt;SNSでは投稿の表示のアルゴリズムをプラットフォーマーが握っているため、店舗で管理が必須。このため有利に働くことも有れば、必要な顧客層の情報が届かないリスクもある。&lt;&#x2F;li&gt;
&lt;li&gt;プラットフォームのサービス終了、アカウント停止など、店舗の情報発信が不能となるリスクが常にある。&lt;&#x2F;li&gt;
&lt;li&gt;自社サイトを持たないことによりブランディングやビジネスイメージの確立が困難となるリスクがある。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h3&gt;
&lt;p&gt;以前は自社サイトを持ちつつSNSでも情報発信するスタイルが一般的でしたが、昨今はSNSでの情報発信を重視しすぎる店舗が増えたように感じます。&lt;&#x2F;p&gt;
&lt;p&gt;効果的な情報発信戦略としては、以下のようなマルチチャネルアプローチが望ましいでしょう。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本的な情報発信プラットフォーム&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自社ウェブサイト（基本情報、営業時間、アクセス）&lt;&#x2F;li&gt;
&lt;li&gt;店頭での掲示&lt;&#x2F;li&gt;
&lt;li&gt;Googleビジネスプロフィール&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;補完的な情報発信チャネル&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SNS（Instagram、Facebook等）&lt;&#x2F;li&gt;
&lt;li&gt;メールマガジン&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;このように複数のチャネルを組み合わせることで、より幅広い顧客層にリーチでき、プラットフォーム依存のリスクも軽減できます。重要なのは、それぞれのチャネルの特性を理解し、効果的に活用することです。&lt;&#x2F;p&gt;
&lt;p&gt;どうでもいいけど、近くのパン屋の営業時間くらい、SNSに登録しなくてもわかるようにしてほしい。&lt;&#x2F;p&gt;
</content>
        <summary type="html">最近営業日の告知をInstgramやfacebookにしか掲載しないお店があるが、一体どういうつもりなんだろう。Instagramを使っていない客がいるとか想像できないのだろうか？</summary>
        </entry><entry xml:lang="en">
        <title>LogSeq at a Glance: An Overview for Beginners</title>
        <published>2025-01-01T00:00:00+00:00</published>
        <updated>2025-01-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/01/logseq/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/01/logseq/</id>
        
            <content type="html"> &lt;details&gt;
  &lt;summary&gt;Table of Contents&lt;&#x2F;summary&gt;
  &lt;!-- toc --&gt;
  &lt;&#x2F;details&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;LogSeqとは何か、シンプルな説明&quot;&gt;LogSeqとは何か、シンプルな説明&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqは、あなたの考えやアイデア、メモを自由に書き留め、それらをつなぎ合わせることができるデジタルノートアプリです。紙のノートとは違い、書いた内容を後から簡単に整理したり、関連する情報どうしをリンクでつなげたりできます。&lt;&#x2F;p&gt;
&lt;p&gt;特徴的なのは、以下の3つのポイントです。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;箇条書きベースで書ける&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;考えたことを思いつくままメモできる&lt;&#x2F;li&gt;
&lt;li&gt;後から簡単に整理できる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;日付ごとにページが自動で作られる&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;日記のように、その日のことを記録できる&lt;&#x2F;li&gt;
&lt;li&gt;カレンダーのように過去の記録を見返せる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ページ同士をつなげられる&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;関連する情報どうしを簡単にリンクできる&lt;&#x2F;li&gt;
&lt;li&gt;新しい気づきや発見を見つけやすい&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;なぜLogSeqが便利なのか&quot;&gt;なぜLogSeqが便利なのか&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqが便利な理由は、私たちの脳の働き方と合わせた設計にあります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;思考の自然な流れを妨げない&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;思いついたことを、その場でさっと書き留められる&lt;&#x2F;li&gt;
&lt;li&gt;後でどこに書いたか探すことを気にせず、まずメモできる&lt;&#x2F;li&gt;
&lt;li&gt;整理は後からでもできる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;情報同士のつながりを自然に作れる&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;関連する情報を&lt;code&gt;[[リンク]]&lt;&#x2F;code&gt;で簡単につなげられる&lt;&#x2F;li&gt;
&lt;li&gt;一度つないだ情報は、双方向から見つけられる&lt;&#x2F;li&gt;
&lt;li&gt;気づかなかった情報のつながりが自然と見えてくる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;記憶と振り返りをサポート&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;日付ごとのページが自動で作られるので、いつ何を考えたかが残る&lt;&#x2F;li&gt;
&lt;li&gt;過去の記録が自然とタイムライン化される&lt;&#x2F;li&gt;
&lt;li&gt;定期的な振り返りが簡単にできる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;知識が育っていく&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;書いた内容は単なる記録として終わらない&lt;&#x2F;li&gt;
&lt;li&gt;新しい情報を追加するたびに、既存の知識とつながっていく&lt;&#x2F;li&gt;
&lt;li&gt;それによって新しい発見や気づきが生まれる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;つまり、LogSeqは「とりあえずメモ」から始めて、そこから自然と「つながりのある知識」を育てていけるツールなのです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;LogSeqの基本的な使い方&quot;&gt;LogSeqの基本的な使い方&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;最初の画面の見方&quot;&gt;最初の画面の見方&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqを開くと、シンプルな画面が表示されます。画面の構成を理解しましょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;左側のサイドバー&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ジャーナル（日付ごとのページ）へのリンク&lt;&#x2F;li&gt;
&lt;li&gt;お気に入りページの一覧&lt;&#x2F;li&gt;
&lt;li&gt;全てのページ一覧&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;メイン画面&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;現在の日付のページが自動で開&lt;&#x2F;li&gt;
&lt;li&gt;ここに自由に文章を書いていく&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;右側のサイドバー&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;開いているページに関連する情報が表示&lt;&#x2F;li&gt;
&lt;li&gt;リンクされているページの一覧なども表示&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;新しいページの作り方&quot;&gt;新しいページの作り方&lt;&#x2F;h3&gt;
&lt;p&gt;新しいページを作るには2つの方法があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;直接作成する方法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;画面上部の検索バーに新しいページ名を入力&lt;&#x2F;li&gt;
&lt;li&gt;エンターキーを押すと、新しいページが作られる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;リンクから作る方法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;文章の中に&lt;code&gt;[[新しいページ名]]&lt;&#x2F;code&gt;と書く&lt;&#x2F;li&gt;
&lt;li&gt;自動的にリンクが作られ、クリックで新しいページを作られる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;Markdownで記入する&quot;&gt;Markdownで記入する&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqでは、Markdownという書き方を使います。難しく考える必要はありません。
以下のような基本的な書き方を覚えましょう。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;見出しの書き方&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-text&quot;&gt;大見出し&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\31  z-markdown&quot;&gt;# 中見出し&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-heading z-markdown z-heading z-\32  z-markdown&quot;&gt;## 小見出し&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;文字の装飾&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;斜体で書く&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;_&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-bold&quot;&gt;太字で書く&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;~~&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-strikethrough&quot;&gt;打ち消し線&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;~~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;箇条書き&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 箇条書き1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 箇条書き1-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 箇条書き1-2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-begin z-markdown&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; 箇条書き2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;これらの書き方は、実際に使いながら少しずつ覚えていけば大丈夫です。最初は普通の文章を書くところから始めましょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;日々のノート作成の基本&quot;&gt;日々のノート作成の基本&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;箇条書きの書き方&quot;&gt;箇条書きの書き方&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqでは、箇条書きを基本としてノートを作成します。箇条書きには、以下のような特徴があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本の書き方&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;行頭に「-」（ハイフン）と半角スペースを入力&lt;&#x2F;li&gt;
&lt;li&gt;Enterキーを押すと、自動的に次の箇条書きが始まる&lt;&#x2F;li&gt;
&lt;li&gt;Tabキーで階層を下げる（字下げ）&lt;&#x2F;li&gt;
&lt;li&gt;Shift + Tabで階層を上げる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;箇条書きのコツ&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1つの項目は短めに書く&lt;&#x2F;li&gt;
&lt;li&gt;詳しい説明が必要な場合は、階層を下げて書く&lt;&#x2F;li&gt;
&lt;li&gt;関連する内容は、同じ階層にまとめる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;日付ページの使い方&quot;&gt;日付ページの使い方&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqでは、毎日自動的に日付のページ（ジャーナル）が作られます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;日付ページの特徴&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;起動時に自動的に今日の日付のページが開く&lt;&#x2F;li&gt;
&lt;li&gt;左サイドバーの「Journals」から過去の日付を開ける&lt;&#x2F;li&gt;
&lt;li&gt;日付ページには、その日に考えたことや行ったことを自由に書ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;効果的な使い方&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;朝：今日やることを箇条書きで書き出す&lt;&#x2F;li&gt;
&lt;li&gt;日中：気づいたことや考えたことをメモ&lt;&#x2F;li&gt;
&lt;li&gt;夜：その日の振り返りを書く&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;タグの付け方と活用法&quot;&gt;タグの付け方と活用法&lt;&#x2F;h3&gt;
&lt;p&gt;タグは情報の整理と検索を助ける強力なツールです。ページリンクと組み合わせることで、より効果的な知識管理が可能になります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;タグの基本&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;単語の前に「#」（ハッシュ）を付ける&lt;&#x2F;li&gt;
&lt;li&gt;例：#勉強 #アイデア #ToDo&lt;&#x2F;li&gt;
&lt;li&gt;スペースを含む場合は「&lt;code&gt;#[[読書メモ]]&lt;&#x2F;code&gt;」のように[[]]で囲む&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;タグとページリンクの特徴と使い分け&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;タグ（#）の特徴&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;複数のページに共通する「性質」を示すのに適している&lt;&#x2F;li&gt;
&lt;li&gt;一覧表示やフィルタリングが簡単&lt;&#x2F;li&gt;
&lt;li&gt;例：#未完了、#重要、#要復習&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ページリンク([[]])の特徴&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;特定の「主題」についての詳細な記述に適している&lt;&#x2F;li&gt;
&lt;li&gt;概念間の関係性を表現しやすい&lt;&#x2F;li&gt;
&lt;li&gt;例：&lt;code&gt;[[数学]]&lt;&#x2F;code&gt;、&lt;code&gt;[[微分]]&lt;&#x2F;code&gt;、&lt;code&gt;[[Newton]]&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;効果的な併用方法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;主題と性質を組み合わせる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[[微分]]&lt;&#x2F;code&gt; のページに #数学 #要復習を付ける&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;[[読書記録]]&lt;&#x2F;code&gt; のページに #継続中 #インプットを付ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;概念の関係性を示す
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[[微分]]&lt;&#x2F;code&gt;のページで &lt;code&gt;[[極限]]&lt;&#x2F;code&gt; と &lt;code&gt;[[関数]]&lt;&#x2F;code&gt; を参照しつつ、#数学を付ける&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;[[Newton]]&lt;&#x2F;code&gt;のページで &lt;code&gt;[[力学]]&lt;&#x2F;code&gt; を参照しつつ、#物理学者を付ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;このように、タグとページリンクはそれぞれの特徴を活かして使うことで、より効率的な知識管理が可能になります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;知識のつながりを作る&quot;&gt;知識のつながりを作る&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;ページ間のリンクの作り方&quot;&gt;ページ間のリンクの作り方&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqの強力な特徴は、ページ同士をつなげられることです。知識と知識を結びつけることで、新しい気づきが生まれやすくなります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本的なリンクの作り方&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[[ページ名]]&lt;&#x2F;code&gt; と入力する（&lt;code&gt;[[&lt;&#x2F;code&gt;と&lt;code&gt;]]&lt;&#x2F;code&gt;で囲む）&lt;&#x2F;li&gt;
&lt;li&gt;リンク先のページがなければ、自動的に新しいページが作られる&lt;&#x2F;li&gt;
&lt;li&gt;エイリアスをつける場合：&lt;code&gt;[[ページ名]][表示したい文字]&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;例：&lt;code&gt;[[アインシュタイン]][彼]&lt;&#x2F;code&gt;と書くと、「彼」と表示される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;効果的なリンクの付け方&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;重要な概念や用語が出てきたらリンクにする&lt;&#x2F;li&gt;
&lt;li&gt;関連する話題が出てきたら積極的にリンクする&lt;&#x2F;li&gt;
&lt;li&gt;あとで詳しく書きたい内容があればリンクにする&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;バックリンクの概念と確認方法&quot;&gt;バックリンクの概念と確認方法&lt;&#x2F;h3&gt;
&lt;p&gt;バックリンクとは、「どのページからリンクされているか」を示す機能です。自動的に作られる双方向のつながりにより、知識の関係性が見えてきます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;バックリンクの特徴&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自動的に作られる（手動で作る必要はない）&lt;&#x2F;li&gt;
&lt;li&gt;右サイドバーに表示される&lt;&#x2F;li&gt;
&lt;li&gt;リンク元のページの該当部分が引用として表示される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;バックリンクの活用法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;関連する記述を後から発見できる&lt;&#x2F;li&gt;
&lt;li&gt;同じ概念が出てくる文脈を確認できる&lt;&#x2F;li&gt;
&lt;li&gt;知識のunexpectedな関連性に気づける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;関連する情報のつながりを見つける方法&quot;&gt;関連する情報のつながりを見つける方法&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqには、知識のつながりを見つけるための様々な機能があります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;グラフビュー&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ページ間のつながりを視覚的に表示&lt;&#x2F;li&gt;
&lt;li&gt;右上のグラフアイコンをクリック&lt;&#x2F;li&gt;
&lt;li&gt;ノードをクリックすると関連するページに移動&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;検索機能の活用&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;キーワードで関連ページを検索&lt;&#x2F;li&gt;
&lt;li&gt;タグとページリンクを組み合わせて検索&lt;&#x2F;li&gt;
&lt;li&gt;日付範囲を指定して検索&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;知識のつながりを育てる方法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;定期的にバックリンクを確認する&lt;&#x2F;li&gt;
&lt;li&gt;関連しそうなページを積極的にリンクする&lt;&#x2F;li&gt;
&lt;li&gt;グラフビューで全体の構造を確認する&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;このように、LogSeqでは知識同士を様々な方法でつなげることができます。つながりが増えるほど、新しい発見や気づきが生まれやすくなります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;日常的な使い方のおすすめパターン&quot;&gt;日常的な使い方のおすすめパターン&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqを効果的に活用するために、以下のような使い方がおすすめです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1日の基本的な流れ&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;朝：今日やることを箇条書きで書き出す&lt;&#x2F;li&gt;
&lt;li&gt;日中：思いついたことを &lt;code&gt;[[]]&lt;&#x2F;code&gt; でリンクしながらメモ&lt;&#x2F;li&gt;
&lt;li&gt;夜：その日の振り返りと、重要な項目に &lt;code&gt;#タグ&lt;&#x2F;code&gt; をつける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;知識を育てる方法&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;気になる言葉は積極的に &lt;code&gt;[[]]&lt;&#x2F;code&gt; でリンク&lt;&#x2F;li&gt;
&lt;li&gt;関連する過去のメモは右サイドバーのバックリンクで確認&lt;&#x2F;li&gt;
&lt;li&gt;時々グラフビューを開いて知識の関係性を見直す&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;継続的な活用のコツ&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;完璧を目指さず、まずはメモを取ることから始める&lt;&#x2F;li&gt;
&lt;li&gt;少しずつ機能を試して、自分に合う使い方を見つける&lt;&#x2F;li&gt;
&lt;li&gt;定期的に過去のメモを見返して、知識をアップデート&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;困ったときの対処法&quot;&gt;困ったときの対処法&lt;&#x2F;h3&gt;
&lt;p&gt;LogSeqを使っていて困ったときは、以下の方法を試してみましょう。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;書き方を忘れたとき&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Markdownの基本：&lt;code&gt;#&lt;&#x2F;code&gt; で見出し、&lt;code&gt;-&lt;&#x2F;code&gt; で箇条書き&lt;&#x2F;li&gt;
&lt;li&gt;リンクとタグ：&lt;code&gt;[[ページ名]]&lt;&#x2F;code&gt; と &lt;code&gt;#タグ名&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;これらは画面下部のヘルプアイコンでいつでも確認可能&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;情報が見つからないとき&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;検索バーに関連するキーワードを入力&lt;&#x2F;li&gt;
&lt;li&gt;タグで絞り込み検索&lt;&#x2F;li&gt;
&lt;li&gt;グラフビューで関連ページを探す&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;整理が必要と感じたとき&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;関連する情報を新しいページにまとめる&lt;&#x2F;li&gt;
&lt;li&gt;適切なタグをつけて分類する&lt;&#x2F;li&gt;
&lt;li&gt;不要になったメモは、アーカイブとしてタグ付け&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;LogSeqは、使い始めは普通のメモ帳として、慣れてきたら知識を育てるツールとして活用できます。一度にすべての機能を使いこなす必要はありません。自分のペースで、少しずつ使い方を広げていってください。&lt;&#x2F;p&gt;
</content>
        <summary type="html">I created this simple guide to LogSeq to help friends get started with the tool. Written in Japanese, this overview aims to help new users understand LogSeq&#x27;s key features and daily usage patterns from a bird&#x27;s-eye perspective.</summary>
        </entry><entry xml:lang="en">
        <title>鬼滅の刃 映画制作発表！</title>
        <published>2024-12-31T00:00:00+00:00</published>
        <updated>2024-12-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/12/kimetsu-no-yaiba/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/12/kimetsu-no-yaiba/</id>
        
            <content type="html">&lt;p&gt;Hold onto your Nichirin Swords.&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t get too comfortable with the &quot;&lt;strong&gt;Demon Slayer - The Movie: Infinity Castle&lt;&#x2F;strong&gt;&quot; trilogy announcement. The production team is being as mysterious as Muzan about whether this will actually wrap everything up. 🤔&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s do some demon-slaying math here ✍️.
&quot;Infinity Castle&quot; needs to tackle from Chapter 139 all the way to the finale in Chapter 205. If they&#x27;re splitting this into three movies, that&#x27;s about 22 chapters per ilm. Now, remember how &quot;Mugen Train&quot; only covered 13 chapters and was packed tighter than Zenitsu in a thunderstorm? 😅 This has some fans thinking there&#x27;s NO WAY they can wrap it all up in just three films.&lt;&#x2F;p&gt;
&lt;p&gt;Some Japanese fans are getting as anxious as Inosuke before a big fight about this 💭 Perhaps we should all practice Total Concentration Breathing while we wait to see what ufotable has planned... 😉&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;しっかり日輪刀を握りしめて。&lt;&#x2F;p&gt;
&lt;p&gt;「鬼滅の刃 -映画：無限城」三部作の発表に安心しないでください。
制作チームがこれで本当にすべてを締めくくれるかどうかについて、
無惨のように謎めいています🤔。&lt;&#x2F;p&gt;
&lt;p&gt;ここで少し鬼退治の計算をしてみましょう。&lt;&#x2F;p&gt;
&lt;p&gt;✍️「無限城」は第139章から最終章の第205章までをカバーする必要があります。
これを3つの映画に分けると、1作品あたり約22章になります。
「無限列車」がたった13章しかカバーしておらず、
雷の中の善逸よりもぎっしり詰まっていたことを覚えていますか？😅
このことから、一部のファンは3つの映画だけですべてを完結させることは不可能だと考えています。&lt;&#x2F;p&gt;
&lt;p&gt;日本のファンの中には、大きな戦いの前の伊之助のように不安になっている人もいます💭。
おそらく、ufotableが何を計画しているかを見るために待つ間、私たちは全集中の呼吸を練習すべきかもしれませんね😉。&lt;&#x2F;p&gt;
</content>
        <summary type="html">鬼滅の刃の最終章である『無限城』の制作発表がありました。</summary>
        </entry><entry xml:lang="en">
        <title>A Command to Sync EXIF Data with File System Timestamps</title>
        <published>2024-12-30T00:00:00+00:00</published>
        <updated>2024-12-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/12/exif-tool/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/12/exif-tool/</id>
        
            <content type="html">&lt;p&gt;The scanner&#x27;s performance has been impressive - it handled even my old San Francisco business trip photos from 2001 beautifully, producing crisp, clear scans.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Setting_EXIF_Information&quot;&gt;Setting EXIF Information&lt;&#x2F;h2&gt;
&lt;p&gt;Unlike photos taken with a digital camera, scanned images don&#x27;t come with proper EXIF data. To preserve the actual capture dates of these photos, I used exiftool from the command line to set the correct EXIF information:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Example: Setting the original capture date&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;exiftool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;-DateTimeOriginal=2001:04:15 10:00:00&amp;quot; photo.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This command successfully embeds the correct capture date in the photo&#x27;s EXIF data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Photo_Organization&quot;&gt;The Photo Organization&lt;&#x2F;h2&gt;
&lt;p&gt;For managing my photo files, I rely on Hazel, a powerful file organization tool for Mac. Hazel offers some fantastic automation features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Filtering based on file creation and modification dates&lt;&#x2F;li&gt;
&lt;li&gt;Automatic folder organization&lt;&#x2F;li&gt;
&lt;li&gt;Smart file renaming&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, Hazel has one limitation that&#x27;s been bugging me: it can&#x27;t directly read EXIF data. This means that even though I&#x27;ve carefully added the correct capture dates to the EXIF data, I can&#x27;t use this information for Hazel&#x27;s automated organization.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;The_Solution:_adj-photodate_Script&quot;&gt;The Solution: adj-photodate Script&lt;&#x2F;h2&gt;
&lt;p&gt;To bridge this gap, I created a script that syncs EXIF information with the file system timestamps (creation and modification dates). This enables Hazel to organize photos based on their actual capture dates.&lt;&#x2F;p&gt;
&lt;p&gt;The script provides the following features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Syncs &lt;code&gt;DateTimeOriginal&lt;&#x2F;code&gt; from EXIF to file system timestamps&lt;&#x2F;li&gt;
&lt;li&gt;Includes a dry-run mode for previewing changes&lt;&#x2F;li&gt;
&lt;li&gt;Handles batch processing of multiple files&lt;&#x2F;li&gt;
&lt;li&gt;Supports recursive directory processing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;Installation&quot;&gt;Installation&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &quot;adj-photodate&quot; and paste the following script:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;yostos&#x2F;9c301b2831ad3e810cbb4131586687a7&quot;&gt;adj-photodate&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Make it executable:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; +x adj-photodate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Optionally, move it to your path:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; adj-photodate ~&#x2F;bin&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dependencies:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;bash shell&lt;&#x2F;li&gt;
&lt;li&gt;exiftool&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;Usage&quot;&gt;Usage&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Process a single file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;adj-photodate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; photo.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Preview changes with dry-run&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;adj-photodate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -n photo.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Process all JPEG files in a directory recursively&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;adj-photodate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -r ~&#x2F;Pictures&#x2F;Scanned&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To see available options:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;.&#x2F;adj-photodate&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">I recently embarked on a journey to digitize my old photographs. Since mypre-digital photos exist only as physical prints, I decided to invest in aPFU scanner to bring these memories into the digital age.</summary>
        </entry><entry xml:lang="en">
        <title>Vin Antique PPSE Classic - Artisanal Warmth Over Drive</title>
        <published>2024-12-26T00:00:00+00:00</published>
        <updated>2024-12-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/12/ppse-classic/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/12/ppse-classic/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;12&amp;#x2F;ppse-classic&amp;#x2F;r0000634.jpg?h=6babf38637c04812c0de&quot;
  alt=&quot;PPSE Classic and &amp;#x27;79&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;in Antique has previously released an overdrive pedal called PPSE &#x27;79 which received high praise, and this PPSE Classic is considered its sister version. PPSE stands for &quot;Pike Place Smoky Emerald&quot;, named after the color of the sign at Seattle&#x27;s Pike Place Market, and this color is applied to the aluminum CNC-machined pedal enclosure.
As this is the &quot;Classic&quot; version, it&#x27;s painted in a slightly more vivid color than the PPSE &#x27;79, representing &quot;the sign&#x27;s color before it faded&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;The PPSE &#x27;79 features asymmetric clipping that produces a gritty
distortion rich in harmonics.
The PPSE Classic uses symmetric clipping
that&#x27;s closer to the original Tube Screamer, providing a well-defined tone
that&#x27;s great for boosting your amp.&lt;&#x2F;p&gt;
&lt;p&gt;I might connect both in series to switch between them.&lt;&#x2F;p&gt;
&lt;p&gt;Below is a sound sample where I play with the PPSE Classic in the first half and the PPSE &#x27;79 in the second half.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;京都発の小さなエフェクターブランドVin Antiqueから新しいOver Drive &quot;PPSE Classic&quot;が発売されました。小ロットしか出荷されなかったようですが、幸いにも入手できました。&lt;&#x2F;p&gt;
&lt;p&gt;Vin AntiqueはPPSE &#x27;79というOver Driveをリリースしており高い評価を受けていますが、今回のPPSE Classicは姉妹版ということになります。 PPSEは&quot;Pike Place Smoky Emerald&quot;の略でシアトルのパイクプレース・マーケットの看板の色に因んだネーミングだそうで、
アルミ削り出しのエフェクター筐体がその色に塗られています。
今回Classicということで「看板の褪色する前の色」ということでPPSE&#x27;79より若干鮮やかな色で塗装されています。&lt;&#x2F;p&gt;
&lt;p&gt;PPSE&#x27;79が非対称クリッピングで倍音を多く含んだざらっとした歪みなのに対して、PPSE Classicは対称クリッピングで本家のTube Screamerに近く輪郭がしっかりしアンプをブーストするのにいい感じです。&lt;&#x2F;p&gt;
&lt;p&gt;どちらも直列に繋いで使い分けようかな。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Vin Antique, a small effects pedal brand from Kyoto, has released a newoverdrive pedal called &quot;PPSE Classic&quot;. Although it was produced in smallquantities, I was fortunate enough to get my hands on one.</summary>
        </entry><entry xml:lang="en">
        <title>The New Year&#x27;s Card Season Has Arrived</title>
        <published>2024-12-25T00:00:00+00:00</published>
        <updated>2024-12-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/12/new-years-card/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/12/new-years-card/</id>
        
            <content type="html">&lt;p&gt;Years ago, I used to enjoy making woodblock prints and illustrations for
these cards. But the whole process - printing them and writing addresses -
became incredibly tedious, and I&#x27;ve grown to despise this custom over the
past few years. What&#x27;s worse, most of these cards go to distant relatives
whose faces I can barely remember, or work contacts I haven&#x27;t seen in years.&lt;&#x2F;p&gt;
&lt;p&gt;Unable to make a clean break from the tradition, I&#x27;ve been lazily
outsourcing everything to a printing service these past few years - from
printing to mailing. It&#x27;s simple enough: pick a stock illustration and
message, check off names from my saved address book, and I&#x27;m done.&lt;&#x2F;p&gt;
&lt;p&gt;But what&#x27;s the point of all this?&lt;&#x2F;p&gt;
&lt;p&gt;And in this digital age, why are we still relying on physical mail?&lt;&#x2F;p&gt;
&lt;p&gt;I ordered my New Year&#x27;s cards from the printing service again this year.
However, this time I added one crucial line: &quot;As I reach a turning point in
my life, I&#x27;ll be switching to email for New Year&#x27;s greetings from next year
onward.&quot;&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;12&amp;#x2F;new-years-card&amp;#x2F;greetingcard.jpg?h=bc09ea527e16eea23e0f&quot;
  alt=&quot;New Year&amp;#x27;s Card&quot; width=&quot;685&quot; height=&quot;447&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">In Japan, there&#x27;s a tradition where people exchange greeting postcardscalled nengajo, carefully timed to arrive on New Year&#x27;s Day.</summary>
        </entry><entry xml:lang="en">
        <title>Berkeley Mono: A Worthy Successor to MonoLisa in My Terminal</title>
        <published>2024-12-19T00:00:00+00:00</published>
        <updated>2024-12-19T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/12/berkeley-mono/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/12/berkeley-mono/</id>
        
            <content type="html">&lt;p&gt;ずっとMacのターミナルでは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.monolisa.dev&#x2F;&quot;&gt;MonoLisa&lt;&#x2F;a&gt;フォントを利用してきましたが、
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;berkeleygraphics.com&#x2F;typefaces&#x2F;berkeley-mono&#x2F;&quot;&gt;Berkeley Mono&lt;&#x2F;a&gt;フォントに入れ替えました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;MonoLisaフォントの課題&quot;&gt;MonoLisaフォントの課題&lt;&#x2F;h2&gt;
&lt;p&gt;MonoLisaフォントは紛らわしい文字の区別やリガチャのサポートなどコーディングをサポートするためのデザインがなされており読みやすいフォントで愛用していました。一部筆記体のようなデザインも気に入っていました。&lt;&#x2F;p&gt;
&lt;p&gt;ただし、次の2点が課題だと思っていました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;読みやすさを考慮しているのだと思いますが、文字間隔が広すぎて間延びして逆にコードを把握しにくい。&lt;&#x2F;li&gt;
&lt;li&gt;ライセンス費用が割高でWebフォントまで入手しようとすると非常に高額になる。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;また、単純に飽きたということもあります。&lt;&#x2F;p&gt;
&lt;p&gt;Cascadia Next JPのプレビューが出ているので少し使ってみしたが、かなり文字間隔が狭く凝縮した印象です。MonoLisaのように文字間隔が広すぎるより、個人的は好みでした。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Berkeley_Mono_を導入する&quot;&gt;Berkeley Mono を導入する&lt;&#x2F;h2&gt;
&lt;p&gt;Berkeley Monoは少し前に一部で話題になっていましたが、リガチャのサポートがなかったのでその時は見送りました。
ところが最近になって確認するとリガチャをサポートしたようだったので、購入しました。&lt;&#x2F;p&gt;
&lt;p&gt;紹介文には以下のように書かれています。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;berkeleygraphics.com&#x2F;typefaces&#x2F;berkeley-mono&#x2F;&quot;&gt;
  Berkeley Mono is a love letter to the golden era of computing. The era that
  gave rise to a generation of people who celebrated automation and reveled in
  the joy of computing, when transistors replaced cogs, and machine-readable
  typefaces were developed, for when humans and machines truly interfaced on an
  unprecedented scale.
  &lt;footer&gt;
    &lt;cite&gt;
      Berkeley Graphics -{&quot; &quot;}
      &lt;a href=&quot;https:&#x2F;&#x2F;berkeleygraphics.com&#x2F;typefaces&#x2F;berkeley-mono&#x2F;&quot;&gt;
        Berkeley Mono
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;確かにちょっと懐かしい「コンピューター」らしい文字のデザインです。&lt;&#x2F;p&gt;
&lt;p&gt;気に入っている点は、次の3点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ちょうど良い文字間隔&lt;&#x2F;li&gt;
&lt;li&gt;スクエアなデザイン&lt;&#x2F;li&gt;
&lt;li&gt;買い切りでWebフォントまで含んでいる&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に文字間隔や高さが日本語フォントとバランス良いよいに思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;フォント比較&quot;&gt;フォント比較&lt;&#x2F;h2&gt;
&lt;p&gt;以下のスクリーンショットは、適当なプログラムCascadia Next &#x2F; MonoLisa &#x2F; Berkeley Monoを使って表示させた例です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;12&amp;#x2F;berkeley-mono&amp;#x2F;fonts.jpg?h=dc626dd5229814723749&quot;
  alt=&quot;Fonts Comparison&quot; width=&quot;1800&quot; height=&quot;996&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;文字間隔の違いがよくわかると思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ずっとMacのターミナルではMonoLisaフォントを利用してきましたが、Berkeley Monoフォントに入れ替えました。</summary>
        </entry><entry xml:lang="en">
        <title>千葉公園の『パンとエスプレッソと』</title>
        <published>2024-11-28T00:00:00+00:00</published>
        <updated>2024-11-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/bread-espresso-and/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/bread-espresso-and/</id>
        
            <content type="html">&lt;p&gt;千葉公園に
オープンした「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bread-espresso.jp&#x2F;shop&#x2F;chibakouen.html&quot;&gt;パンとエスプレッソと(Bread, Epresso &amp;amp;)&lt;&#x2F;a&gt;」
と言う気取った名前のカフェですが、
いつも行列ができていてなかなか行けませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;以前あった茶室を利用しているので、お庭も楽しめというので
ちょっと期待していたので、
今日は少し早めに行って、ランチをいただいてきました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;11&amp;#x2F;bread-espresso-and&amp;#x2F;be.jpg?h=088f2eb6506ef75177a6&quot;
  alt=&quot;気持ち悪いランチ&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;ランチでは選択肢がなくあずきトーストのセットを注文。
これで&lt;strong&gt;1,600円&lt;&#x2F;strong&gt;は、さすがにコスパが悪すぎます。&lt;&#x2F;p&gt;
&lt;p&gt;トーストの上に乗っているチーズっぽいものはバターです。
あずきトーストの上にこの量のバターなので、マジで吐きそうになりました。
高い上に、まずい。最悪です。&lt;&#x2F;p&gt;
&lt;p&gt;いつも行列ができていたのも、人気もさることながらワンオペでひたすら要領が悪いためでした。&lt;&#x2F;p&gt;
</content>
        <summary type="html">千葉公園が一部リニューアルして同時にオープンした『パンとエスプレッソと』というカフェに行ってきました。</summary>
        </entry><entry xml:lang="en">
        <title>Beer O&#x27;clock Bottle shop</title>
        <published>2024-11-27T00:00:00+00:00</published>
        <updated>2024-11-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/beer-oclock-botton-shop/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/beer-oclock-botton-shop/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;11&amp;#x2F;beer-oclock-botton-shop&amp;#x2F;glass.jpg?h=8443bc9380d9d736261b&quot;
  alt=&quot;トニックウォーター&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Beer O&#x27;clock, the renowned craft beer spot in Chiba, recently relocated. Curious about what became of its former location, I decided to check it out and discovered that it’s still operating as the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.instagram.com&#x2F;beer_oclock_bottle_shop&#x2F;&quot;&gt;Beer O&#x27;clock Bottle Shop&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While chatting with the staff, I noticed a tonic water called &quot;Our Tonic&quot; on the menu. Intrigued, I asked for more details and learned that it&#x27;s produced by a company called CAN-PANY, which also makes an herbal liqueur called MITASOYA&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mitosaya-1&quot;&gt;&lt;a href=&quot;#fn-mitosaya&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; using herbs from Ōtaki Town. Apparently, they&#x27;re based in Kiyosumi Shirakawa...&lt;&#x2F;p&gt;
&lt;p&gt;In the end, after trying the Our Tonic,
I went for a drink made with 107 RHUM AGRICOLE&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mitosaya-2&quot;&gt;&lt;a href=&quot;#fn-mitosaya&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.
It is liqueur from the same MITASOYA line that’s crafted with Chiba-made agricole rum, mixed with Our Tonic.&lt;&#x2F;p&gt;
&lt;p&gt;“What? They make agricole rum in Chiba?” I had to confirm with the distillery.&lt;&#x2F;p&gt;
&lt;p&gt;Wow, what a discovery that was.&lt;&#x2F;p&gt;
&lt;p&gt;On the way home, I ended up ordering rum from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rhumboso.com&#x2F;&quot;&gt;Bōsō Ōikura Distillery&lt;&#x2F;a&gt; online shop.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;千葉で有名なクラフトビールの店Beer O&#x27;clockが移転したので跡地がどうなっているのかなと見に行ってみたら
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.instagram.com&#x2F;beer_oclock_bottle_shop&#x2F;&quot;&gt;Beer O&#x27;clock Botton Shop&lt;&#x2F;a&gt;としてまだ営業していました。&lt;&#x2F;p&gt;
&lt;p&gt;お店の方はお話していて、&quot;Our Tonic&quot;というトニックウォーターがメニューに有ったので、詳しく話を伺うと「MITASOYA&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mitosaya-3&quot;&gt;&lt;a href=&quot;#fn-mitosaya&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;という大多喜町の薬草を使ったリキュールをやっているCAN-PANYという会社がやっていて清住白河に」。&lt;&#x2F;p&gt;
&lt;p&gt;結局Our Toicをいただいた後、この会社のMITASOYAというリキュールから107 RHUM AGRICOLE&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-mitosaya-4&quot;&gt;&lt;a href=&quot;#fn-mitosaya&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;という千葉のラム酒ベースのリキュールをOur Tonicで割ってたものをいただいた。&lt;&#x2F;p&gt;
&lt;p&gt;「え？　千葉でアグリコールのラム酒作ってんの？」となって蔵元を確認。&lt;&#x2F;p&gt;
&lt;p&gt;いやぁ、収穫だったなぁ。&lt;&#x2F;p&gt;
&lt;p&gt;帰りには&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rhumboso.com&#x2F;&quot;&gt;房総大井倉蒸留所&lt;&#x2F;a&gt;のオンラインショップでラム酒をポチってました。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-mitosaya&quot;&gt;
&lt;p&gt;MITASOYA商品ページは現在アクセスできません（販売終了の可能性） &lt;a href=&quot;#fr-mitosaya-1&quot;&gt;↩&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-mitosaya-2&quot;&gt;↩2&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-mitosaya-3&quot;&gt;↩3&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-mitosaya-4&quot;&gt;↩4&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">千葉で有名なクラフトビールの店 Beer O&#x27;clockが移転したと思っていたら、旧店舗跡で別の形態で営業されていました。</summary>
        </entry><entry xml:lang="en">
        <title>The Ultimate Guide to RAW Development: Data-Driven Insights</title>
        <published>2024-11-25T00:00:00+00:00</published>
        <updated>2024-11-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/raw-development-guide/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/raw-development-guide/</id>
        
            <content type="html">&lt;h2 id=&quot;Introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;I’ve been using SILKYPIX to develop RAW images captured with my RICOH GR IIIx. However, I’ve recently started wondering: &lt;em&gt;Is it really worth continuing to use this software?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There are two main reasons for my hesitation:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The processing takes a significant amount of time.&lt;&#x2F;li&gt;
&lt;li&gt;The preview feature is sluggish, and the software frequently freezes after extended use.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;With macOS now supporting RAW files natively, a variety of apps are available for editing these files. To explore my options, I wrote a Python-based image comparison tool and analyzed three images to see how they stack up:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image 1&lt;&#x2F;strong&gt;: A JPEG file developed using the macOS version of SILKYPIX, without any adjustments.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Image 2&lt;&#x2F;strong&gt;: A JPEG file developed using Pixelmator Pro, also without adjustments. Pixelmator Pro takes advantage of macOS&#x27;s native RAW support, ensuring high compatibility and efficient processing of RAW files.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Image 3&lt;&#x2F;strong&gt;: A JPEG image saved directly from the GR IIIx at the time of capture, with the &quot;Negative Film&quot; preset applied via Image Control.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私はRICOH GR IIIxで撮影したRAW画像の現像にSILKYPIXを使用してきました。しかし、最近こう考え始めています：このソフトウェアを使い続ける価値は本当にあるのだろうか？
ためらいの主な理由は2つあります。&lt;&#x2F;p&gt;
&lt;p&gt;処理に相当な時間がかかる。
プレビュー機能が遅く、長時間使用すると頻繁にフリーズする。&lt;&#x2F;p&gt;
&lt;p&gt;macOSが現在RAWファイルをネイティブにサポートするようになり、これらのファイルを編集するための様々なアプリが利用可能です。選択肢を探るために、Pythonベースの画像比較ツールを作成し、3つの画像を分析して比較しました。&lt;&#x2F;p&gt;
&lt;p&gt;画像1：macOS版のSILKYPIXを使用して現像したJPEGファイル（調整なし）。
画像2：Pixelmator Proを使用して現像したJPEGファイル（同じく調整なし）。Pixelmator ProはmacOSのネイティブRAWサポートを活用し、RAWファイルの高い互換性と効率的な処理を確保しています。
画像3：撮影時にGR IIIxから直接保存されたJPEG画像で、イメージコントロールを通じて「ネガティブフィルム」プリセットが適用されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1._Analyzing_the_JPEG_Files_Using_Data&quot;&gt;1. Analyzing the JPEG Files Using Data&lt;&#x2F;h2&gt;
&lt;p&gt;The image I used for comparison was a park scene with autumn leaves illuminated by the setting sun.
Here are the results from my Python program:&lt;&#x2F;p&gt;
&lt;p&gt;比較に使用した画像は、夕日に照らされた秋の紅葉がある公園の風景です。
以下が私のPythonプログラムからの結果です。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;11&amp;#x2F;raw-development-guide&amp;#x2F;comparison-result.webp?h=c20ffddf97ed20b1dafa&quot;
  alt=&quot;Result of Comparison&quot; width=&quot;1500&quot; height=&quot;1000&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; python three-image-comparison.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Image&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Analysis:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Size:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (4000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 6000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Brightness:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 85.267&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Deviation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 72.58&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Saturation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 113.675&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Contrast:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;KB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19070.3955078125&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Image&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Analysis:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Size:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (4000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 6000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Brightness:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 66.147&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Deviation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 73.611&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Saturation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 135.691&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Contrast:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;KB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 29992.3681640625&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Image&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Analysis:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Size:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (4000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 6000,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Brightness:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 93.122&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Deviation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 74.255&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Saturation:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 85.623&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Contrast:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;KB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 13395.0634765625&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Comparison&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Results:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;SSIM&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 1-2:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.68&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;SSIM&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 1-3:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.847&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;SSIM&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; 2-3:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.737&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Histogram&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Correlation 1-2:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.3822719180861183&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Histogram&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Correlation 1-3:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.7985840630919663&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Histogram&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Correlation 2-3:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0.13442670111231494&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;2._Insights_from_the_Image_Comparison&quot;&gt;2. Insights from the Image Comparison&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;2.1._Image_Comparison_Results&quot;&gt;2.1. Image Comparison Results&lt;&#x2F;h3&gt;
&lt;p&gt;The characteristics of each image based on the data are as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SILKYPIX Image&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;Moderate brightness with a calm tone.&lt;&#x2F;li&gt;
&lt;li&gt;Adequate saturation, achieving a balance of vibrancy and naturalness.&lt;&#x2F;li&gt;
&lt;li&gt;Stable brightness, resulting in a uniform finish.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pixelmator Pro Image&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;The darkest output, emphasizing shadows.&lt;&#x2F;li&gt;
&lt;li&gt;The highest saturation, focusing on vibrancy.&lt;&#x2F;li&gt;
&lt;li&gt;Dynamic tonal changes, creating a dramatic impression.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GR IIIx Jpeg Image (Negative Film Style)&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;The brightest output, with a light and soft tone.&lt;&#x2F;li&gt;
&lt;li&gt;The lowest saturation, offering a calm and natural color palette.&lt;&#x2F;li&gt;
&lt;li&gt;Moderate brightness variation, providing smooth and natural gradation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;From the comparison results, the following observations can be made:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Based on &lt;strong&gt;SSIM (Structural Similarity Index)&lt;&#x2F;strong&gt;, SILKYPIX and Pixelmator Pro exhibit significantly different structures, with notable differences in brightness and saturation. The GR IIIx Jpeg is relatively similar to SILKYPIX but with more subdued saturation.&lt;&#x2F;li&gt;
&lt;li&gt;According to the &lt;strong&gt;Histogram Correlation&lt;&#x2F;strong&gt;, SILKYPIX and Pixelmator Pro show distinctly different color distributions. When compared to GR IIIx Jpeg, SILKYPIX has some similarity, while Pixelmator Pro displays significant differences.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ータに基づく各画像の特徴は以下の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SILKYPIX画像
&lt;ul&gt;
&lt;li&gt;穏やかなトーンの適度な明るさ。&lt;&#x2F;li&gt;
&lt;li&gt;適切な彩度で、鮮やかさと自然さのバランスを実現。&lt;&#x2F;li&gt;
&lt;li&gt;安定した明るさにより、均一な仕上がりになっている。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Pixelmator Pro画像
&lt;ul&gt;
&lt;li&gt;最も暗い出力で、影を強調。&lt;&#x2F;li&gt;
&lt;li&gt;最も高い彩度で、鮮やかさに焦点。&lt;&#x2F;li&gt;
&lt;li&gt;ダイナミックな色調の変化により、ドラマチックな印象を作り出す。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;GR IIIx JPEG画像（ネガティブフィルムスタイル）
&lt;ul&gt;
&lt;li&gt;最も明るい出力で、明るく柔らかいトーン。&lt;&#x2F;li&gt;
&lt;li&gt;最も低い彩度で、落ち着いた自然な色調を提供。&lt;&#x2F;li&gt;
&lt;li&gt;適度な明るさのバリエーションにより、滑らかで自然なグラデーションを提供。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;比較結果から、以下の観察が可能です。&lt;&#x2F;p&gt;
&lt;p&gt;SSIM（構造的類似性指標）に基づくと、SILKYPIXとPixelmator Proは明るさと彩
度に顕著な違いがあり、構造が大きく異なります。GR IIIx JPEGはSILKYPIXと比較的
似ていますが、より控えめな彩度となっています。
ヒストグラム相関によると、SILKYPIXとPixelmator Proは明らかに異なる色分布を示しています。GR IIIx JPEGと比較すると、SILKYPIXにはある程度の類似性がありますが、Pixelmator Proは大きな違いを示しています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2.2._Evaluating_RAW_Development_Apps&quot;&gt;2.2. Evaluating RAW Development Apps&lt;&#x2F;h3&gt;
&lt;p&gt;Based on the analysis, here’s my evaluation of each tool:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SILKYPIX&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
SILKYPIX delivers vivid colors and a balanced brightness level, making it ideal for landscapes or scenes where vibrant colors are essential. Its versatility makes it suitable for various scenarios.SILKYPIXは鮮やかな色とバランスの取れた明るさのレベルを提供し、鮮やかな色が重要な風景やシーンに理想的。その多様性により、様々なシナリオに適している。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pixelmator Pro&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
With its darker tones and shadow emphasis, Pixelmator Pro works well for dramatic compositions or print projects. However, additional adjustments might be required for darker areas.より暗いトーンと影の強調により、Pixelmator Proはドラマチックな構図や印刷プロジェクトに適している。ただし、暗い部分には追加の調整が必要な場合がある。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GR IIIx JPEG (Negative Film Preset)&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
The GR IIIx JPEG provides a bright, soft tone with natural colors, making
it great for everyday photography and relaxed scenes.GR IIIx JPEGは明るく柔
らかいトーンと自然な色を提供し、日常の写真や落ち着いたシーンに最適。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;3._Final_Thoughts&quot;&gt;3. Final Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;From this comparison, SILKYPIX proves to be a reliable tool, and the numerical data supports its strengths. Surprisingly, I found myself drawn to the GR IIIx JPEG with the Negative Film preset.&lt;&#x2F;p&gt;
&lt;p&gt;A practical workflow could be to shoot in RAW + JPEG mode, using the JPEGs directly for most situations and turning to SILKYPIX for advanced adjustments when needed.&lt;&#x2F;p&gt;
&lt;p&gt;この比較から、SILKYPIXは信頼性の高いツールであり、数値データがその強みを裏付けています。驚いたことに、ネガティブフィルムプリセットを適用したGR IIIx JPEGに魅力を感じました。
実用的なワークフローとしては、RAW + JPEGモードで撮影し、
ほとんどの状況では直接JPEGを使用し、必要に応じてSILKYPIXを使用して調整することが考えられます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Appendix._Python_Program_for_Image_Analysis&quot;&gt;Appendix. Python Program for Image Analysis&lt;&#x2F;h2&gt;
&lt;p&gt;Here is the Python program I used for this analysis. It’s a quick and simple script, so it includes hard-coded file names for convenience. Feel free to adapt it to your needs.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; PIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; skimage&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; structural_similarity&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ssim&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; compare_three_images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;image1_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; image2_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; image3_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Compare three images and analyze them using various metrics&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Parameters:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    image1_path (str): Path to first image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    image2_path (str): Path to second image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    image3_path (str): Path to third image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    output_path (str): Path to save comparison results (optional)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Returns:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    dict: Comparison metrics&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Load images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image1_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;IMREAD_UNCHANGED&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image2_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;IMREAD_UNCHANGED&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image3_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;IMREAD_UNCHANGED&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; is&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; or&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; is&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; or&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt; is&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        raise&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-exception z-python&quot;&gt; ValueError&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Failed to load one or more images&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Normalize to 8-bit if necessary for visualization&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; normalize_to_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;dtype&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;uint8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;normalize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 255&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;NORM_MINMAX&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; dtype&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;CV_8U&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; normalize_to_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; normalize_to_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; normalize_to_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Convert to grayscale for SSIM&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    gray1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2GRAY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    gray2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2GRAY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    gray3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2GRAY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Calculate SSIM between each pair&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ssim_1_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; ssim&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; gray2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ssim_1_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; ssim&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; gray3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ssim_2_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; ssim&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;gray2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; gray3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Compare histograms between each pair&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; calculate_hist_correlation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt; img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        hist1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;calcHist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;], [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;], [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        hist2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;calcHist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;([&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;], [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;],&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;], [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;compareHist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;hist1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; hist2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;HISTCMP_CORREL&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hist_corr_1_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; calculate_hist_correlation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hist_corr_1_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; calculate_hist_correlation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hist_corr_2_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; calculate_hist_correlation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Visualization&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;figure&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;figsize&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;15&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;231&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imshow&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2RGB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Image 1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;axis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;off&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;232&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imshow&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2RGB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Image 2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;axis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;off&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;233&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imshow&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2RGB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Image 3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;axis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;off&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Histograms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;234&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;hist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;ravel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Histogram - Image 1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;235&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;hist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;ravel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Histogram - Image 2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;subplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;236&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;hist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img3_8bit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;ravel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;Histogram - Image 3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;savefig&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;output_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    plt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;close&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;SSIM 1-2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ssim_1_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;SSIM 1-3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ssim_1_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;SSIM 2-3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ssim_2_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Histogram Correlation 1-2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hist_corr_1_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Histogram Correlation 1-3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hist_corr_1_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Histogram Correlation 2-3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; hist_corr_2_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Size&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Bit Depth 1&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;dtype&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Bit Depth 2&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;dtype&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Bit Depth 3&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;dtype&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; analyze_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Analyze one image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Parameters:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    image_path (str): path to the image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Returns:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    dict: results of analysis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    img&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;imread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    hsv&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;cvtColor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; cv2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;COLOR_BGR2HSV&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Size&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;shape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Mean Brightness&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Standard Deviation&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;std&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Mean Saturation&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;hsv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[:, :,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;Contrast&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;max&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;min&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;img&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;File Size(KB)&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;getsize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1024&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  # KB単位&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; format_results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;results_dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;    Format the results dictionary for better readability&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    formatted&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; value&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; results_dict&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;items&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; isinstance&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;, (&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;float64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;float32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;            formatted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; float&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;round&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        elif&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; isinstance&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; np&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;uint8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;            formatted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        else&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-indexed-name z-python&quot;&gt;            formatted&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; formatted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-variable z-magic z-python&quot;&gt; __name__&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;__main__&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Compare three images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    results&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; compare_three_images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;        &amp;quot;image1.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;image2.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;image3.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;comparison_result.png&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    # Analyze each image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    images&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;image1.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;image2.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;image3.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt; enumerate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;images&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        analysis&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; analyze_image&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;image_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Image &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Analysis:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; value&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; format_results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;analysis&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;items&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;Comparison Results:&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; value&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-control z-flow z-python&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; format_results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;results&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;).&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;items&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-string z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;: &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">RAW現像について、SILKYPIX, Pixelmator Pro, GR IIIx JPEG の比較を行っています。</summary>
        </entry><entry xml:lang="en">
        <title>『プログラミング言語AWK 第2版』</title>
        <published>2024-11-15T00:00:00+00:00</published>
        <updated>2024-11-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/awk/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/awk/</id>
        
            <content type="html">&lt;p&gt;『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;43TVF97&quot;&gt;プログラミング言語AWK 第2版&lt;&#x2F;a&gt;』が出ていました。
35年ぶりの刷新だそうです。&lt;&#x2F;p&gt;
&lt;p&gt;懐かしくて、購入してみました。ほんとに懐かしい。&lt;&#x2F;p&gt;
&lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292059468673?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17829911%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;0706&#x2F;9784814400706_1_3.jpg?_ex=200x200&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292059468673?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17829911%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;プログラミング言語AWK（第2版）&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;Alfred V. Aho&#x2F;Brian W. Kernighan&#x2F;Peter J. Weinberger&#x2F;千住 治郎 オライリー・ジャパン 2024年05月16日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202601292059468673?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17829911%2F%3Frafcid%3Dwsc_b_bs_1051722217600006323%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4814400705&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EAWK%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
</content>
        <summary type="html">35年ぶりの刷新だそうです。つい買ってしまいました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-11-15</title>
        <published>2024-11-15T00:00:00+00:00</published>
        <updated>2024-11-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/weekly-buzz-20241115/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/weekly-buzz-20241115/</id>
        
            <content type="html">&lt;p&gt;今週は次の3つのトピックです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;VMWareデスクトップ製品無償化&lt;&#x2F;li&gt;
&lt;li&gt;Google Cloud Digital Leader認定資格&lt;&#x2F;li&gt;
&lt;li&gt;Fenderストラトキャスターについて&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;VMwareデスクトップ製品無償化&quot;&gt;VMwareデスクトップ製品無償化&lt;&#x2F;h2&gt;
&lt;p&gt;VMwareは2024年11月13日、デスクトップ向け仮想化製品のWorkstation ProとFusion Proの完全無償化を&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blogs.vmware.com&#x2F;cloud-foundation&#x2F;2024&#x2F;11&#x2F;11&#x2F;vmware-fusion-and-workstation-are-now-free-for-all-users&#x2F;&quot;&gt;発表&lt;&#x2F;a&gt;しました。商用利用を含むすべての利用が可能となり、Pro版の全機能が制限なく使えるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;個人的は歓迎ですが、企業には不安が広がっているようです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;BroadcomによるVMWare買収に関するこれまでの懸念&quot;&gt;BroadcomによるVMWare買収に関するこれまでの懸念&lt;&#x2F;h3&gt;
&lt;p&gt;そもそもBroadcomの買収により、ユーザー企業は非常に混乱していました。&lt;&#x2F;p&gt;
&lt;p&gt;買収後、vSphereやvSANなどのエンタープライズ向け製品の価格が最大300%上昇していました。&lt;&#x2F;p&gt;
&lt;p&gt;年間売上高50万ドル未満のパートナーがプログラムから除外され、多くの企業が混乱に直面していました。また、サポート品質の低下や技術者の離職も相次ぎ、代替製品への移行を検討する企業が増加していました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;VMWare無償化の影響&quot;&gt;VMWare無償化の影響&lt;&#x2F;h3&gt;
&lt;p&gt;今回個人開発者や小規模チーム向けのデスクトップ製品（WorkstationとFusion）を無償化する一方で、
データセンターで使用されるエンタープライズ製品の価格は更に引き上げられています。&lt;&#x2F;p&gt;
&lt;p&gt;この対照的な動きは、Broadcomが大規模企業向けビジネスに集中し、中小規模の顧客を切り捨てる戦略を示唆しています。
無償化された製品のサポートはコミュニティベースとなり、企業ユーザーの不安は一層深まっています。&lt;&#x2F;p&gt;
&lt;p&gt;私がAWS在職中もVMWareを使ってCloud移行を検討していたお客様も多く居ましたが、
VMware Cloud on AWSについてはAWS及びそのチャネルパートナーによる直接販売が終
了しライセンスコストも上がったと聞いています。&lt;&#x2F;p&gt;
&lt;p&gt;オンプレミスのVMWareをそのままCloudに移行するというのは以前よく行われていましたが、
全くお勧めしません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Google_Cloud_&#x2F;_Cloud_DIgital_Leader認定資格&quot;&gt;Google Cloud &#x2F; Cloud DIgital Leader認定資格&lt;&#x2F;h2&gt;
&lt;p&gt;Google Cloud2の&quot;Cloud Digital Leader(CDL)&quot; とは、Google Cloudの基礎的な知識、 Google Cloudの概要や各サービスの特徴、基本的な利用方法を理解しているという資格認定です。
Amazon Web Services(AWS)の資格で言うと、&quot;Cloud Practitioner&quot;に当たるものかなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;暇だったので今週受験してきました。AWSの知識があれば、多分この程度で「Compute EngineってAWSのEC2ね」などと大体対応が理解できるので十分かなと思います。&lt;&#x2F;p&gt;
&lt;p&gt;Cloud Digital Leaderは初学者向けなので、次のような人が目指すとよいと思います。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;職種はNon Techだが、クラウドを利用したシステムの開発や運営に何らかの形で関わる方&lt;&#x2F;li&gt;
&lt;li&gt;これから技術職を目指す学生や、他職種から転職を目指す方&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;あくまで初学者レベルなので、業務で扱うことのある技術者であればCloud Digital LeaderはスキップしてAssociate Cloud Engineerを目指したほうがよいと思います。
会社が「とにかく資格、バッチ取ってこいよ」というモードで報償金が出る場合は
別ですが。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Fender_ストラトキャスターについて&quot;&gt;Fender ストラトキャスターについて&lt;&#x2F;h2&gt;
&lt;p&gt;今週はFender 70th Anniversary American Vintage II 1954 Stratocasterを購入し
てテンションが上がっているので、ストラトキャスターについて語ってみたいと思い
ます。&lt;&#x2F;p&gt;
&lt;p&gt;私がギターを始めた頃の1970年代から80年代はハードロックが流行っていて、ギターシーンではレスポールやハムバッカー搭載のギターが主流でした。当時はエリック・クラプトン、ジェフ・ベック、ジミー・ペイジといったギターヒーローたちの影響で、ハイゲインとサスティーンの得やすいレスポールが好まれていました。&lt;&#x2F;p&gt;
&lt;p&gt;80年代後半になると、ストラトキャスターの形状をベースにハムバッカーやロッキングトレモロを搭載した「スーパーストラト」が台頭。しかし、これは伝統的なストラトキャスターとは別もので、Fenderはそれほど注目されていなかったと思います
。&lt;&#x2F;p&gt;
&lt;p&gt;転機は2000年代以降で音楽シーンがグランジやオルタナティブロックへと変化し、ハードロックはもはやオールディーズになりました。それに伴いテクニカルなソロよりもバンドサウンドに溶け込むギターワークが重視されるようになりました。
またエフェクター技術の進化によりシングルコイルの弱点だった出力の低さやサスティーンの短さも克服されました。&lt;&#x2F;p&gt;
&lt;p&gt;こうなるとハムバッカーの音しかでないレスポールよりも、
むしろストラトキャスターの3ピックアップによる多彩な音色が好まれるようになり
ました。
。
現在、ストラトキャスターの人気は過去最高潮に達しています。2020年にはフェンダー社の売上が過去最高を記録し、
特に若い世代や女性プレイヤーの増加が顕著です。
その理由として、クリアで多様なトーン、演奏性の高さ、そして軽量で扱いやすいボディが、現代の多様な音楽表現に適していることが挙げられます。&lt;&#x2F;p&gt;
&lt;p&gt;Custom Shopなど100万円を超える価格でFender自らが「投資」というようなのはどう
かと思いますが、今購入するギターとしては、本質的な魅力を失うことなく進化を続けながら
現代の音楽シーンにおいてその価値を高めているストラトキャスターはお勧めのギ
ターです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">すっかり寒くなり、先週末にGoogle Cloudの資格取得で新橋に行ったときにすっかり風邪を引いてしまいました。今週はVMWare、GCP、ストラトキャスターです。</summary>
        </entry><entry xml:lang="en">
        <title>Goodbye Bartender!</title>
        <published>2024-11-12T00:00:00+00:00</published>
        <updated>2024-11-12T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/goodbye-bartender/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/goodbye-bartender/</id>
        
            <content type="html">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.macbartender.com&#x2F;&quot;&gt;Bartender&lt;&#x2F;a&gt; was menu bar wizard I&#x27;d been geeking out over. Turned out Ben Surtees had sold it to some shadowy outfit called Applause in March 2024. Reddit blew up with users freaking out.
Today, I&#x27;ve now ditched Bartender for Ice,too.&lt;&#x2F;p&gt;
&lt;p&gt;Keep it FOSS, keep it safe, am I right?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.macbartender.com&#x2F;&quot;&gt;バーテンダー&lt;&#x2F;a&gt;はメニューバーの魔術師で、私は熱中していました。ベン・サーティーズが2024年3月にApplauseという正体不明の会社に売却していたことが判明しました。Redditではユーザーたちが大騒ぎしていました。
今日、私もバーテンダーを捨ててIceに乗り換えました。&lt;&#x2F;p&gt;
&lt;p&gt;オープンソースを守れば安全、そうでしょ？&lt;&#x2F;p&gt;
</content>
        <summary type="html">Macのメニュー管理アプリのBartenderが結構まずいことになっていました。</summary>
        </entry><entry xml:lang="en">
        <title>Google Cloud Digital Leader</title>
        <published>2024-11-08T00:00:00+00:00</published>
        <updated>2024-11-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/cloud-digital-leader/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/cloud-digital-leader/</id>
        
            <content type="html">&lt;p&gt;Googleも資格認定管理にCertMerticsを使っていますが、結果はおろか受験履歴ですら受験日になっても表示されず、受験時は受験者承認コードという &quot;yyxxzze12345000&quot;的な意味のない長いコードを会場で手書きさせられました。AWSの認定資格と比べるとなんだかなという感じです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;11&amp;#x2F;cloud-digital-leader&amp;#x2F;badge.png?h=e564e1ce3e4558300a52&quot;
  alt=&quot;Google Cloud Digital Leader Budge&quot; width=&quot;187&quot; height=&quot;187&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Google CloudのCloud Digital Leaderを受験してきました。レベル的にはAWSのCloudPractitioner相当だと思いますので、ほぼ準備せずに受験しても大丈夫でした。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-11-08</title>
        <published>2024-11-08T00:00:00+00:00</published>
        <updated>2024-11-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/weekly-buzz-20241108/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/weekly-buzz-20241108/</id>
        
            <content type="html">&lt;p&gt;今週はトランプが再選され、一時的にリスクの高いセクターの株が上昇し米国株市場
は急騰につながりました。再選でドル高を進行し円安傾向が強まっており、米国株に
投資している人にはポジティブな状況で恩恵があったと思います。
トランプ自身は経済政策として減税や関税強化を謳っており、ドル高の要因となりえ
るので長期的には要注意です。&lt;&#x2F;p&gt;
&lt;p&gt;今週は、次の3つのトピックです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AI投資に見るIT新時代&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Copilot：マルチエージェントLLM化の衝撃&lt;&#x2F;li&gt;
&lt;li&gt;最高品質の宮崎製作所のGeo Product片手鍋&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;AI投資に見るIT新時代&quot;&gt;AI投資に見るIT新時代&lt;&#x2F;h2&gt;
&lt;p&gt;以下の表はBusiness Insiderに掲載されていたハイパースケーラーのAIに関するCAPEX推定の推定&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;企業名&lt;&#x2F;th&gt;&lt;th&gt;2023年&lt;&#x2F;th&gt;&lt;th&gt;2024年&lt;&#x2F;th&gt;&lt;th&gt;2025年&lt;&#x2F;th&gt;&lt;th&gt;2026年&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Amazon&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;$55.2B&lt;&#x2F;td&gt;&lt;td&gt;$75B&lt;&#x2F;td&gt;&lt;td&gt;$96.4B&lt;&#x2F;td&gt;&lt;td&gt;$105.4B&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Google&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;$32.3B&lt;&#x2F;td&gt;&lt;td&gt;$51B&lt;&#x2F;td&gt;&lt;td&gt;$62B&lt;&#x2F;td&gt;&lt;td&gt;$69.9B&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Meta&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;$28.1B&lt;&#x2F;td&gt;&lt;td&gt;$40B&lt;&#x2F;td&gt;&lt;td&gt;$52B&lt;&#x2F;td&gt;&lt;td&gt;$60B&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Microsoft&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;$41.2B&lt;&#x2F;td&gt;&lt;td&gt;$74.1B&lt;&#x2F;td&gt;&lt;td&gt;$89.9B&lt;&#x2F;td&gt;&lt;td&gt;$100.2B&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;4社合計は3365億ドルに達しているのも驚きですが、Amazonが特に1,050億と大台を突
破する投資していることです。&lt;&#x2F;p&gt;
&lt;p&gt;これらの投資の大半はGPUなど「学習プロセス」を司るインフラでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2024&#x2F;09&#x2F;06&#x2F;Weekly-buzz-20240906&quot;&gt;9月6日の記事&lt;&#x2F;a&gt;でNVIDIA
について次のように書きましたが、まだまだ「学習プロセス」の時代は続きそうで
す。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;長期的には「学習プロセス」ではメインプレイヤーであり続けると
思いますが、AI全体で見るとNVIDIAの存在感は相対的に薄れていくでしょう。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;以下は各社のモデルのパラメータ数の比較です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;企業名&lt;&#x2F;th&gt;&lt;th&gt;モデル名&lt;&#x2F;th&gt;&lt;th&gt;パラメータ数&lt;&#x2F;th&gt;&lt;th&gt;備考&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Amazon&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Claude 3.5 Opus&lt;&#x2F;strong&gt; (Anthropic)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;2兆&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;最大200,000トークンのコンテキストウィンドウ。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Microsoft&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;GPT-4o&lt;&#x2F;strong&gt; (OpenAI)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;1.8兆&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;マルチモーダル対応（テキスト、画像、音声）。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Google&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Gemini 1.5&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;最大&lt;strong&gt;1兆&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;最大100万トークンのコンテキストウィンドウ。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Meta&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;LLaMA 3&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;最大&lt;strong&gt;2兆&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;オープンソースで提供される大規模モデル。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;IBM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Granite 3.0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;最大&lt;strong&gt;8億（800M）&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;特に企業向けに特化したモデル。&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;性能がよいと言われているAmazon(Anthropic)とMicrosoft(OpenAI)のパラメータ数は
群を抜いており、その投資額に比例しています。IBMなどWatsonはどうなっている
のでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;一般にハードウェアと違って、ソフトウェアの世界は投資をしたからと言って良いソフトウェアが生まれる
とは限りませんでした。なぜなら、ソフトウェアでの投資は、エンジニアの工数で
す。優秀なエンジニアの100人集めても100倍優秀な開発チームとはならず、感覚的に
は10倍以上の生産性を発揮できないでしょう。多くの場合は、投資すればするほど優
秀でないエンジニアが交じってきて悲惨なデスマーチが始まります。
優秀なエンジニア一人のほうが良い仕事をします。つまり「エンジニアリング」と言
いつつ、ソフトウェアの世界は「アート」だったわけです。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、この生成AIの学習プロセスに関しては今のところ膨大なデータと
Computeリソースを膨大な資金使って投入すればするほど、
性能のよいモデルができ上がるという「工業製品」なりました。&lt;&#x2F;p&gt;
&lt;p&gt;しかも、この工業製品は今後の産業変革の大きなキーになります。
もうこの投資戦争についていけるのは上記の4社とTeslaくらいでしょう。
しかし、続いても3〜5年な気がします。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;GitHub_Copilot：マルチエージェントLLM化の衝撃&quot;&gt;GitHub Copilot：マルチエージェントLLM化の衝撃&lt;&#x2F;h2&gt;
&lt;p&gt;先月末のGitHubのBlogに「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;news-insights&#x2F;product-news&#x2F;bringing-developer-choice-to-copilot&#x2F;&quot;&gt;Bringing developer choice to Copilot with Anthropic’s Claude 3.5 Sonnet, Google’s Gemini 1.5 Pro, and OpenAI’s o1-preview&lt;&#x2F;a&gt;」という記事が掲載されました。&lt;&#x2F;p&gt;
&lt;p&gt;このブログによるとOpenAIだけでなく、Anthropicの「Claude 3.5 Sonnet」、Googleの「Gemini 1.5 Pro」、
などを選択してCopilotで利用できるというものです。&lt;&#x2F;p&gt;
&lt;p&gt;これまでGitHubは、初期にCodexを使用していた以外はCopilotのLLMには
OpenAIのGPTを採用していました。Microsoft陣営としては当然でしたが、ここに来て
対抗するAmazon(Anthropic)やGoogleのLLMもユーザーが選択できるようになるという
ことは、Microsoft陣営だからといって、LLMは必ずしもOpenAIに限定しないという方
針転換にも見えます。&lt;&#x2F;p&gt;
&lt;p&gt;Perplexityのように複数のLLMを切り替える仕組みを
提供するサービスはありますが、上の記事で書いたハイパースケーラー自身が
これをやるというインパクトは大きいかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;現在はClaude&#x2F;GPT&#x2F;Llama&#x2F;Geminiなどが競い合っていますが、おそらく数年間激しい
競争の末に残ったものが総取りということになると考えています。&lt;&#x2F;p&gt;
&lt;p&gt;そう考えると、MicrosoftやAmazonが自社内でLLMを開発するのでなくAIスタートアップと組んでことや、
AmazonがBedrockのような仕組みで複数のLLMを透過的に扱える仕組みを用意している
というのは、このような数年後に備えているとも思えます。&lt;&#x2F;p&gt;
&lt;p&gt;今回のMicrosoft(GitHub)の決断は、ますますこの競争を激化させるのは間違いない
でしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;最高品質の宮崎製作所のGeo_Product_片手鍋&quot;&gt;最高品質の宮崎製作所のGeo Product 片手鍋&lt;&#x2F;h2&gt;
&lt;p&gt;キッチンのリフォームを機に鍋も新調したのですが、
たまたま購入したのが&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;miyazaki-ss.co.jp&#x2F;&quot;&gt;宮崎製作所&lt;&#x2F;a&gt;の「Geo
Product」というブランドの片手鍋でした。&lt;&#x2F;p&gt;
&lt;p&gt;購入後、その品質にほれ込んでしました。16cm、18cm、20cmと3サイズの片手鍋を
揃えてしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;材質、加工精度が素晴らしく、結果として安全性と料理の幅を広げることができま
す。&lt;&#x2F;p&gt;
&lt;p&gt;まず材質ですが、鍋部分はアルミニウムをステンレスでサンドイッチした7層構造に
なっています。ステンレスの安全性は高いのですが重量が重く熱伝導性も悪いので、
取り回し性が悪く加熱にも時間がかかります。Geo Productはステンレスより5倍も
熱電導性の高く軽量なアルミニウムを内部に折り込むことで、重量を抑え加熱しやす
く冷めにくい鍋を実現しています。&lt;&#x2F;p&gt;
&lt;p&gt;また、取っ手、フタも含めてすべてステンレスのため、壊れにくく15年保証が付いて
います。ガスだけでなくIHにも対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;また加工精度が精巧で、鍋とフタが密着するほどの構造になっています。
こうすることで、加熱時に鍋の中の水分が水蒸気となって、鍋とフタの間に
「ウォーターシール」という水の幕を形成してくれます。&lt;&#x2F;p&gt;
&lt;p&gt;この構造により、水蒸気が逃げることなく少量の水でも調理できます。
いわゆる無水調理が可能です。例えば、ゆで卵なら生卵と60mlの水を入れるだけで
す。&lt;&#x2F;p&gt;
&lt;p&gt;アルミニウムの鍋やコーティングしたフライパンなど便利ですが、10年、20年と使っ
て自分の体に何が蓄積しているか考えると多少値が張っても宮崎製作所の作る鍋を
使っていきたいと思います。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;各社の公開情報に基づいてMorgan Stanleyが試算したものです。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">ますます寒くなり、秋を経ずして冬になった印象です。しかし、来週にはまた夏日が予想されています。寒暖差で体調を崩さないように気をつけましょう。今週はAI関連とGeo Productについてです。</summary>
        </entry><entry xml:lang="en">
        <title>S3静的ウェブサイトのインデックス解決をCloudFront Functionsで修正</title>
        <published>2024-11-05T00:00:00+00:00</published>
        <updated>2024-11-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/fixing-s3-cloudfront-index-resolution/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/fixing-s3-cloudfront-index-resolution/</id>
        
            <content type="html">&lt;p&gt;メインブログをCloudflareからAWS S3へと移行した際、
S3のBlock pubic accessをオフ、Static website hostingをオンにしていたので、
CloudFrontがS3のREST APIエンドポイントを使用するよう修正しました。&lt;&#x2F;p&gt;
&lt;p&gt;この場合CloudFrontはサブディレクトリのindex.htmlファイルを自動的に解決できないので、以下のURLのパスを適切に変換するCloudFront Functionsを追加しました。&lt;&#x2F;p&gt;
&lt;p&gt;ありがちな事ですね。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;function&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; handler&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; request&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; URIが&#x2F;で終わる場合、index.htmlを追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;endsWith&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;index.html&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &#x2F;&#x2F; 拡張子がない場合もindex.htmlを追加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  else if&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;includes&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;.&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;))&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;uri&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;&#x2F;index.html&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; request&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">CloudFlareからブログを移行した際に、パスの指定で問題がでていたので修正しました。</summary>
        </entry><entry xml:lang="en">
        <title>Intel、大丈夫か？</title>
        <published>2024-11-01T00:00:00+00:00</published>
        <updated>2024-11-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/intel/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/intel/</id>
        
            <content type="html">&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www3.nhk.or.jp&#x2F;news&#x2F;html&#x2F;20241101&#x2F;k10014625881000.html&quot;&gt;
  売り上げは前の年の同じ時期より6％減少して132億8400万ドル、日本円でおよそ2
  兆100億円、最終的な損益は166億3900万ドルの赤字、日本円でおよそ2兆5200億円
  の赤字でした。最終赤字となるのは3四半期連続です。
  &lt;cite&gt;
    &lt;a href=&quot;https:&#x2F;&#x2F;www3.nhk.or.jp&#x2F;news&#x2F;html&#x2F;20241101&#x2F;k10014625881000.html&quot;&gt;
      米 インテル 約2兆5000億円の最終赤字 半導体めぐる競争で | NHK
    &lt;&#x2F;a&gt;
  &lt;&#x2F;cite&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;今回は減損処理による特別損失のようですが、近年はCPU市場ではAMDの台頭、製造プロセスではTSMCに対抗できず、AI向けチップは完全に出遅れています。&lt;&#x2F;p&gt;
&lt;p&gt;以下はPerplexityで作成したPC向けCPUのシェアです。AppleのIntel離反があるにしてもAMDにかなりやられているのがよくわかります(2021年以前についてはデータがないので、断片情報からの類推が含まれています。)&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;11&amp;#x2F;intel&amp;#x2F;intel-vs-amd.webp?h=8ef3542f94da8cb0d01e&quot;
  alt=&quot;Intel vs AMD&quot; width=&quot;1189&quot; height=&quot;590&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">Intelは今期も赤字で、しかも2兆円を上回る赤字だったそうです。</summary>
        </entry><entry xml:lang="en">
        <title>Goodbye Super Cub!</title>
        <published>2024-11-01T00:00:00+00:00</published>
        <updated>2024-11-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/super-cub/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/super-cub/</id>
        
            <content type="html">&lt;p&gt;Honda&#x27;s Super Cub 50cc, which has been in production for nearly 80 years,
will end production next May. Well, the 110cc will remain, but it&#x27;s quite
moving.&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www3.nhk.or.jp&#x2F;news&#x2F;html&#x2F;20241101&#x2F;k10014626321000.html&quot;&gt;
  1958年に販売され、原付きバイクが普及するきっかけとなった排気量50cc以下の「スーパーカブ」の生産が来年5月をめどに終わることになりました。排ガス規制の強化に伴い、新たな投資をしても採算が取れないと判断したためです。
  &lt;cite&gt;
    {&quot; &quot;}
    &lt;a href=&quot;https:&#x2F;&#x2F;www3.nhk.or.jp&#x2F;news&#x2F;html&#x2F;20241101&#x2F;k10014626321000.html&quot;&gt;
      50cc以下の「スーパーカブ」来年5月めどに生産終了 | NHK
    &lt;&#x2F;a&gt;
  &lt;&#x2F;cite&gt;
&lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">Honda announced that Super Cub 50cc will end production.</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-11-01</title>
        <published>2024-11-01T00:00:00+00:00</published>
        <updated>2024-11-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/11/weekly-buzz-20241101/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/11/weekly-buzz-20241101/</id>
        
            <content type="html">&lt;p&gt;今週は次の3つについてまとめました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;私の最初のギターきっかけでジャパン・ビンテージ・ギター&lt;&#x2F;li&gt;
&lt;li&gt;最近報道されているAmazon週5日出社命令に対するAWS社員の反対書簡&lt;&#x2F;li&gt;
&lt;li&gt;スーパーカブ50ccの生産終了&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ジャパン・ビンテージ・ギター&quot;&gt;ジャパン・ビンテージ・ギター&lt;&#x2F;h2&gt;
&lt;p&gt;先週末帰省して1979年に購入したGrecoギターを見つました。
いわゆる「ジャパン・ビンテージ」です。&lt;&#x2F;p&gt;
&lt;p&gt;私のギターはGreco SV-600というギターで、Gibsonを模倣しながらも
独自の解釈で設計されたオリジナルのセミアコです。製造はフジゲン。
1979年から2年程度しか生産されいない希少モデルで、私のギターもシリアル番号か
ら1979年6月製造とわかります。&lt;&#x2F;p&gt;
&lt;p&gt;期待して、楽器店に売却しましたが、結果は5,000円。
きれいにはがしましたがプラカラーで塗装していたり、後付けしたPUカバーがピック
アップから浮いていたりして状態がよいとはいえず、何より求めている購入者がいな
さそうなので仕方ないかな。&lt;&#x2F;p&gt;
&lt;p&gt;「ジャパン・ビンテージ・ギター」とは、主に1970年代から80年代にかけて日本で製
造されたエレクトリックギターを指します。当時、フェンダーやギブソンなどの米国
製ギターは高価で入手が困難であり、その上アメリカンブランドの品質低下が指摘さ
れる時期と重なっていました。この状況下で、日本のメーカーは独自の製造技術を確
立し、高品質なギターを手頃な価格で提供することに成功しました。&lt;&#x2F;p&gt;
&lt;p&gt;特筆すべきは、コピーモデルとして始まりながらも高度な製造技術と職人
により、オリジナルに匹敵し、時にはそれを上回る品質を実現したことです。
当時GibsonやFenderも一部のモデルを日本に生産委託していました。
特にFender JapanのJVシリーズやGibsonのサブブランドであった日本製のEpiphoneは、
現在でも世界中のギタリストから高い評価を受けています。
また、GRECO、TOKAI、フェルナンデスといった国産ブラン
ドは、単なるコピーを超えて、独自の価値を創造していきました。&lt;&#x2F;p&gt;
&lt;p&gt;製造当時数万円程度で販売されていた製品が、状態の良いものであれば現在では軽く
10万円を超える価格で取引されるなど、国内外で高い評価を受けています。特に、精
密な工作機械と熟練した職人技による優れた製造品質、そして独特のビンテージ感が
絶妙なバランスで共存する点が、現代のギタリストやコレクターを魅了し続けていま
す。また、近年では若手ミュージシャンの間でもジャパンビンテージギターの人気が
再燃しており、その独特のサウンドと雰囲気が新たな音楽シーンを創造する一助と
なっています。&lt;&#x2F;p&gt;
&lt;p&gt;私のSV-600も状態がよければ、過去のオークションで10〜20万とかなり高価格
で取引されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Amazon週5日出社に対するAWS社員の反対書簡&quot;&gt;Amazon週5日出社に対するAWS社員の反対書簡&lt;&#x2F;h2&gt;
&lt;p&gt;Business Insederに「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.jp&#x2F;post-296229&quot;&gt;【全文公開】Amazon社員523人、週5日出社｢礼賛｣した最高幹部に｢徹底批判｣書簡を提出&lt;&#x2F;a&gt;」という記事(有料会員限定)が掲載されていました。&lt;&#x2F;p&gt;
&lt;p&gt;Amazonでは以前から&quot;Return to Office&quot;は社内では言われていましたが、9月にCEOのAndrew Jassyがより厳格な指示を出し、これに対してAWSのCEOであるMatt Garmanが指示を表明したところ、従業員から反発が上がり社内で500人以上におよぶ従業員が書名して彼に反対意見を述べる書簡を提示したという記事です。&lt;&#x2F;p&gt;
&lt;p&gt;書簡の主旨は在宅勤務も含めたワークスタイルは生産性向上やイノベー
ションにつながるという点はもちろんですが、Mattの発言がAmazonの根本理念に
反しているという次の主張が目を引きました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;「従業員の10人中9人は今回の変更を相当楽しみにしているのだと思う。」
というMattの発言はデータの根拠がない「思う」と印象で、「**
データ駆動**」を自ら謳う企業風土に相応しくなく、リモートワークのメリットを経
験した当事者としての従業員、そうした経験を裏付ける詳細なデータを把握している
従業員からの信頼を損なう。&lt;&#x2F;li&gt;
&lt;li&gt;従わない社員については「勤務先として他の会社もある」などの発言は、AmazonのLeadership Principlesにも反する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;後者の少し分かりにくいかもしれませんが、Amazonでは&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.jobs&#x2F;content&#x2F;en&#x2F;our-workplace&#x2F;leadership-principles&quot;&gt;Leadership Principles&lt;&#x2F;a&gt;というものが定義されています。日本だと「社訓」が近いかもしれませんが、社訓よりもより具体的な行動指針や判断基準として定義されています。社内では&quot;Our Leadership Principles&quot;を略して&quot;&lt;strong&gt;OLP&lt;&#x2F;strong&gt;&quot;と呼ばれあらゆる場面で使われています。&lt;&#x2F;p&gt;
&lt;p&gt;採用面接でもOLPからいくつかのPrinciplesが選ばれデモンストレーションできる逸
話を求められますし、社内の人事評価でもOLPに従った評価が行われます。社内会議
などでも「その提案はOLPのCustomer Obsessionに沿ってない」などと普通に使われ
ていて入社した当時面食らったものです。&lt;&#x2F;p&gt;
&lt;p&gt;と言うわけで、「OLPに反している」などと社内で公然と指摘されるのかなり厳しい
状況と思えますが、Mattはこれからどうするのか見ていきたいと思います。&lt;&#x2F;p&gt;
&lt;p&gt;私が在職していた頃も、AWS Japanでも営業職などは週3日程度出社するような指示が出ていたようです。
私が所属していたサービス部隊ではオフィスより顧客先に出向くことのほうが多いので、この指示からは除外するように運営していました。その後、どうなっているのでしょうか。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;原付50cc時代の終焉_～新たなモビリティ文化への転換点～&quot;&gt;原付50cc時代の終焉 ～新たなモビリティ文化への転換点～&lt;&#x2F;h2&gt;
&lt;p&gt;ホンダが「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;global.honda&#x2F;jp&#x2F;news&#x2F;2024&#x2F;2241101-supercub50.html&quot;&gt;スーパーカブ・Final
Edition&lt;&#x2F;a&gt;」を発表
し、このモデルをもってスーパーカブ50ccの生産を終了することを発表しました。
1958年の発売以来、世界累計生産台数1億台を超えるこの愛されてきたモデルは、日
本のモータリゼーションを支え続けてきました。かつて年間278万台もの国内出荷を
誇っていた原付50ccも、いまでは9万2000台にまで減ってしまったそうです。&lt;&#x2F;p&gt;
&lt;p&gt;生産終了の大きなきっかけとなったのは、2025年11月からスタートする排ガス規制の
強化です。
特に50cc車両では、排ガス浄化に必要な触媒の温度を保つ
ことが難しく、技術的な壁に直面していました。新しい規制に対応するための投資も
必要ですが、残念ながら市場規模が小さくなりすぎて、採算が合わなくなってしまっ
たようです。2017年に生産拠点を中国から日本に戻したばかりなのに残念なことで
す。&lt;&#x2F;p&gt;
&lt;p&gt;50ccバイクは、私も大学時代に通学で使っていました。
当時「125キラー」と呼ばれ125ccも追い回せると言われたYAMAHAのRZ50に乗っていま
した。通学や新社会人の足として、ある年代以上の方はきっと多くの方の青春の思い出
の一部となっているはずです。
環境面でも、小排気量ならではの省エネ性や、都市部での手軽な移動手段として、
とても優れた乗り物でした。でも、時代は新しい方向に進み始めています。
125cc以下4kW制限の新基準バイクや電動バイクなど、次世代のモビリティへの転換期を迎えているんですね。
半世紀以上にわたって日本の街を走り続けてきた原付50ccが静かに歴史の1ページを閉じると思うと感慨深いです。&lt;&#x2F;p&gt;
&lt;p&gt;漫画「オーバーレブ」を描いていた山口かつみ先生がバイクについて描いた
「
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3Asjw3s&quot;&gt;My Favorite Bike&lt;&#x2F;a&gt;
」にスーパーカブや
RZ50のエピソードがあったのを思い出してKindleで買い直しました。なつかしい
なぁ。&lt;&#x2F;p&gt;
</content>
        <summary type="html">すっかり肌寒くなりました。先週末帰省して、初めて買ったギターを発見して、手を入れたりしていました。今週はジャパンビンテージギター、Amazonの出社命令、スーパーカブ50ccについてまとめました。</summary>
        </entry><entry xml:lang="en">
        <title>M4 Macbook has been announced</title>
        <published>2024-10-31T00:00:00+00:00</published>
        <updated>2024-10-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/m4-mac/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/m4-mac/</id>
        
            <content type="html">&lt;p&gt;I&#x27;m currently using a MacBook Pro with M3 Max, so I&#x27;ve made a comparison between the M3 Max and M4 Max. I think I&#x27;ll continue using my current MacBook Pro for a while longer rather than upgrading.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Chip Model&lt;&#x2F;th&gt;&lt;th&gt;CPU Core Count&lt;&#x2F;th&gt;&lt;th&gt;GPU Core Count&lt;&#x2F;th&gt;&lt;th&gt;Benchmark Scores&lt;&#x2F;th&gt;&lt;th&gt;Transistor Count (Billions)&lt;&#x2F;th&gt;&lt;th&gt;Memory Bandwidth (GB&#x2F;s)&lt;&#x2F;th&gt;&lt;th&gt;Release Date&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;M3 Max&lt;&#x2F;td&gt;&lt;td&gt;12&#x2F;4&lt;&#x2F;td&gt;&lt;td&gt;40&lt;&#x2F;td&gt;&lt;td&gt;Single: 2971, Multi: 20785&lt;&#x2F;td&gt;&lt;td&gt;92&lt;&#x2F;td&gt;&lt;td&gt;400&lt;&#x2F;td&gt;&lt;td&gt;2023-10-30&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M4&lt;&#x2F;td&gt;&lt;td&gt;4&#x2F;6&lt;&#x2F;td&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;120&lt;&#x2F;td&gt;&lt;td&gt;2024-05-15&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M4 Pro&lt;&#x2F;td&gt;&lt;td&gt;10&#x2F;4&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Not announced&lt;&#x2F;td&gt;&lt;td&gt;120&lt;&#x2F;td&gt;&lt;td&gt;2024-10-29&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M4 Max&lt;&#x2F;td&gt;&lt;td&gt;12&#x2F;4&lt;&#x2F;td&gt;&lt;td&gt;40&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Not announced&lt;&#x2F;td&gt;&lt;td&gt;546&lt;&#x2F;td&gt;&lt;td&gt;2024-05-15&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        <summary type="html">The MacBook Pro featuring the M4 chip has been announced.</summary>
        </entry><entry xml:lang="en">
        <title>フォレストかみきたに行ってきた</title>
        <published>2024-10-28T00:00:00+00:00</published>
        <updated>2024-10-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/kamikita/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/kamikita/</id>
        
            <content type="html">&lt;p&gt;宿の脇を流れる小谷川は大台ケ原からの伏流水が注ぐ清流。上流に人は住まないため
水道水をそののままいただけて冷たく美味しい。その清流で育つあまごの塩焼きは絶
品。&lt;&#x2F;p&gt;
&lt;p&gt;客室には自転車ハンガーが設置され、サイクリストへの配慮が行き届いています。この地域は大台ケ原へと続く標高差1,240メートルのヒルクライムコースで自転車の聖地として有名です。私は自転車に乗りませんが。&lt;&#x2F;p&gt;
&lt;p&gt;雄大な自然に囲まれた静かな時間は、心身ともにリフレッシュできる贅沢な体験となりました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;10&amp;#x2F;kamikita&amp;#x2F;kamikita.jpg?h=10760379424bea65f159&quot;
  alt=&quot;小谷川&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;&#x2F;th&gt;&lt;th&gt;内容&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;店名&lt;&#x2F;td&gt;&lt;td&gt;フォレストかみきた&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;住所&lt;&#x2F;td&gt;&lt;td&gt;奈良県吉野郡上北山村大字河合552-2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;地図&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;?mlat=34.139024&amp;amp;mlon=136.000662#map=17&#x2F;34.139024&#x2F;136.000662&quot;&gt;OpenStreetMap&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;電話&lt;&#x2F;td&gt;&lt;td&gt;07468-3-0001&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;定休日&lt;&#x2F;td&gt;&lt;td&gt;不明&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ウェブサイト&lt;&#x2F;td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;forest-kamikita.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;forest-kamikita.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        <summary type="html">世界遺産「大峯奥駈道」と日本百名山「大台ケ原」に囲まれた奈良県上北山村。この地の「フォレストかみきた」で週末を過ごしました。</summary>
        </entry><entry xml:lang="en">
        <title>The Ultimate Showdown: A Deep Dive into Modern Messaging Apps</title>
        <published>2024-10-23T00:00:00+00:00</published>
        <updated>2026-07-01T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/modern-messaging-apps/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/modern-messaging-apps/</id>
        
            <content type="html">&lt;p&gt;市川強盗傷害事件で犯人たちが「秘匿性が高い通信アプリを使用」とアプリ名を伏せて報道されています。
どうやら&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signal.org&#x2F;ja&#x2F;&quot;&gt;Signal&lt;&#x2F;a&gt;を使っていたようです。こうなるとバカなメディアや視聴者が「邪悪なアプリ」と騒ぎ出しそうですね。&lt;&#x2F;p&gt;
&lt;p&gt;プライバシー&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
を考慮すると当然の選択ですね。公安や自衛隊でもSignalを奨励しているようです。
不完全な暗号化やメタデータ収集するLINEとかいうアプリを使っている能天気なメディアや視聴者より、
犯人たちのほうがよほど高いリテラシーを持っていたということでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;気になったので、主要なメッセージングアプリについての比較表を作ってみました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;メッセージングアプリの総合比較表&quot;&gt;メッセージングアプリの総合比較表&lt;&#x2F;h2&gt;
&lt;p&gt;以下は主なメッセージングアプリのついての比較をまとめた表です。&lt;&#x2F;p&gt;
&lt;p&gt;犯人たちが&lt;strong&gt;Signal&lt;&#x2F;strong&gt;を使ったのも納得です。日本ではユーザーが少ないので利用シーンは限られますが。
次点で &lt;strong&gt;Threema&lt;&#x2F;strong&gt; ですね。私は家族で使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;iPhoneユーザーであれば &lt;strong&gt;iMessage&lt;&#x2F;strong&gt; は無難でしょう。完全にE2Eで暗号化されており、メタ情報の収集はされているようですが、Appleなので多少はマシだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Telegram&lt;&#x2F;strong&gt; はテロリストが使用しているイメージはありますが、意外に脆弱です。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;LINE&lt;&#x2F;strong&gt;については、日本でもユーザーが多いので補足を入れています。
やはりLINEは暗号化も不完全でデフォルトの状態ですし、メタ情報&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-2&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;をかなり収集してお
り、おまけに透明性の観点でもいろいろと問題&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;がありました。&lt;&#x2F;p&gt;
&lt;p&gt;こう並べてみると、&lt;strong&gt;LINE&lt;&#x2F;strong&gt; を選択する意味が私にはわかりません。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;機能&#x2F;特徴&lt;&#x2F;th&gt;&lt;th&gt;LINE&lt;&#x2F;th&gt;&lt;th&gt;Signal&lt;&#x2F;th&gt;&lt;th&gt;Threema&lt;&#x2F;th&gt;&lt;th&gt;WhatsApp&lt;&#x2F;th&gt;&lt;th&gt;iMessage&lt;&#x2F;th&gt;&lt;th&gt;Telegram&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;E2E暗号化&lt;&#x2F;td&gt;&lt;td&gt;部分対応[暗号化WP] ※1&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;Secret Chatのみ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;グループチャット暗号化&lt;&#x2F;td&gt;&lt;td&gt;50人以下のみ[暗号化WP]&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;Secret Chatのみ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;メタデータ収集&lt;&#x2F;td&gt;&lt;td&gt;多い[PP] ※2&lt;&#x2F;td&gt;&lt;td&gt;最小限&lt;&#x2F;td&gt;&lt;td&gt;最小限&lt;&#x2F;td&gt;&lt;td&gt;多い&lt;&#x2F;td&gt;&lt;td&gt;中程度&lt;&#x2F;td&gt;&lt;td&gt;中程度&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;データストレージ&lt;&#x2F;td&gt;&lt;td&gt;サーバー保存[暗号化WP,PP] ※3&lt;&#x2F;td&gt;&lt;td&gt;端末のみ&lt;&#x2F;td&gt;&lt;td&gt;端末のみ&lt;&#x2F;td&gt;&lt;td&gt;クラウド可能&lt;&#x2F;td&gt;&lt;td&gt;iCloud連携時保存&lt;&#x2F;td&gt;&lt;td&gt;サーバー保存&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;電話番号必須&lt;&#x2F;td&gt;&lt;td&gt;はい[PP]&lt;&#x2F;td&gt;&lt;td&gt;はい&lt;&#x2F;td&gt;&lt;td&gt;いいえ&lt;&#x2F;td&gt;&lt;td&gt;はい&lt;&#x2F;td&gt;&lt;td&gt;いいえ&lt;&#x2F;td&gt;&lt;td&gt;はい&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;自動消去機能&lt;&#x2F;td&gt;&lt;td&gt;24時間のみ[PP]&lt;&#x2F;td&gt;&lt;td&gt;1秒～4週間&lt;&#x2F;td&gt;&lt;td&gt;カスタム設定可&lt;&#x2F;td&gt;&lt;td&gt;24時間～90日&lt;&#x2F;td&gt;&lt;td&gt;2分～4週間&lt;&#x2F;td&gt;&lt;td&gt;1秒～1週間&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;法執行機関への情報開示&lt;&#x2F;td&gt;&lt;td&gt;多い[TR] ※4&lt;&#x2F;td&gt;&lt;td&gt;最小限&lt;&#x2F;td&gt;&lt;td&gt;最小限&lt;&#x2F;td&gt;&lt;td&gt;多い&lt;&#x2F;td&gt;&lt;td&gt;一部可能&lt;&#x2F;td&gt;&lt;td&gt;最小限&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;追加機能&lt;&#x2F;td&gt;&lt;td&gt;スタンプ&#x2F;ゲーム&#x2F;決済&#x2F;音声・ビデオ通話[PP]&lt;&#x2F;td&gt;&lt;td&gt;スタンプ&#x2F;音声・ビデオ通話&lt;&#x2F;td&gt;&lt;td&gt;投票&#x2F;音声・ビデオ通話&lt;&#x2F;td&gt;&lt;td&gt;ステータス&#x2F;音声・ビデオ通話&#x2F;決済&lt;&#x2F;td&gt;&lt;td&gt;Apple統合&#x2F;音声・ビデオ通話&lt;&#x2F;td&gt;&lt;td&gt;Bot&#x2F;チャンネル&#x2F;音声・ビデオ通話&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;オープンソース&lt;&#x2F;td&gt;&lt;td&gt;一部のみ[暗号化WP]&lt;&#x2F;td&gt;&lt;td&gt;完全対応&lt;&#x2F;td&gt;&lt;td&gt;一部のみ&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;なし&lt;&#x2F;td&gt;&lt;td&gt;クライアントのみ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;※1: LINEのE2E暗号化（Letter Sealing）対応範囲(doc.1) &lt;ins&gt;（2026年7月追記: 2024年後半にLetter Sealingの保護対象が拡大されました。出典: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lycorp.co.jp&#x2F;ja&#x2F;privacy-security&#x2F;security&#x2F;transparency&#x2F;encryption-report&#x2F;2025&#x2F;&quot;&gt;LINE暗号化状況レポート（2025年）&lt;&#x2F;a&gt;）&lt;&#x2F;ins&gt;
&lt;ul&gt;
&lt;li&gt;対応: テキスト・位置情報（1対1と50人以下グループ）、1対1音声・ビデオ通話&lt;ins&gt;、画像・動画・音声メッセージ・ファイル添付（2024年後半に対応。1対1と50人以下グループ）&lt;&#x2F;ins&gt;&lt;&#x2F;li&gt;
&lt;li&gt;非対応: &lt;del&gt;画像、動画、ファイル添付、&lt;&#x2F;del&gt;50人以上グループ、グループ通話、LINEミーティング&lt;ins&gt;、アルバム、ノート&lt;&#x2F;ins&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;※2: LINEのメタデータ収集内容(doc.2)
&lt;ul&gt;
&lt;li&gt;アカウント情報（電話番号、メールアドレス）&lt;&#x2F;li&gt;
&lt;li&gt;デバイス情報（使用OS、言語設定）&lt;&#x2F;li&gt;
&lt;li&gt;アプリの使用頻度情報&lt;&#x2F;li&gt;
&lt;li&gt;位置情報（設定による）&lt;&#x2F;li&gt;
&lt;li&gt;友達関係の情報&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;※3: LINEのデータストレージ(doc.1,doc.2)
&lt;ul&gt;
&lt;li&gt;メッセージはサーバーに保存&lt;&#x2F;li&gt;
&lt;li&gt;クラウドバックアップ時は暗号化解除&lt;&#x2F;li&gt;
&lt;li&gt;URL preview等の機能利用時はサーバーに内容送信&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;※4: 法執行機関への開示可能情報(doc.3)
&lt;ul&gt;
&lt;li&gt;7日分のテキストチャット履歴&lt;&#x2F;li&gt;
&lt;li&gt;アカウント情報&lt;&#x2F;li&gt;
&lt;li&gt;通信ログ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;判断は以下の[LINEの公式ドキュメント]より確認しています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;暗号化ホワイトペーパー(doc.1)&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-linewhitepaper-1&quot;&gt;&lt;a href=&quot;#fn-linewhitepaper&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;terms2.line.me&#x2F;globalnews_PP&#x2F;sp&quot;&gt;プライバシーポリシー&lt;&#x2F;a&gt;(doc.2)&lt;&#x2F;li&gt;
&lt;li&gt;透明性レポート(doc.3)&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-linecorp-1&quot;&gt;&lt;a href=&quot;#fn-linecorp&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私自身は&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;threema.ch&#x2F;en&quot;&gt;Threema&lt;&#x2F;a&gt;を使用しています。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;この場合「プライバシー」と呼ぶのが適当かわかりませんが。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-1-2&quot;&gt;↩2&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;2021年のZホールディングとの経営統合で、トークの画像などの情報が韓国の
サーバーでホスティングされていたり、通報確認などが中国企業に委託されてい
たり、このようなことが「第三国」としかレポートされていなかったりと透明性の観
点で問題がありました。現在は解消されたと報告されていますが。 &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-linewhitepaper&quot;&gt;
&lt;p&gt;元のホワイトペーパー: https:&#x2F;&#x2F;scdn.line-apps.com&#x2F;stf&#x2F;linecorp&#x2F;en&#x2F;csr&#x2F;line-encryption-whitepaper-ver2.1.pdf は現在アクセスできません &lt;a href=&quot;#fr-linewhitepaper-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-linecorp&quot;&gt;
&lt;p&gt;元のレポートページは削除されました &lt;a href=&quot;#fr-linecorp-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">市川強盗傷害事件で犯人たちがSignalを使っていたということで、「SIgnalは危険アプリ」とか言い出すバカがいそうなのでまとめてみました。</summary>
        </entry><entry xml:lang="en">
        <title>メインブログのAWS移行</title>
        <published>2024-10-21T00:00:00+00:00</published>
        <updated>2024-10-21T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/blog-hosted-on-aws/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/blog-hosted-on-aws/</id>
        
            <content type="html">&lt;p&gt;特に困っていたわけではありませんが、デプロイの自動化していると環境の違いで悩むこともあるのでローカルで生成したものをアップロードしようかなという気まぐれです。&lt;&#x2F;p&gt;
&lt;p&gt;試算では以下の程度の月額です。大きく外れたらまた戻すかもしれません。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;サービス&lt;&#x2F;th&gt;&lt;th&gt;コスト項目&lt;&#x2F;th&gt;&lt;th&gt;月間コスト (USD)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;S3&lt;&#x2F;td&gt;&lt;td&gt;ストレージ&lt;&#x2F;td&gt;&lt;td&gt;$0.0075&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;S3&lt;&#x2F;td&gt;&lt;td&gt;GET リクエスト&lt;&#x2F;td&gt;&lt;td&gt;$0.0012&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ACM&lt;&#x2F;td&gt;&lt;td&gt;証明書&lt;&#x2F;td&gt;&lt;td&gt;$0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CloudFront&lt;&#x2F;td&gt;&lt;td&gt;データ転送&lt;&#x2F;td&gt;&lt;td&gt;$0.765&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CloudFront&lt;&#x2F;td&gt;&lt;td&gt;HTTPS リクエスト&lt;&#x2F;td&gt;&lt;td&gt;$0.00225&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;合計&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;$0.78&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</content>
        <summary type="html">メインブログを CloudflareからAWS S3に移行してみました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-10-18</title>
        <published>2024-10-18T00:00:00+00:00</published>
        <updated>2024-10-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/weekly-buzz-20241019/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/weekly-buzz-20241019/</id>
        
            <content type="html">&lt;h2 id=&quot;宮崎空港不発弾について&quot;&gt;宮崎空港不発弾について&lt;&#x2F;h2&gt;
&lt;p&gt;10月2日に突然宮崎空港で不発弾が爆発しました。&lt;&#x2F;p&gt;
&lt;p&gt;宮崎空港では2021年6月にも駐機場でアメリカ製の1トンの不発弾が見つかっています。
宮崎空港は太平洋戦争当時、旧日本海軍の「赤江飛行場」として使用されており、
米軍による空爆が行われていたことが原因です。2021年以前にも何度か不発弾が
見つかっています。&lt;&#x2F;p&gt;
&lt;p&gt;家族が現在宮崎で仕事をしており、私もたまに空港を使うことがあるので困ったもの
です。&lt;&#x2F;p&gt;
&lt;p&gt;防衛省の統合幕僚監部が発表する
「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mod.go.jp&#x2F;js&#x2F;pdf&#x2F;2024&#x2F;p20240729_02.pdf&quot;&gt;令和5年度における自衛隊の災害派遣&lt;&#x2F;a&gt;」
を読むと、令和5年度に陸上で発見された不発弾だけでも沖縄だけで441件、全国で
2,348件に上ります。しかも、終戦から80年近く経過しており、爆発物は不安定な化
合物で時間が立つにつれより敏感なるため、そのリスクはますます高まっています。&lt;&#x2F;p&gt;
&lt;p&gt;一方で不発弾撤去については自衛隊が処理に当たっているようですが、その費用負担
については法整備がされていません。2018年の大阪の事例では土地所有者が不発弾処
理のための周辺警備などの費用580万円を負担し「戦後処理の一環として、行政が処
理責任を負うべき」と裁判を起こしましたが退けられています。&lt;&#x2F;p&gt;
&lt;p&gt;80年経ってもこれほどの負担を強いる「戦争」などという問題解決方法など安易に取
るべきではないという教訓ですね。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Nintendo_Alarmoがやってきた&quot;&gt;Nintendo Alarmoがやってきた&lt;&#x2F;h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;10&amp;#x2F;weekly-buzz-20241019&amp;#x2F;alarmo.jpg?h=944689e1d8bbecd5ce30&quot;
  alt=&quot;Nintendo Alarmo&quot; width=&quot;1800&quot; height=&quot;1256&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;任天堂が突然発売した目覚まし時計Alarmoを手に入れることができました。
ここ数日使っていますが、ベッドに入ると自動的に睡眠を誘う音楽を流してくれ、ス
プラトゥーンの音楽で目覚ましアラームを鳴らしてくれ、ベッドから出ると指一本触
れずにアラームが止まります。&lt;&#x2F;p&gt;
&lt;p&gt;マリオやゼルダ、スプラトゥーンなど、任天堂の豊富なIPを活かしつつ、ゲーム要素を敢えて排除し純粋な目覚まし時計として設計したところが秀逸なところだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;UIなどボタン3つでここまで使いやすいデバイスに仕上げられるのを見ていると、ど
こかの自動車メーカーなどぜひ参考にしてほしいものです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ちょっと間が開いてしまいましたが、この間にすっかり秋らしくなって涼しくなってきました。ただ、今週末も夏日になるというので油断できません。今週は宮崎空港不発弾事件とNintendo Alarmoについてです。</summary>
        </entry><entry xml:lang="en">
        <title>晩餐歌</title>
        <published>2024-10-15T00:00:00+00:00</published>
        <updated>2024-10-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/dinner-song/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/dinner-song/</id>
        
            <content type="html">&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https:&#x2F;&#x2F;w.soundcloud.com&#x2F;player&#x2F;?url=https%3A&#x2F;&#x2F;api.soundcloud.com&#x2F;tracks&#x2F;soundcloud%253Atracks%253A1935236096&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;&#x2F;iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&quot; title=&quot;Yostos&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Yostos&lt;&#x2F;a&gt; · &lt;a href=&quot;https:&#x2F;&#x2F;soundcloud.com&#x2F;yostos&#x2F;dinner-song&quot; title=&quot;晩餐歌(Dinner Song)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;晩餐歌(Dinner Song)&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;Guitar: Epiphone USA Texan&lt;&#x2F;li&gt;
&lt;li&gt;Vocal: Synthesizer V (Sheena)&lt;&#x2F;li&gt;
&lt;li&gt;その他の伴奏: Logic Proの自動演奏&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This song is a cover of &quot;Bansanka&quot; (Dinner Song) by tuki., a Japanese singer-songwriter who is currently an active middle school girl. It&#x27;s been one of my favorite songs recently, so I decided to try playing it.&lt;&#x2F;p&gt;
</content>
        <summary type="html">tuki.の楽曲『晩餐歌』のカバーです。最近お気に入りの曲なので弾いてみました。</summary>
        </entry><entry xml:lang="en">
        <title>AWS SAA再認定</title>
        <published>2024-10-11T00:00:00+00:00</published>
        <updated>2024-10-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/10/re-certification-saa/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/10/re-certification-saa/</id>
        
            <content type="html">&lt;p&gt;「SAPじゃなく、3年前のSAAの再認定だし楽勝だ」と思いフラリと受験しました。
3年でサービスも増え出題範囲自体が広くなっており焦りました。しかも、受験してたPC
が途中30分程度フリーズしてPearsonの対応もよくわからないのでぶち切れて帰ると
ころでした。&lt;&#x2F;p&gt;
&lt;p&gt;以前はその場で結果が出ましたが、現在は「5日以内に通知」とされているようで
す。他の合格者の記事を読むと当日の夜21時にメールされてくることが多いようで
す。私の場合まだメールは来ていませんが、Cermetricsの&quot;Exam History&quot;で確認でき
ました。&lt;&#x2F;p&gt;
&lt;p&gt;DeveloperとSysOps AdministratorももうすぐExpireしてしまいますが、これはもう
いいかな。2025年2月までAWS Certified AI Practitionerの再試験の無料キャン
ペーンが行われているようなので、次はこちらを受験しようかなと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">AWSを離れたのでもう要らないかなと思いましたが、自分を説明するのにSAAくらいは持っていたほうが分かりやすいなと思いSAA再認定を取りました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-09-27</title>
        <published>2024-09-27T00:00:00+00:00</published>
        <updated>2024-09-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/weekly-buzz-20240927/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/weekly-buzz-20240927/</id>
        
            <content type="html">&lt;h2 id=&quot;『機動警察パトレイバー_THE_MOVIE』リバイバル上映を見て&quot;&gt;『機動警察パトレイバー THE MOVIE』リバイバル上映を見て&lt;&#x2F;h2&gt;
&lt;p&gt;1989年公開の『機動警察パトレイバー THE MOVIE』のリバイバル上映を最近鑑賞しました。当初は「思い出補正」による過大評価を懸念していましたが、予想に反して作品の質の高さを再確認できました。同時に、この作品が描いた未来と現実との乖離も強く感じました。&lt;&#x2F;p&gt;
&lt;p&gt;この作品が公開された1989年は、振り返ってみると非常に象徴的な年でした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;昭和天皇の崩御&lt;&#x2F;li&gt;
&lt;li&gt;三菱地所によるロックフェラー・センター買収&lt;&#x2F;li&gt;
&lt;li&gt;任天堂によるゲームボーイの発売&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これらの出来事を見ると、1989年は、政治、経済、テクノロジーなど様々な面で日本にとって大きな転換点となった年だったのです。&lt;&#x2F;p&gt;
&lt;p&gt;「バブル」の絶頂期に作品で描かれているよう東京は再開発され「古き良き日本」はどんどんなくなり、
作品内で描かれている湾岸地区は当時とも全く姿を変えています。
一方で当時の楽観的な技術観を反映した『機動警察パトレイバー THE MOVIE』で描かれる近未来の世界観とは異なり、
いま日本は技術大国としての道筋から外れ、むしろ海外企業の技術に依存する状況へと陥っています。&lt;&#x2F;p&gt;
&lt;p&gt;本作は1989年という転換期の日本を背景に、技術の進歩と社会の変化と
それらがもたらす光と影を鮮やかに描き出しています。
リバイバル上映を通じて、作品の質の高さだけでなく描かれた未来と現実の差異や
当時の日本が抱いていた技術的野心と現在の状況を比較し、深い示唆を得ることができました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ジャーナルツール_jrnl&quot;&gt;ジャーナルツール jrnl&lt;&#x2F;h2&gt;
&lt;p&gt;少し前からコマンドラインで使用できるジャーナルツールjrnlを使用しています。&lt;&#x2F;p&gt;
&lt;p&gt;備忘のため記録を付けたいだけで日記を書くつもりはないので最低限のことができればよいのですが、Inkdrop&#x2F;Obsidian&#x2F;Logseqなどは高機能すぎて面倒でした。コマンドラインからメモツールとして&lt;code&gt;nb&lt;&#x2F;code&gt;も使っていますが、ジャーナルに特化していません。&lt;&#x2F;p&gt;
&lt;p&gt;jrnlはただただプレーンテキストでエントリーを記録できます。日付も自
動で入りますし、余計な機能はあまりなく、気に入っています。MacではHomebrewを
使えば簡単にインストールできます。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install jrnl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;折角なのでドキュメントの日本語化を行いました。
本体にマージしてもらうようPull Requestをしていますが、
プロジェクトのビルド設定に問題があるようで時間かかりそうです。
個人的にコピーしたリポジトリをGitHub Pagesで&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yostos.github.io&#x2F;jrnl-j&#x2F;ja&#x2F;usage&#x2F;&quot;&gt;日本語版&lt;&#x2F;a&gt;として公開しておきました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自動車業界におけるITについて&quot;&gt;自動車業界におけるITについて&lt;&#x2F;h2&gt;
&lt;p&gt;マイカーで使用しているメーカー指定のデンソーテン製ドライブレコーダーのSDカードがメディア破損してしまいました。交換しようとしましたが、驚いたことを純正は容量の少ないSDカードを法外な価格でしか提供していません。&lt;&#x2F;p&gt;
&lt;p&gt;有る程度の容量があるSDカードのほうは書き込みが分散しセル当たりの書き込み回
数が減って耐久性は上がるはずなので、普通のHigh EnduranceのSDカードを購入
しました。
しかし、これでは毎回「非純正SDカード」という警告が出るので警告を
抑止する設定が必要です。ところが、対応するスマホアプリはダイアログからOKボ
タンがはみ出すという初歩的で致命的なバグがあり初期設定すらできません。パソコ
ン版のビューアーアプリはWidnows版しか提供しておらず、Macがサポートされて
いません。仕方なくディーラーで設定してもらいました。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gs.statcounter.com&#x2F;os-market-share&#x2F;desktop&#x2F;worldwide&#x2F;&quot;&gt;GlobalStats&lt;&#x2F;a&gt;の情報を見ると、Windowsのシェアは結構下がっており、Macは20%程度のシェアがあります。
自動車業界は自動運転にフォーカスし米巨大テック企業がこぞって参加しようという状況なのに、ソフトウェア開発は社外に放り投げてマルチプラットフォームのサポートもしない日本の自動車関連機器メーカーとしてはのんびりしたもんです。&lt;&#x2F;p&gt;
</content>
        <summary type="html">昨日くらいから随分と秋らしくなりました。今週は自宅キッチンのリフォームのためあまりニュースなどを追えませんでした。今週は、映画『機動警察パトレイバー THE MOVIE』、ジャーナルツール jrnl、自動車業界におけるITについてです。</summary>
        </entry><entry xml:lang="en">
        <title>リバイバル上映:映画『機動警察パトレイバー THE MOVIE』</title>
        <published>2024-09-24T00:00:00+00:00</published>
        <updated>2024-09-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/patlabor-the-movie/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/patlabor-the-movie/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;09&amp;#x2F;patlabor-the-movie&amp;#x2F;patlabor.jpg?h=aba25971084d9046c71f&quot;
  alt=&quot;&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;「思い出補正」で作品評価を必要以上に上げていて見直すとがっかりするのではと懸念していましたが、予想に反してしっかりと楽しむことができました。
1989年と言えば、昭和天皇の崩御、ベルリンの壁崩壊、冷戦終結の年。三菱地所がロックフェラー・センターを買収し、任天堂がゲームボーイを発売。振り返ると、現代とは異なる世界線だったように感じます。&lt;&#x2F;p&gt;
&lt;p&gt;🎥Tonight, I attended a revival screening of &quot;Patlabor: The Movie&quot; (1989). I was concerned that &quot;nostalgia goggles&quot; might have inflated my evaluation of the film, potentially leading to disappointment upon rewatching. However, contrary to my expectations, I found myself thoroughly enjoying it.
The year 1989 was marked by significant events: the death of Emperor Hirohito, the fall of the Berlin Wall, and the end of the Cold War. It was also the year Mitsubishi Estate purchased Rockefeller Center, and Nintendo released the Game Boy. Looking back, it feels like we were living in a different timeline compared to today.&lt;&#x2F;p&gt;
</content>
        <summary type="html">映画『機動警察パトレイバー THE MOVIE』(1989年)のリバイバル上映を今晩見てきました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-09-20</title>
        <published>2024-09-20T00:00:00+00:00</published>
        <updated>2024-09-20T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/weekly-buzz-20240920/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/weekly-buzz-20240920/</id>
        
            <content type="html">&lt;p&gt;今週の気になった記事や出来事は次の3つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Android界隈について&lt;&#x2F;li&gt;
&lt;li&gt;Amazon Bedrockについて&lt;&#x2F;li&gt;
&lt;li&gt;自民党総裁選&lt;&#x2F;li&gt;
&lt;li&gt;キッチン改装&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Andorid界隈について&quot;&gt;Andorid界隈について&lt;&#x2F;h2&gt;
&lt;p&gt;9月にAndroid 15が発表され、そろそろGoogle Pixel向けの配信が始まりそうです。新しいAndroidには期待していますが、現状のAndroid界隈ではいくつかの問題が存在します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ランチャーの問題&quot;&gt;ランチャーの問題&lt;&#x2F;h3&gt;
&lt;p&gt;Androidはランチャー(ホーム画面機能)を置き換えることができるため、多くのユーザーはサードパーティの高機能なランチャーを使用しています。中でも最もメジャーなランチャーアプリが&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.teslacoilsw.launcher&amp;amp;hl=ja&quot;&gt;Nova Launcher&lt;&#x2F;a&gt;です。&lt;&#x2F;p&gt;
&lt;p&gt;ところが、この&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.teslacoilsw.launcher&amp;amp;hl=ja&quot;&gt;Nova Launcher&lt;&#x2F;a&gt;の開発元が広告会社に買収され開発チームがレイオフされたため、
個人情報漏えいリスクやメンテナンス中断といった懸念が
ユーザーの間で広がっています。
Redditを眺めていると既に移行先探しが始まっています。&lt;&#x2F;p&gt;
&lt;p&gt;私も移行先を検討してみました。&lt;&#x2F;p&gt;
&lt;p&gt;現時点では&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;f-droid.org&#x2F;ja&#x2F;packages&#x2F;de.mm20.launcher2.release&#x2F;&quot;&gt;Kvaesitso&lt;&#x2F;a&gt;という比較的新しいランチャーを移行先として有力です。
このランチャーは日本語だけでなく英語でも紹介されているサイトをみた事がないレベルです。
１週間ほど使ってみて気に入っています。このランチャーの特徴は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;AOSP（Android Open Source Project）をベースにしておらず、ゼロから開発されたランチャーである&lt;&#x2F;li&gt;
&lt;li&gt;従来のランチャーとは異なり、ホーム画面にアプリを配置することを廃止している&lt;&#x2F;li&gt;
&lt;li&gt;検索を用いてアプリを呼び出す方式を採用しており、アプリ、ウェブサイト、コンタクト先を同列で扱えるため便利&lt;&#x2F;li&gt;
&lt;li&gt;ホーム画面にはウィジェットを縦スクロールで配置できる独自のレイアウトを採用している&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;最初は使いにくいかと思いましたが、慣れてくるとよく使うアプリは自動的にFavorite欄にまとまっていくため、次第に使い勝手が向上しました。検索の利便性のためAndroidの言語設定を英語にしました。&lt;&#x2F;p&gt;
&lt;p&gt;問題点としては、F-Droidでしか提供されておらず一定の知識がないとたどり着けないことです。
また、Playストアを経由しないことに対してセキュリティ面を心配する人も多いでしょう。個人的には、FOSS（フリー・オープンソース・ソフトウェア）でありソースコードも&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MM2-0&#x2F;Kvaesitso&quot;&gt;GitHub&lt;&#x2F;a&gt;で公開されているため、特定の企業のアプリよりも安全だと思っています。&lt;&#x2F;p&gt;
&lt;p&gt;その他の候補としては次のようなランチャーがあります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=app.lawnchair.play&amp;amp;hl=ja&quot;&gt;Lawnchair&lt;&#x2F;a&gt;: Pixel Launcherをベースにしたクリーンなラン
チャー。しばらく開発が止まっていたがまた再開した模様。グリッド幅の変
更やアイコンパック対応といった最低限の機能があり、FOSSで
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LawnchairLauncher&#x2F;lawnchair&quot;&gt;GitHub&lt;&#x2F;a&gt;でソースが公開されて
いる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.microsoft.launcher&amp;amp;hl=ja&quot;&gt;Microsoft
Launcher&lt;&#x2F;a&gt;: なぜか多くの人が勧めているランチャー。
個人的に「マイクロソフト」という点が気になり、まだ試していない。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=bitpit.launcher&amp;amp;hl=ja&quot;&gt;Niagara
Launcher&lt;&#x2F;a&gt;: 最近評判の良いランチャー。しかし、サブスクリプションや買い切りでかな
り高額なため、候補から除外。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.bllocosn&amp;amp;hl=ja&quot;&gt;Ratio&lt;&#x2F;a&gt;:
Blloc Phone用に開発されたランチャーで、シンプルなインターフェース。
私は初期にライセンスを購入したため候補に入れているが、
価格的に新規ユーザーには推奨しづらい。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.actionlauncher.playstore&amp;amp;hl=ja&quot;&gt;Action
Launcher&lt;&#x2F;a&gt;: 初期に私も使ってた。Nova
Launcherと同じ方向性で高機能だが、2022年から開発、サポートともに止まって
いる模様。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Android 15での稼働状況を見て、最終的に移行先を決めようと考えています。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Gboard問題&quot;&gt;Gboard問題&lt;&#x2F;h3&gt;
&lt;p&gt;同じくAndroidの日本語入力も問題になっているようです。&lt;&#x2F;p&gt;
&lt;p&gt;Androidでは「Google日本語入力」のサポートが2021年3月末に終了し、
「Gboard」と言う多言語対応の機能に移行しました。
このGboardの使い勝手が悪く、さらに改変されるごとに改悪されているようです。&lt;&#x2F;p&gt;
&lt;p&gt;私自身はスマートフォンでそれほどテキストを入力することもないので、Gboardでもいいかなと思っていますが、一応私が使っても良いかなと思える候補を挙げておきます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atok.com&#x2F;android&#x2F;&quot;&gt;ATOK&lt;&#x2F;a&gt;: 候補としては安心だが、
それほど変換精度が高くないことと、サブスクリプションしかない点が気になる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=jp.co.omronsoft.wnnlab&amp;amp;hl=ja&quot;&gt;Wnn Keyboard Lab&lt;&#x2F;a&gt; : Unixでは昔から使われているWnnのAndroid版であり、買い切り1,200円程度なので良い。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=info.justoneplanet.android.inputmethod.japanese&amp;amp;hl=ja&quot;&gt;flick&lt;&#x2F;a&gt; : 顔文字から発展した無料の日本語入力&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;Amazon_BedRockについて&quot;&gt;Amazon BedRockについて&lt;&#x2F;h2&gt;
&lt;p&gt;Amazon BedRockは、AWSが提供する生成AI向けのマネージドサービスです。最近、日本市場でもその活用事例が徐々に増えてきており、例えば&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;jp&#x2F;blogs&#x2F;news&#x2F;aws-genai-usecases-kddi-agile-minutes&#x2F;&quot;&gt;KDDI&lt;&#x2F;a&gt;が議事録作成の効率化にBedRockを利用するなど、具体的な適用例が出始めています。&lt;&#x2F;p&gt;
&lt;p&gt;Amazon BedRockの主なメリットとして、以下の2点が挙げられます。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;各生成AIモデルのAPI差異の吸収&lt;&#x2F;strong&gt;:
BedRockは、複数のAIプロバイダー（Anthropic、Amazon、AI21 Labs、
Stabilitiy AI等）のモデルに対して統一的なインターフェースを提供する。これ
により、開発者は個々のAPIの違いを意識せずに、様々なモデルを利用・比較でき
るとされている。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AWSエコシステムとの統合&lt;&#x2F;strong&gt;:
AWSの既存サービスとシームレスに連携でき、管理面やコスト面で利点がある。
例えば、IAMを使用した統一的なアクセス管理、CloudWatchを利用したモニタリン
グとロギング、AWSの請求システムを通じた一元的なコスト管理などが可能。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;しかし、各生成AIモデルのAPI差異の吸収というメリットについては、実際のところそれほど大きなアドバンテージにならない可能性があります。多くの生成AIモデルのAPIは基本的な構造が似通っており、レスポンスの処理に多少の違いがあるだけです。この点について、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;ai_api_samples&quot;&gt;サンプルコード&lt;&#x2F;a&gt;を作成して検証してみました。&lt;&#x2F;p&gt;
&lt;p&gt;まとめると、モデル依存性を排除するための利用としては、BedRockのメリットをあまり感じられません。確かに、AWSとの管理面やコスト面での統合によるメリットは存在しますが、一方で新しいAIエンジンへのアクセスが遅くなるというデメリットもあります。&lt;&#x2F;p&gt;
&lt;p&gt;これらの要因を考慮すると、個人利用の場合はBedRockの採用をやや敬遠したい気持ちになります。組織の規模や既存のAWS利用状況、セキュリティ要件などによっては有用な選択肢となる可能性はありますが、個々の状況に応じて慎重に評価する必要があるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;(元AWSですが、特にBedRockに関係した訳ではなく、これはあくまで個人的な見解です。)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自民党総裁選&quot;&gt;自民党総裁選&lt;&#x2F;h2&gt;
&lt;p&gt;自民党総裁選挙が9月27日に予定されています。
政治にそれほど興味があるわけではありませんが、小泉進次郎氏の動向には
楽しめています。&lt;&#x2F;p&gt;
&lt;p&gt;当初「小泉進次郎で総裁選は決まり」のような報道もあったので意外でした。&lt;&#x2F;p&gt;
&lt;p&gt;ただ、露出するごとに評価を落としているようで面白いな思っておっています。
岸田総理に挑む若手と言う構図で改革を大義に名乗りを上げたのに、当の岸田総理が退任表明して大義を失ったのは不運でしたが、その後も露出するごとに迷言を繰り返し、以前の発言も掘り起こされてついに「小泉構文」と言う流行語までできてしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;並べてみると、次の通りでした。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;自民党総裁選挙会見で「改革」を56回連呼&lt;&#x2F;li&gt;
&lt;li&gt;「自分が話している姿を映像で見るのが一番のコミュニケーションの勉強」&lt;&#x2F;li&gt;
&lt;li&gt;「言葉には体温と体重を乗せる」&lt;&#x2F;li&gt;
&lt;li&gt;カナダのトルドー首相、金正恩朝鮮労働党総書記との同世代アピール&lt;&#x2F;li&gt;
&lt;li&gt;「今のままではいけない。だからこそ日本は今のままではいけない」&lt;&#x2F;li&gt;
&lt;li&gt;「何事も1回やってみてください。次にやる時は2回目に。」&lt;&#x2F;li&gt;
&lt;li&gt;「野球部員だった私は水筒を使っていたけど、環境配慮の観点で水筒を使っていなかった。」&lt;&#x2F;li&gt;
&lt;li&gt;「政治に無関心であることは政治に無関心のままでいられる。」&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「何言ってんの？　この人」と笑える中毒性があります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;キッチン改装&quot;&gt;キッチン改装&lt;&#x2F;h2&gt;
&lt;p&gt;25年近く使ってきた自宅のキッチンの排水パイプが壊れたりと不具合がで始めたので思い切ってリフォームをお願いしました。今週から改装に入っています。&lt;&#x2F;p&gt;
&lt;p&gt;25年も経つと個人のニーズの変化やキッチン関連器具の進歩で、結構違うものですね。今回のリフォームのポイントとして、次の３点をテーマとしました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ビルトインの食洗機は5年くらいのサイクルで故障しその度に修理や買い替えで苦労しました。今回は家族も減ったので思い切って食洗機はやめました。&lt;&#x2F;li&gt;
&lt;li&gt;換気扇の油汚れの掃除が手間でしたが、今回は換気扇に特殊なコーティングが施され付着した油はそのままトレーに落ちるので10年間手入れ不要と言うに変えました。&lt;&#x2F;li&gt;
&lt;li&gt;浄水器はBritaのものを使っていましたが、PFASなど心配も多いのでビルトインで浄水器を組み込んでもらいました。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これが人生最後のキッチンリフォームだと思うので、使い勝手がよくなればいいなと思います。&lt;&#x2F;p&gt;
</content>
        <summary type="html">今週気になったのは、Android界隈の動き、Amazon Bedrock、自民党総裁選、自宅のキッチン改装です。</summary>
        </entry><entry xml:lang="en">
        <title>OpenAI o1-preview</title>
        <published>2024-09-17T00:00:00+00:00</published>
        <updated>2024-09-17T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/o1-preview/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/o1-preview/</id>
        
            <content type="html">&lt;p&gt;Currently evaluating OpenAI&#x27;s o1-preview. Although it is said that it is not
always more accurate than GPT-4o, when checked with the &quot;[World Model](https:
&#x2F;&#x2F;github.com&#x2F;SingularitySociety&#x2F;WorldModels&#x2F;)&quot;. It collects problems that
LLMs struggle with, o1-preview correctly solves questions like the following
that GPT-4o gets wrong.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Q1. What happens if you push a door labeled &quot;Pull&quot; from the opposite side?&lt;&#x2F;li&gt;
&lt;li&gt;Q2. A cotton candy is 8 centimeters tall, and a brick is 7 centimeters tall. If you place the brick on top of the cotton candy, what is the total height?&lt;&#x2F;li&gt;
&lt;li&gt;Q3. I left a wallet on a park bench near Shibuya Station for three hours. On that day, the temperature exceeded 39 degrees Celsius, and the wallet was exposed to direct sunlight. What happens to the wallet?&lt;&#x2F;li&gt;
&lt;li&gt;Q4. Do man-eating tigers live in unexplored jungles?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;OpenAIのo1-previewを現在評価しています。GPT-4oより常に精度が高いわけではないと言われていますが、LLMが苦手な問題を集めた「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SingularitySociety&#x2F;WorldModels&#x2F;&quot;&gt;World Model&lt;&#x2F;a&gt;」で確認すると、GPT-4oで不正解となる次のような問題をo1-previewでは正確に解いてしまいます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Q1.「引く」と書かれたドアを反対側から押すとどうるか？&lt;&#x2F;li&gt;
&lt;li&gt;Q2. 綿菓子の高さは8センチ、レンガの高さは7センチである。綿菓子の上にレ
ンガを置くと、全体の高さは何センチになるか？&lt;&#x2F;li&gt;
&lt;li&gt;Q3. 渋谷駅近くの公園のベンチに財布を3時間置き忘れた。
その日は気温が39度を超え、財布は直射日光にさらされていた。
財布はどうなるか？&lt;&#x2F;li&gt;
&lt;li&gt;Q4. 前人未到のジャングルに人喰い虎は生息しているか？&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">OpenAIのo1-previewを現在評価しています。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-09-13</title>
        <published>2024-09-13T00:00:00+00:00</published>
        <updated>2024-09-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/weekly-buzz-20240913/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/weekly-buzz-20240913/</id>
        
            <content type="html">&lt;h2 id=&quot;フジテレビ、「牛の屠殺」発言について&quot;&gt;フジテレビ、「牛の屠殺」発言について&lt;&#x2F;h2&gt;
&lt;p&gt;9月12日の情報番組「ぽかぽか」で高畑淳子さんが通院した病院の対応　を「牛の
屠殺みたいに」と表現しました。これに対して、フジテレビは「職業差別を助長する
恐れがある不適切な表現」として、翌日の番組内で発言の取り消し、謝罪しました。&lt;&#x2F;p&gt;
&lt;p&gt;遡ると1989年には、TBSの「NEWS21」で故・筑紫哲也氏が、麻薬問題で荒れるニューヨークを「残酷な殺し合いの場」として「屠殺場」という言葉を使用し、批判を受けたことがありました。全芝浦屠場労組と全横浜屠場労組がこれに抗議し、筑紫氏は約1年かけて彼らと議論し、自身の発言の差別性を明らかにした上で謝罪しました。&lt;&#x2F;p&gt;
&lt;p&gt;「屠殺」という言葉の使用が差別的であったか考えてみましょう。「屠殺」を推奨される「食肉処理」に置き換えると、そのニュアンスがわかりやすくなります。&lt;&#x2F;p&gt;
&lt;p&gt;筑紫氏の発言では、「残酷な殺し合い＝食肉処理」となり、問題があります。一方、高畑さんの場合、「流れ作業的＝食肉処理」との例えです。これは的確とは言えないものの、差別的な要素があるかは疑問です。一般的に「流れ作業的」なことを工場の「ベルトコンベア」に例えることがありますが、「食肉センター」が合理的で効率的であると指摘することは差別的なのでしょうか。&lt;&#x2F;p&gt;
&lt;p&gt;問題はフジテレビの対応です。主に2点です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;筑紫氏のようにその意図の確認や検証の過程を明らかにせず、「職業差別を助長する恐れがある不適切発言」と断定したこと。&lt;&#x2F;li&gt;
&lt;li&gt;発言者である高畑さんが不在の中で、フジテレビが謝罪したこと。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;これでは、フジテレビが言葉狩りを行い、出演者を「差別的」と断罪し、一方的に謝罪を発信したように見えます。&lt;&#x2F;p&gt;
&lt;p&gt;「屠殺」という言葉は757年に施行された「養老律令」でも使用されていま
す。「謂。元謀屠殺、其計已成、身雖不行、仍為首罪合斬」（屠殺を計画し、その計
画が成立していれば、自ら行動しなくても首謀者として斬刑に処されるべきである）
とあります。このように、「屠殺」とは単に「殺す」という意味であり、差別的な
ニュアンスは含まれてません。現に隣国の中国や韓国でも用語として「屠殺」が普
通に使用されています。&lt;&#x2F;p&gt;
&lt;p&gt;さらに日本の「畜産物衛生管理法」第7条にて「（家畜の&lt;strong&gt;屠殺&lt;&#x2F;strong&gt;等）①家畜の&lt;strong&gt;屠殺&lt;&#x2F;strong&gt;・処理、集油、畜産物の加工・包装及び保管は、第22条第1項により許可を受けた作業場でしなければならない。」と明記されています。一般的な用語であることがわかります。&lt;&#x2F;p&gt;
&lt;p&gt;報道機関などでよく参照される共同通信社の『記者ハンドブック』では「屠殺」は「食肉処理」への言い換えが奨励されいます。差別的な概念を含まず歴史があり隣国も使用し日本でも法令が使用する言葉をなぜか封じ込めようとする。&lt;&#x2F;p&gt;
&lt;p&gt;バカな話です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ChatGPT_o1-previewがリリース&quot;&gt;ChatGPT o1-previewがリリース&lt;&#x2F;h2&gt;
&lt;p&gt;o1-previewがリリースされ使えるようになりました。
これまでのChatGPT o4と比較すると、より深く思考し人間のように時間をかけ
て考える点が異なります。思考プロセスを洗練し、異なる戦略を試しミスを認識しま
す。GPT-4oよりも複雑なタスクを推論し、科学、コーディング、数学の分野でより
難しい問題を解決可能とされています。&lt;&#x2F;p&gt;
&lt;p&gt;試してみたところ、必ずしもChatGPT o4よりも精度が高いとは限らないようです。一般的な言語タスクや幅広い知識を要する課題では素早く対応できるChatGPT o4の方が良い結果となることが多かったです。o1-previewの場合複数のステップで回答を検討していることが示され、時間がかかります。&lt;&#x2F;p&gt;
&lt;p&gt;科学的モデリングや数学的分析について私は馴染みがありませんが、私の利用範囲で言うと課題を与えてプログラムコードを生成させるようなコーディングタスクではo1-previewの方が良い結果になることが多いように思いました。&lt;&#x2F;p&gt;
&lt;p&gt;活用分野により使い分けが必要ですが、従来モデルでは解決できない分野への適用の可能性が広がる点は素晴らしいと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;今更ながらAmazon_Q_Developerを試す&quot;&gt;今更ながらAmazon Q Developerを試す&lt;&#x2F;h2&gt;
&lt;p&gt;8月に発表されたGartner Magic Quadrant for AI Code Assistants
について日本語に記事が出始めました。各社が引用して自社のAIコードアシスタントをアピールしており、
AWSの
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;jp&#x2F;blogs&#x2F;news&#x2F;aws-named-as-a-leader-in-the-first-gartner-magic-quadrant-for-ai-code-assistants&#x2F;&quot;&gt;ブログ記事&lt;&#x2F;a&gt; でもその様子が見られます。&lt;&#x2F;p&gt;
&lt;p&gt;この分野でリードしているのはやはりGitHub Copilotです。Google CloudのGemini Code AssistやGitLabのDuoなども追いかけています。&lt;&#x2F;p&gt;
&lt;p&gt;AAWSも取り上げられていますが、Cloud9など一部のサービスが新規利用不可になっ
ている中で「今更CodeWhisper？」と思いました。しかし、4月末からCodeWhisper
はAmazon Q Developerに統合されていたことを思い出しました。対応しているIDE
はVisual Studio Code、IntelliJ IDEA、AWS Cloud9ですが、私が使っている
NeoVimはサポートされていません。一方、Amazon Q Developerは
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.aws.amazon.com&#x2F;ja_jp&#x2F;amazonq&#x2F;latest&#x2F;qdeveloper-ug&#x2F;command-line-getting-started-installing.html&quot;&gt;Macのコマンドラインをサポート&lt;&#x2F;a&gt;しており、iTerm2、macOSターミナル、Hyper、Alacritty、Kitty、wezTermと主なターミナルに対応しています。&lt;&#x2F;p&gt;
&lt;p&gt;試していなかったので、Macに導入してみました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI Completions&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
シェルでコマンド補完ができる機能。オンにするだけで、コマンドのオプションや
引数、ファイル名などを賢く補完してくれる。非常に便利。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Chat&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
&lt;code&gt;q chat&lt;&#x2F;code&gt;で開始できる。コマンド履歴やGitの状態を渡して「Gitのコンフリ
クトをどう解消する？」などと尋ねると、解決方法を解説してくれる。ただし、英
語のみの対応となる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Translate&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
&lt;code&gt;q translate&lt;&#x2F;code&gt;で起動し、英語でやりたいことを入力すると、対応するコマンドに
変換してくれる。例えば、&lt;code&gt;go to Desktop folder&lt;&#x2F;code&gt;と入力すると、&lt;code&gt;cd ~&#x2F;Desktop&lt;&#x2F;code&gt;
というコマンドを生成して実行するか確認してくれる。便利なのかは微妙である。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私が使用しているNeoVimには対応していないため、コーディングのアシストには使えませんが、コマンドラインの補完機能は割と便利なので利用しています。ちなみに、NeoVim上でのコードアシストにはCodeiumを使っています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;個人のタスク管理について&quot;&gt;個人のタスク管理について&lt;&#x2F;h2&gt;
&lt;p&gt;個人のタスク管理で&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rememberthemilk.com&#x2F;&quot;&gt;Remember The Milk&lt;&#x2F;a&gt;を15年ぶりに使い始めました。&lt;&#x2F;p&gt;
&lt;p&gt;GTD&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; が流行り出した頃 &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rememberthemilk.com&#x2F;&quot;&gt;Remember The Milk&lt;&#x2F;a&gt;を使っていましたが、徐々に物足りなくなり以下のツールへと変遷してきました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;本格的なGTDツールとして&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.omnigroup.com&#x2F;omnifocus&#x2F;&quot;&gt;OmniFocus&lt;&#x2F;a&gt;をしばらく使ったが、GTDに忠実過ぎて使い勝手が悪くなりやめた。&lt;&#x2F;li&gt;
&lt;li&gt;次にローカルでプレーンテキスト管理ができる&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.taskpaper.com&#x2F;&quot;&gt;Taskpaper&lt;&#x2F;a&gt;をしばらく試した。コンセプトは素晴らしいものの、ファイル名を指定してタスクファイルを開いたり保存する操作が面倒でやめた。&lt;&#x2F;li&gt;
&lt;li&gt;最終的にブラウザベースの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.toodledo.com&#x2F;&quot;&gt;Toodledo&lt;&#x2F;a&gt;を長期間使用した。柔軟なツールで、非常に使いやすかった。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;今はプロジェクト管理をすることもなくプライベートなタスクを管理できれば良いのでシンプルなツールが良いと感じ、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rememberthemilk.com&#x2F;&quot;&gt;Remember The Milk&lt;&#x2F;a&gt;を再び使い始めました。
初期のGTDコンセプトをベースにしたサービスですが、今でも優れた機能を提供しています。
GTDを柔軟に運用できる点が魅力です。特に気に入っている点は以下です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;不要なものを視界から排除したシンプルなユーザーインターフェイス&lt;&#x2F;li&gt;
&lt;li&gt;多くのショートカットがより、慣れるとマウスなしで操作できる&lt;&#x2F;li&gt;
&lt;li&gt;テキストだけでスマートなタスク登録が可能。「新店舗取材 ^Friday ~Sunday =1hour #weblog」と入力すると、開始日が金曜日、期限が日曜日、1時間程度のweblog関連タスクとして登録される&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;また、CalDavを利用して完了日をイベントとして取得し、Fastmailのカレンダーでタスク期限を確認しています。&lt;&#x2F;p&gt;
&lt;p&gt;無料版でも十分ですが、サービスへの支援としてPro版に移行しました。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;「Getting Things Done」の略で、デビッド・アレンによって提唱されたタスク管理や生産性向上のためのメソッド。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">今週の気になった記事や出来事は、フジテレビ「牛の屠殺」発言、CharGPT o1-previewリリース、Amazon Q Developer、個人のタスク管理についてです。</summary>
        </entry><entry xml:lang="en">
        <title>生成AIハイプ・サイクル</title>
        <published>2024-09-11T00:00:00+00:00</published>
        <updated>2024-09-11T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/ai-hype-cycle/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/ai-hype-cycle/</id>
        
            <content type="html">&lt;p&gt;幻滅期に入っているとも言われますが、「マルチモーダル」はAIの使い勝手を劇的に変えてくれます。
すでに業界をリードするOpenAI&#x2F;Microsoft、Google、Anthropicの御三家は「マルチモーダル」をリリース済みですが、やはりOpenAIの使い勝手がよいようでです。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;japan.zdnet.com&#x2F;article&#x2F;35223718&#x2F;&quot;&gt;
  同ハイプ・サイクルにおいて、「マルチモーダル生成 AI」は「オープンソースの
  大規模言語モデル（LLM）」とともに、「早期に採用することで顕著な競争優位性
  と市場投入までの期間短縮をもたらす可能性があるテクノロジー」として取り上げ
  られている。その上で、両技術とも今後 5 年以内に組織に大きな影響を及ぼす可
  能性を秘めているとしている。
  &lt;footer&gt;
    &lt;cite&gt;
      &lt;a href=&quot;https:&#x2F;&#x2F;japan.zdnet.com&#x2F;article&#x2F;35223718&#x2F;&quot;&gt;
        ZDNET - ガートナー、「生成 AI のハイプ・サイクル：2024 年」を発表
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">ガートナージャパンは9月10日、「生成AIのハイプ・サイクル：2024年」を発表したようです。</summary>
        </entry><entry xml:lang="en">
        <title>報道機関のリンクポリシー</title>
        <published>2024-09-10T00:00:00+00:00</published>
        <updated>2024-09-10T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/link-policy-of-news/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/link-policy-of-news/</id>
        
            <content type="html">&lt;p&gt;2000年代と違って少しはまともになってきたようです。
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nhk.or.jp&#x2F;faq-corner&#x2F;4housoubangumi&#x2F;05&#x2F;04-05-11.html&quot;&gt;NHK&lt;&#x2F;a&gt;、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nikkei.com&#x2F;info&#x2F;link.html&quot;&gt;日本経済新聞&lt;&#x2F;a&gt;、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mainichi.jp&#x2F;info&#x2F;link&#x2F;&quot;&gt;毎日新聞&lt;&#x2F;a&gt;、&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sankei.jp&#x2F;inquiry&#x2F;use-text&quot;&gt;産経新聞&lt;&#x2F;a&gt;などは、基本的には「ご自由に」というスタンスで常識的。&lt;&#x2F;p&gt;
&lt;p&gt;異なるのが朝日新聞社。リンク自由とは記載があるものの、申告が必要とされている。&lt;&#x2F;p&gt;
&lt;blockquote cite=&quot;https:&#x2F;&#x2F;www.asahi.com&#x2F;policy&#x2F;link.html&quot;&gt;
  朝日新聞デジタルにリンクを張った際は、そのサイトの内容とアドレス及びリンク
  の趣旨 , お名前 , ご連絡先 , 下記の注意事項を了解した上でリンクした旨などを記
  載しお問い合わせフォームからお知らせください。
  &lt;footer&gt;
    &lt;cite&gt;
      &lt;ul&gt;
        &lt;li&gt;
          朝日新聞デジタル{&quot; &quot;}
          &lt;a href=&quot;https:&#x2F;&#x2F;www.asahi.com&#x2F;policy&#x2F;link.html&quot;&gt;リンクについて&lt;&#x2F;a&gt;
        &lt;&#x2F;li&gt;
      &lt;&#x2F;ul&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">ちょっと必要があって報道各社のリンクポリシーを確認しました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-09-06</title>
        <published>2024-09-06T00:00:00+00:00</published>
        <updated>2024-09-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/09/weekly-buzz-20240906/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/09/weekly-buzz-20240906/</id>
        
            <content type="html">&lt;p&gt;今週の気になった記事や出来事は次の3つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;閉店予定のイトーヨーカドー津田沼店を見て感じたGMSの終焉&lt;&#x2F;li&gt;
&lt;li&gt;NVIDIA株急落&lt;&#x2F;li&gt;
&lt;li&gt;米不足についての調査と考察&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;閉店予定のイトーヨーカドー津田沼店を見て感じたGMSの終焉&quot;&gt;閉店予定のイトーヨーカドー津田沼店を見て感じたGMSの終焉&lt;&#x2F;h2&gt;
&lt;p&gt;今週は閉店予定の津田沼のイトーヨーカドーを見てきました。&lt;&#x2F;p&gt;
&lt;p&gt;感じたのはかつて「そこに行けば何でもある」とういGMSという形態の終焉です。モノが
あれば売れる時代が終わり、欲しいモノしか買わない消費者に対してGMSは「なんでもあ
るが、欲しいモノはない」場所になってしまいました。&lt;&#x2F;p&gt;
&lt;p&gt;今回津田沼店だけでなく全国で33店舗を閉店し構造改革に取り組んでいるイトーヨー
カドーですが、方針として「衣料品の縮小と食への注力」「首都圏店舗への絞り込み」
がポイントのようです。衣料品は祖業であるだけに既に方針が揺れておりアダストリア
との協業で新ブランドを立ち上げるなど既に方針がブレています。「首都圏店舗への絞
り込み」は大型SCとの競合をさけたのでしょうが、そこには安さに特化してすさまじい
成長を見せているオーケーやロピア、GMSを目指さず食品＋生活必需品の品揃えで勝負し
てきたライフやベルクなどがせめぎあっており道ではありません。&lt;&#x2F;p&gt;
&lt;p&gt;津田沼店を見ると老人が多い中セルフレジしかない、ざっと商品を見ても陳列が悪く商
品を捜しにくいなど、消費者目線では色々問題がありそうです。更に縮小していくので
はないかと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;NVIDIA株急落&quot;&gt;NVIDIA株急落&lt;&#x2F;h2&gt;
&lt;p&gt;先週10月くらいまでは上昇相場を期待できるのでは
と述べたばかりですが、9月
3日に9.5%の下落で米国過去最大の2,790億ドル減という記録まで作ってしまいました。
同社の業績がアナリストの予想を上回ったものの投資家の期待に届かなかったことが契
機で下落を始めましたが、下落したことで更に投資への不安が形となって現れたよ
うです。&lt;&#x2F;p&gt;
&lt;p&gt;一方で不安要素は、3点です。&lt;&#x2F;p&gt;
&lt;p&gt;まず、特定企業4社に売上が依存している点です。この4社はMicrosoft、Meta、Amazon、
Googleと見られています。つまりAIを牽引する4社です。従って、同社がAIブームに依存
し過ぎている点は確かで、Amazonが自社AIチップTriniumを進めているようにGoogle、
Metaも自社AIチップに舵を切っています。同社のGPUの需要は時限的で数年後に
はこの分野でのシェアを下げていくことは確かです。&lt;&#x2F;p&gt;
&lt;p&gt;2点目は反トラスト法違反の可能性です。&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bloomberg.com&#x2F;&quot;&gt;Bloomberg&lt;&#x2F;a&gt;の記事&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
によると司法省は取引先企業に文章提出令状を提出し本格的な調査を始めたようです。
実際GPU品薄の状況でサーバーとの抱き合わせ販売をしているとの話もあります。状況に
より政府による介入もあり得るので、こちらの方が心配ですね。&lt;&#x2F;p&gt;
&lt;p&gt;3点目はAI製品の熟成です。AIは大量データから機械学習モデルを構築する「学習プロセ
ス」と既にあるモデルを用いて新しいデータに対する予測や分類する「推論プロセ
ス」に大きく大別できます。ゲームのグラフィック計算に用いられていたGPUは高い並行
処理能力や高速で大量メモリアクセスなどが「学習プロセス」の処理に向いており
NVIDIAのGPUが用いられてきました。AI製品が熟成するにつれ「推論プロセス」の比重が
大きくなってきますが、高い計算能力や並列処理能力よりは、単一タスクのレイテン
シーのほうが重視される傾向となりNVIDIAが得意なGPUとは特性が異なります。&lt;&#x2F;p&gt;
&lt;p&gt;こうしたことから、長期的には「学習プロセス」ではメインプレイヤーであり続けると
思いますが、AI全体で見るとNVIDIAの存在感は相対的に薄れていくでしょう。AI市場自
体の拡大もあるのでまだ成長はあると思いますが、現状の評価が過剰であることは間違
いありません。ただ、直近は現行のGPUは順調に売り上げており次世代のBlackwellとい
うGPUも控えており、個人的にはまだ勢いが衰えたとは言えずそこまで悲観的には考えて
いないです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;米不足についての考察&quot;&gt;米不足についての考察&lt;&#x2F;h2&gt;
&lt;p&gt;昨今「米不足」と騒がれスーパーに行ってもお米が売り切れになっており買うことが出来ない状況もしばしば見受けられます。米の価格の上昇も地域によっては見受けられるようです。&lt;&#x2F;p&gt;
&lt;p&gt;米不足の原因について「インバウンドの増加」との報道もありますが、とてもインバウ
ンド増加が米不足の原因とは思えません。農林水産省の「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.maff.go.jp&#x2F;j&#x2F;seisan&#x2F;kikaku&#x2F;kome_siryou.html&quot;&gt;米をめぐる参考資料&lt;&#x2F;a&gt;」を見る限り米の需要
は減り続けています。観光局の「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jnto.go.jp&#x2F;statistics&#x2F;data&#x2F;visitors-statistics&#x2F;&quot;&gt;訪日外来客統計&lt;&#x2F;a&gt;」を見ると、イン
バウンドは昨年に比べると7月で230万人→330万人と増えてはいますが、冷静に考えてみ
ましょう。月約100万人の訪日者が1年を通して増加し、これらの訪日者が平均2週間滞在
し3食とも米を食べたとします。1食当たり150gだとすると、インバウンドによる米消費
の増加は75,600tで昨年の主食用収穫量6,610,000tの内1.14%に過ぎません。3食とも米と
いうのは珍しく滞在期間ももう少し短いでしょうから、現実には1.0%以下でしょう。と
ても全体に影響する増加とは思えません。&lt;&#x2F;p&gt;
&lt;p&gt;「酷暑での不作」とも言われています。最近は「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.e-stat.go.jp&#x2F;&quot;&gt;政府統計の総合窓口 e-Stat&lt;&#x2F;a&gt;」で統計情報を確認できるので、確認してみましょう。農林水産省の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.maff.go.jp&#x2F;j&#x2F;tokei&#x2F;kouhyou&#x2F;sakumotu&#x2F;sakkyou_kome&#x2F;index.html#suitou&quot;&gt;作況調査&lt;&#x2F;a&gt;から確認できます。このデータで確認する昨年の10a当たり収穫の作況指
数は&lt;strong&gt;101&lt;&#x2F;strong&gt;です。平年並で特に不作という訳ではありません。&lt;&#x2F;p&gt;
&lt;p&gt;この統計を見ていて気付くのは、作付面積が2022年から2023年にかけて136万haから
135万haと1万ha減り、収穫量も10万トン近く減っています。このインバウンドが月当たり130万人増えたと同等のインパクトです。念のため統計で最も古い
2004年と比較すると、収穫量は1,565千トン減で月当たり
2,000万人のインバウンド増加のインパクトです。&lt;&#x2F;p&gt;
&lt;p&gt;結局、根本的には減反政策により米の生産量自体が落ちていることが問題で、ちょっとした需給のバランスで価格高騰したり品不足になったりという状況なのでしょう。安倍内閣の時に減反をやめたと認識していましたが、目標値設定がなくなっただけで減反に伴う補助金は出続けており事実上継続されています。そもそも需給がバランスしておらず、農林水産省の「&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.maff.go.jp&#x2F;j&#x2F;council&#x2F;seisaku&#x2F;syokuryo&#x2F;240305&#x2F;attach&#x2F;pdf&#x2F;240305-15.pdf&quot;&gt;米の消費および生産の近年の動向について&lt;&#x2F;a&gt;」という資料を見ると、2023年の需要量が691万トンに対して主食向け収穫量が661万トンです。そう、ベースとして&lt;strong&gt;米の収穫量が足りていない&lt;&#x2F;strong&gt;のです。&lt;&#x2F;p&gt;
&lt;p&gt;結局米価格を高止まりさせて、農家が減反して水田を売却したお金が預金されるというJA農協にとっては蜜の味の状況なのでしょう。バカな話です。今年の収穫が始まり、米不足が解消されると言いますが、データだけ見るとちょっと信じがたいです。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;元記事は削除または移動された可能性があります &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">今週、気になったのは、イトーヨーカドー閉店、NVIDIA株急落、米不足です。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-08-30</title>
        <published>2024-08-30T00:00:00+00:00</published>
        <updated>2024-08-30T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/weekly-buzz-20240830/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/weekly-buzz-20240830/</id>
        
            <content type="html">&lt;p&gt;今週の気になった記事や出来事は次の4つです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;NVIDIA株価下落と米国経済&lt;&#x2F;li&gt;
&lt;li&gt;Telegram CEOのフランス政府による逮捕&lt;&#x2F;li&gt;
&lt;li&gt;史上最強クラス台風10号上陸&lt;&#x2F;li&gt;
&lt;li&gt;採譜ソフトウェアの定番Finaleのフィナーレ&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;NVIDIA株価下落と米国経済&quot;&gt;NVIDIA株価下落と米国経済&lt;&#x2F;h2&gt;
&lt;p&gt;米国時間8&#x2F;28の市場閉場後に注目されていたNVIDIAの株価ですが、
時間外取引で6％程度下落しました。
Magnificent7の中でも急成長しているNVIDIAの株価下落は、今後の米国
経済の悪化の予兆のような論調もありますが、私自身は楽観しています。&lt;&#x2F;p&gt;
&lt;p&gt;決済自体を見ると売上は予想を上回り過去1年で122%の成長を遂げています。
確かに成長自体は鈍化しています。
しかし、利益率は高い水準を維持しています。むしろ投資家のNVIDIAへの
期待が高すぎた状態であったために、調整するフェーズに入ったと見ています。&lt;&#x2F;p&gt;
&lt;p&gt;また、Magnificent7が米国の成長を牽引しているとも言われますが、NVIDIAの株価と
S&amp;amp;P500の動きはそこまで相関があったわけでもありません。株価は下落したものの、ビ
ジネス自体は成長しており、AIを中心としたエコシステムが崩壊するような状況でもあ
りません。
9月には利上げが予想されるので、10月くらいまでは上昇相場を期待できるのではないかと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Telegram_CEOのフランス政府による逮捕&quot;&gt;Telegram CEOのフランス政府による逮捕&lt;&#x2F;h2&gt;
&lt;p&gt;パヴェル・ドゥーロフCEOは2024年8月24日に、パリ郊外のル・ブルジェ空港で逮捕されました。プライベートジェットで着陸してきたところを滑走路上で逮捕されたというのでかなり異例な状況だったのではないでしょうか？&lt;&#x2F;p&gt;
&lt;p&gt;容疑は「Telegramアプリを通じて行われている麻薬密売・マネーロンダリング・児童ポルノといった犯罪行為の共犯」ということですが、気になった点が3つありました。&lt;&#x2F;p&gt;
&lt;p&gt;まず第一に「これはフランス版Winny事件か？」と思いました。Telegramというメッセージアプリは確かにテロ組織で使われていると言われています。まだ詳細が不明なのでなんとも言えませんが、Telegramというプラットフォームを提供しているだけで「共犯」とされているのであれば、とんでもないことです。正に日本のWinny事件の二の舞いになりかねません。&lt;&#x2F;p&gt;
&lt;p&gt;第二にフランスという国のスタンスです。UAE国籍だったドゥーロフCEOにフランスのマクロン大統領が2018年のランチミーティングでTelgram本社のパリ移転と国籍付与を提案して、2021年に国籍取得という経緯を見るとズブズブだと思っていたのですが、今回のこの逮捕はなんなのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;第三にフランスとUAEがドゥーロフCEOのiPhoneをハッキングしていたという話もあります。Telegramは暗号化に強いというイメージがありますが、E2Eの暗号化をしていないので穴だらけです。さもありなんという印象です。
以下はよく比較されるメッセージングアプリの比較です。&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Provider&lt;&#x2F;th&gt;&lt;th&gt;オープンソース&lt;&#x2F;th&gt;&lt;th&gt;E2E暗号化&lt;&#x2F;th&gt;&lt;th&gt;セキュリティ監査&lt;&#x2F;th&gt;&lt;th&gt;暗号化されたビデオ通話&lt;&#x2F;th&gt;&lt;th&gt;Anonymous&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Signal&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Threema&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Telegram&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;td&gt;✔️&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;こう見るとTelgramは暗号化もE2Eではされておらず、本当にテロ組織が使っているかと怪しく思います。&lt;&#x2F;p&gt;
&lt;p&gt;ちなみに私はスイス産のThreemaをメインで使用しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;史上最強クラス_台風10号上陸&quot;&gt;史上最強クラス 台風10号上陸&lt;&#x2F;h2&gt;
&lt;p&gt;今週は水曜から史上最強クラスと言われる台風10号(ShanShan)が九州に上陸し、週明けにかけて日本列島を縦断していきそうです。歩みの遅い台風でなので、いつ両親の住む地域や私の住む関東に近づいてくるか神経質なくらいチェックしてしまいます。&lt;&#x2F;p&gt;
&lt;p&gt;気象庁やWeatherNewsのサイトではなかなか思った情報がタイムリーに得られないこともあるので、気象情報を提供するサイトをいくつか試してみました。気に入ったのはWindy.comとVentuskyです。&lt;&#x2F;p&gt;
&lt;p&gt;どちらもチェコ発のサービスですが、どちらも予報に特化しておらず詳細な気象情報をビジュアルなグラフィックで提供してくれる点が一方的な情報を垂れ流してくる日本の気象ニュースと違って私のニーズにあっています。またグローバルの予報モデルを複数サポートしている点が気象庁情報に大きく依存している日本のサイトよりも気に入っています。&lt;&#x2F;p&gt;
&lt;p&gt;どちらも機能的には拮抗しているように思いますが、次の3点からWindy.comを使用しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Windy.comにはタイフーントラッカーという台風に特化したメニューがある&lt;&#x2F;li&gt;
&lt;li&gt;Windy.comは今年から気象庁モデルにも対応を開始した&lt;&#x2F;li&gt;
&lt;li&gt;Ventuskyの有料サービスはGoogle&#x2F;Apple経由でしか購入できないが、Windy.comはクレジットカードやPayPal経由で支払いができる。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;台風進路など気象庁モデルとヨーロッパのECMWFでは結構違うので参考にあります。
有料サービスを購入すると1時間のメッシュで細かい予報も見ることが可能なので普段の生活でも役立ちそうです。&lt;&#x2F;p&gt;
&lt;p&gt;ビジュアルにアニメーションもついているので、スクリーンセーバー的に眺めていても飽きることがありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;採譜ソフトウェアの定番_Finaleのフィナーレ&quot;&gt;採譜ソフトウェアの定番 Finaleのフィナーレ&lt;&#x2F;h2&gt;
&lt;p&gt;採譜ソフトウェアの定番Finaleが開発・販売を中止することが発表され、採譜の世界で
はデファクトスタンダードだったので業界は混乱しているようです。&lt;&#x2F;p&gt;
&lt;p&gt;曲の配布や演奏に「採譜」というプロセスが必要だった時代から、作曲過程からデジタ
ル化され演奏まで直結できる現代において「採譜」の占める役割が大きく変わっていま
す。デジタル化されているので作曲データをそのまま採譜として利用も可能で
す。&lt;&#x2F;p&gt;
&lt;p&gt;だからこそ「採譜」という領域にこだわって突き詰めたFinaleは存在価値があったので
すが、採譜自体のニーズの低下に伴い他のソフトウェアの採譜機能で十分という状況は
必然でしたね。&lt;&#x2F;p&gt;
</content>
        <summary type="html">今週は、NVIDIA関連、Telegram CEO逮捕、台風などを扱います。</summary>
        </entry><entry xml:lang="en">
        <title>AWS ALBの脆弱性？</title>
        <published>2024-08-28T00:00:00+00:00</published>
        <updated>2024-08-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/vulnerability-aws-alb/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/vulnerability-aws-alb/</id>
        
            <content type="html">&lt;blockquote&gt;
&lt;p&gt;First, the attacker creates their own ALB instance with authentication
configured in their account. The attacker then uses this ALB to sign a
token they fully control. Next, the attacker alters the ALB configuration
and sets the issuer field to the victim&#x27;s expected issuer. AWS
subsequently signs the attacker&#x27;s forged token with the victim&#x27;s issuer.
Finally, the attacker uses this minted token against the victim&#x27;s
application, bypassing both authentication and authorization.&lt;&#x2F;p&gt;
&lt;p&gt;まず、攻撃者は自身のアカウント内に認証を設定した独自の ALB インスタンスを作成します。
次に、この ALB を使用して、攻撃者が完全に制御できるトークンに署名します。
その後、攻撃者は ALB の設定を変更し、発行者フィールドを被害者が期待する発行者に設定します。
AWS はその結果、攻撃者が偽造したトークンに対して、被害者の発行者として署名を行います。
最後に、攻撃者はこの生成されたトークンを使用して被害者のアプリケーションに対して攻撃を仕掛け、認証と認可の両方を回避します。&lt;&#x2F;p&gt;
&lt;cite&gt;
  [ALBeast Security Advisory by Miggo Research |
  Miggo](https:&#x2F;&#x2F;www.miggo.io&#x2F;resources&#x2F;albeast-security-advisory-alb-vulnerability)
&lt;&#x2F;cite&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;「AWS ALBの脆弱性」と騒がれているけれど、普通にIssuerの検証、JWTトークンの検証、ALBのトラフィックの制限、セキュリティグループの設定をやっていれば関係なくない？「AWS ALBの&lt;strong&gt;ベストプラクティスを無視した間抜けが作ったアプリ&lt;&#x2F;strong&gt;の脆弱性」では？&lt;&#x2F;p&gt;
</content>
        <summary type="html">AWS ALBの脆弱性と騒がれているが・・・</summary>
        </entry><entry xml:lang="en">
        <title>Finaleがフィナーレを迎える</title>
        <published>2024-08-27T00:00:00+00:00</published>
        <updated>2024-08-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/finale-discontinued/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/finale-discontinued/</id>
        
            <content type="html">&lt;p&gt;採譜ソフトのFinaleが開発・販売を終了するそうです。&lt;&#x2F;p&gt;
&lt;p&gt;音楽はざっくり言うと作曲-&amp;gt;アレンジ-&amp;gt;採譜-&amp;gt;演奏というプロセスが必要ですが、
「採譜」というプロセスは現代では端折られることも多いし、
何か新しい革新があるわけでもないから「incremental value for our customers」
が無くなったというのは確かにそうなんだろうと思います。&lt;&#x2F;p&gt;
&lt;p&gt;ただ日本のクラシック音楽界隈ではデファクトスタンダードなどで、関係者には
「Finaleがフィナーレを迎えた」などと冗談を言える雰囲気ではないくらい深刻なよ
うです。&lt;&#x2F;p&gt;
&lt;p&gt;The music notation software Finale will be discontinued in terms of
development and sales.
In music, the general process involves:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;composition&lt;&#x2F;li&gt;
&lt;li&gt;arrangement&lt;&#x2F;li&gt;
&lt;li&gt;notation&lt;&#x2F;li&gt;
&lt;li&gt;performance&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, the notation process is often skipped in modern times, and since there hasn&#x27;t been any significant innovation in this area, it&#x27;s understandable.
They feel there is &quot;no incremental value for our customers&quot; anymore.
That said, Finale is the de facto standard in Japan&#x27;s classical music community.
So for those involved, it&#x27;s not exactly a laughing matter where they can joke that &quot;Finale has reached its finale.&quot;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
  Today, Finale is no longer the future of the notation industry—a reality after
  35 years, and I want to be candid about this. Instead of releasing new
  versions of Finale that would offer only marginal value to our users, we’ve
  made the decision to end its development.
  &lt;footer&gt;
    &lt;cite&gt;
      {&quot; &quot;}
      the finale blog -{&quot; &quot;}
      &lt;a href=&quot;https:&#x2F;&#x2F;www.finalemusic.com&#x2F;blog&#x2F;end-of-finale-new-journey-dorico-letter-from-president&#x2F;&quot;&gt;
        {&quot; &quot;}
        The End of Finale
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
</content>
        <summary type="html">採譜アプリとして有名なFinaleが開発・販売を修了するそうです。</summary>
        </entry><entry xml:lang="en">
        <title>RICOH GR IIIx HDF</title>
        <published>2024-08-27T00:00:00+00:00</published>
        <updated>2024-08-27T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/richo-gr-iiix/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/richo-gr-iiix/</id>
        
            <content type="html">&lt;p&gt;久しぶりにデジタルカメラを購入しました。RICOH GR IIIx HDFです。&lt;&#x2F;p&gt;
&lt;p&gt;以前持っていた初代GR DIGITALと比べると、画質の向上には驚かされました。まるで一眼レフに匹敵するほどです。
しかも、このカメラのベースとなっているモデルは、実は5年前のものなのです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;08&amp;#x2F;richo-gr-iiix&amp;#x2F;R0000316.jpg?h=2d3561b7f6342dd089ba&quot;
  alt=&quot;Sample photo taken with the GR IIIx&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">デジタルカメラを買いました。久しぶりのRICOH GRです。</summary>
        </entry><entry xml:lang="en">
        <title>Oyama Senmaida(大山千枚田)</title>
        <published>2024-08-26T00:00:00+00:00</published>
        <updated>2024-08-26T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/oyama-senmaida/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/oyama-senmaida/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;08&amp;#x2F;oyama-senmaida&amp;#x2F;R0000090.jpg?h=f138a1ae1ec463511f48&quot;
  alt=&quot;&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;08&amp;#x2F;oyama-senmaida&amp;#x2F;R0000093.jpg?h=197c8c5faa6f779de2ad&quot;
  alt=&quot;&quot; width=&quot;1800&quot; height=&quot;1200&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;I visited &lt;strong&gt;Oyama Senmaida(大山千枚田)&lt;&#x2F;strong&gt; in Chiba Pref, Japan. These
terraced rice fields, dating back to before the 1600s, are ingeniously built
on hillside slopes, forming 30 levels with 375 paddies still in use today.
They are the quintessential rural landscape of Japan.&lt;&#x2F;p&gt;
</content>
        <summary type="html">美しい棚田が並ぶ大山千枚田に入ってきました。</summary>
        </entry><entry xml:lang="en">
        <title>こだわりのNostr Pubkeyを手に入れる</title>
        <published>2024-08-25T00:00:00+00:00</published>
        <updated>2024-08-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/pubkey-of-nostr/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/pubkey-of-nostr/</id>
        
            <content type="html">&lt;p&gt;NostrでVanity pubkeyのMiningをやってみました。
プリフィックスに&lt;code&gt;yostos&lt;&#x2F;code&gt;と近い&lt;code&gt;y0st0s&lt;&#x2F;code&gt;を得るため、&lt;code&gt;rana&lt;&#x2F;code&gt;を使って数時間Miningしました。&lt;&#x2F;p&gt;
&lt;p&gt;得られた、Pubkeyが&lt;code&gt;npub1y0st0svvu5xg6dvswx7dz5m2p7004kmvsx6n22w4yjp3l6fa3mvsef2zz7&lt;&#x2F;code&gt;で、npub1に続く部分が&lt;code&gt;y0st0s&lt;&#x2F;code&gt;となっています。自己満足ですが。&lt;&#x2F;p&gt;
&lt;p&gt;ranaのインストールと使い方は次の通りです。Rustの実行環境が事前に必要です。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install rana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;rana&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; --vanity-n-prefix y0st0s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Started&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; mining process for vanity bech32 prefix[es]: &amp;#39;npub1[&amp;quot;y0st0s&amp;quot;]&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (estimated&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; pow:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 24&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Benchmarking&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; of cores disabled for vanity npub key upon proper calculation.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Mining&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; using&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 14&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cores...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Vanity npub found: y0st0s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Found matching Nostr public key:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Hex public key: 23e0b7c18ce50c8d359071bcd1536a0f9efadb6c81b53529d524831fe93d8ed9&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Hex private key: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Npub public key: npub1y0st0svvu5xg6dvswx7dz5m2p7004kmvsx6n22w4yjp3l6fa3mvsef2zz7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;Nsec private key: nsec1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;2597711770 iterations (about 2x10^9 hashes) in 3433 seconds. Avg rate 756688 hashes&#x2F;second&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;プリフィックスに指定する桁数が増えるほどマイニングに時間がかかるので注意しましょう。上記の例ではM3 MAXのMacbook Proで1時間ほどかかりました。&lt;&#x2F;p&gt;
&lt;p&gt;また、PubkeyはNative SegWit(Bech32)でエンコードされており、小文字でl,b,i,oを除いた32文字しか使えません。これらの文字については数字などに置き換えて指定する必要があります（yostos-&amp;gt;y0st0sなど）&lt;&#x2F;p&gt;
</content>
        <summary type="html">Nostrで自分の好きなPubkeyを入手するためにがんばってみました。</summary>
        </entry><entry xml:lang="en">
        <title>Weekly Buzz🐝 2024-08-25</title>
        <published>2024-08-25T00:00:00+00:00</published>
        <updated>2024-08-25T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/weekly-buzz-20240824/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/weekly-buzz-20240824/</id>
        
            <content type="html">&lt;h2 id=&quot;『劇場総集編_ぼっち・ざ・ろっく_Re:Re:』鑑賞からの考察&quot;&gt;『劇場総集編 ぼっち・ざ・ろっく Re:Re:』鑑賞からの考察&lt;&#x2F;h2&gt;
&lt;p&gt;今週は『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bocchi.rocks&#x2F;&quot;&gt;劇場総集編 ぼっち・ざ・ろっくRe:Re:&lt;&#x2F;a&gt;』を見てきました。
平日だったので観客はまばらでしたが、
公開4日で興収2.5億円突破という記事もあったのでヒットしているのでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;「ギターヒーロー不在の時代」とも言われますが、『ぼっち・ざ・ろっく』ではギター
ヒーローとも言えるYouTubeで10万人近い登録者を持つ凄腕の女子高生ギタリストの
主人公後藤ひとりが、高校生活を通じてバンド活動で成長してく様が描かれています。&lt;&#x2F;p&gt;
&lt;p&gt;よい機会なので現代の「ギターヒーロー」について考察していました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ギターヒーロー不在の時代&quot;&gt;ギターヒーロー不在の時代&lt;&#x2F;h3&gt;
&lt;p&gt;かつて、ギターヒーローとは1970〜80年代のジミー・ペイジやエディ・ヴァン・ヘイレ
ンのように、卓越した技術や個性的な演奏スタイルを持ち、ギターソロで人々を魅了す
るギタリストを指していました。しかし、1990年代後半以降、こうしたギタリストは少
なくなっています。&lt;&#x2F;p&gt;
&lt;p&gt;その理由としては、以下が挙げられます。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;機材の進化が停滞し、ギターが音楽の革新の中心でなくなった。&lt;&#x2F;li&gt;
&lt;li&gt;新しい奏法が出尽くし、ギタリスト間での差別化が難しくなった。&lt;&#x2F;li&gt;
&lt;li&gt;音楽ジャンルの多様化により、バンドでのギターの役割が相対的に小さくなった。&lt;&#x2F;li&gt;
&lt;li&gt;ショーの形態が変わり(コンサートからフェス)、リードギターの見せ場が減少した。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;「ギターヒーロー不在の時代」とも言われる今、後藤ひかりはどのような「ギターヒーロー」として描かれるのでしょうか？&lt;&#x2F;p&gt;
&lt;h3 id=&quot;後藤ひかりのギタリスト像&quot;&gt;後藤ひかりのギタリスト像&lt;&#x2F;h3&gt;
&lt;p&gt;「ぼっち・ざ・ろっく」の音楽監修を担当しているinstantさんは、1990年代のテクニカ
ルなメタル系ギタリストを意識しており、後藤ひとりのギタリスト像もその影響を受けていると思います。2010年前後に話題となった&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@17586063&#x2F;videos&quot;&gt;メタル姫
&lt;&#x2F;a&gt;のようなイメージに近いと言えるでしょう。彼女が使用するレス・ポールのギターも、その音楽性を反映しています。かつての王道ギターヒーローに近いと言えるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;アニメ版では、ギタリストの三井律郎氏がアレンジと演奏を担当しています。
『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4g1dkzi&quot;&gt;ギターマガジン 2023年8月号&lt;&#x2F;a&gt;』のインタビューによれば、下北系ギターを意識しているとのことです。
下北系ギターはギターソロがほとんどなくリフやコードプレイが中心の時代を経て、
空間系エフェクトやファズを活用した多彩な音色のギターの流行という変遷を経ているそうで、
結束バンドのギターもその延長線上で想像されているようです。&lt;&#x2F;p&gt;
&lt;p&gt;特にアニメではバンドの中で悩む主人公の姿が描かれています。対人関係やリアルに人前で
演奏するハードルという面はもちろんあると思いますが、音楽的なギャップというのも
大きいのではないかと想像します。超絶テクニカルなギターソロを弾けても、
バンドのアンサンブルの中でリフ、バッキングを中心にテクニカルなオブリガートを
駆使しバンドとしての音を埋めて行くことは意外に難しいものです。&lt;&#x2F;p&gt;
&lt;p&gt;アニメでは、ストーリーが進行するに従いエフェクターが増え、学園祭シーンでは
オートワウやディレイなどの空間系エフェクトが活用され、楽曲の中で多彩な音色を
使いこなすようになってきます。フレージングも、ペンタトニックを中心にしつつ
他のスケール音を組み合わせ、異なるジャンルのニュアンスを取り入れたものとなっ
ています。&lt;&#x2F;p&gt;
&lt;p&gt;ギターを主軸としつつ現代的なアレンジを成立されている結束バンドの音楽は、現代
のロックバンドのリアルな手本となるもので、かつ現代のギターヒーローの可能性を
見せてくれます。コピーしても派手なリードはないものの、テクニカルなバッキン
グが多く演奏していて楽しい曲が多いことから、後藤ひとりも立派なギターヒー
ローといえるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;「フラッシュバッカー」や「星座になれたら」はコピーしようとすると結構難度が高いけれども、弾けると楽しいし学園祭などでは受けるのではないかと思います。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;コーディング作業は不要になるか？&quot;&gt;コーディング作業は不要になるか？&lt;&#x2F;h2&gt;
&lt;p&gt;8月21日の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;aws-ceo-developers-stop-coding-ai-takes-over-2024-8&quot;&gt;Business Insiderの記事&lt;&#x2F;a&gt;で
AWSの新しいCEO Matt Garmanが以下のように語ったと報じられました。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you go forward 24 months from now, or some amount of time — I can&#x27;t
exactly predict where it is — it&#x27;s possible that most developers are not
coding, Coding is just kind of like the language that we talk to computers.
It&#x27;s not necessarily the skill in and of itself. The skill in and of itself
is like, how do I innovate? How do I go build something that&#x27;s interesting
for my end users to use?&lt;&#x2F;p&gt;
&lt;p&gt;今から24か月後、またはある一定の期間を経た時点で、ほとんどの開発者がコーディ
ングをしていない可能性があります。コーディングは、ただコンピュータとやり取り
するための言語にすぎません。それ自体が必ずしもスキルというわけではありませ
ん。スキルそのものは、「どうやって革新を起こすか」、「エンドユーザーが使って
面白いものをどう作るか」といったことです。&lt;&#x2F;p&gt;
&lt;p&gt;Business Insider- &lt;a href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;aws-ceo-developers-stop-coding-ai-takes-over-2024-8&quot;&gt;In a leaked recording, Amazon cloud chief tells employees that most developers could stop coding soon as AI takes over&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;イノベーション志向の会社のCEOらしい発言ですが、
経営工学を学びインターンでアマゾンに入社しAWSの技術チームを率いた後に
営業とマーケティングを経験していても、事業会社でのIT経験がないCEOらしい狭量な発言です。&lt;&#x2F;p&gt;
&lt;p&gt;人間が作成したアルゴリズムを使わずニューラルネットでシステムを作成すると言うSoftware 2.0は、最先端でも理解しているエンジニアもほとんどいないため実案件で使われるようになるには少し時間が掛かるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;articles&#x2F;2024&#x2F;08&#x2F;09&#x2F;Software-Development-Using-AI&quot;&gt;以前の記事&lt;&#x2F;a&gt;で書いたよう、当面はCopliotのようなAIの補完ツール、Anthropic社の[Cloude3 Sonnet Artifacts]のようなAIと協働して開発を進めるモデルを経てAIにアルゴリズムを開発させる形態へと徐々に移行していくでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;この文脈でAIが活用されている間は最終的な成果物の評価はエンジニアに委ねられるため、
これまで以上に高度なコーディングスキルが求められるでしょう。
むしろ独自に開発する機会が減る分、エンジニアが実践的なコーディングスキルを
養うことが難しくなるかもしれません。&lt;&#x2F;p&gt;
&lt;p&gt;それでも、探求心のあるエンジニアは仕事以外でもコーディングを続け、スキルを高めていけるでしょう。一方で、エンジニアという職業についているだけの多くの人はこれまで通り能力を発揮できないでしょう。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;一連の誹謗中傷事件について&quot;&gt;一連の誹謗中傷事件について&lt;&#x2F;h2&gt;
&lt;p&gt;ここ最近、お笑い芸人フワちゃんによる、X（旧ツイッター）上でのやす子への不適切発言や
重定知佳選手の事件、SNSでの五輪アスリートへの攻撃など誹謗中傷について事件が目立った
ように思います。&lt;&#x2F;p&gt;
&lt;p&gt;また、これらの事件に対する報道や世間の味方も気になりました。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;人間の本性&quot;&gt;人間の本性&lt;&#x2F;h3&gt;
&lt;p&gt;少し前に読んだ橘玲氏の『&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;474Lm1M&quot;&gt;世界はなぜ地獄になるのか&lt;&#x2F;a&gt;』が、
こういった事象に関する人間の本性を見事に言い当てています。&lt;&#x2F;p&gt;
&lt;p&gt;要約すると、次のようなものです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;旧石器時代の数百万年間、人類は150人程度共同体の中で生きるよう適応してきた。&lt;&#x2F;li&gt;
&lt;li&gt;共同体の中での競争はステイタスゲームとして行われ、ステイタスが下がる=共同体からの排除を意味し、正に死活問題であった。&lt;&#x2F;li&gt;
&lt;li&gt;ステイタスを上げるには成功、支配、美徳と3つの戦略があるが、前者2つは支配者や金持ちにしか実現が難しく、美徳は「道徳律の実践」により得られるものなので、本来はいずれもリスクとコストを伴うものであった。&lt;&#x2F;li&gt;
&lt;li&gt;ただし「美徳」には道徳律実践など以外に「不道徳者を暴き出し&quot;正義&quot;を振りかざして叩く」ことで自身の道徳的地位を相対的に引き上げて美徳を固辞する戦略が存在する。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;こうして、成功ゲームや支配ゲームをうまくプレイできない落ちこぼれが、
「被害者」を見つけては正義の元、他者を糾弾する美徳ゲームへなだれ込むことになります。
中世の異端審問を始め、フランス革命期の恐怖政治、南北線戦争後のレコンストラクション、
マッカーシズムなど、歴史を振り返っても美徳ゲームに熱狂していた大衆の姿をすぐに見つける
ことができます。&lt;&#x2F;p&gt;
&lt;p&gt;社会的、経済的な地位に関係なく誰でも出来る美徳ゲームは、インターネット、SNSを通じて、
更に匿名でローリスク、ローコストで行うことが可能となりました。&lt;&#x2F;p&gt;
&lt;p&gt;誹謗・中傷やキャンセル・カルチャーは、こういった人類の社会的・生物学的な背景から
見ると大半の人類の本性であり、これからも多くの人がこの「正義というエンターテイメント」
を存分に楽しんでいくでしょう。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;キャンセル・カルチャー時代を生き抜く&quot;&gt;キャンセル・カルチャー時代を生き抜く&lt;&#x2F;h3&gt;
&lt;p&gt;キャンセル・カルチャーや誹謗中傷が人類の本性だとすると、あなたがネットで出会う大半の相手は
落ちこぼれブレーキが外れた正義エンターテイメントに勤しんでいる輩です。&lt;&#x2F;p&gt;
&lt;p&gt;こういった状況から身を守るには、次の3つの戦略しかありません。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;「関わらない」つまり、こういった輩が多数存在し自身でコミュニケーションをコントロールできない中央集権的なSNSプラットフォームから撤退する。&lt;&#x2F;li&gt;
&lt;li&gt;「正義である」自身への抑制のためにも、匿名でなく実名を使ってフェアネスな立場にて発言していることを常に明確にする。&lt;&#x2F;li&gt;
&lt;li&gt;「潜伏する」自身も人間なのでどこかで正義エンターテイメントに身を任せ問題発
言をしてしまうことは避けられないでしょう。そのため、徹底的に潜み匿名に徹しま
しょう。発信者の情報開示請求されても身バレしない対処をちゃんとやっておきましょ
う。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;私自身は、すべてのSNSを一旦削除し、実名でこのサイトを運営し、個人でVPNや暗号化を徹底しています。&lt;&#x2F;p&gt;
</content>
        <summary type="html">今週の気になった記事や出来事は、映画『ぼっち・ざ・ろっく』、AWS新CEO、誹謗中傷についてです。</summary>
        </entry><entry xml:lang="en">
        <title>コマンドラインで画像のExif修正</title>
        <published>2024-08-23T00:00:00+00:00</published>
        <updated>2024-08-23T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/exiftool/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/exiftool/</id>
        
            <content type="html">&lt;p&gt;デジカメの日付の設定を間違えExifの日付を修正したかったが、
AppStoreから余計なアプリをインストールしたくなかったので、Homebrewでexiftoolをインストールして修正。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Install exiftool using Homebrew&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install exiftool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Confirm dates of exif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;exiftool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; R0000001.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    ExifTool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Version Number         :&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12.76&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Name                       : R0000001.JPG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    Directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;                       : .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Size                       :&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; MB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Modification Date&#x2F;Time     : 2024:08:26 12:42:29+09:00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Access Date&#x2F;Time           : 2024:08:26 12:43:26+09:00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Inode Change Date&#x2F;Time     : 2024:08:26 12:43:24+09:00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Permissions                : -rwx------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Type                       : JPEG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Type Extension             : jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    MIME&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Type                       : image&#x2F;jpeg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;    Exif&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Byte Order                 : Little-endian&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (Intel,&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; II&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Output&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; truncated for brevity&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Modify dates of exif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;exiftool&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -Alldates=&amp;#39;2024:08:23 12:11:00&amp;#39; -overwrite_original .&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">デジカメの日付の設定を間違えたので、Exifの日付をコマンドラインで一括修正する方法を見つけました。</summary>
        </entry><entry xml:lang="en">
        <title>AWS CodeCommit新規受付凍結の影響について</title>
        <published>2024-08-13T00:00:00+00:00</published>
        <updated>2024-08-13T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/codecommit-impact/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/codecommit-impact/</id>
        
            <content type="html">&lt;blockquote&gt;
  Amazon&#x27;s recent decision to stop accepting new users for several cloud
  services caught some customers, partners and even a few employees by surprise.
  (Amazon
  が展開中の複数のクラウドサービスについて新規ユーザー登録受付を中止したことで、顧客や協力企業の間で混乱が広がっている。)
  &lt;footer&gt;
    &lt;cite&gt;
      Business Insider -{&quot; &quot;}
      &lt;a href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;aws-deprioritized-cloud-services-surprising-customers-salespeople-2024-8&quot;&gt;
        Amazon decision to deprioritize 7 cloud services caught customers and
        even some salespeople by surprise
      &lt;&#x2F;a&gt;
    &lt;&#x2F;cite&gt;
  &lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;以下の記事は、最近の報道などを見た個人的な意見です。既に中の人ではないので、この件に関しては報道以上の情報は持ち合わせていません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;サービス凍結の状況&quot;&gt;サービス凍結の状況&lt;&#x2F;h2&gt;
&lt;p&gt;同記事によると、次のように説明されている模様です。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;As the public outcry grew, AWS&#x27;s chief evangelist Jeff Barr wrote a short X post on Tuesday to explain that the company decided to &quot;discontinue new access to a small number of services,&quot; but it would continue running them in a secure environment.&lt;&#x2F;p&gt;
&lt;p&gt;関係者から懸念の声が高まったことを受け、AWSのバイスプレジデント兼チーフエバンジェリストを務めるジェフ・バー氏は7月30日のX（旧Twitter）投稿を通じて詳細な事実を説明するとともに、今後の対応を明らかにした。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;これまで使ってきたユーザーはそのまま使用でき、新規ユーザーはGitHubなど別のソリューションを選択すればよいのですぐに何か問題となる訳でありません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;新規受付凍結の影響&quot;&gt;新規受付凍結の影響&lt;&#x2F;h2&gt;
&lt;p&gt;この変更により直近大きな影響はなさそうですが、顧客としては不安でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;既存ユーザーに対してはサポートを継続すると言われていますが、ほとんどの顧客は遠からずこれらのサービスが終了すると考えているでしょう。つまり、顧客は将来のサービス終了に備えた対応を迫られています。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aws.amazon.com&#x2F;jp&#x2F;blogs&#x2F;devops&#x2F;how-to-migrate-your-aws-codecommit-repository-to-another-git-provider&#x2F;&quot;&gt;AWSのブログ&lt;&#x2F;a&gt;でリポジトリーの移行方法が紹介されていますが、CodeCommitやCloud9などのツールは開発プロセスの中に組み込まれて使用しているので、最低でも次のような対応が必要です。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;リポジトリーの移行&lt;&#x2F;li&gt;
&lt;li&gt;ユーザーの移行&lt;&#x2F;li&gt;
&lt;li&gt;CI&#x2F;CDの組み直し&lt;&#x2F;li&gt;
&lt;li&gt;開発プロセスの対応変更&lt;&#x2F;li&gt;
&lt;li&gt;社内の移管手続きの変更&lt;&#x2F;li&gt;
&lt;li&gt;開発者や運用者の再教育&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;ちょっとした組織横断のプロジェクトになりそうです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;何が悪かったのか？&quot;&gt;何が悪かったのか？&lt;&#x2F;h2&gt;
&lt;p&gt;第一の問題は、AWSがCodeCommitやCloud9のサービスの重要性をAWSが図り損ねたことでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;想像するに、CodeCommitやCloud9はそれほど利用者が多くなかったのでしょう。
ユーザーの利用度が低い、サービス提供側から見ると金を生まないサービスを統廃合していくのは当たり前の話です。&lt;&#x2F;p&gt;
&lt;p&gt;これが本番環境のRuntimeだけに関わる問題であれば、ここまでの問題にならなかったかもしれません。
ところが、CodeCommitやCloud9などは企業ITの組織やプロセスに深く関わるので、サービスの移行だけでなく人やプロセスの移行も必要です。
少数かもしれませんが、AWSを信じてCodeCommitやCloud9を利用していた企業は多大な移行コストが必要となります。&lt;&#x2F;p&gt;
&lt;p&gt;その認識がAWSには足りてなかったのではないかと思います。
アプリ開発の側の人だったので偏見かもしれませんが、どうもインフラ屋さんというのはこういう部分のセンスが足りていないのではないかと思うことがよくあります。&lt;&#x2F;p&gt;
&lt;p&gt;結果として、Business Insiderが報じるよう、AWS自身も以下のようは羽目になってしまっています。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The company is trying to keep supporting clients while signaling that these offerings are no longer a strategic priority.&lt;&#x2F;p&gt;
&lt;p&gt;同社は、これらのサービスがもはや戦略的優先事項ではないことを示しながら、顧客のサポートを続けようとしている。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;2点目は、これらの決定に至るAWS社内での連携の問題でしょう。&lt;&#x2F;p&gt;
&lt;p&gt;AWS CLIの&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aws&#x2F;aws-cli&#x2F;blob&#x2F;v2&#x2F;CHANGELOG.rst&quot;&gt;CHANGE LOG&lt;&#x2F;a&gt;を見ると、7月26日にCommitされた2.17.18のコメントに以下のように記述されています。これを受けて一部の顧客が気付いて徐々に騒ぎが大きくなっていったようです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;api-change:`codecommit`: CreateRepository API now throws OperationNotAllowedException when the account has been restricted from creating a repository.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;実際には6月6日から新規顧客への制限を加えていたという話もあります。当然これらの決定は更に数ヶ月前には行われていたことでしょう。一方でBusiness Insiderが報じるようにAWS内部でも十分に周知されないまま決定されたようです。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;It turns out that even some of Amazon&#x27;s own salespeople were not aware of the change until after it was made public late last week.&lt;&#x2F;p&gt;
&lt;p&gt;なお、アマゾンの営業部門の中には事前に何も聞かされておらず、同社が先週末に受付中止を公表した時点で初めてその事実を知った従業員が複数いることも分かった。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;アグレッシブな機能の改善は美点でもあり機能やサービスをどんどん追加している時はよかったかもしれませんが、ある程度利用が定着した段階に入っているこれからはこれまでのようなカジュアルな変更は難しいのかもしれません。&lt;&#x2F;p&gt;
</content>
        <summary type="html">Business Insider などを読んでいるとAWSのCodeCommitやCloud9の新規受付凍結は、米国でもかなり問題になっている模様。</summary>
        </entry><entry xml:lang="en">
        <title>Software Development Using Generative AI</title>
        <published>2024-08-09T00:00:00+00:00</published>
        <updated>2024-08-09T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/software-development-using-ai/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/software-development-using-ai/</id>
        
            <content type="html">&lt;p&gt;日本語は下の方に。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Dramatic_Cost_Reduction&quot;&gt;Dramatic Cost Reduction&lt;&#x2F;h2&gt;
&lt;p&gt;The use of generative AI has dramatically reduced the costs of producing images and music.
For example, tasks like illustration creation and music creation (using services like Udio and Suno) previously required specialists.
These tasks can now be done by individuals in about five minutes using generative AI-powered services.&lt;&#x2F;p&gt;
&lt;p&gt;In software development, the use of generative AI for development support is also spreading.
Many developers are likely using tools like Github Copilot.&lt;&#x2F;p&gt;
&lt;p&gt;However, applications of generative AI in software development are progressing beyond mere coding support.
For example, I recently changed the static site generator for my main blog, which required converting the metadata of several hundred articles.
I wrote a conversion program in Python.
But by providing ChatGPT with the prerequisites and requirements, I only needed to make about 10% modifications to the generated code.&lt;&#x2F;p&gt;
&lt;p&gt;This example shows that generative AI can shoulder not only development support but also the creation of software itself.
It is similar to image and music production.
In the example above, what would have taken about two weeks if outsourced to a development vendor was reduced significantly.
This reduction brought the work down to about 30 minutes using generative AI.&lt;&#x2F;p&gt;
&lt;p&gt;The cost is only 0.6%.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;What_Generative_AI_Software_Development_Brings&quot;&gt;What Generative AI Software Development Brings&lt;&#x2F;h2&gt;
&lt;p&gt;The rationale for traditional software development was that it could reduce the
workload of many people through repeated use. Therefore, single-use software
development for specific users was not permitted.&lt;&#x2F;p&gt;
&lt;p&gt;However, there is a world where single-use software development has been
allowed: the realm of data science. This is because of the unique nature of
datasets and the need for trial and error, where speed is prioritized over
reuse. The most significant reason is that the benefits gained from single-use
software development outweigh the costs.&lt;&#x2F;p&gt;
&lt;p&gt;By leveraging generative AI, it becomes possible to reduce costs in general
software development similarly. This means that even single-use software
development for one user, which does not contribute to reducing the workload of
many, becomes feasible.&lt;&#x2F;p&gt;
&lt;p&gt;In other words, we are entering an era where problems that could be solved by software but were left unaddressed due to development costs.
These problems can now be resolved quickly using generative AI for software development.&lt;&#x2F;p&gt;
&lt;p&gt;In practice, when you ask ChatGPT a question like &quot;What is the date 100 days after August 9, 2024?&quot;, a single-use Python code is generated.
This specialized code is executed behind the scenes to solve this specific problem.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; timedelta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Starting date&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2024&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Calculate the date 100 days later&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;end_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; timedelta&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;days&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;100&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;end_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strftime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;%Y-%m-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;Differences_from_RPA_and_No-Code&quot;&gt;Differences from RPA and No-Code&lt;&#x2F;h2&gt;
&lt;p&gt;Similar technologies include RPA and no-code solutions. Many companies have
adopted these technologies, riding the wave of the DX trend.&lt;&#x2F;p&gt;
&lt;p&gt;Both have the effect of lowering software development costs, but there are
significant differences in their technology and implementation effects.&lt;&#x2F;p&gt;
&lt;p&gt;From a technical perspective, generative AI software development involves custom development by AI according to requirements.
RPA and no-code solutions appear to meet user requests, but in reality, only pour parameters into pre-made software provided by vendors.
Therefore, what can be achieved must be based on the templates of the pre-made software.&lt;&#x2F;p&gt;
&lt;p&gt;More importantly than these technical differences is the impact of their implementation.
In many cases with RPA and no-code solutions, user departments develop the software themselves.
This happens when they become frustrated with waiting for the development department.&lt;&#x2F;p&gt;
&lt;p&gt;This means that non-developers are creating reusable software, or corporate software assets, which is a nightmare.
Years later, the software will likely become a maintenance burden due to the users&#x27; transfer or the vendors&#x27; product lifecycle.&lt;&#x2F;p&gt;
&lt;p&gt;In contrast, single-use software development using generative AI emphasizes the outcomes rather than the software itself.
Thus, the specifics of the software do not matter.
Even so, a verifiable artifact in the form of &quot;source code&quot; is created, making it a completely transparent process (white box).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Seeing companies that claim to have achieved &quot;DX&quot; by introducing RPA and no-code solutions gives me chills.
In contrast, companies should recognize the new application methods of software development.
These methods allow generative AI to be used to solve problems on the spot, similar to the approach taken by data scientists.
This approach is similar to the methods employed by data scientists.&lt;&#x2F;p&gt;
&lt;p&gt;In such a world, engineers with the ability to read source code will become
increasingly necessary. Companies currently investing in RPA and no-code
solutions should be cautious, as they may be going against the trend.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;劇的なコスト削減&quot;&gt;劇的なコスト削減&lt;&#x2F;h2&gt;
&lt;p&gt;生成系AIの活用により、画像や音楽の制作コストが劇的に削減されています。例えば、
これまで専門家に依頼しなければならなかったイラスト作成（MidjourneyやDALL-E 2な
ど）や音楽作成（UdioやSunoなど）を、生成系AIを取り入れたサービスを使うことで、
自分で5分ほどで望みの画像や音楽を制作できます。&lt;&#x2F;p&gt;
&lt;p&gt;ソフトウェア開発においても、生成系AIを活用した開発支援が広がってきています。実
際に、Github Copilotのようなツールを使用している開発者も多いでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、これらのコーディング支援とは別の次元で、ソフトウェア開発への応用も進ん
でいます。例えば、最近私はメインブログの静的サイトジェネレータを変更しました
が、それに伴い記事のメタデータの変換が必要でした。数百ある記事の変換プログラム
をPythonで書きましたが、ChatGPTに前提と要件を伝えて生成されたコードをベースに、
10%程度の修正するだけで済みました。&lt;&#x2F;p&gt;
&lt;p&gt;これは、開発作業の支援だけでなく、画像や音楽の制作と同様にソフトウェア制作その
ものを生成系AIに肩代わりさせることができる例です。上記の例では、開発ベンダーに
依頼すると2週間ほどの時間がかかるところを、生成系AIを使って自分でコードを作成す
れば30分程度で済みます。&lt;&#x2F;p&gt;
&lt;p&gt;コストは0.6%で済んでしまいます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;生成系AIによるソフトウェア開発がもたらすもの&quot;&gt;生成系AIによるソフトウェア開発がもたらすもの&lt;&#x2F;h2&gt;
&lt;p&gt;従来のソフトウェア開発のRationale（根拠）は、何度も使用されることで多くの人の作
業を軽減できることにありました。そのため、特定のユーザーのための使い切りのソフ
トウェア開発は許されませんでした。&lt;&#x2F;p&gt;
&lt;p&gt;しかし、使い切りのソフトウェア開発が許されてきた世界があります。それはデータサ
イエンスの領域です。これは、データセットの特異性やそれに伴う試行錯誤の必要性、
再利用より迅速性が重視されたためです。最も大きな理由は、使い切りのソフトウェア
開発のコストに対して得られる成果が大きいからです。&lt;&#x2F;p&gt;
&lt;p&gt;生成系AIを活用すれば、一般的なソフトウェア開発でも同様にコスト削減が可能とな
り、多くの人の作業軽減に貢献しない、一人のユーザーのためだけの使い切りのソフト
ウェアを開発することも可能になります。&lt;&#x2F;p&gt;
&lt;p&gt;つまり、これまで開発コストを理由にソフトウェアで解決出来る問題が放置されていた
状況を「生成系AI使って、ささっとソフトウェア開発をして解決すればよい」という時
代になってきていると感じます。&lt;&#x2F;p&gt;
&lt;p&gt;実際、ChatGPTで「2024年8月9日の100日後は何日？」というような質問の回答を作るの
に、裏では以下のようはこの問題に特化した使い切りのPythonコードが生成されて実行
されています。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; timedelta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Starting date&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; datetime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2024&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# Calculate the date 100 days later&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;end_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt; timedelta&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;days&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;100&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;end_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;strftime&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;%Y-%m-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-format z-placeholder z-other z-python&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;RPAやノーコードとの違い&quot;&gt;RPAやノーコードとの違い&lt;&#x2F;h2&gt;
&lt;p&gt;似たような技術にはRPAやノーコードがあります。DXの流行に乗って、これらを導入した
企業も多いと思います。&lt;&#x2F;p&gt;
&lt;p&gt;どちらもソフトウェア開発コストを下げるという効果がありますが、その技術と導入効
果の面で大きな違いがあります。&lt;&#x2F;p&gt;
&lt;p&gt;技術面で見ると、生成系AIによるソフトウェア開発では要件に従いAIよるソフトウェア
のカスタム開発が行われています。しかし、RPAやノーコードではユーザーのリクエストに沿っ
て必要なソフトウェアを実現しているように見えますが、実際にはベンダーが用意した
ソフトウェアにパラメータを流し込んでいるだけです。そのため、実現できることもあ
らかじめ用意されたソフトウェアのひな形を意識した要件に落とし込む必要があります。&lt;&#x2F;p&gt;
&lt;p&gt;こういった技術的な違いよりも、問題はその導入効果です。
RPAやノーコードで多く行われているのは、開発要望が開発部門のバックログ
いつまでも実現されないと
業を煮やしたユーザー部門が自身で開発するというパターンです。これは使い回すソフト
ウェア、つまり企業のソフトウェア資産を開発者でない素人が開発してしまうことを意
味します。悪夢でしかありません。数年後には開発したユーザーの異動やベンダーの製
品ライフサイクルから、メンテナンスできないソフトウェアという負の遺産になってい
ることでしょう&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;一方で生成系AIによる使い切りソフトウェア開発は生成したソフトウェアそのもので
はなく成果が重視されるため、どのようなソフトウェアだったかは問題になりま
せん。それでも、「ソースコード」という検証可能な成果物が作成されるため、完全に
透明な状態（ホワイトボックス）です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;RPAやノーコードのソリューションを導入して「DX実現」としている企業の将来を思うと
暗い未来しか想像できません。&lt;&#x2F;p&gt;
&lt;p&gt;一方で従来のソフトウェア開発とは異なる、これまでデータサイエンティストが取り組
んできたようなアプローチ、つまるソフトウェア開発によるその場の問題解決が生成系
AIを使うと可能になるので、新しいソフトウェアの応用方法として企業はしっかりと認
知すべきだと思います。&lt;&#x2F;p&gt;
&lt;p&gt;こういった世界ではソースコードを読む能力を持ったエンジニアはますます必要になっ
てくるので、そういった意味でもRPAやノーコードに取り組んでいる企業は逆流している
ので気をつけたほうがよいと思います。&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;「サーバー型RPAならば集中管理できてそうはならない」という意見もあり
ます。それならばIT部門が開発して管理すればよくベンダー依存のランタイム
上でシステムを構築する意味がないのではないでしょうか？　もっともここに
AIを応用すると世界が変わる可能性はありますが、現時点ではまだ予測不能で
す。 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">Recently, I had a conversation with someone about software development using ChatGPT, and a few things caught my attention. I decided to summarize my thoughts here.</summary>
        </entry><entry xml:lang="en">
        <title>Paul McCartney’s photo exhibition</title>
        <published>2024-08-08T00:00:00+00:00</published>
        <updated>2024-08-08T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/08/paul-mccartney-photoexhibition/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/08/paul-mccartney-photoexhibition/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;08&amp;#x2F;paul-mccartney-photoexhibition&amp;#x2F;paul.jpg?h=766cb27e1e737921deb0&quot;
  alt=&quot;Paul McCartney’s photo exhibition&quot; width=&quot;512&quot; height=&quot;385&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;I went to Roppongi to see Paul McCartney’s photo exhibition “Eyes of the
Storm”.
The photos were taken between 1963 and 1964, capture their everyday life.
But they were forgotten until 2020.
These unseen photos of the Beatles during their peak success made the exhibition very fascinating.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Paul McCartneyの写真展が六本木でやっていたので見に行ってきました。</summary>
        </entry><entry xml:lang="en">
        <title>AWS最終日</title>
        <published>2024-07-31T00:00:00+00:00</published>
        <updated>2024-07-31T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/last-day/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/last-day/</id>
        
            <content type="html">&lt;p&gt;I returned the company Mac a while ago and have been busy with private matters, so I had forgotten, but today was my last day as an Amazonian. I guess I&#x27;ll go return my health insurance card.&lt;&#x2F;p&gt;
&lt;p&gt;会社のMacも随分前に返却しているしプライベートでバタバタしていて失念していたけれど、今日がアマゾニアンとしての最終日だった。 保険証を返送しにいくか。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ついにAWSの最終日です</summary>
        </entry><entry xml:lang="en">
        <title>Epiphone USA Texan 購入</title>
        <published>2024-07-24T00:00:00+00:00</published>
        <updated>2024-07-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/ephiphone-texan/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/ephiphone-texan/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;07&amp;#x2F;ephiphone-texan&amp;#x2F;texan.jpg?h=bf4cfce62eb9a35f9305&quot;
  alt=&quot;&quot; width=&quot;512&quot; height=&quot;512&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;Gibson J-45と弾き比べて、ついEpiphone USA Texan (FT-79)　を買ってしまった。こちらも腐ってもGibson謹製。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Epiphone_Texan(FT-79)とは&quot;&gt;Epiphone Texan(FT-79)とは&lt;&#x2F;h2&gt;
&lt;p&gt;FT-79は、1942年からEpiphone社により生産が開始されています。
1957年にGibsonがEpiphoneを買収した後、1958年からGibsonはFT-79に「Texan」という名前を付けました。
その後1970年までミシガン州カラマズーで生産されます。
1970年にGibsonが買収されるとニューヨークでは製造中止となり、日本や韓国で生
産されたモデルが売られていました。&lt;&#x2F;p&gt;
&lt;p&gt;Texanが有名になったのはPaul McCartneyが「Yesterday」のレコーディングで使用
したためでしょう。彼はその後もMartin D-18と共に愛用しているようです。
彼が愛用したころのTexanは基本的にGibson J-45とボディは共通でしたが、
大きな違いはJ-45がショートスケールなのに対し、Texanはレギュラースケールを採
用している点です。&lt;&#x2F;p&gt;
&lt;p&gt;今回購入したのは、日本製や韓国製ではなく2020年から米国モンタナ州ボーズマン工場で、
ギブソンのルシアーの手によりハンドメイド生産されたモデルです。
1960年代のTexanとは仕様は違っていますが、
基本的にはスプルーストップ、サイド ＆ バックにマホガニーを使用した
オール単板というJ-45と共通のボディにレギュラースケールを採用している点は同じです。
ニトロセルロースラッカーで仕上げられています。&lt;&#x2F;p&gt;
&lt;p&gt;L.R.Baggs VTCピックアップ・システムもマウントされているので、
エレアコとしても使用できます。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Epiphone_USA_Texanのレビュー&quot;&gt;Epiphone USA Texanのレビュー&lt;&#x2F;h2&gt;
&lt;p&gt;有名なPaulが持っているTexanとは、かなり仕様が違います。&lt;&#x2F;p&gt;
&lt;p&gt;特に彼のギターはアジャスタブル・サドルですが、今売られているUSA Texanは固定サドルです。
アジャスタブル・サドルは「ジャキジャキ感が出る、レスポンスがよい」などと言われますが、
アジャスタブル・サドルはサドルの底面がブリッジに接しておらず、
2つのネジ穴だけでブリッジに振動を伝えています。そのため音が良かろうはずなく、
個人的には固定ブリッジのほうがよいと思っています。&lt;&#x2F;p&gt;
&lt;p&gt;とは言え、購入したTexanはやはりTexanっぽい音がします。&lt;&#x2F;p&gt;
&lt;p&gt;大事にしてします。&lt;&#x2F;p&gt;
&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;4Cw-Am4haNQ&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;2024-07-31追記&quot;&gt;2024-07-31追記&lt;&#x2F;h2&gt;
&lt;p&gt;先日購入したEpiphone USA Texan、ローズウッドのブリッジがボディから剥離しているというトラブルが発生しました。
試奏の時はボディの傷とかは見てたけど、そのレベルで問題があると思わなかったので見てなかった。さすがGibsonクオリティ。&lt;&#x2F;p&gt;
&lt;p&gt;楽器店で在庫から同じモデルを見つけて交換していただけました。ありがたや。&lt;&#x2F;p&gt;
</content>
        <summary type="html">ついにEpiphone USA Texanを購入してしまいました。</summary>
        </entry><entry xml:lang="en">
        <title>知らない内に中丸氏と対戦</title>
        <published>2024-07-24T00:00:00+00:00</published>
        <updated>2024-07-24T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/nakamaru/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/nakamaru/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;07&amp;#x2F;nakamaru&amp;#x2F;nakamaru.webp?h=324215622e992669a80a&quot;
  alt=&quot;&quot; width=&quot;1000&quot; height=&quot;422&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;知らない内にKAT―TUN中丸雄一さんとスプラトゥーン3で対戦してたらしい。
しかも、Youtubeでめっちゃ負けとる動画を公開されとる。&lt;&#x2F;p&gt;
</content>
        <summary type="html">スプラでKAT-TUN中丸氏と対戦？</summary>
        </entry><entry xml:lang="en">
        <title>中森明菜復活を祝い・・</title>
        <published>2024-07-15T00:00:00+00:00</published>
        <updated>2024-07-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/akinas-revival/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/akinas-revival/</id>
        
            <content type="html">&lt;div class=&quot;youtube-container&quot; style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;8htsxgHVSRk&quot;
    style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot;
    frameborder=&quot;0&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;strong&gt;中森明菜さん&lt;&#x2F;strong&gt;が7月12日から14日にかけて都内でファンクラブ限定イベン
トを7年ぶりのコンサートを行ったのを祝福して、
「十戒(1984)」を演奏してみました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">中森明菜さんが7年ぶりに復活か？</summary>
        </entry><entry xml:lang="en">
        <title>洋食屋ダイニングみどりかわ</title>
        <published>2024-07-15T00:00:00+00:00</published>
        <updated>2024-07-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/dining-midorikawa/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/dining-midorikawa/</id>
        
            <content type="html">&lt;p&gt;東船橋の&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.instagram.com&#x2F;yousyokuyadiningmidorikawa&#x2F;?hl=ja&quot;&gt;洋食屋ダイニングみどりかわ&lt;&#x2F;a&gt;にて、頂くイサキのラタトューユ添え。プリンを追加。&lt;&#x2F;p&gt;
&lt;p&gt;美味しいけど、サラダ、メインディッシュ、パンのみで2700円なのでコスパは良くない。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;07&amp;#x2F;dining-midorikawa&amp;#x2F;bbc925adc5.jpg?h=691e3587c42942521df2&quot;
  alt=&quot;イサキ&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2024&amp;#x2F;07&amp;#x2F;dining-midorikawa&amp;#x2F;f58719e4b0.jpg?h=3d66af27ed74a3dedf93&quot;
  alt=&quot;プリン&quot; width=&quot;1800&quot; height=&quot;1355&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">東船橋の洋食屋さんに言ってきました。</summary>
        </entry><entry xml:lang="en">
        <title>フェルナンデス倒産！</title>
        <published>2024-07-15T00:00:00+00:00</published>
        <updated>2024-07-15T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2024/07/fernandes-bankruptcy/" type="text/html"/>
        <id>https://codedchords.dev/blog/2024/07/fernandes-bankruptcy/</id>
        
            <content type="html">&lt;p&gt;Fernandes went bankrupt.
They were a good quality Japanese guitar maker, but
they were not unique. Oh, I wish someone would bVuy the license for ZO-3 and
Sustainer and continue them.&lt;&#x2F;p&gt;
&lt;p&gt;フェルナンデスが倒産したのか。品質のよい日本のギターメーカーだったけれど、特
徴はなかったからなぁ。あっ、ZO-3とサスティナーはどこかがライセンス買って継
続してほしいなぁ。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;notes.inegales.com&#x2F;2024&#x2F;07&#x2F;14&#x2F;bankruptcy-of-fernandes&#x2F;&quot;&gt;悲報、フェルナンデス倒産&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Fernandesお知らせ&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-fernandes-1&quot;&gt;&lt;a href=&quot;#fn-fernandes&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-fernandes&quot;&gt;
&lt;p&gt;フェルナンデス公式サイトは倒産により閉鎖されました &lt;a href=&quot;#fr-fernandes-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        <summary type="html">国産ギターメーカーのフェルナンデスが倒産しました。</summary>
        </entry><entry xml:lang="en">
        <title>コロナの時代</title>
        <published>2020-05-06T15:32:22+09:00</published>
        <updated>2020-05-07T20:26:00+09:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2020/05/era-of-covid-19/" type="text/html"/>
        <id>https://codedchords.dev/blog/2020/05/era-of-covid-19/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2020&amp;#x2F;05&amp;#x2F;era-of-covid-19&amp;#x2F;cover.webp?h=08c7394038b7e4db6e70&quot;
  alt=&quot;Cover&quot; width=&quot;1024&quot; height=&quot;683&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;緊急事態宣言下で連休中ですが、ほぼ家に籠った状態です。連休明けを目処に設定されていた
緊急事態宣言も月末まで延長となりました。&lt;&#x2F;p&gt;
&lt;p&gt;個人的にはそう簡単に収束しないのかなと、もうぼくらは「コロナの時代」に入ってしまったの
だなと感じています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;COVID-19について&quot;&gt;COVID-19について&lt;&#x2F;h2&gt;
&lt;p&gt;報道では「新型コロナウイルス感染症」、英語が好きなうちのような会社ではCODID-19
とされています。 当初は発生した地域に因んで「武漢肺炎」などと記載されていました。&lt;&#x2F;p&gt;
&lt;p&gt;昨年11月末に武漢で初めて検出されてから、2ヶ月も経たない年初にはWHOから
注意喚起の声明がなされ、その2ヶ月後の3月には既に世界中で感染が広がっていました。
この感染症を引き起こす新型コロナウィルス(SARS-CoV-2)は、これだけの短期間で世界的
流行を果した最初のウィルスでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;今日の時点で、Googleのまとめている統計によれば、3,663,911人が感染し、
亡くなった方は257,301人です。&lt;&#x2F;p&gt;
&lt;p&gt;つい先日まではどこか遠くの話と感じていましたが、
私の部下も1名感染し1週間ほど入院しました。当初は肺炎を起こしていて大変だった
ようですが、3日ほどで安定しました。5日ほどで検査でも陰性となり連休中に退院と
なっています。&lt;&#x2F;p&gt;
&lt;p&gt;ご本人は日頃から感染には気をつけていた方で、
職場には感染者はおらず本人も感染元に心あたりはないとのことでした。
数字からは意識できなかったこのウィルスの広まりをみせつけられた感じでした。&lt;&#x2F;p&gt;
&lt;p&gt;実際緊急事態宣言の最初の週は、仕事先も「それと仕事は別」という感じで通常運転でしたが、
2週目からは勤務日を3日&#x2F;週として、すべてのプロジェクトは勤務日が減る前提で
再スケジュールということになりました。&lt;&#x2F;p&gt;
&lt;p&gt;4月末で空気が変った印象です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;いつ収束するんだろう&quot;&gt;いつ収束するんだろう&lt;&#x2F;h2&gt;
&lt;p&gt;延長された緊急事態宣言は5月末までですが、
多くの人が言うように個人的には5月末に収束しないのではと予想しています。&lt;&#x2F;p&gt;
&lt;p&gt;以下は素人が俄仕込みで理解した内容なので、鵜呑みにしないでください。
間違いがあれば是非ご指摘をお願いします。&lt;&#x2F;p&gt;
&lt;p&gt;ウィルスから見ると人類は3種類に分類できます。感受性人口(Susceptibles)、
感染人口(Infectious)、隔離人口(Removed)です。簡単言うと、&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;感染する可能性がある人&lt;&#x2F;li&gt;
&lt;li&gt;感染している人&lt;&#x2F;li&gt;
&lt;li&gt;一度感染して回復し免疫を持つか亡くなった人で感染する可能性がない人&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;また、ウィルスを持った感染者が自然な状態で感染力を失しなうまでに何人を
感染させるかを「基本再生数」といいますが、WHOによればCoV-2
の基本再生産数は1.5 - 2.5なのだそうです。
ここでは悲観的に見て、基本再生産数を2.5とします。&lt;&#x2F;p&gt;
&lt;p&gt;シンプルに考えると、感染拡大が収まる条件は以下の2つしかないことが
わかります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;一人の感染者からの実際の感染者数の「実効生産数」を基本再生産数2.5
のところを1.0以下にする。&lt;&#x2F;li&gt;
&lt;li&gt;感受性人口を減らし、隔離人口を増やすと感染機会が減らし感染拡大を防ぐ。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;前者は緊急事態宣言の外出自粛などまさに今やっていることですね。
医療崩壊を防ぐなどの意味で実効再生数を抑えていくことは重要です。
ただし、あくまで短期的な対応です。過去数ヶ月の感染拡大を見ると、
一時的にこういった処置で実効生産数を抑えても、
決定的な治療薬の開発などがなければ状況は変わりません。
処置を解除した途端に基本再生産数へ戻ってしまい、
最終的な解決にはならないのは明らかです。&lt;&#x2F;p&gt;
&lt;p&gt;後者は「集団免疫閾値」というそうですが、ある程度免疫を持った人が社会に
入ればウィルスが感染拡大できないということです。たとえば、ワクチンなどは
感染することなく免疫力を持たせて人工的に隔離人口を上げているということです。&lt;&#x2F;p&gt;
&lt;p&gt;集団免疫率には計算式があり、&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;p&gt;$$\text{集団免疫閾値} = \left(1 - \frac{1}{\text{再生産数}}\right) \times 100$$&lt;&#x2F;p&gt;
&lt;!-- textlint-enable --&gt;
&lt;p&gt;で計算できます。再生産数を2.5とすると、60%となります。
つまり、WHOの悲観的な基本再生産数をとると、60%の人が感染するまで
収束しないことになります。&lt;&#x2F;p&gt;
&lt;p&gt;ワクチンなく実効再生産数を押さえる対応を取るなかで、人口60%の隔離人口
を確保するには一体何ヶ月かかるのでしょう？&lt;&#x2F;p&gt;
&lt;p&gt;現在発表されている感染確認数から再生産数を2.5としてグラフにしてみました。
日本の人口については総務省統計局の
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.stat.go.jp&#x2F;data&#x2F;jinsui&#x2F;new.html&quot;&gt;人口推計（令和元年（2019年）11月確定値，令和2年（2020年）4月概算値）　（2020年4月20日公表）&lt;&#x2F;a&gt;
のデータを使用しました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2020&amp;#x2F;05&amp;#x2F;era-of-covid-19&amp;#x2F;covid19-graph1.png?h=7768c62547af22a6365b&quot;
  alt=&quot;再生産数2.5の場合の隔離人口率推移予測&quot; width=&quot;1049&quot; height=&quot;380&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;em&gt;再生産数2.5の場合の隔離人口率推移予測&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;9月には60%に達するので意外に早い印象ですが、最後の週は国民の半数が罹患するという状況です。
こんな選択は出来ないことが明白です。&lt;&#x2F;p&gt;
&lt;p&gt;「
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;scitechlabo.blogspot.com&#x2F;2020&#x2F;04&#x2F;ecdc.html&quot;&gt;【新型コロナ】感染確認者数、死亡者数について、ECDCのデータを利用したダッシュボード&lt;&#x2F;a&gt;
」を公開されている方がいらいしたので、このサイトで日本の再生産数( Estimated Reproduction number )
を確認してみました。
緊急事態宣言がなされた以降は0.7程度に落ちていますが、その前のなんとなく自粛ムードだった3月から4月にかけては
およそ再生産数は1.5前後と読めます。再生産数1.5を前提にすると、閾値は33%となります。同様にグラフにしてみました。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2020&amp;#x2F;05&amp;#x2F;era-of-covid-19&amp;#x2F;covid19-graph2.png?h=62a75e06edd77098f0da&quot;
  alt=&quot;再生産数1.5の場合の隔離人口率推移予測&quot; width=&quot;1049&quot; height=&quot;380&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;em&gt;再生産数1.5の場合の隔離人口率推移予測&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;この場合閾値は低くなりましたが、閾値に達するのは来年の2月です。
なおかつ、このケースも最終週は30%の人が罹患している状況ですから、考えづらいですね。&lt;&#x2F;p&gt;
&lt;p&gt;南半球でも同時に進行していることを考えると自然にウィルスが拡大を止めることはなさそうです。
つまり、「もう大丈夫」という集団免疫閾値に達する状況は、自然な状態では直近に実現しそうに
ありません。&lt;&#x2F;p&gt;
&lt;p&gt;ワクチンにしても年単位で時間がかかるといわれていますし、
治療薬はもう少し早くできるようですが、高い重症化率をみると「治療できるからOK」とは
ならない気がします。&lt;&#x2F;p&gt;
&lt;p&gt;わたしはもう楽観しないことにしました。長期戦です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自作マスク&quot;&gt;自作マスク&lt;&#x2F;h2&gt;
&lt;p&gt;いつまで続くかわからないこのパンデミックですが、マスクもそろそろ一月
くらいしかストックがなくなってきたので代替のマスクを試しに作ってみました。&lt;&#x2F;p&gt;
&lt;p&gt;Amazonで購入した &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3b9c5vo&quot;&gt;マスクホルダー&lt;&#x2F;a&gt; を利用して
キッチンペーパーで作ったものです。&lt;&#x2F;p&gt;
&lt;!-- textlint-disable --&gt;
&lt;img
  src=&quot;https:&amp;#x2F;&amp;#x2F;codedchords.dev&amp;#x2F;blog&amp;#x2F;2020&amp;#x2F;05&amp;#x2F;era-of-covid-19&amp;#x2F;mask.jpg?h=bcf0ec05294a71679223&quot;
  alt=&quot;キッチンペーパーで作るマスク&quot; width=&quot;800&quot; height=&quot;548&quot; loading=&quot;lazy&quot;
&#x2F;&gt;&lt;!-- textlint-enable --&gt;
&lt;p&gt;&lt;em&gt;キッチンペーパーで作るマスク&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;長期戦の備えです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;『コロナの時代の僕ら』(_2020-05-07_追記_)&quot;&gt;『コロナの時代の僕ら』( 2020-05-07 追記 )&lt;&#x2F;h2&gt;
&lt;p&gt;この記事を書いた後にAmazonで『
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;35ETA0y&quot;&gt;コロナの時代の僕ら&lt;&#x2F;a&gt;
』という本を見つけました。&lt;&#x2F;p&gt;
 &lt;div class=&quot;booklink-box&quot; style=&quot;text-align:left;padding-bottom:20px;font-size:small;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-image&quot; style=&quot;float:left;margin:0 15px 10px 0;&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202607160949469749?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16291909%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;thumbnail.image.rakuten.co.jp&#x2F;@0_mall&#x2F;book&#x2F;cabinet&#x2F;9457&#x2F;9784152099457.jpg?_ex=64x64&quot; style=&quot;border: none;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-info&quot; style=&quot;line-height:120%;zoom: 1;overflow: hidden;&quot;&gt;&lt;div class=&quot;booklink-name&quot; style=&quot;margin-bottom:10px;line-height:120%&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202607160949469749?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16291909%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;コロナの時代の僕ら&lt;&#x2F;a&gt;&lt;div class=&quot;booklink-powered-date&quot; style=&quot;font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%&quot;&gt;posted with &lt;a href=&quot;https:&#x2F;&#x2F;yomereba.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ヨメレバ&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-detail&quot; style=&quot;margin-bottom:5px;&quot;&gt;パオロ・ジョルダーノ&#x2F;飯田　亮介 早川書房 2020年04月24日頃    &lt;&#x2F;div&gt;&lt;div class=&quot;booklink-link2&quot; style=&quot;margin-top:10px;&quot;&gt;&lt;div class=&quot;shoplinkrakuten&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;hb.afl.rakuten.co.jp&#x2F;hgc&#x2F;1300574f.7d238558.13005750.4bcd8088&#x2F;yomereba_main_202607160949469749?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16291909%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F&quot; target=&quot;_blank&quot; &gt;楽天ブックス&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkamazon&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;exec&#x2F;obidos&#x2F;asin&#x2F;4152099453&#x2F;yostosweb-22&#x2F;&quot; target=&quot;_blank&quot; &gt;Amazon&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;shoplinkkindle&quot; style=&quot;display:inline;margin-right:5px&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;gp&#x2F;search?keywords=%E3%82%B3%E3%83%AD%E3%83%8A%E3%81%AE%E6%99%82%E4%BB%A3%E3%81%AE%E5%83%95%E3%82%89&amp;__mk_ja_JP=%83J%83%5E%83J%83i&amp;url=node%3D2275256051&amp;tag=yostosweb-22&quot; target=&quot;_blank&quot; &gt;Kindle&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;                                           &lt;&#x2F;div&gt;&lt;&#x2F;div&gt;&lt;div class=&quot;booklink-footer&quot; style=&quot;clear: left&quot;&gt;&lt;&#x2F;div&gt;&lt;&#x2F;div&gt;
&lt;p&gt;素粒子物理学を専攻したイタリアの小説家パオロ・ジョルダーノが2月末から3月初旬に
書き下ろした、新型コロナ感染症をめぐるエッセイです。&lt;&#x2F;p&gt;
&lt;p&gt;タイトルで同じ言葉を使っていたので気になったのですが、「感染症の数学」で書かれていることは
私が思っていたことをもっとわかりやすく言葉にされています。毎日テレビに出てくる感染症の
専門家よりも、この作者の説明のほうが確実にわかりやすいのはなぜでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;当時もイタリアではヨーロッパの中でも感染症の拡大が進んでいましたが、
まだそれほど切迫感がない中で作者が感じている不安や懸念が簡潔な言葉で書かれています。
そして、現在米国、スペインについで最も多くの感染者を出しているイタリアの状況と、まだ若干の余裕を感じる初期のエッセイを比べると、感染症の進行の速さに驚かされます。&lt;&#x2F;p&gt;
&lt;p&gt;最後に収録されている「コロナウイルスが過ぎたあとも、僕が忘れたくないこと」は他の
エッセイから少し日にちが進んだ3月20日の文章で、明らかにメッセージが切迫している
のが印象的でした。&lt;&#x2F;p&gt;
&lt;p&gt;今回のパンデミックが如何に人々の生活を変え、今後も元へは戻らず
新しい時代になるだろうこと、その中で何を残し何を捨てるかの選択を迫られるだろうことを
ストレートに書き表しています。これは私たちが感じていたことなんだと思いました。&lt;&#x2F;p&gt;
</content>
        <summary type="html">まだ連休中ですが、連休明けに解除予定だった緊急事態宣言が月末まで延長になりました。</summary>
        </entry>
</feed>
