2002-02-11 [長年日記]
λ. 外部からGimpの機能を利用する
kjanaさんのツッコミにある[ruby-talk 33423]ですが、実際のところ、外部からGimpの機能を利用することは考えてなかったからあまりスマートな方法がないんだよなぁ。(ちなみにGimp-Perlなんかはちゃんとその辺りを考えてあるっぽい)
やるとしたら、Gimp側でdRubyのサーバを起動しておいて、そいつを利用するくらいかなぁ。dRubyのサーバは、メニューの <Toolbox>/Xtns/Ruby-Fu/dRuby Server/Start... から起動できる。自動的に起動するなら、gimp --no-interface --batch '(ruby-fu-druby-server 1 "druby://:7950" "")' とかすれば良い。
それで、あとは以下のようなコードを実行すると。(あ、7950ってポート番号は適当ね。)
require 'gimp/base' require 'drb/drb' DRb.start_service(nil, nil) g = DRbObject.new(nil, 'druby://7950') width = 100 height = 100 old_fg = g.gimp_palette_get_foreground old_bg = g.gimp_palette_get_background img = g.gimp_image_new(width, height, Gimp::RGB) begin img.undo_disable d = g.gimp_layer_new(img, width, height, Gimp::RGBA_IMAGE, "Background", 100, Gimp::NORMAL_MODE) img.add_layer(d, -1) g.gimp_palette_set_background(Gimp::Color.new(255,255,255)) g.gimp_edit_fill(d, Gimp::BG_IMAGE_FILL) d = g.gimp_layer_new(img, width, height, Gimp::RGBA_IMAGE, "BoxLayer", 100, Gimp::NORMAL_MODE) img.add_layer(d, -1) g.gimp_drawable_fill(d, Gimp::TRANS_IMAGE_FILL) g.gimp_rect_select(img, width/4, height/4, width/2, height/2, Gimp::ADD, false, 0) g.gimp_palette_set_foreground(Gimp::Color.new(0,0,255)) g.gimp_bucket_fill(d, Gimp::FG_BUCKET_FILL, Gimp::NORMAL_MODE, 100, 0, false, 0, 0) g.gimp_selection_none(img) g.script_fu_drop_shadow(Gimp::RUN_NONINTERACTIVE, img, d, "8", "8", "5.0", Gimp::Color.new(0,0,0), "70", true) img.active_layer = d g.gimp_palette_set_foreground(Gimp::Color.new(255, 0, 0)) d = g.gimp_text_fontname(img, nil, width/4, height/4, "Ruby!", 0, true, 15, Gimp::PIXELS, "-adobe-utopia-medium-r-normal-*-*-*-*-*-p-*-*") img.flatten filename = '/foo/bar.bmp' g.file_bmp_save(Gimp::RUN_NONINTERACTIVE, img, img.active_drawable, filename, filename) ensure img.delete g.gimp_palette_set_background(old_bg) g.gimp_palette_set_foreground(old_fg) end
λ. drbでのid
で、久しぶりにGimp-Rubyを触っていて、drbのパッチを送るの忘れてた事を思い出した。Gimp-Rubyではidメソッドをオーバーライドしているので、このパッチを当てないと発狂するはず。
咳さんにメールしたら、速攻でCVSにcommitしてくれました。残念ながら次のリリースは未定との事ですが。
diff -urN drb-1.3.4.2.orig/lib/drb/drb.rb drb-1.3.4.2/lib/drb/drb.rb --- drb-1.3.4.2.orig/lib/drb/drb.rb Tue Dec 11 17:23:53 2001 +++ drb-1.3.4.2/lib/drb/drb.rb Mon Feb 11 12:56:37 2002 @@ -24,7 +24,7 @@ end def to_id(obj) - obj.nil? ? nil : obj.id + obj.nil? ? nil : obj.__id__ end end @@ -386,7 +386,7 @@ end def to_id(obj) - return nil if obj.id == front.id + return nil if obj.__id__ == front.__id__ @idconv.to_id(obj) end
λ. SF-ADJUSTMENT
上のコードで、script_fu_drop_shadowを呼び出して初めて気がついたのだけど、SF-ADJUSTMENTはGIMP_PDB_STRINGにマップされてるのね。(gimpのplug-ins/script-fu/script-fu-scripts.c参照) てっきりGIMP_PDB_FLOATだと思っていたぞー。(だから、Ruby-FuでもGIMP_PDB_FLOATにマップしてある) 信じられない!! つーかScript-Fu作った奴は誰だ? いったい何考えてるんだ?
う〜む。Gimp-Ruby側で、GIMP_PDB_STRINGが必要な場所に文字列以外も指定できるようにすべきだろうか? 欝だ。
λ. GIMP 1.3.3
む。
λ. 読書
- 『天国に涙はいらない 4 - 男色一代男』
- 『天国に涙はいらない 5 - 逝き女五枚羽子板』
- 佐藤ケイ[著] さがのあおい[イラスト]
λ. ツッコミメールのMessage-ID
あれ、Message-IDに@mail_headerが入るようになったのか。2002.02.07のtdiary.rb: correct message_id. thanks woods <sodium@da2.so-net.ne.jp>
で仕様が変更になったのかな。Message-IDに使えない文字を@mail_headerが含んでいたので焦った。
λ. 文法の誤解
文法について誤解していたことに気が付いて超ショック。具体的には以下のような記述をしまくっていた。
サブタイトル[改行] 以下のパッチを当ててちょ。[改行] <blockquote><pre>[改行] 〜パッチ〜[改行] </pre></blockquote>[改行]
λ. 直すの面倒だなぁ。上の例で、<blockquote><pre>の前に機械的に改行をもう一つ入れると、以降のセクション番号がずれてしまって、まずい事になるし。となると、「以下のパッチを当ててちょ。」の部分を含めて整形済みにするしかないか……
λ. もし以下のようになっていたらもっと早くに気が付いただろうに。くそぅ。悔しい。
--- tdiary/skel/diary.rhtml~ Thu Jan 24 23:51:29 2002 +++ tdiary/skel/diary.rhtml Mon Feb 11 16:42:38 2002 @@ -9,7 +9,7 @@ if paragraph.subtitle then %> <h3 class="subtitle"><a <% if opt['anchor'] then %>name="p<%= '%02d' % idx %>" <% end %>href="<%= opt['index'] %>?date=<%= @date.strftime( '%Y%m%d' ) %>#p<%= '%02d' % idx %>"><%= opt['paragraph_anchor'] %></a> <% if opt['multi_user'] and paragraph.author then %>[<%= paragraph.author %>]<% end %><%= paragraph.subtitle %></h3><% end - if /^</ =~ paragraph.body then %> + if /\A</ =~ paragraph.body then %> <%= paragraph.body %><% elsif paragraph.subtitle %> <p><%= paragraph.body.collect{|l|l.chomp}.join( "</p>\n<p>" ) %></p><%
λ. 天国に涙はいらない
「天国に涙はいらない」の路線がどこまで続くかは興味のあるところではあるけど、佐藤ケイは別のシリーズを書くつもりはないのかなぁ。
うーん、いちおう悩んだ上での仕様なのです……
仕様を変更してくれなんて言うつもりはないので御心配無く。(^^;;<br>今の段落の文法には納得してるっす。
何で GIMP_PDB_FLOAT じゃねーの?って developer-ML に聞いてみては?<br>あ、話しはずれるけど、Gimp-1.0.0 の頃って、SF-ADJUSTMENT とか <br>SF-STRING とかは無かったみたいですね。んで、SF-VALUE で全て<br>まかなっていたという恐ろしい事実がさっき分かった。SF-VALUE は<br>配列とかリストとかも直に受け渡しできるからたま〜に、使うときが<br>あるかな? Ruby-Gimp もリストを受け入れているの?
訊いてみますね。<br>それから、リスト等のはそもそもScript-Fuから外に持ち出すことが出来ないっす。詳しくはsiod-wrapper.cのmarshall_proc_db_call()辺りを参照。
そーすは読んでもよくわからないけど (LIST がないということ?)、script-fu-grid-system があったのでそうなのかと…<br>あれ?このスクリプト、gimp-undo-push-group がコメントアウトされてませんか? あと、先頭で symbol-bound? している理由も気になる…
Script-Fuのスクリプトからscript-fu-grid-systemのような関数を呼び出すときに、リストをそのまま渡せるのは、Script-Fu内で処理が完結していて間にPDBが介在しないからです。<br><br> 次にPDBが介在する場合。PDBにはリスト一般を扱うための型はないので、SF-VALUEな引数はPDBにはGIMP_PDB_STRINGとして登録されます。<br> そのため、外部からscript-fu-grid-systemのような関数を呼び出すときには"'(1 g 1)"のように文字列として指定することになってます。(指定された文字列が何とそのままevalされる……)<br> 逆に、このような文字列を受け取る関数を外部で実装すれば、Script-Fuからリストを受け入れることが出来そうに思えるけど、Script-Fu(のmarshall_proc_db_call)はリストから文字列に変換してくれなくて、単に文字列以外を弾いてしまうので、それは無理です。<br><br>gimp-undo-push-groupとsymbol-bound?は何でだろう……