カテゴリーアーカイブ: 日記

Feb 13 2010

サーバサイド Groovy と Groovlets

ちょっと前ですが、スクリプト言語 Groovy の新しいバージョンにあわせて eclipse-groovy プラグインのバージョンがあがったということで、ちょっと触ってみました。 Groovy 自体、ワンショットスクリプトを数回かいただけでほどんどさわったことがないのですが、まぁお遊びということで。

このスクリプト言語、いざとなったら普通の Java の書き方できるので手が止まらなくて便利なのです。 クラスライブラリもいつもの使えますし(笑)

【コラム】イマドキのIDE事情 (74) 高機能なGroovy開発環境「Groovy-Eclipse 2.0」リリース! | エンタープライズ | マイコミジャーナル

1月15日、Groovy開発用のEclipseプラグイン「Groovy-Eclipse 2.0」がリリースされた。GroovyはJava VM上で動作するスクリプト言語でJavaに似た構文を持つためJavaプログラマにとって扱いやすいという特徴がある。Groovy-EclipseはこのGroovyでの開発を強力に支援してくれるEclipseプラグインだ。バージョン1.0から大幅に機能が強化されており、Eclipse標準の Java開発環境であるJDTと比較しても遜色ない開発支援機能を備えている。

ぱらぱらみていると、Groovy をサーバサイドでつかう Groovlets という仕組みがあるようだったので、こちらとあわせてサーブレット環境で使ってみることに。

以下、せっかくやったのでメモです。

とりあえず、Eclipse WTP で新規「動的 Web プロジェクト」をつくります。

groovlets02

普通ですね。 :)

で、このままだと Groovy-Eclipse が構成されていないので(.groovy がコンパイルされない)、つくったプロジェクトを右クリックして Groovy を構成します。

groovlets01

Convert to Groovy Project。 これで nature に groovy が入ります。 でもって、これやると groovy の jar も追加してくれるのですが、JavaEE の場所 (WEB-INF/lib)に入らないので消して、手動で lib の下にいれてあげます。

Groovlets を使うには –all を使うといいようです。 配布元にある groovy-binary-1.7.0.zip の embeddable フォルダに入っています。

あとは、 src の下で .groovy ファイルを作成すればコンパイル・再デプロイを groovy-eclipse と WTP がやってくれます。 ここまでで、 .groovy のグルーヴィな記述でサーバサイドプログラムを行うことができます。

さて、こっからが Groovlets。

サーバに「ファイルとして配置された」 .groovy をそのまま動かすのが Groovlets です。 ランタイムで勝手にコンパイルしてくれます。 あと、GSP という JSP みたいなテンプレートライブラリがあります。

要はサーバに配置された .groovy ファイルを書き換えると Groovlets がホットデプロイ(とはいわないか。JIT?) してくれる仕組み。 ぼくはまた、このホットデプロイを利用しながら、Groovy のシンタックスシュガーを使いまくって小規模な Web アプリを高速にかくものと想像していたのですが、どうもそうとは違う模様。

間違っていたらご指摘いただきたいのですが、 Groovy でモジュールを分割する仕組みは import のみ。 でもって、Groovlets は import 先のモジュールはダイナミックにコンパイルしてくれないのです。 なので、プログラムは url-pattern にあたったひとつの .groovy ファイルだけで構成する必要があります。

もちろん、デプロイ時に .class になっているものは import 可能なので Eclipse で .groovy かいてコンパイルしてデプロイすりゃいいんですが、そしたら Groovlets 使わなくてもいいような(笑)

結論的には、GSP とか JSP とかと同じように html テンプレートで使うのかな~。 もしくは上にフレームワークをかくための土台、、あとモジュール1本で済むような、「なんとか度」判定みたいなアプリとか。 :D

groovy のオリジナルソースを読んだところ、ダイナミックコンパイルは直アクセスだけでなく RequestDispatcher の指定も対応しているようだったので、きっとそういうことなのでしょう。

てなわけで、試しに以下のように構成してみました。

groovlets03

web.xml (抜粋)

