Linux指令 - tee的实现
近日学习《Linux/UNIX 系统编程手册》一书,巩固了C语言中一些常用库函数的使用,主要涉及基本IO操作相关的库函数。为了加深理解,手动实现了Linux系统中的tee指令的功能。借此文记述实现过程。 tee功能简述tee类似于一个单输入双输出的三通管道,将标准输入的数据输出到指定文件和标准输出中。为实现这个指令,主要考虑以下几点: 解析tee包含的命令行参数 读取标准输入数据,并将数据写入标准输出和指定文件 若未指定文件,则仅将数据输出到标准输出 下面逐步分析每个要点的实现方法。 参数解析tee包含以下可选项,本文实现仅考虑-a,--version,--help Usage: tee [OPTION]... [FILE]... Copy standard input to each FILE, and also to standard output. -a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore inte...
OpenWrt中使用gdb分析coredump
近日调试一个bug,一个守护进程在特定情况下执行一段程序后便会挂掉。为了分析bug产生原因,本人使用了printf, strace追踪,gdb调试等诸多调试工具和测试方法。本文对于在OpenWrt嵌入式系统中启用gdb功能及其使用方法进行详细说明。 调试背景我最先通过strace工具追踪发现进程是在收到SIGABRT信号后被kill的。 pipe([8, 9]) = 0 fcntl64(8, F_GETFL) = 0 (flags O_RDONLY) ioctl(8, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbe90a454) = -1 EINVAL (Invalid argument) rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 tgkill(14189, 14189, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) --- Process 14...
网页模板pug基本语法
Pug – robust, elegant, feature rich template engine for Node.js pug原名jade,因版权问题更名为pug,即哈巴狗。与hexo默认模块ejs一样,pug也是一个模板引擎,可用于快速的网站开发,当然也可以用于静态博客网站的设计。本站点现时所用主题manupassant也使用了pug。 本文针对Hexo中使用pug的情况为例,说明其基本语法。 安装# common install npm install pug # install for hexo blog npm install hexo-renderer-pug --save 语法pug不同于html,前者不需要标签的开和闭,如html的<p>Demo</p>,在pug使用p Demo即可。 缩进pug对空格敏感,有点类似python对制表符tab敏感。pug使用空格作为缩进符,当然用soft tab也可行。同一级标签需保证左对齐。 div p Hello, world! p Hello, pug. 渲染结果如...
Python实现快排及其可视化
最近装了个Anaconda,准备学习一下数据可视化。本着三天打鱼两天装死的心态,重新抱起崭新的算法书,认真学起了快排算法。学完后用Python实现了一遍基本的快排,然后使用matplotlib进行动态绘图,最后使用imageio生成GIF图片。谨以此文以记之! 快排基本原理快排采用和归并排序相同的分而治之的思想,将待排序数组分成左右两个子数组,对两部分子数组独立排序。当子数组均有序时,整个数组也就有序了。 排序步骤如下: 将原始数组data随机打乱,以消除对输入的依赖(本步可选) 选择数组的首个元素data[0]作为切分元素v 切分数组 从左往右找到第一个大于切分元素v的元素data[i] 从右到左找到第一个小于切分元素v的元素data[j] 交换data[i]与data[j] 重复以上三步直到i>=j 交换data[j]与切分元素data[0] 递归调用,对切分后的左侧子数组进行排序 递归调用,对切分后的右侧子数组进行排序 文字性的描述总是那么苍白无力,但还好也能说明一些问题。可以看出,快排的关键在于切分,切分后的数组应该满足: 切分元素的位置(设为j)已经固定...
tmux常用配置说明
tmux作为Linux三大神器之一,结合zsh和vim堪称无敌,tmux作为分屏利器自有其强大之处,本文就其常用配置予以说明。 安装tmux# install in ubuntu $ sudo apt-get install tmux Ctrl+B: default keys of tmux prefix .tmux.conf: config file of tmux tmux source-file .tmux.conf: command to reload .tmux.conf 禁止自动更新窗口名称默认情况下,tmux会根据当前目录及相关操作自动更改窗口名称,但通常情况下,我们是不需要其修改的,为此可以在配置文件中添加: setw -g allow_rename 'off' 设置zsh作为默认shell如果先安装的tmux, 后安装和配置zsh,那tmux有可能默认打开使用的是bash,此时可以使用以下配置指令予以更改: set-option -g default-shell /bin/zsh 设置vim作为默认编辑器在tmux的搜索模式prefix+[下,默认...
Openwrt中添加内核模块
如果想要在Openwrt系统中添加一个内核模块,其实并不难,对着某个已有的内核模块,依葫芦画瓢嘛,不难。本文将介绍一个最最简单的 sourcecodepath: git_repo/package/kmod-demo/ 下面是源码包含的所有文件,根级Makefile提供给内核编译器使用,src级Makefile用于编译.ko文件。 $ tree . ├── Makefile └── src ├── demo.c ├── Kconfig └── Makefile demo.c源码非常简单,在装载时打印Hello World,卸载时打印Exit。 #include <linux/module.h> #include <linux/kernel.h> static int __init hello_init(void) { printk("Hello World\n"); return 0; } static void __exit hello_exit(void) { printk("Exi...
Python网络爬虫4 - scrapy入门
scrapy作为一款强大的爬虫框架,当然要好好学习一番,本文便是本人学习和使用scrapy过后的一个总结,内容比较基础,算是入门笔记吧,主要讲述scrapy的基本概念和使用方法。 scrapy framework首先附上scrapy经典图如下: scrapy框架包含以下几个部分 Scrapy Engine 引擎 Spiders 爬虫 Scheduler 调度器 Downloader 下载器 Item Pipeline 项目管道 Downloader Middlewares 下载器中间件 Spider Middlewares 爬虫中间件 spider process其爬取过程简述如下: 引擎从爬虫获取首个待爬取的链接url,并传递给调度器 调度器将链接存入队列 引擎向调度器请求要爬取的链接,并将请求得到的链接经下载器中间件传递给下载器 下载器从网上下载网页,下载后的网页经下载器中间件传递给引擎 引擎将网页经爬虫中间件传递给爬虫 爬虫对网页进行解析,将得到的Items和新的链接经爬虫中间件交给引擎 引擎将从爬虫得到的Items交给项目管道,将新的链接请求requests交给调...
Python网络爬虫3 - 生产者消费者模型爬取某金融网站数据
应一位金融圈的朋友所托,帮忙写个爬虫,帮他爬取中国期货行业协议网站中所有金融机构的从业人员信息。网站数据的获取本身比较简单,但是为了学习一些新的爬虫方法和技巧,即本文要讲述的生产者消费者模型,我又学习了一下Python中队列库queue及线程库Thread的使用方法。 生产者消费者模型生产者消费者模型非常简单,相信大部分程序员都知道,就是一方作为生产者不断提供资源,另一方作为消费者不断消费资源。简单点说,就好比餐馆的厨师和顾客,厨师作为生产者不断制作美味的食物,而顾客作为消费者不断食用厨师提供的食物。此外,生产者与消费者之间可以是一对一、一对多、多对一和多对多的关系。 那么这个模型和爬虫有什么关系呢?其实,爬虫可以认为是一个生产者,它不断从网站爬取数据,爬取到的数据就是食物;而所得数据需要消费者进行数据清洗,把有用的数据吸收掉,把无用的数据丢弃。 在实践过程中,爬虫爬取和数据清洗分别对应一个Thread,两个线程之间通过顺序队列queue传递数据,数据传递过程就好比餐馆服务员从厨房把食物送到顾客餐桌上的过程。爬取线程负责爬取网站数据,并将原始数据存入队列,清洗线程从队列中按入队顺...





