August 18, 2008

80's Blog

在上海布道

这次又是去上海,还是一样的闪电,每次去上海都是看着夕阳落地,又踏着朝阳起飞.

这次在上海的RIAMeeting确实有点举办的比较仓促,包括场地以及其他的准备都不是很足,毕竟我们在上海还是第一回,没什么经验,而且地点选的的确有点偏,致使很多朋友有打电话来说来不了,而且会议的再加之周五的晚上狂风暴雨,好像是老天在给我们一个下马威,让我们别高兴的太早.

不过,见到了那些风雨无阻赶来参加的,让我们很是感动.而且还见到了很多老朋友(云开,dlee等等),看来上海的community还是很大,很多朋友都是很想参加这样的活动,只是一直没有这样的机会.

我要说的是RIAMeeting以及Adobe一直没有忘记上海的同志们,我们也在争取一切机会在上海做点事情.也希望大家能多支持我们,特别是上海的公司以及其他的组织能协助我们在上海举办类似的活动,促进技术的交流和引导社区的开发者.

一项好的技术,那么它的社区一定是贡献最大的,从很多的技术发展来看都是这样的.

最后希望那些想和RIAMeeting合作的公司和组织以及个人来联系我们.

相关日志


2008-08-18 05:57:07 CST

August 06, 2008

80's Blog

RIAMeeting[上海]第一次会议

RIAMeeting[上海]第一次会议
会议主题:Flex/AIR的实践应用
1.Integrate C++ code with AIR/Flex
2.Flex Menu in Windows style (e.g. the IE menu bar)
会议时间:2008年8月15日 19:00 - 21:00

具体情况和报名看这里:
http://www.riameeting.cn/?p=97

这也是RIAMeeting第一次在北京之外的地方举办类似的技术分享讨论会,希望大家多多支持也希望大家能多提意见,以便我们在以后改进和提高

相关日志


2008-08-06 08:29:24 CST

Limodou

InfoQ发表了关于Uliweb的采访

Python Web框架UliWeb开发进展

不是面对面的,简单的在线交流。

不过最近因为奥运,没什么进展,努力。
类别:Uliweb 查看评论

2008-08-06 00:00:00 CST

July 30, 2008

Gawain's Jail

电信的服务很不错

新家里要安装电话和宽带,小区是电信包的,但是我觉的网通我用的时间比较长了,可能工作起来也比较方便,另外打电话给10060套餐也要比电信的便宜一些。还咨询了所在小区能不能安装等等,最后10060告诉我在通州北苑的营业厅办理,后付费是要有北京人作保。于是就约好了哥们一起去。排了很长的队,办理时说:"您那个小区应该是在梨园办理,但是我们这里也能办",吾心稍安。又说:"对不起,您那个小区是电信的,我们安装不了。"

没办法,当即打10000给电信,说电话就可以办理,然后介绍了几个套餐,选了e家158的包月,并且告诉我2天后就上门安装。过了10几分钟又打电话过来让我选电话号码。又过了半个多小时打电话过来说还可以送无线路由。整个过程也不过1个小时的时间。

1天后就有安装工人打电话给我第二天上门安装,定好了时间,他们准时来,安装完了。工人还接通客服人员问我安装工人有没有按时到?进来的时候有没有带鞋套?送的无线路由送了没?给您的帐号试了没有,是不是XXXXXX?密码有没有更改?等等。

看来在北京选电信是一个好选择。

2008-07-30 02:42:19 CST

July 27, 2008

AlbertLee 's Blog

一个超酷的2D物理引擎,Haskell实现的

网站: http://wiki.slembcke.net/main/published/Chipmunk
看看几个Demo:
http://files.slembcke.net/chipmunk/movies/machine.mov
http://files.slembcke.net/chipmunk/movies/pyramid.mov

实在是太酷了。下载了它的XCode的一个demo程序,编译很顺畅,C和haskell库混合开发的。Chipmunk应该还有ruby等其他语言的接口。

2008-07-27 07:51:46 CST

HD 's Blog

强大的excel

近日需要大量的图表说明一系列的数据,要漂亮,而且需要复杂的表示方式,Numbers显然被Excel打败下来,总结起来有这样的功能缺失:
1.对于单种数据的不同图表形式的支持
2.对于第二个纵坐标轴的支持
3.图例的配置

唉。。。看来还是需要强大的excel呀,不过ms office 2008很容易出错,而且字体显示经常不稳定,也是一个很痛苦的事

2008-07-27 06:01:35 CST

July 23, 2008

Gawain's Jail

FreeBSD导致同事工作效率低下?

有一同事向我抱怨我使用的那台FreeBSD导致了他工作效率低下,比如他在Linux下调试正常的PHP在那台FreeBSD上却是失败的,而且那个vi也是让他相当恼火。

后来发现php里的代码是php4时代的的东东(主要是问号后面没有加上php),且是与html混写的。在他使用vi的时候发现,使他恼火的是不能向前删除。

就是这样,我还能说什么呢。安装一个vim吧。

2008-07-23 03:16:14 CST

July 21, 2008

Gawain's Jail

django admin的变化

今天从django的svn拉出一份出来写点东东,写好了models,runserver查看admin的时候却出现了如下提示

You don't have permission to edit anything
翻了一下文档,发现已经0.97的时候变化了很多的东东。最后说明是要这样写。
urls.py里写入
from django.contrib import admin
admin.autodiscover()

settings.py中的INSTALLED_APPS部分加入

 INSTALLED_APPS = (
    'django.contrib.admin')

models.py的最后要写上

from django.contrib import admin
admin.site.register(MODELNAME)

这样才算是OK。

2008-07-21 08:50:28 CST

July 18, 2008

80's Blog

关于memcached out of memory这个错误

http://www.ooso.net/index.php/archives/444
提到的问题,如果我没记错的话,我们在07年初开始部署Memcache的时候确实也有。我斗胆放出当时的一些修改记录。发现这个问题的是我的BOSS, 当时还没开始部署Memcache,BOSS在阅读源代码的时候发现了其中的问题,就如这篇日志所描述的,内存分配问题。

当时和我一起参与项目2位C高手对Memcache的内存分配代码做了一些修改,将MC的内存不均,改为定长分配内存。不过每次使用MC的时候都要根据所 设置数据的大小进行合理的修改,并重新MAKE安装以便使MC的内存可以充分使用完所设置的,不会像这篇日志所说的会有使不完但内存又不足的情况。局限性 就是不同的项目不能混用MC,否则内存容量就乱了。参与修改的是小马哥,和奶瓶,我是项目负责人,在完成项目后将修改做了详尽记录以便在部署MC的时候不 会出现遗漏。

在我们部门后来做的MDB上已经没有这个问题了,因为用的是BDB的内存管理。这些老资料基本已经无用了,因为我们都在使用MDB,纯的MC业务应该是没有了。

2Memcached定长版修改细节

1.修改assoc.c

A.修改HASHPOWER常量为24,使HASH数组最大长度达到FFFFFF

#define HASHPOWER 24

2.修改slabs.c

A.增加单条记录长度常量VDIR_SIZE定义,该值需要根据不同项目的占用存储空间进行修改

#define VDIR_SIZE 90

B.修改slabs_clsid函数,返回虚拟目录字节单条记录长度常量VDIR_CLSID

unsigned int slabs_clsid(size_t size) {

return SLABS_CLSID;

#if 0

int res = 1;

if(size==0)

return 0;

size–;

while(size >>= 1)

res++;

if (res < POWER_SMALLEST)

res = POWER_SMALLEST;

if (res > POWER_LARGEST)

#endif

}

C.修改slabs_init函数

slabclass[SLABS_CLSID].size = VDIR_SIZE;

slabclass[SLABS_CLSID].perslab = POWER_BLOCK / VDIR_SIZE;

D.修改POWER_BLOCK常量定义,该值需要根据不同项目的占用存储空间进行修改

#define POWER_BLOCK 1474560

E.增加内存片常量定义SLABS_CLSID

#define SLABS_CLSID 7

使用的话,要对上面设置的2组变量做数值修改,数值就是你所需要消耗的内存

12数据存储空间计算

存储在memcached中一条记录所占存储空间的 = 单条记录value内容所占字节数+记录KEY值所占字节数+32+2

例如:

本次项目,value内容占字节数为:

uid(11字节)+”;”(1字节)+m_vipuser(11字节) +”;”(1字节)+serverid(8字节)=32字节

KEY值最长为24字节。

单条记录在memcached所占存储空间:32+24+32+2=90字节

13POWER_BLOCK计算

POWER_BLOCK用来计算内存分页数,该数值计算方法为单条记录所占字节数与内存分块数(8192)的公倍数,该倍数接近1M为好。

