Dec 26 2009

マルチプラットフォームの GUI アプリケーション

たまぁになんですが、自作のちょっとしたアプリで GUI を使いたいときがあります。 ほいでもって、ぼくは家で大抵は Linux を使っているのですが、せっかくつくったアプリなのでたまに使う Windows でも使いたい、、。 ということで、マルチプラットフォームで動く GUI アプリ。

Mono + GTK、Mono + Windows.Forms、 Java + Swing、 Java + GTK(あるのかな?)、などなど思いつきますが、今回は Java + SWT をやってみました。 :-)

GTK は各種プラットフォームで動作する GUI ツールキットですが、自前で描画をしているので特に Linux 以外で動かすとやっぱりほんのすこーし、違う。 まぁ特別問題があるわけではないのですが、Pidgin や GIMP を Windows などで動作させたことがある方ならなんとなく分かるのではないでしょうか。

Swing は逆に Windows で動かす分にはそれなりなのですが、Linux で動かすとフォント系が厳しい。。 Swing は TrueType も自前で描画するので特にアンチエイリアスがある環境ではなにか違う感じを醸し出します(笑) (フォントレンダラがあんまりよくないのかな)

てなわけで、やっぱネイティブだよねってことで Java + SWT です。

Standard Widget Toolkit – Wikipedia

SWT は Java で書かれている。GUI部品を表示するため、SWT はそのオペレーティングシステムが提供するGUIライブラリを JNI(Java Native Interface)経由で使用する(これはシステム固有のAPIを使う一般的手法である)。SWT を使うプログラムは移植性があるが、ツールキット自体の実装は Java でかかれているにも関わらず、各プラットフォーム固有である。

ネイティブライブラリですが、Windows、Linux、Mac OS X などなどいろんなプラットフォームに移植されていますので、実行ファイルこそ変われど同じアプリケーション(ソース)が動作します。 Eclipse などの巨大なアプリケーションが SWT で動作していますので、ライブラリ自体もかなり枯れていると思われます。

で、SWT にかぶる形で GUI のフレームワークとして JFace というのがあって今回はこれも使ってみました。

とりあえず、SWT と JFace のライブラリを持ってきます。 JFace は Eclipse の plugins に入っているものをほげってきました。(外部 Jar 追加で参照してもいいのですが、なんとなくコピーして自分のおなかに)

jface02

こんな感じにライブラリをいれておきます。 これは Linux の場合。

詳しくはこちらが参照になります。

SWTとJFaceに必要な外部JARファイルを特定する – Identify the Required External JAR Files for SWT and JFace – 何かしらの言語による記述を解析する日記

JFaceプロジェクトには、SWTのクラスとJFaceのクラス、その他JFaceが依存するEclipseのクラスが必要です。SWTプロジェクトのウェブサイトから、SWTのクラスを含むファイルをダウンロードできます。JFaceのファイルとJFaceが依存するファイルは、プロジェクトに手動で追加する必要があります。

ほいでもってソースをかきます。

あちこちのサイト様を参照しました。 JFace は ApplicationWindow から extends して開始です。 (未来の自分用へのメモ)

JFaceSample.java

package net.maple4ever.sample.jface;
 
import java.io.File;
 
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
 
public class JFaceSample extends ApplicationWindow {
    
    public JFaceSample() {
        super(null);
    }
    
    @Override
    protected Control createContents(Composite parent) {
        // ウインドウタイトル設定
        parent.getShell().setText("JFaceSample");        
        // ウインドウサイズ設定
        parent.getShell().setSize(480, 320);
        
        // 親の下にさらに Composite をつくる
        Composite child = new Composite(parent, SWT.NONE);
        // レイアウトマネージャ設定
        child.setLayout(new GridLayout());
        // テーブル作成
        TableViewer table = new TableViewer(child);
        table.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        // テーブルにプロバイダ設定
        table.setContentProvider(new FileTableContentProvider());
        table.setInput(new File(System.getProperty("user.home")));
        
        return parent;
    }
    
    @Override
    protected MenuManager createMenuManager() {
        // 親メニュー作成
        MenuManager bar = new MenuManager();
        MenuManager fileMenu = new MenuManager("ファイル(&F)");
        // Action クラスを継承したインスタンスを渡す
        fileMenu.add(new ActionExit(this));
        // 追加メニューを返却
        bar.add(fileMenu);
        
        return bar;
    }
    
