Recent Articles
E63刷机
四 14, 2010 软件推荐 2 Comments
我的黑莓8320最近频频罢工。虽然已开始有些习惯了黑莓,但这个手机用了不到一年就这这样,实在是有些失望。
在E72和E63间纠结了一整后最终选择了E63。
今天,新机到手的第二天,用官方的PC套件对系统进行了一次升级。升级好后系统语言变成E文和另一不知道是哪的蝌蚪文,中文则彻底成了框框。这时候我才反应过来,这就是传说中的刷机,由于我的机器区域码为某小国,系统没带中文。新到手的机器,还没来得及把玩就挂了,实在是让人崩溃。
迫不得已到网上寻找解决办法。
网上有使用“凤凰”刷机的方法。虽然凤凰的个头不小,而且过程繁琐,但为了解救我的E63只好尝试。然后失败。
经过再次搜索后终于找到了个简单的解决方法。使用NSS将E63的code改成新加坡,然后用官方PC套件进行更新。
具体使用方法参考下面的链接:
NSS无法改CODE的的究极秘籍 http://bbs.dospy.com/thread-5547565-1-1.html
貌似最全的E63 code号 http://bbs.dospy.com/thread-3002663-1-1.html
发布一个Django的论坛系统LBForum(开源、带演示)
二 26, 2010 vicalloy的庄家, 编程 5 Comments
简介
LBForum 用django开发的论坛系统,演示地址为:http://vik.haoluobo.com/lbforum/
项目的地址为:http://github.com/vicalloy/LBForum
界面部分抄的 FluxBB(一个开源的PHP论坛 http://fluxbb.org/ )。
虽然Django写的论坛也不少,不过还真没什么好用的。
大多Django论坛都是独立的app,而且不少还缺模板,想我这样有经验的Django用户要跑起来都觉得麻烦,其他普通用户就更别说了。
LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单。
LBForum一开始就是以整站的形式提供,所以以LBForum做为基础项目进行二次开发是很容易的。
同时LBForum的开发尽量遵照Django可复用app原则,因此即使需要将LBForum做为独立的app集成到其他项目也并不会太难。
主要功能
目前功能还比较简单,而且还有些小问题有待修正。
- 论坛分类,分版块
- 发帖,回帖
- BBCode支持
- 置顶贴
- 使用django admin提供论坛管理功能
用开发服务器把LBForum跑起来
- 先把代码down下来。LBForum托管在github上,http://github.com/vicalloy/LBForum 。如果你没有安装git,你可以直接用界面右上方的download
source功能下载代码。 - 运行\scripts\create_lbforum_env.py初始化lbforum的python虚拟环境。该脚本会自动创建一个python的虚拟环境并使用easy_install安装对应的依赖包,同时将一些依赖包解压到对应的目录中。
注:django使用的是svn版本,所以机器上必须要安装有SVN,不然脚本会运行失败。如果因为由于svn的问题导致脚本运行失败,可以运行lbforum_env.bat进入lbforum环境,手动安装django的svn版本。 - 环境初始化好后,运行lbforum_env.bat进入lbforum环境
- 运行%mg% syncdb初始化数据库
- 运行%mg% runserver启动django开发服务器
- 进入admin,创建论坛分类和版块
- 进入版块发帖
LBForum的目录结构说明
|+lbforum_env/#lbforum运行的python虚拟环境,运行create_lbforum_env.py后自动创建
|+requirements/#lbforum用的第三方库和app,运行的时候会将该目录加到python路径
|~scripts/#工程相关脚本
| |-create_lbforum_env.py#初始化python虚拟环境,并自动安装easy_install/django依赖库
| |-helper.py#提供其他脚本所需的辅助函数
| `-lbforum_env.bat*#启动lbforum运行的虚拟环境及,并为lbforum的manage.py提供快捷方式%mg%,比如初始化数据库%mg%
syncdb
|~sites/#站点配置/模板/静态文件
| `~default/#默认站点
| |+static/#静态资源文件,如css等
| |+templates/#Django模板目录
| |+templates_plus/#Django模板目录,用户将自己重写过的目标放到该目录
| `-……
|~src/#django的app目录
| |+account/#account相关app。具体站点通常会对用户中心进行定制,所以该app在实际应用中很可能需要针对实际情况进行修改。
| |+djangohelper/#一些django的辅助函数等,
| |+lbforum/#lbforum的主app,论坛功能都在改app中
| |+lbregistration/#registration app的lbforum扩展,主要去掉邮件地址认证功能
| |+onlineuser/#显示在线用户的app(可复用的django app,可脱离lbforum单独使用)
| `+simpleavatar/#头像功能的app(可复用的django app,可脱离lbforum单独使用,依赖djangohelper)
|+tools/#工程用到的辅助工具,目前只有一个virtualenv的脚本
注:
- 由于计划在以后做i18n,所以目前只提供英文界面
- django的错误提示是显示在字段后面,fluxbb的错误全部都显示在表单前面。由于模板没有调好,所以目前按照fluxbb的方式显示错误,所以错误显示有些不太正常。
- bbcode的输入框本想做成自适应大小的,不过也调得有些问题,所以现在输入框的大小固定。
- 文档… ,感觉好难写-_-,目前文档不全(项目中没有带任何的文档),日后补上。
- 应用程序的目录结构主要查看pinax
- simpleavatar模块部分代码来自django-avatar
- 依赖包除用easy_install在线安装的外,尽量使用zip包的方式附带在项目中,减少安装依赖包的困难。
- 远程部署脚本计划使用fabric,但fabric本身安装比较麻烦,所暂未处理。
- 项目最早放在googlecode,不过感觉github的功能更强些,所以移了过去。
SourceForge使用Python、TurboGears、MongoDB……来重构网站
二 22, 2010 编程 Leave a comment
pycon2010上关于SF网站重构的演讲,里面介绍了SF重构的技术选型及原因。在我看来SF用的东西还真的很GEEK。
主要用到的技术有Python、TurboGears2、MongoDB、Jinja*、RabbitMQ,服务器用的是LigHTTPd和Nginx。
- TurboGears2(为什么不的Django?)
pdf中也有谈到此前也用到过django,而且有很不错的体验,但对SF的改造来说TG更为合适。SF有着上10年的历史,要完全抛弃原有的东西自然不现实,此次的网站重构并不是完全的重写。TG可以很容易的剥离掉不需要用到的东西,同时TG可以很好的同其他WSGI中间件配合工作。 - MongoDB
MongoDB是一个非关系的分布式数据库(NoSQL数据库),最大的优势快。由于这东西足够快,所以连web2.0网站常用的memcached也省掉了。(注:NoSQL数据库介绍可以参考 NoSQL数据库探讨之一 - 为什么要用非关系数据库) - Jinja*
Django的模板很棒,但速度不怎么快,而且完全不支持任何嵌入式代码。Jinja和Django的模板长得非常的象,而且解决了上面的两个问题。(注:文档里说前台用的是PHP,所以不清楚是否有部分用到Jinja) - RabbitMQ
用Erlang写的中间件,进行前后台的消息通信。SF的前台界面呈现,依旧使用的PHP,前后台通信用的就是这东西。
Whoosh性能
二 8, 2010 编程 Leave a comment
早些时候就在google到Whoosh和xapian的性能对比文章,只是由于文章被墙,今天才翻墙看到。
文章是xapian作者写的。就文章里的对比结果来看,whoosh和xapian的性能差距还是比较明显。索引和搜索的速度有近4倍的差距,在full cache情况下的性能差距更是达到了60倍。
除算法原因外,whoosh的纯python定位也决定了whoosh很难达到其他c/java的搜索引擎库的速度。
当然,whoosh的优势是易用性,在考虑性能的情况下whoosh不是首先。
使用嵌入式jetty启动axis提供webservice服务
二 2, 2010 编程 Leave a comment
JDK6已经内置了webservice支持,使用JDK6开发webservice是一件很方便的事。很不幸的是,由于IDE的支持axis成为使用最广的java webservice库。而且由于的部分应用使用了不兼容的RPC/encoded模式,使得你还不得不用axis。
通常情况下用axis开发webservice服务端,需要挂在tomcat等web服务器下,以servlet的方式提供服务。但有些时候我会想将接口部分以一个单独应用程序的方式进行发布,另外再多带个web服务器似乎有些笨拙。
使用嵌入式的jetty是一个比较简单的解决方式。其中需要注意的是,一定要设置Context的ResourceBase,不然是无法找到webservice配置文件的。我当初就是想当然的认为jetty会默认在当前路径下查找配置文件,导致一直无法正确发布服务。
protected static void runJetty() throws Exception { Server server = new Server(); SocketConnector connector = new SocketConnector(); connector.setMaxIdleTime(30000); connector.setPort(8000);//jetty的端口 server.addConnector(connector); ServletHolder axisServletholder = new ServletHolder(new AxisServlet()); ServletHolder axisAdminServletholder = new ServletHolder(new AdminServlet()); Context root = new Context(server, "/", Context.SESSIONS); root.setResourceBase("./web/");//WEB资源目录,./web/WEB-INF/server-config.wsdd root.addServlet(axisServletholder, "/servlet/AxisServlet"); root.addServlet(axisServletholder, "/ws/*");//设置webservice的发布目录 root.addServlet(axisServletholder, "*.jws"); root.addServlet(axisAdminServletholder, "/servlet/AdminServlet"); server.start(); }
纯python的全文搜索组件Whoosh
一 30, 2010 编程 4 Comments
haystack 是 django 全文搜索的一个中间件,可以粘合 django 应用和 solr、xapian、whoosh 全文搜索引擎。
solr和xapian是早就知道的,Whoosh就没听过了。简单的了解后感觉这东西还是非常不错的。whoosh是一个纯python实现的全文搜索引擎。对python应用而言,whoosh的纯python实现,使whoosh的集成会容易很多,而且扩展起来也会容易很多。
下面是对Whoosh官方简介的翻译
Whoosh: 高效的纯python全文搜索组件
Whoosh是一个纯python实现的全文搜索组件。Whoosh不但功能完善,还非常的快。
Whoosh的作者是MattChaput,由Side Effects Software公司开发。项目的最初用于Houdini(Side Effects Software公司开发的3D动画软件)的在线帮助系统。Side Effects Software公司将该项目开源。
主要特性
- 敏捷的API(Pythonic API)。
- 纯python实现,无二进制包。程序不会莫名其妙的崩溃。
- 按字段进行索引。
- 索引和搜索都非常的快 — 是目前最快的纯python全文搜索引擎。
- 良好的构架,评分模块/分词模块/存储模块等各个模块都是可插拔的。
- 功能强大的查询语言(通过pyparsing实现功能)。
- 纯python实现的拼写检查(目前唯一的纯python拼写检查实现)
为啥选择Whoosh
- 纯python实现,省了编译二进制包的繁琐过程。
- python代码比java更容易读懂,而且用起来也更方便。(翻者注:这个容易引发口水)
- 在很多时候易用性比单纯的最求速度更重要。
Whoosh从其他的开源搜索引擎中获取了大量的灵感。 基础构架参考Lucene,使用KinoSearch的索引算法,部分评分算法来自Terrier,英文的词语态变化来自Minion.
django的论坛app
十二 20, 2009 编程 Leave a comment
在django的资源页面里有个第三方论坛app的比较页面Django Forum Apps Comparison。一眼望过去,可用的app还不真不少,数下了有15个之多。但真正看下来,似乎很难找到一个让人满意的。
我对论坛app的要求是:
- 得要自带一个还比较漂亮的界面模板。
模板的开发工作在django应用的开发中占了很大的比重,甚至可能比写python代码花的时间还多。可惜的是很多的app应用甚至连个最基础的demo模板都没带。 - 最好支持Richeditor和BBCode。
支持BBCode的app还是有几个的。Richeditor的支持基本上属于模板的范畴,参考条目1,似乎还没看到支持Richeditor的论坛(注:我没每个app都看,不能确定,pybb默认模板带了个Markup的编辑器)。 - 支持附件。
国内的论坛应用大多偏娱乐,用户喜欢在自己的帖子里插入图片等东西。虽然可以再单独提供一个上传附件的组件,让用户上传后再在论坛里引用,但用户体验就要差不少了。
既然找不到满意的app,那就只能自己动手做了。目前计划在pybb(注:pybb的许可协议没看太懂,似乎是类似BSD的)的基础上进行开发。目前的开发计划如下:
- 先给项目换个新名字LBForum
- 换个漂亮些的模板(同时增加richeditor)
考虑过不少模板。- phpbb3 目前最流行的开源论坛程序,css和html写得很不错。但似乎有些复杂了,套用起来有些麻烦。
- phpbb2/javaeye/jforum 这几论坛程序都长得差不多,UI应当都是参照phpbb2(javaeye的老大自己说了javaeye的界面就是仿phpbb3)来做的。其实也不能说这几个论坛的模板有什么不好。更多的是不喜欢里面过多的table。
- discuz5 不是太喜欢discuz7的界面。discuz5(springside常用的那款界面)的界面感觉清爽些,但改了些后发现里面的html和css写的实在不怎么样。
- fluxbb 目前打算用她的模板了。界面给人的感觉不错,html和css写得挺好。界面够简单,要套用模板应当不会太困难。
- 增强附件功能
虽然pybb提供了附件的支持,但功能还是比较弱。 - 增加一个公共的个人信息模块
pybb已提供了一个保存用户个人信息的功能,但通常这些信息会是整个工程所共享的。我觉得这些信息还是单独放到一个专有的app里比较好。这个app可以以代码的方式包括的工程里,需要增加个人信息的时候直接修改model代码。
后记
最后还是选择了完全从头进行开发。pybb里面可以用的东西不多,而且他的开发思路和我还是有些分歧。
JdbcTemplate之BeanPropertyRowMapper
十二 10, 2009 编程 Leave a comment
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!
十二 8, 2009 编程 Leave a comment
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网页客户端
十一 30, 2009 软件推荐 Leave a comment
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封装。