搭建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/"

–以上–

XCode 4免证书真机调试

本文转载总结自世界各地,如有侵权还请见谅.

目前可以保证是最简便的方法

方法如下:

  • 创建证书,这里不多说了,直接参考这里创建证书的步骤,不要做除创建证书以外的工作
  • 终端: sudo /usr/bin/sed -i .bak 's/XCiPhoneOSCodeSignContext/XCCodeSignContext/' /Developer/Platforms/iPhoneOS.platform/Info.plist (其实就是把这个Info.plist中所有XCiPhoneOSCodeSignContext改成XCCodeSignContext,手动替换也可以)
  • 修改项目配置里面的TARGETS:选择ALL找到Code Signing Identity,选择iPhone Developer (这里说的不太明白,大家试一下就知道了)

此时你应当重启下XCode尝试一下是否可以通过真机运行(此时应当是app能装到真机上但是会出现一个错误不能debug,程序也没运行,但是可以像正常应用一样点击运行了,要想可以debug应当做最后一步的工作)

  • Xcode的File菜单上,File >> New >>New File >> iOS >> Code Signing >> Entitlements 新建一个Entitlements.plist,然后在之前修改TARGETS的地方找到Code signing Entitlements,键入:  ./你的项目名/Entitlements.plist(这个路径取决于Entitlements.plist的位置) ,接着运行试试吧!

PS. 如果仍未成功,回复中的内容可能对你有帮助。

–以上–

[UIView beginAnimations:context:]与[UIView animateWithDuration:animations:]值得注意的一个区别

看过官方文档的都知道,官方推荐在iOS4以后使用[UIView animateWithDuration:animations:],而不是原来的[UIView beginAnimations:context:],来完成动画,虽然二者功能几乎完全相同,但使用前者在一些情况下会方便不少,这些内容可以参考官方文档View Programming Guide For iOS的Animation一节.

二者有一个值得新手注意的区别就是[UIView animateWithDuration:animations:]默认会禁止触摸,手势等的响应,这可以通过设置option选项来解决(直接引用StackOverFlow的一段了):

 

UIViewAnimationOptions options = UIViewAnimationCurveLinear | UIViewAnimationOptionAllowUserInteraction;

[UIView animateWithDuration:0.2 delay:0.0 options:options animations:^
 {
     highlightView.alpha = 1.0;

 } completion:nil];

 

就是这么一点事儿,害我走了不少弯路(我也是新手哈),在这里写一下,提示一下有可能遇到同样问题的人.

–以上–

在iPhone/iPad/iPod上查看iOS文档

7.26更新:iPad基本不用看了,拿模拟器试了下发现官方文档对iPad支持甚好,而离线版缺少对iPad的支持,无法通过Safari打开

苹果的官方文档甚是强大,对开发的各个方面都进行了及其详尽的介绍,作为开发者当然要时常翻看,本地的文档只能在电脑上看,要想用我们的iDevices查看文档只好连网看在线版的,但由于网速限制不够有效率,官方文档虽然支持转换成PDF,但是转换速度很慢,转换后一堆超链接也失效了.另外我找了好久也没有一个叫"Procket Documentation"或者类似的App,实在有些遗憾.

这里有一个不太完美的解决方案:官方文档虽然都是docset格式的,但其实右键显示包内容一看就是一堆html,css啥的,和在线版的文档一样完全可以用浏览器解决,所以只要把docset里面的Documents文件夹拖到你的iDevices里面就行了,如果你没有越狱就用GoodReader啥的看吧,不过我用iPhone 4测试效果不太理想,文档首页加载奇慢,而且显示不全,那个搜索不知道好不好使,太卡没法测试,iPad 2不知道效果能怎么样,有iPad 2的同学试验下最好在评论中说下效果,别的页面也可以直接浏览,不过效果没有桌面版的Safai那样好,排版似乎有些问题(不是大问题,试下就知道了),但是不影响看.

如果越狱了,可以在Cydia里搜索下lighttpd,安装,最好也安装一下Lighttpd SBSetting Toggle,安装后重启,然后就可以用Safari访问127.0.0.1了.(这里只介绍下安装那个Toogle后的使用方法,Lighttpd SBSetting Toggle的说明中提到webroot地址是/var/www,配置文件是/etc/lighttpd2.cong,用默认的配置文件访问127.0.0.1就可以直接看到/var/www下的目录.只要把之前提到的Document文件夹放这里就行了,接下来怎么做就不用说了吧.) 用自带Safari打开文档,文档首页依旧很卡,但是比GoodReader强多了,而且搜索也勉强可以用(iPhone 4测试,其他不知效果如何),其他页面和GoodReader浏览效果一样,都是排版有点问题,不影响效果.

