Python 可以通过 os.system 来以控制台的形式运行程序,但当涉及到需要进行进程间通信时,就需要用到 subprocess 模块。本文原来是和multiprocessing作为一个整体来介绍的,后来进行了拆分,但内容仍然会有所重叠,并且会涉及 Python 的线程和进程相关机制。
Python2字符编码
字符编码
我们通常见到的字符串编码主要是三种GB2312/GBK、Unicode、UTF-8。GB2312/GBK是多字节(multibytes)编码的一种,属于“ASCII的加强版”,与之平行的由Big5、ShiftJIS之类的编码各自为政,所有这些用两个字节表示汉字的多字节编码标准统称为ANSI编码,同样的汉字在不同的ASNI编码中的表示是不同的。为了避免这个问题,Unicode应运而生,将全世界所有的字符统一编码到一个定长的结构中。Unicode解决了统一编码的问题,但带来了新的问题。第一点,Unicode和ASCII不兼容了,这是因为ASCII只有一个字节,而这一个字节肯定装不下Unicode。第二点,用Unicode传输开销变大了,这是因为很多文档二十六个字母(1个字节)就能解决了,用Unicode多了很多冗余的字节。因此UTF-8应运而生。UTF-8对Unicode进行变长编码(我们可以想象下Huffman树),通常长度在1-4字节。目前Linux系统使用的是UTF-8编码,而Windows内部则是UTF-16LE/GBK编码。
Google Kickstart 2018 Round B题解
继续写第二轮
Google Kickstart 2018 Round A题解
Kickstart,我又回来了,今年是校招年了,所以加油吧。
常用语言的时间模块
在相当长的时间里面,与时间相关的库我总是很不熟练,每次用到总要卡一下,慢慢 Google,这次索性直接记下来,这样下次遇到我就可以查自己的博客而不是Google了。
【反正我是不会记在脑子里面的是吧】
gRPC配置与用法
本文中介绍了如何配置gRPC和brpc。
C++智能指针的使用与实现
在C++史前时代只有一种智能指针std::auto_ptr<T>,它的作用方式类似一个lock_guard<T>,或者经过封装的RAII。但在使用中发现,依托于RAII是不够的,为了方便地实现更复杂逻辑下的资源管理,我们需要从资源的所有权上对智能指针进行更加细致的分类。在C++11之后,标准库引入了std::shared_ptr<T>、std::unique_ptr<T>、std::weak_ptr<T>来替换之前的std::auto_ptr<T>。
截至目前为止,我基本没怎么用过智能指针,一方面之前做的项目都比较局限,使用RAII或者对象池会更方便,另一方面智能指针和对C风格的兼容性也不是很好,例如很多C风格的代码要求bit-wise而不是member-wise的操作,而智能指针并不是trivial的,而且具有传染性,所以往往适用不了。
【未完待续】
C++历史标准的发展及常见的Workaround和最佳实践
C++历史概述
C++是一门历史悠久的语言,原来叫C with classes,自1979年以来已经出现了98/03/11/14/17五个标准,因此C++中的Workaround和Best practice是随着标准演化而推进的。因此这里首先概览一下C++从开始设计以来的特性的引入、废止与更新的过程,以及对C++11及以后引入的重要特性的一些论述。
csapp data lab
csapp中的lab非常出名,在这篇文章中我主要记载第一部分,也就是data lab的解法。所有lab的源码在我的Github上。在知乎的一篇文章中记录了一些和二进制处理相关的内容,我觉得也是非常好的学习材料
B树

B树的设计目的是减少磁盘存取,而不是诸如BST、RBT、AVL一样试图减少比较次数。根据局部性原理,当一个数据被访问时,那么它附近的数据很大概率会马上被访问,因此我们可以一同将其加载。这个原理常常被用在存取速度不同的两个设备间,如寄存器与主存(多级缓存)以及数据库系统中出现的磁盘与内存的情况。B树相对于一般的平衡BST的特点是高度低、出度大、节点大。一个高度低的树能有效减少检索磁盘的次数。一个具有较大的分支因子的树可以减少$k*log(n)$的常数$k$,其中$n$是总关键字数,也能减少磁盘存取。特别地,B树的节点设计不仅要考虑到容纳尽可能多的节点,也要同时考虑到从磁盘加载的便利性。