相変わらずモナドが

モナドで躓いて以来、ちょっとご無沙汰していたhaskellだが、ちょっとまとまった時間ができたので、この週末でじっくり考えてみた。

モナドだけに、読むたび必ず睡魔に襲われる(参照透明性確保!)でも理解度はちょっぴり向上してるっぽい(つまり副作用)。

檜山正幸のキマイラ飼育記はjavascriptを例にして、純関数にすること(参照透明性の確保?)と型を揃えることが重要っぽいあたりが理解できた。
で、HaHaHa!では思考をもうチョイ広げて、とりまく環境の変化ということに思いをめぐらせればいいということを理解した。特に図がわかりやすくて、かなり理解が進んだと思う。
で、それから、実際にperlの例を見るとを~とか思う。

変数の代入をIOと考えればtieって参照透明性を確保しつつ、副作用を発生させることができるのね。この場合にいわゆるモナド則は成り立つのかなと考えてみたけど、なんとなく成り立つのかなと思ったり。

と、ここらへんまで理解した気になって、再度ふつうのhaskellを。

ProductName ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎
ソフトバンククリエイティブ / ?円 ( 2006-06-01 )


なんとなくわかってキテルっぽいが、じゃぁ、MaybeモナドとかListモナドって何なのヨっていうか、モナドって一体何さ?っていうあたりがわからなくなってきた。さらにperlのtieなんかで実装できるってことは、モナド則っていうのは結局なんなのってのがよくわからん。

ふつうのhaskellに
モナドを定義の観点からみるならばモナド則がすべて
とあるように、モナド則を感覚で理解しなければならんのかな。

All About Monads

ほんとうにモナドを理解するには、モナドを使ったコードを経験することが最良 の方法です。

というわけで、コードを書こう。

朝霧JAMのタイムテーブル発表されましたな

朝霧JAM - It's a beautiful dayのタームテーブルが発表されましたな。

元ちとせ-くるり-ムーンステージになりそうだけど、INDIVIDUAL ORCHESTRA捨てがたいからずっとムーンかも。

二日目は最後までいるかナァ。いつも15時くらいに退散するので、最後までいると帰りがどうなるのか予測できん。

pydocって-pオプションでWebサーバーになるのね

pydoc って

pydoc -p 8020

で、ドキュメントのウェブーサーバーとして動くということを知った。あとは

from pydoc import writedoc
import os, sys
import os.path

sys.path.append("../lib")

writedoc('PyModule')

とかやるとドキュメントがhtmlで書き出されるのね。pythonはここらへんが標準なので使い勝手がよい。perlだと pod2htmlでよいが、サーバーはPod::Webserverをインストールして

podwebserver

で動かせるらしい。

これはperl hacksで知った。

ProductName Perl Hacks: Tips & Tools for Programming, Debugging, And Surviving
Damian Conway
Oreilly & Associates Inc / 2163円 ( 2006-05-30 )


最初、を~便利かもとか思ったけど、ブラウザ使わないでperldoc とかperldoc -m で端末から眺めるほうが一番な気がしてる。

FANNとperlバインディング

ちょっと遊んでみたくなってFast Artificial Neural Network LibraryとPerl wrapperを入れてみた。

perlで割と簡単に書けるので、手軽にニューラルネットで何かをしたいときには重宝しそう。

他にもAI::NeuralNet::Simple(POEのヒトが作者っぽい)とかAI::LibNeuralとかAI::NNFlexとか探してみると結構ある。

Rのtempdirは変更できないっぽい

R-2.3.1を立ち上げると/tmp/RtmpXXXってな感じにテンポラリのディレクトリができる。

R 2.3.0 の変更点 - RjpWiki

The R session temporary directory is now set in C code using the same algorithm whether or not the shell front-end is used and on all platforms. This looks at environment variables TMPDIR, TMP and TEMP in turn, and checks if they point to a writable directory.

環境変数変えてみてもその下にRtmpXXXができてしまう。

> tempdir()
[1] "/tmp/Rtmpoo9Vt4"

tempdirでテンポラリのディレクトリを返すことはできるが、任意のディレクトリをセットすることができないし、Rを起動してからテンポラリのディレクトリを変更できなさげ。必要な関数を探すこつを見ながら組み込み関数探してみたけどやっぱないっぽい。

pythonモジュールのバージョンは

pythonモジュールのバージョンってどうやって調べるんだろうとか。
versionとかいう属性に統一されてると思ったんだけどそういうわけでもないのね。

>>> import rpy
>>> import re
>>> [x for x in dir(rpy) if re.search('version',x)]
['rpy_version']
>>> rpy.rpy_version
'0.4.6'
>>> import SOAPpy
>>> [x for x in dir(SOAPpy) if re.search('version',x)]
['__version__', 'version']
>>> SOAPpy.__version__
'0.11.6'

あと正規表現もモジュール読み込まないといけないのね。

追記

あ、別に正規表現使わなくてもfindでもいいのか。

>>> [x for x in dir(rpy) if x.find('ver') > -1]

perl5.8で日本語を扱うこと

昨日の続き

  • フォームが文字化け
  • 正規表現の部分がよくわからなかった。

丸ごとperlで紹介されていたDevel::Peekを使ってみた。MFPMによるとやっぱ、UTF-8フラグ探知モジュール的な使い方が多いのか。こういうのはプリントデバッグ的で好き。#の行が無駄に増えるけど。

ProductName まるごとPerl! Vol.1
小飼 弾
インプレスコミュニケーションズ / ?円 ( 2006-08-24 )


で後者の正規表現のマッチがよくわからんという部分は、mecabのパース$m->parseToNode($word)でutf8フラグがたたないことが原因だった。わかってみればそりゃそうだと思えるが。

my $n = $m->parseToNode($word);

while ($n = $n->{next}) {
    my $devword = decode("utf8",$n->{feature});
    #   if ($devword =~ /^\345\220\215\350\251\236/) { # 名詞
    #    if ($devword =~ /^\x{540d}\x{8a5e}/) { # 名詞
    if ($devword =~ /^名詞/) { # 名詞

        my $w = $n->{surface};
        print $w,"\n";
    }
}

use utf8しとけばx{540d}x{8a5e}でも名詞でもマッチした。なんとなく体で理解したっぽい。以下参考にしたページ。

で、前者のフォームが文字化けの部分はさっぱりわからん。どうも、HTML::Template通るときに文字化けしてるっぽい。うーん。

perlで関数型のプログラミングをするモジュールとか

List::UtilとかList::MoreUtilsというものを教えてもらったので、少し読んでみた(というか自分用のメモ的な意味合いが強いかも)

あと、リスト操作の動作確認するために、対話型のperlshを使ってるが便利だ。

List::Util

リストの最大、最小の要素を返したりとか。reduceで同じことができるのでreduce覚えておけばよい感じ。日本語訳

perlmolのChemistry::InternalCoords ::Builderだとこんな感じで使ってる。

$ref = ${
    reduce { $a->[0] < $b->[0] ? $a : $b }
    map { [$atom->distance($_)] }
    grep { $_ ne $atom } @$atoms;
}[1];

grep,mapでリストを操作した後、reduceを使ってお望みの要素を取り出すと。
というわけで、これといった例が思い浮かばないが、シュワルツ変換っぽく使えばリストでなくて要素が返ってくると。

List::MoreUtils

anyとかallとかのリストに対する真偽判断用の関数はこっち。日本語訳

pairwise、each_array、zipはfor文を入れ子にしなくてよくなるので、コードの見通しがよくなる感じ。

あと、QSAR記述子選択用のコード書くのに便利そうなのが、minmax(min==maxの記述子はこれでさくっと落とせる)。さらに、uniq組み合わせて、さらに数値のバリエーションのない記述子も落としていけるし、any使えばnullデータの入ってる記述子も排除できるので、今度preparation用のコードをList::MoreUtils使って書いてみよう。

fp::functionals

リスト操作用だけでなく、関数操作用のモジュールもあるだろうと探したら、やっぱありました。

もうちょいhaskellまともに書けるようになったら使ってみたい(かな?)が、今のところはperlで関数型っぽくかけるのはリスト操作で十分かもという気がしてる。

poderosa4.02

WindowsXPでPoderosa3系使うとたまに落ちるのが困りもんだったが、4系は結構安定していていい感じ。

あとちょっとさくさく動くようになって快適感が増したような。

「みんな」から「ダイブイントゥー」そしてフィボナッチ

みんなのpythonを読んだら、もうちょっと実践的なコードを基に、他の言語と比較しながら説明してあるDive Into Pythonなど読むべし。pythonの初歩からhtml,xmlの処理、そしてSOAPによる通信といった割と基本的な(けど実用的な)章があって、終わりのほうは単体テスト、リファクタリングといったテスト技法や、関数型プログラミングに関しても触れてるので、全体を読んでpythonへの理解はかなり深まった(と思う)。わからないところも、みんなのpython片手にPython ライブラリリファレンスひけば、大概解決したし。

で、17章にフィボナッチ数を求める例があって、そこでジェネレータ使ってたのをみてジェネレータって便利だと理解した。

def fibonacci(max):
        a,b = 0,1
        while a < max:
                yield a
                a, b = b, a+b

for n in fibonacci(1000):
        print n

とfibonacci関数定義するだけでフィボナッチ数が。perlで書いたのと同じようなアルゴリズムなのにperlより簡単にかけているのはyield文のせい。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


060914追記

perlでもクロージャ使えば同じようにかけるわ。ということに朝起きたときに気づいた

sub fibonacci {
    my $max = shift;
    my ($fib,$a,$b,) = (0,0,1);
    return sub {
        ($fib,$a, $b) = ($a,$b, $a+$b);
        if ($a < $max){
            return $fib;
        }
    }
}

my $f = fibonacci(100);

pythonにもクロージャってあるんだろうけど、ジェネレータとの使いわけってどうなるんだろうか?