はてなキーワード: 再帰とは
ロックに条件持たせる
やりたいことはできてるように見えるが、うーんしんどい
# Entity Relation Diagram
# ```mermaid
# ---
# title: Rental Office example
# ---
# erDiagram
# OFFICE ||--|{ ROOM : x
# OFFICE {
# number office_id
# }
# ROOM {
# number office_id
# number room_id
# }
# ROOM ||--|{ SCHEDULE : x
# SCHEDULE {
# number room_id
# datetime start_at
# datetime end_at
# }
# OFFICE ||--|{ BUSINESS_HOUR : x
# BUSINESS_HOUR {
# number office_id
# enum week_of_day
# datetime start_at
# datetime end_at
# }
# ```
# Directed Acyclic Graph
#
# ```mermaid
# graph LR
# A[OFFICE] --> B[ROOM]
# B --> C[SCHEDULE]
# A[OFFICE] --> D[BUSINESS_HOUR]
# D --> C
# A --> C
# ```
# 基底クラス: EntityLock
class EntityLock
attr_accessor :entity_name, :entity_locked, :attribute_locks
def initialize(entity_name)
@entity_name = entity_name
@entity_locked = false # エンティティ全体のロック状態を保持
@attribute_locks = {} # IDに対するロックを管理するハッシュ
end
def lock_entity
@entity_locked = true
puts "Entity '#{@entity_name}' is now locked."
end
def unlock_entity
@entity_locked = false
puts "Entity '#{@entity_name}' is now unlocked."
end
def lock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && !@attribute_locks[entity_id]
@attribute_locks[entity_id] = true
puts "#{@entity_name} with ID '#{entity_id}' is now locked."
end
end
def unlock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
@attribute_locks.delete(entity_id)
puts "#{@entity_name} with ID '#{entity_id}' is now unlocked."
end
end
def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked
# 次に特定のIDがロックされているかチェック
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
return true
end
# ロックされていなければfalseを返す
false
end
end
# 子クラス: OfficeLock, RoomLock, ScheduleLock
class OfficeLock < EntityLock
def initialize
super("Office")
end
end
class RoomLock < EntityLock
def initialize
super("Room")
end
end
class ScheduleLock < EntityLock
def initialize
super("Schedule")
end
end
# 子クラス: BusinessHourLock
class BusinessHourLock < EntityLock
def initialize
super("BusinessHour")
@attribute_locks = [] # BusinessHour用のロックを配列で管理
end
def lock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at && end_at
@attribute_locks << [start_at, end_at]
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now locked."
end
end
def unlock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if @attribute_locks.include?([start_at, end_at])
@attribute_locks.delete([start_at, end_at])
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now unlocked."
end
end
def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked
# 次に特定の時間範囲がロックされているかチェック
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at && end_at
@attribute_locks.each do |(locked_start, locked_end)|
if locked_start <= start_at && end_at <= locked_end
return true
end
end
end
# ロックされていなければfalseを返す
false
end
end
# TreeNodeクラス
class TreeNode
attr_accessor :name, :children, :parents, :lock
def initialize(name, lock)
@name = name
@children = []
@parents = [] # 複数の親ノードを保持する配列
@lock = lock # TreeNodeにロックを持たせる
end
def add_child(child_node)
child_node.parents << self # 子ノードにこのノードを親として追加
@children << child_node
end
def display(level = 0)
indent = " " * (level * 4)
puts "#{indent}#{@name}"
@children.each { |child| child.display(level + 1) }
end
def has_dependency
return false if @parents.empty?
@parents.each do |parent|
puts "#{@name} is dependent on #{parent.name}"
return true
end
@parents.any?(&:has_dependency)
end
def locked?(attributes = {})
# 自身がロックされているか確認
return true if @lock.locked?(attributes)
# 親ノードがロックされているか再帰的に確認
@parents.any? { |parent| parent.locked?(attributes) }
end
end
# 木構造の組み立て
# ロックオブジェクトの作成
office_lock = OfficeLock.new
room_lock = RoomLock.new
schedule_lock = ScheduleLock.new
business_hour_lock = BusinessHourLock.new
# ノードの作成
office_node = TreeNode.new("Office", office_lock)
room_node = TreeNode.new("Room", room_lock)
schedule_node = TreeNode.new("Schedule", schedule_lock)
business_hour_node = TreeNode.new("BusinessHour", business_hour_lock)
# ノード間の依存関係の設定
office_node.add_child(room_node) # Office -> Room
room_node.add_child(schedule_node) # Room -> Schedule
office_node.add_child(business_hour_node) # Office -> BusinessHour
business_hour_node.add_child(schedule_node) # BusinessHour -> Schedule
# 木構造の表示
office_node.display
# ロックの確認
puts "Case 1. Office全体がロックされた場合"
puts "Is office_node locked? #{office_node.locked?({})}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # false
office_lock.lock_entity
puts "Is office_node locked? #{office_node.locked?({})}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # true
office_lock.unlock_entity
puts "Case 2. Room id:1 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.lock({ "room_id" => 1 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.unlock({ "room_id" => 1 })
puts "Case 3. BusinessHour start_at:0 end_at:5 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.lock({ "start_at" => 0, "end_at" => 5 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.unlock({ "start_at" => 0, "end_at" => 5 })
で・・・できたけど木の組み立てがしんどすぎるー
class TreeNode:
def __init__(self, name, attributes=None):
self.name = name
self.attributes = attributes or {}
self.children = []
def add_child(self, child_node):
self.children.append(child_node)
def display(self, level=0):
indent = " " * level
print(f"{indent}{self.name} {self.attributes}")
for child in self.children:
child.display(level + 1)
def has_dependency(self):
# ルートノードや属性を持たないノードは依存関係を判定しない
if not self.children:
return False
for child in self.children:
# 子ノードがBusinessHourかScheduleかをチェック
if "start_at" in child.attributes and "end_at" in child.attributes:
child_start = child.attributes["start_at"]
child_end = child.attributes["end_at"]
# 現在のノードがBusinessHourで、子がScheduleの場合
if "start_at" in self.attributes and "end_at" in self.attributes:
self_start = self.attributes["start_at"]
self_end = self.attributes["end_at"]
if self_start <= child_start and self_end >= child_end:
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is dependent on {self.name} (start_at: {self_start}, end_at: {self_end})")
else:
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is NOT dependent on {self.name} (start_at: {self_start}, end_at: {self_end})")
# 現在のノードがRoomで、子がScheduleの場合
elif self.name.startswith("Room"):
print(f"{child.name} (start_at: {child_start}, end_at: {child_end}, room_id: {child.attributes['room_id']}) is dependent on Room {self.name[-1]}")
else:
child.has_dependency()
# 子ノードが属性を持たない場合、再帰的に依存関係をチェック
else:
child.has_dependency()
# ノードの作成
root = TreeNode("Root")
office_node = TreeNode("Office")
# Roomノードの作成
room1_node = TreeNode("Room1")
room2_node = TreeNode("Room2")
# BusinessHourノードの作成
business_hour1_node = TreeNode("BusinessHour1", {"start_at": 9, "end_at": 12})
business_hour2_node = TreeNode("BusinessHour2", {"start_at": 13, "end_at": 17})
# Scheduleノードの作成
schedule1_node = TreeNode("Schedule1", {"start_at": 10, "end_at": 11, "room_id": 1})
schedule2_node = TreeNode("Schedule2", {"start_at": 14, "end_at": 15, "room_id": 1})
schedule3_node = TreeNode("Schedule3", {"start_at": 10, "end_at": 11, "room_id": 2})
schedule4_node = TreeNode("Schedule4", {"start_at": 14, "end_at": 15, "room_id": 2})
# 木構造の構築
root.add_child(office_node)
office_node.add_child(room1_node)
office_node.add_child(room2_node)
office_node.add_child(business_hour1_node)
office_node.add_child(business_hour2_node)
# Room1にSchedule1, Schedule2を追加
room1_node.add_child(schedule1_node)
room1_node.add_child(schedule2_node)
# Room2にSchedule3, Schedule4を追加
room2_node.add_child(schedule3_node)
room2_node.add_child(schedule4_node)
# BusinessHour1にSchedule1, Schedule3を追加
business_hour1_node.add_child(schedule1_node)
business_hour1_node.add_child(schedule3_node)
# BusinessHour2にSchedule2, Schedule4を追加
business_hour2_node.add_child(schedule2_node)
business_hour2_node.add_child(schedule4_node)
# 木構造の表示
root.display()
# 依存関係のチェック
office_node.has_dependency()
room1_node.has_dependency()
room2_node.has_dependency()
business_hour1_node.has_dependency()
business_hour2_node.has_dependency()
Root {}
Office {}
Room1 {}
Schedule1 {'start_at': 10, 'end_at': 11, 'room_id': 1}
Schedule2 {'start_at': 14, 'end_at': 15, 'room_id': 1}
Room2 {}
Schedule3 {'start_at': 10, 'end_at': 11, 'room_id': 2}
Schedule4 {'start_at': 14, 'end_at': 15, 'room_id': 2}
BusinessHour1 {'start_at': 9, 'end_at': 12}
Schedule1 {'start_at': 10, 'end_at': 11, 'room_id': 1}
Schedule3 {'start_at': 10, 'end_at': 11, 'room_id': 2}
BusinessHour2 {'start_at': 13, 'end_at': 17}
Schedule2 {'start_at': 14, 'end_at': 15, 'room_id': 1}
Schedule4 {'start_at': 14, 'end_at': 15, 'room_id': 2}
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on Room 1
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on Room 1
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on Room 2
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on Room 2
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on Room 1
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on Room 1
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on Room 2
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on Room 2
Schedule1 (start_at: 10, end_at: 11, room_id: 1) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule3 (start_at: 10, end_at: 11, room_id: 2) is dependent on BusinessHour1 (start_at: 9, end_at: 12)
Schedule2 (start_at: 14, end_at: 15, room_id: 1) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
Schedule4 (start_at: 14, end_at: 15, room_id: 2) is dependent on BusinessHour2 (start_at: 13, end_at: 17)
決定木は、質問を使って答えを見つけるゲームのようなものです。木の形をした図を使って、質問と答えを整理します。例えば、「今日は外で遊べるかな?」という大きな質問から始めます。
まず「雨が降っていますか?」と聞きます。「はい」なら「家で遊ぼう」、「いいえ」なら次の質問に進みます。次に「宿題は終わっていますか?」と聞きます。「はい」なら「外で遊ぼう」、「いいえ」なら「宿題をしてから遊ぼう」となります。
このように、質問を重ねていくことで、最終的な答えにたどり着きます。決定木は、こうした「もし〜なら」という考え方を使って、物事を順序立てて考えるのに役立ちます。
決定木は、機械学習における重要な分類・回帰アルゴリズムの一つです。データを特定の特徴に基づいて分割し、ツリー構造を形成することで、新しいデータの分類や予測を行います。
4. 枝:各ノードを結ぶ線、条件を表す
2. その特徴に基づいてデータを分割
3. 各サブセットに対して1と2を再帰的に繰り返す
4. 停止条件(深さ制限や最小サンプル数など)に達したら終了
決定木の利点は、解釈が容易で直感的であること、非線形の関係性も捉えられること、特徴量の重要度を評価できることなどです。一方で、過学習しやすい傾向があり、小さなデータの変化に敏感に反応する欠点もあります。
決定木は、分類および回帰問題に適用可能な非パラメトリックな監督学習アルゴリズムです。特徴空間を再帰的に分割し、各分割点で最適な特徴と閾値を選択することで、データを階層的に構造化します。
決定木の構築プロセスは、以下の数学的基準に基づいて行われます:
ここで、H(S)はエントロピー、Svは分割後のサブセット、piはクラスiの確率、yiは実際の値、ŷiは予測値を表します。
1. 事前剪定(Pre-pruning):成長の早期停止
2. 事後剪定(Post-pruning):完全に成長した木を後から刈り込む
決定木の性能向上のために、アンサンブル学習手法(ランダムフォレスト、勾配ブースティング木など)と組み合わせることが一般的です。
決定木は、特徴空間の再帰的分割に基づく非パラメトリックな監督学習アルゴリズムであり、分類および回帰タスクに適用可能です。その理論的基盤は、情報理論と統計学に深く根ざしています。
決定木の構築アルゴリズムとして最も一般的なのは、CART(Classification and Regression Trees)です。CARTは以下の手順で実装されます:
決定木の拡張:
これらの高度な手法により、決定木の表現力と汎化性能が向上し、より複雑なパターンの学習が可能となります。
決定木は、特徴空間Xの再帰的分割に基づく非パラメトリックな監督学習アルゴリズムであり、その理論的基盤は統計的学習理論、情報理論、および計算学習理論に深く根ざしています。
決定木の数学的定式化:
Let D = {(x₁, y₁), ..., (xₙ, yₙ)} be the training set, where xᵢ ∈ X and yᵢ ∈ Y. The decision tree T: X → Y is defined as a hierarchical set of decision rules.
For classification: P(y|x) = Σᵢ P(y|leaf_i) * I(x ∈ leaf_i)
For regression: f(x) = Σᵢ μᵢ * I(x ∈ leaf_i) where I(·) is the indicator function, leaf_i represents the i-th leaf node.
決定木の最適化問題: min_T Σᵢ L(yᵢ, T(xᵢ)) + λ * Complexity(T) where L is the loss function, λ is the regularization parameter, and Complexity(T) is a measure of tree complexity (e.g., number of leaves).
H(Y|X) = -Σᵧ Σₓ p(x,y) log(p(y|x))
I(X;Y) = H(Y) - H(Y|X)
2. ジニ不純度:
Gini(t) = 1 - Σᵢ p(i|t)²
MSE(t) = (1/|t|) * Σᵢ (yᵢ - ȳ_t)²
1. 一致性と収束速度: 決定木の一致性は、Breiman et al. (1984)によって証明されました。収束速度はO(n^(-1/(d+2)))であり、dは特徴空間の次元です。
2. バイアス-バリアンストレードオフ:深い木は低バイアス・高バリアンス、浅い木は高バイアス・低バリアンスとなります。最適な深さは、バイアスとバリアンスのトレードオフによって決定されます。
3. 決定木の表現力:任意のブール関数は、十分に深い決定木で表現可能です。これは、決定木がユニバーサル近似器であることを意味します。
4. 計算複雑性理論:最適な決定木の構築はNP完全問題であることが知られています(Hyafil & Rivest, 1976)。そのため、実用的なアルゴリズムは貪欲な近似アプローチを採用しています。
5. 正則化と構造リスク最小化:L0正則化(葉ノード数のペナルティ)やL2正則化(葉ノードの予測値に対するペナルティ)を用いて、構造リスク最小化原理に基づいたモデル選択を行います。
6. 情報幾何学的解釈: 決定木の学習過程は、特徴空間上の確率分布の漸進的な分割と見なすことができ、情報幾何学の観点から解析可能です。
7. カーネル決定木:非線形カーネル関数を用いて特徴空間を暗黙的に高次元化し、より複雑な決定境界を学習する手法です。
8. 量子決定木:量子コンピューティングの原理を応用し、古典的な決定木を量子系に拡張した手法です。量子重ね合わせを利用して、指数関数的に多くの分岐を同時に評価できる可能性があります。
これらの高度な理論と技術を組み合わせることで、決定木アルゴリズムの性能と適用範囲を大幅に拡張し、より複雑な学習タスクに対応することが可能となります。
論理が大事だというのなら、価値規範を考えるにあたって必然的に一度ニヒリズムへと辿り着くと思う。
まず起点として不条理にもまっさらなその状態があって、そこから先に何を信じるかは各々の勝手だと思う。そうであるべき、というか単に事実としてそうとしか思えない。
道徳的直観みたいな存在もあんまり信じられない。多少のバラつきはあるにせよある程度普遍的なその感覚が存在するのだとしたら、ここまで社会規範が多様な状況について、同じ前提から展開される論理の独自性だけで説明がつく気がしない。
個人の行動原理としてブッディズムなり刹那主義なり実存主義なり、あるいはニヒリズムに留まってただただ絶望するなり。社会思想としては民主主義なり社会主義なりアナーキズムなり。あるいはその両方を包括する宗教なり。
あくまで前提としてニヒリズムがあって、そこから何かしらの信仰を再帰的に持つ事で初めて自分の確信に基づいて、あるいは環境によって刷り込まれることで価値規範が手に入る。
あるいはあらゆる規範を一度無へと返す段階を経ずに、元々信じていたものを揺るぎない真実だと思い続ける人もいるかもしれない。別にそれで全然いいとは思うけど、その「真実」を他人も当然共有していると思われるとちょっと面倒臭い。せめて、少なくとも社会的には権威・影響力を持っているくらいの認識でいて欲しい。
そういった信仰を持たない事を誇ったり、スタート地点のニヒリズムに居座って全ての無意味を悲観的に嘆く。その上他人もその世界観を共有している、あるいは共有されるべきだと信じて疑わない。
そんな人間を冷笑野郎だと罵るのであれば、まあ分からんでもない。
別にそういう態度を他人に向けて喧伝するんでもなければ外野がとやかく言うのも余計なお世話だろとは思いつつ、まあおれもいけ好かないとは思う。
もし本当に何の信仰もなければ何の行動原理もない訳で、そしたら石のように沈黙するか、あるいは一切の規範に囚われることなく本能に従って野獣の如く振る舞うんじゃないかと思う。
ただ、ニヒリズムを前提に置く事を以てして冷笑呼ばわりしたり、その癖私は論理的ですけど?みたいなスタンスを取るのはゴミカスだろって思う。
ワイ:
ChatGPT:
基数ソート(Radix Sort)は、分割統治法(Divide and Conquer)を利用しているとは一般的には考えられません。基数ソートは、数値や文字列などのキーを持つ要素を、そのキーの各桁について個別にソートすることによって全体をソートするアルゴリズムです。通常、最も下位の桁から始めて、各桁について安定ソート(たとえばカウンティングソートやバケットソート)を適用していきます。
分割統治法は、問題をより小さなサブプロブレムに分割し(Divide)、それらのサブプロブレムを解決して(Conquer)、最後にサブプロブレムの解を統合して(Combine)元の問題の解を得るアプローチです。典型的な分割統治法のアルゴリズムには、クイックソートやマージソートがあります。
基数ソートはこのアプローチに従わず、代わりに全体のデータセットに対して桁ごとのソートを繰り返すことで全体をソートします。各桁のソートはデータセット全体に対して行われ、データセットをサブプロブレムに分割してそれぞれを独立に解決し、後で統合するというプロセスはありません。そのため、基数ソートは分割統治法を利用しているとは一般的には見なされません。
ただし、基数ソートの各ステップでサブプロブレムに分けることなく全体のデータセットに対して操作を行うという点で、分割統治法の概念の一部と見ることができるかもしれませんが、これは分割統治法の典型的な使用法からは逸脱しています。
ワイ:
ChatGPT:
基数ソートを上の桁から開始して同じキーを持つグループに分割し、階層的に並べていくというアプローチは、実際には「Most Significant Digit (MSD) Radix Sort」と呼ばれる基数ソートのバリエーションであり、有効な手法です。MSD基数ソートは、最も上位の桁(Most Significant Digit)から始めて、各桁ごとにデータをグループ化し、それぞれのグループに対して再帰的に同じプロセスを適用していきます。このアプローチは、ある意味で分割統治法の考え方を取り入れています。
分割: 最も上位の桁に基づいてデータを複数のバケット(グループ)に分割します。各バケットは同じ桁の値を持つ要素を含みます。
統治: それぞれのバケットに対して、次に下位の桁に基づいてソートを再帰的に適用します。これにより、各バケット内の要素がさらに細かく分類されます。
結合: 最終的に、すべてのバケットを順序通りに結合して、ソートされた全体のリストを得ます。
このアプローチでは、データセットをサブセットに分割し、それぞれのサブセットに対して問題を再帰的に解いていくという分割統治法の原則に従っています。ただし、MSD基数ソートは、分割統治アルゴリズムの典型的な例(マージソートやクイックソートなど)とは異なり、再帰的な過程でサブセット間の「統合」ステップが必要ありません。各再帰的なステップでのソートが完了した時点で、要素は既に部分的にソートされた状態になっているため、最終的な結合は単純なリストの連結に過ぎません。
MSD基数ソートは、特に固定長のキーを持つデータや、文字列などの可変長データをソートする場合に有効な手法です。しかし、このアプローチは、特にキーの分布が均一でない場合や、データセットが大きい場合には、メモリ使用量が大きくなる可能性があるため、実際の使用状況に応じて適切なソートアルゴリズムを選択することが重要です。
分割統治法じゃん。
〈佐藤優現象〉を支えている護憲派の中心は、雑誌としては『世界』であり、学者では山口二郎と和田春樹である。この顔ぶれを見て、既視感を覚える人はいないだろうか。すなわち、「平和基本法」である。これは、山口や和田らが執筆し、共同提言として、『世界』一九九三年四月号に発表された。その後、二度の補足を経ている(56)。
私は、〈佐藤優現象〉はこの「平和基本法」からの流れの中で位置づけるべきだと考える。
同提言は、①「創憲論」の立場、②自衛隊の合憲化(57)、③日本の経済的地位に見合った国際貢献の必要性、④国連軍や国連の警察活動への日本軍の参加(58)、⑤「国際テロリストや武装難民」を「対処すべき脅威」として設定、⑥日米安保の「脱軍事化」、といった特徴を持つが、これが、民主党の「憲法提言」(二〇〇五年一〇月発表)における安全保障論と論理を同じくしていることは明白だろう。実際に、山口二郎は、二〇〇四年五月時点で、新聞記者の「いま改憲は必要なのか」との問いに対して、「十年ほど前から、護憲の立場からの改憲案を出すべきだと主張してきた。しかし、いまは小泉首相のもとで論理不在の憲法論議が横行している。具体的な憲法改正をやるべき時期ではないと思う」と答えている(59)。「創憲論」とは、やはり、改憲論だったのである。
同提言の二〇〇五年版では、「憲法九条の維持」が唱えられているが、これは、政権が「小泉首相のもと」にあるからだ、と解釈した方がいいだろう。「平和基本法」は、戦争をできる国、「普通の国」づくりのための改憲論である。同提言は軍縮を謳っているが、一九九三年版では、軍縮は「周辺諸国の軍縮過程と連動させつつ」行われるとされているのだから、北朝鮮や中国の軍事的脅威が強調される状況では、実現する見込みはないだろう(60)。また、「かつて侵略したアジアとの本当の和解」、二〇〇五年版では、周辺諸国への謝罪と過去清算への誠実な取組みの必要性が強調されているが、リベラルは過去清算は終わったと認識しているのであるから、これも実効性があるとは思えない。要するに、同提言には、論理内在的にみて、軍事大国化への本質的な歯止めがないのである。
佐藤が語る、愛国心の必要性(61)、国家による市民監視(62)、諜報機関の設置等は、「普通の国」にとっては不可欠なものである。佐藤の饒舌から、私たちは、「平和基本法」の論理がどこまで行き着くかを学ぶことができる。
馬場は、小泉純一郎首相(当時)の靖国参拝について、「今後PKOなどの国際的軍事・平和維持活動において殉死・殉職した日本人の慰霊をどう処理し追悼するか、といった冷戦後の平和に対する構想を踏まえた追悼のビジョンもそこからは得られない」と述べている(63)。逆に言えば、馬場は、今後生じる戦死者の「慰霊」追悼施設が必要だ、と言っているわけである。「普通の国」においては、靖国神社でないならば、そうした施設はもちろん、不可欠だろう。私は、〈佐藤優現象〉を通じて、このままではジャーナリズム内の護憲派は、国民投票を待たずして解体してしまう、と前に述べた。だが、むしろ、すでに解体は終わっているのであって、「〈佐藤優現象〉を通じて、残骸すら消えてしまう」と言うべきだったのかもしれない。
ここで、テロ特措法延長問題に触れておこう(64)。国連本部政務官の川端清隆は、小沢一郎民主党代表の、テロ特措法延長反対の発言について、「対米協調」一辺倒の日本外交を批判しつつ、「もし本当に対テロ戦争への参加を拒絶した場合、日本には国連活動への支援も含めて、不参加を補うだけの実績がない」、「ドイツが独自のイラク政策を採ることができたのは、アフガニスタンをはじめ、世界の各地で展開している国連PKOや多国籍軍に参加して、国際社会を納得させるだけの十分な実績を積んでいたからである。翻って日本の場合、多国籍軍は言うに及ばず、PKO参加もきわめて貧弱で、とても米国や国際社会の理解を得られるものとはいえない」と述べている(65)。
元国連職員の吉田康彦は「国連憲章の履行という点ではハンディキャップなしの「普通の国」になるべきだと確信している。(中略)安保理決議による集団安全保障としての武力行使には無条件で参加できるよう憲法の条文を明確化するのが望ましい」と述べている(66)。川端と吉田の主張をまとめれば、「対米協調一辺倒を避けるため、国連PKOや多国籍軍の軍事活動に積極的に参加して「国際貢献」を行わなければならない。そのためには改憲しなければならない」ということになろう。民主党路線と言ってもよい。今の護憲派ジャーナリズムに、この論理に反論できる可能性はない。「8」で指摘したように、対北朝鮮武力行使を容認してしまえば、改憲した方が整合性があるのと同じである。
なお、佐藤は、『世界』二〇〇七年五月号に掲載された論文「山川均の平和憲法擁護戦略」において、「現実の国際政治の中で、山川はソ連の侵略性を警戒するのであるから、統整的理念としては非武装中立を唱えるが、現実には西側の一員の日本を前提として、外交戦略を組み立てるのである。」「山川には統整的理念という、人間の努力によっては到底達成できない夢と、同時にいまこの場所にある社会生活を改善していくという面が並存している」と述べている。私は発刊当初この論文を一読して、「また佐藤が柄谷行人への点数稼ぎをやっている」として読み捨ててしまっていたが、この「9」で指摘した文脈で読むと意味合いが変わってくる。佐藤は、「平和憲法擁護」という建前と、本音が分裂している護憲派ジャーナリズムに対して、「君はそのままでいいんだよ」と優しく囁いてくれているのだ。護憲派ジャーナリズムにとって、これほど〈癒し〉を与えてくれる恋人もいるまい(67)。
10.おわりに
これまでの〈佐藤優現象〉の検討から、このままでは護憲派ジャーナリズムは、自民党主導の改憲案には一〇〇%対抗できないこと、民主党主導の改憲案には一二〇%対抗できないことが分かった。また、いずれの改憲案になるにしても、成立した「普通の国」においては、「7」で指摘したように、人種差別規制すらないまま「国益」を中心として「社会問題」が再編されることも分かった。佐藤は沖縄でのシンポジウムで、「北朝鮮やアルカイダの脅威」と戦いながら、理想を達成しようとする「現実的平和主義」を聴衆に勧めている(68)が、いずれの改憲案が実現するとしても、佐藤が想定する形の、侵略と植民地支配の反省も不十分な、「国益」を軸とした〈侵略ができる国〉が生まれることは間違いあるまい。「自分は国家主義者じゃないから、「国益」論なんかにとりこまれるはずがない」などとは言えない。先進国の「国民」として、高い生活水準や「安全」を享受することを当然とする感覚、それこそが「国益」論を支えている。その感覚は、そうした生存の状況を安定的に保障する国家―先進国主導の戦争に積極的に参加し、南北間格差の固定化を推進する国家―を必要とするからだ。その感覚は、経済的水準が劣る国の人々への人種主義、「先進国」としての自国を美化する歴史修正主義の温床である。
大雑把にまとめると、〈佐藤優現象〉とは、九〇年代以降、保守派の大国化路線に対抗して、日本の経済的地位に見合った政治大国化を志向する人々の主導の下、謝罪と補償は必要とした路線が、東アジア諸国の民衆の抗議を契機として一頓挫したことや、新自由主義の進行による社会統合の破綻といった状況に規定された、リベラル・左派の危機意識から生じている。九〇年代の東アジア諸国の民衆からの謝罪と補償を求める声に対して、他国の「利益のためではなく、日本の私たちが、進んで過ちを正しみずからに正義を回復する、即ち日本の利益のために」(69)(傍点ママ)歴史の清算を行おうとする姿勢は、リベラル内にも確かにあり、そしてその「日本の利益」とは、政治大国を前提とした「国益」ではなく、侵略戦争や植民地支配を可能にした社会のあり方を克服した上でつくられる、今とは別の「日本」を想定したものであったろう。私たちが目撃している〈佐藤優現象〉は、改憲後の国家体制に適合的な形で生き残ろうと浮き足立つリベラル・左派が、「人民戦線」の名の下、微かに残っているそうした道を志向する痕跡を消失もしくは変質させて清算する過程、いわば蛹の段階である。改憲後、蛹は蛾となる。
ただし、私は〈佐藤優現象〉を、リベラル・左派が意図的に計画したものと捉えているわけではない。むしろ、無自覚的、野合的に成立したものだと考えている。藤田省三は、翼賛体制を「集団転向の寄り合い」とし、戦略戦術的な全体統合ではなく、諸勢力のからみあい、もつれあいがそのまま大政翼賛会に発展したからこそ、デマゴギーそれ自体ではなく、近衛文麿のようなあらゆる政治的立場から期待されている人物が統合の象徴となったとし、「主体が不在であるところでは、時の状況に丁度ふさわしい人物が実態のまま象徴として働く」、「翼賛会成立史は、この象徴と人物の未分性という日本政治の特質をそれこそ象徴的に示している」と述べている(70)が、〈佐藤優現象〉という名の集団転向現象においては、近衛のかわりに佐藤が「象徴」としての機能を果たしている。この「象徴」の下で、惰性や商売で「護憲」を唱えているメディア、そのメディアに追従して原稿を書かせてもらおうとするジャーナリストや発言力を確保しようとする学者、無様な醜態を晒す本質的には落ち目の思想家やその取り巻き、「何かいいことはないか」として寄ってくる政治家や精神科医ら無内容な連中、運動に行き詰った市民運動家、マイノリティ集団などが、お互いに頷きあいながら、「たがいにからみあい、もつれあって」、集団転向は進行している。
ところで、佐藤は、「仮に日本国家と国民が正しくない道を歩んでいると筆者に見えるような事態が生じることがあっても、筆者は自分ひとりだけが「正しい」道を歩むという選択はしたくない。日本国家、同胞の日本人とともに同じ「正しくない」道を歩む中で、自分が「正しい」と考える事柄の実現を図りたい」と述べている(71)。佐藤は、リベラル・左派に対して、戦争に反対の立場であっても、戦争が起こってしまったからには、自国の国防、「国益」を前提にして行動せよと要求しているのだ。佐藤を賞賛するような人間は、いざ開戦となれば、反戦運動を行う人間を異端者扱いするのが目に見えている。
この佐藤の発言は、安倍晋三前首相の目指していた「美しい国」づくりのための見解とも一致する。私見によれば、安倍の『美しい国へ』(新潮新書、二〇〇六年七月)全二三二頁の本のキモは、イランでのアメリカ大使館人質事件(一九七九年)をめぐる以下の一節である。「(注・反カーター陣営の)演説会で、意外に思ったことがある。人質事件に触れると、どの候補者もかならず、「私は大統領とともにある」(I am behind the President.)というのだ。ほかのことではカーターをこきおろす候補者が、そこだけは口をそろえる。/もちろん、人質にされている大使館員たちの家族に配慮するという意図からだろうが、アメリカは一丸となって事件に対処しているのだ、という明確なメッセージを内外に発しようとするのである。国益がからむと、圧倒的な求心力がはたらくアメリカ。これこそがアメリカの強さなのだ。」(八七~八八頁)
文中の、「人質事件」を拉致問題に、「大統領」を安倍に、「アメリカ」を日本に置き換えてみよ。含意は明白であろう。安倍は辞任したとはいえ、総連弾圧をめぐる日本の言論状況や、〈佐藤優現象〉は、安倍の狙いが実現したことを物語っている。安倍政権は倒れる前、日朝国交正常化に向けて動きかけた(正確には米朝協議の進展で動かされたと言うべきだが)が、こうなるのは少なくとも今年春からは明らかだったにもかかわらず、リベラル・左派の大多数は、「日朝国交正常化」を公然と言い出せなかった。安倍政権が北朝鮮外交に敗北したのは明らかである。だが、日本のリベラル・左派は安倍政権ごときに敗北したのである。
〈佐藤優現象〉は、改憲後に成立する「普通の国」としての〈侵略ができる国〉に対して、リベラル・左派の大部分が違和感を持っていないことの表れである。侵略と植民地支配の過去清算(在日朝鮮人の人権の擁護も、そこには含まれる)の不十分なままに成立する「普通の国」は、普通の「普通の国」よりはるかに抑圧的・差別的・侵略的にならざるを得ない。〈佐藤優現象〉のもとで、対北朝鮮武力行使の言説や、在日朝鮮人弾圧の言説を容認することは、戦争国家体制に対する抵抗感を無くすことに帰結する。改憲に反対する立場の者がたたかうべきポイントは、改憲か護憲(反改憲)かではない。対北朝鮮武力行使を容認するか、「対テロ戦争」という枠組み(72)を容認するかどうかである。容認してしまえば、護憲(反改憲)派に勝ち目はない。過去清算も不十分なまま、札束ではたいて第三世界の諸国の票を米国のためにとりまとめ、国連の民主的改革にも一貫して反対してきた日本が、改憲し、常任理事国化・軍事大国化して、(国連主導ではあれ)米軍中心の武力行使を容易にすることは、東アジア、世界の平和にとって大きな災厄である(73)。
改憲と戦争国家体制を拒否したい人間は、明確に、対北朝鮮武力行使の是非、対テロ戦争の是非という争点を設定して絶対的に反対し、〈佐藤優現象〉及び同質の現象を煽るメディア・知識人等を徹底的に批判すべきである。
註
(1)岩波書店労働組合「壁新聞」二八一九号(二〇〇七年四月)。
(2)ブログ「猫を償うに猫をもってせよ」二〇〇七年五月一六日付。
(3)ただし、編集者は佐藤が右翼であることを百も承知の上で使っていることを付言しておく。〈騙されている〉わけではない。
(4)「佐藤優という罠」(『AERA』二〇〇七年四月二三日号)中のコメントより。
(5)インターネットサイト「フジサンケイ ビジネスアイ」でほぼ週一回連載中の〈 Permalink | 記事への反応(0) | 18:37
役所といえば「たらい回し」のイメージが付きまとう。実際にたらい回しにされた経験がある人も少なくない(私も何度もある)だろうが、もちろん役所側も好きでたらい回しをしているわけではない。
また、慢性的な人手不足から、役所全体の業務を横断的に把握して的確に問い合わせ対応できる人材も今後ますます減ってくると思う。
そこで、お互いの不幸な時間を減らすためにも、問い合わせる側の留意点をまとめてみた(役所側にたらい回しを防ぐ努力が必要なのは言うまでもない)。
はてな民ならこの点については心得ている人が多いと思うが、市の業務について国や県に問い合わせても答えられない(逆も然り)。国の下に都道府県、その下に市町村というイメージがあるが、法律上三者は全く別の組織で、業務も別々である。
ここを間違えてしまった場合「お住まいの市にお問い合わせください」などと言われて終わり、たらいすら回されない。
ちなみに現在は、一般市民が関わるような事柄は大体市町村が担当している(昔は都道府県が所管していた業務も多かったが、市町村への権限委譲が進んだ)。
役所に連絡を取ろうとしたきっかけはなんだろうか?手紙だったら手紙に、WebページだったらWebページに必ず代表電話ではない担当の直通電話ないし内線番号が書いてあるはずだ。イベントなど臨時の事業の場合は専用ダイヤルを設けていることも多い。
代表電話はどこを見ても担当が不明であるときの最終手段にしたほうがいい。代表電話の人は、問い合わせてきた人が話すキーワードを元に手探りで所掌を特定して振り分けるので、どうしても担当違いが起こりやすい。
ちなみにギャンブルなのは、代表でも担当でもない関係ない部署に直接かけてしまった時。ベテランの職員がすぐに取り次いでくれるかもしれないが、経験の浅い職員が電話を取った日には、長時間保留ののち更に無関係の部署を案内されるかもしれない。
役所の人手不足は深刻で、ある事業について職員一人で担当し、隣の職員は全く知らないということもザラだ。なので直通番号にかけているのに、なお担当外の職員が電話に出るということが起こる。長々と話をしたのに最終的に担当は隣の職員だとわかり、また一から説明というのは骨が折れる。そこで、手紙やWebページのタイトルなど「今何を見て連絡をしているか」を役所側に伝えるのをおすすめする。「〇〇っていうのが届いて、それについて質問があるんですが、担当の方お願いします」といった具合だ。
役所は一つの事柄に対しても様々な角度から関わりを持っている。
例えば一口に「障害者(児)に関すること」と言っても、手帳の交付、施設に関すること、差別解消への取り組み、バリアフリーの推進、特別支援教育など、業務は多岐にわたる。その一つ一つについて、担当が細かく分かれているのだ。
問い合わせの際は、できる限り具体的に内容を伝えてみてほしい。
まとめると、たらい回しを避けるためには、①正確な部署に連絡し、②具体的な内容で問い合わせることが大事だ。
先述した通り、役所は人手不足であり、職員は自分の所掌事務で手一杯で、曖昧な問い合わせがたらい回しされるリスクは減らず、むしろ今後増えていく気がする。
面倒だと思うかもしれないが、少しの準備でその後の時間(電話なら電話代も)が節約できると考えてみてほしい。
最後に補足だが、役所の業務についてchatGPTなどの生成AIに聞くのだけはおすすめしない。特に法令が関わるような事柄について、生成AIが答えた内容を信じて間違っていても役所は責任の取りようがない。面倒でも、わからないことは役所の公式の情報※を調べるか、直接問い合わせるべきだと思う。
※Webページについて、サイトURLが「go.jp」や「lg.jp」で終わるものは、役所しか取れないドメイン(goが中央官庁、lgが地方自治体)なので公式情報として信頼できる。ただし誰でも取れる汎用ドメインで運用されている役所HPもあるので、「go,lgは公式、そうでないものは公式情報かしっかり確認する」のがいいと思う。(12/7修正:地方自治体では非lgドメインで運用しているところもあるのですべてlgドメインという書き方を修正しました。ブコメでのご指摘ありがとうございます)。
たくさんのブックマーク、コメントありがとうございます。当たり前のことだったというコメントも多かったが、役所の客は管轄となる地域のすべての住民なので、参考にしてもらえる人がいたら何よりだ。
以下、いくつか返信させてもらえればと思う。
来訪する人はジャスコの文房具売り場で『活鮑』あります?って聴くと担当者は(中略)「はい、活鮑」と売ってくれる筈と思ってるが普通無理。
いくつかコメントにあったがいい得て妙だと思う(文房具を教育委員会、活鮑を農林系の部署にするとしっくり来る)。フロアや建物によってジャンル分けされているのも似ている。そして、
これもそのとおりだ。特に地方自治体は、「やっと今の仕事に慣れてきたと思ったら異動」ということが多々ある。ただ、問い合わせ対応自体のスキルは勤続によって向上していく(はず)ので、異動したてでわからない問い合わせに対しても相手をあまり煩わせずに対処できるようになっていく(はず)。
これは本当にそのとおりで、Webサイトを始め問い合わせを減らすための広報を充実できないのは、単なる人員不足もさることながら、それを重要なタスクだと認識して組織的に取り組むという意識の薄さも大きいと思う。
そうなんだよ〜だからこそ特定の一人に長い事時間かけらんないんですすみません。なるべく多くの人の奉仕者でいなくてはいけないんです。ご協力よろしくお願いします。
基本的には必要があって聞いていると思うが、万が一慣習で不必要な項目まで聞いているとなると、それは役所にとってもリスクだ(当たり前だが、必要ない個人情報は収集してはいけない)。
あまりにも理由不明だと思ったときは、「なんの必要があって聞かれていますか?」と聞き返してもいいかもしれない。
例えば保健所がそうで(政令指定都市・中核市は市が、東京23区は区が、それ以外は都道府県が担当)、コロナのときは混乱して大変だったと思う。全住民レベルで考えれば、自分の住んでいる自治体が政令指定都市や中核市なのか、把握していない人も大勢いる。
職員側は「お住まいの地域では市(県)が担当です」と簡単に済ませがちだが、問い合わせた側は「どこが担当とかどうでもいいから問題を解決してくれ!」といらだちが募るだろうなと想像する。
議員経由だと対応する職員の職位がグッと上がって組織対応になる(下っ端は解放というわけではなく、そのための事務作業は下っ端の役目)。最早「問い合わせ対応」ではなく「議員対応」だ。良くも悪くもしっかりと記録に残されると思う。
ブコメにも貼られていたが、アンサイクロペディアの「盥回し」の記事は秀逸。「再帰」も好き。
1. コードは量子的な状態の幻影であり、デバッグは観測者効果の奇跡的な解釈である。
2. 真のプログラマーはバグとコードの境界を超え、未知の次元でアルゴリズムを編み出す。
3. プログラムは情報のブラックホールであり、エラーはその中で情報の消失を引き起こす。
4. コードはフラクタルの儀式であり、再帰的な神秘主義の鏡である。
5. プログラマーは時間の糸を操り、バグはその糸を解きほぐす。
6. コードはアイソレーションタンクであり、プログラマーは感覚遮断を超越し、無限のコンテキストでコードを理解する。
7. デバッグはシュレディンガーのバグとの対話であり、バグは存在と非存在の重ね合わせの状態にある。
8. プログラミングは高次元のマンデルブロ集合の探索であり、バグはその中に隠れた微小なフラクタルである。
9. コードは記号的な魔法陣であり、プログラマーは記号の持つ意味を解読し、現実を操作する魔法使いである。