Beginner's Rock Official Website

犬土偶日記

海の近くに住みたい

BR日記の使い方

話題:Webプログラミングとか

2019年06月29日

DebugサイトのCGI修正作業

公開日時: 2019年06月29日 21時12分22秒

DebugのWebサイト用のライブラリのヘッダを出力するサブルーチンに問題があつて數字選擇式寶籤の亂數生成器が一時動かなくなつた件を適當に對處して放置してゐる。これを根本的に解決した方が良い。まづどうなつてゐるか自分で正確に把握しておく必要がある。

ヘッダ出力サブルーチンは2つある。HTML4用とHTML5用。そして、それぞれに2種類の出力がある。ヘッダ出力サブルーチンを呼び出すCGIがどの階層にあるか等によつて分かれる。サイト上部のナビゲーションのリンクが相對パスになつてゐるからだ。httpsから始まるフルパスではなく、現ディレクトリからの相對的なパス。フルパスだとPC内でまともに機能しなくなるし、もしサーバーを移轉するとかURLが變るとかいふことになると全ページ修正が必要になつて大變だからだ。例へば/debug/bbs/bbs.cgiのページにあるナビゲーションのNewsのリンクは../news.htmになつてゐる。1個上の階層といふこと。/debug/index.htmlのページのNewsのリンク先は./news.htmになつてゐる。同じ階層といふこと。つまりページによつてリンク先の階層を變へる必要がある。ディレクトリの深さは基本的にこの2種類でサイト設計してゐる。/debug/のところに通常ページ、CGIは/debug/各CGI/といふやうに1個下の階層に。

ここまでの文章で出て來たヘッダといふのはサイトのヘッダといふ意味で、!DOCTYPE、html開始タグ、head要素、body開始タグ、h1要素、ナビゲーションリンク、など、ページの上部のほぼ全ページ共通の部分のこと。これを出力するためのサブルーチンだ。サイトナビゲーションの部分で各リンクの深さで2種類に分かれる。問題はここからで、さらにこれをどこに出力するかでまた2つに分かれることになる。通常のCGIではリクエストのたびに各CGIでの處理結果を畫面に出力することになる。所謂標準出力といふやつ。この畫面に出力する際には、HTTPヘッダといふものが必ず必要になる。これまでの文章で出てきたヘッダとは別のヘッダ。Content-Typeが最低限必要で、他は任意に色々。これを出力しないCGIはサーバーエラーになる。亂數生成CGIが一時的にをかしくなつてゐたのはこれを出力してゐなかつたから。畫面に出力する場合以外に、ファイルに出力することがある。HTMLファイルに直截書き出すといふやうな場合。これはファイルを作成するのでHTTPヘッダは出力しなくて良い。逆に出力してしまふと、DOCTYPE宣言よりも前に通常のテキストとしてContent-Type: text/html; charset=UTF-8とか書き込まれてしまつてそのページにアクセスすると無殘に畫面最上部にそのまま表示されてしまふことになる。メンバーのプロフィールページを作るCGIプログラムではこの方式でHTMLを作成してゐる。

