CafeLogにタイトル一覧表示を追加(3)
CafeLogの作者の運営するKENT-WEBサイトより。『KENT-WEBはCGI/Perlプログラムを無料で配布する日本最大のサイトです。累計ダウンロード数は380,535,654回。』
その内訳が下図。
やはり掲示板が人気で、ブログをCGIで運用しようとする人はまだ少ないようですね。
もっとも、週間のダウンロードランキングは下記の通りですので、cafeLogが2位、累計では最下位に近くにいたSmartBlogが15位とそれぞれ躍進しています。
CGIの人気が掲示板からブログに移ってきているのですかね。
LinkViewerは累計のダウンロード数は68000弱でCafeLogの3.5倍程度です。意外に多いなぁと思いました。「意外に」という理由は、LinkViewerは10年位前に最後のアップデートがされて、その後まったく手が入っていないらです。CafeLogは今年に入ってもイメージファイルのアップデートに関する機能追加がされています。
実は僕の使っている二つのサーバー環境(AwardSpaceとSakura)で、LinkViewerはそのままでは動きませんでした。お約束の
①パーミッションの指定
②冒頭の行でのperlの在り処の指定
は当然行っていますが、こういうエラーになります。
このエラー上記の①や②をうっかり忘れた時に発生すると承知していましたが、今回は心当たりがありません。さらに不思議なのは LinkViewerの機能拡張版のCOSMO_NAVIも試していたのですが、こちらは問題無く動く。
「差は何だろうか ? 」と思案しました。
COSMO_NAVIの紹介のコメント欄に『スマホ画面に対応したレスポンシブデザイン対応です。』とありました。LinkViewerは見るからに古い画面デザインですから、レスポンシブ対応以前の古いCGIのようです。試しにCGIプログラムソースの文字コードを確認したら、COSMO_NAVIはUTF-8、LinkViewerはS-JISでした。どうもこれが怪しそうだなと考え、LinkViewerの文字コードをUTF-8に変更してみました(ついでに改行コードもLinuxスタイルに)。
やり方は使っているエディター次第ですが、例えばサクラエディターならこんな具合です。
動きました。しかし、まだ奇怪しい。
admin.cgiを起動して表示されるパスワードの入力画面です。
続いて、admin.cgiのデータの処理画面。
完全に文字化けしていますね。ただ、こちらはHTMLのmeta指定がs-jisになっているようだなと推測がつきます。
admin.cgiの一番最後に置かれているHTMLヘッダー作成の関数をチェック。
やっぱりs-jisになっていました。
と変更しました。
何故cgiの文字コードがs-jisだと500番のエラーになるのかの理由は不明です。「レスポンシブ対応でないCGIは動かしてやらない」なんていう変なサーバーがあるとは思えません。
ググってみると「.htaccessでAddDefaultCharset shift_jisを指定すればOK」というような記述がありましたが、これは逆にUTF-8がディフォルトのCafeLogなどを動かすのに問題となりそうです。結局、LinkViewerをUTF-8対応させるしかなさそうです。
まあ、何とか問題は解決しましたが、その後のCGIの変更より、この動かすまでの方が大変でしたね(^^;;;。
「cgi s-jis 動かない 500」で検索してみました。要するにshift_jisは古く、10年位前からUTF-8が標準の世界に変わってしまったということは分かるが、何故shift_jisだとperlのCGIが動かないのかは不明ですね。今回、悪戦苦闘する中、参考にしたサイトをご紹介しておきます。
・2021年に、CGIの文字コードのお話を(Shift-JISのCGIが文字化け)
・kent QA
・さくらサーバーで枯れたCGIを動かそうとするも500エラー
・VPSでShift-jisなどのCGIが文字化けする場合にチェックするべきところ
・Fedoraで自宅サーバー構築 CGIの文字コードについて
その内訳が下図。
やはり掲示板が人気で、ブログをCGIで運用しようとする人はまだ少ないようですね。
もっとも、週間のダウンロードランキングは下記の通りですので、cafeLogが2位、累計では最下位に近くにいたSmartBlogが15位とそれぞれ躍進しています。
CGIの人気が掲示板からブログに移ってきているのですかね。
LinkViewerは累計のダウンロード数は68000弱でCafeLogの3.5倍程度です。意外に多いなぁと思いました。「意外に」という理由は、LinkViewerは10年位前に最後のアップデートがされて、その後まったく手が入っていないらです。CafeLogは今年に入ってもイメージファイルのアップデートに関する機能追加がされています。
実は僕の使っている二つのサーバー環境(AwardSpaceとSakura)で、LinkViewerはそのままでは動きませんでした。お約束の
①パーミッションの指定
②冒頭の行でのperlの在り処の指定
は当然行っていますが、こういうエラーになります。
このエラー上記の①や②をうっかり忘れた時に発生すると承知していましたが、今回は心当たりがありません。さらに不思議なのは LinkViewerの機能拡張版のCOSMO_NAVIも試していたのですが、こちらは問題無く動く。
「差は何だろうか ? 」と思案しました。
COSMO_NAVIの紹介のコメント欄に『スマホ画面に対応したレスポンシブデザイン対応です。』とありました。LinkViewerは見るからに古い画面デザインですから、レスポンシブ対応以前の古いCGIのようです。試しにCGIプログラムソースの文字コードを確認したら、COSMO_NAVIはUTF-8、LinkViewerはS-JISでした。どうもこれが怪しそうだなと考え、LinkViewerの文字コードをUTF-8に変更してみました(ついでに改行コードもLinuxスタイルに)。
やり方は使っているエディター次第ですが、例えばサクラエディターならこんな具合です。
動きました。しかし、まだ奇怪しい。
admin.cgiを起動して表示されるパスワードの入力画面です。
続いて、admin.cgiのデータの処理画面。
完全に文字化けしていますね。ただ、こちらはHTMLのmeta指定がs-jisになっているようだなと推測がつきます。
admin.cgiの一番最後に置かれているHTMLヘッダー作成の関数をチェック。
#-----------------------------------------------------------
# HTMLヘッダー
#-----------------------------------------------------------
sub header {
my $ttl = shift;
print "Content-type: text/html\n\n";
print <<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css">
やっぱりs-jisになっていました。
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
と変更しました。
何故cgiの文字コードがs-jisだと500番のエラーになるのかの理由は不明です。「レスポンシブ対応でないCGIは動かしてやらない」なんていう変なサーバーがあるとは思えません。
ググってみると「.htaccessでAddDefaultCharset shift_jisを指定すればOK」というような記述がありましたが、これは逆にUTF-8がディフォルトのCafeLogなどを動かすのに問題となりそうです。結局、LinkViewerをUTF-8対応させるしかなさそうです。
まあ、何とか問題は解決しましたが、その後のCGIの変更より、この動かすまでの方が大変でしたね(^^;;;。
「cgi s-jis 動かない 500」で検索してみました。要するにshift_jisは古く、10年位前からUTF-8が標準の世界に変わってしまったということは分かるが、何故shift_jisだとperlのCGIが動かないのかは不明ですね。今回、悪戦苦闘する中、参考にしたサイトをご紹介しておきます。
・2021年に、CGIの文字コードのお話を(Shift-JISのCGIが文字化け)
・kent QA
・さくらサーバーで枯れたCGIを動かそうとするも500エラー
・VPSでShift-jisなどのCGIが文字化けする場合にチェックするべきところ
・Fedoraで自宅サーバー構築 CGIの文字コードについて
CafeLogにタイトル一覧表示を追加(2)
以下のperlのコードは前回の最後に紹介したBingAIのソースコードをベースに作成したものです。
コメント行を入れて40行弱。ヘッダー部分の編集はもっと手抜きできますので、20行強のプログラムを走らせれば、LinkViewを使ってCafelogにタイトル一覧表示させることが出来ます。
プログラムはCafeLogの出力するpage.datを読み込み、その内容を編集し、ListViewerがタイトル一覧を編集出力するためのデータファイル(log.cgi)自動的に作成しています。
Perlを使えば、編集そのものは数行で済みますので、楽ですね。
テンプレートファイルを編集すると、こんな感じでタイトル一覧が表示されます。
このプログラム、次のような指示書によりBingAIが出力したものです。
この位に丁寧な説明だと、BingAIでもperlプログラミングしてくれます。perlに慣れている人だと「自分でプログラミングした方が速いよ」といわれそうですね。また、前回書いたように完全なコードではありません。上記例のようにWhileループを補ってやる必要があります。
僕の場合はPerlには慣れていないので、インタネットでサンプル捜しし、適当に修正する手間が省けるので、助かりました。
データファイル(log.cgi)のhtml(listv.html)出力はadmin.cgiを使い、行います。
admin.cgiを起動すると次のような画面が表示されます。
最新の記事を選び、プルダウンメニューで「修正」を選び、実行(送信する)。
修正用の画面が表示されますので、そのまま「送信する」させます。
これで最新のタイトル一覧画面用のHTMLが生成され、表示できるようになります。
この方法はListViewer側のCGIの変更は不要で、上記のperlスクリプトをWindows環境で実行させるだけです。簡単でいいのですが、サイトで更新されたpage.datをダウンロードし、スクリプトが変換したlog.cgiをサイトにアップロードする必要があるなど多少手間がかかります。
という訳で、admin.cgiに上記のコードを追加すれば、楽を出来そうなので、やってみることにしました。「実行」というプルダウンメニューを用意し、クリックすればHTMLが生成されるという方式にしました。
このため、admin.cgiに手を入れた内容です。
最初の関数 sub admin_mode の判定分岐部分の最後に以下を追加。
前半部分は最初に紹介したスクリプトを簡略化したもの。後半部分はHTML更新を行うための関数を呼び出すためのデータを生成しています(こちらは削除処理のコードをほとんどそのまま流用)。
直後の管理画面のプルダウンメニューを次の通り変更します。
あと、これ以外にJcodeを呼び出す部分(4箇所)をコメントアウトしています。修正機能を使わなければ不要ですが、一応対応しました。
実はこの日本語コードの問題が今回の対応で一番手こずりました。詳しくは次回に。
#!/usr/bin/perl
use strict;
use warnings;
my $filename = './award/cafe/admin/data/page.dat';
my $filename1 = './award/linkv/data/log.cgi';
open (FILE, $filename) or die "Can't open $filename";
my @buffers = ;
my $lines = @buffers;
close FILE;
open(IN, "<$filename") or die "Could not open file '$filename'";
open(OUT, ">$filename1") or die "Could not open file '$filename1'";
my $head = 0;
while (my $row = ) {
# 入力データを一行読み込む
chomp $row;
# タブで分割する
my @fields = split /\t/, $row;
# 番号0, 日時A, タイトルを取り出す
my ($num, $date_a, $title) = @fields[0, 1, 3];
# 日時Aを年.月.日の形式から年月日の形式に変換する
my $date_b = $date_a;
$date_b =~ s/\.//g;
# 日時Aを年.月.日の形式から年,月,日の形式に変換する
my $date_c = $date_a;
$date_c =~ s/\./,/g;
# 変換後のデータを出力する
if ($head == 0) {
print OUT "$num<>admin<>$lines\n";
# print "$num<>admin<>$lines\n";
$head = 1;
}
print OUT "$num<>0<>$title<>http://mimizukobo.atwebpages.com/archives/day/$date_b-1.html<>$date_a<><><><>$date_c<>\n";
# print "$num<>0<>$title<>http://mimizukobo.atwebpages.com/archives/day/$date_b-1.html<>$date_a<><><><>$date_c<>\n";
}
close(IN);
close(OUT);
コメント行を入れて40行弱。ヘッダー部分の編集はもっと手抜きできますので、20行強のプログラムを走らせれば、LinkViewを使ってCafelogにタイトル一覧表示させることが出来ます。
プログラムはCafeLogの出力するpage.datを読み込み、その内容を編集し、ListViewerがタイトル一覧を編集出力するためのデータファイル(log.cgi)自動的に作成しています。
Perlを使えば、編集そのものは数行で済みますので、楽ですね。
テンプレートファイルを編集すると、こんな感じでタイトル一覧が表示されます。
このプログラム、次のような指示書によりBingAIが出力したものです。
perlを使い、
番号0\t日時A\t時刻\tタイトル\t数字\tカテゴリ数字\t数字\t数字\t\nとなっているデータを一行単位に読み取り、
番号<>0<>タイトル<>http://mimizukobo.atwebpages.com/archives/day/日時B-1.html<>日時A<><><><>日時C<>\n
という具合に変換し、印字するプログラムを作成して下さい。
日時Aは年.月.日
日時Bは年月日(20230101という具合に年月日の数字をくっつけて、区切りの/は無し)
日時Cは年,月,日
とします。
また、先頭には読み取った一行を使い
番号0<>admin<>番号0\n
という行を追加して下さい。
この位に丁寧な説明だと、BingAIでもperlプログラミングしてくれます。perlに慣れている人だと「自分でプログラミングした方が速いよ」といわれそうですね。また、前回書いたように完全なコードではありません。上記例のようにWhileループを補ってやる必要があります。
僕の場合はPerlには慣れていないので、インタネットでサンプル捜しし、適当に修正する手間が省けるので、助かりました。
データファイル(log.cgi)のhtml(listv.html)出力はadmin.cgiを使い、行います。
admin.cgiを起動すると次のような画面が表示されます。
最新の記事を選び、プルダウンメニューで「修正」を選び、実行(送信する)。
修正用の画面が表示されますので、そのまま「送信する」させます。
これで最新のタイトル一覧画面用のHTMLが生成され、表示できるようになります。
この方法はListViewer側のCGIの変更は不要で、上記のperlスクリプトをWindows環境で実行させるだけです。簡単でいいのですが、サイトで更新されたpage.datをダウンロードし、スクリプトが変換したlog.cgiをサイトにアップロードする必要があるなど多少手間がかかります。
という訳で、admin.cgiに上記のコードを追加すれば、楽を出来そうなので、やってみることにしました。「実行」というプルダウンメニューを用意し、クリックすればHTMLが生成されるという方式にしました。
このため、admin.cgiに手を入れた内容です。
最初の関数 sub admin_mode の判定分岐部分の最後に以下を追加。
# 実行
} elsif ($in{job} eq "exec") {
my $filename = 'page.dat';
open(IN,"<../admin/data/$filename") or &error("open err: '$filename'");
open(DAT,"> $cf{logfile}") or &error("open err: $cf{logfile}");
my $headerkey = 0;
while (my $row = ) {
chomp $row;
my @fields = split("\t", $row);
my $dateA = $fields[1];
my $dateB = $dateA;
$dateB =~ s/\.//g;
my $dateC = $dateA;
$dateC =~ s/\./,/g;
my $url = "http://mimizukobo.atwebpages.com/archives/day/$dateB-1.html";
my $cate = 7 - $fields[5];
if ($headerkey == 0) {
my $num = $fields[0];
my $new_row1 = "$num<>admin<>$num\n";
print DAT "$new_row1";
$headerkey = 1;
}
my $num1 = 7 - $fields[5];
my $new_row = "$fields[0]<>$num1<>$fields[3]<>$url<>$dateA<><><><>$dateC<>\n";
print DAT "$new_row";
}
close(IN);
close(DAT);
# 日付取得
my ($date,$time,$mark) = &get_time;
# データ読み込み
my (@data,%data,%cate);
open(DAT,"+< $cf{logfile}") or &error("open err: $cf{logfile}");
eval "flock(DAT, 2);";
my $top = ;
while() {
chomp;
my ($no,$cate,$sub,$url,$com,$date,$time,$host,$mk) = split(/<>/);
$mk ||= '2000,01,01';
push(@data,"$_\n");
$data{$cate} .= "$sub<>$url<>$com<>$mk\t";
# カテゴリデータ認識
$cate{$cate}++;
}
chomp($top);
my ($num, $ip, $all) = split(/<>/, $top);
my $all = @data;
# マスタデータ更新
unshift(@data,"$num<>$ip<>$all<>\n");
seek(DAT, 0, 0);
print DAT @data;
truncate(DAT, tell(DAT));
close(DAT);
# HTML更新
&renew_html(\%data,\%cate,$all,$date);
}
前半部分は最初に紹介したスクリプトを簡略化したもの。後半部分はHTML更新を行うための関数を呼び出すためのデータを生成しています(こちらは削除処理のコードをほとんどそのまま流用)。
直後の管理画面のプルダウンメニューを次の通り変更します。
if (!$cf{reg_type}) {
print qq|
あと、これ以外にJcodeを呼び出す部分(4箇所)をコメントアウトしています。修正機能を使わなければ不要ですが、一応対応しました。
実はこの日本語コードの問題が今回の対応で一番手こずりました。詳しくは次回に。