#!/usr/local/bin/perl =PostScript (updated: 2010.06.20 Sun 21:26 JST) こんばんは!(日本は夜です) --------------------------------------- 2024.05.19 Sun 20:40:31 (日本時間) --------------------------------------- 2024.05.19 Sun 11:40:31 GMT(国際標準時) --------------------------------------- 2024.05.19 Sun 06:40:31 (New York時間) --------------------------------------- ■ 編 集 後 記 今回の更新テーマは、アマチュア・スタイル! を提言するこ と。アマチュア・ユーザーにとって重要なことは、何か『面白 いもの』を作る…それに尽きる。そんなわけで、 編集後記だけ でも CGI を駆使した面白そうなページ作り に挑戦してみた。 □■ ■■ ■■■□□ ■■■ ■□ ■■■ ■ ■■■ ■□■ ■■■ ■ ■■□■ ■■ ■ ■■■■■■ 『foosan分室』から『foussin分室』にリニューアルした今回 から、原則として CGI スクリプトのほぼ全てを自作、もしくは フリーソフトを自分なりに改造して使うことにした。 この編集後記では、『アマチュア・スタイル!』の本編で公開 した jpway.pl greg_calc.pl outf.pl という 3本 の サブルーチンを全て使ってみた。 これらのサブルーチンは、 『CGI 支援ツール』としても結構使えるので、このページはサ ンプルとしても参考になると思う。 ■□■ ■■■ ■ ■ ■□ ■■ ■ ■■■□■■ □■ ■■ ■■■□□ ■■■ ■□ ■■■ ■ ■■■ さて、このページは気に入ってもらえたかな。1文字ごとに色 を変えて表示することで『高層ビルの窓』の雰囲気が出せたと 思う。アクセスする時間によって、見栄えが変わる仕掛けを施 してあるので、早朝、昼間、夕方、夜…と、何度も見にきてほ しいなぁ。 □■ ■■ ■ □□ ■■■ ■□ ■■ ■ ■■■ ■□■ ■■■ ■■ ■□ ■■ ■ ■■■■ ■ このページのアイディアは、実はずいぶん前から温めていた のだが、自分に実現できるスキルがなかったので、しばらく放 置していた。こういうページは、手作業では絶対に作れない。 CGI を駆使して初めて実現できるものだ。読者の中には、これ を実現している CGI スクリプトのソースを見たいと思っている 人もいるだろうね…。 実は、今あなたが読んでいる『高層ビルに貼り付けられた』 文章こそ、あなたが望んでいる CGI スクリプトのソースコード なんです。 ほら、もうすぐ Perl コードが現れるよ。 =cut # 編集後記:"postscript.cgi" by foussin # 最新改訂:2010.06.20 Sun 21:26 # [ツインカラー(2色分解)風の表示を追加] # 改訂:2010.06.13 Sun 08:06 # 初版:2008.07.21 Mon 22:14 - 2008.07.30 Wed 11:17 #------------------------------------------------------- # ヘッダ部の出力 & 初期設定 #------------------------------------------------------- print "Content-type: text/html\n\n"; chdir; # とりあえず go to home chdir './cgi'; # CGI パスへ移動 require 'jpway.pl'; # 1文字ずつ色を変えるため必要 require 'greg_calc.pl';# 現在時刻を得る require 'outf.pl'; # 可変部文字列の置換 &jpway::init('jcode'); &greg_calc::init_outf('ymd.'); #------------------------------------------------------- # 現在時刻を求め、内部表現形式を # 出力形式に変換(yyyy.mo.dd Day hh:mi:ss [GMT]) #------------------------------------------------------- # 日本時間、GMT時間を求める ($gmt_csv, $jst_csv) = &greg_calc::both_time(time); $jst = &greg_calc::outf($jst_csv); # -9 $gmt = &greg_calc::outf($gmt_csv); # 0 $jst .= '(日本時間)'; $gmt .= '(国際標準時)'; # ニューヨーク時間を求める &greg_calc::set_tzone("EST5EDT", "keep"); $nyk_csv = &greg_calc::mold("now"); $nyk = &greg_calc::outf($nyk_csv); # +5 $nyk .= '(New York時間)'; &greg_calc::set_tzone("JST-9", "keep"); # JST に戻す #------------------------------------------------------- # 日本時間の時刻により『挨拶』『背景』『スタイルシート』 #『配色分布(文字の色)』を変える #------------------------------------------------------- # $jst から時刻を抽出 $jst =~ /\s(\d+):\d+:\d+/; $hr = $1; $mes = ''; # 時間によって『メッセージ(挨拶)』を変える # 04:00 - 06:59 ... 早朝(darkside) # 07:00 - 10:59 ... 朝 (daylight) # 11:00 - 15:59 ... 昼 (daylight) # 16:00 - 18:59 ... 夕方(darkside) # 19:00 - 03:59 ... 夜 (darkside) ($hr > 3 and $hr < 7) && ( $mes = 'おはよう!(日本は早朝です)' ); ($hr > 6 and $hr <11) && ( $mes = 'おはよう!(日本は朝です)' ); ($hr >10 and $hr <16) && ( $mes = 'こんにちは!(日本は昼です)' ); ($hr >15 and $hr <19) && ( $mes = 'こんにちは!(日本は夕方です)' ); $mes || ( $mes = 'こんばんは!(日本は夜です)' ); # 時間によって『スタイルシート』『配色分布(文字の色)』 # を変える # 07:00 - 15:59 ... 朝・昼(normal) # 16:00 - 06:59 ... 夜 (darkside) $css = ''; if ($hr > 6 and $hr < 16) { ## 昼 ## $css = 'normal.css'; $bg = '#cccccc'; # 高層ビルの色 @color= ("bb","cc","dd","ee","ff","ff"); } else { ## 夜 ## $css = 'darkside.css'; $bg = 'black'; # 高層ビルのシルエット @color= ("77","88","99","bb","dd","ff"); } # 時間によって『背景画像』を変える(画像は 4種類) # 04:00 - 06:59 ... 暁(dawn) # 07:00 - 15:59 ... 朝・昼(daylight) # 16:00 - 18:59 ... 夕(magic_hour, twilight, dusk) # 19:00 - 03:59 ... 夜(night_view, neonlights) # 暁・夕 → 基本的に夜の扱い(空の色が違う・街灯は疎ら) $bg_img = ''; ($hr> 3 and $hr< 7) && ($bg_img = 'dawn.jpg'); ($hr> 6 and $hr<16) && ($bg_img = 'daylight.jpg'); ($hr>15 and $hr<19) && ($bg_img = 'twilight.jpg'); $bg_img || ($bg_img = 'neonlights.jpg'); #------------------------------------------------------- # ツインカラー(2色分解)風の表示(2010.06.20 Sun 追加) # 配色を意図的に偏らせて、見栄えを劇的に変える #------------------------------------------------------- $twin = int(rand(4)); ($twin == 1) && ($r = 0); ($twin == 2) && ($g = 0); ($twin == 3) && ($b = 0); #------------------------------------------------------- # 可変部文字列の設定(outf.pl) #------------------------------------------------------- &outf::def("jst gmt nyk mes", $jst, $gmt, $nyk, $mes); #------------------------------------------------------- # html の出力[1] #------------------------------------------------------- print <<"EOSTR"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"><head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel=stylesheet type="text/css" href="../$css"> <title>foussin分室 ... 編集後記</title> <meta name="Author" content="foussin"> <meta name="Keywords" content="cgi,perl,japanese,post,script"> <meta name="Description" content="This page is Post Script in foussin's site"> <link rel="index" href="../index.html"> <style type="text/css"> <!-- body { background-image: url(../image/$bg_img); background-color: $bg; background-repeat: no-repeat; background-position: center center; background-attachment: scroll; } --> </style></head> <body> <div><a name="00"><img src="./ct-top/wwwcount_pa.cgi?hide+space.gif" width=3 height=3 alt="white space"></a></div> <div class=border-red><div class=size-1> #00 [foussin分室] ... [<a target="_top" href="../index.html"> <<:home (index.html)</a>] ... [<a target="_top" href="./top.cgi"> <<:top (top.cgi)</a>]<br> ....... [here: 編集後記] [<a target="_top" href="./postscript.cgi">フレーム解除</a>] ... [<a href="./sub/memo.html"> >:next (編集後記の編集後記)</a>] </div></div> <div class=bldg> EOSTR #------------------------------------------------------- # 1行単位のループ処理(CGI 本体)(重い…) #------------------------------------------------------- $file = "postscript.cgi"; ($ihandle) = &jpway::classify("IN", $file); open($ihandle, "<$file") or die; ($euc_zenkak, $code) = &jpway::anyway_euc(" "); ($hr< 7 or $hr>15) && ($night = 1); # 夜ならば… $night && (print "<pre>"); while (<$ihandle>) { $end && last; chomp; unless ($night) { # 昼なら、次のケースは出力しない $_ || next; ($_ =~ /^□■/ or $_ =~ /^■□/) && next; ($_ =~ /^\s*#?\-+$/) && next; ($_ eq "__END__" ) && ($end = 1); } $line = &outf::conv($_); ($euc_line, $code) = &jpway::anyway_euc($line); # 1文字ずつ色を変える($color[0] 〜 $color[5]) # &read_euc を使いたくて jpway.pl を require した @euc_line = &jpway::read_euc($euc_line); @euc_html = (); $htm = ""; $cc = ""; foreach $j (@euc_line) { # スペース(全角,半角)は色設定をスキップ(効率up) if ($j eq " " or $j eq $euc_zenkak) { $htm = $j; } else { $j =~ s/&/&/g; $j =~ s/</</g; $j =~ s/>/>/g; # 乱数で RGB の色を決める # <span style="color:#rrggbb;">$j</span> ($twin == 1) || ( $r = int(rand(6)) ); ($twin == 2) || ( $g = int(rand(6)) ); ($twin == 3) || ( $b = int(rand(6)) ); $rgb= "#$color[$r]$color[$g]$color[$b];"; $htm= "<span style=\"color:$rgb\">$j</span>"; } @euc_html = (@euc_html, $htm); } $euc_line = join("", @euc_html); $line = &jpway::restore($euc_line, $cc, $code); # 昼ならば… $night || ($line = "<pre class=window>$line</pre>"); print "$line\n"; } close($ihandle); #------------------------------------------------------- # html の出力[2] #------------------------------------------------------- $night && (print "</pre>"); # 夜ならば print <<"EOS"; </div><div class=border-red><div class=size-1> [<a href="#00"><:head #00</a>] ... [<a target="_top" href="../index.html"> <<:home (index.html)</a>] [<a target="_top" href="./top.cgi"> <<:top (top.cgi)</a>] [<a href="./sub/memo.html"> >:next (編集後記の編集後記)</a>] </div></div></body></html> EOS __END__ このページには、自作サブルーチンのほか 2種類のスタイル シート(.css)と 4種類の背景画像も使われている。なので CGI だけではこのページは再現できない。 □■ ■■ ■■■□□ ■■■ ■□ ■■■ ■ ■■■ ■□■ ■■ ■□ ■■■ ■ ■■■□□■ ■■ ■□ 本当は…。このアイディア、映画のエンディング・ロールで 使いたかったんだけど、foussin にはフィクション作家として の才能はないので、それは断念した。 誰か、やってみない? ウケると思うよ、きっと。