LeetCodeの多くの難しい問題は、実は簡単な制約問題である

2025-09-12
LeetCodeの多くの難しい問題は、実は簡単な制約問題である

著者は、動的計画法のスキル不足により、一見簡単な釣銭問題で行き詰まった、フラストレーションの溜まる面接体験を語っています。そして、多くの難しいLeetCodeの問題は、実際にはMiniZinc、Z3、OR-Toolsなどの制約ソルバーを使って簡単に解ける制約問題であると主張しています。この記事では、株の利益最大化やヒストグラムにおける最大長方形の探索など、いくつかの例を示し、制約ソルバーのエレガントなシンプルさと力、特に複雑な制約を扱う際の力を示しています。

続きを読む
開発

RSSがICEを打ち負かした方法:シンプルさが複雑さを凌駕する

2025-09-08
RSSがICEを打ち負かした方法:シンプルさが複雑さを凌駕する

この記事は、コンテンツ配信プロトコルであるRSSとICEの競争の物語を語っています。マイクロソフトやアドビなどの巨大企業の支援を受けたICEは、優れた機能を提供していましたが、非常に複雑で閉鎖的でした。一方、ネットスケープから生まれたRSSはシンプルで使いやすく、そのオープン性によって繁栄しました。最終的に、RSSのシンプルさと、多くのブロガーや開発者からの貢献により、より強力なICEを打ち負かし、コンテンツ集約の業界標準となりました。これは、「シンプルさが複雑さを凌駕する」というインターネットの格言を改めて証明しています。

続きを読む
テクノロジー コンテンツ配信

なぜ私はreStructuredTextをMarkdownよりも好むのか

2025-08-18
なぜ私はreStructuredTextをMarkdownよりも好むのか

この記事では、著者が技術書を書く際にreStructuredText (rST)をMarkdownよりも好む理由を説明しています。rSTは抽象的なドキュメントツリーの中間的な表現であり、Markdownの軽量なアプローチに比べて、優れた拡張性とカスタマイズ性を提供します。著者は、画像の作成や練習問題の処理といった例を通して、rSTのカスタムディレクティブとドキュメントツリーの変換によって、Markdownでは実現が難しい複雑なドキュメント構造と機能を実現できることを示しています。rSTの構文がMarkdownほど直感的ではないことを認めながらも、著者は大規模なドキュメント処理において、特にカスタム拡張や変換が必要な場合(著者の著書「プログラマのための論理」など)に、その強力な機能を高く評価しています。

続きを読む
開発

JavaScriptランタイムの爆発的増加:10年間のイノベーション

2025-07-28
JavaScriptランタイムの爆発的増加:10年間のイノベーション

過去10年間で、新しいJavaScriptランタイムとエンジンが爆発的に増加し、さまざまなコンテキストでJavaScriptを実行できるようになり、タスク固有の最適化が著しく向上しました。これにより、JavaScriptはクラウド、エッジコンピューティング、スマートTV、モバイルデバイス、そしてマイクロコントローラーへと進出しました。この記事では、この多様性の原動力と、なぜ単一のランタイムやエンジンですべてのニーズを満たすことができないのかを探ります。エッジコンピューティングの台頭とマイクロコントローラー向けの低リソースエンジンから、他の言語との相互運用性を容易にするポリグロットエンジン、そしてネイティブアプリ開発における広範な使用まで、JavaScriptランタイムは驚くべき適応性と活気のある成長を示しています。この記事では、Node.js、Deno、Cloudflare Workers、Bun、React Native、NativeScriptなど、さまざまなランタイムとエンジンを詳細に説明し、それらの基盤となるテクノロジーと進化を概説します。

続きを読む
開発

キャッシング:抽象化、最適化ではない

2025-07-04
キャッシング:抽象化、最適化ではない

従来の考えでは、キャッシングはソフトウェアを高速化するツールです。しかし、著者は、これはキャッシング機能の一部に過ぎないと主張します。オブジェクトストレージ、ディスク、メモリ間のデータ移動に取り組んだ後、著者は、キャッシングのより重要な役割はソフトウェアを簡素化することだと述べています。この記事では、プリベークされたキャッシングアルゴリズム(LRU、LFUなど)の限界を探り、キャッシングは、基盤となるストレージの詳細を隠蔽し、プログラマをデータ階層の場所を気にすることから解放する抽象化レイヤーとして機能すると示唆しています。データベースとOSのキャッシングメカニズムは、この抽象化の例です。キャッシングにはOSのページキャッシュやfsyncの誤用など、問題が発生する可能性がありますが、これはキャッシングを放棄する理由ではなく、キャッシングをより適切に理解し、使用する必要があることを意味します。

