fu 入門


なんかえらそーに. 入門なんだーぜー. みたいな. ぐはは.

つうか, これは本ものの入門じゃあないんだよね. じゃあなにかというと, Mike Terry の黒帯道場を補完する記事なのですよ. いや, まじで scheme の入門記事を書けるほど解ってたら, こんなところで しょうもない記事書いてないって.

語源

というのか? script-fu って変な名前だなあ, と思っていたので, 質問してみたら, kung-fu が語源だそうで. 「カンフー!」「スクリプトフー!」 みたいな感じですか? ちょっと想像つかんが. 馬歩タントウ(漢字出ねえ) とかを 3ヵ月, みたいにして, 最初の一ヵ月は car しか使わない, みたいな修行なのかね. 何言ってるのか解らん? さては「拳児」を読んでないな! ダメだー! 読んでない奴は, ただちに全巻通して読むべし!
(Wilber)「李老師, なぜですか? 機能があまりにも違いすぎる!」
(李書文)「これが script-fu だ」
(Wilber)「script-fu .....」
(李書文)「他人が drag したり click したり , 毎日あらゆるマウスでカチカチをやっている間に, 絶対的な script-fu を養うんだ」
-中略-
(Wilber)「ただ一つの関数を三年間も....」
(李書文)「wilber よ. 古人は 千招(多くの関数)を知るものをおそれず. 一招(一つの関数)に熟練するものをおそれよ といった. まさにこのことを言っているのだ」

-中略-

(先輩)「いったい, 今までどうしていたんだ?」
(李書文)「car, cdr, cons .....」
(先輩)「これまでずっとか?」
(李書文)「はい」
(先輩)「わしらはおまえが来なくなってからずいぶんと scheme の関数を習ったがのう.」
(李書文)「糖衣構文をですか?」
(先輩)「その増上慢, もう許せん!! while 文が糖衣構文かどうか, eval してみようではないか!!」

李書文の GIMP の script-fu のすごさは, やがて Internet に広まり, 多くの hacker がソースを求めた. しかし, 李書文は一度として bug を出すことなく いつしか 「wizard 李書文」 と呼ばれるようになった.

どうじゃ. おもしろそうじゃろう(若干脚色してある). ただちに読むのじゃ. むふー. 中国武術は偉くなっても黒帯とは何の関係もないが, あっちの人はそんなの区別つかないわけで, なんでも格闘技の達人は黒帯 つうか black belt だから, どうも「Mike Terry の黒帯道場」 なのらしい. ちなみに, car, cons, cdr ばっかり修行しても script-fu を書けるようには ならんような気がする. それから, 関数は沢山知っている方が良いかも.

なんか長い前フリですまん. えー. まずですね. LISP 系は一行も書いたことねえ, emacs-lisp なんかも, まるきり暗号と同じです. っつう人は, GUM すなわち Gimp Users Manual の Mike Terry の Script-fu 黒帯道場 を先に読んでくれっす. そして, その記事を 4/5 くらい読んでくれ. script-fu-register という関数が紹介されているところまでだ. わしはそこで書き始めてしまったので, 残りを読んでないのじゃが.

そうだなあ. あと, GIMP を使った経験があるていど無いと, 厳しいかも. つうのは, 何ができるかわかんないでは, 書きたいプログラムも 思い浮かばないでしょう. だから, 全く未経験者ってひとには申し訳ないが, baby please come back, maybe next week みたいな.

そんなわけで, あるていど GIMP の経験がある人向けの, ポスト 黒帯道場. みたいな記事がコレだ.

あらゆる car

script-fu を書く上で, 最初にコケると言われているのがこれです. ポーランド記法とか (((((()))))) とか, LISP 系で言われるアレなところなんか, そんなのこれに比べりゃどうってことないって. まじで. まず, DB ブラウザを起動してくれ. [ToolBox]/Xtns/DB Browser.. だ. これで, script-fu で使える描画関数の仕様が全部みれるのだ. 例えば, 新しい画像を作る関数が gimp-image-new だ. この関数を評価する (実行する) と, 戻って来る値は, 新規に作成された画像. ということになっておる.

ところが実際にはそうじゃないんだ. (いや, そうではあるんだけどね) たとえば,

   (set! img (gimp-image-new 100 100 0))
   (gimp-display-new img)
  

ふつうは, これで大丈夫だとおもうじゃないですか. emacs lisp なんかでも バッファを返す関数なんかがあったら, それをそのまま setq してオッケーでしょう. それからいったら, これで これで 100x100 の RGB 画像ができるはずではないですか. もしそうだったら, ここでそんなことを書くわけ無いんじゃよ. これをそのまま実行すると, wrong type argument でコケるんじゃよ. script-fu では

   (set! img (car (gimp-image-new 100 100 0)))
   (gimp-display-new img)

こう書かないとダメなのじゃ. もう, あらゆる car である. wrong type argument でエラーになり, どっかで gimp-hogefuga を使ってたら, まずこれを疑おう. この仕様が, 非常に直観に反しているので, 判っていてもつい間違えるんじゃ. そんなの俺だけか? とにかく, これはなんとかしていただきたいものです. こんなの俺にはとてもじゃないが, 直せません. ちなみに, hollywood branch じゃあ直っているようですが, ドキュメントを 見ただけで試してないので実際にどうなのか,までは判りません.

あと, これはどっちかというとドキュメントの問題なのじゃが, DB ブラウザで array と書いてあっても list だったり, 本当に array だったりするので, なんとかしてください. これも相当具合わるいです. array だと思って aref 使ったてエラーになったら, car 使ってみよう. つうか, そんな試行錯誤でデータ型を探るの止めたいんですけど.

汎用 scheme 関数

gimp-image-resize とかそういう関数ばっかりあっても, プログラムにならんがな. そんな関数ばっかり使ってたら, マウスでチコチコやってるのを 単に並べただけのものしか書けんがな. 文字列の操作とか, 数値演算とか, リストをアレしたり, 配列を ナニしたりする関数は, どうなっておるのかッ! とお嘆きの諸兄もおありでしょう.

俺は, とりあえず, それで, ソースを見に行ったんだ. 馬鹿だから. script-fu のソースに. 一応, あったね. いろんな関数の定義が. interp_slib* というファイルがそれである. でも, 俺はそれを見て関数の使い方が判る程は賢くねえから, 名前でソレと判るもの以外はお手上げだ, と思ったらありました. GUM の後ろの方に. 付録として 全部 (じつは全部じゃないようだが) 載ってます. 懇切丁寧に.

なんと, 逆sin とかそんなのもあるぜ. 何でもあるぜ(そりゃ言いすぎ). これでまともなプログラムが書けるようになったというものです. if も while もありますが, やっぱりここは cond と末尾再帰で 書きたいところじゃのう.

よくある希望

emacs のキーボードマクロみたいな感じで, 「記録スタート」 で, 一連の操作をマウスなんかで interactive に実行し, 「記録終了」とかやって, それを script-fu として書き出す. そいつを template にしてちょちょいと emacs でいじれば, 欲しい script-fu が簡単に完成する, とかいうのがあれば, ずいぶん書きやすくなると思うがどうか. もちろん, emacs は script-fu モードで動き, 関数名を DB システムから取得して補完する (すんません, よくわかってなくて 言ってます). とかいうハナシが LC2000 の宴会で出た.

その後の修行

あとは簡単です. じつは, scheme は良い感じの言語なんで, 書くのも簡単だし読むのも簡単だ. だから,あとは書くだけ. ただ, 上で述べたような予備知識が無いとハマるかもしれない. わしがハマったゆえ, わしのサイトに来る人にはハマってもらいたくないのじゃ.

そうそう. script-fu のインタプリタである extension-script-fu が コケてしまうことがよくあります. 変なコードを実行したら, 直ちに GIMPごと即死したりすることもあるが, 大抵の場合は script-fu インタプリタが終了してしまうくらいで助かる. 特に, 1.1 で追加された関数でコケると, わりとインタプリタも死ぬことが 多い.

といっても, script-fu インタプリタが無ければどうせ書けないわけだから, お手上げで, 結局 GIMP ごと再起動するのかというと, そういう必要はなくて, script-fu コンソールを出し, そこに

(extension-script-fu)
というのを入力すればいいのだ. これで script-fu インタプリタが復活するであろう. そして開発が続行できるであろう.

なーんていうようなことを

LC2000 で話したのだが, GIMP 使ったことの無いひとが 半分くらいいて, あんまり伝わってなかったかも. なんせ, 聴衆に script-fu 書いたことのある人はゼロ. 書こうと思ったことのあるひとが 2人という状況だったからのう. 李書文がどうしたとか, そんなことは喋ってない.