例如:

本次项目,单条记录所占空间为90字节,与8192的最小公倍数1474560,小于1M,则POWER_BLOCK值为1474560

启动时要先设置环境变量,表示不需要预分配内存,memcached版本是1.1.3。

 

export T_MEMD_SLABS_ALLOC=0

 

随机日志


2008-07-18 08:33:24 CST

July 16, 2008

AlbertLee 's Blog

原来RAID0+1也是不保险的

之前的 slave 数据库死掉了,临下班时安排进行新的slave库重建。
停掉主mysql 后,把文件复制到从库主机上,然后就重启了主数据库服务器。重启中,因为已经超过220天没有fsck了,所以进行了自动扫描。
启动后,进入mysql,发现了一件令人惊愕的事情!我们的主运营数据库中一个表都没有了!查到原因发现,磁盘上mysql的目录中,那个主库的所有文件都消失了!我们的磁盘可是RAID0+1配置的啊,难道是 fsck的时候给搞丢了?

read more

2008-07-16 14:45:20 CST

Limodou

如何让web元素的生成更简单

做web不简单,特别是当你需要使用一些web效果的时候,比如显示个圆角矩形,提示框之类的,也许你认为很简单,好让我们分析一下:

1. 引用css。这可能是最常见的做法了,对一些特定的元素定义特定的样式。那么使用它,你需要在HTML页面中加入<link>标签。
2. 引入js。许多特效也可以通过javascript来进行处理,比如动态显示效果,或对元素进行封装。使用它你需要在HTML页面加入<script>标签,必要时还要加一些javascript代码。
3. HTML元素。需要设定一些特殊的属性,比如class=某个属性。这块还相对简单。

因此从上面的分析可以看出,在通常情况下,加入一个好看的web元素可能到许多地方的修改。因此我一直在思考如何让这个过程可以更简化,麻烦的地方就是如何处理这些资源,如何让这些资源可以与原始的HTML很好的结合呢?最终我想出的办法就是:代码组装。

对于css, javascript链接和代码,它们可以按调用的顺序依次拼成一段文本,然后插入到</head>元素前面。然后对于html代码,在模板中直接输出。对于css, javascript的链接可以检查是否重复。

那么如何定义web元素类和如何在模板中对其进行处理?

一个web元素类定义如下:

class Snippet(object):
    css = ''
    csslink = ''
    jslink = ''
    html = ''
    js = ''
   
    def render(self):
        return ''
   
    def __str__(self):
        return self.render()

定义为类属性的将输出到HTML的头部,而render()的结果将显示在模板中调用类的地方。先看一下在模板中调用的示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML Helper</title>
<script type="text/javascript" src="/static/js/jquery.js"></script>
</head>
<body>
{{
htmlbuf << htmlwidgets.Message('This is a test')
}}
</body>
</html>

这里你可以看到htmlbuf,它是什么,它就是用来采集每个Snippet类的类属性的。这里使用<<来将一个Snippet对象加到htmlbuf中去。同时它还会将Snippet的HTML代码在调用位置输出。

如何输出?首先uliweb的模板将转为python代码,它有一个内置的out对象,可以调用它的方法来输出HTML代码。那么htmlbuf对象将在调用模板前被创建,在调用模板后被处理,在创建时将传入out的write属性。这一切都是在SImpleFrame.py中通过plugin方法来实现的,但是这只是定义了一个调用点,如:

fname, code = template.render_file(filename, vars, env, dirs)
out = template.Out()
template._prepare_run(vars, env, out)
callplugin(self, 'before_render_template', env, out)

if isinstance(code, (str, unicode)):
    code = compile(code, fname, 'exec')
exec code in env, vars
text = out.getvalue()
output = execplugin(self, 'after_render_template', text, vars, env)

before_render_template 会在调用模板前被调用。after_render_template 会在调用模板后被调用。因此你可以通过plugin机制来加入额外的处理。这是在settings.py中定义的,如:

@plugin('before_render_template')
def before_render_template(sender, env, out):
    from uliweb.core import js
    from uliweb.core.SimpleFrame import url_for
    from uliweb.helpers import htmlwidgets
   
    htmlbuf = js.HtmlBuf(write=out.noescape, static_suffix=url_for('Portal.views.static', filename=''))
    env['htmlbuf'] = htmlbuf
    env['htmlwidgets'] = htmlwidgets

这里注入htmlbuf和htmlwidgets到模板的env环境中,所以可以在模板中直接使用。在htmlwidgets中已经定义了一些Snippet。htmlbuf在创建时,会使用out.noescape方法,它将不会对Snippet中的代码进行转义。static_suffix表示静态文件的前缀,缺省为/static/,这里由于使用了静态服务,所以通过url_for来得到静态URL前缀。
   
@plugin('after_render_template')
def after_render_template(sender, text, vars, env):
    import re
    r_links = re.compile('<link\s.*?\shref\s*=\s*"?(.*?)["\s>]|<script\s.*?\ssrc\s*=\s*"?(.*?)["\s>]', re.I)
    if 'htmlbuf' in env:
        htmlbuf = env['htmlbuf']
        if htmlbuf.modified:
            b = re.search('(?i)</head>', text)
            if b:
                pos = b.start()
                #find links
                links = [x or y for x, y in r_links.findall(text[:pos])]
                htmlbuf.remove_links(links)
                t = htmlbuf.render()
                if t:
                    return ''.join([text[:pos], t, text[pos:]])
            else:
                return t+text
    return text

这里将在模板处理完毕后查找生成的HTML文本中的</head>标签,然后将相应的信息插入到它的前面。同时这里增加了对原HTML中已经存在的链接进行了判断,如果存在则删除之,这是通过remove_links来处理的。

经过这些的处理,你只要定义一个Snippet,Uliweb将自动为你处理css, js的链接包括代码,和HTML代码的生成。因此你就可以简单的:

{{
htmlbuf << htmlwidgets.Message('This is a test')
}}

来生成一个消息的提示信息。

我会慢慢扩展这个htmlwidgets库。

再简单描述一下如何配置:

1. 在settings.py中

INSTALLED_APPS = ['Documents', 'Examples', 'Portal', 'Post',
    'uliweb.builtins.auth', 'uliweb.helpers.htmlwidgets']

这里要加入'uliweb.helpers.htmlwidgets',让static目录生效

2. 加入:

@plugin('before_render_template')
def before_render_template(sender, env, out):



@plugin('after_render_template')
def after_render_template(sender, text, vars, env):

3. 可以使用了。



类别:Uliweb 查看评论

2008-07-16 00:00:00 CST

July 15, 2008

80's Blog

[AOL China] Internship Flash Developer and Designer

Flash Application Developer&Designer [interns]

* BS degree or graduate school student in related areas

* Skillful in Flash programming(Developer & Designer). Can develop Flash AS 3.0 application independently.(Developer)

* Strong technical background and experience in GUI, flash, design/development projects(Developer & Designer)

* Practical graphic design and user interface skills (Designer)

* Experience with Java and web development environments is a must (Developer & Designer)

* Experience with XHTML and CSS

* Coding experience with C/C++ is required.

* Fluent in technical English reading and writing, oral English capability is a plus

Location:Beijing China

Contact is me Mengfei.Wen@corp.aol.com

由于设计和开发的要求只是在美术功底方面因此只写一个,相信对Flash熟悉的同学应该都可以自己理解。

关于语言,是由于项目中除了我说中文,其他项目组成员的母语都不是中文。

关于工作,这是一个很有意思的大项目,需要持续的研发,你的点子经过讨论和研究以后也会融入到产品中去,所以有创意就来试试吧。

关于intern的费用,我认为还是很多的,基本相当一个搜狐初级员工的工资了,我当时实习的时候就没这好事,呵呵

关于AOL,看这里:http://corp.aol.com/

另外请大家在给我发邮件的时候尽量将邮件标题写成:“[resume]”+yourname+position

 

相关日志


2008-07-15 10:00:06 CST

July 14, 2008

80's Blog

AOL.com for iPhone and iPod Touch

这是AOL专门为了iPhone和iPod Touch而优化设计的web页面,适合小屏幕的阅读。

With just one tap, find news, finance, entertainment and sports headlines. We’ve also included access to iPhone/iPod Touch-optimized AOL content such as Moviefone, horoscopes, local TV listings, food and more.

具体的请看这里,国内的搜狐新浪们可要抓紧了啊

访问 AOL.com for iPhone 请看用这个地址即可:iphone.aol.com

随机日志


2008-07-14 05:05:50 CST

Limodou

web2py的ORM将改为DAL

这是在web2py的邮件列表中看到的,线索在这里

为什么要改?因为web2py的ORM没有真正的类去对应记录。DAL(Database Abstraction Layer)的确适合它。Massimo也写了一个web2py的ORM与SQLAlchemy的比较,不过它比较的也是SQLAlchemy最底层的Metadata,而SQLAlchemy有自已的ORM的做法,同时还有一个Elixir的ORM工具。不过与Metadata比较的确也恰如其份。

同时看到Massimo的这则声明,再次表明了他维护向后兼容性的态度。我现在基本上不参与web2py的讨论了,就是平时看一看,现在看到邮件列表中比较多集中在了ORM这一块了。不过Massimo的态度让人对web2py的未来很悲观。我是不赞同他这种做法的,如果有好的东西我宁肯不兼容,有时需要破才能立。对于web2py的失望可能有以下几点:

1. 对向后兼容的理解。我的观点是必要时可以不兼容。
2. 对于跨app的互访。我希望app是项目组织的最小单位,而不是运行和部署的最小单位。
3. 对于零配置的理解。可以提供配置配置,但是并不坚持零配置,零配置只是一个理想,因为环境是多变的,如果你想适应它你将无法做到零配置,因为这将失去它的灵活性。
类别:心情故事 查看评论

2008-07-14 00:00:00 CST

July 10, 2008

Gawain's Jail

macport操作

macport是BSDer们在Mac下无法或缺的工具之一,其使用时支持的命令很多。罗列如下:

activate, archive, build, cat, cd, checksum, clean, compact, configure,
contents, deactivate, dependents, deps, destroot, dir, distcheck, dmg,
dpkg, echo, ed, edit, exit, extract, fetch, file, gohome, help, info,
install, installed, lint, list, livecheck, location, mdmg, mirror, mpkg,
outdated, patch, pkg, provides, quit, rpm, search, selfupdate, srpm,
submit, sync, test, trace, unarchive, uncompact, uninstall, upgrade,
url, usage, variants, version, work

但是最常用也就无非是install,selfupdate,upgrade,uninstall,search,list这几个。

其实macport还有一种叫伪名称的东东,罗列如下:

all, current, active, inactive, installed, uninstalled, and outdated.

以下是我常用的一些macport命令

port -d selfupdate #升级macport, 如同:cd /usr/ports && make update
port install xxx #安装xxx软件, 如同:cd /usr/ports/kkk/xxx && make install
port upgrade outdated #升级所有已过时的软件,作用如portupgrade -a
port installed #列出已经安装的软件,如pkg_info
port search xxx #列出与xxx条件相符的软件,如cd /usr/ports/ && make search name=xxx

2008-07-10 16:02:38 CST

80's Blog

2008年Flash视觉创意活动等待你参加

帮蓝色宣传,请大家踊跃参加

2008年Flash视觉创意活动

这是一场围绕Flash视觉创意展开的小小竞技。
这是一个展示自己的小小舞台。
这是一次加强Flasher间交流互动的小小尝试。

投稿时间

2008年7月10日——2008年8月10日

奖项设置
1、得奖者均将获得由人民邮电出版社友情提供的《Adobe Flex高级编程》书籍一本。
2、每个作品类别的第一名,将获得经典论坛 神秘奖品 一份。
3、从评论用户中随机抽取一位幸运用户,将获得《Adobe Flex高级编程》书一本。

具体的详情请看这里:

http://bbs.blueidea.com/thread-2870546-1-1.html

相关日志


2008-07-10 07:39:26 CST

一个奥运倒计时的widget

今天做一个基于yourminis的widget,是奥运倒计时的。
yourminis.com是一个基于goowy.com的widget平台,而goowy如果大家对Flash熟悉并感兴趣的话应该知道,goowy是最早提供web desktop以及Flash web mail应用服务的公司。

 


For more widgets please visit www.yourminis.com

点击右上角的copy me会出现以下画面:

noname-2.png

还可以下载AIR应用,也就是说你做了一个swf的widget后不仅可以嵌入自己的网站,还可以嵌入到facebook或者igoogle中,以及自动帮你生成一个AIR应用而不用你自己操心了。
除了这些yourminis还提供给开发者一套完善的API,可以让大家更好的开发自己的应用,如果大家想用第三方的API也没问题。
yourminis不仅提供API还可以帮您host widget,这样对这些创业公司的人来说成本就更低了,你只要专心做好自己的应用就可以了。

随机日志


2008-07-10 06:45:00 CST

July 09, 2008

80's Blog

Flash视频技术与应用主题讨论——RIAMeeting第七次会议

这次的会议的主题:
Flash视频技术与应用

时间:
2008年7月26日

地点:

北京市建国门外大街1号国贸中心西楼309-10室(Adobe系统软件(北京)有限公司)

会议日程:

13:30–14:00 签到时间

14:00-17:30 1 Dynamic Media & Flash Media Server 主讲:马鉴 7yue

17:40–18:00 Open Source Project Red5 主讲:Bill lee

18:00以后 分组讨论

请使用这个链接 http://www.riameeting.cn/register/ 报名

相关日志


2008-07-09 06:45:02 CST

Nicholas Ding

Long time no see, Hessian

Still remember the great company Caucho? Yes, it’s still alive. Besides its flagship product Resin, it also provides some open source libraries. Actually, there are 2 remoting libraries you can use. One is Burlap, and another is Hessian. Hessian is the binary protocol implementation of Burlap. Burlap is xml based RPC. That’s quick easy to use [...]

2008-07-09 01:40:00 CST

July 08, 2008

Nicholas Ding

Django namespaces hacks

今天把大概一年前写的 Django 程序拿出来做一些改进,主要这一年来 Django 做了重大升级,虽然兼容性非常不错,但是以前代码里面扩展 manage.py 的部分已经可以重写了,因为 Django 提供了 API 来进行扩展。 因为 Django 根据字符串形式的 namespace 来加载模块,所以我见过不少修改 manage.py,通过重新定义全局变量来修改 Django 设置的代码。我虽然也非常喜欢 hack Django 这个框架,但是我一定不喜欢去改 Django 本身的代码,尽可能通过外部修改来达到自己想要的功能。 trunk 中的 Django 版本提供了扩展 manage.py 的 Command 的 API,只需要在相应的 module 中加入 management/commands 目录,在 commands 下面创建多个 py 就可以得到扩展自定义命令的功能了。譬如加入 management/commands/mycommand.py,就可以通过 manage.py mycommand 来执行,非常的方便。我早起的程序通过修改 manage.py 本身来实现,现在完全可以升级一下了。 但是没想到出问题了,因为 namespace 的问题,Django 在搜索 commands 的方式上是通过 relative import 形式。但是我习惯性把 INSTALLED_APPS 这个变量中的 [...]

2008-07-08 09:17:46 CST

July 06, 2008

Limodou

一个强大的javascript ui库

http://mochaui.com/demo/

为什么说它强大,因为它使用了canvas来生成界面,这样许多原本需要CSS之类的都通过canvas绘制来实现了。现在我还不清楚如何使用它,但是通过它的demo可以看到可以在ie和ff下使用。

说不定这以后是一个潮流,让浏览器越来越象一个客户端,从而让前后台彻底分离,而且有可能使得开会越更简单?
类别:Web 查看评论

2008-07-06 00:00:00 CST

July 05, 2008

Gawain's Jail

RMS现在就像是一条疯狗

刚才看到RMS又在攻击比尔盖茨,实在觉的丫现在就和疯狗无二了。比尔把自己和自己的财富投入到慈善事业,这是对社会一种最好的回报,无论他是出于何种的目的那也是相当的正确的。RMS的这种攻击完全是对人不对事。相比之下我觉的比尔做的是实事儿,而RMS则陷在一堆的宗教论述里,让人觉到一股浓厚的中世纪气息。

要是真的无私就看看BSD或MIT协议吧,而不是GPL这样的病毒传播方式,反而限制了软件的推进。

另外对于私有软件不要以"软件大革命"的方式结束他,要以自然法则结束他。存在即合理,没有打倒,如果真的想打倒对方,就让自己强大到让对方无处生存。

2008-07-05 16:34:58 CST

July 04, 2008

Gawain's Jail

关于DNS Cache Flush

目前大多数的操作系统都有一个DNS Cache,在调整DNS或是测试的时候可能会清理Cache记录一下各个操作系统清理DNS Cache的方法

询问delphijFreeBSD有没有一个DNS Cache,答曰"有",就是ncsd。但是默认这个服务是没有开的,也就是没有Cache。

2008-07-04 02:10:32 CST

Limodou

现在Uliweb已经有用户注册和验证了

当然目前只能在本地试,我 使用的数据库是sqlite3。不过用户管理的界面很差,而且还没有加入对两次密码的比较,虽然比较简单,晚上加上。

好象当有异常时数据库会锁,不知道怎么回事,要好好研究一下,与session表有关。
类别:Uliweb 查看评论

2008-07-04 00:00:00 CST

SQLAlchemy的数据库迁移工具

昨天在SQLAlchemy的邮件列中发现一个叫 Miruku 的迁移工具,说是可以自动迁移,很感兴趣。因为Uliorm虽然也有,但是非常简单,还存在许多的问题。那么看了看它的实现,发现在创建表时,你也需要使用这个工具来创建,这样它会将表的结构保存在数据库中,然后下次更新时会进行比较。这种方式与web2py是差不多的,web2py也是保存表结构,不过它是放在日志中的。为什么需要这样呢?我在uliorm中是直接进行表字段的比较,但是发现,从数据库中反向转出来的与我定义的可能不同,比如sqlite数据库,它使用用SL作为开头,这样类名与原始的class不同因此很容易认为类型不同,后来我去掉了。所以我目前使用的是有些问题。

上面的方式虽然可以做得更好,但是多了存储和统一的调用。不过我现在想可能还是先卸载数据,然后再装回去可能更好。首先上面的解决方式仍然无法解决改名的问题,其次对于修改字段还是有部分的限制,因此我想可能还是我在django中写的那个dumpdb的工具可能更实用一些。
类别:Python 查看评论

2008-07-04 00:00:00 CST

July 03, 2008

Nicholas Ding

Flex Remoting

昨天开始看 Flex 相关的东西,打算把一个现有的 Python Web 应用前端逐渐转换成 Flex。向 咖啡屋的鼠标 了解了下 Flex 如何与后端应用通讯,知道了一个新的协议叫做 AMF,是 Flash/Flex 原生支持的 RPC 协议,而且用起来也要比 XML 方式更加简单。 正好又一个 Python 的实现叫做 PyAMF 可以做协议的解析,很不错!

2008-07-03 04:37:53 CST

HD 's Blog

ror的routes.rb的小记

今天在细心的调整Routes.rb的内容,发现:“很牛!很强大!”,也可以说:“很烦!很复杂!”

不过细细整理一下,把搞这东东时的一切调试方法记录下来。将来估计总得用。 :)

进控制台,搞出来一个Routes类:

./script/console

rs =ActionController::Routing::Routes

可以看看现在的内容:

puts rs.routes

试试一个url会怎么解析:

rs.recognize_path "/wo/niu/bi/wo/pa/shei"

如果你改了routes.rb中的内容,哪么在控制台需要重新加载:

load "config/routes.rb"

如果想知道自己设置的参数会生成的url:

rs.generate :controller=>"ni", :id=>"bu",:index=>"niu",:other="bi"

2008-07-03 00:46:28 CST

July 02, 2008

Limodou

Uliweb已经支持cache和session了

原本是想把django的session弄过来的,经jejwe的提示采用了pylons中的Beaker模块,它是一个独立的cache+session的模块,而且当你使用数据库是它可以使用SQLAlchemy来处理数据库。它支持几种后端,象文件,数据库,还有GAE。不过GAE的方式我还没有试。

不过关于它的文档实在是太少了,我还是看着pypi上的说明加上看程序来一点点摸索着做出来的。因为它主要用在pylons,而pylons主要是使用wsgi,所以它都是在environ的环境中进行信息的传递,而我采用的是Django的方式通过绑定到request中进行传递,所以不能直搬它的middleware。因为它的middleware是wsgi兼容的,不是django的方式。

经过改造,已经可以使用文件和数据库两种方式。目前它的配置我写在了GuestBook的settings.py中。在使用数据库时,它会自动判断是否有相应的表存在,如果不存在则自动创建。原来我一直在想如何避免这种判断,但是我想可能开销不会太大,所以感觉应该也没有什么问题。

在Examples中增加了两个例子,都是使用数据库的,不过是使用sqlite数据库。目前session和cache的数据库全部是独立配置,你可以配置与Uliorm的配置相同,也可以配置为不同的数据库,这样的话的确很灵活。但是它也不会受到事务中间件的控制了,因为连接是不同的,不过这个问题应该不大。但是这样部署到GAE上就有问题了,因为不管是文件也好,数据库也好GAE还不支持,不过GAE的方式倒是可以试一试。

目前cache和session的使用还有些粗糙,还有待改进。同时象数据库的连接是将用户名,口令写在连接字符串上,这样不太安全,回头改成其它的形式。

下一步增加一个简单的用户认证功能。这样Uliweb的功能就完整了。
类别:Uliweb 查看评论

2008-07-02 00:00:00 CST

June 30, 2008

Limodou

增加了transaction管理的Middleware

它的功能与Django中的一样,增加后,当一个view在处理失败时会自动回滚,当成功时会自动commit。

它的处理机制主要是利用了SQLAlchemy中的transacation的机制,文件见网站的内容

这里有几个要点:

1. 通过engine.connect()每次可以得到新的连接,每个连接都可以创建事务,并且支持嵌套事务,以最外层的为准。缺省是自动提交,即执行一条SQL就自动提交。

2. connectionless执行的概念,这一点非常重要。在执行SQLAlchemy语句时有两种方式:

engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())

这是有连接的执行,因为是通过连接的execute来执行sql语句。

engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()

这是无连接的执行,因为你没有使用一个连接,因此它会动态创建连接。

因此不注意你可能就使用了无连接的执行,这样是无法在一个事务中进行控制的。

但是如果都去创建连接也挺麻烦的,所以SQLAlchemy支持ThreadLocal的连接。

3. 在创建engine时指定strategy='threadlocal'参数,这样会自动创建一个线程局部的连接,这样对于无连接的执行会自动缺省使用这个连接,这样在处理事务时,只要使用engine对象来操作就行了。如:

db = create_engine(connection, strategy='threadlocal')
db.begin()
try:
    dosomething()
except:
    db.rollback()
else:
    db.commit()

4. 如果局部有些处理仍然不想在全局的事务控制之下怎么办呢?那么可以按第一点,创建一个新的连接就行了。

Uliweb以前没有考虑到这一点,因此使用的是不带strategy='threadlocal'参数的,并且在处理时是使用了无连接的执行,因此会无法放在一个事务中。现在已经改过来了。

同时增加了一个事务管理的Middleware。只要放在MIDDLEWARE_CLASSES中就行了。不过在特别情况下你要考虑Middleware的排列顺序,因为如果有些操作你是在Middleware中执行的,但如果事务管理中间件放在了它前面,这样它将不受事务管理插件的控制。

注意uliweb在执行中间件时,对于请求处理,是按插件的排列顺序从前向后执行的,在处理响应和异常时则是从后向前,正好相反,这个处理与Django是一致的。
类别:Uliweb 查看评论

2008-06-30 00:00:00 CST

发现werkzeug的模块也不能用在GAE上

其实在Uliweb中我并没有使用werkzeug的template,不过我用到它的DebuggedApplication,结果它要使用模板,但是这个模板使用了compiler模块,而它不能在GAE上使用。所以我只好禁掉了在GAE上的调试显示功能。
类别:Uliweb 查看评论

2008-06-30 00:00:00 CST

Uliorm今天换到SQLAlchemy上去了

今天把Uliorm移植到了SQLAlchemy上去了,geniusql去掉了。没有我想象得那么难。目前功能上没有太大的变化。文档也修改了。同时又调整了目录结构,将webob, werkzeug, sqlalchemy放到了lib目录下,不过它们对你的应用没有影响。
类别:Uliweb 查看评论

2008-06-30 00:00:00 CST

June 28, 2008

Limodou

数据库的自动迁移也很困难

今天看了web2py的数据库迁移的处理,原来它是在第一次创建表时将记录写入日志文件,然后下次在比较时是与日志文件中的字段进行的比较,原来以为是自动将表信息取出然后进行的比较,看来不是。

并且看了sqlite3的文档,现在支持Add, Rename,但是不支持删除。而且对于新加的字段还有一些限制。所以自动迁移至少对于sqlite3来说是存在问题的。感觉最好的方式还是备份数据,然后修改表结构,再恢复数据。这样问题很少,只不过如果数据量很大的话可能要考虑一下,如果数据库不大还是很方便的。
类别:Uliweb 查看评论

2008-06-28 00:00:00 CST

ORM做起来很难

一直还在想ORM的事。Geniusql用的人太少,而且以后真要改的话比较麻烦,于是眼光又放到了SA上去了。SA只能说还是有些复杂,不信去看文档吧,文档多全,几乎什么都给你做了。感觉更适合直接用,而不是基于它做封装。文件太多,逻辑也复杂。web2py的也想试,但是代码的确感觉不太好,不模块化。又到网站搜索了一下有关db方面的Python的库。一些ORM的还算新,但是一些只是SQL封装的就比较旧的。不过看到好几个都有Ian Banking的名字,象SQLObject, SimpleQL,SQLBuilder。其中SQLBuilder很早了,而且是与SQLObject中的差不多。而SImpleQL是05年的,使用了generator表达式,简单看了一下程序是使用ast来作的,与Genuisql差不多,都是通过语法解析来实现。从形式上接近Python的语法,不过相应的也比较复杂。

