Monthly Archives: 09月 2007

本系统完成用户数据与Django-auth的整合

抛弃原有用户模型、使用Django的用户、权限模型。数据迁移平稳,移植成功。涉及修改的有View,Decolator以及部分Template。 TODO是加上UserProfile,以及开始考虑帮捞捞把家搬到这里。还有最好可以加个手机日志,好让俺在旅游的时候可以。。嘿。。

Posted in 其他 | Leave a comment

erlang印象初步

关键字:面向并发编程、函数式编程、高性能、适用有超大型并发需求的系统。 Erlang又一种古老的东西被翻炒,目前来讲也是渐渐热起来了。其实Erlang的确是个好东西,一直被用在电信行业的编程语言在现在受关注的原因其中一个可能是现代计算机的进化,多核计算机的出现,面向并发编程语言的优势也一下子体现出来了。 由于之前对函数式编程(Functional programing)有了解,俺搞过Haskell滴,还有Python天生的对FP的支持(其实说不上是FP,仅仅是函数也是对象,可以作参数传递罢了),目前很容易接受Erlang所声明的那一些好处:无共享的进程、进程间靠消息进行通讯、变量不可变、无副作用的函数式编程、调试容易、热部署。 学习Erlang,需要学习的东西不见得比学习当前流行的语言多。天生语言级别的并发编程机制减免了去学习所谓的多线程、锁、等待等等这些东西,而且在“顺序化”的编程语言(如Java,C,Python,Ruby)里面的东西,Erlang里面只有几种:变量,相当于我们说的常量;if语句;case语句。想要循环?不好意思,没有,你自己写个高阶函数来实现吧,很简单。 Erlang的基本数据类型有整型、浮点型、原子型、引用、二进制数、Pid、端口、匿名函数。复合数据类型只有元组及列表。列表可以想象成一个数组,元组是一个不可变的列表。且慢。。那没有字符串吗?呃。。[83,117,114,112,114,105,115,101]. 这一串东西其实就是"Surprise",字符串相当于一个字符列表(跟C的概念有点类似)。这些数据类型,需要去适应的是原子型和匿名函数(如果你不熟悉FP),还有就是另一个概念:模式与项的匹配。在Erlang的世界里,等号不是简单的赋值符号,而是代配着一种匹配,简单地理解等号左边的是模式、右边的是项。尝试一下去看下面一些匹配,很容易明白。当然你硬要认为这是赋值,那其实也有一点成立,但这不是全部(赋值发生在匹配成功的时候): Pattern                                 Term                                                        Result {X,abc}                                  {123,abc}                                                Succeeds X → 123 {X,Y,Z}                                   {222,def,"cat"}                                       Succeeds X → 222, Y → … Continue reading

Posted in 其他 | Leave a comment

上天保佑加班的人

我进公司以来最长的加班纪录也仅仅是去到第二天中午,然后下午不睡觉,等着公司的开年饭。但是今天Allen破了我的纪录。第二天又是下班时间了,还没搞定,严酷的PM,幸还是不幸?可能是想着中午能回去休息,貌似Allen没有叫中午饭,当我看到正是重感冒着、感情处于困扰状态、又没吃饭的Allen和他桌面上的一只待吃月饼的时候,不禁悲从中来。 我已经有一段时间没有带Allen。也许现在正是该让校讯通的洪水磨练的时候?不知道。当然Allen,你要成长,尽量争取不加班。心酸及无奈不能言表,甚至未能问候你一句,但底下还是祝你一切安好。 我的加班岁月,已不堪回首。看到有人在不断的重复这样的情况,无论如何,我心有戚戚焉。但愿上天保佑加班的人。

Posted in 其他 | Leave a comment

Django的中间件

中间件的名堂听起来很大。但在Django里面,中间件实际上就是一个过滤器(像Java的Servlet里面的Filter)。如果你需要在一个请求到来之后、View函数调用之前、在响应给客户端之前和View函数抛出异常的时候做些什么事情,那么你可以自己写一个中间件。 Django中间件必须是一个类,并实现四个接口,也就是必须提供四个方法: process_request(self, request),只有一个请求作为参数,该方法在请求到来的时候调用。 process_view(self ,request, fnc , arg ,kwarg),在本次将要执行的View函数被调用前调用本函数。第一个参数为请求,二为将要执行的View函数实例,arg与kwarg分别为参数元组及参数字典。 process_response(self,request,response),在执行完View函数准备将响应发到客户端前被执行。 process_exception(self,request, exception). View函数在抛出异常时该函数被调用,得到的exception参数是实际上抛出的异常实例。通过此方法可以进行很好的错误控制,提供友好的用户界面。 官方指南: 一、中间件不需要继承任何类 二、你的中间件可以放在任何一个地方,当然前提是在Python的Path当中。Django只要在settings.py的MIDDLEWARE_CLASSES中找到它就可以了。 三、可以参考Django现有的中间件。 四、如果你写了些有用的中间件又觉得可以给其他人用,欢迎提交到Django,Django将考虑把它加入项目。

