2012年振り返りエントリ
インターネットの人とたくさん会った
Django で唐揚げ作った
この記事は 2012 Pythonアドベントカレンダー 11日目の記事です。
Django で美味しい唐揚げとか作れたら #python_adv のネタになるのに Django では美味しい唐揚げを作れない。これだから Django は…
— ねじめ (@drillbits) December 5, 2012
作りました
唐揚げです。
PyPI にはあげてないので github から pip install してください。
$ pip install git+git://github.com/drillbits/django-karaage.git#egg=django-karaage
Django の settings.py にミドルウェアとして追加します。
MIDDLEWARE_CLASSES = ( # 略 "django_karaage.middleware.KaraageMiddleware", )
生成したページすべてに唐揚げができます。
Before
After
よかったですね。
settings.py に KARAAGE_IMAGE_URL を指定するとお好みの唐揚げにもできます。
KARAAGE_IMAGE_URL = "http://ka.raa.ge/whatyoulike.jpg"
How To Karaage
Django のミドルウェアは view が response オブジェクトを返したところをフックできるので、そこで response.content に karaage.js をぶちこんでいるだけです。
karaage.js のなかでは jQuery を読み込んで、あとは Jimmy Wales のパクリをやってます。
せっかくなので
Cookpad にも載せました。
http://cookpad.com/recipe/2055269
つくれぽお待ちしております。
追記 2012/12/12 16:55
削除されたので楽天レシピにしておきました。
http://recipe.rakuten.co.jp/recipe/1330005112/
なんかいつのまにか消されてました。
Python mini hack-a-thon 夏山合宿 で書いた jQuery Plugin
を Github にあげるなどした。
縦置きのメニューにマウスオーバーするとビャッとサブメニュー的なものがスライドアウトする感じのやつです。
政治的な理由でソース本体に日本語でもっさりコメント書いてあります。
https://github.com/drillbits/jquery.boxvertmegamenu
デモは Github Pages です。
似たようなものは探したのですが、最新版の jQuery で動かなかったりなんか色々あって作ることになりました。以下のような動きをします。
- メニューのうちのどれか(メニューアイテム)に mouseover すると、子要素のボックス(サブメニュー)が右側にスライドアウトして出てくる
- そのときのサブメニューの縦幅は子要素の大きさに関係なく、メニューの縦幅と同じになる
- 上下の別のメニューアイテムに mouseover すると、子要素は切り替わるがサブメニュー自体はスライドインしない
- メニューとサブメニューから mouseout したときにはじめてサブメニューがスライドインする
最後のやつがイベントでうまく処理できなくて、結局メニュー+サブメニューの範囲の座標から外れたらスライドイン、みたいなことをしてます。つらい。
この jQuery Plugin は当初 Bitbucket T シャツを着て書かれていましたが、長野が涼しかったため、その上に Github パーカーを羽織った状態で書かれました。
Python mini hack-a-thon 夏山合宿
長野、涼しくて快適でした
buildout で Pyramid のテストコマンドを作る
前回までのあらすじ
buildout を使って Pyramid の環境を構築したねじだが、朝方剥いた桃がすごい速さで変色していくのにびっくりした。
Pyramid でのテストの実行
チュートリアルにあるように、setup.py test とか nose でテストができる。
これを buildout 使った場合はどうやるのかと思ったら、zc.buildout.eggs に nose とか追加するのじゃなくて、pbp.recipe.noserunner というレシピがあるらしい。
というのに @aodag 先生の公開してる papyrus の buildout.cfg を見て気づきました。なのでパクります。
bin/test コマンドの作成
buildout.cfg に以下のセクションを追加します。parts への追記も忘れずに。
[test] recipe = pbp.recipe.noserunner eggs = coverage kusaba defaults = src/kusaba --with-doctest --cover-package=kusaba --cover-erase --with-coverage
${kusaba:eggs} という変数は [kusaba] セクションに別れてないとできないっぽいです。しかし [pyramid] セクションと一緒にしないとパス通らないのよね…
ともあれ、これで bin/buildout すれば bin/test コマンドができますよ。実行するとこんな感じです。
$ bin/test . Name Stmts Miss Cover Missing ----------------------------------------------------------- kusaba 11 7 36% 9-15 kusaba.models 14 0 100% kusaba.scripts 0 0 100% kusaba.scripts.initializedb 22 14 36% 19-22, 25-35 kusaba.views 11 2 82% 15-16 ----------------------------------------------------------- TOTAL 58 23 60% ---------------------------------------------------------------------- Ran 1 test in 1.560s OK
ウヒョー
buildout を使って Pyramid な環境を構築してみた
あらすじ
ひさびさに行った液Py読書会が buildout だったし、せっかくなのでねじは Pyramid で何か作るついでに試してみようと思いました。
調べながら紆余曲折してたのそのままメモしていくので、おかしいところあったら東京湾に沈めてください。
ちなみに今回作るアプリケーションの名前は `kusaba` です。VirtualBox 上の Ubuntu 12.04 で作業してます。Python のインストール等はPythonプロフェッショナルプログラミングっていう本に書いてあるから5冊くらい買って参考にするといいですよ。
参考
なにはともあれ virtualenv
なんかあとになってからいらないかもと思いましたが、いつも使ってるので!いつも使ってるので!
$ mkvirtualenv kusaba (kusaba)$
以降 (kusaba) は省略して書いていきます。
buildout 環境の作成
まず作業用ディレクトリをば。
$ cd ~/ $ mkdir kusaba $ cd kusaba
bootstrap.py を取得して実行。`-d` は distribute を使うアレです。
$ wget "http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py"
$ python bootstrap.py -d init
ここで大量に
warning: foobar: byte-compiling is disabled, skipping.
やら
warning: no files found matching '*.txt'
やら
Download error on http://example.com: timed out -- Some packages may not be found!
やら出ますがひとまず放置してます。気になって自主的に調べた人は先生怒らないから正直に教えて下さい。
依存パッケージは、ここで作成される eggs ディレクトリに全部はいります。site-packages には入らないので、なんていうか virtualenv いらないですね…
使用する Python のバージョンも bootstrap.py init したときのやつになるっぽいです。ためしに virtualenv 環境でわざわざ /usr/bin/python2.7 bootstrap.py init とかやったら、bin/py の一行目はちゃんと #!/usr/bin/python2.7 になってました。
Pyramid をインストール
buildout.cfg を以下のように編集して、
[buildout] parts = pyramid [pyramid] recipe = zc.recipe.egg interpreter = py eggs = pyramid
環境をビルドします。
$ bin/build Uninstalling py. Installing pyramid. Generated script '/home/drillbits/kusaba/bin/ptweens'. Generated script '/home/drillbits/kusaba/bin/proutes'. Generated script '/home/drillbits/kusaba/bin/pshell'. Generated script '/home/drillbits/kusaba/bin/prequest'. Generated script '/home/drillbits/kusaba/bin/pviews'. Generated script '/home/drillbits/kusaba/bin/bfg2pyramid'. Generated script '/home/drillbits/kusaba/bin/pcreate'. Generated script '/home/drillbits/kusaba/bin/pserve'. Generated interpreter '/home/drillbits/kusaba/bin/py'.
Pyramid の依存パッケージが eggs に入るほか、pip でやると ~/.virtualenv/kusaba/bin に入るコマンドが buildout 環境の bin 配下に入ります。
* Pyramid プロジェクトの作成
チュートリアルを参考にして作ります。virtualenv だと pcreate って打てばよかったコマンドが buildout 環境の bin/pcreate だったりするだけです*1。
src というディレクトリを切って、その中に Pyramid プロジェクト `kusaba` を作ることにしました。
$ mkdir src $ cd src $ ../bin/pcreate -s alchemy kusaba
階層潜ったので ../bin です。本来ならここで setup.py develop ですが、読書会で清水川先生が「buildout はとにかく setup.py を叩いてくれる」と仰ってたので、そっちでやってみます。
[buildout] parts = pyramid kusaba develop = src/kusaba [pyramid] recipe = zc.recipe.egg interpreter = py eggs = pyramid [kusaba] recipe = zc.recipe.egg interpreter = py eggs = kusaba
ビルドしまう。
$ cd ../ $ bin/buildout : Generated script '/home/drillbits/kusaba/bin/initialize_kusaba_db'. :
DBの初期化コマンドも無事できました。ところでこれちゃんと setup.py develop なんですかね。 setup.py install だったりしないですかね。
Pyramid アプリケーションの起動
ここもチュートリアルに従います。まずはDBの初期化。
$ bin/initialize_kusaba_db src/kusaba/development.ini
そして起動!
$ bin/pserve src/kusaba/development.ini Traceback (most recent call last): File "bin/pserve", line 23, in <module> sys.exit(pyramid.scripts.pserve.main()) : File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve raise DistributionNotFound(req) pkg_resources.DistributionNotFound: waitress
はいきた。エラーきました。
waitress 自体は eggs にあるのですが、どうも bin/pserve がパスを通してないっぽい…
のでとりあえず buildout.cfg の pyramid セクションに追加。
# 前略 [pyramid] recipe = zc.recipe.egg interpreter = py eggs = pyramid waitress # 後略
再びるど。
$ bin/buildout : $ bin/pserve src/kusaba/development.ini Traceback (most recent call last): File "bin/pserve", line 23, in <module> sys.exit(pyramid.scripts.pserve.main()) : File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve raise DistributionNotFound(req) pkg_resources.DistributionNotFound: kusaba
…
どうやら同じセクションにないといけないっぽいので kusaba セクションを削除して pyramid セクションと統合。
[buildout] parts = pyramid develop = src/kusaba [pyramid] recipe = zc.recipe.egg interpreter = py eggs = pyramid waitress kusaba
ふたたびるど。
$ bin/buildout : $ bin/pserve src/kusaba/development.ini Starting server in PID 15162. serving on http://0.0.0.0:6532
ウォァァァァァァ動いたようです。
とはいえ依存の書き方とかこれでいいのかいまいち謎なのでニントモカントモな感じはしますね…
あと setup.py test とかでやるテストはどうやるんだろう。
*1:チュートリアルよく見たらこっちも bin/pcreate とかしてますね…でもどのディレクトリに移動しても bin/コマンド になってるしよくわかんないです。
はてなブログはじめました
from id:okadapan
ねむい