<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www23.atwiki.jp/selflearn/">
    <title>selflearn @ ウィキ</title>
    <link>http://www23.atwiki.jp/selflearn/</link>
    <description>selflearn @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2011-08-07T21:15:57+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/56.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/41.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/44.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/7.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/47.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/45.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/38.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/32.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/31.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/selflearn/pages/29.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/56.html">
    <title>WeatherRader</title>
    <link>http://www23.atwiki.jp/selflearn/pages/56.html</link>
    <description>
      #image(right,title=すごいアイコン,weather_icon.png)
*「&amp;bold(){WeatherRadar}」 −− その傘、本当に必要ですか？
ボクは自転車通勤をしています。だから雨が降るとビショ濡れです。
雨雲予報は、ボクにとってかけがえのない情報なのです。
#right(){最終更新：&amp;date(j)}
* 概要
現在から1-6時間後の雨雲予報をDashboardウィジェットで表示するプログラムです。
** 特徴
こんな特徴があります。

- 日本48都道府県それぞれの雨雲情報を表示可能
- 画像をクリックするたびに、現在→1時間後→2時間後→…→6時間後→アニメーション表示を切り替え可能
-- 「何時間後」かは切り替え時にアニメーションでスマートに表示
- 英語表示にも対応
-- OSの言語環境で切り替えられます
- まるで子供が書いたようなちゃちなアイコン
#image(image_front.png,title=イメージ画像,center)
** こんな方にオススメ！
とりわけ以下のような方に、WeatherRadarのご利用をオススメします。

- 自転車通勤をしていて、帰り時の雨が気になる方
- 外回りに傘を持っていくべきか決めかねている営業の方
- 今日の少年野球の練習が雨で潰れてほしいと願っているインドア志向のお友達
- プロ野球中継のせいでアニメが中止になると困る、大きなお友達
- 日本で頑張っている外国人の皆さん
- 雨雲の動きを見ているだけでごはんが3杯いける方

ウィジェットの小窓から、ほんの少し先の未来を覗きましょう。

