ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »JSON
このページの記事一覧

【MongoDB】Windows版 MongoDB をインストールして使う  


ドキュメント指向DBと言われる MongoDB をインストールして使ってみる。
覚えやすいように RDBMS や SQL と結びつけて考えてみる。


まずは、インストール(Windows版)。

1.msi バイナリをダウンロードする。
http://www.mongodb.org/downloads

2.起動したインストーラーで「Custom」を選び、インストールするディレクトリを変更する。

3.インストールしたディレクトリの「bin」に パスを通す(D:\MongoDB\bin など)。

4.インストールしたディレクトリにデータベース用の「data」フォルダ(D:\MongoDB\data など)、ログ用の「logs」フォルダ(D:\MongoDB\logs など)を作る(※権限も書き込み可が良い)。

5.コマンドプロンプトからサービスを起動する(オプションに「data」と「logs」のパスを指定)。
mongod --dbpath D:\MongoDB\data --logpath D:\MongoDB\logs\mongodb.log
※常駐させたいときは、--install オプションを追加して、サービスコントロールパネル(Win8なら、タスクマネージャーのサービス)等で、MongoDB の状態を「開始」にすれば良い(確認済)。またはサービス名を付けて(--serviceName)、net コマンドあたりでもできるかも(未確認)。

6.もう1つコマンドプロンプトを開いて、今度は MongoDB のコマンドラインクライアントを起動する(mongo.exe)。
mongo

7.MongoDB shell が起動すれば完了。help でヘルプ、exit で終了できる。



とりあえず、RDBMS にたとえると、「コレクション」がテーブルで、「ドキュメント」がレコードと考える。
「SQL:」と書いてあるのは、あくまで近いSQL文など。

以下、コマンドラインでの簡単な構文のテスト。

■データベースの一覧 [SQL: show databases]
> show dbs

■データベースの切り替え(※名前を指定) [SQL: use]
> use test

■コレクション(テーブル)の一覧 [SQL: show tables]
> show collections


※以下 db.things を現在のコレクションとする。なお、コレクションは自動で作られる(SQL: create table は不要)。

■ドキュメント(レコード)の追加 [SQL: insert]
> db.things.save( {"name":"Taro", "age":19} );

■ドキュメント(レコード)の一覧 [SQL: select * ]
> db.things.find();

■ドキュメント(レコード)の更新 [SQL: update]
> db.things.update( {"name":"Taro", "age":19}, {"name":"T-row", "age":20} );

■ドキュメント(レコード)内の数値インクリメント(更新)
> db.things.update( {"name":"T-row", "age":20}, { $inc : {"age":1} } );

■ドキュメント(レコード)の削除 [SQL: delete]
> db.things.remove( {"name":"T-row"} );


最近の更新の早いシステムは、確かに RDBMS では限界があるよね。カラム増やすと無駄も多くなるし。
その点、このデータ構造ならいつでもカラム増やせるし、仕様変更も楽な気がする。
データは JSON なので、通信もやりやすいし、構文もプログラマ向けだね。


(関連記事)
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する



スポンサーサイト

category: 環境構築

thread: プログラミング

janre: コンピュータ

tag: JSON  データベース  開発ツール  インストール 
tb: 0   cm: --

【Java】【Android】【PHP】【JSON】JSON を Java から送信して、PHP で受信する  


 さらに前回の続き

 今回は逆に、Java から JSON を送信して、PHP で受け取ってみるテスト。

 色々サンプルを調べてみたが、URLConnectionHttpClient(Android) の例が多かったので、とりあえず、前回使った HttpURLConnection をそのまま使うことにした。また Android ではどちらかと言うと、URLConnection の方が推奨されているらしいので(軽量で実行速度も速いとか)、流用も簡単かも知れない。


 まずは JSON を受信する PHP の方から書いてみる。今回もエラー等は考慮に入れず、超絶簡単なコードにするので、必要なら適当に追加して欲しい。とりあえずファイル名を「json_in.php」とする。

