Flaskが面倒くさくなる時

最近Flaskでユーザーのロールを実装する必要があってさすがにちょっと面倒くさくなってきた。

Blueprintはまぁ許せるけど、フォームとモデルの連携とかフォームバリデーションとか大きくなればなるほど、フルスタックのほうがやりやすいよなーと。

しかしながら、そもそもFlaskに揺れた経緯がフルスタックなフレームワークのキャッチアップ辛いという反省からだったので、なんか一周した気もする。

ちなみにその当時使っていたCatalystは未だにperl5.8.8 + Catalyst5.7014で動かしている(自前プラグインとかの関係)。そして、そもそも同僚はMVCちゃんと理解してない(オブジェクト指向プログラミングすらあやしい)レベルで使っているので見事なスパゲッティPerl風味が出来上がっているw

結局中身が理解できた上でのフルスタックじゃないと辛いよなぁ。と思いながらRoRにするかDjangoにするか揺れ動いている。

Django

メリット

  • Python
  • Chemoinfomaticsのツールを色々載せられる
  • AZのデザイントラッカーはDjango製

デメリット

  • 職場でOSQAくらいしかDjango製ツールがない
  • スキルが役にたつのかわからん

RoR

メリット

  • Fastladder, Redmineを動かしている
  • RoR使いはモテるんでしょ?

デメリット

  • いまさらRoRを覚えても…
  • Chemoinformaticsのツールがないのでいまいち
  • バージョンで結構ハマる感じ?

という感じ。まぁ両方覚えるのがいいんだろうけどはじめての Django アプリ作成をやってみたら、Djangoいいじゃんみたいな気持ちになった。

RedmineのDjangoクローンがあればいいのに

ggplot2のPython実装ができてた

pandasを使い始めてから、「Rのメリットってggplot2だけだよなー」と思っているんだけどggplotが実用的になったら、もうPythonでやりたいことは完結するよなーと思った。

ちなみにちょっと動かそうとしたけど、動かなかったので、GitHubの画像を載せておく。

plot

あとでコードリーディングする。

ProductName グラフィックスのためのRプログラミング
H. ウィッカム
丸善出版 / 4200円 ( 2012-02-29 )


11/16にShizuoka.py #3をやります

巳年だからという理由ではじめたShizuoka.pyも3回目となりました。単発か二回目でフェードするのかな?と思いつつ意外に発表者の層が厚くて毎回楽しくやっております。僕も、PyConで発表するきっかけを得られてよかった感があります。

実は静岡おでんをまともに食したことがないので懇親会は静岡おでんのお店をチョイスすることになっています。尚、ちえちゃんというお店がディープらしいのだけど、深夜一時開店らしいのでお泊り必須ですねw

おでん

発表者募集中です。connpassにコメント入れるか、@fmkz___にtweetしてください。今のところ

  • Seleniumでクローラをつくる話(kzfm)
  • Pythonでつぶやき解析(oec014)
  • Flask+EC2(oec014)

あたりが仮演題です。

三島でPythonを主力言語に変更しつつあるというあの会社からもなんか発表してくれないかなーとか思っていますが如何でしょうか?

個人的にはDjangoの話とか聞きたい。最近Railsいじっているのだけど、フルスタック覚えるならどっちがいいのかなぁと(Yesod一択だろという声も聞こえないわけではないが…w)

バルのお店の前に定形文をtweetできるようなQRコードを用意しておいてくれないかなぁ

前回に三島バルに参加した時にも感じたんだけど酒のんで街歩きしてるのにtweetとか難易度高すぎなので、QRコードでチェックインみたいなノリでtweetするようにしてくれんかなーと。

こんなに簡単だよ? pythonだったらこんだけでQRコードを出力できる☆

# -*- coding: utf-8 -*-
import qrencode
import urllib
url = "http://blog.kzfmix.com/entry/1380714052"
text = "QRコードでバルのお店にチェクイン的なtweetできると嬉しいなぁ #三島バル "
tweet_template = "http://twitter.com/share?url={}&text={}&via=fmkz___"
qrencode.encode_scaled(tweet_template.format(url, urllib.quote(text)), 200)[2].save("mishima_bar.png")

あとはQRコード読み取ればtweetできるで。

qr

