<?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>C on Tony Bai</title><link>https://tonybai.com/tags/c/</link><description>Recent content in C on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Tue, 16 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/c/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么说“编译通过，就能运行”？Google 专家 Alice 揭秘 Rust 的工程美学与底层逻辑</title><link>https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic/</guid><description>本文永久链接 – https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic 大家好，我是Tony Bai。 在软件工程界，有一句流传甚广、近乎玄学的名言：“如果你的 Rust 代码通过了编译，那么它就已经可以正确运行了。” 对于被 Java 的空指针异常（NullP...</description></item><item><title>Linux 内核顶级维护者：写了 35 年 C，是 Rust 让我重新找回了编程的乐趣</title><link>https://tonybai.com/2026/06/13/linux-maintainer-greg-kh-switched-to-rust-after-35-years-of-c/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/13/linux-maintainer-greg-kh-switched-to-rust-after-35-years-of-c/</guid><description>本文永久链接 – https://tonybai.com/2026/06/13/linux-maintainer-greg-kh-switched-to-rust-after-35-years-of-c 大家好，我是Tony Bai。 在开源软件的宏大版图中，Linux 内核无疑是那座最古老、最庞大、也最不容有失的钢铁巨塔。它由数千万行 C 语言代码铸就，运行在世界上每一个数据中心、每一台智能手机...</description></item><item><title>拒领上亿、封杀 AI：Zig 之父为什么 10 年不发 1.0？</title><link>https://tonybai.com/2026/06/12/zig-father-refuses-funding-bans-ai-why-no-1-0-in-a-decade/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/12/zig-father-refuses-funding-bans-ai-why-no-1-0-in-a-decade/</guid><description>本文永久链接 – https://tonybai.com/2026/06/12/zig-father-refuses-funding-bans-ai-why-no-1-0-in-a-decade 大家好，我是Tony Bai。 在技术圈，有一门名为 **Zig** 的系统级编程语言，它没有铺天盖地的营销，没有背后财大气粗的金主干爹，甚至它的代码仓库在 2025 年末从 GitHub 直接“硬核跑路...</description></item><item><title>C++ 的权力游戏：一部关于妥协、背叛与重生的“史诗神剧”</title><link>https://tonybai.com/2026/06/10/the-story-of-cpp/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/10/the-story-of-cpp/</guid><description>本文永久链接 – https://tonybai.com/2026/06/10/the-story-of-cpp 大家好，我是Tony Bai。 如果将人类现代软件工业比作一部庞大的机器，那么支撑其运转的最核心骨架中，无疑很大一部分由**C++**支撑。从你手中的智能手机操作系统、每天刷的短视频推荐引擎、华尔街每秒百万次的高频交易系统，到驱动大语言模型（LLM）的底层算力矩阵，C++ 几乎无处不在...</description></item><item><title>大洗牌！Google 内部确认：Go 正取代 C++，成为 AI Agent 时代的“通用语言”</title><link>https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google/</link><pubDate>Thu, 21 May 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google/</guid><description>本文永久链接 – https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google 大家好，我是Tony Bai。 在过去的两年里，只要一提到 AI 开发，99% 的人脑海中弹出的第一个词绝对是：**Python**。而如果是涉及到大模型底层的高性能推理与算力压榨，大家想到的必然是 **C++** ...</description></item><item><title>AI 编码胜率榜：Go 与 Rust 完胜 C++</title><link>https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp/</link><pubDate>Wed, 20 May 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp/</guid><description>本文永久链接 – https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp 大家好，我是Tony Bai。 过去两年，程序员群体经历了一场前所未有的“职业身份危机”。 随着 GPT、Claude、Gemini 等模型的发布与能力更迭，各种“AI 几秒钟写出小游戏”、“AI 自动化修复 Bug”的新闻充...</description></item><item><title>别神话 Rust 重写了：搞定1%热路径，Go 性能照样起飞</title><link>https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites/</link><pubDate>Mon, 18 May 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites/</guid><description>本文永久链接 – https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites 大家好，我是Tony Bai。 近年来，如果你常年混迹于国内外各大技术社区，你一定会感受到一种近乎狂热的“政治正确”：**带垃圾回收（GC）的语言都有原罪，万物皆可（且应该）用 Rust 重写。** 从底层基础设施到上层业务逻...</description></item><item><title>C++ 社区内部大讨论：新特性到底是“生产力革命”，还是“叠加的复杂性”？</title><link>https://tonybai.com/2026/04/15/cpp-community-debate-productivity-revolution-vs-complexity/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/04/15/cpp-community-debate-productivity-revolution-vs-complexity/</guid><description>本文永久链接 – https://tonybai.com/2026/04/15/cpp-community-debate-productivity-revolution-vs-complexity 大家好，我是Tony Bai。 如果你把编程语言比作工具，Go 是一把极简的手术刀，精准且克制；Rust 是一套带智能传感器的外骨骼装甲，严苛且安全。 而 C++ 呢？它更像是一把在过去四十年里不断被加...</description></item><item><title>告别古法编程黄金时代：AI 时代不会再有新编程语言诞生的土壤</title><link>https://tonybai.com/2026/03/24/no-soil-for-new-programming-languages-in-ai-era/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/03/24/no-soil-for-new-programming-languages-in-ai-era/</guid><description>本文永久链接 – https://tonybai.com/2026/03/24/no-soil-for-new-programming-languages-in-ai-era 大家好，我是Tony Bai。 如果你回望过去十五年的软件工程史，那无疑是编程语言百花齐放的黄金时代。 为了对抗日益膨胀的系统复杂度，人类绞尽脑汁地发明新的“咒语”： Google 推出了 Go 语言，用极简的 Gorout...</description></item><item><title>硬核测评：哪门语言最受 AI 宠爱？13 种语言横向对比，Go 表现如何？</title><link>https://tonybai.com/2026/03/09/hardcore-review-13-languages-ai-favorite-go-performance/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/03/09/hardcore-review-13-languages-ai-favorite-go-performance/</guid><description>本文永久链接 – https://tonybai.com/2026/03/09/hardcore-review-13-languages-ai-favorite-go-performance 大家好，我是Tony Bai。 随着 Claude Code、Gemini Cli、Codex 等 AI 编程工具的全面普及，“让 AI 写代码”已经从极客的玩具变成了日常的生产力。随之而来的是一个触及灵魂的...</description></item><item><title>金融级基础设施重构：放弃 Rust 拥抱 Go，务实主义的最终胜利？</title><link>https://tonybai.com/2026/02/23/financial-infrastructure-rust-to-go-pragmatism-victory/</link><pubDate>Mon, 23 Feb 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/02/23/financial-infrastructure-rust-to-go-pragmatism-victory/</guid><description>本文永久链接 – https://tonybai.com/2026/02/23/financial-infrastructure-rust-to-go-pragmatism-victory 大家好，我是Tony Bai。 在系统级编程语言的版图上，Go 与 Rust 的对比与争论从未停歇。一个是崇尚大道至简、开发效率极高的“云原生时代王者”；另一个则是以内存安全、零成本抽象和极致性能著称的“极客新...</description></item><item><title>Go, Rust 还是 Zig？一场关于“简单”与“控制”的灵魂拷问</title><link>https://tonybai.com/2026/01/17/go-rust-zig-simplicity-vs-control/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/17/go-rust-zig-simplicity-vs-control/</guid><description>Go, Rust 还是 Zig？一场关于“简单”与“控制”的灵魂拷问 - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏...</description></item><item><title>Go 语言的“舒适区”：为何在这张“鄙视链”金字塔中，Go 仅次于 C？</title><link>https://tonybai.com/2026/01/07/go-language-comfort-zone-in-contempt-chain-pyramid/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/07/go-language-comfort-zone-in-contempt-chain-pyramid/</guid><description>本文永久链接 – https://tonybai.com/2026/01/07/go-language-comfort-zone-in-contempt-chain-pyramid 大家好，我是Tony Bai。 最近，一张“编程语言分级图”在技术社区引发大家热议。它没有参考 TIOBE 排名，也不看 GitHub Star 数，而是完全基于一种简单粗暴的价值观：**谁最不折腾人？** 在这张金字...</description></item><item><title>Go 考古：图灵奖得主 Ken Thompson 亲述，Go 语言是如何在 C++ 的“废墟”上诞生的</title><link>https://tonybai.com/2026/01/05/how-ken-thompson-developed-go-language-at-google/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/05/how-ken-thompson-developed-go-language-at-google/</guid><description>本文永久链接 – https://tonybai.com/2026/01/05/how-ken-thompson-developed-go-language-at-google. 大家好，我是Tony Bai。 为什么 Go 语言极其痛恨复杂的特性？为什么 Go 如此执着于编译速度？我们常说 Go 是一门“工程实用主义”的语言，它的设计哲学是“少即是多”。但你是否想过，这种近乎偏执的简洁，究竟是为...</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>“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈：Go 的诞生、演进与未来</title><link>https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future/</guid><description>本文永久链接 – https://tonybai.com/2025/12/10/russ-cox-interview-go-birth-evolution-future 大家好，我是Tony Bai。 他是 Go 语言的第二代掌门人，在长达十余年的时间里，引领着 Go 从一个内部实验项目，成长为云原生时代的霸主。他也是 Plan 9 的资深黑客，贝尔实验室精神的传承者。如今，他已将 Go 的帅印交...</description></item><item><title>看完《疯狂动物城2》，我发现“完美架构”的谎言被戳破了</title><link>https://tonybai.com/2025/12/07/zootopia-2-perfect-architecture-lie-exposed/</link><pubDate>Sun, 07 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/07/zootopia-2-perfect-architecture-lie-exposed/</guid><description>看完《疯狂动物城2》，我发现“完美架构”的谎言被戳破了 - 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/2025/12/06/zootopia-distributed-system-written-in-go/</link><pubDate>Sat, 06 Dec 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/12/06/zootopia-distributed-system-written-in-go/</guid><description>本文永久链接 – https://tonybai.com/2025/12/06/zootopia-distributed-system-written-in-go 大家好，我是Tony Bai。 **文章开始前，先给各位道个歉，今天的标题确实有点“党”。** 毕竟，非要说一个满是毛茸茸动物的动画片是用 Go 语言写的，这脑洞开得确实有点大。 但请原谅一个老程序员的“职业病”。 为了迎接本周末《疯狂...</description></item><item><title>为什么 Go 在悄悄地做 Rust 做不到的事：保持简单</title><link>https://tonybai.com/2025/11/21/why-go-is-quietly-doing-what-rust-couldnt-staying-simple/</link><pubDate>Fri, 21 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/21/why-go-is-quietly-doing-what-rust-couldnt-staying-simple/</guid><description>本文永久链接 – https://tonybai.com/2025/11/21/why-go-is-quietly-doing-what-rust-couldnt-staying-simple 大家好，我是Tony Bai。 近日，一篇题为《为什么 Zig 在悄悄地做 Rust 做不到的事：保持简单》的文章在开发者社区引发了热议。文章以其辛辣、富有煽动性的文风，将 Zig 描绘成 Rust 复杂性...</description></item><item><title>“学习 Go 毁掉了我钟爱的其他语言”：一场网络热议揭示 Go 开发者真正的爱与痛</title><link>https://tonybai.com/2025/11/11/go-developers-love-pain-online-debate/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/11/go-developers-love-pain-online-debate/</guid><description>本文永久链接 – https://tonybai.com/2025/11/11/go-developers-love-pain-online-debate 大家好，我是Tony Bai。 近日，一条开发者 Mario Verbelen 发布的推文——“学习 Go 毁掉了我钟爱的其他语言，但我不在乎。因为它真的太棒了。”——意外地在技术圈引起了一场关于 Go 语言的集中讨论。上百的开发者涌入评论区，...</description></item><item><title>Go GUI 开发的“绝境”与“破局”：2025 年现状与展望</title><link>https://tonybai.com/2025/11/03/go-gui-development-2025/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/03/go-gui-development-2025/</guid><description>本文永久链接 – https://tonybai.com/2025/11/03/go-gui-development-2025 大家好，我是Tony Bai。 “Go 语言能写桌面应用吗？” 这个问题，如同一个幽灵，常年盘旋在 Go 社区的上空。作为一门在后端、云原生和命令行工具领域所向披靡的语言，Go 在图形用户界面（GUI）开发上的“短板”，一直是其支持者心中一个难以言说的痛。 长期以来，Go...</description></item><item><title>Go GUI 开发的“绝境”与“破局”：2025 年现状与展望</title><link>https://tonybai.com/2025/11/03/go-gui-development-2025/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/03/go-gui-development-2025/</guid><description>本文永久链接 – https://tonybai.com/2025/11/03/go-gui-development-2025 大家好，我是Tony Bai。 “Go 语言能写桌面应用吗？” 这个问题，如同一个幽灵，常年盘旋在 Go 社区的上空。作为一门在后端、云原生和命令行工具领域所向披靡的语言，Go 在图形用户界面（GUI）开发上的“短板”，一直是其支持者心中一个难以言说的痛。 长期以来，Go...</description></item><item><title>告别懵圈：实战派 Gopher 的类型理论入门</title><link>https://tonybai.com/2025/10/30/type-theory-intro-for-gopher/</link><pubDate>Thu, 30 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/30/type-theory-intro-for-gopher/</guid><description>本文永久链接 – https://tonybai.com/2025/10/30/type-theory-intro-for-gopher 大家好，我是Tony Bai。 你是否曾有过这样的经历：在浏览一个关于 Go 泛型或接口设计的 GitHub issue 或技术提案时，评论区里的大佬们突然开始讨论 “Sum Type”、“Product Type”、“Parametric Polymorphi...</description></item><item><title>Go 语言观察：登顶“最受期待”榜首，JetBrains 2025报告洞悉未来趋势</title><link>https://tonybai.com/2025/10/23/go-language-leads-jetbrains-trends/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/23/go-language-leads-jetbrains-trends/</guid><description>本文永久链接 – https://tonybai.com/2025/10/23/go-language-leads-jetbrains-trends 大家好，我是Tony Bai。 近日，软件开发工具巨头 JetBrains 发布了其年2025度《开发者生态系统现状》报告，这份基于全球数万名开发者调研的数据报告，已成为洞察技术风向的关键参考之一。在今年的报告中，Go 语言的表现尤为亮眼，它不仅在“...</description></item><item><title>收到非 UTF-8 文本怎么办？Go 字符集检测的探索与实践</title><link>https://tonybai.com/2025/10/17/detect-charset-in-go/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/17/detect-charset-in-go/</guid><description>本文永久链接 – https://tonybai.com/2025/10/17/detect-charset-in-go 大家好，我是Tony Bai。 在上一篇关于 Go 语言 string 与 rune 设计哲学的文章发布后，我收到了许多精彩的反馈。其中，一位读者提出了一个极具现实意义的后续问题：“既然 Go 的世界以 UTF-8 为中心，那么当我们从外部系统（如老旧的文件、非标准的 API）...</description></item><item><title>Go 作为第一门编程语言：天才之选还是糟糕开端？</title><link>https://tonybai.com/2025/10/11/go-is-a-good-first-programming-language/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/11/go-is-a-good-first-programming-language/</guid><description>Go 作为第一门编程语言：天才之选还是糟糕开端？ - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * 文章列表 Go...</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>Azure CTO 深度解读：微软为何要用 Rust “替换” C/C++，又将如何用 AI 加速代码迁移？</title><link>https://tonybai.com/2025/09/11/microsoft-is-getting-rusty/</link><pubDate>Thu, 11 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/11/microsoft-is-getting-rusty/</guid><description>本文永久链接 – https://tonybai.com/2025/09/11/microsoft-is-getting-rusty 大家好，我是Tony Bai。 近日，微软 Azure CTO、技术巨擘 Mark Russinovich 在一场 Rust 技术会议上发表了闭幕演讲，以前所未有的坦诚和力度，揭示了微软内部正在进行的一场深刻的技术变革：全面拥抱 Rust，并战略性地替代 C/C++...</description></item><item><title>告别算法“天书”，Go程序员的学术伪代码“翻译”指南</title><link>https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide/</link><pubDate>Sat, 06 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide/</guid><description>本文永久链接 – https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide 大家好，我是Tony Bai。 你是否曾在阅读顶会论文时，感觉其中的算法描述像一本晦涩难懂的**“天书”**？那些看不太懂的数学符号、奇特的箭头和看似代码又无法编译的语句(如下图)，是不是常常让你望而却步，感叹理论与实践之间隔着一道鸿沟？ 别担心，...</description></item><item><title>Gopher直通大厂，就从这第一课开始！</title><link>https://tonybai.com/2025/09/03/gopher-first-lesson-to-big-factory/</link><pubDate>Wed, 03 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/03/gopher-first-lesson-to-big-factory/</guid><description>本文永久链接 – https://tonybai.com/2025/09/03/gopher-first-lesson-to-big-factory 大家好，我是Tony Bai。 很多计算机专业的同学们都在问：想进大厂，要先学好哪门编程语言？ 从应用广泛程度来说，学好Go语言肯定错不了！我们来看一下大厂们都用Go在做哪些开发： &amp;gt; 阿里用于基础服务、网关、容器、服务框架等开发。 &amp;gt; &amp;gt; &amp;gt; 字节...</description></item><item><title>Python简史：一个圣诞节的“私活”项目，如何改变了编程世界？</title><link>https://tonybai.com/2025/08/30/python-an-origin-story/</link><pubDate>Sat, 30 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/30/python-an-origin-story/</guid><description>本文永久链接 – https://tonybai.com/2025/08/30/python-an-origin-story 大家好，我是Tony Bai。 在编程语言的星空中，很少有哪颗星像Python一样，以如此温和而坚定的姿态，从一个不起眼的个人项目，成长为照亮地球未来的科技灯塔。如今，当我们谈论数据科学、人工智能时，Python几乎是绕不开的默认选项。但这一切的起点，竟源于一位程序员在阿姆...</description></item><item><title>告别性能猜谜：一份Go并发操作的成本层级清单</title><link>https://tonybai.com/2025/08/26/go-concurrency-cost-hierarchy/</link><pubDate>Tue, 26 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/26/go-concurrency-cost-hierarchy/</guid><description>本文永久链接 – https://tonybai.com/2025/08/26/go-concurrency-cost-hierarchy 大家好，我是Tony Bai。 Go语言的并发模型以其简洁直观著称，但这种简单性背后，隐藏着一个跨越五个数量级的巨大性能鸿沟。当你的高并发服务遭遇性能瓶颈时，你是否也曾陷入“性能猜谜”的困境：是sync.Mutex太慢？是atomic操作不够快？还是某个cha...</description></item><item><title>Go的“七宗罪”：一篇“Go依然不够好”如何引爆社区激辩？</title><link>https://tonybai.com/2025/08/25/go-is-still-not-good/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/25/go-is-still-not-good/</guid><description>本文永久链接 – https://tonybai.com/2025/08/25/go-is-still-not-good 大家好，我是Tony Bai。 在技术圈，平静的湖面下往往暗流涌动。对于Go语言社区而言，这股潜藏已久的暗流，被近期的一篇名为《Go is still not good》的博文彻底引爆。作者Thomas Habets，一位自称拥有超过十年Go使用经验的资深开发者，在他的这篇文章...</description></item><item><title>Rust 2025 深度解读：在十周年里程碑上，Niko Matsakis 如何擘画下一个时代的灵魂与蓝图？</title><link>https://tonybai.com/2025/08/19/rust-in-2025/</link><pubDate>Tue, 19 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/19/rust-in-2025/</guid><description>本文永久链接 – https://tonybai.com/2025/08/18/rust-in-2025 大家好，我是Tony Bai。 2025 年 5 月 15 日，Rust 语言迎来了其 1.0 版本发布的十周年纪念日。这是一个充满里程碑意义的时刻，不仅是对Rust过去十年辉煌成就的回顾，更是展望未来的关键节点。值此之际，Rust 语言团队负责人、核心开发者 Niko Matsakis 发表...</description></item><item><title>从“锁”到“channel”：开启你的Go并发心智模型转变之旅</title><link>https://tonybai.com/2025/08/05/go-concurrency-mental-model/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/05/go-concurrency-mental-model/</guid><description>从“锁”到“channel”：开启你的Go并发心智模型转变之旅 - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * ...</description></item><item><title>Go vs. Rust vs. C++：从语言规范长度看三种不同的“复杂性”</title><link>https://tonybai.com/2025/07/25/go-vs-rust-vs-cpp-in-complexity/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/25/go-vs-rust-vs-cpp-in-complexity/</guid><description>Go vs. Rust vs. C++：从语言规范长度看三种不同的“复杂性” - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的...</description></item><item><title>Rust 的安全神话？数据库 CEO 为何在关键系统中仍选 C++</title><link>https://tonybai.com/2025/07/22/cedardb-choose-cpp-rather-than-rust/</link><pubDate>Tue, 22 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/22/cedardb-choose-cpp-rather-than-rust/</guid><description>Rust 的安全神话？数据库 CEO 为何在关键系统中仍选 C++ - 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/2025/07/16/when-spaghetti-code-knocks/</link><pubDate>Wed, 16 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/16/when-spaghetti-code-knocks/</guid><description>本文永久链接 – https://tonybai.com/2025/07/16/when-spaghetti-code-knocks 大家好，我是Tony Bai。 最近，在网上看到一张关于编程语言的 Meme 图，它以一种黑色幽默的方式，精准地描绘了我们软件开发中一个永恒的敌人，以及 Go 语言那与众不同的应对之道。 在这张图中，一个名为“面条代码 (Spaghetti Code)”的恐怖死神，...</description></item><item><title>读懂Go的设计哲学：为什么说它是“恰到好处”的80/20语言？</title><link>https://tonybai.com/2025/07/05/go-is-8020-language/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/05/go-is-8020-language/</guid><description>读懂Go的设计哲学：为什么说它是“恰到好处”的80/20语言？ - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * ...</description></item><item><title>Twitch工程师的Go进阶之路：为何你写的Go代码，总感觉“不对劲”？</title><link>https://tonybai.com/2025/07/04/everything-i-did-to-become-an-expert-in-golang/</link><pubDate>Fri, 04 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/04/everything-i-did-to-become-an-expert-in-golang/</guid><description>本文永久链接 – https://tonybai.com/2025/07/04/everything-i-did-to-become-an-expert-in-golang 大家好，我是Tony Bai。 你是否也有过这样的时刻？ 你已经用 Go 写了不少代码，项目也能跑起来，但内心深处总有一种挥之不去的“别扭感”。你写的 Go 代码，看起来更像是“带有 Go 语法的 Java/Python”，充...</description></item><item><title>Go考古：创始人亲述Go语言的“创世纪”</title><link>https://tonybai.com/2025/07/03/meet-the-go-team-2012/</link><pubDate>Thu, 03 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/03/meet-the-go-team-2012/</guid><description>本文永久链接 – https://tonybai.com/2025/07/03/meet-the-go-team-2012 大家好，我是Tony Bai。 2012 年，Google I/O 大会的舞台上，一个刚刚发布 1.0 版本的编程语言团队，正襟危坐。他们面对着全球开发者的审视和提问，这其中，就有三位图灵奖得主级别的传奇人物：Ken Thompson、Rob Pike 和 Robert Gr...</description></item><item><title>当一切皆可用Python：Go这样的通用语言与DSL的未来价值何在？</title><link>https://tonybai.com/2025/06/19/language-design-in-the-era-of-llm/</link><pubDate>Thu, 19 Jun 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/06/19/language-design-in-the-era-of-llm/</guid><description>当一切皆可用Python：Go这样的通用语言与DSL的未来价值何在？ - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FA...</description></item><item><title>“骑手与大象”架构：超越微服务与单体之争的务实之道？</title><link>https://tonybai.com/2025/06/17/rider-elephant-arch/</link><pubDate>Tue, 17 Jun 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/06/17/rider-elephant-arch/</guid><description>“骑手与大象”架构：超越微服务与单体之争的务实之道？ - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 ...</description></item><item><title>Go还是Rust？2025年技术选型之辩</title><link>https://tonybai.com/2025/06/15/rust-vs-go-2025/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/06/15/rust-vs-go-2025/</guid><description>Go还是Rust？2025年技术选型之辩 - 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/2025/06/12/grog-brain-heaven/</link><pubDate>Thu, 12 Jun 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/06/12/grog-brain-heaven/</guid><description>爽就完了！Go语言的“简单之美”为何让开发者直呼过瘾？ - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我...</description></item><item><title>Java屹立30年，Go的“少年壮志”如何续写辉煌？——来自Java之父的“长寿秘诀”</title><link>https://tonybai.com/2025/05/17/java-at-30/</link><pubDate>Sat, 17 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/17/java-at-30/</guid><description>Java屹立30年，Go的“少年壮志”如何续写辉煌？——来自Java之父的“长寿秘诀” - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * ...</description></item><item><title>百万行依赖的“恐惧”：一位Rust开发者的深度反思与Go的启示</title><link>https://tonybai.com/2025/05/10/rust-dependencies-scare-me/</link><pubDate>Sat, 10 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/10/rust-dependencies-scare-me/</guid><description>百万行依赖的“恐惧”：一位Rust开发者的深度反思与Go的启示 - 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/2025/04/21/go-project-design-antipatterns/</link><pubDate>Mon, 21 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/21/go-project-design-antipatterns/</guid><description>Go项目设计的“七宗罪”？警惕那些流行的“反模式” - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 *...</description></item><item><title>11个现代Go特性：用gopls/modernize让你的代码焕然一新</title><link>https://tonybai.com/2025/04/15/embrace-modern-go-style-with-gopls-modernize/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/15/embrace-modern-go-style-with-gopls-modernize/</guid><description>本文永久链接 – https://tonybai.com/2025/04/15/embrace-modern-go-style-with-gopls-modernize 大家好，我是Tony Bai。 最近在思考Go语言的发展时，不禁让我想起了当年学习C++的经历。Bjarne Stroustrup在《C++程序设计语言（特别版）》中就专门强调了“现代 C++”（Modern C++）的编程风格，...</description></item><item><title>Anders Hejlsberg专访全文：TypeScript正在向Go移植</title><link>https://tonybai.com/2025/03/13/interview-with-anders-hejlsberg/</link><pubDate>Thu, 13 Mar 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/03/13/interview-with-anders-hejlsberg/</guid><description>本文永久链接 – https://tonybai.com/2025/03/13/interview-with-anders-hejlsberg 昨天发表了《Anders Hejlsberg亲自操刀向Go语言移植！TypeScript编译器性能狂飙10倍！》一文后，收到了许多读者的反馈，其中最高频的问题是：为什么不选择Rust？为什么不使用C#等其他语言？为了帮助大家更好地理解这次“技术事件”，我整...</description></item><item><title>Anders Hejlsberg谈TypeScript编译器向Go移植的实践与规划</title><link>https://tonybai.com/2025/03/12/typescript-native-port-to-go/</link><pubDate>Wed, 12 Mar 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/03/12/typescript-native-port-to-go/</guid><description>Anders Hejlsberg谈TypeScript编译器向Go移植的实践与规划 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go...</description></item><item><title>惊！Go在十亿次循环和百万任务中表现不如Java，究竟为何？</title><link>https://tonybai.com/2024/12/02/why-go-sucks/</link><pubDate>Mon, 02 Dec 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/12/02/why-go-sucks/</guid><description>本文永久链接 – https://tonybai.com/2024/12/02/why-go-sucks 编程语言比较的话题总是能吸引程序员的眼球！ 近期外网的两篇编程语言对比的文章在国内程序员圈里引起热议。一篇是由Ben Dicken (@BenjDicken) 做的语言性能测试，对比了十多种主流语言在执行10亿次循环(一个双层循环：1万 \* 10 万)的速度；另一篇则是一个名为hez2010...</description></item><item><title>Go map使用Swiss Table重新实现，性能最高提升近50%</title><link>https://tonybai.com/2024/11/14/go-map-use-swiss-table/</link><pubDate>Thu, 14 Nov 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/11/14/go-map-use-swiss-table/</guid><description>本文永久链接 – https://tonybai.com/2024/11/14/go-map-use-swiss-table 在2024月11月5日的Go compiler and runtime meeting notes中，我们注意到了一段重要内容，如下图红框所示： 这表明，来自字节的一位工程师在两年多前提出的“使用Swiss table重新实现Go map”的建议即将落地，目前该issue已...</description></item><item><title>Go编译的几个细节，连专家也要停下来想想</title><link>https://tonybai.com/2024/11/11/some-details-about-go-compilation/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/11/11/some-details-about-go-compilation/</guid><description>本文永久链接 – https://tonybai.com/2024/11/11/some-details-about-go-compilation 在Go开发中，编译相关的问题看似简单，但实则蕴含许多细节。有时，即使是Go专家也需要停下来，花时间思考答案或亲自验证。本文将通过几个具体问题，和大家一起探讨Go编译过程中的一些你可能之前未曾关注的细节。 &amp;gt; 注：本文示例使用的环境为Go 1.23.0、...</description></item><item><title>成为那个拿锤子的人</title><link>https://tonybai.com/2024/11/03/become-the-one-with-the-hammer/</link><pubDate>Sun, 03 Nov 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/11/03/become-the-one-with-the-hammer/</guid><description>成为那个拿锤子的人 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 成为那个拿锤子的人 ========= * 十一...</description></item><item><title>认知负荷对编程语言选择和学习的影响</title><link>https://tonybai.com/2024/10/24/cognitive-load-impact-on-programming-language-choice-and-study/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/10/24/cognitive-load-impact-on-programming-language-choice-and-study/</guid><description>认知负荷对编程语言选择和学习的影响 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 认知负荷对编程语言选择和学习的影...</description></item><item><title>“类型名称”在Go语言规范中的演变</title><link>https://tonybai.com/2024/09/24/the-evolution-of-type-name-in-go-spec/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/09/24/the-evolution-of-type-name-in-go-spec/</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/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>都2024年了，当初那个“Go，互联网时代的C语言”的预言成真了吗？</title><link>https://tonybai.com/2024/08/17/go-the-c-language-of-the-internet-era-come-true/</link><pubDate>Sat, 17 Aug 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/08/17/go-the-c-language-of-the-internet-era-come-true/</guid><description>都2024年了，当初那个“Go，互联网时代的C语言”的预言成真了吗？ | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表...</description></item><item><title>Gopher的Rust第一课：Rust的那些事儿</title><link>https://tonybai.com/2024/04/22/gopher-rust-first-lesson-all-about-rust/</link><pubDate>Mon, 22 Apr 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/04/22/gopher-rust-first-lesson-all-about-rust/</guid><description>本文永久链接 – https://tonybai.com/2024/04/22/gopher-rust-first-lesson-all-about-rust 要说这两年后端编程语言谁最火，Rust说自己第二，没人敢说第一。Rust连续8年霸榜stackoverflow最受推崇的编程语言，甚至被推特之父Jack Dorsey称为“完美的编程语言”： &amp;gt; 注：最火：仅代表人气最旺，最受欢迎，但并不代...</description></item><item><title>Go是一门面向对象编程语言吗</title><link>https://tonybai.com/2023/03/12/is-go-object-oriented/</link><pubDate>Sun, 12 Mar 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/03/12/is-go-object-oriented/</guid><description>本文永久链接 – https://tonybai.com/2023/03/12/is-go-object-oriented Go语言已经开源13年了，在近期TIOBE发布的2023年3月份的编程语言排行榜中，Go再次冲入前十，相较于Go在2022年底的排名提升了2个位次： 《Go语言第一课》专栏中关于Go在这两年开始飞起的“预言”也正在逐步成为现实^\_^，大家学习Go的热情也在快速提升， 《Go...</description></item><item><title>如何像gitlab-runner那样将Go应用安装为系统服务</title><link>https://tonybai.com/2022/09/12/how-to-install-a-go-app-as-a-system-service-like-gitlab-runner/</link><pubDate>Mon, 12 Sep 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/09/12/how-to-install-a-go-app-as-a-system-service-like-gitlab-runner/</guid><description>本文永久链接 – https://tonybai.com/2022/09/12/how-to-install-a-go-app-as-a-system-service-like-gitlab-runner 在《让reviewdog支持gitlab-push-commit，守住代码质量下限》一文中，gitlab-runner(一个Go语言开发的应用)通过自身提供的install命令将自己安装为了一个...</description></item><item><title>Go 1.19中值得关注的几个变化</title><link>https://tonybai.com/2022/08/22/some-changes-in-go-1-19/</link><pubDate>Mon, 22 Aug 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/08/22/some-changes-in-go-1-19/</guid><description>本文永久链接 – https://tonybai.com/2022/08/22/some-changes-in-go-1-19 我们知道Go团队在2015年重新规定了团队发布版本的节奏，将Go大版本的发布频率确定为每年两次，发布窗口定为每年的2月与8月。而实现自举的Go 1.5版本是这一个节奏下发布的第一个版本。一般来说，Go团队都会在这两个窗口的中间位置发布版本，不过这几年也有意外，比如承载着泛...</description></item><item><title>使用Go语言实现eBPF程序内核态与用户态的双向数据交换</title><link>https://tonybai.com/2022/07/25/bidirectional-data-exchange-between-kernel-and-user-states-of-ebpf-programs-using-go/</link><pubDate>Mon, 25 Jul 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/07/25/bidirectional-data-exchange-between-kernel-and-user-states-of-ebpf-programs-using-go/</guid><description>本文永久链接 – https://tonybai.com/2022/07/25/bidirectional-data-exchange-between-kernel-and-user-states-of-ebpf-programs-using-go 在之前的两篇文章中，无论是使用C语言开发eBPF程序，还是使用Go开发的eBPF程序，都是hello world级别的，可能有用，但谈不上十分实用。 ...</description></item><item><title>使用Go语言开发eBPF程序</title><link>https://tonybai.com/2022/07/19/develop-ebpf-program-in-go/</link><pubDate>Tue, 19 Jul 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/07/19/develop-ebpf-program-in-go/</guid><description>本文永久链接 – https://tonybai.com/2022/07/19/develop-ebpf-program-in-go 在前面的《使用C语言从头开发一个Hello World级别的eBPF程序》一文中，我们详细说明了如何基于C语言和libbpf库从头开发一个eBPF程序(包括其用户态部分)。那篇文章是后续有关eBPF程序开发文章的基础，因为到目前为止，无论eBPF程序的用户态部分用什...</description></item><item><title>GoCN社区Go读书会第二期：《Go语言精进之路》</title><link>https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master/</link><pubDate>Thu, 07 Jul 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master/</guid><description>本文永久链接 – https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master 本文是2022年6月26日我在**GoCN社区的Go读书会第二期《Go语言精进之路》直播的文字稿**。本文对直播的内容做了重新整理与修订，供喜欢阅读文字的朋友们在收看直播后...</description></item><item><title>使用C语言从头开发一个Hello World级别的eBPF程序</title><link>https://tonybai.com/2022/07/05/develop-hello-world-ebpf-program-in-c-from-scratch/</link><pubDate>Tue, 05 Jul 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/07/05/develop-hello-world-ebpf-program-in-c-from-scratch/</guid><description>本文永久链接 – https://tonybai.com/2022/07/05/develop-hello-world-ebpf-program-in-c-from-scratch * * * 近两年最火的Linux内核技术非eBPF莫属！ 2019年以来，除了eBPF技术自身快速演进之外，基于eBPF技术的观测(Observability)、安全(Security)和网络(Networking)...</description></item><item><title>Go语言数据竞争检测与数据竞争模式</title><link>https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go/</link><pubDate>Tue, 21 Jun 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go/</guid><description>本文永久链接 – https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go uber，就是那个早早退出中国打车市场的优步，是Go语言早期接纳者，也是Go技术栈的“重度用户”。uber内部的Go代码仓库有5000w+行Go代码，有2100个Go实现的独立服务，这样的Go应用规模在世界范围内估计也是Top3了吧。 uber...</description></item><item><title>Go 1.19新特性前瞻</title><link>https://tonybai.com/2022/06/12/go-1-19-foresight/</link><pubDate>Sun, 12 Jun 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/06/12/go-1-19-foresight/</guid><description>本文永久链接 – https://tonybai.com/2022/06/12/go-1-19-foresight 美国时间2022年5月7日，Go 1.19版本开发分支进入新特性冻结(freeze)阶段，即只能修Bug，不能再向Go 1.19版本中增加新特性了。由于上一个版本Go 1.18因引入泛型改动较大，推迟了一个月发布，这直接导致了Go 1.19版本的开发周期被缩短。 虽然开发周期少了近一...</description></item><item><title>手把手教你使用ANTLR和Go实现一门DSL语言（第一部分）：设计DSL语法与文法</title><link>https://tonybai.com/2022/05/24/an-example-of-implement-dsl-using-antlr-and-go-part1/</link><pubDate>Tue, 24 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/24/an-example-of-implement-dsl-using-antlr-and-go-part1/</guid><description>本文永久链接 – https://tonybai.com/2022/05/24/an-example-of-implement-dsl-using-antlr-and-go-part1 在《使用ANTLR和Go实现DSL入门》一文中，我们了解了DSL与通用编程语言(GPL)的差异、DSL解析器生成工具选择以及ANTLR文法的简要书写规则，并和大家一起完成了一个CSV解析器的例子。看完上述文章后，你...</description></item><item><title>Go程序员拥抱C语言简明指南</title><link>https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher/</link><pubDate>Mon, 16 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher/</guid><description>本文永久链接 – https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher 本文是为于航老师的极客时间专栏《深入C语言和程序运行原理》写的加餐文章《Tony Bai：Go程序员拥抱C语言简明指南》，这里分享给大家，尤其是那些想学习C语言的Gopher们。 * * * 你好，我是Tony Bai。 也许...</description></item><item><title>使用ANTLR和Go实现DSL入门</title><link>https://tonybai.com/2022/05/10/introduction-of-implement-dsl-using-antlr-and-go/</link><pubDate>Tue, 10 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/10/introduction-of-implement-dsl-using-antlr-and-go/</guid><description>本文永久链接 – https://tonybai.com/2022/05/10/introduction-of-implement-dsl-using-antlr-and-go 一. 引子 设计与实现一门像Go这样的通用编程语言的确很难！那是世界上少数程序员从事的事业，但是实现一门领域特定语言(Domain Specific Language, DSL)似乎是可行的。 就像著名的语言解析器生成工具...</description></item><item><title>Go编程语言与环境：万字长文复盘导致Go语言成功的那些设计决策[译]</title><link>https://tonybai.com/2022/05/04/the-paper-of-go-programming-language-and-environment/</link><pubDate>Wed, 04 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/04/the-paper-of-go-programming-language-and-environment/</guid><description>本文永久链接 – https://tonybai.com/2022/05/04/the-paper-of-go-programming-language-and-environment 美国计算机学会通讯(Communications of the ACM)期刊2022年5月第65卷第5期将发表一篇有关Go语言的综述类Paper：《Go编程语言与环境》，这类综述类文章只有资深的Go核心团队的人才“...</description></item><item><title>世界读书日：带你走近Go语言编程思维</title><link>https://tonybai.com/2022/04/23/taking-a-closer-look-at-programming-thinking-in-go/</link><pubDate>Sat, 23 Apr 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/04/23/taking-a-closer-look-at-programming-thinking-in-go/</guid><description>本文永久链接 – https://tonybai.com/2022/04/23/taking-a-closer-look-at-programming-thinking-in-go 经过十几年的演化和发展，Go语言在全世界范围内已经拥有了百万级别的拥趸，在这些开发者当中，除了一部分新入行的编程语言初学者之外，更多的是从其他编程语言阵营转过来的开发者。由于Go语言上手容易，在转Go的初期大家很快就掌...</description></item><item><title>Go 1.18中值得关注的几个变化</title><link>https://tonybai.com/2022/04/20/some-changes-in-go-1-18/</link><pubDate>Wed, 20 Apr 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/04/20/some-changes-in-go-1-18/</guid><description>本文永久链接 – https://tonybai.com/2022/04/20/some-changes-in-go-1-18 &amp;gt; 从3月23日开始，我居家办公了20+天。这期间我本来是应该有时间写下这篇综述类文章的，但是封了两天后，抢菜、带娃的事情就开始困扰着我。我实在没有下笔写下这篇文章的心思。4月13日终于解封了，上班后的气象就是不一样，人也精神了很多，于是这篇文章也被提上了日程。希望新冠疫...</description></item><item><title>Go字符串比较，终于有人讲清楚了</title><link>https://tonybai.com/2022/04/18/inside-go-string-comparison/</link><pubDate>Mon, 18 Apr 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/04/18/inside-go-string-comparison/</guid><description>本文永久链接 – https://tonybai.com/2022/04/18/inside-go-string-comparison 西娅(Thea)是一个刚刚入门Go语言的妹子程序员，今天她遇到了一个让她“surprise”的问题。下面就是那段让妹子西娅困惑的Go代码： func main() { s1 := &amp;#34;12345&amp;#34; s2 := &amp;#34;2&amp;#34; fmt.Println(`&amp;#34;12345&amp;#34; &amp;gt; &amp;#34;...</description></item><item><title>Go是否支持增量构建？我来告诉你！</title><link>https://tonybai.com/2022/03/21/go-native-support-incremental-build/</link><pubDate>Mon, 21 Mar 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/03/21/go-native-support-incremental-build/</guid><description>本文永久链接 – https://tonybai.com/2022/03/21/go-native-support-incremental-build Go语言**以编译速度快闻名于码农界**。这缘于Go在设计之初就选择抛弃其祖辈C语言的头文件包含机制，选择了以包(package)作为基本编译单元。Go语言的这种以包为基本构建单元的构建模型使得依赖分析变得十分简单，避免了C语言那种通过头文件分析依...</description></item><item><title>针对大型数组的迭代，for range真的比经典for loop慢吗？</title><link>https://tonybai.com/2022/03/19/for-range-vs-classic-for-loop-when-iterating-large-array/</link><pubDate>Sat, 19 Mar 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/03/19/for-range-vs-classic-for-loop-when-iterating-large-array/</guid><description>本文永久链接 – https://tonybai.com/2022/03/19/for-range-vs-classic-for-loop-when-iterating-large-array Go语言推崇“**一件事情仅有一个作法**”！比如：Go仅保留一类循环控制语句，那就是**经典版的for loop**： ``` for i := 0; i &amp;lt; 100; i++ { ... ... } `...</description></item><item><title>Ian Lance Taylor：Go泛型使用的一般准则</title><link>https://tonybai.com/2021/11/07/using-generics-in-go/</link><pubDate>Sun, 07 Nov 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/11/07/using-generics-in-go/</guid><description>本文永久链接 – https://tonybai.com/2021/11/07/using-generics-in-go 在近期Google Open Source Live的Go Day 2021环节，Go泛型的主要设计者Ian Lance Taylor做了Using Generics in Go的简短演讲(国内地址在这里)。这篇演讲的重点**不是即将于Go 1.18版本降临的Go泛型的语法细节...</description></item><item><title>Go语言第一课背后的那些事儿</title><link>https://tonybai.com/2021/10/25/the-things-behind-the-first-lesson-of-go-language/</link><pubDate>Mon, 25 Oct 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/10/25/the-things-behind-the-first-lesson-of-go-language/</guid><description>本文永久链接 – https://tonybai.com/2021/10/25/the-things-behind-the-first-lesson-of-go-language 《Go语言第一课》正式上线一周多了，从编辑和运营老师那边反馈，成绩似乎还不错，感谢大家的捧场！今天和大家说说专栏《Go语言第一课》背后的那些事儿。 年初策划：Gopher的《C++ Primer》 学过C++的童鞋想必都...</description></item><item><title>Tony Bai带你入门Go语言</title><link>https://tonybai.com/2021/10/15/your-first-go-course-by-tonybai/</link><pubDate>Fri, 15 Oct 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/10/15/your-first-go-course-by-tonybai/</guid><description>本文永久链接 – https://tonybai.com/2021/10/15/your-first-go-course-by-tonybai 没错，Tony Bai就是我。这次终于轮到我了！ 极客时间在10月13日正式上线了我的Go语言专栏：《Tony Bai·Go语言第一课》。 * * * 现如今，越来越多的程序员因为自己或公司的需求，逐渐转成Go开发。当前国内外一线，包括 BAT 等大厂，以...</description></item><item><title>Brooks、Wirth和Go[译]</title><link>https://tonybai.com/2021/08/25/brooks-wirth-and-go/</link><pubDate>Wed, 25 Aug 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/08/25/brooks-wirth-and-go/</guid><description>本文永久链接 – https://tonybai.com/2021/08/25/brooks-wirth-and-go 本文翻译自瑞典程序员Fredrik Holmqvist的博客文章《Brooks, Wirth and Go》。 现在是1975年。 程序员们带着FORTRAN代码回来了，不过使用的是穿孔卡片的形式。 图：记录代码的穿孔卡片(图片来自punchcardreader.com，译者加)...</description></item><item><title>一文搞懂Go语言的plugin</title><link>https://tonybai.com/2021/07/19/understand-go-plugin/</link><pubDate>Mon, 19 Jul 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/07/19/understand-go-plugin/</guid><description>本文永久链接 – https://tonybai.com/2021/07/19/understand-go-plugin 要历数Go语言中还有哪些我还没用过的特性，在Go 1.8版本中引入的go plugin算一个。近期想给一个网关类平台设计一个插件系统，于是想起了go plugin^\_^。 Go plugin支持将Go包编译为共享库（.so）的形式单独发布，主程序可以在运行时动态加载这些编译为...</description></item><item><title>通过实例理解Go逃逸分析</title><link>https://tonybai.com/2021/05/24/understand-go-escape-analysis-by-example/</link><pubDate>Mon, 24 May 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/05/24/understand-go-escape-analysis-by-example/</guid><description>本文永久链接 – https://tonybai.com/2021/05/24/understand-go-escape-analysis-by-example 翻看了一下自己的Go文章归档，发现自己从未专门写过有关Go逃逸分析（escape analysis）的文章。关于Go变量的逃逸分析，大多数Gopher其实并不用关心，甚至可以无视。但是如果你将Go应用于性能敏感的领域，要完全压榨出Go应用...</description></item><item><title>Go标准库flag包的“小陷阱”</title><link>https://tonybai.com/2021/04/12/pitfall-in-std-flag-pkg/</link><pubDate>Mon, 12 Apr 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/04/12/pitfall-in-std-flag-pkg/</guid><description>本文永久链接 – https://tonybai.com/2021/04/12/pitfall-in-std-flag-pkg Go语言号称“自带电池(battery-included)”，这意味着Go标准库可开箱即用，为Gopher提供了功能丰富的常用工具包，足以应付多数日常开发所需。尤其在Go语言擅长的领域，Go标准库工具包更是有着广泛的应用。下图是Go官方2020年用户调查的结果： 我们看到...</description></item><item><title>Go语言的“黑暗角落”：盘点学习Go语言时遇到的那些陷阱[译]（第二部分）</title><link>https://tonybai.com/2021/03/29/darker-corners-of-go-part2/</link><pubDate>Mon, 29 Mar 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/03/29/darker-corners-of-go-part2/</guid><description>本文翻译自Rytis Bieliunas的文章《Darker Corners of Go》。 第一部分参见[《Go语言的“黑暗角落”：盘点学习Go语言时遇到的那些陷阱\[译\]（第一部分）》](https://tonybai.com/2021/03/29/darker-corners-of-go-part1) 7\. 字符串和字节数组 ------------ 1) Go中的字符串 Go字符串的内...</description></item><item><title>Go语言的“黑暗角落”：盘点学习Go语言时遇到的那些陷阱[译]（第一部分）</title><link>https://tonybai.com/2021/03/29/darker-corners-of-go-part1/</link><pubDate>Mon, 29 Mar 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/03/29/darker-corners-of-go-part1/</guid><description>本文翻译自Rytis Bieliunas的文章《Darker Corners of Go》。 &amp;gt; 译注：若干年前，Kyle Quest曾发过一篇名为“50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs”的文章，仿效著名的《C Traps and Pitfalls》编写了50条Go语言的陷阱与缺陷，一时在G...</description></item><item><title>Rust vs. Go：为什么强强联合会更好</title><link>https://tonybai.com/2021/03/15/rust-vs-go-why-they-are-better-together/</link><pubDate>Mon, 15 Mar 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/03/15/rust-vs-go-why-they-are-better-together/</guid><description>本文翻译自乔纳森·特纳（Jonathan Turner）和史蒂夫·弗朗西亚（Steve Francia）的文章《Rust vs. Go: Why They’re Better Together》。 &amp;gt; 史蒂夫·弗朗西亚（Steve Francia）：在过去的25年里，Steve Francia建立了一些最具创新性和成功的技术和公司，这些技术和公司已经成为云计算的基础，被全世界的企业和开发者所接受。...</description></item><item><title>Go语言很无聊…其实它妙不可言！[译]</title><link>https://tonybai.com/2021/01/07/go-is-boring/</link><pubDate>Thu, 07 Jan 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/01/07/go-is-boring/</guid><description>&amp;gt; 无聊是一种很奇妙的状态，它可以稀释掉人类的一切情感。- 《古董局中局》马伯庸 在GopherCon 2020技术大会上(线上虚拟大会)，Jon Bodner为全球gopher们做了主题为“Go Is Boring”的精彩演讲(关注公众号**iamtonybai**，发送**gophercon2020**即可得到GopherCon 2020技术大会幻灯片资料)。 其实早在2020年6月，Jon ...</description></item><item><title>Hugo作者、Go核心开发团队成员谈诞生13年的Go语言：生态系统、演化与未来[译]</title><link>https://tonybai.com/2021/01/02/go-language-13-years/</link><pubDate>Sat, 02 Jan 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/01/02/go-language-13-years/</guid><description>本文翻译自《Go Language at 13 Years: Ecosystem, Evolution, and Future in Conversation with Steve Francia》。 &amp;gt; 译注：Go开源于2009年，如果从那时算起，Go才11岁；但在Go核心开发团队眼中，Go的真正诞生年份是2007年，至今13个年头了。关于Go的演化简史可以参见我的专栏文章：《Go语言的前生今世...</description></item><item><title>Go语言有哪些“劣势”</title><link>https://tonybai.com/2020/12/24/the-disadvantages-of-go/</link><pubDate>Thu, 24 Dec 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/12/24/the-disadvantages-of-go/</guid><description>本文源于笔者对知乎上的一个问题“Go有哪些劣势？”(https://www.zhihu.com/question/300163211)的一次回答(https://www.zhihu.com/question/300163211/answer/1632229924)。当时随手花几分钟在手机上写了一些点。但事后我觉得应该再做一些系统地思考。在这里我就将更系统地思考后的答案整理并分享给大家。 关于Go语...</description></item><item><title>Go是编程语言世界的“特斯拉”</title><link>https://tonybai.com/2020/12/01/go-is-the-tesla-of-programming-world/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/12/01/go-is-the-tesla-of-programming-world/</guid><description>Go技术专栏“改善Go语⾔编程质量的50个有效实践”正在慕课网火热热销中！本专栏主要满足广大gopher关于Go语言进阶的需求，围绕如何写出地道且高质量Go代码给出50条有效实践建议，上线后收到一致好评！78元简直就是白菜价，简直就是白piao! 欢迎大家订阅！ 本文翻译自《GO — The TESLA Of Programming World》 – https://medium.com/glob...</description></item><item><title>一文告诉你如何抢先体验Go泛型</title><link>https://tonybai.com/2020/11/28/httpstonybai-com20201128how-to-experience-go-generics-first/</link><pubDate>Sat, 28 Nov 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/11/28/httpstonybai-com20201128how-to-experience-go-generics-first/</guid><description>本文首发于我主持的“Gopher部落”知识星球，欢迎大家加入星球，一起学习Go语言！年底前8.8折优惠，不要错过哦！ 2020年11月22日，Go核心开发团队技术负责人Russ Cox在golang-dev论坛上确认了Go泛型将在Go 1.18落地(2022.2)： 这对于那些迫切期盼go加入泛型的gopher来说无疑是一个重大利好消息！不过，泛型是把双刃剑！泛型的加入势必会让Go语言的复杂性大幅...</description></item><item><title>重度使用Go的“后遗症“，你有吗？</title><link>https://tonybai.com/2020/11/05/the-sequela-after-being-used-to-writting-code-in-go/</link><pubDate>Thu, 05 Nov 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/11/05/the-sequela-after-being-used-to-writting-code-in-go/</guid><description>有一种未经证实的说法：**Go诞生于C++程序的漫长构建过程中**。如果C++编译很快，那么Robert Griesemer、Rob Pike和Ken Thompson这三位大佬也没有闲暇时间一起喝着咖啡并决定是时候设计一门新语言了。的确，Go语言诞生后，其简洁的语法、极速地构建、新颖的并发结构、体验优良的工具链以及完成度不低的标准库吸引了很多C/C++程序员转型成为Gopher并开始重度使用Go...</description></item><item><title>系统学习Go语言，有这几本书就够了！</title><link>https://tonybai.com/2020/11/04/the-recommend-books-list-for-learning-go/</link><pubDate>Wed, 04 Nov 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/11/04/the-recommend-books-list-for-learning-go/</guid><description>1\. Go语言的发展现状 如果从2007年9月20日那个下午三个“程序员大佬”在谷歌总部的一间办公室里进行的一次有关设计一门新编程语言的讨论算起，那么Go语言已经度过了自己的13个年头了。 Robert Griesemer、Rob Pike和Ken Thompson 如果从2009年11月10日Go语言正式开源发布算起，Go语言也即将迎来自己的第11个生日。 2020年，Go联合创始人Rob P...</description></item><item><title>后端程序员一定要看的语言大比拼：Java vs. Go vs. Rust</title><link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/</link><pubDate>Fri, 01 May 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/</guid><description>这是Java，Go和Rust之间的比较。这不是基准测试，更多是对可执行文件大小、内存使用率、CPU使用率、运行时要求等的比较，当然还有一个小的基准测试，可以看到每秒处理的请求数量，我将尝试对这些数字进行有意义的解读。 为了尝试尽可能公平比较，我在此比较中使用每种语言编写了一个Web服务。Web服务非常简单，它提供了三个REST服务端点(endpoint)。 Web服务提供的服务端点 这三个Web服...</description></item><item><title>图解Go运行时调度器</title><link>https://tonybai.com/2020/03/21/illustrated-tales-of-go-runtime-scheduler/</link><pubDate>Sat, 21 Mar 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/03/21/illustrated-tales-of-go-runtime-scheduler/</guid><description>本文翻译自《Illustrated Tales of Go Runtime Scheduler》。 &amp;gt; 译注：原文章结构有些乱，笔者自行在译文中增加了一些分级标题，让结构显得更清晰一些:)。 多goroutines形式的Go并发是编写现代并发软件的一种非常方便的方法，但是您的Go程序是如何高效地运行这些goroutines的呢？ 在这篇文章中，我们将深入Go运行时底层，从设计角度了解Go运行时调度...</description></item><item><title>Go语言之禅</title><link>https://tonybai.com/2020/02/24/the-zen-of-go/</link><pubDate>Mon, 24 Feb 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/02/24/the-zen-of-go/</guid><description>本文翻译自Go社区知名Gopher和博主Dave Cheney的文章《The Zen of Go》。 本文来自我在GopherCon Israel 2020上的演讲。文章很长:) 如果您希望阅读精简版，请移步到the-zen-of-go.netlify.com。 &amp;gt; 该演讲视频还未上线。如上线，我会把它更新到本文中的。 我应该如何编写出好代码？ 我最近一直在思考很多事情，每当反思自己的工作成果时，...</description></item><item><title>Go语言的遗产</title><link>https://tonybai.com/2019/11/04/the-legacy-of-go/</link><pubDate>Mon, 04 Nov 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/11/04/the-legacy-of-go/</guid><description>本文是gohugo作者Steve Francia在意大利佛罗伦萨举办的GoLab上分享的闭幕演讲讲稿的文字版，该演讲的主题为”Go的遗产”。该演讲讨论了Go语言继承的遗产，以及它是如何尊重这些遗产的，并在最后总结了Go希望留给后来者的遗产。 **演讲胶片** &amp;gt; 我们有责任保留好留给我们的遗产，并留下值得我们子孙后代继承的遗产 – 克里斯汀·格雷格（Christine Gregoire） 1\. ...</description></item><item><title>Go 1.13中值得关注的几个变化</title><link>https://tonybai.com/2019/10/27/some-changes-in-go-1-13/</link><pubDate>Sun, 27 Oct 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/10/27/some-changes-in-go-1-13/</guid><description>2019年对于Go语言来说也是一个重要的年份，因为在2019年的11月10日，Go即将迎来其开源10周年的纪念日。在这个重要日子的前夕，在GopherCon 2019大会后，Go项目组在2019.9.4日发布了Go 1.13版本。 这是自2017年GopherCon大会上Russ Cox做“Toward Go 2″主题演讲以来Go项目发布的第四个版本（前三个分别是：go 1.10、go 1.11和...</description></item><item><title>Go正走在成为下一个企业级编程语言的轨道上</title><link>https://tonybai.com/2019/05/03/go-is-on-a-trajectory-to-become-the-next-enterprise-programming-language/</link><pubDate>Fri, 03 May 2019 00:00:00 +0800</pubDate><guid>https://tonybai.com/2019/05/03/go-is-on-a-trajectory-to-become-the-next-enterprise-programming-language/</guid><description>发展演化了十年的Go语言已经被证明了是云计算时代的首选编程语言，但Go的用武之地显然不局限于此。Kevin Goslar近期在Hacker Noon发表了一篇名为：《Go is on a Trajectory to Become the Next Enterprise Programming Language》的文章，阐述了Go可能成为下一个企业编程语言的理由，这里是那篇文章的中文译文，分享给大家...</description></item><item><title>基于consul实现微服务的服务发现和负载均衡</title><link>https://tonybai.com/2018/09/10/setup-service-discovery-and-load-balance-based-on-consul/</link><pubDate>Mon, 10 Sep 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/09/10/setup-service-discovery-and-load-balance-based-on-consul/</guid><description>一. 背景 ----- 随着2018年年初国务院办公厅联合多个部委共同发布了《国务院办公厅关于促进“互联网+医疗健康”发展的意见(国办发〔2018〕26号)》，国内医疗IT领域又迎来了一波互联网医院建设的高潮。不过互联网医院多基于实体医院建设，虽说挂了一个“互联网”的名号，但互联网医院系统也多与传统的院内系统，比如：HIS、LIS、PACS、EMR等共享院内的IT基础设施。 如果你略微了解过国内医...</description></item><item><title>基于consul实现微服务的服务发现和负载均衡</title><link>https://tonybai.com/2018/09/10/setup-service-discovery-and-load-balance-based-on-consul/</link><pubDate>Mon, 10 Sep 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/09/10/setup-service-discovery-and-load-balance-based-on-consul/</guid><description>一. 背景 ----- 随着2018年年初国务院办公厅联合多个部委共同发布了《国务院办公厅关于促进“互联网+医疗健康”发展的意见(国办发〔2018〕26号)》，国内医疗IT领域又迎来了一波互联网医院建设的高潮。不过互联网医院多基于实体医院建设，虽说挂了一个“互联网”的名号，但互联网医院系统也多与传统的院内系统，比如：HIS、LIS、PACS、EMR等共享院内的IT基础设施。 如果你略微了解过国内医...</description></item><item><title>TB一周萃选[第4期]</title><link>https://tonybai.com/2018/01/06/4th-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</link><pubDate>Sat, 06 Jan 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/01/06/4th-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</guid><description>本文是首发于个人微信公众号的文章**“TB一周萃选\[第4期\]”**的归档。 &amp;gt; 孩子，我要求你读书用功，不是因为我要你跟别人比成绩，而是因为，我希望你将来会拥有选择的权利，选择有意义、有时间的工作，而不是被迫谋生。当你的工作在你心中有意义，你就有成就感。当你的工作给你时间，不剥夺你的生活，你就有尊严。成就感和尊严，给你快乐。——龙应台 《亲爱的安德烈》 这两天中原大地的一场大雪正式宣告了深冬的...</description></item><item><title>TB一周萃选[第2期]</title><link>https://tonybai.com/2017/12/22/2nd-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</link><pubDate>Fri, 22 Dec 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/12/22/2nd-issue-of-the-tech-weekly-carefully-chosen-by-tonybai/</guid><description>本文是首发于个人微信公众号的文章**TB一周萃选\[第2期\]**的归档。 封面 &amp;gt; “我天性不宜交际。 &amp;gt; &amp;gt; 在多数场合，我不是觉得对方乏味，就是害怕对方觉得我乏味。可是我既不愿忍受对方的乏味，也不愿费劲使自己显得有趣，那都太累了。 &amp;gt; &amp;gt; 我独处时最轻松，因为我不觉得自己乏味，即使乏味，也自己承受，不累及他人，无需感到不安。” ——周国平 本周日晚上就是平安夜了！ 圣诞节，是西方最重要的节日...</description></item><item><title>源创会开源访谈：十年成长，Go语言的演化之路</title><link>https://tonybai.com/2017/10/24/go-evolution-for-ten-years-an-interview-by-osc/</link><pubDate>Tue, 24 Oct 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/10/24/go-evolution-for-ten-years-an-interview-by-osc/</guid><description>在参加源创会沈阳站分享之前，接受了开源中国社区编辑王练的文字专访，以下是我针对专访稿的内容。 同时该专访稿首发于开源中国开源访谈栏目，大家可以点击这里看到首发原稿。 1、首先请介绍一下自己 大家好！我叫白明（Tony Bai），目前是东软云科技的一名架构师，专职于服务端开发，日常工作主要使用Go语言。我算是国内较早接触Go语言的程序员兼Advocater了，平时在我的博客、微博和微信公众号”iam...</description></item><item><title>Hello, Apollo</title><link>https://tonybai.com/2017/08/15/hello-apollo/</link><pubDate>Tue, 15 Aug 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/08/15/hello-apollo/</guid><description>要说目前哪个技术领域投资最火热，莫过于人工智能。而人工智能领域中最火的(或者说之一)肯定要算上自动驾驶。自动驾驶的概念不是什么新鲜的玩意了，只是随着近两年这一波人工智能的大热，自动驾驶又被推到了风口浪尖。各大汽车厂商、互联网公司也都跃跃欲试，准备给汽车这一“历经百年的黄金平台”做一次新的“赋能”。 今年7月5日，国内搜索引擎No.1企业百度在其首届百度AI开发者大会上发布了Apollo自动驾驶开放...</description></item><item><title>Hello, ROS</title><link>https://tonybai.com/2017/08/01/hello-ros/</link><pubDate>Tue, 01 Aug 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/08/01/hello-ros/</guid><description>ROS，全称是Robot Operating System，字面译为“机器人操作系统”。不过ROS并非是一个真正意义上的操作系统，而仅仅是一套用于机器人操作和控制软件开发的开发框架(framework)，包括各种库和工具。 ROS在2007年诞生于斯坦福大学的人工智能实验室Stanford Artificial Intelligence Laboratory，简称SAIL；2008年至2013年，...</description></item><item><title>也谈goroutine调度器</title><link>https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/</link><pubDate>Fri, 23 Jun 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/</guid><description>Go语言在2016年再次拿下TIBOE年度编程语言称号，这充分证明了Go语言这几年在全世界范围内的受欢迎程度。如果要对世界范围内的gopher发起一次“你究竟喜欢Go的哪一点”的调查，我相信很多Gopher会提到：**goroutine**。 Goroutine是Go语言原生支持并发的具体实现，你的Go代码都无一例外地跑在goroutine中。你可以启动许多甚至成千上万的goroutine，Go的...</description></item><item><title>Go coding in go way</title><link>https://tonybai.com/2017/04/20/go-coding-in-go-way/</link><pubDate>Thu, 20 Apr 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/04/20/go-coding-in-go-way/</guid><description>本篇文章是我在2017年第三届GopherChina大会上所作talk：”Go coding in go way)“的改编和展开版，全文如下。 一、序 --- 今天我要分享的题目是**“Go coding in go way”**，中文含义就是用**“Go语言编程思维去写Go代码”**。看到这个题目大家不禁要问：究竟什么是Go语言编程思维呢？关于什么是Go语言变成思维其实并没有官方说法。这里要和大...</description></item><item><title>Go 1.8中值得关注的几个变化</title><link>https://tonybai.com/2017/02/03/some-changes-in-go-1-8/</link><pubDate>Fri, 03 Feb 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/02/03/some-changes-in-go-1-8/</guid><description>在已经过去的2016年，Go语言继在2009年之后再次成为编程语言界的明星- 问鼎TIOBE 2016年度语言。这与Go team、Go community和全世界的Gophers的努力是分不开的。按计划在这个2月份，Go team将正式发布Go 1.8版本(截至目前，Go的最新版本是Go 1.8rc3)。在这里我们一起来看一下在Go 1.8版本中都有哪些值得Gopher们关注的变化。 一、语言（...</description></item><item><title>使用Visual Studio Code辅助Go源码编写</title><link>https://tonybai.com/2016/12/23/write-go-code-in-vscode/</link><pubDate>Fri, 23 Dec 2016 00:00:00 +0800</pubDate><guid>https://tonybai.com/2016/12/23/write-go-code-in-vscode/</guid><description>作为VIMer，日常编码中，Vim编辑器依然是我的首选。以前以C语言为主要语言的时候是这样，现在以Go为主要语言时亦是这样。不过近期发现Mac上使用Vim在编写Go代码时，Vim时不时的“抽风”：出现一些“屏幕字符被篡改”的问题，比如下面这幅图中”func”变成了”fknc”: 虽然一段时间后，显示会自动更正过来，但这种“篡改”是会让你产生“幻觉”的。你会想：是不是我真的将”func”写成”fkn...</description></item><item><title>论golang Timer Reset方法使用的正确姿势</title><link>https://tonybai.com/2016/12/21/how-to-use-timer-reset-in-golang-correctly/</link><pubDate>Wed, 21 Dec 2016 00:00:00 +0800</pubDate><guid>https://tonybai.com/2016/12/21/how-to-use-timer-reset-in-golang-correctly/</guid><description>2016年，Go语言在Tiobe编程语言排行榜上位次的大幅蹿升(2016年12月份Tiobe榜单：go位列第16位，Rating值：1.939%)。与此同时，我们也能切身感受到Go语言在世界范围蓬勃发展，其在中国地界儿上的发展更是尤为猛烈^0^：For gopher们的job变多了、网上关于Go的资料也大有“汗牛充栋”之势。作为职业Gopher^0^，要为这个生态添砖加瓦，就要多思考、多总结，关键...</description></item><item><title>Go语言错误处理</title><link>https://tonybai.com/2015/10/30/error-handling-in-go/</link><pubDate>Fri, 30 Oct 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/10/30/error-handling-in-go/</guid><description>近期闲暇用Go写一个lib，其中涉及到error处理的地方让我琢磨了许久。关于Go错误处理的资料和视频已有许多，Go authors们也在官方Articles和Blog上多次提到过一些Go error handling方面的一些tips和best practice，这里仅仅算是做个收集和小结，尽视野所及，如有不足，欢迎评论中补充。（10月因各种原因，没有耕博，月末来一发，希望未为晚矣 ^\_^） ...</description></item><item><title>关于Go，你可能不注意的7件事</title><link>https://tonybai.com/2015/09/17/7-things-you-may-not-pay-attation-to-in-go/</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/09/17/7-things-you-may-not-pay-attation-to-in-go/</guid><description>Go以简洁著称，但简洁中不乏值得玩味的小细节。这些小细节不如goroutine、interface和channel那样&amp;#34;高大上&amp;#34;，&amp;#34;屌 丝&amp;#34;得可能不经常被人注意到，但它们却对理解Go语言有着重要的作用。这里想挑出一些和大家一起通过详实的例子来逐一展开和理解。本文内容较为基础，适合初学者，高手可飘过:) **一、源文件字符集****和字符集编码** Go源码文件默认采用Unicode字符集，Unic...</description></item><item><title>Golang的演化历程</title><link>https://tonybai.com/2014/10/25/golang-history/</link><pubDate>Sat, 25 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/25/golang-history/</guid><description>本文来自Google的Golang语言设计者之一Rob Pike大神在GopherCon2014大会上的开幕主题演讲资料“Hello, Gophers!”。Rob大神在这次分 享中用了两个生动的例子讲述了Golang的演化历程，总结了Golang到目前为止的成功因素，值得广大Golang Programmer &amp;amp; Beginner学习和了解。这里也用了&amp;#34;Golang的演化历程&amp;#34;作为标题。 **1、...</description></item><item><title>Golang跨平台交叉编译</title><link>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</guid><description>近期在某本书上看到Go跨平台交叉编译的强大功能，于是想自己测试一下。以下记录了测试过程以及一些结论，希望能给大家带来帮助。 我的Linux环境如下： uname -a Linux ubuntu-Server-14 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86\_64 x86\_64 x86\_64 GNU/Lin...</description></item><item><title>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/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>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>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/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>利用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>buildc 0.3.1版本发布</title><link>https://tonybai.com/2013/07/15/buildc-0-3-1-release/</link><pubDate>Mon, 15 Jul 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/07/15/buildc-0-3-1-release/</guid><description>随着buildc在内部应用的深入，buildc逐渐进入了以内部需求和问题为主要驱动力的演化模式。我们内部的C应用多是后端服务类应用，个人 觉得具有一定代表性。buildc最初就是为了针对这类C应用而设计的。因此我们内部的需求和问题应该也同样具有一定代表性，而这种演化模式在一 段时间范围内还是有意义的。 buildc 0.3.1版本修正了上一版本的若干bug，并增加了两个新功能。 **\* 提高容错...</description></item><item><title>跨过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>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>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>也谈C语言的Struct Hack</title><link>https://tonybai.com/2013/03/07/struct-hack-in-c/</link><pubDate>Thu, 07 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/07/struct-hack-in-c/</guid><description>今天在浏览网友huangz编写的“Redis源码分析”时，看到如下redis中的代码： struct sdshdr {     int len;     int free;     char buf\[\]; }; 说实话，这类代码我见过很多，但直到这次我才知道这种coding trick的真实英文称谓是：Struct Hack。 到底什么是Struct Hack？其实倒也没有什么明确定义。首先它...</description></item><item><title>玩转top</title><link>https://tonybai.com/2013/03/02/deep-into-top/</link><pubDate>Sat, 02 Mar 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/03/02/deep-into-top/</guid><description>相信很多人和我一样，top是自己日常使用最多的linux资源查看工具。不过仅限于一些简单的日常场景罢了：敲入top命令，看看哪些进程占用 CPU较多，然后对这些CPU占用较多的进程逐一处理一下。显然这样使用top有些大才小用了。 以前在监控工具使用方面总是浅尝辙止，并未做过多深入研究。近来愈来愈觉得有必要针对几种常用工具好好学习一下了。而top便首当其冲。top是一款 以查看进程(task)信息为...</description></item><item><title>为什么还用C编程？</title><link>https://tonybai.com/2013/02/27/why-code-in-c-anymore/</link><pubDate>Wed, 27 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/27/why-code-in-c-anymore/</guid><description>本文翻译自Dr. Dobb&amp;#39;s杂志主编Andrew Binstock的文章“Why Code in C Anymore?”，以下是翻译正文。 **传统的那些选择C而不是C++的理由的说服力已经逐渐地被削弱。还有什么继续使用C的更好的理由么？** 一个 Dr. Dobb&amp;#39;s的老读者最近问我：为何人们还在使用C编程。这个话题最近曾在我们站点的评论中出现过。早期也曾出现在与一些行业公司的对话过程中，尤其...</description></item><item><title>Go defer的C实现</title><link>https://tonybai.com/2013/02/03/implement-go-defer-in-c/</link><pubDate>Sun, 03 Feb 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/02/03/implement-go-defer-in-c/</guid><description>Go语言中引入了一个新的关键字defer，个人认为这个语法关键字让异常处理也变得得心应手许多，对改善代码的可读性和可维护性大有裨益，是典型的语法棒棒糖^\_^。 像下面这种代码（伪代码）： void foo() {     apply resource1; retv = action1;     if not success         release resource1 apply reso...</description></item><item><title>buildc 0.2.2版本发布</title><link>https://tonybai.com/2013/01/15/buildc-0-2-2-release/</link><pubDate>Tue, 15 Jan 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/01/15/buildc-0-2-2-release/</guid><description>随着buildc在项目中的深入使用，开发和测试人员都提出了不少良好意见，让我们有些应接不暇了，这次的版本更新也是为了满足这些意见和建议。 由于忙于应对这些眼前的需求，原本0.3.0的改进计划也被推迟了一些。 buildc 0.2.2版本包含了两个主要修正。 \* 增加了–ignore-error命令行选项 自从buildc cache相关命令严格区分–cmode=32-bit还是64-bit后，用...</description></item><item><title>buildc 0.2.1版本发布</title><link>https://tonybai.com/2012/12/06/buildc-0-2-1-release/</link><pubDate>Thu, 06 Dec 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/12/06/buildc-0-2-1-release/</guid><description>buildc 0.2.1版本是一个bugfix版本，修正了两个重要问题。 \* 修正执行buildc pack –cmode=32-bit时无法创建32位安装包的问题 之前的buildc pack命令在打包安装程序时忽略了–cmode这个选项，这样即便传入32-bit这个参数，打出的安装包中的应用程序依旧是64位编译的。这次修正了这个问题，让buildc真正支持打32位程序的安装包。 \* 修正b...</description></item><item><title>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/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>也谈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>开始学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/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>buildc 0.1.7版本发布</title><link>https://tonybai.com/2012/04/19/buildc-0-1-7-release/</link><pubDate>Thu, 19 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/19/buildc-0-1-7-release/</guid><description>最近针对buildc又有了一些新想法，于是今天上午又对buildc进行了多处修改，并相继发布了0.1.6版本和0.1.7版本。 \* 对buildc cache upgrade的实现进行了修改。 在执行全量更新本地cache前，先对本地cache的情况进行一些检查，并判断是否与当前.buildc.rc中的配置相符。如果两者是一致的，那么只进行update操作；否则则执行真正的upgrade(rem...</description></item><item><title>buildc 0.1.5版本发布</title><link>https://tonybai.com/2012/04/13/buildc-0-1-5-release/</link><pubDate>Fri, 13 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/13/buildc-0-1-5-release/</guid><description>这两天对buildc的改动比较频繁，今天又修正了一些问题，也增加了一些小功能。主要包括这么几点： 1、在Make.rules.in中增加了STATIC\_LIBS和DYNAMIC\_LIBS 项目源代码和项目中单元测试代码使用同一个Make.rules，也此编译时也就共享同一个LIBS变量。对于静态共享库还好说，但对于动态共享库，诸如Oracle的instantclient库，单元测试代码中即使没...</description></item><item><title>buildc 0.1.4版本发布</title><link>https://tonybai.com/2012/04/12/buildc-0-1-4-release/</link><pubDate>Thu, 12 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/12/buildc-0-1-4-release/</guid><description>年后buildc开始逐渐在产品线的项目里应用了，随之而来的是大家反馈的各种意见和bug。尤其是bug，我都会很认真地应对，也会及时发布相应的版本修复这些bug。buildc 0.1.4版本就是一个bugfix版本，其修复的bug源于今天上午的一次持续集成的失败。 上午收到Jenkins发送的一个&amp;#34;build failed&amp;#34;的mail，一个安装包项目的CI job执行失败了，于是到Jenkins w...</description></item><item><title>关于编译阶段符号多重定义的问题</title><link>https://tonybai.com/2012/04/11/multiple-definitions-of-the-compiling-phase/</link><pubDate>Wed, 11 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/11/multiple-definitions-of-the-compiling-phase/</guid><description>印象中关于编译以及链接的问题早已是老生常谈了。但今天又遇到了一个这样的问题，这里还总想提及一下下^\_^。 这次要说的问题依旧发生在使用lcut进行单元测试的过程中。一位同事在编译使用了mock函数的测试用例代码时出现了&amp;#34;multiple definition of &amp;#39;xxx&amp;#39;“的错误。这里简单模拟其场景如下： /\* testall.c \*/ /\* mock lib function \*/...</description></item><item><title>lcut 0.3.0版本发布</title><link>https://tonybai.com/2012/04/10/lcut-0-3-0-release/</link><pubDate>Tue, 10 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/10/lcut-0-3-0-release/</guid><description>lcut单元测试框架在我的项目中应用已经有一段时间了，项目组的同事对lcut的使用也是越来越熟悉，这不今天一位同事还提出了一个新需求，需求大致是这样的。 在实际项目中，经常遇到这类情况： int bar(…) { int ret; ret = foo(…); /\* assert ret \*/ … ret = foo(…); /\* assert ret \*/ … ret = foo(…); ...</description></item><item><title>如何加入Linux内核开发社区(7)</title><link>https://tonybai.com/2012/04/09/how-to-participate-linux-community-section-7/</link><pubDate>Mon, 09 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/09/how-to-participate-linux-community-section-7/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第七章、第八章以及第九章节的中译文。 **7、高级主题** 但愿此时此刻，你已经理解了内核开发过程是如何进行的。但仍然还有很多东西要学习！...</description></item><item><title>如何加入Linux内核开发社区(5)</title><link>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-5/</link><pubDate>Thu, 05 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-5/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第五章节的中译文。 **5、发布补丁** 迟早有一天你的工作将提交到开发社区进行评审，并最终合入内核主线。不出所料，内核开发社区在发布补丁...</description></item><item><title>如何加入Linux内核开发社区(6)</title><link>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-6/</link><pubDate>Thu, 05 Apr 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/04/05/how-to-participate-linux-community-section-6/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第六章节的中译文。 **6、将补丁工作进行到底** 此时此刻，你已经遵循了这里到目前为止给出的所有指导原则，并且由于你自己的工程技能，你已...</description></item><item><title>如何加入Linux内核开发社区(4)</title><link>https://tonybai.com/2012/03/31/how-to-participate-linux-community-section-4/</link><pubDate>Sat, 31 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/31/how-to-participate-linux-community-section-4/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第四章节的中译文。 **4、正确地编写代码** 关于那个可靠的面向社区的设计过程我们已经说的够多了，任何内核开发项目的证据都是最终的代码。...</description></item><item><title>如何加入Linux内核开发社区(3)</title><link>https://tonybai.com/2012/03/29/how-to-participate-linux-community-section-3/</link><pubDate>Thu, 29 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/29/how-to-participate-linux-community-section-3/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。 下面是该文章第三章节的中译文。 **3、早期规划** 当考虑一个Linux内核开发项目时，人们可能很想尽快投入并开始编码。但和任何重要的项目一样，推动...</description></item><item><title>如何加入Linux内核开发社区(2)</title><link>https://tonybai.com/2012/03/28/how-to-participate-linux-community-section-2/</link><pubDate>Wed, 28 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/28/how-to-participate-linux-community-section-2/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第二章节的中译文。 **2、内核开发过程是如何进行的** 在20世纪90年代初，当时的Linux内核开发是一件非常松散的事情，涉及的用户和开...</description></item><item><title>如何加入Linux内核开发社区(1)</title><link>https://tonybai.com/2012/03/27/how-to-participate-linux-community-section-1/</link><pubDate>Tue, 27 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/27/how-to-participate-linux-community-section-1/</guid><description>本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本)，原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第一章节的中译文。 **1、内核开发过程指南** 本文旨在帮助那些在参与开发社区(community)工作过程中遭遇些许挫折的开发人员(以及...</description></item><item><title>也谈Linux Kernel Hacking – Kconfig与Kbuild</title><link>https://tonybai.com/2012/03/18/linux-kernel-hacking-series-kconfig-and-kbuild/</link><pubDate>Sun, 18 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/18/linux-kernel-hacking-series-kconfig-and-kbuild/</guid><description>**_挖掘简单现象背后的复杂本质。_**– Tony Bai^\_^ 上文讲到Linux Kernel的配置和编译十分简单，甚至简单到可以与一个用户层应用相媲美。这一切都是因为Linux Kernel实现了一套易于使用、变更和后期维护的配置和编译体系。要知道最新Linux Kernel版本的代码量可是千万级别的，并且模块众多，其背后的配置和编译体系一定不那么简单，这次我们就来尝试Hack一下这套体...</description></item><item><title>也谈Linux Kernel Hacking – 内核配置、编译与安装</title><link>https://tonybai.com/2012/03/15/linux-kernel-hacking-series-kernel-config-compile-and-install/</link><pubDate>Thu, 15 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/15/linux-kernel-hacking-series-kernel-config-compile-and-install/</guid><description>_**Linux Kernel之于C程序员，就好比世界之巅珠穆朗玛之于专业登山客。**_ — Tony Bai^\_^ 作为到目前为止最为成功的开源项目，Linux Kernel总是散发着无穷的魅力，就好比那珠穆朗玛，让人魂牵梦绕，心潮澎湃并总是想尝试征服。 记得2006年初我曾花了些时间研究Linux Kernel，但后来迷失在了Linux Kernel引导阶段，无法自拔，最终选择了&amp;#34;知难而退&amp;#34;...</description></item><item><title>C语言编码风格和标准</title><link>https://tonybai.com/2012/03/07/the-chinese-translation-of-recommended-c-style-and-coding-standards/</link><pubDate>Wed, 07 Mar 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/03/07/the-chinese-translation-of-recommended-c-style-and-coding-standards/</guid><description>近期在为产品线的知识库编写一些指南类的文档，其中有一项就是对现有的C语言编码规范进行一些修订。为了&amp;#34;有米下锅&amp;#34;，我还特意在网上找了一些相关资料。关于C语言编码风格和标准的资料大多都成稿于上个世纪90年代，也就是在C90发布之后的若干年里；在C99发布后，部分资料根据最新的规范做了修订，但也有些资料认为C99对整体风格影响不大，也就保持了原样。 在这些资料中，我重点关注了一下这份文档《Recomme...</description></item><item><title>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>为buildc添加安装包制作相关功能</title><link>https://tonybai.com/2012/02/10/add-packing-feature-to-buildc/</link><pubDate>Fri, 10 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/10/add-packing-feature-to-buildc/</guid><description>在&amp;#34;也谈C应用安装包制作与部署&amp;#34;一文中，我提到了为每一个源码工程建立单独的安装包制作工程(setup project)的想法，这两天我就一直在折腾这件事儿^\_^。 最初我并没有想去搞一个通用的安装包制作工具，只是为一个现有的源码工程建立了一个试验性质的安装包工程，并实现了其构建脚本(build.py)。但之后考虑到各个项目都要建立一个对应的安装包工程，安装包工程的构建脚本build.py势必会沦...</description></item><item><title>为buildc添加setup脚本</title><link>https://tonybai.com/2012/02/07/add-setup-script-for-buildc/</link><pubDate>Tue, 07 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/07/add-setup-script-for-buildc/</guid><description>buildc在发布0.1.0版时并没有做好安装脚本，当时的建议是直接下载0.1.0的源码包或svn export/checkout源码包，并手工将buildc目录位置加入到用户的PATH环境变量中。近期buildc计划正式投入到项目中使用，为了方便大家安装以及以后的统一升级维护，我花了些时间给buildc加上了setup脚本。 Python有标准的程序分发方案，不过我对这些了解不多。buildc本...</description></item><item><title>也谈C应用安装包制作与部署</title><link>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</link><pubDate>Wed, 01 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</guid><description>虽然部门一直在做C应用，但这么多年来，在C应用的安装包制作以及部署方面做得还是很初级，可以说还没有达到规范的程度。各个产品线的C应用安装包种类多样，水平参差不齐：有些产品的源码包即是安装包，把源码包拿到生产环境下编译后使用；有的项目则将编译好的目标文件(.o)以及第三方库放在安装包中，在生产环境下重新链接生成可执行文件；有的组则稍微专业一些，安装包中放的是编译好的可执行文件，但在目标主机上安装和执...</description></item><item><title>也谈C语言应用构建</title><link>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</link><pubDate>Tue, 17 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</guid><description>构建是软件开发过程中最常见的活动之一，也是很容易被忽视的环节。规范以及高效的构建对软件开发过程而言是大有裨益的。C语言并非一门年轻的语言，其历史已甚为悠久了(相对于还年轻的IT领域^\_^)。从C语言诞生以来，市面上存在的C语言应用何止千千万万。这些C应用的源码组织形式种类万千，从最简单的单个源文件，到复杂的诸如Apache httpd server这样庞大的Project。不过无论这些C应用的源...</description></item><item><title>C语言项目构建管理辅助工具 – buildc</title><link>https://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/</link><pubDate>Thu, 08 Dec 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/</guid><description>这几年我一直从事C语言项目的开发。这些项目的规模都不算小，少则十几万代码，多则几十万行代码，至少也都算得上是中型项目吧。项目构建工具使用的是传统的Make工具，构建脚本都是自行编写的，构建时直接在顶层目录下敲入make即可。 这种传统的构建方式其实是很耗时费力的。比如执行make之前你需要根据项目代码的实际路径重新设定一些环境变量或修改Makefile中的某些标识路径的变量；你还要将项目依赖的各种...</description></item><item><title>利用缓冲区溢出漏洞Hack应用</title><link>https://tonybai.com/2011/12/01/hack-app-by-buffer-overflow-leak/</link><pubDate>Thu, 01 Dec 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/12/01/hack-app-by-buffer-overflow-leak/</guid><description>我们在平时编码过程中很少考虑代码的安全性(security)，与正确性、高性能和可移植性相比，安全性似乎总被忽略。昨天从安全性角度泛泛地Review了一下现有的代码，发现了不少具有安全隐患的地方。我们的程序员的确缺乏系统地有关安全编码方面的训练和实践，包括我在内，在安全编码方面也都是初级选手，脑子中对安全性编码缺乏系统的理解。 市面上讲解编码安全性方面的书籍也不是很多，在C编码安全性方面，CERT...</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>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>也谈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>让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>通过精减来改善代码</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/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>应对库接口原型变更</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>使用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>一个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>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/04/21/buy-second-hand-books-on-the-internet/</link><pubDate>Tue, 21 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/21/buy-second-hand-books-on-the-internet/</guid><description>计算机类图书&amp;#34;贵&amp;#34;就一个字，而且计算机领域知识更新快、新书迭出；程序员们为了跟上知识更新的步伐，不得不花上大把银子采购图书，久而久之，哪个程序员的家里没有几箱子书呢^\_^。以前我买书的哲学也是非新书不买，但自从同事告诉我互动出版网有&amp;#34;二手书&amp;#34;可淘之后，我就渐渐喜欢上网上淘二手书了。 China-pub上所谓的&amp;#34;二手书&amp;#34;，实际上和新书也没差多少，基本都在9成新，有些书可以说还是“崭新”的，但是这些...</description></item><item><title>简说GLIBC strncpy实现</title><link>https://tonybai.com/2009/04/15/glibc-strncpy-source-analysis/</link><pubDate>Wed, 15 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/15/glibc-strncpy-source-analysis/</guid><description>比较以下两组代码，你认为哪组运行的更快些呢？ Example1：         int n   = 100;         int n4  = n &amp;gt;&amp;gt; 2;         int i   = 0; int a\[100\]; for (i = 0; i = 4)         {                 size\_t n4 = n &amp;gt;&amp;gt; 2; /\* n4 = n / 4， n...</description></item><item><title>GLIBC strlen源代码分析</title><link>https://tonybai.com/2009/04/11/glibc-strlen-source-analysis/</link><pubDate>Sat, 11 Apr 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/04/11/glibc-strlen-source-analysis/</guid><description>直接操作C标准库提供的字符串操作函数是有一定风险的，稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库，但是测试之后才发现自己的实现有很大的性能缺陷。 在Solaris上初步做了一个简单的性能比对，以下是得到的性能数据(以strlen的数据为例)： 当传入的字符串长度为10时，执行100w次： strlen 执行时间是：32762毫秒 my\_strlen执行时间是：49183...</description></item><item><title>有关单元测试的“只言片语”</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>也谈软件调试</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>“扶正”Bash Shell</title><link>https://tonybai.com/2009/02/27/make-bash-my-default-shell/</link><pubDate>Fri, 27 Feb 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/02/27/make-bash-my-default-shell/</guid><description>近日，Bash Shell正式发布了其4.0版本，该版本可以看作3.x的bugfix版，同时增加了诸如&amp;#34;Associative Arrays&amp;#34;等新特性。在Bash Shell的官方站点你可以下载到最新的4.0版本，不过在GNU的Bash主页上，似乎还找不到4.0版本的所在。Bash作为Linux系统默认Shell，一直受到广泛关注，而且它还是目前几大Shell(Bourne Shell, C Sh...</description></item><item><title>CSCOPE使用中问题小解</title><link>https://tonybai.com/2009/02/23/solve-some-problems-when-using-cscope/</link><pubDate>Mon, 23 Feb 2009 00:00:00 +0800</pubDate><guid>https://tonybai.com/2009/02/23/solve-some-problems-when-using-cscope/</guid><description>拥有了某种工具，往往不等于就能使用好这种工具。拥有工具简单，用好工具、发挥出最大作用则较难。CSCOPE让VIM的使用者有了与SourceInsight&amp;#34;平起平坐“的机会，但是能否将CSCOPE的功能发挥出来还要看你是如何使用它了。 自从VIM”重装上阵“以后，我一直在使用CSCOPE。在使用过程中还是发现了一些”别扭“的事情。一般我会在一个大型Project的源代码的顶层目录使用CSCOPE -...</description></item><item><title>VIM“重装上阵”</title><link>https://tonybai.com/2008/12/30/in-depth-study-vim/</link><pubDate>Tue, 30 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/30/in-depth-study-vim/</guid><description>国内很多学习Python的人都喜欢看&amp;#34;A Byte of Python&amp;#34;，这是一本由印度小伙儿Swaroop C H写的书，之所以受到大家关注和欢迎，想必其简单而实用的写作风格是其中的重要原因吧，作为入门书很适合。我的Laptop中就有一本中文翻译版，不过书中用的还是Python 2.3.4版本。本月3日(2008-12-3)Python 3.0 Release版祭出，Swaroop C H也在其...</description></item><item><title>使用Scons改造现有项目</title><link>https://tonybai.com/2008/12/21/use-scons-to-build-current-projects/</link><pubDate>Sun, 21 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/21/use-scons-to-build-current-projects/</guid><description>今天是冬至，也是入冬以来感觉最冷的一天，毫不夸张的说：你一张嘴，牙就冻上了。上午LP在家收拾卫生，我继续用Scons改造现有的项目。下午出去理发，头发长长了后，似乎会造成思维迟钝^\_^。 试验性的用Scons改造现有的project，过程中对Scons了解又多了一些。上篇文章对Scons的性能没有给出定论，经过对Scons的深入后，发现Scons在执行初始时的性能的确不够快，这是因为Scons启...</description></item><item><title>发掘Scons</title><link>https://tonybai.com/2008/12/14/learn-scons/</link><pubDate>Sun, 14 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/14/learn-scons/</guid><description>发现或者说知道SCons是缘于Google的comp.lang.c group上的一则名为&amp;#34;Best Build Tool for large C projects &amp;#34;的帖子，帖子的作者列出了11条他认为&amp;#34;Best Build Tool&amp;#34;应该具备的特点，并欲找到这样的Build Tool。在该帖子的回复中，有人提到了Scons，说来惭愧，这是我第一次听说到有这样一个工具。一直在Unix下编写C程序...</description></item><item><title>常量类型的识别-一个小例子</title><link>https://tonybai.com/2008/12/02/an-example-for-recognizing-the-const-variable/</link><pubDate>Tue, 02 Dec 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/12/02/an-example-for-recognizing-the-const-variable/</guid><description>今天闲时写了一个Demo测试程序，目的：测试64位编译下使用mmap映射共享内存的能力。程序很简单，大致如下结构： #define MAP\_SPACE\_SIZE  (4\*1024\*1024\*1024) unsigned long int ms\_sz = MAP\_SPACE\_SIZE; …. …. ptr = mmap( NULL, ms\_sz, PROT\_READ|PROT\_...</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>代码评审·CC2e·断言·其它</title><link>https://tonybai.com/2008/11/13/coding-review-and-cc2e-and-assertion-and-others/</link><pubDate>Thu, 13 Nov 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/11/13/coding-review-and-cc2e-and-assertion-and-others/</guid><description>一口气读了七章&amp;#34;Code Complete 2nd(以下称CC2e)&amp;#34;中的内容，从第七章的&amp;#34;高质量的子程序&amp;#34;到第十三章的&amp;#34;不常见的数据类型&amp;#34;。之所以一口气读这么多，是因为被其中的内容吸引了。这两天的下午一直在做代码评审，所以晚上看CC2e的时候，思维不停的在项目代码和书中内容之间跳转。一直把&amp;#34;代码大全2nd&amp;#34;当作一门百科全书式的手册类图书，买回来后一直陈放在书架上没有问津。直到今天在考虑一个关于断...</description></item><item><title>分布式编译让你的工作更高效</title><link>https://tonybai.com/2008/10/14/distributed-compiling-make-you-work-more-effectivly/</link><pubDate>Tue, 14 Oct 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/10/14/distributed-compiling-make-you-work-more-effectivly/</guid><description>随着工程代码量的增加，往往完整的编译一次Proj消耗的时间可能足够你喝两杯咖啡了，我现在build一次我所在proj的代码需要5分多钟，这是很痛苦的，颇让人懊恼的。为了解决这个工作中的别扭事儿，我在网上搜寻了一番，找到了distcc这个分布式编译工具。 先看看distcc能帮助我节省多少时间吧。我在公司的一台Sun SPARC Solaris9主机下对整个项目源代码按照以前的编译方式进行了一次bu...</description></item><item><title>领导意志</title><link>https://tonybai.com/2008/10/11/the-leader-will/</link><pubDate>Sat, 11 Oct 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/10/11/the-leader-will/</guid><description>昨天是周五，按照工作计划，上午和组内同事做个人阶段性目标沟通。在与一位曾经在国外公司里做过项目的同事沟通时，他给我讲了这么一个故事：某一年的圣诞节前夕(圣诞节在西方人眼里是地位最高的节日了吧)他所在的那家公司的经理预感到圣诞节那天他们公司的网站的访问量激增的可能性会很大，为了保证网站在那圣诞节那天能&amp;#34;挺住&amp;#34;，他要求手下的人对网站进行一次压力测试，并决定让手下用jmeter来做这件事情。手下人没有异...</description></item><item><title>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>关于宏定义切换以及屏蔽的例子</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>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/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/22/difficult-to-reform-in-current-project/</link><pubDate>Tue, 22 Jan 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/01/22/difficult-to-reform-in-current-project/</guid><description>自从去年年初搬到新办公室后，各个项目组都分到了各个独立的空间了，平时&amp;#39;抬头不见低头见&amp;#39;的情形减少了，随意拉把椅子坐下来谈技术的情形也减少了，随之而来的是项目组&amp;#39;各自为战&amp;#39;，经过近一年的发展，各个项目组在局部的发展上已经出现差异了。 在现在带的这个项目之前，曾经有意识的去了解了一下其他组的技术发展情况，主要是针对Java开发这块。了解的结果让我意识到我们组的Java开发已经&amp;#39;落后&amp;#39;了。其实我们组的J...</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>也谈’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>面对'错误'的抉择</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>在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/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/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>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>编译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>'Write Great Code'书中的一处错误</title><link>https://tonybai.com/2006/12/26/an-error-of-write-great-code/</link><pubDate>Tue, 26 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/26/an-error-of-write-great-code/</guid><description>如发现本站页面被黑，比如：挂载广告、挖矿等恶意代码，请朋友们及时联系我。十分感谢！ 商务合作请联系bigwhite.cn AT aliyun.com 欢迎使用邮件订阅我的博客 输入邮箱订阅本站，只要有新文章发布，就会第一时间发送邮件通知你哦！ 名字： 邮箱: 这里是 Tony Bai的个人Blog，欢迎访问、订阅和留言！ 订阅Feed请点击上面图片。 如果您觉得这里的文章对您有帮助，请扫描上方二维...</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/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/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>追求'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>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/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/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>理解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>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>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>一个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>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>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>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>