    public static void main(String[] args) {
        // ApplicationWindow インスタンス生成
        JFaceSample window = new JFaceSample();
        // メニューバー追加(createMenuManagerメソッド が呼ばれる)
        window.addMenuBar();
        // ウインドウクローズまでイベントループブロック指定
        window.setBlockOnOpen(true);
        // イベントループ開始(終わるまでここでブロック)
        window.open();
        // イベントループ終わったらリソース解放
        Display.getCurrent().dispose();
    }
    
}

ActionExit.java

package net.maple4ever.sample.jface;
 
import org.eclipse.jface.action.Action;
import org.eclipse.jface.window.ApplicationWindow;
 
class ActionExit extends Action {
    
    private ApplicationWindow window = null;
    
    public ActionExit(ApplicationWindow win) {
        // ApplicationWindow もらっておく
        window = win;
        setText("終了(&X)@Ctrl+W");
    }
    
    @Override
    public void run() {
        // Action の処理を run にかく
        // ApplicationWindow 呼んじゃえ
        window.close();
    }
    
}

FileTableContentProvider.java

package net.maple4ever.sample.jface;
 
import java.io.File;
 
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
 
class FileTableContentProvider implements IStructuredContentProvider {
    @Override
    public Object[] getElements(Object element) {
        File currentDir = (File) element;
        File[] files = currentDir.listFiles();
        return files == null ? new Object[0] : files;
    }
    
    @Override
    public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
    }
    
    @Override
    public void dispose() {
    }
}

で、まずは Linux。 実行~ :)

jface03

うむうむ。 Linux SWT の GTK 版なのであたりまえですが、GTK で描画されています。 Linux の場合、GTK のテーマでみんないろいろ画面をかえているので、何にもしなくても追随してくれるのはやっぱりいいですね。 :)

同様に Windows でも Windows 用の SWT ライブラリをあつめて、同じアプリケーションのソースを実行!

jface01

エアローってことで、 Windows 7 で動かしたの図ですが同じソースでネイティブ描画してくれております。 よい、よい。 :D

JFace は、普通の GUI フレームワークとちょこっと趣向が違うところがあったりして面白いですね。 スレッドの中からの GUI 描画方法とかまだ全然分かっていない部分もあって本気で使いこなすには時間がかかりそうですが、小物ならなんとかいけそうです。

ちなみにできたアプリの配布ですが、小さいアプリであれば Eclipse のエクスポートウイザードの実行形式 jar で ant 書き出してもらうのが楽そうです。

jface04

で、できた jar 玉を JRE が入っていれば通常ダブルクリックで実行できます。

jface05

gjc で JRE なしのまじネイティブ (.exe 版とか)もできるのかなぁ。 Eclipse の gjc 版はあるのでできると思いますが、ちょっとそこまでは調べていません。

swt 、JFace とも Eclipse Public License 系のライセンスなのでこういった配布形態も問題ないとおもいますが、やる方がいたら各自よくご確認ください。 ぼくは配布するまではなさそうなので、、(笑)

てなわけで、画面系はやっぱりネイティブがいいよね、という方は試してみるといいかもしれません。 :)

Dec 20 2009

WordPress 2.9 リリースと 2.9 対応版 wp-kyodeki とタイムゾーンと

というわけで、まさに日本時間で昨日になりますが WordPress 2.9 がリリースされました。 めでたい。 いろいろ新機能もあるようで使うのが楽しみです :)

