disのソースコード読んだ

disassembleっていう関数が面白かった

例えば

>>> add = lambda x,y:x+y

っていう関数を定義してdisってみると

>>> import dis
>>> dis.dis(add)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 BINARY_ADD          
              7 RETURN_VALUE

となっている。

バイトコード命令はfunc_code.co_codeで見ることが出来る

>>> add.func_code.co_code
'|\x00\x00|\x01\x00\x17S'

これは整数値を文字にしたものをつなげた文字列として表現されているので、逆の操作をしてopcodeモジュールのopnameで対応を取ることができる

>>> from opcode import opname
>>> code = add.func_code.co_code
>>> for c in code:
...   print opname[ord(c)]
... 
LOAD_FAST
STOP_CODE
STOP_CODE
LOAD_FAST
POP_TOP
STOP_CODE
BINARY_ADD
RETURN_VALUE

Pythonでライブラリの抽象化

anydbmっていうdbm系の汎用インターフェースがあり、どうやって抽象化してんのかな?とソースコードを読んでみた。

_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
_defaultmod = None

for _name in _names:
    try:
        _mod = __import__(_name)
    except ImportError:
        continue
    if not _defaultmod:
        _defaultmod = _mod
    _errors.append(_mod.error)

__import__組み込み関数を使って_namesリストにあるモジュールがインポート出来るか試していって最初にインポートできたモジュールを返す

「Perl CPANモジュールガイド」を予約した

Perl使いだったら即予約しないとあかんよね

ProductName Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / 2730円 ( 2011-04-08 )


これはかなり楽しみな一冊

写真データはDVDにもバックアップした

昨日計画停電があって、朝起きてネットに接続しようとしたら繋がらなかった。DNSは返ってくるのでネットに問題はなさそうなんだけどpingが全然通らない。あれーアクセス制限くらったのかなぁ?と。ま、しょうがないのでe-mobileでアクセスしてた。

flickrのプロアカウントとって写真を沢山アップロードしたのが原因かなぁと思ったんだが、どう考えてもアップロードがうちのISPの5G制限には引っかかってないよなぁと。自宅サーバーのトラフィックも300メガくらいだったしトータルで1G届いてないのにアクセス出来ないのはなんでだ?と。半日ほど経ってからふと気がついて、ルーター切断して再接続したらあっさりつながった。

という感じでネット接続の件は解決したのだけど、朝から災害時の重要データの保護つまり、写真データをUSBメモリに突っ込むかDVDに焼こうかとかそんなことを考えていて、結局近所で24枚保管できるDVDケースを買ってきてDVD焼きの作業を始めた。これをジップロックで防水して避難バッグにいれとけばいいだろう。

ProductName SANWA SUPPLY FCD-SH24WH DVD・CDケース(ホワイト)

サンワサプライ / 554円 ( 2009-05-31 )


この作業の過程で、自分は大体半年で1300枚くらいの写真つまり、DVD一枚分の写真データを生成することがわかった(EOS Kiss X2使用)

flickrも使えるのでオンラインでもバックアップしつつ半年ごとにDVD焼き作業もしようっと。

写真のデータはこれは2001年から溜めてある。本当は1998年位からデータがあったんだけど、人災で消失してしまった。

顔晴蔵(がんばるぞう)と責任世代

本日は昼間に職場が、夜は(これから)家が停電というかなりヘビーなスケジュールだが、イワセさんのノートに標題のワンカップ酒(初亀)があったので、欲しくなって買いに行った。

1300436340

ちょっと早めの晩酌をしながらエントリを書いてる。

ところで、ポストに今度市議会に立候補する40代後半か50代の方の決起集会の案内が入ってて、それを見ながら責任世代ってのが気になったのであった。

あの世代はもう責任を担うというよりもサポートにまわる世代なんじゃないかなぁ。今のライフスタイルに草食とか名付けちゃうあたりで、経済が成長しないことを前提にしたライフスタイル、またはそのメタな拡張としての政治というものの肌感覚が薄いよなぁと思うんだよなぁ。

たぶん責任世代ってのは僕らか僕らよりももっと若い30代前半あたりにあるんじゃないかなぁ。

そうじゃないと未来なんて託せないよ。

