Git?Subversion?

そろそろiOSアプリも作らないといけないとXcode5を入れた。
リポジトリは会社のSubversionを使いたいので、ウィザードでシンプルアプリを作り、オーガナイザーを開く。

ん??リポジトリ指定がないぞ。

いろいろ、調べてPreferences->Acountsにあることを知る。あと、Source Controlメニューも見つけた。
では、エクスポートしようか・・・

ん??Exportsメニューが無いぞ。

そうか、プロジェクトを作るときに指定するんだったか。->もう一度作り直す

ん??Git指定しか無いぞ?Subversionも使えるはずじゃ?

しょうがない、コンソールでSVNコマンドを叩けば・・・

ん??そんなコマンドないといってくるぞ。

しょうがない。入れるか
$sudo port install subversion

ん??弾かれた。XCodeがなんとかかんとか

ここに来てさすがにイラっときた。Eclipseで空プロジェクトをExportsした。

Objectifyで簡単DataStore操作(GWT-RPCでモデルの受け渡しを実装する)

Objectifyを使ってクライアント<—>サーバ間でオブジェクトの受け渡しをしてみたいと思います。そのためにはGWT-RPCでいくつか実装をする必要があります。Googleプラグインでプロジェクトを新規作成したときに自動で生成される
GreetingService.greetServer(String name)がそのサンプルです。

private void sendNameToServer()

で呼んでいますね。
GWT-RPCに独自メソッドを実装する場合3つのファイルにタッチする必要があります。

  • GreetingService.java RPCメソッドの定義です。
  • GreetingServiceImpl.java上記RPCメソッドの実装です。
  • GreetingServiceAsync.java クライアントからはここで定義した形で呼び出します。Ajaxで値が返ってきたとき受け取るコールバックも定義しています。

GWT-RPCメソッドの実装


2つのメソッドを実装します。
registerCar(Car car); // 生成したCarオブジェクトをDataStoreに登録します。
getCar(String name); // “name”が一致したCarオブジェクトをDataStoreから探して返す。

これらのメソッドの実装は以下になります。

// GreetingService.java
/**
 * The client side stub for the RPC service.
 */
@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
	void registerCar(Car car) throws IllegalArgumentException;
	Car getCar(String name) throws IllegalArgumentException;
}
// GreetingServiceImpl.java
	@Override
	public void registerCar(Car car) throws IllegalArgumentException {
		CarDAO dao = new CarDAO();
		dao.put(car);
	}

	@Override
	public Car getCar(String name) throws IllegalArgumentException {
		CarDAO dao = new CarDAO();
		return dao.get(name);
	}
// GreetingServiceAsync.java
/**
 * The async counterpart of GreetingService.
 */
public interface GreetingServiceAsync {
	void registerCar(Car car, AsyncCallback callback) throws IllegalArgumentException;
	void getCar(String name, AsyncCallback callback) throws IllegalArgumentException;
}

これで準備ができました。次回は早速呼び出してみましょう。

Objectifyで簡単DataStore操作(モデルオブジェクトを作ってみる)

では、さっそくモデルを作ってみます。作るモデルは”Car”モデルです。ありがちです。Carはサーバー側でもクライアント側でも使うのでどちらからもアクセスできるところに置きましょう。

shareの下にパッケージを作ります。こんな感じです。

package com.storadia.GAETest.shared.model

モデルの定義


モデルのクラス定義は以下です。

package com.storadia.GAETest.shared.model;

import javax.persistence.Id;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.googlecode.objectify.annotation.Entity;

