Groovy + SWT + WebKit + jQuery Mobile でデスクトップアプリケーションをつくる

最近のいわゆる OS 上で直接動作するデスクトップアプリも、iPhone の影響かぴょこぴょこ動くのが多くなってきた気がします。 Linux のアプリでもこの手のがありますが、だいたいは WebKit + Python でやっている模様。 じゃー、Groovy でもやってやろうじゃないかというのがこの企画でありまして、でもって結果 SWT + WebKit はなかなか強力な感じな気がします。 :)

どういう風にするかというと、まずウインドを作成して WebKit のコンポーネントをぺたっと張ります。 でもって、Groovy 側から処理したいタイミングがあれば、JavaScript 経由で処理結果を WebKit の HTML に描画。 WebKit 側から Groovy を呼びたければ、これまた JavaScript を経由して処理をして値をもらう、みたいな感じです。

Groovy 側では JavaScript では処理できないような、ローカル資源を扱う処理をかいてあげて、WebKit 側にはビューを担当させます。 ここでは HDD にある画像ファイル一覧を読み出して画面に表示するようにしています。 まぁ HTML5 とか使うとこれはできるのかもですが、なんちゃってサンプルということで。  Java のライブラリで EXIF でも読めばそれっぽかったですね。

さて、HTML + JavaScript をビューに使うメリットは多くの派手な画面を描けるライブラリが使えることで、ここでは jQuery + jQuery Mobile を使って iPhone ちっくな画面とアニメにしてみました。 :)

画像サイズが不揃いでかっこわるくてすいません、すいません。。

webkitgtk02

デバッグ用にツールバーとか、タブとかつけていますが、本来的にはこれはなくなるもので、ミニブラウザと言うべきものがアプリの体裁となります。

webkitgtk01

上の画面から下の拡大画面にアニメで遷移、、ということでこれは動画にて。 :D

 

Groovy – JavaScript インターフェースは、このスクラップコードでいいますと「HTML ソース表示」の部分が Groovy –> JavaScript 呼び出し。 ローカルファイル表示の部分が JavaScript –> Groovy 呼び出しとしています。

Groovy –> JavaScript は簡単で SWT の browser コンポーネントにメソッドが用意されています。

Groovy 側。(タブ切り替えたときのイベント)

tabFolder.addSelectionListener([
  widgetSelected : { SelectionEvent e ->
    if(e.item == tabSource) {
      source.setText(screen.evaluate('return getContentHtml()'))
    }
  },
  widgetDefaultSelected : {}] as SelectionListener)

 

JavaScript 側。

// タブ切替時にソース表示を行う。
function getContentHtml() {
    return $('html').html(); 

}

 

抜粋コードなのであれですが、Groovy から evaluate を発行して JavaScript から返値を string でもらっています。 evaluate の中身に return をかくのを忘れてしばらくはまっていたのはここだけの秘密です(笑)

今度は逆パターン。 (たとえば) jQuery の ready を契機に Groovy のメソッドを呼び出すパターン。

JavaScript 側。 getFileList() がそれです。 値もらって HTML くみたてています。

$(document).ready(function() {
  var fileList = eval("(" + getFileList() + ")");
  for (var name in fileList) {
    $("#filelist").prepend(
      "<li class='ui-li-has-thumb ui-li ui-li-static ui-body-b'>"
      + "<a href='#bar' class='ui-link-inherit'"
      + "onclick='imageChange(\"" + fileList[name] + "\")'>"
      + "<img src='" + fileList[name] + "' class='ui-li-thumb'/>"
      + "<h3 class='ui-li-heading'>" + name + "</h3></li>\n")
      + "</a>";
  }
  $('ul').listview('refresh');
});

 

Groovy 側、 JavaScript とのインターフェースをとるために SWT には BrowserFunction というクラスが用意されています。 これがエロい。

event = new BrowserFunction(screen, "getFileList") {
  public Object function(Object[] arguments) {
    return getFileList(arguments);
  }
}
 
def getFileList(args) {
  def files = [:]
  new File("${imagePath}").eachFileMatch(~/.*\.jpg/) {
    files[it.name] = it.path 
  }
  return new JsonBuilder(files).toString()
  //return [10, 20] as Object[]
}

 

ここで我らが Groovy。 ということで返値に JSON を使っています。 JSON で Map を構築して return して JavaScript 側で eval すれば良い感じでデータの受け渡しができます。

インターフェース的には、org.eclipse.swt.browser.WebKit:convertToJS() あたりをみると分かりますが、String、Boolean、Number、Object[] がやりとりできるようです。 Object[] はこれらの再起です。 上の最後のソースの再下位行が Object[] で返す場合の記述です。

以上、まぁアプリの作りとしては若干強引な気もしますが、既存 GUI コンポーネントを使わずに、特にリキットデザインにしたい UI の場合はこの方式は楽かもしれません。

てなわけで、、シルバーらい子ちゃんをだしておいて、なぜ Silverlight じゃないんだっ、WPF じゃないんだっ。 しかも Windows じゃないし! ゆ、ゆるさないんだからね! となど聞こえてきそうですが、ここはご勘弁ください。。

あぁ、らい子ちゃん・・・。(←はまりすぎ

あ、そうそう SWT + WebKit は Ubuntu 11.04 だと SWT 3.7 の現在 head を使わないと貼り付けられないのでご注意ください。 あとね、、なぜかその WebKit で jQuery Mobile を使うとアプリ終了時に WebKitGTK+ がセグるようです。 なんだろうなぁ。 ちょっと調べてみます。

—-

以下、スクラップソースなので全然アプリケーションの体裁になっていませんが、一応動くコードをおいておきます。

Groovy 側、

import groovy.json.JsonBuilder
import org.eclipse.swt.*
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction
import org.eclipse.swt.browser.ProgressListener
import org.eclipse.swt.custom.CTabFolder
import org.eclipse.swt.custom.CTabItem
import org.eclipse.swt.events.SelectionEvent
import org.eclipse.swt.events.SelectionListener
import org.eclipse.swt.layout.GridData
import org.eclipse.swt.layout.GridLayout
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text
import org.eclipse.swt.widgets.ToolBar
import org.eclipse.swt.widgets.ToolItem
 
class BrowserApplication {
 
    Display display
    Shell shell
    CTabFolder tabFolder
    CTabItem tabScreen
    CTabItem tabSource
    Browser screen
    Text source
    Label statusBar
    ToolItem toolbarReload
    
    boolean ready
    def event
    def url
    
    def imagePath = "/home/hiromasa/ピクチャ/wallpaper/"
    
    def init() {
        display = new Display()
        
        // シェル
        shell = new Shell(display)
        shell.setSize(540, 640)
        shell.setLayout(new GridLayout())
        shell.setText("シルバーらい子ちゃん")
        
        // ツールバー作成
        ToolBar toolbar = new ToolBar(shell, SWT.NULL)
        toolbarReload = new ToolItem(toolbar, SWT.PUSH)
        toolbarReload.setText("リロード")
 
        // CTabFolder
        tabFolder = new CTabFolder(shell, SWT.BORDER)
        tabFolder.setTabPosition(SWT.BOTTOM)
        tabFolder.setSimple(false)
        tabFolder.setTabHeight(20)
        tabScreen = new CTabItem(tabFolder, SWT.NONE)
        tabScreen.setText("スクリーン")
        tabSource = new CTabItem(tabFolder, SWT.NONE)
        tabSource.setText("ソース")
        tabFolder.setSelection(0)
        // CTabFolder - Layout
        GridData tabLayout = new GridData()
        tabLayout.horizontalAlignment = GridData.FILL
        tabLayout.verticalAlignment = GridData.FILL
        tabLayout.grabExcessHorizontalSpace = true
        tabLayout.grabExcessVerticalSpace = true
        tabFolder.setLayoutData(tabLayout)
        
        // WebKit
        url = new File(".").getAbsolutePath()
        screen = new Browser(tabFolder, SWT.WEBKIT)
        screen.setUrl("file:///${url}/script/screen.html")
        tabScreen.setControl(screen)
 
        // ソース
        source = new Text(tabFolder, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL)
        tabSource.setControl(source)
 
        // ステータスバー
        statusBar = new Label(shell, SWT.LEFT)
        statusBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL))
    }
    
    def handle() {
        // screen.html 読み込み終了検知
        screen.addProgressListener([
            changed : { },
            completed : {
                ready = true
                statusBar.setText("Ready")
            }] as ProgressListener)
        // リロードボタン
        toolbarReload.addSelectionListener([
            widgetSelected : {
                screen.refresh()
            },
            widgetDefaultSelected : {}] as SelectionListener
        )
        // Groovy からブラウザの JavaScript を呼び出して HTML テキストをもらう。
        tabFolder.addSelectionListener([
            widgetSelected : { SelectionEvent e ->
                if(e.item == tabSource) {
                    source.setText(screen.evaluate('return getContentHtml()'))
                }
            },
            widgetDefaultSelected : {}] as SelectionListener)
        // JavaScript から Groovy を呼び出すための JS 関数を登録する。
        event = new BrowserFunction(screen, "getFileList") {
            public Object function(Object[] arguments) {
                return getFileList(arguments);
            }
        }
    }
    
    // ファイル一覧を取得して JSON 形式で返却
    def getFileList(args) {
        def files = [:]
        new File("${imagePath}").eachFileMatch(~/.*\.jpg/) {
            files[it.name] = it.path 
        }
        return new JsonBuilder(files).toString()
        //return [10, 20] as Object[]
    }
    
    def loop() {
        try {
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) display.sleep();
            }
        } catch (Exception e) {
            // TODO:
            e.printStackTrace()
        } finally {
            display.dispose()
        }
    }
 
    def BrowserApplication() {
        init()
        handle()
        loop()
    }
    
    def static main(def args) {
        new BrowserApplication();
    }
}

 

