在照片质量评分组件 PhotoAssessment 项目上,有些算法的实现是使用 CPU 运行的。通过使用 MPS(Metal Performance Shader) 在 GPU 上并行计算,显著提升了性能,算法执行耗时降低了 99.9% 以上。震惊,呵呵。随着性能上成百上千倍的提升,可以在相等时间内处理更大尺寸的图片,进而提升组件的准确度和用户体验。

至此,几乎所有图像处理与计算任务都交由 GPU 完成。之前利用 Sobel 算子边缘检测是使用了苹果封装好的 MPS 类,剩余的色彩分布指纹向量和饱和度均值当然都是需要自己写 Shader 的,现在终于补齐了。Metal Shading Language 与 GLSL 使用习惯和理念很相似,只不过 Metal Shader 的语法是基于 C++ 14 的。

关于整个组件的实现思路,可以查阅『使用 Metal 和 Core ML 评价照片质量』。本篇文章所涉及到的 Shader 代码 也在其中。

Read More

最近在搞 iOS MVVM 框架,虽说是 N 年前就老生常谈的知识了,但设计模式毕竟是只一种规范,无法约束项目中所有程序员都去遵循。我做了个 OCLint 的自定义规则,对 ViewModel 运行静态检查。

然而过程中踩了不少坑,OCLint 的官方 Repo 早已失效,可以使用我修改后基于 LLVM 7 的版本:https://github.com/yulingtianxia/oclint/tree/llvm-7.0

伸手党也可以使用我写的脚本直接安装,已包含 MVVM 规则。

Read More

开发者经常会在代码中看到各类脏话,有吐槽产品的瞎改早晚还会改回来的,有吐槽这块代码写的太烂无法直视的,或是干脆心情不好就一顿骂。公司内部的项目想必是无数天坑 f*ck 无数,连对外开源的项目也难逃一劫,比如前一段时间 OpenJDK 就因为脏话太多火了一把。

于是我做了一个 Xcode 插件来寻找代码中的脏话,将其高亮可以被选中,作为一个强提示让开发者修改。目前逻辑还只是简单替换而已,代码在这里:DirtyWords-for-Xcode

为了体现汉字的博大精深,瞎画了个 icon,见笑了:

Read More

如何评价一张照片的质量呢?

用算法可以客观地评价照片质量,也可以人为主观地给照片打分,并运用机器学习来训练模型。

我用 Swift 写了个 Demo。用苹果的 Metal 跑一些算法得出客观评分,再用 Core ML 预测主观评分。得到照片评分后,就可以检测相似照片,并从中挑选最优的照片推荐给用户。

Demo 中展示了图片在 NIMA 模型预测结合人脸识别的主观评分、图片的 HSB 色彩空间、以及边缘检测结果的平均值和方差。代码兼容 iOS 和 macOS。下面示例图片拍摄自胡里山炮王和西塘。

Read More

前一阵子看到一篇文章 《石锤 github 买 star 行为》,第一反应是很震惊。是真的很震惊,因为文章中提到的 CocoaDebug 我也 star 了,没想到竟然涉嫌购买 star 炒作,蒙蔽了好多人的双眼。没错,我就是跟风 star,看别的大神 star 啥就顺手 star。 也有的人看 Trending 上啥火顺手 star,甚至用脚本自动 star。

这条黑产背后到底隐藏着什么?GitHub 上还有哪些大笨蛋也曾靠买 Star 蒙蔽了大神们的双眼呢?我写了个简单的程序用于挖掘基于 Star 的关系链,并进行聚类分析。然后从 CocoaDebug 这个 repo 入手,沿着关系链一层层深挖下去。

用数据说话,结果一定也会让你大开眼界。正义可能会迟到,但绝不会缺席!

项目源码:FuckFakeGitHubStars

Read More

TBUIAutoTest 可以帮开发人员生成UI 控件的标签,便于自动化测试。只需一行代码或一个配置,几乎所有的 iOS Native UI 都会在运行时生成一个页面内唯一且不变的标签。不仅节省了开发人员手动为每个 UI 控件加标签的时间,也节省了测试人员与开发人员的沟通成本。

Read More

MessageThrottle 是我开发的Objective-C 节流限频组件,其原理基于 Hook 消息转发流程,在运行时应用了一套节流限频的规则。

新版本再次提升性能的同时,确保了 hook 流程、多线程操作、规则管理的安全性,支持了持久化规则,并对 KVO 等场景进行兼容。MessageThrottle 的代码测试覆盖率在 80% 以上,在编写测试用例的同时也发现了一些安全隐患,有些甚至是业界知名开源库都没有发现和解决的。

本文是关于 MessageThrottle 的第四篇文章。前三篇如下:

Read More

之前写了一篇文章《追踪 Objective-C 方法中的 Block 参数对象》,利用 BlockHook 和 Objective-C 的动态特性实现对 block 对象执行和销毁的追踪。本文在此基础上,通过 Mach-O 文件格式获取 Mangle Name 并根据 Clang 源码实现对其解析,探寻如何追踪 block 代码定义的位置。

主要代码已经整合到 BlockHook 1.0.2 版本中。

Read More