在wanup script那里调用自己的脚本, /jffs/wanup.sh

这个脚本的内容是

#!/bin/sh
mkdir /etc/iproute2
cp /jffs/rt_tables /etc/iproute2/rt_tables
/usr/sbin/ip rule add from 192.168.1.2 table novpn
/usr/sbin/ip rule add from 192.168.1.3 table novpn
/usr/sbin/ip rule add from 192.168.1.4 table novpn
/usr/sbin/ip route add $(nvram get wan_gateway_get) dev ppp0 proto kernel scope link src $(nvram get wan_ipaddr) table novpn
/usr/sbin/ip route add 192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.1 table novpn
/usr/sbin/ip route add default via $(nvram get wan_gateway_get) dev ppp0 table novpn
/usr/sbin/ip route flush cache

前两行是创建iproute2的文件,

/jffs/rt_tables 内容是

255 local
254 main
253 default
0   unspec
200 novpn

仅有默认值外加了另外一个novpn路由表(我的默认main路由表是走vpn的),往下三行是让3个台式机的IP不走vpn,只走novpn路由表。

然后下面三行是把默认路由添加到novpn路由表,命令其实是从新启动的未做修改的默认main路由表上抄的。最后flush一下。


以上是和fqx的邮件聊天记录,做简要说明;后面的是目前5月28日的路由上的脚本详情:


=== init ===

mkdir /etc/iproute2                                                             
cp /jffs/script/rt_tables /etc/iproute2/rt_tables                                      
/usr/sbin/ip rule add from 192.168.1.2 table novpn                              
/usr/sbin/ip rule add from 192.168.1.3 table novpn                              
/usr/sbin/ip rule add from 192.168.1.4 table novpn  

=== wanup ===

/bin/sh /jffs/script/wan-up.sh
/bin/sh /jffs/script/chnroute.sh

=== wan-up.sh ===

#!/bin/sh
/usr/sbin/ip route add $(nvram get wan_gateway_get) dev ppp0 proto kernel scope link src $(nvram get wan_ipaddr) table novpn
/usr/sbin/ip route add 192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.1 table novpn
/usr/sbin/ip route add default via $(nvram get wan_gateway_get) dev ppp0 table novpn
/usr/sbin/ip route flush cache

=== chnroute ===

#!/bin/sh
OLDGW=$(nvram get wan_gateway_get)
route add -net 1.0.1.0 netmask 255.255.255.0 gw $OLDGW
route add -net 1.0.2.0 netmask 255.255.254.0 gw $OLDGW
route add -net 1.0.8.0 netmask 255.255.248.0 gw $OLDGW
Anonymous Asked
Question看到你在推上求前端,是在哪个城市的? Answer

只是咨询个技术问题。。。 现在已经没有问题了。。。谢关心:)

Anonymous Asked
Question你是程序员? Answer

我是程序员~ 现在主要写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)

我们来总结下研究结果:

  • 普通组和精英组用在工作/练习的时间长度几乎都是每周五十小时
  • 但是普通组用于刻意训练的时间只有精英组的三分之一,他们的时间分配方式不同
  • 普通组将无目的无组织性的工作分配于全天各时段,于是尽管他们也付出了很多时间,但是却没有换回足够和充分的睡眠、休闲时间,他们并没有感到轻松和无压力;与此同时专业水平还在人之下

同样的现象在过去对于那些有成就的人的研究中屡见不鲜。此项研究的结果对我之前的关于“全力工作和费力工作(Hard Work VS Hard to Do Work)”之间的差别又提出了解释:

  • 全力工作(Hard work)就是“刻意训练”。当你进行全力工作时候,这工作就是不那么舒坦,但是你不用做太长时间,每天一点就可以。例如此研究的精英组几乎每天只进行两段刻意训练,一共只有3.5小时。这样做你就会得到与日俱增的能力提高,由可观的进度也刻意增强信心和兴趣。也因此,虽然全力工作很枯燥和艰苦,但是它不会持续,你可以做完以后轻松享受剩余的时间。
  • 与全力工作对比费力工作(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”,加上试验,修改,调试,就完成了这个功能。所以,写程序也不难,让电脑听话也是有趣事:)

参考最多的一篇博文 Applescript: Moving and Resizing Windows

用了一段时间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


  • 以上使用sed程序的替换命令对 /etc/hosts 文件做操作。
  • "$HOUR" -ge 13 -a "$HOUR" -lt 18表示如果时钟小时数大于等于13并且小于18,这个可以根据需要进行调节(脚本中的时间是我司上班时段:)
  • sed命令为了在此theme中不显示太长造成难看的状况,我用\将其折成了3行了,没有实地测试是否这个折行是没有问题的

最后,使用

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

make signature

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

multiple signature

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

result page

Preview程序还能够保存多个签名,这将对无纸化办公带来极大的方便。

译注:因为“数字签名”(维基百科:数字签名)一词和本文中描述的“扫描个人签名图像并合成叠加于数字文档图像”这一概念是不同的,所以译文使用“数字化签字”等取代,标题中将“数字签名”加引号。

Anonymous Asked
Questiontaste一点开,让我吃了一惊,我靠! Answer

欢迎浏览:)欢迎反馈:)