Heppoko x[kai]...

らぶべくとる::ぷろぐらみんぐ。その名も「へっポコ改」。みるからにへっポコであるPaGeがそのへっポコさを激しく露呈する。

基本的にPaGeは無能です。
わけのわからんことをやって愚痴を言ってたりします。
そんなPaGeが哀れに見えたアナタは救いの手を差し伸べてあげてください。
哀れに見えないアナタも、暖かく見守ってくださいね。
そして、記事を鵜呑みにしないように。(まぁ、するやつなんかおらんか・・・)
救いの手はこちらへ... - [救ってみる^^]

softwares...    Flog | NovelSystem

1.プロローグ

00/07/05

どーも、こんちゃ。やっとへっポコ書き始めたよー。長かったなぁ。だってさ、時間なくてねぇ。ぬはは。

いやね、やっと復活しましたよ、へっポコ。旧でくりめんつ時代は完全にただの日記帳と化してたのだけれど、これは「ぽつりごと」のほうに移行したので、Programming or Computer Science 以外のことは書かないつもりらしく(お前やろ)、でも書いちゃうかも(笑)

んでさっきも書いたけど、時間ないのよ、まぢで。ホントに。もうすぐ夏休みでそしたら余裕出来るとは思うんだけどってかヒマになると思うんだけど、今はホント忙しいッス。金曜日にもテストあるしさ。天野く〜ん(謎)

さてさて。んで、今日は第1回目ということで、即ちへっポコ改のプロローグなわけですね。ってことはだ。そりゃもう紹介するコンテンツはいっこしかねーだろ、てな感じでPrologについてなのだ。

自分はね、実はPrologは軽くしか触れてないんだけど、初めて見た瞬間の第一印象というかなんというかはすげ〜よ〜てな感じで感動してましたねぇ。要は、式を動かすことなく方程式を解くことが出来るわけなんですが、なんかすげぇ!!と思いましたね。この「式を動かすことなく」ってとこがポイントなのでありますじゃ。

もともとPrplogは定理の自動証明をまっすぃ〜んにさせるためもがきまくったときの産物としてポロッとでてきたものな感じなのですが(うそかも(笑))ねぇ、要は関数の展開にす即してもがきまくって正解を探すってな感じにできてるわけですな。

たとえば、

mother(X, page).

大文字で始まる文は変数、残りは識別子と認識されます。この関数は、pageの母親はXである、という意味であるとして、つまりは1変数の方程式であるのであります。

さてさて、この関数について、実はもともとこのような記述があったのでありました。

mother(X, Y) :- parent(X, Y), female(X).

「A :- B」で「 B ならば A 」なんて感じな意味でして〜(天野っぽい)、というかそのように定義されてるんでして〜、つまりは、「親で女なら母親だろ?」てなわけです。この記述を見て、まっすぃ〜んは mother(X, page) を parent(X, page), female(X) と展開します。ここで parent と female の定義をさがしてみるとですね、このようなデータがみつかったのでした。

.
.
.
parent(page_mama,page).
parent(page_papa, page).
parent(turtle, oyao).
.
.
.
male(page_papa).
male(page).
female(page_mama).
.
.
.

よってな、page_mamaがfemaleでありpageのparentであると定義されていましたのでね、解(の一つ)となります。そしてそれが出力される・・・といっか感じですか。

んで、はじめてさわったときは楽しかったんですけど、ダンダン腹が立ってきて、「せからしか!!」とか大声出して帰っちゃいました(笑) いや帰ってないですけど。しかにそれが正しいんですけどねーホントは。でも肌に合わないというかなんというか。でもごめんなさい。ボクの負けです(笑)

これってPrologの説明になってない・・・まぁいいや。

2.ealis改造

00/07/15

あああううう。とっても忙しい。日曜日もヤマで、月曜日はオオヤマ。火、水とコヤマが続いてとってもラクチンになる。んでいまもとっても忙しい。けどちっと作業が一段落ついたので書いてみる。

