POST - みる会図書館


検索対象: Shell Script ライトクックブック
10件見つかりました。

1. Shell Script ライトクックブック

72 補足 こで補足しておきたい事項が 3 つある。 ・環境変数を echo ではなく printf で受け取る理由 ース レシピ 4.4 CGI 変数の取得 (POST メソッド編 ) →レシピ 4.4 ( CGI 変数の取得 (POST メソッド編 ) ) →レシピ 4.1 (URL デコードする ) 参照 法で受け取ればよい。 ればよい。その値が "POST ”だった場合には次のレシピ 4.4 (CGI 変数の取得 (POST メソッド編 ) ) に示す方 場合もあるだろう。そのような時は環境変数 REQUEST-METHOD の値が。、 GET ”か "POST ”かで分岐させ 到来する CGI 変数データが POST メソッドでやってくるのか GET メソッドでやってくるのか決まっていない ■ G ET メソッドか POST メソッドかを判定する 2 文字に変換する。詳細はマニュアルページ * 5 を参照されたい。 受け取ったデータの中に改行文字 (<CR><LF> 等 ) が含まれていた場合、 cgi-name コマンドは "*n" という ・値としての改行の扱い リケーション制作における鉄則だからである。 通常は起こりえないのだが、外部からやってくる情報なので素直に信用してはいけないというのが Web アプ 変数に "-n ”という文字列が来た場合でも誤動作しないようにするためである。 環境変数 "'QUERY-STRING' を echo で受けず、なぜわざわざ printf で受けているのか。理由は、万が一環境 回答 ただし POST メソッド ( 環境変数 "REQUEST-METHOD ”が "POST ”の場合 ) である。 Web プラウザーから送られてくる CGI 変数を読み取りたい。 問題 こでも例をあげて説明しよう。今、 web プラウザーが次のような HT L に基づいて CGI 変数を送ってく ( "cgi-name" 及び "namread" ) をダウンロード * 6 する。 基本的にはレシピ 4.3 (CGI 変数の取得 (GET メソッド編 ) ) と同じである。よってまず 2 つのコマンド コードをコピー & ペーストしてもよいし、あるいは“ RAW ”と書かれているリンク先を「名前を付けて保存」してもよい。 https ://github.com/321516/Open-usp—Tukubai/b10b/master/COMMANDS.SH/nameread にアクセスし、そこにあるソ https ://github.com/321516/Open-usp-Tukubai/b10b/master/COMMANDS.SH/cgi¯name 、及び https : //uec. usp—lab. com/TUKUBAl—MAN/CGl/TUKUBAI—MAN.CGl?POMPA=MANl—cgi¯name * 6 * 5 るものとする。 第 4 章 POSIX 原理主義テクニック -Web 編

2. Shell Script ライトクックブック

