連載 /JavaServer Pages—@ 図 4 ForeachTEI クラスを利用する場合の TLD ファイル (control. tld) く ?xml version="l . 0 " enc0ding="ISO—8859—1" ? > く ! DOCTYPE taglib PUBLIC "—//Sun Microsystems, lnc. //DTD JSP Tag Library 1 .2//EN" "http://java.sun. com/dtd/web-jsptag1ibrary-1-2.dtd"> く taglib> く tlib—version>l . 0 く /tlib—version> く j sp—version>l . 2 く /jsp-version> く short—name>ctl く /short—name> く uri>http: //www. astec. CO . jp/control く /uri> く disp1ay—name>Contr01 Tags く /display-name> く description>ControI Tags Library く /description> く t ag> く name>foreach く /name> く tag¯class>control . Foreach く /tag¯class> く tei—class>control . ForeachTEI く /tei—class> く body—content>JSP く /body—content> く attribute> く name>name く /name> く /attribute> く attribute> く name>value く /name> く rtexprvalue>true く /rtexprvalue> く /attribute> く /tag> く /taglib> ・新しく生成される変数かどうか ・変数のスコープ で、 TLD に次のように書いたときと同じ働きをします。 く variable> く name—from—attribute>name く /name—from—attribute> く variab1e—c1ass>String く /variable—class> く declare>true く /declare> く scope>NESTED く /scope> く /variable> ctl:foreach タグは name 属匪の値を変数名にしました が、ある決まった名前、たとえは、、 myVariable" という 名前の変数を生成する際には、 getVariabIeInfo() メソッ ドの定義の 3 行目を次のようにします。 info [ 0 ] = new Variab1eInf0("myVariab1e" , "String" ,true ,Variab1eInf0. NESTED) ; これは TLD に、 く variable> く given—name>myvariable く /given¯name> く variabIe—cIass>String く /variable—class> く declare>true く /declare> 82 く scope>NESTED く /scope> く /variable> と記述したのと同じことです。 生成した VariabIeInfo オプジェクトは、戻り値の info 酉改」の 1 番目の要素に設定しています。カスタムタグか複 固の変数を生成する場合は、変数の数ぶんの Variable- lnfo オプジェクトを作ってⅲ f 。配列に設定します。 4 行目の、 infO ; で、 VariabIeInfo オプジェクトの配列を戻り値として返 しています。これで、 getVariabIeInfo() メソッドの処理 は終りです。 最後に ForeachTEI. java をコンノ、イルし、 Foreach- TEI. class を作ります。 TLD の記述 TagExtraInfo を拡張したクラスをカスタムタグと関 連づけるには、 TLD ファイルの該当するタグの記述の部 分に次の行を追加します。 UNIX MAGAZINE 2003.5
連載 JavaServer pages 図 3 ForeachTEI クラスのソースコード (ForeachTEI. java) package control ; info [ 0 ] = new Variab1eInf0(name , "String" ,true,VariabIeInf0. NESTED) ; VariabIeInf0 info ロ = new VariabIeInf0 [ 1 ] ; String name = data. getAttributeString("name") ; public Variab1eInf0 ロ getVariab1eInf0(TagData data) { public class ForeachTEI extends TagExtraInf0 { lmport Javax. servlet ・ JSP. * ; import Javax. servlet ・ jsp ・ tagext . * ; infO ; 使ってソースコードに埋め込まれます。 3. 次に、ソースコードをコンパイルして実行形式のサープ レット (. class ファイル ) を生成します。 4. 最後に、サープレットを実行して得られた出力を Web プラウザに送り、 JSP ページの内容を表示します。 TagExtraInfo 続けて、 TagExtraInfo を利用する場合に必喫となる具 ー勺な処理を説明しましよう。 1. TagExtraInfo クラスを才長したクラスを定義する。 2. getVariableInfo() メソッドを作る。 3. TLD に TagExtraInfo を拡張したクラスを登録する。 TagExtraInfo クラスを才劇長したクラスは、 1 つのカス タムタグにつき 1 っ作ります。ここでは、 ctl:foreach タ グ用に ForeachTEI クラスを定義します。 getVariableInfo() は TagExtraInfo で定義されてい るメソッドで、次の形式で利用します。 public Variab1eInfo ロ , getVariab1eInf0(TagData data) このメソッドは、タグの情報をイ尉寺した TagData クラ スのオプジェクトを引数として受け取り、変数に関する情 報を保存した VariableInfo クラスのオプジェクトを、生 成する変数の数だけ配列にして返します。 JSP 工ンジン はこの配列を受け取って、変数の情報を得ます。 ForeachTEI クラスでは、 TagExtraInfo クラスで定 義されている getVariableInfo() メソッドをオー イドして、 ctl:foreach タグが生成する変数の情報を返す getVariableInfo() を定義します。 UNIX MAGAZINE 2003.5 す。 図 3 に、 ForeachTEI クラスのソースコードを示しま getVariableInfo() メソッドの定義の 1 行目、 String name = data ・ getAttributeString ( "name" ) ; では、 JSP ファイルに言当主されている ctl:foreach タグの name 属生の値 ( 文字列 ) を取り出し、 String 型の name く ct1 :foreach name="word'l たとえば、 JSP ファイルに 変数に設定しています。 という言当があった場合、 name 変数には文字列、、 が設定されます。 2 行目の、 new Variab1eInfo [ 1 ] ; Variab1eInf0 info ロ word では、戻り値となる VariableInfo オプジェクトの配列を 作成しています。 ctl:foreach タグは変数を 1 つだけ生成 するので、ここでは要素数が 1 個の配列を作ります。カス タムタグで複数個の変数を生成する場合は、変数の数と同 じサイズ ( 要素数 ) の酉冽を作ってください。 配列の要素を設疋しているのは、 3 行目の、 new VariabIeInf0 (name , "String" , 疇 - true,VariabIeInfo . NESTED) ; の部分です。カスタムタグが複数個の変数を生成する場合 は、この処理を変数の数だけ繰り返します。 VariableInfo クラスのコンストラクタに渡している 4 info [ 0 ] ・変数の型 ( クラス ) ・変数名 つの引数はそれぞれ、 81
連載 /JavaServer Pages—@ 図 1 ctl:foreach のタグハンドラのソースコード (Foreach. java) package control ; import javax. servlet . jsp. tagext . * ; import Javax. servlet . jsp. * ; public class Foreach extends TagSupport value = v; public void setVa1ue (String ロ name public void setName(String v) Ⅱ u11 ; private String value ロ private String name = Ⅱ u11 ; private int index = 0 ; public int d0StartTag() throws JspException index = 0 ; = null Ⅱ if (name Ⅱ u11 Ⅱ value value . length return SKIP_BODY ; } else { pageContext . setAttribute (name , - value [index] ) ; = の { return EVAL_BODY_INCLUDE ; return EVAL_PAGE ; public int doEndTag() throws JspException { return SKIP_BODY; } else { return EVAL_BODY_AGAIN ; if ( index く value . length) { value [index] ) ; pageContext . setAttribute (name , = if (index く value. length) { index 十十 ; if (name ! = null) { public int d0AfterBody ( ) { / ( 誌面の都合上、で折り返しています。以下同様 ) 図 2 変数が含まれた JSP ファイルは TLD や TagExtraInfo を啝囲してサープレットに変換される 実行して得た出力 class ファイル④サーブレットを ③コン / ヾイ丿レ サーブレットの一・サーブレットロロ くカスタムタグ > ー - ソースコードに変換 . jsp ファイル。②サーブレットの . java ファイル ( 実行形式 ) Web ブラウザ JSPA—ジの 内容の表示 ソースコード ①変数の情報 getVariableInf0() TagExtraInf0 TLD ファイル : <variable> </variable> く /variable> く scope>NESTED く /scope> 一方、 TagExtraInfo を利用するガ去では、変数の情報 を返すメソッドを定義します。 JSP 工ンジンはこのメソッ ドを呼び出して、変数カ鯉め込まれている JSP ファイル をサープレットに変換します。図 2 はこのときの処理の 流れを示しています。 1. JSP 工ンジンは、 JSP ファイル (. jsp ファイル ) にカ 80 スタムタグか含まれていると、 TLD を調べてカスタム タグのにを取得します。さらに、 TLD のく variable 〉 タグの言当や、カスタムタグに対施つ、けられた TagEx- tralnfo クラス ( 正確には、 TagExtraInfo を継承した クラス ) から変数の報を取得します。 2. JSP 工ンジンは、これらの情報を使って JSP ファイ ルをいったんサープレットのソースコード (. java ファ イル ) に変換します。カスタムタグが生成した変数に関 する処理は、 TLD や TagExtraInfo から得た情報を UNIX MAGAZINE 2003.5
連載 JavaServer pages—@ 図 12 ctl:range タグの属性イ直を検査するクラス (RangeTEI. java) package control ; import javax. servlet . JSP. tagext . * ; import javax. servlet ・ jsp ・ * ; public class RangeTE 工 extends TagExtraInfo public boolean isVa1id(TagData data) { try { lnteger ・ parselnt (data. getAttributeString("start") ) ; int start lnteger. parselnt (data. getAttributeString("end") ) ; int end の catch 節に制御が移って、正しい値でないことを意味 return (start く = end) ; } catch (Exception e) { return false ; や、 start 属性の値が end 属性の値よりも大きいときに は、 JSP ファイルを変換せすにエラーを表示させます。 図 12 は、これらの条件に従って属性の値を検査する RangeTEI クラスのソースコードです。 isValid() メソッドは、 TagData 型のオプジェクト 、、 data" を引数として受け取ります。このオプジェクトに は、 JSP ファイルに出現した ctl:range タグの属性情報 か含まれています。 isValid() は属性値に間題がなければ true を返し、間 題があれは false を返す必要があります。そこで、 data オプジェクトから start 属性と end 属生の値をそれぞれ 取得し、大小関係を上交した結果を戻り値として返してい ます。 return (start く = end) ; の部分はすこし分かりづらいかもしれません。 start < = end を論理式として評価した結果得られる論理値を、その ままこのメソッドの戻り値としています。 lnteger. parselnt( 文字列 ) は、引数の文字列が数値として解釈できないときに例外 (Exception) を発生します。したがって、数値に変換で きない属生値カ甘旨定されたときには例外が発生し、 86 する、、 false" を返します。 return false; catch (Exception e) { 図 13 RangeTEI クラスを登録した ctl:range タグ用の TLD の記述 く tag> く name>range く /name> く tag—class>control . Range く /tag¯class> く tei—class>control . RangeTEI く /tei—class> く body—content>empty く /body—content> く attribute> く name>start く /name> く /attribute> く attribute> く name>end く /name> く /attribute> く /tag> TLD ファイルの変更 属性の検査を有効にするには、 ctl:range タグの TLD の記こ次の 1 行を追加する必要があります。 く tei—class>control . RangeTEl く /tei¯class> 図 13 は、 RangeTEI の登録を追加した TLD の記述 カスタムタグの属性値を検査するための操作はこれで完 了です。最後に、 RangeTEI を利用したときに、図 10 に示した range. jsp の表示がどうなるかをみておきまし range. jsp ファイルに書かれた ctl:range タ久 く ctl :range start="4" end="2" / > の言当は、 start 属 1 生の値が end 属性の値よりも大きく、 ctl:range の属性の条件を満たしません。そのため、 range UNIX MAGAZINE 2003.5
連載 /JavaServer Pages—@ 図 8 ctl:range のタグハンドラのソースコード (Range ・ java) package CO Ⅱ t て 01 ; import javax. servlet ・ JSP ・ tagext . * ; import j avax. servlet . 」 sp. * ; import j ava. iO . * ; public class Range extends TagSupport public void setEnd(String v) { } catch (NumberFormatException st art lnteger. parselnt(v) ; try { public void setStart (String v) { int end = 0 ; int start = 0 ; トールしたディレクトリの下の、 try { WEB—INF/cIasses/controI/Foreach. class WEB—INF/web . xml WEB-INF/t1d/contr01. tld WEB—INF/c1asses/contr01/ForeachTEI . class 84 TLD では、カスタムタグの属性の名前や型 ( クラス ) 、 いるかどうかを調べることもできます。 とともに指定されている属性の値が必要な条件を満たして をみてきました。 TagExtraInfo を使うと、カスタムタグ 前節では、 TagExtraInfo クラスを利用した変数の生成 カスタムタグの属性の検査 点が異なっています。 タグか生成する変数の情報を JSP 工ンジンに渡している ていませんが、 ForeachTEI クラスを使って ctl:foreach です。 array. jsp ファイルのコード自体は前回から変更し コード、、 array. jsp ・で、図 7 は array. jsp を表示した画面 図 6 は ctl:foreach タグを使った JSP ページのソース ジを表示した例を示します。 を利用した JSP ページのソースコードと、この JSP«— こちらも前回の医しになりますが、 ctl:foreach タグ ctl:foreach を使った JSP ページの表示 each タグの準備か整いました。 に置きます。これで、 TagExtraInfo を用いた ctl:for- end = lnteger ・ parselnt (v) ; } catch (NumberFormatException e) { public int d0StartTag ( ) throws JspException { return SKIP_BODY ; public int d0EndTag ( ) throws JspException { try { pageContext . getOut ( ) . println(" [ " + start + - } catch (IOException e) { } return EVAL_PAGE ; UNIX MAGAZINE 2003.5 く ctl :range start=" 初期値 " e Ⅱ d = " 最終値 " / > ち、 JSP ファイルに ctl:range は、 start" と、、 end" の 2 つの属性をも て、新しいカスタムタグを用意しましよう。 ます、属 1 生値の検査方法の説明と実験のための材料とし ctl:range タク トに変換するときに属性値を検査できます。 TagExtraInfo を利用すれは、 JSP ファイルをサープレッ 入れ、実行時に属性値を調べることは可能です。しかし、 理する際に呼び出されるメソッド ) に検査用のコードを もちろん、タグハンドラの setter メソッド ( 属性を処 ことはできません。 があるかどうかや、他の属匪の値との関係などを記述する 必かどうかなどを指定できますが、特定の値をとる必要 く /tag> く /attribute> く name>end く /name> く attribute> く /attribute> く name>start く /name> く attribute> く body—content>empty く /body—content> く tag¯class>control . Range く /tag—class> く name>range く /name> く t ag> 図 9 ctl:range タグの TLD の記述
インターフェイスの街角 "#{@@cgiur}?mailbox=#{@mailbo}&seq=#{se}&cmd=write" = > write—cgi){ from} + @cgi . br + @cgi . hr + @imap.fetch—attr(seq, "BODY [ 1 . TEXT] " ) . collect { llinel line + @cgi.b}. join init_imap def write end date + @cgi . br + @cgi . a( 'href ) write_cgl name SIZe 'To: ' + @cgi . lnput( 'type' = > 'text ' name , = > 'cmd' , 'value' = > 'deliver') 十 ' = > 'hidden ' @cgi ・ input ( 'type @cgi . form( 'method' = > 'post ' @imap.fetch—attr(@seq, "BODY[I. TEXT] ” ) . collect { に i 取引 " > " + lin}. join) text (@seq " Re : subj ect ー + @imap.fetch—attr(@seq, "BODY[HEADER. FIELDS (SUBJECT)] " ) . - from t 0 @imap.fetch-attr(@seq, "BODY CHEADER. FIELDS (FROM)] " ) . gsub(/From: \s + ( . * ) / , '\1' ) + @cgi . br + ' + @cgi ・ input( 'type 十 @cgi . br 十 'value ' = > from) 疇 - name , = > ) from ' S1ze ' + @cgi . lnput ( 'type ' = > 'text ' ' Subj ect : 'value' = > subJect) + @cgi . br + @cgi . textarea( 'name rOWS name ' = > ' subJ ect ' , , wrap' = > 'off'){ text} 疇 - SIZe ' cols ) = > ' 60 ' bOdy くく "X—Mai1er : Compact WebMai1 by masui@example . com\n\n" body くく "Subject : #{mime_b(@cgi ['subject'] . to_s}\n" body くく "From: #{fro}\n" b0dy Net : :SMTP . start(@server, 25 ) smtpl tO = mime—b(@cgi['to'] . to—s) from = mime—b(@cgi['from'] . to_s) def deliver end s ・ t 。 jis ・ gsub ( / \ 033 \ $ B ( に \ 033 ] * ) \ 033 \ ( B / ) { ー def mime—b (s) end @cgi . submit( 'value' = > 'send' ) + @cgi . br + smtp. send—mail(body,from,to) body くく "#{@cgi['text'] . to-s . toji}" @cgi . meta( 'HTTP-EQUIV' = > 'refresh' , 'CONTENT' command @cmd. intern # write, read 等のコマンド判定 (self . respond—to?(cmd) ? self . send(cmd) @cgi . out { b0dy cmd def do end @cgi . head { @cgi . title { "WebMai1 (#{@cm}) " } } + @cgi . html { list) @cgi . body { body ・ tosjis} end end webmail = WebMai1. new( 'example . com' webmail . do_command mastll ) UNIX MAGAZIN E 2003.5 mypasswd ) ) 183
プログラミング・テクニック・ 図 4 アークを追加するタ里 if (nl—>n_narcs nl—>n_arcsize) { if ( !nl—>n_arcsize) nl—>n_arcslze 10 ; bsize nl—>n_arcsize * sizeof(*lll—>n_arcs) * 2 ; nl—>n—arcs = grow—buf(nl—>n—arcs , bsize) ; nl—>n_arcsize = bSize / sizeof(*nl—>n_arcs) ; Ⅱ 2 ; nl—>n_arcs [nl—>n_narcs 十十 ] 十十 n2—>n_refcnt ; NODE * Ⅱ ; if ()b = = NULL & & ()b = dbopen (NULL , DB_HASH , NULL) ) name) ; = NULL) 0 ー RDWR , if ( (*db—>put) (db, &key, err ( 1 , return ( Ⅱ ) ; &dat a name) ; 0 , こで作成しているデータベースはハッシュを利用する key. S1ze strlen(name) + 1 ; key. data = name ; ように DBT 型の構造体に埋め込みます。 さらに、引数として渡された名前を、キーとして使える み展開されるデータベースとなります。 もので、ファイル名を指定していないため、 メモリ上にの 成した領域を指すポインタをデータベースに登録します。 割り当て、さまざまな値を衫期化します。そのあとで、作 った場合です。この場合には、 malloc 関数を使って領域を こを抜けてくるのは、まだデータがイ求されていなか てプログラムを終了します。 (default 、 ー 1 ) の場合には、エラーメッセージを出力し して取り出し、それを関数自身の返り値とします。工ラー 成功 ( 0 ) の場合、 data に返された値をポインタとみな err(), "db: %s", name); case ー 1 : default : case 1 : break ; return (n) ; bcopy(data. data, & Ⅱ , sizeof ( Ⅱ ) ) ; case 0 : switch ( (*db->get) (db, &key, &data, 0 ) ) { が、返される値にもとづいて処理か変わります。 こで作成したキーを使ってデータベースを検索します data . data data . S1ze sizeof ( Ⅱ ) ; UNIX MAGAZINE 2003.5 今回は、データベースをメモリ上に展開して利用するフ ログラムの例として ts 。 rt コマンドをとりあげました。あ まり染みのないコマンドということもあり、コマンド自 体についても説明しました。 今回紹介したデータベースの利用ガ去は、 awk や perl における連想配列を実現するものとみなせます。つまり、 文字列を添字として配列の中身を取り出す操作のためにデ ータベースを利用しています。これ以、タ ) 典型的な使い方 としては、データベースに登録する値はあまり重視せす、 おもにデータベースに登録されているかどうかだけを利用 するガ去もあります。この去では、データベースを集合 のように利用します。同しキーをもつデータがあれはそれ を複数登録することはできないので、ちょうど集合演算の ような処理か可能になるわけです。 もうすこしデータベースを有効に使っている例を紹介し たかったのですが、適当なプログラムがみつかりませんで した。馴染みのないコマンドをとりあげたのでやや分かり にくかったかもしれませんが、データベースの使い方自体 はそれほど難しくないと思います。 ( たしみ・ひさかす ) これ以外にも、 tsort コマンドの本来の処理をおこなう tsort 関数などがありますが、今回はデータベースの利用 例をみるのが目的なのでこのくらいにしておきましよう。 ☆ 117
JavaServer Pages 荒井美千子 変数の生成とエラー処理 今回は、 javax. servlet. jsp. tagext ノヾッケージに含まれ ている TagExtraInfo クラスに関連した 2 つの話題を とりあげます。 1 つ目の話題は先月に引き続き変数の生成です。 3 月号 で、カスタムタグで変数を生成するガ去には次の 2 不頁が あるとお話ししたことを憶えているでしようか。 ・ TLD ( タグライプラリ記述子 ) を利用する。 ・ TagExtraInfo クラスを利用する。 TLD を利用した変数の生成については、前号で説明し ました。今回は TagExtraInfo クラスを利用する方法を 紹介します。 2 つ目の話題は、カスタムタグの属性の検査方法です。 カスタムタグの属性値か特定の値をとる必要があったり、 あるいは特定の条件を満たさなくてはならないようなとき に、 TagExtraInfo クラスを利用して、その条件を満たし ているかどうかをチェックするガ去を紹介します。 .javax. servlet. jsp. tagext ノヾッケージには、タグの処理 中に発生した例外を捉えて処理するための TryCatchFi- na Ⅱ y インターフェイスもありますが、こちらの説明は次 回に譲ることにしましよう。 TagExtraInfo を利用した変数の生成 前回、、、配列 " の要素を 1 っすっ取り出して、、変数名 " の変数に設定する ctl:foreach タグを作りました。 く ctl : foreach name=" 変数名 " value=" 配列 " > 変数を使った処理 く /ctl:foreach> UNIX MAGAZINE 2003.5 今月は、この ctl:foreach タグで使う、、変数名 " の変数 を TagExtraInfo クラスを利用して生成してみます。 ctl:foreach のタグハンドラ 前述のとおり、カスタムタグで変数を生成する方法に は、 TLD を利用するものと TagExtraInfo を利用するも のの 2 不鶤頁があります。いずれも、 TLD や TagExtra- lnfo の役割は、生成した変数の情報を JSP 工ンジンに 知らせることです。変数の生成自体はタグハンドラの彳難リ であり、どちらの方法でもタグハンドラは共通に利用でき ます。 図 1 は、前号で登場した ctl:foreach のタグハンドラ のソースコードです。今回も、このタグハンドラを使って ctl:foreach タグを作ります。 JSP ファイルの変手奐里 カスタムタグか生成する変数を TLD で言当するときに は、く variable 〉・・ /variable 〉に ・変数名 変数の型 ( クラス ) ・新しく生成する変数かどうか 変数のスコープ を指定します。 たとえは・、 ctl:foreach タグで変数を生成したときには、 次のように記述しました。なお、新しく生成される変数 かどうかを意味する (declare 〉の設定のデフォルト値は true" なので、 こでは省略しています。 く variable> く name—from—attribute>name く /name—from—attribute> く variabIe—cIass>String く /variable—class> 79
旧 v6 の実装 島慶 証ヘッダの処理 今回参照するファイル 今回は認証ヘッダに関連する以下のファイルを参照し ます。 ・ kame/sys/netinet6/ah. h ( 改訂番号 1.17 ) ・ kame/sys/netinet6/ah-input. c ( 改訂番号 1.81 ) ・ kame/sys/netinet6/ip6-input. c ( 改言丁番号 1.307 ) ・ kame/sys/netinet6/ipsec. c ( 改言丁番号 1.181 ) ・ kame/sys/netkey/key. c ( 改訂番号 1.270 ) ・ kame/sys/netkey/keydb. h ( 改訂番号 1.18 ) ・ kame/sys/net/pfkeyv2. h ( 改訂番号 1.28 ) 認証ヘッダ付き IP バケットの入力 認証ヘッダは拡リ、ツダの 1 つです。 IPv6 では、才長 ヘッダカのように叫吉された構造をとるため、ヘッタ処 理は彳ヤ、、ツダがなくなるまで入力処理を繰り返すことで 実行されます。刻、ツダの入力処理は、 IP バケットの 入力関数である ip6-input() の終りに実装されています。 ・を、ツダには専用の入力関数が定義されており、処理 する才に、ツダの不鶤頁に応じて適切な入力関数か呼び出さ れます。 ip6-input() での才ッダ処理部を以下に示し ます。 ip6-input. c IPPROTO_DONE) { 1174 while (nxt ! = (*inet6sw Cip6—protox [nxt] ] nxt ・ pr-input) (&m, &off , nxt) ; 1236 } 響証ヘッダの場合、入力関数として ah6-input() カ症 ルい 義されています。 2 月 27 日から 3 月 6 日にかけて、「 Connectathon 2003 」 1 か開催されました。 Connectathon は世界有数の 大堋期は圧接続イベントです。インターネットでは数多く のプロトコルカリ用されています。プロトコルの言に理 言勺な本処か必要なのはもちろんですが、とくにインター ネット技術では、イ様策定の過程で実際に重川させながら イ兼をみなおしていくことも重視されます。柤接続イベ ントでは、仕様書にもとづいてプロトコルを実装したべン ダーや研究組織などが各自の実装を持ち寄り、相互に通信 できることを確認することで仕様を実証します。 今回、 KAME プロジェクトとしては Connectathon に参加しませんでしたが、プロジェクトのコアメンバーの 1 人が、自社の製品テストの合間に KAME MobiIe IPv6 の相互接続性を検証してきました。現在、 MobiIe IPv6 は ID (lnternet Draft) 21 が公開されている段階です。 ただし、 ID 21 の公開が Connectathon の開催直前だ ったため、相互接続テストは ID 20 にもとづいて実施さ れました。複数の実装者との相互接続テストをおこない、 KAME プロジェクトの実装が他の実装と相圧接続可能で あることか不忍されています。 現在、 Mobile IPv6 はイ兼の最終検言寸段階にあります。 Mobile IPv6 の言 1 者、イ十様の編集者、実装者にとって、 今回の相互接続イベントは重要な意味をもっていました。 こで大きな欠点がみつかれば、 MobiIe IPv6 そのもの の存読に景グをケえかねなかったからです。さいわい、致 命的な信の欠点が発見されることもなく、各実装者とも 良好な結果を得られたようです。 MobiIe IPv6 の研究者 の 1 人として、今回の大きな前進を嬉しく思います。 1 http://www.connectathon.org/ 1235 66 UNIX MAGAZINE 2003.5
最新スよリミング動向 スプリッティングには、 PULL 型と PUSH 型の 2 つ の方式があります。 PULL 型は、子サーバー (Receiver) がクライアント からのアクセスを初めて受けたときに親サーバー (Trans- mitter) に接続し、ソースコンテンツを受け取る形態で す。一方、 PUSH 型では、エンコーダからのソースか親 サーバーに到着すると、即座に子サーバーに ( クライアン トからのアクセスがなくても ) 送り出されます。今回のヒ ッキーライプでは、 PUSH 型て配信をおこないました。 PUSH 型スプリッティングにおける基本的な設定情 報には、次のようなものがあります ( 括弧内は今回の設 定。 ・ source path (/encoder/) ・ Transport (udp/unicast) ・ port Range ( 30001 ~ 30020 ) ・ password (hogehoge ) これらを以下の手順に沿って正しく設定すれば、無事に スプリッティングができます。 このほかにも細かいパラメータがありますが、詳しくは オンライン・マニュアル [ 4 ] などを参照してください。 親サーパー (Transmitter) 側の言聢 1. ReaISystem Administrator 画面に Web プラウサで ログインする。 2. 左側のメニューから Splitting → Transmitter を選 ぶ。 3. 右イ則のフレームの Broadcast Receivers 欄の下にある [Add New] ボタンを押す ( 図 2-a)0 4. 右側にある項目欄にデフォルトの値が入るので、イベン トごとに必要な設定項目を適宜入力する。 ・ Receiver Name を必要に応じて変更 ( 分かりやすい 名前にする ) ・ source path を変更 ( 例では /encoder/) ェンコーダのパスが変わっていなけれは変更は不要 です。 ・ port Range を変更 ( 例では 30001 ~ 30020 ) 複数の Receiver にスプリッティングするときは、 Range が重複しないように注意します。 120 ・ password を入力 ( 図 2-b0 例では hogehoge) これは Transmitter と Receiver で同しものを指定 します。 5. 入力か終ったら、右下にある [ApplY] ボタンを押す。 設定値に誤りがあるとエラーメッセージか表示されるの で、よく石忍する。 子サーパー (Receiver) 側の言 1. ReaISystem Administrator 画面に Web プラウサで ログインする。 2. 左側のメニューから Splitting → Receiver を選ぶ 3. 右側のフレームの Broadcast Transmitters 欄の下に ある [Add New] ボタンを押す ( 図 2-c)0 4. 右側にある項目欄にデフォルトの値が入るので、環境に 合わせて必要な項目を設定する。 ・ Transmitter Name を必要に応じて変更 ( 分かりや すい名前にする ) ・ Transmitter Address を変更 ( 例では 192.168.1. 10 ) ・ port Range を変更 ( 例では 30001 ~ 30020 ) 複数の Receiver にスプリッティングするときは、 Range が重複しないように注意します。 ・ password を入力 ( 図 2-d0 例では hogehoge) Transmitter と Receiver で同じものを扣疋します。 5. 入力カ鮗ったら、右下にある [Apply] ボタンを押す。 設定値に誤りがあるとエラーメッセージが表示されるの で、よく石忍する。 今回は、メイン系とバックアッフ係の 2 系統を利用し たため、バックアッブ系の親サーバーと子サーバーについ ・エンコーダの冗長化 では、 ヒッキーライプでは使いませんでしたが、 RealSystem RealSystem の冗長化方式 ても上記と同し作業をおこないました。 UNIX MAGAZINE 2003.5 の 2 不頁の冗長化方式か利用できます。 ・バックアッフ Transmitter による冗長化