UNIX MAGAZINE 2005年11月号

キーフレーズ

DNS UNIX MAGAZINE ファイル example システム http:// north ネットワーク prefix サーバー 2005 example.com ノード データ 場合 com ログファイル クライアント rancid page Linux () P2P コマンド リソース http CPU Windows ユーザー newsyslog インストール etc プログラム www 指定 Web launchd 必要 プロセス network 情報 ネットワーク機器 実行 ジョイスティック ach 利用 key インターフェイス プロジェクト HTML lntel usr 管理 update mtime RANCID アプリケーション 処理 ルータ ndopt var ソフトウェア ページ .com PCI 公開鍵 svc サブドメイン 接続 認証局 デバイス 対応 service relpath ドライバ addr for messages 000 アクセス 作成 SUSE コンピュータ 機能 root name list アドレス パッケージ できる opt サービス Phidgets src Base メモリ tokyo

目次ページ

連載 / Pe 日活用のヒント 図 1 記事内の目次 ( 1 ) イ , 編邸 0 〒修助 0 ツール迅ア ・ cont—filename 内容ファイルの名前が入るパスではなく C01. html と 0 、。た単純なフ , イル名はある。 ・ dst-filename 公開用 HTML ファイルの名前が入る。内容ファイルの 名前とは関係なく index. html 、 index2. html 、 index 3. htm い・・・・のいずれかになる。 ・ chapter—name 章を構成すると定義しており、章の名前は内容ファイル の body タグの最初のタグの内容である。 ・ num ページ番号が入る。公開用 HTML ファイルの題名、つ ( 2 ) ・・・・といったページ番号が入るのでそこに使用され る。 ・ url 記事を構成するほかのページから呼び出せるようにする ための URL が入る。これは記事内の目次のなかで使わ ライブ・ストリーミングの保存 0 URL が、、 " になるところか遅つ。 w•ndows M 。 dia ライプ・ストリーミングの保存の例 ・ prev-page 無駄な再生成を避けるための判断をする際には、複数あ 1 つの記事における前のページの URL が入る。最初の る公開用 HTML ファイルのなかの 1 ページ目 (index. ページにはこの項目はない。 html) だけを考えればよい。長い記事の公開用 HTML フ ・ next-page ァイルはすべて一括して生成されるからである。 1 つの記事における次のページの URL が入る。最後の 具体的には、 $src-mtime かテンプレートの更新日時の ページにはこの項目はない。 どちらカー方が index. html より新しけれは再生成をおこ たとえば、、 $page[0]{ "cont-filename" } " には、最初の なう。 -force オプションが推定されていると無条件に再生 ページに対応する内容ファイルの名前が入る。 成するのはほかの HTML 生成メソッドと共通している。 各ページのデータの準備 HTML ファイルの生成 長い記事では、記事内の目次や前後のページへのリンク 各ページのデータが@page に揃ったところで、 / ヾーシ など、公開用 HTML ファイルの生成に必要なデータが短 の生成をおこなう。 い記事よりも多い。記事内の目次 ( 図 1 ~ 2 ) など、内容フ この部分で single-page-article にはなかった処理とし ァイルをすべて読み込まないと分からない項目もあるので、 ては、記事内の目次の生成が挙げられる。長い記事では、各 各内容ファイルを読み込みながらページの生成に必要なデ ページの先頭に、目次として記事内のほかのページへのリ ータを@page 配列ロ内する。 ンクが並べてある ( 図 1 ~ 2 参照 ) 。目次の項目は全ページ @page 配列の要素はハッシュへの参照で、ハッシュには 共通だが、ほかのページの項目がハイバーリンクになって 以下の項目が十絲される。 いるのに対して、自分のページの項目だけはハイバーリン Net Transp 。杙によるストリーミング保存の実例と応用 目次 プ里 Net Transport とは はじめに 図 2 言内の目次 ( 2 ) 方イルの災仮 ) 第示参動ヴマークツー罹へ井プ つおに立「・物第料新 1 はス響 : ・ミ . 増ぎ物ドに窶明・朝 Net Transp 。によるストリーミング保存の実例と応用 目次 2 ーライブ・ストリーミングの保存 3 年純ンデ二こ阯ストリこ二クの保存 101 UNIX MAGAZINE 2005. 11