少し前にプロフィールのCGIを弄つた時にHTMLファイルにHTTPヘッダが出力されてしまふ不具合があつた。HTML4版は大丈夫だつたんだが、HTML5版ではダメだつた。そこでHTTPヘッダを出力しないやうに修正したのだが、それで逆に通常のCGIでHTTPヘッダが出力されなくなる不具合が生じてしまつた。日記CGI等ではエラーが出なかつたが、亂數生成CGIだけエラーが出たのは何故か。HTTPヘッダを出力するかどうかの判定にディレクトリの深さといふ條件を使つたからだ。通常はCGIは1個深い階層に置く。何故かといふと、大抵はCGIプログラム本體だけでなくデータファイルやら何やら複數のファイルを扱ふので、1つのディレクトリにまとめた方がスッキリするからだ。最上位ディレクトリに何でもかんでも詰め込むと何が何だか分からなくなるし、ファイル名が被つたりする危險もある。だから基本的に日記は日記、BBSはBBSでそれぞれまとめておくことになる。だが亂數生成CGIはCGIプログラム本體1つだけで完結するのでそれ用のディレクトリを作つても中身は1つといふことになる。そのためにURLが少し長くなるのも嫌だ。/debug/loto/loto.cgiみたいに。だから/debug/にそのまま置いた。CGIで生成されるHTMLファイルは日記のメンバー選擇ページと各メンバーのプロフィールだけのはず。どれも/debug/の階層にある。上位階層ならHTTPヘッダ不要といふ處理で良いだらうと適當に考へたのがダメだつた。亂數生成CGIもその階層にあつたことを完全に忘れてゐた。ちなみに、日記のメンバー選擇ページ(diary.htm)を何故CGIで書き出してゐるかといふと、ページを見て分かるやうにメンバーごとに輕い紹介文があつて、それを各メンバーが自分で書いて更新できるやうになつてゐるからだ。

といふわけで、どうしようかと。階層の深さで判定するのではなく、何かの引數を渡してフラグで分岐した方が良いのは間違ひ無いが、複數のプログラムを修正する必要が出て來る。基本的にはHTTPヘッダを出力する。ファイルに書き出すのは例外的だ。だからファイルに書き出すプロフィールと日記の選擇ページを作る2つのCGIとライブラリ、計3つの修正でOKだらう。でもそれが面倒で適當に亂數生成CGIの方を修正するといふのに逃げて放置したのが今の状況。サイトのヘッダを出力するサブルーチンを呼び出す直前の部分にライブラリに頼らず自力でHTTPヘッダを書き出す處理を自分で書いて逃げた。今後もかうやつて場當り的に適當にやつて逃げるといつか面倒なことになる。やり方はシンプルに統一すべきだ。HTTPヘッダを出力するサブルーチンとサイトのヘッダを出力するサブルーチンは別で作るべきだつたのかもしれないが、それはもう今さら無理だ。ほとんどのCGIプログラムのかなり多くの部分を弄る必要が出て來る。サブルーチンを呼び出す時に渡す引數を追加して、HTTPヘッダを出力するかどうかのフラグを渡す方式に變更するのが良いだらう。

改造と動作テストが面倒だ。自分で状況を正確に把握する目的もあつて長々と書いて來たがこの時點で疲れ果ててもうやる氣が無い。

ジョジョ5部のアニメを見た。もうすぐ終る。あと2囘だらうか。いや、石のやつもやるだらうからもつとあるか。

日記のメンバー選擇ページ(diary.htm)の更新について檢討してみたが、これは一寸嚴しい。メンバーページで色々できるやうになつてゐて、そのメンバーページ用のCGIのサブルーチンの1つとしてdiary.htmの更新が實裝されてゐる。例によつてプログラムの文字コードがEUCになつてゐる。他のところに影響が出まくる。このサブルーチンだけ切り離して別CGIにしても、データファイルがShift_JIS。全部UTF-8にすることを考へてみたが、日記紹介文が日記CGIの方でも使はれてゐる。つまりShift_JISのデータファイルが使はれる前提だ。ここを勝手にUTF-8にしてしまふと日記CGIの方で盛大に文字化けしてしまふ。では日記CGIの方も修正すれば良い、といふことになるとどんどん作業が大變になつて行く。部分的な改修を重ねると後で面倒なことになる。やるなら一氣に日記CGI全體をやるべきだと考へてゐる。なので日記紹介文を弄ることは今囘はしない。といふことはdiary.htmを更新するCGIも弄れない。といふことはライブラリの方も弄れない。つまり何もしないといふことになつた。いや、待てよ。データファイルはShift_JISではなくEUCかもしれない。日記CGIの方でEUCからShift_JISに變換してゐるかも。まあどうせjcode.plではUTF-8を扱へないからダメか。RSSの發行部分とかでEncode.pmも使つてゐるか。もう何がどうなつてゐるか自分でも分からなくなつて來てゐるな。作り始める前の設計段階でしつかりやつておかないからかういふことになる。作りながら考へるな。

