关于 Python AI 程序加密

AI 程序一般至少包含 AI 模型和推理逻辑。
如果涉及到加密场景,则还要实现模型加密、模型解密以及调用计数加密。

1
2
3
AI 程序 = AI 模型 + 推理逻辑
AI 程序 = 加密模型 + 解密模型 + 推理逻辑 + 计数逻辑
AI 程序 = 加密模型 + 加密“解密模型” + (加密)推理逻辑 + 加密计数逻辑

本文从软件工程的角度对常见 Python AI 程序加密的方法做一些代码攻防演示,并做出以下结论:

  • 在 Python 代码内做软件加密意义不大,因为 Python Interpreter 很容易被拦截
  • PyArmor 结合 C/C++ 是一个兼顾开发成本和保护力度的可行方案,适合早期的项目推动
  • 软件加密不是万能的,任何加密都可以被破解,难度取决于运行时机器对 Hacker 的透明度

Read More

Qt5 疑难杂症:QGraphicsScene 鼠标单击不触发自定义 QGraphicsItem 的 shape 方法

QGraphicsScene::items and QGraphicsScene::itemAt does not return clicked item of customized class class Item: public QGraphicsTextItem even thought Item::shape and Item::boundingRect method has been overriden properly and Item::mouseHoverEnter works with customized shape.

今天又遇到一个 Qt5.12.12 的坑: QGraphicsScene::itemsAt(event->scenePos(), QTransform()) 死活不能正确检测到被点击的 class Item: public QGraphicsTextItem 元素。

一般而言,这类问题都是因为没有正确使用 event->scenePos 或者没有正确 override 自定义 Item 的 shape 方法。
之所以叫疑难杂症,就是因为以上一般方法都没用。

Read More

使用 Docker Compose 部署 Gitlab Runner

本文目标:

  • 一台主机部署多个 Gitlab Runner
  • 实现互相隔离且互不影响的 Gitlab Runner 环境
  • 使用 compose.yaml 持久化配置和数据,快速复制部署
  • 在 Gitlab Runner 中使用 docker, helm 以及 kubectl

前置要求:

  • 宿主机上安装了 dockerdocker compose
  • 【可选】宿主机上安装了 kubectlhelm

方案限制:

  • 只能使用 shell 作为 Gitlab Executor
    • 由于 Gitlab Runner 本身运行在 docker container 中,所以几乎没有影响

Read More

开源软件协议 QA

在开始阅读前,可以先尝试这道选择题,测试自己对开源协议的理解😊。
答案在文章最后。

【选择题】以下受开源软件协议约束的场景包括:

  • [ ] A. 包含某个开源软件库,开发一个安卓程序并上架应用商城
  • [ ] B. 包含某个开源软件库,搭建一个后端服务程序并封装为 SaaS 对外服务
  • [ ] C. 包含开源软件库,开发浏览器前端界面并部署上线给用户使用
  • [ ] D. 使用一个开源脚手架工具构建项目并上线应用商城
  • [ ] E. 包含某个开源软件库,开发一个后端服务程序,提供私有化部署
  • [ ] F. 基于某开源编程语言开发的软件,进行分发
  • [ ] G. 基于某个开源编程语言编译器定制开发语言编译器,实现定制编程语言并进行分发
  • [ ] H. 包含某个自己贡献了代码的开源库,开发一个软件并进行分发

Read More

C++对象数据布局(一)——数据对齐的陷阱

C++ Class 对象的数据布局和 C Struct 数据布局遵循同样的原则,按顺序排布并考虑内存对齐的要求。
但是 C++ Class 对象相比于 C Struct 有其创新之处。C++ Class 添加了两个新的 access section,支持在类内声明函数,最重要的是,添加了“继承”的特性。
这其中有什么可怕的陷阱吗?直接公布答案有什么意思,你得自己一步一步趟过去才行。
小心,别中招了!

Read More

并发编程(二)—— 多线程

如果我们把进程比作一个工人的话,那线程就是工人的四肢。怎么理解这个比喻呢?

  • 工人拥有四肢,进程拥有线程
  • 工人干活要依靠手脚来做事,进程干活也是依靠线程来做事
  • 工人和工人之间只能通过工头调度或者相同的操作手册(大脑中的知识)来协作,进程和进程之间只能通过操作系统内核调度或者共享内存来协作
  • 工人的四肢用工人自己的大脑来协调,进程的线程用进程自己的虚拟内存空间来协作
  • 一个工人的四肢的协调效率比多个工人之间的协调效率高,一个进程的线程之间的协作效率比多个进程之间的协作效率要高

Read More