yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/01 の記事
[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]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
文民統制違反も関係ねえ
2009/11/23(Mon)02:01:12
 平然と強行採決を行うなど、最近は民主党にも与党の傲慢さが見えてきましたが、せっかくそれをただすチャンスであるにもかかわらず、またもや自民党は意味不明な行動をとり始めました。来る参院選に向けて田母神氏に立候補を打診したというのです。氏は要請を拒否したものの、自民党は代わりに空自OBの宇都氏を擁立し、田母神氏も宇都氏を支持する意思とのことです。
 つくづく意味不明で仕方ありませんが、一体何のための谷垣自民党なのでしょうか。バクチ同然であった安部・麻生両氏と違い、谷垣氏ならこのようなバカなことはせず、自民党を二大政党の一翼に復帰させられると考えていましたが、改めなくてはならないようです。小泉氏は任期中こそ支持率をキープしたものの、後から不満が噴出して自民党敗北の遠因となり、郵政民営化など目玉政策は巻き返され、83会は3会となって散会する有様です。また、安部・麻生両氏は人気を買われて総裁となったものの、いずれも選挙で惨敗を喫し、政権交代の直接の原因となりました。「人気取りではダメ」であるといい加減に学ぶべきです。
 また、有名人を立てる行為もさることながら、田母神氏の資質自体も大いに疑問で、堀江氏を立てるのと同レベルの行為です。まず思想面では、田母神氏は核武装や戦争正当化論を主張しています。これ自体は個人の思想ですから、とがめられるべきものではありませんが、田母神氏はわざわざ原爆投下日を選んで投下地で核武装論を唱えるような核武装論者です。このような、常日頃から公然とそうした主張を行っており、また政治家としての実績を持っているわけでもなく、それだけが「ウリ」のような人間を擁立するからには、自民党は核武装論に賛同しているか、少なくとも核武装に消極的な意思は持っていないのでしょう。無論、それならそれで構いませんが、そうであるなら参院選の公約に「核武装を実現します」の一言を書き加えるべきです。
 さらに、田母神氏は事実上のクビとなって退職させられていますが、それを行ったのは当時の自民党政権のはずです。自衛隊の幹部の資質なしとみて首を切っておきながら、あっという間に参院候補として擁立を試みるなどとは、何のためのクビであったのか、そもそも自民党が例の問題を正しく認識していたのかすら疑問です。
 ひとまず氏の思想には目をつぶったとしても、例の論文は非常に稚拙と評価されており、受賞も「出来レース」である可能性が非常に高いとみられています。主張の可否は置くとしても、ごく稚拙な歴史認識しかできていない人物が、最近まで一国の軍事組織の幹部であったことにはぞっとさせられますが、その上参院選への出馬まで打診しようとは、自民党の見識を疑います。
 例の論文が問題になった際にも、氏は「ヤフー(のインターネット上での投票)では6割が自分の論を支持している」などと開き直る始末でしたが、そもそも調査が統計学的に何の価値も持っておらず、信用できない点には目をつぶっても、例の件が問題なのは文民統制に反するからであって、論の支持者数の大小は全く関係がありません。すなわち、氏が意図的に問題をはぐらかそうとしたのでなければ、自衛隊幹部のくせに文民統制すら理解できていなかったことになります。他方、文民統制について認識していながら、問題をはぐらかそうとしていたのなら、文民統制の重要性を理解していながら、それを踏みにじったことになります。もはや自衛隊幹部としての常識すら欠如しており、ましてや参院選の候補に立てるような人物ではありません。
 当時の政権の側も、文民統制の問題によって氏を事実上のクビにしたはずですが、それから大して時間も経たないうちに今度は参院選の候補に仕立て上げようとは、自民党も文民統制について理解できているか非常に怪しいと言わざるを得ません。失礼を承知で申し上げて、谷垣氏は文民統制が何たるか分かっているのでしょうか。分かっているとしたら、自民党・谷垣氏には文民統制を尊重する意思があるのでしょうか。
 「元自衛隊幹部で、歯に衣着せぬ言動に定評がある愛国者」などと評すれば聞こえは良いですが、その実態はただの「おバカさん」にしか見えません。論文は稚拙と評され、自衛隊幹部でありながら文民統制すら知らず、あるいは知っていて反逆し、文民統制が問題にされているのに支持割合を持ち出して我を通すなど、意味不明な行動を繰り返しており、能力や常識に著しい欠如があるらしいことが分かります。本人は保守派から支持を集めているつもりのようですが、保守派とされるマスコミも文民統制問題に対しては批判するなどしており、行為も主張もいい加減とあっては、実際問題として保守派からこそ多くの批判を浴びても仕方ないような人物です。なぜ自民党はこのような「おバカさん」を候補にしようとするのでしょうか。苦戦しているとばかり考えていたら、案外余裕たっぷりのようです。
 つくづく小泉・安部・麻生氏らの大失敗で懲りたかと考えていたら、自民党は全く懲りていません。過去の反省もせずに人気投票に持ち込もうとする自民党などどうなろうが構わないと言いたいところですが、民主党独裁は困ります。自民党や谷垣氏におかれましては、まじめにやる気がないなら、参院選の期日が迫る前に自民党を解散された方がよろしいでしょう。いずれ元自民党議員を中心にした新政党ができ、それが民主党の対抗馬となるはずで、堀江氏や料理研究家、ヤンキー先生、田母神氏などを立てて人気投票に持ち込もうとする政党が残るよりずっとマシです。さらに言えば、声ばかり大きくて知性と常識が伴わない田母神氏よりも、政党の議席としてしか機能し得ない料理研究家の方がまだマシです。
 それにしても、私としては谷垣氏にそれなりの期待をしていたため、本件は非常に残念でした。「あえて火中の栗を拾う」という決意表明が本物であるなら、これからぜひともそれらしい態度を見せて欲しいです。

 Erlangの特徴の1つに「プロセス」なるものがあります。これは他の言語でいうスレッドの役割を持つもので、WikipediaのErlangの項には次のように書かれています。