Posted in 其他 | Leave a comment

Are you listening?

Are u listening? 2007 solo debut from the former Cranberries vocalist. Written and recorded in Dublin and Canada and featuring production from Dan Broadbeck and acclaimed musician/producer Youth, whose many production credits include Paul McCartney and U2. The album was … Continue reading

Posted in 其他 | Leave a comment

少年故事

所有的故事,从夏天开始。 我在彭坦的第一个单飞专辑刚出来之后就开始听,一直听到现在快两个月的时间。昨天晚上回到家里就在不停地Replay《少年故事》,唱呀弹呀,一直到临睡前都满脑子是这首歌词。我想,我是否应该告诉大家,让大家也去听一下了。 当国内的音乐到处冲斥着那些恶心的流行歌的时候,当许魏、朴树、那班曾经的先摇们安安静静的时候。彭坦的这张专辑的出现改变了我整个夏天的感觉。歌声还是达达时代的歌声,可音乐已仅仅属于彭坦一个人的,那么纯净,那么自然。我自己固然不是乐评,对于音乐评论豪无任何权威和能力可言,我只是相信自己的耳朵,我的确喜欢这张很英伦Feel的专辑,很喜欢他的歌词,很美。打开音箱,可以让自己整晚沉醉在这个专辑里面,听吧: 你是否,依然在这里,安静地等待着,你是否,依然在那里,冰冷地,燃烧着。《灯塔》 所有的故事,从夏天开始,弹起梦中人,写在烟灰缸,什么是理想,什么是忧伤,都飞出窗外,随着风飘荡。。。。。《少年故事》 当我望向远方,忽隐忽现的光,我汪洋中的灯塔,这漆黑里的向往,除了忧伤都很美,美得让人醉,没有什么,可以失去,就让我漫无边际地飞。。《走马灯》 除了歌词很美,旋律也很直接简单,并且悦耳。编曲整体偏英论风格。专辑中每一首我都是印象深刻,难得。推荐。

Posted in 其他 | Leave a comment

Bug!Bug?Bug…..

又遇到了灵异事件。。Django的ORM。orz. 昨天对Blog的程序进行了优化。见前一篇文章,因于文章分类允许为Null导致查询文章列表时(列表需要显示分类名)Select_related不起作用引发了1+N问题,所以我把Null=True去掉。减却了多余的N条查询。但是奇怪的事情发生了,我从早上开始发觉,首页列表的作者变成了Blog的Title。但代码明明是{{entry.author.name}}!我改成其他属性试下,依然是Print出Blog的其他属性。我回想昨天更新做过的改动,撒销均无效。最后想起会不会是因为改了Model的属性引起的,于是我把分类的Null=True加上。果然!显示正常了。这是为什么呢?不解!缓存?没可能吧? 我是不可能再把分类的Null=true保留的,因为实践证明这样对性能损耗太大。但不加上又出现属性值错乱的情况。怎么办?最后我作了个尝试,我把Model里面的属性调换了一下位置,原来Author在Catelog下方: catelog = models.ForeignKey(Catelog,verbose_name=’分类’) author = models.ForeignKey(Account,verbose_name=’作者’) 现在改回来,Author写在Catelog上方。显示正常。My god! author = models.ForeignKey(Account,verbose_name=’作者’) catelog = models.ForeignKey(Catelog,verbose_name=’分类’) 这是我的程序的Bug?还是Django的Bug?还是我的Bug?我想这个解决的办法不是好办法。 我拿到三种情况的Sql。一是分类为Null的查询,二是分类为NotNull的查询,三是分类为NotNull且Author属性排在Catelog前面的查询。结果是第一和第三种情况blog_account_name所在的列位置是一样的。这是否说明Django的确是记住查询结果的位置并且缓存起来了?但缓存到哪里了呢?如果刷新呢?

Posted in 其他 | Leave a comment

Django也会智能Lazyload?

