<?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>程序员 on Tony Bai</title><link>https://tonybai.com/tags/%E7%A8%8B%E5%BA%8F%E5%91%98/</link><description>Recent content in 程序员 on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Tue, 05 May 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/%E7%A8%8B%E5%BA%8F%E5%91%98/index.xml" rel="self" type="application/rss+xml"/><item><title>“AI 让每个人都成了开发者”，就像“相机让每个人都成了摄影师”</title><link>https://tonybai.com/2026/05/05/ai-makes-everyone-a-developer-like-cameras-for-photographers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/05/05/ai-makes-everyone-a-developer-like-cameras-for-photographers/</guid><description>本文永久链接 – https://tonybai.com/2026/05/05/ai-makes-everyone-a-developer-like-cameras-for-photographers 大家好，我是Tony Bai。 最近，在技术圈里流传着一个“非主流观点（Unpopular Opinion）”： &amp;gt; **“‘AI 让每个人都成了开发者’，这句话是真的。就像当年‘相机的发明，让每个...</description></item><item><title>看了 100 小时教程，你为什么依然写不好代码？扒开技术人的“成长环”真相</title><link>https://tonybai.com/2026/03/22/stop-tactical-diligence-start-stretch-zone-growth/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/03/22/stop-tactical-diligence-start-stretch-zone-growth/</guid><description>本文永久链接 – https://tonybai.com/2026/03/22/stop-tactical-diligence-start-stretch-zone-growth 大家好，我是Tony Bai。 在这个技术大爆炸的时代，我见过了太多极其“勤奋”的程序员： 他们会在各大技术平台上收藏几百篇诸如《Go语言进阶课》、《AI原生开发工作流实战》… …的专栏文章，硬盘里塞满了从各种渠道搞来的...</description></item><item><title>Go 的“浮点数陷阱”将被填平：浮点转整数即将在所有平台上行为一致</title><link>https://tonybai.com/2026/01/11/proposal-float-to-int-conversions-should-saturate-on-overflow/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/11/proposal-float-to-int-conversions-should-saturate-on-overflow/</guid><description>本文永久链接 – https://tonybai.com/2026/01/11/proposal-float-to-int-conversions-should-saturate-on-overflow 大家好，我是Tony Bai。 你是否知道，同一行简单的代码 int64(myFloat)，在 Intel (amd64) 机器上可能返回一个巨大的负数，而在 ARM64 机器上却可能返回最大正整...</description></item><item><title>代码之外的修炼：Google 资深工程师的 21 条“生存法则”</title><link>https://tonybai.com/2026/01/11/21-lessons-from-google-engineer/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/11/21-lessons-from-google-engineer/</guid><description>本文永久链接 – https://tonybai.com/2026/01/11/21-lessons-from-google-engineer 大家好，我是Tony Bai。 “当我 14 年前加入 Google 时，我以为这份工作就是写出优秀的代码……我只说对了一部分。我待得越久，就越意识到，那些真正茁壮成长的工程师，不一定是最好的程序员——他们是那些懂得如何驾驭代码**周围**一切的人：人、政...</description></item><item><title>为什么 AI 时代，C++ 和 Rust 反而更火了？Herb Sutter 的硬核解读</title><link>https://tonybai.com/2026/01/03/why-cpp-programmers-keep-growing-fast/</link><pubDate>Sat, 03 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/03/why-cpp-programmers-keep-growing-fast/</guid><description>本文永久链接 – https://tonybai.com/2026/01/03/why-cpp-programmers-keep-growing-fast 大家好，我是Tony Bai。 “软件拿走性能的速度，永远比硬件提供性能的速度要快。” 在 AI 狂热、Python 统治胶水层、硬件算力看似无限增长的今天，C++ 标准委员会主席 Herb Sutter 却抛出了一个反直觉的结论：**C++ ...</description></item><item><title>别演了，真实的程序员根本不修电脑：我们左手AI，右手星辰大海</title><link>https://tonybai.com/2025/12/21/real-programmers-dont-fix-computers-ai-stars-and-seas/</link><pubDate>Sun, 21 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/21/real-programmers-dont-fix-computers-ai-stars-and-seas/</guid><description>本文永久链接 – https://tonybai.com/2025/12/21/real-programmers-dont-fix-computers-ai-stars-and-seas 大家好，我是Tony Bai。 最近陪家人看几部青春都市剧，实在忍不住想吐槽。 无论题材如何变，编剧笔下的程序员永远是那副德行：戴着黑框眼镜，背着双肩包，唯唯诺诺。而他们的戏份，似乎永远逃不开那一幕—— 男主角或...</description></item><item><title>给了机关枪，你却非要耍大刀：2025 年末，程序员 All in AI 的生存启示录</title><link>https://tonybai.com/2025/12/09/programmer-all-in-ai-survival-revelation-in-2025/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/09/programmer-all-in-ai-survival-revelation-in-2025/</guid><description>本文永久链接 – https://tonybai.com/2025/12/09/programmer-all-in-ai-survival-revelation-in-2025 大家好，我是Tony Bai。 最近逛 Twitter 和技术论坛，我发现了一个非常有意思，甚至有些魔幻的现象。 尽管我们已经站在了 **2025 年末**，距离 ChatGPT 震撼发布已经过去了整整三年，AI 能力早已...</description></item><item><title>Anthropic 内部报告：程序员的“死”与“生”，效率暴增 50% 的残酷启示</title><link>https://tonybai.com/2025/12/05/how-ai-is-transforming-work-at-anthropic/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/05/how-ai-is-transforming-work-at-anthropic/</guid><description>本文永久链接 – https://tonybai.com/2025/12/05/how-ai-is-transforming-work-at-anthropic 大家好，我是Tony Bai。 当我们还在争论 AI 编程是否是“玩具”时，Anthropic 已经把镜头对准了自己。 2025 年 8 月，这家打造了 Claude 的顶尖 AI 公司，对自己内部的 132 名工程师和研究员进行了一次深...</description></item><item><title>白天改Bug，晚上刷视频：你以为在放松，其实在消耗你写出好代码的能力</title><link>https://tonybai.com/2025/11/23/short-form-videos-harm-programmers/</link><pubDate>Sun, 23 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/23/short-form-videos-harm-programmers/</guid><description>本文永久链接 – https://tonybai.com/2025/11/23/short-form-videos-harm-programmers 大家好，我是Tony Bai。 我想请你回想一个再熟悉不过的场景： 白天，你在成千上万行代码的丛林里艰难跋涉，与一个隐藏极深的Bug缠斗了数个小时，心力交瘁。晚上回到家，你只想“犒劳”一下疲惫的大脑，于是瘫倒在沙发或舒服的大床上，划开手机，沉浸在短视...</description></item><item><title>从韩立到梅西：顶级“全栈工程师”的修炼之道与生存哲学</title><link>https://tonybai.com/2025/11/23/leo-messi-and-fanren-hanli/</link><pubDate>Sun, 23 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/23/leo-messi-and-fanren-hanli/</guid><description>从韩立到梅西：顶级“全栈工程师”的修炼之道与生存哲学 - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * 文章列表 ...</description></item><item><title>从《凡人修仙传》到《三体》：顶尖程序员的“降维打击”与“法则”之力</title><link>https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power/</link><pubDate>Fri, 24 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power/</guid><description>本文永久链接 – https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power 大家好，我是Tony Bai。 在上篇文章中，我们论道了程序员的修仙境界。但一个更深层的问题随之而来：决定一个修士（程序员）最终高度的，究竟是什么？是掌握了更多华丽的“法术”（框架/工具），还是洞悉了其背后的“天地法则”（底...</description></item><item><title>划船，还是扬帆？重新审视 996 文化背后的杠杆缺失</title><link>https://tonybai.com/2025/10/16/rethink-996-culture/</link><pubDate>Thu, 16 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/16/rethink-996-culture/</guid><description>划船，还是扬帆？重新审视 996 文化背后的杠杆缺失 - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * 文章列表 ...</description></item><item><title>Go写业务是垃圾？Rust重写是坨屎？聊聊程序员评论区里的那股“煞气”</title><link>https://tonybai.com/2025/09/19/the-tension-in-programmer-comments/</link><pubDate>Fri, 19 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/19/the-tension-in-programmer-comments/</guid><description>本文永久链接 – https://tonybai.com/2025/09/19/the-tension-in-programmer-comments 大家好，我是Tony Bai。 做公众号/博客这些年，我收到了成千上万条来自程序员朋友的评论。绝大多数都充满了智慧、好奇和善意，正是这些交流，构成了我持续分享的最大动力。但与此同时，我也常常在评论区里，感受到一股强烈的、带有攻击性的无形之气。 比如，...</description></item><item><title>“包管理器是万恶之源”：一次来自Odin语言作者的灵魂拷问</title><link>https://tonybai.com/2025/09/13/package-managers-are-evil/</link><pubDate>Sat, 13 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/13/package-managers-are-evil/</guid><description>本文永久链接 – https://tonybai.com/2025/09/13/package-managers-are-evil 大家好，我是Tony Bai。 &amp;gt; “包管理器是万恶之源 (Package Managers are Evil)。” 这句石破天惊的论断，出自Odin语言的创造者Ginger Bill最近发表的一篇博文。在一个npm install、pip install、go ge...</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>我的 Gopher “长期主义”：从《Go语言第一课》新书说起</title><link>https://tonybai.com/2025/08/28/go-primer-published/</link><pubDate>Thu, 28 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/28/go-primer-published/</guid><description>本文永久链接 – https://tonybai.com/2025/08/28/go-primer-published 大家好，我是Tony Bai。 前不久，在知乎上看到一个关于 Go 社区的帖子，其中一条评论让我感慨良多： &amp;gt; **“GopherChina 都没了，国内还有几人坚持？Tony Bai好像还在更新”** 短短一句话，道尽了社区的变迁与坚持的不易。这句来自读者的回答，让我内心欣慰，...</description></item><item><title>Go 的“身份危机”：当新 Gopher 试图将它变成他们最爱的语言</title><link>https://tonybai.com/2025/08/12/go-identity-crisis/</link><pubDate>Tue, 12 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/12/go-identity-crisis/</guid><description>本文永久链接 – https://tonybai.com/2025/08/12/go-identity-crisis 大家好，我是Tony Bai。 最近，在国外的 Go 社区（Reddit r/golang）上，一个帖子引发了我的深思。发帖者是一位资深的 Gopher，他用一种略带困惑的语气写道： &amp;gt; “我感受到来自新 Go 开发者的巨大压力，他们想把 Go 变成他们最喜欢的语言。” 他列出了一...</description></item><item><title>系统设计的“元素周期表”：40个横跨所有领域的通用设计原则</title><link>https://tonybai.com/2025/07/31/periodic-table-of-system-design/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/31/periodic-table-of-system-design/</guid><description>本文永久链接 – https://tonybai.com/2025/07/31/periodic-table-of-system-design 大家好，我是Tony Bai。 近日，一篇名为《系统设计的元素》（Elements of System Design）的论文引发社区热议。它的目标宏大且吸睛：通过梳理上百篇横跨操作系统、数据库、分布式系统等领域的经典论文，提炼出一套通用的**系统设计原则“...</description></item><item><title>Anthropic内部实践首次公开：揭秘Claude Code如何引爆全员生产力</title><link>https://tonybai.com/2025/07/25/how-anthropic-teams-use-claude-code/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/25/how-anthropic-teams-use-claude-code/</guid><description>本文永久链接 – https://tonybai.com/2025/07/25/how-anthropic-teams-use-claude-code 当 AI 编程助手从简单的代码补全工具，演变为深度集成于开发者工作流核心的“终端原生 AI”（Terminal-native AI）时，一个根本性的问题浮现出来：**顶尖团队究竟是如何在日常工作中驾驭这股新力量的？** 理论和演示层出不穷，但真实、...</description></item><item><title>AI 正在重写“软件工程师”的岗位描述：未来你需要这 6 项核心技能</title><link>https://tonybai.com/2025/07/15/the-agentic-software-engineer/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/15/the-agentic-software-engineer/</guid><description>AI 正在重写“软件工程师”的岗位描述：未来你需要这 6 项核心技能 - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏...</description></item><item><title>云原生时代，如何用RED三板斧搞定服务监控？</title><link>https://tonybai.com/2025/05/26/monitor-design-with-red/</link><pubDate>Mon, 26 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/26/monitor-design-with-red/</guid><description>云原生时代，如何用RED三板斧搞定服务监控？ - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 文章...</description></item><item><title>思想实验：如果全球网站一夜之间弃用HTTPS，能为地球节省多少电？</title><link>https://tonybai.com/2025/05/16/energy-savings-if-abandon-https/</link><pubDate>Fri, 16 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/16/energy-savings-if-abandon-https/</guid><description>思想实验：如果全球网站一夜之间弃用HTTPS，能为地球节省多少电？ - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ...</description></item><item><title>揭秘顶尖技术专家的15个关键方法与心态，不只靠代码</title><link>https://tonybai.com/2025/04/13/top-programmers-methods-mindset/</link><pubDate>Sun, 13 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/13/top-programmers-methods-mindset/</guid><description>揭秘顶尖技术专家的15个关键方法与心态，不只靠代码 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 *...</description></item><item><title>写Go就像喝白开水</title><link>https://tonybai.com/2024/10/29/go-coding-is-like-drinking-boiled-water/</link><pubDate>Tue, 29 Oct 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/10/29/go-coding-is-like-drinking-boiled-water/</guid><description>写Go就像喝白开水 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 写Go就像喝白开水 ========= * 十月...</description></item><item><title>代码提交者的代码评审通关指南[译]</title><link>https://tonybai.com/2024/10/11/the-cl-author-guide-to-getting-through-code-review/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/10/11/the-cl-author-guide-to-getting-through-code-review/</guid><description>本文永久链接 – https://tonybai.com/2024/10/11/the-cl-author-guide-to-getting-through-code-review Google在软件工程领域对IT界做出了卓越的贡献，从《Google软件工程》，到Google Style Guides，再到The Change Author’s Guide。这些实践参考不仅提升了软件工程的标准，也...</description></item><item><title>致敬：程序员成长路上的良师与经典著作</title><link>https://tonybai.com/2024/09/10/programmer-mentors-and-their-classic-works/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/09/10/programmer-mentors-and-their-classic-works/</guid><description>本文永久链接 – https://tonybai.com/2024/09/10/programmer-mentors-and-their-classic-works 早上送孩子去幼儿园的路上，收到一个小伙伴的微信： 我这才意识到今天是教师节！为人师，自觉还不够格！但在这个特殊的日子，作为IT行业从业人员，我想向那些在计算机科学和编程领域给予我们启迪的“老师们”致敬。这些老师可能不是传统意义上站在讲...</description></item><item><title>十分钟入门Go语言</title><link>https://tonybai.com/2023/02/23/learn-go-in-10-min/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/02/23/learn-go-in-10-min/</guid><description>本文永久链接 – https://tonybai.com/2023/02/23/learn-go-in-10-min 本文旨在带大家快速入门Go语言，期望小伙伴们在花费十分钟左右通读全文后能对Go语言有一个初步的认知，为后续进一步深入学习Go奠定基础。 本文假设你完全没有接触过Go，你可能是一名精通其他编程语言的程序员，也可能是毫无编程经验、刚刚想转行为码农的热血青年。 编程简介 ---- 编程就...</description></item><item><title>让reviewdog支持gitlab-push-commit，守住代码质量下限</title><link>https://tonybai.com/2022/09/08/make-reviewdog-support-gitlab-push-commit-to-preserve-the-code-quality-floor/</link><pubDate>Thu, 08 Sep 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/09/08/make-reviewdog-support-gitlab-push-commit-to-preserve-the-code-quality-floor/</guid><description>本文永久链接 – https://tonybai.com/2022/09/08/make-reviewdog-support-gitlab-push-commit-to-preserve-the-code-quality-floor 一. 代码质量保证的手段 从世界上首款计算机高级程序设计语言Fortran自上世纪50年代诞生以来，编程这个行当已经走过了近70年。虽然年头已不少，但不可否认的一点是...</description></item><item><title>Go语言学习技术路线图2021发布了！</title><link>https://tonybai.com/2021/02/08/go-programming-language-learning-roadmap-2021/</link><pubDate>Mon, 08 Feb 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/02/08/go-programming-language-learning-roadmap-2021/</guid><description>上一次与CSDN的合作还要追溯到《程序员》杂志仍然发行的时代(网络发行)，最后一次投稿是2017年末的《追求极简：Docker镜像构建演化史》。 今年元旦前，CSDN编辑周翔老师邀请我参与他们策划的“IT人才成长路线图”，合作编写其中的Go语言学习技术路线图。**出于让更多开发者学习Go语言、加入Go社区、壮大Go生态的公心考虑以及扩大个人影响力的私心考虑，我接受了邀请**。 去年圣诞节的前一周我...</description></item><item><title>专访稿：兴趣才是第一生产力</title><link>https://tonybai.com/2017/05/18/an-interview-from-operation-partner-in-2017/</link><pubDate>Thu, 18 May 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/05/18/an-interview-from-operation-partner-in-2017/</guid><description>本文是公司“运营拍档”公众号的专访文稿，这里转载一下^0^。原文链接在这里&amp;amp;version=11020201&amp;amp;pass_ticket=ia4cVivHQScpxBfw10RPkT%2BWZVT1yfyMiTZHrOO15OBtpNZhx0V6DxxEFUySX3io)。 十年生死两茫茫，白天忙，晚上忙，写程序，到天亮。千行代码，Bug何处藏。纵使上线又怎样，朝令改，夕断肠…… * * * **白 ...</description></item><item><title>探讨Docker容器中修改系统变量的方法</title><link>https://tonybai.com/2014/10/14/discussion-on-the-approach-to-modify-system-variables-in-docker/</link><pubDate>Tue, 14 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/14/discussion-on-the-approach-to-modify-system-variables-in-docker/</guid><description>探讨完Docker对共享内存状态持久化的支持状况后，我将遗留产品build到一个pre-production image中，测试启动是否OK。很显然，我过于乐观了，Docker之路并不平坦。我收到了shmget报出的EINVAL错误码，提示参数非法。 shmget的manual对EINVAL错误码的说明如下： EINVAL： A  new  segment  was  to  be  create...</description></item><item><title>探讨docker容器对共享内存的支持情况</title><link>https://tonybai.com/2014/10/12/discussion-on-shared-mem-support-in-docker/</link><pubDate>Sun, 12 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/12/discussion-on-shared-mem-support-in-docker/</guid><description>我们的遗留系统广泛使用了性能最佳的IPC方式 – 共享内存，而且用到了两种共享内存的实现方式：System V共享内存(shmget、shmat、shmdt)以及Mmap映射Regular File。System V共享内存支持一定程度上的内存数据持久化，即当程序创建共享内存对象后，如果不显式删除或物理主机重启，该IPC对象会一直保留，其中的数据也不会丢 失；mmap映射Regular File的...</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>说说执行力</title><link>https://tonybai.com/2014/03/05/thought-on-executive-power/</link><pubDate>Wed, 05 Mar 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/03/05/thought-on-executive-power/</guid><description>_You are never to dictate what I can and can not do. The only two words I want to hear from you when I ask you to do something are &amp;#34;Yes&amp;#34; and &amp;#34;Sir&amp;#34;。（我能做什么不能做什么，你管不着。我吩咐你做事的时候，只想听到两个词，&amp;#34;是的&amp;#34;和&amp;#34;先生&amp;#34;。）       ...</description></item><item><title>关于2014团队改善的考量</title><link>https://tonybai.com/2014/03/03/considerations-on-team-improved-in-2014/</link><pubDate>Mon, 03 Mar 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/03/03/considerations-on-team-improved-in-2014/</guid><description>_一个人的品行，不取决于这人如何享受胜利，而在于这人如何忍受失败。                                                                        — 《纸牌屋》第一季_ 团队改善，不是那种很快见到成果或者效益的活儿。 但这件事你做不做呢？坦诚的说，今年我在这方面的“热情”真的不是那么高，肯定是不如前两年了，因为是时候更多地为自己的“前...</description></item><item><title>厨房里的领导课</title><link>https://tonybai.com/2014/02/18/mentoring-in-the-kitchen/</link><pubDate>Tue, 18 Feb 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/02/18/mentoring-in-the-kitchen/</guid><description>_生活中永远不缺少大道理，缺的是一颗善于思考和发现它们的心。                                                                         – Tony Bai_ 晚上回到家，家人端上来热腾腾的饭菜。吃了几口，感觉味道较为普通。盘子里那些被加工过的食材是昨天刚刚买到的，又好又新鲜。顿然一种可惜的赶脚油然而 生。为什么这么上好新鲜的食...</description></item><item><title>2013小结</title><link>https://tonybai.com/2014/01/04/my-summary-of-2013/</link><pubDate>Sat, 04 Jan 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/01/04/my-summary-of-2013/</guid><description>2013年的个人年终总结比以往来得晚了一些，至于原因，我也说不清楚，拖延症也罢，其他原因也罢，总之是晚了。 写年终小结已经有小几年了，风格一直如一，无非是老三样：工作得失、生活酸甜以及新年展望，今年也不利外。 **\* 工作篇** 我们部门在所在行业里已经摸爬滚打了10多年了，经 历和见证了这个行业从诞生、增长、成熟到如今的衰退的整个过程。也正是由于处于行业的衰退期，2013年部门的运营十分艰难。...</description></item><item><title>向安德学指挥</title><link>https://tonybai.com/2013/12/27/learn-how-to-command-from-ender/</link><pubDate>Fri, 27 Dec 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/12/27/learn-how-to-command-from-ender/</guid><description>_指挥官必须有良好的精神素质，必须具备果敢、坚定的性格和冷静的智慧；必须了解和 学习控制部队对于死亡和痛苦的反应。                                                                                                            — 克劳塞维茨 《战争论》_ 指挥，看起来并非是程序员的本职工作。 在...</description></item><item><title>只为那一抹释然</title><link>https://tonybai.com/2013/12/26/just-for-being-relieved/</link><pubDate>Thu, 26 Dec 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/12/26/just-for-being-relieved/</guid><description>_一切没有目标的努力，都是瞎忙活儿。_                                                     _\- Tony Bai_ 刚实施回来，就又投入到新工作中，到今天才有那么一点点时间写写这件事儿。 **\* 缘起** 我们的遗留系统性能一直不高，导致这一局面的因素有很多，比如最初设计和实现的“考虑不足”、后续维护人员的“随波逐流”甚至缺少勇气对影响性能...</description></item><item><title>团队与创造的平衡</title><link>https://tonybai.com/2013/12/21/the-balance-between-team-and-creativity/</link><pubDate>Sat, 21 Dec 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/12/21/the-balance-between-team-and-creativity/</guid><description>_“安德来了之后，我们必段保持一个巧妙的平衡。要让他保持一定程度的孤立，使他创造性不至于消失，否则他就会和这儿的整个团体融合在一起，我们会失去他的天赋。同时，我们也必须确定他有足够的能力去领导别人。”                                                                     — 《安德的游戏》作者：奥森·斯科特·卡德_ 上面的引述是《安...</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/22/those-chinese-style-naming-in-code-again/</link><pubDate>Fri, 22 Nov 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/11/22/those-chinese-style-naming-in-code-again/</guid><description>近期博客访问量提高了不少，分析了下原因，发现是有几篇近期写的文章被某个好心网友提交到dbanotes的Startup News上了。与此同时，一些反馈也随之而来。从反馈来看，《那些代码中的“中国式”命名》一文似乎受到了更多的关注，或许是文章标题比较容易引起好奇的 缘故吧。但文章的本意仅是想阐述一些事实罢了，并没有“哗众取宠”的意思。网友的观点也促使我重新对“中国式”命名做了反思。 **\* “中国...</description></item><item><title>代码是怎么腐化的</title><link>https://tonybai.com/2013/11/12/how-code-corrupt/</link><pubDate>Tue, 12 Nov 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/11/12/how-code-corrupt/</guid><description>_新三年，旧三年，修修补补又三年。                                                              — 中国俗语。_ 上面的这句俗语用来形容很多遗留软件系统(legacy software system)的现状是再合适不过了。 今天下午做了一下午的代码评审，对象是一个运行了7年的遗留系统。会上除了几处明显的代码逻辑错误我发言指了出来外，涉及...</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/10/22/some-experience-about-learning-programming-language/</link><pubDate>Tue, 22 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/22/some-experience-about-learning-programming-language/</guid><description>_Learn at least one _new language every year_.                                               — Andy Hunt and Dave Thomas_ 自己一直是“每年学习一门新语言”的忠实拥趸，曾先后认真地学习了Haskell、Common Lisp、Python、Go等语言，对Prolog、Scala、...</description></item><item><title>当Bug A遇到Bug B</title><link>https://tonybai.com/2013/10/14/when-bug-a-encounter-bug-b/</link><pubDate>Mon, 14 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/14/when-bug-a-encounter-bug-b/</guid><description>_2002年的Bug A与2008年的Bug B同时穿越到2013年，并在某个场合相遇了。_ 上周六，项目组本应以一个愉快的心情结束一天的工作的，但一个2002年的Bug A与另外一个2008年的Bug B同时穿越时空来到了2013年，并且恰恰在那时那刻（下班前）相遇了，于是项目组由放松变成了忙碌，由愉快变成了紧张，17：30的下班点也因此延迟到了凌晨1：30。 Bug A来源于2002年我们发布...</description></item><item><title>爱上跑步</title><link>https://tonybai.com/2013/10/09/love-running/</link><pubDate>Wed, 09 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/09/love-running/</guid><description>_**生命在于运动。**_                         _– 伏尔泰_ 我无论如何都没有想到自己居然爱上了跑步。 **\* 缘起** 这要追溯到2011年，当时的我感觉自己的身体状况十分不好，各种疲劳感和不适感统统找了上来，精力也严重不足，于是乎给自己开了副药方 – **晨跑**， 期望通过锻炼身体恢复身体各个部分的机能。我坚持跑了一个多月，效果甚好：精力充沛，心情舒畅，工作效...</description></item><item><title>程序 – 程序员的avatar</title><link>https://tonybai.com/2013/10/08/program-the-avatar-of-programmers/</link><pubDate>Tue, 08 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/08/program-the-avatar-of-programmers/</guid><description>程序是什么？ 大师们曾给过这样的诠释：        _程序 = 数据 + 指令     程序 = 数据结构 + 算法_ 对此我也表示十分认同。但感觉这些观点更多是从机器运行模型或逻辑抽象的角度看待程序的，是左脑的产物。我的右脑告诉我：_**程序是程序员的avatar**_（化身）。这个隐喻式的诠释会让“程序”更有温度，并有些许人性的色彩。 计算机（CPU、主板、内存、磁盘、网络）为程序提供了一个...</description></item><item><title>站在更高的平台上</title><link>https://tonybai.com/2013/09/24/stand-on-a-higher-platform/</link><pubDate>Tue, 24 Sep 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/09/24/stand-on-a-higher-platform/</guid><description>中秋休假期间，在PPS上看了最新一集的龙珠Z剧场版“龙珠Z：神与神”。《七龙珠》是我最喜欢的一部日本漫画，年少时曾为之疯狂过。其对应的动画片《龙珠》以及《龙珠Z》我也是集集不落的，这部“龙珠Z：神与神”延续了龙珠Z的精彩。 片中主人公孙悟空与破坏神比鲁斯有过两次交手。第一次在界王星上，变身为超级塞亚人3的孙悟空被破坏神几乎“秒杀”；第二次是为了保护地球，孙悟空在悟饭、悟天、贝吉塔、特兰克斯的帮助下...</description></item><item><title>结婚五周年纪念</title><link>https://tonybai.com/2013/09/09/fifth-wedding-anniversary/</link><pubDate>Mon, 09 Sep 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/09/09/fifth-wedding-anniversary/</guid><description>今天是一个特别值得纪念的日子 – 我和老婆的**结婚五周年纪念日**。五年前的今天我和老婆领了证，正式步入了围城。平时总被她抱怨不浪漫的我这次特意准备了一对黄金玫瑰耳钉作为我们“木婚” （结婚五年）纪念日的礼物。老婆也蛮喜欢，我也甚是Happy（以前LP总是不中意我给她买的礼物）。 很想对这五年来的婚姻生活做一次“精彩”的回顾，但想了许久，也不得思路。于是我发现这几年的婚姻生活和大多数家庭一样 –...</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>我的工作原则2</title><link>https://tonybai.com/2013/09/03/my-personal-work-principles-2/</link><pubDate>Tue, 03 Sep 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/09/03/my-personal-work-principles-2/</guid><description>_自我认知是循序渐进的，体会到了，就想将其整理出来，给自己一个交代。_                                                                             _\- Tony Bai_ 关于我的工作原则，感觉之前的那篇总结的还不够，这两天通过观察自己的所言所行，又有了些思绪，这里记录下来。 **\* 重塑标准** 简单来说就是根据组...</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>利用ZooKeeper服务实现分布式系统的Leader选举</title><link>https://tonybai.com/2013/08/23/leader-election-using-zookeeper/</link><pubDate>Fri, 23 Aug 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/08/23/leader-election-using-zookeeper/</guid><description>每次与Java组的同事们坐下来谈技术、谈理想、谈人生时，Java组的同事总会向我们投来羡慕的眼光：卧槽！又是自己开发的工具，太NB了。这时C程序 员们的脸上就会洋溢出自豪的笑容，然后内心骂道：谁让我们没有现成的呢。另一个空间里的某些“无C不欢”们或者某些“C Guru”们会骂道：靠，有了也不用，自己写！ 有时候，C程序员真的有一种下意识：不情愿使用其他语言开发的工具、框架或服务，且比其他程序员更爱...</description></item><item><title>我的工作原则</title><link>https://tonybai.com/2013/08/19/my-personal-work-principles/</link><pubDate>Mon, 19 Aug 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/08/19/my-personal-work-principles/</guid><description>想了若干种开场白，但无论哪种都不能令我满意，于是索性就这么开场了。 工作了若干年，不经意间就形成了自己的行事和决策风格，这里权且称之为工作原则吧。这些原则引导我制定工作目标、实施过程改善、作出方案决策、选择和培养团队人员以及进行自我改进等。我也相信这些原则是主观的、具有时间和环境局限性的。也许若干年后，随着我的角色和工作的变化，许多原则将 不再适用，但这不妨碍我现在将其总结和分享出来。 **\* ...</description></item><item><title>Ubuntu 12.04修复记</title><link>https://tonybai.com/2013/08/07/ubuntu-12-04-repairing-notes/</link><pubDate>Wed, 07 Aug 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/08/07/ubuntu-12-04-repairing-notes/</guid><description>今天一早发现Ubuntu 12.04坏掉了，于是用了大半天对其做了修复，修复过程十分坎坷，但结果还不错，遂记之以备忘。 **\* 毁掉Ubuntu** Ubuntu坏掉完全是由于我的错误决策。昨天一天Ubuntu桌面右上方的状态拦一直有一个红色的错误提示符，提示系统包冲突，建议执行sudo apt-get install -f解决。apt-get也提示索引冲突，无法卸载和安装任何包。于是执行了su...</description></item><item><title>再谈组织工作效率提升</title><link>https://tonybai.com/2013/08/04/more-thoughts-on-improving-efficiency/</link><pubDate>Sun, 04 Aug 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/08/04/more-thoughts-on-improving-efficiency/</guid><description>工作效率提升，是所有企业组织都追求的一个目标。高效率意味着用更少到人可以做更多的活儿，赚取更多的利润。员工收入也会有较大提升，有面子；管理层的收 入就更水长船高了。但说起来容易，做起来难。工作效率低下一直是让各个组织的管理者头疼的问题，组织无论大小，无论中外，皆如此。 从大的方面来看，提高效率的策略不会很多，万变不离其中，关键是落实，措施要与自己的组织实际情况匹配。两年前自己曾经写过一篇博文“提升...</description></item><item><title>毕业九年 – 忆我的大学同学</title><link>https://tonybai.com/2013/07/30/recall-my-college-classmates-after-graduating-9-years/</link><pubDate>Tue, 30 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/30/recall-my-college-classmates-after-graduating-9-years/</guid><description>又是一年毕业季。自从九年前坐车驶出母校大门，我就再也没有回过母校，确是十分怀念，但更是怀念那些一起生活了四年的大学同学们。刚毕业那会儿，与同学们 还都保持着联系。后来大家都有了自己的新圈子，渐渐的联系少了，甚至断了。最初的校友录也荒废了，QQ我早就不用了，于是乎与大家天各一方，各自发展。 上周五去北京开会，会后我的直接领导去见他的大学同学，我也被邀请同去了^\_^（要么也是无聊地等火车）。饭桌上两...</description></item><item><title>也谈代码行统计</title><link>https://tonybai.com/2013/07/24/thoughts-about-lines-of-code-statistics/</link><pubDate>Wed, 24 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/24/thoughts-about-lines-of-code-statistics/</guid><description>一直在纠结要不要就这个话题写点什么，之前梳理过一些思路，但感觉这个题目似乎没什么大意义。不过将东西憋在肚子里的滋味总是不好受的，最终我还是选择写出来一些，即便它真的没有什么意义^\_^。 事情缘于近期领导让我负责的一个内部任务：制定组织内的代码行统计标准并实现标准化的工具。就是这个任务促使了我对代码行统计重新做了一番考量。 **对代码行统计的理解** 代码行统计这个活动不是软件开发过程中的关键路径...</description></item><item><title>给新手程序员的建议</title><link>https://tonybai.com/2013/07/18/advice-to-a-new-programmer/</link><pubDate>Thu, 18 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/18/advice-to-a-new-programmer/</guid><description>本文翻译自Dr. Dobb’s杂志主编Andrew Binstock的&amp;#34;Advice to a new programmer&amp;#34;一文**。** **总是有太多的建议摆在新手程序员面前，以致他们难于选择从何处开始。然而，所有这些建议都是建构在下面这五条实践的基础之上的。** 每隔几个月，我就会收到一些勤奋有加的新手程序员的求助，他们希望知道如何才能成为一名真正优秀的程序员。在一些程序员论坛上，我也能看...</description></item><item><title>Python脚本命令行变量的实现</title><link>https://tonybai.com/2013/07/09/an-implementation-of-python-commandline-variables/</link><pubDate>Tue, 09 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/09/an-implementation-of-python-commandline-variables/</guid><description>我们知道Make工具是支持命令行变量的，这种手段为我们提供了很好的灵活性，我们可以通过敲入不同的命令行参数来决定Makefile脚本的行为。 make \[variable1=value1 variable2=value2 ... ... \]。 \Makefile CMODE = 64-bit ifeq ($(CMODE), 64-bit)     CFLAGS += -m64 endif al...</description></item><item><title>代码评审，由人治过渡到“法治”</title><link>https://tonybai.com/2013/07/08/code-review-from-rule-of-man-to-rule-of-law/</link><pubDate>Mon, 08 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/08/code-review-from-rule-of-man-to-rule-of-law/</guid><description>事实证明：有效的代码评审(Code Review，也有叫代码审查的），对保证代码质量具有十分重要的作用。因此这两年来我一直尝试着在这块不断改进和完善，以期望能形成一套合理、规范、有 效且高效的代码评审流程，这包括引入在线代码评审系统、走查和在线评审结合、规范评审Request的规模与有效性、设立评审专员等，用心不可谓不良苦 ^\_^。大家也的确形成了及时提交Code Review Request或...</description></item><item><title>港澳行记</title><link>https://tonybai.com/2013/06/18/a-hongkong-macau-trip/</link><pubDate>Tue, 18 Jun 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/06/18/a-hongkong-macau-trip/</guid><description>_我来也匆匆，去也匆匆。_                                     _— 某歌词_ 记忆中和LP一起出去旅行的次数少的可怜，上一次还是在结婚蜜月时，去的是九寨。二人一起出游是很美妙的，印象也是深刻的，至今当时在九寨的情形 还能历历在目。于是年初就和LP定下了今年的一个家庭目标：一起出去玩一次。 不过真正要确定何时以及去哪出游还是很困难的，毕竟工作上的事情和照顾孩子的...</description></item><item><title>跨过BUG查找的"最后一公里"</title><link>https://tonybai.com/2013/06/18/walk-through-the-last-mile-of-bugfix/</link><pubDate>Tue, 18 Jun 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/06/18/walk-through-the-last-mile-of-bugfix/</guid><description>_如果你看到一个C程序员在通宵熬夜神情紧张地对着电脑敲代码或阅读代码，多数只有两种可能：一是为了赶进度；二就是查找内存Bug。_                                                                                                                               _— 个人感悟_ ...</description></item><item><title>《Understanding and Using C Pointers》要点先睹为快</title><link>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/</link><pubDate>Tue, 28 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/</guid><description>_如果你问十个C程序员：你觉得C语言的核心是什么？这十个程序员都会回答：指针。_ 指针具备成为C语言核心的两个关键要素：**强大**与**争议**。 \* **指针的强大**源自于其天生与机器内存模型的适配。使用指针让代码紧凑，并可获得仅次于汇编代码的执行效率；使用指针可以让C程 序员毫不费力地尽情操纵着内存中的每个byte甚至是bit；使用指针可以为C程序员提供无与伦比的操作灵活性。总之，在C语...</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>果果3周岁了</title><link>https://tonybai.com/2013/05/18/daughter-is-3-years-old/</link><pubDate>Sat, 18 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/18/daughter-is-3-years-old/</guid><description>果果已经3周岁了，这是一个不争的事实。这意味着我又变老了^\_^。过去的东西已经无法抓住了，目前我能做的就是欣赏现实了^\_^。 3岁的果果长的越来越有女孩儿的味道了^\_^。 3岁的果果生长发育一切良好，个头还是比同龄的孩子高出那么一截。 3岁的果果说起话来越来越有逻辑性了，我们时常惊诧于其时而冒出的“妙语”。 3岁的果果总是说“喜欢爸爸”，因为妈妈总是加班，而无暇陪着果果玩。 3岁的果果很有自...</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>推动知识管理的这两年</title><link>https://tonybai.com/2013/05/03/the-past-two-years-to-promote-the-knowledge-management/</link><pubDate>Fri, 03 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/03/the-past-two-years-to-promote-the-knowledge-management/</guid><description>掐指算来，部门知识管理的推广工作已有两年了。两年时间不能算短，但对于知识管理这件事来说，只能算是热身阶段，我们依旧站在起跑线上，或者稍乐 观地讲我们只是刚刚迈出了万米长跑的第一步。 下面是这两年来部门内部知识库建设的一个Timeline： \- 2011年中旬，我所在产品线私下在一台PC上建立了基于MediaWiki的知识库。 \- 2011年末产品线在部门内部做了有关知识库与知识管理实践的分享。...</description></item><item><title>libiconv库链接问题一则</title><link>https://tonybai.com/2013/04/25/a-libiconv-linkage-problem/</link><pubDate>Thu, 25 Apr 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/04/25/a-libiconv-linkage-problem/</guid><description>与在Solaris系统上不同，Linux的libc库中包含了libiconv库中函数的定义，因此在Linux上使用libiconv库相关函数，编译时是不需要显式-liconv的。但最近我的一位同事在某redhat enterprise server 5.6机器上编译程序时却遇到了找不到iconv库函数符号的链接问题，到底是怎样一回事呢？这里分享一下问题查找过程。 **一、现场重现** 这里借用一下...</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>简析指针与多维数组</title><link>https://tonybai.com/2013/03/28/pointer-and-multi-dimension-array-in-c/</link><pubDate>Thu, 28 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/28/pointer-and-multi-dimension-array-in-c/</guid><description>上一篇文章中对多级指针做了简要分析，其实只有当指针与多维数组以及函数联合在一起使用时，麻烦才算真正到来。 **零、数组****与数组名** C语言)中的数组的一般声明形式如下： T arr\_name\[n\]; /\* T为类型，n为数组元素个数 \*/ 从**内存布局**角度来说，数组T arr\_name\[n\]就是内存中连续的内存单元，每个内存单元的长度为sizeof(T)，数组的起始内...</description></item><item><title>简析多级指针解引用</title><link>https://tonybai.com/2013/03/23/multi-dimension-pointer-in-c/</link><pubDate>Sat, 23 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/23/multi-dimension-pointer-in-c/</guid><description>指针是C语言)中公认的最为强大的语法要素，但同时也是最难理解的语法要素，它曾给程序员带来了无数麻烦和痛苦，以致于在C语言之后诞生的很多新兴 语言中我们再也难觅指针的身影了。 下面是一个最简单的C语言指针的例子： int a = 5; int \*p = &amp;amp;a; 其中p就是一个指针变量。如果C语言中仅仅存在这类指针，那显然指针不会形成“大患”。经常地我们会在代码中看到下面的情形： int \*\*q...</description></item><item><title>一种基于内存映射文件的系统运行数据提取方法</title><link>https://tonybai.com/2013/03/18/sys-running-data-extraction-method-using-mmap/</link><pubDate>Mon, 18 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/18/sys-running-data-extraction-method-using-mmap/</guid><description>这是我无意中想到的一个方法，估计这个方法已经不是什么新鲜的东西了，很可能在类似的问题场景中早已经被使用了。不过这里还是要说说我的思维过程。 近期在学习一些Linux性能查看和分析方面的工具，比如top、iostat、vmstat以及sar等。在学习过程中我发现这些工具有个共同的特点，那就是她们采集的Linux运行数据都是从/proc下的文件中实时获取并计算而得出的。众所周知，/proc是Linux...</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>也谈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>果果的蛇年春节独白</title><link>https://tonybai.com/2013/02/18/my-daughter-monologue-about-2013-spring-festival/</link><pubDate>Mon, 18 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/18/my-daughter-monologue-about-2013-spring-festival/</guid><description>我叫果果，现在两岁零9个月了。我的身高快到1米了，人家都说我长得又高又大^\_^，我比邻居家的小哥哥还要高，要知道他可比我年长8个月呢。 最近我很开心，因为我和爸爸妈妈一起回老家与爷爷奶奶过春节了。春节是什么，我还不是很清楚。但我的印象中一到春节周围的人都很开心，家家户户都挂上了红灯笼，门上都贴着福字和对联，还燃放那种让我怕怕的很响的鞭炮。春节最让我高兴的是爸爸妈妈都不用去上班了，可以天天陪我一起...</description></item><item><title>期待过年</title><link>https://tonybai.com/2013/02/06/look-forward-to-spring-festival/</link><pubDate>Wed, 06 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/06/look-forward-to-spring-festival/</guid><description>此时此刻，离2013年农历蛇年还有3天了。外面零星地飘起了雪花，也好，这可以让城市的空气变得更加清新。办公室里早已不复以往的“喧嚣”，大家工作的 积极性也不再那么高涨，这的确不是一个比拼职业性的好时候；会议室里灯也都是关着呢，大家似乎已经没什么心情开会了。约1/4的工位已经空了，也许明天后 天这个比例就会变成1/3或者1/2；街上的车流感觉也没有以前那么多了，这一切一切都预示着中国人的农历春节即将...</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>梅西与四座金球</title><link>https://tonybai.com/2013/01/17/leomessi-with-four-ballon-dor/</link><pubDate>Thu, 17 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/17/leomessi-with-four-ballon-dor/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</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>梅西，金球之王</title><link>https://tonybai.com/2013/01/08/leomessi-the-king-of-ballon-dor/</link><pubDate>Tue, 08 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/08/leomessi-the-king-of-ballon-dor/</guid><description>在2012年末，FIFA公布了金球奖最终三位候选人：梅西、伊涅斯塔和C罗，各大博彩公司也就此奖项纷纷开出赔率。从赔率来看，梅西似乎肯定会 赢得今年的FIFA金球。在昨天之前，从金球制作方名签的摆放位置或又法国足球杂志最新一期的封面，也都暗示了梅西即将获奖。不过不到最后，我还 真是没底，毕竟梅西与其他两位对手相比缺少年度重量级冠军荣誉。 今天凌晨，纠结于此事的我睡得十分不踏实。半夜醒来，本以为结果已...</description></item><item><title>说说工作幸福感</title><link>https://tonybai.com/2013/01/04/my-opinion-on-improving-work-happiness/</link><pubDate>Fri, 04 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/04/my-opinion-on-improving-work-happiness/</guid><description>职场上的朋友可能经历过以下两种截然不同的状态： （一） 每天早晨起来都有一种强烈要上班工作的冲动； 一到公司，立即感觉精力充沛，并希望尽快开始做事，不能浪费一分一秒； 每天下班前回顾一天的工作时，都能感觉到收获和进步，并带着笑容下班； 每天回到家里，暂时忘记工作，与家人共度良霄，养足精力； 生活与工作保持一定距离，这始终让你与工作之间有美的感觉。 （二） 每天早晨一想到要上班，就愁云遮面，总想在床...</description></item><item><title>2013新年快乐</title><link>https://tonybai.com/2013/01/01/2013-happy-new-year/</link><pubDate>Tue, 01 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/01/2013-happy-new-year/</guid><description>这篇文章发出来有些迟了，眼看2013年的第一天就将过去了，不过这里依然要**祝福大家2013新年快乐！** 之所以“迟到”，是因为果果最近生病了。自从上周日凌晨到医院输液之后，今天已经是第四次带果果去医院了。不过小家伙儿今天表现十分勇敢，有史以来第一次 在医生扎针的时候表现的泰然自若，没有流出半滴眼泪。不过即便如此，几天的病症也让果果略显消瘦，食欲很差。作为父母的，的确是看在眼里，疼在心里。 元旦...</description></item><item><title>我的博客观</title><link>https://tonybai.com/2012/12/19/my-blog-outlook/</link><pubDate>Wed, 19 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/19/my-blog-outlook/</guid><description>打开我的Google Reader，发现诸多博客达人的博客已经不再更新了，顿颇感遗憾。不过看到还有更多和我一样一直并快乐地写博客的朋友们，心头又是一番欣喜。 如果你问我为何可以长期持续地将博客写下去，我会告诉你：这与我的博客观息息相关。 人有三观：人生观、价值观和世界观。这三观是在你的成长过程中潜移默化地形成的，即便你自己无法表达出来，甚至没有意识到其存在，但这三观却真真切切地在 影响着你人生道路...</description></item><item><title>2012小结</title><link>https://tonybai.com/2012/12/18/my-summary-of-2012/</link><pubDate>Tue, 18 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/18/my-summary-of-2012/</guid><description>趁着世界末日尚未到来，赶紧将2012年总结一番，即便是末日也不能留遗憾不是^\_^。 2012年总体过得还算充实： \*《七周七语言》终于出版了； \* 写了近80篇Blog，虽离目标预期还有差距，但也给我带来了不小的精神愉悦； \* 为《程序员》杂志写了两篇文章，虽然都是短文； \* 读了30多本书，还有10多本尚未读完，不过年初制定的“扫存书”目标没能达成，因为依然不断地有大量的新书加入^\_...</description></item><item><title>关于绩效面谈的一些拙见</title><link>https://tonybai.com/2012/12/13/some-opinions-about-performance-interview/</link><pubDate>Thu, 13 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/13/some-opinions-about-performance-interview/</guid><description>《程序员》杂志的“一分钟先生”专栏之前曾约稿，有两个主题可供选择：制定绩效目标或如何进行绩效面谈。本打算两个主题都写写的，但碍于时间有限，最终只写了一个主题：《制定绩效目标的几个重要因素》。进入12月，想必各个公司或组织都会开展年终绩效考核，我这里也不例外。 关于绩效面谈，印象中组织里似乎没人告诉我应该如何去做。很久以前是小兵的时候没有过多考虑，成为项目负责人后也没有接受过什么系统的培训，都是按照...</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>谈谈如何高效地组织和实施内部会议</title><link>https://tonybai.com/2012/12/03/how-to-organize-and-hold-meetings-efficiently/</link><pubDate>Mon, 03 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/03/how-to-organize-and-hold-meetings-efficiently/</guid><description>我个人一直追求高效的工作，无论是在职场中的哪个环节，在我眼中总是应该有提效的空间的，我甚至感觉我在这方面似乎形成了一种偏执，有些时候一看到低效的环节，我就有些情绪激动^\_^。 如果要大家投票表决组织内部最低效地活动环节，估计大多数人会将选票投给**会议**。关于内部会议的组织和实施，有很多反模式，这里列举一二： \- 会议组织人突然发出会议通知，两个小时后举行某会议； \- 会议通知中没有会议的...</description></item><item><title>谈谈如何写好Mail</title><link>https://tonybai.com/2012/11/28/how-to-write-a-good-email/</link><pubDate>Wed, 28 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/28/how-to-write-a-good-email/</guid><description>Mail(在这个时代，Mail默认的含义早已变成了Email，也就是电子邮件)是我们在工作中常用的表达和沟通方式之一。与IM工具、拿起电话直接Call、会议等相比，Mail容许相关干系人用更多的时间去了解背景、理解问题和思考解决方案，而不用立即予以答复。 我们每天都会发出和收到几十封甚至上百封Mail，但这并不意味着我们写的Mail就都是合格的。一些人的Mail，无论从格式还是内容，都会让人看起来...</description></item><item><title>个人时间管理的一些实践体会</title><link>https://tonybai.com/2012/11/23/some-experience-on-personal-time-management/</link><pubDate>Fri, 23 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/23/some-experience-on-personal-time-management/</guid><description>时间是人类最宝贵的财富之一，我十分认同这点，因此我在个人时间管理以及工作效率上也是一直追求持续改善的，期望能在最短的时间内产出更多有价值的成果，尤其是工作时间里。 我知道的时间管理思想主要有三种： \* 四象限理论。这是我们经常谈到的传统时间管理理论，它告诉我们如何根据待办事项的重要和紧急两个属性对待办事项进行分类和优先级确定。我个人觉得这个理论是时间管理的基础，后续无论是GTD理论还是番茄时间理...</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>制定绩效目标的几个重要因素</title><link>https://tonybai.com/2012/11/17/several-important-factors-in-making-performance-goals/</link><pubDate>Sat, 17 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/17/several-important-factors-in-making-performance-goals/</guid><description>本文是笔者发表在《程序员》杂志2012年11期上的那篇“制定绩效目标的几个重要因素”文章的完整版。 软件开发是一种创造性的工作，这种工作的成果具有不确定性且很难量化，因此经理们在给员工制定绩效目标时多没有统一标准(即便有也不一定准确，而且在一定程度上还可能会扼杀创造性)，所采用的方法也是五花八门。不过即便如此，经理们也没有放弃寻找一种更为适合软件开发领域绩效目标制定的方法。笔者也是其中一份子，在这...</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>知识管理的几点野路子经营策略</title><link>https://tonybai.com/2012/11/04/the-amateur-way-of-knowledge-management/</link><pubDate>Sun, 04 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/04/the-amateur-way-of-knowledge-management/</guid><description>时间真是过得飞快，遥想一年前的这个时候我们在产品线的知识管理试水有了一点成绩，便在组织内力推知识管理。领导经过权衡后，也认同了知识管理的重要性， 并随即安排人在组织内部快速建立起了知识库。在最初的一两个月里，临时的知识管理负责人热情很高，做得还算不错，初步地将知识库是什么、如何使用以及组织 知识管理的第一版规范和大家交待清楚了。但随着热情的消逝，知识库管理也随波逐流了，知识管理开始变得名存实亡，这...</description></item><item><title>辩证地看待“重新发明轮子”</title><link>https://tonybai.com/2012/11/02/treat-reinventing-the-wheel-dialectically/</link><pubDate>Fri, 02 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/02/treat-reinventing-the-wheel-dialectically/</guid><description>C程序员骨子里都有一种“重新发明轮子(Reinventing the Wheel)”的特质。在面向对象、组件化流行以及崇尚复用的今天，这种特质似乎总是被认为是反面教材。但伟大的毛主席教导我们：要辩证地看待一切事物， 凡事无绝对。事物都是有两面性的，有好就有坏，有坏就有好。拿“重新发明轮子”这事而言，我们除了看到其弊端外，还要充分领会到其好的一面，不能一棒子打 死，这样才能在特定的场景下作出正确合理...</description></item><item><title>关于团队经营的若干体会</title><link>https://tonybai.com/2012/11/01/some-experience-on-team-management/</link><pubDate>Thu, 01 Nov 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/11/01/some-experience-on-team-management/</guid><description>在近两年的持续不断的投入和努力下，近期我在团队经营方面看到了一些成果，但这却引来了同僚们的“羡慕嫉妒恨”^\_^，他们希望了解到我是“如何将0变成 1的”。关于团队运营方面，我始终认为自己只是个初级选手，充其量就是个实践者而已。以前我也只是按照我的思路和直觉在做，并未有过什么细致的考量，也没 有人给我这方面系统的指导。这几天闲暇时回顾了一下这两年的经营历程，形成了些许体会，这里也和大家分享一下。 ...</description></item><item><title>改善技术布道效果的几个实践</title><link>https://tonybai.com/2012/10/26/some-practice-on-improving-tech-preach/</link><pubDate>Fri, 26 Oct 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/10/26/some-practice-on-improving-tech-preach/</guid><description>本文是笔者发表在《程序员》杂志2012年08期上的那篇“改善技术布道效果的几个实践”文章的完整版。 技术布道不易，想取得良好的效果就更难了。下面是笔者总结的几个有助于改善技术布道效果的有效实践,这里给大家分享一下。 **自我认知** 技术布道前,布道者首先要做好自我认知,这将有助于布道者确认自己是否胜任此次布道以 及采用何种布道策略以赢得更好的效果。认知的内容包括:自己是否精通这方面的技术。若 只...</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/22/thoughts-on-software-inventory/</link><pubDate>Mon, 22 Oct 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/10/22/thoughts-on-software-inventory/</guid><description>近期产品线出现这样一个“怪现象”：许多已经完成编码并具备提交给测试组的版本没有测试人员对应。测试部那边给出的策略是：按版本优先级从高到低依次测 试。这样一来一些重要版本需要到3个月甚至更长时间之后才能开始测试。可以肯定这种现象是生产环节的一个问题，但用什么理论去解释和分析这个问题呢？我想 到了“库存” – 软件库存。 《Joel说软件》的那个Joel曾写过一篇名为《软件库存》的文章，也正是看了那篇...</description></item><item><title>也谈Go语言声明语法</title><link>https://tonybai.com/2012/10/11/understanding-go-declaration-syntax/</link><pubDate>Thu, 11 Oct 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/10/11/understanding-go-declaration-syntax/</guid><description>一直在从事C语言服务端应用开发，对C的变量声明语法早已烂熟于胸，同时也深知复杂的C变量声明十分晦涩难解。记得若干年前还特意花了一些时间研究理解复 杂C变量声明的方法，记忆中这些方法包括：《C专家编程》中提到的“优先级”规则、right-left规则以及顺时针/螺旋形规则等，幸运地是我们日常 开发中少有使用极为复杂的变量声明(如void (\*signal (int signo, void (\*f...</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>项目跳票成常态，组织基因难逃干系</title><link>https://tonybai.com/2012/08/15/bouncing-check-and-organization-gene/</link><pubDate>Wed, 15 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/15/bouncing-check-and-organization-gene/</guid><description>上周得知今年一个重点项目跳票了！项目计划正在重新修订中，原计划今年10月末完成的项目很可能因此推迟到明年上旬了。 工作这么多年，印象中除了一些短期小项目外，50人月以上的项目就少有未跳票的，无论是我带的项目还是其他负责人带的项目，莫不如此。无论是产品负责人，还是项目负责人，高质量按期交付都是第一目标。但残酷的现实真切地摆在我们面前。问题到底出在哪里呢？ 项目成功的原因都是相似的，但项目跳票的原因却...</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>为什么不用用Go？</title><link>https://tonybai.com/2012/08/08/why-not-go/</link><pubDate>Wed, 08 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/08/why-not-go/</guid><description>本文翻译自 Dr. Dobb&amp;#39;s主编Andrew Binstock的文章&amp;#34;Why Not Go?&amp;#34;。 Go是一种对系统原生语言的重要反思，它对C语言做了重大的改善，同时还保持了语言的极简性。 今年早些时候，我们写了一篇有关新兴系统原生(native)语言的文章。这些语言包括D、Go、Rust以及Vala。当时我们承诺将会对这些语言进行 细致的探索。从本周开始，我们将开启一系列对来自Google的新...</description></item><item><title>《改善技术布道效果的几个实践》勘误</title><link>https://tonybai.com/2012/08/07/errata-of-some-practice-to-improve-tech-sermon/</link><pubDate>Tue, 07 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/07/errata-of-some-practice-to-improve-tech-sermon/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</description></item><item><title>知识管理推广难的几点原因</title><link>https://tonybai.com/2012/08/06/reasons-for-promote-km-difficult/</link><pubDate>Mon, 06 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/06/reasons-for-promote-km-difficult/</guid><description>去年在产品线内部尝试了一些知识管理的实践：建立了知识库，初步在产品线内部养成了知识整理和总结的习惯，建立了工作流程与知识库之间的粘性，取得了一定效果。今年年初在事业部内部做了有关知识库实践方面的分享，大家也都认识到这几年我们在知识积累方面上的不足，也都很赞同知识管理的重要性与必要性。会后领导决定建立事业部级知识库，并安排专人负责知识库的维护与推广。 于是乎负责知识库搭建的那个部门申请服务器、安装和...</description></item><item><title>做正确的事要趁早</title><link>https://tonybai.com/2012/08/02/do-right-things-early/</link><pubDate>Thu, 02 Aug 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/08/02/do-right-things-early/</guid><description>最近闲暇时间在策划实施两件事儿：一是产品的自动化回归测试；二是尝试在项目中使用一些静态代码语义分析工具。我觉得这两件事是应该做的正确的事，对提升产品质量，提前发现产品中潜在的缺陷都大有裨益。但在做的过程中才感觉到：现在做有些晚，正确的事要趁早做。 去年自动化测试组发布了自动化测试框架的第一个版本，我们的产品参加了试点。但经过自动化测试组大半年的投入，效果十分有限，根本没有达到我的预期。最主 要的问...</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/06/04/drive-in-rainstorm/</link><pubDate>Mon, 04 Jun 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/06/04/drive-in-rainstorm/</guid><description>上周六是六一儿童节过后的第一个周末，由于六一是工作日，没能带果果出去玩，因此周六我和LP一起带果果到太原街购物游玩。 早就听到天气预报说沈城会有雷阵雨，不过早上的天气还是蛮好的，不是很热，于是乎也没有太在意，只是带了简单的雨具。 也许是受到天气预报的影响，商业中心区居然也能很顺利找到停车位，一切安顿好后，就带着果果直奔商场。逛街顺序与往常没啥两样，先购 物，再带果果到商场楼上的儿童娱乐城玩。下午1...</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>也谈技术布道 – 影响因素及有效实践</title><link>https://tonybai.com/2012/04/24/influencing-factors-and-effective-practice-about-driving-technical-changes/</link><pubDate>Tue, 24 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/24/influencing-factors-and-effective-practice-about-driving-technical-changes/</guid><description>昨天中午收到图灵出版的《布道之道 – 引领团队拥抱技术创新》一书，晚上就迫不及待地翻看开来。这是我读过的第一本有关推动组织内部技术变更/创新实践方面的书，感觉书作者对受众的分类很是准 确到位，很多布道技巧也十分值得借鉴。但就我个人多年来的体验来看，组织内部技术布道的结果，不仅仅与受众的类型有关，还与布道者自身的资历、所担任的角 色、组织内部的文化和环境、布道路线以及布道时机和对象的选择有一定关系。...</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>一场关于“何时发布版本”的论战</title><link>https://tonybai.com/2012/04/17/a-discussion-about-when-to-release/</link><pubDate>Tue, 17 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/17/a-discussion-about-when-to-release/</guid><description>气氛太平静，投石起波澜。 昨天下午无意中在内部发起了一场关于&amp;#34;何时发布版本&amp;#34;的论战。 论战的背景是这样的：部门内部有这样的一个项目A，它的目标是开发出可被其他项目或产品复用的组件(这里就暂称之为组件吧，我们内部称这类组件为可复用资产)。这个项目已经开发了大半年了，目前处于收尾阶段，绝大部分开发工作已经完成。测试(包括压力测试等)已经测试过至少一轮了；我们的产品线近期准备复用项目A成产出的这些组件，...</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 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>Adapter模式的C实现</title><link>https://tonybai.com/2012/03/05/implement-adapter-pattern-in-c/</link><pubDate>Mon, 05 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/05/implement-adapter-pattern-in-c/</guid><description>Adapter(适配器)模式是《Design Pattern》一书中结构类模式集中的第一个模式，也是一个真正被我的同事在产品代码中应用的模式。 Adapter模式也是一个相对容易理解的模式，多数书籍和网络资料在描述这个模式时都使用了一个与电源适配器有关的例子，说不定Adapter模式还真的是源于对电源适配器的再思考和挖掘呢。 我们在重构遗留代码时引入了Adapter模式。遗留系统中存在的问题大致是...</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>也谈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>谋划2012</title><link>https://tonybai.com/2012/01/29/plan-and-design-2012/</link><pubDate>Sun, 29 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/29/plan-and-design-2012/</guid><description>对于我这个上班族来说，这假期真的不能太长，否则就适得其反了：不但不会得到很好的休息，反而感觉更累了。也许很多朋友和我有同样的感受^\_^。这不，这个春节在家待得就比较&amp;#34;闹心&amp;#34;，特别是后几天，想上班的冲动那叫一个此起彼伏啊，终于今天如愿了^\_^。 今天是壬辰龙年春节后的第一个工作日。如以往一样，办公室里比较冷清，很多同事还尚未结束休假。这可真是做整年谋划的黄金时间啊，我是这么想的，也是这么做的。 ...</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>2011·工作中的成长</title><link>https://tonybai.com/2012/01/12/my-grow-up-in-2011/</link><pubDate>Thu, 12 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/12/my-grow-up-in-2011/</guid><description>每至年关，回首一年工作中的成长，便有一种充实和幸福的感觉。 2011年我在工作中的成长可概括为如下几点： 1、建立并围绕原则为中心开展工作 现在想来，以前的工作有些盲从，心中没有原则，自然也就没有主线，也许这与当初的职位角色有关。2011年职位提升了，思维方式也有所了转变。我花了更多的时间对当前的工作进行考量，而且考量的过程不是过去那种仅仅从项目组或产品线的角度，而是尽量上升到组织的角度，并针对当...</description></item><item><title>由劝退一名员工所想到的</title><link>https://tonybai.com/2012/01/08/thoughts-from-persuading-somebody-to-quit/</link><pubDate>Sun, 08 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/08/thoughts-from-persuading-somebody-to-quit/</guid><description>这周五我做了一件&amp;#34;恶事&amp;#34; – 劝退了一名员工。这样的事情在部门成立10年的历史中发生的次数都是屈指可数的，但却真实地让我给碰到了。 我以前只是有招人的经验，但从未做过&amp;#34;开人&amp;#34;的事情，这是第一次，心里总有些不忍。原计划由这名同事的直接Leader与他谈这件事情，但这名女leader更是抹不开面子，索性我就直接上阵了。过程还算顺利，这名同事表面上也没有太多意见，但我心里清楚：他肯定很郁闷，这个周末估计...</description></item><item><title>关于组织内部建立良性提议反馈机制的一些考量</title><link>https://tonybai.com/2012/01/06/thoughts-on-establishing-a-benign-feedback-mechanisms-inside-the-organization/</link><pubDate>Fri, 06 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/06/thoughts-on-establishing-a-benign-feedback-mechanisms-inside-the-organization/</guid><description>近期完成了与组员的年终绩效面谈，收集上来一些意见和建议，其中有一些涉及到部门对大家反馈的意见和建议处理不妥的情况，对此我也做了认真的考量，于是就有了这篇短文。 组织的基本单元是人(即组员)，组织的运行依靠的也是组员，组员对组织的运行情况最有发言权，组织内部存在的问题他们会第一时间感知到，也许他们也是第一个尝试解决问题并作出改进的人，因此他们的意见和建议是最最宝贵的，作为一个组织的领导者首先应该认识...</description></item><item><title>知识管理那些事儿</title><link>https://tonybai.com/2011/11/23/those-things-about-knowledge-management/</link><pubDate>Wed, 23 Nov 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/11/23/those-things-about-knowledge-management/</guid><description>我不是知识管理领域的专家，但我认为知识的积累和管理对一个期望长久稳定发展的组织来说很重要。今天我这个&amp;#34;门外人&amp;#34;就来说几句&amp;#34;门外话&amp;#34;。 我所在的部门已经成立10余年了，但说实话部门在知识积累和管理方面做的比较一般。例如，没有统一的知识积累和管理平台，知识分享多靠mail列表，或将知识存储在文件中放入Microsoft Visual SourceSafe，若干日子后，再无人能找到之前的知识(VSS绝对...</description></item><item><title>也谈C语言的restrict类型修饰符</title><link>https://tonybai.com/2011/11/18/also-talk-about-restrict-type-qualifier-in-c/</link><pubDate>Fri, 18 Nov 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/11/18/also-talk-about-restrict-type-qualifier-in-c/</guid><description>restrict关键字是C99标准中新引入的一个类型修饰符(type qualifier)。如果你看过GNU C库的源码或是其manual，你就会发现restrict修饰符被广泛地应用在GNU C库中。restrict关键字到底是用来做什么的呢？估计很多对C语言细节研究不够的程序员都无法给出答案，我个人也只是停留在&amp;#34;知道&amp;#34;这一关键字的层次上，于是乎今天我又对着C99规范钻研了一番，略有收获，这里也...</description></item><item><title>State模式的C实现</title><link>https://tonybai.com/2011/11/07/implement-state-pattern-in-c/</link><pubDate>Mon, 07 Nov 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/11/07/implement-state-pattern-in-c/</guid><description>上个周末花了些时间将《Pro Git》（Git高手进阶之必读书籍，严重推荐^\_^）快速地浏览了一遍，在感叹于Git强大的同时，也见识到了Git的复杂。可以肯定的是Git学习曲线远没有学习Subversion那样平坦。比如，Subversion工作目录下的文件只有三种状态：Untracked、Modified和Committed(即Unmodified)；而以Git本地工作目录下则有四种状态：Un...</description></item><item><title>Transaction模式的C实现</title><link>https://tonybai.com/2011/11/04/implement-transaction-pattern-in-c/</link><pubDate>Fri, 04 Nov 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/11/04/implement-transaction-pattern-in-c/</guid><description>提到Transaction模式(即事务模式)，很多人会感到陌生。这并不奇怪，在大名鼎鼎的GoF的《Design Pattern》一书中，它仅仅是Command模式的别名罢了。不过在实际的开发中，我们却经常会遇到可以应用事务模式的场景。本文可以理解成Command模式在事务领域的应用，但这样说有些麻烦，我们莫不如直接称之为Transaction模式。 与前几篇设计模式C实现系列文章一样，这篇文章也源...</description></item><item><title>提高效率不是口号</title><link>https://tonybai.com/2011/10/31/improving-efficiency-should-not-only-be-a-slogan/</link><pubDate>Mon, 31 Oct 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/10/31/improving-efficiency-should-not-only-be-a-slogan/</guid><description>当前任何一个组织 — 无论是私企，还是国企，无论是政府还是民间组织，无论是在国内还是在国外 — 都在强调提高效率。但&amp;#34;提高效率&amp;#34;不简单是一句口号，还需要脚踏实地的真正去做。 说到&amp;#34;提高效率&amp;#34;，大家首先就会想到工作的行为主体-人！促进人员能力的提升是提升个体工作效率的一个很好的办法。在软件开发领域也有一个公认的事实，那就是一个顶尖程序员的效率可以十倍甚至百倍于一个普通程序员。为此，很多组织都投入巨资...</description></item><item><title>Chain of Responsibility模式的C实现</title><link>https://tonybai.com/2011/10/25/implement-chain-of-responsibility-pattern-in-c/</link><pubDate>Tue, 25 Oct 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/10/25/implement-chain-of-responsibility-pattern-in-c/</guid><description>又是一个行为类的模式，似乎这类模式在使用C语言开发的项目中适应性更强，而另外两类模式创建型和结构型则略显不受待见^\_^。 Chain of Responsibility模式（中文名：职责链模式）是一个不算复杂的模式。虽不复杂，但用好了同样可以解决大问题。个人觉得其最大的好处就在于可以动态地重组针对一类对象的处理流程。正是得益于这一优势，它才可以在纷繁芜杂的业务领域站稳脚跟。 我们遇到的问题是这样...</description></item><item><title>Strategy模式的C实现</title><link>https://tonybai.com/2011/10/20/implement-strategy-pattern-in-c/</link><pubDate>Thu, 20 Oct 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/10/20/implement-strategy-pattern-in-c/</guid><description>与那些复杂的模式相比，Stragegy Pattern(策略模式)是一个相对简单的模式，很直观，也易于理解。 同时它也是我们在开发过程中使用最多的模式之一。 问题是设计模式使用的驱动力，只有当我们遇到问题时，设计模式才会向我们伸出援助之手。这里我也想通过对问题以及解决方法演化的阐述来说明策略模式是如何更好地帮助我们的。我们从问题出发！ Tony最近接到了一个新任务，任务的内容是实现一个通用的平衡二...</description></item><item><title>C语言的现状</title><link>https://tonybai.com/2011/10/17/the-state-of-c/</link><pubDate>Mon, 17 Oct 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/10/17/the-state-of-c/</guid><description>本文翻译自Dr. Dobb&amp;#39;s Journal官网上的一篇由Brian W. Kernighan和Dennis M. Ritchie共同撰写的名为&amp;#34;The State of C&amp;#34;的文章。这里谨将此篇译文献给不久前刚刚离我们而去的C语言之父 – Dennis M. Ritchie，愿一代计算机科学巨匠一路走好。 **不再只是为了系统级编程(system programming)** C是一门通用的计...</description></item><item><title>Observer模式的C实现</title><link>https://tonybai.com/2011/10/14/implement-observer-pattern-in-c/</link><pubDate>Fri, 14 Oct 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/10/14/implement-observer-pattern-in-c/</guid><description>设计模式) (Design Pattern，以下简称DP)的定义有很多种。我个人的理解：DP是人们在软件开发过程中所总结出来的一些典型问题的经验解决方法模板。使用它们可以使我们的代码更易被复用，更易扩展，更好地适应变化以及更便于后期维护。 人们都说设计模式是独立于语言的，但这里的&amp;#34;语言&amp;#34;更多的是指面向对象语言，比如Java、C++、C#、Python和Ruby等。使用面向对象语言(OO)在实现设计...</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>当可执行程序版本信息变更时</title><link>https://tonybai.com/2011/09/09/when-program-version-changed/</link><pubDate>Fri, 09 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/09/when-program-version-changed/</guid><description>在Unix/Linux上，我们一般可以通过两种方法查看到一个可执行程序的版本信息，以下以Ubuntu中的Gcc为例。 第一种方法：我们可以直接通过程序名字得到版本信息，例如: $ which gcc /usr/bin/gcc $ ls -l /usr/bin/gcc lrwxrwxrwx 1 root root 7 2010-08-21 00:18 /usr/bin/gcc -&amp;gt; gcc-4.4\...</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>使用C99特性简化代码编写</title><link>https://tonybai.com/2011/08/31/simplify-coding-in-c99/</link><pubDate>Wed, 31 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/31/simplify-coding-in-c99/</guid><description>至今我还记得第一次听说C99标准还是在读大一时，那时同寝一位兄弟手头有一本Herbert Schildt编写的《C: The Complete Reference，Fourth Edition》(中文名：C语言大全)，书封皮的右上角上赫然写着&amp;#34;详解C99 ANSI/ISO最新标准&amp;#34;，那时离C99标准发布仅仅才一年。 那个时候我们大学授课以及实验用的还是Borland的Turbo C 2.0，C99...</description></item><item><title>C程序员驯服Common Lisp – 入门</title><link>https://tonybai.com/2011/08/30/c-programers-tame-common-lisp-series-introduction/</link><pubDate>Tue, 30 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/30/c-programers-tame-common-lisp-series-introduction/</guid><description>毫无疑问，Common Lisp是一门庞大且复杂的语言，学习曲线并不平坦。对于一个从未接触过函数式语言、交互式语言以及动态类型语言的C程序员来说，学习Common Lisp显然是一个很大的挑战。 也许有人会问：&amp;#34;C语言已经无所不能了，为何还要学习Common Lisp？&amp;#34;在这里我不想说太多冠冕堂皇的话，至少对我而言，理由有三： 一是好奇，在C语言的世界里待得久了，总想探出头来吸几口新鲜空气，这次我...</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>行为驱动开发导引</title><link>https://tonybai.com/2011/08/10/introducing-bdd/</link><pubDate>Wed, 10 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/10/introducing-bdd/</guid><description>本文翻译自Dan North的文章&amp;#34;Introducing BDD&amp;#34;。 我遇到了一个问题。当我在不同环境的多个项目中使用和教授类似测试驱动开发(test-driven development, TDD)这样的敏捷实践时，我总是能遇到来自程序员们相同的困惑和误解。他们想知道从哪里开始、测什么不测什么、一次测试多少、谁来调用他们的测试以及如何理解为什么一个测试失败了。 越是深入TDD，我越能感觉到我对...</description></item><item><title>Common Lisp初学点滴</title><link>https://tonybai.com/2011/08/05/some-experience-of-common-lisp-beginner/</link><pubDate>Fri, 05 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/05/some-experience-of-common-lisp-beginner/</guid><description>Common Lisp是一门Interactive语言，比较容易上手。无论你是用CLISP，SBCL还是Clozure CL，你都可以很快地写出一个&amp;#34;Hello, World&amp;#34;程序出来。不过千万不要因此低估了Common Lisp，前人的经验表明：Common Lisp是门庞大且复杂的语言，其学习曲线可并不低。要想真正掌握它，需要你有持续的热情、足够的耐心和不断的练习。我接触Common Lisp...</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>也谈C语言编译器的标准编译阶段</title><link>https://tonybai.com/2011/07/04/also-talk-about-standard-compile-stage-of-c-compiler/</link><pubDate>Mon, 04 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/04/also-talk-about-standard-compile-stage-of-c-compiler/</guid><description>了解C编译器的工作流程有助于C程序员解决编译代码过程中出现的问题。市面上凡是讲解得还算全面的C语言书籍中都或多或少对此有所提及。 让我们在这里来回顾一下C编译器的工作流程！一般C编译器的工作流程大致分为：预编译、编译、生成目标代码（汇编）和连接这四个主要步骤。我们用实例具体描述一下这四个步骤，以最著名的GCC编译器结合helloworld.c文件为例: /\* helloworld.c \*/ i...</description></item><item><title>也谈C语言对国际化的支持</title><link>https://tonybai.com/2011/07/01/also-talk-about-the-internationalization-support-in-c/</link><pubDate>Fri, 01 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/01/also-talk-about-the-internationalization-support-in-c/</guid><description>C语言对国际化的支持由来已久，最初开始于其第一版标准，即C89标准。在C89中我们可以看到用于支持国际化的locale.h、宽字符、宽字符串以及多字节字符(串)。而之后的&amp;#34;C89增补1&amp;#34;标准，即C90标准，以及C95标准又进一步完善了C语言对国际化的支持，增加了wchar.h、 wctype.h以及大量用于操作宽字符(串)和多字节字符(串)的标准库函数。最新一版C语言标准，即C99，让C语言对国际...</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>也谈C语言的内联函数</title><link>https://tonybai.com/2011/06/22/also-talk-about-inline-function-in-c/</link><pubDate>Wed, 22 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/22/also-talk-about-inline-function-in-c/</guid><description>有这样一段代码： /\* foo.c \*/ #include  &amp;#34;stdio.h&amp;#34; inline void foo() {     printf(&amp;#34;inline foo in %s\\n&amp;#34;, \_\_FILE\_\_); } int main() {     foo();     return 0; } 我采用C99标准，并在不加任何优化选项的情况下编译之： $ gcc -std=c99 foo...</description></item><item><title>Hello，Common Lisp</title><link>https://tonybai.com/2011/06/21/hello-common-lisp/</link><pubDate>Tue, 21 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/21/hello-common-lisp/</guid><description>Paul Graham不愧被誉为Lisp)的超级推手，他的煽动力真的是很强悍。这不才刚刚看完一遍他编写的《黑客与画家》后，我就决定将Common Lisp作为今年计划学习的那门新语言，而且从现在就开始。 去年曾囫囵吞枣般的学习过Haskell，一门通用且庞大的纯函数式编程语言。在惊叹于Haskell如此与众不同且功能强大的同时，也为Haskell Monad那魔鬼般的蹩脚语法所苦恼，而Monad的...</description></item><item><title>解决一个IP路由选择问题</title><link>https://tonybai.com/2011/06/21/solve-a-problem-about-ip-route/</link><pubDate>Tue, 21 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/21/solve-a-problem-about-ip-route/</guid><description>大学时曾旁听过计算机专业的专业课-&amp;#34;计算机网络&amp;#34;（我非科班出身，只能偷偷旁听），现在还能清晰地记得当初他们使用的教材是高教社影印版的《计算机网络——自顶向下方法与Internet特色》。不过记忆中课程的内容却渐渐模糊了。有些当时并没有深刻地理解的概念，现在依旧没理解，因为平时少有涉及。 上周在搭建CI环境时遇到了两个服务器(均安装的是RHEL 5.5 OS)之间网络不通的问题。这两个服务器分处于两...</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>把握好编码的节奏</title><link>https://tonybai.com/2011/06/03/hold-the-coding-rhythm/</link><pubDate>Fri, 03 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/03/hold-the-coding-rhythm/</guid><description>最近观察到这样一种情况，项目组内的两位比较资深同事似乎都习惯于这样来编码：他们可能会花上两、三周时间将一个模块的成百上千行代码一气呵成的编写完，然后再去与其他人编写的代码集成在一起编译，测试，最终提交。这种情况让我有些惊讶，因为我觉得一个良好的编码节奏不应该是这样的，原因有三： .这样的节奏不利于问题的早发现早解决 我们都知道问题发现越早，其解决成本越小。如果只是一味地编写代码，甚至连一次编译都不...</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>聆听编程“古训”</title><link>https://tonybai.com/2011/05/10/listen-to-old-maxim-respectfully/</link><pubDate>Tue, 10 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/10/listen-to-old-maxim-respectfully/</guid><description>市面上关于优秀编程风格和习惯养成的书籍还真不少，其中“叫好又叫座”的书诸如《代码大全》、《编程精粹:编写高质量C语言代码》、《编程匠艺》、《重构》以及《Clean Code》等。不过前些天我在网上下载了一本名为《The Elements of Programming Style》的电子书，看过此书后，我才知道开创编写优秀风格代码之路的鼻祖是谁（不知道是否还有比这本书更加古老的且系统地讲述优良编程元...</description></item><item><title>只对代码无法表达的东西写注释</title><link>https://tonybai.com/2011/05/05/comments-only-what-the-code-cannot-say/</link><pubDate>Thu, 05 May 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/05/05/comments-only-what-the-code-cannot-say/</guid><description>本文翻译自”Comments Only What the Code Cannot Say“，来自于《程序员应该知道的97件事》一书中的某个章节。 我们知道理论与实践之间存在差异。在实践中，这个差异远大于其在理论中所描述的那样 – 一份对注释（comments）的观察数据也证实了这一点。理论上，通常的注释代码的想法听起来是值得的：它可以为读者提供更多的细节，可以解释发生了什么事情。有什么能比自我帮助...</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/04/19/use-the-right-algorithm-and-data-structure/</link><pubDate>Tue, 19 Apr 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/04/19/use-the-right-algorithm-and-data-structure/</guid><description>本文翻译自”Use the Right Algorithm and Data Structure“，来自于《程序员应该知道的97件事》一书中的某个章节。 _一家拥有多个分行的大银行抱怨说他们为出纳员新买的计算机运行得太慢了。这件事儿发生在电子银行以及ATM机使用普及程度远不及现在的那个年代。人们更多的是亲自到银行办理业务，这些运行超慢的计算机使得大家排起了长队。因此，这家银行威胁计算机供货商要结束...</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>你应该关心你的代码</title><link>https://tonybai.com/2011/03/22/you-gotta-care-about-the-code/</link><pubDate>Tue, 22 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/22/you-gotta-care-about-the-code/</guid><description>本文翻译自”You Gotta Care about the Code“，来自于《程序员应该知道的97件事》一书中的某个章节。 即使不用大侦探福尔摩斯，我们也能知道优秀的程序员能写出好代码。糟糕的程序员…则不能。他们生产出代码巨兽，而其他人则不得不去清理。你想写出好代码，对不对？你渴望成为一名优秀的程序员。 好代码不会凭空冒出来。它也不是什么需要各大行星排成一列时靠运气才发生的事情。为了写出好代码...</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>通过精减来改善代码</title><link>https://tonybai.com/2011/03/17/improve-code-by-removing-it/</link><pubDate>Thu, 17 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/17/improve-code-by-removing-it/</guid><description>本文翻译自&amp;#34;Improve Code by Removing It&amp;#34;，来自于《程序员应该知道的97件事》一书中的某个章节。 少即是多。这是一句有些陈腐的短小格言，但有时它确实是正确的。 在过去的几周里我对代码库所作的改善工作之一就是删除了其中的几大块代码。 我们编写软件时一直遵循着XP的（译注：极限编程，eXtreme Programming）原则，包括YAGNI（即You Aren&amp;#39;t Gonn...</description></item><item><title>知道如何使用命令行工具</title><link>https://tonybai.com/2011/03/16/know-how-to-use-command-line-tool/</link><pubDate>Wed, 16 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/16/know-how-to-use-command-line-tool/</guid><description>本文翻译自”Know How to Use Command-line Tool“，来自于《程序员应该知道的97件事》一书中的某个章节。 现今，很多软件开发工具被打包成集成开发环境（Integrated Development Environments，IDE）提供给开发者。微软的Visual Studio和开源的Eclipse就是两个颇受欢迎的IDE，当然还有很多其他类似的工具。很多程序员喜欢使用...</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>买了把人体工学座椅</title><link>https://tonybai.com/2011/03/01/buy-an-ergonomic-chair/</link><pubDate>Tue, 01 Mar 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/03/01/buy-an-ergonomic-chair/</guid><description>作为程序员，每天最主要的姿势就是坐姿。随之而来的就是各种职业病：腰酸、背痛、颈椎疼，重者要么是腰间盘突出，要么是严重的颈椎病。每个程序员心里都清楚，避免这些职业病的最好方法就是工作期间记得多做些身体活动。但一旦进入工作状态后，我们就没有了时间概念，很难“自拔”。 去年因意外闪了腰，医院大夫给出的诊断结果是小关节脱位。虽说并不严重，但是腰痛的那种感觉还是在我心里留下了阴影，所以今年春节后立即给自己制...</description></item><item><title>专业程序员</title><link>https://tonybai.com/2011/02/24/the-professional-programmer/</link><pubDate>Thu, 24 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/24/the-professional-programmer/</guid><description>本文翻译自&amp;#34;The Professional Programmer&amp;#34;，来自于《程序员应该知道的97件事》一书中的某个章节。 什么是专业程序员？ 一个专业程序员的唯一的、最重要的特点是个人的责任。专业程序员会对他们的职业生涯负责，会对他们的估计负责，会对他们的计划承诺负责，会对他们的错误负责，会对他们的技艺负责。一个专业程序员绝不会将他们的责任推到其它人身上。 ·如果你是一名专业程序员，你将对你自己...</description></item><item><title>持续学习</title><link>https://tonybai.com/2011/02/23/continous-learning/</link><pubDate>Wed, 23 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/23/continous-learning/</guid><description>本文翻译自&amp;#34;Continuous Learning&amp;#34;，来自于《97 Things Every Programmer Should Know》一书中的某个章节。 我们生活在一个引人入胜的时代。软件开发分布在全球各地，你知道那里有很多人可以胜任你的工作。你需要不断学习以保持你在市场上的竞争力。否则，你将变成一条恐龙，专心从事某一个工作，直到有一天，你不再被需要或者你的工作被外包给了其它更为廉价的开发人...</description></item><item><title>代码评审</title><link>https://tonybai.com/2011/02/22/code-reviews/</link><pubDate>Tue, 22 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/22/code-reviews/</guid><description>本文翻译自&amp;#34;Code Reviews&amp;#34;，来自于《97 Things Every Programmer Should Know》一书中的某个章节。 你应该做代码评审。为什么呢？因为代码评审可以提高代码质量并且降低缺陷比例。但进行代码评审未必是因为你想到的那些理由。 由于之前有过一些代码评审的糟糕体验，因此许多程序员不喜欢代码评审。我曾经见过一些组织，它们要求所有代码在部署到生产环境之前必须通过一个正...</description></item><item><title>把一切都纳入版本控制</title><link>https://tonybai.com/2011/02/18/put-everything-under-version-control/</link><pubDate>Fri, 18 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/18/put-everything-under-version-control/</guid><description>本文翻译自&amp;#34;Put Everything Under Version Control&amp;#34;，来自于《97 Things Every Programmer Should Know》一书中的某个章节。 把项目中的一切都纳入版本控制。你需要的资源包括：免费的工具，比如Subversion，Git，Mercurial和CVS；充足的磁盘空间；便宜且性能强大的服务器；无处不在的网络；甚至包括项目托管服务。安装好...</description></item><item><title>将你的编码标准自动化</title><link>https://tonybai.com/2011/02/16/automate-your-coding-standard/</link><pubDate>Wed, 16 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/16/automate-your-coding-standard/</guid><description>本文翻译自”Automate Your Coding Standard“，来自于《97 Things Every Programmer Should Know》一书中的某个章节。 也许你也曾经经历过。在一个项目开始阶段，每个人都有着很多良好的意愿，我们称这些意愿为“新项目决议”。多数情况下，这些决议都会被记在文档中。关于代码的那些决议最终成了项目的编码标准。在项目启动会议上，主程序员带着大家一起浏...</description></item><item><title>在你重构之前</title><link>https://tonybai.com/2011/02/15/before-you-refactor/</link><pubDate>Tue, 15 Feb 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/02/15/before-you-refactor/</guid><description>本文翻译自&amp;#34;Before You Refactor&amp;#34;，来自于《97 Things Every Programmer Should Know》一书中的某个章节。 在某些时候，每个程序员都需要重构现有的代码。不过在你动手之前，请考虑一下下面的内容，因为这可以节省你和他人的大量时间（以及痛苦）。 · 重构开始的最好方式就是对现有代码库及其测试代码进行总结和评估。 这将帮助你理解现有代码的优点和不足，你也...</description></item><item><title>2011·同事对我的期望</title><link>https://tonybai.com/2011/01/26/the-expectations-of-my-colleagues-in-2011/</link><pubDate>Wed, 26 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/26/the-expectations-of-my-colleagues-in-2011/</guid><description>眼看就要到春节假期了，公司E-HR平台上我的账户下还有一项待处理的工作：填写一份&amp;#34;领导力发展回顾与提升计划&amp;#34;表格。表格很简单，5分钟就能填完，不过其中有一项我自己很难填写：&amp;#34;您了解或感知同事/或下属对您的期望&amp;#34;。虽说可以自我感知，不过我更想听到我的同事真实的声音。 于是乎我就在产品线内发出了一封Mail，希望能够得到大家真实的想法。 小半天，我就收到同事的十几封反馈Mail，多数Mail中大家都提...</description></item><item><title>应对库接口原型变更</title><link>https://tonybai.com/2011/01/24/response-for-the-interface-prototype-change/</link><pubDate>Mon, 24 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/24/response-for-the-interface-prototype-change/</guid><description>也许你经常遇到这类情况：你在代码里使用了别人提供的第三方库，当库升级为新版本后，你的代码在编译时无法通过，提示接口原型错误，经查发现原来是该第三方库提供的某接口的原型发生了变化，比如原接口被删除、增加了参数、参数减少了、修改了参数类型以及返回类型发生变化了等等。你也许会不由自主的大骂一句：F\*\*k。 我们换位思考一下，假如你是某个库的Owner，当你遇到需要修改接口原型的情形时，你应该如何去做...</description></item><item><title>又遇字节序问题</title><link>https://tonybai.com/2011/01/21/encounter-byte-order-problem-again/</link><pubDate>Fri, 21 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/21/encounter-byte-order-problem-again/</guid><description>今天上午处理了一个线上产品的故障。分析来分析去，最后定位问题还是出在字节序转换的环节上。 其实测试组早在产品上线前就曾报告了这个问题，但是对应的开发人员并未对该问题进行深入地分析，而是有些草率地将该问题归结为客户端模拟器的实现不符合标准。因为这位同事比较资深，所以当时我也没有给予足够关注。 产品今天凌晨上线，9点左右业务量开始增大，这个问题立即就被我们在现场的运维人员发现，还好我们的系统是集群式的...</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>别为代码的"Bad Smell"提供土壤</title><link>https://tonybai.com/2010/12/06/do-not-provide-soil-for-bad-smell-code/</link><pubDate>Mon, 06 Dec 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/12/06/do-not-provide-soil-for-bad-smell-code/</guid><description>上周初参加了一次代码评审，评审时发现一位同事在自己负责的子模块代码里定义了一个私用宏，&amp;#34;重复&amp;#34;这个Bad Smell立马在我头脑中闪现。当时我给出了一个建议：检查一下这个宏定义的必要性，依次检查一下C运行库头文件中是否已经有了同功用宏定义，基础库头文件中是否已经有了同功用宏定义，业务层代码的共用头文件中是否已经有了同功用宏定义。 周末这位同事给出了答复：C运行库、基础库和业务层代码中都没有定义此功...</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>给assert加上返回值，不给力！</title><link>https://tonybai.com/2010/11/24/it-is-not-gelivable-to-add-return-value-for-assert/</link><pubDate>Wed, 24 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/24/it-is-not-gelivable-to-add-return-value-for-assert/</guid><description>众所周知，assert是程序调试阶段的一柄利器，可以帮助程序员快速的定位代码问题。但一般来说当程序部署到生产环境的时候，我们会选择关闭assert。不过由于历史原因，我们运行在生产环境下的程序中的assert依旧发挥着作用，这样一把双刃剑就悬在了我们头上。 我们用的是自己的assert实现，这个实现没有C标准库中assert实现那么普适，不过可以满足我们自己需要的功能，它在运行时可以将断言失败信息...</description></item><item><title>有选择的保留遗留“惯例”</title><link>https://tonybai.com/2010/11/15/keep-legacy-conventions-selectively/</link><pubDate>Mon, 15 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/15/keep-legacy-conventions-selectively/</guid><description>在工作中，我们常常会听到这样的声音：“原来的系统就是这么做的！”。 没错儿，在工作中我们潜移默化地受到了遗留系统的一些设计和实现的“惯例”的影响，另外天生携带的懒惰基因使我们很少去思考和判断这些惯例的正确性和保留的必要性。但事实上，我们确应该经常重新审视这些遗留的“惯例”，有选择的保留，并敢于放弃。 每种“惯例”的引入和使用都是有其特定原因的：或是可以简化代码编写，或是便于代码跟踪，或是利于代码调...</description></item><item><title>《Programming in Haskell》中文版翻译项目</title><link>https://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/</link><pubDate>Sun, 14 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/</guid><description>_&amp;#34;A language that doesn&amp;#39;t affect the way you think about programming， is not worth knowing&amp;#34;._ — Alan Perlis(ACM 第一任主席，图灵奖得主，1922-1990) 《程序员修炼之道》这本书建议程序员每年应至少学习一门新的语言，以拓宽思维，避免墨守成规。今年我选择了函数式编程语言Haskell。...</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>由bool类型引发的一个问题</title><link>https://tonybai.com/2010/10/21/a-problem-caused-by-bool-type/</link><pubDate>Thu, 21 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/21/a-problem-caused-by-bool-type/</guid><description>C99 原生支持布尔类型，类型名字为\_Bool。对C程序员来说，这个名字有些“不伦不类”，还好一般C标准库 实现的头文件中都用宏bool来替代\_Bool。C99虽说是C语言当前的最新标准，但是它也有10年历史之久了。据说C1x标准 正在讨论制定中，有兴趣的朋友可以到标准C工作组 官方站点上去瞧瞧。 有些跑题了^\_^！其实这篇文章想说的不是C1x标准，而是一个与布尔类型有关的问题的分析解决过程...</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>遭遇“死循环”</title><link>https://tonybai.com/2010/10/01/encounter-endless-loop/</link><pubDate>Fri, 01 Oct 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/10/01/encounter-endless-loop/</guid><description>昨天看了“外刊IT评论”上的一篇名为《软件编程21法则》的文章，文章中提到的一条法则是：“软件直到被变成产品运行至少6个月后，它最严重的问题才会被发现”，当时表示认同。不过仅仅相隔一天，这条法则就变成了眼前的现实。 今天上午我们的某版本系统在某省出现了故障，该版本在这个省上线恰好将近6个月^\_^，系统上线以来一直运行良好，直到这次故障。故障现象为&amp;#34;挂死&amp;#34;:所有进程都挂死在某一把锁的lock上。以...</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>做好个人代码备份与版本管理</title><link>https://tonybai.com/2010/09/19/personal-code-backup-and-revision-control/</link><pubDate>Sun, 19 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/19/personal-code-backup-and-revision-control/</guid><description>今天下午花了一个小时分别和两位同事做了一些代码讨论，这两位同事正在编写的代码都具有一定的试验性质(暂不能进入项目代码库)。这里不谈代码如何如何，而是就我发现的一个问题谈谈我的看法。 问题其实也很简单：那就是两位同事“不约而同”的都没有对这类试验性质的代码进行很好的备份和版本管理。 也许你看到这里会觉得这个芝麻粒儿大的问题不值得一提。没错，可能很多人都不以为然，不过有过以下经历的朋友们也许会与我产生...</description></item><item><title>经典设计原则背后的本质</title><link>https://tonybai.com/2010/09/17/the-nature-of-some-classical-design-rules/</link><pubDate>Fri, 17 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/17/the-nature-of-some-classical-design-rules/</guid><description>近一段时间重读了一些经典书籍，诸如《敏捷软件开发：原则、模式与实践》、 《程序员修炼之道》、《Unix编程艺术》等。这些书中关于如何衡量或评价一个类或函数设计好坏的几个原则(Principle)让人印象深刻。《敏捷软件开发》中谈到了SRP、OCP、DIP; 程序员修炼之道则以DRY、“正交性”为话题展开;《Unix编程艺术》围绕紧凑性、SPOT、分离等阐述作者立场。这么多经典原则，如何学习把握？我...</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>视警告为错误</title><link>https://tonybai.com/2010/09/05/view-warning-as-error/</link><pubDate>Sun, 05 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/05/view-warning-as-error/</guid><description>每当你Build Project代码的时候，如果看到的是满屏的Warning，那么提醒你小心了，不妨看看《高效程序员的45个习惯》中对Warning的态度和处理方式。该书中的第34个习惯讲的是“警告就是错误”！ 当然这个“习惯”所阐述的内容并不是这本书首创，在很多经典的传授编程之道的书中也都提到过。 将警告作为错误来处理，说起来容易，可作起来可并不那么简单。这不仅仅只是一个态度的问题，有时候还需要...</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>一次函数设计讨论</title><link>https://tonybai.com/2010/09/02/an-discussion-on-function-design/</link><pubDate>Thu, 02 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/02/an-discussion-on-function-design/</guid><description>近期在考虑对底层函数库进行一些重构，今天下午花了两个小时考量现有的函数库的接口设计，发现目前函数库的实现存在着一个普遍的问题：与特定的内存分配实现耦合的太紧。 我们的应用是多进程结构的，并使用了共享内存这种最快捷的IPC机制，鉴于此很多同事在实现一些数据结构或者算法时可能只考虑到了我们常见的应用场景-多进程共享，而对非共享内存分配的情况考虑不足。那如何将目前某些库函数实现与内存分配之间的强耦合解开...</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>一周琐事</title><link>https://tonybai.com/2010/08/13/some-trifles-of-this-week/</link><pubDate>Fri, 13 Aug 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/08/13/some-trifles-of-this-week/</guid><description>刚刚在China-pub下了订单，买了三本口碑都不错的技术类书籍。之所以在China-pub买，这得益于豆瓣的购书单功能，经过购书单的比价发现China-pub的总价格最实惠。另外这笔交易成交后，我在China-pub的会员级别也将升到三星，到时候就有资格“淘二手书”了。 三本书中名气最大的应属Andrew Hunt和David Thomas于十年前合著的《程序员修炼之道》了，这本书的电子书我看过...</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>慎用线程取消</title><link>https://tonybai.com/2010/04/09/be-careful-about-thread-cancellation/</link><pubDate>Fri, 09 Apr 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/04/09/be-careful-about-thread-cancellation/</guid><description>本周二，我们产品在某省的一个节点应用运行时出现了“死锁”情况，由于监控得力，我们在“死锁”后一分钟内就发现了这个情况，并及时重启了这个节点应用。由于是集群式系统，一个节点的故障对整个系统业务的运行几乎没造成什么影响。不过，这确是一个潜在的隐患。 经过对系统当时运行日志的分析，我们将问题锁定在“线程取消”这个机制的使用上。在“生产者-消费者”实现思路这篇文章中，我曾经提到过我们目前采用的一种通知机制...</description></item><item><title>也谈Configure脚本问题的解决</title><link>https://tonybai.com/2010/03/19/also-talk-about-solving-the-problem-of-configure-script/</link><pubDate>Fri, 19 Mar 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/03/19/also-talk-about-solving-the-problem-of-configure-script/</guid><description>开了一个下午的技术交流会，回到办公室时离下班时间已经不远，天气预报说今晚有暴雪，外面阴沉的天气似乎也证实了这一点。这时一个同事遇到了一个软件包编译的问题，一时无法解决，向我求助。 这是一个libmemcached的编译问题，我们用的是libmemcached 0.34版本，我的同事在PC Solaris上执行libmemcached的configure脚本时遇到如下错，Configure脚本提示：...</description></item><item><title>试用Libmemcached</title><link>https://tonybai.com/2010/03/15/try-libmemcached/</link><pubDate>Mon, 15 Mar 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/03/15/try-libmemcached/</guid><description>近期一直在做一个项目架构演化的讨论交流，为了解决产品中存在的某些问题，我们有意引入某种类Memcached的开源产品，但我们的应用场景并非经典Memcached的“Cache”场景，这里也不详述细节了，大致就是这么一件事儿。 我们的第一选择是日本小伙儿Mikio Hirabayashi实现的Tokyo Tyrant，主要基于三点原因： \-&amp;gt; 支持数据的持久化 \-&amp;gt; 快！（性能数据来自于网上的第...</description></item><item><title>HelloWorld.s</title><link>https://tonybai.com/2010/02/28/helloworld-in-assembly/</link><pubDate>Sun, 28 Feb 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/02/28/helloworld-in-assembly/</guid><description>都说汇编不易学习和使用，的确不假。自己自大学以来也曾多次尝试学习汇编，甚至大学时还有相应课时，但是自己对汇编依旧是浅尝辄止。工作后也少有使用，对汇编的认识也就停留在基础层面。汇编的学习与对计算机系统的理解是密不可分的。工作这些年也算是一直浸淫于系统层面，经过多本底层相关书籍的教诲以及工作中的实践，对计算机系统的理解就自然而然加深了。昨天下载了一本名为：“Professional Assembly ...</description></item><item><title>也谈指针运算</title><link>https://tonybai.com/2010/02/23/also-talk-about-pointer-arithmetics/</link><pubDate>Tue, 23 Feb 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/02/23/also-talk-about-pointer-arithmetics/</guid><description>指针在C语言中的位置这里就不多说了，这里说一下C的指针运算。指针运算一般针对的是同一连续内存块，不同内存块之间的指针运算无意义，甚至可能导致异常情况。 指针运算主要针对数组，常见的运算类型：+i, -i, ++, –以及 等。 我们以+i操作为例。运算时编译器需要知道一些必要的信息，比如p = p + 1操作时编译器需要知道这个运算后，p这个指针需要移动多少个字节，那这个信息哪里来呢，由指针p所指...</description></item><item><title>命令行选项解析-备忘</title><link>https://tonybai.com/2010/02/09/parse-command-line-options/</link><pubDate>Tue, 09 Feb 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/02/09/parse-command-line-options/</guid><description>翻看一本关于Shell方面的书，有一章节对命令行选项的讲解比较详细，这里总结了一下： 命令行选项分类： 1、无命令行选项(option) 如：mv file1 file2； 在命令后名显示增加一个&amp;#39;-&amp;#39;，也是一种显式无option的表达。比如：mv – file1 file2 2、有命令行选项，但无Option参数 如：rm -f file1 rm -f -r dir1 无参数的option可组合...</description></item><item><title>iterator的C实现</title><link>https://tonybai.com/2010/01/30/implement-iterator-in-c/</link><pubDate>Sat, 30 Jan 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/01/30/implement-iterator-in-c/</guid><description>这几天一直处于编码状态，也找回了一些对代码的良好感觉。 昨天晚上闲暇时翻阅“Head First设计模式”，当翻到迭代器模式时，突然有了想法：实现一个iterator。这几天编码时恰好也写了一个简单的带有遍历功能的小数据结构，不妨用iterator改造一下这个数据结构的遍历接口，看是否能成行。 迭代器模式较为简单，网上的文章也多得很，这里就不再贽述了，直接看实现思路和代码吧。 在迭代器模式中，有几...</description></item><item><title>2010·做快乐的事</title><link>https://tonybai.com/2010/01/04/wish-to-do-happy-things-in-2010/</link><pubDate>Mon, 04 Jan 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/01/04/wish-to-do-happy-things-in-2010/</guid><description>“征尘未洗又出发”！2010年的这个元旦假期我依旧是在忙碌和压力下度过的。元旦三天假期本来是计划静下心来好好回顾和总结一下2009的，但事与愿违。由于年前的最后一天，我们的产品因性能问题招致客户的不满，所以这几天一直在写问题报告和改进方案。节没过好，心情自然也就低落了一些。 2009年，总体来说是五味杂陈。对我来说，最大的一件快事莫过于结婚了。虽说2008年就和老婆将证书领到了手，但毕竟中国人更看...</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>一个Solaris x86平台64位编译的问题</title><link>https://tonybai.com/2009/11/05/a-64bit-compiling-problem-on-x86-solaris/</link><pubDate>Thu, 05 Nov 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/11/05/a-64bit-compiling-problem-on-x86-solaris/</guid><description>上午在做一个Solaris 10 on x86代码移植测试过程中，发现一个Gcc编译问题，这里记录下来以作备忘。 我们的代码在一台安装了Solaris 10 for x86平台的机器A上进行64位编译(gcc -m64)时报错，错误信息如下： &amp;#34;xx.c:1: sorry, unimplemented: 64-bit mode not compiled in&amp;#34;。 而奇怪的是在另外一台同为Solar...</description></item><item><title>使用iconv做内码转换</title><link>https://tonybai.com/2009/10/31/internal-code-transform-by-iconv/</link><pubDate>Sat, 31 Oct 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/10/31/internal-code-transform-by-iconv/</guid><description>前不久某南方省份的客户反馈说我们的产品对某些生僻字(如“赟”)的转码支持的不好，终端收到后无法显示这个字。 经分析，发现类似“赟”这样的字在GB2312编码标准中并未收录，要想支持这样的生僻字的内码转换需要产品支持目前最新的中文编码标准GB18030。而我们的产品在诞生到现在就一直只支持GB2312，这就是导致这一问题的直接原因。 产品以前的代码库中内码转换的接口都是自己实现的，仅支持GB2312...</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>模拟器陷阱</title><link>https://tonybai.com/2009/08/22/the-trap-of-simulator/</link><pubDate>Sat, 22 Aug 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/08/22/the-trap-of-simulator/</guid><description>暑去清凉来，一场大雨让燥热一去不复返了，这让身体舒服了许多。本周四晚有一次产品升级操作，按惯例每次升级前的都会对产品做一次针对性的回归测试，这次也不例外，不过临近下班时测试组爆出一个莫名奇妙的问题。 测试人员在BUG说明中写到：产品在只运行某个流程A的情况是正常的，但是当流程A和流程B一起运行时，就会出XX异常情况。作为开发人员遇到类似的问题第一反映多为：这怎么可能呢？这个产品已经经过N轮测试并且...</description></item><item><title>分享一个Oracle OCI库的BUG</title><link>https://tonybai.com/2009/07/31/a-bug-of-oracle-oci-lib/</link><pubDate>Fri, 31 Jul 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/07/31/a-bug-of-oracle-oci-lib/</guid><description>上周测试组反馈在一台HP X86-64主机Solaris 10 for X86环境下部署的应用无法连接Oracle数据库，错误码ORA-12154。而另外一个产品的部署在这台主机上的应用却能正常连接到数据库。本周安排专人对该问题进行查找，在先后排除了用户环境设置、Oracle数据库服务端等问题后，我们最终把目光集中在了Oracle客户端的OCI库上。 定位过程如下： 1、SQLPLUS可以访问数据...</description></item><item><title>周末“捉虫”记</title><link>https://tonybai.com/2009/07/18/debugging-notes-at-weekends/</link><pubDate>Sat, 18 Jul 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/07/18/debugging-notes-at-weekends/</guid><description>周六，对于上班族来说是多么好的日子，能在家里享受自由的无拘无束的生活而且不用担心第二天的工作，应该说是一周中最没有压力的一天。六点半起床，慢慢喝下一杯225ml左右的凉白开（保健医生说20-25摄氏度的凉白开比较适宜作为起床后的第一杯水），套上运动短裤和上衣，打开MP3播放器，塞上耳机，出门在园区内慢跑。昨晚下了一场雨，所以园区早上的空气很好。耳畔酷玩乐队的“Viva La Vida”让我跑起来很...</description></item><item><title>对着电脑发呆</title><link>https://tonybai.com/2009/05/06/sit-in-front-of-the-pc-and-do-nothing/</link><pubDate>Wed, 06 May 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/05/06/sit-in-front-of-the-pc-and-do-nothing/</guid><description>突然觉得最近自己对着电脑发呆的时间变长了，面对着笔记本屏幕，时常是大脑变得空白，不愿去想工作上的事情，上网也提不起兴趣，想写文章又不知从何下笔，旁边厚厚的一摞技术书籍也懒得去翻看，每天都觉得很累，晚饭后总想去用睡眠来麻醉自己，真怀疑自己是不是有了心理问题。回过头来再想想这应该不是一个偶然的现象，而是一种积蓄了很久的情绪的爆发。 自己工作时间也不算短了，按理说自己的发展曲线还算是不错的，但是近来我却...</description></item><item><title>有关单元测试的“只言片语”</title><link>https://tonybai.com/2009/04/08/only-a-word-or-two-about-unit-test/</link><pubDate>Wed, 08 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/08/only-a-word-or-two-about-unit-test/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</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>2009·第一个工作日</title><link>https://tonybai.com/2009/01/04/2009-the-first-working-day/</link><pubDate>Sun, 04 Jan 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/01/04/2009-the-first-working-day/</guid><description>2009年的第一个工作日，一切尽在平淡中度过。 往往大家都有这样的体会，那就是&amp;#34;长假“过后的第一个工作日身体多不在状态，假期中身体的懒散的惯性还没有彻底消除掉，也许脑子里还在回忆着与亲人朋友聚会时的那抹快意。但元旦后上班的第一天或许有些不同，毕竟这是新年后在同事面前的第一次亮相，要有蓬勃向上的气质和神态^\_^。 晨会上，组内同事围在椭圆会议桌，大家似乎都较为沉默，要不是我打开话题，各位似乎还停留...</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>曙光</title><link>https://tonybai.com/2008/12/23/the-dawn/</link><pubDate>Tue, 23 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/23/the-dawn/</guid><description>近一两年来我在博客少有提及公司项目的事情，除了一些技术bug引起我对问题的思考。这样一是为了“避嫌”，公司年初发生了多次因员工在个人博客泄露源代码或者客户资料的事件，公司管理层也加强了对公司“信息安全”的管理，无非是学习华为那一套-“封锁”：使用websense限制员工上外网，使用桌面监控系统监控员工电脑系统，封掉一切可能泄露机密信息的接口。还特地发挥了一下“数字课件”部门兄弟们的聪明才智，搞了一...</description></item><item><title>四谈内存对齐</title><link>https://tonybai.com/2008/11/17/httptonybai-com20061208talk-about-memory-alignment-the-4th-time/</link><pubDate>Mon, 17 Nov 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/11/17/httptonybai-com20061208talk-about-memory-alignment-the-4th-time/</guid><description>最近在思考改进项目中一模块的实现，该模块维护起来让我很是头疼，所有才有了整体换掉它的想法。设计和实现中利用了内存对齐的技术。关于内存对齐，我曾经写过三篇文章，第一篇介绍了计算内存对齐的方法和例子，第二篇说了一个内存对齐的应用；三谈内存对齐时，则从其本质上做了阐述，而这次实际上是继续在其本质上的做文章，结合本质谈谈为什么内存对齐的计算方法就应该是第一篇中所讲的那两条。 如果对内存对齐本质还不清楚的话...</description></item><item><title>开始思考项目</title><link>https://tonybai.com/2008/09/17/begin-to-think-over-the-project/</link><pubDate>Wed, 17 Sep 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/09/17/begin-to-think-over-the-project/</guid><description>国内，也包括国外大多数项目经理/技术经理都是技术出身，工作了若干年，羽翼丰满后，被赋予了带领一个项目的责任。从技术到管理的过程多数人都需要一段时间去转换和适应。什么时候算是合格了或者说是入道了呢？没有标准。但是从我的体会而言，是否开始主动思考项目是至关重要的一点，一个重要的转折点。 刚刚从技术转为管理的人一般都不能很好适应角色的变化。技术人员最拿手的、最擅长的就是技术了，编码是他们发挥才能的舞台所...</description></item><item><title>发现一隐藏多年的Bug</title><link>https://tonybai.com/2008/09/06/found-a-bug-that-is-hidden-several-years/</link><pubDate>Sat, 06 Sep 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/09/06/found-a-bug-that-is-hidden-several-years/</guid><description>C语言程序员在平时工作中，到底如何获取成就感呢？我几乎可以肯定的是：找到一个隐藏已久，多年无人发现的大Bug肯定可以归属到C程序员成就感的范畴中。与操作系统斗、与编译器斗、与内存斗，其乐无穷吗^\_^。 今天测试人员在进行平台迁移测试时发现一个致命的问题，导致系统不能正常工作。问题提到我这，为了不耽误测试进度，马上丢下手头的工作开始问题的查找，经过GDB多次跟踪调试，终于发现了一隐藏多年的问题，至...</description></item><item><title>小议架构师</title><link>https://tonybai.com/2008/09/04/thoughts-on-architect/</link><pubDate>Thu, 04 Sep 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/09/04/thoughts-on-architect/</guid><description>这周我在两个会议场合听到“架构师”这个词。对于软件开发领域的人来说，&amp;#34;架构师&amp;#34;这三个字并不陌生，甚至很崇高。每当提到架构师的时候，大家眼睛都会放出羡慕和期待的光芒，因为众所周知的原因：&amp;#34;架构师&amp;#34;对于搞技术的人来说，都是&amp;#34;大牛&amp;#34;的代名词。 就像不想当将军的士兵不是好士兵一样，不想当大牛的技术人员肯定也不是好的技术人员。 第一个谈到&amp;#34;架构师&amp;#34;的场合是在会议室和一位要好的同事讨论新项目的需求时，他感慨道...</description></item><item><title>无意中的Pair Programming</title><link>https://tonybai.com/2008/09/02/unexpected-pair-programming/</link><pubDate>Tue, 02 Sep 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/09/02/unexpected-pair-programming/</guid><description>Pair Programming, 结对编程是敏捷开发中一个重要的实践，并受到很多业界大师级人物的推崇。但是明知它对我们可能会很有帮助，但是如果推广、实践起来还是要突破各种束缚的，心理上的、流程规范上的等等。我想也许这也或多或少也和公司或者部门的开发文化有些关系。我很想去尝试，但是一直没有找到一个很好的机会，也没有找到&amp;#34;心仪&amp;#34;的Partner。 今天上午恰好要完成一个脚本的编写，这是一个升级产品时...</description></item><item><title>CruiseControl.rb初体验</title><link>https://tonybai.com/2008/08/20/the-experience-of-cruisecontrol-rb/</link><pubDate>Wed, 20 Aug 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/08/20/the-experience-of-cruisecontrol-rb/</guid><description>我所在的项目一直以C语言作为主要开发语言，与做Java以及其他新兴语言的人不同，组内的同事似乎对新鲜的东西不是那么感兴趣，也没有主动去研究新鲜事物的意愿和意识。我深为此闹心，看到外面世界中那么多美妙的工具，再也不能坐以待毙了。我一直都是有很多想法的，但是迫于自身精力有限，自己无法全身投入，以前都是交予别人去做的，但是收到的效果都不是很好。认识到这点后，我决定自己动手，丰衣足食。 从心底一直对公司的...</description></item><item><title>switch语句性能考量</title><link>https://tonybai.com/2008/08/18/thoughts-on-the-performance-of-switch-case-statments/</link><pubDate>Mon, 18 Aug 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/08/18/thoughts-on-the-performance-of-switch-case-statments/</guid><description>每年都有应届毕业生来到公司，每年都要对新同事进行代码方面的培训，比如编码规范就是其中之一。编码规范初听起来比较新鲜，但是培训时间长了，显然有些乏味。今年我打算改变策略，让新同事结合已有规范文档和项目代码，自己先挖掘一遍，然后大家通过坐下来讨论的互动方式来加深对规范的理解，每次讨论时间限制在1 hour以内，不给大家打瞌睡的机会^\_^。 上周和新同事一起讨论表达式和语句，说到了switch和if，...</description></item><item><title>CHECKLIST的不实用之处</title><link>https://tonybai.com/2008/08/15/checklist-is-impractical/</link><pubDate>Fri, 15 Aug 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/08/15/checklist-is-impractical/</guid><description>CHECKLIST多是类似如下的东西，举一个代码CHECKLIST的例子： - 参数的书写是否完整？不要贪图省事只写参数的类型而省略参数名字。  - 参数命名、顺序是否合理？  - 参数的个数是否太多？  - 是否使用类型和数目不确定的参数？  - 是否省略了函数返回值的类型？  - 函数名字与返回值类型在语义上是否冲突？ 我们常常遇到的一个问题就是在进行source peer review的时候...</description></item><item><title>无线路由设置也'疯狂'(续)</title><link>https://tonybai.com/2008/08/15/configure-wireless-router-cont/</link><pubDate>Fri, 15 Aug 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/08/15/configure-wireless-router-cont/</guid><description>刚搬家，由于新的小区不在中国铁通的势力范围之内，所以无奈下只好硬着头皮去安装网通宽带，与铁通宽带不同的是网通宽带套餐必须绑定一部固话，估计这就是固网电信运营商开拓市场的一个卑鄙伎俩吧。铁通就可以不安装电话，直接通过跳线做。还有更严重的一点就是网通宽带贵，包一年比铁通要贵上300块；另外已经习惯了铁通的免费电影网站，网通的收费电影网站让我很是不适应。我又不喜欢用bt，以后看电影还是需要另寻门路了。 ...</description></item><item><title>关于宏定义切换以及屏蔽的例子</title><link>https://tonybai.com/2008/05/17/examples-for-macro-definition-switch-and-mask/</link><pubDate>Sat, 17 May 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/05/17/examples-for-macro-definition-switch-and-mask/</guid><description>assert是大家常用的宏，它的用法相信大家都有所了解。P.J Plauger的&amp;#34;The C Standard Library&amp;#34;一书中提到在源代码中切换assert宏定义的方法： /\* turn assertion on \*/ #undef NDEBUG #include /\* turn assertions off \*/ #define NDEBUG #include 我顺手写了一个例子...</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>由一把座椅想到的</title><link>https://tonybai.com/2008/04/30/thought-on-a-chair/</link><pubDate>Wed, 30 Apr 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/04/30/thought-on-a-chair/</guid><description>今天上午参加了一个公司内部的项目管理工具推广和使用的培训，培训地点在公司新落成不到一载的办公楼的一间视频会议室里，由于是新办公楼，所以这里的设施也都是很新的。特别是会议室里的座椅让人坐起来很是舒服，会议室的椭圆桌摸起来也很有质感，当时就和同事们讨论如果我们的办公环境要是能有这样的座椅和桌子那该多好啊，工作效率肯定能提高不少。目前我们的座椅估计就属于写字楼中最常见的那种，坐起来普遍反映不舒服。 会议...</description></item><item><title>C单元测试之Mock Test篇</title><link>https://tonybai.com/2008/04/12/mock-test-in-c-unit-test/</link><pubDate>Sat, 12 Apr 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/04/12/mock-test-in-c-unit-test/</guid><description>曾经在多篇blog中报怨过：用C语言写业务逻辑实在是让人身心忐忑不安，再加之C语言自有的&amp;#34;特点&amp;#34;，让其与&amp;#34;单元测试&amp;#34;始终若即若离，曾经尝试过写了一个轻量级C Unit Testing lib，至少目前我依旧在用，但多用在编写独立算法以及底层库的场合。业务层少有使用。业务层多是遗留系统，当初前辈们设计时对可测性考虑不够周全，导致现在无法很好的将各个部分独立抽出进行测试，虽然我们也在做着类似&amp;#34;重构&amp;#34;的...</description></item><item><title>Mingle初体验</title><link>https://tonybai.com/2008/04/09/the-experience-of-mingle/</link><pubDate>Wed, 09 Apr 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/04/09/the-experience-of-mingle/</guid><description>本周一已经投奔ThoughtWorks的Dreamhead因公事回到沈阳，来到我们公司看望以前的同事。他谈到业界的一种说法：ThoughtWorks在&amp;#34;怎么做&amp;#34;上达到了很高的高度，但是在&amp;#34;做什么&amp;#34;上与Google这样的公司相比还有差距。既然ThoughtWorks在&amp;#34;怎么做&amp;#34;方面树立了榜样，那么这个公司推出的产品估计在&amp;#34;怎么做&amp;#34;上对其他公司也会有所指导^\_^。Mingle就应该是其中之一。 公司...</description></item><item><title>软件业的'图纸'在哪里？</title><link>https://tonybai.com/2008/03/31/where-is-the-drawing-of-software-developing/</link><pubDate>Mon, 31 Mar 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/03/31/where-is-the-drawing-of-software-developing/</guid><description>上周日和橱柜公司商量好，下午三点到我的房子量尺，橱柜设计师按时到达，拿着一卷尺开始了测量工作。有过装修经历的人都知道：在装修公司进场之前需要橱柜设计师出一份水电改造图，便于装修公司人员确定水电改造的具体方法。装修公司的施工人员与橱柜设计师之间仅需要一份设计图纸就可以完成水电路改造的沟通，这不由得让我想起这样一个问题：&amp;#34;软件开发领域的&amp;#34;图纸&amp;#34;在哪里呢&amp;#34;? &amp;#34;图纸&amp;#34;是建筑行业的标准的共同语言，它能让设...</description></item><item><title>面对'破窗户'的无奈</title><link>https://tonybai.com/2008/03/28/the-helplessness-to-face-the-broken-window/</link><pubDate>Fri, 28 Mar 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/03/28/the-helplessness-to-face-the-broken-window/</guid><description>每天早晨都是坐公司的班车上班的，从家到公司大约需要40分钟，这段时间不短也不长。为了打发时间，也曾经想过要充分利用这段时间，我选择过听音乐、看书。但音乐听时间长了就听烦了；在车上看书时间长了还有些头晕，所以多数时间我还是选择&amp;#34;思考&amp;#34;。&amp;#34;思考&amp;#34;的同时，眼睛也一直在&amp;#34;欣赏&amp;#34;车窗外的风景。今天窗外一处新楼盘门市的两个破碎的窗户让我的&amp;#34;思考&amp;#34;有了方向。 建筑物上的几扇&amp;#34;破窗户&amp;#34;，很多人即使注意了，也会不以...</description></item><item><title>说说用xml做配置文件的优劣</title><link>https://tonybai.com/2008/03/24/the-benefits-of-using-xml-as-configuration/</link><pubDate>Mon, 24 Mar 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/03/24/the-benefits-of-using-xml-as-configuration/</guid><description>最近收到客户的一个需求，要求我们将产品的系统配置数据和业务配置数据定期导出备份，以防万一数据库宕掉后可以用来&amp;#34;救火&amp;#34;。产品从起初0.1版本就一直延续着一种&amp;#34;section-key-value&amp;#34;的配置文件方式，同时我们也有可复用的库来完成配置数据的读取，可是在长期的使用过程中我们发现的不少问题，特别是在存储多样化的业务数据的时候，这样的配置方式带来维护上的很大不便。 &amp;#34;section-key-val...</description></item><item><title>多行宏定义中的注释问题</title><link>https://tonybai.com/2008/03/14/the-problems-of-commenting-multiple-lines-macro/</link><pubDate>Fri, 14 Mar 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/03/14/the-problems-of-commenting-multiple-lines-macro/</guid><description>早上在写代码时遇到这样一个问题：即如何在一个拥有多行的宏定义中做注释？，这里把方法演化的过程贴出来，可能对某些朋友有些借鉴意义。 宏定义高深莫测，而且是比较细节的东西，详细说明请参见&amp;#34;C参考手册&amp;#34;之类的书籍。 在我的代码中，我大致要做这样一个简单的事情：printf(&amp;#34;%s%s%s\\n&amp;#34;, &amp;#34;hello&amp;#34;, &amp;#34;macro&amp;#34;, &amp;#34;yeah!&amp;#34;); &amp;#34;%s%s%s\\n&amp;#34;这个字符串中每一项输出都有一...</description></item><item><title>无线路由设置也'疯狂'</title><link>https://tonybai.com/2008/03/08/configure-wireless-router/</link><pubDate>Sat, 08 Mar 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/03/08/configure-wireless-router/</guid><description>无线路由设置本来是件很简单的事情，但今晚却让我吃尽了苦头，这里暂且用&amp;#39;疯狂&amp;#39;来形容吧，也许有些不当。自从买了D-Link 624+A无线路由器之后，在家里上网就一直使用它了。这之前一直是使用我的工作笔电单机访问，今天不知怎么心血来潮，拿出我自己的&amp;#39;古董本本&amp;#39;(和今天的本本性能做比较，我的本本也算是古董级的了，有些夸张^\_^)，来一个双机访问，按理说：只要在无线路由器上配置一个DHCP服务器就可以...</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/2008/02/03/symbol-linkage-in-shared-library/</link><pubDate>Sun, 03 Feb 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/02/03/symbol-linkage-in-shared-library/</guid><description>清晨，部门新来的一位小兄弟打来求助电话，说是系统启动的时候出现类似：&amp;#34;ld.so.1: testmain: 致命的: 重定位错误: 文件./libtestshared.so: 符号static\_add: 参照的符号没有找到&amp;#34;的错误。这个系统是05年开发的一个复用度很高的自研产品，后续项目只需在其基础上做少量二次开发工作即可满足新功能的要求。为了做到一定的通用性，我们使用了类似插件的框架，这样系统...</description></item><item><title>查表法求解'自然数对'问题</title><link>https://tonybai.com/2008/01/29/use-searching-table-to-solve-natural-number-pair-problem/</link><pubDate>Tue, 29 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/29/use-searching-table-to-solve-natural-number-pair-problem/</guid><description>‘自然数对’是这样的一对自然数，他们的和与差的结果都是平方数，比如：自然数对32和68，根据定义32+68 = 100 = 10^2，68-32 = 36 = 6^2。现在的题目是：根据输入的两个100以内的自然数，打印出这两个整数之间的所有自然数对。 这道题不难，而且限制了范围，在两个100以内的自然数区间，很多人马上就能给出程序。这道题的有两个点需要思考：一个是关于平方数的判断；另一个就是两个...</description></item><item><title>三角形输出问题考量</title><link>https://tonybai.com/2008/01/27/solve-triangle-print-problem/</link><pubDate>Sun, 27 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/27/solve-triangle-print-problem/</guid><description>相信很多人在初学某门计算机语言的时候都会做过类似的题目：在控制台上输出用特定字符&amp;#39;拼&amp;#39;出来的某种图形，比如下面的这种三角形：     \*    \*\*\*   \*\*\*\*\*  \*\*\*\*\*\*\* \*\*\*\*\*\*\*\*\* 这样的问题应该算是入门级的了，大多人都是看之，做之，忘之，而今天我就拿这种入门级的题目说事，小问题里也许内含有大道理。 昨晚无意中在编程爱好者论...</description></item><item><title>开发程序不能太'单纯'</title><link>https://tonybai.com/2008/01/23/programmers-should-not-be-too-pure/</link><pubDate>Wed, 23 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/23/programmers-should-not-be-too-pure/</guid><description>昨天凌晨，突然接到云南移动哥们的电话，说他们正在进行的全网割接出现了问题，当时只有我们的产品遇到这样的问题，其他省的其他厂商的产品都已经顺利通过测试了。迷迷糊糊的我无奈的起床，开机，查找问题，这也让我体会到了这几天北方的夜晚的冷啊。 花了一段时间对底层的协议包进行了分析，发现我们产品发出去的消息包的那个域后面的确随机的分布着一些乱码字符。譬如我们的消息发送的目的地址是1069999333(Goog...</description></item><item><title>都是病毒惹得祸</title><link>https://tonybai.com/2008/01/18/a-disaster-caused-by-virus/</link><pubDate>Fri, 18 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/18/a-disaster-caused-by-virus/</guid><description>上周日下午，接到同事的一个寻求支持的电话，原来是部门以前给中国联通做的一个运行在PC服务器上的程序在每天凌晨出现&amp;#39;挂死&amp;#39;情况，导致程序运行中断，问题连续几天复现。程序是老程序，在不下十多个省运行，一直都很稳定。通过联通的人发过来的截图，很难定位问题所在，所以只能打车到了联通机房现场查看了。 还是那句话，维护别人的又是自己不熟悉的程序那真是痛苦的，好久都不在Windows上写程序、调程序了，API都...</description></item><item><title>QA人员一定要有实际项目经验</title><link>https://tonybai.com/2008/01/07/qa-must-have-experience-in-real-project/</link><pubDate>Mon, 07 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/07/qa-must-have-experience-in-real-project/</guid><description>最近一段时间正处于项目策划阶段，这个阶段势必要和部门QA打交道，咨询问题并获取支持。按照我们公司的软件开发流程，策划阶段要输出一系列文档的。这些文档都是有公司模板或者是经部门裁剪后模板作为基础的，所以现在项目前期策划基本上就是按照自己的思路填写文档，估计很多公司也都是这么做的。 好不容易花了一个星期的时间把这些文档&amp;#39;填全&amp;#39;了。提交给QA，让之帮忙审审。QA的一封邮件回来，问题多多。 当我看到这些Q...</description></item><item><title>程序员与影视作品</title><link>https://tonybai.com/2008/01/07/programmers-and-films-and-television-programs/</link><pubDate>Mon, 07 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/07/programmers-and-films-and-television-programs/</guid><description>午休时看到CSDN上的一篇叫’外行人看软件:看有感‘的文章，这又让我想起07年看完’虎胆龙威4‘后的那个问题：现在影视著作中表现程序员这个行当的作品太少了，包括书籍杂志也是这样，我记忆里是没看到哪部畅销小说是写程序员的。 隐约记得央视很多年前有一部电视剧叫&amp;#34;牵手&amp;#34;的，那里的主角-由吴若甫饰演的是搞软件开发的，但是剧中基本没有程序员典型生活的描写，主要还是以爱情作为主线。起码这也算是我看到的第一部有...</description></item><item><title>也谈’SIGBUS和SIGSEGV’</title><link>https://tonybai.com/2007/12/19/also-talk-about-sigbus-and-sigsegv/</link><pubDate>Wed, 19 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/19/also-talk-about-sigbus-and-sigsegv/</guid><description>SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信号。内存问题一直是最令我们头疼的事情，弄清楚两个信号的发生缘由对我们很好的理解程序的运行是大有裨益的。 我们来看两段程序： //testsigsegv.c int main() {         char \*pc = (char\*)0×00001111;         \*pc = 17; } //testsigbu...</description></item><item><title>一个很有意思的Bug</title><link>https://tonybai.com/2007/12/18/an-funny-bug/</link><pubDate>Tue, 18 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/18/an-funny-bug/</guid><description>这个Bug源于昨天凌晨的一次版本升级失败。睡了一大觉后，下午回到公司，重现了这个问题并找到了原因，发现这的确是一个&amp;#39;很有意思的Bug&amp;#39;。 系统在从数据库初始化过程中遇到了问题：在读取数据库数据时，提示ORA-24373错误。手册上对ORA-24373的解释是这样的： ORA-24373: invalid length specified for statement Cause: The lengt...</description></item><item><title>'符号连接'那些事儿</title><link>https://tonybai.com/2007/12/08/those-things-about-symbol-linkage/</link><pubDate>Sat, 08 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/08/those-things-about-symbol-linkage/</guid><description>我们在编译自己开发的程序或者一些开源软件的时候，常常遇到类似如下的编译器错误信息： 未定义 文件中的 符号 在文件中 i /var/tmp//ccU4sj6I.o func /var/tmp//ccU4sj6I.o ld: 致命的: 符号参照错误. 没有输出被写入a.out collect2: ld returned 1 exit status 或&amp;#34;undefined reference to &amp;#39;...</description></item><item><title>回顾TCP协议那些事儿</title><link>https://tonybai.com/2007/12/06/review-tcp-protocol/</link><pubDate>Thu, 06 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/06/review-tcp-protocol/</guid><description>我不是计算机科班出身。记得大学的时候旁听计算机系的网络课，当时计算机系使用教材是&amp;#34;计算机网络–自顶向下方法与Internet特色&amp;#34;的影印版，这本教材与众不同的一个地方就是作者JAMES F.KUROSE和KEITH W.ROSS采用了&amp;#39;自顶向下&amp;#39;的编排思路，先从应用层开始，最后讲到物理层。而且这本书在语言上形象生动，通俗易懂。只怪我当初没有一心一意听讲，到现在存在我的脑子中的基本概念居多，深刻理解...</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>面对'错误'的抉择</title><link>https://tonybai.com/2007/11/13/the-choice-when-dealing-with-errors/</link><pubDate>Tue, 13 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/13/the-choice-when-dealing-with-errors/</guid><description>大凡写程序者，都会遇到错误； 大凡写程序者也都知道两种错误处理的机制：传统的&amp;#39;错误码返回机制&amp;#39;和&amp;#39;面向对象语言引入的异常处理机制&amp;#39;。 人们常常会在这两种机制之间徘徊不定，难以抉择。但有两类人大可不必为此头痛，他们是坚决只使用&amp;#39;错误码返回机制&amp;#39;的人，和坚决只使用&amp;#39;异常处理机制&amp;#39;的人。而苦就苦了摇摆在中间，思索不定的那些人了。这群人有一个特点就是不停的问：&amp;#34;什么是异常？什么时候该使用错误码返回？什么时...</description></item><item><title>遭遇Heap溢出</title><link>https://tonybai.com/2007/11/10/debug-heap-overflow/</link><pubDate>Sat, 10 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/10/debug-heap-overflow/</guid><description>今天凌晨配合云南移动进行局数据全量升级，本来以为是件很轻松的活计，甚至不需要我动手的事情，结果却又是一次惨痛的教训啊。 这个活计其实真的很简单，就是将数据库中的旧数据全部删除，然后导入新的数据，由于数据量较大需要重启一次我们的系统。问题就在重启系统上。摆在我面前的就是&amp;#34;重启失败&amp;#34;，系统dump一个core文件。通过pstack和gdb查看如下： core &amp;#39;core&amp;#39; of 7971: xxxxx...</description></item><item><title>读'代码修改艺术'，可观其大略</title><link>https://tonybai.com/2007/11/09/know-its-general-aspects-when-reading-working-effectively-with-legacy-code/</link><pubDate>Fri, 09 Nov 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/11/09/know-its-general-aspects-when-reading-working-effectively-with-legacy-code/</guid><description>早在几个月前就从网上下载到了&amp;#34;Working Effectively With Legacy Code&amp;#34;这本书的E版，之所以下这本书是因为看到了&amp;#34;Legacy Code&amp;#34;这两个单词了，说实话当时我并不知晓这本书的价值，只是想当然的认为：这本书可能会有助我改善我所从事的项目中的&amp;#34;Legacy Code&amp;#34;。早在上个月去逛书店时，就看到了书架上的这本&amp;#34;修改代码的艺术&amp;#34;，遗憾的是没有给予足够关注。在最近看...</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>浅谈如何编码使程序更易维护</title><link>https://tonybai.com/2007/09/30/thoughts-on-how-to-make-code-more-maintainable/</link><pubDate>Sun, 30 Sep 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/09/30/thoughts-on-how-to-make-code-more-maintainable/</guid><description>毕业后就一直从事于服务器端程序的开发，主要客户是中国移动，大家知道移动的产品都是电信级的，稍出差错后果都是严重的，所以在我们平时的工作中除了研发之外，还有的就是对我们卖给移动的产品的维护性工作，而这种维护性工作要求就是要&amp;#34;迅速解决现场的问题&amp;#34;。这几个月维护工作占据了我很大一部分精力，说实话，有些烦了，但是从另外一个角度来看，也说明了我们的产品在维护性方面做的不够好，否则移动的工作人员或当地的技术支...</description></item><item><title>成功Build ACE</title><link>https://tonybai.com/2007/06/14/build-ace-successfully/</link><pubDate>Thu, 14 Jun 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/06/14/build-ace-successfully/</guid><description>近期公司实行新的绩效考核机制，我的考核目标中就有一项叫做：&amp;#34;成功使用新技术、框架、思路等至少3个&amp;#34;，呵呵，先不论绩效考核机制是否合理，既然已经这样了那就需要去适应。一直在做Network Application，早就知道ACE在业界中的名气，这回有理由找个时间好好挖掘一下ACE的思路，也为我的绩效目标增色啊^\_^。 以上只是开个玩笑罢了。上周末去书店看到电子工业出版社再次出版的&amp;#39;C++网络编程卷...</description></item><item><title>转载'编程大腕'</title><link>https://tonybai.com/2007/06/13/foward-master-programmer/</link><pubDate>Wed, 13 Jun 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/06/13/foward-master-programmer/</guid><description>在公司内网看到一则趣帖，这里转载一下。 编程大腕 写就要写最难懂的程序 用记事本做编辑器 编译就得用最难用的编译器 程序不带半点注释 程序里面至少要有三个类 什么多继承呀, 多线程呀，template呀，inline呀 能给他用的全给他用上 一行里面有while有++有?:有goto 文章里面一定要搬出一个XX哥 用很随意的语气，关系特好的样子 如果自己出书 ，甭管是什么语言 一开头都打印 &amp;#34;he...</description></item><item><title>开发人员之维护他人项目有感</title><link>https://tonybai.com/2007/05/25/thoughts-on-maintain-projects-of-others/</link><pubDate>Fri, 25 May 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/05/25/thoughts-on-maintain-projects-of-others/</guid><description>软件行业人员流动比较频繁，如果你是一个公司的老员工，你常常会有如此经历：一个同事即将离职，领导可能分配你去与之进行工作交接，有时他做过的项目很可能和你做过的有很大差距，没办法领导发话了，你还是要硬着头皮接下来，心中盘算着但愿这个项目的产品在现场运行不要出现什么问题或者用户最好一个新需求都不要提，这样就算是挂个名，也没什么大不了的。 可是事情往往是事与愿违，需求变化速度之快让你猝不及防，这时如果你接...</description></item><item><title>数的圆整算式</title><link>https://tonybai.com/2007/05/24/number-round-up-formula/</link><pubDate>Thu, 24 May 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/05/24/number-round-up-formula/</guid><description>一般在考虑到内存对齐的程序里面势必要使用数的圆整算式，一般来说在计算机程序里一般都是圆整到2的次幂上，而很多书上也有很多基于&amp;#39;移位&amp;#39;操作的圆整到2的次幂上的算法公式，形式都是很简单的，很实用。 这里要说的是一个圆整到任意正整数(n &amp;gt; 1，圆整到1没有必要^\_^)的算式，突然觉得如果说算法有些大了。我们来推导一下，也不是严密推导。就是怎么想的怎么说。 如果有两个正整数a、b，其中a &amp;gt;= 1, ...</description></item><item><title>C++咬文嚼字-'Pointer Trick'</title><link>https://tonybai.com/2007/05/22/cpp-weigh-every-word-series-pointer-trick/</link><pubDate>Tue, 22 May 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/05/22/cpp-weigh-every-word-series-pointer-trick/</guid><description>晚上饭后抽空看了看如何实现一个内存管理器，涉及内存操作必定少不了指针，恰研究到offsetof这个operator，也看了它的实现，顿有所悟。 先看一段代码： struct Foo {         int     a;         char\*   p;         char    b; }; Foo\* p1 = reinterpret\_cast(0); Foo\* p2 = 0;...</description></item><item><title>工厂模式三剑客</title><link>https://tonybai.com/2007/05/21/the-three-musketeers-of-factory-pattern/</link><pubDate>Mon, 21 May 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/05/21/the-three-musketeers-of-factory-pattern/</guid><description>前不久参加了一个为期四天的设计模式培训，公司以前组织过很多次设计模式培训，主题多为&amp;#39;Java与设计模式&amp;#39;，自己一直从事C相关的开发，也就不好越界参与这类培训。而这次主题换成了&amp;#39;C++设计模式&amp;#39;，我参加也就名正言顺了。按照人力资源部工作人员的说法这是第一次请老师讲C++与设计模式，这个老师也是第一次给我们公司做培训，因为没有先例，无从知道效果如何，不像以前侯捷来公司培训C++，一般参与的同事都清楚那...</description></item><item><title>Unix体验中心开张</title><link>https://tonybai.com/2007/03/20/unix-center-begin-supply-services/</link><pubDate>Tue, 20 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/20/unix-center-begin-supply-services/</guid><description>晚上收到一封mail，来自ecommunity@gceclub.com，mail中提到Unix体验中心开始提供免费服务了。Mail中写道：&amp;#39;Unix体验中心(Unix-Center.Net)的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供如下服务：SSH登录以...</description></item><item><title>C++咬文嚼字-'Functions'</title><link>https://tonybai.com/2007/03/13/cpp-weigh-every-word-series-functions/</link><pubDate>Tue, 13 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/13/cpp-weigh-every-word-series-functions/</guid><description>关于Functions，Bjarne Stroustrup在&amp;#39;The C++ Programming Language&amp;#39;一书中是这么开篇的：&amp;#39;The typical way of getting something done in a C++ program is to call a function to do it.&amp;#39;；另外他还阐述了一个使用Functions的原则：&amp;#39;A function c...</description></item><item><title>C++咬文嚼字-'Evil cast'</title><link>https://tonybai.com/2007/03/12/cpp-weigh-every-word-series-evil-cast/</link><pubDate>Mon, 12 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/12/cpp-weigh-every-word-series-evil-cast/</guid><description>Cast也被称为&amp;#34;Explicit Type Conversion&amp;#34;，即显式类型转换，在传统C中强制转型(cast)只有一种语法形式(T)e。Bjarne Stroustrup在&amp;#39;The Design and Evolution of C++&amp;#39;(以后称作D&amp;amp;E)一书的14.3小节开始就说了&amp;#39;无论是从语法还是从语义上, Cast都是C++里最难看的特征之一&amp;#39;，所以他要为cast提供A New Cas...</description></item><item><title>C++咬文嚼字-'0 or NULL'</title><link>https://tonybai.com/2007/03/10/cpp-weigh-every-word-series-0-or-null/</link><pubDate>Sat, 10 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/10/cpp-weigh-every-word-series-0-or-null/</guid><description>C程序员和C++程序员在声明空指针时做法常常是不相同的。 C程序员常常如下做： int \*ptr = NULL; C++程序员则是听从Bjarne Stroustrup或者其他C++大师的教诲，坚定地如下做： int \*ptr = 0; 也许没有谁对谁错之分，也许只是习惯不同罢了，毕竟C语言是老大哥，诞生的早；而在早期C编程时人们也许不习惯在程序里使用0这样的magic number，转而使用...</description></item><item><title>C++咬文嚼字－'Hijack const'</title><link>https://tonybai.com/2007/03/09/cpp-weigh-every-word-series-hijack-const/</link><pubDate>Fri, 09 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/09/cpp-weigh-every-word-series-hijack-const/</guid><description>晚上无意翻看Bjarne Stroustrup的&amp;#39;The C++ Programming Language Special Edition&amp;#39;(英文版)第94页，章节5.4 Constants一节，看到这么一句原文&amp;#39;C++ offers the concept of a user-defined constant, a const, to express the notion that a valu...</description></item><item><title>工作中的故事-0是'TRUE'还是'FALSE'？</title><link>https://tonybai.com/2007/01/17/zero-is-true-or-false/</link><pubDate>Wed, 17 Jan 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/01/17/zero-is-true-or-false/</guid><description>这个故事源于今天测试组测出的一个BUG，BUG被测试人员转给了我，故事便从这里开始了。 我们的系统是一个后台服务器程序，用C写的，运行在Solaris上，数据存储在数据库中，每次系统启动都要从数据库中读取配置数据。系统根据配置数据对输入的消息数据进行处理。今天的这个BUG现象就是对于一定的输入消息，系统根据配置数据的指导进行处理，结果得到的结果本应该是A，但是却得到了B。 首先咱抱着谨慎负责的态度...</description></item><item><title>搬到新工作区了</title><link>https://tonybai.com/2007/01/10/move-to-new-office/</link><pubDate>Wed, 10 Jan 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/01/10/move-to-new-office/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</description></item><item><title>编译Ethereal On Windows</title><link>https://tonybai.com/2006/12/30/build-ethereal-on-windows/</link><pubDate>Sat, 30 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/30/build-ethereal-on-windows/</guid><description>最近在研究项目下一期中新增的信令跟踪功能，在这个开源盛行的时代，开源工具当然是首选。我们发现了Ethereal，一款强大的网络分析工具包。我们不仅仅要使用Ethereal，而是在Ethereal上做二次开发，增加一个新dissector或者一个plugin，用来分析我们自己的应用层协议。 之所以选择Ethereal还有一个很重要的原因就是它已经支持300多个协议包了，这说明Ethereal的框架已...</description></item><item><title>'画蛇添足'招致的BUG</title><link>https://tonybai.com/2006/12/21/a-bug-caused-by-gild-the-lily/</link><pubDate>Thu, 21 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/21/a-bug-caused-by-gild-the-lily/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</description></item><item><title>疏忽大意招致恼人'BUG'</title><link>https://tonybai.com/2006/12/16/a-bug-caused-by-carelessness/</link><pubDate>Sat, 16 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/16/a-bug-caused-by-carelessness/</guid><description>河南项目实施，一波刚平一波又起呀！ 前天凌晨，河南又割入很多家SP，昨天早晨上班通过日志发现程序的一个子模块进程隔一段时间重启若干次，通常是每一批数据推过来，就有一次重启的过程，日志中没有打印出出错的标志，进程莫名奇妙的就宕掉了，查看程序环境也没有发现CORE文件或者.assert文件，在代码关键的退出区域加入打印日志，重启系统后仍然有同样的问题。郁闷呀，没办法，在家里搭建测试环境，模拟测试，测试...</description></item><item><title>一个'莫须有'的BUG</title><link>https://tonybai.com/2006/12/11/a-unwarranted-bug/</link><pubDate>Mon, 11 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/11/a-unwarranted-bug/</guid><description>上周三晚，河南’前线’反馈，河南移动手机用户投诉，经查是话单丢失。查看后的确有蹊跷，按照数据库中录入的原始话单数据来看，这几条记录的确是该生成话单的。之后又有同事发现出现丢话单的问题不仅仅这几条，而是一批一批的。没什么头绪，一夜无话，周四发现每天入库的可生成话单记录数居然比话单多出100万，也就是说我的程序居然少生成了100万话单，按照一条记录1角钱，这也是10万块呀，事情紧迫，问题查找的历程开始...</description></item><item><title>三谈内存对齐－背后的故事</title><link>https://tonybai.com/2006/12/08/talk-about-memory-alignment-the-3rd-time/</link><pubDate>Fri, 08 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/08/talk-about-memory-alignment-the-3rd-time/</guid><description>记得以前曾经两次谈到过内存对齐话题，一次在&amp;#39;也谈内存对齐&amp;#39;一文中，另一次则是&amp;#39;也谈内存对齐(续)&amp;#39;，今天下午和同事又谈到内存对齐的问题了，遂想继续挖掘下去，看看其背后的故事。 关于内存对齐的中文文章多在介绍对齐的&amp;#39;法则&amp;#39;，比如为什么sizeof(T)和我们估计的T的大小有出入呢等等，而对于内存对齐的本质少有介绍，我在Google上搜索了一阵后，在IBM开发社区上发现一篇叫&amp;#39;Data alignme...</description></item><item><title>挖掘一下C语言中的多维数组</title><link>https://tonybai.com/2006/11/29/understand-multiple-dimension-array-in-c/</link><pubDate>Wed, 29 Nov 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/11/29/understand-multiple-dimension-array-in-c/</guid><description>好久没有看技术类的书籍了，今晚恰看到以前不知什么时候下到的一本oreilly的叫’mastering algorithms with c’的书，从书名可以看出这是一本讲算法的书，不过由于是选用了C语言作为讲解语言，所以难免不说说C语言。其中看到一节讲指针和数组，恰好碰到书中说: a\[i\]\[j\] \*(\*(a+i) + j)，这个等价式看起来显而易见，但是还是有些东西值得挖掘一下的。 我们...</description></item><item><title>Goto也有它的好</title><link>https://tonybai.com/2006/10/17/goto-also-has-beneift/</link><pubDate>Tue, 17 Oct 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/10/17/goto-also-has-beneift/</guid><description>最近真是忙的昏头转向，再加上天气逐渐转冷，很是有些不爽。今天dreamhead提醒我好久不更新Blog了，我也想更新，但是写点什么呢，工作相关的吧。 今天抽出一点儿时间来改一个系统的大Bug，这个问题早已定性，只是由于修改工作量较大，范围较广，而不敢轻易修改。不过眼看系统要上线测试，不改也不行了。 问题主要是由于系统锁资源使用不当，导致有时一些指针在无锁保护的情况下’裸奔’，解决方案就是在业务一层...</description></item><item><title>'此起彼伏'的复杂性</title><link>https://tonybai.com/2006/09/12/the-complexity-rise-one-after-another/</link><pubDate>Tue, 12 Sep 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/09/12/the-complexity-rise-one-after-another/</guid><description>今天部门的一个同事很痛苦的向我求助。问题是关于一个新功能的测试，如果是一般的功能也就罢了，关键是这个功能是基于我曾做过的一个框架的，而这位同事由于是临时被指派的工作，对我的那个东西完全不熟悉。 问题就在这，当时写那个框架的时候目标就是为了部门内部其他项目的高度复用，也就是说其他项目如果有类似需求，使用我们的框架经过一系列配置就可以满足需求，至多需要一个简单的二次开发过程，可能需要提供若干业务相关的...</description></item><item><title>不完备库接口带来的隐患</title><link>https://tonybai.com/2006/09/09/hidden-danger-introduced-by-uncompleted-interface/</link><pubDate>Sat, 09 Sep 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/09/09/hidden-danger-introduced-by-uncompleted-interface/</guid><description>最近自己曾经辛苦耕耘过的两个项目同时上线，相关问题也就逐渐暴露出来。工作这两年多时间以后，使我有这样感觉：’测试永远都是不完备的’，有些问题只能在商用过程中发现，呵呵，明确一点啊我不是搞测试的:) 在解决问题过程中的感悟往往是最深刻的，解决问题的过程往往真的像是警察在侦破案件，往往一点点罪犯留下的蛛丝马迹就会让神探们找到线索，并迅速破案。 最近两天一直在一个bug上煎熬着，终于于昨天发现蛛丝马迹并...</description></item><item><title>小心'溢出'陷阱</title><link>https://tonybai.com/2006/09/06/be-careful-of-the-trap-of-overflow/</link><pubDate>Wed, 06 Sep 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/09/06/be-careful-of-the-trap-of-overflow/</guid><description>这几天以前曾经做过的一个项目上线测试了，果不其然，没有经过’战争洗礼’的产品就是靠不住，这不出了若干问题。害得我逃了半天课远程支持。 其中的一个问题很值得思考。其所在的模块并非是一个核心功能模块，而是一个提高系统Availability的一个功能模块，主要功能就是监视磁盘占用率。我们通过配置给出允许使用的磁盘空间大小(以M Byte为单位)，以及两个阈值，即当占用率达到多少的时候，Do A；达到多...</description></item><item><title>P.J.Plauger版本C标准库实现分析之'ctype.h'</title><link>https://tonybai.com/2006/07/17/plauger-c-standard-lib-ctype-header/</link><pubDate>Mon, 17 Jul 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/07/17/plauger-c-standard-lib-ctype-header/</guid><description>如果在你的源代码中经常见到如下代码： /\* To Identify a letter \*/ if ((i &amp;gt;= &amp;#39;a&amp;#39; &amp;amp;&amp;amp; i = &amp;#39;A&amp;#39; &amp;amp;&amp;amp; i = &amp;#39;0&amp;#39; &amp;amp;&amp;amp; i &amp;lt;= &amp;#39;9&amp;#39;) 这说明你对头文件理解的不是很好，而也恰恰是为了减少代码中重复出现的各种&amp;#39;字符分类&amp;#39;代码而设置的。 中的接口常用来进行数据的校验和分类，如在我们的项目中它常被用来校验原始数据的&amp;#39;符合性&amp;#39;。比如说一个11位的手...</description></item><item><title>P.J.Plauger版本C标准库实现分析之'assert.h'</title><link>https://tonybai.com/2006/07/08/plauger-c-standard-lib-assert-header/</link><pubDate>Sat, 08 Jul 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/07/08/plauger-c-standard-lib-assert-header/</guid><description>I believe that seeing a realistic implementation of the Standard C library can help you better understand how to use it.                                                                                ...</description></item><item><title>'寓教于乐'学Ruby</title><link>https://tonybai.com/2006/06/28/learn-ruby-in-amusement/</link><pubDate>Wed, 28 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/28/learn-ruby-in-amusement/</guid><description>在2005年初曾经写过一篇文章叫&amp;#39;结识Ruby&amp;#39;，当时的确是刚刚结识Ruby这种语言，好奇心使然，遗憾的是之后没有坚持学习下去，也就是在这一年Ruby获得了很大的发展，特别是Ruby On Rails的出现让Ruby一下成为新兴语言的代表，甚至有人预言Ruby将会成为Java的替代者成为下一代主流语言。无论如何，Ruby的日益被广大开发人员所接受是个不争的现实，就连Martin Fowler到中国...</description></item><item><title>字符串拷贝密码</title><link>https://tonybai.com/2006/06/26/the-secret-of-string-copy/</link><pubDate>Mon, 26 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/26/the-secret-of-string-copy/</guid><description>在近期的一次工作交接中，在我的代码中发现了很多’安全隐患’，主要是以’字符串拷贝’为主。这种安全漏洞在C编程中是较为常见的，防范起来也较为容易，这里我们就来一起探索一下’字符串拷贝’的’密码’。 在正常情况下，我们在考量目的缓冲区大小时都会以源缓冲区大小作为依据的，一般会适当的比源缓冲区多出一些空间，其中一种’居中’状况：即sizeof(dstbuf) = strlen(srcbuf) + 1。 ...</description></item><item><title>解决算法分析中递归问题的方法</title><link>https://tonybai.com/2006/06/21/solve-recursion-problem-when-doing-algorithm-analysis/</link><pubDate>Wed, 21 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/21/solve-recursion-problem-when-doing-algorithm-analysis/</guid><description>当一个算法(如二分查找)中包含对自己的递归调用时，关于这个算法时间复杂性的分析最终都转化为一个递归方程的求解问题，而这样的算法不在少数。实际上这是数学领域的问题，但是计算机科学又怎么能脱离数学而存在呢？^\_^ 数学是好东西呀，可惜自己在这方面造诣颇浅，今生之遗憾亚。^\_^ 还好，解决递归方程涉及的数学知识我还是能应付的了的^\_^。在MIT算法导论中介绍了3种方法，我们这里就说说这三种方法！这...</description></item><item><title>理解’位域’</title><link>https://tonybai.com/2006/06/19/understand-bit-fields/</link><pubDate>Mon, 19 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/19/understand-bit-fields/</guid><description>这也是在ChinaUnix上看了几篇关于C语言&amp;#39;位域(Bit Fields)&amp;#39;的帖子之后，才想写下这篇文章的。其实在平时的工作中很少使用到&amp;#39;位域&amp;#39;，我是搞服务器端程序设计的，大容量的内存可以让我毫不犹豫的任意&amp;#39;挥霍&amp;#39;^\_^。想必搞嵌入式编程的朋友们对位域的使用应该不陌生吧。这里我也仅仅是凭着对C语言钻研的兴趣来学习一下&amp;#39;位域&amp;#39;的相关知识的，可能有些说法没有实践，缺乏说服力。 具体也不是很清楚当年...</description></item><item><title>当数组访问越界后</title><link>https://tonybai.com/2006/06/16/after-array-index-overflow/</link><pubDate>Fri, 16 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/16/after-array-index-overflow/</guid><description>下午到ChinaUnix C/C++版看了看，发现一个比较有意思的问题，一位兄弟在其帖子中问一段很简单的程序明显有数组越界访问之错误，可程序为什么运行起来却’安然无恙’，我看看了看，也给出了我自己的回复，晚上下班后又想想了这个问题，决定写一篇blog说说。 这位仁兄的程序(据他个人说来源自’GNU/Linux编程指南’)是这样的： #define BIGNUM 50 void index\_to\...</description></item><item><title>也谈内存对齐(续)</title><link>https://tonybai.com/2006/06/14/also-talk-about-memory-alignment-cont/</link><pubDate>Wed, 14 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/14/also-talk-about-memory-alignment-cont/</guid><description>关于内存对齐的话题，始终是敏感的。稍有不慎，必将闯下大祸！最近项目稍显轻闲，自己给自己安排一天反思和总结一下，突然想到以前写过的一篇&amp;#39;也谈内存对齐&amp;#39;，那篇文章谈的是内存对齐的基本知识以及一些实验的数据，想必很多人看完后，会收获一些东西，但是对内存对齐的应用还是处于懵懂状态，其实大部分时间我们是不会显式的用到&amp;#39;内存对齐的&amp;#39;，但是有些时候我们需要这样做。这里做了一个小例子，希望能给大家以启发。 例子是...</description></item><item><title>线程函数参数引发的问题</title><link>https://tonybai.com/2006/06/07/a-problem-caused-by-thread-func-argument/</link><pubDate>Wed, 07 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/07/a-problem-caused-by-thread-func-argument/</guid><description>上午我们的一个实施组从现网发回来一封邮件，接到这种邮件一般都是报告问题的，果然不出所料，现场出现一个core，经过分析这是个由于线程函数参数存储位置不当造成的，从中我们可以总结出一些经验，以避免以后再犯。 我采用下面的一个例子来模拟问题的出现： #include #include #include typedef struct foo {         char c\[10\];        ...</description></item><item><title>美妙的文件描述符传递</title><link>https://tonybai.com/2006/06/01/passing-file-descriptor/</link><pubDate>Thu, 01 Jun 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/06/01/passing-file-descriptor/</guid><description>我们知道父进程在子进程被fork出来之前打开的文件描述符是能被子进程继承下来的，但是一旦子进程已经创建后，父进程打开的文件描述符要怎样才能传递给子进程呢？Unix提供相应的技术来满足这一需求，这就是同一台主机上进程间的文件描述符传递，很美妙而且强大的技术。 想象一下我们试图实现一个服务器，接收多个客户端的连接，我们欲采用多个子进程并发的形式来处理多客户端的同时连接，这时候我们可能有两种想法： 1、...</description></item><item><title>代码评审很必要</title><link>https://tonybai.com/2006/05/31/code-review-is-necessary/</link><pubDate>Wed, 31 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/31/code-review-is-necessary/</guid><description>记得刚到公司做第一个项目时，mentor要和我一起看看我刚实现完的一些代码，当时有些不解，难道是不相信我写的代码么？最后事实证明：我的代码中有很多缺陷，有的还是很严重的缺陷。后来知道这个过程叫’代码评审’，是保证软件质量的一种手段，而且是很重要的一种手段。代码评审的形式有多种，最正式的一种就是召集公司或者部门的一些’大牛’们，围坐在会议室中，一行一行的审查你的代码；简单的形式就像我和mentor做...</description></item><item><title>小心库函数调用的'陷阱'</title><link>https://tonybai.com/2006/05/31/take-care-of-trap-when-invoking-lib-functions/</link><pubDate>Wed, 31 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/31/take-care-of-trap-when-invoking-lib-functions/</guid><description>下午一同事发现代码中的一处问题，问题的现象是这样的：这位同事调用了一部门基础库函数，当使用32位编译后，程序正常运行；而当使用64位编译后，系统运行dump core。让这位同事奇怪的是他所修改的程序中还有其他模块也使用了同样的基础库函数，为什么偏偏他这块儿出错呢？恰恰该程序的其他模块是我写的。 该程序调用的基础库函数大致是这样的： typedef unsigned long my\_size\_...</description></item><item><title>算法时间复杂性之渐近法分析基础</title><link>https://tonybai.com/2006/05/23/the-base-of-algorithm-complexity-asymptotic-analysis/</link><pubDate>Tue, 23 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/23/the-base-of-algorithm-complexity-asymptotic-analysis/</guid><description>在我的评论栏中有人说：&amp;#34;你是程序员?&amp;#34;，我可以确定、一定以及肯定地告诉他/她：&amp;#39;我就是一个程序员，如假包换&amp;#39;。也许是最近技术类的blog写得少了，其他类的多写了些，让人家误会了，这也无可厚非。不过我倒是想到这样一个问题：程序员一定要满篇地谈技术么，程序员也有自己丰富多彩的生活呀。好了，切入正题。今天我们谈谈算法时间复杂性的分析。我没系统学过，都是在书上看到的以及MIT算法导论课上听到的。这里仅从我...</description></item><item><title>单元测试进行曲</title><link>https://tonybai.com/2006/05/12/the-march-of-unit-test/</link><pubDate>Fri, 12 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/12/the-march-of-unit-test/</guid><description>又是老生常谈-&amp;#39;单元测试&amp;#39;，说实话自己在单元测试上是&amp;#39;语言上的巨人，行动上的矮子&amp;#39;，属于那种说的比做的多的人^\_^。不过也不能说什么也没做。记得去年年末的时候自己还设计并实现过一个简单的&amp;#39;C语言单元测试包&amp;#39;呢^\_^，至今这个包仍然还在使用呢。不过大多数的单元测试都不像想象中那样简单，我们在介绍单元测试的时候，大多拿Add、Sub等作例子，这样当然有好处，简单易懂。其实学习单元测试初期关键是学习...</description></item><item><title>算法描述中的'Pseudocode Conventions'</title><link>https://tonybai.com/2006/05/10/pseudocode-conventions-in-algorithm-description/</link><pubDate>Wed, 10 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/10/pseudocode-conventions-in-algorithm-description/</guid><description>Pseudocode，即伪码，它常常用来描述一个算法，目的是能使被描述的算法能够容易的以任何一种计算机程序语言实现。’Pseudocode Conventions’可以理解为’伪码约定’，既然是’约定’那就并非强制性的标准。但是在专业的有关算法的文献和资料中，其相关内容多符合这些’Pseudocode Conventions’。如果你是一个想学习和钻研算法的人，那么建议你熟悉这些’Conventi...</description></item><item><title>你提供默认选项了吗</title><link>https://tonybai.com/2006/05/08/supply-the-default-option/</link><pubDate>Mon, 08 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/08/supply-the-default-option/</guid><description>五一期间到姥姥家串门儿，自然午饭要在那吃，可中午做饭时听姥姥抱怨新买的电饭煲做饭时间太长而且还夹生，我好奇的走了过去想看看究竟，电饭煲的确是新买不久的，而且是美的的，我心想大牌厂商应该不会有这样的质量问题呀，一定是姥姥使用上的问题。仔细看了看控制板，果然不出所料，电饭煲的’功能选择’键停在了功能档的中央，既不是左边的’煮饭’也不是右边的’煲粥’，遂告诉姥姥以后煮饭要把功能选择调到’煮饭’档。 吃完...</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>五一节你快乐，我工作</title><link>https://tonybai.com/2006/05/01/you-happy-i-work-on-may-day/</link><pubDate>Mon, 01 May 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/05/01/you-happy-i-work-on-may-day/</guid><description>刚刚看到Google黑板报的一篇短文&amp;#39;五一节快乐&amp;#39;，心想这是自己第一次五一节加班，是不是也该写点什么，不过该写些什么呢，自己心里也没个方向，那就想到哪写到哪吧！ 已经连续工作7天了，自己略感到有些疲惫，今天早上醒的很早，自己做了碗&amp;#39;蛋炒饭&amp;#39;，然后把它吃个精光，缓解肚内空虚^\_^。加班毕竟不比工作日，时间安排上有一定自主权，只要工作完成了，领导也不会说什么^\_^。到公司的时候已经9点多了。很多来...</description></item><item><title>遇到系统的高可用性问题</title><link>https://tonybai.com/2006/04/25/a-problem-about-high-available-service/</link><pubDate>Tue, 25 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/25/a-problem-about-high-available-service/</guid><description>我也是直到最近才接触到&amp;#39;高可用性&amp;#39;这个词儿的，从我所在的项目需求角度出发，我理解&amp;#39;高可用性&amp;#39;就是在系统的外部依赖实体(如主数据库、主网络)等瘫痪了之后，系统仍然能正常的支撑业务的运行，当然系统自己宕掉了，那就没辙了^\_^。高可用性设计实际上就是在系统自身完好的情况下如何考虑其外部实体的设计以保证系统能持续的运行支撑下去，起码从我现在正在做的项目的角度来说是可以这样理解的。 目前我们的系统的高可用...</description></item><item><title>今年五一要加班</title><link>https://tonybai.com/2006/04/24/work-overtime-on-may-day-vacation/</link><pubDate>Mon, 24 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/24/work-overtime-on-may-day-vacation/</guid><description>今天是五一黄金周之前的最后一周了，如果我没有猜错的话，绝大部分的企事业单位都会’串休’，当然我也不例外，这周要’鏖战’七天，哦，不，不是七天，我’追求’连作11天。 不用担心，我没有疯，呵呵。最近项目进度抓得紧，今天下午开了3个小时的会来确认五一期间那些子系统负责人要加班，挑来减去就我老哥一个。可不是我效率不高啊，的确是我这块儿改动量较大，按正常每天8小时工作很难完成，我很少、特少、少之又少晚上下...</description></item><item><title>恼人的'素数回文'</title><link>https://tonybai.com/2006/04/16/solve-prime-palindromes/</link><pubDate>Sun, 16 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/16/solve-prime-palindromes/</guid><description>33.00s和14.27s，两个截然不同的运行时间值，两次提交尝试解决素数回文问题，终于搞定了！用两个字形容’恼人’！算法不复杂，就是要求时间很’紧’，大部分工作都在考虑着如何缩短运行时间。桃花在冷空气袭来的日子都开了，我的心也算可以放下了！ 最近项目吃紧，连续两天没有做ACM习题了，手都有些生了^\_^！按照Volume1的习题顺序，该轮到1004题了！这是一道关于’素数回文(Prime Pal...</description></item><item><title>开始'亡羊补牢'</title><link>https://tonybai.com/2006/04/12/begin-fix-before-lost-too-much/</link><pubDate>Wed, 12 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/12/begin-fix-before-lost-too-much/</guid><description>就在昨天，就在我们的项目要结项的时候，一个影响力不亚于’广岛原子弹’的bug出炉了，蒙蔽我近一个月的问题终于被澄清了，不过为时已晚，项目即将上线，如果想彻底地解决这个问题，需要对整个系统的实现架构作调整，目前能做的只是’亡羊补牢’了。 这里先简单的说一下问题的原因吧！熟悉Unix编程的人都知道有’共享内存映射’这回事儿，我们的问题恰巧就出在对’共享内存映射’的使用不当上。由于我们使用的底层库采用的...</description></item><item><title>算法的回归</title><link>https://tonybai.com/2006/04/07/the-return-of-algorithm/</link><pubDate>Fri, 07 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/07/the-return-of-algorithm/</guid><description>关于算法的文章我一直想写，但算法是我的软肋，自己难于下笔。首先自己非科班出身，没有进行过系统的算法设计课程训练；再者自己到目前为止还从未独立设计过一个完整的、实用的算法，在平时工作中较少的涉及到算法设计，这不能说不是一个遗憾。也许有人会问：&amp;#34;算法难道还没有过时吗，算法不是属于&amp;#39;Donald E. Knuth&amp;#39;那一代人的事情吗?&amp;#39;。我很难回答这个问题，不过当我今天看到CSDN上的一篇题为&amp;#39;算法是百度...</description></item><item><title>第一道ACM练习题</title><link>https://tonybai.com/2006/04/05/do-an-acm-exercise/</link><pubDate>Wed, 05 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/05/do-an-acm-exercise/</guid><description>说来惭愧，今天才真正做过一道ACM练习题。自从上个月发现我的母校上有ACM的在线测试站点，我就下决心好好潜心做题，一来提高一下自己解决问题的能力，一方面也想在算法方面多实践实践，而且每天都花一定时间写程序还可以锻炼自己的思维能力。总而言之，由于项目繁忙以至直到今天才开始做第一道ACM练习题，做题的过程’坎坷不平’，让我印象深刻亚!^\_^ 有人会说：’ACM’中的题都是不实用的，没有实际意义。我之...</description></item><item><title>我来'Mixing Milk'</title><link>https://tonybai.com/2006/04/05/solve-mixing-milk/</link><pubDate>Wed, 05 Apr 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/04/05/solve-mixing-milk/</guid><description>这又是一道ACM练习题，我的原则就是如果有时间，坚持每天考虑解决一道吸引我的ACM练习题，今天这道&amp;#39;Mixing Milk&amp;#39;题并不难，不过里面蕴含着一个基础的算法，毕竟对算法一类的知识生疏已久，今天就拿它做一次回顾吧！ 这道&amp;#39;Mixing Milk&amp;#39;(1003)题目前在&amp;#39;在线测试&amp;#39;系统上的状态是474/1207=39.27%(即accepted/submit=ratio)，算是中等偏下难度的题了，...</description></item><item><title>2006IT书讯之经典重现篇</title><link>https://tonybai.com/2006/03/31/classic-it-books-of-2006/</link><pubDate>Fri, 31 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/31/classic-it-books-of-2006/</guid><description>我想最近最忙的应该是各大网络书店了，一本本好书真是如&amp;#39;雨后春笋&amp;#39;般出现在各大书店的&amp;#39;书架&amp;#39;上，这也让我们这些做程序员的过了把书瘾！还等什么呢，掏钱包，把书抱回家读吧，都是经典！下面一一道来。^\_^ 首当其冲的就是&amp;#39;Unix编程艺术&amp;#39;，又名&amp;#39;TAOUP&amp;#39;，它也是最先于年后上市的一本经典好书。我上周购了一本，只是由于最近项目紧，还没来得及看，书的质量没的说，至于译者的翻译么，由于还没仔细看呢，所以不...</description></item><item><title>追求'lint-clean'</title><link>https://tonybai.com/2006/03/31/pursue-lint-clean/</link><pubDate>Fri, 31 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/31/pursue-lint-clean/</guid><description>到底需不需要编译器之外的独立的静态代码检查工具呢？这个问题’仁者见仁，智者见智’。但是有一个结论我想大家都会认可，那就是越是在开发周期早期发现的Bug，修复它所付出的代价就越小。而像lint这样的静态代码检查程序恰恰是让Bug在早期阶段’显露原型’的绝佳工具，而追求’lint-clean’\[注1]境界的代码也向来是专家级程序员的嗜好。别忘了在’C专家编程’一书中曾经提到Sun OS的内核一直是保...</description></item><item><title>C语言也重构</title><link>https://tonybai.com/2006/03/28/c-refactoring/</link><pubDate>Tue, 28 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/28/c-refactoring/</guid><description>*所谓的重构是这样的一个过程：在不改变代码外在行为的前提下，对代码做出修改，以改进程序的内部结构。重构是一种有纪律的、经过训练的、有条不紊的程序整理方法，可以将整理过程中不小心引入错误的机率降到最低，本质上说，重构就是\[在代码写好之后改进它的设计]。*– Martin Fowler *重构，一种改善代码’体质’的方法’。* — 侯捷 *重构是上进程序员每天的进行式。是一项工程而不是靠着天份挥洒的...</description></item><item><title>当数组作参数时</title><link>https://tonybai.com/2006/03/27/when-array-passed-as-arguments/</link><pubDate>Mon, 27 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/27/when-array-passed-as-arguments/</guid><description>C语言中的数组和指针总保持着&amp;#39;千丝万缕&amp;#39;的联系，这里仅针对数组作为函数实参时的情况做些说明^\_^。 C语言中的数组可分为一维数组和多维数组两类，而多维数组中又以二维数组最为常见。这里也仅针对这一维数组和二维数组作简要说明。 看过&amp;#39;高质量C++编程指南&amp;#39;的人可能都知道书中有这样一句&amp;#39;注意当数组作为函数的参数进行传递时，该数组自动退化为同类型的指针&amp;#39;，这句话针对一维数组固然是正确的，但是对于多维数组...</description></item><item><title>'right-left'规则再举例</title><link>https://tonybai.com/2006/03/26/another-example-for-c-right-left-rule/</link><pubDate>Sun, 26 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/26/another-example-for-c-right-left-rule/</guid><description>闲暇时翻阅&amp;#39;C专家编程&amp;#39;，再次看到对C语言变量声明的理解一节，遂想起我曾经写过的那篇利用&amp;#39;right-left&amp;#39;规则分析复杂的C语言变量声明的文章&amp;#39;C复杂声明解析&amp;#39;，发现其中的例子的对比性不够强，所以决定再用一篇短文来再阐述。 至于&amp;#39;right-left&amp;#39;规则这里就不再重述了。这里想重点分析一组对比&amp;#39;鲜明&amp;#39;的例子：分析int \*p\[20]和int (\*p)\[20]。 闲话就不多说了，我们看...</description></item><item><title>理解C复杂声明之'优先级规则'</title><link>https://tonybai.com/2006/03/26/understand-priority-rule-for-parse-c-declaration/</link><pubDate>Sun, 26 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/26/understand-priority-rule-for-parse-c-declaration/</guid><description>第一次看《C专家编程》一书时关于其采用的&amp;#39;优先级规则&amp;#39;分析C复杂声明时看得很糊涂，在理解&amp;#39;right-left&amp;#39;规则分析C复杂声明后，再回过头来看&amp;#39;优先级规则&amp;#39;，居然发现它们的异曲同工之妙^\_^。 其实&amp;#39;优先级规则&amp;#39;的分析过程极其类似&amp;#39;right-left&amp;#39;规则，下面首先摘录&amp;#39;优先级规则&amp;#39;的&amp;#39;口诀&amp;#39;，然后再&amp;#39;一招一式&amp;#39;的细致讲解^\_^。 \[优先级规则&amp;#39;口诀&amp;#39;] A 声明从它的名字开始读取，然...</description></item><item><title>如果让我面试C程序员，我会问</title><link>https://tonybai.com/2006/03/26/interview-questions-for-c-programmer/</link><pubDate>Sun, 26 Mar 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/03/26/interview-questions-for-c-programmer/</guid><description>我有这样的一个习惯，就是看书的时候总是喜欢自问自答，这不周末第二次温习’C专家编程’一书，便有了如下若干问题，明为提问，实则是在提醒自己好好想想这些问题，如果大家有兴趣，也可以给出你自己的答案，如果觉得琢磨不透，可翻看’C专家编程’一书，或多敲几次键盘，自己试上一把！ 1、你认为C语言\[注1]是一门成功的语言吗？如果认为是，那么你认为它成功的关键在什么地方？或者说它的魅力所在？ 2、C语言中的函...</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>2006正月靓乐</title><link>https://tonybai.com/2006/01/24/recommend-music-of-2006-01/</link><pubDate>Tue, 24 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/24/recommend-music-of-2006-01/</guid><description>临近春节大多数人都沉浸在喜庆气氛之中，歌手们也趁着这个时候忙里偷闲，所以在这个正月新专辑不多，这里我挑了几首我最近在听的老歌说说。 这里首先要说的是阿桑的’一直很安静’，以前只是听说过有阿桑这么一号人物，却不曾听过她的作品(也许听过但不知道就是阿桑的^\_^)。一次偶然的机会听到这首醇美的歌曲，略微舒缓的节奏和阿桑那如清泉般甘甜的嗓音瞬间就征服了我的耳朵。我一口气听了不下10遍。这是一首’诉衷肠’...</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>make the world know China</title><link>https://tonybai.com/2006/01/16/make-the-world-know-china/</link><pubDate>Mon, 16 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/16/make-the-world-know-china/</guid><description>Last night I watched the ‘Dialogue’ , which is a very pop ‘talk show’ TV program of CCTV2.  the topic of this issue is ‘how to make the world know China’. Zhao Qi-zheng and He Dele were invited as hon...</description></item><item><title>部门联欢小记</title><link>https://tonybai.com/2006/01/15/note-of-the-department-get-together/</link><pubDate>Sun, 15 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/15/note-of-the-department-get-together/</guid><description>一年一度的部门联欢如期举行。由于部门今年的业绩一片飘红，大家脸上都带着笑容。联欢吗就是要放下一切不愉快的事情尽情的玩，起码我是这么做了，晚会结束后我的嗓子都喊哑了:)。 吃吃喝喝、玩玩闹闹向来是联欢的主题。参加联欢获得快乐最大的秘诀就是&amp;#39;积极参与&amp;#39;，尤其是在互动游戏中体味快乐。我是这么想的也是这么做的。参与游戏还有个最大的好处就是有小巧而实用的奖品亚，多参与多得奖，多多益善吗:)。 对于结束一天辛...</description></item><item><title>又是一年考研时</title><link>https://tonybai.com/2006/01/14/the-time-of-one-year-exam-for-postgraduate/</link><pubDate>Sat, 14 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/14/the-time-of-one-year-exam-for-postgraduate/</guid><description>在收音机中得知今天是考研日。此时此刻，全国各地有过百万的莘莘学子们正在考场内紧张的答题。考研对我来说是个沉重的话题，不仅仅是因为我曾倒在&amp;#39;研究生圣堂&amp;#39;的大门口，更是因为它让我重新认识了我自己。现在想想两年前的那次失败也许不是偶然，而是必然。 记得在中学学写英文信的时候，大家几乎都不约而同地在第一行写下类似&amp;#34;How time flies!&amp;#34;的语句，感叹一下&amp;#34;时间飞逝&amp;#34;。而这句却正是现在坐在本本前的我...</description></item><item><title>给“沙场点兵”一些掌声</title><link>https://tonybai.com/2006/01/10/some-applause-to-the-troops-of-the-battlefield/</link><pubDate>Tue, 10 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/10/some-applause-to-the-troops-of-the-battlefield/</guid><description>最近央视一套正在热播一部反映当代军人题材的电视剧&amp;#34;沙场点兵&amp;#34;，军事题材电视剧一直是我的最爱，从&amp;#34;突出重围&amp;#34;、到&amp;#34;DA师&amp;#34;再到这部&amp;#34;沙场点兵&amp;#34;我都尽量抽出时间看上几集。军事剧播出自然少不了军迷们对其的评论，我在很多军事网站上看到了对其负面的评论，当然主要是针对剧情逻辑的不合理以及对军事理论的理解差异。我并未从头看起，只是看了中间的几集，就这几集如果让我谈谈的话，我会给沙剧一些掌声。 众所周知，中国现...</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>听说发论文要掏钱</title><link>https://tonybai.com/2006/01/07/have-to-pay-for-issuing-the-papers/</link><pubDate>Sat, 07 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/07/have-to-pay-for-issuing-the-papers/</guid><description>也许是我孤陋寡闻，今天才从SINA第一次听说发论文要自掏腰包。下午和GF聊天，GF为我证实了这件事。还能说什么呢，感叹呗! 我是本科毕业，没有过研究生、博士生的经历，不过我或多或少也了解些国家对研究生和博士生的一些硬性要求，那就是在读期间论文数量。毕业前数量不达标，想毕业就两个字&amp;#39;没门&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>一个军迷的忧虑</title><link>https://tonybai.com/2006/01/03/worries-of-a-military-fan/</link><pubDate>Tue, 03 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/03/worries-of-a-military-fan/</guid><description>看了CCTV7军事频道的一期&amp;#39;2005军中骄傲&amp;#39;节目，一幕某集团军地空导弹旅军演画面让我这个&amp;#39;非骨灰级&amp;#39;的军事迷不禁产生了一丝忧虑。 从小就爱耍枪弄棒，仰慕那些手握钢枪保家卫国的解放军战士。长大后&amp;#39;理所当然&amp;#39;地没能成为光荣的子弟兵^\_^，却成为了一名执著的军事迷，各大军事网站都留有我的&amp;#39;足迹&amp;#39;。但是首先声明一点的就是我可不是那些背着相机出没于各大造船厂、机场为我们这些军迷带来最新资料的骨灰级军迷...</description></item><item><title>中国电影100年了</title><link>https://tonybai.com/2006/01/02/100-years-of-chinese-movie/</link><pubDate>Mon, 02 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/02/100-years-of-chinese-movie/</guid><description>从CCTV6上得知已经过去的2005年是中国电影诞生100周年。作为中国电影发展的见证人在这样的一个时刻，也说说自己的一些感受。 绞尽脑汁也记不起来自己第一次在电影院里看的第一部中国电影的名字了。但是从时间上判断，我们这一代进入电影院、接触电影应该是在上世纪80年代末、90年代初。那时候整个中华大地正沐浴在改革开放的春天里，文化领域的人们自然也不甘落后，每年都有不少国产影片诞生。 脑海中记得一些如...</description></item><item><title>迎来本命年</title><link>https://tonybai.com/2006/01/01/my-animal-year/</link><pubDate>Sun, 01 Jan 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/01/01/my-animal-year/</guid><description>新的一年–2006年的第一天，&amp;#39;发泄&amp;#39;一下自己的感慨^\_^。 2006年 — 农历狗年 — 我的本命年。 我属狗，狗也是我最喜欢的动物。年幼时家里曾养过很多只可爱的小狗，其中一个重要的原因就是我父母也都喜欢狗。 本命年的来历大致是这样的：中国古代一直采用干支纪年法，天干十位，地支十二位。但鉴于古代普通老百姓的文化水平有限，他们很难记住众多的&amp;#39;稀奇古怪&amp;#39;的天干地支的组合纪年，遂发明了用一种动物来代...</description></item><item><title>2005腊月靓乐</title><link>https://tonybai.com/2005/12/29/recommend-music-of-2005-12/</link><pubDate>Thu, 29 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/29/recommend-music-of-2005-12/</guid><description>我喜欢音乐，所以我也来说说音乐。 最近晚上休息时一直在听中央人民广播电台的音乐之声(Music Radio)栏目，听到心仪的歌曲马上就下载到本本中，慢慢欣赏。下面是一些听后感^\_^: 激情澎湃 – 汪峰 之 &amp;#39;怒放的生命&amp;#39; 最开始知道汪峰是通过其作品“花火”，其高亢澎湃的嗓音让我想起了演唱&amp;#39;超越梦想&amp;#39;的汪正正。&amp;#39;怒放的生命&amp;#39;是在其&amp;#39;飞得更高&amp;#39;之后的又一表现其强烈心声的歌曲，经历过挫折、痛苦、迷茫...</description></item><item><title>圣诞后说</title><link>https://tonybai.com/2005/12/28/say-something-after-christmas/</link><pubDate>Wed, 28 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/28/say-something-after-christmas/</guid><description>圣诞节没来得及“说”，俺就来个“圣诞后说”^\_^。 又是一年圣诞节，又是考验国民消费能力的日子，不过从统计数据来看，没有让大家失望，以沈阳为例，著名商业街“中街”几个大商场一夜的销售额就过亿。看来大家都比我有钱，呵呵。 圣诞节也是一个考验肚子的日子，和GF从早到晚吃个不停。中午烤鸭，晚上南美烤肉。这回儿可往肚子里灌满了“油水”。 圣诞节也是个“短信爆炸”的日子，我的手机真是忙个不停，鉴于词语表达...</description></item><item><title>失望的“火焰杯”</title><link>https://tonybai.com/2005/12/17/the-goblet-of-fire-disappoint-me/</link><pubDate>Sat, 17 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/17/the-goblet-of-fire-disappoint-me/</guid><description>英国女作家“罗琳”的小说着实让我“着迷”一番。从第一部“魔法石”到第五部“凤凰社”，每部小说我都会认真拜读，至于同名电影我也“同步”地看了3部，这不刚刚把第4部电影“火焰杯”看完。 至今为止最吸引我的两部是“魔法石”和“火焰杯”。历来畅销小说的开山之作总是被誉为经典，“哈利波特”也不例外，“魔法石”一部让我们认识了善良、正义和勇敢的小哈利，也大致知道了整部小说的线索是“哈利与伏地魔之间的斗争”。在...</description></item><item><title>说说电影</title><link>https://tonybai.com/2005/12/16/something-about-movies/</link><pubDate>Fri, 16 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/16/something-about-movies/</guid><description>我是个不折不扣的电影迷，特别喜欢看欧美的科幻片、喜剧片和中国的剧情片，以前看电影都仅仅停留在看看乐乐就完了的阶段，现在有了blog这个工具，遂想把自己的一些看电影后的体会写出来，不吐不快么^\_^，另外注意哦这不是影评。 让我产生上面想法是索尼的“A Sound Of Thunder”这部2005年科幻片，其中文名为“雷霆万钧”或“一声惊雷”。知道这部片子源于同事的介绍，在他的描述中这部片子很精彩...</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>差异学习</title><link>https://tonybai.com/2005/12/13/differences-in-learning/</link><pubDate>Tue, 13 Dec 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/12/13/differences-in-learning/</guid><description>看了dreamhead的那篇“差异程序员”，又恰逢在今天dreamhead在一封邮件中谈到其继续深入“向下学习”的想法，心里突然有了本篇题目这样的一个话题。 “差异程序员”(http://dreamhead.blogbus.com/logs/2005/12/1676755.html) 最近自己也在“向下走”，这和dreamhead的想法和做法不谋而合。dreamhead在其blog和邮件中都谈了其...</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>学习虚存-自上而下</title><link>https://tonybai.com/2005/11/30/learn-virtual-mem-f/</link><pubDate>Wed, 30 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/30/learn-virtual-mem-f/</guid><description>如果它不存在，但是你能看见它 — 它是虚拟的(IBM宣传虚拟内存之用语)。虚拟内存技术是计算机发展史上的一项重要的技术，它帮助应用程序摆脱了“体积”的限制。 记得上大学时，有一本书好像叫做“计算机网络 – 自顶向下”，全名记不太清了。书中从人们接触最多也最熟悉的“应用层”开始讲，一直讲到“物理层”，看完这本书后感觉效果不错。所以按照这种方法我也尝试着自上而下的去学习“虚存”，从我们最熟悉的C库接口...</description></item><item><title>汇编之路-复习栈操作</title><link>https://tonybai.com/2005/11/24/assembly-series-review-stack-operation/</link><pubDate>Thu, 24 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/24/assembly-series-review-stack-operation/</guid><description>不得不承认上次关于栈桢和栈操作写得有些笼统，这里做一次“补充”，美名其曰：“复习”。 下面的这个例子几乎就能覆盖所有的栈操作相关的内容了。 void dummy() {         int     i = 12;         int     j = 13;         char    c = &amp;#39;a&amp;#39;; } int main() {         dummy();         re...</description></item><item><title>软件抽象</title><link>https://tonybai.com/2005/11/21/software-abstraction/</link><pubDate>Mon, 21 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/21/software-abstraction/</guid><description>不知道“软件抽象”这个标题能否恰好表达出我想表达出的意思，暂且就起这个名字吧。随着工作经验的增加，对软件开发所涉及的技术知识体系的理解也渐渐地清晰（起码自己是这么感觉的^\_^），思考了若干时间后，拿出来给自己一个和大家交流的机会。 1、起源 这个想法起源于一次项目方案讨论例会，会上我们的项目遇到了“存储资源瓶颈”，遂有同事提出一个类似“数据中心”的方案，但考虑到部门目前没有相关经验和数据供参考，...</description></item><item><title>tony说设计-实践后的体会</title><link>https://tonybai.com/2005/11/16/experience-after-some-design-practice/</link><pubDate>Wed, 16 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/16/experience-after-some-design-practice/</guid><description>入司后连续做过几个项目。最近在做一个新的项目的设计的时候，突然想到是不是该把以前项目中一些好的设计想法应用到新的项目中，并且尽量减少在新的项目中遗留以前的不好的设计呢？那么以前的项目中哪些是值得我去借鉴，哪些又是应该去避免的呢？真的很遗憾，自己并没有系统的反思和总结过，这就是我写下这篇Blog的直接起因。 一直在Unix平台下做设计和开发，所以下面谈的内容可能都有些局限性。作为设计原则本身，某些可...</description></item><item><title>童心未泯</title><link>https://tonybai.com/2005/11/14/still-childish/</link><pubDate>Mon, 14 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/14/still-childish/</guid><description>在sina“北京奥运吉祥物”发布专题中，发现吉祥物评审委员会有位评委是个童话故事家，叫“郑渊洁”，这个名字听起来很熟悉，在网上搜索后才知道，原来小时侯最喜欢看的《舒克和贝塔》就出自这位作家之手，心中顿时涌动着对其之敬仰之情，遂下载了一本“待补充”的《郑渊洁童话全集》开始拜读。 虽已工作一载有余，但仍自认为“童心未泯”，暂且忘记工作的压力、生活上的不如意，进入郑叔叔的童话世界中，这简直就是一种享受。...</description></item><item><title>汇编之路-栈操作与栈帧</title><link>https://tonybai.com/2005/11/13/assembly-series-stack-oper-and-frame/</link><pubDate>Sun, 13 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/13/assembly-series-stack-oper-and-frame/</guid><description>结构化程序的一个最基本的单元就是“函数”或者叫“过程”。在汇编这一层自然也相应的有支持这些概念的指令操作，如栈操作和栈帧的概念。 首先这里要为“打开汇编之门”那篇blog补充一点的是：汇编语言是与机器相关，这里的一切都是基于IA-32机器平台的。 1、寻址方式 我们已经知道在操作数表示中有一种是用来指示内存地址的内容的，在GNU Assembly中指示内存地址有多种方式，这些方式被统称“寻址方式”...</description></item><item><title>打开汇编之门</title><link>https://tonybai.com/2005/11/12/open-the-gate-to-assembly-language/</link><pubDate>Sat, 12 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/12/open-the-gate-to-assembly-language/</guid><description>工作这么长时间，一直在C语言这一层面上钻研和打拼，日积月累，很多关于C的疑惑在书本和资料中都难以找到答案。程序员是追求完美的一个种群，其头脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁。不久前在itput论坛上偶得《Computer Systems A Programmer&amp;#39;s Perspective》（以下称CSAPP）这本经典好书，遂连夜拜读以求解惑。虽说书中没有能正面的回答我的一些疑惑，但是...</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>再说内存</title><link>https://tonybai.com/2005/11/02/talk-about-memory-again/</link><pubDate>Wed, 02 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/02/talk-about-memory-again/</guid><description>离我的上一篇BLOG已经时隔一个月有余，项目忙是一方面原因，最主要的还是自己没什么“收获”。在最近的项目中总是和内存打交道，时间长了，便有了些许问题，原本我就不是不求甚解者，遂趁此机会又复习了些内存相关资料。 其实下面的话题都是源于在实际项目中碰到的问题，我们通过推敲一句话来开始吧! 1、推敲一句话 在《C专家编程》一书中，有这样的说法“Malloced memory is always alig...</description></item><item><title>也谈字节序问题</title><link>https://tonybai.com/2005/09/28/also-talk-about-byte-order/</link><pubDate>Wed, 28 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/28/also-talk-about-byte-order/</guid><description>一次Sun SPARC到Intel X86的平台移植让我们的程序遭遇了“字节序问题”，既然遇到了也就不妨深入的学习一下。 一、字节序定义 字节序，顾名思义字节的顺序，再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。 其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。 在所有的介绍字节序的...</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>解疑sigsuspend</title><link>https://tonybai.com/2005/09/22/understand-sigsuspend/</link><pubDate>Thu, 22 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/22/understand-sigsuspend/</guid><description>Unix提供了等待信号的系统调用，sigsuspend就是其中一个，在CU(www.chinaunix.net)上曾经讨论过一个关于该系统调用的问题，这里也做一下解疑。 CU网友讨论的问题的核心就是到底sigsuspend先返回还是signal handler先返回。这个问题Stevens在《Unix环境高级编程》一书中是如是回答的“If a signal is caught and if the...</description></item><item><title>理解Zombie和Daemon Process</title><link>https://tonybai.com/2005/09/21/understand-zombie-and-daemon-process/</link><pubDate>Wed, 21 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/21/understand-zombie-and-daemon-process/</guid><description>潜水于CU(www.chinaunix.net)，看到了大家对Zombie Process和Daemon Process的理解，同样也意识到以前自己对这两个概念理解的偏颇，想在这篇Blog中将之纠正。 一、Zombie Process Zombie Process，译成中文为僵尸进程，以前我一直认为父进程先结束，子进程就变成了僵尸进程，事实上这与正确的理解恰恰相反，真惭愧，只是从字面理解了而并未深...</description></item><item><title>改格</title><link>https://tonybai.com/2005/09/19/change-image/</link><pubDate>Mon, 19 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/19/change-image/</guid><description>又是一年中秋节，大街小巷弥漫着月饼的味道和喜庆的气氛，发现现在中秋的一个特点就是“月饼贼贵，人还排队(买)”，看来中国人民的生活水平真是提高了。这是我在沈城过的第二个中秋，对于有GF的我中秋节意味着“大出血”，所以今天在沈阳最繁华的商业街上你要是细心观察的话准会发现我们的身影(如果你真的这么做的话，你就应该到医院看医生了:)，小心现在医院贼宰人哟，先看看钱袋里是否带足钱了再说)。不过今年中秋有一个...</description></item><item><title>理解dup和dup2</title><link>https://tonybai.com/2005/09/19/understand-dup-and-dup2/</link><pubDate>Mon, 19 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/19/understand-dup-and-dup2/</guid><description>看到ChinaUnix(CU)上的一个帖子后，觉得自己对dup和dup2特别是后者的理解还是有欠缺的，这两个接口看起来很简单，但是理解起来也真的并不是那么容易。 相信大部分在Unix/Linux下编程的程序员手头上都有《Unix环境高级编程》(APUE)这本超级经典巨著。作者在该书中讲解dup/dup2之前曾经讲过“文件共享”，这对理解dup/dup2还是很有帮助的。这里做简单摘录以备在后面的分析...</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>理解ASCII码</title><link>https://tonybai.com/2005/09/11/learn-ascii/</link><pubDate>Sun, 11 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/11/learn-ascii/</guid><description>最近在写一个串口程序，设备提供商的通讯协议说明中明确了内部通讯方式为“ASCII码”。其实每个和计算机打交道的人都会天天接触ASCII码，只是ASCII码藏在了幕后，我们很少与之正面打交道罢了，这次机会正好让我有机会到幕后去看看ASCII码的“庐山真面目”。 ASCII码众所周知全称为“美国信息交换标准码，American Standard Code for Information Interch...</description></item><item><title>我还健康</title><link>https://tonybai.com/2005/09/08/i-am-still-healthy/</link><pubDate>Thu, 08 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/08/i-am-still-healthy/</guid><description>谈到程序员似乎总是离不开“健康”这个话题，程序员是职业病的高发群体，一般工作2-3年的程序员或多或少的都有“小疾”。每个正规的公司每年都应有至少一次的“福利体检”。今天是我第一次参加公司的福利体检，入司时参加过体检，由于大学刚毕业，自然很自信身体没问题。在公司度过一年的时光后，也道听途说的知道一些说法，比如“某某人工作一年得高血压、脂肪肝”等，这给我这次体检带来了一丝悬念，自己也在担心我现在的身体...</description></item><item><title>APR源代码分析-内存篇</title><link>https://tonybai.com/2005/09/07/apr-memory-management/</link><pubDate>Wed, 07 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/07/apr-memory-management/</guid><description>内存管理一直是让C程序员头痛的问题，作为一个通用接口集，APR当然也提供其自己的内存管理接口–APR Pool。APR Pool作为整个APR的一个基础功能接口，直接影响着APR的设计风格。在这篇Blog中，我们就要和APR Pool来一次“亲密接触”。(还是以Unix平台实现为例) APR Pool源代码的位置在$(APR\_HOME)/memory目录下，本篇blog着重分析unix子目录下的...</description></item><item><title>APR源代码分析-进程篇</title><link>https://tonybai.com/2005/09/01/apr-process-management/</link><pubDate>Thu, 01 Sep 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/09/01/apr-process-management/</guid><description>Apache Server的进程调度一直为人所称道，Apache 2.0推出的APR对进程进行了封装，特别是Apache 2.0的MPM(Multiple Process Management)框架就是以APR封装的进程为基础的，下面就让我们一起来探索一下APR的进程封装吧(以Unix平台为例)。 APR进程封装源代码的位置在$(APR\_HOME)/threadproc目录下，本篇blog着重分...</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>走马观花ANSI C标准-类型表示</title><link>https://tonybai.com/2005/08/19/c-standard-overview-type-representation/</link><pubDate>Fri, 19 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/19/c-standard-overview-type-representation/</guid><description>类型表示(representation of types) 1、一般规则 a) 除了位域(bit field)之外的对象都是由一个或多个相邻序列字节组成的，这些字节的个数(number)、次序(order)和编码方式或是显式说明的，或是实现定义的。 b) 存储在非符号位域(unsigned bit field)和unsigned char类型对象中的值应该用纯二进制表示(pure binary n...</description></item><item><title>分析“参数传递”</title><link>https://tonybai.com/2005/08/12/analysis-on-args-passing/</link><pubDate>Fri, 12 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/12/analysis-on-args-passing/</guid><description>翻看以前的一次jjhou的“高阶C”课程的ppt，突然想到今天指导新员工时，她犯的关于参数传递方面的错误，就想简单分析一下。 一、现象和经验 规则：任何时候你想在函数内修改某个外面的变量值，并影响Caller，你应该传递该变量的地址进去。如果是指针变量，也不例外。 a) 反例1 void test(int a) {  a = a + 10; } int main() {  int cnt = 0;...</description></item><item><title>七夕感悟</title><link>https://tonybai.com/2005/08/11/thought-on-chinese-valentine-day/</link><pubDate>Thu, 11 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/11/thought-on-chinese-valentine-day/</guid><description>今天是牛郎和织女见面的日子，而我的织女因学校放假早已回家去了，剩下我这个孤独的牛郎只能“胡思乱想”，遂有了这篇blog。^\_^ 感悟一：今早早起，翻来覆去睡不着，想起昨晚和一大学哥们的谈话，他曾经和老外交流过，老外的想法是“中国人总是把自己的一辈子都想好，然后在按部就班的去工作生活；老外则是走一步算一步。”，对照自己最近的想法，好像有些不谋而合，这个老外挺有思想。 感悟二：继续翻来覆去，突然想到...</description></item><item><title>C复杂声明解析</title><link>https://tonybai.com/2005/08/09/an-explanation-of-complex-c-declaration/</link><pubDate>Tue, 09 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/09/an-explanation-of-complex-c-declaration/</guid><description>部门最近在进行C培训，由于有一个新员工需要我来指导，所以看了一下培训用的ppt，了解一下新员工的学习进度，恰看到ppt中有关“如何读懂复杂C声明”的章节。遂想起来自己在看《C专家编程》时，这块儿看得并不是很深刻，万一新员工问到我这块儿…，我不能打没有准备之仗，遂恶补之。 复杂的C声明一般被认为不是很好的编程习惯，当然也就不推荐使用。但是在读很多前辈遗留的代码时，又不得不面对这一问题。知道总比不知道...</description></item><item><title>也谈内存对齐</title><link>https://tonybai.com/2005/08/09/also-talk-about-memory-alignment/</link><pubDate>Tue, 09 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/09/also-talk-about-memory-alignment/</guid><description>在最近的项目中，我们涉及到了“内存对齐”技术。对于大部分程序员来说，“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活，太强大，它允许你干预“内存对齐”。如果你想了解更加底层的秘密，“内存对齐”对你就不应该再透明了。 一、内存对齐的原因 大部分的参考资料都是如是说的： 1、平台原因(移...</description></item><item><title>走马观花ANSI C标准-类型</title><link>https://tonybai.com/2005/08/06/c-standard-overview-type/</link><pubDate>Sat, 06 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/06/c-standard-overview-type/</guid><description>类型(type) 1、类型分为：    a) object type — types that fully describe objects    b) function type — types that describe functions    c) uncomplete type — types that describe objects but lack information need...</description></item><item><title>走马观花ANSI C标准-标识符</title><link>https://tonybai.com/2005/08/05/c-standard-overview-identifier/</link><pubDate>Fri, 05 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/05/c-standard-overview-identifier/</guid><description>标识符(identifier) 1、一个标识符可以表示: a) 对象(object) b) 函数(function) c) 结构体(struct)的标签(Tag)\[注1] d) 结构体的成员 e) 联合体(union)或枚举类型(enumeration) f) 类型别名(typedef) g) 标签(label) h) 宏(macro) i) 宏参数(macro parameter) 同一个标识...</description></item><item><title>走马观花ANSI C标准-环境</title><link>https://tonybai.com/2005/08/04/c-standard-overview-envi/</link><pubDate>Thu, 04 Aug 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/08/04/c-standard-overview-envi/</guid><description>标准都是条条框框的，以严谨著称，语言晦涩难懂。这也是大多数人不愿意“接近”它的原因。但它吸引我的最重要原因恰恰是“标准”二字，我觉得我能从这个标准中找到一些“闪光点”，而这些“闪光点”又恰恰是能让我有所提高的地方。 1、翻译环境 C Source文件是以文本形式存在的，将之转变成可执行程序的过程，我们管之叫“翻译”。C语言的翻译不是一蹴而就的，一般需要两遍才能达到目的，第一遍称为“预处理”，预处理...</description></item><item><title>走马观花ANSI C标准-介绍</title><link>https://tonybai.com/2005/07/28/introduction-on-c-standard-overview-series/</link><pubDate>Thu, 28 Jul 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/07/28/introduction-on-c-standard-overview-series/</guid><description>大部分的关于C的著作都提到ANSI C Standard，但我相信少有C程序员真正细致阅读过ANSI C标准(当然了对于作C编译器的程序员来说这个标准肯定是烂熟于胸了^\_^),在这个系列的文章中我将和大家一起浏览一下ANSI C标准(C99，以下称标准)，呵呵，当然也不能面面俱到，只是“走马观花”。 1\. 什么是“标准”（这里指编程语言标准） 按照comp.lang.c的C FAQ的意思:“标...</description></item><item><title>C程序员之“痛”</title><link>https://tonybai.com/2005/07/20/pain-of-c-programmer/</link><pubDate>Wed, 20 Jul 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/07/20/pain-of-c-programmer/</guid><description>内存问题是C程序员永久的话题，也是最能让C程序员心痛的话题。内存bug即隐秘，危害又大，而且往往当你解决了它之后，你会发现你的错误是多么的低级。以我为例，看下面的两个case: CASE1 背景: 配置信息读取 Bug现象: 通过打印语句观察到，在配置读取中间时刻，某一指针突然被置为NULL，出core。 耗时: 6小时 问题所在及分析: 经过6小时的不懈努力，终于发现了这一让我哭笑不得的低级错误...</description></item><item><title>重操旧业</title><link>https://tonybai.com/2005/07/17/resume-my-old-profession/</link><pubDate>Sun, 17 Jul 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/07/17/resume-my-old-profession/</guid><description>2005年7月8日是我入司一周年纪念日，本想写篇Blog纪念一下，可是思维的小溪总是难以汇聚成大江大河，始终觉得无话可说，再加之最近的项目十分紧迫，So我放弃了。这周末公司去海边旅游放松，带着一身的疲惫回来后，坐在电脑前，突然觉得该写些东西了 纵然C语言是我通往软件开发世界的领路人，但曾经(大二)一度认为C已经是明日黄花，之后便不再认真钻研之。入司被分到C组，平时开发的方式和大部分刚入司的新员工一...</description></item><item><title>同步问题讨论-Tony与Alex的对话系列</title><link>https://tonybai.com/2005/06/09/tony-alex-dialog-on-synchronization/</link><pubDate>Thu, 09 Jun 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/06/09/tony-alex-dialog-on-synchronization/</guid><description>Alex正在电脑前面作冥思苦想状，这时Tony悄悄地走到Alex的身后，观察了一会儿… Tony : 看来今天我们要讨论同步问题了。 Alex : （惊奇地回头）。Hey Man , you scared me! 你说的没错，我正在学习同步这一块儿呢，有什么高见不妨说出来吧，我洗耳恭听！ Tony : 不敢不敢。关于进程和线程同步的问题，W. Richard Stevens在他的那本经典的“UNI...</description></item><item><title>从技术到管理的对话-Tony与Alex的对话系列</title><link>https://tonybai.com/2005/06/05/tony-alex-dialog-on-from-tech-to-management/</link><pubDate>Sun, 05 Jun 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/06/05/tony-alex-dialog-on-from-tech-to-management/</guid><description>5月末我参加了一次“从技术到管理的”培训，总体来说还是有所收获的。这段时间我一直想把自己的收获总结出来与大家分享，但是也一直没找到一个很好的形式来表达，我想简单的罗列一些规则和技巧是最最乏味的。在我的“关于Tony与Alex的对话系列的一点说明”一文中曾经将“Tony与Alex对话系列”定位为技术类的系列文章，但是经过这几天的思考，发现它同样可以用做管理知识起码是技术管理知识的介绍，这篇Blog将...</description></item><item><title>CppUnit入门实践-Tony与Alex的对话系列</title><link>https://tonybai.com/2005/05/30/tony-alex-dialog-on-cppunit-introduction/</link><pubDate>Mon, 30 May 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/05/30/tony-alex-dialog-on-cppunit-introduction/</guid><description>Tony : Hi Alex ! you just looks like drowing in your project. what is up? Alex : 我们的项目要求引入单元测试，but i&amp;#39;ve no experience in unit test. Tony : i think cppunit is your best choice. Alex : 是的，我刚从网上把它down了下来...</description></item><item><title>关于Tony与Alex的对话系列的一点说明</title><link>https://tonybai.com/2005/05/24/an-introduction-on-tony-alex-dialog-series/</link><pubDate>Tue, 24 May 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/05/24/an-introduction-on-tony-alex-dialog-series/</guid><description>相信这种形式的小品文大家看到过一些，其中很有名的有“Solmyr和Zero的故事”，如果没记错的话，那个系列文章记录的是两个人Solmyr和Zero之间的技术交流过程，而据说Solmyr和Zero在真实世界中都是有原型的\[注1]。对比起Zero的故事系列，我的文章中语言不免有些干涩，形式过于拘泥，呵呵。不过刚开始么，我会一点点地改进的。我的小品文系列与“Zero的故事系列”最大的不同是它仅是记录...</description></item><item><title>一个C++项目的Makefile编写-Tony与Alex的对话系列</title><link>https://tonybai.com/2005/05/23/tony-alex-dialog-on-write-makefile-for-cpp-project/</link><pubDate>Mon, 23 May 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/05/23/tony-alex-dialog-on-write-makefile-for-cpp-project/</guid><description>Tony : Hey Alex, How are you doing? Alex : 不怎么样。(显得很消沉的样子) Tony : Oh , Really ? What is the matter? Alex : 事情是这样的。最近有一个Unix下的C++项目要求我独自完成，以前都是跟着别人做，现在让自己独立完成，还真是不知道该怎么办，就连一个最简单的项目的Makefile都搞不定。昨晚看了一晚上...</description></item><item><title>一个Xml Parser的TDD开发过程-Tony与Alex的对话系列</title><link>https://tonybai.com/2005/04/30/tony-alex-dialog-on-implement-xmlparser-using-tdd/</link><pubDate>Sat, 30 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/30/tony-alex-dialog-on-implement-xmlparser-using-tdd/</guid><description>Tony : Alex今天我们来做一个xml parser.我们使用的开发工具为Eclipse + JUnit Alex : 好啊，喜欢接受挑战。 Tony : 先看看我们要解析的xml file的样子:                     使用XmlSpy自动生成其DTD如下： &amp;amp;lt;!ATTLIST test   name CDATA #REQUIRED &amp;amp;gt; &amp;amp;lt;!ATTLIS...</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>My first knowledge share</title><link>https://tonybai.com/2005/04/19/my-first-knowledge-share/</link><pubDate>Tue, 19 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/19/my-first-knowledge-share/</guid><description>第一次和大家分享知识的时间可以说比我预计的要“晚”，也可以说比我预计的要“早”。解释一下，之所以说“晚”，是因为我自己曾经准备了多个“topic”,但是总是感觉时机不成熟儿没能成行；之所以说“早”，是因为我决心要share的那个topic准备的还不够成熟。 这次share被定在五一前，由于我觉得那个topic准备的还不够成熟，或者说是我能让我满意。也许可能还是我那个追求完美的心理在作祟。有一句谚语...</description></item><item><title>闲说“招式”与“内功”</title><link>https://tonybai.com/2005/04/18/thoughts-about-different-kungfu/</link><pubDate>Mon, 18 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/18/thoughts-about-different-kungfu/</guid><description>昨天下班时，偶然间听到同事说“同样使用太祖长拳，为什么乔峰使出来的威力就那么大”，起初，只当作一句笑话，并未多想。今天早上在班车上的时候，突然想到了这件事，深思了一会儿，突然觉得其中还是蕴含着些许道理的。 看过“天龙八部”这部电视剧或同名武侠小说的人都知道，乔峰的内功是极其精湛的，在书中除了那个“无名老僧”之外，能和乔峰内功媲美的估计是凤毛麟角了。之所以乔峰使用的“太祖长拳”威力无穷就是得益于其精...</description></item><item><title>微软又推出新语言了</title><link>https://tonybai.com/2005/04/15/microsoft-publish-new-language/</link><pubDate>Fri, 15 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/15/microsoft-publish-new-language/</guid><description>微软又推出新语言了！最近在csdn上围绕着C-Omega和G#的话题有很多。每当我们看到一门新语言诞生时，特别是诞生在微软这样的软件帝国中，很多人都会冒出一身冷汗并大喊“Oh,My God! How fast the technology is going, I can not catch it up!” after that they still have to learn these new ...</description></item><item><title>又一个“孔乙己”吗</title><link>https://tonybai.com/2005/04/08/another-kongyiji/</link><pubDate>Fri, 08 Apr 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/04/08/another-kongyiji/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</description></item><item><title>动态代理再思考</title><link>https://tonybai.com/2005/03/25/thoughts-on-dynamic-proxy/</link><pubDate>Fri, 25 Mar 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/03/25/thoughts-on-dynamic-proxy/</guid><description>看了透明发表在《程序员》杂志2005年第一期上的“动态代理的前世今生”，让我不仅了解了“动态代理”这门技术，更让我知道了一段Java技术的发展史。带着对Rickard Oberg的钦佩之情，怀着对Rod Johnson敬仰之义我踏上了动态代理再思考之路。 **\[****关键词\]** 代理(proxy) 基础设施(infrastructure) 业务组件(business component) ...</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><item><title>关注，AOP</title><link>https://tonybai.com/2005/01/28/focus-aop/</link><pubDate>Fri, 28 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/28/focus-aop/</guid><description>AOP的核心概念是关注点，我开始关注AOP。 一、Why AOP? a) AOP一般观点 一般在开发系统时，我们可以大致的把系统的需求分类为核心模块级需求和系统级需求。很多系统级需求一般来说是相互独立的，但它们一般都会横切许多核心级模块。以一个电信领域的短信网关系统为例，系统的核心级需求是短信的收发，话单处理等，而其系统级的需求包括日志，校验以及性能问题等。像日志这种系统级的需求就横切短信收发、话...</description></item><item><title>Hello，AOP</title><link>https://tonybai.com/2005/01/22/hello-aop/</link><pubDate>Sat, 22 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/22/hello-aop/</guid><description>论坛上有人评价Java在过去的2004有两大值得称赞的技术发展，一个是Java在IOC模式上的成熟应用，再就是Java的AOP框架。 一、好消息 2005年一月份传来好消息，AspectJ与AspectWerkz合力打造AOP框架，两个开发团队将合力开发一个全新的面向方面编程（Aspect-Oriented Programming，AOP）平台，在其中融合双方的长处和经验。这两家都是业界重要的开源...</description></item><item><title>Build ArgoUML and AndroMDA</title><link>https://tonybai.com/2005/01/19/build-argouml-and-andromda/</link><pubDate>Wed, 19 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/19/build-argouml-and-andromda/</guid><description>由于Dominoo近期策略的改变，所以我开始关注和研究UML和MDA领域较为出名的开源项目。我准备先拿ArgoUML和AndroMDA“开刀”。 \* ArgoUML 简介：ArgoUML is a modelling tool that helps you do your design using UML and it is the winner of 13th annual productiv...</description></item><item><title>Dominoo项目日记(四)</title><link>https://tonybai.com/2005/01/17/dominoo-notes-part4/</link><pubDate>Mon, 17 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/17/dominoo-notes-part4/</guid><description>大家都是对软件充满无限激情的人，大家都致力于能开发出能被大家所广泛接受和使用的软件。可是激情归激情，我们还得脚踏实地。项目遇到了障碍，我们需要改变思路。 从04年的12月末到现在，大家好像都不约而同地沉寂了下来，好像大家都累了或者都在反思着某些事情，大家好像都有一个感觉就是我们对我们所要做的并不是那么的熟悉和了解。我们并不能详细而又清晰的勾勒出我们要做的东西的轮廓。想象一下一个没有吃过“葱烧海参”...</description></item><item><title>深入Java底层</title><link>https://tonybai.com/2005/01/16/deep_into_java/</link><pubDate>Sun, 16 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/16/deep_into_java/</guid><description>在一个朋友的书架上发现王森著的《Java深度历险》一书，看了书的前言了解该书是关于Java底层技术内幕的。怀着好奇心浏览了一下，谈不上有太多收获，但也记下了一些自认为有益的两点。 \* Java xxx 我们在命令行下敲入：“java xxx”后会发生什么呢？ 流程如下： 1.找到JRE； 2.找到JVM.dll； 3.启动JVM，并进行初始化； 4.产生Bootstrap Loader； 5.载...</description></item><item><title>饮水机的加热保护</title><link>https://tonybai.com/2005/01/16/heating-protection-of-water-dispenser/</link><pubDate>Sun, 16 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/16/heating-protection-of-water-dispenser/</guid><description>小小饮水机，里面也有值得思考的东西。 \* 起因 昨晚回到寝室感到口渴，顺手按下了门旁饮水机的加热开关，到洗漱间洗了把脸，拿着水杯出来接水，看到加热灯已经变成绿色（我们的饮水机的加热指示灯在加热过程中是红色的，加热结束后会变成绿色，我想大多数饮水机都是这样的）我就按下热水出水开关接热水，可是却不见热水流出，这时我才注意到原来水桶里已经没水了。当时想的是这样无水加热会不会烧坏饮水机，恰好旁边有一装满...</description></item><item><title>Mix-in in Ruby</title><link>https://tonybai.com/2005/01/12/mix-in-in-ruby/</link><pubDate>Wed, 12 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/12/mix-in-in-ruby/</guid><description>在Matz的一篇PPT“Object-Oriented scripting in Ruby”中，Matz提到Ruby提供一种语言机制Mix-in，在其PPT中如是描述的“No Multiple Inheritance，but Mix-in”、“Mix-in is as strong as multiple inheritance，but simple”。 \* “module” in Ruby 在...</description></item><item><title>开放与封闭</title><link>https://tonybai.com/2005/01/09/open-and-close/</link><pubDate>Sun, 09 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/09/open-and-close/</guid><description>敏捷设计最基本原则：“开放封闭原则（OCP，Open-Close Principle）” \* 回顾SRP 在开始谈OCP之前，我们还是简单回顾一下Bob大叔在其书中所论述的敏捷设计的第一个原则“单一职责原则（SRP，Single Responsibility Principle）”。 Bob大叔在其书中将职责理解为“变化的原因”。一般当需求变化时，该变化就会反映为类的职责的变化。按书中所述“如果...</description></item><item><title>由一段话想到的</title><link>https://tonybai.com/2005/01/09/thoughts-by-some-words/</link><pubDate>Sun, 09 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/09/thoughts-by-some-words/</guid><description>在Java视线论坛的Python/Zope版，浏览了管理员robbin发的题目为“我眼中的Python”的帖子，感触颇深。 Robbin如是说：“做为一种严谨的，编译式的，面向对象语言，Java总是给我一种须正襟危坐，须一板一眼的按照OOAD的规则编程，才敢在键盘上敲下字符的感觉。即使编写一个最小规模的程序，我也不能够接受把所有的code塞到main里面的做法。Java似乎以不怒自威的威严使我不敢...</description></item><item><title>另一种“所见即所得”</title><link>https://tonybai.com/2005/01/08/another_wysiwyg/</link><pubDate>Sat, 08 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/08/another_wysiwyg/</guid><description>最近一段时间，看了很多前沿性的资料，发觉在头脑中形成了很多“思维”的孤岛，这些孤岛很无序，我甚至不知道它们是什么时候的出现的，好像一夜间都浮出了“海平面”，我很难将它们连接起来。本篇blog中我想说的也是我一个思维孤岛的展现。 “What you see is what you get”-WYSIWYG 提到“所见即所得”我们就不能不提到它的发明人Charles Simonyi。 20世纪70年代...</description></item><item><title>拥抱敏捷</title><link>https://tonybai.com/2005/01/07/embrace-agile/</link><pubDate>Fri, 07 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/07/embrace-agile/</guid><description>虽说Bob大叔（Robert C.Martin）的《敏捷软件开发–原则、模式与实践》一书在china mainland出版已经有一年之久了，但是我真正专下心看这本书还是在最近。也许敏捷开发思想和我最初脑海中的软件开发思想有些背道而驰，但是现在我正在准备拥抱它。 \* 重温经典的“敏捷软件开发宣言” 宣言部分摘录如下： 个体与交互         胜过     过程和工具 可以工作的软件     胜...</description></item><item><title>Oolong and Gnoloo</title><link>https://tonybai.com/2005/01/06/oolong-and-gnoloo/</link><pubDate>Thu, 06 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/06/oolong-and-gnoloo/</guid><description>看到这两个单词，我的第一感觉就是怪。第一个单词读起来像是“乌龙”的音译，查查金山词霸，哇！真是“乌龙茶”的意思，而第二个单词我查了半天都找不到，我想可能是作者自创的词吧。 What is Oolong and Gnoloo? Oolong是一种为Java虚拟机定制的汇编语言，其作者为Joshua Engel，Gnoloo则是将.class文件转成Onlong语言的一种反汇编工具。引用Joshua ...</description></item><item><title>结识Ruby</title><link>https://tonybai.com/2005/01/05/learn-ruby/</link><pubDate>Wed, 05 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/05/learn-ruby/</guid><description>Ruby是一个很好听的名字，给我的感觉就是“可爱的”。但它不是什么宠物之类的东西，它是一门语言，一门面向对象的脚本语言。虽然它的作者是日本人，但是摒弃民族偏见，我们还是应该以欣赏的和科学的眼光来看待它。 一、Install Ruby 我们以最新发布的ruby-1.8.2为例： \* unix platform 到http://www.ruby-lang.org/en/ 下载文件ruby-1.8.2...</description></item><item><title>写在岁末</title><link>https://tonybai.com/2005/01/01/an-essay-at-the-end-of-year/</link><pubDate>Sat, 01 Jan 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/01/01/an-essay-at-the-end-of-year/</guid><description>在我写下这篇blog的时候，新年的钟声刚刚敲响，不知道此时我该做些什么，也许应该祈祷世界和平或是祈祷深受南亚东南亚海啸袭击的人能早日从悲伤中走出来，重建自己的家园。 在岁末的最后一天总结自己这一年的生活，我想用“生活”这个词还是能涵盖一切的。生活是包罗万象的，包括你的学习，你的工作，你的爱情，你的家庭。回顾我的已经过去的2004，有过考研落榜的剧痛，也有过重获爱情的甜蜜，品尝过工作上的得意和失落等...</description></item><item><title>再谈Mock Object</title><link>https://tonybai.com/2004/12/28/talk-about-mock-object-again/</link><pubDate>Tue, 28 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/28/talk-about-mock-object-again/</guid><description>发现静寂的夜能让我的思维加快。 用Mock Object进行Unit Test已经一周多了，发现以前对Mock Object还是很肤浅，即使是现在我也不敢说我对Mock Object的理解就一定正确。 这篇blog假设你已经熟悉JUnit、了解Mock和TDD。 如果你是直接开始使用JMock 、Easy Mock或者是MockMaker等Mock Object框架的，我建议你简单了解一下Mock...</description></item><item><title>写在工作时</title><link>https://tonybai.com/2004/12/27/an-essay-when-working/</link><pubDate>Mon, 27 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/27/an-essay-when-working/</guid><description>不知怎么的，我总是喜欢在工作的时候来完成我的blog，这也就是我这篇blog的题目来由。 享受完美妙的平安夜和快乐的圣诞节，又开始我新一天的工作。 北国寒冬，从寝室出来，道路上几乎不见行人，身上的热气不断逃离，寒气扑来，打了几个寒颤。心里想着今天的工作，脚下步伐却在不知不觉中加快。 来到温暖的办公区，打开outlook，看到一份来自远方好朋友的邮件，邮件中如是说“你的blog也不更新。看到梦想风暴...</description></item><item><title>JDK5.0源代码初览</title><link>https://tonybai.com/2004/12/15/glimpse-jdk5-source/</link><pubDate>Wed, 15 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/15/glimpse-jdk5-source/</guid><description>早就听说Sun开放了JDK的源代码，不过一直认为那么多源代码，根本没时间看，所以一直也没去下载。随着对Java了解的深入，览一览神秘的Java源代码的渴望是“与日俱增”，今天的工作不忙就去down了一份jdk5.0的源代码。 我是使用SCSL许可证下载的，解压后大约有190多MB。我最初的打算就是想看看java.lang包下一些类的实现。我吭哧吭哧的找了半天才在\\j2se\\src\\share...</description></item><item><title>认识Mock Object</title><link>https://tonybai.com/2004/12/10/learn-mock-object/</link><pubDate>Fri, 10 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/10/learn-mock-object/</guid><description>上周六我们Dominoo group讨论（以下称讨论）TDD和JUnit的时候，提到过Mock Object，那次可能是我第一次听到Mock Object这个概念，程序员对新鲜的的东西都是敏感的，所以今天晚上花了一些时间了解了一下Mock Object的概念，做了一些简单实践。 术语 Tested Object – 被测对象 Mock – 假的 or 仿制的对象 \* What is Mock O...</description></item><item><title>学习重构</title><link>https://tonybai.com/2004/12/09/learn-refactoring/</link><pubDate>Thu, 09 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/09/learn-refactoring/</guid><description>DMC采用驱动开发的方式，这就意味着重构“Refactoring”是我要学习的对象。早在大三的时候就已经把那本经典的“Refactoring Improving the Design of Existing Code”英文版买到手了，但就是在买回来后的第n天，它就被“打入冷宫”了。 \* What Is Refactoring? Refactoring is the art of safely i...</description></item><item><title>如何编写类中的setter和getter</title><link>https://tonybai.com/2004/12/08/how-implement-setter-and-getter/</link><pubDate>Wed, 08 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/08/how-implement-setter-and-getter/</guid><description>在effective java中有一item叫”保护性拷贝”，今天又看了许多部门里的代码，发现很多代码都与该item“相违”，晚上和toidi\_xu讨论这个问题有些收获。 Considering the following code: public class Box {         private int length;     public void setLength(int leng...</description></item><item><title>Dominoo项目日记(三)</title><link>https://tonybai.com/2004/12/06/dominoo-notes-part3/</link><pubDate>Mon, 06 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/06/dominoo-notes-part3/</guid><description>上周的主要工作是和toidi\_xu共同完成“把xml文件解析到java内存对象”的工作，但是一周下来发现我们的工作完成的并不好。 这周的前3天我一直在学习effective java，由于有java基础所以看起来也不是很费劲，自己也写了些小例子，之后由于周末要讨论tdd和junit所以我又花了近一天的时间来熟悉相关的资料。真正开始进入开发阶段是在周五的时候，我研究了一下dreamhead已经写的...</description></item><item><title>Effective Java阅读笔记-item异常</title><link>https://tonybai.com/2004/12/03/effective-java-notes-item-exception/</link><pubDate>Fri, 03 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/03/effective-java-notes-item-exception/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 39、只针对不正常的条件才使用异常 异常只应该被用于不正常的条件，它们永远不应该被用于正常的控制流。 40、对于可恢复的（recoverable conditions）使用被检查异常（checked exceptions）,对于程序错误(error)使...</description></item><item><title>Advanced CVS</title><link>https://tonybai.com/2004/12/02/advanced-cvs/</link><pubDate>Thu, 02 Dec 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/12/02/advanced-cvs/</guid><description>做了几个月的实际项目，感觉还是只用到CVS的皮毛，CVS中的高级功能比如create tag、create branch和merge等都未使用过。Dreamhead发过来一本”pragmatic version control-using CVS”，顺便do some practice and research on the advanced functions of CVS。 1、Tags、Br...</description></item><item><title>Effective Java阅读笔记-item18</title><link>https://tonybai.com/2004/11/30/effective-java-notes-item18/</link><pubDate>Tue, 30 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/30/effective-java-notes-item18/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 18、优先考虑静态成员类（static member class） 在C++的应用中我们很少使用嵌套类，我只在MFC和COM组件中遇到过这些，而且这些嵌套类被隐藏在应用背后，一般的应用中则很少使用。而在Java中嵌套类的应用还是要比在C++中多些。Ja...</description></item><item><title>Effective Java阅读笔记-item24、25、34</title><link>https://tonybai.com/2004/11/30/effective-java-notes-item24-item25-item34/</link><pubDate>Tue, 30 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/30/effective-java-notes-item24-item25-item34/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 24、需要时使用保护性拷贝 在学习这个item之前我们看看下面这段“危险的”代码（改编自书中例子）： Considering the following code: //Period.java import java.util.Date; public...</description></item><item><title>Effective Java阅读笔记-item13、14</title><link>https://tonybai.com/2004/11/29/effective-java-notes-item13-and-item14/</link><pubDate>Mon, 29 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/29/effective-java-notes-item13-and-item14/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 13、支持不变性（immutable） 我感觉我们只需记住书中列出的几条规则： 1\. 不要提供任何&amp;#34;可修改对象內容&amp;#34;的方法 2\. 保证没有可被子类override的方法 3\. 令所有field为 final 4\. 令所有field都是 priv...</description></item><item><title>Effective Java阅读笔记-item16</title><link>https://tonybai.com/2004/11/29/effective-java-notes-item16/</link><pubDate>Mon, 29 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/29/effective-java-notes-item16/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 16、接口优于抽象类 作者有一个观点就是: \* 接口是定义mixin(混合类型)的理想选择。 mixin的定义：一个类除了实现它的基本类型”primitive type”之外，还可以实现这个mixin类型，以表明它提供可供选择的行为，也就是说它允许将...</description></item><item><title>Dominoo项目日记(二)</title><link>https://tonybai.com/2004/11/27/dominoo-notes-part2/</link><pubDate>Sat, 27 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/27/dominoo-notes-part2/</guid><description>Dominoo项目从10月份启动到现在已有近2月，我们做了些工作，但是项目的进度缓慢也是我们几个人有目共睹的。针对前一阶段的工作上的不利局面，我们几个做了一次讨论。 最近两周的工作使我们的Dominoo有了很大进展，经过大家的讨论我们在一些技术问题上达成了共识。dreamhead建议我和toidi\_xu结对编程，并将dmc的XML解析的工作交给我们来做（毕竟我在java编程上还属于菜鸟级），而d...</description></item><item><title>Effective Java阅读笔记-item12</title><link>https://tonybai.com/2004/11/27/effective-java-notes-item12/</link><pubDate>Sat, 27 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/27/effective-java-notes-item12/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 从item12~item18讨论的都是单个类或接口的设计技术。 12、使类和成员的可访问能力最小化 作者提出“你应尽可能的是每一个类或成员不被外界访问” \* 顶层类或接口的访问级别   public — 意味着你的类是提供给客户API的一部分，你有义...</description></item><item><title>Effective Java阅读笔记-item4、6</title><link>https://tonybai.com/2004/11/27/effective-java-notes-item4-and-item6/</link><pubDate>Sat, 27 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/27/effective-java-notes-item4-and-item6/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 4、避免创建重复对象 我们知道构造函数每次被调用的时候都会创建一个新的对象，在有些情况下这样会很浪费。那我们能不能重复使用一个对象（这个对象应该是immutable的），而不是在每次需要的时候都要创建一个新的对象呢？这就是这个item4所要讲述的事情。...</description></item><item><title>Effective Java阅读笔记-item1</title><link>https://tonybai.com/2004/11/26/effective-java-notes-item1/</link><pubDate>Fri, 26 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/26/effective-java-notes-item1/</guid><description>Dreamhead把他用大把银子买来的“Effective Java”借给我阅读，我真是很感动亚，我只能用行动来感谢Dreamhead了。^\_^ 1、使用静态工厂方法代替构造函数 静态工厂方法优点： 可命名性：（而构造函数的名字必须和类名一致），使class使用起来较容易，构造函数只是根据不同的函数signature来区分，对使用者来说容易发生调用错误。 内部cache特性：在静态工厂内部可采用...</description></item><item><title>Everything is an object</title><link>https://tonybai.com/2004/11/22/everything-is-an-object/</link><pubDate>Mon, 22 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/22/everything-is-an-object/</guid><description>读过《Thinking in Java》中著名的一章“Everything is an object”，而且不止一遍,不过经过今天和Dreamhead的探讨，才发现我对Java中的“Everything is an object”的理解还是那么的不到位。 我和Dreamhead谈到我在研究Java 5.0时遇到的问题： String\[\] s = {“Hello” ,              ...</description></item><item><title>Java 5.0新特性研究(二)</title><link>https://tonybai.com/2004/11/22/java5-research-part2/</link><pubDate>Mon, 22 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/22/java5-research-part2/</guid><description>今天在“Java技术论坛”上看到了“J2se5.0新增小功能”这个帖子，大家的集思广益让我又有了一些收获。 1、再谈java引入的格式化输入和输出 在“Java 5.0新特性研究(一)”中，当时只是看了一些简单的例子，自己也没有深入看看jdk5.0的doc。今天看到论坛上的一些例子还是把我吸引了，自己又翻了翻昨天刚下的jdk5.0的doc，觉得java引入的新的格式化输入输出还是蛮好的^\_^。 ...</description></item><item><title>Java 5.0新特性研究(一)</title><link>https://tonybai.com/2004/11/19/java5-research-part1/</link><pubDate>Fri, 19 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/19/java5-research-part1/</guid><description>DreamHead计划使用&amp;#34;Java 5.0 Tiger&amp;#34;来开发我们的Dominoo，理由是：2-3年后&amp;#34;Tiger&amp;#34; will be mature。 我们对刚刚发布不久的&amp;#34;Tiger&amp;#34;了解的不多，晚上我们几个group member坐了下来，听DreamHead讲解&amp;#34;Tiger&amp;#34;的新特性。回到寝室自己做了些实验，有了些体会。 通过对&amp;#34;Tiger&amp;#34;的讨论和研究，得知Sun推出&amp;#34;Tiger&amp;#34;目的就是...</description></item><item><title>CVS Primer</title><link>https://tonybai.com/2004/11/17/cvs-primer/</link><pubDate>Wed, 17 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/17/cvs-primer/</guid><description>CVS Repository?  –&amp;gt; checkout(co)  –&amp;gt; commit(ci)  –&amp;gt; update(up) Repository vs Modules?    –Repository is the modules’s container    –Module is often a project Repository has four main parts :    –main ...</description></item><item><title>C++ Advanced Training(二)</title><link>https://tonybai.com/2004/11/12/cpp-advanced-training-part2/</link><pubDate>Fri, 12 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/12/cpp-advanced-training-part2/</guid><description>今天侯老师花了2个小节的时间把昨天的“尾巴”讲完，然后就进入今天的正题OOP，注意是OOP，not OOD。 听了侯老师的两天课，感觉他的讲课风格是： \- 关注细节 \- 以讲”故事”的方式来讲解抽象的技术。 我将继续接上一节的内容谈C++。 1、Increment operator（++） ++ operator分为 ++A 和A++两种，实际在实现中A++调用了++A。我们举个例子 clas...</description></item><item><title>C++ Advanced Training(一)</title><link>https://tonybai.com/2004/11/09/cpp-advanced-training-part1/</link><pubDate>Tue, 09 Nov 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/11/09/cpp-advanced-training-part1/</guid><description>作为一名刚来公司不久的新员工，有幸参加由侯捷老师做的高级C++培训，真的是很高兴。从接触Programming以来，C++一直是自己的主打语言(虽然最近正在研究Java^\_^)。一天的培训下来，收获还是蛮大的，侯老师的细致入微的讲解给我留下了很深的印象。将我所得到的东西与大家分享同时对我来说又是个复习的过程，不失为一箭双雕之举^\_^。 这次的高级C++培训分3个部分，分别为C++&amp;amp;ADT（一个...</description></item><item><title>本不是第一篇的第一篇</title><link>https://tonybai.com/2004/09/15/the-first-blog/</link><pubDate>Wed, 15 Sep 2004 00:00:00 +0800</pubDate><guid>https://tonybai.com/2004/09/15/the-first-blog/</guid><description>刚入司时，给我们做技术培训的老员工强烈向我们推荐blog这个新兴（起码对我来说是新的^\_^）的咚咚，当时也想写就申请了一个，可是不知一天都忙些什么了，到今天才写了这第一篇，要说今天为什么要写，两个字“心烦”，本来我的第一篇blog在我的头脑中早已构思多次了，内容也换了多次，可是都没能实现，这篇blog是在丝毫没想的前提下动手写的。我觉得这样也不错，现在我的感觉就是想写就写，不用考虑太多，呵呵。 ...</description></item></channel></rss>