ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

Script-Fuを作って、Gimp上で実際に動作させるまでの手順を解説してみる(1)

Monday, 26 February 2007 12:52 by sabro

 今回は、実際にScript-Fuを作り、Gimpで動作するところまでの手順を、一通り追ってみたい所存です (^_^) ちなみに、私は、Windows版のGimp2.2.13を使っているので、それ前提で読んでください。

じゃあ、せっかくなので、「rounded」なんて、キーワードを、イキナリ思いつくかい!という方は、Windowsのスタートメニューから、「すべてのプログラム → GTK+ Runtime Environment → Select Language」で、英語を選択して、Gimpを起動してください。メニューが英語化するので、「角を丸める」が「Rounded Rectangle」となっているのが分かるはずです。同様に、検索すると「選択領域をストローク描画」は「gimp_edit_stroke関数」で実行することが分かります。

2.Script-Fuを書く

Apiが分かったら、実際にScript-Fuを書きます。Script-Fuは、Schemeの関数になっている必要があるので、前回のエントリで書いたように、defineを使って、関数を作り、その中に、先ほど検索したApiを使って処理を書いていきます。

(define (script-fu-render-rounded-rectangle image drawable radius)
(script-fu-selection-rounded-rectangle image drawable radius 0)
(gimp-edit-stroke drawable)
)

1行目で、関数名と、引数を定義しています。imageは、現在編集中の画像、drawableは、現在編集中のレイヤー(+チャンネル)、radiusが角丸の半径を表す数値(%)です。imageとdrawableは、画像のメニューから、Script-Fuを実行する場合は、必ず引数に指定する必要があります(ツールボックスのメニューからの実行の場合は、いりません)。2行目では、先ほどの、プロシージャブラウザの、検索結果から引数を調べて、script-fu-selection-rounded-rectangle関数に渡しています。プロシージャブラウザでは、関数名の区切りは、アンダースコアですが、Script-Fu内では、ハイフンになっていることに注意してください。また、プロシージャブラウザの説明では、run_modeという引数がありますが、これを渡したところ、エラーになり、実際の関数を調べると、この引数は必要ないことが分かりました。謎です。gimp-edit-stroke関数も、同様の手順で引数を調べて、追加します。

これで完成・・・ではありません。実際に、この関数を実行すると、選択領域の角を丸めるところまでは行きますが、線引きがされません。Script-Fuで行った描画を、画面に反映するには、gimp-displays-flush関数を、呼び出す必要があります。

(define (script-fu-render-rounded-rectangle image drawable radius)
(script-fu-selection-rounded-rectangle image drawable radius 0)
(gimp-edit-stroke drawable)
(gimp-displays-flush)
)

これで、Script-Fuは、完成です。

Script-Fuが、完成したら、次は、Gimpへの登録をして、実際に動作させるわけですが、説明が長くなりそうなので、続きは次回のエントリで書くことにします。

Script-Fuを作って、Gimp上で実際に動作させるまでの手順を解説してみる(2)

Tags:   ,
Categories:   WebDesign
Actions:   Permalink | Comments (41) | Comment RSSRSS comment feed

Script-Fuを使うために最低限覚えるべきSchemeの文法

Sunday, 18 February 2007 15:54 by sabro

Schemeを、少しずつ勉強中。何とかScript-Fuを作れそうなところまで来たので、一度まとめておきます。

1.何はともあれ、()をつける

とにかく、ソースコードに「( )」が出てきます。ファイルから、画像をロードするだけで、以下みたいな感じになります。

(set! image (car (gimp-file-load 0 filename filename)))
2.前置記法

数式は、( 1 + 2 ) ではなく、( + 1 2 ) と書きます。
( 1 + 2 + 3 ) は、( + 1 2 3 ) 。
( 1 + 2 - 3 ) は、( - ( + 1 2 ) 3 ) です。

3.大域変数と局所変数

大域変数(グローバル変数)の宣言は、defineで行い、set!で値を代入します。 ただし、Script-Fuでは、変数宣言をとばして、いきなりset!を実行しても、変数を使えるようです。

(define x 1)1(print x)1(set! x 2)2(print x)2(set! y 3)3(print y)3

 局所変数(ローカル変数)は、(let* )で囲んで、宣言します。囲まれた領域以外で使用すると、エラーになります。(let* )内には、変数だけでなく、変数を使用する評価式も書いてしまいます。

「(let* ((変数1)(変数2)・・・)(評価式1)(評価式2))」

以下では、zという変数を初期値3で定義し、評価式はzそのものを返しています。(let* )の外で、zを使おうとすると、変数未定義エラーになります。

(let* ((z 3)) z)3(print z)ERROR: unbound variable (errobj z)
4.リスト、つまりは配列のようなもの

他の言語でいうところの配列は、Schemeではリストに当たります。()の前に、「’」を付けることで宣言できます。

'( 1 2 3 )'( 1 "two" 3 )  ←数値と文字列が混ざってもOK

リストから、値を取得するときは、「car」「cdr」を使います。「car」は、リストの先頭の要素を取得します。「cdr」を使うと、リストの先頭を除いた全ての要素を取得します。

(car '(1 2 3))1(cdr '(1 2 3))(2 3)

 いまいち使いにくい感じがしますが、関数型言語は、再帰処理を頻繁に利用するので、このような仕様になっているんだと思います。ちなみに、Gimpの関数は、全てリストを返すので、戻り値の取得は、たいていの場合、「car」を使う必要があります。

5.関数の定義

Schemeでは、変数と関数が同列で扱われます。なので、関数の宣言は、大域変数と同じくdefineで行います。以下では、引数「x,y」を足し算する関数「add」を宣言し、その関数を利用しています。

(define (add x y) (+ x y))(add 1 3)4

やれやれ、オブジェクト指向言語とは、マッタク違いますな( ̄~ ̄;)
参考サイトとしては、もうひとつのScheme入門がオススメです。
Tags:   , ,
Categories:   WebDesign
Actions:   Permalink | Comments (39) | Comment RSSRSS comment feed

Script-Fuに挑戦しよう

Monday, 12 February 2007 09:42 by sabro

今作ってる、エンコードツールは、HTMLエンコード、URLエンコード、Base64等、色々対応しているので、ボタンの数が多いです。このボタンは、同じ画像を元に作るのですが、表示される文字列が、それぞれ違っているので、結局、ボタンの数だけ、「テキスト挿入 → GIF形式で保存」という作業を行わないといけません。

1度の作業ということなら、これでもいいのですが、HTMLに表示してみて、気に入らなければ修正したいので、何度も元画像を変更して繰り返すことになります。

これがメンドイので、作業を自動化するため、Script-Fuに挑戦してみることにしました。Script-Fuとは、Gimpに組み込まれている、マクロ言語で、単純な作業の繰り返しを、スクリプト化することが出来ます。

とりあえず、今日は、さわりだけ調べてみたので、分かったことを以下に列挙しておきます。

1.Schemeという関数型言語で記述する

普段、.NETやJavaしか使わない自分には、関数型言語は難しそうです。Cのような手続き型言語とは、全く違うので注意が必要です。(Perl-FuやRuby-Fuなんてのもあるみたいです)

2.Gimpを操作するには、プロシージャブラウザの関数を使う

「ツールボックスのメニュー → 拡張 → プロシージャブラウザ」で、Script-Fuから使える関数の一覧が見れます。自分の環境では、849個ありました。

3.デバッグは、Script-Fuコンソールで

「ツールボックスのメニュー → 拡張 → Script-Fu → Script-Fuコンソールで、1命令だけ入力して、即実行可能な、コンソールが使えます。試しに「(print "Hello World")」と入力したら、「Hello World」が表示されました。

4.自分が作ったスクリプトをGimpに登録できる

自分が作ったスクリプトを、プロシージャブラウザや、メニュー項目に追加できるようです。

Tags:   ,
Categories:   WebDesign
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

フレームワークを使った開発は、なぜつまらないのか

Tuesday, 6 February 2007 15:49 by sabro

フレームワークを使った開発をしていて、なぜか気分が重い。開発は楽になっているはずなのに、心が晴れない。その理由を、今から明確に説明します。

説明を円滑に進めるために、まず、ここでいうフレームワークを以下のように定義しておきます。


ソースコードの品質を保つため、一定のルールを強制する枠組み。未熟なプログラマでも、ルールに従うことで、一定レベル以上のプログラムを作成できるようにするもの。ライブラリとフレームワークは、明確に区別する。

よく、ライブラリとフレームワークは混同されますが、ここでは、明確に区別します。必ず使う必要があるものがフレームワークで、使うかどうかの選択権が開発者にあるものが、ライブラリとします。

Strutsは、ほぼ純粋なフレームワークと見ていいでしょう。Jakarta Commonsのプロジェクト郡は、ライブラリです。

ここから、本題です。

まず、勘違いしないで頂きたいのが、特定の人にとっては、フレームワークを使った開発はとても楽しいということです。内部設計ができず、独力ではアプリケーション全体を開発できない人が、それに当たります。

フレームワークを使った開発を、つまらなく感じる人は、その逆です。内部設計ができて、標準APIだけで、アプリケーション全体が作成できる人が、それに当たります。

それでは、なぜ、後者の方たちの多くは、フレームワークを使った開発が、楽しくないのでしょうか?開発工数は、減っているにも関わらず・・・。

理由は、2つあります。

1つ目は、自己価値の喪失です。プログラム開発というのは、本来、一定レベル以上のスキルが要求され、誰にでも出来るものではありません。今まで、開発者は、プログラムを、自分の力で開発することで、自分の価値を見出すことが出来ました。しかし、フレームワークを使用した開発では、一定のルールさえ覚えてしまえば、スキルの低いプログラマでも開発できてしまいます。せっかくスキルを高めても、フレームワークを使う以上、それは特に必要とされません。「私が死んでも、代わりはいるもの」では、自分の生きている意味を見出せなくなってしまいます。

2つ目は、自己実現の阻害です。プログラミングは、とてもクリエイティブな仕事であると言えます。工夫次第で、生産性は何倍にもなるので、自然と成長を図りたいと思うようになります。その作業は、非常に創造的です。しかし、フレームワークを使用した開発では、「創造性=悪」になります。そこでは、プログラマの創造性は発揮されず、アプリケーションは、フレームワーク開発者の知識の中に収まったものになります。

 フレームワークを使用する場合は、まずプロジェクト人員のスキルを、見極めることが重要です。スキルの低い人員が多い場合、個人的には、人員への教育で乗り越えるべきだと思いますが、一定の品質を確保するため、フレームワークを適用するという選択もアリでしょう。

ただ、スキルのある人員に対して使用してしまうと、それは、プログラマの成長を止め、創造性を奪う結果になることは、覚えておかなくてはなりません。

Categories:   Architecture
Actions:   Permalink | Comments (51) | Comment RSSRSS comment feed