[ruby-gnome2-doc-cvs] [Hiki] create - gconf2-tut

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2003年 9月 21日 (日) 03:45:57 JST


-------------------------
REMOTE_ADDR = 218.231.205.39
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/ja/?gconf2-tut
-------------------------
= Ruby/GConf2チュートリアル
Ruby/GConfって何者かというと、要はアプリケーションの設定ファイルなんかを保存・読み出ししたりするためのライブラリだ。
データを保存・読込するだけではなく、ロックとかも勝手にやってくれるし、変更がかかるとイベントをあげたりもできる。かなり高機能なくせして使う方はメチャクチャ簡単というすばらしーライブラリだ。ほれぼれ。

詳しくは((<岡さんのGConf日本語訳|URL:http://www.globe.to/~oka326/archive/gnome/gconf/doc/index.html>))を見てね。

== ともかく、まずは使ってみる

 require 'gconf2'
 client = GConf::Client.new
  
 #データの読込
 p client["/apps/hoge/stage"]
 p client["/apps/hoge/name"]
   
 #データの書込
 client["/apps/hoge/stage"] = 1
 client["/apps/hoge/name"] = ARGV[0]

上記をtest.rbとして保存して、何回か実行してみよう。

 $ruby test.rb "hoge"
 $ruby test.rb "fuga"

この例ではわざと読込を先にやっているので1度目はnilが出力されるけど、2度目以降に実行したときは1, hogeが、次はfugaが出力される。
たったこれだけで永続的にデータを保存・読み出しできるってすごいっ!

ちなみに、データ自体はユーザ単位にgconfdというデーモンが管理していて、
非同期で$HOME/.gconf/apps/hoge/%gconf.xmlというファイルにXML形式で書き込まれる。
あ、そうそう、この場合、"/apps/hoge/stage", "/apps/hoge/name"がそれぞれキー項目になる。
データには基本的な型(String, 数値, true/false, 前記の配列)しかサポートしていないけど、設定情報としては十分でしょう。

== 変更の通知
GConfの大きな特徴の一つとして、設定値に変更があった場合にそのことをイベントとして通知することができる。しかも、同じユーザであれば、この通知は別プロセスに対しても有効だ。

具体的には以下のようなコードを書く。

 require 'gconf2'
 require 'gtk2'
 
 client = GConf::Client.new
 client.add_dir("/apps/hoge")
 client.notify_add("/apps/hoge/name") do |client, entry|
   p entry.value
 end
 
 Gtk.main

* GConf::Client#add_dirで「あるディレクトリ」以降のキーを監視する
* GConf::notify_addで"/apps/hoge/name"というキーに変更が起きたときのイベントをブロックとして渡す
* GConf::Entry#valueで値を出力する

としている。最後のGtk.mainだけど、GConf::notify_addがGTK+のイベント機構を利用しているのでGUIは使ってないのだけど必要というわけ。

んでもって、これをtest2.rbとでも保存して起動しておき、先ほどのtest.rbを実行してみると、情報が表示される。

すばらしい。

ちなみに、これでチャットプログラムができるんじゃないかとちょっとわくわくしたんだけど、実はgconfdがユーザ単位なので、そういった用途には向かないのでした。

かわりに、これを使って((<gconfclock|en:gconfclock>))というのを作ってみたので試してみてね。

=== ChangeLog
:2003-06-19 ((<むとう>))
 Initial release





ruby-gnome2-cvs メーリングリストの案内
Back to archive index