Perlで日々の行動や考えを記録する: "Worg" のご紹介

こちらは Perl入学式 Advent Calendar 2014 の10日目の記事です。

昨日は @__papix__ さんの「Perl入学式の歴史 〜その2 2012年〜」でした。
とてもドラマチックで、人間同士の一つ一つのつながりが「Perl入学式」を作ってきたのだなあ、と思いました。

僕の方は、このAdvent Calendarでこれまでに2本、やや抽象的で概念的な話を書いてきましたので、

今回はもう少し具体的に、ではプログラミングを学んで何を作ったのか? ということについて書いてみたいと思います。

イントロダクション 〜 Markdown環境について

前回までの記事にも書きましたように、僕の本業はCDブックの編集者です。
したがって、普段の仕事でプログラミングをする機会はありません。

しかしながら、プログラミング学習を通して得た知識や経験によって、生活や業務の上で便利になったことはたくさんあります。

たとえば、VimMarkdown、Gitやターミナルなどは毎日のように使いますし、とくにVimMarkdownがない生活にはもう二度と戻れないでしょう。

この記事もまた、MacVimというエディタに、Markdown形式でドラフトを書いています。

f:id:note103:20171007035219p:plain

僕のMarkdown環境については、以下の記事にも少し書きましたので、ご興味がおありの方はぜひどうぞ。

そしてもちろん、こうした環境面のことだけでなく、Perl入学式で学んだことを用いて実際に作成したツールもいくつかあります。
今回は、その中の一つである「Worg」(ワーグ)を紹介したいと思います。

Worg

「Worg」という名称は、「Work」+「Log」から来ています。
読み方は、上記の「ワーグ」でも、「ウォーグ」でも「ワルグ」でも構いませんが、ここでは便宜的に「ワーグ」と呼ぶことにします。

このツールは、その語源が示す通り、業務の記録作業を補助するために作りました。
GitHubでも公開しています。
GitHub - note103/Worg: Works and logs

そして、このツールの元には、今年の3月に開催された「Perl入学式 in東京 第2期修了式」のLTで初披露したツール「chat2spreadsheet」があります。

リンクの後者にもありますが、僕がそのときに発表したスライドを掲示しておきます。「chat2spreadsheet」に関する話はp31から始まります。

作業の流れ

今回紹介する「Worg」では、原型となった「chat2spreadsheet」から大小の書き換えがなされ、とくに、元々は1本のPerlスクリプト(c2s.pl)だけで済ませていた各種の処理を、一つの実行ファイル(worg.pl)と複数のモジュールに分けたことなどは、我ながら頑張りましたね、という感じではあります。

一方、その実行ファイルやモジュール内で実際にやっていることは、前のバージョンでやっていたこととほとんど変わらず、基本的にはif文とfor文とwhile文と正規表現をひたすら繰り返しているのみです。

そしてまた、以下のような作業全体の流れも共通しています。

1. 自分の行動や考えの記録を非公開のチャットルームや手元のエディタにどんどん投げ込んでいく。
2. それが一定量溜まったらテキストをコピーして、Perlスクリプトを通して記録用の統一書式に変換する。
3. 変換後のデータを閲覧用の場所に貼り付ける。

この2番目で使用する「Perlスクリプト」が、今回のツールです。

原型である「chat2spreadsheet」の方では、変換後のデータをExcelに貼り付ける前提にしていたので、テキストはタブと改行で区切っていました。
Excelは良くも悪くもいろいろな言われ方をしますが、やはりデータを整理することにはとても向いていると思います。

しかしながら、この場合の悩みは「せっかく整理した情報を読み返す(再利用する)ことが難しい」ということでした。
ExcelはPC以外の場ではあまり柔軟に使用できず、情報を入れることには適していても、取り出すことには向いていないようでした。

その点、やはり扱いやすいのはテキストファイルです。何しろ動作が軽快で、テキストファイルで運用できれば、データを修正する負担もだいぶ軽減されます。

また、閲覧に際しては、理想としてはブログの形態に落とし込んで、それをブラウザから見られるようにしたいと思っていました。

そこで試しに、ローカル環境にWordPressを構築して数ヶ月間更新してみたのですが、この方法の場合、確かに閲覧性は良くなるものの、情報を入れる更新作業が非常に大変で、これならまだExcelでやる方が良いと考え、継続することは断念しました。

そして、そのような時に出会ったのが、我らが @songmu さんの手によるブログツール「Riji」でした。

Riji

Riji のことは、2013年のYAPC::Asia衝撃のLTで存在は知っていましたが、


LT 2013年代のBlogツールRijiの紹介 - Songmu - YouTube

自分でも使えそうだな、と思ったのは「Perl入学式」の公式サイトで運用している様子を間近で見たからです。
Perl入学式 プログラミング初心者のためのPerl入門講座