さてさて、昔はつくっていたプラグインがバージョンアップでよく動かなくなっていたりしていたのでベータでチェックとかしていたのですが、最近わりと動くのでさぼってたら、ふと wp-kyodeki がおかしくなっているよう、、その動作を見てコアにとある変化があったのに気がつくぼく・・・。(←遅い

というわけでとりあえず wp-kyodeki。

このプラグインはアクセスカウンタみたいなもんですが、日付をまたぐとカウントがクリアされる仕様になっております。(もともとアクセスデータを蓄積しないようにつくったプラグインでした)

夜行性のぼくは 2.9 にアップデートされた我がサイトのサイドバーをみて、日付をまたいだのにカウントがクリアされていないことに気がついたのです。。

というわけで不具合がありましたので、 JSeries にリリースしました。お使いの方は更新ください。

WordPress Plugins-JSeries » wp-kyodeki (本日人気の記事表示ウィジェット)

タイムゾーンでの日付変更クリアとならない不具合が修正されます。

さて、なんでだろうという話ですが、コアの wp-settings.php に以下のコードが追加されていました。

if ( function_exists('date_default_timezone_set') )
    date_default_timezone_set('UTC');

PHP の date 関数の戻り値などに影響する、timezone の設定でこれが標準時間になるようになっています。 というわけで、これがなかった今までは日本時間が戻ってきていたのですが、UTC になったので標準時間がもどってくるようになった、ということでした。

wp-kyodeki の不具合です。 冷静に考えたら海外サーバだと WordPress のタイムゾーンを日本に設定していてもあちらの時間で更新されていましたね。すいません(笑)

で、そういやコアがどうなっているのかあんまり考えたことなかったなぁとちらほらソースをみていると、結構 date を生でつかっているところがあるようです。

まぁ、いまも日本タイムゾーン設定で海外サーバ使われている方も多くて問題になっていないようなのでコアは大丈夫かと思いますが、プラグインは考慮漏れているものがあるかもしれない(あんまりないと思いますが)ので、万が一 2.9 の日付系で問題があったら疑ってみてください。 :)

Dec 13 2009

WordPress プラグイン管理画面を簡単につくる非実用なフレームワーク

WordPress プラグインをつくるときにぼくが結構大変に思うのは、実は管理画面をつくること・・・。

なにげに自分のプラグインのソースを眺めると実ロジックより大きいこともあったりして笑ってしまいます。 というわけで、既存の管理画面のないプラグインにポンとつける用途を念頭に試しに(本当に試しに)フレームワーク的なものをかいてみました :-)

といっても、PHP 的に厳しい部分もあったりしてごにゃごにゃしなきゃいけない部分もありであまり実用的ではなく、まぁまぁこんな作り方もできるよねって話でみてもらえたらと思います。 PHP 5 系専用です。

まずはサンプル。 なにかしら管理画面の持たない既存のプラグインがあることにします。(以下、ソラでかいているので間違っているかもなのでイメージで)

なんでもいいですがおなじみ the_content フィルターで何か追加する感じのやつにしてみましょう。

   1: function addContent($content) {
   2:     $header = "ほげ";  
   3:     $content = "<p>$header</p>" . $content;
   4:     return $content;
   5: }
   6: add_filter('the_content', 'addContent');

記事の頭に「ほげ」ってつけるプラグインです。。 まぁサンプルってことでごかんべんを。(笑 プラグインヘッダなどは省略です。

ここでは固定値「ほげ」を管理画面から設定できるようにしたいと思います。

とりあえず、こいつを「クラス」にします。 っていってもほぼ機械的な置き換えです。

可変にしたい部分をフィールド(メンバ)においているところと「コンストラクタ」で初期化しているところに注目してください。

   1: class example {
   2:     
   3:     var $header;
   4:     
   5:     function __construct() {
   6:         $this->header = "ほげ";
   7:     }
   8:     
   9:     function addContent($content) {
  10:         $content = "<p>{$this->header}</p>" . $content;
  11:         return $content;
  12:     }
  13:     
  14: }
  15: $example = new example();
  16: add_filter('the_content', array($example, 'addContent'));

$header 変数が外にいきフィールド(メンバ)になりました。

__construct は new ってやったとき(15行目)に勝手に動く特別なメソッドだと思ってください。(ちなみに PHP はコンストラクタもメソッド扱いらしい)

変数を初期化して、あとは WordPress からの the_content の呼び出しを待っているイメージのプログラムです。

さてここからが本題。

今回つくってみたフレームワークというのは DolphinPanel という名前のプログラムで、こいつをつかうとこの手のプラグインに管理画面をつけられます。 “Dolphin” にはなんら意味はないです。 たまたまエコーザドルフィンを思い出しただけです。。(古)

まずプラグインのあたまで、このプログラムを require してあげます(1行目)。 で、プラグインのクラスに dolphin のインターフェースを “implements” します。

まぁかくだけです。 :-)

   1: require_once('dolphin-panel.php');
   2:  
   3: class example implements Dolphinable {
   4:     
   5:     var $header;
   6:     
   7:     function __construct() {
   8:         $this->header = "ほげ";
   9:     }
  10:     
  11:     function addContent($content) {
  12:         $content = "<p>{$this->header}</p>" . $content;
  13:         return $content;
  14:     }
  15:     
  16: }
  17: $example = new example();
  18: add_dolphin($example, 'example');
  19: add_filter('the_content', array($example, 'addContent'));

