2010/03/31

GAE/J入門! [ GAE ]

maitoさんの記事で面白そうな物が
紹介されていたので備忘録にペタリ。

Google App Engine をはじめてみよう

これにそって第一回から(正確には一回は準備編みたいなので二回からかな?)
勉強しなおしてみようかと思います。

2010/03/26

GAE上でのログイン・ログアウト周り [ GAE ]

前回の続き?

GAEでGoogleのユーザサービスを使うには前回の記事のようにUserServiceオブジェクトを
使ってゴリゴリします。このUserServiceオブジェクトから、ログイン・ログアウトを
実行する画面のURLを取得する事ができます。以下にJavaDocの引用を。

ログイン

createLoginURL

java.lang.String createLoginURL(java.lang.String destinationURL)
ログイン ページをユーザーに表示する場合に使用できる URL を返します。
パラメータ:
destinationURL - ログインしたユーザーをリダイレクトする場合。
戻り値:
ログイン プロンプトを表示する URL。
スローする値:
java.lang.IllegalArgumentException - destinationURL が大きすぎる場合。


ログアウト
createLogoutURL

java.lang.String createLogoutURL(java.lang.String destinationURL)
現在のユーザーがこのアプリケーションからログアウトする場合に使用できる URL を返します。
パラメータ:
destinationURL - ログアウトしたユーザーをリダイレクトする場合。
戻り値:
ユーザーがログアウトする URL。
スローする値:
java.lang.IllegalArgumentException - destinationURL が大きすぎる場合。


上記のメソッドを使用する事で簡単にログイン・ログアウト画面に遷移する事が
可能です。便利!という訳で実際に使ってみました。


■ログイン
前回のポストと全く同じですが、ServletのdoGetメソッドに以下のようなコードを用意します。

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

if (user != null) {
 resp.setContentType("text/plain");
 resp.getWriter().println("Hello, " + user.getNickname());

} else {
 resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}

これでログイン時はGoogleアカウントのニックネームが表示され、未ログイン時は
ログイン画面が表示されるはずです。早速アクセスしてみると…



表示されました。特に何も用意せず、かえってきた値に遷移すればログインできるっていうのは
便利ですね。ただ便利な反面、GAEでGoogleアカウントにログインする画面はこの画面固定って
事なんでしょうかね。デザインいじれないのが逆に痛いかも。

■ログアウト
今度は先程のコードをこんなふうに変更してみました。

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

if (user != null) {
 //resp.setContentType("text/plain");
 //resp.getWriter().println("Hello, " + user.getNickname());
 resp.setContentType("text/html");
 resp.getWriter().println("You can <a href=" + userService.createLogoutURL(req.getRequestURI()) +">Sign out</a>");
} else {
 resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}

これにより、まず最初は先程と同じようにログイン画面が表示されます。



ここでログインボタンを押すと・・・



ログアウトのリンクが表示され、それをクリックすると・・・



戻ってきました。無事ログアウト完了。ここで一つ、ログインログアウトともに
メソッドの引数にStringがありましたよね?

>>java.lang.String createLoginURL(java.lang.String destinationURL)
>>java.lang.String createLogoutURL(java.lang.String destinationURL)
このパラメータの文字列に渡す値ですが、JavaDocによるとログイン・ログアウト
完了後にリダイレクトするアドレスのようです。
例えば、ショピングモール系であればログイン完了後に当初見ていた商品のページに
遷移させる、または個人の管理ページに遷移させる・・・
ログアウト完了後にログアウト確認画面に遷移、またはトップページに遷移させる・・・
といった使い方ができるみたいですね。
今回はテストのためにリクエストのURLをそのまま返すようにコーディングしてあります。

Googleのユーザ情報の使い方はだいたいわかったのでそろそろデータストアの
勉強に入りたい所です。

2010/03/25

UserServiceクラスの作り方 [ GAE ]

GAEにてGoogleのログイン関係の操作を行う際に、
UserServiceインタフェースを使用します。
例えばGoogleアカウントのニックネームを使用する場合は、

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

if (user != null) {
 resp.setContentType("text/plain");
 resp.getWriter().println("Hello, " + user.getNickname());

} else {
 resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}

