Comments
Transcript
Perl と MySQL を組み込んだ Web アプリケーションの汎用 パッケージ化
Perl と MySQL を組み込んだ Web アプリケーションの汎用 パッケージ化手法の研究 2013 年 花川典子ゼミ 5110030 臼杵高太郎 5110048 大塚貴史 1 目次 Perl と MySQL を組み込んだ Web アプリケーションの汎用パッケージ化手法の研究 1 第1章 はじめに ...................................................................................................... 4 第2章 関連研究 ...................................................................................................... 6 第1節 Perl .......................................................................................................... 6 第2節 CGI .......................................................................................................... 6 第3節 MySQL..................................................................................................... 7 第1項 MySQL の概要 ...................................................................................... 7 第2項 SQL ...................................................................................................... 7 第3章 システムの全体像 ........................................................................................ 9 第1節 システムの概要 ........................................................................................ 9 第2節 開発環境の構築 ........................................................................................ 9 第3節 Perl のモジュール追加 ........................................................................... 14 第1項 CPAN を利用したモジュール追加 ...................................................... 14 第2項 PPM を利用したモジュール追加 ........................................................ 15 第4節 実行環境の確認 ...................................................................................... 16 第5節 システムの利用例 ................................................................................... 16 第6節 システムの操作例 ................................................................................... 17 第1項 2 の処理) ............................................................... 17 予約画面(図 20 の○ 第2項 3 の処理) .............................................. 17 予約キャンセル画面(図 20 の○ 第3項 4 の処理) .............................................. 17 システム管理者画面(図 20 の○ 第7節 システム設計図 ...................................................................................... 19 第8節 詳細設計 ................................................................................................. 20 2 第1項 データベースへの接続 各種 cgi ファイルの sub setDB (図 21 参照) . 21 第2項 1 の処理) ...................... 21 予約状況表示初期画面 sche38.cgi(図 21 の○ 第3項 2 の処理) ................................................. 24 予約関連画面説明(図 21 の○ 第4項 3 の処理) ................................ 28 予約キャンセル関連画面説明(図 21 の○ 第5項 4 の処理) ....................................... 30 システム管理者使用画面(図 21 の○ 第4章 考察 ........................................................................................................... 34 第5章 まとめ ........................................................................................................ 36 第1節 全体のまとめ .......................................................................................... 36 第2節 今後の課題 ............................................................................................. 36 謝辞 ............................................................................................................................ 38 付録 SQL 文 ........................................................................................................ 40 3 第1章 はじめに 近年、自宅パソコンやスマートフォンの普及、ゲーム機などにも Web ページアクセスで きる機能(ブラウザ)が標準化されるようになってきた。またそういった Web ブラウザの普 及と同時にインターネットを利用した自社の商品及びサービスを売買または宣伝・広告す るといった電子商取引(Electronic commerce)が増えてきた。電子商取引を行う Web ページ を通称 EC サイトという。 Web ページの構築には HTML などの言語を学ぶ必要があるのだが、最近では視覚的に Web ページが作成できる、JustSystems 社の「ホームページビルダー」や HTML を支援す るフリーソフトウェアが配布されるなど初心者でも容易に Web ページの作成が可能になっ てきた。 しかし、予約受付に関しては充実した内容の Web ページであっても、 「予約は電話でお願 いします。 」といった場合が多い。利用者側の立場からすれば、「Web ページにアクセスし たのに、予約は電話でしなければならないの?」と疑問に思う人もいると考えられる。こ れでは、待ち時間の解消や深夜帯での予約といった Web ページのメリットを生かし切れな い。そして予約を受け付けるシステムを持たない Web サイトが多い理由は複雑なシステム 構造にある。Web ページによる情報提供のみなら、HTML などのデータがそのまま応答の データとして送信される静的 Web ページでよい。だが、予約システムとなるとリクエスト のたびに生成されるコンテンツの内容がことなるため、PHP や Perl などの動的な Web ペ ージにする必要がある。 動的 Web ページの開発を依頼すると、費用が高くなる場合がある。例えば静的 Web ペー ジの場合、HTML ファイルのソースをコーティングするだけなので、依頼するページ数に もよるが最高でも 20 万円ほどで済む。しかし、動的 Web ページの場合、例えばデータベ ースから商品情報や在庫情報などを取ってきて、その情報を使って HTML を作成及び合成 などを行ったうえで、ブラウザに送信する。このような処理を行うには、Web サーバー上 で動作するプログラムを書く必要がある。プログラムを書くにはプログラマに依頼し、さ らに大きなシステムになるに連れ、プログラマやそれを管理するマネージャなどの人員も 増えていくので、費用が嵩んでくる。依頼するシステムや Web ページにもよるが、最低で も 50 万円、最高で数百万掛かる場合がある。これでは必要経費として出せる大企業はまだ しも、個人商店などの小規模店舗には導入しづらいのが現状である。 そこで我々は費用のかかる動的 Web ページである予約システムを少人数体制で開発し、 本システムを利用して頂ける店舗を少しでも増やしていきたいという目的も含めて、無償 提供を行った。特徴としては、CGI(Perl)、MySQL を使用して構築し、本来 MySQL によ るデータベースにて管理するメニューやネイリストなどの部分をテキスト化したことによ り、手間のかかる SQL 文を打ち込む必要がなくなった。このように、編集や追加作業を簡 略化することにより、様々な業種に適用可能となり汎用パッケージ化を目指した。 4 本論文では、第2章で関連研究について述べる。第3章では開発環境の構築、システム の概要、詳細設計を述べる。第4章ではシステムの考察を行い、第5章でまとめを述べる。 5 第2章 関連研究 本章では、本論文に使用する言語を説明する。第1節ではプログラミング言語である Perl(Practical Extraction and Report Language)を説明する。第2節では Web サーバー上 で実行される CGI(Common Gateway Interface)について説明する。第3節ではデータベー ス言語である MySQL について説明する 第1節 Perl Perl とは、プログラミング言語のひとつで、正規表現を利用した文字列処理やウェ ブアプリケーションの開発に非常に優れた言語である。アメリカ合衆国のプログラマ である Larry Wall が開発を行った。C 言語と類似した表記を行うが、インタープリタ 型言語である。そのため、コンパイラを必要とせず、サーバー上に設置することによ りすぐに実行することができる。オープンソースで開発されている言語であり、ユー ザーが修正を行うことが可能である。Perl を実行する環境の構築は、OS ごとに異なり、 UNIX 系の OS は標準インストールされている。Microsoft Windows 環境では、 ActiveState 社が開発、提供している Active Perl をインストールすることにより、使 用できる。Perl はモジュールが搭載されており、日付の扱いや、ファイル処理を行う 場合などに記述する部分を簡略化することができる。標準モジュール以外にもプログ ラマが作成したモジュールを追加することができる。それらのモジュールは CPAN(Comprehensive Perl Archive Network)と呼ばれるモジュールをアーカイブす る Web 上のシステムに、数多く登録されている。CPAN を通じたモジュールのダウン ロードとインストールは CPAN シェルと呼ばれる専用のソフトウェアを通して実行す る。ActivePerl を使用している場合は PPM(Perl Package Manager)と呼ばれるパッケ ージマネージャも同時にインストールされており、それを通しての追加も可能である。 第2節 CGI CGI とは Web サーバー上でプログラムを動作させるための仕組みである。通常、 HTML では作成された HTML を表示するだけの静的な Web ページを表示する。アク セス先を CGI にし、CGI プログラムを実行することにより、アクセス時に表示するデ ータを作成することができ、動的な Web ページとなる。CGI の他にも動的な Web ペ ージを作成する機能は Flash や JavaScript 等があるが、CGI とは大きく違う部分があ る。CGI ではブラウザから Web サーバーに要求をした際に Web サーバー上で CGI プ ログラムに対する要求かどうかを判別する。CGI プログラムに対する要求であった場 合は、Web サーバー上で実行され、実行結果を Web サーバーに返す。その実行結果を 含めた HTML を出力する。そのため、ブラウザ側ではプラグインやアドオンの追加な どを行わずに Web アプリケーションを利用することができる。 6 第3節 MySQL 第1項 MySQL の概要 MySQL とは MySQL AB によって開発、提供、サポートが行われていて世界市場 でトップのシェアを占めているオープンソースの SQL データベース管理システム である。MySQL AB は MySQL の開発者によって創設された営利会社で、MySQL データベース管理システムに関連するサービスを提供することでビジネスを構築し ていた。2008 年2月にはサンマイクロシステムズ株式会社によって買収され、さら に 2008 年 11 月にはサンマイクロシステムズと MySQL 株式会社(MySQL の日本法 人)が合併した。2003 年の時点で日本の 8 割が PostageSQL を利用していたが、上 記のサンマイクロシステムズの合併を期に MySQL を利用するユーザーが増えてき た。2013 年現在、Yahoo、Facebook、Twitter などの巨大ウェブサイトでの利用例 も多く、ライバルである PostageSQL や Firebird を抜いて世界的に最も多く使用さ れている。 第2項 SQL SQL とは Structured Query Language(構造化照会言語)の略称である。SQL は 英語によく似た言語の一つで、Microsoft SQL Server といったデータベースでも使 用されているリレーショナルデータベース管理システム(RDBMS:Relational DataBase Management System)である。リレーショナルデータベースとは1件のデ ータを複数の項目(フィールド、列、カラム)の集合として表現し、データの集合をテ ーブルと呼ばれる表で表す方式で、ID 番号や名前などキーとなるデータを利用して、 データの結合や抽出を容易に行うことができる。データベースとしては最も普及し ている方式である(図 1参照)。 フィールド(列、カラム) 図 1 リレーショナルデータベースの例 レコード (行) SQL は大きく分けて(1)データ定義言語(DDL:Data Definition Language)、(2) データ操作言語(DML:Data Manipulation Language)、(3)データ制御言語(DCL: Data Control Language)の3種類から構成される。 (1)データ定義用語(DDL:Data Definition Language)とは DDL はリレーショナルデータベースを対象として、テーブルなどの構造を制御 することができる。主な命令に、新しくテーブルなどを作成する「CREATE」や、 既存のテーブルなどを削除する「DROP」、既存のテーブルなどに変更を加える 「ALTER」などがある。 7 (2)データ操作言語(DML:Data Manipulation Language) DML はデータベースにおいてデータの検索・新規登録・更新・削除を行うため の言語である。主な命令に、検索を行う SELECT 文、新規登録を行う INSERT 文、更新を行う UPDATE 文、削除を行う DELETE 文がある。 (3)データ制御言語(DCL:Data Control Language) DCL はデータベースにおいてデータに対するアクセス制御を行う。主な命令文 に、特定のデータベース利用者に特定の作業を行う権限を与える GRANT 文や特 定のデータベース利用者からすでに与えた権限を剥奪する REVOKE 文などがあ る。 ソフトウェアからデータベースを操作する場合には、プログラム上で SQL 文を 生成してこれを RDBMS に発行し、操作を実行する。このため、多くのプログラ ミング言語処理系や実行環境では、RDBMS に接続して SQL 文を発行し結果を受 け取るためのプログラミングインターフェースが用意されている。 8 第3章 システムの全体像 本章では作成した予約システムについて解説する。第1節では予約システムの概要と処 理の流れを説明し、第2節では開発環境の構築を行い、第3節以降でシステムの表示画面 とコードの詳細の説明を行う。 第1節 システムの概要 今回提案するのは、Web ブラウザからアクセスできる小規模店舗主体の予約システ ム構築である。利用者側はパソコンやスマートフォンからシステムを導入した Web ペ ージにアクセス、ブラウザは Web サーバーにリクエストを送る。Web サーバーはリク エストを受け取り sche38.cgi に記述されている関連データを参照する。また、同時に データベースに接続を行い命令の発行及び結果を取得する。Web サーバーがレスポン スを Web ブラウザへ送信する。Web ブラウザがレスポンスを解析して受信データを表 示する。 また、本システムの全体像は以下のような構造となっている(図 2参照)。 利用者 CGI(Perl)実行環境 DB サーバー Sche38.cgi (MySQL) 1 ○ サーバー Web Web サーバー リクエスト レスポンス データの参照・書き込み・更新 DB の接続 クエリの発行 結果の取得 color.htm dbpass.txt email.txt menu.txt nailist.txt notice.txt option.txt QRcode.gif style.css sche38 用 データベース 利用者 図 2 システムの全体像 第2節 開発環境の構築 Perl や HTML の記述はテキストエディタやメモ帳でも行えるが、効率化を図るため 本システムでは、総合開発環境ソフトウェアである Eclipse を用いて開発を行う。初め に、Perl の実行環境を整えるため、 ActivePerl(http://www.activestate.com/activeperl/downloads) の公式ページより 32bit 版をダウンロードする。なお、OS が 64bit の場合でも 32bit 版にする。理由は、 64bit 版だと MySQl のモジュールである DBI-mysql が PPM よりインストール出来な いからである。ダウンロード完了後、画面の指示に従いインストールを行う。インス トール完了後コマンドプロンプトを起動して「perl -v」を入力し(図 3参照)のメッセ 9 ージ(バージョン情報)が表示されていれば Windows に Perl の実行環境が導入されてい る。 図 3 ActivePerl のバージョン確認 次に Eclipse を導入する。Eclipse は通常インストールだと英語表記のため、日本語 プラグインが導入されている Eclipse 4.3 .1Kepler Pleiades All in One の Ultimate Full Edition を(http://mergedoc.sourceforge.jp/)よりダウンロードする。しかしこの状 態では、本システムで利用する Perl スクリプトの編集やデバッグが Eclipse 上で行え ないので Eclipse に EPIC プラグインを導入する。以下に導入方法を説明する。 (1) Eclipse を起動、ツールバーのヘルプから Eclipse マーケットプレイスを選択す る(図 4参照)。 図 4 マーケットプレイス選択画面 検索フォームに EPIC と記述する。検索を実行し最上部の EPIC-Eclipse Perl 総 合 0.5 をインストールする(図 5参照)。 10 図 5 EPIC のインストール インストール完了後、ツールバーのウィンドウから設定を選択し、設定画面ダイア ログを起動する。Perl EPIC という項目があるので選択し、Perl 実行可能ファイルで 先ほどインストールを行った ActivePerl の bin フォルダ内にある perl.exe を選択し、 OK ボタンを押す。以上で Eclipse 上の Perl のデバッグ及び編集が可能になる (図 6 参照)。 図 6 Perl 編集画面 次に MySQL のインストールを行う。MySQL の公式ページ (http://dev.mysql.com/downloads/mysql/)より今回はバージョン 5.5Windows (x86, 32-bit), MSI Installer をダウンロードする。ダウンロードした Setup インストーラー を起動する。画面の指示にしたがって Next ボタンを押して進む。ここでは重要な設定 部分だけ以下に紹介する。 図 7の画面では、サーバーのタイプを設定する。今回はサーバー用なので「Server Machine」を選択するが、開発用やサーバー用でもメモリが少なくアクセス数も少ない 場合は、 「developerMachine」を選択する。 11 図 7 サーバータイプ設定画面 図 8はデフォルトの文字コードを設定する。日本語で使用する場合は、 「Best Support For Multilingualism」を選択する。デフォルトの文字コードは、UTF8 とな る。 図 8 文字コード設定画面 図 9では管理者のパスワードを設定する。適正なパスワードを入力する。MySQL の場合、管理者の ID は、root となる。別のマシンからコントロールを行う場合は、 「Enable root access from remote machines」にチェックを行い、そうでない場合は、 チェックをはずす。 図 9 パスワード設定画面 以上で MySQL の設定が完了し問題なければ設定の準備ができたという画面が表示 されるので「Execute」ボタンを押す。これで MySQL のインストールは完了である。 確認のため、コマンドプロトコルにて「mysql -u root –p」を入力する。Enter password: とパスワードを尋ねてくるので設定した root のパスワードを入力して Enter キー 12 を押す。図 10 のように MySQL のバージョンが表示されていれば問題ない。 図 10 MySQL 確認画面 最後に Eclipse には標準でデータベースを編集・管理ができる DBViewer がインス トールされている。ここでは、DBViewer を MySQL と接続する設定をする。まず、 配布ページ(http://dev.mysql.com/downloads/connector/j/)より MySQL の JDBC ドラ イバ(MySQL Connector/J)をダウンロードする。Eclipse の DBViewPlugin を開く。 「ウィンドウ」-「ビューの表示」-「DB ツリー・ビュー」で開く(図 11 参照)。 図 11 DB ツリー・ビュー 「OK」ボタンをクリック後コンソールが出てくるので、右クリック「登録」を押す (図 12 参照)。 図 12 コンソール データベース定義名を入力し、ファイル追加ボタンを押す。ダウンロードした JDBC ドライバの Jar ファイルを選択する(図 13 参照)。 13 図 13 Jar ファイル選択 次に、 「接続文字列」 「接続ユーザー」 「接続パスワード」を入力する。今回は以下の ように指定した(図 14 参照)。 接続文字列→jdbc:mysql://localhost:3306/rin 接続ユーザー→root 接続パスワード→password 接続スキーマ→rin. 図 14 データベース定義登録 「テスト接続」ボタンを押し、エラーがでないことを確認し、終了する。以上で、 Eclipse 上の DBViewer より、 「C:¥Documents and Settings¥All Users¥Application Data¥MySQL¥MySQL Server 5.5¥data」のデータが閲覧できるようになる(図 15 参 照)。 図 15 データベース閲覧 第3節 Perl のモジュール追加 本システムでは Perl のモジュールを複数使用している。ActivePerl をインストール した時点ではインストールがされていないモジュールもあるため、外部から何らかの 方法でインストールする必要がある。そのため、本節では Perl のモジュール追加方法 を説明する。 第1項 CPAN を利用したモジュール追加 本項では CPAN を利用したモジュールの追加方法を説明する。cpan シェルの起動 は、Windows のコマンドプロンプトに cpan と入れ、実行する。cpan シェルがイン 14 ストールされていない場合は自動的にインストールされる。実行された画面はコマ ンドプロンプトのディレクトリ欄に cpan と表示され、入力待ち状態となる(図 16 参 照)。 図 16 CPAN シェル起動画面 この画面で、install モジュール名(例:install DBI)と入力し、実行する。実行を 行った場合、cpan シェルが自動的に CPAN に接続し、入力したモジュールとそのモ ジュールを使用するために必要な関連モジュールのインストールを行う。 第2項 PPM を利用したモジュール追加 本項では PPM を利用したモジュールの追加方法を説明する。PPM の起動はコマ ンドプロンプトに ppm と入力し、実行する。PPM が実行され、表示される(図 17 参照)。 1 ○ 2 ○ 3 ○ 図 17 PPM 起動画面 1 の部分にあるview all packages PPMを用いてのインストールはまず、図 17 の○ を選択し、PPMのリポジトリに登録されているすべてのパッケージを表示する。次 に、インストールを行いたいパッケージを右クリックし、install (パッケージ名) + を 選択する。一度に複数のモジュールをインストールする場合はまとめて選択できる。 2 の部分にあるview packages to install/removeに選択したパ 選択を行うと図 17 の○ 3 のRun ッケージが表示される。表示されているパッケージが正しければ図 17 の○ を選択する。その後、出てくるインストール許可のダイアログにYesを押すことによ り、インストールが開始される。 15 PPM と CPAN の大きな違いとしては、PPM がパッケージをダウンロードするリ ポジトリは初期設定では ActiveState 社が提供するリポジトリのみであり、提供数が 少なく、目的のパッケージが存在しない場合がある。そのような場合はユーザー自 身がリポジトリ先を増やすことにより、十分な数のモジュール提供を得られる。リ ポジトリ先を増やす方法は、PPM の画面上部メニューバーEdit→Preferences を選 択する。表示された PPM Prefernces のタブ Repositories を選択する。表示されて いるフォーム Name には登録名、Location にリポジトリのアドレスを入力し、Add ボタンを押す。この操作により、リポジトリが追加される(図 18 参照)。 図 18 PPM リポジトリ追加画面 第4節 実行環境の確認 本節では本システムの実行環境の確認を行う。Eclipse を起動し、実行タブの実行構 成を押す。実行構成のウィンドウが開かれるので、左部の Perl CGI を選択し、新規構 成を選択する。メインタブにて esthe_rin フォルダを参照する。次に Web サーバータ ブを開き、HTML ルート・ディレクトリー及び CGI ルート・ディレクトリーでは esthe_rin フォルダを参照する。また、HTML 開始ファイルには sche38.cgi を選択す る。以上で設定を終わり、実行を押すとデフォルトで設定されているブラウザにて本 システムの動作確認が行える。この際モジュールが不足していると Error メッセージ が表示されるのでメッセージに従いモジュールの追加を行う。 第5節 システムの利用例 本システムの利用例を説明する。本システムは予約を行う利用ユーザーとシステム の管理を行うシステム管理者が利用する。利用ユーザーは予約と、予約のキャンセル を行うことができる。システム管理者は予約のキャンセル、予約が行えるコース名と コース数の変更、予約を行う際に表示されるメニューの変更、注意事項の変更が行え る。以下に、このシステムを利用例のユースケース図を示す(図 19 参照)。 16 予約システム 予約をする 予約を取り消す メニュー変更 利用ユーザー システム管理者 コース変更 注意事項変更 図 19 予約システムユースケース図 第6節 システムの操作例 1 )から、各 本節ではシステムの操作例を説明する。本システムは初期画面(図 20 の○ システムへとアクセスを行う。以下に、各画面での操作例を説明する。 第1項 2 の処理) 予約画面(図 20 の○ 予約を行う際には、初期画面にある、予約を行いたい時間の、希望コースの○部 分をクリックし、予約画面へとアクセスを行う。予約画面へアクセスを行った場合 2 -1の画面が表示される。予約時には名前、メールアドレスを入力し、 は図 20 の○ 希望のメニューを選択する。他に連絡事項があればテキストボックスに連絡事項を 2 入力し、送信ボタンを押す。送信ボタンが押された場合、入力したデータが図 20 の○ の画面に表示される。問題がない場合は送信ボタンを押し、予約を確定する。予約 3 の画面が表示される。この画面表示をもって、予約が完 が確定した場合、図 20 の○ 了となる。 第2項 3 の処理) 予約キャンセル画面(図 20 の○ 予約のキャンセルを行う画面には、初期画面中央部の「予約キャンセルはこちら」 3 と表示されているリンクからアクセスする。アクセスを行った場合は、図 20 の○ 1に移動し、予約時に登録を行った名前を入力するフォームが表示される。入力を 行い、送信ボタンを押す。その場合、予約データの検索が行われ、アクセス日時以 3 -2に移動し、表示され 降に検索データと一致する予約が存在した場合、図 20 の○ る。この画面で、キャンセルを行いたい予約の左側にあるチェックボックスにチェ ックを付け、予約を取り消すボタンを押す。押された時、予約を取り消す処理が行 3 -3の画面が表示される。 われ、取り消しが行われたことを示す図 20 の○ 第3項 4 の処理) システム管理者画面(図 20 の○ システム管理者画面には初期画面下部の「管理者用」リンクからアクセスを行う。 4 -1の管理者システム入室画面が表示される。この画面で、 アクセス時には図 20 の○ 4 -2の管理者システム初期画 設定したパスワードを入力し、正しい場合は図 20 の○ 17 面が表示される。中央スケジュール部分を操作することにより、予約の可不可の設 定が可能である。管理者システム画面からは予約管理画面、コース編集画面、メニ 4 -3の予約管理 ュー編集画面、注意事項編集画面への移動が可能である。図 20 の○ 画面では確認を行いたい予約の年月日を入力し、検索ボタンを押す。検索を行うと 4 -4の予約データ一覧画面が表示される。この画面に表示されている予約 図 20 の○ データのうち、取り消しを行いたいデータのチェックボックスにチェックを入れ、 4 -5の画面が表示され、予約が 予約を取り消すボタンを押す。その場合、図 20 の○ 取り消されたことを確認できる。次に、各種編集画面の説明を行う。コース編集画 4 -6が表示される。中央のテキストエリアに1コース1 面へ移動を行うと図 20 の○ 4 -7が表示され、編集 行で入力を行い、送信ボタンを押す。押した場合、図 20 の○ 4 -8が表示される。中央の が確定する。メニュー編集画面へ移動を行うと図 20 の○ テキストエリアにメニュー名、提供価格、必要時間を1メニュー1行で入力し、送 4 -9が表示され、編集が確定する。注意事 信ボタンを押す。押した場合、図 20 の○ 4 -10 が表示される。中央のテキストエリアに入 項編集画面へ移動を行うと図 20 の○ 4 -11 が表示され、編集が確定 力を行い、送信ボタンを押す。押した場合、図 20 の○ する。 18 1 ○ 3 ○ 2 ○ 2 -1 ○ 4 ○ 4 -1 ○ 4 -2 ○ 3 -1 ○ 3 -2 ○ 2 -2 ○ 3 -3 ○ 4 -3 ○ 2 -3 ○ 4 -4 ○ 4 -5 ○ 4 -6 ○ 4 -7 ○ 4 -8 ○ 4 -9 ○ 4 -10 ○ 4 -11 ○ 図 20 予約システム画面操作例 第7節 システム設計図 本システムは初期アクセス時の画面を基に、遷移先の画面で予約、予約キャンセル 等を行うシステムである。初期画面には管理者が予約管理等を行う管理者用画面への 移動リンクもある。予約画面は初期画面から遷移し、予約に関するデータを入力する。 入力内容は確認画面を通し、問題がなければ予約内容を出力する。予約キャンセルは 19 最初に予約者の名前を検索し、その結果を予約データ一覧画面に出力する。以下に、 このシステムの画面遷移図と該当画面を構成する主要サブルーチンを示す(図 21 参照)。 1 ○ 4 ○ 4 -1 ○ 初期画面 2 ○ 2 -1 ○ 管理者システム入室画面 4 -2 ○ nailist_list dsp_yoyaku dsp_cal menu notice 予約データ入力画面 form 管理者システム初期画面 nailist_list dsp_yoyaku dsp_cal change_disp 2 -2 ○ menu time1 check 2 -3 ○ 予約管理画面 4 -4 ○ 予約データ一覧画面 予約データ検索画面 3 -2 ○ 予約データ一覧画面 予約データ確認画面 4 -3 ○ 3 ○ 3 -1 ○ 予約完了画面 searchDB 3 -3 ○ 予約データ削除画面 delete menu_time1 check updateDB sendmail usersendmail 予約データ削除画面 4 -5 ○ 注意事項編集画面 注意事項変更完了画面 コース編集画面 コース変更完了画面 メニュー編集画面 メニュー変更完了画面 図 21 予約システム画面遷移図 第8節 詳細設計 本システムは Linux サーバー又は Windows サーバー上に、 Eclipse 等で作成した CGI プログラムを実行する。CGI プログラムには Perl を使用し、ブラウザには HTML と して出力する。システムの紹介には該当画面と該当画面を構成するファイルのコード を示すが、コード行数が長いため、主となる部分の一部を抜粋し、紹介する。 20 第1項 データベースへの接続 各種 cgi ファイルの sub setDB (図 21 参照) 本システムは予約データの保存等にデータベースを使用する。データベースは本 1 参 システムの各画面から接続を行い、クエリの発行、結果の取得を行う(図 22 の○ 照)。データベースへのアクセスはPerlモジュールであるDBIモジュールを使用する。 1 で、モジュールの使用宣言、use DBIと記述する。次に、DBIを使用した 図 22 の○ 2 で、接続するデータベースへのパ データベースへの接続方法を説明する。図 22 の○ 3 では、 ス、ユーザー名、パスワードを記述した外部ファイルを用意する。図 22 の○ 用意した外部ファイルにopen関数を使用し、ファイルの内容を$fhに格納する。図 22 4 で、ループを用いてファイルの中身を 1 行単位で取り出す。取り出したデータ の○ を正規表現で比較し、データベースへのパス、ユーザー名、パスワードを各変数に 格納する。 1 ○ 2 ○ 3 ○ 4 ○ xxxx use DBI; $base = './schedata'; $dbfile="$base/dbpass.txt"; xxxx sub setDB{ my $file = $dbfile; open( my $fh, "<", $file )or die "Cannot open $file: $!"; while( my $line = readline $fh ){chomp $line; if (index($line,"#",0) eq 0){}else{@str=split(/ | /, $line); if(@str[0] eq "user"){$user =@str[2]; }elsif(@str[0] eq "pass"){$pass =@str[2]; }elsif(@str[0] eq "DBI"){$DBI =@str[2];} xxxx 図 22 データベース接続情報取得 変数に格納されたデータベースへのパス、ユーザー名、パスワードを使用し、デ ータベースハンドルオブジェクトを作成する(図 23 参照)。 $db = DBI->connect($DBI,$user,$pass,{mysql_enable_utf8=> 1, RaiseError => 1}); 図 23 データベースハンドルオブジェクトの作成 本項で作成したデータベースハンドルオブジェクトを利用し、各画面で SQL 文を 実行する。 第2項 1 の処理) 予約状況表示初期画面 sche38.cgi(図 21 の○ 表示されているレイアウトは HTML でプログラムされている(図 24 参照)。初期 アクセス時に表示されるスケジュールは本ファイルのアクセス時に現在日時の取得 を行い、その日時を基に表示する。画面を構成する要素にサブルーチンがあり、カ レンダーとスケジュールはサブルーチンにより作成される。本画面を構成している サブルーチンの読み込みには外部ファイルを利用している。以下に、サブルーチン と外部ファイルの関連を示す(図 25 参照)。 21 初期画面 schedata nailist_list nailist.txt setDB dbpass.txt notice notice.txt menu header menu.txt style.css 図 24 初期アクセス画面 図 25 サブルーチンと外部ファイルの関連 (1)コースの種類数取得 sub nailist_list 1 の部分により、コースの種類数は外部ファイルであるnailist.txtから 図 26 の○ 2 の部分で、perlのファイル操作を行う関数 変数$nailistfileに読み込む。図 26 の○ である、open関数を利用する。今回はopen関数を読み込み専用のモードにて使用 する。読み込まれたファイルは$fhに格納される。次に、図 26 の部分のwhile文に より元ファイルの 1 行毎に配列@nailist_nameに格納する。 1 ○ 2 ○ 3 ○ xxxx $nailistfile="$base/nailist.txt"; xxxx sub nailist_list{ my $file = $nailistfile; open( my $fh, "<", $file )or die "Cannot open $file: $!"; $cnt=0; while( my $line = readline $fh ){ chomp $line; @nailist_name[$cnt]= $line;$cnt++;} xxxx 図 26 コースの種類数取得 (2)予約スケジュール表示 sub dsp_yoyaku dsp_yoyakuでは初期アクセス時には当日のスケジュールを生成する。予約状況 はサブルーチンyoyakuDBにより取得する。テーブルyoyakuのyear、month、day が予約の年、月、日に該当しており、表示日の年、月、日のデータと一致するレ 1 の部分でSQL文を作成し、データベースハンドルオ コードを取得する。図 27 の○ 2 の部分で、格納 ブジェクトと共に文ハンドルオブジェクトに格納する。図 27 の○ された文ハンドルオブジェクトがexecuteと書く命令によって実行される。実行さ 3 の部分 れた結果はfetch arrayを使用し、配列に格納する。格納の方法は図 27 の○ にあるwhileにより、1 レコード毎に必要な情報を配列に格納する。 22 1 ○ 2 ○ 3 ○ sub yoyakuDB{ $sth = $db->prepare( "select * from yoyaku where year = $year1 and month = $month1 and day = $day1 ORDER BY year, month , day , stime" ); $sth->execute;$cnt=0; while( @row = $sth->fetchrow_array ){ @stime_zumi[$cnt]= @row[5]; @etime_zumi[$cnt]= @row[6]; @nailist_zumi[$cnt]=@row[10]; $cnt++; }$db->disconnect;} 図 27 予約情報取得 1 の部分で格納された予約情報と、当日の時間を比較する。図 28 の○ 2 図 28 の○ の部分で、予約中の時間であればスケジュールに×を、予約時間でなければスケ ジュールに○を表記する。 sub dsp_yoyaku { xxxx for ($yy=0; $yy < scalar(@stime_zumi); $yy++){ 1 if(@nailist_zumi[$yy] eq $nalistname){ ○ if(@stime_zumi[$yy] eq @hour[$jikan]){$mark='×';} 2 ○ elsif(@etime_zumi[$yy] eq @hour[$jikan] ){mark='○';}}} xxxx 図 28 スケジュール表記 (3)メニュー表示 sub menu 1 の部分で格納されたメニュー情報を図 29 の○ 2 のopen関数で変数に 図 29 の○ 3 の正規表現で、メニュー名、時間、金額 格納する。格納したファイルを図 29 の○ 4 で格納された配列を各項目ごとに出力する。 に分け、配列に格納する。図 29 の○ sub menu{ xxxx 1 ○ 2 ○ 3 ○ 4 ○ xxxx my $file = $menufile; open( my $fh, "<", $file )or die "Cannot open $file: $!"; while( my $line = readline $fh ){ chomp $line; # $line=~ tr/ //s; @str=split(/ /, $line); print " <tr>"; print "<td> @str[0]<td>"; print "<td> @str[1]<td>"; print "<td> @str[2]<td>"; print " </tr>";} 図 29 メニュー表示 (4)注意事項表示 sub notice 1 の部分で格納された注意事項の記されたファイル情報を図 30 の○ 2 の 図 30 の○ 3 の部分で行数分ルー open関数で変数に格納する。格納したファイルを図 30 の○ プを行い、1 行ごとにHTMLに出力する。 23 sub notice{ xxxx 1 ○ 2 ○ 3 ○ xxxx my $file = $noticefile; open( my $fh, "<", $file )or die "Cannot open $file: $!"; while( my $line = readline $fh ){ chomp $line; print $line, "<br>"; } 図 30 注意事項表示 第3項 2 の処理) 予約関連画面説明(図 21 の○ 本項では予約を行う際に使用する予約データ入力画面、予約データ確認画面、予 約完了画面について説明する(図 31 参照)。 図 31 予約関連画面 2 -1の処理) (1)予約データ入力画面 yoyaku_form_checkbox.cgi(図 21 の○ 予約データ入力画面へスケジュールから移動する際、予約を予定している年、 月、日と予約開始時間、コースの種類のデータもURLに付加して遷移する。予約 画面はフォームになっており、名前、連絡先、備考の入力と希望するメニューを 1 の部 選択する。表示するメニューの取得は外部ファイルから取得する。図 32 の○ 2 のopen関数で変数に格納する。格 分で外部ファイルのメニュー情報を図 32 の○ 3 の部分で配列に1メニュー1要素として格納 納されたメニュー情報は図 32 の○ される。 格納されたメニューはサブルーチンform内で、フォーム作成時にループを用い 4 の部分では、メニューが格納された配列の要素数分、ルー て表示する。図 32 の○ プを行い、内部でメニューの生成を行う。複数の選択を可能にするため、1メニ ュー毎にチェックボックスの属性を付与し、生成する。フォームで入力された情 報は予約データ確認画面へと送信される。 24 1 ○ 2 ○ 3 ○ 4 ○ xxxx my $file = $menufile; $i=0; open( my $fh, "<", $file )or die "Cannot open $file: $!"; while( my $line = readline $fh ){ chomp $line; @menudata[$i] = $line; xxxx sub form{ xxxx for($xx=0; $xx< scalar(@menudata);$xx++){ print"<INPUT TYPE=¥"checkbox¥" NAME=¥"menu_data¥" value=¥"$menudata[$xx]¥">$menudata[$xx] <br>"; xxxx 図 32 メニュー取得と表示 2 -2の処理) (2)予約データ確認画面 yoyaku_check.cgi(図 21 の○ 1 の部分で前画 予約データ確認画面では、入力された情報を出力する。図 33 の○ 面から送信されたメニュー情報から、所要時間を正規表現で抜き出し、選択され 2 の部分では同様に何分 たメニューの個数分、配列に時間数を格納する。図 33 の○ 3 の部分で変数$jiに何時間必 必要かを抜き出し、配列に格納する。次に図 33 の○ 4 の部分で 要か、格納された配列要素分のループを用いて入力する。次に図 33 の○ 格納された分数を合計し、変数$funに格納する。合計された結果、60 分を超えて いた場合は$jiの値を 1 増やし、$funの値を 60 減らす。この処理の結果、$jiには 必要な合計時間数が、$funには必要な合計分数が格納される。 1 ○ 2 ○ 3 ○ 4 ○ sub menu_time1{ xxxx for ($y=0; $y<length($menu_str); $y++){ $position = index($menu_str,'時間',$y); if($position ne -1){ @jikan_list[$j_cnt]=substr($menu_str,$position-1,1); $j_cnt++; $y=$position;}} for ($y=0; $y<length($menu_str); $y++){ $position = index($menu_str,'分',$y); if($position ne -1){ @fun_list[$f_cnt]=substr($menu_str,$position-2,2); $f_cnt++; $y=$position;}} $ji=0; for($x=0; $x<scalar(@jikan_list); $x++){ $ji= $ji+@jikan_list[$x];} $fun=0; for($x=0; $x<scalar(@fun_list); $x++){ $fun = $fun+@fun_list[$x]; if($fun >= 60){ $ji++; $fun= $fun-60;}} xxxx 図 33 合計時間計算 次に、合計された時間を、設定した予約単位時間で割り、確保すべき時間の個 1 で、1時間を予 数を算出する。今回は時間の単位を 30 分としている。図 34 の○ 2 の部分で$funが必要時間数を 約単位時間に変換できるように算出する。図 34 の○ 25 3 超えているか確認する。超えていた場合は必要時間単位の値を増やす。図 34 の○ の部分で、分数の端数があった場合は切り上げ、必要時間数の値を増やす。 1 ○ 2 ○ 3 ○ xxxx $all_yoyaku_jikan = $ji*2; for(;;){ if($fun > 30){ $all_yoyaku_jikan++; $fun -=30; }elsif ($fun >0){ $all_yoyaku_jikan++; last; }else{ last; } xxxx 図 34 必要時間数計算 次に、予約予定の終了時間が営業時間内に終了しているかのチェックをサブル 1 で予約開始時刻に必要予定時間数を加算し、終了 ーチンcheckで行う。図 35 の○ 予定時刻までの空き時間数よりも小さいかを計算する。終了予定時刻がオーバー 2 で予約の再入力を求める文章を表示する。時間に問題が していた場合、図 35 の○ なかった場合は既に入っている予約と時間が重なっていないか計算する。現在の 3 の部分の処理でデータベースより取得する。図 35 の○ 4 で、 予約情報は図 35 の○ 取得したデータの開始時間から終了時間までの間に、予約の時間が重なっていた 場合再入力を求める文章を表示する。 1 ○ 2 ○ 3 ○ 4 ○ sub check{ xxxx for($x=1; $x< scalar(@hour); $x++){ if ($yoyaku_time eq @hour[$x]){ for($y=0; $y< $jikan; $y++){ @yoyaku_jikan[$y]=@hour[$x+$y]; if($x+$y > (scalar(@hour)-1)){ $timeover=1; }} }} if($timeover eq 1){ xxxx return; } xxxx $sth = $db->prepare( "select * from yoyaku where year = ¥'$yoyaku_year¥' and month = ¥'$yoyaku_month¥' and day = ¥'$yoyaku_day¥' and nailist = ¥'$yoyaku_nailist¥'"); xxxx while( @row = $sth->fetchrow_array ){ $stime_zumi= @row[5]; for($x=1; $x< scalar(@hour); $x++){ if ($stime_zumi eq @hour[$x]){ for($y=0; $y< scalar(@yoyaku_jikan); $y++){ if (@hour[$x] eq @yoyaku_jikan[$y]){ xxxx } xxxx 図 35 時間チェック 26 2 -3の処理) (3)予約完了画面 yoyakuin.cgi(図 21 の○ 予約データ確認画面で問題がなく、確定ボタンが押された場合でも、確認画面 表示中に予約されていないかの確認を行うため、再度予約時間のチェックを行う。 チェック方法は(2)と同様である。問題がない場合は、データベースに登録を行う。 登録の際、文字コードの変換を行うため、外部モジュールであるEncodeの使用を 1 で宣言する。図 36 の○ 2 では入力されたデータをデータベースに設定し 図 36 の○ 3 の処理でINSERTを用いてSQL文 ている文字コードutf-8 に変換する。図 36 の○ を作成、実行し、データベースへ登録する。 1 ○ 2 ○ 3 ○ xxxx use Encode; xxxx sub updateDB{ xxxx $yoyaku_name2 = Encode::decode_utf8($yoyaku_name); $yoyaku_name2 =~ s/¥s//g; $yoyaku_menu2 = Encode::decode_utf8($yoyaku_menu); $yoyaku_mail2 = Encode::decode_utf8($yoyaku_mail); $yoyaku_message2 = Encode::decode_utf8($yoyaku_message); $yoyaku_nailist2 = Encode::decode_utf8($yoyaku_nailist); xxxx $sth = $db->prepare( "INSERT INTO yoyaku ( name, year, month, day, stime, etime, menu, email, message,nailist)VALUES(¥'$yoyaku_name2¥',¥'$yoyaku_year¥',¥'$yoyaku_month¥' ,¥'$yoyaku_day¥',¥'$yoyaku_time¥',¥'$yoyaku_etime¥',¥'$yoyaku_menu2¥',¥'$yoyaku_mail 2¥',¥'$yoyaku_message2¥',¥'$yoyaku_nailist2¥')"); xxxx 図 36 予約データのデータベース登録 登録と同時にsendmailによりメール送信を行う。送信先はシステム管理者に予 約の連絡と、予約者の入力したメールアドレス宛に予約確認を送信する。システ 1 の部分により、 外部ファイルより読み込む。 ム管理者のメールアドレスは図 37 の○ 2 では、$sendmailに使用するサーバーのsendmailへのパスを格納する。 図 37 の○ 3 では$fromに送信者名、$toに送信先アドレス、$subjectに件名、$msg 図 37 の○ に本文を格納する。本システムでは入力を簡単にするため、本文はヒアドキュメ 4 の部分では、open関数を使用し、送信する。 ントとして入力している。図 37 の○ 使用する際にオプションとして-tと-iを追加する。これにより、メールのヘッダ部 5 の部分でsendmailコマンドに 1 行毎に送信を の指定等が有効になる。図 37 の○ 行う。送信時、一部の個所で文字エンコードを行い、メールヘッダ部と本文部の 6 で予約者にも同様のメールを送信する。 文字化けを防ぐ。図 37 の○ 27 1 ○ 2 ○ 3 ○ 4 ○ 5 ○ 6 ○ sub sendmail{ my $file = $emailfile; open( my $fh, "<", $file )or die "Cannot open $file: $!"; while( my $line = readline $fh ){ chomp $line; $email_address=$line;} xxxx $sendmail = '/usr/sbin/sendmail'; my $from = 'ReserveSystem'; my $to = $email_address; my $subject = 'Esthe Reservation'; my $msg = <<"EOD"; xxxx EOD open(SDML,"| $sendmail -t -i") || die; print SDML "From: $from¥n"; print SDML "To: $to¥n"; print SDML "Cc: $cc¥n"; print SDML "Subject: $subject¥n"; print SDML "Content-Transfer-Encoding: 7bit¥n"; print SDML "Content-Type: text/plain charset=UT F-8;¥n¥n"; print SDML "$msg"; close(SDML); } sub usersendmail{ xxxx } 図 37 予約完了時のメールアドレス送信 第4項 3 の処理) 予約キャンセル関連画面説明(図 21 の○ 次に、予約キャンセルシステムの説明を行う。予約キャンセルはスケジュール画 面の下部にあるリンク先で行う。 3 -1の処理) (1)予約データ検索画面 cancel_form.cgi(図 21 の○ 予約キャンセル画面に入ると、名前の入力フォームが画面に出る。その入力フ ォームに名前を入力し、検索ボタンを押す(図 38 参照)。 検索を行う 図 38 予約検索画面 3 -2の処理) (2)検索結果出力画面 cancel.cgi(図 21 の○ 予約名検索フォームより送信されたデータをもとにデータベースに問い合わせ 1 の部分で、データベースへ問い合わせを行う。select文を使用 を行う。図 39 の○ 2 の部分で検索結果を1レコード毎 し、予約名と部分一致の検索を行う。図 39 の○ 3 の部分の変数$cntが 1 以上 に各配列に格納する。予約が存在する場合は図 39 の○ になる。 28 1 ○ 2 ○ 3 ○ sub searchDB{ xxxx $sth = $db->prepare( "select * from yoyaku where name like ¥'%$yoyaku_name%¥' order by year ASC, month ASC, day ASC, stime ASC" ); $sth->execute; $cnt=0; while( @row = $sth->fetchrow_array ){ @name_zumi[$cnt]=@row[1]; @year_zumi[$cnt]=@row[2]; @month_zumi[$cnt]=@row[3]; @day_zumi[$cnt]=@row[4]; @stime_zumi[$cnt]= @row[5]; @menu_zumi[$cnt]=@row[7]; @nailist_zumi[$cnt]=@row[10]; $cnt++; } xxxx 図 39 予約情報のデータベース問い合わせ 1 の比較により、予約情報が存在しない場合は、再検索を求める画面を 図 40 の○ 2 の部分で現在日時を取得し、予約日時と比較する。現在日時 表示する。図 40 の○ 3 の処理により、出力時には取得したデー 以降のデータのみを出力する。図 40 の○ タを配列番号が同じ数値のデータを横並びに出力する。その場合、データベース から取得したレコードと同じものになる。出力データはチェックボックスの属性 を付与し、フォームの情報として出力される。 1 ○ 2 ○ 3 ○ xxxx if($cnt ==0 or length($yoyaku_name) == 0){xxxx }else{xxxx for ($x=0; $x <$cnt; $x++){ $check_name = 'check' . $x; $monthzumi = sprintf("%02d",@month_zumi[$x] ); $dayzumi = sprintf("%02d",@day_zumi[$x] ); $zumitime=@year_zumi[$x].$monthzumi.$dayzumi + 0; if($zumitime>=$now){ $y = ture; print "<INPUT TYPE=¥"checkbox¥" NAME=$check_name VALUE=¥"@year_zumi[$x] | @month_zumi[$x] | @day_zumi[$x] | @stime_zumi[$x] | @menu_zumi[$x] | @nailist_zumi[$x] | @name_zumi[$x]¥"> @name_zumi[$x] . @year_zumi[$x] . @month_zumi[$x] . @day_zumi[$x] @stime_zumi[$x] @menu_zumi[$x] Nailist: @nailist_zumi[$x]<br>"; xxxx 図 40 予約情報のデータベース問い合わせ 3 -3の処理) (3)データベースからの情報削除 deleteDB.cgi (図 21 の○ 1 (2)より、送信された情報を取得し、データベースから削除を行う。図 41 の○ の部分でSQL文を作成する。SQL文の内容はdelete文となっており、送信されたデ ータの検索を行い、一致したデータはデータベースより削除される。キャンセル が行われた場合、システム管理者にキャンセルが行われたことを連絡するメール 2 の部分で送信する。 を図 41 の○ 29 1 ○ 2 ○ sub delete{ xxxx for ($x=0; $x<scalar(@c_line); $x++){ if(@c_line[$x] ne ''){ @str=split(/ | /,@c_line[$x]); $sth = $db->prepare( "delete from yoyaku where year = ¥'@str[0]¥' and month = ¥'@str[2]¥' and day = ¥'@str[4]¥' and stime = ¥'@str[6]¥' and menu = ¥'@str[8]¥' and nailist = ¥'@str[10]¥'" ); $sth->execute; xxxx sub sendmail{ xxxx 図 41 データベースからの削除と連絡 第5項 4 の処理) システム管理者使用画面(図 21 の○ 4 -1の処理) (1)管理者画面入室用画面 adminpassword.cgi(図 21 の○ 管理者画面には画面下部の管理者用と書かれたリンクから入る。リンクの先に はフォームがあり、パスワードを入力するようになっている。入室用パスワード 1 の部分で正規表現を用い はプログラム内変数$PASSWOEDに格納し、図 42 の○ て入力文字と正しいパスワードの比較をする。正しい場合は、管理者用画面への リンクを表示する。 1 ○ xxxx if($FORM{'pass'} eq $PASSWORD) { xxxx }else { xxxx } xxxx 図 42 入室パスワード比較 4 -2の処理) (2)管理者初期表示画面 admin.cgi(図 21 の○ 管理者画面でも、基本的な部分では利用者と同じようにカレンダーとスケジュ ールが表示される。予約のキャンセルを行う管理画面、コース編集画面、メニュ ー編集画面、注意事項編集画面への移動リンクがある部分が利用者画面との大き な違いである(図 43 参照)。 図 43 管理者画面 30 スケジュールの部分のリンクが利用者画面と異なっており、予約が入っている 場合は予約と表示される。予約がない場合は○のリンクが表示される。予約の有 無はデータベースへselect文で問い合わせる。利用者初期画面の×の表記を予約と 1 の部分の処理によ 変更している。○のリンクはクリックを行った場合、図 44 の○ り、該当時間帯に予約と同様のINSERT文が挿入される。管理者画面から挿入され る場合は、メニュー「休憩」としてデータベースへ登録される。休憩を取り消す 2 の部分の処理により、デー 場合は×リンクをクリックすることにより、図 44 の○ タベースへdelete文が送信され、該当時刻の休憩が削除される。全日不可リンクは、 3 の処理により、表示日の全日に休憩を挿入する。全日不可は予約がある 図 44 の○ 4 の処理で行う予約の有無の確認方法は、全日不 場合は予約ができない。図 44 の○ 可ボタンを押された場合に該当日の予約名部分のデータを休憩入力時に使用する 予約名’admin’以外で検索する。予約が存在する場合は変数$cntの値が1以上にな 5 の比較処理により、$cntの値が 1 以上の場合は予約があるため、全 る。図 44 の○ 日不可にできなくなる。 1 ○ 2 ○ 3 ○ 4 ○ 5 ○ xxxx if($mode1 eq 'no'){ xxxx }elsif ($mode1 eq 'OK'){ xxxx }elsif ($mode1 eq 'all'){ xxxx while( @row = $sth->fetchrow_array ){ @yoyaku_name[$cnt]= @row[1]; if(@yoyaku_name[$cnt] ne 'admin'){$cc++;} $cnt++; } if($cc <= 0){ xxxx }else{ $error_message="すでに予約があるので全日予約不可にはできません."; } xxxx 図 44 予約許可の登録 4 -3の処理) (3)予約管理画面 admincancel_form.cgi(図 21 の○ 予約キャンセル画面に入ると、名前の入力フォームが画面に出る。その入力フ ォームに名前を入力し、検索ボタンを押す(図 45 参照)。 図 45 予約管理画面 4 -4の処理) (4)予約データ一覧画面 admincancel_form.cgi(図 21 の○ 予約データ一覧画面では、日付を指定し、出てきた日付の予約の取り消しを行 うことができる。予約の検出方法は、フォームに入力した日付を基にselect文でデ ータベースへ問い合わせを行い、結果を配列に格納する。入力された数値がなけ 31 1 の部分の処理が行われ、当日以降の予約をすべて表示する。年のみ れば図 46 の○ 2 の部分の処理が行われ、入力された年を、月ま が入力されている場合は図 46 の○ 3 の部分の処理が行われ、 入力された月を表示する。 でが入力された場合は図 46 の○ 1 ○ 2 ○ 3 ○ xxxx sub searchDB{ xxxx if ($year1 ne "" and $month1 eq "" and $day1 eq ""){ $sth = $db->prepare( "select * from yoyaku where year = $year1 order by year ASC, month ASC, day ASC, stime ASC" ); }elsif ($year1 ne "" and $month1 ne "" and $day1 eq ""){ $sth = $db->prepare( "select * from yoyaku where year = $year1 and month = $month1 order by year ASC, month ASC, day ASC, stime ASC"); }elsif ($year1 eq "" and $month1 eq "" and $day1 eq ""){ $sth = $db->prepare( "select * from yoyaku where (year > $nowyear) or (year = $nowyear and month > $nowmonth ) or (year = $nowyear and month = $nowmonth and day >= $nowday) order by year ASC, month ASC, day ASC, stime ASC"); } xxxx 図 46 予約データの問い合わせ 出力された情報は、第4項と同じく配列番号が同じものが横に並べられ、登録 されているレコードと同じ形で表示される。削除方法も第4項(3)と同じくデータ ベースへ delete 文を送信し、削除を行う。 4 -4の処理) (5)外部ファイルの編集(図 21 の○ 本システムの表示項目は外部テキストファイルから呼び出されたものが多く存 在している。コース編集、メニュー編集、注意事項編集の部分である。その3項 目はテキストファイルを外部から読み込み、外部へ同じ形でテキストファイルと して保存する。このように、挙動がほぼ同じであるため、ここでまとめて説明す る(図 47 参照)。 nailca.cgi noteca.cgi nailnew.cgi notenew.cgi menuca.cgi menunew.cgi 図 47 表記編集画面 外部テキストファイルからの読み込みはopen関数を使用し、1行毎に配列の1 要素に格納する。格納された変数を、フォーム要素をtextareaで指定し、その内部 1 の処理で、要素数のループを行い、1要素1行で表 に格納したデータを図 48 の○ 示する。管理者が追加、削除を行う場合はtextarea内のテキストを編集し、送信を 行う。 32 1 ○ xxxx print"<textarea name=¥"menu¥" rows=¥"$length¥" cols=¥"50¥">"; foreach my $name (@menu){ print "$name"; } print"</textarea>"; xxxx 図 48 テキストエリアデータ出力部 送信された情報はopen関数を利用し、同名の外部ファイルへ書き込みを行う。 外部から取得したデータを一度変数に格納し、タグや、文字コードに合わない改 1 の処理で、正規表現で検索し、存在した場合は消去する。図 行がないか図 49 の○ 2 の処理で、ファイルへの書き込みを行う。モードは「>」と指定する。 「>」 49 の○ モードは、古いファイルがあった場合は一度消去し、新たに入力するモードであ る。 1 ○ 2 ○ xxxx $newdate = $date ->param('menu'); $newdate =~ s/¥r¥n/¥n/g; $newdate =~ s/¥r/¥n/g; open( DATAFILE, ">", $menufile )or die "Cannot open $file: $!"; print DATAFILE $newdate; close DATAFILE; xxxx 図 49 編集データのファイル出力部 33 第4章 考察 本システムは、実際にあるネイルサロン店に導入して頂いたが、とくに大きな不具合も なく動作しているので、本システムのさらなる拡張性を考え、汎用パッケージ化について 考察する。 今回パッケージ化に向けて行ったことは、従来、メニューやネイリストといった関連デ ータはデータベース化し、テーブルで管理するのだが、本システムはテキストデータとし て外部から読み込むようにした。メニュー表示の場合、menu.txt とテキストファイル化し ている(図 50 参照)。この menu.txt の呼び出しは第3章第7節第2項(3)を参照。 図 50 データベースのテキスト化 同様に、ネイリスト及び注意事項もテキスト化し、schedata フォルダに格納している(図 51 参照)。 図 51 schedata フォルダの内容 このように、SQL 文を打ち込まなくてもテキストとして容易に追加・編集が可能となって いる。実際に、他の店舗の予約システム導入から依頼された場合、その店舗に対するシス テムの変更を行う必要がある。主に変更の必要が考えられる部分として、予約単位時間の 変更、定休日、予約期限、予約キャンセル期限の設定がある。 (1)予約単位時間の変更 1 等で使われている時間単位の表記の変更及び、 予約単位時間の変更は、図 20 の○ 図 34 の1時間に対する予約時間単位は何個になるかの変更が必要になる。 34 (2)定休日の変更 1 内にあるsub dsp_calのリンク付き日付を作成して 定休日の変更は、図 20 の○ いる部分で、特定の曜日のリンク作成を不可にすることにより、特定曜日へのア クセスを防ぐ。定休日の曜日に接続された場合は、スケジュール表示を行わない ことにより、予約を防ぐ。 (3)予約期限の設定 1 にアクセス時、 現在日時と表示日時の比較を行い、 予約期限の設定は、図 20 の○ 期限内でなければ表示を行わない処理を追加することにより、実現できる。 (4)予約キャンセル期限の設定 予約キャンセル期限の設定は、図 20 の③-2の表示部分に、現在日時と検索結 果の日時を比較し、期限外の予約を表示しないように変更を行うことによって、 実現できる。 35 第5章 第1節 まとめ 全体のまとめ 情報機器が流通している現在、Web ページへのアクセスは容易であり、EC ショップ を展開する企業が増えてきた。しかし、動的 Web ページの作成依頼はコストが非常に かかり、小規模店舗などには導入しづらい問題がある。そこで我々は、こういった小 規模店舗向けに予約システムを無償で提供し、汎用パッケージ化を目指した。 本システムの内容は、総合開発環境ソフトウェアである Eclipse を使用し、CGI(Perl)、 MySQL を用いて動的 Web ページを構築した。また、パッケージ化を目指すにあたり、 従来メニューや担当者などのデータはデータベースにてテーブルとして扱うが、管理 者側が容易に編集できるように、外部ファイルとしてテキスト化を行い、直接変更可 能とした。利用例としては、レンタルサーバを利用することで、自店舗にサーバーを 立ち上げる必要がなく本システムを導入することができ、容易に複数店舗への展開も 可能になった。実際にあるネイルサロン店にさくらレンタルサーバを利用し導入して 頂いたが、目立った問題もなく動作している実績がある。 第2節 今後の課題 今後の課題としては、三つ上げる。 一つ目は、ソースコードのリファクタリングである。本システムは何度も試行錯誤 し模索しながら構築を行ったため、開発当初に設計した部分以外に追加されたモジュ ールも多く存在し、コード設計が崩れてしまっている。そのため、全く同じコードを 記述したサブルーチンが多くのファイルに存在している。第3章第8節第1項のデー タベース接続の部分や図 30 の注意事項の表示部分が特に多くのファイルで使われて いる。これらのサブルーチンを外部ファイルに package として作成し、各ファイルで package の読み込みを行い、使用することで同じコードを複数記述する無駄を省くこ とができる。次に、第3章第8節第5項(5)の図 49 のファイル出力の部分だが、この 部分も外部ファイルに書き込む処理のみを行うファイルを各編集画面毎に用意してい る。このファイルも書き込む処理を行う1ファイルに変更し、アクセス元のファイル を判別し、どのファイルに書き込みを行うかを判断するようにするべきである。 二つ目は、本システムの展開に伴うチーム編成についてである。基本的には、本シ ステムの広報を行う営業チームと、システムの保守・運用を行う技術チームに分け展 開する。また、技術のサポートや、顧客からの技術的な質問に対応し、必要に応じて システムのカスタマイズや設計ができる人物を間に立てる。顧客・営業・技術との間 でいかに差異が生まれないかがソフトウェア開発をする際には重要な事なので、営業、 技術両方に精通する人物の育成を目指していくことも今後の課題である。 36 三つ目として、店舗導入の際のサポート体制をあげる。本システムを店舗導入の際 には、運用状況に合わせて相談しつつ導入していく。導入後には店舗に訪問し、スタ ッフに基本的な操作の説明を行い、はじめての操作に伴う不安を解消する。また、電 話やメールなどの相談にも対応し、スムーズに本システムを利用して頂けるような環 境作りを確立させるのが今後の課題となる。 37 参考文献 [1]Robin Nixon(ロビン・ニクソン):PHP、MySQL、JavaScript&CSS, 株式会社オライ リー・ジャパン, 2013. [2] e-Words http://e-words.jp/w/HTML.html [3] The Perl Programming Language http://www.perl.org/cpan.html [4]Perl リファレンス http://www2u.biglobe.ne.jp/MAS/perl/ref/ [5] kwsktr's study log http://kwsktr.hatenablog.com/entry/20110414/1302770853 [6]IT 用語辞典 BINARY http://www.sophia-it.com/content/%E3%83%87%E3%83%BC%E3%82%BF%E5%AE%9 A%E7%BE%A9%E8%A8%80%E8%AA%9E [7] MySQL http://dev.mysql.com/doc/refman/5.1/ja/what-is-mysql.html 謝辞 ゼミ長として、キャリアゼミリーダーとして皆をまとめてくれた近藤彪氏に感謝します。 FPS 等のゲームで一緒に遊び、楽しい時間を過ごせた石橋和也氏に感謝します。Iphone 用 アプリ作成といった新たな事に挑戦する姿が素敵な國重和章氏に感謝します。厳しい就職 活動を共に行い、折れない強さを学ばせていただいた塩田将平氏に感謝します。プロレス ラーの強さ、プロレスの面白さを語り合えた西岡和樹氏に感謝します。いつも元気な突っ 込みとポケモンの話で盛り上がった西田翔一氏に感謝します。野球についての鋭い観察眼 を持った意見を聞くことができた藤本健人氏に感謝します。音楽作成が素晴らしく、いつ もゼミ室を癒しの空間にしていただいた堀慶文氏に感謝します。アーチェリー部とゼミの 両方の活動を精力的に行い、文武両道を体現している松村和学氏に感謝します。失敗をし てしまった時に助けていただき、落ち込んでいる時に励ましていただいた松谷栄樹氏に感 謝します。ゼミ活動の分からない部分で様々なアドバイスをくださった仙田友久氏に感謝 します。授業中に色々なことを見逃していただいた福本昌生氏に感謝します。多忙にもか かわらず、多くの事で面倒を見てくださった尾花将輝氏に感謝します。最後に、ゼミ活動 で多々至らない点があり、多大なご迷惑をかけしたにもかかわらず、最後まで丁寧なご指 導をしていただいた花川典子教授に深く感謝します。 38 39 付録 SQL 文 SQL で記述された命令を SQL 文という。本項では主に、本システムで使用した SQL 文 を説明する。 (1)CREATE TABLE 文 リレーショナル型データベースではまず初めに表(テーブル)を定義する必要がある。 この表の定義を行うのが CREATE TABLE 文である。CREATE TABLE 文の基本記述 形式は以下のとおりである CREATE TABLE 表名( ←作成する表(テーブル)の名前 カラム名 a データ型, カラム名 b データ型, カラム名 c データ型, カラム名 n データ型 ) データ型の一例には次のようなものがある。 ・数値型 INT→最小値:-2147483648 最大値:2147483647 整数のみ ・文字列型 CHAR→文字の長さ:255 固定長 VARCHAR→文字の長さ:255 可変長 ・データ型 DATATIME→日付と時刻を格納 また、テーブルを定義することで主キー(PRIMARY KEY)の存在が大切になってくる。 主キーとは、あるレコードを一意に識別するためのもので複数のレコード間で重複しては ならない。主キーの設定は PRIMARY KEY(主キーとなるカラム名) で行う。 (2)SELECT 文 SELECT 文では、データの抽出(検索)、データを並べ替える(ソート)、計算や集計 を行うことができる。基本記述形式は以下のとおりである。 SELECT カラム名 1,カラム名 2,~← どのカラムを表示させるか(*で省略可) FROM 表名(テーブル名)← どの表(テーブル)から WHERE 句(抽出条件) ← どのような条件で 40 WHERE 句による抽出条件の指定には、比較演算子(=、<、>、≦、≧)を用いてある数値 と比較しての抽出や LIKE~%によって任意の0文字以上の文字列を抽出することが できる。また、ORDER BY 句を追記することで抽出したレコードをソートすることが できる。 (1) INSERT 文 INSERT 文は、表にフィールドを追加したい場合に使用する。基本記述形式は以下 のとおりである。 INSERT INTO 表名(カラム A,カラム B,~)←追加対象の表名とカラム名の指定 VALUES (値 A,値 B,~←追加するフィールドの各カラムの値 (2) DELERT 文 DELETE 文は、表のフィールドを削除するときに使用する。基本記述形式は以下 のとおりである。 DELETE FROM 表名(テーブル名)←削除対象となる表の名前 WHERE 抽出条件←どのような条件のデータを削除するのか WHERE 句を省略すると、すべてのフィールドを削除できる。 41