2026年6月1日月曜日

👓SWIFTでCannot assign to property: 'self' is immutableとはどういう意味ですか?

 Cannot assign to property: 'self' is immutable というエラーメッセージはSwiftで見られるもので、これはオブジェクトのプロパティや自身の値を変更しようとした際に、そのオブジェクトが不変(immutable)であることを示しています。具体的には、以下のような状況でこのエラーが発生することが一般的です:

  1. 構造体のインスタンスが定数として宣言されている場合: Swiftの構造体は値型であり、インスタンスが定数(let で宣言された)として作成された場合、そのプロパティは変更できません。

  2. 関数やメソッド内でのselfの不変性: 値型(例えば構造体)のメソッド内で、self 自体を変更しようとした場合にもこのエラーが発生します。これを回避するためには、メソッドを mutating として宣言する必要があります。

  3. このエラーは、Swiftの値型と参照型の基本的な特性に関連しています。値型のインスタンスは、不変性が保証されている場合にはその状態を変更することができません。これに対し、参照型(例えばクラス)の場合、定数としてインスタンスを宣言しても、そのプロパティを変更することが可能です。

SwiftUIのビューは構造体であるべきで、それはデフォルトで不変であることを意味します。これが私たち自身のコードであれば、値を変更することをSwiftに伝えるためにmutatingを使用してメソッドをマークすることができますが、SwiftUIでは計算されたプロパティを使用するため、それを行うことはできません。
プログラムの実行中にプロパティの値を変更したい場合は、次のように@Stateを使用してマークする必要があります:

https://www.hackingwithswift.com/quick-start/swiftui/how-to-fix-cannot-assign-to-property-self-is-immutable


森毅と話のふら

 森毅の文章には、同じ話を何度も出す良さがある。数学者でありながら、森は数学の専門的な成果だけを語った人ではなかった。教育、学校、老い、仕事、世間、遊びについて、多くのエッセイを書いた。その文章では、「ものぐさ」「ええかげん」「まちがってもよい」といった言葉が繰り返し現れる。

この反復は、単なる使い回しではない。森毅の場合、同じ話題が別の場所で少しずつ角度を変えて出てくる。数学の話として出たものが、教育論にもなり、人生論にもなる。学校の管理を語っていたはずが、いつのまにか人間の余白や失敗の話になる。そこで読者は、新しい主張を読むというより、聞き慣れた噺をもう一度聞く感覚になる。

この点で、森毅の文章は落語に近い。落語では、演目そのものは昔からある。同じ粗筋、同じ人物、同じ場面が繰り返される。それでも、話し手の間、声、脱線、時代の空気によって聞こえ方が変わる。森毅のエッセイも、毎回まったく新しい思想を提出するのではなく、持ちネタを生活の場面に合わせて振り直す。そのため、文章に無理な新奇さがない。

森毅の話の振り方は、読者を驚かせるためのものではない。まず身近な経験から入る。学校での違和感、世間の窮屈さ、勉強のしんどさ、老いの感覚などが置かれる。次に、それを少しだけ数学者らしい距離から眺める。そして最後に、正解を押しつけず、少し肩の力を抜く方向へ持っていく。この順番があるので、文章は奇をてらわずに進む。

森毅の反復には、読者に考え方を定着させる働きがある。一度だけ言われた思想は、標語で終わることがある。しかし、同じ言葉が本をまたいで何度も出てくると、それは著者の癖であり、読者にとっての道具になる。「まちがったっていい」「ものぐさでよい」という言葉は、森毅の中で理論であると同時に、生活の構えでもあった。

だから森毅の文章は、体系的な思想書として読むより、噺の蓄積として読むとよく見える。新しい結論を探すより、同じ話がどの場面で出てくるかを見る。そこに森毅の執筆スタイルがある。数学の厳密さを背景に持ちながら、文章では人を追い詰めない。同じネタを繰り返し、少しずつ世間の固さをゆるめていく。その反復の仕方に、森毅の芸がある。

📏バックトラッキング(逆引き)のテクニック解説

 

バックトラック」という言葉は、1950年代にアメリカの数学者D.H.レーマーによって作られた

〔意見・約束などを〕撤回する
〔来た時と〕同じ道を引き返す

