pyVows - Vows for Python

最近CoffeeScriptで書くときにはvowsを使っていてるが、Emacsを左右に分割して、左にコード、右にテストのBDDが快適すぎて癖になっている。

BDD Emacs

Pythonで書くときはnoseを使っているのだけど、最近pyVowsを見つけたので、これを使ってみようかなとドキュメントを読んでみた。

pyvowsのverbosityオプションがvを増やすということに気付かかなくて、詳しい表示どうすんの?ってなった。デフォルトのvvくらいだと頑張った気がしないのでvvvくらいがいいかも。

アサーションは種類が色々あるし、カスタムのアサーションもVows.create_assertionsデコレータで簡単にかけるし、構造が一致するかとかSMILESが正しいかとかのchemoinformatics用のカスタムアサーションがかけそうなので生産性が上がっていい。

hamlish-jinjaからpyjadeに移行しようと考えている

このブログはJadeを使いたかったという経緯からhamlish-jinjaを使っているんだけど、pyjadeが出来てたので両方で書いてみた。

左がjadeで右がhamilish

haml+jade

jadeはhamlishと違って%とか-みたいな記号がいらなくて、Node.jsのjadeと同じように書けるし、Jinjaのタグも自然な感じで直感的にかけるので、やっぱJadeのほうが好みかな。

ただ、url_forでsingle quoteとdouble quoteの使い分けではまった。

a.title(href="{{ url_for('show_entries', entry=entry.perma, _external=True) }}")

はダメで

a.title(href='{{ url_for("show_entries", entry=entry.perma, _external=True) }}')

はオッケー

追記 12.02.18

pyjadeに移行したがurl_forにidって文字列が入ってるとうまくparseできないっていうバグでちょっとはまった。

flask-debugtoolbarが便利

うまく動かなかったのでflask-scriptとflask-sqlalchemyを入れたらちゃんと動くようになった。

Flaskのバージョン、応答時間、HTTPヘッダ、リクエスト変数、テンプレートやSQLAlchemyやロギング情報がツールバーに表示されるようになる。

flask-debugtoolbar

何もよりもツールバーが出ているとapp.DEBUGがTrueになっていることが明確なので本番稼働の際にfalseし忘れがない。

Pygameでゲーム作りを楽しむ本

Pythonの入門としていい感じですね。ライセンスがCreative Commons Attribution-Noncommercial-Share Alike 3.0 でオンラインでも読めるし、pdfでダウンロードすることも出来て素敵です。

暇をつくって、これをCoffeeScript+Canvasで書いてみたいと思う。

もうひとつのほうのInvent with PythonもPythonの入門書としていいかもしれない。今度、入門書を尋ねられたらこれを薦めてみようっと。

parseできない浮動小数点のJSON表記

やたらとこけるJSONを出力する商用のツールを追いかけていたら、浮動小数点の表記に問題があった。1.e-2っていうのはJSON的にはmalformed numberなんだろうか?

Perl

use strict;
use warnings;
use JSON;

print decode_json('{"num": 1.e-2}')->{'num'};

実行

$ perl jsontest.pl 
malformed number (no digits after decimal point), at character offset 10 (before "e-2}") at jsontest.pl line 5.

Python

>>> import json
>>> json.loads('{"num":1.0e-2}')
{u'num': 0.01}
>>> json.loads('{"num":1e-2}')
{u'num': 0.01}
>>> json.loads('{"num":1.e-2}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 8 (char 8)

Traktor Pro2のnml形式のプレイリストをPythonで処理する

TraktorからExportされる.nmlファイルはXMLなのでElementTreeを使えばいい。

from xml.etree.ElementTree import *
elem = parse("liquid.nml").getroot()

for e in elem.findall(".//ENTRY"):
    if e.get("TITLE") is not None:
        print "    %s / %s" % (e.get("TITLE"),e.get("ARTIST"))

/Users/####/Documents/Native Instruments/Traktor 2.X.Xの履歴ファイルを変換すればプレイリストが出力される。

Traktor LEには履歴を保存する機能はなかったので、それだけでもアップグレードする価値は十分にある。

ProductName Native Instruments TRAKTOR PRO 2

Native Instruments / 22340円 ( )


Pythonで Google Tasks API を使う

Todo管理にはGoogle Tasksを使っている。家でも職場でもタスクを追加できて一元管理できるので便利なんだけど CUIでもできたらもっと便利だろうとAPIを触ってみている。

家では普通にDeveloper's Guideの通りに動くんだが、職場のプロキシが超えられないので調べてみたらoauth2client.toolsのrunがダメらしい。

さらに追っかけてみるとflow.step2_exchange(code)のところの第二引数にproxyを設定したhttpを渡さないからこけていた。

run関数使わなければいいじゃんってことで書きなおした。ついでにFLAGも必要なくなった。

import httplib2
from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow, FlowExchangeError

FLOW = OAuth2WebServerFlow(
  client_id='####',
  client_secret='####',
  scope='https://www.googleapis.com/auth/tasks',
  user_agent='gtask-client/1.0')

storage = Storage('tasks.dat')
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  authorize_url = FLOW.step1_get_authorize_url('oob')
  print 'Go to the following link in your browser:'
  print
  print '    ' + authorize_url
  print
  code = None
  code = raw_input('Enter verification code: ').strip()
  try:
    http = httplib2.Http(proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, '####', 8080))
    credential = FLOW.step2_exchange(code, http)
  except FlowExchangeError, e:
    sys.exit('Authentication has failed: %s' % e)
  storage.put(credential)
  credential.set_store(storage)  
  credentials = credential

