October 4th, 2009 / No Comments » / by x5
“自动化”这个词大家都是耳熟能详了,但是如何把其应用到日常工作中,可就不是那么容易的事情了。《卓有成效的程序员》中曾经有过这么两句话:
1、不要浪费时间动手去做可以被自动化的事情
2、做简单重复的事是在浪费注意力
这两句话大家看了都觉得是真理,但却没有真正的“付诸行动”。不过话说回来,要想做到这两点,特别是对于我们这种non-programmer来说,是需要通过好用的工具来实现的,Mac恰恰为我们提供了这么一个平台,它提供了两种强有力的工具:
- Automator
官方对它的介绍是:
Automator is an innovative personal automation assistant that makes it easy to automate repetitive tasks. Automator lets you skip the complex programming and scripting that is normally required to create automations. Individual steps called actions can be assembled into a complete task by dragging actions into an Automator workflow. You can run your completed workflows repeatedly, and even share them with others.
- Applescript
Applescript是一种Apple自定义的脚本语言,它就不多做介绍了,之前我曾翻译过一篇介绍它的实例文章
下面我们拿一个实际的例子来说明Mac上的自动化到底是如何实现的。
背景:InfoQ中文站有很多编辑,我需要不定期的给过生日的编辑发送birthday greeting邮件,通常我会把邮件发送到我们的编辑群组里,让大家来共同祝贺过生日的编辑。以前在这个流程中,完全都是“手动”完成的,需要每天查看一下iCal,看看谁过生日了,如果有人过生日,就给大家发一封“祝贺寿星”的邮件。虽然这整个流程也就花费掉我3分钟的时间,但是,这就属于典型的“简单重复”。我不想再因为这些小事,浪费我的注意力了。
目标:把发送birthday greeting的工作,完全自动化。
想法:我首先考虑的是通过AppleScript来完成,首先调用Address Book(通讯录)查找“InfoQ编辑group”中谁是今天过生日,如果有人过,就把相关信息提取出来,再调用Mail,向编辑群组发送birthday greeting;如果没人过,就立刻停止。但是在实际做的过程中感觉,还是有些小麻烦,有没有更简单的方法呢,有,那就是Automator,以前只是听闻Automator,从来没有实践过,但是一用,发现还是非常容易上手的:Automator会自动把这一系列的Action(行为),用拖拽的方式来实现。但在做的过程中发现,Automator比较适合单一的流程,换句话说,如果一种任务,它分很多种不同的情况,不应该用一条workflow来实现,应当每种情况创建一条workflow,然后通过AppleScript来组织不同工作流之间的关系,这样既便于扩展,也便于管理。(笔者注:对于本实例而言,单独Automator便可搞定,不需要AppleScript的协助,这里只是提供一种通用的思路)
过程:
首先启动Automator,选择workflow(笔者注:对于本实例而言,也可选择“iCal Alarm”,这里只为提供一种通用的方法):

接下来选中左一栏的“Contacts”,把左二列的“Find Address Book Groups”拖拽到右侧,并设置好“Name contains infoQ”。然后再把左二列的“Filter Address Book People”拖拽到右边,设置好“Birthday is today”以及“Email contains @”。这一步,相信我不用多讲大家也能看明白:首先寻找通讯录中名为“infoQ”的群组(group),然后再从这里面找(Filter)生日是今天的,并且有Email信息的。很简单吧:

接下来,很可能没有找到任何今天过生日的人,那我们就应当果断的把整个流程“停止”了,没必要再继续下去。所以,你可以看到上图中,我在下面又添加了一个“Stop if input is Empty”,这个行为(Action)不是Automator默认带的,你可以从网上下,并安装上,然后它会被分类到左一栏的“Utilities”中。
现在我们已经找到了今天过生日的人,接下来就要获取寿星的信息(Contacts > Get Contact Information,只保留了名字和生日),然后用这些信息,发送新邮件(Mail > New Mail Message,设置好主题、收件人等信息。此步有一点需要注意──默认发件箱“Default Account”,如果你没有在Mail的Preferences中设置,它会自动把最活跃的帐号作为默认发件箱),最后,把邮件发送出去(Mail > Send Outgoing Messages),此流程如下图所示:

好了,到现在为止,流程部分就完成了,把它另存为Application,名为“birthday_email.app”。接下来,你需要通过iCal每天自动调用这个程序,但正如我在前面提到的,我们想通过AppleScript来控制不同的流程,虽然现在只有这一个流程,但是以防将来如果增加不同的分支(流程)。所以,打开AppleScript Editor,输入下面这些代码
-- launch "birthday_email" to send email greetings
tell application "birthday_email" to launch
-- wait for sending emails
delay 180
-- close Address Book
tell application "Address Book" to quit
这段代码我就不多讲了,可看其中的注释。好了,现在把它保存下来“launch_birth_email.scpt”。
最后一步,就是在iCal中创建一个event,repeat everyday,然后通过alarm调用这个脚本。

All Done:)
这就是在Mac上工作的乐趣!
Posted in: development, mac, novice, tutorial
August 10th, 2009 / No Comments » / by x5
续上:AppleScript终极入门指南(上)
制胜法宝:AppleScript字典
尽管AppleScript本身有大量不同的可用于任何OS X程序的命令,但是任何开发者都需要保证它的应用程序对AppleScript具有很好的支持。也就是说,开发者必须著有简单的说明,告诉大家如何通过AppleScript与他的程序进行通信。这些说明被称为字典(Dictionaries)。要想查看字典,打开Script Editor的File > Open Dictionary。把应用程序列表向下拉,点Mail,然后OK,便能看到下面这个窗口:

Mail字典
最左边那列显示出可用的命令组(Suites)。当你点击其中一个,会在下面看到它包含的所有内容。你可以点击第二列,看某一具体的方法,然后再点第三列,依此类推。每组都包含命令(蓝色圆C)和类(紫色方C),以及类属性(P)和元素(E)。为了弄清楚它们到底是怎么一回事,我们先用这个字典创建一个脚本。
创建脚本及其算法
首先,我们需要一个算法,它会准确的告诉脚本将要做什么。我们想创建一个脚本用于写电子邮件然乎发出去。我们想用变量来保存邮件内容以及收件人,这样便于修改。在我们写算法的时候,大脑要清楚AppleScript运作的方式。下面是我想的步骤:
- 创建变量用于保存收件人、收件人电子邮箱地址、邮件主题以及邮件正文
- 创建变量并通过不同的属性保存我们新的邮件
- 创建新的邮件
- 发送新的邮件
创建简单的变量
我们已经知道如何保存文本的变量,所以第1步我们已经搞定了。下面是具体的代码:
--Variables(变量)
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
正如你所见的,我们直接把姓名、邮件地址、主题以及内容存放在了变量中。你可以随意修改它们的内容。请一定要把你自己的邮箱地址放在recipientAddress变量中,这样你一旦收到邮件就表示这个脚本是正确的。
用Mail字典创建邮件变量
我们还不知道如何创建一个新的邮件,这部分需要参考AppleScript字典。如果你点击“Standard Suite”(标准组件),你会看到其中的常见命令。为了知道如何创建(create)新的邮件,我们在选项(options)里寻找相关的命令,但是却找不到“create”(创建)命令,但是却在里面发现了“make”命令。这看起来不错,我们现在确实要让AppleScript做(make)些什么。
下面点击“Mail”组件,我们已经知道了要用的命令(make),所以向下滚(scroll down),略过那些命令(动词),看那些类(名词)。首先你会看到“outgoing message”,太棒了,这正是我们想要的。现在点“outgoing message”,可以看到它可用的属性(如下所示)。
我们需要导入接受者姓名、接受者电子邮件地址、主题以及内容这些变量。但是在属性列表中,却没有发现任何关于接收者的,不过有主题和内容属性。我们现在知道了引用这些属性的正确语法。可以看到,字典里告诉了你定义属性的格式,拿主题来说,首先是键入“subject:”,之后跟随主题的文本。

主题内容
在这个组件中,你可以看到“send”(发送)命令,我们现在还需要知道收件人姓名以及电子邮件地址的正确语法。但是,它却不在这个组件中,点“Message”组件,在列表中间的位置,我们找到了recipient。点recipient类,看到了其中的属性,我们可以用普通的文本(只需键入“name”和“address”)引用recipient的属性。
你可以利用搜索功能迅速找到想要的属性(properties)、类(classes)、元素(elements)以及命令(commands)。
好了,现在就用刚刚学到的语法创建我们的邮件吧,代码如下所示:
--Variables(变量)
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
--Mail Tell Block(Mail的Tell代码块)
tell application "Mail"
--Create the message(创建邮件)
set theMessage to make new outgoing message with properties {subject:theSubject, content:theContent, visible:true}
end tell
可以看到,我用tell代码块包含了所有给Mail程序的命令。然后我让一个变量(theMessage)去用上面的属性创建(make)新的邮件(outgoing message)。要注意的是,所有属性都包含在大括号({})中。
最后一步:设置接收者并发送邮件
我们创建了自己的邮件变量,现在需要调用这个变量,并用theMessage的属性创建一个新的邮件。我们还需要设置接受者并把邮件发送出去。要想实现它,我们需要给变量使用一个tell代码块。下面是最终的脚本:
--Variables(变量)
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
--Mail Tell Block(Mail的Tell代码块)
tell application "Mail"
--Create the message(创建邮件)
set theMessage to make new outgoing message with properties {subject:theSubject, content:theContent, visible:true}
--Set a recipient(设置接收者)
tell theMessage
make new to recipient with properties {name:recipientName, address:recipientAddress}
--Send the Message(发送邮件)
send
end tell
end tell
首先,我们创建了一个新的theMessage(它结成了我们赋予它的所有属性),然后为其赋予接收者的属性。这也就告诉了Mail我们需要用通过下面的几个属性增加接收者。这里用到的语法就是上面刚刚学的。
最后,我们调用“send”命令,把邮件发送了出去。可以看到,最后要关闭两个tell代码块。当你编译完代码,并修正了报错以后,点击“Run”(运行)。Mail应当会自动创建并发送这封邮件。欧了(Tadaah)!检查一下你的发件箱,看看是否一切正常。

