Stax Networks への JavaEE アプリのデプロイ

慣れの問題もあるかもですが、ぼくはちょっとした自分でしか使わないような Web アプリをつくるのに PHP とかより Java を使った方が早い場合があります。 言語的な問題というより環境、、便利なライブラリがたくさんあって、いれるのも lib に jar 入れるだけだし~、みたいな(笑)

問題はインターネット上にデプロイする先があまりないことですが、クラウドがでてきてくれたので最近はいくつか無料で使わせてくれるところがでてきています。

昔 Morph AppSpace を使って遊んでいましたが、Stax Networks というのも良さそうなので実験してみました〜 Google App Engine なんてのもありますね。:-P

stax01

Stax Networks – Home

The fastest way for Java EE developers to build, manage and scale applications in the Cloud.

というわけで、早速適当なものをつくってデプロイ。

以前から iアプリ用の Java の twitter クライアントがほしいなぁとおもっていて、この場合サーバサイドのプロキシがないと実装できないので、それをつくるのを見据えて、とりあえず REST すると public タイムラインとってくるのをやってみようと思いました。

Java EE に JAX-RS という REST の仕様がありますが、その実装である JBoss の RESTEasy と、twitter にアクセスするために twitter4j を使ってみます。

JBoss、JAX-RS実装「RESTEasy 1.0」正式版リリース – SourceForge.JP Magazine

JAX-RS(JSR 311)は、JavaでRESTアーキテクチャを利用してWebアプリケーションを作成するためのJCP仕様。RESTEasyはJBossのJAX- RS実装で、開発者に容易に開発できるフレームワークを提供する。Tomcatなど、JDK 5以上をベースとしたサーブレットコンテナで動作するが、「JBoss Application Server」と蜜に統合することで、ユーザーエクスペリエンスを改善できるという。

Twitter4J – A Java library for the Twitter API

Twitter4J は TwitterAPI の Java ラッパです。 Twitter4J を使うと XML や HTTP に詳しくなくても容易に Twitter とインタラクトするアプリケーションを書くことが出来ます。

Eclipse で動的 Web プロジェクトを新規作成して、WebContent/WEB-INF/lib に各ライブラリ jar を放り込みます。

WebCOntent/WEB-INF/web.xml で RESTEasy をサーブレット登録して URL にマッピングします。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <display-name>DJOdekoServer</display-name>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
       <param-name>resteasy.servlet.mapping.prefix</param-name>
       <param-value>/api</param-value>
    </context-param>
    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resteasy</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

これでアプリをかく準備完了です。 ソースを適当にかきます。 🙂

RESTEasy は resteasy.scan を true にしておくと、@Path のアノテーションをもつクラス(?)を勝手にスキャンしてくれてクラスロードしてくれるようです。

ということで、@Path で URI を指定しておけばエントリポイントが勝手にできます。 便利ですね。

package net.maple4ever.djodeko.server.rest;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.jboss.resteasy.annotations.providers.jaxb.Wrapped;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

@Path("/public")
public class TimeLine {

    @GET
    @Produces("application/xml")
    @Wrapped(element="public")
    public Set<PublicTimeLine> getPublic() {
        Twitter twitter = new Twitter();
        List<Status> statuses = null;
        try {
            statuses = twitter.getPublicTimeline();
        } catch (TwitterException e) {
            e.printStackTrace();
        }

        HashSet<PublicTimeLine> publicTimeLine = new HashSet<PublicTimeLine>();
        for (Status status : statuses) {
            publicTimeLine.add(new PublicTimeLine(
                    status.getUser().getName(),
                    status.getText()));
        }
        return publicTimeLine;
    }

}

@XmlRootElement(name = "tweet")
class PublicTimeLine {

    @XmlElement
    String account;
    @XmlElement
    String tweet;

    public PublicTimeLine() { }

    public PublicTimeLine(String account, String tweet) {
        this.account = account;
        this.tweet = tweet;
    }

    public String getAccount() {
        return account;
    }

    public String getTweet() {
        return tweet;
    }

}

その try cache はおかしーじゃねーかというつっこみはなしで。。(笑)

twitter4j を使ってパブリックタイムラインをもらって XML で出力する例です。  @Path(“/public”) を指定しているので、コンテキストルート/public にメソッドがマップされます。 メソッドにさらにアノテーションでパスを指定したり引数をもらうこともできます。

まぁまぁここまではできるひとなら 15分仕事です。 PHP より楽じゃねっすかね。 ローカルではうまくうごくことでしょう。 🙂

で、これを Stax Networks にデプロイするわけですが、、はて、WAR玉 ってデプロイできるかな。 なにか専用の SDK あるみたいですが。。(笑)

Deploying WAR Files – Stax

If you have an a Java web application packaged as a WAR file, you can use the Stax Deploy ANT task from the Stax SDK to deploy your WAR file to the Stax Cloud using an ANT script.

