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

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/10/04(Sun)17:48:03
 2016年のオリンピック開催地がブラジルのリオデジャネイロに決定しました。オリンピックが南米で開催されるのは、(メキシコを含めなければ)これが初めてとなります。当初からリオデジャネイロが優勢との見方は強く、また私は経済的側面などから同都市がもっともふさわしいと考えていましたが、投票では番狂わせが生じたとはいえ、大方の予想通りの結果となりました。
 同都市の他にはマドリード、シカゴ、東京が候補となっていましたが、有力な対抗馬とみられていたシカゴは早々に脱落、次の投票では東京もあえなく落選し、本命とはみなされていなかったマドリードが意外な健闘を見せていましたが、治安や整備への不安を補って余りある期待により、見事にリオデジャネイロが決戦を制したようです。
 今回の選定で、本気で東京が選ばれるなどと考えていたのは、せいぜい石原氏程度ではないでしょうか。オバマ氏のテコ入れにもかかわらず敗退したシカゴのおかげで、最下位の汚名こそ免れたとはいえ、これほど勝利を見込めない選考もありません。結局、日本は誘致に無駄な費用と労力を費やしてしまったことになります。
 私はオリンピックというものに全く興味がないため、以下では基本的に経済的側面から問題を論じてみます。結果は最初からほぼ分かりきっていたとはいえ、まかり間違って東京が勝ってしまわなくてよかったとしか言いようがありません。また、リオデジャネイロが開催地に決定されたのも良いことです。
 日本が高度経済成長を遂げようかという1964年、東京でオリンピックが開催されたことがありました。このタイミングでの開催はまさに大正解と言えるもので、戦後復興の時代を脱却し、躍進しようとする日本の国威と知名度を上昇させる一助になったのは間違いありません。このようなタイミングでのオリンピック誘致であれば、私もそれに反対する理由はありませんし、コストを補って余りある有形無形の利益が得られることでしょう。
 ところが、日本はすでに高度経済成長を終え、先細りさえ心配される時代に入ってきました。今の時代にオリンピックなどを行ったとしても、今さら諸外国へのアピールにはなりませんし、交通網を整備すれば赤字となり、祭りの後には余計なハコモノが残るだけです。一時的なオリンピック景気は訪れたとしても、せいぜい一過性のものに過ぎず、景気・雇用回復の役には立ちません。今の日本の状況下で誘致に成功したとしても、まともな利益は得られないのです。
 これが昔の日本であったり、リオデジャネイロのような国であれば、また話は違ってきます。オリンピックに備えて整備した交通網は貴重なインフラとなり、オリンピックがもたらす需要は経済成長を生み出します。ブラジルはBRICsの一国でもあり、21世紀中の発展が期待できる国ですので、まさに非常に良いタイミングでの開催といえるでしょう。それを、オリンピックを開催したところで効果に期待できない状況でありながら、日本がわざわざ大都市抱えてしゃしゃり出て、経済成長を控えている国からオリンピック開催権を取り上げようともくろむとは、一体何を考えているのでしょうか。
 今後の日本は国内需要が先細り傾向とあって、政府内外には日本の観光産業の充実を模索する動きもあるようですが、その戦略の一環としてオリンピックを誘致するなどの想定があるのであれば、それも手段の1つとして考えられます。しかしながら、今回のようにほとんど気分の問題でオリンピックを誘致している限り、仮にオリンピックの開催権を獲得したとしても、単に負の遺産を残すだけの結果となるでしょう。

 非嫡出子が遺産分配などで差別を受けている問題で、最高裁はまたも民法の規定を合憲の判断を下しました。4人中3人の多数意見でしたが、裁判官のうち今井氏は「嫡出子には何の責任もない」として違憲と判断し、また竹内氏も「相続時は合憲だが、現時点では違憲の疑いが極めて強い」として、当時でこそ合憲であったものの、もし現在において同様の問題が発生した際には、違憲の可能性が高いとの意見を示しました。非嫡出子差別問題に関しては、今後とも問題視されていくことはあれ、差別が適切との見解が広まる状況はあまり考えられませんので、このまま一切の立法が行われなかったとしても、いずれは違憲となる可能性が十分にあるのは確かです。
 遺産相続の上で非嫡出子を不平等に扱う規定は、民法900条4号にて次のように定められています。
