最近、時間がないながらも定期的に本を読むことができて何とも幸せな感じになってきたのですが、本を読むと困るのが読んだ本を置くところです。
「この本、今度使うかもしれない」と思って取っておくと、どんどん増えていきます。
というわけで、対応策を考えてみます。
pythonで何か書くときは、virtualenv(virtualenvwrapper)環境で、vimでコードを書いています。
書いたコードを実行するのにvimからシェルに戻るのは面倒なので、vimから
そのため、必要なライブラリがなくて実行できず困ってました。
というわけで、検索してみたらすぐに発見
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]
少し時間ができたので久しぶりにredmineとhudsonを更新して・・・え・・!?・・あれ!?・・・hudsonさんクビになってるし! えええ!
というわけで、jenkinsさんに頼むことにしましたので、少しメモ。
「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の話を耳にしました。
ubuntuがeucalyptusからopenstackに移行したのでそのうち試してみようと思ってはいましたが、最近はMac上でpythonでぽにょぽにょしてることが多いので、次のLTSまでいいやと思っていました。
特に自分用だとコマンドラインでKVMちょいちょいしてる程度でお試し用には十分ですし。
でも、リポジトリもあるようなので、追加してちょっとやってみました。
が、LANG=Cしなくちゃいけなかったり、mysqlでキーの長さ制限にひっかかったり。。。
とりあえず、novaうんたらが一通り動いてくれて、euca-add-keypairあたりで止まったのでまた今度・・・。
それにしても、openstackはpython全開なんですね。
tornado、twisted、djangoなどなど。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 クックブックの最後にちょこっとあっただけなので、どうせたいしたこと書いてないだろうって無視してました・・・ごめんなさい。
中身は薄いのにむだに長かったですね。
これだけ書くと、wordpressでは大変で、ためしにMarsEditを使って書いてみました。
以前にvimで書いて管理できるのを作ったけど、やっぱり画像が絡むとテキストエディタだけだと面倒ですね。画像の挿入、画像の表示、自動アップロード。ここらがあると楽でいいね。ワードみたいなレベルで編集できればなお良いけど、ワードのはき出すhtmlみたいのは勘弁してほしいから、MarsEditは良い選択肢です。
さて最後は参考URLのリストです。
ウェブアプリを作りましたが、まだローカルで楽しんでいるだけです。
ナイスなアプリができたら世界の人に向けて公開できるといいですよね。
そこで今回はPaaSのdotcloudにデプロイして公開してみます。
やっとここまで来ましたが、FlaskとDropboxAPIでDropboxフォルダのファイル一覧ページを作ってみましょう。