<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>ドキュメント</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/" />
    <link rel="self" type="application/atom+xml" href="http://asteria.jp/documentation/atom.xml" />
    <id>tag:asteria.jp,2010-05-18:/documentation//5</id>
    <updated>2012-02-03T07:48:03Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.04</generator>

<entry>
    <title>ASTERIA WARP4.6の新機能</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20120203-130000.html" />
    <id>tag:asteria.jp,2012:/documentation//5.585</id>

    <published>2012-02-03T04:00:00Z</published>
    <updated>2012-02-03T07:48:03Z</updated>

    <summary>バージョン4.6で新しい機能、強化された機能のコンポーネント、関数、アクションに...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="パイプラインサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="46" label="4.6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="強化された機能" label="強化された機能" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="新しい機能" label="新しい機能" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<p>バージョン4.6で新しい機能、強化された機能のコンポーネント、関数、アクションについて紹介します。<br />※細かな変更については<a href="http://asteria.jp/documentation/warp/4.6/UpdateNotes.txt">「更新履歴」</a>を参照してください。</p><p align="right"><a href="http://www.infoteria.com/jp/asteria/pd_warp46.php">ASTERIA WARP 4.6 のここがポイント！&gt;&gt;</a><br /></p>
<h2 id="f01_01">[Handbook対応]</h2>
<p>ビジネスシーンでのスマートデバイス活用を強力に支援するHandbookと連携可能なコンポーネントが追加されました。</p><p><b>「Handbook」タブ</b> <font color="red">(new)</font>
</p><ul class="adn-list"><li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookCreateFromFolder.html">HandbookCreateFromFolder - フォルダーからHandbook作成</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookCreate.html">HandbookCreate - Handbbook作成</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookDelete.html">HandbookDelete - Handbook削除</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookCreateChapter.html">HandbookCreateChapter - チャプター作成</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookUpdateChapter.html">HandbookUpdateChapter - チャプター更新</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookDeleteChapter.html">HandbookDeleteChapter - チャプター削除</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookCreateSection.html">HandbookCreateSection - セクション作成</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookUpdateSection.html">HandbookUpdateSection - セクション更新</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookDeleteSection.html">HandbookDeleteSection - セクション削除</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookExaminationResult.html">HandbookExaminationResult - 試験結果の取得</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookQuestionnaireResult.html">HandbookQuestionnaireResult - アンケート結果の取得</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookUserLog.html">HandbookUserLog - ユーザー操作記録の取得</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookCreateUser.html">HandbookCreateUser - Handbookユーザー作成</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookUpdateUser.html">HandbookUpdateUser - Handbookユーザー更新</a></li>
<li><a href="../../documentation/warp/4.6/flow/designer/index_component.html#HandbookDeleteUser.html">HandbookDeleteUser - Handbookユーザー削除</a></li>
</ul><br /><h2>[RDB処理の高速化とメモリ使用量削減]</h2>RDBGetコンポーネントにJDBCのsetFetchSizeに値をセットできるプロパティを実装しました。<br />※Oracle、SQL Serverなど商用RDB系のDB連携では10倍以上の高速化を実現<br />※MySQL、PostgreSQL系では実行時のメモリ使用量を低減<br /><br /><iframe src="http://www.youtube.com/embed/ldNCFpsMdFM" allowfullscreen="" frameborder="0" height="410" width="560"></iframe><br /><br /><h2>[WebDAV連携]</h2>RESTコンポーネントの機能拡張によりWebDAVインターフェイスへの連携が可能になりました。<br />１例としてMicrosoft SharePoint Server上のファイルリスト取得、アップロード、ダウンロードなどを実現することができます。<br /><br /><iframe src="http://www.youtube.com/embed/c7I2kPHAG2A" allowfullscreen="" frameborder="0" height="410" width="560"></iframe><br /><br /><h2>[RDBテーブル定義書作成ツール]</h2>データベースのテーブル構造、定義がExcelドキュメントとして出力できます。<br />より効率的なデータ連携、開発・運用・メンテナンスを支援します。<br /><br /><iframe src="http://www.youtube.com/embed/8ONag3QBq2Y" allowfullscreen="" frameborder="0" height="410" width="560"></iframe><br /><br /><h2>[Unicodeサロゲートペア対応]</h2>これまで制限となっていたUnicodeのサロゲートペアに対応しました。<br />→中国のシステムや標準以外の漢字のUnicode対応、用友ソフトや金蝶国際等、中国・韓国圏のシステムとの連携時の文字化け解消<br /><br />※サロゲート文字は、標準が約 65,000 文字の制限を越えて展開できる、既存の Unicode 規格の拡張。日本語、簡体字中国語、繁体字中国語、および韓国語向けのリリース済みまたは開発中の規格があります。<br /><br /><h2>[フローデザイナーユーティリティ]</h2><ul><li>Jarファイルのアップロードができるようになりました。JDBCドライバーやライブラリの配布が容易にできます。</li><li>フローデザイナーからフローサービス管理コンソールを開けるように管理オペレーション効率・利便性の向上しました。<br /></li></ul><h2 id="f03">[上記以外の新コンポーネント / マッパー関数 / アクション]</h2>
<h3 id="f03_02">◎マッパー関数</h3>
<p><b>「変換」タブ</b> - <a href="../../documentation/warp/4.6/flow/designer/index_function.html#HMAC.html">HMAC</a></p>
<h3 id="f03_03">◎アクション</h3>
<p><b>センサー</b>「Handbook」 <font color="red">(new)</font><br />
<a href="../../documentation/warp/4.6/pipeline/index_action.html#A0241.html">Handbookのアンケート結果を取込み</a> / <a href="../../documentation/warp/4.6/pipeline/index_action.html#A0242.html">Handbookのユーザーの操作記録を取込み</a> / <a href="../../documentation/warp/4.6/pipeline/index_action.html#A0240.html">Handbookの試験結果を取込み</a><a href="../../documentation/warp/4.5/pipeline/index_action.html#A0235.html"></a><br /></p>
<p><b>ジョイント</b>「Handbook」 <font color="red">(new)</font><br />
<a href="../../documentation/warp/4.6/pipeline/index_action.html#A0245.html">Handbookにセクションを追加</a> / <a href="../../documentation/warp/4.6/pipeline/index_action.html#A0244.html">Handbookを作成</a> / <a href="../../documentation/warp/4.6/pipeline/index_action.html#A0243.html">Handbookを削除</a></p><h2>[その他、追加機能]</h2><ul><li>IBM Domino Server連携→ 64bit 環境でのNotes連携の実現</li><li>フロー作成ウィザードでのサンプル拡充</li><li>パイプラインコーディネーター Internet Explorer 9対応</li></ul>]]>
        
    </content>
</entry>

<entry>
    <title>MQL (MIME Query Language for FlowService)</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20120130-090000.html" />
    <id>tag:asteria.jp,2012:/documentation//5.581</id>

    <published>2012-01-30T00:00:00Z</published>
    <updated>2012-01-26T03:03:56Z</updated>

    <summary>MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述する...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="branchstart" label="BranchStart" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mimedecode" label="MIMEDecode" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mql" label="MQL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="条件式" label="条件式" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述するためのASTERIA独自の言語です。MIMEデータからボディやヘッダーを取得する<a href="/documentation/warp/current/flow/designer/index_component.html#MIMEDecode.html">MIMEDecode</a>コンポーネントや、条件によって分岐する<a href="/documentation/warp/current/flow/designer/index_component.html#BranchFilterStart.html">BranchStart</a>コンポーネントなどで使います。<br /><br /><b>※</b>フローでメールを受信してその本文や添付ファイルを処理する場合には、メール監視トリガーを使うと便利です。指定したPOP3サーバーでメールを受信するとフローを起動するように実行設定を定義します。MQLを使うことなく、MIMEヘッダーはフロー変数に自動的に設定され、メール本文や添付ファイルが開始コンポーネントの出力ストリームになります。詳しくはフローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index.html#flowtype_mail.html">「はじめに」-「トリガーごとのフローの作成」-「メール監視起動のフロー」</a>を参照してください。<br />MIMEDecodeコンポーネントは、IMAPサーバーで受信したメールの処理や特殊なMIME形式からのデータの取り出しなどに利用します。<br /><br />MIMEの概要、MQLの書式と使用例について説明します。<br /><br /><ol><li><a href="#h1">MIMEとは</a></li><li><a href="#h2">MQLの書式</a></li><li><a href="#h3">MQLの使用例</a></li><li><a href="#h4">記述したMQLどおりに処理されない場合</a><br /></li></ol>※MQLの書式は、<a href="/documentation/warp/current/flow/designer/index_component.html#BranchFilterStart.html#mql">BranchStartコンポーネントヘルプのMQL</a>に同様の説明があります。<br /><br /><h2 id="h1">■1. MIMEとは</h2>MIME(Multipurpose Internet Mail Extension)とは、メールやHTTP通信等で利用される多様な言語やファイルを扱うための規格です。テキストデータやファイルなどをパートごとに持ち、１つのデータとして扱う形式になっています。パートとは各種データの区分で、１つのパートはヘッダーとボディで構成されます。ヘッダーには決められた情報が記述されており、メールであればFrom、To、Subjectなどがあります。<br /><br />MIMEには、シングルパートとマルチパートの２つのタイプがあります。<br /><br /><ul><li><b>シングルパート</b><br />メインパートのみのデータです。本文だけのメールなどがこれに該当します。<br /><img alt="mql-mimesingle.png" src="http://asteria.jp/documentation/images/mql-mimesingle.png" class="mt-image-none" style="" width="427" height="204" /></li><li><b>マルチパート</b><br />メインパートのボディの中に複数の異なるデータがそれぞれ子パートとして含まれています。本文に加え、ファイルが添付されているメールなどがこれに該当します。<br /><img alt="mql-mimemulti.png" src="http://asteria.jp/documentation/images/mql-mimemulti.png" class="mt-image-none" style="" width="516" height="741" /></li></ul><h2 id="h2">■2. MQLの書式</h2>MQLとは、MIME形式のデータのどの部分を取得するかを指定する条件式を記述するためのASTERIA独自の言語です。<br />MQLの書式は以下のようになっています。<br /><br />《例》<br /><b>part[0].header[xxx].attribute[yyy] = "zzz"</b><br /><br />＜パート句＞.＜ヘッダー句＞.＜属性句＞＜比較演算子＞＜値＞<br /><br />以下にそれぞれの要素について説明します。<br /><br /><h3>パート句</h3><b>part[0以上の数値または*]</b><br /><br />何番目のMIMEパートを対象とするかを指定します。<br /><br />《例》<br /><b>part[*]</b><br />すべてのパートが対象になります。<br /><br /><ul><li>添え字には0以上の数値、または「*」が使用できます。</li><li>添え字が[0]の場合はパートそれ自身が対象になります。part[0]はメインパートそれ自身が対象になります。シングルパートの場合、この記述になります。マルチパートの場合は、メインパートおよび子パートすべてのパートを指定したことになり、特にメインパートのヘッダー値を取得するときなどに使用します。</li><li>添え字が[1]以降の数値の場合はパートの添え字番目の子パートが対象になります。part[1]はメインパートの最初の子パートが対象になります。</li><li>添え字が[*]の場合はメインパートおよび子パートすべてのパートが対象になります。</li><li>子パートが階層化しているような場合には、part[1][2]（メインパートの1番目の子パートの2番目の子パート）のように記述できます。</li><li>パート句のみを指定した場合、header[*] = *が補われて評価されます。例えば、part[0] という記述は part[0].header[*]=* と同じです。 <br /></li></ul><h3>ヘッダー句</h3><b>header[ヘッダー名または*]</b><br /><br />条件の対象とするMIMEヘッダーを指定します。<br /><br />《例》<br /><b>part[0].header[Subject]</b><br />メインパートのSubjectというヘッダーが対象になります。<br /><b>part[*].header[Content-Type] = "text/plain"</b><br />すべてのパートの中でContent-Typeヘッダーが「text/plain」であるものが対象になります。<br /><br /><ul><li>添え字には文字列（ヘッダー名）、または「*」が使用できます。</li><li>添え字が[ヘッダー名]の場合は指定されたヘッダーが対象になります。ヘッダー名は大文字小文字を区別しません。</li><li>添え字が[*]の場合はすべてのヘッダーが対象になります。<br /></li></ul><h3>属性句</h3><b>attribute[パラメータ名または*]</b><br /><br />条件の対象とするMIMEヘッダーの属性(パラメータ)を指定します。<br /><br />《例》<br /><b>part[2].header[Content-Disposition].attribute[filename]</b><br />2番目の子パートのContent-Dispositionヘッダーのfilenameパラメータが対象になります。<br /><br /><ul><li>添え字には文字列（パラメータ名）、または「*」が使用できます。</li><li>添え字が[パラメータ名]の場合は指定されたパラメータが対象になります。パラメータ名は大文字小文字を区別しません。</li><li>添え字が[*]の場合はすべてのパラメータが対象になります。<br /></li></ul>ヘッダー句と属性句は評価の対象範囲が異なります。属性句は必要に応じて使用します。<br /><br />《例》<br /><b>Content-Disposition: attachment; filename="TEST.txt"</b><br /><br />ファイル名に「TEST」という文字列が含まれているかどうかを判定するには、次のように記述します。<br /><b>header[Content-Disposition].attribute[filename] ~= "TEST"</b><br /><br />ヘッダーの評価として、次のように記述すると結果はfalseになるため、注意してください。(パラメータはヘッダー句の評価対象に含まれないので、ヘッダー句の対象範囲は「attachment」という文字列に限られます。)<br /><b>header[Content-Disposition] ~= "TEST"</b><br /><br /><h3>比較演算子、値</h3>比較演算子は、「=（等しい）」「!=（等しくない）」「~=（値を含む）」が使用できます。値は、文字列、変数、ワイルドカード（*） が使用できます。ワイルドカードが指定された場合は値のチェックは行われず指定のヘッダー（またはパラメータ）の存在のみがチェックされます。<br /><br /><h2 id="h3">■3. MQLの使用例</h2>ここでは、MIMEDecodeコンポーネントを利用して実際にメールのMIMEデータから各データを取得するためのMQLの使用例を説明します。<br /><br />取得するのは、以下のデータです。<br /><ul><li>差出人、宛先、件名</li><li>メール本文</li><li>添付ファイル</li></ul>利用するMIMEデータ例は次のとおりです。(クリックして拡大)<br /><a href="http://asteria.jp/documentation/assets_c/2012/01/mql-sample-157.html" onclick="window.open('http://asteria.jp/documentation/assets_c/2012/01/mql-sample-157.html','popup','width=900,height=486,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://asteria.jp/documentation/assets_c/2012/01/mql-sample-thumb-550x297-157.png" alt="mql-sample.png" class="mt-image-none" style="" width="550" height="297" /></a><br /><br /><h3>差出人、宛先、件名</h3>差出人、宛先、件名は、メインパートのヘッダー名「From」「To」「Subject」にそれぞれ該当します。MQLはどのパートかを特定するための条件式なので、ここではメインパートを指定するだけになります。<br /><br />条件式プロパティ：<b>part[0]</b><b></b><br /><br />ヘッダー情報を取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をParameterListにし、ヘッダー名と同じフィールド名を指定することで取得することができます。<br /><img alt="mql-parameterlist.png" src="http://asteria.jp/documentation/images/mql-parameterlist.png" class="mt-image-none" style="" width="270" height="210" /><br /><br /><h3>メール本文</h3>メール本文は、この例ではメインパートのボディ内にある子パート１のボディに該当します。<br /><br />条件式プロパティ：<b>part[1]</b><b></b><br /><br />※この例では子パート１のボディがメール本文ですが、そうでないものもあります。受け取るMIMEデータの形式にあうようにMQLを記述してください。<br />《例》<br /><b>part[*].header[Content-Type] = "text/plain"</b><br />上記のようにContent-Typeヘッダーで特定する場合、テキスト形式の添付ファイルなども取得します。取得したくない場合は、受け取るMIMEデータの形式にあうようにMQLを記述してください。<br /><br />メール本文を取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をTextにします。<br /><br /><h3>添付ファイル</h3>添付ファイルは、この例ではメインパートのボディ内にある子パート２のボディに該当します。<br />子パート２を直接指定するには次のように記述します。<br /><br />条件式プロパティ：<b>part[2]</b><br /><br />添付ファイルが複数ある場合、すべての添付ファイルを指定したいときは次のように記述します。<br /><br /><b>part[*].header[Content-Disposition].attribute[filename] = *</b><br /><br />※この例ではContent-Dispositionヘッダーのfilenameパラメータにファイル名があることを判断していますが、そうでないものもあります。受け取るMIMEデータの形式にあうようにMQLを記述してください。<br /><br />添付ファイル名がContent-Typeヘッダーのnameパラメータに指定されている場合は、次の記述で取得することができます。<br /><br /><b>part[*].header[Content-Type].attribute[name] = *<br /><br /></b>添付ファイルを取得する場合は、MIMEDecodeコンポーネントの出力ストリーム型をBinaryにします。<br /><br />添付ファイル名は、MIMEDecodeコンポーネントのストリーム変数FilePathで取得することができます。(下図はMIMEDecodeコンポーネントの次に置いたマッパーで参照したところ)<br /><img alt="mql-stream.png" src="http://asteria.jp/documentation/images/mql-stream.png" class="mt-image-none" style="" width="496" height="202" /><br /><br />詳しくは、フローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index.html#variable_stream.html#variable_stream_system">「はじめに」-「詳細なトピック」-「変数」-「ストリーム変数」の「フローサービス定義のストリーム変数」</a>を参照してください。<br /><br /><h3>その他の例</h3>◎ファイル名に「.xls」が含まれる<br /><b>part[*].header[Content-Disposition].attribute[filename] ~= ".xls"</b><br /><br />◎ファイル名に「.xls」または「.xlsx」が含まれる<br /><b>part[*].header[Content-Disposition].attribute[filename] ~= ".xls" || part[*].header[Content-Disposition].attribute[filename] ~= ".xlsx"<br /></b><br />◎BranchStartコンポーネントで件名に「AAA」と「BBB」が含まれるMIMEデータのみ処理をしたい<br /><b>part[*].header[Subject] ~= "AAA" &amp;&amp; part[*].header[Subject] ~= "BBB"</b><br /><br />※「AAA」または「BBB」のどちらかの場合は右方向に処理は流れません。<br /><br /><h2 id="h4">■4. 記述したMQLどおりに処理されない場合</h2><h4>MQLに記述したデータが取得できない、または処理の分岐が正しく判断されていない</h4>MIMEデータの指定に誤りがある可能性があります。(特にパート句の添え字に数値を指定した場合に多くあります。)<br /><br />実際に受け取ったMIMEデータを一旦ファイルなどに出力して内容を確認し、MQLの各句が正しいかを確認してください。<br />MIMEデータの形式は、そのMIMEを作成したアプリケーション（メールの場合、メーラーなど）に依存するため、送信元が異なる場合はMIMEが異なっていることが多くあります。受け取るデータを処理可能なMIMEに統一するか、MQLで*を使用してマッチするような記述に変更するか、または複数のコンポーネントを利用するなどして対応してください。<br /><br /><h4>「MIMEのxxxxx(ヘッダー名など)が不正です」というメッセージが出力される</h4>記述したヘッダー名などで取得される値に対応していない可能性があります。RFCに準拠しているかどうかを確認してください。<br />]]>
        
    </content>
</entry>

<entry>
    <title>フローサービスでのメモリ不足について</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20111212-090000.html" />
    <id>tag:asteria.jp,2011:/documentation//5.566</id>

    <published>2011-12-12T00:00:00Z</published>
    <updated>2011-12-08T04:41:09Z</updated>

    <summary>フローサービスでメモリ不足が発生すると以下のいずれかまたは両方のメッセージがFl...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="トラブルシューティング" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[フローサービスでメモリ不足が発生すると以下のいずれかまたは両方のメッセージがFlowService.logに出力されます。<br /><br />java.lang.OutOfMemoryError: Java heap space<br />java.lang.OutOfMemoryError: GC overhead limit exceeded<br /><br />このメッセージは、フローを実行するプロセスであるFlowServiceがメモリ不足となり、処理に利用するメモリを確保できなかったことを示すものです。<br /><br />FlowServiceのメモリ解放は、JVM内部のメモリ管理機能であるガベージコレクション(Garbage Collection:GC)を利用しています。GCは実行時にヒープ内のオブジェクトが必要かどうかを判断して不要なオブジェクトのメモリ領域を解放します。<br />詳しくはFAQ<a href="http://asteria.jp/faq/20080722-110000.html">「フローサービスのメモリ解放(Garbage Collection)について教えてください」</a>を参照してください。<br />「GC overhead limit exceeded」は、ガベージコレクションの限界を超えた、つまりGCが既定の時間内に終わらなかったことによるものです。<br /><br />メモリ不足(OutOfMemoryError)が発生した状態になると、FlowServiceがメモリ不足で動作が不安定な状態となり、プロセスが異常終了する可能性があります。メモリ不足が発生しないように処理するデータ量を考慮して余裕を持ったサイジングを行うと共に、フローの実行に使用可能なメモリリソースを十分に考慮してフローを作成してください。使用するメモリの問題のため、ASTERIAのバージョンアップでは解決できません。<br /><br />※「java.lang.OutOfMemoryError: PermGen space」というメッセージは、JavaVMのPermanent領域が足りなくなったときに発生します。この場合は、FAQ<a href="http://asteria.jp/faq/20110929-090000.html">「java.lang.OutOfMemoryError: PermGen space」というメッセージが出力されます」</a>を参照してください。<br /><br />※フローサービスログではなく、フローサービス管理コンソールの画面に「java.lang.OutOfMemoryError」が表示された場合は、FAQ<a href="http://asteria.jp/faq/20101104-090000.html">「フローサービス管理コンソールでOutOfMemoryErrorが表示されます」</a>を参照してください。<br /><br /><h3>FlowServiceのメモリ使用状況を確認する</h3>FlowServiceのメモリ使用状況を確認するには、フローサービス管理コンソールのグラフ画面またはfsmonコマンドを使用します。「OutOfMemoryError」のメッセージが出力された時間帯のメモリ使用状況を確認してください。<br /><br />fsmonコマンドの使い方については、フローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index_admin.html#monitoring_fsmon.html">「運用ガイド」-「稼働監視」-「モニターツール」</a>を参照してください。<br />管理コンソールのグラフ画面については、<a href="/documentation/warp/current/flow/mc/status.html#flowgraph_top">フローサービス管理コンソール オンラインヘルプの「グラフ」</a>を参照してください。<br /><br /><h3>メモリ不足の対策</h3>メモリ不足への主な対策としては、次の３点があげられます。<br /><br /><b>1. 最大メモリサイズ(最大ヒープ領域)を変更する<br /></b><br />フロー管理コンソールの「設定」-「サービス」-「起動」の「最大メモリサイズ」に設定する値を大きくすることによりメモリ不足が改善される可能性があります。ただし、サーバーに搭載する物理メモリサイズやOS等の上限などによって設定可能な値に限界があるため、不用意に大きな値を設定しないよう注意が必要です。<br /><br />詳しくはFAQ<a href="http://asteria.jp/faq/20080722-140000.html">「フローサービスで使用するメモリの最大サイズを設定するときの注意点は？」</a>を参考にしてください。<br /><br /><b>2. フローの処理ロジックを変更する</b><br /><br />実際に作成されるフローの処理内容やフローの稼働状況などは多岐に渡るため、具体的な処理ロジックを提示することはできませんが、次のようなことを確認してください。<br /><br /><ul><li>レコード単位で処理が可能な場合は、1レコードずつループ処理をすることで、メモリ消費を抑制することができます。コンポーネントの「ループを開始」プロパティに「はい」を設定すると、1レコード(または複数レコード)ずつループ処理をすることができます。RDBGetコンポーネントでループ処理をする方法やRecordGetコンポーネントを使用する方法が特に有効です。</li><li>ループ処理の終了がEndResponseコンポーネントやLoopEndコンポーネントの場合、「出力形態」プロパティに「ストリームをまとめる」を設定すると、ループで少量ずつ扱っていたデータが全てまとめられるため、メモリ消費が大きくなります。後続のコンポーネントでストリームを扱う必要がなければ、「出力形態」プロパティに「最後のストリーム」を設定してください。</li><li>フローの終了でレスポンスを返す必要のないフローであれば、フローの終了コンポーネントをEndResponseではなくEndで終了するようにするとメモリ上に出力が保持されないようになります。<br /></li></ul>フローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index_admin.html#tuning_flow.html">「運用ガイド」-「パフォーマンス」-「パフォーマンスチューニング」-「フローのチューニング」</a>も参考にしてください。<br /><br /><b>3. 読み込むデータサイズを見直す<br /></b><br />データベース、ファイル、メール、FTP、HTTPなどによりフローが読み込む、または受信するデータサイズが大きいとメモリ不足が発生しやすくなります。コンポーネントで１度に読込むデータサイズを見直して処理ロジックを変更するなど工夫してください。<br /><br />※コンポーネント利用時の制限として、ファイルサイズが２GBを超えるファイルを処理することはできません。 <br />※データベースの場合、１つのコンポーネントで読み込む件数が数千、数万単位になるとメモリが大量に必要になります。使用されるメモリは、サーバーに搭載された物理メモリサイズやOS等の上限、フローサービスに設定した最大メモリサイズなどに依存するため件数による制限はありませんが、コンポーネントで１度に読込む件数を見直してください。<br /><br /><h3>FAQ</h3>◎<a href="http://asteria.jp/faq/20111205-090000.html">ガベージコレクションログを出力することはできますか？</a><br />
<br />◎<a href="http://asteria.jp/faq/20111201-090000.html">メモリ不足が発生したときに管理者へ通知することはできますか？</a><br />
<br />◎<a href="http://asteria.jp/faq/20111017-090000.html">64bit版フローサービスで使用するメモリの最大サイズに上限はありますか？</a><br /><br />◎<a href="http://asteria.jp/faq/20110808-090000.html">フローサービスでどのフローのメモリ使用量が高いかを特定できますか？</a><br /><br />◎<a href="http://asteria.jp/faq/20100702-090000.html">「Could not reserve enough space for object heap」というメッセージが出力されて起動できません</a><br /><tt></tt> ]]>
        
    </content>
</entry>

