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



イメージ掲示板バックナンバー(山記録)の作成

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

データ構成

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

169<>2005.1.4(火) 22:08<>jpg<>200<>49<>1<>○○<>写真の位置からカシミ>ール<>トップ写真を撮ったのとほぼ同じ位置から、カシミール3Dで描画して>みました。<br><br>山の高さは、若干強調(x1.2)してあります。<br>雲とか>の調整は難しいので、とりあえず快晴モードです。<br><><>192.168.1.100<>
168<>2005.1.3(月) 19:30<>jpg<>200<>115<>1<>○○<>北信五岳・その後<>正 月は二日に、おぶせミュージアム・中島千波館へ行きました。<br>第一展示>室で、この絵を見つけました。<br>飯山の画家・小山オサムさんが描いた絵>です。<br>その名も「北信五岳」。<br>http://www.shinshu.co.jp/local/2000/000204/n13.html<br><br>山の位置が、タイトルと同じことに気がつきま>した。<br>ひょっとして、この辺で描いたのかしら!?ということで<br>岩>松院の方へ足を延ばしてみました。<br>その辺の、雁田山を背にした道路か>ら撮ったのが、トップの写真です。<br><br><><>192.168.1.100<>

  • お気づきだと思いますが、フォームに入力した内容が <>を区切り文字として保存されています。また、時系列的には新しい記事がファイルの先頭に追加されています。 表示するときは、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でも可能ですが、それほど頻繁に投稿があるわけでもないし、どうせ目次追加は手作業なので、その都度やることにしています。 

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