Archive for the 'Programming' Category

用del.icio.us跟踪blog留言

Wednesday, February 22nd, 2006

几个礼拜前就注册了coComment,一直没得用。今天看了天佑介绍coComment的文章,又尝试了一下。
首先可能是我太笨了,弄了半天才搞明白怎么用。(主要是del.icio.us等的bookmarklet先入为主,我一直以为是要留完言点那个coComment!按钮就会post出去,结果浏览器什么反应都没有,很郁闷。)
其实coComment是这样用的:

注册好之后把那个”coComment!”的bookmarklet拖到浏览器书签栏上
在你留言之前点一下它,在留言区的文本框下面会出现一个coComment的标志,上面还有你的名字 :)
你留完言直接提交,这条留言就会被coComment记录下来了
也可以点击那个coComment标志,会弹出一个窗口,你可以修改相关信息

coComment的创意很好,但是不足之处大家也都发现了,就是blog系统结构千奇百怪,而目前又没有一个统一的规范来约束留言的格式,所以coComment并不是万金油,至少现在对于blog的一个很重要的分支MovableType就还不支持。coComment作者提出的通过增加javascript变量标识的做法也许也要等到coComment成气候之后才有可能成为现实。
那么回过头来说,我们的目的不就是要记录下我们在各个blog上面漫游的痕迹么,del.icio.us自然在功能上来说就足够了。不过del.icio.us在post的时候还要经过输入相关信息等繁琐的步骤,确实用做这个工作比较让人不爽。不过解决方法还是有的,这不让我想出来了么 :D
下面这个bookmarklet改编自Julian的那个著名的quickpost,请把其中的两处做替换:
[tag]替换为在del.icio.us上面记录留言的tag,可以使用多个,空格隔开。
[name]替换为你在del.icio.us上面的用户名。

javascript:if (window.getSelection) des = window.getSelection(); else if (document.getSelection) des = document.getSelection(); else if (document.selection) des = document.selection.createRange().text; else des = ”; tags = ‘[tag]‘; title = document.title; location.href=’http://del.icio.us/[name]?v=2&url=’+encodeURIComponent(location.href)+’&description=’+encodeURIComponent(title)+’&extended=’+encodeURIComponent(des)+’&tags=’+encodeURIComponent(tags)+’&submit=save’;

这个就是我的: logComment
使用方法:
你留好言后,选中,然后点击这个按钮,搞定。
你还可以使用del.icio.us的功能把你的四散的留言通过javascript显示在你的blog上面呢 :)
Enjoy!

让人爱恨交加的AppleScript

Sunday, January 8th, 2006

今天终于完成了我这个假期参加的学校Summer Studentship的工程,一个用AppleScript写的Video Blog压缩发布程序。虽然还有很多需要改进之处,不过至少这已经是一个可用的测试版了。:)
这两个月来,我对AppleScript的知识从无到有,感触很多。
AppleScript早在Mac OS时期就已经存在了,在现在的Mac OS X时代更是被进一步的发扬光大。它的地位很类似Windows下用于Office的VBA——不过VBA只能控制Office的各个组件,而AppleScript则是贯穿整个Mac OS X系统,几乎所有的程序都有提供AppleScript的接口。使用AppleScript的Script Editor的Open Dictionary功能就可以看到完整的列表了。
AppleScript的表现形式也堪称大全:

默认可以通过简单的对话框和用户进行交互;
可以做成droplet的形式,对你拖拽到它的图标上的文件进行操作;
可以设置为Folder Action,自动监控指定文件内的文件的变化;
对于没有提供AppleScript接口的程序,现在还可以通过Universal Access来实现GUI编程方式控制;
最后,也是最具杀伤力的功能就是可以使用Xcode中的AppleScript Studio来生成带有完整GUI的,完全本地化的Apple应用程序。

