外公和中秋节

周六的时候家人还说外公感冒好的差不多准备出院了,谁知第二天妈妈打电话过来说外公走了。

我一直都不相信,或者说不愿意相信,一直把 “走了” 理解成外公还在急救室抢救,直到周一妈妈发来一张灵堂的照片,我才承认外公真的走了。我在办公室里看到照片,忍不住泪奔,起身去停车场走了好久才平静下来。

我翻遍了电脑中和外公的合影,最近的一张是在 2011 年,之前一直没有意识到居然这么久没有和他合影了。前段时间视频的时候我还信誓旦旦的说过年回来看你们,没想到却再也看不到了。

我什么都做不了,甚至都不能到灵堂前看一眼。

这几天一直在回忆着小时候的点点滴滴,我真的很想念你。

硅谷夜谈 三

本博客少的可怜的几位读者向我抱怨很有没有更新了,好吧,今天就来更新一下。

前一段时间外公因为心脏病住院了,其实很多老人都有心脏不好的毛病,外公也不例外,以前也发过几次小毛病,但是这次发病比较严重,在医院住了很多天,妈妈也赶回老家到医院照顾外公,周末的时候和他们视频,看着外公躺在病床上输氧,突然之间感觉外公老了很多。。。

依然记得我大概3-4岁的时候,中午不午睡一直吵,然后外公就教我下象棋,3-4岁的小孩还没有什么逻辑思维,我记得当时怎么都搞不懂马的“日”字走法的“撇马腿”、还有象的“田”字走法,外公就一遍一遍的耐心教我,教了大概一两个月我终于可以独立的下棋了。那一年夏天的每个中午,大人们在老房子的客厅里打着凉席午睡,而我和外公在客厅的一个角落里下着象棋,有的时候一步棋我要想很久,外公就趁这个时间坐着打个盹,我走完一步就大声的把外公叫醒。这段回忆是很美好的,每次想到这里总能联想到周杰伦的《爷爷泡的茶》,我似乎能从这首歌里找到一些共鸣。

虽然最近外公身体恢复了很多,但是由于心脏不好导致大脑缺氧,说话不如以前利索了,跟他视频的时候,虽然脑子里很清楚,但是有些词发不出音来。妈妈跟我说,准备咨询一下医生,等外公身体恢复好了以后,看能不能做一个心脏搭桥手术,花费大概6-7万元,我当时一听就说我来付这个钱吧。说完这句,突然发现自己挣的钱能照顾好家人,能在需要的时候发挥作用,虚拟的数字在一瞬间变的有现实的意义,不仅有一些感慨。(虽然这点钱并不多,家里人也没想过让我来支付,事实上咨询了医生以后,外公也不打算做手术了)

以前我自己挣钱自己花,过得很舒服,对工作也是无所谓的态度,总觉得什么时候干的不爽就直接不干了,现在能体会到挣钱养家的人肩上所担负的责任。

突然发现钱很重要,有了钱就有了安全感。所以我要努力工作,挣更多的钱,给我和我的家人更多安全感。

GDB 内写脚本调试程序

很多纯 C 语言的项目都会自己开发一套基础数据结构,比如最常见的就是造一个 C++ Vector 或者 String 的轮子,有了 Vector 以后就可以往里面自由 add() 任意类型的数据,在具体实现中用 Void* 做强制类型转换,这样带来的问题是无论 gdb 还是 printf 调试程序,都必须手动转换指针指向的那一块内存区域:强制转换类型、明确数据占据的内存大小。例如 gdb 中打印 vector[0] 或者 vector[i] 的命令就必须写成这样:

print *((unsigned long*)(vec->data + 8*i))

当无法修改程序源码只能用 gdb 时,打印一个 vector 数组是相当蛋疼的事情,好在 gdb 提供了一个自定义命令的功能,或者说可以先把自定义的命令写成一串指定保存到文本中,然后在 gdb 中加载这个文件就可以使用这个命令了:

define printvec
set $total = $arg0->n_element // arg0 表示输入的第一个参数,arg1 类推
set $i = 0
print $total
while ($i < $total) 
print *((unsigned long*)($arg0->data + 8*$i))
set $i = $i+1
end
end

(gdb) source cmd.txt
(gdb) printvec vec

小小

