pythonの最近のブログ記事

下記がコードサンプル、create_indexは忘れずに。

#!/usr/bin/env python

import binascii
import struct
import datetime
import hashlib
rom pymongo import Connection
from time import sleep

reconnect_times = 10
reconnect_counter = 0
dbsetting = {'dbhost':'localhost','dbname':'shorturldb'}

def con(**kwargs):

    global reconnect_counter
    global reconnect_times

    if 'host' not in kwargs:
        kwargs['host'] = dbsetting['dbhost']
    dbname = dbsetting['dbname']

    try:
        _con = Connection(**kwargs)
        return eval('_con.'+dbname)

    except Exception, e:

        sleep(0.1)

        print('Fail to excute %s [%s]' % ( __name__, e))
        if reconnect_counter == reconnect_times:
            reconnect_counter = reconnect_counter + 1
            con(**kwargs)


def save_hash(url, length=5):
    base32 = [
            'a', 'b', 'c', 'd', 'e',
            'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o',
            'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y','z',
            'A', 'B', 'C', 'D', 'E',
            'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O',
            'P', 'Q', 'R', 'S', 'T',
            'U', 'V', 'W', 'X', 'Y','Z',
            '0', '1', '2', '3', '4',
            '5', '6', '7', '8', '9'
            ]
    hex = hashlib.md5(url).hexdigest()
    hexLen = len(hex)
    subHexLen = hexLen/8
    output = []
    mydb = con()
    for i in range(0, subHexLen):
        subHex = hex[i*8:(i*8)+8]
        num = 0x3FFFFFFF & int('0x'+subHex, 0)
        hash = '';
        for j in range(0,length):
            val = 0x0000003D & num
            hash = hash + base32[val]
            num = num >> length
        r = mydb.shorturl.find_one({'i':{'$in':[hash,url]}})
        if not r:
            insert = {'i':[hash,url],'p':datetime.datetime.utcnow()}
            mydb.shorturl.insert(insert)
            return hash

        elif r and r['i'][1] == url:
            return r['i'][0]
    return None

def get_hash(url):
    mydb = con()
    r = mydb.shorturl.find_one({'i':{'$in':[url]}})
    if r:
        return r['i'][0]
    return None

from pymongo import Connection
from time import sleep

reconnect_times = 10
reconnect_counter = 0

def con(**kwargs):

    global reconnect_counter
    global reconnect_times

    if 'host' not in kwargs:
        kwargs['host'] = settings.application['dbhost']
    dbname = settings.application['dbname']

    try:
        _con = Connection(**kwargs)
        return eval('_con.'+dbname)

    except Exception, e:

        sleep(0.1)

        print('Fail to excute %s [%s]' % ( __name__, e))
        if reconnect_counter == reconnect_times:
            reconnect_counter = reconnect_counter + 1
            con(**kwargs)

==
mongodb 1.5.* は若干バギーで、コネクトエラーがたまにでる。(でるらしいので、pymongoのコネクトラッパーらしきものもあるが)自前で、対応
べーすハンドラーに
class BaseHandler(tornado.web.RequestHandler):
    def get_user_locale(self):
        return tornado.locale.get(*[self.get_cookie('lang', None)])

get_user_locale を上記のように指定すると、
cookie lang に locale の指定があれば、locale テーブルを差し替えられる。

== po file 作成サンプルシェル ==

BASE=.
DOMAINNAME='main'
FILELIST=$BASE/templates
POFILEDIR=$BASE/po
XGETTEXT=`which xgettext`

find $FILELIST -type f > .tmp
touch $POFILEDIR/$DOMAINNAME.pot
$XGETTEXT -j -n -o $POFILEDIR/$DOMAINNAME.pot --keyword=_:1,2 --language=Python -f .tmp
rm .tmp

#for x in "af_ZA" "ar_AR" "bg_BG" "bn_IN" "bs_BA" "ca_ES" "cs_CZ" "cy_GB" "da_DK" "de_DE" "el_GR" "en_GB" "en_US" "es_ES" "es_LA" "et_EE" "eu_ES" "fa_IR" "fi_FI" "fr_CA" "fr_FR" "ga_IE" "gl_ES" "he_IL" "hi_IN" "hr_HR" "hu_HU" "id_ID" "is_IS" "it_IT" "ja_JP" "ko_KR" "lt_LT" "lv_LV" "mk_MK" "ml_IN" "ms_MY" "nb_NO" "nl_NL" "nn_NO" "pa_IN" "pl_PL" "pt_BR" "pt_PT" "ro_RO" "ru_RU" "sk_SK" "sl_SI" "sq_AL" "sr_RS" "sv_SE" "sw_KE" "ta_IN" "te_IN" "th_TH" "tl_PH" "tr_TR" "uk_UA" "vi_VN" "zh_CN" "zh_HK" "zh_TW";
for x in "ja_JP";
do

LOCALE=$x
POPATH=$POFILEDIR/$LOCALE.po

test ! -f $POPATH && touch $POPATH

nkf -wLu $POPATH > $POFILEDIR/$LOCALE.old.po
msgmerge -v $POFILEDIR/$LOCALE.old.po $POFILEDIR/$DOMAINNAME.pot -o $POPATH
done


unicode should be encoded before parts not body.

<code>

def _signature(self, args):
        parts = ["%s=%s" % (n, args[n].encode("utf-8") if isinstance(args[n], unicode) else args[n]) for n in sorted(args.keys())]
        body = "".join(parts) + self.settings["facebook_secret"]
        return hashlib.md5(body).hexdigest()

</code>
xcode  と  mac port をインストール

そして

$ sudo port install boost pcre
$
sudo port install spidermonkey
$ sudo port mongo

# ついでにpymongoも
$ sudo easy_install pymongo

参照: mongodb
http://www.mongodb.org/display/DOCS/Building+for+OS+X?showComments=true&showCommentArea=true

tornadoも同じ、(xcodeを入れてコンパイル環境を用意する)

で、
$ sudo easy_install setuptools pycurl==7.16.2.1 simplejson
$ git cloan git://github.com/facebook/tornado.git
$ cd tornado
$ python setup.py build
$ sudo python setup.py install

python-mobile-jp

| コメント(0)
python-mobile-jpをアップしました。
簡易バージョンでauのテストをしていませんが、
これから鍛えて行きます。


Python Decorators 備忘録

| コメント(0)
PythonのDecorators(デコレーター)について

まず、コードを見ながら動きを解説します。

関数で修飾する場合のコード例1:
{{{
def decoratorsTest(function):
    print function.__name__

@decoratorsTest
def functionTest():
    pass
}}}

出力結果:
functionTest
※修飾される関数の名「functionTest」が出力される

簡易解説:
1.@decoratorsTestが修飾対象の関数の直前にくる
2.decoratorsTestの引数「function」はfunctionTestと同じ
3.decorators(デコレーター)が呼び出されたときに関数が実行される

クラスで修飾する場合のコード例2:
{{{
class decoratorsTest:
    def __init__(self, function):
        self.function = function
        self.saved = []

    def __call__(self, *args):
        try:
            self.saved.append(args[0])
            print "saved", self.saved
            return self.function(*args)
        except Exception, e:
            print "Error %s" % (e)

@decoratorsTest
def functionTest(x):
    return "args", x

print functionTest(1)
print functionTest(2)
}}}

出力結果:
saved [1]
('args', 1)
saved [1, 2]
('args', 2)

簡易解説:
1.decoratorsが宣言された時に、__init__(コンストラクタ)が呼び出される
2.decoratorsの直下の関すが呼ばれたときに、__call__される
3.出力結果のように、saved メンバー変数は保持され続ける 









このアーカイブについて

このページには、過去に書かれたブログ記事のうちpythonカテゴリに属しているものが含まれています。

前のカテゴリはphp zend frameworkです。

次のカテゴリはグルメです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。