追記:無料で使えるHeroku Postgres Devは、行数が1万行に制限されることが発表されたので、別の方法(例:SQLiteを組み込む)を検討した方がいいでしょう。
拙著『Webアプリケーション構築入門』では、開発プラットフォームとしてJavaとPHPを採用しており、ウェブアプリを実際に公開するときは、自前のサーバ(VPSを含む)を使える人にはJava・PHPの好きな方を、レンタルサーバを使う人にはPHPを使って貰うつもりで執筆していました。
最近、自前のサーバでもレンタルサーバでもない第3の選択肢としてのPaaSが普及してきており、その一部は無料で使えるようになっています。「サーバ管理技術」よりも「アプリケーション開発」に興味がある人にとっては、自前のサーバやレンタルサーバよりPaaSの方が便利でしょう。しかし、拙著はPaaSを意識した書き方にはなっていないので、そのあたりの情報をアフターサービスとして提供していきたいと考えている今日この頃です。
Javaを無料で使えるPaaSの一つにHerokuがあります。Javaが使えるレンタルサーバはあまりないので(私が知らないだけ?)、そういう意味でもHerokuは魅力的なのですが、無料で使えるデータベース管理システム(DBMS)が、拙著で採用しているMySQLではなくPostgreSQLだというのが、初心者には障害になるかもしれません。この障害を回避するために、拙著の第9章「ウェブアプリの実例」で作成する「郵便番号検索システム(Google MapsとのマッシュアップやAjaxによるリアルタイム検索を含む)」でPostgreSQLを使う方法を紹介しましょう。
まずPostgreSQLをインストールします。
sudo apt-get install postgresql
PostgreSQLの管理者postgresのパスワードを適当に設定します(例:pass)。
sudo passwd postgres #ここでパスワードを入力
郵便番号辞書データベースを作ります。拙著9.1.1項のとおりにファイルをダウンロードして、次のコマンドで必要なデータだけを集めたCSVファイルを作ります。各コマンドの意味は「man gawk」などとして確認してください。
nkf -Lu -w ken_all.csv | gawk -F, -v OFS="," '{print $3,$7,$8,$9,"\"\"","\"\""}' > /tmp/zip.csv nkf -Lu -w jigyosyo.csv | gawk -F, -v OFS="," '{print $8,$4,$5,$6,$7,$3}' >> /tmp/zip.csv
管理者になって、データベースmydbを作ります。
su postgres #ここでパスワードを入力 createdb mydb
MySQLのコマンド「mysql」に相当するコマンド「psql」を実行します。
psql mydb
テーブルを作成し、先に作成したCSVファイルをインポートします(拙著9.1.2項とは異なり、必要なデータだけをインポートすることにします)。
CREATE TABLE zip ( code CHAR(7) NOT NULL, address1 VARCHAR(10) DEFAULT '' NOT NULL, address2 TEXT NOT NULL, address3 TEXT NOT NULL, address4 TEXT NOT NULL, office TEXT NOT NULL ); COPY zip FROM '/tmp/zip.csv' WITH CSV;
インデックスを作成します。
CREATE INDEX code_idx ON zip (code);
Webアプリから接続する際のパスワードを設定します。これは、先に設定したOSのパスワードと同じである必要はありません。
ALTER USER postgres WITH PASSWORD 'pass';
「\q」と入力してコマンドpsqlを終了します。
拙著8.2.2項「Javaからデータベースへのアクセス」の場合と同様に、「PostgreSQL JDBC ドライバ」を追加します。
コードの変更はzip.jsp(p. 134あるいはサポートページを参照)のデータベース接続部分だけです。次のように書き換えます。ここで使うパスワードは、先のALTER USER文で設定したパスワードです。
//データベースに接続(Heroku非対応) Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgresql://localhost/mydb"; Connection conn = DriverManager.getConnection(url, "postgres", "pass");
以上の準備で、拙著第9章の郵便番号検索システムはPostgreSQLで動くようになります。このままではまだHerokuでは動きませんが、とりあえず、ローカルで動くようになったので一区切りです。
オープンソースデータベース標準教科書 -PostgreSQL-などというものもありますね。