Java Enthusiast

3 Billion Devices Run Java

OpenJFX8 on Beagleboard-xM

Raspberry-Piでしか動かないとか抜かしてますが、動きます。

ややトリッキーなので詳細は後ほど。

  • Yocto/Pokyベースでcrosslibs-armv7hf.shみたいなのを作ってsdkを作成する
  • armv6hf.gradleを参考にarmv7hf.gradleを作る
  • modules/graphics/src/main/native-prism-es2/eglfb/eglUtils.cを修正(setEGLAttrsでRGBA, Depthの設定をコメントアウト)
  • 気合でコンパイル
  • build.gradle内の「//TODO: embedded support」がひどいのでその場凌ぎをする
  • jdk8-eaバイナリの組み込みjfxのファイルを全て消して差し替える

コンパイラgcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linuxでとりあえず通りました。

*追記:詳細は下記の通り

Yoctoメモ

Beagleboard-xMでYocto/Pokyなメモ。

Pokyその他。

$ git clone -b dylan git://git.yoctoproject.org/poky
$ cd poky
$ git clone -b dylan git://git.yoctoproject.org/meta-ti
$ git clone -b dylan git://git.openembedded.org/meta-openembedded

まぎらわしいので消す。

$ rm meta-yocto-bsp/conf/machine/beagleboard.conf

local.confにはこんな感じのものを加えとく。

# Beagleboard-xM
MACHINE ?= "beagleboard"
DEFAULTTUNE ?= "cortexa8hf-neon"
PREFERRED_VERSION_libgles-omap3 = "4.09.00.01"
PREFERRED_VERSION_omap3-sgx-modules = "4.09.00.01"
TOOLCHAIN_PATH ?= "${STAGING_BINDIR_TOOLCHAIN}"
TOOLCHAIN_SYSPATH ?= "${TOOLCHAIN_PATH}/${TARGET_SYS}"

DSP/BIOS関連メモ

  • DSP/BIOSを使う場合はいくつかのレシピからupdate-modulesの依存を消す必要がある。
  • recipes-ti/devtools/ti-cgt6x.incを見るとSRC_URIがひどいことになっている。手動でダウンロードして適時変えること。

以下その他メモ

  • DSP/BIOSはもはや過去のものになっている。Hard-floatでは動かない。
  • SYS/BIOSを使うべきだが最新のCodecEngineのレシピがない。
  • SGX関連は4.09.00.01あたりからHard-floatでちゃんと動く。(local.confで指定しないと古いバージョンのレシピになる。)

適当なイメージレシピ。

require recipes-core/images/core-image-minimal.bb
SGX_INSTALL = "libgles-omap3 omap3-sgx-modules"
DSP_INSTALL = "ti-sysbios"
IMAGE_INSTALL += "${SGX_INSTALL} ${DSP_INSTALL}"

libhybrisのデバッグ

ここらへんの環境変数ぽい。全くドキュメントがない。ソースを追うしか方法がない。

  • HYBRIS_LINKER_DEBUG:多分数字を上げるとたくさんでてくる。(3とかにすると膨大な量のログが)
  • HYBRIS_LINKER_STDOUT:デフォルトはstderrぽいのでここを1にしたりしなかったり。
  • HYBRIS_LOGGING_LEVEL:debugとかwarnとかそういうの。HYBRIS_LINKER_DEBUGとの関連性は不明。たぶんこっちはhybris全体の話なんだと思う。
  • HYBRIS_LOGGING_TARGET:ファイル名指定するとそっちに吐かれるみたい。
  • HYBRIS_LOGGING_FORMAT:systraceだけが有効なオプションぽい。
  • HYBRIS_TRACE:1のみが有効なオプションぽい。

PandaBoard Ubuntu 12.04

ハマったのでメモ。

 

記事を書いてる地点で、Wikiの通りインストールしても再起動後コケる。

http://omappedia.org/wiki/Ubuntu_PPA

 

boot.scrが狂ってるので修正が必要。

https://groups.google.com/forum/#!msg/pandaboard/KbFgZ_LL61E/yhq758AbT7EJ

 

正しいスクリプトは以下のとおり

fatload mmc 0:1 0x80000000 uImage
fatload mmc 0:1 0x81600000 uInitrd
setenv bootargs ro elevator=noop console=ttyO2,115200n8 mem=1G@0x80000000 root=/dev/mmcblk0p2 fixrtc splash
bootm 0x80000000 0x81600000

 

正義のメタル

昨日買ったCDがあまりにもあまりにもなんで、記事を書く衝動を抑えきれませんでした。

