Mac OSXにはデフォルトで、phpが入っています。(今まで知りませんでした。)
適当なエディタを使ってphpプログラムを作成し、ターミナルで実行してみます。下の図はemacsでhello.phpを作成し、ターミナルで実行してみたところです。
phpの勉強は、僕の授業のページにある「ソフトウェア開発及び演習」のメニューは一つの参考になります。
直接、BusMap2にかかわらなくても、一応、仕組みを理解しておいた方がよいかと思うので、自分用のサーバを立ち上げ、データベースの構造を学んだり、動作をテストする環境を整える実習を行います。
コンテンツマネジメントシステム(CMS)であるXOOPSのインストールを最初に行う必要がありますが、XOOPSはデータベースMySQLを使用します。MySQLはrichard.js.yamanashi.ac.jp共通ですが、これに各自のユーザ登録が必要になります。今年は、共通のユーザ名としてlab-memberを用いることにします。(パスワードやその扱いについては、8日及び11日のゼミの時に説明します。)
http://richard.js.yamanashi.ac.jp/~toyoki/labTips/intro2xoops.html
BusMap2のDBテーブル構成は
richardのデータベースMySQL管理のためのWebツール phpMyAdminへのアクセスは
http://richard.js.yamanashi.ac.jp/phpmyadmin/
研究室ゼミ用のページに書いておいたが、どこにあるかわかりにくいと思うので、ここに再掲する。
それぞれjsonpとして受け取れる。その場合には、下のようにcallback変数に受け取る関数名を与える。
東條君に質問されて、その場ではうまくいかなかったので、ここにメモしておきます。
§9-2にある例をバスマップのxmlデータの処理用に書き直したプログラムです。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> <script type="text/javascript" src="jquery-1.10.1.min.js"></script> <script type="text/javascript"> <!-- $(document).ready(function () { $.ajax({ url: 'BusCategorizedRouteXml.xml', type: 'GET', //cache: false,//キャッシュを行う場合はtrue dataType: 'xml', timeout: 5000, success: function (data) { $(data).find("item").each( function(){ $('#result').append( $('<li></li>').append($(this).attr("name"))); } ); } }); }); /* やっていること: * ajaxでurlで指定したものをリクエスト、 * getできたら、successに指定した関数を実行 * 関数では * データからitemというタグを探し(find)、 * ひとつひとつ(each) <li>タグをつけて、bodyのresult部分に書きだす * をことを行なっている。 */ //--> </script> </head> <body> <ul id="result"></ul> </body> </html>
テキストのyahooJquery.htmlにあるDOMの表現(data.Result[i].Titleのような)はjQuery内の関数ではうまく動かないようです。jQueryらしくyahooJquery2.htmlにあるようにfind(), each()関数はうまく動作します。
なお、jQueryの1.6以降(くらい)では、$.ajaxよりも$.get関数をもちいることが一般的なようです。(よりスマートに書けます。)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> <script type="text/javascript" src="jquery-1.10.1.min.js"></script> <script type="text/javascript"> <!-- $(document).ready(function () { $.get('BusCategorizedRouteXml.xml', function(data) { $(data).find("item").each(function() { $('#result').append( $('<li></li>').append($(this).attr("name"))); }); }); }); //--> </script> </head> <body> <ul id="result"></ul> </body> </html>
8章のyahoo.htmlに相当するサンプルを
http://richard.js.yamanashi.ac.jp/~toyoki/local_test/js2013/getBusRouteXml.html
に置きます。xmlデータを同じディレクトリにおいて、試してみてください。
destination属性も取り出して表示できるようにするといいですね。チャレンジしてください。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>xmlデータの非同期読み込み(バス路線データを例に)</title> <script type="text/javascript"> <!-- function getXHR() { var req; try { req = new XMLHttpRequest(); } catch(e) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { req = new ActiveXObject('Microsoft.XMLHTTP'); } } return req; } function asyncSearch() { var req = getXHR(); req.onreadystatechange = function() { var result = document.getElementById('result'); if (req.readyState == 4) { if (req.status == 200) { var doc = req.responseXML; var nodes = doc.getElementsByTagName('item'); // itemというタグを配列として取り出す if (nodes.length == 0) { result.innerHTML = '合致するサイトはありませんでした。'; } else { var ul = document.createElement('ul'); for (var i = 0; i < nodes.length; i++) { var routeName = nodes[i].getAttribute('name'); // xmlから、name属性を抽出し、routeNameに代入 var li = document.createElement('li'); // listオブジェクトを生成 var textObj =document.createTextNode(routeName); // テキストオブジェクトを生成(内容はrouteNameに入っている文字列) li.appendChild(textObj); ul.appendChild(li); } } result.replaceChild(ul, result.firstChild); //'通信中...'というコンテントを、ul変数に格納されたデータで置き換える。 } else { result.innerHTML = 'サーバエラーが発生しました。'; } } else { result.innerHTML = '通信中...'; } } req.open('GET', 'BusCategorizedRouteXml.xml', true); req.send(null); } // windowが開かれたらasyncSearch関数を実行するようonload属性に関数名を代入 window.onload = asyncSearch; --> </script> </head> <body> yahoo.htmlに対応するサンプル <h2>路線一覧表示</h2> <div id="result"></div> </body> </html>
JSON形式データを生でブラウザで見たとき、日本語文字が化けて見えた件、その情報を送り出す時のヘッダーとして
“Content-type: application/json; charset=utf-8”
としているのだけど、applicationというのが引っかかって、utf-8としてデコードしてくれないのではないかと思います。上のヘッダーは規則どおりなのですが、ブラウザで生にJSONデータをみることは普通はしないので、ブラウザの動作も間違いではないのでしょう。
情報としてはたとえば、http://blog.flatlabs.net/20110304_231535/
最後にちょこっと言ったように、JSONデータのチェック用アドオンを各自のブラウザにいれて、内容をチェックできるようにしておいてください。
メールでも書いたように、第8章関連の練習については、
http://richard.js.yamanashi.ac.jp/~toyoki/labTips/seminar2013.html
に書きました。
http://openplans.org/2012/08/the-openplans-guide-to-gtfs-data/
オープンになっている各地のGTFSデータを解析して、バス運行の特徴を統計的に分析した例。(都市計画に資することが目的らしい。)