Database, graphics
データベース,グラフィックス

注意事項

毎回の授業の最初に出席メールを提出せよ.

前回までの出席記録課題と提出状況 を確認せよ.

8 章 データベースつづき

8.4 応用テクニック

SQL のクエリ文字列の内容が動的に変わる場合は 形式だけ指定しておき,データを別に与えるプレースホルダを使った 書き方を使うと便利である. 教科書p.219 の下から 10 行目の例のように本来データを書くべき 場所に ? を書いておき,実際のデータは query メソッドの第二引数として 配列で渡す.こうすることで $books 配列の内容が動的に変化する場合でも わかりやすく記述することができる.

プレースホルダは prepare, execute と組み合わせて使うと便利である. クエリ文字列は人間に理解しやすい書式となっており,実行時には コンパイルされてから実行される.クエリを繰り返すアプリケーションでは 毎回コンパイルを行っているとその処理時間が問題になる場合がある.

同じ形式のクエリを繰り返し行う 場合,一度 prepare でコンパイル を行った結果を変数に格納し,execute でそれを実行する部分だけを 繰り返せばコンパイル処理が一度で済むため効率が良い. ただ,全く同じクエリを何度も繰り返すことは実用上あまり考えられず, 例えば書名,出版年などのデータ部分だけ変えた大量のデータに 対してクエリを繰り返すことが多い.

プレースホルダを使うことでデータ部分を ? のままコンパイルを行い, execute 時に配列でデータを与えることができる.これにより コンパイルは一回で,いろいろなデータに対する処理を行うことが 可能になる.

一件分のデータ部分を配列(例えば書名,出版年の配列)で第二引数として与えるのが execute(教科書p.220 真ん中の例)で,この例では本の件数だけループ処理を行っている.

複数件のデータ部分を配列の配列(例えば上記一件分のデータを要素とする配列の配列) を第 2 引数として与え,自動的に上の例のループ処理を行うのが executeMultiple() である.教科書 p.220 下の例はすぐ上のプログラムと同じ処理を行うがより簡単な 記述になっている.

PEAR DB にはクエリ実行と結果の取得をまとめて行うメソッドが用意されている. fetchRow() や fetchInto() でデータを格納したデータ構造から 必要なデータを呼び出す作業のショートカットである. 例えば教科書 p.213 例 8-1 では $q = $db->query($sql); 変数 $sql に設定されている文字列をクエリとしてデータベースへの 問い合わせを行い,その結果をオブジェクト $q に格納する.次に $q->fetchInto($row); で $row というユーザ定義の配列へ得られたデータをすべてコピーし, $row[0] で表の一行目に対応するデータを取り出している.

一行しかないことが事前に分っているなら, $q->getRow($sql); だけで同じことができる. ショートカットは getRow() の他に getOne(), getCol(), getAssoc(), getALL() があり,いずれもプレースホルダを使用することができる.

クエリの結果に関する情報を知るメソッドがいくつかある. numRows() で行数,numCols() で列数,affectedRows() で変更された行数, tableInfo() でデータ型やフラグなどの詳細情報を知ることができる. (教科書 p.222 例参照)

MySQL では AUTO_INCREMENT により一意な ID を生成できる. それができない RDBMS の為に PEAR DB には 一意な ID を生成するメソッド nextID がある. p.224 の 15 行目の splice($book, 0, 0, $id); は array_splice の誤植.$book の 0 番目の要素を 0 個消して $id を入れる,すなわち配列 $book の先頭に $id を挿入している.

getListOf() でデータベースに関する情報を得ることができる.

銀行口座からの引き落としと別の講座への預け入れなど,セットで実行 しなければいけない処理のためにトランザクションという仕組みがある.

8.5 サンプルアプリケーション

省略

9 章 グラフィックス

9.1 ページへの画像の埋めこみ

ページ内の画像ファイルへの HTTP リクエストはページ本体のものとは 別に行われる.例えば 2 つの画像が含まれたページを表示するためには 3 回の HTTP リクエストが行われる.

