OSDN Git Service

[add] : Alteriso3について追記
[alterlinux/hayao.fascode.net.git] / buildmydist-2 / pages / alteriso3 / customize / index.php
1 <!DOCTYPE html>
2 <html lang="ja">
3 <head>
4
5     <?php
6         // ページ設定
7         $title = "Alter Linux - カスタマイズ";
8         $commonhtml = "${_SERVER['DOCUMENT_ROOT']}/buildmydist-2/commonhtml";
9         $distro = "alteriso3";
10
11         // 共通ファイルを読み込み
12         $domain = $_SERVER['HTTP_HOST'];
13         include("${commonhtml}/head.php");
14     ?>
15
16 </head>
17 <body>
18     <?php include("${commonhtml}/beforemain.php"); ?>
19
20     <main>
21         <h2>AlterISO3のチャンネルを作成する</h2>
22         <p>実際に独自のカスタマイズを施し、チャンネルの開発を行っていきます。</p>
23
24         <h2>このサイトの手順で開発をするもの</h2>
25         <p>今回は新しくAlter Linuxのエディションを開発します。だいたいの方針は以下のとおりです。</p>
26         <ul>
27             <li>ウィンドウマネージャとしてOpenBoxを採用</li>
28             <li>アプリケーションの起動はPlankとUlauncher</li>
29             <li>GTKのテーマはAdaptaでアイコンのテーマはPapirus</li>
30             <li>デスクトップの処理やファイルマネージャーにはPCManFMを採用</li>
31             <li>64bit版と32bit版を作成する</li>
32             <li>OSの名前は「Karaage OS」にする</li>
33             <li>チャンネル名は「karaage」にする</li>
34         </ul>
35
36         <h2>basicチャンネルをコピーして最低限の改造をしよう</h2>
37         <p>ターミナルを開きbuild.shがあるディレクトリまで移動してください。</p>
38         <p>AlterISO3にはかんたんにチャンネルを開発できるようにするためのベースチャンネルが用意されています。</p>
39         <p>ここには最低限必須のファイルが既に揃っているのでそれを改造して最低限の準備を整えます。</p>
40
41         <h3>basicをコピーしよう</h3>
42         <p>コマンドでbasicチャンネルをコピーします</p>
43         <p><code>.add</code>というのを付け加えることによってAlterISO3のそのもののソースコード管理から除外しつつAlterISO3にチャンネルとして正しく認識させることができます。</p>
44         <code class="code language-shell">
45             cd channels<br>
46             cp -r basic/ karaage.add/<br>
47         </code>
48         <p>ここで作成されたkaraage.addが1つのチャンネルを構成するディレクトリになります。</p>
49         <p>これを今後は「チャンネルディレクトリ」と呼びます。</p>
50
51         <h3>必要なファイルを書き換えよう</h3>
52         <p>いくつか用意されているファイルを書き換えます。</p>
53
54         <h4>airootfs.any/root/custmize_airootfs_basic.sh</h4>
55         <p>このディレクトリとスクリプトの意味は後々に解説します。とりあえずこのスクリプトを以下のように変更してください。</p>
56         <p><code>custmize_airootfs_basic.sh</code>から<code>custmize_airootfs_karaage.sh</code>に変更します。</p>
57         <p>最後の<code>_</code>のあとをチャンネル名にしてください。</p>
58
59         <h4>alteriso</h4>
60         <p>alterisoファイルはチャンネルが対応しているAlterISOのバージョンを書くためのものです。</p>
61         <p>このファイルを変更してしまうとbuild.shに認識されなくなってしまうので十分注意してください。このファイルはチャンネルを構成する上で唯一必須のものです。</p>
62
63         <h4>architecture</h4>
64         <p>利用可能なアーキテクチャを1行ずつ列挙していきます。</p>
65         <p>今回はi686版とx86_64版を作りますので、特に変更はいらないと思います。</p>
66         <p>x86_64だけ、i686だけ、のようにしたい場合には先頭に#をつけてコメントアウトしてください。</p>
67
68         <h4>config.any</h4>
69         <p>後々でとても重要になってくるのですが、現段階では特に変更することはありません。</p>
70         <p>このファイルはシェルスクリプトになっており、主にAlterISO3の設定(変数の定義)を行います。</p>
71         <p>この設定に記述可能な変数は全てdefault.confに記述されています。(OS名やデフォルトのユーザー名などもここで設定します。)</p>
72         <p>今回は「Karaage OS consisting of Openbox and Ulauncher」(OpenboxとUlauncherで構成された Karaage OS)としました。</p>
73
74         <h4>description.txt</h4>
75         <p>チャンネルの説明を記述するファイルです。</p>
76         <p>build.shのヘルプを見たとき、下の方にチャンネルの一覧とその説明が表示されていたはずです。</p>
77         <p>そのチャンネルの説明をこのファイルで定義します。</p>
78         <p>基本的に1行で記述するのが望ましいです。</p>
79
80         <h3>チャンネルの完全な仕様を確認する</h3>
81         <p>上のセクションではbasicチャンネルに存在している最低限のファイルを書きましたが、gnomeやxfceなどの他のチャンネルを見てみると他にも数多くのファイルが設置されているのがわかると思います。</p>
82         <p>チャンネルディレクトリ無いに置くことができるファイルの完全な一覧は全てドキュメント化されているのでそちらを参考にしてください。</p>
83         <p>(主要なファイルはこのサイトでも解説しますが、細かい仕様や特殊な状況でしか使用しないファイルについては解説を行いませんのでドキュメントを読んでください。)</p>
84         <p><a href="https://github.com/FascodeNet/alterlinux/tree/dev/docs/jp">完全なドキュメント一覧はこちら</a></p>
85
86         <h2>shareチャンネルについて</h2>
87         <p>AlterISO3には開発をものすごく容易にする「shareチャンネル」という仕組みがあります</p>
88         <p>shareチャンネルは、ビルドされるチャンネルに関わらず自動で追加されるパッケージやファイルの集まりです。</p>
89         <p>この仕組みによってチャンネルで共通のファイルを1箇所で管理し、また新しいチャンネルのソースコードを最小限に抑えます</p>
90         <p>例えばLinuxカーネルやブートローダーなどはチャンネルに関わらず必ずインストールされます。</p>
91         <p>また、ホスト名を設定する<code>/etc/hostname</code>や<code>/etc/bash.bashrc</code>などのファイルも必ず必要です。</p>
92         <p>shareチャンネルにそれらをまとめることによって自動で追加されるようになっています。</p>
93         <p>今この記事を見ているあなたが、AlterISO3本体の開発に関わりたいのではなく単純にチャンネルを作りたいだけなのならそこまで深く理解する必要はありません。</p>
94         <p>単純に「必要なパッケージやファイルは自動で追加されるんだな」と思ってください。</p>
95         <br>
96         <p>shareチャンネルには「share」と「share-extra」があります。</p>
97         <p>shareは強制的に全てのチャンネルで使用されますが、share-extraは設定ファイルで使用するかどうかを選択できます。</p>
98         <p>というのも、share-extraはGUIのためのファイルやパッケージが多く含まれており、CLIのチャンネルを構成したい場合には邪魔にしかならないためです。</p>
99         <br>
100         <p>今回はGUIのチャンネルを開発するのでshare-extraを有効化する必要があります。</p>
101         <p>有効化の設定はチャンネル設定ファイルで行います。まずはその設定ファイルについてを解説します。</p>
102
103
104         <h2>チャンネル設定を定義しよう</h2>
105         <p>チャンネル設定はチャンネルディレクトリ直下にある<code>config.any</code>で行います。</p>
106         <p>もしアーキテクチャごとに異なる設定を適用したい場合には<code>config.i686</code>や<code>config.x86_64</code>に書きます。</p>
107         <p>設定可能な値は全て<code>default.conf</code>に記述されていますので、それをコピーしてから編集します。</p>
108         <p>様々な値をここで設定するので1つずつ見ていきます。</p>
109         
110
111         <h3>OSの名前を設定しよう</h3>
112         <p>本来AlterISOはAlter Linuxのために開発されたのでデフォルトのOS名はAlter Linuxになっています。</p>
113         <p>設定でOSの名前を自由に変更できるようになっているので、それを変更します。</p>
114         <p>OS名は複数の変数で定義されています。それをまずは変更していきます。</p>
115 <pre class="line-numbers"><code class="language-shell">
116 # OS name used for startup screen, etc.
117 # This setting cannot be changed by an argument.
118 os_name="Alter Linux"
119
120 # OS name used for the name of the image file.
121 # This setting cannot be changed by an argument.
122 iso_name=alterlinux
123
124 # Image file label
125 # This setting cannot be changed by an argument.
126 iso_label="ALTER_$(date +%Y%m%d)"
127
128 # Directory name used for installation
129 # This setting cannot be changed by an argument.
130 install_dir=alter
131 </code></pre>
132         <p>該当しているのはこの部分です。1つずつ見ていきます。</p>
133
134         <h4>os_name</h4>
135         <p>一番基本となるOS名です。空白や大文字などを含めることが出来ます。</p>
136         <p>今回のOS名は「Karaage OS」なので、以下のように設定します。</p>
137         <div class="code language-shell">os_name="Karaage OS"</div>
138
139         <h4>iso_name</h4>
140         <p>iso_nameはビルドされたISOのファイル名になります。</p>
141         <p>空白や大文字を含めると思わぬエラーを引き起こす可能性があるので、小文字だけにすることをおすすめします。</p>
142         <div class="code language-shell">iso_name="karaageos"</div>
143
144         <h4>iso_label</h4>
145         <p>ビルドされたisoをディスクに焼いたり、マウントしたりした際に使用されるラベルです。</p>
146         <p>全て大文字にするのが良いと思いますので以下のようにします。</p>
147         <div class="code language-shell">iso_label="KARAAGE_$(date +%Y%m%d)"</div>
148
149         <h4>install_dir</h4>
150         <p>システム内部で使用されるディレクトリの名前です。短くて小文字が良いと思います。</p>
151         <p>(あまりに長いとブートローダーで細かい設定をするときに面倒になります。)</p>
152         <div class="code language-shell">install_dir="karaage"</div>
153
154         <h4>最終的なconfig.any</h4>
155         <p>コメントも含めた方が良いので最終的に以下のようになります。</p>
156 <pre class="line-numbers"><code class="language-shell">
157 # OS name used for startup screen, etc.
158 # This setting cannot be changed by an argument.
159 os_name="Karaage OS"
160
161 # OS name used for the name of the image file.
162 # This setting cannot be changed by an argument.
163 iso_name="karaageos"
164
165 # Image file label
166 # This setting cannot be changed by an argument.
167 iso_label="KARAAGE_$(date +%Y%m%d)"
168
169 # Directory name used for installation
170 # This setting cannot be changed by an argument.
171 install_dir="karaage"
172 </code></pre>
173         <p>これで設定ファイルがビルド開始時に自動で読み込まれるようになります。</p>
174
175         <h3>share-extraを有効化する</h3>
176         <p>先程も説明したshare-extraチャンネルを使用するための設定を行います。</p>
177         <p><code>default,conf</code>の後ろのほうに<code>include_extra</code>という変数が有るはずです。</p>
178         <p>その設定とコメントをコピーして<code>config.any</code>に貼り付けます。</p>
179         <p>そして<code>false</code>になっている部分を<code>true</code>に変更してください。</p>
180         <p>これでshare-extraが含まれるようになります。</p>
181         <p>(basicチャンネルをベースにしているので既にtrueに設定されているかもしれません。)</p>
182
183         <h2>パッケージリストを定義しよう</h2>
184         <p>ここからいよいよ本格的にチャンネルの開発を始めます。</p>
185
186         <h3>インストールするパッケージを決めよう</h3>
187         <p>まずはインストールするパッケージを決めます。</p>
188         <p>先程も解説したとおり、ほとんどのパッケージはshare-extraによってインストールされるため、必要なことはそれほど多くありません。</p>
189         <p>現にxfceチャンネルで指定されているパッケージもディスプレイマネージャとデスクトップ環境、そしてGTKのアイコンとテーマです。</p>
190         <p>公式リポジトリのパッケージリストは全て<code>packages</code>ディレクトリ内に配置します。</p>
191         <p>(AURのパッケージリストは別の場所に記述します。)</p>
192         <p><code>config.x86_64</code>などと同様に拡張子でアーキテクチャを表しますが、パッケージリストはanyをサポートしていません。必ず対応しているアーキテクチャ分のパッケージリストを書く必要があります。</p>
193         <p>パッケージディレクトリの直下に配置された、ファイル名が「.アーキテクチャ」で終わるファイルがパッケージリストとして読み込まれます。</p>
194         <p>パッケージリストが書かれたファイル名はアーキテクチャさえ合っていればファイル名は何でも良いです。</p>
195         <p>注意する点は、パッケージは1行で1つだけ記述することです。</p>
196         
197         <h3>もしインストールしたくないパッケージが合ったら</h3>
198         <p>shareやshare-extraによって勝手にインストールされてしまうのを防ぎたい場合、excludeファイルを使用してください。</p>
199         <p>excludeファイルに記述されているパッケージは明示的なインストールがされなくなります。(依存パッケージとしてインストールされることは有ります。)</p>
200
201         <h3>Karaage OSのパッケージリスト</h3>
202         <p>今回はOpenBoxとUlauncher、PCManFMを中心にデスクトップを構成するので、そのパッケージをインストールしていきます。</p>
203         <h4>OpenBox</h4>
204         <p>インストールするパッケージや設定方法などは<a href="https://wiki.archlinux.jp/index.php/Openbox">ArchWiki</a>が最も参考になります。</p>
205         <p>今回はOpenBox本体とその設定ツールとして<code>openbox obconf lxinput lxrandr</code>をインストールします。</p>
206         <p>パッケージファイルはそれぞれの役割ごとにカテゴリ分けしたほうが後々で管理をしやすいです。</p>
207         <h4>GTKテーマ、アイコンテーマ</h4>
208         <p>詳しくは<a href="/buildmydist-2/pages/misc/gtk-icon-theme/">GTKのアイコンとテーマについて</a>を参照してください。</p>
209         <div class="box-warning">
210             <p>ただし、テーマやアイコンを直接配置するのは推奨されていません。</p>
211             <p>必ずPKGBUILDを作成してAURに投稿するなどの方法でインストールを行ってください。</p>
212             <p>パッケージの作り方については<a href="http://localhost/buildmydist-2/pages/misc/pkgbuild">pacmanのパッケージを作る</a>を参照してください。</p>
213         </div>
214         <p>今回は既にArch Linuxの公式リポジトリ上に登録されている<code>adapta-gtk-theme papirus-icon-theme</code>をインストールします。</p>
215
216         <h3>ネットワーク系のツールをインストールする</h3>
217         <p>GUI用のネットワークツールとして<code>network-manager-applet</code>をインストールします。</p>
218         <p>セキュリティツールとして<code>firewalld ufw</code>をインストールします。</p>
219         <p>また、ブラウザとしては<code>chromium</code>をインストールします。</p>
220
221         <h3>ディスプレイマネージャについて</h3>
222         <p>ディスプレイマネージャにはLightDMをを採用します。</p>
223         <p>また、Greeterとして<code>lightdm-slick-greeter</code>、その設定ツールとして<code>lightdm-settings</code>をインストールします。</p>
224
225         <h3>AURのパッケージについて</h3>
226         <p>AURのパッケージリストは<code>packages</code>の代わりに<code>packages_aur</code>ディレクトリにパッケージリストを入れてください。</p>
227         <p>今回はAURからUlauncherをインストールしますので、それだけは別の場所に記述します。</p>
228         <p><code>karaage.add/packages_aur.x86_64/ulauncher.conf</code>に<code>ulauncher</code>と書きます。</p>
229         <p>これでAlterISO3はAURからPKGBUILDを取得してビルドし、インストールします。</p>
230
231         <h3>細かい仕様について</h3>
232         <p>Plymouthのパッケージやカーネルパッケージ、言語用パッケージなどの特定の条件でのみインストールされるパッケージがあります。</p>
233         <p>それらのカスタマイズは通常のチャンネルでは必要ありませんが、より細かくカスタマイズをしたい場合は知っておくと良いでしょう。</p>
234         <p>それらのパッケージの設定方法は<a href="https://github.com/FascodeNet/alterlinux/blob/dev/docs/jp/CHANNEL.md">チャンネルのの仕様</a>の「言語ごとのパッケージ」「カーネルごとのパッケージ」などを参照してください。</p>
235
236         <h2>ここまでのソースコード</h2>
237         <p>ここまででパッケージリストの定義といくつかの設定ファイルの変更を行いました。</p>
238         <p>どうしても文章ばかりになってしまってわかりにくい箇所も合ったと思うので、ここで一回現段階のソースコードを確認します。</p>
239         <p>以下のリンクでGitHub上に公開してあるので参考にしてみてください。</p>
240         <p><a href="https://github.com/Hayao0819/alterlinux-channels/tree/54a4bb37232fc2e316feabbc9a957dcea3d54aef/karaage.add">ソースコードはこちら</a></p>
241         <p>ここで完成ではなくこれからさらにいろいろといじっていきます。</p>
242
243         <h2>イメージファイルに含める、上書きするファイルを配置する</h2>
244         <div class="box-warning">
245             このセクションがチャンネル開発の本質でもあり一番難しく、やることが多い部分です。<br>
246             そのため解説がめちゃくちゃ長くなっています。ここさえ抜ければかんたんなので頑張ってください。
247         </div>
248         <p>airootfsディレクトリには上書きするファイルを含めることができます。</p>
249         <p>airootfsを/に見立ててディレクトリ構造を維持しながらファイルを上書きします。</p>
250         <p>例えば、全てのアーキテクチャで/etc/hostnameを上書きしたい場合は<code>karaage.add/airootfs.any/etc/hostname</code>にファイルを設置します。</p>
251         <p>airootfsもpackagesと同様に拡張子でアーキテクチャを識別します。airootfsではanyアーキテクチャを指定可能です。</p>
252
253         <h3>ライブ環境の設定のためにchrootでコマンドを実行する</h3>
254         <p>AlterISOではパッケ0時のインストール後に様々なコマンドを実行してユーザー作成や言語設定などをこなっています。</p>
255         <p>そしてチャンネル開発者が、自由にコマンドをroot権限で実行できる仕組みが用意されています。</p>
256         <p>最初の準備で名前を変更したシェルスクリプトがあったはずです。あれこそがパッケージのインストール後にじっこうされるシェルスクリプトです。</p>
257         <p><code>/root/customize_airootfs_[チャンネル名].sh</code>というシェルスクリプトがじっこうされるようになっています。</p>
258         <p>ここで「コマンドによる」ライブ環境の設定を行うことができます。</p>
259         <p>また、ユーザー名やパスワード、言語、カーネルなどのビルド時に指定された設定は全て変数から利用可能です。利用可能な変数は後々に解説します。</p>
260         <p>ただし、注意することが2つあります。</p>
261         <p>1つ目は「基本的にファイル作成は行わない」ということです。ファイルの内容までシェルスクリプトに書いてしまうとすぐにスクリプトが大きくなってしまいます。</p>
262         <p>その場合はairootfsでファイルを設置しましょう。ユーザー名やカーネルなどのビルドされるまでわからない情報をファイルに含める場合、<code>sed</code>と変数を利用して置き換えるのが最もかんたんです。</p>
263         <p>2つめはスクリプトの厳格さです。未定義の変数やコマンドを参照してしまうとエラーでビルドが停止してしまいます。</p>
264         <p>また、実行したコマンドが失敗した場合にもビルドが停止してしまいます。それらに気をつけてスクリプトを作成してください。</p>
265
266         <h3>ディスプレイマネージャの設定を行う</h3>
267         <p>ここは少々複雑になってしまいます。(ハヤオもこの方法にたどり着くまで時間がかかりました。)</p>
268         <p>まずはライブ環境の起動から、パスワードなどの入力を飛ばしてGUIを起動する手順を説明します。</p>
269         <p>Arch Linux系のOSはまず、カーネルが起動し最低限のファイルやドライバなどの読み込みを行った後、systemdと呼ばれるソフトを起動します。</p>
270         <p>このsystemdはがシステムを本格的に起動して様々な設定やソフトの起動を行います。(難しいので省略します。)</p>
271         <p>そしてsystemdはディスプレイマネージャが設定されていない場合はそのままCLIで起動します。</p>
272         <p>ここで、OSが起動した後に自動でGUIを立ち上げる方法が2つあることがわかります。</p>
273         <p>1つはsystemdからディスプレイマネージャを起動し、自動ログインを利用してデスクトップ環境を起動すること。</p>
274         <p>もう1つはCLIでの起動後に<code>.profile</code>などの起動時に自動でじっこうされるシェルスクリプトを利用して起動する方法。</p>
275         <p>先に結論を述べます。<b>必ず前者を利用してください。</b>理由は色々とあるので今から説明します。</p>
276         <p>まず、シェルスクリプトで単純にGUIを起動することは出来ません。シェルスクリプトで起動を行う場合、<code>xinit</code>と呼ばれるツールを利用して起動を行います。</p>
277         <p>実のところAlter Linux Beta2まではこの方法を採用していました。しかし、一部の環境で起動できなかったり認証が正常に行われなかったりと様々なバグが報告されました。</p>
278         <p>シェルスクリプトでGUIを起動すると、本来ディスプレイマネージャが自動で行っていることを自分でやる必要が有ります。(もちろんそれをシェルスクリプトでやるのは大変です。)</p>
279         <p>そのため、正常にログインや起動処理が行われないことが有ります。それぞれのディスプレイマネージャの自動ログイン機能を利用しましょう。</p>
280
281         <h4>それぞれのディスプレイマネージャに自動ログインを設定する</h4>
282         <p>airootfsを利用して自動ログインを設定しましょう。ただし、ここにもまた落とし穴が有ります。</p>
283         <p>AlterISO3のビルドオプションをよく見るとライブ環境のユーザー名を自由に変更することが出来ます。</p>
284         <p>つまり、直接ユーザー名を設定ファイルに書くことは出来ません。</p>
285         <p>そこで先程軽く説明したスクリプトによる置き換えを利用します。</p>
286         <p>まず何も考えず普通にディスプレイマネージャの自動ログインを設定してください。</p>
287         <p>自動ログインの設定については<a href="">ディスプレイマネージャについて</a>を参照してください。</p>
288         <p>その後、自動ログインするユーザーを記述する部分に<code>%USERNAME%</code>と入れてください。</p>
289         <p>この<code>%USERNAME%</code>をシェルスクリプトでユーザー名に置き換えます。</p>
290         <br>
291         <p>もし<code>/etc/lightdm/lightdm.conf</code>にユーザー名を書いたのなら以下のようなコマンドを<code>customize_airootfs</code>に記述してください。</p>
292         <pre class="line-numbers"><code class="language-shell">
293 # Replace auto login user
294 sed -i "s|%USERNAME%|${username}|g" "/etc/lightdm/lightdm.conf"
295         </code></pre>
296         <p>設定ファイルのパスは各自で書き換えてください。</p>
297         <p>その後、ディスプレイマネージャを自動起動させるためのsystemdのコマンドも同じスクリプトに記述してください。</p>
298         <p>これで正常にディスプレイマネージャの自動ログインとGUIの自動起動の設定が出来ました。</p>
299         <p>この部分はとてもむずかしいので実際にAlter Linux Xfceなどのソースコードを参照してみてください。</p>
300
301         <h3>ユーザーディレクトリのファイルを操作する</h3>
302         <p>~/内のファイルを上書き、追加する場合は注意することが有ります。</p>
303         <p>詳しくは<a href="/buildmydist-2/pages/misc/skeldir">ユーザーディレクトリのファイルを操作するには</a>を参照してください。</p>
304
305         <h3>様々な設定ファイルを作成する</h3>
306         <p>実際にディストリビューションにデフォルトで適用する設定ファイルを作成します。</p>
307         <p>詳しくは<a href="/buildmydist-2/pages/misc/create-config-file">GUIソフトの設定ファイルを作成する方法</a>を参照してください。</p>
308
309         <h2>ブートローダーの背景を設定する</h2>
310         <p>ここまでくればもう完成は目前です!</p>
311         <p>もうここまできた人は何度か自分のチャンネルをビルドしていると思いますが、必ず気になることが有ります。</p>
312         <p>isoを最初に起動したときのブートローダーの背景です。</p>
313         <p>ブートローダーはSysLinuxというもので構成されており、設定ファイルもちょっと複雑になっています。</p>
314         <p>しかしAlterISO3には背景をかんたんに変更できる仕組みがあります。</p>
315         <p>チャンネルディレクトリ直下に<b>640x480でpng形式</b>の画像を<code>splash.png</code>という名前で設置するだけです。</p>
316         <p>画像を作成する参考にAlter Linuxのものを載せておきます。</p>
317         <p><img src="/buildmydist-2/pages/alteriso3/customize/images/splash.png" alt="起動画面"></p>
318
319
320
321         
322         
323     </main>
324
325     <?php include("${commonhtml}/aftermain.php"); ?>
326 </body>
327 </html>
328