WhiteBOX設定編/(6)山記録 のバックアップ(No.1)



イメージ掲示板バックナンバーの作成

  • 2004年9月にイメージ掲示板を開設してから、メンバーのYさんが山の写真をドンドンアップしてくれました。私も競い合うようにしてアップして、記録がたくさんたまりました。
  • ところが、掲示板の表示は10件毎にページが変わります。また、新しい順の表示なので山行記録としてはたいへん見にくいということに気がつきました。
  • もともと、こうした連続写真みたいな使い方は想定していなかったんでしょうね。ならば、テーマ毎(山単位)に切り出して時系列で表示することはできないものかと頭をひねったのが、この記録です。

データ構成

  • 投稿した記事と写真は、以下のディレクトリに格納されています。
     /var/www/html(ホームページ)
        |-- bbs16/bbsdata  [777](記事・イメージ格納ディレクトリ)
              +-- bbs.txt    [666](記事ファイル)
              +-- option.txt [666](設定ファイル)
  • 最近のイメージ掲示板の一部分ですが、 bbs16_bn.jpg
  • 記事は、フォーム入力した内容が、ベタのテキストファイルで格納されます。このファイル bbs.txtを開いてみますと、、、

181<>2005.2.5(土) 16:35<>jpg<>160<>200<>1<>Yさん<>我家の雪です・・・<> 今週一週間は、ほとんど晴れ間がなく、しっかり降りつづけました。帰ってくると、息子に夕飯を食べさせた後、外へ出て雪かきの毎日でした。<br> 休みになって、今まで山にしておいた雪を始末しないと、積もった雪を片付けることができない状態になりました。<br> 私の左にある雪、分かります?下に木が埋まっているわけでも、何かの塊があるわけでもありません。純粋に雪のみです。3㍍強はあると思います。今まで積もった雪を除雪機で片付けていたら、こんな山になってしまい、除雪機で雪を飛ばすところがなくなってしまいました。<br> と言うわけで、この後息子と二人でこの雪の山に乗って、片付けました。<br> <br> あーぁ、疲れた…<br><><>60.34.195.227<>
180<>2005.1.29(土) 18:20<>jpg<>200<>160<>1<>Yさん<>裏山2005-1-29(その11)<>  食事の風景・・・と言うより、飲んでる風景でした。途中、中型と思われる動物の足跡が 合ったのですが、それ以外は全く動物の気配なし。勿論、人間の気配なし。人工の音も一切聞こえず。たまらなく最高の気分でした。<br> 逆に、木に積もった大きな雪の塊が、暖められて突然「ドサッ!!」と大きな音を立てて落ちてくる、その音にびっくり。<br> まぁ、いずれにしても最高の気分でビールを飲んでいる写真で締めくくりたいと思います。今回は、いい風景は一切ありませんでした。<br><><>60.34.205.72<>

  • お気づきだと思いますが、フォームに入力した内容が <>を区切り文字として保存されています。また、時系列的には新しい記事がファイルの先頭に追加されています。 表示するときは、CGIは、ここから必要な個所を切出してhtml文を書き出していきます。
  • 各項目の先頭は、記事Noです。書き込み順に、自動的に付与されています。改行文字は、項目の最後にあるだけです。
  • アップロードした写真は、同じディレクトリに「(記事No).jpg」というファイル名で、記事の数だけ保存されています。

バックナンバー化するための課題

  • データの構造がわかりました。同時に、テーマ(山行)毎に切り出して表示させるための主要な課題が明らかになりました。
    1. テーマ毎の記事番号は分かるので、その「先頭と最後を指定して」表示する
    2. また、それを「昇順で」表示する
  • 一度は、これを全部手作業でやって、静的なhtmlを作ってアップしました。
    • 普通に表示した画面のソース表示を、1画面ずつhtmlファイルで取り出し
    • エディタ上で、テーマごとにファイルの分割・結合と時系列で並べ替え
  • 力仕事でしたが成功しました。しかし、えらい消耗しました(^^;) 少しは知恵を出そうという訳で、cgiの改造に挑戦しました。

課題解決1 表示範囲の指定

  • まずは、記事番号の範囲指定で表示する方法です。cgiスクリプトを3日間ほど眺めてあれこれ試した結果ですが、以下のような変更で可能なことが分かりました。
引数の追加 
CGIを呼び出す際に、表示範囲を指定するためのパラメータを引き渡します。これは簡単でした。以下のように、$変数宣言するだけで、いくらでも引数の追加が可能でした。hajimeが開始の記事Noで、owariが終了のNoです。
$hajime = $in{'hajime'};
$owari = $in{'owari'};
表示範囲の指定 
通常は、頭から10個表示することになっていますが、引数の範囲で表示する記事数を増減させる必要があります。表示ルーチンをあれこれいじって、何とか動きました。#ではじまる行は、修正前のスクリプト、もしくはデバッグ用に追加した行です。
 open (IN,"$bbsfile") || &error("OPEN ERROR");
    while (<IN>) {
#    if ($num <= $k && $k < $next) {
     if ($hajime - 1 <= $k && $k < $owari) {                     
($no,$date,$img_type,$img_w,$img_h,$img_big,$name,$sub,$com) = split(/<>/);
#      print " $hajime | $owari \n";   # for hikisu debug
         &bbs_dsp;
       }
      }
     $k++;
    }
  close IN;
とまぁ、実質1行だけの変更で、意外と簡単にいきました。
  • このほか、入力フォーム等は不要なので、関連する行をバッサリと削除(コメント化)しましたが、その辺は省略。

課題解決2 記事ファイルの項目並べ替え

  • 表示ルーチンは改造できましたが、参照しているファイルを先頭から見ているだけなので、範囲指定しても昇順で切り出し直して表示することはできません。(そこまでの改造は、トテモトテモ。。。)
  • ならば、bbs.txtの各記事を昇順に並べ替えておけばよいのですが、これを手作業でやるのはシンドイ。あれこれ悩んでおりましたが、簡単なコマンド一発でOKと教えてくれる人がいました。
    # cat bbs.txt |sort -n > bn.txt
  • sortの -n オプションは、numberの略ですが、これで行頭の項目番号をキーに、各記事がNo1から、昇順で並べ替えることができました。
  • cat はテキストファイルを表示するコマンドです。パイプ(|)で sort コマンドに渡し、昇順でソートした結果を別ファイルにリダイレクト(>)で書き出します。

最終調整

  • 基本的に以上でOKですが、htmlとして表示するための調整作業は若干残ります。
バックナンバーCGI関連ファイル 
バックナンバ用に改造したCGIはbbs16_bn.cgiとして、バックナンバー表示用にソートした記事ファイルは bn.txtとして別名で保存します。当然、お互いリンクさせるための設定ファイルも別に(option_bn.txt)作る必要があります。 ファイル名さえ変えておけば、いくつでもcgiを起動できることになります。(将来の件数増加にも、この手で逃げることは可能かな!?)
バックナンバー目次htmlの作成 
テーマ毎の範囲指定を自動化することはできません。投稿があるたびに、hajimeとowariのNoを確認してcgiを呼び出すためのトップページ bn.html に追加します。
バックナンバーファイルの更新 
投稿のたびに記事ファイルを再ソートして、bn.txtを上書き保存します。crondでも可能ですが、それほど頻繁に投稿があるわけでもないし、どうせ目次追加は手作業なので、その都度やることにしています。 
  • バックナンバーのトップページから、山を選んで表示したときのURLで、引数を渡しているのが分かると思います。あぁ、 苦労したんだなぁ。。と思っていただけると幸いです(^^)

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   リンク元