Leopard下如何让你的sudo不需要输密码

在Snow Leopard的Terminal里面用sudo的时候总是需要输入密码,而在单位的FreeBSD服务器上则不需要。我觉得从安全角度来说这个密码用处不大,有了反而会浪费时间。

搜索了一下,发现要这样做

修改/etc/sudoers文件(记得sudo vi它,存的时候要w!),去掉这一行前面的#号:

%wheel ALL=(ALL) NOPASSWD: ALL

然后执行下面命令,记得将your_username替换为你的用户名:

sudo dscl . append /Groups/wheel GroupMembership your_username

从此就不需要在sudo的时候输入密码了。

解决了我的Tunnelblick连接再断开openvpn服务后路由出错

每次用Tunnelblick连接我的zztin.com主机后(我的是Mac OSX 10.6)再断开后,我的zztin.com的主机就无法到达了。ping的时候会报告:

ping: sendto: No route to host

这是路由错误的表现,用netstat -nr查看当前的路由设置,发现连接OpenVPN时候推送的route信息没有被清除。我手动试验了一下重建route表:

sudo route flush

然后所有网都连不上了,又netstat -nr一下,发现默认路由没有了,手动添加一下(我家的无线路由器IP是192.168.1.1:

sudo route add 0.0.0.0 192.168.1.1

所有网站都可以用了,包括ssh我的zztin.com。可是不能每次都手动清理呀。查看了一下log,发现的确有问题,有好几行route -delete的时候报错:

ERROR: OS X route delete command failed: external program exited with error status: 77

搜索了一下,发现需要注释掉我的openvpn客户端配置里面的:

# user nobody
# group nobody

然后一切都OK了。

老婆说三里屯苹果专卖就像个网吧一样。想要体验一下要等很久,里面充斥在界面上寻找S…

老婆说三里屯苹果专卖就像个网吧一样。想要体验一下要等很久,里面充斥在界面上寻找Start按钮在哪里的朋友。几次过去我都没有体验到Wacom的Intous 4画板,非常不爽。

相比之下顺电里面体验Mac就轻松了很多,还可以体验各种单反,感觉不错,价格也比苹果专卖要便宜一些。顺电的3C产品价格也比苏宁、国美、大中这些店好很多,又能现场试用,再次表扬。

今天还试用了佳能S90,非常失望,操作杆非常差,弹出闪光灯的方式非常古怪(居然是自动弹出,但是又慢悠悠的,用手掰怕坏掉)。操作非常慢。而且S90的快门位置太难受了,快门的触感也很不像快门,有点像快门开关,实在是太失望了。从设计上和Lx3差距那是大了去了,佳能已经落后了。

还试用了佳能G11。一样超级失望,太重太大了,我感觉这个重量体积已经完全可以考虑松下的GF1了。G11的低光照反应很慢,不过那些按钮感觉能够提高操作效率,可是毕竟有点复杂,不省心。画面挺细腻的。不过这个体积已经赶上小单反了,从这个角度它又不如小单反细腻。画面颜色依然平淡(或者说黯淡),我不喜欢,不知道谁会喜欢。反正G11给我的感觉就是完全不如买女友一号GF1,这个才是真正的万人迷。佳能已经Out了。

昨天jjgod同学写了一篇“homebrew — Mac OS X 下新的软件包…

昨天jjgod同学写了一篇“homebrew — Mac OS X 下新的软件包管理工具”的文章。homebrew前一段时间就看到有人说不错,看了jjgod同学写的文章才明白它好在哪里。

不过安装的时候遇到了一个问题:

-bash: /usr/local/bin/brew: /usr/bin/ruby^M: bad interpreter: No such file or directory

其实主要原因就在于这个^M。它说明这个文件使用了windows的line ending,也就是/r/n,在*nix下面它就会造成问题。查了一下遇到这种问题最简单的方法是

cat /usr/local/bin/brew | tr -d '\015' > /usr/local/bin/brew

安装后我发现homebrew已经包括的软件还不算多,不过无侵入的方式我非常喜欢。我现在包管理机制用的是macports,不过所有的ruby依赖我都没有安装,我基本上只macports管理git-core, mercurial, python,似乎转到homebrew问题也不算大。而且homebrew由于把bin都link到/usr/local/bin,所以和macports及fink共存应该很容易,可以留给你很长的切换时间。

前两天被身边的朋友嘲笑我用的bash在按Tab自动完成的时候不能忽略大小写。所以…

前两天被身边的朋友(他用csh)嘲笑我用的bash在按Tab自动完成的时候不能忽略大小写。所以就造成你键入do就不能自动联想到”Downloads”,有的时候你不得不ls一下看看是否有大写的文件夹。Google下发现bash其实是支持忽略大小写的。在Mac下修改~/.inputrc,加入:

set completion-ignore-case On

然后重启一下Terminal,就开始支持大小写通配了。其实这里解释的是我看到的最清晰的:http://www.macosxhints.com/article.php?story=20070831153033300。Bash使用了readline,而readline的配置就在~/.inputrc,里面还有很多配置,有兴趣可以研究一下。注意,上面那个方法在10.5以后的OSX才生效,10.4以前的版本设置方法不同,大家自己Google吧。

在Mac下使用脚本重载proxy自动配置脚本(pac)

Mac下对网络设备使用proxy自动配置脚本可以透明使用代理穿墙(可以配合ssh tunnel和tor)。但是我一直不知道如何用脚本让系统重新载入pac文件(在更新了pac的规则时我们需要重载配置)。昨天一位叫做Dylan的网友留言告诉了我如何做,我在此记录一下。在命令行下面:

networksetup listallnetworkservices

然后会会返回一个网络连接服务的列表:


An asterisk (*) denotes that a network service is disabled.
Bluetooth DUN
ADSL
Ethernet
FireWire
AirPort
Bluetooth PAN

我一般需要配置pac文件的是Ethernet和AirPort,那么相应的重载命令是:


sudo networksetup -setautoproxystate 'AirPort' off
sudo networksetup -setautoproxyurl 'AirPort' 'file://localhost/Users/tin/pac/tin.pac'
sudo networksetup -setautoproxystate 'AirPort' on
sudo networksetup -setautoproxystate 'Ethernet' off
sudo networksetup -setautoproxyurl 'Ethernet' 'file://localhost/Users/tin/pac/tin.pac'
sudo networksetup -setautoproxystate 'Ethernet' on

然后pac文件就已经被重载完毕啦!在此感谢Dylan。

顺便共享一下我在bash下的alias:


alias px='ssh -qTfnNC -D 7777 tin@zztin.com'
alias rpx="sudo networksetup -setautoproxystate 'AirPort' off;sudo networksetup -setautoproxyurl 'AirPort' 'file://localhost/Users/tin/pac/tin .pac';sudo networksetup -setautoproxystate 'AirPort' on;sudo networksetup -setautoproxystate 'Ethernet' off;sudo networksetup -setautoproxyurl 'Ethernet' 'file://localhost/Users/tin/pac/tin.pac';sudo networksetup -setautoproxystate 'Ethernet' on"

SSH tunnel + pac穿越

就是穿越我们的墙。以前写过一个我的pac的post,不过那个pac在很多环境不work,那就老实写那个笨的,可是太麻烦了。所以写了个rb脚本生成那个pac。

如下:

#!/usr/bin/env ruby
proxy = 'SOCKS 127.0.0.1:7777'
gfucked_sites = [
  'youtube.com',
  'ytimg.com',
  'googlevideo.com',
  'tinyurl.com',
  'bit.ly',
  'blogspot.com',
  'twitter.com',
  'plurk.com',
  'torproject.org',
  'wikipedia.org',
  'tumblr.com',
  'soup.io',
  'pandora.com',
  'adobe.com',
  'last.fm',
  'photoshop.com',
  'google.com',
  'googlecode.com',
  'appspot.com',
  'acer.com',
  'demonoid.com',
  'alexa.com',
  'wikimedia.org',
  'yahoo.com',
  'zend.com',
  'aptana.com',
  'uncyclopedia.tw',
  'uncyc.org',
  'webarchive.org',
  'pornhub.com',
  'yourporn.com',
  'facebook.com',
  'mail-archive.com',
  'versionapp.com',
  'friendfeed.com',
  'ff.im',
  'chinagfw.org',
  'bullogger.com',
  'mulhollanddrive.com',
  'iphone-dev.org',
  'plurk.com',
  'imageshack.us',
  'zendesk.com',
  'pbwiki.com',
  'chromium.org',
  'typepad.com',
  'ff.im',
  'friendfeed.com',
  'tornadoweb.org',
  'bullogger.com',
  'blogspot.com',
  'zendesk.com'
]
puts "function FindProxyForURL(url, host) {"
gfucked_sites.each do |site|
  puts "  if (shExpMatch(url, \"*://*.#{site}/*\")) { return \"#{proxy}\"; }"
  puts "  if (shExpMatch(url, \"*://#{site}/*\")) { return \"#{proxy}\"; }"
end
puts "  return \"DIRECT\""
puts "}"

运行一下./gen_pac.rb > tin.pac就会生成tin.pac,我在.profile里面加入这一行并在开机默认启动Terminal就可以每次都更新pac文件了。但是还缺一个apple script告诉网络连接刷新一下pac文件,下次有空研究一下怎么做。

打开ssh tunnel我没有使用自动的方式,我设置了这个alias:

alias px='ssh -qTfnNC -D 7777 user@yourdomain.com'

然后每次用ssh-tunnel的时候只需要去Terminal执行一下px就好了。

在Mac里面我可以给每一块网卡指定系统级别的自动代理脚本pac文件:Air port图标-> Open Network preference->解锁->选择你的网络连接-> Advance …->Proxies->Automatice Proxy Configuration,让它指向你的pac文件。然后整个系统都回使用它作为代理了,如此Tweetie就可以非常爽的工作了。此法对于使用Tor的用户一样有效,修改一下pac生成脚本里面的proxy = 'SOCKS 127.0.0.1:7777'proxy = 'HTTP 127.0.0.1:tor_port'就可以了。

解决Mac环境下的Java Version问题

前一段时间遇到了一个奇怪的问题:我的Mac下面的Lotus Notes 8.5和FreeMind 0.9rc4都不能工作了,它们的共同特点就是都基于Java。我试验了在Terminal里面启动/Applications/Notes/Contents/MacOS/Notes的话是可以启动的,但是会启动以前的Basic界面(后来我才知道可能它是个Cabon应用,而不是Java版本)。所以就一直凑合着用。
可是昨天我尝试运行/Applications/Utilities/Java Preference的时候它也无法启动了,我这才觉得这不是个简单问题,必须要彻底解决。

我回忆了一下,我最开始的时候尝试用Java Preference的时候修改了JDK的顺序,将JDK6放在最上方,可是在Terminal里面(java -version)依然只可以访问1.5。所以当时就手动修改了系统的指向:


/System/Library/Frameworks/JavaVM.frameworks/Versions/Current -> /System/Library/Frameworks/JavaVM.frameworks/Versions/1.6
/System/Library/Frameworks/JavaVM.frameworks/Versions/CurrentJDK -> /System/Library/Frameworks/JavaVM.frameworks/Versions/1.6

这样修改以后就工作了,命令行里面执行java -version显示:

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03-211)
Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02-83, mixed mode)