※このウィジェットは、[[Livedoor天気情報の雨雲予報&gt;http://weather.livedoor.com/rader]]の情報を利用させてもらっています。

* プログラム名
「雨雲のようす（英語名：WeatherRadar）」

** 現在の最新バージョン
「バージョン1.0.0」[[ダウンロードする&gt;http://sourceforge.jp/projects/weatherrader/downloads/37478/WeatherRadar_1_0_0.zip]]」(直リンク)

** Changelog
#center(){
|BGCOLOR(lightgray):&amp;strong(){日付}|BGCOLOR(lightgray):&amp;strong(){トピック}|BGCOLOR(lightgray):&amp;strong(){コメント}|
|2009/2/5|ニュース|バージョン1.0.0をリリースします。今後は派生機能の追加がメインストリームになると思いますので、皆さまどうぞよろしくお願いします。|
|2008/12/15|ニュース|ライセンスを変更します。Appleの著作物(ボタンなど)を使用しているので、自作したmain.jsのみMITライセンス、それ以外の部品についてはAPPLEのライセンスを適用することにします。|
|2008/12/03|お詫び|レーダーってRaderではなくてRad&amp;strong(){a}rですよね・・・&amp;br()0.3.1としてマイナーリリースさせてください。&amp;br()恥ずかしすぎます・・・。|
|2008/11/27|リリース|バージョン0.3をリリース。UIをより分かりやすく変更しました。&amp;br()あと、アニメーションが不安定だったのを修正しました。|
|2008/11/27|ニュース|ソースコード管理を[[SourceForge.JP&gt;http://sourceforge.jp/projects/weatherrader]]に移しました。|
|2008/11/20|ニュース|[[Appleのダウンロードサイトに載りました&gt;http://www.apple.com/jp/downloads/dashboard/information/widgetradar.html]]！|
|2008/10/31|リリース|バージョン0.2をリリース。画像を最新の情報に更新する方法(Command+R)を裏面に明記。&amp;br()日本語ウィジェット名にする方法はいまだ分からず・・・。|
|2008/10/17|リリース|バージョン0.1として初リリース。|
|2008/10/16|ニュース|プロジェクト開始。気持ちの良い秋晴れの日でした。|
}

* 動作環境
MacOSX10.4.3以降のDashboardです。

Tigerを使っている皆さん、特にわが家の旧いiMac(大福の最初期型)をPantherのまま押しつけてしまった実家のお父さんお母さん、ごめんなさい（レーダーをRaderと書いてしまったことも含めて）。

* ライセンス(2008/12/15修正)
Apple作成のボタンなどを使用していますので、それらについてはウィジェット内のlicense.txtの内容を適用します。が、自作したmain.jsについてはMITライセンス（条項を若干緩めてあります）とします。
main.jsについて詳しくは[[ライセンスについて]]を参照してください。

* ダウンロード
&amp;strong(){※2008/11/27から[[SourceForge.JP&gt;http://sourceforge.jp]]にてソース管理をすることにしました。}

&amp;blanklink(こちらのダウンロードページ){http://sourceforge.jp/projects/weatherrader/releases/}(別ウィンドウで開きます)から最新版をダウンロードしてください。

* インストール・アンインストール
** インストール
ダウンロードしたバイナリのzipファイルを解凍し、中に入っているWidgetアイコンをダブルクリックしてください。それだけです。

** アンインストール
Dashboardの「ウィジェットを管理...」から削除してください。また、このウィジェットとは金輪際関わりたくないあなたは「~/ライブラリ/Preferences/widget-com.katokichi.widget.WeatherRadar.plist」にある設定情報も削除してください。寂しいですが、これでもう完璧です。

※旧バージョンを使用していただいた方は、「~/ライブラリ/Preferences/widget-com.katokichi.widget.WeatherRad&amp;bold(){e}r.plist」が残っている可能性があります。バージョン0.3.1以降では必要のないファイルですので、現在ご愛用いただいている方もお手数ですが削除してください（実害はありません）。

* 使用方法
Dashboardで画面上に表示させ、思う存分見てください。

** 表示する県の選択
右下の「i」マークをクリックして裏面にひっくり返し、雨雲情報を表示したい県を選択してください。「完了」ボタンで設定が反映されます。
#image(image_back_0_2.png,title=県の選択,center)
デフォルトは長野県です。なにしろボクが長野県民ですし、それにちょうどリストの真ん中あたりに位置しているので使いやすいはずかな、と。
#image(image_okinawa.png,title=沖縄の画像,center)
うわ、沖縄は大雨ですね。
** 見ている情報の切り替え(ver0.3で更新)
ウィジェット上にマウスを持ってくると、現在の表示情報と左右矢印が表示されます。右矢印の領域をクリックすると「アニメーション」から「現在の雨雲状況」、「1時間後の雨雲予報」、「2時間後の雨雲予報」、…と正順で画像が変化していきます。左矢印は逆順に回ります。
#image(image_ui_0_3.png,title=切換前,center)
#center(){右矢印エリアをクリックすると・・・}

#image(image_uiafter_0_3.png,title=切換後,center)
#center(){情報が切り替わりました!!}

** 画像のリロード
画像は、再読み込みするまでは同じ画像を表示し続けます。現在の情報を再取得したい場合は、「Command+R」でウィジェットをリロードしてください（現在対策を検討中）。
* 注意事項
現在、以下の制限があります。
- [[Livedoor天気情報の雨雲予報&gt;http://weather.livedoor.com/rader]]を利用しているため、同サイトに問題があると不思議な画像が出てきます(出てきたことがあります)。

* TODO＆今後実装予定の機能
- ■ RaderをRad&amp;strong(){a}rに修正（0.3.1で修正）
- ■ クリック切り替えが効かない問題の解決
-- 0.3で解決
- □ ユーザビリティの改善（47都道府県のリストは長すぎます）
- □ アイコンの改善
- ■ なぜかウィジェットが日本語にローカライズされない問題の解決(原因判明。仕様とします)
-- DashCodeで保存するときに言語環境に依存した名前で保存しないと駄目なことが判明。なので「雨雲のようす」で保存していれば、英語環境では「WeatherRadar」に自動的に変化してくれる。
-- ただ、すでに&amp;s(){WidgetRader} WeatherRadarでたくさんの方が利用してくれているため、名前の変更はインパクトが大きい。→ というわけで仕様にさせてください。今後に生かしますので。
- ■ フェードイン・フェードアウトアニメーションの改善
-- 0.3で解決
- ■ 画面のクリック箇所による挙動の変化（左側のクリックで時間を戻したり、など）
-- 0.3で改善。左右の領域で挙動を変化させられるようになりました。
- ■ 表示中の時間情報を分かりやすくする
-- 0.3で改善。マウスオーバーで情報が表示されます。
- □ 他の天候情報の表示
- ■ [[リロード中に長野県が表示されてしまう&gt;http://sourceforge.jp/ticket/browse.php?group_id=3902&amp;tid=14958]]
-- 1.0.0で修正。ユヤマさん、ご指摘ありがとうございました。

* コメント
不具合報告、改善要望、なんでもどうぞ。
- 表示する県について。 &amp;br()裏面の設定パネルって何ですか？  -- calm  (2008-12-09 21:05:41)
- ご質問ありがとうございます。&amp;br()雨雲画像が表示されている時に右下に「i」ボタンが表示されています。このボタンをクリックした時に表示される画面のことです。 &amp;br()考えたのですが、「裏面にひっくり返し」という表現の方が分かりやすいですね。 &amp;br() &amp;br()説明の仕方が悪くてすみません。「標示」→「表示」の誤字も含めて修正しておきました。&amp;br()ありがとうございます。  -- かときち  (2008-12-09 23:07:21)
- 京都府  -- ibuki  (2008-12-12 00:08:53)
- ibukiさん、コメントありがとうございます。 &amp;br()「京都府」というご指摘、これは一体何を現しているのでしょうか。 &amp;br()・文字の間違い &amp;br()・場所の間違い &amp;br()両方を最新版(0.3.1)で確認したのですが、問題はなさそうでしたが・・・。  -- かときち  (2008-12-12 14:39:48)
- 使って見たいです  -- 菅野　純  (2008-12-19 02:58:49)
- 菅野さん、コメントありがとうございます。 &amp;br()そう言っていただけると嬉しいです。 &amp;br() &amp;br()将来何かのご縁で使う機会がありましたら、ご希望の機能なりおっしゃってくださいね。  -- かときち  (2008-12-21 22:18:17)
- いいですねこれ。私も自転車でよく出かけるのでたすかります。 &amp;br()ただ、コマンドRでリロードすると設定した県から長野県に戻ってしまいます。  -- ユヤマ  (2009-01-31 11:02:28)
- ゆやまさん &amp;br()自転車は楽しいですよね。活用していただいてうれしいです。 &amp;br() &amp;br()リロードすると長野県に戻ってしまうとのこと、ご迷惑をおかけしています。 &amp;br()確かに最初だけ長野県は表示されるものの（初期設定中は長野を表示するため）、私の環境ではその後元の県に戻っています。 &amp;br()ダウンロードページから最新版(0.3.1)を試してみても同じでしょうか。 &amp;br() &amp;br()調べてみます。 &amp;br()いずれにせよご指摘ありがとうございました。 &amp;br()不具合連絡でも、とても嬉しいものです。  -- かときち  (2009-02-04 00:32:47)

- NOコメント &amp;br()  -- yuuya  (2010-06-14 19:28:03)
- 改良要望 &amp;br()１、ここのページへのリンクを貼ってください。 &amp;br()２、全面雨だと地形がまったく見えなくなります。どこかをクリックするかロールオーバーしたら雨雲表示を一時的に消す仕様を考えてください。  -- たく  (2010-09-08 14:29:19)
- 2011-04-01以降2011-03-31のデータが表示され続けています． &amp;br()修正お願いします．  -- dog  (2011-04-08 03:07:30)
- 上と同じ現象です。いつも活用させてもらってます。 &amp;br()よろしくお願いします。  -- トントン  (2011-04-08 03:20:54)
- 日付が変わりません。というか、進んで行きません。 &amp;br()上と同じ現象です。  -- 困っています。  (2011-04-18 01:36:59)
- これで使えなくなるのは残念なんだけど・・  -- emon  (2011-05-07 03:37:36)
- 上の方々と同じ症状です。現在が表示されません。。。何とかして下さい〜  -- akira  (2011-05-26 02:11:28)
- Livedoorはサービスをやめてしまったみたいなので &amp;br()Yahoo!から取得するようにできないでしょうか。 &amp;br()http://weather.yahoo.co.jp/weather/raincloud/ &amp;br()暇なときでいいのでご検討ください。  -- MNO  (2011-06-13 00:28:30)
- 晴れの日限定でバイク通勤してるので、うれしいガジェットです。 &amp;br()もっと画面が大きい（ライブドアの天気予報と同じ大きさ）と見やすいんですが… &amp;br()ガジェットということで、あえて小さくしてるのでしょうか？  -- せい  (2011-08-07 21:12:55)
- ガジェットじゃなくてウィジェットでしたね。 &amp;br()失礼しました。  -- せい  (2011-08-07 21:15:57)
#comment(vsize=2,nsize=20,size=40)

（&amp;counter()）    </description>
    <dc:date>2011-08-07T21:15:57+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/41.html">
    <title>秀丸からEmacsへ移行する</title>
    <link>http://www23.atwiki.jp/selflearn/pages/41.html</link>
    <description>
      #right(){（&amp;counter()）}
*秀丸からEmacsにエディタ環境を移行するためのチートシート
このページでは、秀丸の色々な機能をEmacsではどのように実現するかを記します。

最終更新日：&amp;update(j)
----
*前置き
**秀丸は良いソフトです
[[秀丸&gt;http://hide.maruo.co.jp/]]は言わずとしれた有名エディタで、開発業務を行っている人にとってなくてはならないアプリです（若干の誇張有り）。強力かつ高速な編集機能、かゆいところに手が届く機能、などなど。
これがなければ皆の生産性は半分以下に落ちてしまうと思います（若干の誇張有り）。使いこなせば使いこなすほど馴染んでくる、というカスタマイズ性の高さも素晴らしい。
その辺はおあつらえのIDEじゃ味わえないです。もうね、開発者だったらどんなことがあっても入れて使いこなせるようになっておくべき、とも思うくらい。

バージョンが上がるごとに「この機能がほしかった」というツボな機能が入ってくるところもね。開発者のことを大切にしてくれているな、という気持ちにさせてくれる「分かっている」アプリなのです。

**でもね・・・
いいところだらけの秀丸ですが、「Windowsでしか動かない((Wineでも実行できるのは知っていますが、範囲選択した時に文字が消えてしまうので実質使えません（それ以外は大丈夫だけど）。))」という最大かつ致命的な欠点を持っているソフトでもあります。

僕の場合、職場はWindows、自宅ではMacを使っているわけで、つまり自宅での生産性が半分以下に落ちてしまっているわけです（かなりの誇張有り）。とはいっても帰宅してからもWindowsの汚い画面なんか見たくないので、しょうがないです。え、Vista？UACが嫌いだから却下。

趣味で色々とプログラミングをしていると、自宅でも職場と同じような効率で作業したいという心境になってきてしまいます。でもMacに秀丸はない。
しばらく悶々としていました。で、色々試したり考えたりした結果、同じように「馴染み方が半端でない」といわれるEmacsを使っていくことに決めました。理由は、
-EmacsならLinuxもWindowsもMacでも同じ操作ができる
-Xcodeは便利だが、Mac専用なので根本的な解決になっていない（覚える量が２倍になるだけ）
-Emacsは「カスタマイズできる環境」なので、自分の好きなようにできる
-viと違いマウスで操作できる
です。

というわけでこのページを使って、環境の引っ越しに向けて秀丸の色々な機能をEmacsでどのように実現するかをまとめることにしたのです。

:注意|Emacsのターゲットは[[Carbon Emacs&gt;http://homepage.mac.com/zenitani/emacs-j.html]]とします。つまり、ここでは特別なもの以外はすでにEmacsに組み込まれているとみなし、導入方法を説明したりはしません。あくまで代替手段のコマンド一覧を示すのみです。

*目次
#contents(fromhere=true)
*まとめる前に
さて、まとめ資料を作る前に、自分が秀丸のどういう機能を使っているかを洗い出します。

**よく使っている機能
まず「この機能はないと困る！」という機能の一覧を考えます。秀丸で馴染んでしまった操作であり外せない機能の一覧です。ただEmacsでどこまで代用できるか分からないので、優先度も付けてみました。

|重要度|機能|説明|
|必須|tagsファイルによるジャンプ|C/C++ファイルで、現在のカーソルが示す関数の実態へとジャンプする。バックジャンプも可能|
|必須|Grep|複数のソースファイルからキーワードにマッチするキーワードを抜き出して、一覧表示する。ここから更にダイレクトジャンプ＆バックジャンプができること|
|必須|関数一覧表示|ファイル内に記載されたCやC++などの関数一覧を別ダイアログorウィンドウで表示しておき、今はどの関数にいるか、マウスクリックによる関数先頭への移動が行える|
|高|キー入力の記録＆再生|あるキー入力をトグルに動作を記録し、その後再生できる|
|高|検索履歴による再検索|以前使った検索キーワードを使って、再検索する。ダイアログボックスから履歴を選択できる。これにより置換する前に検索で正規表現を試し、実際に使用、というテストファーストな編集ができる|
|高|最後に編集した箇所に移動|最後にキー入力した箇所にカーソルを移動する。編集中、別の場所でコピーをしてから本機能で編集中の場所に戻ってペースト、というのが非常に簡単。Wordだとコピーしたときの場所を最後の編集箇所として認識されてしまうが、それは違う！わかってない！|
|中|検索方向の切り替え|検索方向をキー１つで切り替えられる|
|中|キー入力によるファイルの切り替え|キー入力によって、編集対象のファイルを切り替える機能。どのファイルを開いているかもすぐに分かる|
|中|文字コード表示＆保存|開いているファイルの文字コードを常に表示しておく。保存する際も文字コードと改行コードを指定できる|
|中|マクロ外コードのグレイアウト|#if 0や未定義のマクロで括られた部分をグレイアウトする。グレイアウトするかどうかは別途定義しておく必要があるものの、大規模な年老いたソースを読む場合には必須|
|中|前回編集箇所への移動|ファイルを開いた時に、以前編集していた場所に移動する|
|低|日付の入力|カーソルの位置に今日の日付を入力する。秀丸ではマクロで実現|
|低|一括コメントアウト|選択した領域のコメントアウト。秀丸ではマクロで実現|

一方でEmacsを少しかじってみると、Emacsのデフォルト設定では次のような振る舞いが気になります。これも直せないか調べてみようと思います。

|気になる度|機能|気になる点（どうなってほしいか）|
|中|タブ文字の入力|Tabキーを入力したときのインデントが空白文字で行われる。これはこれで綺麗だけれど、他のWindows開発者に合わせて、タブ文字でタブを入力したいときもある|
|中|行番号の表示|Emacsでは行番号をウィンドウ左側に表示できない？|
|中|選択領域の明示|選択領域をハイライトまたは反転させる。どこが選択領域の最初かなんて覚えていません。|
|中|PCライクな操作|Shift＋矢印キーで領域選択する。記憶のすみでは[始点選択]→[終点選択]という前時代的なインタフェースだった記憶があるので。|
|中|矩形選択|矩形領域の選択。Emacsで出来るのは知っているけど、入力キーが面倒だし・・・|

さらに欲目を出して、こんなことが出来たらという点も挙げてみましょう。

|ほしさ度|機能|説明|
|高|diff|Diff+Mergeを、日本語表示に対応させた上で実現する|
|中|ソースコード補完|tagsファイルなどから、入力しようとしている関数名を補完する機能|

でも高望みはしません。まずは秀丸でよく使う機能をまとめてから、です。
**ゴールの設定
上記の一覧表から、次をゴールに設定します。
-それぞれの表で出た機能を実現する方法を示す
--秀丸でよく使う機能は必ず探し出す
--気になる点も必ず
--できたらいいなはできるだけ
-Emacsのキーバインドをできるだけ維持する
--きっと秀丸と同じ操作性にすることもできるんでしょうが、それだと何か違うと思う

*秀丸のそれ、Emacsではどうやるの？
**ないと困る機能
***tagsファイルによるジャンプ
etagsでTAGSファイルを作成して、そして・・・とか考えていたけれど、どうやら[[gtags&gt;http://www.gnu.org/software/global/global.html]]というのがヨサゲ。GNU GLOBALと言う、いわばetagsやctagsの高機能版（統合版?）のようなもの。BerkleyDBに関数や変数の定義を登録して、情報を出力してくれるみたい。

|注意：gtagsといっても[[Google tags&gt;http://google-code-updates.blogspot.com/2007/03/google-gtags-version-10.html]]のことではないので気を付けて（間違えないとは思うけどね）。|

インストールは簡単。MacPortsを使って、
 $ sudo port install global
とするだけ。
そうすると「/opt/local/var/macports/software/global/5.6.2_0/opt/local/share/gtags」ディレクトリの下に「gtags.el」が置かれているので、これをCarbon Emacsのsite-lispディレクトリにコピー。
あとは.emacs.elに

#highlight(lisp){{
;; GNU global(gtags)の設定
(when (locate-library &quot;gtags&quot;) (require &#039;gtags))
(global-set-key &quot;\M-t&quot; &#039;gtags-find-tag)     ;関数の定義元へ
(global-set-key &quot;\M-r&quot; &#039;gtags-find-rtag)    ;関数の参照先へ
(global-set-key &quot;\M-s&quot; &#039;gtags-find-symbol)  ;変数の定義元/参照先へ
(global-set-key &quot;\M-p&quot; &#039;gtags-find-pattern)
(global-set-key &quot;\M-f&quot; &#039;gtags-find-file)    ;ファイルにジャンプ
(global-set-key [?\C-,] &#039;gtags-pop-stack)   ;前のバッファに戻る
(add-hook &#039;c-mode-common-hook
          &#039;(lambda ()
             (gtags-mode 1)
             (gtags-make-complete-list)))
}}

と記述しておく。キーバインドは上記のコマンドを参照。
GNU GLOBALの便利なところは、更新したぶんだけTAGファイルを作り直してくれるところ。だから２回目以降は速い、速い。
 $ global -u
とするだけです。

ただ、現時点ではなぜかcppファイルで「extern &quot;C&quot; {...}」内に定義した関数をタグ(GTAGS)として登録してくれない((M-sでのシンボル(GSYMS)としてなら、普通のgrepのように使用できるけど…))。なぜだろう?？.globalrcと各コマンドのmanページを読んでみたけど分からない…。

2008/10/29追記
どうやら[[既知のバグ&gt;http://lists.gnu.org/archive/html/bug-global/2007-07/msg00003.html]]らしいです。MacPortsでのバージョンが5.6.2だったので、[[Portfileをゴニョゴニョして&gt;MacPortsのPortfileをゴニョゴニョする]]最新版の5.7.2(2008/9/30リリース)を試してみたのですが、やはり駄目でした。
2008/11/12追記：
このバグを直すパッチが採用されたようです。将来のリリースでは問題なくなりそうなので嬉しい。GLOBAL最強。

***Grep
これを選ぶのは悩みました。最初はgrep-findをしていたけれど、どうも使いづらい（遠回りに作業をしている）感じがしてダメで、しばらくは[[color-moccur&gt;http://www.bookshelf.jp/soft/meadow_50.html#SEC742]]を使っていました。
#highlight(lisp){{
;; color-moccurの利用宣言と、その設定
;; (moccur-editもインストールしました)
;; Ref.URL: http://www.bookshelf.jp/soft/meadow_50.html#SEC740
;; - .svnは対象外とする
;; - カーソル付近の単語をデフォルトの検索語にする
;; - 複数の単語を、記入順序に関係なく検索する
(load &quot;color-moccur&quot;)
(setq dmoccur-recursive-search t)
(setq moccur-grep-default-word-near-point t)
(setq moccur-split-word t)
(setq dmoccur-exclusion-mask (append &#039;(&quot;\\~$&quot; &quot;\\.svn\\/\*&quot; &quot;\\.o$&quot;
                                       &quot;GPATH&quot; &quot;GRTAGS&quot; &quot;GSYMS&quot; &quot;GTAGS&quot;)
                                     dmoccur-exclusion-mask))
}}
だけど、除外ファイルも一度検索リストに入れられてしまうので遅いという、けっこう重大な欠点があったので次第に使わなくなってしまいました。

で、紆余曲折のすえに現在使っているのは以下の機能。

まずMacPortsで&quot;p5-app-ack&quot;をインストールしてackコマンドが使えるようにしておきます。そして、それと[[color-grep.el&gt;http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&amp;node=color-grep]]を併用して、
- grepを高速に。しかも.svnなどの管理ファイルは最初から無視してくれる
- grep結果バッファでカーソルを移動するだけで別バッファに該当ファイルの行を表示してくれる
という機能を満たすことができました。
#highlight(lisp){{
;; grep結果バッファでのカーソル移動でダイナミックにファイルを開いてくれる
(require &#039;color-grep)
(setq color-grep-sync-kill-buffer t)
;; M-x grep-findでPerlのackコマンドを使うよう変更
(setq grep-find-command &quot;ack --nocolor --nogroup &quot;)
}}
あとは上記機能にmoccur-grep-default-word-near-pointに相当する、コマンド実行時のカーソル近辺の単語を自動入力してくれる機能があれば完璧です。改造して、作れないものだろか。

2008/11/12追記：
「コマンド実行時のカーソル近辺〜」が自作できました。.emacs.elに以下の定義を追加して、M-x grep-by-ackまたはF6キーで実行できるようにしました。
#highlight(lisp){{
;; M-x grep-by-ack
;; Perlのackコマンドを使ったgrep(カーソル付近の単語をデフォルトの検索語に)
(defun grep-by-ack ()
  &quot;grep the whole directory for something defaults to term at cursor position&quot;
  (interactive)
  (setq default-word (thing-at-point &#039;symbol))
  (setq needle1 (or (read-string (concat &quot;ack for &lt;&quot; default-word &quot;&gt;: &quot;)) default-word))
  (setq needle1 (if (equal needle1 &quot;&quot;) default-word needle1))
  (setq default-dir default-directory)
  (setq needle2 (or (read-string (concat &quot;target directory &lt;&quot; default-dir &quot;&gt;: &quot;)) default-dir))
  (setq needle2 (if (equal needle2 &quot;&quot;) default-dir needle2))
  (grep-find (concat &quot;ack --nocolor --nogroup &quot; needle1 &quot; &quot; needle2)))
}}
これでOK。実行すると
+ファイル名（デフォルトはカーソル上の単語）
+検索パス（デフォルトはコマンドを実行したバッファのカレントディレクトリ）
を順番に聞いてきます。

便利、便利。ちなみに参考にしたのは米Slashdotの[[こちら&gt;http://news.slashdot.org/comments.pl?sid=1021471&amp;cid=25674869]]です。

***関数一覧表示
 [M-x speedbar]
これ、予想以上でした。VisualStudioやEclipseのようなソースツリービューを表示してくれる。[f11]などの最高位のキーに設定してしまう価値は十分にあります。

と思ったら、[[Emacs Code Browser&gt;http://ecb.sourceforge.net]]などというすごそうなElispも発見。Carbon Emacsには含まれていないので調査が必要かな・・・なんて思ったけれど、[[スクリーンショット&gt;http://images.google.com/imgres?imgurl=http://ecb.sourceforge.net/screenshots/1.png&amp;imgrefurl=http://ecb.sourceforge.net/screenshots/index.html&amp;h=797&amp;w=1041&amp;sz=91&amp;hl=ja&amp;start=1&amp;sig2=yW4k1Ph-v9tRXUrrGJcO2Q&amp;um=1&amp;usg=__vLZRy2RIDzIX5tF86aWwe2Buk3s=&amp;tbnid=xjoTB52LPTl0jM:&amp;tbnh=115&amp;tbnw=150&amp;ei=QvEHSYD2IJjyswLR-6mLBA&amp;prev=/images%3Fq%3DEcb%2BEmacs%26um%3D1%26hl%3Dja%26lr%3D%26client%3Dsafari%26rls%3Dja-jp%26sa%3DN]]を見る限りちょっとやり過ぎな感がしたので触らないことにした。

2009/04/15追記：[Googleから「nav」というのが出ていた&gt;http://google-opensource.blogspot.com/2009/03/nav-ide-like-navigation-pane-for-emacs.html]。プロジェクトホームにあるスクリーンショット(下に転載)を見てみると、speedbarと異なり同じウィンドウ内でファイルを表示してくれるのが何だかヨサゲ。早速インストールしてみた。起動は「M-x nav」。

#image(http://emacs-nav.googlecode.com/files/nav_screenshot_3.png,width=450,center)

うーん・・・ダメだこれ。ファイルを表示してくれるだけで関数一覧は表示してくれない。１キーで色々できるのは良いんだけど、ちょっとボクの目的からは外れているのでパス。

***キー入力の記録＆再生
 記録開始：[F3]or[C-x (] ／ 記録終了：[F4]or[C-x )] ／ 再生：[F4]or[C-x e]
[F3]や[F4]はEmacs 22より古いバージョンでは使用できないとのこと。
Emacsではマクロと呼ぶ。直前のマクロを編集する場合は[C-x C-k e]と入力してからリターン([C-x e]も可)。編集後は[C-c C-c]で確定。マクロを保存して再利用するのは若干面倒で、
+マクロに名前を付ける
++[C-x C-k n]でマクロ名を付加（セッションを閉じるまでは[M-x マクロ名]で実行可能）
+名前を付けたマクロをファイルに展開、保存する
++.emacsか適当なファイルにて[M-x insert-kbd-macro Enter マクロ名 Enter]と入力し、マクロをelispで展開
++ファイルを保存。.emacs以外のファイルに保存した場合は、.emacsにて「(load-file &quot;パス付きのファイル名&quot;)」を記述しておく
+[M-x マクロ名]で実行
という手順を踏む。キー割当も行いたい場合は、同じく.emacs上で「(global-set-key &quot;¥C-x¥C-kT&quot; マクロ名)」と記述しておく(Tの場合)。

ちなみにマクロに割り当てられるキーは、[C-x C-k 0〜9またはA〜Z]のみなので要注意。
***検索履歴による再検索
 検索やファイルオープンのときに[M-p]を押すだけ
[[イヤなブログ著者のサイト&gt;http://0xcc.net/unimag/3/]]にある、minibuf-isearch.elやsession.elが使えるかどうか調査したりもしたのですが、そんなことをしなくても大丈夫でした。
***最後に編集した箇所に移動
とりあえず簡単な方法は、[C-¥]→[C-g]→[C-¥]でUndoしてからRedoで戻せば何とかなるけれど、一度操作を取り消すのがちょっとリスキー。

そこで色々と検索したら[[goto-chg.el&gt;http://www.emacswiki.org/cgi-bin/wiki/goto-chg.el]]というEmacsLispを発見。ファイルを開いてから変更した箇所へ移動できる(しかも辿っていける)とのこと。
ただ、同サイトでのキーアサインはGNU Globalとバッティングしてしまうので、普段の自分のアサイン[F5](逆方向へ辿る時はShift+[F5])を試してみました。
#highlight(lisp){{
;; [F5]で最後に編集した箇所へ辿る
;; Shift-[F5]で編集箇所を逆方向に辿る
;; http://www.emacswiki.org/cgi-bin/wiki/goto-chg.el
(require &#039;goto-chg)
(global-set-key [f5]   &#039;goto-last-change)
(global-set-key [S-f5] &#039;goto-last-change-reverse)
}}
そしたら、おぉ、まさに秀丸のと同じかそれ以上の機能が！素晴らしい！
***検索方向の切り替え
 順方向：[C-s]、逆方向：[C-r] ※かみむらさんにM-sではなくC-rだと指摘してもらいました。THX!
 単語検索：[C-s Enter C-w] ※ただし、次の候補を探しにいってくれない！
ただ、この検索方法だと大文字小文字の区別無く、単語かどうかの判定もできません。秀丸だと検索用ダイアログボックスのチェックボックスで、
- 大文字/小文字を区別する
- 単語として検索
- 正規表現の適用
を切り替えられる(検索している途中でも)ので、これだけだとちょっと不便。調査中。

と、ここで問題発生。単語として検索したとき、いったん検索すると次候補に[C-s C-s]してしまうと普通の検索モードになってしまう。この回避方法はないみたいで、さてどうしたものか。

−−2chで聞いたところ、「ないよ」とか「そんなあなたにmoccur」「Redoは？」と答をくれた。Redo, Redo+はダメだったけど、moccurは調べれば何とかなりそう？[[moccur関連全部入りのcolor-moccurはこちら&gt;http://www.bookshelf.jp/soft/meadow_50.html#SEC736]]。

2008/8/6：単語検索を連続する方法に気が付いた。なんだ、正規表現で単語を表せばいいんだ。
 単語検索：[C-M-s] \&lt;hogehoge\&gt;
 検索を続けるとき：[C-s], [C-r]
気付けば簡単でした。

ちなみにインクリメンタルサーチ中にバックスペースキーを入力するとメイン画面の文字が削除されてしまうのは、以下の設定を.emacs.elに記述しておけば良いことが判明。
#highlight(lisp){{
;; backspaceキーをインクリメンタルサーチ中のミニバッファで有効にする
(define-key isearch-mode-map [backspace] &#039;isearch-delete-char)
}}
参考にしたのは[[こちらのサイト&gt;http://d.hatena.ne.jp/willnet/20080402/1207106138]]。ありがとうございました。
***キー入力によるファイルの切り替え
 [C-x C-→]または[C-x C-←] （矢印は矢印キーを表す）
[C-x b]や[C-x C-b]もいいけれど、一番手軽。ちなみにウィンドウやフレーム間の移動は、
 [C-x 2]などで作成したウィンドウ間の移動：[C-x o]
 [C-x 5 2]などで作成したフレーム間の移動：[C-x 5 o]
と入力する。・・・けれど、フレーム間の移動はちょっと面倒くさい。そこで調べてみたところ(other-frame x)でxに渡す値でアクティブなフレームを切り替えてくれることが判明。逆戻りは負数を与える。
というわけで、[C-x C-↑][C-x C-↓]に登録してみた。
#highlight(lisp){{
;; C-x &lt;C-left/right&gt;でバッファの切り替え
;; C-x &lt;C-up/down&gt;でフレームの切り替え
(global-set-key [?\C-x C-up] &#039;(lambda () &quot;&quot; (interactive) (other-frame -1)))
(global-set-key [?\C-x C-down] &#039;(lambda () &quot;&quot; (interactive) (other-frame 1)))
}}
あ、これ便利だ。
***文字コード表示＆保存
どうやるの？
***マクロ外コードのグレイアウト
どうやるの？
***ファイルを開いた時に、以前編集していた場所に移動
以下を.emacs.elに記述するだけです。saveplace.elはCarbonEmacsに最初から含まれています。
#highlight(lisp){{
(load &quot;saveplace&quot;)
(setq-default save-place t) }}
これによって「最後にカーソルのあった場所((「最後に編集した場所」ではないので注意。))」に移動してくれます。
***日付の入力
どうやるのだろう？EmacsLispで簡単にできそうな気もするけれど。

→ 2008/10/29現在、ATOKをインストールしてしまったので「きょう」や「いま」を変換すれば日付や時刻が入力できるようになってしまいました。
***一括コメントアウト
 事前に範囲を指定しておいて[M-;]（セミコロン）※かみむらさんTHX!
 ※範囲指定していない場合はカーソルのある行の末尾にコメントが追加され、そこにカーソルが移動してくれる
このM-;は結構インテリジェントで、範囲選択していない状態では行末にコメントを追加し、その真ん中にカーソルを持ってってくれる。便利！
**気になる点
***タブ文字の入力
[M-i]でハードタブ（空白記号ではない、¥t）が入力される。
ただしバックスペースで削除する時はタブ文字から空白になって消されていくし、また自動インデントの種類によってはタブではなく2文字の空白で表されてしまうので、本格的にタブだけで使用するには結構なカスタマイズが必要っぽい。

2008/9/9追記：
空白になって消されていくのは、Backspaceキーにbackward-delete-char-untabifyというように「非タブ化しつつバックスペース」というコマンドがバインドされていたことが原因だった。なので
#highlight(lisp){{
 (global-set-key [backspace] &#039;backward-delete-char)
}}
と.emacs.elに記述して問題解決。
***行番号の表示
他所様の作ったものを使うしかない模様。Webを漁ってみると、どうも有名どころとして３つあるみたい。
-[[wb-line-number.el&gt;http://homepage1.nifty.com/blankspace/emacs/wb-line-number.html]]
-[[setnu.el(&amp;setnu+.el)&gt;http://www.wonderworks.com/download/setnu.el]]
-[[linum.el&gt;http://stud4.tuwien.ac.at/~e0225855/linum/linum.html]]
まずwb-line-number.elは、ダウンロードしたwb-line-number.elをrequireして、適宜ONにすればOK。
#highlight(lisp){{
(require &#039;wb-line-number) ;;← これを.emacs.elに追加
(wb-line-number-toggle) ;; ← こちらは適宜呼んであげる
}}
でも、Carbon Emacs上で試したら下図のように行を正しく認識してくれなかった。なぜだろう？？

#image(strange_wb.gif,width=450,center)

そこでsetnu.elを調べてみると、これは・古い、・バグが多い、・修正版として用意されたsetnu+.elがリンク切れ、というように全然使えなかったのでパス。
結局、最後のlinumが一番シンプルで良かったのでこれを使うことにした。使い方はsetnu.elとほぼ同じ。
.emacs.elに
#highlight(lisp){{
(require &#039;linum.el)
}}
と記述しておき、表示するときは
 M-x linum-mode
とするだけ。

#image(linum.gif,width=450,center)

ちなみにemacs.elによく書かれている(line-number-mode t)はモードラインに現在行を表示させるだけで、linum-modeのように画面の左側に行番号情報を表示してくれるわけじゃない。(column-number-mode t)も同じで、モードラインに桁数を表示するだけで違うから注意。

**あったらいいな
***diff+Mergeを、日本語表示に対応させた上で実現
どうやるの？ediffはいいけれど、ファイルの文字コードを自動判別してくれるわけではないみたい(Windowsと開発環境が混在しているとShift-JISも混じってきて面倒)。さて、どうしたものか。

***入力しようとしている名前を補完
どうやるの？ac-modeが使えそうだけれど、今後消えゆく運命にありそうなEmacsLispなので、代替物を探さねば。

***選択領域をハイライトまたは反転させる
.emacs.elに以下の式を記述しておく
#highlight(lisp){{
(transient-mark-mode 1)
}}
Emacsのデフォルト設定だと、領域を選択している最中の選択箇所はハイライトされず、「今どこを選んでいるの？」というのが往々にして分からなくなりがち。この場合は上記のとおりに記述しておけばOK。領域を選択している際の色を変えられます。次の「Shift+矢印キー」と組み合わせて設定しておくと便利かな。
***Shift＋矢印キーで領域選択する
.emacs.elに以下の式を記述しておく
#highlight(lisp){{
(setq pc-select-selection-keys-only t)
(pc-selection-mode 1)
}}
これで大丈夫です。Mac OSXのCarbon EmacsはこれがデフォルトでONになっているみたいだけど、Meadow3.00ではOFFだったので記録しておこう。
***矩形領域の選択
.emacs.elに以下を追加しておき、
#highlight(lisp){{
(autoload &#039;sense-region-on &quot;sense-region&quot;
          &quot;System to toggle region and rectangle.&quot; t nil)
(sense-region-on)
}}
範囲選択している状態で
 C-SPC
を入力。

整形テキスト、テキストで書かれた表を取り扱うときに矩形選択機能があると便利です。秀丸ではこの機能があって、ボクはC-bに割り当てて多用していました。で、Emacsにも当然同じ機能があるわけですが・・・
- 入力が面倒くさい（デフォルトのキーバインド(C-x r k, C-x r y)が有り得ない。替えればいいけどさ）
- 矩形選択中なのに画面は通常選択のままでイメージが掴みづらい
というのが気になります。特に後者、常用するにはちと厳しい。

そこで見つけたのが冒頭に紹介した[session.el&gt;http://taiyaki.org/elisp/sense-region/]。これは便利で、範囲選択中にC-SPCすると通常選択と矩形選択を切り替えてくれます。しかも矩形選択中は矩形の選択領域が表示されますし、切り取りや貼り付けもC-w, C-yで出来ます((C-yで矩形として貼り付けるときにはC-y後のy/n入力待ちでnを選択してください))。
#center(){
|&amp;ref(line.png)|
before

|&amp;ref(rect.png)|
after!!
}

さらにこのEmacsLispには追加機能があって、領域を選択していないときにCtrl+[space] を繰り返すと単語がリージョンに追加されていってくれます。便利だ。

#center(){
|上記で紹介したサイトからのソースリンクが切れてしまっているので、載せておきます。&amp;br() http://taiyaki.org/elisp/sense-region/src/sense-region.el です。ページのリンク先には「www」が付いてしまっているようです。|
}
**その他
上の機能を探している途中で見つけた、「これも覚えておいた方がよいな」というコマンドや設定を書いておきます。
***マウスのホイールスクロールを加速させたくない
Emacsのマウスホイールの動き、なんだか他のアプリとは少し違うんですよね。少しでも回しすぎると一気に最後まで飛んで行ってしまうような。
どうもマウスを連続して回していると、wheel-up/downからdouble/triple-wheel-up/downというイベントに変わってしまっているみたいです。そこで振る舞いをカスタマイズしつつ、なじみやすい設定に落とし込んでみました。
#highlight(lisp){{
;; マウスのホイールスクロールスピードを調節
;; (連続して回しているととんでもない早さになってしまう。特にLogicoolのマウス)
(global-set-key [wheel-up] &#039;(lambda () &quot;&quot; (interactive) (scroll-down 1)))
(global-set-key [wheel-down] &#039;(lambda () &quot;&quot; (interactive) (scroll-up 1)))
(global-set-key [double-wheel-up] &#039;(lambda () &quot;&quot; (interactive) (scroll-down 1)))
(global-set-key [double-wheel-down] &#039;(lambda () &quot;&quot; (interactive) (scroll-up 1)))
(global-set-key [triple-wheel-up] &#039;(lambda () &quot;&quot; (interactive) (scroll-down 2)))
(global-set-key [triple-wheel-down] &#039;(lambda () &quot;&quot; (interactive) (scroll-up 2)))
}}
うわ、コレすごい快適。
使っているマウスがLogicoolのマウスで、例のMicroGear™スクロールホイールを使っていると速攻でdouble/tripleに移行してしまうので、すばらしい!

ちなみに参考にさせてもらったサイトは[[こちら&gt;http://d.hatena.ne.jp/negation/20080703/1215020674]]です。感謝です。
***「最近使ったファイル」をメニューに表示させる
 .emacs.elに以下の式を記述しておく
 (require &#039;recentf)
 (recentf-mode 1)
このメニューの設定は色々と変えられます。
***文字列の自動補完
 (M-x ac-mode)
上記はかなり賢い補完機能を持ってた。候補1つ1つがUndoの対象になってしまうところ以外は非の打ち所がないです。Emacsを使う上では必須機能に近い、と見ました。
[[公式サイトはこちら&gt;http://taiyaki.org/elisp/ac-mode/]]。

|※注意(2008/10/25)：[[CarbonEmacsの2008年秋版&gt;http://homepage.mac.com/zenitani/emacs-j.html]]ではac-modeが無くなるみたいです。|
***Subversionクライアント
psvn、ではなくて[[dsvn&gt;http://svn.collab.net/repos/svn/trunk/contrib/client-side/emacs/dsvn.el]]が便利。というのも[[このサイト&gt;http://openlab.dino.co.jp/2008/04/23/185154236.html]]に書いてあるとおり、作業中に?キーでキーバインド一覧を表示できるから。
#highlight(lisp){{
;; Subversion用の設定 (psvn.elとdsvn.elを併用)
;; (require &#039;psvn)
(autoload &#039;svn-status &quot;dsvn&quot; &quot;Run `svn status&#039;.&quot; t)
(autoload &#039;svn-update &quot;dsvn&quot; &quot;Run `svn update&#039;.&quot; t)
}}
熟練者にはpsvnでも良いんだろうけれど、ボクみたいな初心者にはdsvnがいいのです。
***対応する括弧に移動
 C-M-f/b または C-M-n/p
前者はS式、後者は括弧。どちらも便利だけれど、Cでは後者かな。ただ、C-M-というのは押しづらいので
#highlight(lisp){{
;; 対応する括弧に移動(C-M-f/p相当)
(global-set-key [?\C-{] &#039;backward-list)
(global-set-key [?\C-}] &#039;forward-list) }}
というようにC-{/}にアサインしておきました(本当はC-[/]にアサインしたかったけれど、C-[がESCキーと認識されてしまって対応できず。どうすれば良いんだろう？)。
*補足
**外部からダウンロードした.elファイルをCarbonEmacsにインストールする方法()
***CarbonEmacsアプリ下に保存（一番手っ取り早いが将来性がない）
手順は以下のとおりです。
+ .elファイルをダウンロード
+ .elファイルを「/Applications/Emacs.app/Contents/Resources/site-lisp/」にコピー
これだけ。ちなみにバイトコンパイルする場合は、同名のファイルを開いて、
 M-x byte-compile-file
で.elcファイルを作成しておけばオーケーです。
この方法は特別な設定が不要なところが利点ですが、CarbonEmacsのバージョンを更新したりすると全てご破算になってしまうのであまりオススメしません。
***.emacs.elでパスを指定し、そこに保存する（オススメ）
手順は以下のとおり。
+ .elファイルをダウンロード
+ .emacs.elのできるだけ最初の方でadd-to-listを記述
+ そこで指定したディレクトリに.elファイルをコピー
たとえば私の場合はホームディレクトリ下に.emacs.d/site-lispを作り、そこに保存しています。
#highlight(lisp){{
(add-to-list &#039;load-path &quot;~/.emacs.d/site-lisp&quot;)
(let ((default-directory (expand-file-name &quot;~/.emacs.d/site-lisp&quot;)))
  (normal-top-level-add-subdirs-to-load-path)
  )
}}
これだとCarbonEmacsを書き換えてもelファイルが残るのでオススメです。不可視ファイルに保存するのがイヤな人はディレクトリ名を適当に変更してください。
*参考にした情報
**Special Thanks
-かみむらさん。コメント欄で色々と教えていただきました。ありがとうございます。
**書籍
-[[入門 GNU Emacs&gt;http://www.amazon.co.jp/GNU-Emacs-%E7%AC%AC3%E7%89%88-Debra-Cameron/dp/487311277X]]
--このページ作成で最も使用した本。これがなければページを作ろうとすら思いませんでした。
-[[ GNU Emacsデスクトップリファレンス&gt;http://www.amazon.co.jp/GNU-Emacs%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-UNIX-text-processing/dp/4900900931/ref=sr_1_16?ie=UTF8&amp;s=books&amp;qid=1199715972&amp;sr=1-16]]
--あまり役立たなかったけれど、上の本よりは手元に置いておきやすいのでボチボチ使いました。
**インターネット
***国内
-[[秀まるおのホームページ&gt;http://hide.maruo.co.jp/]]
--秀丸のホームページ
-[[Wikipedia(ja)の記事&gt;http://ja.wikipedia.org/wiki/Emacs]]
--どちらかといえばEmacsの歴史を知りたい人向け。
-[[プリプロセッサで無効化されたコードをグレイアウトするにはどうしたらいいですか？&gt;http://q.hatena.ne.jp/1188197530]]
--表題の質問をはてなに出した人がいました。
-[[Rubyのメソッドの補完を行うanything-rcodetools.elをリリース&gt;http://d.hatena.ne.jp/rubikitch/20080104/1199438501]]
--今回対象にしているetagsとは別(多分)のRubyメソッド補完elisp。今度試してみます。
***海外
-[[Slashdotの記事「(Stupid) Useful Emacs Tricks?」&gt;http://news.slashdot.org/article.pl?sid=08/11/07/0533222]]
--米SlashdotでEmacsのトリックで何かある？というトピックに集まったたくさんの記事。これは面白いです。
-[[Emacs Nifty Tricks&gt;http://www.emacswiki.org/emacs/EmacsNiftyTricks]]
--Emacs小技の総本山的サイト。どんだけあるの？
*コメント
もしあれば、どうぞ。
- 通常のコメントは、M-; (私の環境では)  -- かみむら  (2008-08-01 21:14:22)
- 一括コメントは、リージョンした状態で M-;  -- かみむら  (2008-08-01 21:14:49)
- grep は、M-x grep  -- かみむら  (2008-08-01 21:15:46)
- むしろ、M-x find-grep で、再帰的に grep してくれるのが便利です。  -- かみむら  (2008-08-01 21:16:32)
- あと、etags があるならば、関数名にカーソルを配置して、M-. で、その関数定義の場所にジャンプしてくれます。  -- かみむら  (2008-08-01 21:18:06)
- 保存する文字コードの指定は、M-x ret f です。  -- かみむら  (2008-08-01 21:19:37)
- 最後に編集した場所への移動は、私は、Undo してます。あと、C-x 2 で画面を２つにして、片方で切り取って、片方で貼り付けとかも便利です。  -- かみむら  (2008-08-01 21:20:50)
- ハードタブは、C-q TAB でしょうか。C-q C-i も可能かと。  -- かみむら  (2008-08-01 21:23:30)
- 戻る方向への検索は、C-r も使えるかもしれません。  -- かみむら  (2008-08-01 21:24:25)
- 私は、Emacs を応援してます！  -- かみむら  (2008-08-01 21:25:21)
- かみむらさん、色々とありがとうございます！色々知らなかったことがたくさんあり、どれも参考になります。Undoで最後の場所に戻る、というのは発想の転換ですね。すばらしい！このページ、更新が途中で止まっているのでまた再開しますね。かみむらさんのおかげでやる気が出ました。  -- かときち  (2008-08-02 13:51:08)
- 初めまして。記事の方参考にさせて頂きました。ac-mode の振り替えは標準添付の hippie-expand でいかがでしょうか?  -- すが  (2008-11-22 02:31:16)
- すがさん、ありがとうございます！hippie-expandがどういうものか知らなかったので、ac-modeと比べてどうか、調べてみますね。感謝です。  -- かときち  (2008-11-25 21:59:18)
- &gt; だけど、除外ファイルも一度検索リストに入れられてしまうので遅いという、けっこう重大な欠点があったので次第に使わなくなってしまいました。  これは改善されたみたい？  -- y  (2009-03-30 23:21:14)
- 遅い、というのはhippie-expandのことですよね。ac-modeもあまり使わないことに気付いて、今は使用を止めています・・・。コメントありがとうございます。あ、そういえば最近speedbarのようなバッファを同じウィンドウの中で表示する、というEmacs-Lispが公開されていたのを思い出しました。試してみようっと。  -- かときち  (2009-03-31 02:00:50)
- [マクロ外コードのグレイアウト] cpp-highlight-buffer が良いみたいです。ただ、起動時にこれを実行させる場合はcondition-caseで例外処理しないとダメみたいです。  -- まつもと  (2009-11-14 22:38:49)
- [gtags] gtags-find-tag よりgtags-find-tag-from-hereの方が、一気にジャンプ出来るんで良さげかもしれません。  -- まつもと  (2009-11-14 22:42:01)
- まつもとさん、ありがとうございます。ちょっと使ってみて、試してみます。  -- かときち  (2009-11-16 14:04:08)
- http://www.bookshelf.jp/soft/meadow.html の情報は非常に有用です。特にmoccur-edit.elは強力すぎて眩暈がします。  -- こうじ  (2010-01-12 13:03:35)
- あと、行番号が要るというのはただの「思い込み」で、まともな行番号表示elispがないのは、必要ないことが判って作者が作るのを止めてしまうからだと思われます。  -- こうじ  (2010-01-12 13:08:13)
- こうじさん、コメントとリンク、ありがとうございます。行番号は…難しいですね。diffやチームでのコードレビューなどでは行番号が識別子になっていますしね。  -- かときち  (2010-02-05 11:40:53)
- 「入力しようとしている名前を補完」は dabbrev を使っています。途中まで入力して M-/ で補完。違うのが補完されたら再度 M-/ です。  -- こうぞう  (2011-01-25 21:32:33)
- 「最後に編集した箇所に移動」と似た動きに、C-x C-x と C-u C-SPC がある。前者は今の位置とマークした位置を交換する。後者はマーク履歴を順に巡る。  -- こうぞう  (2011-01-25 21:42:09)
- Wine1.2.2で hm802_signed.exe試用中ですが範囲選択の文字消えてません。僕の環境だけかも知れませんが。  -- yoshikazu  (2011-02-19 22:52:58)
- その後の試用で矩形選択と横スクロールで文字消えました。 秀丸ビミョーに不便です。  -- yoshikazu  (2011-02-20 12:26:19)
- http://itmst.blog71.fc2.com/blog-entry-44.htmlのコメントに答えがありました。　これで矩形選択や横スクロールでも文字消えません。  -- yoshikazu  (2011-02-21 23:02:20)
#comment    </description>
    <dc:date>2011-02-21T23:02:20+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/44.html">
    <title>ライセンスについて</title>
    <link>http://www23.atwiki.jp/selflearn/pages/44.html</link>
    <description>
      *ライセンスについて
本サイトに載せている自作のコード・プログラムは、すべてMITライセンスの下で公開しています。ただし、条項を若干緩めていますので、ご一読ください。

+このサイトで紹介している自作のソースコード・ソフトウェアは誰でも無償で無制限に扱っていただいて結構です。但し、&amp;bold(){あまりにそのまま使用する場合}は著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載してください。
+私(カトキチ/Katokichi)は、ソフトウェアに関してなんら責任を負いません。

----
The MIT License

Copyright (c) 2008,2009 KatokichiSoft

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &quot;Software&quot;), 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 &quot;AS IS (AS FAR AS POSSIBLE)&quot;, 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 THERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.    </description>
    <dc:date>2009-07-28T11:00:14+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/7.html">
    <title>SICP</title>
    <link>http://www23.atwiki.jp/selflearn/pages/7.html</link>
    <description>
      *はじめに

『 計算機プログラムの構造と解釈 』(SICP)を読み、その内容をまとめています。演習問題もできるだけ解くようにしていますので、進みは遅いです。

|開始日|2006/12/31|
|第１章読了|2007/1/14|
|終了日||

*テキストのまとめ
**第1章 手続きによる抽象の構築
+[[SICP（1.1 プログラムの要素）]]
+[[SICP（1.2 手続きとその生成するプロセス）]]
+[[SICP（1.3 高階手続きによる抽象）]]

**第2章 データによる抽象の構築
+[[SICP（2.1 データ抽象入門）]]
+[[SICP（2.2 階層データ構造と閉包性）]]
+[[SICP（2.3 記号データ）]]
+[[SICP（2.4 抽象データの多重表現）]] ←まだまだココ（2007/12/24）

*演習問題
**第1章 手続きによる抽象の構築
+[[SICP (問題1.*)]]

**第2章 データによる抽象の構築
+[[SICP (問題2.1 -)]]
+[[SICP (問題2.44 -)]]
+[[SICP (問題2.73 -)]]

*その他のメモ
+[[メモ（第1章）]]
+[[メモ（第2章）]]

*参考サイト
-[[WiLiKi&gt;http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi]]：「...本サイトは、WiLiKiの紹介ページであると共に、プログラミング言語Scheme、そしてその一実装であるGaucheに関する議論を行う場でもあります...」
-[[バカが征く&gt;http://www.jitu.org/~tko/cgi-bin/bakagaiku.rb?bakaid=200702082]]：関数型言語のジョーク。「...舞台に立つときにアガらないようにって手の平に『人』って字を書いて飲み込むってのをやってみたんだ／でも、間違って『λ』って書いちゃって余計アガっちゃったよ／これぞほんとの後悔関数」

#right(){（&amp;counter()）}
*コメント
- 問題2.34の解答にtypoがあります。lambda の中で this-coeff と higher-terms が入れ替わっています。  -- 上山完  (2007-06-07 09:46:11)
- 問題2.38 opは交換律だけではなく結合律も満足しなければいけません。  -- 上山完  (2007-06-12 12:00:17)
- コメントありがとうございます。今頃になって気づきました・・・。すみません。もう一度、ご指摘の問題を見直してみます。  -- kato  (2007-07-30 22:09:10)

#comment    </description>
    <dc:date>2009-06-08T05:52:55+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/47.html">
    <title>Alpha Compositing - Part II</title>
    <link>http://www23.atwiki.jp/selflearn/pages/47.html</link>
    <description>
      *Alpha Compositing - Part II
#center(){
|開始日|2007年03月17日|
|最終更新日|&amp;date(j)|
}

*はじめに
[[Alpha Compositing - Part I]]で説明した方法を応用し、Web2.0的な画像を作成する方法について説明・使い方を記しています。
全4ページのうち、ここは1ページ目です。 

**原著
#center(){
「Alpha Compositing - Part II」
http://rmagick.rubyforge.org/web2/web2.html
}

**注意
-もともと個人利用を目的として日本語化したために、けっこう意訳している部分があります。「意味分からないよ」とか「おかしいんじゃない？」とかいうのがあれば、オリジナルを参照するか、コメントで質問してください（がんばって調べます）。

**用語
訳文に出てくる各語に対応する原文と意味を以下に記します。
#center(){
|訳語|原文|意味|
|元画像|source image|合成しようとしている画像。|
|合成先画像|destination image|元画像の下に重ねる画像。|
}

**更新履歴
-2008/3/17 作成開始(Part1から1年以上経ってしまった・・・。しかもWeb2.0ってブーム過ぎてるし)
-2008/3/19 とりあえず作成完了。あとはチマチマ微修正。

----
*訳文

Tommy Maloneyの[[Web 2.0 Design Kit&gt;http://www.photoshoplab.com/web20-design-kit.html]]は、Photoshopを使ってWeb2.0チックなエフェクトを作成するチュートリアル記事が書かれたサイトだ。私はこのチュートリアルを試してみて、すぐに気付いたよ。自分の書いたアルファコンポジットのPart2を書かなきゃってね（まだ読んでないなら、[[ここ&gt;Alpha Compositing - Part I]]を読んでくれ）。

このチュートリアルでは、Part1で紹介したエフェクトをもう1度使って、PhotoshopではなくRMagickによるWeb 2.0 Design Kitの説明をする。でも、できたら始める前に[[本家のページ&gt;http://www.photoshoplab.com/web20-design-kit.html]]を一通りこなし、チュートリアル内で画像が作成される様子を見ておいてほしい。RMagickバージョンの完成画像は、下のイメージのようにちょっと違っているからね。

#image(result.jpg,title=Result,center)

以降では、このイメージをRMagickでどうやって作成していくかを紹介する。そうだ、Part1で説明したコンポジット(composite)に加え、テキストを描画するためにDrawクラスからannotateを、背景のグラデーションにはGradientFillクラスを、そして影の作成にblur_imageを使う。そしてappend、rotate、negateメソッドもだ。

**グラス効果(The glass effect)
最初のエフェクトは反射、いや「グラス」エフェクトだ。始める前に、作業場を片付けておくんだ。そしてImageListオブジェクトに貯め込んでいく画像や、グラデーションの大きさを決める2つの定数を定義してくれ。

#codehighlight(ruby){{
require &#039;RMagick&#039;
include Magick

WIDTH = 650
HEIGHT = 40

stripes = ImageList.new}}

それじゃ、背景にブルーグレイのストライプを作るところから始めよう。こいつは2つのグレイスケールのグラデーションを組み合わせることで出来る。2つのグラデーションを持つ画像を上下に重ねて1つの画像にして、compositeメソッドのColorizeCompositeOpで色を重ねるだけだ。

グラデーション属性を、GradientFillクラスの2つのインスタンスによって作ろう。
GradientFill.newメソッドには6個の引数が必要だ。最初の4つは直線か座標に使われ、残りの2つはグラデーションの色を決める。そうするとグラデーション属性として、最初の直線(or座標)から1つ目の色で始まり、2つ目に指定した色に残る直線(or座標)へと変化しながら出来上がる。

色：#ddddddで画像上端の線から、色：#888888で画像下端の線に向かうグラデーションを作る。そしてそれをImage.newの第３引数、つまりfill属性に渡すことで、画像が出来上がる、というわけだ。
出来上がった画像はstripesに突っ込んでおいてくれ。
#codehighlight(ruby){{
top_grad = GradientFill.new(0, 0, WIDTH, 0,
    &quot;#dddddd&quot;, &quot;#888888&quot;)
stripes &lt;&lt; Image.new(WIDTH, HEIGHT, top_grad)
}}
次にもう少し暗い色でグラデーション属性を作り、画像を作る。stripesに追加するのも同じだよ。
#codehighlight(ruby){{
bottom_grad = GradientFill.new(0, 0, WIDTH, 0,
    &quot;#757575&quot;, &quot;#555555&quot;)
stripes &lt;&lt; Image.new(WIDTH, HEIGHT, bottom_grad)
}}
さあ、画像を見てみよう。まずこれが上端の画像だ。

#image(http://rmagick.rubyforge.org/web2/top_grad.jpg,title=top image,center)

こちらは下端の画像。

#image(http://rmagick.rubyforge.org/web2/bottom_grad.jpg,title=bottom image,center)

この2つをくっつけて、1つの画像を作る。appendメソッドはtrueかfalseかの1引数のみ取る。trueだと画像は上下に重ねられ、falseだと左右に並べられるよ。
#codehighlight(ruby){{
combined_grad = stripes.append(true)
}}
今回はtrueだから上下に重ねられる。そして、結合後の画像がこれだ。

#image(http://rmagick.rubyforge.org/web2/combined_grad.jpg,title=combined image,center)

**色の合成(The colorize composite operation)
いい感じになってきた。

さて次は色味を与えよう。グレイスケールのグラデーションに色味を与える場合はcompositeメソッドを使うよ。[[Part1&gt;Alpha Compositing - Part I]]で、アルファコンポジットには元画像と合成先画像の2つを使ったのを覚えているかい？今回は、合成先画像にたった今作ったグラデーション画像を使うんだ。だから、元画像をこれから作る。これで画像に色味が加えられるわけだ。

合成するグラデーション画像と同じサイズの元画像を作ってほしい。ソリッドな青色の背景だね。

#codehighlight(ruby){{
color = Image.new(combined_grad.columns, combined_grad.rows) do
         self.background_color = &quot;#87a5ff&quot;
end
}}
この画像を表示すると、こうなっている。

#image(http://rmagick.rubyforge.org/web2/blue_color.jpg,title=blue image,center)

ところで、Part1で説明したsrc-overによる合成は、元画像のピクセルを合成先の画像で置き換えてしまう。これだとちょっとマズいのは分かるよね。せっかく作ったグラデーションが青一色になってしまうから。今回はそうでなく、元画像と合成先画像とをブレンドしたい。
そうするには、色のHue(色相)、Saturation(彩度)、Brightness(明度)((訳注：原文は明度に「lightness」を用いていましたが、日本で一般的なBrightnessを適用しました。))という用語について知っておくといいよ。

僕らは皆、色といえば赤/緑/青の組み合わせで考えるよね。これはRGB系というんだ。同様に、色相/彩度/明度の組み合わせ：HSB系も存在する。このHSB系では、色相(H)は色相環における場所を示し、明度は色がどのくらいの明るさを持っているかを示す。分かりやすい例で言えば、黒は明度0だし白は明度100(%)だね。そして彩度は鮮やかを示すんだ。

RMagickはHSL系で表された2画像間のピクセルをフルレンジで合成することが出来るんだ。用いる方法はcolorize。colorizeによる合成は、「元画像の色相と彩度」と「合成先画像の明度」を合成するよ。

さて、思い出してくれ。RMagickにおいて、合成先画像とはcompositeメソッドを送信する元のことだ。だから元画像が第1引数になる。2つ目の引数は、元画像の合成先画像に対する相対的な位置を示すわけだけど、今回は2つとも同じサイズなわけだ。さて何を使ったら良いだろう？ま、ここでは後で分かりやすくするためにCenterGravityを選んでおいたよ。
そして3つ目の引数で、どうやって合成するかを示してくれ。ColorizeCompositeOpだね。
#codehighlight(ruby){{
background = combined_grad.composite(color,
    CenterGravity, ColorizeCompositeOp)
}}
色味の着いたグラデーションはこんな感じになるよ。

#image(http://rmagick.rubyforge.org/web2/background.jpg,title=background image,center)

次は&quot;RMAGICK&quot;という単語を反射エフェクト付きで埋め込んでいく。

#right(){[[→ Page 2: 反射するテキストの追加&gt;Alpha Compositing - Part II-2]]}
----
**参考サイト(訳者による追加)
-RMagickオンラインドキュメント：[[http://www.simplesystems.org/RMagick/doc/index.html]]
--compositeメソッド：[[http://www.simplesystems.org/RMagick/doc/image1.html#composite]]
--CompositeOperator定数の一覧（src-over以外にも多数あり）：[[http://www.simplesystems.org/RMagick/doc/constants.html#CompositeOperator]]
--compositeメソッド（Drawクラス）：[[http://www.simplesystems.org/RMagick/doc/draw.html#composite]]
--RVGのチュートリアル：[[http://www.simplesystems.org/RMagick/doc/rvgtut.html]]

----
（&amp;counter()）

* コメント
コメント大歓迎です。ただ、スパムなど内容によっては独断で削除する場合があります。あらかじめご了承ください。

#comment    </description>
    <dc:date>2009-06-08T05:47:13+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/45.html">
    <title>pyCharter</title>
    <link>http://www23.atwiki.jp/selflearn/pages/45.html</link>
    <description>
      *「&amp;bold(){pyCharter}」 −− 急がば回れのグラフ作成スクリプト
#right(){最終更新：&amp;date()}

#image(right,width=240,potato.jpg)

* プログラムの概要
[[Google Chart&gt;http://code.google.com/apis/chart/]]のPython向けラッパーライブラリです。インスタンスを作成後、適当にデータをセットしてあげれば、そのグラフのPNG画像またはURLを取得できます。

- 棒グラフ、線グラフ、パイチャート(2D/3D)、ベン図など、様々なグラフ形式を選択できます
- グラフ画像を任意の大きさで、PNG画像で取得できます
-- Google Chartと同じ機能を提供できる！（当たり前・・・にしたい

皆さん、今もグラフを某Excelで書いているのですか？(Googleの)Web2.0テクノロジーを駆使したグラフ作成ソフト1.0であるpyCharter、活用してみませんか？

* プロジェクト名
「pyCharter」

** チェンジログ
|2008/3/10|プロジェクト開始日|
|2008/6/10|方針を、「データファイルを読んで画像入手」から「Google Chart APIのラッパーライブラリ」に変更|

* プロジェクト開始の背景
独自のグラフを自動で作りたい。でもExcelを持ち出すほどでもないし、かといってGNUPLOTはコマンドが複雑で、時間が経つと何が何やら。そう思ってこのツールを書き始めました。

ちなみにpyCharterは「PythonのChart機能を使用するスクリプト」という意味で名づけました。Mac OSX Tiger以降に標準添付されているソフト、Grapherにインスパイアされています。

* 動作環境
Python2.5以上を使用します。また、インターネット接続環境が必要です。

* ライセンス
MITライセンス（条項を若干緩めてあります）。詳しくは[[ライセンスについて]]を参照してください。

* ダウンロード
Google codeの以下のサイトからダウンロードしてください。

　[[Google Codeのダウンロードページを開く&gt;http://code.google.com/p/pycharter/downloads/list]]
&gt;すみません、まだ作成中です。svnのtrunkから最新版をcheckoutすることはできます。

* インストール方法
ターミナルのパスが通っている場所にダウンロードしたスクリプトファイルを保存するだけです。
環境を破壊しない、PCとあなたのストレスに優しい仕様です。

あ、スクリプトファイルに実行権は付けておいた方が便利ですよ。

* 使用方法
ターミナルからの入力方法は以下のとおりです。

&gt;$ [python] pyCharter.py データファイル

これにより、「データファイル.png」という名前のグラフ画像が作成されます。データファイルを指定しなかった場合、ファイル選択ダイアログが表示されますので、データファイルを指定してください。

データファイルは複数指定することもできます。ワイルドカードに対応するかどうかは、もうちょっと考えさせてください（やり方がわからない）。

* データファイルの書式

グラフ化したいデータファイルには以下のように記述します。

#codehighlight(python){
[title]:(Graph title)
　[type]:Line/Bar/Pie/Venn/Scatter(Type of graph)
　[size]:width,height
　&lt;label name&gt;:data1,data2,... (comma separated)
}

行末、行頭の空白や空行は無視されます。Pythonソースと同じく、コメントは#以降でどこにでも書けます。

各項目の意味は以下のとおりです。括弧も必ず入力するようにしてください。

|項目名|必須/任意|意味・用途|
|[title]|任意|グラフのタイトル(キャプション)を指定します。グラフの上段に記述されます。&amp;br()(日本語はGoogle Chartの仕様により不可です)|
|[type]|任意|グラフの種類を指定します。どんなグラフが、どのように指定できるかは別表を参照してください。&amp;br()デフォルトは折れ線グラフです。|
|[size]|任意|PNG画像にしたときの画像のサイズをピクセル単位で指定します。&amp;br()デフォルトは300x300ピクセルです。|
|&lt;label name&gt;|必須|データのラベル名です。「&lt;　&gt;」というような空白でも良いので、必ず指定してください。|
|data x|必須|ラベル名に関連付けられた値をカンマ区切りで入力します。必ず指定してください。|

指定できるグラフの種類は以下のとおりです。

|入力記号|グラフの種類|
||折れ線グラフ|
||棒グラフ(縦)|
||棒グラフ(横)|
||パイチャート(2D)|
||パイチャート(3D)|

* 注意事項

* TODO＆今後実装予定の機能
- □ このページの体裁を整える
-- □ データファイルの書式説明を記述する
-- □ アンインストール方法の説明を記述する
- □ ソフトウェアを完成させる
-- □ 複数ファイルに対応

* 参考サイト
- [[50 Cool Things You Can Do with Google Charts API&gt;http://www.collegeathome.com/blog/2008/06/05/50-cool-things-you-can-do-with-google-charts-api/]]
--Google Chart APIを使用して色んなことを実現しているサイトのまとめ。全50サイトを紹介してます。

* コメント
#comment(vsize=2,nsize=20,size=40)

（&amp;counter()）    </description>
    <dc:date>2009-06-08T05:45:56+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/38.html">
    <title>MagickCam</title>
    <link>http://www23.atwiki.jp/selflearn/pages/38.html</link>
    <description>
      *「&amp;bold(){MagickCam}」 −− ブログにあなたの記憶を添えましょう
#right(){最終更新：&amp;update(j)}
#image(right,width=240,potato.jpg)

* プログラムの概要
[[Polaroid Effect]]で紹介したRubyスクリプトを拡張し、コマンドラインからポラロイド写真風の画像を作成するプログラムです。以下の機能を持っています。

- 大きな画像をブログ用の小さめなサイズに自動変換(短辺が480ピクセル)
- 画像をポラロイド風の写真に変換
-- 枠を付けて傾けるだけではなく、印画紙の微妙な陰影やポラロイド写真の写りの甘さを再現
- ローライのような正方形フォーマットにトリミングするオプション
- 白黒変換オプション
- コマンドラインから実行するしか無い潔さ

あなたのブログに載せる写真、それは記録ではなく「記憶」なのです。

* プログラム名
「MagickCam」

&gt;本プログラムは[[Polaroid Effect]]に影響を受けて作成しました。

** リリースログ
|プロジェクト開始日|2007年の夏頃。確か。とりあえず動けばよかった時代|
|リリース0.0.1〜2|いつ出したのかなんて、細かいことはいいじゃないですか|
|リリース0.0.3|2007年のクリスマスイブ。少しずつポラロイド以外の写真も撮れるようになりました|

* プロジェクト開始の背景
画像をブログにアップする際、写真をただ貼付けるだけでは面白くないと思っていました。もう少しおしゃれに貼付けたい。調査写真のようではなく記憶に残る、味わい深い写真にしたい。
（GUIアプリをいちいち何度も立ち上げたくない←個人的に）

そうした願いを集めたプログラムを作ろうと思いました。

* 動作環境
MacOSX10.3.9以降のRubyで動作を確認していますが、基本的にはRubyが動けばプラットフォームは関係ないはずです。
ただしRuby以外には以下のライブラリがインストールされ、使えるようになっていなければ動きません。
- [[ImageMagick&gt;http://www.imagemagick.org/]]
- [[RMagick&gt;http://raa.ruby-lang.org/project/RMagick]]

* ライセンス
MITライセンス（条項を若干緩めてあります）。詳しくは[[ライセンスについて]]を参照してください。

* ダウンロード
Google codeの以下のサイトからダウンロードしてください。

　[[Google Codeのダウンロードページを開く&gt;http://code.google.com/p/magickcam/downloads/list]]

* インストール方法
ターミナルのパスが通っている場所にダウンロードしたファイルを保存するだけです。
環境を破壊しない、PCとあなたのストレスに優しい仕様です。

あ、実行権は付けておいた方が便利ですよ。

* 使用方法
ターミナルからの入力方法は以下のとおりです。

&gt;$ [ruby] magickcam.rb [-wmr] [-o 出力ファイル名] [-s suffix] 画像ファイル

#image(center,width=320,original.jpg)

#center(){この何の変哲も無い写真が・・・}

#image(center,width=320,polaroid.jpg)

#center(){ポラロイド風の記憶に残る写真になりました。}

#image(center,width=240,monochrome.jpg)

#center(){モノクローム(-m)と正方形フォーマット(-r)の組み合わせです。}

以下のオプションが指定できます。これらは--helpオプションでも確認できます。

:-m, --monochrome|モノクローム写真に変換します。思い出をそっとしまいます。
:-n, --no_suffix|変換後のファイルにサフィックスを付けずに保存します。-oを指定しないとオリジナルファイルが上書きされます。
:-o, --output=filename|変換後のファイル名を指定します。-nを付ける時はこのオプションも同時に使うことをお進めします。
:-r, --regular_square|写真の長い辺を問答無用に切り落として正方形フォーマットの写真にします。生まれる写真は緊張感があります。
:-s, --suffix=suffix_string|変換したファイルに付与する拡張子を指定します。デフォルトは「-print」です。
:-w, --wipe_original|過去を振り返らない、二次創作物で満足するあなたにお勧めです。オリジナルを削除します。

* 注意事項
- 余計なオプションは付けたくないポリシーにより以下の制限があります
-- 出力画像のサイズは画像の短辺が常に480ピクセルで固定されています。
-- 正方形フォーマットオプションを使用した時は、写真の両側が問答無用でトリミングされます。
-- 写真の背景は白です。透過色には対応していません。
- 入力画像のファイル形式は問いません（RMagickバンザイ！）

* TODO＆今後実装予定の機能
- □ 複数ファイルの指定に対応
- □ 周辺の光量落ち
- □ 各種カメラの雰囲気を持たせる
-- □ チェキ！
-- □ Lomo
-- □ カラーネガをスキャンしたときの寒々しさ
-- □ 60年代に撮った写真風の劣化ぐあい
- □ 将来はMacのアプリとしてDrag&amp;Dropに対応する
- □ ImageMagick＆RMagickからの脱却（遅いので）
-- □ Core Imageを使用した高速処理

* コメント
#comment(vsize=2,nsize=20,size=40)

（&amp;counter()）    </description>
    <dc:date>2009-06-08T05:44:01+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/32.html">
    <title>RMagickのTips和訳</title>
    <link>http://www23.atwiki.jp/selflearn/pages/32.html</link>
    <description>
      *「Articles About Using RMagick」日本語訳
RMagickという、ImageMagick（GraphicsMagick）をRuby上で使用するためのライブラリがあります。

-RMagick：[[http://rmagick.rubyforge.org/index.html]]
--ImageMagick：[[http://www.imagemagick.org/index.php]]
--GraphicsMagick：[[http://www.graphicsmagick.org/]]

このRMagickを使ったTipsがオリジナルサイトに紹介されているので、{RMagickの|英語の}勉強がてら日本語訳してみました。

**和訳
-[[RMagickを使ってサムネイルを作ろう&gt;Making Thumbnails with RMagick]]
--オリジナルサイトは[[こちら&gt;http://rmagick.rubyforge.org/resizing-methods.html]]
-[[アルファコンポジット Part1&gt;Alpha Compositing - Part I]]
--オリジナルサイトは[[こちら&gt;http://rmagick.rubyforge.org/src_over.html]]
-[[アルファコンポジット - Part2 (Web2.0風味) (1)&gt;Alpha Compositing - Part II]]/[[(2)&gt;Alpha Compositing - Part II-2]]/[[(3)&gt;Alpha Compositing - Part II-3]]/[[(4)&gt;Alpha Compositing - Part II-4]]
--オリジナルサイトは[[こちら(1)&gt;http://rmagick.rubyforge.org/web2/web2.html]]/[[(2)&gt;http://rmagick.rubyforge.org/web2/web2-2.html]]/[[(3)&gt;http://rmagick.rubyforge.org/web2/web2-3.html]]/[[(4)&gt;http://rmagick.rubyforge.org/web2/web2.html]]
-[[Polaroidエフェクト&gt;Polaroid Effect]]（&amp;bold(){人気！}）
--オリジナルサイトは[[こちら&gt;http://rmagick.rubyforge.org/Polaroid/polaroid.html]]
-[[shadeメソッドによる透かし画像&gt;Watermarking Images With the shade Method]]
--オリジナルサイトは[[こちら&gt;http://rmagick.rubyforge.org/watermark/watermark.html]]

**注意
-&amp;bold(){【重要】} 2009/01/19現在のMacPortsを利用したImageMagick+RMagick環境は、両者のバージョン相違によって動作しなくなっています。修正にはPortfileの編集が必要ですので、[[私のブログで書いた記事&gt;http://d.hatena.ne.jp/paella/20090118/1232293310]]を参考に、RMagick2.8.0をインストールするよう変更してください(port updateでは効きませんでした)。
-もともと個人利用を目的として日本語化したために、けっこう意訳している部分があります。「意味分からないよ」とか「おかしいんじゃない？」とかいうのがあれば、オリジナルを参照するか、コメントで質問してください（がんばって調べます）。

**参考サイト
-RMagickのインストール方法（英語）：[[http://rmagick.rubyforge.org/install-faq.html]]
--Macへのインストールメモ：[[http://www.goodpic.com/mt/archives2/2007/01/imagemagick_rma.html]]、[[http://d.hatena.ne.jp/paella/20070217/1171720971]]
--Windowsへのインストールメモ：[[http://mpl.s59.xrea.com/comp/rmagick.html]]

----
（&amp;counter()）

#comment    </description>
    <dc:date>2009-06-08T05:43:22+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/31.html">
    <title>Alpha Compositing - Part I</title>
    <link>http://www23.atwiki.jp/selflearn/pages/31.html</link>
    <description>
      *Alpha Compositing - Part I
#center(){
|開始日|2007年02月09日|
|最終更新日|&amp;date(j)|
}

*はじめに
アルファコンポジットについての基本的な説明・使い方を記しています。

**原著
#center(){
「Alpha Compositing - Part I」
http://rmagick.rubyforge.org/src_over.html
}

**注意
-もともと個人利用を目的として日本語化したために、けっこう意訳している部分があります。「意味分からないよ」とか「おかしいんじゃない？」とかいうのがあれば、オリジナルを参照するか、コメントで質問してください（がんばって調べます）。

**用語
訳文に出てくる各語に対応する原文と意味を以下に記します。
#center(){
|訳語|原文|意味|
|元画像|source image|合成しようとしている画像。|
|合成先画像|destination image|元画像の下に重ねる画像。|
}

**更新履歴
-2007/2/9 作成開始
-2007/2/20 とりあえず一通りの日本語訳が完了。時間がかかってしまった・・・。
-2008/3/17 ソースコードを引用ではなく専用のタグで記述。読みやすくなった。

----
*訳文

変わった形をした写真をサムネイルコレクションに加えたいとき、君はどうやっている？たとえば風景の写真集にポートレートを加えるときとかね。画像が長方形にすらなっていないものもある。
こういった画像を扱う解決方法の１つとして、「枠」となる画像にそれらをはめこんで（ブレンドして）しまう方法がある。RMagickのcompositeを使って、ね。

**アルファコンポジット - 2つの画像を1つに
画像処理において、アルファコンポジットとは数学的処理により2つの画像を結合し、1つの合成画像を作り出すことだ。アルファコンポジットの伝統的な計算モデルは「Porter-Duff」モデルと言われていて、12種類の合成手法を定義している。
そこで本記事ではsrc-overと呼ばれる、Porter-Duffモデルのなかでももっともシンプルでよく使う処理方式について、使用方法を紹介しよう。

src-overの意味は以下のとおりだ。

|合成先画像のピクセルを元画像のピクセルによって置き換えること。|

ただし、もし元画像が半透明・不透明なピクセルを持っているなら、ルールは若干複雑になる。

|合成先画像のピクセルを元画像のピクセルによって置き換える。ただし元画像に半透明または不透明なピクセルがある場合、合成先画像のピクセルは一部または完全に透けて見える。|

**RMagickによるアルファコンポジット
RMagickは、ImageMagickまたはGraphicsMagickライブラリのRubyバインディングだ。どちらのライブラリでも、Magick::Imageクラスのメソッドとしてアルファコンポジット用のAPI：compositeメソッドを用意してくれている。
このcompositeメソッドには4つの情報が必要だ。

+合成先画像(destination image)。これはMagick::Imageのインスタンスで、compositeメソッドを呼ぶときのレシーバだ。
+元画像(source image)
+元画像を合成先画像のどこに配置するか(position)
+適用する合成方法

compositeメソッドは、元画像を合成するときの場所を柔軟に指定できるよう少しずつ変わってきた。その結果として、今では3種類の引数の渡し方で使用できるようになっている。
合成先画像に対する元画像の配置場所をどう表現するか、が違うんだ。

まず最初に、オフセットをx-y座標のペアで設定する方法を紹介する。
#codehighlight(ruby){{
result = dst.composite(src, x, y, comp_op)}}
ここでのdst,srcはそれぞれ合成先画像、元画像を意味している。x,yと書かれた第2,3引数で、合成先画像の左上端を原点としたオフセット量を指し示すんだ。((訳注：原文ではrelativeという表記がありますが、ここで指定する値が相対値か絶対値のどちらかは、後日確認してみます。→(2007/2/20)ピクセル指定の絶対値でした。))
ちなみにx,yには負の値も設定可能で、たとえばxで負値をセットした場合は元画像が合成先画像よりも左側に配置される。yでセットした場合は、合成先画像より上に配置される、というわけだ。
最後の引数(comp_op)は合成方法の種類で、どういった合成方法にするかをMagick::CompositeOperatorクラスの中から1つ選ぶ。

2つ目は、x-yのオフセット量を指定する代わりにMagick::GravityTypeを指定する方法だ。
#codehighlight(ruby){{
result = dst.composite(src, gravity, comp_op)}}
gravity以外の引数はさっきと同じで、元画像と合成方法だ。

GravityTypeには以下の9種類が提供されている：
:NorthWestGravity|元画像を合成先画像の左上端に配置
:NorthGravity|元画像を合成先画像の上部中央に配置
:NorthEastGravity|元画像を合成先画像の右上端に配置
:EastGravity|元画像を合成先画像の中央右端に配置
:SouthEastGravity|元画像を合成先画像の右下端に配置
:SouthGravity|元画像を合成先画像の下部中央に配置
:SouthWestGravity|元画像を合成先画像の左下端に配置
:WestGravity|元画像を合成先画像の中央左端に配置
:CenterGravity|元画像を合成先画像の中心に配置

そして3つ目の方法はGravityTypeとx-yオフセットの両方を指定する方法だ。この方法ではGravityTypeで示す値の意味がx,yによって変化する。
#codehighlight(ruby){{
result = dst.composite(src, gravity, x, y, comp_op)}}
これもさっきと同じで、src,dst,comp_opの指す意味は同じだ。もちろんgravity,x,yも使う値(クラス)の型は変わらない。ただし、

+gravityがNorthEastGravity/EastGravity/SouthEastGravityのいずれかの場合、xは画像の右端からのオフセット量になる（元は左端からのオフセットを示す）。
+gravityがSouthEastGravity/SouthGravity/SouthWestGravityのいずれかの場合、yは画像の下端からのオフセット量になる（元は上端からのオフセットを示す）。
+それ以外はgravity引数は無視され、x,yのみ2つ目と同様に左上端からのオフセット量として用いられる。

となる。繰り返すが、3つ目の方法でもx,yには負値を設定できる。このときのgravityとx,yの関係には十分注意してほしい。

**長方形の画像を正方形の枠で囲う
さっきも言ったように、srs-over処理による画像の合成は、合成先画像のピクセルを元画像の対応するピクセルで置き換えることで画像を生成する。もし元画像が合成先画像よりも小さければ、合成先画像の一部だけが元画像によって置き換えられる。この特徴によって、正方形の背景（の一部）に長方形の画像を配置することが出来るわけだ。

ここで1つ例を挙げよう。左側の画像は80x100サイズのサムネイルで、これを中央にある金色の画像(128x128サイズ)に合成しようとしている。右側の画像は合成結果で、合成先画像と同じサイズだ(訳注：後述する「元画像が合成先画像よりも大きかったら」を参照)。元画像はsrc-over処理によって合成先画像の上に配置されている。

#center(){
|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite1-src.gif)|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite1-dst.gif)|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite1.gif)|
|CENTER:元画像|CENTER:合成先画像|CENTER:合成結果|
}

以下はこの合成処理を実現するスクリプトだ。
#codehighlight(ruby){{
1  require &#039;RMagick&#039;
2
3  gold_fill = Magick::GradientFill.new(0, 0, 0, 0,
                                        &quot;#f6e09a&quot;, &quot;#cd9245&quot;)
4
5  dst = Magick::Image.new(128, 128, gold_fill)
6  src = Magick::Image.read(&quot;composite1-src.gif&quot;)[0]
7
8  result = dst.composite(src, Magick::CenterGravity,
                          Magick::OverCompositeOp)
9  result.write(&#039;composite1.gif&#039;)}}
-Lines 3-5 ：合成先画像を128x128のサイズ＋金色のグラデーションで作成
-Line 6 ：サムネイル化する元画像をファイルから読み込み
-Line 8 ：compositeメソッドによる合成画像の作成。この例では2つ目の方法で引数を渡している。Magick::CenterGravityで元画像を合成先画像の中央に配置し、Magick::OverCompositeOp方式で上書きする。

**複雑な形の画像を正方形の枠で囲う
ここではsrc-over方式の、一部が透明になった画像のケースについて紹介する。
まずはsrc-overの定義を思い出してほしい。

|合成先画像のピクセルを元画像のピクセルで上書きする。ただし元画像の一部または全部が透過色である場合、合成先画像のピクセルが透けることになる。|

合成先の画像がどのくらい透けて見えるかは、元画像の透明度に依存する。上の例のような100%不透明なピクセルであれば元画像は合成先画像を完全に隠してくれるし、もし元画像が50%程度の透明度を持っていれば、合成先の画像は半分くらい透けて見えることになる。

下の例では、元画像として左側のペンギンのおもちゃを取り扱う。この画像はPNGフォーマットで、ペンギンの周りが透明になっている。合成先画像は128x128サイズの&quot;plasma&quot;画像だ。右側の合成結果ではsrc-over処理によって元画像の不透明な部分のみ合成先画像に上書きされている。実際にはペンギンの周りにある透明なピクセルも合成されているんだけど、透明(つまり0%不透明という意味だ)なだけに合成先の画像が透けて見えているわけだ。

#center(){
|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite2-src.gif)|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite2-dst.gif)|&amp;ref(http://rmagick.rubyforge.org/composite-images/composite2.gif)|
|CENTER:元画像|CENTER:合成先画像|CENTER:合成結果|
}

以下はこの合成処理を実現するスクリプトだ。
#codehighlight(ruby){{
1  require &#039;RMagick&#039;
2
3  dst = Magick::Image.read(&quot;plasma:fractal&quot;) {
             self.size = &quot;128x128&quot;}.first
4  src = Magick::Image.read(&#039;tux.png&#039;).first
5
6  result = dst.composite(src, Magick::CenterGravity,
                          Magick::OverCompositeOp)
7  result.write(&#039;composite2.gif&#039;)
}}
-Line 3 ：組込みの&quot;plasma&quot;フォーマットを使って128x128サイズの合成先画像を作成
-Line 4 ：サムネイル画像（元画像）の読み込み
-Line 6 ：合成画像の作成。前例と同じ引数でcompositeメソッドを呼んでいる

***元画像が合成先画像よりも大きかったら
元画像が合成先画像よりも大きかった場合、元画像のうち合成先画像の範囲外になるピクセルは無視される。つまり、合成結果は常に合成先画像と同じサイズになるんだ。このときx,y,gravityは元画像のどの部分を合成するかを制御する目的で使うことになる。

**その他の合成方法
RMagickではImageクラスのcomposite以外にも合成用のメソッドを2つ用意している。まず、Drawクラスのcompositeメソッドだ。このメソッドは以下のように使う。
#codehighlight(ruby){{
gc.composite(x, y, width, height, src_image, comp_op)
}}
合成先画像はドロー画像で、えっとつまり、drawメソッドに渡す引数だ。x,yは合成先画像の左上端からのオフセット量で、width,heightで元画像のスケール（倍率）を指定できる。（width,heightを0にセットすれば拡大/縮小しないで合成できる）

もう1つは、RVG((訳注：RVG=Ruby Vector Graphics))のRVG::GroupとRVG::Patternクラスが持つimageメソッドがある。これは背景イメージ上にラスターイメージを合成するメソッドだ。ただしこのメソッドはcomp_op引数を持たず、常にsrc-overで合成するよ。

**参考サイト
いつものように、Anthony Thyssenの[[すばらしいサイト&gt;http://www.cit.gu.edu.au/~anthony/graphics/imagick6/]]ではImageMagickを使ったアルファコンポジットについてのもっと詳しい情報が載っている。アルファコンポジットとPorter-Duffモデルについて分かりやすい説明なら[[このページ&gt;http://www.svgopen.org/2005/papers/abstractsvgopen/]]を見てくれ。あと、「[[SVG 1.2 Specification&gt;http://www.w3.org/TR/2004/WD-SVG12-20041027/rendering.html#alpha-intro]]」のページではアルファコンポジットの説明が、数学的説明と共に載っている。

#right(){Tim - Feb 18, 2006}

----
**参考サイト(訳者による追加)
-RMagickオンラインドキュメント：[[http://www.simplesystems.org/RMagick/doc/index.html]]
--compositeメソッド：[[http://www.simplesystems.org/RMagick/doc/image1.html#composite]]
--CompositeOperator定数の一覧（src-over以外にも多数あり）：[[http://www.simplesystems.org/RMagick/doc/constants.html#CompositeOperator]]
--GravityType定数：[[http://www.simplesystems.org/RMagick/doc/constants.html#GravityType]]
--compositeメソッド（Drawクラス）：[[http://www.simplesystems.org/RMagick/doc/draw.html#composite]]
--RVGのチュートリアル：[[http://www.simplesystems.org/RMagick/doc/rvgtut.html]]


----
（&amp;counter()）

* コメント
コメント大歓迎です。ただ、スパムなど内容によっては独断で削除する場合があります。あらかじめご了承ください。

#comment    </description>
    <dc:date>2009-06-08T05:42:40+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/selflearn/pages/29.html">
    <title>Polaroid Effect</title>
    <link>http://www23.atwiki.jp/selflearn/pages/29.html</link>
    <description>
      *Polaroid Effect
#center(){
|開始日|2007年01月29日|
|最終更新日|&amp;date(j)|
}

**はじめに
最近（2007/01/23くらいから？）、はてなダイアリーや色々な場所でで賑わっている「[[Polaroize&gt;http://lab.rails2u.com/polaroize/]]」というWebサービスがあります。ローカルの画像を選択し[Upload]ボタンを押すだけで、ポラロイド写真風の画像が出来上がるというサイトです。
単一の目的に特化していて、余計な作業が要らないのがいいので個人的にも使わせてもらっています。

このサイトで使われている技術が気になったので調べてみたら、どうも「[[Polaroid Effect&gt;http://rmagick.rubyforge.org/Polaroid/polaroid.html]]」と呼ばれているRubyスクリプトを(たぶん)使用していることが分かりました。
（2007/1/30追記。作者であるsecondlifeさんの[[ブログ&gt;http://d.hatena.ne.jp/secondlife/20070125/1169654245]]でPolaroid Effectを参考にしていることがしっかりと書かれていました・・・読解力がなくてすみません）

スクリプト自体も思っていたよりずっと少ないコード量で処理を実現していたのでビックリ。その驚きが冷める前に、説明サイトを（意）訳してみることにしました。

**原著
#center(){
「Polaroid Effect」
http://rmagick.rubyforge.org/Polaroid/polaroid.html
}

**注意
-Polaroizeがこのソースを使っているかどうかは分かりません。実際、Polaroizeで生成された画像は少しボケが入っているようですし、使っていたとしてもよりリアルになるようなチューニングをしている可能性が高いです。
-もともと個人利用を目的として日本語化したために、けっこう意訳している部分があります。「意味分からないよ」とか「おかしいんじゃない？」とかいうのがあれば、オリジナルを参照するか、コメントで質問してください（がんばって調べます）。
--&quot;Not bad for about a dozen methods, eh?&quot;ってどういう意味なんだろう？
-間違いや改善点をコメントしてもらえると、かなり嬉しいです。
-画像のリンクを勝手にしてしまっているのですが、まずい場合には指摘してください。

**更新履歴
-2007/1/29 新規作成
-2007/1/30 画像の位置を修正したり、細かい修正とか。あと、訳文に「末尾に完全なスクリプトを載せる」と書いておきながら載せてなかったので(汗)、追加しました。
-2007/2/1 オリジナルのサイトをみたら(updated Jan 31, 2007)となっていたので、あわてて確認＆修正。最後に「One more thing...」が追加されていて、何でもImageMagick 6.3.2以降ではPolaroid Effect自体がそのままサポートされるらしい・・・ってまじですか！？RMagickでは（機能拡張された上で）1.15.0からサポートされるらしい。あわせて訳の細かい見直し。
--&quot;matte-pct&quot;がアルファチャネルのことだと判明。[[ここ&gt;http://www.simplesystems.org/RMagick/doc/struct.html#Pixel]]に「the opacity (also called alpha, or matte) channel」と書いてあった。
-2007/2/2 細かい部分を修正。ただ、自分が分かりやすくするために結構意訳している部分が気になってきました。公開している文章である以上、正確に原文を訳したほうが良いと思うので。今後は少しずつ原文に近い形に訳を戻していこうと思います。
-2007/2/26 実機（Mac OSX10.3.9）上で現時点の最新版（IM6.3.2&amp;RM1.15.2）を使って確認してみたところ、色々とサンプルどおりに動いていないことが分かったので、追記。
-2008/3/17 ソースコードを引用記法ではなく専用のプラグインで記述するよう変更。だいぶ読みやすくなった。
----
*訳文
古いポラロイドカメラがどのように動いていたかを覚えているだろうか？写真を撮ると印画紙が現像中の状態でカメラ後部から出てきていた。そしてしばらくしてから注意深く上を覆う膜をはがせば、「インスタントな」あなたの写真が姿を現していた。
出来たての写真はいつも少し反っていたから、反対側に優しくしならせて平らにしなければならなかった。

このツカミ((訳注：原著ではチュートリアルと書いてあります。))は、RMagickを使って古いポラロイドカメラ風の画像を作る方法を示している。Scott Kelbyは著書「The Photoshop Elements 4 Book for Digital Photographers」の中で、このようなエフェクトを「The Polaroid Effect」と名付け紹介していたが、同じことをしてみることにしよう。

以下はエフェクトを適用した一例だ。左側はオリジナルの画像で、右側はエフェクト適用後の画像だ。

#center(){
&amp;ref(http://rmagick.rubyforge.org/Polaroid/small-house.jpg) &amp;ref(http://rmagick.rubyforge.org/Polaroid/small-house-print.jpg)
}

なお、これはRMagickのチュートリアルではないことに注意してほしい。私の（以前の記事の）ように、RMagickを使った画像の操作に慣れていることを前提としているからだ。
以降でこのスクリプトのポイントを実行順に紹介し、そのときどきでの中間イメージを掲載するつもりだ。ただし、トラフィック節約のためにも画像はすべてオリジナルの1/2のサイズで表示している。

完全なスクリプトファイルは本書の末尾に置いておいた。

**「フチ」の追加
#codehighlight(ruby){{
require &quot;RMagick&quot;

if !ARGV[0]
    puts &quot;Usage: photo.rb path-to-image&quot;
    exit
end

image = Magick::Image.read(ARGV[0]).first

image.border!(18, 18, &quot;#f0f0ff&quot;)}}
このスクリプトは、唯一の引数として画像ファイル名を受け取るプログラムだ。

さて、ポラロイド写真は常に周りが白い「フチ」で囲われていたので、borderメソッドで画像に「フチ」を付け加えよう。

borderメソッドには3つの引数が必要だ：
-左右の「フチ」のサイズ
-上下の「フチ」のサイズ
-「フチ」の色

サイズはどれもピクセルで指定すること。例では上下左右共に18ピクセルで指定している。なぜ18ピクセルかって？72dpiの解像度で表示したときにちょうど18ピクセルは1/4インチになるよう狙っているからだ。だからプリンタなど別のデバイスを使用するような場合は、適当に調整してほしい。
「フチ」の色について、私は青みがかった白((訳注：原著では&quot;a very light bluish gray&quot;と書かれています。))を選んだ。この色は私のDellのモニターではいい塩梅だが、Macだとちょっと眩しすぎるかもしれないな。あなたがPowerBookユーザーだったらこう言うだろうよ。「フチ？どこにあるんだい？((訳注：確かにうちのiMacだと、白とほとんど区別がつきません))」。

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/bordered-house.jpg)
}

**「反り」の追加
#codehighlight(ruby){{
image.background_color = &quot;none&quot;

amplitude = image.columns * 0.01
wavelength = image.rows  * 2

image.rotate!(90)
image = image.wave(amplitude, wavelength)
image.rotate!(-90)}}
次は、カメラから写真が出てきた直後のように画像を反らせる。
もちろん、画像を本当にしならせるわけじゃない。目の錯覚によるトリックをつかって、「反り」を表現しているんだ。

まずは左右にほんのわずかなカーブを与えよう。ここでは、サインカーブに沿って画像を歪ませるwaveメソッドを使って画像をカーブさせている。

ところでwaveメソッドではカーブに沿ってピクセルを移動するため、どうしても元の画像で存在しなかった部分に、新しいピクセルが追加されてしまう。デフォルトでは、新しいピクセルの色には背景色が使われるため、今回は&quot;none&quot;という透明なピクセルを背景色として設定する。
これはあとで行う、写真が落とす影を付けるためだよ。
（2007/2/26追記：実際にローカルで確認したところ、jpegファイルの場合は上記に加えて「image.opacity = 0」というように『透明度を取り扱います』というように宣言しないと黒地が見えてしまいます。0は適当な値でいいので、一度opacityを設定しておいてください）

おっと、運が悪いことにwaveメソッドは上下方向にしか画像を変換できない。しかも私たちが必要なのは左右方向への変換だ。このことは物事を少しだけ難しくするけれど、画像を90°回転させてwaveメソッドを呼び、その後でまた90°回転させて元通りに戻せばいい。90°の回転は画像の情報を失わせることが無いので、何の問題も無いからだ。

waveメソッドには2つの引数が必要だ：
-amplitude（振幅。波の高さ）
-wavelength（波長。1周期の長さ((訳注：サイズはどちらもピクセルで指定))）

何回かの試行の末、私には振幅が1%の画像が一番「それっぽく」見えた。もちろんこれは私の芸術的センスによる判断なので、2.0%や2.5%がいいと思うんだったら、amplitudeの値を適当に変えてほしい。ただし、スムーズな「反り」にするには、wavelengthは必ず画像の高さの2倍ちょうどにすること。((訳注：サインカーブの波形を考えれば、2x未満では波の形が変わり反対方向に反り始めてしまうことが分かります。))

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/curled-house.png)
}

**「影」の作成
#codehighlight(ruby){{
shadow = image.flop
shadow = shadow.colorize(1, 1, 1, &quot;gray75&quot;)
shadow.background_color = &quot;white&quot;
shadow.border!(10, 10, &quot;white&quot;)
shadow = shadow.blur_image(0, 3)}}
ポラロイド写真が下に落とす影を作るため、ここでは4つのメソッドを使う。

「反り」を完ペキに表現するためには、影を同じような形で、ただし逆向きに反るよような形状で作成することが必要だ。
そこで、まずはflopメソッドを呼んで画像を縦軸に対して反対にしている。

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/flopped-house.png)
}

次にcolorizeメソッドを使って、画像の色全てをライトグレーに変える。
colorizeメソッドには4または5個の引数が必要だ((訳注：原著では&quot;The colorize method takes 3 or 4 numeric arguments&quot;とありますが、最後のブレンドする色を加えると4-5個になるため変えています。))：
-R領域にブレンドする割合(0.0 - 1.0)
-G領域にブレンドする割合(0.0 - 1.0)
-B領域にブレンドする割合(0.0 - 1.0)
-アルファチャネルにブレンドする割合（オプション）
-ブレンドする色

色の指定には、直接指定以外にもMagick::Pixelオブジェクトも使える。
各引数はRGBそれぞれのチャネルに対して指定色をどのくらい混ぜるかをパーセントで指定する。今回は単色の影を作ることが目的なので、RGBすべてに1.0(=100%)を指定して「gray75」色に塗りつぶしている。なおcolorizeメソッドはアルファチャネルに影響を与えないため、オリジナルで透明だった部分はcolorize後の影でも透明のままだ。

&quot;gray75&quot;はImageMagickが持つ名前付きパレットの１つだ。灰色用のパレットには100色用意されていて、&quot;gray0&quot;(黒)から&quot;gray100&quot;(白)まである。&quot;gray50&quot;はちょうど真ん中の灰色で、つまり今回の&quot;gray75&quot;は白と&quot;gray50&quot;の真ん中あたりの明度というわけだ。
ちなみにこれも私の芸術的センスによる判断なので、他の色・明度を使いたければ使うといい。

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/gray-house.png)
}

そして最後はblur_imageメソッドによって影をぼかそう。

blur_imageメソッドには2個の引数が必要だ：
・radius(直径)
・sigma(標準偏差σ)

影を作る場合、私はいつもradiusに0を渡している。もちろん、radiusが他のアプリケーションにとっては非常に重要なことは分かっているつもりだ。だけど今回のような影を作る場合には特に問題とならないからね。radiusを固定し、sigmaでぼかし具合を調整している。
なおsigmaが大きな値であるほど画像のぼけ量は大きくなるが、blur_imageの実行に時間がかかってしまうことには注意してほしい。

今回はそれらしい影を得るためsigmaへ3を渡した。これも他と同様、主観的な判断だ。
あと、border!メソッドを呼んでいるのはblur_imageメソッドの結果がオリジナルの画像サイズよりもぼかしたぶんだけ大きなサイズの画像を返すため。白い枠をすこし加えることで、白い背景になじむ影を得ている。（訳注：ここはかなり原文を変更しています）

ここでの一連の処理を行わせた結果が、下の画像だ。

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/shadow.jpg)
}

**影と画像の合成
#codehighlight(ruby){{
image = shadow.composite(image, -amplitude/2, 5,
                         Magick::OverCompositeOp)
}}
これまでに[[私の書いた記事&gt;http://rmagick.rubyforge.org/src_over.html]]を読んだことがあれば、ここではそんなに驚く要素はないだろう。

ここで再度ポイントに挙げるべき点は第2,3引数だ。それっぽく合成するために、画像を影からわずかに左にずらし、そして影よりも5ピクセル上に配置している。
（正直に言うとこの設定には満足していない。影に対する画像の正確な配置場所は画像の縦横比に依存するだろうから。現在の設定はこれまでの試行による近似値であり、実際にはオフセット計算の良い方法があるはずだ。（が、私には表現できなかった））

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/composite.jpg)
}

**ちょっとした傾き
#codehighlight(ruby){{
image.rotate!(-5)
image.trim!

out = ARGV[0].sub(/\./, &quot;-print.&quot;)
puts &quot;Writing #{out}&quot;
image.write(out)}}
残る作業は-5°のイカシタ傾きとtrim!メソッドによるバリの排除だけだ。もう一度言うが、ここでの値も私の芸術的センスによる判断の結果だから、7.5°でも、4～8°のランダムな値でも好きにしたらいい。ただし、私もよく変更に対して「less is more(少ないことは、より豊かなこと)」と考えるが、今回はよしたほうがいい。ほんの少し傾けただけでは画像がずれて配置されているように見えてしまうから！

最後に、ファイル名+「-print」という名前でディスクに保存する。ここでは同じフォーマットで保存しているが、別のフォーマットで保存したければファイル拡張子を別のフォーマットのそれに変えればいい。暗黙のうちに変換してくれるからだ((訳注：RMagickではそんな便利なことが出来てしまうんですか？まだ試してないので分からないですが・・・。))。ただしJPEGのような透過色をサポートしない形式の場合、出力は不透明な画像になることは覚えておいてほしい。

これが最終的な画像（フルサイズ）だ。

#center(){
#ref(http://rmagick.rubyforge.org/Polaroid/house-print.jpg)
}

**まとめ
Not bad for about a dozen methods, eh?((訳注：訳せませんでした・・・。))設定を色々と変えてみて、どういう結果になるかを試してみてほしい。こんな短いスクリプトでさえ、本当に色んな出力が得られるんだ。

この「Polaroid Effect」を作るに当たって、Anthony Thyssenにはお礼を言いたい。AnthonyはImageMagickのイカしたサンプルが多数紹介されているWebサイト「[[Examples of ImageMagick Usage&gt;http://www.cit.gu.edu.au/~anthony/graphics/imagick6/]]」の管理者だ。Check it out!

**One more thing... (原著で2007/1/31に追加)
ニュース！！
ImageMagickの開発者がこのチュートリアルを読んでくれて、何とPolaroid EffectをImageMagick自体に取り込むことを決めてくれた。ImageMagick6.3.2以降のリリースでサポートされるとのこと。
早速RMagickでも1.15.0からImage#polaroidメソッドを追加することにしたよ。さらに、polaroidメソッドでは写真の下にキャプションも追加できるようにした。
詳しくは[[こちら&gt;http://studio.imagemagick.org/RMagick/doc/image2.html#polaroid]]のドキュメントを見てくれ！

（訳者追記：参照先のドキュメントにある画像を転載します。こんな感じに仕上がるそうです。日本語はサポートされるんでしょうか？）
#center(){
#ref(http://studio.imagemagick.org/RMagick/doc/ex/polaroid.jpg)
}

**その他の例
「Polaroid Effect」によるその他のサンプルをここに置いておく。

#center(){
&amp;ref(http://rmagick.rubyforge.org/Polaroid/small-legs-print.jpg) &amp;ref(http://rmagick.rubyforge.org/Polaroid/small-cyclist-print.jpg)
}

**polaroid.rbの完全なソース
（訳注：サイトのスペースの関係で、コメントを別行に書いたり行の途中で折り返したりしています。「オリジナルじゃなきゃいやだ！」という方は[[こちら&gt;http://rmagick.rubyforge.org/Polaroid/polaroid.html#script]]から入手してください）
#codehighlight(ruby){{
require &quot;RMagick&quot;

if !ARGV[0]
    puts &quot;Usage: polaroid.rb path-to-image&quot;
    exit
end

image = Magick::Image.read(ARGV[0]).first

image.border!(18, 18, &quot;#f0f0ff&quot;)

# Bend the image
image.background_color = &quot;none&quot;

# vary according to taste
amplitude = image.columns * 0.01
wavelength = image.rows  * 2

image.rotate!(90)
image = image.wave(amplitude, wavelength)
image.rotate!(-90)

# Make the shadow
shadow = image.flop
# shadow color can vary to taste
shadow = shadow.colorize(1, 1, 1, &quot;gray75&quot;)
shadow.background_color = &quot;white&quot; # was &quot;none&quot;
shadow.border!(10, 10, &quot;white&quot;)
# shadow blurriness can vary according to taste
shadow = shadow.blur_image(0, 3)

# Composite image over shadow.
#  The y-axis adjustment can vary according to taste.
image = shadow.composite(image, -amplitude/2, 5,
                         Magick::OverCompositeOp)

# vary according to taste
image.rotate!(-5)
image.trim!

# Add -print to image basename, write to file.
out = ARGV[0].sub(/\./, &quot;-print.&quot;)
puts &quot;Writing #{out}&quot;
image.write(out)
}}
#right(){Tim - Sep 22, 2006 (updated Jan 31, 2007)}

----
**参考サイト(訳者による追加)
-Polaroize ： http://lab.rails2u.com/polaroize/
-原著：「Polaroid Effect -- http://rmagick.rubyforge.org/Polaroid/polaroid.html」
-RMagick ： http://rmagick.rubyforge.org/Polaroid/polaroid.html
--RMagickオンラインドキュメント ： http://www.simplesystems.org/RMagick/doc/index.html
-Examples of ImageMagick Usage ： http://www.cit.gu.edu.au/~anthony/graphics/imagick6

----
（&amp;counter()）

#comment    </description>
    <dc:date>2009-06-08T05:41:50+09:00</dc:date>
  </item>
  </rdf:RDF>