Mail邮件
祝贺,你已经完成了第一个AppleScript脚本。你可以把它保存为一个简单的脚本(Script)回头可以再编辑,或者保存为一个程序(application),当你打开它的时候,就会自动运行。
总结:深入学习
我希望本入门指南能够让你考虑一下那些能够自动化的过程与任务。这里为你展示的AppleScript字典中的语法已够你应付日常工作。但是,如果你真想用AppleScript做很多有用的事情,你还得深入学习一下。Apple在其网站上提供了很多AppleScript的内容,你可以从那里开始。
另外一个我认为很有用的网站是T&B,它为你提供了一些深入的技术文章与教程(略显老久,但很有料,并且是免费的)。
Posted in: development, mac, novice, translation, tutorial
August 4th, 2009 / 4 Comments » / by x5
原文:The Ultimate Beginner’s Guide To AppleScript。
AppleScript是一种内建于OS X的脚本语言。它的主要工作是自动执行那些重复而耗时的任务。举个例子,作为Freelancer,我很厌烦每周为不同的客户创建清单(invoice)。为了解决这个问题,我写了一个AppleScript脚本,用它来读取我记录在iCal上的日志,然后根据它们的时间用Microsoft Excel自动创建清单,并发送给我的客户。所有任务,一键搞定。
值得称道的是,AppleScript并不是被编程高手所独享。实际上,你无需拥有任何编程经验。本文将告诉你如何用最简单的指令(这些指令都已内建于每一个应用程序的框架中)为几乎任何一个应用程序编写AppleScript脚本。奇妙吧?继续读读就知道了!

主窗口
入门:Tell语句
要想编写AppleScript,首先打开 Applications >> AppleScript 文件夹下的“Script Editor”。你会看到一个简单的窗口,其中包括一个大的文本输入区域,上面有一排按钮。在文本框里输入下面这行代码:
1
2
3
| tell application "Finder"
display dialog "Hello World"
end tell |
AppleScript试图用平实的语言(英语)最大限度的简化代码。大多数命令都被包含在Tell代码块(tell block)中。它之所以被称为Tell代码块,是因为你正在告诉(Telling)某个指定的应用程序去做你想做的事情。比如,上面的代码是告诉Finder显示一个包含有“Hello World”的对话框。在你对那个应用程序交代完指令后,用“end tell”结束代码块。
切记要结束你的tell代码块,否则代码将不能编译!
在你输完代码,点击“Compile”(编译)那个锤子图标。如果语法是正确的,你的代码将自动被赋予格式和颜色。如果其中有错,Script Editor会高亮错误的区域,并显示错误信息。下面是在编译代码中常见的几种颜色(详见 Script Editor > Preferences)。

颜色指南
代码编译后,点击“Run”(运行)按钮,便会看到下面这个对话框了:

您好,世界
现在点击“OK”按钮,瞧一眼Script Editor窗口的下面。只要你一运行脚本,Script Editor就会告诉你结果是什么或者返回(return)了什么。这里,它就是告诉你“OK”被点了。