Erlangの「プロセス」は、OS (オペレーティングシステム) のプロセスともOSのスレッドとも異なる (それらは軽量なスレッドであり、Javaでいう「グリーンスレッド」とある程度似ている) 。 Erlangを学ぶ際はこのことに注意する必要がある。 結果としてErlangの「プロセス」は非常に軽量となっている。 Erlangの「プロセス」は約309ワードのオーバーヘッドである。 かなり多量の「プロセス」を性能を低減すること無く生成することが可能である。 2000万個の「プロセス」を使ってのベンチマークが行われたことがある。
 やはり上記の記事曰く、プロセスを用いる側が何らかのデータを送信すると、要求はまずキューに格納されます。格納されたデータはプロセス側のreceiveなる操作によって取り出され、記述した処理が行われます。receiveではパターンマッチを使用でき、受け取ったデータに応じた処理が可能となっています。
 メッセージを送信及び受信するという動作の関係上、見た目はランデヴーに良く似た印象です。ただし、「ランデヴー」が待ち合わせを意味するのに対し、Erlangのそれは手紙を送る方式ですから、中身はかなり異なっています。
 ともかくプロセスが作れなくては何もできませんので、まずはプロセスの1つでも作成してみます。
-module(blog).
-export([call_spawn/0 , callfunc/1]).

call_spawn() -> spawn(blog , callfunc , ["args"]).
callfunc(M) -> io:format("~s~n" , [M]).
 spawn関数の1つ目の引数はモジュール、2つ目は呼び出す関数、3つ目は引数となっています。この例ではblog:callfunc("args")が呼び出されます。
 また、spawn関数はpidを返すため、それを使ってメッセージの送信が可能となっています。まずspawnの返り値を適当な変数に保存するなり、何らかの関数の引数として渡すなりしておき、「!」を使って送信を行います。送信されたデータの受信にはreceiveを使用します。receiveはパターンマッチで分岐ができるため、受信したデータに応じた様々な処理が可能です。
-module(blog).
-export([call_spawn/0 , calc/0]).

call_spawn() -> P = spawn(blog , calc , []) ,
	P ! {plus , 3 , 2} ,	% 足し算を呼び出し
	P ! {minus , 5 , 4} ,	% 引き算を呼び出し
	P ! exit ,	% プロセスの終了
	ok.

calc() ->
	receive
		{plus , A , B} -> io:format("~w~n" , [A + B]) , calc();
		{minus , A , B} -> io:format("~w~n" , [A - B]) , calc();
		exit -> continue
	end.
 上記の例では、{plus , Integer1 , Integer2}なら足し算の結果を表示し、{minus , Integer1 , Integer2}なら引き算の結果を表示します。また、表示後にはそれぞれ自身を呼び出し、次のメッセージを待ち受けます。exitを受け取ると終了します。
 ちなみに、やや適当ではありますが、ランデヴーではおおむね以下のようになります。
with Ada.Text_IO , Ada.Integer_Text_IO;
use Ada.Text_IO , Ada.Integer_Text_IO;

procedure Task_Sample is
	task Calc_Task is
		entry Plus(a , b : in Integer);
		entry Minus(a , b : in Integer);
		entry Task_Exit;
	end Calc_Task;

	task body Calc_Task is
		alive : Boolean := True;
	begin
		while alive loop
			select
				accept Plus(a , b : in Integer) do
					Put(a + b);
					New_Line;
				end Plus;
			or
				accept Minus(a , b : in Integer) do
					Put(a - b);
					New_Line;
				end Minus;
			or
				accept Task_Exit do
					alive := False;
				end Task_Exit;
			end select;
		end loop;
	end Calc_Task;

begin
	Calc_Task.Plus(3 , 2);
	Calc_Task.Minus(5 , 4);
	Calc_Task.Task_Exit;
end Task_Sample;
 ただし、この程度のプログラムでは目立ちませんが、実のところ上記の2つは全くの別物です。ランデヴーが待ち合わせであるのに比べ、Erlangのプロセスは送りっぱなしという、まさにマスコミのような処理であるためです。
 以下のようなプログラムがあるとして、
with Ada.Text_IO , Ada.Integer_Text_IO;
use Ada.Text_IO , Ada.Integer_Text_IO;

procedure Task_Sample is
	task Second_Task is
		entry Process_Start;
		entry Process_End;
	end Second_Task;

	task body Second_Task is
	begin
		accept Process_Start do
			null;
		end Process_Start;

		Put_Line("[Thread 2]処理を開始します。");
		delay 3.0;	-- 何か時間のかかる処理
		Put_Line("[Thread 2]処理が終了しました。");

		accept Process_End do
			null;
		end Process_End;
		Put_Line("[Thread 2]終了します。");
	end Second_Task;

begin
	Put_Line("[Thread 1]別スレッドの処理を開始します。");
	Second_Task.Process_Start;
	Put_Line("[Thread 1]処理の終了まで待機します。");
	Second_Task.Process_End;
	Put_Line("[Thread 1]終了します。");
end Task_Sample;
 このプログラムはおそらく意図通りに動作します。
[Thread 1]別スレッドを開始します。
[Thread 2]処理を開始します。
[Thread 1]処理の終了まで待機します。
(ここで3秒ほど待機)
[Thread 2]処理が終了しました。
[Thread 1]終了します。
[Thread 2]終了します。
 最後の終了メッセージの順番は前後する場合がありますが、異常ではありません。
 それでは、これをErlangに丸写しした場合はどうなるのでしょうか。
-module(blog).
-export([call_spawn/0 , second/0]).

call_spawn() -> P = spawn(blog , second , []) ,
	io:format("[Thread 1]別スレッドの処理を開始します。~n" , []) ,
	P ! process_start ,
	io:format("[Thread 1]処理の終了まで待機します。~n" , []) ,
	P ! process_end ,
	io:format("[Thread 1]終了します。~n" , []).

second() ->
	receive
		process_start -> continue
	end ,
	io:format("[Thread 2]処理を開始します。~n" , []) ,
	timer:sleep(3000) ,	% 時間のかかる処理
	io:format("[Thread 2]処理が終了しました。~n" , []) ,
	receive
		process_end -> continue
	end ,
	io:format("[Thread 2]終了します。~n" , []).
 実際に動かしてみたところ、ひどい有様でした。