一个ORM应该考虑些什么呢?

* 数据库的连接
* 表的创建,修改
* 基本操作,如:select, delete, update
* 事务处理

当然象SQLAlchemy,Django之类的考虑得更多,连数据的缓冲等都考虑了。真正等你的数据量大到一定程序,你很有可能就不会使用ORM了。我想ORM可能对于小项目和通用性强的项目可能更有用。上面的处理不同的数据源其细节都有所不同,所以ORM要处理得好要考虑这方方面面的事,的确很麻烦。反正是没找到让我很满意的,还是先用Geniusql吧。如果你不喜欢,乐意用什么就用什么吧。

现在想一想为什么PHP+MySQL很流行,原因很多,但至少不用学什么ORM可能是一个优势,你想想,虽然没有ORM,但是可用的环境基本上都是MySQL的,跟有ORM也差不多了。
类别:Uliweb 查看评论

2008-06-28 00:00:00 CST

今天把Firefox升到了3.0

看到一篇调查说了现在许多人都升到了3.0上,于是我也升了一下。记得在3.0beta4时我升过一次,但是有许多的插件好象还不支持,所以又退了回去。这次一升级好象好多了,IE的插件有新的。其它的象SuperDragAndGo有问题,还有象TabMix有问题,还有其它的,不过还是升了。TabMix不行就用FF自已的。而SuperDragAndGo有些遗憾,不过发现可以将URL拖到tab栏上就行了,虽然路径长了点但是功能可以保留还不错。

不过遇到一个问题就是有些Cookie不知道是失效了还是清除了,原本自动登录的不起作用了,害得我试了半天的密码,终于试对了。好麻烦。
类别:心情故事 查看评论

2008-06-28 00:00:00 CST

June 27, 2008

HD 's Blog

rails的复数获取

呵呵,有时我们会困惑于rails的复数会最终会是什么样子的。哪么console中专门给了点有意思的方法:

./script/console
>> "account".pluralize

这样就得到了复数的形式 :)

2008-06-27 12:57:33 CST

在多个版本的rails间切换

实在受不了2.x的rails了,必竟还是要快完成手头的事了,所以需要切回旧有的rails版本,发现gem有一个--version的参数,以这样的方法使用:

gem install rails --version=1.2.6 --include-dependencies

这样就切回1.2.6版本了 :)

2008-06-27 12:17:28 CST

Limodou

uliwebproject已经换成了YAML了

这是新的页面效果:


我是直接使用Simple Project Source和Builder创建的,Two Columns Layout。不过css导航我改掉了,换成了Inline Mini Tabs。感觉效果不错。这样当窗口变化时页面也会变化。
类别:Uliweb 查看评论

2008-06-27 00:00:00 CST

有趣的YAML

这里的YAML可不是用来做序列化的yaml,它是一个CSS的模板,就象blueprintcss一样。不过与blueprintcss不同,它采用是Flexible布局的控制,而不是固定的网格。说实在的,我对CSS不是很精通。但是通过试验,使用Flexible布局的控制在页面大小发生变化时可以自动变化,而固定网格则不会变。也许你认为没什么用,不过象对于使用宽屏的显示器,这种方式可以使用网页扩得足够大,感觉要好于固定网格。所以我打算把uliwebproject的css换成它的。

发现YAML是在Smashing Magnize的一篇Blog中发现的。在YAML的网站上有一篇文档是PDF格式的,讲得很详细,不过比较长,我可能更关心怎么使用它。在下载的YAML的源码包中已经有不少例子了,可以直接参考。另外它提供了一个Builder的工具,的确做得不做,可以动态进行设计,可视化做得很好。看到它使用了jquery的东西。

那么如何使用生成的结果呢?在YAML的网站上有一个Simple Project Source的下载,它是一个示例。下载后压解到一个目录下。然后把Builder工具生成的文件按对应的目录和文件放到Simple Project Source中对应的目录下进行覆盖就行了。

还没有更多的心得。
类别:Web 查看评论

2008-06-27 00:00:00 CST

June 26, 2008

Limodou

什么样的人不欢迎订阅python-cn邮件列表

因为现在python-cn邮件列表订阅人员已经接近5000人,每天平均起来邮件竟然可以达到180封,这数目可不少。同时也经常发生退订的情况,但是这些喊着退订的人知道怎么订,但不知道怎么退。所以:

* 如果你的邮箱太小,请不要订阅,因为很快会撑得你受不了。 当然还有别的方法,比如在会员修改处改为无邮件,这样也一样收不到邮件。
* 订阅时如果不仔细阅读订阅须知,并认真回答提出的问题,对不起基本上都无法通过。写几个字没什么,至少可以证明你可能不是一个spamer。如果被拒只好怪自已不认真了,再重新读过须知填入订阅理由吧。
* 如果你不懂Python也请不要订,因为除了Python也没什么好聊的,不是聊天的地方。
* 如果你不会退订也请先试成功了再订,不然还要麻烦管理员,还是行行好,别订了吧。


类别:心情故事 查看评论

2008-06-26 00:00:00 CST

增加了一篇关于view的文档

粘在这里。

视图

作者: Limodou <limodou@gmail.com>

在Uliweb中,视图(view)相当于MVC框架中的Controller。

1    view模块的定义

在Uliweb中,在一个app的目录下,所有以views开头的文件都将被视为视图标块。当你不使用集中的 URL管理的时候,Uliweb会自动将所有有效的app的视图文件在启动时进行导入,其目前就是为了搜集 所有的URL的定义。因此,只要你按规则进行定义文件名,在其中定义的URL就可以被自动发现。因此象: views.py, views_about.py都是合法的view模块。

2    view函数的定义

在Uliweb中,一个简单的view函数可以定义为:

def index():
    pass

可以看到,它就是一个普通的函数。目前对于view函数,你只能使用普通的函数,而不能使用类。 每个view函数都应与一个或多个URL定义相匹配,一个完整的view定义如下:

@expose('/index')
def index():
    pass

如果一个view函数没有expose来修饰的话,它将不会被用户所访问。

expose后面是可以没有参数的,如:

@expose
def index():
    pass

那么这个时候,一个view函数的URL将被定义为:

/Appname/view_module_name/view_function_name

它是由app的名字,view模块名和view函数名组成的。这就是缺省的URL映射,已经很象是MVC的缺 省映射了。

3    view函数的参数

view函数是可以有参数的,但首先你需要先在它的URL中定义参数,如果URL中有参数,则view中就 要定义参数,如果没有则view中一般也没有。带参数的例子:

@expose('/documents/<lang>/<path:filename>')
def show_document(filename, lang):
    return _show(request, response, filename, env, lang, False)

关于URL的参数定义,参见 URL映射 的文档。这里可以看出,定义了两个参数: lang和filename,所以在下面的view函数中也定义了两个参数。

但如果你的URL中没有那么多的参数怎么办?这个可以在URL的定义中解决,如:

@expose('/documents/<path:filename>', defaults={'lang':''})
@expose('/documents/<lang>/<path:filename>')
def show_document(filename, lang):
    return _show(request, response, filename, env, lang, False)

则在第一个URL的定义中,只有一个filename参数,因此可以使用defaults来定义缺省参数。

4    view的环境