<display-name>Groovlets</display-name>
<!-- Groovlets -->
<servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
</servlet-mapping>
<!--  GSimpleServlet -->
<servlet>
    <servlet-name>GSimpleServlet</servlet-name>
    <servlet-class>net.maple4ever.groovlets.GSimpleServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GSimpleServlet</servlet-name>
    <url-pattern>/index.do</url-pattern>
</servlet-mapping>

Groovlets と自前のサーブレットを2つ登録します。

テンプレート(ダイナミックコンパイル側)の .groovy ファイルは WEB-INF/groovy もしくは WEB-INF/ に配置します。(/ 優先で、そこになければ groovy/ を見に行くようになっていました) ここではわかりやすいように WEB-INF/groovy/index.groovy を配置。

index.groovy

html.html {
    head {
        title 'index.groovy'
    }
    body {
        h1 'Hello, Groovy World.'
    }
}

このへんが groovy の面白いところで、クロージャをつかった html の builder とかがあります。 これを使っておけば変な HTML ができることはないでしょう。(たぶん)

で、サーブレット側。 一応こちらも groovy っぽく書いてみる。。

GSimpleServlet.groovy

package net.maple4ever.groovlets;
 
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
class GSimpleServlet extends HttpServlet {
    
    void doGet(
        HttpServletRequest request
        , HttpServletResponse response) throws IOException {
        def rd = request.getRequestDispatcher("index.groovy")
        rd.include(request,response);
    }
    
}

最初、 void doGet(reauest, response) とかかいてみて、動かなくてはたと2分。 型を指定してなかったので、 HttpServlet の doGet をオーバーライドできなかったというオチでした。 オーバーロードになっちゃったのね。 てっか、そこ省略は怖いか。 :)

で、この中で index.groovy をこんな感じで include してあげると、読まれた時点で index.groovy が動的コンパイルされます。

ということで、、、う~ん view に groovy 使えるよ、という理解でいいのだろうか。いまいっぽ腹に落ちないひろまさくんでした。

Jan 26 2010

携帯電話 Bluetooth + DUN でモバイルインターネットを試す

10年前くらいは携帯電話/PHP の回線契約数を 5 回線くらい持っていたりして、モバイル系大好きだったのですが、いつのころからかご無沙汰気味。

昔はこの手のがずいぶんお値段高くて維持費的なものからやめてしまったと思いましたが、最近 ドコモの 128K パケホーダイとかでてきて、お小遣いくらいでまた遊べるようになったので、ちょっと復活して試しに Bluetooth + DUN を使ってノートPC をインターネットにつなぐ準備をしてみました。

こういうの、なにかちょっとした出張とかあったときのためとか、緊急時のインターネット回線用にとかでも用意しておくと便利かもしれません。 :)

bluetooth01

用意したのはノートPC ThinkPad くんと、ドコモの FOMA 携帯電話 SH906i さん。

また、ドコモの FOMA を契約していると、mopera U というドコモがやっている携帯電話接続可能なインターネットプロバイダを使うことができます。 これが現在キャンペーン中で、4末までですが 0円、もしくは 262.5円/月で接続することができます。

キャンペーン|サービス一覧|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

2009年12月1日(火)~2010年4月30日(金)

てなわけで、こちらの U スタンダードプランを使ってみることに。 ライトでもいいのでうすが、ドコモの公衆無線LAN Mzone も 0円キャンペーン中なので、こちらも試してみたくてスタンダードにしています。(ライトだとつけられない)

ちなみに mopera U の契約は、携帯電話を使って iMode のお客様メニューからやるのが一番簡単そうでした。 ただ申し込みサイトの説明がちょっと違っていて、

お申込み・契約変更|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

「iMenu」⇒「お客様サポート」⇒「お申込・お手続き」⇒「各種お申込・お手続き」⇒「便利なサービスの申込」

とありましたが、なくって、、「便利なサービス」じゃなくて、「MM サービス」というメニューの中にありました。 探したわ。 っていうか MM って久しぶりに聞いた(笑) ここでスタンダード + 公衆無線LAN を申し込みました。

ではでは、まず ThinkPad + SH906i の Bluetooth で Windows から DUN してみます。

どんな PC でも同じですが、先ずは PC 側の Bluetooth を有効に。。 …する方法を忘れて10分を消費しました。。 デバイスマネージャから見えなかったので一瞬、ぼくの ThinkPad に Bluetooth がついていたのが夢だったかと。。(笑)

ThinkPad の場合は Fn + F5 でオンにできます。 :)

bluetooth02

で、デバイスマネージャを確認。 でてきます。

bluetooth04

あとは、携帯電話の Bluetooth メニューから機器検索とかして、PC とペアリングします。 そうすると、PC 側にデバイスが現れます。

bluetooth05

この PC の場合は、携帯電話が COM4 に割り当てられました。 この状態で COM4 にアクセスがあると Bluetooth の無線を経由して接続されます。

で、ここからが mopera U に接続する設定です。 実はドコモからコネクションマネージャというのアプリがでていてオート設定できるのですが、ここは黙って手動設定。(笑)

まず、携帯電話に mopera U の APN を登録します。 ここでは実験なので、インターネットには接続できない、(現在)パケット無料の管理画面表示用のアクセスポイントを追加。

Poderosa でも teraterm でも使って、携帯電話のつながっている COM4 にアクセスします。 Bluetooth 経由で携帯電話のモデムにつながるハズです。 昔みたく PC と携帯をケーブルつながなくていいので便利ですね。 携帯電話はポッケにいれたままでOKです。 :D

でもって、携帯電話モデムの AT コマンド(説明書にでています)を使って、0120.mopera.net という APN を追加します。 番号は 10 にしてみました。

bluetooth03

シリアルなのでコマンドはゆっくり入力しましょう。 文字が遅れてくるよ。

AT+CGDCONT?
+CGDCONT:1,"PPP","mopera.ne.jp",,0,0
+CGDCONT:3,"IP","mopera.net",,0,0
OK
AT+CGDCONT=10,"IP","0120.mopera.net"
OK
AT+CGDCONT?
+CGDCONT:1,"PPP","mopera.ne.jp",,0,0
+CGDCONT:3,"IP","mopera.net",,0,0
+CGDCONT:10,"IP","0120.mopera.net",,0,0
OK

SH906i では APN 追加は、AT+CGDCONT= コマンドです。(真ん中コマンド) 他の携帯電話の方はマニュアルを確認のこと。(たぶんいっしょですが)

できたら、PC からここで登録した APN にダイアルアップします。 番号識別は電話番号の欄で行います。 携帯電話デバイスから右クリックして、ダイアルアップネットーワークの追加。

bluetooth06

電話番号に *99***[APN番号]# を設定します。 ここでは先に設定した 10 を。

で、ダイアル。 :)

bluetooth07

ユーザ名とパスワードは、mopera U に加入したときのウエルカムメッセージの URL からネットワーク暗証番号をいれた後の画面で確認できます。(若干わかりにくい)

接続できたら、 http://start.mopera.net/ にアクセスしてみましょう。 つながっているはずです。 この APN ではここのサイト以外はつながりません。(設定確認などをするところです)

ちゃんとインターネットにつながる 128K パケホなどの APN 設定情報はこちらにあります。

設定方法|ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U (モペラユー)」

ネットワーク設定(アクセスポイント等)やメール設定(POP、IMAP等)など、手動で設定を行う際に必要な各種設定情報をご紹介いたします。

手動設定用詳細情報(PDF形式:735KB)

mopera Uを従量でネットサーフィンやメールを利用する場合のアクセスポイント情報です。

アクセスポイント一覧(PDF形式:1,008KB)

パケホ 128K だと、APN は mpr.ex-pkt.net かな。(必ずサイト/PDF で確認してください) 128K だと使えないですが、フィルタリングフリーアクセスポイントとかあって面白いですね。

実は、ぼくのパケホ契約はまだ昔のやつなので 128K 接続つかえず、インターネット接続は試せていないのですが、後日やってみます。(一応、準備だけしたらしい(笑))

では、最後に mopera u スタンダードで使える、Mzone という公衆無線LAN。 このオプションをつけておくと、携帯電話じゃなくって、普通のそのへんにとんでいる Mzone の 無線 LAN も使えるようになります。

