RTF::WriterでMS-WORDのファイルを自動生成

FreeStyle Wikiはpdf出力が出来てXML-RPCのインターフェースもあって便利なので、日々の仕事の管理に重宝しているが、wordの出力が出来ないのがちょっと困る。今の職場は報告書などをpdfでは受け付けてはくれんので、wordで書き直さないといけないのがだるい、ややだるい? いや、まじだるい、ちょーだるい。

というわけで、RTF::Writerなどをつかってrtfを出力するプラグインなどを作ってみている。

とりあえず、日本語周りがちゃんと出るか確認したので、簡単なサンプルコード。

#!/usr/bin/perl

use RTF::Writer;
my $rtf = RTF::Writer->new_to_file( "jtest.rtf" );
$rtf->prolog('fonts' => ["MS Pゴシック"]);

$rtf->printf(
      \'{\b\ul\fs80 %s}',
      "初めてのRTF\r\n\r\n"
    );

$rtf->paragraph(
    [ \'\b', "なぜRTFか?\r\n" ],
    "みんなMS-WORD好きだからなー"
    );
$rtf->close;

思うようにいかない場合には、一度wordで書いたのをrtfで保存して、lessでもviでもして中を見てみるという、かなりアレな開発スタイルだが、これがなかなかわかりやすい。

FSWikiのほうはpdfプラグインをちょこっと変えてparserをRTF::Writer用に書き直せば動きそうだ。

あとRTFをちゃんと理解して、ある程度自由にコードで対応できるようになれば、ほかでもつかえるじゃん。と、時間の節約になりそうなことに気づいてちょっとやる気が出てきた。

ProductName Rtf Pocket Guide
Sean M. Burke
Oreilly & Associates Inc / 880円 ( 2003-07 )


これは欲しいかも。

Getopt::Long と Pod::Usageのコンボ最高!

最近、職場でコマンドラインのツールばっかりちょこちょこと書いていますよ。というかちょっとした小物を書くぐらいの時間しか取れないってのがつらい。

さて、こういったスクリプトは以前は書き散らすことが多かったんだけど。Getopt::LongPod::Usageのコンボを覚えてからは、ちゃんとヘルプとかPodを書くようになった。あとsubversionできちんと管理するように心がけてる。

長いこと使わないと使い方忘れるし、他のヒトが使うときに使い方説明するのも面倒なので、ちゃんとやっとくと後々便利。まぁ、今の職場はcpanでperlのモジュール管理できないヒトばかりだし、そもそもそういうものの存在も知らんので、標準モジュールでどんだけやれるかってのは結構大きいファクターだ。

MAWP14章はProbability

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

こういうのはRに任す。確率分布とか充実してる。

15章も統計なのでRで。

16章は微分とかsmoothingとかSICPな感じなので流し読みして終了。

ってことで、MAWPも終了。ソート、マトリックス、グラフ、文字列マッチング、暗号あたりが面白かった。

ElGamal暗号

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2553円 ( 1999-07 )


位数が大きな群の離散対数問題が困難であることを安全性の根拠にした暗号化方式

巡回群を利用しているらしい。そういや、ガウス平面上の回転って数学ガールの3章で読んだなと。

ProductName 数学ガール
結城 浩
ソフトバンククリエイティブ / 1890円 ( 2007-06-27 )


modも回転か何かで考えることが出来るのかね。

MAWP 13章はCryptography

アンゴウよりアンコウ+日本酒のほうが好きなんだけど。

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

というより、数式を避けてただけだった。ちゃんと読んでみると暗号も面白いかも。 法とか合同をほうとかいいながら読んでた。MAWPの説明だけだと分かりにくかったのでRSA暗号を参考にした。

MAWPにあったSSLeayっていうモジュールがなかったのでCrypt::RSAで遊んだ。

use Crypt::RSA;
use Data::Dumper;

my $rsa = new Crypt::RSA;

my ($public, $private) =
  $rsa->keygen (
        Identity  => 'Kzfm Ohkw <xxxx@gmail.com>', 
        Size      => 1024,
        Password  => 'drumnbass',
        Verbosity => 1,
           ) or die $rsa->errstr();

print Dumper($public);

公開鍵

$VAR1 = bless( {
                 'e' => 65537,
                 'n' => '12390802849571403672579795755491999585878694
                         2679376999148135793744998012786068647404317033
                         4506694188629007869741465370712440443624446804
                         8813574622838502197241514075336790104367156693
                         3189856420057871502127203513391621825674392638
                         5941923712730877023358276499112454722795081438
                         05979844138326376749179360228658183',
                 'Version' => '1.91',
                 'Identity' => 'Kzfm Ohkw <xxxx@gmail.com>'
               }, 'Crypt::RSA::Key::Public' );

おー65537乗してnでmodるのか。

MAWP 12章はNumber Theory

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

Modularとか。Chinese Remainder Theoremってなにがおもろいんだろうとか思ったが、RSA暗号がらみ?そのうちちゃんと読んでみる。

あとMiller-Rabinとかコラッツ予想とかそんな感じ。

MAWP 11章はNumber System

perlで複素数とか極座標とか扱うって話 あまり興味がなかったので流した。

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2960円 ( 1999-07 )


最後の例のリーマンゼータ関数は面白かった。

まだ2章くらいしか読んでない数学ガールにも出てくるらしい

ProductName 数学ガール (数学ガールシリーズ 1)
結城 浩
ソフトバンククリエイティブ / 1890円 ( 2007-06-27 )


これも早く読みたいなぁ。

MAWP 10章はGeometric Algorithm

さわりだけなので、さらっとしている。

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

ちゃんと学びたければC++とかの本を探したほうがよいのかな?pymolとかAvogadroのソースを読むのがいいのかもしれんなぁ。

ドッキングシミュレーションとか色々気に入らない部分があるので、手を加えたい部分があったりとか、Caverみたいなの自分で書いてみたかったりするんだけどそういう書籍はないもんかな。

MAWP 9章終了

後半はparserとか

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

HOPも読んだし、再帰下降パーサもいじったことあるのでさらさらと。あとハフマン符号化とか。

結局1週間近くかけて読んだが文字列検索アルゴリズムがなかなか面白かった。

PythonでBoyer-Moore法

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2553円 ( 1999-07 )


perlは写経でいまいち理解度があやしいため、pythonでBoyer-Moore法を。パターンとの不一致の場合には何文字スキップできるか、一致した場合に何文字スキップできるかのテーブルを最初に作っておいて、スキップ幅の大きいほうでスキップしながらパターンマッチを進めていく。

def boyer_moore_bad_character (P):
   m = len(P)
   bc = [m] * 256
   j = m
   for char in list(P):
       bc[ord(char)] = j - 1
       j -= 1

   return m, bc

def boyer_moore_good_suffix (m,P):
   j = m + 1
   gs = [0] * j
   k = [0] * j
   k[m] = j
   for i in reversed(range(1,j)):
       while j <= m and P[i-1] != P[j-1]:
           if gs[j] == 0:
               gs[j] = j - i
           j = k[j]
       j -= 1
       k[i-1] = j

   kn = k[0]
   for j in range(m+1):
       if gs[j] == 0: gs[j] = kn
       if j == kn: kn = k[kn]

   gs.pop(0)
   return gs

def boyer_moore (T,P):
    (m,bc) = boyer_moore_bad_character(P)
    gs    = boyer_moore_good_suffix(m,P)

    (i, last_i, first_j) = (0, len(T)-m, m-1)

    for i in range(last_i+1):
        j = first_j
        while j >= 0 and T[i+j] == P[j]:
            j -= 1
        if j < 0:
            return i
        else:
            bcn = bc[ord(T[i+j])] - m + j + 1
            gsn = gs[j]
            i += bcn if bcn > gsn else gsn
    return -1

if __name__ == '__main__':
    print boyer_moore("perlpypythonruby","python")
  • pythonはコードの見通しがよいですな
  • perlと違ってsubstrとかやらなくてもいいので見通しがよい
  • perlのshiftがpop(0)なのがあれ。先頭をpopするってのが。
  • perlだと$a[5]=5とやれるけど、pythonはそれ以前の要素が自動的ににundefで埋まらない

for文でカウンタ変数使いたかったのでrangeをつかったけどPython流はどうやるのがよろしいんだろうか、、、カウンタ変数減算するのにfor i in reversed(range(1,j))だしな。