FlaskでXHR2を試す

XHR2はJSONPと比べてどんなメリットがあるんだろうか?

JSONPで行っている事は、外部のJavascriptを読み込んでいることに他ならず、不用意に利用することは大変危険な行為です。

ProductName 徹底解説 HTML5 APIガイドブック コミュニケーション系API編
小松 健作
秀和システム / 2730円 ( 2010-12 )


まぁ、JSONPはハック色が強いですからね。

というわけで、クロスドメイン間で通信ができるというXHR2を試してみた。

サーバーのコード

ログ見てわかったんだがPOSTメソッドの時はOPTIONSで問い合わせないっぽい。なのでコメントアウトしても動いた。Access-Control-Allow-Originは必須で、コレがないと動かない。

from flask import Flask, make_response, request

app = Flask(__name__)
app.debug = True

#@app.route('/events', methods=['OPTIONS'])
#def view_events():
#   response = make_response()
#   response.headers['Access-Control-Allow-Origin'] = '*'
#   return response

@app.route('/events', methods=['POST'])
def show_events():
   u = request.form['username']
   p = request.form['password']
   response = make_response("user: %s, pass: %s" % (u, p))
   response.headers['Access-Control-Allow-Origin'] = '*'
   return response

if __name__ == '__main__':
   app.run(host='www.kzfmix.com')

クライアントのコード

普通にXMLHttpRequestをnewしてPOSTメソッドでsendする

<!DOCTYPE html>
<html>
<head>
<title>xhr2 test</title>
</head>
<body>
<script>
document.addEventListener("DOMContentLoaded", function(){
 var formData = new FormData();
 formData.append('username', 'myuser');
 formData.append('password', 'mypass');

 var xhr = new XMLHttpRequest();
 xhr.open("POST", "http://www.kzfmix.com:5000/events");
 xhr.send(formData);
 xhr.onerror = function(e) {
   console.log("ERROR");
   console.log(e);
 }

 xhr.onload = function(e) {
   console.log("LOAD");
   console.log(e);
   console.log(xhr.status);
   console.log(xhr.statusText);
   console.log(xhr.responseText);
   alert(xhr.responseText);
 }
}, false);
</script>
</body>
</html>

実行結果

xhr2_test

異なるドメイン(オリジン)間でデータの受け渡しが出来てる

$ python xhr2.py 
 * Running on http://www.kzfmix.com:5000/
 * Restarting with reloader...
124.41.xx.xxx - - [26/Jul/2011 19:23:51] "POST /events HTTP/1.1" 200 -
124.41.xx.xxx - - [26/Jul/2011 19:24:04] "POST /events HTTP/1.1" 200 -

ISO 8601の日付フォーマットをPythonでparseするには

JSONで返ってきた日付フォーマットをPythonでparseするのはちょっとめんどくさい。

tuple_time = time.strptime("2004-06-03T00:44:35", "%Y-%m-%dT%H:%M:%S")

とやる場合にはtimezoneがパースできない。

"2009-06-10T19:00:00+09:00"

こういうやつはダメ。

こういうときにはdateutilを使えばいい。

import dateutil.parser
yourdate = dateutil.parser.parse("2009-06-10T19:00:00+09:00")

参考

Probable cause: too many IN/!= filters in query

GAE/Pythonで。

too many subqueries (max: 30, got 81)

ってことなので、INフィルターには最大30要素までしか入れられない。

リストを30づつに分割して3回クエリを投げて集めるようにしたけど、自動でやってくんないかな。

ProductName プログラミング Google App Engine
Dan Sanderson
オライリージャパン / 3570円 ( 2011-01-24 )


GAE / PythonでURL fetchしたりJSON parseする

JSONのほうはPythonのバージョンを2.6にあげればいいらしいんだけど2.5を使っているのでsimplejsonをGAEプロジェクトの下に配置して

import simplejson as json

ってやる。

URL fetchのほうはGAEで用意されているのでそれを使う

from google.appengine.api import urlfetch

これでjsonを返すweb apiにアクセスしてparseできるので、xooqで同じイベントに登録しているユーザーを探せるようにしておいた。

GAE楽しい。

ProductName プログラミング Google App Engine
Dan Sanderson
オライリージャパン / 3570円 ( 2011-01-24 )


本譲ります的なサイトをGAE+Flaskで作ってみた

昨日作ったものだけど、成果発表をしていないのでこのエントリでしてみたいと思う。

こんな感じのサイトで、認証はTwitterのOAuth、本の管理はbooklogの本棚APIを使ってます。

譲れる本の一覧を表示して、欲しい本があったらreplyしてもらって、手渡しで渡すと。

そんだけ。

まぁ、譲るぜオーラを漂わせるわけではなくて、あくまでイベントのついでに、物々交換的な機能があれば便利なんじゃないかと常々考えてたのでShizuDevつくる会で作ってみたと。

それからGAEも触りたかったしね。