JavaScript + HTML。

<!DOCTYPE html>
<html>
<head>
<title>jQuery Moblie test</title>
<link rel="stylesheet" href="./css/jquery.mobile-1.0a4.1.css" />
<link rel="stylesheet" href="./css/style.css" />
<script src="./js/jquery-1.6.1.js"></script>
<script src="./js/jquery.mobile-1.0a4.1.js"></script>
<script language="JavaScript">
$(document).ready(function() {
    // 右クリックでコンテキストメニューを表示しない。
    $('body').live('contextmenu', function(e){
        e.preventDefault();
    });
    // ファイル一覧取得
    var fileList = eval("(" + getFileList() + ")");
    for (var name in fileList) {
        $("#filelist").prepend(
            "<li class='ui-li-has-thumb ui-li ui-li-static ui-body-b'>"
            + "<a href='#bar' class='ui-link-inherit'"
            + "onclick='imageChange(\"" + fileList[name] + "\")'>"
            + "<img src='" + fileList[name] + "' class='ui-li-thumb'/>"
            + "<h3 class='ui-li-heading'>" + name + "</h3></li>\n")
            + "</a>";
    }
    $('ul').listview('refresh');
});
 
// 詳細画面に遷移
function imageChange(path) {
    $("#image").attr({src: path});
    return true;
}
 
// タブ切替時にソース表示を行う。
function getContentHtml() {
    return $('html').html(); 
}
 
</script>
</head>
<body>
 
<!-- メインページ -->
<div data-role="page" data-theme="b" class="setting">
    <div data-role="header" data-position="fixed">
        <h1>らい子ちゃん</h1>
    </div>
    <ul data-role="listview" data-theme="b" id="filelist">
    </ul>
    <div data-role="footer" data-id="footer" id="footer" data-position="fixed">
        <h4>ばよえ〜ん</h4>
    </div>
</div>
 
<!-- サブページ -->
<div data-role="page" id="bar" data-theme="b" class="setting">
    <div data-role="header">
        <h1>らい子ちゃん</h1>
    </div>
    <div data-role="content">
        <img id="image" src="" />
    </div>
    <div data-role="footer" data-id="footer" id="footer" data-position="fixed">
        <h4>ぱんなこった〜</h4>
    </div>
</div>
 
</body>
</html>

WordPress Live Writer が欲しい

ぼくは家では基本的に Linux を使っているのですが、ブログを書くときは Windows 。 というのは Windows Live Writer を使っているためなのです。 このソフトはできが良いので Windows 起動するのはやぶさかではないのですが、他の OS でも動くの欲しいじゃないですか、ということで contenteditable のお話です。 :)

Windows Live Writer のキモはブログの CSS をそのままもってきて、編集時の表示にそのまま使えること。 <p> の改行幅から引用表記からそのままで書けますので出来上がりの想像がつきやすいので気に入って使っています。 画像やソースコードの挿入が簡単なのも良いですね。

live03

このソフトがどうやって実装されているのかちょっと分かりませんが、IE の contenteditable か、、いや DOM で外からつっこんでるのかなぁ。 Trident いじったことないので一瞬の動きでわからないひろまさくん。

さて contenteditable というのはもともと IE 独自の HTML 属性で最近は HTML5 に入ったのかな、ちょっと詳しくないですけども。 ajax の基盤記述 XMLHttpRequest も実は IE 5 の独自実装が始まりですし、嫌われ者のくせに意外と世界を変えている IE くん。(笑)

これが何かって言うと、、デモ見てもらった方が早いですね。

HTML5 Demo: ContentEditable

Any elements with the contenteditable attribute set will have a grey outline as you hover over. Feel free to edit and change their contents. I’m using local storage to maintain your changes.

HTML の属性に contenteditable=true って記述すればその中があろうことかブラウザから編集可能になる技術です。

じゃあ、Linux でうごく Live Writer をつくるには WebKit をウインドウにはって サイトの CSS と HTML を読んで、コンテンツのところを contenteditable=true にしちゃえばいいんじゃないってことで、、

live02

って、まだなんも動きませんが一応ちゃんと CSS もってきて編集できていますぞ。 表示形式がこのサイトになっているところに注目です。

 

Groovy + SWT + WebKit でつくっているので JVM さえ入っていれば Windows / Linux / Max OS X で動くはずです。

