- 博客(88)
- 资源 (19)
- 收藏
- 关注
原创 一个简单RPC框架是如何炼成的(VI)——引入服务注册机制
开局篇我们说了,RPC框架的四个核心内容:RPC数据的传输, RPC消息协议, RPC服务注册, RPC消息处理。接下来处理RPC服务的注册机制。所谓注册机制,就是Server需要声明支持哪些rpc方法,然后当客户端发送调用某个声明的rpc方法之后,服务端能自动找到执行该请求的具体方法。1. 引入服务注册的方式也是为了代码解耦,将req的处理与具体的req消息内容解耦。2. 上面我们 引入了两种服务注册的方式,一种方式是普通的方式,逐个添加方法。另一种方式通过python的“反射”技术,自动查找一个服务
2015-07-20 22:52:08
3846
原创 一个简单RPC框架是如何炼成的(V)——引入传输层
开局篇我们说了,RPC框架的四个核心内容RPC数据的传输。RPC消息 协议RPC服务注册RPC消息处理 接下来处理数据传输。实际应用场景一般都是基于socket。socket代码比较多,使用起来也比较麻烦。而且具体的传输通道使用socket或者其他的方式,如更上层的http,或者android里的binder,都是可替换的,只是具体的一种实现而已。所以,这里我就偷个懒,只是
2015-07-20 22:47:41
2111
原创 一个简单RPC框架是如何炼成的(IV)——实现RPC消息的编解码
之前我们制定了一个很简单的RPC消息 的格式,但没有实现相应的encode和decode方法,下面我们处理掉这个编解码问题。这里我还是简单原则,重点在于晓义嘛。利用python里的两个运算。 str 和eval,实现编解码。
2015-07-19 19:29:16
2706
原创 一个简单RPC框架是如何炼成的(III)——实现带参数的RPC调用
上一篇,我们制定了一个很简单的RPC消息 的格式,但是还遗留了两个问题我们并没有实现相应的encode和decode方法,没有基于可以跨设备的字符串传输,而是直接的内存变量传递。现在的RPC request不支持带参数的请求命令。如add(a, b), 如何在RPC消息中描述参数a,b 。我先来实现第二个问题,即带参数的RPC调用。其实,也没什么太大不同。既然是要带参数,那
2015-07-19 08:39:23
5365
原创 一个简单RPC框架是如何炼成的(II)——制定RPC消息
开局篇我们说了,RPC框架的四个核心内容RPC数据的传输。RPC消息 协议RPC服务注册RPC消息处理下面,我们先看一个普通的过程调用class Client(object): def __init__(self): self.remote = None ## # 内部是委托给远程remote对象来获取结果。
2015-07-16 21:22:09
2821
原创 一个简单RPC框架是如何炼成的(I)——开局篇
开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架。RPC(Remote Procedure Call Protocol)——远程过程调用协议,基于C/S模型。有四个核心内容:RPC数据的传输,RPC消息的表示与编解码,RPC服务注册,RPC消息的任务处理机。这个RPC框架的搭建,庄稼人将采用python作为开发语言,是从原始的普通调用开始,然后一步步的演化,最后生成一个完整的Rpc框架
2015-07-16 21:20:04
9289
原创 读书报告之《修改代码的艺术》 (III)
《修改代码的艺术》,每次读来,都会相当重构,正如作者自己就说到的:从技术上讲,书中列到的解依赖技术,都是重构技术,因为他们都保持了代码的行为。这里庄稼人再多引用《大话重构》中的一句话:先重构我们的系统,使之可以应付那个需求,然后再添加代码,实现新需求。是的,正如读书报告(I)中所阐述的,引入单元测试,本质上就是做定制需求。作为最后一篇,来总结一下最后的解依赖技术。核心思想就是泛化,这里
2015-07-06 22:11:56
913
原创 读书报告之《修改代码的艺术》 (II)续2
修改if else 最忌惮的是天马行空,自负自己对代码的理解,直接重新改写条件语句。但另一方面,相信各位看官也注意到了,理解又是必不可少的,完全死死的做逻辑变形是异常繁琐的(这个在第二个例子中尤为明显),具体如何操作,不好意思,这就是"修改代码的艺术"。口才不行,修行还靠个人。 不要做不成熟的优化。相对来说,代码的清晰度高于性能的优化,而且很多时候两者并不是冲突的,当代码更清新了,往往有更好的优化方案。 举例中的一些代码风格,比如return快速返回,不是每个人都能接受。求同存异,这也是个人座右铭。
2014-09-08 22:27:52
1306
原创 读书报告之《修改代码的艺术》 (II)续
这里作为(II)的续篇,继续距离 复杂的嵌套if else 的处理。 为了保持篇幅不会太长,所以截断了,以一篇新的文章形式给出。化简复杂的if else语句,基本的手段针对头重脚轻的if else,使用return快速返回,从而减少嵌套层数。合并分支。有些分支的执行内容相同,往往意味着可以合并为一个分支扁平化。第二个例子,比较复杂一点,给定一个日期,即年 月 日,让
2014-09-06 09:50:10
1172
原创 读书报告之《修改代码的艺术》 (II)
4. 修改时应当测试哪些方法作者提出了影响结构图的概念。说穿了,就是CallRelation和ReferenceRelation,就是查看某个方法(变量)被哪些方法引用,以及自身又引用了哪些方法,依次类推。这个复杂的关系网实际就是一颗风险评估树(图)。通过这棵树,我们可以知道某个修改会影响到哪些节点。这项参数,既是风险的直接量化指标,同时又是验证修改的测试指标。这是很朴素的思想,不管有意无意,你肯定已经在这么做了,不要告诉我你的boss从来没问过你这样的问题:“这个修改有风险吗?”。
2014-09-05 23:39:09
1342
原创 读书报告之《修改代码的艺术》 (I)
《修改代码的艺术》,英文名《Working Effectively with Legacy Code》,中文翻译的文笔上绝对谈不上“艺术”二字,愧对艺术二字(当然译者不是这个意思)。书中第三部分不论是例子还是解说都有点混乱,远不如《重构——改善既有代码设计》一书。此书精华在于第一、二部分。如何学习这本书,作为一个最底层的码农,作为长期在别人代码上修修补补的苦逼二手货开发人员,我只能给的建议就是
2014-09-05 00:20:38
4575
原创 python 计算校验和
校验和是经常使用的,这里简单的列了一个针对按字节计算累加和。其实,这种累加和,使用将字节翻译为无符号整数和带符号整数,结果是一样的。使用python计算校验和时记住做截断就可以了。 这里仅仅是作为一个代码样本,权作标记,直接上代码'''Created on 2014年9月4日@author: lenovo'''import random'''实际计算校验和时,解释为无符号整
2014-09-04 22:05:28
14751
2
原创 python常用的十进制、16进制、字符串、字节串之间的转换(长期更新帖)
进行协议解析时,总是会遇到各种各样的数据转换的问题,这里详细列举了整数之间的进制转换,以及整数、字符串、字节串三者之间的相互转换。当然仅仅是抛砖引玉,有更好更简单的方法,欢迎欢迎
2014-08-27 00:19:41
292527
17
原创 doxygen + doxypypy + docstring 生成python文档
虽然doxygen声称可以同时支持两种风格的python注释,原生的docstring和类似java doc风格的##。但实际对原生的docstring支持并不好。这里介绍了一个开源的doxypypy工具,可以将原生的docstring转换为类java doc风格的##, 从而实现doxygen对python原生docstring的完美支持,同时也自然而然支持使用@tag。
2014-08-24 21:18:45
9628
原创 用python实现wireshark的follow tcp stream功能
长话短说,wireshark有一个follow tcp stream功能,这个功能很方便。美中不足的是提取出的stream 数据没有时间戳等其他信息,在分析数据的延时和丢包问题时就有些力不从心了。这里简单用python实现了一个简单follow tcp stream功能,同时保留了tcp信息。原理很简单,仍然是基于wireshark,里面有一个Export packet dissect
2014-08-20 22:09:12
15683
原创 repo sync 时自动切换当前分支的remote track分支的问题
使用repo sync时,如果当前仓库有检出本地分支,假设为dev, 对应的远程track分支为origin/dev。 而manifest.xml中指定的track分支为origin/master,那么在repo sync时会自动将当前的dev分支的远程track分支修改为origin/master, 不仅如此,同时还会将origin/master上的修改rebase到本地的这个dev分支上。
2014-07-23 23:34:44
4897
转载 Git图形用户工具介绍及比较
GITK简介 gitk - The git repository browser Displays changes in a repository or a selected set of commits. This includes visualizing the commit graph, showing information
2014-07-23 22:01:16
1849
原创 命令行执行python模块时提示包找不到的问题
庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具。多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可以运行任意一个python脚本,而使用命令行运行却不行?命令行下(或者双击执行)总是提示“ImportError: No module named xxx”?pydev究竟做了什么魔术呢?长
2014-05-11 17:01:14
65745
7
原创 通用makefile是如何炼成的(XI)--最后的完结篇,envsetup.sh
长话短说,没有envsetup.sh, 当你需要单独编译一个模块,或者做点其他工作时,你总是会感到为什么命令行总是那么麻烦!有了envsetup.sh, 对命令行人生有新的感悟,原来我也可以做一个简单的“菜鸟”。这个envsetup.sh是从android的代码中考过来的,做了很大的简化。google他奶奶的太细心和繁琐了,这里用不着可用通过usage命令查询,目前仅支持genmk
2014-01-14 22:39:31
2239
11
原创 通用makefile是如何炼成的(X)—— 导入单元测试
经过这么长的时间,我们的通用makefile已基本构建完成,下面使用一个具体的Examle,作为如何使用的说明。我们这个例子为之前写的hello world编写单元测试。单元测试的工具使用gtest,比较简单嘛。从官网上下载gtest源码包,解压后,里面有个fused-src目录,在里面就是gtest文件夹,包括1个头文件gtest.h, 两个源文件gtest_all.cc, gt
2014-01-13 23:25:57
3558
原创 通用makefile是如何炼成的(Ⅸ)整体框架
通用makefile系列收视率比较惨淡,工程本身也进入尾期,这里直接大跃进喽上类图类图画得不好,所以下面文字简单解释1. 整个通用makefile分为若干大块,也就是上面用包表示的部分,主要是产品Product,编译平台Platform,操作系统System,模块Module,编译目标Target,以及Build和Path这两块。 产品Product,编译平台P
2014-01-08 23:11:41
1682
原创 linux shell中的命令自动补全(compgen complete)与 命令行参数解析
很多时候,当我们写一个脚本时,我们总会一些可选的命令选项。当可选项比较多的时候,比如git, 那么如果能够提供命令自动补全,无疑是锦上添花。而且个人认为,这种方式,比采用将命令做成选择菜单要更好一些。假设我们现在这样一个脚本,脚本执行命令时bsu, 类似git,脚本有两个一级主命令pushbaseline, createrepo,然后这两个一级主命令下还有若干选项pushbase
2013-12-31 21:56:13
29524
2
原创 通用makefile是如何炼成的(VIII)
” 停在这里不敢走下去, 让悲伤无法上演 下一页你亲手写上的离别, 由不得我拒绝 这条路我们走得太匆忙, 拥抱着并不真实的欲望, 来不及等不及回头欣赏“(摘自《步步惊心 》片尾曲 《三寸天堂》)走到这里,实际上我们的makefile框架已经是搭得差不多了。这一路小跑过来,感觉一切都很美好,实际上我想,我们只是太匆忙,来不及细细回想。如果
2013-12-26 22:31:01
6004
1
原创 通用makefile是如何炼成的(VII)
上一次我们试图引入多模块,结果失败了,今天我们来帮助失败实现做母亲的愿望。在正式开始之前,先做一个孕前检查我们上一次的失败原因有两个1. 编译目标重定义。2. 一些变量定义被覆盖。这些实际上是递归形式的多模块makefile必然要遇到的两个问题。对症下药的药方就是makefile中的“多规则目标”(具体参看makefile必知必会),简单而言就是三句话:makefile允许目标的依赖关系通过多个规则定义,但是实现该目标的命令只能在一个规则中定义,实现时会自动合并该目标所有的依赖关系。下面来
2013-12-26 21:54:56
1949
3
原创 通用makefile是如何炼成的(VI)
今天我们尝试引入多模块,这次很有必要的。模块化开发嘛既然是多模块,首先应该引入模块的概念,module.mk. 直接将main.mk中的内容移动到module.mk即可编译时就会发现一堆错误,主要是有这么几个问题1. 提示编译目标clean重定义。 这个原因是makefile允许目标的依赖关系多次定义,但是实现目标的命令只能在一个规则处定义。当我们include多个module.mk时,显然clean目标被重复定义了2. 有些变量的值有些莫名其妙了,特别是OBJS, DEPS,等,
2013-12-24 22:09:48
2286
原创 通用makefile是如何炼成的(V)
相关的生成obj的编译规则,自动导出头文件依赖关系的命令,以及生成可执行文件的规则,都集中到executable.mk。这时,我猜你肯定会立马相当,是不是还要有一个static-library.mk, shared-library.mk?binggo,这是必须的。(这里简化起见,我只讨论static-library.mk)。当开始专注于编写static-library.mk时,会发现obj的生成规则可以复用,所以我们又将obj的生成规则集中到object.mkTARGET:=hello.exe#
2013-12-24 22:07:53
3169
2
原创 通用makefile是如何炼成的(IV)
要解决这个头文件依赖关系的自动推导问题,呵呵,GNU中直接有尚方宝剑MMD,MF, MT。走到这里,感觉人生已经无欲无求了,通用makefile真的已经通用了。However,我又是看得太远,看这段makefile,我想到两个问题1. 上面的生成obj文件和.exe文件的代码是很形式化的,如果可以应该同product一样,单独归类到某个文件夹中,防止在修改makefile时不小心改了这些代码2. 如果我是多模块编译,怎么办呢?路漫漫其修远兮,吾将上下而求索...
2013-12-24 22:05:07
2049
原创 通用makefile是如何炼成的(III)
类似于产品信息,对平台相关的信息,我们也提供了一个定制化途径,通过加载PLATFORMS_SPECS指定的mk文件,定制平台信息。对System,我们没有提供额外的客制化手段,这是因为操作系统是固定的,不会在编译过程中发生改变,一般直接在system.mk中配置即可。
2013-12-23 19:58:13
1750
原创 通用makefile是如何炼成的(II)
上一次我们完成了圈地运动,顺利拍下一块叫做build的地块。今天,我们就要在上面立个牌坊一般情况下,我们总会在makefile中加入一些产品信息。比如产品名称,版本号,以及产品的特性开关(宏),等等。今天的工作就是加入产品信息,并同时与makefile解耦。
2013-12-23 19:57:00
1627
原创 通用makefile是如何炼成的(I)
这个系列会一步步的从最简单的makefile逐步导向一个较为通用的makefile(没有“复杂”两字)。您可以在这个过程中,学到makefile的基本语法,也可以学到makefile的常见技巧,同时我相信,您也会对如何做代码修改有所领悟
2013-12-23 19:53:00
1732
转载 windows下git bash 乱码的问题解决
http://blog.youkuaiyun.com/self001/article/details/7337182
2013-12-12 23:19:54
867
原创 makefile必知必会(II)
makefile必知必会(II)定义变量makefile的变量定义有三种方式1. 立即赋值 a:=b2. 延迟赋值 a=b3. 条件赋值 a?=b4. 附加赋值 a+=b它们之间的区别是,第一种方式,会立即计算b的值,并赋值给a;第二种方式,相当于C++和java的引用。如果后面b的值改变了,那
2013-12-11 23:06:33
6213
原创 最新pydev(3.0)安装后 没有菜单显示的问题
下载最新的pydev,安装过程一切正常,而且查看已安装软件时可以看到pydev,但菜单栏和设置中就是没有pydev,也不能新建python工程。原因:最新pydev要求Java7,故将jdk升级到1.7后,重新安装一遍pydev就可以正常看到菜单了。 下面是官方release说明:Release 3.0From now on, PyDev requires
2013-12-03 23:32:49
3672
原创 makefile 必知必会
Makefile 必知必会Makefile的根本任务是根据规则生成目标文件。规则一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令。规则: 目标文件>:依赖文件> 更新目标的命令> PS:更新目标命令必须以tab开头,这个有点恶心。Example
2013-12-02 22:54:39
4802
1
转载 编译链接5大潜规则
转自:http://blog.youkuaiyun.com/zdl1016/article/details/9015447潜规则1:当一个符号在多个目标文件(.o)里同时出现时, LD报错. 提示符号多重定义.当一个符号在多个静态库(.a)里同时出现时, LD不报错, 以第一个遇到的为准. 并且不会有任何warning提示 !!! 这个潜规则可能导致很多意想不到的问
2013-12-02 21:42:59
1284
转载 C/C++ 头文件以及库的搜索路径
转自:http://blog.sina.com.cn/s/blog_7195909a0100zi7i.html关键点: 1. #include 不会搜索当前目录 2. 使用 -I 参数指定的头文件路径仅次于 搜索当前路径。 3. gcc -E -v 可以输出头文件路径搜索过程C++编译
2013-11-28 22:16:11
40899
原创 设计模式推演——装饰已有对象(Proxy/Decorator)
上一篇文章中,我们提到OO中复用的方式有两种,组合和继承。一般情况下,应该尽可能使用组合的方式。现在以复用为基本需求,推演若干常见组合型模式1. Decorator模式 需求:我们已经有一群对象,现在想统一为这些对象添加若干新特性。更重要的是,这些新特性可以反复叠加于某个对象,或者只选择部分特性作用于某个对象。条件:如果这个特性的实现不依赖于具体的对象,就如同添加一个装
2013-05-08 23:33:37
1656
原创 设计模式推演——整合已有系统接口(Facade/Adapter)
上一篇文章中,我们提到OO中复用的方式有两种,组合和继承。一般情况下,应该尽可能使用组合的方式。现在以复用为基本需求,推演若干常见组合型模式1. Facade模式 当整合已有系统接口时,或者跨层调用接口时,如果出现a. 觉得接口过多。那么可以根据特定的应用情景,提炼出一个最小覆盖子集,或者只是最常用的接口集。b. 觉得接口难用。那么可以通过封装,对原来做一些变形。这就是
2013-05-08 21:46:58
1554
原创 设计模式推演——组合与继承
OO中,复用代码可以有组合和继承两种方式,正如广大人民群众所论述的,尽可能使用组合。这里我再不厌其烦的说明一下理由:1. 组合比继承在框架结构上要简单,不会造成过深的继承层次。2. 组合是黑盒重用,抽象层次更高。其实上面这两条我觉得也没啥,重点还是下面三条:3.组合可以在运行时动态选择复用的对象,而继承不行。直接上图,相信您看一眼就明白了当Stack复用Sequen
2013-05-05 23:24:15
3860
doxypypy--- Doxygen filter for Python
2014-08-24
TCPParser -- follow tcp stream by python
2014-08-20
CommonMakefile的帮助文档
2014-08-12
通用的makefile模板
2014-01-14
重构——改善既有代码的示例代码
2013-04-10
windows下的android源码的批量git处理脚本
2012-06-30
android adb log查看工具
2012-06-23
深入C++对象模型的读书笔记
2012-06-22
C++ProgrammingGuide
2012-06-22
Git常用操作
2012-06-22
git基本操作
2012-06-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人