<entry>
    <title>フローサービスのトラブルシューティング</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20111124-090000.html" />
    <id>tag:asteria.jp,2011:/documentation//5.558</id>

    <published>2011-11-24T00:00:00Z</published>
    <updated>2011-11-24T01:10:48Z</updated>

    <summary>フローサービスの開発、運用時にトラブルが発生したときの対処方法について説明します...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="トラブルシューティング" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[フローサービスの開発、運用時にトラブルが発生したときの対処方法について説明します。<br /><br /><ol><li><a href="#h1">ログを参照してエラーの発生場所を特定する</a></li><li><a href="#h2">エラーに対する確認事項</a></li><li><a href="#h3">キーワードを使用して情報を検索する</a></li><li><a href="#h4">エラーの原因が特定できない場合</a><br /></li></ol><br /><h2 id="h1">1. ログを参照してエラーの発生場所を特定する</h2>エラーが発生またはサービスが異常終了した場合には、主にFlowServise.log、asteria.logを確認します。それ以外のログは、これらのログの内容を確認後に必要に応じて参照します。<br />まず、ログでエラーコードを確認します。<br /><br />例） AFRM_I_3001<br />　「エラーの分類」_「エラーのレベル」_「エラーの詳細番号」<br /><br />コードの「エラーレベル」がF(致命的エラー)またはE(エラー)で出力されている場所を確認し、「エラーの分類」でおおよそのエラーの原因を想定し、コードに続いて出力されたメッセージを確認します。<br /><br />ログの参照についてはドキュメント<a href="http://asteria.jp/documentation/20111121-090000.html">「フローサービスログ」</a>を参照してください。<br /><br /><h2 id="h2">2. エラーに対する確認事項</h2>1.でログを参照して発生している現象とエラーの原因を確認し、以下の事項をチェックします。<br />いずれの場合も、正常に動作していた状態から環境を追加、変更したことがあった場合はそれらの影響の有無を確認してください。<br /><br /><h3>発生している現象/エラーの発生場所</h3><ul><li><a href="#h3_1">サーバーの起動/停止</a></li><li><a href="#h3_2">フローサービス管理コンソール/フローデザイナー</a></li><li><a href="#h3_3">コンポーネントエラー</a><br /></li></ul><h5 id="h3_1">●サーバーの起動/停止</h5>【確認事項】<br />・サーバーを起動したアカウント、権限などを再度確認してください。<br /><br />FAQで次のカテゴリーまたは全体を検索、参照してみてください。<br /><a href="http://asteria.jp/faq/flow/install/">「インストール/バージョンアップ」</a><br /><a href="http://asteria.jp/faq/flow/environment/">「動作環境」</a><br /><a href="http://asteria.jp/faq/flow/operation/">「運用」</a><br /><br /><h5 id="h3_2">●フローサービス管理コンソール/フローデザイナー</h5>【確認事項】<br />・フローデザイナーの場合、ASTERIAサーバーとフローデザイナーのバージョンが一致しているか再度確認します。<br /><br />FAQで次のカテゴリーまたは全体を検索、参照してみてください。<br /><a href="http://asteria.jp/faq/flow/operation/">「インストール/バージョンアップ」</a><br /><a href="http://asteria.jp/faq/flow/mc/">「管理コンソール」</a><br /><a href="http://asteria.jp/faq/flow/designer/">「フローデザイナー」</a><br /><br /><h5 id="h3_3">●コンポーネントエラー</h5>FlowService.logに出力されたエラーコードが FLEX_E_2055 の場合、コンポーネントの実行エラーです。<br /><br />【確認事項】<br />・エラーコードに続いて出力されたメッセージの内容から原因を調査します。<br /><br />FAQでカテゴリー<a href="http://asteria.jp/faq/flow/message/">「エラーメッセージ」</a>または全体を検索、参照してみてください。<br /><br /><h5>▽データベース/FTP/メール/HTTP/SOAPなど</h5>外部システムと連携するコンポーネントの場合(データベース/FTP/メール/HTTP/SOAPなど)、接続先に問題がある可能性もあります。その場合は、エラーコードのメッセージから該当する接続先を調査し、適切な対処を行ってください。<br /><br /><b>◎ログから現象が発生した時間帯を確認し、その時間帯のネットワークの状態、接続先の稼働状態を確認します。<br /></b><b><br />◎接続先のサーバーがASTERIA以外から接続可能かを確認します。<br /></b><br /><b>◎データベースの場合、使用しているJDBCドライバーのバージョン、ファイルの設置場所、アクセス権限などを確認します。</b><br /><br /><h2 id="h3">3. キーワードを使用して情報を検索する</h2>キーワードを使って、ADN内の<a href="http://asteria.jp/faq/">FAQ</a>、<a href="http://asteria.jp/documentation/">ドキュメント</a>からエラーの内容を検索したり、<a href="http://asteria.jp/documentation/warp/current/index.html">製品マニュアル</a>で仕様や制限事項を確認したりしてください。<br />検索例：「タイムアウト」「メモリ」「SQL JDBC」「SSL」「HTTP」など<br /><br /><h2 id="h4">4. エラーの原因が特定できない場合</h2>以上でエラーの原因が特定できない場合には、下記の【提供情報】をご準備の上、サポートへお問い合わせください。<br />※サポートへの問い合わせには、製品購入とは別途、保守契約が必要になります。<br /><br />問い合わせの際のテンプレートを以下に用意しましたのでご利用ください。<br />・<a href="http://asteria.jp/documentation/files/extra.txt">データベース/FTP/メール/HTTP/SOAPなど外部連携について</a><br />・<a href="http://asteria.jp/documentation/files/server.txt">サーバーの起動/停止などサーバーについて</a><br />・<a href="http://asteria.jp/documentation/files/client.txt">管理コンソール/フローデザイナーについて</a><br />・<a href="http://asteria.jp/documentation/files/excel.txt">Excelコンポーネントについて</a><br />・<a href="http://asteria.jp/documentation/files/flow.txt">作成したフローの動作について</a><br />・<a href="http://asteria.jp/documentation/files/others.txt">上記以外</a><br /><br /><h4>【提供情報】</h4><b>◎ASTERIA WARPのバージョン<br /></b>例）ASTERIA WARP 4.5.1.5401 など<br /><br />使用しているASTERIAのバージョンは次の方法で確認することができます。<br /><br /><b>サーバーのバージョン<br /></b>&nbsp;&nbsp; ・フローサービス管理コンソールのフッター<br /><img alt="version_fsmc.png" src="http://asteria.jp/documentation/images/version_fsmc.png" class="mt-image-none" style="margin-left:20pt" width="550" height="199" /><br />&nbsp;&nbsp;&nbsp; ・フローサービス管理コンソールの「ヘルプ」-「サーバ情報」ページ<br />&nbsp;&nbsp;&nbsp; ・フローサービスのシステムログ(asteria.log)の起動時のログ<br />&nbsp;&nbsp;&nbsp; ・パイプラインコーディネーターの「Setting」-「システム情報」ページ<br />&nbsp;&nbsp;&nbsp; ・パイプラインサービスのシステムログ(pipelne.log)の起動時のログ<br />サーバーを起動しない状態では、[INSTALL_DIR]/licenseフォルダーのASTERIABuildNumber.txtファイルの中身で知ることもできます。<br /><br /><b>フローデザイナーのバージョン<br /></b>&nbsp;&nbsp;&nbsp; ・フローデザイナーのメニュー「ヘルプ」-「バージョン情報」<br /><img alt="version_designer.png" src="http://asteria.jp/documentation/images/version_designer.png" class="mt-image-none" style="margin-left:20pt" width="350" height="154" /><br /><br /><b>◎ASTERIA WARPのプラットフォーム(OS)、サービスパック<br /></b>例）Microsoft Windows Server 2008 R2<br /><br /><b>◎外部システムと連携している場合、接続先の製品名、バージョン、OSなど<br /></b>例）Microsoft SQL Server 2008, Windows Server 2008 R2<br /><br /><b>◎起きている現象<br /></b>できるだけ詳しい状態、行った操作手順、現象の発生頻度、発生のパターンなど<br />例）1日の最初に発生する<br />　　負荷が高い時に発生しやすい等<br /><br /><b>◎現象の再現性、手順、再現フロー<br /></b>弊社にて同様の手順を行った場合の再現性、その手順とフローなど<br /><br /><b>◎添付ファイルで送付するデータやログ等<br /></b>現象発生当日のフローの動作ログ<br />[INSTALL_DIR]/flow/logディレクトリ配下<br />- asteria.log(.yyyy-MM-dd)<br />- asteria-console.log(.yyyy-MM-dd)<br />- FlowAccess.log(.yyyy-MM-dd)<br />- FlowCompile.log(.yyyy-MM-dd)<br />- FlowService.log(.yyyy-MM-dd) <br />]]>
        
    </content>
</entry>

<entry>
    <title>フローサービスログ</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20111121-090000.html" />
    <id>tag:asteria.jp,2011:/documentation//5.559</id>

    <published>2011-11-21T00:00:00Z</published>
    <updated>2011-11-18T01:32:23Z</updated>

    <summary> ASTERIA WARPフローサービスが出力するログについて説明します。 フロ...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<div class="index">
ASTERIA WARPフローサービスが出力するログについて説明します。<br /><br />
<ol>
<li><a href="#h1">フローサービスのログ</a>
 <ol>
 <li><a href="#h1.1">ログの参照</a></li>
 <li><a href="#h1.2">ログの出力内容</a></li>
 </ol>
</li>
<li><a href="#h2">コードによるエラー判別</a>
 <ol>
 <li><a href="#h2.1">ASTERIA起動中</a></li>
 <li><a href="#h2.2">ASTERIA実行中</a>
  <ul>
  <li><a href="#h2.2.1">エラーの分類がFLCP</a></li>
  <li><a href="#h2.2.2">エラーの分類がFLEX</a>
   <ul>
    <li><a href="#h2.2.2.1">エラーコードがFLEX_E_2055</a></li>
    <li><a href="#h2.2.2.2">エラーコードがFLEX_E_2055以外</a></li>
   </ul>
  </li>
  <li><a href="#h2.2.3">エラーの分類がFLEG</a></li>
  <li><a href="#h2.2.4">エラーの分類がSCH</a></li>
  <li><a href="#h2.2.5">エラーの分類がFLCM</a></li>
  <li><a href="#h2.2.6">エラーの分類がHTTP</a></li>
  <li><a href="#h2.2.7">エラーの分類がNMON/AFRM</a></li>
  </ul>
 </li>
 </ol>
</li>
<li><a href="#h3">エラーが特定できない場合</a></li>
</ol>
<br />
<h2 id="h1">■1. フローサービスのログ</h2>フローの開発、運用時にエラーが起こった場合には、まず初めにエラーの原因を特定するために、フローサービスが出力する各種ログを確認します。<br /><br />フローサービスのログは[INSTALL_DIR]/flow/logに出力されます。<br />アプリケーションログは[INSTALL_DIR]/flow/log/application/[ログ設定名].logに出力されます。アプリケーションログのログ設定で「ログ設定名」を(なし)にすると、[INSTALL_DIR]/flow/log/FlowSerive.logに出力されます。<br /><br />各ログに出力される内容は以下のとおりです。<br />詳しくはフローサービスマニュアル<a href="http://asteria.jp/documentation/warp/current/flow/designer/index_admin.html#maintenance.html">「運用ガイド」-「メンテナンス」</a>を参照してください。<br /><br />
<table border="1">
<tbody><tr>
<td width="30%">asteria.log</td>
<td width="70%">フローサービス全般のログ。サービスの起動・停止などのログが出力されます。また、スケジュールを多用するなど場合によってはファイルサイズが大きくなります。</td>
</tr>
<tr>
<td>asteria-console.log</td>
<td>標準出力や標準エラー出力に出力されたログ。通常はほとんど出力されません。</td>
</tr>
<tr>
<td>FlowAccess.log</td>
<td>FlowServiceへのHTTPアクセスログ。</td>
</tr>
<tr>
<td>FlowCompile.log</td>
<td>フローをコンパイルした時のログ。</td>
</tr>
<tr>
<td>FlowProfile.log</td>
<td>フローデザイナーからフローの実行モードで「プロファイル」を指定をした場合のプロファイルデータ。その他の実行モードでは出力されません。</td>
</tr>
<tr>
<td>FlowService.log</td>
<td>フロー実行に関するログ。フローを短い間隔で頻繁に実行した場合やHTTPで多量のアクセスがある場合などはファイルサイズが大きくなります。</td>
</tr>
<tr>
<td>FTPService.log</td>
<td>FtpServiceの実行に関するログ。FtpServiceが起動されていない場合は出力されません。</td>
</tr>
<tr>
<td>アプリケーションログ</td>
<td>フローの各コンポーネントからアプリケーションログに出力したログ。</td>
</tr>
</tbody></table>
<br /><h3 id="h1.1">1.1 ログの参照</h3>ログを参照するには次の３つの方法があります。<br /><br /><ul><li>フォルダーに出力されたログファイルを直接テキストエディタなどで参照する。</li><li>フローサービス管理コンソールにログインして「状態」-「ログ」で参照する。(<a href="http://asteria.jp/documentation/warp/current/flow/mc/status.html#log_top">参照方法についてはマニュアルをご覧ください</a>)</li><li>フローデザイナーに同梱されているログビューアで参照する。(<a href="http://asteria.jp/documentation/warp/current/flow/designer/index_guide.html#logviewer.html">参照方法についてはマニュアルをご覧ください</a>)<br />ログビューアでは複数のASTERIAサーバーにログインしてログを参照することができます。</li></ul><h3 id="h1.2">1.2 ログの出力内容</h3>例）※実際には１行で出力されています。<br /><img alt="message.png" src="http://asteria.jp/documentation/images/message.png" class="mt-image-none" style="" /><br /><br />(1) 日時<br />　ログが出力された日時。<br />(2) 種別<br />　ログの種別(ログレベル)。FATAL, ERROR, WARN, INFO, DEBUGの５種類があります。<br />(3) カテゴリー<br />　ログのカテゴリー。各種ログによって内容は異なります。<br />(4) コード<br />　コードは次項で示す構成で出力されます。<br />　※ログによっては出力されないものもあります。<br />(5)メッセージ<br />　詳細情報が出力されます。<br /><br /><h4>コードの構成</h4>例） AFRM_I_3001<br /><br />　「エラーの分類」_「エラーのレベル」_「エラーの詳細番号」<br /><br /><h5>エラーの分類(3または4文字の英字)</h5>エラーの大まかな分類。主な分類の出力元は次のとおりです。<br /><br />NMON・・・ASTERIA WARP Monitorより出力される<br />AFRM・・・ASTERIA WARP FrameWorkより出力される<br />FLEG・・・FlowServiceより出力される<br />FLEX・・・FlowServiceより出力される<br />HTTP・・・通信障害などにより出力される<br />SCH・・・スケジュール障害などにより出力される<br />ASSN・・・セッション障害などにより出力される<br />ASCN・・・コネクション障害などにより出力される<br /><br /><h5>エラーのレベル(1文字の英字)</h5>F：致命的エラー <br />E：エラー <br />W：警告 <br />I：情報<br /><br /><h5>エラーの詳細番号</h5>4桁の数字。<br /><br />
<h2 id="h2">■2. コードによるエラー判別</h2>エラーが発生またはサービスが異常終了した場合には、主にFlowServise.log、asteria.logを確認します。それ以外のログは、これらのログの内容を確認後に必要に応じて参照します。<br /><br />まず、判別するためにエラーになったのが「起動中」か「運用中(フローの実行など)」かに切り分けます。<br /><br />
→ <a href="#h2.1">2.1 ASTERIA起動中</a><br />
→ <a href="#h2.2">2.2 ASTERIA運用中</a><br />
<br />
<h3 id="h2.1">2.1 ASTERIA起動中</h3>起動中に出力されるエラーは、サーバーまたはサービスの初期化処理で発生したエラーです。エラーメッセージの「エラーの分類」を確認します。<br /><br />例）<br />[2011-08-10T14:32:59.461 JST] ERROR [net,main] HTTP_E_1011: サーバーソケットの作成に失敗しました<br /><br /><a href="/documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br />
<h3 id="h2.2">2.2 ASTERIA実行中</h3>
エラーメッセージの「エラーの分類」を確認します。<br /><br />→ <a href="#h2.2.1">▼ エラーの分類がFLCP</a><br />→ <a href="#h2.2.2">▼ エラーの分類がFLEX</a><br />→ <a href="#h2.2.3">▼ エラーの分類がFLEG</a><br />→ <a href="#h2.2.4">▼ エラーの分類がSCH</a><br />→ <a href="#h2.2.5">▼ エラーの分類がFLCM</a><br />→ <a href="#h2.2.6">▼ エラーの分類がHTTP</a><br />→ <a href="#h2.2.7">▼ エラーの分類がNMON/AFRM</a><br />→ <a href="#h3">上記以外(→ エラーが特定できない場合)</a><br /><br /><h4 id="h2.2.1">▼ エラーの分類がFLCP</h4>コンパイルエラーです。<br />メッセージ部分を確認の上、フローデザイナーにて修正します。<br /><br /><h4 id="h2.2.2">▼ エラーの分類がFLEX</h4>フロー処理エラーです。<br />→ <a href="#h2.2.2.1">◎ エラーコードがFLEX_E_2055</a><br />→ <a href="#h2.2.2.2">◎ エラーコードがFLEX_E_2055以外</a><br /><br /><h4 id="h2.2.2.1">◎エラーコードがFLEX_E_2055</h4>コンポーネントの実行エラーです。<br /><br />
<b><i>ログを参照して「FLEX_E_2055」のエラーメッセージの内容から原因を調査します。コンポーネント実行エラー(FLEX_E_2055)の後に、フローの異常終了(FLEX_E_2001)が出力されます。</i></b><br /><br />
<b><i>外部システムと連携するコンポーネントの場合、接続先に問題がある可能性もあります。その場合は、エラーコードのメッセージから該当する接続先を調査し、適切な対処を行ってください。</i></b><br /><br />
よくある実行エラーについては<a href="http://asteria.jp/faq/">FAQ</a>のカテゴリー<a href="http://asteria.jp/faq/flow/message/">「エラーメッセージ」</a>などを参照してください。<br />
<br /><h4 id="h2.2.2.2">◎エラーコードがFLEX_E_2055以外</h4>フロー実行エラーです。FLEX_E_2055の前後に出力されることがあります。<br /><a href="/documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /><h4 id="h2.2.3">▼ エラーの分類がFLEG</h4>フローの処理エンジンのエラーです。<br /><a href="/documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /><h4 id="h2.2.4">▼ エラーの分類がSCH</h4>スケジューラーのエラーです。ログはasteria.logに出力されます。<br /><a href="/documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /><h4 id="h2.2.5">▼ エラーの分類がFLCM</h4>flow-ctrlの応答メッセージです。通常、ログには出力されません。<br /><a href="/documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /><h4 id="h2.2.6">▼ エラーの分類がHTTP</h4>HTTP通信の切断や不正なリクエストが送信された場合などに出力されます。<br />特に、エラーコードが HTTP_E_1001、HTTP_E_1015 の場合、通常は他のエラーログも同時に出力されますので、そちらのログを元に原因解析を行います。<br /><a href="../../documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /><b>HTTP送受信外部エラー：</b><br />　HTTP_E_1001～1006、HTTP_E_1009～1010、HTTP_E_1012、HTTP_E_1015<br /><b>HTTP送受信内部エラー：</b><br />　HTTP_E_1007<br /><br /><h4 id="h2.2.7">▼ エラーの分類がNMON/AFRM</h4>ASTERIAサーバーが出力するメッセージです。<br /><a href="../../documentation/warp/current/flow/designer/index_admin.html#error_code.html" target="_blank">「運用ガイド」-「詳細なトピック」-「エラーコード一覧」</a>でエラーコードを確認し、説明に対処方法がある場合は確認します。<br /><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>2フェーズコミット</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20110307-090000.html" />
    <id>tag:asteria.jp,2011:/documentation//5.250</id>

    <published>2011-03-07T00:00:00Z</published>
    <updated>2011-02-28T05:18:37Z</updated>

    <summary> はじめに 2フェーズコミットとは 2フェーズコミットの手順 prepareの役...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術資料" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<div class="index">
<ol>
<li>
<a href="#h1">はじめに</a>
</li>
<li>
<a href="#h2">2フェーズコミットとは</a>
<ol>
<li>
<a href="#h2.1">2フェーズコミットの手順</a>
</li>
<li>
<a href="#h2.2">prepareの役割</a>
</li>
<li>
<a href="#h2.3">XAとは</a>
</li>
</ol>
</li>
<li>
<a href="#h3">ASTERIAにおけるリカバリー処理</a>
<ol>
<li>
<a href="#h3.1">トランザクションマネージャー</a>
</li>
<li>
<a href="#h3.2">リカバリーマネージャー</a>
</li>
<li>
<a href="#h3.3">トランザクションの動作</a>
</li>
<li>
<a href="#h3.4">リカバリーの実行</a>
</li>
<li>
<a href="#h3.5">手動でのリカバリー</a>
</li>
</ol>
</li>
<li>
<a href="#h4">DBMS固有のトピック</a>
</li>
</ol>
</div>
<h2>
<a name="h1">1. はじめに</a>
</h2>
<p>ASTERIAではDBMSの2フェーズコミットをサポートしています。フローでデータベースの2フェーズコミットを使用するには、RDBコネクションの設定で「XA対応」プロパティを「はい」にします。これだけで使用を開始することができますが、2フェーズコミットでの正しい運用設計が無いと障害発生時に回復に時間がかかったり回復可能なデータを失ったりする可能性があります。</p>
<p>今回は、運用設計の参考として2フェーズコミットそのものについて解説し、ASTERIAでの実装について説明します。</p>
<h2>
<a name="h2">2. 2フェーズコミットとは</a>
</h2>
<p>2フェーズコミットとは、複数のデータベースに対する更新処理において相互のデータ整合性を確保しながらトランザクションを実行する手法のことです。</p>
<p>commitの前にprepareという手順を入れることによって、複数データベース更新時にそのうちのひとつだけがcommitされて他がrollbackされるといったような不整合が発生することを防ぎます。</p>
<h3>
<a name="h2.1">2.1. 2フェーズコミットの手順</a>
</h3>
<p>まず1フェーズコミットと2フェーズコミットのcommit時の手順の違いを簡略化した図に示します。</p>
<div class="image-container">図1 1フェーズコミット(フローの場合RDBコネクションの「XA対応」が「いいえ」)<br/>
<img src="/documentation/images/1phase-commit.jpg" alt="1フェーズコミット(フローの場合RDBコネクションの「XA対応=false」)" style="border-style:solid;border-width:thin;"/>
</div>
<br/>
<div class="image-container">図2 2フェーズコミット(フローの場合RDBコネクションの「XA対応」が「はい」)<p/>
<img src="/documentation/images/2phase-commit.jpg" alt="2フェーズコミット(フローの場合RDBコネクションの「XA対応=true」)" style="border-style:solid;border-width:thin;"/>
</div>
<br/>
<p>図2のように2フェーズコミットの場合はcommitを発行する前にそれぞれのDBMSに対してprepareを発行します。そしてすべてのDBMSに対するprepareが成功した場合にのみcommitが発行されます。</p>
<p>このように1フェーズコミットと2フェーズコミットの手順の違いはcommitの前にprepareが入るかどうかです。処理の途中で障害が発生したケースを考えてみると、1フェーズコミットではDBMS1のcommitを行った後にDBMS2の障害が発覚する、つまりDBMS2のcommitが行えずにデータの不整合が発生する可能性があるのに対し、2フェーズコミットではcommitの前にDBMS1、DBMS2の双方に対してprepareが発行されているのでその時点でどちらのDBMSにも問題がないことが確認されています。commitはprepareの直後、ほとんど時間をおかずに連続して行われるのでその間に障害が発生する可能性は極めて低く、データ整合性の保証度合が向上します。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>ユニーク制約違反やデータ長違反などの更新SQLの実行でエラーが発生した場合は、その時点ですべてのDBMSに対してrollbackが発行されるので1フェーズコミットの場合でも2フェーズコミットの場合でも処理内容に違いはありません。</p>
<p>つまり、通常のSQLの実行で発生しうるエラーに対しては1フェーズコミットでも十分に対処可能です。2フェーズコミットに優位があるのは主にネットワーク障害やハードウェア障害などの不測の事態に対してです。</p>
</div>
<p>この生存確認の機能だけでも2フェーズコミットの信頼性は1フェーズコミットに比べてはるかに高いと言えます。しかし、これだけではデータ不整合の発生する可能性を減らしてはいても依然としてそれが発生する可能性は残ります。prepareには生存確認以上の重要な機能があり、その機能によって万が一の障害発生時のデータ不整合の回避と回復が担保されています。次節ではprepareの重要な役割を説明します。</p>
<h3>
<a name="h2.2">2.2. prepareの役割</a>
</h3>
<p>DBMSの生存確認以外のprepareの重要な機能、それはprepareを発行すると<em style="color:red;">トランザクション情報がディスクに保存され、再接続後に処理を再開できる</em>という点です。これによって1フェーズコミットと2フェーズコミットの処理において、先の図では表現されなかった次のような大きな違いが生まれます。</p>
<ul>
<li>2フェーズコミットでは、prepare後にセッションが切れてもトランザクション情報はディスクに保存されているので、再接続後にトランザクションの継続(commitまたはrollback)が可能。<br/>1フェーズコミットでは、セッションが切れた場合はそのトランザクションはそれ以上の続行が不可能。</li>
<li>prepareによって保存されたトランザクション情報はDBMSをシャットダウンしても保持されるので、DBMS再起動後に再接続してトランザクションを継続することも可能。</li>
</ul>
<p>つまり、ネットワークやアプリケーションに一時的な障害が発生してトランザクションが中断してしまった場合、あるいはDBMSサーバーに突然の電源断やディスク容量不足のような物理的な障害が発生した場合でも、2フェーズコミットであれば復旧後にトランザクションの整合性を回復させることができます。</p>
<p>ASTERIAでの2フェーズコミットはこうした障害の際にも複数のDBMS間の整合性を維持したリカバリーを自動的に行います。</p>
<h3>
<a name="h2.3">2.3. XAとは</a>
</h3>
<p>冒頭で、ASTERIAで2フェーズコミットを行うにはRDBコネクションの「XA対応」プロパティを「はい」にすると説明しました。この「XA」とは、2フェーズコミットを行うための仕様(インターフェース)を定めたものです。概念的には「JDBC」や「JMS」などと同レベルの用語となります。</p>
<p>JDBC対応のデータベースであればJavaからDBMSの種別を意識せずにJDBCインターフェースを介してプログラミングを行うことができるのと同様に、XA対応のデータベースであればXAインターフェースを介してDBMSの種別を意識せずにプログラミングを行うことができます。</p>
<p>ただしASTERIAではDBMSがXAをサポートしていてもASTERIA側での対応が行われていないものはXAを使用することができません。(RDBコネクションの編集で「XA対応」プロパティで「はい」として保存しようとしてもエラーになります。)</p>
<p>ASTERIA WARP 4.5.1以降においてXA対応が行われているDBMSは以下の通りです。</p>
<ul>
<li>Oracle9i/10g/11g</li>
<li>SQLServer2000/2005/2008/2008R2</li>
<li>DB2 9.1/9.5/9.7</li>
<li>MySQL 5.0/5.1/5.5</li>
<li>PostgreSQL 8.2/8.3/8.4/9.0</li>
</ul>
<div class="adn-memo">
<h4>メモ</h4>
<p>今回の説明では触れていませんがXAではトランザクション開始時の処理手順についても定められています。</p>
<p>厳密にはトランザクション開始時にトランザクションID(Xid)が取得され、以降のトランザクションはトランザクションIDによって管理されます。再接続もトランザクションIDを元に行われます。</p>
</div>
<h2>
<a name="h3">3. ASTERIAにおけるリカバリー処理</a>
</h2>
<p>ここでは、ASTERIAにおけるリカバリー処理を説明します。</p>
<p>ASTERIAでは、リカバリー処理はトランザクションマネージャーとリカバリーマネージャーによって管理されています。</p>
<h3>
<a name="h3.1">3.1. トランザクションマネージャー</a>
</h3>
<p>トランザクションマネージャーは、フローにおけるトランザクション処理全体を管理し、トランザクションを適切にcommitまたはrollbackすることが主な役割です。2フェーズコミット使用時にトランザクション処理のエラーを検知すると、そのトランザクションをリカバリーマネージャーに渡します。1フェーズコミットの場合はこのリカバリー処理が発生することはありません。</p>
<p>2フェーズコミットと1フェーズコミットの処理の違いはすべてトランザクションマネージャーが吸収するので、フロー作成者やコンポーネント開発者はフロー実行時にどちらのトランザクションが使用されるかについて意識する必要はありません。</p>
<p>内部的には2フェーズコミットの場合はトランザクションの状態が逐次ファイルに保存され、リカバリー処理ははそれを元に行われます。</p>
<p>トランザクションマネージャーについては、フローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index.html#topic_transaction.html">トランザクション</a>も併せて参照してください。</p>
<h3>
<a name="h3.2">3.2. リカバリーマネージャー</a>
</h3>
<p>リカバリーマネージャーは2フェーズコミット使用時に必要となったリカバリー処理を実行します。フロー内で実行されるトランザクションがすべて1フェーズコミットの場合、リカバリーマネージャーは何もしません。</p>
<p>リカバリー処理が必要となるのは障害発生時のみなので、リカバリーマネージャーが仕事をすることはほとんどありません。</p>
<h3>
<a name="h3.3">3.3. トランザクションの動作</a>
</h3>
<p>次に、フローの実行中にどのようなエラーや障害が発生したかによって、1フェーズコミットと2フェーズコミットのトランザクションの動作がどうなるのかを説明します。</p>
<h4>
<a name="h3.3.1">3.3.1. フローが正常に終了した場合</a>
</h4>
<p>トランザクションが正常に終了した場合、つまりすべてのDBMSに対するcommitに成功した場合は、リカバリー処理が必要ないため1フェーズコミットと2フェーズコミットの動作に差異はありません。</p>
<h4>
<a name="h3.3.2">3.3.2. フロー内の処理がエラーとなった場合</a>
</h4>
<p>フロー内でRDBPutコンポーネントやSQLCallコンポーネントによる更新SQLの実行がエラーとなった場合、例えばInsert処理におけるキー違反などが起きた場合は、それ以前に実行されたすべてのDBMSに対する更新がrollbackされて終了するのでトランザクション処理のリカバリーは必要ありません。FileGetコンポーネントでファイルが見つからないなど、DBMSの処理以外でエラーとなった場合も同様です。</p>
<p>この場合も1フェーズコミットと2フェーズコミットの動作に差異はありません。つまり通常範囲で起こりえるほとんどのエラーケースではリカバリー処理は不要であり、1フェーズコミットと2フェーズコミットのどちらのトランザクションを使用した場合でも結果は同じです。</p>
<h4>
<a name="h3.3.3">3.3.3. ネットワーク障害、またはDBMS障害が発生した場合</a>
</h4>
<p>フローの実行途中でネットワーク障害またはDBMSの障害が発生した場合は、ASTERIAサーバーとDBMSの間の通信処理においてエラーが発生することになります。この場合はリカバリー処理が必要です。こうした障害は図2のシーケンス図における「更新SQL発行」「prepare」「commit」いずれのタイミングでも発生する可能性があります。先にも述べたとおり「更新SQL発行」でエラーとなっただけであればリカバリーの対象とはなりませんが、このケースではそれに続くrollbackの実行もDBMSと通信できずにエラーとなります。</p>
<p>1フェーズコミットの場合、それ以上処理が継続できないので、そこでトランザクションが破棄されます。したがって、1つのDBMSに対してcommitを発行した後に障害が発生した場合はそこでデータ不整合が発生することになります。</p>
<p>2フェーズコミットの場合、トランザクションはそこでリカバリーマネージャーに渡され、リカバリーマネージャーによって適切にリカバリー処理が行われます。リカバリー処理の詳細については「<a href="#h3.4">3.4.リカバリーの実行</a>」で説明します。 </p>
<p>ネットワーク障害の場合は障害発生以降のすべての通信がエラーとなるので、すべてのDBMSに対するトランザクションがリカバリー対象となりますが、DBMS障害の場合はエラーとなったDBMSへのトランザクションのみがリカバリー対象となります。</p>
<p>例えばDBMS1、DBMS2、DBMS3の3つのDBMSへの更新を行っていて処理途中にDBMS2に障害が発生した場合はDBMS1、DBMS3に対するトランザクションはrollbackされ、DBMS2のみがリカバリーマネージャーに渡されます。</p>
<div class="image-container">図3 リカバリーが必要な障害の例<br/>
<img src="/documentation/images/RecoveryExsample.jpg" alt="リカバリーが必要な障害の例" style="border-style:solid;border-width:thin;"/>
</div>
<br/>
<h4>
<a name="h3.3.4">3.3.4. ASTERIAの障害の場合</a>
</h4>
<p>フローの実行途中になんらかの理由によりASTERIAサーバーが異常終了する場合があります。</p>
<p>1フェーズコミットの場合、この場合の動作は不定です。ASTERIA側で実行可能なリカバリー処理は何もないので、DBMS側で不正となったセッションを強制終了するなどの操作が必要になることがあります。
DBMSによってはこのリカバリー処理を自動で行ってくれることもありますが、通常は手動でのリカバリー操作が必要です。</p>
<p>2フェーズコミットの場合は処理途中で中断されたトランザクション情報を保存したファイルが残っているので、ASTERIAサーバー再起動時にリカバリーが自動的に実行されます。</p>
<h3>
<a name="h3.4">3.4. リカバリーの実行</a>
</h3>
<p>リカバリーマネージャーでリカバリー処理が実行されるタイミングと処理内容は以下の通りです。</p>
<dl style="border: solid 1px #cccccc;padding: 1em;margin-left: 0em;margin-top: 0.5em;">
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">トランザクションマネージャーからリカバリー処理が渡された場合</dt>
<dd>
<p>フローサービス管理コンソールの「設定」-「サービス」-「フロー」-「フローエンジン」画面の「リカバリーインターバル」で指定した秒数が経過した後、リカバリー処理が実行されます。リカバリー処理に失敗した場合は「リカバリーリトライ回数」に達するまで間隔を置いて再試行されます。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">中断されたトランザクションが残っている場合</dt>
<dd>
<p>フロー実行中にASTERIAサーバーが異常終了した場合や、リトライ待機中のトランザクションが残っていた場合はASTERIAサーバーの起動時にリカバリー処理が実行されます。この場合リカバリー処理が実行されるのは1度だけでリトライは実行されません。</p>
</dd>
</dl>
<p>リカバリーに成功した場合や既定の回数のリトライを行っても成功しなかった場合はフローサービス管理コンソールの「リカバリーのメール通知」の設定によってメール通知されます。リカバリーが実行された場合は詳細な実行内容がFlowService.logに出力されます。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>リカバリー処理とは通常は再接続後のrollbackですが、他のDBMSへのcommitが成功した後に障害が発生した場合は整合性を維持するためにcommitが実行されます。</p>
<p>場合によっては再接続時にはDBMS側で何らかのリカバリー処理が行われていてASTERIA側でのリカバリー処理が不要になり、実行できないことがあります。その場合はリカバリーが成功したとみなして処理を完了します。</p>
</div>
<h3>
<a name="h3.5">3.5. 手動でのリカバリー</a>
</h3>
<p>障害が早期に回復した場合は上記のリカバリーマネージャーによって自動的にトランザクションがリカバリーされることが期待できます。しかし、既定回数のリトライ実行終了までに障害から回復しなかった場合は手動でのリカバリーが必要な場合があります。</p>
<p>このような場合は、DBMS側での調査や作業となるため、DBMSに付属する管理ツールを用いてリカバリー処理を行うことが多いですが、flow-ctrlの<a href="http://asteria.jp/documentation/warp/current/flow/designer/flow-ctrl.html#xa">xaコマンド</a>を用いてリカバリーを実行することも可能です。</p>
<p>xaコマンドはJavaのXAインターフェースの実装クラスであるXAResourceのメソッドを直接実行するコマンドです。</p>
<p>以下にXAResourceのメソッド実行によるトランザクションの状態遷移を示します。</p>
<div class="image-container">図4 トランザクションの状態遷移<br/>
<img alt="XAResource2.png" src="/documentation/images/XAResource2.png" alt="トランザクションの状態遷移" style="border-style:solid;border-width:thin;" width="550" height="350" class="mt-image-none" style="" />
</div>
<br/>
<p>xaコマンドではstart以外のメソッドを発行することができます。recoverメソッドでトランザクション一覧を取得し、それからトランザクションIDを指定して他のメソッドを発行することが可能です。</p>
<p>xaコマンドで、ASTERIA以外のアプリケーションが実行中のトランザクションに対して、コマンドを発行しないでください。</p>
<p>トランザクションがASTERIAサーバーによって実行されているものであるかどうかは<a href="http://asteria.jp/documentation/warp/current/flow/designer/flow-ctrl.html#list-transaction">list transaction</a>コマンドや<a href="http://asteria.jp/documentation/warp/current/flow/designer/flow-ctrl.html#show-transaction">show transaction</a>コマンドで確認できます。</p>
<h2>
<a name="h4">4. DBMS固有のトピック</a>
</h2>
<p>各DBMSベンダーのXAインターフェースの実装はそれぞれのベンダーが配布するJDBCドライバに含まれています。現状ではXAの実装はJDBCほど安定していないので、2フェーズコミットを使用する場合はできるだけ新しいバージョンのJDBCドライバを使用することをお勧めします。</p>
<p>以下にいくつかのDBMSに固有のトピックを記載しますが、これらは保証された内容ではありません。</p>
<p>マイナーバージョンやサービスパック(パッチ)の差によっても動作が異なることがあるので使用の際には必ず製品のマニュアルを参照してください。</p>
<dl style="border: solid 1px #cccccc;padding: 1em;margin-left: 0em;margin-top: 0.5em;">
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">SQLServer 2000/2005/2008/2008R2</dt>
<dd>
<p>SQLServerには標準ではサーバー側にXA用のモジュールがインストールされていません。XA用のモジュールはストアドプロシージャとして提供されているのでインストールするためには管理ツール等からスクリプトを実行する必要があります。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">Oracle 9i/9iR2/10g/10g R2/11g/11g R2</dt>
<dd>
<p>Oracle9i、10gではXAインターフェースのrecoverコマンドを実行するためには以下の権限付与が必要です。</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
grant select on dba_pending_transactions to user;
grant execute on dba_system to user;
</pre>
<p>recoverコマンドが使用できずともASTERIAにおける2フェーズコミット、およびそのリカバリー処理は実行可能なので上記grant文の実行は必須ではありませんが、リカバリー処理実行時に警告が出力されるので可能であれば実行しておくことをお勧めします。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">DB2 9.1/9.5/9.7</dt>
<dd>ASTERIAのDB2での2フェーズコミットはJDBCのAppドライバを使用する場合のみサポートしています。Thinドライバではサポートされていません。</dd>
</dl>]]>
        
    </content>
</entry>

<entry>
    <title>Velocityテンプレート</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20110131-090000.html" />
    <id>tag:asteria.jp,2011:/documentation//5.314</id>

    <published>2011-01-31T00:00:00Z</published>
    <updated>2011-01-28T08:40:47Z</updated>

    <summary> Velocityとは リファレンス プロパティ メソッド 表記法 コメント リ...</summary>
    <author>
        <name>skonishi</name>
        
    </author>
    
        <category term="パイプラインサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術資料" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<div class="index">
<ol>
<li>
<a href="#h1">Velocityとは</a>
</li>
<li>
<a href="#h2">リファレンス</a>
<ol>
<li>
<a href="#h2.1">プロパティ</a>
</li>
<li>
<a href="#h2.2">メソッド</a>
</li>
<li>
<a href="#h2.3">表記法</a>
</li>
<li>
<a href="#h2.4">コメント</a>
</li>
<li>
<a href="#h2.5">リファレンスとJavaの関係</a>
</li>
</ol>
</li>
<li>
<a href="#h3">組込リファレンス その1</a>
<ol>
<li>
<a href="#h3.1">$flow - フロー変数</a>
</li>
<li>
<a href="#h3.2">$local - ローカル変数</a>
</li>
<li>
<a href="#h3.3">$system - システム変数</a>
</li>
<li>
<a href="#h3.4">$exvar - 外部変数セット</a>
</li>
<li>
<a href="#h3.5">$encoding - 出力エンコーディング</a>
</li>
</ol>
</li>
<li>
<a href="#h4">指示子</a>
<ol>
<li>
<a href="#h4.1">#set</a>
</li>
<li>
<a href="#h4.2">#if</a>
</li>
<li>
<a href="#h4.3">#foreach</a>
</li>
<li>
<a href="#h4.4">#includeと#parse</a>
</li>
<li>
<a href="#h4.5">#macro</a>
</li>
</ol>
</li>
<li>
<a href="#h5">エスケープ</a>
</li>
<li>
<a href="#h6">組込リファレンス その2</a>
<ol>
<li>
<a href="#h6.1">$in - 入力ストリーム</a>
</li>
<li>
<a href="#h6.2">Stream</a>
</li>
<li>
<a href="#h6.3">Record</a>
</li>
<li>
<a href="#h6.4">JDOM</a>
</li>
<li>
<a href="#h6.5">$sys - 汎用ユーティリティ</a>
</li>
<li>
<a href="#h6.6">$xpath - XPathユーティリティ</a>
</li>
</ol>
</li>
<li>
<a href="#h7">拡張クラス</a>
</li>
<li>
<a href="#h8">Velocityの用途</a>
</li>
<li>
<a href="#h9">実践的な例</a>
<ol>
<li>
<a href="#h9.1">配列を使ったselect要素の作成</a>
</li>
<li>
<a href="#h9.2">範囲を使ったselect要素の作成</a>
</li>
<li>
<a href="#h9.3">テーブル内でのstyleの変更</a>
</li>
<li>
<a href="#h9.4">サブフローによる外側のHTMLの分離</a>
</li>
<li>
<a href="#h9.5">AJAXとの連携</a>
</li>
</ol>
</li>
</ol>
</div>
<p>今回はASTERIAでテンプレートを利用するときに使う技術であるVelocityテンプレートをご紹介します。主にフローのVelocityコンポーネントでの利用について解説していますが、パイプラインでも利用できます。</p>
<h2>
<a name="h1">1. Velocityとは</a>
</h2>
<p>VelocityとはApache jakartaプロジェクトで開発された「テンプレートエンジン」です。テンプレートエンジンとはどういうものであるかを説明するために、まずは単純なメール本文の作成にVelocityを利用する例をご紹介します。</p>
<p>例えば自社の主催するセミナーに参加していただいたお客様に対してお礼のメールを送信するケースを考えてみます。メール本文は次のような文章となります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
○○株式会社 山田太郎様

このたびは6月23日開催の「ASTERIA WARP体験セミナー」にご参加いただき
誠にありがとうございました。

。。。

ご質問等ございましたら営業担当、××(xxxx@infoteria.com)まで
お気軽にお問い合わせください。
</pre>
<p>セミナー参加者が10人いた場合は10人に対してメールを送ることになります。セミナーが毎月開催されるものであるなら毎月同じようなメールを送ることになるでしょう。</p>
<p>上記のようなお礼メールは誰に対して送信する場合でも内容はほとんど変わりません。この例の場合、送信先によって</p>
<ul>
<li>顧客の会社名</li>
<li>顧客の氏名</li>
<li>セミナー開催日</li>
<li>セミナー名</li>
<li>営業担当の名前</li>
<li>営業担当のメールアドレス</li>
</ul>
<p>だけを変更すれば残りの部分はそのまま使いまわすことができます。</p>
<p>このようなケースでベースとなるテキストに対し、一部を置き換えることで複数のテキストを生成できるようにする仕組みがテンプレートエンジンです。</p>
<p>この例のメール本文をASTERIAのVeloicityコンポーネントで作成する場合のテンプレート(ベースとなるテキスト)は次のようになります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:red;">$flow.CorpName $flow.UserName</span>様

このたびは<span style="color:red;">$flow.SeminarDate</span>開催の「<span style="color:red;">$flow.SeminarName</span>」にご参加いただき
誠にありがとうございました。

。。。

ご質問等ございましたら営業担当、<span style="color:red;">${flow.StaffName}</span>(<span style="color:red;">$flow.StaffMail</span>)まで
お気軽にお問い合わせください。
</pre>
<p>先に置き換える個所として挙げた部分がすべて「$flow.xxxx」というキーワードに置き換えられています。(一箇所キーワードが「{}」で括られているところがありますが今は気にしないでください。)</p>
<p>このようにテキスト中に「$xxxx」というキーワードを埋め込むことによってそれを実際の値と置き換えたテキストを生成することができるのがVelocityです。単純なテキスト置換だけではなく指示子と呼ばれる命令文を使用することで簡単なロジックを組み込むこともできます。</p>
<h2>
<a name="h2">2. リファレンス</a>
</h2>
<p>Velocityでは「$xxxx」のようなキーワードをテンプレート中に埋め込むと述べましたが、この「$」で始まるキーワードとそれに付随するプロパティとメソッドのことをリファレンスと言います。「$」で始まる単語自体はVelocityのドキュメントでは「変数」と呼ばれていますが、フロー変数やシステム変数などのASTERIAの変数概念と区別するためにここでは「リファレンス変数」と呼びます。</p>
<p>フローのVelocityコンポーネントではあらかじめ次のリファレンス変数が設定されています。</p>
<table border="1">
<caption>Velocityコンポーネントのリファレンス</caption>
<tr style="background-color: #eeeeff;">
<th>リファレンス変数</th>
<th>設定内容</th>
</tr>
<tr>
<th>$flow</th>
<td>フロー変数</td>
</tr>
<tr>
<th>$local</th>
<td>ローカル変数</td>
</tr>
<tr>
<th>$exvar</th>
<td>外部変数セット</td>
</tr>
<tr>
<th>$system</th>
<td>システム変数</td>
</tr>
<tr>
<th>$in</th>
<td>入力ストリーム</td>
</tr>
<tr>
<th>$sys</th>
<td>汎用ユーティリティ</td>
</tr>
<tr>
<th>$xpath</th>
<td>XPathユーティリティ</td>
</tr>
<tr>
<th>$encoding</th>
<td>出力エンコーディング</td>
</tr>
</table>
<p>先の例では「$flow.xxxx」というリファレンスを使用しましたが、これはフロー変数を参照するリファレンスです。</p>
<h3>
<a name="h2.1">2.1. プロパティ</a>
</h3>
<p>リファレンスではプロパティとメソッドが使用できます。</p>
<p>プロパティを参照するにはリファレンス変数の後ろに「.」(ドット) を置き、それに続けてプロパティ名を記述します。</p>
<p>リファレンス変数「$flow」ではプロパティとしてフロー変数名を指定することができます。例えばフロー変数「CorpName」に「インフォテリア株式会社」が設定されている場合、「$flow.CorpName」は「インフォテリア株式会社」に置き換えられます。</p>
<p>プロパティによって取得されたオブジェクトからさらにプロパティやメソッドが使用できることもあります。</p>
<p>プロパティの例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.UserName        - フロー変数「UserName」
$exvar.Exvar1.var1    - 外部変数セット「Exvar1」の変数「var1」
$system.RequestURL    - システム変数「RequestURL」
</pre>
<h3>
<a name="h2.2">2.2. メソッド</a>
</h3>
<p>メソッドを使用するにはリファレンス変数の後ろに「.」(ドット) を置き、それに続けてメソッド名を記述し、その後ろに「()」をつけてその中に引数のリストを記述します。引数には次のものが指定できます。</p>
<ul>
<li>リファレンス</li>
<li>文字列リテラル</li>
<li>数値</li>
<li>真偽値(true/false)</li>
</ul>
<p>メソッドとプロパティの違いは識別子の後ろに「()」をつけて引数が指定できるかどうかだけです。メソッドに引数がない場合でも「()」と空のカッコを指定する必要があります。</p>
<p>メソッドの例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$in.array(0).text()        - 1番目の入力ストリーム
$flow.UserName.strValue()  - フロー変数「UserName」の文字列
$sys.formatDate($flow.date1, "yyyy/mm/dd") - 日付型のフロー変数「date1」
                                             をフォーマットして表示
</pre>
<h3>
<a name="h2.3">2.3. 表記法</a>
</h3>
<p>ASTERIAでの具体的なリファレンスの使い方を説明する前にリファレンスの表記法をまとめておきます。リファレンス変数、プロパティ、およびメソッドで使用可能な文字は以下のとおりです。</p>
<ul>
<li>アルファベット (a・・z, A・・Z)</li>
<li>数字 (0・・9)</li>
<li>ハイフン ("-")</li>
<li>アンダースコア ("_")</li>
</ul>
<p>ただし識別子の先頭で使える文字はアルファベットのみです。つまり「$1ban」「$_temp」のようなリファレンス変数は認められませんし、「$日本語」のように日本語を使用することもできません。</p>
<p>有効なリファレンスの表記例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.var1 - フロー変数「var1」
$in.text() - 入力ストリームの文字列
$sys.formatDate($flow.date1, "yyyy/mm/dd") - 日付型のフロー変数「date1」
                                             をフォーマットして表示
</pre>
<h4>
<a name="h2.3.1">2.3.1. 正式表記</a>
</h4>
<p>リファレンスは生成するテキスト本文の中に埋め込まれます。そのためリファレンスの直後に別の語が置かれることも珍しくありません。例えば一章の例の</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.UserName様

このたびは$flow.SeminarDate開催の。。。
</pre>
<p>などはリファレンスが後続の文字と切れ目なしに使用されている例です。</p>
<p>この例の場合はリファレンス直後の文字が「様」「開」とリファレンス識別子として使用できない文字のためVelocityがリファレンスの区切りを間違うことはありません。ですが、リファレンス直後の文字が英数字であった場合はどうなるでしょうか？また、フロー変数として「var1」と「var11」が定義されている場合「$flow.var11」はどのように解釈されるでしょうか？</p>
<p>これらの場合、Velocityは識別子として使用できない文字が現れたところをリファレンスの区切りとして扱います。つまり「$flow.var11」は決して「$flow.var1 + "1"」とは扱われませんし、「$flow.UserNameABC」では「UserNameABC」がプロパティ名として解釈されます。「UserNameABC」というプロパティが存在しない場合は「$flow.UserNameABC」という文字列がそのまま出力され、仮に「UserName」あるいは「User」というプロパティが存在したとしてもその値が出力されることはありません。</p>
<p>こうした場合に対応するときに使うのが正式表記です。正式表記ではリファレンスの「$」に続く部分を「{}」で括ります。</p>
<p>正式表記の例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
${flow.UserName}ABC
${flow.var1}1
${in.text()}
</pre>
<p>正式表記を使用することでリファレンスの区切りを明示することができます。一章の例で「${flow.StaffName}($flow.StaffMail)まで」の部分で正式表記が用いられているのは、そうしないと後続のカッコによって「StaffName」がプロパティではなくメソッドとして解釈されてしまうためです。</p>
<h4>
<a name="h2.3.2">2.3.2. 沈黙表記</a>
</h4>
<p>前節でリファレンスで存在しないプロパティを指定した場合には「$flow.UserNameABC」のようにリファレンス指定の文字列がそのまま出力されると説明しましたが、このようにリファレンス文字列がそのまま出力される場合には次のものがあります。</p>
<ul>
<li>存在しないリファレンス変数を指定した場合</li>
<li>存在しないプロパティを指定した場合</li>
<li>存在しないメソッドを指定した場合</li>
<li>プロパティがnullを返す場合</li>
<li>メソッドがnullを返す場合</li>
<li>メソッドの返り値がvoidの場合</li>
</ul>
<p>これを回避するために用いられるのが沈黙表記です。沈黙表記ではリファレンスの「$」の直後に「!」を記述します。沈黙表記を使用した場合、上記のような場合でもリファレンス文字列ではなく空文字が出力されます。沈黙表記は通常表記と正式表記の両方で使用可能です。</p>
<p>沈黙表記の例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.email    ##通常表記
$!flow.email   ##沈黙表記
$!{flow.email} ##正式表記 かつ 沈黙表記

#*
実際には$flowのプロパティはnullの代わりに空文字を返すので、
あまり沈黙表記を使用する必要はありません。
*#
</pre>
<h3>
<a name="h2.4">2.4. コメント</a>
</h3>
<p>前節の例で「##」「#* ～ *#」という部分がありますが、これはVelocityのコメントです。テンプレート内に記述されていても出力結果には含まれません。</p>
<p>「##」以降の部分は1行コメントに、「#* ～ *#」で括られた部分はその範囲がコメントになります。</p>
<p>コメントの例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
このテキストは表示されます。 ## このテキストは表示されません。
このテキストは表示されます。
このテキストは表示されます。 #* このテキストは、複数行コメントの一部
なので表示されません。このテキストも表示されません。
このテキストもまだ表示されません。*# このテキストはコメントの外側
なので表示されます。
## このテキストは表示されません。
</pre>
<h3>
<a name="h2.5">2.5. リファレンスとJavaの関係</a>
</h3>
<p>Velocityを使う上ではJavaの知識は必要ありませんが、Javaの知識がある人にとってはそちらから理解した方がわかりやすいので、ここでリファレンスとJavaの関係について説明を補足しておきます。</p>
<p>リファレンス変数に設定されているオブジェクトは実はJavaのオブジェクトそのものです。
つまりリファレンスのメソッドとは設定されているJavaクラスのpublicメソッドそのものです。</p>
<p>ではプロパティとは何かというと、これは次のルールに従って実行されるメソッドの返り値です。</p>
<ol>
<li>getXXXX()メソッドとして定義されたメソッドの返り値<br/>プロパティ名に対応するgetterメソッドがある場合、その返り値がプロパティ値となります。</li>
<li>get(String propname) または get(Object propname)という名前のメソッドの返り値<br/>StringまたはObjectの単一引数をとる「get」という名前のメソッドがある場合そのメソッドにプロパティ名を渡した返り値がプロパティ値となります。</li>
</ol>
<p>例えばオブジェクトに「String getName()」というメソッドが定義されている場合、Velocityでは「$obj.Name」「$obj.getName()」のどちらの表記も使用できますが、この場合はプロパティを使用することが推奨されており、この文書でもプロパティとして扱っています。</p>
<p>メソッドまたはプロパティの返り値のオブジェクトは何でも構いません。Velocityは返り値のオブジェクトのtoString()を出力テキストとして使用します。</p>
<p>後述する #if や #foreach などの指示子と組み合わせるとVelocity内で自由度の高いプログラミングを行うことも可能です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.StaffMail.strValue().toLowerCase() ##文字列の小文字化
#set($array = $flow.var1.strValue().split(","))
##フロー変数をカンマ区切りで配列化
</pre>
<p>逆から言えば自作の拡張クラスを作成してリファレンス変数に割り当てる場合は、このルールに従ってプロパティとメソッドを設計します。</p>
<h2>
<a name="h3">3. 組込リファレンス その1</a>
</h2>
<p>ここでは変数を中心にフローの組込リファレンスの詳細を説明していきます。入力ストリームを表す「$in」とユーティリティについては指示子の説明の後に扱います。</p>
<h3>
<a name="h3.1">3.1. $flow - フロー変数</a>
</h3>
<p>「$flow」はフロー変数を表すリファレンスです。デザイナーで定義したフロー変数がプロパティとして参照できます。</p>
<p>フロー変数の変数名として日本語などリファレンスで使用できない文字を使用している場合は以下のようにgetメソッドを使用して参照します。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$flow.get("変数1")
</pre>
<p>フロー変数参照の返り値はValueクラスのオブジェクトです。
ValueクラスはASTERIA内でデータを扱う基本的なラッパークラスであり、変数やレコードのフィールドデータなどほとんどのデータはこのクラスでラップされます。</p>
<p>Valueクラスの代表的なメソッドを以下に示します。</p>
<table border="1">
<caption>Valueクラスのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>strValue()</td>
<td>なし</td>
<td>String</td>
<td>String型としての値</td>
</tr>
<tr>
<td>intValue()</td>
<td>なし</td>
<td>int</td>
<td>Integer型としての値</td>
</tr>
<tr>
<td>longValue()</td>
<td>なし</td>
<td>long</td>
<td>Integer型としての値</td>
</tr>
<tr>
<td>doubleValue()</td>
<td>なし</td>
<td>double</td>
<td>Double型としての値</td>
</tr>
<tr>
<td>decimalValue()</td>
<td>なし</td>
<td>BigDecimal</td>
<td>Decimal型としての値</td>
</tr>
<tr>
<td>dateValue()</td>
<td>なし</td>
<td>Date</td>
<td>DateTime型としての値</td>
</tr>
<tr>
<td>booleanValue()</td>
<td>なし</td>
<td>boolean</td>
<td>Boolean型としての値</td>
</tr>
<tr>
<td>byteValue()</td>
<td>なし</td>
<td>byte[]</td>
<td>Binary型としての値</td>
</tr>
<tr>
<td>isNull()</td>
<td>なし</td>
<td>boolean</td>
<td>値がnullの場合にTrueを返します</td>
</tr>
<tr>
<td>toString()</td>
<td>なし</td>
<td>String</td>
<td>strValue()と同じです</td>
</tr>
</table>
<p>フロー変数にはデータ型がありますが、そのデータ型に関わらず上記のメソッドでは自動的に型変換が行われます。(String型の変数であっても内容が数値を表す文字列であれば、intValue()メソッドでそれをint型の数値として取得できます。ただし、内容が数値でない場合は「0」が返ります。)</p>
<p>strValue()やintValue()などの各種メソッドは値がnullの場合でもnullを返すことはありません。値がnullの場合はstrValue()メソッドは空文字を返し、intValue()メソッドは0を返します。nullと空文字を区別する必要がある場合はisNull()メソッドを使用します。</p>
<p>ValueクラスのtoString()メソッドはstrValue()を返すので「$flow.var1」のような記述も指定のフロー変数が存在する限り結果がnullとなることはありません。したがって、指定のフロー変数が存在する限り出力結果に「$flow.var1」という文字列がそのまま出力されることはありません。</p>
<p>テンプレート内に値を埋め込むだけであればこれらのメソッドを使用する必要はありませんが、文字列を他のリファレンス変数に代入する場合や数値の演算を行う場合には必要になります。</p>
<p>また、「$flow」自体に定義されているメソッドは以下の２つのみです。</p>
<table border="1">
<caption>$flowオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>変数名を指定してフロー変数を取得</td>
</tr>
<tr>
<td>toString()</td>
<td>なし</td>
<td>String</td>
<td>フロー変数の一覧を返す</td>
</tr>
</table>
<p>toStringメソッドが定義されているのでテンプレート内に「$flow」とだけ記述した場合はフロー変数の一覧が出力されます。</p>
<h3>
<a name="h3.2">3.2. $local - ローカル変数</a>
</h3>
<p>「$local」はVelocityコンポーネントの「ローカル変数」タブで定義した変数を参照するリファレンスです。フロー変数がフロー内すべてに共通する変数であるのに対しローカル変数はそのテンプレート内だけで使用する変数です。</p>
<p>使用方法や注意点は「$flow」と同じです。</p>
<table border="1">
<caption>$localオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>変数名を指定してローカル変数を取得</td>
</tr>
<tr>
<td>toString()</td>
<td>なし</td>
<td>String</td>
<td>ローカル変数の一覧を返す</td>
</tr>
</table>
<p>ローカル変数の例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$local.var1
$local.get("変数1")
</pre>
<h3>
<a name="h3.3">3.3. $system - システム変数</a>
</h3>
<p>「$system」はシステム変数を参照するリファレンスです。使用方法や注意点は「$flow」や「$local」と同じです。</p>
<table border="1">
<caption>$systemオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>変数名を指定してシステム変数を取得</td>
</tr>
<tr>
<td>toString()</td>
<td>なし</td>
<td>String</td>
<td>システム変数の一覧を返す</td>
</tr>
</table>
<p>システム変数として使用できるものに何があるかはフローサービスマニュアルの「<a href="http://asteria.jp/documentation/warp/current/flow/designer/flowservice/variable_system.html">システム変数</a>」を参照してください。</p>
<p>システム変数の参照で使用できるのは英語表記のみです。日本語表記は使用できません。すべてのシステム変数はプロパティとして参照できます。</p>
<p>比較的よく使用するシステム変数にRequestURL(HTTPリクエストのURL)があります。HTMLフォームのactionに指定しておけば自分自身に対するリクエストとなります。あとにサンプルがありますが、検索条件と検索結果を同一ページに表示する画面を作成する場合などに便利です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;form action="<span style="color:red;">$system.RequestURL</span>" method="post"&gt;
...
&lt;/form&gt;
</pre>
<p>またWebから動作するフローでエラーが発生した場合に表示するページの中にExceptionDetail(エラー詳細)を埋めておくと原因究明が容易になることがあります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;html&gt;
&lt;body&gt;
&lt;p&gt;
エラーが発生しました
&lt;/p&gt;

...

&lt;!--
##HTMLのコメント内に埋めておくことで一般ユーザーの目には触れさせず
##ソースを表示した場合にのみエラー詳細を表示することができます。
<span style="color:red;">$system.ExceptionDetail</span>
--&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>
<a name="h3.4">3.4. $exvar - 外部変数セット</a>
</h3>
<p>「$exvar」は外部変数セットを参照するリファレンスです。フロー上に配置した外部変数セットを参照することができます。</p>
<p>外部変数セットは複数配置できるためフロー変数などに比べてリファレンスの表記が1階層が深くなります。最初に外部変数セット名を指定して次に変数名を指定します。外部変数セット名または変数名に日本語などのリファレンスで使用できない文字が使われている場合はgetメソッドを使用します。外部変数の種別(定数、リクエスト変数、セッション変数、アプリケーション変数)には関係なくすべて同じ指定方法で参照できます。</p>
<table border="1">
<caption>$exvarオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>ExternalVariable</td>
<td>外部変数セット名を指定して外部変数セットを取得</td>
</tr>
</table>
<table border="1">
<caption>ExternalVariablesオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>変数名を指定して外部変数セット内の変数を取得</td>
</tr>
</table>
<p>外部変数セットの例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$exvar.Exvar1.var1
$exvar.get("外部変数セット1").var2
$exvar.get("外部変数セット1").get("変数3")
</pre>
<h3>
<a name="h3.5">3.5. $encoding - 出力エンコーディング</a>
</h3>
<p>「$encoding」はVelocityコンポーネントの出力ストリーム定義で指定したエンコーディング名の文字列(Stringオブジェクト)です。主に生成するHTMLのmetaタグでcharsetを指定する場合に使用します。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;html&gt;
&lt;head&gt;
  &lt;meta http-equiv="content-type" 
           content="text/html; charset=<span style="color:red;">$encoding</span>" /&gt;
&lt;/head&gt;
...
&lt;/html&gt;
</pre>
<h2>
<a name="h4">4. 指示子</a>
</h2>
<p>指示子とはVelocityにおける処理命令のことで「#」で始まるキーワードで表現されます。「#if」「#foreach」といった指示子を使用することでテンプレートの中に分岐や繰り返しといったロジックを組み込むことができます。</p>
<h3>
<a name="h4.1">4.1. #set</a>
</h3>
<p>「#set」はリファレンス変数に対して値を代入する指示子です。代入の左辺はリファレンス変数となり右辺には以下のいずれかが使用できます。</p>
<ul>
<li>リファレンス(リファレンス変数、プロパティ、メソッド)</li>
<li>文字列リテラル</li>
<li>数値</li>
<li>配列</li>
<li>範囲(２つの整数間にある整数の配列)</li>
<li>真偽値(true/false)</li>
</ul>
<p>#setの例</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($str1 = $flow.var1.strValue()) ##フロー変数の文字列(String)
#set ($str2 = "aaa")                 ##文字列リテラル
#set ($num1 = $flow.var2.intValue()) ##フロー変巣の数値(int)
#set ($num2 = 123)                   ##数値
#set ($num3 = $num2 + 123)           ##数値演算
#set ($arr2 = ["一", "二", "三"]     ##配列
#set ($arr3 = [2000..2010])          ##範囲
#set ($flag = false)                 ##真偽値
#set ($arr1 = $flow.var3.split(",")) ##Stringのsplit関数の返り値(配列)
</pre>
<h4>
<a name="h4.1.1">4.1.1. リファレンス</a>
</h4>
<p>「#set」でリファレンスを代入する場合は、そのリファレンスが表すオブジェクトへの参照がリファレンス変数に代入されます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($var1 = $flow.var1)            ##「$var1」はValueオブジェクト
#set ($var2 = $flow.var1.strValue()  ##「$var2」はStringオブジェクト
</pre>
<h4>
<a name="h4.1.2">4.1.2. 文字列リテラル</a>
</h4>
<p>「#set」で文字列リテラルを使用する場合、文字列は二重引用符「"」または単一引用符「'」で括ります。</p>
<p>どちらを使用した場合もリファレンス変数の内容はStringオブジェクトになりますが二重引用符「"」を使用した場合は、引用符内のリファレンスがパースされるという違いがあります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set($str1 = "AAA")    ##二重引用符を使用。「AAA」をstr1に代入
#set($str2 = 'あああ') ##単一引用符を使用。
                       ##リファレンスがない場合はどちらでも同じ

#set($str3 = "str1は「<span style="color:red;">$str1</span>」でした") ##文字列中の「$str1」は変換される
#set($str4 = '変数名は「<span style="color:red;">$str1</span>」です') ##「$str1」はそのまま出力される

##文字列の連結する場合ははリファレンスを連続して記述
#set($str5 = "str1とstr2を連結「<span style="color:red;">$str1$str2</span>」") 
</pre>
<h4>
<a name="h4.1.3">4.1.3. 数値</a>
</h4>
<p>「#set」で数値を使用する場合、簡単な演算を行うことが可能です。</p>
<p>演算で使用できるのは整数(Integer)のみです。Valueクラスには長整数(Long)を返すlongValue()メソッドや浮動小数を返すdoubleValue()メソッドがありますが、それらを用いての演算はできません。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($num1 = $flow.num1.intValue() + 5)                     ##加算
#set ($num2 = 20 - $flow.num1.intValue())                    ##減算
#set ($num3 = $flow.num1.intValue() * $flow.num2.intValue()) ##乗算
#set ($num4 = $flow.num1.intValue() / 5) ##除算。結果は整数
#set ($num5 = $flow.num1.intValue() % 5) ##剰余。除算のあまり

##括弧を使用して演算順序の制御もできる
#set ($num7 = 10)
#set ($num8 = $num7 + 5 * 10)   ##結果は「60」
#set ($num9 = ($num7 + 5) * 10) ##結果は「150」
</pre>
<h4>
<a name="h4.1.4">4.1.4. 配列</a>
</h4>
<p>配列を使用する場合、「[]」内に配列要素をカンマ区切りで配列要素を指定します。配列要素にリファレンスを指定することもできます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($arr1 = ["one", "two", "three"])
#set ($arr2 = [$flow.str1.strValue(), $flow.str2.strValue()]
</pre>
<p>配列の主なメソッドを以下にしめします。</p>
<table border="1">
<caption>配列オブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>get()</td>
<td>int</td>
<td>Object</td>
<td>指定のインデックスに対応する配列要素を返します</td>
</tr>
<tr>
<td>size()</td>
<td>なし</td>
<td>int</td>
<td>配列の要素数を返します</td>
</tr>
<tr>
<td>indexOf()</td>
<td>Object</td>
<td>int</td>
<td>指定のObjectが配列要素に含まれている場合のインデックスを返します</td>
</tr>
<tr>
<td>contains()</td>
<td>Object</td>
<td>boolean</td>
<td>指定のObjectが配列要素に含まれているかどうかを返します</td>
</tr>
</table>
<p>配列の実体は「java.util.ArrayList」クラスです。</p>
<h4>
<a name="h4.1.5">4.1.5. 範囲</a>
</h4>
<p>範囲は２つの整数間にある数値を配列化する記述方法です。主に後述の「#foreach」と組み合わせて回数を指定してループする場合に用いられます。数値の指定にリファレンスを指定することもできます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($arr1 = [1..10]) ##「1」から「10」までを要素とする配列
#set ($arr2 = [$flow.num1.intValue()..$flow.num2.intValue()]

#set ($arr3 = [10..1] ## 大きい数字から小さい数字の指定もOK
</pre>
<p>範囲の指定で先に大きい数字が指定された場合は、単純にカウントダウンしながら配列が作成されます。</p>
<h4>
<a name="h4.1.6">4.1.6. 真偽値</a>
</h4>
<p>真偽値は「true」または「false」のいずれかです。
主に後述の「#if」と組み合わせて用いられます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($flag1 = true)
#set ($flag2 = $flow.var1.booleanValue())
</pre>
<h4>
<a name="h4.1.7">4.1.7. nullについて</a>
</h4>
<p>「#set」でリファレンス変数にnullを代入することはできません。右辺の評価結果がnullの場合は単純に無視されて、元の値がそのまま維持されます。</p>
<p>またnullに対するプロパティやメソッドの実行も無視されるだけでエラーとはなりません。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($var1 = "aaa")      ##文字列の代入
var1の値は「$var1」です。 ##この行の出力は「aaa」

##フロー変数「var1」が定義されていないとする
#set ($var1 = $flow.var1.strValue()) ##この行は無視される
var1の値は「$var1」です。 ##この行の出力も「aaa」
</pre>
<p>このことはループの中で繰り返し同じ変数を使用する場合に特に注意が必要です。</p>
<h3>
<a name="h4.2">4.2. #if</a>
</h3>
<p>「#if」指示子を使用すると条件に一致する場合のみ出力されるテンプレートを記述することができます。「#if」はその区間の終了をしめす「#end」と必ず対にする必要があります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#if ($flow.var1.strValue() == "test")
この部分はフロー変数「var1」の値が「test」の場合だけ出力されます。
#end
</pre>
<p>「#else」を組み合わせることで条件に一致しない場合にのみ出力されるテンプレートを記述することもできます。また、「#elseif」を使用して複数の条件を組み合わせることも可能です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#if ($flow.var1.intValue() == 1)
フロー変数var1は「1」です。
#elseif ($flow.var1.intValue() == 2)
フロー変数var1は「2」です。
#elseif ($flow.var1.intValue() == 3)
フロー変数var1は「3」です。
#else
フロー変数var1は不明です。
#end
</pre>
<p>ひとつの「#if」ブロック内に「#elseif」はいくつでも記述することができますが、「#else」は最後にひとつだけ記述することができます。条件は上から順に評価されていき、一度条件が一致するとそれ以降の条件式は評価されません。</p>
<h4>
<a name="h4.2.1">4.2.1. 条件の評価方法</a>
</h4>
<p>条件がリファレンスの場合以下のように判定されます。</p>
<ul>
<li>リファレンスの表すオブジェクトが真偽値の場合、それがtrueであれば一致</li>
<li>それ以外の場合はオブジェクトがnullでなければ一致</li>
</ul>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#set ($flag1 = true)
#set ($flag2 = false)
#set ($obj1 = "hoge")

#if ($flag1) 
flag1はtrueなので表示される
#end
#if ($flag2) 
flag2はfalseなので表示されない
#end
#if ($obj1) 
obj1はnullでないので表示される
#end
#if ($obj2) 
obj2は未定義なので表示されない
#end
#if ($flow.var1.booleanValue()) 
フロー変数var1がtrueならば表示される
falseの場合や未定義の場合は表示されない
#end
</pre>
<p>「==」を使用して値が等しいかどうかを判定することもできます。この場合両辺は同種のオブジェクトである必要があります。つまりフロー変数を文字列や数値と比較する場合にはそれぞれstrValue()、intValue()メソッドを使用する必要があります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#if ($flow.var1 == $flow.var2)
フロー変数var1とvar2が等しいかどうかを判定
#end
#if ($flow.var3.strValue() == "aaa")
フロー変数var3が文字列「aaa」と等しいかどうかを判定
ValueとStringの比較なのでValueをStringにする
#end
#if ($flow.var4.intValue() == 5)
フロー変数var4が数値「5」と等しいかどうかを判定
Valueとintの比較なのでValueをintにする
#end

#set ($temp = "aaa")
#if ($flow.var5.strValue() == $temp)
フロー変数var5がリファレンス変数tempと等しいかどうかを判定
ValueとStringの比較なのでValueをStringにする
#end
</pre>
<p>数値の比較の場合は「&gt;」「&lt;」「&gt;=」「&lt;=」が使用できます。</p>
<ul>
<li>m &gt; n  ： mはnより大きい</li>
<li>m &lt; n  ： mはnより小さい</li>
<li>m &gt;= n ： mはn以上</li>
<li>m &lt;= n ： mはn以下</li>
</ul>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#if ($flow.var1.intValue() &lt; 10)
var1は10より小さい
#elseif ($flow.var1.intValue() &gt; 100)
var1は10より大きい
#end
</pre>
<p>「&amp;&amp;」「||」を使用して複数の条件を組み合わせたり、「!」を使用して条件を反転させることもできます。</p>
<ul>
<li>A &amp;&amp; B ： AとBの両方の条件に一致</li>
<li>A || B ： AとBいずれかの条件に一致</li>
<li>!A ： Aの結果の逆</li>
</ul>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#if ($flow.var1.intValue &lt; 10 || $flow.var1.intValue() &gt; 100)
フロー変数var1が10より小さいか100より大きい場合
#end

#if (!$temp)
リファレンス変数tempがfalseかnull(未定義)の場合
#end
</pre>
<h3>
<a name="h4.3">4.3. #foreach</a>
</h3>
<p>「#foreach 」指示子はループを処理するために使用します。ループブロックの終わりをしめす「#end」と対にして使用します。構文は次のようになります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#foreach (&lt;リファレンス変数&gt; in &lt;リファレンスまたは配列&gt;
...
#end
</pre>
<p>「in」の前にはループ内でコレクションまたは配列の要素を受けるリファレンス変数を置きます。
「in」の後ろには以下ののいずれかが入ります。</p>
<ul>
<li>コレクション(java.util.Collectionの実装)を返すリファレンス</li>
<li>配列(範囲を含む)</li>
</ul>
<p>もっとも典型的な #foreach の使用例はCSVなどの入力ストリームに対してレコードごとにループして処理を行うケースです。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;table&gt;
&lt;tr&gt;
	&lt;th&gt;フィールド1&lt;/th&gt;
	&lt;th&gt;フィールド2&lt;/th&gt;
	&lt;th&gt;フィールド3&lt;/th&gt;
&lt;/tr&gt;
<span style="color:red;">#foreach ($r in $in.records)</span>
&lt;tr&gt;
	&lt;td&gt;<span style="color:red;">$r.field1</span>&lt;/td&gt;
	&lt;td&gt;<span style="color:red;">$r.field2</span>&lt;/td&gt;
	&lt;td&gt;<span style="color:red;">$r.field3</span>&lt;/td&gt;
&lt;/tr&gt;
<span style="color:red;">#end</span>
&lt;/table&gt;
</pre>
<p>リファレンス変数「$r」で一行分のレコードを受けて、#foreachブロック内の処理をレコードの行数回繰り返します。</p>
<p>ほとんどの場合「in」の後ろにはリファレンスが来ますが配列や範囲を直接指定することもできます。範囲を指定すること回数を決めてのループを行うことができます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
##配列を使用したループ
#foreach ($name in ["佐藤", "鈴木", "田中"])
$nameさんが来ました。
#end

##範囲を指定したループ
#foreach ($idx in [1..10])
...
#end
</pre>
<h3>
<a name="h4.4">4.4. #includeと#parse</a>
</h3>
<p>「#include」と「#parse」はいずれも外部ファイルをテンプレート内に取り込むための指示子です。Velocityコンポーネントのプロパティで「テンプレートの指定方法」プロパティが「ファイル」となっている場合のみ使用でき「直接入力」の場合は使用できません。</p>
<p>「#parse」では外部ファイル内のリファレンスや指示子が解釈されて変換されるのに対し、「#include」では単純にテキストがそのまま読み込まれます。</p>
<p>
ファイルの指定はVelocityコンポーネントを使用しているASTERIAユーザーのホームディレクトリからの相対パスで行います。テンプレートファイル位置からの相対パスではないので注意が必要です。絶対パスを使用したり、「..」を使用してホームディレクトリ以外の階層にあるファイルを参照することはできません。
</p>
<p>
ファイルの指定は通常文字列で指定しますが、リファレンスで指定して動的に取り込むファイルを変更することもできます。
</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#parse ("vm/header.vm")
#include ($flow.includeFilename.strValue())
</pre>
<h3>
<a name="h4.5">4.5. #macro</a>
</h3>
<p>「#macro」はマクロを定義する指示子です。テンプレート内で頻繁に行われる処理をマクロとして定義しておけば名前を指定してそのマクロを呼び出すことで同じ処理を繰り返し記述することを避けられます。</p>
<p>「#macro」の定義では最初にマクロ名を、それに続けてスペース区切りで引数となるリファレンス変数名のリストを記述します。引数は0個以上の複数定義することができます。「#if」や「#foreach」と同じくマクロブロックの終わりに「#end」を使用します</p>
<p>次の例は引数がnullか空文字の場合に代替文字として「&amp;nbsp;」を出力するマクロです。HTMLのtableでは空文字の場合に枠線が表示されないのでそれを避けるために使用できます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#macro(print $ref)
#if (!$ref || $ref.toString().length() == 0)
&amp;nbsp;
#else
$ref
#end
#end
</pre>
<p>呼び出し側では「#」に続けてマクロ名を記述し、「()」内にスペース区切りで引数リストを指定します。引数の数が一致していない場合はマクロは無視されます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#print ("hoge") ##出力は「hoge」
#print ("")     ##出力は「&amp;nbsp;」
#print ($var1)  ##var1が未定義か空文字の場合は「&amp;nbsp;」
#print ($var1 "hoge") ##引数の数が一致しないので無視される
</pre>
<h2>
<a name="h5">5. エスケープ</a>
</h2>
<p>リファレンス変数や指示子を意図的にそのまま出力させたい場合は「\」を使用してエスケープすることができます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
\$flow.var1
\#set ($hoge = "aaa")
</pre>
<h2>
<a name="h6">6. 組込リファレンス その2</a>
</h2>
<p>ここでは入力ストリームを扱うための組込リファレンスとユーティリティについて説明します。</p>
<h3>
<a name="h6.1">6.1. $in - 入力ストリーム</a>
</h3>
<p>「$in」は入力ストリームを扱うためのリファレンスです。「$in」の実体は複数の入力ストリームを扱うコレクションです。</p>
<p>Velocityコンポーネントには複数のコンポーネントからの入力を差し込むことができます。これにより例えば社員一覧と部署一覧をそれぞれRDBGetコンポーネントで取得してその両方をVelocityコンポーネントでまとめてひとつのHTMLページを生成するといった処理が可能になります。</p>
<p>「$in」では複数のストリーム群の中からひとつのストリームを取得するためのメソッドが定義されています。</p>
<table border="1">
<caption>$inオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>array()</td>
<td>int</td>
<td>Stream</td>
<td>インデックスを指定して入力ストリームを取得<br/>インデックスはVelocityコンポーネントへの
	入力順序の0ベースインデックスです</td>
</tr>
<tr>
<td>array()</td>
<td>String</td>
<td>Stream</td>
<td>コンポーネント名またはリンク名を指定して入力ストリームを取得</td>
</tr>
<tr>
<td>size()</td>
<td>なし</td>
<td>int</td>
<td>入力ストリームの数を取得</td>
</tr>
</table>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$in.array(0).text()

#foreach ($in.array("RDBGet1").records)
...
#end
</pre>
<p>ただし、実際にVelocityコンポーネントに複数の入力ストリームが差し込まれることはまれで、ほとんどの場合入力ストリームはひとつしかありません。このため次節で説明するStreamオブジェクトのプロパティ／メソッドはすべて$inオブジェクトで再定義されて最初のストリームにフォワードされています。</p>
<p>Javaの疑似コードで書くと以下のようになります。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
/** プロパティの取得をストリームにフォワード */
public Object get(String name) {
    return array(0).get(name);
}

/** テキストの取得をストリームにフォワード */
public String text() {
    return array(0).text();
}

...
</pre>
<p>実質的には$in自体が最初に入力されたStreamオブジェクトであると考えて差し支えありません。</p>
<h3>
<a name="h6.2">6.2. Stream</a>
</h3>
<p>Streamは$inまたは$in.array(0)などで取得した入力ストリームを表すオブジェクトです。</p>
<p>Streamでは入力ストリームを扱うためのプロパティ／メソッドが定義されています。</p>
<table border="1">
<caption>Streamオブジェクトのプロパティ</caption>
<tr style="background-color: #eeeeff;">
<th>プロパティ</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>records</td>
<td>Collection</td>
<td>#foreachでレコード単位でループさせるためのRecordオブジェクトのコレクションを返します</td>
</tr>
<tr>
<td>doc</td>
<td>Document</td>
<td>ストリームがXMLの場合にJDOMのDocumentオブジェクトを返します</td>
</tr>
<tr>
<td nowrap="true">&lt;フィールド名&gt;</td>
<td>Value</td>
<td>最初のレコードのフィールド値を返します</td>
</tr>
</table>
<table border="1">
<caption>Streamオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>record()</td>
<td>int</td>
<td>Record</td>
<td>インデックスを指定してレコードをを取得します<br/>インデックスは0ベースインデックスです</td>
</tr>
<tr>
<td>name()</td>
<td>int</td>
<td>String</td>
<td>インデックスを指定してフィールド名を取得します<br/>インデックスは0ベースインデックスです</td>
</tr>
<tr>
<td>text()</td>
<td>なし</td>
<td>String</td>
<td>ストリーム全体を文字列で返します</td>
</tr>
<tr>
<td>toString()</td>
<td>なし</td>
<td>String</td>
<td>text()と同じです</td>
</tr>
<tr>
<td>size()</td>
<td>なし</td>
<td>int</td>
<td>レコード数を返します</td>
</tr>
<tr>
<td>variable()</td>
<td>String</td>
<td>Value</td>
<td>名前を指定してストリーム変数を返します</td>
</tr>
<tr>
<td>field()</td>
<td>String</td>
<td>Value</td>
<td>名前を指定して最初のレコードのフィールド値を取得します</td>
</tr>
<tr>
<td>field()</td>
<td>int</td>
<td>Value</td>
<td>インデックスを指定して最初のレコードのフィールド値を取得します<br/>インデックスは0ベースインデックスです</td>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>field(String)と同じです</td>
</tr>
</table>
<p>入力ストリームがRecordやCSVの場合には主にrecordsプロパティを使用して各レコードをループで処理します。</p>
<p>入力ストリームがXMLの場合はJDOMのDocumentを取得してそのメソッドや後述のXPathユーティリティを使用して各要素にアクセスできます。</p>
<p>フィールド名を指定して最初のレコードのフィールド値を取得することができます。入力ストリームがParameterListの場合「$in.field1」のように$inから直接フィールド値を取得できるので便利です。</p>
<h3>
<a name="h6.3">6.3. Record</a>
</h3>
<p>Recordでは１行分のレコードを扱うためのプロパティ／メソッドが定義されています。</p>
<table border="1">
<caption>Recordオブジェクトのプロパティ</caption>
<tr style="background-color: #eeeeff;">
<th>プロパティ</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>fields</td>
<td>Collection</td>
<td>#foreachでフィールド単位でループさせるためのValueオブジェクトのコレクションを返します</td>
</tr>
<tr>
<td>No</td>
<td>int</td>
<td>レコードの行番号(0ベース)を返します</td>
</tr>
<tr>
<td nowrap="true">&lt;フィールド名&gt;</td>
<td>Value</td>
<td>フィールド名に対応するフィールド値を返します</td>
</tr>
</table>
<table border="1">
<caption>Recordオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>name()</td>
<td>int</td>
<td>String</td>
<td>インデックスを指定してフィールド名を取得します<br/>インデックスは0ベースインデックスです</td>
</tr>
<tr>
<td>size()</td>
<td>なし</td>
<td>int</td>
<td>フィールド数を返します</td>
</tr>
<tr>
<td>field()</td>
<td>String</td>
<td>Value</td>
<td>名前を指定してフィールド値を取得します</td>
</tr>
<tr>
<td>field()</td>
<td>int</td>
<td>Value</td>
<td>インデックスを指定してフィールド値を取得します<br/>インデックスは0ベースインデックスです</td>
</tr>
<tr>
<td>get()</td>
<td>String</td>
<td>Value</td>
<td>field(String)と同じです</td>
</tr>
</table>
<p>レコード形式のストリームをHTMLのtableで表示させる汎用的なテンプレートの例を以下にしめします。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;table&gt;
    &lt;tr&gt;
##ヘッダとしてフィールド名を出力
#set ($fieldCount = $in.record(0).size() - 1)
#foreach($idx in [0..$fieldCount])
        &lt;th&gt;$in.name($idx)&lt;/th&gt;
#end
    &lt;/tr&gt;
##レコードとフィールドで二重ループして全データを出力
#foreach ($r in $in.records)
    &lt;tr&gt;
#foreach ($v in $r.fields)
        &lt;td&gt;$v&lt;/td&gt;
#end
    &lt;/tr&gt;
#end
&lt;/table&gt;
</pre>
<h3>
<a name="h6.4">6.4. JDOM</a>
</h3>
<p>入力ストリームがXMLの場合はStreamオブジェクトのdocプロパティからJDOMのDocumentオブジェクトが取得できます。
JDOMはXMLを扱うためのAPIの一種で、通常のDOMとは異なり子要素をコレクションとして扱えるという特徴があります。このためVelocityとの連携では要素単位でループをまわして処理を行うことが可能です。</p>
<p>以下にJDOMクラスの主なプロパティとメソッドをしめします。名前空間のあるXMLを扱う場合などには、ここに記した以外のメソッドが必要となるので正確なメソッドの一覧を知りたい方は<a href="http://www.jdom.org/docs/apidocs/">JDOMのJavaDoc</a>を参照してください。</p>
<table border="1">
<caption>Documentオブジェクトのプロパティ</caption>
<tr style="background-color: #eeeeff;">
<th>プロパティ</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>RootElement</td>
<td>Element</td>
<td>文書要素を返します</td>
</tr>
</table>
<table border="1">
<caption>Elementオブジェクトのプロパティ</caption>
<tr style="background-color: #eeeeff;">
<th>プロパティ</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>Name</td>
<td>String</td>
<td>要素名(ローカルネーム)を返します</td>
</tr>
<tr>
<td>Text</td>
<td>String</td>
<td>要素内容を返します</td>
</tr>
<tr>
<td>Children</td>
<td>List</td>
<td>子要素のリストを返します<br/>#foreachでループさせることができます</td>
</tr>
</table>
<table border="1">
<caption>Elementオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>getAttributeValue()</td>
<td>String</td>
<td>String</td>
<td>属性名を指定して属性値を取得します</td>
</tr>
<tr>
<td>getChild()</td>
<td>String</td>
<td>Element</td>
<td>要素名を指定しその名前を持つ最初の要素を返します</td>
</tr>
<tr>
<td>getChildren()</td>
<td>String</td>
<td>List</td>
<td>要素名を指定しその名前を持つ要素をListで返します<br/>#foreachでループさせることができます</td>
</tr>
</table>
<p>以下は入力データのXMLをHTMLのtableとして出力する例です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">入力データ</span>
--------------
&lt;userData&gt;
    &lt;record id="1"&gt;
        &lt;name&gt;山田太郎&lt;/name&gt;
        &lt;tel&gt;.03-xxxx-xxxx&lt;/tel&gt;
        &lt;addr&gt;東京都...&lt;/addr&gt;
    &lt;/record&gt;
    &lt;record id="2"&gt;
        &lt;name&gt;佐藤花子&lt;/name&gt;
        &lt;tel&gt;.045-xxx-xxxx&lt;/tel&gt;
        &lt;addr&gt;神奈川県...&lt;/addr&gt;
    &lt;/record&gt;
&lt;/userData&gt;

--------------
<span style="color:blue;">テンプレート</span>
--------------
<span style="color:red;">#set ($root = $in.doc.RootElement)</span>
&lt;table&gt;
&lt;tr&gt;
    &lt;th&gt;ID&lt;/th&gt;
    &lt;th&gt;氏名&lt;/th&gt;
    &lt;th&gt;電話番号&lt;/th&gt;
    &lt;th&gt;住所&lt;/th&gt;
&lt;/tr&gt;
<span style="color:red;">#foreach ($r in $root.getChildren("record"))</span>
&lt;tr&gt;
    &lt;td&gt;<span style="color:red;">$r.getAttributeValue("id")</span>&lt;/td&gt;
    &lt;td&gt;<span style="color:red;">$r.getChild("name").Text</span>&lt;/td&gt;
    &lt;td&gt;<span style="color:red;">$r.getChild("tel").Text</span>&lt;/td&gt;
    &lt;td&gt;<span style="color:red;">$r.getChild("addr").Text</span>&lt;/td&gt;
&lt;/tr&gt;
<span style="color:red;">#end</span>
&lt;/table&gt;

--------------
<span style="color:blue;">出力データ</span>
--------------
&lt;table&gt;
&lt;tr&gt;
    &lt;th&gt;ID&lt;/th&gt;
    &lt;th&gt;氏名&lt;/th&gt;
    &lt;th&gt;電話番号&lt;/th&gt;
    &lt;th&gt;住所&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;1&lt;/td&gt;
    &lt;td&gt;山田太郎&lt;/td&gt;
    &lt;td&gt;.03-xxxx-xxxx&lt;/td&gt;
    &lt;td&gt;東京都...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;2&lt;/td&gt;
    &lt;td&gt;佐藤花子&lt;/td&gt;
    &lt;td&gt;.045-xxx-xxxx&lt;/td&gt;
    &lt;td&gt;神奈川県...&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
</pre>
<h3>
<a name="h6.5">6.5. $sys - 汎用ユーティリティ</a>
</h3>
<p>「$sys」では汎用的なユーティリティ関数がメソッドとして提供されます。</p>
<table border="1">
<caption>$sysオブジェクトのプロパティ</caption>
<tr style="background-color: #eeeeff;">
<th>プロパティ</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>CurrentDate</td>
<td>Date</td>
<td>現在の日時を返します。</td>
</tr>
</table>
<table border="1">
<caption>$sysオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>escape()</td>
<td>ValueまたはString</td>
<td>String</td>
<td>文字列中の「&gt;」「&lt;」「&amp;」「"」をそれぞれ「&amp;gt;」「&amp;lt;」「&amp;amp;」「&amp;quot;」に変換します</td>
</tr>
<tr>
<td>outputXML()</td>
<td>Document<br/>[boolean]</td>
<td>String</td>
<td>JDOMドキュメントを文字列化します。第2引数はインデントの有無です。第2引数は省略可能で省略時はfalseになります</td>
</tr>
<tr>
<td>outputXML()</td>
<td>Element<br/>[boolean]</td>
<td>String</td>
<td>JDOMエレメントを文字列化します。第2引数はインデントの有無です。第2引数は省略可能で省略時はfalseになります</td>
</tr>
<tr>
<td>strToInt()</td>
<td>String</td>
<td>int</td>
<td>文字列をintに変換します</td>
</tr>
<tr>
<td>strToDouble()</td>
<td>String</td>
<td>double</td>
<td>文字列をdoubleに変換します</td>
</tr>
<tr>
<td>formatDecimal()</td>
<td>Valueまたは任意の数値型<br/>String</td>
<td>String</td>
<td>第1引数の数値を第2引数の書式で文字列化します</td>
</tr>
<tr>
<td>formatDate()</td>
<td>ValueまたはDate<br/>String</td>
<td>String</td>
<td>第1引数の日付を第2引数の書式で文字列化します</td>
</tr>
<tr>
<td>regexpReplace()</td>
<td>String<br/>String<br/>String<br/>[boolean]<br/>[boolean]<br/>[boolean]</td>
<td>String</td>
<td>第1引数の文字列の中から第2引数の正規表現にマッチした部分を第3引数の文字列で置換します。第4引数は英大文字小文字の区別するかどうか、第5引数はマッチする文字列をすべて置換するかどうか、第6引数は第3引数の文字列でメタ文字(<a href="http://asteria.jp/documentation/warp/current/flow/designer/reference/function/REGEXPREPLACE_jp.html">
<code>REGEXPREPLACE</code>
</a>関数を参照)を使用できるかどうかをそれぞれ指定します。第4～6引数は省略でき、省略時の値はtrueとなります。</td>
</tr>
</table>
<p>formatDecimalメソッドの使用時には注意が必要です。数値の書式化でもっともよく使用される書式文字列はカンマ区切りを行う「#,##0」ですが、「##」はVelocityのコメント開始文字でもあります。このため、</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$sys.formatDecimal($num, "#,##0")
</pre>
<p>のように書式文字列を二重引用符「"」で括って指定した場合には文字列がVelocityによってパースされエラーとなります。この場合は</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
$sys.formatDecimal($num, '#,##0')
</pre>
<p>のように書式文字列を単一引用符「'」で括って指定してください。</p>
<h3>
<a name="h6.6">6.6. $xpath - XPathユーティリティ</a>
</h3>
<p>「$xpath」ではJDOMに対してXPathによるノードや文字列の選択が行えるユーティリティ関数がメソッドとして提供されます。</p>
<p>createXPathメソッドでは<a href="http://jaxen.codehaus.org/apidocs/org/jaxen/XPath.html">JaxenのXPathオブジェクト</a>が作成されます。
createXPath以外のメソッドはすべて作成したXPathオブジェクトのメソッドを実行しているだけです。
テンプレート内で同じXPathを対象要素を変えながら複数回実行する場合はcreateXPathで作成したXPathオブジェクトをリファレンス変数に保存して再利用する方が高速です。</p>
<table border="1">
<caption>$xpathオブジェクトのメソッド</caption>
<tr style="background-color: #eeeeff;">
<th>メソッド</th>
<th>引数</th>
<th>返り値</th>
<th>説明</th>
</tr>
<tr>
<td>createXPath()</td>
<td>String</td>
<td>XPath</td>
<td>XPath式を引数としてXPathオブジェクトを作成します</td>
</tr>
<tr>
<td>booleanValueOf()</td>
<td>String<br/>Object</td>
<td>boolean</td>
<td>XPathの結果をbooleanとして取得します。<br/>第1引数にはXPath式を、第2引数にはDocumentまたはElementを指定します。<br/>createXPath(expr).booleanValueOf(object)と同じです。</td>
</tr>
<tr>
<td>numberValueOf()</td>
<td>String<br/>Object</td>
<td>Number</td>
<td>XPathの結果を数値として取得します。<br/>第1引数にはXPath式を、第2引数にはDocumentまたはElementを指定します。<br/>createXPath(expr).numberValueOf(object)と同じです。</td>
</tr>
<tr>
<td>selectNodes()</td>
<td>String<br/>Object</td>
<td>List</td>
<td>XPathの結果をListとして取得します。<br/>第1引数にはXPath式を、第2引数にはDocumentまたはElementを指定します。<br/>createXPath(expr).selectNodes(object)と同じです。</td>
</tr>
<tr>
<td>stringValueOf()</td>
<td>String<br/>Object</td>
<td>String</td>
<td>XPathの結果をStringとして取得します。<br/>第1引数にはXPath式を、第2引数にはDocumentまたはElementを指定します。<br/>createXPath(expr).stringValueOf(object)と同じです。</td>
</tr>
<tr>
<td>selectSingleNode()</td>
<td>String<br/>Object</td>
<td>Object</td>
<td>XPathの結果をObjectとして取得します。<br/>第1引数にはXPath式を、第2引数にはDocumentまたはElementを指定します。<br/>createXPath(expr).selectSingleNode(object)と同じです。</td>
</tr>
</table>
<p>Velocityコンポーネントの「XPath式のプレフィックス」プロパティ値はXPath式の中で変数を参照する場合に使用します。
XPath式の中でもフロー変数、ローカル変数、システム変数が参照可能であり「XPath式のプレフィックス」の値が「fv」である場合、それぞれ以下のように参照できます。</p>
<table border="1">
<caption>XPath式内での変数参照書式</caption>
<tr>
<th>フロー変数</th>
<td>$fv:flow.var1</td>
</tr>
<tr>
<th>ローカル変数</th>
<td>$fv:local.var1</td>
</tr>
<tr>
<th>システム変数</th>
<td>$fv:system.FlowName</td>
</tr>
</table>
<p>外部変数セットはXPath式の中からは参照できません。</p>
<p>プレフィクスが必要となるのはXPathの変数とVelocityのリファレンス変数を区別するためです。もっとも、引数としてXPath式を渡す際に二重引用符「"」を使用すればVelocityによる文字列のパースが有効となるので結局のところ次の２つのXPath式は同じ処理になり、速度差もほとんどありません。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
##述語の中でXPathの変数としてフロー変数を参照
$xpath.stringValueOf("/root/record[@name=<span style="color:red;">$fv:flow.var1</span>]/field", $in.doc)

##Velocityによって置換されたフロー変数の値を述語で使用
$xpath.stringValueOf("/root/record[@name=<span style="color:red;">'$flow.var1'</span>]/field", $in.doc)
</pre>
<p>後者の式では述語内の式が変数との比較ではなく文字列との比較になるため「$flow.var1」が単一引用符「'」で括られていることにもご注意ください。</p>
<h2>
<a name="h7">7. 拡張クラス</a>
</h2>
<p>Velocityコンポーネントの拡張タブを使用すると任意のJavaオブジェクトをリファレンス変数に設定することができます。</p>
<p>「定義名」列に「$」を除くリファレンス変数名を、「Javaクラス」列にJavaクラス名を設定すると定義名に指定した名前でテンプレート内から参照できます。</p>
<p>Javaクラスには引数なしのコンストラクタを持つクラスであれば何でも設定できます。
自作のクラスを拡張クラスに設定する場合は、そのjarファイルは「ASTERIA_INSTALL/flow/lib/userlib」に置きます。</p>
<p>以下は「map」という定義名に「java.util.TreeMap」を設定してテンプレート内で項目毎の小計を集計した例です。
計算過程がテンプレート内に出力されるのであまり実用的なサンプルではありませんが、拡張クラスがどのように使用できるかを理解するのには役立つと思います。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">入力データ</span> - フィールド名は「Product」「Amount」
--------------
製品A,10000
製品B,10000
製品C,10000
製品B,10000
製品A,10000
製品B,10000

--------------
<span style="color:blue;">テンプレート</span>
--------------
&lt;!--
##計算過程はHTMLコメント内に出力
#foreach ($r in $in.records)
#set ($product = $r.Product.strValue())
#set ($sum = 0) ##map.getはnullの場合があるので毎回リセット
#set ($sum = $map.get($product))
#set ($sum = $sum + $r.Amount.intValue())
$product, $sum, $!map.put($product, $sum) ##mapに製品毎の累計を設定
#end
--&gt;
&lt;table border="1"&gt;
&lt;tr&gt;&lt;th&gt;製品&lt;/th&gt;&lt;th&gt;小計&lt;/th&gt;&lt;/tr&gt;
#foreach ($product in $map.keySet()) ##map内のキーでループ
&lt;tr&gt;&lt;td&gt;$product&lt;/td&gt;&lt;td&gt;$map.get($product)&lt;/td&gt;&lt;/tr&gt;
#end
&lt;/table&gt;

--------------
<span style="color:blue;">出力データ</span>
--------------
&lt;!--
 製品A, 10000, 
 製品B, 10000, 
 製品C, 10000, 
 製品B, 20000, 10000
 製品A, 20000, 10000
 製品B, 30000, 20000
--&gt;
&lt;table border="1"&gt;
&lt;tr&gt;&lt;th&gt;製品&lt;/th&gt;&lt;th&gt;小計&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;製品A&lt;/td&gt;&lt;td&gt;20000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;製品B&lt;/td&gt;&lt;td&gt;30000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;製品C&lt;/td&gt;&lt;td&gt;10000&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</pre>
<h2>
<a name="h8">8. Velocityの用途</a>
</h2>
<p>Velocityはテキスト加工を行う処理ならどのような処理にでも適用できます。ASTERIAのフロー作成では、次のようなケースで有効に使用できます。</p>
<ol>
<li>HTML<br/>もっとも多く使用されるのがWebアプリケーション作成時のHTML生成です。フローにはWeb画面を作成する機能がないのでほとんどの場合HTML生成はVelocityで行われます。これについては次章で多数の例をとりあげます。</li>
<li>メール本文<br/>一番最初の例でしめしたとおりメール本文の差し込み的な用途にも多く使用されます。</li>
<li>SQL<br/>ASTERIAではDBMSからのデータ取得は主にRDBGetコンポーネントで行います。RDBGetコンポーネントではあらかじめSQLBuilderで生成したSELECT文にパラメータを埋め込むことで動的なSQLを発行できますが、出力フィールド(SELECT文のSELECT句で指定するカラム)が変わらなければ「SQL」プロパティに値を差し込むことでSQL全体を差し替えることができます。自由な条件での検索画面を作成する場合などにはVelocityでSQL自体を生成してRDBGetコンポーネントに差し込む方が柔軟な対応が行えます。<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
##ユーザーマスタの検索
SELECT USER_ID,   ##ユーザーID
       DEPT_CODE, ##部署コード
       USER_NAME  ##ユーザー名
  FROM USER_MAS
 WHERE DEL_FLG = '0' ##削除フラグ=0
##検索条件にユーザー名を指定された場合
<span style="color:red;">#if ($flow.USER_NAME.strValue() != "")</span>
   AND USER_NAME LIKE '%<span style="color:red;">$flow.USER_NAME</span>%'
<span style="color:red;">#end</span>
##検索条件に部署を指定された場合
<span style="color:red;">#if ($flow.DEPT_CODE.strValue() != "")</span>
   AND DEPT_CODE = <span style="color:red;">$flow.DEPT_CODE</span>
<span style="color:red;">#end</span>
</pre>
<p>ただしこの方法を使用する場合にはSQLインジェクションに注意が必要です。</p>
</li>
<li>CSV<br/>
<p>CSVデータを生成するのにもVelocityは使用できます。フローにおいてこの用途で使用されるのは主にMapperコンポーネントですが、Mapperでは行えないような変換がVelocityを用いることで可能になることがあります。</p>
<p>以下はレコードセットの行と列の入れ替えを行う例です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">入力データ</span>
フィールド名は「Product」「Amount04」「Amount05」「Amount05」
製品の月毎の数量の集計イメージ
--------------
製品A,100,200,300
製品B,400,500,600
製品C,700,800,900

--------------
<span style="color:blue;">テンプレート</span>
--------------
#set ($quot = '"') ##文字列内に「"」を埋めるためリファレンスに設定
#set ($r1 = "$quot製品名$quot")
#set ($r2 = "$quot４月$quot")
#set ($r3 = "$quot５月$quot")
#set ($r4 = "$quot６月$quot")
#foreach ($r in $in.records)
#set ($r1 = "$r1,$quot$r.Product$quot")
#set ($r2 = "$r2,$quot$r.Amount04$quot")
#set ($r3 = "$r3,$quot$r.Amount05$quot")
#set ($r4 = "$r4,$quot$r.Amount06$quot")
#end
$r1
$r2
$r3
$r4

--------------
<span style="color:blue;">出力データ</span>
--------------
"製品名","製品A","製品B","製品C"
"４月","100","400","700"
"５月","200","500","800"
"６月","300","600","900"
</pre>
</li>
</ol>
<h2>
<a name="h9">9. 実践的な例</a>
</h2>
<p>インフォテリア社内ではいくつかの社内システムがASTERIAを使用して作成されていますが、実はそのうちのかなりの数が次のようなパターンのフローとなっています。</p>
<div class="image-container">図1 検索画面作成のフロー<br/>
<img src="/documentation/images/Velocity1.jpg" alt="検索画面作成のフロー"  style="border-style:solid;border-width:thin;"/>
</div>
<br/>
<p>処理内容としては売上を管理しているSFAのデータベースから検索条件にあうデータを検索してHTMLにテーブル形式で結果を表示しているだけです。
出力画面のイメージは次のようになります。</p>
<div class="image-container">図2 検索画面<br/>
<img src="/documentation/images/Velocity2.jpg" alt="検索画面"  style="border-style:solid;border-width:thin;"/>
</div>
<br/>
<p>検索条件と検索結果を同一HTML上に表示しているので作成するフローはひとつだけですみます。検索条件や検索結果に含める情報に対するリクエストは日々変化していきますが、そうした仕様変更への対応で行う作業も</p>
<ul>
<li>HttpStartコンポーネントとフロー変数に検索条件を追加</li>
<li>SQLの変更</li>
<li>出力HTMLの変更</li>
</ul>
<p>のみであり容易に行えます。実際にはSQL生成とHTML生成のVelocityテンプレートはファイルとして外部に保存しているのでフローには一切手を加えずに対応できることも少なくありません。</p>
<p>ここではこの枠組みの中で実際に使用されている例をいくつかご紹介します。</p>
<h3>
<a name="h9.1">9.1. 配列を使ったselect要素の作成</a>
</h3>
<p>選択リストが固定のselect要素は、配列を利用すると簡単にユーザーの選択したアイテムを選択状態にできます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">テンプレート</span>
--------------
#set ($areaNameArray = ["東日本","西日本","すべて"])
#set ($areaCodeArray = ["1","2","3"])
&lt;select name="area"&gt;
#foreach ($idx in [0..2])
#set ($area = $areaCodeArray.get($idx))
    &lt;option value="$area" 
        #if ($area == $flow.area.strValue()) selected #end
        &gt;$areaNameArray.get(0)&lt;/option&gt;
#end
&lt;/select&gt;


<span style="color:blue;">出力データ</span>
(例示のための改行は除く)
--------------
&lt;select name="area"&gt;
    &lt;option value="1" &gt;東日本&lt;/option&gt;
    &lt;option value="2"  selected &gt;東日本&lt;/option&gt;
    &lt;option value="3" &gt;東日本&lt;/option&gt;
&lt;/select&gt;
</pre>
<h3>
<a name="h9.2">9.2. 範囲を使ったselect要素の作成</a>
</h3>
<p>select作成の応用編として年度を選択するselectを考えます。売上データなどの場合、現在の年度より大きい年度のデータは存在しないのでそこまでがリスト化されていると便利です。
$sys.CurrentDateと範囲を利用すると現在の年度に応じてリストの変化するselect要素を生成できます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">テンプレート</span>
--------------
#set ($year_start = 2007) ##リスト化する一番過去の年度
#set ($year_end = $sys.CurrentDate.Year + 1900) ##現在の年
&lt;select name="year"&gt;
#foreach ($year in [$year_end..$year_start])
    &lt;option value="$year" 
        #if ($flow.year.intValue() == $year) selected #end
        &gt;$year&lt;/option&gt;
#end
&lt;/select&gt;

<span style="color:blue;">出力データ</span>
--------------
&lt;select name="year"&gt;
2010 - 2007
    &lt;option value="2010" &gt;2010&lt;/option&gt;
    &lt;option value="2009"  selected &gt;2009&lt;/option&gt;
    &lt;option value="2008" &gt;2008&lt;/option&gt;
    &lt;option value="2007" &gt;2007&lt;/option&gt;
&lt;/select&gt;
</pre>
<h3>
<a name="h9.3">9.3. テーブル内でのstyleの変更</a>
</h3>
<p>検索結果のレコードセットをtable形式で表示するのは、#foreachを使用すれば簡単にできます。
データの内容によって例えば背景色を変えるなどstyleを変更することもcssのclass定義との組み合わせで可能です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
<span style="color:blue;">テンプレート</span>
--------------
&lt;table border="1"&gt;
&lt;tr&gt;
   &lt;th&gt;ID&lt;/th&gt;
   &lt;th&gt;案件名&lt;th&gt;
   &lt;th&gt;ステータス&lt;th&gt;
   &lt;th&gt;金額&lt;/th&gt;
