インチキおみくじを作ろう

トップ > プログラミング研究 > インチキおみくじ
一つ前にもどる 目次にもどる 次のページへ

インチキおみくじを作る - 前回の応用

以上は、時間によってメッセージを替える、というプログラムだったのですが、もう少しゲーム性を持たせて見ましょう。

01: #!/usr/local/bin/perl
02:
03: # ここで、サーバーから日時の情報を取得します。
04: ($sec,$min,$hour,$day,$mon,$year,$week) = localtime(time);
05:
06: # 時間帯によってメッセージを分けるための処理です。
07: @message=("大吉","中吉","小吉","小吉","吉","吉","吉","末吉","凶","大凶");
08: $sec = chop $sec;
09:
10: # ここからHTMLの表示です。
11: print "Content-Type: text/html\n\n";
12: print "<html><head><title>test</title></head>";
13: print "<body>";
14: print "本日 $mon 月 $day 日の運勢!<br>\n";
15: print "$message[$sec]";
16: print "</body></html>";
17:
18: __END__

*左端の番号は便宜的に付けた行番号です。

このプログラムが起動されると、画面には今日の運勢が表示されます。おみくじですね。

ちょっとインチキといえばそうなのですが、、、おみくじの出る運勢を、引いた時間(ここでは、秒の一桁目)で決めています。ちゃんとするにはランダムを使うとかできるのですが、、、ランダムの説明も面倒だったので、こんな方法もある?くらいに思ってください。

先ほどのプログラムと変わった所を解説すると、、、 先ほどは、時間の変数 $hour の大きさを「if」文で分岐する方法でしたが、今回は秒の変数 $sec の一桁目を使って、アクセスした時間で、内容を変えているだけです。

07: @message=("大吉","中吉","小吉","小吉","吉","吉","吉","末吉","凶","大凶");
08: $sec = chop $sec;

@messageはPerlでは配列変数をあらわします。この配列 $message[0] ~ $message[9] にそれぞれの内容を割り当てています。

次の「 $sec = chop $sec; 」ですが、chop とは、文字列から一番最後の文字だけを切り取る関数です。 chop $sec; で秒の数字から一桁目を取り出して、再び自分自身 $sec に代入しています。

この $sec を、メッセージを表示するときの配列の添え字として $message[$sec] というようにすることで、1のときは $message[1] の内容である「中吉」が、4のときは $message[4] の内容である「吉」が表示される仕組みです。単純でしょ?このサンプルは便宜上、時間を使ったかなりインチキな占いなので、本格的にしたい方は、ランダムや他のアルゴリズムを使ってがんばってみてください。

インチキおみくじのサンプルは「こちら」です。(別窓)

ブラウザ側とサーバー側でのプログラムの違い

ですが、この程度なら JavaScript等でもできちゃいますよね、、、。 JavaScript などで出来てしまうことは、できるだけ JavaScript等でした方がサーバーへの負荷も少なくなっていいのです。むしろ、最初の時間でメッセージを替えるプログラムの場合、はJavaScriptで書く方が適当かも知れません。ということで、JavaScript版を下に書いてみました。

(最初のプログラムのJavaScript版 - 他のHTML部は省略)

01: <script language="JavaScript" type="text/javascript">
02:
03: // 時刻の取得
04: cTime = new Date();
05:
06: month = cTime.getMonth();
07: date = cTime.getDate();
08: hour = cTime.getHours();
09: minute = cTime.getMinutes();
10:
11: // メッセージの分岐
12: message="Mid night!";
13: if (hour >=6){message="Good morning!";}
14: if (hour >=12){message="Good afternoon!";}
15: if (hour >=18){message="Good evening!";}
16:
17: // HTMLの表示
18: document.write("今日は "+month+"月"+date+"日です。<br>");
19: document.write("今は "+hour+"時"+minute+"分です。<br>");
20: document.write(message);
21:
22: </script>

この手のスクリプトはあちこちのサイトで使われていますよね?PerlなどのWebプログラムで書いても、JavaScriptで書いても基本的な動作はかわりません。が、強いて違いを挙げるとすれば、「時間」です。

Perlで書いたWebプログラムの場合、サーバーで「time変数」を利用してサーバーの時刻を基準にメッセージを出していましたが、JavaScriptは各個人が見ているパソコンの時間から「new Date();」が呼び出されるので、パソコンの時間が基準になります。ですから、もしも自分のパソコンの時間がずれていたりすると、メッセージの表示が個人でバラバラになる可能性があります。

また、当然、JavaScriptは各パソコンで動くので、ブラウザで「ソースの表示」を選ぶと、プログラムの中身が見えますが、Webプログラムは都度HTMLを生成していますので、HTMLしか見えません。

JavaScriptをオフにされると動かない

セキュリティー設定 最後に、欠点があるとすればブラウザ側で処理される JavaScript のようなプログラムは、見ている人がオフにしてしまうと、期待しているように動かないということです。

例えば、インターネットエクスプローラ(以下IE)の「ツール」>「インターネットオプション」の「セキュリティ」タブにあるセキュリティレベルを初期値の「中」から「高」にされてしまうと、JavaScriptのような機能が動かなくなってしまいます。

また、この例のように単純なものならいいのですが、複雑な処理を JavaScript系で書くと、ブラウザのバージョンに依存することが多く、IE6.0では動くけど、IE5.0ではダメだった・・・なんてことが多々あります。皆さんも、ページをあちこち見ていて「スクリプトエラー」に遭遇したことはないですか?

このように、見ている人のパソコンの環境に依存しないページが作れるとういのが Webプログラムの利点ということになりそうです。ただ、処理の結果を JavaScript で書き出す・・・という場合には注意が必要ですが。

実際の違いを2つのサンプル・プログラムで比較

ということで、時間によってメッセージが替わるプログラムを2つ比較してみてください。JavaScript版はソースの表示をするとプログラムが見えますが、PerlのWebプログラム版はHTMLだけしか見えません。(当然JavaScript版はJavaScriptがオンになっていないと見えませんが・・・)

また、JavaScript版の時刻とCGI版の時刻の違いに注目してみてください。JavaScript版は、いま使っているあなたのパソコンの時間が表示されていますが、CGI版はサーバー側の時間です。

  • JavaScript「こちら」をクリックで(別窓)
  • Perl & CGI「こちら」をクリックで(別窓)

次回は、いよいよ、サーバーへのファイルの保存を理解するために、カウンターを作ってみたいと思います。

一つ前にもどる 目次にもどる 次のページへ
(2003/6/9 by あいまい)

トップ > プログラミング研究 > インチキおみくじ

日時: 2008年01月24日 19:23
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク
トップに戻る
このエントリーの所属カテゴリ: プログラミング研究
このエントリーのタイトル:インチキおみくじを作ろう



copyright © 2000-2008 all rights reserved
あいまいモード・コム - rss2.0 atom
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク