ラベル ソフト開発 の投稿を表示しています。 すべての投稿を表示
ラベル ソフト開発 の投稿を表示しています。 すべての投稿を表示

2014年10月27日月曜日

undertow を使ってみる

ひょんなことから自分のJavaアプリケーションにWebサーバーというかサーブレットコンテナの機能が少しあったら便利だなと思って調べてみたところ、undertowというのがお手軽に使えそうに見えたので試してみました。

1. インストール


そのJavaアプリケーションはmavenを使っていたので、依存関係を追加するだけです。
  <dependency>
   <groupid>io.undertow</groupid>
   <artifactid>undertow-core</artifactid>
   <version>1.0.16.Final</version>
  </dependency>
いやぁ、この手の依存解決ツールって楽ですよねぇ。今さら ant とか書きたくないです。

2. 使う


トップページの下のほうに Show me the code というのがあるので、そのコードをそのままコピー&ペーストします。

Undertow server = Undertow.builder()
 .addHttpListener(8080, "localhost")
 .setHandler(new HttpHandler() {
  @Override
  public void handleRequest(final HttpServerExchange exchange) throws Exception {
   exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
   exchange.getResponseSender().send("Hello World");
  }
 }).build();
server.start();
これだけです?w

3. 使ってみる


では早速リクエストを投げてみます。
$ curl localhost:8080
Hello World$ 
これだけです?w(再

たったこれだけですがサーブレットコンテナとして既に動いているわけですね。これはなかなか楽かも。

当然ですがこのままでは localhost からしかつながりません。 addHttpListener のところで "localhost" を "0.0.0.0" とかにすれば任意のマシンから接続できます。

2014年9月30日火曜日

#f1yosou を今シーズン限りでやめることにしました

公式アカウントから既におしらせした通り、これまで約4年半に渡って開催してきた #f1yosou ですが、今シーズンの終了を持って開催を終了することとしました。みなさん気を遣ってくださって、理由は特に聞かずに受け入れてくださっている方がほとんどですが、決定に至った理由を書いておきますね。

理由を一言で言うなれば「一定の役割を果たした」という感じでしょうか。当初の目的だった、ツイッターでゆるい感じの予想大会をして、それでF1好きの方々でわいわい楽しめたらいいね、という目的は果たせたかなと思います。

当初はサイトもなかったので、有志でお題を決め、予想を管理して、的中者の発表をしていました。人数も少なかったので、フォロワーさんの間でわいわいやりながら、特に強制することもなくおめツイートもしていましたね。そのうち管理が楽になるように私がサイトを作りました。私の技術不足(ウェブ周りの技術者じゃないのです)もあり、結構な時間を費やしましたが、参加していたみなさんからの暖かい言葉に助けられ、なんとか使える程度のサイトを作ることはできたのかなと思っています。

サイトが出来たことで、手作業に比べてはるかに楽になりましたし、F1の話題、しかも予想のお題が上位とは限らなかったので普段注目しない順位のドライバーの話題に一喜一憂できる楽しさがあったので、もっと多くの方と楽しめるように宣伝もし、おかげさまで2013年には最大51名もの参加者を集めることができるようになりました。主に私の技術的興味の側面もありましたが、サイトのリニューアルなんかも行ってきました。途中でインフラとして使っている Google App Engine の課金方法が変更され、それまでの方法ではすぐにサイトが使えなくなったりする苦労もありました。以降施したさまざまな改善により、最近はサイトが使えなくなるようなことはおきないようになりました。いやぁ、Datastore Read Operations の制限は厳しかったっすよ Google 先生。。

そんな苦労もありましたが、でも多くの方、特に初期のころから参加してくださってるみなさんは、ツイートの自動検出が難しいこと(投票のフォーマットは決めていないので)や、課金されないように運営することが大変なこと、などを理解してくださっていたので、いろいろ対策した後の効果の検証を助けてくださったり、何よりねぎらいの言葉をかけてくださったのが非常にうれしく、運営のモチベーションになっていました。

***

しかし、人数が増えたことだけが問題とは思いませんが、運営を続けるにつれ初期に比べて参加者のみなさん同士の新たなつながりは少なくなったように感じていました。的中者におめでとうのツイートをするのが唯一の賞品なわけですが、それを行わない方も多くなったように思います。もともとおめツイートをすることによって、これまでフォローしていなかった方と新たにつながったりできるといいよね、という考えで参加者を広く募ってきていたので、それが行われないとなると続ける意義がどれだけあるのかがわからなくなってきました。また、おめツイートをしても1ターン(?)で会話が終わることもほとんどで、なかなか新たなつながりには結びつかなくなりましたね。

さらに、最近は運営に対する批判もいくつか頂戴しました。上記のように、「ツイッターでゆるく予想を楽しむ」がコンセプトだったので、予想のツイートには特にフォーマットを定めておらず、そのために検出漏れ、検出間違い等はどうしても避けられませんでした。そのため「予想がおかしいです、直してください」というお知らせはよく受け取りましたが、多くのケースはドライバーの名前があまり見ないカタカナ綴りやあだ名になっているか、お題の答えになっていないケース(たとえば10位のドライバーを予想してください、というお題で、「10位は可夢偉」ではなく「可夢偉は10位」とツイート(お題の抽出精度を高めるために助詞の前後の関係とかも見てるのです))だったりすることが多かったです。その都度ある程度対応していますが、参加者全員の名前の読み方を統一することは不可能ですし、一部を調整すると他に検出漏れが出るなどの問題もあり、残念ながら手作業は欠かせない状況です。ですが私はもちろんこのサイト管理で食い扶持を得ているわけではないためサイトに張り付いて管理することはできず、どうしても対応は遅れがちになります。その状況で「まだ直ってないんですが」というツイートを何度かもらうのはさすがに滅入りました。それ以外は主に私の管理者としての問題に起因するのでしょうが、他にもいくつか批判を頂戴しました。

***

ですが、これらはある意味不特定多数の参加者を募っている時点である程度しかたのないことなんだと思います。サイトの運営で利益を上げているわけではないのでそれらの批判には腹も立ちますが媚びへつらう必要もないわけで受け流せばよいわけです。それよりも直接の原因となったのは、むしろ「孤独感」のほうかも知れません。

以前は何かサイトを改良したりすると参加者のみなさんからすぐに感想をもらえましたし、こんなことやってるよというツイートに誘われて今度参加してみますという会話がTL上にあったり、「Statsのページはまだかな(チラッ」のようにさりげなく期待の声があがっていたり。 もともとは予想1つだったのを2つを予想するようになったこと。ポイントシステムを採用したこと。これらもすべて私ではなく参加者のみなさんで決定したことでした。私やサイト、公式アカウントが何かするのではなく、みんなで決めていた、その感覚が楽しかったのかも知れません。最近参加された方はもちろんご存知ないと思いますが、サイトや公式アカウントのロゴも私が作ったのではありません。

それに比べると今は「管理者」としての立場が強すぎるのか、私自身もひとりで黙々とミスなく作業するのが当たり前という感覚ですし、参加者のみなさんから頂戴する批判からもかなりのみなさんがそのような感覚でいるのだと思えます。それは果たして #f1yosou が求めてきた姿なのでしょうか。これ以上運営していて何か意味はあるのでしょうか。

いろいろな変化があるとは言え、 #f1yosou をはじめたころに参加していたメンバーの大半が参加していないかまたはほとんどツイートしなくなってしまっています。シーズン末の結果発表にわざわざ「皆勤賞」「準皆勤賞」を設定しているのは、ずっと参加して盛り上げてくださっているみなさんに少しでもお礼・お祝いをしたいという気持ちで設定していますが、逆にほとんどツイートしていないのに #f1yosou だけ参加してくださってる方もおられ、そのような方にはむしろ余計な義務感を与えてしまっているのかもとさえ思います。もともとの「ゆるく予想して楽しもう」のコンセプトからは完全に離れてしまったと感じています。

***

このような考えに至り、そろそろ #f1yosou は幕引きの時期を迎えたのだろうと判断しました。公式アカウントとしては特に感情抜きで作業するようにしていますが、やはり日本GPは特別なものなので、発表は日本GPのころにしようと決めていました。参加者のみなさまには突然のお知らせとなって恐縮ですが、決めたのはもっと前になります。

もちろん、ツイッターのハッシュタグの性質上、この #f1yosou というタグになんら縛りがあるわけではないので、来年以降これをつかって予想する方々がおられても楽しいですし、どこかで似たようなイベントを起こす方がおられてもいいですね。私もどこかで参加するかも知れません。

以上、長文失礼いたしました。残り5戦となりましたが、参加者のみなさまと #f1yosou を楽しめるよう努力しますので、最後までお付き合いいただけるとうれしいです。公式アカウント、サイトとも今年いっぱいは維持する予定です。

2014年9月30日
@f1yosou と中の人 @Sdk0815

2013年9月30日月曜日

Heroku を試す(7)~ Play! Framework 2.2 を IntelliJ IDEA で動かしてみる

実は前の記事はだいぶ前に書いていて公開し忘れていたものでした。このたびもう一度使ってみようと思ったので、新しいエントリを書く前にとりあえず公開したものです。で、もう一度やろうとしたらいろいろバージョンも変わっていたので変化部分を。

まず前回はあきらめた git のバージョンですが、ちゃんとバージョンをあげておきました。

$ git --version
git version 1.7.11.3

これなら文句は言われまいw IntelliJ IDEA を起動しましたが、確かに何も警告は出ませんでした。勝った!(←何に?w)これで IDEA のほうも最新バージョンで進めます。

Play! Framework のほうですが、最新は 2.2.0 になっていました。なにやら嫌な予感が・・・。Play! Framework 自体は好きなんですが、バージョンアップ時の挙動が結構変わるのが難儀するんですよね。まあいいか、早速プロジェクトを作ってみます。


orz
こんな予想的中してもうれしくないw まだIDEAのプラグインが対応してないのかな。ここは気を取り直して、Play側から作って IDEA 対応を試みます。

$ play new sample-app
$ cd sample-app
$ play
[sample-app] $ idea

これを IDEA から開くと、無事開けました。

前回なぜはまらなかったのか不明ですが、デフォルトでは起動すると 9000 番ポートにつなぎに行きます。しかし他のアプリケーションで使っていると当然失敗します。直接コマンドラインから指定するときは

$ play run --http.port=9001

のようにすればいいのですが、IDEA からの起動だと play に直接コマンド渡せるわけではないので。結論としては Run/Debug Configurations のところで、Play 2 の起動構成を出し、 JVM Options に -Dhttp.port=9001 のように足せばポートが指定できます。

これで起動、デバッグ、あとは heroku へのデプロイ等は問題なくできました。しかし初回の push は長い・・・。いろんなライブラリの解決してるからっぽいですけど。あとはデータベースへの接続やバージョン管理(GAEで version.application.appspot.com で試せるやつのような)のやり方を学ばねば。

2013年9月29日日曜日

Heroku を試す(6)~ Play! Framework 2.0 を動かしてみる

さてなんとなく感じがつかめてきたところで今度は Play! Framework を使ってみようと思います。せっかくなのでちゃんと対応している(はずの)IntelliJ IDEA を使ってみましょう。Eclipse でやると結局のところ Java 以外のところはテキストエディタとして使うことが多くていまいち便利になった感がないので。

早速起動してプロジェクトを作成・・・ってあれ?前はここに Play! って出てた気がしたんですが・・・。恐らく完全な気のせいで、プラグインを入れなければいけないようです。それじゃ Eclipse と同じとかは思わないことにしますさくっと入れますw すると、おお、確かにでてきましたね!

実は最初何度やってもバージョンを変えてもうまくいかなくて相当悩んだんですが、ここに問題があがっていてこれかと思って普通にコマンドラインから play new してもエラーになったんです。なんだろうと思ったら Play! Framework 自体を /opt (つまり書き込み不可な場所)に入れていたのが原因だそうで。どうせ読み書き可能にしなきゃいけないのならユーザーのディレクトリに入れて指定したところうまくいきました。この思想がいいかどうかは別として。

さてこれを Heroku に上げてみましょう。Heroku のほうPlay! Framework のほうと両方に異なる文書がありますが、スクロールバーが短い(w) Play! のほうにしたがってみます。

まずは Store your application in git の部分。git コマンドをたたけばいいわけですが、IDEA から行きましょう。VCS > Import into Version Control > Create Git Repository で・・・

orz

厳しいっすw

git は rpm 経由で入れていて上げるのはまあまあ面倒なので、12.0.1 を再度引っ張り出してきて構成しました。するとコマンド自体は動いていたのか、既に git の管理下になっているようです。

では heroku の設定を。
$ heroku create sdk0815-sample2
Creating sdk0815-sample2... done, region is us
http://sdk0815-sample2.herokuapp.com/ | git@heroku.com:sdk0815-sample2.git
Git remote heroku added
これでリモートがセットされたはず。 しかし
$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.154' to the list of known hosts.
error: src refspec master does not match any.
error: failed to push some refs to 'git@heroku.com:sdk0815-sample2.git'
うーむ。これは何のエラーだろう。いろいろ調べたらどうやら何も push するものがないときに出るエラーみたいですね。 git commit したら確かにコミットされたので commit まではされてなかったんですね。
#IDEA からやるべきだったんですがついコマンド打っちゃいました。プロジェクトを右クリックで Git > Commit Directory... で全部 commit できます。

さて今度は push したらずっと待たされました。いけー。どりゃー。おおおお!

やったー!・・・ってあれ、こんな殺風景なはずは・・・w

どうもフレームワーク動いてないですね、これ。前に作ったときにあった Procfile にあたるものが必要なのかも。と思ったらちゃんと書いてありました。 これを作って再度挑戦です。また待たされました。いつ終わるのかな~。終わった!

変化なしw

よく考えてみると、この "Your new application is ready." という文字列って、ソースコードの中では
@(message: String)

@main("Welcome to Play 2.1") {
    
    @play20.welcome(message, style = "Java")
    
}

となっていて、文字列はコントローラである Application.java から送られてきています。ということはフレームワークは動いているということかな? @play20 というカスタムタグ(?)が動いていないようだと。

まあちょっと玉虫色な感じもしますが、とりあえず動かせるところまではもってこれました。実際に何か作るかは意欲と時間とネタ次第です。

2013年8月2日金曜日

IntelliJ IDEA で maven の dependency を解決する

ほんのちょっとした Tips 的ですが、しばらく悩んだので。

IntelliJ IDEA で Maven Module を指定して Project を作成します。ここまではよし。しかし実際に作成された pom.xml に dependency を追加する方法がわかりませんでした。すると、いくつか方法はあるようですが、そのうちの1つはエディターから Alt+Enter 等で出てくるメニューから "Add Maven Dependency..." を選べばよいと。ふむふむ。出てくるダイアログで文字列検索すれば・・・
 でてこない。 orz
全く出てこないわけではなく、何も入れてないときは ant とか commons なんとかとかそのへんは出てるんですよね。うーむ。どうもローカルにあるリポジトリだけを見てるっぽいですね。

そんなときは File > Settings から Maven > Repositories を選ぶと以下のような画面になるので、central repo を選んで Update を押せばよいようです。
その後同じ操作をすると、
めでたしめでたし。

2013年6月26日水曜日

Play! Framework で twitter4j を使う

久しぶりにちょっと時間ができたので遊んでみました。

表題のとおりです。とりあえず OAuth でログインできるところまで行きたいですね。

まずは twitter4j を追加します。これまでは jar をコピーしていたのですが、そんなことするよりずっと簡単な方法があります。Managed Dependency という項に書かれているように Build.scala に依存を書けば勝手に解決してくれます。フレームワークって大事ですね。
  val appDependencies = Seq(
    "org.twitter4j" % "twitter4j-core" % "3.0.3"
  )
これだけ・・・。便利になりました。

早速コードを書き始めると・・・おや、Play! を再起動しても IntelliJ IDEA では解決してくれないですね。うーむ。File > Invalidate Caches なんかもやってみましたがだめです。どうやら
$ play idea
を実行しないとだめみたいです。このへんはもう少し便利になってくれるとうれしいですけどね。まあこれで特に問題はないです。

では OAuth のページを作成しましょう。

と思ったらなんか便利そうなものを見つけました。 ここに書かれている SecureSocial なるものを使ってみますか。また dependency をつけます。
  val appDependencies = Seq(
    "org.twitter4j" % "twitter4j-core" % "3.0.3",
    "securesocial" %% "securesocial" % "master-SNAPSHOT"
  )

  val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here
    resolvers += Resolver.url("sbt-plugin-snapshots", new URL("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns)
  )
この時点では Play! 2.1 には spapshot を使えとあるのでそうしてみました。これで同じように play idea も実行して解決させておきます。routes は書いてあるものそのままで。play.plugins からは不要な Provider を消します。
9994:securesocial.core.DefaultAuthenticatorStore
9995:securesocial.core.DefaultIdGenerator
9997:securesocial.controllers.DefaultTemplatesPlugin
9998:service.InMemoryUserService
10000:securesocial.core.providers.TwitterProvider
こんな感じで。あ、sample から InMemoryUserService を持ってきました。動作確認に使えます。次に securesocial.conf を作って application.conf から include します。
securesocial {
  onLoginGoTo=/
  onLogoutGoTo=/login
  ssl=false

  twitter {
     requestTokenUrl="https://twitter.com/oauth/request_token"
     accessTokenUrl="https://twitter.com/oauth/access_token"
     authorizationUrl="https://twitter.com/oauth/authenticate"
     consumerKey="****"
     consumerSecret="****"
  }
}
いよいよ実行です・・・。とその前に、ログインしてないとだめなメソッドに @SecureSocial.SecuredAction アノテーションをつけます。
    @SecureSocial.SecuredAction
    public static Result index() {
        Identity user = (Identity) ctx().args.get(SecureSocial.USER_KEY);
        final String userName = user != null ? user.fullName() : "guest";
        return ok(index.render("Logged on as " + userName + "."));
    }
では実行です。/login にアクセスすると
まずはこのようにログインの画面が出ます。ここで t のアイコンをクリックするといつものツイッターの認証画面に飛ばされます。そこで認証を行うと
のようになります。やったー。・・・ツイッターだけだと正直楽になったかどうか微妙ですがw ほかのサービス(facebook とか)でもログインできるのでその手のサービスを作りたいときは便利なのは間違いないですね。

さてこれでログインはできましたが、twitter4j が使えなければ意味がないわけで。ログインした後に実行されるメソッドの中身を変えます。

        String ret = "Unknown";
        Identity user = (Identity) ctx().args.get(SecureSocial.USER_KEY);
        if (user != null) {
            Twitter twitter = new TwitterFactory().getInstance();
            twitter.setOAuthConsumer(Play.application().configuration().getString("securesocial.twitter.consumerKey"),
                    Play.application().configuration().getString("securesocial.twitter.consumerSecret"));
            AccessToken accessToken = new AccessToken(user.oAuth1Info().get().token(), user.oAuth1Info().get().secret());
            twitter.setOAuthAccessToken(accessToken);
            User u = twitter.verifyCredentials();
            ret = "Logged on as " + u.getName() + "(@" + u.getScreenName() + ") followed by " + u.getFollowersCount() + " followers.";
        }
        return ok(index.render(ret));
実行すると・・・
 できたー。

2013年5月24日金曜日

Heroku を試す(5)~コードを変更してデプロイしてみる

ずいぶん間があいてしまいました。興味の向く先がいろいろ変わるのはいいのか悪いのかわからないですが・・・。前々回の続きです。

しかしこのページ、殺風景ですね。
と思ったら
 あらら、エラーになってますね。早速直してみましょう。

直すためにはどうやってこのコードが動いているのかを知る必要があります。ソースコードを開いてみます。右にあるように、Main.java と HelloServlet.java があります。どう見ても Main が怪しい(w)ので開いてみると、思いっきり main メソッドがありますね。へぇ、これって任意の(サーブレットコンテナだけでなく)Java コードを実行できちゃったりするんですかね?それはそれで面白いような怖いような・・・。

ひとつ疑問なのは、この main メソッドをどうやって見つけているのか、ということ。これがわからないと間違ってどこかのクラスに main メソッドを作ってしまうととたんにアプリが動かなくなったりということもありうるのでは。ファイルを眺めていると大体のファイルは予想がつくものですが、中に Procfile なるファイルがあります。これは何だろう。
web:    java $JAVA_OPTS -cp target/classes:target/dependency/* com.example.Main
ほほう。どうやらこれがその答えだったようですね。なので一安心w

で、本題の修正です。もう twitter.github.com は twitter.github.io に変わっているために殺風景なページになっているのでしょうね。ローカルで編集して試します。Main クラスを Java Application として起動します。Eclipse 内では m2e のおかげでクラスパス等は解決されているはずです。 起動しました。8080 にアクセスしたらちゃんと同じページが出てきます。よしよし。Edit > Find/Replace で github.com を github.io に Replace します。保存してリロードすると・・・
めちゃめちゃ今どきになったじゃないですかw

さてこの変更をコミットしましょう。チュートリアルに戻って、まずは変更をコミットです。それから Push to Upstream をクリックしてしばし待ちます。すると無事サイトのほうも更新されます。なるほど。

2013年4月29日月曜日

Eclipse のプロジェクトを IntelliJ IDEA に

ちょっと Heroku の話はお休みして。#f1yosou のサイトはとうとう GAE/J の無料分では Stats が計算できなくなり、あえなく Stats を閉鎖する運びとなりました。で、この際裏で進めていたサイト全体のリニューアルを先にしてしまおうかと思ったのです。なぜなら新しいデザインのほうはまだ Stats ができてなくて時間がかかるなと思っていたんですが、現行のほうも Stats が使えないならもう移行してしまってもいいわけですね。

とはいえまだ公開できるレベルではないのでもう少し実装・テストをする必要があります。なのでこの際現状は Eclipse で開発しているのですが、IntelliJ IDEA を使ってみようと思いました。Java 部分はそれほど大差ないかと思うのですが、Velocity とかこれまではほぼ自前/手書きだったのが便利になるのではという期待もこめて。


ソースコードは subversion にチェックインされているので現状 Eclipse にあるコードはすべてチェックインしておきます。そこからチェックアウトする流れで。 IntelliJ IDEA から VCS > Checkout from Version Control > Subversion を選びます。すると右のようなダイアログがでるので、リポジトリの情報を入力して選択します。その後どこに展開するか場所をしていします。


場所を指定すると次は右のようなダイアログが出るので、私は gae というフォルダ以下に gae 関連のプロジェクトを全部まとめておきたいので、真ん中のやつを選びました。これで gae というフォルダ以下に f1yosou というフォルダができて、そのファイルが中にチェックアウトされます。

するとどうでしょう。
お、Web プロジェクトで、GAE とさらに GWT も使ってることを検出してくれました。Configure を・・・

と思ってこのキャプチャをとっていたらこのポップアップは消えてしまいました!w でもしたの Event Log をクリックしたら同じメッセージとリンクがでていました。ナイスw
Configure をクリックするとこんなダイアログがでるので、OK。
すると File > Project Structure を表示して Facets を見ると、
のように定義されています。あとはここに SDK へのパスを入れたりすればよい。

・・・と思ったんですが、いろいろ問題が。そもそも Dev Server が起動しない(ブランクになる)とか。クラスパス関連がごしゃごしゃになってたりとか。そこでいろいろ苦労しながらなんとかできそうな状態に持っていったやり方を以下に書きます。

まずは新規に GAE/J + GWT のプロジェクトを作成します。File > New Project で Java Module を選択して Next。これで JDO を使う場合はその選択も忘れずに。これで空のプロジェクトができます。空ですがいろいろ設定されているのが大事。

Eclipse でプロジェクトを作った場合は恐らく web ディレクトリではなく war になっていると思うので、ここで web ディレクトリを war に Rename します。web の上で右クリック、Refactor > Rename で war にしましょう。この rename がなぜか反映されてないところがあるのでそこを修正します。プロジェクトを右クリックして Open Module Settings を開くと上にあるようなダイアログが開くので、Facets の Web を選んで、Web Resource Directory 名を変更します。

さていよいよもとのコードを移行します。VCS > Checkout from Version Control > Subversion で上記の作業をします。そのときのチェックアウト先を今作ったプロジェクトそのものにします(つまり上書きします)。そして VCS > Enable Version Control で Subversion を選びます。私の場合 jdoconfig.xml と appengine-web.xml、web.xml が青くなりました。つまりチェックインされているものが変更されているということですね。これらの変更を Revert しましょう。右クリックで Subversion > Revert で戻せます。あと不要な index.jsp も消します。

この状態だとライブラリはパスが通ってない状態なので、WEB-INF/lib に何か入れていた場合はこれらを追加しなければいけません。普通の Java のときと同様ですが右クリックして Add as Library で追加します。また Open Module Settings をして Artifacts の WEB-INF/lib のところに追加するのも忘れずに。

この状態で Run/Debug で AppEngine Dev サーバーを起動したところようやく起動できました。・・・できたんですけどブラウザには悲しいページが。

まだだ!くじけるな!

この話は(たぶん)IntelliJ IDEA 云々ではないようです。既に問題になっていたようで。なので解決方法は Run > Edit Configuration から開くダイアログの VM options に-XX:-UseSplitVerifier をつけるだけ。そしてサーバーを再起動すると・・・
やっとキター!(表示が変なのはデータがまだないからです。)

この勢いで GWT の起動構成も確認します。自分のモジュールの .gwt.xml を右クリックして Run/Debug 。VM Options が必要な場合は上と同様に入れます。そして起動、おりゃーっ!
orz

まあいろいろ起きるもんですね・・・。生みの苦しみかこれは。とはいえこれは簡単に直って、また起動構成に戻り、Server を Default から AppEngine Dev に切り替えて起動しなおすだけでした。ふー。

さあ後は deploy だな! Tools > Upload AppEngine Application を選ぶだけ!
java.lang.RuntimeException: The application contains Java 7 classes, but the --use_java7 flag has not been set.
Unable to update app: The application contains Java 7 classes, but the --use_java7 flag has not been set.
いじめか orz
きっと Java6 にすれば治るんでしょう。GAE って確かまだ Java7 は正式サポートじゃなかったような気がするし。いやもう眠いから調べないですけど。切り替え!もう一度 Upload!

で、できた・・・。

これで恐らく開発できる状態にまではたどり着けた、と思うのですが。しばらく使ってみて今後どうするか考えます。ちなみにこのやり方が正しいのかベストなのか等全く見当もつかないので、もし試す場合は自己責任でお願いします。

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月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 にも追加されます。こうなれば

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

2013年2月28日木曜日

CentOS 6 に apache maven を入れてみる

いまさら感のある方も多いかもですが、表題のとおりです。仕事で少し使ってみていまいち使い方がわかりきらなかったので、自宅に導入してみます。どうせ yum でちょちょいだろうと思ったのですが、これがそうもいかなかったのでここに手順を記載。jpackage とかで入れるのもできそうな感じですが、きれいにはいかなそうなので。

さてそもそも apache maven とは何者か。
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
とあります。つまりざっくり言ってしまえば ant とかで書いてたビルドスクリプトをより便利にできるツールって感じでいいんですかね。まだそれほど使ってないので間違ってる可能性は大ですが。

ではインストールします。公式に飛んでバイナリを落としてきます。今回はこの時点で最新の apache-maven-3.0.5.bin.tar.gz をとりました。Java が必要だそうですが、もちろん既に入っています。公式にあるように /usr/local/apache-maven に展開します。
# mkdir /usr/local/apache-maven
# tar zxf apache-maven-3.0.5.bin.tar.gz
環境変数を指定します。
export M2_HOME=/usr/local/apache-maven/apache-maven-3.0.5
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
これで・・・
$ mvn --version
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 22:51:28+0900)
Maven home: /usr/local/apache-maven/apache-maven-3.0.5
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-279.22.1.el6.x86_64", arch: "amd64", family: "unix"
おおお!動きましたね!w

2013年1月14日月曜日

GAE/J でセッションの clean up

#f1yosou では一応セッションを使ってログインできるようになっています。個人の成績等が少し見れるようになっているのですがこちらの機能はほぼ使われてなくて、次のレースのお題を投票する際に使ってるのがほとんどでした。しかし GAE/J ではそのセッションのデータは Datastore に保存されているようなのですが、それがずっと残り続けてそれなりにサイズを圧迫すると。 #f1yosou では 14,000 ものセッションが残っておりました・・・。

なのでそれをクリーンしましょう。そのためのサーブレットが既に組み込まれているのでそれを使います。web.xml に以下の定義を追加します。

 <!-- session cleanup servlet -->
 <servlet>
     <servlet-name>_ah_sessioncleanup</servlet-name>
     <servlet-class>com.google.apphosting.utils.servlet.SessionCleanupServlet</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>_ah_sessioncleanup</servlet-name>
     <url-pattern>/_ah/sessioncleanup</url-pattern>
 </servlet-mapping>
 <security-constraint>
     <web-resource-collection>
         <web-resource-name>session-cleanup</web-resource-name>
         <url-pattern>/_ah/sessioncleanup</url-pattern>
     </web-resource-collection>
     <auth-constraint>
         <role-name>admin</role-name>
     </auth-constraint>
 </security-constraint>

これを cron.xml 等で定期的に叩くことによってセッションのデータを少なく保てるようです。既に多数残っている今回のケースではその URL を何度も直接叩いて減らしました。その際 Datastore Writer 等が増えるので Quota に余裕がある時にどうぞ。

2013年1月8日火曜日

#f1yosou : ツイッターウィジェットの更新

現在 #f1yosou のサイトにはツイッターのウィジェットが出ています。こんなやつ→ですね。

Twitter API V1.0 が動かなくなる3月にこのウィジェットも動かなくなるとか。まあ当たり前と言えば当たり前なんですが、V1.1 ではすべての API リクエストに認証(OAuth 等)が必要になったので、この任意の検索ができるウィジェットもできなくなって登録制になるという感じでしょうか。3月と言えばF1シーズン開始月になりますがそんなときにウィジェットが動いてなかったら泣けますw なので移行しましょう。

やり方はこちらに従うだけでよいはずです。それでは順に作業します。

まずは Twitter のアカウントのウィジェットの設定の画面に行きます。 そこで「新規作成」をクリックします。今回はハッシュタグによる検索なので、以下のようになりますね。いろいろ設定を変えると右のプレビューが変わります。
  これを保存すると、右下に javascript を含む HTML が生成されます。これをサイトに貼り付けます。気付かれた方もいるかと思いますが、上の設定にはドメインが必要です。1つ作っていろんなとこで使うってのはできないわけですね。それはいいんですが、開発するときにローカルで見れないと面倒だなぁと思っていたら、ちゃんと
By default we also support the "localhost" domain for testing on your local development environment.
とありました。なので安心して開発環境で試せます。実際張ってみると

完成!簡単ですね。(@ar147ti さん友情出演ありがとうございますw)

余談ですが、ドメイン指定は正確にホスト名を指定しなければいけないようで、サブドメインとかもだめです。なのでたとえば GAE で作業してる場合に別バージョンでデプロイして確認したいとかの時は <appname>.appspot.com だけでなく <version>.<appname>.appspot.com 等を一緒に指定する必要がありそうです。確認が終わったら消せばいいだけですしね。

サイトのほうにはもう少し整えてから反映します。