タグ: CGI

  • [CGI]わかりやすさを目指して

    [CGI]わかりやすさを目指して

     カミュプリィの『西暦・年齢・和暦・干支対照表』CGIを書くときに気を付けたところは「コードのわかりやすさ」です。

    どのようにわかりやすくしたか?

     CGIはHTMLの内容を出力するプログラムです。表示された『西暦・年齢・和暦・干支対照表』でマウス右ボタンをクリックして「ページのソースを表示」で表示されたものを出力する処理をおこなっています。

     それならCGIが出力するHTMLの内容をそのままファイルに保存しておくのが、もっとも全体がわかりやすくなるとおもい、ざっくり次の内容でテキストファイルを保存しました。

    <!doctype html>
    <html dir="ltr" lang="ja" prefix="og: https://ogp.me/ns#" >
    <head>
    	<meta charset="utf-8">
    	<title>西暦・年齢・和暦・干支対照表</title>
    </head>
    <body>
    	<table>
    		<caption>西暦・年齢・和暦・干支対照表</caption>
    		<thead>
    			<tr>
    				<th>西暦</th>
    				<th>年齢</th>
    /* HEADER CREATE */
    				<th ID="ETO">干支</th>
    			</tr>
    		</thead>
    		<tbody>
    /* TABLE CREATE */
    		</tbody>
    	</table>
    <div class="indent">
    </div>
    </body>
    <footer>
    /* COPYRIGHT CREATE */
    </footer>
    </html>

     『/* HEADER CREATE */』『/* TABLE CREATE */』『/* COPYRIGHT CREATE */』部分のHTMLが足りていませんので、干支や和暦の情報をもとにCGIが補います。CGIには静的なHTMLが一切含まれないことで、読みやすくなっています。

    甲子 (きのえね)
    乙丑 (きのとのうし)
    丙寅 (ひのえとら)
     ・・・
    2019/05/01,令和
    1989/01/08,平成
    1926/12/25,昭和
     ・・・

     このCGIはPythonで作成しましたが、他の言語でも同様の工夫はできるのではないかとおもいます。

  • [CGI]サーバーをいたわってキャッシュを付けました

    [CGI]サーバーをいたわってキャッシュを付けました

     ユーザーのブラウザーから要求がある度にCGIを動かしていたらサーバーの生産性が低いです。特にカミュプリィの『西暦・年齢・和暦・干支対照表』CGIは1年に1回更新すればよい表ですので、要求の度にCGIを動かしていたら、、、うん、無駄よね。

    CGIの対応

     CGIですので実行結果は標準出力へHTMLの内容を出します。また、HTMLの内容をそのままキャッシュファイルにも書き出します。こうしてCGIを動かす度にキャッシュファイルが更新されるようにしました。

    HTTPサーバーの対応

     CGIを置いたディレクトリに「.htaccess」設定ファイルを作成します。URLの指定がディレクトリ止まりであれば、キュッシュファイルを優先して開くようにしました。
     次の例では「まるまる.html」キュッシュファイルが優先で、Pythonで書いた「まるまる.cgi」CGIが劣後になりましす。

    DirectoryIndex まるまる.html まるまる.cgi

     これで、普段はCGIを置いたディレクトリを呼び出すと、「まるまる.html」キャッシュファイルがクライアントに渡されます。
     キャッシュファイルがないときは「まるまる.cgi」CGIが呼び出されます。キャッシュファイルがないのは最初だけなので、ディレクトリを呼び出してCGIを実行するのは最初の1回だけですね、この設定は不要かもしれません。

    OSの対応

     タイマーで定期的にプログラムを開始できるクーロン(cron)で、毎年1月1日に「まるまる.cgi」CGIを呼び出します。

    管理者の対応

     年号が変わったときは、年号ファイルの設定を変更してから、CGIのファイル名を含めたURL「https://www.commuply.co.jp/tools/wareki/まるまる.cgi」をブラウザーから呼び出します。
     CGIのプログラム内容を変更したときもCGIのファイル名を含めたURLをブラウザーから呼びます。

  • [Python]拡張子.pyのままCGIとして動かす方法

    .htaccessファイルに次の行を追記します。

    AddHandler cgi-script .py

  • [Python]CGIが外部ファイルを指定するときのパスの書き方

    CGIはサーバ上で動かすものなので、http のパスではなく、FTPでアクセスするときのパスで書きます。

  • [Python]文字コードや改行コード

    StarServerに配置するPythonのCGIは、文字コードUTF-8、改行コードLFにしないと動きませんでした。

  • [Python]このプログラムのパス

     CGIとして呼ばれるPythonプログラムをつくって、Cronからも呼び出すようにしました。
    Pythonプログラムから、プログラムと同じディレクトリにある別のファイルにアクセスするようにしました。この実行中のプログラムファイルの絶対パスを取得しようと試行錯誤したのですが、結果はダメでした。仕方なくプログラムの絶対パスを定数としてプログラムに埋め込みました

     カレントディレクトリを取得する方法は次のようなものですが、CGIから呼び出されるときはプログラムのあるディレクトリと同じでした。Cronから呼び出すとプログラムとは異なるディレクトリになりました。

    import os
    カレントディレクトリ = os.getcwd()

    または

    import os
    カレントディレクトリ = os.path.abspath('./')