implements Dolphinable したクラス(3行目)は Dolphin 管轄の WordPress 管理画面を持つことができます。 権利をもったクラスを add_dolphin します。(18行目)

さて Dolphinable であるためには 3つの管理画面に関する決められたメソッド(onActive、onBind、onDispose)が必要になります。 これを実装していきます。

といっても単純にテキストボックスをひとつつけて、値を保存したいだけなら onActive だけ実装すればいいです。 onBind には return true; 、onDispose は空実装してください。

   1: require_once('dolphin-panel.php');
   2:  
   3: class example implements Dolphinable {
   4:     
   5:     var $header;
   6:     
   7:     function __construct() {
   8:         $this->header = "ほげ";
   9:     }
  10:     
  11:     function addContent($content) {
  12:         $content = "<p>{$this->header}</p>" . $content;
  13:         return $content;
  14:     }
  15:     
  16:     function onActive(DolphinForm $form) {
  17:         $form->add(new DolphinTextBox('$header', 'ヘッダ'));
  18:     }
  19:     
  20:     function onBind(DolphinForm $form) {
  21:         return true;
  22:     }
  23:     
  24:     function onDispose() { }
  25:     
  26: }
  27: $example = new example();
  28: add_dolphin($example, 'example');
  29: add_filter('the_content', array($example, 'addContent'));

17行目が Dolphin のキモで、この書き方で変数(フィールド)と管理画面のテキストボックスを結びつけます。 HTML フォームとの値変換、変数へのバインドをこの記述だけでやってくれます。(配列渡すと複数テキストボックスがでてきたりします)

おしまい!。

dolphinpanel02

なんだかここだけみると不思議かもしれませんが、このコードだけでめでたく管理画面がつきます。 簡単あるね。 もちろんプラグインはこの設定値で動きます。 :)

一応、もうちょっといじるとユーザ対話などもできるようになっています。 追加処理を書くとこんな感じになります。

dolphinpanel01

ここではサンプルだったので極力短くしていますが、onBind は値検査が必要な場合に実装するメソッドで、onDispose はプラグインが非活性になった場合に実装するメソッドです。 入力値に必須が入っていなかった場合のメッセージ出力や、プラグイン非活性時のデータベースからの削除などができます。

もうちょっと詳しいコメント付きサンプルと Dolphin のソースを JSeries の CVS にコミットしてあります。 気になる方は(いるのか?!)みてみてください。

http://sourceforge.jp/cvs/view/wppluginsj/dolphin-panel/

実は管理画面でつかえる HTML コンポーネントがまだテキストボックスとチェックボックスだけだったり実用にはほど遠いのですが、まぁプラグインのサービスクラスに管理画面の意識がなくなるのは楽かなと思います。 また、ここではサービスクラスにつけていますが、単純な VO のクラスに implements  して、上に親のサービスクラスをつくってプラグインを実装するのもいいかもです。

さて、お気づきの方もいらっしゃると思いますが、requre している関係でフレームワークとかいいつつクラス名称がかぶったりして、そのままだと Dolphinable な管理画面をもつプラグインがひとつしか作れなかったり、、、 namespace 使おうと思っても PHP 5.3 からだったりけっこう八方ふさがりなところがあったりします。

一応コントローラ自体は、ひとつで複数の Dolphinable を扱えるようにしているので、myhack.php とかにいれればいいんですが、もうないし(笑) __autoload とかで気合いで最新を読むような制御も考えましたが、hackish すぎるのでやめました。。 運用対処ということで(笑)

あとあと、PHP 5.3 じゃないと private プロパティがこじあけられないので、プラグインのフィールドは public にしてください。。 まぁスコープつけなきゃよいです。(お察しの通りリフレクションを使って変数をバインドしています)

