さかい::進捗報告::2003-05-08

進捗報告 (2003-05-08)

慶應義塾大学 総合政策学部 3年

酒井 政裕 <sakai at tom.sfc.keio.ac.jp>

進捗報告 (2003-05-08)

  • What is GNOME?
  • GNOME2のCygwinへの移植
  • ActiveScript

What is GNOME?

  • GNU Network Object Model Environment
  • 統合デスクトップ環境
  • gtk+を使ったGUI
  • CORBAに基づいたコンポーネント技術

gtk+を使ったGUI

gtk+

  • <URL:http://www.gtk.org/>
  • 元々Gimpのために作られたGUIツールキット
  • C言語で書かれている
  • 多くの言語向けのバインディングが存在

CORBAに基づいたコンポーネント技術

  • ORBit2
  • Bonobo Activation
  • Bonobo

すること

  1. GNOME2のCygwin への移植
  2. WindowsでIActiveScript周りに相当するものを実装

(1) Cygwinへの移植

基本的な作業は既にある程度終わっている。 (Nautilusも動く!!)

<URL:http://web.sfc.keio.ac.jp/~sakai/cygwin/>

移植作業

  • configure.inでAC_LIBTOOL_WIN32_DLLを呼び出す
  • libtoolのオプションに-no-undefinedを追加
  • Cygwin固有の変更
  • その他

AC_LIBTOOL_WIN32_DLL

DLLを作りたい場合は、AC_PROG_LIBTOOL/AM_PROG_LIBTOOLを呼び出す前に呼び出すことになっている。

-no-undefinedと両方指定しなくてはいけないのは冗長に思える。

-no-undefined

このオプションを指定すると、libtoolはすべてのシンボルが*.loファイルまたは-lで指定されるライブラリで定義されているとして振舞う。

ELFの*.so(shared object)ではこのような制約はないが、 Win32のPE-COFFのDLLは実行ファイルと同様に、 リンク時にすべてのシンボルが解決される必要がある。

-no-undefined (その2)

libtoolが自動的に検出してくれればこんなオプションは不要なのに……

<lxo> ideally libtool should go ahead and try to create a shared library on such systems, and fall back to a static library if the shared linking fails, but I'm not sure all such systems will actually give an error status, and not just create a broken shared library

Cygwin固有の変更

例: NTSec(NT Security)等を使用する設定になっていないと、UNIXのようなパーミッションを持てないので、パーミッションをチェックするようなコードが問題になる。

対処法:

  1. そのようなコードをCygwinでは無効化する
  2. NTSec等を利用できるか調べて、利用できるときだけチェックする

後者のコードは本家に取り込んでもらう際に説明するのが面倒なので、 とりあえず前者の方針で。

パッチのStatus (その1)

取り込まれた
libglade, GtkGLArea, librsvg, linc, libIDL, libwnck, startup-notification, metacity, ORBit2, bonobo-activation, libbonobo, gnome-vfs, libbonoboui, libgnome, libgnomeui, libgnomeprint, libgnomeprintui, eel, gal
部分的に取り込まれた
GConf, Nautilus

パッチのStatus (その2)

交渉中(?)
gnome-utils
送ったけどまだ反応がない (T_T)
audiofile, esound, gnome-themes, gnome-desktop, gnome-panel, gnome-session

パッチのStatus (その3)

残り
glib, atk, fontconfig, pango, gtk+, gtkmm, gtk-engines, gtk-thinice-engine, gail, libgnome, libsoup, at-spi, control-center, gtkhtml

今後の予定

既にだいぶパッチを取り込んでもらったので、 残りのパッチやまだパッチを作っていないパッケージについて作業する。

(2) ActiveScript

目標その2:

WindowsでのActiveScriptingに相当するものをGNOME2に実装する。

What is ActiveScript?

  • Windows Script Interfaces
  • スクリプティングのための汎用インターフェース
  • COMベース

対応関係

COM           | Bonobo/CORBA
---------------------------------
IUnknown      | Bonobo::Unknown
IDispatch     | (存在しない)
IActiveScript | (存在しない)

IUnknown / Bonobo::Unknown

  • リファレンスカウンタの管理
  • 他のインターフェースのクエリー

IUnknown

interface IUnknown
{
    typedef [unique] IUnknown *LPUNKNOWN;

    HRESULT QueryInterface( 
	  [in] REFIID riid,
	  [out, iid_id(riid)] void* ppvObject);
    ULONG AddRef();
    ULONG Release();
};

Bonobo:::Unknown

module Bonobo {
    interface Unknown {
	  void ref ();
	  void unref ();
	  Unknown queryInterface (in string repoid);
    };
};

IDispatch

汎用のインターフェース。スクリプト言語からは通常このインターフェースを使って、オブジェクトを操作する。

interface IDispatch : IUnknown
{
  ...

  HRESULT GetIDsOfNames(
    [in] REFIID riid,
    [in, size_is(cNames)] LPOLESTR *rgszNames,
    [in] UINT cNames,
    [in] LCID lcid,
    [out, size_is(cNames)] DISPID *rgDispId);

  HRESULT Invoke(
    [in] DISPID dispIdMember,
    [in] REFIID riid,
    [in] LCID lcid,
    [in] WORD wFlags,
    [in, out] DISPPARAMS *pDispParams,
    [out] VARIANT *pVarResult,
    [out] EXCEPINFO *pExcepInfo,
    [out] UINT *puArgErr);

    ...
}

IActiveScriptの基本的な使い方

  • IActiveScriptSiteを実装したオブジェクトを用意しておく
  • CoCreateInstanceでスクリプトエンジンを得る
  • IActiveScript::SetScriptSiteで、IActiveScriptSiteを実装したオブジェクトを、スクリプトエンジンにセット
  • トップレベルオブジェクトの名前をIActiveScript::AddNamedItemで追加。ここで追加した名前が参照されると、実行時にIActiveScriptSite::GetItemInfoが呼ばれる。
  • スクリプトのロード
    • IPersist*
    • IActiveScriptParse

今後の予定

Bonoboを介してRubyを使うコードを実験的に書いてみる予定。

参考文献

  • Rubyを256倍使うための本 邪道編
Last modified:2005/10/10 01:35:14
Keyword(s):
References: