1.OpenStack
今年の前半はOpenStackについて勉強していこうと思っています。
ubuntu12.04がでたら触ろうと思ってたんですが、その前に別件で勉強しようという話があって色々触っているところです。
2.関数型言語
触ったことないので、haskellとかerlangとかそういうの。
「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を触ってからは「ああ、ここの処理を良きに計らってくれているのね」ということがわかるようになった気がします。
さて。今年最後の投稿になります。
今年はpythonで遊んだ1年になりましたが、非常に面白い年でした。
というわけで、今年の最後はpythonで作ったものをひとつ。
ワンクリックでインストールできて動作できればいいんですが、全然そうはいかないのが残念。
しかし、python、virtualenv、Flask、SQLite3、twitter-bootstrap、jquery、とかそこらへんを絡めてますので、これからpython+Flaskで何かを作りたいなーと思っている方の参考になればいいかなーと思います。
まー。@mitsuhikoさまのgithubを覗くのが一番参考になるけどね。
ではよいおとしを!
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
クラスの型からクラスインスタンスを生成したかったのだけど、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の日記
pythonで何か書くときは、virtualenv(virtualenvwrapper)環境で、vimでコードを書いています。
書いたコードを実行するのにvimからシェルに戻るのは面倒なので、vimから
そのため、必要なライブラリがなくて実行できず困ってました。
というわけで、検索してみたらすぐに発見
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から。
「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章とか巻末あたりに書いてそうだけど、まだ読んでないのでまた今度。
最近のコメント