2004年2月11日号

【関西の元気なSOHOが熱く語る!】
━━━━━━━━━━━━━━━━━━━━━ 2004.02.11 Vol.9xx ━━━━━
 ■□■□■
 ■□■□■ 日刊「WEBのツボ!」
 □■□■□              http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                             配信部数 xxxx部
「続 システムはオブジェクト指向 Ruby & Flash」(#002)   
                                                        福井修@Fsys.NET

【○】本日のお題 「時刻・文字列操作プログラム入門」━━━━━━━━━━

こんにちは、Fsys福井システムリサーチの福井です。
早いものでもう2月。寒さの中にも日差しには春が近づいてきたのを感じます。

Webではプログラミングは、避けて通れないでしょうから、Webプログラミングに
役に立つテーマをいろいろ取り上げて行きます。

前回「人にやさしいプログラミング言語」注1)で Javaが最近目を向けてきた『
簡単さ(=開発容易性)』は、Rubyは、既に実現しているということを話題にし
ました。今回は、時刻出力の続きと文字列操作について実例を見て行きます。
どうぞ おつきあい下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Rubyでの時刻の操作復習 
────────────────────────────────────
 まず前回の続きで 時刻の操作を復習しておきます。 
ノートPCなどで WindowsXP を使っている環境を前提にし、お気軽にプログラム
してみましょう。

 Ruby がインストール済みであればコマンドプロンプトで
 > ruby -v
 ruby 1.8.1 (2003-12-25) [i386-mswin32]
 となるのを確認して
 > ruby -e "p Time.now"
 と入力しEnter を押して下さい。

 Sun Feb 02 15:34:11 東京 (標準時) 2004

 などと現在時刻が、応答されます。
 コマンドラインへの1行の入力で、 Timeクラスの nowメソッドを実行するオブ
 ジェクト指向プログラムが実行出来るのです。これは実に簡単ですね。

 Rubyスクリプト言語なので対話式でも3つの方法で実行することができます。
 その1 今回示したように Rubyインタプリターに コマンドラインの引数で直接
        プログラムを渡す方法
 その2 前回示したように 外部ファイルにプログラムを記述し、Rubyインタプ
        リターにそのファイルを指示する方法
 その3 これも前回示したように 対話処理支援プログラム経由で、1行ずつRuby
        インタープリターで実行してゆく方法

 短いものは、その1やその3の方法で実行するのも簡単ですので良いのですが
 長くなってくると、その2の方法で、プログラムソースをファイルに作成して
 それを読み込んで実行させるのが普通のやり方となります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Javaでの日付時刻の操作
────────────────────────────────────
 簡単でかつ奥深い Rubyに対して、重装備 Javaのケースも見ておきましょう。

Java開発環境のインストールは、以前にLILO Monthly Seminar 5th注2)でやった
のですがLinuxサーバが、対象であったので、最新版かつWindowsXPでのケースを
注3)に掲げておきます。

 J2SDK がインストール&設定済みであればコマンドプロンプトで
 > Java -version
と入力して
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)
 となればOKです。

次に 現在時刻を出力するプログラムソースファイル date0.javaを作ります。
Dateオブジェクトがポイントです。

import java.util.Date;
public class date0 {
  public static void main( String args ) {
    Date d = new Date();  // Dateオブジェクト生成
    System.out.println( d );
  }
}
これをコンパイルします。
 >javac date0.java

コンパイル結果エラーがないと date0.classファイルが生成されます。
この中間ファイルを Javaインタープリタで実行します。
(Javaは、コンパイルが必要かつ仮想マシン上での実行なので C++などより
  本質的に遅くなります。.NETもCLRで同様)

では 実行します。
 >java date0

 Mon Feb 02 16:01:17 JST 2004

 などと現在時刻が、応答されます。

ソースライン1行対7行。コンパイル不要対必要。
で、単純なものでも費やす時間(=コスト)に差がでてきます。
複雑なものは、単純な要素の組合せですから、複雑になるにつれその差は開いて
ゆきます。

Dateフォーマットを DateFormatクラス注4)のライブラリを使用して少し出力形
式を整形して出力文字列を見やすく出力してみます(2パターン)。
次のプログラムソースファイル date1.javaを作ります。

import java.text.DateFormat;
import java.util.Date;
public class date1 {
  public static void main( String args ) {
    Date d = new Date();  // Dateオブジェクト生成
    // その国の通常の日付フォーマットを取得
    DateFormat df = DateFormat.getDateTimeInstance();
    System.out.println( df.format(d) );

    // FULLパターン
    df = DateFormat.getDateTimeInstance
           (DateFormat.FULL, DateFormat.FULL, Locale.JAPAN);
    System.out.println( df.format(d) );
  }
}

コンパイルし、実行します。

2004/02/02 17:08:12
2004年2月2日 (月曜日) 17時08分12秒 JST

こちらの方が見やすいですね。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Rubyでの日付時刻の整形
────────────────────────────────────
 では Rubyでの日付時刻の出力文字列整形を見てみましょう。
 オブジェクトには、機能が内蔵されています。オブジェクトの機能を呼び出す
 のがメソッドです。
 Timeオブジェクトの各種メソッドを使うのが、ポイントです。Timeオブジェク
 トでは、演算も自在です。
 整形には、strftimeメソッド注5)を使うのがまあ便利です。

p Time.now.strftime("%y/%m/%d %H:%M:%S")

これで
2004/02/02 17:08:12
のフォーマットは OK です。

が
p Time.now.strftime("%Y年%m月%d日 %H時%M分%S秒")
こちらは strftime の制約で、うまくゆきません^^;;  地道に2つをまとめて

t = Time.now                              # 現在時刻のTimeオブジェクト
n = ['日','月','火','水','木','金','土']  # 曜日の配列
puts  t.strftime("%Y/%m/%d %H:%M:%S")     # 行末で改行
print t.year,'年',t.mon,'月',t.day,'日(',n[t.wday],'曜日) ' # 改行なし
print t.hour,'時',t.min,'分',t.sec,'秒 JST'

配列もでてきますし、改行コードの有無の使い分けなども出てきて段々プログラ
ムらしくなってきます。
これを プログラムソースファイル date1.rb に作成します。

> ruby date1.rb

で実行します。

2004/02/02 19:45:09
2004年2月2日(月曜日) 19時45分9秒

曜日やJSTを出力しないという応用例もすぐですよね。
Java で 曜日や JST を出さないようにするには、いろいろハマリます :-p

またマイクロ秒も出力できるので、プログラムの前後で時刻を出力すると実行時
間も測定できます。

t = Time.now
print t.strftime("%Y/%m/%d %H:%M:%S."),t.usec

事実上はmsecまでの精度ですが。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ JavaScriptでの日付時刻の整形
────────────────────────────────────
 Webのツボなのでブラウザで動作するJavaScriptの例も少し。
 なお行末の ; は、冗長なので積極的に除いています。
 Dateオブジェクトが、ポイントです。






これを HTML文 date1.htm に作成します。

なおタグを大文字で書くか小文字で書くかで、ポリシーがあります。
XHTMLでは、「XHTML文書は、すべてのHTML要素名及び属性名に小文字を使わなけ
ればならない。」注6)のでタグは、日頃から小文字で書くようにしています。
HTML4 の仕様書注7)では
「要素名は大文字小文字を区別しません(case-insensitive)」
ので大文字で書く慣用もあります。 

この date1.htmを ブラウザで直読みするとブラウザ上でJavaScriptが実行され
画面に時刻文字列が出力されます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ActionScriptでの日付時刻の整形
────────────────────────────────────
 Flash ActionScriptの場合も見ておきましょう。
 Dateオブジェクトが、ポイントとなるのはJavaScriptと当然同じです。
 まあ ほとんど同じといえば同じです。ActionScriptJavaScriptの標準規格
 ECMA Scriptの拡張実装なのですから。またまだFlash2004(ActionScript2)はさ
 わっていないのでFlashMXを対象にしています。
 
 なおここでも行末の ; は、冗長なので積極的に除いています。

 基本準備は他書などを見ていただくとして、ここではスクリプトの実体部のみ。
 sout,lout が MovieClip上の出力文字列です。

 t  = new Date()
 n  = "日月火水木金土"
 y  = t.getFullYear()
 mo = t.getMonth()+1
 d  = t.getDate()
 dn = t.getDay()
 td = n.charAt(dn)
 h  = t.getHours()
 mi = t.getMinutes()
 s  = t.getSeconds()
 sout = y+"/"+mo+"/"+d+" "+h+":"+mi+":"+s
 lout = y+"年"+mo+"月"+d+"日("+td+"曜日) "+h+"時"+mi+"分"+s+"秒")
 
これを ActionScript外部ソース date1.as に作成します。

1フレーム目のフレームスクリプトで
#include "date1.as"
で、ソースを読み込ませます。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ まとめ
────────────────────────────────────
 日付時刻の取扱は、奥深いですし、避けて通れません。今回はほんのさわりを
眺めてみましたが、『簡単さ』というのは、実現するには、舞台裏は、奥深い
のです。作りやすさは、良いモノをつくる動機・必要条件になるでしょう。
 
 では 次回からサーバサイドプログラミングに入ります。お楽しみに
  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 注釈、資料、参考情報
────────────────────────────────────
注1) 続システムはオブジェクト指向 Ruby & Flash」(#001)   
    「人にやさしいプログラミング言語http://www.melma.com/mag/02/m00020302/a00000690.html
注2)LILO Monthly Seminar 5th
    http://lilo.linux.or.jp/event/lms/200101/
    http://aks.dyndns.org/lms/lms0101.html#p2
注3) J2SDKインストール&設定
   1.ダウンロード
    http://java.sun.com/j2se/1.4.2/ja/download.html
    より最新版2004/2/2現在 1.4.2_03 J2SDK Win32版
    j2sdk-1_4_2_03-windows-i586-p.exe 49MB をダウンロードします。
   2.インストール
    ダウンロードしたj2sdk-1_4_2_03-windows-i586-p.exe をダブルクリック
    し、インストーラーの指示に従います。
    Defaultのインストール先は c:\j2sdk1.4.2_03 となります。
注4) java.textクラス DateFormat
    http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/text/DateFormat.html
注5) Ruby 時刻オブジェクト
    http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Time
注6) XHTML 1.0: 拡張可能ハイパーテキストマークアップ言語
    http://www.doraneko.org/xml/xhtml10/REC000126.html
注7) HTML4.0 Specification(jp)
    http://www.asahi-net.or.jp/~bd9y-ktu/html4rec_f/cover.html
    
【プロフィール&近況】
事務所を引っ越すことになりまして、場所選びや、家具選びなどにも時間をと
られてバタバタしています。

どなたか良い看板屋さんをご存じでしたら是非紹介してください^^

福井 修 ( FUKUI Osamu )o-fukui@po.iijnet.or.jp
福井システムリサーチ http://fsys.net/  主幹。システム構築歴27年。
システム構築エキスパート
日本Linux協会、神戸商工会議所情報処理学会、関西IT共同体 会員
関西ソーホ・デジタルコンテンツ事業協同組合デジタルハリウッド神戸校 Java講師