一看好久没有写过日志了,因为最近一直开发那个双色球数据中心的消息接口代码,所以就没有很多时间学习什么技术性的知识,今天终于看起来完了,剩下的事情就是做代码查错和优化了。把遇到的一些问题记录一下:

  1. python生成xml的时候编码问题。贴段代码:
       res = pdb.get({''isreturn':'0'}, num, 'renqi desc')
    if res:
        doc = xdom.Document()
        ixml = doc.createElement('xml')
        ixml.setAttribute('counts', str(num))
        doc.appendChild(ixml)
        for v in res:
            row = doc.createElement('row')
            kvalue = {'pid': v['pid'], 'username':v['username'].decode('gbk')}
            for kv in kvalue:
                row.setAttribute(kv, '%s' % kvalue[kv])
            ixml.appendChild(row)
        hxml = doc.toxml(encoding = 'utf-8')
        doc.unlink()
        f = open('/home/xxxx/public_html/tt.xml', 'w')
        f.write(hxml)
        f.close()
        del(f)
    

            看见那个username的decode么,这里就是问题了,因为oracle中取出的数据为gbk编码,需要encode为utf-8,当然只能先decode成unicode编码了。

  2. 第二个就是做数据表备份,给几条sql语句品尝一下:

    create table project_info_bak as select * from project_info where 1=0
    insert into `project_info_bak` select * from `project_info` WHERE `f_pid` <35968
    delete a from pro a left join prou b on a.f_pid =b.f_pid where b.f_pid<1020

        下班时间已过了,现在该回家罗罗

        这次做到一个项目需要用到python生成xml,其实很简单,我就懒得罗嗦了,还是上代码:

import xml.dom.minidom as xdom
'''
< ?xml version="1.0" ?>

    
        www.quou.cn
    

'''
doc = xdom.Document()
root = doc.createElement('root')
doc.appendChild(root)
user = doc.createElement('user')
user.setAttribute('name', 'quou')
txt = doc.createTextNode('www.quou.cn')
user.appendChild(txt)
root.appendChild(user)
print doc.toprettyxml()
16 / 10 / 2010 buling

        MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似 json的bjson格式,因此可以存储比较复杂的数据类型。官方网站:http://www.mongodb.org
        说一些基本安装:首先安装python环境这是必须的了吧,具体步骤略。首先安装mongo环境,我以window为例,从http://www.mongodb.org/downloads下载Windows 32-bit(我的是32位),解压到C盘并在C盘建一个data/db目录存放数据文件,从命令行进入到c:/mongodb-win32-i386-1.6.3/bin,然后运行:mongod.ext run,就这样服务就启动好了。然后开始安装mongo的python模块:到http://pypi.python.org/pypi/pymongo/下载pymongo-1.9.win32-py2.6.exe然后直接运行,安装完成就可以开始编码了。
        语言很简洁,下面直接上代码,聪明的你肯定很快就能上手:

import pymongo
con = pymongo.Connection('localhost', 27017)
mydb = con.mydb # new a database
mydb.add_user('test', 'test') # add a user
mydb.authenticate('test', 'test') # check auth
muser = mydb.user # new a table
muser.save({'id':1, 'name':'test'}) # add a record
muser.insert({'id':2, 'name':'hello'}) # add a record
muser.find_one() # find a record
muser.find_one({'id':2}) # find a record by query
muser.create_index('id')
muser.find().sort('id', pymongo.ASCENDING) # DESCENDING
# muser.drop() delete table
muser.find({'id':1}).count() # get records number
muser.find({'id':1}).limit(3).skip(2) # start index is 2 limit 3 records
muser.remove({'id':1}) # delet records where id = 1
muser.update({'id':2}, {'$set':{'name':'haha'}}) # update one record

下面再贴一些类似非python的api参考:

15 / 10 / 2010 buling

明天还要加班,本来这么晚就应该睡觉,但涛让我瞅瞅mongodb,就顺便找到了很多知识,这个就是知识缺乏的后果,不知道一个东西就会google到另一个不了解的东西。少说一点点吧,现在人数据库开发的历程:

  1: PHP + MySQL
  2: PHP + MySQL (Master + Slaves)
  3: PHP + MySQL (Master + Slaves) + Memcached (Middleware)
  4: PHP + MySQL (Sharding + Master + Slaves) + Memcached (Middleware)
  5: PHP + MySQL (Sharding + Master + Slaves) + Memcached (Middleware) + NoSQL

mongodb是一种nosql数据库,晚了,睡了,改时间又思路了再写一篇专门介绍一下

12 / 10 / 2010 buling

        因为业务需要,产品部提出了双色球二级页面改变。本身没什么问题,主要是有几个数据提取有难度,虽然想想:数据提取嘛,几个sql语句的事情。因为网站越来越面向社区化发展,总是在不断的扩展很多功能,这就出现了一个什么情况呢,越来越多的数据查询,可想网站效率。
        目前公司从技术架构大体分三层:前端用户体验(html+JavaScript)、中间PHP逻辑处理、后端数据处理(python+ice)。以前大部分由PHP处理的的操作,现在都要移到系统部用python来处理。这样的好处是什么呢?把业务分开,各模块处理独自的事务,如果某个模块出现问题也不会影响到整个网站。这就是现行的soa(面向服务架构 – Service-Oriented Architecture)。

11 / 10 / 2010 buling

      今天想记录日志,一开始就直接用open,write写,发现效率不高,就采用了python的自带模块logging,给大家看个测试代码:

LOG_FILENAME = '/home/es123/python/test/dd.txt'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)
LOG_FILE = '/home/es123/python/test/ddd.txt'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)
logging.info('this is a test msg')

      你觉得这个日志写在哪个文件的呢?聪明的你应该会说第一个,要是第二个我就没必要折腾了。为什么呢,来看官方文档的这段话