なんて思ったのであった。

ProductName 世代間格差ってなんだ (PHP新書 678)
高橋 亮平
PHP研究所 / 756円 ( 2010-06-16 )


dropboxを使ってブログのデータをオンラインに退避出来るようにした

このブログのデータはSQLiteに溜まっているので、SQLiteのファイル(サイズ10M程度だし)をバックアップすればとりあえずはOK

サーバーのSQLiteデータファイルを手元のmacbookのDropboxフォルダに持ってくればオンラインにも自動的にバックアップされるじゃないかということでparamikoを利用してsftpで定期的にgetするようにした。

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='[host]', username='[user]', password='[password]')
sftp = ssh.open_sftp()
remotepath='[remote_datafile]'
localpath='[/Users/user/Dropbox/datafile]'
sftp.get(remotepath, localpath)

ProductName 実用SSH 第2版―セキュアシェル徹底活用ガイド
Daniel J. Barrett
オライリー・ジャパン / 5040円 ( 2006-11-22 )


「パフォーマンス・マネジメント」を読んだ

どこかのブログで薦められていて面白そうだったので読んでみたが、非常に面白かった。 行動を強化する好子と弱化させる嫌子とで行動を解釈していく。嫌子つまり行動の弱化はモチベーションの強化とか動機付けにはプラスに働かないというのは経験的にもしっくりくる話だ。一方でしつけとか、(子供時代に養われると思う)ある種のストイックさとか自分への厳しさってのは好子では説明できないと思うんだよなぁ。ま、そういうあたりは置いといてある程度成熟したというか自我形成された大人と言われる人達は行動の弱化というのはあまり良い方法ではないなということは理解した。

p.92

組織がパフォーマンスの向上につながらない行動に価値をおく危険を「行動の罠」と呼んでいる

同じ成果を、100%全力出し切って達成するのと70%の力で達成するのは後者が評価されるべきなんだけど、前者を評価する傾向があるよね。みたいなことが具体例としてあげられていた。

p.94

パフォーマンスに依存して報酬を与えると内発的動機が弱まる

モチベーション3.0で時代遅れと書かれているが、本書では

行動分析学では内発的動機を、仕事の成果が好子となって仕事をするという行動を自動的に強化している状態と考える。つまり、パフォーマンスそのものが好子となればいい。

と書いてある。報酬与えると内発的動機が弱まるというのは報酬そのものが嫌子または行動を弱化させる方向にはたらくものなのであろうか?それとも報酬という刺激は常に増加させないと効果がないもので、増加がないという状況が嫌子になるんだろうかね?

p.145

「タバコをやめる」とか「夫婦ゲンカをしない」など、望ましくない行動を減らすのが目標の場合、その代わりに増やしたい行動についても目標を設定しておくと効果的である。

  • 行動随伴性(Antecedent, Behavior, Consequence)
  • すべての行動の原理は「〜する」という行動にあてはまり、「〜しない」という行動にはあてはまらない
  • パフォーマンスとは行動の成果である
  • 組織がパフォーマンスの向上につながらない行動に価値をおく危険を「行動の罠」と呼んでいる
  • パフォーマンスに依存して報酬を与えると内発的動機が弱まる
  • パフォーマンス・マネジメントでは知識も行動と考える

怒らないこともあわせて読んどくとよいかも

サーバー起動時にFastladderが一緒に立ち上がるようにする(途中)

うちの職場のFastladderの延べユーザーは7割を超えていて、サーバーが落ちてるとすぐに苦情がくるような状況だ。このアクティブユーザー率にすんのに3年以上の地味な努力と啓蒙活動があったわけだが。

で、そもそもこういったインフラは僕の仕事じゃないので障害対応しても給料に反映されるわけじゃなくて、むしろ時間を奪われるので、クローラーをdaemontoolsで動かしたりして手間を減らした。おかげで、一回起動させればサーバーが安定に動いている限りなにもしなくても良くなった(ここ一年くらいは障害対応ほとんどしてない)んだけど、今週から始まった計画停電で毎日起動してシャットダウンをしてというの繰り返しつつ、mongrel立ち上げて、クローラー動かしてっていうのはだるいのできちんと起動、停止するようにしようとした。

けど、いまのとこうまくいってないのでやっつけスクリプトでしのいでいる。

mongrel

rc.localで/usr/local/fastladder/tmp/pids/mongrel.pidが存在したらrmするように書いておいて以下のシェルスクリプトをcronで実行するようにしている。

#!/bin/sh

if [ ! -e /usr/local/fastladder/tmp/pids/mongrel.pid ];
then
  cd /usr/local/fastladder; script/server -d -e production
fi

ほんとはShapadoのようにpassengerで動かせれば楽なんだろうけどFedoraCore6だからなぁ。インストール出来んのかな?明日調べてみるか。

crawler

シャットダウン時に

svc -d /service/fastladder

するようにしてみたんだけど、どうもうまくいってないのでドキュメント読みなおす。あと日本語訳も。

とりあえず、リブートするとプロセスが即落ちする(svstatで継続時間が1秒以内に落ちてプロセスがどんどん大きくなる状況になる)ので、この場合に

svc -dx /service/fastladder /service/fastladder/log

を適当な感覚でまわし続けるcronを動かしておいた。

#!/usr/bin/python

import commands
import time
import re
reup = re.compile("(\d+) seconds")

def get_uptime():
  uptime = 0
  svresult = commands.getoutput('svstat /service/fastladder')
  m = reup.search(svresult)
  if m != None:
    uptime = m.group(1)
  return uptime

if __name__ == '__main__':
  for i in range(300):
    if get_uptime() > 2:
      break
    else:
      commands.getoutput('svc -dx /service/fastladder /service/fastladder/log')
      time.sleep(10)

Pythonのdisモジュール

逆アセンブル用のモジュール

ソースコードも200行程度で読みやすそうなので、読んでみようかと。

その前にドキュメント読んだら面白かった。

Rubyで作る奇妙なプログラミング言語でスタックマシンを作ってみた経験が理解において非常に役に立った。

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ?円 ( 2008-12-20 )


リスト内包標記

>>> def cp(l): return [e for e in l]
... 
>>> dis.dis(cp)
  1           0 BUILD_LIST               0
              3 DUP_TOP             
              4 STORE_FAST               1 (_[1])
              7 LOAD_FAST                0 (l)
             10 GET_ITER            
        >>   11 FOR_ITER                13 (to 27)
             14 STORE_FAST               2 (e)
             17 LOAD_FAST                1 (_[1])
             20 LOAD_FAST                2 (e)
             23 LIST_APPEND         
             24 JUMP_ABSOLUTE           11
        >>   27 DELETE_FAST              1 (_[1])
             30 RETURN_VALUE

ループで書いてみる

>>> def cp2(l):
...   ll = []
...   for e in l:
...     ll.append(e)
...   return ll
... 
>>> dis.dis(cp2)
  2           0 BUILD_LIST               0
              3 STORE_FAST               1 (ll)

  3           6 SETUP_LOOP              27 (to 36)
              9 LOAD_FAST                0 (l)
             12 GET_ITER            
        >>   13 FOR_ITER                19 (to 35)
             16 STORE_FAST               2 (e)

  4          19 LOAD_FAST                1 (ll)
             22 LOAD_ATTR                0 (append)
             25 LOAD_FAST                2 (e)
             28 CALL_FUNCTION            1
             31 POP_TOP             
             32 JUMP_ABSOLUTE           13
        >>   35 POP_BLOCK

  5     >>   36 LOAD_FAST                1 (ll)
             39 RETURN_VALUE

参考

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


linuxのatコマンド

うちは輪番停電の第5グループなので、明日は正午に停電が起こるわけだ。

そのタイミングで自宅サーバーも落としておきたいがcronだと毎日同じ時間に設定されるし、毎度毎度変更するのも面倒くさい。

そういう時にはatを使えばいいらしい。

echo "shutdown -h now" | at 11:50 3/15/2011

なにげにatを使うのは初めてだな。

ProductName プロのための Linuxシステム構築・運用技術 (Software Design plus)
中井 悦司
技術評論社 / 3024円 ( 2010-12-22 )


というわけで、このブログは第5グループの停電に応じてアクセスできなくなることが判明した。