xooqってどっからつけたかというと、はじめに本の交換だからbooxって名づけようと思っていたのだけど、やはりいありがちすぎて既に存在していたので、ひっくり返したらまぁOKだったという(一意性を担保するにはひっくり返せという教えが役に立った)。

前回ちょっと書いて放置してたら半年ほど経過してしまったが、今回みんなで集まったおかげで集中して作業できてよかった。

以下、自分で考えたオススメポイント。

住所バレしない

郵送だと住所書かないといけないのでちょっと嫌ですよね。なので会って渡す、コレ基本。イベントに行くついでにちょっと渡してくるというお手軽感。

Androidのbooklogアプリ便利

読み終わったらAndroidのアプリでスキャンして既読管理しているので、ついでにもう読まないであろう本は「交換してもいい本」カテゴリに入れてしまう、そんだけでOK。パソコン開いて作業しなくてよいので楽ちんですね。

ATNDでどのイベントに参加するかわかるようになってる

とりあえず表示するようにしただけ。やっつけ仕事っぽいがそのうちどうにかする。

pygamessに半経験的分子軌道法を取り込む

AM1とかちょっと使いたかったので使えるようにしたけど、そうするとエネルギーが取り込めなくて困る。

あとイオン化ポテンシャルも取り込みたいのでそこら辺も対応する予定。

ハモンド仮説

論文読んでたらハモンド仮説ってのがあって、あれってなんだったかなとググッたら自分の持ってる本が出てきたので、家に帰ってから読んでみたら、かなり面白かったのでこの本はオススメ。

ProductName 基礎量子化学―軌道概念で化学を考える
友田 修司
東京大学出版会 / 4410円 ( 2007-02 )


メカニズムベースで創薬研究(特に合成)やろうと思ったら量子化学の基本的なところは外せないと思うんだよね。KKDってのはそれを超えたところにあるわけであって、宝くじ買って当てようとすることをセレンディピティとは言わないでしょう。

Flask + GAE + Twitter OAuth

18日にやろっかなーと思っていたのだけど、今日時間があったのでOAuth認証を実装してみた。

ProductName プログラミング Google App Engine
Dan Sanderson
オライリージャパン / 3570円 ( 2011-01-24 )


というわけで、18日はなにしようかなぁ。jQMobileで血圧管理システムをつくってみようか、中断してる文献管理システムの構築再開しようか。

Sphinxにgoogle adsenseとanalyticsを挿入した

Sphinx 逆引き辞典を見ながら。

Jinja2のextendsを使えば簡単に挿入できるのね。

静岡ナビっちRSSを作ってみた

静岡ナビっちにはRSSが用意されてないので自分用に作った。今までは一昔前のポータルっぽくて興味なかったんだけど、「今度行きたい」タグ付けして自分のリストを管理できる機能が気に入ったので使ってみようかなぁと。

あと、食べログは投稿のクオリティーがアレだから参考にならんしなと。ネガティブなコメント多すぎ。

考えてくと、ローカルに集中した(食べログよりも)密度の高い新着情報の提供はなかなか強みを発揮するのかな。ローカルのクーポンサイトも地元のNPOがやればいいんじゃないのか?クーポンシステムだってオープンソースのやつが存在してもいい気がするが。フラッシュマーケだって利益を出すってよりは、確実に顧客に届く広告って考えればいいもんね。

from pyquery import PyQuery as pq
import feedgenerator
from dateutil.zoneinfo import gettz
from datetime import datetime

rss_file = '/myrss/shizunavi_news.rss'

link = 'http://www.shizuoka-navichi.net/shop/?search_news=on'
title = '静岡ナビっち! 新着情報'
tz    = gettz('Asia/Tokyo')
feed = feedgenerator.Rss201rev2Feed(
    title       = title,
    link        = link,
    feed_url    = u'http://www.kzfmix.com/myrss/shizunavi_news.rss',
    description = u'静岡ナビっち! 新着情報の非公式フィード',
    language    = u'ja'
)

shizunavi_abs_url = 'http://www.shizuoka-navichi.net/shop/'

d = pq(url=link)

for item in d('div.box-shop'):
    shop_name = pq(item).find('div.info > h3').text()
    shop_link = pq(item).find('div.info > h3 > a').attr('href')
    guid = shop_link
    shop_abs_url = shizunavi_abs_url + shop_link
    info = pq(item).find('div.info').html()
    pubdate = datetime.now()
    #    print shop_name, shop_link
    feed.add_item(
        title       = shop_name,
        guid        = shop_link,
        link        = shop_abs_url,
        description = info,
        pubdate     = pubdate.replace(tzinfo=tz)
        )

with open(rss_file,'w') as f:
    f.write(feed.writeString('utf-8'))

PythonでPythonを動かす

PyPyじゃなくてsubprocessで。

import subprocess
import sys
args = (sys.executable, "-mSimpleHTTPServer")

print subprocess.call(args) == 0