GDB调试Python代码

Core Dump文件 凡事皆有两面性,OS在出Core的同时,虽然会终止掉当前进程,但是也会保留下第一手的现场数据,OS仿佛是一架被按下快门的相机,而照片就是产出的Core文件。里面含有当进程被终止时内存、CPU寄存器等信息,可以供后续开发人员进行调试。 Gdb可以附着在特定进程上调试,但是为了不影响运行中的进程,可以通过生成 core file 的方式来保存进程的当前信息。 ...

2020-10-16 · 2 分钟 · 946 字 · Niuhe

Python进阶下

有两种常用的方法可以使得代码并行执行,多线程和多进程 。因为Cython解释器的实现不是线程安全的,具有GIL锁,同一时刻,只有一个线程可以获得解释器的锁。因此,Python利用多核心的CPU只能通过多进程,而多线程只适用于IO密集型的程序。 多进程基础 创建并开启进程 可以使用multiprocessing.Process()来创建进程,它接受两个参数: ...

2020-10-13 · 5 分钟 · 2417 字 · Niuhe

Python进阶中

生成器Generator def countdown(num): print('Starting') while num > 0: yield num num -= 1 # this will not print 'Starting' cd = countdown(3) # this will print 'Starting' and the first value print(next(cd)) # will print the next values print(next(cd)) print(next(cd)) # this will raise a StopIteration print(next(cd)) 迭代器使用方式 # you can iterate over a generator object with a for in loop cd = countdown(3) for x in cd: print(x) # you can use it for functions that take iterables as input cd = countdown(3) sum_cd = sum(cd) print(sum_cd) cd = countdown(3) sorted_cd = sorted(cd) print(sorted_cd) 生成器表达式 # generator expression mygenerator = (i for i in range(1000) if i % 2 == 0) print(sys.getsizeof(mygenerator), "bytes") # list comprehension mylist = [i for i in range(1000) if i % 2 == 0] print(sys.getsizeof(mylist), "bytes") # 120bytes # 4272 bytes 生成器概念 类可以实现生成器作为一个可迭代对象,它需要实现__iter__方法和__next__方法,使得类对象可迭代。此外,还需要注意记录迭代次数,以及最后raise一个StopIteration异常。 ...

2020-10-12 · 8 分钟 · 3535 字 · Niuhe

Ubuntu20_04上使用ibus中文输入法

Ubuntn 上一直以来对中文输入法的支持都不是很完善,在升级到 20.04 版本之后,系统默认自带的是 ibus 输入法,刚刚上手使用之后不是很好用。在尝试安装 fcitx 和搜狗输入法之后,因为搜狗输入法和 Pycharm 等 IDE 冲突,会导致软件卡死,而且资源占用较高。还是切换回了 ibus 输入法。 在简单调教之后,发现 ibus 还是很好用的。 打开 Ibus 首选项 ...

2020-10-11 · 1 分钟 · 277 字 · Niuhe

正则表达式基本使用

基础 1.1 字符匹配 字符 说明 \ 转义符 \d [0-9]。表示是一位数字。 \D [^0-9]。表示除数字外的任意字符。 \w [0-9a-zA-Z_]。表示数字、大小写字母和下划线。 \W [^0-9a-za-z_]。非单词字符。 \s [\t\v\n\r\f]。表示空白符,包括空格、水平制表符、 垂直制表符、换行符、回车符、换页符。 \S [^\t\v\n\r\f]。非空白符。 . [^\n\r\u2028\u2029]。通配符,表示几乎任意字符。 换行符、回车符、行分隔符和段分隔符除外。 \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。 \f 匹配一个换页符 (U+000C)。 \n 匹配一个换行符 (U+000A)。 \r 匹配一个回车符 (U+000D)。 \t 匹配一个水平制表符 (U+0009)。 \v 匹配一个垂直制表符 (U+000B)。 \0 匹配 NULL(U+0000)字符, 不要在这后面跟其它小数,因为 \0 是一个 八进制转义序列。 [\b] 匹配一个退格(U+0008)。(不要和\b 混淆了。) [abc] any of a, b, or c [^abc] not a, b, or c [a-g] character between a & g 1.2 位置匹配 字符 说明 \b 是单词边界,具体就是\w 和\W 之间的位置,也包括\w 和 ^ 之间的位置, 也包括\w 和 之间的位置。 \B 是\b 的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉\b, 剩下的都是\B 的。 ^abc$ 字符串开始、结束的位置 1.3 组 字符 说明 (abc) capture group,捕获组 \n backreference to group #n,分组引用,引用第 n 个捕获组匹配的内容, 其中 n 是正整数 (?:abc) non-capturing group,非捕获组 1.4 先行断言 字符 说明 a(?=b) positive lookahead,先行断言,a 只有在 b 前面才匹配 a(?!b) negative lookahead,先行否定断言,a 只有不在 b 前面才匹配 1.5 后行断言 字符 说明 (?<=b)a positive lookbehind,后行断言,a 只有在 b 后面才匹配 (?<!b)a negative lookbehind,后行否定断言,a 只有不在 b 后面才匹配 1.6 量词和分支 字符 说明 a* 0 or more a+ 1 or more a? 0 or 1 a{5} exactly five a{2,} two or more a{1,3} between one & three a+? a{2,}? match as few as possible,惰性匹配,就是尽可能少的匹配 以下都是惰性匹配: {m,n}? {m,}? ?? +? *? ...

2020-10-11 · 11 分钟 · 5265 字 · Niuhe

PlantUML画时序图

本文主要介绍PlantUML绘图环境的搭建以及时序图的绘制,主要以Linux平台为例。 ...

2020-09-28 · 2 分钟 · 618 字 · Niuhe

编程工具之Git

Git版本控制 尽管 Git 的接口有些丑陋,但是它的底层设计和思想却是非常优雅的。丑陋的接口只能靠死记硬背,而优雅的底层设计则非常容易被人理解。因此,我们将通过一种自底向上的方式像您介绍 Git。我们会从数据模型开始,最后再学习它的接口。一旦您搞懂了 Git 的数据模型,再学习其接口并理解这些接口是如何操作数据模型的就非常容易了。 ...

2020-09-27 · 8 分钟 · 3786 字 · Niuhe

编程工具之Vim

Vim编辑器 编辑模式 Vim的设计以大多数时间都花在阅读、浏览和进行少量编辑改动为基础,因此它具有多种操作模式: 正常模式:在文件中四处移动光标进行修改 插入模式:插入文本 替换模式:替换文本 可视化(一般,行,块)模式:选中文本块 命令模式:用于执行命令 在不同的操作模式下, 键盘敲击的含义也不同。比如,x 在插入模式会插入字母x,但是在正常模式 会删除当前光标所在下的字母,在可视模式下则会删除选中文块。 ...

2020-09-27 · 6 分钟 · 2771 字 · Niuhe

编程工具之问答

最后一节课,我们回答学生提出的问题: 学习操作系统相关内容的推荐,比如进程,虚拟内存,中断,内存管理等 你会优先学习的工具有那些? 使用 Python VS Bash脚本 VS 其他语言? source script.sh 和 ./script.sh 有什么区别? 各种软件包和工具存储在哪里?引用过程是怎样的? /bin 或 /lib 是什么? 我应该用 apt-get install 还是 pip install 去下载软件包呢? 用于提高代码性能,简单好用的性能分析工具有哪些? 你使用那些浏览器插件? 有哪些有用的数据整理工具? Docker和虚拟机有什么区别? 不同操作系统的优缺点是什么,我们如何选择(比如选择最适用于我们需求的Linux发行版)? 使用 Vim 编辑器 VS Emacs 编辑器? 机器学习应用的提示或技巧? 还有更多的 Vim 小窍门吗? 2FA是什么,为什么我需要使用它? 对于不同的 Web 浏览器有什么评价? 参考 学习操作系统相关内容的推荐,比如进程,虚拟内存,中断,内存管理等 首先,不清楚你是不是真的需要了解这些更底层的话题。 当你开始编写更加底层的代码,比如实现或修改内核的时候,这些内容是很重要的。除了其他课程中简要介绍过的进程和信号量之外,大部分话题都不相关。 ...

2020-09-27 · 13 分钟 · 6349 字 · Niuhe

编程工具之杂烩

安全和密码 熵(Entropy) 度量了不确定性并可以用来决定密码的强度。 熵的单位是 比特。对于一个均匀分布的随机离散变量,熵等于log_2(所有可能的个数,即n)。 扔一次硬币的熵是1比特。掷一次(六面)骰子的熵大约为2.58比特。 对称加密与非对称加密 当你运行ssh-keygen命令,它会生成一个非对称密钥对:公钥和私钥(public_key, private_key)。 生成过程中使用的随机数由系统提供的熵决定。这些熵可以来源于硬件事件(hardware events)等。 公钥最终会被分发,它可以直接明文存储。 但是为了防止泄露,私钥必须加密存储。ssh-keygen命令会提示用户输入一个密码,并将它输入密钥生成函数 产生一个密钥。最终,ssh-keygen使用对称加密算法和这个密钥加密私钥。 ...

2020-09-27 · 16 分钟 · 7784 字 · Niuhe

编程工具之调试和性能分析

代码不能完全按照您的想法运行,它只能完全按照您的写法运行,这是编程界的一条金科玉律。 让您的写法符合您的想法是非常困难的。在这节课中,我们会传授给您一些非常有用技术,帮您处理代码中的 bug 和程序性能问题。 调试代码 打印调试法与日志 “最有效的 debug 工具就是细致的分析,配合恰当位置的打印语句” — Brian Kernighan, Unix 新手入门。 ...

2020-09-27 · 16 分钟 · 7736 字 · Niuhe

Angular开发环境搭建

Angular 开发环境 Angular 依赖于 Nodejs,需要首先安装 node 和 npm,安装完成后可以查看 node 和 npm 的版本 然后再安装 angular 依赖 node -v npm -v # npm换源 npm config set registry https://registry.npm.taobao.org # 查看npm的源 npm config get registry # 安装angular npm install -g @angular/cli # 更新所有套件到最新版 ng update --all --force # 创建一个angular项目 ng new testng StackBlitz是一个在线开发环境,可以快速上手开发. 进入 testng 项目,其目录结构如下 ├── angular.json # angular配置文件 ├── e2e │ ├── protractor.conf.js │ ├── src │ │ ├── app.e2e-spec.ts # e2e 端对端测试目录 │ │ └── app.po.ts │ └── tsconfig.json ├── karma.conf.js # 执行自动化测试的 ├── node_modules # npm包安装目录,使用npm install安装 ├── package.json # npm 工具的配置文件,指明了当前这个应用所要用到的模块,Angular 的依赖包 ├── README.md ├── src │ ├── app │ │ ├── app.component.css # 项目主样式 │ │ ├── app.component.html # 项目的主模板 │ │ ├── app.component.spec.ts # 项目单元测试 │ │ ├── app.component.ts # 项目的主组件,定义AppModule,这个根模块会告诉Angular如何组装该应用 │ │ ├── app.module.ts # 项目主模块 │ │ └── app-routing.module.ts │ ├── assets # 静态资源如图片、翻译语言,构建时自动打包 │ ├── environments │ │ ├── environment.prod.ts # 生产环境配置 │ │ └── environment.ts # 开发环境配置,默认 │ ├── favicon.ico # 图标 │ ├── index.html # 宿主页面 │ ├── main.ts # 整个web应用的入口点,angular通过该项目来启动整个项目 │ ├── polyfills.ts # 导入一些必要的库,使得angular可以在一些老版本的浏览器中运行 │ ├── styles.css # 公共样式 │ └── test.ts # 单元测试入口点 ├── tsconfig.app.json ├── tsconfig.json # TypeScript 编译器的参数 ├── tsconfig.spec.json ├── typings.json # 为那些 TypeScript 编译器无法识别的库提供了额外的定义文件。 └── tslint.json # 定义 ts 文件质量检查的一些规则 参考 Angular 的 8 个核心概念 ...

2020-09-26 · 2 分钟 · 680 字 · Niuhe

Python进阶上

Python种基本类型的比较: List is a collection which is ordered and mutable. Allows duplicate members. Tuple is a collection which is ordered and immutable. Allows duplicate members. Set is a collection which is unordered and unindexed. No duplicate members. Dictionary is a collection which is unordered, mutable and indexed. No duplicate members. Strings are immutable sequences of Unicode code points. List Python中的list是一个有序容器,容纳不同类型的数据(但推荐列表内数据类型相同),同时其是可变类型的. 创建列表 list_1 = ["banana", "cherry", "apple"] print(list_1) # Or create an empty list with the list function list_2 = list() print(list_2) # Lists allow different data types list_3 = [5, True, "apple"] print(list_3) # Lists allow duplicates list_4 = [0, 0, 1, 1] print(list_4) 内置方法 修改列表的方法尽量使用内置方法,内置方法效率较高 ...

2020-09-26 · 7 分钟 · 3404 字 · Niuhe

Microstack 基本使用

Microstack 简介 Microstack 是在 ubuntu 平台上快速部署 Openstack 环境的工具,其通过 snap 构建,而 snap 安装目录是一个独立的只读文件系统,这就导致难以改动代码进行调试。 因此,Microstack 环境只适用于 Openstack 初学者学习命令行和数据库等等,调试的话可以通告 gdb 调试,而不便于通过 pdb 调试,因为无法修改源文件,并在文件还中加断点。 Microstack 是目前 Ubuntu 上最简洁的 Openstack 配置工具,可以在笔记本上部署单节点环境用于学习,也可以在多台设备上部署多节点环境。 ...

2020-09-20 · 2 分钟 · 674 字 · Niuhe

Python 生成ankidroid单词表/语音包

Ankidroid和插件 ankidroid下载网址https://apps.ankiweb.net/ 目前还是推荐下载anki2.0旧版,2.1版插件支持的不全。 必装插件列表: Awesome TTS:301952613 Review Heatmap:1771074083 Night Mode:1496166067 词库分享 anki-deck 从网络抓取单词/例句文本 示例从轻松背单词网站抓取,网站上涵盖了从小学到GRE以及各个专业的单词和例句。内容非常丰富,希望大家多支持这个良心网站。本抓取方法仅作示例,侵删。 网站爬取需要两个参数: book_id group_id 具体爬取代码参见我的github,anki_spider 食用方法 将爬取下来的文本,保存为文本文件 编辑单词书的字段,可自定义样式进行美化 打开anki,选择文件 ——> 导入,文件类型为以tab分割的文件类型,并允许使用HTML,匹配对应字段 ...

2019-06-02 · 1 分钟 · 369 字 · Niuhe