アーカイブ

2009 年 11 月 のアーカイブ

GAE/J (Google App Engine for java) で log4jを使う

2009 年 11 月 30 日 tdtsh コメントはありません

先日、GAE SDK for Javaでのログのダウンロードについて書きました。
GAE/Jはデフォルトでjava.util.loggingを使う様になっていますが、デフォルトのままではデバッグの時ちょっと見づらいです。
そこで、設定ファイルの使い慣れている log4j に移行する事にしました。

 


プロジェクトへ log4j.jar を追加

apache.orgから、log4j-1.2.15.jar をダウンロードして、war/WEB-INF/libに置きます。
この辺の依存性の管理は、後日 maven でやりたいなぁ。

 


設定ファイルの編集

以前構築したeclipseの開発環境では、src/log4j.properties がデフォルトで作成されていました。
これを編集すれば良いようです。

デフォルトでは、こうなっています。

# A default log4j configuration for log4j users.
#
#
# To use this configuration, deploy it into your application's WEB-INF/classes
# directory.  You are also encouraged to edit it as you like.

# Configure the console as our one appender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n

# tighten logging on the DataNucleus Categories
log4j.category.DataNucleus.JDO=WARN, A1
log4j.category.DataNucleus.Persistence=WARN, A1
log4j.category.DataNucleus.Cache=WARN, A1
log4j.category.DataNucleus.MetaData=WARN, A1
log4j.category.DataNucleus.General=WARN, A1
log4j.category.DataNucleus.Utility=WARN, A1
log4j.category.DataNucleus.Transaction=WARN, A1
log4j.category.DataNucleus.Datastore=WARN, A1
log4j.category.DataNucleus.ClassLoading=WARN, A1
log4j.category.DataNucleus.Plugin=WARN, A1
log4j.category.DataNucleus.ValueGeneration=WARN, A1
log4j.category.DataNucleus.Enhancer=WARN, A1
log4j.category.DataNucleus.SchemaTool=WARN, A1

上記に、ルートロガーの定義

log4j.rootLogger=INFO, A1

を追記して、

ログファイルのフォーマットを好みに変更

log4j.appender.appLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%F:%L] - %m%n

して、

Jakarta Velocity関係のデバッグログとかが多くて困るので、

log4j.logger.org.apache.velocity=WARN,A1

WARNに変更する設定を追加しました。

最終的にこうなりました。

#
# log4j.properties for GAE/J
#

log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.appLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%F:%L] - %m%n
log4j.logger.org.apache.velocity=WARN,A1

log4j.category.DataNucleus.JDO=WARN, A1
log4j.category.DataNucleus.Persistence=WARN, A1
log4j.category.DataNucleus.Cache=WARN, A1
log4j.category.DataNucleus.MetaData=WARN, A1
log4j.category.DataNucleus.General=WARN, A1
log4j.category.DataNucleus.Utility=WARN, A1
log4j.category.DataNucleus.Transaction=WARN, A1
log4j.category.DataNucleus.Datastore=WARN, A1
log4j.category.DataNucleus.ClassLoading=WARN, A1
log4j.category.DataNucleus.Plugin=WARN, A1
log4j.category.DataNucleus.ValueGeneration=WARN, A1
log4j.category.DataNucleus.Enhancer=WARN, A1
log4j.category.DataNucleus.SchemaTool=WARN, A1

 


あとは、こんなユーティリティクラスを作っておいて、

package my.package.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyLog {
    public static final Log log = LogFactory.getLog(MyLog.class);
}

コードの中で、こんな風に書くだけです。

MyLog.log.info("something to logging");

こでで、eclipse上のコンソールログはちゃんと出る様になりました。

 


App Engine上でのログ出力

WEB-INF/appengine-web.xml を編集します。

デフォルトでは、こうなっています。

<system-properties>
<property name=”java.util.logging.config.file” value=”WEB-INF/logging.properties”/>
</system-properties>

こんな風に修正します。

<system-properties>
<property name=”java.util.logging.config.file” value=”WEB-INF/classes/log4j.properties”/>
</system-properties>

これで一応、appengine.google.comのlogsに出力される様になりました。
でもちょっと見にくい。時間もずれとるし。
今後の課題です。

参考サイト

Google App Engine/Javaでcommons-logging+Log4jでロギングする。 – 北海道を愛するプログラマの覚書

カテゴリー: Google App Engine タグ:

Google App Engine / Java (GAE/J)で URL フェッチ APIを使う

2009 年 11 月 28 日 tdtsh コメントはありません

Google App Engine/Java (以下 GAE/J) のアプリケーションから、URL Fetch Java API (以下 URLフェッチAPI)を使って、Web上の他のリソースにアクセスできます。

