ラベル GAE の投稿を表示しています。 すべての投稿を表示
ラベル GAE の投稿を表示しています。 すべての投稿を表示

2020-02-22

GAEにFlaskアプリをデプロイする

以前に
という記事で、zappaを利用してAWSにFlaskのウェブアプリをデプロイする手順を書きましたが、GAEだと思いの外、簡単だったので紹介します。

前提条件
  • GCP(Google Cloud Plaform)はすでに使えるように登録していて、GAEを利用するGCPのプロジェクトもすでに設定済みであることとします。(この辺りの話はどこかググってください)
  • ローカルでFlaskが動く環境を作っておきましょう
  • Google Cloud SDKもダウンロードしておいてください

サンプルプログラム
参考にしているサンプルはgitでダウンロードしてください。
  • git clone https://github.com/GoogleCloudPlatform/python-docs-samples
この中で、下記のファイルがサンプルです。
  • python-docs-samples/appengine/standard_python37/hello_world
これを用いて説明します。なお、コードは触ることはないでしょう。

ファイル構成
ここで利用するファイルは下記です
  • main.py・・・プログラム本体
  • app.yaml・・・設定ファイル
  • requirements.txt ・・・ライブラリ情報
  • libディレクトリ ・・・外部ライブラリをいれる場合に必要?
Flask関係の知識があれば、特別なファイルではないことに気づくかと思います。

デプロイ方法
とりあえず、普通のFlaskファイルなのでローカルで動くことを確認したうえで、デプロイしましょう。何も触らなくても動くはずです。コンソールで下記のGCPコマンドを打つだけです。カレントディレクトリはそのファイルがある場所に移動しておいてください。
  •  gcloud app deploy
ディレクトリ下の全てのファイルをアップしようとするので注意してください。実行は、URLを入力するか
  • gcloud app browse
を入力してください。

ちょっとGAEを再び使おうかと思ったり、、、
GAEは10年近く前に流行って、それから料金体系が改悪されて以降、個人的にあまり触らなくなり、最近はノータッチでしたが、ちょっとサーバーレス系の開発することになり、ふと思い立ったら使い勝手も良くなってました。GAEブームがまた来てもいいんじゃないでしょうか。。。


2013-10-18

GAE:文字化けが起きないようにするための設定

サーバーをGAEにして楽天WebサービスからJSONでデータをとってきたところ文字化けが発生。
文字化け問題はJavaでプログラムを組んでいればよくある話であるが、今回厄介だったのは、
  • ローカル環境なら文字化けをしないのに、本番環境で稼働すると文字化けを起こす
という点。本番で動かすまで全く気づかず、試しにデプロイしたらURLクラスでとってきたJSONデータだけ文字化けを起こしていたという。。。日本語が全て文字化けをするわけではないので、URLクラスの処理の部分で日本語をうまく扱えてないんだろう。。。と推測。

で、対処法ですが、GAE自体が扱う文字コードをUTF-8であると明示的に設定する必要があり、下記の通り、文字コードを指定することで解決。ローカル環境だと気づかないので、もう基本的にこの記述を書くようにした方がいいですね。



2013-02-27

GAE:Java7に対応へ

ようやく、Google App EngineがJava7対応になるようです。
Java 7 Considerations
現在は試験運用のようです。Java6のコードが動かなくなるという意味ではないと思いますが、ただ、「Java 6ベースのアプリがJava7で動くかどうか試しとけ、、」みたいなことは書いてますので、移行に向けて確認をしておくほうがいいでしょう。
この件はGAEのサーバの話ですし、将来的にJava6のサポートを廃止するようですので、我々開発者には「Java7に移行しない」という選択肢はないと考えたほうがいいでしょう。

ちなみに移行時にはいきなりどーんと変わるんでしょうかね?スイッチみたいなのを用意するのでしょうか?気になるところです。






2012-12-24

GAE: appengine-web.xml does not contain a element.

タイトルのようなエラーがGAEアプリで出るようになった。どうやら、war/WEB-INF/appengine-web.xmlファイルに
<threadsafe>true</threadsafe> 
というのが必要らしい。



