Perl/CGIによるプログラミングに関する世界観です。Perlも参照のこと。
CGIとは、Webサーバーのサーバーサイド処理としてPerlスクリプト(CGIスクリプト)を実行し、そのCGIスクリプトが吐き出した結果をWebブラウザに表示させる仕組み。
Webサイトを動的に作るのに使える。たとえば、たくさんの人が同じWebサイトにアクセスして、トピックごとにコメントを残して指定のコメントを表示させる「メッセージ掲示板」や、たくさんの人間がリアルタイムに最新のメッセージを投稿し表示し合う「チャット」のようなものを作ることができる。
こうしたWebサービスにはたくさんの人が同時にアクセスし、みんなでメッセージを共有するため、「楽しい」という一面があるが、不特定多数がその掲示板を利用するため、「犯罪のような書き込み」をされることもあり、運営者には正しい管理が求められる。
最近ではCGIに代わる技術としてPHPやJavaサーブレットなどの技術があり、またRubyやPythonなどの動的な言語で「Webフレームワーク」と呼ばれるシステムを使うことで、簡単にSNSのような高度なWebサービスを構築できるが、Perl/CGIはこうした技術の草分け的な存在であり、「Webサーバーの下でPerlスクリプトが動く」という技術は画期的で大流行した。その基本を知るためにCGIを勉強することは無駄ではない。逆に、PHPなどに対する理解が深まるだろう。僕も、最初に遊んだネットゲームは、Perl/CGIで書かれたブラウザゲーム(HTMLとボタンだけのシンプルなキャラクター育成・対戦ゲーム)だった。
CGIも参照のこと。
Perlのテキスト編集機能は強力。正規表現が使えるほか、ヒアドキュメントを使うこともできる。
そんなPerlの強力な文字処理能力で、HTMLのタグやページも出力してやろう、というのがPerl/CGIの技術である。
実際のところ、HTMLではボタンやテキストボックスすら、ページの一部としてHTMLで書かれる。このため、Perl/CGIを使うことで、そうしたページそのものをPerlのprint()関数で出力し、ページを自動で整形し、別に存在するデータを読み書きすることで、「リアルタイムに自動で作成する」ことができる。
同時に、GETやPOSTを用いることで、ユーザーからの投稿を取得し、そうしたデータを出力して保存できる。
Perl/CGIにはプロセスをその都度作成するためプロセスの作成・破棄のオーバーヘッドの問題があり、PHPなどのさらに高度な技術も存在する。どうしてもPerlで書きたい場合は、FastCGIと呼ばれる新しい技術がある。
Perlをサーバーサイドで実行し、HTMLを吐き出してホームページを動的に表示できる。
掲示板開発を参照のこと。
Perl/CGIでは、rand()関数や変数を使うことで簡単に育成・バトルのようなゲームを作れますが、外部のファイルを全く使わずにゲームを作ってしまうと、実行するたびにキャラクターのステータスが初期値に戻ってしまいます。
こういう時は、データファイルを使って、外部の設定・データファイルに「その時の状態」を書き出すことで、連続したゲームプログラムを実現できます。
こういう時、便利なのが、文字列を分割するsplit()関数と、文字列を連結するjoin()関数です。これらを上手く使うことで、簡単にデータ形式を実現することができます。
たとえば、:で区切られたファイルを読み込むには、
$player = 'Assy'; @id = (1, 2, 3, 4); @name = ('a', 'b', 'c', 'd'); @hp = (0, 0, 0, 0); @atk = (0, 0, 0, 0); @money = (0, 0, 0, 0); open(FILE, "${player}.txt") or die "$!"; $i = 0; foreach $line (<FILE>) { chomp($line); ($id[i], $name[i], $hp[i] $atk[i], $money[i]) = split(/:/, $line); $i++; } close(FILE); @character1 = ($id[0], $name[0], $hp[0], $atk[0], $money[0]); @character2 = ($id[1], $name[1], $hp[1], $atk[1], $money[1]); @character3 = ($id[2], $name[2], $hp[2], $atk[2], $money[2]); @character4 = ($id[3], $name[3], $hp[3], $atk[3], $money[3]);
とし、逆にファイルに書き出すには、
open(NEWFILE, "> ${player}.txt") or die "$!"; print NEWFILE join(':', @character1), "\n"; print NEWFILE join(':', @character2), "\n"; print NEWFILE join(':', @character3), "\n"; print NEWFILE join(':', @character4), "\n"; close(FILE);
のようにします。いささかデータ構造の設計上の問題は見受けられますが、@idや@nameは読み書きの時に一時的に格納する変数として使用し、通常は@character1などを通じてデータを操作します。
UNIXシステム管理(ユーザーとパーミッション)も参照のこと。
CGIを作った時、文字コードをきちんと指定しないと出力されたHTMLの日本語部分が文字化けしてしまう。ソースファイルを記述した環境やエディタの設定に合わせて、「charset=Shift_JIS」や「charset=utf-8」を指定すること。HTMLの指示でも<meta charset="utf-8">の部分を適切に設定すること。
また、Perl処理系のパスは、#!/usr/local/bin/perl(ソースからインストールした場合)や#!/usr/bin/perl(パッケージ管理システムからインストールした場合)を適切に設定すること。
LinuxなどのUNIX互換OSにおけるサーバーでは、パーミッション(読み込み・書き込み・実行の権限)を設定する仕組みになっていて、Perl/CGIで実行スクリプトを作っても、パーミッションが適切に設定されていないと実行できない(実行のための権限が必要)。
パーミッションの意味は、数値は読み込みを4、書き込みを2、実行を1として、これらを足した数値で権限を指定する。0の場合は何もできない。左からオーナー(所有者)、グループ(ファイルが属しているグループ)、その他(オーナー・グループ以外)を意味している。
パーミッション | 説明 |
---|---|
644 | 実行されず読み取りだけを行うファイル |
755 | 実行可能属性を付ける場合 |
666 | CGIスクリプトから書き換えられるファイル(データファイルなど) |
所有者も間違って書き換えられないようにするために444や555を設定したり、自分しか読めないようにする場合は600を設定したり、グループの権限を無くして604を設定したりすることもできる。
ディレクトリについては基本的に755を設定する。
(Perlで作るCGI入門 基礎編―生きたホームページを作るために (SOFTBANK BOOKS)を参考に執筆しました。)
Linuxマシンにじかにログインして変える場合や、SSH(リモートログインソフト)でリモートログインして変える場合は、以下のようにchmod(パーミッションの設定コマンド)でパーミッションに755を指定する。また、.htaccessファイルやHTMLファイル、画像ファイルなどは、644に設定する。
$ chmod 755 hoge.cgi $ chmod 644 hoge_image.gif
(Perlで作るCGI入門 基礎編―生きたホームページを作るために (SOFTBANK BOOKS)を参考に執筆しました。)
FTPクライアント(ファイル転送ソフト)でファイルを転送する場合は、UNIXコマンドが使えない代わり、FTPクライアントでファイルの属性を設定する。
WinSCPでは、「オプション→環境設定」を開いて、「転送」から「デフォルト」を選択して「編集」をクリックし、「アップロード時の設定」から「パーミッションの設定」にチェックを入れることで、ファイル転送全体のデフォルトのパーミッションの設定ができる。また、個別のファイルのパーミッションの設定は「ファイル→プロパティ」から行える(右クリック→プロパティでも良い)。全体を644、CGIスクリプトだけを755とするのが良いだろう。
WinSCPも参照のこと。
サーバーに公開したCGIについては、./をつけてスクリプト名を実行する(PATHに含まれていなくても、相対パスで./hoge.cgiとすれば今居るディレクトリの中にあるスクリプトを実行出来る)ことで、単独テストを行うことができる。
$ ./hoge.cgi (HTMLの出力)
HTMLの出力が画面に表示されれば成功。
(Perlで作るCGI入門 基礎編―生きたホームページを作るために (SOFTBANK BOOKS)を参考に執筆しました。)
CGIを作るためには、cgi-lib.plやCGI.pmなどの便利なモジュールを使うことができる。以下のリンク先に、cgi-lib.plを用いたCGIプログラムのサンプルがある。
Perl/CGIがPHPなどに置き換わった理由として、リクエストのたびにプロセスを作成・破棄するCGIの仕組みは、Apacheの内部スレッドを使うPHPやJavaサーブレットに比べて非効率的だから、という理由が挙げられる。
このため、常にメモリに常駐してCGIの処理を行うFastCGIという仕組みがあり、PerlやPHPから使うことができる。
FastCGIを参照のこと。
Catalystを参照のこと。
Mojoliciousを参照のこと。
昔から、インターネットには、Perl/CGIやPHPで作られたスクリプトを無償で配布しているサイトがたくさんあります。
最近は、CMSやWordPressのプラグインなどのようなものもあり、簡単に高度な掲示板やSNSを自分のサーバーに配置することができるようになっています。
Perl/CGIによるスクリプトを無料で配布されています。
僕の好きだったCGIのブラウザゲームであるFF BATTLEは、Perlで作られています。
僕が好きだったのは次のサイトです。
このサイトのゲームはかなり書き換えられていますが、オリジナルのスクリプトがどこかで配布されていると思います。今見た感じでは、どこが元々の配布者のサイトなのかは分かりませんでした。既に今は閉鎖されているのかもしれないです。
Perlではありませんが、昔僕が好きだった2ちゃんねる専用ブラウザはオープンソースで作られているものがあるので、参考にされても良いでしょう。p2はPHP、twintailはC#、ギコナビやOpenJaneはDelphiで作られています。
昔の僕は、そういう風に、オープンソースのソフトウェアに憧れて、どうにかして自分の手で改造出来ないか、と思ったところからプログラミングを志す夢が始まりました。実際、OpenJaneやtwintailは適当な機能をつけて改造していました。また、ブラウザゲームは簡単な戦闘場面のようなものをCGIで作っていたことがあります。
テレビゲームも参照のこと。
ネットには、Perl/CGIやPHPで作られたフリーなスクリプトを配布しているサイトがたくさんあります。たとえば掲示板であれば、「CGI スクリプト 掲示板」などで検索してください。
チャットや簡単な掲示板スクリプトのほか、2ちゃんねる型のスレッドフロート型掲示板や、後述するFF BATTLEなどのブラウザゲームスクリプトなど、さまざまなスクリプトが配布されています。
これらのスクリプトの設置を行うには、レンタルサーバーを契約してアップロードを行います。このためには、Apacheの設定や、UNIXのパーミッションの基本知識、それから文字コードの適切な設定についての知識が必要です。必要に応じて、FFFTPやWinSCPのようなFTPファイル転送クライアントソフトウェアをインストールしましょう。テキストエディタも、Unicodeが扱えて、シンタックスハイライト(PerlやPHPの文法に応じてキーワード色分けをしてくれる機能)があるものをインストールしましょう。初心者におすすめなのはサクラエディタです。EmacsライクなxyzzyやAtomのような最先端のエディタもおすすめです。
実際にWebアプリケーションを運営するためには、常にリクエストに対してサービスを返すサーバーマシンを用意しなければなりませんが、無料ホームページスペースでは、HTMLだけをサポートしていて、Perl/CGIやPHPは使えないことが多いです。また、容量も決まっていて、大規模な掲示板は運営できません。この場合、自宅サーバを作ることもできますが、スキルと管理コストが必要ですし、セキュリティやネットワーク負荷の問題もあり、現実的ではありません。思い切って、月1000円ぐらいのレンタルサーバーを購入しましょう。この時、PerlやPHPだけではなく、SQLデータベースも使えるサーバーを選択すると、WordPressのような高度なシステムを使うことができます。掲示板だけではなく、MediaWikiのようなWikiシステムを利用したい場合も、PHP/SQLが使えれば動かせることが多いです。
ただし、不特定多数の利用する掲示板を運営する上で必要なのは、名誉棄損や誹謗中傷のような書き込みがあった時に、それを削除しなければならない、ということです。2ちゃんねるでは、運営者の西村ひろゆき氏が、裁判所に通いづめになるほどに、悪いことをたくさん書かれます。犯罪予告やストーカー行為、ハッキングや著作権違反のほう助のような罪もあります。それを覚悟して管理しなければなりません。
掲示板を運営したいのであれば、スクリプトをダウンロードしてサーバーにアップロードしなくても、したらばBBSのような「レンタル掲示板サイト」を利用することもできます。ホームページをレンタルするように、自分の掲示板サイトをレンタルして運営することができます。これは、個人のホームページのような場合では、手軽なため良いでしょう。
CGIによる掲示板を運営する上で僕が言えることは、古い書き込み全てを保持するよりも、何か月も前の書き込みは自動的に削除されていくような仕組みを作ることです。それによって、良い内容も悪い内容も自動的に消えていってくれます。また、SNSのように、アカウント制にして、悪いアカウントは凍結できる仕組みを作ることで、犯罪予告のような悪い書き込みの防止に繋がるかもしれません。Facebookは実名制を採用していますが、これは特に良い方法であると同時に、個人情報を集めすぎて逆に批判されるリスクもあります。Wikipediaのように不特定多数の特定の書き込みは最初からIPアドレスを表示するようにするというやり方もアリ。
昔は、Web上の掲示板やチャットなど、ほとんどのCGIプログラムがPerlで書かれており、CGIと言えばPerl、Webアプリケーションと言えばPerlだった。PHPやRubyのような後続の言語が現れて、JavaやC#なども使うようになって、状況は変わってきたが、当時のPHPやRubyは多くがPerlをとても参考にした言語だった。
Perl/CGIを今でも使っているサイトは多い。Perlはスクリプトとして簡単にHTMLを吐くことができるし、C/C++よりも簡単で、コンパイルも必要ない。Apache 1系列とPerlは昔から事実上の標準だった。Webフレームワークがたくさん出て、もう昔の話となりつつあるが、それでも基本的な部分はPerlと変わっていない。
WebサービスやWebフレームワークも参照のこと。
CGI
書籍