Web+DB PRESS vol.39

WEB+DB PRESS Vol.39

WEB+DB PRESS Vol.39

ここ最近、毎月購入して通勤電車で読んでます。DBとかあまりいじったことないので、ものすごく勉強になります。あと、ウォータフォーラーな僕にはアジャイラーのみなさんとの接点っぽい位置づけでためになること満載です。
通勤が長くなるのも、多少はメリットがあります。無理やり読書の時間にできるので。
バッチ処理のお話もありました。結構Webサーバのバックエンドでガリガリバッチ処理とかされてるのですね。なかなか興味深い。


話はとんで。WEB+DB PRESS Vol.39の購入ついでに、Perl Hacks ―プロが教えるテクニック & ツール101選も購入しました。Pythonにも応用できそうなことが多かったので、勉強になると思ったので。いまのPythonにはできなくて、ちょっとがんばれば僕にも実践できることをPythonで実践できればと思ってます。
では、さっそくひとつ。Hack#14の「遮蔽装置の実現」をPythonで。
Pythonには、パスワード入力の汎用モジュール(といっても、2つしかメソッドないですが。。。)である「getpass」があるのですが、こいつはエコーバックを完全になくしてしまいます。入力したら、入力文字数分だけ"*"を表示したい!!
というわけで、getpassモジュールを参考に、lgetpassを作成してみました。

import sys
import termios

def lgetpass(prompt='Password: ', echo=None):
    fd = sys.stdin.fileno()
    passwd = ""

    old = termios.tcgetattr(fd)     # a copy to save
    new = old[:]

    new[3] = new[3] & ~termios.ECHO # 3 == 'lflags'
    new[3] = new[3] & ~termios.ICANON
    try:
        termios.tcsetattr(fd, termios.TCSANOW, new)
        sys.stdout.write(prompt)
        while (1):
            s = sys.stdin.read(1)
            if s != '\r' and s != '\n' and s != '\r\n':
                sys.stdout.write(echo)
                passwd += s
            else:
                break
        #passwd = raw_input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)

    sys.stdout.write('\n')
    return passwd

if __name__ == '__main__':
    print lgetpass(echo='*')

みたいな感じでしょうか。1文字読み込みのところとかは、素人くさいくさいw(あんまりHackerレベルのコードというのがよくわかっていないのですが、僕の中ではmapとかlambdaとかガンガンしようしてるイメージw)
でも、僕の今のPythonのレベルはこんな感じです。あ、実行結果は以下のとおり。

% python getp.py                            [~/py]
Password: **********
syobosyobo

昨日はPython クックブック 第2版も購入して、"Hack漬け"です。("お茶漬け"みたい。)
書籍を購入しまくりです。ガシガシ勉強します。