但是大家千万不要这样做,这个其实是后面很多问题的一个重要原因。

如果你修改了上面的指向,我推荐你unlink它们,然后下载Java for Mac OSX 10.5 Update 4 (http://www.apple.com/downloads/macosx/apple/application_updates/javaformacosx105update4.html)重新安装一下就可以重新生成这些link了。不过记得要unlink自己手工建立的符号链接(比如我的是Current, CurrentJDK, 1.6),否则升级包无法替换你建立的那些。

但是我这样做了以后还是没有解决所有问题,Java Preference可以正常启动了,不过它设置的顺序依然不管用,java -version总是返回1.5。我突然想到估计是运行我们的Ant脚本曾经提醒过JAVA_HOME的问题,我手动设置过一个,忘记去掉了。所以去查我的.profile,发现了罪魁祸首:

export JAVA_HOME='/Library/Java/Home'

这个设置是错误的,虽然它存在,可是它不会根据Java Preference修改的结果去寻找你的Java的bin和lib,也就造成了后面的一系列错误。

修改为(或者删掉JAVA_HOME声明也是安全的):
export JAVA_HOME='/System/Library/Frameworks/JavaVM.framework/Current/Home'

问题解决,教训是如果你手头有工具,应该学会使用它,如果没有耐心学习就错误的使用工具,一开始感觉能解决问题,可是后来它会造成越来越多的错误。那么决绝方案就是回到原点,恢复,学习,正确的使用工具。

MobileMe试用之旅-产品对比评价

和GTD这样的好东西一样,理念最重要,方法其次,工具和载体最次。MobileMe整合了非常好的服务,他们都是很好的习惯,学会试用这些服务并用好他们相当于学会一种思想和对应的一种方法(如Address Book和Calendar还有Note,帮助你实现GTD),是否选择MobileMe非常不重要。看看这个产品分析,马上给你也整上一套这样的服务是最好的收获。热门的Google Wave是一个协同(Collaboration)工具,Google的基础服务实际上已经提供了协同的平台(代替Lotus Notes和Exchange,其实google enterprise就是这样的产品),那么MobileMe其实就是一个个人的协同软件,只是它还没有提供象Wave那样厉害的协同算法,但是Apple实际上是希望通过MobileMe能够给未来留下一个协同平台的种子,这个是我能想到这个很酷的Me.com的域名所能映射到的Apple的伟大梦想。

从功能角度上面来说Mobile Me的几个核心功能:

1、邮件:前面分析了,从空间上Me是10G,这个比目前Gmail的8G要大,不过这个基本上就是聊胜于无的东西。从用户体验上来说Me和Mac原生的Mail一样,优雅,简洁,不过从web上使用的感觉来说Gmail提供的感觉更好,它提供了换肤的功能,还有那些熟悉的标签,会话,归档等等,因为我个人非常喜欢Gmail,所以转移到Me上面基本上是不可能的。不过我个人认为me.com的域名很棒,所以在这个上面有个邮箱梃拉风的,而且懂行的就是知道你是使用相对昂贵的mobileMe的有钱人。MobileMe最NB的特性还是Web和桌面的超级一致,不过一个原因是桌面的mail本身界面和功能都比较简单,所以在Web上面实现一个这样的服务会简单一些。邮件是一个粘性巨大的服务,个人认为从运维能力上面说Google比Apple有优势,所以长久考虑使用Gmail会比使用me作为主邮箱要靠谱。Gmail基本上是Google account的一个核心,所以享用Google的SNS能力还有各种NB服务来说,gmail.com是一个有很高附加价值的免费服务的核心。这点上我基本上找不到太多me.com的吸引力了。

2、Address Book:这个功能我觉得是Mac平台有非常有吸引人的功能。西方的同事一般都非常重视联系人,而我本人以前一直不算注意。Gmail里面的联系人我一直没有很好的管理。现在回想起来很多联系人信息由于没有维护现在已经想不起来谁是谁了。Mobile Me同步信息在Address Book上体现了它的优势。但是,由于现在Address Book已经支持了与Google和Yahoo的联系人服务直接同步,所以MobileMe在这里又体现不出来优势了。但是MobileMe再次提醒了你,要定期合并重复联系人信息,给联系人分组,删除过期信息,把商业名片同步过来,这些操作是很好的习惯。如果你付费买了MobileMe,面对如此简洁的人机交互,我想也许它会督促你去使用它,并且逐渐养成这个习惯。

3、Calendar:Google退出Calendar服务的时候很多人惊叹它居然和Mac上面的Calendar的原生界面如此的相似,拖拽的去安排日程是个不错的体验。但是忙碌的朋友知道如果没有一个秘书帮你指定他们的话,一般个人也就是会使用天或者周这样粗糙的单位来管理日程,这样,那些漂亮的用鼠标划时间段的交互实际上你用到的没有那么多。这样说,一个界面不够华丽的Calendar从功能上并不会让你烦恼。现在的很多GTD工具都可以和Calendar服务结合,这个实际上是对于大部分朋友最有意义的。但是,Google的Calendar服务也早就可以和Mac的Calendar同步了。Thunder bird这个跨平台软件也很有竞争力,且它也可以和Google同步。

4、Photos:iPhoto 09是我最喜欢的一个Mac软件(另外一个是iTunes),Face和地理信息是非常棒的功能。当然iPhoto 09比起以前版本最重要的更新就是对社会化网络的支持:Flickr是最棒的社会化图片分享平台(另外两个我觉得不错的是Smugmug和Zenfolio,他们有不同的风格,其中Flickr是社会化做的最好的),另外还支持Facebook和MobileMe,好像不直接支持PicasaWeb(否则估计很多人就不会付费买Flickr的Pro服务了)。其实这已经摆明了我的意见,我在这3个很棒的服务里面选择了Flickr,看重了它的图片社会化分享能力,Flickr的Pro对外链支持不错,可以作为blog的图片服务,$24.9的价格基本上可以接受(听说国内打上收费旗帜的有播已经不行了)。扯远了,因为我对Flickr的绑定,所以我基本上不会选择MobileMe的Photos服务了。从简洁上MobileMe的Photos不会超过PicasaWeb(它还在Web实现了同样的人脸识别,而且直接可以标识出来和Google Accounts整合,无比强大),从复杂的功能(我喜欢它的License管理)还有社会化分享来说它比不过Flickr,从专业和商业友好上来说它比不过ZenFolio(识一个专业摄影师的业余图片交易平台)。所以,虽然这个是一个很棒的服务,可是无奈比它棒的服务也很多,那么它基本上就失去了对我的绑定,我可以继续享用iPhoto 09这个客户端,却选择同步图片到更好的服务上去。最后,还是要说,MobileMe Photo的界面很优雅(颜色和布局),4种View很独特,和Mac上面的体验比较一致,从程序实现的角度,我很喜欢它。

5、iDisk:非常棒,和操作系统集成的很好,支持外链很棒。而且iDisk的磁盘空间可以和Mail公用(这个没有什么意义,Mail用太多了不靠普)。最低的方案是99$,包括邮件总共20G,默认邮件10G iDisk 10G。可惜现在的文件分享服务已经很多了,免费的Dropbox也是User Space File System,无缝集成,也可以从Web上面访问(不过分享的时候比较容易超过限额,可是一边和朋友分享足够)。那么iDisk的吸引力就差多了。DropBox的跨平台能力更强(支持Linux)。其它文件分享如Drop.io、RapidShare作为临时文件分享也很好。但是这些服务对于拥有VPS的同学可能也不新鲜了。

6、Back to My Mac:可能有人会忘掉这个功能。但是对于程序员来说这个可能才是最有吸引力的能力!它可以保存你的各种Certifacate。并且在你的几台Mac都可以访问到互联网的时候它可以让你安全的让这几台电脑相互访问和控制,听起来很像VPN服务。对于远程控制家里面的下载,或者让Mac控制家中的电器,还有在回家之前在家里准备好迎接主人的音乐等等都是非常有意思的场景。让人兴奋。不过问题还是有,那就是VPN自己也可以搞,只是假设VPN需要你有带公网IP的主机作为VPN server,而且配置还是比较复杂的。我在我的linode上面配了一个可以本地链接的VPN就花了我一整个晚上(Mac上面有Tunnelblick做客户端,我用了另外一个晚上也没有搞定自动push路由,遗憾的很)。我觉得省心的使用Back to my Mac这样的功能(这个没有跨网VPN的能力,也就是你不能通过这个VPN跳板到国外上网,除非你把Mac本本放在外国)还是挺有意思的。

7、其它同步服务:Safari书签同步、keychain同步,Dashboard同步,这些小功能价值很高,一站搞定了。如果只是怕丢,可以用TimeMachine或者SuperDuper。如果省事,那么可以考虑使用那99$一年的服务。

最后,阐述我目前使用的方案。我不会选择MobileMe,因为上面试用下来没有找到任何捆住我的服务,而且甚至连一个让我觉得非常想去付钱的功能都没有。我现在试用了免费的Goole Calender、Google Contacts、Picasa Web、DropBox,还有收费的Flickr、VPS使用Linode,这样下来我得到的功能比MobileMe多,不过也更贵(VPS每月20$)。但是,很多朋友知道,淘宝上有99人民币一年的MobileMe服务可以买,这样倒是让它一下子有了巨大的吸引力,可是和那些便宜的iTunes卡有同样的问题,一旦你习惯了它,下一年却又买不到这么便宜的服务的时候,你会不会心疼呢?我支持付钱享受服务,但是,我希望那是比MobileMe目前提供给我的体验更好,功能更强,更稳定的服务,似乎Google目前最有能力给我们提供这样的服务。

MobileMe试用之旅-页面技术篇

这是断断续续的一点笔记,仅供参考。没有系统思考,而且也虎头蛇尾了,请见谅。

MobileMe的HTML很干净,但是并非遵循渐进式增强的原则,没有保证所有的标签都基于语义来选择。在登陆页面的地方,发现它们使用了Webkit支持的css transition属性,所以像input field高亮的过程有渐量的过程,非常优雅。它的登陆表单的提交按钮是个link,使用onclick事件提交,这似乎并非是很好的设计。

首页的细节:使用Javascript回写了浏览器类型和平台类型到body上面,更加精确的实现因不同平台而异的css样式,而且这样css rule的可读性要好于trick。现在一个严重的问题就是Safari和Firefox的不同版本有的时候也有bug,而且它们又不像IE6/7有相对可靠的css trick来实现区分,所以apple的做法还是很实用的。apple的设计实际上也是基于像素的,在增大浏览器字体以后却依然没有影响布局,这主要依赖于目前比较先进的浏览器都基于比例进行放大,使用px依然可以保证完美的放大渲染。IE的低版本当然没有这么智能,但是谁在乎呢?在乎的人都转现代浏览器了。

me.com登陆以后进入的是邮箱,界面非常清爽,左上角是产品的切换,中间是邮箱的操作,右侧是搜索和退出,这样的对齐很清晰。但是作为邮件产品的功能按钮设计在中间是否操作起来不是很方便呢?按钮都是使用了复杂的html结构来实现,是以切图和显示效果为驱动的,阴影和圆角都是基于图片,这样可能是为了兼容windows平台而考虑。这样的实现在大型互联网应用中非常常见,因为兼容性往往是使用人数众多的应用的一个重点。Apple所做的css sprites是比较震撼的,其中3个sprites非常之复杂,它们明显的减少了image的请求次数。如此规模的使用sprites,在布局里面以px为单位就容易理解了,因为如果不使用px而是使用相对单位如%或者em,那么在缩放的时候经常会破坏你精心制作的sprites。

修改产品设置,下拉菜单和mac里面的渲染效果很一致,弹出的下拉菜单三面有阴影,4个圆角,一共使用了8个元素通过绝对定位来实现。这样在IE里面很有可能出现奇数高度的下拉框绝对定位产生1像素偏差的bug,苹果应该是通过js修正了。菜单本身使用UL,还是靠谱的。

产品修改的面板也和Mac的非常一致,是一个模态窗,使用Tab切换选项。效果和OSX的面板非常一致。不过有一个细节需要注意:OSX的配置面板有一个非常帮的交互设计,那就是面板的大小会根据内容的多少进行剪裁,然后实现动态的改变大小,这个对形成视觉对齐非常有意义,我一直认为这是一个非常优雅的解决方案(比windos的那种选项卡设计好了很多)。可是在Web上MobileMe的这个模态窗是固定大小的,切换内容比较小的Tab时它并不会缩小。

Mail设置提供的功能不多,但是很贴心,比如它可以选择字典的语言(8种欧洲语言,纠错使用)。是否默认显示Bcc域这个设计也很体现Mail的商务特性(因为一些人的职责就是成天Bcc,所以他们肯定喜欢这个设置)。

这两天试用下来发现MobileMe的页面还是有不少小bug的,Firefox下没有Safari完美,无可厚非,不过这样的一个产品,走的越远,它维持与操作系统上面原生软件的体验一致所付出的代价就会越高。不知道SproutCore能不能走的更好。失去兴趣进一步研究了,Apple比较尊重先进的Web特性的实现,也绕过了过多的肮脏patch,基本上都用了比较优雅的方案解决,可是它不支持IE的这个决定风险还是很大的。可是我喜欢这样,让浏览器成为Webkit和Geoko的天下,让那些微软操作系统早点走出历史舞台吧。