みろりHP


緑色さんの多目的ブログ
みろりえいちぴー
ごゆるりとおくつろぎあさーせ。
| カテゴリ:感想文 |
仁木英之『まほろばの王たち』



まほろばってタイトルと緑色の表紙に惹かれて読んだ。まほろばってのは俺がガキのころ取り組んでいたプロジェクトの名前なのだよ。サマリと感想を書く。



時は大化の改新。場所は朝廷。蘇我氏に滅ぼされた物部氏の生き残り、広足(ひろたり)ちゃんは料理が上手な女の子。料理が上手っていうけど、それがまた神懸った上手さなんだ。その料理の腕に目をつけた美しい験者、賀茂役小角(おづぬ)さんは彼女を弟子にとる。広足ちゃんとしては、師匠はめっちゃカッコイイ術師だし、山での神様たちに囲まれての生活は長閑で充実だし、とっても満足だ。
が、世間はというと中大兄皇子と中臣鎌足が蘇我氏を滅ぼし、各地に大道を敷き、野も山も統一しちまおうと動いており大わらわだ。山の民はそんなこと勝手に推し進められてはたまったもんじゃねーから、山と朝廷の確執は深まるばかり。そんな中、里には人食い鬼が出て、山には神喰いなるバケモンが出やがる。互いに「山の差し金だ!」「朝廷の差し金だ!」と一触即発の雰囲気になってしまう。
そこで立ち上がるは我らが小角師匠である。手始めに神喰いを待ち伏せて正体の見当をつけ、鬼の住処に入って人食い鬼の事情を調べ上げた。事の次第がわかったので朝廷へ行ってみると、賀茂の族長である大蔵さんが中大兄皇子をだまくらかして山と山の民に関する全権を頂戴しようとしているところだった。そう、この大蔵こそは鬼をだまくらかして人を食わせ、神を食って山と里の関係を悪化させ、ドサクサに紛れて力と権力を得ようとしていたクソ野郎なのである。小角師匠は神たちと共に大蔵を取り囲んで撃退した。
だけどぶっちゃけ全てが大蔵さんのせいってわけでもないだろう。そもそも山を手中に収めようなんて中大兄皇子と中臣鎌足が言い出したからこんなことになってるのだ。小角師匠はここぞとばかりに「今後山に手を出さないように」と申し出るが、皇子は「天の下にあるものはすべて国の一部だ」と話をきかねー。平行線のまま事件はとりあえず終結を迎えたとさ。



気に入ったくだりを以下に。

広足ちゃんのお料理シーンが好き。
  • 星灯りを頼りに石を打ち、持ってきた木屑を使って火を起こす。呪を唱えつつ水を清めて米を炊き、そこに鹿と山鳥の干し肉を入れ、最後に葱を刻んで彩りを添えた。
  • 「さて、作るか!」蕨、葛、いたどり、鱈などは一口大に切って醤で和えたものに山椒の葉をあしらう。大鍋に菜種油を満たし、大きな竈にかける。米と麦を石臼でひいたものを様々な形に整えていく。純白の生地が熱い油の中で心地よい音を立てる。
広足に呪禁を教えてくれない小角師匠。
  • 「人にはその身にあった働き場所というのがある。お前の作る食事は素晴らしいものだし、それは私の術になんら劣らない」。
  • 「一つ何かを為すことができれば、全てはその応用でしかないんだよ」。
    • 同感だ。何かひとつに絶対の自信がある奴はどこでも堂々としてるものだ。逆に、どんな分野でも負けず嫌いだなんて奴は、どんな分野でも自信がないってことになるんじゃねーかな? だけどさ、呪禁くらい教えてやれよ! 「一つ何かを為すことができれば」の理論はむしろ、「何か一つをやりきれる奴は何でもきっちりやれる」ってことだと俺は思うんだが。
小角師匠の山好きをばっさり言い換える広足ちゃん。
  • 「山を走り、岩に座り、古き者たちと心を交わすことが喜びだった。だから私は山を敬し、そこで時を過ごすことに決めた。」「俗世がおいやだったんですね。」「平たく言うとそういうことなんだろうな」。
ベジタリアンの小角師匠。
  • 「食えば調子が悪くなるとわかっているものを、何も好んで食うことはない」。
中大兄皇子の資質と、それを評価する中臣鎌足。
  • 「多くの死を見なければならない。敗れし者の死には向き合っていかねばならぬ」。立派だ。天皇たる者に必要な仁慈を生まれながらにして持っている。
    • 中臣鎌足が中大兄皇子の右腕にして一番のファン、っていうのがよかったよな。
結末について。
  • 小角と中大兄皇子の思想戦はドローに終わるかたちだったけど、それを大海人皇子がうまくまとめてくれたな。終始「なんじゃこの小僧は」と思わせてくれる大海人だったけど、最終的に「山も里も見た統治者」という立ち位置に収まるための存在だったんだね。

ストーリーとかキャラに思い入れはまったくできなかったが、文章がやさしくてとても読みやすかった。理解に躓くところが全然なかったね。村上春樹とは違ったやさしさ。まるっこい感じ。村上春樹の清潔な読みやすさとは違う。俺もこういう、文章における自身の色みたいなもんが欲しいところだぜ。


| 緑色 | 感想文 | comments(0) |
| カテゴリ:プログラミング |
Python デコレータ奮闘記つづき



目次。