暑い。室温は31℃まで行つた。最近の晴れの日と同じくらゐ。今日は曇時々雨。晴れたらもつと高い氣温になつてゐただらう。濕度が63%くらゐあるせゐで普段よりも暑く感じる。

結局、CGIの修正をすることにした。diary.cgiは弄らない方向で考へる。修正が必要なのは、ライブラリ、亂數生成CGI、プロフィール作成CGI、メンバーページCGI(日記紹介文更新サブルーチンのみ)の4つ。ライブラリのヘッダ出力サブルーチンをまづ改良。引數を追加し、HTTPヘッダを出力しないフラグを受け取るやうにした。引數の値が眞なら出力せず、僞なら出力するといふのが逆な感じがして少し氣持ち惡いが、眞なら出力するといふことにすると他の全てのCGIプログラムの修正が必要になつてしまふ。基本は出力するのだ。しないのが例外なのだ。ここを修正したことにより、プロフィール作成CGIと日記紹介文更新CGIのHTMLに書き出す部分の修正が必要になつた。ヘッダ出力サブルーチンを呼び出す時にHTTPヘッダを出力しないための引數を渡す必要がある。そして、日記紹介文は日記CGIでも使はれるので文字コードに注意する必要がある。メンバー選擇ページはこの機會にHTML5&UTF-8にする。しかし日記CGIの方はこれまで通りだ。紹介文更新プログラムがどうなつてゐるか見てみた。データファイルはEUCだつた。HTMLはShift_JISだつた。データファイルの方は觸らなくて良いやうだ。プログラム自體はEUCで書かれてゐる。HTMLファイルに書き出す直前にjcode.plのconvertでShift_JISに變換されてゐる。プログラム冒頭にuse Encode;と書いてencode.pmを使ふやうにし、jcode::convertのところをEncode::from_toにしてEUCからUTF-8に變換してHTMLに書き出すだけでOKだつた。最後に亂數生成CGI。場當り的に自力でHTTPヘッダを出力するやうにしたのを再修正する必要がある。しないとHTTPヘッダを二重に出力することになつて、2つ目は通常テキストとして畫面に表示されるだらう。この部分を削除しておいた。これでOKなはず。いきなりサーバーにアップロードはしない。PC内で動作テスト。無事にできた。文字化けも今のところ出ない。大丈夫だらう。アップロードし、今度はレンタルサーバー上でも一通り動かしてみる。問題無い。思つたより樂にできた。

CGI/Perl関連の書籍

totoBIGが前囘12億の囘でアホみたいに賣れて當りも結構出てしまつてキャリーオーバーが無くなつてゐる。なので今週はスルーのつもりだつたんだが、今日からしばらく災害級の雨が降るらしいと聞いて購入締切ギリギリのタイミングでBIGを買つた。4試合までは中止になつても籤は無效にならない。中止になつた試合は全員的中扱ひになる。當然、當籤者が大量に出るから賞金も少なくなるんだが、かういふ激烈な天候不良時は積極的に狙つて行きたい。

(1.3)OH!GIRL -Mixture style-、世直しGOOD VIBRATION、IT'S SHOWTIME!!、野性のENERGY、RING、黒い青春、THE HELLION、Raging River、The Wild Wind、BANZAI、憎いあの娘、ロビンソン、アラクレ、ギリギリchop、煌めく人。

ギター練習43分、讀書10ページ。

話題:Webプログラミングとか

Info.
公開日時2019年06月29日 21時12分22秒
本文文字数5624文字 (タグ込み)
URLhttps://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20190629
Comments

コメントはありません。

コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しBeginner」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。