2011年8月29日月曜日

Google App Engine のデータストアの選択(その2)

日本語のドキュメントでは掲載されていないのですが、
Google App Engineのデータストアには、
機能の違うオプションが2つあるようです。



今回はそのドキュメントの翻訳2回目です。

リンクはこちら

データストレージのオプションの比較(Comparing the Data Storage Options)
アプリケーションの作成時には、2つのデータストレージの選択肢から1つを選びます。
高レプリケーションデータストア(The High Replication Datastore)
高レプリケーションデータストア(HRD)は、新しいアプリケーションのデフォルトとなります。HRDは、高い可用性、高い信頼性を持ったストレージソリューションです。計画的ダウンタイムの間も読み書きの可用性を保ち、突発的な故障に直面しても非常に弾力性がありますが、マスター/スレーブオプションよりも多くのコストがかかります。
HRD内のデータはPaxos algorithmを基にしたシステムを使用してデータセンターを横断して複製されます。読み書きに関する最高レベルの可用性を提供し、マスター/スレーブオプションよりもストレージとCPUのコストが約3倍かかります。
エンティティグループは、HRDにおいて、はるかに重要となります。現在のところ、一貫性だけでなくトランザクション性を単位としています。言い換えると、強い一貫性を持つ結果を要求するクエリは、単一のエンティティグループ内に結果を制限する祖先フィルター(ancestor filter)を含まなければならない、ということです。複数のエンティティグループに跨るクエリ群は、最新の結果を返すことを補償されません。この内容における祖先クエリ(ancestor queries)の利用についてはUsing the High Replication Datastoreのページを参照してください。
追記:HRDでは、全ての強い一貫性のある操作(例えば、キーによるgetやput)はトランザクション内で実行されます。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月28日日曜日

Google App Engineのデータストアの選択

日本語のドキュメントでは掲載されていないのですが、
Google App Engineのデータストアには、
機能の違うオプションが2つあるようです。

リンクはこちら

データストアの選択 (Java) Choosing a Datastore
App Engineは、異なる信頼性と一貫性を補償する2つのデータストレージのオプションを提供しています。このページでは、2つのオプションを比較し、アプリケーションにどちらのデータストアを適用する方法を説明します。
・データストレージのオプションの比較(Comparing the Data Storage Options)
・データストアの選択(Selecting a Datastore)

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月25日木曜日

Google Translate APIの有料版の提供

(2011年11月14日追記:料金のドキュメントの翻訳開発者ガイド)

今日(2011年8月25日、現地時間で24日)、
Google Translate APIの有償版の提供が発表されています。

リンクはこちら

以下は、日本語への翻訳(私の訳です)。


2011年8月24日水曜日
Google Translate API有料版がビジネス向けにオープン

by Jeff Chin, プロダクトマネージャ

5月に、Translate API v1を廃止することを発表しました。
今日、ビジネス向けと商用ソフトウェア開発者向けにGoogle Translate API有料版をご紹介します。Google Translate APIは、Googleの機械翻訳テクノロジの最新版にアクセスするプログラムインターフェイスを提供します。APIは50以上の言語(2500以上の言語の組み合わせ)の翻訳への対応を、Googleのクラウドインフラストラクチャと巨大な機械学習アルゴリズムによって可能としています。

Translate APIの有料版は以前のバージョンの多くの利用制限を撤廃され、商用製品で使用することが出来ます。翻訳のコストは、翻訳されるテキスト100万文字あたり20ドル(1ページあたり500語と仮定して、1ページあたり約0.05ドル)となります。月あたり最大5000万文字まで利用するために、APIコンソール上でオンラインサインアップできます。

今日よりも前にAPIコンソールでプロジェクトを作成してTranslate API V2の利用を開始していた開発者は、プロジェクトに対する課金を可能にするまでは、2011年12月1日までは1日あたり10万文字の制限を受け続けます。

