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

2011年8月9日火曜日

GAE 画像データのアップロード2 FileUpload編 (圧縮必要ですけど・・)

GAE 画像データのアップロード1 Blobstore編では、結局課金する必要があったため他の方法をしらべた。

どうやら昔からあるjakartaのcommonで提供されているFileUploadを使う方法が一般的みたいなのでそれを実装。これなら昔strutsやってた時にやったことあり。


以下のサイトがほぼやりたいことだったので、そのサイトの内容をほぼそのまま実装。


[Java][Google App EngineGAEで作るサムネイル画像作成サービス



うーむ、やっぱりこの方法しかないか、、とおもったけどそういやslim3どうなんだ!?とおもって調べたら標準でサポートしていたは、はっはっは。。

やっぱslim3使うか。。

GAE 画像データのアップロード1 Blobstore編 (お金かかりますけど・・)

GAE(Google App Engine)で画像ファイルをアップロードできないか!?ということでいろいろ調べたことを記載。

GAEではデータ保存用にBlob(Binary Large Object)という型を推奨している。
さらにアップロードようにgae-sdk-1.3 から BlobStoreというBlob専用のデータストアーが使用可能。
これは通常のBigtableで使用されるDataStoreとは別もののよう。

ちなみにサイズ制限は以下のよう。

  • Blob      1M
  • Blobstore  2G
画像データなので大きいほうがいいでしょう、ということでBlobstoreをつかったアップロードについて記載。


方法

以下のGoogleサイト参照。

流れは以下
  1. ファイルアップロード処理記載(BlobstoreServiceFactory使用)
  2. サーバ側でのファイルデータ取得処理

■ファイルアップロード処理記載(BlobstoreServiceFactory使用)
ファイルをアップロードする処理のポイント

  • BlobstoreServiceFactoryでblobstore用のURL生成
  • アップロードformの属性にenctype="multipart/form-data"指定
まずはBlobStoreはDataStoreとは別管理のデータベース、と捉えると当然その保存先のURLを取得する必要がある訳で、そういう意味でURLを生成する必要あり。

後はそのURLを指定してファイルアップロードに必要なmultipart属性を指定すればOK。

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>

  
<%
    BlobstoreService blobstoreService
         = BlobstoreServiceFactory.getBlobstoreService();
    String uploadUrl
         = blobstoreService.createUploadUrl("/upload");
%>
    

■サーバ側でのファイルデータ取得処理
サーバ側でのファイルデータ処理のポイント

  • BlobstoreServiceでrequestからBlobKey取得
  • BlobKeyを使ってresponseにserve
サーバ側の処理としては、requestデータから格納されたはずのBlobStoreにアクセスするためのBlobKeyを取得し、そのキーでを用いてBlobStoreに格納されたデータにアクセスする。
responseデータに画像を表示するにはBlobstoreServiceのserveというメソッドを使用すれば可能。

@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet {
	private BlobstoreService blobstoreService
		= BlobstoreServiceFactory.getBlobstoreService();


	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		Map blobs	= blobstoreService.getUploadedBlobs(req);
		BlobKey blobKey = blobs.get("file1");

		if (blobKey == null) {
			resp.sendRedirect("/");
		} else {
			resp.sendRedirect("/get?blob-key=" + blobKey.getKeyString());
		}
	}

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));
		blobstoreService.serve(blobKey, resp);
	}
}



    以下はweb.xmlの抜粋
    	
    		UploadServlet
    		com.kekenzy.gae.test.UploadServlet
    	
    	
    		UploadServlet
    		/upload
    	
    	
    		GetServlet
    		com.kekenzy.gae.test.UploadServlet
    	
    	
    		GetServlet
    		/get
    	
    



    問題発生!!

    とりあえず、ローカルで確認し選択したファイルがアップロードされ表示されることは確認
    で、GAEにデプロイしたあといざアクセスすると、画面に以下のエラーが表示。。

    Uncaught exception from servlet
    com.google.apphosting.api.ApiProxy$FeatureNotEnabledException: The Blobstore API will be enabled for this application once billing has been enabled in the admin console.
    
    billingってことは課金!?ってので、一応検索するとやはり課金設定して「金はらえ」ってことみたい。。。
    なんてこった・・・
    まー確かに画像データをガンガン上げられればサーバ圧迫するから仕方ないか。。
    とりあえずお金かけない方式!でサービス作りたいのでBlobstore方式は断念だな。。

    GAE Bigtableの状態確認

    ローカル環境

    http://localhost:8888/_ah/admin



    クラウド環境

    googleにログインして

    https://appengine.google.com/

    からデプロイ先のプロジェクト選択しDataStore Viewerを選択

    GAE Bigtable基礎


    GAEでデータベースを扱うにはBigtableしか使えない、ということでBigtableについてまとめてみた。

    説明
    Bigtableとは、Google App Engine(GAE)のデータストアーのこと。
    主な特徴としては以下。
    • RDB(リレーショナルデータベース)と異なるキーバリュー型データベース
    • 呼び出し方法には、SQL系とメソッド系の2種類あり
    • RDBほどトランザクション制御に長けてない

    またRDBとの主な違いは以下。
    • テーブル ⇒ カインド
    • レコード ⇒ エンティティ
    • データフィールド ⇒ プロパティ
    • 1レコードに「Key」「Value」の1組を格納
    • スキーマ定義は行わない(代わりにデータクラス定義を作成)
    実装
    説明はこのぐらいで次は実装について。
    Bigtableにアクセスするのに必要となるクラスファイルは以下の2つ。
    • データクラス定義ファイル
    • 永続化マネージャクラスファイル

    データクラス定義ファイル=RDBでいうTable定義。このクラスを作ることでスキーマ定義とかを行わなくてもBigtableにデータを格納することが可能(なんと便利!!)。
    また実際のデータをBigtableに格納したり取り出したりするのに永続化マネージャクラスを介して行うのでそれを作る。

    ■ データ定義ファイル記載ルール
    • データ項目には@Persistentアノテーションをつける
    • プライマリキーは@PrimaryKeyアノテーションをつける
    • コンストラクタでメンバ変数に値を設定する
    • データ項目にアクセッサを作成する
    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class Greeting {
    	@PrimaryKey
    	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    	private Long id;
    	@Persistent
    	private String content;
    
    	public Greeting(String content){
    		this.content = content;
    	}
    
    	public String getContent() {
    		return content;
    	}
    
    	public void setContent(String content) {
    		this.content = content;
    	}
    	public Long getId() {
    		return id;
    	}
    }
    

    ■ 永続化マネージャ
    • PersistenceManagerクラスをインスタンス生成するためのFactoryクラスとして生成する
    • 一度だけでよいのでSingletoneで実装する
    public class PMF {
    	private static final PersistenceManagerFactory pmfInstance =
    		JDOHelper.getPersistenceManagerFactory("transactions-optional");
    
    	private PMF(){}
    	public static PersistenceManagerFactory get(){
    		return pmfInstance;
    	}
    }
    


    あとはこれらを使用するところの修正
    • データ定義ファイルインスタンス生成
    • 永続化マネージャファクトリでマネージャクラス生成
    • makePersistentで永続化実行
    • 永続化マネージャclose
    		String content = req.getParameter("content");
    
    		// データクラス生成
    		Greeting greeting = new Greeting(content);
    
    		PersistenceManager pm = PMF.get().getPersistenceManager();
    		try{
    			pm.makePersistent(greeting);
    
    		} finally {
    			pm.close();
    		}
    
    なれれば簡単!?
    今度は画像ファイルの扱いをやってみよ。

    2011年6月17日金曜日

    GAE(Google App Engine) 環境構築-2 プロジェクト作成とデプロイ

    今回はEcipseでのGAEのプロジェクト作成と作成したプロジェクトの
    クラウドへのデプロイまで。

    以下手順
    1. Eclipse用意
    2. Eclipse plugin(google plugin)とSDKインストール
    3. EclipsePluginの設定
    4. プロジェクト作成
    5. Eclipseで動作確認
    6. ディプロイ
    7. クラウドで動作確認
    === ①Eclipse用意 ===
    http://mergedoc.sourceforge.jp/

    3.6 Helios使用しましょ。

    === ②Eclipse plugin(google plugin)とSDKインストール ===
    Eclipseのメニュ->ヘルプ->新規ソフトウェアのインストール
    で以下のパスを指定

    http://dl.google.com/eclipse/plugin/3.6

    ここからgoogleのSDKとPluginをインストールする。

    === ③プロジェクト作成 ===
    Eclipseのウィンドウ->設定->Google->Appエンジンにインストールしたプラグインのパスを設定。
    Eclipseがインストールされているディレクトリのplugins->com.google.appengine.eclipse.sdkbundle.1.4.2_1.4.2.v201102111811
    を指定。





    === ④プロジェクト作成 ===
    ではやっとプロジェクトの作成。
    ファイル->新規->Web アプリケーション・プロジェクトでプロジェクト作成

    以下の画面でプロジェクト名とパッケージ名を指定し完了でプロジェクト作成。



    === ⑤Eclipseで動作確認 ===
    とりあえず何も修正せずにコンパイルしてローカルで動作確認をする。


    まずコンパイルする必要があるので、Eclipseのツールバーに出ている
    以下のボタンを押下。


    以下の画面でそのままコンパイル実行。


    あとはEclipseのプロジェクトを右クリックし、実行。


    http://localhost:8888/でアクセス可能!


    === ⑥ディプロイ ===
    いよいよデプロイ。
    デプロイはチョー簡単。

    ⑤のiconの一番右のAppエンジン・プロジェクトのデプロイを押下。


    作成したプロジェクトを選択し、googleアカウントで登録したメールアドレスと
    パスワードを設定しApp Engin project settingsを押下

    アプリケーションIDにGAEのアプリに登録した名前を指定しOK押下。

    最後に配置ボタンを押下。
    するとコンソールにアップしてます的なログが次々に出てきて以下がでたらOK!!

    Deployment completed successfully


    === ⑦クラウドで動作確認 ===

    以下のサイトの管理画面のCurrent Versionにある数字をクリックして④のEclipseからの
    実行画面と同じものが表示されればOK!!

    https://appengine.google.com/


    以上

    2011年6月15日水曜日

    GAE(Google App Engine) 環境構築-1 アカウント生成とアプリ登録まで

    GAE(Google App Engine)の開発環境構築と新規プロジェクト作成までを今一度まとめてみようかと。というか本格的にGAEを使用することになったところが本音ですが。

    で以下、まずはGAE側(クラウド側)の準備としての、アカウント作成からアプリ登録までの手順
    1. Googleアカウント作成
    2. GoogleAppEngineへログイン
    3. CreateApplicationから認証コード発行
    4. 認証処理
    5. アプリ登録

    === ①Googleアカウント作成 ===
    GAEはGoogleのクラウド環境で動作するサービスなんで、まずはGoogleのアカウントを取得する必要がある。
    https://www.google.com/accounts/ServiceLogin?service=ah&passive=true&continue=https://appengine.google.com/_ah/conflogin%3Fcontinue%3Dhttps://appengine.google.com/&ltmpl=ae

    以下サイトのアカウント作成をクリック

    アカウント作成するための情報入力


    === ②GoogleAppEngineへログイン ===
    作成したアカウントでログインする。

    以下の画面が表示される。
    === ③CreateApplicationから認証コード発行 ===

    ②画面のCreateApplicationを押下し新規アプリ生成の準備をする。

    ここで注意がGAEを使用するにあたり、一番最初だけ認証コードを発行する必要あり。
    そのためには携帯電話に認証コードを送信する必要あり。
    これが嫌なら登録できません。。(特に悪用されることはないはず)

    === ④認証処理 ===
    送られた認証コードを以下の画面に入力して認証完了。

    === ⑤アプリ登録 ===
    以下の画面で新規作成するアプリ名を登録する。

    特に考えていない場合は、次回からは③のCreateApplicationボタンを押下すると
    ⑤の画面から始まるのでその時に登録すればよし!

    以上

    2011年3月21日月曜日

    GAEでBigtableアクセスの基礎

    Bigtableにアクセスするに必要なクラスファイルは以下の2つ。
    • データクラス定義ファイル
    • 永続化マネージャクラスファイル
    ちなみにBigtableとRDBの呼び方の違い
     レコード⇒entity
     データ項目⇒property


    データ定義ファイル記載ルール
    • データ項目には@Persistentアノテーションをつける
    • プライマリキーは@PrimaryKeyアノテーションをつける
    • コンストラクタでメンバ変数に値を設定する
    • データ項目にアクセッサを作成する
    永続化マネージャ
    • PersistenceManagerクラスをインスタンス生成するためのFactoryクラスとして生成する
    • 一度だけでよいのでSingletoneで実装する

    あとはこれらを使用するところの修正
    • データ定義ファイルインスタンス生成
    • 永続化マネージャファクトリでマネージャクラス生成
    • makePersistentの引数にデータ定義をわたし、永続化実行
    • 永続化マネージャclose
    あとはGAEへデプロイし実行。なんとできました!!


    ふっふっふ。

    slim3入門

    WebToolKitの構成がわかったところでいよいよGAEのプラグインである
    slim3を使ってみる。

    以下参照サイト。

    slim3開発でわかったこと
    • build.xmlを使用しながら必要なMVCを作成していく
    • buildした時にはソースと一緒にTestソースも同時に作成される。つまりTest駆動型開発。
    • ソース修正・追加してもサーバの再起動は不要
    以下、作成した手順。(参照したサイトのままですが・・)
    ①コントローラ作成
    build.xmlのgen-controllerを実行
    antには/twitter/を入力
     ⇒/twitter/indexの短縮

    ②フォームの修正
    war/twitter/index.htmlを修正

    ③/twitter/tweet用のコントローラ作成
    build.xmlのgen-controller-without-viewを実行
    antには/twitter/tweetを入力

    ④twitter/TweetControllerコントローラの修正
    return redirect(basePath);

    ⑤モデルを作成
    build.xmlのgen-modelを実行
    antにはTweetを入力

    ⑥モデルを修正
    必要な項目&アクセッサ追加

    ⑦モデルようのサービス作成
    build.xmlのgen-serviceを実行
    antにはTweetServiceを入力

    ⑧サービスを修正
    public Tweet tweet(Map input) {
    Tweet tweet = new Tweet();
    BeanUtil.copy(input, tweet);
    Transaction tx = Datastore.beginTransaction();
    Datastore.put(tweet);
    tx.commit();
    return tweet;
    }

    ⑨サービスを呼び出すようにコントローラをさらに修正
    public Navigation run() throws Exception {
    service.tweet(new RequestMap(request));
    return redirect(basePath);
    }

    ⑩実行!

    あと以下にアクセスするとgaeのローカル状況をいろいろ見れるみたい

    Google Web Toolkit入門

    半年ほど前にGAEを試したがそのときはGWTは使わなかった。
    今回GAEのプラグインのslim3を試すにあたってそもそもGWTの構成とか
    まったく知らないのでまずはGWTの基礎を勉強する。

    以下を参照。

    本家サイト
     http://code.google.com/intl/ja/webtoolkit/

    GWT入門サイト
     http://gwt.keicode.com/

    手順
    ①環境構築
    ②新規プロジェクト作成
    ③コンパイル
    ④実行
    ⑤GAEへデプロイ

    はまったのは、実行時にChromeを使用していたが、GWTプラグインが入っている
    はずだったが、うまくインストールされていなかったため、実際に実行しアクセスしようとすると
    サーブレットアクセスで404NotFoundエラーが出たこと。

    その場合は、一度GWTプラグインをアンインストールして再度入れなおしてから
    実行してアクセスすれば問題ないよう。

    あとわかったことは、
    1. GWTで作成したコードは③コンパイルしてあげないとjavascriptとかの実際のファイルに変換されないこと。
    2. GWTを使うとブラウザにpluginを入れないと表示されないこと。

    とくに2は一般的に広めるには使うほうとしては面倒かも。。

    【スマート農業】 いまさらだけど、いまだからこその農業IoT 

    久々投稿 転職してはや2年半。バタバタしてる中で、あーっという間に時間は過ぎてきた。 仕事はそれなりに順調だけど、ただやっぱり自分で何かを起こす!ということはではできていなく、、、年齢45をこえ、、、、、とくに昔からずーとやろうやろうと言って実現できてなかっった農業IoT。。 去...