这种完全的控制能力可以说不光完全超越了Windows平台下面的任何一种语言,而且也凌驾于类Unix操作系统上提供类似功能的shell脚本语言。
这次我的这个程序就是使用AppleScript Studio制做的,看起来和其他的Apple应用程序没什么区别。
编AppleScript程序的感觉很像Visual Basic,入门容易提高难。这是让我又爱又恨的主要原因。
AppleScript的设计目标大概是要老少咸宜,只要你懂英语,很多简单的程序你就能看个八九不离十。但是就是这个原因,我习惯了C语言的简洁,让我改用另一种说英语的方式写程序格外的痛苦。
举个例子,比如一个访问一个数组的a的第2个元素,用C语言就是
a[1]
而用AppleScript要写成
item 2 of a
甚至可以更人性化的写成
the second item of a
这在描述一些比较复杂的过程的时候副作用尤为明显,还好你可以用Python或者别的脚本语言写好,然后用”do shell script”命令调用。
在GUI界面的调用上,用AppleScript也会显得很拖沓,给你们看个例子
set myContent to contents of text view 1 of scroll view “scrollerContent” of tab view item 1 of tab view 1 of window “main” as string
把这种对象的层次关系用这么多的”of”来表现是不是够晕菜的 :)
另一个方法是用tell来层次化的表现,好看一点了,不过也还是够受的:
tell window “main”
[...]

摸摸 del.icio.us 的底细 :)

Wednesday, December 14th, 2005

今天居然遇到了 del.icio.us 的出错界面…(是系统保存有我的cookie信息的情况下访问首页时出现的,未登陆访问首页和访问自己的tag都没问题。) 然后我又很不厚道的在首页重新登陆一次,又看到一个出错界面 :D
Perl 的出错调试信息还真TNND详细,甚至看到了一小部分的源码 :)
总结得到以下信息:

服务器平台: Apache 1.3 (Mason在Apache 2下还不稳定)
使用语言: Perl 5 + Mason

尽管对Perl的了解还不多,但是之前也见识过了Perl + Mason的威力,据说这组合的企业级应用还挺流行的。
另外从代码中虽然还看不出所使用的数据库,(我个人估计是MySQL),但是从这么简洁的SQL语句中可以看出目前并没有使用多数据库负载平衡的技术。这么多的用户看来服务器得足够强大。
不过既然已经收归Yahoo!的旗下,Jeremy Zawodny的Perl + MySQL技术看来又有用武之地了 :)
我觉得这次出错及有可能是在进行类似Flickr那样的和Yahoo!的帐号整合的调试造成的。
下面就是详细的出错信息…

继续研究podcast

Saturday, December 3rd, 2005

昨天在podlook提交我的这个锵锵三人行 podcast时,提交失败,提示feed验证失败。开始我还不信,都经过feedburner烧过了怎么还能出错呢? 找到feed validator验证,结果大跌眼镜,确实一堆错误,甚至还有一些很低级的,比如忘掉了在channel下的link这个必须的元素 :P。
今天找到RSS 2.0 Specification 和 iTunes RSS Specification仔细研究了一下,重新改写了RSS生成部分的代码。现在最终的RSS,包括iTunes的部分,已经完全是我自己生成的了,我关闭了Feedburner的SmartCast功能(自动生成iTunes相关标签的功能,但是对中文支持不好,下面详细说),它只起到RSS hub的作用罢了。源码我已经升级过了。下面写点感想,发点牢骚。
1. Specification很重要
昨天做的时候,我也只是马马虎虎的找来一个现成的带podcast的RSS文件,照猫画虎的套内容。虽然之后能通过iTunes订阅,但是问题不少。(我想起之前某blog提供商生成的RSS居然把plod RSS的网址都抄去了的丢人事)。
下面说几个及其容易犯错的地方:

