2007年01月31日

今天早上看到洪波写的一篇Time To Say Goodbye,看到他即将离职.随后又在多处看到类似的消息:

Donews总编辑洪波:告别的时刻 新浪
Donews总编洪波将离职 可能加盟豆瓣网 QQ网

看来事情是真的.不说从我个感受的确Donews在被收购之后基本上还不如没收购前.博客也不好使了.特别是评论,要么看不到,要么点击了跳不到相应的页面去.洪波的Blog写得也没以前写得勤了,不知道是什么原因.

至于洪波是否会去豆瓣,我可不知道,也不想去刻意证实,虽然其中大部分人都很熟(主力程序员可都是CPUG的成员啊).不过去豆瓣未必不是件好事.豆瓣正在发展中,洪波虽然不了解,但想必是一个有想法的人.上次在豆瓣答谢年会上看到洪波(不过我们并不认识,我只是一个程序员),也许就是为今天打下了伏笔吧.想一想上次到现在也就一个多月吧.

愿洪波给我们带来更多的惊喜.

2007年01月29日

今天在重新修改UliPad的输入助手时,我想先找一找有没有合适的异步处理组件,不过没找到。到是看到有一个 PEP 319 的文档。这个文档挺有意思,它可以实现象 Java 一样的同步处理。具体的示例代码如:

synchronize:
    change_shared_data()

通过 synchronize 来对后面的缩近块的代码实现同步处理。转换为普通代码为:

initialize_lock()

acquire_lock()
try:
    change_shared_data()
finally:
    release_lock()

虽然不复杂,不过还是有些代码量。所以如果实现了 synchronize 的处理还是很方便的。同时还有对异步(asynchronize)的支持。

同时这两个关键字还支持 target 参数,如synchronize obj,这样可以在obj上实现相应的同步处理。

不过这两个关键字没有在python版本中出现,所以它目前还躺在了 PEP 文档中。

2007年01月24日

django 的邮件列表中,最近有人对开发服务器进行了改造,以便可以使用 CherryPy 3.0。主要的原因是希望可以使用多线程进行处理,因为目前 django 的开发服务器还是单线程的。随后有人说把 Django 的服务器改为多线程其实很简单,只要引入多线程的 Mixin 即可,给出了 Patch 。目前这一特性将被吸收。Adrian的建议是做为一个可选项,由用户来决定是否使用多线程。因为多线程需要考虑线程安全的问题,而目前可能许多地方都没有考虑,所以让用户来决定是一个好办法。讨论在这里

Django 近期有不少变化。0.95.1版发布,它主要解决了几个关键的bug,其中一个修复了用户session信息混乱的问题。另外,Django对于wiki页面做了调整,主要将用户自提交的信息与 Django 自身的信息相分离,并且首页不允许随便修改了。曾经有一次我发现 Wiki 的首页被人给删除了,但我没有权限来恢复它。Spammer真是无处不在啊。同时 Django 为了让带有 Patch 的 ticket 可以被接受,定制了相应的处理流程,对 Trac 进行了一些定制,比如增加一些状态,主要有:需要文档,需要测试,等待提交等信息,这样方便提交人知道 Patch 被受理的状态,可以做出相应的修改。

在 SharePlat 中我需要一个日期输入的 js 功能,于是在 jQuery 中找到了 date-picker 。其实 django Admin中的日期选择还是不错的,不过它不是使用jQuery开发的,不过它支持 i18n 的处理。主要是有一个 jsi18n.js 文件其实是通过 view 生成的,它会根据你的状态(浏览器或i18n的配置)来生成字符串不同的 i18n 的对应。不过感觉它的使用不如 jQuery 方便,所以还是选择了 jQuery 的插件。

使用这个插件要下载两个东西,一个是date-picker.js,一个是style.css文件。其中style.css你要选取一下,因为它还包括整体的一些css设定,与date-picker.js关系不大。style.css中的 a.date-picker 需要一个图片,感觉 date-picker 中的不好看(这个你要单独下载,通过图片另存为),所以我使用了 django 中的图片,并且根据 shareplat 进行了修改。

使用 date-picker 很简单。分为以下几步(以SharePlat为例):

1. 在Html的head中加入js和css的引用

<script type="text/javascript" src="/site_media/js/calendar.js"></script>
<link href="/site_media/css/date-picker.css" rel="stylesheet" type="text/css" />

2. 在$(document).ready()中加入如下代码:

<script type="text/javascript">
$(document).ready(function(){
    $.datePicker.setDateFormat(‘ymd’,'-’);
    $.datePicker.setLanguageStrings(['日', '一', '二', '三', '四', '五', '六'],
 ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十-月', '十二月'],
 {p:’上一月’, n:’下一月’, c:’关闭’, b:’选择日期’}
);

    $(‘#date’).datePicker();
});

date-picker 可以有一些配置。

setDateFormat可以定年月日的显示和分隔符

setLanguageStrings可以设定日历的语言

然后$(‘#date’).datePicker()就可以自动在一个input元素后面生成一个链接(它显示为一个图标),当点击这个链接时,会弹出日期选择窗口,然后就可以选择了。

3. 设定对应的元素

<input id="date" type="text" name="date"/>

这里id的值是与上面的$(‘#date’)是匹配的。

2007年01月23日

今天看了看 Trac 中关于 custom field 的实现,我只是看了一下它的文档说明。它的实现挺简单的,需要在 Trac.ini 中配置一下custom字段,要说明类型,标签和属性。然后 trac 会将它们存在一个 ticket_custom 表中。我很想在 SharePlat 中实现类似的功能,原本是希望通过 pickle 来实现,不过如果希望可以通过查询来实现的话,还是象 trac 的方式要好一些。只不过看到后面的 SQL 语句复杂了些。

看到 1.1 的 trac 要使用 genshi 模板系统,于是上去看一看。不过 genshi 有些象kid,是以xml作为模板语言,可以嵌入python和sql代码。我想 django 的团队不会喜欢它。它的页面上有一个性能的比较。从比较结果上看,django 的除了比不上C的,还是很快的。而 genshi 要比 kid 快一些。但我想因为它们都是xml 格式的,解析上要复杂,而 django 的模板还是要简单得多,所以在性能上还是不错的。

我反正是不喜欢 xml 格式的模板系统了。

2007年01月18日

本工具是一个用于django的数据库备份和恢复的小工具。同时,在恢复时,它支持部分Model结构的变化,因此在某些情况下也可以用于数据库变化后的数据导入工作。

它的功能包括:备份和恢复。

备份功能

命令行::

Python db_dump.py [-svdh] [--settings] dump [applist]

applist 可以不填,则表示全部app都要dump出来,applist可以列出想要dump出来的列表,可以为一个或多个。

相关参数说明::

-s 表示输出结果显示在终端上,缺省为写入文件
-v 表示显示执行信息,缺省为不显示
-d 表示数据输出路径,缺省为当前目录下的 datadir 目录,如果不存在会自动创建
-h 显示帮助信息
–settings settings模块信息,缺省为当前目录下的settings.py

目前只支持生成Python格式。生成的格式是一个标准的Python模块,形如::

dump = {’table’: ‘tablename’, ‘records’: [[...]], ‘fields’: [...]}

其中table对应数据库的表名,records为结果,它是一个list的list结构,即每行记录是一个list。fields是每行记录对应的字段名。

恢复功能

命令行::

python db_dump.py [-svdrh] [--settings] load [applist]

相同的标志位参见上面的描述。其它的还有::

-r 表示是否在装入时不删除表中数据,缺省为先删除后装入

使用这个工具不仅可以恢复数据库,还可以应付简单的数据库的变化。它可以自动根据变化后的Model从备份数据中挑选相应的字段,同时还可以处理Model中的缺省值,如default参数和日期相关类形的auto_now和auto_now_add参数。而且你还可以手工修改备份数据文件,增加default域,对相应的字段指定缺省值,基本格式为:

‘defalt’:{’fieldname’:(‘type’, ‘value’)}

default域是一个字典,键值就是对应的字段名,它的值为一个二元的tuple。第一个为type域,表示值的类型,第二个为值。对于不同的类型,值的含义不同,列举出下:

———–   —————————   ——————————————————-
‘type’        ‘value’                       说明
———–   —————————   ——————————————————-
‘value’       值                            表示直接使用value域
‘reference’   引用字段名                    表示这个字段值将使用其它的字段值,适用于字段名发生变化
‘date’        ‘now’|'yyyy-mm-dd’            表示是一个日期类型,如果为now表示自动使用当前时间,如果
                                            不为’now’则值指定的日期值,它是一个字符串,有格式要求。

‘datetime’    ‘now’|'yyyy-mm-dd hh:mm:ss’   同上
———–   —————————   ——————————————————-

对于缺省值处理的策略时,先根据Model的定义来生成相关字段的缺省值,然后再根据数据文件中的default域来替换相应的值,即当两个地方(Model和数据文件)中对于一个字段都定义了缺省值时,则以数据文件中的为准。

根据缺省值的处理,基本上可以支持,象:改名,新增字段的处理。因此使用这个工具,可以相对简单地完成数据库的升级工作。

不过我未经过太充分的测试,而且后台数据库目前我只在sqlite下测试过。欢迎使用,并给出改进意见。

下载的话目前请从SharePlat的svn中取得。

svn http://cvs.woodpecker.org.cn/svn/woodpecker/SharePlat/trunk

此文档目前已经包含在 SharePlat/doc目录下。

2007年01月16日

Adrian 在 django 邮件列表中说:他创建了一个以newforms为基础的新的admin分支,详细信息可以从这里找到。不过,在实际的开发中,我基本上已经不使用admin的功能了,它基本上已经只是为了测试。在我的体会中,我越来越希望显示与管理功能显示在一起,因此象admin这样传统化的方式,同时它的管理方式也很难适合越来越个性化的需要。

不过随着newforms的大量采用,newforms的成熟度会迅速提高,那时可能就需要转向newforms了。

不过,我更希望新的admin在可重用性上下大功夫,而不是简单的加以个hook,而是功能的重用。因为现在的admin要想用到自已的应用中,基本上不可行。

2007年01月15日

今天在 jQuery 的邮件列表中发现新版本1.1发布了。在此之前我已经通过邮件列表知道它的API会有一些变化。在这篇Blog中有详细的版本升级的说明。

新版主要变化有:

  1. 速度提升 1.1的selector速度快了10到20倍 
  2. API的变化 
    :nth-child()现在从1开始,而不是从0开始
    .ancestors() 改为了 .parents()
    某些元素css的直接函数,如width(), top()等现在需要通过css(‘width’), css(‘top’)来访问了,css属性值有:width, height, top, left, position,float, overflow, color, background
    某些元素属性的直接函数,如id()等现在需要能过attr(‘id’)来访问,元素属性值有:id, title, name, href, src, rel
    以one和un开头的函数改为one(‘funcname’, fn)和unbind(‘funcname’, fn)的形式了
    具体的还是看上面的链接
  3. 使用attr或css时,可以传入一个函数了。这样对attr的统一处理有可能采用chainable的方式完成
  4. 可以给一个元素的text属性赋值,它与html的不同之处就是会对特殊字符进行转义
  5. 可以创建自已的过滤器
  6. 可以向 filter, find, not, siblings, parents, children, next, prev中传入以逗号分隔的selector列表,这样起到一种“或者”的关系
  7. 其它的还有象:可以在一个事件内部unbind自身;可以绑定只执行一次的事件,使用one

上面我列举得很简单,详细的还是请看blog。

同时因为从1.0.4升级到1.1有一些API的变化,因此有一个兼容性插件是可以考虑使用的。在这里。这个插件其实就是把1.1中没有的API又实现了一遍。在需要使用旧plugin时可以考虑使用。

随着1.1的发布,jQuery的网站也发生了效大的变化。

jQuery包的体积大小也由原来声称的15K改为19K了。

同时在Blog中说已经有一本关于jQuery的书正在写作之中,让我们拭目以待。

2007年01月13日

Twisted主要使用Trac来搭建,现在有一个新的页面了,挺漂亮:

相关的blog在这里。在新的0.11版trac,做定制界面的工作很简单了。

2007年01月12日

这是一个使用woodlog源码搭建的 django 的站点,一个德国人一天说想用我写的 woodlog 来搭建站点,他主要问了一些版权方面的问题,我说顺便,不留我的信息也行。大家可以访问看一看。虽然woodlog开发并不完善,但有人用多少让人很高兴。