札幌だと、地下街はほぼ全域で使える模様。 あとはホテルとか空港とか、カフェとかですかね。 ぼくは、お昼あの辺の地下街でご飯を食べていることが多いのでためしてがってん。

接続は iPod touch より。 :)

mopera01 

うむうむ。 札幌地下街歩きながら見ていましたが、だいたいつながるようです。 現在 0 円なのでこれはお得。。 ポートは http のみかな、、メールは試しませんでしたが、特殊なポートはふさがれている模様でした。 WEP 接続なので、まぁまぁやることはほどほどに。

iPod touch から http でブラウジングはちゃんとできるので、お昼のオタノシミが増えました(笑)

とりあえず、ダイアルアップ、公衆LAN ともにキャンペーンは 4末までなので、それまでにいろいろ試してみたいと思います。 :)

Jan 12 2010

Eclipse 3.5 wiki エディタのフォント不具合

Eclipse 3.5 からだとおもうのですが、ファイル拡張子を .mediawiki とか tracwiki とかにして開くと wiki 記法が使えるエディタが開くようになりました。 ちょっとドキュメントを書く機会があったので気分転換に使ってみたり。

新しいものというのは、楽しいものである、、ぼくは、うきうきで wiki の記述を始めた・・・。(←ふり

悲劇は、 tracwiki のコード表記の部分で起きた。

travwiki01

倍角か! 昔のワープロか!(←弱いおち

ぼのを「・・・」

というわけで、Eclipse の Bugzilla を探してみるとどうやら SWT の不具合の模様。

Bug 278959 – setting font height should update font width

Created an attachment (id=138181) [details]

次の Eclipse 3.6 には入るようですが、3.5 で使えないのも寂しいのパッチを SWT 3.5.1 に適応してみました。 といっても1行パッチ。

SWT のソースをコンパイルして、上記不具合 class を plugins の下の

org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar

に差し替えただけです。

とう!

travwiki02

なおった、なおった。 :-)

.wiki のファイルは HTML や DocBook などに出力でき、リアルタイムでは HTML で表示できます。 設定画面である程度 CSS も変更できるようです。

travwiki03

まぁ正直、エディタの方はまだまだのできっぽいですが、とりあえず記法をオートコンプリートできるのは、wiki になれていないぼくには便利でした。 こまったら、CTRL + SPACE。

travwiki04

DocBook に書き出せるので、docbook2pdf とか docbook2txt とかでも整形して出力できそうですね。

というわけで、ひさびさのこののりのブログはやっぱり良い・・・。 :-)

Jan 2 2010

Twitter のボットと Platform as a Service

明けましておめでとうございます。 2010 年、ぼくも hiromasa.another もいつもどおりのまったり感かと思いますが、今年もよろしくお願いいたします。 :)

さて去年あたりから、Windows Azure などいわゆるクラウド的なサービスがいろいろでてきて、なんだかちょっとわくわく。 今年の興味はこの辺から・・・。

クラウドというと、ラップするレイアがサービスによっていろいろ違ってなんだかよく分からないですが、ぼくはその中の PaaS というサービスが遊ぶに面白そうかなと思っています。

クラウドと呼ばれているものにはいくつか種類があると思いますが、たとえば Amazon EC2 はサーバの物理存在を隠します。 サーバが 2台ほしければ、2 って画面にいれて起動させれば 2台できる。 増やしたければすぐ増やせる。 サーバの手配とかデータセンターの置き場所とか電源とか考えなくていいわけですね。

たとえば Google Apps。 これはサーバとさらにアプリケーションの運用を隠します。 言うならばメールサーバ落ちた!などと会社の情報システム部門がてんやわんやしなくてよくなるというサービス(笑)

で、PaaS というのはその中間。 物理サーバとアプリケーション動作に無関係な運用部分を請け負ってくれます。 で、のせるアプリケーションは各自つくってすぐデプロイできるように環境が整っている感じです。

今で言うところの、レンタルサーバに PHP のアプリケーションを各自入れて動かすの発展系のイメージ。

