django的论坛app

在django的资源页面里有个第三方论坛app的比较页面Django Forum Apps Comparison。一眼望过去,可用的app还不真不少,数下了有15个之多。但真正看下来,似乎很难找到一个让人满意的。
我对论坛app的要求是:

  1. 得要自带一个还比较漂亮的界面模板。
    模板的开发工作在django应用的开发中占了很大的比重,甚至可能比写python代码花的时间还多。可惜的是很多的app应用甚至连个最基础的demo模板都没带。
  2. 最好支持Richeditor和BBCode。
    支持BBCode的app还是有几个的。Richeditor的支持基本上属于模板的范畴,参考条目1,似乎还没看到支持Richeditor的论坛(注:我没每个app都看,不能确定,pybb默认模板带了个Markup的编辑器)。
  3. 支持附件。
    国内的论坛应用大多偏娱乐,用户喜欢在自己的帖子里插入图片等东西。虽然可以再单独提供一个上传附件的组件,让用户上传后再在论坛里引用,但用户体验就要差不少了。

既然找不到满意的app,那就只能自己动手做了。目前计划在pybb(注:pybb的许可协议没看太懂,似乎是类似BSD的)的基础上进行开发。目前的开发计划如下:

  1. 先给项目换个新名字LBForum
  2. 换个漂亮些的模板(同时增加richeditor)
    考虑过不少模板。

    • phpbb3 目前最流行的开源论坛程序,css和html写得很不错。但似乎有些复杂了,套用起来有些麻烦。
    • phpbb2/javaeye/jforum 这几论坛程序都长得差不多,UI应当都是参照phpbb2(javaeye的老大自己说了javaeye的界面就是仿phpbb3)来做的。其实也不能说这几个论坛的模板有什么不好。更多的是不喜欢里面过多的table。
    • discuz5 不是太喜欢discuz7的界面。discuz5(springside常用的那款界面)的界面感觉清爽些,但改了些后发现里面的html和css写的实在不怎么样。
    • fluxbb 目前打算用她的模板了。界面给人的感觉不错,html和css写得挺好。界面够简单,要套用模板应当不会太困难。
  3. 增强附件功能
    虽然pybb提供了附件的支持,但功能还是比较弱。
  4. 增加一个公共的个人信息模块
    pybb已提供了一个保存用户个人信息的功能,但通常这些信息会是整个工程所共享的。我觉得这些信息还是单独放到一个专有的app里比较好。这个app可以以代码的方式包括的工程里,需要增加个人信息的时候直接修改model代码。

后记

最后还是选择了完全从头进行开发。pybb里面可以用的东西不多,而且他的开发思路和我还是有些分歧。

JdbcTemplate之BeanPropertyRowMapper

Spring的JdbcTemplate无疑极大的简化了JDBC操作。只是查询出的数据都直接放在MAP里。想要直接从数据库里直接查询出对象的朋友不免要有些失望。

这写天本想给JdbcTemplate做个扩展,让JdbcTemplate自动绑定对象。等写得差不多的时候,很不幸的发现自己只是重复造轮子而已。Spring已经自带了比较完善的解决方案,通过BeanPropertyRowMapper自动绑定数据库的列到对象。BeanPropertyRowMapper的绑定规则是,FiledName相同的绑定,如果绑定失败,将尝试将hiVik转换成hi_vik查找数据库的列。

如果需要查询出一个包含YouVO对象的List只需要做如下操作就可以了。

List objList = DbHelper.getJdbcTemplate().query(sql, new Object[]{}, new BeanPropertyRowMapper(YouVO.class));

java的类ROR框架Play!

Play!一个类ROR的java框架。和Grails不同的是,Play!没有用Groovy等脚本技术进行扩展。直接使用java技术,这对java程序员来说要亲切很多,而且推广阻力也相应的会小不少。

最近简单的了解Play!,感觉确实是挺有意思的一个东西。Play!作为ROR“仿制品”,在开发思想方面和ROR还是比较接近。Play!本身提供了不少开发相关的辅助命令。使用命令创建出的新工程直接就可以运行了。相比之下,基于ssh的开发,光是脚手架的搭建就得费不少事。

数据模型方面使用JPA定义数据对象,直接从对象生成数据库。这点和django比较像,这也是比较符合我开发习惯的一个做法。

模板方面和Django类似,支持模板的继承。Django模板的继承给我的体验很好。jsp页面虽然可以使用include实现复用,但对于结构相似的页面依旧需要重复的include。Sitemesh虽然可以实现类似django模板的功能但看到那繁琐的配置我就撤了。

总的来说Play!给我的印象还是挺不错的,希望在日后的工作中可以用到。

其他

Play!的FAQ里有一个解答让我挺印象深刻的。其中有关于为什么使用不符合java规范的play做包名的说明。play!本身就是一个平台,运行在play!上的东西都将是符合play!规范的,所以不必为play这个包名而计较。play!专注于web的敏捷开发,为了适应web敏捷的需要一些无伤大雅的“另类”做法也是未尝不可的。想自己在某些情况下对代码还是有些所谓的“洁癖”。在django开发的时候喜欢在自己的app外面还要另外加一层包,而这种做法在一定程度上是不符合django做法的(django的app名必须唯一,即使上层的包名不同也没用)。

搭建自己的Twitter网页客户端

Twitter网页客户端都封得差不多了,于是决定在自己主机上搭个Twitter网页客户端。本想自己写个简单的,不过看到Rabr后立马打消了这个想法。

Rabr是一个用PHP写的Twitter网页客户端,具备基础的Twitter功能,而且界面漂亮。

作者还是用Rabr搭了个演示站点。虽说是演示站点,但普通用户已经可以通过这个站点登录自己的twitter了。

不过我觉得这样的东西搭建好后最好还是自己用就好,不然搞不好莫名其妙的就被封,那就不好玩了。

GAE&Rabr

很早以前就听说可以使用JAVA的PHP库在GAE上使用PHP程序。所以特意将Rabr部署到了GAE,可惜没有顺利的跑起来。提示GAE对java.net.Proxy做了限制。去看了quercus(java的php引擎)的代码,似乎可以将Proxy去掉。改天对quercus修改看看。

参考阅读

如果你想用python开发一个twitter客户端可以看看http://code.google.com/p/python-twitter/,twitter api的python封装。

川西-云南 记录(九) END

很早就看到有人说,做过一次背包旅行后就很容易爱上旅行。虽然这次的旅行有太多的不完美,但我已经喜欢上了这样的旅行。去不同的地方看不同的风景,了解不同的人,不同的生活,同时也了解自己。

一路上可以认识很多和自己一样旅行的朋友。在平时的生活中或许有很多的不如意和困惑,但至少在此时可以暂时的将烦恼抛开。

如果可能,我想今年或来年秋天去一次雨崩,看看这次错过的梅里雪山。

川西-云南 记录(八) 丽江.大理.昆明.END

07-31 虎跳峡->丽江

早上坐最早的一班客车赶到丽江。就如在路上听说的那样,丽江就如一个大公园,里面全是人。密密麻麻的仿古建筑,商品里卖着一些哪里都能买到的“特色”商品。此外还遇到了一些不太愉快的事,让我感觉除非特殊原因,不然这个地方绝不再来。

丽江到了晚上才真正热闹起来。酒吧里人头攒动,那些期待艳遇的姑娘小伙子们也都活跃起来。不过我相信这个地方除真正的416外,交易肯定也是广泛存在的。

08-01 丽江->大理->昆明

由于和其他兄弟的安排不太一致,我独自去了大理。在去大理之前没有查好大理的攻略,所以只安排了去洱海的计划。大理不大,从火车站走到洱海只需要30分钟。

在大理我还第一次看到了风力发电机。风力发电机矗立在远处的高山上。

晚上坐上去昆明的火车,离开大理。

08-02 昆明

昆明,旅行的终点站。本想去滇池看看,但听说现在的滇池已经很臭了。于是在昆明几乎哪一没去。

川西-云南 记录(七) 虎跳峡

07-29 中甸->虎跳峡

最终还是决定去虎跳峡了,这个决定或许并不比去雨崩好多少。

由于我错误的记成了虎跳徒步的最佳路线是中虎跳到下虎跳(应当是上虎跳到中虎跳),于是选择当天徒步一线天,第二天徒步到下虎跳。

雨季的虎跳,水已经完全变成了黄色。

07-30 虎跳峡

漫长的公路徒步。公路负重徒步,给人很傻的感觉。一路上总共也只看到一位和我们一样徒步的兄弟。由于错过了最后一班去丽江的客车,我们只能在江对面的小镇住下。

我们住的是一个漂亮的纳西族四合院。院子内外种满了果树。在这个季节,石榴/枣/罗汉果等各种水果都已经成熟。

川西-云南 记录(六) 稻城.中甸(香格里拉)

07-26 亚丁->稻城

早上乘车回稻城,一路的山路。小村庄镶嵌在山中的草地上,非常的漂亮。

稻城闲逛,泡温泉。

07-27 稻城->中甸(香格里拉)

从早上7:30一直坐车坐到了下午5点,也由四川进入了云南地界。

这时大家的行程开始有些分歧,有的要直接去丽江,有人要去虎跳,而我则有些纠结。糟糕的天气,即使去了雨崩估计也看不到什么。如果不去雨崩,这次旅行是否还有要继续的意义。

07-28 中甸(香格里拉)

香格里拉,是一个让人失望的地方。古城完全不古,风景和稻城比起来也要差上不少,到处都要收门票,而且门票还不便宜。本想去松赞林寺远远的照相留念,那知道在寺外很远就要收门票,于是连门外拍照都给省了。

川西-云南 记录(五) 稻城.亚丁

07-24 稻城->亚丁

亚丁徒步,自虐的开始。

领队MM根据08年的徒步攻略安排好了行程,到了亚丁才知道今年的变化很大,08年的攻略完全行不通。行动路线最终作了彻底的更改,这次的徒步也彻底的沦为了自虐行动。

途中经过冲古寺。冲古寺,一个不大的寺庙,外面看似乎也不怎么起眼,但里面倒是异常的华丽。和大多寺庙不一样,冲古寺是允许拍照的。

在冲古寺可以看到对面的雪山。由于天气问题,当天基本上看不到什么东西。

在雨中行进了几个小时后,我们来到了牛棚扎营,开火做饭。所谓的牛棚就是放牛用的小石屋。山上异常的冷,虽然睡袋号称-5℃,但后半夜依旧冻得不行。

07-25 亚丁

第二日在经过了短暂的爬坡后就是一路的下山,一直从海拔4600下到2千多。晚上入住老村长家。

这天又是糟糕的一天。早上起来的时候还看到云朵在山下,等到出发的时候云已经飘了上来。一路的雾,能见度极差。

川西-云南 记录(四) 稻城

07-22 新都桥->稻城

在新都桥修正后,继续前往稻城。

正当我们在屋里收拾东西打算出发,天色忽然暗了下来,似乎风雨欲来。有了前些天的见闻,大家对雨季行车的危险已有所认识。犹豫中,我发现窗外不少人对着天空拍照,这才反应过来,日食来了。赶紧拿着相机冲到楼下。只可惜漫天的云彩,基本上看不到啥。

在新都桥的包车经历,可以算是最糟糕的经历之一了。最开始被昨天谈好的司机放鸽子。后来在包车时,被一堆拉客的司机围住。在和其他司机谈的时候,某位司机兄弟误以为在和他谈,结果险些闹出矛盾。

除去不开心的事不说,新都桥到稻城一路的风景非常漂亮,一路上都是高山草地,成片的花海和牦牛。途中还第一次喝到了酥油茶。据说有人会不习惯,我觉得还不错。

到稻城的时,天已经黑了下来。本打算入住国际青旅,但床位早已告罄,遂入住了旁边的亚丁人家。因为这个变动我们认识几位新朋友,也因此有了后面十分自虐的亚丁徒步之旅。

07-23 稻城

稻城的海拔3700,比拉萨的海拔还要高出400米。或许是高反的原因,小T早上起来后就一直没有什么精神。老Y开始似乎还挺正常,出去逛了一圈回来就成了熊猫眼,趴在床上不愿起来。闲着也无聊,我决定租辆自行车出去溜达。或许是看到漂亮的风景,心情变好,小T的精神也开始变好了。

我们在稻城遇到的居民都非常的友好热情。我们在河边遇到一队玩水的小伙子,怕打扰到他们,本打算在他们旁边找个地方玩。没想他们主动邀请我们一起玩。后来和他们聊天知道,他们是附近的藏民。不过可能是汉化得比较严重,已经看不太出藏民的痕迹。再后面遇到的一个不满10岁的小朋友也很友好的主动和我们搭讪。