月度归档:2013年02月

中文解析浓缩字!

五行:金木水火土

五方:西东北南中(东西南北中)

太极 阴阳 两仪 五行 八卦(坤(代表地),震(代表雷),离(代表火),兑(代表沼泽),乾(代表天),巽(代表风),坎(代表水),艮(代表山))  三才 六道 天干 地支

五感就是:形、声、色、味、触(也即人的五种感觉器官:视觉、听觉、嗅觉、味觉、触觉)

七情六欲(六欲:色、声、香、味、触、法 ;七情:喜、怒、哀、惧、爱、恶、欲 )

“五常”即仁、义、礼、智、信

五伦,即古人所谓君臣、父子、兄弟、夫妇、朋友五种人伦关系。用忠、孝、悌、忍、善为“五伦”关系准则。

八种德行,即

十三经儒家的十三部经书,即《易》、《书》、《诗》、《周礼》、《仪礼》、《礼记》 、《春秋左传》、《春秋公羊传》、《春秋谷梁传》、《论语》、《孝经》、《尔雅》、《孟子》。

六艺现代解释,包括“礼、乐、射、御、书、数”等六种技艺。

四字成语

主谓宾

时间 空间 顺序

真假性( 相对正确 ) 确定性  矛盾性 可表达性 可发展性 可利用性

python的浅copy和深copy

先看下按照书上的例子,在idle中的情况:

>>> person = [‘name’, [‘savings’, 100.00]]
>>> hubby = person[:]
>>> wifey = list(person)
>>> [id(x) for x in person, hubby, wifey]
[18872520, 18860592, 18872080]
>>> [id(x) for x in hubby]
[11191456, 18858672]
>>> [id(x) for x in wifey]
[11191456, 18858672]
>>>
>>> hubby[0] = ‘joe’
>>> wifey[0] = ‘jane’
>>> hubby[1][1] = 50.00
>>> hubby, wifey
([‘joe’, [‘savings’, 50.0]], [‘jane’, [‘savings’, 50.0]])
>>> [id(x) for x in hubby]
[18746832, 18858672]
>>> [id(x) for x in wifey]
[18975328, 18858672]
>>> [id(x) for x in person]
[11191456, 18858672]
>>>

 

书中讲到,由于name是字符串,是不可变对象,所以copy的时候,重新改了id,这导致我们得到了想要的结果。

而 [‘savings’, 100.00]是一个列表,是可变对象,在copy的时候,id指向没有变化,这导致修改一个变量的saving数值的时候,另一个变量的也被修改了。

 

解决的方法是:使用深copy,即deepcopy

http://book.51cto.com/art/200806/77233.htm

不过我在考虑,还是在程序设计的时候,就考虑清楚,并使用简单的方法解决最好,再import copy,弄出来deepcopy,不太简洁。

 

用pyramid创建一个完整的WEB Project zt

http://luchanghong.com/python/2012/06/12/creater-a-complete-web-project.html

用pyramid创建一个完整的WEB Project

撰写于  分类: python 标签: python pyramid
概要:最近公司开展新项目,依然用的是 pyramid ,只是数据库从 mongoDB 改为 mySQL ,这个 project 差不多是我自己来完成的,总结了一下创建项目的基本步骤,算是比较完整的,分享一下。

之前公司用pyramid做开发,那时候刚开始学习,有很多不懂,都是别人定义好的,我只是拿来用,所以一些原理不是太清楚。最近公司开展新项目,依然用的是pyramid,只是数据库从mongoDB改为mySQL,这个project差不多是我自己来完成的,总结了一下步骤。

一、创建一个pyramid project

我的开发环境:WIN7  32bit + python 2.6.6 + mysql 5.5.20 + mongodb 2.0.3

在项目目录下执行:

pcreate -s starter myproject

这个命令应该很熟悉了吧,pcreate是装了pyramid之后在python/Scripts/目录生成的一个可执行文件,通常把python/Scripts/加入到系统环境变量以方便使用。

