結局卒論などというものは外圧がなければ進まないものだ。そこで、卒論の進捗状況(文字数・ファイルサイズ)を定期的にtwitterに晒すような何かがあればよいのだと気付いた。ので、とりあえず作ってみた。

残念ながら僕は卒論をtexで書くほどいけてる人間ではないので、MS wordで書いている。数式も専用エディタで楽々、Excelからグラフも簡単にコピペできる。これを使わない手はないではないか。

しかしwordファイルというのはプログラムから中身をいじることがかなり面倒。少なくとも僕が(CPANで)調べた範囲では、docファイルをLinux上から開く方法は見当たらなかった。が、docxならzip+XMLなので、解凍してXMLを引っ張ってきてパースすれば中身にアクセスできるらしい。オープンな規格っていいですね。

use Archive::Zip; Archive::Zip->new(“hoge.docx”)->extractMember(‘word/document.xml’, “hoge.output”);

とりあえず深く考えず、docxファイルを解凍してxmlを吐き出す(XMLとして吐き出さずに変数に格納する方がスマートなんだろうけどよくわからなかった)。あとはこれをパースすればいいんだけど、ちゃんとパースしたところで知りたいのはファイルの文字数くらいなので、全力で手を抜く。

use Encode; use utf8; open (my $file, “<:utf8”, “hoge.output”); while(my $line = <$file>){ $line =~ s/<.*?>//g; $char_count += length($line); } close($file);

このXMLの構造なんて知らないが、とりあえずこれでタグを全部捨てた後の文字数がわかる。ちゃんとuse utf8;してutf8で読み込めば、日本語の文字数もちゃんと数えてくれる。約15000文字、24ページくらいの文書をこれにかけると、数%くらいの誤差があるものの、一応ちゃんと数えられる。

ファイルサイズがほしければ-sで簡単にとれる。KiBで表示したいので、1024で割る。

$filesize = -s $docx_name; $filesize = int($filesize / 1024);

これで文字数とファイルサイズがわかるので、あとはお好きな文字列を足してNet::Twitterに投げるだけ。

あとはdocxをサーバにどう持ってくるかっていう話。もちろん卒論自体はWindowsマシンで書いているので、Dropboxでファイルを共有することにした。

http://blog.monoweb.info/archives/949

この辺を参考に、Ubuntu serverにDropboxを入れて、Windowsマシンとファイルを同期すれば楽。ただUbuntu server側Dropboxの動作は不安定なところもあるので注意。多数のファイルを同期させると途中で止まってたりする。

dropbox stop

/etc/init.d/dropbox start

よくわからないけど、この辺適当に叩いてリスタートしたりしてご機嫌をとりましょう。