STARTING OVER日記。
びくでんオリジナルCGI作成に関する記事のまとめです。
理系のオレサマ。
さて。
びくでんのブログは全てトラックバックを受け付けないことにしました。
いや、非常に多いのよ、迷惑トラバ。
コメントは一部ブログでは受け付けていますが、現在コメントを受け付けていないここはどうするかねぇというのが正直なところ。
…ま、いいか。
で、今日は現時点非公開のブログ(近日公開予定)についてのオハナシ。
日付の横に、メッセージを出す必要があって、それの出し方に悩んでいたんですね。
かれこれ数日間。
もともと「はてな」でやっていたブログの移設なのですが、あっちは日付の横にタイトル(=メッセージ)を出して、記事自体にサブタイトルを書けたんですね。
wikiみたいな感じ。
でも、いざ「はてな」のデータをMT用に変換してみると、サブタイトルと思っていた物がタイトル欄に入り、タイトルは消えてしまったわけですよ。
こりゃ困った。
最初に考えたのが、キーワードにその「メッセージ」を入れておいて、それを表示させるという物。
でも、「日付の横」なので、一日に複数エントリーを書いた場合は、複数エントリー全てにキーワードを指定しておかなければ出ないわけで。
それは面倒。
で。
そのキーワード(「はてな」でのタイトル)は実は日付に起因するものなので、こりゃCGIで出すべかと。
指定日に指定のメッセージを出すだけ。
そのメッセージも日付を計算して出すものなので、毎回計算して、日付を引数にして、SSIで表示させればOKじゃーん、とか。
ロジックを考え始めて少しして。
…いや、同じSSIで出すならよ、と、もっと単純な方法を思いついて。
キーワードを書いたファイルを大量に用意して、タイトルを日付にして、それをSSIで出すほうが早くねえ?
実は明後日には千葉に行くので、今日・明日で曲目登録CGIを作り上げねばならないという切羽詰まった状況です。
メドは立ってるんだけど、詰めの作業がまだなのですよ。
そんな状況下で、他のCGI作っている場合か?と。
そんなわけで、マンパワーでどうにかあるていどのメッセージ入りのファイルを作って、できあがり。
…少し前に「理系の人々」(よしたに著)という漫画を読んだのですが、これの中にエクセルの集計をするだけのためにマクロを作る話があって。
あぁ、これってオレサマの姿だと思っていたのですが、まさにそうでした。トホホ。
ちなみに「理系の人々」、私は当てはまるところが多すぎますが、亭主に至っては「うちの嫁だ」と思いつつ読んだそうで、彼に当てはまったのはどうやらかなり少ないっぽいです。
ま、亭主は理系モドキの文系だもんなぁ。
(私は文系モドキの理系。)
2008年09月19日(金)
作業停止中。
ここ数日、オフラインでの作業が忙しく(単に部屋の片付けですが)、送信したメールからページを生成するCGIは作業停止中。
まぁ、しかし、今日の夜にはやるかな。
現状は、簡単なログファイルを作るところまで完成しております。
あとは、このメールからファイルを作るところをサブルーチン化して、HTMLを作成するメイン処理を追加するってえあたりで。
で、無事HTMLが作成できたら、URLをメールする機能ぐらい付けたいなぁと。
ま、ここ数日で出来るでしょー、と楽観視しているところですが、さて。
「入力迅速」の改訂はその後よん。
2008年09月12日(金)
「Net::POP3」ってなんやねん?
現在、MTにメールでの投稿を可能にしている「Mail-Entry」。
Mobile-bozuさんのお作りになったプログラムなのですが。
「セットリストをメールで投稿して、それを基にページを作る」ということを考えた時に、仕組み自体はすぐに思いついたわけです。
メール送信→POP受信→データ取り込み→ページ作成
という非常に簡単な流れ。
(これ以外にあるんかなぁ?)
で。Perlで作られた身近なサンプルがこちらの「Mail-Entry」しかなく。
ソースを眺めていたら出てきた「Net::POP3」の文字。
「Net::POP3」というPerlモジュールを使っているようで。
それを検索したら、非常に丁寧な解説を書かれているところがあって。→68user's page
ほう、なるほど、と。
ま、私の場合はファイルサイズの表示は不要だし、メールも1件しか受信することはない(送信直後にすぐCGIを起動してページ作成する)ので、この機能は省いて、とか、少なくともホストとかユーザネーム、パスワードをここに書くのは嫌だから別ファイルにして、とか、jcode.pl使ってコード変更しなきゃページには使えないなぁ(メールの文字コードはJISなので)とか、ヘッダ部分の出力は不要だけど日付は欲しいなぁとか、あれこれ。
で、昨日時点でメールを読み込んで、整形されたファイルを作る100行程度のCGIを作成。
本日は少々手直しして、読み込み機能に関しては完成させたいかと。
あとは、ページの作成を、htmlを直接吐くか、CGIでログファイルを読んで、アクセス毎に表示させるかを検討して。
(htmlのほうが負荷は少ないからそうするかな。)
htmlを吐かせるなら、昨日作ったCGIにさらに機能を追加しなきゃいけないかな。
ひな形の規定の部分にメールを読み込んで作ったログファイルのパーツを送り込んでhtmlを作るってヤツね。
(htmlを直接吐くヤツなら、それに伴って、「入力迅速」もそういう形に変更させねば。)
ま、そんな感じで久々に作ってます。
2008年04月17日(木)
小休止:誕生日おめでとうメッセージを出そう。
自分の作るCGIは配列を使ったり、日付処理をする物が多いのですが。
(その辺の処理が好きみたいです。)
本日、THE ALFEEリーダー・高見沢俊彦さんの54歳の誕生日。
うちのサイトのトップにはこんな表示が出ています。
これは日付によって自動的に表示させています。
詳しいことは書きませんが、日付を取得して
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
$year = $year + 1900;
$date = sprintf("%02d%02d",$mon+1,$mday);
日付を比較して
if ($date eq "0417") {
$age = $year - 1954;
$mes = $mes2;
}
最後に表示させているわけで。
if ($mes) {
print $mes$age;
}
※実際はもうちょっと凝ったことを出力しています。
坂崎さんの場合は0415、桜井さんの場合は0120、アルフィーさんの場合は0825を比較させてます。
この他、正月三が日は「賀正」だし、クリスマスとか武道館にはそれなりのメッセージが出ます。
このサイトの開始当初は、JavaScriptを使用した物を使っていたのですが、特定の環境では年齢が酷い物になるので(正確には覚えていないけど数万歳だったような…)、確実なCGIの物に変更しました。
うちのCGIはそういうきっかけで生まれる物も多いです。
これを応用して、スタイルシート書き換えCGIを作って、エイプリルフールには使用しました。
2008年04月16日(水)
「今日は何の日?」改修計画。(2)
とりあえず、データの共通化をやってます。
「何本目?」データに都道府県名を追加しているというわけで。
予定としては、とりあえずは「○年連続」や飛び年データは無視して処理を作ってみて、出来たらその辺をクリアしていこうかと。
で、都道府県名の追加。
「何本目?」と「何の日?」をマージする方法ですすめているのですが…。
今更気づく、データの抜け。
「何本目?」に含まれていない学園祭やファンの集いなどの日程があったわけです。
※「何本目?」のデータは、2000年達成ライブの頃にオフィシャルサイトに掲載されていた物を使用しています。
うぉう、通番に含まれない物があるのを忘れておりました。
BEAT BOYSやフォークル、ソロも通番に含まれないし。
…その日程が何の日程かの摘要も必要かな…。
もう少しデータ形式を考えるところに時間を使わねばならんようです。
2008年04月14日(月)
「今日は何の日?」改修計画。(1)
びくでんのほぼ全部のページの右上にある「今日は何の日?」へのリンク。
実はこの「今日は何の日?」というCGIは2001年春に作った、私にとっては5番目のCGI。
殆ど修正せずに使っています。
今のびくでんで動いている最も古いCGIかと。
(ちなみに最初に作ったCGIはチケット画像を出す物で、2~4番目は今は亡き「The Alfee Links」用の物だった。)
で、処理自体も面倒な仕組みになっているし、ソースも読みづらいし。
データもね、「何の日?」用の特殊な物だし、出来れば他のCGIとデータを共有したい。
それで、綺麗なCGIに作り替えようかと。
常々。
常々常々。
常々常々常々、思っていたわけです。
現在、自宅でのんびりしているワタクシなので、今のうちにやってしまおうかと。
まず、データについてから考えましょ。
実は今回、リリース関係とライブ関係のデータを別々にしてしまおうかと。
リリース関係はそんなに苦労しそうにないので、とりあえずは横っちょのほうに置いといて。
ライブ関係のデータを別に分ける、というか、「この日のアルコン、何本目?」というCGI用のライブデータは別にあるので、それを共有できたらという考えです。
ただ、その場合、「何本目?」データでは2007年の武道館は
2128,20071222,日本武道館,
2129,20071223,日本武道館,
2130,20071224,日本武道館,
その前年の武道館は
2068,20061222,日本武道館,
2069,20061223,日本武道館,
2070,20061224,日本武道館,
という具合になっているのですが
(ちなみにこれは「通番,日付yyyymmdd,会場名,」というcsv)
現在の「何の日?」のデータは
0,1987-2007,12,24,日本武道館,東京,1
という具合の省略形のデータで。
(こっちは「内部コードその1,年yyyy,月mm,日dd,会場名,都道府県名,内部コードその2」というcsv)
※これは武道館の例だから1987-2007なんてのになっていますが、1年しかやっていないものはその年だけが入っている。飛び年の場合は「2001+04」とかいう感じ。
…互換性、無いし。
「何本目?」データを生かすとすれば、末尾に都道府県名をつけるのはいいし、内部コードもこっちの下手くそな処理の都合上の物なのでどうにでもなるとして。
どうやって、「○年連続」の公演を処理するかが課題になります。
あと、武道館みたいな「○年連続」はまだいいとして、飛び年が困る。
例えば。
0,1985+86+88+92-99+2001+04-07,12,29,大阪城ホール,大阪,1
これは1985年、86年、88年、92~99年、2001年、2004~07年の12/29に城ホールをやっているよ、というデータなんですけどね。
そんなわけで、「何本目?」データから見栄えの良い表示を作り出すロジックを作り出さねばならんわけです。
少なくとも、上の城ホールの例でいうなら「1985,86,88,92-99,2001,04-07年」なんて表示をせずに単純に「1985,86,88,92,93,94,95,96,97,98,99,2001,04,05,06,07年」という表示を出すのならすぐにでも出来ますがね。
長いし。
レベルダウンはしたくないところ。
…配列につっこんで、隣の配列が翌年で、その隣がふたつ先の年かどうかで判別するかねぇ。
(漠然。)
そういうややこしいことさえなければ、プログラムが呼び出されたら、現在の月と日と同じライブを表示させる。
単にこれだけ。
単純な作りですけどね、さて、どうなりますやら。
2008年04月13日(日)
くじびき。
くじびきCGIを少々見直し。
冗長な部分を整理しました。
ベースは以下のような感じになりましたとさ。
#!/usr/local/bin/perl
$self = $ENV{ 'SCRIPT_NAME' };
$title = "ラッキーソ\ングおみくじ";
$setsu = " 本日のラッキーソ\ングは";
# 結果のCSS
$result_css = "font-size:18px;font-weight:bold;";
#データファイル
$file = './title.dat';
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }
print "Content-type: text/html\n\n";
print <<"EOF";
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$title</h1>
EOF
if ( $buffer eq "" ) {
print <<"EOF";
<h2>くじをひきましょう。</h2>
<p> 下の[Click!]を押して下さい。</p>
<form method="post" action="$self">
<input type="submit" name="submit" value=" Click! ">
</form>
EOF
}
else {
if (!open(IN,"$file")) { &error('データベース読取エラー','復旧をお待ちください.'); }
local(@BASE) = <IN>;
close(IN);
$dat_num = @BASE;
# 乱数を発生
&rand;
print <<"EOF";
<h2>くじをひきました。</h2>
<p>$setsu</p>
<p style="$result_css">$kuji</p>
<p>です。</p>
<p> もう一度引き直す場合は<a href="$self">最初に戻って</a>下さい。</p>
EOF
}
print <<"EOF";
</body>
</html>
EOF
exit;
# 乱数を発生させるサブルーチン
sub rand {
srand;
$x = int(rand($dat_num));
$kuji = $BASE[$x];
}
実際はスタイルシートとか見た目部分をいじっているのでこの通りではないですが。
あ、title.datには歌のタイトルを羅列で。
(1行1タイトル。)
※ファイル名はこの通りではありません、念のため。
ラストのほうの「srand」はperlのバージョンによっては要らないっぽいですが、一応ね。
2008年04月11日(金)
閑話休題。
「人力検索はてな」で「世界のナベアツ」的なプログラムを作る話が出ており、ちょっとお試し。
色々な方法が回答として上がってましたが、ウェブ上にアップして使えるものとして考えてみました。
#!/usr/local/bin/perl
$prog = $ENV{ 'SCRIPT_NAME' };
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }
print "Content-type: text/html\n\n";
print "<html><head><title>世界のナベアツ</title></head>\n";
print "<body>\n";
if ($buffer eq "") {
print "<form method=\"post\" action=\"$prog\">\n";
print<<"EOF";
<p>幾つまでにしましょうか?<br>
<input type="text" name="kazu"></p>
<input type="submit" value="送信"><input type="reset" value="リセット">
</form>
EOF
}
else {
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
( $name,$value ) = split(/=/, $pair);
$kazu = $value;
}
if ($kazu =~ /\D/) { print "<p>半角数字以外は入力出来ません。</p>\n"; }
else {
print "<p>1から$kazuまでを数える間に、3のつく数字と3の倍数でアホになり、5の倍数で犬っぽくなります。</p>\n";
print "<ul>\n";
foreach $num(1 .. $kazu) {
print "<li>$num";
# 3の倍数・3が付く数字かどうかの判別
if ((!($num % 3)) || ((index $num,3) >= 0)) { print " アホ"; }
else { print ""; }
# 5の倍数かどうかの判別
if (!($num % 5)) { print " 犬"; }
else { print ""; }
print "</li>\n";
}
print "</ul>\n";
}
print <<"EOF";
<p>[<a href="$prog">戻る</a>]</p>
EOF
}
print <<"EOF";
</body>
</html>
EOF
exit;
最初に幾つまでの数にするのか聞いてくるようにしているのですが、ここに半角数字以外を入れるとエラーが表示されます。
3が付く数字かどうかは$kazuの中に「3」という文字が現れるかどうか(index文)で調べています。
※index文
文字列の中で、指定された文字が最初に出てくる場所を返す命令。
含まれていなかったら「-1」を返すので「0」以上なら含むということで。
やりようによっては、アホや犬になる数を最初に選べるというようなことも可能ですが、まぁ、お遊びとしてはこんな感じで。
3という数字が現れるかどうかは、indexを使わない方法もあると思います。
ひたすら割り算、多分。
ケタを分解して、3で割って答えが余り無しの1になるかとか。
(あまり考えていない。)