トリガーで変更した値を反映させるには、flush()+invalidate()

stormの話。

def invalidate(self, obj=None):

Set an object or all objects to be invalidated.

This prevents Storm from returning the cached object without first verifying that the object is still available in the database.

This should almost never be called by application code; it is only necessary if it is possible that an object has disappeared through some mechanism that Storm was unable to detect, like direct SQL statements within the current transaction that bypassed the ORM layer. The Store automatically invalidates all cached objects on transaction boundaries.

http://twistedmatrix.com/users/radix/storm-api/storm.store.Store.html#invalidate

これだけじゃ、ダメで、

    store.flush()
    store.invalidate()

とした後で使わないと、データベースとstorm.storeの同期が取れていない状況になる。

トリガーでバリバリとStormの知らないところでデータを変更していると、わかりにくいエラーになってしまう。

ちなみに、更新後にstore.commit()を発行していればこういう問題は起きない。

ユニットテストでロールバックしながら繰り返しテストしていてはまった。

SQLAlchemyでも同じだよなあ。後で調べる。

Stormの方が

SQLAlchemy http://www.sqlalchemy.org/

新しいプロジェクトのモデルをSQLAlchemyで書いてみようかとやってみたけれど、難しくて、なかなか理解が進まない。

ドキュメントは豊富だし、きっちり感があるし、ちゃんと理解できればいいんだけれど。

いろいろ調べてみたけれど、PostgreSQLのスキーマの取り扱いがどうもちょっと変な気がする。使い方が悪いのか、調べ方が悪いのか目先の問題を解くためには、もっと多くの知識が必要な感じ。

で、

Storm https://storm.canonical.com/

Stormでやってみたら、ほぼ同様のことがあっさりできた。


Clean and lightweight API offers a short learning curve and long-term maintainability.

こっちにするかあ。ドキュメントは事実上チュートリアルだけ。でもまあなんとかなる。

SQLAlchemyのMetaData.reflect()相当をどうしようかと探したら、こんなのが見つかった。

https://lists.ubuntu.com/archives/storm/2008-March/000521.html

これは助かる。Viewをテーブル同様に扱うので、少し困ったけれど何でもないね。

ドキュメントが少ないのが気になるけれど、このぐらいのサイズのライブラリならなんとか読めそうな気もする。

排他的でもないから、SQLAlchemyの学習もしながら、基本的にはStormを使うという感じで行ってみようか。

mtimeの修正はos.utime

/bin/touchと同じことをするos.touch()があるかとリファレンスを探しても見つからず。
結局、os.utime()だとわかるまでに10分ほどかかった。
Googleではノイズだらけで全然ダメだし。

関係ないけれど、前からきになってはいたんだけれど、 ja.pastebin.ca のページがたくさんヒットする。
僕の環境ではこのサイトを表示すると、Firefoxがクラッシュしてしまう。
特定のサイトを検索結果から取り除くFirefox Add-Onとかないかなあ、探してみよう。
…あっという間に見つかった。CustomizeGoogle

Ubuntu 8.10 Intrepid

開発環境用にUbuntu 8.10 Desktopを入れてみた。最近はCentOSばかり使っているから、かってが違っていろいろ悩む。

Python2.5が標準なんだな。少し悩んだ。sitecustomize.pyを書いて、/usr/lib/python2.5/site-packagesに置いても、読んでくれない。なんでかなあと、あ、/etc/python2.5/sitecustomize.pyがあった。ここに書けばOK。Ubuntuでは、/usr/lib/python2.5/site.pyが標準配布物とは変更されている模様。

あ、profileもない。python-profileというパッケージをインストール。python-allをインストールすればいいのかな。python-all-devというのもあるな。C-extensionを入れるには必要みたい。

お、sshdも動いていないのか。

お、vnc接続が簡単(設定-リモートデスクトップ)。

Bashシェルスクリプトで自分の絶対パスを取得

2011.8.25追記:

そりゃあありますよね。ターゲットのプラットフォームで標準で使えるようならば可読性も高いしこちらの方がよいと思います。

僕はこれから作るものはたぶんreadlinkに乗り換えます。masaruyokoi様ありがとうございました。

コメントで教えていただきました。

masaruyokoi on 2011年8月25日(木曜日) at 12:06 said
readlink -f や -e を使うと良いですよ。
Debian や FreeBSD では realpath というコマンドもあります。

以下はオリジナルエントリです。

シェルスクリプトで自分の絶対パスを知る方法はこんな方法しかないんだろうか?

#!/bin/sh
D=`dirname $0`
echo `cd $D;pwd`

Pythonだとしょっちゅう書いてるアレ。

#!/usr/bin/env/ python
from os import path
print(path.abspath(path.dirname(__file__)))

お、こういう書き方があるのか。

#!/bin/sh
echo $(cd $(dirname $0);pwd)

Python2.6は2.5よりもけっこう速いし、-OOはけっこう効く

web.pyで作った単純なWEBサイトをunittestを使ってテストしていて気づいた。

1000個のユニークURLへアクセスするテストを3回繰り返した結果の平均

(2.6=2.6.1、2.5=2.5.4 on CentOS5.2)

  • 2.6は約6%、2.5よりも速かった。
  • 2.5でも2.6でも、-OOオプションを付けて起動すると約8%速くなった。
  • 2.5(-OO無し)と2.6(-OO有り)では約12%、2.6の方が速かった。