最近のトラックバック

ウェブページ

2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

他のアカウント

無料ブログはココログ

« 2016年7月 | トップページ | 2016年10月 »

2016年8月

2016年8月13日 (土)

ある「プロ」の書いた、初心者向けc言語入門プログラム

昔、ある所で、「俺はc言語が得意」と言っているプロ(既に、プログラマーではなく、プロジェクト管理とかやっている人らしい)が、プログラム初めての初心者向けに書いたサンプルソースを見て、目が点になったことがある。
初心者向けとは見えないし、このプロ氏は仕事でどんなプログラムを作っているのか怖くなった。

sample.h
------------

/** 2重インクルード防止を付けて欲しい **/

// ローマ字カナ変換処理
int Romaji2Kana(
char *Src,
char *Buff
);
// 半角文字列大文字変換処理
void Str2Upper(
char *Buff
);
// 改行コード削除処理
void RemoveCRLF(
char *Buff
);

sample.cpp
---------------

/************************************************************************************
* 「C言語が得意」というプロ氏の書いた「プログラム未経験の初心者用ソース。           *
* 若干の書き換えはあるが、ほとんどそのまま。                                        *
* 「//」形式のコメントは、プロ氏の書いたコメント。「/*」形式のコメントはブログ      *
* 主のコメント。                                                                 *
*                                                                                   *
* ファイル名は書き換えてあるが拡張子がcppとなっているのはそのまま。                 *
* マイクロソフト Visual Studio の Visual C++ では、                                 *
* ソースファイル名の拡張子を省略した場合、C++の拡張子である「.cpp」が               *
* 付けられてしまう。                                                                *
* つまり、C言語プログラムのつもりでもC++としてコンパイルされる。                    *
* 「C++はCの上位互換」という迷信があるが、CとC++ は非互換なので                     *
* Visual C++ で純粋なC言語ソースを書きたい場合はソースファイル名には                *   
* 拡張子「.c」を明示するべき。                                                      *
* 私「gccの場合だと・・・」と言い出したら、プロ氏は「gccの話なら別の機会にしてくれ」*
* とキレた。もしかして、Windows PC上でgcc環境の構築ができないのか?                 *
*************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <memory.h>

// オリジナルヘッダ定義
#include "sample.h"

/* C++としてコンパイルされるわけだし、constがあった方がいいと思う */
//  ローマ字変換テーブル(グローバル変数)
char        *RMojiTbl[ 175 ][ 2 ] = {
    //  あ行
    {"A", "ア" },    {"I", "イ" },    {"U", "ウ" },    {"E", "エ" },    {"O", "オ" },
    //  か行
    {"KA", "カ" },   {"KI", "キ" },   {"KU", "ク" },   {"KE", "ケ" },   {"KO", "コ" },
    {"KYA", "キヤ" }, {"KYI", "キイ" }, {"KYU", "キユ" }, {"KYE", "キエ" }, {"KYO", "キヨ" },
    //  さ行
    {"SA", "サ" },   {"SHI", "シ" },  {"SU", "ス" },   {"SE", "セ" },   {"SO", "ソ" },
    {"ZI", "ジ" },  {"SI", "シ" },   {"JYO", "ジヨ" },    {"KEN", "ケン" }, {"OH", "オウ" },
    {"SHA", "シヤ" }, {"SYI", "シイ" }, {"SHU", "シユ" }, {"SHE", "シエ" }, {"SHO", "シヨ" },
    //  た行
    {"TA", "タ" },   {"CHI", "チ" },  {"TSU", "ツ" },  {"TE", "テ" },   {"TO", "ト" },
    {"CHA", "チヤ" }, {"CYI", "チイ" }, {"CHU", "チユ" }, {"CHE", "チエ" }, {"CHO", "チヨ" },
    {"TOH", "トウ" }, {"TI", "チ" },   {"TU", "ツ" },   {"TTO", "ツト" }, {"TYO", "チヨ" },
    {"THA", "チヤ" }, {"THI", "チイ" }, {"THU", "チユ" }, {"THE", "チエ" }, {"THO", "チヨ" },
    //  な行
    {"NA", "ナ" },   {"NI", "ニ" },   {"NU", "ヌ" },   {"NE", "ネ" },   {"NO", "ノ" },
    {"NYA", "ニヤ" }, {"NYI", "ニイ" }, {"NYU", "ニユ" }, {"NYE", "ニエ" }, {"NYO", "ニヨ" },
    //  は行
    {"HA", "ハ" },   {"HI", "ヒ" },   {"FU", "フ" },   {"HE", "ヘ" },   {"HO", "ホ" },
    {"HYA", "ヒヤ" }, {"HYI", "ヒイ" }, {"HYU", "ヒユ" }, {"HYE", "ヒエ" }, {"HYO", "ヒヨ" },
    {"FA", "フア" },  {"FI", "フイ" },  {"FE", "フエ" },  {"FO", "フオ" },  {"SYU", "シュ" },
    {"FYA", "フア" }, {"FYU", "フユ" }, {"FYO", "フヨ" }, {"HU", "フ" },   {"DUMMY", "DUMMY" },
    //  ま行
    {"MA", "マ" },   {"MI", "ミ" },   {"MU", "ム" },   {"ME", "メ" },   {"MO", "モ" },
    {"MYA", "ミヤ" }, {"MYI", "ミイ" }, {"MYU", "ミユ" }, {"MYE", "ミエ" }, {"MYO", "ミヨ" },
    //  や行
    {"YA", "ヤ" },   {"YU", "ユ" },   {"YO", "ヨ" },   {"DUMMY", "DUMMY" },    {"DUMMY", "DUMMY" },
    //  ら行
    {"RA", "ラ" },   {"RI", "リ" },   {"RU", "ル" },   {"RE", "レ" },   {"RO", "ロ" },
    {"RYA", "リヤ" }, {"RYI", "リイ" }, {"RYU", "リユ" }, {"RYE", "リエ" }, {"RYO", "リヨ" },
    //  わ行
    {"WA", "ワ" },   {"WI", "ウイ" },  {"WE", "ウエ" },  {"WO", "ヲ" },   {"DUMMY", "DUMMY" },
    //  ん行
    {"NN", "ン" },   {"DUMMY", "DUMMY" },    {"DUMMY", "DUMMY" },    {"DUMMY", "DUMMY" },    {"DUMMY", "DUMMY" },
    //  が行
    {"GA", "ガ" },  {"GI", "ギ" },  {"GU", "グ" },  {"GE", "ゲ" },  {"GO", "ゴ" },
    {"GYA", "ギヤ" },    {"GYI", "ギイ" },    {"GYU", "ギユ" },    {"GYE", "ギエ" },    {"GYO", "ギヨ" },
    //  ざ行
    {"ZA", "ザ" },  {"JI", "ジ" },  {"ZU", "ズ" },  {"ZE", "ゼ" },  {"ZO", "ゾ" },
    {"JA", "ジヤ" }, {"JYI", "ジイ" },    {"JU", "ジユ" }, {"JE", "ジエ" }, {"JO", "ジヨ" },
    //  だ行
    {"DA", "ダ" },  {"DI", "ヂ" },  {"DU", "ヅ" },  {"DE", "デ" },  {"DO", "ド" },
    {"DYA", "ヂヤ" },    {"DYI", "ヂイ" },    {"DYU", "ヂユ" },    {"DYE", "ヂエ" },    {"DYO", "ヂヨ" },
    {"DHA", "デヤ" },    {"DHI", "デイ" },    {"DHU", "デユ" },    {"DHE", "デエ" },    {"DHO", "デヨ" },
    //  ば行
    {"BA", "バ" },  {"BI", "ビ" },  {"BU", "ブ" },  {"BE", "ベ" },  {"BO", "ボ" },
    {"BYA", "ビヤ" },    {"BYI", "ビイ" },    {"BYU", "ビユ" },    {"BYE", "ビエ" },    {"BYO", "ビヨ" },
    //  ぱ行
    {"PA", "パ" },  {"PI", "ピ" },  {"PU", "プ" },  {"PE", "ペ" },  {"PO", "ポ" },
    {"PYA", "ピヤ" },    {"PYI", "ピイ" },    {"PYU", "ピユ" },    {"PYE", "ピエ" },    {"PYO", "ピヨ" },
    //  ヴ行
    {"VA", "ヴア" }, {"VI", "ヴイ" }, {"VU", "ビユ" }, {"VE", "ヴエ" }, {"VO", "ヴオ" }

};
/* 私だったら、最後に番兵を置いて、項目の数は計算機に計算させたいところだが、
気にしないことにする。
でも、半角カタカナは文字化け問題とかあるので使わないで欲しかった */


