<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Opensource on Tony Bai</title><link>https://tonybai.com/tags/opensource/</link><description>Recent content in Opensource on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Sun, 15 Feb 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/opensource/index.xml" rel="self" type="application/rss+xml"/><item><title>拒绝 AI 署名！Go 核心团队在 AIGC 时代划下的“工程红线”</title><link>https://tonybai.com/2026/02/15/go-core-team-rejects-ai-authorship/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/02/15/go-core-team-rejects-ai-authorship/</guid><description>本文永久链接 – https://tonybai.com/2026/02/15/go-core-team-rejects-ai-authorship 大家好，我是Tony Bai。 在生成式 AI 狂飙突进的 2026 年，编程似乎变得前所未有的容易。Claude Code、Gemini Cli、Codex等 已经成为开发者的标配。然而，技术便利的背后，模糊的责任边界正在侵蚀软件工程的根基。 近日...</description></item><item><title>“退休”大佬的 AI 复出战：为了“好玩”，他写出了火遍全网的 Moltbot</title><link>https://tonybai.com/2026/01/30/clawdbot-author-peter-steinberger-full-interview/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/30/clawdbot-author-peter-steinberger-full-interview/</guid><description>本文永久链接 – https://tonybai.com/2026/mm/dd/clawdbot-author-peter-steinberger-full-interview 大家好，我是Tony Bai。 在硅谷，每天都有无数个 AI 项目诞生，它们大多有着精美的 Landing Page，有着宏大的融资计划，PPT 里写满了“颠覆行业”。 但最近，一个名为 **Clawdbot**（现已因商...</description></item><item><title>20 年 Java 老店的“背叛”：WSO2 为何高呼“Goodbye Java, Hello Go”？</title><link>https://tonybai.com/2026/01/29/wso2-goodbye-java-hello-go-tech-stack-shift/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/29/wso2-goodbye-java-hello-go-tech-stack-shift/</guid><description>本文永久链接 – https://tonybai.com/2026/01/29/wso2-goodbye-java-hello-go-tech-stack-shift 大家好，我是Tony Bai。 “当我们 2005 年创办 WSO2 时，开发服务端企业级基础设施的正确语言毫无疑问是：Java。然而，当我们走过第 20 个年头并展望未来时，情况已经变了。” 近日，全球知名的开源中间件厂商 WSO...</description></item><item><title>Kelsey Hightower 退休后的冷思考：为什么 10 年过去了，我们还在谈论容器？</title><link>https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age/</guid><description>本文永久链接 – https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age 大家好，我是Tony Bai。 “如果你在 2014 年告诉我，十年后我们还在讨论容器，我会觉得你疯了。但现在是 2025 年，我们依然在这里，谈论着同一个话题。” 在去年中旬举行的 ContainerDays Ha...</description></item><item><title>“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈：Go 的诞生、演进与未来</title><link>https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future/</guid><description>本文永久链接 – https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future 大家好，我是Tony Bai。 他是 Go 语言的第二代掌门人，在长达十余年的时间里，引领着 Go 从一个内部实验项目，成长为云原生时代的霸主。他也是 Plan 9 的资深黑客，贝尔实验室精神的传承者。如今，他已将 Go 的帅印交...</description></item><item><title>MinIO 开源版突发“安乐死”：维护模式开启，社区愤怒，你的数据还安全吗？</title><link>https://tonybai.com/2025/12/04/minio-enter-maintenance-mode/</link><pubDate>Thu, 04 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/04/minio-enter-maintenance-mode/</guid><description>本文永久链接 – https://tonybai.com/2025/12/04/minio-enter-maintenance-mode 大家好，我是Tony Bai。 “这个项目目前处于维护状态，不接受新的更改。” 近日，GitHub 上拥有近 60k Star、Go 语言生态中最著名的开源对象存储项目——MinIO，悄然修改了其 README。这一行看似平淡的声明，标志着 MinIO 开源版实...</description></item><item><title>从《凡人修仙传》看程序员境界：道友，你修炼到哪一层了？</title><link>https://tonybai.com/2025/09/08/fanren-xiuxian-programmer-levels/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/08/fanren-xiuxian-programmer-levels/</guid><description>本文永久链接 – https://tonybai.com/2025/09/08/fanren-xiuxian-programmer-levels 大家好，我是Tony Bai。 最近《凡人修仙传》的电视剧大火，想必各位道友都有耳闻。鄙人也没忍住，不仅刷完了杨洋主演的网剧，还趁着这股热乎劲儿，一口气在微信读书连读再听地补完了小说的人界篇。 当看到韩立资质平平，相貌普通，却凭着“小绿瓶”、远超常人的心...</description></item><item><title>Rob Pike的“抱怨”与Go的“解药”：直面软件膨胀的四大根源</title><link>https://tonybai.com/2025/04/27/rob-pike-on-bloat/</link><pubDate>Sun, 27 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/27/rob-pike-on-bloat/</guid><description>Rob Pike的“抱怨”与Go的“解药”：直面软件膨胀的四大根源 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ...</description></item><item><title>Go安全版图再添利器：OpenPubkey SSH开源，用SSO彻底改变SSH认证</title><link>https://tonybai.com/2025/03/31/openpubkey-ssh-open-source/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/03/31/openpubkey-ssh-open-source/</guid><description>Go安全版图再添利器：OpenPubkey SSH开源，用SSO彻底改变SSH认证 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go...</description></item><item><title>体验Gemini Deep Research：以Go语言未来演进方向分析为例</title><link>https://tonybai.com/2025/03/16/gemini-deep-research-experience/</link><pubDate>Sun, 16 Mar 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/03/16/gemini-deep-research-experience/</guid><description>本文永久链接 – https://tonybai.com/2025/03/16/gemini-deep-research-experience 基于大模型的AI已进入深度思考时代，以DeepSeek R1模型为代表的开源模型给主流AI厂商带来了巨大压力。其实早在2024年12月份，Google就在一篇名为“Try Deep Research and our new experimental mod...</description></item><item><title>Go语言之父的反思：我们做对了什么，做错了什么</title><link>https://tonybai.com/2024/01/07/what-we-got-right-what-we-got-wrong/</link><pubDate>Sun, 07 Jan 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/01/07/what-we-got-right-what-we-got-wrong/</guid><description>本文永久链接 – https://tonybai.com/2024/01/07/what-we-got-right-what-we-got-wrong 在《2023年Go语言盘点：稳中求新，稳中求变》和《Go测试的20个实用建议》两篇文章中，我都提到过已经退居二线的Go语言之父Rob Pike在Go开源14周年的那天亲自在GopherCon Australia 2023上发表了“What We G...</description></item><item><title>Service Weaver：以单体形式编码，以微服务形式部署</title><link>https://tonybai.com/2023/10/09/service-weaver-coding-in-monolithic-deploy-in-microservices/</link><pubDate>Mon, 09 Oct 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/10/09/service-weaver-coding-in-monolithic-deploy-in-microservices/</guid><description>本文永久链接 – https://tonybai.com/2023/10/09/service-weaver-coding-in-monolithic-deploy-in-microservices 分布式应用的主流架构模式演化为**微服务架构**已经有些年头了。微服务、DevOps、持续交付和容器技术(k8s)是构成最初云原生概念的核心要素。它们相生相拌，共同演进，并推动了云计算**全面进入云原...</description></item><item><title>Go是一门面向对象编程语言吗</title><link>https://tonybai.com/2023/03/12/is-go-object-oriented/</link><pubDate>Sun, 12 Mar 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/03/12/is-go-object-oriented/</guid><description>本文永久链接 – https://tonybai.com/2023/03/12/is-go-object-oriented Go语言已经开源13年了，在近期TIOBE发布的2023年3月份的编程语言排行榜中，Go再次冲入前十，相较于Go在2022年底的排名提升了2个位次： 《Go语言第一课》专栏中关于Go在这两年开始飞起的“预言”也正在逐步成为现实^\_^，大家学习Go的热情也在快速提升， 《Go...</description></item><item><title>Go 1.20中值得关注的几个变化</title><link>https://tonybai.com/2023/02/08/some-changes-in-go-1-20/</link><pubDate>Wed, 08 Feb 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/02/08/some-changes-in-go-1-20/</guid><description>本文永久链接 – https://tonybai.com/2023/02/08/some-changes-in-go-1-20 美国时间2023年2月1日，唯一尚未退休的Go语言之父Robert Griesemer代表Go核心开发团队在Go官博撰文正式发布了Go 1.20版本。就像Russ Cox在2022 GopherCon大会所说的那样：**Go2永不会到来，Go 1.x.y将无限延续**！ ...</description></item><item><title>Go，13周年[译]</title><link>https://tonybai.com/2022/11/11/go-opensource-13-years/</link><pubDate>Fri, 11 Nov 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/11/11/go-opensource-13-years/</guid><description>本文永久链接 – https://tonybai.com/2022/11/11/go-opensource-13-years 在中华大地的老百姓抱着手机进行双十一购物节狂欢，忙着支付尾款和秒杀的时候，Go核心团队的Russ Cox代表Go语言项目团队在Go官博上发表了《Thirteen Years of Go》的博文，纪念Go语言开源13周年，并对2021年以来Go语言的演进进行了归纳总结，对Go...</description></item><item><title>Ian Lance Taylor：Go泛型使用的一般准则</title><link>https://tonybai.com/2021/11/07/using-generics-in-go/</link><pubDate>Sun, 07 Nov 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/11/07/using-generics-in-go/</guid><description>本文永久链接 – https://tonybai.com/2021/11/07/using-generics-in-go 在近期Google Open Source Live的Go Day 2021环节，Go泛型的主要设计者Ian Lance Taylor做了Using Generics in Go的简短演讲(国内地址在这里)。这篇演讲的重点**不是即将于Go 1.18版本降临的Go泛型的语法细节...</description></item><item><title>计算重现性：一些挑战</title><link>https://tonybai.com/2019/11/19/computational-reproducibility-some-challenges/</link><pubDate>Tue, 19 Nov 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/11/19/computational-reproducibility-some-challenges/</guid><description>&amp;gt; 写在Go语言开源十周年的日子 by Rob Pike 近期，有人对科学结果的可重现性进行了讨论，并得出了一些让人沮丧的结论。一项研究表明：这种可重现性只有62％。 在某些领域，情况可能更糟。任何依赖于计算的结果都面临着其编程环境不断变化的巨大风险：十年前编写的程序如果没有更改，今天构建成功的机会几乎微乎其微，更不用说运行或正确运行了。 这种担忧并不普遍，但正在增长。一个标志就是**十年重现性挑...</description></item><item><title>Go语言开源十周年</title><link>https://tonybai.com/2019/11/09/go-opensource-10-years/</link><pubDate>Sat, 09 Nov 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/11/09/go-opensource-10-years/</guid><description>本文翻译自Go官方博客上Russ Cox代表Go核心团队发表的“Go Turns 10″一文。 **生日快乐，Go！** 这个周末，我们庆祝Go正式对外发布10周年，即Go作为开源编程语言和构建现代网络软件生态系统的10周年诞辰。 为了纪念这一时刻，Go gopher的创建者Renee French(用下面的新作)描绘了这个令人愉快的场景： 庆祝Go十周年让我回想起2009年11月上旬，那时我们正...</description></item><item><title>Go语言的遗产</title><link>https://tonybai.com/2019/11/04/the-legacy-of-go/</link><pubDate>Mon, 04 Nov 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/11/04/the-legacy-of-go/</guid><description>本文是gohugo作者Steve Francia在意大利佛罗伦萨举办的GoLab上分享的闭幕演讲讲稿的文字版，该演讲的主题为”Go的遗产”。该演讲讨论了Go语言继承的遗产，以及它是如何尊重这些遗产的，并在最后总结了Go希望留给后来者的遗产。 **演讲胶片** &amp;gt; 我们有责任保留好留给我们的遗产，并留下值得我们子孙后代继承的遗产 – 克里斯汀·格雷格（Christine Gregoire） 1\. ...</description></item><item><title>Go 1.13中值得关注的几个变化</title><link>https://tonybai.com/2019/10/27/some-changes-in-go-1-13/</link><pubDate>Sun, 27 Oct 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/10/27/some-changes-in-go-1-13/</guid><description>2019年对于Go语言来说也是一个重要的年份，因为在2019年的11月10日，Go即将迎来其开源10周年的纪念日。在这个重要日子的前夕，在GopherCon 2019大会后，Go项目组在2019.9.4日发布了Go 1.13版本。 这是自2017年GopherCon大会上Russ Cox做“Toward Go 2″主题演讲以来Go项目发布的第四个版本（前三个分别是：go 1.10、go 1.11和...</description></item><item><title>Uber Go语言编码规范</title><link>https://tonybai.com/2019/10/12/uber-go-style-guide/</link><pubDate>Sat, 12 Oct 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/10/12/uber-go-style-guide/</guid><description>Uber是世界领先的生活出行服务提供商，也是Go语言的早期adopter，根据Uber工程博客的内容，大致可以判断出Go语言在Uber内部扮演了十分重要的角色。Uber内部的Go语言工程实践也是硕果累累，有大量Go实现的内部工具被Uber开源到github上，诸如被Gopher圈熟知的zap、jaeger等。2018年年末Uber将内部的Go风格规范开源到github，经过一年的积累和更新，该规范...</description></item><item><title>Go正走在成为下一个企业级编程语言的轨道上</title><link>https://tonybai.com/2019/05/03/go-is-on-a-trajectory-to-become-the-next-enterprise-programming-language/</link><pubDate>Fri, 03 May 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/05/03/go-is-on-a-trajectory-to-become-the-next-enterprise-programming-language/</guid><description>发展演化了十年的Go语言已经被证明了是云计算时代的首选编程语言，但Go的用武之地显然不局限于此。Kevin Goslar近期在Hacker Noon发表了一篇名为：《Go is on a Trajectory to Become the Next Enterprise Programming Language》的文章，阐述了Go可能成为下一个企业编程语言的理由，这里是那篇文章的中文译文，分享给大家...</description></item><item><title>Go，9周年</title><link>https://tonybai.com/2018/11/12/go-opensource-9-years/</link><pubDate>Mon, 12 Nov 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/11/12/go-opensource-9-years/</guid><description>本文翻译自Go官方博客：《Nine years of Go》。 介绍 今天是我们的Go语言初始版本开源的第九个周年纪念日。在每个周年纪念日上，我们都希望花些时间思考过去一年发生的事情。过去12个月对Go语言和Go社区来说是突破性的一年。 对Go的爱和接纳 感谢你们所有人，2018年对Go来说是美好的一年！在多个行业调查中，Gopher们表达了他们使用Go的快乐程度，并且许多非Go开发者也表示了他们...</description></item><item><title>TB一周萃选[第4期]</title><link>https://tonybai.com/2018/01/06/4th-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</link><pubDate>Sat, 06 Jan 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/01/06/4th-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</guid><description>本文是首发于个人微信公众号的文章**“TB一周萃选\[第4期\]”**的归档。 &amp;gt; 孩子，我要求你读书用功，不是因为我要你跟别人比成绩，而是因为，我希望你将来会拥有选择的权利，选择有意义、有时间的工作，而不是被迫谋生。当你的工作在你心中有意义，你就有成就感。当你的工作给你时间，不剥夺你的生活，你就有尊严。成就感和尊严，给你快乐。——龙应台 《亲爱的安德烈》 这两天中原大地的一场大雪正式宣告了深冬的...</description></item><item><title>Go语言：成长的十年</title><link>https://tonybai.com/2017/09/24/go-ten-years-and-climbing/</link><pubDate>Sun, 24 Sep 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/09/24/go-ten-years-and-climbing/</guid><description>Go语言之父，Google大神Rob Pike代表Go语言的另外两位缔造者Robert Griesemer和Ken Thompson在自己的博客上发表了一篇名为《Go: Ten years and climbing》的文章，用以纪念Go语言从最初的设计idea起到目前的十年发展。笔者读完后，也是深有感触，因此在这里粗略翻译一下全文，希望能有更多的程序员加入到Gopher行列中来。 译文全文如下： ...</description></item><item><title>使用wukong全文搜索引擎</title><link>https://tonybai.com/2016/12/06/an-intro-to-wukong-fulltext-search-engine/</link><pubDate>Tue, 06 Dec 2016 00:00:00 +0800</pubDate><guid>https://tonybai.com/2016/12/06/an-intro-to-wukong-fulltext-search-engine/</guid><description>近期项目中有一个全文索引和全文搜索的业务需求，组内同事在这方面都没啥经验，找一个满足我们需求的开源的全文搜索引擎势在必行。我们这一期对全文搜索引擎的需求并不复杂，最主要的是引擎可以很好的支持中文分词、索引和搜索，并能快速实现功能。在全文搜索领域，基于Apache lucene的ElasticSearch舍我其谁，其强大的分布式系统能力、对超大规模数据的支持、友好的Restful API以及近实时的...</description></item><item><title>部署devstack</title><link>https://tonybai.com/2016/05/04/deploy-devstack/</link><pubDate>Wed, 04 May 2016 00:00:00 +0800</pubDate><guid>https://tonybai.com/2016/05/04/deploy-devstack/</guid><description>新公司是一家数据与基础设施提供商(to B)。初来乍到，和这里的同事了解了一些云计算平台和大数据平台的技术栈。对于“新鲜”(only to me)的技术栈，自己总有一种折腾的冲动，于是就有了这一篇备忘性质的文章，记录一下自己部署devstack的步骤、遇到的问题和解决方法。 和诸多国内提供公有云的厂商一样，公司的云产品也是基于成熟的OpenStack云计算平台框架和组件搭建的，并做了一些定制。长久...</description></item><item><title>Appdash，用Go实现的分布式系统跟踪神器</title><link>https://tonybai.com/2015/06/17/appdash-distributed-systems-tracing-in-go/</link><pubDate>Wed, 17 Jun 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/06/17/appdash-distributed-systems-tracing-in-go/</guid><description>在“云”盛行的今天，分布式系统已不是什么新鲜的玩意儿。用脚也能想得出来：Google、baidu、淘宝、亚马逊、twitter等IT巨头 背后的巨型计算平台都是分布式系统了，甚至就连一个简单的微信公众号应用的后端也都分布式了，即便仅有几台机器而已。分布式让系统富有弹性，面 对纷繁变化的需求，可以伸缩自如。但分布式系统也给开发以及运维人员带来了难题：如何监控和优化分布式系统的行为。 以google为...</description></item><item><title>Caddy，一个用Go实现的Web Server</title><link>https://tonybai.com/2015/06/04/caddy-a-web-server-in-go/</link><pubDate>Thu, 04 Jun 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/06/04/caddy-a-web-server-in-go/</guid><description>这是一个Web Server的时代，apache2与nginx共舞，在追求极致性能的路上，没有最高，只有更高。但这又是一个追求个性化的时代，有些Web Server并没有去挤“Performance提升”这一独木桥，而是有着自己的定位，Caddy就是这样一个开源Web Server。 Caddy的作者Matt Holt在caddy官网以及FAQ中对caddy的目标阐释如下： 其他Web Serve...</description></item><item><title>ngrok原理浅析</title><link>https://tonybai.com/2015/05/14/ngrok-source-intro/</link><pubDate>Thu, 14 May 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/05/14/ngrok-source-intro/</guid><description>之前在进行微信Demo开发时曾用到过ngrok这个强大的tunnel(隧道)工具，ngrok在其github官方页面上的自我诠释是 “introspected tunnels to localhost&amp;#34;，这个诠释有两层含义： 1、可以用来建立public到localhost的tunnel，让居于内网主机上的服务可以暴露给public，俗称内网穿透。 2、支持对隧道中数据的introspection...</description></item><item><title>使用Golang开发微信公众平台-发送客服消息</title><link>https://tonybai.com/2014/12/30/send-custom-service-text-msg-for-wechat-public-platform-dev-in-golang/</link><pubDate>Tue, 30 Dec 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/12/30/send-custom-service-text-msg-for-wechat-public-platform-dev-in-golang/</guid><description>关注并使用过微信“飞常准”公众号的朋友们都有过如下体验：查询一个航班情况后，这个航班的checkin、登机、起降等信息都会在后续陆续异步发给你，这个服务就是通过微信公众平台的客服消息实现的。 微信公众平台开发文档中关于客服消息的解释如下：“当用户主动发消息给公众号的时候（包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功 事件、用户维权），微信将会把消息数据推送给开发者，开发者在一段...</description></item><item><title>使用Golang开发微信公众平台-接收加密消息</title><link>https://tonybai.com/2014/12/24/recv-encrypted-text-msg-for-wechat-public-platform-dev-in-golang/</link><pubDate>Wed, 24 Dec 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/12/24/recv-encrypted-text-msg-for-wechat-public-platform-dev-in-golang/</guid><description>在上一篇“接收文本消息”一文中，我们了解到：公众服务与微信服务器间的消息是“裸奔”的（即明文传输，通过抓包可以看到）。显然这对于一些对安 全性要求较高的大企业服务号来说，比如银行、证券、电信运营商或航空客服等是不能完全满足要求的。于是乎就有了微信服务器与公众服务间的数据加密 通信流程。 公众号管理员可以在公众号“开发者中心”选择是否采用&amp;#34;安全模式&amp;#34;(区别于明文模式)： 一旦选择了“安全模式”，微信...</description></item><item><title>使用Golang开发微信公众平台-接收文本消息</title><link>https://tonybai.com/2014/12/20/receive-text-for-wechat-public-platform-dev-in-golang/</link><pubDate>Sat, 20 Dec 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/12/20/receive-text-for-wechat-public-platform-dev-in-golang/</guid><description>一旦接入验证成功，成为正式开发者，你可能会迫不及待地想通过手机微信发送一条&amp;#34;Hello, Wechat”到你的公众号服务器。不过上一篇的那个程序还无法处理手机提交的文本消息，本篇将介绍如何用Golang编写公众号程序来接收手机端发送的 文本消息以及回复响应消息。 根据微信公众平台开发文档中描述：“当普通微信用户向公众账号发消息时，微信服务器将POST消息的XML数据包到开发者填写的URL上”。我们...</description></item><item><title>godep的一个“坑”</title><link>https://tonybai.com/2014/10/30/a-hole-of-godep/</link><pubDate>Thu, 30 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/30/a-hole-of-godep/</guid><description>很多人学习和使用Golang一段时间后，都会被golang的第三方包依赖版本搞得有些烦躁，golang设计者最初过于乐观的设计使得今天大 家不得不各自想办法解决这个问题。godep就是综合了多年第三方包依赖问题的解决方案后的一个趋向统一的方案，至少是在go get的设计没有进化前的一个比较不错的方案。 今天试用了一把godep，不过“体验”并不理想，这缘于我遇到了godep的一个“坑”，不过是那种...</description></item><item><title>Golang跨平台交叉编译</title><link>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</guid><description>近期在某本书上看到Go跨平台交叉编译的强大功能，于是想自己测试一下。以下记录了测试过程以及一些结论，希望能给大家带来帮助。 我的Linux环境如下： uname -a Linux ubuntu-Server-14 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86\_64 x86\_64 x86\_64 GNU/Lin...</description></item><item><title>docker容器内服务程序的优雅退出</title><link>https://tonybai.com/2014/10/09/gracefully-shutdown-app-running-in-docker/</link><pubDate>Thu, 09 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/09/gracefully-shutdown-app-running-in-docker/</guid><description>近期在试验如何将我们的产品部署到docker容器中去，这其中涉及到一个技术环节，那就是如何让docker容器退出时其内部运行的服务程序也 可以优雅的退出。所谓优雅退出，指的就是程序在退出前有清理资源（比如关闭文件描述符、关闭socket），保存必要中间状态，持久化内存数据 （比如将内存中的数据flush到文件中）的机会。docker作为目前最火的轻量级虚拟化技术，其在后台服务领域的应用是极其广泛的...</description></item><item><title>Golang Channel用法简编</title><link>https://tonybai.com/2014/09/29/a-channel-compendium-for-golang/</link><pubDate>Mon, 29 Sep 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/09/29/a-channel-compendium-for-golang/</guid><description>在进入正式内容前，我这里先顺便转发一则消息，那就是Golang 1.3.2已经正式发布了。国内的golangtc已经镜像了golang.org的安装包下载页面，国内go程序员与爱好者们可以到&amp;#34;Golang中 国&amp;#34;，即golangtc.com去下载go 1.3.2版本。 Go这门语言也许你还不甚了解，甚至是完全不知道，这也有情可原，毕竟Go在TIOBE编程语言排行榜上位列30开外。但近期使用Gola...</description></item><item><title>Ubuntu Server 14.04安装docker</title><link>https://tonybai.com/2014/09/26/install-docker-on-ubuntu-server-1404/</link><pubDate>Fri, 26 Sep 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/09/26/install-docker-on-ubuntu-server-1404/</guid><description>近期在研究docker这一轻量级容器引擎，研究docker对日常开发测试工作以及产品部署运维工作能带来哪些便利。前些时候刚刚将工作环境从 Ubuntu搬到了Mac Air上，对Mac OS X的一切均不甚熟悉，给docker研究带来了不便，于是打算在VirtualBox中安装一Ubuntu Server作为docker之承载平台。这里记录一下安装配置过程，主要为了备忘，如果能给其他人带来帮助，我会...</description></item><item><title>Cocos2d-x集成Amazon内购和GameCircle服务</title><link>https://tonybai.com/2014/08/04/amazon-inapp-purchasing-and-gamecirle-in-cocos2dx/</link><pubDate>Mon, 04 Aug 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/08/04/amazon-inapp-purchasing-and-gamecirle-in-cocos2dx/</guid><description>由于种种原因，这篇文章已经拖延了N多时间了。今天花了些时间把如何在Cocos2d-x(我用的版本是2.2.2)游戏中集成Amazon的内购和GameCircle服务(仅适用于Android版本)整理一下，发出来，作备忘。 之前在做“手指足球世界杯2014”时，想给这款小游戏加上内购(In-App Purchasing)和积分榜(ScoreBoard)功能。说到Android手机游戏的内购，人们第一...</description></item><item><title>Cocos2d-x屏幕适配之Sprite绘制原理</title><link>https://tonybai.com/2014/05/13/sprite-draw-principles-of-cocos2dx-screen-adaptation/</link><pubDate>Tue, 13 May 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/05/13/sprite-draw-principles-of-cocos2dx-screen-adaptation/</guid><description>手机(智能终端)游戏绝大多数为全屏(Full Screen)显示，这样开发人员在制作游戏时势必要考虑不同手机(智能终端）屏幕大小、宽高比的不同给游戏画面带来的影响，并且要将这种影响降低到最 小，努力使用不同终端的游戏玩家拥有几乎相同的游戏画面体验。为此各种游戏引擎在屏幕适配方面都给出了自己的方案，Cocos2d-x也不例外。 在Cocos2d-x官网Wiki上特地撰写了一篇讲解Cocos2d-x多...</description></item><item><title>Cocos2d-x 3.0rc0集成Google AdMob SDK</title><link>https://tonybai.com/2014/05/01/integrate-cocos2dx3rc0-with-admob/</link><pubDate>Thu, 01 May 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/05/01/integrate-cocos2dx3rc0-with-admob/</guid><description>话说Cocos2d-x 3.0上一周迫不及待地发布了正式版，本是一件值得庆幸的事情。但由于不可解决的技术问题，引擎无奈将Android平台的NativeActivity 实现重新回退到了Cocos2d-x 2.2.x版本的实现方案。由于之前已经将 GameDemo移植到了Cocos2d-x 3.0rc0版，直观感受到了NativeActivity方案带来的游戏操作体验上的提升（触屏事件的响应），因...</description></item><item><title>Cocos2d-x 3.0多线程异步资源加载</title><link>https://tonybai.com/2014/04/28/multithreaded-resource-loading-in-cocos2dx-3/</link><pubDate>Mon, 28 Apr 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/04/28/multithreaded-resource-loading-in-cocos2dx-3/</guid><description>Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版，其引擎驱动核心依旧是一个单线程的“死循环”，一旦某一帧遇到了“大活儿”，比如Size很大的纹理资源加载或网络IO或大量计算，画面将 不可避免出现卡顿以及响应迟缓的现象。从古老的Win32 GUI编程那时起，Guru们就告诉我们：别阻塞主线程(UI线程)，让Worker线程去做那些“大活儿”吧。 手机游戏，即便...</description></item><item><title>Cocos2d-x 3.0rc2集成ShareSDK</title><link>https://tonybai.com/2014/04/25/integrate-cocos2dx3rc2-with-sharesdk/</link><pubDate>Fri, 25 Apr 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/04/25/integrate-cocos2dx3rc2-with-sharesdk/</guid><description>给自己的手机游戏增加些社交分享功能，有助于游戏宣传和提升知名度，是一种不错的社交营销手段。国内这方面的第三方插件有不少，比如ShareSDK、友 盟分享组件、Baidu分享组件等，之前在研究2.2.2版本时，集成了ShareSDK这个组件，这次迁移到Cocos2d-x 3.0rc2依旧选择集成ShareSDK，这里就来说说集成的过程，遇到的一些问题以及解决方法。这里仅以Android平台游戏集成为...</description></item><item><title>Cocos2d-x 3.0rc2针对Android平台的变动</title><link>https://tonybai.com/2014/04/23/changes-in-cocos2dx-3-rc2-for-android/</link><pubDate>Wed, 23 Apr 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/04/23/changes-in-cocos2dx-3-rc2-for-android/</guid><description>《Hello, Cocos2d-x 3.0》一文发出后没多久，我就迫不及待地将手头的一个习作尝试从2.2.2版本迁移到3.0rc0引擎上。 核心代码迁移相对顺利，大致流程如下： **\* 创建项目** 1) cd cocos2d-x-3.0rc0；     2) 执行setup.py，设置引擎依赖的环境变量，脚本会将COCOS\_CONSOLE\_ROOT和ANT\_ROOT写入到~/.bash\...</description></item><item><title>Hello, Cocos2d-x 3.0rc0</title><link>https://tonybai.com/2014/04/22/hello-cocos2dx-3-rc0/</link><pubDate>Tue, 22 Apr 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/04/22/hello-cocos2dx-3-rc0/</guid><description>Cocos2d-x 3.0版本已经发布了rc2，这让这段时间用熟了Cocos2d-x 2.2.2的我也有些蠢蠢欲动。按照触控科技主创人员在CocoaChina2014大会上的讲解，Cocos2d-x 3.0版本相比2.x版本在各方面都有不错的提升，于是乎就想把手头上的一款习作移植到3.0版本引擎下，看看运行效果如何。不过在移植之前，我先来看看 3.0与2.0相比在整体代码结构以及引擎驱动核心方面到...</description></item><item><title>ShareSDK Cocos2d-x专用组件的一个Bug</title><link>https://tonybai.com/2014/04/17/a-bug-from-sharesdk-componet-for-cocos2dx/</link><pubDate>Thu, 17 Apr 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/04/17/a-bug-from-sharesdk-componet-for-cocos2dx/</guid><description>近期研究了一下Game App做社交分享，最后选择了ShareSDK来集成，不仅是因为ShareSDK支持国内外主流社交平台，更重要的是ShareSDK提供了专门的 cocos2d-x集成方案，有专门的文档和代码Demo供开发者参考。 文档中提到了三种集成方式：纯Java方式、plugin-x方式以及Cocos2d-x专用组件方式，这里选择了ShareSDK Cocos2d-x专用组件（v2.3....</description></item><item><title>Cocos2d-x内存管理-绕不过去的坎</title><link>https://tonybai.com/2014/03/18/cocos2dx-memory-management/</link><pubDate>Tue, 18 Mar 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/03/18/cocos2dx-memory-management/</guid><description>Cocos2d-x引擎的核心是用C++编写的，那对于所有使用该引擎的游戏开发人员来说，内存管理是一道绕不过去的坎。 关于Cocos2d-x内存管理，网上已经有了许多参考资料，有些资料写的颇为详实，因为在内存管理这块我不想多费笔墨，只是更多的将思路描述清 楚。 **一、对象内存引用计数** Cocos2d-x内存管理的基本原理就是对象内存引用计数，Cocos2d-x将内存引用计数的实现放在了顶层父类...</description></item><item><title>Hello, Cocos2d-x</title><link>https://tonybai.com/2014/03/11/hello-cocos2dx/</link><pubDate>Tue, 11 Mar 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/03/11/hello-cocos2dx/</guid><description>女儿从两岁半开始接触iPad，在这个年龄段也只有一些幼教类游戏适合她玩。虽然知道iPad玩久了对视力有伤害，但有时候还真拗不过果果，索性 也就让她玩一会儿。之前对智能终端上的东西不是很在意，也没啥兴趣，这大概与当年在大学时做Win32 GUI开发的糟糕经历多多少少有点关系。不过智能终端是大势所趋，历史的潮流不能违抗。虽然自己并非以Android/iOS编程为主业，但适当学习学习 总归没有坏处，万一...</description></item><item><title>Recommended C Style and Coding Standards中文版全文</title><link>https://tonybai.com/2013/11/26/the-full-text-of-recommended-c-style-and-coding-standards/</link><pubDate>Tue, 26 Nov 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/11/26/the-full-text-of-recommended-c-style-and-coding-standards/</guid><description>今天无意中打开了托管在Google Code上的“Recommended C Style and Coding Standards”翻译项目，忽感觉通过目录链接的方式查看译文缺少整体感，于是花了点时间将译文全文以single page的形式贴在博客里面，方便大家查看，也算是对该翻译内容的一个备份吧。 **C语言编码风格和标准** **0\. 摘要** 本文翻译自《Recommended C Sty...</description></item><item><title>那些代码中的“中国式”命名</title><link>https://tonybai.com/2013/11/06/those-chinese-style-naming-in-code/</link><pubDate>Wed, 06 Nov 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/11/06/those-chinese-style-naming-in-code/</guid><description>10月中旬，有人在Quora网站上发起一个调查：“程序员职业生涯中最难的事是什么？”，调查结果让人实感意外。世界范围内的程序员同胞们普遍认为： “命名是让大家感觉最困难的事情”。对于主流的欧美程序员尚且如此，对于英文非母语的中国程序员来说，苦逼程度可想而知了:(。 虽说中国程序员大多也都学了10年以上的英语了，但能“地道”的表达和书写甚至是选词的程序员们比例却不高。而在编写程序的过程中，给变量、常...</description></item><item><title>Memcached CAS应用一例</title><link>https://tonybai.com/2013/11/01/a-case-of-applying-memcached-cas/</link><pubDate>Fri, 01 Nov 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/11/01/a-case-of-applying-memcached-cas/</guid><description>近期收到客户一个需求，我将该需求转述为下面这个等价的问题。 **【问题】** \* 有一个产品包装系统_S_，为某种产品_P_提供产品包装服务; \* 系统_S_由若干个处理节点组成，每个节点都可以单独处理组件; \* 产品_P_的一个可出厂的**成品**由包装盒+N个产品组件组成，包装盒与产品组件上都贴有一个标签，该标签上包含该成品的唯一编号ID（一定时间范围内有效）、每个组件自己的序号(uni...</description></item><item><title>关于程序员的构思能力的一些体会</title><link>https://tonybai.com/2013/10/27/some-experience-about-ideation-of-programmer/</link><pubDate>Sun, 27 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/27/some-experience-about-ideation-of-programmer/</guid><description>_有一段时间，我完全沉迷于在脑海中**想象**机械绘图和设计新机型所带来的极致享受，这是我一生中有过的最完美的精神愉悦。创造的灵感像泉水般源 源不断 地涌出，我遇到的唯一困难就是必须设法牢牢抓住它们。对我来说，**构思**中的设备零件都绝对是真实的，所有细节都触手可及，甚至最细微的标识和磨损状态也是如 此。想象发动机在持续不断地运转，仿佛一道迷人的风景呈现在面前，令我欣喜若狂。_         ...</description></item><item><title>为阻塞型函数调用添加超时机制</title><link>https://tonybai.com/2013/10/25/add-timeout-to-blocking-function-call/</link><pubDate>Fri, 25 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/25/add-timeout-to-blocking-function-call/</guid><description>我们产品中的一个子模块在进行Oracle实时数据库查询时，常常因数据库性能波动或异常而被阻塞在OCI API的调用上，为此我们付出了“惨痛”的代价。说来说去还是我们的程序设计的不够完善，在此类阻塞型函数调用方面缺少微小粒度的超时机制。 调用阻塞多发生在I/O操作（磁盘、网络、低速设备）、第三方API调用等方面。对于文件/网络I/O操作，我们可利用在非阻塞文件描述符上select /poll的超时机...</description></item><item><title>把所有东西都放入版本控制系统</title><link>https://tonybai.com/2013/09/04/putting-absolutely-everything-in-version-control/</link><pubDate>Wed, 04 Sep 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/09/04/putting-absolutely-everything-in-version-control/</guid><description>本文翻译自Dr. Dobb’s杂志主编Andrew Binstock的&amp;#34;Putting Absolutely Everything in Version Control&amp;#34;一文。 **持续交付(Continuous Delivery)的一个关键原则就是将所有东西都放入版本控制系统中。这解决了一些重大问题，但也引入了一些其他问题。** 持续交付是持续集成(CI)的一个自然扩展。后者旨在每次代码签入后运...</description></item><item><title>利用ZooKeeper服务实现分布式系统的配置数据同步</title><link>https://tonybai.com/2013/08/28/implement-config-sync-for-distributed-system-with-zookeeper-services/</link><pubDate>Wed, 28 Aug 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/08/28/implement-config-sync-for-distributed-system-with-zookeeper-services/</guid><description>_很多时候，一旦习惯了某些事情，也就习惯了它们的恶劣，习惯了它们的丑陋，习惯了它们“赋予”你的各种痛苦。                                                                                                                                                    ...</description></item><item><title>buildc 0.3.1版本发布</title><link>https://tonybai.com/2013/07/15/buildc-0-3-1-release/</link><pubDate>Mon, 15 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/15/buildc-0-3-1-release/</guid><description>随着buildc在内部应用的深入，buildc逐渐进入了以内部需求和问题为主要驱动力的演化模式。我们内部的C应用多是后端服务类应用，个人 觉得具有一定代表性。buildc最初就是为了针对这类C应用而设计的。因此我们内部的需求和问题应该也同样具有一定代表性，而这种演化模式在一 段时间范围内还是有意义的。 buildc 0.3.1版本修正了上一版本的若干bug，并增加了两个新功能。 **\* 提高容错...</description></item><item><title>再谈C语言位域</title><link>https://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/</link><pubDate>Tue, 21 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/</guid><description>我在日常工作中使用C语言%E2%80%8E)中的位域(bit field)的场景甚少，原因大致有二： \* 一直从事于服务器后端应用的开发，现在的服务器的内存容量已经达到了数十G的水平，我们一般不需要为节省几个字节而使用内存布局更加紧凑的位域。 \* 结构体中位域的实现是平台相关或Compiler相关的，移植性较差，我们不会贸然地给自己造“坑”的。 不过近期Linux技术内核社区（www.linu...</description></item><item><title>buildc 0.3.0版本发布</title><link>https://tonybai.com/2013/05/11/buildc-0-3-0-release/</link><pubDate>Sat, 11 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/11/buildc-0-3-0-release/</guid><description>自buildc正式在项目中应用以来，我们收到了许多同事针对buildc演进的意见和建议。其中确实有些易用性的问题是在最初设计时未考虑周全的，尤其是.buildc.rc中的配置，同事们对该文件的配置已经“怨声载道”了。 .buildc.rc是用来配置某开发者在开发过程中使用的第三方库所在subversion repository信息的，例如： a\_repository = (&amp;#39;SVN库地址&amp;#39;, &amp;#39;...</description></item><item><title>也谈Commit log</title><link>https://tonybai.com/2013/05/09/also-talk-about-commit-log/</link><pubDate>Thu, 09 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/09/also-talk-about-commit-log/</guid><description>在版本控制工具大行其道的今天，作为程序员，势必要每天与各种版本控制系统（比如Subversion、Git、Mercurial等）打交道， 每天不commit几次代码都不好意思说自己是专业程序员^\_^。不过commit代码可不止敲入commit命令这么简单，对于一个专业程序员 来说，我们还要关注每次commit所携带的背景信息，这里暂且称之为“commit context”。在每次commit时，...</description></item><item><title>C,C++开源项目中的100个Bugs</title><link>https://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/</link><pubDate>Wed, 10 Apr 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/</guid><description>俄罗斯OOO Program Verification Systems公司用自己的静态源码分析产品PVS-Studio对一些知名的C/C++开源项目，诸如Apache Http Server、Chromium、Clang、CMake、MySQL等的源码进行了分析，找出了100个典型的Bugs。个人觉得这份列表对C/C++ 程序员有一定参考意义。与其说事后用静态工具分析，倒不如在编码时就提高自知自觉...</description></item><item><title>Hello，Sublime Text 2</title><link>https://tonybai.com/2013/04/01/hello-sublime-text-2/</link><pubDate>Mon, 01 Apr 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/04/01/hello-sublime-text-2/</guid><description>用惯了Vim后，也会有一种尝试新Editor的冲动，这回Sublime Text 2满足了我的这个需求。据说Sublime Text是目前最火的代码编辑器之一，我周围为数不多的几个比较Geek的同事都已经开始使用Sublime Text 2或用了很长时间了，其官方网站首页的Feature Demo也的确非常地炫。 **安装Sublime Text 2** 我的实验环境Ubuntu 12.04.1 ...</description></item><item><title>SVN命令输出结果的语言选择</title><link>https://tonybai.com/2013/03/15/choose-lang-for-svn-cmd-output/</link><pubDate>Fri, 15 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/15/choose-lang-for-svn-cmd-output/</guid><description>今天一位网上的朋友在使用reviewboard时遇到了问题，我们在评论中探讨了一下。他的问题目前已经定位，大致是这样的：他在Windows上用svn diff生成的patch文件在提交给reviewboard时出错，但在linux上生成的patch文件是没有问题的。后来他发现这两个patch文件内容稍有区别：Windows上的patch文件中的diff结果包含中文，比如“版本 10”；而在linu...</description></item><item><title>谋划2013</title><link>https://tonybai.com/2013/03/11/2013-plan/</link><pubDate>Mon, 11 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/11/2013-plan/</guid><description>眼看2013年已经过去1/6了，这个谋划显然有些晚了。之所以晚，根本原因还是之前有些很多事情没有想清楚，即便是现在可能依旧比较朦胧。鉴于去年的目标执行情况不甚理想，尤其是工作目标方面，因此今年在谋划策略方面变得更加务实和收敛，期望能说到做到或做的尽可能的多。 **一、个人目标** \* 鉴于去年的执行情况，今年将blog定在80篇（大约每5天一篇）应该问题不大，毕竟blog已经成为我生活的一个重要...</description></item><item><title>也谈C语言的Struct Hack</title><link>https://tonybai.com/2013/03/07/struct-hack-in-c/</link><pubDate>Thu, 07 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/07/struct-hack-in-c/</guid><description>今天在浏览网友huangz编写的“Redis源码分析”时，看到如下redis中的代码： struct sdshdr {     int len;     int free;     char buf\[\]; }; 说实话，这类代码我见过很多，但直到这次我才知道这种coding trick的真实英文称谓是：Struct Hack。 到底什么是Struct Hack？其实倒也没有什么明确定义。首先它...</description></item><item><title>玩转top</title><link>https://tonybai.com/2013/03/02/deep-into-top/</link><pubDate>Sat, 02 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/02/deep-into-top/</guid><description>相信很多人和我一样，top是自己日常使用最多的linux资源查看工具。不过仅限于一些简单的日常场景罢了：敲入top命令，看看哪些进程占用 CPU较多，然后对这些CPU占用较多的进程逐一处理一下。显然这样使用top有些大才小用了。 以前在监控工具使用方面总是浅尝辙止，并未做过多深入研究。近来愈来愈觉得有必要针对几种常用工具好好学习一下了。而top便首当其冲。top是一款 以查看进程(task)信息为...</description></item><item><title>为什么还用C编程？</title><link>https://tonybai.com/2013/02/27/why-code-in-c-anymore/</link><pubDate>Wed, 27 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/27/why-code-in-c-anymore/</guid><description>本文翻译自Dr. Dobb&amp;#39;s杂志主编Andrew Binstock的文章“Why Code in C Anymore?”，以下是翻译正文。 **传统的那些选择C而不是C++的理由的说服力已经逐渐地被削弱。还有什么继续使用C的更好的理由么？** 一个 Dr. Dobb&amp;#39;s的老读者最近问我：为何人们还在使用C编程。这个话题最近曾在我们站点的评论中出现过。早期也曾出现在与一些行业公司的对话过程中，尤其...</description></item><item><title>Go defer的C实现</title><link>https://tonybai.com/2013/02/03/implement-go-defer-in-c/</link><pubDate>Sun, 03 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/03/implement-go-defer-in-c/</guid><description>Go语言中引入了一个新的关键字defer，个人认为这个语法关键字让异常处理也变得得心应手许多，对改善代码的可读性和可维护性大有裨益，是典型的语法棒棒糖^\_^。 像下面这种代码（伪代码）： void foo() {     apply resource1; retv = action1;     if not success         release resource1 apply reso...</description></item><item><title>关于Python Package下的Module import方式</title><link>https://tonybai.com/2013/01/24/the-module-import-way-under-python-package/</link><pubDate>Thu, 24 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/24/the-module-import-way-under-python-package/</guid><description>2012年有一个目标我没有达成，那就是深入学习和使用Python语言。这个目标被其他学习任务和工作无情的抢占了，当然最主要的原因还是我重视不够^\_^。 近期恰逢有一些Python工程的开发工作要做，就顺便略微深入地学习了一下Python：看了几本Python的英文大部头，比如《Learning Python 4th Edition》、《Python Essential Reference 4th...</description></item><item><title>buildc 0.2.2版本发布</title><link>https://tonybai.com/2013/01/15/buildc-0-2-2-release/</link><pubDate>Tue, 15 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/15/buildc-0-2-2-release/</guid><description>随着buildc在项目中的深入使用，开发和测试人员都提出了不少良好意见，让我们有些应接不暇了，这次的版本更新也是为了满足这些意见和建议。 由于忙于应对这些眼前的需求，原本0.3.0的改进计划也被推迟了一些。 buildc 0.2.2版本包含了两个主要修正。 \* 增加了–ignore-error命令行选项 自从buildc cache相关命令严格区分–cmode=32-bit还是64-bit后，用...</description></item><item><title>buildc 0.2.1版本发布</title><link>https://tonybai.com/2012/12/06/buildc-0-2-1-release/</link><pubDate>Thu, 06 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/06/buildc-0-2-1-release/</guid><description>buildc 0.2.1版本是一个bugfix版本，修正了两个重要问题。 \* 修正执行buildc pack –cmode=32-bit时无法创建32位安装包的问题 之前的buildc pack命令在打包安装程序时忽略了–cmode这个选项，这样即便传入32-bit这个参数，打出的安装包中的应用程序依旧是64位编译的。这次修正了这个问题，让buildc真正支持打32位程序的安装包。 \* 修正b...</description></item><item><title>将Unity换成Gnome3</title><link>https://tonybai.com/2012/12/06/replace-unity-with-gnome3/</link><pubDate>Thu, 06 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/06/replace-unity-with-gnome3/</guid><description>Ubuntu 12.04已经体验一天多了，Unity还是用的不大习惯，左侧的程序启动栏感觉还是别扭，以前用windows的时候就不喜欢将任务栏放在左侧或右侧； 应用窗口的菜单栏融合到桌面顶端也没给我太多惊喜；总而言之，给自己找几个换回Gome的理由还是很容易的^\_^。况且Gnome也发生了巨变， 由传统的Gnome2更新到了全新的Gnome3，正好我也想体验一下Gnome3，于是继续折腾。 Ub...</description></item><item><title>升级到Ubuntu 12.04LTS</title><link>https://tonybai.com/2012/12/04/upgrade-ubuntu-to-1204-lts/</link><pubDate>Tue, 04 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/04/upgrade-ubuntu-to-1204-lts/</guid><description>Ubuntu 10.04 LTS已经伴随我两年了，经过我这么长时间的折腾，Ubuntu早已不堪重负^\_^。在未升级前，Ubuntu 10.04已经表现出诸多问题： \- 在家中连接无线路由器时间漫长，且经常掉线； \- 在公司用有线网络经常掉线； \- 由于反复安装软件，系统中残留较多垃圾数据； \- Ubuntu 10.04官方源中的软件版本都有些低，很多软件手工安装高版本比较费力； 另外原先...</description></item><item><title>使用squid搭建http代理</title><link>https://tonybai.com/2012/11/21/setup-http-proxy-with-squid/</link><pubDate>Wed, 21 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/21/setup-http-proxy-with-squid/</guid><description>近期在做一些基础设施搭建的过程中，又遭遇到了公司http代理的问题。主要是很多主机上的工具只支持不带身份鉴权信息的http\_proxy设置，如只 支持诸如：export http\_proxy=&amp;#39;http://10.10.1.1:8090&amp;#39;，而不支持export http\_proxy=&amp;#39;http://tonybai:passwd@10.10.1.1:8090&amp;#39;这种形式的配置。 或是其命令行选项...</description></item><item><title>buildc 0.2.0版本发布</title><link>https://tonybai.com/2012/11/06/buildc-0-2-0-release/</link><pubDate>Tue, 06 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/06/buildc-0-2-0-release/</guid><description>buildc的演进先后经历了构建管理和安装包工程管理两个阶段。其中buildc的构建管理功能在项目中应用较早，目前相对稳定可靠。但其支持的安装包工程是直到最近才被大家所正式使用的。不出意料，大家在使用过程发现了一些问题，于是我们也是边用边改。 目前一个setup工程一般具有类似如下源码组织结构： distributions/ setup.cfg src/     – README     – ap...</description></item><item><title>也谈Go语言代码包分发</title><link>https://tonybai.com/2012/10/25/go-package-distributing/</link><pubDate>Thu, 25 Oct 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/10/25/go-package-distributing/</guid><description>Go语言目前(截至1.0.2版本)尚不支持直接链接.a文件(这里的.a文件指的不是传统静态共享库，而是对golang的非main包build后的产物)。这样一来Go的第三方库包或组织内部的公共代码库包只能以源码的形式分发了。 Go提供了get命令用于获取他人分发的代码包。我们通过get命令既可以获取一些知名代码托管站点上的代码，也可以获取组织内部版本控制服务器上的公共代码。 Go get支持的托管...</description></item><item><title>编程语言进入“拼爹”时代</title><link>https://tonybai.com/2012/10/08/the-new-age-of-programming-language/</link><pubDate>Mon, 08 Oct 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/10/08/the-new-age-of-programming-language/</guid><description>近期看到一则新闻，说是Microsoft推出了一门开源的编程语言叫TypeScript，该Project的主要负责人是大名鼎鼎的Anders Hejlsberg，就是那个Turbo Pascal 、Delphi以及C#)之父。结合近几年来出现的颇受关注的其他几门编程语言，如Go、Rust、Dart)等，让我感觉到编程语言似乎进入了&amp;#34;拼爹&amp;#34;时代。 我们来列举一下这几门新兴语言的“老爹”(设计者)： ...</description></item><item><title>Go与C语言的互操作</title><link>https://tonybai.com/2012/09/26/interoperability-between-go-and-c/</link><pubDate>Wed, 26 Sep 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/09/26/interoperability-between-go-and-c/</guid><description>Go有强烈的C背景，除了语法具有继承性外，其设计者以及其设计目标都与C语言有着千丝万缕的联系。在Go与C语言互操作(Interoperability)方面，Go更是提供了强大的支持。尤其是在Go中使用C，你甚至可以直接在Go源文件中编写C代码，这是其他语言所无法望其项背的。 在如下一些场景中，可能会涉及到Go与C的互操作： 1、提升局部代码性能时，用C替换一些Go代码。C之于Go，好比汇编之于C。...</description></item><item><title>Go中的系统Signal处理</title><link>https://tonybai.com/2012/09/21/signal-handling-in-go/</link><pubDate>Fri, 21 Sep 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/09/21/signal-handling-in-go/</guid><description>我们在生产环境下运行的系统要求优雅退出，即程序接收退出通知后，会有机会先执行一段清理代码，将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出，即kill pragram-pid。我们在程序中针对一些系统信号设置了处理函数，当收到信号后，会执行相关清理程序或通知各个子进程做自清理。kill -9强制杀掉程序是不能被接受的，那样会导致某些处理过程被强制中断，留下无法恢复的现场，导致消...</description></item><item><title>Go语言标准库概览</title><link>https://tonybai.com/2012/09/08/a-brief-tour-of-go-standard-library/</link><pubDate>Sat, 08 Sep 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/09/08/a-brief-tour-of-go-standard-library/</guid><description>本文翻译自Dr.Dobb&amp;#39;s的&amp;#34;A Brief Tour of the Go Standard Library&amp;#34;一文。 **在Go语言五周系列教程的最后一部分中，我们将带领大家一起来浏览一下Go语言丰富的标准库。** Go标准库包含了大量包，提供了丰富广泛的功能特性。这里提供了概览仅仅是有选择性的且非常简单。本文发表后，标准库的内容还可能继续增加，因此 建议大家最好是通过在线查阅库API或使用go...</description></item><item><title>Go程序设计语言(三)</title><link>https://tonybai.com/2012/08/28/the-go-programming-language-tutorial-part3/</link><pubDate>Tue, 28 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/28/the-go-programming-language-tutorial-part3/</guid><description>本文译自Rob Pike的Go语言PPT教程 – &amp;#34;The Go Programming Language Part3(updated June 2011)&amp;#34;。由于该教程的最新更新时间早于Go 1版本发布，因此该PPT中的一些内容与Go 1语言规范略有差异，到时我会在相应的地方做上注解。 第三部分大纲 ------ * 并发与通信 * Goroutines * 通道(Channel) * 并发相关...</description></item><item><title>Go程序设计语言(二)</title><link>https://tonybai.com/2012/08/27/the-go-programming-language-tutorial-part2/</link><pubDate>Mon, 27 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/27/the-go-programming-language-tutorial-part2/</guid><description>重写工作方式正如字段一样。 type NamedPoint struct {     Point     name string } func (n \*NamedPoint) Abs() float64 {    return n.Point.Abs() \* 100. } n := &amp;amp;NamedPoint{Point{3, 4}, &amp;#34;Pythagoras&amp;#34;} fmt.Println(n.Abs...</description></item><item><title>Go程序设计语言(一)</title><link>https://tonybai.com/2012/08/23/the-go-programming-language-tutorial-part1/</link><pubDate>Thu, 23 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/23/the-go-programming-language-tutorial-part1/</guid><description>int          uint int8      uint8 = byte int16       uint16 int32       uint32         float32      complex64 int64       uint64         float64      complex128 还有uintptr，一个大小足够存储一个指针的数值。 这些都是互不相同的类型；...</description></item><item><title>也谈Go语言编程 – Hello，Go!</title><link>https://tonybai.com/2012/08/17/hello-go/</link><pubDate>Fri, 17 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/17/hello-go/</guid><description>_**Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system ena...</description></item><item><title>开始学Go</title><link>https://tonybai.com/2012/08/14/getting-going-with-go/</link><pubDate>Tue, 14 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/14/getting-going-with-go/</guid><description>本文翻译自Dr.Dobb&amp;#39;s的&amp;#34;Getting Going with Go&amp;#34;。 **本文是有关Google新的系统原生语言的五周教程的第一部分，这里将先向大家展示如何建立Go语言开发环境以及构建程序，然后带领大家浏览 一些代码范例来着重了解一下这门语言的一些有趣的特性。** _这个教程系列将连续刊登五周。在今天这一部分中，Go语言专家Mark Summerfield将讲解如何建立Go语言开发环境，...</description></item><item><title>buildc 0.1.9版本发布</title><link>https://tonybai.com/2012/07/19/buildc-0-1-9-release/</link><pubDate>Thu, 19 Jul 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/07/19/buildc-0-1-9-release/</guid><description>随着buildc使用的深入，越来越多的新需求暴露了出来。为了满足这些需求，我们组的小兄弟又对buildc进行了一些改造，这些变化如下： 1、支持将多个子工程打包到一个安装包中 最初buildc的设计思想是为每个子工程单独制作安装包，这样具有很强的灵活性。但在对现有N个工程进行构建脚本改造的过程中发现，有些工程间存在严重 依赖，比如工程A是一个业务级公共库工程，工程B和工程C都依赖工程A构建后生成的...</description></item><item><title>buildc 0.1.8版本发布</title><link>https://tonybai.com/2012/07/02/buildc-0-1-8-release/</link><pubDate>Mon, 02 Jul 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/07/02/buildc-0-1-8-release/</guid><description>buildc这个小工具逐渐在项目组内部扩大了使用范围，还有一名专门的同事负责为每个项目制作安装包工程，这样也可以在使用中发现buildc的问题。 本次buildc 0.1.8的相关修正以及新增的feature就是我的这位年轻同事一手操刀完成的，他也是一个python新手，同样也是边翻手册边进行编码的。这次改动主要集中在templates目录下的几个文件，这里的文件多为因工程的不同而异的。 这次bu...</description></item><item><title>勇于面对</title><link>https://tonybai.com/2012/05/21/to-face-it/</link><pubDate>Mon, 21 May 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/05/21/to-face-it/</guid><description>刚刚过去的这一周搞得我十分疲惫，起因是岳母生病了。 果果自出生以来一直是岳母照顾，这个五一岳母将果果带回老家待了一周，也许是太过操劳导致旧病复发(腰椎肩盘轻微突出)，无法坚持照顾果果了。可这段时间 又恰逢我和我LP都很忙碌，但无奈身边没有亲戚，只能我请假待果果(LP那里集团领导检查，实在无法脱身)，还要照顾生病的岳母。本以为病两三天就能好 转，但观察两天后仍不见好转，于是我只能将母亲大人请来照顾果...</description></item><item><title>使用ssh通过http代理访问bitbucket</title><link>https://tonybai.com/2012/05/09/ssh-access-bitbucket-via-http-proxy/</link><pubDate>Wed, 09 May 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/05/09/ssh-access-bitbucket-via-http-proxy/</guid><description>在很多公司内部，要想访问外部互联网都需要设置代理，我所在公司也是这样，有些时候这种限制真的可以让人骂娘。不过经过几年与代理的&amp;#34;斗争&amp;#34;后，大部分需 要访问外部网络的软件(比如subversion、apt-get、git、wgetc、filezilla等)经过设置后还都可以正常工作。不过前些日 子在折腾bitbucket上的源码库时又遇到了代理问题：无论通过https方式还是ssh方式都无法clone...</description></item><item><title>翻译《七周七语言》的那些事儿</title><link>https://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/</link><pubDate>Tue, 08 May 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/</guid><description>今天在互动出版网看到《七周七语言：理解多种编程范型》一书已经开卖了。看到自己参与翻译的第一本书出版了，心中还是很愉悦的，因为自己的辛苦付出终于有了结果。 **一、缘起** 能够参与到这本书的翻译完全是机缘巧合。记得2011年初我启动了一个《Programming in Haskell》的公共翻译项目，可是由于欠缺版权的考虑，中途不得不终止了该书的翻译。当时经dreamhead介绍联系到图灵的刘江总...</description></item><item><title>buildc 0.1.7版本发布</title><link>https://tonybai.com/2012/04/19/buildc-0-1-7-release/</link><pubDate>Thu, 19 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/19/buildc-0-1-7-release/</guid><description>最近针对buildc又有了一些新想法，于是今天上午又对buildc进行了多处修改，并相继发布了0.1.6版本和0.1.7版本。 \* 对buildc cache upgrade的实现进行了修改。 在执行全量更新本地cache前，先对本地cache的情况进行一些检查，并判断是否与当前.buildc.rc中的配置相符。如果两者是一致的，那么只进行update操作；否则则执行真正的upgrade(rem...</description></item><item><title>buildc 0.1.5版本发布</title><link>https://tonybai.com/2012/04/13/buildc-0-1-5-release/</link><pubDate>Fri, 13 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/13/buildc-0-1-5-release/</guid><description>这两天对buildc的改动比较频繁，今天又修正了一些问题，也增加了一些小功能。主要包括这么几点： 1、在Make.rules.in中增加了STATIC\_LIBS和DYNAMIC\_LIBS 项目源代码和项目中单元测试代码使用同一个Make.rules，也此编译时也就共享同一个LIBS变量。对于静态共享库还好说，但对于动态共享库，诸如Oracle的instantclient库，单元测试代码中即使没...</description></item><item><title>buildc 0.1.4版本发布</title><link>https://tonybai.com/2012/04/12/buildc-0-1-4-release/</link><pubDate>Thu, 12 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/12/buildc-0-1-4-release/</guid><description>年后buildc开始逐渐在产品线的项目里应用了，随之而来的是大家反馈的各种意见和bug。尤其是bug，我都会很认真地应对，也会及时发布相应的版本修复这些bug。buildc 0.1.4版本就是一个bugfix版本，其修复的bug源于今天上午的一次持续集成的失败。 上午收到Jenkins发送的一个&amp;#34;build failed&amp;#34;的mail，一个安装包项目的CI job执行失败了，于是到Jenkins w...</description></item><item><title>关于编译阶段符号多重定义的问题</title><link>https://tonybai.com/2012/04/11/multiple-definitions-of-the-compiling-phase/</link><pubDate>Wed, 11 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/11/multiple-definitions-of-the-compiling-phase/</guid><description>印象中关于编译以及链接的问题早已是老生常谈了。但今天又遇到了一个这样的问题，这里还总想提及一下下^\_^。 这次要说的问题依旧发生在使用lcut进行单元测试的过程中。一位同事在编译使用了mock函数的测试用例代码时出现了&amp;#34;multiple definition of &amp;#39;xxx&amp;#39;“的错误。这里简单模拟其场景如下： /\* testall.c \*/ /\* mock lib function \*/...</description></item><item><title>lcut 0.3.0版本发布</title><link>https://tonybai.com/2012/04/10/lcut-0-3-0-release/</link><pubDate>Tue, 10 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/10/lcut-0-3-0-release/</guid><description>lcut单元测试框架在我的项目中应用已经有一段时间了，项目组的同事对lcut的使用也是越来越熟悉，这不今天一位同事还提出了一个新需求，需求大致是这样的。 在实际项目中，经常遇到这类情况： int bar(…) { int ret; ret = foo(…); /\* assert ret \*/ … ret = foo(…); /\* assert ret \*/ … ret = foo(…); ...</description></item><item><title>如何加入Linux内核开发社区(7)</title><link>https://tonybai.com/2012/04/09/how-to-participate-linux-community-section-7/</link><pubDate>Mon, 09 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/09/how-to-participate-linux-community-section-7/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第七章、第八章以及第九章节的中译文。 **7、高级主题** 但愿此时此刻，你已经理解了内核开发过程是如何进行的。但仍然还有很多东西要学习！...</description></item><item><title>如何加入Linux内核开发社区(5)</title><link>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-5/</link><pubDate>Thu, 05 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-5/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第五章节的中译文。 **5、发布补丁** 迟早有一天你的工作将提交到开发社区进行评审，并最终合入内核主线。不出所料，内核开发社区在发布补丁...</description></item><item><title>如何加入Linux内核开发社区(6)</title><link>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-6/</link><pubDate>Thu, 05 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-6/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第六章节的中译文。 **6、将补丁工作进行到底** 此时此刻，你已经遵循了这里到目前为止给出的所有指导原则，并且由于你自己的工程技能，你已...</description></item><item><title>如何加入Linux内核开发社区(4)</title><link>https://tonybai.com/2012/03/31/how-to-participate-linux-community-section-4/</link><pubDate>Sat, 31 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/31/how-to-participate-linux-community-section-4/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第四章节的中译文。 **4、正确地编写代码** 关于那个可靠的面向社区的设计过程我们已经说的够多了，任何内核开发项目的证据都是最终的代码。...</description></item><item><title>如何加入Linux内核开发社区(3)</title><link>https://tonybai.com/2012/03/29/how-to-participate-linux-community-section-3/</link><pubDate>Thu, 29 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/29/how-to-participate-linux-community-section-3/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第三章节的中译文。 **3、早期规划** 当考虑一个Linux内核开发项目时，人们可能很想尽快投入并开始编码。但和任何重要的项目一样，推动...</description></item><item><title>如何加入Linux内核开发社区(2)</title><link>https://tonybai.com/2012/03/28/how-to-participate-linux-community-section-2/</link><pubDate>Wed, 28 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/28/how-to-participate-linux-community-section-2/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第二章节的中译文。 **2、内核开发过程是如何进行的** 在20世纪90年代初，当时的Linux内核开发是一件非常松散的事情，涉及的用户和开...</description></item><item><title>如何加入Linux内核开发社区(1)</title><link>https://tonybai.com/2012/03/27/how-to-participate-linux-community-section-1/</link><pubDate>Tue, 27 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/27/how-to-participate-linux-community-section-1/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第一章节的中译文。 **1、内核开发过程指南** 本文旨在帮助那些在参与开发社区(community)工作过程中遭遇些许挫折的开发人员(以及...</description></item><item><title>也谈Linux Kernel Hacking – Kconfig与Kbuild</title><link>https://tonybai.com/2012/03/18/linux-kernel-hacking-series-kconfig-and-kbuild/</link><pubDate>Sun, 18 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/18/linux-kernel-hacking-series-kconfig-and-kbuild/</guid><description>**_挖掘简单现象背后的复杂本质。_**– Tony Bai^\_^ 上文讲到Linux Kernel的配置和编译十分简单，甚至简单到可以与一个用户层应用相媲美。这一切都是因为Linux Kernel实现了一套易于使用、变更和后期维护的配置和编译体系。要知道最新Linux Kernel版本的代码量可是千万级别的，并且模块众多，其背后的配置和编译体系一定不那么简单，这次我们就来尝试Hack一下这套体...</description></item><item><title>也谈Linux Kernel Hacking – 内核配置、编译与安装</title><link>https://tonybai.com/2012/03/15/linux-kernel-hacking-series-kernel-config-compile-and-install/</link><pubDate>Thu, 15 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/15/linux-kernel-hacking-series-kernel-config-compile-and-install/</guid><description>_**Linux Kernel之于C程序员，就好比世界之巅珠穆朗玛之于专业登山客。**_ — Tony Bai^\_^ 作为到目前为止最为成功的开源项目，Linux Kernel总是散发着无穷的魅力，就好比那珠穆朗玛，让人魂牵梦绕，心潮澎湃并总是想尝试征服。 记得2006年初我曾花了些时间研究Linux Kernel，但后来迷失在了Linux Kernel引导阶段，无法自拔，最终选择了&amp;#34;知难而退&amp;#34;...</description></item><item><title>C语言编码风格和标准</title><link>https://tonybai.com/2012/03/07/the-chinese-translation-of-recommended-c-style-and-coding-standards/</link><pubDate>Wed, 07 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/07/the-chinese-translation-of-recommended-c-style-and-coding-standards/</guid><description>近期在为产品线的知识库编写一些指南类的文档，其中有一项就是对现有的C语言编码规范进行一些修订。为了&amp;#34;有米下锅&amp;#34;，我还特意在网上找了一些相关资料。关于C语言编码风格和标准的资料大多都成稿于上个世纪90年代，也就是在C90发布之后的若干年里；在C99发布后，部分资料根据最新的规范做了修订，但也有些资料认为C99对整体风格影响不大，也就保持了原样。 在这些资料中，我重点关注了一下这份文档《Recomme...</description></item><item><title>使用Jenkins实现多平台并行集成</title><link>https://tonybai.com/2012/02/15/intergating-on-multiple-platforms-simultaneously-using-jenkins/</link><pubDate>Wed, 15 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/15/intergating-on-multiple-platforms-simultaneously-using-jenkins/</guid><description>我们的后端C应用都是支持跨平台的，至少目前在Linux和Solaris上运行是没有问题的，这样一来我们在配置持续集成环境时就要考虑如何实现在代码Commit后触发多平台并行(同时)集成这个需求。 之前使用Buildbot时是通过为一个Scheduler配置多个Builder满足这个需求的。但现在要换成Jenkins，我们如何来实现呢？昨天在折腾Jenkins时我把问题想简单了，今天细致查看了一下B...</description></item><item><title>折腾Jenkins</title><link>https://tonybai.com/2012/02/14/install-and-configure-jenkins/</link><pubDate>Tue, 14 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/14/install-and-configure-jenkins/</guid><description>Buildbot是产品线C应用项目中采用的唯一持续集成工具，一直以来用得还不错。但前些日子部门负责过程改善的同事找到我，说今年部门计划统一各个项目组所使用的Continuous Integration工具，Buildbot有些小众，没有入大家的法眼，部门期望使用的是Jenkins(即原来的Hudson)。既然组织有统一规划，那我自然积极支持。但首先要做的就是评估Jenkins是否能满足我们的需求，...</description></item><item><title>为buildc添加安装包制作相关功能</title><link>https://tonybai.com/2012/02/10/add-packing-feature-to-buildc/</link><pubDate>Fri, 10 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/10/add-packing-feature-to-buildc/</guid><description>在&amp;#34;也谈C应用安装包制作与部署&amp;#34;一文中，我提到了为每一个源码工程建立单独的安装包制作工程(setup project)的想法，这两天我就一直在折腾这件事儿^\_^。 最初我并没有想去搞一个通用的安装包制作工具，只是为一个现有的源码工程建立了一个试验性质的安装包工程，并实现了其构建脚本(build.py)。但之后考虑到各个项目都要建立一个对应的安装包工程，安装包工程的构建脚本build.py势必会沦...</description></item><item><title>为buildc添加setup脚本</title><link>https://tonybai.com/2012/02/07/add-setup-script-for-buildc/</link><pubDate>Tue, 07 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/07/add-setup-script-for-buildc/</guid><description>buildc在发布0.1.0版时并没有做好安装脚本，当时的建议是直接下载0.1.0的源码包或svn export/checkout源码包，并手工将buildc目录位置加入到用户的PATH环境变量中。近期buildc计划正式投入到项目中使用，为了方便大家安装以及以后的统一升级维护，我花了些时间给buildc加上了setup脚本。 Python有标准的程序分发方案，不过我对这些了解不多。buildc本...</description></item><item><title>也谈C应用安装包制作与部署</title><link>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</link><pubDate>Wed, 01 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</guid><description>虽然部门一直在做C应用，但这么多年来，在C应用的安装包制作以及部署方面做得还是很初级，可以说还没有达到规范的程度。各个产品线的C应用安装包种类多样，水平参差不齐：有些产品的源码包即是安装包，把源码包拿到生产环境下编译后使用；有的项目则将编译好的目标文件(.o)以及第三方库放在安装包中，在生产环境下重新链接生成可执行文件；有的组则稍微专业一些，安装包中放的是编译好的可执行文件，但在目标主机上安装和执...</description></item><item><title>也谈C语言应用构建</title><link>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</link><pubDate>Tue, 17 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</guid><description>构建是软件开发过程中最常见的活动之一，也是很容易被忽视的环节。规范以及高效的构建对软件开发过程而言是大有裨益的。C语言并非一门年轻的语言，其历史已甚为悠久了(相对于还年轻的IT领域^\_^)。从C语言诞生以来，市面上存在的C语言应用何止千千万万。这些C应用的源码组织形式种类万千，从最简单的单个源文件，到复杂的诸如Apache httpd server这样庞大的Project。不过无论这些C应用的源...</description></item><item><title>C语言项目构建管理辅助工具 – buildc</title><link>https://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/</link><pubDate>Thu, 08 Dec 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/</guid><description>这几年我一直从事C语言项目的开发。这些项目的规模都不算小，少则十几万代码，多则几十万行代码，至少也都算得上是中型项目吧。项目构建工具使用的是传统的Make工具，构建脚本都是自行编写的，构建时直接在顶层目录下敲入make即可。 这种传统的构建方式其实是很耗时费力的。比如执行make之前你需要根据项目代码的实际路径重新设定一些环境变量或修改Makefile中的某些标识路径的变量；你还要将项目依赖的各种...</description></item><item><title>C程序员驯服Common Lisp – 函数</title><link>https://tonybai.com/2011/09/23/c-programers-tame-common-lisp-series-functions/</link><pubDate>Fri, 23 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/23/c-programers-tame-common-lisp-series-functions/</guid><description>Common Lisp是函数式编程语言，其基本组成单元自然是函数。对Common Lisp函数的理解也是学习Common Lisp语言的关键。另外与C语言以内存单元修改为主要编程方法不同，Common Lisp的主要编程方法是将函数应用于参数。这里我们分别用两种范式风格实现同一个函数，该函数用于取得第n个fibonacci数（n从0开始）： ;; 命令式风格 (defun imperative-f...</description></item><item><title>C程序员驯服Common Lisp – 变量</title><link>https://tonybai.com/2011/09/20/c-programers-tame-common-lisp-series-variables/</link><pubDate>Tue, 20 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/20/c-programers-tame-common-lisp-series-variables/</guid><description>变量是C语言中最常用的、不可或缺的语言元素。C语言是命令式编程语言（imperative programming language），其基本编程方法是基于对内存单元的修改，而变量又恰是对内存单元的抽象表示，比如：&amp;#34;int a = 0xff&amp;#34;这行语句告诉我们在内存中有一块大小为4个字节的区域，该区域可以通过a这个变量直接访问，该区域初始时存储的值为0xff。由此看来C语言的主要操作就是变量操作。 C...</description></item><item><title>C程序员驯服Common Lisp – 控制结构</title><link>https://tonybai.com/2011/09/14/c-programers-tame-common-lisp-series-control-structure/</link><pubDate>Wed, 14 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/14/c-programers-tame-common-lisp-series-control-structure/</guid><description>光有表达式，我们依旧无法写出实用的程序，我们还缺少控制结构(Control Structures)。 C语言主要有三种控制结构：顺序结构、条件分支结构和循环结构。Common Lisp 也实现了类似的控制结构，我们逐一来看。 一、顺序结构 顾名思义，顺序结构中的语句或表达式是按其位置的先后顺序依次执行的，这也是最简单也最容易理解的一种结构。在C语言中，绝大多数代码块(code block)中的代码...</description></item><item><title>C程序员驯服Common Lisp – 表达式</title><link>https://tonybai.com/2011/09/02/c-programers-tame-common-lisp-series-expressions/</link><pubDate>Fri, 02 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/02/c-programers-tame-common-lisp-series-expressions/</guid><description>Common Lisp程序由一组表达式构成。在&amp;#34;入门&amp;#34;一文中我提到过：Common Lisp使用S-expressions作为表达式(Expressions)的基本语法格式。S-expressions由原子(atoms)和S-expressions列表组成，或者说原子和列表(List)是组成S-expression的基本元素。复杂的源程序都是由简单的表达式组成的，我们在学习编写实用的Common ...</description></item><item><title>使用autoconf解决可移植性问题</title><link>https://tonybai.com/2011/08/23/solve-portable-problem-with-autoconf/</link><pubDate>Tue, 23 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/23/solve-portable-problem-with-autoconf/</guid><description>昨天在编译项目代码时遇到了这样一个错误： xx\_base.h:72:2: 错误：#error &amp;#34;One of \_BIG\_ENDIAN or \_LITTLE\_ENDIAN must be defined.&amp;#34; 这是预编译器的错误输出。原因很明显：预编译器在处理xx\_base.h时没有发现\_BIG\_ENDIAN或\_LITTLE\_ENDIAN的定义，#error预处理宏输出了如上错误。...</description></item><item><title>CBehave – 一个C语言行为驱动开发框架</title><link>https://tonybai.com/2011/08/15/cbehave-a-bdd-framework-for-c/</link><pubDate>Mon, 15 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/15/cbehave-a-bdd-framework-for-c/</guid><description>Behaviour-Driven Development，即行为驱动开发在业界早已不是什么新鲜玩意了。我之前也略有了解，不过一直没有&amp;#34;深入钻研&amp;#34;。直到今年年初InfoQ的几篇有关BDD的文章才让我对BDD有了更多的认识。与TDD一样，C语言在BDD领域依旧是一个&amp;#34;后进分子&amp;#34;，在多数主流语言(Java，C#，Ruby等)都已经拥有比较成熟的BDD框架(如JBehave、SpecFlow和Cucumb...</description></item><item><title>偿还N年前的一笔技术债</title><link>https://tonybai.com/2011/07/21/pay-for-a-tech-debt-of-several-year-ago/</link><pubDate>Thu, 21 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/21/pay-for-a-tech-debt-of-several-year-ago/</guid><description>记得刚来公司时曾参与过一个项目，项目中用到了部门基础库中的一个B+树接口。不过在程序调试过程中我们发现可执行程序总是dump core（在sparc solaris上），经初步分析，断定问题就出在B+树接口处，但一时又找不到问题原因。还好这个B+树的实现者就坐在我的旁边。他分析后告诉我：这个B+树接口要求用户自定义的索引结构体的size应该为4的整数倍。按照他的说法，我为结构体打了padding，...</description></item><item><title>为函数添加enter和exit级trace</title><link>https://tonybai.com/2011/07/13/add-enter-and-exit-trace-for-your-function/</link><pubDate>Wed, 13 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/13/add-enter-and-exit-trace-for-your-function/</guid><description>日常开发中，我们为了辅助程序调试常常在每个函数的出入口(entry/exit)增加Trace，一般我们多用宏来实现这些Trace语句，例如： #ifdef XX\_DEBUG\_ #define TRACE\_ENTER() printf(&amp;#34;Enter %s\\n&amp;#34;, \_\_FUNCTION\_\_) #define TRACE\_EXIT() printf(&amp;#34;Exit %s\\n&amp;#34;, \_\_...</description></item><item><title>也谈共享库2</title><link>https://tonybai.com/2011/07/07/also-talk-about-shared-library-2/</link><pubDate>Thu, 07 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/07/also-talk-about-shared-library-2/</guid><description>我之前写过一篇名为&amp;#34;也谈共享库&amp;#34;的博文，对共享库的查找和符号解析机制做了还算比较详细的说明，不过百密一疏，总有一些意想不到的情况发生。这不今天我又遇到了一个有关共享库的新问题，这里将这个问题及其解决过程记录下来，也算是对上一篇文章中未涉及内容的一个补充吧。 N年前我曾参与过部门的一个可复用系统的设计开发，当时我们设计了一种插件式的系统结构，其中所谓的&amp;#34;插件&amp;#34;是以共享库的形式提供。主程序通过读取配置...</description></item><item><title>使用Apache2配置多个站点</title><link>https://tonybai.com/2011/06/27/configure-multiple-websites-with-apache2/</link><pubDate>Mon, 27 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/27/configure-multiple-websites-with-apache2/</guid><description>部门虽然不是做Web开发的，但是部门内部很多服务器也是使用Apache作为Web Server的。不过一直一来我这边都是用一个Apache Server对应一套Web应用。不过今天有了新的要求：在一个已经部署了一套应用的Apache2上再部署另外一套应用。这也让我不得不深入了解一下Apache的配置。不过还好，过程还是顺利的，这里记下此文意在备忘，如果同时也能给大家带来一些有价值的参考那就再好不过...</description></item><item><title>让BuildBot服务于多个项目</title><link>https://tonybai.com/2011/06/07/use-buildbot-serves-serveral-projects-simultaneously/</link><pubDate>Tue, 07 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/07/use-buildbot-serves-serveral-projects-simultaneously/</guid><description>多数公司不会仅有一个项目，当你为一个项目引入持续集成实践后，其他项目就会接踵而来。这时你会重新考量BuildBot，考虑如何让BuildBot可以服务于多个项目。 如果你有足够的主机资源和人力资源，那为每个项目单独搭建一套CI环境是再好不过的了，每个项目都有专人维护CI环境，各个项目的配置互不干扰。不过对于一些公司来说，这显然有些浪费，BuildBot Master的资源消耗是不大的，我们完全可以...</description></item><item><title>解决BuildBot构建结果mail无法发送的问题</title><link>https://tonybai.com/2011/05/31/solve-the-problem-that-buildbot-can-not-send-mail/</link><pubDate>Tue, 31 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/31/solve-the-problem-that-buildbot-can-not-send-mail/</guid><description>在“使用BuildBot搭建持续集成环境”一文中我曾经说到：公司使用的mail服务器只支持SSL连接，而BuildBot似乎对SSL连接的支持有些问题，导致构建结果mail无法发送“。BuildBot实际上使用的是Twisted的mail库来发送邮件的，我下载了Twisted的一些mail发送的例子程序，并使用我的公司mail账户配置，但依旧发送失败。看来这个问题与Twisted的实现有关了。 这...</description></item><item><title>使用命令行方式开发Android应用</title><link>https://tonybai.com/2011/05/24/develop-android-app-in-command-line-method/</link><pubDate>Tue, 24 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/24/develop-android-app-in-command-line-method/</guid><description>这两天参加了一个Android)开发入门培训，讲师的水平不敢恭维，课讲的基本上也是一塌糊涂，不过通过这次培训，我算是达到了Android开发快速入门的预期目标。 一般来说Android应用开发的标准工具组合是JDK + Android SDK + ADT (Android Development Tools) + Eclipse，大家基本上是通过IDE GUI进行开发操作的。不过我个人更喜欢命令行...</description></item><item><title>使用Make的命令行变量</title><link>https://tonybai.com/2011/05/19/use-command-line-vars-of-make/</link><pubDate>Thu, 19 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/19/use-command-line-vars-of-make/</guid><description>有了BuildBot搭建的持续集成环境还远未结束，具体的构建脚本还得自己来写。我们用的是Make工具，对应要编写的脚本就是Makefile。 Make是日常代码构建常用的工具，尤其是绝大多数C和C++项目都会将Make作为首选构建工具。平时多数情况大家都是直接敲入make命令便开始了构建过程，很少有人为make传入什么参数的（调试Makefile的情况除外）。但是有些时候自定义的Make命令行变量...</description></item><item><title>使用BuildBot搭建持续集成环境</title><link>https://tonybai.com/2011/05/18/set-up-ci-environment-with-buildbot/</link><pubDate>Wed, 18 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/18/set-up-ci-environment-with-buildbot/</guid><description>部门的持续集成一直做的不太好，我们开发部这边甚至一直没能做起来，这其中有各种原因：工具、意识、执行力、沟通等等。将持续集成引入到我们的开发过程中也一直是我的一个目标。去年末启动的一个项目让我感到时机变得成熟了。 新项目的代码是完全重写的，这样的机会甚是难得。因为大多数情况下大家都是在维护现有系统：做些添添补补、修正Bug以及优化之类的事情。项目初期，我特别向大家强调了要严格遵守统一代码风格并将as...</description></item><item><title>Ubuntu一年使用感受</title><link>https://tonybai.com/2011/04/29/feel-experience-after-using-ubuntu-for-one-year/</link><pubDate>Fri, 29 Apr 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/04/29/feel-experience-after-using-ubuntu-for-one-year/</guid><description>今天是Ubuntu 11.04版本(Natty Narwhal)发布的正日子！想必全世界的Ubuntu Fans们都会或多或少的兴奋上一阵儿。我接触Ubuntu这个Linux发行版较早，甚至可以追溯到Ubuntu 5.10。不过真正将Ubuntu作为我日常工作学习的第一操作系统还是在去年Ubuntu 10.04LTS版本发布之后。从那时起到现在整整有近一年时间了。这里我也来说说这一年来使用Ubun...</description></item><item><title>童子军规则</title><link>https://tonybai.com/2011/04/23/the-boy-scout-rule/</link><pubDate>Sat, 23 Apr 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/04/23/the-boy-scout-rule/</guid><description>本文翻译自&amp;#34;The Boy Scout Rule&amp;#34;，来自于《程序员应该知道的97件事》一书中的某个章节。 童子军有一条规则：“永远保持离开时的露营地比你发现它时更整洁”。如果你在地面上发现了脏东西，那么无论是否是你留下的，你都要将它清理干净。你有意地为下一组露营者改善环境。（实际上，由童子军之父罗伯特·斯蒂芬森·史密斯·贝登堡编写的原版规则是这样的：“尝试让这个世界在你离开时比你发现它时变得更美好...</description></item><item><title>应用C语言代码风格检查</title><link>https://tonybai.com/2011/04/21/apply-style-check-to-c-code/</link><pubDate>Thu, 21 Apr 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/04/21/apply-style-check-to-c-code/</guid><description>代码风格（style）一直是一个见仁见智的问题，但是对于一个团队而言，如果能在代码风格上达成一致，显然无论对团队还是对个人来讲都是大有裨益的。 在这方面我们也曾做过努力，包括在团队中引入astyle工具，并在astyle的代码美化风格配置上，团队成员也集体达成过一致。但是在开发过程中还是出现了一些问题。最主要的就是对astyle工具使用不足：一些同事总是记得不停地写代码，但却忘记了按约定好的风格要...</description></item><item><title>借开源实现你的雄心壮志</title><link>https://tonybai.com/2011/03/26/fulfill-your-ambitions-with-opensource/</link><pubDate>Sat, 26 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/26/fulfill-your-ambitions-with-opensource/</guid><description>本文翻译自&amp;#34;Fulfill Your Ambitions with Open Source&amp;#34;，来自于《程序员应该知道的97件事》一书中的某个章节。 如果你在工作中没能开发那些可以实现你雄心壮志的软件，那你将有很不错的机会。也许你正在为一家庞大的保险公司开发软件，然而你实际上却宁愿供职于Google、Apple、Microsoft或是你自己初创的公司去开发下一个对世界影响巨大的软件。如果你去为你根本...</description></item><item><title>也谈SVN冲突解决</title><link>https://tonybai.com/2011/03/23/also-talk-about-solving-the-svn-conflicts/</link><pubDate>Wed, 23 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/23/also-talk-about-solving-the-svn-conflicts/</guid><description>当今的软件开发更多是团队合作，团队的所有成员均工作在同一份代码库上。这样即便是有了先进的版本控制管理工具（诸如Subversion、Git等），出现冲突（Conflict）的情况也是在所难免的。这就需要你学会解决冲突。 以Subversion为例，多数人在学习这类工具时都选择了浅尝辄止，仅仅停留在会使用update和commit这些常用的命令上。这样大家就错过了那些可以帮助你快速解决冲突的命令，以...</description></item><item><title>升级Thunderbird</title><link>https://tonybai.com/2011/03/21/upgrade-thunderbird/</link><pubDate>Mon, 21 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/21/upgrade-thunderbird/</guid><description>自从换装Ubuntu后，就一直使用Thunderbird。很是喜欢Thunderbird超快的搜索速度、按主题组织和展示Mail以及易用的快捷键。不过这两天Thunderbird一直在给我制造麻烦。通过Top查看，我发现我的Thunderbird一直在持续占用20%-30%的CPU，这导致我的本子变得很慢。虽然能看到这个进程，但是并不清楚Thunderbird究竟在做什么。开始怀疑它在后台压缩文件...</description></item><item><title>Review Board的几点使用体会</title><link>https://tonybai.com/2011/03/04/some-experience-on-using-review-board/</link><pubDate>Fri, 04 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/04/some-experience-on-using-review-board/</guid><description>近期产品线研发体系正式将Review Board这款优秀的基于Web的代码评审开源工具引入到开发过程中，作为产品线内各项目组进行代码评审的辅助工具。我对Review Board近两年多的关注总算没有白费，算是有了一个还算不错的结果。不过Review Board的正式使用并不代表一种结束，反而恰恰是一个新的开始。我们下一步要关注的是如何用好Review Board，让它真真正正地为改善产品质量和开发...</description></item><item><title>小试git-svn</title><link>https://tonybai.com/2011/01/20/try-git-svn/</link><pubDate>Thu, 20 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/20/try-git-svn/</guid><description>部门一直使用Subversion作为源码版本的管理工具。说实话，Subversion比较适合目前部门的绝大多数项目：没有异地团队开发，代码中心化管理；基本上都在trunk上开发，较少使用分支，基本上没有在各个branch间切换的成本。但对于我来说，有些情况下Subversion并不能满足我的需求。 问题主要集中在本地代码的备份和版本管理上。也就是说对于尚未或暂无法提交到Subversion服务器的...</description></item><item><title>别忘了测试你的假定</title><link>https://tonybai.com/2011/01/08/do-not-forget-to-test-your-assumption/</link><pubDate>Sat, 08 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/08/do-not-forget-to-test-your-assumption/</guid><description>周四下午，收到同事的一封mail，他告诉我他的业务代码中使用的一个库接口的行为与预期不同，并在mail中给出了测试代码和测试结果。而这个接口是之前由我封装实现的。 这个库仅仅是对libevent做了一层薄薄的封装，目的是使其接口的使用方式符合部门的一贯风格。虽说封装简单，但单元测试也是一应俱全，不敢马虎，必要的地方mock也一并上阵，总体来说我个人还是比较满意的。 不过还是出现了问题，问题出在li...</description></item><item><title>基于svn diff结果的有效代码量统计</title><link>https://tonybai.com/2010/12/24/an-effectual-method-based-on-svn-diff-for-code-quantity-statistics/</link><pubDate>Fri, 24 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/24/an-effectual-method-based-on-svn-diff-for-code-quantity-statistics/</guid><description>很多公司的过程中都有阶段性统计新增或修改的有效代码行数这一环节，这里先不论统计出的结果用于做什么，就统计本身而言，常常存在诸多问题，比如统计过程耗时且繁琐、统计结果中估算成分较大，不精确等。这些问题以前也一直困扰着我们，并且长时间没有想出很好的解决办法。 今天脑子里突然冒出一个想法：能否根据svn diff得到的结果分析出来有效代码量呢？ svn diff的结果一般是这样的，分为几类： 纯新增代码...</description></item><item><title>关于在线代码评审的几点考量</title><link>https://tonybai.com/2010/12/18/thoughts-on-online-coding-review/</link><pubDate>Sat, 18 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/18/thoughts-on-online-coding-review/</guid><description>记得上次折腾Review Board这个在线代码评审工具还是在一年前，那时的Review Board版本是1.0.3；这周部门的一位同事也在折腾Review Board，不过现在的版本已经升级到了1.5.1了。新版Review Board显然修正了许多旧版本中存在的问题，另外无法支持ssl邮件端口的问题也被我这位同事通过更换django源文件的方式搞定了。Review Board好用了，下一步需要...</description></item><item><title>"%05s"行为未定义</title><link>https://tonybai.com/2010/12/17/undefined-behavior-of-05s/</link><pubDate>Fri, 17 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/17/undefined-behavior-of-05s/</guid><description>下班前，一位同事发来的mail中提到这样一个问题：在Solaris上，新添加到Project中的一段代码编译有Warning，由于我们在Makefile的GCC命令行中设置了&amp;#34;视警告如错误&amp;#34;的-Werror编译选项，导致了项目无法成功Build。 这个Warning内容如下： warning: \`0&amp;#39; flag used with \`%s&amp;#39; printf format 产生这个Warning的...</description></item><item><title>使用Libtool创建库文件</title><link>https://tonybai.com/2010/12/14/create-libraries-with-libtool/</link><pubDate>Tue, 14 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/14/create-libraries-with-libtool/</guid><description>除了autoconf和automake，GNU的autotools工具包中还有一种工具，它就是libtool。顾名思义，libtool是一个关于库文件制作、安装和使用的工具，它屏蔽了各个平台在库制作、安装和使用方面的差异，为上层提供了统一的接口。你可以直接使用libtool创建静态或共享库，也可以将libtool与autoconf、automake结合在一起使用。第二种方式显然更具实际意义，也更为...</description></item><item><title>也谈共享库</title><link>https://tonybai.com/2010/12/13/also-talk-about-shared-library/</link><pubDate>Mon, 13 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/13/also-talk-about-shared-library/</guid><description>近两天一直在考量产品安装包改进的事宜。说实话，我们的安装包做得不够&amp;#34;专业&amp;#34;，不仅没有按照各个平台的标准安装包形式(比如redhat的rpm，debian的deb或solaris上的pkg包)制作，而且安装包在生产环境中还需要再进行一次链接才能得到最终的可执行程序。这样一来，每次制作安装包都很费时费力(虽然有自动打包脚本)，安装包的&amp;#34;体积&amp;#34;也很是庞大，因为包中要包含所有.o目标文件和一部分自有库以及...</description></item><item><title>在TeX文档中插入源代码</title><link>https://tonybai.com/2010/12/01/insert-source-code-into-tex-document/</link><pubDate>Wed, 01 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/01/insert-source-code-into-tex-document/</guid><description>近期有了在TeX文档中插入源代码的需要。TeX的\\verbatim可以帮助你保留输入text的原始格式，但用于输入源代码还是显得不够专业。Google了一下发现TeX中支持插入源代码的包也有不少，如LGrind、Listings等。LGrind似乎没有包含在TeX Live的默认安装包中，用apt-get尝试安装LGrind，发现居然要占用近200M的空间，遂放弃之，最后我选择了Listings...</description></item><item><title>尝试博客搬家</title><link>https://tonybai.com/2010/11/30/try-to-move-blog/</link><pubDate>Tue, 30 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/30/try-to-move-blog/</guid><description>早在若干年前就有朋友建议我搭建一个独立博客，可当时的我觉得blogbus提供的服务很不错，自己没有必要去折腾，费钱又费力，所以我选择了继续留在blogbus。 这两年blogbus服务一直在不断的提高，自己也一直很欣赏blogbus的简单、清新、无广告的风格，大巴后台管理中心的功能也变得越来越强大了。不过这期间blogbus也出现过几次较为严重的故障，导致长时间的无法提供服务。上周blogbus再...</description></item><item><title>一个制作朴素幻灯片的TeX模板</title><link>https://tonybai.com/2010/11/08/a-tex-template-for-making-plain-ppt/</link><pubDate>Mon, 08 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/08/a-tex-template-for-making-plain-ppt/</guid><description>自从有了For book的中文TeX模板后，我对TeX的热情便&amp;#34;继续&amp;#34;一发而不可收拾^\_^。上周原本计划为内部的一个交流准备一个PPT，但在开始构思之前却突然想到：是否可以使用TeX完成幻灯片制作呢？Google了一下，果然有成熟解决方案-使用BEAMER。 有了TeX基础后，学习使用Beamer构建幻灯片就显得容易了许多，用TeX创建幻灯片文档与编写普通文档差别并不大。TeX制作的幻灯片文档也...</description></item><item><title>一个基于XeTeX和xeCJK的TeX模板</title><link>https://tonybai.com/2010/11/02/a-tex-template-based-on-xetex-and-xecjk/</link><pubDate>Tue, 02 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/02/a-tex-template-based-on-xetex-and-xecjk/</guid><description>与&amp;#34;Hello World&amp;#34;作为编程入门时迈出的第一步相似，&amp;#34;Hello TeX&amp;#34;也只是学习博大精深的TeX的一块儿敲门砖，离真正的实用还差的远。 两周前开始体验TeX，直到今天才东拼西凑地倒腾出一个够自己使用的且相对实用的基于XeTeX和xeCJK的小模板。这里分享一下，希望能给大家带来一些帮助，同时对自己也算作是一个备忘。关于TeX网上资料很多，这个模板里的东西也都是参考和融会各种资料并试验后...</description></item><item><title>lcut增加对mock的支持</title><link>https://tonybai.com/2010/10/29/lcut-add-mock-support/</link><pubDate>Fri, 29 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/29/lcut-add-mock-support/</guid><description>记得恰好是在一个月前的今天，我发布了lcut(轻量级C语言单元测试框架)0.1.0版本 。由于发布仓促，文档没能及时跟上。在stackoverflow的一个关于单元测试的帖子 上，一位叫Craig McQueen的朋友也给出了建议：&amp;#34;Some documentation would be helpful. Project background and goals, a features list,...</description></item><item><title>关于Makefile.am中与Build相关的变量设置</title><link>https://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/</link><pubDate>Tue, 26 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/</guid><description>今天尝试使用autoconf和automake重新构建一个遗留库的Build环境。之前改造的lcut的目录结构还是相对简单，改造时并未遇到什么难题，不过今天就没那么幸运了，我在头文件目录包含设置这个看似简单的环节上遇到了一些小麻烦。 这个库结构其实也没那么复杂，只是源文件和头文件不在一个目录下罢了： testproj/     – Makefile.am     – configure.in   ...</description></item><item><title>你好，TeX</title><link>https://tonybai.com/2010/10/18/hello-tex/</link><pubDate>Mon, 18 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/18/hello-tex/</guid><description>由于某种原因，上周末开始学习使用TeX进行文档排版。哦，当然不是直接使用Donald Knuth他老人家设计的最原始的TeX命令。经过这么多年的发展，TeX领域早已出现了各种各样基于TeX开发的层次更高、易用性更好、更加让作者关注内容的好工具。在Ubuntu下，我选择了&amp;#34;TeX Live&amp;#34;。 周末的时间比较零碎(有了果果后，除了晚上外白天很难拿出一长段的时间钻研些东西了)，TeX Live安装和体...</description></item><item><title>从mock malloc说起</title><link>https://tonybai.com/2010/10/11/start-with-mock-malloc/</link><pubDate>Mon, 11 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/11/start-with-mock-malloc/</guid><description>上午对一段代码进行单元测试，由于需要用到mock，所以选择使用cmockery 作为Unit Testing框架(lcut还未提供mock功能)。测试代码里需要mock malloc以模拟分配内存失败的异常情况。 编写一个用例后，Build，提示出错：multiple definition of \`malloc&amp;#39;。经检查发现Makefile中定义mock malloc的那个目标文件(.o文件)居...</description></item><item><title>发布一款轻量级C语言单元测试框架</title><link>https://tonybai.com/2010/09/30/opensource-a-lightweight-c-unit-test-framework/</link><pubDate>Thu, 30 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/30/opensource-a-lightweight-c-unit-test-framework/</guid><description>基于各种xUnit框架的单元测试早已不是什么新鲜玩意儿，不过在&amp;#34;古老&amp;#34;的C语言领域，还尚未有哪种框架可以成为“寡头”。 记得2005年末的时候，初出茅庐的我吸取xUnit的设计思想在业余时间编写了一个轻量级的C单元测试框架lcut(Lightweight C Unit Test framework)，当时还写了一篇文章《C单元测试包设计与实现》记录了最初的设计和实现思路。本打算将这个小工具在部门内...</description></item><item><title>Hello，autoconf和automake</title><link>https://tonybai.com/2010/09/26/hello-autoconf-and-automake/</link><pubDate>Sun, 26 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/26/hello-autoconf-and-automake/</guid><description>部门绝大多数的产品都运行在Sun的小型机上，底层的操作系统是Solaris。这两年公司开始主推刀片机(物美价廉^\_^)，不过刀片机上运行的也是Solaris 10 for x86版本。基于同种OS的前提下在Sparc和x86两种体系之间做移植比较简单，主要考虑字节序问题就可以了。不过对于可移植性的考虑不足还是让我们付出了较大的工作量。 在即将进行的新版本产品开发中，可移植性依旧没有被列入到必须要...</description></item><item><title>使用Ubuntu文档模板</title><link>https://tonybai.com/2010/09/10/use-the-document-template-of-ubuntu/</link><pubDate>Fri, 10 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/10/use-the-document-template-of-ubuntu/</guid><description>每次安装Ubuntu后，主文件夹(你的$HOME目录)下都会默认建立起一些目录，诸如：下载、音乐、图片等，这些目录的用途通过其名字都可以猜个八九不离十，只有一个叫作“模板”的目录一直让我摸不到头脑。直到这次彻底迁移到Ubuntu，我才发现这个“模板”目录的妙用！ 平时工作中常常需要新建一些文档，以前用Windows时都会使用右键菜单，点击“新建”，然后选择不同的文档类型。但在Ubuntu上却发现右...</description></item><item><title>修改SVN中文件的可执行属性</title><link>https://tonybai.com/2010/09/08/modify-the-executable-property-of-files-in-svn-repository/</link><pubDate>Wed, 08 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/08/modify-the-executable-property-of-files-in-svn-repository/</guid><description>今天做了一些项目版本库的搭建工作，主要是将相关模块和库目录建立好，将Makefile编写好，并添加到SVN库中。 工作接近尾声时，无意中发现提交到SVN库中的文件居然都带着可执行权限(以下称x属性)，如： \-rwxr-xr-x  1 tonybai tonybai    203 2010-04-21 17:26 Makefile\* 这着实让人觉得别扭！Svn居然记录了文件的权限信息，至少我以前...</description></item><item><title>一个关于Vim扩展TAB键的问题</title><link>https://tonybai.com/2010/09/07/a-problem-about-vim-expand-tab/</link><pubDate>Tue, 07 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/07/a-problem-about-vim-expand-tab/</guid><description>今天遇到一个奇怪的问题：明明我在.vimrc中开启了expandtab选项，但是当我编辑Makefile文件时，敲入的TAB就是无法被VIM自动转换为四个空格(已经设置tabstop=4，shiftwidth=4)，通过&amp;#34;:set expandtab?&amp;#34;查看该选项值也居然是&amp;#34;noexpandtab&amp;#34;;编辑其他文件（如.c、.h文件甚至是无扩展名的文件)时expandtab却都是开启的，TAB也可被...</description></item><item><title>Ubuntu一周体验</title><link>https://tonybai.com/2010/09/04/one-week-experience-of-ubuntu/</link><pubDate>Sat, 04 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/04/one-week-experience-of-ubuntu/</guid><description>安装Ubuntu已有一周多，无论是在工作单位还是在家里，Ubuntu都作为我的第一OS，Win7基本上处于被打入“冷宫”状态。事实证明对我来说，Ubuntu完全可以取代Windows。 公司提供有线和无线网络两种接入方式，对于致力于追求“理想的无线世界”的我来说，无线接入是我的第一选择。公司的无线接入采用TTLS认证方式，在WinXP和Win7上都有相应的客户端(SecureW2)可供使用，但在U...</description></item><item><title>Ubuntu扫盲</title><link>https://tonybai.com/2010/08/31/ubuntu-eliminate-illiteracy/</link><pubDate>Tue, 31 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/31/ubuntu-eliminate-illiteracy/</guid><description>今天下午例行项目例会，例会内容乏善可陈(但都还是比较重要的事情^\_^)，无非是跟踪进度、跟踪之前未解决的问题等。近几次的例会或技术交流会我都会给大家分享些东西，哪怕是告诉大家如何从C Shell迁移到更高效的Bash Shell这样的小事情。 这次给大家带来的是如何使用分支以及TiddlyWiki这款小工具。过程较为平淡，大家也基本以沉默为主，零星有几个问题提出。 尾声阶段，大家注意到了我刚刚用...</description></item><item><title>初用TiddlyWiki</title><link>https://tonybai.com/2010/08/30/learn-tiddlywiki/</link><pubDate>Mon, 30 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/30/learn-tiddlywiki/</guid><description>2008年末和一位同事在山西出差，发现那位同事在用TiddlyWiki写一些日记，那时候算是第一次知道TiddlyWiki，但不知是为什么，当时的我并没有被TiddlyWiki所吸引，也就失去了一次使用TiddlyWiki的机会。 近期新启动了一个产品版本的开发任务，该版本是对之前遗留系统版本的重构和优化，我们想趁此机会将梳理遗留系统时总结下来的东西以及一些新的设计想法记录下来，以便于后人参考并迅...</description></item><item><title>也谈使用分支</title><link>https://tonybai.com/2010/08/26/also-talk-about-branch/</link><pubDate>Thu, 26 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/26/also-talk-about-branch/</guid><description>近期在为一个新项目作版本库规划，并策划一些即将应用于该项目的版本控制和发布流程的Rules。借此机会我也花上一些时间对我们之前的版本控制和发布流程进行一下反思，也翻看了一些书籍(比如《版本控制之道-使用subversion》、社区自由图书《Subversion与版本控制》等)，了解一下Best Practice是什么样子的，同时也纠正一下我之前理解不正确的地方。 我们这些年来一直在使用CVS/Su...</description></item><item><title>彻底迁移到Ubuntu</title><link>https://tonybai.com/2010/08/25/move-to-ubuntu-thoroughly/</link><pubDate>Wed, 25 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/25/move-to-ubuntu-thoroughly/</guid><description>自从知道Ubuntu这个linux发行版后，就有了彻底迁移到Linux上的想法。但迫于各种各样的因素一直未能下定决心，这期间Ubuntu发行版已经从6.10进化到了10.04。经过长时间(近四年，时间长的的确有些夸张^\_^)的准备，再借着Ubuntu 10.04 LTS发布的东风， 我终于下决心彻底走进Ubuntu的世界。 安装Ubuntu对我来说已经是驾轻就熟的事情了，这里也没什么好说的。对我...</description></item><item><title>重新定制VIM</title><link>https://tonybai.com/2010/08/22/reconfigure-vim/</link><pubDate>Sun, 22 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/22/reconfigure-vim/</guid><description>这周五工作状态实在不好，也许是工作得有些疲劳的缘故。没有了心思工作，那莫不如利用这些时间读读书。在存储电子书的目录中左翻翻右看看，发现了那本久违了的中文版VIM手册，我决定索性打开温习一下，拣一拣那些已经生疏了的但却极其实用的命令。 下班前400多页的手册居然被我走马观花的浏览完了，其间将遇到的觉得实用的且以前不知道的或不常用的命令记录了下来，一共有50多项，其中不乏令我大呼过瘾的能显著提升工作效...</description></item><item><title>使用svn pre-commit hook</title><link>https://tonybai.com/2010/08/07/use-svn-pre-commit-hook/</link><pubDate>Sat, 07 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/07/use-svn-pre-commit-hook/</guid><description>一直以来我们对项目代码的提交管理都是粗放型的，即对大家提交代码的时间、频率和提交日志的形式都没有严格的要求，可谓比较随意。主要发现的问题包括： \- 某些提交没有规划，甚至随意增加一些并无太大意义的注释都作一次提交。 \- 提交的代码甚至没有经过REVIEW和UT，这样的代码即使内部发布，也会带来后续工作量的严重浪费（测试、发现问题、定位问题、重新fix、重新验证等）； \- 提交日志无实际意义，...</description></item><item><title>使用astyle美化代码</title><link>https://tonybai.com/2010/07/29/use-astyle-to-beautify-your-code/</link><pubDate>Thu, 29 Jul 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/07/29/use-astyle-to-beautify-your-code/</guid><description>昨天一位同事发了一篇小文档，文档中介绍了一种开源格式化代码的工具，名为Artistic Style(astyle)，功能看起来还是很不错的。之前我写代码时比较注意代码的风格，一直按照自己的思路来美化自己的代码，用的最多的辅助工具就是Vim自带的indent功能，对这之外的格式化工具少有涉猎。记得几年前部门曾推广一款名为checkstyle的Java代码格式规范检查工具，由于当时基本不接触Java，...</description></item><item><title>Thunderbird跨平台共享邮件设置</title><link>https://tonybai.com/2009/11/20/cross-platform-configuration-of-thunderbird/</link><pubDate>Fri, 20 Nov 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/11/20/cross-platform-configuration-of-thunderbird/</guid><description>对于我个人来说，将工作环境切换到Ubuntu上来有几个“坎儿”要迈过，其中最为迫切的一个就是Mail如何在Windows和Linux下共享的问题，今天我找到了解决方法。 Thunderbird和Firefox一样，都来自Mozilla组织。和Outlook等软件不同的是，Thunderbird是可以跨平台的，更有甚者，Thunderbird可以帮助我们在Windows和Linux共享邮件，当然需要...</description></item><item><title>升级到Ubuntu 9.10</title><link>https://tonybai.com/2009/11/16/upgrade-to-ubuntu-9-10/</link><pubDate>Mon, 16 Nov 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/11/16/upgrade-to-ubuntu-9-10/</guid><description>Ubuntu 9.10版本在10月29日发布，虽然没有太多吸引我的地方，但是看了网上很多关于Ubuntu 9.10的文章后，心里面还是痒痒的，终于在上周五我用午间休息时间完成了Ubuntu 9.10版本的安装。 光盘是让同事帮我下载并刻录的，安装过程和以前没什么两样，由于本本中已经有了9.04版本，直接插入光盘升级安装就可以了。大约40分钟后，安装完毕，重启进入Ubuntu 9.10。首先感受到的...</description></item><item><title>Review Board中文支持</title><link>https://tonybai.com/2009/10/05/chinese-support-for-review-board/</link><pubDate>Mon, 05 Oct 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/10/05/chinese-support-for-review-board/</guid><description>Review Board安装成功至今已半月有余，这期间我一直在试用它，虽欣喜于其提供的强大的功能，但还是有若干使用中的问题一直让我头痛不已，同时也阻碍了在部门推广该工具的进程。 首当其冲的就是对中文的支持问题。按照默认的步骤安装和配置后， 输入和保存英文均没有问题，但是一旦输入中文，保存后页面显示的都是乱码，甚至某些时候在保存中文数据时Review Board还提示错误。我的 Ubuntu的loc...</description></item><item><title>也谈VIM字符集编码设置</title><link>https://tonybai.com/2009/09/28/also-talk-about-vim-charset-configuration/</link><pubDate>Mon, 28 Sep 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/09/28/also-talk-about-vim-charset-configuration/</guid><description>安装完中文语言包支持后，Ubuntu的默认locale是zh\_CN.UTF-8(即简体中文语言环境，字符集内码UTF-8)。这与我们日常开发环境中Unix设定的环境有所区别，我们日常使用的环境一般为zh\_CN.GBK或zh。我们的源代码文件的字符编码也都是GBK的编码，直接在Ubuntu下用默认设置的VIM打开后，中文的注释会显示乱码。如果你直接编辑这个文件并提交，那么其他在Unix下开发的同...</description></item><item><title>Firefox变身Vim</title><link>https://tonybai.com/2009/09/20/vimperator-plugin-for-firefox/</link><pubDate>Sun, 20 Sep 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/09/20/vimperator-plugin-for-firefox/</guid><description>在&amp;#39;IDEAL Garden&amp;#39;上看到作者在文章中提到一个名为Vimperator的FireFox插件，该插件功能甚是强大，可以让你以Vim的操作方式来使用Firefox，对于我这个天天都用Vim写代码的人来说，Vimperator可谓有非凡的吸引力，它可以让你的手指留在键盘上。 安装Vimperator这个插件仅需十几秒的时间，重启Firefox后你就可以以Vim的操作方式来尽情操作Firefox...</description></item><item><title>Review Board安装和配置札记</title><link>https://tonybai.com/2009/09/19/review-board-installation-and-configuration/</link><pubDate>Sat, 19 Sep 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/09/19/review-board-installation-and-configuration/</guid><description>目前部门还没有采用Pair Programming那种时时刻刻都在review代码的工作方式，代码Review多采用走查方式，即代码写完后召开一个Code Review的Meeting，集中时间和经验丰富的人力对重点代码进行筛查，这种方式的代码Review有利，但也有弊。其弊端在于低效和覆盖面小。做一次走查需要N多人参与若干个小时，而在这段时间里不是每个参与者都能极其高效的参与到走查中的，实践证明...</description></item><item><title>Solaris 10安装二三事</title><link>https://tonybai.com/2009/09/10/something-about-installing-solaris-10/</link><pubDate>Thu, 10 Sep 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/09/10/something-about-installing-solaris-10/</guid><description>部门服务器资源向来都比较紧张，每当忙碌季节到来，服务器资源消耗都较大，开发人员总是抱怨编辑代码慢、Build慢以及磁盘空间不足等问题，严重时甚至无法工作。部门也一直在尝试改善这个问题，无非加服务器、加磁盘等，但是这些措施似乎都难以满足开发和测试人员日益增长的对服务器资源的索求。 为了尽量在组内杜绝上述现象的发生，决定搭建多台PC Server给组内开发人员使用，让大家工作的更有效率，更独立自由，不...</description></item><item><title>Bash文件描述符重定向符号的另类理解</title><link>https://tonybai.com/2009/09/08/the-alternative-understanding-on-file-descriptor-redirection/</link><pubDate>Tue, 08 Sep 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/09/08/the-alternative-understanding-on-file-descriptor-redirection/</guid><description>在Unix平台工作的人都使用过Shell的重定向功能，多数人接触较多的是简单的重定向，比如： cmd &amp;gt; some\_file 将cmd命令的标准输出重定向到some\_file中 cmd &amp;amp;1 1&amp;gt;build.log”为例，看起来挺头疼，符号增多了，加了一个&amp;#39;&amp;amp;&amp;#39;这个符号，有些晕。不能看表面，我们要看原理：打开“Unix环境高级编程(APUE)”中关于文件内核数据结构的说明，回顾一下，再对应上面...</description></item><item><title>cmockery支持mock输出参数</title><link>https://tonybai.com/2009/08/26/cmockery-support-mocking-out-parameter/</link><pubDate>Wed, 26 Aug 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/08/26/cmockery-support-mocking-out-parameter/</guid><description>近两天一有空就会去看看项目代码，思考一下如何利用cmockery对项目里已有的代码进行测试。项目代码中很多被调用的接口都带有输出参数，而且在这些接口中多利用返回值指示执行成败也否，而利用输出参数返回一些关键结果，这些结果值甚至影响着后续的函数执行流程。前期研究cmockery时没有注意到cmockery是否可以设置被mock接口的输出参数的值，不过回顾了一下cmockery实现的原理，觉得cmoc...</description></item><item><title>C单元测试之使用cmockery</title><link>https://tonybai.com/2009/08/22/introduce-cmockery-for-c-unit-test/</link><pubDate>Sat, 22 Aug 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/08/22/introduce-cmockery-for-c-unit-test/</guid><description>这么久以来一直没有找到一款很好的支持mock测试的C语言单元测试工具包，但前不久在一网友的评论中得知：去年Google曾发布了一款c语言的轻量级单元测试framework — “cmockery”，cmcokery很小巧，对其他开源包没有依赖，对被测试代码侵入性小；它支持mock test，同样也可以支持常规的单元测试。 之前在博客中曾描述过C语言实现mock的一个思路，不过和cmockery对比...</description></item><item><title>简说GLIBC strncpy实现</title><link>https://tonybai.com/2009/04/15/glibc-strncpy-source-analysis/</link><pubDate>Wed, 15 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/15/glibc-strncpy-source-analysis/</guid><description>比较以下两组代码，你认为哪组运行的更快些呢？ Example1：         int n   = 100;         int n4  = n &amp;gt;&amp;gt; 2;         int i   = 0; int a\[100\]; for (i = 0; i = 4)         {                 size\_t n4 = n &amp;gt;&amp;gt; 2; /\* n4 = n / 4， n...</description></item><item><title>GLIBC strlen源代码分析</title><link>https://tonybai.com/2009/04/11/glibc-strlen-source-analysis/</link><pubDate>Sat, 11 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/11/glibc-strlen-source-analysis/</guid><description>直接操作C标准库提供的字符串操作函数是有一定风险的，稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库，但是测试之后才发现自己的实现有很大的性能缺陷。 在Solaris上初步做了一个简单的性能比对，以下是得到的性能数据(以strlen的数据为例)： 当传入的字符串长度为10时，执行100w次： strlen 执行时间是：32762毫秒 my\_strlen执行时间是：49183...</description></item><item><title>IE8的糟糕体验</title><link>https://tonybai.com/2009/03/23/terrible-experience-on-ie8/</link><pubDate>Mon, 23 Mar 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/03/23/terrible-experience-on-ie8/</guid><description>北京时间2009年3月20日零点，软件巨头微软公司正式发布了其Internet Explorer系列的最新版本8.0，简称IE8。早上上班后我第一时间下载了IE8的简体中文版For Windows XP。执行安装文件，重启电脑，IE8很容易就安装完毕了。 自己平时最常用的浏览器是Mozila的Firefox，但考虑到公司内部办公网以及中国内地诸多网站对Firefox糟糕的兼容性，让我还不得不继续使...</description></item><item><title>也谈软件调试</title><link>https://tonybai.com/2009/03/22/also-talk-about-debugging-software/</link><pubDate>Sun, 22 Mar 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/03/22/also-talk-about-debugging-software/</guid><description>每年二月末到三月初，公司都会安排一批实习生到各个部门实习。虽说去年经济危机了，但公司的实习生数量似乎并没有减少。起码我们部门&amp;#34;新同事&amp;#34;的数量基本与去年持平。按惯例，每位新同事都会有一名导师，与此同时各个部门还会根据自身的业务特点对这批学生进行有针对性的集中培训和交流。比起我入司那会儿，现在的实习生已经算是幸福多了。我那会儿实习生人数少，部门没有安排什么培训，完全靠导师安排自己努力学习。此次培训的内...</description></item><item><title>发掘Trac</title><link>https://tonybai.com/2009/03/18/learn-trac/</link><pubDate>Wed, 18 Mar 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/03/18/learn-trac/</guid><description>使用何种工具做Feature或Defect或Task的跟踪一直是挺让我闹心的一件事。用Excel记录，但却不便于共享、统计和直观展示；Jira算是做的好的工具之一了，但无奈它是商业软件，咱没付那份儿钱，所以也就&amp;#34;无福享用&amp;#34;；Mingle是著名的Thoughtworks公司的产品，虽说不到5个license是可以免费使用的，但它却是出了名的&amp;#34;内存杀手&amp;#34;，无奈我的机器配置太差，运行起来实在太慢，遂没有...</description></item><item><title>“扶正”Bash Shell</title><link>https://tonybai.com/2009/02/27/make-bash-my-default-shell/</link><pubDate>Fri, 27 Feb 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/02/27/make-bash-my-default-shell/</guid><description>近日，Bash Shell正式发布了其4.0版本，该版本可以看作3.x的bugfix版，同时增加了诸如&amp;#34;Associative Arrays&amp;#34;等新特性。在Bash Shell的官方站点你可以下载到最新的4.0版本，不过在GNU的Bash主页上，似乎还找不到4.0版本的所在。Bash作为Linux系统默认Shell，一直受到广泛关注，而且它还是目前几大Shell(Bourne Shell, C Sh...</description></item><item><title>CSCOPE使用中问题小解</title><link>https://tonybai.com/2009/02/23/solve-some-problems-when-using-cscope/</link><pubDate>Mon, 23 Feb 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/02/23/solve-some-problems-when-using-cscope/</guid><description>拥有了某种工具，往往不等于就能使用好这种工具。拥有工具简单，用好工具、发挥出最大作用则较难。CSCOPE让VIM的使用者有了与SourceInsight&amp;#34;平起平坐“的机会，但是能否将CSCOPE的功能发挥出来还要看你是如何使用它了。 自从VIM”重装上阵“以后，我一直在使用CSCOPE。在使用过程中还是发现了一些”别扭“的事情。一般我会在一个大型Project的源代码的顶层目录使用CSCOPE -...</description></item><item><title>VIM“重装上阵”</title><link>https://tonybai.com/2008/12/30/in-depth-study-vim/</link><pubDate>Tue, 30 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/30/in-depth-study-vim/</guid><description>国内很多学习Python的人都喜欢看&amp;#34;A Byte of Python&amp;#34;，这是一本由印度小伙儿Swaroop C H写的书，之所以受到大家关注和欢迎，想必其简单而实用的写作风格是其中的重要原因吧，作为入门书很适合。我的Laptop中就有一本中文翻译版，不过书中用的还是Python 2.3.4版本。本月3日(2008-12-3)Python 3.0 Release版祭出，Swaroop C H也在其...</description></item><item><title>使用Scons改造现有项目</title><link>https://tonybai.com/2008/12/21/use-scons-to-build-current-projects/</link><pubDate>Sun, 21 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/21/use-scons-to-build-current-projects/</guid><description>今天是冬至，也是入冬以来感觉最冷的一天，毫不夸张的说：你一张嘴，牙就冻上了。上午LP在家收拾卫生，我继续用Scons改造现有的项目。下午出去理发，头发长长了后，似乎会造成思维迟钝^\_^。 试验性的用Scons改造现有的project，过程中对Scons了解又多了一些。上篇文章对Scons的性能没有给出定论，经过对Scons的深入后，发现Scons在执行初始时的性能的确不够快，这是因为Scons启...</description></item><item><title>为Ubuntu下的Firefox提速</title><link>https://tonybai.com/2008/12/17/accelerate-the-firefox-on-ubuntu/</link><pubDate>Wed, 17 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/17/accelerate-the-firefox-on-ubuntu/</guid><description>部门的一套基础库刚刚移植到Linux上，为了测试该库，我将工作环境切换到了Ubuntu Linux下面。切换后居然发现Ubuntu下的Firefox访问网页巨慢无比，Firefox显示时明时暗，总是被挂起。同样的公司网络环境在Windows下使用Firefox访问互联网很顺畅，没有卡的现象。看来是时候给Ubuntu下的firefox提提速了。 Google了一下才发现反映类似现象的人为数不少啊，在...</description></item><item><title>发掘Scons</title><link>https://tonybai.com/2008/12/14/learn-scons/</link><pubDate>Sun, 14 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/14/learn-scons/</guid><description>发现或者说知道SCons是缘于Google的comp.lang.c group上的一则名为&amp;#34;Best Build Tool for large C projects &amp;#34;的帖子，帖子的作者列出了11条他认为&amp;#34;Best Build Tool&amp;#34;应该具备的特点，并欲找到这样的Build Tool。在该帖子的回复中，有人提到了Scons，说来惭愧，这是我第一次听说到有这样一个工具。一直在Unix下编写C程序...</description></item><item><title>领导意志</title><link>https://tonybai.com/2008/10/11/the-leader-will/</link><pubDate>Sat, 11 Oct 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/10/11/the-leader-will/</guid><description>昨天是周五，按照工作计划，上午和组内同事做个人阶段性目标沟通。在与一位曾经在国外公司里做过项目的同事沟通时，他给我讲了这么一个故事：某一年的圣诞节前夕(圣诞节在西方人眼里是地位最高的节日了吧)他所在的那家公司的经理预感到圣诞节那天他们公司的网站的访问量激增的可能性会很大，为了保证网站在那圣诞节那天能&amp;#34;挺住&amp;#34;，他要求手下的人对网站进行一次压力测试，并决定让手下用jmeter来做这件事情。手下人没有异...</description></item><item><title>也谈C语言标识符的NAMESPACE</title><link>https://tonybai.com/2008/05/15/also-talk-about-namespace-in-c/</link><pubDate>Thu, 15 May 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/05/15/also-talk-about-namespace-in-c/</guid><description>P.J Plauger的&amp;#34;The Standard C Library&amp;#34;一书的Chapter0的章后练习中有这样的一道题：编写一个包含如下一行语句的正确的程序： x:      ((struct x\*)x)-&amp;gt;x=x(5); 并描述这行语句中x的5种截然不同的use，这里其实涉及到这么一个知识或者说概念：C语言的命名空间(namespace)，在&amp;#34;C语言参考手册&amp;#34;中还被称作: overloadi...</description></item><item><title>也谈C语言变长参数</title><link>https://tonybai.com/2008/05/07/also-talk-about-c-variable-length-args/</link><pubDate>Wed, 07 May 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/05/07/also-talk-about-c-variable-length-args/</guid><description>很多技术人员都有在&amp;#34;技术细节&amp;#34;上&amp;#34;钻牛角尖&amp;#34;的&amp;#34;癖好&amp;#34;，对此很多人褒贬不一；无论怎样，我也是属于这类人。C语言的变长参数在平时做开发时很少会在自己设计的接口中用到，但我们最常用的接口printf就是使用的变长参数接口，在感受到printf强大的魅力的同时，是否想挖据一下到底printf是如何实现的呢？这里我们一起来挖掘一下C语言变长参数的奥秘。 先考虑这样一个问题：如果我们不使用C标准库(libc...</description></item><item><title>也谈typedef</title><link>https://tonybai.com/2008/05/02/also-talk-about-typedef/</link><pubDate>Fri, 02 May 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/05/02/also-talk-about-typedef/</guid><description>C语言语法简单，但内涵却博大精深；如果在学习时只是止步于表面，那么往往后期会遇到很多困难。typedef是C语言中一个很好用的工具，大量存在于已有代码中，特别值得一提的是：C++标准库实现中更是对typedef有着大量的使用。但很多初学者对其的理解仅局限于：typedef用来定义一个已有类型的”别名(alias)”。正是因为有了这样的理解，才有了后来初学者在typedef int myint和ty...</description></item><item><title>使用Ubuntu工作了一上午</title><link>https://tonybai.com/2008/02/27/work-on-ubuntu-this-morning/</link><pubDate>Wed, 27 Feb 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/02/27/work-on-ubuntu-this-morning/</guid><description>在公司里面，Windows还是一统天下的。人们已经熟悉了Windows上的各种软件和使用方法，特别是一些常用的配置管理工具，我们用的都是微软的产品，譬如Visual Source Safe，这给转到Ubuntu带来了一些麻烦，Ubuntu下虽然有Wine这个好工具，但是对于复杂的Windows软件来说，Wine的支持还是难以满足需求的。 在家里的时候一直都是用无线路由器上网的，开机登录桌面后无线就...</description></item><item><title>牢骚中体验Ubuntu</title><link>https://tonybai.com/2008/02/23/many-complaints-about-ubuntu/</link><pubDate>Sat, 23 Feb 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/02/23/many-complaints-about-ubuntu/</guid><description>春节过后，项目一直比较忙， 我的Ubuntu自从上周日安装到系统中后就一直没有怎么用过，好不容易盼到周末了，这回可有时间体验一下&amp;#39;热得烫手&amp;#39;的Ubuntu了。 Dreamhead在评论中给我的建议是:坚持使用Ubuntu，你就会越用越熟练的。这同样也是我的想法，所以首要的任务就是先体验一下Ubuntu，看其是否能满足我工作和平时娱乐的需要。 Linux总是让新手&amp;#39;迷路&amp;#39;,我所说的&amp;#39;迷路&amp;#39;是指在进入...</description></item><item><title>初装Ubuntu 7.10</title><link>https://tonybai.com/2008/02/17/install-ubuntu-7-10-the-first-time/</link><pubDate>Sun, 17 Feb 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/02/17/install-ubuntu-7-10-the-first-time/</guid><description>花了大半天时间备份数据，重装Windows后，终于可以安装Ubuntu了。Ubuntu 7.10的光盘在我的抽屉里都躺了多个月了，今天终于有了用武之地了。因为有了移动硬盘，我将笔记本硬盘的一个分区腾了出来，用来安装Ubuntu，分区大约20G，分出10个G来挂载/，1个G做SWAP分区，剩下一个FAT32分区存用户数据。 IBM Thinkpad笔记本向来对Linux的兼容性就很好，我这次安装也印...</description></item><item><title>也谈'万能'栈</title><link>https://tonybai.com/2007/11/27/also-talk-about-univerisal-stack/</link><pubDate>Tue, 27 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/27/also-talk-about-univerisal-stack/</guid><description>在网上搜索&amp;#34;万能&amp;#34;二字的英文翻译，结果却无意中看到有人提到了如何设计&amp;#34;万能栈&amp;#34;。栈(stack)是比较基础(fundamental)的数据结构，实现起来一般都比较容易。但一般的栈(stack)的实现都是局限于某种特定类型的，比如一个存储32-bit整型的栈。如果对于同一份栈实现，要求可以存储多种数据类型的话，那就需要仔细想想了。而这样的栈实现也就被戏称&amp;#34;万能&amp;#34;栈。 这里对&amp;#34;万能&amp;#34;栈再做一个分类：同...</description></item><item><title>又获Ubuntu 7.10光盘</title><link>https://tonybai.com/2007/11/25/got-ubuntu-7-disc/</link><pubDate>Sun, 25 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/25/got-ubuntu-7-disc/</guid><description>Mark Shuttleworth，Ubuntu的创始人，给了Ubuntu爱好者一个免费获取Ubuntu光盘的机会，自从去年年初收到一次Ubuntu 5.10的光盘后，昨天我又拿到了最新的Ubuntu 7.10的光盘。 去年的光盘数目很多，估计当时的Canonical是为了扩大自己的linux distribution的影响，在&amp;#34;shipit&amp;#34;页面上鼓励你多多索取光盘。也正如Canonical所期...</description></item><item><title>在Solaris上编译Ethereal的注意事项</title><link>https://tonybai.com/2007/11/08/some-notice-about-building-ethereal-on-solaris/</link><pubDate>Thu, 08 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/08/some-notice-about-building-ethereal-on-solaris/</guid><description>自从上次&amp;#39;编译Ethereal On Windows&amp;#39;之后，好久没有接触Ethereal了，前期策划的基于Ethereal开发的一个工具的任务就落到了这批来的一个新员工的头上了。第一阶段他在Windows上开发了一个基于Ethereal的插件用于分析CMPP协议之用；第二个阶段我们需要移植到Unix上，我们使用的是Solaris。 目标机器是一个x86的Solaris10的系统，首先是将Ether...</description></item><item><title>也谈计算机字符编码</title><link>https://tonybai.com/2007/11/03/also-talk-about-char-encoding/</link><pubDate>Sat, 03 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/03/also-talk-about-char-encoding/</guid><description>以前真的未就计算字符编码有过什么深入的学习探究，这次学习也是源于客户的一次投诉。客户的投诉简要来说就是：我们的网关在截断客户发的长度越限的短信内容时，导致该短信在终端上显示为乱码。顺着这个起因，我花了一些时间概要性的学习了一些关于计算机字符编码的常识性知识。 字符，这个我们在平时编码过程中最最常见的元素，其实也有着一段小故事。 计算机，毫无疑问是一部机器，在最初我们接触计算机时或者接收计算机教育时...</description></item><item><title>不是不奉献</title><link>https://tonybai.com/2007/11/02/the-reason-for-not-dedicate/</link><pubDate>Fri, 02 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/02/the-reason-for-not-dedicate/</guid><description>中午在CSDN上看到一则新闻，说的是&amp;#34;中国开源社区热潮背后 缺少奉献型人才&amp;#34;，看完后有些感触，也就想在这里说两句。 谈到为开源项目奉献，我认为首先要具备三个条件： 1、投身开源的热情，即有奉献的意愿； 2、参与开源的技术能力，这里是指能参与到某开源项目核心或主力开发行列的能力；当然你要说参与开源的形式是多样的。如提交一个bug，辅助做一个模块测试同样也是为开源奉献，这里我也不否定，见仁见智。 3、...</description></item><item><title>Unix Shell Scripting之'扫盲篇'</title><link>https://tonybai.com/2006/05/02/an-introduction-on-unix-shell-scripting/</link><pubDate>Tue, 02 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/02/an-introduction-on-unix-shell-scripting/</guid><description>俗话说：&amp;#34;工欲善其事，必先利其器&amp;#34;。在Unix/Linux上做开发，这里的’器’也同样包括Unix Shell Script，遗憾亚，虽然自己在Unix上开发已经快2年了，但是对Unix Shell Script可以说是’Script盲’一个，很多稍微复杂些的Script自己根本都看不懂。其实这也是自己栽下的’苦果’，因为以前我一直’歧视’Script language，认为那不是真正程序员该精通...</description></item><item><title>GCC警告选项例解</title><link>https://tonybai.com/2006/03/14/explain-gcc-warning-options-by-examples/</link><pubDate>Tue, 14 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/14/explain-gcc-warning-options-by-examples/</guid><description>程序员是追求完美的一族，即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。遇到任意一条编译器警告都坚决不放过。有人会说：我们可以使用比编译器更加严格的静态代码检查工具，如splint。这个建议也很不错。不过lint工具使用起来较繁琐，有时候还需要记住一些特定符号并插入到你自己的代码中才行，门槛较高，这也让很多人止步于此。那么我们就从此放弃么？不，如今的编译器做得都很好，它可以帮...</description></item><item><title>Kernel 'head.S'</title><link>https://tonybai.com/2006/03/02/kernel-head/</link><pubDate>Thu, 02 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/02/kernel-head/</guid><description>After being decompressed, the kernel image starts with another ‘startup\_32′ function included in $(linux-2.6.15.3\_dir/arch/i386/kernel/head.S’. This ‘head.S’ is the second one in linux source packag...</description></item><item><title>Compressed 'head.S'</title><link>https://tonybai.com/2006/02/25/compressed-head/</link><pubDate>Sat, 25 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/25/compressed-head/</guid><description>_Why do we do this? Don’t ask me.. Incomprehensible are the ways of bootloaders. _                             — comments in arch/i386/boot/compressed/misc.c There are two ‘head.S’ in linux source pac...</description></item><item><title>Transfer to '32-bit'</title><link>https://tonybai.com/2006/02/17/transfer-to-32bit/</link><pubDate>Fri, 17 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/17/transfer-to-32bit/</guid><description>The phase we talked about before is in ‘Real-address Mode’, which runs 16-bit program modules. At the tail of &amp;#34;Begin ‘setup.S’&amp;#34;, we had moved to ‘Protected Mode’, which usu runs 32-bit program modules...</description></item><item><title>Outline 'memory layout'</title><link>https://tonybai.com/2006/02/15/outline-memory-layout/</link><pubDate>Wed, 15 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/15/outline-memory-layout/</guid><description>So far we have arrived at the gate leading to the real kernel. And we’d better stop for a short break in order that we would have more energy to go ahead. Now let’s examine what we do to memory these ...</description></item><item><title>Begin 'setup.S'</title><link>https://tonybai.com/2006/02/13/begin-setup/</link><pubDate>Mon, 13 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/13/begin-setup/</guid><description>It is time for ‘setup.S’ to show its power. The ‘setup.S’ is loaded by the bootloader and virtually it belongs to neither the ‘bootstrap’ routine nor the kernel program, although it is a portion of th...</description></item><item><title>Goto 'Bootstrap'</title><link>https://tonybai.com/2006/02/11/goto-bootstrap/</link><pubDate>Sat, 11 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/11/goto-bootstrap/</guid><description>The term ‘Bootstrap’, which originally refers to a person who tries to stand up by pulling his own boots, refers to a subroutine used to establish the full routine(its own left part, i think) or anoth...</description></item><item><title>Inside the 'i386'</title><link>https://tonybai.com/2006/02/09/inside-the-i386/</link><pubDate>Thu, 09 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/09/inside-the-i386/</guid><description>The term ‘i386′ in the title does not refer to the real Intel 80386 processor but the representative of Intel 32-bit architecture(IA32). I prefer ‘i386′ rather than ‘IA32′ just like what the linux ker...</description></item><item><title>Retired 'bootsect.S'</title><link>https://tonybai.com/2006/02/08/retired-bootsect/</link><pubDate>Wed, 08 Feb 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/02/08/retired-bootsect/</guid><description>We know that the latest linux kernel version is 2.6.x, which is different from the ‘old kernels’ in booting. The ‘bootsect.S’, which used to make the kernel image in the floppy disk bootable in the ea...</description></item><item><title>收到Ubuntu光盘</title><link>https://tonybai.com/2006/01/23/got-the-ubuntu-disc/</link><pubDate>Mon, 23 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/23/got-the-ubuntu-disc/</guid><description>一个月以前在Ubuntu上订购了Ubuntu Linux 5.10发行版，今天终于拿到手了^\_^。 在Linux发行版世界，大家最熟悉的几种发行版包括RedHat(或其开源版Fedora)、Debian、SuSE等，提到Ubuntu这个奇怪的名字大家都会感到陌生，在一个多月前我也不例外。Ubuntu是一个基于Debian的Linux操作系统发行版，它完全免费，这次我收到的Ubuntu光盘就是在其...</description></item><item><title>用GDB调试多进程程序</title><link>https://tonybai.com/2006/01/08/debug-multiple-process-program-using-gdb/</link><pubDate>Sun, 08 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/08/debug-multiple-process-program-using-gdb/</guid><description>有一段时间没有写技术方面的东西了^\_^。众所周知，GDB是Unix/Linux下调试程序的龙头老大，GDB功能强大，我们在平时多使用其一些最基本的功能，而且一般调试的都是单进程的程序。最近一个项目中的问题让我接触如何使用GDB调试多进程程序，更确切的是说调试调用fork的多进程程序。 使用GDB最好的文档就是其名为&amp;#39;Debugging with GDB&amp;#39;的参考手册。手册中有一小章节提到了如何调试...</description></item><item><title>Hacker Culture摘要</title><link>https://tonybai.com/2006/01/05/hacker-culture-summary/</link><pubDate>Thu, 05 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/05/hacker-culture-summary/</guid><description>最近看了Eric S. Raymond的被称为开源文化圣典的&amp;#39;Cathedral and Bazaar&amp;#39;(大教堂与市集)以及他的另外一篇文章&amp;#39;How To Become A Hacker&amp;#39;，必须承认的是我不能够完全理解其中的内容，因为没有体验，或者说我还不够资格对Hacker Culture高谈阔论，所以这里仅作部分摘要，并说说自己第一时间的感受，望日后能温故知新。 在开始了解Hacker Cul...</description></item><item><title>在Linux上工作</title><link>https://tonybai.com/2005/12/15/working-on-linux/</link><pubDate>Thu, 15 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/15/working-on-linux/</guid><description>在Linux上学习Linux内核我想应该是最好的方法了。Linux对我来说绝对是一个新鲜环境，搭建在Linux上的工作环境就是我的首要工作，这篇blog记录的就是我在Linux上的工作环境，也希望对大家有些借鉴意义。 我的Linux是在一个多月以前安装的\[注1]，安装的版本是Fedora Core 4。我使用的是本地磁盘映像安装，磁盘映像文件很大，总共4个，大约2.4G体积。安装过程倒是没有像网...</description></item><item><title>APR源代码分析-线程同步篇</title><link>https://tonybai.com/2005/12/11/apr-thread-synchronization/</link><pubDate>Sun, 11 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/11/apr-thread-synchronization/</guid><description>在线程同步方面，Posix标准定义了3种同步模型，分别为互斥量、条件变量和读写锁。APR也“浅”封装了这3种模型，只是在“读写锁”一块儿还没有全部完成。 线程同步的源代码的位置在$(APR\_HOME)/locks目录下，本篇blog着重分析unix子目录下的thread\_mutex.c、thread\_rwlock.c和thread\_cond.c文件的内容，其相应头文件为(APR\_HOME...</description></item><item><title>APR分析-线程篇</title><link>https://tonybai.com/2005/12/08/apr-thread/</link><pubDate>Thu, 08 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/08/apr-thread/</guid><description>并行一直是程序设计领域的难点，而线程是并行的一种重要的手段，而且线程的一些特性也能在进程并行时发挥很好的作用(在“线程同步篇”中详细阐述)。 APR线程的源代码的位置在$(APR\_HOME)/threadproc目录下，本篇blog着重分析unix子目录下的thread.c文件内容，其相应头文件为$(APR\_HOME)/include/apr\_threadproc.h。 一、线程基础 《深入...</description></item><item><title>APR源代码分析-网络IO篇</title><link>https://tonybai.com/2005/12/05/apr-network-io/</link><pubDate>Mon, 05 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/05/apr-network-io/</guid><description>“这个世界如果没有了网络就好比没有了石油、没有了电一样，是多么的可怕呀。”相信世界上已经有很多很多的人能够同意这种观点了，通过这个观点也可以看出网络在现代人们心中的地位。而运行在网络节点上的网络应用程序则是在幕后默默地为人们提供着服务。Apache Server就是其中一个典型的代表。而APR网络I/O库则像磐石一样支撑着Apache Server的运行。 APR网络I/O的源代码的位置在$(AP...</description></item><item><title>APR源代码分析-进程同步篇</title><link>https://tonybai.com/2005/12/02/apr-process-synchronization/</link><pubDate>Fri, 02 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/02/apr-process-synchronization/</guid><description>最新的统计数据显示Apache服务器在全世界仍然占据着Web服务器龙头老大的位置，而且市场占有率遥遥领先，所以学习Apache相关知识是完全正确的方向，这里我们继续分析APR进程同步相关内容。 进程同步的源代码的位置在$(APR\_HOME)/locks目录下，本篇blog着重分析unix子目录下的proc\_mutex.c、global\_mutex文件内容，其相应头文件为$(APR\_HOME...</description></item><item><title>C单元测试包设计与实现</title><link>https://tonybai.com/2005/11/08/the-design-and-implementation-of-c-unittest-framework/</link><pubDate>Tue, 08 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/08/the-design-and-implementation-of-c-unittest-framework/</guid><description>在Java、C++和C#等高级语言的单元测试正进行的如火如荼的时候，C好像做了看客，冷清的躲在了一个不起眼的角落里。C并不是没有单元测试工具，像Check和CUnit这样的工具也很有名气，只是和大名鼎鼎的JUnit比起来，还是显得有些英雄气短。很多大型的C项目，如APR等都没有使用像Check、CUnit这样通用的单元测试框架，而是另起炉灶自己编写。其实编写一个仅能满足单个项目需要的C单元测试工具...</description></item><item><title>APR源代码分析-环篇</title><link>https://tonybai.com/2005/11/03/apr-ring/</link><pubDate>Thu, 03 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/03/apr-ring/</guid><description>APR中少见对数据结构的封装，好像唯一例外的就是其对循环链表，即环(RING)的封装。 在大学的时候学的不是计算机专业，但大三的时候我所学的专业曾开过一门好像叫“计算机软件开发基础”的课，使用的是清华的一本教材，课程的内容包括数据结构。说实话听过几节课，那个老师讲的还不错，只是由于课程目标所限，没讲那么深罢了。当然我接触数据结构要早于这门课的开课时间。早在大一下学期就开始到计算机专业旁听“数据结构...</description></item><item><title>APR源代码分析-共享内存篇</title><link>https://tonybai.com/2005/09/23/apr-shmem/</link><pubDate>Fri, 23 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/23/apr-shmem/</guid><description>共享内存是一种重要的IPC方式。在项目中多次用到共享内存，只是用而并未深入研究。这次趁研究APR代码的机会复习了共享内存的相关资料。 APR共享内存封装的源代码的位置在$(APR\_HOME)/shmem目录下，本篇blog着重分析unix子目录下的shm.c文件内容，其相应头文件为$(APR\_HOME)/include/apr\_shm.h。 一、共享内存简单小结 共享内存是最快的IPC方式，...</description></item><item><title>APR源代码分析-高级IO篇</title><link>https://tonybai.com/2005/09/17/apr-advanced-io/</link><pubDate>Sat, 17 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/17/apr-advanced-io/</guid><description>近两天稍轻闲了些，便抓紧时间学习、学习再学习。在“APR分析-文件IO篇”，我们只分析了最基本的I/O操作，如文件的open、close、write和read。当然File I/O操作不止这些，在这一篇中我们来看看APR提供的一些高级I/O设施，包括记录锁、I/O多路复用和内存映射文件(内存映射文件将和共享内存一起分析)。 一、记录锁或(区域锁)\[注1] 我见过的对记录锁讲解最详细的书就是《Un...</description></item><item><title>APR源代码分析-文件IO篇</title><link>https://tonybai.com/2005/09/15/apr-file-io/</link><pubDate>Thu, 15 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/15/apr-file-io/</guid><description>文件I/O在Unix下占据着非常重要的地位，曾有一句经典语句绝对可以说明file在Unix下的重要性，That is &amp;#34;In UNIX, everything is a file&amp;#34;，APR就是本着这个思想对Unix文件I/O进行了再一次的抽象封装，以提供更为强大和友善的文件I/O接口。 APR File I/O源代码的位置在$(APR\_HOME)/file\_io目录下，本篇blog着重分析un...</description></item><item><title>APR源代码分析-信号篇</title><link>https://tonybai.com/2005/09/13/apr-signal/</link><pubDate>Tue, 13 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/13/apr-signal/</guid><description>U know 信号是Unix的重要系统机制。信号机制使用起来很简单，但是理解起来有并不是那么Easy。APR Signal的封装也并不繁琐，代码量很少，所以分析APR Signal的过程其实就是学习Signal机制的过程。 一、信号介绍 1、Signal“历史久远”，在最初的Unix系统上就能看到它“伟岸”的身影。它的引入用来进行User Mode进程间的交互，系统内核也可以利用它通知User M...</description></item><item><title>APR源代码分析-设计篇</title><link>https://tonybai.com/2005/08/30/apr-design/</link><pubDate>Tue, 30 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/30/apr-design/</guid><description>作为一个可移植的运行时环境，APR的设计当然是很精妙的，但精妙的同时对使用者有一些限制。 APR附带一个简短的设计文档，文字言简意赅，其中很多的设计思想都值得我们所借鉴，主要从三个方面谈。 1、类型 1\) APR提供并建议用户使用APR自定义的数据类型，好处很多，比如便于代码移植，避免数据间进行不必要的类型转换（如果你不使用APR自定义的数据类型，你在使用某些APR提供的接口时，就需要进行一些参...</description></item><item><title>APR源代码分析-整体篇</title><link>https://tonybai.com/2005/08/25/apr-introduction/</link><pubDate>Thu, 25 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/25/apr-introduction/</guid><description>由于部门所使用的底层库与Apache Server有着“一定的渊源”，所以总有一种想看看Apache的实现的冲动。最近项目收尾，愿望终可实现。 一、何为APR? Apache Server经过这么多年的发展后，将一些通用的运行时接口封装起来提供给大家，这就是Apache Portable Run-time libraries, APR。 二、APR的目录组织 从www.apache.org上下载a...</description></item><item><title>看完“程序员”2005-04期一些想法</title><link>https://tonybai.com/2005/04/20/thoughts-after-reading-programmer-magazine-200504/</link><pubDate>Wed, 20 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/20/thoughts-after-reading-programmer-magazine-200504/</guid><description>每次看完《程序员》杂志都会有些新的收获，这次看的是《程序员》2005年第4期，顺便把一些阅读过程中产生的想法记录了下来。 \[软件建模，大势所趋] 看完微软、IBM、Borland等公司的最新动态，感觉软件建模是大势所趋，以前虽然也有众多建模工具，但是由工具支持得不好，建模的各个阶段彼此脱节，使用户体验(user experience)很差。随着Microsoft VSTS(Visual Stud...</description></item><item><title>Boost_1_32_0版源代码编译</title><link>https://tonybai.com/2005/01/28/build-boost-1-32-0/</link><pubDate>Fri, 28 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/28/build-boost-1-32-0/</guid><description>著名的C++准标准库boost在2004年末发布了1.32.0版本，作为C++的忠实Fans怎能“袖手旁观”，趁闲暇时download it and build it。\[注\]：由于没有公司Unix服务器的管理员权限，所以只能在自己的Windows平台上编译了。 1、前提 a) 下载Boost\_1\_32\_0源码包(http://sourceforge.net/project/showfil...</description></item></channel></rss>