ユーザーのメリットは

  • いちいちフリック入力しなくて良い

バル側のメリットは

  • (一定以上のtwitterユーザーがいれば)トレーサブルなデータが得られるはず

FlaskでリアルタイムWebアプリが作れるようになって素晴らしい

Flask-Socketsを入れればWebSocketが使えるようになって素敵です☆

早速echoサーバーを作ってみた。

Flask-Sockets

テスト環境構築

mkvirtualenv flask_sockets
mkdir echo_server
cd echo_server/
pip install Flask
pip install Flask-Sockets
pip install gunicorn

コードはこんな感じ

.
├── app.py
└── templates
    └── hello.html

app.py

from flask import Flask, render_template
from flask_sockets import Sockets

app = Flask(__name__)
sockets = Sockets(app)

@sockets.route('/echo')
def echo_socket(ws):
    while True:
        message = ws.receive()
        ws.send(message)

@app.route('/')
def hello():
    return render_template('hello.html')

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

templates/hello.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1>Flaskでechoサーバー☆</h1>
  <input type="text" id="msg" value="_(:3 」∠)_"/>
  <button id="sendBtn">send</button>
  <ul id="rcv"></ul>
</body>
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script>
  $(function(){
  var host = "ws://localhost:8000/echo";
  var socket = new WebSocket(host);

  socket.onmessage = function(message){
    $("#rcv").append("<li>" + message.data + "</li>")
    console.log(message.data);
  }

  $("#sendBtn").on("click",function(){
    message = $("#msg").val()
    socket.send(message);
  });
  })
</script>
</html>

動かすのはgunicornを使う

gunicorn -k flask_sockets.worker app:app

でlocalhost:8000にアクセスすればok

PyCon APAC 2013で発表した結果

YAPCのスピーカーすごいす!、PyConのスピーカーすごいす!と参加者側でずっと過ごしてたけど、今回初めて発表するので、少しは皆さんの心に残るようなお話が出来たらいいなぁと思っています。PyCon APAC 2013で発表することになった

slideshareも10000views超えたし、はてブもそこそこ付いたし、ブログのフィードバックもいただけたし、少しはお役にたったのかなと安堵している。

改めてPyCon APAC 2013のスタッフと参加者の皆様、楽しい時間を有難うございました。

椅子ネタは思い浮かばなかった…

seleniumのphantomjsでuser-agent を変更する

googleにchromeとして認識して欲しかったので調べた

dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap["phantomjs.page.settings.userAgent"] = (
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
    )
driver = webdriver.PhantomJS(desired_capabilities=dcap)

XPathの書き方も慣れてきた☆

TypeError: must be string or read-only character buffer, not instancemethod

pythonのSOAPクライアントであるsudsを使ってSOAPしていたら、返ってくるデータが巨大すぎて、ファイルに吐いて眺めたくなったので

with open(file, "w") as f:
  f.write(soap_result)

をしたら表題のエラーが出た。

with open(file, "w") as f:
  f.write(str(soap_result))

ってやらないといけなかった。

Python+Selenium+PhantomJSが快適すぎる

Selenium便利なんだけど、ブラウザ立ちあげないといけないのはサーバーで使いにくくて不便だよなと思っていたのだけどPhantomJS使えることを知ったので早速遊んでた。なにやりたいかというとGoogle Patent Searchから特許ID抜き出したいのだけど、Python+Selenium+PhantomJSの組み合わせでできることがわかった。

from selenium import webdriver
import time
driver = webdriver.PhantomJS()
driver.get("https://www.google.co.jp/webhp?hl=ja&tab=ww&authuser=0#authuser=0&hl=ja&q=python")
print driver.current_url
time.sleep(2)
driver.save_screenshot("screen_shot130918.png")
driver.quit()

screen_shot

requestsっぽいcurl

pythonでhttpアクセスする時には定番のrequestsだけど、プロキシー通してhttpsアクセスさせると400のステータスエラーが出てどうしようもないというトラブルに見舞われた。

あーpycurlかー、面倒くさいなーと思いつつ調べたらhuman_curlというパッケージを見つけた。

import human_curl as requests # python-requests.org compatibile

ってやるとrequestsで書いてたコードがそのまま動いてちゃんとアクセスできるようになるので素敵☆