/***********************************************************************
* 配列の添字などの型には何故か unsigned long をプロ氏は使う            *
* プロ氏の環境ではそれがいいのかもしれないが、size_t とか              *
* 使った方が可搬性と可読性が増すと思う。                               *
* プロ氏は仕事でもこのようなプログラムを書いているのだろうか?         *
* というか、まったくの初心者向きなのだから、int を使う方がいいと思う   *
************************************************************************/
// ローマ字テーブルのデータ数(グローバル変数)
unsigned long RMojiTblMax = 35 * 5;

// ローマ字変換処理(今回は引数は使用しません)
int main(int argc, char* argv[])
{
/* 80 というマジックナンバーはマクロにした方がいいと思う */
char Buff[ 80 ]; // ローマ字変換結果格納メモリ
char work[ 80 ]; // ローマ字格納メモリ

/****************************************************************************
* プロ氏は「繰り返し」はすべて while(1){ ・・・ } 無限ループを使い、  *
* break; 等で脱出する。確かにこれひとつ覚えておけば繰り返しは全部     *
* 書けるが、for文とかwhile(条件)・・・ とかを覚えさせる方がいいと     *
* 思う。                                                              *
* というか、プロ氏は仕事でもこのスタイルで書いているのか?            *
* 「プロの世界ではコーディングルールというものがあって」云々言って    *
* いたが、どんなコーディングルールを使ってるのだろう?                *
*****************************************************************************/
// ローマ字入力をカナに変換する
// exitで終了
while( 1 )
{
memset( work, 0x00, sizeof( work ) );
memset( Buff, 0x00, sizeof( Buff ) );
// 文字列を取得する
printf( "ローマ字入力 : " );
fgets( work, sizeof( work ), stdin );
// 改行コードの除去
RemoveCRLF( work );
// 半角文字を全て大文字に変換する
Str2Upper( work );
// exitを入力すると処理終了
/***************************************************************
* strncmpのサイズを表す引数が4だと、EXITで始まる         *
* 長い文字列が入力されても終了する。5の方がいいかも      *
* しれない。片方がリテラルの場合はstrcmpを使う手もある。 *
***************************************************************/
if( !strncmp( work, "EXIT", 4 ) ){
break;
}
// ローマ字変換を行う
Romaji2Kana( work, Buff );
// 変換結果を表示する
printf( "ローマ字 : %s\nカナ変換後 : %s\n", work, Buff );

}
return 0;
}
// 改行コードの除去
void RemoveCRLF(
char *Buff
){
/***********************************************************************
* プロ氏は、文字列終端の'\0'もNULLマクロを使用している。         *
* 彼は「NULL はヌルポインタとヌル文字の2つの意味で使うのが      *
* デファクトスタンダードだ」と述べたが、本来NULLは null pointer  *
* constant を表すマクロである。                                  *
* このプログラムはC++としてコンパイルされるため NULL は 0 に     *
* 展開されるが、VisualStudio VC++では、純粋なc言語のソース      *
* を書きたい場合はソースファイル名に拡張子「.c」を明記するべき。 *
* 「.c」を付けてコンパイルすると NULL は ((void *)0) に展開      *
* されるので警告が出る。CとC++の非互換性のひとつである。         *
************************************************************************/

char *p = NULL;
/************************************************************************
* プロ氏は「(初心者にはわかりにくいだろうが)strchr関数は        *
* バッファサイズを指定する引数がないので使うべきではないのだ」    *
* と memchr 関数を使っているが、肝心のバッファサイズを取得する    *
* のに strlen 関数を使っている。これではバッファオーバーランの    *
* 虚弱性を解消したことにはならない。それを指摘したらプロ氏は      *
* 「fgets関数で取得した文字列は必ず終端がヌル文字になること       *
* が保証されている」と・・・それを仮定するならstrchrでかまわない。*
* 読みづらくなったのに虚弱性は解消されていない。また、虚弱性を    *
* 解消したつもりになっているのがかえって危険である。              *
*************************************************************************/
// 文字列からキャリッジリターンがないか?
p = (char *)memchr( Buff, '\r', strlen( Buff ) );
if( p != NULL ){
// あればNULLをセットする
*p = NULL; /* '\0' であるべき */
}
// 文字列から改行コードがないか?
p = (char *)memchr( Buff, '\n', strlen( Buff ) );
if( p != NULL ){
// あればNULLをセットする
*p = NULL; /* '\0' であるべき */
}

}
// ローマ字からカナに変換
int Romaji2Kana(
char *Src, // 変換する文字列
char *Buff // 変換結果を格納するメモリ
){
char work[ 3 + 1 ];
unsigned long Count = 0;
unsigned long Count2 = 0;

// 変換する文字列がない場合
if( strlen( Src ) <= 0 ){
// 何も処理しませんよ
return( -1 );
}
memset( work, 0, sizeof( work ) );
// 3文字分処理する
while( 1 )
{
// 3文字処理しても変換できない場合は処理終了
if( Count >= 3 ){
break;
}
work[ Count ] = Src[ Count ];
Count2 = 0;
// ローマ字テーブル分と一致するか検査するまで繰り返す
while( 1 ){
if( Count2 >= RMojiTblMax ){
break;
}
/**************************************************************
* だから、strlenでサイズを取得するならstrncmpのように   *
* サイズを引数とする関数を使ってもバッファオーバーラン  *
* の虚弱性は解消されないって。                          *
***************************************************************/
// 変換文字が一致したかな?
if( !strncmp(
work,
RMojiTbl[ Count2 ][ 0 ],
strlen( RMojiTbl[ Count2 ][ 0 ] )
)
){
// カナ変換文字をコピーする
memcpy( Buff,
RMojiTbl[ Count2 ][ 1 ],
strlen( RMojiTbl[ Count2 ][ 1 ] ) );
// 変換した文字列分を飛ばして残りの文字列を処理する
// 自分自身を呼び出す事をリカーシブルコール(再帰呼出)
// といいます。
Romaji2Kana( Src + Count + 1, Buff + strlen( Buff ) );
// 関数を終了させる
return( 0 );
}
Count2++;
}
Count++;
}
/** ここでリカーシブコールを使うか! **/
// 文字を1つ進めて残りの文字列を処理する
// 自分自身を呼び出す事をリカーシブルコール(再帰呼出)
// といいます。
Romaji2Kana( Src + 1, Buff );
return( 0 );

}
// 半角文字列を全て大文字に変換
void Str2Upper(
char *Buff
){
unsigned long Count = 0;
/**************************************************************************
* for文の方がすっきり書けると思う。unsigned longがやはり違和感。    *
*   繰り返しの中でstrlenを使ってるのもちょっと気になる。   *
***************************************************************************/
// 全ての文字列を処理する
while( 1 ){
// 文字列全て処理をすれば処理終了する
if( Count >= strlen( Buff ) ){
break;
}
/***************************************************************************
* シンタックスシュガーを使って Buff[Count] と書いた方が分かりやすい。*
***************************************************************************/
// 半角文字列を小文字から大文字に変換する
*( Buff + Count ) = toupper( *( Buff + Count ) );
Count++;
}
}