在Uliweb中,一个view函数是运行在某种环境中的,当需要调用view函数时,在调用前,我会向 函数的func_globals属性中注入一些对象,这些对象就可以直接在函数中使用了,你不再需要导入。 目前可用的对象有:

  • application 这是Uliweb的实例,你可以用它来访问应用的各种属性,如:application.debug 表示是否处于调用状态,还可以通过它来调用一些方法,如:application.template()来处理模 板。当然直接导入template也是可以的。不过application.template()已经预设了环境进去。

  • request 请求对象。

  • response 应答对象。这个对象在传入时是一个空对象,你可以使用它,也可以自行构造一个Response 的对象进行返回。目前Uliweb是缺省使用webob的Response类,你也可以使用werkzeug的Response 类。

  • url_for 它是与expose是相反的,它用来生根据view函数生成反向的URL。详情见 URL映射 的文档。

  • redirect 用于重定义处理,后面为一个URL信息。在它的前面不需要return,因为它会抛出异常并 被Uliweb所处理。

  • error 用于输出错误信息,它将自动查找出错页面。你只要在任何app下的templates中增加 error.html,然后出错信息可以自已来定制。它也不需要前面加return,也将抛出一个异常。

  • config 是定义在所有有效的app settings.py文件中的配置项。注意,一个配置项的名称必须是 大写的。

  • env 这是可扩展的环境,它只保存公共的对象,目前缺省为:

    • url_for 同上
    • redirect 同上
    • error 同上
    • url_map 它是所有URL定义汇总的类,是werkzeug的Map对象
    • render 功能同template,但是缺省设置了env的环境,因此env中的对象都可以在模板中直接 使用。同时它将返回一个Response对象,而不是渲染后的结果。
    • template 同上。也是包含了evn的环境,只是不返回Response对象,而是渲染后的结果。
    • config 同上
    • html 它是werkzeug提供的生成HTML代码的库
    • xhtml 它是werkzeug提供的生成XHTML代码的库
    • Form 用于对数据校验和生成相应的HTML代码的库
    • get_file 可以获得某个目录下的文件。它是将所有app看成一个整体,首先在当前app中 查找(需要传入request对象),然后再到其它的app中查找。缺省是在files目录下查找, 可以换成其它的目录。

有了这个环境,你就可以直接使用许多的对象。其中env是一个字典,但是你可以使用env.Form的 形式,它等同于env['Form']。

5    view环境的扩展

如果你认为上面的环境还不够,那么你可以直接向env中增加新的对象,然后在view方法中可以通过 env.object的方式来使用它。你需要在某个app的settings.py文件中增加相应的插件处理。如:

from uliweb.core.plugin import plugin
@plugin('prepare_default_env')
def prepare_default_env(sender, env):
    from uliweb.utils.textconvert import text2html
    env['text2html'] = text2html

Uliweb中已经定义了 prepare_default_env 这个plugin的插入点,你可以直接使用它。它的 作用就是向env中增加新的对象,如上面是增加了一个新的函数可以用来将文本转为HTML代码。

6    view的返回

在Uliweb中,view函数可以返回多种类型的结果。可能为:

  • dict 变量。如果返回一个dict的变量,说明你希望由Uliweb自动套用一个模板,这个模板需要在 templates目录下,并且模板的文件名需要与view函数名相同,后缀为.html。如果你希望使用指 定的模板文件,则需要利用response对象,将指定的模板名赋给response.template属性就行了。
  • response 对象。记得上面说过的吗?你可以直接使用response对象,比如调用它的response.write() 方法来写入返回的内容。
  • 字符串。你可以直接返回一个字符串,这样将被封装为一个普通的文本返回。
  • Reseponse实例。你可以主动创建一个Response的实例并返回。

在某些情况下,你可以调用象redirect, error来中止view的运行。

7    view模块的入口处理

我建议将不同的view函数按照功能和处理分为不同的文件来存放。

Uliweb支持一种view模块的入口的处理。即你可以在view模块中定义名为 __begin__ 的特殊的 方法,它没有参数,但是就象普通的view函数一样,也是在view环境中运行的。一旦view模块中存 在这个特殊的方法,在执行每个view函数之前都会先调用这个函数。因此你可以把它理解为初始化处 理,比如给一些对象赋值。


类别:Uliweb 查看评论

2008-06-26 00:00:00 CST

June 25, 2008

HYRY 's Blog

能动噪声控制 - 测量系统响应

在做具体的算法实验之前,先来测量一下实验装置的脉冲响应。在获得系统的脉冲响应之后,也可以先在PC上做Offline算法测试。关于实验装置的介绍请参看: 能动噪声控制 - 实验装置

我们用下面的系统框图来描述此实验装置中的各个声音回路,其中



这些传递函数包括扬声器和麦克风的特性在内。为了测量B,C的脉冲响应,可以让噪声抑制扬声器播放TSP信号,然后分别对误差麦克风和噪声麦克风所获取的声音信号进行分析,计算出B和C的脉冲响应。详细方法请参看:用TSP信号测量系统的脉冲响应

因为P为两个麦克风之间的传递函数,这里无法使用TSP信号测量其脉冲响应。因此我采用自适应滤波器算法(NLMS)来测量它。具体做法如下:

  1. 从噪声扬声器播放白色噪声
  2. 假设噪声麦克风和误差麦克风的输入为x, y
  3. 让x通过自适应滤波器得到输出d
  4. 计算误差e = d - y
  5. 用误差e更新自适应滤波器的系数,使得误差e逐渐减少
  6. 当e稳定地小于一定的数值时,我们可以认为自适应滤波器同定了传递函数P
  7. 这时的自适应滤波器的系数就是P的脉冲响应

通过以上两种方法分别对P, B, C进行测量,得到如下结果

这个结果很有些意思,让我们来分析一下:

B和C的响应时间较长,其频谱在220Hz附近出现峰值。这个峰值应该是由于管道的固有频率引起的,我们可以将其理解为:扬声器所输出的声音中,220Hz的成分很容易在管道中传递。
误差麦克风虽然离扬声器比较近,但是其获取的信号没有噪声麦克风强。这是因为噪声麦克风位于管内,更容易获取管道中的各种反射的声音。

P则是一个比较单纯的延时系统,没有看到共振频率。这是因为两个麦克风都会获取共振信号,相互抵消。并且噪声麦克风获取的共振信号较强,因此P的频率响应在220Hz附近出现一个谷底。

我们看到B和C在3.5kHz以上有较高能量,这是因为我采用的低延迟DAC不能够对输出信号进行插值运算所导致的。

本文介绍的所有步骤都是在6713DSK上实现的,我将结果保存在DSP的内存中,然后通过CCS的data输出功能将结果保存到文件中,文件的格式如下,每一行都是一个32bit的HEX值:

1651 1 1e38 0 200
0x3D23C8EC
0x3C183F0C
0xBC340353
....

为了能快速处理这样的数据,我写了一个Python的小程序自动将其转换为浮点数,并绘制频谱图:

import sys
from struct import *
from binascii import *
import pylab
from numpy import *
from Tkinter import *
import glob
import os.path
files = glob.glob("*.dat")

def draw(filename):
    def _plot():
        r = []
        for line in file(filename):
            if line.startswith("0x"):
                line = line.strip()
                s = unhexlify(line[2:])
                x = unpack(">f", s)[0]
                r.append(x)
        file(filename + ".txt","w").write(",\n".join([str(x) for x in r]))        
        pylab.subplot(211)
        pylab.plot(r)
        R = 10*log10(abs(fft.fft(r)))[:len(r)/2+1]
        F = linspace(0, 4000, len(r)/2+1)
        title.append(os.path.splitext(filename)[0])
        pylab.title(title)
        pylab.xlim(0, 512)
        pylab.xlabel("Sample (8kHz sampling rate)")
        pylab.grid(True)
        pylab.subplot(212)
        pylab.plot(F,R)
        pylab.grid(True)
        pylab.xlabel("Frequency (Hz)")
        pylab.show()
    return _plot


root = Tk()
for f in files:
    b = Button(root, text=f, command=draw(f))
    b.pack()
mainloop()

2008-06-25 22:09:14 CST

80's Blog

CSDN(SD俱乐部第4期)下一代用户体验设计

前几天在CSDN的一个活动上的演讲,主要是介绍Silverlight以及IE8的,我是负责最后面的一部分。大家如果人没去又对这些技术感兴趣的,可以直接观看视频以及下载PDF的演讲稿

下面是CSDN网站的活动回顾页面

http://211.100.26.82/CSDN_Live/200/silverlight.htm

相关日志


2008-06-25 06:28:05 CST

Limodou

原来path与regex是一样的

今天在#pocoo中问了一个关于werkzeug的问题,就是有没有一个支持正则式的converter,回答是没有必要。于是我把我写的一个converter告诉他,但是他说path就可以了。于是试了试,结果发现果然如此,原来是没有看清楚正则式,少看了一个'.'。这样我把Uliweb中的regex这个新写的converter删除了,全部改成了path,一切正常。所以如果已经有人使用了regex,请改为path。

如:原来写为

@expose('/static/<regex(".*$"):filename>')

现在应该写为:

@expose('/static/<path:filename>')

类别:Uliweb 查看评论

2008-06-25 00:00:00 CST

Ulipad IRC channel

我一直不喜欢使用irc,因为端口受限制。不过现在有许多web irc网站,可以直接通过浏览器来访问。有一个叫Chester Dunn的外国朋友,帮我在Freenode.net上建了一个,如果你感兴趣可以上去找到#ulipad,与我一起交流Ulipad。http://www.mibbit.com/ 是一个web的irc网站很不错,找到服务器,然后输入channel就可以进入了,很方便。
类别:Ulipad 查看评论

2008-06-25 00:00:00 CST

