横着プログラミング 第1回: Unixのメモ技術

最終更新日: 2002-03-18 (公開日: 2002-03-18)

Unix Magazine 誌に 2002年1月号から 2003年2月号にかけて連載し ていた記事の元の原稿です。


横着プログラミングとは

私は必要が発明の母だとは思わない。私の意見では、発明とは怠惰
から、おそらくはまた、まさに無精から生じるものである。面倒を
省くために。 -- アガサ・クリスティ

この言葉によると、どうも発明とは横着したいがために生まれるも のらしい。そう考えてみると確かに、私がプログラミングをする動 機は、横着するためのソフトウェアを作るため、という要素が大き い。突然、「うげー、面倒くせー」と叫んでプログラムを書き始め るのである。

そんなわけで、横着するためにプログラミングすることを私は勝手 に「横着プログラミング」と呼んでいる。本連載では横着プログラ ミングをテーマに、横着のコツや私が作った横着ソフトウェアを紹 介していく予定である。今回は横着のコツとして、Unixのメモ技術 を紹介する。

記憶力と検索力

私は記憶力が弱い。日常的に使わない知識はすぐに忘れてしまう。 おかげで、ペンで「進歩」という漢字を書けずに「新ポ」と書いて 顰蹙を買ったり、「大化の改新」を知らないといって馬鹿にされた りと、たいへんな目に遭っている。

とはいうものの、ペンで進歩と書けなくたって計算機を使えば入力 できるし、大化の改新など百科事典を調べれば載っていることであ る。そもそも、漢字の書き方など計算機を使ってものを書くぶんに は知らなくても困らないし、大化の改新など知らなくても生活には 困らない。どちらも必要なときに検索して思い出せればいいのだ。

と、このように、私は記憶力の悪さを補うために情報の検索に対す る切実な要求がある。情報を検索する力のことを、記憶力に対応さ せて私は勝手に検索力と呼んでいる。かのシャーロック・ホームズ も、事件が片付いたら事件の情報をさっさとファイルにまとめて事 件の詳細をすっかり忘れてしまうという。そして、必要なときにそ のファイルを調べて思い出すのである。私は検索力の補強のために 次のような対策を講じている。

  1. メモを頻繁に取って後から検索する
  2. Webの検索を多用する
  3. 計算機上に検索システムを構築する
  4. 電子辞書を持ち歩く
  5. デジカメを持ち歩く
  6. PDAを持ち歩く
  7. 地図を持ち歩く

まだまだ不満が山ほどあるのだが、なんとかこれらでしのいでいる。 今回は (1) のメモの話題を取り上げ、Unixのメモ技術について私 が実践しているノウハウを紹介したい。

Unixのメモ技術

メモの取り方は、専門の本が数多く出版されているくらい奥の深い 分野のようだが、メモに人一倍うるさい友人の山下達雄氏によると、 計算機を活用したメモの取り方を紹介した良書は見当たらないらし い。そこで山下氏は試行錯誤の末に ChangeLog形式でメモを取るの がよろしい、という結論に辿りついた。そんなわけで、私は氏から 伝授された ChangeLog形式でメモを取っている。ちなみに、我々の 周りでは他に 6 人ほど ChangeLogメモを実践している人がいるが、 みんな気に入っているようである。

ChangeLogメモ

本来 ChangeLog はソフトウェア開発の際にプログラムの変更履歴 を記録するためのテキストファイルの形式である。プログラムの変 更履歴を記録に残しておけば、あの変更はいつ行ったのか、といっ たことを後から調べたり、開発の進捗状況を眺めたりといった用途 に使える。典型的な ChangeLog の記録は次のようなものである。 箇条書きの * の左側に はTAB 文字でインデントが入ってい る。

2000-12-09  Satoru Takabayashi  <satoru@namazu.org>

    * src/mksary.c (parse_options): New option: --index, -i.

2000-12-08  Satoru Takabayashi  <satoru@namazu.org>

    * src/Makefile.am (sary_SOURCES): Simplified.

この記述を見れば 2000年12月9日に Satoru Takabayashi という人 が src/mksary.c というファイルの parse_options という関数に 変更を加えて --index, -i というオプションを追加したことがわ かる。新しい変更履歴は ChangeLog の先頭に追加していくため、 変更履歴の一覧は自然と新しい順に並ぶ。

