自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

今日成为CSDN认证专家

认证时写的申请材料: 程序猿一枚毕业于南开工作于上海。喜欢读书,喜欢跑步,激情似火,心静如水。 喜欢编程,喜欢寻根问底各种技术,喜欢在各种新技术中汲取营养。 喜欢分享,因此以一些高质量的博文来回报各位可爱可敬的程序猿们。 从2013年12月开博3个月,共发表博文43篇,访问量接近20万,多篇文章被推荐到首页和边栏的推荐文章;创建了专栏《Linux调试技巧》,收录博文7篇,有4万多的访问量...

2014-03-14 17:49:00 540

存储那些事儿(五):BTRFS文件系统之Btree结构详解

Btree数据结构可以说是BTRFS文件系统的基础。它提供了一个通用的方式去存储不同的数据类型。它仅仅存储3个数据类型:key, item和block header。 btrfs_header的定义如下:struct btrfs_header { u8 csum[32]; u8 fsid[16]; __le64 blocknr; __le64 flag...

2014-03-13 20:06:00 344

Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT

本文主要讲解动态库函数的地址是如何在运行时被定位的。首先介绍一下PIC和Relocatable的动态库的区别。然后讲解一下GOT和PLT的理论知识。GOT是Global Offset Table,是保存库函数地址的区域。程序运行时,库函数的地址会设置到GOT中。由于动态库的函数是在使用时才被加载,因此刚开始GOT表是空的。地址的设置就涉及到了PLT,Procedure Linkage Tab...

2014-03-06 18:46:00 511

Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind

实际上,Linux的调试方法非常多,针对不同的问题,不同的场景,不同的应用,都有不同的方法。很难去概括。本篇文章主要涉及本专栏还没有涵盖,但是的确有很重要的方法。本文主要包括动态库注入调试;使用ltrace命令处理动态库的调试;使用strace调试系统调用的问题;Valgrind的简要介绍。1. 动态库注入 如何排除其他library的调用问题?动态库注入(library inject...

2014-03-06 11:20:00 447 1

存储那些事儿(四):传统商业存储融入云计算之路

一年前开始学习Hadoop。Hadoop, 大数据的事实标准,被Facebook, Yahoo,eBay,taobao,baidu广泛应用。Hadoop本身很复杂,包含了很多子项目,不同的应用场景催生了不同的子项目。 最近要做OpenStack的项目,开始学习OpenStack。也反思了一下我现在所从事的行业:企业存储,路在何方? IT的技术发展可以说是日新月异。在人们还没有正在逐...

2014-03-05 15:59:00 134

存储那些事儿(三):OpenStack的块存储Cinder与商业存储的融合

OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算‎软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。OpenStack是IaaS(基础设施即服务)‎软件,让任何人都可以自行建立和提供云端运算服务。此外,OpenStack也用作建立防火墙内的“私有云”(Private Cloud),提供机构或企业内各部门共享资源。 Cinder提供了Op...

2014-03-04 18:03:00 340

存储那些事儿(二): 下一代Linux文件系统BTRFS简介

BTRFS,通常念成 Butter FS,Better FS 或B-tree FS。下一代的Linux文件系统。 它基于写时拷贝(copy-on-write),支持高效的snapshot和clone。它使用b-tree作为存储的数据结构。在BTRFS项目主页上对自己是这么描述的:"一个新的针对Linux的写时复制文件系统,致力于实施高级的功能,同时关注容错、修复和管理方便性。" 它有哪些...

2014-03-03 14:26:00 223

RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)

什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。 它可以作为RabbitMQ的Message的数据格式进行传输,由于是结构化的数据,这样就极大的方便了...

2014-02-24 15:29:00 250

RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成。那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会通过其它节点求来斐波纳契完成示例。1. 客户端接口 Client interface 为了展示一个RPC服务是如何使用的,我们将创建一段很简单的客户端class。 它将会向外提供名字为call的...

2014-02-23 21:37:00 237

RabbitMQ消息队列(六):使用主题进行消息分发

在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统。Consumer可以监听不同severity的log。但是,这也是它之所以叫做简单日志系统的原因,因为是仅仅能够通过severity设定。不支持更多的标准。 比如syslog unix的日志工具,它可以通过severity (info/warn/crit...) 和模块(auth/cron/...

2014-02-23 16:29:00 396

RabbitMQ消息队列(五):Routing 消息路由

上篇文章中,我们构建了一个简单的日志系统。接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log。比如我们希望只有error的log才保存到磁盘上。1. Bindings绑定 上篇文章中我们是这么做的绑定:channel.queue_bind(exchange=exchange_name, queue=queue_name) ...

2014-02-21 20:04:00 337

RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

<===RabbitMQ消息队列(三):任务分发机制 上篇文章中,我们把每个Message都是deliver到某个Consumer。在这篇文章中,我们将会将同一个Message deliver到多个Consumer中。这个模式也被成为 "publish / subscribe"。 这篇文章中,我们将创建一个日志系统,它包含两个部分:第一个部分是发出log(Producer),第二个...

2014-02-21 19:38:00 921

RabbitMQ消息队列(三):任务分发机制

<=== RabbitMQ消息队列(二):”Hello, World“ 在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题。在实际的应用场景中,这是远远不够的。从本篇文章开始,我们将结合更加实际的应用场景来讲解更多的高级用法。 当有Consumer需要大量的运算时,RabbitMQ Server需要一定的分发机制来ba...

2014-02-21 17:59:00 1137

RabbitMQ消息队列(二):”Hello, World“

<== RabbitMQ消息队列(一): Detailed Introduction 详细介绍 本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“。 首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列。它实现的功能”非常简单“:从Producer接收数据然后传递到Consumer。它能保证多并发,...

2014-02-20 21:15:00 166

RabbitMQ消息队列(一): Detailed Introduction 详细介绍

1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因...

2014-02-20 20:13:00 318

并发编程入门(三): 使用C++11实现无锁stack(lock-free stack)

前几篇文章,我们讨论了如何使用mutex保护数据及使用使用condition variable在多线程中进行同步。然而,使用mutex将会导致一下问题:等待互斥锁会消耗宝贵的时间 — 有时候是很多时间。这种延迟会损害系统的scalability。尤其是在现在可用的core越多越多的情况下。低优先级的线程可以获得互斥锁,因此阻碍需要同一互斥锁的高优先级线程。这个问题称为优先级倒置(prior...

2014-02-13 20:47:00 183

并发编程入门(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题...

请阅读上篇文章《并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题》。当然不阅读亦不影响本篇文章的阅读。Boost的互斥量,条件变量做了很好的封装,因此比“原生的”POSIX mutex,condition variables好用。然后我们会通过分析boost相关源码看一下boost linux是如何对pthread_mutex_t和pthread_cond_t进行的封装。...

2014-02-12 12:42:00 202

并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

boost的mutex,condition_variable非常好用。但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装。因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利。1. 什么是互斥量 互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加...

2014-02-10 19:57:00 366

Linux Debugging(五): coredump 分析入门

作为工作几年的老程序猿,肯定会遇到coredump,log severity设置的比较高,导致可用的log无法分析问题所在。 更悲剧的是,这个问题不好复现!所以现在你手头唯一的线索就是这个程序的尸体:coredump。你不得不通过它,来寻找问题根源。 通过上几篇文章,我们知道了函数参数是如何传递的,和函数调用时栈是如何变化的;当然了还有AT&T的汇编基础,这些,已经可以使我们具备了一...

2014-01-27 17:33:00 129

Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

前一段时间再次拜读《Inside the C++ Object Model》 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记:Program Transformation Semantics (程序转换语义学)The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)The Semantics of Constru...

2014-01-27 13:53:00 300

C++对象模型(五):The Semantics of Data Data语义学

本文是《Inside the C++ Object Model》第三章的读书笔记。主要讨论C++ data member的内存布局。这里的data member 包含了class有虚函数时的vptr和vtable的布局情况。1. 开头几个小问题 1. 首先回答一个问题: 一个空类,sizeof是多少?答案是1。因为编译器会生成一个隐晦的1bytes,用于区分,当该类多个对象时,各个对象...

2014-01-26 21:29:00 152

Linux Debugging(三): C++函数调用的参数传递方法总结(通过gdb+反汇编)

上一篇文章《Linux Debugging:使用反汇编理解C++程序函数调用栈》没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特殊的例子。本文将函数调用时的参数传递方法进行一下总结。总结将为C++普通函数、类成员函数;32位和64位进行总结。 建议还是读一下Linux Debugging:使用反汇编理解C++程序函数调用栈,这样本文...

2014-01-25 16:46:00 390

Linux Debugging(二): 熟悉AT&T汇编语言

没想到《Linux Debugging:使用反汇编理解C++程序函数调用栈》发表了收到了大家的欢迎。但是有网友留言说不熟悉汇编,因此本书列了汇编的基础语法。这些对于我们平时的调试应该是够用了。1 AT&T与Intel汇编语法对比 本科时候大家学的基本上都是Intel的8086汇编语言,微软采用的就是这种格式的汇编。GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gn...

2014-01-24 23:30:00 191

Linux Debugging(一): 使用反汇编理解C++程序函数调用栈

拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了。GDB也是使用函数的调用栈去还原“事故现场”的。因此理解函数调用栈,是使用GDB进行现场调试或者事后调试的基础,如果不理解调用栈,基本上也从GDB得不到什么有用的信息。当然了,也有可能你非常“幸运”, 一个bt就把哪儿越界给标出来了。但是,大多数的时候你不够幸运,通过log,通过简单的code walkt...

2014-01-24 17:23:00 242

Awards and Certifications @EMC

1. Awards1.1 Jun. 12, 2012, Accurev Migration1.2 Oct. 16, 2012, Deliver Inyo RTM to Rockies1.3 Jul. 17, 2013, Kittyhawk Health and Alerts Issue triage and Bug fix1.4 Aug. 2013, Rockies...

2014-01-24 10:03:00 130

存储那些事儿(一):异构虚拟化一种实现SMIS

1. 背景 企业存储是企业信息系统管理很重要的组成部分。企业存储包含了大量的数据,供大量人使用。对于航空系统和金融系统来说,信息存储就更加重要了。 作为企业信息存储,扩展性是非常重要的,因为现在企业对于空间的使用越来越多。 那么一个企业可能会采用其他存储厂商的产品,原来信息如何保留? 使用数据迁移功能(migration),可以将数据转移到其他系统上。但是企业数据数以P级,还是占企...

2014-01-18 21:06:00 369

QT Mobile: 一统IOS/Andriod/WP/等移动平台的江湖

笔者在研究生阶段做了2年的QT开发,那时候QT在嵌入式的图形开发中非常火,当时Nokia在智能机的份额还是第一。想当年,Nokia从Trolltech的手中收购了QT,当时大家还在例会上讨论QT终于不会夭折了(后来了解到,这点担心其实是杞人忧天,大名鼎鼎的KDE、Google Earth、Skype、Photoshop Elements等等正是使用其开发的Qt工具包。因此QT至少在嵌入式开发和桌面...

2014-01-17 14:38:00 144

Linux C 下的大文件操作

这里说的大文件指大小超过4G的文件。在32位环境下,linux默认打开、读、写超过4G的文件会返回错误。定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效。注意它必须定义在所有头文件之前。#ifndef _FILE_OFFSET_BITS#define _FILE_OFFSET_BITS 64#endif或者在编译时添加如下参数:-...

2014-01-13 16:23:00 228

Linux 共享内存 详解

一、什么是共享内存区共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序效率。共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。其他进...

2014-01-13 14:27:00 278

The Singularity is Near---预测人工智能,科技走向的神书---奇点临近

比尔盖茨评价本文作者:雷·库兹韦尔是我所知道的预测人工智能未来最权威的人。他的这本耐人寻味的书预测未来信息技术得到空前发展,将促使人类超越自身的生物极限——以我们无法想象的方式超越我们的生命。中文版已经由机械工业出版社出版, amazon 购买衔接这是本人研究生阶段参与翻译的。贴上译者序,让你了解本书,以及成为本书的fans:当人们看到太多相同的时候,也许我们很无知;当人们...

2014-01-07 12:53:00 334

使用github管理你的代码

关于为什么使用github,网上已经有很多讨论了。当然选择还有google code, Bitbucket,sourceforge。github有如下优势:1. github更有利于开源项目的发展source forge并没有充分体现这一点,它更像一个开源软件下载站。至于Google Code,这是个传奇。但是已经被新CEO布林颁布的大扫除政策打死了,属于边缘化业务,Google不会投入新...

2014-01-04 22:31:00 132

awk 详解+实例

1.awk简介awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要...

2014-01-03 10:06:00 76

sed-加速你在Linux的文件编辑

1.Sed简介sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介...

2014-01-03 10:01:00 82

工作中常用的Linux命令

1.从其他机器拷贝文件夹格式: scp -r 文件夹名 用户名@机器名:/路径范例: scp -rsearch work@zjm-testing-ps23.zjm.baidu.com:/home/work/2.查看哪个程序在用特定端口格式: netstat-nap | grep 端口号范例: netstat -nap| grep 80803.实时监控日志文件内容格...

2014-01-03 09:54:00 101

海量数据:判断一棵树是否为另一棵树的子树

T1是一棵含有几百万个节点的树,T2含有几百个节点。判断T2是否是T1 的子树。首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判断T2是否是T1的子树。假设T1的节点数为N,T2的节点数为M。遍历两棵树算法时间复杂性是O(N + M), 判断字符串是否为另一个字符串的子串的复杂性也是O( N + M)(比如使用KMP算法)。...

2013-12-28 19:35:00 202

检查一个二叉树是否平衡的算法分析与C++实现

今天面试一个实习生,就想既然是未出校园,那就出一个比较基础的题吧,没想到答的并不如人意,对于树的操作完全不熟悉,因此此题算是未作答。原来我想看一下他分析问题的思路,优化代码的能力。接下来会把最近半年我出的面试题整理出来,以来share给其它同事,而来算是自己校园记忆的一个总结,毕竟自己在项目中已经很久未用到这些知识。其实很多题目都是来源于CareerCup.com。这上面汇集了许多IT名企的面试笔...

2013-12-28 14:50:00 130

Cracking the Coding Interview:: 寻找有环链表的环路起始节点

给定一个有环链表,实现一个算法返回环路的开头节点。 这个问题是由经典面试题-检测链表是否存在环路演变而来。这个问题也是编程之美的判断两个链表是否相交的扩展问题。首先回顾一下编程之美的问题。 由于如果两个链表如果相交,那么交点之后node都是共享(地址相同)的,因此最简单暴力的方法就是两个for循环,判断该链表的node是否属于另外一个链表。但是这个算法复杂度是O(length1 * lengt...

2013-12-25 13:07:00 98

C++11:使用 auto/decltype/result_of使代码可读易维护

C++11 终于加入了自动类型推导。以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用“原生态”的自动类型推导了!C++引入自动的类型推导,并不是在向动态语言(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java;弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的...

2013-12-23 18:04:00 664 1

C++ 仿函数/函数指针/闭包lambda

在上一篇文章中介绍了C++11新引入的lambda表达式(C++支持闭包的实现),现在我们看一下lambda的出现对于我们编程习惯的影响,毕竟,C++11历经10年磨砺,出140新feature,对于我们的programming idiom有深远影响。我们先看一下是不是lambda的出现对于仿函数的影响。1) 仿函数wikipedia 的定义:A function objec...

2013-12-21 17:59:00 346

C++闭包: Lambda Functions in C++11

表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅、更快速! 它实现了C++11对于支持闭包的支持。首先我们先看一下什么叫做闭包维基百科上,对于闭包的解释是:In programming languages, a closure (also lexical closure orfunction closure) is afunction or r...

2013-12-20 17:29:00 254

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除