2013年4月24日水曜日

Heroku を試す(4)~アプリを作成

さていよいよアプリを作ってみましょう。プロジェクトを作成する画面に Create Heroku App from Template なるメニューがあるのでそれを選びます。

次の画面では・・・何を選びますかね。Getting Started には別にサンプルを作るところまで書かれているわけではないので何も指定はないようです。一番シンプルそうなのは・・・ Embedded Jetty-Servlet Application でしょうか。それを選んで適当に名前をつけて進み・・・ませんw

こんどはこんなエラーが。あれー、ちゃんとセットしたはずなんだけどな。
仕方ないので、前のステップに戻って、Create an SSH Key と Adding your ... のところをやってみます。その後もう一度作ろうとすると、今度は「その名前は既にあるぜー」と言われてしまいます。なので
C:\>heroku apps
=== My Apps
sdk0815-sample


C:\>heroku apps:destroy sdk0815-sample

 !    WARNING: Potentially Destructive Action
 !    This command will destroy sdk0815-sample (including all add-ons).
 !    To proceed, type "sdk0815-sample" or re-run this command with --confirm sdk0815-sample

> sdk0815-sample
Destroying sdk0815-sample (including all add-ons)... done
そして再挑戦すると・・・できたー!
って×出てるしw メッセージを見ると
maven-dependency-plugin (goals "copy-dependencies", "unpack") is not supported by m2e. pom.xml /sdk0815-sample line 48 Maven Project Build Lifecycle Mapping Problem
ふむ・・・。m2e は私が勝手に入れてたプラグインであって、別にここでは必須ではないですよね。ということはエラーが出てても大丈夫か?とりあえずこのまま進めーw

今この状態はどうなってるのか気になるので、Window -> Show View -> Other... で My Heroku Applications ビューを開きます。そこに出てきたアプリを右クリックして Open を選ぶと・・・
キター!

2013年4月16日火曜日

Heroku を試す(3)~ Eclipse を使って

ではこちらに従って Eclipse を使ってアプリケーションを作ってみます。
You can build/deploy and manage your Heroku applications right from within Eclipse using the Heroku Eclipse plugin.
とありますのでプラグインがあるんですね。要件は
ということで Eclipse 3.7 以上を用意しましょう。私は 4.2 で行きます。 更新サイトを追加してインストールするだけ。Eclipse を再起動します。

次はプリファレンスに移動して Email と Password を入れて Login を押せば・・・、あれ。

なぜかエラーが出てますね・・・。いろいろ調べてましたが最終的にはエラービューに行ってみたところ、
Secure storage was unable to retrieve the master password. If secure storage was created using a different Windows account, you'll have to switch back to that account. Alternatively, you can use the password recovery, or delete and re-create secure storage.
なるエラーが出ていました。うーむ。そもそもそのファイルがいつ作られたかも定かではないぐらいなので、消して再起動してみました。すると無事 Login を押したら API Key がセットされました。

次にその下にある Load SSH Key をクリックして、その1で作った .pub をロードします。これで準備完了かな?


2013年4月10日水曜日

Heroku を試す(2)~ Java を使う

さて私の専門(?)は Java なので Java のチュートリアルに進みます。ほかの言語のもたくさんありますね。Java はこちら。要件としては
  • Basic Java knowledge, including an installed version of the JVM and Maven 3.
  • Your application must run on the OpenJDK version 6, or 7 (8 is also available in beta).
  • A Heroku user account. Signup is free and instant.
ふむ。とりあえず Java の知識は当たり前として Maven もこの前いじりましたね。ほんの少しで恐縮ですがw OpenJDK で動くものでないといけないと。アカウントはついこの前作りました。というわけで準備はOK。

さて早速・・・と思ったら
If you’re an Eclipse user you can skip these steps and get started inside of an Eclipse workspace. See Getting Started with Heroku & Eclipse.
Eclipse 用のやり方は別にあるんですね。せっかくなので手に入れた IntelliJ IDEA で行こうかと思ってたんですが、まずは勝手知ったる Eclipse で始めてみます。というわけでそちらのページに従って進めるとします。

