Common Gateway Interface
画
画
企
企
中
中
集
集
+SSI
ホームページを立ち上げたけど、どうも物足りない。情報も盛り込んだし、綺麗なグラフィックも貼った。でも、ただ情報を発信
するだけじゃなんだかつまらない。そんな人にお勧めなのが、
CGI（Common Gateway Interface）によるホームページのアップグレードだ。CGIを使えば、フォームを使ったメールの送信やゲームなど、さまざまなインタラクティブな要素をホームページに取り入れることができる。

ひろのただとし

広野忠敏
j http://www.st.rim.or.jp/˜hirono/

164 INTERNET magazine 1996/3

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

CGIってなんだろう

CGI

問者カウンターの生成など）のように、他のプログラムに処理を行わせて、そのHTMLとCGIによる情報発信の違いCommon Gateway Interface* UNIXで使われているプログラム言語の1つ。フリーソフトとして入手できる。さまざまな処理に対して柔軟に対応できるので、ホームページでインタラクティブな処理を行うCGIを記述す
るのに適している（本誌付録CD-ROMに収録）。
（参考文献）
・「はじめてのPerl」Randal L. Schwartz著（ソフトバンク）
・「Perlプログラミング」Larry Wall/Randal L. Schwartz著（ソフトバンク）

ふつうホームペー

実行結果をブラウザーに表示したいとき

ジはHTMLを使っに利用することができる（図2）。

て書く。ブラウザ

ところで、CGIを利用してインタラク

ーからページを見るときは、Webサーバ

ティブなページを作るにはサーバーの外でー（httpd）にアクセスして、サーバーに何かを実行するためのプログラムやスク

URLを送るとWebサーバーが該当するペリプトを作らなければならない。したがージのHTMLファイルやイメージファイって、これらのプログラミング言語一般

ルをブラウザーに送信してくれる。受けに関する知識や、Webサーバーに関する取ったファイルを解釈して画面に表示す知識、Webサーバーが設置されているプるのがブラウザーの役割だ（図1）。つまラットフォームの知識などが必要になる

り、HTMLだけでホームページを作ると、ことをあらかじめお断りしておく。

作っておいた内容以上のものを表示する

なお、今回の解説はWebサーバーとしことはできない。ということは、静的なて最もポピュラーなNCSA httpdとサーバ情報の発信しかできないわけだ。

ー環境として最も利用されているUNIX、これに一石を投じてくれるのがCGIだ。

そしてプログラムではPerl*とシェルスク

CGIはCommon Gateway Interfaceの略

リプトを前 提 に進 めることにする。

で、Webサーバーとサーバー上で動く他

NCSA以外のサーバーでもCGIを使うこのプログラムやスクリプトとのインターフとができるが、設定が若干異なったり、ェイスの役割を果たす。通常のHTMLでそのサーバー固有のルールがあることもはHTMLに書かれた以上の情報をブラウ多いので注意してほしい。

ザーに送信することはできないが、CGI

NCSA httpdに関しては、開発元のを使えば、プログラムやスクリプトで生

NCSAのサーバーに詳しい情報（英文）成したHTMLファイルなどをブラウザーがあるので参考になるだろう（図3）。

に送ることができるようになる。つまり、
CGIはHTMLでは不可能な複雑な仕事をすることのできる非常に強力な機能を持っているのだ。たとえば、CGIではブラウザーで対話的な処理を行う場合（デー
タベースの検索のためのキー項目の入力など）や、ページを表示するときにあら

図1：HTMLによるページの表示

かじめ何かを行わせておきたいとき（訪1 フォームなどによる
CGIスクリプトの要求

3 ページを送信

図3：NCSA httpdのCGIに関する情報ページ
2 該当するページを

4 ページを表示

j http://hoohoo.ncsa.uiuc.edu/cgi/

取得

WebブラウザーWebサーバー

1 FORMなどによる
CGIスクリプトの要求

2 CGIスクリプトを実行

CGI
4 実行結果をブラウザーに返す

3 実行結果をサーバーに返す

5 実行結果を表示

図2：CGI処理の流れ

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

165Common Gateway Interface

図4：CGIを駆使した個人ののホームページ

j http://bizserve.com/ascott/hal.html

CGI
CGIでは
こんなことができる

カウンター
文字がモーフィングする

CGIを使うといっ
たいどのようなことができるのだろう。CGIが最も利用されているのは検索エンジンなどのデータベース検 索 だ。
YahooやLycosといった検索エンジンはアニメーション効果もCGIで可能

ユーザーが入力した語句でデータベース
を検索し、その結果をブラウザーに表示する。このときのデータベース検索と結果の表示にCGIが使われている。また、
Web上のゲームでもCGIが利用されている。ゲームではゲームに関するアクショ
ンや情報をCGIプログラムが受け取り、そのアクションに対してのレスポンスを
CGIプログラムで返すという処理になっていることが多い。また、フォームに何か入力してそれを処理するのもCGIのポ
ピュラーな使い方だ。たとえば、フォー
ムに入力された内容のメール送信、訪問者リスト、アンケートの収集などといったものにCGIプログラムが使われている。

図5：ATARI社のゲーム機「JAGWIRE」のホームページj http://www.atari.com/jagwire/

図6：フォームから入力した値に基づいて画像が作られる

j http://www.fourmilab.ch/cgi-bin/uncgi/Earth/

図7：検索エンジンにもCGIが利用されている

j http://www.yahoo.com/

166 INTERNET magazine 1996/3

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

CGI利用可（セキュリティチェックなどがある
場合もあり）

条件付きで利用可

表1：ホームページを持てる
プロバイダーのCGI対応状況
InfoNOC、虹−ネット、ラボ NMCインターネットサービス、 C I S ネ ッ ト 、 ミ コ ネ ッ ト 、（1995年12月25〜1996年1
ネット、AIANetインターネッ マリモインターネット、アリネ BEKKOAME/INTERNET、月10日編集部調査）

CERN httpd

NCSA httpd

Netscape他

