一年前,我开发了 BlockHook,(应该是)填补了 Objective-C 业界在 Hook Block 技术领域的空白。但是对于 Block 的参数和返回值有限制,仅定制了 CGRect, CGSize, CGPoint 等结构体,不支持自定义 struct。这次就把这个坑给填上。

至此,BlockHook 已支持 macOS 和 iOS 平台全架构、tvOS 和 watchOS 模拟器,BlockHook.m 测试覆盖率达到 92% 以上。

Read More

如何识别声音所蕴含的情绪呢?在大部分场景下,人声的情绪更有意义。可以先将人声转文字,再通过 NLP 分析语义情绪。不过人类语言博大精深,一句『卧槽』的不同语调和语境下会有很多种意义,真的是卧槽啊!

于是我从音频特征提取入手,将人声分类识别为八种情绪,实现了两个方案并都得到了测试集 70% 以上的准确率:

  1. 使用 VGGish 网络做特征提取,输入自定义网络进行训练。
  2. 使用音频库导出一系列特征作为输入向量,自定义网络进行训练。

Python 工程和 iOS Sample 开源在 GitHub 上了:https://github.com/yulingtianxia/AudioEmotion

Read More

在照片质量评分组件 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