2011年4月14日木曜日

括弧抜け

cms/templates/admin/cms/page/change_form.html
52: .notfilled{
53:     color: #808080 !important;
54: }
django-cms-2.1.3

本家に投げときました。

2011年4月12日火曜日

amazonの出荷が遅い

「amazonの出荷が遅い」そのまんまですがな。
4月5日に入金済みの商品早く出荷してくれんかな。
つまらないプロモーションメール送ってくる暇があったら。

なんで遅れているかといったら、

「現在当サイトでは、震災の影響により、商品の出荷処理に通常よりもお時間をいただいております。」

だそうだ。ほんまか!
挙句の果てに

この商品は配送準備に入っているため、キャンセルや変更はできません。返品についてはこちらをご覧ください。

だそうだ。在庫があるのに配送準備に何年かかるねーん! キャンセルして他所に注文も出来やしない。

追伸:
と書き込んだ直後に「ご注文の発送」メールが来た。監視されているぞ、これは。

さらに追伸:
お預かり店 アマ堺店
だそうだ。堺の倉庫も地震でずいぶん揺れたらしい。ほんまに長いことゆれてますなーあ。一ヶ月も揺れているとは。

さらにさらに追伸:
嫁に言わせると、「堺の倉庫」って、大阪府堺市じゃあなっくて宮城県にあったんじゃない?だとさ。

2011年4月8日金曜日

python-dateutil

'No module named _thread'と出たら、ここからpython-dateutilを取り込み、インストール。
pipでインストールすると上が出る。

python-dateutil-2.0.tar.gz (Python >= 3.0)
python-dateutil-1.5.tar.gz (Python < 3.0)

2011年2月18日金曜日

既存の関数に後からデコレート

django-axesでやっていたのでメモ
admin.site.loginに定義したwatch_loginをくっつける。middlewareの初期化でやっちゃう。

class FailedLoginMiddleware(object):

    def __init__(self, *args, **kwargs):
        super(FailedLoginMiddleware, self).__init__(*args, **kwargs)

        # watch the admin login page
        admin.site.login = watch_login(admin.site.login)

        # and the regular auth login page
        auth_views.login = watch_login(auth_views.login)

Djangoのadminのurlsは

django.admin.site.urls -> django.admin.site.get_urls

urlpatterns = patterns('',
    url(r'^$', wrap(self.index), name='index'),
    url(r'^logout/$', wrap(self.logout), name='logout'),
    url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
    url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), name='password_change_done'),
    url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
    url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', 'django.views.defaults.shortcut'),
    url(r'^(?P<app_label>\w+)/$', wrap(self.app_index), name='app_list')
)

    urlpatterns += patterns('',
        url(r'^%s/%s/' % (model._meta.app_label, model._meta.module_name), include(model_admin.urls))
    )
 

2011年2月17日木曜日

wxPythonでGUI調査

import wx.lib.inspection

app = wx.App()
frame = wx.Frame(None, -1, u'Frame')
frame.Show(True)
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()

2011年2月16日水曜日

ファイル名一括変更

rename 's/.htm/.html/' *.htm
 
後方参照も使えるぞ
01hogehoge.mp3 -> 01-01 
rename 's/([0-9][0-9]).*\./01-$1\./' -v *.mp3
 

2011年2月15日火曜日

wxPythonをソースからインストール

本家はこちら
wxWidgetsのクラスをpythonに晒して、蛇に「窓使い」をさせるもの。
思ってたより簡単だった。のでメモ。
wxWidgetsは既にソースコードからビルドインストールしてあるので割愛。
ソースのtarボールを取ってきて展開。その下の、wxPythonディレクトリのsetup.pyでやっつけられる。

ちゃんとやろうとすれば、wxWidgetsのcurrent stable soruceも付いてくるから野良ビルトすればよい。

1)wxWidgets
cd wxWidgets-XXXXXXXXXX
mkdir gtkbuild
../configure --prefix=$HOME/XXXX/XXXX/wxWidgets --enable-unicode --with-opengl
make
make install
cd ./contrib/src/stc
make
make install
cd -
cd ./contrib/src/gizmos
make
make install
cd -

~/.bash_mine
export PATH=$PATH:$HOME/XXXX/XXXX/wxWidgets/bin/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/XXXX/XXXX/wxWidgets/lib/

2)wxPython
cd ./wxPython
python ./setup.py install

python ./demo/demo.py でテスト

C++でずいぶん使い倒した記憶があるが、ほとんど忘れていた。

2011年2月8日火曜日

django-axesでlogin lock

djangoでadminやloginに複数回のログイン失敗に対してlockをかけ設定した時間が経過しないとログインできないようにしたいならdjango-axes
ドキュメントとおりにインストールしてdjangoに設定すればOK

ソース読めば分かるけれど、ドキュメントにない設定もある。使うのは、
#失敗した後ロックされる時間
AXES_COOLOFF_TIME = 3 #hour
#ロックされたときに使うテンプレート
AXES_LOCKOUT_TEMPLATE = 'account_locked.html'

あと、
settings.pyで
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
と設定しているから
LOGFILE = os.path.join(settings.DIRNAME, 'axes.log')

LOGFILE = os.path.join(settings.PROJECT_ROOT, 'axes.log')
としてプロジェクトディレクトリにlogin履歴がaxes.logに書き込まれる。


AXES_LOCKOUT_TEMPLATEには
'cooloff_time': COOLOFF_TIME,
'failure_limit': FAILURE_LIMIT,
が渡されるので好きにしてよい。

デコレーターなので自前のログイン関数にも
from axes.decorators import watch_login
.......
@watch_login
def login(request):
でOK


本家はここ。 TNX!

2011年1月20日木曜日

sshFSでremote diskをmount

ubuntuだと
sudo apt-get install sshfs
でおわり。
マウント
sshfs [アカウント@]<サーバ>:[ディレクトリ] <マウントポイント>
アンマウント
fusermount -u <マウントポイント>

これで、リモートのファイルをローカル環境でいぢれる。開発用サーバーの出番が減るなあ。

Life with ITさんありがとう!

追記:-o reconnect
ServerAliveInterval 60 @~/.ssh/config

monkey_patch function

django-cmsのmonkeypatch_reverseから忘れないうちにメモ。
pythonで、関数もオブジェクトだから既存のライブラリを書き換えてしまえ。

main.py
from funcs import func

def main():
    func.printStr(u'hello')

if __name__ == '__main__':
    main()
    import monkey #新しい関数でpatch
    main()
funcs/func.py  #元の関数
def printStr(string):
    print u'original', string
monkey_patch.py  #新しい関数
import funcs

def monkey_patch_func():

    def new_printStr(string):
        print u'monkey', string

    print funcs.func.printStr
    funcs.func.old_printStr = funcs.func.printStr   #元の関数を退避
    funcs.func.printStr = new_printStr   #新しい関数を接続
    print funcs.func.printStr

    monkeypatched = False    #新しい関数の接続は1回だけ
    if not monkeypatched:
        monkey_patch_func()
        monkeypatched = True