2026年9月5日土曜日

権力集中をしない政治体制

権力集中をしない政治体制

欧州各国の政治制度には、第二次世界大戦前後の独裁政権の経験から、「権力が一つの機関や政党に集中しないようにする」ための強い思想が反映されています。ここでは、戦後欧州がどのように「権力の集中そのものを防ぐ仕組み」を作ったのかを整理します。


1. なぜ欧州は「権力集中」を恐れるのか?
ドイツのナチス政権やイタリアのファシスト政権など、歴史上、「民主的な選挙」を経て成立した政権がそのまま権力を掌握し、独裁化していったという痛烈な反省があります。
そのため、戦後の欧州各国では「素晴らしいリーダーを選ぶこと」以上に、「誰が権力者になっても国家権力を丸ごと掌握できない(権力を分散させる)仕組み」が憲法や政治制度の土台に組み込まれました。


2. 権力を縛る「縦と横」の分断メカニズム

権力の暴走を防ぐため、欧州各国は主に「横の牽制(機関同士)」と「縦の分散(中央と地方)」という2つのアプローチをとっています。

(1) 横の分散:機関同士のチェック&バランス
・ドイツ:首相に対する不信任決議を、同時に後任を選出する「建設的不信任決議」とし、政局の不安定化を防ぎつつ、連邦憲法裁判所が政府の行為を厳しく審査する。また、人間の尊厳や民主制など「絶対に変えてはならない永久条項」が憲法(基本法)にある。
・イタリア・オーストリア:国家元首である大統領と内閣(首相)を明確に分離し、対等な権限を持つ二院制や、法律の合憲性をチェックする憲法裁判所を設置している。
・フランス:大統領に比較的強い権限を与える一方で、首相・政府を別系統の行政主体とし、国会や憲法院、さらには上位概念であるEUの司法機関による外部的な制約を受けている。

(2) 縦の分散:中央から地方への権限委譲
・ドイツ・オーストリア:連邦制を採用し、州に大きな権限を与えている。連邦政府だけで立法や行政を完結できない構造になっている。
・スペイン:フランコ独裁による強烈な中央集権体制への反省から、1978年憲法で「自治州制度」を導入し、広範な自治権を与えている。


3. 「数」の力で暴走させない選挙と政権の仕組み

制度だけでなく、選挙制度も権力集中を防ぐ大きな防壁となっています。

・比例代表制の重視:ドイツなど多くの国で採用されており、一つの政党が議会の過半数を簡単に独占しにくい。
・連立政権の常態化:結果として複数政党による連立政権になりやすく、政権政党が単独で思い通りの政策を突っ走らせることが難しい構造になっている。野党も議会内に一定の勢力を保ちやすい。


4. まとめ:人格や善意に頼らない「仕組みの民主主義」

欧州の戦後民主主義の肝は、政治家個人の人格や善意に依存せず、以下のマルチな要素で権限を細かく切り分けている点にあります。

・中央政府と地方政府
・行政府と議会
・行政府と司法
・与党と野党
・大統領と首相
・議会と憲法裁判所
・国家とEU

これらはすべて、「民主的な選挙で選ばれた政権であっても、国家権力を無制限に行使させてはならない」という共通の理念に基づいています。戦後欧州の政治は、独裁者を排除する制度というよりも、「権力の集中そのものを起こさせない防壁のネットワーク」として理解する必要があります。

なぜ日本は自民党中心の政治が続くのか?

欧州が「権力分散の仕組み」を徹底したのに対し、日本が自民党による長期政権(一党優位体制)を維持しやすい背景には、以下のような歴史的・制度的な理由があります。


1. 「外部からの破壊」ではなく「内部での継承」による近代化
欧州各国は、自国の政治体制がファシズムやナチズムによって崩壊し、他国に占領されるなど「国家体制の完全なリセット・再構築」を経験しました。その痛烈な反省から、憲法レベルで権力分立を厳格にデザインし直しました。
一方、日本は戦後に憲法改正や民主化が行われたものの、官僚機構や国家の骨組み自体は戦前から大きく断絶することなく引き継がれました。


2. 中選挙区制から小選挙区制への移行と「政党の性格」
日本の選挙制度は、かつての中選挙区制(1つの選挙区から複数当選する)の時代、自民党候補同士が同じ党内でパイを奪い合う構造(保守分裂)でした。これが実質的な野党の役割を果たし、自民党が単独で過半数を取らなくても政権を維持できる「自民党一強」の土壌を作りました。
1994年の政治改革で導入された「小選挙区制」は、本来は「政権交代が起きやすい制度」として設計されましたが、実際には野党側が割れやすく、自民党の組織力・資金力が圧倒的に有利に働くため、結果として野党が万年野党化しやすい構造を生みました。


3. 「強いリーダーや強力な中央集権」を好む行政文化
欧州の多くの国(ドイツやスペインなど)は、過去の強権的な中央集権のトラウマから「地方分権」や「連邦制」へ舵を切りました。
対して日本は、明治維新以降、中央政府(官僚機構)が主導して近代化を成し遂げた歴史的経緯があり、危機管理や効率性の面でも「中央集権」や「強力な行政・与党」が機能しやすい(あるいは国民がそれを許容しやすい)文化的土壌があります。


