<?xml version="1.0" encoding="utf-8" ?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" 
			xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" 
			xmlns:cc="http://web.resource.org/cc/" xml:lang="ja">
<channel rdf:about="http://haraita9283.blog98.fc2.com/?xml">
<title>anobota</title>
<link>http://haraita9283.blog98.fc2.com/</link>
<description>小ネタ多め</description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-335.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-334.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-333.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-331.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-330.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-329.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-327.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-326.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-323.html" />
<rdf:li rdf:resource="http://haraita9283.blog98.fc2.com/blog-entry-322.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-335.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-335.html</link>
<title>Javascript: canvas で点線・破線を描くためのライブラリを作ってみた</title>
<description> Javascript + canvas で点線・破線を描画するためのライブラリです。

Description: A library to draw dotted/dashed line for Javasctipt/canvas.



canvas を使ってちょっとした折れ線グラフを書かせてみようとしたところ、点線・破線が描けないので困りました。
なぜ困るかというと、モノクロ印刷するときに系列の区別を付けにくくなるからです。



という訳であまり出来の良くない再発明っぽいですが作ってみま
 </description>
<content:encoded>
<![CDATA[ <p>
<img src="http://blog-imgs-38-origin.fc2.com/h/a/r/haraita9283/javascript-canvas-anbt-dashed-line-sample-c064.png" border="0px" alt="" />
</p>

<p>
Javascript + canvas で点線・破線を描画するためのライブラリです。
<br />
Description: A library to draw dotted/dashed line for Javasctipt/canvas.
</p>

<p>
canvas を使ってちょっとした折れ線グラフを書かせてみようとしたところ、点線・破線が描けないので困りました。
なぜ困るかというと、モノクロ印刷するときに系列の区別を付けにくくなるからです。
</p>

<p>
という訳であまり出来の良くない再発明っぽいですが作ってみました。
ベタに書いてみただけなのでパフォーマンスとかはあまり良くない（アニメーションなどさせると辛い）と思います。
</p>

<p>
Firefox でしか動作確認していません。
</p>

<p>
円弧やベジェ曲線は描けません（自前で何とかする必要があります）。
</p>

<p>
パスを閉じることはできません。たとえば三角形を描くと始点と終点が重なっていても lineJoin が効きません。
</p>

<p>
ライセンスは MITライセンスです。
<br />
License: MIT license
</p>


<h2>ダウンロード / Download</h2>

<p>
<a href="http://github.com/sonota/anbt-dashed-line.js">sonota's anbt-dashed-line.js at master - GitHub</a>
<br />
このページの「download」ボタンからどうぞ。
</p>


<h2>サンプル / Sample</h2>

<pre class="code prettyprint">
&lt;canvas id="canvas" width="400px" height="400px" />

&lt;script type="text/javascript" src="anbt-dashed-line.js">&lt;/script>
&lt;script type="text/javascript">
&lt;!--
var cv = document.getElementById("canvas");
var ctx = cv.getContext("2d");

var lineStyle = {
  color: "#a00"
, pattern: "*****-"
, scale: 200
, width: 10
, cap: "butt" // butt, round, square
, join: "bevel" // round, bevel, miter
};

var vertices = [
  [  0,   0]
, [100, 200]
, [110, 150]
, [200, 300]
];

var adl = new AnbtDashedLine();
adl.drawDashedPolyLine(ctx, vertices, lineStyle);
-->
&lt;/script>
</pre>



<h2>その他</h2>

<p>
線の終端の形状（lineCap） と線の接合部（lineJoin）のスタイルについては
 <a href="https://developer.mozilla.org/ja/Canvas_tutorial/Applying_styles_and_colors">スタイルと色を適用する - MDC</a>
 を参照してください。
</p>

<hr /><!-- ******** ******** ******** ******** -->

<p>
追記 20091125:
<br />
作った後で ActionScript のライブラリを探して移植すれば良かったかも、と思い至りました……という訳で以下参考までに。
</p>

<ul><li>
2008-05-30
 <a href="http://www.cartogrammar.com/blog/drawing-dashed-lines-with-actionscript-3/">Cartogrammar.com | Blog &#187; Drawing dashed lines with ActionScript 3</a>
</li><li>

2006-05-30
 <a href="http://www.quietlyscheming.com/blog/charts/dashed-lines/">Quietly Scheming &#187; Dashed Lines</a>
</li><li>

<a href="http://www.zendoc.org/zendoc/view.php?file=http://www.senocular.com/flash/actionscript/files/ActionScript_2.0/com/senocular/drawing/DashedLine.as">class DashedLine</a>
</li><li>

<a href="http://www.libspark.org/wiki/n_mattun/Line">n_mattun/Line - Spark project</a>
</li></ul>

<h2>参考（外部リンク）</h2>

<ul><li>
<a href="http://www.google.co.jp/search?q=site%3Alists.whatwg.org+canvas+dashed+line">lists.whatwg.org での canvas dashed line の検索結果（Google）</a>
</li></ul> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2009-11-25T00:20:13+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-334.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-334.html</link>
<title>Ruby: scrobbler の文字化けにモンキーパッチングで対処してみた</title>
<description> A monkey patching for scrobbler mojibake.


以前適当に書いたのを掘り出してあまり見直さずに貼ってみます。



このコードに続けて scrobbler を使った処理を書くか、
別ファイルに分けて require して使います。




require &quot;rubygems&quot;
require &quot;scrobbler&quot;
require &quot;cgi&quot;

module Scrobbler
  module REST
    class Connection
      MULTIBYTE_CHAR = true

      def request(resource, method = 
 </description>
<content:encoded>
<![CDATA[ <p>A monkey patching for scrobbler mojibake.</p>

<p>
以前適当に書いたのを掘り出してあまり見直さずに貼ってみます。
</p>

<p>
このコードに続けて scrobbler を使った処理を書くか、
別ファイルに分けて require して使います。
</p>


<pre class="code prettyprint">
require "rubygems"
require "scrobbler"
require "cgi"

module Scrobbler
  module REST
    class Connection
      MULTIBYTE_CHAR = true

      def request(resource, method = "get", args = nil)
        url = URI.join(@base_url, resource)
        temp_url = url.request_uri
        temp_query = ""

        if args
          temp_query = args.map { |k,v| 
            if MULTIBYTE_CHAR
              "%s=%s" % [k.to_s, CGI.escape(v.to_s)]
            else
              "%s=%s" % [escape(k.to_s), escape(v.to_s)]
            end
          }.join("&")
          url.query = temp_query if MULTIBYTE_CHAR
        end

        req = case method
              when "get"
                if MULTIBYTE_CHAR
                  Net::HTTP::Get.new(temp_url)
                else
                  Net::HTTP::Get.new(url.request_uri)
                end
              when "post"
                if MULTIBYTE_CHAR
                  Net::HTTP::Post.new(temp_url)
                else
                  Net::HTTP::Post.new(url.request_uri)
                end
              end
        
        if @username and @password
          req.basic_auth(@username, @password)
        end

        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = (url.port == 443)

        res = if MULTIBYTE_CHAR
                http.post(temp_url, temp_query)
              else
                http.start() { |conn| conn.request(req) }
              end
        res.body
      end
      
      private
      def escape(str)
        URI.escape(str, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
      end
    end
  end
end
</pre>
 ]]>
</content:encoded>
<dc:subject>Ruby</dc:subject>
<dc:date>2009-11-16T23:46:25+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-333.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-333.html</link>
<title>Emacs: shell-mode で日本語が文字化けする場合の対処法</title>
<description> 自分の場合、Windows + NTEmacs では:

M-x set-buffer-process-coding-system RET sjis RET sjis RET

または

C-x RET p sjis RET sjis RET




.emacs に書く場合


(add-hook
 'shell-mode-hook
 '(lambda ()
    (set-buffer-process-coding-system 'sjis 'sjis)))




関連


指定できる coding-system の一覧を表示:

M-x list-coding-systems
 </description>
<content:encoded>
<![CDATA[ <p>
自分の場合、Windows + NTEmacs では:
<br />
<tt>M-x set-buffer-process-coding-system RET sjis RET sjis RET</tt>
<br />
または
<br />
<tt>C-x RET p sjis RET sjis RET</tt>
</p>



<h2>.emacs に書く場合</h2>

<pre class="code ez-hilite-lisp">
(add-hook
 'shell-mode-hook
 '(lambda ()
    (set-buffer-process-coding-system 'sjis 'sjis)))
</pre>



<h2>関連</h2>

<p>
指定できる coding-system の一覧を表示:
<br />
<tt>M-x list-coding-systems</tt>
</p>
 ]]>
</content:encoded>
<dc:subject>Emacs</dc:subject>
<dc:date>2009-11-16T23:00:29+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-331.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-331.html</link>
<title>zipruby: zipファイルのルートがディレクトリのみかどうか調べる</title>
<description> 展開したときに、ポンとディレクトリが 1つだけ出てくるか、
それとも複数のファイルがばらっと出てくるか判別する。



require &quot;zipruby&quot;

def filelist_in_zip(zip_path)
  result = []
  Zip::Archive.open(zip_path) do |ar|
    n = ar.num_files
    
    n.times do |i|
      result
 </description>
<content:encoded>
<![CDATA[ <p>
展開したときに、ポンとディレクトリが 1つだけ出てくるか、
それとも複数のファイルがばらっと出てくるか判別する。
</p>

<pre class="code prettyprint">
require "zipruby"

def filelist_in_zip(zip_path)
  result = []
  Zip::Archive.open(zip_path) do |ar|
    n = ar.num_files
    
    n.times do |i|
      result << ar.get_name(i)
    end
  end

  result
end

def zip_root_dir(zip_path)
  entries = filelist_in_zip(zip_path).map do |path|
    path.sub(/^(.+?)\/.*$/, '\1')
  end
  
  !(entries.size != 1) && entries.all?{ |x| entries.first == x }
end
</pre>
 ]]>
</content:encoded>
<dc:subject>Ruby</dc:subject>
<dc:date>2009-11-10T01:29:18+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-330.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-330.html</link>
<title>(solved) Ruby/Tk / Ubuntu 9.04: TkPackage can't find package img::png</title>
<description> 環境


Ubuntu Linux 9.04 / ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
 / Tk::TK_PATCHLEVEL' #=&gt; &quot;8.4.19&quot;


現象


逆引きRuby/Tk
 の PNG 画像表示のサンプルコードを実行すると次のエラーが出て動かない。




/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package img::png (RuntimeError)




locate tkextlib/tkimg すると


/usr/lib/ruby/1.8/tkextlib/t
 </description>
<content:encoded>
<![CDATA[ <h2>環境</h2>

<p>
Ubuntu Linux 9.04 / ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
 / Tk::TK_PATCHLEVEL' #=> "8.4.19"
</p>

<h2>現象</h2>

<p>
<a href="http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%B5%D5%B0%FA%A4%ADRuby%2FTk">逆引きRuby/Tk</a>
 の PNG 画像表示のサンプルコードを実行すると次のエラーが出て動かない。
</p>

<p>
<tt>
/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package img::png (RuntimeError)
</tt>
</p>

<p>
<tt>locate tkextlib/tkimg</tt> すると
<br />
<tt>
/usr/lib/ruby/1.8/tkextlib/tkimg/png.rb
</tt>
<br />
などが見つかるので、Ruby/Tk 側のライブラリ自体はインストールされている。
</p>




<h2>解決法</h2>

<p>
sudo apt-get install libtk-img
</p>

<h2>その他</h2>

<p>JPEG もこれで解決する。</p>
 ]]>
</content:encoded>
<dc:subject>Ruby</dc:subject>
<dc:date>2009-11-09T06:46:49+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-329.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-329.html</link>
<title>Lisp/Scheme のコメント・文字列・括弧に色を付ける簡易ツール（Javascirpt）</title>
<description> ブログなどに貼った Lisp/Scheme 系のソースコードを google-code-prettify のように強調表示（ハイライト）するツールを探してみたのですが、ちょうどいいのが見つけられず……というわけで簡単なのを作ってみました。


キーワードや関数名、シンボルなどには色は付きません。
Lisp/Scheme っぽいものにそのまま使いまわせるようにしたかったのと、

なるべく処理が重くならないようにしたかったので、あまり複雑にならない
 </description>
<content:encoded>
<![CDATA[ <ul><li>
ブログなどに貼った Lisp/Scheme 系のソースコードを google-code-prettify のように強調表示（ハイライト）するツールを探してみたのですが、ちょうどいいのが見つけられず……というわけで簡単なのを作ってみました。
</li><li>

キーワードや関数名、シンボルなどには色は付きません。
Lisp/Scheme っぽいものにそのまま使いまわせるようにしたかったのと、

なるべく処理が重くならないようにしたかったので、あまり複雑にならないようにしました。
</li><li>

Common Lisp とかはよく知らないのでとりあえず Emacs Lisp を想定してます……
</li></ul>




<h2>ダウンロード</h2>

<p>
<a href="http://gist.github.com/228735">gist: 228735 - GitHub</a> からどうぞ。
</p>




<h2>サンプル</h2>

<p>
こんな感じで色が付きます。
</p>

<pre class="code ez-hilite-lisp">
(defun factorial (x)
  "Calculate factorial." ; 関数の説明
  (if (= x 1)
      1
    (* x (factorial (- x 1))))) ; 再帰呼び出し
</pre>




<h2>動作チェック</h2>

<pre class="code ez-hilite-lisp">
;; ダブルクォート文字列
aa "bb" cc
aa "b\"b" cc ; バックスラッシュでエスケープ
aa "b\\b" cc
aa "b;b" cc  ; セミコロン
aa "b(b" cc  ; 括弧
aa "b)b" cc

;; 一行コメント
aa ; bb
; aa"bb ; ダブルクォート
; aa\bb ; バックスラッシュ
; aa)bb ; 括弧
; aa(bb

;; 括弧
aa(bb)cc

;; 記号
(1 . 2)
'()

;; HTMLの文字参照
a &lt; b
a &gt; b
a &amp; b

;; 最後のダブルクォートが不整合
"aa</pre>

<h2>参考（外部リンク）</h2>

<ul><li>
2003-02-18
 <a href="http://0xcc.net/unimag/10/">横着プログラミング 第10回: scmail: Scheme によるメールフィルタ</a> - Scheme は括弧に色を付けると見やすい
</li></ul>
 ]]>
</content:encoded>
<dc:subject>Emacs</dc:subject>
<dc:date>2009-11-08T00:45:13+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-327.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-327.html</link>
<title>「ふりがな翻訳」の文の区切りを改行に変換する greasemonkeyスクリプト</title>
<description> 英語翻訳 - ふりがな翻訳 ＆ スラッシュリーディング powered by Rubiyaku.com の文の区切り（スラッシュ2つ）を改行にする greasemonkeyスクリプトを書きました。
次の画像のようになります。




スクリプト


// ==UserScript==
// @name           doubleslash-to-linebreak
// @namespace      anbt
// @include        http://rubiyaku.com/index.py
// ==/UserScript==

(function(){
   function $class(r
 </description>
<content:encoded>
<![CDATA[ <p>
<a href="http://rubiyaku.com/">英語翻訳 - ふりがな翻訳 ＆ スラッシュリーディング powered by Rubiyaku.com</a> の文の区切り（スラッシュ2つ）を改行にする greasemonkeyスクリプトを書きました。
次の画像のようになります。
<br />
<img src="http://blog-imgs-34-origin.fc2.com/h/a/r/haraita9283/rubiyaku-linebreak-greasemonkey-w500-c8.png" border="1px" alt="" />
</p>

<h2>スクリプト</h2>

<pre class="code prettyprint">
// ==UserScript==
// @name           doubleslash-to-linebreak
// @namespace      anbt
// @include        http://rubiyaku.com/index.py
// ==/UserScript==

(function(){
   function $class(root, className){
	 var elems = root.getElementsByTagName("*");
	 var result = [];
	 for(var a in elems){
	   if(elems[a].getAttribute("class") == className){
		 result.push(elems[a]);
	   }
	 }
	 return result;
   }

   var target = $class(document, "sheet")[0];

   target.innerHTML = 
   	 target.innerHTML.replace(
   		 /&lt;img src="slash.png">&lt;img src="slash.png">/g,
   	   "&lt;br />●"
   	 );
 })();
</pre> ]]>
</content:encoded>
<dc:subject>未分類</dc:subject>
<dc:date>2009-11-01T17:36:11+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-326.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-326.html</link>
<title>Linux で freedb（freedbtest.dyndns.org） に日本語データを送信する</title>
<description> 環境: Ubunbu Linux 9.04





いくつか試してみたところ、結局 wine + CDex.exe の組み合わせが無難という結論に。



CDex の設定については 
 freedbtest.dyndns.org 
 に説明がある。





Grip は HTTP ではなくメールを送る方式のようで、裏で sendmail が動く。
freedbtest.dyndns.org はメールには対応していないようなので、これは使えない。



Audex が使えるという情報
（Audex - いくやの斬
 </description>
<content:encoded>
<![CDATA[ <p>
環境: Ubunbu Linux 9.04
</p>

<hr /><!-- ******** ******** ******** ******** -->

<p>
いくつか試してみたところ、結局 wine + CDex.exe の組み合わせが無難という結論に。
</p>

<p>
CDex の設定については 
 <a href="http://freedbtest.dyndns.org/">freedbtest.dyndns.org</a> 
 に説明がある。
</p>

<hr /><!-- ******** ******** ******** ******** -->

<p>
Grip は HTTP ではなくメールを送る方式のようで、裏で sendmail が動く。
freedbtest.dyndns.org はメールには対応していないようなので、これは使えない。
</p>

<p>
Audex が使えるという情報
（<a href="http://blog.goo.ne.jp/ikunya/e/adecffda4400fd78a9bd8ee73d69778e">Audex - いくやの斬鉄日記</a> 2009-03-08）
もあるが、自分の環境では "Submit Info" ボタンがグレーアウトして送信できなかった。
</p>


<h2>ついでにリッピング</h2>

<p>
<a href="http://fun.poosan.net/sawa/index.php?UID=1203585800">abcde - A Better CD Encoder [ver 2.3.99]</a>
<br />
を使う。
</p>
 ]]>
</content:encoded>
<dc:subject>Linux</dc:subject>
<dc:date>2009-11-01T00:33:08+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-323.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-323.html</link>
<title>Emacs で Script-Fu を書いて実行させる / script-fu-shell.rb</title>
<description> 環境: Ubuntu Studio 9.04 / Gimp 2.6.6 / Ruby 1.8.7 / Emacs 23.0.91.1




ダウンロード


ここから script-fu-shell.rb をダウンロードして適当なところに置いてください。

http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb




script-fu-shell.rb を単体で動かしてみる

Gimp を起動し、メニューから
[フィルタ ＞ Script-Fu ＞ サーバスタート]

（Gimp のバージョンによっ
 </description>
<content:encoded>
<![CDATA[ <p>
環境: Ubuntu Studio 9.04 / Gimp 2.6.6 / Ruby 1.8.7 / Emacs 23.0.91.1
</p>



<h2>ダウンロード</h2>

<p>
ここから script-fu-shell.rb をダウンロードして適当なところに置いてください。
<br />
<a href="http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb"
>http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb</a>
</p>



<h2>script-fu-shell.rb を単体で動かしてみる</h2>

<p>Gimp を起動し、メニューから
[フィルタ ＞ Script-Fu ＞ サーバスタート]
<br />
（Gimp のバージョンによってメニュー位置が違います）

<br />
<img src="http://blog-imgs-32-origin.fc2.com/h/a/r/haraita9283/gimp-server-start-c32.png" border="0px" alt="" />
<br />

「サーバスタート」をクリックしてサーバを開始させます。
</p>

<p>
端末で
<br />
<tt>$ ruby script-fu-shell.rb</tt>
<br />
と実行するとプロンプトが表示され、
Gimp本体の Script-Fu コンソールを使うのと同じ要領で S式を書くと
対話的に実行されます。
</p>

<p>
たとえばプロンプトに続けて
<br />
<tt>(gimp-display-new (car (gimp-image-new 640 480 0)))</tt>
<br />
と入力しエンターキーを押すと、Gimp側で新規画像が表示されます。
</p>




<h2>Emacs から使う</h2>


<h3>手軽に試してみる</h3>

<p>
Emacs には最初から cmuscheme という Scheme用の便利なライブラリが付属しており、
これをそのまま利用することができます。
</p>

<p>
まず手軽に試してみたいという場合は
 scratch バッファで
<br />
<tt>(setq scheme-program-name "~/test/script-fu-shell.rb")</tt>
<br />
などと書いて C-xC-e で評価し「Scheme インタプリタとして script-fu-shell.rb を使う」ように設定します。
</p>

<p>
次に M-x run-scheme すると、Script-Fu用のバッファが開きプロンプトが表示されます。
適当に S式を入力して試してみてください。
</p>

<p>
プロンプトの位置にカーソルを置いて M-p, M-n で履歴を前後に辿れます。
</p>




<h3>さらに便利に使う</h3>

<p>
.emacs に次を追加して保存。
</p>

<pre class="code ez-hilite-lisp">
(setq scheme-program-name "###/@@@/script-fu-shell.rb") ;; パスを書き換えてください。
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

;; シェルを別ウィンドウで開く
(defun scheme-other-window ()
  "Run scheme on other window"
  (interactive)
  (switch-to-buffer-other-window
   (get-buffer-create "*scheme*"))
  (run-scheme scheme-program-name))
;; キーバインド
(define-key global-map
  "\C-cS" 'scheme-other-window)
</pre>

<p>
新たに Emacs を起動し、 M-x scheme-mode で scheme-mode にし、
その状態で C-cS（scheme-other-window）で次の画面のような状態になります。
<br />
<img src="http://blog-imgs-32-origin.fc2.com/h/a/r/haraita9283/script-fu-shell-emacs-c32.png" border="0px" alt="" />
<br />
上がスクリプトを書くウィンドウ、下が Script-Fu シェル。
</p>

<p>
たとえば上のバッファで <tt>(+ 1 (* 2 3))</tt> と書き、
最後の括弧の次にカーソルを移動させて C-x C-e（scheme-send-last-sexp）すると
<tt>(+ 1 (* 2 3))</tt> という S式がシェルに送られ、
評価した結果が表示されます。
<br />
<img src="http://blog-imgs-32-origin.fc2.com/h/a/r/haraita9283/script-fu-shell-emacs-eval-c32.png" border="0px" alt="" />
</p>




<h3>キーバインドなど</h3>

<p>
cmuscheme をそのまま利用しているだけなので、キーバインドなどは同じものが使えます。
<br />

まずはリージョンをシェルに送る scheme-send-region（C-cC-r）や
カーソル位置のトップレベルの S式を送る scheme-send-definition（C-cC-e）、
カーソル以後の S式にリージョン設定する mark-sexp（C-M-SPC）
あたりを使ってみると良いと思います。

<br />
参考: <a href="http://karetta.jp/book-node/gauche-hacks/004640">Karetta|Gaucheプログラミング(立読み版)|EmacsからGaucheを使う</a>
</p>

<hr /><!-- ******** ******** ******** ******** -->

<p>
scheme-other-window を実行した後元のウィンドウに戻って欲しいのと、
C-cS が押し辛いので私は次のようにしています。
</p>

<pre class="code ez-hilite-lisp">
(defun scheme-other-window ()
  "Run scheme on other window"
  (interactive)
  (let ((win (selected-window)))
	(switch-to-buffer-other-window
	 (get-buffer-create "*scheme*"))
	(run-scheme scheme-program-name)
	(select-window win)
	))

(define-key global-map
  "\C-c\C-s" 'scheme-other-window)
</pre>



<h2>その他</h2>

<p>
今のところ次のような不具合があります。。。
</p>

<ul><li>
ドット対を評価するとエラーになる。
</li><li>

tracing の結果がうまく表示されない。
</li></ul>


<hr /><!-- ******** ******** ******** ******** -->

<p>
Script-Fu ではありませんが、Emacs で Scheme を書くのって実際どんな感じなの？
 というのが垣間見れる動画があったので貼っときます。
</p>

<p>
<a href="http://www.nicovideo.jp/watch/sm2143250">Gaucheでライフゲームを作ってみた‐ニコニコ動画(ββ)</a>
<br />
<script type="text/javascript" src="http://ext.nicovideo.jp/thumb_watch/sm2143250?w=512&h=384"></script>
</p>

<hr /><!-- ******** ******** ******** ******** -->

<a href="http://haraita9283.blog98.fc2.com/blog-entry-29.html">Gimp: 記事のもくじ</a>

 ]]>
</content:encoded>
<dc:subject>Gimp</dc:subject>
<dc:date>2009-10-18T13:45:06+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://haraita9283.blog98.fc2.com/blog-entry-322.html">
<link>http://haraita9283.blog98.fc2.com/blog-entry-322.html</link>
<title>Script-Fu メモ</title>
<description> メモ。




コーディング



新旧の違いなど


2.2 以前の Script-Fu: SIODベース。

2.4 以後の Script-Fu: TinySchemeベース。Tiny-Fu。




2007-10-26 晴れときどきGIMP: Script-fu In GIMP 2.4 - 以前のSIODベースのものとの違い

TinySCHEME Version 1.38
 - 概説の日本語訳





関数について調べる場合




概ねこの図のような関係になっているので、



Gimp に固有の関数について
 </description>
<content:encoded>
<![CDATA[ <p>メモ。</p>




<h2>コーディング</h2>



<h3>新旧の違いなど</h3>

<p>
2.2 以前の Script-Fu: SIODベース。
<br />
2.4 以後の Script-Fu: TinySchemeベース。Tiny-Fu。
</p>


<ul><li>
2007-10-26 <a href="http://iccii.seesaa.net/article/62438175.html">晴れときどきGIMP: Script-fu In GIMP 2.4</a> - 以前のSIODベースのものとの違い
</li><li>
<a href="http://wataru.aoisakura.jp/temp/Manual.txt">TinySCHEME Version 1.38
</a> - 概説の日本語訳
</li></ul>


<hr /><!-- ******** ******** ******** ******** -->

<h3>関数について調べる場合</h3>

<p>
<img src="http://blog-imgs-32-origin.fc2.com/h/a/r/haraita9283/scheme-script-fu-venn-diagram-c32.png" border="0px" alt="" />
<br />
概ねこの図のような関係になっているので、
</p>

<ul><li>
Gimp に固有の関数についてはプロシージャブラウザで調べる
</li><li>

TinyScheme の部分については「TinyScheme」「Scheme」
などのキーワードと関数名や機能名を組み合わせて検索する

</li></ul>

<p>
という感じになります。
</p>

<div class="postscript">
追記 20091126:
<br />
Gimp 公式サイトの 
<a href="http://www.gimp.org/docs/script-fu-update.html">Script-Fu Migration Guide</a>
というページに

<blockquote lang="en">
More information about the Scheme syntax of Script-Fu can be found in the <i>Revised<sup>5</sup> Report on the Algorithmic Language Scheme</i>, also know as <a href="http://schemers.org/Documents/Standards/R5RS/HTML/">R5RS</a>. 
Tinyscheme does not support all features of R5RS, but if a precedure is available, it is supposed to behave like documented.
</blockquote>

という記述があり、
訳すと「<q>Script-Fu の Scheme の文法についてもっと知りたい場合は
<a href="http://schemers.org/Documents/Standards/R5RS/HTML/">R5RS</a> として知られている
 <i>Revised<sup>5</sup> Report on the Algorithmic Language Scheme</i> を参照してください。
TinyScheme は R5RS のすべての機能をサポートしている訳ではありませんが、
procedure が使える場合はこの文書に説明されているように動くはずです。</q>」
といった感じです。
<br />
なので、TinyScheme の文法や関数について原典に当たりたい場合はここ
 <a href="http://schemers.org/Documents/Standards/R5RS/HTML/">http://schemers.org/Documents/Standards/R5RS/HTML/</a>
 を見れば良いようです（ただし英語ですが）。
</div>

<hr /><!-- ******** ******** ******** ******** -->

<h3>ある関数が Script-Fu で使えるかどうか調べる</h3>

<p>
Script-Fu コンソールに関数名だけ入力して評価（実行）
</p>

<pre class="terminal">
> number->string
#&lt;CLOSURE> ←使える
> number2string
Error: eval: unbound variable: number2string ←使えない（number2stringは束縛されていない＝定義されていない）
</pre>


<hr /><!-- ******** ******** ******** ******** -->

<h3>tracing</h3>

<ul><li>
2009-06-22
 <a href="http://iccii.seesaa.net/article/122032224.html">晴れときどきGIMP: Script-Fu スクリプトのデバッグ方法</a>
</li></ul>

<p>
メッセージが大量に出て？？とりますが何もないよりは助かります。
</p>

<pre class="terminal">

> (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" #<number? PROCEDURE 107>)
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" 
</pre>


<hr /><!-- ******** ******** ******** ******** -->

<h3>gimp-shell.el</h3>

<ul><li>
2009-10-12
 <a href="http://haraita9283.blog98.fc2.com/blog-entry-321.html">gimp-shell.el / gimp-mode を使ってみた | anobota</a>
</li></ul>

<p>
SIODベースの Script-Fu 用に書かれているためかそのままでは動きませんが、
Emacs ユーザの方は一度試しみてはいかがでしょうか。
</p>

<hr /><!-- ******** ******** ******** ******** -->

<h2>Script-Fuサーバのプロトコル</h2>

<ul><li>
TCPソケットを使う。
</li><li>

S式の評価結果が文字列の場合はその文字列を返し、それ以外は <tt>"Success"</tt> という文字列を返すだけ。
なので、結果が文字列以外の場合は細工をしないと詳細が分からない。
</li><li>

複数のトップレベルの S式を送りたい場合は (begin ... ) で囲む。
</li></ul>


<p>
ここらへんが参考になるかと：
</p>

<ul><li>
<a href="http://www.geekware.de/software/emacs/#gimp">gimp-shell.el</a>

</li><li>
<a href="http://search.cpan.org/~astewart/Gimp-ScriptFu-Client-1.01/lib/Gimp/ScriptFu/Client.pm">Gimp::ScriptFu::Client - search.cpan.org</a> - Perl モジュール

</li><li>
2002-02-15
 <a href="http://www.linux-mag.com/id/973">Making the Most of Script-Fu Server | Linux Magazine</a> - 英語。ユーザ登録が必要

</li><li>
あとは Gimp のソースに当たる。

</li></ul>




<h2>その他</h2>

<ul><li>
<a href="http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-15.html#%_chap_Temp_11"
>Alphabetic Index of Definitions of Concepts, Keywords, and Procedures</a> … 「Revised^5 Report on the Algorithmic Language Scheme」の索引。関数などのリファレンスとして。
</li><li>

<a href="http://www.shido.info/lisp/idx_scm.html">もうひとつの Scheme 入門</a>
</li></ul>




<hr /><!-- ******** ******** ******** ******** -->

<a href="http://haraita9283.blog98.fc2.com/blog-entry-29.html">Gimp: 記事のもくじ</a> ]]>
</content:encoded>
<dc:subject>Gimp</dc:subject>
<dc:date>2009-10-13T20:17:11+09:00</dc:date>
<dc:creator>sonota</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
</rdf:RDF>