熊野古道(とYahoo!API)を使って何か(おっぱいとか、おっぱいとか)を集めるスクリプトを書こうと思ったけれど、力尽きた。だれかちゃちゃっと作ってくれないかな〜。とりあえず XPath をもとにして抽出する処理が必要だよな〜。とか思ったけど、眠いから寝る。朝日がまぶしい。

2007.11.22 Thu l Python 熊野古道 l COM(0) TB(0) l top ▲

Plagger っぽいものを Python で。「熊野古道」というエントリーから始まった熊野古道プロジェクトなんですけど、(同時にそのエントリーでオレ様言語プロジェクトで終わったんだけど)その「熊野古道」がちっとも Plagger っぽくなりませんね。残念です。 Plagger っぽくならない理由はいくつかあるんだけど……とりあえず思いつく限りに列挙してみます。

  • 個人的な趣味だけど、並列に計算ができることを重視したい
  • できれば複数のマシンで並列に動作してほしい
  • そもそも Plagger をよく知らない…
  • っていうかそもそも Perl が読めない……

もちろん、原因は小さい順に並んでいます。これじゃぁ Plagger っぽいものはできないはずです。でもそれじゃぁ悔しいので、なんとか Plagger のソースを眺めて、それっぽいものを作ってみました。冗談じゃなくて、ほんとに Perl が読めなくて、なんとなく雰囲気で sub は関数定義だろ?とか、use base なんとか〜は継承だろ?とか、{なんとか => なんとか} はハッシュだろ?とか勘で読めるあたりまでしか読んでないので、内部の構造とかはたぶん全然違います。ごめんなさい。とりあえず分かったことは、 Plagger を起動すると、 bootstrap -> run って順に入っていって、run でいろいろとホックした関数を呼び出してるってことだけです。ほんとごめんなさい。

でも、とりあえずそれっぽいものができたんで、よかったらどうぞ。眠い… http://kawasaq.from.tv/blog/Python/Kumanokodo/kumanokodo.html

2007.11.22 Thu l Python 熊野古道 l COM(0) TB(0) l top ▲
「なんか便利な言語を作りたいなー」→
「うぅ〜ん。難しい…」→
(友達が実家の和歌山にプチ帰省)→
「和歌山といえば熊野古道だな〜」→
「熊野の神様、アイデアください!」→
「では授けよう。」→「わぁ〜い」
という流れで神様から授かった言葉は、「大社を参拝道でつないで熊野古道しなさい」だけ。
それに基づいて書いたのが「熊野古道」というフレームワークなんだけど、やっぱり基本的を部分を適当に書きすぎたせいで、どうにも使えないツールになってしまっていた。でも自分で作っておいてそういうことを言うのはあまりにも無責任なので、きちんと書き直してみた。

まず、 funcdir/square というファイルに、↓こんな感じで2乗を返す関数を書いておく。
### Kumanokodo Script Version 0.0

### Name
square
### End Name

### Dimension
0
### End Dimension

### Function
def func(params):
params[""] = int(params[""])*int(params[""])
return params
### End Function
### End Kumanokodo Script Version 0.0


で、熊野古道の簡単な文法。
その1 文字列は関数呼び出し。
>>> run("square", "2")
{'': 4}

その2 リストは関数を結合して実行
>>> run(["square", "square"], "2")
{'': 16}

その2の補足 これは上と同じ
>>> run([["square"], ["square"]], "2")
{'': 16}

その3 タプルは関数を並列に実行
>>> run((["square"], ["square", "square"]), "2")
[{'': 4}, {'': 16}]

その4 辞書は、全てのパラメータの引数を変更
 この例では、全てのパラメータに対して parameter["answer"] = parameter['']が実行される
>>> run([(["square"], ["square", "square"]), {"answer": "p['']"}], "2")
[{'': 4, 'answer': 4}, {'': 16, 'answer': 16}]

以上。
そんな熊野古道のソースはこちら
http://d.hatena.ne.jp/kawasaq/20071118/1195408934

run 関数の引数の部分を別のファイルから読み込んで実行できれば、熊野古道スクリプト言語の完成…になるはずだけど、それはそのうち作るとして、今は保留。Plagger だったら、熊野古道で言う関数の部分に、引数に対する関数の振る舞いを変化させるための引数(まどろっこしいな)が渡せるらしいから、それもそのうち作るとしようか。でも YAML にはリストとタプルの区別がないから…また文法のところから考え直し?えぇ〜。熊野の神様、助けてください…。

ま、とりあえず、前より安心して熊野古道できるようになりました。という報告です。
2007.11.19 Mon l Python 熊野古道 l COM(0) TB(0) l top ▲

帰り支度をするまえにライブドアのページで電車の運行状況を調べておくと幸せになれる気がします。というわけで、席を立つ前にこんなスクリプトを回しています。「熊野古道」風に書くとこんな感じです。まぁ、普通にデータを引っ張ってきてるだけですが。

### Kumanokodo Script Version 0.0

### Name
livedoorTraffic
### End Name

### Dimension
0
### End Dimension

### Function
def func(params):
    url = "http://transit.livedoor.com/traffic_info/kantou"

    from urllib import urlopen
    from lxml import etree

    parser = etree.HTMLParser(remove_comments=True, remove_blank_text=True)
    html_page = etree.parse(urlopen(url), parser)
    root = html_page.getroot()

    trafficinfos = root.xpath(".//*[@class='trafficinfo']")
    res =[]
    while trafficinfos:
        r = {}
        r["date"] = trafficinfos.pop(0).text
        r["line"] = trafficinfos.pop(0).text
        r["news"] = trafficinfos.pop(0).text
        res.append(r)
    return res
### End Function
### End Kumanokodo Script Version 0.0
こういのを作っておいて、この間の熊野古道をインポートして
from kumanokodo import *
res = run(("livedoorTraffic",),{})
for i in filter(lambda x: not x["news"].find(u'ほぼ平常通り運転しています。') , res):
    for key, val in i.items():
        print key,":", val
    print "**********"
っていうスクリプトを動かすと、「ほぼ平常通りに運転しています」じゃない路線について教えてくれます。こういう細々としたスクリプトをうまく熊野古道でまとめたいんだけど、書き直すのは、意外と面倒。
2007.11.15 Thu l Python 熊野古道 l COM(0) TB(0) l top ▲

自己紹介工場ってサイトを mixi のキーワードランキングで知った。「自分がちょっとした目的のために作ったプログラムを日記のように記録していったら、これは実行可能な自己紹介になるな〜」と思っていたところだったので、もうそういうサービスがあるのかと思ってしまった。もちろん違った。残念。

ちなみに、そのサービスによると私は、「遅刻しても気付かれないかわさっくです。よろしく。」

2007.11.15 Thu l Python 熊野古道 l COM(0) TB(0) l top ▲