90%以上のプログラミング用語は定義があいまいだ。アパッチヘリから窓、最終的にはおしゃぶり(pacifier)まで登場するこの渡世で、バックトラッキングとは何を提示することばなのか。

バックトラックとは,制約充足問題をはじめとする計算問題のすべて(または一部)の解を求めるための一般的なアルゴリズムで,解の候補を段階的に構築し,その候補が有効な解に完成できないと判断した時点で候補を放棄する(「バックトラック」)ものである

とにかくなにかをやめるんだな、おまえは

バックトラックが適用できる場合は、1回のテストで多くの候補を排除できるため、すべての完全な候補を総当りで列挙するよりもはるかに高速であることが多い。

順番が決まってれば、効率がいい時があるんだな

他の多くのメタヒューリスティックな手法とは異なり、有限の問題に対するすべての解を一定の時間内に見つけることが保証されてる。

バックトラック」という言葉は、1950年代にアメリカの数学者D.H.レーマーによって作られた

バックトラックは、クロスワード、暗算、数独などの制約充足問題を解くための重要なツールとなる

なんか、穴埋め問題的なやつを総当たりでやらなくてすむという

ナップザック問題をはじめとする組み合わせ最適化問題の解析[3]においても,最も便利な手法であることが多い.

試してみてうまくいかなかったならば、別のものを試す

深さ優先探索 - Wikipedia ja.wikipedia.org

深いところまで一旦降りると、

画像3

時を戻そう(バックトラッキング)

めちゃめちゃ簡単なバックトラッキングの例をみつけた。

Recursive Backtracking | Brilliant Math & Science Wiki Backtracking can be thought of as a selective tree/graph trav brilliant.org

ブリリアントさん、ありがとう。

長さNの配列Aには,N! の並び順があるはずです。

画像6

3x2x1で6ね。

def permutation(list, start, end):

   if (start == end):
       print list
   else:
       for i in range(start, end + 1):
           list[start], list[i] = list[i], list[start]  # The swapping
           permutation(list, start + 1, end)
           list[start], list[i] = list[i], list[start]  # Backtracking

permutation([1, 2, 3], 0, 2)  # The first index of a list is zero

これなら読める(泣 いや、ほんとは読めないけど、中身見たら多分分かる。。

と思ったが、こんなに短いが、やってることが意味不明。とりあえず、2箱しかない配列にして、スワップとバックトラッキングの詳細を表示するようにする。

画像7

再帰の仕組みも最小で終わるので、所定の数をスワップしたあともとに戻しているのがわかる。

これがバックトラッキングだー、理由はまだよくわからんが。。。

動きを確認するために、_で内部変数を作って、動きの確認ができるコードを作ってみた。

import copy
_stack=[]
def permutation(list, start, end,count):
   if (start == end):
       print(list)
   else:
       for i in range(start, end + 1):
           _backup=copy.copy(list);
           list[start], list[i] = list[i], list[start]  # The swapping
           _stack.append(_backup[i])
           print("swapped",_backup[start],"->",_backup[i],"then",list,_stack)
           permutation(list, start + 1, end,count)
           _backup=copy.copy(list);
           list[start], list[i] = list[i], list[start]  # Backtracking
           _stack.pop()
           print(" backte",_backup[i],"<-",_backup[start],"then",list,_stack)

permutation(['a', 'b','c'], 0, 2,0)  # The first index of a list is zero

結果はこんな感じで推移する

swapped a -> a then ['a', 'b', 'c'] ['a']
swapped b -> b then ['a', 'b', 'c'] ['a', 'b']
['a', 'b', 'c']
backte b <- b then ['a', 'b', 'c'] ['a']
swapped b -> c then ['a', 'c', 'b'] ['a', 'c']
['a', 'c', 'b']
backte b <- c then ['a', 'b', 'c'] ['a']
backte a <- a then ['a', 'b', 'c'] []
swapped a -> b then ['b', 'a', 'c'] ['b']
swapped a -> a then ['b', 'a', 'c'] ['b', 'a']
['b', 'a', 'c']
backte a <- a then ['b', 'a', 'c'] ['b']
swapped a -> c then ['b', 'c', 'a'] ['b', 'c']
['b', 'c', 'a']
backte a <- c then ['b', 'a', 'c'] ['b']
backte a <- b then ['a', 'b', 'c'] []
swapped a -> c then ['c', 'b', 'a'] ['c']
swapped b -> b then ['c', 'b', 'a'] ['c', 'b']
['c', 'b', 'a']
backte b <- b then ['c', 'b', 'a'] ['c']
swapped b -> a then ['c', 'a', 'b'] ['c', 'a']
['c', 'a', 'b']
backte b <- a then ['c', 'b', 'a'] ['c']
backte a <- c then ['a', 'b', 'c'] []

お分かりいただけただろうか?スワップをバックトラッキングでもどしてるんだが、再帰で戻ったときにやるから慣れてあらめちゃめちゃ処理が追いづらい。いくつか見やすい方法を考えて、スワップごとにスタックに積んで、バックトラッキングでスタックから出すコードを入れて、積んである文字の動きがなんとなくわかるようになった。

さらば、Nクイーン

なんとか分かりやすい例を見つけて、バックトラッキングのなんとなくを理解できるようになった。

非線形パターン(1つのパターン内で同じ変数が複数現れるパターン)に対するパターンマッチをサポートしている。 また、パターンマッチのよるデータの分解方法が複数ある場合でも、パターンマッチのための探索空間を効率よくバックトラッキングする。

https://ja.wikipedia.org/wiki/Egison
Amazon.co.jp: プログラムの構造と実行〈上〉 (COMPUTATION&SOFTWARE SCIENCE) : エーベルソン,H., サスマン,G.J., 文男, 元吉: Japanese Books Amazon.co.jp: プログラムの構造と実行〈上〉 (COMPUTATION&SOFTWARE SCIENC amzn.to
バックトラック バックトラック(バックトラッキング、BackTracking)はPrologでのインタプリタで解を探すときのプロセスのこと www.thothchildren.com

2026年5月31日日曜日

周辺ギアとしての「語彙力図鑑」 補完リンク

周辺ギアとしての「語彙力図鑑」

このシリーズは、単なる語彙学習本というより、執筆者の机まわりに置かれる「言葉の周辺ギア」として見るとわかりやすい。書く力そのものを直接売るというより、書く人が言葉を集め、分類し、眺め、取り出しやすくする環境を提供している。楽器でいえば、演奏技術ではなく、ストラップ、ピックケース、コード表、ペダルボードに近い。Rather than viewing this series as a mere vocabulary textbook, it makes more sense to think of it as a set of “writing accessories” kept on the author’s desk. Rather than directly selling writing skills, it provides an environment that helps writers collect, categorize, and easily access words. To use a musical instrument analogy, it’s not about playing technique, but rather about the strap, pick case, chord chart, and pedalboard.https://note.com/rodz/n/na154dcf2957b

2026年5月30日土曜日

小説版ダーディーハリー

 

公式的な一覧(全12冊+ノベライズ)

Dirty Harry novels(Wikipedia)
映画ノベライズ4冊と、1981–1983年のオリジナル小説12冊がまとまっています。

映画シリーズ全体

Dirty Harry film series
小説シリーズへの言及もあります。


映画ノベライズ

  1. Dirty Harry (1971) — Phillip Rock
  2. Magnum Force (1973) — Mel Valley
  3. The Enforcer (1976) — Wesley Morgan
  4. Sudden Impact (1983) — Joseph Stinson

Dane Hartman版オリジナル小説(全12冊)

  1. Duel for Cannons (1981)
  2. Death on the Docks (1981)
  3. The Long Death (1981)
  4. The Mexico Kill (1982)
  5. Family Skeletons (1982)
  6. City of Blood (1982)
  7. Massacre at Russian River (1982)
  8. Hatchet Men (1982)
  9. The Killing Connection (1982)
  10. The Blood of Strangers (1982)
  11. Death in the Air (1983)
  12. The Dealer of Death (1983)

古書検索向け

OpenLibrary 検索(Dirty Harry Dane Hartman)

Internet Archive 検索(Dirty Harry novels)

WorldCat 検索(Dirty Harry Dane Hartman)

このシリーズ、実は80年代のアメリカでは The Executioner や Mack Bolan に近い「メンズ・アクション・ペーパーバック」路線として読まれていたようです。映画の続編というより、“毎月出るハリー・キャラハン活劇”に近い立ち位置ですね。 

バックトラックを言語仕様にうまく組み込んだ例

 

1. Prolog系ロジック言語

代表: Prolog, Mercury, Curry など

  • 基本アイデア

    • 事実とルールを書く

    • クエリに対して、

      • 左から右

      • 上から下
        の順に試す深さ優先探索が「仕様として」定義されている。

    • 失敗したら自動でバックトラックして別の候補を試す。

  • うまい点

    • *「述語を呼び出す」ことと「条件分岐+ループ+探索」*が一体化している。

    • ;(選言)や -> ;(if-then-else)など、構文レベルでバックトラックと整合している。

    • cut (!) などで探索空間を制御する手段も仕様に含まれる。

  • 弱点(設計上のトレードオフ)

    • 論理式の“見た目”と探索手順が強く結びつくので、

      • 文の並びを変えると意味(実行結果)が変わる

      • 実装依存の挙動を理解してないと予測しづらい

    • つまり「宣言的」と「手続き的」がかなり混ざっている。


2. Icon の「ゴール指向評価」

代表: Icon, その後継の Unicon など

個人的に「バックトラックを言語デザインとして一番きれいに統合している例のひとつ」です。

  • コアの発想

    • すべての式が「成功」か「失敗」を返し、

      • さらに複数の値を順次生成しうる(generator)。

    • ある式が失敗すると、その直前の式が「別の値を生成しなおす」かを試す。
      それがバックトラック。

  • 例のイメージ(かなり擬似コード)

    1. # s の中から "abc" を含む位置を順に返すような感じ every i := find("abc", s) do write(i)

  • うまい点

    • 「success / failure / multiple results」という概念を式レベルに落とし込んでいる。

    • 制御構造(if, while, every など)が成功・失敗に一貫して基づいて設計されている。

    • バックトラックが「パターンマッチ専用の機能」ではなく、
      言語全体の評価モデルに統合されている。


3. SNOBOL4 のパターンマッチ

代表: SNOBOL4 などの文字列処理言語

  • 特徴

    • 文字列パターンが第一級オブジェクトとして扱われる。

    • パターンマッチの過程で、

      • 区間の長さを変えたり

      • 選択肢を切り替えたりする時に
        自動的にバックトラックが行われる。

  • うまい点

    • 「パターンマッチ」という限定された領域に
      バックトラックを特化しているので、挙動を理解しやすい。

    • パターン言語自体がかなり表現力があり、
      正規表現よりもずっとリッチな“マッチ DSL”として機能する。


4. 正規表現エンジン(言語内DSLだが、設計としては好例)

代表: Perl, Ruby, JavaScript などの バックトラッキング型正規表現

  • 多くの言語の正規表現は、

    • |(オルタネーション)

    • *, +, ?(繰り返し)

    • ?=, ?!(先読み)
      などの記法に対し、
      仕様としてバックトラックするマッチングアルゴリズムを想定している。

  • うまい点

    • 「バックトラックを隠蔽しつつ、必要なときに制御できる」設計。

    • 量指定子(*? などの最短一致)や否定先読みで、
      パフォーマンスや意味をある程度制御できる。

    • メイン言語の中に、
      バックトラック付きの小さな言語(正規表現)が埋め込まれている形。

  • 注意点

    • 複雑なパターンで指数時間に落ちるなど、
      バックトラック特有の性能問題はつきまとう。


5. パーサコンビネータ系(Haskell など)

代表: Haskell の Parsec / Megaparsec、OCaml/F# の parser combinator など

  • 発想

    • Parser a のような型で「入力から値 a を抜き出す計算」を表現。

    • (<|>) などのコンビネータで
      「まず左のパーサを試し、失敗したら右にバックトラック」
      という挙動をライブラリレベルで抽象化している。

  • 仕様上の組み込み度合い

    • これは「言語仕様」というより「ライブラリ+型システム」ですが、

      • do 記法(モナド)と

      • バックトラック付きパーサ
        がかなり自然に合成されるので、
        言語の一部のような書き心地になります。

  • うまい点

    • 型で「どの程度バックトラックするのか」「どの情報を残すか」を制御できる。

    • 必要に応じて

      • LL(1) 的にバックトラックを抑制したり

      • エラーメッセージをリッチにしたり
        といった調整がしやすい。


6. 述語・関係プログラミング(miniKanren など)

代表: miniKanren(Scheme/CL系の関係プログラミング言語)

  • 特徴

    • 「関数」ではなく「関係」を書いて、
      その関係を満たす値をバックトラックで探す。

    • conde(条件の選択)、fresh(新しい論理変数の導入)といった
      小さなプリミティブに、探索とバックトラックの意味がきれいに落ちている。

  • うまい点

    • とても小さなコア仕様(数十行レベル)で
      完全なロジックプログラミングの探索とバックトラックを実現している。

    • 言語仕様としても「極小コア+マクロ」で説明できるのが美しい。


ざっくりまとめ

「バックトラックを言語仕様にうまく組み込んだ」例として挙げやすいのは:

  1. Prolog 系

    • ロジックプログラミングそのものとして統合。

    • ただし宣言的と手続き的が密着しがち。

  2. Icon(+SNOBOL4 パターン)

    • 成功/失敗と多値生成を評価規則の中心に据えた、とてもきれいな設計。

  3. バックトラッキング正規表現

    • 言語内 DSL として、パターンマッチに特化した成功例。

  4. パーサコンビネータ / miniKanren

    • 言語+ライブラリ+型(またはマクロ)で、
      少ないプリミティブからバックトラックの計算モデルを構成している。

SpecCは、組込みシステム(ハードウェア+ソフトウェア)をシステムレベルで記述するための設計言語です

 SpecCは、組込みシステム(ハードウェア+ソフトウェア)をシステムレベルで記述するための設計言語です。位置づけとしては ANSI C を拡張した言語で、Verilog/VHDL のような低レベルHDLに落とす前の、上流の仕様化と段階的な具体化(リファインメント)に使います。

何ができる言語か

  • 早い段階で仕様を書く(機能仕様、構成の当たり付け)

  • その仕様を、実装に近い形へ段階的にリファインしていく(アーキテクチャ設計、HW/SW分割など)

  • IPの組み込みや、抽象度の違う部品の統合を扱いやすくする

Cに足されている「システム記述」の要素

SpecCはCに対して、システム設計に必要な概念を追加します。代表的には次です。

  • 階層化(構造を入れ子で表現)

  • 並行性(複数の振る舞いを同時に進める)

  • 通信(計算と通信を分離して扱うための仕組み)

  • 同期(待ち合わせ、排他など)

  • 状態遷移(FSM的なモデル)

  • 例外処理

  • 時間(タイミングのモデル)

SystemCとのざっくり比較

  • SystemCはC++ベースで普及度が高い

  • SpecCは「C拡張」で、システムレベルに必要な概念を比較的シンプルにまとめた思想

SpecCはシステム記述言語(SDL)またはシステムレベル設計言語(SLDL)であり、ANSI Cプログラミング言語の拡張です。デジタル組込みシステムの設計と仕様策定を支援するために使用され、[1]VerilogやVHDLのようなHDLとは異なり、機能レベルおよび仕様レベルでの設計変更能力を維持しつつ生産性の向上を実現します。アーキテクチャモデルを作成することで、他のツールが設計を直接シリコンやFPGAにマッピングできるようになります。主な目的は、様々な抽象化レベルにおけるIPの再利用、交換、統合です。
この言語と設計手法は、2001年にカリフォルニア大学アーバイン校の組み込みコンピュータシステムセンターにおいて、ライナー・ドーマーとダニエル・ガジスキによって考案されました。
類似のプロジェクトや設計手法には、C++ベースのSDLであるSystemCがある。この競合言語は業界での普及度がはるかに高い(ただしSpecCは日本で人気がある)が、SpecCは簡潔さを保ちつつ、並行処理(SpecCはパイプライン化および並列フローを提供)、同期、状態遷移(Verilogでは利用不可)、複合データ型といったSDLの重要な機能を提供している。

https://en.wikipedia.org/wiki/SpecC