民法第九百条
同順位の相続人が数人あるときは、その相続分は、次の各号の定めるところによる。
(中略)
四 子、直系尊属又は兄弟姉妹が数人あるときは、各自の相続分は、相等しいものとする。ただし、嫡出でない子の相続分は、嫡出である子の相続分の二分の一とし、父母の一方のみを同じくする兄弟姉妹の相続分は、父母の双方を同じくする兄弟姉妹の相続分の二分の一とする
(太字は引用者による)
 すなわち、非嫡出子は嫡出子の1/2の遺産しか受け取れないものとされています。最近でこそ非嫡出子や事実婚夫婦といった人々の権利も保障されるようになってきましたが、かつては社会からも法からも阻害された扱いとなっており、この種の規定はその名残といえるでしょう。
 なお、上記規定が最初に合憲と判断されたのは1995年7月5日で、上記900条4号但し書きの規定は憲法14条に反するものではなく、合憲との判断が下されています。
憲法第十四条
すべて国民は、法の下に平等であつて、人種、信条、性別、社会的身分又は門地により、政治的、経済的又は社会的関係において、差別されない。
 判決文の中でも少々興味深いのが、以下の部分です。
 本件規定の立法理由は、法律上の配偶者との間に出生した嫡出子の立場を尊重するとともに、他方、被相続人の子である非嫡出子の立場にも配慮して、非嫡出子に嫡出子の二分の一の法定相続分を認めることにより、非嫡出子を保護しようとしたものであり、法律婚の尊重と非嫡出子の保護の調整を図ったものと解される。これを言い換えれば、民法が法律婚主義を採用している以上、法定相続分は婚姻関係にある配偶者とその子を優遇してこれを定めるが、他方、非嫡出子にも一定の法定相続分を認めてその保護を図ったものであると解される。
 現行民法は法律婚主義を採用しているのであるから、右のような本件規定の立法理由にも合理的な根拠があるというべきであり、本件規定が非嫡出子の法定相続分を嫡出子の二分の一としたことが、右立法理由との関連において著しく不合理であり、立法府に与えられた合理的な裁量判断の限界を超えたものということはできないのであって、本件規定は、合理的理由のない差別とはいえず、憲法一四条一項に反するものとはいえない。
 すなわち、非嫡出子は差別されるのが当たり前で、遺産を嫡出子の1/2だけ受け取れるのは、非嫡出子を差別ではなく保護したものであるというのです。確かに、立法当時の社会情勢を考えれば、もっともらしい意見ではあります。
 しかしながら、社会の思想は大きく変化しました。立法当時の考え方がどうあれ、今では「非嫡出子の遺産は1/2」との規定はどう見ても差別でしかありません。規定に賛成している人であっても、「民法が法律婚主義を定める以上、非嫡出子が嫡出子と比べて不利益をこうむるのはやむを得ない」と主張するならまだしも、「非嫡出子が嫡出子の1/2の遺産を受け取るのは、非嫡出子を保護したものである」と主張する人はほとんど存在しないでしょう。
 なお、同規定は以前より修正の必要性が議論されており、私もかねてから修正が必要と主張してきましたが、自民党政権下では慎重な意見が多く、実現の見通しが立たないままとなっていました。しかしながら、民主党政権の千葉氏は見直しに積極的な姿勢を見せており、修正される可能性が出てきています。
 それにしても、なぜ自民党は意味不明な理由でこの種の改正を拒むのでしょうか。今回の民法900条問題に限らず、772条問題では「性道徳が乱れるから」改正に反対し、戸籍を得られぬ子は公的な救済を受けられず、夫婦別姓には「家庭の一体感が損なわれるから」反対し、代理出産問題では原則論を繰り返すばかりで、現に存在する子の存在は宙に浮かせたままという有様です。このような意味不明な政党がよく政権を取っていたものだと感心するばかりです。
 無論、嫡出子らの権利を守るために900条は改正すべきでないとしたり、元配偶者の権利を守るために772条を残すべきとしたり、何らかの具体的な問題があるから夫婦別姓は行うべきでないとする意見は尊重しますし、決して否定できるものではありません。改正の代償として誰かの権利が損なわれるのであれば、十分な検証が必要なのは当然です。もし改正によって得られる利益や人権より、損なわれる利益や人権の方が大きいことが証明されれば、私も改正反対に回ることを否定しません。
 しかしながら、自民党の意味不明な自称保守派はといえば、自分の価値観を絶対化した意味不明な道徳とやらを理由に、何の罪もない非嫡出子への相続差別を容認したり、性道徳とやらを理由に、何の罪もない子が戸籍を持てなかったり、正しくない戸籍を持たなくてはならなくなったりする状態を強い、家庭の一体感などという極めて抽象的かつ根拠のない言い分によって夫婦別姓に反対したり、しまいには子の人権を「人質」にして代理出産をけん制する始末です。このような意見は尊重するどころか、まじめに論じる価値すらありません。本人らの意思である夫婦別姓はともかく、900条、772条、代理出産に対する「道徳」なる言い分は、いずれも親の責任(これ自体、単に「道徳とやらを主張する議員が好ましくないと考える」行為に抵触した責任であって、責任を取らされる合理的理由はない)を、何の落ち度もない子に押し付けているものである点が共通しており、全く正当性がありません。
 このまま900条問題を放置したとしても、いずれは違憲判決が出るのみでしょう。民主党政権には一刻も早い900条改正を期待したいところです。

 前回のGNADEでは散々Cとのインターフェイスに泣かされましたが、せっかくGNATとOpenCOBOLの両方を持っているのですから、COBOLとのインターフェイスも行ってみました。
 Adaのマニュアルに存在するInterfacing with COBOLでは、AdaからCOBOLを呼び出すことを前提としており、実際に結構色々な操作ができるようですが、ひとまずCOBOLからAdaを呼び出す実装を。どこまで正しく動くのか定かではありませんが、以下の手順でテストプログラムは何とか動作しましたので、とりあえず覚書としておきます。ゆえに正確性は一切保証できません。Adaプログラムの*.oファイルを使用する方法と、DLLを使用する方法の両方を行ってみました。