■JSON 形式データ受信用 PHP(json_in.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ

//リクエストの body 部から生のデータを読み込む
$input = file_get_contents('php://input');

//JSON のデコード
$json = new Services_JSON;
$data = $json->decode($input);

//以下確認用
header('Content-type: text/plain; charset=utf-8');

foreach($data as $key => $val) {
echo $key.' = '.$val."\n";
}
?>

 「確認用」のコードは本分と関係ないので、本来ならデータベース等に記録する処理などに変更すると良いだろう。

 以下の Java サンプルで JSON を POST で送っているが、PHP 側で $_POST で受け取ると余計なエスケープが付くので、読み取り専用の生のデータを取得するようにした。$HTTP_RAW_POST_DATA が使えるサーバなら、そちらでも良いかも知れない。ただ「php://」の方法なら、設定ファイル「php.ini」はいじらなくて済む利点がある。また試しに日本語も送ってみたが、"UTF-8" 固定ならば問題なく受信できた。


 次に JSON 送信用の Java コードを書いてみる。これも例外処理は手抜きなので、必要に応じて追加した方が良いかも知れない。また確認用に前回作った readLinesText() とデータ格納用構造体(クラス)、定数などもそのまま使っている。

■JSON 形式データ送信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;

public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}

//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //エンコードは固定

String phpUrl = "http://(テストするサーバー)/json_in.php"; //JSON 受信用 PHPのURL

try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("POST"); //"GET"でも可
con.setDoOutput(true); //出力用接続フラグON
con.connect();

//適当にデータを定義
Data data4 = new Data("マック", 21, true);
// Data data4 = new Data("シンディ", 16, false);

//データ用クラス から、JSON 形式に変換
Gson gson = new Gson();
String text4 = gson.toJson(data4);

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), ENCORDING)));
pw.write(text4); //出力
pw.close(); //フラッシュして閉じる

//PHP からの応答(確認用)
System.out.println("[Response]");
String res = readLinesText(con.getInputStream()); //※前回作ったもの
System.out.println(res);

con.disconnect();

} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

 結果は以下の通り。

[Response]
name = マック
age = 21
male = 1

 boolean 型は PHP 側では true → 1、 false → 空文字 になるので注意。

 HttpURLConnection の定義部分に関しては、前回のコード に setDoOutput(true) を追加して出力用接続をONにし、setRequestMethod() を POST に代えただけである。リクエストは GET でも構わない。以下のURLエンコードの方法の場合、データ量を考えないで済むので POST にした。また GET より POST の方が少しばかりデータの隠蔽性があるという利点もある。

 PHP 側で $_POST で受け取りたいなら、JSON エンコード後に、
String text4 = gson.toJson(data4);
String enc = URLEncoder.encode(text4, ENCORDING); //URLエンコードする
text4 = "data=" + enc; //POSTするクエリ

