initializedb.py

initialize_Xxx_db.exeとかであれしますねDBの初期化とか。

 ../Scripts/initialize_Xxx_db development.ini

みたいな。
これどこでセットアップするテーブルの一覧見てんのかなーというと、
Xxx/xxx/scripts/initializedb.py
でした。

うちの環境は

models/
  models.py
  users.py

こうです。scaffoldのmodels.pyがそのまま生存しているのでなんか紛らわしい。よくない。よくないお。

で、件のinitializedb.pyのなかでモデル取り出してるところがあったのでー

from ..models.models import (
    DBSession,
    Base,
    )
from ..models import (
    models, users
    )

こんなふう。

#備考:
#あたしんちはmodelsディレクトリ切ってその中にモデルのファイルを入れています。
#なのでmodels/__init__pyにこんなふう。

# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

Scaffoldで先人の知恵を学ぶ

SQLAlchemy(+MongoDB)+Jinja2(Genshi)
この組み合わせはあるだろう。Github眺めたら実際あった。
あたしが当面やりたいことがRapidGizaで解決してる。
とおもいきや既にgithub死んでました。いい名前なのに。
PythonのWAF周辺のライブラリ名は結構好きです。ピラミッド、アルケミー、フラスコ、クフ、エリクサーなんてのもあったな。こういう妖しい単語大好き。
はい。

App/app/scripts/initializedb.py:

- from .models.models import (
+ from ..models.models import (

modelをmodelsディレクトリに移動してまとめたので書き換え。
そのままルートにばらまいてる人はそのままでおk
あんま小分けにしても使いづらいのかなあ。みんなディレクトリ切って小分けにしてしまっちゃいました。

models/
lib/
scripts/
tests/
web/
  templates/
  views/
  static/
    css/
    js/
    img/
__init__.py
const.py

こんな按配です。
ディレクトリの配置やconst.pyなどについては、shazow / pyramid_scaffolds_decoupledさんやグローバル定数@rm -rf /さんを参考にしました。

コレにともなってapp/__init__.pyの中がちょっと書き換わりますね。

config.add_static_view('static', 'web/static', cache_max_age=3600)

config.scan('.web.views') # views
config.scan('.lib')

Pylonsでいうところのhelperをどっかに置きたい。libを切ればいいか。
PyConJP2012で、Pyramidにはhelperない云々、WebHelperとかそういうの使ってくださいという話を聞き、にわかに情緒不安定になり、言いつつも実はPylonsっぽいhelperの使い方もします、みたいな、なんだか狐につままれたような話を聞いてきたばっかりなのであります。
h.hoge()とかしたくない?したいよねえ。

あんまり意識していなかったんですが、Pyramidっていうのはメタフレームワークなのかな。土台あるんで好きに(俺俺フレームワークを)構築してノウハウ貯めこんだりしちゃってくださいよというような。
なんかFlask意識したっぽい「1ファイルで動く代物書けちゃう!」みたいなデモはする必要ないよね。1ファイルで済むようなもの作りたければ普通Flaskとか使う。
#学習コスト云々といった理由は除く

ともあれ、構成とか落ち着いたらScaffoldの作成にも手を出してみたい。
この機能はステキだ。

○○言語は生産性が高い

記事がなにを狙ってるのかよくわからない。
次の主流は「関数型」 覆る言語選定の常識
図●関数型プログラミング言語の利点と技術的な特徴
開発の生産性を高めやすい、バグを抑止しやすい、性能を向上しやすいといった利点がある

日経っぽいなあと思ったらほんとにそうだったワロス

Javaとかphpとかは下の方でHaskellとかがだいたい上の方という、もう何回それ繰り返すんだよ図だ。

単に学習コストが高くて、頭いい人が飛びつく言語が上の方にきてるだけじゃないのかなー。
優秀な人しか界隈に居ないから生産性が高いんだよ。
たぶんHaskellとか使う人たちがJavaでもの作れば同じように生産性と品質が高いんじゃないのかね。

あたしの生産性は低いのでもっとどうでもいいです。

ルート直下にviews.pyとか散らかしたくない

#pcreate -s alchemy Hoge で作ったプロジェクトを例にしています
App/app/views/views.py
とかしたい。

__init__.py

config.scan('.views')

このようにせいと、マニュアルに書いてある
この「.views」ってなんじゃ。ドットから始まるディレクトリ掘るというのはいささか悪趣味に感じるんだけど。

views掘ってみる。__init__.py置く。views.pyをそこに格納。
これだけだと

ImportError: No module named models

なんてerror吐かれて、あたしゃビューの面倒見てんのになんでモデルがしゃしゃり出てくるんだと奇妙な感じ。
なんだろうなあとviews.pyを眺めて、はたと膝を打つ。

from .models import (
    DBSession,
    MyModel,
    )

これだ。

from ..models import (
    DBSession,
    MyModel,
    )

こうする。微妙すぎてあれだけど、「.models」→「..models」になってる。
いつのバージョンだかからこういう指定の仕方できるようになったんですみたいな話を聞いていたのが救いになった。
で、件の「.views」も同じことだったわけかーと納得した次第です。
カレントディレクトリの下のviewsをscanするから「.views」なのねー。

あー。modelのスクリプトもmodels/models.pyとかにしたい場合は、views.pyでのモデルの場所指定も変わるね。

MakoじゃなくてJinja2使いたい

Pyramidのわだいです。

“.mak” または “.mako” で終わるテンプレートファイル名は Mako レンダラー に送られます。
“.html”のような他の拡張子が使いたければ、 main 関数に これを入れてください:
config.add_renderer(“.html”, “pyramid.mako_templating.renderer_factory”)
引用元

で、こういうののjinja2はどうしたらいいのか探してましたのよ。
pyramid.mako_templating.renderer_factory
これはなーに?どういう決まりでこれになってんの。分からない。
あたしはMakoを使うつもりがない。いいテンプレートエンジンなのは知ってる。少し。あたしの好みはJinja2でありGenshiなので、Jinja2が動いてくれないと嫌なのです。
#Genshiはちょっと気難しい子なので最近は避けてます(-_-;

Jinja2のテンプレートを食わせるまではうまく行った。
がしかし、拡張子「.jinja2」が非常に気に入らない。長いしダサいしそもそも数字がついてるのが非常に駄目だ。
あたしゃテンプレートの拡張子.htmlじゃなきゃ嫌なんだよ。
でもなんだか、中のほうで拡張子ごとにゴニョゴニョしている箇所があるらしく、テンプレートファイルとしてhoge.jinja2を単純にhoge.htmlとしてもうまくいかない。

あちこちさまよった結果、

config.add_renderer(".html", "pyramid_jinja2.renderer_factory")

__init__.pyでこうしてやるとうまくいった。.htmlでも食べるようになる。やった。
そもそもこの文字列はどこで見つけたのかというと、site-packagesのpyramid_jinja2見に行って、configure.zcmlつう怪しいファイルの中に書いてあるのを発見したという次第。
見つけ方合ってるのかわかりませんが解決したからいいんだ。

まとめ

当然のこととしてjinja2とpyramid_jinja2はいれとく

development.ini:

[app:main]に追記
jinja2.directories = %(here)s/{アプリ}/templates

pyramid.includesに追記
pyramid_jinja2

アプリ直下の__init__.py:

config = Configurator(settings=settings)
config.include('pyramid_jinja2')
config.add_renderer(".html", "pyramid_jinja2.renderer_factory")

まだ「リソースとビュー」の考えかたは染みこんできてない。
モデルよりフレームワークの仕掛けより、あたしはまず好みのテンプレートエンジンが動かないと気分的に落ち着かず、ただでさえ少ない集中力が減退する構造になっているんです。
というところがすっきりして、ひじょーに、こう、いいですね。
すっきりしました少し。

Pyramidにはコントローラがない

絶対どこかで議論されたはず。混乱する人があたしだけ、なんてわけない。
そう、そんなわけはなかった。

「私は MVC ウェブフレームワークのユーザですが、混乱しています。 Pyramid はコントローラーをビューと呼んでいます! そして コントローラーがありません。」
引用元

これ。そしれこの文章自体が、Pyramid公式に載っているのをまんま引用したもの。
MVCがWebの仕事を正確に表現できてると思わないので、「リソースとビュー」というもので表現することにしましたと書いてある。
ええええ。

  • リソースツリーはサイト構造を表わします。
  • ビューは リソースを示します。
  • テンプレートは実際には単に任意のビューの実装詳細です
  • ビューは、レスポンスを返すためにテンプレートを必要としません。
  • 「コントローラー」は、ありません
  • 「モデル」は、 リソースツリー、またはフレームワークと完全に分離した「ドメインモデル」 (SQLAlchemy モデルのような) によって表わされます。

なんだそれは。
なんなんだそれは。
道理で、あたしの理解がまっったく進まないわけだ。
Pyramid使い始めてみたものの全然分からなくて、ああもうあたしのお脳の理解力の限界はここなのかお粗末な話だなこんちくしょう、って思ってたわけです。
10年近くくらいはMVCMVCって言われてきたんでないですか、Webの世界って。それがここにきて考え方を変えましょうときたわけで、そりゃ混乱するよねと。
リソースとビュー。
リソースとビューですよ奥さん。

config.add_route('home', '/')

こんなんやってる箇所が地図作ってるわけだな。
ツリー構造のurlマップみたいなのがリソースの地図になっていて、リソースそのものがビュー。
テンプレートは実装詳細です。そうですか。必ずしもテンプレートが必要なわけではないとあるあたりが理解の鍵なのかしらん。

モデルはフレームワークの格にあるんじゃなくて外側なんだと。そうなの、データって外側に位置するの。ちょっとイメージが出来てないですが、一旦そういうもんだと覚えることにする。
MVCのMに当たるのがーとか変換して考えちゃうから苦しむんであって、これはパラダイムが変わって別物が出てきたんですよというくらいで捉えるほうがよさそうです。

#あたしのお脳はまだついてきてません

Pyramidのプロジェクトをさくっと作る

自分用メモ
各位ご存知のことかと存じますが、あたしはお脳のメモリ容量、アクセス速度共に石器時代あたりの人でありますので、pyramidのセットアップ一つをするりとやっつけるのにすらあちこちで転んでおりました。
わかってみると道理の通った手順なのですが、わかるまでが遠い。「何のためにこれやってんの」「どこに書いてあるの」「これやるとどうなるの」「いつおわるの(´・ω・`)」と不安になり腕が震え膝が体を支えられなくなり冷や汗が額を流れ落ちエトセトラ。
で、もうめんどくさいからこういうのを書いとけばいいんだよ。
#batファイルとして書いてるのでバックスラッシュです一部

:: pyramidstart.bat
@echo off
IF "%1" == "" (
    echo "pyramidstart env(virtualenv) project(pyramid)"
) else (
    virtualenv %1
    cd %1
    Scripts\activate
    pcreate -t alchemy %2
    cd %2
    pip install jinja2
    pip install pyramid_jinja2
    pip install -e .
    setup.py test -q
    \Scripts\initialize_%2_db development.ini
    echo "plz type: pserve development.ini --reload"
)

jinja2は入れただけなのでじつは

pyramid.includes =
    pyramid_jinja2

こういうのを(たぶん)書き加えてあげる必要があるんですが、さしあたりざくっと「Welcome to Hoge」画面を出すには足ります。
virtualenvの環境名fooenv
pyramidのプロジェクト名Foo
のばあい

pyramidstart fooenv Foo

とやると。

PyConJPにいってきた

「つながるPython」がメインテーマ。
#なにとつながったのかはよく分からなかった。

収穫は本当にたくさんあって、

  • 8月中に申し込んでたのでTシャツもらえた
  • さらに余ってたのでもう一枚買った
  • PyConJP2012のロゴが入ったシールもらえた
  • Python3に移行しないと遅れちゃうかなあという不安はしばらく忘れてよい

みたいな。
あたし的な目玉はPyramidです。Pyramidのセッションがあるから見に行ったという方が正しいか。ずーっと長いことPylonsをこねくり回してアレコレやろうと画策してきたあたしのためのセッション群と言えました。
また、個人的には(違和感があって)使わないDjangoのセッションもたくさん。スケジュールの都合上見られなかったセッションも色々。
いくつか見ましたがとくに

この方々のセッションはとくに興味深く、楽しく効くことが出来ました。まさに珠玉。
everesさんはWebフレームワークパネルというプログラムでDjango代表として喋っておられました。なんかもう切り返しとかいちいち見事で、話が上手な方だなーと感心することしきり。
Ianさん、hirokikyさんはDjango、aodagさんはPyramidの話をそれぞれ。
Pylonsとか追っかけてたらaodagさんの書き物には必ずお世話になるので、あたしにとっては神様です。
いやー見に行ってよかった。改めてちゃんとPyramidやってみよう・Pylonsからの移行を考えてみようと思える内容でした。
あたしはテストをないがしろにするクズだったので、清水川さんのセッションは大変に勉強になりました。テストちゃんと書こう。Ianさんの言ってたpdb?も使おう。

前にも感じた自分への宿題

「私はこれこれを{作っている/メンテしている/書いている}人です」
と言える材料がないと、ほんとなんだかただ見て帰る感じになっちゃうなーということでした。

ミス

初日にノートPCもってったんですけどね。
このノートかなり放置してたので前日にUbuntuのアップデートをガーっとやったんです。
切ってたUnityが復活。キーボードレイアウトの選択ミスって日本語打てない。もうやだ。
重かったせいもあって、二日目は持ち歩かないことにしました。ないわほんと。

もう一個。ミスっていうミスじゃないんだけど集合写真で最前列真ん中にするするっとたどり着いちゃって、そのまま撮影されちゃった……。お前誰だ感というか場違い感というか、ひどい。
ポジショニングには気をつけたいですね。

PyConJPに行くのです

いつかpythonで仕事する日が来たらなあと思いながらphp書いてます。
php書いてるというのも怪しくてExcelのお守りというのが事実に近い感じ。
さて。

去年だったか、品川の楽天タワーで開催されたPyConJP-miniにお手伝いで混ざりにいったアレのminiじゃないやつが開催です。
PyConJP
どのセッション見ようかなとか全然なんにも考えてなかったので、あわてて開催プログラムを眺めとります。もう前日だよ。

個人的キモ

  • aodagさんのPylamid
  • 北神Noiseさん
  • 清水川さん
  • Ianさん

あたり。日程の都合上aodagさんと北神さんが被っているのが厳しいなー。

9/15のおおまかな腹づもり
09:45 – 10:45 基調講演
11:00 – 11:45 うーん
11:45 – 13:30 昼休み
13:30 – 14:15 452(併設2) aodagさん
14:30 – 15:15 433(日本語2)(14:55-15:20) 清水川さん
15:30 – 16:15 
433(日本語2) unittest嫌いがunittestをtesting
357(併設1)パネルディスカッション:Google App Engine を選ぶ理由
どっちか
16:30 – 17:15 452(併設2) Django-Celeryで非同期処理
17:30 – 18:30 230(日本語1) ライトニングトーク

9/16のおおまかな腹づもり
Flaskハンズオンが楽しそうすぎる悩む
10:00 – 10:45 452(併設2) Pylons ユーザのための Pyramid 移行ガイド
11:00 – 11:45
452(併設2) Django Lessons Learned @BeProud
357(日本語3) Pythonを取り巻く開発環境
どっちか
11:45 – 14:00 昼休み
14:00 – 15:00 433(日本語2) 基調講演: Dan Kogai
15:15 – 16:00 433(日本語2) Python3でここまでできるWebプログラミング
16:00 – 16:45 Tea Break
16:45 – 17:30 433(日本語2) 
ミニ四駆で Python on Windows Azure
17:10 ソーシャルゲームとメッセージキュー (till 17:35)
17:45 – 18:30 433(日本語2) Webフレームワークパネル (till 18:45)

友達できたらいいなー

i読書

i読書
Androidでもあるのかどうかは知らないけど、i読書なるiPhoneアプリを入れました。iPhoneあぷりとはいってもiPadなんかでも使えるようなのでアレですけど。

普段、行き帰りの電車などでは本を読んだり2chのまとめサイト眺めたりしています。
座れれば本も読めるのだけど立ってるとスペースの関係上そうもいかない。
加えて、電波状況が非常に悪い界隈というのが数箇所あって、Webの記事を眺めるのでも不便が多いのが現状です。
で、これだ。
青空文庫の書籍をダウンロードしておいて見られるというのは別段目新しいことではないんですが、ヨメが太宰好きでありまして、すでに紙の本2冊持っているのに「青空文庫のアプリで85円だったからアプリ買っちゃったー」とか言ってんのもう見てらんない。
見てられるか否かはともかく、そうか青空文庫という手があったかということでAppStoreを眺めた結果、掲題のi読書をインストロールしたという次第です。
蔵書数がコレほどまでになっているとは知りませんで、かたっぱしから書籍をダウンロードして読んでます。
子供の頃から気になってた(けど買う強い動機ときっかけを失っていた)阿Q正伝とか、北大路魯山人のいろんなのとか。
坂口安吾の文章があんなに面白いもんだとは知らなかった。
織田信長がすごい面白かった。さんざん良い感じに話が進んでいった挙句「未完」とかなんの冗談かとは思いましたが。
つうわけで、しばらくのあいだは通勤時間の楽しみはこれになりそうです。

富田倫生さん、あなたのおかげで、こんな便利な時代になりました。

※青空文庫についてみたいなことはいまさら書かない。