トサービス、RIMNET、ネット ットインターネットサービス、 BAOBABNET、biwaネット、
ラ ピ ュ タ 、 彩 ネ ッ ト 、 INTER BROAD、 まほろば、 スリーウェブ、 i l i n x 、 I n f o
CYBORG、インターネット浜 avisインターネット、ネスク・ Sphere、インターサーブ
松、Info RYOMA、両毛イン インターネット・サービス、オ
ターネット、インターリンク、 レンジインターネットサービス、
GulfNet、インターネットアク INGインターネット
セスセンター、インターネット
互助会横浜（CERNも使用）、 INTERCITY（法人ユーザーのKuMaGaYaNet（実験とし incl（アクセスカウンターのみ）て）、CJNインターネット（自 THE FSINetwork（別途見積 み）、α-Web（オーダー物件
作は不可）、栃木インターネッ り）、NewCOARA（システム のみ）、netSpace（コンテンツト（協力グループのみ）、丸紅 管理者が許可したもの）、M サービス利用の法人）、Butaインターネットサービス（個別 Bird インターネットサービス man（法人のみ）、at-mインタ（法人対象）ーネット（インストール済のも対応）のを利用）、tcp-ip（会社で用意したものを利用）
HITインターネットサービス、 しかせんべいインターネット、 InfoValley、IFNET、SKJ、
晴れの国ネット（汎用的なCGI Aoi-net、インターネットビー PICNET（検討中）の利用を検討中）、ガリバーイ クル、メディアマウンテン、ガンターネット（予定あり）、ス ンセキ・インターネット・サー
ペック、GNOC（準備中）
ビス、 S P W I N T E R N E T 、
SeaFolk（予定あり）

利用不可

Common Gateway Interface

使用サーバーCGI

その他のサーバーでのCGI
ラットフォームがUNIXのWebサプーバーは C G I を作 るときに、UNIXの開発環境やPerlやawk、シェルスクリプトといったプログラミング環境が使えるためCGIを作るのも比較的簡単だ。また、シェルコマンドやさまざまなコマンドを組み合わせていろいろな処理をすることができる。ところで、UNIX以外のプラットフォームで動作するWebサーバーではどのような方法でCGIを実用できるのでなければ、最も手っ取り早現するのだろうか。UNIX以外ではWin-

い方法は、UNIXのシェルをユーザーに開dows NTの httpsや MacintoshのC G I を使う前に放している商用プロバイダーのホームペ

MacHTTPなどが比較的よく利用されては、まずCGIを使ージ設置サービスを利用することだ。たいるWebサーバーだ。もちろん、これら

おうとするサーバ

だし、各プロバイダーでCGIへの対応はのサーバーでもCGIを利用することがで

ーがCGIを使える状態になっているのかさまざまなので注意してほしい。たとえきる。

どうかを確認する必要がある。そのサーば、特に手続きもなく自由に利用できる

バーの管理者に問い合わせてみよう。多ところでは、もともとサポートなしでW

くのWebサーバーではデフォルトの設定

UNIXシェルを操作できるユーザーが多ではCGIが使えないようになっている。ユく、自力でなんとかするという気構えがションとして作成する。また、Perlなど

ーザーレベルで自由にCGIが使えると、必要だ。また、システム管理者宛ての連のインタープリターを使うことも可能だ。

それによってセキュリティーに穴が生じ絡が必要なところ、個別に対応するとこ

さらに、最近のバージョンではVisualるケースもあるので、プロバイダーなどのろ、事務局でご用意したCGIのみ利用を

Basicなどのウィンドウアプリケーション

サーバーではCGIを禁止しているところ許可するところなどもある（表1）。

をCGIで使うことが可能になっている。

CGIを使う前に使用するサーバーを確認する

CGIの利用に関する情報をWeb上でも多い。

indows NT上で動作するhttpsはCGIとしてコンソールアプリケー

ションを呼び出すことができる。つまり、
CGIプログラムはコンソールアプリケー

acHTTPの場合はAppleScriptでM

C G I プログラムを作 成 する。

なお、WebサーバーでCGIを使用可能

提供しているプロバイダーもあるが（表にする方法については、Webサーバーに2）、ニュースグループやメーリングリス

よって細かい設定方法が違うため、ここトでユーザー同士が情報交換を行っていでは触れないことにする。

るところも多い。

でコントロールすることができるので、現在のところCGIの利用はたいてい基本

かなり高度な処理が可能になる。

プロバイダーのWWW CGIを使う場合、サーバーをチェック 自分でサーバーを立ち上げたり、AppleScriptだけでもかなり高度なCGIを作ることもできるが、その他のプログ
ラムやアプリケーションをAppleScript

料金に含まれているが、利用が増えてくるとサーバーを切り分ける形で有料化を検討しているところもある。

大学や会社のサーバー環境をそのまま利

表2：プロバイダーの提供するCGI情報（プロバイダー名）（参考情報）BEKKOAME

http://www.bekkoame.or.jp/Users/homepageinfo.html

MAHOROBA

http://www.mahoroba.or.jp/uinfo/etc.html

BAOBABNET

http://www.linkage.co.jp/HTML/CGI/cgi1.shtml

インターリンク

http://home.interlink.or.jp/Prim/guide.html

オレンジインターネットサービス

http://www.orange.or.jp/orangecom/homepage/homepage.html
インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

167Common Gateway Interface

CGI
CGIを実行するためのセットアップ

従来のCGIプロ

Webページ上のフォームに入力された

CGIの基礎知識

内容をCGIプログラムで受け取るにはフ

グラムはサーバーの特定のディレ

クトリーになければ使うことができなかっ

CGIの呼び出しとデータの受け渡し

CGIはそのCGIを

ォームの書き方によって2つの方法があ呼び出すためのドる。 H T M L の「 F O R M タグ」 にはたが、NCSA httpdではユーザーが宣言

キ ュ メ ン ト

「METHODパラメーター」というものがをすれば、ユーザーのディレクトリーにあ（HTML）とCGIプログラムで構成されあり、このMETHODパラメーターの値

るCGI プログラムを使うことができる

る。つまり、ドキュメントが表示されてによって、CGIプログラムへの値の受け（CERN httpdでは不可。ただし、cgi-いる状態でアンカーポイントをクリック

渡し方が異なるので注意が必要だ。

wrapperなどを使えば同様のことが可したり、フォーム処理のボタンが押され能）。そのための宣言ファイルが.htac-たりしたときに、CGIプログラムを呼び（例1）