テキストエディタEmacs では、C-x 4 a という キー操作で ChangeLog という名前のファイルに変更履歴を簡単に 追加できる。この操作により、日付やメールアドレス、ファイル名、 関数名の部分は自動的に入力される*1。このとき、ユーザ名は Emacs の変 数 user-full-name の値が、メールアドレスは user-mail-address の値が用いられる。私の場合は ~/.emacs で

(setq user-full-name "Satoru Takabayashi")
(setq user-mail-address "satoru@namazu.org")

と設定している。また、C-u C-x 4 a と いう操作でファイル名を指定して変更履歴を追加することもできる。

この ChangeLogのフォーマットでメモを取ることを、私は ChangeLogメモと呼んでいる。典型的な ChangeLogメモは次のよ うなものである。

2001-10-17  Satoru Takabayashi  <satoru@namazu.org>

    * Unix: タイムゾーンを一時的に変更する方法: % TZ=GMT date
    土 11月  3 13:30:28 GMT 2001
    - TZ環境変数を変更すればいい

    * Ruby: Enumerable#inject の使い方
    % irb
    >> (1..10).inject(0) {|x, y| x + y}
    => 55
    - Haskellの場合:
    % hugs
    Prelude> foldl (\ x y -> x + y) 0 [1..10] 
    55

    * アイディア: cdbiff: メールの到着を CD-ROMドライブがお知らせ
    - ejectコマンド一発。ローテクなところがいい

2001-10-16  Satoru Takabayashi  <satoru@namazu.org>

    * Windows: フォーカスのあたっているウィンドウをキャプチャする
    - Alt + PrintScreen キー

メモしたいことを単一のファイルに ChangeLog 形式で記述する。 要するにただこれだけのことである。

ChangeLogメモの利点

ChangeLogメモには次のような多くの利点がある。

特別なソフトを必要としない

ただのテキストファイルなのでテキストエディタさえあれば編集で きる。特別なソフトを使うと、そもそもソフトの導入が面倒だし、 そのソフトを使うのをやめたときにデータを移行するのがたいへん である。一方、ただのテキストファイルなら、今すぐに ChangeLog メモを始められるし、将来に渡ってデータの移行を心配する必要がない。

検索や加工が柔軟に行える

ChangeLogメモはただのテキストファイルなので、メモの検索や加 工にテキストエディタや Unixコマンドの持つ強力なテキスト処理 の機能を活用できる。

たとえば上の例のように Ruby に関するメモに "Ruby: " という目 印をつけておけば、Emacsで M-x occur を実行して Ruby: を検索すれば Ruby 関係のメモをさっと一覧表示で きる*2M-x occur の検索結果は次のように一覧表示される。

122:  * Ruby: Enumerable#inject の使い方
126:  * Ruby: 配列をシャッフルする方法
132:  * Ruby: shift は O(n)
514:  * Ruby: mathn を require すると、数値演算の挙動が変わる
830:  * Ruby: ruby -I /somewhere を Rubyスクリプト内で行う方法
2465: * Ruby: Object#send を覚える。これは便利
4616: * Ruby: IO#sync = true でバッファリングを抑制できる
4654: * Ruby: 日本語の tr には require 'jcode' が必要

この検索結果の一覧から目的の行を選択すれば、カーソルをメモファ イルの目的の位置に移動できる。同様にアイディアの一覧を表示し たければM-x occur で アイディア: を検索すればい い。もちろんメモの内容を M-% (query-replace) で文字列 の一括置換を行ったりといったテキストの加工も自在に行える。

日付が残るので作業日誌として使える

ChangeLogメモは作業日誌として活用すると便利である。メモに日 付が残るので、いつ何をやったのか後から簡単に調べられる。新し いメモは必ずファイルの一番上に記録されるので、上からざっと眺 めれば新しい順にメモを閲覧できる。

ちなみに、私は毎日の作業日誌を ChangeLogメモで記録している。 ワインバーグの『スーパーエンジニアの道』*3 によると、作業日誌をつけることは技術者にとって不可欠な行いだ そうである。半年に1 度くらい作業日誌にまとめて目を通すと、 「この半年間、相変わらずアホなことしかやっていないではないか」 などとその間の成果がわかって反省の材料になる。

作業中にすばやくメモを取れる

私の見る限り、大抵の Unixユーザは Emacs なり vi といったお気 に入りのテキストエディタを使って文章を書いたり、プログラムを 書いたりしている時間が一日のうちで長い割合を占めているようで ある。ChangeLogメモは、そういった作業の最中にエディタからメ モをすばやく取ることができる。

