2.3 コマンドラインで利用する場合
コマンドラインからの設定と実行
コマンドラインからgaedirectを使用する場合は、GAEのダウンロードサイトを開き、図2-8のリンクからSDKをダウンロードします。
ダウンロードファイルを解凍すると、図2-9のようなフォルダ構成で展開されます。ここでは、gaedirectとappengine-java-sdkをgae下の並列フォルダに配置しています。なお、今回ダウンロードされるバージョンではgaedirectのフォルダが「gaedirect11」になっています。
図2-9でGAEのプログラム作成とデプロイ用に使用されるコマンドが「bin」フォルダに入っており、図の右側に表示されています。この中で「dev_appserver.sh」と「appcfg.sh」はLinuxとMacOS用のshellスクリプトでWindows環境では使用しません。Windowsでは「dev_appserver.cmd」「appcfg.cmd」を使用します。
dev_appserver.cmdは作成したプログラムをローカルPCで実行する場合に、appcfg.cmdはGoogleのクラウド環境にアップロード/デプロイするときに使用します。
コマンドラインからgaedirectを実行
プログラムの実行はWindowsのコマンドプロンプトから行います。図2-9のディレクトリ構成で、「bin」ディレクトリに移動後、コマンドラインから次のように入力して実行します。
>dev_appserver.cmd ../../gaedirect/war
プログラムが正常に実行されると、コマンドラインに、「The server is running at http://localhost:8080/」のメッセージが表示されます。
この状態でコマンドを実行したPCのWebブラウザから「http://localhost:8080/」のアドレスを指定すると、図2-12のようにgedirectのメニュー画面が表示されます。
プログラム実行の終了は[Ctrl]+[C]キーで行います。
コマンドラインからクラウド環境へデプロイ
クラウド環境へのアップロード/デプロイは「appcfg.cmd」で行いますが、デプロイの前に「appengine-web.xml」の内容を修正します。appengine-web.xmlは「WEB-INF」下に配置されており、このファイルをエディタで開くとリスト7のような記述内容になっていますので、applicationとversionタグにアプリケーションIDとバージョンを書き込んでください。
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application></application> <version>1</version> <system-properties> <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> </system-properties> </appengine-web-app>
アプリケーションIDとバージョンIDを書き込んだ後、「bin」ディレクトリから次のコマンド入力でデプロイが実行されます。
>appcfg.cmd update ../../gaedirect/war
デプロイが成功すると、図2-14のような画面表示に変わり、外部インターネットからアクセスできるようになります。
2.4 gaedirect開発の経緯
gaedirectを作成するきっかけとなったのは「jsonengine」です。jsonengineに興味を持ち機能を調べてみたのですが私の印象ではあまり使いやすくなく、もっと自分が使いやすいツールを作ってしまおうというのがgaedirectを作成したきっかけです。
jsonengineを一言で言えば、その名前が示す通りにJSONデータのためのエンジン(engine)という印象です。JSONはJavaScriptでのオブジェクト表記法をベースとした軽量なデータ記述言語で、JavaScriptでのデータ処理が簡単なことはよく知られていますが、このJSONデータをそのままの形でサーバ側データストアに保管し、使用したいときに読み出すことができれば大変便利です。そしてjsonengineではこのJSONデータ場所としてGAEのBigtableを使用したということでしょう。従ってJSONデータを扱うことに専念するのであればjsonengineは最適のシステムと言えるのかもしれません。
しかし長年業務系や基幹業務系でのSEやシステム開発などをやってきた筆者にはちょっと違和感があり、特に将来的なサーバ側でのプログラム開発へと繋いでいく場合には使いにくいと感じます。
それではもう少し具体的に、jsonengineのサンプルとそこで登録されたエンティティの内容を見ながら、筆者があまり使いよくないと感じた点を述べてみます。
図2-15はjsonengineの日本語ドキュメントの掲載されているサンプルですが、このサンプルを自分の環境にインストールしてGAE管理者画面の「Datastore Viewer」から登録されたエンティティを確認してみると、図2-16と図2-17のようになっています。エンティティは画面上で横長に表示されるので、前半と後半に分けて表示しています。
上記の図を踏まえて筆者が感じたことは以下のようになります。
(1)データ型が取り扱いにくい
データ型指定について、jsonengineの日本語マニュアルには下記のように記述されています。
jsonengine はパラメータを次の順で解析しようとします。1) long 型, 2) double 型, 3) boolean 型 4) string 型。したがって、”001” や “true” といった文字列を渡す場合には注意してください。それらは String 型としては保存されません。もしこれらを避けるため、プロパティーの型を明示したい場合は、JSON ドキュメントスタイルを使用してください。
jsonengineはパラメータを上記のように解析するので、標準ではユーザが型指定することができず、また指定したい場合は「JSON ドキュメントスタイル」を使用するということですが、JSONスキーマで定義する必要があり、また定義できる基本スカラー型はinteger, number, string, boolean, nullだけなので、GAEで使用可能なデータ型をすべてカバーすることはできません。特に最大1MBのText型を明示的に指定できないことが気になりました。
(2)エンティティ構造が独自で汎用的でない
また図2-16と図2-17にある、生成されたエンティティのデータ構造はjsonengine特有のもので、一般的なGAEのサーバ側記述でBigtableにデータを格納した場合のエンティティ構造とは大部違っています。jsonengineでのデータ構造が特有のものになる理由としてはSlim3の使用があります。Slim3はGAEのサーバ側開発でいくつかの特徴をもつ良いツールですが、Slim3でエンティティを生成する場合はソフトスキーマではなく、プロパティ数固定のエンティティになります。ところで、登録されるデータ項目数はアプリケーションごとに当然違ってきますが、Slim3を使用しているjsonengineでは登録項目数に対応するプロパティを持つことができないため、プロパティをリスト項目として対応しており、エンティティも独自の構造になってきます。
このように、jsonengineも、ここで紹介するgaeditectもサーバ側の記述なしでGAEのBigtableにアクセスできるツールですが、例えば緊急時にこれらのツールでサイトを作成し、その後落ち着いてから、サイト機能を充実させるためにサーバサイドでの作り込みを追加するような場合は、サーバ側でのデータ処理にもマッチしたエンティティ構造にしておく必要があります。jsonengineではこのような場合の継続性に無理がでてくると考えられます。
ただし、このように筆者は感じた問題点もそのツールが指向している範囲外とすればそれだけのことで、要はどのような目的でそのツールを使用するのかということから、JSONデータの保存と利用に特化したjsonengineとは異なるツールが必要ではというのが筆者の考えです。
ついでに言えばgaedirectはその名前のとおりにデータストア(Bigtable)に対するクライアントからのダイレクトアクセスだけでなく、サービス機能のダイレクトアクセスについても、これから取り組んでいく予定でいます。