細かいことばかりにこだわっていないで人間的になろう。 -- Jamie Zawinski
横着のためのプログラミングをテーマに、私が開発したソフトウェ アや、横着のノウハウを紹介してきた本連載も今回で最終回を迎え る。今回は最終回を迎えるにあたって、これまでの連載の概要とそ の後の経過についてまとめてみたい。
第1回: Unixのメモ技術
第1回の記事では、Unix上でメモを取るための方法「ChangeLogメモ」 を紹介した。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コマンド一発。ローテクなところがいい
いたって地味な内容であるため、反響があるか不安だったが、この 記事を読んで ChangeLog メモを始めた、という何人かの方からメー ルをいただいて、ほっとした。検索エンジンのgoogle *2 で「ChangeLogメモ」を検索すると、 この記事がきっかけでChangeLog メモを始めたという人がたくさん 見つかる。
メールをくださった一人の安宅正之氏は、記事で紹介した ChangeLog 検索用ツール clgrep を Emacs Lisp に移植し、 「ChangeLog メモを試してみよう」 *3 というページで公開している。Emacs 版の clgrep を使うと Emacs から快適に ChangeLog メモを検索できる。
メモ技術のその後
この記事では、紙のメモ帳は「DAIGO A1041 縦型 鉛筆付き手帳」 が機能的であると紹介したが、デザインがオヤジくさいのが難点で あった。そこで、現在は、色見本帳で有名な Pantone 社の鉛筆付 きメモ帳*4 に乗り換えて、鉛筆の 代わりに短いシャーペン *5をつけて使っている。友人の一人も同様の理由で Pantone のメモ帳に乗り換えた。こちらはおしゃれであるとなかな か好評である。これらの鉛筆つきメモ帳の情報は山下達雄氏の「い つでもどこでもメモしたい - 関連情報」というページ *6 にまとまってい るので参考にしていただきたい。
DAIGO A1041 縦型 鉛筆付き手帳 (右は短いシャーペン)
Pantone の鉛筆付きメモ帳
両方のメモ帳を開いたところ
第2回: Migemo: 日本語のインクリメンタル検索
第2回の記事では、日本語のテキストをすばやくインクリメンタル 検索するソフトウェアMigemo *7 を紹介した。Migemo は、かな漢字変換のステップを省略して、ロー マ字のままの日本語のインクリメンタル検索を実現する。次の図は Migemo を用いてキーワード「奇怪」をインクリメンタル検索する 過程を示したものである。
この例では、C-s k i k という 4打鍵で 目的のテキスト位置に到達している。かな漢字変換を伴う検索では、 読みの入力や変換、確定の操作などで 10打鍵以上を要する。この ように、Migemo を使えば、かな漢字変換の入力作業に煩わされる ことなく、スムーズな日本語のインクリメンタル検索が行える。
Migemo のその後
この記事を執筆した段階では、「執筆した段階」のような連文節の 検索には対応していなかったが、最新版では shippitsuShitaDankai のように、文節の先頭を大文字で指定する ことにより、連文節の検索ができるようになった。文節を大文字で 指定するという手法は、かな漢字変換システム SKK*8 から借用させていただ いた。連文節の検索は、文節ごとに生成した正規表現を連結するこ とによって実現している。
第3回: 履歴マニア
第3回の記事では、履歴を活用して作業を効率的に行うノウハウと して、シェルの履歴や Emacsの履歴などを活用する方法を紹介した。 履歴を活用すれば、コマンドラインの操作やエディタでのテキスト 編集を効率よく行える。
この記事では、ノウハウのひとつとして、Emacs の動的略称展開 (dabbrev) の機能を紹介した。動的略称展開を用いると、以前に入 力したことのある単語を少ない打鍵数で入力できる。たとえば、次 の図の例では real_pathname という変数名の綴りをすべて打つ代 わりに、r e a l M-/ (dabbrev-expand) と打って ``real'' を ``real_pathname'' に展 開している。動的略称展開は打鍵数を減らすだけでなく、打ち間違 いを減らすという点でも有効である。プログラミングにおいては長 い変数名や関数名を入力するのにたいへん役立つ。
履歴マニアのその後
記事を書き上げてしばらくしてから、「動的略称展開は便利だけど、 展開に使われた文字列が光ったらもっと便利ではないか」と思いつ き、Emacs Lisp のメーリングリスト *9 で提案したとこ ろ、白井秀行氏がすぐに実現してくださった。現在は、白井氏のコー ドを改良した版が土屋雅稔氏によって公開されている *10 。光る dabbrev を使うには dabbrev-highlight.el をインストー ル*11 して、 ~/.emacs に次の設定を加える。
(require 'dabbrev-highlight)
上の設定を加えると、さきほどの動的略称展開は次のようになる。 展開に使われた文字列 real_pathname の部分が光っているのがわ かる。
Emacsでファイルの自動保存
第3回の記事では触れなかったが、私の気に入っている Emacs のツー ルに auto-save-buffers というものがある。これは、編集中のファ イルを自動的に保存してくれるというものである。
Emacs ではファイルを保存するのに C-x C-s *12 という 2ストロークのキー操作を必要とする。私の見る限り、編集 中のファイルの内容を失わないように小まめにC-x C-s を押してファイルを保存している人は多いようである。
Emacs には編集中のファイルを #ファイル名# という名前で自動 的にバックアップしてくれる機能が備わっているが、それを知っ ている人でも C-x C-s を小まめに押す習慣は変わら ないようだ。おそらく、突然Emacs が落ちたりした場合にしっかり バックアップが取られるのか不安だったり、いくら自動的にバック アップがとられているといっても、元のファイルを長時間、更新し ないのは心理的に落ち着かないからだと思われる。
私も以前は、頻繁に C-x C-s を押していて、そのた めに左手の指が疲れていたほどだったが、あるとき、前述の Emacs Lisp のメーリングリストに、C-x C-s を押さずにファ イルを自動保存する方法はないものかと質問したところ、山岡克美 氏がさっそく auto-save-buffers というツールを作ってくださっ た。auto-save-buffers はキー操作が一定時間あいたときに、開い ているファイルをすべて保存する、という処理を行う。
;; ;; このコードは山岡克美氏が書いてくださった (ELF:01128) ;; ;; (require 'auto-save-buffers) ;; (run-with-idle-timer 0.5 t 'auto-save-buffers) ; アイドル0.5秒で保存 ;; ;; auto-save-buffers で対象とするファイルの正規表現 (defvar auto-save-buffers-regexp "" "*Regexp that matches `buffer-file-name' to be auto-saved.") (defun auto-save-buffers () "Save buffers if `buffer-file-name' matches `auto-save-buffers-regexp'." (let ((buffers (buffer-list)) buffer) (save-excursion (while buffers (set-buffer (car buffers)) (if (and buffer-file-name (buffer-modified-p) (not buffer-read-only) (string-match auto-save-buffers-regexp buffer-file-name) (file-writable-p buffer-file-name)) (save-buffer)) (setq buffers (cdr buffers)))))) (provide 'auto-save-buffers)
auto-save-buffers を使うには auto-save-buffers.el を dabbrev-highlight.el と同様にインストールして、~ /.emacs に 次の設定を加える。
(require 'auto-save-buffers) (run-with-idle-timer 0.5 t 'auto-save-buffers)
上の設定を加えて auto-save-buffers を有効にすると、キー操作 が 0.5 秒ないときに更新のあったファイルがすべて自動的に保存 されるようになる。この設定を加えてから 1年以上の間、私は C-x C-s をまったく打っていない。実に快適である。
以前の私は、シェルスクリプトなどを書いているときに、コードを 修正しても実行結果が変わらずおかしいと思ったらファイルを保存 し忘れているだけだった、というような初歩的なミスを繰り返して いたが、auto-save-buffers 以後はそういったミスからも解放され た。
しかし、auto-save-buffers はたいへん便利であると主張しても、 周りの人はなかなか納得してくれないことがわかった。反対意見と しては次のようなものがある。
- 編集途中の状態で Webページを保存してしまうと困る
- 編集前の状態にファイルを戻したいときに困る
たしかにこういった場合は困るかもしれないが、私の場合は
- Webページは CVS*13で管理しているので cvs commit するまでネット上には反映されない
- 編集はundoC-/で元に戻せるし、過去のファイルは pdumpfs (後述) でいつでも取り戻せる
ため特に困ってない。編集の undo と pdumpfs によるバックアッ プがあれば、ファイルを自動保存しても困ることはほとんどないと いうのが実感である。自動保存に慣れると、そもそも何で「ファイ ルの保存」などという操作が必要なのか不思議に思えてくる。
第4回: ttyrec: 端末を録画再生するツール
第4回の記事では端末を録画再生するツール ttyrec *14 を紹介した。ttyrec を使うと、emacs でも vi でも、端末上の作業なら何でも録画でき る。録画したデータは付属のttyplay コマンドで再生が可能である。
ttyrec と ttyplay コマンドの使い方は以下のように簡単である。 この例では録画データは foo.tty ファイルに保存される。
録画
% ttyrec foo.tty (シェルが立ち上がるので、自由に作業してから exit)
再生
% ttyplay foo.tty
この他にも、ttyrec には他の端末を覗き見する機能やファイル転 送を行う機能がある。
この記事では ttyrec の使い方を紹介するとともに、ttyrec の開 発を通じて得られたプログラミングのノウハウを紹介した。ttyrec は BSD 由来の script コマンド*15 のコードを元に、端末に出力されたすべての文字 (制御文 字を含む) とともに時刻情報を埋マイクロ秒単位でめ込むことによっ て端末の録画を実現している。再生側の ttyplay では関数ポイン タを多用した Cプログラミングの例を紹介した。
ttyrec のその後
この記事の「おわりに」では、GUIのスライダーを使って自由自在 に過去に遡ったりできるttyrec を内蔵端末があるとおもしろいの ではないかと書いたが、結局、形を作っただけで飽きて投げ出して しまった。
ttyrec は海外でも好評で、公開して約2年が経った今でもときどき 海外のユーザからのメールが届く。こういったことはなかなかうれ しいものである。
第5回: QuickML: 超お手軽なメーリングリスト
第5回の記事では使い捨て感覚でお手軽にメーリングリストを作っ て活用できるシステム QuickML *16を紹 介した。QuickMLは
- メーリングリストを作る
- メーリングリストを管理する
- コマンドメールを覚える
- Web上のフォームにあれこれ記入する
といった面倒さを解決し、いつでも、どこでも、誰でもお手軽にメー リングリストを活用できるシステムである。 QuickML.com で運用 を行っている。
QuickML では、○○○@quickml.com のような任意のアドレ スにいきなりメールを送るだけで、新しいメーリングリストを作成 できる。たとえば宴会のメーリングリストを作るには enkai@quickml.com にメールを送ればいい。このとき、 From: と Cc: のアドレスがメーリングリストに登録される。
Subject: 宴会メーリングリスト To: enkai@quickml.com ← 作りたいMLのアドレス From: satoru@namazu.org ← 自分のアドレス Cc: masui@pitecan.com ← 参加者リスト 突然ですが、宴会好きのメーリング ← 本文 リストを作ってみました。
同名のメーリングリストがすでに存在したときは、「あなたは○○ ○メーリングリストのメンバーではありません」というエラーメッ セージが返される。その場合は、違う名前をつけて作り直す必要が ある。メンバーを追加するときは、追加したいアドレスを Cc: に 指定してメーリングリストに投稿すればいい。
QuickMLのその後
この記事を執筆した 2002年3月の段階では QuickML.com の利用者 は約 3,000人だったが、9か月が経過した現在では約 25,000人と順 調に増えている。
QuickML で興味深かったエピソードにこんなものがある。あるとき、 「ほぼ日刊イトイ新聞」という人気 Webサイト *17の「ご近所のOLさんは、先端に腰掛けて いた。」というコーナーで QuickML が紹介されることが決まり、 これでやっと QuickML も大ブレイクかと私は大いに期待した。し かし、蓋を開けてみると、QuickML への反響はほとんどなく、取材 のときについでに写真を撮られて記事のおまけとして紹介されたイ モムシのおもちゃ *18 の方ばかりに反響が集中した。「このイモムシ君は何ですか」「一目 惚れしました」「どこで買えるのですか」などなど。困ったもので ある。
第6回: chatty: 小うるさい端末
第6回の記事では、ユーザが入力した文字列に応じて端末のタイト ルバーに小うるさいメッセージを表示するソフトウェア chatty*19 を紹介した。 「だから何なんだ」と言われそうだが、本当にそれだけのソフトウェ アなのだから仕方がない。たまには人を呆れさせるくだらないソフ トウェアを作るのも楽しい。
この記事では chatty の開発を例にとって
- 2分木を用いた辞書検索
- C言語でビジターパターン
- テストの自動化
- メモリリークの検出
- 性能評価
といったプログラミングの技法を紹介した。くだらないソフトウェ アでも真剣に作っておくと、後々にノウハウやコードを活かすこと ができる。こういったことは忙しいときにはなかなかできないので、 時間のあるときに楽しみとして取り組むのがいいんんじゃないかと 思う。
chatty のその後
chatty は一発ネタとしてなかなか好評で、公開直後は多くの Web 日記サイトからリンクを張られて盛り上がったが、一発ネタの宿命 ですぐに忘れ去られてしまった。私自身もすっかり飽きてしまい、 最初のバージョンを公開してから何もいじっていない。
第7回: zphoto: ズーミングするオンラインアルバムを作るツール
第7回の記事では、ズーミングするオンラインアルバムを作るツー ル zphoto*20 を紹介し た。zphoto を開発する以前は、簡単なシェルスクリプトで HTML を自動生成していたが、こうして作成したオンラインアルバムは見 た目が地味でさみしいのが欠点であった。そこで、見た目がかっこ よくて、サムネイル (縮小画像) にカーソルをあわせるだけで写真 がなめらかに拡大 (ズーミング) するツールが欲しいと考えて作っ たのが zphoto である。
一見、ただサムネイルを升目状に並べただけのように見えるが、気 になる写真の上にカーソルをあわせると、その写真がなめらかにズー ミングする。このとき、写真の右下には撮影日時が表示される。
この状態でクリックすると新しいウィンドウが開いてフルサイズの 写真が表示される。
zphoto はズーミングを実現するために Flash *21 の技術を採 用している。Flash とは、アニメーションや音声を用いたマルチメ ディアコンテンツを作成する、Macromedia社のソフトウェアである。 また、Flash で作成したコンテンツのことも Flash と呼ばれる。 zphoto は Macromedia の製品を利用する代わりに、 Ming*22というフリーソフトウェ アを用いて Flash のコンテンツを生成している。この記事では zphoto を紹介し、あわせて Ming を使って Flash を生成するプロ グラミングの方法を紹介した。
zphoto のその後
zphoto は自分では概ね満足して使っているものの、他の人にとっ てはものたりない部分があるようで、「こういう機能が欲しい」 「カスタマイズしたい」といった要望が何件も届いている。しかし、 こういった要望に応えてほいほいと機能を追加していくと、複雑で 使いにくいソフトウェアになってしまいがちであるので、せっかく 送っていただいたパッチもいくつか採用を見送っている。
ソフトウェアの機能の多さと使いやすさのバランスを取るのは難し い問題である。ユーザインターフェイスデザインの専門家である Alan Cooper 氏は著書『コンピュータは、むずかしすぎて使えない!』 *23の中で、「多くのユーザを満足させようとする より、たった 1人のためにデザインする方が成功する」と主張し ている。みんなの要望を満たすように機能を寄せ集めるより、対象 とする典型的なユーザ像を徹底的に作り上げ、そのユーザに特化し たデザインをするのが成功の秘訣ということのようである。
私の場合も自分というたった 1人のためににデザインしているとい う点では Alan Cooper 氏の主張と共通するが、使いやすいソフト ウェアを求める典型的なユーザ像としては片寄りすぎているのが難 点である。私が開発したソフトが多くの場合マニアにしか受けない 理由はどうもこの辺にあるようだ。
第8回: pdumpfs: 毎日のスナップショットを保存する
第8回の記事では 毎日のスナップショットを保存するバックアップ システム pdumpfs を紹介した。pdumpfs で毎日バックアップを取っ ていれば、 1日前や1週間前といった過去のファイルをいつでも取 り戻すことができる。
pdumpfs の使い方は簡単である。たとえば /home/satoru というディ レクトリを /backup の下にバックアップするには
% pdumpfs /home/satoru /backup
のように実行すればいい。毎朝 5時に pdumpfs で /home/satoru を /backup の下にバックアップするには crontab に次の設定を加 える。
00 05 * * * pdumpfs /home/foo /backup >/backup/log 2>/backup/error-log
pdumpfs はバックアップ先ディレクトリに「年/月/日」の形式でス ナップショットを保存する。たとえば、2002年7月15日に pdumpfs を次のように実行すると
% pdumpfs /home/satoru /backup
/backup/2002/07/15/satoru というディレクトリが作成され、 /home/satoru 以下のファイルがその日のスナップショットとして コピーされる。翌日に同じコマンドを実行すると /backup/2002/07/16/satoru にスナップショットが作成される。 pdumpfs は、2日目以降は前日のスナップショットに対する差分と してバックアップを行うことによって、ディスクの消費を節約して いる。具体的には、前日から更新のあったファイルのみを新たにコ ピーし、更新されなかったファイルは前日のスナップショットのファ イルに対するハードリンクとして記録している。
pdumpfsのその後
pdumpfs でバックアップを取り始めて 1年以上が経った。過去のファ イルを取り出したいと思うことは月に 1度くらいしかないが、いつ でも過去のファイルを取り戻せるというのは気分がいい。
pdumpfs を公開すると、すぐにバックアップの対象から特定のファ イルを除外する機能が欲しいという要望が届くようになった。私は コマンドラインオプションがひとつもないのが pdumpfs のよさの ひとつだと思っているので、こういった要望が届いてもなかなか対 応する気にならない。しかし、いつまでも要望が絶えないようなの で、 --exclude というオプションを近々追加しようと考えている。
第9回: Sary: Suffix Array のライブラリとツール
第9回の記事では Suffix Array を扱うためのライブラリとツール をセットにしたソフトウェア Sary *24を紹介した。Suffix Array は
- データ構造が極めて単純なため扱いやすい
- 巨大なテキストの高速な全文検索に適している
という特徴を持ったデータ構造である。この記事では Sary の使い 方とあわせて Suffix Array の仕組みについて紹介した。
Sary には sary と mksary という2つのツールが付属している。 sary コマンドは grep のようなテキスト検索を行う。巨大なテキ ストファイルも一瞬で検索できるのが特徴である。ただし、mksary コマンドであらかじめ検索対象のテキストファイルに対して Suffix Array を作成しておく必要がある。たとえば、テキストファ イル foo.txt に対して Suffix Array を作成するにはコマンドラ インから次のように実行すればいい。
% mksary foo.txt
mksary の実行が終了すると、Suffix Array である foo.txt.ary ができ上がる。作成した Suffix Array を用いて foo.txt を検索 するには sary コマンドを次のように実行すればいい。検索には foo.txt と foo.txt.ary の両方が必要である。
% sary keyword foo.txt
keyword には検索したいキーワードを指定する。検索結果は grep コマンドと同様に標準出力に表示される。
Saryのその後
第9回の「おわりに」でも述べたように、私は巨大なテキストを検 索したいという場面はそれほど多くないことに気づいて、Sary を 使っておもしろいアプリケーションを作ろうという熱は冷めてしまっ た。しかし、この記事がきっかけで、バイオインフォマティクスの 方面で、Sary が話題になったという話を聞いた。巨大なテキスト ファイルとして保存されているゲノムデータベースを検索するのに Sary が使えるのではないか、ということである。Suffix Array を バイオインフォマティクスに応用する話は古くからあるが、簡単に 使えるツールとして Sary が注目されたようだ。他にも Sary の応 用分野があれば教えてもらえるとうれしい。
第10回: scmail: Scheme によるメールフィルタ
第10回の記事では Scheme によるメールフィルタ scmail を紹介し、 あわせて Scheme にプログラミングの例を紹介した。scmail は 次 のような特徴を持っている。
- Scheme で実装されている (500行程度のシンプルな実装)
- 通常の振り分け規則は簡単な S式で書ける
- 高度な振り分け規則は Scheme プログラムとして書ける
- メールの受信時に自動振り分けができる
- メールを読み終えた後で受信箱の中を自動振り分けできる
- メールのへッダに含まれる日本語を手軽に扱える
このうち 2 と 3 は Scheme で書かれていることによる大きな特徴 である。
scmailのその後
scmail を使い始めて 2か月が経過した。当初の目的通り、メーリ ングリストのメールの自動振り分けなどに活用している。次のよう に正規表現を使った規則を定義しておくと、メーリングリストごと にいちいち規則を定義しなくても、大抵のメーリングリストを自動 振り分けできて便利である。
(add-filter-rule! '(x-ml-name (#/([-._\w@]+)/ "ml/\\1")) # fmlとQuickML用 '(list-id (#/<([-._\w]+)>/ "ml/\\1"))) # Mailman 用
また、以下のような規則を定義してメール受信時に迷惑メールの振 り分けを行っている。
- Subject: に「未承諾広告※」などが含まれるメール
- 文字コードが中国語や韓国語のメール
- Subject: に viagra や adult といった単語が含まれるメール
- X-Mailer: に迷惑メール送信用ソフトの名前が含まれるメール
- From: のアドレスが個人的なブラックリストに載っているメール
迷惑メールは、削除せずに ~/Mail*25 の下の junk というフォルダに振り分け て溜めている。5 のブラックリストはこの junk フォルダに溜まっ ているメールから From: のアドレスを定期的に自動集計して作成 しているものである。
手元のログを調べたところ、11 月に私が受け取った迷惑メール 678通のうち、scmail が自動的に迷惑メールとして自動振り分けし てくれたのは 549通であった。上のような簡単な規則だけで 80% の迷惑メールを目にしないで済んだのはうれしい。
筋金入りの Lisper (Lispプログラマ) である Paul Graham 氏は、 規則による迷惑メールの判定には限界があり、メール本文の出現単 語を用いて統計的に判定した方がうまくいくと主張している *26。Paul Graham 氏 の手法は、複雑な機械学習のアルゴリズムを必要とせず、単純な条 件付き確率の計算だけで行えるものである。近いうちに scmail に 取り入れて実験してみたいと思っている。
第11回: 小粒なツールたち
第11回の記事では、Web・メール・画像関連の小粒なツールを紹介 し、あわせて小粒なツールのプログラミングのノウハウを紹介した。 紹介した小粒なツールを以下に挙げる。
Web関連
- url-extract: HTMLファイルからリンク部分のURLを抜き出し、URL一覧を作る
- webpngize: 指定されたディレクトリ以下のGIFファイルをすべてPNGに変換し、HTMLファイル内のリンク部分も書き換える
- html-downcase: HTMLファイルのタグを大文字から小文字に変換する
メール関連
- mailrank: メーリングリストの投稿ランキングを集計する
- xface-gallery: メールのヘッダから X-Faceを抽出して一枚の大きな画像ファイルを作る
画像関連
- thumbnail: 画像のサムネイルを作る
- dropshadow: 画像に影をつけたり枠をつけたりする
- sync-day-by-day: デジカメ写真を日付のディレクトリごとに分類しながらコピーする
この記事で取り上げるのを忘れた小粒なツールに timer というも のがある。timer はその名の通りタイマーとして働く。コマンドラ インから次のように実行すると、60秒をカウントしながらプログレ スバーを表示する。
% timer 60 Timer 46 |oooooooooooooooooooooooooooooooooooooooooooooo |
他のコマンドと組合せると、 n 秒後に何かを行いたいときに使え る。マウスでメニューを開いている瞬間のスクリーンショットを撮 りたいときは、 マウス操作のために 10秒程度の余裕をみてからス クリーンショットを撮るコマンドを実行すればいい。
# 10秒後にスクリーンショットを撮影する % timer 10 && xwd -root | convert - screenshot.png
sleep コマンドでも同様のことはできるが、プログレスバーが表示 されると視覚的にわかりやすく便利である。
timer のソースコード
#! /usr/bin/env ruby class Timer def initialize (sec) @sec = sec @bar = "o" * 60 end def show_bar (remaining) len = (remaining.to_f / @sec * @bar.length).to_i bar = sprintf("|%.*s%*s|", len, @bar, @bar.length - len, "") eol = if remaining == 0 then "\n" else "\r" end STDERR.printf("Timer: %4d %s%s", remaining, bar, eol) end def start @sec.times {|i| show_bar(@sec - i) sleep(1) } show_bar(0) end end sec = if ARGV.empty? then 60 else ARGV.shift.to_i end timer = Timer.new(sec) timer.start
おわりに
今回は最終回を迎えるにあたって、これまでの連載の概要とその後 の経過についてまとめた。振り返ってみると、ずいぶん取り留めの ない内容だった気もするが、単にソフトウェアの使い方を紹介する だけにとどまらず、プログラミングのノウハウや開発の舞台裏をあ わせて紹介できたのはよかったと思っている。
冒頭に挙げた Jamie Zawinski 氏の言葉は、元は計算機に向けて放 たれたものだが、計算機に深く関わっている人間に対しても当ては まるのではないかと思う。細かいことばかりにこだわって重箱の隅 をつつくような不毛な議論に終始したり、技術的な詳細ばかりにこ だわって肝心の人間にとっての使いやすさを忘れてしまったり、と いった失敗を私は何度もしている。ソフトウェアを作る上で一番大 切なことはこの言葉が言い表しているのではないかと思って私は気 に入っている。
最後に連載にお付き合いいただいた読者のみなさんに感謝したい。
参考文献
- Alan Cooper, 山形浩生訳 『コンピュータは、むずかしすぎて使えない!』 , 翔泳社, 2000.