2012-06-28

GAE/JからSimpleDBを利用する方法

GAEはDatastoreの有料化に伴いとても使いにくくなりました。かといって、他のクラウドサービスはJavaを動かすだけでちょっとお高く、、、という感じで、帯に短しタスキに長しという感じで、個人的にはGAEのプラットフォームはとても好きだけど使えない。。。と悶々としておりました。
 一方、データベースについてはDynamoDBとかSimpleDBなどAWSが魅力的なサービスを提供してますので、GAEとAWSをうまく組み合わせることができたら最高じゃないか?っていうのは誰もが気づくことです。しかし、GAEの制約により、AWSのSDKは使えないということになっています。困ったもんです。。。
ですが、SimpleDBやDynamoDBなどのサービスはRESTインタフェースを持っているわけで、SDKなんか使わなくても単純なRESTアクセスをすれば、GAEからアクセス可能なはずです。だれかそういうことをやっている猛者はいないのかといろいろ探していたのですが、ようやくいいソリューションを発見しました。

Alanwilliamson's Library
RESTを利用してSimpleDBにアクセスする試みってのは探せばあるもんでして、
に、そのライブラリがありました。これを使います。マニュアル等はありませんが、これをつかうことでAWSのSDKなしで純粋なHTTPクラスのみでアクセスできます。ただし、これのみではGAEでは使えません。試したらみたらわかりますが、FileOutputStreamなどを使っているのでこれらがGAEで使えないというエラーが出ます。困りましたね。

Koherent-App-Engine-Library-for-Java
探せばあるもんで、
このライブラリは、
FileOutputStream、FileInputStreamをDatastoreOutputStream、DatastoreInputStreamに置き換える
ということができます。上記のAlanのコードを書き換えましょう。

Content-typeを修正する
上記2つを組み合わせることで、無事動く、、、と言いたいのですが、putAttributeを実行するとなぜか認証エラーがでます。DomainListsの入手では問題ないのに。。。。これは、SimpleDBのRESTの仕様のバグか何か?で
//urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded" );
urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=utf-8" );
のようにヘッダの記述部分を書き換えることで解決します。

おそらく、AWS+GAEの組み合わせを希望しつつ、断念していた人も多いのではないかと思います。しかし、この方法なら大丈夫なはずです。細かいコマンドの動作はまだ試してませんが、後日、ノウハウをまとめたいと思います。


2012-03-06

GAE:Unable to restore the previous TimeZone

EclipseでGAEプロジェクトを起動しようとしたら、
Initializing App Engine server [ERROR] Unable to start App Engine server java.lang.RuntimeException: Unable to restore the previous TimeZone
というエラーが発生。どうやら実行時のタイムゾーンの設定が必要らしい。手順は以下のとおり。
  1. Run Configurationを開く
  2. Argmentsを開く
  3. VMのオプションとして、-Dappengine.user.timezone=JST  または  -Dappengine.user.timezone.impl=JST のどちらかを追記。(追加はスペースを開けること)


2012-02-28

低コストなのはやはりGAEなのか 〜Elastic Beanstalkを触ってみて〜

先日からAmazonのJavaのPaasであるElastic Beanstalkを使っているのだが、思ったより金銭的コスト高い気がしてきた。Beanstalkはそれ自体の料金は無料で、バックで動いているEC2などの利用料金が取られる仕組みになっている。このバックで動いているサービスが厄介な感じだ。 

インスタンス課金の問題 
例えば、EC2はインスタンス単位の従量制課金になっている。GAEもインスタンス課金に変わったが、ちょっとこれとは意味が違う。まず、バックで動くEC2インスタンスは、ウェブアプリにアクセスに関わらず常時動いているということになる。先日でお試しでEnvironmentを作ってちょっとアプリを置いて、数回試しただけなのだが、Account Activityを確認してみたら、
Amazon EC2 running Linux/UNIX 186 Hrs 
となっている。186Hrsってどういうこと?アカウント作成したのはほんと数日前で、ほとんどアクセスしてないのに。。。なぜ186時間なのかといえば、
  • アクセスがなくてもインスタンスは起動し続けている
  • 1Environmentごとに1インスタンスが起動
