Comments
Description
Transcript
<平成 22 年度卒業論文> 卒業研究管理 WEB サイトの機能 に関する
<平成 22 年度卒業論文> 卒業研究管理 WEB サイトの機能 に関する改良 生命環境科学科 07G1011 小溝将之 目次 第1章 序論 1.1 背景・・・・・・・・・・・・・・・・・・・・・・・・・・・・4 1.2 現状の卒業研究管理サイト・・・・・・・・・・・・・・・・・・4 1.3 現状の卒業研究管理サイトの実行図・・・・・・・・・・・・・・5 1.4 卒研管理サイトのデータベース・・・・・・・・・・・・・・・・6 1.5 現状の卒業研究管理サイトの機能・・・・・・・・・・・・・・・7 1.6 目的・・・・・・・・・・・・・・・・・・・・・・・・・・・・10 第2章 プログラミング環境及び手法 2.1 使用している言語及びソフト 2.1_1 PHP・・・・・・・・・・・・・・・・・・・・・・・・・・11 2.1_2 HTML ・・・・・・・・・・・・・・・・・・・・・・・・・11 2.1_3 Apache ・・・・・・・・・・・・・・・・・・・・・・・・11 2.1_4 MySQL・・・・・・・・・・・・・・・・・・・・・・・・・12 2.1_5 JpGraph・・・・・・・・・・・・・・・・・・・・・・・・12 2.1_6 XAMPP・・・・・・・・・・・・・・・・・・・・・・・・・12 2.1_7 Emeditor・・・・・・・・・・・・・・・・・・・・・・・・12 2.1_8 phpMyAdmin・・・・・・・・・・・・・・・・・・・・・・・12 2.1_9 PEAR・・・・・・・・・・・・・・・・・・・・・・・・・・13 2.2 各種インストール作業 2.2_1 XAMPP のインストール・・・・・・・・・・・・・・・・・・14 2.2_2 JpGraph のインストール・・・・・・・・・・・・・・・・・15 2.2_3 PEAR のインストール ・・・・・・・・・・・・・・・・・・16 2.3 使用ソフトウェアのバージョン・・・・・・・・・・・・・・・・・16 2 第3章 改良経過と改良作業 3.1 3.2 3.3 3.4 3.5 3.6 卒研管理サイトの改良について・・・・・・・・・・・・・・・・17 改良画面・・・・・・・・・・・・・・・・・・・・・・・・・・18 改良後の実行図・・・・・・・・・・・・・・・・・・・・・・・19 個人在室時間比較グラフ・・・・・・・・・・・・・・・・・・・20 年間在室時間比較グラフ・・・・・・・・・・・・・・・・・・・23 過去の卒業研究論文閲覧・・・・・・・・・・・・・・・・・・・25 第4章 結果と今後の課題 4.1 結果・考察・・・・・・・・・・・・・・・・・・・・・・・・・27 4.2 今後の課題・・・・・・・・・・・・・・・・・・・・・・・・・27 謝辞 参考文献 付録 付録 1.1 付録 1.2 read01.php・・・・・・・・・・・・・・・・・・・・・・・・・30 read001php・・・・・・・・・・・・・・・・・・・・・・・・・32 付録 1.3 付録 1.4 main.php・・・・・・・・・・・・・・・・・・・・・・・・・・34 main.tpl・・・・・・・・・・・・・・・・・・・・・・・・・・43 3 第1章 序論 1.1 背景 パソコン、携帯電話やゲーム機などあらゆる電子機器を通して、ネットワークに繋がる ことにより、様々なサービスを受けることができるようになった。IT は私たちの生活 に必要不可欠となってきており、特に就職活動においてインターネット環境がないとエ ントリーすることさえできない。また、就職活動のサポートや過去の情報公開もこの優 れたインターネット環境を利用したものだ。さらに、本研究室で使用している卒業研究 管理サイトでは、学内の情報インフラを使用し、卒業研究に取り組む学生の作業記録な どの管理するサポートをしている。しかし、卒業研究管理サイトは使用できる機能が尐 なく、より学習環境を充実させる対策が必要となっている。 1.2 現状の卒業研究管理サイト 現状の卒業研究管理サイト(以下、卒研管理サイト)を図 1.2 に示す 本研究室では、学内 LAN を利用して卒研管理サイトを構築し、運営してきた。卒研管 理サイトは学生用と教員用がある。本研究の学生側の卒研管理サイトでは、利用者と同 じ研究室に所属する他の学生の在室時間の把握、作業記録、カレンダー機能、担当教員 からのメッセージ閲覧機能などの機能が使用できる。卒研管理サイトを利用することで 作業記録により年間計画の進度を把握することができ、実験結果などの記録もできる。 図 1.2 現状の卒研管理サイト 4 1.3 現状の卒研管理サイトの実行図 以下の図 1.3 を使用し、卒研管理サイトの構造を説明する。 卒研管理サイトにアクセスの際、最初に、卒業研究管理サイト(学生用)というログ イン画面(index.php)にアクセスする。ログイン画面で入力する必要があるユーザ ID とパスワードは大学の情報インフラで利用されている個人 ID とパスワードを使用する。 もし、卒研管理サイトのデータベースにユーザ ID やパスワードが登録されていない場 合、卒研管理サイトのデータベースに登録する画面(first.php)に移ることを勧められ る。卒研管理サイトのデータベースの登録画面に移動後、必要データを入力し登録デー タの確認画面(first1.php)に移る。その後、登録データ確定後に卒研管理サイトのメ インページ(main.php)に移動する。データベースにユーザ ID やパスワードが登録さ れている場合も直接メインページに移動することができる。メインページには、幾つか の条件分岐がある。条件分岐の内容は作業記録入力という項目を選択すると、メインペ ージの action0(作業記録を入力などができる)が表示され、過去の作業記録を選択す ると action1(過去に登録した作業記録を閲覧することができる)が表示され、過去の 在室時間を選択すると action2(過去の在室時間を日間・月間・年間で閲覧することが できる)が表示され、比較データを選択すると action3(ログインした月の在室時間を ログインした学生と同じ研究室に所属する学生の在室時間をランキング)が表示される。 メインページのログアウトボタン(logout.php)を選択すると退出となる。 action2・action3 で表示される在室時間はログアウト時間からログイン時間を引いた 時間を在室時間としている。ログイン時間は、最初に卒研管理サイトにログインした時 刻をログインした時刻に設定している。ログアウト時間は、帰宅前再度卒研管理サイト にアクセスし、ログアウトした時間をログアウト時間としている。また、当日の記録(ロ グイン時間を除く)は何度でも書き換えることができ、ログアウト時間は最後にログア ウトした時間が記録される。なお、登校時間にはログインしたが、帰宅時にログアウト し忘れた場合、所定の在室時間(10 分)がデータベースに登録される。 図 1.3 卒研管理サイトの実行図 5 1.4 卒研管理サイトのデータベース データベース内を phpMyAdmin で表示したものを図 1.4 に表示する。 卒研管理サイトに登録されているデータは MySQL 内のデータベースに保存される。卒 研管理サイトのデータベースは 6 つのテーブルに分けられている。テーブルの内容につ いて説明する。個人情報は userinfo、研究室情報は labinfo、作業記録や個人入退出記 録は workrecords、何度目のログインなのかを判別するのは loginrecords、教授からの 指示を登録するのは instruction が登録されている。 データベースの内容は主に卒研管理サイト上で編集することができるが、 phpMyAdmin でも編集することができるようになっている。 図 1.4 卒研管理サイトのデータベース 6 1.5 現状の卒研管理サイトの機能 卒研管理サイトの機能について説明する。教員からメッセージ機能(以下、メッセー ジ機能)では、教員からメッセージがある場合に表示され、メッセージがない場合無表 示になる。また、ログインした最初のページまたは作業記録入力を選択時に閲覧するこ とができる。また、作業記録入力を選択時、作業記録を入力することができるフォーム が表示される。作業記録入力を選択後に表示される WEB ページを、図 1.5_1 に示す。 図 1.5_1 作業記録選択時 過去の作業記録選択時は、月毎の過去の作業記録を閲覧することができる。過去の作業 記録選択時に表示される機能について図 1.5_2 に示す。 図 1.5_2 過去の作業記録 7 過去の在室時間選択時では、月毎の在室した日付と在室時間、入退出時刻を閲覧するこ とができる。過去の在室時間を図 1.5_3 に示す。 図 1.5_3 過去の在室時間 比較データを選択時は、ログインした学生と同じ研究室に所属する学生をランキング表 示される。ランキングには反映されないが、表示項目には登校日数、作業記録登録回数 が表示されている。比較データを選択時に表示される機能を図 1.5_4 に示す。 図 1.5_4 比較データ 8 このように項目を選択時に使用できる機能以外に、カレンダーや出席状況把握などがあ る。カレンダーは、卒研管理サイトの左上に常時表示される。カレンダーの日付を選択 するとその月の過去の作業記録、過去の在室時間、比較データ項目のデータを閲覧する ことができるようになる。出席状況では、卒研管理サイトにログインした学生と同じ研 究室に所属する学生の出席状況を把握することができる。カレンダー機能を図 1.5_5、 同じ研究室の出席状況を図 1.5_6 に示す。 図 1.5_5 カレンダー 図 1.5_6 9 同室学生状況 1.6 目的 卒研管理サイトを利用するメリットとして次の3つがあげられる。 ① 在室(在学)時間の定量的な把握・管理及びそれらの統計処理が可能にな る。 ② 学生の毎日の卒研業務が記録され、年間を通してその内容の把握が可能に なる。 ③ 学生に細かい指示を簡単に出すことができ、また、学生がそれを確実に目 にすることができる。 しかし、本卒研管理サイトは文字を主体としているため在室時間の把握が困難だった。 そこで在室時間などのデータ把握をより容易にするため、既存の表示をグラフ化して改 良するように試みた。さらに現状より学習環境充実を目標に過去の卒業研究論文閲覧と いう項目を新設した。具体的な改良項目を以下の3つに定めた。 ① ログインした当日から直近5日分の個人在室時間の比較グラフ ② 同じ研究室内の学生の年間在室時間比較グラフ ③ 過去の卒業研究論文閲覧機能 10 第2章 プログラミング環境及び手法 2.1 使用している言語及びソフト 既存の卒研管理サイトと同じ環境で構築し、改良するために以下のものを使用してい る。 2.1_1 PHP Web サーバで利用するオープンソースのスクリプト言語のことである。フォームに 入力されたデータを取得する、データベースにアクセスするなど HTML ではできない 動きのあるページを作成することが可能だ。拡張子は「php」であり、html などの拡 張子を使用すると Web サーバが HTML と判断してしまうため注意する必要がある。 1994 年秋、Rasmus Lerdort 氏が自分の歴書書ページの閲覧者を調べるために作っ た Peal スクリプトと C 言語で書き直し、HTML フォームを扱える動的ウェブアプリケ ーションに拡張子したが始まりとされている。その後、技術者によって非常に取り組み やすい新しい開発言語として発達した。 PHP は Web アプリケーション開発に特化した言語であり、文法が比較的容易で誰で も習得することができる。また、テキストページで手間がかからずデバックも簡単に行 えるといった特徴から多くの Web サーバで PHP を実装している。 下記に PHP の日本語マニュアルの URL を示す。 http://php.net/manual/ja/index.php 2.1_2 HTML HTML はウェブを記述するためのマークアップ言語だ。文書の論理構造や表示の仕方 などを記述することができる。W3C によって標準化が行われており、大半の Web ブラ ウザは標準で HTML 文書の解釈・表示が行える。HTML では、文書の一部を”<”、”>” で挟まれた「タグ」と呼ばれる特別な文字列で囲うことにより、文章の構造や装飾につ いての情報を文書に埋め込んで記述することができる。文書の一部として、画像や音声、 動画を埋め込んだり、他の文書へのハイパーリンクを設定したりすることができる。 2.1_3 Apache 世界中でもっとも使われている Web サーバソフトウェアであり、大規模な商用サイト から自宅サーバまで幅広く利用されている。開発は Apache ソフトウェア財団の Apache HTTP サーバプロジェクトで行われている。Apache ライセンスの下でソース コードが公開および配布されており、代表的なオープン・ソース・ソフトウェアの一つ である。単独でも動作する Web サーバとして利用することができるため、世界で最も 人気のある Web サーバとなっている。 11 2.1_4 MySQL オープン・ソース・ソフトウエアのリレーショナルデータベース管理システム。無償 で使用することができ、様々なデータベースソフトウェアで利用可能である。また、PHP との相性が良いためセットで用いられることが多い。 2.1_5 JpGraph Jpgraph とは、PHP で使用可能な高機能なグラフ生成用ライブラリだ。データベー スと連動させ動的にグラフを描画することができる。そして、20 種類以上のプロット 形式をサポートしているため、あらゆるグラフ生成を可能にしている。 2.1_6 XAMPP XAMPP とは、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケ ージとしてまとめたものだ。Apache(Web サーバ)、MySQL(SQL データベースサー バ)、PHP、Perl の 4 つの主要なソフトウェアと phpMyAdmin などの管理ツール、さ らに SQLite などいくつかの補助的なソフトウェアとライブラリモジュールが含まれて いる。 2.1_7 エディタソフト Emeditor 今回使用した Emeditor は多言語対応のタブ切り替え型テキストエディタ。windows でサポートされるすべての文字コードに対応しており、HTML や PHP などファイルの 種類に応じて見やすい色分け表示が可能。この他にエディタソフトはメモ帳などを使用す ることができる。 2.1_8 phpMyAdmin MySQL サーバーをウェブブラウザで管理するためのデータベース接続クライアント ツールで、PHP で実装されている。phpMyadmin を用いることで、SQL 文を記述す ることなく、MySQL のデータベースに対して様々な操作が行うことが出来るツールだ。 また、ユーザが任意の SQL 文を記述して実行することができる。 12 2.1_9 PEAR PEAR とは PHP で利用する事ができるライブラリを提供しているサービス。PEAR は通常 PHP4、PHP5 に最初に同梱されているがビルドオプションの指示などで、イン ストールしなかった場合でもあとからインストールすることができる。PEAR で提供さ れるライブラリを使用することで、一からコードを記述することなく PHP プログラム の開発が可能になる。さらに、各ライブラリはパッケージという単位で提供され、必要 なパッケージをインストールして利用することができる。本研究では、DB、Calendar、 Mail のパッケージが必要だ。 13 2.2 各種インストール作業 2.2_1 XAMPP のインストール 卒研管理サイトと同等環境にするために XAMPP を使用した。XAMPP のインスト ール方法について説明する。下記の URL から自分の環境にあった XAMPP をインスト ールする。 本研究で XAMPP のバージョンは XAMPP1.7.3 だ。 http://www.apachefriends.org/jp/xampp-windows.html (XAMPP) 実行環境は USB フラッシュメモリの F:¥XAMPP に作成した。XAMPP は通常のソフ トウェアのインストール同様インストーラを実行することでインストールすることが できる。Apache などの起動は XAMPP Control Panel から起動することができる。 XAMPP のコントローラパネルを図 2.2_1.1 に示す。 図 2.2.1_1.1 XAMPP Control Panel Apache、MySQL を start・stop で起動・停止を行うことができるようになっている。 Apache の Admin を選択すると WEB ブラウザに XAMPP 内のソフトウェアの設定状 況やバージョンなどが確認することができる WEB ページが表示される。MySQL の Admin を選択すると phpMyAdmin がブラウザ上に表示される。本研究のデータベー ス編集は phpMyADmin を使用した。Apache の Admin の選択時を図 2.2_1.2、MySQL の Admin の選択時を図 2.2_1.3 に示す。 14 図 2.2_1.2 XAMPP ブラウザ表示 図 2.2_1.3 PHPMyAdmin 表示 2.2_2 Jpgraph のインストール 下記の URL から自分の PHP の環境にあったファイルをダウンロードする。 http://jpgraph.net/download/ PHP の環境とは、PHP のバージョンによってダウンロードするファイルが異なるとい うことだ。本研究では PHP5 を使用したため、PHP5専用のファイルをダウンロード した。設定では、php.ini にインクルードパスを設定することで使用することができる。 その後、動作確認では、ダウンロードファイルの中にサンプルファイルを実行すること で設定完了か確認することができる。下に JpGraph のサンプルプログラムを表示する。 図 2.2_2 JpGraph のサンプルプログラム 15 2.2_3 PEAR のインストール インストールする前に、現状の環境でどの PEAR がインストールされているのか確 認する必要だ。インストールされているパッケージの確認はコマンドプロンプトで PHP のファイルまで開き『pear list;』でインストールされているパッケージを確認す ることができる。本研究で必要な DB や Calendar などがインストールされていないと いうことがわかり、コマンドプロンプトに『paer install ○○○○;』 (○の箇所に必要 なパッケージ名を入力)と入力しインストールした。下の図 2.2_3 にインストール後の リストの一部を示す。 図 2.2_3 PEAR の list 2.3 使用ソフトウェアのバージョン XAMPP 1.7.3 PHP Version5.3.1 Apache 2.2.14 MySQL 5.1.41 Jpgraph v3.5.0b1 XAMPP の注意点として、バージョンによって設定ファイルの数が異なるという点に注 意すべきだ。 16 第3章 改良作業 3.1 卒研管理サイトの改良について 第 1 章で挙げた改良項目について説明する。 改良項目の①・②では卒研管理サイトのデータ把握をより、容易にするためにはデー タを分かりやすい状態で表示することが必要だと考えた。そこで卒業研究管理サイトの 改良点として、既存の表示にある在室時間グラフを表示してデータ把握のツールとして 提案した。既存の卒研管理サイトの個人在室時間では日間在室時間、月間在室時間、年 間在室時間表示し、ログインした学生と同じ研究室に所属する学生の在室時間を月間ラ ンキングを表示する。この表示を把握しやすくするため、グラフを既存の表示に加えよ うと考えた。今回使用するグラフ生成ライブラリ JpGraph では 20 種類以上のグラフ に対応しているが、今回は棒グラフを採用した。折れ線グラフや散布図などよりも棒グ ラフの方がデータの推移や比較をわかりやすく表示できると考えたからだ。 改良項目の③(過去の卒業研究論文閲覧機能)について説明する。本研究を始めた当 初、過去の卒業研究を参考にしようと考えた時、自分が必要だと考える論文を数多くの 冊子から探す必要があった、さらに自分が必要だと思う論文を他の人が使用中の場合使 い終わるのを待つしかなく全体的に非効率だと考えた。そこで、卒研管理サイトに過去 の卒業研究論文を閲覧することができる機能が必要だと考え、本研究の改良項目に加え た。 17 3.2 改良後画面 改良後の場面を図 3.2 に載せる。ログイン後の最初のページを表示させた。過去の在 室時間と比較データを選択すると改良前の表示の下にグラフを表示される。論文閲覧を 選択すると過去の卒業研究論文を閲覧することができるように HTML コードを追加し た。 図 3.2 改良後の卒研管理サイト 18 3.3 改良後の実行図 改良後の卒研管理サイトの実行図を図 3.3 に載せる。ログインした当日から直近5日 分表示する個人在室時間グラフを read01.php とした。さらにログインした学生と同じ 研究室に所属している学生の年間在室時間を read001.php とした。そして、個人在室 時間を main.tpl の action2 に加えた。さらに、年間在室時間を main.tpl の action3 に 加えた。 過去の卒業研究論文閲覧機能は、main.tpl の action4 として条件を増やした。 図 3.3 改良後の実行図 19 3.4 個人在室時間比較グラフについて 過去の在室時間についての改良点のログインした学生の在室時間を直近5日表示す るグラフ(以下、個人比較グラフ)について説明する。図 3.4_1 にテーブル workrecords の一部を載せる。ここには、ログインする際に入力する個人 ID(u_id)と入退出記録 と作業記録(Contets)が記録されている。今回使用されている時間記録は UNIX タイム スタンプという 1970 年 1 月 1 日 00:00:00 からの通算秒数として記録されている。 図 4.3 の input_time と modified_time はそれぞれログインした時間とログアウトした 時間を秒数で記録したものである。 図 3.4_1 データベース workrecords 個人在室時間比較グラフのプログラムソースは付録 1.1 に記す。 まずは、JpGraph を使ってグラフを作成するには Graph クラスからオブジェクトを作 成しそのオブジェクトに対して様々な設定を行ってグラフを作成する。さらに、今回使 用した棒グラフでは、棒グラフを作成するには BarPlot クラスのオブジェクトを作成し、 Graph クラスのオブジェクトを追加したものが以下の構文になる。 require_once("JpGraph/jpgraph.php"); require_once("JpGraph/jpgraph_bar.php"); そして、以下の文で workrecords に接続した。 $sql = "select * from workrecords where u_id =". $_SESSION['u_id']."order by w_sn desc"; $res = mysql_query($sql,$dbh); このテーブルには卒研管理ページを使用しているすべて学生の作業記録が保存されて いる が where u_id =". $_SESSION['u_id']."order by w_sn desc"の部分で個人 ID を指定し、 個人 ID を指定し、個人データのみ呼び出し、データを降順に並び変えている。 20 while( $row = mysql_fetch_assoc($res)) {$y[] = date((($row["modified_time"]) - ( $row["input_time"]))/3600);//strtotime $x[] = date("m/d",($row["input_time"])); if(count($x)>=5) {break;} } while とは繰り返しの処理を表す。()内が繰り返しの条件であり、条件を満たしてい る場合なら{}内の作業を行うことを命令している。 x 軸、y 軸について分けて説明すると、y 軸にログアウト時間からログイン時間を引い て 3600 で割ると時間で表示することができる。x 軸は取得した$row[‘input_time’]を月 /日で表すことができる。 if(count($x)>=5) {break;} これは、ループ処理した後のデータの数が5つになるとループ処理を終了するという部 分になる。 次に、JpGraph の設定部分の説明だ。 $graph = new Graph(500,400,'auto');//タイトル名 $graph->SetScale('textlin',0,24);//最大値最小値 $graph->xaxis->SetTickLabels($xdata); $graph ->title->Set("在室時間");//タイトル名 $graph ->xaxis->title->Set("日付");x 軸のタイトル名 $graph ->yaxis->title->Set("時間(分)");y 軸のタイトル名 $graph ->title->SetFont(FF_MINCHO,FS_NORMAL,30); $graph ->xaxis->title->SetFont(FF_MINCHO,FS_NORMAL,10);x 軸のタイトルの書 式と文字の大きさ $graph ->yaxis->title->SetFont(FF_MINCHO,FS_NORMAL,10); y 軸のタイトルの書 式と文字の大きさ read01.php の実行例を図 3.4_2 に示す。 21 図 3.4_2 個人比較グラフ 22 3.5 年間在室時間比較グラフ 今回比較データを改良した。改良項目として、現状の表示の下にグラフを一つ追加し た。今回作成したグラフは、ログインした学生と同じ研究室に所属する学生全員の年間 在室時間比較グラフ(以下、年間在室時間比較グラフ)だ。 年間在室時間比較グラフを下記で解説し、付録 1.2 に全文記す。 図 3.5_1 にテーブル userinfo の一部を載せる。 図 3.5_1 データベース userinfo 今回も同様 workrecords を使用した。今回は在室時間だけではなく、同じ研究室なの かも識別しなければならないためデータベースの userinfo も使用した。 $sql = "select * from userinfo left join workrecords using(u_id) order by u_id"; $res = mysql_query($sql,$dbh); データベースは u_id を基準に統合した。上記の文が二つのデータベースを統合すると きに行った文になる。 while( $row = mysql_fetch_assoc($res) ) {if($row['lab_id'] != $_SESSION['lab_id']){ unset ($row);} 上記のループ処理の場合、データベースに入っているデータをすべてを取得しループ処 理が始まってしまうため、$row['lab_id'] != $_SESSION['lab_id']の文でログインした 学生と違う研究室の ID を持つデータは除外する。 if($uid == ""){ $uid = $row["u_id"]; $x[] = $uid; } if($uid != $row["u_id"]) { $y[] = date($yList); $uid =$row["u_id"]; $x[] = $uid; $yList = 0;} $yList += ($row["modified_time"] - $row["input_time"])/60;} 個人在室時間グラフ同様、ログアウト時間からログイン時間を引くと在室時間が出る。 23 ただ、今回はループ処理の中で年間通して在室時間を計測するために加算を続ける。+= の加算代入演算子が使用されている。グラフ実行時を図 3.5_2 に載せる。 図 3.5_2 年間在室時間グラフ 24 3.6 過去の卒業研究論文閲覧 過去の卒業研究論文を閲覧することができる『論文閲覧』という新項目について説明 する。新項目のプログラム等について下記で解説し、全文を付録 1.3、1.4 に全文を示 す。論文閲覧の選択時を図 3.6 に載せる。 図 3.6 論文閲覧の選択時 今回、新項目を設置する際に既存の付録 1.3(main.tpl)と付録 1.4(main.php)を改 良した。まず、 『論文閲覧』という項目を選択可能にするために付録 1.4 の 239~241 行 目を追加した。そして、付録 1.3 の 20 行目を追加し、論文閲覧を選択可能にした。次 に、論文閲覧を選択後に表示するページを作成した。選択時に表示する箇所は HTML コードで記述した。 以下に、その一部を載せ、解説する。 <table border="3"> <tr bgcolor="#ffffc0"> <td>所属研究室</td> <td><center>卒業論文名</td> </tr> まず、上記のコードで表の骨組みや背景色を指定し、項目名を指定している。 <tr> <td><center>倪研究室</td> <td><a href="soturon/ni/0101.pdf">PHP 及び MySQL による卒業研究管理サイトの構 築</a></td></tr> 25 上記のコードは学生が必要な論文を選択時に論文を閲覧可能にするために、リンクを追 加しているコードになる。 26 第4章 結果・考察と今後の課題 4.1 結果・考察 在室時間のデータ把握をより容易にするため、個人在室時間比較や年間在室時間をグ ラフで閲覧することができるようになった。個人在室時間比較グラフでは、在室時間が 極端に減っている場合、客観的に表示されるため、在室時間減尐に伴う、卒業研究の遅 れを理解することができる。そのことによって、自ら補うための作業計画を見直すこと ができる。年間在室時間比較グラフでは、これまで同じ研究室に所属する学生で月間在 室時間の比較しか出来なかったところに年間通して表示するグラフが加わり、同じ研究 室の学生と比べることで、学生は自分が置かれている状況を理解し行動することができ るようになった。以前まで卒業研究論文を閲覧する場合に数多くの卒業研究論文の冊子 から自分の求めている卒業研究論文を探す必要があった。さらにそれらの卒業研究論文 の冊子の管理もあり、全体的に非効率的だった。対して、新たに新設した「過去の卒業 研究論文閲覧」機能では、卒研管理サイトに卒業研究論文を登録することで、オンライ ンで卒業研究論文を閲覧が可能になり、さらに管理も効率的に行うことができるように なった。これらの機能向上で、卒研サイトの利用頻度が増え、より学習環境が充実する と考えられる。 4.2 今後の課題 現状の卒研管理サイトを通して学生同士連絡を取り合うことができない。今後、卒研 管理サイトを通して、学生同士で連絡を取るなどのコミュニケーションツールとしての 使用できるように研究を続けていくべきだ。 さらに、就職活動に利用することができる掲示板などの設置できるようにすべきと考 える。 27 謝辞 本研究を行うにあたり、終始懇切なご指導いただきました倪宝栄教授に深く感謝の意を表 します。誠にありがとうございました。 最後に、ともに研究を行った福良功平さん、田中裕梨さん、原口勇貴さん、松岡美幸さん をはじめ、先生方に厚くお礼申しあげます。 平成 23 年 3 月 1 日 生命環境科学科 07G1011 小溝将之 28 参考文献 基礎からの PHP 著者 山田和夫 発行所 ソフトバンク クリエイティブ株式会社 29 /*read.php 付録 1.1*/ <?php session_start(); $id = $_SESSTION["u_id"]; require_once("JpGraph/jpgraph.php"); require_once("JpGraph/jpgraph_bar.php"); $dbh = mysql_connect("localhost","sotu","sotu"); mysql_select_db("sotuken",$dbh); $sql = "select * from workrecords where u_id =". $_SESSION['u_id']." order by w_sn desc"; $res = mysql_query($sql,$dbh); $x = array(); $y = array(); while( $row = mysql_fetch_assoc($res)) { $y[] = date((($row["modified_time"]) - ( $row["input_time"]))/60);//strtotime $x[] = date("m/d",($row["input_time"])); if(count($x)>=5) { break; } } mysql_close(); $xdata = $x; $graph = new Graph(500,400,'auto'); 30 $graph->SetScale('textlin',0,1440); $graph->xaxis->SetTickLabels($xdata); $graph ->title->Set("在室時間");//タイトル名 $graph ->xaxis->title->Set("日付");//x軸のタイトル $graph ->yaxis->title->Set("時間(分)");//y軸のタイトル $graph ->title->SetFont(FF_MINCHO,FS_NORMAL,30);//タイトルの書式と文字の大きさ $graph ->xaxis->title->SetFont(FF_MINCHO,FS_NORMAL,10);//x軸のタイトルの書式と文字の 大きさ $graph ->yaxis->title->SetFont(FF_MINCHO,FS_NORMAL,10);//y軸のタイトルの書式と文字の 大きさ $ydata = $y; $plot = new BarPlot($ydata); $graph->Add($plot); $graph->Stroke(); ?> 31 /*read001.php 付録 1.2*/ <?php session_start(); $id = $_SESSTION["u_id"]; $dbh = mysql_connect("localhost","sotu","sotu"); mysql_select_db("sotuken",$dbh); require_once("JpGraph/jpgraph.php"); require_once("JpGraph/jpgraph_bar.php"); $sql = "select * from userinfo left join workrecords using(u_id) order by u_id"; $res = mysql_query($sql,$dbh); $x = array(); $y = array(); while( $row = mysql_fetch_assoc($res) ) { if($row['lab_id'] != $_SESSION['lab_id']){ unset ($row); } if($uid == ""){ $uid = $row["u_id"]; $x[] = $uid; } if($uid != $row["u_id"]) { $y[] = date($yList); $uid =$row["u_id"]; 32 $x[] = $uid; $yList = 0; } $yList += ($row["modified_time"] - $row["input_time"])/60; } mysql_close(); $xdata = $x; $graph = new Graph(500,400,'auto'); $graph->SetScale('textlin'); $graph->xaxis->SetTickLabels($xdata); $ydata = $y; $graph ->title->Set("合計在室時間比較データ"); $graph ->xaxis->title->Set("ID"); $graph ->yaxis->title->Set("時間"); $graph ->title->SetFont(FF_MINCHO,FS_NORMAL,30); $graph ->xaxis->title->SetFont(FF_MINCHO,FS_NORMAL,25); $graph ->yaxis->title->SetFont(FF_MINCHO,FS_NORMAL,10); $plot = new BarPlot($ydata); $graph->Add($plot); $graph->Stroke(); ?> 33 /*main.php 付録 1.3*/ <?php // 幾つかの関数を読み込む require_once("functions.php"); if ($_SESSION['u_id'] == "") close_the_window("<a href='index.php'>ログインページ</a>か らアクセスしてください。", 1); if (!isset($_SESSION['YearMonth'])) $_SESSION['YearMonth'] = date("Y-n"); if (!isset($_SESSION['action'])) $_SESSION['action'] = 0; if (!isset($_SESSION['SchoolYear'])) $_SESSION['SchoolYear'] = $SchoolYear; // 卒研在籍 年度 // PEAR・カレンダーの読み込み require_once("Calendar/Month/Weekdays.php"); // データベースへ接続 require_once("initialize.php"); require_once("statistics.php"); // ########################################################################### // 最初に一回だけの処理。名前や指導教員名を取得する。ログイン情報の処理、お知らせの読み込み if (!isset($_SESSION['u_name'])) { $stt = $db->prepare("select * from userinfo where u_id = ? limit 1"); $rs = $db->execute($stt, $_SESSION['u_id']); if ($row = $rs->fetchRow()) { // 学生はデータベースに登録されているユーザー $_SESSION['u_name'] = ($row['u_name']=="") ? $_SESSION['u_id'] : $row['u_name']; $_SESSION['lab_id'] = $row['lab_id']; // ユ ー ザ ー の 指 導 教 員 ID を取得 // 指導教員氏名を取得 $stt = $db->prepare("select * from labinfo where id = ? limit 1"); $rs = $db->execute($stt, $_SESSION['lab_id']); $row = $rs->fetchRow(); $_SESSION['lab_name'] = $row['lab_name']; } 34 else { // 新しいユーザー // 新しいユーザーは、first.php からログインするように誘導 $str = "あなたは新しいユーザーのようです。<br>利用するには、最初に1 回だけ登録する必要があります。"; $str .= "とても簡単ですので、下記のリンクからどうぞお願いします。 <br>¥n<p><a href='first.php'>"; $str .= "卒業研究管理サイト利用の登録</a></p>"; close_the_window($str, 0); } // 次 に ユ ー ザ ー の ロ グ イ ン 情 報 を 記 入 ======================================================== $stt = $db->prepare("select * from loginrecords where u_id = ? and date_time > ? order by l_sn limit 1"); $rs = $db->execute($stt, array($_SESSION['u_id'], strtotime($today))); $row = $rs->fetchRow(); if ($row['l_sn'] > 0) { // 今日のログインがすでにある場合 $firstlogin = 0; $_SESSION['first_login'] = date("H:i:s", $row['date_time']); } else { // 今日初めてログイン $firstlogin = 1; $_SESSION['first_login'] = date("H:i:s"); } $tmp_t = time(); $stt = $db->prepare("insert into loginrecords (u_id, date_time, first_login, ip_addr) values( ?, ?, ?, ?)"); $rs = $db->execute($stt, array($_SESSION['u_id'], $tmp_t, $firstlogin, $_SERVER['REMOTE_ADDR'])); if ($firstlogin) { $stt = $db->prepare("insert into workrecords (u_id, input_time, modified_time ,contents) values (?, ?, ?, ?)"); $rs = $db->execute($stt, array($_SESSION['u_id'], $tmp_t, $tmp_t, "記 述なし")); } 35 // 次 に 教 員 か ら の 指 示 を 読 む ================================================================== $stt = $db->prepare("select * from instructions where valid_time > ? and input_time <= ? and lab_id = ? and (instr(to_whom, ?) or to_whom = '') > 0 order by sn desc"); $rs = $db->execute($stt, array(time(), time(), $_SESSION['lab_id'], $_SESSION['u_id'])); $i = 0; while ($row = $rs->fetchRow()) { $tmp_str = ""; if ($row['to_whom'] != "") { $tmp_ar = explode(',', $row['to_whom']); // 対象者氏名を読み出す foreach ($tmp_ar as $key=>$val) { $stt1 = $db->prepare("select * from userinfo where u_id = ? limit 1"); $rs1 = $db->execute($stt1, $val); $row1 = $rs1->fetchRow(); $tmp_str .= (($tmp_str=="") ? "":" 、 ").$row1['u_name']; } } else $tmp_str = "全員"; $_SESSION['announce'][] = array('date'=>date("Y 年 n 月 j 日 ", $row['input_time']), 'to_whom'=>$tmp_str, 'content'=>$row['contents']); } if (count($_SESSION['announce'])==0) { $_SESSION[0] = array('date'=>date("Y 年 n 月 j 日"), 'to_whom'=>"", 'content'=>"いまのところ、特にありません。"); } // 同じ研究室のクラスメートの名前を取得する $stt = $db->prepare("select * from userinfo where lab_id = ? and u_id <> ? and u_year = ?"); $rs = $db->execute($stt, array($_SESSION['lab_id'], 36 $_SESSION['u_id'], $_SESSION['SchoolYear'])); while ($row = $rs->fetchRow()) { $_SESSION['class_mates'][$row['u_id']] = str_replace(array(" ", " "), " ", $row['u_name']); } } //ここが終わり // ########################################################################### // データベースから作業記録データ及び在室時間を取得、日付の連想配列に格納 if (!isset($_SESSION['total_login'])) { $total_time = 0; $_SESSION['data'] = get_data($_SESSION['u_id'], "2008-1-1", $today, "", $db); foreach ($_SESSION['data'] as $key => $val) $total_time += $val['time']; $_SESSION['total_login'] = count($_SESSION['data']); 総件数 $_SESSION['total_time'] = floor($total_time/60) ."時間".($total_time % 60)."分"; } // ########################################################################### // メニュー・ボタンから戻ったときの処理 if (@$_GET['action'] != "") { $_SESSION['action'] = $_GET['action']; if ($_GET['action'] == 0) $_SESSION['YearMonth'] = date("Y-n"); } // カレンダーからの指定情報を得る if (@$_GET['the_date'] != "") { $_SESSION['the_date'] = $_GET['the_date']; $_SESSION['YearMonth'] = date("Y-n", strtotime($_SESSION['the_date'])); } elseif (@$_GET['change_month'] != "") { 37 // $chg_m = $_GET['change_month']; $_SESSION['YearMonth'] = date("Y-n", strtotime($_SESSION['YearMonth'].(($chg_m>0) ? " +1 " : " -1 ")."month")); } else { $_SESSION['the_date'] = $today; } if (@$_POST['submit']!="") { $isPosted = 1; $today_worklog = get_form($_POST['worklog']); $tmp_t = time(); $stt = $db->prepare("update workrecords set modified_time = ?, contents = ? where u_id = ? and input_time > ? order by w_sn desc limit 1"); $rs = $db->execute($stt, array($tmp_t, $today_worklog, $_SESSION['u_id'], strtotime($today))); $_SESSION['data'][$today]['worklog'] = $today_worklog; } // ########################################################################### // カレンダーの出力 $cal = ""; $Month = new Calendar_Month_Weekdays(date("Y",strtotime($_SESSION['YearMonth'])), date("n",strtotime($_SESSION['YearMonth']))); $Month->build(); while ($day = $Month -> fetch()){ $the_date = $day->thisYear()."-".$day->thisMonth()."-".$day->thisDay(); if ($day -> isFirst()) $cal .= "<tr><td style='color:#ff0000'>"; elseif ($day -> isLast()) $cal .= "<td style='color:#0000ff'>"; else $cal .= "<td>"; if (isset($_SESSION['data'][$the_date])) $cal .= href='".$_SERVER['PHP_SELF']."?the_date=".$the_date."'>".$day->thisDay()."</a>"; else $cal .= $day->thisDay(); 38 "<a $cal .= "</td>¥n"; if ($day -> isLast()) $cal .= "</tr>"; } // ########################################################################### // クラスメートの状況の出力 $c_list = "<table width='90%' border='0' align='center'>"; if (isset($_SESSION['class_mates'])) { foreach ($_SESSION['class_mates'] as $key => $val) { $stt = $db->prepare("select * from workrecords where u_id = ? order by w_sn desc limit 1"); $rs = $db->execute($stt, $key); $row = $rs->fetchRow(); $c_list .= "<tr>¥n"; if ($row['modified_time'] == "" || $row['modified_time'] < strtotime($today)) { 今日はまだ一度もログインしていない $c_list .= "<td>・".$val.":</td><td class='status1'>未登校</td>¥n"; } elseif ($row['contents']=="") { $c_list .= "<td>・".$val.":</td><td class='status2'>未記入</td>¥n"; } else { $c_list .= "<td>・".$val.":</td><td class='status3'>記入済</td>¥n"; } $c_list .= "</tr>¥n"; } } else { $c_list .= "<tr><td>同室の学生は登録<br />されていません。</td><tr>"; } $c_list .="</table>¥n"; // ########################################################################### // 各用途に合わせた変数の設定 switch ($_SESSION['action']) { case 0: 39 // $smarty->assign("the_date", $_SESSION['the_date']); // 2010-4-23 $smarty->assign("YearMonthDay", strtotime($_SESSION['the_date']))); date("Y 年 n 月 j 日 ", // 2010 年 6 月 1 日 $smarty->assign("today_worklog", $_SESSION['data'][$today]['worklog']); $smarty->assign("the_date_worklog", $_SESSION['data'][$_SESSION['the_date']]['worklog']); $smarty->assign("isPosted", $isPosted); $smarty->assign("isFirst", $firstlogin); break; case 1: $worklogs = array(); foreach ($_SESSION['data'] as $key => $val) { if (date("Y-n", strtotime($key)) == $_SESSION['YearMonth']) { $worklogs[date("n 月 j 日 ", strtotime($key))] = array('log'=>$val['worklog'], 'time'=>$val['time']); } } $smarty->assign("worklogs", $worklogs); break; case 2: $tmp_v = 0; $atworks = array(); foreach ($_SESSION['data'] as $key => $val) { if (date("Y-n", strtotime($key)) == $_SESSION['YearMonth']) { $atworks[date("n 月 j 日 ", strtotime($key))] = array('time'=>$val['time'], 'period'=>$val['period'], 'week'=>$ss[date("w",strtotime($key))]); $tmp_v += $val['time']; } } $smarty->assign("month_total", floor($tmp_v / 60)."時間". ($tmp_v % 60). "分"); $smarty->assign("atworks", $atworks); 40 break; case 3: // クラスメートの統計 $d_from = date('Y-n-j', strtotime($_SESSION['YearMonth'])); $d_to = date('Y-n-j', strtotime($_SESSION['YearMonth']." +1 month")); $tmp_ar = array(); //array_merge は複数の配列を一つの配列にする foreach (array_merge(array($_SESSION['u_id']=>$_SESSION['u_name']), $_SESSION['class_mates']) as $key => $val) { $tmp_ar = get_data($key, $d_from, $d_to, "", $db); $t_time = 0; $t_worklog = 0; foreach ($tmp_ar as $key1 => $val1) {$t_time += $val1['time']; if ($val1['worklog']!="") $t_worklog++;} $class_mate_ar[] = array('name'=>$val, 'times'=>$t_time, 'dates'=>count($tmp_ar)."日", 'worklogs'=>$t_worklog); } foreach ($class_mate_ar as $key => $val) $sort_key[$key] = $val['times']; array_multisort($sort_key, SORT_DESC, $class_mate_ar); foreach ($class_mate_ar as $key => $val) $class_mate_ar[$key]['times'] = floor($val['times']/60)." 時 間 ".($val['times'] % 60)."分"; $smarty->assign("class_mate_data", $class_mate_ar); break; case 4: break; default: break; } 41 $smarty->assign("YearMonth",date("Y 年 n 月", strtotime ($_SESSION['YearMonth']))); // 2010 年 6 月 $smarty->assign("today", $today); $smarty->assign("cal", $cal); // カレンダー関連 $smarty->assign("classmates", $c_list); // クラスメート関係 $smarty->assign("action", $_SESSION['action']); $smarty->assign("announce", $_SESSION['announce']); $smarty->display("main.tpl"); ?> 42 /*main.tpl 付録 1.4*/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>卒業研究管理サイト</title> <link href="style.css" rel="stylesheet" type="text/css" /> <!--[if lt IE 8]> <link rel="stylesheet" type="text/css" href="ie7.css" /> <![endif]--> </head> <body leftmargin="0" topmargin="0"> <div id="Header">生命環境科学科 卒業研究管理</div> <div id="MenuBar"> <ul class="Navi"> <li><a href="{$smarty.server.PHP_SELF}?action=0">作業記録入力</a></li> <li><a href="{$smarty.server.PHP_SELF}?action=1">過去の作業記録</a></li> <li><a href="{$smarty.server.PHP_SELF}?action=2">過去の在室時間</a></li> <li><a href="{$smarty.server.PHP_SELF}?action=3">比較データ</a></li> <li><a href="{$smarty.server.PHP_SELF}?action=4">論文閲覧</a></li> </ul> </div> <div id="Calendar" class="text"> <h2 class="menu" align="center">履歴</h2> <div align="center" class="text_h"> <a href='{$smarty.server.PHP_SELF}?change_month=-1'><</a> {$YearMonth} <a href='{$smarty.server.PHP_SELF}?change_month=1'>></a> </div> <table align="center"> <tr><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th><th>日</th></tr> {$cal} </table> </div> <div id="MemberList" class="text"> 43 <h2 class="menu" align="center">他の同室学生の状況</h2> {$classmates}</div> <div id="Footer"></div> <div id="CopyRight" align="right">Copyright @2006 - 2010, Baorong Ni</div> <div id="MainContents" class="text"> {if $action == 0} <div id="Announce"> <h2 class="midashi">お知らせ</h2> <dl> {foreach from=$announce item=val} <dt>{$val.date} (対象者: {$val.to_whom}さん)</dt> <dd>{$val.content}</dd> {/foreach} </dl> </div> <div id="WorkLog"> <h2 class="midashi">今日の履歴及び作業記録</h2> {if $the_date == $today} {if $isPosted != 1} {if $isFirst == 1} <p>本日初めてログインしたようですね。登校時刻:{$smarty.session.first_login} を設定しま した。</p> <p>下校する前に尐なくとも1回はもう一度本サイトにアクセスし、作業記録を行ってください。 </p> <p>本日の作業記録を入力または編集してください(後ででも構いません) 。</p> {else} <p> 本 日 は 、 {$YearMonthDay} で す 。 あ な た の 最 初 の ロ グ イ ン は 、 {$smarty.session.first_login}です。</p> <p>本日の作業記録を入力または編集してください。</p> {/if} <form action="{$smarty.server.PHP_SELF}" method="post"> <p align="center"><textarea name="worklog" cols="60" rows="6">{$today_worklog}</textarea></p> <p align="center"><input type="submit" name="submit" value="送信" /></p> </form> 44 {else} <p>作業記録は次のようになりました。</p> <p><b>{$today_worklog}</b></p> <p>お疲れ様でした。ログアウトしてかまいません。</p> {/if} {else} <p>以下は{$the_date}の作業記録です。</p> <p>{$the_date_worklog}</p> {/if} </div> {elseif $action == 1} <h2 class="midashi">{$YearMonth}の作業記録:</h2> <dl> {foreach from=$worklogs key=key item=val} <dt>● {$key}(在室時間:{$val.time} 分)</dt> <dd>{$val.log}</dd> {/foreach} </dl> {elseif $action == 2} <h2 class="midashi">{$YearMonth}の在室時間:</h2> {foreach from=$atworks key=key item=val} <p>● {$key}({$val.week}) : {$val.time}分、 在室時刻: {$val.period}</p> {/foreach} <p><br>当月の在室時間合計は、{$month_total} でした。</p> <p>これまでの在室時間の合計は、{$smarty.session.total_time} でした。</p> <Hr Size="5" Color="#339900"> <img src="read01.php"> <Hr Size="5" Color="#339900"> {elseif $action == 3} <h2 class="midashi">他の学生はどんな状況かな</h2> <p>{$YearMonth}の在室状況</p> 45 <table border="1" width="95%"> <tr><th>氏名</th><th>全登校日数</th><th>全在室時間</th><th>記録記入日数</th><th>在室時間ラン キング</th></tr> {foreach from=$class_mate_data key=key item=val} <tr><td align="center">{$val.name}</td><td align="center">{$val.dates}</td> <td align="center">{$val.times}</td><td align="center">{$val.worklogs}</td><td align="center">{$key+1}</td></tr> {/foreach} </table> <Hr Size="5" Color="#339900"> <img src="complite/read001.php"> {elseif $action == 4} <h2 class="midashi">過去の卒業論文を参考にしよう</h2> <p>過去の卒業研究論文を閲覧したい場合は、下記からダウンロードしてください。</p> <table border="3"> <tr bgcolor="#ffffc0"> <td>所属研究室</td> <td><center>卒業論文名</td> </tr> <tr> <td><center>倪研究室</td> <td><a href="soturon/ni/0101.pdf">PHP 及び MySQL による卒業研究管理サイトの構築</a></td> </tr> <tr> <td><center>倪研究室</td> <td><a href="soturon/ni/0101.zip">XRD と EPMA による酸化物超伝導体の組織分析</a></td> </tr>> <tr> <td><center>倪研究室</td> <td><a href="soturon/ni/0101.zip">授業支援型 WEB の構築</a></td> </tr> <tr> <td><center>倪研究室</td> 46 <td><a href="soturon/ni/0101.zip">Y 系酸化物超伝導体における MgO 粒子の導入</a></td> </tr> <tr> <td><center>FIT 研究室</td> <td><a href="soturon/ni/0101.zip">部分融解法における Bi-2212超伝導体バルクの精製</a></td> </tr> </table> {/if} </div> <div id="Login_out"> <table border="0" align="right"> <tr><td align="right" height="15px"> 利 用 者 : {$smarty.session.lab_name} 研 究 室 、 {$smarty.session.u_name} さん</td></tr> <tr><td align="right"><a href="logout.php"><img src="images/logout.png" style="border-style:none;" /></a></td></tr> </table> </div> </body> </html> 47