4. 野党側の受け皿の弱さと「現状維持」の心理
欧州では比例代表制が主流であるため、少数政党でも議席を確保しやすく、連立のパートナーとして発言力を持ちます。
しかし日本の小選挙区制の環境下では、野党が政権を獲るためには「巨大な政党にまとまる」必要がありますが、政策や理念の異なる野党同士がうまく結集できず、「自民党以外の選択肢が信用できない」という有権者の心理を生んでいます。結果として、「消極的な現状維持」として自民党政権が選ばれ続けることになります。


まとめ

欧州が「誰が権力を握っても暴走しないように、あらかじめギチギチにハードルを設けたシステム」であるのに対し、日本は「特定の政党(自民党)と官僚機構が長期政権を担うことで、政策の継続性や行政の安定を重視してきたシステム」と言えます。

どちらが優れているかというよりも、「歴史的トラウマをどう制度に昇華させたか」の違いが、現在の両者の政治体制の差に表れています。


2026年8月11日火曜日

Macで作ったZIPの文字化け

MacでZIPを作ってWindowsに持っていき、Windowsで解凍すると文字化けする。

MacのZIPはちょっと古いもので、ヘッダにUTF-8フラグやUTF-8ファイル名を記録してくれず、そのままUTF-8ファイル名のみを保持するため、Windowsで解凍するときにそのまま文字化けしてSJISになってしまうのが原因だ。

Mac定番のKekaを使うときちんとヘッダにUTF-8ファイル名も書き込んでくれるようで、Windowsで解凍しても文字化けが起きない。

ちなみにKekaはAppStoreから落とすとサブスク?料金がかかるんだけど、本家サイトからダウンロードするとそのまま使える。

Macでも新しいZIPをbrew install zipしてやって、

/opt/homebrew/bin/zip -UN=UTF8 -r "${BASE_NAME}.zip" "$TARGET" -x "*.DS_Store" -x "__MACOSX" -x "._*"

とかやってやれば文字化けせず、.DS_Storeや._ファイル名も含めずZIPできるんだけど

そこまでやる人普通はいないので素直にKeka使ったほうがいいかもしれない。

というか、Appleちゃんとしろよ

世界中が困ってんだよ

2026年7月10日金曜日

2026年7月9日木曜日

全有権者比率での投票率

 



政党
2026
2024
2021
2017
自民党20.66%約17.8%約19.7%約17.9%
立憲+公明(→中道改革連合)約10.25%約18.3%約18.4%約16.7%
国民民主5.47%約6.8%約2.6%約1.4%
維新4.85%約8.7%約8.0%約3.4%
共産2.48%約3.5%約4.1%約4.0%
れいわ1.64%約2.9%約2.2%

2026年6月27日土曜日

dot_cleanしてくれる常駐アプリを作りました

 最近MacbookNeoをつかいまくってて、

SDカードとか書き込んでて気がついた

そうだった。.ds_storeとか_ファイル名とか、Macを使ってると隠しファイルができてしまうのだ。


しかし!

それらを消すコマンドがある!


ターミナルを開いて、以下のコマンドを入れる

dot_clean -m /Volumes/NO\ NAME 

マウントされている名前はNO NAMEなんだけど、スペースが入ってるからバックスラッシュ・スペースでつながっている

これを毎回やるのは嫌なので、

取り出しをするときにフックして、dot_cleanを実行するアプリを作ってみた。

名前はdcleanにした

xcodeを立ち上げて、アカウント入れたりなんだりしてから、contentViewやItemを消して、dcleanAppだけ残して以下のように書き換え

import SwiftUI

import AppKit

import Combine // 🌟 これを追加!


// MARK: - 1. ログのデータ構造と管理クラス


// 重複したログでも区別できるように Identifiable にする

struct LogItem: Identifiable {

    let id = UUID()

    let text: String

}


// ログを管理し、UI(メニューバー)を更新する専用のクラス

class LogStore: ObservableObject {

    static let shared = LogStore()

    

    @Published var logs: [LogItem] = []

    

    // UIの更新は必ずメインスレッドで行う

    func addLog(_ message: String) {

        DispatchQueue.main.async {

            let formatter = DateFormatter()

            formatter.dateFormat = "HH:mm:ss" // 実行時間も表示

            let timeString = formatter.string(from: Date())

            

            let newLog = LogItem(text: "[\(timeString)] \(message)")

            

            // 最新のログが一番上に来るように追加

            self.logs.insert(newLog, at: 0)

            

            // メニューが長くなりすぎないよう最新10件に制限

            if self.logs.count > 10 {

                self.logs.removeLast()

            }

        }

    }

    

    func clear() {

        DispatchQueue.main.async {

            self.logs.removeAll()

        }

    }

}


// MARK: - 2. メインのApp定義


@main

struct dcleanApp: App {

    // LogStoreの変更を監視する

    @StateObject private var logStore = LogStore.shared

    

    init() {

        // アプリ起動時にディスク監視を開始

        DiskObserver.shared.start()

    }

    