たとえば、Emacs なら ~/.emacs に次の設定を入れておけば、 C-x M というキー操作で、メモファイル ~/memo/diary.txt を開いて、日付と名前を入力して、個条 書き用の* を打つところまで自動で行なってくれる。

(defun memo ()
  (interactive)
    (add-change-log-entry 
     nil
     (expand-file-name "~/memo/diary.txt")))
(define-key ctl-x-map "M" 'memo)

面倒なことは長続きしないものなので、手軽にすばやくメモが取れ るという点は重要である。メモを取るたびにいちいち別のソフトを 立ち上げていたら面倒くさくてすぐにいやになってしまうだろう。

単一のファイルなので管理が簡単

以前に私は、プログラミング、読書、音楽、などとカテゴリ毎にファ イルを分けてメモを取っていたことがあるのだが、メモをどのカテ ゴリに分類すべきか悩んだり、どのファイルに目的のメモを記録し たのか思い出せなかったり、ファイルを紛失したりと、ファイルの 管理にたいへん苦労した。ChangeLogメモのように単一のファイル ならそういった手間から解放される。検索や加工を行なう際も単一 のファイルなら簡単である。また、印刷も手軽にできる。

野口悠紀雄氏の『「超」整理法』*4では「書類は 1か所にまとめて管理せよ、さもなくば書類は紛失する」という 「ポケット 1つ原則」が解説されているが、ChangeLogメモもこの 原則と同様に、ポケットを1つにすることによって、メモの紛失を 防いでいる。ファイルの上からメモが新しい順に並ぶという点も 『超・整理法』に通じる。他の計算機にChangeLogメモを移動する ときは、ファイルを 1つコピーするだけでおしまいである。

個条書きなので書きやすくて見やすい

メモをどのような形式でつけるべきかは意見の分かれるところかも しれないが、箇条書きは書きやすさ、見やすさの点で妥当な選択で ある。

ChangeLogメモの欠点

ここまで ChangeLogメモの利点ばかりを強調してきたが、もちろん 欠点もある。

画像や図を簡単に扱えない

これはテキストファイルの大きな制約である。メモには画像や図を 貼り付けたいものだが、テキストファイルではなかなかそれができ ない。仕方がないので、苦肉の策として

□□□□□□□□□□□□□
□□□□□□■□□□□□□
□□□□□□□□□□□□□
□□□■□□■□■□□□□
□□□□□□□□□□□□□ ←
□□□□□□□□□□□□□
□□□□□□■□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□

のようなアスキーアートにして記録したり、

2001-08-16  Satoru Takabayashi  <satoru@namazu.org>

    * Ruby/Bsearch を改良 akr氏のコメントにしたがう。図:
    </home/satoru/work/ruby-bsearch/bsearch.png>

のように画像のファイル名を書いたりして誤魔化している。Emacs 21なら次のような関数を ~/.emacs に定義して、M-x expand-images と実行すれば、</home/...> というファイル名 から画像を読み込んでバッファ内に表示できる。また、M-x insert-image-file でファイル名を補完しながら、画像をカー ソル位置に挿入できる。

Emacsで画像を埋め込み表示
Emacsで画像を埋め込み表示

  ;;
  ;; この関数は土屋雅稔さんが書いてくださった (ELF:01205)
  ;; <http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/>
  ;; 
  (defun image-file-name-completion (file predicate flag)
    "Completion function for image files."
    (let ((regexp "\\(jpg\\|png\\|gif\\)$"))
      (if (eq flag 'lambda)
          (and (string-match regexp file)
               (file-exists-p file)
               (not (file-directory-p file)))
        (let* ((dir (file-name-as-directory
                     (or (file-name-directory file)
                         default-directory)))
               (collection
                (delq nil
                      (mapcar
                       (lambda (f)
                         (unless (string-match "^\\.\\.?$" f)
                           (cond
                            ((file-directory-p (setq f (concat dir f)))
                             (list (file-name-as-directory f)))
                            ((string-match regexp f)
                             (list f)))))
                       (directory-files dir)))))
          (cond
           ((not flag)
            (try-completion file collection predicate))
           ((eq flag t)
            (all-completions file collection predicate)))))))
  
  (defun insert-image-file (filename)
    (interactive 
     (list (completing-read "Image file: " 'image-file-name-completion
                            nil t (file-name-as-directory default-directory))))
    (let* ((filename (expand-file-name filename))
           (image (create-image filename))
           (url (concat "<" filename ">")))
      (insert-image image url)))
  
  (defun expand-images ()
    (interactive)
    (let* ((pos (point))
           (home (getenv "HOME"))
           (regexp (format "<\\(%s/.*\\.\\(jpg\\|png\\|gif\\)\\)>" home)))
      (while (re-search-forward regexp nil t)
        (let* ((start (match-beginning 0))
               (end (match-end 0))
               (filename (match-string 1))
               (image (cons 'image (cdr (create-image filename)))))
          (add-text-properties start end
                               (list 'display image
                                     'intangible image
                                     'rear-nonsticky (list 'display)))))
      (goto-char pos)))
  
  ;;
  ;; Emacs 21.1 で *.jpg ファイルを create-image できない問題の回避策
  ;;
  ;; (defadvice create-image (around create-image-ad activate)
  ;;   (let ((type (if (and (stringp file-or-data)
  ;;                     (string-match "\\.jpg\\'" file-or-data))
  ;;                'jpeg type)))
  ;;     ad-do-it))

このように、がんばればなんとか画像をメモに埋め込むことはでき るのだが、画像を別ファイルとして保存するため、画像を紛失しが ちだし、Emacsの中からその場で画像を編集することができないな ど、不便な点は多い。その点、Windows の Word や PowerPoint な どではファイル名など気にせずに画像や図が扱えるし、その場で編 集できるという点で非常に優れている。図や画像をメモに貼るのに ファイルなどというものを意識したくないのである。

箇条書きにテキストが制限される

ChangeLogメモは箇条書きのフォーマットであるため、巨大なテキ ストを貼り付けると、形が崩れて視認性が落ちるという欠点がある。 次のような、1つの段落に収まる程度のテキストならいいが、この 原稿のテキスト全体を ChangeLogメモに貼りつけると、たいへんな ことになる。

    * ファイル名地獄: しかし、こう TeXなんかで文書を作っていると、
    こまごまとした図にいちいちファイル名をつけないといかんのが死
    ぬほど面倒である。PowerPointなんかだと図のファイル名なんて考
    えなくてもいいのに。

巨大なテキストを貼りつけられないという制約があるため、Web上 のニュース記事をクリップするといった用途には ChangeLogメモ は使えない。Webページをクリップする用途には、Windows 用には 「紙 2001」 *5 のよう な優れたソフトウェアがあるが、Unix用の適当なものを残念ながら 私は知らない。

ChangeLogメモの活用

Unixのツールには複雑なコマンドラインオプションを駆使しないと 使えないものがある。こうしたノウハウは ChangeLogメモに記録し ておけば、後から簡単に調べられて便利である。

    * gs で 1200 dpi の PDFを作る方法: foo.ps -> foo.pdf
    % gs -r1200 -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sPAPERSIZE=a4 -sOutputFile=foo.pdf foo.ps

以前の私はこういったコマンドラインオプションを律儀に覚えよう として不毛な努力を重ねていたのだが、メモを取り始めてからは滅 多に使わないノウハウはすっかり忘れてしまった。どうせすぐに調 べられるのだから、覚えておく必要がないのである。おかげで、頭 の中がすっきりした気がする (ますます頭が空っぽになっただけか もしれないが)。ちなみに、私の友人はこうしたメモを付箋に書い てディスプレイの周りに貼っていたのだが、肝心なときにはもはや 付箋は紛失しているという、涙ぐましい循環に陥っていた。現在は ChangeLogメモのおかげで幸せになっているようだ。

Unixのツールの使い方に限らず、私はあらゆるメモを ChangeLogメ モの作業日誌に記録している。アイディア、行動記録、読書メモ、 プログラミングのテクニック、ためになりそうな Webページ、ツー ルのインストール方法、設定方法、うまい店の情報、購入したCD、 気に入った格言、聞いた講演のメモ、友人が発した名言、思いつい たジョーク、などなど、大切なことからくだらないことまで、これ はと思ったことは何でもメモしておく。そして、これらのメモを元 に、おもしろそうなネタをメールなどの手段で情報交換している。 世の中には「情報は情報を提供する人のところに集まる」という法 則があるらしく、積極的にネタを提供すると、そのお返しとしてネ タを教えてもらえるようである。

Webのブックマークを ChangeLogメモにつけるという活用法は、な かなか便利なアイディアである。Webブラウザのブックマークは量 が増えるとすぐに破綻してしまうため、ブックマークに登録するの はニュースサイトなどのよくアクセスするページだけに限定して、 そうでないページは ChangeLogメモにタイトルとURLを記録するこ とにしている。次のように、URLの下にちょっとしたコメントを加 えることもある。ページの紹介文をコピーアンドペーストしておく と便利である。

    * sshpfw
    <http://arika.org/ruby/sshpfw.html>
    - sshpfwは SSHのポートフォワード機能を支援するためのツールで、 
    Ruby/Gtkで書かれています。

    * お〜れだっけ V.I.M. 
    <http://www.taiyaki.org/misc/vim/>
    - 日台氏の VIM踊り

私のメモには 1,437 個の URLが記録されているが、C-s の インクリメンタル検索や M-x occur を駆使して目的のペー ジの URLをすぐに見つけ出すことができる。さきほどの付箋の友人 はブラウザのブックマークを破綻させて、とんでもない状況になっ ていた。あまりにも印象的だったので記念にスクリーンショットを 撮らせてもらった。

ブックマーク地獄
ブックマーク地獄

実際のところ、Webページの場合は、手元の ChangeLogメモを検索 するより google.com で検索した方が速いことが多いのだが、おも しろかったページを作業日誌にメモしておくと、後から日誌を読み 直したときに、そのページの存在を思い出すことができて便利であ る。

と、私はこのように ChangeLogメモによる作業日誌を1年半ほど続 けた結果、手元の日誌ファイルは 19,405行、588KB に膨れ上がっ た。ゴミも混ざっているものの、私にとっては大切な財産である。 1日あたりの平均は35行で、ちょうどテキストエディタの画面に収 まる程度の大きさである。

ChangeLogメモの同期

複数の計算機を使っていると、各計算機に ChangeLogメモが分散し て困ることがある。分散した ChangeLogメモはポケット1つ原則に 反する。理想的には常に同一の ChangeLogメモを編集したいところ だが、そうもいかないのが実状である。そこで、複数のChangeLog メモの同期を取る必要がある。ファイルを同期するノウハウは山口 英氏の連載 Unix Communication Notes で詳しく解説されているの で、ここではそれを紹介するだけにとどめたい。

Web日記との関係

Web上に日記を載せている人が多い。かく言う私もせっせと書いて いる*8。 ChangeLogメモ と Web日記の関係であるが、私の場合は Web日記には、他の人にとっ て

という基準で、人に読んでもらうためのネタだけを書くため、あく まで自分用のメモである ChangeLogメモとは性質が異なる。Web 日 記を自分用のメモに使うのも悪くないが、私は手軽さという点で ChangeLogメモの方を気に入っている。なお、山下氏はChangeLogメ モを HTMLに変換して Web日記として公開するシステム chalow*9 を公開している。

紙のメモ帳

ところで、私は計算機から離れた場所では紙のメモ帳に走り書きで メモしている。PDAを持ち歩いているのに紙のメモ帳を使うのは変 だとよく言われるが、実際のところ紙にメモを取る方が断然速いか ら仕方がないのである。

ただし、紙に取ったメモは後から検索の役に立たないので、次に計 算機に向かったときに ChangeLogメモに書き写している。このとき、 走り書きのメモをある程度まとまった文章に直す。メモ帳はこれま た山下氏がお勧めの「DAIGO A1041 縦型 鉛筆付き手帳」を愛用し ている。このメモ帳については氏が「いつでもどこでもメモしたい」 というページ*10にま とめているのでそちらを参照していただきたい。要点は、

の 4つである。この特長のおかげで、「いつでもどこでもメモ」が 実現できる。我々の周りではたいへんな勢いで普及している。

鉛筆付きメモ帳1
鉛筆付きメモ帳1
鉛筆付きメモ帳2
鉛筆付きメモ帳2

clgrep: ChangeLogメモ用の grep

ChangeLogメモは基本的にはただのテキストファイルだが、

2001-09-17  Satoru Takabayashi  <satoru@namazu.org>

    * zsh: 履歴をすべての zsh プロセスで共通にしたい
    - option share_historyでできる
    - が、一回 ls なり改行を打つなりしないと同期できない

    * CD: Utopic Sporadic Orchestra (Magma)
    - De Futuraはやばすぎる。Jannick Top選手にはまいった

のように、各メモは一行単位ではなく空行で区切られたまとまりと して書かれているため、単純に M-x occur あるいは grep するだけでは検索結果が行単位で表示されて不便なと きがある。たとえば、上の例では share_history で grep すると

    - option share_historyでできる

としか表示されない。そこで、検索結果を

    * zsh: 履歴をすべての zsh プロセスで共通にしたい
    - option share_historyでできる
    - が、一回 ls なり改行を打つなりしないと同期できない

と、メモのまとまりで表示する簡単 grep ツールclgrep を 作成した。最低限の機能として、大文字・小文字を区別しない検索 を行うための -i オプションと、検索結果を逆順に表示する ための-r オプションを用意した。ChangeLogメモには上から 順に新しいメモが記録されているため、通常は検索結果は新しいメ モから順に表示されるが、 -r オプションを指定すれば、検 索結果を古い順に眺めることができる。

以下に、clgrepのソースコードを示す。

  #! /usr/bin/env ruby
  require 'getoptlong'
  
  def show_usage
    puts "usage: clgrep [OPTIONS] <PATTERN> [FILE]..."
    puts "    -i,  大文字・小文字を区別しない"
    puts "    -r,  検索結果を逆順に表示する"
  end
  
  # コマンドラインオプションを解析してハッシュとして返す
  def parse_options
    parser = GetoptLong.new
    parser.set_options(['--ignore-case', '-i', GetoptLong::NO_ARGUMENT],
                       ['--reverse', '-r',     GetoptLong::NO_ARGUMENT])
    options = Hash.new
    parser.each_option {|name, arg| options[name.sub(/^--/, "")] = arg}
    (show_usage; exit(1)) if ARGV.empty?
    return options
  end
  
  def main
    options = parse_options
    pattern = ARGV.shift
    regexp_option = Regexp::IGNORECASE if options['ignore-case']
    regexp = Regexp.new(pattern, regexp_option)
  
    results = Array.new
    while chunk = gets("") # 空行を境界として読み込む
      results.push(chunk) if regexp.match(chunk) # マッチしたメモを溜め込む
    end
    results.reverse! if options['reverse'] # -r なら検索結果を逆順にする
    puts results # 検索結果を表示
  end
  
  main

clgrep の実行例は次の通りである。

% clgrep share_history ~/memo/diary.txt
     * zsh: 履歴をすべての zsh プロセスで共通にしたい
     - option share_historyでできる
     - が、一回 ls なり改行を打つなりしないと同期できない

clgrep はオブジェクト指向スクリプト言語 Ruby*11 で実装した。このプログ ラムではオブジェクト指向らしさはあまり活かされていないが、 ちょっとしたツールを簡潔に書けるという点は感じ取ってもらえる と思う。ちなみに、私は、しばらく前まではこの手のプログラムは Perl*12 で書いていたが、最近はすっ かり Ruby で書くようになった。Rubyの方が書きやすいからである。 同様の理由により、私の周りでは PerlからRuby に移行した人が多 い。

TABだけの行問題

テキストエディタでChangeLogメモを編集していると、知らず知ら ずのうちに、TABだけの行を作ってしまうことがある。clgrep は各 メモが空行によって区切られていることを前提しているため、TAB だけの行があると、前後のメモが繋がってしまう。この問題を避け るためには、TABだけの行を削除すればいい。Emacs ならM-x query-replace-regexp で "^ +$" を "" に置換し て、TAB文字だけの行を削除できる。

おわりに

連載初回からいきなり「Unixのメモ技術」などといういまいち地味 な話題を扱ったが、こういったノウハウはあまり紹介されないもの なので、敢えて取り上げることにした。みなさんがメモ技術に興味 を持ち、メモ道に目覚めることを期待している。

次回は日本語のインクリメンタル検索システム Migemoを紹介する 予定である。Migemoを使うと ChangeLogメモをますます快適に検索 できる。なお、本連載で作成したプログラムのソースコードは筆者 のページ*13 から入手可 能である。

謝辞

今回の原稿を執筆するにあたって、メモ道の師匠である山下達雄氏 にお世話になった。ここに記して感謝する。

参考文献


Satoru Takabayashi

*1 C-x は Ctrlキーを押しな がら x を押すという操作
*2M-x は Altキーを押しながら x を押すという操作
*3末に参考文献
*4末に参考文献
*5<http://www.biwa.ne.jp/~nag/program/kami.html>
*6<http://www.cvshome.org/>
*7<http://www.cis.upenn.edu/~bcpierce/unison/>
*8<http://0xcc.net/diary/>
*9<http://nais.to/~yto/tools/chalow/>
*10<http://nais.to/~yto/doc/zb/0001.html>
*11<http://www.ruby-lang.org/>
*12<http://www.perl.com/>
*13<http://0xcc.net/unimag/>