トップ «前の日記(2002-02-10) 最新 次の日記(2002-02-12)» 月表示 編集

日々の流転


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ってポート番号は適当ね。)

Tags: ruby gimp
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してくれました。残念ながら次のリリースは未定との事ですが。

Tags: ruby
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が必要な場所に文字列以外も指定できるようにすべきだろうか? 欝だ。

Tags: gimp

λ. GIMP 1.3.3

む。

Tags: gimp

λ. ツッコミメールの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が含んでいたので焦った。

Tags: tDiary

λ. 文法の誤解

文法について誤解していたことに気が付いて超ショック。具体的には以下のような記述をしまくっていた。

Tags: tDiary
サブタイトル[改行]
 以下のパッチを当ててちょ。[改行]
<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><%

λ. 天国に涙はいらない

娘々日記(仮)天仙娘々さんにツッコミをもらった。

「天国に涙はいらない」の路線がどこまで続くかは興味のあるところではあるけど、佐藤ケイは別のシリーズを書くつもりはないのかなぁ。

Tags:

λ.

例の恐怖のメールが届く夢を見た。

本日のツッコミ(全6件) [ツッコミを入れる]
ψ ただただし (2002-02-11 19:06)

うーん、いちおう悩んだ上での仕様なのです……

ψ さかい (2002-02-11 20:12)

仕様を変更してくれなんて言うつもりはないので御心配無く。(^^;;<br>今の段落の文法には納得してるっす。

ψ いっちー (2002-02-13 19:08)

何で GIMP_PDB_FLOAT じゃねーの?って developer-ML に聞いてみては?<br>あ、話しはずれるけど、Gimp-1.0.0 の頃って、SF-ADJUSTMENT とか <br>SF-STRING とかは無かったみたいですね。んで、SF-VALUE で全て<br>まかなっていたという恐ろしい事実がさっき分かった。SF-VALUE は<br>配列とかリストとかも直に受け渡しできるからたま〜に、使うときが<br>あるかな? Ruby-Gimp もリストを受け入れているの?

ψ さかい (2002-02-14 15:27)

訊いてみますね。<br>それから、リスト等のはそもそもScript-Fuから外に持ち出すことが出来ないっす。詳しくはsiod-wrapper.cのmarshall_proc_db_call()辺りを参照。

ψ いっちー (2002-02-15 09:13)

そーすは読んでもよくわからないけど (LIST がないということ?)、script-fu-grid-system があったのでそうなのかと…<br>あれ?このスクリプト、gimp-undo-push-group がコメントアウトされてませんか? あと、先頭で symbol-bound? している理由も気になる…

ψ さかい (2002-02-15 15:47)

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?は何でだろう……