IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

最新文章

采集自各技术站点的近期文章。

IT 开发者/ 2012-09-18 23:34:10 / 累计浏览 1,804

一个简单的例子让你认识测试驱动

这篇讲的是用一个非常具体的例子,带你理解“测试驱动开发”(TDD)到底是什么。 文章没有从理论开始,而是直接模拟了一个开发“用户登录”模块的场景。作者先展示了传统“先写功能代码,再补测试”的思路,并指出了它可能带来的测试遗漏和设计问题。接着,演示了TDD核心的“红-绿-重构”循环:第一步,先写一个最简单的失败测试(红灯),明确一个微小的功能点;第二步,写最少的代码让测试通过(绿灯);第三步,重构代码以提升设计。通过这个小例子,TDD“测试先行”、“小步前进”、“持续设计”的特点变得非常直观。 文章最巧妙的地方在于,它让读者看到,TDD不仅仅是一种测试技术,更是一种引导你写出高内聚、低耦合、可测试代码的设计工具。当你看到最后那个结构清晰、易于维护的登录模块时,就自然明白了这种开发方式的价值所在。

本机暂存
IT 算法/ 2012-09-18 23:32:04 / 累计浏览 3,654

数据结构之treap

这篇从二叉搜索树在极端情况下可能退化成链表、失去效率优势的经典问题出发,引出了一个巧妙的设计:treap。它名字本身就是“树”与“堆”的合体,其核心思想是在每个节点上附加一个随机生成的优先级。通过维护“按关键值排序是一棵二叉搜索树,同时按优先级排列又是一个大顶堆”这两个性质,它用概率避免了树的不平衡问题。 文章解释了这种混合结构的妙处:当进行插入或删除操作时,treap会通过旋转来同时维护这两个性质,而随机的优先级使得树的结构在期望意义上保持平衡。相比严格的平衡树(如红黑树)实现更简单,相比普通BST又能保证较好的性能。对于需要频繁动态插入和删除,同时希望实现相对简洁、避免最坏情况的场景,treap是一个很有吸引力的折中方案。

本机暂存
IT 后端/ 2012-09-18 23:26:56 / 累计浏览 2,867

正则表达式的零宽断言

这篇讲的是正则表达式里一个容易被忽略、但极其强大的部分——零宽断言。文章从“如何匹配单词但不包括引号里的内容”这类实际问题出发,引出了正向与负向零宽断言的核心概念。作者没有停留在概念层面,而是用大量实例详细拆解了`(?=...)`、`(?!...)`、`(?<=...)`、`(?

本机暂存
IT 后端/ 2012-09-18 23:26:15 / 累计浏览 2,715

write(2)在磁盘满的时候的行为

write(2)这个看似简单的系统调用,在磁盘满时的行为其实相当微妙,且容易让人困惑。这篇技术博客深入剖析了其中的关键细节。 文章的核心发现是,当磁盘空间耗尽时,write(2)并不总是立即返回错误。它的行为取决于几个关键变量:文件是否以`O_NONBLOCK`模式打开,以及写入的是否是常规文件或管道。对于常规文件,在非阻塞模式下,内核可能会先“接纳”数据,将其放入内核缓冲区,此时调用甚至可能立即返回成功,但随后的`fsync`或`close`才可能触发真正的空间不足错误(ENOSPC)。而更令人警惕的是,如果写入的是管道,并且使用`O_NONBLOCK`,write(2)可能直接返回`EAGAIN`,这意味着数据并未被写入,存在丢失风险。 作者详细拆解了内核`generic_perform_write`函数的执行路径,解释了这些不同行为背后的实现逻辑。这篇文章的价值在于,它澄清了开发者常有的“write成功即数据落盘”的误解,明确指出了在磁盘I/O的边界条件下,可靠性需要依赖更严格的检查(如fsync)和对不同文件描述符特性的深入理解。

本机暂存
IT 算法/ 2012-09-18 23:24:12 / 累计浏览 2,745

Linux 内核中的 KMP 实现

这篇讲的是Linux内核里一个你可能没想到的细节:它自己也实现了一套KMP算法。当我们谈到内核,常想到进程调度、内存管理,但字符串搜索同样是基础需求,无论是解析命令行参数还是处理网络协议。代码就藏在`lib/ts_kmp.c`里。 文章带我们看了这套实现的思路。它并非对教科书算法的简单照搬,而是充分考虑了内核环境的特殊性:比如如何与内核的内存管理机制配合,如何在内核态下追求高效与安全的平衡。作者拆解了其数据结构与函数逻辑,展示了从模式串预处理到文本匹配的完整流程,让我们看到一个经典算法是如何在贴近底层的场景中“落地生根”的。 读下来你会发现,即使是处理字符串搜索这样的“小事”,内核开发者也展现了其严谨和巧妙的设计,确保既可靠又高效。对于想了解内核实现细节的读者,这是一个很好的切入点。

本机暂存
IT DevOps/ 2012-09-18 23:21:25 / 累计浏览 2,434

KVM 中搭建 VLAN 和 IPv6 环境

这篇讲的是在KVM虚拟化环境中,如何超越默认的基础网络配置,去搭建一个更贴近真实生产环境的复杂网络。作者从最熟悉的默认环境说起——通过virt-manager一键创建的guest,都挂在同一个virbr0网桥下,靠host的NAT上网。这套方案简单直接,但面对需要网络隔离或测试IPv6协议栈的场景时,就显得力不从心了。 文章的重心在于“进阶”:具体展示了如何为KVM guest配置VLAN,实现网络分段隔离,以及如何为虚拟机分配IPv6地址。这意味着作者不仅需要处理宿主机的网桥、路由设置,还得深入到每一台虚拟机的内部网络配置中,确保VLAN标签和IPv6邻居发现等机制正常工作。 对于运维人员或需要搭建测试环境的开发者来说,这篇文章提供了一套可复现的方案。它把虚拟化网络的搭建,从“开箱即用”推向了“按需定制”,帮助读者理解在KVM上构建一个多层、多协议网络环境的核心步骤与关键考量。

本机暂存
IT DevOps/ 2012-09-18 23:19:21 / 累计浏览 4,821

我的内核配置文件

这篇讲的是在 KVM 虚拟化环境中进行内核测试时一个常见却棘手的“坑”:直接将在宿主机(Host)编译的内核放到客户机(Guest)里运行,往往会失败。 作者从实践出发,点明了问题背后的两个核心原因。首先是硬件环境的差异,导致 Host 与 Guest 对内核的配置(.config)需求不同。其次是更隐蔽的模块依赖问题,即使将内核模块打包进了 initramfs,它们在运行时仍然需要被正确安装到 `/lib/modules/uname -r` 目录下才能被识别和加载。 这篇文章的价值在于,它没有停留在抱怨问题,而是直指问题的根源——内核配置的适配性与模块的完整部署。对于需要在虚拟环境中频繁测试新内核的开发者或运维人员而言,理解这两个关键点,是确保 Guest 能顺利启动和稳定运行的基础。它提醒我们,虚拟化环境下的内核部署,远不止简单的文件复制那么简单。

本机暂存
IT DevOps/ 2012-09-18 23:17:11 / 累计浏览 3,991

Linux的IO调度器-CFQ

作者从控制IO带宽的实际需求出发,发现关于Linux IO调度器CFQ的中文资料相当稀缺,于是决定亲自撰写一个系列文章,填补这一空白。这篇系列开篇将首先厘清CFQ的基本概念——它作为Linux内核的一种IO调度策略,主要通过为每个进程分配时间片和队列来公平地调度磁盘读写请求,尤其适合多任务桌面环境。作者预告,后续文章将深入解析CFQ的各项可调参数及其对性能的影响,剖析其内部架构设计,并探讨如何与cgroup子系统结合以实现更精细的IO资源控制。整个系列旨在为需要进行IO性能调优的工程师提供一份清晰实用的中文指南。

本机暂存
IT DevOps/ 2012-09-18 23:14:21 / 累计浏览 3,296

free命令中的buffers和cached

这篇讲的是Linux系统中free命令输出结果里buffers和cached字段的区别。作者从同事的日常疑问出发,分享了对这两个内存管理概念的深入解析,旨在帮助读者准确理解系统内存状态。 在Linux的内存管理中,buffers指的是块设备缓冲区,主要用于缓存文件系统元数据和块I/O操作的数据,比如磁盘写入的临时存储;而cached则是页缓存,用于缓存已读取的文件内容,以提升重复访问的性能。文章详细对比了它们的实现机制:buffers通常与底层磁盘块直接关联,数据可能在系统重启后丢失;cached则基于内存页,可以持久化存储文件内容,即使进程结束后也可能保留。 关键差异在于,buffers更侧重于优化原始磁盘操作,适合频繁的读写场景,如数据库或日志处理;cached则专注于文件级别的缓存,适合多次读取相同文件的应用

本机暂存
IT 后端/ 2012-09-18 23:12:04 / 累计浏览 6,621

玩转Protocol Buffers

这篇讲的是 Protocol Buffers 为何能成为众多开发者首选的数据序列化工具。作者从实际开发中数据交换与存储的常见需求出发,深入浅出地讲解了 Protobuf 的核心优势:相比 JSON 等文本格式,它采用二进制编码,体积更小、解析速度更快;其强类型特性和清晰的 `.proto` 定义文件,能有效减少前后端或不同服务间的沟通成本与歧义。文章详细对比了 Protobuf 与 JSON 在可读性、灵活性及性能上的关键差异,指出当项目对传输效率、内存占用或类型安全有较高要求时,Protobuf 是更优的选择。 此外,文中通过实例演示了如何定义 `.proto` 文件、利用工具生成对应语言的代码,并在实际项目中集成,展现了其跨语言支持的强大能力。无论是微服务间的 RPC 通信,还是需要高性能序列化的本地数据缓存场景,Protobuf 都提供了可靠的解决方案。通过清晰的对比和实战示例,文章不仅阐明了技术优势,也为读者在不同场景下选择合适的数据交换格式提供了实用指南。

本机暂存
IT 后端/ 2012-09-18 23:04:25 / 累计浏览 2,014

离奇“undefined reference”错误分析与解决方案

这篇讲的是一个挺隐蔽的 C/C++ 链接错误排查故事。作者遇到的“undefined reference”并不罕见,但情况有点离奇:明明用 `-l` 指定了库,`ld -verbose` 也证实库文件能被找到,链接时却依然报错,找不到目标函数。 文章没有停留在表面现象,而是深入到了链接器的工作细节。作者从库的生成、链接顺序,一直追查到符号的可见性。最终发现的根因是,虽然库文件存在,但函数符号可能没有被正确导出(比如未在头文件中声明为 `extern "C"`),或者因为链接器处理库的依赖顺序问题,导致符号未能被正确解析。 这篇分享的价值在于,它超越了“链接库文件”的常规步骤,展示了当基础操作看似正确时,如何一步步从链接器的视角反向追踪问题。对于常和底层构建打交道的开发者来说,这种对工具链细节的深挖思路,往往能解决那些最让人头疼的“离奇”问题。

本机暂存
IT 后端/ 2012-09-17 23:15:39 / 累计浏览 2,052

hadoop笔记 (2):pipes例子分析 (1)

这篇讲的是Hadoop中一个相对小众但很实用的C++接口——Pipes。由于官方文档的缺失,作者选择了一条很实际的路径:直接从Hadoop自带的示例代码入手,一步步拆解其工作原理。 文章基于Debian 6 amd64和Hadoop 1.0.3的环境,没有空谈理论,而是带着读者走进具体的代码文件。分析的重点在于Pipes如何作为桥梁,让C++编写的Mapper和Reducer能与Java框架进行通信和协作。作者梳理了从任务启动、数据流传输到结果汇总的关键流程,揭示了框架背后如何用序列化和网络通信封装了分布式计算的复杂性。 对于想在Hadoop生态里使用C++,或者对跨语言RPC实现感兴趣的开发者来说,这篇从实际例子出发的梳理,比零散的片段信息更能帮你建立起对Pipes工作机制的整体认识。

本机暂存
IT 前端/ 2012-09-17 23:13:53 / 累计浏览 4,039

position:sticky介绍

这篇讲的是 CSS 里一个非常实用的属性——position: sticky。它解决了传统 Web 布局中一个很常见的痛点:我们经常需要让某些元素(比如导航栏、表头、侧边栏)在页面滚动到特定位置时“粘”在视口,但传统的 fixed 定位会让元素脱离文档流,可能破坏下方内容的布局。 作者从 position: sticky 的工作原理出发,清晰地解释了它是如何巧妙地结合了 relative 和 fixed 定位的特性的。简单来说,元素在达到你设定的滚动阈值(比如 top: 0)之前,表现为正常的相对定位;一旦超过这个阈值,它就会“切换”为固定定位,牢牢地停留在视口边缘,直到它的父容器滚动结束。 文章通过对比,点明了它与传统方案的关键差异:sticky 元素依然占据文档流空间,不会像 fixed 定位那样导致后续内容突然“跳上来”,这使得布局更加平滑和符合直觉。它非常适合用来实现那些需要跟随滚动、但又不能影响整体结构的界面组件。 尽管当时该特性主要在 WebKit 内核浏览器中实现,但文章清晰地介绍了它的语法和核心应用场景,为开发者提供了一种更优雅的布局解决方案,避免了以往需要依赖复杂 JavaScript 才能实现的效果。

本机暂存
IT 设计/ 2012-09-17 19:07:44 / 累计浏览 3,038

微信对移动应用设计的影响

这篇讲的是微信如何重塑移动应用设计的行业标准。作者以这款拥有亿级用户的现象级应用为切入点,指出微信不仅凭借其功能迭代持续吸引关注,更在市场表现上占据了主导地位——正如文中提及的2012年数据,其用户数已达两亿规模。文章的核心观点在于,微信每一次更新带来的新颖甚至引发争议的功能,都在潜移默化中影响和塑造着其他移动应用的设计思路与方向。通过分析微信作为“企鹅二代”的成功路径,文章揭示了这款应用在用户体验、功能创新和市场策略上的示范效应,为思考移动产品设计趋势提供了极具参考价值的案例。

本机暂存
IT DevOps/ 2012-09-17 19:04:47 / 累计浏览 2,177

hadoop笔记 (1):安装和配置

这篇笔记记录了在三台Debian 6机器上搭建Hadoop 1.0.3集群的全过程。作者从实际操作出发,提到虽然官方文档详细,但按部就班仍难以快速构建出一个可用的环境。核心挑战在于如何高效地把理论步骤变成可运行的集群。 最终,作者通过参考一篇适用于旧版本(0.20)的教程,成功解决了配置上的困惑,并验证了其方法在1.0.3版本上依然有效。文章具体展示了环境选择(OpenJDK-6)、遇到的配置瓶颈以及最终得以运行的解决方案,为手头有类似机器资源、想快速跑通Hadoop环境的读者提供了一份经过验证的、可复现的实践记录。

本机暂存
IT 数据库/ 2012-09-17 19:02:19 / 累计浏览 3,897

mysql 初探

这篇讲的是,一位有着多年理论学习但缺乏实战的开发者,如何重新打开 MySQL 的世界。文章从作者“温故知新”的视角出发,并未深入某个复杂案例,而是像一位耐心的向导,带读者重新梳理那些最常被提及也最易被忽略的基石概念。 作者回顾的焦点落在了 MySQL 最核心的两个支柱上:底层的 B+ 树索引结构如何决定了查询的效率,以及不同的事务隔离级别在并发场景下各自守护了什么、又可能牺牲了什么。对于许多刚接触数据库或工作后疏于回顾的开发者而言,这些概念或许都听过,但其精妙的设计与权衡细节却容易在日常使用中变得模糊。文章的价值恰恰在于,它以一种“回到起点”的坦诚,把这些知识点重新擦亮,并通过简明的逻辑将其串联。 它没有复杂的架构图或性能压测数据,却为许多“知其然不知其所以然”的日常操作提供了一个理解的基础框架。当再次面对一条慢查询日志或一个诡异的并发 bug 时,重温这些根本性的设计,或许能让人更快地锁定问题所在。

本机暂存
IT 移动开发/ 2012-09-16 23:30:33 / 累计浏览 1,853

主流移动设备的屏幕参数

这篇讲的是,作者在iPhone 5发布之际,出于好奇去追溯历代iPhone的屏幕参数,却在维基百科上意外发现了一个堪称“宝藏”的页面——主流移动设备的屏幕参数大全。这个发现给他的惊喜,甚至超过了新手机本身。 这份资料的价值在于其系统性和全面性。它并非只罗列某一款设备,而是横向汇总了市面上主流移动设备的屏幕核心数据,包括屏幕分辨率、宽高比、PPI(像素密度)、屏幕比例以及CSS像素比等关键指标。这些看似枯燥的数字,实际上是进行移动端网页开发,尤其是响应式设计时,至关重要的参考依据。 作者将这个维基百科页面直接分享了出来,省去了开发者们四处搜集和整理碎片信息的麻烦。如果你正面临不同屏幕尺寸的适配问题,或者想对当前移动设备的显示规格有个整体概念,这份现成的参数列表无疑提供了一条高效的捷径。

本机暂存
IT 设计/ 2012-09-16 23:28:33 / 累计浏览 2,855

审美、有效与情感——关于icon和Logo设计的一些想法

这篇从iWork三个icon的经典争论切入,探讨的是图标与Logo设计中一个微妙却核心的平衡:审美、有效性与情感传递如何共存。作者并非单纯评判哪个更好,而是解构了优秀设计背后的共同逻辑——即如何在方寸之间,同时完成“好看”、“好懂”与“唤起共鸣”这三个看似可能冲突的任务。 文章以具体的案例为锚点,延伸至更广阔的设计原则讨论。例如,它点明了“有效”意味着清晰的功能或品类识别,“情感”则关乎品牌个性与用户连接,而“审美”是让这一切成立的直观吸引力。这种分析超越了纯技法,触及设计决策中的权衡与哲学,对从事产品、视觉或交互设计的读者而言,提供了评估自身作品的新维度。它提示我们,一个真正成功的设计,往往是这三股力量在特定语境下达成的最佳和解。

本机暂存
IT DevOps/ 2012-09-16 23:28:14 / 累计浏览 10,766

每个程序员都应该知道的8个Linux命令

这篇讲的是,程序员在职业生涯中难免要和Linux命令行打交道,你不需要成为专家,但掌握几个核心命令就能高效完成绝大多数任务。文章从实际工作场景出发,精选了8个关键的Linux命令进行讲解。作者强调,熟练运用这些命令后,基本上可以应对任何常见的命令行任务。文章没有停留在罗列命令层面,而是结合了作者自身的使用经验,把工具的实用性和如何上手讲得很清楚,让一个技术点的分享变得具体又接地气。

本机暂存
IT 设计/ 2012-09-16 23:27:23 / 累计浏览 2,586

深度解读网站用户体验三要素(2):别让我想

这篇讲的是用户体验中一个极其根本的原则——“别让我想”。作者从人性中的“懒惰”这个看似负面却真实的特质出发,指出用户的核心诉求:以最小的认知成本完成任务。文章强调,一旦网站的设计让用户感到困惑或被迫学习,他们就会毫不犹豫地转向更简单的替代品。 这个原则深刻地影响着交互设计的方方面面。它要求设计师将复杂逻辑和繁琐步骤隐藏在后台,把清晰、直观、不言自明的界面呈现给用户。其最终目标是让产品的使用过程变得自然而然,仿佛一种本能,用户无需经过刻意思考就能顺畅操作。 作者从用户心理和行为模式入手,提醒所有网站和产品设计者,最高级的设计往往是“隐形的”。这篇文章的价值在于,它促使我们重新审视自己的产品:是否把过多的思考负担甩给了用户?理解了这种心理,才能创造出真正“善解人意”的界面。

本机暂存