author元素(item的子元素)的内容是email: windix@douzi.org (Windix Feng),类似的还有managingEditor和webMaster(channel的子元素)。
enclosure元素的三个属性值都是必选的!其中的length值是文件大小(bytes),而不是时间长度。(昨天发现imboke.com的RSS中把length值忘掉了)
pubDate元素的格式为RFC 822,即类似”Wed, 6 Jul 2005 13:00:00 PDT”这样的。(车东曾经发现一些中文汉化的Blog软件把星期Wed也汉化了造成的问题)
RSS 2.0 Specification对内容没什么要求,遵守XML规范就OK了;但是iTunes RSS新增加的内容是有要求的: 编码必须为UTF-8方式;所有的值必须为文本,不能是HTML;除了itunes:summary可以容纳4000个字符外,其它的元素内容最多255个字符。在它的文档里面特意重新强调了XML命名实体(named character entites)和HTML命名实体的区别。我在新版的build_rss.php中写了个函数mrip()来去掉锵锵三人行介绍文字中出现的<a>、<p>和<img>这三个HTML标签。
guid元素是控制内容的唯一性的。我升级的时候更改了这个guid,结果iTunes就出来一组重复的节目:P。

经过这些改进,现在已经顺利的通过了RSS Validator的验证服务了:)

2. Feedburner的中文支持还是有问题
FeedBurner虽然能够处理中文的Feed,不管是GB2312的还是UTF-8的,但是有一些小功能还是不行。比如昨天遇到的通过它提供的SmartCast功能,我输入的中文内容转换出来就变成了一堆????了。
3. podcast目录服务
podcast做好了,当然下一步就是推广了。我尝试了一下几个:
imboke.com – 播客天下
这个我早就知道了,因为之前订阅的”有一说二”就是它们提供的服务。可是发现这个是一个podcast的服务提供商,它提供的目录服务也只是面向它下面的podcast。没戏了。
podlook.com – 菠萝网
提交成功。整体感觉还不错。节目连接
podcasts.yahoo.com – Yahoo! Podcasts
提交过了,不过还搜索不到。感觉对中文的支持好像不太好。
iTunes podcast directory
这个只能用iTunes浏览,我也提交过了,应该近期就能搜索到了吧。
4. 仍然需要改进
最令我感到遗憾的是iTunes下面的podcast图像仍然显示不出来。我已经按照标准做了(300×300大小,JPG格式),元素也正确,可是仍然不对。只好暂时放下等以后改进了。唉,浪费了我重新制作的图像(还是用不惯gimp,最后用Macromedia Fireworks做的):

iTunes的RSS播放控制功能还是很强大的,通过RSS,不光频道,而且每个节目,节目的每一段都可以指定一个图像来代表,还有段落的时间控制功能,看一些iTunes上面的官方节目就知道了。不过方法似乎在Specification里面没有提到。:(
而且iTunes支持的enclosure中居然还提到了pdf ? (m4a, mp3, mov, mp4, pdf) 难道是广播书用的?

锵锵三人行 podcast 来了!

Friday, December 2nd, 2005

我制作了凤凰卫视的王牌谈话节目”锵锵三人行”的podcast,这下终于可以用ipod订阅收听了:)
节目来源为”凤凰网 – 凤凰之声“提供的免费音频,不过是mms协议的在线收听,我用mplayer将流dump下来(暂时在Linux下只有这个方法好用)为wma文件,然后还是用mplayer转成wav文件,最后用lame转换为mp3文件。RSS Feed是用php分析抓取凤凰网的介绍内容得到的,使用了curl库读取网页,iconv库转换内容为UTF-8编码。现在所有的工作都可以命令的方式执行了,所以进一步测试后使用服务器的cron功能每日定时制作就可以了,整个过程都在Linux平台下完成 :)
主要的转换部分的代码9月末的时候就写好了,今天主要是用PHP写了生成RSS Feed的部分。因为这个方法有一定的通用性,等我把cron部分搞定就把代码公开。
update: 源码下载
简要说明:
fetchmms 这个bash脚本用来完成获取wma -> wav -> mp3的过程,使用格式:
./fetchmms mms://www.douzi.org/test.wma data/test.mp3
update.php执行检查更新和更新数据的任务,它会调用 build_rss.php (更新rss) 和 fetch_file.php (更新mp3文件) 。配置信息写在 config.php 中。为了方便,我没有使用数据库,所有的资料存放在一个名为data文件的文本文件中。
cron使用也很简单: “crontab -e”输入:
02 1,13 * * * /usr/local/bin/php /home/windix/srx/update.php
代表每天的1:02和13:02两次尝试更新
锵锵三人行podcast订阅
PS. 凤凰网确实很为用户着想,自从有了凤凰宽频开始就提供坚持提供免费的锵锵三人行音频。但是mms在线收听的方式确实有很多不便之处,特别是有ipod用之后,弄这么个服务的念头有了很长时间了。不知道凤凰网什么时候能开窍,提供官方的podcast服务呢 :D 它那么多的节目源,在video ipod市场肯定有前途的。也许中国ipod用户太少是一个很大的门坎?

