免费发放Google的Schemer邀请

这次明码发放,一个链接可供20人注册。 Google的Schemer邀请

Via:Chairo@2011年12月09日-EOF-

给tornado的database.py增加dbutils支持

忘记什么时候在邮件订阅中看到smallfish的一个给tornado的database.py增加dbutils支持的文章了,去smaillfish的blog看了一下居然是09年写的一篇文章。小鱼修改的代码为:

def reconnect(self):
        """Closes the existing database connection and re-opens it."""
        self.close()
        try:
            from DBUtils import PooledDB
            pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
            self._db = pool_con.connection()
        except:
            self._db = MySQLdb.connect(**self._db_args)
            self._db.autocommit(True)

小鱼干掉了原有的设置autocommit(True)这一行代码,我估计主要是因为DBUtils没有autocommit()这个方法。干掉此行代码后会有一个小问题,就是如果mysql配置的autocommit=0的话,每次对数据库的修改是不会实时反馈给mysql数据库的。而原版的self._db.autocommit(True)这一行就是为了在保证在执行完一条SQL后,修改内容马上反馈给mysql。

Google一圈后我找到两个解决方案:

  • 一个是利用DBUtils的的setsession命令:
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, setsession=['SET AUTOCOMMIT = 1'], **self._db_args)
                self._db = pool_con.connection()
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)
  • 另一个就是类似tornado的做法给每个cursors的connection设置autocommit属性为True
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
                self._db = pool_con.connection()
                self._db.cursor().connection.autocommit(True)
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)

Via:Chairo@2011年12月05日-EOF-

IDEA两个实用的快捷键

如前边提过的,我最近要接触一些java相关的东西,现在对java这个臃肿的东西依然很不爽,但生活所迫不得不慢慢适应。公司使用的工具基本都是IntelliJ IDEA,习惯了vs.net鼠标移到一个方法自动显示提示,但IDEA没有此功能。有一个替代的方式为:鼠标点在方法名上按下“CTRL+Q”。

另外一个快捷键是自动给变量补全set get方法为:“ALT+INSERT” 可以生成代码(如GET,SET方法,构造函数等)

Via:Chairo@2011年12月05日-EOF-

关于传统校园招聘和社会化招聘的一些想法

今天公司下午断网,正好有时间来想一些事情。这些年都是在校园招聘领域乱晃,慢慢也熟悉了一些相关的业务。最近在一家依然是做招聘但是做SNS类招聘的公司打一些杂工。下午有时间想了想传统招聘和社会化招聘的特点,写下来做一个备忘,同样看看若干年后不知道现在这个观点是否正确。

在知乎曾经看到过一个句话说“传统招聘是硬性需求”,具体出处因为公司处于断网状态,无法具体查明出处了。其实我觉着应该这样说更能凸显传统招聘的意义“传统招聘是物质需要,社会化招聘是精神需要”。

乍一看这话是在说社会化招聘是重于传统招聘的,其实应该这样理解“只有物质需要被充分满足后,精神需要才会凸显其重要性”。但是既然社会化招聘被我列为“精神需要”那就是说明社会化招聘依然是很重要,是物质需要被满足之后的升华所在。现在的现实是:物质需要已经被满足了?

首先说明下我的观点(仅限校园招聘):
1.现在的HR在校园招聘旺季时候基本是没有时间泡在SNS的,而这时候是学生最想从SNS中获取到企业的消息,最希望和HR互动的时间。
2.HR空闲时间远没有你想的那么多。
3.学生只有一小搓人会在游戏、打屁、泡妞之余还有时间关注明年或者后年才会面对的工作问题。
4.中国需要找工作的人太多了,物质需要还没有满足。

我相信,社交是需要的,精神需要是高于物质需要的,但精神需要是要在物质需要高度满足的基础之上才有看头的。现在的SNS招聘太专注社交了,忘记了要适应“中国国情”。

Via:Chairo@2011年11月25日-EOF-

给bottle的jinja2插件自定义filter

书接上文说一下bottle如何自定义jinja2模板引擎的filters。

前边咱们说到

bottle中使用jinja2_template即等同于template(你传入参数, template_adapter=Jinja2Template)
,引用一个bottle中template()的关键部分
def template(*args, **kwargs):
...
...
settings = kwargs.pop('template_settings', {})
...
...
TEMPLATES[tpl] = template_adapter(name=tpl, lookup=lookup, **settings)
类似这几句代码,代码大概含义就是从template_settings获取内容然后传递给template_adapter对应对象(即咱们使用的Jinja2Template)

继续跟进Jinja2Template,Jinja2Template接收到settings后会怎么处理呢?俺随后找到了下边这段代码

class Jinja2Template(BaseTemplate):
def prepare(self, filters=None, tests=None, **kwargs):
...
self.env = Environment(loader=FunctionLoader(self.loader), **kwargs)

这样只要想办法给Environment传入一个dict包含filter的参数即可。俺定义了这样一个filter

def datetimeFormat(value, format='%Y-%m-%d %H:%M:%S'):
    '''时间转换'''
    return time.strftime(format, time.localtime(value))
 
template_settings=dict(filters = {"datetimeformat": datetimeFormat})

使用方法如下:
from bottle import jinja2_template as template
def func():
    return template("Templates/showurls.html", 传入模板的数据, template_settings = template_settings)

Via:Chairo@2011年11月19日-EOF-