编译你自己的MobileTerminal

先扯点题外话,没兴趣看的直接跳过这一段:话说iOS 5.0.1完美越狱终于出来了,虽然还有一些Bug(比如ibooks),以及一些4.x时代的越狱软件不能用,但是终归是出来了,最近还有weiphone的好心人分享4s的siri认证,就是那个Spire一直下不下来很蛋疼。再吐槽下Sbsettings,虽然放到通知栏里了,但是也太影响加载速度了吧,你就不能在viewdidappear里面加载那几个图标么(也许通知栏的控件没有这个方法,但是那个天气股票啥的都挺流畅的啊),搞得通知栏没有一回是流畅拉下来的。依赖的Activator显然已经没什么用了,就应该老实儿做个通知栏版的Sbsettings,也不能费多少劲。

吐完槽进入正题:MobileTerminal是一个写的很蛋疼的app,为什么很蛋疼,原因有很多:

  • 删除(backspace/delete)操作总是有历史字母残留,这个不知道为什么,对终端的实现不是很了解
  • 左下角那个快捷菜单不能添加ESC这种常用的快捷键
  • swipe left right up down 的手势识别率太低,就不应该用这种不好识别的手势,本来终端就是个没什么触摸交互的东西,手势操作看不到结果。
  • 等等…

这里先说下环境:Xcode 4.2,iOS SDK 5.0, 有开发者帐号证书

幸好编译MobileTerminal还算简单,编译脚本该有的都有了,不用去操心这些实在是很方便,大概步骤如下:

  • 找个目录 svn checkout http://mobileterminal.googlecode.com/svn/ mobileterminal-read-only 这个目录路径最好全英文,无空格,否则编译deb时有问题
  • check下来的东西有好几个project,真正有用的在branches/applesdk/MobileTerminal 打开这个project
  • Target选择成MobileTerminal,编译到真机
  • 编译遇到错误 Command ./build_svnversion.sh failed with exit code 1 问题,这个svnversion似乎是用来生成版本号的,我们也不需要就可以无视。打开项目配置文件,选择Targets下面的MobileTerminal,BuildPhases >> Target Dependencies里面删除svnversion(MobileTerminal)
  • 继续编译,多了一个错误:TerminalGroupView.m 文件里#import部分,找不到 Perferences/Settings.h;直接改成#import "Settings.h"
  • 继续编译,可能有签名问题,对于有开发者帐号的就直接设置好签名就OK了,没有帐号的如果之前已经做好XCode免证书调试的各种工作了这个错误应该不会出现,具体没有条件尝试,大家自行解决吧,不是大问题。
  • 继续编译,第一次遇到的错误没有了,现在在 MobileTerminalAppDelegate.m 文件里提示找不到 svnversion.h;删除这句import,修改applicationDidFinishLaunching:里面的SVN_VEFRSION为任意数字,比如999
  • 过程中还可能遇到找不到gen_entitlements.py的问题,这个估计是XCode3.x版本免证书调试遗留下来的东西(参考这里),解决方法,终端中输入如下命令(要sudo):

    mkdir /Developer/iphoneentitlements312
    cd /Developer/iphoneentitlements312
    curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
    mv gen_entitlements.txt gen_entitlements.py
    chmod 777 gen_entitlements.py

经过以上修改,编译就应该成功,在你的机器上就应该会出现沙盒版的MobileTerminal,运行会提示在沙盒里不能fork,这就需要将App安装到/Application/下,直接将编译好的terminal.app拖过去运行会秒退,需要编译deb包,像Cydia那样安装。

Target选择deb,编译,可能会提示缺少dpkg-deb;直接下载这个二进制文件dpkg-deb-fat(参考这里),放到/usr/local/bin/下面(或者/usr/bin/),重命名为dpkg-deb,在终端直接敲dpkg-deb命令检查以下,接着编译成功,编译好的deb在~/Library/Developer/Xcode/DerivedData/MobileTerminal-xxxxxxxxxx/Build/Products/Debug-iphoneos/ 下面,这个路径可以通过在项目Products文件夹右键点击已经编译好的Terminal.app >> Show in Finder来找到

