[appengine]不要なインデックスを削除するコマンド
投稿者: miztaka, カテゴリ: appengine, java, tags: appengine, google, java忘れがちなのでメモ。
cd appengine-java-sdk-xxx\bin appcfg.cmd vacuum_indexes c:\path\to\eclipse\project\war
[appengine]不要なインデックスを削除するコマンド はコメントを受け付けていません
6月
25
2013
[appengine]不要なインデックスを削除するコマンド投稿者: miztaka, カテゴリ: appengine, java, tags: appengine, google, java忘れがちなのでメモ。 cd appengine-java-sdk-xxx\bin appcfg.cmd vacuum_indexes c:\path\to\eclipse\project\war [appengine]不要なインデックスを削除するコマンド はコメントを受け付けていません
6月
05
2013
Provisioning APIがdeprecatedになったのでDirectory APIに移行してみた投稿者: miztaka, カテゴリ: appengine, java, tags: appengine, google directory api, javaDirectory APIで 2-legged OAuth を使って認証Google Appsのユーザー情報を同期しているappengineのアプリケーションでProvisioning APIを使用していましたが、deprecatedになっていました。(2015年で終了。。) Directory API は ユーザーやグループのUniqueIDも取得できるので、メールアドレスの変更などにも追随できて管理がより楽になります。 サンプルコードの実行条件
認証にはMarketplaceのCONSUMER_KEYとCONSUMER_SECRETを使用します。 ApplicationManifestに追加するスコープGoogle Apps Marketplaceの ApplicationManifestに以下のスコープが必要になります。 <Scope id="userProvisioningAPI"> <Url>https://www.googleapis.com/auth/admin.directory.user.readonly</Url> <Reason>This app displays all members in domain.</Reason> </Scope> <Scope id="groupProvisioningAPI"> <Url>https://www.googleapis.com/auth/admin.directory.group.readonly</Url> <Reason>This app displays all groups in domain.</Reason> </Scope> サンプルコードまずはOAuthパラメータをセットしてDirectoryAPIインスタンスをビルドします。 NetHttpTransport TRANSPORT = new NetHttpTransport(); JacksonFactory JSON_FACTORY = new JacksonFactory(); // The 2-LO authorization section OAuthHmacSigner signer = new OAuthHmacSigner(); signer.clientSharedSecret = CONSUMER_SECRET; final OAuthParameters oauthParameters = new OAuthParameters(); oauthParameters.version = "1"; oauthParameters.consumerKey = CONSUMER_KEY; oauthParameters.signer = signer; //oauthParameters.signRequestsUsingAuthorizationHeader(transport); // Directory API構築 directory = new Directory.Builder( TRANSPORT, JSON_FACTORY, null) .setApplicationName(APP_NAME) .setDirectoryRequestInitializer(new DirectoryRequestInitializer(API_KEY)) .setHttpRequestInitializer(oauthParameters) .build(); ユーザー一覧の取得例です。customKeysにadminアカウントをセットします。 customKeys = new ArrayMap<String,Object>(); customKeys.add("xoauth_requestor_id", ADMIN_ACCOUNT); Directory.Users.List list = directory.users().list(); list.setUnknownKeys(customKeys); list.setCustomer("my_customer"); list.setMaxResults(USER_PAGE_MAX); List<User> result = new ArrayList<User>(); for(;;) { Users users = list.execute(); for (com.google.api.services.admin.directory.model.User u: users.getUsers()) { result.add(u); } if (users.getNextPageToken() != null) { list.setPageToken(users.getNextPageToken()); continue; } break; } setCustomer(“my_customer”); とすると管理下の全てのユーザーが取得できる。 OAuth 2.0 には対応していないようなんですが、どうなんでしょうか。少なくとも今のところ2.0でのやり方を見つけられていません。 Provisioning APIがdeprecatedになったのでDirectory APIに移行してみた はコメントを受け付けていません
4月
24
2013
App Engine Search (Full text search) の不思議な仕様投稿者: miztaka, カテゴリ: appengine, java, tags: appengine, javaappengineのSearch Service(full-text search) はまだexperimentalですが非常に魅力的な機能です。 正式リリースされればデータの種類によってはDatastoreの代わりに使用することもできそう。最大の特徴は検索の柔軟性にあるでしょうか。 ただし使ってみていくつか不思議な仕様に気づいたので注意が必要。簡単にまとめてみます。 DATE型は時刻を持てないDATE: a date with no time component とドキュメントにあるようにあくまで日付だけしか持てないようです。 DATE型はSDKにバグ?eclipseの環境でtime部分をクリアしたDateをこのフィールドに渡しても、= のクエリーでヒットしません。 TEXT型は同一フィールド名で複数の値を保持可能addFieldを繰り返して同じフィールド名に異なる値を追加できるようです。 Document.newBuilder() .addField(Field.newBuilder().setName("text1").setText("hoge") .addField(Field.newBuilder().setName("text1").setText("fuga") .build(); HTML型も可能でしたがNUMBER型はExceptionが発生しました。 TEXT型に = でクエリーした場合、どういう条件でヒットする?Numeric operators only match against numeric and date fields. と書いてありますので当然かもしれませんが、TEXT型に = を指定したクエリーを実行しても完全一致にはなりませんでした。
という結果でした。 完全一致が使えると(全文検索以外に)使い途が広がるのですが、文字種を限定するなど工夫が必要そうです。 とりあえず気づいたのはこんなところですがまだまだ落とし穴があるかもしれません。 App Engine Search (Full text search) の不思議な仕様 はコメントを受け付けていません
6月
08
2012
App Engine Java用データストアの透過キャッシュを作りました投稿者: miztaka, カテゴリ: appengine, java, slim3, tags: appengine, javaソースコードは こちら に公開しています。 概要データストアのRead/Writeの無料課金枠が結構シビアなのでもはやキャッシュなしではやっていけないと思ったのがこれを作るきっかけでした。(速度的にはデータストアの呼び出しがそんなに遅いとは感じないのであくまで課金対策が主眼です。) 既存のコードにできるだけ手を入れないで実現したかったのでApiProxyを使ってdatastoreのAPI呼び出しをhookし、protocol bufferのrequest,responseをそのままキャシュしてはどうかと思いつきました。 キャッシュ対象とするのはQuery(RunQueryメソッド)でGetはもともと安いので対象外としました。RunQueryメソッドをhookしてキャッシュにデータが存在すればdatastore APIは呼び出さずにキャッシュしたレスポンスを返す、キャッシュにデータが存在しなければそのままAPI呼び出しをしてresponseをキャッシュする、というしくみになっています。 WriteよりReadのほうが圧倒的に多いシステムではキャッシュヒット率が高くなるのでこのしくみは有効かと思います。 必要なライブラリ
使い方必要なjarファイルを追加して、web.xmlのfilterChain先頭に以下のフィルター設定を追加するだけです。 <filter> <filter-name>CacheContextFilter</filter-name> <filter-class>jp.honestyworks.pbcache.ContextFilter</filter-class> </filter> <filter-mapping> <filter-name>CacheContextFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> その他の特徴
制限
本題とは関係ないけど、ktrwjr が便利テストをするにあたり、slim3に組み込まれているktrwjrを使ってみましたがすごく便利!これは素晴らしいです。 ダウンロードオープンソースとしてありますので自己責任でご自由にお使いください。 フィードバック使っていただけた方は些細な事でもフィードバックいただけると嬉しいです。protocol buffer はあまり詳しくないので探り探りの実装になってます。 App Engine Java用データストアの透過キャッシュを作りました はコメントを受け付けていません
6月
06
2012
[tips] CodeMirror導入時にIEでエラーが出たら・・・投稿者: miztaka, カテゴリ: PHP, tips, なんでもCMS, tags: codemirror, phpCodeMirror はブラウザ上でのソースコード編集に便利なjavascriptモジュールです。 今回の原因は、CodeMirrorで編集対象のtextareaタグがpタグの中に入っていたことでした。(なんと単純) たったこれだけのことで結構はまってしまいました。 [tips] CodeMirror導入時にIEでエラーが出たら・・・ はコメントを受け付けていません |