@Entity
public class Car implements IsSerializable {
	@Id
	public Long id;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

IsSerializable インターフェイスを使用していますが、これはクライアント、サーバ、両方で使用するためのおまじないです。
@Idアノテーションに注目してください。このLong値を使ってオブジェクトを管理することをDataStoreに宣言しています。
あとはnameプロパティのGetter/Setterを持ったいたってシンプルなクラスです。

DAOの定義


DAOはサーバー側で使用します。パッケージは以下にしました。

package com.storadia.GAETest.server.dao;

Objectifyは扱うクラスの登録を最初の一回だけにしなければいけないという条件を持っています。ですのでstatic節で括って何度も登録しないようにしています。
いろいろ書き方はあるでしょうが、基本はこんな感じになると思います。DAOにはCarの登録用メソッド”put”、名前でCarをDataStoreから取り出す”get”を用意しました。

package com.storadia.GAETest.server.dao;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.util.DAOBase;
import com.storadia.GAETest.shared.model.Car;

public class CarDAO extends DAOBase {
	private Objectify ofy = ObjectifyService.begin();
	static {
		ObjectifyService.register(Car.class);
	}
	public void put(Car car) {
		ofy.put(car);
	}
	public Car get(String name) {
		return ofy.query(Car.class).filter("name", name).get();
	}

}

次回GWT-RPCを使ってクライアントからCarを登録・取得してみたいと思います。

Objectifyで簡単DataStore操作(開発環境を整える)

GWT+GAEでの開発にはまっています。日本じゃあんまり話題を聞かないんですが、めちゃくちゃ便利でAjaxなWebアプリがバリバリかけます。そう、「スクリプトを駆使したサイト」ではなく、「Webアプリケーション」です。

その中でもGAE(Google App Engine)が持つ新しいデータ管理技術DataStore!これがすごいです。そんなわけで簡単にデータをサーバにおいて、簡単にクライアントで使うTipsを書いてみたいと思います。

GWT(Google Web Kit)


ざっくりというとクライアント側を受け持つフレームワークです。なんとJavaで書いたソースがJavaScriptにコンパイルされ、ブラウザで動くというウルトラCをやってのけます。ついでにAjaxで非同期にデータを読み込むなんてことも簡単です。

GAE(Google App Engine)


Googleが提供しているクラウド環境(サーバ側)です。かなりの量まで無料で使うことができます。必ずしもGWT+GAEでなければいけないわけではありませんが、やっぱり相性がいいです。

Objectify(Objectify-appengine)


GAEのDataStoreの扱いを便利にするライブラリです。
ここからダウンロードすることができます。

開発環境


Eclipse用にプラグインが提供されています。

プロジェクト作り


プラグイン入りEclipseを立ち上げるとツールバーに”g”アイコンが現れます。ここで”New Web Application Project…”を押してプロジェクトを作りましよう。とりあえず「GAETest」にしましょうか。数秒待つとソースツリーが生成されます。
ここで先ほどダウンロードしたObjectifyの実体(Objectify-3.1.jar 2013/09現在)をwar/WEB-INF/libに置きます。次にGAETest/srcにGAETest.gwt.xmlに

<inherits name="com.googlecode.objectify.Objectify" />

を追加します。これはよく忘れるので注意。
Javaのクラスパス設定も忘れずに。これで環境が整いました。

大田区の人工芝施工会社、エル・エス エージェント社さまのサイトを構築させていただきました。

ステップターフという人工芝で有名なエル・エス エージェント社さまのサイトを構築させていただきました。施工がたくさんあるので現場から携帯で日記を更新できるようにしました。いろいろな人工芝のお庭をアップされるそうなのでお楽しみに!

うっかり、AppStoreで公開してしまいました・・・

申し訳ありません・・・
タクシー配車システムiCabのクライアントアプリ「TAXIコール」ですが、手違いで数時間ほどAppStoreで公開してしまいました。
まだ、サービスインしていないのでタクシーは見つかりません!
告知もせずに数時間でこれだけのダウンロードがあるとは規模の大きさに驚いています。
サービスはもうすぐ始まりますので今しばらく、今しばらくお待ちください。
誠に申し訳ありませんでした。

ストレーディア代表 平野

TAXIコールのApple審査が通りました!

まだまだエリアが狭いからおおっぴらに宣伝出来ないのが辛いですね。
けど、単純にうれしいです。
まずは東京都町田周辺から。
究極に「シンプル」にしたらこうなった!
ボタンを押すだけ!あとはタクシーがあなたの元へやってくる!これだけ!
タクシーもあなたもお互いの現在位置がわかるから移動したって大丈夫!
迎車料金無料はこのアプリだけですよ。

スマホというインフラはただのケータイの進化版じゃない

本当にそう思います。特にGPSを使った位置情報!
これは本当に面白いです。
めちゃくちゃアイディアがわいてきます。
スタッフと新しいアプリについて話し合っているときはものすごく幸せです。
ただ、とてもじゃないが開発スピードが追いつきません。
忘れないようにアイディアノートでもつけないと。

タクシー配車システム”iCab”の特許出願が完了しました。

構想から1年後、システム構築も完了し特許も出願しました。これから営業が始まります。
果たしてタクシー業界にどのようなイノベーションを起こすことができるのか。
IT技術でタクシー会社さま、ユーザーさま、双方が幸せになれることを祈ってやみません。

タクシー配車システム”iCab”来月サービスインします

新世代タクシー迎車システムを来月サービスインします。
GPSがあるスマホだから当然住所を入力する必要はなし!
個人情報の入力はなし!
ボタンを押すだけのシンプル操作であなたの近くにタクシーが参ります。
タクシーがくるまでの間、お互いの現在位置を送り合うので、多少移動したって大丈夫!
タクシーが近づいてくる様子をリアルライムに確認できるのは楽しいですよ!
もう、指定場所で待ち続ける必要はありません。

詳細はコチラ