今年やりたいこと

1.OpenStack
 今年の前半はOpenStackについて勉強していこうと思っています。
 ubuntu12.04がでたら触ろうと思ってたんですが、その前に別件で勉強しようという話があって色々触っているところです。

2.関数型言語
 触ったことないので、haskellとかerlangとかそういうの。

Flaskはいつ使えばいいのか

Flask の使いどころ – Twisted Mind」や「Flaskを1年仕事で使った感想 – kawaken’s blog」で書かれていたのですが、自分もFlaskをさわっていた感じからは同じような認識です。(といっても、これらの方々と違い、自分は仕事でpythonを使っていないし、ウェブに関わる仕事もしていないし、昨年1年ちまちまとpythonの勉強をしていただけですが・・・。)

とりあえず、自分がFlaskを使うかどうかの大きいポイントは以下です。

・プロトタイプはFlaskで。
・データベースをしっかり使うならFlaskはやめる。
・ファイルが沢山になるならやめる。

Flaskを採用する基準はmitsuhiko/flask-pastebin – GitHubくらいじゃないのかなーと思っています。
これ以上になったら、お仕事としてはしっかりしたフレームワーク(DjangoやPyramid)を使う方がいいと思ってます。

昨年はpythonの勉強と言うことで、Flaskをベースに、認証とか、SQLAlchemyとか、ディレクトリ構成を考えたり、デバッグやらライブラリの動きとか、いろんなのを触ることができて丁度よかったのは間違いないです。
今までにrailsとかdjangoなども触ってきましたが、どう動いてるのかわからないことが多かったですが、flaskを触ってからは「ああ、ここの処理を良きに計らってくれているのね」ということがわかるようになった気がします。

HTMLテンプレート管理ツール

さて。今年最後の投稿になります。
今年はpythonで遊んだ1年になりましたが、非常に面白い年でした。

というわけで、今年の最後はpythonで作ったものをひとつ。
ワンクリックでインストールできて動作できればいいんですが、全然そうはいかないのが残念。
しかし、python、virtualenv、Flask、SQLite3、twitter-bootstrap、jquery、とかそこらへんを絡めてますので、これからpython+Flaskで何かを作りたいなーと思っている方の参考になればいいかなーと思います。
まー。@mitsuhikoさまのgithubを覗くのが一番参考になるけどね。
ではよいおとしを!

Read more »

jenkinsをpythonから動かす

pip install python-jenkins
import jenkins
j = jenkins.Jenkins('http://host/jenkins')
print j.get_jobs()
print j.build_job(jobname)

Welcome to Python Jenkins’s documentation! — Python Jenkins v0.2 documentation

Welcome to AutoJenkins’s documentation! — AutoJenkins 0.4.3 documentation

pythonのクラス

クラスの型からクラスインスタンスを生成したかったのだけど、mac上のpythonから同じことしたら同じインスタンスを指してたんだよなー。
と、思ってこれ書いてたら普通に動いてた・・・?? あれれ?? まぁいいか・・・

class TestClass(object):
  def __init__(self, msg):
    self.msg = msg

klass = TestClass

a = klass('a')
b = klass('b')

assert(a.msg == 'a')
assert(b.msg == 'b')

[Python] クラスの挙動まとめ #1 – 大カフェイン
クラスの挙動まとめ #2 – 大カフェイン
Pythonの型と二つのクラス、そしてインスタンス – atsuoishimotoの日記

本って邪魔

最近、時間がないながらも定期的に本を読むことができて何とも幸せな感じになってきたのですが、本を読むと困るのが読んだ本を置くところです。
「この本、今度使うかもしれない」と思って取っておくと、どんどん増えていきます。

というわけで、対応策を考えてみます。

Read more »

virtualenv + vimからのpython実行

pythonで何か書くときは、virtualenv(virtualenvwrapper)環境で、vimでコードを書いています。
書いたコードを実行するのにvimからシェルに戻るのは面倒なので、vimから p でpythonのコードを実行 (!python %)するようにしていたのですが、vimの!だとvirtualenvの設定を引き継いでくれません。
そのため、必要なライブラリがなくて実行できず困ってました。

というわけで、検索してみたらすぐに発見

Vim-users.jp – Hack #168: シェル以外から立ち上げたVimでもシェル側の環境変数PATHを考慮したコマンドの呼び出しを行う

これがあればPATHを引き継いで実行できる!

.vimrc

function! s:Exec()
  exe "VimProcBang " . &ft . " %"