--------

実行例。gccでコンパイルするとやたらに警告(const char* を char*に変換、null pointer constant の意味以外で NULL を使った(この警告はgccで出たが、必ず警告してくれる保証はないらしい))が出た後、長すぎる入力でバグったようだ。fgets使ってるのに。デバグはしてない。する気がおきない。

----

ローマ字入力 : DUMMY
ローマ字 : DUMMY
カナ変換後 : ヅ
ローマ字入力 : asahi
ローマ字 : ASAHI
カナ変換後 : アサヒ
ローマ字入力 : assamu
ローマ字 : ASSAMU
カナ変換後 : アサム
ローマ字入力 : kyoukai
ローマ字 : KYOUKAI
カナ変換後 : キヨウカイ
ローマ字入力 : aaa
ローマ字 : AAA
カナ変換後 : アアア
ローマ字入力 : mmmyou
ローマ字 : MMMYOU
カナ変換後 : ミヨウ
ローマ字入力 : dummystring
ローマ字 : DUMMYSTRING
カナ変換後 : ヅリ
ローマ字入力 : hello world
ローマ字 : HELLO WORLD
カナ変換後 : ヘオヲ
ローマ字入力 : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ローマ字 : �AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAア�z �アアア�\�ア�WϿ�WϿ��x�ア�WϿtWϿ$���ア�アアアア����V�アアアアア��アアx���\�ア�ア��アア��ア�WϿ �����x��WϿアア�cϿアアϿ�cϿ�cϿ�cϿ�cϿdϿ5dϿjdϿudϿ�dϿ�dϿ�dϿ�dϿeϿ;eϿjeϿteϿ�jϿ�jϿkϿ3kϿfkϿ�klϿlϿ@lϿRlϿplϿ�lϿ�lϿ�lϿ�lϿ�lϿmϿmϿ1mϿCmϿ]mϿemϿtmϿ�mϿ�mϿ�mϿ�mϿ�mϿ�mϿnϿ^nϿ�nϿ�nϿ�nϿ�nϿア�oϿ*oϿDoϿXoϿzoϿ�oϿ�oϿ�oϿ�oϿアアア�w�!アア�ア����アアアアアア4�ア アアアアアアアアア�
       ア�ア
