第10回 2003/4/

復刻ついに第40弾!!3年ちょいまえ

━━━━━━━━━━━━━━━━━━━━━ 2003.05.09 Vol.737 ━━━━━
 □■□
 ■□■□■□■□■ 日刊「WEBのツボ!!」
 □■□                     http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                         配信部数 2869部
【○】本日のお題 「システムはオブジェクト指向、そしてRubyで」(#010) ━━
                                                             福井修@Fsys

今回も、『オブジェクト指向スクリプト』デュエットに注目です。
「クライアントは Flash ActionScript、サーバサイドは Ruby」というのは、ほ
んとうに美しい組み合わせですね。

■ リッチクライアントもXML連携も Flash で決まり
前回の考察の後、ついつい Flash に注目する日々になっていますが、ますます
リッチクライアントは Flash で決まりという確信が深まります。

そしてさらにFlashが良くできていると思う理由が、増強されました。それは、
ActionScriptXML対応済みだという点です。私はシステム屋さんの視点でXMLに
は、2000年の頃から勉強会に参加したり注目していましたが、XML界は、いろい
ろ解決すべき課題は多く、思ったよりは歩みは遅々としているように見えます。

ActionScriptで提供されている基本オブジェクトのなかに データ連携の為の
「LoadVars オブジェクト」があります。(稲木さんの4.14/誰でもわかる Flash 
WEB 最前線(9)で詳細な解説がありました)そして「 XMLオブジェクト 」も燦然
と存在しているのです。

私は、まだ使っていませんが、解説を読むとなかなか良くできている模様です。

・ XMLSocketチュートリアル
http://faces.bascule.co.jp/tutorial/

補足)ソケット接続とは何?
http://hp.vector.co.jp/authors/VA003991/kouza/senior/kouza_socket.html

また ソケット通信は、 Ruby のもっとも簡潔さが顕現する場面です。

ソケットのオープンと接続は、次の一行です。
TCPsocket.open(host, service)

ファイルIOとほとんど同じ手間で、ソケット通信ができてしまいます。

標準入力とソケットの入力待ちも、次の一行です。
select(reads...)

RubyXMLを操作するのには昨秋 本も出ています。
・ Ruby de XMLRubyで始めるXML
http://www.amazon.co.jp/exec/obidos/ASIN/4274065006/249-0049646-6799548
 著者の須藤さんは、確か学生さんです(@_@

・ RubyXML (NQXML)
http://www.nslabs.jp/nqxml.rhtmlB2Bの本命  XML 連携も オブジェクト指向スクリプト で!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Ruby/ActionScript連携例
 いよいよ サーバサイドは Ruby で クライアントの Flash ActionScriptとの
 連携です。

 RubyCGI そのものについては、過去記事など参考に準備して下さい。
 Ruby CGI入門その1 http://www.melma.com/mag/02/m00020302/a00000401.html
 Ruby CGI入門その2 http://www.melma.com/mag/02/m00020302/a00000427.html
 Ruby CGI入門その3 http://www.melma.com/mag/02/m00020302/a00000455.html
 Ruby CGI入門その4 http://www.melma.com/mag/02/m00020302/a00000481.html

 シンプルに入力枠とボタンと出力枠があるレイアウトを作成し、入力枠に数字
 を入力し、ボタンをクリックすると、演算(掛ける2を実行)し結果を返す画
 面を作成します。

 【ステップ1 クライアントにFlash .swf 配置】
    最初のリクエストでクライアントに Flash表示
 
    クライアントブラウザ (IEなど) [今回の例ではsendAndLoad.swf]
         │           ↑
      リクエスト   レスポンス
         ↓           │
    WebServer (Apacheなど)
         │           ↑
      静的html(swfがパブリッシュされた分) [今回の例ではsendAndLoad.html]
         

 【ステップ2 クライアントがFlash上で入力して サーバのRubyが応答】
    クライアントブラウザ (IEなど上の .swf (ここでActionScriptが動作))
         │           ↑
       リクエスト   レスポンス
         ↓           │
    WebServer (Apacheなど)
         │           ↑
       CGI呼び出し  CGI応答
         ↓           │
    サーバサイド Rubyスクリプト [今回の例では calccgidata.rb]

1.最初にswfを応答する静的.html 

    
    
    
    
    LoadVarsオブジェクトを使ったデータの送受信
    
    
    
      
      
      
     
     
    
    
    

2.メールマガジンでのテキスト文での説明では、なかなか難しいのですが
    Flash にて 入力枠: 変数 dataIN と命名
               出力枠: 変数 dispValue と命名
               ボタン: 計算 要求を受け付ける
    を配置し、.fla を作成後、パブリッシュし .swf および .html を生成。

3.Flash画面上で 「計算」リクエストボタンのアクションに付けられた
    ActionScript

    on (release) {
      // Shift_JIS使用
      System.usecodepage = true;

      // 送信用LoadVarsオブジェクト
      mySendVars = new LoadVars();
      mySendVars.dataIN = dataIN;

      // 受信用LoadVarsオブジェクト
      myLoadVars = new LoadVars();
      myLoadVars.onLoad = function(success) {
        dispValue = myLoadVars.dataOUT;
      }
      mySendVars.sendAndLoad("calccgidata.rb",myLoadVars,"POST");
    }

4.入力に対して計算を行い結果を返すサーバサイドスクリプト

    
    #!c:\program files\ruby\bin\ruby -Ks

    require 'cgi'
    cgi = CGI.new

    # リクエスト入力
    dataIN  = cgi['dataIN'].to_s.to_i

    # 演算処理
    dataOUT = dataIN * 2

    # 応答出力
    print "Content-type: text/plain\n\n"
    print "dataOUT=#{dataOUT}"

 ・ 画面全体がリロードされずに部分更新される。
 ・ サーバサイドでは、html については、コーディングしなくて良い。
 など LoadVarsオブジェクトは、ほんとにこれからの本命ですね。

 なお 「ActionScript+CGIプログラミング」森巧尚著 ソフトバンク
 ISBN4-7973-2146-6 \2,600
 
 を参考にさせて頂きました。ありがとうございました。
 
 元 perl例 を Ruby に書き直しました。

 次回は、本格的にDB連携例を予定します。ではお楽しみに。

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