linux/mac下的自定义命令alias,并保存别名使其永久生效(重启不会失效)

现在做开发每次提交代码的命令都是一长串参数,不想去记,于是可以使用alias命令来解决这个问题:
alias aCommandAlias='aCommand 一堆参数什么的'
比如
alias gpush='git push origin HEAD:refs/for/master'

这样在终端中,只需要输入gpush就ok了。

但是只是这样的话,会在重启之后失效,解决办法是编辑~/.bashrc文件,每行加入一个alias命令。比如:
alias cdhome='cd ~'
alias cdroot='cd /'
alias gpull='git pull'
alias gci='git commit -a'
alias gpush='git push origin HEAD:refs/for/master'
alias gst='git status'

保存文件后,运行:
source ~/.bashrc(不然不生效)
就可以了。
如果还不行的话,说明没有~/.bash_profile文件,或者文件中没有执行.bashrc文件。
(.bash_profile文件是用户登陆终端的时候会自动执行的文件,一般此文件中会调用.bashrc)
如果是这样,需要打开(如果没有的话先创建)文件:
~/.bash_profile
在里面加入一行:
source ~/.bashrc
就ok了。
我在mac系统下测试ok的。

【转】ubuntu安装pptpd来架设VPN服务器

转自:http://www.cnblogs.com/youlechang123/archive/2011/09/29/2195013.html
今天用此法尝试了一下,很顺利就ok了

—————–一下是原文——————–
这篇文章是以前写的了,不过那个网址好像由于fan墙两个字被拦截屏蔽了,一打开就整个域名被屏蔽几十秒,把敏感字做了处理好像还不行,重新发一次,NND,有兴趣打开试下看看:ubuntu架设VPN服务器

Linux下的VPN服务器软件主要是pptpd和openvpn,pptpd架设好后在windows下建个VPN连接就可以fan墙了,比较简单,这里说下ubuntu下安装配置pptpd。首先安装pptpd这个VPN服务器软件,ssh连接登录后用下面这个命令:

sudo apt-get install pptpd

安装好了在webmin的网络这一栏里就可以看到pptp vpn server这项了。

安装完了需要对相关文件进行配置修改,用webmin上的文件管理或ssh端用vi命令修改都行。

第一步:

方法一:ssh连接修改/etc/pptpd.conf这个文件

vi /etc/pptpd.conf

找到#localip 192.168.0.1和#remoteip 192.168.0.234-238,192.168.0.245这两行,把前面的#号去掉,然后保存就行了。

这里,localip 是 VPN 链接成功后服务器的 ip 地址, remoteip 则客户端的可分配 ip 地址范围。下面是我的配置:

(Recommended)

localip 192.168.0.1

remoteip 192.168.0.234-238,192.168.0.245

or

localip 192.168.0.234-238,192.168.0.245

localip 192.168.0.234-238,192.168.0.245

remoteip 192.168.1.234-238,192.168.1.245

方法二:用webmin的pptpd服务器项修改,点击webmin网络>PPTP VPN Server>PPTP Server Options,加上localip和romoteip就行了,如下图

第二步:

然后再要编辑/etc/ppp/pptpd-options这个文件,为vpn指定DNS服务器, 你可以找到你服务器用的DNS服务器地址,或者直接使用Google Public DNS:

vi /etc/ppp/pptpd-options

找到ms-dns这项,去掉前面的#号,修改成google提供的DNS,很好记哈

ms-dns 8.8.8.8

ms-dns 8.8.4.4

修改好后保存。

第三步:

接下来建立vpn账号和密码了,可以直接在webmin的pptp vpn server选项里修改,修改文件也行。

方法一:点击webmin里的网络>PPTP VPN Server>PPP Accounts>Create new PPP account,就可以创建新的账号和密码了。

webmin创建VPN账号

方法二:修改/etc/ppp/chap-secrets文件,按一行四列添加账号、服务器名、密码和IP限制。即第一列是用户名,第二列是服务器名(默认写pptpd 即可,注意与 pptpd-options 文件保持一致),第三列是密码,第四列是 IP 限制(不做限制用 * )。如创建一个名为test,密码为123,不限制登录IP的VPN账号:

test pptpd 123 *

修改好后保存行了。

最后重启pptpd服务,就可以生效了。

到了这一步,正常的话在XP里建立个VPN连接应该可以连接上了,但还不能访问外网,还需要另外的配置。但是如果连接不上VPN服务器的话,那就是碰上传说中的人品问题了,我就碰到过,明明所有步骤都做了,但是就是不能连接上,然后就胡乱折腾,看运气什么时候能折腾好了。

继续下一步,第四步:

修改/etc/sysctl.conf 这个文件,把ipv4 forward开启,方法是找到/etc/sysctl.conf这个文件里的这一行#net.ipv4.ip_forward=1后,去掉net.ipv4.ip_forward=1前面的#号,使他生效,然后保存,运行命令sysctl –p.

root@s:~# sysctl -p

运行命令后会显示这样的一行,那就表示修改生效了。

net.ipv4.ip_forward = 1

这样,vpn 服务器就算是搭建成功了。

重启pptpd后如果还不能访问外网,那么就要再来一步。

第五步:

使用iptables建立一个NAT, 用下面的命令:

apt-get install iptables (如果已经安装iptables,这一步就不用了)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

上面的24表示子网掩码,代表24个1.

OK,到了这一步就应该可以用VPN了哈。如果不能,我也不知是哪里出问题了。

如果要防止重启服务器后iptables丢失,先运行

iptables-save > /etc/iptables-rules

然后修改/etc/network/interfaces 文件,在eth0 下面加入

pre-up iptables-restore < /etc/iptables-rules

这样,服务器重启后,就能自动挂载规则了。

好了,有了VPN,墙再高也不怕了哈。

利用JavaScript从UIWebView获取、修改、提交网页内数据的方法

在UIWebView的内容加载完之后,可以利用javascript获取其页面内的数据,核心就是通过UIWebView的方法:

NSString *string = [awebView stringByEvaluatingJavaScriptFromString:@"document.getElementById('field_2').value;" ];

以下是一些常用的js脚本:

thisURL = document.URL;
thisHREF = document.location.href;
thisSLoc = self.location.href;
thisDLoc = document.location;
thisTLoc = top.location.href;
thisPLoc = parent.document.location;
thisTHost = top.location.hostname;
thisHost = location.hostname;
thisTitle = document.title;
thisProtocol = document.location.protocol;
thisPort = document.location.port;
thisHash = document.location.hash;
thisSearch = document.location.search;
thisPathname = document.location.pathname;
thisHtml = document.documentElement.innerHTML;
thisBodyText = document.documentElement.innerText;//获取网页内容文字
thisBodyText = document.body.innerText;//获取网页内容文字

也可以通过同样的方法去设置页面内容(比如帮用户输入表单数据)
比如:
NSString *string = [awebView stringByEvaluatingJavaScriptFromString:@"document.getElementById('field_2').value='a value';" ];
就可以修改field_2的值了

同样也可以去模拟页面内按钮的点击,提交页面,比如:
document.getElementById('aButtonName').click();
或者,假设知道按钮是第几个input标签(假设为第一个)
document.getElementsByTagName('input').item(0).click();
也可以设置checkBox的状态:
document.getElementById('aCheckBoxId').checked=true;

参考:
http://hi.baidu.com/zfpp25/blog/item/0bc5e3565a7e632e0cf3e3d7.html
http://www.cnblogs.com/del/archive/2009/01/07/1370907.html
http://blog.csdn.net/studyrecord/article/details/6213843

使用sina开放平台的ios sdk做微博转发,调用repost接口返回auth faild错误

今天遇到一个问题,在调用statuses/repost.json接口的时候,总是返回auth faild错误。
但是发布微博是可以的,而且api文档中repost接口和upload接口是一个等级的,应该不是权限问题,于是各种茫然。
在尝试各种方法,搜索无果后,只能去sina api论坛提问(帖子传送门,问题已解决)
然后不幸的是,发现评论一条微博的接口@”comments/create.json”也存在同样问题。
在等待论坛回应的过程中,无意中发现一句代码:

postDataType:kWBRequestPostDataTypeMultipart

然后跟踪到正常工作的发布微博接口中去看看,发现微博发布接口中,有图片的时候,是用multipart,但是在只有text的时候,用的是:

postDataType:kWBRequestPostDataTypeNormal

于是把转发和评论都改成normal之后,正常了。。

———– 后话 ————-
其实一开始我尝试过一共三种postdatatype,都不正常,包括normal。。因为在当时还存在另一个bug,就是微博的id,返回类型是int64的,我一直当做string在用。所以在我设置成normal的时候,报错参数传递缺少(id)字段。。后来我把id打印出来,直接硬编码在代码中,终于转发成功了一次,这样才解决了auth faild的问题以及发现这个bug。。。

多个bug一起出现,更据迷惑性啊··

再后来,发现很多调用出现auth faild的错误原因都在于postDataType:kWBRequestPostDataTypeNormal没有设置正确。

iOS开发中创建和使用静态链接库(.a)

创建静态库项目之后,Build,然后就能看到Product中的.a文件亮了,然后能把它拷出来加到别的项目中去使用,但是貌似.h文件没有在这个地方出现,还是得手动去找?
反正我是直接在目录下搜.h文件,全部拷贝和.a文件一起加入目标项目来使用是可以的。

另外貌似要区分iphone-simulator和iphone两个不同scheme生成的.a文件,不能混用。
今天(5月18)验证了一下,确实是这样的,需要区别对待,可以在target是iphone下编译一个.a,再在simulator下编译一个.a。两个.a同时拷贝到目标项目才行。不然的话,链接阶段会报错,这个挺烦人。。应该有解决办法,目前没时间找。
合并模拟器和设备的静态库实际很简单,如果一个是somelib.sim.a,一个是somelib.device.a,只需要在命令行运行:
lipo -create somelib.sim.a somelib.device.a -output somelib.a
就可以了

参考:
http://xys289187120.blog.51cto.com/3361352/786930
http://blog.csdn.net/flyhawk007j2me/article/details/6762798

iOS开发中对NSArray或者NSMutableArray中的内容排序

在iOS开发中,排序是很简单的事情:


NSMutableArray *feedsBuffer;
//初始化buffer以及填充数据
//.......
//排序只需要两句话:已针对数组内对象的publishTime属性(NSDate)排序为例:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"publishTime" ascending:NO];
[feedsBuffer sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

假如feedsBuffer是NSArray,那么有一个方法是

NSArray *sortedArray = [feedsBuffer sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

如果排序的依据比较复杂,那么可以使用Block进行大小判断自定义:

[feedsBuffer sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//返回三者其一:NSOrderedAscending, NSOrderedSame, NSOrderedDescending
return NSOrderedSame;
}];