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で作るというすみ分けができるかもね。