img タグの src 属性には,対象が画像ファイルの場合はファイル名が書いてある. PHP で作成した画像を埋め込むにはファイル名の代わりに php スクリプトのファイル名 を書く.URL にエンコードすることでパラメータ付きでスクリプトを指定することもできる. (教科書 p.242 下から 3,4 行目参照)

9.2 GD 拡張モジュール

第2回,設定情報のページで作成した phpinfo.php をブラウザで開き,GD がサポートされていることを確認せよ.

9.3 グラフィックについての基本概念

色は R, G, B の光の 3 原色の強さで表されるとする. それぞれに 8 ビット使用すると,0 から 255 の間の値をとる 例えば R 要素が最強で他の要素がゼロであれば (R, G, B) = (255, 0, 0) でありこれは純粋な赤を示す.光の重ね合わせにより (R, G, B) = (255, 255, 255) は白となる.また (R, G, B) = (0, 0, 0) は黒を表す. 一つの色を表すのに 8×3=24bit のデータを必要とする.これは True Color と呼ばれ,人間の目で識別できる諧調を十分カバーしていると考えられている.

論理的にはカラー画像は色を示すデータが縦横の 2 次元に並んだものと考えることが できる.

実際のカラー画像ファイル形式は上記 2 次元配列を単純に保存したものではない. 一般に画像データはデータ量が多いので圧縮処理が施されているのが普通である.

各ピクセルにR,B,G の値の他にアルファチャネルと呼ばれる透過率を表す値 を持たせるフォーマットもある.

9.4 画像の作成と描画

教科書 p.244 例 9-1 を black.php として作成し, それを埋め込むための下記例 22 を sample22.html として 作成せよ.sample22.html をブラウザで開き,動作を確認せよ.

例 22

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<title>Black</title>
<body>
<p>
<img src="black.php">
</p>
</body>
</html>

教科書 p.244 例9-1 は動的に画像を作成する処理の典型 的な手順をとっている.

まず最初に ImageCreate() を実行 する.戻り値は画像ハンドルと呼ばれ,画像に関する種々の処理は この画像ハンドルを引数として渡して行う.

使用する色は事前に ImageColorAllocate() 関数を実行して 割り当てておく.戻り値を色の名前として使用する.

実際に描画を行うのは ImageFilledRectangle() 等の描画プリミティブである.

次に Content-Type ヘッダを正しく指定したものを,header() を用いて出力する.

最後にファイル形式に合わせて画像を出力する ImagePNG() 等を 実行する.

最後の Content-Type ヘッダの送信と ImageXXX() を変えると別の形式の画像ファイルが生成できる.

サーバーから見ると,どこからアクセスされるかわからず, どんな計算機,ブラウザなどの環境で開かれるかわからない. 携帯電話からアクセスされる場合を想像すると理解しやすいが, すべての画像フォーマットがサポートされているとは限らない.

実習
自分の携帯電話から上で例 22 のページを開け. この画像フォーマットがサポートされているか確認せよ.

スクリプトからサポートされているフォーマットを確認し, それに合わせて出力画像フォーマットを変えることができる. (教科書 p.246 例9-3 参照)

ImageCreateFromJPEG, ImageCreateFromPNG で既存のファイルから画像を作成した 画像ハンドルを得ることで,その画像に手を加えることができる.

実習
9.4.5 には基本的な描画関数が紹介されている. 例 22 を参考に自由に実験を行え.

教科書 p.248 例 9-4 の画像を表示し,確認せよ.

9.5 画像とテキスト

ImageString で画像にテキストを書き込むことができる.

ImageString の第2引数はフォント番号.

実習
p.249 例9-5 を入力し,確認せよ.

9.5.1 フォント

実習
p.250 の例を入力し,確認せよ. ただし,このままでは黒の背景の上に黒の文字が出力される状態であるため, 文字が表示されない.ImageColorAllocate は最初に呼び出された色を背景色に 設定するためである.黒を定義している行の前に 白を定義する行を挿入すれば白が背景色となり,表示される.

第 10 回課題「SQL の使用」 を提出せよ.


Updated in June 30, 2009, index.html, Yamamoto Hiroshi