菜菜博士

博士在网络的家

UDP and congestion control

TCP is good, good for nearly everything. It’s a general purpose abstraction for networking applications. But TCP is bad for one thing: it’s general. If you have some special need, setsockopt(2) can...

ASIO 腾空出世 (那些年我们追过的网络库.PartII)

这是上篇 那些年我们追过的网络库(PartI) 的后续, ASIO 腾空出世 在地球最大的岛上,另一位少年开始拜读 ACE 的大作。那时候,没有 libuv 没有 libev 更没有 libevent . 有的只是 ACE. 然而这个南方小国的少年没有跟风陷入 ACE 崇拜,他以敏锐的目光察觉到了 ACE 的弊病。 ACE 哪里做的不好?又哪里是值得借鉴的? 少年在给 c++ ...

那些年我们追过的网络库(PartI)

#为什么要用 C++ 编写服务端程序? 如果说答案是性能,那么肯定有人会满不在乎。觉得性能不够的话, 只要加机器就可以了。 然而更少的机器,意味着更低的能耗,更少的硬件投入,更少的人力资源投入去维护机器。总而言之,更低的成本。 肯定会有人说,C++的开发速度太慢了。然而这并不是绝对的。C++也可以做到非常快速的开发。有句俗语 * “脚本一时爽,重构火葬场” * 说的正是脚本语言开发的项目进...

自我意识和物质

现代的科学认为物质是不生不灭的. 至少在宇宙的寿命内是这样. 物质的诞生意味着宇宙的开端, 物质的消失意味着宇宙的灭亡. 在宇宙中, 意识并没有特殊的地位. 它不过是地球40亿年进化史的一个副产品. 真的是这样的吗? 我始终坚信的一个宇宙真理就是, 万物平等. 伽利略给了运动和静止一个平等的地位. 爱因斯坦给了所有惯性参考系平等的地位. 物理学的发展, 就是不断的消除特例, 不断的将原本...

GLSL加速 YUV 显示

通常来说,视频都是使用 YUV 格式编码的。YUV 最符合人眼的结构,因为人眼对亮度要比对颜色敏感的多。 YUV 将颜色分成一个 亮度信号和2个色差信号。于是就可以使用更多的bit数去编码亮度信号。在同样的每像素比特位数下,YUV 能比 RGB 保留更多的信息。 But YUV 要在 PC 屏幕上显示,不那么友好。需要转成 RGB 格式。网上一搜一大把,这里就不贴转换公式了。 将YUV转...

ubuntu 太反人类了

ubuntu 这个烂东西, 我本来不打算吐槽的, 反正烂东西我不触碰就是了. 但是啊, 烂东西呢, 你不过去招惹它, 它还是会过来招惹你, 不管你愿意还是不愿意. ubuntu 为啥烂 ? 怎么招惹我了? 因为咱用了 travis-ci . travis-ci 是个好东西啊, 每次你 git push , 它就默默的帮你编译一遍代码. 哪个 commit 没编译过, 一目了然. 问题...

也说 jitter

搞数字音频的,经常会提到 jitter。 什么是 jitter ? jitter 就是时钟的随机抖动。这个抖动啊,来自量子世界,是无法消除的,否则海森堡大人要从棺材里跳出来了。 jitter 只能减少,不能削除。 那么 jitter 对音频有啥影响呢? jitter 主要影响就是,经过 DAC 重建模拟信号的时候,时钟的不稳定导致重建信号偏离原来的位置。结果上看就是波形不再符合...

更高采样率,更低成本

在继续本文之前,容我提出一个摩尔定律的推论: 离摩尔定律越近,发展越快,成本越低;反之,离摩尔定律越远,发展就越缓慢,成本也难以下降。 [待续]

超线程, 优先级和调度策略

这是 ck 的一篇文章,原始链接在此 (SMT/Hyperthreading, nice and scheduling policies)[http://ck-hack.blogspot.com/2014/08/smthyperthreading-nice-and-scheduling.html]

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

键盘问题 去年买了一个机械键盘。不过一直有一个困扰我的问题,就是键盘插入 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) { ...