今回は、とりあえずGETでリモートのページ内容を取得してみます。

URLフェッチAPIの利用には、2つの方法があります。

1) Java標準ライブラリ java net を使用

2) GAEの 低レベルAPI を使用

1) は 2) のラッパーの様です。


まずは、 1) java net を使用の方から。

public String fetchUrl(String urlStr) throws IOException{
	StringBuilder sb = new StringBuilder();
	BufferedReader reader = null;
	URL url = new URL(urlStr);
	reader = new BufferedReader(new InputStreamReader(url.openStream()));
	String line;
	while ((line = reader.readLine()) != null) {
		sb.append(line + "\n");
	}
	reader.close();
	return sb.toString();
}

これで一応動きますが、エンコーディングがUTF-8のページを表示する際に文字化けしてしまいました。


次に、2) 低レベルAPIのサンプルです。

public static String fetchUrl(String urlStr, String encoding) throws IOException {
	URLFetchService urlFetchSrv = URLFetchServiceFactory.getURLFetchService();
	HTTPResponse res = null;
	URL url = new URL(urlStr);
	res = urlFetchSrv.fetch(url);
	return new String(res.getContent(), encoding);

	//上記をインラインで書くとこんな感じ
	//return new String(URLFetchServiceFactory.getURLFetchService().fetch(new URL(urlStr)).getContent(), encoding);
}

エンコーディングを指定して適宜変換しています。
この方法で、文字化けが解消されました。

実際には、さまざまなクウォータを気にしながらになると思いますが、うまく使えば色んな事が出来そうです。
サイトをGAEに移行する際に、旧コンテンツをしばらく残したい場合に使えないかな、と思っています。
あと、決済ASPなどとの連携にも活躍しそうですね。

色々試してみたいと思います。

カテゴリー: Google App Engine タグ:

Google App Engine / Java (GAE/J) で GoogleアカウントAPIを使う

2009 年 11 月 28 日 tdtsh コメントはありません

Google App Engine/Java (以下 GAE/J) のアプリケーションから、Googleアカウントを持つユーザを認証できます。

今のところ、主に出来る事は、コレくらいです

・ログイン/ログアウトのチェック、認証ページURL/ログアウトURLの取得
・ログインの場合Userオブジェクトから、メールアドレス、ニックネーム、管理者か否か?の取得

ログイン状態のチェックは、Google App Engine – Google Codeのマニュアルのサンプルに有るとおり、至って簡単です。

こんな感じ。

package mypackage;

import javax.servlet.http.*;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class MyServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
	{
		UserService userService = UserServiceFactory.getUserService();
		User user = userService.getCurrentUser();
		String thisURL = req.getRequestURI();
 		boolean loginStat = false;
		String urlLoginOut = null;
		if (user != null) {
			loginStat = true;
			urlLoginOut = userService.createLogoutURL(thisURL);
		} else {
			loginStat = false;
			urlLoginOut = userService.createLoginURL(thisURL);
		}
		System.out.println("urlLoginOut:"+urlLoginOut);
		.
		.
		.
	}
}

実際には、取得したUserオブジェクトを永続化して、会員情報を保存したり出来ないと使い物にならない場合が多いと思います。
App Engine データストアへの保存はサポートされるようですが、Google App Engine – Google Codeのマニュアルによると、現時点では、識別子としてのメールアドレスの一貫性が担保出来ない様です。

ユーザーとデータストア

App Engine データストアは、Google アカウント API が特別な値タイプとして返す User オブジェクトの格納をサポートしています。この記事の執筆時には、User 値はユーザーの安定した識別子として動作していません。アプリケーションがユーザー値を保存している間に、ユーザーがメールアドレスを変更した場合、User 値は有効なユーザーを参照できなくなります。実際には、ユーザーはめったに Google アカウントのメール アドレスを変更することはありませんが、この点を考慮して設計すべきです。今後のサービス更新により、データストアの User 値が自動的に更新されるようになる予定です。それまでは、User 値の正確さに依存しない方がよいでしょう。

Java API では現在、メール アドレス以外の一意なユーザー ID を取得できません。

今後のバージョンアップに期待です。

カテゴリー: Google App Engine タグ:

Google App Engine / Java (GAE/J) で独自ドメイン (Google Apps側だけで設定)

2009 年 11 月 27 日 tdtsh コメントはありません

Google App Engine/Java (以下 GAE/J) にデプロイしたアプリケーションは、appspot.comドメインで、下記の様に公開されます。

http://アプリケーションID.appspot.com/

企業ユースの場合は特に、独自ドメインで公開したいのが普通ですね。

GAE/Jを独自ドメインで利用したい場合、Google Apps を申し込めば良いようです。
早速挑戦してみました。

Google Apps を申し込む

