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

最新文章

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

IT 后端/ 2014-11-28 12:47:03 / 累计浏览 3,052

Linux内核文件系统挂载分析

作者从mount系统调用的实现过程入手,聚焦于Linux 3.2.0内核,拆解文件系统挂载的底层机制。文章首先厘清了两个核心数据结构:每个挂载的文件系统都对应一个vfsmount,它维护着文件系统在哈希表、父子关系链表以及名字空间中的位置;path结构则封装了目标挂载点与父文件系统的关联。 核心分析围绕一连串的函数调用展开:系统调用服务例程将参数复制进内核后,便交由do_mount处理。它通过kern_path定位挂载点,随后分发至do_new_mount进行常规挂载。后者的关键步骤是通过do_kern_mount获取源文件系统的vfsmount,并经由do_add_mount执行合法性检查,最终调用graft_tree进行装载。 装载的精髓体现在attach_recursive_mnt中。该函数建立父子映射:让子文件系统的vfsmount指向父vfsmount,并链接到父系统中的挂载点dentry。最后的commit_tree则将这一切“落地”:把新vfsmount置入正确的名字空间链表、全局哈希表以及父文件系统的子文件系统列表中。整个过程清晰地揭示,挂载在内核层面的本质,正是将源文件系统的vfsmount结构以严格的层级关系,嫁接到目标文件系统的目录树之中。

本机暂存
IT 后端/ 2014-11-27 13:10:17 / 累计浏览 2,896

通过call_usermodehelper()在内核态执行用户程序

这篇讲的是如何在 Linux 内核中“跨界”执行用户空间的程序。作者从内核开发者常遇到的需求出发,介绍了 `call_usermodehelper()` 这个内核API。 文章指出了它的核心作用:让运行在内核态的代码(比如模块或驱动)能够主动启动并执行一个用户空间的可执行文件或系统命令,就像在 shell 里敲命令一样。作者还提到了一个关键的实现细节:这个函数最终会调用内核的 `do_execve()`,这和用户态的 `execve()` 系统调用在底层“殊途同归”,但调用路径和上下文完全不同。 为了说明如何使用,文章给出了一个加载函数的代码片段示例,演示了调用该API的基本结构。对于需要在内核逻辑中动态触发外部脚本或工具进行日志收集、环境配置等场景,这个接口提供了一条直接通道,理解它有助于编写更灵活的内核模块。

本机暂存
IT 设计/ 2014-11-27 13:04:52 / 累计浏览 4,036

与众不同易,精益求精难 — QQ导航改版设计心得

这篇讲的是QQ导航改版背后的设计思考。作者从一组关于东京电视台在突发新闻时依旧播放日常节目的搞笑图片切入,引出了设计中一个经典的难题:是该追求“与众不同”,还是应该努力“更好”。 文章指出,像东京电视台那样保持独特性,或许能在众多频道中脱颖而出。但对于用户可能只用一两款的互联网产品来说,仅仅标新立异是不够的,关键还是要在基础体验上“更好”。文章结合QQ导航改版的具体背景展开:在网址导航领域,hao123和360导航已形成双寡头格局,而QQ导航的用户结构与它们存在显著差异——过半用户使用时间在2-3年以内,更习惯快速获取内容。 因此,新版设计没有简单追随竞品的“F”型布局,而是基于目标用户的需求关键词(清爽、快速、权威等)和实际使用数据(例如75%用户日浏览网站不足10个),果断地对页面结构进行了简化,将名站导航置于更核心的位置。这展示了在红海竞争中,如何通过深度理解自身用户特质,来找到平衡“差异化”与“体验优化”的设计路径。

本机暂存
IT 后端/ 2014-11-27 13:01:44 / 累计浏览 2,965

一次DNS域名解析问题排查记录