今日はその忙しい最中に高校の学祭に行ってきました。いやー楽しかったっすたのしかったっす、それなりに。懐かしの人物なぞにも久しぶりに会えたのでね。ってか、暑い暑い。汗かきまくりー。タスケテ。ケッタを爆走させてたから悪いのかなぁ(あたりまえや)。疲れたよマッタク。雨降るし。帰りも。降ったり降らなかったり・・・いやな天気。天気予報が20%だったのは気のせいだったかなぁ。朝の新聞なんだけどね。・・・ちなみに、いろいろぼったくられました。金銭をけっこう失った気がします。貧乏学生から金をふんだくらないでください、みなさん。ラムネを150円で売らないでください(笑) しかもラムネ、こぼしちゃったしさ。残念。おかげで鞄はラムネまみれです。タスケテください。(過剰表現しすぎ)でもねー。ずるいなー。学祭いいなー。いやね、学祭でイタイ目をみている自分にとってはね、けっこうなんかうらやましくてねー。少し若返りたいなぁと思う今日この頃でしたとさ。

さてさて。ealisという掲示板をご存じだろうか?このページの掲示板にも使用されているシロモノである。

http://kano.vis.ne.jp/erial/

さて、これを改造してレスに対してもメアドを入力可能にしてやろう、というわけである。

具体的作業は、

  1. レス投稿フォームに「mailto」記入欄をつくる
  2. 表示のルーチン内で、名前のところにmailtoのリンクをはる
  3. 値が途中で削除されないかどうか調べる

の3行程です。最初のふたつはレタリングエンジンに、最後はライトエンジンに手を加えますです。

まず一つ目。 レタリングエンジンには reswindow という関数が入っています。これは文字通り、レス投稿フォームを書き出す関数です。この関数にはDHTMLのほうとNormalのほうとをif文で分岐させています。両方それぞれにフォームの書き出しが行われる記述がありますんで、nameとかkeyとか出力してるところに

print "mailto <input type=text name=\"email\" size=30 value=\"$COOKIE{'email'}\" class=\"fm\">\n";

とかという記述を追加してやりましょう。場所はお好きに。 配置を考えてBRなんかを打つのもいいかもしれません。これを2回(DHTMLもNormalも)行います。

これでテキストボックスが追加されました。きちんとクッキー文字列も読んでくれます。次に、リンクだ。

リンクなのですが、メインcgi(つまりealis.cgi)のほうに記述をすることももちろんできるのですが(似たような記述があり(親投稿用の)、まとめて記述するのが本当はよい)、メンドイのでレタリングエンジン内でぜんぶすませてしまいましょう。

関数 lettering 内では oyaflag というフラグを使って親記事か否かを判断してますので、ここでは子記事、すなわち、elseのほうに着目します。

print "\t<font color=\"$color\"><b>$name</b><!-- $ipaddr --> &gt;</font>\n";

なーんて記述を発見しましょう(どうもエンジンによって微妙にちがうみたいですがそのへんは臨機応変に)。ちなみにコメントでIPアドレスを表示してるようですね。自分はじゃまくさいのでこのコメント抜きましたが。

この直前にでも、

($email) && ($name = "<A href=\"mailto:$email\">$name</A>");

と一文入れましょう。これは、メアドの記入があればこのようにnameを書きかえようぜ!ってことですね。これでOKです。リンクがきちんとはられています。

しかーし。リンクの色が強制的に統一されて色彩的に美しくないですね。根本からスタイルシートで書き直すか、とりあえずインラインスタイルシートで逃げるかでしょう。まぁ逃げですが、後者なら、

($email) && ($name = "<A href=\"mailto:$email\" style=\"color:$color\">$name</A>");

こうですね。アンカーにスタイルを提供します。

んで、これでいいんですかにょーとか思ったのですが、どうもダメみたいです。まぁソース全部読めばわかるのですが、この方法で変更すると、「レスのメアド記入欄がリードオンリーになります」。どういう意味かというと、あそこを書き換えたりしてレスを打っても、反映されないんですよ!! メアドはそのまえのまま。メアドを変更するには、親記事を立ててやらなきゃならんのです。

やってられないですね(というか私の見逃し^^)というわけで、3番目、直しましょう。

ソースを見ると、親記事投稿でもレス投稿でもあのメアドボックスは名前を「email」になっています)。ということは、原因はwrite部分にありそうです。ということで、「投稿」ボタンを押すときに呼ばれる ealis_wri.cgi を読んでみましょう。

MAIN:
{
  require './ealis_cfg.pl';
  require 'jcode.pl';

  &startup;
  &check_input;
  &set_cookie;

  &file_lock;     # ロック後、&writeで記事書き込み

  do "$INI{'plug_mail'}" if($INI{'plug_mail'});

  &locate;
}
exit;

となっていまして、あーあ、あやしいのは set_cookie ですな。ここらへんで弾かれてるのか?と思い、ソースをすべて読んでみると、案の定 set_cookie のようだ。