アカデミックユーザー向けには、University Research Program for Google Tranalateを通してGoogle Translate Research APIへの無料アクセスを提供し続けます。ウェブサイトの翻訳については、全てのウェブサイトに無料で提供し続けるGoogle Website Translator gadgetの利用をお勧めしています。それに加えて、Google TranslateTranslator ToolkitiPhoneおよびAndroid向けのモバイル翻訳アプリ、ChromeおよびGmail内の翻訳機能などは全てのユーザーが無料で利用し続けられます。

Jeff Chinは、Google Translateのプロダクトマネージャーです。移動のたびに、Jeffは現地の言語の学習と会話にトライし、素敵な地元のレストランや食べ物の発見を楽しんでいます。

投稿者:Scott Knaster,エディター

at 2011/8/24 PM04:36:00


有料版Google Translate APIの利用には、
APIコンソールからのサインイン
・テキスト100万文字あたり20ドルの利用料金
が必要ということです。
月あたりの制限は5000万文字です。

既にAPIを利用しているプロジェクトについては、
課金を有効にするまでは
・1日あたり10万文字
の制限を受けます。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月23日火曜日

Google Translate APIの廃止の注意書き


Google Translate APIのページの冒頭には、
Important: The Google Translate API has been officially deprecated as of May 26, 2011. Due to the substantial economic burden caused by extensive abuse, the number of requests you may make per day will be limited and the API will be shut off completely on December 1, 2011. For website translations, we encourage you to use the Google Translate Element.
と書かれています。
重要:Google Translate APIは、2011年5月26日に公式に廃止となりました。大規模な乱用によって引き起こされる実質的な経済的負担により、一日あたりに可能なリクエストの数が制限され、APIは2011年12月1日に完全に停止されます。ウェブサイトの翻訳にはGoogle Translate Element(http://www.google.com/webelements/translate)をお勧めします。

大体こんな意味です。
2011年の12月以降は停止されて利用不可能になる、ということです。

有料版の提供が行われるという話ですが、実際にはどのようになるのか分かりません。
かわりに推奨されているGoogle Translate Elementは、
Google Chromeで他言語のウェブページを開いたときに表示される
「翻訳しますか?」という翻訳ツールと似たようなもののようです。
ページ全体の翻訳を行うわけです。


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月20日土曜日

Google APIsの一部廃止(続き)

前回に引き続き、Google APIの一部廃止についてのリリースです。


標準的な廃止の期間(大体、3年前後)に続いて、幾つかの廃止されるAPIは、提供を終了します。残りについては停止のスケジュールは定められていませんが、新しい機能を追加されることはありません。それぞれの廃止されるAPIのポリシーは、以下のドキュメントに記述されています。
 ・これらのAPIは現在廃止されていますが、停止期日のスケジュールはありません:Code Search API,Diacritize API,Feedburner APIs,Finance API,Power Meter API,Sidewiki API,Wave API
 ・これらのAPIは各廃止ポリシーに従って停止されます:Blog Search API,Books Data APIとBooks JavaScript API(新しいAPIではありません), Image Search API,News Search API,Patent Search API,Safe Browsing API(v1のみ)、Translate API,Transliterate API,Video Search API,Virtual Keyboard API

可能な限り、ドキュメントで同じ機能を実現するための代替となるような提案を行うか、新しいバージョンや関連する製品の提供を行います。長期の廃止期間と共に、これらの代替物が影響を最小限にして、私達が素晴らしい製品を提供することの両方の助けとなることを希望します。

Adam Feldmanは全てのGoogleのAPIに注視し、開発者の利用可能なベストのプラットフォームをGoogleが提供することを確実にするためのプロダクトマネージャーです。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月15日月曜日

Google APIsの一部廃止

今年(2011年)の春、Google APIの一部が廃止されるという
発表がありました。

その中には、Google Translate API、VirtualKeyboad APIも含まれます。


リンクはこちらです。


2011年6月3日(金曜日)
APIの一部の整理(春季)
Adam Feldman(APIs プロダクトマネージャ)

6月3日:Translate APIの廃止をアナウンスしてから数日の間に、このページのコメントその他を通して、とても沢山の方からの関心と情熱を拝見しました(全てを読みました。信用してください)。私達はあなた方の懸念に対処するための努力をご理解いただき喜ぶと共に、Translate APIの有料版を提供するためにアップデートの計画を発表する予定です。可能な限り早く、完全なアップデートを提供する予定ですので、ご期待下さい。

Google I/O は、常に開発者にむけて素晴らしい時間を提供します。今年は、7つの新しいAPIを含む34の個別の発表を行いました。
・Discovery Service
・Tasks API
・Books API
・Pagespeed Online API
・Places API(現在一般に利用可能)
・Prediction API(現在一般に利用可能)
・Fusion Tables API(追加のフィード)
最近のAPIの発表の全てと共に、APIディレクトリはとても大きくなりました。
しかしながら、幾つかの古いAPIは、より大きいかより良いものによって取って代わられたり、必要性を受けられなくなりました。

ウェブの進化と優先順位の変化を受けて、私たちは時々APIを廃止(進行中の開発から外すことです)して、資源を解放して前進するために集中します。今日、APIの幾つかの除去を発表します。

圧倒的多数のGoogle APIは、この発表によって影響を受けないことにご注意下さい。
(続く)


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月9日火曜日

Goole App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その13)

それでは、ここで今までの内容を反映した
サンプルコードを掲載します。



import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

/**
 * Google App Engine for Javaにおけるユニットテストのサンプルコード。
 */
public class LocalUnitTestSample {

	private static final String DATA_KIND = "sampleDataKind";

	private LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

	private String propertyName = "propertyName";

	private String[] propertyValues = {"pValue1","pValue2","pValue3","pValue4","pValue5"};

	private DatastoreService ds;

	private List keyList;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		helper.setUp();

		//サンプルデータをデータストアに保存する
		putSampleData();
	}

	/**
	 * サンプルデータをデータストアに保存するメソッド。
	 */
	private void putSampleData() {
		keyList = new ArrayList();
		ds = DatastoreServiceFactory.getDatastoreService();
		for (int i = 0; i < propertyValues.length; i++) {
			Entity entity = new Entity(DATA_KIND);
			entity.setProperty(propertyName, propertyValues[i]);
			Key key = ds.put(entity);
			keyList.add(key);
		}
	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		//サンプルデータをデータストアから削除する
		deleteSampleData();

		helper.tearDown();
	}

	/**
	 * サンプルデータをデータストアから削除するメソッド。
	 */
	private void deleteSampleData() {
		Iterator iter = keyList.iterator();
		while (iter.hasNext()){
			ds.delete(iter.next());
		}
	}

	@Test
	public void doTest(){
		//サンプルデータをデータストアから検索する
		for (int i = 0;i < propertyValues.length;i++){
			EntitySearch search = new EntitySearch(ds,DATA_KIND,propertyName);
			List entitiesList = search.getEntity(propertyValues[i]);
			assertEquals(1,entitiesList.size());
			Iterator iter = entitiesList.iterator();
			while (iter.hasNext()){
				Entity entity = iter.next();
				assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
			}
		}
	}

	/**
	 * データストアから、設定された名前のプロパティが該当する
	 * エンティティを取得する機能を提供するクラス。
	 */
	public class EntitySearch {

		/**
		 * データストアサービス
		 */
		private DatastoreService ds;

		/**
		 * 探索するエンティティのカインド名を表す文字列フィールド
		 */
		private String kindName;

		/**
		 * 探索するプロパティの名前を表す文字列フィールド
		 */
		private String propertyName;

		/**
		 * データストアサービスと、探索するプロパティの名前を引数とするコンストラクタ。
		 * @param ds データストアサービスオブジェクト
		 * @param kindName 取得するエンティティのカインド名文字列
		 * @param propertyName 探索するプロパティ名を表す文字列
		 */
		public EntitySearch(DatastoreService ds, String kindName, String propertyName) {
			this.ds = ds;
			this.kindName = kindName;
			this.propertyName = propertyName;
		}

		/**
		 * データストアからエンティティを検索するメソッド。
		 * コンストラクタで設定したカインド、プロパティ名の値が
		 * 引数propertyValueと同一のエンティティを格納したリストを返します。
		 * @param propertyValue 検索条件となるプロパティの値オブジェクト
		 * @return コンストラクタで設定したプロパティが引数propertyValueと同一の値のエンティティのリスト
		 */
		public List getEntity(Object propertyValue) {
			Query query = new Query(kindName);
			query.addFilter(propertyName, FilterOperator.EQUAL, propertyValue);
			PreparedQuery prepare = ds.prepare(query);
			List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
			return entitiesList;
		}

	}

} 

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月7日日曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その12)

前回に引き続き、EntitySearchクラスの修正を行います。


メソッドgetEntity()内で、
クエリを生成する部分に修正する点があります。

コンパイル時に警告が出るのですが、
フィールドkindNameが参照されていないのです。

getEntity()内では、
エンティティ探索のためにクエリを生成しています。
クエリを生成するためにはコンストラクタで
new Query(String kind)
とするのですが、
引数の部分が
DATA_KIND
となっていて、LocalUnitTestSampleクラスの定数を参照しています。
(もし、EntitySearchクラスを内部クラスとしていなければ、
コンパイルエラーになります)

そこで、探索するエンティティのカインド名を
DATA_KINDから、kindNameに変更します。
そうすることで、EntitySearchクラスの内部から
LocalUnitTestSampleクラスのメンバを直接参照することは
なくなります。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月4日木曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その11)

前回の投稿で、テスト駆動開発の利点として、
回帰テストが容易に出来る、ということを挙げました。

その実践・・・というわけでもないですが、
サンプルコードを修正してみましょう。
修正、といいますが、つまり、忘れていた点があったんです。

作成したEntitySearchクラスのコンストラクタが
実装されていませんでした。
引数が何も使われないままになっていたんですね。

引数が使われないまま放置されていたのに、
テストを実行してみると成功します。
この理由は、
EntitySearchクラスがLocalUnitTestSampleクラスの
内部クラスであることが原因です。

もし、EntitySearchクラスを内部クラスではなく、
別の独立したクラスとすると
コンパイルエラーとなります。

メソッドgetEntity()の内部で、
変数ds,kindName,propertyNameを解決できないはずです。

そこで、コンストラクタで渡された引数を
フィールドとして保持することにします。
private DatastoreService ds;

private String kindName;

private String propertyName;

public EntitySearch(DatastoreService ds, String kindName, String propertyName) {
 this.ds = ds;
 this.kindName = kindName;
 this.propertyName = propertyName;
}
フィールドds,kindName,propertyNameを宣言して、
コンストラクタで引数の値を代入します。

これで、メソッドgetEntity()でのコンパイルエラーが解消されます。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月2日火曜日

テスト駆動開発の利点(その3)

前にも書きましたが、
このブログで掲載しているサンプルコードのテスト駆動開発の
やり方は、あくまで私のやり方です。
ここで書いている「テスト駆動開発の利点」も
私なりに行ううえでのものです。

テスト駆動開発の方法や効果を書いた書籍やウェブページは
沢山あります。
それらを網羅してまとめる、ということをしているわけではありません。

それでも、回帰テストが容易に出来る、というのは間違いない利点です。
開発中はもちろん、一度クラスの実装が出来上がってからも、
簡単にテストが行えますから、コードの改修を積極的に行えます。
「少なくとも、テストコードのカバーしている範囲では」、
コードの修正を行っても、きちんと動作することを確かめられます。


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/