静态链接库

静态链接库 几个例子,使用和建立静态库的时候的几种常见情景。 首先建几个文件 a.h void testA(); a.c #include “a.h” void testA() { printf(“A”); } b.h void testB(); b.c #include “b.h” #include “a.h” void testB(){ testA(); printf(“B”); } 得到目标文件 $gcc -c a.c $gcc -c b.c 得到静态库文件 $ ar -r libba.a a.o b.o $ ar -r liba.a a.o $ ar -r libb.a b.o 得到了库libba.a libb.a liba.a 这是最终需要完成的程序。 […]

[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 […]

[cocoa demo]从图片中选取Frame的小工具

和设计相比,开发者的好处是遇到不好用的App就可以牛B哄哄的说: “这个不给力啊,等哪天有空的时候自己做一个吧”。 等到真正要做的时候就愣了,满脑子的按钮不知道怎么摆…. 在学校的时候,做的东西对UI的要求很低,不求美观,只要基本功能有就行了。 更不要谈什么用户体验,是不是User-Friendly之类的了。 工作的时候就大不一样了,做prototype的时候界面可能很粗糙。 但是等到Designer的东西(一般管这个叫mockup)出来,感觉就完全不一样了。 作为码农,常常觉得自己没有审美观…. 我认为完全重现mockup的效果是很重要的,尤其是一些细节。 功能上开发者可以发挥,但是在自己不擅长的领域还是不要胡闹了。 好了,扯远了…. 其实只是因为最近想学mac上的开发,然后因为有以上需求, 所以做了一个非常简单的工具作为练习。 真的很简单….不过如果你恰好有同样的需求,我觉得它还是有帮助的。 至少作为一个cocoa入门的demo,还是挺好的。 就是从mockup里框取一块区域,得到经过转换坐标的Frame。 左上的Button是用来打开图片文件的,左下的是用来切换显示的。 代码在Github上: GetFrame App下载链接: GetFrame.zip mac下的图标格式是icns 用这个网站转换图标比较方便,推荐一下: http://iconverticons.com/