关于dynamic_cast


有时候,项目需求紧,时间少,写代码往往就抓起什么用什么,比较少考虑设计的合理性。dynamic_cast就是一例。

dynamic_cast一般用于down cast,即将父类的指针(或引用)转换成子类的指针(或引用),并提供了运行时的类型检查(RTTI功能),转换失败时,会返回一个nullptr(引用则抛出bad cast异常)。

慎用unsigned int减法


最近在做一个缓存的清理策略时,遇到了一个诡异的bug。

缓存每次命中,都会更新一个时间戳;然后定期清理的时候,用当前时间now减去缓存的时间戳,如果差值大于7天,则清理掉这个缓存项。

1
2
3
4
5
uint32_t now = time();
... // Some other code
if (now - hash_elem.timestamp > expire_interval) {
erase(hash_elem);
}

面试造核弹,工作拧螺丝?


最近在工作中遇到这么一个问题。

一个使用机器学习算法的框架,在特征处理模块,往往需要对原始特征进行特征交叉。对于简单的单值特征来说,只需要将需要交叉的特征组合起来即可;但是对于多值特征之间的交叉,则需要穷举多值特征每一个值的组合。例如,如果一个包含2个值的特征和一个包含3个值的特征组合,那么将会产生出6个组合。

一般的,我们可以把这些多值特征描述为

1
vector<vector<Feature>>

那么给定这样的一个数据结构,如何输出所有的特征组合呢?

crontab为何自动中断


在最近开发的一个系统中,有一个定时任务,每天需要将一份数据(大约200w条),发送至一个线上key-value存储系统中。

说到定时任务,最常见的,就是使用crontab。原来这一套系统已经开发完成,部署在深圳IDC,工作良好。最近,需要在天津IDC也部署一套。但是在天津部署之后,我却发现,天津的这套系统每天只能定时发送48999条数据(准确数字),然后就自动停止了。

ProtoBuf中的反射


同时写Python和C++的程序员,往往会觉得C++写起来很累。(所谓“累守恒定律”: 程序执行时的累 + 程序员写代码时的累 = 恒定的累^_^)

在处理ProtoBuf Message数据时,经常会有这样的需求,根据一个输入的字符串,找到Message中对应属性的取值;或者根据输入的字符串和一个值,设置Message中对应属性的取值。

这种需求放在Python中,往往直接通过getattr/setattr就能一步搞定。但是在C++中,我们不得不借助于ProtoBuf的反射机制。

这里,需要介绍如下几个概念:

《反脆弱》读后


《反脆弱》这本书可能大家不知道,但是说起其作者塔勒布的另一本畅销书《黑天鹅》,可能知道的人就会更多一些。虽然这本书更多的是出现在一些“理财投资必读书单”之类的地方,但是我读过之后觉得,很难把这本书单独的归入经济、心理学或投资学任何一个单独的门类中。

这是一本讲价值观的书。

说到价值观,大家可能会觉得比较务虚;但是,其实我们在生活中的每一次选择、每一个行动,都是内在价值观的外在体现:选择哪一份工作,哪一种生活方式甚至周末选择哪一部电影,都能一窥不同人的价值观之不同。

那么,这本书的价值观是怎样的呢?

线程数与多核CPU的关系


多线程程序大家都在写,那多核CPU的服务器上,线程数开多少个比较合适,你知道吗?

这里,首先要厘清CPU数、核数、processor数这么几个概念。

比如,使用top查看负载时,按1,看到的CPU0~CPUn,这里的数量其实是processor数。

我看语言之争


我不是一个语言原教旨主义者,但是不得不承认,“语言鄙视链”这东西确实存在。一般来说,强类型鄙视弱类型的,编译型的鄙视解释型的,分布式的鄙视单机的,函数式的鄙视面向对象的鄙视过程式的……不过最近某P语言借助人工智能东风,有从鄙视链底端逆袭的趋势。

踩坑记:临界区内要小心


这周对一个服务进行了升级,结果踩了一个不大不小的坑。

先介绍下这个服务的背景:

这是一个数据接收的服务,通过http协议接收到json数据之后进行解析,然后落地到本地文件;
之后再由其他服务读取这些文件,进行后续的处理。

再谈右值引用与移动语义


之前在总结C++11新特性的时候,写过一篇文章,专门说到了右值引用、移动语义以及从中牵扯出来的引用折叠和完美转发等概念《C++11新特性之右值引用与移动》

那篇文章例子很多,仔细阅读后也可以完全理解这几个概念。但是今天我想重新组织下语言,就像面试中被问到“你怎么看待C++中的右值引用和移动语义”,进行一次小总结。当然,如果你最近也正好需要面试,下面的文字可能能帮你梳理一遍思路。