目前为止也没做太多测试,现在正考虑用其他浏览器看看效果是否能好些(Operamini试了下根本不行),如果有发现就会更新这篇文章,没有就这样了.

其实这个方法也可以用来查看Android文档什么的.

–以上–

PS:搜狗输入法Mac版真TM2(Ver 1.1),中文标点那个选项没有记忆,切个输入法就又回到默认值了,写这篇文章净折腾全角半角的问题了.另外所谓的词库也就那回事,跟Win版没法比.

推荐:XCode 4视频教程

上一个项目做的差不多了,所以这几天尝试了下XCode 4,发现4与3的区别蛮大的,快捷键也改变了不少,一些功能也不知为何被精简了,比如User Script(应该是被Code Snippet代替了,不过感觉没有Script强大). 看文档实在太麻烦,上网找了找相关资料,发现之前的Become Productive in XCode系列又专门为XCode 4做了10个视频,而且这回是免费的,果断下载过来分享,毕竟看视频要比看文档直观多了。

这里还有个快捷键的PDF

XCode 4的这几个视频虽然感觉不如3的那么经典,但是作为XCode 4的快速入门还是相当有价值的。如果上面那些由于某些原因无法下载,我这里还提供一个115的下载地址,Have Fun。

PS:这篇介绍XCode 4之前的文章都是以XCode 3为基础的,要查看XCode 3的有关文章请通过标签或搜索查询.

–以上–

NSLog对程序性能的影响

NSLog,既可以像printf那样方便地格式化输出,同时还能输出时间以及进程ID等信息,可谓调试利器.但是其实NSLog对程序性能也有不小的影响,在执行次数比较少的情况下可能看不出来什么,当短时间大量执行的时候就会对程序执行效率产生可观的影响.

我遇到的一种情况就是我在一个UIScrollView子类的layoutSubviews方法中输出了很多次log,而这个layoutSubviews本身又有相对繁重的工作要做,由于每次拖动这个UIScrollView都要调用很多次layoutSubviews,因此程序实际运行起来拖动体验就非常差,卡顿现象严重,多次测试发现注释掉所有的NSLog后拖动就变得正常了.

综上,当你疑惑是什么导致了你的程序运行效率很差的时候不妨注释掉那些NSLog试试,你的问题也许就迎刃而解了.

–以上–

[下载]XCode技巧视频教程

这个视频教程之前在这篇文章里提到过,总体来讲是个非常不错的教程,从基本的快捷键到各种TextMarco,自定义脚本等统统介绍了一番,话说"工欲善其事,必先利其器",这个视频教程算是"利其器"必备.

视频以XCode3为基础,XCode4我还没装,某些地方会有挺大区别,这些地方自己查查就好了,等我安装XCode4后会出一个简单的教程介绍一下有区别的内容(不过短期内不会了,所以不要指望我)

支持原作者请通过这篇文章的相应连接寻找.

原版已经不能从官网下载到了, 放出个下载地址

 

关于lvalue required as left operand of assignment

这种错误发生的其中一种情况:

UIView *aView;
aView.frame.size = …….;

第二行会报错,提示lvalue required as left operand of assignment

这里有关于这个错误的解释:

点操作符有两种用法:

1.调用成员变量的getter setter

2.访问结构体

当在等号左边时这两种不能混用,右边可以,所以还是要用这种方法来实现:

aView.frame = CGRectMake(…..)

这只是lvalue required as left operand of assignment错误出现的一种情况,估计其他的也可以类比解决

–以上–

关于initWithCoder导致的内存泄露

initWithCoder一般是通过[NSUnarchiver unarchiveObjectWithData:NSData]调用的, 虽然我们可能感觉代码写得没有什么问题, 但用Performance Tool检测还会有leak. 如果你确定自己的代码没有任何问题, 那么就可以无视Performance Tool的检测. 之所以会检测到内存泄露, 一个可能的原因就是unarchiveObjectWithData:返回的是一个autorelease对象, 而在Performance Tool检测时, autoreleasePool还没有释放, 因此我们可以尝试直接在unarchiveObjectWithData:这个方法附近范围新建一个autoreleasePool然后release它(参考main.m中autoreleasePool的创建和release), 如果Performance Tool不再提示内存泄露, 那么就证明的确没有内存泄露了.

可以参考这里的讨论

–以上–