こないだのデコレータ奮闘記はおおむね無事閉幕したのだけれど、ひとつ疑問が残っていた。デコレータというロジックが登場する場面には汎用関数先行型とデコレータ先行型があるが(ネーミングは俺)、なんで後者にだけ@の省略記法があるんだろう? ってものだ(先回の一番最後に書いたやつ)。この件に自分なりの解決がつけられたので書く。

みどりんが呼ぶところの汎用関数先行型 みどりんが呼ぶところのデコレータ先行型
def call():
    # デコるプログラム

def deco(func):
    # call()をデコるデコレータ

call = deco(call)
def deco(func):
    # デコレータ

# 省略記法
@deco
def call():
    # デコるプログラム

それはだな…
  • デコレータが登場する場として二通りあるってのは間違いないと思うんだけど、それぞれ、デコレータを作る人間の立場が違うんだ。
  • 汎用関数先行型ではデコレータを作る人間はデコレータの「製作者」。
  • デコレータ先行型ではデコレータを作る人間はデコレータの「利用者」。
  • 省略記法ってのは、利用者が便利になるように存在するものだ。だから「利用者」を対象とした場面にしか@の省略記法が存在しないんだ。
  • てかそもそも汎用関数先行型って、デコレータがデコレータである意味が薄いだろう。上のスクリプト例でいえば、デコレータが「call()をデコるデコレータ」ってなってるけど、それはただのcall()の拡張にすぎないだろう? クリスマスツリーのデコレーションってあるけど、あれはクリスマスツリーにしか使えないんだからもはやクリスマスツリーの一部だろう? いや例示に失敗してる感が否めないがそういうことだと思うんだ。特定の関数だけを装飾するためのデコレータはその関数の拡張に過ぎない。デコレータじゃない。だったらデコレータの省略記法も存在しないよそりゃ。
  • 一方、デレコータのセットが用意されてて、みなさんの好きな関数をデコレーションして楽しんでねーって提供されてたら、それは完璧にデコレータだ。プレゼントの包装紙は何にでも使える。何でもラップできる。だから利用者に向けてキレイな包み方とか簡単な包み方もまた提供されてる。それがデコレータの省略記法だ。



ところで、だとすれば、デコレータは汎用性に富んだ書かれ方をすべきだろう。俺が先回から書いてたやつはまさにcall()の拡張にすぎなかったから、めっちゃ抽象度の低い作りだったよな。デコレータ自体に引数を取らせたり、可変長引数に対応したデコレータの書き方もついでに覚えておくぜ。

例として、関数をデコって返り値の文字数を数えるデコレータを作ってみる。ほんで、デコレータ自体にTrueを与えたらスペースも数えて、Falseを与えたらスペースはカウントしない、って作りにする。なんかねえ、デコレータ自体に引数を渡すには、デコレータをさらにネストして定義しないといけないらしいぜ。
def deco_wrapper(count_space):
    def deco_count(func):
        def func_kari(*args):
            if count_space:
                return len(func(*args))
            else:
                return len(func(*args).replace(' ', ''))
        return func_kari
    return deco_count
可変長引数の対応は、単にネストされたfunc_kariの引数部分を全部*argsにするだけだぜ。使い方が以下。
@deco_wrapper(True)
def call1(name):
    return name

@deco_wrapper(False)
def call2(name1, name2):
    return name1 + name2

# count_spaceをTrueにしたので結果は5
print(call1('x x x'))

# count_spaceをFalseにしたので結果は6
print(call2('x x x', 'y y y'))
オッケー、これはそこそこ汎用性がありそうだぜ。ってアレ? こういうデコレータ定義の仕方だと、@省略記法を使わない書き方には対応できねーんじゃねーか?



疑念は的中し、@記法を使わず、デコレータに引数を渡したい場合は以下のようなデコレータ定義をしねーといけない。
def deco_count(func, count_space):
    def func_kari(*args):
        if count_space:
            return len(func(*args))
        else:
            return len(func(*args).replace(' ', ''))
    return func_kari
使うときはこう。
def call3(name):
    return name

def call4(name1, name2):
    return name1 + name2

# @記法はこのへんを簡略化してる。
call3 = deco_count(call3, True)
call4 = deco_count(call4, False)

# count_spaceをTrueにしたので結果は5
print(call3('x x x'))
# count_spaceをFalseにしたので結果は6
print(call4('x x x', 'y y y'))
あ、こっちはデコレータがさらにネストされることもないし、定義したとおり、見たまんまの動きになるから好みかもしらん。ってアレ? こっちはこっちで@記法に対応できねーんじゃねーか?

@deco_count(True)
def call5(name):
    return name
これはエラーになる。



いやつまり、これはつまり、@使用のデコレータと@不使用のデコレータはてんで別物ってことになるよな!? 何が「省略記法」だ。省略じゃないよコレ。まるで別物だよ。つーわけで今回の奮闘の結論は以下。
  • 俺が「汎用関数先行型」と呼んでたデコレータはデコレータじゃなくてただの関数拡張
  • 俺が「デコレータ先行型」と呼んでたものが正当なデコレータ(何が先行型だ。デコレータは先行するものなのだ)
  • 俺が「@省略記法」って呼んでたのは大間違い。まったく省略じゃない
  • デコレータの書き方には「@記法」と「見たまんま記法」があるが、それぞれデコレータの定義が別物
  • デコレータを作るときはどっちの記法で使わせるか先に決める必要がある

おつかれさまでしたァ!


| 緑色 | プログラミング | comments(0) |
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< April 2017 >>
+ みろりHP内検索
+ 閲覧記事
+ カテゴリ
+ 年月選択
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (9)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2009年 04月 (1)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…