1.Adaプログラムを書く
 COBOLから呼び出すAdaプログラムを作成し、呼び出したい関数・プロシージャをpragma Exportします。
-- cobol_ada_a.ads
package COBOL_Ada_A is
	procedure Hello;

	pragma Export(COBOL , Hello , "Hello");
end COBOL_Ada_A;
 Helloプロシージャはメッセージを表示するだけの単純な実装としました。
-- cobol_ada_a.adb
with Ada.Text_IO;

package body COBOL_Ada_A is
	procedure Hello is
	begin
		Ada.Text_IO.Put_Line("Hello Ada!");
	end Hello;
end COBOL_Ada_A;
2.COBOLプログラムを書く
 以下、行番号をいちいちつけていては読みにくい上に不便ですので、フリースタイルで書いています。OpenCOBOLでは-freeオプションでコンパイルできます。あるいはタブをスペース2つに変換し、行番号をつけても構いません。
IDENTIFICATION DIVISION.
	PROGRAM-ID. COBOL_ADA_C.

PROCEDURE DIVISION.
	MAIN-PARAGRAPH.
		CALL 'adainit'
		CALL 'Hello'
		CALL 'adafinal'.
 adainit及びadafinalはAdaプログラムを呼び出す際の「お約束」であるらしく、adainitなしにCALLしてみたところ、プログラムが落ちました。ここで必要な初期化を行っているのでしょう。

 ここから、*.oファイルを生成する場合とDLLを使用する場合で手順が分かれます。まずは*.oファイルを使用する場合より。やり方が全く分からず投げ出しそうになりましたが、OpenCOBOL FAQ#Can OpenCOBOL Interface With Adaを発見したため、何とか作成できました。

