海の近くに住みたい
話題:Webプログラミングとか
公開日時: 2018年07月06日 17時59分26秒
Webプログラミングをやり始めた頃、有料のレンタルサーバーを使ふほどの熱意は無かつた。無料のやつでも勝手に插入される廣告さへ我慢すれば何も問題無かつた。無料のWebサーバーではPHPを使へないのが普通だつたがPerlが使へるところはあつたので、動的なコンテンツは全てPerlのCGIでやつてゐた。バンドのWebサイトを作ることになり、初期は無料のホスティングサービスを使つてゐたが、すぐに有料のサーバーに移行した。そこで初めてPHPを使へることになり、折角なのでPHPも習得しようと考へた。そこでまづはミニ掲示板みたいなものを適當に作ることにした。掲示板にはWebプログラミングの基礎的な要素が全て詰まつてゐる。Perl版を適當に書き毆り、それをそのままPHP版に移植するといふ形にした。できるだけPerlと同じやうに。その時に作つたものが長く殘つてゐる。適當BBSといふやつだ。犬土偶日記の過去ログにしかリンクが無いのでなかなか普通に見ることは無い。少し前にPHPを完全にUTF-8にすることになり、この適當BBSのPHP版を少し改造した。ログファイルをPerl版と共有してゐて、Perl版とログファイルはEUCだつたので、讀み書きの段階で文字エンコーディングを變更するといふ面倒なことになつてゐた。今日はこれをさらに改造することにした。Perl版もEUCからUTF-8に變更する。ログファイルもだ。PHP版は文字エンコーディングを變更する部分を削除するだけでOK。Perl版は色々弄る必要がある。フォームからの入力を受け取るのにcgi-lib.plを使つてゐた。いつの時代だよ。これをCGI.pmを使ふやうに書き換へた。互換性のためにCGI.pmにもcgi-lib.plと同じReadParseといふメソッドがあつて、ほとんど弄ることなくCGI.pmに移行できるやうになつてゐるやうだが、折角なのでReadParseを使はない方向で修正した。畫面にHTMLを出力する段階でHTML4.01だつたのをHTML5に變更した。自分のPC内で動かして色々試してみたが特に問題は無いやうだ。PHPのhtmlspecialcharsではシングルクォートをエスケープしないやうなのでPerl版と同じにするためにシングルクォートをエスケープする處理を追加した。まあ特に必要無いかもしれないが。物凄くシンプルなプログラムだが、Webアプリの基本形だ。これに機能を追加しまくれば本格的な掲示板にもチャットにもSNSにもブログにもなる。フォーム等からデータを受け取り、色々と處理をし、ファイルや畫面に出力する。ファイルの代りにデータベースを使ふこともできる。入力はHTMLフォーム以外にもクッキーや環境變數等を取得できる。これだけでももうWebアプリの9割ぐらゐは作れさうな感じになるだらう。結構面白いからやつてみると良いよ。Perl版とPHP版のプログラムを掲載してみよう。空行込みで80〜90行程度。30分もかからずに作れるな。最初はエラー頻發で數時間かかつたりするかもしれない。慣れればこんなのあつと言ふ間だが、實は一番厄介なのはプログラム部分ではなくHTMLを書き出す部分。めんどくせーんだよ。ちなみに犬土偶日記のプログラムは3000行ほどある。
適當BBS Perl CGI版 http://orca.xii.jp/test/testbbs-perl.cgi
#!/usr/local/bin/perl
use CGI;
$q = CGI->new();
open (LOG, "./log.txt");
@log = <LOG>;
close (LOG);
$name = $q->param('name');
$message = $q->param('message');
if($name && $message){
$name =~ s/\x0D\x0A//g;
$name =~ s/\x0D//g;
$name =~ s/\x0A//g;
$name =~ s/\t/\x20/g;
$name =~ s/&/&/g;
$name =~ s/</</g;
$name =~ s/>/>/g;
$name =~ s/"/"/g;
$name =~ s/'/'/g;
$message =~ s/\x0D\x0A//g;
$message =~ s/\x0D//g;
$message =~ s/\x0A//g;
$message =~ s/\t/\x20/g;
$message =~ s/&/&/g;
$message =~ s/</</g;
$message =~ s/>/>/g;
$message =~ s/"/"/g;
$message =~ s/'/'/g;
unshift (@log, "$name\t$message\n");
pop (@log) if(@log > 15);
open (LOG, ">./log.txt");
eval "flock (LOG, 2);";
print LOG @log;
eval "flock (LOG,8);";
close (LOG);
}
print <<"HTML";
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="../debug/debug.css">
<title>適当BBS Perl CGI版</title>
</head>
<body>
<h1>適当BBS</h1>
<div class="content">
<h2>Perl CGI版</h2>
<p>言いたいことがあるなら言ってみろ。</p>
HTML
if(@log){
print" <ul>\n";
chomp (@log);
foreach (@log){
($name, $message) = split (/\t/, $_);
print " <li>$name >> $message</li>\n";
}
print " </ul>\n";
}else{
print " <p>まだ何も書かれてません。</p>\n";
}
print <<"HTML";
<form action="./testbbs-perl.cgi" method="post">
<fieldset>
<legend>メッセージ投稿フォーム</legend>
<p>名前:<input type="text" name="name" size="20"></p>
<p>コメント:<input type="text" name="message" size="70"></p>
<p><input type="submit" value=" 送信 "></p>
</fieldset>
</form>
</div>
</body>
</html>
HTML
exit;
適當BBS PHP版 http://orca.xii.jp/test/testbbs-php.php
<?php
$log = file ("./log.txt");
$name = isset($_POST['name']) ? $_POST['name'] : "";
$message = isset($_POST['message']) ? $_POST['message'] : "";
if($name && $message){
$name = str_replace ("\x0D\x0A", "", $name);
$name = str_replace ("\x0D", "", $name);
$name = str_replace ("\x0A", "", $name);
$name = str_replace ("\t", "\x20", $name);
$name = htmlspecialchars ($name);
$name = str_replace ("'", "'", $name);
$message = str_replace ("\x0D\x0A", "", $message);
$message = str_replace ("\x0D", "", $message);
$message = str_replace ("\x0A", "", $message);
$message = str_replace ("\t", "\x20", $message);
$message = htmlspecialchars ($message);
$message = str_replace ("'", "'", $message);
array_unshift ($log, "$name\t$message\n");
if(count($log) > 15){array_pop ($log);}
$fp = fopen("./log.txt", "w");
flock ($fp, LOCK_EX);
fwrite ($fp, join("", $log));
flock ($fp, LOCK_UN);
fclose ($fp);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="../debug/debug.css">
<title>適当BBS PHP版</title>
</head>
<body>
<h1>適当BBS</h1>
<div class="content">
<h2>PHP版</h2>
<p>言いたいことがあるなら言ってみろ。</p>
<?php
if($log){
echo " <ul>\n";
foreach ($log as $line){
$line = rtrim ($line, "\n");
list ($log_name, $log_message) = explode ("\t", $line);
echo " <li>$log_name >> $log_message</li>\n";
}
echo " </ul>\n";
}else{
echo " <p>まだ何も書かれてません。</p>\n";
}
?>
<form action="./testbbs-php.php" method="post">
<fieldset>
<legend>メッセージ投稿フォーム</legend>
<p>名前:<input type="text" name="name" size="20"></p>
<p>コメント:<input type="text" name="message" size="70"></p>
<p><input type="submit" value=" 送信 "></p>
</fieldset>
</form>
</div>
</body>
</html>
(1.2)Anniversary song、fake、MIRAI、turning、トウダイモトクラシー、pain、愛のバクダン、アラクレ、ELECTRIC EYE、juice、ultra soul 2011、Enter Sandman、RING、ピエロ、ALL-OUT ATTACK。
ギター練習52分、スクワット300囘、ハギ300囘、讀書13ページ。
話題:Webプログラミングとか
公開日時 | 2018年07月06日 17時59分26秒 |
---|---|
本文文字数 | 6177文字 (タグ込み) |
URL | https://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20180601 |
コメントはありません。