[Tips]2011-10-19

两个Vim的小技巧 :] 其实就是两个正则表达式,刚好今天用到了,就记下来。 1. 有多行文本,其中有几行是URL,要保留这几行URL,其它的行删掉。 :g!/:\/\//d g本来是用来做grep类似的事情的,:g/pattern 会显示出符合pattern的所有行 惊叹号!表示相反,就是指选中的行是不符合pattern的。后面的/d是表示删掉选中的行。 2. 有多行文本,每行都是类似这样的 keyA=valA&keyB=valB&keyC=valC 现在要交换key和val的位置,变成 valA=keyA&valB=keyB&valC=keyC :%s/\=\/\2=\1/gi %s是全局替换,这个比较常用了。\是不太常用的anchor字符(锚字符),分别表示word的开始和结束。 \(..\)也比较常用了,可以保存匹配结果。\w*表示一个或多个word字符。 word字符包括a-zA-Z _ 和 0-9 :]

NSURL

码农Coding的时候有各种不好的习惯。 比如,不喜欢好好地看框架的文档,一旦找到某一个看起来简单易懂的接口,就一直用它。 如果需要之后的处理,往往简单粗暴。 我们以前管这种情况叫做“裸”。最近又不知不觉地写了比较“裸”的代码。 说实话,这个习惯得改,“裸”写的东西往往不健壮,不可读,效率还不高。成熟框架提供的直接可用的接口必须是第一选择。 NSURL是常用的类,用来描述一段URL的。 需要取得URL中不同部分的时候,我们应该用URL提供的接口, 而不是把它当做一个普通的字符串去手工分析。 比如: http://www.testurl.com:8080/subpath/subsubpath?uid=123&gid=456 NSURL *url = [NSURL URLWithString:@”http://www.testurl.com:8080/subpath/subsubpath?uid=123&gid=456″]; 下面是常用的几个接口,和它们的输出。接口意思都符合相关RFC里的定义。 [url scheme] http [url host] www.testurl.com [url port] 8080 [url path] /subpath/subsubpath [url lastPathComponent] subsubpath [url query] uid=123&gid=456 NSURL 英文版 :] NSURL is widely used, but sometimes we are not following the idiomatic usage. When it comes to access […]

[Vim]vim的几种模式和按键映射

Map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。 vim里最基本的map用法也就是 :map c a 这里把c映射成了a,在map生效的情况下,按下c就等同于按下了a 当然,常用的Ctrl,Shift,Alt自然也是支持的。 令Ctrl+a对应到a :map a 令Alt+a对应到a :map a 令Ctrl+Alt+a对应到a :map a 到此,我们已经可以做很多事情了。 但是map命令远不只这一种,在不同的模式下,同一组按键可以被映射到不同的组合上。 Vim的模式众多,但是一般被提及的也就是这么几种: Normal Mode 也就是最一般的普通模式,默认进入vim之后,处于这种模式。 Visual Mode 一般译作可视模式,在这种模式下选定一些字符、行、多列。 在普通模式下,可以按v进入。 Insert Mode 插入模式,其实就是指处在编辑输入的状态。普通模式下,可以按i进入。 Select Mode 在gvim下常用的模式,可以叫作选择模式吧。用鼠标拖选区域的时候,就进入了选择模式。 和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了。 和windows下的编辑器选定编辑的效果一致。普通模式下,可以按gh进入。 Command-Line/Ex Mode 就叫命令行模式和Ex模式吧。两者略有不同,普通模式下按冒号(:)进入Command-Line模式,可以输入各种命令, 使用vim的各种强大功能。普通模式下按Q进入Ex模式,其实就是多行的Command-Line模式。 对于Map,有几个基本的概念 命令的组合 同Vim下的其他命令一样,命令的名字往往由好几段组成。前缀作为命令本身的修饰符,微调命令的效果。 对于map而言,可能有这么几种前缀 nore 表示非递归,见下面的介绍 n 表示在普通模式下生效 v 表示在可视模式下生效 i 表示在插入模式下生效 c 表示在命令行模式下生效 Recursive Mapping 递归的映射。其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b。 […]

[iOS]关于IBOutlet

为了使用Interface Builder,我们需要在如XXViewController.h中增加IBOutlet标记。 IBOutlet对于编译器而言只是一个标记,也就是说,编译器会忽略这个关键字。 Interface Builder则是根据IBOutlet来寻找可以在Builder里操作的成员变量。 需要注意的是,任何一个被声明为IBOutlet并且在Interface Builder里被连接到一个UI组件的成员变量,会被额外retain一次。 常见的情形如 IBOutlet UILabel *label; 这个label在Interface Builder里被连接到一个UILabel。此时,这个label的retainCount为2。 所以,只要使用了IBOutlet变量,一定需要在dealloc或者viewDidUnload里release这个变量。

让iOS使用SSH Tunnel

为了突破局域网的限制,目前主流的方法还是SSH和VPN。 如果使用VPN的话,可以很方便的在自己的iPhone/iTouch/iPad设备上连VPN,上外网。 肯定还有不少朋友是在用SSH的。在自己的机器上一般使用以下命令来连接ssh,并且绑定到127.0.0.1:8080。 $ssh -D 8080 username@sshserver.com 之后,我们可以在设置proxy的地方指定proxy为127.0.0.1:8080。 但是在iOS上,如果不越狱的话是不能用SSH的。这样,我们必须让ssh绑定到外部IP,并且让iOS知道这个proxy。 假设本机的IP为192.168.1.2 步骤如下: 1. 不能再用上面这个命令来使用SSH了,命令如下 $ssh -g -D 192.168.1.2:8080 username@sshserver.com 这让SSH把连接转发到192.168.1.2:8080这个地址,-g让外部机器可以连到这个地址 2. 我们需要一个PAC文件。这是一个指定如何配置proxy的文件。 新建文件proxy.pac 内容如下 function FindProxyForURL(url, host) { return “SOCKS 192.168.1.2:8080″; } 3. 我们还需要让本机之外的其他机器可以访问到这个pac文件。比如,我们这里用HTTP来做。 Mac本身就支持Web Sharing,其实是一个Apache的Server。 在”System Preferences”->“Sharing”里,给Web Sharing打上勾. 把上面的proxy.pac文件拷贝到~/Sites/下面,这时,我们可以在浏览器里试试这个地址 http://192.168.1.2/~username/proxy.pac 看看是不是能够看到文件内容? 在lion下,可能会出现没办法勾选Web Sharing的情况。把httpd.conf用原始版本覆盖即可 $sudo cp /etc/apache2/original/httpd.conf /etc/apache2/httpd.conf 4.万事俱备,现在只要在iOS上设置就行了。 通过”Settings”->”WLAN Networks”找到现在连上的Wifi,查看details(蓝色箭头) 在最下面有设置http proxy的地方。 选择”Auto”, 填入 http://192.168.1.2/~username/proxy.pac […]

[iOS]一句话Tip之redefinition of class

编译工程发现报redefinition of classXXX的错,但是确实是采用#import而不是#include包含头文件的时候,请从Finder里看看整个工程目录下是不是有两个同名的头文件…有的话这就是罪魁祸首,删之。 为了这问题折腾了好半天,当时多么希望能搜到一点提示… redefinition错误指编译器发现重复定义的类或者结构,用objective-C的时候建议全部采用#import,可以避免一个头文件被包含多次。 当然遇到坑爹的IDE又是另外一回事了…