pygamess+pybelで構造最適化計算

昨日は製薬業界の集まりがあって、他社のヒトと少し話す機会があって、LBDDどういう感じですかねと言われて、量子化学計算に真面目に取り組んでますよーっていう話から、ケミストは電子吸引基とか供与基とか言う割に計算して確かめようとしないんですよねー(そうですよねー)っていう流れになったので、そちらのケミストは計算するんですかねー?って聞いたら、するヒトはするし、しないヒトはしないっていう答えが返ってきた。想定通り。

もう少し知りたいのは、ちゃんと計算するケミストは、結局ただの計算マニアで結局普通のヒトなのか、それとも論理的で優秀な傾向が強いのか?ということかな。

さて、pygamessをpybelに対応させたので、より簡潔に書けるようになった。

>>> from pygamess import Gamess
>>> import pybel
>>> g = Gamess()
>>> g.run_type('optimize')
>>> mol = pybel.readstring('smi','C')
>>> mol.make3D()
>>> optimized_mol = g.run(mol)
>>> optimized_mol.energy
-37.0895866208

やっぱコンストラクタに引数をわたせるようにするべきだよなぁ。

ProductName 初めてのPython 第3版
Mark Lutz
オライリージャパン / 4830円 ( 2009-02-26 )


量子化学計算したいならこれかな。

FlaskでOpenIDを使う

Flask-OpenIDのサンプルアプリを Flask-SQLAlchemyPyJadeを使って書きなおしてみた。

ディレクトリ構造

$ tree
.
├── app.py
└── templates
    ├── create_profile.jade
    ├── index.jade
    ├── layout.jade
    └── login.jade

app.py

 import os
from flask import Flask, request, session, g, \
    redirect, url_for, abort, render_template, flash, jsonify
from flaskext.openid import OpenID
from flaskext.sqlalchemy import SQLAlchemy

DEBUG = True
SECRET_KEY = 'openidsample'
databese_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'oidsample.db')
SQLALCHEMY_DATABASE_URI = 'sqlite:///%s' % databese_file

app = Flask(__name__)
app.config.from_object(__name__)
app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension')
db = SQLAlchemy(app)
oid = OpenID(app, os.path.join(os.path.dirname(__file__), 'openid'))

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60))
    email = db.Column(db.String(200))
    openid = db.Column(db.String(200))

    def __init__(self, name, email, openid):
        self.name = name
        self.email = email
        self.openid = openid

@app.before_request
def lookup_current_user():
    g.user = None
    if 'openid' in session:
        g.user = User.query.filter_by(openid=session['openid']).first()

@app.route('/')
def show_index():
    return render_template('index.jade')

@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
    if g.user is not None:
        return redirect(oid.get_next_url())
    if request.method == 'POST':
        openid = request.form.get('openid')
        if openid:
            return oid.try_login(openid, ask_for=['email', 'fullname', 'nickname'])
    return render_template('login.jade', next=oid.get_next_url(),
                           error=oid.fetch_error())

@oid.after_login
def create_or_login(resp):
    session['openid'] = resp.identity_url
    user = User.query.filter_by(openid=resp.identity_url).first()
    if user is not None:
        flash(u'Successfully signed in')
        g.user = user
        return redirect(oid.get_next_url())
    return redirect(url_for('create_profile', next=oid.get_next_url(),
                            name=resp.fullname or resp.nickname,
                            email=resp.email))

@app.route('/create-profile', methods=['GET', 'POST'])
def create_profile():
    if g.user is not None or 'openid' not in session:
        return redirect(url_for('index'))
    if request.method == 'POST':
        name = request.form['name']
        email = request.form['email']
        if not name:
            flash(u'Error: you have to provide a name')
        elif '@' not in email:
            flash(u'Error: you have to enter a valid email address')
        else:
            flash(u'Profile successfully created')
            db.session.add(User(name, email, session['openid']))
            db.session.commit()
            return redirect(oid.get_next_url())
    return render_template('create_profile.jade', next_url=oid.get_next_url())

@app.route('/logout')
def logout():
    session.pop('openid', None)
    flash(u'You were signed out')
    return redirect(oid.get_next_url())

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

layout.jade

bootstrap2をちょっと使いまわした。

!!! 5
html.no-js(lang='en')
  head
    title openid sample
  body
  .container
    block body

index.jade

extends "layout.jade"
block body
    if g.user
    h1 you are logged in as {{ g.user.name }}
    p
      a(href="{{ url_for('logout') }}") Logout
  else
    h1
      a(href="{{ url_for('login') }}") Login

login.jade

Flask-OpenIDのサンプルをhtml2jadeで変換した。

extends "layout.jade"
block body
  h2 Sign in
  form(action='', method='post')
    | {% if error %}
    p.error
      strong Error:
      | {{ error }}
    | {% endif %}
    p
      | OpenID:
      input(type='text', name='openid', size='30')
      input(type='submit', value='Sign in')
      input(type='hidden', name='next', value='{{ next }}')

create_profile.jade

Flask-OpenIDのサンプルをhtml2jadeで変換した。

extends "layout.jade"
block body
  h2 Create Profile
  p
    | Hey!  This is the first time you signed in on this website.  In
    | order to proceed we need a couple of more information from you:
    form(action='', method='post')
      dl
        dt
          | Name:
          dd
            input(type='text', name='name', size='30', value="{{ request.values.name }}")
            dt
              | E-Mail:
              dd
                input(type='text', name='email', size='30', value="{{ request.values.email }}")
      p
        input(type='submit', value='Create profile')
        input(type='hidden', name='next', value="{{ next }}")
    p If you don't want to proceed, you can a(href="{{ url_for('logout')}}") sign out again.

データベースを初期化するのに

>>> from app import db
>>> db.create_all()

と叩く必要がある。

ポケモン+ノブナガの野望

息子が「あそんでみたいねー」って言うので、「いいねー!でもパパお金ないよ?」って言っておいた。

こっちでもいいような気もするが

Ace - Sinatra for Node

Spineの作者製なのでCoffeeScriptで書けていい感じっぽいんだけど、Expressと比べてどうなんだろうか。 少し触ってみないとそこらへんがよくわからん。

この本は面白かった。

ProductName JavaScript Web Applications
Alex Maccaw
Oreilly & Associates Inc / 3020円 ( 2011-08-30 )


ちなみに今はExpress+nowjsっていう組み合わせでイントラサイトを作っているけど、調子いいのでなかなか気に入っている。

再来月に二回目の三島バルがあるらしいので、それまでにつくる会が開ければExpressかAceでこんなの作ってみようかなぁと思っている(自分のために)。多分俺のバルっていうタイトルのサイトで、酒を飲んでふらふらしながら自分探しの旅をするっていう設定のリアルタイムウェブなサイトにしようかなぁと。

写真の本をまとめて読んでいる。

「何が良い写真なのか」わかるためには、良い写真をよく見続けることしかないんだろうなぁと。

何がよいドラムンベースか理解するためにはドラムンベースの名曲を聴きまくり、何が良い酒か知るためには、良い日本酒を飲みまくると。

ともかくカッコイイ写真が撮りたい!

いろいろ勉強になった。初心者向けとしてはわかりやすくていい。

ProductName ともかくカッコイイ写真が撮りたい!
橘田 龍馬
MdN / 1890円 ( 2010-01-22 )


Re:Cute Photographer おしゃれな写真が撮れる本

構図とかよくみていた。面白い。

ProductName Re:Cute Photographer おしゃれな写真が撮れる本
森山 遊子
翔泳社 / 1764円 ( 2009-05-14 )


Dog Photographer かわいい犬の写真が撮れる本

うちの犬を練習に使おうと思った。

ProductName Dog Photographer かわいい犬の写真が撮れる本
かくた みほ
翔泳社 / 1659円 ( 2009-06-18 )


レンズが欲しい

本を買うのを2ヶ月ほど自粛すればこのレンズが買える。

が、こっちのほうが欲しいかもしれん。

Rクックブック

Rは普段からバリバリ使うわけでなくて、たまに必要に迫られて集中して使うという感じなので、データの前処理なんかはperlやpython使ってしまうので、こまかいところがなかなか覚えられない。

ProductName Rクックブック
Paul Teetor
オライリージャパン / 2940円 ( 2011-12-22 )


こっちは職場用に買った。

ProductName R言語逆引きハンドブック
石田基広
シーアンドアール研究所 / 4830円 ( 2012-01-26 )


ProductName グラフィックスのためのRプログラミング―ggplot2入門
H.ウィッカム
シュプリンガー・ジャパン株式会社 / 4200円 ( 2011-07-18 )


ベランダ菜園用にガーデンレタスミックス

夕方暇だったので、ベランダ菜園も始動。

1331542097

園芸用の土も買ってきたので、あとでラディッシュも植える。

田ぶしのにぼとんが旨い

太麺で噛みごたえがあってうまかった。

1331541889

今日の畑(120312)

ちょっと風邪の余韻が残っていて、鼻をかみながらの作業ではあったが、今日を逃すとまた雨で潰れそうだったのでジャガイモの植え付けをした。

第4期開始。

1331529469

4期目の心構えとしては

  • 雑草をむやみやたらと抜かない。根を残して草刈鎌で刈るか、できるだけ共生っぽく。
  • 少量多品種を心がけて同じ品種ばかり作らない。葉物も怖がらないでチャレンジする。
  • できるだけ苗屋さんで購入して、コツを仕入れる(コツコツと)
  • ソーシャルな家庭菜園管理システムをGAE上につくる

今年はきたあかりをつくってみることにした(去年は紅あかり)。

1331529457

去年は深く埋めすぎた気がするので、畝も浅めにしてみた。

1331529467

スナップエンドウも一冬越して、だんだん育ってきたので来月あたりには収穫できそう

1331529460

ニンニクも順調なので今年も結構とれそうだ。

1331529462

浅葱もそこそこ大きくなってきたので収穫しといた。今回の株分けで相当な量になりそうなので、秋の植え替えの時に少しプランターに移すかニラみたいに端っこに並べて植えるようにするか考えないといけない。

1331529464