logging.basicConfig([**kwargs])
Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.
      所以呢…哈哈,如果在第一次定义过,需要创建一个自己的logging怎么办呢,python也提供了相应的方法。代码示下:

        今天在做邮件系统的时候发现一个问题,思考了很久,终于解决了。记录一下,问题大概是,启动一个服务随时等待接受任务,这个很简单,while一个Queue就可以了,但是这样极容易造成队列任务过多,所以用多线程实现。这有什么问题呢,当在某个时刻我想停止服务,但是没处理完的任务怎么办?保存呗,下面贴一个msgCache。

class msgCache:
    def __init__(self, dbfile):
        self.dbfile = dbfile
        self.queue = Queue.Queue(9999)
        dname = os.path.dirname(self.dbfile)
        if not os.path.isdir(dname):
            os.makedirs(dname, 0755)
        if not os.path.isfile(self.dbfile):
            return
        f = open(self.dbfile, 'r')
        pick = cPickle.Unpickler(f)
        while 1:
            try:
                self.queue.put(pick.load())
            except:
                break
        f.close()
        del(pick)
        os.remove(self.dbfile)
    def close(self):
        if self.queue.empty():
            return
        f = open(self.dbfile, 'w')
        pick = cPickle.Pickler(f, -1)
        while 1:
            try:
                pick.dump(self.queue.get(0))
            except:
                break
        f.close()
        del(pick)
    def add(self, data):
        self.queue.put(data)
    def get(self):
        try:
            return self.queue.get(0)
        except:
            return None

        这个类很好用,有兴趣的可以用用看了。

10 / 10 / 2010 buling

        今天看百度搜索风云榜【http://top.baidu.com/】网页的时候,看见旁边那个标签云效果还可以,就用到博客中了,见侧边栏。下面说说实现的方法:首先要做一个xml的标签数据页面,我是在根目录下的wp-tags.php。源码示下:

header( "Content-type: text/xml ");
require_once( dirname(__FILE__) . '/wp-config.php' );
$taglist = wp_tag_cloud('smallest=9&largest=22&unit=pt&number=200&format=link_arr&orderby=name&order=ASC&echo');
$dom = new DOMDocument('1.0','utf-8');    //创建新的xml文件
$root = $dom->createElement('root');
$dom->appendChild($root);            //建立元素
$i=0;
foreach($taglist as $tag)
{
        $item = $dom->createElement('item');
        $item->setAttribute('type', 'text');
        $item->setAttribute('detail', $tag['word']);
        $item->setAttribute('link', $tag['link']);
        $item->setAttribute('weight', $tag['count']);
        $root->appendChild($item);
}
$XMLString = $dom->saveXML();
echo $XMLString;

        注意看有个wp_tag_cloud函数,这个函数在wp-includes/category-template.php里面,这个函数内调用的是wp_generate_tag_cloud,所以,我们直接找到这个函数,改变如下部分:

08 / 10 / 2010 buling

        今天开发的时候遇到时间转换操作。问题是这样的,数据库存储的是日期格式为:2010-09-07 17:49:21,需要转换为:2010年09月07号。取出后就str过,所以现在是字符串格式,代码如下:

str='2010-09-07 17:49:21'
t=time.strptime(str, '%Y-%m-%d %H:%M:%S')
y, m, d=t[0:3]
d=datetime.datetime(y, m, d)
d.strftime('%Y年%m月%d日')

        后来发现,数据库存储的是日期格式,取出后还是日期格式,这就好办了,因为datetime有个strftime可以格式化时间,代码示下

d=row['datetime']
d.strftime('%Y年%m月%d日')

        最后说一下,格式化python时间中的毫秒方法,口说无益,看代码:

d=datetime.datetime.now()
t='%s %s' % (d.strftime('%Y-%m-%d %H:%M:%S'), d.microsecond)
07 / 10 / 2010 buling

        昨天晚上赶到4点钟,终于把emlog转换到WordPress。之前也在网上搜索了从emlog到WordPress的转换方法,貌似都不怎么好,就自己手动写了段php先把文章签过来再说,因为只是为了救急,也就没有分什么类什么的,代码试下