Ruby で CGI > 出力方法 > 問題
アクセスした時点での時刻を表示する CGI を作成してください。文字を大きく表示するためには、html ファイルとして表示させる必要があります。
♪
<!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" > <style type="text/css"> <!-- body{background-color:navy;} p{font-size:3em;font-weight:bold;color:lime;text-align:center;margin:1em;} --> </style> <link rev="made" href="mailto:nobody@dummy.test"> <link rel="start" href="/" title="Root"> <title>現在時刻</title> </head> <body> <p>ただいまの時刻は●時●分●秒です。</p> </body> </html>
Time.now
で表されます。puts などで、そのまま文字として出力させると、Sat Sep 02 12:42:38 +0900 2006のような表記になります。♪
ヒントにあった html をそのまま使ってしまいましょう。最も簡単な答えとしては、
#!/usr/local/bin/ruby
print <<EOS
Content-Disposition: filename="now.html"
Content-Type: text/html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html>
<meta http-equiv="Content-Style-Type" content="text/css" >
<style type="text/css">
<!--
body{background-color:navy;}
p{font-size:3em;font-weight:bold;color:lime;text-align:center;margin:1em;}
-->
</style>
<link rev="made" href="mailto:nobody@dummy.test">
<link rel="start" href="/" title="Root">
<title>What time is it now?</title>
</head>
<body>
<p>#{ Time.now }</p>
</body>
</html>
EOS
Time.now のままだと読みづらいので、文章として読みやすくしてみます。日本語で、文字コードは Shift_JIS として、
#!/usr/local/bin/ruby -Ks t = Time.now print <<EOS Content-Disposition: filename="now.html" Content-Type: text/html;charset=Shift_JIS <!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" > <style type="text/css"> <!-- body{background-color:navy;} p{font-size:3em;font-weight:bold;color:lime;text-align:center;margin:1em;} --> </style> <link rev="made" href="mailto:nobody@dummy.test"> <link rel="start" href="/" title="Root"> <title>現在時刻</title> </head> <body> <p>ただいまの時刻は#{ t.hour }時#{ t.min }分#{ t.sec }秒です。</p> </body> </html> EOS
上記のやり方だと、html の編集がとてもやりづらいものとなってしまいます。 制作に当たり、「プログラムからコピー⇒htmlに貼付けて編集⇒htmlからコピー⇒プログラムにはりつけ」 というプロセスの繰り返しは、とても煩わしいです。 デザインの専門家との分業も難しくなります。 そこで、html ファイルと、プログラムファイルを別々に編集するのが効率の良いやり方でしょう。 html ファイルの中に特別な合い言葉を埋め込んでおいて、プログラムではその合い言葉を必要な文章に置き換えます。例えば…
html ファイル:ファイル名 temp.html
<!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" > <style type="text/css"> <!-- body{background-color:navy;} p{font-size:3em;font-weight:bold;color:lime;text-align:center;margin:1em;} --> </style> <link rev="made" href="mailto:nobody@dummy.test"> <link rel="start" href="/" title="Root"> <title>現在時刻</title> </head> <body> <p>ただいまの時刻は●時●分●秒です。</p> </body> </html>
プログラム:temp.html と同じディレクトリ内で
#!/usr/local/bin/ruby -Ks t = Time.now h = "%02d" % t.hour # 時 m = "%02d" % t.min # 分 s = "%02d" % t.sec # 秒 f = File.open("temp.html","r") html = f.read f.close print <<EOS Content-Disposition: filename="now.html" Content-Type: text/html;charset=Shift_JIS EOS print html.sub(/●/,h).sub(/●/,m).sub(/●/,s)
"%02d" % 3
は文字列の "03"
になります。書式を指定した書き出し。d はデカ(=10進数)の d 、2d の 2 は2桁で表示しろと云う意味。(書式化文字列 ⇒ self % args , sprintf)"hellow world".sub(/l/,"ろ")
は、"heろlow world"
になります。最初にパターンにマッチした部分を1ヶ所だけ置き換え。#!/usr/local/bin/ruby -Ks f = File.open("temp.html","r") html = f.read f.close t = Time.now html.sub!( /●/ , "%02d" % t.hour ) html.sub!( /●/ , "%02d" % t.min ) html.sub!( /●/ , "%02d" % t.sec ) print <<EOS Content-Disposition: filename="now.html" Content-Type: text/html;charset=Shift_JIS Content-Length: #{ html.length } EOS print html
str.sub!(/A/,"B")
は、str = str.sub(/A/,"B")
と結果的には同じです。代入をしない分、機械の負荷が少しだけ軽くなります。ただし、コピーせずにオリジナルを破壊してしまうので、これを使うときには慎重に。
a = "hello" b = a b.sub!(/e/,"A") puts aとすると、b を書き換えたはずなのに、「=」で結ばれた、a まで書き変わってしまいます。これを防ぐには、明示的に「複製(duplicate)」を行います。
a = "hello"
b = a.dup
b.sub!(/e/,"A")
puts a
arr = Time.now.to_a[0..2].reverse "ただいまの時刻は%02d時%02d分%02d秒です。" % arr
str = "ただいまの時刻は%H時%M分%S秒です。" Time.now.strftime(str)
以上です。