有趣的ohloh

前几天注册了facebook试了试,中文的好慢,我也不认识什么人。后来看到洪波搞了一个 5gsns 的sns的站点,正式上线的,说是IT圈内的人士,上去注册了一个,结果是完全使用facebook的界面,人已经不少的,不过没几个认识的。

今天查东西发现了一个叫ohloh的网站,是一个外国的网站,它很有趣。

它主要是进行开源项目的挖掘的,具体我还不太懂,不过你可以看到许多的开源项目,贡献者名单,项目的提交请况,它还可以分析你的项目的质量,如注释的百分比。功能还挺多,而且大量使用了jquery。

后来又找到一个叫gravatar的网站,它是用来专门提供头像的,挺有趣。ohloh就是使用了这个网站的服务来提供头像。看来国外的网站分工很细,而且复用度很高。

上面查了查有Ulipad,还没有Uliweb,于是注册了用户,加了些信息。有兴趣可以去上面搜一下。

ohloh的网站还提供了一些视频的说明,可以看一下它的功能,感觉操作性,界面都不错。更适合开源开发者使用。
类别:Uliweb 查看评论

2008-06-25 00:00:00 CST

June 24, 2008

AlbertLee 's Blog

SeaSide/Magritte 与 Zope/CMF 的比较

除了 Continuation这一点区别外, SeaSide 和 Zope 很像。
而 Magritte 相对于Seaside的关系就有点类似 CMF 与Zope的关系。

Seaside与Zope的相似点:

1. 两者都是web应用服务器,都可以独立运行,且自带对象持久层
Zope使用 Zodb对象数据库,而seaside则把对象直接就可以smalltalk虚拟机的镜像中, 同时也可以像Zope那样用对象型数据库 GOODS (Generic Object Oriented Database System)

2. 两者都可以在页面上进行配置管理

read more

2008-06-24 15:39:34 CST

SeaSide挽救了我对于OOP以及Web开发的信心

我真的不喜欢web开发,事实上,我一直对各种各样的连接,POST来的数据检查,页面的跳转,乱七八糟的状态等等心存怨念。同样的,对于OOP我的感觉也不好,为什么呢?因为人们用OOP来处理web的尝试创建了大量的框架,可是她们不好用,至少不自然,没有别的,就是觉得很不自然。
这是OOP的错还是Web的错?

read more

2008-06-24 05:11:11 CST

80's Blog

Python的小工具,使用PHP的序列化数据

PHP可以使用serialize将对象 数组等任何值转化为序列化格式字符串存储到文本,内存,数据库中,unserialize可以将序列化数据还原为对象和变量。
Python的这个开源库可以帮助Python将Python的dict,list等转化为PHP的序列化格式,或将PHP的序列化格式还原为Python对应的数据格式。
http://hurring.com/scott/code/python/serialize/

相关日志


2008-06-24 03:11:34 CST

Limodou

增加集中的URL管理支持

今天完成了对集中式URL的管理支持。那么你可以在apps目录下创建一个ursl.py的文件,如果uliweb在启动时可以导入,则会直接使用它,同时所有的expose将自动失效。

并且为了方便生成这个文件,Uliweb还提供了一个新的命令extracturls,它可以自动将view模块中的所有url定义取出来,生成urls.py文件,这样你可以在生成的urls.py基础上进行修改了。不过我简单测试了一下,好象两种方式在速度上差不多。

集中方式对复用app不是很方便。

同时还增加了当处于调试状态,即你在某个settings.py中设置了DEBUG=True时,如果找不到文件将显示页面不存在的信息,同时会列出已经定义的url的信息供参考。
类别:Uliweb 查看评论

2008-06-24 00:00:00 CST

对静态文件服务函数作了修订

目前Uliweb的静态文件服务只是通过对url的匹配来得到对应的文件名,这样有人的确可以通过使用相对路径来找到其它的文件,因此我对它进行了修订,在得到一个文件名时将通过os.path.normpath来进行处理,这时将去掉所有的相对路径,然后对绝对路径进行比较,必须保证文件是在/static目录下的,如果不是则报错。这样应该将对其它的文件进行保护。
类别:Uliweb 查看评论

2008-06-24 00:00:00 CST

June 22, 2008

Limodou

想发展文档先行

今天忙了一天的文档工作,主要是想把Uliweb做成中英文兼容的站,所以现在把以前写的中文文档都要改成英文的,虽然英文不乍地,不过先写吧,老外朋友们能看懂多少就看懂多少,感觉jejwe的建议不错,吸引外国朋友比较靠谱,为什么这么说呢?因为从Ulipad就可以看出来,从对项目的贡献程度来说,外国朋友做出的贡献的确比国内要多,也许Uliweb可以吸引一些外国朋友。所以文档要先准备好才好吸引它们。Uliweb与Ulipad不同,前者是一个web框架,是用来做二次开发的,因此需要大量的文档。而Ulipad只是一个工具,不需要进行二次开发,所以只是使用,文档相对简单。

还有两篇中文的没有改成英文的,都比较长。然后就是要将文档尽量补全一些,象View, Template, ORM等,还有象扩展的东西,再把webob的request, response的文档加进来,至少可以开始开发了。

还有象cache, session, 数据库的事务,这些如果弄好了,可以考虑发布个版本先了。希望可以赶在Django 1.0发布之前。也许还可以把ORM的多对多加进去。
类别:Uliweb 查看评论

2008-06-22 00:00:00 CST

Uliweb中增加Fastcgi和cgi包括scgi的支持

这块工作是由头太晕(网名)完成的,已经加入Uliweb代码中,感谢。

他已经进行过测试,不久应该有配置文档的说明。
类别:Uliweb 查看评论

2008-06-22 00:00:00 CST

增加Uliweb文档中的语言自动切换能力

以后以英文的文档为主,看只否可以吸引国外的朋友参与。

因此现在支持中文和英文,缺省进入后将自动判断浏览器的环境,选择合适的语言,如果没有匹配的,则使用英文文档。

在文档的首页有链接可以切换中文还是英文。然后这个切换将存放到cookie中,因此整站都将使用这个cookie了。

同时向application对象增加template函数,以方便使用application的环境。
类别:Uliweb 查看评论

2008-06-22 00:00:00 CST

June 21, 2008

Limodou

增加URL映射的文档

文档内容详见: http://uliwebproject.appspot.com/documents/url_mapping

主要描述expose和url_for的使用,及url的定义。
类别:Uliweb 查看评论

2008-06-21 00:00:00 CST

把Uliweb的介绍改了一下,现在看上去比较好了,贴在这里

Uliweb 简介

它是什么

Uliweb是一个新的Python Web Framework,它之所以会产生是因为现有的框架多少有些令人 不满意的地方,而且许多情况下这些不满意的地方或多或少对我开发Web有影响,因此在经过对 不少框架的学习之后,我绝定开发一个新的框架,希望可以综合我认为其它框架中尽可能多的 优点,同时使这个新的框架尽可能的简单,易于上手和使用。

这个项目是由Limodou <limodou@gmail.com>发起并创建的。其中得到了许多人的帮助。

License

Uliweb按照GPL v2进行发布。

基础组件

它并不完全是从头写的一个东西,我目前使用了一些库,如:

  • Werkzeug 用它来进行框架的核心处理,比如:命令行, URL Mapping,Debug等。
  • webob 用它来生成Request, Response对象的生 成和处理。
  • geniusql 基于它封装了Uliorm,可以使用ORM对 数据库进行处理。

还有一些比较小的引用,如:

  • template 是从 web2py 改造来的
  • 部分处理代码从 Django 中借鉴

另外还有一些是自已新造的,如:

  • Form处理,可以用来生成HTML代码和对上传的数据进行校验
  • i18n处理,包括对模板的处理
  • Uliorm,是在geniusql基础之上进行的封装,同时参考了GAE中的datastore的代码
  • 框架的处理代码,这块不可能不自已造了
  • 插件机制,从Ulipad中移植并进行了改造