然后,以develop的方式来run我们的项目,production.ini则是生产环境(线上)的配置文件:

python setup.py develop

如果项目多人参与开发,那么每个人都可以拷贝一份development.ini根据当前开发环境来配置,然后以此来run项目:

pserve my_development.ini --reload

reload参数说明:当修改项目下的.py文件或者配置文件后pserve自动重启,方便开发调试。

二、配置development.ini

你可以在这里设置一些配置,比如mysql的主机、用户名、密码,debug是否开启,如:

; For mysql
mysql.host = localhost
mysql.port = 3306
mysql.user = root
mysql.passwd = root
mysql.db = myproject
mysql.charset = utf8

引用的时候可以这样写:

settings['mysql.host']

 

数据库的连接状态我们肯定想一直保持,要不然每次都要connect一下很麻烦,所以可以在myproject/init.py里面把db_connect放在request里面,方便调用:

import pymysql
from pyramid.config import Configurator
from pyramid.events import NewRequest
def main(global_config, **settings):
    config = Configurator(settings=settings)
    # connect mysql
    def add_mysql_db(event):
        db_host = settings['mysql.host']
        db_port = int(settings['mysql.port'])
        db_user = settings['mysql.user']
        db_pass = settings['mysql.passwd']
        db_name = settings['mysql.db']
        db_charset = settings['mysql.charset']
        conn = pymysql.connect(host = db_host, port = db_port, user = db_user,
            passwd = db_pass, db = db_name, charset = db_charset)
        event.request.db = conn.cursor()
    config.add_subscriber(add_mysql_db, NewRequest)

三、route & view

在上面那个init.py里面有一个home的route,可以看到写法。route和view是成对出现的,项目里面的route很多,如果都写在这不方便管理,所以我们新建一个文件专门存放route,view不必非要紧挨着route,仔细看配置文件会发现config.scan(),他会帮我们快速配对route和view,通常config.scan(‘myproject’),应该很容易理解吧(myproject相当于一个package)。

route的写法可以查看pyramid文档,就不在此啰嗦了,后面我把一个完整的配置文件共享出来。

四、renderer一个html模板

pyramid默认使用mako模板引擎,mako默认支持.pt后缀的模板文件,我们常用.html,所以要配置一下,很简单,在上面那个init.py的main()函数里加上:

config.add_renderer('.html', 'pyramid.mako_templating.renderer_factory')

在development.ini文件里制定mako模板路径:

; For Mako Template
mako.directories = myproject:templates
mako.strict_undefined = true

五、session factory

关于session,一般设定方式如下:

import pyramid_beaker
# set session factory
session_factory = pyramid_beaker.session_factory_from_settings (settings)
config.set_session_factory (session_factory)
pyramid_beaker.set_cache_regions_from_settings (settings)

也要在development.ini设置一下:

; For pyramid_beaker
session.type = file
session.data_dir = %(here)s/data/sessions/data
session.lock_dir = %(here)s/data/sessions/lock
session.key = myproject_session
session.cookie_on_exception = true

;cache.regions = default_term, second, short_term, long_term
;cache.type = memory
;cache.second.expire = 1
;cache.short_term.expire = 60
;cache.default_term.expire = 300
;cache.long_term.expire = 3600

分号是注释作用。

用的话直接在request.session里面取:request.session.get(‘username’)

六、权限系统

这个有点小复杂,可以看手册里面security和resources。资源–权限–角色–用户这个思路,理解起来就是赋予用户某些角色,然后是对资源授权,注意:权限是角色固有的,而非和用户绑定在一起,以后有时间好好分享一下。

以上六步算是比较完整的了。development.ini配置较简单,下面是myproject/init.py的配置:

