Archives
Recent Entries
Search


Links
Powered by
Movable Type 2.64

2008年08月12日

1000speaksers:6 お疲れ様でした

1000speakers@Kyushu #1 参加者の皆さんお疲れ様でしたヽ(´ー`)ノ

当日は寝てなかったので、プレゼン資料にもしっかり ε=ヽ(´ー`)ノ[モカ] って入れてます。

nishioさん、cojiさん、eilさん、杉山さん、takkenさん ほか遠方からもおいでいただき、大変賑やかでなおかつ技術的でまた九州でできたらな~って思ってます。

弊社からは発表者で2名、聞く人で1名参加でした。
以下発表資料のページ:
1000speakers@Kyushu #1 発表資料

OpenCOBOLやっぱり使ってる人少なかったですね。しかし既存のCOBOL資産を有効活用するにはよい選択肢だと思ってます。処理系自体のソースがありますので、機能拡張への敷居は比較的低いです。やるかどうかは別として(;´Д`)
実装を読んでいくうちに得られた情報の応用例として、PHPからOpenCOBOLの動的ライブラリを呼び出す仕組みをPHPのExtensionとして実装し、変数の投げ受け(つまり、PHPの立ち位置がJCLっぽくなる)するというアレなアイデアを紹介させていただきましたが、もちろん応用「例」というだけではなくて実際に動作してますし手元にコードがあります。その他、汎用機のプリンタをエミュレーションする(印刷する代わりにPDFにて吐き出します)とか、移植の手助けとなる変換スクリプトとかオープンソースならではの手法で開発した資産を作り溜めてます。いずれ表に出てくると思いますが。

Posted by minemaz at 12:21 | Comments (0) | TrackBack

2008年08月01日

崖の上のポニョ(のウェブサイト)って

映画「崖の上のポニョ」公式サイトって(´ー`)ブラウザのサイズに追従するんですが…

30インチモニタで見てみたり(´ー`) 605kB
20080801403.jpg

(;´Д`)でKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEぬ

Posted by minemaz at 19:56 | Comments (0) | TrackBack

OpenCOBOL 1.1にはSTART FILENAME LAST RECORDが…

OpenCOBOL 1.1にはSTART FILENAME LAST RECORDが…(;´Д`)ないみたいですね未実装

どうする?
1.諦める
2.コンパイル対象のCOBOLソースを弄って何とか対応する
3.実装されるまで待つ

急いでるときには答えはこの中にはないわけです(´ー`)。
「4.実装する」
それが答えでも良いですよね。しかも自分でやる。
登坂ルートを考えてみました。OpenCOBOLのコンパイラ(cobc)そのものに手を入れるという凶悪な方法もあるんですが、ちょっと大がかりすぎるし将来的に本家でやるでしょうからとりあえずCALL文で対応します。そこでCALL文で ファイル名(FILENAME)渡せるのかというと渡せるようです。少なくとも内部的には h_FILENAME としてポインタ渡ししてくれます。
そして、libcob/fileio.c には

case COB_READ_LAST:
fh->readdir = ISPREV;
if (isread (fh->isfd, (void *)f->record->data, ISLAST | lmode) == -1) {
ret = isretsts (COB_STATUS_10_END_OF_FILE);
}
break;

こういうコードもあります(しかし、このcase文を通るようなselect()の値は設定されませんが)。
ということで(´ー`)たぶん良い子の皆さんが寝て起きた頃には実装してしまうことでしょう。

Posted by minemaz at 17:19 | Comments (0) | TrackBack

OpenCOBOLでdebug

OpenCOBOLでdebugヽ(´ー`)ノOpenCOBOL 1.1は便利ですよ

OpenCOBOL用に書いた、または他のCOBOL実装から持ってきたコードのdebugをする際に知っておくと大変便利な話いろいろ。

OpenCOBOL forum: debug with gdbでも取り上げられていますが、

OpenCOBOL 1.1にて --ftraceallや --ftrace オプション(または -g )をつけてcobcコマンドを実行すると吐かれた実行ファイル(または *.so 動的ライブラリファイル)に cob_set_location関数が埋め込まれます。これは処理の各行に埋め込まれ「これから実行する処理は元のCOBOLソースのどの位置か?」について情報を内部変数に保存します。
さらに、内部変数 cob_line_trace が1のとき(cob_ready_trace()が呼ばれているとき/ --ftraceall、--ftrace 時)は現在実行中の処理行についての情報を標準エラー出力へ出力します。自動的にprintfデバッグできるわけですね(-gの場合は、cb_flag_source_location = 1 だけ行われるため、cob_set_location関数はプログラム中に埋め込まれますが、トレース表示はされません)。


void
cob_set_location (const char *progid, const char *sfile, const unsigned int sline,
const char *csect, const char *cpara, const char *cstatement)
{
cob_current_program_id = progid;
cob_source_file = sfile;
cob_source_line = sline;
cob_current_section = csect;
cob_current_paragraph = cpara;
if (cstatement) {
cob_source_statement = cstatement;
}
if (cob_line_trace) {
fprintf (stderr, "PROGRAM-ID: %s \tLine: %d \tStatement: %s\n",
(char *)progid, sline, cstatement ? (char *)cstatement : "Unknown");
fflush (stderr);
}
}

void
cob_ready_trace (void)
{
cob_line_trace = 1;
}

void
cob_reset_trace (void)
{
cob_line_trace = 0;
}

実行結果ですが:


[root@po SAMPLE]# cobc --ftraceall SICB0515
[root@po SAMPLE]# cobcrun SICB0515
PROGRAM-ID: SICB0515: ENTRY SICB0515
PROGRAM-ID: SICB0515: MAIN SECTION
PROGRAM-ID: SICB0515: MAIN-RTN
PROGRAM-ID: SICB0515 Line: 290 Statement: PERFORM
PROGRAM-ID: SICB0515: OPEN-RTN
PROGRAM-ID: SICB0515 Line: 308 Statement: INITIALIZE
PROGRAM-ID: SICB0515 Line: 309 Statement: INITIALIZE
PROGRAM-ID: SICB0515 Line: 313 Statement: MOVE
Segmentation fault
[root@po SAMPLE]#


という感じです(´ー`)。Line:313を実行後にSegmentation faultが発生しているのがわかりますね(原因は集団項目のサイズ分確保しない状態でSICB0515プログラムを呼び出したことでした)。PROCEDUREを外部からCALLで呼んでいるのにUSING以降に指定した変数に十分な長さの領域を確保して渡していないと… MOVE時に変数の領域外から読みだそうとして Signal 11が発生することもあります。

Posted by minemaz at 12:47 | Comments (0) | TrackBack