&lt;/tr&gt;
#foreach ($r in $in.records)
#set ($class = "normal")
#if ($r.status.strValue() == "成約")
#set ($class = "commit")
#end
&lt;tr class="$class"&gt;
	&lt;td&gt;$r.id&lt;/td&gt;
	&lt;td&gt;$r.project&lt;/td&gt;
	&lt;td&gt;$r.status&lt;/td&gt;
	&lt;td&gt;$sys.formatDecimal($r.amount, '#,##0')&lt;/td&gt;
&lt;/tr&gt;
#end
&lt;/table&gt;

<span style="color:blue;">出力データ</span>
--------------
&lt;table border="1"&gt;
&lt;tr&gt;
   &lt;th&gt;ID&lt;/th&gt;
   &lt;th&gt;案件名&lt;th&gt;
   &lt;th&gt;ステータス&lt;th&gt;
   &lt;th&gt;金額&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="normal"&gt;
    &lt;td&gt;1&lt;/td&gt;
    &lt;td&gt;案件1&lt;/td&gt;
    &lt;td&gt;提案中&lt;/td&gt;
    &lt;td&gt;1,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="commit"&gt;
    &lt;td&gt;2&lt;/td&gt;
    &lt;td&gt;案件2&lt;/td&gt;
    &lt;td&gt;成約&lt;/td&gt;
    &lt;td&gt;1,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
</pre>
<h3>
<a name="h9.4">9.4. サブフローによるヘッダーやフッターの分離</a>
</h3>
<p>図１のフローではHTML生成のVelocityコンポーネントの後にSubFlowコンポーネントが置かれていますが、
実はこのサブフローもその中身は</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
Start -&gt; Velocity -&gt; EndResponse
</pre>
<p>という単純なフローです。以下にそのサブフローで使用しているテンプレートをしめします。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv="Content-Type" 
             content="text/html; charset=<span style="color:red;">$encoding</span>"&gt;
    &lt;link rel="shortcut icon" href="../favicon.ico"&gt; 
    &lt;link type="text/css" href="../style/common.css" rel="stylesheet"/&gt;
    &lt;script type="text/javascript" src="../scripts/common.js"/&gt;
    &lt;title&gt;<span style="color:red;">$flow.title</span>&lt;/title&gt;
<span style="color:red;">$flow.header</span>
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;<span style="color:red;">$flow.title</span>&lt;/h1&gt;
&lt;div style="float:right"&gt;
&lt;a href="../index.html" target="_top"&gt;メニュー&lt;/a&gt;
&lt;/div&gt;
<span style="color:red;">$in.text()</span>
&lt;hr&gt;
&lt;div&gt;
&lt;a href="../index.html" target="_top"&gt;メニュー&lt;/a&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>テンプレート内容は以下のようになっています。</p>
<ul>
<li>画面タイトルをフロー変数「title」から取得し、画面最上部にh1タグで表示</li>
<li>メニュー画面へのリンクを画面の上下に表示</li>
<li>共通的なスタイルシートとスクリプトにリンク</li>
<li>入力ストリームをbody内部にまるごと差し込み</li>
<li>スタイルやスクリプトの追加がある場合はフロー変数「header」から差し込み</li>
</ul>
<p>このようにすることで全ての画面に共通する枠組みと個別のコンテンツを切り離し、個別のフローでは処理結果の記述に集中することができます。</p>
<p>リンクするcssやjsファイル、イメージファイルなどは「&lt;ユーザーのHOMEディレクトリ&gt;/htdocs」以下に配置します。
(「htdocs」の部分はフローサービス管理コンソールの設定で変更することができます。)</p>
<p>例えば「/app1」というコンテキストパスのユーザーが「htdocs/index.html」というhtmlファイルを作成した場合、そのhtmlには</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
http://&lt;ホスト名&gt;:&lt;ポート&gt;/app1/index.html
</pre>
<p>というURLでアクセスできます。
URL実行されたフローからリンクする場合の相対パスは、URL実行設定のパス内に含まれる「/」の数によって変わりますが、
デフォルト設定から変更せず「/Project1/Flow1」のようなパスを設定した場合は上記例のように「..」で一階層上に戻ります。</p>
<h3>
<a name="h9.5">9.5. AJAXとの連携</a>
</h3>
<p>最後にAJAXを使用してCSVを返すフローから動的にselectを作成する例を紹介します。
HTML内にスクリプトを埋め込む場合、そのスクリプト自体もテキストなのでVelocityで動的に生成することができます。
これを利用すればロード時に実行する処理を切り替えたり、AJAXで動的にフローを実行してその結果をページ内に埋め込むなどページ作成時の選択肢が大きく広がります。</p>
<p>このサンプルでは「部署」「氏名」という２つの選択リストを表示し、部署の選択に応じて氏名のリストを切り替えています。</p>
<div class="image-container">図851 社員選択サンプル<br/>
<img src="/documentation/images/Velocity3.jpg" alt="社員選択サンプル" style="border-style:solid;border-width:thin;"/>
</div>
<p>部署、氏名ともに選択リストはCSVを返すフローを実行してその結果から作成しています。
(実際にはこれらのCSVはデータベースから取得して作成するイメージですが、このサンプルでは単純にテストデータを返しています。)
そして、部署が変更された時にはそのonchangeイベントでAJAXリクエストを発行し、氏名のリストを再作成します。</p>
<p>処理の中核はcreateSelectByFlowという関数です。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
//CSVを返すフローからselect要素を作成
//name select要素のname属性
//sel 選択状態にするoptionのvalue
//url 実行するフローのURL
//params 実行するフローに渡すパラメータのハッシュ
function createSelectByFlow(name, sel, url, params) {
   ...
</pre>
<p>ロード時にselect要素を作成するにはページ内にこの関数をdocument.writeで埋め込みます。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
&lt;script&gt;
document.write(createSelectByFlow("deptCode", "<span style="color:red;">$flow.deptCode</span>", 
    "deptList"));
&lt;/script&gt;
</pre>
<p>スクリプト内にフロー変数を参照するリファレンス変数が埋め込まれていますが、これはVelocityによって置換されるのでブラウザが実行する際にはフロー内で設定された値となっています。</p>
<p>あるselectの変更に応じて別のselectを変更するにはonchangeイベントにその処理を行います。</p>
<pre style="padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
    var empSpan = document.getElementById("empSpan");
    //部署の変更で社員リストを動的に変更
    var deptList = document.form1.deptCode;
    deptList.onchange = function() {
        var deptCode = deptList.value;
        empSpan.innerHTML = createSelectByFlow("empCode", 
                                               "0", 
                                               "empList", 
                                               {deptCode: deptCode});
    };
</pre>
<p>このサンプルは以下のリンクからダウンロードできます。</p>
<p>
<a href="files/VelocitySample.zip">VelocitySample</a>
</p>
<p>ダウンロードしたら「VelocitySample.xfp」をユーザーのホームディレクトリにコピーし、「triggers.xml」をインポートして実行設定を行ってください。
実行のためのURLは「&lt;ユーザーコンテキスト&gt;/VelocitySample/selectEmp」です。</p>
<p>設定を容易にするためすべてのスクリプトをVelocityコンポーネント内で直接入力しましたが、createSelectByFlow関数を含むスクリプトを外部ファイルとしておけば実運用で応用することも可能です。</p>
<p>JavaScriptとの連携を考えた場合、ここで紹介した例にとどまらずVelocityの応用範囲は無限に広がります。jQueryなどのスクリプトライブラリとの親和性も高いので是非自分なりの活用方法を発見してください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>バージョン管理</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20101026-090000.html" />
    <id>tag:asteria.jp,2010:/documentation//5.315</id>

    <published>2010-10-26T00:00:00Z</published>
    <updated>2011-01-28T02:19:55Z</updated>

    <summary> バージョン管理とは Apache Subversion リポジトリ 作業コピー...</summary>
    <author>
        <name>skonishi</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="技術資料" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="subversion" label="Subversion" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="バージョン管理" label="バージョン管理" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<div class="index">
<ol>
<li>
<a href="#h1">バージョン管理とは</a>
</li>
<li>
<a href="#h2">Apache Subversion</a>
<ol>
<li>
<a href="#h2.1">リポジトリ</a>
</li>
<li>
<a href="#h2.2">作業コピー</a>
</li>
<li>
<a href="#h2.3">リビジョン</a>
</li>
<li>
<a href="#h2.4">競合、マージ、ロック</a>
</li>
</ol>
</li>
<li>
<a href="#h3">Subversionサーバーのセットアップ</a>
<ol>
<li>
<a href="#h3.1">インストールマシンの準備</a>
</li>
<li>
<a href="#h3.2">ダウンロード</a>
</li>
<li>
<a href="#h3.3">Subversionのバージョン</a>
</li>
<li>
<a href="#h3.4">インストール</a>
</li>
<li>
<a href="#h3.5">リポジトリの作成</a>
</li>
<li>
<a href="#h3.6">ユーザーの作成</a>
</li>
<li>
<a href="#h3.7">svnserveをサービスとして設定する</a>
</li>
<li>
<a href="#h3.8">リポジトリ内のフォルダー構成を決める</a>
</li>
</ol>
</li>
<li>
<a href="#h4">ASTERIA側の設定</a>
</li>
<li>
<a href="#h5">ASTERIAのSubversion操作</a>
<ol>
<li>
<a href="#h5.1">フローデザイナーからの操作</a>
</li>
<li>
<a href="#h5.2">フローサービス管理コンソールからの操作</a>
</li>
<li>
<a href="#h5.3">flow-ctrlコマンドによる操作</a>
</li>
</ol>
</li>
<li>
<a href="#h6">バージョン管理関連のトピック</a>
<ol>
<li>
<a href="#h6.1">開発機と本番機でのリポジトリの共有</a>
</li>
<li>
<a href="#h6.2">他のSubversionクライアントとの併用</a>
</li>
<li>
<a href="#h6.3">ブランチについて</a>
</li>
</ol>
</li>
</ol>
</div>
<p>ASTERIAでは、オープンソースのバージョン管理システムであるSubversionと連携することで、作成したフローや関連するファイルをバージョン管理することができます。</p>
<h2>
<a name="h1">1. バージョン管理とは</a>
</h2>
<p>バージョン管理とは、日々更新されるファイルを、いつ、誰が、どのような修正をおこなったのかを管理することです。主にソフトウェア開発の場面で行われますが、バージョン管理が有効な場面はそれだけに限りません。</p>
<p>例えば、ExcelワークブックやPowerPointドキュメントなどの業務で使用するファイルを更新する際にも元の状態を残しておきたいことがあります。そうした際に元のファイルを別の場所にバックアップとしてコピーしておき、それからファイルの修正を開始するということは誰もが経験のあることでしょう。</p>
<p>こうした手作業でのコピー＆バックアップも一種のバージョン管理です。しかし、このような手作業での管理では更新履歴や差分を参照することができず、日々の業務の中で管理が煩雑になりがちです。少しファイルの数が多くなってくると、結局どれがいつのファイルかわからなくなったという経験を持つ人も多いのではないでしょうか。</p>
<p>こうしたファイルの更新管理を自動で行ってくれるのがバージョン管理システムです。ファイルの更新時には更新内容をコメントとして記録することができ、そのコメントを手掛かりにいつでも過去のバージョンのファイルを取り出すことができます。また、テキスト形式のファイルであれば更新前後の差分を確認することも可能になります。</p>
<p>バージョン管理システムは一人で使用する場合でも便利ですが、複数の人間が更新する可能性のあるファイルではさらに有効です。その典型的な例がソフトウェア開発です。バージョン管理システムを使用したソフトウェア開発では、いつ、誰が、どのような修正を行ったのかをすべて把握することができ、また仮に複数の人が同時に同じファイルを修正してしまったとしても、自動的なマージや競合の警告といった形でバージョン管理システムがそれぞれの更新を取り成します。</p>
<h2>
<a name="h2">2. Apache Subversion</a>
</h2>
<p>Subversionは、WindowsやLinuxなどの複数のプラットフォームで動作するオープンソースのバージョン管理システムです。2000年より開発が開始され、2009年11月にApache Incubatorプロジェクトに移管されました。現在も活発に開発は継続されており2010年10月現在の最新版は1.6.13です。ライセンスはApache Licenseであり、誰でも無償で自由に使用することができます。</p>
<p>Subversionはsvn、svnadminなどの複数のアプリケーションからなりますが、ここではそれらの個別アプリケーションのコマンドの詳細については説明を省略します。ASTERIAとの連携では主に操作はフローデザイナーから行われるため、それらのコマンドを直接使用することはないからです。</p>
<p>ここでは、Subversionのモデルと考え方について説明し、実際にASTERIAと連携するために必要なもっとも簡単なSubversionサーバーのセットアップ方法を紹介します。</p>
<h3>
<a name="h2.1">2.1. リポジトリ</a>
</h3>
<p>Subversionインストール後にまず最初に行う作業はリポジトリの作成です。</p>
<p>リポジトリとは管理対象のすべてのファイルとその履歴、メッセージなどの保管庫となるものです。通常のファイルシステムと同じように複数のファイルやフォルダーをツリー構造で保持します。</p>
<p>リポジトリを作成するとconf、dbなどの複数のフォルダーがそこに作成されます。confフォルダーにあるファイルは設定変更のため編集することがありますが、それ以外のファイルは通常直接扱うことはありません。</p>
<p>リポジトリのあるホストはSubversionにおけるサーバーとなります。対して、このリポジトリに接続してファイルを出し入れするアプリケーションはSubversionクライアントと呼ばれます。Subversionクライアントには本体に同梱されているコマンドラインアプリケーション「svn」の他にもWindowsエクスプローラに統合された「TortoiseSVN」やEclipseプラグインの「Subversive」などいくつかの種類があり、ASTERIAもそうしたSubversionクライアントの一種です。</p>
<p>リポジトリ作成後はSubversionクライアントがそこにファイルを追加、削除したり、更新したファイルを上書き保存したりします。Subversionクライアントがファイルを削除してもそのファイルが完全に失われることはありません。いつでもリポジトリから削除前のファイルを取りだすことができます。同様に、何度ファイルを上書き保存してもすべての版はリポジトリ内に残っているので、いつでも元に戻すことができます。</p>
<p>Subversionクライアントが、リポジトリが作成されたホスト(Subversionサーバー)と同一ホスト上で動作する場合は、これ以外に設定を行わなくても直接リポジトリに接続することができますが、ネットワークを介して別ホストからアクセスする場合はApache Webサーバーまたは後述するsvnserveを使用してリポジトリを公開する必要があります。</p>
<h3>
<a name="h2.2">2.2. 作業コピー</a>
</h3>
<p>Subversionクライアントはリポジトリからファイルを取り出して作業を行いますが、そのファイルは作業コピーと呼びます。</p>
<p>ユーザーは自分のローカルマシンの中で作業を行う場所を決めて、そこにリポジトリ内のファイルツリーのすべて、または任意のフォルダー以下の一部をそこに取り出します。この操作は「チェックアウト」と呼ばれます。</p>
<p>チェックアウトによってリポジトリからユーザーのローカルフォルダーにコピーされたファイルが作業コピーです。作業コピーは文字通りリポジトリにあるファイルのコピーであり、そこにあるファイルを編集したり削除してもそれが直ちにリポジトリに反映されるわけではありません。作業コピーでの編集内容はSubversionクライアントから「コミット」という操作を行ってはじめてリポジトリに反映されます。</p>
<p>コミットは複数のファイルに対して一度に行うことができ、そのコミットが何のための修正であったかをコメントとして残すことができます。</p>
<p>繰り返しになりますが、作業コピーでどのような編集を行ったとしてもそのファイルはリポジトリでバージョン管理されているのでいつでも元に戻すことができます。また、ローカルマシン上で作業コピーが不要になった場合はいつでも削除できます。作業コピーがなくなってもリポジトリは何の影響も受けないからです。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>チェックアウトを行うとそのフォルダーとすべてのサブフォルダーに「.svn」という隠しフォルダーが作成されます。これはSubversionクライアントが作業コピーの状態を管理するために使用するファイルの置き場所です。</p>
<p>隠しフォルダーは設定によっては最初から表示されませんが、表示されている場合もこのフォルダー内のファイルを直接操作してはいけません。</p>
</div>
<h3>
<a name="h2.3">2.3. リビジョン</a>
</h3>
<p>リポジトリでは連番でリビジョン番号が管理されています。</p>
<p>リポジトリ作成時にはリビジョン番号は0で、コミットが行われるごとに1ずつリビジョン番号は増えていきます。つまり、リポジトリ内のファイルの内容が変わるごとにリビジョンが上がっていくことになります。</p>
<p>Subversionクライアントの作業コピー上でファイルやフォルダーを選択して履歴を表示させると、そのファイル、またはそのフォルダー以下のファイルのリビジョンの一覧を、コミット時に入力したコメント付きで見ることができます。言いかえればそのファイルを、いつ、誰が、何のために更新したかを確認することができます。また、テキストファイルであればリビジョン間の差分を確認することも可能です。</p>
<p>過去のバージョンのファイルを作業コピーとして取得するなどのときにはこのリビジョンを指定して行います。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>正確には「インポート」(任意のフォルダー以下のファイルをまとめてリポジトリに取り込む)などのコミット以外の操作でもリビジョン番号があがることがありますが、考え方は同じです。</p>
</div>
<h3>
<a name="h2.4">2.4. 競合、マージ、ロック</a>
</h3>
<p>ひとりのユーザーが一箇所の作業コピーだけを使用して作業を行っているのであれば、リポジトリに反映される内容はその作業コピーからのコミットだけです。この場合、作業コピーは常にリポジトリの最新リビジョンと同じ内容になりますし、コミットが他の誰かの変更と重なる心配はありません。</p>
<p>しかし複数の人間が同じリポジトリから作業コピーを取得して作業を行っている場合はそうとは限りません。以下のような状況が発生することがあります。</p>
<ol>
<li>ユーザーAがファイル1を編集開始</li>
<li>すこし遅れてユーザーBが同じファイル1を編集開始</li>
<li>ユーザーAがファイル1をコミット</li>
<li>ユーザーBがファイル1をコミットしようとする。しかしこのファイルにはユーザーAの更新内容は含まれてないので。。。</li>
</ol>
<p>もしも最後の段階でユーザーBの変更がそのままコミットできてしまうと、ユーザーAの編集結果は誰も気がつかないうちに消えてしまうことになります。</p>
<p>実際にはこの場合ユーザーBのコミット操作は「編集を行ったファイルが最新のリビジョンではない」という理由で失敗します。</p>
<p>こうした状況を「競合」と呼びます。</p>
<p>複数の人間が同一リポジトリで作業を行う場合、常に競合が発生する可能性がありますが、この問題に対しては次節以降で説明する２つの解決方法があります。</p>
<h4>
<a name="h2.4.1">2.4.1. 両者の修正をマージする</a>
</h4>
<p>まず第一の方法は、両方の修正をマージして反映したファイルを作成し、それをコミットすることです。これをマージ法といいます。対象がテキストファイルで両者の修正個所が重なっていない場合、Subversionはこのマージを自動的に行ってくれます。自動的なマージができない場合は手作業でファイルをマージすることになりますが、Subversionは修正個所を強調したマージを補助するファイルを作成してくれます。</p>
<p>手作業でマージを行った場合はもちろん、自動的なマージが行われた場合もコミット前の最終的な確認は人間の目で行う必要があります。</p>
<h4>
<a name="h2.4.2">2.4.2. ファイルを「ロックが必要なファイル」とする</a>
</h4>
<p>Subversionでは個々のファイルに対して、「ロックが必要なファイル」という設定をすることができます。「ロックが必要なファイル」とは編集を行う前にそのファイルのロックを取得する必要があるファイルのことです。</p>
<p>この場合ユーザーAがファイルを編集するためには、まずそのファイルのロックを取得する必要があります。そして、ユーザーAがロックを持っている状態ではユーザーBはロックを取得することができないので編集が行えません。ユーザーBがロックを取得できるのはユーザーAが編集を終えコミットしてロックを解放した後です。</p>
<p>この方法を使用した場合、競合が発生すること自体を回避できます。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>実際には「ロックが必要なファイル」となっていないファイルに対してもロックをかけることができますし、コミットの前にロックを解放することも可能です。ただし、そこは運用ルールとして徹底しておかないと結局競合が発生してしまうので注意が必要です。</p>
</div>
<p>どちらの方法にも一長一短がありますが、可能な場合はマージ法を取る方が効率が良いと言われています。ロックを取得するのは一手間増えますし、誰かがロックをかけたまま解放するのを忘れることもありえます。</p>
<p>バイナリファイルではマージ法は使えませんが、例えばイメージファイルに対してデザイナーが1名しかいないなどほとんど競合が発生しないことが分かっているのであれば、必ずしもすべてのバイナリファイルを「ロックが必要なファイル」とする必要はありません。そのあたりはバージョン管理の運用ポリシー次第となります。</p>
<p>むしろ重要なのは、競合の可能性を減らすために個々の作業者が普段からこまめにアップデートをかけて作業コピーの状態を最新リビジョンに保つことです。そしてそれ以上に重要なのは、作業者間でコミュニケーションを取ってお互いの作業を把握しておくことです。</p>
<h2>
<a name="h3">3. Subversionサーバーのセットアップ</a>
</h2>
<p>前章でバージョン管理の考え方について説明しました。次は実際に触ってみましょう。ここではWindowsマシンにSubversionサーバーをセットアップする手順を説明します。</p>
<h3>
<a name="h3.1">3.1. インストールマシンの準備</a>
</h3>
<p>Subversionはそれほど大きなリソースを必要とするソフトウェアではありません。日常的に使用しているパソコンにインストールしても問題なく動作します。</p>
<p>管理するファイルの量が多くなれば相応のディスクサイズを消費しますが、それについてだけ気をつければASTERIAサーバーが稼働しているマシンにインストールすることにも問題ありません。</p>
<h3>
<a name="h3.2">3.2. ダウンロード</a>
</h3>
<p>Subversionは、以下のApacheのSubversionサイトのリンクからダウンロードできます。</p>
<p>
<a href="http://subversion.apache.org/">Apache Subversion</a>
</p>
<p>画面左の「Getting Subversion &gt; Binary Packages」から次のページに移るとプラットフォームごとのダウンロード先がリストされたページが表示されます。</p>
<p>Windows版では４つのダウンロード先が表示されており、それぞれのリンク先では独自にビルドしたSubversionが配布されています。どれを選択しても基本的な機能には差がありません。VisualSVNのように独自に機能拡張されたものもありますが、ここではSlikSVNを選択します。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>ここでSlikSVNを選択したのは以下の理由からです。</p>
<ul>
<li>msi形式で配布されているのでインストールが簡単</li>
<li>ダウンロード時にメールアドレス等の個人情報を入力する必要がないため入手のためのハードルが低い</li>
<li>日本語ヘルプが充実している</li>
</ul>
<p>もちろん他のサイトから入手したものを使用しても問題ありません。</p>
</div>
<p>SlikSVNではWindowsの32bit版および64bit版のインストーラーがダウンロード可能となっているので、お使いのOSに合わせたインストーラーをダウンロードしてください。</p>
<h3>
<a name="h3.3">3.3. Subversionのバージョン</a>
</h3>
<p>インストールの説明に入る前にここでSubversionのバージョンについて補足しておきます。</p>
<p>2010年10月現在、Subversionの最新バージョンは「1.6.13」です。</p>
<p>ASTERIAはSubversion1.6相当のSuversionクライアントですが使用している機能は1.5までの機能のみとなっています。基本的にはSubversionはサーバーとクライアントが異なるバージョンであっても動作するので、バージョン1.5以降のSubversionサーバーであればASTERIAとの連携で使用できます。新規にインストールする場合は1.6系の最新版を使用してください。</p>
<h3>
<a name="h3.4">3.4. インストール</a>
</h3>
<p>SlikSVNのインストール手順を以下に記します。</p>
<ol>
<li>ダウンロードした「Slik-Subversion-1.6.xx-win32.msi」をダブルクリックしてインストーラーを起動</li>
<li>ライセンス確認画面でライセンスに同意してNextをクリック</li>
<li>インストールフォルダーの選択画面でインストール先を選択してNextをクリック<br/>(通常は変更する必要はありません。以下の説明では「c:\Program files\SlikSVN」にインストールされているものとして説明します。)</li>
<li>セットアップ種別の選択画面で「Custom」ボタンをクリック</li>
<li>カスタムセットアップ画面で「SvnServe」をインストールに含めてNextをクリック</li>
<li>Installボタンをクリックしてインストールを開始</li>
</ol>
<p>インストールの完了画面が表示されたら「Finish」ボタンをクリックしてインストーラーを終了してください。インストールに成功すると「c:\Program files\SlikSvn\bin」にSubversionのアプリケーションが配置されます。このパスはインストーラーによって環境変数「Path」に自動的に設定されますが、もしもうまく設定されていない場合は手作業で設定を行ってください。</p>
<h3>
<a name="h3.5">3.5. リポジトリの作成</a>
</h3>
<p>インストール後に最初に行う作業はリポジトリの作成です。リポジトリの作成には「svnadmin」コマンドを使用します。
まずはコマンドプロンプトを起動して</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
svnadmin help
</pre>
<p>と入力してください。
インストールに成功してパスが正しく設定されていれば、コマンドのヘルプが表示されます。表示されない場合は環境変数「Path」の設定を見直してください。</p>
<p>svnadminではサブコマンド「create」でリポジトリを作成します。リポジトリをどのフォルダーに作成するかを決めたらそのフォルダーに移動してcreateを実行します。「c:\repos」にリポジトリを作成する場合は次のような手順になります。</p>
<ol>
<li>コマンドプロンプトで「c:\」に移動</li>
<li>「svnadmin create repos」と入力して実行</li>
</ol>
<p>リポジトリを作成すると、エクスプローラー上でそのフォルダーが作成されていることが確認できます。</p>
<h3>
<a name="h3.6">3.6. ユーザーの作成</a>
</h3>
<p>今回はリポジトリの公開にsvnserveを使用しますが、svnserveはデフォルトではユーザー認証不要の設定になっています。つまりリポジトリに接続すれば誰でもそこにあるファイルを読むことができます。</p>
<p>ASTERIAの仕様としてSubversionに接続する際には認証が必須となっているので、これを認証を行うように変更します。</p>
<p>認証設定を行うひとつの方法としてパスワードファイルを使用する方法があります。これはパスワードファイルに記載されたユーザー名、パスワードの組でユーザー認証を行うもっとも簡単な設定方法です。</p>
<p>パスワードファイルを設定する方を以下に記します。</p>
<ol>
<li>リポジトリ内の「conf」フォルダーにあるファイル「svnserve.conf」(c:\repos\conf\svnserve.conf)をテキストエディタで開く。<br/>これはsvnserveの設定ファイルです。「#」で始まる行はコメントであり、デフォルトでは何の設定も行われていません。</li>
<li>以下の2行を修正します。<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
修正前
----
# anon-access = read
# auth-access = write

修正後
----
anon-access = none
auth-access = write
</pre>「anon-access」は認証なしの場合のアクセス権、「auth-access」は認証ありの場合のアクセス権です。これを修正して「認証なしの場合はアクセス権なし、認証ありの場合は読み書き可」に変更します。</li>
<li>password-dbの設定行を変更します。<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
修正前
----
# password-db = passwd

修正後
----
password-db = passwd
</pre>「password-db」はパスワードファイル名の指定です。コメント解除してファイル「passwd」をパスワードファイルとして指定します。</li>
<li>リポジトリ内の「conf」フォルダーにあるファイル「passwd」(c:\repos\conf\passwd)をテキストエディタで開く。先に指定したパスワードファイルです。svnserve.xconfと同じく「#」で始まる行はコメント行です。<br/>このファイルの[users]以下にユーザー名とパスワードを「&lt;ユーザー名&gt; = &lt;パスワード&gt;」の形式で指定します。<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
行追加
----
tarou = password
hanako = password
</pre>
</li>
</ol>
<p>ここまでの設定によりリポジトリにアクセスする際の認証にpasswdファイルで指定したユーザー名とパスワードが使用されるようになります。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>この認証設定方法には</p>
<ul>
<li>パスワードが平文でファイルに保存される</li>
<li>ユーザーが自分でパスワードを変更できない</li>
</ul>
<p>などの欠点があります。</p>
<p>ユーザー認証の主目的がリポジトリの変更を行ったユーザーの識別であればこれでも十分ですが、セキュリティ上の問題がある場合は
ApacheやSSHを使用する別の認証設定を検討してください。</p>
</div>
<h3>
<a name="h3.7">3.7. svnserveをサービスとして設定する</a>
</h3>
<p>svnserveはリポジトリを公開するためのサーバーアプリケーションです。
起動しておくとリポジトリがあるのとは別のマシンから「svn://」という独自プロトコルを用いてリポジトリにアクセスできるようになります。</p>
<p>Subversionを経常的に使用するならばsvnserveをWindowsサービスに登録して常時起動しておくと便利です。
svnserveをWindowsサービスに登録するためのコマンドラインは以下の通りです。</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
sc create svnserve 
   binpath= "\"C:\Program Files\SlikSvn\bin\svnserve.exe\" 
             --service --root c:\repos" 
   displayname= "Subversion" 
   depend= tcpip
    start= auto
</pre>
<p>scコマンドはオプションの指定方法やスペースのエスケープに独自の記法があります。インストールパスとリポジトリの作成パスが同じであれば上記から改行を取り除いた文字列をコピー＆ペーストすることをお勧めします。</p>
<p>サービスの登録に成功したらWindowsメニューの「コントロールパネル ＞ 管理ツール ＞ サービス」から「Subversion」という名前で表示されているサービスを開始します。
次回OS起動時からはサービスの設定により自動的にsvnserveが起動されます。</p>
<div class="adn-memo">
<h4>注意</h4>
<p>・権限について</p>
<p>sc createコマンドは管理者にしか実行できません。</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
[SC] OpenSCManager FAILED 5:
</pre>
<p>というエラーが表示される場合はコマンドプロンプトを右クリックメニューの「管理者として実行」から起動し直してください。</p>
<p>・IPv6について</p>
<p>IPv6がデフォルトになっている環境でsvnserveを実行するとIPv4アドレスを使用するSubversionクライアントからの接続に失敗します。</p>
<p>外部のSubversionクライアントからの接続でエラーとなる場合はscコマンドの引数「binpath」に「--listen-host 0.0.0.0」を追加して登録し直してください。</p>
</div>
<h3>
<a name="h3.8">3.8. リポジトリ内のフォルダー構成を決める</a>
</h3>
<p>ここまでの設定でASTERIAからSubversionに接続するための準備が整いましたが、その前にもうひとつ、リポジトリのフォルダー構成を先に決めておきます。</p>
<p>リポジトリ内のフォルダー構成の考え方は通常のファイル保存の場合と同じです。初期状態ではリポジトリ内は空の状態ですが、そこにユーザーが自由にフォルダーを作成してファイルを整理することができます。</p>
<p>フォルダー構成は後から変更することもできますが、その変更もバージョン管理によって履歴が残されます。できるだけフォルダーツリーの上位の構成については最初に決めた構成を使い続けることが望ましいです。</p>
<p>このリポジトリを使用するのが単一のASTERIAサーバーのみである場合は、リポジトリのルートに「asteriahome」というフォルダーを作成してそこに各ユーザーのホームディレクトリを追加していく方法を推奨します。複数のASTERIAサーバーで共有するのであれば「&lt;サーバー名&gt;/asteriahome」とするのが良いでしょう。ASTERIA以外でもこのリポジトリを使用するのであればまた別の構成があるでしょうし、使用者側でわかりやすい構成に決めてもよいです。</p>
<p>ここでは、リポジトリ直下に「asteriahome」というフォルダーを作成するものとして説明を進めます。方法はいくつかありますが先にsvnserveを設定したので、ここではコマンドラインからsvnプロトコル経由で直接URLを指定してフォルダーを作成してみます。</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
svn mkdir svn://localhost/asteriahome 
    -m "Make asteriahome" 
    --username &lt;username&gt; --password &lt;password&gt;
</pre>
<p>「svn mkdir」コマンドをURL指定で実行した場合、フォルダー作成と同時にコミットまで行われます。</p>
<p>svnプロトコルではサーバー名の指定によりリポジトリのルートディレクトリが参照されます。そこに「asteriahome」というフォルダーを作成するので作成対象のフォルダーのURLは「svn://localhost/asteriahome」となります。「-m」にはコミット時のコメントを指定し、「--username」と「--password」にはパスワードファイルで指定したユーザー名とパスワードを指定します。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>ここではその他のsvnコマンドの解説は省略します。詳細はSubversion関連の書籍またはWebサイトを参照してください。</p>
</div>
<p>これでSubversion側の設定は完了しました。</p>
<h2>
<a name="h4">4. ASTERIA側の設定</a>
</h2>
<p>ASTERIA側でSubversionを使用するための設定は、管理者がフローサービス管理コンソールで行います。まず、ユーザー管理権限を持つASTERIAユーザーで管理コンソールにログインし、バージョン管理を使用したいASTERIAユーザーの設定画面を表示します。(メニューの ツール ＞ アカウント ＞ 所属ユーザーリスト よりユーザーを選択)</p>
<p>ユーザー情報の画面で詳細設定のアイコンをクリックすると画面下部に「バージョン管理設定」が表示されます。各設定項目の意味は以下のとおりです。</p>
<dl style="border: solid 1px #cccccc;padding: 1em;margin-left: 0em;margin-top: 0.5em;">
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">バージョン管理を使用する</dt>
<dd>
<p>このASTERIAユーザーで作成したファイルをバージョン管理するかどうかの指定です。バージョン管理する場合はチェックします。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">Subversion URL</dt>
<dd>
<p>このASTERIAユーザーで作成したファイルを保管するSubversionのリポジトリパスを指定します。先ほど作成したリポジトリで「asteriahome」をASTERIA用のフォルダーと決めたので、例えばASTERIAユーザー「guest」のファイルを管理するURLの場合は</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
svn://&lt;SERVERNAME&gt;/asteriahome/guest
</pre>
<p>のように指定します。</p>
<p>この時点でリポジトリには「asteriahome/guest」というフォルダーは存在しないので、最後の「URLに対応するフォルダーをリポジトリに作成する」もチェックします。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">Subversion ユーザ名</dt>
<dd>
<p>Subversionのユーザー名を指定します。このユーザー名はパスワードファイルに指定したユーザー名です。ASTERIAユーザーとは無関係でありASTERIAユーザー名とは異なるユーザー名でも構いません。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">Subversion パスワード</dt>
<dd>
<p>Subversionのユーザーのパスワードを指定します。このパスワードはパスワードファイルに指定したパスワードです。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">無視するファイルのパターン</dt>
<dd>
<p>バージョン管理を行わないファイルのパターンをカンマ区切りで指定します。デフォルトでは「.*;_*;*.xfp2;*.$$$」となっています。このパターンは</p>
<ul>
<li>「.*」「_*」 - ASTERIAの隠しフォルダー</li>
<li>「*.xfp2」 - プロジェクトコンパイル時の中間ファイル</li>
<li>「*.$$$」 - フローデザイナーのロックファイル</li>
</ul>
<p>を表しており、通常はこれらのパターンをこの設定から外す必要はありません。これ以外にバージョン管理する必要のないことがわかっているファイルパターンがあるならば追加で設定します。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">ロックが必要なファイルのパターン</dt>
<dd>
<p>競合対策として「ロックが必要なファイル」とするファイルのパターンをカンマ区切りで指定します。デフォルトでは「*.xfp;*.xmp;*.xvar;*.xsf」となっています。このパターンは</p>
<ul>
<li>「.xfp」 - フローのプロジェクトファイル</li>
<li>「*.xmp」 - 関数コレクションのファイル</li>
<li>「*.xvar」 - 外部変数セットのファイル</li>
<li>「*.xsf」 - ストリーム定義セットのファイル</li>
</ul>
<p>を表しています。これらのファイルはバイナリファイルではありませんが、競合時のマージを正確に行う方法がない(ファイルフォーマットが公開されていないためユーザーが手作業でのマージや自動マージの結果検証を行うことができない)ためにロックが必要としています。</p>
<p>これ以外に「*.xls」など他にバージョン管理したいバイナリファイルのファイルパターンがあるならば追加で設定します。逆に開発者が一人だけの場合など競合が発生しないことが分かっている場合は、この設定は空にしてしまっても問題ありません。</p>
</dd>
<dt style="font-weight: bold;border-bottom: solid 1px #cccccc;color: #999999;margin-top: 1em;">URLに対応するフォルダーをリポジトリに作成する</dt>
<dd>
<p>はじめてバージョン管理を設定する場合など、このASTERIAユーザーに対応するフォルダーがリポジトリに存在しない場合にチェックすると、リポジトリにSubversion URLに指定したURLに対応するフォルダーが作成されます。</p>
</dd>
</dl>
<p>バージョン管理設定を行っても既にユーザーのホームディレクトリに存在している既存ファイルは自動的にリポジトリに追加されません。既存ファイルは未管理状態となるので必要に応じてデザイナーから追加、コミットしてください。</p>
<p>「無視するファイル」「ロックが必要なファイル」はここでのパターンマッチングによる自動設定以外にもファイルを選択して個別に設定することも可能です。</p>
<h2>
<a name="h5">5. ASTERIAのSubversion操作</a>
</h2>
<p>ASTERIAからのSubversion操作はフローデザイナー、フローサービス管理コンソール、flow-ctrlから行うことができます。ほとんどの操作はフローデザイナーから行います。</p>
<div class="adn-memo">
<h4>メモ</h4>
<p>クライアントとサーバーの関係を厳密にいえばSubversionクライアントなのはASTERIAサーバー(FlowService)です。
フローデザイナーはASTERIAサーバーのクライアントでありASTERIAのSubversion操作のユーザーインターフェースです。</p>
<p>フローデザイナーからの操作はASTERIAサーバーに送られ、それを受けたASTERIAサーバーからSubversionサーバーに対してリクエストが送られます。</p>
</div>
<h3>
<a name="h5.1">5.1. フローデザイナーからの操作</a>
</h3>
<p>バージョン管理が設定されたASTERIAユーザーにフローデザイナーで接続するとツリーペインとファイルペインにバージョン管理の状態アイコンが表示されます。バージョン管理関連の操作はすべて</p>
<ul>
<li>ツリーペインでノードを選択しての右クリックメニュー</li>
<li>ファイルペインでファイルを選択しての右クリックメニュー</li>
<li>バージョン管理ツールバー</li>
</ul>
<p>のいずれかから実行でき、主要な操作はほとんどツールバーから実行できます。</p>
<p>フローデザイナーからは追加、コミットなどのASTERIAがサポートするすべてのSubversionクライアント操作が実行できます。具体的な操作方法についてはフローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/index_guide.html#svn.html">「フローデザイナー」-「バージョン管理」</a>以下のマニュアルを参照してください。</p>
<h3>
<a name="h5.2">5.2. フローサービス管理コンソールからの操作</a>
</h3>
<p>バージョン管理が設定されたASTERIAユーザーでフローサービス管理コンソールにログインした場合、メニューの 状態 ＞ バージョン管理 の画面で</p>
<ul>
<li>現在の作業コピーの状態確認</li>
<li>更新履歴の確認</li>
<li>最新版または任意のリビジョンへの作業コピーの更新</li>
</ul>
<p>を行うことができます。
フローサービス管理コンソールから行える操作はこの３つだけで、ファイルの追加、削除、コミットなどは行えません。具体的な操作方法についてはフローサービスマニュアルの<a href="/documentation/warp/current/flow/mc/status.html#versioncontrol_top">フローサービス管理コンソール(FSMC)オンラインヘルプ</a>を参照してください。</p>
<h3>
<a name="h5.3">5.3. flow-ctrlコマンドによる操作</a>
</h3>
<p>バージョン管理が設定されたASTERIAユーザーでflow-ctrlにログインした場合、バージョン管理関連のコマンドとして</p>
<ul>
<li>svn stauts - 現在の作業コピーの状態確認</li>
<li>svn log - 更新履歴の確認</li>
<li>svn update - 最新版または任意のリビジョンへの作業コピーの更新</li>
</ul>
<p>を実行することができます。flow-ctrlから行える操作はこの３つだけで、ファイルの追加、削除、コミットなどは行えません。具体的な操作方法についてはフローサービスマニュアルの<a href="/documentation/warp/current/flow/designer/flow-ctrl.html#svn">flow-ctrlコマンドリファレンス</a>を参照してください。</p>
<h2>
<a name="h6">6. バージョン管理関連のトピック</a>
</h2>
<p>ここではバージョン管理を使用する場合のちょっとしたトピックを紹介します。</p>
<h3>
<a name="h6.1">6.1. 開発機と本番機でのリポジトリの共有</a>
</h3>
<p>ステージングサーバーが導入されている場合、通常、本番機と開発機のホームディレクトリは同じ内容を共有します。こういった環境では、バージョン管理機能を使用することで、両環境で同じリポジトリを参照するように設定すれば、開発機で作成した成果物の本番機への移行がスムーズに行うことができます。</p>
<p>バージョン管理を利用した開発サイクル</p>
<ol>
<li>開発機でフロー、テンプレートファイルなどの作成、修正</li>
<li>開発機で検証の終わったフロー、テンプレートファイルをリポジトリにコミット</li>
<li>本番機でリポジトリから検証の終わったリビジョンの作成物を取得</li>
<li>本番機では、次版に向けた開発や保守を実施→2.</li>
</ol>
<p>さらに、開発機側のフローサービス管理コンソールのアカウント設定で「プロジェクト更新時にエクスポートファイルを作成する」をオンにし、そのエクスポートファイルもバージョン管理に含めておくことで実行設定の移行も簡便化できます。具体的には開発機側でのリポジトリへのコミットが終わった後に本番機側でflow-ctrlにログインして以下のコマンドを実行します。</p>
<pre style="margin-left: 20pt;margin-right: 20pt;padding: 5pt;background-color: #eeeeff;border: 1px solid black;">
#リポジトリから最新版を取得する
svn update

#プロジェクトキャッシュのクリア
clear project-pool

#実行設定のインポート。「-r」を指定することで実行設定の総入れ替え
import triggers.xml -r
</pre>
<p>本番機では「プロジェクト更新時にエクスポートファイルを作成する」のチェックは外しておきます。</p>
<p>スケジュールが重複するなどの理由で開発機と本番機の実行設定が同期していない場合はこの方法はそのまま使用はできませんが、registコマンドを使用したスクリプトと併用することである程度の自動化ができる場合もあります。</p>
<h3>
<a name="h6.2">6.2. 他のSubversionクライアントとの併用</a>
</h3>
<p>ASTERIAサーバーがWindowsマシン上で動作しており、そのマシンにTortoiseSVNがインストールされていると、ASTERIAユーザーのホームディレクトリ以下にあるファイルをエクスプローラーで見た場合にTortoiseSVNの状態管理アイコンが表示されます。これは、バージョン管理設定を行ったホームディレクトリにSubversionの状態管理用の隠しフォルダー「.svn」が作成され、TortoiseSVNがそれを認識するためです。</p>
<p>このときにエクスプローラーのTortoiseSVNのメニューからバージョン管理の操作を実行するとほとんどの場合は問題なく実行できます。しかし、これは基本的にはやってはいけません。このときにTortoiseSVNが「.svn」フォルダー内のファイルを書きかえることがあり、不整合が発生する場合があるからです。</p>
<p>異なるSubversionクライアントでも「.svn」内のファイル仕様は基本的に共通ですが、バージョンが異なる場合などに不整合が発生して、一方のクライアントからはまったく読み書きできなくなることがあります。他のSubversionクライアントを併用する場合はASTERIAユーザーのホームディレクトリを直接参照せず、別のフォルダーに作業コピーをチェックアウトするようにしてください。</p>
<p>なお、万が一「.svn」フォルダーが壊れてしまった場合は以下の手順で復旧させることができます。</p>
<ol>
<li>ユーザーのホームディレクトリを適当な名前でリネーム</li>
<li>同じ名前で空のユーザーホームディレクトリを作成する</li>
<li>フローサービス管理コンソールのバージョン管理設定で「変更」ボタンをクリック</li>
<li>リネームした元の出フォルダーからバージョン管理外のファイルをコピー</li>
</ol>
<p>バージョン管理設定で「.svn」フォルダーがない状態から既にファイルのあるリポジトリを指定した場合、チェックアウトが実行されるのでこうした復旧が可能となっています。</p>
<h3>
<a name="h6.3">6.3. ブランチについて</a>
</h3>
<p>ASTERIAのSubversionクライアントにはブランチ操作はありません。</p>
<p>ただし、ブランチ自体はサーバー側の機能なので別のSubversionクライアントを使用してブランチを作成することはできます。</p>
<p>作成したブランチに対してバージョン管理設定を行うことに問題はありませんが、競合のマージの場合と同じくxfpなどのフロー関連ファイルのマージは保証されません。</p>]]>
        
    </content>