cessと呼ばれるファイルだ。この.htac-

出すことができるのである。

METHOD=POST

cessファイルは通常はユーザーのホーム
ページのホームディレクトリー（˜/pub-

FORMタグのMETHODパラメーター

1 フォームによるCGIの呼び出し

lic̲html）に置く。ユーザーのディレク

フォームを使ったCGIの呼び出しでは、がPOSTのときは、標準入力経由で値がトリーに置いたCGIプログラムを使用可

フォームに入力された内容を使ってさま受け渡される。つまりCGIプログラムで能にするには、この.htaccessファイルにざまな処理をするのがCGIプログラムのは、標準入力からデータを読み込むこと仕事となる。

でフォームにどのような値が入力された次の1行を追加する。

このとき、フォームにどのような内容のかを知ることができる。このときに必AddType application/x-httpd-が入力されたのかをCGIプログラム側で要なのがCONTENT̲LENGTH環境変cgi .cgi知る必要がある。そのために使われるの数だ。CONTENT̲LENGTH環境変数

が「環境変数」と呼ばれる特殊な変数には、データの長さ（バイト数）が格納

この記述があると、拡張子が.cgiのフだ。Webサーバーでは、あらかじめいくされるので、必ず入力データの長さを受ァイルがCGIプログラムとして取り扱わ

つかの環境変数が設定されていて、そのけ取ってから、その長さだけ標準入力かれるようになる。なお、サーバーでCGI

環境変数を参照すれば、フォームにどのら値を読み込まなければならない（図9）。

の試用を禁止するように設定されているような内容が入力されたのかをCGIプロ

ときは、たとえ.htaccessで設定を行っグラムで判断することができる。このた（例2）てもCGIを使うことはできない。

めに使 われる環 境 変 数 がQ U E R Y ̲

METHOD=GET

STRING、REQUEST̲METHOD、
CONTENT̲LENGTHなどである。これ

FORMタグのMETHODパラメーター

らの3つの環境変数の内容を確認すれば、がGETのとき、あるいはFORMタグにどのような手順と内容でCGIプログラム

METHOD パラメーターがないときは、に値が渡されるのかを知ることができる。

QUERY̲STRING環境変数にフォーム

フォーム

CONTENT̲LENGTH

CGI
標準入力からの読み込み

図9：METHODパラメーターが"POST"のとき
フォーム

j http://www.komaba.c.u-tokyo.ac.jp/˜g440838/
timetable/izumitime.shtml

QUERY̲STRING

CGI
データを参照図8：アクティブ時刻表
現在時刻を元に「次の電車」を表示する

図10：METHODパラメーターが"GET"のとき

168 INTERNET magazine 1996/3

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Common Gateway Interface

CGIで入力された値が格納される。つまり、ラクター（日本語や記号など）は%83のCGIプログラム側ではQUERY̲STRING

ように%nn（nnはキャラクタコード）の

環境変数の内容を取得するだけで、フォ形にエンコードされる。つまり、どのよ<A HREF="foo.cgi?arg1=val1&

ームにどのような値が入力されるのかをうな値が入力されたのかを知るには、入arg2=val2">

知ることができる（図10）。

力データを受け取った後で、そのデータしが行われる。そのため、をデコードする必要が出てくる。

のように、アンカーでCGIプログラムに値を受け渡すことも可能だ（図11）。

ところで、フォームに入力された値は、

2 アンカータグによるCGIの呼び出しそのままの形でCGIプログラムに渡されるのではなく、入力データはまずエンコ

HTMLのアンカータグに別のページの3 イメージタグによるCGIの呼び出しードされてからCGIプログラムに渡されURLを記述しておくと、そのアンカーがアンカータグと同様に、イメージタグる。たとえば、TEXT1とTEXT2というクリックされたらそこに記述されたURLにもCGIプログラムのURLを書くことが名前の入力フィールドに値を入力したとにジャンプすることができる。通常はこできる。イメージタグに指定したCGIプ

しよう。このときにCGIプログラムに渡こに他のページのURLを記述するのだが、ログラムでGIFやXBMなどのイメージをされる内容はその代わりにCGIプログラムのURLを書生成すれば、そこにプログラムで生成しいておけばアンカーをクリックしたときにたグラフィックイメージを表示すること

TEXT1=<TEXT1の内容＞&TEXT2=<

URLで指定されたCGIプログラムを動かができる。これを応用すればCGIプログTEXT2の内容>"

すことができる。

ラムでグラフをプロットしたり、日替わアンカーでCGIプログラムが呼ばれるりのイメージを表示したりすることも可のように、それぞれの入力が"&"（アときは、FORMタグのMETHODパラメ

能だ。また、グラフィック表示されていンパーサンド）で区切られて渡される。

ーターがG E T のときと同 様 に、るアクセスカウンターの多くはこの手法

また、入力内容のうち英数字以外のキャQUERY̲STRINGを使って値の受け渡を使っている（図12）。

QUERY̲STRINGS<A HREF="foo.cgi?arg1=val1&arg2=val2">
CGIプログラム

CGI?以降の値が引数として渡される

データを参照図11：アンカータグからCGIを呼び出す

CGIの呼び出し

CGI
プログラムで生成したイメージを返す

図12：イメージタグからCGIを呼び出す

JAVAとLiveScriptN

etscape 2.0でもサポートし、最近にわかに注目を集めている

メーションさせたりゲームを作ったりと、実にさまざまなことを実現のがJAVAやLiveScriptといった言語だ。CGIはサーバー側でできる。今のところJAVAを解釈できるブラウザーはHotJavaとプログラムを動かして、その結果をブラウザーに返す。そのため、重Netscape 2.0（β3以降）の2つ。さらに今後はさまざまなブラウザ

いプログラムなどをCGIとして動作させると、その分だけサーバーにーでJAVAを解釈できるようになる。

負荷がかかることになる。ところが、JAVAやLiveScriptはサーバー
側ではプログラムを動作させずに、プログラムのコードをブラウザーにL転送し、ブラウザー側でプログラムを実行する。そのため、サーバー

ないが、フォームやボタンのハンドリングを簡単に行うことができる。

