一文说清文本编码那些事

2020-03-01 15:02 Python

一直以来,编码问题像幽灵一般,不少开发人员都受过它的困扰。

试想你请求一个数据,却得到一堆乱码,丈二和尚摸不着头脑。 有同事质疑你的数据是乱码,虽然你很确定传了 UTF-8 ,但无法自证清白,更别说帮同事 debug 了。

有时,靠着百度和一手瞎调的手艺,乱码也能解决。 尽管如此,还是很羡慕那些骨灰级程序员。 为什么他们每次都能犀利地指出问题,并快速修复呢? 原因在于,他们早就把编码问题背后的各种来龙去脉搞清楚了。

本文从 ASCII 码说起,带你扒一扒编码背后那些事。 相信搞清编码的原理后,你将不再畏惧任何编码问题,彻底与乱码说拜拜。

从 ASCII 码说起

现代计算机技术从英文国家兴起,最先遇到的也是英文文本。 英文文本一般由 26 个字母、 10 个数字以及若干符号组成,总数也不过 100 左右。

计算机中最基本的存储单位为 字节 ( byte ),由 8 个比特位( bit )组成 …


阅读全文

QUIC

2019-09-23 09:51 网络

QUIC ,即 快速UDP网络连接 ( Quick UDP Internet Connections ), 是由 Google 提出的 实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决 TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。

QUIC 主要特点有:

  • 多流设计;
  • 低等待延迟;
  • 加密性能更优;
  • 前向纠错;
  • 应用程序实现;
  • 连接保持;

多流设计

采用 多路复用 思想,一个连接可以同时承载多个 ( stream ),同时发起多个请求。 请求间完全 独立 ,某个请求阻塞甚至报文出错均不影响其他请求。

对比 HTTP 长连接,由于 TCP 是只实现一个字节流,如果请求阻塞 …


阅读全文

内核参数管理

2019-02-12 19:40 Linux

Linux 内核有很多可以定制化的参数—— 内核参数 ( kernel parameters ), 斟酌设置内核参数对 系统调优 意义重大。 内核参数 涵盖内核的方方面面,包括 网络 ( net )、 文件系统 ( fs )等等。 本文以 fs.file-max 参数为例,介绍设置内核参数的几种不同方式。

procfs

Linux 内核通过 procfs 伪文件系统暴露 内核参数 的访问接口, 通过 procfs 接口,用户可 设置 或者 查看 指定内核参数。 内核参数位于 /proc/sys 目录下,以 fs.file-max 参数为例,路径为 /proc/sys/fs/file-max

查看参数只需读取对应文件内容 …


阅读全文

内核模块开发

2018-10-29 21:28 Linux

Linux 内核管理着计算机的所有资源,为上层应用程序提供统一的编程接口( 系统调用 ),屏蔽底层设备的差异。 由于不同用户物理设备以及对内核功能需求的差异性,需要一种类似插件的运行机制——编写插件实现所需功能,然后嵌入到内核中,与内核形成一个整体。

Linux内核模块 便是这样的插件。 作为 Linux 内核的扩展手段,可以在运行时动态加载和卸载。 那么,一个内核模块是怎么编写的呢?与普通程序编写有什么区别呢?

程序开发经常以 hello world 程序入门,因为这是最简单的。 本文也通过一个最简单的内核模块,演示如何一步步编写一个内核模块。

结构

内核模块与普通程序不同,没有执行流。 可以这样理解,内核模块实现一些函数,作为回调函数注册到内核中。 在内核加载/卸载时,或者其他应用程序调用系统调用时,注册的回调函数才得到调用。

有两个最基本的回调函数 initexit ,分别由 module_initmodule_exit 登记,分别在模块加载和卸载的时候执行。 下面实现的 hello world 内核模块 …


阅读全文

用 Python 读写 Excel 表格

2018-10-15 20:44 Python

Python 可以读写 Excel 表格吗?

当然可以。 Python 下有很多类库可以做到, openpyxl 就是其中的佼佼者。

openpyxl设计非常漂亮 ,你一定会喜欢它!不信请往下看:

工作簿

开始 openpyxl 前,无需提前建好工作簿( Workbook )。 只需导入 Workbook 类,便可在内存中创建新工作簿并开始操作:

>>> from openpyxl import Workbook
>>> wb = Workbook()

新建的工作簿默认预先建好一个工作表,通过 active 属性即可获取:

>>> ws = wb.active

Note

如果工作簿包含多个工作表,该属性将返回第一个。

通过 create_sheet 方法,可以创建新的工作表。 创建可以是在后面追加:

>>> ws1 = wb.create_sheet('Mysheet')

或者 …


阅读全文

系统调用原理

2018-07-10 09:57 Linux

操作系统通过系统调用为运行于其上的进程提供服务。

当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求,例如操作文件、进行网络通讯或者申请内存资源等。

举一个最简单的例子,应用进程需要输出一行文字,需要调用 write 这个系统调用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char *msg = "Hello, world!\n";
    write(1, msg, strlen(msg));

    return 0;
}

Note …


阅读全文

Python装饰器高级用法

2017-12-23 14:03 Python

Python 中, 装饰器 一般用来修饰函数,实现公共功能,达到代码复用的目的。 在函数定义前加上 @xxxx ,然后函数就注入了某些功能,很神奇! 然而,这只是 语法糖 而已,起决定性作用的其实是 闭包

场景

假设,有一些工作函数,用来对数据做不同的处理:

def work_bar(data):
    pass

def work_foo(data):
    pass

我们想在函数调用前后输出日志,怎么办?

傻瓜解法

logging.info('begin call work_bar')
work_bar(1)
logging.info('call work_bar done')

如果有多处代码调用呢?想想就怕!

函数包装

傻瓜解法无非是有太多代码冗余,每次函数调用都要写一遍 logging …


阅读全文