というわけで、ちゃんとドキュメントがありました。 SDK に ant タスクがあるようです。 とりあえず、SDK をどっかにいれてあと ant もいれておきましょう。 (Ubuntu には ant のバイナリパッケージにあるんですが、念のため本家版をつかっています。 Eclipse 内蔵の ant でもいいかもです。)

Ubuntu の場合は、 ~/.profile に以下を書いておくといいかもです。

#Stax Setting
export STAX_HOME=/home/hiromasa/Application/stax/stax-sdk-0.3.6
export ANT_HOME=/home/hiromasa/Application/stax/apache-ant-1.7.1/
export PATH=$PATH:$STAX_HOME:$ANT_HOME/bin

あとは、ドキュメントにかいてあるとおり build.xml にユーザ名とかパスワード、war の stax-application.xml パスをかきます。

stax-application.xml はとりあえず適当に Stax Networks の管理画面で BASIC Servlet and JSP なアプリを作成しておいて、それをダウンロードしてきてそのまんま使うのが楽かもしれません。

stax03

WAR ファイルはとりあえず面倒なので Eclipse のプロジェクトエクスポートでつくっています。 これで ant すればネットワーク越しにデプロイしてくれます。  Morph AppSpace と違ってすぐデプロイしてくれるようです。 URL にアクセスしてみましょう。 🙂

http://djodeko.hiromasa.staxapps.net/api/public

ちゃんと動いていますね。 🙂

さて、Stax Networks は素敵なことにドメインマッピングに対応しています。 とりあえず、自分のドメインの CNAME を設定しておきます。

cname djodeko djodeko.hiromasa.staxapps.net.

最後にドットいれるのを忘れないよう。。

で、名前がひけるようになるまで我慢の子です。 Stax Networks 的に DNS が引ける状態でないとうまく登録してくれません。 もし管理画面で save しても値が空になるようならこの状態です。 ややまってからしましょう。 うまく保存できたら、、

http://djodeko.maple4ever.net/api/public

素敵ですね。 🙂

実験的につくったものなので、まぁ URI かえるといろいろエラーでますが、どうやら Tomcat 使っているみたいです。

ファイルの書き込みがなければほとんどのフレームワーク/ライブラリは素直にうごくような雰囲気です。

DB (MySQL が使える)のほうはまだためしていませんが、JNDI 設定してしまえばあとは同じでしょう。 S2JDBC とか Hibernate とか動くんだと思います。

ふと思い立って、CMS とかも Java 製のものあるのかなとおもって検索してみると、エンタープライズ向けにいくつかあるようですね。 アプリケーションコンテナいるとコネクションプールとかシングルトンつかえるから性能的にはやっぱり有利な部分もあると思います。 PaaS が増えてくるとすればこれらも要チェックかもですね。

とりあえず、Stax は何もしなくてもいろいろ動きそう。 いろんなアプリをデプロイして実験してみるのも面白いかもしれません。

たまにゲームしてみたくなる

むかしは長編コンピュータゲームもだいぶやっていたのですが、最近はライトゲーム、、というか1プレイが短いのも好みです。 なんかちょっとした運試しになるくらいの、少し難しめのが良いですね。 クリアできるかクリアできないかのところ(笑)

あと逆に終わりがないのもよくって、そんなときにもってこいの弾幕系シューティングゲームがあります。 🙂

まえも紹介したことがあるのですが、Titanion というゲームです。

Titanion

超高速突撃虫を殲滅せよ

古き良き時代の固定画面シューティング、Titanion。

スタートするとき上下でゲームモードがいくつか選択できるのですが、MODERN にすると弾幕モードになってくれます。

game03

これがたいへんおもしろい。。 Windows の方は .exe ですのですぐ楽しめます。 だまされたと思って一度どうぞ。。(笑)

われらが Ubuntu ですが、この Titanion は 9.04 からパッケージに入っていたのですがなぜかうちでは起動せずでした。 9.10 になったので再チャレンジしたらちゃんとうごくじゃあーりませんか。 🙂 パッケージで Titanion 検索ではいります。

さて、このゲーム、シューティング。 キーボード操作 ~ カーソルキーと Z と CTRL。 最初は Z 押しっぱなしで、こまったら小指に指かけて CTRL+Z すると良いです ~ でも全然楽しめますが、ジョイスティックがあるとさらに細かい動きができるです。

[tegaki]Linux でジョイスティック..[/tegaki]

そーいやつないだことなかったなと、適当につないでみる。。

/dev/input/js0

に勝手にマウントされるようです。 さすが近代 Linux。 つないだのは Smart JoyPad 3 という PS2/USB 変換機です。

game01

ジョイスティックの動作確認したい場合は、

$ sudo apt-get install joystick
$ jstest /dev/input/js0

