<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/fudan_abc</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; fudan_abc]]></copyright><item><title><![CDATA[代码质量保证体系——Linux]]></title><link>https://blog.csdn.net/fudan_abc/article/details/104558025</link><guid>https://blog.csdn.net/fudan_abc/article/details/104558025</guid><author>fudan_abc</author><pubDate>Fri, 28 Feb 2020 15:55:04 +0800</pubDate><description><![CDATA[疫情在肆虐，说心忧天下貌似有些大了，只能先说些小的，在这里尝试描述一下Linux为保证代码质量所做的努力，来完成这个主题的最后一篇，也希望这段不好的日子的最后篇章也早些到来。

编码规范

这一环节涵盖了两个方面的含义：一份行之有效的编码规范，加上一些辅助检查代码是否符合规范的工具。一个项目可以比作一个国家，这个项目采用的编程语言就是这个国家的官方语言，每个开发者使用这门语言在这个国家里表达自己的...]]></description><category></category></item><item><title><![CDATA[Linux开源存储网络详解]]></title><link>https://blog.csdn.net/fudan_abc/article/details/104038381</link><guid>https://blog.csdn.net/fudan_abc/article/details/104038381</guid><author>fudan_abc</author><pubDate>Sun, 19 Jan 2020 11:28:12 +0800</pubDate><description><![CDATA[这本《Linux开源网络全栈详解：从DPDK到OpenFlow》是那本《Linux开源存储全栈详解》的姊妹篇，把Linux开源网络相关的项目做了个梳理，对于想了解或参与网络相关项目开发的人来说，也会是个不错的参考。至于下面贴出来的序，容我偷了个懒，除了内容的编排，其他部分内容和存储那本雷同^-^

======================

自1991年Linux诞生，时间已经走过了接近三个十...]]></description><category></category></item><item><title><![CDATA[代码质量保证体系——OpenStack]]></title><link>https://blog.csdn.net/fudan_abc/article/details/104036274</link><guid>https://blog.csdn.net/fudan_abc/article/details/104036274</guid><author>fudan_abc</author><pubDate>Sun, 19 Jan 2020 08:52:37 +0800</pubDate><description><![CDATA[在这个到处都是“云里雾里”的云计算时代，如果不知道点OpenStack、Kubernetes等，出门都不好意思说自己是个程序猿了。

编码规范与代码静态检查

程序员最讨厌的四件事应该是：写注释，写文档，别人不写注释，别人不写文档。那么对于这样一个貌似很不好相处的群体，有人说，如果莎士比亚生活在当下，他会是一名科技作家，而且他座右铭会变成：“消灭世界上所有的程序员。”

消灭当然是做不到的，于是有...]]></description><category></category></item><item><title><![CDATA[代码质量保证体系（下）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/104001855</link><guid>https://blog.csdn.net/fudan_abc/article/details/104001855</guid><author>fudan_abc</author><pubDate>Thu, 16 Jan 2020 11:34:08 +0800</pubDate><description><![CDATA[书接上回，有关代码质量保证体系里勾兑的那些个卿卿我我，还有单元测试、持续集成、代码评审与重构需要与你道来。





单元测试

StackOverflow上一个有16.7k分的人问了个有关单元测试的问题“How deep are your unit tests?”，意思就是说“单元测试需要做多细？”，或者换句话说“单元测试的这个单元的粒度是怎样的？”

针对这个问题，下面的回答获得了压倒性的票...]]></description><category></category></item><item><title><![CDATA[代码质量保证体系（上）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/103952239</link><guid>https://blog.csdn.net/fudan_abc/article/details/103952239</guid><author>fudan_abc</author><pubDate>Mon, 13 Jan 2020 08:57:31 +0800</pubDate><description><![CDATA[比尔·盖茨说：“用代码行数来衡量编程的进度，就如同用航空器零件的重量来衡量航空飞机的制造进度一样。”所以，相对于代码的数量，我们通常更乐意去关注代码本身的质量，也因此，在开源社区里，除了某些特殊的目的，我们也更愿意去关注一个人被接受patch的数目，而不是这些patch里代码的行数。

对于“代码质量”的定义，我们应该每个人都能说个不尽相同的三言两语，但是更多的感觉可能是只可意会不可言传，很难真正...]]></description><category></category></item><item><title><![CDATA[Linux开源存储全栈详解]]></title><link>https://blog.csdn.net/fudan_abc/article/details/103857116</link><guid>https://blog.csdn.net/fudan_abc/article/details/103857116</guid><author>fudan_abc</author><pubDate>Mon, 06 Jan 2020 14:35:30 +0800</pubDate><description><![CDATA[最近和同事一起整了本书《Linux开源存储全栈详解：从Ceph到容器存储》，把Linux开源存储相关的项目做了个梳理，对于想了解或参与存储相关项目开发的人来说，应该会是个不错的参考。这里把当时写的序放上来：

======================

