使用 sed 匹配和替换字符串

sed 可以方便的进行批量替换文件中字符串操作

1
sed "s/ww2/ws3/g" *.m

以上命令就是将当前目录下所有 .m 文件中的 ww2 替换为 ws3,并打印出来。

sed 中 如果需要覆盖当前文件,可以加上 -i 参数
例如:

1
sed -i "s/ww2/ws3/g" *.m

Jenkins 中 对 Git 日志过滤

Jenkins 中想对某次构建中的 Git 的日志进行过滤后使用,首先需要拿到上次构建成功的 Git HASH 值,Jenkins 提供了这样的一条链接,可以拿到上次构建成功时的一些信息:

1
http://<host>/job/<job_name>/lastSuccessfulBuild/api/xml

可以使用 curl 拿到 XML 文件的内容:

1
curl --silent --user $USER:$API_TOKEN $URL | grep "<lastBuiltRevision>" | sed 's|.*<lastBuiltRevision>.*<SHA1>\(.*\)</SHA1>.*<branch>.*|\1|'

UIView 等宽或等高排列

在 UI 开发中,时不时需要把几个按钮或者 UILabel 并排着排列,在以前用坐标系布局时都是靠算,很麻烦还容易出错,现在 Autolayout 这么方便,能不能使用 Autolayout 完成这个布局工作呢?试试看。

Autolayout 的布局规则是写 View 与 View 间的相对关系,我们来分析一下,如果要使 3 个 View 在一个容器 View 中均分需要满足哪些条件。

  1. 最左边 View 到父 View 一定边距
  2. 所有 View 宽度相等
  3. 一个 View 到下一个 View 有一定边距
  4. 最右边 View 到父 View 一定边距

iOS UIView 圆角和加边框方式总结

iOS 中时常需要把某个 View 圆角处理,这样界面看起来更圆融,开发中用到过很多种方式做圆角处理,这里就总结一下。

最简单的

最简单的方式就是设置每个 View 自带的 layer 的属性即可

1
view.layer.cornerRadius = 8.0f;

如果该 View 有子 View,会是这种状况

安装 Jenkins 遇到的那些坑

之前写了一篇 持续集成那点事 其中后半部分只讲了下简单的安装步骤,后来我又在另一台电脑上安装的时候,又遇到了几个坑,这里记录一下,供可能遇到同样情况的人参考。

注:下文中以安装 Jenkins LTS 2.7.2 为例

选择哪种安装方式安装?

Jenkins 的安装方式有几种:

  1. 通过 pkg 安装器安装 https://jenkins.io/content/thank-you-downloading-os-x-installer/#stable
  2. 直接下载 jenkins.jar http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war
  3. 使用 Homebrew 安装

其中使用 pkg 安装虽然是一键,但是比较坑的是安装在 Shared 用户下,这样的话很多本机的配置如 SSH key 等会有一些权限问题,环境变量使用也不是很方便,一些配置需要在 Shared 用户上单独配置,好处是干净,但是 Xcode 已经是在当前用户下了,Shared 用户的配置只能干净一部分吧,干脆点,安装在当前用户,不用 Shared 用户了。这样很多配置是不用在 Jenkins 中配置的,如上方所详的 SSH key,以及各种环境变量都是在当前用户下,配置好后在 Jenkins 中不需要再配置。

几个 Autolayout 技巧

iOS 设备的尺寸正在变的越来越多,在 iOS App 开发初期,只需要处理 3.5 寸 屏幕的布局,那个时候使用 frame 布局是唯一的方式,后来多了 4 寸屏幕 和 iPad 的 9.7 寸,iPad 上的 App 界面一般单独开始,写死坐标问题依旧可行,到再后来,iPad mini (7.9 寸),iPhone 6(4.7 寸),iPhone 6 plus(5.5 寸)紧跟着出现,写死坐标的布局方式的弊端开始显现,在多种尺寸上如何布局成了问题,这个时候苹果在 iOS 6 的时候推出的 Autolyout 布局方式变的流行,相对于写死坐标的布局方式,Autulayout 通过定义控件与控件之间的相对位置约束,在运行时根据不同的屏幕尺寸,得到不同的布局,更加灵活,可以更好的适应多种尺寸的设备。写一套约束,可以不同尺寸的设备上达到不同的布局效果,何乐而不为呢。

持续集成那点事

开发中,我们经常遇到一些奇怪的问题,比如本地可以编译成功的代码但是同事们更新代码后编译出错,或者在项目有多个 Target 的时候,资源文件只添加到了当前的 Target,另外一个 Target 这个时候是不能正常编译的,再比如写的工具类,被同事改了,或者自己有改动,很多地方用到了,怎么保证这个类的行为没有发生变化而影响到项目中的其他模块呢?诸如此类。

那么这些问题原因在哪,可不可以避免呢?当然是可以避免的,如果代码有新的改动,提交到版本库中的时候,有一个人帮我们检查必要事项,然后做做测试不就好了,这个当然是可以的,前提是老板同意专门招一个这样的人。

引起各种奇怪问题的原因有很多,比如开发环境比较复杂,不干净,IDE 的 bug (Xcode 的各种奇怪表现就是一个很大的坑),提交前有一些必要的检查需要做,但是开发的时候因为各种原因没做,这些机械重复的事情我们可以找一个工具来帮我们完成,而且这个工具跑在一个专门的服务器上,该服务器的环境相对干净,可以运行一些自动化的操作,如自动编译,代码检查,测试等环节,那么这种东西,就是接下来讲的「持续集成」。

创建私有 CocoaPods 仓库

iOS 开发中我们经常用 CocoaPods 来安装第三方库,CocoaPods 可以帮助我们处理依赖,管理版本等等,还是挺方便的,如果我们公司内部有一个比较独立的组件,不想开源但是又想用 CocoaPods 来管理,可不可以呢?当然是可以的,CocoaPods 也提供了比较好的支持,可以自定义源,这样只要我们把 Pods 源和组件的源代码的权限放到私有的空间里,其他和公开仓库的作法是类似的。下面就简单说一下怎么创建私有的 CocoaPods 仓库。

RAC 中一个 retain cycle 问题

今天使用 RAC 注册通知时,遇到一个不是很明显的 retain cycle 问题,使用场景是在一个 ViewController 中注册一个通知,代码如下:

1
2
3
4
5
6
- (void)viewDidLoad {
[super viewDidLoad];
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidBecomeActiveNotification object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(id x) {
self.title = @"";
}];
}

折腾记:上传图片到微博图床 Alfred Workflow 制作

用 Markdown 写博客经常需要上传图片,最开始的时候用微博图床 Chrome 插件,如果需要上传图片,需要截图或者复制文件,打开 Chrome,找到插件,打开插件,粘贴,得到 URL,在 Markdown 编辑器中插入,步骤烦琐,大部分需要鼠标操作,效率低。后来发现了一个 Alfred Workflow,markdown-img-upload,这个 workflow 可以读取剪切板中的图片并上传到七牛,得到 URL 后复制,整个上传过程精简了许多,但是有一个问题,如果用自己的域名,需要备案,如果用七牛提供的测试域名,哪天不提供了,或者换了咋办,服务稳定性(这里指域名)是个问题。昨天又发现了一个图床服务,天喵是个好图床,用的是天猫的资源,有 Alfred workflow,需要激活 File Action 才可以上传,另外,不知道天猫的接口,上传图片要经过这个网站,倒闭了怎么办。综上,三个服务的优缺点如以下图表: