<?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>Software</tabi:current_section>
    </tabi:metadata><title>Coded Chords - Software</title>
        <subtitle>A personal blog</subtitle>
    <link href="https://codedchords.dev/tags/software/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://codedchords.dev/tags/software/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-06-04T00:00:00+00:00</updated><id>https://codedchords.dev/tags/software/atom.xml</id><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>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>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>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>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>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>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>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>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>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>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;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_wFVSNXj3c&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;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>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>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>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>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>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>
</feed>