2013年4月8日月曜日

Heroku を試す(1)~ Getting Started

#f1yosou のサイトにアクセスしたことのある方なら既に感じられてるかもしれませんが、Google App Engine 上で作っているサイトは結構アクセスしたときのレスポンスが悪いですよね。これはしばらくアクセスがないと Idle 状態になるためです。もちろんお金を払えばインスタンスを常時起動しておけるので早くなるわけですが、別にあのサイトで1円も稼いでないわけでそれはちょっと・・・。

というわけで、ほかの PaaS サービスはどうなのか興味がありまして。最近よく耳にする(気がする) Heroku を試してみます。それで備忘録的にここに手順を書いていきます。私は何事もやってみないと身につかないタイプなので、Getting Started を探しましょう。あ、ありました。ここですね。これに従って進めましょう。

まずは Sign Up から。Eメールアドレスを入れるとメールが届くので、そのリンク先でパスワードを設定するだけです。特に名前とか聞かれないんですね。ログインすると比較的素っ気無い感じのページにログインできます。なんかコマンドっぽい(本当にコマンドかも?)ものが出てるところがちょっと玄人っぽくていいかもw

次は Heroku Toolbelt というものをインストールします。これはなんだろう。
Foreman, an easy option for running your apps locally; and Git, the revision control system needed for pushing applications to Heroku.
とありますね。ということはアプリを管理するツールと git が入るんですね。そういや deploy するのに git を使うってありましたので Linux でやってみようかと思ったけど Windows 用の Toolbelt をダウンロードしてしまったのでとりあえず Windows でやってみます。ダウンロードした exe を起動するだけでするっと入ります。

次はログインですか。早速試してみましょう。
C:\>heroku login
Enter your Heroku credentials.
Email: ********@*****.***
Password (typing will be hidden):
Could not find an existing public key.
Would you like to generate one? [Yn] Y
Generating new SSH public key.
 !    Could not generate key: 'ssh-keygen' は、内部コマンドまたは外部コマンド、
 !    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
あれれ失敗しますね。インストーラーのところで ssh も入れるってあったはずですが・・・。うーむ。仕方ない、とりあえず Cygwin のパスを通して進んでみます。
C:\>set PATH=C:\cygwin\bin;%PATH%

C:\>heroku login
Enter your Heroku credentials.
Email: ********@*****.***
Password (typing will be hidden):
Could not find an existing public key.
Would you like to generate one? [Yn] Y
Generating new SSH public key.
Uploading SSH public key C:/Users/*****/.ssh/id_rsa.pub... done
Authentication successful.
できました。既に key があればそれを使うのもできそうですね。

次はいよいよサンプルアプリを作成してみます。

2013年3月22日金曜日

GAE/J + JDO で Single Property Index を作らせない

表題のとおりですがようやくたどり着いたのでメモ。

サイト自体にも書いていますが、#f1yosou Google App Engine/Java (以下 GAE/J)を使っています。もともと3年前(もう3年になりますか・・・)にはじめたときには結構余裕だったのですが、Googleさんの緩やかな締め付けwで無料での利用部分がどんどん制限されてきて、最初のころにはタコなコードを書いていても余裕があったのですが、最近はかなり厳しくなってきています。これまでもそれなりに使用量を抑制しつつなんとかごまかしてきました。

そんな最近の #f1yosou サイトのもっとも厳しい項目は、Datastore Write Operations の項目です。これは文字通り Entity を Datastore に書き込むと消費するやつですね。これが特に #f1yosou タグのついたツイートを解析して結果を書き込む処理を経るとかなり消費されます。処理としては
  • 該当するツイートの保存
  • 同一の予想をしたツイートのカウントを行い、その結果を保存