たとえば現状のレンタルサーバでは WordPress の MySQL のバックアップとか自分でやらなくてはならなくて結構大変ですが、PaaS の場合はスケジュールで勝手にバックアップをとってくれたり簡単にリストアできたり、各種リソースの使用量が管理画面から見えたり、よりアプリケーションよりのサービスが付随します。

PaaS のひとつである、Windows Azure では、既に WordPress も稼働しているとのことです。

「PDC09」リポート:Microsoftはハイブリッドな戦略で古い殻を脱ぎ捨てる (2/3) – ITmedia +D PC USER

欧米を中心に世界中で広く利用されているブログシステム「WordPress」の開発者であるマット・マレンウェッグ氏が登場し、Windows Azure上でWordPressを動作させるデモを紹介した。

さて、この PaaS ですがもう一つの特徴が、様々なアプリケーションを動かすための環境が整っていること。 簡単に言えば、C# とか Java とかそのへんの言語と、そのアプリケーションサーバ環境周りも使うことができます。

PHP では少し無理があったことも簡単にできるようになる・・・。 実はここがぼくの最大の関心事。 大昔 CGI が無料で使える海外サーバがでてきたようなどきどきが(笑)

PaaS のサービスは Google App Engine とか Stax Networks とかありますが、ここでは後者を使ってみました。 Stax のほうがサンドボックスの制限が緩いので遊びやすいのです。

とりあえずつくってみたのは、twitter ボット。

 stax02

PHP でももちろんボットはつくれますが、一般的な PHP の環境はプログラムから動き出すことができないという制約があります。 人のアクセスとか別系の cron とか外的要因からプログラムをキックする必要がありますが、ここでは Java のスレッドスケジューラを使って自分から定期起動するようにしています。

いろんなライブラリが簡単に使えるのもいいところで、このボットは twitter クライアントに twitter4j、また スケジューラ に Quartz というライブラリを使っています。

Twitter4J – A Java library for the Twitter API

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

Quartz Scheduler – Home

Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java EE or Java SE application – from the smallest stand-alone application to the largest e-commerce system.

ちなみに、Google App Engine はスレッド禁止っぽいので、Quatz は残念ながら動作しないと思われます。 http の通信もなにか特別なことをしなくてはいけなそうでした。(たぶん)

で、とりあえずライブラリや web.xml を配置します。 Stax Networks は Tomcat を使っているようで、また一般的な WAR も配置できるので基本的になにも考えずにいつも通りにつくれます。

stax04

web.xml を以下のように。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>Desyura</display-name>
  <servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <servlet-class>
    org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <init-param>
      <param-name>shutdown-on-unload</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>start-scheduler-on-load</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <display-name>RobotInitializer</display-name>
    <servlet-name>RobotInitializer</servlet-name>
    <servlet-class>
    net.maple4ever.desyura.RobotInitializer</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
</web-app>

QuartzInitializerServlet と、スケジューラの起動の Servlet を順番に登録。

あとはソースを書くだけです。 動作できるかどうかのサンプルでかいただけなので、いんちきをたくさん含んでいることをあらかじめご了承ください。

RobotInitializer.java。 スケジュールのインスタンスをもらって、Job を行うクラスを登録する感じです。 CronTriger を使うと cron みたいな形式で時間を指定できます。

package net.maple4ever.desyura;
 
import java.text.ParseException;
import java.util.Calendar;
import java.util.Locale;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
 
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
 
public class RobotInitializer extends HttpServlet {
    
    public static final String START_TIME = "START_TIME";
    private static final long serialVersionUID = 1L;
 
    public RobotInitializer() {
        super();
    }
 
    @Override
    public void init() throws ServletException {
        // QuartzInitializerServlet で作成したスケジューラを取得
        Scheduler sched = null;
        try {
            sched = (new StdSchedulerFactory()).getScheduler();
        } catch (SchedulerException e) {
            throw new ServletException(e);
        }
        // Cron 形式のトリガー作成(とりあえず 5分)
        Trigger trigger = new CronTrigger("trigger1", "group1");
        try {
            ((CronTrigger) trigger).setCronExpression("0 0/5 * * * ?");
        } catch (ParseException e) {
            throw new ServletException(e);
        }
        // JobDetail にコールバッククラス登録
        JobDetail jobDetail = new JobDetail(
                "Twitter Bot"
                , "Twitter Bot"
                , TwitterBotService.class
                , true
                , true
                , true);
        // 起動時間を JobDataMap に格納(twitter のロケールも日本にすること)
        jobDetail.getJobDataMap().put(START_TIME,
                Calendar.getInstance(Locale.JAPAN));
        // スケジュール開始
        try {
            sched.scheduleJob(jobDetail, trigger);
            sched.start();
        } catch (SchedulerException e) {
            throw new ServletException(e);
        }
    }
    
}

 

