jQuery Mobileを読んだ

@ishisakaに速攻読み終わるって言われたので、暇な時にでも読むかと積んであったが、読み始めたらさくっと読み終わった。

実際手を動かすところは6章しかなかったし、一通り読めば一通りjQuery Mobileを使えるようになると思う。その後はドキュメント読みながら書いていけばいいのかな。

実際書いてみるとデバッグがめんどくさかったが、テストはQUnit使えばいいのかね?あとSeleniumかなぁ。

jQuery Mobileアプリケーション開発のアプローチ

  1. アプリケーションの施策としてシンプルなページ群を用意します。これがプロタイプの作成につながります。
  2. ページとデータの提供元との間を接続します
  3. 段階的にアプリケーションを改善していきます。結果の表示を修正し、機能を追加し、バグフィックスを行います。

1332235293

jadeで書きなおした6-4のjQuery Mobileで作ったtwitterアプリ

モバイル用のUIをちゃっちゃと用意するのにJQueryを使うのは良い選択肢だと思う。

ProductName jQuery Mobile
Jon Reid
オライリージャパン / 1995円 ( 2011-12-22 )


だ、だ、だんごむしー(コロッコロッ)

久しぶりにジムに行ってガツッと走って帰ってきたら、娘と息子が待ち構えていてダンゴムシ探しに付き合わされた。

1332070449

紫陽花の芽が。春ですな。

1332070446

ダンゴムシを二匹ゲット。

1332070447

虫かごに入れてお持ち帰り(後で逃がす)。

1332070453

ProductName ぼく、だんごむし (かがくのとも傑作集 どきどき・しぜん)
得田 之久
福音館書店 / 945円 ( 2005-04-15 )


jQuery Mobileがなかなか面白い

jadeで書いてる。data-*のカスタム属性で指定すればアイコンなんかも勝手に表示されて、さくっと作るのに向いてそうな感じ。

1332070152

!!! 5
html
  head
    title jqm test
    link(rel="stylesheet", href="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css")
    script(src="http://code.jquery.com/jquery-1.7.1.min.js")
    script(src="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js")
    meta(name="viewport", content="width=device-width, initial-scale=1")
  body
    section#page1(data-role="page")
      header(data-role="header")
        h1 jQuery Mobile
      .content(data-role="content")
        h3 さまざまなアイコン
        div(data-role="controlgroup", data-type="horizontal", data-inline="true")
          a(href="#", data-role="button", data-icon="home", data-iconpos="left") ホーム
          a(href="#", data-role="button", data-icon="gear", data-iconpos="left") 設定
          a(href="#", data-role="button", data-icon="search", data-iconpos="left") 検索
      footer(data-role="footer")
        h1 K'zfm

ProductName jQuery Mobile
Jon Reid
オライリージャパン / 1995円 ( 2011-12-22 )


部屋のレイアウトを変えた

娘が小学生になるので、机をリビングに持ってきて、いろいろレイアウトを変更した。

1332032066

そのせいで、ノートブックをだらだらいじるという自分の居場所が無くなってしまった。特に電源をどこに用意するか悩んでいる。

1332031645

新しいiPod nano

初代がリコール対象だってことを教えてもらったので、早速修理に出したら8GのiPod nanoになって戻ってきた

ProductName Apple iPod nano 8GB シルバー MC525J/A

アップル / 8331円 ( 2010-09-02 )


Pros.

フィットネスっていう機能がついてた。これを買えばいいのか

ProductName Apple Nike + iPod Sensor MA368J/E

アップル / 2004円 ( 2010-08-03 )


Cons.

ホイールが無いので運転中は操作しにくい。

まとめ

暖かくなってきたのでそろそろジムを退会しようかと思っている。 家の周りを走るのになんかいいアプリないかな

AndroidだとJogTrackerになるのかな?

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 )