</entry>

<entry>
    <title>ASTERIA WARP4.5の新機能</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20101008-150000.html" />
    <id>tag:asteria.jp,2010:/documentation//5.344</id>

    <published>2010-10-08T06:00:00Z</published>
    <updated>2010-10-18T13:51:49Z</updated>

    <summary>バージョン4.5で新しい機能、強化された機能のコンポーネント、関数、アクションに...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="パイプラインサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="強化された機能" label="強化された機能" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="新しい機能" label="新しい機能" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<p>バージョン4.5で新しい機能、強化された機能のコンポーネント、関数、アクションについて紹介します。<br />※細かな変更については<a href="http://asteria.jp/documentation/warp/4.5/UpdateNotes.txt">「更新履歴」</a>を参照してください。</p><p><br /></p>
<h2 id="f01_01">[クラウド対応]</h2>
<p>クラウド対応をさらに強化し、クラウド上に置かれたデータの連携を簡単確実に行うことができるようになりました。※これらの機能は有償オプションです。</p><p align="right"><a href="http://www.infoteria.com/jp/asteria_cafe/cloud/cloud.php">ASTERIA Caf</a><a href="http://www.infoteria.com/jp/asteria_cafe/">é</a><a href="http://www.infoteria.com/jp/asteria_cafe/cloud/cloud.php"> クラウド特集&gt;&gt;</a></p>
<h3 id="f01_01_02">◎Windows Azure</h3>
<p>Windows Azureストレージサービスの入出力を行うコンポーネントが追加されました。</p><p align="right"><a href="http://www.infoteria.com/jp/asteria/product/w_option09.php">詳細な機能紹介&gt;&gt;</a><br /></p><p><b>「Azure」タブ</b> <font color="red">(new)</font>
</p><ul class="adn-list"><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureBlob%28Get%29.html">AzureBlobGet</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureBlob%28Put%29.html">AzureBlobPut</a></li><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureQueue%28Get%29.html">AzureQueueGet</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureQueue%28Put%29.html">AzureQueuePut</a></li><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureTable%28Get%29.html">AzureTableGet</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AzureTable%28Put%29.html">AzureTablePut</a></li></ul>
<br />
<h3 id="f01_01_03">◎Amazon Web Service</h3>
<p>Amazon Web Serviceの入出力を行うコンポーネントが追加されました。</p><p align="right"><a href="http://www.infoteria.com/jp/asteria/product/w_option10.php">詳細な機能紹介&gt;&gt;</a></p><p><b>「Amazon 」タブ</b> <font color="red">(new)</font></p>
<ul class="adn-list"><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_S3%28Get%29.html">AWS S3Get</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_S3%28Put%29.html">AWS S3Put</a></li><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_SQS%28Get%29.html">AWS SQSGet</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_SQS%28Put%29.html">AWS SQSPut</a></li><li><a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_SimpleDB%28Get%29.html">AWS SimpleDBGet</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#AWS_SimpleDB%28Put%29.html">AWS SimpleDBPut</a></li></ul>
<br />
<h3 id="f01_01_04">◎Salesforce（パイプライン）</h3>
<p>パイプラインで、Salesforce AppExchange APIを利用してSalesforceとのデータをやりとりするアクションが追加されました。</p><p align="right"><a href="http://www.infoteria.com/jp/asteria/product/w_option11.php">詳細な機能紹介&gt;&gt;</a></p>
<ul class="adn-list"><li><b>センサー</b> 「Salesforce」 <font color="red">(new)</font><br />
<a href="/documentation/warp/4.5/pipeline/index_action.html#A0198.html">Salesforceのデータを取り込み</a></li>
<li><b>ジョイント</b> 「Salesforce」 <font color="red">(new)</font><br />
<a href="/documentation/warp/4.5/pipeline/index_action.html#A0177.html">Salesforceに新規にデータを追加</a> / <a href="/documentation/warp/4.5/pipeline/index_action.html#A0178.html">Salesforceのデータを削除</a> / <a href="/documentation/warp/4.5/pipeline/index_action.html#A0179.html">Salesforceのデータを更新</a> / <a href="/documentation/warp/4.5/pipeline/index_action.html#A0180.html">Salesforceのデータを更新・登録</a></li></ul>
<br /><h2 id="f02_01">[RDB処理の高速化]</h2>

<ul class="adn-list">
<li>データベースへの処理が高速化できる<a href="../../documentation/warp/4.5/flow/designer/index_component.html#FastInsert.html">FastInsert</a>、<a href="../../documentation/warp/4.5/flow/designer/index_component.html#RDBMerge.html">RDBMerge</a>コンポーネントが追加されました。</li><li>RDBPutコンポーネントに「バッチ処理件数」プロパティが追加され、DBMSに対して一括で送信するSQL文の数を指定することができるようになりました。<br />
</li><li>SQLビルダーでDISRINCTとGROUP BYをサポートしました。</li><li>OracleのXML対応をしました。</li>
<li>RDBPut、RDBDiffコンポーネントで表示名を指定することができるようになりました。</li>
</ul>
<br /><h2 id="f02_02">[Excel XLSX対応]</h2>
<p>Microsoft Excelの.xlsx形式に対応した新しい<a href="/documentation/warp/4.5/flow/designer/index_component.html#ExcelInput3.html">ExcelPOIInput</a>、<a href="/documentation/warp/4.5/flow/designer/index_component.html#ExcelOutput3.html">ExcelPOIOutput</a>コンポーネントが追加されました。</p>
<br /><h2 id="f02_03">[Webservice]</h2>
<p>「インターネット」タブに<a href="/documentation/warp/4.5/flow/designer/index_component.html#REST.html">REST</a>コンポーネントが追加されました。<a href="/documentation/warp/4.5/flow/designer/index_component.html#HttpEnd.html">HTTPEnd</a>コンポーネントで入力ストリームをJSON変換して出力することができ、JSONPのコールバックを指定することもできるようになりました。<a href="/documentation/warp/4.5/flow/designer/index_component.html#WebService.html">WebService</a>コンポーネントはSOAPヘッダーに対応しました。</p>
<br /><h2 id="f02_04">[OnSheet]</h2>
<p>OnSheetの入力フォームビューを作成する<a href="/documentation/warp/4.5/flow/designer/index_component.html#OnSheetGenerate.html">OnSheetForm</a>コンポーネントが追加されました。OnSheetInput、OnSheetOutputコンポーネントに「セル範囲」プロパティが追加され、実行時にセル範囲をずらして値を設定することができるようになりました。ExcelやOnSheetの行と列の位置を加減算した文字列を返す<a href="../../documentation/warp/4.5/flow/designer/index_function.html#CellCalc.html">CellCalc</a>マッパー関数が追加されました。</p>
<div align="right">「ASTERIA Spreadsheet Server OnSheet」については<a href="http://www.infoteria.com/jp/asteria/product/w_option08.php">こちら&gt;&gt;</a><br /><br /></div>
<br /><h2 id="f03">[上記以外の新コンポーネント / マッパー関数 / アクション]</h2>
<h3 id="f03_01">◎コンポーネント</h3>
<p><b>「ストリーム」タブ</b> - <a href="/documentation/warp/4.5/flow/designer/index_component.html#EncryptAES.html">EncryptAES</a> / <a href="/documentation/warp/4.5/flow/designer/index_component.html#DecryptAES.html">DecryptAES</a></p>
<h3 id="f03_02">◎マッパー関数</h3>
<p><b>「変換」タブ</b> - <a href="/documentation/warp/4.5/flow/designer/index_function.html#EncryptAES.html">EncryptAES</a> / <a href="/documentation/warp/4.5/flow/designer/index_function.html#DecryptAES.html">DecryptAES</a></p>

<h3 id="f03_03">◎アクション</h3>
<p><b>センサー</b>「ソフトウェア」<br />
<a href="/documentation/warp/4.5/pipeline/index_action.html#A0237.html">PINGによる監視</a></p>
<p><b>フィルター</b>「文字列」<br />
<a href="/documentation/warp/4.5/pipeline/index_action.html#A0235.html">AES暗号方式を使用して暗号化</a> / <a href="/documentation/warp/4.5/pipeline/index_action.html#A0236.html">AES暗号方式を使用して復号化</a></p>
<p><b>ジョイント</b>「ソフトウェア」<br />
<a href="/documentation/warp/4.5/pipeline/index_action.html#A0238.html">1レコードずつパイプラインを実行</a></p>
]]>
        
    </content>
</entry>