に負荷をかけずにインタラクティブな仕掛けを作ることができるのだ。

ただ、まだ仕様が未確定な部分もあるため、今後に注目したい。

AVAはC++言語に似た仕様を持ち、グラフィックの処理やテキJ

LiveScriptもC++言語をもとにした言語仕様を採用しているが、スト処理のみならず、ソケットを使ったネットワークプログラミ

JAVAよりは簡単にプログラムを作成することができるようになってングまでカバーする極めて高度な言語だ。JAVAを使いこなすにはプいる。

iveScriptはNetscape 2.0に搭載されているスクリプト言語だ。

LiveScriptはイメージのハンドリングなど高度なことはまだでき

ログラミングに関しての豊富な知識が必要になるが、イメージをアニ

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

169Common Gateway Interface

CGI
CGIプログラムを書いてみよう

ときは、の例では、CGIプログラムが実行されると、http://www.foo.bar/で指示されたヘッダーを作る

H T M L によってContent-type: text/html

HTMLファイルがブラウザーに表示される。このヘッダーを使ってランダムな

CGIプログラムを呼 び出 す準 備 がという内容のヘッダーを出力するように

URLを生成すれば、ランダムリンク機能

できたら、次にCGIプログラムの本体をする。また、GIFイメージを出力したいをCGIで簡単に実装することができる。

作成する。CGIプログラムはWebサーバ

ときは、
Status:ーが動作しているプラットフォームで使える言語ならばどのような言語でも使う

Content-type: image/gif
Statusヘッダーはブラウザーに状態コことができるが、UNIXの場合ではシェル
スクリプト、Perl、Cコンパイラ、Tcl/Tkのようなヘッダーを生 成 すればよい。

ードを返すために使われる。この状態コなどがよく使われている。ここでは、Perl

text/htmlやimage/gifはMIME形式のタードはHTTPの仕様に定義されているもを使ってCGIプログラムを作ることにしイプで、これらのほかにもtext/plain、

ので、さまざまなコードを返すことがでよう。

image/jpeg、video/mpegなどさまざまきるのだが、あまり一般的ではないので呼び出されたCGIプログラムはデータなタイプを指定することができる。ブラ

ここでは解説を省略する。

を標準出力に出力するが、そのデータはウザーでは、このタイプを解釈してブラ

実際にブラウザーのウィンドウに表示さウザー自身にデータを表示するのか、あれる。このときに出力されるイメージのるいはヘルパーアプリケーションでデータ先頭には、ヘッダーと呼ばれる特別な行を再生するのかが決定される。

簡単なCGI
プログラムの例

ここで簡単なCGIプログラムを2つ紹介しよう。

を付加しなければならない。ヘッダーは出力をどのように扱ったらよいのかをサ

Location:

1 日付と時間を表示する
sample1.cgi（図13）は最も簡単なーバーに指示する。このヘッダーにはContent-type、Location、Statusの3

LocationヘッダーはCGIの出力をブラCGIの例である。ここではUNIXのdate

種類がある。なお、これらのヘッダーのウザーに表示するのではなく、サーバー

コマンドを使って、現在の日付を表示す

後には、常に空行が必要になる。

上の別のドキュメントをブラウザーに表る。このように、CGIを使うとUNIXの示させるための特殊なヘッダーである。

コマンドの出力結果をHTMLとして吐きContent-type:Content-typeヘッダーはヘッダーに続

どのドキュメントを表示させるのかは、出すことができるので、いろいろと応用「Location:」の後にURLで指定する。たできる。たとえば、Webサーバー経由でとえば、参照できるArchieやWhois、Fingerといったゲートウェイは、このようにCGIでく出力内容がどのようなものかをブラウザーに指示するためのヘッダーだ。たとLocation: http://www.foo.bar/

UNIXコマンドを実行することによって実現されていることが多い。

えば、CGIがHTMLファイルを出力する
図13：sample1.cgi
現在の日付を表示する#!/usr/local/bin/perl
ヘッダーでHTMLファイルの出力を指定

170 INTERNET magazine 1996/3

print "Content-type: text/html\n\n";print "<TITLE>CGI Sample #1</TITLE>\n";print "<H1>CGI Sample #1</H1>\n";$d = `date`;
print "$d\n";

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Common Gateway Interface

CGI
2 時刻によってイメージを変化させる
変化するイメージ、たとえば、時刻で内容が変わるイメージや、アニメーショ
ンするイメージにもCGIが使われている。
sample2.cgi（図14）は時刻によって異なるイメージを表示するためのCGIプログラムだ。この例では、参照した時刻が6時以前のときはmidnight.gifが、6時から9時まではmorning.gifが、9時から18時まではafternoon.gifが、それ以降のときはnight.gifが表示される。このCGIプ
ログラムを、<A IMG="sample2.cgi">のようにイメージタグで指定すると、ページを見た時刻によって違うイメージのGIFファイルが表示される。また、これを応用すればランダムに変化するイメージなども作ることができる。