ただ SWT は 3.7 M7 、、でも Ubuntu 11.04 ではそれでも動かなくて head を使っています。 Mac とか Windows は 3.7 M7 で WebKit ぺたっとできるはずです。(Windows は safari 入れるらしい)

Ubuntu 11.04 はこの修正で直っています。

Bug 343454 – XULRunner 2.0 kills Eclipse when opening anything Browser related

1. WebKitGTK 1.4 is not ABI-compatible with 1.2, so the initial attempt to use it is failing.  This is fixed with the patch in comment 19, so SWT.NONE-style Browsers should no longer fall back to using Mozilla when WebKit 1.4 is present.

まぁ動きを見ているといろいろ苦難はありそうですが、知恵と勇気でなんとかなるレベルの気がします。

実のところ、SWT と WebKit のインターフェースは JS のみで、Trident (IE) のように直接 DOM にアクセスできないので処理的に厳しい部分もあります。

でも最近この WebKit 張ってクライアントアプリつくるパターンって結構見ますね。 たとえば、Linux の gwibber とか Hotot とかそのタイプだと思います。

live01

Hotot はネイティブとのインターフェースに JS の alert だしてそのイベントハンドルからアラート文字列で Python と通信しあうという無茶をしてるようです(笑) ネイティブは設定ファイルの読み書きとか、ネイティブの通知を出すとかだけでほとんどの処理を JS に依存しています。

たとえば jQuery + jQuery Mobile を使うと iPhone 風のアプリとかすぐつくれそうですね。 クライアントアプリなんかかいたことないけど、JavaScript は得意だぜって方はこの方式は面白いかもしれません。 chrome extention とか chrome os とかの考え方に近そうです。

contenteditable 自体は別にブラウザでも動きますので、WordPress 自体にサイトを管理画面に入らずに直接編集できる機能がついたりしても楽しそうですぞ。 管理バーからぴっとするとそのままの画面で編集モードとかね。 :D

WordPress 3.2 から文書編集にも力が入っているようなので、こんな直接編集のも将来入ったらいいなと思っております。

SaCSS vol.24 コーディング勉強会と OSC 北海道 2011 WordPress セミナー告知

5/14 のハムさん主催、SaCSS 勉強会に参加させていただきました。 こちらの勉強会におじゃまさせていただきますのは 2回目となりますが、Web 製作の方とお話できるのでいつも楽しみにしています。 今回は東京から WordPress メンバもこられていましたのでさらに楽しかったです。 :)

SaCSS vol.24 札幌コーディング勉強会 開催 | THE HAM MEDIA BLOG

今月のテーマ者WordPress。何度かテーマとしてとりあつかっていましたけど、今月は少し内容も時間も盛りだくさんになる予定です!

ぼくはライトニングトークということで「PHPをかくときに便利なツール・手法の紹介」をちょっとだけしゃべらせていただきました。

sacss2402

Eclipse for PHP Developer に WordPress をのせた紹介にしてみましたが、やっぱりカーソルが動いた方が面白いということでスクリーンキャスト形式で。(実は最近スクリーンキャストネタが多いのはちょっと練習も兼ねていました(笑)

当日使ったものを、youtube のほうに編集してアノテーションとかつけてアップロードしましたので良ければご覧ください。 LT なのですぐ見れる長さです。

 

そしていつも通りカメラもっているのに写真を撮っていないぼく。。 どなたかください(笑)

みなさんのプレゼンも、、分かる限りでリンクさせていただきます。

SaCSS vol. 24に参加してきました | diary | understandard.net

今回僕は、「WordPress を自分好みに」というタイトルで、functions.php にちょっと書き足すだけでできるカスタマイズ方法を紹介しました。

SaCSS Vol.24参加レポート(講演資料公開) | Simple Colors

私の方は、「WordPressでの企業WEBの作り方」と題して、基本的な構成方法、設定、プラグインと簡単な利用方法の紹介、設定などをお話させていただきました。

みなさん果敢にライブ WordPress 操作に挑戦されていたのが印象的でした。 さすがに普段から慣れているだけのことはあります。

たくさんの方が集まりましたので、初めましての方、実は初めましての方(笑)、ご無沙汰しておりますの方、どうもありがとうございました。 夜の方も楽しかったです。

さてもうすぐ 6月てなわけで、OSC 北海道が 6/11 に開催されます。 今年も WordBench 札幌よりブースと、あとぼくが WordPress のセミナーをやらせていただくことになりました。 Ktai Style ゆりこさんも去年に引き続きまして来てくださいます。

オープンソースカンファレンス2011 Hokkaido – イベント案内 | 2011-06-11 (土): 世界標準ウェブ制作ツール WordPress の魅力

講師:田中 広将

担当:WordPress 地域コミュニティー「WordBench 札幌」

対象者:WordPress ユーザー、CMS に興味のある人、ウェブ制作者など
レベル:初級~中級者向け

ブログツールから汎用のウェブ制作ツールへと用途が広がりつつある WordPress。その機能紹介およびカスタマイズの魅力を伝えます。

去年もセミナぼくでしたので、もうひろまさならいいや、、と言わず良ければ遊びに来てください(笑) セミナーは長くて、、という向きはブースのほうにどぞどぞ。

ぼくはいつも通りふらふらしていると思いますので、見つけたら声をかけてやってください。 最近は知っている方が増えてきたので心強いです。 :)

