Beginner's Rock Official Website

犬土偶日記

海の近くに住みたい

BR日記の使い方

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

2018年06月01日

適當BBS

公開日時: 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/&/&amp;/g;
    $name =~ s/</&lt;/g;
    $name =~ s/>/&gt;/g;
    $name =~ s/"/&quot;/g;
    $name =~ s/'/&#039;/g;
    $message =~ s/\x0D\x0A//g;
    $message =~ s/\x0D//g;
    $message =~ s/\x0A//g;
    $message =~ s/\t/\x20/g;
    $message =~ s/&/&amp;/g;
    $message =~ s/</&lt;/g;
    $message =~ s/>/&gt;/g;
    $message =~ s/"/&quot;/g;
    $message =~ s/'/&#039;/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 &gt;&gt; $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 ("'", "&#039;", $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 ("'", "&#039;", $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 &gt;&gt; $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プログラミングとか

Info.
公開日時2018年07月06日 17時59分26秒
本文文字数6177文字 (タグ込み)
URLhttps://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20180601
Comments

コメントはありません。

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