<!--
   $FML: create_program.sgml,v 1.9 2004/10/06 09:07:35 fukachan Exp $
-->


<chapter id="program.create">
	<title>
	新プログラムの作成
	</title>


<sect1>
	<title>
	プログラムを作る(コマンドライン用)
	</title>

<para>
まず FML::Process:: にモジュールを用意します。
最小構成の見本としては FML::Process::Calender 、
最大構成としては FML::Process::Distribute (記事配送プログラムの本体)
を参考にすると良いでしょう。
</para>

<para>
各 FML::Process::* モジュールが用意しなければいけない関数(メソッド)は
FML::Process::Flow::ProcessStart()
を見ると分かります。
FML::Process::Flow::ProcessStart()
がプロセスを駆動していますので、その中身を辿ってみて下さい。
2002/07 現在、これらのメソッドが必須です。
<screen>
new()
prepare()
verify_request()
run()
finish()
help()
</screen>
ダミーでもよいので、これらのメソッドを適宜用意しておいて下さい。各メソッ
ドの具体例は、FML::Process 以下のモジュールを見て下さい。メソッドの役
割を知るためには最大構成の FML::Process::Distribute が一番適当かも知れ
ません。
</para>

<para>
<screen>
        FML::Process::Kernel
                |       uses-a FML::Process::{Flow,Utils} FML::Parse ...
                |
                A
        FML::Process::○○○
                        uses-a FML::ほえほえ
                        uses-a CPAN モジュール
                        uses-a …
</screen>
</para>

<para>
FML::Process::○○○
を用意したら、
etc/modules
にプログラムとクラスの関係を定義して下さい。
また、
etc/command_line_options
にオプションとＭＬ名の有無などを定義してください
(書き方は、これらのファイルの中身を見て推測して下さい)。
</para>

<para>
これら３つを準備すれば、新しいプログラムの実行の準備が出来ました。
</para>

<para>
最後に、呼びたい名前のファイルを loader と link もしくは symlink する
ことで実行が可能になります。例えば、標準のインストールでは、次のように
なっています。
<screen>
% ls -l /usr/local/libexec/fml
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 command@ -> loader
drwxr-xr-x  2 root  wheel   512 Apr 14 18:25 current-20030414/
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 digest@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 distribute@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 error@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fml@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fml.pl@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmladdr@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmlalias@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmlconf@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmldoc@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmlhtmlify@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmlsch@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 fmlserv@ -> loader
-rwxr-xr-x  1 root  wheel  6863 Apr 14 18:24 loader*
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 makefml@ -> loader
lrwxr-xr-x  1 root  wheel     6 Apr 14 18:25 mead@ -> loader
</screen>
</para>

<para>
デフォルトのプログラムについては、インストーラがこれらの symlink 処理
をしてくれています。インストーラに symlink (後述)を実行してもらう必要
があるなら、etc/install.cf.in のbin_programs か libexec_programs にプ
ログラム名を定義して下さい。テスト段階では手動で symlink を行なってか
まいません。
</para>

</sect1>


<sect1>
	<title>
	プログラムを作る( CGI 用)
	</title>

<!--
  XXX-TODO ただしい？ ＞ プログラムを作る( CGI 用)
-->

<para>
内部構造の詳細は
<link linkend="cgi.internal">
<xref linkend="cgi.internal">
</link>
を参照してみて下さい。
</para>

<para>
CGI のプログラム本体は
FML::CGI::○○○
というクラスのモジュールです。
CGI 系列では次のような、オブジェクトの関係があります。
<screen>
        FML::Process::Kernel
                |
                A
        FML::Process::CGI::Kernel   uses-a CGI
                |
                A
        FML::Process::CGI
                |
                A
        FML::CGI::○○○
</screen>
</para>

<para>
CGI のプログラムの書き方もコマンドラインプログラムと同様です。
名前空間で区別するために CGI スクリプトのモジュールは
FML::Process ではなく FML::CGI に配置されています。
既存の FML::CGI のモジュールを見本にして、
FML::CGI::○○○
を適宜用意して下さい。
</para>


<para>
FML::CGI::○○○ の注意点は、
用意するメソッドが
<screen>
html_start()
html_end()
</screen>
および
<screen>
run_cgi_main()
run_cgi_title()
run_cgi_navigator()
run_cgi_menu()
run_cgi_command_help()
run_cgi_options()
</screen>
になるという点です。
これらの組で一つの画面
<footnote>
<para>
正確には画面は３×３の合計９個のブロックからなりますが、
そのうちの６つしか使っていません。
</para>
</footnote>
が構成されています。
</para>

<para>
これらは FML::Process::CGI の中の
verify_request() および run() から呼ばれた先のメソッドとなっています。
</para>

<para>
CGI プロセスは FML::Process::CGI で駆動され、run() メソッドは
<screen>
$curproc->html_start($args);
画面を作るために run_cgi_xxx() メソッド群を呼び出す。
$curproc->html_end($args);
</screen>
の順に FML::CGI:: 以下のメソッド群を呼び出しています。
</para>

<para>
ちなみに、2001/11 現在、FML::Process::CGI::Kernel プロセス自身は、
以下のメソッド
	<footnote>
	<para>
	このため、多くの場合
	FML::Process::Kernel
	のメソッドは CGI::Kernel でオーバロードされており、
	直接呼ばれることは稀です。
	</para>
	</footnote>
からなっています。
<screen>
new()
prepare()
verify_request()
run()
finish()
</screen>
特に、これらを編集する必要はないでしょう。
ちなみに FML::CGI:: は run() から呼ばれています。
</para>

</sect1>


</chapter>