というわけで、いろいろあって途中何度か企画倒れにしようかと思ったのですが、まぁせっかくつくったので話のネタに。 たぶんバグってると思うので、実用よりプログラム的な動きだけ楽しんでもらえればと思います。 :)

Nov 14 2009

Moblin 2.1 の研究

以前から気になっていました、解像度の低いコンピュータ向けの UI をもつ Moblin を試してみました。 とりあえず ライブ USB で ThinkPad / IdeaPad で起動してみることに。

最近ネットブックとかに Windows とは別に、起動選択でブラウザとメールくらいが高速起動でつかえる機能がついているものがありますが、あれのすごいやつだと思ってもらえれば正解です。 :)

HOME | moblin.org/jp

Moblin は、The Linux Foundationが主催するモバイル端末向けのLinuxディストリビューションで、ネットブックやMobile Internet Device(MID)、In-Vehicle Infotainment(IVI)向けのソフトウェア技術、アイデア、プロジェクト、コード、アプリケーションを共有するオープン・ソース・コミュニティです。

いまのとろこ、ネットブック/ネットトップ向けのリリースが成果物の中心となっていますが、これらをカスタマイズして MID など小型コンピュータにいれていくのだと思います。

ベースは Linux で、その上に OpenGL を使った描画ライブラリの Clutter や、解像度が低い PC 用への UI ツールキットなどの Moblin のキモがのっていくイメージに見えました。 このうわものを各ディストリビューションに移植した Ubuntu Moblin や Fedora Moblin などもあるようです。(本家の Moblin は Fedora ベースの for Intel ってな感じでしょうか)

てなわけで、

ごう、もぶりん!

moblin01

噂通りの超高速起動で、 USB メモリからですが、おそらく BIOS から 12,3 秒くらいで起動してしまっている気がします。 とりあえずアニメしたりしてめんこいです。 :)

moblin02

しばらく使っているとトップ画面はこんな風に。 おもしろいのがデータを使った履歴がサムネイルで真ん中の縦列に表示されることです。 見た Web ページや画像、動画などなど。 アプリ指向ではなくデータ指向でつくられていることが伺えます。

右の縦列は外部的な時系列なデータの動きがでるようになっているようです。 Last.fm と twitter がとりあえず標準で対応していました。 左の縦列は登録していた未来、予定や TODO などが出るようです。

基本的に Linux/GTK ベースなので一般的な UNIX アプリは動きそうですが、本領を発揮するのが Clutter と Moblin UI をつかってできているアプリだとおもいます。 基本はフル画面。 iPhone のアプリを想像してもらうといいかもですね。

まずはブラウザ。 Firefox ベースですが、小さい画面でうごくように UI が再設計されています。 2.1 からアドインも使えるようになっているようです。

moblin03 

でもってメーラです。 ベースは不明。。(笑)

moblin04 

タブがつかえる模様。

アプリのランチャーです。 GNOME DO みたくアプリ名入力でしぼっていけます。

moblin06

当然マルチタスク対応ですのでアプリのスイッチャーがあります。

moblin07

仮想デスクトップみたいになっていて、フル画面じゃないアプリも(普通の GTK っぽいアプリ)を配置できます。 スクリーンショットでは画面1(左)で動画を再生していますが、スイッチング中の縮小表示でもちゃんと動いているのはさすがといったところです。 :)

まだ Moblin ネイティブ(?)的なアプリが少ないようで、ブラウザ、メーラ、メディア再生がそれっぽくなっていて、残念ながら TODO やスケジューラはいまいちな感じでした。 もちろん Evolution とかも動くのだと思いますが、今後各アプリとも UI を Moblin にあわせたものがそろって本領発揮といったところだと思います。

アプリの開発環境も(なんとなくの予想ですが) Python バインディングもでてきそうな雰囲気なので、できたら手軽におしゃれなアニメ UI がつくれるようになりそうですね。

ちなみにこのネットブック版、完成度ははっきりいってしまうとまだまだです。 特に日本語環境は、本気で使おうと思うと対応はしていますがやばめっぽい。 あとメディアが DNLA サーバみてくれなかったんです~。 対応しているハズなんですが。。 あと、IdeaPad では無線LAN が使えませんでした、ThinkPad X61 は OK。

