app-engine-patchでgoogle-app-engine-django-openidを使う
他のところで一度書いたネタなのですが、こっちにも書いておきます。
GAE+Djangoの組み合わせでOpenIDを使ってみようというエントリです。
google-app-engine-django-openid
DjangoでOpenIDを使うときはdjango-openidというそのままのライブラリがあるので、これをpython-openidと組み合わせて使うのですが、django-openidはRDBに設定やらを書き込むのでGAEのdatastoreでは使えません。(たぶん)
そこで使うのが、google-app-engine-django-openidというこれまたそのままのライブラリです。
プロジェクトのサイトは以下ですが、使うにはソースコードをSVNからチェックアウトする必要があります。
http://code.google.com/p/google-app-engine-django-openid/
のSourceをクリックして、
svn checkout http://google-app-engine-django-openid.googlecode.com/svn/trunk/ google-app-engine-django-openid-read-only
なお説明書きを見ると、新しくプロジェクトを作るにはGAE-Helperを使ってね!と書いてあります。が、試してみたところapp-engine-patchでも使えました。
- プロジェクトのルートにopenidディレクトリとopenidgaeディレクトリをコピー
- INSTALLED_APPSにopenidgaeを追加
- プロジェクトのルートにあるurls.pyに適当なURLを追加してopenidgaeのurls.pyをインクルード
これでmanage.py runserverすればlocalhost:8000/openid/loginなどとしてログイン画面が出てくるはずです。なんかかっこいいIDセレクタまでついています。
ログインしている状態で、
import openidgae user = openidgae.get_current_person(request, response)
のようにすればユーザ(Person)オブジェクトが取得できます。自分でメソッドを追加したければopenidgae/views.pyを編集すればよいです。
バグ
そんな感じで試してたら先日書いたバグ(というほどでもない)を見つけました。
POSTで受けとるはずのところでGETを参照しているので、ログイン後のリダイレクト先が常にルートになってしまうため修正。
サンプル
そんなわけでDjango Hack-a-thonの復習もかねて、はてなIDでログインできるイベント管理アプリを作ったので公開します。
イベント日程調整ツール
http://chkfj-gae.appspot.com/event/
google-app-engine-django-openidでログイン後のリダイレクト先を指定する時の注意
SVNから取ってきたリビジョン21の、openidgae/views.pyが1箇所間違っているので修正しないとうまくリダイレクトされない。
openidgae/views.pyの142行目
continueUrl = request.GET.get('continue', '/')
を
continueUrl = request.POST.get('continue','/')
に直しましょう。
あとこのモジュールの説明(http://code.google.com/p/google-app-engine-django-openid/)を見ると、新しく作成する時はGAE Helperを使うと書いてあるけど、app-engine-patchでもopenidとopenidgaeディレクトリをコピーすれば使えました。
Vimperatorでまず覚えたいコマンドとか一覧
id:tohae師からvimperatorの使い方について教えてもらったので、今までに覚えたことをまとめておく。
Vimperatorを消したい
:addoで見慣れたアドオンの一覧が出てきます
基本操作
上下スクロール
j,k
ただしページの読み込みが遅いときはCtrl+D、Ctrl+Uを使う
Ctrl+FでPageUp
Ctrl+BでPageDown
ggでページ先頭へ
Gでページ末尾へ
進む戻る
H,L
- backとか
- forwardとかでも戻れる
ホーム、更新
ghでホーム
rで更新
ルートへ移動
gU
guで1階層上へ移動します。
(2009-05-26追記)
正しくはルートへ移動はgU、1階層上へ移動がguでしたので修正しました。
ブックマークでコメントくださった方ありがとうございます。
タブ切り替え
h,l
b 番号 でもいけるし、gtとgTでも動ける
URLを開く
t URLで新しいタブ
o URLで現在のタブ
O,Tだと現在のURLが最初から入力されている状態になる。
検索もこれでできる。Tabで補完
タブを閉じる
d
Ctrl+wも使えるけど
最近閉じたタブ
uで最後に閉じたタブが復活
U Tabで一覧が見れる
現在見てるページのURLをコピー
y
ページ内検索
/文字列
Nで前へ、nで次へ
ページ内の文字列コピー
全部キーボードでやる場合は
- /文字列でコピーしたいところらへんを検索する
- いったんEscで戻る
- iを押すとキャレットモードになってカーソルがでてくるので始点にjkhlで移動する
- vを押してビジュアルモードになって終点まで選択
- yでコピー
なお、ビジュアルモード中の範囲選択はマウスでもできます。
貼り付け、切り取り
Shift+Insertで貼り付け
Shift+Deleteで切り取り
ソースを表示
gf
Firefox再起動
:restart
Firefox終了
ZQ
.vimperatorrc再読み込み
:source
プラグイン
/home/俺/.vimperator/pluginというディレクトリに入れてる。
(2009.05.18追記)ここにまとまっているのでそれを利用します。
http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk
appendAnchor.js
ttp://とかでリンクになってないやつもfで選択できるようになる
char-hints-mod2.js
fで番号が出るけど、それをアルファベットにできる。昔はデフォルトでアルファベットだったとかなんとか
direct_bookmark.js
はてブとかdeliciousに追加できる
タグの補完もきく
feedSomeKeys_2.js
GoogleReaderとかGmailのキー操作がうまいこといくようになる
maine_coon.js
コマンドラインが必要な時だけ表示されるようになる
sbmcommentsviewer.js
ブコメが見れる
グループ化した中から各々の最新のレコードだけを取り出す
create table 商品( 商品CD char(10) not null, 商品名 varchar(100) not null, primary key(商品CD)); create table 価格( ID int(10) unsigned auto_increment not null, 商品CD char(10) not null, 単価 int(10) unsigned not null, 日時 datetime not null, primary key(ID)); select * from 価格 where 商品CD="GA08455500"\G *************************** 1. row *************************** ID: 96 商品CD: GA08455500 単価: 84990 日時: 2009-04-21 11:11:25 *************************** 2. row *************************** ID: 1850 商品CD: GA08455500 単価: 74990 日時: 2009-04-22 19:40:18 *************************** 3. row *************************** ID: 2166 商品CD: GA08455500 単価: 69990 日時: 2009-05-09 04:00:39 3 rows in set (0.00 sec)
みたいなテーブルがあって、商品CDごとに最新の単価を抽出したい場合、
select * from 価格 p where id=(select max(ID) from 価格 where p.商品CD=商品CD);
とかしたらいいかというと、これが無茶苦茶遅くて、
価格テーブルの件数2219件(うちユニークな商品CDが2084件)で8秒ほどかかった。
MySQLのバージョンは5.0.67、エンジンはMyISAM。
次に、
select * from 価格 where (商品CD,日時) in (select 商品CD,max(日時) from 価格 group by 商品CD);
としたら、もっと遅くなってしまい結局
select * from 価格 where 商品CD="*****" order by date desc limit 1
みたいなクエリを投げて、1つずつ商品に価格を後付けするのが50商品くらいでは一番速かった。
Ubuntu8.10でUSB-WSIMを使うためにカーネルを再構築したメモ
USB-WSIMというのはWillcomのW-SIMを挿すことでナローバンドUSBモデムとして使える画期的なデバイスですが、
Linuxとかよく分かってないので基本的な部分も含めて、手順をメモ。
まずカーネルのバージョンを確認、自分は2.6.27-11-genericと出ました。
uname -r
ソースを入れる
sudo apt-get install linux-source-2.6.27
rootになる
sudo su -
/usr/src/にソースのアーカイブがあるので移動、展開
cd /usr/src tar xvlf linux-source-2.6.27.tar.bz2
カーネルの設定ファイルを.configとしてコピー
cd linux-source-2.6.27 cp /boot/config-2.6.27-11-generic .config
コンパイルに必要なパッケージをインストールする。
build-essentialとlibncurses5-devはTritonnをコンパイルする時に必要だったので、自分はkernel-packageだけ入れた
apt-get install build-essential libncurses5-dev kernel-package
drivers/usb/serial/pl2303.h
と
drivers/usb/serial/pl2303.c
をテキストエディタで編集、内容については
http://city.hokkai.or.jp/~hachikun/USB-WSIMlinux.html
にある通りにした。編集箇所はどちらも割と上の方。
編集したカーネルソースをコンパイルする。かなり時間がかかるのでその間に風呂に入るなどできる。
make-kpkg clean make-kpkg --initrd --revision=1.0uw kernel_image
しばらく待つとlinux-image-2.6.27.10_1.0uw_i386.debなどというファイルが出来てるのでインストール
dpkg -i linux-image-2.6.27.10_1.0uw_i386.deb
再起動
geno_watcher
http://twitter.com/geno_watcher
GENOで気になる商品をreplyで教えてあげると監視して、変化があると教えてくれます。