今天在本地很快实现了最新评论的功能。在右手边的最新评论点击连接时会去到文章的页面,并定位到评论所在的锚点上,也就是说,我需要在页面上取得评论所在文章的ID,也就是需要这样:{{comment.comment_to.id}}。这时候,我仅仅需要获得文章的ID,但不知道Django是否会到数据库去把相应的文章查出来(我没有使用Select_relate)之后再拿ID呢?不过Django好现没有可以设置打印执行Sql语句的开关,并不能通过配置来看到运行时Django查了多少次数据库。而这样的功能,我使用Java的Hibernate时就有的。 我Google了一下,发现Django本身是没有提供日志和Sql打印功能的。而有人做了些工作,如这位仁兄写了个中间件,可以在页面上打印出该次请求一共执行了多少条语句,每条语句的执行时间。而这里有个叫Django-logging的项目,为Django提供Logging,包括Sql的打印。等会就试验一下。Django天生就是Lazyload的,需要用到数据的时候才去加载,我希望,我的担心是多余的。一会尝试使用Log来看看测试结果吧。 结果一:Select_related对允许为空的外键不起作用。 我的查询语句是这样:entries = blog.entry_set.filter(status=1).select_related(depth=1).order_by(‘-id’) 查询一个Blog下面所有的Entry,并把有关联的数据一并抓取出来(根据ForeignKey)。也就是说,在查询Entry的同时查出Blog,作者,分类等信息。 但是情况是,我在页面找印这些文章的时候,需要把文章的分类也打显示出来,这时候,Django却跑到数据库执行了N次查询分类的语句。暴汗。这是经典的Hibernate的延迟加载用得不恰当的情况啊!我一看打印出来的查询语句,有查相关的作者、Blog,但偏偏没有查分类。最后我回到Model里比较了一下,我的分类属性上面设置了null=true,原意是让文章可以没有分类。最后我尝试着去掉Null=true,一运行。那N条查询不见了。靠。。原来Select_related在外键允许空的情况下是行不通D。 结果二:Django不会智能LazyLoad。要手动去Select_related。 回到对Django有疑问的情景,recent_comments = Comment.objects.filter(blog=blog).order_by(‘-comment_time’)[:10] 查出本BLog最新的十条评论。我的假设是,Comment本身保存有Entry的ID,所以在仅仅是获取Entry的ID的时候不需要去数据据里找,Hibernate的LazyLoad就是这样做的,使用动态代理的解决方案。我想在Python这样的动态语言的解决方案更佳,但事实证明我错了。上面的语句又产生了经典的1+N的问题。我在页面根据评论取EntryID的时候{{comment.entry.id}}还是去加载了一次数据,搞笑的是,这句查询需要得到的数据对我有用的是ID,但是查询条件就是ID。我只好把查询语句改成: recent_comments = Comment.objects.select_related(depth=1).filter(blog=blog).order_by(‘-comment_time’)[:10]。显示去Select_related。宁愿直接去Join相关的表,也不要做1+ N的查询。显然这很浪费,仅仅为了一个ID,要Join好几个表。

Posted in 其他 | Leave a comment

WYMeditor

WYMeditor。又一个RichText editor,我怎么说又呢?猛地看上去我以为又一个HtmlArea或者FCKeditor或者Tinymce。看到Demo和features才知道,这东西蛮有个性的。打算在本站使用一下的。Features: 完全兼容XHTML strict + CSS 没有Font,你不能对字体颜色、大小,字体对进调整,WYMeditor是基于CSS的 被设计用来易于与你的应用相结合 不需安装,100%的Javascript代码,无插件,无扩展 很简单的Javascript代码,很易懂 继续保持简单 我们致力于测试友好的代码,保证新功能的稳定性及有效性 图像、连接、表格支持 通过CSS支持皮肤 免费并且开源,完全适合你的需要 N小时后。 测评结果: 一、很固执,wymeditor.js一定要位于一个名叫wymeditor的文件夹下面,不然一律罢工,报错XmlHelper找不到,这个问题很怪异也很变态,花了我好多时间才找到原因。 二、提交时不更新TextArea的内容,要手动写程序或者在Submit的Button指定Class为wymupdate,我试过第二种方法,由于我的Button还需要使用Onclick方法,没戏。这样很变态。 三、指定CSS的时候,要按规则对CSS进行注释,偶笨,不得法,注释的CSS搞得整个Editor出错不能用。 总的来说,指导思想很好(What You See Is What You Mean),只是目前处于Beta阶段。我还是先使用最熟悉的FCK吧。等待Wymeditor的成熟!

Posted in 其他 | Leave a comment

放弃Mod_fastcgi+apache?

尝试了一晚上,Apache没有重启成功。Mod_fastcgi在2003年的时候就已停止了开发。那时只是支持到Apache2.0.X版,现在使用的都2.2.X了,官方虽然提供了一个Patch,但我本地没有C编译环境,于是不了了之。此外,Fastcgi本身有些问题,线程出问题的时候可能关闭不了,不过中国(没有错吧?)有人解决了这个问题,那是另一个项目“fcgid”。用这个可以直接代替Fcgi。 寻找另一种部署FastCGI的方式。。lighttpd?

Posted in 其他 | Leave a comment