第 4 章 POSIX 原理主義テクニックー Web 編 Web プラウザーからのファイルアップロード ース 回答 問題 レシピ 4.5 Web プラウザーからファイルをアップロードして、受け取れるようにしたい。 GET 、 POST のレシピと同様に例をあげて説明しよう。今、 Web プラウザーが次のような HTML に基づい て提供されているので、まずこれをダウンロード * 7 する。 read ” ) が Openusp Tukubai で提供されており、これらを POSIX の範囲で書き直したものが 321516 氏によっ CGI 変数の受け取りと同様に、アップロードされてきたファイルを受け取るのに便利なコマンド ( "mime- く fo て m action="form. cgi " method="POST" enctype="multipart/form—data" > ■ Web プラウザーが送信する元になる HTML て CGI 変数を送ってくるものとする。 く /form> く input type=" submit" name="post " value=" 送信 " / > く / dl > く dd> く input type="text ” name="fullname " value= く dt > 写っている人の名前く / dt > く dd> く input type="file" name="photo" /> く /dd> く dt > 証明写真ファイルく /dt> く dl > ファイルアップロード時は一般的に、 POST メソッドで multipart/form-data 形式を用いるが、 するためのシェルスクリプトは次のようになる。 これを取得 * 7 https ://github.com/321516/Open-usp-Tukubai/b10b/master/COMMANDS.SH/mime-read にアクセスし、そこにあるソ コードをコピー & ペーストしてもよいし、あるいは "RAW ”と書かれているリンク先を「名前を付けて保存」してもよい。

3. Shell Script ライトクックブック

レシピ 4.4 CGI 変数の取得 (POST メソッド編 ) ・ Web プラウザーが送信する元になる HTML く form action="form. cgi " method="POST"> 73 く d1 > く dt> 名前く /dt> く dd> く input type="text ” く dt > メールアドレスく / dt > く dd> く input type="text " く / dl > く input type=" submit" name= 'post " く /form> name= name= value= value=" 送信 " / > "fullname" value=" ” /> く /dd> これを取得するためのシェルスクリプトは次のようになる。 ・前述のフォームから送られてきた CGI 変数を受け取るシェルスクリプト (form. cgi) dd bs=${CONTENT_LENGTH : ー 0 } count=l ー Tmp=/tmp/${0##*/}. $$ # 一時ファイルの元となる名称 # ! /bin/sh cgl—name > $Tmp-cgivars fullname=$ (nameread fullname $tmp-cgivars) email=$ (nameread email $tmp—cgivars) ( ここで何らかの処理 ) rm -f $Tmp-* # 用が済んだら一時ファイルを削除 # 正規化し、一時ファイルに格納 # CGI 変数 " full Ⅱ e " を取り出す # CG 工変数 " email " を取り出す GET メソッドとの唯一の違いは、読み出す元が環境変数ではなく標準入力に代わったことだ。プログラム上 ではそれに対応するため、 dd コマンドを用いるようになった点のみが異なっている。 解説 基本的な解説はレシピ 4.3 ( CGI 変数の取得 ( GET メソッド編 ) ) で済ませてあるので、同じことに関しては 省略する。 こでは POST メソッドで異なる点についてのみ述べる。 先程も述べたように、 POST は CGI 変数の格納されている場所が環境変数ではなく標準入力であるという点 が唯一異なる。標準入力から受け取るなら cat コマンドでもいいような気がするが、安全を期して dd コマンド を使うべきだ。 理由は、環境によっては運が悪いと標準入力からのデータを受け取るのに失敗して cat コマンド実行で止まっ てしまう恐れがあるからだ。 CGI 変数文字列のサイズ ( 環境変数 CONTENT-LENGTH) が 0 である場合は読 み取る必要がないのだが、環境によっては 0 なのに読もうとすると止まってしまうことがあるようだ。そのため →レシピ 4.5 (Web プラウザーからのファイルアップロード ) →レシピ 4.3 ( CGI 変数の取得 (GET メソッド編 ) ) 参照 にこのようなやり方を推奨している。

4. Shell Script ライトクックブック

レシピ 4.5 Web プラウザーからのファイルアップロード ■前述のフォームから送られてきた CGI 変数を受け取るシェルスクリプト (form. cgi) # ! /bin/sh # 一時ファイルの元となる名称 dd bs=${CONTENT_LENGTH: ー 0 } count=l > $Tmp-cgivars # そのまま一時ファイルに格納 # CGI 変数 " ph 。 to " をファイルとして保存 mime—read phOtO $Tmp—cgivars > $Tmp—photofi1e # アップロードされたファイル名を取り出すなら例えばこのようにする filename=$ (mime—read —v $Tmp—cgivars [0ー9]\ + [[:blank:] ] *Content—Disposition: [[:blank:]] *form—data; grep ー 1 grep ' [[:blank:]]name="photo" ' head ーⅡ 1 75 # CGI 変数 " full Ⅱ ame ”をファイルとして保存 fullname=$ (mime—read fullname $Tmp—cgivars) ( ここで何らかの処理 ) # 用が済んだら一時ファイルを削除 rm -f $Tmp-* 通常の POST メソッドの場合と違い、到来した CGI 変数データは何も加工せずにそのまま一時ファイルに置 き、ファイルや CGI 変数が欲しいたびに mime-read コマンドを使う。 また、ファイルに関してはアップロード時のファイル名も取得可能だ。 mime-read コマンドの -v オプション を付けると、 MIME ヘッダーを返すようなるため、 UNIX コマンドを駆使して取り出せばよい。 解説 HTTP でのファイルアップロードは一般的に、 POST メソッドを用いて行うため、レシピ 4.4 ( CGI 変数の取 得 (POST メソッド編 ) ) と同様に標準入力を読み出せばいいのだが、 multipart/form-data という MIME ヘッ ダー付のフォーマットで到来する点が異なる。 先程の HTML であれば、次のようなデータが送られてくる。 ・前述の HTML から送られてくるデータの例 ーー 751A8F78020934B141231A1121CD31EF Content—Disposition : form—data; name="photo Content-Type : image/jpeg ( ここに JPEG ファイルの中身・ "D : *work%komei ・ jpg filename= ーー 751A8F78020934B141231A1121CD31EF Content—Disposition : form—data; name="fullname" 諸葛孔明 ーー 751A8F78020934B141231A1121CD31EF ハイフンで始まる行は各々の CGI 変数データセクションの境界を表しており、後ろのランダムな数字をもっ

5. Shell Script ライトクックブック

レシピ 3.1 PIPESTATUS さようなら ■ PIPESTAUTS 相当の機能を実現するシェル関数 "run()" run() { 10Ca1 a j k 1 com # ←ここは POSIX 範囲外なんだけど・・ while eval "%${pipestatus—$j + :} false" ; do unset pipestatus—$j done j=l com= k=1 1 = fo て a; do if [ "x$a" 'xl' ] ; then com="$com { $ 1 pipestatus—'$j ' = $ ? " > & 3 echo " else 1 = " $ 1 *"*${$k}%"" # ←修正箇所はここ 43 done com= exec exec echO 'pipestatus—'$j ' = $ ? " , 4 > & 1 "$(exec 3 > & 1 ; eval ” $ com ” ) " while eval "*${pipestatus—$j + : } false" ; do eval ” [ *$pipestatus-$j -eq 0 ] ” Ⅱ return 1 done return 0 そして、この "run ”を頭に付ける形で、パイプに繋がれた一連のコマンドを実行する。ただし、 数に引数を渡すため、シェルが解釈してしまう文字は全て、エスケープするかシングルクオーテーション等で囲 むこと。 ( 詳細は「解説」を参照 ) run commandl \ ー command2 ' 2>/dev/nu11 ' \ ー このシェル関 10Ca1 宣言をしているが、これは POSIX 範囲を逸脱しているため、使えなければ外しつつ、中で使っている 5 つ 番目のコメント部分 ) 。また、シェル関数内で使われている変数をローカルスコープにするため、関数の冒頭で しかしながら、引数が 10 個以上になると動作しなくなる不具合を抱えているために若干の修正を加えた ( 2 このシェル関数はもともと Web 上で公開されてるもの * 1 である。 解説 各コマンドの戻り値は、 "pipestatus-n" ( 〃はコマンドの順番で、最初は 1 ) に格納されている。 のシェル変数に気を付けること。 、 1 The UNIX and Linux Forums の、 'return code capturing for a11 commands connected by URL は http : / / w unix. com/302268337 ー post4 .html だ。 ' というスレッドである。

6. Shell Script ライトクックブック

目次 64 レシピ 3.9 ひらがな・カタカナの相互変換 . 第 4 章 POSIX 原理主義テクニックー Web 編 URL デコードする レシピ 4.1 URL 工ンコードする レシピ 4.2 CGI 変数の取得 (GET メソッド編 ) レシピ 4.3 CGI 変数の取得 (POST メソッド編 ) レシピ 4.4 Web プラウザーからのファイルアップロード レシピ 4.5 Ajax で画面更新したい レシピ 4.6 シェルスクリプトでメール送信 レシピ 4.7 HTML テープルを簡単綺麗に生成する レシピ 4.8 シェルスクリプトおばさんの手づくり Cookie ( 読み取り編 ) レシピ 4.9 レシピ 4.10 シェルスクリプトおばさんの手づくり Cookie ( 書き込み編 ) レシピ 4.11 シェルスクリプトによる HTTP セッション管理 . 第 5 章どの環境でも使えるシェルスクリプトを書く レシピ 5.1 シェル変数 . スコープ . レシピ 5.2 正規表現 . レシピ 5.3 文字クラス . レシピ 5.4 乱数 レシピ 5.5 レシピ 5.6 ロケール レシピ 5.7 レシピ 5.8 case 、文 レシピ 5.9 if 文 レシピ 5.10 local 修飾子 レシピ 5.11 PIPESTATUS 変数 レシピ 5.12 。。「コマンド レシピ 5.13 AWK コマンド レシピ 5.14 date コマンド レシピ 5.15 du コマンド レシピ 5.16 echo コマンド レシピ 5.17 exec コマンド レシピ 5.18 grep コマンド レシピ 5.19 head コマンド レシピ 5.20 ifconfig コマンド レシピ 5.21 kill コマンド レシピ 5.22 mktemp コマンド レシピ 5.23 Ⅱ 1 コマンド レシピ 5.24 printf コマンド レシピ 5.25 ps コマンド レシピ 5.26 sed コマンド 「 / ー 0 っ -4 、 6 -0 つひ 9 、 0 つひ 97 98 98 98 98 99 99 101 . 101 . 101 . 102 . 102 . 102 . 103 . 105 . 106 . 107 . 108 . 109 . 110 . 110 . 111 . 112 . 112 . 113 . 114 . 115

7. Shell Script ライトクックブック

121 果の住所欄への入力を担当する JavaScript だ。そして、受け取った 7 桁の郵便番号から辞書を引き、得られた 住所文字列を返すシェルスクリプトが "zip2addr. ajax. cgi" である。 名前を見ればわかるがこのシェルスクリプトも Ajax として動作するので、レシピ 4.6 ( Ajax で画面更新し たい ) に従って部分 HTML を返してもよいのだが、 こでは敢えて JSON 形式で返すことにした。「もちろん JSON で返すこともできる」ということを示すためだ。 JSON で返せば、例えばクライアント側で何らかの汎用 JavaScript ライプラリーを利用していて、それと繋ぎ込むといったことも可能というわけだ。 ソースコード 概要が掴めたところで、主要なソースコードを記していくことにする。 アプリケーションの中身を、とくと堪能してもらいたい。 尚、これらのソースコードは GitHub でも公開している * 3 。 ■ data/mkzipdic-kenall. sh ー辞書ファイル作成 ( 一般地域名用 ) シェルスクリプトで構成された Web このプログラムは、 Web サイトから ZIP ファイルをダウンロードして展開する都合により、 POSIX 非準拠 の curl コマンドと unzip コマンドを必要とすることを御了承願いたい。 # ! /bin/sh ・成功時には辞書ファイルを更新する。 しの場合は 0 、失敗したら 0 以外 ー作成成功もしくはサイトのタイムスタンプが古いために作成する必要無 ・戻り値 # [ 出力 ] 今ある辞書ファイルより新しくても更新する ・サイトにある csv ファイルのタイプスタンプが、 # Usage : mkzipdic . sh —f # 日本郵便公式の郵便番号住所 csv から、本システム用の辞書を作成 ( 地域名 ) # MKZIPDIC_KENALL . SH # 初期設定 # ーー一変数定義ー cd "$d"; pwd)" # この sh のパス readonly ur1-ZIPCSVZIP=http : //www.post ・ japanpost. jp/zipcode/dl/oogaki/zip/ken-all. zip # 郵便番号辞書ファイルのパス readonly fi1e—ZIPDIC="$dir_MINE/ken_a11. txt" readonly f1g—SUEXECMODE=0 * 3 https ://github.com/She11Shoccar—jpn/zip2addr # 日本郵便郵便番号ー住所 # csv データ (Zip 形式 ) URL # サーバーが suEXEC モードで # 動いているなら 1 を設定

8. Shell Script ライトクックブック

78 •CLOCK. 」 S / / 1 ・ Ajax オプジェクト生成関数 第 4 章 POSIX 原理主義テクニックー Web 編 / / ()E 、非 IE 共に XMLHttpRequest オプジェクトを生成するためのラッパー関数 ) function createXMLHttpRequest ( ) { if (window. XMLHttpRequest) {return new XMLHttpRequest ( ) } if (window. ActiveXObj ect) { if (xhr. readyState = の {alert ( ' タイムアウトです。 ) ) ; } var Str , elm ; function update—clock—callback (xhr , (o) { / / ( Aj 通信が正常終了した時に実行したい処理を、この if 文の中に記述する ) / / 3. コールバック関数 xhr. send(null) ; / / POST メソッドの場合は、 send() の引数として CGI 変数文字列を指定 xhr. open( 'GET' , Ⅱて1 + '?dummy=' + (new Date)/1, true) ; / / キャッシュ対策 xhr. onreadystatechange function(){update-clock—callback(xhr,to)}; tO i Ⅱ do . setTimeout(function(){xhr. abort ( ) } , 3000 の ; / / 30 秒でタイムアウト if ( ! xhr) {return;} xhr = createXMLHttpRequest() ; ur 1 , /PATH/TO/THE/CLOCK . CGI' ・ var url,xhr,to; function update-clock() { / / ( この Ajax 通信をしたい時にはこの関数を呼び出す ) / / 2. Ajax 通信関数 return false; try{return new ActiveXObj ect ( "Microsoft . XMLHTTP" ) }catch(e) { } try{return new ActiveXObj ect ( "Msxm12. XMLHTTP. 3.0 ” ) }catch(e) { } try{return new ActiveXObject("Msxm12. XMLHTTP. 6. O")}catch(e){} if (xhr. readyState ! = 4 ) {return; window. c1earTimeout (tO) ; if ( x れて . status = 200 ) { str = xhr. responseText ; elm = document. getE1ementById( ' clock' ) ; e1m. innerHTML = str; } else { alert(' サーバーが不正な応答を返しました。 } / / Ajax 未完了につき無視 このように、コメントを除けば 40 行足らずの JavaScript コードで、 Ajax が実装できてしまう。 者はまずそこから悩むことになる。そんなことに時間を費やすくらいなら前述のような 40 行足らずのコードを ンアップに追加モジュールがある。もうこうなると「一体どれを使えばよいのか ? ? ? 」、 Ajax や JavaScript 初心 している。昔は prototype. js が流行ったが廃れ、トレンドは jQuery へ移りっている。しかし度重なるバージョ 世の中 JavaScript が流行っており、同時に、それを便利に使うためのライプラリーも実に様々なものが登場 解説 更新されるはずだ。 ること ) し、 Web プラウザーで CLOCK. HTML を開いてみるとよい。 update ボタンを押すたびに現在時刻に この 3 つのコードを適宜 Web サーバーにアップロード ( CLOCK. JS 内で指定している URL は適切に記述す

9. Shell Script ライトクックブック

レシピ 4.6 Ajax で画面更新したい 理解し、コピー & ペーストして使う方がよっぽど簡単ではなかろうか。 前述の JavaScript コードは XMLHttpRequest という Ajax のためのオプジェクトを使うためのコードだが、 いくつかのポイントを押さえれば理解は簡単だ。 ポイント 1. XMLHttpRequest オプジェクト生成方法 79 ただし困ったことに IE8 は、く select > タグにはⅲ nerHTML プロバティー代入ができないというバグがあ する ) で紹介している便利な mojihame コマンドを使えば、それほど大変なことにはならないのだ。 なる。そのぶんサーバー側が大変になると思うかもしれないが、レシピ 4.8 ( HT L テープルを簡単綺麗に生成 リー無しの JavaScript 側で、苦労して HTML の DOM ツリーを操作するなどといった面倒な作業が要らなく に代入するだけで済んでしまう。このようにしてサーバー側に部分 HTML の生成を任せてしまえば、ライプラ HTML ごと作ってしまっている。 こうすると JavaScript 側は受け取った文字列を innerHTML プロバティー 時刻データを XML や JSON で表現したものを返しているのではなく、ハメ込まれるく div> タグの中身の部分 といって、最近 XML の代わりに使われるようになってきた JSON も利用していない。サーバー側の CGI は このサンプルコードのもうーっの特徴は、 Ajax でありながら XML をやりとりしていないことだ。だから ポイント 3. 無理に XM L や」 SON を使おうとしない 検索してもらいたい。様々なページで解説されている。 XMLHttpRequest オプジェクトやその各種メソッドやプロバティーの使い方については、その名前で Web つ後の send メソッドの引数として指定することになっているので注意。 数を毎回替えるというこの原始的な方法が最も確実である。尚、 POST メソッドの場合の CGI 変数は、その一 いためのメソッドが用意されているのだが、これまたバージョンによって使い方が微妙に異なるので、 CGI 変 ようにしている。これで IE もキャッシュを使わなくなる。一応 XMLHttpRequest にはキャッシュを使わせな 間 ( のミリ秒単位を求める Date オプジェクトの利用 ) とすることで、アクセスする度、リクエスト内容が変わる シュ対策」とコメントしてある行の記述だ。 URL の後ろに、ダミーの CGI 変数を置き、その値として UNIX 時 実際の Web サーバーへはアクセスをしないという困ったクセがある。これを回避するテクニックが「キャッ これまた IE 対策なのだが、 IE は同じ内容で Ajax 通信を行うと 2 回目以降はキャッシュを見にいってしまい、 ポイント 2. キャッシュ回避テクニック るのかを気にせずオプジェクトが生成できる。 功するまで試みるのが最初の関数 createXMLHttpRequest() である。これを使えばどのプラウザーで動かされ い IE は ActiveX オプジェクトとして生成しなければならない。そこで、オプジェクトの生成を色々な手段で成 トの生成方法が違う ( オプジェクトの使い方は同じ ) 。 IE でも最近のものは他と同様の方法で生成できるが、古 IE (lnternet Explorer) は他のプラウザーと違って少々クセがある。まずは XMLHttpRequest オプジェク https : //developer. mozilla ・ org/j a/docs/Web/APl/XMLHttpRequest * 9 →レシピ 4.8 (HTML テープルを簡単綺麗に生成する ) → MDN (Mozilla Developer Network) サイトの XMLHttpRequest メソッド説明ペー 参照 る。これがやりたい場合は残念ながら XML や JSON を使うしかない。

10. Shell Script ライトクックブック

レシピ 4.3 CGI 変数の取得 (GET メソッド編 ) ■ Web プラウザーが送信する元になる HTML く fO て m action="form. cgi" method="GET"> 71 name= name= "QUERY-STRING" の中に入っているので、まず cgi-name を使ってこれを正規化して一時ファイルに GET メソッド ( 環境変数 "REQUEST-METHOD ”が "GET ” ) の場合、 CGI 変数は環境変数 1 ¯name > $Tmp-cgivars # 正規化し、一時ファイルに格納 printf '%s' "${QUERY-STRING: ー } " ー Tmp=/tmp/${0##*/}. $$ # 一時ファイルの元となる名称 # ! /bin/sh ■前述のフォームから送られてきた CGI 変数を受け取るシェルスクリプト (form. cgi) まとめると次のようになる。 格納する。あとは nameread コマンドを使い、取り出したい変数をシェル変数等に取り出せばよい。 く d1 > く dt> 名前く /dt> く dd> く input type="text ” く dt > メールアドレスく / dt > く dd> く input type="text" く / d1 > く input type=" submit" name= 'post ー く / fo て m > " fullname " value= ー value= ー value=" 送信” / > fullname=$ (nameread fullname $tmp—cgivars) email=$ (nameread email $tmp—cgivars) ( ここで何らかの処理 ) rm -f $Tmp-* # CGI 変数 "fullname" を取り出す # CGI 変数 " email " を取り出す # 用が済んだら一時ファイルを削除 尚、元のデータには漢字や記号が含まれていて、 URL 工ンコードされていてももちろん構わない。それらの デコードは cgi - Ⅱ ame コマンドが済ませてくれているのだ。 解説 というように“変数名 = 値”が“ & ”で繋がれた形式になっており、かっ“値”は URL 工ンコードされている。 れ佖 me プ = む佖ノ & れ ame2 = 礰・ 2 & . の場合は CGI 変数は環境変数 "QUERY-STRING ”の中に入っている。そしてその中身は、 くつかの種類がある。「回答」で述べたように、 GET メソッド ( 環境変数 "REQUEST-METHOD ”が "GET ” ) Web プラウザーから情報を受け取りたい場合によく用いられるのが CGI 変数であるが、その送られ方にはい こまでわかっていれば自力で読み解くコードを書いてもよい。 tr コマンドで“ & ”を改行に ' をスペー スに代え、最初のスペースより右側 ~ 行末までの文字列をレシピ 4.1 ( URL デコードする ) に記したやり方でデ コードするのだ。しかし、それを既に済ませたコマンドがあるので使わせてもらえばよいというわけだ。 "cgi-name ”はとりあえず CGI 変数文字列を扱いやすい形式に 「回答」で登場した 2 つのコマンドであるが、 変換して一時ファイルに格納するためのもので、 "nameread ”は好きなタイミングでシェル変数等に取り出すた めのものである。よって、前者は通常最初に一度だけ使うが、後者は必要な個所でその一時ファイルと共に毎回 使うものである。