std::vector<std::shared_ptr<XXX> > 初始化的坑

现在写 C++ 用智能指针基本是习惯了,不过今天遇到一个细节处的错误:

std::vector<std::shared_ptr<A> > a_vec(n, std::make_shared<A>());

本意是初始化了一个元素都是智能指针对象的数组,看起来很美好,实际上这个数组里所有元素都指向了同一个实例。看一下 C++ 文档上的参数说明:

val
Value to fill the container with. Each of the n elements in the container will be initialized to a copy of this value. Member type value_type is the type of the elements in the container, defined in vector as an alias of its first template parameter (T).

vector 所有成员用 val 的拷贝来初始化,智能指针的拷贝嘛,还是指向同一个实例。

正确的初始化方式:

std::vector<std::shared_ptr<A> > a_vec(n);
std::for_each(std::begin(a_vec), std::end(a_vec), [](std::shared_ptr<A> &ptr) {
  ptr = std::make_shared<A>();
});

C++ 更新动态库后强制转换基类指针遇到的坑

这两天被一个 bug 折磨得不轻,发新版本更新了 caffe-output 动态库,结果发现某一 layer 中一个参数读出来是随机数,模型预测结果总是不对。最后一点一点找 diff,发现是发布时打包的 caffe 动态库有错误,新版本 caffe 基类 layer 增加了这个参数作为成员变量,而老版本 caffe 动态库中没有这个成员变量。

直接看下面的例子吧=_=_

More

美签小记

最近公司一些业务要派人去美国分公司出差半个月,虽然没准备派我去,不过作为刚入职半年的壮丁,难免以后要去当苦力,还是让我先去办理一下。

读本科的时候总想着去美帝读书,后来因为各种原因打消了念头,没想到工作没多久竟然要去办理美帝的签证,真是造化弄人。

问了下同事,办理的是 B1/B2 商务签证,大部分人都是一年签证,每年都要去办一次,还有种是十年签证,拿到的人比较少。

按照公司提供的流程准备了材料,提交给中美商会,然后等着去面签就可以了。

面签之前要准备好的材料有:

  • 护照
  • 蓝色面试预约单
  • 预约确认单
  • DS-160 确认页
  • 照片
  • 签证申请费收据
  • 邀请信(公司提供)
  • 在职证明
  • 英文简历

这里说下 DS-160 ,这表格真的够长,同事告诉我说一定要认真填,有些时候 DS-160 填写情况就决定了你这次签证成功与否。还有就是照片要是白色背景、不能戴眼镜。

面签当天,没想到人非常多,我预约的是9点半,最后排队到11点才轮到我。英语口语一直不太好,有点紧张,前一天晚上还找了些面签的对话材料练习了下,我前面的小哥用英文和签证官(一个白人小哥)扯了半天,好像签证官还是不太满意,小哥还来了句“我是英文专业的” Orz 。到我了,我刚想开口用英文说明申请理由,小哥用非常不标准的普通话问我:“你为什么要去美国?”(请自行脑补音调),我愣了一下没说话,他又重新问了一遍,我才反应过来,用中文回答道:“公司派我去的。”完了就让我递给他邀请信和 DS-160 确认页。我还再想等下会问到什么英文问题,结果小哥对我微笑着说:“你通过了,可以走了。”啥?这也太顺利了吧,我很怀疑😂

过两天查了下邮件,真的过了,还是 10 年签。。。总有种今年人品用光了的感觉。。。

WebGL初探

Coursera 上最近新开了一门课 Interactive Computer Graphics with WebGL,通过 WebGL 来介绍计算机图形学。

从本科时学习 OpenGL 1.x ,到研一重新学习 OpenGL 3.x 之后基于 shader 的方法,OpenGL 也算是我的一位老朋友了。现在 Web 开发热火朝天,桌面应用 Web 化早已成为趋势,我正好借着这门课学习下 WebGL,同时也了解一下网络前端开发。


OpenGL

OpenGL = Open Graphics Library,是图形硬件的一种标准软件接口,其最初由 SGI 创建,用于在不同硬件体系结构的图形设备上进行二维和三维图形的绘制。OpenGL 不是一种编程语言,也不是 OpenCV 之类的算法工具库,而是一个图形显示标准 API 集合。


Modern OpenGL

学习过 OpenGL 1.x 和 2.x 的朋友应该对 glBegin()glVertex()glEnd() 印象深刻,使用这种方式绘制属于“立即模式”(immediate mode),每次顶点被创建后都会由 CPU 发送给 GPU 进行绘制,从而造成了 CPU 和 GPU 之间的性能瓶颈。

立即模式在 OpenGL 3.1 及之后的版本已经被移除,Modern OpenGL 是基于 Shader 来进行图形的绘制的,即所有绘制工作都应由 GPU 负责,CPU 仅仅负责将要绘制的数据传送给 GPU。

Shader(着色器) 也是一种程序,其使用 GLSL(GL Shading Language) 编写,分为顶点着色器(vertex shader)和片段着色器(fragment shader),前者处理顶点相关的属性,后者处理像素点相关的属性。着色器在程序运行时进行编译。

Modern OpenGL 通过“保留模式”(retained mode) 进行图形绘制:将所有顶点数据放在一个数组中,将该数组发送给 GPU ,通过 shaders 完成绘制。


WebGL

WebGL 是 OpenGL ES 2.0 的 JavaScript 实现,是面向浏览器的 OpenGL。WebGL 可以与 HTML5、CSS 结合使用,借助本地系统显卡在浏览器中构建和显示三维场景与模型。

WebGL 使用 JavaScript 作为编程语言,尽管有一些问题和局限性,但能在浏览器轻松构建三维图形程序仍是一件很酷的事!


More

使用 OpenCV 裁剪 PDF 页面

网上找到的一些课件讲义等资料有时候会是 PPT 多页打印而成的 PDF 文件,比如下图这种:

slides in pdf

有些人希望对 PDF 页面进行裁剪,将 PDF 还原为原 slides 那样一页一张演示文稿的形式。(其实我个人觉得没什么必要,因为不影响阅读,而且 PDF 格式读起来还不用频繁翻页了。)

前几天,我在知乎上看到了有这样需求的一个问题。 当时想到用 Python 和 OpenCV 来做这样的图像处理小任务应该很简单的吧。于是动手撸了段代码,简单的 “边缘检测+轮廓提取”,最后结果看起来还不错:

pdf cropped results

下面给出 Python 代码并简单解释下。

More

C++ 中的 lambda 表达式

lambda 表达式是函数式编程语言中一个很 cool 的特性,而 C++11 标准加入了对 lambda 表达式的支持。本篇文章对 C++11 中的 lambda 表达式做一个简单的介绍。



什么是 lambda 表达式

说到 lambda expression 就不能不提 lambda calculus,前者是从后者中衍生出的概念,lambda calculus 有着严格的数学定义,与图灵机有着等价的计算能力。这里只介绍编程语言中的 lambda 表达式概念。

在函数式编程语言中,函数是一等公民。有时我们需要一个函数,但又不想要定义一个具有名字的函数,即我们需要一个匿名函数,而一个 lambda 表达式实际上就是通过表达式的方式定义了一个匿名函数。

More

旋转矩阵与四元数

在计算机图形学的学习中,几何变换(Transformations)是一块重要的内容,我们使用齐次坐标(Homogeneous coordinates)描述点和向量,使用变换矩阵描述平移、旋转等变换。

而在平移、旋转、缩放这几种变换中,又以旋转的情况最为复杂。实际上,计算机图形学中三维空间的旋转不仅仅有旋转矩阵一种表达形式,欧拉角(Euler angles)和四元数(Quaternions)也是常用的方法。

More

Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.9 + VS2013 + Win8(x86)

OS为Windows 8 32位,VS2013已安装并可以正常使用。

一. 安装和配置Kinect for Windows SDK v1.8

官方网站下载Kinect for Windows SDKDeveloper Toolkit

KinectSDK-v1.8-Setup.exe (主要提供Kinect的驱动和设备访问接口)

KinectDeveloperToolkit-v1.8.0-Setup.exe (主要提供一些有助于开发的工具,包括Kinect Studio和多种编程语言的开发例程等)

More