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

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

= 進捗報告 (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/>))

= スクリーンショット

* ((<GImageView|URL:http://web.sfc.keio.ac.jp/~sakai/cygwin/screenshots/2.jpeg>))
* ((<Nautilus|URL:http://web.sfc.keio.ac.jp/~sakai/cygwin/screenshots/nautilus.jpeg>))

= 移植作業

* 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倍使うための本  邪道編