菜菜博士

博士在网络的家

使用自己硬件的时候写的两个补丁

键盘问题 去年买了一个机械键盘。不过一直有一个困扰我的问题,就是键盘插入 USB 口后,会等待 10s 左右的时间,然后才识别。查看 dmesg 输出会看到有什么 Timeout 的。 后来发现是硬件 bug。而这种硬件 bug 是可以被内核 work-arround 的。 具体的来说就是,一个 USB-HID 插入的时候,内核会询问设备的一些特性,比如说是否支持多点触控之类的。 但是我这...

avbot 10.4 发布

对于不知道 avbot 是神码的同学,猛击这里 avbot 不知不觉都已经经历一年有余的开发啦。 10.4 版本应该是一个里程碑式稳定版本。呵呵。 更新还是挺多的。 avbot 的验证码识别功能详情请参考项目 wiki 下面是 Changelog — 10.4 * 更新了内置的 gloox 库。 10.3 * 添加了 systemd 支持 10.2 * 添加了 libZM...

avbot 里的回调

asio 这样的库,每次发起一个操作,就带一个回调.回调告诉你,神马时候操作完成了,完成的咋样. 在所有被主动调用的接口处, avbot 基本上都遵循了 asio 的这一设计准则:提供回调完成事件通知. 但是,还有另一种回调:这个回调并不是因为你主动调用了某个接口,而是因为,这是框架的一部分. 你不用调用框架,框架会来调用你. 在被框架调用的地方,如果阻塞了,势必会导致框架内...

读博客园的创业历史

前些日子,看到微博上传说,博客园的真爱是阿里云。说他们在阿里云平台上走了一次又一次的弯路,当了一次又一次的小白。但是,阿里虐他千百遍,他待阿里如初恋。 顿时觉得有趣,于是去看了博客园解决云计算之路上的一个又一个坑。 开始是抱着围观群众看热闹的心态去看的,看来他们一年多踩的无数个坑,每次踩坑还都去研究源码去找解决办法,顿时觉得,这个团队其实是一个脚踏实地的人在领导。 没有那种浮躁的氛围,肯...

纯真数据库下载或自动更新实现

用过珊瑚虫的童鞋都知道, 有个叫 “纯真数据库” 的东西, 可以查询 ip 地址对应的物理地址. 纯真数据库是有个名为 QQWry,DAT 的二进制文件, 可以通过纯真数据库自己提供的查询程序进行更新. 有关该数据库格式和解析的内容, 本帖子暂时不讲, 有机会的话, 偶会另行开个新帖子讲讲. 这里讲的是, 不通过官方的查询程序, 如何获取到这个数据库. 通过对官方程序进行抓包, 得出下...

聊聊 type erasure

什么是类型橡皮擦? type eraer是什么? 为什么这么有用? 到底它是如何帮助你构建灵活强大的软件的? 我们知道 C++ 是一个强类型的语言。 不同类型之间有天壤之别 ,不能任意转化——函数有签名,只有符合类型检查才能调用。 类型稍微有点不匹配,那带来的是一堆堆编译错误。 然后很多时候,我们会想,C++的类型能不要那么强就好了!比如说设计一个回调函数 ,这回调函数非得是那个类型的...

it is hopeless in china

I just Hate CHINA !

折腾了一下GPG和智能卡

GPG支持使用智能卡设备存储密钥。 使用文件系统来携带密钥( 不管是存到 家目录里还是放到U盘里携带)的弊端有很多 1. 文件泄漏密钥即泄漏 2. 不能保证密钥的物理唯一性 3. 文件可以被拷贝,文件可以被任意读取 4. 无法知道文件是否被拷贝,不能发觉 而使用智能卡设备,好处很多 1. 密钥具有物理唯一性,一旦生成即无法读取,即无法制作拷贝 2. 密钥可以由卡上的CPU生成,更能保...

折腾了一下 PC HIFI

最近家里闲置了一对老音箱。很大很重的老音箱。年纪有个十几年了吧。但是以前是很贵的东西。虽然现在音箱很便宜(但是便宜了,音质差了呀),但是我没舍得扔掉。在我眼里古董音箱很值钱! 于是我想个办法想废物利用。音箱有了,缺一个功放。 我第一个找到的功放,是基于 TD2024 芯片的数字功放。主要是图个便宜,不到 50 块钱就能有一个。 至于什么是数字功放,我恶补了一下功放方面的知识。 功放分 ...

对未来编译器的意淫

典型的 C++ 编译过程分 “预处理” “编译” “链接” 编译, 是最耗时的环节, 编译需要编译器解析 C++ 语法, 构建 AST (抽象语法树), 解析完成后, C++ 的重任才刚刚开始. 对于 C 来说, C 解析成语法树后可以立即开始生成目标代码. 但是 C++ 不能. 最耗时的步骤才刚刚开始. C++ 要在 AST 上执行 模板展开, 重载判决. 特别是 模板展开, 这可是一次...