这篇讲的是一个线上服务因DNS解析异常导致调用失败的排查过程。作者从同事反馈curl调用另一个服务接口报错“couldn’t connect to host”入手,通过strace追踪发现,连接实际指向了一台实体机的IP地址,而非预期的VIP。 问题的根源在于新安装的阿里自研DNS解析软件vipserver,它错误地将域名解析到了多台实体机IP。与对方工程师沟通后进一步发现,实体机服务端口是2087,而VIP上监听的是2088,端口不匹配直接导致了连接失败。排查中还发现了一个“隐形干扰者”——nscd的DNS缓存。清空缓存后,之前“正常”的机器也暴露出问题,这解释了为何集群内部分机器表现不一。 最终的处理是暂时关闭vipserver,等待对方完成配置修正。这个案例清晰地展示了,当引入新的服务发现组件时,对解析链路、缓存机制以及上下游端口配置进行同步验证是多么必要。

本机暂存
IT 安全/ 2014-11-27 13:00:25 / 累计浏览 5,431

HTTPS、SSL与数字证书介绍

这篇讲的是HTTPS、SSL与数字证书三者如何协同工作,共同构筑起现代互联网通信的安全基石。作者从安全通信的基本需求出发,清晰地拆解了HTTPS(安全的超文本传输协议)的本质——在HTTP和TCP之间加入一个加密层,而SSL(或其升级版TLS)正是实现这个加密层的关键协议。 文章没有停留在概念罗列,而是深入到了实现机制。它通过一个生动的A与B对话场景,形象地演示了SSL/TLS协议的“握手”过程:如何巧妙地结合非对称加密(用于安全地协商密钥)和对称加密(用于高效地传输数据)来平衡安全性与性能。同时,详细阐述了数字证书的核心作用——它如同网络世界的“身份证”,由权威的证书颁发机构签发,用于验证服务器身份并分发公钥,从而防止中间人攻击。 对于证书的信任链,文章也给出了直观解释:客户端(如浏览器)内置了受信任的根证书列表,只有由这些机构颁发的证书才会被信任。整体而言,这篇文章将抽象的安全概念落到了具体的协议交互与文件验证上,是理解HTTPS工作原理的一篇扎实导读。

本机暂存
IT DevOps/ 2014-11-27 12:59:32 / 累计浏览 3,778

服务器运维:怎样优雅地切割log

这篇讲的是如何优雅地处理服务器日志切割的问题。作者从运维人员常遇到的困境出发,先吐槽了手动移动日志文件的粗暴方式及其风险,接着介绍了写空日志的改良方法,最终引出真正的解决方案——专用的logrotate工具。 文章的核心在于,它不仅推荐了工具,更结合实际生产环境给出了配置思路。作者指出,简单的每日切割在高流量场景下会暴露新问题,比如压缩大量日志时可能瞬间占满CPU,影响服务响应。因此,他提出了一系列具体的优化建议:预估日志产生量、规划存储周期、谨慎评估是否压缩,并在必须压缩时,可以使用taskset和nice指令来分配CPU资源,避免影响业务进程。此外,针对单日志文件过大的情况,文章也提出了按大小或按小时切割的策略。 整篇文章用平实的语言,将日志管理从“能用”提升到了“好用且稳健”的层面,给出了从工具选择到参数调优的完整思考路径。

本机暂存
IT 数据库/ 2014-11-27 12:58:20 / 累计浏览 1,617

使用HBase EndPoint(coprocessor)进行计算

当面对千万、亿级数据量时,对HBase表进行全表扫描来统计行数或分组聚合,会带来巨大的网络与RPC开销。这篇技术分享给出了一个优雅的解法:使用HBase的Endpoint协处理器。 作者的核心思路是,将计算逻辑直接部署到数据所在的RegionServer上执行,只将聚合后的结果返回客户端。这就好比把计算任务“下发”到每个数据分区,避免了海量原始数据的网络传输。文章将这个过程比作一个精简高效的、运行在RegionServer上的MapReduce。 具体实现分为三步:首先定义一个继承自CoprocessorProtocol的计数接口;然后在服务端实现该接口,在Region内完成数据扫描与计数;最后在客户端通过HBase API发起远程调用,并汇总各个Region的统计结果。文章不仅给出了清晰的代码示例,还详细说明了如何通过配置文件或Shell命令来部署这个协处理器。 通过行数统计这个简单例子,文章展示了Endpoint协处理器如何为HBase添加灵活的计算能力,使其成为高效应对大规模数据聚合挑战的利器。

