浮生猎趣

ls *.fun

利用 Python 对 CSV 文件进行数据分析,生成统计图表

| Comments

CSV 文件本质上还是文本文件,只是格式是固定的,所以看起来跟表格差不多。Mac 下的 Numbers 原生支持打开 CSV 文件,也可以进行排序、筛选、统计等操作。不过有一点比较致命,当数据量特别大的时候,用 Numbers 简直痛不欲生,内存涨得飞起,卡得你不要不要的。而利用 Python,处理起来则灵活方便很多。

1. 配置环境

1.1 安装 MacPorts

最简单的方式是使用 pkg 安装。下载安装包,然后双击即可。

macports_install

安装完后要重新开一个终端才能运行,否则会提示 port command not found.

1.2 安装依赖库 numpy & matplotlib

1
sudo port install py35-numpy py35-scipy py35-matplotlib py35-ipython +notebook py35-pandas py35-sympy py35-nose

1.3 测试

1
2
3
4
5
$ python
>>> import numpy as np
>>> np.test('full')
>>> import scipy
>>> scipy.test()

参考 [Mac] Python Numpy Scipy Matplotlib 快速安装

iOS App 本地化的自动翻译脚本

| Comments

写 App 的激情与动力,往往在于核心功能的实现,至于那些 UI 细节的微调、多国家的语言文件,岂是尔等大牛需要做的事?

但是,一款出色的产品,往往不只有出色的核心功能,它的产品细节、用户体验也是趋于完善近乎完美的。大牛的你,虽然不想干这些脏活累活,然而,牛在江湖身不由己,你有三个选择:

  1. 咬咬牙,自己上。
  2. 招个临时工 or 实习生,让他干。
  3. 写个脚本,自动完成。

现在要说的 App 本地化,就是一个典型的又粗又脏又累的活:

  1. 没有任何技术含量。
  2. 需要大量重复劳动。
  3. 每个 App 都需要做一遍。

身为一名程序员,看到上述三个烦死人的特征,除了累觉不爱之外,还有没有别的什么想法呢?

为 Sublime Text 自定义 Log 语法高亮

| Comments

近日,代码写得越来越少,大部分时间都用来查 Bug 了,而查 Bug 的大部分时间里,是在看崩溃报告和用户日志。

有过看 Log 经历的人都知道,Log 到看时方恨少,对着十多兆的日志文件,满屏幕的文本信息,却找不到自己想要的那个关键点的记录,这是极其让人崩溃的。于是,看代码和写代码的时候都会下意识地在关键路径都打上 Log,宁可错打一千,不可放过一条。几次下来, Log 文件越来越大,看 Log 越来越累……如果逼不得已非得要大海捞针,那就让捞针这个过程更方便一些吧,这时候,关键字过滤以及高亮的需求随之而来。

软件界的神器之所以能成为神器,除了其本身功能突出之外,很大部分原因是它支持各种定制,能方便地添加插件或扩展,比如 Vim,Alfred,Chrome,等等。Sublime Text 也毫不例外地支持插件和自定义。本文要说的就是如何为 Log 文本文件添加自定义的语法高亮。

iOS 10 ReplayKit Live 与 Broadcast UI/Upload Extension

| Comments

在 iOS 8 及以前,第三方 App 如果想要全局录屏,只能使用私有 API,详见非越狱后台录屏

升级到 iOS 9 后,官方新增了 ReplayKit,并且禁用了录屏的私有 API。ReplayKit 并不算是完美的录屏方案,如果想要把梦幻西游的游戏过程录制下来,需要梦幻西游这个应用本身添加 ReplayKit 的支持,然后再把录制的视频分享出去。对于不支持 ReplayKit 的游戏,怎么录制?答案是,没有办法。试想,又有多少个游戏会内置 ReplayKit 呢?

iOS 10 在 iOS 9 的 ReplayKit 保存录屏视频的基础上,增加了视频流实时直播功能(streaming live),官方介绍见 Go Live with ReplayKit。下面详细说说这个流程。

更可靠和高精度的 iOS 定时器

| Comments