import pymysql,pymongo
import pyramid_beaker
from pyramid.config import Configurator
from pyramid.events import NewRequest
from urls import add_web_route

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)

    config.add_static_view('static', 'myproject:static', cache_max_age=3600)

    # set session factory
    session_factory = pyramid_beaker.session_factory_from_settings (settings)
    config.set_session_factory (session_factory)
    pyramid_beaker.set_cache_regions_from_settings (settings)

    # render a html template
    config.add_renderer('.pt', 'pyramid.mako_templating.renderer_factory')
    config.add_renderer('.html', 'pyramid.mako_templating.renderer_factory')

    # MongoDB
    def add_mongo_db(event):
        settings = event.request.registry.settings
        db = pymongo.Connection(settings['mongodb.url'])[settings['mongodb.db_name']]
        event.request.mongo_db = db
    config.add_subscriber(add_mongo_db, NewRequest)

    # connect mysql
    def add_mysql_db(event):
        db_host = settings['mysql.host']
        db_port = int(settings['mysql.port'])
        db_user = settings['mysql.user']
        db_pass = settings['mysql.passwd']
        db_name = settings['mysql.db']
        db_charset = settings['mysql.charset']
        conn = pymysql.connect(host = db_host, port = db_port, user = db_user,
            passwd = db_pass, db = db_name, charset = db_charset)
        event.request.db = conn.cursor()
    config.add_subscriber(add_mysql_db, NewRequest)

    # config.add_route('home', '/')
    # add route
    add_web_route(config)
    config.scan('myproject')
    return config.make_wsgi_app()

下面是myproject/urls.py:

# -*- coding: utf-8 -*-
__author__ = 'luchanghong'

def add_web_route(config):
    # web common
    config.add_route (name = 'web.index', pattern = '/')

下面是development.ini:

[app:main]
use = egg:myproject

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
; pyramid.includes = pyramid_debugtoolbar

; For pyramid_beaker
session.type = file
session.data_dir = %(here)s/data/sessions/data
session.lock_dir = %(here)s/data/sessions/lock
session.key = myproject_session
session.cookie_on_exception = true

;cache.regions = default_term, second, short_term, long_term
;cache.type = memory
;cache.second.expire = 1
;cache.short_term.expire = 60
;cache.default_term.expire = 300
;cache.long_term.expire = 3600

; For Mako Template
mako.directories = myproject:templates
mako.strict_undefined = true

; For Mongo
mongodb.url = mongodb://127.0.0.1
mongodb.db_name = myproject

; For mysql
mysql.host = localhost
mysql.port = 3306
mysql.user = root
mysql.passwd = root
mysql.db = myproject
mysql.charset = utf8

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

# Begin logging configuration

[loggers]
keys = root, myproject

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_myproject]
level = DEBUG
handlers =
qualname = myproject

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s

# End logging configuration

注意我的项目名称是:myproject

python序列类型可用的内建函数bif

序列类型可用的内建函数

函  数  名 功    能
enumerate(iter)a

接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成由iter每个元素的index值和item值组成的元组(PEP 279)

len(seq)

返回seq的长度

max(iter,key=None)or max(arg0,arg1…, key=None)b

返回iter或(arg0,arg1,…)中的最大值,如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数

min(iter, key=None)or min(arg0, arg1…key=None)b

返回iter里面的最小值或者返回(arg0,arg1,…)里面的最小值; 如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数

reversed(seq)c

接受一个序列作为参数,返回一个以逆序访问的迭代器(PEP 322)

sorted(iter, func=None, key=None, reverse=False)c

接受一个可迭代对象作为参数,返回一个有序的列表;可选参数

func、key和reverse的含义跟list.sort()内建函数的参数含义一样

sum(seq, init=0)a

返回seq和可选参数init的总和,其效果等同于reduce(operator.add,seq,init)

zip([it0, it1,… itN])d

返回一个列表,其第一个元素是it0、it1…这些元素的第一个元素组成的一个元组,第二个…依此类推

a.Python2.3新增 b.从Python2.5开始支持关键字参数 c.Python2.4开始支持 d.Python2.0加入,Python2.4加强 我们将分别在每个序列的章节里面提供使用这些函数的例子。

国外最流行的几个外包接活平台简要介绍 zt

http://www.freelancer-life.cn/freelancer-websites/international-platform.html/comment-page-1#comment-6820

