LoginSignup
3
0

More than 3 years have passed since last update.

C言語 と Dart で CGI : はじめに (1)

Last updated at Posted at 2020-07-25

C言語 と Dart で CGI

昨今は動的なホームページを作成する場合には、「VPS で Linux インスタンスを立ち上げたり」、「Serverless の フレームワークを利用してコンテンツを配信したり」、「K8Sなどを利用してContainer に落としたり」するのが最近のトレンドだと思います。

が、つい最近まで、レンタルサーバーを借りてCGIを利用して動的コンテンツを配信するのが一般的でした。
この、CGIについて解説して行きます。

C言語とDart言語からCGIを利用

また、CGIと言えば、Perl や PHP などが、良く使われますが、
ここでは、C言語とDart言語を対象とします。

Dart言語 で CGI に利用した話が、DuckDuckGoしてもGoogleしても皆無だったからです。
※ 訂正: C言語はあります!! Dartが皆無

もちろん、皆無だった理由はクラシックな技術で、
今後、利用される事もなかったからでしょう

CGIはシンプルで容易

2004-2006年くらいでしょうか? PHP が 広まり、多くのサービスがCGIで作られました。
非エンジニアの人も多く。そんな非エンジニアの方々でも
全体像を把握出来、お金を稼ぐようなサービスが作られて行きました。

昨今の、React Vue Flutter や Firebase た Lambda など Serverless と比較して
習得が容易だったからだと考えています。

CGI とは

CGIは、Common Gateway Interface の略です。
https://en.wikipedia.org/wiki/Common_Gateway_Interface
https://tools.ietf.org/html/rfc3875

特にサーバーと外部のプログラムの間での、やりとり方法を決めたものです。
今時のInterface と違い 超シンプルです。

サーバーからアプリを起動して、実行結果をもらう

CGIでは、サーバーからパラメータを指定してアプリを起動します。
そのアプリが出力する標準出力をを返り値としてもらう。

具体的に見てみましょう。

Hello,World!! と表示するアプリ

hello.c
// hello.c
// gcc hello.c -o hello.cgi
#include<stdio.h>

int main(int argc, char* argv[]) {
    printf("Content-type: text/html\n\n");
    printf("Hello,World!!\n");
    return 0;
}

という、hello.cgi という名前のアプリがあるとします。
このアプリは、./hello.cgi とコマンドを入力すると、
"""
Content-type: text/html

Hello,World!!
"""
と、コンソールにも文字列を表示するだけのアプリです。

Hello,World!! と表示するページになる

ブラウザーから、 "http://example.com/hello.cgi" を呼び出すと、
"Hello,World!!" とブラウザーに表示されます。

このように、サーバーからアプリを呼び出して
アプリからの出力をユーザーに返すという事がCGIでは出来ます

実際に動かしてみよう

Docker 環境を用意しました。
細かな設定とかはDockerファイルを参照してください!!

Container を起動

$ git clone https://github.com/kyorohiro/dartlang_cgi.git
$ cd ./dartlang_cgi/001
$ docker-compose build
$ docker-compose up -d

VSCodeを起動

ブラウザーでDocker Container の 中の VSCode を開く
http://127.0.0.1:8443
※ 127.0.0.1 は Dockerの環境依存です。

vscode の中で、Apacheサーバーの立ち上げ

$ apache2

cgiをビルド

$ cd /app/www/cgi
$ gcc hello.c -o hello.cgi
$ dart2native hello_dart.dart -o hello_daet.cgi

動作確認

http://127.0.0.1:8080/ を開くと、 ./app/www/index.html が表示されます

http://127.0.0.1:8080/cgi-bin/hello.cgi を開くと。./app/cgi/hello.cgi の実行結果が返ります

http://127.0.0.1:8080/cgi-bin/hello_dart.cgi を開くと、 ./app/cgi/hello_dart.cgi の実行結果が返ります

補足

Dart は dart2native を利用する事で、Nativeにコンパイル出来ます。
今回はそれを使用しています。

main(List<String> args) {
  print("Content-type: text/html\n\n");
  print("Hello,World From Dart!!\n");
  return 0;
}

コード

次回

GET や POST や Cookie や
DB を扱ってみます。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0