かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】

掲示板

#! /usr/local/bin/ruby

require "kconv"
require "cgi"

#================================================ 設定
FILE        = './dat/bbs.dat'    # 書き込み保存ファイル
MAX        = 100            # 保存件数
VIEW        = 10            # 1ページの表示件数
TEXTMAX        = 1000            # 本文文字数制限(全角)
NAMEMAX        = 10            # 名前文字数制限(全角)
TITLEMAX    = 20            # 題名文字数制限(全角)
PASSWORD    = '1234'        # 削除用パスワード

#================================================ クラス定義
class BBS
    def initialize(file, max, view, time)
        @file = file
        @max = max
        @view = view
        @time = time
    end
    def read_log
        count = 0
        log = []
        open(@file, "r") do |fh|
            fh.flock(File::LOCK_SH)
            fh.each do |line|
                log[count] = line.chomp
                count += 1
            end
            fh.flock(File::LOCK_UN)
            fh.close
        end
        log
    end
    def write_log(log)
        FORM.keys.each do |k|
            FORM.params[k][0] = FORM[k][0].tosjis
            FORM[k][0].gsub!(/&/, "&")
            FORM[k][0].gsub!(/</, "&lt;")
            FORM[k][0].gsub!(/>/, "&gt;")
            FORM[k][0].gsub!(/\x0D\x0A\s*/, "<br>")
            FORM[k][0].gsub!(/\s+/, " ")
        end
        tm = @time.strftime("%Y/%m/%d %H:%M") 
        data = [tm, FORM['name'][0], FORM['title'][0], FORM['text'][0], ""].join("\t")
        log = [data] + log[0, @max - 1]
        open(@file, "w") do |fh|
            fh.flock(File::LOCK_EX)
            fh.write log.join("\n")
            fh.flock(File::LOCK_UN)
            fh.close
        end
        log
    end
    def delete_log(log)
        log.slice!(FORM['del'][0].to_i, 1)
        open(@file, "w") do |fh|
            fh.flock(File::LOCK_EX)
            fh.write log.join("\n")
            fh.flock(File::LOCK_UN)
            fh.close
        end
        log
    end
    def print_log(log)
        page = FORM['page'][0].to_i
        logsize = log.size
        start = 0
        if page > 0
            start = page * @view
        end
        stop = start + @view
        if stop > logsize
            stop = logsize
        end
        for i in start..(stop - 1)
            (tm, name, title, text) = log[i].split("\t")
            if name == ""
                name = "名無し"
            end
            if title == ""
                title = "無題"
            end
            printf "<input type=\"radio\" name=\"del\" value=\"%0d\">", i
            print "【#{title}】#{name}<br>"
            print "#{text}"
            print "<div align=\"right\">#{tm}</div>"
            print "<hr>\n"
        end
        print "<center>\n"
        if page > 0
            printf "<a href=\"#{ENV['SCRIPT_NAME']}?page=%d\">≪前ページ</a>\n", page - 1
        end
        if stop < logsize
            printf "<a href=\"#{ENV['SCRIPT_NAME']}?page=%d\">次ページ≫</a>\n", page + 1
        end
        print "</center>\n"
    end
end

#================================================ メインプログラム
FORM = CGI.new
TIME = Time.new

bbs = BBS.new(FILE, MAX, VIEW, TIME)
log = bbs.read_log
#サンプルにつき書き込み停止
#log = bbs.write_log(log) if
#    FORM['mode'][0] == "write" and
#    FORM['text'][0] != "" and
#    FORM['text'][0].size <= TEXTMAX * 2 and
#    FORM['name'][0].size <= NAMEMAX * 2 and
#    FORM['title'][0].size <= TITLEMAX * 2
#log = bbs.delete_log(log) if
#    FORM['mode'][0] == "delete" and
#    FORM['pass'][0] == PASSWORD

print "Content-type: text/html; charset=Shift_JIS\n\n"
print <<END
    <html>
    <head>
    <title>掲示板</title>
    </head>
    <body bgcolor="#eeeeff">
    <h1 style="margin:2px;font-size:15px;letter-spacing:50px">掲示板</h1>
    <hr>
    <form action="#{ENV['SCRIPT_NAME']}" method="POST">
    名前:<input type="text" name="name" size="50" maxlength="#{NAMEMAX}" value="#{FORM['name'][0]}"><br>
    <br>
    題名:<input type="text" name="title" size="50" maxlength="#{TITLEMAX}"><br>
    <br>
    本文: <small>※全角#{TEXTMAX}文字以内</small><br>
    <textarea name="text" rows="10" cols="80"></textarea><br>
    <br>
    <input type="hidden" name="mode" value="write">
    <input type="submit" value=" 書き込み "><br>
    </form>
    <form action="#{ENV['SCRIPT_NAME']}" method="POST">
    <hr>
END

bbs.print_log(log)

print <<END
    <div align="right">
    <input type="password" name="pass" value="#{FORM['pass'][0]}" size="4">
    <input type="hidden" name="mode" value="delete">
    <input type="hidden" name="page" value="#{FORM['page'][0]}">
    <input type="submit" value="削除">
    </div>
    </form>
    </body>
    </html>
END

exit
CGI(Ruby)
Hello world ! ユーザーエージェント取得・表示(ENV['HTTP_USER_AGENT'])
IPアドレス取得・表示(ENV['REMOTE_ADDR']) リンク元取得・表示(ENV['HTTP_REFERER'])
URL取得・表示(ENV['HTTP_HOST'], ENV['REQUEST_URI']) 環境変数一覧(ENV.each)
日時を取得・表示(Time.now) 指定の日までの日数を表示
時刻によって挨拶文を変える 日によって背景色を変える
見るたびに背景色を変える 見るたびに背景画像を変える
おみくじ(rand) カラーチャート
グラフ(横棒グラフ) アクセスカウンター
アクセスカウンター(画像) 訪問回数(クッキー)
パスワード認証 クッションページ(ENV['QUERY_STRING'])
クッションページ(ENV['PATH_INFO']) カレンダー
カレンダー(今年1月〜12月) カレンダー(今年1月〜12月, 前年次年リンク付)
掲示板 ディレクトリ内ファイル一覧表示
リダイレクト(Location) 条件指定リダイレクト(Location)
条件指定アクセス拒否(ステータスコードを返す) HTMLファイル読み込み・表示
HTMLファイル読み込み・パスワード認証 HTMLファイル読み込み・条件指定アクセス拒否
HTMLファイル読み込み・条件指定リダイレクト 外部CGIファイル読み込み(require)
画像ファイル読み込み・表示
かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】