サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
2024年ランキング
songofcloud.gluegent.com
UITableViewCellの現在表示されている位置を取得しよう、というんで素直に CGRect rect = cell.frame; と取ってみたくなりますが、スクロールが行われている場合はこれでは取れないです。このrectの持っている座標は、スクロールが行われてない場合の位置、つまり画面の外を指しています。 なので、どれだけUITableViewがスクロールされているかを取って引き算してやればいい、と。UITableViewにcontentOffsetなんてプロパティがあります。 CGPoint offset = tableView.contentOffset; rect.origin.x = rect.origin.x - offset.x; rect.origin.y = rect.origin.y - offset.y; めでたきかなこれで取れました。
UITableViewで、現在の行の次の行や前の行を参照したい場合、NSIndexPathを自分で生成しないといけないのだろうなと思いつくわけですが、さてどうしたもんか。 調べると、こうすればよいという情報がそこここにあります。 NSIndexPath newPath = [NSIndexPath indexPathForRow:3 inSection:1]; この場合、2番目のセクションの4行目を表すNSIndexPath が出来ます。出来ますが。 indexなどと始まる名前のクラスメソッドの常で、これはファクトリクラスメソッドで、生成するインスタンスに対して内部でautoreleaseしてます。イベントなどでなんども発生するようなメソッド内で書くと、あっという間にメモリを食ってしまいます。なのでちゃんと自分でオーナーシップを握るようにしないといけません。 そもそもNSIndexPath
GAE SDKでは、JDO/JPAの実装クラスの生成に DataNucleusを使用しています。Googleが提供するeclipseのプラグインではエンティティクラスのコンパイル時にDataNucleus Enhancerがクラスを拡張して保存します。 しかし、まれにDataNuclesがエラーになることがあります。 java.lang.NullPointerException at com.google.gdt.eclipse.core.ProcessUtilities.cleanupProcess(ProcessUtilities.java:367) at com.google.gdt.eclipse.core.ProcessUtilities.launchProcessAndActivateOnError(ProcessUtilities.java:271) at com.googl
Datastoreでクエリを使う場合、indexを定義したdatastore-indexes.xmlというファイルをWEB-INFの下に配置します。 eclipseのpluginを使ってローカル環境で開発を行っている場合、ローカル環境でクエリを行った際に自動的にWEB-INF/appengine-generated以下に"datastore-indexes-auto.xml"というファイルが作成されます。 以下がそのdatastore-indexes-auto.xmlの例です。 <!-- Indices written at Mon, 30 Nov 2009 05:59:46 UTC --> <datastore-indexes> <!-- Used 1 time in query history --> <datastore-index kind="Hoge" ancestor="fal
NSDictionaryがネストされているケースなどの場合いちいち取得してキャストしてといったようなコードを書かないといけないのかと思ってましたが一発で抜けるメソッドがありました。これは便利! NSDictionary* nested = ...; // わざわざこう書かなくても NSString toughName = [(NSDictionary*)[nested objectForKey:@"user"] objectForKey:@"name"]; // こう書ける NSString easyName = [nested valueForKeyPath:@"user.name"];
ここ数週間、GAEのデータストアが不安定な状態が続いています。 Datastore Performance Growing Pains 管理コンソールが表示されなくなるのも、この問題が原因のようです。 上記の記事では、この不安定な状態の原因を「App Engineの急激な普及」と分析しています。具体的には、ここ半年で2カ月ごとに25%ずつサービスが増加するという状況らしく、それに伴うインフラの整備が追い付いていないようです (さらに、もう2週間くらいは少なくとも不安定な状態になるだろう、と付記しています)。 この状況を受けて、2010/5/31からデータストアのパフォーマンスが安定するまでの間、データストアのCPUに関する課金は行わないという発表がありました (保存しているデータ量に関しては触れられていないので、多分課金されます)。課金が再度行われるようになる際には公式のブログで公開するそ
Objective-C 2.0ではガベージコレクションが導入されて、メモリ管理がだいぶシンプルになりましたが、iPhone開発ではその恩恵に預かれませんので、色々と気を使います。 NSArrayに要素を追加した時、NSArrayはその要素オブジェクトにretainメッセージを送ってオーナーシップを獲得します。NSArrayが解放された場合、格納されているオブジェクトすべてにreleaseメッセージが送られます。また、格納した要素をNSArrayから削除した場合、その要素にreleaseメッセージが送られます。 なので、こういう書き方をするのはちょいとよろしくありません。 NSArray *array = [[NSArray alloc] initWithObjects: [[Foo alloc] init], [[Bar alloc] init],nil]; // なんらかの処理 [arr
iPhoneではサファリ(おそらくその他のブラウザからでも)から電話、SMS、Youtubeなどに対するリンクを自動的に判別し、 個々のアプリを開いてくれるという機能がありますが、せっかくのこの機能自分のアプリでも使いたい!と思って調べてみました。 結果以下手順で、サファリからリンクを入力して起動することが出来ました。 まず、info.plistに以下を追記。ただし、これはXCodeからいじるとkeyの名前が若干違って見えるので注意です。 <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.gluegent.showAlert</string> <key>CFBundleURLSchemes</key> <array> <string>launchtest</string> </
注意 このエントリは実験中のJava入門教材のサンプルです GAE の調子が悪かったりQuotaを超えてたりするとデモがうまく動かないかもしれません 技術背景等はGooseあたりを参照してください Hello, world! まずは簡単なプログラムを作成してみましょう。Hello.javaという名前のファイルを作成して次の内容を書き込んでください。 public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } このプログラムを実行するには、コマンドラインで次のように指定します。 cd (ファイルを作成したフォルダ) javac Hello.java java -cp . Hello すると、「System.out.println("Hello, w
Google App Engineのデータストアは定期的にメンテナンスモードに入ります。 メンテナンス中はデータストアが読み取り専用になって一切の書き込みが禁止されます。 Python版にはCapabilityServiceというものが用意されていてこれらを調べるのは簡単ですが、Java版にはまだ用意されていないようです。 Java版で(無理せず)これをテストするには、次のようなサーブレットフィルタを用意してやります。 package com.example; import java.io.IOException; import java.util.concurrent.Future; import javax.servlet.*; import com.google.apphosting.api.ApiProxy; import com.google.apphosting.api.Api
Blobstoreのデータをアプリケーションで利用するに引き続き、どんな感じでGAEのBlobstoreにアップロードしたデータを解析しているか紹介。 とりあえず、下記のような形でPOSTとPUTをハンドルするサーブレットを作ってます。 POSTはBlobstoreにアップロードした後のリダイレクト先で、PUTはさらにそれを解析する部分です。 ... public class BlobAnalyzeServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String K_BLOB_KEY = "k"; private transient BlobstoreService blobstore; @Override public void init()
GAEのSDK 1.3.3がリリースされました。リリースノートはこちら。 プレリリースの内容がすべて盛り込まれたわけでもない感じ(データストアのID自動採番時に範囲を指定できるメソッドが入っていない)で、いくつかのバグフィックスや細かい修正が主です。いくつかダイジェストで紹介します。 アプリケーションIDとバージョンを確認するシステムプロパティの追加 System.getProperty()メソッドでデプロイした際のアプリケーションIDとバージョンをアプリケーションから取得できるようになりました。 プロパティ名を覚えるのが大変なので、SystemPropertyというクラスを使うといいと思います。 import com.google.appengine.api.utils.SystemProperty; ... String id = SystemProperty.applicationI
Google Bloggerにエントリを投稿するツールを作っていました。この辺からGData関連のライブラリをダウンロードして使います。正式なドキュメントはBlogger APIにあります。 まず、投稿するエントリを作成する部分。 String CATEGORY_SCHEME = "http://www.blogger.com/atom/ns#"; String title = ...; // 投稿タイトル String content = ...; // 内容 (HTML) List<String> tags = ...; // タグ Entry entry = new Entry(); entry.setTitle(new PlainTextConstruct(title)); entry.setContent(new HtmlTextConstruct(content)); for
Google App Engine SDK 1.3.2からはBlobstoreService APIにfetchDataというメソッドが追加されています。 これまではBlobstoreにデータをアップロードしても、アプリケーションの中から中身を見ることができなかったのですが、これを使うとそれができるようになる様子です。 ただしこのメソッド、1回に1MBずつしか転送できなかったりして面倒なので、InputStreamでラップしてみました。軽く実験したところ10MBのファイルを1秒程度で読み出せたりするなど、妙に優秀なので何か間違っているんじゃないかと不安になってます。 以下、ラップしたプログラムです。+expandとかで全部見えると思います。 package com.example; import java.io.IOException; import java.io.InputStream
共同で開発してると、appengine-web.xmlがAppIdとVersionの書き換えをする度に、コンフリクトしたり、デプロイ先を間違えたりと全くいいことがない。かといって、大事な設定項目もあるんで、各開発者でデプロイ先情報以外は統一しておきたい。そんな訳で、maven-replacer-pluginを使ってプロファイルを元に自動生成するようにしてみた。 構成はこんな感じで。 project |-src/main/java | : +-template | |-appengine-web-template.xml |-pom.xml appengine-web-template.xml <?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"
2/10に1.3.1がリリースされていました。すっかり遅れた情報な上に内容もイマイチ把握できていませんが、一応書かなきゃなということで。 残念なことに調査に時間が取れずにいます。申し訳ないです。...とはいえ、これでも既に数時間は費やしていますが。 データストアのクエリのカーソル http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors 1.2.8から隠れていた機能がようやく正式なものになったようですね。 トランザクションタスクの作成 なんでしょう。今までのタスクキューではトランザクションはサポートしてなかったのかな? カスタム管理コンソールページのサポート なんでしょう。管理コンソールに独自のページでも作れるんでしょうか? cron設定に新しい構文 "month"
技術評論社から、Google App Engine実践リファレンスが出版されました。弊社から出している、Google App Engine for Java [実践]クラウドシステム構築とターゲットにしている環境は一緒ですが、スタンスが違う書き方がされていて、面白いと思います。社内でも読んでみましたが、以下のようなことがいえると思います。 まず、この本をお薦めしたのは、以下のような人です。 これからApp Engineを使って「プログラミング」をしてみたいと思う人 簡単なウェブアプリケーションJavaで書いたことがある人 英語や日本語の文章を読むのが得意でなく、プログラムを写経して動作を確認しながら理解を深めたい人 対して、以下のような人はちょっと物足りないと感じるかも知れません。 App Engineを使ったシステムの「設計」や「評価」を行う人 データストアの挙動を根本から理解したい人
送金のトランザクション処理パターンでは、Google App Engine (GAE)のEntity Groupにまたがるトランザクション処理を行う方法について紹介しました。また、それに少しだけ最適化を施した結果、下図のような処理になりました。 しかし、このトランザクション処理はいくつかの制約があります。 (a) 送金中に合計金額がずれる (b) 送金先の口座に制約をかけられない このトランザクションはEventual Consistency (結果整合性)というレベルの整合性保証しかしないため、2つのEntity Groupの値にずれが発生する場合があります(a)。たとえば、口座(A)から口座(B)に1000円だけ送金する場合、(1)と(2)の間は「口座(A)から出金したが、口座(B)に入金されていない」という状態になります。 また、送金元の口座に制約はかけられますが、送金先の口座に制約
Google App Engineのデータストアを利用する場合、公式にはJDOおよびJPAが提供されています。 過去にJDOからSlim3 Datastoreに乗り換えるようなことも書いていますが、最近のJDOについて少し書いてみたいと思います。 今回は、Google App Engine Blog: JPA/JDO Java Persistence Tips - The Year In Reviewで紹介されている内容をもとに話を進めます。JDOの使い方自体に詳しくなくてもある程度読めるように書いたつもりですが、何かあればコメントください。 相互参照する one-to-many の関係 (episode 1, 3) JDOを利用すると、相互参照を行うone-to-manyの関係を簡単に記述できます。 下記はParentクラスのオブジェクトが、複数のChildクラスのオブジェクトを保有する
気づくと、GAEのTOPページにこのような記述が増えていました。 Google Apps アカウントで Google App Engine にログインする場合は、次の URL を使用してください。 https://appengine.google.com/a/<YOURDOMAIN.COM>/ Google Appsアカウントで試してみました。 開発者として招待してみると、Googleアカウントで利用する際と違い、招待メールの内容にGoogleアカウントの承認リンクとは別にGoogle Appsアカウント用の承認リンクが追加されています。 To sign in with your Google Account and accept or decline this invitation, simply follow this link: <Googleアカウント用承認リンク> OR, if
GAEを利用したアプリケーション開発・保守に関わっていらっしゃる方であれば、GAEへのデプロイ、テスト、運用時の障害というのは気にかかるところです。 Google App Engine Downtime Notify ではメンテナンスによる事前のスケジュールも含めて、Googleからのダウンタイムの通知が行われており、このグループのメーリングリストに参加すると、Googleからの通知専用のメールが配信されます。
Webアプリケーションを開発する際に、Googleを始めとした様々なWebのサービスを利用する機能を実装することが多くなってきたのではないでしょうか。その際に必要なAPIが各サービスプロバイダから公開されているケースが多く、手軽に試すことが可能です。 GoogleのGData APIでは、Java、JavaScript、.Net、PHP、Python、Objective-Cといった様々な言語で開発するアプリケーションから、Googleのサービスのデータを利用出来ます。
AppEngine1.3.0で新しいAPIとして50MBまでのファイルを登録することが出来るBlobstore APIが公開されました。今までは10MBのアップロード、Datastoreには1MBずつしか登録出来なかったので、これは非常に期待がもてるAPIです。折角なので公式ドキュメントを参考に一通り試してみました。 Blobstoreとは? BlobstoreはDatastoreの厳しいサイズ制限を超えて50MBまでのファイルを登録し、利用することができるサービスです。(Billingを有効にしていないと利用することが出来ません。)このサービスは、Datastoreの様に直接アクセスして利用するのではなく、サービスの受け口に対してWebフォームや、HTTP POSTメソッドによって行われます。従って、アップロード/ダウンロードにかかる処理時間はAppEngineの30秒制限の影響受けるこ
Eclipse のGoogle Plugin の 1.2.0.v200912062003 ではGWT2.0の開発がサポートされています。 GWT2.0の新機能であるUiBinderを利用した開発支援機能も用意されており、お手軽に試すことが可能です。Eclipse3.5.1(Java6)で実際に動かしている様子を紹介してみたいと思います。
先ほどApp Engine SDK 1.3.0がリリースされました。 新機能について簡単に紹介します。 Blobstoreサービス 今回のアップデートの最大の目玉は、Blobstore APIが追加された点です。 これまではApp EngineのDatastoreを利用していましたが、これに格納できるそれぞれのデータは1MBという厳しい上限があったため、巨大なデータを格納する用途には向いていませんでした(巨大なデータを格納するには、データを分割したり、他のサービスと連携したりしていました)。 今回追加されたBlobstoreは巨大なデータ(Binary Large OBject)を格納するためのAPIで、50MBまでのデータを取り扱えるようです。 ただし、APIを見る限りでは、ファイルの内容を直接アプリケーション内で操作する用途ではなく、現時点ではアップロードされたファイルの保存と、そのフ
先日App Engine SDK 1.2.8 for Javaがリリースされました。 公式のリリースノートに記載されていない非常に重要な機能追加がありますので、ここで紹介します。基本的にすべてデータストアのお話です。しかもLow-Level API。 ご指摘いただきまして、ミスリードしそうな個所について修正しました。今後もわかったことがあれば追記していく予定です。 プロダクション環境でカーソルが予想外の動きをしました。このため、開発環境と両方で動くコードに更新しました カーソルの追加 これまでデータストアでページング処理を行う場合には、ページング用のプロパティを用意したり、ページング用のインデックスを用意したりと、様々な力技が提案されてきました。 しかし、今回のアップデートでCursorという「クエリの現在位置を覚えておくオブジェクト」がひっそりと追加されました。これを利用すると簡単にペー
AppEngineで開発している時に開発環境ではなく、実環境上でデバッグしたい事がよくあります。しかし、実環境上では当然ログのtailなど出来るわけはなく、ログを見るためにログページへ行って毎回リロードなんてことをしなければならず、これが非常に苦痛です。そこで巷では見捨てられた感もあるXMPPServiceを使ってログを通知出来る仕組みを作ってみました。利用したロギングライブラリは、sl4jとlogback-classicです。 まず、以下のようなXMPPServiceにログを出力する為のAppenderを作成します。 public class XmppAppender extends AppenderBase<ILoggingEvent> { private XMPPService service = XMPPServiceFactory.getXMPPService(); privat
App Engineでテキスト部分一致検索を紹介してみようと思います。 とりあえず新しい発見があったので、あまり効率的でない「接尾辞の列挙」という方法で実現してみます。 なお、サンプルコードは全てSlim3 Datastoreとデータストア低レベルAPIを利用して書かれています。 今回のエントリの内容は開発サーバ(1.2.6)で正しく動かないようです。試してみる方は、デプロイすることをお勧めします。 前方一致検索 App Engineのデータストア上で検索を行う場合、インデックスの「レンジスキャン」という方法で目的のエンティティが探し出されます。 これは、データストア上にソートされたインデックスエントリの開始位置と終了位置を指定して、その範囲全体を抜き出すイメージです。 これをうまく利用すると、テキストの「前方一致検索」が実現できます。 テキストはUnicodeの辞書式順序でソートされてい
GoogleにはCalenderやBlogger、Picasaといったサービスがありますが、GAE/J上でそれらのサービスと連携したいケースは多くあるかと思います。 本家のサンプルコードは充実していますので、Googleのアカウントをお持ちの方は試してみると楽しいのではないでしょうか(なんとGoogle Financeのサンプルまであります。)。
次のページ
このページを最初にブックマークしてみませんか?
『Song of Cloud』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く