連載 / Pe 日活用のヒント リスト 2 read-top 129 sub read—top { 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 15 2 153 154 155 156 157 158 159 160 161 162 163 } my $top—f ile shift ; my $fh = 工 0 : :Fi1e—>new(" く $top_file") or do { $name = $newname ; push(@retval , [$name, @cont] ) ; if ( $name & & @cont ) { my $newname = $ 1 ; if ( $line /A\S*\#/ Ⅱ $line next if ( $line chomp $line ; while ( my $line my @cont my $name my @retval ; exit 0 ; print "open: $top—file : $ ! \ Ⅱ " @cont elsif ( $line push (@cont , else { $ 1 ) print "invalid line : $line\n" if ( $name & & @cont ) { push(@retval, [$name , $fh → close() ; \@retval ; @cont] ) ; クになっておらす、太字で表記される。つまり、目次はペ ージごとに異なるのである。 記事内の目次の生成に続き、内容ファイルの本文をテン プレートにはめ込む。この際に内容ファイルを HTML:: TreeBuilder で読み込んでいる。前節で説明した部分で各 内容ファイルを HTML::TreeBuilder で読み込んでいる ので、その際に内容ファイルの本文を $page[$n]{body} に保存することも考えられるが、そうはしていない。なぜ なら、そうするとすべてのページの本文を溜め込むことに なり、メモリ消費が多くなると考えたからである。実際に は上記のようにしてもメモリが足りなくなることはないと 思うが、メモリ消費を簡単に抑えられるのならそうしたほ うがよいと判断した。 目次データの登録 長い記事は複数のページで構成されるが、 genhtpg から みると 1 つの記事であり、目次データには 1 つの項目が登 102 録されるだけである。 481 行目でその処理をおこなってい るが、 single-page-article で \%param を渡していたの とは異なり $spec を渡している。 $spec には Spec ファイ ルの内容が十内されている。 $self—>{contdb}{$urlfromtop} = mkcontdbent=> ($src—mtime, $spec) ; read-top トップページを生成する top-page メソッドを説明する 前に、そのなかで使われるサプルーチン read-top ( リス ト 2 ) を説明しておこう。 read-top はその名が示すとお り Top ファイルを読み込むサプルーチンで、これを知って おくことは top-page メソッドの理解に役立つ。 頭に入れておくべきなのは、 read-top がどのような形 式のデータを返すのかという点である。 PerI ふうに表現す ると、 read-top が返すのは以下のようなデータである。 UNIX MAGAZINE 2005 . 11

連載 / Pe 日活用のヒント [ カテゴリー 2 , URL4, URL5, URL6, URL7] [ カテゴリー 1 , URLI, URL2, URL3], 262 sub single—page—article { ・ single-page-article らカー方がトップページの index. html よりも新しければ そして、 $src-mtime とテンプレートの更新日時のどち 事の更新日時は目次データとして格納されている ・ Top ファイルに含まれるすべての記事の更新日時。各記 ・ Top ファイルの更新日時 しいものがサイトの更新日時として $src-mtime に入る。 時を調べる。具体的には、以下の項目のなかでもっとも新 ら Top ファイルを読み込む。続いてサイト全体の更新日 single-page-article と同じようにデータを準備してか になっている。 ストを参照 ) も、 single_page-article メソッドと似た流れ トップページを生成する t 叩 -page メソッド ( 末尾のリ top-page URL である。 名、それに続く要素はそのカテゴリーに属する記事の相対 照である。参照されている配列の最初の要素はカテゴリー 値は配列への参照であり、その配列の各要素も配列への参 照を表すことを利用している。つまり、 read-top の戻り この表記は、 Perl では [ ・・・・・ ] が名前のない配列への参 再生成をおこなう。 -force オプションが指定されていれば 無条件に再生成をおこなうのは、ほかの HTML 生成メソ ッドと共通している。 top-page の処理の中心は、 Top ファイルをもとにした 目次の生成である。 Top ファイルでは記事がカテゴリー とに列挙されているので、目次の生成は 2 重のループにな る。外側のループがカテゴリーのループ、内側のループが カテゴリー内の記事のループである。 目次のデータが生成されたらそれをテンプレートにはめ 込み、 HTML ファイルを出力して終了となる。 ☆ 以上で genhtpg のコードの説明は終了である。実際に 使っていただくのはもちろん、 perl による HTML 処理の 例として遊んでいただいてもかまわない。 RSS フィードを 生成する機能を追加するなどの拡張を施してみるのも、よ い勉強になるのではないだろうか。 ( いまづ・ひでよモルガン・スタンレー証券 ) 263 264 265 266 267 268 269 270 2 71 272 273 274 275 276 277 2 78 279 280 281 my ($self , $path) my $verbose $self—>{verbose}; if ( stat($dstpath)->mtime > = max($src—mtime , stat ($tmplpath)—>mtime) ) # the following condition is met when re—generation is NOT needed if ( -f $dstpath ) { stat ($path) —>mtime ; my $src_mtime # determine if the page is t0 be generated my $tmplpath = $self—>tmplpath($relpath) ; my $dstpath "$self->{dstdir}/$relpath" s:/index. html?$:/:i; $urlfromtop my $urlfromtop = $relpath; $self->relpath-topurl($path) ; my ($relpath, $topurl) else { . \ Ⅱ " if ( $verbose ) ; print "forced tO generate . if ( $self->{force} ) { UNIX MAGAZINE 2005. 11 103