続きを読む
開発

孤独の蔓延:家を出る呼びかけ

2025-06-29
孤独の蔓延:家を出る呼びかけ

この記事は、現代社会に広がる孤独の問題に取り組み、家を出ることがその対策の鍵であると主張しています。著者は、犬を飼ってドッグパークで地域社会に参加した経験を、つながりを築くための主要な例として挙げています。歩道などの都市インフラが地域社会を育む上で重要であることを強調しています。この記事では、後期資本主義が孤独から利益を得て悪化させていることを批判し、読者に積極的に地域社会に参加し、人間関係を経験することを促しています。

続きを読む
その他

SMTによるLinkedInクイーンズ問題の解決:SATより簡単!

2025-06-12
SMTによるLinkedInクイーンズ問題の解決:SATより簡単!

この記事では、追加の地域制約のある古典的なNクイーンズ問題のバリエーションである「LinkedInクイーンズ」パズルを、SMTソルバーZ3を使用して解く方法を詳しく説明しています。著者は、整数変数と制約を利用したSMTでの問題表現が、多数のブール節を必要とする同等のSAT表現よりもはるかに簡単であることを示しています。SMTソルバーは、Glucoseなどの高度に最適化されたSATソルバーよりも遅い可能性がありますが、エンコーディングの容易さから、多くの人にとってSMTが好まれています。この記事には、完全なコードと、モデルの正しさを検証するための便利なサニティチェックが含まれています。これは、業界がSATを直接使用するのではなく、SATにコンパイルするツールを好む理由の説得力のある説明を提供します。

続きを読む

決定不能性:プログラマーのパンドラの箱

2025-05-28
決定不能性:プログラマーのパンドラの箱

この記事では、計算機科学における「決定不能性」の概念を分かりやすく説明しています。簡単な言葉と具体的な例(例えば、ある数が2つの素数の和であるかどうかを判定するなど)を用いて、決定問題とチューリングマシンの役割を解説しています。重要なのは、決定不能性とは、プログラムが停止するかどうかを判断できないという意味ではなく、すべてのプログラムの停止性を判断できる万能なアルゴリズムが存在しないという意味であるということです。そのため、多くの問題(プログラムの性質の検証など)は、膨大な労力が必要となり、解決できない可能性もあります。これは、形式的検証やプログラム解析といった分野の必要性を示唆しています。

続きを読む
開発

プロパティベーステスト:複雑な入力に対するユニットテストの優位性

2025-05-21
プロパティベーステスト:複雑な入力に対するユニットテストの優位性

この記事では、プロパティベーステスト(PBT)と従来のユニットテストの長所と短所について議論しています。著者は、単一入力の関数にはユニットテストで十分ですが、複数入力関数のエッジケースの組み合わせ爆発により、ランダムな入力生成を行うPBTが、隠れたエッジケースエラーを発見する上で優れていると主張しています。しかし、PBTには学習曲線があり、複雑な入力生成戦略を習得することが重要です。ほとんどのPBTの例は、複雑な入力空間を扱う際の真の能力を示すには単純すぎます。

続きを読む
開発

米国郵便による電子メールへの挑戦:E-COMの興亡

2025-05-14
米国郵便による電子メールへの挑戦:E-COMの興亡

電子メールの脅威に直面した米国郵便公社は、1982年にE-COMサービスを開始し、電子メールを印刷して郵便配達員によって配達する試みを行った。当初は成功を収めたものの、高コスト、複雑なプロセス、柔軟性の欠如により、1985年に失敗に終わり、4000万ドル以上の損失を出した。しかし、E-COMは「電子メール」という用語の普及に貢献し、郵便公社の技術革新への対応を示したと言える。

続きを読む
テクノロジー 電子メール 米国郵便

アメリカの食品安全:嘘と歴史との戦い

2025-04-30
アメリカの食品安全:嘘と歴史との戦い

この記事は、科学ジャーナリストのデボラ・ブルームへのインタビューで、アメリカの食品安全の現状と歴史を探っています。ブルームは、情報が氾濫し、政府の規制緩和が進んでいる中で、アメリカ国民が食品安全上のリスクに直面しており、19世紀の食品の偽造問題が再燃している点を指摘しています。彼女は自身の著書『毒物部隊』を例に、1906年の純粋食品医薬品法の成立過程や、化学者ハーベイ・ワイルリーが「毒物部隊」実験で食品安全の問題を暴露した経緯を説明しています。ブルームは、食品安全への国民の関心を促すとともに、食中毒問題を個人の責任とする個人主義的な考え方を批判し、政府が基本的な権利を保障する責任を強調しています。

続きを読む
テクノロジー 科学ジャーナリズム