自1991年Linux诞生，时间已经走过了接近三个十年。即将而立之年的Linux早已没有了初生时的稚气，正在各个领域展示自己成熟的魅力。

以...]]></description><category></category></item><item><title><![CDATA[《Linux Pocket Guide 2e》中文版]]></title><link>https://blog.csdn.net/fudan_abc/article/details/8846504</link><guid>https://blog.csdn.net/fudan_abc/article/details/8846504</guid><author>fudan_abc</author><pubDate>Wed, 24 Apr 2013 20:27:05 +0800</pubDate><description><![CDATA[前段时间和朋友翻译了Linux Pocket Guide的第二版，这本书并不涉及任何kernel的内容，不过对于linux新手来说，放在手边当参考书还是蛮好的。:)
下面是译者序：

昨天参加一个careertalk的活动，有邀请几位嘉宾做一些有关职业规划的讲座，其中一位前辈着重强调了Mindset（心态）的问题：当我们是一个普通engineer的时候，我们这么写自己的report“I wo]]></description><category></category></item><item><title><![CDATA[Linux那些事儿 之 ext4文件系统(0) 引子]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7906608</link><guid>https://blog.csdn.net/fudan_abc/article/details/7906608</guid><author>fudan_abc</author><pubDate>Sat, 25 Aug 2012 13:47:53 +0800</pubDate><description><![CDATA[曾经以为人生就这样了，浮躁的心拒绝再看代码。然而来到美国两年之后，我于本月初去了一趟拉斯维加斯，发现在那儿找个美国小姐要八百美金，而且还不是包夜。当那个金发美女都已经走进我的房间，我却因为价钱太贵承受不起而决定取消的时候，我觉得我的人生真是太失败了。那晚，看她出去之后，我内心一阵郁闷，于是打开电脑开始看A片，怎奈看到一半电脑竟然说文件系统崩溃了。我心想ext4文件系统不是号称很强大吗，怎么这么容易]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（37）迷雾重重的批量传输（六）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7542018</link><guid>https://blog.csdn.net/fudan_abc/article/details/7542018</guid><author>fudan_abc</author><pubDate>Mon, 07 May 2012 13:09:04 +0800</pubDate><description><![CDATA[usb_stor_bulk_transfer_sglist()函数有一定的“蛊惑性”，我们前面说过，之所以采用sglist，就是为了提高传输效率。我们更知道，sg的目的就是让一堆不连续的buffers在一次DMA操作都传输出去。其实在USB的故事中，事情并非如此。不过如果你对USB Core里边的行为不关心的话，那就无所谓了。
423行，424行，退出或者断链接，就不要传递数据。
然后429行]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》第二版 前言]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7463469</link><guid>https://blog.csdn.net/fudan_abc/article/details/7463469</guid><author>fudan_abc</author><pubDate>Sun, 15 Apr 2012 19:23:14 +0800</pubDate><description><![CDATA[从开始写Ｌinux那些事儿系列文字开始，到如今已有四年多了，而从整理出版第一版到现在也已经一载有余了。期间不断有认识或不认识的朋友问我，怎么会想起写这么多如此可爱的文字，我的回答都是：娱乐自己，娱乐大家而已！
或许，大家早已经默认技术本是一个沉重或者说枯燥的话题，我们无法用一种娱乐的心态去看待它，甚至说很多人早已丧失了从中获取乐趣的能力。但是，一切本不该如此的，对于不管什么原因踏入这个行业的我们]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（36）迷雾重重的批量传输（五）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7334702</link><guid>https://blog.csdn.net/fudan_abc/article/details/7334702</guid><author>fudan_abc</author><pubDate>Thu, 08 Mar 2012 22:09:34 +0800</pubDate><description><![CDATA[在讲数据传输阶段之前，先解决刚才的历史遗留问题。usb_stor_bulk_transfer_buf()中，406行，有一个很有趣的函数interpret_urb_result()被调用。这个函数同样来自drivers/usb/storage/transport.c中：

265 static int interpret_urb_result(struct us_data*us, unsign]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（35）迷雾重重的批量传输（四）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7179798</link><guid>https://blog.csdn.net/fudan_abc/article/details/7179798</guid><author>fudan_abc</author><pubDate>Thu, 05 Jan 2012 23:16:21 +0800</pubDate><description><![CDATA[有时候我也被这个问题所困扰，我不知道是我不明白，还是这世界变化太快。连Linux中都引入了过期这么一个概念。设置一个时间，如果时间到了该做的事情还没有做完，那么某些事情就会发生。
比如需要烤蛋糕，现在是8点30，而我们要烤45分钟，所以希望闹钟9点一刻响，当时间到了，闹钟就如期待的一样，响个不停。在计算机中，也需要做这样的事情，有些事情，需要时间控制，特别是网络、通信等，凡是涉及数据传输，就得考]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（34）迷雾重重的批量传输（三）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7103914</link><guid>https://blog.csdn.net/fudan_abc/article/details/7103914</guid><author>fudan_abc</author><pubDate>Mon, 26 Dec 2011 19:58:11 +0800</pubDate><description><![CDATA[在usb_stor_Bulk_transport()中，这个函数中调用的第一个最重要的函数，那就是usb_stor_bulk_transfer_buf()。仍然是来自drivers/usb/stroage/transport.c：

391 int usb_stor_bulk_transfer_buf(struct us_data*us, unsigned int pipe,
392]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（33）迷雾重重的批量传输（二）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7075685</link><guid>https://blog.csdn.net/fudan_abc/article/details/7075685</guid><author>fudan_abc</author><pubDate>Thu, 15 Dec 2011 22:15:35 +0800</pubDate><description><![CDATA[其实故事已经讲了很久，但如果你觉得到这里你已经把故事都看明白了，那么你错了。不仅仅是错了。不信，我们就继续看，先看512行，us->transport()，这个函数指针同样是在storage_probe时被赋值，对于U盘，它遵守的是Bulk-Only协议，因此us->transport()被赋值为usb_stor_Bulk_transport()。来看usb_stor_Bulk_transport]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（32）迷雾重重的批量传输（一）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7047848</link><guid>https://blog.csdn.net/fudan_abc/article/details/7047848</guid><author>fudan_abc</author><pubDate>Tue, 06 Dec 2011 21:56:32 +0800</pubDate><description><![CDATA[374行，us->proto_handler()其实是一个函数指针，知道它指向什么吗?我们早在storage_probe()中，确切地说，在get_protocol()就赋了值，当时只知道是get protocol，却不知道究竟干什么用，现在该用上了，一个指针要是没什么用人家才不会为它赋值呢。当初我们就讲了，对于U盘，proto_handler被赋值为usb_stor_transparent_sc]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（31）SCSI命令之我型我秀]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7032686</link><guid>https://blog.csdn.net/fudan_abc/article/details/7032686</guid><author>fudan_abc</author><pubDate>Thu, 01 Dec 2011 22:49:50 +0800</pubDate><description><![CDATA[usb_stor_control_thread()基本讲完了，但是其中下面这几行，正是高潮中的高潮。所谓的批量传输，所谓的Bulk-Only协议。正是在这里体现出来的。
371           /* we've got a command, let's do it! */
372           else {
373               US_DEBUG(usb_stor_s]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（30）彼岸花的传说（The End）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7024700</link><guid>https://blog.csdn.net/fudan_abc/article/details/7024700</guid><author>fudan_abc</author><pubDate>Tue, 29 Nov 2011 20:00:36 +0800</pubDate><description><![CDATA[解决了这个INQUIRY的问题，我们就可以继续往下走了，372行，这就是真正的批量传输的地方，proto_handler()就是正儿八经的处理SCSI命令的函数指针。而usb_stor_control_thread之前的所有代码就是为了判断是不是有必要调用函数proto_handler()，比如超时了，比如模块该卸载了，比如设置断开flag了，比如要处理的就是这个有问题的INQUIRY等，这些情况]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（29）彼岸花的传说（八）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/7010159</link><guid>https://blog.csdn.net/fudan_abc/article/details/7010159</guid><author>fudan_abc</author><pubDate>Thu, 24 Nov 2011 23:24:11 +0800</pubDate><description><![CDATA[对于use_sg为0的情况，我们接下来再看168行，offset是函数调用传递进来的参数，注释里说得很清楚，就是用来标志偏移量的，每次复制几个字节它就增加几个字节，最大它也不能超过request_bufflen，这是显然的。usb_stor_access_xfer_buf()这个函数所做的事情就是从srb->request_buffer往buffer里边复制数据，或者反过来从buffer往srb-]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（28）彼岸花的传说（七）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/6997624</link><guid>https://blog.csdn.net/fudan_abc/article/details/6997624</guid><author>fudan_abc</author><pubDate>Mon, 21 Nov 2011 18:50:33 +0800</pubDate><description><![CDATA[很显然，我们是把为INQUIRY命令准备的数据保存到了我们自己定义的一个结构体中，即structdata_ptr[36]，但是我们是为了回应一个SCSI命令，最终需要知道答案的是SCSI核心层。正是它们传递了一个scsi_cmnd结构体下来，即srb。struct scsi_cmnd中有两个成员，即unsigned request_bufflen和void *request_buffer，应该把d]]></description><category></category></item><item><title><![CDATA[《Linux那些事儿之我是USB》我是U盘（27）彼岸花的传说（六）]]></title><link>https://blog.csdn.net/fudan_abc/article/details/6966911</link><guid>https://blog.csdn.net/fudan_abc/article/details/6966911</guid><author>fudan_abc</author><pubDate>Sun, 13 Nov 2011 22:15:17 +0800</pubDate><description><![CDATA[我们继续接着上一节往下看。fill_inquiry_response()，这个函数来自drivers/usb/storage/usb.c中。

266 void fill_inquiry_response(struct us_data *us,unsigned char *data,
267                unsigned int data_len)
268 {
269]]></description><category></category></item></channel></rss>