:endfunction
ommand! Exec call <SID>Exec()
map <silent> <Space>p :call <SID>Exec()<CR>

西松屋を探せ! python+googlemap

先日、ちょっと札幌に行ってきました。
少し時間があったので、嫁が行きたいと言ってた西松屋に行くことにしました。
しかし、札幌の地理がよくわからないので、西松屋店舗案内をみても、どこが近いのかよくわからないのです。

じゃぁ、グーグルマップにマーカーたてちゃおう!

もちろんpythonから。

Read more »

この程度のバグもお分かりにならないとは、旦那様はアホ

少し時間ができたので久しぶりにredmineとhudsonを更新して・・・え・・!?・・あれ!?・・・hudsonさんクビになってるし! えええ!
というわけで、jenkinsさんに頼むことにしましたので、少しメモ。

Read more »

pythonでsocketを使ってHTTP GETしてみる。

「Webを支える技術」を読んでいたら、HTTP GETしてみたくなったのでpythonのsocketを使ってやってみました。
サーバー側はsocketじゃなくてflaskです。apacheとか、まぁ、ふつうにgoogleとかにアクセスしてもいいよね。

http_request_tester.py

# vim: fileencoding=utf-8
import socket
import urllib

class Response(object):
    HEADER_BODY_SPLITTER = "\r\n\r\n"

    def __init__(self, response):
        split_index = response.index(self.HEADER_BODY_SPLITTER)
        self.header = response[:split_index]
        self.status = self._get_status(self.header)
        self.headers = self._header2dict(self.header)
        self.body = response[split_index+len(self.HEADER_BODY_SPLITTER):]

    def _get_status(self, header):
        return header[:header.index("\r\n")]

    def _header2dict(self, header):
        headers = {}
        for line in header.splitlines()[1:]:
            headers[line[:line.index(":")]] = line[line.index(":")+1:].strip()
        return headers

class HttpRequestTester(object):
    sock = None

    def __init__(self, host='localhost', port=80):
        self.host = host
        self.ip = socket.gethostbyname(host)
        self.port = port

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

    def _request(self, request_message):
        try:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.connect((self.ip, self.port))

            self.sock.sendall(request_message)

            response = ""
            while True:
                data = self.sock.recv(1024)
                if not data:
                    break
                response += data

        finally:
            if self.sock:
                self.sock.close()
                self.sock = None

        return Response(response)

    def get(self, path, params={}):
        template = "GET {path} HTTP/1.1\n"
        template += "Host: {host}\n"
        template += "Connection: {connection}\n"
        template += "User-Agent: {user_agent}\n"
        template += "Accept-Language: {accept_language}\n"
        template += "Referer: {referer}\n"
        template += "\n"
        request_message = template.format(path=path, host=self.host,
                        connection='close',
                        user_agent='HttpRequestTester/0.0.1',
                        accept_language='ja',
                        referer='')

        print "REQUEST: {request}".format(request=request_message)

        return self._request(request_message)

    def post(self, path, params={}):
        template = "POST {path} HTTP/1.1\n"
        template += "Host: {host}{port}\n"
        template += "Content-Type: {content_type}\n"
        #template += "Connection: {connection}\n"
        #template += "User-Agent: {user_agent}\n"
        #template += "Accept-Language: {accept_language}\n"
        #template += "Referer: {referer}\n"
        template += "\n"
        template += "{param_string}\n"
        template += "\n"
        request_message = template.format(path=path, host=self.host,
                        connection='close',
                        content_type='text/plain; charset=utf-8',
                        user_agent='HttpRequestTester/0.0.1',
                        accept_language='ja',
                        referer='',
                        port=":"+str(self.port) if self.port!=80 else "",
                        param_string=urllib.urlencode(params))

        print "REQUEST: {request}".format(request=request_message)

        return self._request(request_message)

if __name__ == "__main__":
    HOST = 'localhost'
    PORT = 5000

    http = HttpRequestTester(HOST, PORT)
    res = http.get("/")
    print res.status
    print res.headers
    print res.body
    raw_input()

    res = http.post("/", params={"hoge":"hogehoge"})
    print res.status
    print res.headers
    print res.body
    raw_input()

flaskで作ったテストサーバー

from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def post():
    if request.method == "GET":
        return "GET DESU"

    return "POST DESU"

if __name__ == '__main__':
    app.run(debug=True)

GETやPOSTのConnectionとかは適当。
「Webを支える技術」の8章とか巻末あたりに書いてそうだけど、まだ読んでないのでまた今度。

参考