本机暂存
IT 数据库/ 2014-11-27 12:56:39 / 累计浏览 3,165

构建高可用和弹性伸缩的KV存储系统

KV存储系统在现代高并发应用中扮演着关键角色,但经典的Memcached和Redis在运维中常面临容灾困难、数据复制效率低以及在线扩容复杂等挑战。这篇内容从这些实际痛点出发,深入分析了Redis在持久化、主从复制和集群扩展方面的局限,比如主机宕机可能导致数据丢失、全量复制影响性能,以及扩容需要人工干预等。 针对这些问题,文章提出了一套新的分布式架构设计。该系统由路由、存储、管理和搬迁四类节点组成,通过一致性哈希与虚拟节点实现数据均匀分布,并利用心跳检测和自动切换机制来保障高可用。新方案不仅兼容现有协议,还实现了自动容错恢复、负载均衡和弹性伸缩,试图在保证内存级性能的同时,让运维变得更加智能和可靠。 整体来看,这不仅是对现有技术的梳理,更提供了一个从架构层面系统化解决KV存储可用性与扩展性难题的思路,对从事基础架构或缓存设计的工程师有直接的参考价值。

本机暂存
IT 前端/ 2014-11-27 12:53:35 / 累计浏览 2,129

window resize和scroll事件的基本优化

这篇讲的是前端开发中一个常见的性能陷阱。文章从同事在项目中实际遇到的“翻车”现场切入:在低版本IE里,频繁触发的`resize`和`scroll`事件会导致页面卡死。问题的根源在于这两个事件触发频率极高,每次都同步执行复杂计算或DOM操作,会瞬间耗尽浏览器的性能资源。 作者的核心优化思路是“节流”:通过一个定时器,确保在设定的时间窗口(如400毫秒)内,无论事件被触发多少次,实际的处理函数只执行一次。代码示例清晰展示了如何用`setTimeout`和`clearTimeout`来实现这个简单的“节流阀”,这个方案对`resize`和`scroll`事件同样有效。 对于需要监听这些高频事件的场景,尤其是需要兼容老版本IE的项目,这个低成本、高收益的基础优化方法能有效避免页面假死,值得借鉴。

本机暂存
IT 算法/ 2014-11-27 12:51:11 / 累计浏览 3,447

贝尔实验室的历史

这篇讲的是那个诞生了Unix、C语言和晶体管的传奇实验室——贝尔实验室的完整身世。 作者从自己学习Go语言时产生的困惑出发:电话发明者贝尔和实验室到底是什么关系?实验室在AT&T、朗讯、阿朗等不同名字间辗转,其本质是什么?文章沿着电话发明者亚历山大·贝尔1876年创立贝尔电话公司这条线索,一路梳理了其后继者AT&T公司的发展,并重点追踪了隶属于AT&T的贝尔实验室如何成为“科技圣地”,最终在产业变革中被拆分重组的历史脉络。 它理清了从贝尔个人发明到庞大研发机构,再到被并购拆分的完整演变路径。对于想弄明白“贝尔实验室”这个闪耀又复杂的名字背后究竟是一段怎样的公司史与科技史的读者,这篇梳理提供了一个清晰的时间线与故事框架。

本机暂存
IT 开发者/ 2014-11-27 12:46:09 / 累计浏览 4,278

校招经验——写给找工作的同学们

这篇文章里,一位招聘官分享了自己在北大、武大两场校招中,连续三天面试百余名同学后的直观观察。他指出,不少同学能力不错,却在一些关键环节“可惜”地折戟,问题往往出在准备与认知上。 作者将校招流程拆解为笔试、群面和一对一面试,并点出了每个环节的核心考察点。比如,笔试主观题的关键不是解题,而是先“定义问题”,认清出题人设的“局”;群面中,许多人执着于抢“主持”角色,却忽略了面试官在观察团队协作与人岗匹配,扮演好适合自己性格的贡献者同样重要。 尤其值得注意的是,他对比了京汉两地同学在知识面(如对团购业务理解深度)上的差异,并强调了环境不能成为借口,主动通过阅读拓宽见识是可行的。这些基于实战的细节建议,都指向一个核心:求职不仅是技巧比拼,更是对个人视野、应变能力和自我认知的一次综合检验。

本机暂存
IT 后端/ 2014-11-26 23:55:36 / 累计浏览 6,227

C语言结构体里的成员数组和指针

这篇讲的是C语言中结构体成员访问的一个经典误解。作者从微博上一道让程序崩溃的代码题出发,拆解了其中隐藏的底层机制。题目里结构体包含零长度数组 `char s[0]`,通过空指针 `f.a` 访问成员 `s` 时,程序没在 `if` 判断崩溃,却在之后的 `printf` 处崩溃。 文章深入剖析了根源:在C语言里,访问结构体成员本质上是进行“基址 + 编译时确定的偏移量”计算。对于数组成员 `s`,`f.a->s` 操作得到的是这个数组的相对地址(通过 `lea` 指令实现),所以即使 `f.a` 是空指针,计算出的地址(如 0x4)也不会立刻引发崩溃。但如果把 `s` 声明为指针 `char *s`,`f.a->s` 则会解引用这个空指针(通过 `mov` 指令),程序就会在判断条件处直接崩溃。作者还澄清了零长度数组是编译器扩展(如GCC),常用于实现“柔性数组”以分配不定长数据。 文章强调,理解变量的地址本质、成员访问的偏移计算以及数组名与指针的操作区别,是避免这类“坑”并掌握C语言内存模型的关键。

本机暂存
IT 前端/ 2014-11-26 23:16:49 / 累计浏览 1,753

Javascript中的delete操作符

这篇文章深入剖析了JavaScript中`delete`操作符的行为,特别是它与变量、对象属性之间微妙而关键的互动关系。作者从一个核心矛盾出发:看似等价的全局变量和对象属性,在`delete`面前却表现迥异。 核心差异在于,通过`var`声明的变量和函数声明都带有`dontdelete`特性,因此它们无法被`delete`操作符移除。相比之下,直接在对象上创建的属性(无论是自定义的还是来自原型链的)则可以被轻松删除。文章通过一系列精准的代码示例展示了这种区别,例如`delete global`对`var global`无效,但`delete obj`却能移除一个未用`var`声明的全局变量(它本质上是`window`对象的属性)。 此外,文章还细致地探讨了`delete`操作符的几个边界情况:它无法删除原型(prototype)中定义的属性或对象自带的属性(如`length`);在`eval`执行的代码中,通过`var`声明的变量反而失去了`dontdelete`保护,可以被删除;而`delete`的返回值(`true`/`false`)更多反映了操作是否成功,而非属性是否真的存在。理解这些细节,对于避免JavaScript中关于删除操作的常见陷阱至关重要。

本机暂存
IT 数据库/ 2014-11-26 23:08:43 / 累计浏览 2,644

Windows主机的性能监控

在运维实践中,清晰了解承载业务的Windows主机状态,是保障上层应用(如SQL Server)稳定运行的基础。这篇文章系统性地梳理了如何利用PowerShell和perfmon两大工具,对Windows主机进行全面的性能监控。 作者从“工欲善其事,必先利其器”出发,详细介绍了如何使用PowerShell的`Get-Counter`和`Get-WmiObject`命令,来获取和计算各类性能计数器数据。文章的核心价值在于,它没有停留在列举指标,而是深入剖析了CPU、存储、内存、网络这四个关键维度的核心Metrics。 对于每个指标,例如CPU使用率、磁盘响应时间、内存页交换等,都提供了具体的PowerShell获取命令、含义解释以及计算逻辑。更进一步,文章还探讨了监控实践中可能遇到的陷阱,比如采集粒度不足导致问题被掩盖,并讨论了在大规模集群下,采用Push(Agent主动上报)或Pull(中心节点拉取)模式对监控数据精确度和系统开销的影响。 整体而言,这不仅是一份监控指标速查手册,更是一份从工具使用到指标解读,再到采集策略思考的实践指南。

本机暂存
IT DevOps/ 2014-11-26 23:04:19 / 累计浏览 1,749

yunbk-让备份变得更简单

还在为数据库和文件备份的手动操作感到繁琐吗?作者用 Python 开发了 yunbk 这个简洁的备份插件,让数据备份变得像写几行代码一样简单。它的核心思路是通过一个统一的 `with` 上下文管理器,在临时目录中完成所有备份文件的写入,调用 `backup()` 后便自动上传至配置的后端存储,最后彻底清理现场,不留痕迹。 这个插件最大的优点是灵活性和易用性。通过提供本地、FTP、阿里 OSS 等多种后端适配器,开发者可以轻松地将 MySQL、Redis 等数据库,或是任意媒体目录备份到不同位置。文章中给出了几个清晰的代码示例,比如仅需几行就能完成 MySQL 全库的本地备份。作者还推荐结合 APScheduler 实现定时自动化备份,给出了一个完整的调度脚本,让整个备份方案更加实用和落地。

本机暂存
IT 移动开发/ 2014-11-26 23:01:20 / 累计浏览 2,830

分析Android ROM的生态状况

这篇讲的是Android ROM生态的演变与当前格局。作者从CyanogenMod的兴衰切入,用“跨越鸿沟”理论点明其仍属于极客小众圈子,进而揭示了ROM生态如今已明确分化为两大阵营。 文章核心梳理了“手机厂商深度定制”和“第三方ROM战略跟进”这两种模式。前者以MIUI、Flyme OS、ColorOS为代表,厂商们借ROM进行软硬件整合与差异化竞争,构建自家生态护城河。后者则更像一场流量入口争夺战,BAT等巨头或亲自下场(如云OS、百度云ROM),或通过投资(如腾讯投资乐蛙OS)来布局。文中不仅列举了各大ROM的演进路线,也分析了如tita项目搁浅、阿里云OS早期失误等案例背后的战略考量。 整体来看,作者认为ROM已从早期的刷机爱好者玩具,演变为手机厂商定义体验、互联网公司争夺移动端入口的关键战场。生态的分化,恰恰反映了不同玩家基于自身优势对“如何占据用户手机桌面”这一命题给出的不同答案。

本机暂存
IT 前端/ 2014-11-26 22:59:34 / 累计浏览 1,831

浏览器特性检测工具:Modernizr

这篇文章从早期前端开发中常见的浏览器嗅探技术切入,引出了一个至今仍普遍存在的问题:面对CSS3和HTML5等新技术时,各浏览器的支持程度依然参差不齐。作者指出,依赖navigator.userAgent进行浏览器身份推断已不可靠,取而代之的是更直接的“特征检测”——即询问浏览器“你能做什么?”而非“你是谁?”。 Modernizr正是为此而生的JavaScript库,它能够快速检测数十项HTML5和CSS3特性的支持情况,其执行效率极高。文章重点阐释了Modernizr所依托的“渐进增强”开发理念,即从基础功能层开始,逐层添加增强体验。它不仅能帮助开发者清晰地了解当前环境,还能通过提供polyfill脚本,模拟缺失的HTML5功能(如地理定位),从而填补浏览器的功能漏洞。 此外,文章也贴心地介绍了Modernizr的两个版本:包含完整检测功能的development版适合学习和测试,而可按需定制的production版则能优化体积与性能。对于希望构建健壮、可适应不同环境的前端应用的开发者来说,Modernizr提供了一套可靠且高效的检测与应对工具箱。

本机暂存
IT DevOps/ 2014-11-26 22:57:18 / 累计浏览 3,923

如何对待开发团队中那个拖后腿的人?

这篇讲的是团队中相对弱势的成员如何成为检验团队文化健康度的试金石。作者从自己多年参与不同团队的经历出发,分享了一个观察:优秀的开发团队往往都有一个“垫底”的成员,但关键不在于这个人的能力短板,而在于团队其他人如何对待他。 文章用了一个生动的例子——在作者曾参与的志愿者团队中,有个叫Elliot的成员。他热心却总是把事情搞砸,没人会把关键任务交给他,但所有人都体谅他,帮他融入并贡献自己的力量。团队会私下叹气,但绝不容许外人欺负他。作者指出,这种相互尊重与包容的氛围,恰恰是团队和谐与高效的标志。 相反,在不和谐的团队中,类似的成员容易被孤立和轻视,这会带来负面影响。文章认为,如何对待团队里“那个Elliot”,直接反映了团队的文化与领导力。商业组织和开源社区都能从中获得启发:关注成员间的互动方式,有时比单纯追求个人技术能力更能决定一个团队的长期健康与凝聚力。

本机暂存
IT 数据库/ 2014-11-26 22:51:51 / 累计浏览 2,743

深入剖析 redis 数据结构 ziplist

这篇讲的是 Redis 中为了极致节省内存而设计的压缩链表 ziplist 的实现细节。作者从 Redis 的 list 结构有两种底层实现(普通双链表和 ziplist)切入,重点剖析了后者。 ziplist 的核心巧妙之处在于,它用一段连续的内存空间模拟了双向链表的功能,从而省去了每个节点额外的前驱和后驱指针开销(每个指针8字节)。文章详细拆解了 ziplist 的整体格式以及每个 entry 的 TLV(类型-长度-值)结构,特别是通过 `prelen` 字段记录前一项的长度来实现反向遍历,通过精心设计的 `encoding` 字段对不同长度的字符串和整数进行紧凑编码。 通过分析 `ziplistFind()` 函数的源码,文章展示了 ziplist 如何进行数据查找与比较。最后,文章点明了 ziplist 在 Redis 中的实际应用场景(如 Hash 结构在数据量小时的底层存储),并解释了它的性能优势:紧凑的线性内存布局不仅节省空间,还可能更好地利用 CPU 缓存,使得在数据量较小时,其查找性能甚至可以媲美哈希表。

本机暂存
IT 设计/ 2014-11-26 22:45:51 / 累计浏览 2,182

编程珠玑番外篇-P PostScript 语言里的珠玑

这篇讲的是编程语言设计史上的一个独特案例。作者将PostScript称为通过图灵奖得主Perlis“语言影响思维”测试的典范,深入剖析了这门为桌面出版而生的语言,其设计中蕴含的至今仍闪光的“珠玑”。 文章从语言设计者的视角出发,还原了如何为桌面出版构建一个灵活、高效且设备无关的描述语言。作者重点剖析了PostScript几个超越时代的设计:它基于栈的逆波兰表示法,带来了极致的语法简洁;更令人叫绝的是,用闭包来定义度量单位(如`/inch {72 mul} def`),这不仅是个语法技巧,更揭示了度量单位本质上是一种“后缀闭包”的抽象。 PostScript的“字典栈”设计则是一次精彩的工程实现,它让栈语言能优雅地支持作用域和局部变量,甚至实现了类似词法作用域的特性。而文中提及的、由行业实践催生的“文档结构约定”,则可视为后来Java、Python中注解(Annotation)或装饰器(Decorator)思想的早期实践,通过引入元信息来约束和检查程序的语义正确性。 整篇文章不仅是一次语言考古,更展示了如何从一个具体领域的深刻理解中,提炼出具有普适性的、简洁而强大的编程模型。作者最后也提到,PostScript的许多设计深受同时期Smalltalk的影响,这让我们看到技术思想在历史中的交汇与传承。

本机暂存