まぁまぁネットブック向けにリリースされているものはコンセプトモデルも兼ねていると思いますので、これを各社カスタマイズしてコンピュータにいれて出荷するのが本流かと思います。 さっくり起動してきれいに動く感覚はこれで十分わかりそうです。

とりあえず紹介動画とかみてたのしげな夢を見てみることにします。

かわいすなぁ。 :)

Nov 8 2009

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 は何もしなくてもいろいろ動きそう。 いろんなアプリをデプロイして実験してみるのも面白いかもしれません。

Nov 3 2009

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

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

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

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

Titanion

超高速突撃虫を殲滅せよ

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

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

game03

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

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

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

Linux でジョイスティック..

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

/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

なはは、愉快愉快。

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

Nov 2 2009

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 をダウンロードできます。 研究で再生してみましょう。 :P

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 機でもためしてみたいデス。

Nov 1 2009

Ubuntu 9.10 + Eclipse でボタンが押下できない場合

昨日新規インストールした Ubuntu 9.10 ですが Eclipse の挙動がおかしくなっていまいボタンがうまくおせたり押せなかったり。 どうやら GTK のバージョンがあがって、ボタンのイベントが変になってしまったようです。 検索するとみなさん同じ問題にあたっている模様。

とりあえず、環境変数を設定して起動すると修正できるようです。 よかった。 :)

Problems with Eclipse buttons in Ubuntu 9.10

After upgrading to Ubuntu 9.10 (Karmic Koala) some buttons no longer work in Eclipse 3.5. Clicking has no effect but keyboard shortcuts still work.

こんな感じでボタンアップのイベントがこなくて押しっぱなしになるボタンがあります。 うちの場合すべてではないよう。

eclipse91001

むきーおせねー

というわけで上のサイトで紹介されているように、ぼくの場合は eclipse-gtkfix.sh とかつくって、

#!/bin/sh
export GDK_NATIVE_WINDOWS=1
/home/hiromasa/Application/Eclipse/eclipse-php-galileo-linux-gtk/eclipse

でこいつを起動するとうまく動作するようになりました。 良かった。 :)

根本的には、Eclipse 側の

 Bug 287307 -  [Widgets] [GTK2.18] Control.setZOrder broken on Gtk+ >= 2.17.3

Summary:     [Widgets] [GTK2.18] Control.setZOrder broken on Gtk+ >= 2.17.3

これで修正されそうです。 Ubuntu 9.10 の GTK が 2.18 になったことが原因かと思いますが、Eclipse 3.6 からは大丈夫そうですね。

以下、ついでメモ。

昨日出ていた問題の、

  • dmesg に hda-intel: spurious response 0×0:0×0, last cmd=0×170503 のような不穏なメッセージが出る
  • PulseAudio にアプリが接続すると「ぶちっ」と音がする?

はどうやら同じ問題のようです。 アプリがサウンドデバイスに接続するタイミングで上のメッセージが大量に出ていたので、そのノイズがでているのかもしれません。

あと、Impulse という Screenlets のグライコの反応が遅くなる件ですが、他のグライコが実装されているアプリ (GNOME MPlayer)でも起きているように見えました。

うちのサウンドカード特有の問題のきもしますがなにかタイミング系のものでしょうか。。 カーネルよりっぽくて根が深そうです。

というわけで紆余曲折の元 9.10 の環境ができました。 :P

ubuntu91011

Windows 7 発売記念(?)ということでランチャーを GnoMenu に変更。

ubuntu91012

これは Vista/7 風ですが他にもいろいろテーマとかも変えれるようです。 :)

Oct 31 2009

Ubuntu 9.10 のインストールと GNOME Shell

OS インストールブログとかしている hiromasa.another ですが、でるんだからしょうがない。 この手のことにがまんってものはないらしいです(笑) ということで、Ubuntu の 10月版がでましたのでいれてみました。

*.10 は次の年の *.04 にむけたバージョンになるため、経験的に不安定なこともあるのですが、まぁまぁやってみましょう。

4月に出た 9.04 くんはとてもよくできていて、ご機嫌で使っていたのですが 9.10 のリリースとともにアップグレード通知が画面にでてきたのでつい

ぽち。

・・・で、インストールできたことはできたのですが、ぼくの場合、標準以外のアプリをたくさんいれているせいもあるのか、あんまり人がつかってないアプリをいれているせいもあるのか、少しいじるとクラッシュレポートがたくさんでてきました。。