返回OK
声明变量
变量在任何一种语言中都是非常必要的。它们提供一种简单的方式用于读取或操控代码中的信息。每种语言创建或“声明”(declaring)变量的方式有所不同。在AppleScript中,要像下面这样声明变量:
1
2
3
4
| set theString to "Hello World"
tell application "Finder"
display dialog theString
end tell |
上面这个例子中有几点需要注意。首先,可以看到是用“set”和“to”命令来声明变量的。这里,你设置的变量名为“theString”,它的值为“Hello World”。许多编程语言都有要求声明变量类型(比如整型、浮点、文本等等)但是AppleScript有足够智能,可以识别出你的变量,无需任何说明。
同样要注意的是变量名的写法。你不能在变量名中加入空格,比较好的方式是采用camel法(theString)或者下划线法(the_string)。至于你选择哪种方式,这是无所谓的,关键要在代码中保持一致。尽量让你的变量名有意义。当你读其他人的代码时,“myWariable”这种变量名会令人非常恼火,因为既看不出变量值是什么也看不是它用作什么。
最后要注意的是,我在变量中存放了一段文本“Hello World”,可以在整个代码中不停的调用这个变量。所以,如果过后我想把“Hello World”改成“Good Morning Dave”,我只需要在声明变量的地方改一下就可以了。
变量运算
你可以对变量做各种疯狂的事,但是本文只是关于AplleScript的一篇短文,所以我简单的为大家展示几个。输入下面这些代码:
1
2
3
4
5
6
7
8
9
10
11
12
| --Integer Variables(整型变量)
set the FirstNumber to 3
set the theSecondNumber to 2
--Variable Operations(变量运算)
set theAnswer to (theFirstNumber + theSecondNumber)
set theAnswer to (theAnswer + 1)
--String Variables(字符串变量)
set theString to "3+2+1="
--Display Dialog(显示对话框)
tell application "Finder"
display dialog theString & theAnswer
end tell |
小提示:按一下“enter”键(不是“return”键)就马上开始编译了。对于台式机来说,这个键在数字小键盘上,而在笔记本上,它位于空格右侧苹果键的旁边。
随着你的脚本越来越复杂,代码就需要有些“条理”。在一行文本前加两个小横杠“–”就相当于添加注释。用注释来分隔代码的不同区块,有助于导航。在上面的例子中,我创建了一个字符串变量(只有文本)以及几个整型变量。需要注意的是,你可以在变量中进行数学运算。比如,我把“theFirstNumber”设成3,“theSecondNumber”设成2,然后在“theAnswer”里对它们求和。
还有一点,你可以在声明后改变变量。在把“theAnswer”设成“theFirstNumber”与“theSecondNumber”之和后(此时结果是5),我又给“theAnswer”加了1(结果是6)。如果你运行这个脚本,会看到如下所示的结果:

简单的数学运算
再强调一下,这仅仅是展示了一下变量运算的皮毛。现在你应该明白,变量不是“一成不变”的。编程语言的强大之处就体现在它们能够操作变量完成各种复杂的任务。
(未完待续)
Posted in: development, mac, novice, translation, tutorial
July 29th, 2009 / 4 Comments » / by x5
因为体型缘故,可买的衣服品牌十分有限,现在基本上可以说是“唯一”──LRG。
前阵子,同事问我,你穿的是啥牌子的衣服。弄得我一愣,不知如何回答,只能简答到,一个专门出肥大衣服的品牌。
看来,要对大家普及一下LRG了。

LRG是1999年由Jonas Bevacqua(上图的小伙,就是Jonas,现在刚刚30出头)和Robert Wright创建的一个专门出嘻哈服饰的公司,这么说,其实不能准确的表达出LRG的本质,它想做的不仅仅是嘻哈,它的风格很难界定,是一种融合了滑板、冲浪、都市嘻哈等多种风格的服饰,现在LRG已经不仅仅出衣服了,从头到脚都有涉猎,而且跟很多电子厂商合作,出自己的电子产品及其配件。
要说LRG在美国有多火,看看下面KANYE WEST穿啥就知道了:

LRG之所以广受人民群众的欢迎,不仅仅是因为他的设计、款式,而是其中蕴含的精神,在SGV对Jonas Bevacqua采访中,曾经有这么一段,你看看就知道了:
SGV: so for kids trying to get into the fashion game what advice do you have for them?
Jonas: my advice would be to really believe in your idea and really go after it. you can’t just sit on a couch and think something is gonna strike you and all of a sudden and you have a company. be willing to put in the time and energy it’s gonna take. keep your head down… no matter what people say or who hates on you just do what you gotta do. you have to really believe in what you’re doing. there’s a lot of talk out there… oh I’m gonna do this, or I’m gonna do that. that’s great, now go screen some shirts, go get that account, go stay up for 2 days in a row and ship out product all day. you have to really go after it. have a great mentor like Robert Wright and don’t worry about anybody else and just believe in yourself… that’s it. oh yeah, remember haters hate because you have what they want, instead of hating you should admire them and use that inspiration as fuel and apply it to your own life.
所以,套用一句现在流行的句式:我们穿的不是LRG,是精神。
Posted in: life, me
June 12th, 2009 / 2 Comments » / by x5
一眼望去,都是tweets,blog变成了twitter,这不成啊。做了以下改变:
1、不在blog上post tweets了。
2、在blog的sidebar中显示tweets。
3、把Archives变成下拉菜单,减少sidebar的长度
呵呵,要发些正经的文章啦:) 改给blog出除除草了。
Posted in: tweets
June 7th, 2009 / 2 Comments » / by x5
Posted in: tweets
May 31st, 2009 / No Comments » / by x5
Posted in: tweets
April 19th, 2009 / No Comments » / by x5
Posted in: tweets
April 12th, 2009 / No Comments » / by x5
Posted in: tweets
April 12th, 2009 / 3 Comments » / by x5

Posted in: mac, tech