功能特点

  • 组织管理

    • 采用MVT模型开发。
    • 分散开发统一管理。采用App方式的项目组织。每个App有自已的配置文件,templates目录, static目录。使得Uliweb的App重用非常方便。同时在使用上却可以将所有App看成一个整体, 可以相互引用静态文件和模板。缺省是所有App都是生效的,也可以指定哪些App是生效的。 所有生效App的配置文件在启动时会统一进行处理,最终合成一个完整的配置视图。
  • URL处理

    • 灵活强大的URL映射。采用Werkzeug的Routing模块,可以非常方便地定义URL,并与View函数 进行绑定。同时可以根据view函数反向生成URL。支持URL参数定义,支持缺省URL定义,如:

      appname/view_module/function_name
  • View与Template

    • View模板的自动套用。当view返回dict对象时,自动根据view函数的名字查找对应的模板。
    • 环境方式运行。每个view函数在运行时会处于一个环境下,因此你不必写许多的import,许多 对象可以直接使用,比如request, response等。可以大大减少代码量。
    • 模板中可以直接嵌入Python代码,不需要考虑缩近,只要在块结束时使用pass。支持模板的 include和继承。
  • ORM

    • 支持Model与数据库的自动迁移,包括自动建表和表结构的修改。
  • i18n

    • 支持代码和模板中的i18n处理
    • 支持浏览器语言和cookie的自动选择,动态切换语言
    • 提供命令行工具可以自动提取po文件,可以以App为单位或整个项目为单位。并在处理时自动将 所有语言文件进行合并处理。当发生修改时,再次提取可以自动进行合并。
  • 扩展

    • plugin扩展。这是一种插件处理机制。Uliweb已经预设了一些调用点,这些调用点会在特殊的地方 被执行。你可以针对这些调用点编写相应的处理,并且将其放在settings.py中,当Uliweb在启动 时会自动对其进行采集,当程序运行到调用点位置时,自动调用对应的插件函数。
    • middleware扩展。它与Django的机制完全类似。你可以在配置文件中配置middleware类。每个 middleware可以处理请求和响应对象。
    • views模块的初始化处理。在views模块中,如果你写了一个名为__begin__的函数,它将在执行 要处理的view函数之前被处理,它相当于一个入口。因此你可以在这里面做一些模块级别的处理, 比如检查用户的权限。因此建议你根据功能将view函数分到不同的模块中。
  • 命令行工具

    • 可以导出一个干净的工作环境
    • App的创建,会自动包含必要的目录结构,文件和代码
    • 静态文件导出,可以将所有生效的App下的static导出到一个统一的目录
    • 启动开发服务器
  • 部署

    • 支持GAE部署
    • 支持Apache下的mod_wsgi部署
  • 开发

    • 提供开发服务器,并当代码修改时自动装载修改的模块
    • 提供debug功能,可以查看出错的代码,包括模板中的错误
  • 其它

    • Uliweb是一个Demo与源码合二为一的项目。它不仅包括所有核心代码,还同时包括了 uliwebproject 网站的源码,同时还有其它 的一些Demo,所以你可以直接使用这些代码。
    • 对于静态文件的支持可以处理HTTP_IF_MODIFIED_SINCE和trunk方式的静态文件处理。

项目目标

  • 开发一个简单易用的框架
  • 框架要足够灵活,并易于扩展
  • 包含足够的示例代码
  • 编写清晰易懂的文档
  • 能够在多种环境下使用

类别:Uliweb 查看评论

2008-06-21 00:00:00 CST

June 20, 2008

Nicholas Ding

半年来的 Facebook 实践

看了 Robbin 写的 我为什么鼓吹facebook,为什么唱衰OpenSocial? 这篇文章之后感触良多。这半年来做的网站也就如 Robbin 提及的一样,我们从 Facebook 带来了主要的流量。 在接触 Facebook 之前,我就听说过 OpenSocial,那时候对 SNS 不是很感兴趣,于是没有深入研究过 OpenSocial。半年前我的合伙人应该看到了 Facebook 平台的成功,于是制定了新的开发计划。先立足与 Facebook,开发几个 Facebook 小程序来吸引用户,随后把这些用户引导到我们网站上来。 谈到 Facebook 的小程序,不得不说的 Viral Marketing 如果做 Facebook 小程序,那么无庸置疑,取得用户是最关键的,所以我们需要看一下 Facebook 平台提供什么样的方式让我们能接触到用户。这里不得不提到 Viral Marketing,光是用户喜欢还不行,我们需要让用户把他喜欢的东西告诉他的朋友,通过这样实现流量的提升。那么具体有大概几种方式呢? 1. 发送邀请 发送邀请成为了一个非常简单的功能,Facebook 提供的 FBML 有预定义的标签,很方便的做这个事情,通过两个标签,并且不需要任何编码,就可以实现下面的邀请页面,让你很方便的将这个程序推广给你的好友们。 2. Newsfeed Newsfeed 让你知道你周围发生的事情,譬如我的一个朋友同时也做了 “IQ 测试”,并且分数不错,那么显然她希望别人知道或者了解这样一件事情。那么简单的很,Facebook 让你发送 Newsfeed,这样作为她的朋友,我的首页上面就会出现我的朋友进行了 IQ 测试这么一个 Newsfeed,如果我感兴趣的话,我也可以去试一试。 Newsfeed 可以使用图片,一张设计精美的图片和有趣的文字会让人对这个小程序更感兴趣。因为 Newsfeed 同时存在与 Profile 页面,所以有时候浏览朋友的页面,顺便看到有趣的 Feed 也会让人有试一试的冲动。 3. Notification 通过邀请和 Newsfeed 我们已经可以有一定的用户基础了,但是玩过这个小程序之后可能用户就放着了。某天如果我们更新了小程序,加了新功能,或者是我们希望在今后与用户互动,我们该怎么做呢?虽然 Facebook 处于安全考虑,不会提供用户的 [...]

2008-06-20 10:39:44 CST

Python 核心编程第二版

《Python 核心编程》第二版总算要出了,这本是一个振奋人心的消息,毕竟有超过 10 位以上的 Python 爱好者一起合作翻译了这本书,能够翻译完这本长达 1000 页的 Python 巨著,这是非常不容易的。 最早是在 《Core Python Programming》(中文第二版)有奖书评活动 看到这个消息的,里面的链接指向 CPUG 的推广页,打开就能看到清风同学帅气的照片了 :D。不过仔细一看译者却另有其人,封皮上赫然写着“宋吉广”,但这本书可是 CPUG 组织翻译的啊,为什么译者却另有其人了呢? 看一下 China-pub 中此书的序言部分,可以很有意思的看到贡献者列表,但正是这些贡献者们完成了本书超过 90% 以上的翻译任务。 这本书的翻译开始与 2007 年 10 月份,针对这个翻译 CPUG 还专门成立了名为 OpenBookProject 的小组。就在这个小组上,依然可以看到当时开始启动《Python 核心编程》翻译项目的页面,Py核心编程第二版翻译工程倡议!。翻译项目启动之后收到了非常多 Pythoner 的支持,CPUG 的老大 Zoom.Quiet 更是带头参与。现在在啄木鸟社区依然可以看到这个主题页面。 这本书的翻译可以说历时 3 个月左右吧,判随严格的审校制度,质量得到了保证。在啄木鸟的页面 审校计划 里面可以看到所有的参与者以及参与审校的朋友们,大家付出了很多的心血保证这次翻译的完成,在这份邮件里面,可以看到项目在 12 月出总算胜利结束了。 但是随着翻译结束,关于此书的消息就一直没有下文了,没人知道这本书什么时候会出版,这本书也没有作为 PDF 在网上流传。但目前这本书却已经在市面上开始销售了,并且译者也不再是 CPUG 所熟悉的名字,我大概看了一下 CSDN 在网上提供的示例章节,并且对比 OpenBookProject 中此书的翻译,我的直觉告诉我,这些翻译就是来自 CPUG 的朋友们,没有他们的努力,这本书不可能完成。 但是还是这个译者的问题,列表中的 CorePy 就是宋吉广,为什么他当初匿名参与,不愿意透露自己的身份,再者,为什么出版的时候他就以自己的名字作为译者,将广大参与翻译的 [...]

2008-06-20 07:29:10 CST

AlbertLee 's Blog

windows上MogileFS 的python api兼容问题

mogilefs 的python接口文件是第三方提供的,在windows下执行会无法连接Backend,跟踪了下代码,修改了两处, diff 如下:

176c176,179
                 sock.sendall(req, self.FLAG_NOSIGNAL)
---
>                 if os.name =='nt': # by LEE
>                     sock.sendall(req)
>                 else:
>                     sock.sendall(req, self.FLAG_NOSIGNAL)
189c192,195
                 sock.sendall(req, self.FLAG_NOSIGNAL)
---
>                 if os.name == 'nt': # by LEE
>                     sock.sendall(req)

read more

2008-06-20 02:55:01 CST

Limodou

GAE的处理很难尽如人意

关于它的限制挺多的,比如不能写文件,创建线程,进程,不能创建socket,许多C模块使用受限,甚至于python自带的都受限。因为这个原因,Geniusql无法用在GAE上。

在开发Uliweb时还发现,向__builtin__注册的内容无效。我写的i18n的LazyString不知道为什么用着有问题。而在开发和apache下都挺正常。
类别:Uliweb 查看评论

2008-06-20 00:00:00 CST