kay-openid

http://bitbucket.org/chkfj/kay-openid/


GoogleDeveloperDay2009のハッカソンで作ったので、ソースコードを公開します。
GoogleAppEngine/PythonフレームワークKayで、OpenIDを利用できるようになるアプリケーションです。
中身はgoogle-app-engine-django-openidのopenidgaeをKayで動くように書き換えたもので、使い方も同じです。

app-engine-patchでgoogle-app-engine-django-openidを使う

他のところで一度書いたネタなのですが、こっちにも書いておきます。
GAE+Djangoの組み合わせでOpenIDを使ってみようというエントリです。

google-app-engine-django-openid

DjangoOpenIDを使うときはdjango-openidというそのままのライブラリがあるので、これをpython-openidと組み合わせて使うのですが、django-openidRDBに設定やらを書き込むので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を参照しているので、ログイン後のリダイレクト先が常にルートになってしまうため修正。


http://d.hatena.ne.jp/juno_c/20090521/1242890299

サンプル

そんなわけで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

リンクを開く

fで番号がでるのでそいつを入力
Fだと新しいウィンドウで開きます

フォームにフォーカスを当てるのもこれでできるけど、walk_inputというプラグインを入れるとM+iでもできる

ページ内検索

/文字列
Nで前へ、nで次へ

ページ内の文字列コピー

全部キーボードでやる場合は

  1. /文字列でコピーしたいところらへんを検索する
  2. いったんEscで戻る
  3. iを押すとキャレットモードになってカーソルがでてくるので始点にjkhlで移動する
  4. vを押してビジュアルモードになって終点まで選択
  5. 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

twitter.js

Twitterのタイムラインを見たり、POSTしたりできる

appendAnchor.js

ttp://とかでリンクになってないやつもfで選択できるようになる

char-hints-mod2.js

fで番号が出るけど、それをアルファベットにできる。昔はデフォルトでアルファベットだったとかなんとか

direct_bookmark.js

はてブとかdeliciousに追加できる
タグの補完もきく

ldrize_cooperation.js

LDRizeのjkとぶつからないようになる

feedSomeKeys_2.js

GoogleReaderとかGmailのキー操作がうまいこといくようになる

maine_coon.js

コマンドラインが必要な時だけ表示されるようになる

ime_controller.js

コマンドモードになったときに自動的にIMEがオフになる

sbmcommentsviewer.js

ブコメが見れる

.vimperatorrc

/home/俺/.vimperatorrc

人のをコピペすると早いです


また覚えたら追記しますね。

グループ化した中から各々の最新のレコードだけを取り出す

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というのはWillcomW-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

再起動