IchigoJam+MixJuice(Wi-fiボード)でチャットを体験する、プログラミング教室用Webサイトの作り方です。
IchigoJamでメッセージを入力すると、Webサイトで一覧表示されます。
ペアで互いにやり取りすることもできます。
★注意★ 簡単なプログラムなのでセキュリティを一切考えていません。教室を行う時だけサイトを設置して、終わったら削除や移動をするようにしてください。サイトを置きっぱなしにすると、悪意のある人にアクセスされてデータベースを破壊されたり乗っ取られたりする危険性があります。
上記の乗っ取りなどを防ぐために、教室内にサーバーPCとWi-fiルーターを置いて、ローカルネット環境で動かすことをお勧めします。
準備
■MySQLのデータベース、テーブル
phpMyAdminなどを使って、チャットのデータを記録するデータベース(例「chat」)を新規に作ります。
その中に「chat」テーブルを作成して、「time」列(datetime型)、「userid」列(text型)、「message」列(text型)、「readsw」列(int型)を作ります。
■ページの設置
www.example.jp/dir/(サイトのアドレス)内に、以下のWebページファイルを設置します。
db_login.php
ログイン情報を入れるファイルです。
dbnameはデータベース名、usernameはデータベースにアクセスするユーザー名、passwordはそのユーザーのパスワードを記述します。
<?php $db_host='localhost'; $db_database='dbname'; $db_username='username'; $db_password='password'; ?>
index.php
チャットの一覧表を表示するWebページです。5秒ごとに表示が自動更新されます。
行表示の順番を「時間順」(時間昇順)/「最新順」(時間降順)で切り替えられます。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>Ichigoチャット</title> <link rel="stylesheet" href="styles.css" type="text/css" /> <meta http-equiv="refresh" content="5; URL="> </head> <body> <h1>Ichigoチャット</h1> <?php // ログイン情報のインクルード include('db_login.php'); // データベースサーバーへ接続 $connection = mysqli_connect($db_host, $db_username, $db_password, $db_database); if (!$connection) { die ("DB接続エラー<br />". mysql_error()); } $strSort = "0"; if (isset($_GET['SORT'])) { $strSort = $_GET['SORT']; } // === chatテーブルからタイムライン === // タイムラインクエリを作成 $query = "SELECT * FROM chat ORDER BY time"; if ($strSort == "1") { $query = "SELECT * FROM chat ORDER BY time DESC"; } // クエリを実行 $result = mysqli_query($connection, $query); if (!$result) { die ("DBクエリエラー<br />". mysql_error()); } // 結果から一覧表を表示 echo "<table>\r\n"; echo "<tr><th class='time'>Time</th><th class='userid'>UserID</th><th>Message</th><th>ReadSW</th></tr>\r\n"; foreach ($result as $row) { echo "<tr><td>" . $row['time'] . "</td><td>" . $row['userid'] . "</td><td>" . $row['message'] . "</td>"; if ($row['readsw']=="0") { echo "<td>未読</td>"; } else { echo "<td>既読</td>"; } echo "</tr>\r\n"; } echo "</table>\r\n"; echo "<form action='index.php'>\r\n"; echo "<select name='SORT'>\r\n"; if ($strSort == "0") { echo "<option value='0'>時間順</option>\r\n"; } else { echo "<option value='0' selected>時間順</option>\r\n"; } if ($strSort == "1") { echo "<option value='1'>最新順</option>\r\n"; } else { echo "<option value='1' selected>最新順</option>\r\n"; } echo "</select>\r\n"; echo "<input type='submit' value='再ソート'>\r\n"; echo "</form>\r\n"; // === 終了処理 === // データベース接続を閉じる mysqli_close($connection); ?> </body> </html>
styles.css
一覧表ページの見栄えを設定するスタイルシートです。お好みで改造してください。
html { background-color: #FFFFFF; font-family: sans-serif; } body { margin: 20px auto 10px auto; width: 920px; text-align: center; font-size: middle; line-height: 1.3em; color: #000000; } h1 { height: 40px; margin: 0px; padding-left: 10px; font-size: 18pt; line-height: 40px; color: #000000; } table { margin: 10px auto 10px auto; border-style: solid; border: 2px solid #8888ff; } th { text-align: center; font-size: 14pt; padding: 2px; border: 1px solid #8888ff; } td { font-size: 14pt; padding: 2px; border: 1px solid #8888ff; }
send.php
IchigoJam+MixJuiceから送られてきたチャットのデータを、データベースに書き込むWebページです。
「receive.log」にアクセスログが出力されます。もしデータベース接続エラーなどが出た場合は、このログを参照してください。
IchigoJam+MixJuiceから来る文字列は文字コードがShift-JISなのですが、このページ内でUTF-8に変換してデータベースに記録しています。これでカタカナもちゃんと記録・表示されます。
<?php // ログイン情報のインクルード include('db_login.php'); // データ受信 if (isset($_GET['MES'])) { $strID = $_GET['ID']; $strMes = $_GET['MES']; $strMes = mb_convert_encoding($strMes, "UTF-8", "SJIS"); // ログファイルの相対パス $strDataFilePath = 'receive.log'; // ログファイルを追記モードでオープン $fp = fopen($strDataFilePath, "a"); // 日付、時刻を取得 date_default_timezone_set('Asia/Tokyo'); $dt = new DateTime(); $strDateTime = $dt->format('Y-m-d H:i:s'); // 受信した値をログファイルに書き込み fwrite($fp, $strDateTime . ',Send,ID=' . $strID . ',Mes=' . $strMes . "\r\n"); // データベースサーバーへ接続 $connection = mysqli_connect($db_host, $db_username, $db_password, $db_database); if (!$connection) { fwrite($fp, "DB接続エラー\r\n"); } // === chatテーブルを更新 === // データ更新クエリを作成 $query = "INSERT INTO chat SET time='$strDateTime', userid='$strID', message='$strMes', readsw='0'"; // クエリを実行 $result = mysqli_query($connection, $query); if (!$result) { fwrite($fp, "データ更新エラー\r\n"); } // === 終了処理 === // データベース接続を閉じる mysqli_close($connection); // ログファイルポインタをクローズ fclose($fp); } ?>
read.php
IchigoJamからのリクエストに応じて、データベースからチャットの文字列を出力するWebページです。
「receive.log」にアクセスログが出力されます。もしデータベース接続エラーなどが出た場合は、このログを参照してください。
<?php // ログイン情報のインクルード include('db_login.php'); // データ受信 if (isset($_GET['ID'])) { $strParas = $_GET['ID']; $strID = $strParas; // ログファイルの相対パス $strDataFilePath = 'receive.log'; // ログファイルを追記モードでオープン $fp = fopen($strDataFilePath, "a"); // 日付、時刻を取得 date_default_timezone_set('Asia/Tokyo'); $dt = new DateTime(); $strDateTime = $dt->format('Y-m-d H:i:s'); // 受信した値をログファイルに書き込み fwrite($fp, $strDateTime . ',Request,ID=' . $strID . "\r\n"); // データベースサーバーへ接続 $connection = mysqli_connect($db_host, $db_username, $db_password, $db_database); if (!$connection) { fwrite($fp, "DB接続エラー\r\n"); } // === chatテーブルから読み取り === // データ読み取りクエリを作成 $query = "SELECT * FROM chat WHERE userid='$strID' AND readsw='0' ORDER BY time LIMIT 1"; // クエリを実行 $result = mysqli_query($connection, $query); if (!$result) { fwrite($fp, "データ読み取りエラー\r\n"); } foreach ($result as $row) { if ($row['readsw'] == "0") { $strMes = mb_convert_encoding($row['message'], "SJIS", "UTF-8"); echo $strMes . "\r\n"; $query = "UPDATE chat SET readsw='1' WHERE userid='$strID' AND readsw='0' ORDER BY time LIMIT 1"; $result = mysqli_query($connection, $query); if (!$result) { fwrite($fp, "データ変更エラー\r\n"); } else { fwrite($fp, $strDateTime . ',Update,ID=' . $strID . ',ReadSW=1' . "\r\n"); } } } // === 終了処理 === // データベース接続を閉じる mysqli_close($connection); // ログファイルをクローズ fclose($fp); } ?>
教室での使い方
(1)IchigoJam+MixJuiceを動かして、Wi-fiアクセスポイントに接続します。
?”MJ APC ssid password”
ssidはWi-fiアクセスポイントのSSID、passwordはパスワードです。ちゃんと接続するまで1分ほど待ってください。
(一度接続するとその設定が記憶され、次回は入力しなくても自動接続されます)
(2)教室内で、メッセージをやり取りするペアを決めます。
(3)以下のチャットプログラムを入力して実行します。
10 CLS 20 ?:?"(SEND)" 30 INPUT "",M 40 A=#900+POS()-33:L=0 50 A=A+1:C=PEEK(A) 60 IF C>0 L=L+1:[L]=C:GOTO 50 70 IF L=0 GOTO 130 80 ?"MJ GET www.example.jp/dir/SEND.PHP?ID=UEDA01&MES="; 90 FOR C=1 TO L 100 D=[C]:IF D=32 D=95 110 ?CHR$(D); 120 NEXT:?:WAIT 180 130 CLK 140 ?:?"MJ GET www.example.jp/dir/READ.PHP?ID=UEDA02" 150 WAIT 60:C=INKEY() 160 IF !C GOTO 20 170 ?:?"(READ)" 180 ?CHR$(C);:C=INKEY() 190 IF C GOTO 180 200 ?:GOTO 20
80行の「UEDA01」は自分のユーザーID、140行の「UEDA02」はペア相手のユーザーIDです。それぞれのIchigoJamで別のIDにしてください。
- 実行すると「(SEND)」(送信)と表示されるので、1行でメッセージを入力して、Enterキーを押すと送信されます。(2行以上入力すると最後の行だけ送信されます)。
- メッセージはカタカナも使えますが、IchigoJamの記号文字(人形・音符・イチゴマークなど)は使えません(文字化けします)。
- スペース(空白)は「_」(下線、アンダースコア)に変換されて送信されます。
- 送信後は、「(READ)」(受信)と表示されて、ペア相手のメッセージを受信します。未読メッセージのうちで一番古いものが1件受信されます。未読が無い時は受信しません。
- 「(SEND)」に戻って、くり返します。
- 「(SEND)」の入力待ちでEnterキーだけ押すと、送信をスキップして「(READ)」へ行きます。ペア相手が複数のメッセージを投稿している時は、この手順で順番に未読分を受信してください。
(4)PCのブラウザで一覧表ページ「www.example.jp/dir/index.php」を開くと、チャットの一覧が確認できます。
この画面をスクリーンなどに映して、教室内で共有するといいでしょう。
※「ReadSW」は、メッセージが登録された時は「未読」、送信先の相手がそのメッセージを読み取ると「既読」になります。
●進め方としては、プログラミングを2段階にしても良いです
まずプログラムの送信部分を入力します。
10 CLS 20 ?:?"(SEND)" 30 INPUT "",M 40 A=#900+POS()-33:L=0 50 A=A+1:C=PEEK(A) 60 IF C>0 L=L+1:[L]=C:GOTO 50 70 IF L=0 GOTO 130 80 ?"MJ GET www.example.jp/dir/SEND.PHP?ID=UEDA01&MES="; 90 FOR C=1 TO L 100 D=[C]:IF D=32 D=95 110 ?CHR$(D); 120 NEXT:?:WAIT 180 130 CLK 200 ?:GOTO 20
これでメッセージを送信して、一覧表画面で確認します。
次に受信部分を追加入力します。
140 ?:?"MJ GET www.example.jp/dir/READ.PHP?ID=UEDA02" 150 WAIT 60:C=INKEY() 160 IF !C GOTO 20 170 ?:?"(READ)" 180 ?CHR$(C);:C=INKEY() 190 IF C GOTO 180
これでペアで送受信することができます。