カナ変換後 : アアアアアアアアアアアアアアアアアアアアアアアアアアアAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAア�z �アアア�\�ア�WϿ�WϿ��x�ア�WϿtWϿ$���ア�アアアア����V�アアアアア��アアx���\�ア�ア��アア��ア�WϿ �����x��WϿアア�cϿアアϿ�cϿ�cϿ�cϿ�cϿdϿ5dϿjdϿudϿ�dϿ�dϿ�dϿ�dϿeϿ;eϿjeϿteϿ�jϿ�jϿkϿ3kϿfkϿ�klϿlϿ@lϿRlϿplϿ�lϿ�lϿ�lϿ�lϿ�lϿmϿmϿ1mϿCmϿ]mϿemϿtmϿ�mϿ�mϿ�mϿ�mϿ�mϿ�mϿnϿ^nϿ�nϿ�nϿ�nϿ�nϿア�oϿ*oϿDoϿXoϿzoϿ�oϿ�oϿ�oϿ�oϿアアア�w�!アア�ア����アアアアアア4�ア アア アアアアアアア�
                                        ア�ア
ローマ字入力 : ローマ字 : �AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAア�z �アアア�\�ア�WϿ�WϿ��x�ア�WϿtWϿ$���ア�アアアア����V�アアアアア��アアx���\�ア�ア��アア��ア�WϿ �����x��WϿアア�cϿアアϿ�cϿ�cϿ�cϿ�cϿdϿ5dϿjdϿudϿ�dϿ�dϿ�dϿ�dϿeϿ;eϿjeϿteϿ�jϿ�jϿkϿ3kϿfkϿ�klϿlϿ@lϿRlϿplϿ�lϿ�lϿ�lϿ�lϿ�lϿmϿmϿ1mϿCmϿ]mϿemϿtmϿ�mϿ�mϿ�mϿ�mϿ�mϿ�mϿnϿ^nϿ�nϿ�nϿ�nϿ�nϿア�oϿ*oϿDoϿXoϿzoϿ�oϿ�oϿ�oϿ�oϿアアア�w�!アア�ア����アアアアアア4�ア アア アアアアアアア�
                        ア�アア�アア�アア�アアアアアYϿア�oϿア�YϿアアアア%�z�<��g3a7�i686アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア
カナ変換後 : アアアアアアアアアアアアアアアアアアアアアアアアアアアAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAア�z �アアア�\�ア�WϿ�WϿ��x�ア�WϿtWϿ$���ア�アアアア����V�アアアアア��アアx���\�ア�ア��アア��ア�WϿ �����x��WϿアア�cϿアアϿ�cϿ�cϿ�cϿ�cϿdϿ5dϿjdϿudϿ�dϿ�dϿ�dϿ�dϿeϿ;eϿjeϿteϿ�jϿ�jϿkϿ3kϿfkϿ�klϿlϿ@lϿRlϿplϿ�lϿ�lϿ�lϿ�lϿ�lϿmϿmϿ1mϿCmϿ]mϿemϿtmϿ�mϿ�mϿ�mϿ�mϿ�mϿ�mϿnϿ^nϿ�nϿ�nϿ�nϿ�nϿア�oϿ*oϿDoϿXoϿzoϿ�oϿ�oϿ�oϿ�oϿアアア�w�!アア�ア����アアアアアア4�ア アア アアアアアアア�
                                        ア�アア�アア�アア�アアアアアYϿア�oϿア�YϿアアアア%�z�<��g3a7�i686アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア
ローマ字入力 : ローマ字 : AAAAAAAAAAAAAA
カナ変換後 : アアアアアアアアアアアアアア
ローマ字入力 : exitttttttt
Segmentation fault (コアダンプ)

2016年8月 4日 (木)

ジーン・シャープ「独裁体制から民主主義へ」を読んでみた(4)

|

ジーン・シャープ「独裁体制から民主主義へ」

第3章 からはじめたので、第1章からあらためて読みます。

第1章の中心的なテーマは、「独裁体制に暴力で対抗することは正しいか?」これは道徳とか合法性の問題でなく、現実の効果などの話である。そして、それは危険であり、逆効果の可能性が非常に高いことを述べている。また、選挙外国からの援助に頼るのもよくない。

考察:

日本人の多くの人々が非暴力という言葉を「暴力はいけません」等の道徳的意味とか「法律違反はいけない」というような情緒的な意味合いでしか受け取っていないことに非常に危機感を覚える。非暴力不服従非協力、というのは抵抗運動の現実的な効果や仕組みがあるのだ。そして、それは非常に強力な精神力が必要である。生半可なものではない。

第1章 独裁体制に直面することの現実

近年、様々な独裁体制が民衆の運動によって弱められたり、時には崩壊している。
独裁体制はあまりにも巨大で難攻不落に見えるが、民衆が一致団結して政治的・経済的・社会的な抵抗を行った場合、体制を支えきれなくなることがある。

  • もちろん、独裁体制が倒れたからといって、悲惨な沢山の問題が解決するわけではない。しかし、独裁体制による苦しみからの軽減はある。

困難は続く

他方、いまだに独裁体制に苦しんでいるところが多数ある。何十年、何百年の抵抗でもまだ抑圧に耐えている国は多い。

  • 民衆は権威者・統治者に無条件に服従するよう長年調教されてしまっている。
  • 極端な場合は、統治者の管轄外のグループや機関は完全に骨抜きにされ、支配され、乗っ取られる。
  • 国民は分断化、原子化(孤立した個人にされてしまう)され、自由を勝ち取る活動や、国民同士の互いの信頼もできなくなり、自分たちの主導で何かを成し遂げることもできなくなる。
  • 国民は弱体化し、自信を失い、抵抗を考えることすらできなくなる。家族や友人との間でさえ自由への渇望や独裁体制への嫌悪をわかちあうこともできなくなる
  • 過去にはまだ、抵抗する人々もいたであろうが、結果はかえってより苦しみをもたらすことが多く、現在はより悲惨な状態かもしれない。民衆の恐怖感と従順癖を克服できなかったからだ。

民衆の順癖と恐怖感を克服することが、独裁体制を打倒するための前提条件であるにも関わらず。

暴力を通して自由は得られるか?

どうしたらいい?

いくら正当性を訴えても、憲法、法律上の違法性、司法の判決、世論などはたいてい独裁者に単純に無視される。

そうなると、独裁政権の残虐行為に怒る人々は暴力的な方法を使うしかない、と人々が結論するのは自然なことである。しかし、実際の結果は期待と正反対のことになる。

どんな形であれ、暴力的な反撃は独裁体制にとってもっとも有利な闘いを選んでしまった、ことになる。

考察:

要するに、暴力を使った抵抗は独裁体制の土俵に自ら登ってしまうことだ、とも言えるだろう。何度も強調しなければいけないのは、これは道徳や合法性の問題ではない、ということだ。(勿論、違法な手段を使うと独裁体制に弾圧の口実を与えるのでよくないとは言えるが)。

  1. 暴力について言えば、独裁者の方が圧倒的かつ桁違いに大きな戦力を持っている。まず勝ち目はない
  2. 軍事的反抗が非現実的だと分かると、ゲリラ活動に活路を見出そうとする場合も多い。しかし、やはり戦力の差などが大きすぎ、長期化し犠牲者も増え、新たな苦痛が生まれるだけで、どういう意味でも良い方法ではない。
  3. 仮にゲリラ活動で勝利を収めたとしても、民主化に必要な独立した機関その他を弱体化解体化し中央集権的にして、反対制行動のリーダーがより残忍な独裁者になることも多い。