ということをしていますが、どうも後者の処理がかなりの書き込みを生じているようです。そもそもこの Datastore Write とは Entity を1つ書き込むと1回なのか?というところから調べ始めたところ、以下の記事がよくまとまっておりました。
EntityのPropetryの構成よって、Datastore writeの数は変わる!
なるほど。そもそもプロパティの数によって増えるのもあるんですがそれは実際に値をしまってるので仕方ないとして、各プロパティについて勝手に自動的に作成される Index の書き込みのほうが問題ですね。そもそも使ってないのに昇順・降順で2つ作られてるみたいですし。これを削減できればだいぶ効きそうです。ただし
Single Property Indexを作らないとComposite Indexも作成されない?
という考慮点もあるみたいなのでなんでもかんでも削れるわけではないようです。

と、ここまできて JDO ではどうやって指定するんだろう・・・と思って調べてもなかなかでてきません。いろいろググっていたらようやく Entity#setUnindexedProperty() なるものがでてきました。しかしこれも Low Level API。。。

まあそれでもいいか、と思ってやり方を探っていたらとうとう発見しました。まんまの質問がありましたw なぜこれに最初に行き当たらなかったのか不思議なぐらいそのままです。要するに
@Extension(vendorName = "datanucleus", key = "gae.unindexed", value="true")
を索引がいらないプロパティにつけるだけです。あら簡単。

早速実験してみます。1回処理すると以下のようになる Entity を用意しました。
 このクラス定義のところにある correct というプロパティに Index を作らないようにします。
 @Persistent
 @Extension(vendorName = "datanucleus", key = "gae.unindexed", value="true")
 private Boolean correct;
とすると、
のように2減りました。この2というのが昇順と降順で1つずつの結果のようです。
#上では赤丸がついている Entity にのみ処理をしました。

これで削減できるかな?

2013年3月18日月曜日

Eclipse + Maven その2

続きです。これだけでも十分便利なんですが、よくできてんなと思ったところをもう少し。今回想定しているのは前回作ったプロジェクトで Selenium を使ったコードを書いて隠蔽し、それを別のプロジェクトから利用するというシナリオです。

まず sample1 の App クラスを変更しておきます(別に main のままでもできますが、雰囲気を出すために)。そして後述する実験のために一度 sample1 を install しておきます。sample1 の pom.xml を右クリックして、Run As -> Maven install... を実行します。
 sample1 と同じように sample2 プロジェクトも作ります。
で、pom.xml を開き、dependency のところで sample1 を追加します。
すると
のようになります。アイコンでわかるとおりプロジェクト参照になってます。なので普通に sample1 のクラスが使えるので
とやって実行しただけでブラウザが上がってきます。

これだけでも十分便利なんですが、よくできてんなと思ったのはこの先です。さきほどプロジェクト参照になってると書きましたので、sample1 の App のほうを

のように変更して sample2 の Main を実行すると
と Yahoo! が開きます。ここで sample1 を閉じます。
すると先ほどプロジェクト参照になっていたものが最初にインストールしたほうに自動的に変更されます。
なので実行すればちゃんと動作しますが、開くのは Google のほうです。つまり、インストールされていればその依存を書くだけで使えますが、プロジェクトがあればそちらのコード変更を即座に反映した開発が可能ということです。これは便利ですね。

2013年3月16日土曜日

Eclipse + Maven その1

ひょんなことから Selenium を使う機会がありまして。それ自体はいいんですが前提のライブラリが多いこと多いこと・・・。これをマネージするのは正直つらそう。そう思いましてせっかくなので Maven を使ってみました。これは便利ですね。なので備忘録をかねて少々ご紹介。

まずは m2e を入れておきます。するとプロジェクトを作成するときに Maven Project が選べるようになります。
  先へ進んで最後に Group Id と Artifact ID を入れると


こんな感じにプロジェクトが作成されます。
左上に「M」がついてるので Maven 用に構成されたプロジェクトであることがわかります。pom.xml も作成されているので開くとエディターが開きます。
今回は Selenium を使いたいので依存関係を定義します。Dependencies のタブを開いて Add をクリックします。ダイアログが開くので、フィルターのところに selenium-java と入力して selenium-java を選んで

追加します。すると

このように自動的に classpath にも追加されます。こうなれば

のようにコードを書いて実行すると
 と動くわけです。