2026年6月3日水曜日

SPDXはライセンス名を標準化した識別子で記す規格

 SPDXはライセンス名を標準化した識別子で記す規格で、表記ゆれを無くし依存関係収集やNOTICE自動化を容易にします。導入は、リポジトリ直下にLICENSE、各ソース先頭へSPDXヘッダ、依存ライセンスを識別子へ正規化、NOTICEをテンプレ化し生成、の順が最短。識別子は単一「MIT」、選択「GPL-2.0-or-later OR MIT」、併用「BSD-2-Clause AND MIT」、例外「… WITH …」を用います。NOTICEは再配布時に帰属が必要な依存のみ列挙し、著作権表示と必須文言を抜粋。自動化はロックファイルから依存を列挙し、識別子・著作権者・NOTICE要否を抽出してテンプレに差し込みます。運用では識別子変換表を整え、本文同梱要件と配布モデルを確認。SBOM出力やREUSE準拠も有効です。

Q1. SPDXとは何ですか?
ソフトウェアのライセンス名を統一ルールで書くための“共通表記”です。

Q2. 何が便利になりますか?
表記ゆれが無くなり、ライセンス確認や配布時の書類作成が楽になります。

Q3. まず何をすれば良いですか?
プロジェクトにLICENSEファイルを置き、各ソースの先頭に識別子を入れます。

Q4. 識別子って何ですか?
MITやApache-2.0のような短い決まり文句です。正式名ではなく識別子を書きます。

Q5. 書き方の例はありますか?
SPDX-License-Identifier: MIT の一行をファイル先頭のコメントに入れます。

Q6. 複数のライセンスが選べる場合は?
ORでつなぎます。例 GPL-2.0-or-later OR MIT。

Q7. 両方の条件を守る必要がある場合は?
ANDでつなぎます。例 BSD-2-Clause AND MIT。

Q8. 例外付きとは何ですか?
特定の追加条件がある場合です。WITHで書きます。

Q9. NOTICEとは何ですか?
配布物に同梱する「著作権表示のまとめ」です。必要な帰属文を一覧にします。

Q10. いつNOTICEが必要ですか?
再配布する時に、著作権表示や免責文の掲示が求められるライセンスを含む場合です。

Q11. MITやBSDでもNOTICEは要りますか?
基本は著作権表示の維持が必要です。NOTICEにまとめると分かりやすいです。

Q12. 依存ライブラリはどう扱いますか?
それぞれのライセンスを調べ、識別子で記録し、必要な表示だけNOTICEに載せます。

Q13. 社外公開しない社内利用でも必要ですか?
確認が容易になるため有益です。将来の公開や配布に備えられます。

Q14. ライセンス本文は同梱が必要ですか?
多くの場合は必要です。LICENSEフォルダなどにまとめて入れます。

Q15. 迷った時はどうすれば良いですか?
公式のSPDXライセンス一覧で識別子を確認し、配布条件はガイドや法務に相談します。

Q16. 導入の最小セットは何ですか?
LICENSE設置、各ファイルの識別子、必要に応じたNOTICEの三点です。

Q17. 既存プロジェクトへの導入は難しいですか?
段階的で大丈夫です。新規ファイルから識別子を入れ、主要部分から順に整備します。

Q18. ミスでよくあることは?
識別子の綴り違い、選択と併用の混同、LICENSE未同梱、NOTICEの過不足です。

Q19. 自動化はできますか?
できます。依存情報を集めてNOTICEの下書きを作る簡単なスクリプトでも十分役立ちます。

Q20. これで法的リスクは無くなりますか?
SPDXは表記の標準化です。最終的な適法性は配布形態と各ライセンスの要件確認が必要です。

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

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