仕事で使った自作Perlプログラム:count.pl

昨日のチバピーで、懇親会のときに「Perlどうですか、何か作れそうですか」みたいなことを聞かれたので、「超小さいレベルですけど、もう仕事に使ってるのもありまして、if文とfor文で、こんな感じで・・」と説明した、それを説明します。

ぼくが編集してるcommmons: scholaっていうCDブック形式の音楽全集のブックレットでは、坂本龍一さんと各テーマのゲストの方々による座談会の模様が掲載されていて、そのテキストの下に脚注を掲載しているんですが、その脚注っていうのが、テーマによるんだけど大体毎回100個ぐらい。少ないときは70個ぐらいだけど、多いときは150を超える。

これは別に多けりゃいい、というものでは全くないんだけど、現状そのようになっていまして、とにかく作るのが超大変。
大変だけど、作らなきゃ始まらない終わらない、ということで必死に自分を奮い立たせて毎回ひとつひとつ作っていくんですが。
このときに、ただ延々と作っていくより、ぼくの場合は「ああ、2個終わった」「さらに1個終わった」「今日もこれだけやった。残り59個だ。今のペースならあと*日で終わる・・」とか計測していくことでモチベーションが保てるというか、まあ上がりはしなくても少なくとも折れもしないので、そのようにやっていて。

んで、今回の巻の制作においては、ちょうどその少し前にPerl入学式でfor文とかif文を教えてもらっていたので、それを使って以下のような「自分がいま注釈工程全体のうちのどこにいるのか」を一覧的に把握するためのスクリプトを作ってみました。

簡単に説明すると、まず、この「count.pl」と同階層に「notes.txt」というテキストファイルを置いて、その中で注釈を作っているとしましょう。
んで、たとえば以下の10個の語句について、注釈を作らなきゃいけなくなった、としましょう。

Perl, Ruby, Python, Java, JavaScript, PHP, Go, MySQL, Git, Vim

そうしたら、初めに「notes.txt」に以下のように書きます。

□Perl
□Ruby
□Python
□Java
□JavaScript
□PHP
□Go
□MySQL
□Git
□Vim

このとき、行頭につけた「□」というのは単なる飾りではなくて、「まだその語句の注釈内容を作っていない。とりあえず見出しだけ作った」というステイタス(進捗)を示しています。

そこまで来たら、おもむろに注釈の内容を作り始めます。とはいえ、さすがに一気に完璧な文章を作ることはできなくて、まあ出来る人もいるかもしれないけど、ぼくにはできない。
じゃあどうしているのかと言うと、まずはラフな文案を作って、そこから徐々に修正していく。というかまあ、仮にひと息に完璧な内容を作れたところで、紙面に合わせて文量を調整しなきゃいけないわけなので、結局「未作成」から「完成」に一気に飛ぶことはできなくて、その間に「作成中」というステイタスが必要になる。

んで、その「作成中」の項目を「◎」で記すことにします。
そしてそれがやがて完成したら、「■」マークを行頭に記す(書き換える)ことにします。

こんなルールで注釈を作り始めて、ある日の「notes.txt」がこんな感じになっていたとしましょう。
#くり返しますが、「■=完成、◎=作成中、□=未作成」です。
#ちなみに、以下のサンプル文の内容はWikipedia

■Perl
Perlは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、C言語やsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。

◎Ruby
Rubyは、まつもとゆきひろにより開発されたオブジェクト指向スクリプト言語。

■Python
Pythonは、オランダ人のグイド・ヴァンロッサムによって開発されたオープンソースのオブジェクト指向スクリプト言語。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。

■Java
Javaは、狭義ではオブジェクト指向プログラミング言語Javaであり、広義ではプログラミング言語Javaのプログラムの実行環境および開発環境をいう。

□JavaScript

■PHP
PHPは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。

◎Go
Goは、Google社によって開発され、設計にロブ・パイク、ケン・トンプソンらが関わっているプログラミング言語。

□MySQL

□Git

◎Vim
Vimは、vi から派生し、発展した高機能なテキストエディタである。

はい。で、この「note.txt」に対して、上記の「count.pl」を走らせるとこんなのが出てきます。

■Perl
◎Ruby
■Python
■Java
□JavaScript
■PHP
◎Go
□MySQL
□Git
◎Vim

Total:	10
■:	4
◎:	3
□:	3

どうでしょうか。この出力結果からぼくが読み取るのは、

  • 今自分はこういう語句群に関する注釈を作っている、ということ。
  • 「■」の語句は、すでに完成しているということ。
  • 「◎」の語句は、作りかけであるということ。
  • 「□」の語句は、手付かずであるということ。
  • 手がけている語句は「トータル10個であり、完成(■)4個、途中(◎)3個、手付かず(□)3個である」ということ。

です。

実際にはこれが100個以上ザーーーッて並ぶわけで、そうすると何というか、一番気になるのは最後の4行なんだけど、同時にいろいろ実感的に自分の進捗もわかる、という寸法です。

さらに、もし「未完成の語句だけ確認したい」という場合には、このスクリプトの途中に3回出てくる

print "$str";

のうち、■と◎をプリントさせている行をコメントアウトすれば、未完成の語句だけが出てきます。
もちろん完成語句だけを出力してうっとりしたいとか、作成中の◎だけを出力してそれを今日のタスクにしようとか、そういう操作もできるし実際してました。

非常にシンプルというか簡単というか短い内容ですが、これまで12冊分作ってきた注釈作成の工程に、今回の13冊目の作業でこのひと手間を加えたことによって、精神的には随分助かったかなと。

ちなみに、精神的なメリットはわかったけど実作業における効果はどの程度だったのよ、という声ももちろん出てきうるわけなので、比較可能なデータを取っている過去4巻分と比べてみたところ、「2勝2敗」。
つまり、今回より早かった巻が2回と、今回より遅かった巻が2回。そして、そのいずれも数日程度の差だったので、まあ目に見える効果っていうのはないですね・・ってひどいオチだ。

仕事ではない日常で使っている、似たようなスクリプトもあるのでまた時間のあるときに書きます。

書きました。
日常を記録するためのPerl自作スクリプト:log.pl - draft