让 C 回调支持 boost::bind

C++ 的 bind 非常方便! 但是如果你不得不处理一些 C 接口, 情况就会变得很糟糕, 你不得不处理一堆的 void* , 不能使用 bind ! 有神码办法可以解决这个问题呢!? 答案就是 接下来介绍的模板技术 c_func_wraper ! 用法很简单, 看下面的例子 static void * my_thread_func(int a, int b, int c) { ...

avbot 7.1 发布

对于不知道 avbot 是神码的同学,猛击这里 紧急更新, TX 于 8 月 1 日晚上修改了登录协议, 导致  avbot 全线瘫痪。所有的用户必须升级!必须升级! 7.1 新增了慧眼答题平台支持。urlpreview 功能可以定义黑名单, 不对指定的url进行响应. 用法就是在 qqlog 目录下建立 blockurls.txt 文件,写入不希望avbot解析的正则表达式。 avb...

GC是错误的内存管理模式

只要写程序, 就免不了要和各种资源打交道, 其中最频繁的莫过于内存了. 任何一个程序都需要内存管理. 它不管是简单的还是复杂的, C 语言的还是 java 语言的. 所不一样的是, 内存管理的细节掌握在谁的手里. 对于 C 语言, 毫无疑问的, 程序员掌握所有细节. 程序员获得了最大的灵活性, 作为代价, 编译器不对任何内存管理上的疏忽负责. 而人是 最容易犯错 的生物. 意味着, 程...

C++ 闭包 探秘

我经常说协程, 说协程的时候又经常会提到闭包. 还有我常说, boost::bind 是神器 归根结底, 神的是 “闭包” 没有闭包, 就无法实现 asio 协程 (注意, 我说的是 ASIO的协程, 并不是通常意义上 setjmp/longjmp 或者 CreateFiber 又或者 boost.context 创建的协程) 每次使用 bind , 你就创建了一个闭包. 简单的来...

我为什么喜欢用协程

查看过 avbot 代码的人都知道, avbot 到处都是协程. 用句 ACG 的话来说, 博士是协程控 那么, 为啥我会那么喜欢使用协程呢? 答案是协程大大简化了编程, 尤其是内存管理. 协程简化了内存管理 写过异步程序的人都知道, 编写异步代码最容易犯的错就是内存泄露了. asio的无栈协程通过 闭包 的形式, 将异步过程所要操作的资源绑定到 闭包 上, 并使用 shared_...

avbot 的一些技术决定

avbot 早已实现最初的目标 : 提供一个机器把 IRC/XMPP和 QQ群联合起来. 让不使用QQ的人和只使用QQ的人都恩嗯畅快的交流. 现在该歇息片刻, 回顾一下这一段历程, 以及编写avbot的时候所做的一些技术决定了. Boost.Asio 为什么 avbot 会使用 Boost 进行开发呢? Boost 有什么 好处? Asio 是干嘛的? 我觉得对于 Asio, Jac...

avbot 7.0-rc1 发布

对于不知道 avbot 是神码的同学,猛击这里 就像博士说的, 不开发验证码解决方案不升级版本号, 这次主版本好不到一个月就被提升了, 咋回事呢? avbot 7.0 系列发布预览版发布 了,同时发布的还有 rpm 包 和 windows 包 avbot 7.0 添加了很多功能, 最重要的莫过于支持了验证码识别! avbot 的验证码识别功能详情请参考项目 wiki 下面是 C...

avplayer 维基站点建立

avplayer 社区的维基站点建立了, 欢迎大家访问 http://wiki.avplayer.org 目前 avplayer 的维基站点开发免注册编辑权限. 大家可以把 avplayer 社区项目的一些心得分享进行编辑. 比如在 windows 上如何编译 avbot, 希望辛苦解决的人能给后来人以提示.

avbot 6.1 发布

对于不知道 avbot 是神码的同学,猛击这里 avbot 前不久悄悄迎来了半周岁的生日. 因此 avbot 也进入了 6.X 开发周期. avbot 6.0 系列第2个版本 6.1 发布了,同时发布的还有 rpm 包 和 windows 包 avbot 6.1 发布, 添加了股票报价功能, 另外也对 WebQQ 协议进行了更新. 下面是 Changelog — 6.1 * ...

avbot 5.1 发布

对于不知道 avbot 是神码的同学,猛击这里 avbot 5.0 系列开始了. avbot 5.0 系列第3个版本 5.1 发布了,同时发布的还有 rpm 包 和 windows 包 avbot 的版本规则是, 每月提升一个大版本号, 因为是开发 avbot 的第 6 个月了, 所以大版本号提升到 5 了. avbot 5.1 发布, 修复了一个非常严重,困扰了我们很久的一个 1...