1> c(blog).
{ok,blog}
2> blog:call_spawn().
[Thread 1]別スレッドの処理を開始します。
[Thread 1]処理の終了まで待機します。
[Thread 2]処理を開始します。
[Thread 1]終了します。
ok
(ここでメインのプロセスが終了し、制御が返ってくる)
(ところが約3秒後...)
3> [Thread 2]処理が終了しました。
3> [Thread 2]終了します。
3>
 ランデヴーと違って待ち合わせなどしてはくれません。そもそも「!」は相手に「手紙を送る」だけであって、Adaのようにentryのout引数でデータを回収したりはできませんので、そもそも同期する必要性に乏しいともいえます。しかしながら、何らかの処理を別プロセスに行わせ、処理の終了後にその結果を回収するような操作はかなり普遍的なものですから、行えなくては困ります。Erlangでは一体どのようにして実装するのでしょうか。
 考えるまでもなく、別プロセスからreceiveで送ってもらえば万事解決です。とりあえず素数でも数えさせてみます。
-module(blog).
-export([prime_count/1 , prime_process/2]).

prime_count(Max) -> spawn(blog , prime_process , [self() , Max]) ,
	io:format("素数を数えています...~n" , []) ,
	% 計算結果を得る前に行いたい処理があるなら記述
	receive
		{finished , Result} -> io:format("~w 番目の素数は ~w です。~n" ,
			[Max , Result])
	end.

prime_process(Callback , Max) -> Result = prime(Max) ,
	Callback ! {finished , Result}.

% 注:素数算出のアルゴリズムが稚拙との批判は受け付けておりません
prime(Max) -> in_prime(3 , 1 , Max , [2]).
in_prime(_ , Max , Max , [X | _]) -> X;
in_prime(At , Index , Max , List) ->
	D = lists:any(fun(X) -> At rem X == 0 end , List) ,
	case D of
		true -> in_prime(At + 2 , Index , Max , List);
		false -> in_prime(At + 2 , Index + 1 , Max , [At | List])
	end.
 これで別プロセスの計算結果を受け取れます。後は適当に計算してみるのみです。
1> blog:prime_count(1000).
素数を数えています...
1000 番目の素数は 7919 です。
ok
 各プロセスが割と容易に連携して処理を行える点は、Erlangの特徴の1つともなっているようです。チュートリアルのping/pongからして、そのようなプログラムとなっています。以下、2つのプロセスを協調して動作させてみたサンプルです。
-module(blog).
-export([send_start/1 , send/3]).

send_start(Max) -> PID_Shiroyagi = spawn(blog , send ,
	[shiroyagi , kuroyagi , Max]) ,
	PID_Kuroyagi = self() ,
	io:format("~sさんがお手紙を出しました。~n~n" , [atom_to_list(shiroyagi)]) ,
	PID_Shiroyagi ! PID_Kuroyagi ,
	send(kuroyagi , shiroyagi , Max).

send(_ , To , 0) -> io:format(
	"~sさんの便箋がなくなったので、動作を終了します。~n~n" ,
	[atom_to_list(To)]);
send(From , To , C) -> receive
		PTo -> io:format("~sさんが手紙を受け取りました。~n" ,
			[atom_to_list(To)]) ,
		io:format("しかし、読まずに食べてしまいました。~n" , []) ,
		io:format("~sさん、手紙のご用事を教えてください。~n~n" ,
			[atom_to_list(From)])
	end ,
	PTo ! self() ,
	send(From , To , C - 1).
 結果は以下の通りです。
1> blog:send_start(3).
shiroyagiさんがお手紙を出しました。

kuroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
shiroyagiさん、手紙のご用事を教えてください。

shiroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
kuroyagiさん、手紙のご用事を教えてください。

kuroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
shiroyagiさん、手紙のご用事を教えてください。

shiroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
kuroyagiさん、手紙のご用事を教えてください。

kuroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
shiroyagiさん、手紙のご用事を教えてください。

kuroyagiさんの便箋がなくなったので、動作を終了します。

shiroyagiさんが手紙を受け取りました。
しかし、読まずに食べてしまいました。
kuroyagiさん、手紙のご用事を教えてください。

shiroyagiさんの便箋がなくなったので、動作を終了します。

ok
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -