技術

AppEngineでCounterを実装する #appengine #slim3

※本エントリーのソースには誤りがありました。修正版はこちらCounterの実装に興味がある人がいるようですのでアップしておきます。 仕様は increment()でカウントアップ カウントは日毎に持つ clear()でカウントを0に戻す 単純なカウンター import java.io.S…

javaのenumを定数クラスだけに使わないでより良い使い方を学ぶ

enumは型安全な列挙定数が作れるこれですね。 public enum Sample { HOGE, FOO, BAR, } enum basics - しげるメモによるとenumってクラス本体にメソッド定義できるんですね。 public enum Sample { HOGE, FOO, BAR, ; // セミコロンで区切る public boolean …

appengine java night #3に行ってきた。 #appengine #ajn3

いやー今回も濃くておもしろかったですね。こんな濃い人が集まるApp Engine勉強会はたぶん日本でここが一番なんじゃないかと思います。 ソースを見るなり質問が飛ぶ飛ぶ!しかも普通の質問じゃないんですよね。裏でクラウドがどういう風になっているかを話し…

#slim3 のドキュメント日本語訳

id:bufferingsさんがありがたいことに翻訳してくれた。 http://d.hatena.ne.jp/bufferings/20091123/1258983438 slim3を使わない人でもappengineの特性が記載してあって良いドキュメントになっているのでappengineを使う人は必読ですよ。 いくつか知らなかっ…

javascriptの通称サイ本(初めてのJavaScript 第2版)が2009年11月28日 発売予定

定番書『初めてのJavaScript』の改訂第2版。本書では基礎固めとしてまずこの言語の基本的な構文や機能を、数多くの実例を通して学びます。後半の章では最新のWeb開発テクニックを例に、標準に準拠したWebサイトを構築するための正しいコーディング手法を解説…

GAEのログにおける時刻表示のタイムゾーンをPSTからローカルのものに変換するスクリプト #appengine

greasemonkeyスクリプトでログの日付を現地時間で表示するスクリプトを公開されています。これは便利ですね。 GAE Log Timezone Adjusterを更新しました - やればできる子の日記

#appengine にてMailAPIのOverQuotaExceptionを発生させてみた。

エラー内容は下記 org.slim3.controller.Controller runBare: The API call mail.Send() required more quota than is unavailable. com.google.apphosting.api.ApiProxy$OverQuotaException: The API call mail.Send() required more quota than is unavail…

GAE/Jでロールバックを実装する(2)#appengine

前回はJDOでしたが、slim3がJDOではなくなったので新しいDatastore版を作りました。前回と異なるのは保存元のモデルをEntityGroupのルートエンティティにしてBackupをEntityGroupに加えたことです。以前まではEntityGroupの考え方がわかっておらず、こんな時…

#appengine のDataviewerでNo Data Yet.

データを大量に削除しまくった後にDataviewerを見たら下記のメッセージが出てて、全部消えたのかと思ってあせった。。。 特定のKindしか削除していないのにDataviewerからは何も検索がヒットしなくなった。どういう仕組みなんだろう?アプリからはちゃんと検…

#appengine で一回に削除できる件数って500件だったんだ。

DatastoreService#delete(Key akey[]);で500を超えるKEYを引数に渡すと以下のエラーが出た。 org.slim3.controller.Controller runBare: cannot delete more than 500 entities in a single call java.lang.IllegalArgumentException: cannot delete more th…

appengineでエラーが出た(commit: Operation commit failed on resource)

org.datanucleus.transaction.Transaction commit: Operation commit failed on resource: org.datanucleus.store.appengine.DatastoreXAResource@adb24, error code UNKNOWN and transaction: [DataNucleus Transaction, ID=Xid= タスクキューで処理中にエ…

appengineのjunitでログイン状態で動作させる方法

ApiProxy.setEnvironmentForCurrentThread(new ApiProxy.Environment() { public String getAppId() { return "unit test"; } public Map<String, Object> getAttributes() { return new HashMap<String, Object>(); } public String getAuthDomain() { return "gmail.com"; } public String </string,></string,>…

appengine java night #2( #ajn2 )に行ってきた

1回目の感想をblogに書いてなくてごめんなさい。ごめんなさい。blogに書くまでが勉強会ですよね。さて、今回は一気に70人以上の会場になりました(前回は30人ほど)。会場が大きいと質問をしにくくなって質問が減ってしまうのではないかと心配していましたが、…

appengineでRequest was aborted after waiting too long to attempt to service your request.が出た

1.2.6がリリースされたあたりから急に表題のエラーが頻発しました。原因はたぶんこれだったようです。いまはエラー発生はしていません。この情報を得るまでに検索していたところ下記の情報が見つかりました。 初期化中のランタイムに対して転送された後続の…

appengineのweb.xmlはバージョン間で共通なのか?

セキュリティ設定を有りと無しのバージョンを用意してみたけど共通じゃないようですね。

appengineのTaskQueueで意図的にリトライさせたい場合

時間切れやスピンロックのために意図的にリトライさせたい場合がありますが、下記のようなコードでリトライさせてます。 response.sendError(400);

appengineでTaskQueueを動かした時のリクエストヘッダーの値からリトライ回数とキュー名を取得する

http://id-bluerabbit.appspot.com/taskQueue/addにアクセスされたら下記のコードでTaskQueueをaddするコードを書いた QueueFactory.getDefaultQueue().add(TaskOptions.Builder.url("/task/run")); そのTaskQueueが実行された場合のリクエストヘッダーの値…

今日のappengineは調子悪い?

朝方TaskQueueで下記2つのエラーが頻発していた。 TaskQueueなのでエラー時に自動リトライされて最終的には正常終了していた。 いつもなら3分で終わる処理が30分ほどかかった。 Request was aborted after waiting too long to attempt to service your req…

HTML5のWeb DatabaseをDeferrerdでラップして扱うORM, jsdeferred-webdatabaseが公開された。

html5のclient side databaseの非同期が辛すぎる。 - あおうさ@日記と書いたばかりでしたが、タイムリーなことにid:secondlifeさんが素晴らしいライブラリを公開されました。それがjsdeferred-webdatabaseです。 ライブラリ作成の動機は次のように語られて…

appengineでMemcacheを使ったLockを実装した

id:kazunori_279さんのMemcacheでスピンロックを実装してTask Queue処理結果を集約してみるテスト - スティルハウスの書庫が便利な仕組みなので実装してみた。実はこれを実装するのに前エントリのMemcacheCounterを使っているのでそれもエントリした。 Memca…

appengine用のMemcacheCounterを作ったので紹介

仕組みは以前書いたこの方法 MemcacheService s = MemcacheServiceFactory.getMemcacheService(); if (!s.contains("MemcacheCounter")) { s.put("MemcacheCounter", 1); // 初期化は1 } else { s.increment("MemcacheCounter", 1); // 2回目以降は値に+1す…

appengineのTipsおれおれメモ

高速化 one to many で子を特定してから親を取得してそれから全ての子供を取得する。 DBマイグレーション bigtableはスキーマレス(行毎に異なるプロパティを持つことができる多次元MAP) null値とmissingが区別される。missingプロパティでソートするとデー…

html5のclient side databaseの非同期が辛すぎる。

html5ではブラウザにDBが入ります。それがclient side databaseです。そのDB処理なのですが、実際にコーディングした人なら非同期地獄に苦しんだはずです。DBの処理を楽にするフレームワークより直列にかけるフレームワークが必要ですね。そこで、JSDeferred…

appengineはRead Committed相当だがcommit()には2つのマイルストーンがあることを忘れてはいけない

ここに詳しく書いてあることを本エントリは書いているだけですが、重要な内容なので書いておこうと思います。 appengineのトランザクション分離レベルはRead Committedとほぼ同等です。主要なRDBMSの一般的なトランザクション分離レベルということです。しか…

HTML5のGeolocation API

携帯電話およびPCのWebブラウザ向けの位置情報特定のためのAPI 携帯電話の場合は最寄の携帯電話基地局かGPSを使用して位置を特定 PCの場合はIPアドレスを利用してユーザーの位置情報を特定する 対応ブラウザは携帯端末ならIE Mobile、PCはIEとFirefox jsを使…

appengineのコンソールログはversion毎に異なる

google app engineではwebの管理画面からログを参照出来ます。タイトルの通りこのログはバージョン毎に変わります。どういう事かと言うと、ver1とver2があったとしたらver1で障害があったので、ver2をデプロイした場合にそのバージョンではver1のログは見れ…

appengineのcron.xmlはversion間で共通

google app engineにはバッチ処理用にcronを実行することが出来ます。cronと言っても特定のurlを特定の時間にリクエストする仕組みです。 それを使ってバッチ処理を行ないます。先日この機能を使ったアプリケーションで障害を発生させてしまいました。その時…

jQuery Visual Cheat Sheet

jQuery Visual Cheat Sheet is an useful and practical reference to jQuery 1.3 for web designers and developers designed by me. This cheat sheet (6 pages) contains the full jQuery API reference with detailed descriptions and some sample code…

GAE/JでXML解析(xpath)を行う方法

セットアップ ここから下記のjarを取得 serializer.jar xalan.jar xercesImpl.jar xml-apis.jar xsltc.jar war/WEB-INF/libにコピーする サンプルソース String xml = " <inventory> " + " <book year=\"2000\"> " + " <title>Snow Crash</title> " + " <author>Neal Stephenson</author> " + " <publisher>Spectra</publisher> " + " <isbn>0553380958</isbn></book></inventory>

GAE/JでJDODetachedFieldAccessExceptionが発生した場合

google appengine for javaでJDODetachedFieldAccessExceptionが発生した。 エラーメッセージ javax.jdo.JDODetachedFieldAccessException: You have just attempted to access field "toAddressList" yet this field was not detached when you detached th…