という仕組みで、お試して2つぐらいEnvironmentを作ったままにしていたからそうなった感じ。まあこれは世間的にはあたり前のことかもしれないけど、今までGAEしか使ってなかったものからするとちょっと意外なんですよね。

もれなくサービスがついてくることの問題
Elastic Beanstalkってとても高機能なJavaサーブレットコンテナですが、それはつまり単体のサービスではなく、いろいろなサービスを組み合わせたものであると。。。しかも有料のね。おさらいするとElastic Beanstalkとは、
  • Amazon EC2
  • Amazon EC2 EBS
  • Elastic Load Balancing
  • Amazon CloudWatch
  • Amazon Simple Notification Service
がバックで動いていることで、スケーラビリティの高いPaaSを実現しているわけですが、これらは使うと当然課金されます。で、やっかいなことにBeanstalkではこれらのサービスがもれなくついてきます。ロードバランサーなんかいらないんだけど、、、といっても外せません。だから、ロードバランサーについても今現在で、
Elastic Load Balancing 199 Hrs
という課金になっています。これは1Environmentを構築するたびに、Load Balancingも立ち上がっているということが原因です。

文句があるならEC2で環境構築しろや
まあ、そういうことでしょうね。EC2単体でLinuxを用意してそこで環境整備すればそれで解決するのだとは思います。ですけどね、、、環境整備が面倒だからこういったPaaSに感心があるわけでー。逆に言うと、そういう手間暇かからないんだから金は取られて当然ってことになるんですかね。

やっぱりGAEって安いのかな
そう考えると、GAEってやっぱり安い気がします。インスタンスは、アクセスが有るときのみ動いているようですし無料枠もあります。GAEが正式版になって、「1日28インスタンスだけ?!高すぎ」とか思ったりしましたが、使わなければ課金されないという手軽さがあるんですよね。

AWSにも無料枠はありますので、実際今のところ課金は発生していません。ただ無料枠適用は最初の1年だけのようですし、今後、永続的に利用する環境となるとちょっと心配です。まあ、毎月数千円でインフラが整うっているのは、一般的にみると安いんでしょうね。大学はいちおう回線ありますし、マシンもありますから別にEC2とか使わなくてもいいのでは?と思われるかもしれませんが、やはりメンテナンスが。。。研究室レベルのちょっとしたインフラとしてはちょっとBeanstalkやEC2は割りに合わないのかなぁ。




2012-02-26

Netbeans7.0.1でGAEプラグインを動かす