<entry>
    <title>ASTERIA WARPチュートリアルガイド [第７版]</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20100802-090000.html" />
    <id>tag:asteria.jp,2010:/documentation//5.293</id>

    <published>2010-08-02T00:00:00Z</published>
    <updated>2011-12-28T06:35:25Z</updated>

    <summary>ASTERIA WARPに初めてさわる方、無料体験版で評価してみたい方、実際に開...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[ASTERIA WARPに初めてさわる方、無料体験版で評価してみたい方、実際に開発・メンテナンス・サポートにかかわる方を対象に、ASTERIA WARPの概要、製品構成から実際にフローデザイナーを使ってフローを作成、実行する手順を習得できる内容になっています。<br /><br /><ul><li><a href="files/ASTERIA_WARP_tutorial.pdf">ASTERIA WARPチュートリアルガイド [第７版]</a></li><li><a href="files/guest.zip">教材データ(ZIP形式)</a></li></ul><br />※ガイドはPDF形式、99ページ、ファイルサイズ 7.3MBです。<br />※本書で使用しているASTERIA WARPのバージョンは4.4.0.4295です。<br />※本書はWindows環境を利用しています。RDBを使ったフローはODBCを前提としています。<br />※パイプラインを作成、実行する手順は含まれていません。<br /><br /><h4>【目次】</h4>1.　ASTERIA WARPの起動と接続<br />1.1　ASTERIA WARPについて<br />1.2　サーバーを起動する<br />1.3　デザイナーを起動する<br />1.4　デザイナーからサーバーへ接続する<br />1.5　デザイナーの画面<br />2.　フローの実行（基本操作）<br />2.1　教材フローの処理を確認し、実行してみましょう<br />2.2&nbsp;&nbsp; &nbsp;新規にフローを作成して、実行してみましょう<br />2.3&nbsp;&nbsp; &nbsp;FSMCへログインし、実行ログの確認をしてみましょう<br />3.　フローの作成と実行<br />3.1　RDBにアクセスするフローを作成して、実行してみましょう<br />3.2　RDBから取り出したデータをCSV形式に変換(マッピング)するフローを作成して、実行してみましょう<br />3.3　Excel連携　教材フローと同じ処理のフローを作成して、実行してみましょう<br />3.4　RDBを更新するフローを作成して、実行してみましょう<br />補足1　データベース(Microsoft Access)との連携<br />補足2　ASTERIA WARPからデータベースへの接続<br />補足3　ログビューアーについて<br />補足4　Exception設定について<br /><br /><h4> 【教材データの使い方】</h4>教材データはガイドで使用するフローやサンプルデータです。ASTERIA WARPをインストール後にguestユーザーのホームディレクトリにコピーしてください。<br /><br /><ol><li>教材データを一時的なフォルダーにダウンロードして解凍します。</li><li>解凍したguestフォルダーの中身をguestユーザーのホームディレクトリにコピーします。ホームディレクトリのパスはプラットフォームによって異なります。Windowsに初期値のままインストールした場合のパスは「C:\asteriahome\flow\home\guest」です。</li></ol>※フローサービスを起動した状態やフローデザイナーから接続した状態でもコピーできますが、できるだけフローサービスを停止、フローデザイナーから切断した状態でコピーしてください。<br />]]>
        
    </content>
</entry>

<entry>
    <title>ASTERIA WARP4.4フローサービスの新機能</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20100520-090000.html" />
    <id>tag:asteria.jp,2010:/documentation//5.230</id>

    <published>2010-05-20T00:00:00Z</published>
    <updated>2010-10-05T01:39:49Z</updated>

    <summary>バージョン4.4で新しい機能、強化された機能について主なものを紹介します。細かな...</summary>
    <author>
        <name>Michi Okajima</name>
        
    </author>
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="強化された機能" label="強化された機能" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="新しい機能" label="新しい機能" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[<p>バージョン4.4で新しい機能、強化された機能について主なものを紹介します。細かな変更については<a href="http://asteria.jp/documentation/warp/4.4/UpdateNotes.txt">「更新履歴」</a>を参照してください。</p>
<br /><h2><a href="#f01">[新しい機能]</a></h2>
<ul>
<li><a href="#f01_01">OnSheet連携</a></li>
<li><a href="#f01_02">マッパーのデバッグ</a></li>
<li><a href="#f01_03">コンポーネントテンプレート</a></li>
</ul>
<br /><h2><a href="#f02">[強化された機能]</a></h2>
<ul>
<li><a href="#f02_01">Excel関連コンポーネント</a></li>
<li><a href="#f02_04">チャート関連コンポーネント</a></li>
<li><a href="#f02_02">仕様書出力</a></li>
<li><a href="#f02_05">flow-ctrlコマンド</a></li>
<li><a href="#f02_06">マッピング項目</a></li>
<li><a href="#f02_03">コンポーネント処理の強制終了</a></li>
</ul>
<br /><h2><a href="#f03">[コンポーネント / マッパー関数]</a></h2>
<ul>
<li><a href="#f03_01">コンポーネント</a></li>
<li><a href="#f03_02">マッパー関数</a></li>
</ul>
<br /><h2 id="f01">[新しい機能]</h2>
<br /><h3 id="f01_01">OnSheet連携</h3>
<p>フローデザイナーのパレットの「OnSheet」タブにあるOnSheet関連コンポーネントを使用して、OnSheetサーバー上のスプレッドシートに対してさまざまな操作を行うことができます。</p>
<img src="http://asteria.jp/documentation/images/f01_01-1.png" alt="パレットのOnSheetタブ" vspace="16" />
<p>OnSheetサーバーとは、インフォテリア社によって提供されるWebブラウザ上で利用可能なスプレッドシートサーバー製品「<a href="http://www.infoteria.com/jp/asteria/product/w_option08.php" target="_blank">ASTERIA Spreadsheet Server OnSheet</a>」です。Excelのような表計算インターフェイスで、ワークシートの作成から管理までWebブラウザのみで行える環境を提供します。 </p>
<p>フローサービスとOnSheetを連携すると、以下のような処理を実現することができます。</p>
<ul>
<li>スケジューラーで定期実行するフローで、データベースにある情報を取得してOnSheetワークシートに書き込んでおくと、データベースにある最新の情報をOnSheetをとおしてWebブラウザで参照することができます。<br />
<img src="http://asteria.jp/documentation/images/f01_01-2.png" alt="OnSheetサンブルフロー" vspace="16" /></li>
<li>OnSheetワークシート上に作成したフロー実行ボタンをクリックしてフローを実行し、ワークシートに入力した情報をデータベースに書き込むことができます。</li>
<li>OnSheetワークシートで検索条件を入力後、OnSheet上に作成したフロー実行ボタンをクリックしてフローを実行し、検索条件に一致するデータを取得してOnSheetワークシートに書きこむようにしておくと、検索条件に一致するデータをOnSheetをとおしてリアルタイムに参照することができます。</li>
</ul>
<p>このほか、表計算ワークシートをさまざまな形式に変換して出力したり、メールと連携したり、フローで実現できるさまざまなデータ連携を行うことができます。OnSheetでは、ExcelファイルをインポートしてOnSheetワークシートを作成したり、OnSheetワークシートをExcelファイルとしてエクスポートしたりすることができ、データを簡単に移行することができます。</p>
<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetUse.html">「コンポーネント」-「OnSheetとの連携について」</a></li>
</ul>
<br /><h3 id="f01_02">マッパーのデバッグ</h3>
<p>マッパーのデバッグ機能として、以下の２つの機能が追加されました。</p>
<ul>
<li>マッパーの設計時に仮の値を使用してマッピングの動作を確認することができる「マッパーシミュレーター」</li>
<li>フローのデバッグ実行時に、マッパーで使用しているマッパー関数の入出力値を確認することができる「マッパーデバッガー」</li>
</ul>
<br /><h4>マッパーシミュレーター</h4>
<p>フロー設計中に、マッピングウィンドウの「シミュレーター」ボタンをクリックして表示される画面で、入力した値から各関数の実行結果と出力の値を確認することができます。</p>

<img src="http://asteria.jp/documentation/images/f01_02-1.png" alt="マッパーシミュレーター" vspace="16" />
<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index_guide.html#mapper_simulate.html">「フローデザイナー」-「マッピング」-「マッパーシミュレーター」</a></li></ul>
<br /><h4>マッパーデバッガ</h4>
<p>フローデザイナーでのデバッグ中にマッパーコンポーネントでステップインするとマッパー画面で関数や項目の値を確認することができます。</p>

<img src="http://asteria.jp/documentation/images/f01_02-2.png" alt="マッパーデバッガ" vspace="16" />
<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index_guide.html#debug_exec_stepin.html">「フローデザイナー」-「フローのデバッグ」-「デバッガの使い方」-「コンポーネントを1つ分実行する」</a></li></ul>

<br /><h3 id="f01_03">コンポーネントテンプレート</h3>
<img src="http://asteria.jp/documentation/images/f01_03-1.png" alt="コンポーネントテンプレート" vspace="16" />
<p>コンポーネントのよく使うプロパティ設定とストリーム定義をまとめてテンプレートとして保存しておくことができます。テンプレート保存時に「初期値」にすると、パレットからドロップしたときに保存したテンプレートのプロパティやストリーム定義がコンポーネントの初期値として設定されます。マッパー関数にも使うことができます。</p>
<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index_guide.html#component_template.html">「フローデザイナー」-「デザイナーのカスタマイズ」-「コンポーネントテンプレート/マッパー関数テンプレート」</a></li></ul>
<br />
<h2 id="f02">[強化された機能]</h2>
<br /><h3 id="f02_01">Excel関連コンポーネント</h3>
<p>フローデザイナーのパレットで、Excel関連コンポーネントは「ツール」タブから「Excel」タブに移動しました。</p>

<img src="http://asteria.jp/documentation/images/f02_01-1.png" alt="パレットのExcelタブ" vspace="16" />

<p>以下のコンポーネントが追加されました。</p>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ExcelSheetList_jp.html">ExcelSheetList</a> - Excelファイル中のワークシートの一覧を取得します</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ExcelSheetDelete_jp.html">ExcelSheetDelete</a> - Excelファイルから指定されたワークシートを削除します</li>
</ul>
<br /><h3 id="f02_02">仕様書出力</h3>
<p>仕様書出力機能で出力するHTMLが変更され、トップは一覧ページになりました。出力対象のプロジェクトでどのコンポーネント、関数が何個使われているかなどの統計情報や仕様書が１ページにまとめられた印刷用ページが出力されるようになりました。</p>

<img src="http://asteria.jp/documentation/images/f02_02-1.png" alt="仕様書出力" vspace="16" />
<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index_guide.html#spec.html">「フローデザイナー」-「仕様書出力」</a></li></ul>
<br /><h3 id="f02_03">コンポーネント処理の強制終了</h3>
<p>フローを強制終了すると、通常は実行中のコンポーネントの処理が終了してから次のコンポーネントに制御が遷移する時点でフローがアボートしますが、以下のコンポーネントでは実行中の処理を強制的に終了してフローがアボートするようになりました。</p>
<ul>
<li>RDBGet / RDBPut / SQLCall</li>
<li>HTTPGet / HTTPPost</li>
<li>FTPGet / FTPPut</li>
<li>Sleep</li>
<li>Mutex</li>
<li>EXE</li>
</ul>
<br /><h3 id="f02_04">チャート関連コンポーネント</h3>
<p>グラフの種類によってコンポーネントが分割され、「ツール」タブから「チャート」タブに移動しました。</p>

<img src="http://asteria.jp/documentation/images/f02_04-1.png" alt="パレットのチャートタブ" vspace="16" />

<p>円グラフと棒グラフではHTMLのareaタグが出力され、グラフのクリックやリンクでJavaScriptの実行などインタラクティブな処理が可能になります。作成できるチャートの種類は以下のとおりです。</p>
<p>円グラフ / 棒グラフ / 積上げ棒グラフ / 複数棒グラフ / 折れ線グラフ / エリアグラフ / 散布図 / バブルチャート / ガントチャート</p>
<br /><h3 id="f02_05">flow-ctrlコマンド</h3>
<p>以下の機能が追加されました。</p>
<ul>
<li>実行設定登録コマンドの全実行設定、オプション対応</li>
<li>実行設定の有効/無効を制御するenable/disableコマンド追加</li>
<li>実行設定の削除/有効/無効が名前で指定可能</li>
<li>拡張トランザクションの手動リカバリーコマンド追加</li>
<li>関数プールの表示コマンド追加</li>
</ul>
<ul class="adn-list">
<li><a href="http://asteria.jp/documentation/warp/4.4/flow/designer/flow-ctrl.html">「flow-ctrlコマンドリファレンス」</a></li></ul>

<br /><h3 id="f02_06">マッピング項目</h3>

<p>「ステータス」フィールドが追加されました。このフィールドに対してマッピングした内容がステータス文字列として記録されます。</p>
<p>処理に時間がかかるリクエストを実行中の場合に、処理がどこまで行われているか確認するために記録、参照すると便利です。管理コンソールの「状態」-「フロー」-「リクエスト一覧」でリクエストの詳細情報を表示すると、ステータス文字列を確認することができます。また、flow-ctrlコマンドなどの外部クライアントから確認することができます。flow-ctrlコマンドでは、show requestまたはshow workerコマンドで確認することができます。</p>

<img src="http://asteria.jp/documentation/images/f02_06-1.png" alt="マッピング項目" vspace="16" />

<ul class="adn-list">
<li>「フローサービスマニュアル」の<a href="/documentation/warp/4.4/flow/designer/index.html#topic_mapper.html">「はじめに」-「詳細なトピック」-「フローの校正要素」-「マッパー」</a>の「ステータス」</li></ul>
<br /><h2 id="f03">[コンポーネント / マッパー関数]</h2>
<br /><h3 id="f03_01">コンポーネント</h3>
<br /><h4>「OnSheet」タブ <font color="red">(new)</font></h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetInput_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_input.png" />OnSheetInput</a> - OnSheetからデータを読み込みます</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetOutput_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_output.png" />OnSheetOutput</a> - OnSheetへデータを書き込みます</li>

<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetExport_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_export.png" />OnSheetExport</a> - OnSheetのワークブックをダウンロードします</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetImport_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_import.png" />OnSheetImport</a> - OnSheetへワークブックをアップロードします</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetRest_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_rest.png" />OnSheetRest</a> - OnSheetメソッドの実行</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorkbookList_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_workbook_list.png" />OnSheetWorkbookList</a> - OnSheetワークブック一覧</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorkbookCreate_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_workbook_create.png" />OnSheetWorkbookCreate</a> - OnSheetワークブック作成</li>

<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorkbookDelete_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_workbook_delete.png" />OnSheetWorkbookDelete</a> - OnSheetワークブック削除</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetRevisionCreate_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_workbook_revision.png" />OnSheetRevisionCreate</a> - OnSheetバージョン作成</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorksheetList_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_worksheet_list.png" />OnSheetWorksheetList</a> - OnSheetワークシート一覧</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorksheetCreate_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_worksheet_create.png" />OnSheetWorksheetCreate</a> - OnSheetワークシート作成</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#OnSheetWorksheetDelete_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/onsheet_worksheet_delete.png" />OnSheetWorksheetDelete</a> - OnSheetワークシート削除</li>

</ul>
<br /><h4>「チャート」タブ <font color="red">(new)</font></h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#Graph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/Graph.png" />Graph</a> - グラフを作成します</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#PieGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_pie.png" />PieGraph</a> - 円グラフ</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#BarGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_bar.png" />BarGraph</a> - 棒グラフ</li>

<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#StackedBarGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_stackedbar.png" />StackedBarGraph</a> - 積上げ棒グラフ</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#MultiBarGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_multibar.png" />MultiBarGraph</a> - 複数棒グラフ</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#LineGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_line.png" />LineGraph</a> - 折れ線グラフ</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#AreaGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_area.png" />AreaGraph</a> - エリアグラフ</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ScatterGraph_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_scatter.png" />ScatterGraph</a> - 散布図</li>

<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#BubbleChart_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_bubble.png" />BubbleChart</a> - バブルチャート</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#GanttChart_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/graph_gantt.png" />GanttChart</a> - ガントチャート</li>
</ul>
<br /><h4>「Excel」タブ <font color="red">(new)</font></h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ExcelSheetList_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/excel_sheet_list.png" />ExcelSheetList</a> - Excelファイル中のワークシートの一覧を取得します</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ExcelSheetDelete_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/excel_sheet_delete.png" />ExcelSheetDelete</a> - Excelファイルから指定されたワークシートを削除します</li>
</ul>
<br /><h4>ファイル</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#FileExist_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/FileExist.png" />FileExist</a> - ファイルの存在を確認します</li>
</ul>
<br /><h4>ツール</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#ZipFile_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/FileZipComponent.png" />ZipFile</a> - ファイルをZIP形式で圧縮します</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#UnzipFile_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/FileUnzipComponent.png" />UnzipFile</a> - ZIP形式のファイルを展開します</li>
</ul>
<br /><h4>アカウント</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#WebLogin_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/WebLogin.png" />WebLogin</a> - Webシステムでのログインを処理します</li>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#WebLogout_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/WebLogout.png" />WebLogout</a> - Webシステムでのログアウトを処理します</li>
</ul>
<br /><h4>その他</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_component.html#XBRLCSVExtractor_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/xbrlcsvextractor.png" />XBRLCSVExtractor</a> - XBRL文書のデータを明細形式のCSVに変換します</li>
</ul>

<br /><h3 id="f03_02">マッパー関数</h3>
<br /><h4>日付</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_function.html#Holiday_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/holiday.png" />Holiday</a> - 休日のチェック</li>
</ul>
<br /><h4>制御</h4>
<ul>
<li><a href="/documentation/warp/4.4/flow/designer/index_function.html#FileExist_jp.html"><img src="http://asteria.jp/documentation/warp/4.4/flow/designer/reference/icons/FileExist.png" />FileExist</a> - ファイルの存在を確認</li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>パイプラインコーディネーター「ファイル管理」</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20090413-100000.html" />
    <id>tag:asjptest.asteria.jp,2010:/blog//4.13</id>

    <published>2009-04-13T01:00:00Z</published>
    <updated>2010-05-17T16:52:33Z</updated>

    <summary>ASTERIA WARP 4.3からパイプラインサービスに新しく追加された機能「...</summary>
    <author>
        <name>ADN</name>
        
    </author>
    
        <category term="パイプラインサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[ASTERIA WARP 4.3からパイプラインサービスに新しく追加された機能「ファイル管理」について説明します。<br /><br />ファイル管理には以下の２つの機能があります。<br /><ul><li>_filerootのファイル操作</li><li>_filerootのWeb公開<br /></li></ul>
<h2>_filerootのファイル操作</h2>パイプラインコーディネーターから作成したパイプラインは、ASTERIA WARPのデータフォルダに保存されます。データフォルダはインストール時に指定し、初期設定では以下のパスになります。<br />Windowsの場合 C:\asteriahome<br />UNIXの場合 /[インストールユーザーのホームディレクトリ]/asteriahome<br />（以下、データフォルダを[DATA_DIR]と表記します。）<br /><br />パイプラインの保存先は[DATA_DIR]/pipeline/home/pipelineです。また、パイプラインのアクションで使うファイルは、管理しやすくするためにデータフォルダ下の<br />[DATA_DIR]/pipeline/home/pipeline/_filerootに保存することができ、アクションの項目設定で相対パスで指定できます。<br /><br />従来、_filerootディレクトリで管理するファイルは、ASTERIA WARPをインストールしたマシン上で操作する必要がありましたが、バージョン4.3の「ファイル管理」機能を使うと、パイプラインコーディネーターからそれらのファイルを操作することができます。また、パイプラインコーディネーターの設定画面（Settingsタブ）から指定しておくとコーディネーターにログインすることなくファイル管理できるようになります。<br /><br />ファイル管理が_filerootディレクトリ下に対してできることは以下のとおりです。<br /><ul><li>ディレクトリの作成</li><li>ファイル、ディレクトリの削除</li><li>ファイルのダウンロード</li><li>ファイルのアップロード<br /></li></ul>パイプラインコーディネーターの設定画面（Settingsタブ）で左リスト「ファイル管理」を選択して表示される「ファイル一覧」画面から操作します。<br /><img alt="d20090413-1.png" src="http://asteria.jp/documentation/images/d20090413-1.png" class="mt-image-none" style="" height="191" width="500" /><br /><br /> <div><h2>_filerootのWeb公開</h2>ファイル管理では、上記の操作に加えて、_fileroot/public_html/htdocsディレクトリをWebブラウザから直接参照できるように設定できます。URLは以下のようになります。<br />http：//[host]:[port]/public/<br /><br />例
えば、パイプラインのアクションで作成するファイルの保存先を指定する項目では相対パスで「public_html/htdocs
/index.html」のように入力します。パイプラインサービスのサーバーアドレスが「http：//xxxxx.com/」の場合、実際にパイプラ
インを実行してindex.htmlを作成した結果、以下のURLで参照することができます。<br />http：//xxx.com:25080/public/index.html<br /><br />このように使用するには、パイプラインコーディネーターの設定画面（Settingsタブ）で左リスト「ファイル管理」を選択し、「ユーザディレクトリ管理」タブをクリックして表示される画面で「ブラウザでのアクセス設定」を有効にします。<br /><img alt="d20090413-2.png" src="http://asteria.jp/documentation/images/d20090413-2.png" class="mt-image-none" style="" height="230" width="500" /><br /><br /></div><div><h2>Webでのコンテンツ公開が容易に</h2>ファイル管理を使うと、パイプラインサービス以外にHTTPサーバーを設置することなく、Webコンテンツを公開できるようになります。パイプラインの活用の幅が広がるのではないでしょうか？ぜひいろいろと使ってみてください。
    </div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>LoopEndコンポーネントの不具合について</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20071120-100000.html" />
    <id>tag:asjptest.asteria.jp,2010:/documentation/blog//4.95</id>

    <published>2007-11-20T01:00:00Z</published>
    <updated>2010-05-17T16:52:00Z</updated>

    <summary>ASTERIA WARP 4.1.1.1475以降で『LoopEndコンポーネン...</summary>
    <author>
        <name>ADN</name>
        
    </author>
    
        <category term="4.1.1" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="フローサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[ASTERIA WARP 4.1.1.1475以降で『LoopEndコンポーネントでトランザクションがコミットされてしまうことがある』という障害を修正しています。バージョン4.1以前のフロー実行時の動作が変わる可能性があります。バージョン4.1以前からバージョンアップする際にはPDF資料<a href="http://asteria.jp/documentation/files/loopendissue.pdf">「LoopEndコンポーネントの不具合について」</a>を必ずお読みください。<br />]]>
        
    </content>
</entry>

<entry>
    <title>パイプライン機能がわかる12の用語</title>
    <link rel="alternate" type="text/html" href="http://asteria.jp/documentation/20070702-100000.html" />
    <id>tag:asjptest.asteria.jp,2010:/blog//4.12</id>

    <published>2007-07-02T01:00:00Z</published>
    <updated>2010-05-17T16:51:35Z</updated>

    <summary> パイプライン機能がわかる12の用語を説明します。 ASTERIA WARP 社...</summary>
    <author>
        <name>ADN</name>
        
    </author>
    
        <category term="パイプラインサービス" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="使い方のヒント" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://asteria.jp/documentation/">
        <![CDATA[ <p>パイプライン機能がわかる12の用語を説明します。</p>
<h4>ASTERIA WARP</h4>
<p>社内外に存在するシステムやWeb上のサービスとのデータ連携を「簡単に、素早く、安全に」実現することをコンセプトに開発された製品です。ASTERIA WARPには、シンプルなデータ連携のための「パイプライン機能」と多目的データ連携のための「フロー機能」があります。</p>
<h4>パイプライン機能</h4>
<p>データ処理の実行エンジンをもつ「パイプラインサービス」とパイプラインサービスへのインターフェースである「パイプラインコーディネーター」で構成されます。パイプラインコーディネータを使ってパイプラインサービスにアクセスし、データ処理内容を「パイプライン」として保存します。</p>
<h4>パイプライン</h4>
<p>データを集め、変換して、出力する一連のデータ処理定義です。パイプラインでは、データを集める部分を「センサー」、データを変換する部分を「フィルター」、データを出力する部分を「ジョイント」に分けて定義します。それぞれセンサー、フィルター、ジョイントでは、「パイプライン機能」があらかじめ装備している処理（「アクション」）を選び、必要な情報を設定します。</p>
<h4>パイプラインサービス</h4>
<p>「パイプライン」の実行環境であり、パイプライン機能の全体を管理します。</p>
<h4>パイプラインコーディネーター</h4>
<p>「パイプラインサービス」にアクセスするブラウザベースのインターフェースで、単にコーディネーターと呼ぶこともあります。「パイプライン」の設計、パイプラインサービスのモニター機能やシステム管理機能などを操作できます。</p>
<h4>ステージ</h4>
<p>パイプラインを構成する「センサー」「フィルター」「ジョイント」の部分をさす言葉です。</p>
<h4>センサー</h4>
<p>データをパイプラインに取り込む入り口のような役割をもっています。対象となるファイルやデータベース、メールサーバーを監視したり、Webブラウザからの入力データ、コマンドの実行結果を受け取ったりすることができます。データの受け取り方は、大きく分けて「パイプラインサービスで定期的にデータの収集」「接続先からのデータの入力」の２種類があり、いずれかの方法でデータを受け取るとパイプラインが実行されます。</p>
<h4>フィルター</h4>
<p>データを変換する役割をもっています。センサーステージで取得したデータに対して、四則演算やコード変換、条件による抽出などを行い、ジョイントステージで使いやすい形式に変換します。</p>
<h4>ジョイント</h4>
<p>データを連携先に引き渡す出口のような役割をもっています。フィルターステージから受け取ったデータを、指定されたフォーマットで出力します。指定するフォーマットや出力先は、ファイルやデータベースのみならず、メールの送信やグラフ、RSS、GoogleMapの作成など多種多様なデータ形式に対応しています。</p>
<h4>アクション</h4>
<p>「パイプライン機能」があらかじめ装備している「センサー」「フィルター」「ジョイント」用の処理です。それぞれのステージで、アクションを選択し、アクションの実行に必要な情報を設定することで、処理内容が決まります。標準で 100種類以上のアクションが用意されています。</p>
<h4>リクエスト</h4>
<p>パイプラインを実行したときの処理の一つ一つの単位です。フィルターで受け取るデータ一つ一つに対して、リクエストが開始されます。データをレコード形式で扱う場合は、複数のレコードが１つのリクエストになります。</p>
<h4>開始・停止・実行</h4>
<p>パイプラインは、センサーでデータを受け取ったタイミングで実行されます。パイプラインサービスでデータを受け取れる状態にするために、パイプラインを開始しておきます。つまり、パイプラインを開始すると、パイプラインサービスがデータを受け取れる状態になり、定期的にデータを収集するセンサーであれば対象のリソース（フォルダなど）の監視を始めます。パイプラインを停止すると、パイプラインサービスがデータの受け取りや監視を行わないため、パイプラインは実行されません。（実行中のパイプラインリクエストを停止状態にすることはキャンセルといいます。）</p>
]]>
        
    </content>
</entry>

</feed>

