Dec
31
其实没更新啥,WordPress 2.7的评论功能大大增强,主要是增加了comment threading功能,而这一功能以前大部分blogger都是用插件Brian’s Threaded Comments实现的。我今天就抽了一点时间,去掉了插件,换用WordPress本身的wp_list_comment函数来显示评论。
晚上吃饭的时候,电视上都是迎接新年的气氛。而我回顾2008年,却感觉有点失败,一事无成。以后要把更多的时间用在工作和学习上了,尽量不做无聊的事。作为兴趣爱好,我会多看看PHP以及WordPress的东西。最近如果有时间,就写几篇关于WordPress 2.7的评论功能的文章吧。
Dec
31
今天打开自己的blog,发现那两个flash游戏自动播放很烦,我一时写文章不勤快了,就没有把它们埋下去,每次打开首页都听那么一遍。
于是<!–more–>派上了用场。把两篇文章分别编辑了一下,给flash嵌入的代码前面加上了more,这下首页没有了。话说,多亏我今天把电脑的静音取消了,要不还不知道用户体验这么差呢……
文章特别长的时候,这个特殊标签也非常有用,它会让blog的首页高度不会出奇地大。尤其是文中有大量图片的时候,前阵子从黄山回来,那些流水帐里不少就用了more标签。
首页默认是10篇文章,缩小每篇文章的高度,有利于读者更快地发现更多有意思的东西。
另一方面,首页的数据量也大大减小,页面加载速度大大加快,也提升不少用户体验。
Dec
17
几个月前写了篇文章推荐使用Apache commons-lang的StringUtils来增强Java字符串处理功能,我也一直在项目中大量使用StringUtils和StringEscapeUtils这两个实用类。
最近在数据库里发现某个表的内容全都成了HTML entity表示,中文也全被转换成了”我”这样的格式,而在页面上显示一切正常。最终发现造成这个后果的原因是在将字符串保存到数据库之前,用StringEscapeUtils.escapeHtml对其进行了处理。
字符串过滤是在许多Web应用开发中需要考虑的问题。比如用户输入一个左尖括号(<),在输出HTML代码对其进行显示的话,应该用”<”来表示(而我为了正常显示这句话中出现的两次尖括号,必须做多余的工作,你可以看一下源代码)。是在用户将表单提交后就做转换呢,还是在从数据库取出内容向用户展示时再转换?这个问题需要仔细考虑。在入库前转换,看似一劳永逸,然而如果用户需要编辑这个内容,你需要原路退回,做个逆向的转换,这看起来比较麻烦。所以大部分的转换都是在从数据库中取出数据之后做的,struts的bean:write标签的filter属性就是控制这个开关的(默认为true)。
而某些内容是不会被编辑的,比如一般的电子邮件,这类就可以在用户提交表单之时转换,一劳永逸。于是我使用了StringEscapeUtils.escapeHtml来做这个工作。
如果是英文内容,没有任何问题,然而它将一个中文字符转换成了8个字符。在UTF-8的编码中,每个汉字占用三个字节,每个英文字符占用一个字节。这样的转换造成了大量的空间浪费。
简单的办法是自己写一个escapeHtml方法,替换左右尖括号就可以了。虽然还有一些HTML entity未被转换,可能造成输出的网页不符合web标准,但是大部分浏览器都可以正常显示也就够了。
Dec
11
在网上看到有趣的新闻,经常有在IM上分享给朋友的冲动。不过这个操作一般都要复制两次,一次标题,一次链接,这样才专业。
不用想就知道肯定有人做了这样的扩展,Copy URL +就是一个,我不知道有没有其它的,至少这个已经足够好用了。
遗憾的是作者似乎已经不再维护了,官方版本只支持Firefox 1.5. 没关系,下面的Review提供了支持3.x的版本:http://www.utm.edu/staff/bmoseley/copyurlplus-v1.3.4.xpi
安装后在网页的右键菜单上有一个Copy URL+的菜单组,下面默认有三个子菜单项(没有选中文本时仅显示第一个):
Copy URL + Title -> 复制链接和标题,中间用回车隔开
Copy URL + Selection -> 复制链接和选中文本,中间用回车隔开,并且选中文本加引号
Copy URL + Title + Selection -> 上面二者之结合
该扩展的功能比想象的还要强大,可以在Firefox的profile文件夹里的user.js中定义新的菜单项(Windows在C:\Documents and Settings\[username]\Application Data\Mozilla\Firefox\Profiles\[randstr])。自定义的方法在扩展的README文件中有介绍(解压或安装后可以看见),也可以在扩展的官方主页看到。
对于像我这样不喜欢使用可视化编辑器写东西(更利于控制HTML代码质量)的blogger,用这个插件来生成链接代码要方便多了。我定义了两个菜单项如下:
user_pref(’copyurlplus.menus.1.label’, ‘Copy URL + Title (HTML)’);
user_pref(’copyurlplus.menus.1.copy’, ‘<a href=”%URL%”>%TITLE%</a>’);
user_pref(’copyurlplus.menus.2.label’, ‘Copy URL + Selection (HTML)’);
user_pref(’copyurlplus.menus.2.copy’, ‘<a href=”%URL%”>%SEL%</a>’);
第一个把标题作为链接文本,第二个把选中文本作为链接文本,生成对应的HTML代码。
Dec
10
新鲜出炉,该快的快,该慢的慢,节约时间,为构建和谐社会做贡献:
Read the rest of this entry »
Dec
05
这两天打企鹅打上瘾了,我玩的是神奇的非洲这个版本,应该是最耐玩的一个吧。注意第一棒要从长颈鹿的肚子下面过去,这样有机会越过两棵树,一下打1200米左右,某同学甚至打出了1500米,真是……我的最好成绩是5棒4000多米。
让人不爽的是这个游戏没有一个reset键,有时候明明失误了,很希望重新来过,只能靠点浏览器的刷新按钮来完成。于是再听一遍烦人的音乐,再点好多次OK.
痛定思痛,不是很熟悉flash的我还是把这个难题给攻克了。本来想加个reset的button的,后来图简单,就把5棒结束后乌鸦衔着的那个记分牌给搬过来了,哈哈,效果很明显:
Read the rest of this entry »
Dec
04
Linux服务器不小心断电,重启后,修复了硬盘,但是SVN Server出问题了。在浏览器中访问,看似一切正常,但是要check out,update的时候,就报错 no such revision ‘xxx’,xxx是一个版本号。
对repository目录执行svnadmin verify,发现很早之前的版本还在,从某个版本号就出错了。Google了一通之后,发现搜索结果里和我的症状都不太相同。丢失的太多了,近期备份也没有,难道就重新建一个repository了事?
不过很快找到了问题所在,db/revprops目录中的文件从0开始,到了出错的版本号就没了。打开这些文件,发现是纯文本,格式如下:
K 10
svn:author
V 7
someone
K 8
svn:date
V 27
2008-07-08T19:54:09.605509Z
K 7
svn:log
V 9
log here.
END
显然,一个key(K)跟一个value(V),大写字母K、V之后是字符串的长度,revprops中的文件只是记录了每个版本提交的信息。
由于我们同时使用了trac,这些revprops文件丢失并没有损失,trac的数据库中都有保存,可以通过它来重新生成。但是为了简便起见,我就把最后一个存在的版本号文件复制了N遍:
for i in $(seq 250 500)
do
cp 249 ${i}
done
250到500是缺失的版本号,249是最后一个存在的。就这样终于把版本库给修复了。
Dec
03
两个人站得不远,在那儿互相高喊。
——“喂,××,听见了吗?”
——“啊,听见了!好棒啊!”
那当然了,把墙拆了照样听得见……
两个老外,分别站在墙的两头,嘀嘀咕咕。过了一会在中央会合,讨论一番之后又分开走向各自的墙脚。”ready?” 又开始了。