まずは、Google Apps を使用できる様にします。
独自ドメインを持っていてDNSサーバの管理権限があれば、Standard Edition で無料でできます。

  • Google Appsをブラウズします。
  • 機能比較とお申し込みをクリックします。
  • Standard Editionの[申し込み]をクリックします。
  • [Google Apps にお申し込みいただくには、お客様の組織のドメイン名を入力してください]にて、以下の様に入力し、[次へ]をクリックします。

    • ●管理者: このドメインを所有または管理しています
    • ドメイン名を入力 : my.domain.xxx
  • [Google Apps Standard Edition への申し込み (手順 2/3)]にて、必要事項を入力し、[次へ進む]をクリックします。(xxxxは伏字)

    • 名 : 権兵衛
    • 姓 : 名無
    • メール アドレス : xxxxxxxxx@gmail.com <- 取り合えず、GAE/Jでも使用しているGoogle Accountを使用しました
    • 電話番号 : xxxx-xxx-xxxx
    • 国/地域 : 日本
    • 役職 : システム管理者
    • Google Apps では、サービスを正しく設定するため DNS を変更する必要があります。
      ■ドメインの DNS レコードを変更できない場合、組織で使用できる Google Apps の機能に影響する場合があることを理解します。
    • 組織名 : xxxxxx株式会社
    • タイプ : 適宜選択
    • 組織の規模 : 適宜選択
    • 組織内で現在メール アカウントを提供していますか
      ●はい
    • 提供している場合、メールサーバー ソフトは何をお使いですか。 (例: Microsoft Exchange)

      外部ASP
    • Google Apps へのお申し込みに関して Google のセールス チームのサポートはありましたか。

      ●いいえ
  • [設定 - 最初の管理者アカウントを作成 (手順 3/3)]にて、必要事項を入力し、[同意して、設定を続行]をクリックします。

    • ユーザー名 : gae@my.domain.xxx
    • パスワード : 適宜入力

    • パスワードの再入力 : 適宜入力

Google Apps のダッシュボードが表示されれば、完了です。


ドメイン所有権を確認

  • Google Apps のダッシュボードをブラウズします。
  • [ドメインの所有権を確認]をクリックします。
  • [ドメインの所有権を確認] で、今回は [HTMLファイルをアップロード]を選択しました。

    ※(ネイキッド ドメイン (my.domain.xxx)へのAレコードが適宜登録されている必要があります)

Google App Engine 側での設定

参考サイト

CB NANASHI管理人ブログ : GAE/J、アプリを独自ドメインで使う
Google App Engine – Google Apps ヘルプ

の通り、GAE/Jのダッシュボードから、Version をクリックしたんですけど、[Domain Setup (ドメイン設定)] も [Add Domain (ドメインを追加)] も出現しません。
GAE/J と Google Apps Googleアカウント が違うアカウントである事と関係するのかもしれません。
なので、この方法は取れません。


Google Apps側でGoogle App Engine の割り当て

色々やっているウチに、Google Apps側だけで、設定が完結できました。

  • Google Apps のダッシュボードをブラウズします。
  • [ドメインの設定]をクリックします。
  • [コントロールパネル]で以下を選択し、[変更を保存]をクリックします。
    ●拡張版 (アメリカ英語のみ)
  • Google Apps のダッシュボードをブラウズします。
  • [add more services]をクリックします。
  • [Other services] の [Google App Engine] に、App IDを入力し、[Add it now]をクリックします。
  • [You have requested that the 'App ID' service be added to your domain]にて、[Activate this service]をクリックします。
  • [App ID settings]が表示されるので、- [Web address]の[Add new URL]をクリックします。
  • なにか適当※に入力し、[Add]をクリックします。 ※たとえば www (http://www.my.domain.xxx/)など
  • [Changing CNAME record]が表示されるので、指示に従い、DNSサーバにCNAMEを登録します。
    www.my.domain.xxx IN CNAME ghs.google.com

しばらくすると、http://www.my.domain.xxx/ で、GAE/J のアプリケーションが表示出来る様になります。

カテゴリー: Google App Engine, クラウド タグ:

CygwinでOpenSSHの鍵ペアを作成

2009 年 11 月 26 日 tdtsh コメントはありません

Cygwinのインストール時に、opensslとopensshを追加すれば、
ssh_keygenが使えます。

パスフレーズ無し、1024ビット鍵フレーズのSSH2 DSA鍵を作成
ssh-keygen -b 1024 -t dsa -f id_dsa

パスフレーズ’passphrase’、1024ビット鍵フレーズのSSH2 DSA鍵を作成
ssh-keygen -b 1024 -t dsa -N passphrase -f id_dsa

カテゴリー: linux, インフラ, 開発環境 タグ: