|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Emacs で Script-Fu を書いて実行させる / script-fu-shell.rb

環境: Ubuntu Studio 9.04 / Gimp 2.6.6 / Ruby 1.8.7 / Emacs 23.0.91.1

ダウンロード

ここからダウンロードして適当なところに置いてください。
http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb
sonota's script-fu-shell at master - GitHub

script-fu-shell.rb を単体で動かしてみる

Gimp を起動し、メニューから [フィルタ > Script-Fu > サーバスタート]
(Gimp のバージョンによってメニュー位置が違います)

「サーバスタート」をクリックしてサーバを開始させます。

端末で
$ ruby script-fu-shell.rb
と実行するとプロンプトが表示され、 Gimp本体の Script-Fu コンソールを使うのと同じ要領で S式を書くと 対話的に実行されます。

たとえばプロンプトに続けて
(gimp-display-new (car (gimp-image-new 640 480 0)))
と入力しエンターキーを押すと、Gimp側で新規画像が表示されます。

Emacs から使う

手軽に試してみる

Emacs には最初から cmuscheme という Scheme用の便利なライブラリが付属しており、 これをそのまま利用することができます。

まず手軽に試してみたいという場合は scratch バッファで
(setq scheme-program-name "~/test/script-fu-shell.rb")
などと書いて C-xC-e で評価し「Scheme インタプリタとして script-fu-shell.rb を使う」ように設定します。

次に M-x run-scheme すると、Script-Fu用のバッファが開きプロンプトが表示されます。 適当に S式を入力して試してみてください。

プロンプトの位置にカーソルを置いて M-p, M-n で履歴を前後に辿れます。

スポンサーサイト

Script-Fu メモ

メモ。

コーディング

新旧の違いなど

2.2 以前の Script-Fu: SIODベース。
2.4 以後の Script-Fu: TinySchemeベース。Tiny-Fu。

関数について調べる場合


概ねこの図のような関係になっているので、

  • Gimp に固有の関数についてはプロシージャブラウザで調べる
  • TinyScheme の部分については「TinyScheme」「Scheme」 などのキーワードと関数名や機能名を組み合わせて検索する

という感じになります。

追記 20091126:
Gimp 公式サイトの Script-Fu Migration Guide というページに
More information about the Scheme syntax of Script-Fu can be found in the Revised5 Report on the Algorithmic Language Scheme, also know as R5RS. Tinyscheme does not support all features of R5RS, but if a precedure is available, it is supposed to behave like documented.
という記述があり、 訳すと「Script-Fu の Scheme の文法についてもっと知りたい場合は R5RS として知られている Revised5 Report on the Algorithmic Language Scheme を参照してください。 TinyScheme は R5RS のすべての機能をサポートしている訳ではありませんが、 procedure が使える場合はこの文書に説明されているように動くはずです。」 といった感じです。
なので、TinyScheme の文法や関数について原典に当たりたい場合はここ http://schemers.org/Documents/Standards/R5RS/HTML/ を見れば良いようです(ただし英語ですが)。

ある関数が Script-Fu で使えるかどうか調べる

Script-Fu コンソールに関数名だけ入力して評価(実行)

> number->string
#<CLOSURE> ←使える
> number2string
Error: eval: unbound variable: number2string ←使えない(number2stringは束縛されていない=定義されていない)

エラーコンソールと gimp-message

printfデバッグの Script-fu 版。

メニュー > ウィンドウ > ドッキング可能なダイアログ > エラーコンソール
でエラーコンソールを開いておく。

Script-Fu 側で gimp-message 関数に文字列を渡す。

gimp-message-error-console

tracing

メッセージが大量に出て??とりますが何もないよりは助かります。


> (tracing 1) ←トレースを有効にする

Gives: 0
> (number->string "foo") ←エラーの起こる S式

Eval: (number->string "foo")
Eval: number->string
Eval: "foo"
Apply to: ("foo")
Eval: (anyatom->string n number?)
Eval: anyatom->string
Eval: n
Eval: number?
Apply to: ("foo" #)
Eval: (if (pred n) (atom->string n) (error "xxx->string: not a xxx" n))
Eval: (pred n)
Eval: pred
Eval: n
Apply to: ("foo")
Eval: (error "xxx->string: not a xxx" n)
Eval: error
Eval: "xxx->string: not a xxx"
Eval: n
Apply to: ("xxx->string: not a xxx" "foo")Error: xxx->string: not a xxx "foo" 

参考: Gimp wiki - ScriptFuClass/Staying > スクリプトのデバッグ方法

エディタ

Emacs を使うと Scheme コーディング用の支援機能がいろいろと使えて理想的なのですが、 多少操作が独特なのでとっつきにくいかもしれません。 括弧が多い言語なので、Emacs 以外を使う場合でも、 サクラエディタなど対応する括弧のハイライト機能があるエディタを選んで使うと作業しやすいと思います。

gimp-shell.el

SIODベースの Script-Fu 用に書かれているためかそのままでは動きませんが、 Emacs ユーザの方は一度試しみてはいかがでしょうか。

gimp-shell.el / gimp-mode を使ってみた

てきとーメモ。

gimp-shell.el

環境: Ubuntu Studio 8.04 / Gimp 2.4.5 / Emacs 23.0.60.1

そのままでは動かなかったので、 以下の箇所を修正。


;; 修正前
  (gimp-send-string 
   "(define (int--emacs-tostring item)
      (cond ((number? item) (number->string item 10))
 	((string? item) (print-to-string item (string-append (substring item 0)
                                                             \"                                 \" )))
 	((null? item)   \"()\")
        ((eq? t item)    \"t\")
 	((pair? item) 
 	 (string-append \"(\" 
		(unbreakupstr 
 			 (map int--emacs-tostring item) \" \") \")\"))
        (TRUE item)))")

;; 修正後
  (gimp-send-string 
    "(define (int--emacs-tostring item)
      (cond
        ((number? item) (number->string item 10))
        ((string? item) item)
        ((null? item) \"()\")
        ((eq? #t item) \"#t\")
        ((pair? item) 
          (string-append
            \"(\" 
       	    (unbreakupstr 
       	      (map int--emacs-tostring item) \" \")
            \")\"))
        (TRUE item)))")

「とりあえず動く」ようにしただけなので、 もっといいやり方があるはず……。

あとは send-last-sexp、send-definition があるだけでも違うので以下を適当に追加:


;; この2つの関数は cmuscheme から。ほぼそのまま。
(defun gimp-send-last-sexp ()
  "Send the previous sexp to the Script-Fu process."
  (interactive)
  (gimp-send-region (save-excursion (backward-sexp) (point)) (point)))

(defun gimp-send-definition ()
  "Send the current definition to the Script-Fu process."
  (interactive)
  (save-excursion
   (end-of-defun)
   (let ((end (point)))
     (beginning-of-defun)
     (gimp-send-region (point) end))))

...

;; キーバインド
(define-key gimp-mode-map "\C-c\C-r" 'gimp-send-region)
(define-key gimp-mode-map "\C-c\C-e" 'gimp-send-definition)
(define-key gimp-mode-map "\C-x\C-e" 'gimp-send-last-sexp)

Script-Fu: 任意のタイミングで自動で連番ファイル名を決定して保存

本をスキャンし、連番を付けて保存したい。 ScanSnap みたいなスキャナが必要なほど大量ではないが、 十数枚程度でも「ファイル名を付けて保存」する工程が非常にだるい。 連番の次の番号を確認するのが面倒だし、ファイル名をタイプするのも面倒、毎回拡張子を手打ちするのも不毛。 ものすごくだるい。

という訳でショートカットキー一発であらかじめ指定したフォルダに連番で保存するための Script-Fu を書いてみました。 保存した後画像を閉じるとこまでできれば良かったんですが、 gimp-display-delete が使えないようだったのでそこは手動になります。

あとは保存フォルダ・桁数・増分値を変更しようと思ったら スクリプトを開いて修正しないといけないのがいけてませんが、ここも我慢です。 保存フォルダと桁数に関しては、自分で使う分には保存フォルダ固定で問題なく、 増分値は手軽に変更できると良いのですが今後の課題ということで。

使い方・手順

作業開始時に

  • 必要ならスクリプトを開き作業用フォルダのパスと桁数、連番の増分値を修正
  • 必要なら保存フォルダの next-number.txt を開き、次に保存するファイルの番号を入力して保存

しておき、あとは以下の手順を繰り返す。

  • 画像をスキャン(または画像を修正するなど)
  • 通常の Script-Fu と同様に使う。ショートカットキーを割り当てておくと吉。
  • (Ctrl+W で画像を閉じる)

番号を間違えて保存するなど、ミスったときは next-number.txt の番号を修正してやり直す。

スクリプト


;; anbt-continuous-save.scm

;; The MIT License

;; Copyright (c) 2009 sonota

;; Permission is hereby granted, free of charge, to any person obtaining a copy
;; of this software and associated documentation files (the "Software"), to deal
;; in the Software without restriction, including without limitation the rights
;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the Software is
;; furnished to do so, subject to the following conditions:

;; The above copyright notice and this permission notice shall be included in
;; all copies or substantial portions of the Software.

;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
;; THE SOFTWARE.


(define (script-fu-anbt-continuous-save img drw)
  (let*
	  ((fr nil)
	   (fw nil)
	   (digits 4) ; 桁数
	   (step 1) ; 増分値
	   (work-dir "/home/USER/gimp-continuous-save-temp/") ; 作業用フォルダ
	   (next-number-file (string-append work-dir "next-number.txt")) ; 番号保存用ファイル名
	   (next-number nil)
	   (save-file-name nil))

	;; 桁数と数を指定して整形
	;; 000xx
	;; ----- digits
	;; ---   zero-length
	;;    -- n-length
	(define (zero-padding-number digits n)
	  (let*
		  ((n-str (number->string n))
		   (n-length (string-length n-str))
		   (zeros-str "")
		   (zero-length (- digits n-length))
		   (i 0))
		
		(while (< i zero-length)
			   (set! zeros-str (string-append zeros-str "0"))
			   (set! i (+ i 1)))
		(string-append zeros-str n-str)))

	;; アンドゥしたらここに戻る
	(gimp-image-undo-group-start img)
	
	;; ファイルから番号読み込み
	(set! fr (open-input-file next-number-file))
	(set! next-number (read fr))

	;; ファイル名生成
	(set! save-file-name (string-append work-dir (zero-padding-number digits next-number) ".jpg"))

	;; 画像にファイル名をセット
	(gimp-image-set-filename img save-file-name)

	;; 必要ならここに処理を適宜追加する
	;; ここでは例として画像を右90度回転
	(gimp-image-rotate img ROTATE-90)

	;; 保存
	(file-jpeg-save 1 ; 保存ダイアログを開かない
					img drw
					save-file-name
					save-file-name ; raw-filename
					0.95
					0 ; smoothing
					1 ; optimize
					0 ; progressive
					"" ; comment
					0 ; subsmp
					0 ; baseline
					0 ; restart
					0 ; dct
					)
	
	;; 増分値を加算
	(set! next-number (+ step next-number))

	;; ファイルに番号書き込み
	(set! fw (open-output-file next-number-file))
	(display next-number fw)

	;; 「修正なし」状態にする
	;; (画像を閉じる時にダイアログを出さないようにするため)
	(gimp-image-clean-all img) 

	;; ここまでがアンドゥの対象
	(gimp-image-undo-group-end img)))


(script-fu-register
  "script-fu-anbt-continuous-save"
  "<Image>/Script-Fu/misc/連番で保存" ; このスクリプトのメニュー位置
  "連番で保存" ; このスクリプトの説明
  "sonota" ; 作者名
  "(c) 2009" ; コピーライト
  "2009-10-11" ; 日付
  "RGB*, GRAY*, INDEXED*"  ; スクリプトが動作可能なモード
  SF-IMAGE "Image" 0       ; 引数1
  SF-DRAWABLE "Drawable" 0 ; 引数2
)

その他

桁数と数を指定して整形する関数 zero-padding-number は □置きざり保管庫: GIMPをscript-fuで自動化(2008-07-22) を参考にさせてもらいました。ありがとうございます。

次のように動作します。

> (zero-padding-number 4 12)
"0012"
> (zero-padding-number 16 12)
"0000000000000012"
> (zero-padding-number 1 12)
"12"

Gimpに関する記事のもくじ

GBUCの音源ファイルへのダウンロード用リンクを表示するブックマークレット

とりあえず mp3、m4a へのリンクを表示するようにしてみました。

javascript:(
  function(){
	location.href.match(/lid=(\d+)/);
	var audioPath="http://gbuc.net/uploads/photos/"+RegExp.$1;
	var downloadLink=document.createElement("div");
	downloadLink.innerHTML="<a href='"+audioPath+".mp3'>"+audioPath+".mp3</a>";
	downloadLink.innerHTML+="<br />";
	downloadLink.innerHTML+="<a href='"+audioPath+".m4a'>"+audioPath+".m4a</a>";
	var insertPoint=document.getElementsByTagName("body")[0].firstChild;
	document.getElementsByTagName("body")[0].insertBefore(downloadLink,insertPoint);
  }
)();

対訳: 米国政府の CTO が CNET のインタビューで CC に言及

The US Government CTO on Creative Commons
米国政府の CTO が CC に言及

Fred Benenson, September 22nd, 2009

We caught a great interview with the US Government’s CTO, Aneesh Chopra talking about his thoughts on copyright on CNET.

米国政府の CTO(最高技術責任者)である アニーシュ・チョプラ氏が CNETで著作権についての彼の考えについて語っている 素晴らしいインタビューをキャッチした。

When questioned about the future of copyright reform (wait for the video to load and scroll to the 7:30 mark) Chopra mentions how he “embraced the Creative Commons licensing regime” when he worked with the Commonwealth of Virginia to publish their Flexbook platform. Chopra then states that he thinks that it was this experience that really informs his perspective on how intellectual property should be remixed, shared, and reused.

著作権の改修の未来について質問されたとき (ビデオの 7:30 から)、 Flexbookプラットフォームを公開する ためにバージニア州と協力する際に 彼がどのようにして「CC ライセンシングのレジーム(体制)を受け入れたか」 について言及している。 彼はまた、まさにこの体験によって、 知的財産がどのようにリミックスされ、共有され、 再利用されるべきであるかということに関する 見通しを得たと語った。

Needless to say, we totally agree.

言うまでもなく、私たちは全面的に賛同する。

Creative Commons License
This work by sonota is licensed under a Creative Commons Attribution 2.1 JP License.
Based on a work at creativecommons.org.

これがそのインタビュー動画です。

時間表示が「残り時間」になっているので「動画の末尾から 7:30」のあたりから 上述の話が始まります。 会話は英語ですが英語字幕が付いてる(動画の下の「CC」のボタンをクリックすると表示されます)のでリスニング苦手な人も見てみてはいかがでしょう。

参考(外部リンク)



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。