第7回 2003/1/21

復刻第37弾!!3年半まえ なんか連番が?? #006 の次が #007 でなく #008に??
まいいか

━━━━━━━━━━━━━━━━━━━━━━ 2003.01.21 Vol.659 ━━━━━━
 □■□
 ■□■□■□■□■ 日刊「WEBのツボ!!」
 □■□                      http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                           配信部数 2987部

【○】本日のお題 「システムはオブジェクト指向、そしてRubyで」(#008) ━━━━
                                                                 福井修@Fsys

 オブジェクト指向Ruby の時間です。本年も 「オープン&スタンダード」
  Linux,Ruby/Java,PostgreSQL,XML...
でよろしくお付き合いの程を。

旬の話題 WebSphere,Eclipse,MDA..から
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ WebSphere AS アナウンスメント テクニカル・ワークショップ−大阪開催#1−
──────────────────────────────────────
【日時】1月16日(木)9:30〜17:30【場所】日本アイ・ビー・エム 大阪事業所 3階
【内容】・WebSphere V5 概説 ・System Management
     ・Servlet2.3/JSP1.2/HTTP Session
     ・EJB2.0    ・WAS Workload Management    ・Performance
──────────────────────────────────────
行ってきました。大規模サイト構築(億〜)には、よさげですね。
Workload Managementあたりの 内容はなかなかです。
IBMは、WebSphere V5 に力が 入っています。いろいろ勉強になります。
■ WebSphere Business Center 
http://www-6.ibm.com/jp/software/websphere/

■ e-ビジネスは「オープン」へ向かう
http://www-6.ibm.com/jp/software/websphere/campaign/wv5/
とか 良いですね。IBMが オープン を支持すると世間(Late Majority)も認知します。

IBMといえば『 Eclipse 』。Javaなどの統合開発環境決定版 (オープンソース)
http://www.eclipse.org/

以前(もう1年以上経つのですねぇ 早い)下記記事があって ほー と思った記憶は
あったのですがこのIBMの統合プラットフォームが「 eclipse 」で、日本語版も昨年
出まして、使った人の評判が良くて、私も環境構築して使ってみました。
■ IBMオープンソース団体に4,000万ドル相当のソフトウェアを寄付 2001/11/06
http://www.idg.co.jp/lw/back/200111/20011106_01_news.html

『すばらしい』の一言です。WebSphereもEclipseを基盤に開発されているそうですし。

マイクロソフト .NET との競争が前提にあるのでしょうが、このようなすごい環境
が 無償で、入手できるのは、よい時代になったものです。
なおこの eclipseオープンソースなので、様々な付加モジュールも開発されてい
てPHPも使えるそうです。もちろんRubyも使えますね。
・ Eclipsプラグイン 
http://w3.cube-web.net/eclipse/index.php?%5B%5BRuby%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%5D%5DRubyプラグイン http://sourceforge.net/projects/rubyeclipseeclipse の紹介記事 http://bitarts.jp/tech/etc/eclipse.htmleclipseを使ってみよう http://muimi.com/j/eclipse/富士通も『Eclipse.org』にボードメンバーとして参画
http://pr.fujitsu.com/jp/news/2002/04/10.htmlモデリングに向けた態勢を整えるIBM〜開発を簡略化するEclipse2.0のMDAサポート
http://www.atmarkit.co.jp/news/200209/21/ibm.html
「..EMFこそが、WebサービスUMLおよびXMLの普及を加速する..」
 注)EMF(Eclipse Modeling Framework)と えらい 力 が入っているのです。

・ MDA Model Driven Architecture(モデル駆動型アーキテクチャhttp://www.omgj.org/technology/mda/

(補足)eclipse とは、日食、日蝕 という意味で、この命名には、
Javaに関してサンマイクロシステム(=SUN 太陽) を隠しても
という 暗喩 が込められていそうです。

前置きが長くなりましたが、本題です。Ruby CGIの続きです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■   Ruby CGI 入門 その3
──────────────────────────────────────
前回 http://www.melma.com/mag/02/m00020302/a00000427.html 
eRuby(embedded Ruby埋め込み型Ruby)を使いました。その続きです。

今回は eRuby を使って端末振り分けをやってみましょう。
──────────────────────────────────────
■ eRuby
──────────────────────────────────────
・ まず動作環境を確認します
 年末に Rubyは 1.6.8 へのバージョンアップがありましたので、
 http://arton.hp.infoseek.co.jp/
 より ActiveRuby.msi をダウンロードし、既に Rubyがインストール済みなら一旦
 旧バージョンをremoveし、再度.msiファイルをダブルクリックしインストールしま
 す。
  環境整備は、 http://www.melma.com/mag/02/m00020302/a00000350.html 参照
  但し PATH の設定記述が漏れていましたので、PATHにC:\Program Files\RUBY\BIN;
  (デフォルトの場合)も忘れずに追加します。
 
 DOSコマンドプロンプトで eruby --version と入力します。

  c:\> eruby --version
  ruby 1.6.8 (2002-12-24) [i586-mswin32]
  eRuby version 0.1.3

 などと反応すれば、OKです。

 Apacheの設定は、前回の設定を良く確認して下さい。

──────────────────────────────────────
■ まず eRuby で端末判定
──────────────────────────────────────
・ 前回 環境変数を出力しましたが、その応用例でCGI環境変数HTTP_USER_AGENTを
  読んで端末判定してみましょう。

 1) index.rhtml
  ファイル設置場所(例 d:\apache2\cgi-bin)に index.rhtml を作成

  index.rhtml ↓
  #!c:\program files\ruby\bin\eruby -Ks -C SHIFT_JIS
  <%
  require 'cgi'
  cgi = CGI.new
  if /MSIE/=~ENV['HTTP_USER_AGENT']
   msg = 'あなたはIEをお使いですね'
  elsif /DoCoMo/=~ENV['HTTP_USER_AGENT']
   msg = 'あなたはDoCoMoをお使いですね'
  elsif /Netscape/=~ENV['HTTP_USER_AGENT']
   msg = 'あなたはNetscapeをお使いですね'
  else
   msg = 'あなたがお使いの端末は、珍しいです'
  end
  %>
  
  
  
   <%=msg%>
  
  

 この/../で囲まれた文字列(正規表現ですが)の中に、'J-PHONE'や'PDXGW'...をい
 ろいろ入れては、各種多様な端末を判定することができる訳です。
 まあ いろいろありすぎて、どのレベルまでやるかは、ニーズ次第ですが。

 2) IEから http://localhost/cgi-bin/index.rhtml をリクエスト
   あなたはIEをお使いですね
  と出力されたらOK
 3) Netscapeから http://localhost/cgi-bin/index.rhtml をリクエスト
   あなたはNetscapeをお使いですね
  と出力されたらOK
 4) もしRuby動作マシンがグローバルアドレスを保持し、外部からアクセス可能なら
    http://グローバルアドレス/cgi-bin/index.rhtml をリクエスト
   あなたはDoCoMoをお使いですね
  と出力されたらOK

──────────────────────────────────────
■ eRuby で端末振り分け
──────────────────────────────────────
・ 端末判定ができれば、あとは個別処理を作り込めば良いですし 端末別にファイル
   を分ければ、redirect で、そのファイルに飛ばしてやることももちろんできます。

    例えば CGIクラスに以下のようなメソッドを追加して

    class CGI
      def script_absolute_uri
        host = server_name
        port = server_port
        host = host + ":#{port}" unless port == 80
        protocol = server_protocol.split('/', 2)[0]
        protocol.downcase!
        protocol + '://' + host + script_name
      end

      def script_absolute_uri_base
        script_absolute_uri.gsub(/[^\/]*\z/, '')
      end

      def redirect(uri)
        if defined? ERuby then
          ERuby.noheader = true
          Kernel.print header('status' => 'REDIRECT',
                              'Location' => script_absolute_uri_base + uri)
        else
          out('status' => 'REDIRECT',
              'Location' => script_absolute_uri_base + uri) { "" }
        end
      end
    end

  処理の区別を判定後、CGIクラスのインスタンスcgiで、redirectメソッド
  を呼び出してやれば良いわけです。
     :
    cgi.redirect(uri)
     :
  
  変数 uri には、所定のuri 例えば'http://fsys.net/webtubo/imode/'や
  'http://fsys.net/webtubo/ie/'とか'http://fsys.net/webtubo/nn/'とかの
  文字列を指すようにしておきます。

 --<補足解説>----------------------------------------------------------------
文字列のマッチングには、正規表現が便利です。

正規表現と文字列がマッチするか調べるには、「=~」 というメソッドがあり

  正規表現 =~ 文字列

という形で使います。

・ Ruby正規表現ユーザガイド
http://www.ruby-lang.org/ja/uguide/uguide05.htmlRubyチュートリアル正規表現
http://www.ruby-lang.org/ja/20020314.html

 -----------------------------------------------------------------

【プロフィール】
福井 修 ( FUKUI Osamu )o-fukui@po.iijnet.or.jp
福井システムリサーチ http://fsys.net/  主幹。システム構築歴25年。
日本リヌクス協会、神戸商工会議所情報処理学会 会員
関西ソーホ・デジタルコンテンツ事業協同組合デジタルハリウッド三宮校 Java講師