TwitterBotService.java。 時間がきたら twitter をみてつぶやく Job クラスです。 スケジュールごとに new されるので手を抜いて static で値を保持しています。(本当は context にシリアライズできる形で値をいれるのが良いと思われます)

package net.maple4ever.desyura;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Date;
 
import org.quartz.JobExecutionContext;
import org.quartz.StatefulJob;
 
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
 
public class TwitterBotService implements StatefulJob {
    
    // StatefulJob は同時実行されないが手抜き synchronized しておく
    static private List<Long> read = (List<Long>) Collections
            .synchronizedList(new ArrayList<Long>());
    static private final int PAGE_COUNT = 20;
    
    public void execute(JobExecutionContext context) {
        // スケジュールイベント
        System.out.println("Fire! " + context.getScheduledFireTime());
        // 初回起動時間取得
        Date fistTime = ((Calendar) context.getMergedJobDataMap().get(
                RobotInitializer.START_TIME)).getTime();
        // twitter 接続
        Twitter tw = new Twitter("ユーザ名", "パスワード");
        
        String tweet;
        try {
            // twitter から Mentions をもらう
            List<Status> status = tw.getMentions();
            for(Status stat : status) {
                // 起動時より前の返信は答えない
                if(fistTime.after(stat.getCreatedAt())) continue;
                // すでに返信していたら答えない
                if(read.contains(stat.getId())) continue;
                // 自分のスクリーンネームを相手に置換してつぶやく
                tweet = stat.getText().replaceAll(
                        stat.getInReplyToScreenName(),
                        stat.getUser().getScreenName());
                tw.updateStatus(tweet, stat.getId());
                System.out.println(tweet);
                // 読んだリストに入れておく
                read.add(stat.getId());
            }
            // getMentions() は 20件取得なのでそれを超えたら忘れる
            if(read.size() > PAGE_COUNT) {
                read.remove(0);
            }
        } catch (TwitterException e) {
            // 投稿失敗しても次に期待する
            System.out.println(e.getStackTrace());
        }
    }
    
}

(あ!!、if の位置間違っていることをブログかきながら発見。。(笑))

ひとつしかスケジュールもアカウントも制御できないエコーなボットですが、100 ステップくらいでできちゃうのはお手軽すぎです。

これは実験なのであれですが、スケジュールも twitter も意識させずに文字列操作部分だけ外だしにできるようにプログラムをかえていけばいいかなという感じですね。 Jython とか JRuby とか Groovy とかの Java の上で動くスクリプト言語にその部分をプラグインのように渡すのも面白いかもしれません。

できた WAR は Stax Networks にそのままデプロイできます。 ant タスクがあるのでコマンド一発。 FTP クライアントとかいりませぬ。

hiromasa.another :o ) » Blog Archive » Stax Networks への JavaEE アプリのデプロイ

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

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

さて、twitter は昔 Jabber をサポートしていたので、たとえば Stax Networks とソケットつなぎっぱなしにして、リアルタイムに反応するボットとかもつくれたと思うのですが、もうできなくて残念。

でも、最近は websocket とかそれっぽい技術もできてきていますので、こういったアプリケーションサーバがあると、いままで http な Web ではできなかったようなことも実現できそうです。

いろいろこのへんの技術で遊んでみたいな、と思った1年の始まりでした。 :)

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 系のライセンスなのでこういった配布形態も問題ないとおもいますが、やる方がいたら各自よくご確認ください。 ぼくは配布するまではなさそうなので、、(笑)

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

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 風ですが他にもいろいろテーマとかも変えれるようです。 :)