見て下さいこのジャケット。見たまんまモロSlayerそのものですし、あまりにも強烈なインパクトを与えます。そんでもって聴いた瞬間それはもうものすごい衝撃で、思わず笑っちゃうくらいSlayerです。全曲通して初期Slayer、すなわちShow No Mercyへの愛で満ち溢れています。

  • とにかく音作りがスゴイ。これ2005年のアルバムなんですが、おまえら80年代からタイムスリップしてきただろってくらいコッテコテの80年代スラッシュサウンド!
  • ボーカルの声がトム・アラヤそっくりです!!本人としか思えない!!!
  • もしあの時代のSlayerが現代にタイムスリップしてきたらきっとこういうアルバムを作ったに違いないです。
  • まったくのコピーバンドかというとそうでもなく、元祖よりややメロディアス寄りなサウンドです。きちんとSNMを発展させようとしている工夫が見え隠れします。
  • 開放6弦のトレモロは正義です。

そしてなにより聴いていて本当に楽しい。幸せな気分になれます。嫌なことが本当にどうでもよく思えてきて、このアルバムで世界平和を実現できると思います。

Opeth来日

いよいよ3/22、東京公演ですね!!!

久々にチケット買いましたよ、ええ。メンバーとユニオンあたりで遭遇できたらもう感無量ですね。

さて、先日のオーストラリア公演のセットリストがあまりにもひどかったので、神セットリストとは何か、と考えて作ってみました。

題して、「俺の考えた最強Opeth神セットリスト」

  1. Windowpane (Damnation)
  2. Master's Apprentices (Deliverance)
  3. Wreath (Deliverance)
  4. Under The Weeping Moon (Orchid)
  5. Credence (My Arms, Your Hearse)
  6. Still Day Beneath The Sun (Blackwater Park)
  7. A Fair Judgement (Deliverance)
  8. Reverie/Harlequin Forest (Ghost Reveries)
  9. To Bid Your Farewell (Morningrise)
  10. Black Rose Immortal (Morningrise)

いやあ・・・・いいですね〜!!!!!!!良い!!!!先ほど通して聴いてみましたがこれは良い!

近年のOpethで実現しうる選曲かつファン心をくすぐるセトリじゃないでしょうか。全曲通して割と「Still」な曲なのが特徴です。それでいてきちんとライブで光る曲を選んでみました。

特にBlack Rose Immortalで〆るところがポイントです!前曲のTBYFで、その予感を出しておくんです。これは何かが来ると。余談ですがBRIはOpeth史上たった3回しかライブをしていないんですね・・・!(しかもフルで演ったのはどうやら1回のみ)やっぱ長すぎるのでしょうか・・・今回の来日では期待してませんw

Windowpaneで始まるのもすごく良くて、この曲自体最近あまり演ってくれないので、是非演って欲しいところです。

Reverie/Harlequin Forestは演ってくれそうな予感。アウトロが見せ所ですよね。

5,6,7と敢えて静かな曲を続けるってのもなかなか面白いと思うんですがどうでしょう。ここらへんの曲も最近は演ってくれませんねー

Master's Apprenticesは割とよく演ってくれる曲なのですが果たして今回は・・・

Wreathなんかもイイ曲なんですけどねー・・・

今どきのウェッブサービスの作り方

みなさんRESTfulなWEBサービス作るときなにを使いますか?

・・・PHP?ああ、はい、なるほどね。

Ruby?なんですかそれは?きいたことがないですね。

Java?それは素晴らしい選択です!

ああ、でもJavaEEはダメです。アレは古い上に複雑すぎて。

 

今どきのハイカラな技術者はみなさんJavaSEを使っていますよ。ええ、もちろんとっておきの簡単フレームワークがあるんです。

 

まあとりあえず落ち着いて、これをダウンロードしてみて下さい。

http://www.restlet.org/

Downloadsというところから、バージョンは・・・そうですね、testingで結構です、JavaSEバージョン、ZIP版を選びましょう。

あっ、Mavenをお使いですね?それでしたら簡単です。

専用リポジトリを追加して

    <repositories>
        <repository>
            <id>maven-restlet</id>
            <name>Public online Restlet repository</name>
            <url>http://maven.restlet.org/</url>
        </repository>
    </repositories>

依存を追加するだけです

        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet</artifactId>
            <version>2.1.0</version>
        </dependency>

さあ、準備は整いました。早速コードを書きましょう。今回のサンプルは/testというアプリケーション内に/helloというリソースがあるというサービスです。

     public static void main(String[] args) throws Exception {
        Component component = new Component();
        component.getServers().add(Protocol.HTTP, 8888);
        component.getDefaultHost().attach("/test", new TestApplication());
        component.start();
    }

RestletはRESTfulな概念に忠実に倣ったフレームワークです。ComponentにApplicationを繋げて行きましょう。TestApplicationは今回のサンプルアプリケーション「/test」です。

public class TestApplication extends Application {

    @Override
    public synchronized Restlet createInboundRoot() {
        Router router = new Router(getContext());
        router.attach("/hello", HelloServerResource.class);
        return router;
    }
}