http = httplib2.Http(proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, '####', 8080))
http = credentials.authorize(http)

service = build(serviceName='tasks', version='v1', http=http,
                developerKey='####')

tasklists = service.tasklists().list().execute()

for tasklist in tasklists['items']:
  print tasklist['title']

Pythonで正負のfloat numberを揃えるフォーマット

Pythonに限らないと思うんだが、%のうしろにスペース入れると正の数の場合にはスペースが挿入される

print "%-2d %-3s % 4.3f" % (a.GetIdx(), a.GetType(), a.GetPartialCharge())

pygamessの結果を整形したかったのです。

1  C3  -0.015
2  Nam -0.305
3  C3   0.006
4  C2   0.287
5  O3  -0.250

忘れるとなかなか思い出さないのでメモ

openbabel-2.3.1が出てますね。

2.3.1がリリースされたようです。

個人的に興味があるのは

  • PNG files from Open Babel contain molecular information and can be read to give the MDL Molfile.
  • Pybel now uses the built-in 2D depiction, and no longer needs OASA.

とABINITのフォーマットに対応したあたりかな。

あと、openbabel-python.iをいじってたので、ここをいじった場合のコンパイルのオプションをメモっておく。swigが有効になるようにしないといけないのに気付かなくてハマった。

cmake ../openbabel-2.3.1 -DPYTHON_BINDINGS=ON -DEIGEN2_INCLUDE_DIR=/usr/local/tmp/eigen-eigen-2.0.12 -DRUN_SWIG=ON

OBGenericからOBOrbitalDataへのキャストをできるようにして、vectorの設定もしたので、手元のpythonバインディングでは

orb = toOrbitalData(mol.GetData(openbabel.ElectronicData))
orb.GetAlphaOrbitals()[orb.GetAlphaHOMO()-1].GetEnergy()

とやるとHOMOのエネルギー(eV)を得られるようになっている。

追記12.01.28

homebrewでいれたpythonで使いたい場合optionで指示する

$ cmake ../openbabel-2.3.1 -DPYTHON_BINDINGS=ON \
  -DPYTHON_LIBRARY=/usr/local/lib/libpython2.7.dylib -DPYTHON_EXECUTABLE=/usr/local/bin/python \
  -DEIGEN2_INCLUDE_DIR=/Users/kzfm/openbabel/eigen-eigen-2.0.17 -DRUN_SWIG=ON

moin2の16の特徴の中から気になったもの

MoinMoin 2.0のビッグニュースに16個あげられていたんだが気になったものを

Sphinx-based docs

Sphinxベースのドキュメントになって読みやすい。でもmake pdflatexはこけた

Storage Layers: stores, backends, middlewares

ストレージにファイルだけではなくsqlalchemyで使えるRDBやKyoto Cabinetなんかも使える。

Tree based transformations

これに惹かれた

input -> converter -> DOM tree -> converter -> output

という変換経路をたどるのでフォーマットの変換ができる。つまりwikiのコンテンツを好きなフォーマットで取り出せるので、特にReSTで取り出してSphinxにもっていけるようになるのでデータの再利用がしやすそう。

GUI editor update and different approach

ckeditorが使える。WYSIWYGはイントラのサービスでは必須。

Themeing with Jinja2 templating engine

Flask-Themesを使っているので、自分用のテーマを作ってみる予定

Packaging

virtualenvのおかげで、環境を汚さずすむので便利。あとquickinstallスクリプトがインストールの面倒をほぼすべて見てくれるので超楽チン