让人爱恨交加的AppleScript

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"
    tell tab view 1
        tell tab view item 1
            tell scroll view "scrollerContent"
                set myContent to contents of text view 1 as string
            end tell
        end tell
    end tell
end tell

AppleScript Editor多少还支持你手工换行缩进一下,AppleScript Studio霸道的很,你只能使用它的自动缩进,所以就只能将就看了。另外AppleScript Studio的程序调试能力几乎为0… 特别是一些runtime的错误,就是给个出错代码,错误出在哪都不知道。:(

结论:想做一些Mac OS X下的交互性小脚本,AppleScript绝对是首选;想搞RAD,还是免谈吧。同时还是很感叹于Mac OS X的易用性——Windows平台下什么时候能有一个这么方便的工具语言出现呀(别提那些倒胃口的VB, OLE之类的)。

PS. 苹果有时候也满黑的,像QuickTime Player,居然把全屏放映这样的基本功能都要放到收费29.99美刀的QuickTime Pro中去。可是实际上,所有的Pro版的功能,比如导入、导出、编辑等,都可以直接通过AppleScript调用免费版的QuickTime Player实现。看来想省钱就要搞点技术含量呢…

Links:

NucleusCMS->WordPress 2转换程序

January 6th, 2006

这可能是我最后一次写关于NucleusCMS的文章了 :)

NucleusCMS是我曾经使用过很长一段时间的blog程序,但是现在确实已经风光不再了,WordPress才是王道。但是官方并没有NucleusCMS到WordPress的转换程序。

今天我将一位德国Blogger: Dieter Mayer的写转换程序进行了修改,使之能够适应非西欧语系(原程序里面有一个函数专门处理德文的那些带音调的字母,用在UTF-8的中文上乱码的一塌糊涂),以及WordPress 2.0的一些新变化(帖子和留言的计数字段)。

使用前请做好备份,本程序未经广泛测试,出现的一切不良反映自负 :P

使用方法:

1. 正常安装一份新的WordPress 2.0
2. 运行转换程序

一些说明:

默认情况下,WordPress的表前缀(Table Prefix)为”wp_”,而NucleusCMS为空。
图片路径(Image Path)是你原NucleusCMS的上传图片目录,默认应该为 http://yoursite/NUCLEUS_INSTALL_PATH/media/1/
我建议你把它们提前复制到新的位置,这里可以输入这个新路径
这个功能是将Nucleus的模板的图片表示方式 <%images(…)%> 转换为HTML代码

English instruction:

Importing NucleusCMS -> WordPress 2.0

v1.2 – 6 Jan, 2006
Windix Feng, windix [AT] gmail.com, http://www.douzi.org
Based on v1.1 from Dieter Mayer, dieter_mayer [AT] gmx.net

Updates:
1. comment two functions that are not suitable for for conversion UTF-8 encoding (if you need them, just simply uncomment them)
make_nicename()
text_encode()

2. Add support for WordPress 2.0
(the counts of post and comment fields in two table)

3. Convert nucleus <%images(…)%> template string to HTML code

4. Caution:
During the conversion, the wordpress tables will be cleared.
Please use a new installation of wordpress 2.0

Usage:
Backup all your data, install a new WordPress 2.0, and run this script.
USE AT YOUR OWN RISK!

下载/download: import-nucleus.tar.bz2

Enjoy!

无极启示录

January 6th, 2006

那些贬低陈凯歌导演新作”无极”的同学们,其实是你们没看懂(虽然我也承认先涛数码的抠图技术比较业余),陈导演真正要表达的是——向我们证明爱因斯坦伟大的相对论——当雪国人穿上那鸟人衣服以超过每秒30万公里的速度飞行的时候,时间倒转了!

Futurama

December 28th, 2005

上周开始在Channel Ten发现了一部很有意思的动画片”Futurama” (读音future-rama)。有Future,自然是未来世界发生的故事--Fry,一位20世纪的年轻人,在30世纪的冒险经历。这部动画片是The Simpsons的制作班底制作的。

