Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

2019年はPerlはCGIの欠点を克服できるのか

2019年という年を迎えて、僕がCGIについて考えていることを書き出してみる。

CGIの何が終わった技術で、何が終わっていない技術なのか。

僕も深く考えることはなかったのだけれど、Giblogというツールを作っているときに、どうしてもユーザーとの接点としてメールフォームが必要だなぁと感じたのが事のはじめ。

メールフォームを作るとなると、どうやって作ろうか。CGI? んっ、シングルページなんとかというのも聞いたことがあるけど。それでできるのか。など。

CGIには、二つの大きな利点があると感じる部分がある。

ファイルを配置するだけで動く

CGIは、レンタルサーバーにファイルを配置するだけで動く。シェバンとか、改行コードとか、Webサーバーと密結合になるとか、いろいろな問題はあるんだけれど、これを差し引くと、レンタルサーバーにファイルを置くだけで動く。

ポイっと、そこにファイルを置いてあげれば、動く。これは、環境構築を自分でする必要がないから、ちょっと動的なWebサイトを作るために、プログラムを動かしたいときには楽だ。

クロスドメイン制約のことを考えなくていい

静的ファイルオンリーのアプリケーションだと、どうしても、クロスドメイン制約のことについて考えないといけない。

僕は、セキュリティの専門家じゃないので、その分野に詳しい人に、ちょっと教えてもらったりした。

なんとなくわかるんだけど、どこでセキュリティのリスクがでてくるのかということが、実用のアプリケーションを作ろうとしたときに、はっきりしないなぁと感じた。

サーバー側の制約じゃなくって、ブラウザ側の制約なんだけど、頭の中がこんがらがっちゃって。

CGIだと、クロスドメイン制約のことを考えなくていい。ブラウザがWebAPIを投げるんじゃなくって、サーバー側で、WebAPIを投げることができるから。

ブラウザ側の制約について、考えなくっていいというのは、楽だ。

二つの利点があるんだけど、Perlで書くCGIには、たくさんの欠点がある。これから、それを列挙する。

たくさんの欠点の中で、2019年に存在する手法で、解決できるものは、どれくらいあるか。それも書く。

ちなみに、PHPはこの欠点をうまく解決してくれて、初めてWebアプリを作る人が、こういうことに悩まなくってよい。

パーミッションの設定が必要

CGIをアップロードするときは、パーミッションを設定しないといけない。

これは、Windows環境で、試験をして、FTPでアップロードすることを、念頭に置いているよ。

Windowsにはパーミッションなんてものはないので、Unix/Linuxのサーバーにアップロードしてから、パーミッションを「0755」に設定。実行権限つける。

これが、辛いんだ。忘れていたら「Internal Server Error」「ううっ」って感じ。

PHPには、この問題はなくって、.phpで始まるファイルをPHPのファイルだとみなして、実行してくれる。

2019年 Perl/CGIで解決する方法があるだろうか。

あるといえばある、それは、gitは、パーミッションを保存してくれるということだ!

Windowsのことを、忘れて、Linux環境で、パーミッションを設定しておいて、ユーザーには、FTPではなくって、gitでファイルを配置してもらう。

git clone サイトのリポジトリ

こうすれば、最初のパーミッション設定問題を回避できそうだ。

改行コードの問題

CGIには、改行コードの問題がある。Windowsでは「CRLF」なのに、Linuxでは「LF」というやつ。

Windows環境で、開発をして、FTPでアップロードするときに

「CGIファイルをアップロードするときは、テキストモードでアップロードするようにしてください」

って、説明が書いてある。こんなこと意識するのはめんどくさいよー。

間違っていたら「Internal Server Error」「ひー」って感じ。

PHPには、この問題はなくって、どんな改行コードでも、PHPのプログラムとして実行してくれる。

2019年 Perl/CGIで解決する方法があるだろうか。

あるといえばある、それは、gitは、改行コードを保存してくれるということだ!

gitは、ファイルをバイナリで維持するので、改行コードの違いということを意識しなくっていい。

最初から、CGIのファイルの改行コードをLFにしておけばよいというわけだ。

レンタルサーバーでも、SSHでコマンドラインに接続すれば、gitのインストールは簡単。

gitをインストールしてもらって、gitで配置する。FTPではなくって。

シェバンの問題

シェバンというのは、プログラムの一行目に書いてるアレのことです。

#!/usr/bin/perl

みたいなの。

これは、WindowsサーバーとLinuxサーバーでは、ファイルの区切り文字が違ったりして、面倒なのね。

PHPには、この問題はなくって、シェバンなんて書かなくってもいい。ファイルを読み込んでPHPプログラムとして実行してくれるから。

2019年 Perl/CGIで解決する方法があるだろうか。

それは、Linux/Unixだけを、想定するということ。

Linux/Unixに限定すれば、

#!/usr/bin/env perl

と書いておけば、100%動く。

パフォーマンスが遅い問題

CGIのパフォーマンスが遅い問題。

これは、解決できませーん。毎回プロセスを立ち上げるというCGI特有の問題がある。

軽減するとしたら、使うライブラリを極限まで減らすということだ。

開発環境が簡単に構築できない問題

CGI開発の最も辛い部分は、Webサーバーと密結合しているので、開発環境を作るのが辛いという問題だ。

そこで、僕は、考えました。

そうだ、試験できる部分だけに分離しようと。MVC。MVC。

CGIへは、HTMLから、JavaScriptでAJAXを使って、POSTリクエストで、JSONを送るようにしたら、デザインとデータを分離できる。

ローカル環境でのでの試験は、JSONの入力と、JSONの出力を比較するだけだ。

(でもこれで、ファイルアップロードは、できるのかしら。それは、ちょっと調査中。)

こうすれば、CGIのライブラリもいらないし、起動速度も速いし、いいかも。JSONのパーサーだけあれば、OKみたいな。

2019年は、CGIの欠点を改善できる方法が存在するようになった

結論を言うと、2019年は、CGIの欠点を改善できる方法が存在するようになった。

ダントツでWebアプリを、PHPが作りやすいということはあるけれど、Perl/CGIで、ひどく作りにくいという状況も変わったという感じだ。

セッションが必要になるような大きなWebアプリケーションは「Mojolicious」「Amon2」「Plack/PSGI」「Starman」などで構成して、小さなパーツは、CGIで作るというすみ分けができるかもね。

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。