図14： sample2.cgi
時間によってホームページのイメージを変えるCGIスクリプト#!/usr/local/bin/perl
print "Content-type: image/gif\n\n";($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
if ($hour < 6) {$img = 'midnight.gif';} elsif ($hour < 9) {$img = 'morning.gif';} elsif ($hour < 18) {$img = 'afternoon.gif';} else {$img = 'night.gif';}$image = `/bin/cat $img`;
print "$image";

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

171Common Gateway Interface

CGI
サーバーのcgi-binディレクトリーに置かかかわらず、ここで紹介した方法が使えれるはずだ。もし、imagemapプログラ

ないときは、サーバーの管理者にお願い

今やさまざまなところで使われている

ムがサーバーのcgi-binディレクトリーにしてサーバーのバージョンアップをしてもクリッカブルマップ。これは、マウスでないときは、サーバーの管理者にお願い

らうか、新しいimagemapをインストー

イメージをクリックすると、クリックした

して用意してもらうようにしよう。

クリッカブルマップを作ってみよう

ルしてもらおう。また、NSCA以外の場所によってジャンプ先が変わるものだ。

ところで、このimagemapプログラム

Webサーバーの場合は、まったく同じ方

実はこのクリッカブルマップもCGIで実には大きく分けて2種類のバージョンが存法は使えないが、似たような方法でクリ現されている。ここではNCSA httpdの在する。古いバージョンのimagemapでッカブルマップを作ることができる。こISMAP機能を使ったクリッカブルマップ

はサーバーで管理するイメージマップ全

れらのサーバーを使っている人は、そのの作成方法を紹介しよう。

体の設定ファイル（imagemap.conf）

サーバーのマニュアルなどで確認してほが必要で、このファイルは一般にユーザ

しい。

NCSA httpdにはーが修正することができないようになっ

ISMAPと呼ばれている。一方NCSA httpdのバージョン

るクリッカブルマ

1 . 3 以 降 に同 梱 されている新 しいップを実現するための機能が用意されてimagemapは、このような管理者用の設ずクリッカブルマ

いる。この機能は、イメージマップを指定ファイルを必要としない。つまり、ユップの元になる画像ファイルと座標指定示するためのHTMLタグと、それによっーザーが自由に自分のディレクトリーに用のmapファイルを用意する（図15）。画て呼 び出 されるC G I プログラム

イメージマップを作れるようになっている

像ファイルはブラウザーでインライン表示（imagemap）の2つで実現されている。

のだ。ここでは、NCSA httpd 1.3以降が可能な形式にする必要があるが、GIF

このCGIプログラムは、NCSA httpdのパに付属しているimagemapを使ってクリ形式のファイルならばたいていのブラウ

ッケージに含まれているもので、通常

ッカブルマップの作成方法を紹介しよう。

ザーでインライン表示ができる。イメー

Webサーバーをセットアップするときに、

なお、サーバーがNCSA httpdであるにもジファイルを用意したら、次にmapファ

イメージタグのISMAP機能

イメージとmapファイルを作る

クリッカブルマッ
プを作るには、ま<method>default /~foo/default.html#
circle /~foo/circle.html 268,56 290,102#
rect /~foo/rectangle.html 111,7 211,104#
poly /~foo/poligon.html 57,6 5,106 107,106
図15：マップ上の座標を指定するmapファイル

default
デフォルトのURLを指定する。
circle円の領域を指定する。座標は円の中心とエッジの座標を指定。
rect
四角形の領域を指定する。座標は四角形の左上と右下。
poly
多角形の領域を指定する。座標は多角形のそれぞれの座標を指定。
point
点を指定する。座標は点の座標。

図16：ブラウザーでクリッカブルマップを表示したところ

172 INTERNET magazine 1996/3

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Common Gateway Interface

CGI
イルを作る。このmapファイルはイメー

で、クリッカブルマップを作るときに活<IMG SRC="/~foo/click.gif">

ジのどこがクリックされたらどのURLに用しよう（表3）。

</A>

ジャンプするのかを指示するファイルで、次のような形式のテキストファイルであHTMLファイルに組み込む

イメージファイル

ここで気をつけてほしいのだが、mapとm a p ファイル

ファイルがユーザーのディレクトリーが用意できたら、（˜fooなど）にあるときはimagemap/に

mapファイルの形式：

さっそくそれをHTMLに組み込もう。ク

続くmapファイルの指定は˜foo/...とい<method><URL><座標1><座標2>

リッカブルマップの組み込みは、アンカ

うように必ず「˜ +ユーザー名」から始め...

ータグとイメージタグのペアで行われる。

るようにする。他のURLのように相対パる。

スでのファイル指定はできない。
たとえば、rect http://foo.bar.jp/ 0,0<A HREF="mapファイルの指定">

ところで、NCSA httpdの最新バージ

50,50 のような行がmapファイルにある<IMG SRC="イメージファイル"ョン（1.5）ではimagemapの機能がサときは、0,0〜50,50の四角形の領域内

ISMAP>

ーバー側に取り込まれるようになった</A>（Internal Imagemap）ので、アンカー

がマウスでクリックされるとに/cgi-bin/imagemap....のように書かな

http://foo.bar.jp/にジャンプする。このように、イメージのどの領域がクリック

このときにイメージタグには必 ず

くても直接mapファイルを指定するだけされたらどこにジャンプするのかをmap

ISMAPパラメーターを付けなければならでクリッカブルマップを作れるようになっ

ファイルにどんどん書いていけばよい。

ない。ISMAPを付けるのを忘れてしまうている。NCSA httpd 1.5を使うと、先defaultの指定はmapファイルに定義さと、イメージが普通のアンカーになってほどの例は次のようになる。

れた領域のどこにも属さないところがクしまう。

リックされたときの指定だ。

さて、アンカーに指定するmapファイ<A HREF="/~foo/click.map">

ちなみに、mapファイルの名前は、元ルの指定だが、ここはmapファイルの<IMG SRC="/~foo/click.gif">になるイメージファイルの名前と同じベURLを直接書くのではないので気をつけ</A>ースネームを持つファイル名にしておくよう。ここには、imagemapプログラムと後々管理が楽になる。仮にイメージののURLとその後に続けてmapファイルの

ただし、これを実現するにはサーバー

ファイル名がclick̲img.gifのときはmap

URLを書くようにする。たとえば、クリの設定を少々変更するか、ユーザーのデファイルの名前はclick̲img.mapにすれッカブルマップのイメージが/˜foo/click.

ィレクトリーに.htaccessファイルを用意ばよいだろう。ところで、イメージの座

gifで、imagemapが/cgi-bin/imagemap

して.mapファイルに関しての設定を追加

標を確認しながらmapファイルを手作業にあり、mapファイルが/˜foo/click.map

しなければならない。なお、NCSA httpd

で作るのはかなり大変な作業だ。クリッにあるとすると、クリッカブルマップの指1.5のInternal Imagemapに関しての詳

カブルマップの元になるイメージを表示

定は次のようになる。

細は、http://hoohoo.ncsa.uiuc.edu/
docs/tutorials/imagemapping.htmlを参しながら、領域をマウスで指定するだけで自動的にmapファイルを作成してくれ<A HREF="/cgi-bin/imagemap/

るフリーソフトやシェアウエアもあるの~foo/click.map">

照してほしい。

表3 mapファイル作成用のソフト一覧

OS

ソフト名

入手先

本誌付録CD-ROMに収録

Windows

MapEdit

ftp://ftp.netcom.com/pub/bo/boutell/mapedit●

MapThis!

ftp://ftp.coast.net/SimTel/win3/internet/mpths120.zip

Mac

HyperMapEdit
MacMapMaker
WebMapftp://ftp.comvista.com/pub/net/www/HyperMapEdit.sit.bin
ftp://ftp.ncsa.uiuc.edu/edu/mmm/MacMapMaker.sea.hqx
ftp://ftp.riken.go.jp/pub/info-mac/text/html/web-map101.hqx

●

UNIX

MapEdit

ftp://ftp.netcom.com/pub/bo/boutell/mapedit●

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

173Common Gateway Interface

CGI
をプログラムで作成して、アクセスカウ

として扱われるが、SSIが使えるようにンターを表示したい場所にSSIを使ってセットアップされているときは、SSIのコ

最近はホームペー

埋め込めば、その場所にアクセスカウン

マンドと認識される。#execはコマンド

ジに「 あなたは

ターが表示される。

を実行しなさいという意味で、cmd=でアクセスカウンターに挑戦
SSIによるプログラムの実行

始まるパラメーターには実行したいコマ

xxxx人番目のおSSIもCGIと同様

ンドを書く。このようなタグをページににWeb サーバー

埋め込むと、<!--...-->で指定したタグのた。このようなしかけもCGIで実現する

でSSIが使えるよ

代わりに、コマンドの実行結果がページことはできるが、結構難しい。そこでもうに設定されていなければ使うことがでに表示される。また、SSIでは#execのっと簡単なSSIを使ったアクセスカウン

きない。SSIに関しても、多くのプロバ

ほかにも#includeなどの指示を使うこと

ターの作り方を紹介しよう。

イダーやサーバーは使用を許可していなもできるようになっている。なお、#exec

SSIはServer Side Includesの略。こいため、あらかじめそのサーバーでSSIが以 外 のコマンドの詳 細 についてはの機能はNCSA httpdと呼ばれるWebサ

使えるのかどうかを調べなければならな

http://hoohoo.ncsa.uiuc.edu/docs/tuto

ーバーに固有の機能だ。したがって、い。SSIが使えるように設定されている

rials/includes.html を参照してほしい。

NCSA httpdでしか利用できないことをあサーバーでSSI機能を使うには、CGIのそれでは、いくつかSSIを使ったサンプル

らかじめお断りしておく。SSIもCGIとときと同様に.htaccessファイルに次の1を紹介しよう。

同様に外部のプログラムを実行して、そ行を追加する。

客様です」とホームページを見に来た人をカウントしているページも多くなってき

SSIのセットアップとHTMLの書き方

1 日付の表示の結果をブラウザーに返す。ただし、CGIはたいていの場合フルコンテンツのAddType text/x-server-

データが返されるが、SSIの場合はペーparsed-html .html「 現 在 の 日 付 は <!-#exec cmd=
"date"-->です」

ジの一部分にSSIの実行結果が埋め込まれる（インクルードされる）ような仕組

この設 定 をしておけば、 拡 張 子

みになっている。たとえば、時刻を表示

が.HTMLのファイルでSSIが使用可能にするプログラムを作って、それをSSIで呼なる。

これはUNIXコマンドのdateの出力結
果を埋め込む例である。つまり、この例

び出すと、ホームページの特定の場所に

次に、ホームページでSSIを使うには時刻が表示される。SSIを使えばUNIX

次のようなタグをHTML内に埋め込む。

mm月dd日....です」となる。

<!--#exec cmd="コマンド" -->2 ログイン状況の表示の表示イメージは「現在の日付はyyyy年

コマンドの出力結果だけでなく、自分で作ったプログラムの出力結果をホームー
ページにインクルードすることが可能だ。
そのため、アクセスをカウントする部分<!--で始まるタグは、通常はコメント<!-#exec cmd="who"-->

図17：おたのしみページ
Web上でできる3目ならべ、立体迷路、SamaGameなど

j http://hepl.phys.nagoya-u.ac.jp/˜mitsuru/games.html

174 INTERNET magazine 1996/3

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Common Gateway Interface

CGI
これもUNIXのwhoコマンドを使ってそのときサーバーにログインしている人のにして作ることもできる。このときの数たカウンターファイルの内容を読み込み、値がカウンターの初期値になる。

それを1つだけインクリメントして、ふたたびカウンターファイルに書き出す。こ一覧を表示する例である。このように、
SSIを使えばコマンドの実行結果をペー% echo 0 > countのときに、標準出力にカウンターの値が出力されるようになっている。なお、こジに取り込むことができる。また、このコマンドにはシェルスクリプトやPerlスクカウンターファイルを作成したら、次のプログラム自体はcount.shという名前

リプト、Cで作ったプログラムなどを指定のそのカウンターファイルを誰でも書きでセーブする。また、カウンターファイ

することもできる。

込めるようにパーミッションを設定する。

ルと同様に、このプログラムは他人が実Webサーバーからファイルがアクセスさ行できなければならないので、次のコマ

それでは、SSIをれるときは、自分のアカウントではなく、ンドを使ってパーミッションを設定する。

使ってアクセスカ

まったく別のアカウントになるので、他ウンターを作って人が書き込めるようにしておく必要があみよう。アクセスカウンターを作るには、るからだ。パーミッションの設定は次のアクセスをカウントしてそのときのアクセ

コマンドを使う。

アクセスカウンターを作る

3 ホームページにカウンタープログラ

ス数を表示するプログラムが必要だ。このプログラムをSSIを使ってホームページ

ムを埋め込む% chmod 666 countに埋め込めば、そこにカウント数を表示することができる。アクセスをカウントす% chmod 755 count.sh

最後に、カウントするプログラムをホームページに埋め込む。たとえば、次の2 カウンター用のプログラムを作る

ようにすればよいだろう。

るには、まず、そのときまでのアクセスカウンターを保存するファイルができ数を記録するファイルが必要となる。

たら、カウントアップしてそのときのカウ「あなたは<!--#exec cmd="./ンターの値を返すプログラムを作る。こcount.sh"-->人目の訪問者です」

1 カウント数を記録するファイルを

こでは、シェルスクリプトを使って次のようなプログラムを作ってみた。

準備

こうすれば、count.shの出力結果がホームページに埋 め込 まれる。 また、まず、アクセス数を保存するためのファイルを作成する。ここでは、"count"と#!/bin/sh

count.shの出力を数値ではなく、<IMG

いう名前のファイルをカウントしたいホ

c = `/bin/cat count`

SRC="1.gif"><IMG SRC="2.gif">....のームページと同じディレクトリーに置く

expr $c + 1 | /usr/bin/tee

ようにイメージタグを出力するようにしことにしよう。カウンターファイルを作

countて、あらかじめ数字のグラフィックファ
イルを用意すれば、アクセスカウンター

成するには、エディターなどを使ってもよいが、echoコマンドを使って次のよう

このプログラムでは、まず先ほど作っをグラフィックで表示することも可能だ。

j http://cervantes.comptons.com/digits/
図18：Digit Mania
カウンター用のグラフィックが豊富に
アップロードされている

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

175Common Gateway Interface

CGI
フォームの内容をメールで受け取る

1 HTMLでフォームを作る

ト、ボタンを定義することが可能だ。

まずしなければならないのは、入力フ

フォームを使った
CGICGIで最もポピュィールドを持つページを作ることである。

・テキスト入力フィールド

ラーなのが、いわつまり、フォームの定義だ。フォームを<INPUT TYPE="text" NAME=

ゆるメールフォー

定義するには、HTMLの「FORMタグ」"name" SIZE=n MAXLENGTH=nを使う（図19）。

VALUE="value">

ムやアンケートフォームなど入力フォー
ムを使ったものだろう。いろいろな項目

このタグは通常のテキスト入力フィーを用意しておけば、読み手も反応しやす<FORM ACTION="CGIプログラムのくなる。フォームを作ってフォームの内

URL">

ルドのためのタグである。NAMEには入容を自動的にメールするようなCGIプロ

入力フィールドの定義....

力フィールドの名前を指定する。SIZE

グラムを書けば、ユーザーの反応をダイ</FORM>とMAXLENGTHは省略が可能で、それぞれ入力フィールドの長さと、入力フィレクトに受け取ることも可能だ。また、アンケートなどの用途では、フォームにこれが、入力フォームの定義の基本とールドに入力できる最大文字列長を表入力された内容をデータベースに登録すなる部分である。なお、FORMタグにはす。また、VALUEが指定されているとるCGIプログラムやデータベースの集計

METHODを指定することができるが、あらかじめテキスト入力フィールドに結果を表示するようなCGIプログラムを

ここではデフォルトのGETを使うことに

VALUEの内容を入れておくことができ作れば、まとまったアンケート結果を手する（p.168参照）。

る。また、typeを"text"ではなく"pass-

フォームの基本部分ができたら、次は軽に見ることも可能だ。

word"にすると入力文字がすべて"＊"で表示される。

ここでは、フォームに入力された内容

入力フィールドをデザインする。HTMLを自動的に自分宛にメールするCGIプロには通常のテキスト入力フィールド、複グラムを作ってみることにしよう。

数行の入力ができるテキスト入力エリア、

・テキスト入力エリア

ラジオボタンやチェックボックス、リス<TEXTAREA NAME="name" ROWS=n<HTML><HEAD><TITLE>メール送信</TITLE></HEAD><BODY><FORM ACTION="postmail.cgi">
あなたのメールアドレスを入力してください<BR><INPUT TYPE="text" name="email" SIZE=40><BR>
あなたの本名を入力してください<BR><INPUT TYPE="text" name="name" SIZE=40><BR>
性別は?<BR><INPUT TYPE="radio" NAME="sex" value="male" CHECKED>男性<INPUT TYPE="radio" NAME="sex" value="female">女性<INPUT TYPE="radio" NAME="sex" value="unknown">不明<BR>
ホームページがあればURLを入力してください<BR><INPUT TYPE="text" NAME="url" SIZE=40><BR>
コメントをどうぞ<BR><TEXTAREA NAME="comment" ROWS=4 COLS=40></TEXTAREA><BR><INPUT TYPE="submit" VALUE="送信"><INPUT TYPE="reset" VALUE="リセット"></FORM></BODY></HTML>176 INTERNET magazine 1996/3

図19：HTMLでフォームのあるページを作る

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Common Gateway Interface

CGI
COLS=m><OPTION VALUE="value">〜

ンはFORMタグ内のすべての入力フィー〜..

ルドを初期化するために使われる。

</TEXTAREA></SELECT>
これらのFORMタグを使って入力フォ

n行m列の領域のテキスト入力領域をポップアップメニューあるいはリストボームを作ったら、次はその入力フォーム

作 成 する。 < T E X T A R E A > とックスによる選択を表示する。SIZEパラの内容を解釈して、それをメールする</TEXTAREA>の間に文字列を書いてメーターがないときや、SIZEパラメータ

CGIプログラムを作る。

おくと、あらかじめその文字列が入力領

ーの値が0あるいは1のときはポップアッ

域に表示される。

プメニューが、それ以外のときはn行分のリストボックスが表示される。リスト

2 CGIプログラムを作る
メール送信のためのCGIプログラムは、・ラジオボタンとチェックボックスに表示される内容は<OPTION>に続け次の5つの部分に分けて考えることがで<INPUT type="checkbox"て書く。また、OPTIONのVALUEパラ

きる。

name="name" VALUE="value">

メーターには、その要素が選択されたときにCGIプログラムに渡す値を書く。ま

1 渡された内容をデコードする<INPUT type="radio"

た、SELECTにMULTIPLEパラメータ

2 渡された内容を分割する

name="name" VALUE="value">ーを書 くとリストが複 数 選 択 型 に、3 フォームに書かれた内容が正しいか

OPTIONにSELECTEDパラメーターをどうかをチェックする。間違っていラジオボタンやチェックボックスを表示
する。VALUEには、そのボタンがチェッ

書くと、対応する要素があらかじめ選択

たら再度入力を促すためのページを

される。

生成する
4 以上の情報を使ってメールを送信

クあるいはONになったときにCGIプログ
ラムに渡す値を指定する。また、パラメ

・ボタンーターにCHECKEDを指定しておけば、<INPUT TYPE="submit"VALUE=

あらかじめそのボタンをONにしておくこ"value">とができる。なお、ラジオボタンのとき

5 すべて終了したら、メールが送信されたことがわかるようなページを生成するは、同じグループに属するボタンのname<INPUT TYPE="reset"VALUE=

を同じ名前にすると、そのグループのう"value">

ち1つのボタンだけをonにすることができる。

する

まず、CGIプログラムに渡される内容は、前述のとおりエンコードされているそれぞれvalueという名前を持ったボので、それを元の状態に戻す必要がある。

タンを定義する。TYPE="submit"のボ

また、フォームの入力フィールドに入れ・リスト

タンが押 されると、 F O R M タグのられた値は、name=value&name=val-<SELECT NAME="name"SIZE=ACTIONで指定したCGIプログラムが実

ue&name=value....のように連続して格"n">行される。また、TYPE="reset"のボタ

納されているため、これを扱いやすい形

j http://www.goliath.org/makepage/makepage.html
図20：Make Your Own Home Page
フォームに入力した情報をもとにHTMLを自動的に作成してくれる

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/3

177Common Gateway Interface

CGI

図21：postmail.cgi
フォームの入力内容を自動的にメールするプログラム

式に変換しなければならない。
次に、入力された内容をチェックする。
たとえば、送信者のE-Mail欄が空欄だったときなどにはメールが送信されないよ
うにするためだ。このときはメール送信
ができなかった旨のHTMLをCGIプログ
ラムで生成すればよいだろう。
内容のチェックが済んだら、その内容をメールで送信する。プラットフォーム
がUNIXの場合はsendmailコマンドを使えばよいだろう。なお、sendmailコマン
ドについてはUNIXのmanなどで確認してみてほしい。なお、sendmailを使うときは、メールヘッダーをきちんと設定しないとメールが正常に送られないので注意しよう。
すべての処理が終わったら、正しくメールが送信されたことを伝えるためのHTMLをCGIプログラムで生成しておく。
以上の処理を実現するコードが図21のpostmail.cgiだ。なお、ここではPerlを使ったが、その他の言語でも同様のことが実現可能だ。

j http://www.worldwidemart.com/scripts/
図22：CGIのスクリプト集

178 INTERNET magazine 1996/3#!/usr/local/bin/perl## postmail.cgi : sending mail from www Version 0.1/Beta#$user = "foo@bar.or.jp';#ここに受取人のアドレスを書く$subject = 'subject';#メールのサブジェクトを書く## REQUEST_METHODをチェックして値を$bufferに格納する#
if ($ENV{'REQUEST_METHOD'} eq 'POST') {read(STDIN,&buffer,$ENV{'CONTENT_LENGTH'});} else {$buffer = $ENV{'QUERY_STRING'};}## フォームに入力された値をデコード/分解する#@pairs = split(/&/,$buffer);
foreach $pair(@pairs) {($name,$value) = split(/=/,$pair);$value =~ tr/+/ /;$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1)/eg;$FORM{$name} = $value;}## フォームに入力された内容をチェック#
if (FORM{'email'} eq "" || FORM{'name'}) {print "Content-type: text/html\n\n";print "<TITLE>ERROR</TITLE>\n";print "<H1>メールアドレスと本名を入力してください</H1>";
exit (0);}## メールを送信する#
if (open(ML,"| /usr/lib/sendmail $user")) {print ML "From: $FORM{'email'} ($FORM{'name'})\n";print ML "Subject: $subject\n";print ML "X-Mailer: postmail.cgi ver.0.1/Beta\n";print ML "X-URL: $FORM{'url'}\n";print ML "\n";print ML"--------------------------------------------------------------\n";print ML "$FORM{'sex'}\n";print ML"--------------------------------------------------------------\n";print ML "$FORM{'comment'}";print ML"\n------------------------------------------------------------\n";print ML "Remote host: $ENV{'REMOTE_HOST'}\n";print ML "User Agent : $ENV{'HTTP_USER_AGENT'}\n";close(ML);print "Content-type: text/html\n\n";print "<TITLE>Request Accepted</TITLE>\n";print "<H1>メールは正常に送信されました</H1>\n";} else {print "Content-type: text/html\n\n";print "<TITLE>Request Rejected</TITLE>\n";print "<H1>メールは正常に送信されませんでした</H1>\n";}exit(0);インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D［インターネットマガジン バックナンバーアーカイブ］ ご利用上の注意
この PDF ファイルは、株式会社インプレス R&D（株式会社インプレスから分割）が 1994 年～2006 年まで発行した月刊誌『インターネットマガジン』の誌面を PDF 化し、「インターネットマガジン バックナンバー
アーカイブ」として以下のウェブサイト「All-in-One INTERNET magazine 2.0」で公開しているものです。