考察:

当然のことながら、暴力革命など暴力を使った反抗が失敗すれば、独裁体制はそれを名目として更なる残酷な弾圧や抑圧を強めることになる。その意味でも、暴力的な方法は逆効果になる。

従って、別の方法を考えなければならない。

クーデター、選挙、あるいは国外からの救世主

  • Q. 軍事的クーデターで対抗するのはどうか? これなら短期間で効果的ではないか?ーーA.深刻な欠点がある。最大の欠点は、独裁体制の権力構造を温存してしまうこと。つまり、独裁体制の統治構造は同じなままなので、たとえ勝ったとしてもクーデターのリーダーがより残酷な独裁者に変わってしまうことが多い。人が変わるだけ。
  • Q. 選挙で独裁者を追い出せないか? −−A. 不可能だ。選挙そのものが独裁体制の思惑通りの結果になるように不正操作されるだけのこと。万が一選挙で反対制側が勝っても、独裁者に単に無視されたり、抹殺されるだけ。独裁者は自分の立場を危うくする選挙などに興味はない。利用できるときに利用するだけ。

独裁体制から何とか逃げ出した亡命者たちは、自分たちの力で独裁体制を何とかできるなどとはまったく信じることができない。そこで、国際的な援助のみが独裁体制を崩す方法だと信じるようになる。

期待する外部の力: 国際的世論、国連、特定の国家、海外からの経済的・政治的制裁など。

慰めにはなっても、現実は非情である。

独裁体制下での民衆は、残酷な独裁者に対抗する力が自分たちにあると信じることがほとんどできない。また自らを救う手筈の持ち合わせもない。当然、闘う気力も持てない。だから、解放の力を外部に求めるのも無理はない。しかし・・・

外部からの「救世主」に頼ることの危険

外部の救世主に頼ることは完全な間違いかもしれない。大抵の場合、海外からの救世主は現れない。もし他国からの介入があったとしても信頼すべきではない

他国の介入を信頼した場合の危険性:

  • 他国はその他国の利益のために、独裁政権を黙認したり、更には積極的に支持する場合がある。
  • 他国はその他国の利益など他の目的のために、「自由化してあげる」という約束を反故にして、民衆を売り渡すかもしれない。
  • 他国は、単にその国の支配利益などのためだけに独裁体制に歯向かうことがある。民衆のためではない。
  • ただし、他国は、国内の抵抗運動が独裁体制を揺るがしたり、その兆しが見えた場合には、前向きな介入をすることもある。政権の残忍な性格に海外が注目を集めるのを意識して、はじめて介入するもの。

独裁体制が存続する理由は、国内での権力配分にある: 民衆は弱い立場で、富と権力は僅かな勢力の手の内にある。海外からの介入で一時的に揺らぐこともあり得るが、国内の構造が原因である限り内因を変えない限り存続するもの。

国際的な圧力が常に役に立たないわけではない。

国内での抵抗運動がある場合には、国際的な圧力は非情に効果があることが多い。

国際的な経済ボイコット、通商停止、国際的組織からの追放、国連関連組織による非難などなどは大きな力になる。ただし、国内に強力な抵抗運動がないとそういう動きが起こることは考えにくい

厳しい現実を直視する

現実は甘くない。独裁体制から逃れたいのならば、最低限次の任務に取り組む必要がある。

  1. 抑圧された民衆自身の意思や自信、抵抗技能を強化する。
  2. 抑圧された民衆が関わる独立した社会グループや機関を強化する。
  3. 国内での強力な抵抗勢力を築く。
  4. 解放のための全体戦略計画を練り、それをうまく実行する。

 

 強力で自助的な勢力が賢明な戦略を手に、修練された勇敢な行動を起こし、純粋な力をもって向きあえば、独裁体制は崩壊する。ただし、最低限上記の4項目は必須である。

 

独裁体制からの自由化は、究極的には人びとが自らを解放できる能力にかかっている。

 

ただし、その詳細に入る前に、「独裁体制との交渉」という手段の効果について吟味しなければならない。これは重要である。

|

« 2016年7月 | トップページ | 2016年10月 »