僕は去年の3月に前述のLTをして、Perl入学式を(ひとまず)卒業し、4月からサポーターとして、運営サイドのお手伝いに回りましたが、その大きなメリットは、プログラマーの皆さん(先輩サポーター)が普段どのような話をしていて、どのような活動しているのかということについて、それまで以上に長い時間触れられるようになったことです。

Rijiの運用方法を知ることができたのも、そのメリットの一つで、もっとすごく大変だと思っていたけど、サポーターの人たちが実際に使っているところを見てみると、「このぐらいなら僕の知識やスキルでもできそうだな」と一気に興味が深まり、以下のチュートリアルを少し集中的に読んだところ、数日のうちに自分でも使えるようになっていました。
Riji tutorial

RijiはMarkdown形式のテキストファイルと、Gitさえあれば簡単に自分のブログを作ることができるツールです。
WordPressのようなデータベースの設定も不要ですし、テキストファイルとMarkdown形式が好きで、Git操作への憧れを持つ僕にはこれ以上ない選択肢でした。

たこれにより、「chat2spreadsheet」の方ではExcel用のタブ区切りの書式を採用していましたが、「Worg」の方では、Markdown形式へのテキスト変換を行うことになりました。

ひたすら自分のログを取る

コンセプトの話に戻ると、僕のライフワーク的な指向の一つに、日々の記録をひたすら取る、ということがあります。
僕はこれを、断続的ながら、2005年頃から継続しています。

ただ問題は、その記録方式がつねにバラバラだったことで、初めの頃はmixi日記に書いていたのが、やがてiPhoneアプリのローカルなメモ帳アプリに書き始めたり、あるいはチャットやメールに投げ込んでみたりと、置き場所も書式もめちゃくちゃで、これでは後から見返したり、今後の作業に役立てたりという「再利用」ができないため、そのことが長年の悩みでもありました。

そして、その課題を解決するために、つまり溜めこんだ記録を再利用しやすくなるように、データを一元化するための道具として作ったのがこれらのツールでした。

動作の流れ

コードの大半は、上記のとおり、Perlのごく基礎的な構文とサブルーチンから出来ています。

このスクリプトが行っている主な作業は、既存のチャットサービス(HipChatやSlackなど)や、手元のテキストファイルにどんどん投げ込んだ文章を、ループと正規表現から成る変換コードに通し、もし事前に登録していたキーワードにマッチした場合は、その語句を抽出し、変換後のテキストの行頭に持ってくる、というものです。

具体例として、たとえば、以下のような一文があったとします。

山本さんにメールした

このうち、事前に「山本」「メール」という語句がキーワードとして登録され、さらにそれぞれが「yamamoto」「mail」という語句(タグ)に抽出されるよう設定していたら、変換後のデータは以下のようになります。

[yamamoto,mail]山本さんにメールした

たこの際、文中のキーワードに#を付けておくと、それが元の文章からカットされて抽出されます。
以下の内容であれば、

山本さんに #mail 完了

このようになります。

[yamamoto,mail]山本さんに  完了

上記はスクリプトの主要な働きを示すために簡素化して説明しましたが、実際には、1行のテキストに日時の情報も入るようにしているため、このように変換されます。

変換前
- ドラフト完了 #mail 2014-12-02 16:39
- メール送信 2014-12-02 19:40
変換後
* 2014-12-02 16:39 [mail]ドラフト完了  2014-12-02
* 2014-12-02 19:40 [mail]メール送信 2014-12-02

本当はもう少し煩雑な制約があったり、未整理なところも多いので、あまり胸を張って見せられるものでもないのですが、エッセンスとしては、そのような感じです。

ちなみに、この「1行の中に必要な情報をすべて入れる」という点は、僕にとってはけっこう重要です。
というのも、僕はVimを使う都合上、行単位でデータを移動することが多いので(Shift+vやddといった操作を多用します)、複数の行がセットで意味を成すような構造になっていると、自由度が低くなり、使いづらくなってしまうのです。

DEMO

このツールは上記のとおり、すでにGitHub公開していますが、僕が普段使っているものは、仕事に関わるキーワードを多数登録しているため、GitHub上のコードでは一部をアレンジしています。
ただ、機能面では普段使っているものとまったく同じですので、以下では本ツールのDEMOとして、昨夜眠い目をこすりながら作成した画像+動画GIFを並べて、公開している内容でどのようなことができるか示しておきたいと思います。

1. まず、チャットからコピーしたものでも、直接エディタに書いたものでも良いので、素材となるテキストを用意します。ここでは決められた書式に沿って、4行文の内容を直接エディタに記述しました。

f:id:note103:20171007035454p:plain

2. 次に、"Worg" で元テキストを変換します。変換後の出力テキストをカットするところまでを動画にしました。

gyazo.com

ここでやっていることは、まずWorgディレクトリの中で実行ファイルを起動し、

perl worg.pl

いくつかの変換形式の中から、今回の書式に該当する「d」を入力します。(詳細は割愛)

すると、dataディレクトリ内のout.mdに変換後のテキストが出力されるので、これをターミナルのVimで開いて、

vi data/out.md

-->> <<-- で囲まれた、変換後のテキストをカットしています。


3. 次に、上でカットしたテキストを、Riji のリポジトリ内「article/entry/」に用意した記事ファイル(.md)にペーストします。

f:id:note103:20171007035606p:plain

1, 2行目にタグと日付を設定しています。
その後の「#demo」がタイトルになる予定です。
その他、Rijiの書式についてはチュートリアルの以下のページが詳しいです。
http://songmu.github.io/p5-Riji/blog/entry/006_header.html


4. その後、ターミナルでRiji を実行している動画がこちらです。

gyazo.com

最初に入力した「cdr」は、 .bash_profileに登録してあるエイリアスで、Rijiで作ったローカル・ブログのリポジトリに入るためのショートカットです。
ちなみに、ローカル・ブログのタイトルは「new notes」なので、リポジトリ名もその流れで「new_notes」としています。

その後、「ga」「gu」と入力していますが、これらもそれぞれ、

$ git add -A
$ git commit -m "Update"

エイリアスです。

さらにその後の「rjp」もまた、 .bash_profile に登録したエイリアスで、これは

$ riji publish

と同じです。

ということで、ここまでの作業で、ローカル・ブログにテキストがUPされました。


5. 仕上がりは、このような感じです。

f:id:note103:20171007035721p:plain

このブログは外部からは見えませんが、同じ無線LANの中に居れば、同URLで見ることができるようにしています。(マシンから離れてもiPhoneなどから見られるように)

また、Rijiのデフォルトのテンプレートはもう少しすっきりしたものでしたが、少し前に一念発起して、bootstrapを使ってデザインやフォントをsolarized(light)風のものに変えました。
solarizedは今のところ、僕の感覚と相性が良くて、この半年ぐらいはエディタやターミナルでも使用しています。(上の画像がどれも同じような色味なのはそれが理由です)

実はこのブログ・デザインの変更作業がかなり大変、かつとても良い経験になったので、また時間があればまとめたいところです。

Special Thanks: 参考文献紹介

以上で、今日の本題はおしまいです。
ここからはAftershow的に、このツールを作るにあたってお世話になった資料群をご紹介します。

最初はもちろん、Perl入学式です。

1. 講義資料 - Perl入学式 | Perl Entrance

通年全6回の講義うち、第1回の環境構築と最終回のWAF(Web Application Framework)講座はあまり関係ありませんが、第2回から第5回までの資料は、制作にあたって何度も読み返しました。

2つめは、『雅なPerl入門』。

2. C85にて「雅なPerl入門第2版」を頒布します - Subvoice

最初は2013年のYAPC::Asiaで購入した初版を読み倒していましたが、その後に同年の冬コミで発売された第2版(大増補版)をPerl入学式の校長であるpapixさんに買ってきて頂いて、そちらも読み倒させて頂きました。

よく使う関数や正規表現演算子の種類や使い方など、本書で何度も確認していますが、通常の技術書に比べてページ数が少ないため、物理的に軽くて、そういった常備用の参考書としても非常に良いものです。

そして、その『雅なPerl入門』の著者さんも参考にされたという、結城浩さんの本がこちら。

3. 新版Perl言語プログラミングレッスン 入門編

本当に隅々まで読者への気づかいが伝わる丁寧な内容で、僕は以前の記事で「初心者のための本を作る人は初心者ではないがゆえに初心者の気持ちがわからない」などと書きましたが、本書は数少ない例外です。
なお、同書は「入門編」とあるぐらいで、Perlのリファレンスやオブジェクト指向プログラミングについては触れられていませんので、購入される方はご注意ください。

最後はこちら、木本裕紀さんの『業務に役立つPerl』。

4. もっと自在にサーバを使い倒す 業務に役立つPerl (Software Design plus)

入門書の要素もありながら、構成内容は多彩かつ独特で、様々な用途に使っています。
おそらく本書で書かれている内容は、書籍だけでなく、木本さんが運営されているブログと合わせて読むことで、何倍にも有用さが増すと思います。
ブログの方は、過去記事も含めて濃厚な内容がすべて無料で読めますので、こちらもお勧めです。
PerlならサンプルコードPerl入門

その他、入門者向けに限らず、Perl関連の推薦図書は以下の記事(の最後の方)でも紹介しています。興味を持たれた方はぜひどうぞ。

まとめ

今回紹介したWorg は、僕が作ったものの中でも1, 2を争う「自分でよく使っているツール」です。
これと並んで使っているものがあと2〜3個ありますが、それはまた機会があればご紹介したいと思います。

以上で、Perl入学式 Advent Calendar 2014 10日目の記事はおしまいです。

明日の担当は @toku_bass さんです。@toku_bassさんは僕が初めてPerl入学式に参加したときのサポーターのお一人でした。1年以上を経て、このように並んでPerlについて書けるというのは、ささやかながら嬉しいものですね。

ではひき続き、Perl入学式 Advent Calendar 2014 をお楽しみください!