No.1 Freelancer.com(旧称GAF – GetAFreelancer): 国外访问人数最多,更新速度最快的外包平台。详细介绍

重要提示:最近Freelancer的官方网站Freelancer.com在国内访问非常缓慢,如果打开困难,建议使用SSH或VPN等翻墙工具进行访问;这对想在该平台上接单的人来说既是坏消息也是好消息,虽然访问比较慢,但相应的来自国内的接单竞争者也会相应减少,一些指定Chinese才能做的项目,竞争度会下降不少。

No.2 Elance: 国外比较成熟的三大业务外包平台之一,外包项目类型以软件和网站为主。当年Digg站点的创始人就是通过这个站点找到开发人员的。该站点上大的项目不少,因此也就吸引了很多俄罗斯和印度的软件外包公司在上面进行投标。详细介绍

No.3 oDesk: 是悬赏机制和信誉评价系统最为严谨的外包站点,对服务提供者(Freelancer们)的能力评价机制很具体,成为正式会员要通过一个耗时一小时左右的基础知识测试。该站点上的外包项目都不大,从悬赏金额来看,都是小项目的开发工作,而且比较集中性的针对网络的开发,比如 .net、C++、PHP 等等;项目来源多数是北美;欧洲,还有一个比较突出的特点是,买家可以通过Webcam 来”监督”项目进程。详细介绍

No.4 donanza.com: 专门为自由职业者服务的网站DoNanza,从各大外包平台上将各类项目汇集在一起推送给有意向的自由职业者,帮助他们找到自己中意的外包项目,目前以后有25万多名自由职业者成为该网站会员。

No.5 GetACoder: 从它名字就可以知道这个平台的侧重点了:网站或软件开发类的项目为主,适合具备一定项目经验的编程人员和设计人员;成为其高级会员每月需花费$7.95,在外包站点中已经算比较低廉了。详细介绍

No.6 iFreelance: 和其他几个站点不同之处是买家以公司为主,算是国外项目网站中的后起之秀,每天访问量也不小。

http://www.guru.com/images/homepage/home-logo.gif

No.7 Guru.com: Guru是个流行没多久的英文单词,源自梵文,其实就是Master(大师)、Expert(专家)的意思。该网站成立于2004年,总部设在美国。