WordPress は 5分でインストールできるか(2011年版)

OS をクリーンインストールしてごにょごにょしておりましたが、WordPress のローカル環境を最後に入れてみます。 XAMPP から WordPress のインストール、それでもってテーマ表示試験用にこのサイトのデータインポートは果たして何分でできるでしょう。 操作動画でご紹介です(笑)。

  1. XAMPP ダウンロード
  2. XAMPP セットアップ(インストール & アップロードファイル上限設定)
  3. WordPress 初期インストール
  4. このサイトのデータをエクスポートしてローカルインポート

という流れになっております。

xampp2011-01

WordPress はどのバージョンからだったかちょっと失念してしまいましたが、インストーラの画面遷移が減りましたのでより速くインストールできるようになったのが分かります。 実は 5分もかからなそうです。

途中で

痛恨のミス!

をしていますが気にしないでください。 地味にかなり凹みました(笑)

XAMPP も WordPress もまじファイルダウンロードしていますので少し時間かかっているのと、インポートに mysql のコマンド使わずに phpmyadmin からやっているのもあってロスタイムしてますが、全体で 13分くらいでしょか。

お遊び動画ですがなんとか暇しないように撮ったのでよければお楽しみくださいっ。

youtube サイトで HD フルスクリーン再生すると分かりやすいかもです。 人の PC 操作しているの見るのって結構好きなんですが、みなさんはいかがでしょう。 :D

デスクトップマスコット MaCoPiX

新しい OS をインストールするといろいろいじりたくなるものですが、今度は MaCoPix さんでデスクトップマスコットを入れてみました。 えへ。。

MaCoPix さんは GTK+ でかかれたデスクトップマスコットエンジンです。 いわゆるウインドウにお座り動作できる何かですが、Ubuntu のパッケージにも入っているんですね! 知りませんでした!

MaCoPiX : Mascot Constructive Pilot for X

MaCoPiX (Mascot Constructive Pilot for X の略 : "まこぴっくす"と読んでください) は、UNIX系OS(要X Window System)、もしくはMicrosoft Windows(2000/XP以降)で動作するマスコットプログラムです。

GTK+ / Cairo に対応していますので、きれいに半透明とかできてとてもめんこすな感じであります。 :)

Ubuntu 11.04 の場合、インストールは apt-get でいけます。

sudo apt-get install macopix-gtk2

あとは端末から macopix で起動して、メニューの追加からありがたくダウンロードされたマスコットを読んであげれば起動完了です。(Unity の場合グローバルメニューにインストールメニューがいきますのでご注意を)

MaCoPiX : Mascot Constructive Pilot for X

■おすわりマスコット■

初音さんもいらっしゃいました。 :)

【Project】MaCoPiXマスコットDancingMikuα3&MikuMikuWall?【Mikunchu♪】

ではありがたく…。 ごほん。

ごう!MaCoPix!

スプラッシュの上にのった~。 かわええ。。

macopix01

ちなみに全然関係ないですが、Eclipse を使っている方なら感じる窓右下の白三角の違和感。 これは Ubuntu 11.04 でウインドウサイズ変更をつかみやすいようにするという改良の副作用で、スプラッシュ窓とかまで大きさが可変になってしまった様子です。 まぁ Eclispe はパッケージ外なのでしょうがない(笑)

MaCoPix は技術的には GTK の非矩形ウインドウというやつだと思うのですが、これがなかなか高度で・・・。

macopix02

上の初音さんでは、外側だけではなくミクの首とツインテールの間もウインドウあたり判定がなくなっているのが分かります。 透過画像からこのような形状のウインドウをつくりだすのって結構大変だと思いますが、難なくという感じですごいですね。

てなわけで、やっぱりマスコットは動いてるのがめんこいということで動画も撮ってみました。

むは! 萌えしぬる。。

・・今年度はこの調子でオチをつけていきますぞ。(←無理オチは不要です)

Ubuntu 11.04 インストール(ソフト編)

というわけで、前回はハードに攻めましたので Ubuntu 11.04 インストール・ソフト編です(?)。。

Unity/Compiz が動作している様子を動画で撮りましたのでインストールしていない方もお楽しみください。 :)

クリーンインストールしました USB HDD にて初期設定から。

Adobe Flash などのサードパーティソフトウェアと、Unity の設定ができる Compiz 設定マネージャ。

sudo apt-get install ubuntu-restricted-extras
sudo apt-get install compizconfig-settings-manager

サードパーティソフトはライセンスをご確認の上インストールを。 CUI からやるとライセンス認証もテキストででます。 TAB とエンターで操作です。

次は Eclipse 動かすために sun-java6 をインストールしました。 まずは Synaptic パッケージマネージャを起動して、設定->リポジトリから Canonical パートナーパッケージにチェック。

ubuntu1104-30

でもって、以下のコマンドでまずは sun-java6-jdk が入ります。

sudo apt-get install sun-java6-jdk sun-java6-plugin
sudo update-alternatives --config java

下の update-alternatives コマンドでおそらく初期状態 OpenJDK に向いている Java を sun-java6 に向ければ準備完了。

あとは適当に Eclipse 展開して実行すれば動くはずです。 本来は /opt とかに入れたいところですが、Linux 版の Eclipse で shared モード動作させるとうまくインストールできないプラグインがでたことがありましたので、ぼくは /home/hiromasa/apps とかに入れています。

でもって、このようなパッケージ外のアプリケーションを入れると Unity ランチャーくんがアイコン表示してくれなかったり、うまくピン留めできなかったりちょっと悲しい感じになります。

この方法であっているか分からないのですが、このような場合、以下の場所に .desktop ファイルを作成してダブルクリック起動するとアイコンとかちゃんとでますので、その状態でピン留めとかするとうまい感じに動くようです。

cat ~/.gnome2/panel2.d/default/launchers/eclipse.desktop
#!/usr/bin/env xdg-open
 
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[ja_JP]=/home/hiromasa/apps/eclipse-jee-helios-SR2-linux-gtk/icon.xpm
Exec=/home/hiromasa/apps/eclipse-jee-helios-SR2-linux-gtk/eclipse
Name[ja_JP]=Eclipse JEE
Name=Eclipse JEE
Icon=/home/hiromasa/apps/eclipse-jee-helios-SR2-linux-gtk/icon.xpm

こんな感じに設定ファイルつくると Songbird とかもちゃんとアイコンだせるようになりますぞ。 :D

ubuntu1104-33

うーむ、よしよし。 あとは適当にソフト入れて完了です。

ubuntu1104-31

最後にぴょこぴょこ動く Unity/Compiz を動画でお楽しみください。 :)

 

萌え。(2回目)

Ubuntu 11.04 インストール(外付け USB HDD 編)

半年に一回のお楽しみ、Ubuntu 11.04 がリリースされました。 :)

今回は alpha も beta も入れていなく youtube のスクリーンキャストでみていたのみでした。 GNOME 3 を入れずにつっこんできた噂の Unity は果たして! 楽しみ。

というわけで早速インストールでございます。

まずは Shuttle のデスクトップ PC から。 こちらは 10.10 からのアップデートインストールを試みてみました。 程なく終わり、難なく起動です。

ubuntu1104-10

Unity さんは Compiz 版じゃないのを 10.10 の Netbook Remix で使い続けていたので操作的な違和感はありませんでした。 ワイドスクリーンは左右余ってるでしょ、という感じの UI に仕上がっておりますので 16:9、16:10 そして 1024×768 の低めの解像度の環境でもうまい感じに動くと思います。

一点、Netbook Remix と違うのが左のドックがデフォルトで隠れる動作をすること。 おそらく、高解像度環境では常に出ていた方が便利と思います。 これらは conpizconfig-setting-manager の中の Unity Plugin 画面で変更可能です。(追加インストールします)

ubuntu1104-11

Behaviour タブのところで、Hide Launcher を Naver にすれば隠れなくなります。 また、アイコンの表示方式や大きさなども設定できるようです。 低解像度では 32 アイコンがよさそうです。

Netbook Remix の Unity ではデスクトップ領域があまり活用できませんでしたが、Compiz 版になってファイル置いたり screenlets とか普通に動くようになりましたので便利です。 :)

というわけで、Netbook Remix で使っていた ThinkPad と IdeaPad で動作させていた USB HDD 起動の Ubuntu 10.10 もアップデートしよう、、と思いきや。

インストーラクラッシュ!

実は前々からそうだったのですが、うちの USB 外付け HDD に Ubuntu を入れるのはなかなかの鬼門で、インストーラを起動するマシンによって最後の GRUB インストール時に失敗するという事象が起きていました。

ubuntu1104-04

右の DVDドライブから、左の USB HDD にインストールする、、という感じです。 一度 Ubuntu が入ってしまえば、この USB HDD を別のマシンにつなげばそのまんま OS 起動するという Firefox Sync も Ubuntu One もいらないという素晴らしいシンクロ環境。 気に入っていたのに…。

10.10 はインストールマシン変えるとうまくいったり、HDD を全消去するとうまくいったりしていたのでだましだましやっていたのですが、11.04 はどーやっても、

申し訳ありません。 エラーが発生したために指定の位置にブートローダをインストールすることができませんでした。

となってしまいうまくいきません。 /var/log/syslog をみてもようわからん…。

・・・手を変え品を変え再試行インストール回数は 12回を超える。。

この間、ぼんやりと次の手は浮かんできていたのです。 USB HDD へのインストールは失敗するけど SATA へのインストールは成功するはずなんだ…。

ubuntu1104-01

そして殻を割られるかわいそうな USB HDD くん。(笑)

USB 変換をとってしまえばただの 2.5 インチ SATA HDD。 これを ThinkPad の SATA に移植です。

ubuntu1104-02

持っててよかった ThinkPad。 HDD すぐ抜けるようになっているでございます。 ありがとう。

で、SATA めがけて Ubuntu をインストール。 通常起動、キタ!

これをまた外して、USB HDD に戻して、、ブートしてくれよぅ。 面倒なので裸で(笑)

ubuntu1104-03

キター!

ubuntu1104-00

ubuntu1104-12

萌え。(完)

twitter streaming API への接続

その昔、twitter が Jabber プロトコルをサポートしていたことを覚えている人は何人いるだろうか?(笑)

どうもぼかぁ最新データをとるのにいちいちポーリングするのってのが全般的に好きではなくて twitter も Jabber 復活を心待ちにしていたのですが、果たしていつの日だったかストリーミング API として戻ってきたのでした。 良かった :)

というわけで、API 公開からずいぶんずいぶん経ってしまいましたが、何となく思い立って Groovy からつないでみました。

Java には twitter4j というとてもよくサポートされたtwitter ライブラリがありますので、まずはこちらを利用させていただきます!

Twitter4J – A Java library for the Twitter API

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

さて、まず twitter につなぐのに面倒なのが oAuth 。。 とりあえず動作確認したいだけなのにアプリの登録とかしなければならなくあれですが、しょうがないのでしますです。

Twitter / アプリケーションを登録

ここでOAuthを使ったアプリケーションを登録することができます。OAuthは新しい外部アプリケーションの認証システムです。

アプリの登録をすると、consumerKey と consumerSecret がもらえますのでメモして、以下の Groovy ソースに入れて実行してみます。

import twitter4j.*
 
def oAuthConsumer = "入れる"
def oAuthConsumerSecret = "入れる"
 
def twitter = new TwitterFactory().getInstance()
twitter.setOAuthConsumer(oAuthConsumer, oAuthConsumerSecret)
 
def requestToken = twitter.getOAuthRequestToken()
def accessToken = ""
 
println "ブラウザで以下の URL にアクセスして表示された PIN コードを入力してください。"
println " ${requestToken.getAuthorizationURL()}"
System.in.withReader {
    print "PIN コード: "
    accessToken = twitter.getOAuthAccessToken(requestToken, it.readLine())
}
 
println "access.token=${accessToken.getToken()}"
println "access.token.secret=${accessToken.getTokenSecret()}"

実行すると URL がでてきますので、ブラウザにコピって入力して先ほど登録したアプリケーションからのアクセスを自分の twitter アカウントに対して許可してあげます。 そうすると PIN コードでてくるので、こっちのアプリに入力してあげると、今度はアクセストークンが2つもらえます。

コンシューマキー 2 つと、アクセストークン 2 つが揃ったらいよいよアプリをかきます。

ここではストリーミング API を使ってリアルタイムに自分のタイムラインをひろってみます。

import twitter4j.*
import twitter4j.conf.*
 
def consumer = "入れる"
def consumer_secret = "入れる"
def access_token = "入れる"
def access_token_secret = "入れる"
 
def builder = new ConfigurationBuilder()
builder.setOAuthConsumerKey(consumer)
builder.setOAuthConsumerSecret(consumer_secret)
builder.setOAuthAccessToken(access_token)
builder.setOAuthAccessTokenSecret(access_token_secret)
 
def config = builder.build()
def twitter = new TwitterFactory(config).getInstance()
def stream =
    new TwitterStreamFactory(config).getInstance(twitter.getOAuthAccessToken())
 
stream.addListener(new UserStreamAdapter() {
    @Override
    public void onStatus(Status status) {
        def user = status.getUser().getScreenName()
        def text = status.getText()
        println "@${user} ${text}"
    }
})
 
println "Start streaming..."
stream.user()
 
System.in.withReader {
    while((line = it.readLine()) && (line=line.trim()));
}
 
println "Stop streaming and cleanup..."
stream.cleanUp()

じゃんじゃんじゃん。 エンター押すと終了です。

ソケットつなぎっぱなしになりますのでリアルタイムにタイムラインが表示されると思います。 Web より速くでるときもあるみたいですね。 :D

これでたとえば、Ubuntu とかだと notify-send で簡単に画面に通知出せますので、画像ファイル取得とかちょこちょこつけると・・・

stream01

あっという間に通知クライアントのできあがり。 よい。

てなわけで oAuth はちょっと面倒ですが、それ以外は twitter4j と Groovy のおかげでとてもお手軽。 クライアントつくってみてはどうでしょう。

そういえば、オープンソースの twitter クライアントって、コンシューマーキーはどうしているんだろう・・・。

う。

初めての WebGL

ここ 1年くらいのブログを見返しているとずいぶん投稿数が減ったなぁ、と。 こうみえて昔は、毎日更新だったんですよ(笑) 原因は何かの途中経過を書かなくなったことだと思うのですが、それは新しいことをやっていない裏返しなのかも、ということで「初めての WebGL」。。

まずはお勉強でございます。 ちなみにわたくしは、3D とか全然分からないです(笑)

WebGL Lesson 1 – 三角形と四角形 – Hack The WebGL (WebGL勉強会)

ようこそ私の最初のWebGLチュートリアルへ!この最初のレッスンはNeHe OpenGLチュートリアルのNo.2をもとにしています。NeHe OpenGLチュートリアルはゲーム開発者向けの3Dグラフィックスの学習手段として人気です。
今回はWebページ上に三角形と四角形を出す方法を解説します。

大変参考になりますです。

まず分かったのは、WebGL は OpenGL 2.0 ES のラッパーであって OpenGL とは互換がないということです。 以前、ちょっと OpenGL をいじっていたのでそのまま移植できるかなと思ってたのですが、いわゆる固定シェーダがないのですね。

hiromasa.another :o )» Blog Archive » Java + LWJGL + OpenGL で 2D ゲーム

ということでとりだしてきました、 OpenGL の Java ラッパー LWJGL。 OpenGL で古き良き 2D 描画をなんとか再現してやろうかと奮闘中であります。

2.0 ES でレンダリングするには必ずバーテックスシェーダとフラグメントシェーダで描画する必要があるようです。 JavaScript の中に C like な記述が入るのはなかなか興味深い。

webgl01

というわけでいろいろふっとばしますが、なんとか豆腐とテクスチャの貼り付けまではいけました。 ソースはもうちょっと動いてからにしましょう。

 

オチなしのプレッシャー…。

Firefox 4.0 リリース!

結構前から Minefiled で beta を追っていていたのですが beta13 から RC1、2 を経ましてついに Firefox 4.0 がリリースされました。 :) 1.0 がでて喜んでいたのは 2005 年ですので月日が流れるのは早いものです。。

4.0 で最初にぱっと目を引くのは UI の変更で、Tab on Top とかメニューが左上に統合されたり、タブをピンで止めれるようになったりしています。

Linux 版。

firefox402

Windows 版。

firefox401

 

Windows のほうの beta はあまり見ていなかったのですが、途中でタブのデザインが変わったように思います。 正式版いれたときあれ?って思いました。 :)

Ubuntu 10.10 は Firefox 3.5 系なので 4.0 を使うには stable の PPA を入れると良いと思います。

Nattyまで待てない!Ubuntuで今すぐFirefox4.0を使う

さて、我らがUbuntuでは、現行版の10.10Maverickでは残念ながらアップデートが入ってきていません。せっかく高速に便利になったFirefox 4.0が使えないのはもったいないので、10.10でもFirefox 4.0を使えるようにしました。

非常に参考になります!

何度かこのブログでも取り上げていました、新機能の WebGL についてですが、Linux 版については残念ながら NVIDIA プロプライエタリ ドライバ以外はブラックリスト入りの対応になったようです。

しかるに NVIDIA 以外のカードではいじらずには WebGL 表示できません。 無念。 beta の途中までは Intel とかでも動いていたのですが、バグが多かった模様です。

Windows に関しては Intel 内蔵とかでも動くようなので遊んでみると良いかもしれません。

WebGL Experiments

WebGL is a new web technology that brings hardware-accelerated 3D graphics to the browser without installing additional software.To try these WebGL experiments with Google Chrome, please download and install it below.

基本 Chrome デモ用ですがこちらのサイトに続々新作が追加されています。

firefox403

少しインターネットを検索していると、初音ミクさんが踊りだしたりしていました。 面白いのができる予感。 ぼくも空間系のサイトを何かやってみたいなと思っているのですが、OpenGL 勉強しないとですね。

…。 やべっ。

無理矢理のオチ。。。 (IE8 ではでませんな