Hacks on Computer Vision

[翻译] 基于寄存器调用的软件加速

原文地址:https://menno.io/posts/golang-register-calling/ 原文作者:Menno Finlay-Smits 2021 年 11 月 23 日发表 Go 1.17 的发布说明 中提到一个 Go 编译器有趣的变更:现在将使用寄存......

聊聊 caffe 和 caffe2

前几天 facebook 开源的 caffe2,让我们在深度学习框架上又多了一个选择。caffe2 宣称是轻量级模块化可扩展的一个框架,code once,run anywhere。作为一个老 caffe 玩家,自是要好好研究一番。

......

2016年的总结与展望

今年的最后一天,在公司的值班中度过。现在忙完了工作,可以静下心来,对今年做个回顾和总结,对明年做个规划和展望。

总结

在生活上,今年完成了自己的人生大事,又穿插着小半年的学驾照,天津的故地重游。生活上一直是简简单单的,和媳妇看电影、运动、养花养鱼。业余时间翻译了一本半书(有一本是和别人合译的),也写一些样稿。

在工作上,今年主要在各种文档和API中折腾,这一年的折腾,也让golang和ngx_lua的积累越来越多。同时,也更多的开始学习架构设计方面的知识,并有意识的在项目中使用。看别人的文档和API,也会思考下这么设计的好处和缺点。

下半年开始带应届生,一直鼓励他多看多折腾多总结,最近让他重构一个PHP的项目,看到他可以在不到一周的时间上手ngx_lua并基本完成这个项目的重构,还是很为他高兴的。

......

lua-resty-redis 返回空值的问题记录

背景

我们的服务本来使用一组redis,以一致性哈希的方式来使用,现在打算替换为云平台的redis集群服务,因此需要设计一个平滑过渡的方案。解决方案并不难,两种方式可以使用不同的key,对于一种key使用ring_redis,另一种使用redis集群,这样只需要在redis库的接口内部进行key的解析,就无需对其他代码做过多改动了。

实现并不难,但在测试时,遇到个很诡异的问题:从redis中取一个不存在的key时,返回的值(正常情况是json格式的字符串)在不存在的情况下,会导致nginx 500错误,通过日志中的trace看到,是返回的字符串无法被cjson解析导致,返回的字符串是userdata:NULL。这个返回的字符串引起我的好奇心,userdata是什么鬼?

什么是userdata

userdata是Lua中C API的一个基本类型,可以把任意的C数据存储在lua变量中,除了赋值和相等的判断外,没有其他的lua预定义的操作。userdata常用来表示由C应用或者库创建的新类型。

仔细看了lua-resty-redis的代码,才发现空值返回的是ngx.null这个变量。在nginx-api-for-lua中,ngx.null的含义如下:

The ngx.null constant is a NULL light userdata usually used to represent nil values in Lua tables etc and is similar to the lua-cjson library’s cjson.null constant. This constant was first introduced in the v0.5.0rc5 release.

......

cgo 的使用总结

背景

最近正在基于机器学习搭建一个多媒体分析平台,一方面鉴于组内成员多则有近两年的Go使用经验,少则也有半年的Go使用经验, 另一方面由于Go的格式统一、工程系统能力强大,所以选择Go为主要的开发语言。而对于多媒体分析,第一步就是图片视频的编解码,图片好说,而视频就比较难了。普通的编解码可以使用exec调用ffmpeg,但要获取视频每帧的数据内容,就需要使用ffmpeg的API了。通过github,我们找到了go-libav这个库,相比其他的go binding of ffmpeg libraries,这个库有以下几个优点:

  • 支持ffmpeg 3,也支持ffmpeg 2,但已废弃
  • 更加面向对象的编程方法
  • Go-Style,不是对ffmpeg API 的简单封装,而是以更加go的形式进行封装
  • 更简单的垃圾回收

其中第二点和第三点是我最欣赏这个库的主要原因,相比与其他ffmpeg库的直接封装,go-libav库加入了更多的语言易用性的思考。但是,目前这个库还在持续的开发中,还存在下面几个问题:

  • 支持的库有限,目前只有avcodec avfilter avformat avutil这四个库的一些基础API
  • 缺少样例,若没有使用ffmpeg API的经验,上手较难
  • 单元测试覆盖率只有32%,有可能测试不充分

我们近期已经为avutil扩展了一些功能,正在添加examples和单元测试,后续会提Merge Request反馈到这个库。在使用这个库的过程中,我们踩了一些cgo的坑,在这里总结一下cgo的使用方法和注意问题。

......