No.8 RentACoder(vWorker): 名称和特点都和GetACoder类似,侧重于软件开发类项目;如果要想在上面取得项目,你的主要竞争对手将主要是俄罗斯及东欧国家的程序员。(更新,RentACoder已改名为vWorker)(该平台已经被freelancer.com收购

关于Rent A Coder(现改名为vWorker)创始人

程序员伊恩.伊波利托(Ian Ippolito)是最早利用众包机遇的先驱之一,他于2002年成立了Rent A Coder公司,这家位于佛罗里达州的网站,将全球所有自由程序员联系到一起。如今,136,837家采购方及285,700个程序员共同组成了他的众包商业帝国。在这里,企业贴出工作邀约是免费的,一旦交易达成,该公司会抽取总交易金额6%~15%的提成。2008年,该公司的收入为240万美元,比2004年翻了一番还多。今年,伊波利托预测将有300万美元的进账。同时,他还会将公司的名字改为vWorker.com,让它看起来更像虚拟工作者的交流园地。

No.9 Bizreef.com: 刚刚兴起的外包平台,用户和任务发布数量增加都非常快。

https://images-na.ssl-images-amazon.com/images/G/01/webservices/mechanical-turk/logoAI3.gif

No.10 Mturk.com: 如果你目前除了英语外还没有其他特别的技能,但又想体验下外包是怎么一回事,那么这个站点是最合适的练习场所了。亚马逊的“Mechanical Turk”网站(mturk.com)是一个众包(crowdsourcing)平台;众包指的是一个公司或机构把过去由员工执行的工作任务,以自由自愿的形式外包给非特定的(而且通常是大型的)大众网络的做法。在mturk.com上每个任务被分为很多个人工智能任务包(HIT),发起人把任务以HITs的形式给出,承接人(即Freelancer)浏览这些任务并完成,最后得到一定报酬(通过亚马逊账户或者现金支付)。

http://farm4.static.flickr.com/3278/3048460644_5be5f890bf.jpg?v=0

No.11 Task Market: 该平台由微软两个研究小组(Microsoft Research Asia 和 Microsoft Office Labs)联合发布。Task Market定位非常明确,是非技术性的。目前的工作种类只限于写、编辑、翻译、以及简单基础的设计。在Task Market上用户可以提供一定的费用来寻找工作承包者,然后使用eBay’s PayPal 进行金钱的支付。这个平台上的用户量和任务发布数都不是很多。(更新:微软公司已经停止运作该平台)

http://farm4.static.flickr.com/3146/3048902115_3af6664cc1.jpg?v=0

No.12 Proz.com: 国外影响力最大的翻译外包平台,有很多翻译项目,从事翻译工作的Freelancer们可以关注下。

No.13 EU Freelance: 和GAF (Get A Freelancer)有联盟关系的外包平台,专注于欧洲市场,所以来自欧洲的服务买家比较多一些,费用当然也是按欧元结算的。

http://www.peopleperhour.com/images/logo.gif

No.14 PeoplePerHour.com: 该站点成立于2007年,创始人是一位名叫Xenios Thrasyvoulou的剑桥毕业生,他意识到中小型企业雇佣长期员工来完成项目或任务要比雇佣短期的自由职业者付出更多费用,而网络上提供给企业和Freelancer双方来接洽的优秀平台并不多,于是他并有了设立这个站点的想法;他的目标是把peopleperhour.com建设成为兼具Facebook(SNS:社会化网络)和Ebay(有良好的评价系统)特点的小型项目外包平台。

No.15 Djangogigs.com: 专门为Django框架技术开发人员和服务需求者提供的外包平台。

http://jobs.37signals.com/images/now-with-internships.png http://jobs.37signals.com/images/37slogo-trans.gif?1250573023

No.16 37signals Job Board: 著名的美国项目管理软件开发商37signals旗下的外包接活平台。

http://farm3.static.flickr.com/2433/3855879769_db70958009.jpg

No.17 Joomlancers.com: 专门为各类开源CMS(主要是Joomla)程序员和网站运营者设立的外包服务交易平台。

http://freelanceswitch.com/wp-content/themes/FreelanceSwitch//site_images/bg_logo.jpg

No.18 Job Board Freelance Switch: 由最大的Freelancer博客站点Freelance Switch提供的外包项目免费发布平台。

No.19 99designs.com: 专门发布网站、logo设计等相关外包项目的接活平台,99designs在一年又四个月内创造了524万美元(1.6亿元台币)的平台交易量,可谓新锐外包平台里的佼佼者;99designs以其“小比赛”的发包模式而出名,什么意思呢?原来,所有的99designs的「项目」,都是以「比赛」的形式来推出。大部份的外包项目都只是设计一个logo之类的,一般来说大概花设计师最多一~二天的时间,所以这些都是「小比赛」,而目前正在进行中的「比赛」的价钱大约从300美元到800美元都有;如果你是设计师,你可以选其中一个比赛,然后在限期内交出你的作品,如果作品被业主所选中了,那你就会得到那笔奖金,如果没中,SORRY!那就做了白工了。

No.20 Design Jobs on the Wall: 由加拿大著名自由网页设计师Nick La建立的网站及图形设计项目招标站点,项目虽然不多,但因为在上面发布招标信息需要付一笔费用,因此这些招标者都是真正想要寻找相关设计师为自己做项目的。

DesignCrowd Logo

No.21 DesignCrowd: 上面的项目都是设计类的,如果你是Logo或者网站设计高手的话,那么这个网站是最适合你的。

N0.22 MyTranslation: 翻译类项目外包平台

N0.23 LivePerson:专家咨询平台(付费获得与各领域专家交流和咨询的机会)