我是程序员~ 现在主要写mac/iOS apps~
原文: If You’re Busy, You’re Doing Something Wrong: The Surprisingly Relaxed Lives of Elite Achievers
上世纪九十年代,三位心理学家在位于西柏林中心的历史悠久的柏林艺术大学进行了一项研究。这个小组的研究对象是小提琴演奏者,他们成文于Psychological Review的研究报告说明了他们研究过程。心理学家们请学院的音乐教授帮助他们选择一些他们认为“很有前途”、“未来极可能成为专业演奏家”的小提琴演奏者,本文称这一组研究对象为“精英组”。然后研究员们又请教授们从学校的教育部挑选出未来将成为音乐教师的一些学员,他们也是合格的小提琴演奏者,但是专业水平和第一组并不在一个级别上。本文称这一组研究对象为“普通组”。
三位研究员对他们的研究对象进行了一系列深入的访谈,并且给每一位被研究对象一本时间日志,这个日志本上将一天24小时分成了若干个以50分钟为单位的时间段,被研究对象需要在回到家后详细纪录每一个时间段自己都是如何分配时间,完成了哪些事情。研究小组希望通过这些数据获得一个问题的答案:为何精英组的专业水平高于普通组。在得出结果之前,很明显地人们都容易认为精英组更专注于他们的业务训练,也即是“把别人用来喝咖啡的时间用来学习/工作/练琴”。而经过详细对比研究数据,事实并非如此⋯⋯
首先我们先来用研究数据来否定常规的设想,两组被研究对象的日志记录显示,他们每周用于音乐训练的平均时间都是50小时,也就是精英组并没有花更长的时间用在专业训练上。
那么,差异并不是不存在的,经过对比研究人员发现,专业组的演奏者在“刻意训练(deliberate practice)”方面用的时间却是普通组的3倍;结论便是:无聊地、系统地训练才能锻炼才干。或许这也并不令人惊讶,类似的结论Gladwell也有提及。
研究小组并没有止步于此。他们发现普通组的演奏者将工作/练习时间贯穿于全天始终,在研究报告的一张图表上显示他们的工作时间对比非睡眠时间是几乎平直的。而精英组中的成员,他们将工作/练习时间锁定在两个相对固定的时间段中,一次在上午一次在下午,相同的图表会显示出两个峰值。并且,事实上越是精英的演奏者,其峰值越整齐;被研究对象中最最精英的那些,教授们认为日后一定会在德国最著名交响乐团演奏的学生,他们的训练时段峰值就是整齐划一每天不变的。
工作和休闲时间进行良好的分离,这对其他领域的人们来说也是提高效率的良方。以睡眠为例,此项研究中显示,精英组的平均睡眠时间比普通组多出一小时。在休闲娱乐方面,研究小组请小提琴演奏者们估算自己每周专门用来进行娱乐休闲的时间长度(衡量心理轻松的重要指数),其结果是精英组的休闲娱乐时间明显多于普通组,越精英的人休闲时间越长。
我们来总结下研究结果:
同样的现象在过去对于那些有成就的人的研究中屡见不鲜。此项研究的结果对我之前的关于“全力工作和费力工作(Hard Work VS Hard to Do Work)”之间的差别又提出了解释:
此项分析研究得出的重要结论便是:无论你是学生还是在工作,如果你的目标是过着有意义而充实的生活,那么看似终日忙碌和重压倦怠是你最大的敌人,你要改变你的工作方式和时间分配。否则你就是柏林艺术大学研究项目中的普通组,而非精英组。
我之前的体会和此项研究的过程和结论,再次提醒我们:做不必多,但凡进行必集中精力、全力以赴,做完即止,享受生活。
最近一段时间我处在一段转折期中,在此期间我承受了比以往更大一些的来自各方面的压力。
大约一个月前,我有一周时间中断了锻炼。
中断的结果是,我突然意识到了这是多么自欺欺人。我一直认为,让人们生活得更为健康是我们当今社会进步的一大源动力。然而那一周里的我,也沦落到了拿各种托词做借口的田地:太多的工作、没有时间、太累了、太难了、明天吧⋯⋯
于是我做了一个决定,我决定将所有事情重排优先级。
在过去的一个月里,我的每一天中第一要务变成了坚持锻炼,我把锻炼放在了最重要的位置,它高于开会、工作任务、娱乐休闲等等。
坚持下来一段时间,我发觉以前没有这样做的日子是多么荒唐至极啊。因为锻炼,你可以:
每天工作八小时然后进行适当的锻炼,获得的收获将远大于十小时的工作时间。
认识到日常锻炼是第一要务,这其实是一件很简单的事。如果你没有将锻炼作为你的最高优先级的事情,那么你的顺序表就是不合适的。
(Source: nickcrocker.com)
Blog没怎么写,倒是天天总结AppleScript~ 其实可以写个applescript分类了,呵呵~
最近又折腾一档子 便民 利己小工具,窗口布局器。这名字听起来怪怪的,我也没有怎么仔细想过,姑且先这么叫吧。需求来源是,有时候要对照某个web页面的内容,在另外一个web页面或者其他程序里面写邮件或者做其他事情,这个需求是很多人都有的,工作生活中也很常见。解决办法一般都是移动和缩放两个窗口摆在桌面两边,或者上下两部分,或者两个显示器上。如果有个工具可以方便快捷完成这个操作,那应该不错。今天的“窗口布局器”就完成的这个功能;并且我还借鉴了Windows 7中摸索到的还没有精确确认的neat小功能,WIN+上下左右方向键对窗口进行最大/最小化等操作,最终让今天折腾的窗口布局器和QuickSilver快捷键设置绑定起来,做到最快布局窗口。
功能需求/描述是这样:编写 ResizeRepos.scpt ,通过执行它可将当前窗口尺寸变为全屏幕的高,全屏幕的N分之一宽,并且移动到距离窗口左上角位置最近的(宽度的N分之一的整数倍,0)的坐标。用通俗点的语言就是,假设你想把屏幕分成左右两半,执行ResizeRepos.scpt脚本后,无论你现在打开的是Terminal还是Preview,都会使窗口占据屏幕的一半,是左半边还是右半边取决于窗口原始位置是略靠左还是略靠右。如果已经移动到了屏幕的最左边,再次执行该脚本会将窗口移到最右边,再执行一次会移动回最左边。更为奇妙的是,如果你的桌面足够大,将屏幕分为三份/四份也是可以的。
废话不多说,上代码~~
property _deskwidth : 2048
property _deskheight : 1152
property _segments : 2
on run argv
if (count argv) is not 0 then
set _segments to (item 1 of argv) as integer
end if
set _cellw to _deskwidth div _segments
set name_ to the name of (info for (path to frontmost application))
tell application name_
set {_posx, _y, _bx, _by} to bounds of front window
set _newpos to _posx div _cellw * _cellw + _cellw
if (_newpos ≥ _deskwidth) then
set _newpos to 0
end if
set the bounds of the first window to ¬
{_newpos, 0, _newpos + _cellw, _deskheight}
end tell
end run
注:“¬”是折行符号,实际写的时候可以把它连接的两行连起来;“≥”是大于等于号,输入>=即可,保存的时候AppleScript Editor会自动变为≥
解释之:
_deskwidth 和 _deskheight 是自己桌面的宽和高,自己根据需要调整;动态获取也是可以的,比如获取宽度就是 set _deskwidth to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number;显然自己桌面尺寸不会天天变,我们就不动态获取了;还有就是对于双显/三显/四显的土豪们,请参考 Daring Fireball 06年某文 解释多显虚拟桌面计量的文章,此处不多讨论
if (count argv) is not 0 then 一直到if结束,是获取执行时候的参数;我们希望调用的时候调用者告诉脚本是将屏幕划分为两半还是三瓣。。。
set name_ to the name of (info for (path to frontmost application)) 此行获取当前程序的名称,下面的tell都是在该程序中进行操作
set {_posx, _posy, _botx, _boty} to bounds of front window 获取当前程序的当前窗口左上角xy坐标右下角xy坐标
对获取的xy坐标进行计算,这么简单的就不解释了,然后通过 set the bounds of the first window to {_newpos, 0, _newpos + _cellw, _deskheight} 将新坐标发回给窗口,就设置完成了位置和尺寸
仅仅写完了这个还没有彻底结束,这个script如果只是在Finder里双击运行或者Terminal里命令行执行,就只能修改修改这俩程序的窗口位置和尺寸了。现在我编写了两个脚本split2.sh和split3.sh,各自都只有一行,他们分别是 osascript /Users/kcome/sh/scripts/ResizeRepos.scpt 2 和 osascript /Users/kcome/sh/scripts/ResizeRepos.scpt 3 ;看到了吧,只有最后一个字符不同,第一个就是分两半的方案布局窗口,第二个是分三瓣。
然后进入QuickSilver的Triggers界面,添加项目,Select an item选择刚才写的split2.sh,Action就是默认的Run […],Target随便写一个字符(否则用快捷键启动时候会被询问Target,其实在这里是无用的参数);然后添加保存,指定快捷键,就大功告成了。按下快捷键试试吧?
其实,要说我这博有啥意义的话,我想只有两点,一个是想说AppleScript很强大,基本上发挥自己的想象力,可以完成许许多多的有趣有用功能;另外一个就是,善用google,勇于尝试,我不过是花了一两个小时,搜索了不到十个关键词组,比如“applescript get current desktop size”、“move window by applescript”、“howto get argument in applescript”,加上试验,修改,调试,就完成了这个功能。所以,写程序也不难,让电脑听话也是有趣事:)
用了一段时间VPN自动拨号脚本,觉得没啥大问题,有两个问题,一个是输入管理员密码的时候不能自动将焦点移到输入框中,二个是如果拨号不成功当前脚本不会自动退出运行。今天更新个小tip解决问题一。
其实很简单,将
on run {input, parameters}
-- 和以前一样的所有内容
end run
变为下面的即可
on run {input, parameters}
tell me
activate
-- 和以前一样的所有内容
end tell
end run
其实还有个可以完善的地方,应该是检测当前vpn IP地址和hosts文件中的是否一致,如果一致就不要修改它了,可以跳过管理员密码输入这一步骤。
过去N年都上推太多,过去一年总想限制自己上twitter的时间,让工作效率提高起来,但时常看着 rescuetime.com/dashboard 的 social network 类别当日使用时长超过一小时(我给自己定的上推时长阈值),依然停不下看推发推的步伐。。。 最近借着内部和外部多种因素,写了个限制发推时段的脚本,现在把方法和经历总结一下。
要做的是: 限制在制定的时段内,twitter.com不能在电脑上访问,无论客户端还是browser。系统环境是Mac OS X 10.7,随便想了几种方案,决定用crontab加bash script修改/etc/hosts文件中twitter的api/stream/search地址来完成操作。
首先,/etc/hosts 文件中添加如下三行
127.0.0.1 api.twitter.com
127.0.0.1 search.twitter.com
127.0.0.1 stream.twitter.com
这时候twitter就无法访问了。然后写一个bash脚本,根据当前时间,确定在上面的几行内容最前部前添加或者去除注释符号来完成启用或者禁用封锁twitter的功能。脚本blocktwitter.sh内容如下
#!/bin/bash
HOUR=`date "+%H"`
BLOCK=0
if [ "$HOUR" -ge 9 -a "$HOUR" -lt 12 ]; then
BLOCK=1
fi
if [ "$HOUR" -ge 13 -a "$HOUR" -lt 18 ]; then
BLOCK=1
fi
if [ "$BLOCK" -eq 1 ]; then
#echo "block twitter"
sudo sed -i -e \
"s/^#127.0.0.1 \(.*\).twitter.com/127.0.0.1 \1.twitter.com/g" \
/etc/hosts
say "Now blocking twitter"
else
#echo "unblock twitter"
sudo sed -i -e \
"s/^127.0.0.1 \(.*\).twitter.com/#127.0.0.1 \1.twitter.com/g" \
/etc/hosts
say "Now unblocking twitter"
fi
"$HOUR" -ge 13 -a "$HOUR" -lt 18表示如果时钟小时数大于等于13并且小于18,这个可以根据需要进行调节(脚本中的时间是我司上班时段:)最后,使用
sudo crontab -e
命令编辑root用户的定时任务。在编辑器中添加
0 * * * * /bin/bash /Users/username/shell/blocktwitter.sh
行尾一定要有换行/回车。表示每小时的第0分钟执行/Users/username/shell/blocktwitter.sh脚本。这样,每小时检查并根据策略执行一次启用或者禁用twitter域名封锁的禁推脚本就完成了。
注意:最初不知道为何我试验crontab的时候总是执行不到脚本内容;后来经过不知是偶然还是必然的一次修改尝试,我把最后一个定时条件/最后一个星号(*)和执行命令(/bin/bash)之间的空格换成了TAB(制表符/0x09)就一切OK了,后来因为时间所限(其实是懒!)没有查证了,有空和好奇心的童鞋可以探究一下,可以告诉我下结论。还有就是crontab可以(有些是必须)添加SHELL/PATH/MAILTO环境变量,否则有些脚本中的功能会执行不了。
本文中还是有一些说得不够细致,也还有功能不足之处,不过这些细节和补充都是可以google到的,我也是一边google一边写完了这个脚本,不带debug奇怪问题的话也就半个小时就完成了这个功能,大家有什么更多需要更好的主意,尽情地自己扩展吧:)
我推特 https://twitter.com/kcome :)
译自:TUAW之Mac 101: Capture your signature using OS X Lion’s Preview app

Mac OS X 10.7 Lion自带的Preview(预览)程序提供了对PDF进行数字化签字功能。尽管在Lion之前的Mac OS X版本中你一样可以扫描手写签名图像文件,使用批注工具将其“贴”在签名档处,甚至还可以打印文档,用墨水进行签字然后再扫描回电脑;无论怎样这一过程都是复杂而繁琐的。

在Lion里,Preview程序自带的“签字图案”扫描功能使得数字文档署名签字过程变得简单无比。从批注工具栏里你可以直接使用Mac Mini除外的每一个Mac都配有的iSight摄像头拍摄签字样张,然后在摄像头前对齐基准线即可。

Preview程序还能够保存多个签名,这将对无纸化办公带来极大的方便。
译注:因为“数字签名”(维基百科:数字签名)一词和本文中描述的“扫描个人签名图像并合成叠加于数字文档图像”这一概念是不同的,所以译文使用“数字化签字”等取代,标题中将“数字签名”加引号。
欢迎浏览:)欢迎反馈:)
“输入助手”(TISPal)今天发布v0.1。此次第一个发布版本仅有一个功能:记住每个应用所使用的输入法,在用户切换到某程序时,比如用CMD+TAB,自动切换到上次离开该程序时的那个输入法。也可以说让你获得类似Windows系统的输入习惯。 下载 http://j.mp/pRHbfI
三到四个月前我第一次用Mac OS X 10.7 Lion Developer Preview,当时还没有装QIM输入法,就用了Lion自带输入法,因为速度并不慢,选字方式一下子就习惯了,还有最吸引我的Apple集成的颜文字,我就决定在10.7发布后只用Apple官方中文输入法不再安装第三方输入法,主要是洁癖因素和个人喜好。
但是QIM或者说其他输入法中有一个我非常需要的功能Lion自带拼音输入法没有,那就是“Silent for applications…”,即:在某些应用程序中关闭输入法。像我这样经常用Terminal进行操作的,一边用拼音输入法发完中文tweet,一边又回到Terminal删除文件,这个时候就特别需要这个功能了。刚在10.6雪豹装好QIM的时候,我就第一时间设置了某些程序中不使用拼音输入法,我一直认为这是一个非常有用、常用的功能。
因为不可能期待Apple开发这样的功能,并且经过简单研究发现控制应用程序中切换为特定输入法可以用Carbon框架中的函数实现。我就决定开发一个小工具实现这样的功能。
拖着拖着,拖到了Lion发布了,学Cocoa和Objective C对我来说也就是近一两个月的事儿,所以今天才有v0.1见人。程序可能还有些bug,我自己也从今天开始使用这个程序,写此blog之前也没有经过什么测试,所以如有问题可以在twitter.com/kcome , github.com/kcome/tispal 或者这里向我提出,我会尽力修正,并提供大家喜欢的需要的关于输入法管理和控制方面的功能。从简短介绍大家也看出来了,其实我最初希望获得的“Silent for applications…”功能并没有在此版本中实现,但是如果今天这个v0.1版本所提供的功能能够运行正常,通过用户的检验的话,那么特定程序锁定输入法的功能其实也近在眼前了。
最后再提两点,第一,本程序是开放源代码项目,所有代码可以从 github.com/kcome/tispal 获得,代码发布遵从Mozilla Public License许可证。这样的一个原因是输入法属于敏感部件,对安全性有要求的童鞋们可以稍稍放心一些。第二个是,程序图标是我自己“用极简陋方法”画的,如果对此有不喜欢或不适,欢迎投稿:)
谢谢观赏,欢迎留下您的看法:)
从这次开始,把一些技术技巧记录也写在blog里,否则对我这种写博拖延症来说,保持一定频率真太难了。。。拖延症其实都是coding或者干活强迫症造成的,干活强迫症有点让我其他什么都进行困难了。。。废话少说,正题开始,这是一个条件略有复杂和奇特的case,需求可能有些和别人的不同,之前没有搜到特别完美的方案,就把自己的脚本以及折腾过程记录下来。
全程仅用Autormator里添加一个“Run AppleScript”任务,任务中有不少“do shell script xxx”的语句调用命令行工具。代码如下
on run {input, parameters}
set REMOTEIP to do shell script ¬
"curl -s http://11.22.33.44:8080/showip | grep -Eo \"([[:digit:]\\.]+)\""
do shell script "sed -i -e \"s/.* remoteIP.local/" & REMOTEIP & ¬
" remoteIP.local/g\" /etc/hosts" with administrator privileges
do shell script "dscacheutil -flushcache"
do shell script "route -n add -static " & REMOTEIP & ¬
" 192.168.2.1" with administrator privileges
tell application "System Events"
tell current location of network preferences
set VPNservice to service "VPN NAME IN SYSTEM PREFERENCES"
if current configuration of VPNservice is not connected then
connect VPNservice
repeat while current configuration of VPNservice is not connected
delay 1
end repeat
end if
end tell
end tell
do shell script "route -nv add -net 192.168.0.0/24 10.0.0.2" ¬
with administrator privileges
return input
end run
其中“¬”是OPTION+ENTER/RETURN,只是将太长的单行语句折行方便显示用的。
curl -s http://11.22.33.44:8080/showip | grep -Eo "([[:digit:]\\.]+)"
因为暴露远程网络IP地址的静态页面显示的并非一个单独的IP地址,这里用grep把其他无用信息过滤掉,将被扒光的IP地址付给变量REMOTEIP
do shell script "sed -i -e \"s/.* remoteIP.local/" & REMOTEIP & ¬
" remoteIP.local/g\" /etc/hosts" with administrator privileges
我再解释一下上面这行。因为远程网络的IP地址不固定,而Mac OS X里PPTP VPN的目标IP地址目前没有找到好方法用命令行或AppleScript修改,所以这里采用的方法是填写一个本地主机名“remoteIP.local”,然后在 /etc/hosts 文件中写入 “11.22.33.44 remoteIP.local”,这样就避免了在AppleScript或命令行下修改VPN连接目标IP的需求。这个方法虽然有点迂回和龌龊,但是其他更便捷的方法还没发现。缺点还包括每次连接vpn都要修改hosts文件,洁癖表示接受起来鸭梨略大。
route命令是让VPN连接走指定网关的。我是一开机即连上美国VPN的并设置为全局路由,而这里又希望连接办公网络的PPTP VPN不经过美国VPN,就指定了直接从网关经过。
下面的VPN连接代码应该是很容易可以google到的,到处都有解释这里就不多说了。
注意一点是如果命令行操作需要sudo,只需要去掉它并在do shell script “bla bla bla”后加“with administrator privileges”即可。虽然简单的东西也找了挺久,不知道是我不会找还是AppleScript文档比较囧。
其他就没什么了把。先到这里吧:)