というわけで、まぁ使ってないソフトも一新するという意味で新規インストール。 ぼくにつられて深夜にアップグレードボタンを押してしまった、インストール隊長 yutaka さん曰く、

ubuntu91008

後日の反省会。。(笑) この表示は 9.10 の通知システム (Notify OSD)です。 透過の仕方とかがおしゃれになったようです。

新規インストールしてみると、起動も少し速くなったようで調子よくなりました。 9.04 では標準パッケージになかったと思われる、Shutter や Screenlets もパッケージにはいったようでいい感じです。 また、Mono も 2.4 系になり MonoDevelop でのデバッグもきちんとブレイクできるようになりました。

アプリケーションは今回から Ubuntu ソフトウェアセンターからインストールできるようになりました。

ubuntu91001 

ただ、細かいパッケージ指定まではできないようなのでその場合はパッケージマネージャと使い分けると良いようです。 たとえば、MonoDevelop をソフトウェアセンターからいれても、デバッガまではインストールされない感じです。

他に変わったなとおもったところですが、PulseAudio のボリュームコントローラが標準ででてくるようになった気がします。 9.04 でも PulseAudio のコントロールパネルをいれるとできたのですが、9.10 から普通にボリュームアイコンの右クリックからアプリごとの音量の設定ができるようになりました。

ubuntu91002

また、カーネルが PAE 対応になりましたので、4G のメモリがみえるようになりました。(以前はたしか、4G つんでいても 3.4G くらいまでしかみえなかったと思います)

ubuntu91004

画面ではまるめられて 3.8G になっちゃっていますが、free するとちゃんと全部見えているようです。

あとパッケージ系では、Firefox を Notify OSD 対応にするプラグインが入ったようです。 firefox-notify をパッケージマネージャから検索していれると Firefox のダウンロード通知などが Notify OSD ででてくるようになります。

Ubuntu — karmic の firefox-notify パッケージに関する詳細

firefox-notifiy provides integration between Firefox and the Galago project’s specification for notifications. This allows Firefox to integrate better into GNU/Linux desktops which support a Galago compatible notification daemon such as libnotify.

他は…、ぼくの使う限りでは全体的に各パッケージとも順当にバージョンアップしているようです。 :-)

あとこれは Ubuntu のパッケージではありませんが、ちょうど VMWare Player が 3.0 にバージョンアップしたのでインストールしてみました。

ubuntu91003

今回からついに仮想マシンの”作成” ができるようになりました。 作成ウィザードをちらっとみましたが、Windows のメディアいれてシリアルを VMWare の世界のダイアログで入力するとオートでインストールしてくれるもようです。 VMWare Tools も勝手に最新版をダウンロードしてくれて便利でした。

設定などをぱらっとみると、ぼくが昔使っていた VMWare Workstation と同等のようです。 Windows 7 の XP Mode 対抗だとおもいますが、すごいもんです。

あとは箇条書きな感じで。

  • ATOK X3 はアップデートパッチなどをあてて動作 OK です。
  • NVIDIA の最新ドライバ(NVIDIA Linux graphics driver 190.42)も大丈夫そうです。
  • Screenlets でお気に入りだった Impulse というサイドバーグライコの動きが悪くなってしまった。 うごくことは動くのですが、反応が悪い。 かなりしょぼん。。
  • dmesg に hda-intel: spurious response 0×0:0×0, last cmd=0×170503 のような不穏なメッセージが大量に出る。 なんだろう。。
  • Eclipse 3.5 Galileo のウィザード形式の画面(プロジェクトの作成など)でボタンがマウスで押下できない(キーボードショートカットでは押せる)。 GTK のバージョン?
  • Possible corruption of large files with ext4 filesystem ということで、518 M オーバーのファイルがこわれる既知の問題? とりあえず、15G のファイルかいてみましたが、その時点では大丈夫でした。
  • PulseAudio にアプリが接続すると「ぶちっ」と音がする? うちの NVIDIA ドライバでのみ?

いまのところ、こんな感じです。 不穏なのもありますが、とりあえず致命的なことは起きていないようです。(今後あるかもですが。。)

