vimperatorの最新版を入れる

先日は「vimperatorの最新版を入れると画面が崩れる」と書いたけど、なんてことはない、vimperator/components/protocols.jsシンボリックリンク用のテキストファイルなのが問題なので、hg clonehg pull -uした後にファイルをリンク先のcommon/components/protocols.jsと置き換えるだけでキチンと動くようになった。

同じvimperator/componentsフォルダの他のファイルは23776eba63のコミットでcommon/componentsフォルダのファイルと置き換えられてるから解決済みだと思って違う原因を探してたんだけど、何でこのファイルだけテキストファイルのままなんだろ? 7c9761eddaのコミットで追加されてるんだけど、本体の事情なんて難しくて解らんし、英語なんで解らんし、機械翻訳して読むのすらも面倒くさいし、vimperator自体はそんなに問題無いみたいなのでまぁどうでもいいや(幾つかプラグインは動いてないけど)。

10月の読書メーター

10月の読書メーター
読んだ本の数:20冊
読んだページ数:7726ページ

特に良かった本

  • 親愛なるクローン
  • モリー
    • ヴォルコシガン・シリーズがメモリー以降翻訳されてないのはひどいと思う。あとは過去の話(名誉のかけら、バラヤー内乱)がまだ読まずに残っているけどもう少し取って置こう。
  • 毒蛇の園
    • シリーズが色物扱いされてるらしいけど(本当?)、素晴しい騙りを味わった。
  • 現代短篇の名手たち3 泥棒が1ダース
    • 必ず厄介事に巻き込まれる主人公ドートマンダー物のユーモア溢れる短編集。作者のドナルド・E・ウェストレイクまで好きにさせられちゃうほどの楽しさ。
  • ノーストリリア
    • 文章のすべてが輝くほどの美しさ。読む前の古臭い印象とは全く違ってて、一発で惚れてしまった。何故好きなのかを説明できないくらい好き。他の人類補完機構シリーズも早いうちにちゃんと読もうと思う。
続きを読む

近況

とにかく毎日やる気が出ない。

  • vimperatorの最新版に追従しようとhgをインストするものの、最新版を入れると画面が崩れるので、いまだにr4045のまま。
  • fx3.6bをインスト。別プロファイルだからかもしれないが、明かにメモリの使用量が少くなってて快適。けどバージョンチェックを無視して入れたグリモンの調子が悪いし、アドオン関係が追い付いてないのでまだ常用には適さないかな。
  • ここ一月ほどはpythonでばかり書いてるけど、いまだに「rubyのこのメソッドはpythonだとどれ?」ってのでググる
  • FWの入れ替え。ZAからOutpostに。基本的な機能は揃っている上に、軽いし、定番ソフトの設定はしてくれる、自動学習モードもある、日本語化ツールもある、と何も考えずに入れるにはピッタリなんじゃないかな。
  • 祖母の家のベランダの縁と庇のペンキ塗り。剥離を刮ぎ落して、サビ止めを塗って、屋根に身を乗り出し、脚立に乗って、ペンキを塗って。自分がこういう工作に向かない人間だって事がよく分かった。

pythonで遊んでたら

なんでか知らないけど、webページの本文から画像のみを抽出してTumblrにポストするツールが出来た。
URLを入力すると自動でリストアップ、チェックの入った画像のみをポストするだけ。
これをWebサービスとして公開でもできたらいいんだけど、色々と至らないところだらけなので断念。

続きを読む

続・pythonでクラスの中でのデフォルト引数に嵌った

class Test2():
    alt = "fuga"
    def p(self, arg = alt):
        print arg

t = Test2()
t.p("hoge")    # >>> hoge
t.p()          # >>> fuga
t.alt = "piyo"
t.p()          # >>> fuga

あー、この方法だとデフォルト値の変更が効かないからダメだ(デフォルト値は関数定義の時にだけ評価される)。


さらに調べてみたところ、このようにするのがいまのところ一番良いみたい。

class Test3():
    alt = "fuga"
    def p(self, arg = None):
        if arg is None:
            arg = self.alt
        print arg

t = Test3()
t.p("hoge")    # >>> hoge
t.p()          # >>> fuga
t.alt = "piyo"
t.p()          # >>> piyo

これはちょっと面倒だなぁ。

pythonでクラスの中でのデフォルト引数に嵌った



>>> 続・pythonでクラスの中でのデフォルト引数に嵌った - 切なさの刹那


デフォルト引数の機能を使って、メソッドの呼び出しに引数が無かった時のためにデフォルトの値を指定しておく。

alt = "fuga"
def test0(arg = alt):
    print arg

test0("hoge") # >>> hoge
test0()       # >>> fuga

これをクラスの中で使おうとすると、こう書いた時点でエラーを吐く。p1,p2のどちらかでもダメ。

class Test1():
    def __init__(self):
        self.alt = "fuga"

    def p1(self, arg = self.alt):
        print arg

    def p2(self, arg = alt):
        print arg

正解はこう。

class Test2():
    alt = "fuga"

    def p(self, arg = alt):
        print arg

t = Test2()
t.p("hoge") # >>> hoge
t.p()       # >>> fuga

Test1の書き方だとp1,p2のメソッドを定義した段階では__init__が呼ばれていないから、変数の用意が出来てなくてデフォルト引数の指定が失敗するというわけ。
最初からクラスの中にベタ書きしておけば問題無し。


ちなみにrubyだと一つ目の方法で書く。その代わり最初の例そのままだとエラーが出るみたい(altをローカル変数以外にすればおk)。

class Test1
  def initialize()
    @alt = "fuga"
  end
  def p1(arg = @alt)
    p arg
  end
end

t = Test1.new()
t.p1("hoge") # => hoge
t.p1()       # => fuga
alt = "fuga"
def test0(arg = alt)
    p arg
end
test0("hoge") # => hoge
test0()       # => ERROR

Ruby, Javascriptの次にPythonを触って思ったこと

をメモしておく。

戸惑った点

呼び出し
  • rubyだとobj.hoge()が大半だったけど、pythonだとfuga.hoge(obj)。モジュールの名前空間ってやつなのかな?
  • メソッドチェーンが出来無い。
文字列
  • str型とunicode型とがあり、unicode型は文字コードで分かれていて、ややこしいことこの上ない。
  • 自分で書く分にはunicode型に統一してれば良いけど、外部からの読み込みが絡んでくると思いもしないところで嵌る。
クラス
  • メソッド定義、呼び出しのselfが面倒くさい。
イテレータ(?)
  • rubyのEnumerable的な動作の書き方がよくわからない。
  • リストの内包表記が覚えられない。
三項演算子
  • これは完全に嵌った。
ruby, javascript
(式) ? "正の値" : "負の値"
python
"正の値" if (式) else "負の値"
ヘルプファイル
  • ドキュメントが豊かなのは良いけれど、正直文章量が多すぎて直感的に理解しづらい。
  • 一つのメソッドでも、リファレンスマニュアルを読んで調べるよりもググる方が結果的には早かったりする。

良かった点

速度
  • もっさりした感じが無くて、小物ツールなんかを作るには最適。
インデント
  • タブのインデント自体はエディタさえちゃんとしてれば慣れる。
  • そして慣れれば構造化されていて見易い。

思った事

  • Rubyは自由帳、思ったとおり好き勝手に書く。
  • Pythonは原稿用紙、決まりにそってきっちり綺麗に書く。