Netbeans7.0.1でGAEのプラグインを動かそうとしたのだが、相変わらず7以上のバージョンに対応したプラグインは存在せず。仕方なく6.9用のプラグインをダウンロードするもインストール時に
Javaヒント(バージョン4以上)が必要です
というエラーが発生してインストールできないという事象が発生。ネットでもあんまり話題になっておらず(NetbeansでGAEってマニアックな感じだし)、どうしたものかと困っていましたが解決策がわかりました。
6.7.1用のプラグインをkenaiからダウンロードする( http://kenai.com/downloads/nbappengine/1.0_NetBeans671/updates.xml)
ことで解決しました!プラグインの設定画面から上記URLを登録してください。これは解決したことになったのか?バージョン古くてちゃんと動くのか完全には未確認ですが、とりあえずJettyが起動してサーブレットを動かくすことはできました。

P.S
最後にサーバを追加した時に、なぜかエラーというかサーバが追加できない事象が発生しましたが、これは8080ポートが他のサーバとかぶっていたからのようで、別のポートにすることで解決しました。



2012-02-25

考察:クラウドなプラットフォームの選定あれこれ

大学というのはネットやコンピュータをある程度自由に使える環境をもっているわけだが、基本、メンテナンスは自分でやる必要がある。永続的にメンテナンスをしてくれる人材を確保できるであればかまわないが、残念ながらなかなかそうになならない。だから自分でやるしかないといっても時間は絶対的に少ない。そんな余裕はない。。。だから、インフラについてはクラウドなサービスにまかせようというわけで、手をつけたのがGAEだったわけだが、、、

GAEの使い勝手が悪くなってきたか、、
GAEの正式リリースに伴いちょっと雲行きが怪しくなってきた。最大のネックはDataStoreの課金問題。課金の仕組みに問題があり、あっという間に無料枠を飛び越え、しかもかなりの額になるという話題を耳にしており、おそらく現在もそのままだろう。同じ研究者仲間もGAEの利用はやめるとか言ってたし。。。
金額の問題をカバーするためにはシステム設計で工夫が必要になる気配で、開発効率を下げるような手間暇をかけるのはできるだけ避けたい。どうせ金を払うんだったら自由度の高いインフラがいい。。。ということで、現在、AWS、アマゾンウェブサービスも視野に入れていろいろやっている。

データベースはニュートラルなプラットフォームがベターか
データベースというのはシステムにおいて重要な位置づけであるが、GAEよりもAWSをプラットフォームにしたほうが良いことに気づいてきた。AWSには幾つかのDBサービスがあるが、これはいろいろなインタフェースでアクセスが可能なようになっている。一方、GoogleのDatastoreはどちらかというとGAEと密な関係にある。GoogleのDatastore使うならGAE一択になってしまい、ロックインされてしまうおそれが高い。AWSのデータベースは、ウェブアプリだけでなく、通常のアプリからもアクセス可能。C#にも対応してるので、いろいろな研究プロジェクトでのちょっとしたDBとして使えそう。そういうことを考えるとAWSのほうがよい気がする。

GAE+AWSのソリューション
AWSは正直関心がなかったのだが、いつのまにかJavaが動くPaasが始まっている。GAEよりも自由度が高く、金銭的な問題を気にしなければAWSのほうがいいかもしれない。
また、適材適所でGAEとAWSを使い分ければ、金額的にも安く収まるんじゃないかなというきがしている。DBが不要なライトなサービスはGAEで十分だし、無料枠はそれなりに魅力。
一番の理想は、GAEでAWSのデータベースを呼び出すこと。実は、GAEの制約によりAWSのSDKは利用できないことになっている(GAE対応に対応したSDKの亜種も出ているが、ちょっとバージョンが古く最新版はまだ対応していない)。とりあえずデータベース周りの処理は、AWS上にProxyみたいなのを用意して対応する予定(技術的な目処は経った)。この点については、後日BLOGで取り上げたい。

とまあ、ちょっと独り言的なネタでしたが、たまにはこういうのもいいでしょう。

2012-02-22

EclipseのGAEローカルサーバーにlocalhost以外からアクセスする方法

ちょっとハマったのでメモ書き。

EclipseのGAEローカルサーバ(つまりJetty)に、LAN内の他のマシンからアクセスすることができないという事象が発生。もちろん、LANの環境は問題なく設定されています。で、原因なのですが、EclipseのGAEローカルサーバはデフォルトでは外部からアクセスができないようになっているらしい。具体的にいうとサーバが自分のIPを認識できてない模様?で、localhostでは反応するがIP直接指定だと同じマシンでもダメ。。。ということになっている。それを解決する設定は下記の通り。

  • Run→RunConfiguration→Arguments→Program argumentsを開く
  • 左ペインから 設定したい Web Application名を選択←間違えないように。
  • --address=xxx.xxx.xx.xx を追記(xxxのところは自分のマシンのIPアドレス)

そうすることで、IPアドレス指定のアクセスに反応してくれます。

以前は、こんなことをしなくても動いてくれたたはずなので、、、、いつのバージョンから変わったんだろうか。

2011-12-27

GWT: Objectifyで得た検索結果をGWT-RPCへ直接送る方法

御存知の通り、GWT-RPCでは送受信するクラスに制約があります。Objectifyで検索をした場合、結果に複数の結果を受け取るときは、QueryクラスやIterableインタフェースで受け取ることになります。この結果をGWT-RPCを利用して直接クライアント側に返す時には、Iterableインタフェース等は送信できないのでようなので、下記のようにリストに変換してから返すことになります。
Query ql = cdao.ofy.query(XXXX.class).filter("key", Key);
List list = ql.list();
return list;


2011-07-24

Eclipse:GWT+WTP併用時のライブラリの重複について

EclipseでGWTと戯れていたら
org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Users/ochi/......../eclipse-workspace/test/war/WEB-INF/lib/datanucleus-appengine-1.0.9.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/....."
というエラーがでてきた。このメッセージを見るかぎりは、
  • datanucleus-appengine-1.0.9.final.jar
が重複してライブラリ登録されてるぞということ。身に覚えがない。いや、以前の記事で「EclipseでのGAE/Jアプリ開発はじめの一歩 ~WTPと併用する~」というのを紹介したが、これが悪さをしている感じ。で、プロジェクトが参照しているライブラリを確認すると、
  • AppEngineSDK
  • Web App Libraries
の2つのライブラリが重複している。当然前者は消せないわけで、後者はWTPを追加したことで出てきた雰囲気。。。
よって、後者のライブラリをエイヤッと消しました。(^^; これで今のところ問題ありません。


2011-07-22

GAEでTwitter4Jを利用する 

JavaでTwitterクライアントを作るにはTwitter4Jを使えば簡単らしいが、GAE上で実装する場合はちょっとした工夫がいるようだ。

appengine-web.xmlの設定
設定のポイントは2つ。
  • sessionを使えるようにする
  • consumerKeyとconsumerSecretは、System-propertyとして記述
以上を実現するには以下のように記述するとよい。

サーブレットでの記述方法
下記に2つ載せますが、1つ目が最初に呼ばれるサーブレットで、2つ目はコールバックされるサーブレットです。1つ目では、
  • twitterクラスのインスタンス
  • requestToken情報
をセッションで保存しておくというのがポイントです。これは、memcacheに入れてもいいのかな?とにかく、状態を残しておかないといけません。
コールバックされるサーブレットでは、リクエストパラメータから「oauth_verifier」を受け取っておいてください(自動的に付与されます)。それを用いてAccessTokenを入手することになります。
参考URL
本サイトの内容は、下記のサイトを参考にさせていただきました。ありがとうございます。


2011-07-11

GAEでJCacheを利用する

前記事でmemcacheについて書きましたが、JCacheについても載せておきます。
try {
            CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
            cache = cacheFactory.createCache(Collections.emptyMap());
          // 登録
            cache.put("name", "おちらぼ");

          // 検索
            value = cache.get(name);


        } catch (CacheException e) {
            // ...
        }
どちらを使うべきかですが、Googleの公式サイトではMemcache Java APIにおいてJCacheを優先的に書いています。GAEにおいてはmemcacheは低レベルAPIであるため、JCacheのほうが使いやすいかもしれません(ほとんど記述は変わりませんが)。ただ、

  • JCacheは開発中のライブラリであり、実装されてない機能がある場合がある
  • より多くの機能を利用するなら memcache API
  • JCacheはJava標準であるため記述に汎用性がある。
という認識はもっておいてください。


2011-06-02

GAE/J on Eclipseでのライブラリの設定について

EclipseでGAE/Jアプリを開発するとき、各種ライブラリ(jarファイル)は、

  • war/WEB-INF-/lib
においておく必要がある。

実はこれ、Javaのウェブアプリケーション開発の「常識」なわけだけど、今日はこれに躓いてしまった。なぜならNetbeansではこれを意識することなく、コンパイル時のライブラリパスが実行時のコンテナでのライブラリパスと同じになるようになっていたから。こんな昔のネタに今更であるとわ。こんなことをやらないとダメなの?というEclipseにちょっと幻滅だが、使わざるを得ないのでもう慣れるしかない。というわけで、とりあえずメモ書き。


2011-06-01

EclipseでのGAE/Jアプリ開発はじめの一歩 ~WTPと併用する~

EclipseでのGAE/Jアプリの開発のための各種設定メモ書きです(ちょっとNetbeansユーザ的な視点が入ってます)。

どのパッケージを入れるべきか
NetbeansユーザがEclipseを使い始めるときに最初に悩むのは、Eclipseは様々ななパッケージスタイルが提供されているということ。Eclipseはプラグインでどんどんカスタマイズしていくのが利点なので、それはまあ文化の違いとして、実際GAE/J開発をしたいときは、
  • Eclipse IDE for Java EE Developers
  • Eclipse IDE for Java Developers
のどちらかを選ぶ。前者のほうがウェブ関係のプラグインが入っているのでやりやすいかもしれません。後者でもあとでプラグインの追加をすればOKです。

GPEのインストール
当然のこととして、Google Plugin for Eclipseはインストールする必要があります。それは、Eclipseのプラグインインストールのやり方に従い、【HELP】→【Install NewSoftware】を選んで、下記の公式サイト
に書いてある「Update sites」のURLを追加することでGPEの項目が出てくる。なおGWTに関係するプラグインも一緒になってるので同時にインストールしておこう。

Web Application Projectでプロジェクト作成
GAE/Jのアプリを作成するプロジェクトは、「Web Application Project」と呼ばれるもので、上記のGPEをインストールすることで作成できるようになります。Googleのアイコンがあるのでお間違いなく。これで、Jettyがサーバとして使えるようになります。また、デフォルトでGWTのプログラムが実装されます(ウィザードで取り消すことは可能)。

上記のEclipseでGAE/Jのアプリを作り始めたときに最初に違和感を感じるのが、サーブレットの作成方法について。サーブレットプログラムを動かすには、
  • HttpServletを継承したクラス
  • web.xmlによるサーブレットの登録
が必要なわけですが、デフォルトの状態だとこれを自動的にやってくれない。Netbeansなら自動作成してくれるのに、、、全部手書きでするとかちょっと面倒です。

WTPのインストール
Eclipseには、ウェブアプリの作成を支援するWTPというプラグインが用意されています。これを利用することで、ちょっとだけマシになります。まず、現在使っているEclipseのバージョンによって対処の方法が少し異なります。
【Eclipse IDE for Java EE Developersの場合】
すでにインストールされていますので、あとは有効化するだけです。
【Eclipse IDE for Java Developers】の場合
プラグインを追加して下さい。【HELP】→【Install NewSoftware】を選んで、Eclipseのサイトを選択すると
  • Web,XML and JavaEE Development
というカテゴリの中をすべて選んでインストールして下さい。

WTPの有効化
以上により、WTPが使える状態になりました。が、インストールするだけではだめ。GAE/Jアプリのためのプロジェクト「Web Application Project」をにおいて、WTPが有効になるようにしなければなりません。
有効化の方法は、【Project】→【Properties】→【Project Facets】を選びます。










そうすると最初は設定されてないという画面がでますので、それを押します。
すると以下の画面がでます。ここで、有効にしたいFacetを選ぶわけで、サーブレット作成に最低限必要なのは
  • Dynamic Web Module
なので、これを選びます。


Dynamic Web Moduleの設定上の注意点(20110602追記)
ここは重要です!!プロジェクトを作成する最初にやっておかないとダメですので、必ずこの設定をして下さい(あとから変更できません)。
(1)DynamicWebModuleのバージョン
WTPのバージョンはデフォルトではVersionが3.0になってます。GAE/Jでは、ServletAPIの2.4ないし2.5相当に準拠しているので、バージョンを下げないといけません。ここで実際下げてみると、2.5ではエラーがでますので、2.4にしましょう。
(2)コンテンツディレクトリ設定
WTPでは、コンテンツのルートディレクトリをWebContentというフォルダにしようとします。しかし、GPEでのコンテンツディレクトリは warフォルダです。よって、上記の「Dynamic Web Module」を選択した際に、下部に「Futher configuration」というリンクがあるので、これをクリックします。そこで、Content Directoryを「war」 に変更してください。



以上の設定により、サーブレットを作成するというウィザードが有効になります。これで、Servlet関連のファイルを自動生成できます。。この設定をしておかないと、web.xmlでのマッピング記述を自動化してくれませんので注意です。


以上、Nebeansユーザからすると、めんどうだなぁと思いつつ、これさえクリアすれば、スムーズに開発できる気がしてます。


2010-09-28

GAEのお勉強に良いサイト~App Engline Code Lab~

GAEについては、本研究室でもジワジワと使っていこうと思っていますが、良いサイトがありますので、、、
このサイトでは、BLOGシステムを作成するという目標のもと、GAE周りの周辺技術の使い方をマスターすることができます。ただし、漠然とコピペして作るだけではまずいです。いろいろ疑問点が出てくると思いますが、これを起点に理解すればいいかなと。うちの研究室でもこれをちょっとやってみようかなと思ったり、、、、個人的には、この教材をGWT化したいなとか、、

2010-07-25

Netbeans6.9でGAEのプラグインを使う

NetbeansでGAEを使うためには、nbappengineというプラグインを使えば良いわけだが、これはデフォルトのライブラリサーバーには存在しないので、Kenaiにあるプロジェクトサーバーを登録する必要がある。で、ここのライブラリURLが、6.8と6.9で異なっているようで、でそのURLは
  • http://kenai.com/downloads/nbappengine/NetBeans69/updates.xml
と6.8の場合と微妙に表記パターンが異なっているようだ。

今日、こういう初歩的なことをBLOGに書いたのは、研究室のマシンでNetbeans6.9にしたらGAEが動かなくなったというのがある。6.9に6.8のライブラリを入れると、プロジェクト作成時にエラーがでるようなので(実際ほんとうにそうなのかは確証できませんが)、気をつけてほしい。

2010-03-03

GAEデータストアで条件検索(JDO利用)

以下のサンプルは、データストアにあるUserテーブルのunivIDプロパティが"1234567"という文字列であるデータを検索する例です。下記のサンプル内で一部全角の「<>」を用いてますが、半角に直して下さい。


JDOQLのフル記述の場合
//JDOのマネージャーのインスタンス呼び出し
        PersistenceManager pm = PMF.get().getPersistenceManager();
        String query ="select from org.ochilab.server.user.User where univID=='1234567'";
        List<org.ochilab.server.user.user>result=(List<org.ochilab.server.user.user>pm.newQuery(query).execute();

JDOQLのところは以下のように書くことも可能です。
パラメータ変数で記述する場合
Query query = pm.newQuery(User.class,"univID == univIDParam");
        query.declareParameters("String univIDParam");
        List<org.ochilab.server.user.user>result= (List<org.ochilab.server.user.user>query.execute("1234567");

個人的には後者がよいかと思われます。なお、条件の指定には、下記の方法でもOKです。
Query query = pm.newQuery(Users.class);
     query.setFilter("univID == univIDParam");
     query.declareParameters("String univIDParam");

条件を複数にする場合は、上記、setFilter()の条件を&&で結び、declareParameters()ならびに、query.execute()の各引数を複数にすればOKらしいです。

2010-02-27

GWT+GAEでのファイルアップロード処理

とりあえず試してみたのでメモ書きです。本番環境で試してないのですが、たぶんおっけい?


クライアント側
下記のサンプルは、GWTのAPI仕様書(JavaDoc)に書かれている内容を参考にしてます。FileUploadウィジェットを用います。Formパネルの子としておかないとダメなのに注意。FileUploadウィジェットを用いれば、ファイルの選択などのGUIが用意されます。
サーバー側

下記の例では、純粋なサーブレットですが、GAEでも動かすことを前提にしてます(本番環境では試してませんが)。ポイントは、FileItemStreamからInputStreamを生成しているところでしょうか。これで、ファイルタイプに応じていろんな対応ができるはずです。
なお、Apache のCommons FileUploadライブラリを仕様してます。

上記のプログラムでは、アップロード処理が終わった後の処理について書いてませんので、そこは各自で対応をお願いします。