のように URL エンコードして、pw.write(text4) で書き出せば、PHP 側で $_POST['data'] で受け取れる。ただし、先に述べたように、$_POST の場合は余計なエスケープ('\')が付くので、stripslashes($_POST['data']) などして、エスケープを除去する必要がある。

 また、日本語を Unicode の表現 (\uffff) に変換しても可能だったが、JSON(GSON) 変換などで、更にエスケープ('\')が増えたりするので、デコードには要注意だ。送信側と受信側のエスケープの数のつじつま合わせをしなければならない。Java での Unicode 変換は非常に良いサンプルがあったので、参考に載せておこう。PHP 側の JSON デコードはライブラリが Unicode デコードも勝手にやってくれるみたいだ。日本語が絡むと色々複雑になってくるので、その辺は自由に書き換えて貰いたい。

(参考) JavaのUnicode文字列の変換用メソッド


(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う


category: Android

thread: プログラミング

janre: コンピュータ

tag: PHP  JSON  通信 
tb: 0   cm: --

【Java】【Android】【PHP】【JSON】JSON を PHP から送信して、Java で受信する  


 前回、Google の Gson(Json) による JSON 形式デコードが上手くいったので、今回は PHP から Java での受信を試みる。

 というわけで PHP の方にも JSON 変換のライブラリが必要なので、以下からダウンロード。

http://mike.teczno.com/JSON.tar.gz
PHPからJSON作成を扱う
(*)どちらも同じ。

 アーカイブを解凍したら、ドキュメントやサンプルなどを含めて色々出てくると思うが、とりあえず変換ライブラリ「JSON.php」をサーバーに配置する。

 サンプルコードは超絶簡単なものにする。エラーなどは考えてないので、必要なら適当に付け加えて欲しい。とりあえずファイル名を「json_out.php」としておく。

■JSON 形式データ送信用 PHP(json_out.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ

//テスト用データ
$data = array(
"name" => "John",
"age" => 22,
"male" => true
);

$json = new Services_JSON;
$encode = $json->encode($data); //JSON 形式へエンコード

header('Content-type: text/plain; charset=utf-8');
echo $encode; //テキスト出力
?>

 header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。

 Content-type の出力としては、

header('Content-Type: text/javascript; charset=utf-8');
header('Content-type: application/json');

なども使えたが、以降の Java コードで、Content-Length が上手く取れなかったので、text/plain にしておいた。クライアントアプリによって、必要に応じて変更しても良いだろう。


 次に、ストリームからの読み込みに新たに readLinesText() という関数を作ってみた。エンコードがあらかじめ "UTF-8" と決めてあって、データ受信にしか使用ないような、固定用途なら問題なく使える。その他には、以前「テキストファイルの読み込み」で作った loadText(), readStream() もそのまま使える。この2つの関数を簡易的にまとめたものに近い。小さなデータを頻繁に読み込むなら、readLinesText() の方が少しばかり速い気がする。どちらを使っても構わない。

■ストリームから行読みするライブラリ readLinesText()
//Reader でのテキスト読み込み(※最後に改行が付くので編集用には向かない。エンコードもシステム依存)
public static final String readLinesText(InputStream is) throws IOException {
final StringBuilder str = new StringBuilder();
final String sep = System.getProperty("line.separator"); //改行コード
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
while (br.ready()) {
str.append(br.readLine()); //終端文字は含まない
str.append(sep); //改行コード追加
}
return str.toString();
} finally {
try {
br.close();
} catch (Exception e) {
//IOException
}
str.setLength(0);
}
}

 あとは、前回作ったサンプルをそのまま使って、Java で JSON を取得してみる。

■JSON 形式データ受信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;

public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}

//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //loadText() 用

String phpUrl = "http://(テストするサーバー)/json_out.php"; //JSON 送信用 PHPのURL

try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("GET");
con.connect();

String text3 = readLinesText(con.getInputStream());
// String text3 = loadText(con.getInputStream(), ENCORDING); //※以前作ったライブラリ

con.disconnect();

//確認
System.out.println(text3);

//JSON 解析して、データ用クラスに代入
Gson gson = new Gson();
Data data3 = gson.fromJson(text3, Data.class);

//確認
System.out.println("[Data3]");
System.out.println("name = " + data3.name);
System.out.println("age = " + data3.age);
System.out.println("male = " + data3.male);

} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

 結果は以下の通り。

{"name":"John","age":22,"male":true}

[Data3]
name = John
age = 22
male = true

 例外処理はかなり手抜きしてるので、必要に応じて適当に。

 URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。またこの程度のサンプルなら、URLConnection でも使える(con.setRequestMethod("GET"); の行を削除。デフォルトで GET なので問題ない)。

 PHP は非常に簡単なサンプルだが、内容をデータベースからの読み込みに変更して JSON 出力にすれば、色々応用できるだろう。また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良い。Android なら ServiceAsyncTask がよく使われているようだ。


(関連記事)
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う


category: Android

thread: プログラミング

janre: コンピュータ

tag: PHP  JSON  通信 
tb: 0   cm: --

【Java】【Android】【JSON】Google Gson(Json) を Eclipse にインポートして使う  


 JSON 形式変換のライブラリはいくつかあるようだが、とりあえず Google の Json(Gson) をテストしてみる。
でもその前に、ライブラリのダウンロードと Eclipse へインポートして使う方法。

1.まずは、ライブラリは jar で提供されているので、以下からダウンロード。
https://code.google.com/p/google-gson/
https://code.google.com/p/google-gson/downloads/list

(*)どちらも同じ。「google-gson-2.x.x-release.zip」をダウンロード。
(*)左側にあるメニューまたは、上部タブの「Downloads」から。
(*)バージョンはリリースごとに異なる(掲載時点は 2.2.4)。

2.zip を解凍すると、以下のファイルが出てくるので、適当なフォルダに移動する。

gson-2.x.x.jar
gson-2.x.x-javadoc.jar
gson-2.x.x-sources.jar
LICENSE
README

3.Eclipse のパッケージエクスプローラーで使用するプロジェクトを右クリックし、「プロパティー」を開く。

4.左メニューの「Java のビルド・パス」をクリックし、「ライブラリー」のタブに切り替え、右の「外部 Jar の追加」ボタンを押す。

5.JAR の選択のダイアログが開いたら、先ほど解凍した「gson-2.x.x.jar」を選択する。これで一応使えるようになる。

6.さらに、Javadoc が使えるようにするには、読み込んだライブラリが「ビルド・パス上の JAR およびクラス・フォルダー」に表示されたと思うが、これの[+]をクリックし、展開させると「Javadoc ロケーション」が出てくるので、それをクリックし、右の「編集」ボタンをクリックする。

7.「gson-2.x.x.jar の Javadoc」のダイアログが出たら、「アーカイブ内の Javadoc」を選択し、「外部ファイル」の「参照」ボタンから、解凍した「gson-2.x.x-javadoc.jar」を選択する。

8.次にデバッグ時などのソースを見るためには、「ビルド・パス上の JAR およびクラス・フォルダー」の展開メニューから「ソースの添付」をクリックし、Javadoc の時と同じように右の「編集」ボタンを押して、ダイアログにて「外部ロケーション」のパスに「外部ファイル」ボタンで、解凍した「gson-2.x.x-sources.jar」を選択する。

(*)メニューは日本語化してある


 これで GSON (JSON) を使う準備は整った。


 あとは簡単なサンプルを試してみる。適当なデータ用の構造体(クラス)を作って、JSON 形式に変換するのと、その逆に JSON 形式のテキストから、データ用の構造体(クラス)に値を受け取るテスト。

//データ格納用クラス(構造体)
public class Data {
public String name;
public int age;
public boolean male;

public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}

//テストのメイン... (※例外処理は省略)
//適当にデータを定義
Data data1 = new Data("Tom", 20, true);

//データ用クラス から、JSON 形式に変換
Gson gson = new Gson();
String text1 = gson.toJson(data1);

//確認
System.out.println("[Data1]");
System.out.println(text1);


//適当にJSON 形式のテキストを定義
String text2 = "{\"name\":\"Betty\",\"age\":18,\"male\":false}";

//JSON 解析して、データ用クラスに代入
Data data2 = gson.fromJson(text2, Data.class);

//確認
System.out.println("[Data2]");
System.out.println("name = " + data2.name);
System.out.println("age = " + data2.age);
System.out.println("male = " + data2.male);

 結果は以下の通り。

[Data1]
{"name":"Tom","age":20,"male":true}
[Data2]
name = Betty
age = 18
male = false

 とりあえず、簡単なものはOKと…。結構使いやすいな。あとは配列とか、日本語文字エンコーディングとか色々あるだろうけど、UTF-8 がデフォルトらしいので、Android でもそのまま使える。

(参考) JavaScript Object Notation (JSON)

(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う


category: Android

thread: プログラミング

janre: コンピュータ

tag: JSON  インストール  通信 
tb: 0   cm: --


プロフィール

Twitter

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop