メタプログラミングRuby 水曜日

水曜日はブロックの章。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

まつもと直伝 プログラミングのオキテ 第5回(2)

ブロックとは,関数1つを採る高階関数を文法的に特別扱いしただけ,とみなすこともできます。

ほうほう、ということはpythonの場合はラムダ式とればいいのか。

章の終りの方の例がDSLで面白そうなのでやってみる。

def event(name,func):
    if func():
        print  "ALERT: %s" % func.__name__()

event("イベントが発生すること", lambda: True)
event("イベントが発生しないこと", lambda: False)

とやってみたが、ラムダ式は複雑なのが書けないのでコードロック渡したい。

デコレータ使えばいいかということでこんな感じにしてみたが_eventで終わる関数を評価するときに、文字列とって関数適用するところで悩んだ。getattrはまぁわかるとしてimport __main__しないと

Traceback (most recent call last):
  File "metr3.py", line 24, in <module>
    func = getattr(__main__, func_name)
NameError: name '__main__' is not defined

って出てくる理由がわからん。

def event(eventname):
    def decfunc(func):
        def func_():
            if func():
                print  "ALERT: %s" % eventname
        return func_
    return decfunc

@event("イベント発生")
def test1_event(): return True

@event("イベントが発生しないこと")
def test2_event(): return False


if __name__ == '__main__':
    import __main__
    for func_name in [elem for elem in dir() if elem.endswith("_event")]:
        func = getattr(__main__, func_name)
        func()

今日の畑(100913)

ゴーヤ終了。根を抜いて一週間位放っておけば枯れるので処分が楽。あとこぼれ落ちた種を拾って綺麗に洗って来年にむけ取っておく。完熟ゴーヤは大抵虫が入っていてしかも種のまわりの赤いやつが落ちにくいので家に持って帰ってくると台所が汚れると不評。

あと、オクラがほとんど終わってたが、今朝の出勤途中の大渕の畑ではまだ青々と茂っていて花が咲いていたので、育て方が悪かったのか、それとも島オクラなのかわからん。うちの隣の畑のオクラも処分されてたし、あれは島オクラだということにしておこう。

ミョウガ初収穫。店で買うやつよりも辛味が強かったがそんなもんか?それとも早く収穫しすぎた?

1284551823

アサツキの芽もちょこちょこ出てきた。そろそろ何植えるか決めなきゃいけないがこれから畑に行く頻度が下がるので葉物はちょっと躊躇している。

メタプログラミングRuby 火曜日

火曜日はメソッドを動的に定義する。Pythonだと__setattr__と__getattribute__を使えばいいが、魔術っぽさを感じる。Rubyは見た目自然じゃないか。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

import re
class Ds(object):
    def get_cpu_info(self,i):
        return 2.16
    def get_cpu_price(self,i):
        return 150
    def get_mouse_info(self,i):
        return "dual optical"
    def get_mouse_price(self,i):
        return 40

# METAPROGRAMMING RUBY
# class computer
#   def initialize(computer_id, data_source)
#     @id = computer_id
#     @data_source = data_source
#     data_source.methods.grep(/^get_(.*)_info$/) { Computer.define_compornent $1}
#   end
#
#   def self.define_component(name)
#     define_method(name){
#       info = data_source.send "get_#{name}_info", @id
#       price = data_source.send "get_#{name}_price", @id
#       result = "#{name.capitalize}: #{info} ($#{price})"
#       return "* #{result}" if price >= 100
#       result
#       }
#     end
#   end

class Computer(object):

    def __init__(self,computer_id, data_source):
        self.data_source = data_source
        self.id = id
        for name in [re.search("^get_(.*)_info$",m).group(1) for m in
                     dir(data_source) if re.search("^get_(.*)_info$",m)]:
            self.define_compornent(name)

    def define_compornent(self, name):
        def define_method():
            info  = self.data_source.__getattribute__("get_%s_info"%name)(self.id)
            price = self.data_source.__getattribute__("get_%s_price"%name)(self.id)
            result = "%s: %s ($%s)" % (name.capitalize(), info, price)
            if price >= 100:
                return "* %s" % result
        self.__setattr__(name,define_method)

if __name__ == '__main__':
    ds = Ds()
    com = Computer(12,ds)
    print com.mouse()
    print com.cpu()

後半はmethod_missingを使う例だった。perlだとAUTOLOADかとおもってググッてみたら。一覧になってた。

ところで、__getattribute__と__getattr__の違いがわからんという新たな発見をした。

メタプログラミングRuby 月曜日

メタプログラミングRubyを読み始めた。第一部は月曜から金曜にわかれていて、、、、、 まぁ毎日読めってことですな。

というわけで、機能はRubyのオブジェクトモデルに関して読んでいた。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

rubyにはancestorsっていうメソッドがあって継承関係を調べることができる。

pythonだとこんな感じか?

def ancestors(ins): return [c.__name__ for c in ins.__class__.mro()]

クラスに関してはPython Types and Objectsが分かりやすかった。

あと、pythonでのメタプログラミングはエキスパートPythonで少し触れられている。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / ¥ 3,780 ()
在庫あり。

王将

王将。前回電話したら予約で一杯だったのでとり心行ったんだった。というか予約したほうが無難か。

1284280628

外から見ると「カウンター中心のお店なのかな?」と思っていたのだけど、入ってみると座敷が広々していて子連れにもやさしい。接客も気持ちいいし。

1284280626 1284280630

五色釜飯

1284280623

漬物が美味しかった。長芋の漬物が特によかったな。

また行く。

「大規模サービス技術入門」を読んだ

U隊長が友達のとこに遊びに行くので長泉まで送って行きつつ、well-Dの隣のモスバーガーでカフェオレ飲みながら読みきった。

読み物としては面白かったけど、今の仕事の中では役立てる機会がないんだよなぁ、残念。

IIRは読もうかなと思った

ProductName Introduction to Information Retrieval
Christopher D. Manning,Prabhakar Raghavan,Hinrich Schuetze
Cambridge University Press / ¥ 4,599 ()
在庫あり。

ソラニンを読んだ

原稿書いてて行き詰まったので、ソラニンの二巻を探しにブックオフった。

ProductName ソラニン 1 (ヤングサンデーコミックス)
浅野 いにお
小学館 / ¥ 530 ()
在庫あり。

ProductName ソラニン 2 (ヤングサンデーコミックス)
浅野 いにお
小学館 / ¥ 530 ()
在庫あり。

まぁ、日常だなって思える部分がスゴク良かった。

第九回Haskell読書会@富士コミュティF

9月の読書会は富士市の吉原でやります。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

  • 日 時 : 2010年9月25日(土) 13:00~17:00
  • 場 所 :富士市民活動センター・コミュニティF ( http://com-f.net/index.html )
  • 地 図 : http://com-f.net/access.html

10章(型)のとこ。

プログラミングHaskell 13章

13章の問題は証明ばっかりなので、紙に書いてけばOKな感じ。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

というわけで、二周しつつ問題を解き終えた。

これは名著だよなぁと改めて思ったのであった。

秀鳳 純米

精米歩合80%!

1284120020

そのわりには野暮ったくない。なかなか不思議な感じの酒だった。

米を磨かないということはどういう事なのだろう?と。

磨くと綺麗な味わいになるのはわかんだけどねー。