« 2010年7月 | トップページ | 2010年9月 »

2010/08/06

メールやDropboxを活用したIS01/LYNX SH-10Bでの時記

●小箱での時記(即時メモ)
即時メモを取ることが有用と感じ、日記もその方法で書いています。細切れの時間にすぐメモを取るので、タイムスタンプを挿入し、時記としています。
いつでもどこでも書くので、いつでもどこでも常に持ち歩いている小箱で、かつメモの取りやすいように使いやすいフルキーボード内蔵のものを利用しています。今は、IS01/LYNX SH-10Bです。922SHやHP100LXもこういった用途で使っていたわけです。
HP100LXだと、システムマクロとME.EXMで、いとも簡単に即座に時記が取れたのですけれど、同等の快適な環境をつくれる小箱はいまだに出てきていません。

●便利なDropbox
IS01やLYNX SH-10Bや922SHで即時メモを取って、時記として保存するのに、メールやDropboxを活用しています。最初IS01ではSDcard上のテキストファイルを時記形式で書き込んで、Dropboxにアップロードしておきました。Dropboxからは一日二回自宅のMac miniではてなダイアリーにDropboxフォルダからはてダラを利用してアップロードするように設定していました。
Dropboxにつなげられる環境さえあれば、日記のアップロードのことは気にせず、時記を書いてDropboxフォルダに置いておけばいいので楽ちんです。どのPCだとかMacだとかは考えずに、Dropboxの同期機能を利用するのは快適です。
Dropboxがサポートしている、たとえばIS01などのAndroidケータイなら、この方法はとても便利ですけれど、HP100LXの場合は別途Androidケータイなりを用意してmicroSDを差し替えてDropboxにアップロードする必要が出てきます。XPERIAなどでそうしていました。922SHのようなQWERTYキーボード内蔵だけどいわゆるガラパゴスケータイの場合はちょっと面倒で、AndroidのようにDropboxを気軽に使えません。こういったケータイはケータイメールが使いやすいので、即時メモをとってケータイメールで送って、メールを受けたサーバー側でよろしく処理して時記形式にでもできれば便利です。

●メールでの時記作成
HP100/200LXなら標準で日付や時間の挿入ファンクションキーがあるだけでなく、標準のシステムマクロでME.EXMエディタで特定ファイルを開いて日付時間を挿入してすぐに書き込めるところまで一発でできます。
IS01/LYNX SH-10BならOI Notepadなどで、menuから日付時刻を一発挿入できます。
922SHはちょこっとメモというワンキー簡易メモはあるものの、現在日付時刻は手入力するしかありません。

そういうわけで、メールを受けるサーバー側で、
- 本文が時記形式のメールは時記ファイルに追加する
- 本文に日付時間のない、メモ内容だけのメールはメールの日付時間を本文に挿入して時記形式に変換する
という処理を書いたスクリプトを動かすようにしました。

ただ、これでは、以前メールした内容を修正したいときにこまります。そこで、
- 日付時間をキーとして、同じ日付時間なら、後から送ったメールの内容に置き換える
という処理もスクリプトに追加しました。

ローカルでは、Becky!で受信し、クエリーからエクスポートしてバッチでスクリプトを呼んで処理するのは以前試していて、うまくいっていました。

●サーバーの設定
サーバー側を設定することにします。あるメールアドレスへのメールを受信したら、そのメールをそのままパイプで自作スクリプトに渡すよう設定すればいいはずです。
sendmailのaliasesで専用のメールアドレスを作ります。/etc/aliasesなりに、
jikimailentry: "|/etc/smrsh/mail2jiki.pl"
のような感じですが、WebminなりPleskなりから、GUIで設定できればそれでもよいでしょう。

RHELのsendmailではsmrsh制限がかかっているので、シンボリックリンクをsmrshのディレクトリ置く必要があります。
もしsmrsh制限自体を解除するのなら、sendmail.mcで、
dnl FEATURE(`smrsh',`/usr/sbin/smrsh')dnl
とコメントアウトしてsendmail.cfの再構築が必要になります。

さて、サーバーの環境設定ができたら、実際にメールを投げてスクリプトを動かしてみます。

スクリプトの中身はたとえばこんな感じです。


#!/usr/bin/perl
#
use Jcode;
%months = ("Jan"=>"01", "Feb"=>"02", "Mar"=>"03", "Apr"=>"04", "May"=>"05", "Jun"=>"06", "Jul"=>"07", "Aug"=>"08", "Sep"=>"09", "Oct"=>10, "Nov"=>11, "Dec"=>12);
open(NEWMEMO, ">/(書き込み権限のあるパス)/newmemo.txt");
$outline = "";
while($line = <>){
if ($line =~ /Date\:\s+\w{3}\,\s+(\d{1,2})\s+(\w{3})\s+(\d{4})\s+(\d{2}\:\d{2}\:\d{2})/){
$datetime = "$3/$months{$2}/$1 $4 ";
until($line eq "\n"){
$line = <>;
}
while($line eq "\n"){
$line = <>;
}
if (($line =~ /Forwarded message/) || ($line =~ /----------/)){
until($line eq "\n"){
$line = <>;
}
}
while(($line eq "\n") || ($line =~ /^[Jj]iki/) || ($line eq "\r\n")){
$line = <>;
}
while($line ne ".\n" && $line ne "\n" && $line !~ /^Workmemo/ && $line ne ""){
chop $line;
$line =~ s/^\.$//g;
if (($line =~ /^\d{2,4}\/\d{1,2}\/\d{1,2}\s+[^\d]{0,1}\d{1,2}\:\d\d\:\d\d/) && ($outline !~ /^$/)) {
$outline = $outline . "\n";
}
$outline = $outline . $line;
$line = <>;
}
$outline =~ s/\n{2,99}/\n/g;
if (($outline !~ /^\d{2,4}\/\d{1,2}\/\d{1,2}[ ]{1,3}[^\d]{0,1}\d{1,2}\:\d\d\:\d\d/) && ($outline !~ /^\n/) && ($outline ne "")) {
print NEWMEMO $datetime ;
}
print NEWMEMO $outline . "\n";
$outline = "";
}
}
print NEWMEMO $outline . "\n";
close(NEWMEMO);
%memodb = ();
open(MEMO, " while($line = ){
$line =~ /^(\d{2,4}\/\d{1,2}\/\d{1,2}[ ]{1,3}[^\d]{0,1}\d{1,2}\:\d\d\:\d\d)(.*)$/;
$memodb{$1} = $2;
}
close(MEMO);
open(NEWMEMO, " while($line = ){
$line =~ s/^(\d\d\/\d\d\/\d\d)\s*([\+\-]{0,1})\s{0,2}(\d)(\:\d\d\:\d\d)/$1 $2 0$3$4/g;
$line =~ s/^(\d\d)\/(\d\d)\/(\d\d)\s*([\+\-]{0,1})\s{0,2}(\d\d)(\:\d\d\:\d\d)/20$3\/$1\/$2 $4$5$6/g;
$line =~ /^(\d{2,4}\/\d{1,2}\/\d{1,2}[ ]{1,3}[^\d]{0,1}\d{1,2}\:\d\d\:\d\d)(.*)$/;
$memodb{$1} = $2;
}
close(NEWMEMO);
open(UPMEMO, ">/(時記ファイルを置いているパス)/MEMO.TXT");
foreach $datetime ( reverse sort keys %memodb ){
$honbun = &Jcode::convert(\$memodb{$datetime},'sjis');
print UPMEMO $datetime . $honbun . "\n";
}
close(UPMEMO);

「mail2jk.pl」

●スクリプトの機能
このスクリプトは、標準入力で渡されたメールを処理して、本文の時記や即時メモを抽出し、ファイルに書き込みます。
その際、本文に日付時間のない、メモ内容だけのメールはメールの日付時間を本文に挿入して時記形式に変換しておきます。そして、時記ファイルにメールから抽出した新しい時記を追加します。その際、日付時間をキーとして、同じ日付時間なら、後から送ったメールの内容に置き換えています。

IS01/LYNX SH-10BならK9 Mailで、922SHならケータイメールで即時メモをメールで投げれば、サーバー上に時記ファイルができているということになります。
日付時間が行頭にある時記形式で修正して再度メールすれば、時記ファイルは更新されて後からメールした方に置き換えられます。

あとは、cronでこの時記ファイルを以前作成して使っていたはてダラスプリッタ用の形式に変換し、はてダラスプリッタを通してからはてダラでアップしています。

●時記形式
このスクリプトでは、時記形式は、各行が、
YYYY/MM/DD HH:mm:ss 内容
という形式を持っていることを前提にしています。

この形式だと、各行に必ず日付時間が入っています。単純に行ソートをしやすいのがそうしている理由です。
内容に改行を含められないのと、日付時間のない行を許容しないのが欠点です。後処理で色々簡単にできるのが良いところで、必要な形式にはスクリプトで変換すればよいだろうと考えています。

元々HP100/200LXでは、
MM/DD/YY HH:mm:dd 内容
の形式で時記を取っていました。月日年の順です。年単位でまたがらないようにファイルを分けていたので、これでもかまわないのですけれど、他の環境、たとえばMicrosoft WindowsやMac OS Xなどの環境では、YYYY/MM/DDの方が現在一般的なようです。HP100/200LXで作成した時記からYYYY/MM/DD形式ににはスクリプトで変換しています。

ChangeLog形式も一案ですけれど、Microsoft WindowsやMac OS Xが普及していて、それらでは、YYYY/MM/DDの方が普通のようです。YYYY-MM-DDというのは、ちょっと違和感があるというか、unix風に感じます。
Microsoft WindowsやMac OS Xだけでなく、様々な小箱で、日付や時間の形式について、YYYY-MM-DD形式で統一するのが面倒だというのもあります。今回OI NotepadやgEditorの挿入機能でも、日付はYYYY/MM/DD形式だし、時間はHH:mm:ss形式です。時間については、HH:mm形式も一般的と言えるでしょうけれど、重複しないためには秒が入っている方がうれしいです。

●Androidでの日付や時刻の挿入
現在ぼくは「OI Notepad」を使ってMENUから一発挿入しています。

たとえば「gEditor」なら、日付挿入機能、時刻挿入機能がそれぞれあります。
他のエディタ、たとえば「TxtPad Lite」などの日付時刻挿入機能がないものでは、マッシュルーム経由で「DA InsTime」や「DateNow」を使ってHH:mm形式の時刻の挿入ができます。「なう」だとHH時mm分という形式だし、「時刻挿入まっしゅるーむ」だと現在時刻の自動挿入でなく手打ちなのでぼくの用途には馴染みません。
IS01/LYNX SH-10Bでマッシュルームアプリを使うには、「マッシュドアー」や「Clip To Mush」経由でマッシュルームアプリを起動する必要があります。
たとえば、「DateNow」を使う場合、「マッシュドアー」をインストールし、引数ダイアログを有効にします。起動すると通知領域に常駐します。自動起動設定も可能です。通知領域から呼び出して、引数ダイアログで「いま」を選びます。
テキストエディタに戻ったら、たとえば「TxtPad Lite」ならToolbarに設定で出しておいたPasteボタンをタップすれば現在時間がHH:mm形式で貼り付けられます。
たとえば、「DA InsTime」なら、「Clip To Mush」にクイック起動キーを何か設定しておき、クイック起動キーで「Clip To Mush」立ち上げると、即座にマッシュルームアプリの一覧が表示され、「DA InsTime」を選んでボタンを押せば、現在時刻がクリップボードに入ります。あとは「TxtPad Lite」ならToolbarに設定で出しておいたPasteボタンを押すだけです。
ぼくは時記形式をYYYY/MM/DD HH:mm:ss 内容としているので、OI Notepadが一番楽ですけれど、「DA InsTime」や「DateNow」の設定できる時刻形式の方が合う運用もあるかもしれません。


●時記形式からChangeLog形式への変換スクリプト
はてダラというか、はてダラスプリッタのdiary.txtはほぼChangeLog形式のようです。なので時記形式からはてダラスプリッタのdiary.txt形式に変換するスクリプトを大分前に書いています。
即時メモを取るときは時記形式で、閲覧等はChangeLog形式でもいいのでしょうけれど、ぼくは各行に日付時間が入っていても慣れて気にならなくなってしまったので、そのまま閲覧しています。

#!/usr/bin/env perl
$lngsub = 20;
$cdate = "1999-01-01:";
$pdate = "";
$comment = "on";
while($line = <>){
	$line =~ s/^(\d\d\/\d\d\/\d\d)\s*([\+\-]{0,1})\s{0,2}(\d)(\:\d\d\:\d\d)/$1 $2 0$3$4/g;
	$line =~ s/^(\d\d)\/(\d\d)\/(\d\d)\s*([\+\-]{0,1}\s{0,1}\d{1,2}\:\d\d\:\d\d)(\s{1,3}[^\n]{0,$lngsub})/20$3-$1-$2:\n*$4$5\n$5/g;
	$line =~ s/^(20\d\d)\/(\d\d)\/(\d\d)\s*([\+\-]{0,1}\d{1,2}\:\d\d\:\d\d)(\s{0,3}[^\n]{0,$lngsub})/$1-$2-$3:\n*$4$5\n$5/g;
	if ($line =~ /^(\d\d\d\d\-\d\d\-\d\d\:)\n/){
		$pdate = $cdate;
		$cdate = $1;
		if ($pdate ne $cdate){
			print $cdate . "\n" ;
		}
		$line =~ s/^\d\d\d\d\-\d\d\-\d\d\:\n//g;
		if ($line =~ s/^\*\-\s{0,1}/*/g){
			$comment = "on" ;
		} else {
			$comment = "off" ;
		}
		print '><' . "\n" if $comment eq "on" ;
	} else {
		print '><' . "\n" if $comment eq "on" ;
	}
}
「m2dz.pl」


●公開したくない時記
即時メモはその場ですぐにメモします。時記が紙のメモと違うのは、たとえば数分後など、そのテキストファイルの誤字等を修正できることです。ごく簡易な清書をして、時記ファイルに保存します。そうして、あとで清書はあまりしません。
ぼくの環境では、それが毎日決まった時間に公開されてしまいます。公開したくない内容も、もちろん色々あります。
公開したくない内容は、はてなダイアリーの下書き機能でコメントアウトしています。
実際には、時記形式で、時間の前に「-」記号を挿入すると、はてダラスプリッタのdiary.txt形式に変換する際にコメントアウトされるようなスクリプトになっています。
例)
2010/08/06 07:31:00 いい天気だなあ。暑い中出発。
2010/08/06 -07:33:11 そうだ今日夕方にauに電話して契約変更しよう。157にauケータイから電話して0でオペレータにつなげるのか。忘れないようメモ。

以前は、原則非公開で、時刻の前に「+」記号を挿入したときだけ公開していましたけれど、非公開メモの頻度が低いためにこちらの仕様に変更しました。

●HP100/200LXからIS01/LYNX SH-10Bに乗り換えて
時記だけを取り上げると、HP100/200LXの環境は実に快適でした。単体でデータが閉じていてよければ、今でもHP100/200LXの方がずっと使いやすいと思っています。ただ、現在では、Webサービスとも連携したいものです。ぼくはWebの日記もこんな感じでやっていて、GoogleカレンダーとHP100/200LXのAppointmentsのシンクロも同じような感じでやっていました。IS01/LYNX SH-10Bに乗り換えることで、microSDの差し替えをしてバッチファイルからスクリプト実行という手間は減りました。
LYNX SH-10Bに乗り換えて本当に良い点は、持ち歩く荷物が減ったことです。財布と鍵とケータイとスマートフォンとHP100LXを絶対必要なものとして常に持ち歩いていたのが、財布と鍵とLYNX SH-10Bになったので、とても軽くなりましたし、充電の手間が減りました。
反面、即時メモのときに日付時刻の挿入がマクロ自動ではなくMENUから選んで挿入になった点と、キーボードがまだLXほど慣れていないのが弱点です。
1993年製のHP100LXでも、ぼく個人は問題なくWebサービスと連携して使えているので、IS01/LYNX SH-10Bでなければだめということは別にありませんし、いつでも戻れます。
今は、新しい小箱が面白いという理由と、持ち歩き荷物が軽くなるという理由で、LYNX SH-10Bをメインにして使っています。乳幼児をずっと抱っこやおんぶして歩くのも、自転車で走るのも、荷物は少しでも軽いほうが助かりますから。

| | コメント (3) | トラックバック (0)

« 2010年7月 | トップページ | 2010年9月 »