図 22 テパイスファイルの〕劬ロ (Solaris の /kernel/drv/sd. conf) = 0 1un=3 hba = 0 1un=6 hba parent="lpfc " = 0 1un=0 hba= parent="lpfc " = 0 lun= 1 hba= parent="lpfc " 0 1un=2 hba= parent="lpfc " = 0 1un=3 hba= parent=" lpfc " 0 lu = 4 hba= parent=" lpfc " = 0 lun= 5 hba= parent=" lpfc " parent=" lpfc " # # Added for CX-600()P B) name= name name= name= name= name= name= name = " sd" parent="lpfc " target ="sd" parent="lpfc" target "sd" parent="lpfct' target " sd" parent="lpfc " target "sd" parent="lpfct' target " sd't parent="lpfc " target=0 1un=5 hba= "sd" parent="lpfc" target = 0 lun=l " sd" parent="lpfc " target=0 1un=7 hba= # # Added for CX—600()P A) name = name = name = name = name= name= name= target target target= target target= target target target— = 0 lu Ⅱ = 0 hba="1pfc0" = 0 1un=2 hba="Ipfc0" ・ = 0 1un=4 hba="1pfc0" = 0 lu 取 = 6 hba="lpfcl " ー 0 lu Ⅱ = 7 hba= 'lpfcl " ・ hba="IpfcO" = ” 1pfc0 " ・ "1pfc0" ・ ="1pfcO" "1pfc0" ・ "lpfcl" ・ "lpfcl" ・ "lpfcl" "lpfcl" ・ "lpfcl" "lpfcl" ・ デバイスファイル /kernel/drv/sd. conf を編集し、必要 96 10MB/so 7 非圧縮では容量 35GB 、車幻も曲隻 5MB/s 、圧縮時はそれぞれ 70GB 、 した場合、バックアップするデータの容量が IOGB であれ たとえば、 DLT (Digital Linear Tape) 70007 をイ吏用 てしまう。 ケーションが再開できず、そのあいだは業務の遂行が滞っ このような方式では、バックアップカ院了するまでアプリ アッフ。作業のためにアプリケーションを止めることもある。 旧する際に不可欠の要素である。場合によっては、バック 点のイメージをバックアップする必要がある。これは、復 がリカバリー可能なポイント ( 静止点 ) を確定し、その静止 また、多くのバックアッフな環境では、アプリケーション ーションの実行に少なからぬ景彡響をおよばすようになる。 らに、バックアップ作業に長時間を費やすため、アプリケ プメディアが必要になり、管理費やコストが上昇する。さ 大きなテープライプラリ装置、より多くのテーフ。装置、テー を使ってもよいが、対象となるデータが増えてくると、より バックアップやリストアは、容量が少ないうちはテープ ストレージ装置の論理 / 物理コピー機能 ルされる。 これで、 SoIaris 8 に HBA 用のドライノヾがインストー # reboot 7. SoIaris の再起動 なデバイスを作成する。今回は、図 22 の行を追加する。 SAN でプトできる ? もちろん HBA によって変わるが、ほとんどの OS では SAN 上のデバイスからプートできる。 SAN 上のデバイスからプート可能な工竟を構築すれば、物理 コピーや論理コピー ( 物理コピーのほうがよい ) の機能を利用し、 OS そのものを含むバックアップか容易におこなえるようになる。 また、 OS の複数のバージョンや、アプリケーションをディスク 上に残しておき、必要なときに切り替えて起動したり、ほかの開 発用機器に竟を移行することもできる。 ば 1 巻 ( 所要時間は最短で 35 分 ) で終るが、 100GB にな ると 3 巻 ( 最短で 5.6 時間 ) が必要になる。実際には、そ の 1.5 ~ 2 倍の時間が必要になるので、約 10 時間かかる ことになる。このバックアッフ。作業中にアプリケーション が実行できないとすると、その景彡響はかなり大きい。また、 障害が発生した場合にはバックアップからデータをリスト アするが、リストアの所要時間はおおよそバックアップの 2 ~ 3 倍なので、 1 日以上にわたって業務がおこなえなくな ってしまう ( 図 23 ~ 24 ) 。 どの時点のデータから業務を再開するのがよいかを考え ると、できるかぎり細かく静止点または再開ポイントを作 成し、その時点からのバックアップ / リストアを当虫におこ なえばよいことが分かる。 また、開発環境を構築する際には、一ヨ殳に生のデータを 使ってテストをおこなう。開発用にテープからリストアし て環境を再構築するのは時間がかかるうえ、開発途中には バグなどによってデータか皸壊される事態もありうる。こ のような場合、そのつどテープからリストアしていたので UN 工 X MAGAZINE 2005 . 3
連載 / Pe 日活用のヒント 図 8 form-tmpl. html の用途 form-tmpl.html ニ = ロ 己入フォーム ェデイタで直接作成してもよいのだが、それではすこし不 もとになるファイルを HTML 工デイタで作成し、それを 便である。 htm12tmpl というプログラムで実際に使えるテンプレー HTML ェデイタで作成できれば便利だが、 HTML:: トに変換している。テンプレートのもとになるファイルは HTML 工デイタで扱えるので、 Web ページデザイナーに Template のマークアップを認識してくれないので難し 作ってもらうこともできるだろう。 い。テンプレートのマークアップを HTML のコメントと して言当杢すれば、その部分を HTML 工デイタでほし月題 htm12tmpI なく扱える。しかし、 HTML のコメントとして言古杢でき htm12tmpl は 2004 年 3 月号で紹介しているが、 email- ない場合もある。たとえば、く input 〉タグの value 属性の form はその時点ではなかった機能も使用している。 値に HTML::Template のマークアップを使うと以下の では、 htm12tmpl の機能の概要を説明しておこう。 いずれかになる ( 誌面の都合上、で折り返しています。 htm12tmpl は、入力ファイルに対して表 1 の置換えを 以下同様 ) 。 おこない、 HTML::Template 用のテンプレート・ファイ く input name="t 1 ” : - ルを生成する。 value=" く一一 く input name="t 1 " 。疇 - emailform での HTML テンプレートの生成 value=" く tmpl_var name=tl>"> emailform の配布ファイルには、以下のものが含まれて HTML 工デイタで input フィールドの初期値とし いる。 て、、く tmpl-var name=tl 〉 " を入力すると、 HTML ファ イルではそれぞれ以下のようになってしまう (Microsoft ・テンプレートのもとになるファイル (form-tmpl-pre ・ FrontPage の場合 ) 。 html 、 archive-tmpl-pre. html) ・それらのファイルからテンプレートを作成するプログラ く input name="tl" - ム (htm12tmpl.pl) value="< ; ! ー く input name="t 1 " - ・テンプレートを生成する Makefile value="< ; tmpl—var name=tl> ; " > 生成されたテンプレート・ファイル (form-tmpl.html 、 archive-tmpl.html) そこで、私は HTML::Template 用のテンプレートの tmpl—var name=tl tmpl-var name=tl —-> ; 119 UNIX MAGAZINE 2005.3
連載 /FreeBSD のプートプロセスをみる kern—execve 以下は、 kern/kern-exec. c で疋義されているコ 主要部分です。 ードの 0147 : 0148 : 0149 : 0150 : 0151 : 0152 : 0153 : 0154. 0155 : 0156 : 0161 : 0179 : 0204 : static int kern—execve (td, fname , argv , envv ,mac struct thread *td; Char * f name ; char * * argv ; Char * * envv ; struct struct struct struct imgp *mac_p ; proc *p = td—>td nameidata nd, image —params —proc ; *ndp ; *imgp ; lmage—params , & image —params ; p—>p—flag ト P—INEXEC ; 図 2 構〕本 image-params struct image—params { execve を実行するプロセス struct proc *proc ; ・エントリアドレス 作業用領域の残りサイズ 引数文字列の終端 作業用領域のアドレス ; ファイルの先頭部分 ファイルの属性 ファイルの vm_object ファイルの vnode execve の引数 execve の引数 char interpreted ; char vmspace—destroyed; unsigned 10 Ⅱ g entry—addr , char *argvO ; int , envc ; int stringspace ; char *endargs ; char *stringp ; char *stringbase ; const Char *image_header struct vattr *attr; struct vm—obj ect *Obj ect ; struct vnode *VP ; struct 1abe1 *execlabel; Char **userspace—envv ; Char **userspace_argv , 一変数を初期化します。ここでは変数の名前や意味は気に S1ze_t auxarg_size; unsigned 10 Ⅱ g ps—strings; Char * ; ファイル名 struct vm—page *firstpage ; ファイルの先頭部分 VOid *auxargs ; ELF ファイル情報 char interpreter—name CMAXSHELLCMDLEN] ; 161 行目の構造体 image-params は、 execve の処理に 必要なデータをまとめて管理するためのデータ構造です 1 。 この構造体は、 sys/imgact. h で図 2 のように定義されて います。 204 行目では、プロセスが execve を実行中であるこ とを表すフラグ P 」 NEXEC をセットしています。この フラグには、 execve 処理中のプロセスに対するトレース (ptrace) を禁止するという末があります。 0240 : 0241 : 0242 : 0243 : 0244 : 0245 : 0246 : 0247 : 0248 : 0249 : せず、 、、ふ ~ ん " と思うくらいでよいでしよう。 (char * ) imgp—>stringbase kmem—alloc—wait (exec—map , 0X10000 + PAGE_SIZE) ; if (imgp—>stringbase = = NULL) { error = ENOMEM ; goto exec—fail; imgp—>stringp = imgp¯>stringbase ; imgp—>stringspace = 0X10000 ; imgp¯>image-header = imgp—>stringbase + 0X10000 ; 0210 : 0211 : 0212 : 0213 : 0214 : 0215 : 0216 : 0217 : 0218 : 0219 : 0220 : 0221 : 0222 : 0223 : 0224 : 0225 : 0226 : 210 lmgp—>proc = P ; —>userspace_argv = argv ; —>userspace_envv = envv ; —>execlabel = NULL; —>attr = &attr; imgp—>envc = 0 ; —>argc —>argv0 = NULL ; —>entry—addr = 0 ; —>vmspace—destroyed = 0 ; >interpreted = 0 ; —>interpreter—name [ 0 ] lmgp—>auxargs = NULL ; ー >vp = NULL ; —>object = NULL ; imgp—>firstpage = NULL ; xmgp—>ps—strings = 0 ; —>auxarg—size = 0 ; imgp imgp lmgp xmgp xmgp¯ lmgp lmgp xmgp lmgp xmgp lmgp lmgp ~ 226 行目では、 image-params 構造体の各メンバ 1 Linux に兼の働きをする linux-binprm 橢告体があります。 76 240 行目では、 68KB の大きさのイ反想アドレス領域をカ ーネル空間から確保しています ( 図 3 ) 。この領域の頁か ら 64KB ( 10000H ) は、プログラム・ファイル名やコマン ドライン引数と環境変数の文字列を保存しておくために使 われます。そして、残りの 4KB はプログラム・ファイル の頁部分をマップするために使用されます。ただし、 こでは仮想アドレス空間に領域を確保するだけで、物理ペ ージフレームの割当てはあとでおこなわれます。 UN 工 X MAGAZ 工 NE 2005.3
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 連載 / Pe 日活用のヒント く /tr> く tr> く p align="right"> 添付ファイル : く /td> く td nowrap> く td> く input type="file" name= く /tr> く tr> く td nowrap> く /td> "attachmentl " S1ze く td> く input type="file" name= 'attachment2" size="50"> く /td> く /tr> く tr> く td nowrap> く /td> く td> く input type="file" く /tr> く tr> く td nowrap> く /td> name= く td> く input type="file" name="attachment4" く /tr> く tr> く td nowrap> く /td> く td> く input type="file" く /tr> く tr> く td nowrap> く p align="right"> name= "attachment3" " attachment5" S1ze¯ SIZe SIZe = " 50 " > く / td > ー " 50 " > く / td > = " 50 " > く / td > = " 50 " > く / td > /tmpl-if く /table> く ! ー tmpl-if form ーー > く h て > く /form> く input type=" submit' く td> く /td> く / t て > く tr> く td nowrap> く td> く /td> く / t て > く /td> value= " 送信 " name = "send" style="float: く ! ー く ! ー く ! ー く ! ー /tmpl—if tmpl—if view ーー > tmpl—if attachment—link /tmpl—if ー> く p>{{attachment—link}} く /p> く ! ー /tmpl—if く /body> く /html> UNIX MAGAZ 工 NE 2005 . 3 left"> く /td> 123
表 1 htm12tmpl の置換えタ里 対象 {{MARKUPNAME 員 T 蹴 } } {{/MARKUPNAME}} { { VARNAME}}O {{else}}b —if-CONDNAMEb „unless-CONDNAMEb elseb unless— —VARNAME—C 連載 / Pe 日活用のヒント 6 く tmpl-MARKUPNAME ATTRIB 〉 く /tmpl-MARKUPNAME 〉 く tmpl-var name= ↓員月ル ME 〉 く t mpl-else 〉 く tmpl-if name= CO ル D ル A 財 E 〉 く t mpl-unless name= CO ル D ル財〉 く t mpl-else 〉 く /if) く /unless 〉 く tmpl-var name= VARNAME 〉 ロ果 例 {{loop name=loopl}} → (tmpl 」 00P name=loopl 〉 { い。叩 } } → </tmplAo 叩〉 {{textl}} →く tmpl-var name=textl 〉 —if-error →く tmpl-if name=error „unless—error - →く tmpl—unless name=:error —fieldname—→く tmpl-var name=fieldname 。 {{var name= VARNAME } } の短縮形 6 タグのなかに特リ断を入れたい場合に使う c タグ内の属性名の一碚 5 を置き換えたい場合などに使う 生成されたテンプレート・ファイルは配布ファイルに含 めなくてもよいのだが、利用者の便宜を考えて入れている。 また、 MakefiIe があるので、テンプレートのもとになる それでは、 emailform のハイライトともいえる form- form-tmpl-pre. html . /htm12tmp1 form—tmpl-pre . html > form-tmpl. tmpl. html は以下のコマンドにより生成される。 ンプレート・ファイルを再生成できる。たとえば、 form- ファイルを変更した場合は、、、 make" を実行することでテ html おり、 HTML のテンプレートや、そのもとになるファ emailform では一貫して EUC-JP コードを使用して content= ” text/html; charset=euc-jp ”〉 5 行目く meta http-equiv=" Content-Type" 明する。必要に応じ、 form-tmpl. html と比較してほしい。 以下、 form-tmpl-pre. html でポイントとなる部分を説 いる。 がテンプレートのマークアップに変換する形式で言して ートのマークアップは HTML のコメントか、 htm12tmpl レートに特有のタグはいっさい含まれていない。テンプレ form-tmpl-pre. html には HTML: :Template のテンプ 常の HTML 工デイタで問題なく扱えるようにするため、 はこのファイルを Microsoft FrontPage で作成した。通 リスト 1 に form-tmpl-pre. html を小す。ちなみに、私 ので説明を省略する。 . html のほうはここでとりあげるほどのことはしていない tmpl-pre. html を詳しくみていこつ。 archive-tmpl-pre 120 イルも EUC-JP コードになっている。 12 行目く font color=" # FF0000 ' ' 〉 {{message}}* </font 〉 {{if missing}} テンプレート変数 missing カ填の場合、この行の次から {{/if}} の直前までの部分カ咄力される。 missing カ痕 になるのは、未記入の必顎項目がある場合である。 21 行目 (form method="POST" enctype=* " {{cgipath}} ”〉 ' multipart/form-data" action= この行はく ! ー tmpLif form ー - 〉とくい /tmpLif ー〉で 囲まれている。記入フォームの HTML データを生成す るときは、テンプレート変数 f 。 rm を真にしてこの行を 出力する。これによりフォームの HTML データとなる ため、それ以外の場合はフォームにならない。 23 行目く table —unless-form border= ” 1 ” unless-- id= ” tablel ” テンプレート変数 form が真の場合は、、 border= カ咄力されず、偽の場合は出力される。つまり、記入フ ォームでは表の罫線が表示されず、それ以外の場合は表 示される。 25 行目 <td —color-ctl-- —if-date-missing bgcolor= ” #OOFFFF ” if-- nowrap 〉 テンプレート変数 date-missing が真の場合は、 bg- color=" #OOFFFF" " カ咄力され、偽の場合は出力され ない。つまり、障害発生日カ味記入の場合、表の該当す るセルの背景色が # OOFFFF になる。これにより、必 須項目カ第己入されていないことを知らせる。 記入フォーム以外の場合はテンプレート変数 color-ctl に bgcolor=#FFFFCC" カ第又疋され、項目名の背景 がべージュ色になる。 28 行目ぐ ~ tmpLif form ー〉 <input type="text ” UNIX MAGAZINE 2005.3
連載 / Pe 日活用のヒント く input type="text" name="time" size="20" value="{{time}}"> く ! ー {{time}} く ! ー /tmpl—if ー> く /td> tmpl—else 7 8 0 1 2 っ 0 4 く /tr> く t て > く td __color_ctl -if—affected—missing bgc010r="#00FFFF" if nowrap> く p align="right"> 影響を受けている利用者 : く /td> く td _—if—affected—missing bgc010r="#00FFFF" if——> tmpl—if form ーー > く input type="text" name="affected" size = " 40 ” value="{{affected}}">=> tmpl—else {{affected}} く ! ー /tmpl-if ー> く /td> -0 6 7 8 9 0 1 2 く /tr> く tr> if—reporter—missing bgcoIor="#OOFFFF" if—— nowrap> く td __color_ctl_ く p align="right " > 報告者 :   ; く /td> く td __if—reporter—missing bgc010r="#OOFFFF" if__> tmpl—if form ーー > く input type='ltext" name="reporter" value="{{reporter}}">=> tmpl—else ーー > {{reporter}} く ! ー /tmpl—if ー> く /td> っ 0 4 -0 6 7 一 8 9 0 1 2 っ 0 4 - り 6 7 -0 5 5 5 5 5 5 6 6 6 ( 0 6 「 0 6 ( 0 く /tr> く tr> く td __color_ctl_ —if—urgency—missing bgc010r="#OOFFFF" if nowrap> く p align="right"> 緊急度 : く /td> く td ——if—urgency—missing bgc010r="#00FFFF" if——> tmpl—if form ーー > く select name="urgencyl'> tmpl—var urgency—options く /select> ->{{urgency}} く ! ー tmpl—else く /td> /tmpl—if く / t て > く tr> —if—short—desc—missing bgcoIor="#OOFFFF" - く td _—color—ctl—— valign="top if__ nowrap> く p align="right"> 障害の要約 : く /td> く td __if—short—desc—missing bgc010r="#OOFFFF'l if——> tmpl—if form ーー > く input name="short—desc" value="{{short—desc}}">=:> tmpl—else ーー > {{short-desc}} く ! ー /tmpl-if 一 8 9 0- 1 6 6 7 7 ー> く /td> っ 4 っ 0 4 -0 7 ー 7 く /tr> く tr> if—full-desc—missing bgc010r="#00FFFF" 疇 - く td _—color—ctl—— valign="top if__ nowrap> く p align="right"> 障害内容 : く /td> く td __if—full—desc—missing bgc010r="#OOFFFF" if——> tmpl—if form ーー > く textarea rows="5" name="full—desc" COIS = " 50 " wrap="soft">{{full—desc}}* く /textarea> く ! ー tmpl-else /tmpl—if {{full-desc}} く ! ー tmpl—if form ーー > ( り 7 9 7 7 7 7 ー> く /td> 8 8 8 8 8 8 く /tr> く t て > く td nowrap> く /td> く td> く /td> 122 UNIX MAGAZINE 2005 . 3
図 33 ソースとクローンを切り離したあと、再度マウントする [root@lablinuxl root] # snapview —listclone —name CIoneI Name : C10 Ⅱ el C10neGroupUid : 50 : 06 : 01 : 60 : 80 : 60 : 01 : CF : 02 : 00 : 00 : 00 : 00 : 00 : 00 : 00 6 % / C10neID : 0100000000000000 C10neState : Synchronized C10neCondition : Norma1 Avai1ab1eForIO : No C10neMediaFai1ure : No IsDirty : NO IsFractured : No PercentSynced : 100 RecoveryPoIicy: AutO SyncRate : High C10neLUNs : 11 UseProtectedRestore: NO C10neID: 0200000000000000 CIoneState : Synchronized C10neCondition : Norma1 Avai1ab1eForIO : No C10neMediaFai1ure : No IsDirty: NO IsFractured: No PercentSynced: 100 RecoveryPOIicy : ManuaI SyncRate : Medium C10neLUNs : 12 UseProtectedRestore : No 同期されていることを確認 [root@lablinuxl root] # umount /mnt/work [root@lablinuxl root] # snapview -fractureclone —Name C10ne1 -C10neId 0100000000000000 ↑ (a) の CloneID を指定 DO you really want t0 perform the action (y/n)? y これ以降、業務再開が可能になる [root@lablinuxl root] # mount /mnt/work 図 34 クローンデバイスへのアクセスを可能にする (Linux) [r00t@IabIinuxO て 00t ] # admsnap clone—activate Scanning for new devices . The clone—activate operation IS not a valid operation 0 Ⅱ this operating [root@1ab1inux0 root] # mount /dev/sdel /mnt/workl [root@1ab1inuxO て 00t ] # shutdown —r now system . このメッセージが出力されるのは Linux のみ [root@lablinux() root] # df —k FiIesystem /dev/sdal /dev/sda6 none /dev/sda2 /dev/sda5 /dev/sdel lk—blocks 7906164 11068916 1029412 3953068 7906164 16513944 Used Avai1ab1e Use% Mount ed 0 Ⅱ 423672 32872 0 1307480 80068 48 7080872 10473772 1029412 2444776 7424476 15675036 [r00t@1ab1inuxO root] # ls /mnt/workl aaa. txt dirl dir2 IOSt + found snapl 図 35 プロダクション則での再同期 1 % 35 % 2 % -C10ne 工 d 0100000000000000 1 % /mnt/workl ,/var /usr 0 % /dev/shm /home [root@lablinuxl root] # snapview —syncclone —Name C10nel DO you really want t0 perform the action (y/n)? y [root@lablinuxl root] # 102 UNIX MAGAZINE 2005 . 3
甦印意ま塒者 連載 / Pe 日活用のヒント 図 6 form. cgi の表示 これまでの障害報告 ) これまきをゆ吉物 - 撃をこ 0 20 / 01 / 緊急 himazu 開け訊、添付ファイルがあります [ ル印 Y.—をゆ工鞦 = C , 図 7 メールの内容の表示 20M 接 2 〔 ( 0 01 協 / / 引 : 20 んⅢれ内供内 ch : 盟 3 物同ロ 障害報告 障寓発生日 障害発生時刻 : 影響をナている利用者 幸日告者 緊慧度 障害の要約 障害 1 大 ] 容 20 / 01 / 1220 himazu himazu 緊急 開けない添付ファイルがあります 社外から来たメールの添付ファイルに開けた、 があります。そのファイルを添付します。どう やって開いたらいいでノようか。 ルを置けるディレクトリにインストールするのは、添付フ ァイルにリンクを張るためである。 emailform を cgi-bin の下にインストールすると、 repository ディレクトリに置 かれた添付ファイルへのリンク、たとえば、 く a href= repository/xxx. doc ” >xxx く /a> が Web プラウザで開けない。なぜなら、 cgi-bin ディレク トリの下のファイルはプログラムとして実行することのみ が可能で、内容は表示できないからである。ただし、 cgi- bin の下に置けるように emailform を変更することも難 しくないので、未のある方は試してみていただきたい。 HTML テンプレートの用途と鹹方法 emailform では、テンプレートによる HTML データ の生成カ働作の鍵になっている。 こではその部分につい て説明する。 HTML テンプレートの働き emailform では、 HTML データの生成に HTML: : Template モジュールを使っている。 HTML::Template は定番のモジュールであり、 2004 年 3 月号でもとりあげ 118 ている。 emailform で使用している HTML のテンプレートは、 form-tmpl.html と archive-tmpl. html の 2 つである。 このうち、前者のほうがより重要な役割を果たしている。 form-tmpl.html の用途を図示すると図 8 のようになる。 図 1 の記入フォームだけでなく、メール本文の HTML 形 式の部分や、 archive. cgi が表示するメールの内容 ( 図 7 ) のテンプレートにもなっている。また、フォームの未記入 欄を通知する図 2 のような仕掛けも備えている。 く tmpl-var name= V 員月ル A イ E > 基本的なマークアップは以下のとおりである。 : Template カ吏用するテンプレートのもっとも こでは簡単に紹介しておこう。 :Template の詳細はマニュアルを参照してもら :Template の概要 HTML: うとして、 HTML: HTML: のように、 HTML のコメントとして言杢しても同じ効果 このタグ全体がロ月ル ME の値に置き換わる。以下 く /tmpl—if> く tmpl—else> く tmpl-if name= CONDNAME> に現れる部分を選択することができる。 また、以下のタグを使うと、出力結果の HTML データ tmpl-var name= ↓尉月Ⅳー E ーー > カられる。 換わる。 tmpl-var と同様、 tmpl-if も以下のようにコメ ば後半部 (tmpl-else と /tmpl-if で囲まれた部分 ) に置き 部 (tmpl-if と tmpl-else で囲まれた部分 ) に、偽であれ CONDNAME の値が真であればこの部分全体が前半 HTML::Template カ盲吏用するテンプレートはテキスト テンプレートの作成 /tmpl-if tmpl—else tmpl-if name=CONDNAME ーー > ントとして言することができる。 UNIX MAGAZINE 2005.3
図 2 genre テ mysql> SHOW TABLES ; ー Tab1es—in—Music ー ー genre UNLOCK TABLES ; 1 row in set ( 0 . 00 sec) mysql> DESCRIBE genre ; ーブルが正しく作成されたかをる砡忍 ← (a) Music デー タベースのテープル一覧を表示させる ← (b) genre テ ープルの構造を確認 ー Fie1d ー Type Nu11 YES ー Key ー DefauIt ー Extra ー int(ll) ー ー genre—id ー genre—name ー text 2 rows in set ( 0 . 01 sec) ー PRI ー NULL ー NULL ー auto_increment mysql> SELECT * FROM genre; ← (c) genre テープルのレコードを確認 ー genre—id 1 2 3 4 5 genre_name ロック オルタナテイプ ハードロック ヒップホップ シャズ・フューション ー十 ー十 ー十 5 rows in set ( 0 .00 sec) mysql> exit Bye 図 3 music-dump. sql スクリプト / * music テーブルの定義 * / DROP TABLE IF EXISTS music ; CREATE TABLE music ( LOCK TABLES music WRITE; / * music テープルのレコードの定義 * / ) TYPE=InnoDB ; PRIMARY KEY (music_id) sales int(ll) default NULL, release_date text , price int(ll) default NULL, genre—id int(ll) default NULL, artist text , title text, music—id int ( 11 ) NOT NULL AUTO—INCREMENT, INSERT INTO music VALUES ( 100 , 'Everyday' , 'Dave Mattews Band' , 1 , 2078 , ' 2001 / 02 ' , 200102 ) , ( 104 , 'The Beekeeper' , 'Tori Amos ' , 2 , 2078 , ) 2005 / 02 ' , 200502 ) ; ( 103 , 'Live in Buffa10' , ' G00 G00 D01es' , 2 , 2051 , ) 2004 / 11 ' , 200411 ) , (102,'B1ue','Third Eye B1i Ⅱ d ' , 2 , 1311 , ) 1999 / 11' , 199911 ) , ( 101 , 'Fi1ms About Ghost' , 'Counting crows' , 1 , 1531 , ) 2003 / 11 ' , 200311 ) , UNIX MAGAZINE 2005.3 連載⑤ゆ se を味わう 169
連載 /FreeBSD のプートプロセスをみる 図 3 stringbase の作業用令戓 image—header stringbase 64KB ライン引数 コマンド 環境変数 stringspace プログラム ファイル 1 ページ目 マップ fname に対する vnode 構造体をロックした状態で呼出 し元に戻ります。ロックを解放する処理は、 namei() を 呼び出した側がおこなわなければなりません。 ・ FOLLOW fname のノヾスにシンボリック・リンクが含まれる場合、 そのシンボリック・リンクをたどります。 ・ SAVENAME 処理中にカーネル空間にコピーした fname の文字列を 解放せずに呼出し元に戻ります。カーネル空間内の文字 列を解放する処理は、 namei() を呼び出した側がおこな わなければなりません。 262 行目の namei() の処理に成功すると、 nameidata 構造体のメンバー変数 ni-vp から vnode 構造体のポイン タカられます。 0255 : 0256 : 0257 : 0262 : 0263 : 0264 : 0265 : 0266 : 0267 : 0268 : 0269 : 0270 : imgp¯>vp = ndp—>ni—vp ; xmgp—>fname = fname ; ndp = &nd ; NDINIT (ndp , LOOKUP , LOCKLEAF ー FOLLOW ー SAVENAME , UIO_USERSPACE, fname , (d) ; error = namei(ndp) ; if (error) { kmem—free—wakeup (exec—map , imgp—>stringbase , 0X10000 + PAGE_SIZE) ; goto exec—fail; 0275 : 0276 : 0277 : 0278 : 0279 : 0280 : error = exec_check_permissions (imgp) ; if (error) goto exec—fail—dealloc; if (VOP_GETVOBJECT (imgp—>vp , &imgp—>obj ect) = = 0 ) vm—object-reference (imgp—>obj ect) ; 255 ~ 270 行目では、変数 fname カ甘旨すプログラム・フ ァイルの vnode 構造体を得る処理をおこないます。 262 行目で呼び出している namei() は、指定されたデ ィレクトリバスを検索し、プログラム・ファイルの vnode 橢告体を呼出し元に返します。 namei() の呼出しは、引数 に指定するパラメータや返ってくる戻り値の数が多いため、 それらのデータを運ぶ、、いれもの " として nameidata 構 造体を使用します。つまり、構造体に必要なパラメータを 詰め込んで「お願いね ! 」と namei() に渡すと、その結果 が同じ構造体に詰め込まれて「できたで ! 」と返ってくるわ けです。 256 行目の NDINIT() は nameidata 構造体の内容を 初期化するインライン関数で、 sys/namei. h で定義されて います。ここで指定しているフラグは、 262 行目で呼び出 す namei() の動作を才くするためのもので、それぞれの意 UNIX MAGAZINE 2005.3 ・ LOCKLEAF 味は以下のとおりです。 275 行目の exec-check-permissions() は、以下の項目 を確認してファイルの実行権限をチェックします。 ・プログラム・ファイルを読み込むファイルシステムのマ ウント・オプションに noexec が指定されていない。 ・ファイルサイズが 0 以上である。 ・ execve() を呼び出したユーザーの UID や GID に対す るアクセスモードに実行ビットがセットされている。 ほかのプロセスがファイルを書込みモードでオープンし ていない。 279 行目の VOP-GETVOBJECT() は、以下のよう に vnode 構造体のなかから vm-object 構造体のポイン タを imgp->object にコピーするインライン関数です。 imgp->object imgp—>vp—>v—obj ect ; このように単純に書かずにインライン関数を使っている のは、ファイルシステムの違いを吸収するためです。たと えば、 imgp ー > vp カ甘旨すプログラム・ファイルが UFS フ ァイルシステム上にある場合は、 kern/vfs_default. c て疋 義されている vop-stdgetvobject() を呼び出します。ま 77