要件は変化し続ける:形式手法とシステムの進化

2025-04-28
要件は変化し続ける:形式手法とシステムの進化

この記事では、ソフトウェア開発における絶え間なく変化する要件への対応方法を探っています。頻繁な変更がある場合、事前に大規模な形式モデリングを行うことは非現実的かもしれませんが、システムが一定規模に達したり、アーキテクチャの変更(フェーズ遷移)が発生したりすると、形式手法が不可欠になります。形式仕様と検証により、改善が既存の機能を壊すことを防ぎます。同期更新から非同期更新への切り替えを例に、形式手法が古い要件を新しいシステムが満たしていることを検証する方法を示し、ソフトウェア保守の重要性と機能のサイレントフェイルの防止を強調しています。

続きを読む
開発 要件変更

論理を使ってBlue Princeの命題的サロンパズルを解く

2025-04-21
論理を使ってBlue Princeの命題的サロンパズルを解く

この記事では、命題論理を用いてゲーム「Blue Prince」の論理パズルを自動的に解く方法を詳しく説明します。このパズルは、3つの箱(青、白、黒)があり、それぞれが主張を行い、少なくとも1つの箱が完全に真であり、少なくとも1つの箱が完全に偽であり、賞品は正確に1つの箱の中にあるというルールがあります。著者は、この問題を命題論理でモデル化し、総当たりアプローチを使用してすべての充足可能な割り当てを見つけ、賞品の場所を決定します。この記事には、JavaScriptによる実装とコードの最適化に関する議論が含まれています。

続きを読む
ゲーム

GoogleのAMP for Email:大胆な失敗

2025-04-18
GoogleのAMP for Email:大胆な失敗

GoogleはAMP(Accelerated Mobile Pages)技術を用いて、ホテル予約やGoogleドキュメントへのコメント返信などをメール内で直接行えるインタラクティブなメール体験を実現しようと試みました。しかし、この取り組みは最終的に失敗しました。この記事では、AMP for Emailの失敗原因として、開発の複雑さ、互換性の低さ、メール本来の特性との矛盾などを分析しています。Googleによる強制的な推進への開発者の不信感も、失敗の一因となっています。インタラクティブなメールは不可能ではありませんが、シンプルさと信頼性を犠牲にすることなく、互換性と永続性を優先する必要があります。メールの長年の成功は、そのシンプルさと分散化にあります。

続きを読む
テクノロジー

NPを超えて:より直感的な複雑性問題

2025-04-17
NPを超えて:より直感的な複雑性問題

著者は、停止問題をNP困難よりも難しい問題の典型的な例として用いることに異議を唱え、それが混乱を招き、直感的でない点を主張しています。決定不能である一方、「はい」という答えの検証は、プログラムを有限ステップ実行することで行えます。より理解しやすい代替案として、無限グリッド上でトークンを移動させ、目標地点に到達できるかどうかを判断する問題が提示されています。この問題は、低次元ではPSPACE完全ですが、次元の増加に伴い複雑さが爆発的に増大し、最終的にアッカーマン完全になります。これは、NP問題をはるかに超える複雑性を視覚的に示しています。

続きを読む

Prologでレイトン風謎解きをエレガントに解決する

2025-04-08
Prologでレイトン風謎解きをエレガントに解決する

著者は自身の著書『プログラマーのための論理学』において、論理プログラミング言語に関する章を書き直し、レイトン風謎解きを用いてPrologの威力を示しました。この謎解きは、最初の3人の生徒の点数を基に、4人目の生徒の点数を推測するというものです。簡潔なPrologコード(わずか15行!)を用いて、著者はPrologのパターンマッチングと双方向性を巧みに利用し、この問題をエレガントに解決し、考えられる全ての解答キーを見つけ出し、最終的に4人目の生徒の点数が6点であると結論付けました。より長く非効率的な解法との比較も行われています。著者は謎解きを教育に用いることに反対していますが、この例はPrologの実用的な可能性を示しています。

続きを読む
開発 謎解き

KVデータベースの構築をやめるべき時

2025-03-25
KVデータベースの構築をやめるべき時

著者は、Key-Valueデータベースが非常に単純で表現力に欠けており、使いにくいと批判しています。ストレージエンジンベンダの間では人気がありますが、KVデータベースは適切なデータモデルを構築するための基礎的な要素に過ぎず、ユーザーはゼロからデータモデルを構築する必要があり、最適ではない結果になることが多いです。著者は、妥協案として、型付きレコードを持つ、埋め込み型のデータベースを提案しています。論理スキーマと物理スキーマを分離しますが、クエリは物理スキーマに対して記述します。これにより、複雑なクエリプランナーが不要になり、非同期スキーマ変更とレイアウトの切り替えがサポートされます。このアプローチは、データの独立性と埋め込みシステムに必要なシンプルさを両立させ、単純なKVストアと本格的なリレーショナルデータベースの複雑さの両者に対する魅力的な代替案を提供します。

続きを読む

検証ファースト開発:テスト駆動開発を超えて

2025-03-18
検証ファースト開発:テスト駆動開発を超えて

この記事では、検証ファースト開発(VFD)というパラダイムを探求します。これは、コードを書く前に検証メカニズムを確立することを重視します。これには、テストの記述、型不変量の定義、契約の追加など、さまざまな方法が含まれます。VFDはテスト駆動開発(TDD)とは異なり、TDDはVFDの特別なケースであり、テストを使用してコード設計を推進することに焦点を当てています。VFDの利点としては、検証をスキップする可能性の低減、早期のエラー検出、コード品質の向上などがあります。しかし、VFDには欠点もあります。開発速度の低下、探索的コーディングの妨げ、検証方法がコード設計に影響を与える可能性などです。著者は、VFDはパラダイムではなくテクニックとして、より柔軟で他のアプローチと簡単に統合できると主張しています。

続きを読む

5種類の非決定性:形式手法からの実践的知見

2025-02-20
5種類の非決定性:形式手法からの実践的知見

この記事では、システムモデリングにおける5種類の非決定性、すなわち真のランダム性、並行性、ユーザー入力、外部要因、抽象化について探求します。著者は、実践的な例を用いて各タイプを明確に説明しています。真のランダム性は、擬似乱数生成器でシミュレートされることが多いですが、モデリングにおいては通常、非決定的な選択として扱われます。並行性は、非決定性の主な原因の1つであり、状態空間爆発のため特別な処理が必要です。ユーザー入力と外部要因は、非決定的な外部の影響として扱われます。重要なのは、抽象化によって複雑な決定論的プロセスが非決定的な選択に簡素化され、モデルが簡素化され、潜在的なエラーに対する感度が高まることです。これは、非決定性とそのソフトウェア開発における応用を理解するための貴重な洞察を提供します。

続きを読む

効率性 vs. 水平スケーラビリティ:避けられないトレードオフ?

2025-02-12
効率性 vs. 水平スケーラビリティ:避けられないトレードオフ?

この記事は、ソフトウェアの効率性と水平スケーラビリティのバランスについて考察しています。著者は、スケーラビリティに最適化されたソフトウェアは、単一マシン環境ではしばしばパフォーマンスが低下し、その逆もまた真であると主張しています。これは、アムダールの法則、調整オーバーヘッド、共有リソースの制限に起因します。効率的なアルゴリズムは、システムと問題に関する仮定に依存することが多く、水平スケーリングを行うとこれらの仮定がもはや成り立たなくなる可能性があります。著者 は、文化的な要素やタスクの種類が選択に影響を与えることについても論じており、Tigerbeetle データベースや CPython の GIL などの例を挙げています。最終的に、問題と環境への深い理解が、高い効率性とスケーラビリティを達成するための鍵となります。

続きを読む
開発

正規表現のアンカーの奇妙な歴史:`$`と`^`はなぜ?

2025-01-21
正規表現のアンカーの奇妙な歴史:`$`と`^`はなぜ?

この記事では、正規表現において`$`と`^`を行アンカーとして使用する歴史的起源を探ります。QEDテキストエディターを遡ると、`$`は当初バッファの終端を表し、後にKen Thompsonによって正規表現における行末アンカーとして適応されました。`^`の選択は、当時一般的に使われていたTeletype Model 35タイプライターの文字セットが限られていたこと、そして`^`がASCII-67に既に存在していたことによる可能性が高いです。これは巧妙な設計というよりは、当時のハードウェアと文字セットの制約の結果であり、正規表現における慣習となっています。

続きを読む
開発

数学モデルが明らかにする、ドレイドルゲームのひどさ

2024-12-18
数学モデルが明らかにする、ドレイドルゲームのひどさ

昨年、著者は確率的モデリング言語PRISMを使用して、伝統的な休日のゲームであるドレイドルをモデル化し、その面白みのなさを証明しました。今年は、ゲームの終了までシミュレートするようモデルを改良しました。新しいモデルは、最初のプレイヤーだけが脱落するのをシミュレートするという以前の欠点を修正し、賭け金とプレイヤーの脱落に関する計算ロジックを改善しています。モデルシミュレーションを通して、著者は、平均して4人のプレイヤーによるゲームは終了までに760回転かかり、最長で6時間を超える可能性があることを発見しました。これは、ドレイドルゲームが長く、退屈で、イライラするものであることを十分に証明しています。

続きを読む