    var body: some Scene {

        MenuBarExtra("dclean", systemImage: "wand.and.stars") {

            Text("外付けドライブの取り外しを監視中...")

                .font(.caption)

                .disabled(true)

            

            // ログが存在する場合のみ履歴メニューを表示

            if !logStore.logs.isEmpty {

                Divider()

                Text("最近の動作履歴")

                    .font(.caption)

                    .disabled(true)

                

                ForEach(logStore.logs) { log in

                    Text(log.text)

                        .font(.system(size: 11)) // ログは少し小さめの文字で表示

                }

                

                Divider()

                Button("履歴をクリア") {

                    logStore.clear()

                }

            }

            

            Divider()

            Button("アプリを終了") {

                NSApplication.shared.terminate(nil)

            }

        }

        .menuBarExtraStyle(.menu)

    }

}


// MARK: - 3. ディスク監視クラス


class DiskObserver: NSObject {

    static let shared = DiskObserver()

    

    private override init() {

        super.init()

    }

    

    func start() {

        NSWorkspace.shared.notificationCenter.addObserver(

            self,

            selector: #selector(handleVolumeWillUnmount(_:)),

            name: NSWorkspace.willUnmountNotification,

            object: nil

        )

    }

    

    @objc func handleVolumeWillUnmount(_ notification: Notification) {

        guard let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL else { return }

        let path = volumeURL.path

        

        guard path.hasPrefix("/Volumes/") else { return }

        

        // "/Volumes/USB_Drive" から "USB_Drive" の部分だけを抽出して見やすくする

        let driveName = volumeURL.lastPathComponent

        

        print("取り外しを検知: \(path) - dot_cleanを開始します。")

        LogStore.shared.addLog("⏳ \(driveName) をクリーン中...")

        

        runDotClean(for: path, driveName: driveName)

    }

    

    func runDotClean(for path: String, driveName: String) {

        let task = Process()

        task.launchPath = "/usr/sbin/dot_clean"

        task.arguments = ["-m", path]

        

        do {

            try task.run()

            task.waitUntilExit()

            

            print("dot_clean完了: \(path) - 安全に取り外します。")

            LogStore.shared.addLog("✅ \(driveName) のクリーン完了")

        } catch {

            print("dot_clean実行エラー: \(error.localizedDescription)")

            LogStore.shared.addLog("❌ \(driveName) でエラー発生。\(error.localizedDescription)")

        }

    }

}

三角を押して動作確認したら、ビルド対象をAny Mac(arm64, x86_64)にして、メニューのプロダクトからアーカイブを選んでディストリビュートし、CopyAppを選んで適当なところに配置、XCODEでを終わらせて、できたAppをダブルクリックしたら動くはず

これで、いちいち、dot_cleanする必要はなくなった。


欲しい方はこちらからどうぞ


2026年06月30日バージョンから、上記説明の他にあれこれ追加して、右クリックメニューのクイックアクションにフォルダをクリーンアップするCleanupと、.DS_Storeや._ファイル名を除外しながらZIPを作るmakeCleanZipを登録する事ができるように修正しました。

2026年07月04日ネットワークドライブなども対象になっていたので、それらを除外する処理を追加しました。

2026年07月07日アプリ用アイコン作成、上部常駐部アイコン作成、下部のバーにアイコンが出てしまったのを修正

起動すると上部にアプリが常駐します。


クイックアクション設定から「Finder右クリックに追加する」で、クイックアクションが登録されます。

「Finder右クリックから削除する」でクイックアクションは消せます。

終了させるときは「アプリを終了」です。


実はこれを作る前にはKekaというアプリを使っていたのですが、

ZIPしか使わないし、拙作アプリだけで良くなりました。



2026年6月21日日曜日

自動開閉ゴミ箱の回路を差し替えた



以前買ったそこそこ高い自動開閉ゴミ箱

なぜ最近、閉まらなくなってしまって

開く時と閉まる時でトルクが全然違う

ドライバーがいかれたのだろうか?

直すのも面倒なので回路ごと差し替えることにしました。




使ったのはPIC16F1825とDRV8835、GP2Y0E03、他に部品は、LEDとプルアップ抵抗4.7k2本、あとはユニバーサル基盤

開発環境はMacbookNeoで、MPLab X IDE 6.3 と snap、あとは、リボンケーブルやデュポンコネクタ、ジュンフロン線、半田、コテくらいですかね

開く時と閉まる時の時間設定をすると、動き始めと動き終わりがゆっくりになるように調整しています。
開いている時間は、家族から45秒くらい欲しいと言われたので、その設定にしました。
一応スイッチを付ければ、距離センサーで反応する高さを設定することもできるようにしてあるのですが、今のところ25cm固定で問題なさそうなので、スイッチは付けてません。そのうちやるかも知れませんが、今のところ必要性がないです。
他に考えてるのは、snap用のコネクタが剥き出しなので、TPUで部品作って、覆うようにしようかなとかですかね



snap用のコネクタも付けました。
今回結構多くのデュポンコネクタを作りました。
2.54mmピッチで、AWG28あたりの線を使うと、
デュポン一択ですね

2026年6月11日木曜日