こんな感じで記述します。まぁGoogleのGAEスタートアップの
コードそのまんまなんですが。
で、ちょっと気になったのがここ。

>>UserServiceFactory.getUserService();

ファクトリクラス使ってオブジェクトを生成してるよう。
という事は何らかの条件によって生成されるUserServiceの
実装クラスが変わるのか・・・?

なんとなく気になったので調べてみました。
早速appengine-api-1.0-sdk-1.3.1.jarを解凍して
UserServiceFactory.classをJADで逆コンパイルした結果……!

return new UserServiceImpl();

実装クラスをnewしてるだけだったーー!
…という訳で特に条件分岐とかはしていませんでした。
まぁいつでも切り替えられるようにという意味では
確かにこういう作りにしておくのが安牌なのでしょうね。
勉強になります。

無駄に気になった疑問は解消されたので、
今度はログインURL周りについてかこうと思います。

が、そのまえに仕事に戻ります。

2010/03/23

GAEでアプリを削除するには? [ GAE ]

GAEのサンプルプログラムを作成しながら勉強してて
いざデプロイ!アカウントも作成済!

…と思った時にふと疑問。GAEってアプリが10個しか
登録できませんよね?
登録したアプリ削除したくなったらどうするん?

という訳でまずは管理画面を開いてみると・・・



こんな感じ。英語。無理。はい戻るボタンぽちっ。

とはいえ削除できないのも困り物ですので早速Google先生に聞いてみた所
一番上に即回答が。

GAEアプリの削除方法

タイトルもそのものズバリでした。
詳細はリンク先の記事をみて頂くとして、ザッとかいつまんで説明すると

1.管理画面から削除するアプリのページを開く
2.AdministrationのApplication Settingsをクリック
3.Disable or Delete Applicationのボタンをクリック

後はしつこく削除するか確認されるのでポチポチ削除を押していくみたいですね。
10個しか無いのでこれは割と重要な情報だと思いました。
そして今仕事中という。ダメ社員でごめんなさい。

[update] maitoさんがフォローしてくれましたが、どうやら
一度削除した名前のアプリケーションはもう作成できないようです。

ちなみに削除の仕方に関する公式のソースはこちら

また、一度削除した名前が予約されて使えないっていうのは多分この部分。

英語苦手だけど多分あってるよな!

2010/03/21

Macでのスクリーンショットの取り方(そして保存先変更) [ Mac ]

Mac楽しい。大人のおもちゃって感じですね。

・・・大人のおもちゃってそういう意味じゃないぞ!

という訳で現在BlogもMacから書いてるんですが、開発してると
スクリーンショットを取りたくなるものです。
という訳でMacでのスクリーンショットの取り方を以下に。

1.画面すべてをとる
command + shift + 3

上記コマンドにて画面全体のスクリーンショットがとれます。

2.対象を選択してからとる
command + shift + 4

上記コマンド入力後、範囲を選択するカーソルが表示されるので
それにて画面を選択する。


さて、上記コマンドにて保存される画像ファイルは何故か
デスクトップ固定です。BlogにUpするための画像はすべて
同じフォルダで一元管理できた方が便利だよね?と思ったので
今度はその変更方法を。ただこちらはターミナルからしか
分かりませんでした。

1.アプリケーション→ユーティリティ→ターミナルを選択する
2.画像を保存したいアドレスをメモっておく
3.ターミナルにて以下のように入力

defaults write com.apple.screencapture location [保存したいアドレス]

上記のように入力したのちに、

killall SystemUIServer

上記のように入力すれば完了です。

2010/03/20

MacBook購入! [ Mac, 買い物 ]

何故かMacBookを購入してしまいました。
使わないのに。

いや、一応これからこのMacBookを開発機として使って
バリバリ稼ぐ予定です。あくまで予定。多分1円も稼げない。

そんな訳で人生初Macです!



じゃーん!すげーMacパッケージからかっこいいよMac
おれAppleあんま好きじゃないっていうか嫌いだよMac!

中をあけるとこんな感じ。



ぴんぼけじゃん!じゃなくてこんな所もスタイリッシュ!
Windowsマシンのノートとかもっと開けたら無骨だよね。
俺はAppleは嫌いだからこの会社のソフト・ハードともどもユーザインタフェースに
関するこだわりは素直に凄いと思う。優秀。

さらに開梱していくと・・・



うん。綺麗。ほんとそれに尽きる。
こういう所に気が届いてるといちいちわくわくするわ。
…と、こういう風にユーザは感じるんだなって事を開発する時にも
忘れないように
しないといけないですよね。肝に命じておこう。

さ、そして遂に本体とのご対面でございます・・わくわく・・・!




どーん!綺麗!かっこいい!Apple!りんご!
ちなみにiPhoneを買う気もありません。頑張れGoogle!
頑張れAndroid!

そしてドキドキを抑えて電源ボタンを押すと一瞬で立ち上がるOS。



かっこいー!でも壁紙は早く可愛い女の子とか萌え萌えな画像に変更せねば!


という訳でiPhoneアプリの開発もしないのに買ったMacBookの開梱日記でした。
ここで感じたのは↑でも書いたけどユーザの満足度ってのは結局こういう所で
満たされるんだなって所ですね。
実際開発してるとどんなにユーザ目線に立とうしても、開発者の目線で見てしまうもの。

『いや、ここはこういう画面にした方が保守性が~』とか、
『ここのレスポンスが3秒もかかっちゃうのはこのモジュールが~』みたいな
言い訳(正当化?)はエンジニアなら一度はやった事があるはず。

でも使うユーザはそんな事どうでもいいってか知らん。
そんな細かい所どうでもよくね・・・といった所で満足度を感じるのが
エンドユーザなんだろな、という事を今回のMacBook購入で感じました。

難しいのぉ。

2010/03/16

google app engine 奮闘記 第1回 ~まずは登録から~ [ GAE ]

突然だけど最近元同期が始めたgoogle app engineに手を出してみようと思いました。
理由は最近バンド仲間とPHP勉強会を開こうって流れになったからです。

…理由になってないけど、実際それが理由でなんとなく初めて
みようと思った次第です。あ、PythonだけじゃなくてJavaが使える
ように気づいたらなってたってのもありますけど。

で、折角なのでgoogle app engine(以下めんどいのでGAE)を勉強していく
様を書いていこうかと思います。
ただ筆不精なもんで途中で終わったらすいません。

さて、第1回はお約束のHello,World!!!・・・かと思ったんですが
今職場なのでそもそもSDKのインストールも出来ない! という事で
第1回は導入編でいこうと思います。
ただこの記事書く前にすでにアカウント登録を済ませてしまったので
うろ覚えですが。手順は以下の通り。

~アカウント作成~
1.http://code.google.com/intl/ja/appengine/にアクセス



2.右側のスタートガイドにそって、"登録"をクリック
3."Create an Application"をクリック(確かここから英語…)
4.Countryで"Japan"を選択
5.4でJapanを選択するとキャリアを選択できるようになるので、自分の携帯を選択
6.自分の携帯のメアドの@以前を入力し、"Send"を押す
7.携帯にアカウントコードのメールがくるので、それを入力する

~アプリ領域の作成~
8.Create an Applicationの画面にて、Application Identifierを入力する(任意)
9.Application Titleを入力する(任意)
10.Saveをクリック

~SDKの導入~
といっても、今回はEclipseを使用するのを前提で話を進めていくので
EclipseにてSDKのインストールを行います。
これならSDKとEclipse用のプラグインが同時にインストール出来ますし。
11.Eclipseを起動し、メニューのヘルプから新規ソフトウェアのインストール...を選択する。



12.使用可能なソフトウェアの所で自分のEclipseのバージョンにあった物を入力する
(今回自分は3.5なのでhttp://dl.google.com/eclipse/plugin/3.5を入力)
13.出てきたインストール項目にてSDKをチェック



後はもう次へ次へと進めていけば自動的にインストールされていきます。
とても便利・・・!
あ、ただ会社のPCでシコシコ開発しようとかしてるとプロキシ鯖で弾かれたりと忙しい事になります。

さぁ、次回からGAEのスタートアップに沿って一通り画面表示、リクエストの飛ばし方、
受け取り方と学習してこうかと思います。
しかしPythonじゃなくてJavaにしちゃったけど大丈夫なのだろうか・・・