授業評価のまとめ。
こんなものに力を入れるのもどうかと思いますが、システムやデータベースの勉強のためにやっていました。
前回の「できた……かな?」でもまだ実はできていませんでした。
実は MySQL のバグなのか仕様なのか分かりませんが、データが少しおかしかったことと、システムの設計に重大なミスがあることに気がついたことがありました。
まず、MySQL について。
エクセル等で整理したデータを読み取るのは「Tab 区切り」で保存して一括で読み取ることができることは以前に書きました。「LOAD DATA INFILE 〜」うんぬんというやつです。
実はそのやり方で読み込んだデータにはちょっとゴミがあったのです。
1レコード(つまり1行)の最後のフィールド(列)が文字列の場合、どうやら改行も文字列の一部として取り込まれてしまうのです。例えば職員データの場合、「職員番号、職員名」というレコードが並んでいるのですが、
1400001 (Tab) 情報太郎
などとなっているのですが「情報太郎」の後ろに「情報太郎(改行)」という形のコードが入ってしまうのです。今まで画面上で見ている限りずっと気がつきませんでした。最終的にエクセルにインポートして、マクロを実行したとき、「文字列がヘンだ!」というエラーメッセージが出て初めて気がつきました。
Perl や PHP なら「chop()」という関数を使って最後の一文字を削除できますから、それをすべてのレコードに掛ければキレイに消えるとは思います。しかし、1行ずつ取り出して、削除、また元に戻す、というのはいかんせんスマートではありません。なんとかSQLの段階で実行できないかなぁと悩んでいました。結論から言って良く分からなかったので、マクロ側で対応して最後の文字を取り除きました。
もう一点のシステムの設計の重大なミスについて。
取り出したデータで自分の分を見てみると、どうも少しデータが少ないのです。また生のデータを見てきたときとも少し違うと直感的に気がつきました。
よーく考えた結果分かりました。授業評価システムの最後の方の説明がまだですが、最後の段階で、一人一人のアンケート結果をデータベースに取り込む際に、「講座番号」と「学籍番号」と「アンケート結果」の対応でしか登録していなかった(データベースの設計がそうだった)のです。しかし、講座によっては都合で「一つの講座に複数の担当がいるものがごくわずかある」ということを忘れていたのです。
生徒に聞く画面上では、講座番号から導き出される担当者をすべて表示しているので、データとしては取り込まれています。しかし、「ある講座番号に複数の答えがある」という状態で、それが誰宛か、判別が付かないのです。またシステムとして、複数回の登録チェックは行わずすべて単純に取り込んでいます(一意に定まるように auto_increment 属性は付けてある)。
単純に一番最後のデータだけを残して後は削除してしまうと、このような特殊なケースの講座の場合、最後の担当教員のデータしか残らないことになります。そこで完全に全く同じ解答(ダブり)のみを削除して後はすべて残すように、もう一度整理し直しました。これはエクセルの機能を使いました。
エクセルに取り込んだ後で、「データ」−「フィルタ」−「フィルタオプションの設定」画面で、「重複するレコードは無視する」のチェックを入れると、重複レコードは非表示にしてくれるのです。
後はすべてを選択して、「編集」−「ジャンプ」−「セル選択」−「可視セルの選択」で有効なデータのみ選択、コピーして、別シートに貼り付ければ完成です。←この技は結構使えますよ。
後はマクロを実行して、各教員ごと、各教科ごとのファイルに切り分けて完成です。
2006年10月26日
2006年10月24日
できた……かな?
授業評価の最終的なまとめ。
データベースの自分の勉強を兼ねてのんびりやっていたものだからずいぶん時間がかかってしまいました。もちろん、今が試験中で情報は試験が無いというのがちょっと集中してできる理由なのですが。
データベースの自分の勉強を兼ねてのんびりやっていたものだからずいぶん時間がかかってしまいました。もちろん、今が試験中で情報は試験が無いというのがちょっと集中してできる理由なのですが。
2006年10月20日
授業評価結果の整理
しばらく忙しくて放置状態の授業評価の結果ですが、そろそろまとめないといけないということで、取りかかりました。
しかし、ここのところSQLではまっていました。
生徒が行ったアンケート結果はかなり正規化されていて、質問6項目に対し、質問番号と解答でレコードが構成されています。しかし、結果を出すためには一つの講座、一人の生徒に対して、解答が並んでいる状態で欲しいものです。また何度も送信した結果複数回登録されているものもあり(入力時チェックはしていない)、ダブりをなくさなくてはなりません。そこでこんな感じのSQLを考えました。
DELETE FROM
hyoka_result AS d1
WHERE
d1.tmp >
(
SELECT
MIN(d2.tmp)
FROM
hyoka_result AS d2
WHERE
d1.tourokubi = d2.tourokubi
AND
d1.bango = d2.bango
AND
d1.koza_bango = d2.koza_bango
GROUP BY
d2.tmp
)
;
ゴチャゴチャとした細かいことはさておき、動きませんでした!
なぜかが解らず3日ぐらい悩んでいたのですが、解りました。MySQL のリファレンスマニュアルに載っています。MySQL 4.0ではクエリのネスト(サブクエリ)に制限があったのです。
6.4.2.11. 初期の MySQL バージョンに合わせたサブクエリの書き換え
と書いてあるじゃないですか。SELECT文を実行した結果、ある条件に合致するものを削除したり(DELETE)、更新したり(UPDATE)できないのです。そういえば、SQLを勉強していた「書き込み式SQLのドリル」では、MySQL 5.0 が前提になっていたのでした。
INSERT 文では使えるので、こうなったら力業です。
ダブりを削除 → 新しいテーブルにINSERT
question = 1 の解答と question = 2 の解答を合体 → 新しいテーブルにINSERT
question = 1,2 の解答と question = 3 の解答を合体 → 新しいテーブルにINSERT
question = 1,2,3 の解答と question = 4 の解答を合体 → 新しいテーブルにINSERT
…
…
…
次々と新しいテーブルを作って結果を放り込むことで、一応非正規化を完了させました。後は講座番号を講座名に直し、またそこから担当教諭の名前を引き、Excelの形で取り出す。その後、昨年作った教科ごと、教員ごとに別ファイル切り分けながらピボットテーブルに落とし込むマクロを使って分ければ、完成……かな?
この力業も「MySQL monitor」からしこしこSQLを試して行ったので、PHP化しておかないと来年使い物にならなくなりそうですね(大したことじゃないですが)。
色々勉強になります。
p.s.かなり疲れました(笑)
しかし、ここのところSQLではまっていました。
生徒が行ったアンケート結果はかなり正規化されていて、質問6項目に対し、質問番号と解答でレコードが構成されています。しかし、結果を出すためには一つの講座、一人の生徒に対して、解答が並んでいる状態で欲しいものです。また何度も送信した結果複数回登録されているものもあり(入力時チェックはしていない)、ダブりをなくさなくてはなりません。そこでこんな感じのSQLを考えました。
DELETE FROM
hyoka_result AS d1
WHERE
d1.tmp >
(
SELECT
MIN(d2.tmp)
FROM
hyoka_result AS d2
WHERE
d1.tourokubi = d2.tourokubi
AND
d1.bango = d2.bango
AND
d1.koza_bango = d2.koza_bango
GROUP BY
d2.tmp
)
;
ゴチャゴチャとした細かいことはさておき、動きませんでした!
なぜかが解らず3日ぐらい悩んでいたのですが、解りました。MySQL のリファレンスマニュアルに載っています。MySQL 4.0ではクエリのネスト(サブクエリ)に制限があったのです。
6.4.2.11. 初期の MySQL バージョンに合わせたサブクエリの書き換え
バージョン 4.0 までは、ネストされたクエリのサポートは、INSERT ... SELECT ... 形式と REPLACE ... SELECT ... 形式だけに限定されています。
と書いてあるじゃないですか。SELECT文を実行した結果、ある条件に合致するものを削除したり(DELETE)、更新したり(UPDATE)できないのです。そういえば、SQLを勉強していた「書き込み式SQLのドリル」では、MySQL 5.0 が前提になっていたのでした。
INSERT 文では使えるので、こうなったら力業です。
ダブりを削除 → 新しいテーブルにINSERT
question = 1 の解答と question = 2 の解答を合体 → 新しいテーブルにINSERT
question = 1,2 の解答と question = 3 の解答を合体 → 新しいテーブルにINSERT
question = 1,2,3 の解答と question = 4 の解答を合体 → 新しいテーブルにINSERT
…
…
…
次々と新しいテーブルを作って結果を放り込むことで、一応非正規化を完了させました。後は講座番号を講座名に直し、またそこから担当教諭の名前を引き、Excelの形で取り出す。その後、昨年作った教科ごと、教員ごとに別ファイル切り分けながらピボットテーブルに落とし込むマクロを使って分ければ、完成……かな?
この力業も「MySQL monitor」からしこしこSQLを試して行ったので、PHP化しておかないと来年使い物にならなくなりそうですね(大したことじゃないですが)。
色々勉強になります。
p.s.かなり疲れました(笑)
2006年10月17日
10億の夜
萩尾望都風?
いえ、先ほどまで大変だったんです。
授業評価の結果をそろそろちゃんと取り出さなくてはならず、SQLを試していました。
SELECT
tmp
FROM
table_a,table_b
WHERE
…
…
とかやったんですが、実は必要なのは table_a から取り出せれば良かったんです。その後の「WHERE」の条件で使うからとうっかり table_b も FROM に入れてしまったのですね。
この table_a は約1万件、table_b は約10万件のデータがあるんです。ということは並列で並べた結果
10000×100000 = 1000000000 件(10億)あるテーブルを作り始めてしまったからさぁたいへん。いくら待っても終わりません。それどころかとめようとしても Windows そのものの動きが超スローリーになってしまいました。
結局、頑張って「サービス」から MySQL を停止させることに成功してなんとか再起動かけることができました。もしかしたらデータベースが吹っ飛んだかも(コピーだから元はあるんですが)。なんだかんだで1時間以上かかりました。
10億(件のデータ)に悩まされた夜でした。
いえ、先ほどまで大変だったんです。
授業評価の結果をそろそろちゃんと取り出さなくてはならず、SQLを試していました。
SELECT
tmp
FROM
table_a,table_b
WHERE
…
…
とかやったんですが、実は必要なのは table_a から取り出せれば良かったんです。その後の「WHERE」の条件で使うからとうっかり table_b も FROM に入れてしまったのですね。
この table_a は約1万件、table_b は約10万件のデータがあるんです。ということは並列で並べた結果
10000×100000 = 1000000000 件(10億)あるテーブルを作り始めてしまったからさぁたいへん。いくら待っても終わりません。それどころかとめようとしても Windows そのものの動きが超スローリーになってしまいました。
結局、頑張って「サービス」から MySQL を停止させることに成功してなんとか再起動かけることができました。もしかしたらデータベースが吹っ飛んだかも(コピーだから元はあるんですが)。なんだかんだで1時間以上かかりました。
10億(件のデータ)に悩まされた夜でした。
2006年07月11日
授業評価システム内容(7)SQLのテスト2
授業評価システム内容(1)データベース設計
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
授業評価システム内容(5)表紙画面を作ってみる
授業評価システム内容(6)本人確認ページの作成
kojin.php から学籍番号を受け取って、質問項目を表示するために、まずデータベースに問い合わせて必要な情報を取得する方法を考えます。
以前、学籍番号、講座番号、科目番号、講座名を表示させる SQL は考えました。色々考えると、講座を担当する職員名も必要です。何先生の授業なのかを想像しながら授業評価をするからです。
こんな感じの SQL を試してみました。
意味は、
「kozajuko テーブル、kozadata テーブル、kamokudeta テーブル、kozatanto テーブル、shokuinmaster テーブルから、科目名、講座番号、講座名、職員名を表示しなさい。条件は、学籍番号が(学籍番号)であり、かつ、講座受講テーブル、講座データデーブル、講座担当テーブルの講座番号が一致し、かつ、科目データテーブルと講座データテーブルの科目番号が一致し、かつ、講座担当テーブルと職員マスターテーブルの職員番号が一致すること」
ということです。各テーブルの意味はこちらを見てください。
さて、実行してみると、うんともすんとも言いません。あれ? おかしいな。ん? などと待っているとバーッと表示されました。38秒かかりました。
余りに多くのテーブルを並べたからなのでしょう。これでは使い物になりません。kojin.php で本人確認をして、「はい。そうです」ボタンを押してから最低でも38秒かかってしまうことになります。そこで、テーブルの結合を考えます。
内部結合(INNER JOIN)とは、A,B二つのテーブルをある条件で結合します。テーブルAにあり、テーブルBに無いデータはその列を NULL 値で置きます。テーブルBにあり、テーブルAに無いデータも同じです。
左外部結合(LEFT JOIN)とは、FROM で指定したテーブルA を「左」とし、結合するテーブルBを「右」とし、「左」にあって「右」にないデータは NULL値 を置き、逆のデータは捨ててしまいます。
右外部結合(RIGHT JOIN)とは、FROM で指定したテーブルA を「左」とし、結合するテーブルBを「右」とするところまでは左外部結合と全く同じ。しかし、優先するのは「右」であるテーブルBだというだけです。つまり、FROM で指定するテーブルと後から結合するテーブルを入れ替えれば、そのまま左外部結合は右外部結合として成り立ちます。
そこで、「左外部結合」だけを使うことにします。
左外部結合(LEFT JOIN)を使うと、FROM で指定したテーブルに対して条件の合致するレコードだけを結合します。そこで、こんな SQL に改良してみました。
結合の仕方を除けば、先ほどとやっていることは同じです。
kozatanto テーブルに shokuinmaster テーブルを左外部結合(条件は職員番号が等しい)、
そのテーブルに、kozadata テーブルを内部結合(条件は講座番号が等しい)、
そのテーブルに、kozajuko テーブルを左外部結合(条件は講座番号が等しい)、
そのテーブルに、kamokudata テーブルを左外部結合(条件は科目番号が等しい)、
結合したテーブルを学籍番号が(学籍番号)であるレコードを抜き出して表示する。
という内容です。
これを実行すると結果がバーッと表示され、最後に、
20 rows in set (0.62 sec)
と表示されました。0.62秒なら実用になります。何人もが一斉にアクセスしてもそう待たされることはないでしょう。
次回、この SQL を使って、授業評価の質問をするページを作っていきます。
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
授業評価システム内容(5)表紙画面を作ってみる
授業評価システム内容(6)本人確認ページの作成
kojin.php から学籍番号を受け取って、質問項目を表示するために、まずデータベースに問い合わせて必要な情報を取得する方法を考えます。
以前、学籍番号、講座番号、科目番号、講座名を表示させる SQL は考えました。色々考えると、講座を担当する職員名も必要です。何先生の授業なのかを想像しながら授業評価をするからです。
こんな感じの SQL を試してみました。
意味は、
「kozajuko テーブル、kozadata テーブル、kamokudeta テーブル、kozatanto テーブル、shokuinmaster テーブルから、科目名、講座番号、講座名、職員名を表示しなさい。条件は、学籍番号が(学籍番号)であり、かつ、講座受講テーブル、講座データデーブル、講座担当テーブルの講座番号が一致し、かつ、科目データテーブルと講座データテーブルの科目番号が一致し、かつ、講座担当テーブルと職員マスターテーブルの職員番号が一致すること」
ということです。各テーブルの意味はこちらを見てください。
さて、実行してみると、うんともすんとも言いません。あれ? おかしいな。ん? などと待っているとバーッと表示されました。38秒かかりました。
余りに多くのテーブルを並べたからなのでしょう。これでは使い物になりません。kojin.php で本人確認をして、「はい。そうです」ボタンを押してから最低でも38秒かかってしまうことになります。そこで、テーブルの結合を考えます。
内部結合(INNER JOIN)とは、A,B二つのテーブルをある条件で結合します。テーブルAにあり、テーブルBに無いデータはその列を NULL 値で置きます。テーブルBにあり、テーブルAに無いデータも同じです。
左外部結合(LEFT JOIN)とは、FROM で指定したテーブルA を「左」とし、結合するテーブルBを「右」とし、「左」にあって「右」にないデータは NULL値 を置き、逆のデータは捨ててしまいます。
右外部結合(RIGHT JOIN)とは、FROM で指定したテーブルA を「左」とし、結合するテーブルBを「右」とするところまでは左外部結合と全く同じ。しかし、優先するのは「右」であるテーブルBだというだけです。つまり、FROM で指定するテーブルと後から結合するテーブルを入れ替えれば、そのまま左外部結合は右外部結合として成り立ちます。
そこで、「左外部結合」だけを使うことにします。
左外部結合(LEFT JOIN)を使うと、FROM で指定したテーブルに対して条件の合致するレコードだけを結合します。そこで、こんな SQL に改良してみました。
結合の仕方を除けば、先ほどとやっていることは同じです。
kozatanto テーブルに shokuinmaster テーブルを左外部結合(条件は職員番号が等しい)、
そのテーブルに、kozadata テーブルを内部結合(条件は講座番号が等しい)、
そのテーブルに、kozajuko テーブルを左外部結合(条件は講座番号が等しい)、
そのテーブルに、kamokudata テーブルを左外部結合(条件は科目番号が等しい)、
結合したテーブルを学籍番号が(学籍番号)であるレコードを抜き出して表示する。
という内容です。
これを実行すると結果がバーッと表示され、最後に、
20 rows in set (0.62 sec)
と表示されました。0.62秒なら実用になります。何人もが一斉にアクセスしてもそう待たされることはないでしょう。
次回、この SQL を使って、授業評価の質問をするページを作っていきます。
2006年07月10日
授業評価システム内容(6)本人確認ページの作成
授業評価システム内容(1)データベース設計
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
授業評価システム内容(5)表紙画面を作ってみる
表紙から受け取ったデータを元に、本人確認(学籍番号確定)ページを作ります。
いよいよ PHP の出番です。
PHP に関してはいくつかの本を買いました。しかし、しくみや文法などについて一番良く分かったのはオンラインのマニュアルでした。
PHP で書かれたものは拡張子を「.php」で保存します。webサーバに要求したときに、拡張子が「.php」であった場合、webサーバが対応している場合、モジュールまたはcgiとして実行し、結果をブラウザに返します。ですからクライアント側から見ると、ソースページを表示しても PHP の痕跡はありません。単なる html しか見えません。この辺は昔から Perl などで書いていた cgi のページと同じです。
PHP の書き方(構文)ですが、通常の HTML と混在して書くことができます。
<?php ではじまり ?>でおわります。これを HTML ファイル内で何度でも行うことができます。それ以外にも3種類ほどあり、
1. <?php echo("XHTMLまたはXMLドキュメントを処理したい場合は、この方法が良いでしょう\n"); ?>
2. <? echo ("この方法は最も簡単で、SGMLの処理命令です\n"); ?>
<?= expression ?> は "<? echo expression ?>"のショートカットです。
3. <script language="php">
echo ("(FrontPageのような) いくつかのエディタ は処理命令を好み
ません");
</script>
4. <% echo ("オプションでASP形式のタグを使用可能です"); %>
<%= $variable; # これは、"<%echo .." のショートカットです。%>
という構文があるようです。通常は1、または2を使うようです。3はいつでも使える構文。4はASP形式であり、オプションで許可されていないと使えないそうです。
そして、「何度でも行うことができます」と書きましたが、次のようなこともできると後から知りました。
<?php
if ($expression) {
} else {
}
?>
if(){〜}else{〜}の構文ですが、「〜」の処理で一度 PHP を抜け出して地の HTML になり、また PHP 内でのif文の続きのような形なのに、一連の動作が成り立ちます。PHPのマニュアルにはこう書いてあります。
つまり、PHP を抜け出しているようでいて、実は一連の動作はすべて PHP 内で処理されているのです。
このことを早い段階で知っていたら、もう少し違った書き方をしていたかも知れません。
また、マニュアルには、終了タグ ?>には自動的に「;」が付加されているものとして取り扱うことや、ファイルの終端では終了タグはあってもなくてもいいことが書いてあります(PHPマニュアル 第 10章基本的な構文参照)。
今少し触れましたが、命令はC言語と同様に「;」で終了します。基本的には必ず付けます(命令の分離)。
さて、授業評価システムにおいて個人確認をする PHP で作られたページは以下のようになりました。
続きを読む
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
授業評価システム内容(5)表紙画面を作ってみる
表紙から受け取ったデータを元に、本人確認(学籍番号確定)ページを作ります。
いよいよ PHP の出番です。
PHP に関してはいくつかの本を買いました。しかし、しくみや文法などについて一番良く分かったのはオンラインのマニュアルでした。
PHP で書かれたものは拡張子を「.php」で保存します。webサーバに要求したときに、拡張子が「.php」であった場合、webサーバが対応している場合、モジュールまたはcgiとして実行し、結果をブラウザに返します。ですからクライアント側から見ると、ソースページを表示しても PHP の痕跡はありません。単なる html しか見えません。この辺は昔から Perl などで書いていた cgi のページと同じです。
PHP の書き方(構文)ですが、通常の HTML と混在して書くことができます。
<?php ではじまり ?>でおわります。これを HTML ファイル内で何度でも行うことができます。それ以外にも3種類ほどあり、
1. <?php echo("XHTMLまたはXMLドキュメントを処理したい場合は、この方法が良いでしょう\n"); ?>
2. <? echo ("この方法は最も簡単で、SGMLの処理命令です\n"); ?>
<?= expression ?> は "<? echo expression ?>"のショートカットです。
3. <script language="php">
echo ("(FrontPageのような) いくつかのエディタ は処理命令を好み
ません");
</script>
4. <% echo ("オプションでASP形式のタグを使用可能です"); %>
<%= $variable; # これは、"<%echo .." のショートカットです。%>
という構文があるようです。通常は1、または2を使うようです。3はいつでも使える構文。4はASP形式であり、オプションで許可されていないと使えないそうです。
そして、「何度でも行うことができます」と書きましたが、次のようなこともできると後から知りました。
<?php
if ($expression) {
?>
<strong>This is true.</strong>
<?php
} else {
?>
<strong>This is false.</strong>
<?php
}
?>
if(){〜}else{〜}の構文ですが、「〜」の処理で一度 PHP を抜け出して地の HTML になり、また PHP 内でのif文の続きのような形なのに、一連の動作が成り立ちます。PHPのマニュアルにはこう書いてあります。
このコードは期待通りに動作します。これは、PHPが?> および <?phpの中のテキストをecho()命令として処理す るためです。
つまり、PHP を抜け出しているようでいて、実は一連の動作はすべて PHP 内で処理されているのです。
このことを早い段階で知っていたら、もう少し違った書き方をしていたかも知れません。
また、マニュアルには、終了タグ ?>には自動的に「;」が付加されているものとして取り扱うことや、ファイルの終端では終了タグはあってもなくてもいいことが書いてあります(PHPマニュアル 第 10章基本的な構文参照)。
今少し触れましたが、命令はC言語と同様に「;」で終了します。基本的には必ず付けます(命令の分離)。
さて、授業評価システムにおいて個人確認をする PHP で作られたページは以下のようになりました。
続きを読む
2006年07月09日
授業評価システム内容(5)表紙画面を作ってみる
授業評価システム内容(1)データベース設計
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
そろそろアプリケーション作りを考えていきます。まずは表紙です。
最初の「index.html」は「授業評価システム」と表示され、「学年・クラス・番号」を入力して送信するという動作を考えています。学籍番号そのものを入力させることも考えましたが、まだ生徒本人が学籍番号を憶えていないので止めました。学籍番号とパスワードのセットを入力するのがベストだと思います。
入力の動作を考えると、ドロップダウンで学年やクラスを選択するのが良さそうです。しかし、出席番号は1から40まであるのでドロップダウンでは長すぎます。キーボードから入力してもらいましょう。
form 文を使って以下のようなソースを作りました。
最初の
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
はドキュメントタイプの宣言ですね。
head の中の
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
では、Windows ベースで作るので、シフトJIS であることを言っています。
<form action="kojin.php" method="post">
</form>
の間が入力のフォーム文です。
action="kojin.php"
は submit をしたときに呼び出されるページを表しています。
method="post"
は、データを送信する方式が post であることを示しています。他にも get もあります。get は色々と制約があるので post が良いようです。
学年:
ここがドロップダウンリストになっています。select 文を使います。ややこしいですが、<option>と</option>で括った「3」が画面上に表示されます。この「3」を選ぶと、「nen」と名前を付けたものとしてvalue="3"の部分の「3」が値としてセットされます。つまり「nen = 3」となります。
クラス:
これは以前に書いたデータベース内部処理での値にしているためです。また「Z」の「9」はメンテナンス用として作ったものです。あまり関係ありません。
番号<input type="text" name="shussekibango" size="2">(半角)
番号は直接入力するため type="text" としてテキストボックスを表示させます。サイズは size="2" です。ここで「39」などと入力すると、「shussekibango = 39」ということになります。
<input type="submit" value="送信">
<input type="reset" value="リセット">
これによって「送信」と表示されたボタンと「リセット」と書かれたボタンが並びます。「送信」ボタンを押すと「submit」されたことになり、例えば
nen=1
class=8
shussekiban=39
という値をセット、post して、「kojin.php」を呼び出します。「リセット」ボタンを押すと<form>内の値が初期値に戻ります。
これを画面表示すると以下のようになります(ここで送信ボタンを押しても何もなりません)。
単純ですが、最初の画面はこれで良さそうです。
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
授業評価システム内容(4)データ修正
そろそろアプリケーション作りを考えていきます。まずは表紙です。
最初の「index.html」は「授業評価システム」と表示され、「学年・クラス・番号」を入力して送信するという動作を考えています。学籍番号そのものを入力させることも考えましたが、まだ生徒本人が学籍番号を憶えていないので止めました。学籍番号とパスワードのセットを入力するのがベストだと思います。
入力の動作を考えると、ドロップダウンで学年やクラスを選択するのが良さそうです。しかし、出席番号は1から40まであるのでドロップダウンでは長すぎます。キーボードから入力してもらいましょう。
form 文を使って以下のようなソースを作りました。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>授業評価システム</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <div align=center><h1>授業評価システム</h1> <p>学年・クラス・番号を入力してください</p> <form action="kojin.php" method="post"> <p> 学年: <select name="nen"> <option value="3">3</option> <option value="2">2</option> <option value="1">1</option> </select> クラス: <select name="class"> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> <option value="4">D</option> <option value="5">E</option> <option value="6">F</option> <option value="7">G</option> <option value="8">H</option> <option value="9">Z</option> </select> 番号<input type="text" name="shussekibango" size="2">(半角) </p> <input type="submit" value="送信"> <input type="reset" value="リセット"> </form> </div> </body> </html> |
最初の
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
はドキュメントタイプの宣言ですね。
head の中の
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
では、Windows ベースで作るので、シフトJIS であることを言っています。
<form action="kojin.php" method="post">
</form>
の間が入力のフォーム文です。
action="kojin.php"
は submit をしたときに呼び出されるページを表しています。
method="post"
は、データを送信する方式が post であることを示しています。他にも get もあります。get は色々と制約があるので post が良いようです。
学年:
<select name="nen"><option value="3">3</option></select>
<option value="2">2</option>
<option value="1">1</option>
ここがドロップダウンリストになっています。select 文を使います。ややこしいですが、<option>と</option>で括った「3」が画面上に表示されます。この「3」を選ぶと、「nen」と名前を付けたものとしてvalue="3"の部分の「3」が値としてセットされます。つまり「nen = 3」となります。
クラス:
<select name="class">ここは同様ですが、表示で「A」となっているものが選択されると「class」の値が「1」に、つまり「class = 1」になります。「B」が選択されると「class」の値が「2」なります。<option value="1">A</option></select>
<option value="2">B</option>
<option value="3">C</option>
<option value="4">D</option>
<option value="5">E</option>
<option value="6">F</option>
<option value="7">G</option>
<option value="8">H</option>
<option value="9">Z</option>
これは以前に書いたデータベース内部処理での値にしているためです。また「Z」の「9」はメンテナンス用として作ったものです。あまり関係ありません。
番号<input type="text" name="shussekibango" size="2">(半角)
番号は直接入力するため type="text" としてテキストボックスを表示させます。サイズは size="2" です。ここで「39」などと入力すると、「shussekibango = 39」ということになります。
<input type="submit" value="送信">
<input type="reset" value="リセット">
これによって「送信」と表示されたボタンと「リセット」と書かれたボタンが並びます。「送信」ボタンを押すと「submit」されたことになり、例えば
nen=1
class=8
shussekiban=39
という値をセット、post して、「kojin.php」を呼び出します。「リセット」ボタンを押すと<form>内の値が初期値に戻ります。
これを画面表示すると以下のようになります(ここで送信ボタンを押しても何もなりません)。
授業評価システム 学年・クラス・番号を入力してください . |
単純ですが、最初の画面はこれで良さそうです。
2006年07月08日
授業評価システム内容(4)データ修正
授業評価システム内容(1)データベース設計
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
実は、以前に取り込んだデータには不必要なものが入っていました。
講座受講データの中には授業評価とは関係のない「朝SHR」があるのです。
また、教員マスターには転勤・退職された先生も入っています。
後者に関しては、検索条件には出てこないので、特に問題はありませんが、前者は評価対象として表示されてしまって具合がよくありません。
そこで、朝SHRの受講データの削除をしてみます。
SHRは「9100000」以上「9400000」未満と分かっています。そこで、次のようなSQLを使いました。
mysql> DELETE FROM
-> kozajuko
-> WHERE
-> koza_bango BETWEEN 9100000 AND 9399999
-> ;
Query OK, 1900 rows affected (0.02 sec)
生徒の受講データから1900のデータが削除されました。
さて、ここで一つ問題が発生しました。
続きを読む
授業評価システム内容(2)テーブル作成インポート
授業評価システム内容(3)SQLのテスト
実は、以前に取り込んだデータには不必要なものが入っていました。
講座受講データの中には授業評価とは関係のない「朝SHR」があるのです。
また、教員マスターには転勤・退職された先生も入っています。
後者に関しては、検索条件には出てこないので、特に問題はありませんが、前者は評価対象として表示されてしまって具合がよくありません。
そこで、朝SHRの受講データの削除をしてみます。
SHRは「9100000」以上「9400000」未満と分かっています。そこで、次のようなSQLを使いました。
mysql> DELETE FROM
-> kozajuko
-> WHERE
-> koza_bango BETWEEN 9100000 AND 9399999
-> ;
Query OK, 1900 rows affected (0.02 sec)
生徒の受講データから1900のデータが削除されました。
さて、ここで一つ問題が発生しました。
続きを読む
2006年07月06日
授業評価システム内容(3)SQLのテスト
授業評価システム内容(1)データベース設計
授業評価システム内容(2)データベース作成とテーブル作成、インポート
データが入ったので、まずは勉強中のSQLを実行してみます。
分かっている学籍番号から生徒氏名を表示させてみます。
mysql> select * from kisomaster where bango='(学籍番号)';
+----------+-------------+
| bango | namae |
+----------+-------------+
|(学籍番号)| 情報 太郎 |
+----------+-------------+
1 row in set (0.00 sec)
ちゃんと(学籍番号)に対応する氏名が表示されます。
次に、その学籍番号の生徒の学年、クラス、番号を表示させます。
mysql> select * from zaiseki,kisomaster
-> where zaiseki.bango = kisomaster.bango and zaiseki.bango = (学籍番号)
-> ;
+----------+---------+------+-------------+----------+-------------+
| bango | gakunen | kumi | shussekiban | bango | namae |
+----------+---------+------+-------------+----------+-------------+
|(学籍番号)| 1 | 8 | 39 |(学籍番号)| 情報 太郎 |
+----------+---------+------+-------------+----------+-------------+
1 row in set (0.01 sec)
続きを読む
授業評価システム内容(2)データベース作成とテーブル作成、インポート
データが入ったので、まずは勉強中のSQLを実行してみます。
分かっている学籍番号から生徒氏名を表示させてみます。
mysql> select * from kisomaster where bango='(学籍番号)';
+----------+-------------+
| bango | namae |
+----------+-------------+
|(学籍番号)| 情報 太郎 |
+----------+-------------+
1 row in set (0.00 sec)
ちゃんと(学籍番号)に対応する氏名が表示されます。
次に、その学籍番号の生徒の学年、クラス、番号を表示させます。
mysql> select * from zaiseki,kisomaster
-> where zaiseki.bango = kisomaster.bango and zaiseki.bango = (学籍番号)
-> ;
+----------+---------+------+-------------+----------+-------------+
| bango | gakunen | kumi | shussekiban | bango | namae |
+----------+---------+------+-------------+----------+-------------+
|(学籍番号)| 1 | 8 | 39 |(学籍番号)| 情報 太郎 |
+----------+---------+------+-------------+----------+-------------+
1 row in set (0.01 sec)
続きを読む
授業評価システム内容(2)データベース作成とテーブル作成、インポート
前回
授業評価システム内容(1)データベース設計
データベースの設計が済んだら、実際にテーブルを作成します。その前に、「データベース」を作ります。
mysql.exe -u root -p
で MySQL monitor をユーザーrootで起動してパスワードを入れます。
mysql> create databese gakuseki;
と入力して「gakuseki」データベースを作成します。
mysql> use gakuseki;
と入力して「gakuseki」を使うぞと指定します。その後、
mysql> create table kisomaster (bango int,shimei char(30));
mysql> create table zaiseki (bango int, gakunen int, kumi char(8), shussekiban int);
mysql> create table shokuinmaster (shokuin_bango int,shokuin_mei char(30));
mysql> create table kozatanto (shokuin_bango int,koza_bango int);
mysql> create table kozadata (koza_bango int,kamoku_bango int);
mysql> create table kozadata (koza_bango int,kamoku_bango int,kozamei char(30));
mysql> create table kozajuko (koza_bango int,bango int,kaishi date,owari date);
mysql> CREATE TABLE hyoka_test (renban int,tourokubi date,bango int,koza_bango int,question int,answer1 int,answer2 text);
と入力して、すべてのテーブルを作成します。本当はここまでも紆余曲折がありましたが、省略します。実はこのときはインデックス等は考えていませんでした。
ここで「show tables;」と入力すると、
mysql> show tables;
+--------------------+
| Tables_in_gakuseki |
+--------------------+
| hyoka_test |
| kamokudata |
| kisomaster |
| kozadata |
| kozajuko |
| kozatanto |
| shokuinmaster |
| zaiseki |
+--------------------+
8 rows in set (0.11 sec)
と表示され、テーブルが作成されていることが確認できます。
次にはデータの流し込みです。学籍システムから落としたCSVファイルを、MySQL に取り込まなければなりません。ところがここでつまづきました。コマンドとしては分かります。
MySQL がインストールされているdataフォルダ、ここでは c:\mysql\data\(データベース名) フォルダに取り込むファイルをコピーしておき、
LOAD DATA INFILE 'ファイル名' INTO TABLE テーブル名;
で流し込むことができるはずです。しかしなぜかうまくとりこめません。そう、MySQL で取り込むには、CSV ではなく、タブ区切りのファイルでなければならなかったのです。学籍システムがCSVで出したり入れたりしていたので、なぜかそのままできるような錯覚をしていたのです。
エクセルで保存する際「テキスト(タブ区切り)(*.txt)」を選ぶひつようがあります。
私は正規表現の使えるエディタ(秀丸エディタとさくらエディタを併用しています)で、「,」を「\t」で置換します。
mysql> load data infile 'gakusekikiso.txt' into table kisomaster;
などと入力します。
これでようやくとりこむことができました。前述の文字化けの問題と、この問題で最初の段階で2日ほど躓いていました。
授業評価システム内容(1)データベース設計
データベースの設計が済んだら、実際にテーブルを作成します。その前に、「データベース」を作ります。
mysql.exe -u root -p
で MySQL monitor をユーザーrootで起動してパスワードを入れます。
mysql> create databese gakuseki;
と入力して「gakuseki」データベースを作成します。
mysql> use gakuseki;
と入力して「gakuseki」を使うぞと指定します。その後、
mysql> create table kisomaster (bango int,shimei char(30));
mysql> create table zaiseki (bango int, gakunen int, kumi char(8), shussekiban int);
mysql> create table shokuinmaster (shokuin_bango int,shokuin_mei char(30));
mysql> create table kozatanto (shokuin_bango int,koza_bango int);
mysql> create table kozadata (koza_bango int,kamoku_bango int);
mysql> create table kozadata (koza_bango int,kamoku_bango int,kozamei char(30));
mysql> create table kozajuko (koza_bango int,bango int,kaishi date,owari date);
mysql> CREATE TABLE hyoka_test (renban int,tourokubi date,bango int,koza_bango int,question int,answer1 int,answer2 text);
と入力して、すべてのテーブルを作成します。本当はここまでも紆余曲折がありましたが、省略します。実はこのときはインデックス等は考えていませんでした。
ここで「show tables;」と入力すると、
mysql> show tables;
+--------------------+
| Tables_in_gakuseki |
+--------------------+
| hyoka_test |
| kamokudata |
| kisomaster |
| kozadata |
| kozajuko |
| kozatanto |
| shokuinmaster |
| zaiseki |
+--------------------+
8 rows in set (0.11 sec)
と表示され、テーブルが作成されていることが確認できます。
次にはデータの流し込みです。学籍システムから落としたCSVファイルを、MySQL に取り込まなければなりません。ところがここでつまづきました。コマンドとしては分かります。
MySQL がインストールされているdataフォルダ、ここでは c:\mysql\data\(データベース名) フォルダに取り込むファイルをコピーしておき、
LOAD DATA INFILE 'ファイル名' INTO TABLE テーブル名;
で流し込むことができるはずです。しかしなぜかうまくとりこめません。そう、MySQL で取り込むには、CSV ではなく、タブ区切りのファイルでなければならなかったのです。学籍システムがCSVで出したり入れたりしていたので、なぜかそのままできるような錯覚をしていたのです。
エクセルで保存する際「テキスト(タブ区切り)(*.txt)」を選ぶひつようがあります。
私は正規表現の使えるエディタ(秀丸エディタとさくらエディタを併用しています)で、「,」を「\t」で置換します。
mysql> load data infile 'gakusekikiso.txt' into table kisomaster;
などと入力します。
これでようやくとりこむことができました。前述の文字化けの問題と、この問題で最初の段階で2日ほど躓いていました。
2006年07月04日
授業評価システム内容(1)データベース設計
インストールは済んだところから話を始めます。
最初はデータベースの設計です。取りあえず、取り込むデータがありますので、それに合わせて設計しました。
学籍システムから取り出したデータは、
学籍基礎マスター(学籍番号と生徒氏名)
職員マスター(職員番号と職員氏名)
在籍データ(学籍番号と学年・クラス・番号)
受講データ(学籍番号と講座番号)
などなど、7つに分かれています。普通に考えれば生徒に関して、
学籍番号 学年 クラス 番号 名前
がセットになっていておかしくないのですが、システムとしては、同じ生徒が年度が替わったことにより学年・クラス・番号が変更になるのでその辺も切り分けたいようです。つまり第三正規化まで行われた状態です。
これらと、授業評価の結果を入れるテーブルを用意することにしました。
それぞれのテーブル内のフィールドは以下のような形です。
のように設計しました。本来キーとなる列はNULLを許さないようにするのが普通でしょうから「Yes」じゃいけないのでしょうけど、取りあえず動けばいい、という最低条件ということで。
単純なテーブルタグだと汚いですねぇ。CSSいじらないといけないようですが、良く分かってない……。
最初はデータベースの設計です。取りあえず、取り込むデータがありますので、それに合わせて設計しました。
学籍システムから取り出したデータは、
学籍基礎マスター(学籍番号と生徒氏名)
職員マスター(職員番号と職員氏名)
在籍データ(学籍番号と学年・クラス・番号)
受講データ(学籍番号と講座番号)
などなど、7つに分かれています。普通に考えれば生徒に関して、
学籍番号 学年 クラス 番号 名前
がセットになっていておかしくないのですが、システムとしては、同じ生徒が年度が替わったことにより学年・クラス・番号が変更になるのでその辺も切り分けたいようです。つまり第三正規化まで行われた状態です。
これらと、授業評価の結果を入れるテーブルを用意することにしました。
kisomaster | 学籍番号と生徒名 |
shokuinmaster | 職員番号と職員名 |
zaiseki | 学年、クラス、出席番号 |
kamokudata | 科目データ |
kozadata | 講座データ |
kozatanto | 講座と担当職員 |
kozajuko | 講座と学籍番号 |
hyoka_test | 授業評価結果 |
それぞれのテーブル内のフィールドは以下のような形です。
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
bango | int(11) | YES | MUL | NULL | 学籍番号 | |
namae | char(30) | YES | NULL | 生徒氏名 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
shokuin_bango | int(11) | YES | MUL | NULL | 職員番号 | |
shokuin_mei | char(30) | YES | NULL | 職員名 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
bango | int(11) | YES | NULL | 学籍番号 | ||
gakunen | int(11) | YES | NULL | 学年 | ||
kumi | char(8) | YES | NULL | クラス | ||
shussekiban | int(11) | YES | NULL | 出席番号 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
kamoku_bango | int(11) | YES | MUL | NULL | 科目番号 | |
kamoku_mei | char(30) | YES | NULL | 科目名 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
koza_bango | int(11) | YES | MUL | NULL | 講座番号 | |
kamoku_bango | int(11) | YES | NULL | 科目番号 | ||
kozamei | char(30) | YES | NULL | 講座名 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
shokuin_bango | int(11) | YES | NULL | 職員番号 | ||
koza_bango | int(11) | YES | MUL | NULL | 講座番号 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
bango | int(11) | YES | NULL | 学籍番号 | ||
koza_bango | int(11) | YES | MUL | NULL | 講座番号 | |
kaishi | date | YES | NULL | 開始日 | ||
owari | date | YES | NULL | 終了日 |
Field | Type | Null | Key | Default | Extra | 備考 |
---|---|---|---|---|---|---|
renban | int(11) | MUL | NULL | auto_increment | 自動連番 | |
tourokubi | date | YES | NULL | データ登録日 | ||
bango | int(11) | YES | NULL | 学籍番号 | ||
koza_bango | int(11) | YES | NULL | 講座番号 | ||
question | int(11) | YES | NULL | 設問番号 | ||
answer1 | int(11) | YES | NULL | 解答1(数値) | ||
answer2 | text | YES | NULL | 解答2(文字列) |
のように設計しました。本来キーとなる列はNULLを許さないようにするのが普通でしょうから「Yes」じゃいけないのでしょうけど、取りあえず動けばいい、という最低条件ということで。
単純なテーブルタグだと汚いですねぇ。CSSいじらないといけないようですが、良く分かってない……。
2006年07月01日
授業評価システムの操作画面
授業評価システムがどんな感じか、まず画面で説明します。
校内に置かれたサーバにブラウザでアクセスするために、共有フォルダにショートカットを置いておきます。授業が始まったらPCを起動し、このアイコンをダブルクリックすることで最初の画面が表示されます。

ここで、自分の学年・クラス・番号を選択・入力して「送信」ボタンをクリックします。この操作に何の説明も必要ありません。すると「次の生徒でよろしいですか」と自分の名前が表示されます。正しければ「はい、そうです」、間違っていたら「やり直し」ボタンを押します。

必修・選択・LHRが担当の先生の名前と共に表示されます。質問1〜5を選択で答え、自由記述欄に自由に記述します。

すべて解答して、最後の「送信」ボタンを押すと登録完了です。

一つの講座に質問が5つ、自由記述欄が1つ、計6件のデータとなります。3年生の少ない生徒で13講座分、1年生は19講座分ありますので、一人70〜120件のデータです。一クラス3000件〜5000件になります。全24クラスでは90000件を越えるかも知れません。
全部が終わったらまるまるテキストファイルに落としてエクセルで処理することも考えましたが、エクセルは65536行までしか扱えないので、出力のスクリプトも考える必要があります。
校内に置かれたサーバにブラウザでアクセスするために、共有フォルダにショートカットを置いておきます。授業が始まったらPCを起動し、このアイコンをダブルクリックすることで最初の画面が表示されます。

ここで、自分の学年・クラス・番号を選択・入力して「送信」ボタンをクリックします。この操作に何の説明も必要ありません。すると「次の生徒でよろしいですか」と自分の名前が表示されます。正しければ「はい、そうです」、間違っていたら「やり直し」ボタンを押します。

必修・選択・LHRが担当の先生の名前と共に表示されます。質問1〜5を選択で答え、自由記述欄に自由に記述します。

すべて解答して、最後の「送信」ボタンを押すと登録完了です。

一つの講座に質問が5つ、自由記述欄が1つ、計6件のデータとなります。3年生の少ない生徒で13講座分、1年生は19講座分ありますので、一人70〜120件のデータです。一クラス3000件〜5000件になります。全24クラスでは90000件を越えるかも知れません。
全部が終わったらまるまるテキストファイルに落としてエクセルで処理することも考えましたが、エクセルは65536行までしか扱えないので、出力のスクリプトも考える必要があります。
2006年06月29日
授業評価システムが一応完成
データベースを勉強して、授業評価システムを作っていました。一応完成しました。
表紙はこんな感じです。

東京都は「生徒による授業評価」というものを実施しており、年に複数回、受講している授業について生徒が評価をすることになっています。
普通の学校は、例えば質問項目が印刷された紙に受講講座名と評価を書き、回収されたものを講座ごとに短冊状に細かく切り、各先生ごとに分けて渡すのでしょうか。前任校ではそうしていました。
本校の昨年度のやり方はマークシートでした。ちょっとした規模の学校はマークシートを使うのでしょうか。3桁の講座のコード、教員コード、質問の答えをマークして回収。コンピュータ処理をする方法です。
昨年度もこのまとめをする担当をしました。実はこのマークシート方式も楽ではないのです。まず、マークがきちんとされていないのです。読み込みに多数のエラーが出ます。またマークミスがあります。情報の教員なのに家庭科を教えていたり(1ずれた数ですね)、あり得ない解答番号をマークしていたり……。
処理も大変です。1000人分のマークシートを読み込むだけで、実は数時間かけます。読み込んだデータは「0,1,1,0,0,0,1,1,……」とマークされた部分が「0」と「1」が並んでいるだけなので、それを意味のあるものに加工・整形しなければなりません。その上で、教科・科目・担当教員ごとにソートして切り分ける等の作業があります。昨年度はおかげで ExcelVBA の勉強をすることができました。
さて、本年、学籍システムが新しくなり、無事動いていますが、その元データとはまさに、各生徒が何の講座を受講しているのか、というものです。それを利用すれば、生徒が決まれば受講している講座を確定して表示させるシステムを作れるではないか、というのが今回授業評価システムを作ろうと思ったきっかけです。
なぜシステムなのかというと、本校は単位制、3年生ともなれば選択している科目がバラバラで、システム側で表示させないと対応しきれないからです。
ずいぶん前からそれを実現する一番よい方法を考えていました。ちょっとVBAを作り込んだエクセルのファイルを配布して入力してもらう方法も考えました。しかし、DB + Web でないといろいろ問題がある(これはこれで問題があります)ことがわかりました。
それでは、IIS + ASP(またはASP.NET) + SQL Server でいくのか、Apache + PHP + MySQL でいくのか絞られます。両方ターゲットにしばらく勉強していました。まず、ASP は無くなりました。なぜなら、生徒がアクセスできるサーバに、ASP + SQL Server の環境がなかったからです。有償のソフトウェアなので予算がありません。次に、ASP.NET + SQL Server Express Edition は無償で入手できますが、いかんせん、クラスを作ってどうのこうのが理解できません。いえ、それ以上に本屋さんに資料が無さ過ぎました。勉強することができないのです。
そこで、Apache + PHP + MySQL で行こうと決めました。以前から勉強していたこともあり、なんとかいけそうだ、という感触を持っていたからです。
勉強・研究にずいぶん時間がかかりました。最後の方の開発はほとんど睡眠時間を取らずに完成させました。今のところ問題なく稼働しています。技術的なことはまた項を改めて書きたいと思います。
表紙はこんな感じです。

東京都は「生徒による授業評価」というものを実施しており、年に複数回、受講している授業について生徒が評価をすることになっています。
普通の学校は、例えば質問項目が印刷された紙に受講講座名と評価を書き、回収されたものを講座ごとに短冊状に細かく切り、各先生ごとに分けて渡すのでしょうか。前任校ではそうしていました。
本校の昨年度のやり方はマークシートでした。ちょっとした規模の学校はマークシートを使うのでしょうか。3桁の講座のコード、教員コード、質問の答えをマークして回収。コンピュータ処理をする方法です。
昨年度もこのまとめをする担当をしました。実はこのマークシート方式も楽ではないのです。まず、マークがきちんとされていないのです。読み込みに多数のエラーが出ます。またマークミスがあります。情報の教員なのに家庭科を教えていたり(1ずれた数ですね)、あり得ない解答番号をマークしていたり……。
処理も大変です。1000人分のマークシートを読み込むだけで、実は数時間かけます。読み込んだデータは「0,1,1,0,0,0,1,1,……」とマークされた部分が「0」と「1」が並んでいるだけなので、それを意味のあるものに加工・整形しなければなりません。その上で、教科・科目・担当教員ごとにソートして切り分ける等の作業があります。昨年度はおかげで ExcelVBA の勉強をすることができました。
さて、本年、学籍システムが新しくなり、無事動いていますが、その元データとはまさに、各生徒が何の講座を受講しているのか、というものです。それを利用すれば、生徒が決まれば受講している講座を確定して表示させるシステムを作れるではないか、というのが今回授業評価システムを作ろうと思ったきっかけです。
なぜシステムなのかというと、本校は単位制、3年生ともなれば選択している科目がバラバラで、システム側で表示させないと対応しきれないからです。
ずいぶん前からそれを実現する一番よい方法を考えていました。ちょっとVBAを作り込んだエクセルのファイルを配布して入力してもらう方法も考えました。しかし、DB + Web でないといろいろ問題がある(これはこれで問題があります)ことがわかりました。
それでは、IIS + ASP(またはASP.NET) + SQL Server でいくのか、Apache + PHP + MySQL でいくのか絞られます。両方ターゲットにしばらく勉強していました。まず、ASP は無くなりました。なぜなら、生徒がアクセスできるサーバに、ASP + SQL Server の環境がなかったからです。有償のソフトウェアなので予算がありません。次に、ASP.NET + SQL Server Express Edition は無償で入手できますが、いかんせん、クラスを作ってどうのこうのが理解できません。いえ、それ以上に本屋さんに資料が無さ過ぎました。勉強することができないのです。
そこで、Apache + PHP + MySQL で行こうと決めました。以前から勉強していたこともあり、なんとかいけそうだ、という感触を持っていたからです。
勉強・研究にずいぶん時間がかかりました。最後の方の開発はほとんど睡眠時間を取らずに完成させました。今のところ問題なく稼働しています。技術的なことはまた項を改めて書きたいと思います。