又快过年了,爸妈也回到了安徽老家,这是我第三年没有回家过年了。前几天晚上一大家人在外婆家吃饭,饭后翻看着我们小时候的照片(真的可以算是“发黄的老照片”了),姐姐和妈妈也用手机拍了很多通过微信发给我看,由于时差的原因,我当时正在睡觉,早上醒来拿着手机看了好久,满满的都是回忆。今天 kc 还在群里问我啥时候回家,我说,我当然也想回家,特别是每当逢年过节,阖家团圆的时候,你们是无法感受到一个在外漂泊游子的思乡之情的。

这几天上班的路上一直听《小小》这首歌,以前听的时候就觉得歌词写得很让人有感触,拿起手机看了下发现居然是方文山作词,周杰伦作曲的。其实这首歌吸引我的并不是歌词里说的两小无猜、青梅竹马的爱情,而是透过歌词道出的对童年、对往事的那份回忆。
Continue reading ‘小小’ »

硅谷夜谈 二

君子当谋时而动,顺势而为。

平常在网上查有关技术的资料的时候,经常会搜到一些个人博客,以我的经验通常个人博客里面的文章质量还是不错的,想来原因可能是这样:因为自己花钱买的域名、虚拟主机空间,又费了好大力气搭起博客系统,那么文章肯定会好好写咯。有的时候我看完的想查的内容,也顺便去看一眼博主的自我介绍之类的,有点拜访 “同道中人” 的意思。

现在经常看到有不少大一大二,甚至是高中的小朋友已经在做app开发了,而且都做的很不错,在他们的博客上也谈论着 android、ios 开发的各种术语,很显然,这些术语我都听不懂,大多数时候我只是草草的浏览一遍,不得不感叹后生可畏,也不得不承认自己 “老” 了。

回首我上大一的那会儿已经是8年前,与现在app开发如火如荼的情景相比,那个时候 iPhone 才刚刚发布不久,没有 app 开发这个概念。当年我的诺基亚手机上,唯一算得上是 app 的可能也就是 QQ 了吧。

上大学的时候,我也在想以后毕业了做什么样的工作呢? 学Java .Net?当时觉得这两者一般给企业客户做定制软件的,那时候觉得客户都是不懂技术的傻逼,懒得去跟他们打交道,因此决定不做这个。然后觉得做 Linux 后台开发听起来比较高大上,而且也不会 “过时”,于是就开始玩 Linux,先是安装各种发行版,然后发现做 Linux 开发并不是折腾发行版,于是就打算开始学 Linux 下的 C 开发,开始看 《Unix环境高级编程》之类的书。随着学习深入,越发的对操作系统非常的感兴趣,于是一度想往底层研究,想搞懂 Linux 内核,以至于深深的影响我之后走的道路,从实习到现在的正式工作,我都是在用 C 语言和 Linux 打交道。

如果我现在才读大一,我想我会对app开发产生浓厚的兴趣,因为对于一个刚刚步入软件开发大门的新生而言,能开发出一个app,然后安装在自己的手机上是多么有成就感的事。 我肯定会乐此不疲,那么有可能我与现在走的就是完全不同的一条路。

曾经一度痴迷于 Linux,一方面是喜欢底层的各种技术,另一方面,是觉得 Linux 的技术永远不会过时。现在看来当时的想法并没有错,是的,Linux 永远不会过时,但是让我没有料到的是,app 开发会迅速发展,如火如荼,甚至成为以后做任何一个产品的标配,不但是虚拟世界,app 已经开始影响到我们的衣食住行。

IT 这个行业太瞬息万变,下一个10年,又会发生什么呢?

硅谷夜谈 一

最近湾区天气转凉,早晚温差很大,白天在家坐了一天,临近傍晚的时候感觉手脚冰凉的,突然想到为何不去泡个澡呢?以前在南卡的时候,租的房子是和室友公用卫生间的,我都是冲个澡就走了,现在住的房子有独立的卫生间,相对也比较干净,而且也不怕泡澡占用卫生间过多的时间。说泡就泡,放了一大缸水舒舒服服的洗了个澡,然后靠在床上拿着笔记本上上网,这种感觉真TM爽,有种“偷得浮生半日闲”的意境。

上初中、高中那会儿,每到冬天我也经常这样泡澡。江南的冬天很寒冷,而且TM是湿冷,被子里都感觉潮潮的,所以睡觉前我一般先用电热毯或者热水袋把被子里的寒气去掉。每到周六的晚上,吃完晚饭必做的事情就是泡澡了,在自己家浴缸里放满水舒舒服服洗个澡,经常要泡一个多小时,然后靠在床上,拿本书看看,看累了就直接睡觉。

后来上大学了也基本保持这个习惯,冬天下着小雪,然后拎着换洗的衣服去宿舍不远的公共澡堂,当时学校的澡堂是对社会开放的,澡堂子里有一个大池子,在里面一边泡一边听当地人扯蛋,等到泡出一身汗了,去旁边的淋浴洗一洗。等走出澡堂的时候全身都冒着热气,在冰天雪地里只穿薄薄的一件外套都不觉得冷。回到宿舍躺在床上,架起电脑听听歌上上网,相当舒服。

每年过年回到老家,按照习俗大年三十之前是要洗个澡的,干干净净过新年,一般我是和外公一起在年二十九那天下午去澡堂洗个澡,一年一次给外公擦个背,搓个澡,洗完出来全身热乎乎,然后一起踩着积雪回家,一路有说有笑。

自2013年夏来到美帝,算上今年已经三年没有回家过年了,以后我还是会回到家乡的,因为那里有我熟悉的人和事,还有回忆。

用 Kippo 部署一个蜜罐

前段时间因为拿了一个 digitalocean 的优惠码,于是开了一个 VPS,配置好了一些常用的功能以后就放在那边了,今天登录进去无意间看了一下 /usr/log/auth.log, 也就是ssh登录的记录,TMD发现有成千上万条记录————很显然,有人想暴力破解我的root密码,绝对不能忍!! 于是想到用Kippo部署一个ssh的蜜罐耍一耍这个王八蛋。

Continue reading ‘用 Kippo 部署一个蜜罐’ »

用Python读取pcap文件

pcap 文件通常用 wireshark 工具打开。 wireshark 在抓取和分析网络数据包的时候非常有用,不得不说它是一个很强大的工具。用wireshark 打开pcap文件后,所有的信息一目了然,但是作为一个(伪)geek ,还是需要有一点刨根问底的精神的,总想自己手动解析一次,那么这次就来玩转一下 pcap 文件。

首先看一下 pcap 的文件格式,出乎意料的是pcap的格式非常简单。

pcap

 

 

Pcap Header 是整个文件的头部,存放了关于这个pcap的一些信息。之后每个被捕获的数据包用一个(Head, Data)表示,Head里是关于这个数据包的捕获时间等信息,后面的Data就是这个数据包了。Data包含了MAC帧之上的所有内容。

Continue reading ‘用Python读取pcap文件’ »

硅谷夜谈 零

今天到公司比较早,其他同事都还没来,就随手打开网页上上网,习惯性的在浏览器地址栏输入几个字母,突然在自动补全最下面看到了一个久违的网站—— CFan BBS。回想起来我大概有一年没有登录过这个网站了吧,幸好浏览器自动保存了账号密码,赶紧登录一下,逛了逛这个对现在的我来说熟悉又陌生的地方。

大概是在高中注册的账号,这个论坛陪伴我度过了大一、大二几乎所有的课余时光,那个时候的校园网特别慢,我当时是办的校外的电信网,一个月好像是90还是120个小时的样子,宝贵的上网时间得计划着用,那个时候每天下了晚自习回到宿舍,打开电脑登录论坛灌灌水,有的时候第一天发了帖子问问题,第二天便会迫不及待的登录论坛看看谁给我回复了,也因此结识了一帮共同爱好的朋友;有时候也为在论坛上学了点新知识而沾沾自喜。可以说每天上网的时候是我最开心的时候,而CFan论坛也成了我获取计算机知识一个重要的地方。同一时期网上也有很多其他的技术论坛,但是我偏偏只在这儿安家了,为什么呢? 我也说不清楚。

当年的编程技术讨论区还是比较火热的,如今人走茶凉,荒草丛生,连每月一次的精华帖依然停留在2011年,我对CFan编程版的记忆也停留在2011年,那一年,哥大学毕业。

虽然高中也捣鼓过程序,但走的是野路子。刚进大学的时候我对编程一知半解,编程语言、算法、数据结构对我来说都是全新的东西。大学为我打开了一扇门,让我知道了学编程要学这么多东西,而路要自己去探索,这也许就是大学的意义所在。翻一翻我曾经发过的帖子,现在看来真的很幼稚,代码写的乱七八糟也非常自信的发到论坛,还被加了精华,要是哪天某个好事者把我发的帖子扒出来黑我的话,脸都不知道往哪搁。但就是凭着这份初生牛犊不怕死的精神,经常在论坛里灌水,因此结识了一帮好友,也充实了大学的课余时光。试想一下,与其在宿舍和同学打游戏看黄片,还不如在论坛发点精华帖来的有意义。

看着我以前发的帖子,虽然幼稚,但是却隐隐约约透过屏幕让我感觉到了那份久违的满腔热血,而这份满腔热血正是我渐渐被时间所磨灭的东西。几天前,我在18摸实习时认识的内核大神 Xiao Guangrong 也重新开张了他的博客,在新博客中他写道“路漫漫其修远兮,吾将上下而求索”,大神都如此,我等更应当加倍努力。

我是一个意志力薄弱的人,经常给自己定了目标最后又不了了之,所以有必要把一些思绪记录下来,提醒自己不忘初心。

Start

博客荒废了很久,从现在开始要好好写博客了,思绪来得快走的也快,不记录下来就没了。
好在现在工作定下了,以后上班下班按部就班,目标要在技术上有所成长,毕竟年纪也不小了。

Depth First Search

深度优先搜索一般用递归的方法实现,但是怎么写好一个递归程序对于我来说挺难的。
每隔一段时间写又会犯各种错误,思绪来得快也走得快,有必要记录一下。

首先用一个问题来引出 DFS:给定一个字符串,要求用空格来分割,生成它的所有可能的分割方法。
比如给定 “abc”, 那么可能的分割是
“a” “b” “c”
或者 “ab” “c”
或者 “a” “bc”

这些题目都是给一个字符串,生成符合题意要求的分割后的结果。 既然解法类似,那么代码肯定也是类似了,只是会多加一些判断条件。

我们先回到一开始的问题:如何生成所有可能的分割?
Continue reading ‘Depth First Search’ »

Why Does Not X86_64 Have ZONE_HIGHMEM

如果你稍微了解过Linux内核的内存管理,那么对内存分区的概念一定不陌生,Linux内核把物理内存分成了3个区,
0 – 16M 为ZONE_DMA区,
16M – 896M 为ZONE_NORMAL区,
高于896M 为ZONE_HIGHMEM区

我没有去考证过为什么要取896这个数字,但是可以肯定的是这样的划分在当时看来是合理的,然而计算机行业的发展今非昔比,现在4G的物理内存已经成为PC的标配了,CPU也进入了64位时代,很多事情都发生着改变。 Continue reading ‘Why Does Not X86_64 Have ZONE_HIGHMEM’ »

Linux Memory Management Slob Allocator 1

貌似2013年写的技术文章只有个位数,实在是不应该啊! 最近几天看了些Linux Kernel的内存管理,就写点东西吧。

我们知道Linux内核内存管理最底层的是伙伴系统,伙伴系统解决是的内存外碎片问题,而不能解决内碎片问题,因此在伙伴系统之上,有Slub/Slab/Slob 三种内存分配策略(有的书上叫高速缓存,我个人很不喜欢这个名字,因为很容易与硬件的高速缓存TLB混淆),不过内核同时只能使用这三种中的一种,Slub 是现在内核默认的选项,无论是我们安装在自己电脑上的Linux系统,还是运行在服务器上的系统,都是用的Slub; Slab 作为鼻祖曾经辉煌一时,现在退居二线了; Slob 则是主要用于内存非常小的嵌入式系统,只有在编译内核的时候配置了 Embedded System 选项,才可以选择使用Slob。

Continue reading ‘Linux Memory Management Slob Allocator 1’ »

I Changed My Mind

再不更新真的是太对不起观众了。

整个六月、七月都非常的忙碌。首先是在IBM实习的时候,组内给我分配了一个任务,即为perf添加对Power7 的PMU事件名称的支持,Power7支持多达500多个事件,所以我需要在内核源码里面添加500多项(行)。单从数量上来说这个改动还是蛮大的(实际上只是重复的体力劳动啦 ^_^),如果我能完成了这个patch并且被接受的话,就能在Linux Kernel源码里面留下我的大名了。

没过多久我就完成了第一版,经过组内的内部review后发到社区,收到反馈以后改,然后再发,直到发到v4,差不多结束了,接下来就是等待patch被merge到一级一级的分支中去,最终并入主线内核。中间还有几个小插曲:社区的某个人对这个patch提出质疑,认为不应该加入到内核,而应该放在用户态,然后IBM在澳大利亚的一个搞Power的大牛出来争论,甚至最后还用了F开头的单词,最终也就这么不了了之了。这些都是后话,如果有时间我将在以后的博客里面介绍。

patch的链接在这里

Continue reading ‘I Changed My Mind’ »