至于Deb包的安装我就不用多说了,iFile傻瓜式还是命令行dpkg,再或者蛋疼地架个repo,方法很多了。

至于Terminal的修改我还没有研究,最近也比较忙没那闲工夫折腾,有兴趣的自己看看吧,牛人可以挑几个bug啥的上传到code上以后也可以作为炫耀的资本(开完笑),以后Cydia上的那个版本就可能时你编译的了。

PS.其实MobleTerminal可以直接在模拟器上运行,没有沙盒问题,证书问题,也方便调试

最后感谢一下为MobileTerminal作出贡献的我不认识的大牛们,虽然我之前吐了很多槽,幸好你们看不懂中文。

—以上—

Mac下用Python链接MySQL数据库方法简介

先说下环境:Mac OS X Lion,自带的Python 2.7.1,MySQL 5.5.18

Python自带了不需要安装,MySQL安装直接到官网下载dmg就可以了,没什么难度。

至于Python与MySQL的连接,就是使用MySQL-python,目前版本1.2.3,最近一次更新在2010-07-22,下载地址

下载后解压,到解压后的文件夹内看下README就知道如何安装了,简单两步

  • python setup.py build
  • sudo python setup.py install

可是在Mac下只执行这两步回在import MySQLdb时报错(Library not loaded: libmysqlclient.18.dylib),原因就是libmysqlclient.18.dylib这个库实际上在/usr/local/mysql/lib/下,而默认是在/usr/lib/下找,自然就找不到这个库,所以简单创建个link过去就解决了:

  • ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

现在import的时候就不会出错了,至于使用方法参考这里的例子官方手册就差不多了。

参考
  1. http://pypi.python.org/pypi/MySQL-python/1.2.3
  2. http://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib

XCode 4.2 地点模拟技巧

XCode 4.2终于支持地点模拟了,不用忍受真机调试的各种不便了,模拟方法也很简单(恕我盗用几个别人的图):

当Debug一个需要地理位置信息的App时,在Debug栏默认就会有地点模拟的图标,如下图所示:

Xcode simulator location services3

这个有一个前提:必须是iOS5的模拟器.

默认只提供了几个地点,但是可以通过GPX文件来添加.你可以选择到网上找现成的GPX,但是Apple还是很为广大开发者考虑的,提供了GPX的模版,创建方法 新建>>Resource>>GPX File 如下图:

Xcode simulator location services2

其实所谓的GPX就是一XML文件,默认的内容如下:

<?xml version="1.0"?>

<gpx version="1.1" creator="Xcode">

    <wpt lat="37.331705" lon="-122.030237">

         <name>Cupertino</name>

    </wpt>

</gpx>

只要改下经纬度,改下名字,就是你想要的地点了,经纬度可以用GoogleEarth获取.

添加了GPX文件后就可以在之前选择地点那里看到你的GPX文件了.

—以上—

创建没有nib文件的App

本文针对Cocoa Touch,Cocoa可能略有区别

首先说为什么不用Nib,其实也没什么太令人信服理由,大概就是以下几点吧

  • 代码重用比较方便
  • 用Interface Builder多多少少有丢三落四的毛病
  • 感觉自己写出来的代码更有存在感一些
  • 没事闲的

至于性能上是否有区别我还不太清楚,查了一会儿也没什么结果,如果各位对这方面有了解还请回复一下.

进入正题,以下几步搞定MainWindow

  • 删除Info.plist里面Main nib file base name这一条,或者把后面的MainWindow清空也行
  • main.m里有一句
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    改成:
    int retVal = UIApplicationMain(argc, argv, nil, @"YOUR_APPDELEGATE_CLASS");
    如:
    int retVal = UIApplicationMain(argc, argv, nil, @"TestAppDelegate");
  • XXXAppDelegate.m里面,删除原来的一些内容,添加类似如下代码,这里就不细说了,相信都能明白
    – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //一定要initWithFrame,否则不响应触摸事件
        _mainTabBarController = [[MainTabBarController alloc] init];
        _window.rootViewController = _mainTabBarController;
        [_window makeKeyAndVisible];
        
        return YES;
    }
MainWindow搞定了,其他ViewController就比较简单了,可以重写init,也可以在viewDidLoad等方法里添加一些控件.创建ViewController就直接alloc init就行,不用管frame的问题.
 
没有了nib是不是感觉整个项目清爽了一些呢?不过要写的代码也变多了.
 
–以上–

Macvim Python IDE搭建

MacVim有For Lion版本了,支持全屏,而且是我发现的第一个在双显示器下可以全屏到另一个屏幕的应用,但是Toolbar和编辑区分离了.

可能需要的插件:

  • TagList,注意这个插件需要Exuberant ctags,Mac下使用 Macports安装(sudo port install ctags)
  • NERD_tree:一个类似Finder的东西,帮助你快速跳转目录打开文件而不必费劲打cd xxxxxx
  • Pydiction:在insert模式下按tab可以补全
  • VimPdb:使用默认的文件加载不会成功,你可以sorce一下看看错误(Not an editor command: ^M),解决方法,vim编辑VimPdb.vim,然后:set ff=unix,:wq重新加载下就可以了
    快捷键问题:VimPdb默认使用了F8等已经被mac占用了的几个按键,可以编辑VimPdb.vim在540行那里开始做如下修改:

     

     

    " Was F7 and F8
    map :call PdbStepInto()
    map :call PdbStepOver()
     
     " Was F4
    map :call PdbEvalCurrentWord()
    map :call PdbEvalCurrentWORD()
    " Was F3
    map :call PdbEvalExpression()
    可以参考这个地址
大概就这些了,如果你认为Vim是反人类的(其实我也这么想,之所以用VIM是因为找不到一个看着顺眼的IDE),你还可以尝试其他IDE,参考这里的对比
 
–以上–

XCode 4连接gitolite服务器的方法

XCode 4终于支持git了,但是要连接一个gitolite服务器还是稍微有点麻烦,不能通过orgnizer直接添加,需要执行以下几步(关于gitolite的搭建参考这篇"

  • 编辑 gitolite-admin/config/gitolite.conf
    仿照已有的内容,添加一个repository
  • git add config/   (假设在gitolite-admin目录下)
    git commit -m "MESSAGE"
    git push
  • 从返回的信息中我们可以看到添加了那个repository
  • git clone 下来新添加的repository
  • 在Xcode中新建项目,然后保存进clone下来的文件夹内,注意别添加本地的git
  • 再次add commit push
  • 接着用XCode打开项目就可以在Orgnizer的repository标签里看到了

–以上–

搭建Git服务器-gitolite

git就是一个很流行的版本控制工具,至于gitolite的介绍,可以参考官方网站

直接进入正题

  • 安装git
    yum install git
  • 添加git用户及git组,目录仅供参考,可以设置成其他的
    mkdir -o /data/git
    groupadd git
    useradd -g git -d /data/git -s /bin/bash git
  • 修改git用户密码,及git目录权限
    passwd git
    chown -R git:git /data/git
    chmod -R 2755 /data/git
  • 客户端声称ssh-key,YOURNAME改成你喜欢的
    ssh-keygen -t rsa -f ~/.ssh/YOURNAME
    然后把~/.ssh/YOURNAME.pub传到服务器上(scp/ftp…)
  • 安装gitolite
    su git
    cd $HOME
    git clone git://github.com/sitaramc/gitolite
    cd gitolite
    src/gl-system-install
    echo "PATH=$PATH:$HOME/bin" >> ~/.bashrc
    source ~/.bashrc
    gl-setup ~/YOURNAME.pub       #这里就是你刚才传的那个公钥

服务器端搭建结束,快吧!

接下来是gitolite的配置,以下都是在客户端进行,客户端要有git

  • 编辑~/.ssh/config,仿照以下内容
    host gitolite #只是一个名字
            user git
            hostname YOUR SERVER NAME/IP
            port 22    #ssh端口号,默认22,改成你的
            identityfile ~/.ssh/YOURNAME    #最开始ssh-keygen生成的那个
  • 改config文件权限(不改似乎也行)
    chmod 0644 config
  • 找个好地方,把gitolite-admin clone下来
    git clone gitolite:gitolite-admin
  • 设置git管理员信息,任意
    git config –global user.email "YOUREMAIL"
    git config –global user.name "YOURNAME"
  • 添加用户(首先要得到那个用户机器上生成的ssh-key)
    cd gitolite-admin/
    cp ANOTHERUSER.pub keydir/ANOTHERUSER.pub
    git add keydir/
    git commit -m "add new user"
    git push
  • 添加用户完成,如需添加多个用户方法类似

–以上–

在XCode 4中使用TODO FIXME等标记

在XCode 3,我们可以用类似这样的注释来方便我们标记需要修改的部分:

// TODO:
// FIXME:
// !!!:
// ???:

XCode 4不知为何不支持这一功能了,网上有一种解决方法,可以在编译后的Warning里面看到我们标记的TODO, FixME等,原文在此,转发过来:

  • 进入项目属性设置那个页面
  • 选择一个Target
  • 选择Build Phases标签
  • 点击右下角的Add Build Phase
  • 展看上面刚出现那一栏Run Script,输入以下内容
    KEYWORDS="TODO:|FIXME:|\?\?\?:|\!\!\!:"
    find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/ warning: \$1/"

–以上–

CentOS上L2TP安装与配置

2012.04.10 更新:ubuntu上除了安装,以及xl2tpd的启动脚本以外,本文的配置方法测试可行。采用编译安装可以参考这篇文章

2011.11.28 更新:CentOS 6 32bit 下xl2tpd,openswan等安装参照这篇文章,xl2tpd的启动脚本参考这篇文章,配置还是照本文的配置就ok(已经做了一些小修改),如果iptables重启后要重新配置一下才好使可以考虑将iptables那段添加到/etc/rc.local里面

先说下我的环境:CentOS 5.4 32bit 安装了Nginx

针对CentOS有L2TP的一键安装包,首先我推荐尝试一下这个安装包,毕竟很方便,但是我RP不好,这个一键包不仅没能让L2TP在我的机器上正确运行,还因为iptables配置不正确导致Nginx出现404,502错误,如果你也遇到了这个问题,可以简单的通过
service iptables stop
来重置并关闭iptables,以修复nginx的404,502错误,接下来再启用iptables就没什么问题了.但是来l2tp也就肯定不能连接了

这篇文章参考了这里,这里,这里,这里和这里的文章,建议一起看看
下面进入正题:

  1. 安装必须的包
    yum install -y ppp iptables make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced
    
  2. 编译安装OpenSwan
    wget http://www.openswan.org/download/openswan-2.6.24.tar.gz
    tar zxvf openswan-2.6.24.tar.gz
    cd openswan-2.6.24
    make programs install
    
  3. 安装xl2tpd
    yum install xl2tpd
    
  4. 编辑 /etc/ipsec.conf 注意$vpsip替换成你机器的ip
    config setup
        nat_traversal=yes
        virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
        oe=off
        protostack=netkey
    
    conn L2TP-PSK-NAT
        rightsubnet=vhost:%priv
        also=L2TP-PSK-noNAT
    
    conn L2TP-PSK-noNAT
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        rekey=no
        ikelifetime=8h
        keylife=1h
        type=transport
        left=$vpsip #改这里
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any
    
  5. 编辑 /etc/ipsec.secrets注意$vpsip替换成你机器的ip, $mypsk替换成你想要的密钥
    $vpsip %any: PSK "$mypsk"
    
  6. 修改/添加 /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.conf.default.rp_filter = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.all.log_martians = 0
    net.ipv4.conf.default.log_martians = 0
    net.ipv4.conf.default.accept_source_route = 0
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.icmp_ignore_bogus_error_responses = 1
    
  7. 让修改后的sysctl.conf生效
    sysctl -p
    
  8. 验证ipsec运行状态
    ipsec setup restart
    ipsec verify
    

    输出以下内容ipsec就配置成功了

    Checking your system to see if IPsec got installed and started correctly:
    Version check and ipsec on-path                             	[OK]
    Linux Openswan U2.6.24/K2.6.32.16-linode28 (netkey)
    Checking for IPsec support in kernel                        	[OK]
    NETKEY detected, testing for disabled ICMP send_redirects   	[OK]
    NETKEY detected, testing for disabled ICMP accept_redirects 	[OK]
    Checking for RSA private key (/etc/ipsec.secrets)           	[OK]
    Checking that pluto is running                              	[OK]
    Pluto listening for IKE on udp 500                          	[OK]
    Pluto listening for NAT-T on udp 4500                       	[OK]
    Two or more interfaces found, checking IP forwarding        	[OK]
    Checking NAT and MASQUERADEing
    Checking for 'ip' command                                   	[OK]
    Checking for 'iptables' command                             	[OK]
    Opportunistic Encryption Support                            	[DISABLED]
    
  9. 编辑 /etc/xl2tpd/xltpd.conf
    [global]
    ipsec saref = yes
    listen-addr = $vpsip ;服务器地址
    [lns default]
    ip range = 10.1.2.2-10.1.2.254 ;这里改成你想要的ip范围
    local ip = 10.1.2.1 ;这里改成你想要的ip
    refuse chap = yes
    refuse pap = yes
    require authentication = yes
    ppp debug = yes
    pppoptfile = /etc/ppp/options.xl2tpd
    length bit = yes
    
  10. 编辑 /etc/ppp/options.xl2tpd
    require-mschap-v2
    ms-dns 8.8.8.8
    ms-dns 8.8.4.4
    asyncmap 0
    auth
    crtscts
    lock
    hide-password
    modem
    debug
    name l2tpd
    proxyarp
    lcp-echo-interval 30
    lcp-echo-failure 4
    
  11. 配置用户名,密码:编辑 /etc/ppp/chap-secrets
    # user server password ip
    username * userpass * #改成你的用户名 密码
    
  12. 重启xl2tp
    service xl2tpd restart
    
  13. 设置iptables,注意$vpsip改成你机器的ip, 最后一行10.1.2.0改成跟你前面设置xltpd.conf时对应的ip
    iptables -A INPUT -p 50 -j ACCEPT
    iptables -A INPUT -p udp -d `ifconfig | grep 'inet addr:'| grep -v '$vpsip' | cut -d: -f2 | awk 'NR==1 { print $1}'` --dport 500 -j ACCEPT
    iptables -A INPUT -p udp -d `ifconfig | grep 'inet addr:'| grep -v '$vpsip' | cut -d: -f2 | awk 'NR==1 { print $1}'` --dport 4500 -j ACCEPT
    iptables -A INPUT -p udp -d `ifconfig | grep 'inet addr:'| grep -v '$vpsip' | cut -d: -f2 | awk 'NR==1 { print $1}'` --dport 1701 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o eth0 -j MASQUERADE
    
  14. 保存
    service iptables save
    service iptables restart
    
  15. 添加启动项
    chkconfig xl2tpd on
    chkconfig iptables on
    chkconfig ipsec on
    

l2tp配置完成,过程如有疏漏欢迎批评指正

可能的问题及解决方法:

  1. iptables Setting chains to policy ACCEPT: security raw nat mangle filter [FAILED] 问题
    http://vps.openzz.com/archives/224

–以上–

 

博客迁移到VPS啦!

更新:目前已经放弃Diahosting转用Linode,对比起来虽然linode最便宜那款相对Diahosting的X180贵了一倍,但是无论从性能还是网络延迟方面都比Diahosting要好,对于想体验高质量服务同时又不希望成本第一些的用户来说可以考虑合租,唯一一点不足的就是支付需要用支持美金支付的信用卡,关于这点可以通过淘宝代购解决。

本博客之前一直都是建在Godaddy买域名给的免费空间上,虽然那个免费空间有广告(在顶端,超大),但是你选择Windows主机然后升级成IIS 7那个广告就出不来了(这似乎是个Godaddy没解决的技术问题),这个方法强烈建议建站新手尝试,连空间带域名一年多说60人民币,买info域名更爽才10块,至于.XXX肯定就贵了.这个免费空间速度还算可以,就是有时候线路抽风,访问比较慢,总体还能令人满意(毕竟不要钱).

这里PS一下,Godaddy有各种优惠码,买得时候查一下.能省不少钱,另外除非很便宜,否则没必要找淘宝代购,付款时支持支付宝,而且币种兑换没有手续费,相当方便.有关教程Google一下,满地都是. >>7.49 .com 域名@Godaddy(广告XD).

用了半年后,这个免费空间上搭建的Wordpress在更新时经常出错,总是不能正确删除旧版的插件目录,ftp上去也不行,过一小时没准那个目录就自己消失了,由于把广告弄掉了也没好意思找客服问,折磨得但疼就准备花钱换主机了.但是光是主机真是没啥意思,一点Geek精神都没有,所以VPS是个好选择,虽然贵了很多,但是可玩性高不少,别人推荐的便宜又稳定的VPS有PhotonVPS,还有国内的Diahosting,我选择了Diahosting最便宜的那个X180(63一个月),理由就是我买完才发现Photon的更便宜.至于哪个更稳定,我也不知道.

Diahosting是中文客服,Ticket处理蛮快的,有什么问题很快就解决了,至今不满意的一点就是最近有时掉包严重(洛杉矶机房),跟客服沟通了下,客服说最近网通出口有问题,机房正努力解决,希望早点解决吧.另外Diahosting的Xen-shell可以自己重装系统,很方便.

配置VPS没有想象得困难(lnmp+wordpress+phpmyadmin),lnmp教程基本参考这个(愿意用一键安装脚本也可以)

对于这个教程的几点补充:

  • 第一步那里有个地址已经失效了,到这里找最新的包就可以了,要不然不能直接yum install php535,你自己编译安装就用不着了
  • 这个教程有个缺点就是通过yum安装的Php的Mysql Library是通过旧版的MySQL编译的,进入phpmyadmin的时候会有提示(我的是:你的 PHP MySQL 库版本 5.0.94 和你的 MySQL 服务器版本 5.5.15 不同。这可能造成一些未知的问题。),没有洁癖得无视就好了,有洁癖的安装php时就自己编译一下,也不费劲.
  • 教程里没有提到nginx的配置问题,这个自己查一下,也很好解决。
  • 至于phpmyadmin,解压缩然后改以下那个config文件就好

遇到的问题及可能的解决方法:

  • 访问.php文件时浏览器显示空页面—-nginx配置文件中php脚本转发那里有问题,一般是php文件路径的问题。
  • phpmyadmin登陆那里无法登陆,无论对错都只是刷新一下,没有提示也不能过去—-跟上一个问题一样。
  • wordpress固定链接问题—-Apache和lighttpd比较幸福,nginx还是要改配置文件,转发规则有个.htaccess和nginx在线转换的一个网站,转换完帖到响应位置即可
  • wordpress插件wp-db-backup不能发送邮件—-安装sendmail

至于ftp(vsftpd)没什么难度,随便一个教程即可

pptpd(都知道是干什么的吧),这里有一键安装包,超方便。

学校连不上pptp,今天又折腾了l2tp,这个费了点劲,有空写个教程。

总体来讲新手配置VPS并不是很难,教程太多了,但是需要有一点terminal基础,再有就是改完配置文件注意重启响应服务才能让配置文件生效。

–以上–