A.「*.o」ファイルを生成・使用する場合
3A.Adaプログラムのコンパイルとgnatbind
 Adaの機能を利用するのに必要な部品は、すべてgnatbindが用意してくれるようです。
gnatmake -x cobol_ada_a.adb
gnatbind -n cobol_ada_a
gnatmake -x b~cobol_ada_a.adb
4A.COBOLソースのコンパイル
 コンパイル時にはlibgnat.dll(私の環境ではlibgnat-2007.dllなる名前になっていました。gnatのbinディレクトリに入っています)が必要です。以下、DLLをカレントディレクトリに置いた場合のコマンドです。-L.\の部分を変更すれば、ディレクトリの指定が可能です。-lgnatの部分はDLLの名前にあわせて変更(libgnat-2007なら-lgnat-2007または-llibgnat-2007。libは省略できる模様)します。
cobc -free -x -lgnat -L.\ cobol_ada_c.cbl cobol_ada_a.o b~cobol_ada_a.o
 私の環境では、これで無事にexeファイルが出力され、動作してくれました。

B.DLLを使用する場合
 続いてDLLを使用する方法も行ってみます。作成の際にはUsing library with Open COBOL(日本語)に大変お世話になりました。深くお礼申し上げます。

3B.DLL作成のためのdefファイルの作成
 エクスポートする関数名の一覧を記述します。ここではcobol_ada_a.defの名前で保存しました。名前は任意で構いませんが、Adaのファイル名に合わせない場合は、gnatdllでオプション指定が必要となります。
LIBRARY COBOL_Ada_A
EXPORTS
	Hello
	adainit
	adafinal
4B.gnatmakeとgnatdll
 Adaソースをコンパイルし、DLLを作成します。
gnatmake -x cobol_ada_a.adb
gnatdll -d cobol_ada_a.dll cobol_ada_a.ali
5B.COBOLソースのコンパイル
 *.oファイルを使ってコンパイルした時と同じく-lgnatが必要となりますが、今回はDLLファイルからAdaプログラムを呼び出そうとしていますので、そちらのDLLの指定も必要です。-lgnat及び-Lオプションに関しては、手順4Aと同様です。
cobc -free -x -lgnat -lcobol_ada_a -L.\ cobol_ada_c.cbl
6B.COB_PRE_LOAD環境変数の設定
 COBOLでは基本的に1ソースファイルが1つのプログラムとなるためか、このままではCALL 'adainit'に反応してadainit.dllなるファイルを探しに行ってしまいます。COBOL的には正しい動作でも、今回のように他の言語とやり取りしたい場合には困ります。
 上記で述べたサイト様「Using library with Open COBOL」にも書いてありますが、これを避けるにはDLLの名前をadainit.dllにしてしまうか、COB_PRE_LOAD環境変数で強制的にライブラリを読み込ませるしかありません。前者では自由が利きませんので、後者の方法を用いるのが適切そうです。
set COB_PRE_LOAD=cobol_ada_a
 私の環境では、これで無事にexeファイルを実行できました。
 F22戦闘機やボーイング機を動かしている言語だけに、Adaで数学計算の処理を実装しておいて、COBOLから呼び出してみても面白いかもしれません(これらにしても、実はAdaからCの数学ライブラリを呼び出しているのかもしれませんが)。なお、COBOL文字列をTo_Adaで処理したりすると、