で、操作して数字がぱらぱらかわっていれば接続OK。 🙂

Titanion のゲームの起動は、ランチャーからでもよいですが、ウインドウサイズかえたいなら

$ titanion -window -res 1024 768

とかで大きな画面でできます。 フルスクリーンも可能ですね。

game02

なはは、愉快愉快。

弾幕系はやりすぎると、目をつぶったときになお弾幕がふってくるなどの中毒性がありますのでご注意ください。 🙂

VDPAU 動画再生支援の利用

Ubuntu 9.10 にアップグレードして、ふと mplayer の vc オプションをみていみたら、VDPAU 対応の codec が入っていたので早速試してみました。

VDPAU というのは NVIDIA からでている動画再生支援技術のひとつです。 動画再生時に GPU の機能をつかって CPU の負荷をさげるというまっことにありがたい機能です。 🙂

NVIDIA の GPU と Linux ドライバのインストール、あと対応ソフトがあれば利用可能です。 とりあえずお使いの mplayer が対応しているかは以下のようにすると分かります。

hiromasa@hiromasa-cube:~/デスクトップ$ mplayer -vc help | grep vdpau

ffmpeg12vdpau ffmpeg    working   FFmpeg MPEG-1/2 (VDPAU)  [mpegvideo_vdpau]
ffwmv3vdpau ffmpeg    problems  FFmpeg WMV3/WMV9 (VDPAU)  [wmv3_vdpau]
ffvc1vdpau  ffmpeg    problems  FFmpeg WVC1 (VDPAU)  [vc1_vdpau]
ffh264vdpau ffmpeg    working   FFmpeg H.264 (VDPAU)  [h2

VDPAU の文字がみえたらばんざい。 そのまま使うことができます。

動画再生支援は特に HD 動画で力を発揮します。 HD 動画なんかもっていないんじゃという方は以下から 1080 な wmv をダウンロードできます。 研究で再生してみましょう。 😛

Microsoft Windows Media Player : WMV 高精細コンテンツ ショーケース

Windows Media Audio/Video 9 シリーズは、最大解像度 1080 ピクセルの高精細 (HD) ビデオおよびマルチチャネル音声を実現する革新的なコーデックのセットです。体験版クリップをダウンロードして、高精細ビデオを体験してください。超高品質をお届けするこの体験版ビデオクリップは、1280 x 720 (720 p) または 1920 x 1080 (1080 p) のいずれかで、毎秒 24 フレーム (fps) でエンコードされています (解像度はクリップによって異なります)。

というわけで早速再生です。

vdap01

とりあえず VDPAU 使わない版。

$ mplayer Coral_Reef_Adventure_1080.wmv

4コアの CPU を使っていますが、各コアが順番に高負荷になっているのが分かります。

vdap02

では次は、VDPAU 使う版。 リサイズなどのフィルター系と codec そのものに VDPAU を適応します。

$ mplayer -vo vdpau -vc ffwmv3vdpau vdpau Coral_Reef_Adventure_1080.wmv
Selected video codec: [ffwmv3vdpau] vfm: ffmpeg (FFmpeg WMV3/WMV9 (VDPAU))
VO: [vdpau] 1440x1080 => 1920x1080 WMV3 VDPAU acceleration

そもそもリソースメータの表示が重かったりするわけですが、平均して相当負荷が下がっているのが分かります。 🙂

vdpa03

うちの NVIDIA はオンボード内蔵の遅いやつですが、それでもこれだけの効果があるのは強力ですね。 Atom + ION 機なんかでもおそらく実用的に HD 動画が再生できると思います。

ということで、気分を良くして Ubuntu 9.10 の各種 mplayer の GUI フロントエンドにこのオプションを使うように設定してみたりするのですが、どうも動作しませんでした(笑)

smplayer は出力を vdpau にすると codec も自動選択してくれるようにみえました。 GNOME Mplayer の場合はそういう機能がなさそうなので、動画にあわせてオプションを追加。。 ちょいめんどう。

vdap04

これでいいと思うのですが、動画が表示されません。 ぱらみですが、 –wid でウインドウハンドルを指定して表示するのが –vo vdpau だと落ちてしまっているようなな気がします。 もし同様に落ちた方がいましたら、 smplayer の mplayer ログでみれると思いますので研究を。。 🙂

・・・とおもったらこちらの方法で再生できました! (追記)

Ubuntu9.10beta + nVidia IOn + VDPAU + MPlayer – j9_1031 の日記

劇的な効果ですね、これ。 でも、速いCPUがあれば、こんな苦労は必要ないけどね。

さて、くだけた話、動画再生で 4コアの CPU の1コア もってかれるくらいは痛くもかゆくもないしもともと CPU も速いのでこの機械だとあまり恩恵もないのですが、これがネットブックとかだとかなり有用ですね。 ION 機でもためしてみたいデス。