本って邪魔

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

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

続きを読む

virtualenv + vimからのpython実行

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

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

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

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

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

西松屋を探せ! python+googlemap

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

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

もちろんpythonから。

続きを読む

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

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

http_request_tester.py
[python]
# vim: fileencoding=utf-8
import socket
import urllib

class Response(object):
HEADER_BODY_SPLITTER = "rnrn"

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("rn")]

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.1n"
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.1n"
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()
[/python]

flaskで作ったテストサーバー
[python]
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)
[/python]

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

参考

openstack

先日、思ってもみなかったところでopenstackの話を耳にしました。

ubuntuがeucalyptusからopenstackに移行したのでそのうち試してみようと思ってはいましたが、最近はMac上でpythonでぽにょぽにょしてることが多いので、次のLTSまでいいやと思っていました。
特に自分用だとコマンドラインでKVMちょいちょいしてる程度でお試し用には十分ですし。

でも、リポジトリもあるようなので、追加してちょっとやってみました。
が、LANG=Cしなくちゃいけなかったり、mysqlでキーの長さ制限にひっかかったり。。。

とりあえず、novaうんたらが一通り動いてくれて、euca-add-keypairあたりで止まったのでまた今度・・・。

それにしても、openstackはpython全開なんですね。
tornado、twisted、djangoなどなど。pythonの勉強にちょうどいいかも。

[OpenStack Beginner's Guide for Ubuntu 11.04] – Installation and Configuration « CSS Corp Open Source Services

Openstack Diabloインストール – ブータのArchivelog

pythonで日本語を使う

ずっと、ソースの最初に

[python]
# -*- coding: utf-8 -*-
[/python]

と、書くのが疑問だった。よく言うおまじない

[python]
# coding:utf-8
[/python]

って書いてあるソースもあったりして、何が正しいんだーって思ってた。

そしたら、pythonクックブックの最後の日本語のところに書いてありました。

これは、

u”もじれつ” って書いた場合、

ソースの1行目または2行目に、
正規表現でcoding[:=]s*([-w.]+)として一致したエンコーディングを使って
Unicodeにデコードするよ、

ってことらしい。
また、

[python]
# -*- hogehoge -*-
[/python]

っていうのはEmacsがファイルのエンコーディングとして認識するための形だそうだ。
Emacs使ったことないからわからなかった。
やはり何でも使ってみないとだめね。

ってことは、私の場合は

[python]
# vim: fileencoding=utf-8
[/python]

ってした方がいいってことね!
ありがとうクックブック。

Python クックブックの最後にちょこっとあっただけなので、どうせたいしたこと書いてないだろうって無視してました・・・ごめんなさい。

8.参考 – Pythonで始めるDropboxAPI

 中身は薄いのにむだに長かったですね。
 これだけ書くと、wordpressでは大変で、ためしにMarsEditを使って書いてみました。
 以前にvimで書いて管理できるのを作ったけど、やっぱり画像が絡むとテキストエディタだけだと面倒ですね。画像の挿入、画像の表示、自動アップロード。ここらがあると楽でいいね。ワードみたいなレベルで編集できればなお良いけど、ワードのはき出すhtmlみたいのは勘弁してほしいから、MarsEditは良い選択肢です。
 さて最後は参考URLのリストです。

続きを読む