undefined reference to `_Unwind_Resume'
 なるエラーが出たりしますが、その際にはGNATのbinディレクトリからlibgcc_s.dllを持ってきて、cobcに-lgcc_sオプションを指定すれば、問題なくコンパイルできます。

 今度は逆にAdaからCOBOLを呼び出してみます。cobcは-xオプションをつけなければ勝手にDLLを吐き出してくれますし、共有したい変数は単にLINKAGE SECTIONに書いてUSINGを使えばよく、AdaにはCOBOLとのインターフェイス機能が標準で組み込まれていますので、手順はCOBOLからAdaを呼ぶより簡単です。それにしても、AdaとCOBOLとは一体いかなる組み合わせなのでしょうか。片方は記憶力勝負の意味で厳しい言語で、もう片方は有名な手続き型高級言語の中でも最も難しいともされる言語とあっては、食べ合わせが良いのか悪いのか分かりません。少なくとも、JavaやC#のような軟弱な言語よりは消化に悪そうです。
 まず下準備として、以下のようなCOBOLプログラムを作成しました。
* ada_cobol_writer.cbl
IDENTIFICATION DIVISION.
	PROGRAM-ID. ADA_COBOL_WRITER.

ENVIRONMENT DIVISION.
	INPUT-OUTPUT SECTION.
		FILE-CONTROL.
			SELECT FILE-BS ASSIGN TO 'ada_cobol_bs'
				ORGANIZATION IS INDEXED
				ACCESS MODE IS DYNAMIC
				RECORD KEY IS FID.

DATA DIVISION.
	FILE SECTION.
		FD FILE-BS.
			01 FBS.
				03 FID PIC 9(4).
				03 FNAME PIC X(16).
				03 FVALUE PIC 9(16).

PROCEDURE DIVISION.
	MAIN-PARAGRAPH.
		OPEN OUTPUT FILE-BS

		MOVE 1 TO FID
		MOVE '現金' TO FNAME
		MOVE 12500000 TO FVALUE
		WRITE FBS

		MOVE 2 TO FID
		MOVE '当座預金' TO FNAME
		MOVE 304500000 TO FVALUE
		WRITE FBS

		MOVE 3 TO FID
		MOVE '備品' TO FNAME
		MOVE 265000000 TO FVALUE
		WRITE FBS

		MOVE 4 TO FID
		MOVE '売掛金' TO FNAME
		MOVE 55300000 TO FVALUE
		WRITE FBS

		MOVE 5 TO FID
		MOVE '研究開発費' TO FNAME
		MOVE 6680000 TO FVALUE
		WRITE FBS

		MOVE 6 TO FID
		MOVE '社債発行差金' TO FNAME
		MOVE 450000 TO FVALUE
		WRITE FBS

		CLOSE FILE-BS.
 これを-xオプションつきでコンパイルし、出力されたexeファイルを実行して、データを作成しておきます。OpenCOBOLであれば、ada_cobol_bsファイルが作成されるはずです。
 次いで、そのファイルを読み込むCOBOLプログラムを作成します。
* ada_cobol_reader.cbl
IDENTIFICATION DIVISION.
	PROGRAM-ID. Ada_COBOL_Reader.

ENVIRONMENT DIVISION.
	INPUT-OUTPUT SECTION.
		FILE-CONTROL.
			SELECT FILE-BS ASSIGN TO 'ada_cobol_bs'
				ORGANIZATION IS INDEXED
				ACCESS MODE IS DYNAMIC
				RECORD KEY IS FID.

DATA DIVISION.
	FILE SECTION.
		FD FILE-BS.
			01 FBS.
				03 FID PIC 9(4).
				03 FNAME PIC X(16).
				03 FVALUE PIC 9(16).
	LINKAGE SECTION.
		01 LBS.
			03 LID PIC 9(4).
			03 LNAME PIC X(16).
			03 LVALUE PIC 9(16).

PROCEDURE DIVISION USING LBS.
	MAIN-PARAGRAPH.
		OPEN INPUT FILE-BS
		MOVE LBS TO FBS
		READ FILE-BS
		MOVE FBS TO LBS
		CLOSE FILE-BS.
 これを-xオプションなしでコンパイルし、DLLファイルを生成します。本当はENTRYを使って処理を分けようと考えていたのですが、実際にAdaから呼び出してみると、ENTRY自体は一応認識されているらしいものの、なぜかEXIT PROGRAMを認識してくれませんので、使い物になりませんでした。GO TOも使用してみましたが、やはり効果はありませんでした。STOP RUNではプログラム自体が終わってしまいますし、困ったものです。
 ここで作成したDLLは、以下のAdaプログラムから呼び出します。
with Ada.Text_IO , Ada.Integer_Text_IO , Ada.Strings ,
	Ada.Strings.Fixed , Interfaces.COBOL;
use Ada.Text_IO , Ada.Integer_Text_IO , Ada.Strings ,
	Ada.Strings.Fixed , Interfaces;

procedure Ada_COBOL_Exec is
	-- 小数点なし16桁の数値型
	type Value_Type is delta 1.0 digits 16;

	-- id は COBOL では 9(4) であるが
	-- ここでは Alphanumeric(1..4) を使用した
	type COBOL_BS is record
		id : COBOL.Alphanumeric(1..4);
		name : COBOL.Alphanumeric(1..16);
		value : COBOL.Numeric(1..16);
	end record;

	pragma Convention(COBOL , COBOL_BS);

	-- Value_Type と Alphanumeric(1..16) を
	-- 相互変換するパッケージを実体化
	package Value_Conversions is new COBOL.Decimal_Conversions(Value_Type);
	use Value_Conversions;

	-- cobol_init と cobol_stop_run はお約束
	procedure Ada_COBOL_Reader(bs : in out COBOL_BS);
	procedure cobol_init;
	procedure cobol_stop_run;

	pragma Import(COBOL , Ada_COBOL_Reader , "Ada_COBOL_Reader");
	pragma Import(C , cobol_init , "cob_init");
	pragma Import(C , cobol_stop_run , "cob_stop_run");

	c_bs : COBOL_BS;

	procedure Show_BS_Data(b : in COBOL_BS) is
		v : Value_Type := To_Decimal(b.value , COBOL.Unsigned);
	begin
		Put_Line(COBOL.To_Ada(b.id));
		Put_Line(COBOL.To_Ada(b.name));
		Put(Integer(v));
		New_Line;
	end Show_BS_Data;

	assets : Integer := 0;
begin
	cobol_init;

	for i in 1..6 loop
		c_bs.id := COBOL.To_COBOL(
			Tail(Trim(i'Img , Left) , 4 , '0'));
		Ada_COBOL_Reader(c_bs);
		Show_BS_Data(c_bs);
		assets := assets + Integer(To_Decimal(
			c_bs.value , COBOL.Unsigned));
		New_Line;
	end loop;

	Put_Line("合計");
	Put(assets);

	cobol_stop_run;
end Ada_COBOL_Exec;
 cobol_initとcobol_stop_runはCOBOLプログラムを呼び出す際のお約束のようで、cobol_initを呼び出さずに使おうとするとエラーが発生してしまいます(ご丁寧にもcobol_initを呼び出すよう注意してくれます。無言で落ちていたCOBOL->Adaとは大違いです)。
 残るはコンパイルと実行ですが、その際にはOpenCOBOLのbinディレクトリにあるDLL一式が必要です。また、gnatmakeではリンカにada_cobol_reader.dllを指定するのと同時に、libcob-1.dllも指定する必要があります。
gnatmake ada_cobol_exec.adb -largs -lada_cobol_reader -lcob-1
 私の環境では、これで無事にコンパイルができました。資産の勘定の合計は644430000でした。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -