Today アクセスカウンター Yesterday アクセスカウンター

ホワット・ア・ワンダフル・ワールド

私は知識に何ものかを付け加え,また他の人々がより多くのものを付け加える手助けをした --- G.H.ハーディ

全記事一覧 << 2008/07 12345678910111213141516171819202122232425262728293031 2008/09 >>

プロフィール

あろは (alohakun)

  • Author:あろは (alohakun)
  • 若槻俊宏 (WAKATSUKI toshihiro)

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun

    abstract

    プログラミングという人間の知的行為を体系化し,単なる職人芸ではなく,サイエンスにするための研究をしています.

    具体的には,等価変換計算モデルに基づいた,仕様記述からのプログラム合成の研究をしています.

    もっと噛み砕くと,プログラムの正しさをどのように定式化し,どのような枠組みで,どのように変換を進めていけば,正しさを保証したまま,効率的なプログラムを手に入れることができるのか,ということについて研究しています.

    キーワード : equivalent transformation, computation model, programming paradigm, formal specification, program synthesis













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map









    FC2 BLOG RANKING

FC2カウンター

ブロとも申請フォーム

この人とブロともになる

ホーム

Debian の GRE (Gecko Runtime Environment) ってどこにあるの… ?

2007/08/07(火) 01:24:26

今日のゴミ.Debian で,どこの libxpcom.so を読み込ませればよいのかわからなかった… もう何時間を無駄にしたことやら.

GRE

動的ライブラリに直リンしないで GRE_GetGREPathWithProperties() 使えって話だけど,そもそも情報が無さ過ぎてよくわからんのう.

xulrunner を起動すると…

$ xulrunner --find-gre 1.8.0.1
/usr/lib/xulrunner/libxpcom.so

とかなるから,これかと思ったんだけど,ぜんぜん違うみたい.SEGV っちゃう.


//g++ -g -I/usr/include/iceape -I/usr/include/nspr test.cpp -lxpcomglue

// library memo
// /usr/include/nss : Network Security Services
// /usr/include/nspr : NetScape Portable Runtime
#include <xpcom-config.h>
#define XPCOM_GLUE 1

#include <stdio.h>
#include <nsEmbedAPI.h>
#include <nsILocalFile.h>
#include <nsCOMPtr.h>
#include <nsStringAPI.h>
#include <nsXPCOMGlue.h>
int main() {
// Gecko Runtime Environment (GRE) の起動
nsresult rv = XPCOMGlueStartup("/usr/lib/xulrunner/libxpcom.so");
if(NS_FAILED(rv)) {
fprintf(stderr, "Fail : XPCOMGlueStartup().\n");
return rv;
}
nsCOMPtr<nsILocalFile> gredir;
rv = NS_NewNativeLocalFile(nsCString("/usr/lib/xulrunner/"), PR_FALSE, getter_AddRefs(gredir));
if(NS_FAILED(rv)) {
fprintf(stderr, "Fail : NS_NewNativeLocalFile().\n");
return rv;
}
/* EmbedAPI.o が必要らしい…
rv = NS_InitEmbedding(gredir, nsnull);
if(NS_FAILED(rv)) {
fprintf(stderr, "Fail : NS_InitEmbedding().\n");
return rv;
}

// GRE の停止
rv = NS_TermEmbedding();
if(NS_FAILED(rv)) {
fprintf(stderr, "Fail : NS_TermEmvedding().\n");
return rv;
}
*/
rv = XPCOMGlueShutdown();
if(NS_FAILED(rv)) {
fprintf(stderr, "Fail : XPCOMGlueShutdown().\n");
return rv;
}
return 0;
}


あと,もしかして,NS_InitEmbedding/NS_TermEmbedding って,Debian の開発パッケージ (libxul-dev とか) に含まれてない… ? 結局 mozilla 自前でビルドしないと駄目なのかなぁ.とんでもないデカさだから,面倒なんだけど.

■ エンベッディングライブラリの初期化

エンベッディングライブラリの初期化/終了には、

nsresult NS_InitEmbedding(nsILocalFile *mozBinDirectory, nsIDirectoryServiceProvider *appFileLocProvider);
nsresult NS_TermEmbedding();

を使用します。

定義は、nsEmbedAPI.h、実体は、EmbedAPI.o、EmbedAPIDebug.o にあります。モジラ本体のデフォルトビルドでは生成されないので、本体ビルド後に自分で、

mozilla/embedding/base/macbuild/EmbedAPI.mcp

にてビルドします。

Gecko Embedding を動かすだけで,エライ大変だ.とりあえず XPCOM 単体 (stand alone 版)の使いかたを覚える方が良さそうだなぁ… ns が絡んでくると一気に面倒になってくるから.
mozilla/xpcomTB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

gtkmozembed の最小サンプル

2007/08/06(月) 04:24:14

すいません,何のパッケージを入れたらヘッダとライブラリがインストールされたのか把握してません.気がついたら入ってました.

# libgtk-mozembed-ruby/mozilla-dev あたりが非常に濃厚です (もしかしたら,Gecko の開発パッケージ libxul-dev/libxul0d とかかも).

ウェブ上の情報は全て古くなっている (ここ最近,mozilla → firefox → iceweasel と,Debian のパッケージ名や分割ポリシーが変わりまくりのため) ので,気合いで自分の環境のヘッダやライブラリの位置を探してください !

とりあえず,うちの環境では,以下のソースでコンパイル & 実行が可能でした.まさかgtkmozembed.h が /usr/include/iceape なんていう謎のパッケージ階層の下にあったとは… ライブラリも,/usr/lib/libgtkembedmoz.so とか微妙に命名規則がぶれてたり…

// gcc `pkg-config gtk+-2.0 --cflags` -I/usr/include/iceape/gtkembedmoz testembedmoz.c `pkg-config gtk+-2.0 --libs` -lgtkembedmoz -lxpcom

#include<gtkmozembed.h>