Routerは文字通りリソースへのルーティングを行います。ここで複数のリソースを登録できます。今回は/helloというリソースを登録しましょう。はい、そしてそれはインスタンスではなくクラスです。

public class HelloServerResource extends ServerResource {
    
    @Get
    public Representation getMessage() throws JSONException {
        JSONObject result = new JSONObject();
        result.put("message", "Hello Restlet!");
        return new JsonRepresentation(result);
    }
}

おっと、依存を追加するのを忘れました。

        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet.ext.json</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20090211</version>
        </dependency>

Restletは多彩な拡張機能を提供します。例えば今追加したのはJSON拡張。レスポンスをJSONで返したり、JSONのリクエストを処理したりするためです。だって今どきJSONでしょ?

さあ、これで立派なウェッブサービスが完成しました!起動してみて下さい。・・・どうでしたか?RESTfulな世界を体験できましたか?とっても簡単でしょう?

 

ここからはRestletをフル活用するためのヒントを幾つか紹介しましょう。

1. 統一されたエラーレスポンス

通常Exception発生時には500コードと共にInternal Server ErrorのHTMLページが出てきてしまいます。サービス的には適切なオブジェクトを返すのが無難でしょうから、ServerResource#doCatchをオーバーライドしましょう。

    @Override
    protected void doCatch(Throwable t) {
        final ZythumException zex = ZythumException.toZythumException(t);
        if (zex.getCode() == ZythumException.CODE_GENERAL_ERROR) {
            t.printStackTrace();
        }
        getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
        getResponse().setEntity(responseErrorRepresentation(zex));
    }
    
    public static Representation responseErrorRepresentation(ZythumException ex) {
        try {
            return new JsonRepresentation(ex.createErrorDocument());
        } catch (JSONException e) {
            StringRepresentation r = new StringRepresentation(
                    "{\"error\":3,\"message:\":\"JSON Error\"}");
            r.setMediaType(MediaType.APPLICATION_JSON);
            return r;
        }
    } 

これらのコードはあるサービスの一部ですが、次のような手製Exceptionを作成しておくと便利です。

    public static ZythumException toZythumException(Throwable t) {
        if (t instanceof ZythumException) {
            return (ZythumException) t;
        } else if (t.getCause() instanceof ZythumException) {
            return (ZythumException) t.getCause();
        } else if (t instanceof JSONException) {
            return new ZythumException(CODE_MALFORMED, "JSON Error", t);
        } else {
            return new ZythumException(CODE_GENERAL_ERROR, "General Error", t);
        }
    }

2. MongoDB

MongoDBは本当に素晴らしいDBです。私はRestlet用のDBには必ずこれを使います。

Mongoインスタンスはシングルトンにしておくと良いでしょう。

3. OAuth2.0拡張

今どきのウェッブに必須なOAuth2.0用拡張も用意されています。現在のバージョンはdraft10ですが、次期バージョン(2.2)ではdraft31に対応する予定です!

4. Tanuki Java Service Wrapper

Restletでは公式にTanuki Software社のWrapperを利用することを推奨しています。

最も簡単な手段はWrapperSimpleAppを使用することです。

5. クライアント

Restletはサーバーサイドだけでなく、クライアントサイドのフレームワークとしても長けています。例えば先程のサンプルサービスのクライアントサイドを書こうと思ったら

 ClientResource resource = new ClientResource("http://localhost:8888/test/hello");
 Representation representation = resource.get();
 JSONObject result = new JsonRepresentation(representation).getJsonObject();

簡単でしょう?しかもサーバーサイドとアーキテクチャが同じことに注目して下さい。サーバーサイドがRepresentationとしてレスポンスしているのが、そのままクライアントサイドでもRepresentationとして受け取ります。

実はサーバーサイドのスタブのようなものを作成して、まるで直接相手のServerResourceを呼び出しているかのような記述も可能なんですよ。

6. Connector

サーバーサイド、クライアントサイド共に、Connectorを指定することができます。実際のサーバ、クライアントの実装を差し替えることができるのです。

例えばサーバーサイドだとデフォルト実装、Jetty、JDKNet等。私のおすすめは断然Jettyです。差し替えはJetty拡張とJetty本体をクラスパスに含めるだけ、お手軽です!

7. XML Configuration

Componentのセットアップをベタにmain内に書くのももちろんOKですが、サービスが複雑になるとメンテナンスが大変になります。XML設定ファイルを用いれば、ComponentからVirtualHostの設定まで、柔軟に記述できます。(XMLファイルとして外部URLも指定できます。)

 

いかがでしたか?PHPJavaEEは今すぐ忘れて、貴方もRestletで素敵なRESTfulウェッブサービスを作りましょう!

 

 

この記事はJava Advent Calendar 2012の21日目のエントリでした。

前回は@kisさんのJavaでのパターンマッチを考えるでした。

次回は@masudaKさんです。