http://i.impressRD.jp/bn
このファイルをご利用いただくにあたり、下記の注意事項を必ずお読みください。
z 記載されている内容（技術解説、URL、団体・企業名、商品名、価格、プレゼント募集、アンケートなど）は発行当時のものです。
z 収録されている内容は著作権法上の保護を受けています。著作権はそれぞれの記事の著作者（執筆者、写真の撮影者、イラストの作成者、編集部など）が保持しています。
z 著作者から許諾が得られなかった著作物は収録されていない場合があります。
z このファイルやその内容を改変したり、商用を目的として再利用することはできません。あくまで個人や企業の非商用利用での閲覧、複製、送信に限られます。
z 収録されている内容を何らかの媒体に引用としてご利用する際は、出典として媒体名および月号、該当ページ
番号、発行元（株式会社インプレス R&D）、コピーライトなどの情報をご明記ください。
z オリジナルの雑誌の発行時点では、株式会社インプレス R&D（当時は株式会社インプレス）と著作権者は内容が正確なものであるように最大限に努めましたが、すべての情報が完全に正確であることは保証できません。このファイルの内容に起因する直接的および間接的な損害に対して、一切の責任を負いません。お客様個人の責任においてご利用ください。

このファイルに関するお問い合わせ先
All-in-One INTERNET magazine 編集部
im-info@impress.co.jp
Copyright © 1994-2007 Impress R&D, an Impress Group company. All rights reserved.