さて最後に現在開発中の GNOME の最新シェル、GNOME Shell がパッケージに入っていたのでいれてみました。 gnome-shell で検索するとでてくると思います。

Compiz と競合しますので Compiz の視覚効果をオフにして、端末から gnome-shell –-replace とうつとおためし起動できます。 終わるときは端末で CTRL + c の方向で。。

GUI シェルってことで、今のパネルに置き換わるものになります。 左上にスタートボタン的なものが配置されており、おすと通常画面からぎゅーーーんと、

ubuntu91006

こんな感じになります。 …つたわんね~(笑)

動画をとろうとおもったのですが、gtkRecordMyDesktop を使うとうまく起動できなくて断念です。

仮想デスクトップ + ウインドウセレクタ + ランチャーのような感じです。 上の画面からアプリが起動やウインドウの移動や、仮想デスクトップの追加削除などができます。 またよく使うファイルなどもでてくるようです。

ubuntu91007

GNOME 3.0 の標準シェルになるのかな、、未来的な感じでおもしろいですね。 まだ不具合もちらほら見あたりますが、遊んでみるとおもしろいかもしれません。

見てみたいだけなんじゃ、って方は他の方が撮られた動画でどうぞ。

ということで、次期 Ubuntu は来年の 4月 10.4 になりますが、こちらは LST(ロングサポート)版になるとのことで、しばらく 9.10 でたのしみに成長を見守ることとします。 :)

Oct 25 2009

Windows 7 をインストール (IdeaPad S10e 編)

というわけで引き続き Windows 7 インストール。

2台目はネットブック IdeaPad S10e です。 CPU が ATOM でメモリ 2G、オンボードのグラフィックも遅い機械ですがはたしてどうなるか。 :)

IdeaPad はもともと XP なのでこちらは昨日と違って新規インストールになります。

DVC00005

ソフトウェアの状態は、ほぼ買ったまま。 ATOK とウイルススキャンをいれているぐらいです。 XP でのメモリ利用量。

win710

ええと、450M ほどでしょうか。

というわけで早速新規インストール。 XP から Windows 7 へのアップグレードインストールは新規(設定引き継ぎ不可能)のみ対応です。

古いファイル (Program Files、Windows、Document and Setteing)は Windows.old フォルダに残るようです。 またルートにおいたあったファイルもそのまま残っているようです。

インストールは特に問題なく完了。 割と速くて 40分くらいで終わりました。 :)

ドライバ系ですが、タッチパッドが Microsoft 製になって縦スクロールとかができなかったので、メーカの Windows 7 用のものを入れています。

Drivers  Synaptics

The Synaptics device driver is customized to meet the specific requirements of your device manufacturer. To ensure that you get the appropriate device driver for your system, download your Synaptics device driver from your system manufacturer’s support website.

あと、ASPI のドライバが不明になるようでしたのでルートに残っていた XP 用(?) のセットアップを動かしたらとりあえず不明ではなくなったようです。(うまく動いているかはちゃんと検証はしていません)

C:\SWTools\Drivers\ACPI\setup.exe

あとは XP のときと同じように ATOK とウイルススキャンをいれてメモリ利用量は以下の通りでした。

win711

640M ほどなので XP より 200M 弱増えた感じでしょうか。(ひょっとしてVRAM分かな??。 Aero きったら減るかはやってないす)

アップグレードだった ThinkPad も同じくらいでしたので、サードパーティの常駐含めてぼくの使い方だと Windows 7 機の実質的なミニマムメモリはこれくらいなのかもしれません。

メモリ 1G のネットブックだとちょっといたいかもしれませんね。 とりあえずうちの IdeaPad は 2G に増設しているので、200M くらいは影響はなさそうです。

win712

以前、この機械では Ubuntu を動かしていて Compiz がスムーズに動いていたのをみていたので心配はしていませんでしたが、オンボードの GPU でも Aero は問題なく動いているようです。 PC 全体の速度も体感的に遅くなったりしていることはなさそうです。

XP 乗り換えと考えると、不便なしでプラスアルファで Aero と新 UI がつかえるので、なかなかよいできではないでしょうか。 DVD の再生とかもソフトいれなくて手軽ですし、メモリ 2G つんでいるなら非力なマシンでも十分楽しめるのではないかと思いました。 :)