# res時は補完
HOKAN:{
  $resno || last HOKAN;
    local($str);
  foreach ( split(/;/,$ENV{'HTTP_COOKIE'}) ) {
    local($key, $value) = split(/=/, $_);
    $key =~ s' ''g;
    if($key eq 'EALIS'){ $str = $value; last;}
  }
  $str || last HOKAN;

  $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
  foreach ( split(/,/,$str) ) {
    local($key, $value) = split(/:/, $_);
    if($key eq "url"){ $FORM{'url'} = $value;}
    elsif($key eq "email"){ $FORM{'email'} = $value;}
    elsif($key eq "icon" && $FORM{'icon'} eq "INHERIT"){
      $cook_icon = $value;
      $FORM{'icon'} = "";
    }
  }
}

ありまっしたねー。見事レスの時はクッキーデータに戻されてます^^ というわけで、この一行を、

  # elsif($key eq "email"){ $FORM{'email'} = $value;}

とコメントアウトしましょう。これでOKでしたとさ。

3.本日もCGI(笑)

00/07/23

いやー休みっていいねー(爆) なんか人間堕落しそうですよ、ゆったりしてると。まぁただの現実逃避なんなんですが、そんなことはいいとして、CGIのオハナシ。

今日はうちのカウンタを作り直してみました。そして公開してみたりもしました(笑) 変更点はなにかってぇと、実装面から言えば、進数が可変になりました。2〜16までの中からお好きな進数表示をお選びいただけます。それに乗じてウチのページも16進数化しました。だって「2進数見づらい!!」とか不評が多くて・・・残念。でも、10進にしないのはPaGeの意地のみによるところなので、あきらめてください(笑) 各自進数コンバータでもつかってください(とか言う奴^^)

で、内装面なんですが、大きな変化が。この手のCGIには、CGIさんにデータを送る機構が必要ですな。桁数、データファイル、進数etc... んで、このCGIさんはその「データ提供」の方法を3種類体験しております。で現在その3つめです。さて、歴史を振り返ってみましょうか。

●1つめ。データを各行ごとに記述し、そのデータファイル名を引数にとして与え、CGIくんが読む。

これは最初に使った方法です。でもコードとして

if (open(IN, "< $file_prop")) {
  $figure = <IN>; chop($figure);
  $divide = <IN>; chop($divide);

  # 中略

  close(IN);
} else { exit(1); }

なんてアヤシイことをしてたんですね(笑) いけてねぇ〜。書き方もかなりいけてませんね(笑) まぁ昔の話だ気にしない気にしない一休み一休み。

●2つめ。データをほとんど引数として渡してしまう。./cgi-bin/counter.cgi?data1+data2+data3+ .... って感じ。

実際いままでこれを使ってました。「でもどうせふたつみっつじゃあん、んじゃいいや」という適当な妥協のせいでそのままほったらかしに。んで、丁度作り直したんで、このさいデータ提供部分もいじるか、ということで...

●3つめ。データは.plファイルにそのまま書き、引数としてそのファイル名を与え、インクルードする。

これですね。俺的にいけてます(笑) ./cgi-bin/counter.cgi?setting とすると、例えば setting.pl をインクルードします。perlは、インクルードするファイルも変数として持てるんですよ。(実は PaGe は初めてこれを知ったときビックリ。)その中で、ふつうに変数に代入すれば良いんですな。

メインCGIで、

#!/usr/local/bin/perl

$file_setting = $ARGV[0] . '.pl';
exit(0) if (! -r $file_setting);
require $file_setting;

.
.
.

とやったんですよ。そして、たとえば setting を渡して、setting.pl を読みにいくとしましょう。これがそのsetting.plだったとしますです。

## setting file

$data_a = 1;
$data_b = 2;
.
.
.
$data_x = 5;

## end of file

でも、なぜかこれじゃ動きません。おまじないを追加。

1; # (または、 return 1; )

これが必要です。PaGeの不勉強のためこれの存在が必要な理由はいまいちわかっていません。require が値を返さなくてはならない、ということなのか?でも、中に関数を入れると普通に動くんだよなぁ。0 返すと動かないし。まぁ、ろくな本も読まずにやってるので許してください(誰にいってるんや・・・)

TOP | About | Diary | Readings | BBS | Programmings | Download | Link
Copyright© PaGe <0-vector@mionet.org> Ltd. 2000 All rights reserved.