第1回 Python勉強会@旭川

旭川で初めての開催となるPython勉強会に参加してきました。

勉強会の内容

日時:8月22日(水) 19:00 ~ 20:30
場所:旭川市市民活動交流センター CoCoDe (会議・研修室1) 地図
参加者:7人
詳細は:第1回 Python勉強会@旭川 – connpass

勉強会の内容としては、まずは第1回目ということでみんなで自己紹介。
そのあと、どうやって進めるかを話し合って、まずはPython チュートリアル を最初から読み進めながら、プロジェクタを使って講師役がいくつかコードを打って確認していこう、ということでやってみました。
今回は主催の@waigania13 さんが講師役と言うことで話しながらコード書いたりしてました。 お疲れ様です。

pythonチュートリアルは1年以上前にさらっと触っただけですが、じっくり見てみると色々とちゃんと書いてあることがわかりました。
当時はちょー斜めに読んだのか、見なかったことにしたのか、寝てたのかはわかりませんが、

  • pythonインタプリタで  _ で前回結果使えるとか、
  • “文字列” “文字列” が “文字列文字列”になるとか、
  • forのelseとか、
  • 関数内でのglobalとか、

こんな事も書いてるんだー、って思いました。当時はどっかのブログとかそこらへんを漁っているうちに目にして覚えた気がしますが、チュートリアル万歳です。

今後

今後の勉強会についてですが、

  • 2週間に1度開催
  • なるべく予定範囲は目を通してくる
  • 講師役の人がさらーっと読み進めながら、適度にコード確認
  • 質問などがあればみんなで考えながら進める。

という予定です。

pythonチュートリアルは、pythonさえインストールできれば付属のインタプリタでできちゃいますので、もし旭川(近郊)でpython勉強したいなーと考えている人がいれば是非一緒に勉強しましょー。
pythonに限らずプログラムについて勉強したい人でも大丈夫だと思います。たぶん。

とくに参加者はプログラムを作る人が多いので、学生さんでプログラムに興味のある方がいたら是非是非です。

reStructuredTextでwordpress投稿

wordpressでreStructuredText

wordpressはとっても最高なCMSだけども、reStructuredTextで書けないために使用を断念することも多いかと思います。

そこで、ちょっと探してみたところ WordPreSt reStructuredText Plugin For WordPress ↯ xdissent.com というプラグインがありました。
しかし、残念なことに新しめのwordpressではうまく動かないようです。

そこでちょっといじってみて、とりあえず投稿できるようにはなりました。これもそのプラグインを使って投稿してみました。

しかし山ほど問題が。。。

続きを読む

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

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

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

続きを読む

西松屋を探せ! 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