定时器一般用于延迟一段时间执行特定的代码,必要的话按照指定的频率重复执行。iOS 中延时执行有多种方式,常用的有:

  • NSTimer
  • NSObject 的 (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
  • CADisplayLink
  • GCD 的 dispatch_after
  • GCD 的 dispatch_source_t

每种方法创建的定时器,其可靠性与最小精度都有不同。可靠性指是否严格按照设定的时间间隔按时执行,最小精度指支持的最小时间间隔是多少。

使用Swift语言在iOS客户端生成七牛的上传Token

| Comments

七牛SDK官方不推荐由客户端生成Token,所以在SDK的源码以及Demo中都没有提供生成上传Token的接口与示例。但是有时候的确需要在客户端生成Token,因为个人用户哪里有那么多服务器啊……本文提供了Swift语言版本在iOS客户端生成七牛上传Token的示例代码。

非越狱 iOS 在后台截屏、录制屏幕的相关实现

| Comments

需求

先简单介绍一下标题的含义。也许你看到iOS截屏,觉得这有什么好长篇大论的,小菜一碟而已。可能你忽略了后台这个关键词。

这里的关键就在于怎么在 App 切换到后台之后,仍然能够持续截取用户屏幕内容。解决了这点,剩下的就是把图片合成视频,有必要的话再加入声音。

另外,需要说明的是,实现后台截屏只能使用私有 API,而苹果是不允许这类 App 上架的,就算你用了一些技巧(比如动态加载私有 API 以绕过 App Store 的审核)而上架,假以时日苹果也会发现并且下架处理。Display Recorder 就是这么做并且被下架的,所以现在它发到越狱市场了。

作用

在 iOS 上录制全局屏幕,保存成一个视频,这么一个小众需求到底有什么作用?虽然一般用户都不会用到,不过它还是有点用的:

  • 录制 App 使用的视频教程(而不是图片+文字、图片+文字、图片+文字);
  • 如果 App 有个在某些用户机器上必现的 Bug,可以让他把操作记录下来,发给开发者(这样码农们就没办法再推脱:“在我这里是好的!肯定是你的打开方式不对!”);
  • 如果你是游戏大神,玩得一手好手游,还可以把你在游戏中的神操作保存下来供日后回味(或者分享出去让小白们膜拜)。

UIViewController Push & Pop 的那些坑

| Comments

iOS开发中,UIViewController是最常用的一个类,在Push和Pop的过程中也会经常出现一些UI卡死、App闪退的问题,本文总结了开发中遇到的一些坑。

大部分视图控制器切换导致的问题,根本原因都是使用了动画,因为执行动画需要时间,在动画未完成的时候又进行另一个切换动画,容易产生异常,假如在 Push 和 Pop 的过程不使用动画,世界会清静很多。所以本文只讨论使用了动画的视图切换。也就是使用以下方式的 Push 和 Pop:

1
2
[self.navigationController pushViewController:controller animated:YES];
[self.navigationController popViewControllerAnimated:YES];

查找XCode工程中没被使用的图片资源

| Comments

LSUnusedResources

1. 需求的引入

一个项目开发得越久,添加的功能模块也就越多,相应地,也会慢慢引入大量图片等资源。但是,在移除一些不再使用的模块的时候,开发者往往会把该模块所对应的图片资源一起删除,因为源码和资源是分离的。长久以来,项目中就会存在大量没被使用的资源文件。

在某个时机,也就是需求完成得差不多,Bug 增加得不够多,Crash 上涨得不够快的时候,码农们终于有了一点闲暇时间,打算清理一下资源文件,减少 App 安装包的大小。这是一件体力活,方法无非是,一个一个地复制资源文件名,然后在 XCode 中全局查找该字符串,如果结果为 0,那么这个资源很可能就没有被使用。为什么说很可能?因为在代码中,有可能通过字符串拼接的方式使用了这个资源,而这种情况是没办法通过字符串匹配查找出来的。

道理我们都懂,但是,操作起来也实在是太繁琐了,码农们不可能会乐意这样干的。于是,我们需要这么一款工具:能够迅速找出工程中所有没被使用的资源文件。