<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[crylearner的专栏]]></title><description><![CDATA[about C/C++ , data structure and algorithm]]></description><link>https://blog.youkuaiyun.com/crylearner</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; crylearner]]></copyright><item><title><![CDATA[一个简单RPC框架是如何炼成的(VI)——引入服务注册机制]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46952977</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46952977</guid><author>crylearner</author><pubDate>Mon, 20 Jul 2015 22:52:08 +0800</pubDate><description><![CDATA[开局篇我们说了，RPC框架的四个核心内容:RPC数据的传输, RPC消息协议, RPC服务注册, RPC消息处理。
接下来处理RPC服务的注册机制。所谓注册机制，就是Server需要声明支持哪些rpc方法，然后当客户端发送调用某个声明的rpc方法之后，服务端能自动找到执行该请求的具体方法。1. 引入服务注册的方式也是为了代码解耦，将req的处理与具体的req消息内容解耦。
2. 上面我们 引入了两种服务注册的方式，一种方式是普通的方式，逐个添加方法。另一种方式通过python的“反射”技术，自动查找一个服务]]></description><category></category></item><item><title><![CDATA[一个简单RPC框架是如何炼成的(V)——引入传输层]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46952765</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46952765</guid><author>crylearner</author><pubDate>Mon, 20 Jul 2015 22:47:41 +0800</pubDate><description><![CDATA[开局篇我们说了，RPC框架的四个核心内容



RPC数据的传输。RPC消息 协议RPC服务注册RPC消息处理   
接下来处理数据传输。实际应用场景一般都是基于socket。socket代码比较多，使用起来也比较麻烦。而且具体的传输通道使用socket或者其他的方式，如更上层的http，或者android里的binder，都是可替换的，只是具体的一种实现而已。所以，这里我就偷个懒，只是]]></description><category></category></item><item><title><![CDATA[一个简单RPC框架是如何炼成的(IV)——实现RPC消息的编解码]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46900203</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46900203</guid><author>crylearner</author><pubDate>Sun, 19 Jul 2015 19:29:16 +0800</pubDate><description><![CDATA[之前我们制定了一个很简单的RPC消息 的格式，但没有实现相应的encode和decode方法，下面我们处理掉这个编解码问题。这里我还是简单原则，重点在于晓义嘛。利用python里的两个运算。 str 和eval，实现编解码。]]></description><category></category></item><item><title><![CDATA[一个简单RPC框架是如何炼成的(III)——实现带参数的RPC调用]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46899687</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46899687</guid><author>crylearner</author><pubDate>Sun, 19 Jul 2015 08:39:23 +0800</pubDate><description><![CDATA[上一篇，我们制定了一个很简单的RPC消息 的格式，但是还遗留了两个问题


我们并没有实现相应的encode和decode方法，没有基于可以跨设备的字符串传输，而是直接的内存变量传递。现在的RPC request不支持带参数的请求命令。如add(a, b), 如何在RPC消息中描述参数a,b 。
我先来实现第二个问题，即带参数的RPC调用。

其实，也没什么太大不同。既然是要带参数，那]]></description><category></category></item><item><title><![CDATA[一个简单RPC框架是如何炼成的(II)——制定RPC消息]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46899083</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46899083</guid><author>crylearner</author><pubDate>Thu, 16 Jul 2015 21:22:09 +0800</pubDate><description><![CDATA[开局篇我们说了，RPC框架的四个核心内容


RPC数据的传输。RPC消息 协议RPC服务注册RPC消息处理
下面，我们先看一个普通的过程调用
class Client(object):
    
    def __init__(self):
        self.remote = None
    
    ##
    # 内部是委托给远程remote对象来获取结果。]]></description><category></category></item><item><title><![CDATA[一个简单RPC框架是如何炼成的(I)——开局篇]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46898537</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46898537</guid><author>crylearner</author><pubDate>Thu, 16 Jul 2015 21:20:04 +0800</pubDate><description><![CDATA[开场白，这是一个关于RPC的相关概念的普及篇系列，主要是通过一步步的调整，提炼出一个相对完整的RPC框架。
RPC（Remote Procedure Call Protocol）——远程过程调用协议，基于C/S模型。有四个核心内容：RPC数据的传输，RPC消息的表示与编解码，RPC服务注册，RPC消息的任务处理机。这个RPC框架的搭建，庄稼人将采用python作为开发语言，是从原始的普通调用开始，然后一步步的演化，最后生成一个完整的Rpc框架]]></description><category></category></item><item><title><![CDATA[读书报告之《修改代码的艺术》 (III)]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/46779419</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/46779419</guid><author>crylearner</author><pubDate>Mon, 06 Jul 2015 22:11:56 +0800</pubDate><description><![CDATA[《修改代码的艺术》，每次读来，都会相当重构，正如作者自己就说到的：从技术上讲，书中列到的解依赖技术，都是重构技术，因为他们都保持了代码的行为。这里庄稼人再多引用《大话重构》中的一句话：先重构我们的系统，使之可以应付那个需求，然后再添加代码，实现新需求。是的，正如读书报告（I）中所阐述的，引入单元测试，本质上就是做定制需求。


作为最后一篇，来总结一下最后的解依赖技术。核心思想就是泛化，这里]]></description><category></category></item><item><title><![CDATA[读书报告之《修改代码的艺术》 (II)续2]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/39138741</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/39138741</guid><author>crylearner</author><pubDate>Mon, 08 Sep 2014 22:27:52 +0800</pubDate><description><![CDATA[修改if else 最忌惮的是天马行空，自负自己对代码的理解，直接重新改写条件语句。但另一方面，相信各位看官也注意到了，理解又是必不可少的，完全死死的做逻辑变形是异常繁琐的（这个在第二个例子中尤为明显），具体如何操作，不好意思，这就是"修改代码的艺术"。口才不行，修行还靠个人。
	不要做不成熟的优化。相对来说，代码的清晰度高于性能的优化，而且很多时候两者并不是冲突的，当代码更清新了，往往有更好的优化方案。
	举例中的一些代码风格，比如return快速返回，不是每个人都能接受。求同存异，这也是个人座右铭。
	]]></description><category></category></item><item><title><![CDATA[读书报告之《修改代码的艺术》 (II)续]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/39090283</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/39090283</guid><author>crylearner</author><pubDate>Sat, 06 Sep 2014 09:50:10 +0800</pubDate><description><![CDATA[这里作为(II)的续篇，继续距离 复杂的嵌套if else 的处理。 为了保持篇幅不会太长，所以截断了，以一篇新的文章形式给出。
化简复杂的if else语句，基本的手段



针对头重脚轻的if else，使用return快速返回，从而减少嵌套层数。合并分支。有些分支的执行内容相同，往往意味着可以合并为一个分支扁平化。


第二个例子，比较复杂一点，给定一个日期，即年 月 日，让]]></description><category></category></item><item><title><![CDATA[读书报告之《修改代码的艺术》 (II)]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/39086163</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/39086163</guid><author>crylearner</author><pubDate>Fri, 05 Sep 2014 23:39:09 +0800</pubDate><description><![CDATA[4. 修改时应当测试哪些方法
作者提出了影响结构图的概念。说穿了，就是CallRelation和ReferenceRelation，就是查看某个方法(变量)被哪些方法引用，以及自身又引用了哪些方法，依次类推。这个复杂的关系网实际就是一颗风险评估树(图)。通过这棵树，我们可以知道某个修改会影响到哪些节点。这项参数，既是风险的直接量化指标，同时又是验证修改的测试指标。这是很朴素的思想，不管有意无意，你肯定已经在这么做了，不要告诉我你的boss从来没问过你这样的问题：“这个修改有风险吗？”。]]></description><category></category></item><item><title><![CDATA[读书报告之《修改代码的艺术》 (I)]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/39063441</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/39063441</guid><author>crylearner</author><pubDate>Fri, 05 Sep 2014 00:20:38 +0800</pubDate><description><![CDATA[《修改代码的艺术》，英文名《Working Effectively with Legacy Code》，中文翻译的文笔上绝对谈不上“艺术”二字，愧对艺术二字（当然译者不是这个意思）。书中第三部分不论是例子还是解说都有点混乱，远不如《重构——改善既有代码设计》一书。此书精华在于第一、二部分。
如何学习这本书，作为一个最底层的码农，作为长期在别人代码上修修补补的苦逼二手货开发人员，我只能给的建议就是]]></description><category></category></item><item><title><![CDATA[python 计算校验和]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/39060185</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/39060185</guid><author>crylearner</author><pubDate>Thu, 04 Sep 2014 22:05:28 +0800</pubDate><description><![CDATA[校验和是经常使用的，这里简单的列了一个针对按字节计算累加和。其实，这种累加和，使用将字节翻译为无符号整数和带符号整数，结果是一样的。
使用python计算校验和时记住做截断就可以了。 这里仅仅是作为一个代码样本，权作标记，直接上代码
'''
Created on 2014年9月4日

@author: lenovo
'''
import random

'''
实际计算校验和时，解释为无符号整]]></description><category></category></item><item><title><![CDATA[python常用的十进制、16进制、字符串、字节串之间的转换（长期更新帖）]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/38521685</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/38521685</guid><author>crylearner</author><pubDate>Wed, 27 Aug 2014 00:19:41 +0800</pubDate><description><![CDATA[进行协议解析时，总是会遇到各种各样的数据转换的问题，这里详细列举了整数之间的进制转换，以及整数、字符串、字节串三者之间的相互转换。当然仅仅是抛砖引玉，有更好更简单的方法，欢迎欢迎]]></description><category></category></item><item><title><![CDATA[doxygen + doxypypy + docstring 生成python文档]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/38798455</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/38798455</guid><author>crylearner</author><pubDate>Sun, 24 Aug 2014 21:18:45 +0800</pubDate><description><![CDATA[虽然doxygen声称可以同时支持两种风格的python注释，原生的docstring和类似java doc风格的##。但实际对原生的docstring支持并不好。这里介绍了一个开源的doxypypy工具，可以将原生的docstring转换为类java doc风格的##， 从而实现doxygen对python原生docstring的完美支持，同时也自然而然支持使用@tag。]]></description><category></category></item><item><title><![CDATA[用python实现wireshark的follow tcp stream功能]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/38712349</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/38712349</guid><author>crylearner</author><pubDate>Wed, 20 Aug 2014 22:09:12 +0800</pubDate><description><![CDATA[长话短说，wireshark有一个follow tcp stream功能，这个功能很方便。美中不足的是提取出的stream 数据没有时间戳等其他信息，在分析数据的延时和丢包问题时就有些力不从心了。这里简单用python实现了一个简单follow tcp stream功能，同时保留了tcp信息。


原理很简单，仍然是基于wireshark，里面有一个Export packet dissect]]></description><category></category></item><item><title><![CDATA[repo sync 时自动切换当前分支的remote track分支的问题]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/38072373</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/38072373</guid><author>crylearner</author><pubDate>Wed, 23 Jul 2014 23:34:44 +0800</pubDate><description><![CDATA[使用repo sync时，如果当前仓库有检出本地分支，假设为dev, 对应的远程track分支为origin/dev。 而manifest.xml中指定的track分支为origin/master,那么在repo sync时会自动将当前的dev分支的远程track分支修改为origin/master, 不仅如此，同时还会将origin/master上的修改rebase到本地的这个dev分支上。]]></description><category></category></item><item><title><![CDATA[Git图形用户工具介绍及比较]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/38071287</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/38071287</guid><author>crylearner</author><pubDate>Wed, 23 Jul 2014 22:01:16 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[命令行执行python模块时提示包找不到的问题]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/25430621</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/25430621</guid><author>crylearner</author><pubDate>Sun, 11 May 2014 17:01:14 +0800</pubDate><description><![CDATA[庄稼人不是专职python开发的道友，虽然与python相识已多年，可惜相识不相知，只是偶尔借助pydev写一些简单的小工具。
多年来，一直困惑于这样一个问题：同样的工程，同样的代码，使用pydev可以运行任意一个python脚本，而使用命令行运行却不行？命令行下（或者双击执行）总是提示“ImportError: No module named xxx”？pydev究竟做了什么魔术呢？

长]]></description><category></category></item><item><title><![CDATA[多分支开发策略]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/18779137</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/18779137</guid><author>crylearner</author><pubDate>Sat, 25 Jan 2014 23:32:33 +0800</pubDate><description><![CDATA[分支策略

                                                                                                                                    author：crylearner
 

日常开发中几个常见过程

ü  功能开发 (开发人员)
ü  bu]]></description><category></category></item><item><title><![CDATA[通用makefile是如何炼成的（XI）--最后的完结篇，envsetup.sh]]></title><link>https://blog.youkuaiyun.com/crylearner/article/details/18277067</link><guid>https://blog.youkuaiyun.com/crylearner/article/details/18277067</guid><author>crylearner</author><pubDate>Tue, 14 Jan 2014 22:39:31 +0800</pubDate><description><![CDATA[长话短说，没有envsetup.sh, 当你需要单独编译一个模块，或者做点其他工作时，你总是会感到为什么命令行总是那么麻烦！有了envsetup.sh, 对命令行人生有新的感悟，原来我也可以做一个简单的“菜鸟”。
这个envsetup.sh是从android的代码中考过来的，做了很大的简化。google他奶奶的太细心和繁琐了，这里用不着
可用通过usage命令查询，
目前仅支持
genmk]]></description><category></category></item></channel></rss>