int main(int argc, char **argv) {
gtk_init(&argc, &argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
GtkWidget* gtkmoz = gtk_moz_embed_new();
gtk_container_add(GTK_CONTAINER(window), gtkmoz);
gtk_widget_show_all(window);
gtk_moz_embed_load_url(GTK_MOZ_EMBED(gtkmoz), "http://www.google.co.jp/");
gtk_main();
}


これだけで,Gtk アプリケーションにそのまま埋め込み可能なブラウザができちゃいます.

$ gcc `pkg-config gtk+-2.0 --cflags` -I/usr/include/iceape/gtkembedmoz testembedmoz.c `pkg-config gtk+-2.0 --libs` -lgtkembedmoz -lxpcom
$ ./a.out

参考 URL (というか,まんま)




Gecko についての,たぶん日本語で唯一のまとまった文書の予感.

nominaまとめ

はじめての、タブブラウザ とか見てると,実は「逸般人」ってけっこう確立された言い回しだったりするのか ? とかおもた.

てか,GCC もそうなんだけど,どうしてこう XPCOM に XUL と,重厚なフレームワークを作り込みたがる人々ってのがいるのかね… いや,気持ちはよくわかるんだけど.

人間は無能になるまで出世するとかいう,ナンチャラの法則みたいに 「一定の成功と開発コミュニティを得たアプリケーションは,重すぎて動かなくなるまで成長し続ける」 という法則はある気がする.

そんなんだから,フレームワークのインストールのコストが高すぎる → デスクトップアプリは死んだ (Web アプリは依然低ユーザビリティのオモチャだけど,使えないよりはマシだから消去法で選ばれる),とかいう話になるんだよなぁ.Firefox や GCC を自前でビルドするってだけで,一気に敷居が高くなる気がする.

いや,TCC は TCC で,構文木作らないからコードジェネレート以外の応用が全く効かなかったり,w3m は DOM 使ってないからほぼ総入れ替えしないと JavaScript に対応できなかったりとかするんだけど.

もうちょっとこう,各部品の切り分けと結合を容易にして,毎回毎回作り捨てるぐらいの気軽さの方が良い気がするんだよなぁ.汎用性を求めると,絶対バッドノウハウの塊化していくし,結局行き過ぎた抽象化とポータビリティを得るための努力は,全ての環境で平凡以下にしか動かない (ので,結局ネイティブアプリケーションには勝てない)というとになりがちだし.それぐらいだったら,完全に汎用性を切り捨てて,各プラットフォームの機能を生かせるだけ活かして,コードの短さを追求した方が良いような気もする.

こういう,完璧超人たちによって作りこまれているフレームワークってのは,あんまりハッカーごのみでは無いという話 ? GCC とか Mozilla とか,まともに開発に参加できるようになるまでに何年かかることやら…

そのレベルになるまで開発に参加できないよりも,w3m とか ruby とか php みたいに,みんなでワイワイ実装のグダグダさに口出してみたり,テキトーに弄ったり改造したりできるようなのが 「俺ってばスゲー」 感を煽れるので OSS 向けというのは,まさしくその通りというか.BSD よりも Linux が成功したのも,そういうアレなのかもしれぬ.

てか,軽量を目指すウェブブラウザには,イベントドリブンとか GUI とか要らないよ (暴言) どうせ大半はボタン押して反応帰ってくる世界なんだから,綺麗な紙芝居で良い.本当に HTML の DOM 化とレンダリングだけアレしてくれるようなナニがあれば良いのに.コンソールアプリケーションで.gecko-ncursus とか (無理げ)
mozilla/xpcomTB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

Ruby の Gtk::MozEmbed バインディング

2007/08/05(日) 03:04:20

Mozilla のレイアウトエンジン Gecko をアプリケーションに組み込むにはどないすりゃーいいんじゃと思っていたら,こんなの発見.

ままならない日記 2007-06-05 ■[Ruby][Gnome]Gtk::MozEmbed 20:23

これはGeckoエンジンをGUIコーポーネントとして使うためのライブラリです。とてつもなく便利です。試しに適当なコードを書いてみたところ、69行でブラウザが書けました。

てなわけで,リンク先のサンプルコードを実行してみたら,本当にちゃんと動いてちょっと感動.

# apt-get install libgtk2-ruby libgtk-mozembed-ruby
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
以下の特別パッケージがインストールされます:
libatk1-ruby libcairo-ruby libcairo-ruby1.8 libgdk-pixbuf2-ruby
libglib2-ruby libpango1-ruby
以下のパッケージが新たにインストールされます:
libatk1-ruby libcairo-ruby libcairo-ruby1.8 libgdk-pixbuf2-ruby
libglib2-ruby libgtk2-ruby libpango1-ruby libgtk-mozembed-ruby

$ ruby testgtkmozembed.rb

ほえー Gecko 使ってるから当たり前 (?) なのかもしれないけど,こんだけのコードで,Google Map とかも普通に動くブラウザができるってのはスゴいな.

testlibgtkmozembedruby070805.png


C から直接使う場合には GtkMozEmbed を使えば良いのか.たぶん geleon とかは,これ使ってるのかなぁ…

gecko 自体は Gtk に依存してないはずだから,フレームバッファとか,端末の中で気軽に DHTML (CSS + JavaScript + HTML) 表示とかできたらいいのになぁ… EmacsEmbed とか無いのかね (無茶) そしたら,w3m-gecko.el とかができて,EmacsLisp でブラウザを拡張できたりして,みんな幸せになれる気が.

とりあえず,ずっと放置している shiki に GtkMozEmbed を組み込んで,Scheme でウェブブラウザを書いたり拡張したりできるようにしたい,というのが当面の目標 (予定は未定)




というか,mozembed ってのは,その名の通り,Mozilla を Gtk に埋め込んだ (Gtk から使えるようにした) だけなのか.そりゃ,mozilla でできることは全てできて当たり前だよなぁ…




最低限だったら,これだけでいいんだもんなぁ (リンク先のコードを削っただけです).


#!/usr/bin/env ruby
require "gtkmozembed"

class Browser < Gtk::Window
def initialize
super
moz = Gtk::MozEmbed.new
self.add(moz)
self.signal_connect("delete_event") do
Gtk.main_quit
end
moz.location = "http://www.google.co.jp/"
self.resize(900, 700)
self.show_all
end
end

Gtk.init
Browser.new
Gtk.main


go_back と go_forward が付けば,それなりに実用にもなる.


class Browser < Gtk::Window
def initialize
super
moz = Gtk::MozEmbed.new
bar = Gtk::Toolbar.new
bar.append(Gtk::Stock::GO_BACK) { moz.go_back }
bar.append(Gtk::Stock::GO_FORWARD) { moz.go_forward }
box = Gtk::VBox.new
box.pack_start(bar, false)
box.pack_start(moz)
self.add(box)
self.signal_connect("delete_event") do
Gtk.main_quit
end
moz.location = "http://www.google.co.jp/"
self.resize(900, 700)
self.show_all
end
end

mozilla/xpcomTB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

最近のコメント

リンク

このブログをリンクに追加する

最近のトラックバック

人生の残り日数

日本人男性の平均寿命は 28700日.

RSSフィード

カテゴリー