其实平时看电视挺少的,主要原因还是没有字幕看不懂。(#_#,所以很想买一台有Teletext功能的电视,就是那种可以显示字幕,主要为听力残障人士使用的。) 可能是这部动画片主要是科幻为主,所以我除了能听懂外,还能笑出来 :) (Simpsons就是以生活化内容为主,所以虽然也不难听清,但是不容易理解里面的笑料。)

今天看的这集(Season 1 – EP.8 A Big Piece of Garbage)讲的是,20世纪的纽约是世界上最脏的城市(嗯,他们没来过中国呢),垃圾遍地,后来人们将所有的垃圾收集起来,用火箭把这个大垃圾球发射到太空中去了,至此天下太平。可是30世纪,这个垃圾球,或者叫做垃圾小行星,又飞回来了,还有72小时就要撞上地球了。在此危机时刻,Fry一行人执行起了拯救地球的任务——在垃圾小行星上埋上炸药摧毁它。博士交给他们一枚25分钟时长的定时炸药。可是当他们启动定时器的时候,怪事发生了,那计时居然是这样变化的:
25:00 – 15:00 – 05:00 – 6h:00 – 8h:00 – Lh:00 …

6h:00 ? 这是什么? 原来博士把炸药搞反了--这是一枚时长为52秒的定时炸药!(没看懂吗?想想那个计时器的液晶数字倒过来的情形:D) 大家只好把炸药销毁了。没有炸药,任务失败,地球危在旦夕。(”欢迎”队伍的旗子变成了 Welcome back, Winner! Loser! )

另一名博士在汇集了New New York(30世纪的纽约就这名)的精英研究人士组成团队,可研究后还是没有什么法子解决(值得一提的是,这个研究团队还特意强调华人的比例,看来在美国华人做研究的精英不少)。 在此千钧一发之际,Fry想出了一个以毒攻毒的法子,大家搞一个更大的垃圾球把原来的那个顶回去… 可是30世纪的众人压根就没有“乱丟垃圾”这一概念,于是Fry又紧急搞了一次动员,教大家如何乱丟垃圾——最终新的垃圾球发射成功,并改变了原来的垃圾小行星的飞行路线至太阳焚毁了,地球又一次得救了。可是这个新垃圾球会在40世纪重新回归撞击地球的…

这就是这部片子中的一集,不过涵盖了它的特点--尖锐的讽刺幽默和对各种老电影的模仿搞笑,我们屋子的全体成员都对这部片子乐此不疲(如果读者你刚巧也在墨尔本的话,别忘了周三,周五 8:00pm 锁定Channel Ten观看:D)。可惜的是,尽管这部剧集获得了多次艾美奖等殊荣,仍然因为创作团队和东家Fox不合(这部片子戏称其为30世纪Fox公司),从1999年至2003年,这部剧集在拍摄了5季72集之后停掉了。不过杰出的内容让它的DVD销量一直居高不下,所以有可能复活也不好说

因为在国内没有引进过,(香港曾经播出过,译名为”乃出个未来“),所以在网上见不到下载,但是前两天圣诞购物的时候在HMV看到了DVD,全套4季(DVD也是完整的72集,但和Fox当时播出的顺序不同),将近150刀,等以后攒点钱再买喽 :)

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

December 14th, 2005

今天居然遇到了 del.icio.us 的出错界面…(是系统保存有我的cookie信息的情况下访问首页时出现的,未登陆访问首页和访问自己的tag都没问题。) 然后我又很不厚道的在首页重新登陆一次,又看到一个出错界面 :D

Perl 的出错调试信息还真TNND详细,甚至看到了一小部分的源码 :)

总结得到以下信息:

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

尽管对Perl的了解还不多,但是之前也见识过了Perl + Mason的威力,据说这组合的企业级应用还挺流行的。

另外从代码中虽然还看不出所使用的数据库,(我个人估计是MySQL),但是从这么简洁的SQL语句中可以看出目前并没有使用多数据库负载平衡的技术。这么多的用户看来服务器得足够强大。

不过既然已经收归Yahoo!的旗下,Jeremy ZawodnyPerl + MySQL技术看来又有用武之地了 :)

我觉得这次出错及有可能是在进行类似Flickr那样的和Yahoo!的帐号整合的调试造成的。

下面就是详细的出错信息…
Read the rest of this entry »

htaccess 学习笔记

December 6th, 2005

Apache的配置文件.htaccess是个难点,也是个重点。一直都没安下心来好好学学,甚至一直以为Redirect方法是属于mod_rewrite,用到的时候也都是糊里糊涂的。今天找到了一个很好的教程,一边学,一边写点心得。

updated: 不断修正一些小问题

Source: Comprehensive guide to .htaccess

Officical reference: Directive Quick Reference

Read the rest of this entry »

继续研究podcast

December 3rd, 2005

昨天在podlook提交我的这个锵锵三人行 podcast时,提交失败,提示feed验证失败。开始我还不信,都经过feedburner烧过了怎么还能出错呢? 找到feed validator验证,结果大跌眼镜,确实一堆错误,甚至还有一些很低级的,比如忘掉了在channel下的link这个必须的元素 :P。

今天找到RSS 2.0 SpecificationiTunes 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的验证服务了:)
[Valid RSS]

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 来了!

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用户太少是一个很大的门坎?

新苹果用户应该知道的10件事

November 30th, 2005

译自 10 Things Every New Mac Owner Should Know,作者Paul Stamatiou

windix: 这个入门文章提到的知识点还是不错的,作为Windows用户刚用苹果Mac OS X还真有些地方挺新鲜的。拿我来说,第一次看到有人把U盘拖到垃圾筒去还真是蛮震撼的:D 所以我摘要翻译与此,将它介绍给大家。当然我也增加了一部分我自己的心得。
Read the rest of this entry »

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

November 26th, 2005

每每Blog上面有人回复和有新的trackback,WordPress(包括之前更早用过的MovableType)都会向gmail转发一封通知信,配合gmail notifier的功能,我回复留言都是第一时间的 :P

唯一可惜的是,通知邮件的正文还好,没什么问题,标题中的中文确总是乱码的。

update: 已有AvP提供的WP插件,请见本文最后更新内容 :)

Read the rest of this entry »