解决WP邮件通知在gmail中的标题乱码

Saturday, November 26th, 2005

每每Blog上面有人回复和有新的trackback,WordPress(包括之前更早用过的MovableType)都会向gmail转发一封通知信,配合gmail notifier的功能,我回复留言都是第一时间的 :P
唯一可惜的是,通知邮件的正文还好,没什么问题,标题中的中文确总是乱码的。
update: 已有AvP提供的WP插件,请见本文最后更新内容 :)

获得RMIT的Summer Studentship

Thursday, October 20th, 2005

今天收到了学校负责Summer Studentship的Dr. Michael Winikoff的回信,我两周前申请的Summer Studentship获得了批准,我幸运的入选了。
什么是Summer Studentship呢? 我也不知道怎么翻译,反正很类似今年Google搞的那个Summer of Code,CSIT在每年暑假(当然国内是放寒假了,别忘了我在澳洲 :P)都会搞一些研究课题,由导师辅导在8-10周内完成。这个机会主要是面向研究方向(research)的学生的,我实际是属于授课方向的(coursework),所以能得到这么一个机会我还是很荣幸的。下面这个是申请页面上的官方介绍:
A studentship is a great opportunity to gain first-hand experience of research in computing, working closely with a staff member on an interesting and challenging project. Studentships often lead to further opportunities: past summer students have gone on to PhDs, to projects, or part-time work during [...]

纯真IP数据库(QQWry.Dat)查询 C源码

Thursday, June 30th, 2005

今天看了利用 QQWry.Dat 实现 IP 地址高效检索(PHP),一时兴起,也打算的研究一下:)。于是参考纯真IP数据库格式详解我写了一个C语言版的,于gcc 3.3.5 (Debian 1:3.3.5-13)测试通过。
主要难点是见识了C语言的”平台相关性”:P。我在Debian Linux / i386上面程序运行正常,因为Intel系统是Little Endian,和我的程序一样。而我上传到学校的SunOS上面,执行到第一步取文件头index区数据时就退出了,因为Sun的系统是Big Endian。
程序遵守GPL,随便取用,虽然我也不知道有没有用:P。不过我想可以稍加修改做一个把QQWry.Dat导成SQL文件的程序。数据库直接查询更快了吧:)。不过因为重复数据太多,光到成文本文件就有14MB呢。
源码如下:

打造PHP4/5, MYSQL4.0/4.1共存编程环境

Saturday, June 25th, 2005

现在PHP5, MYSQL 4.1逐渐羽翼渐丰,但是仍然暂时不能撼动PHP4, MYSQL 4.0的地位。
PHP5的面向对象技术虽好,但是一些微小的调整造成部分PHP4程序不能兼容。
MYSQL4.1最为中文使用者所诟病之处就是本来作为特色之一的字符集支持,
很多老的应用程序在导入/导出的时候会出现严重的乱码问题。
所以我想了点办法,在Debian Linux上实现了以下两组系统的自由切换共存。
PHP4 + MYSQL 4.0
PHP5 + MYSQL 4.1
之所以这么安排,前者就不用说了,是我们一直使用的传统环境;后者可以使用PHP新的mysqli扩展接口,
并且可以学习调试MYSQL 4.1的字符集支持。
下面就是我的实施步骤:

del.icio.us 新版弹出式小书签

Wednesday, February 23rd, 2005

del.icio.us最新推出了一个小书签(Bookmarklet),从nutr.itio.us中吸取了一些经验,能够自动帮你选择合适的tag。我根据这个新版的,改装了一个新版弹出式的小书签。请把这个new popup del.icio.us拖到工具栏中使用。