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

最新文章

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

IT 算法/ 2012-12-24 22:38:04 / 累计浏览 4,281

P和NP那些事

这篇讲的是计算机科学中P、NP、NP完全(NPC)与NP难(NP-hard)这几个核心概念。很多人误以为NP就是“非P”,文章一开始就澄清了这一点:NP(非确定性多项式时间)问题指的是那些“能在多项式时间内被验证解”的问题,而P(多项式时间)问题自然属于NP。 作者用一个生动的比喻解释了NP的核心:非确定型图灵机可以“猜”出一个解(比如哈密顿路径),然后快速验证其正确性。接着,文章引入了“规约”这一关键工具,并指出Cook发现了所有NP问题都可规约到SAT问题,由此引出NP完全问题——NP中最困难的一类,它需同时满足“是NP问题”且“所有NP问题都可规约到它”这两个条件。 文章还以SAT、2-SAT(P)与3-SAT(NPC)为例,具体说明了概念间的差异,并列举了旅行商问题等经典NPC问题。最后,作者提及了对P≠NP证明尝试的看法,认为这可能需要现有理论体系之外的突破。全文从澄清误解入手,层层拆解概念间的逻辑关系,为理解这个理论计算机科学的核心难题提供了清晰的脉络。

本机暂存
IT 算法/ 2012-12-24 22:37:07 / 累计浏览 6,903

数据结构定义中的中(大陆地区)美差异

这篇讲的是一个挺有意思的技术概念“撞车”现象:作者在和一位清华博士讨论数据结构的选择题时,发现自己按国内教材理解的答案和标准答案大相径庭。一查权威资料才发现,原来“满二叉树”、“完全二叉树”这些基本概念,中国大陆教材的定义和美国及国际通行定义存在系统性差异。 文章核心对比了三个概念。最典型的是“满二叉树”:国内严蔚敏版教材定义为“深度为k且有2^k-1个节点的二叉树”,即每一层都完全填满;而美国NIST的定义(对应full binary tree)则是“每个节点要么是叶子,要么有两个孩子”。两者描述的结构截然不同。对于“完全二叉树”,中美定义在“最后一层节点尽可能靠左”这一点上达成了一致。另外,美国定义中的“perfect binary tree”实际上就是国内教材所说的满二叉树,只是国内很少单独提出这个术语。 作者借此指出,国内考研、等级考试广泛采用的定义与国际标准存在偏差,建议读者在学习数据结构时,多参考英文原版教材以避免概念混淆。

本机暂存
IT 前端/ 2012-12-24 13:35:17 / 累计浏览 3,132

交互模式之分页还是加载?

浏览网页或App时,你更习惯点击“下一页”,还是让页面自动刷出新内容?这篇讲的正是这个我们每天都会用到、却很少细想的小选择。作者从用户心理和使用场景出发,对比了分页(Pagination)与连续加载(Continuous Scrolling)这两种交互模式的微妙差异。 核心区别在于掌控感与沉浸感。分页模式将信息切块,赋予用户清晰的进度预期和强大的定位跳转能力,尤其适合信息量未知的搜索结果列表。但它也创造了“停顿点”,可能打断用户心流,甚至引发“是继续还是离开”的犹豫。相反,连续加载通过自动刷新维持了无中断的浏览体验,让社交信息流的沉浸感最大化,代价是用户容易迷失,也难以回溯。 文章还指出,当下许多产品采用折中方案,例如Quora和微博在自动加载数次后插入分页按钮,平衡了流畅与可控。在屏幕更小、操作更需便捷的手机端,连续加载成为主流,但搜索类应用仍会保留分页。作者的分析最终落脚于:交互模式没有绝对优劣,关键在于匹配产品目标与用户当下的核心需求——是需要高效检索,还是享受无限漫游。

本机暂存
IT 安全/ 2012-12-24 13:34:44 / 累计浏览 5,263

Mcrypt响应慢的一个原因

作者遇到一个棘手问题:一个新上线的PHP脚本在并发20个请求时,Apache响应时间急剧飙升,但服务器CPU、内存等各项指标却完全正常。脚本使用了Mcrypt扩展进行加密操作。 问题的根源藏在一个看似不起眼的函数调用里:`mcrypt_create_iv`。作者发现,当未显式指定参数时,该函数在Linux下默认使用`/dev/random`来生成初始化向量。而`/dev/random`的工作原理是依赖系统的中断事件来积累熵池(随机性来源)。在并发请求较多、但系统本身又不够繁忙、中断产生不足的情况下,进程就会阻塞等待足够的随机数可用,从而导致整体响应缓慢,这正是“服务器指标正常但响应慢”的诡异现象。 解决办法是,在调用时显式指定使用`/dev/urandom`作为随机源,即添加`MCRYPT_DEV_URANDOM`参数。因为`/dev/urandom`不依赖系统中断,能够持续提供随机数。修改后,高并发下的延迟问题立即消失。 作者也补充了背景:PHP之所以默认选择可能阻塞的`/dev/random`,是因为理论上`/dev/urandom`在极端情况下可能被预测,安全性在设计上有细微的取舍。这也提醒我们,在查阅官方文档时,下方的用户评论往往藏着解决实际“坑”的关键线索。

本机暂存
IT 后端/ 2012-12-24 13:34:21 / 累计浏览 1,921

libmemcached的MEMCACHED_MAX_BUFFER问题

这篇讲的是作者在服务监控中发现一个异常:使用libmemcached向Memcached写入约10KB数据时,延迟竟高达7ms。为定位问题,作者分别用shell脚本(通过nc直接发送命令)和C++程序(调用libmemcached API)进行测试。结果出人意料——更“底层”的C++版本耗时远超shell脚本。 通过ltrace跟踪,作者发现数据发送很快,但等待服务端响应的时间很长。深入排查后,根源浮出水面:libmemcached库内部定义了一个名为`MEMCACHED_MAX_BUFFER`的常量,其值为8196字节。对于超过此大小的数据,库会将其拆分为两次`write`系统调用发送。这种拆分机制导致了显著的网络往返开销,成为了性能瓶颈。 解决方法相对直接:重新编译libmemcached,将该常量值从8196调大至81960。修改后,延迟从7ms锐减至1ms左右。作者也分析了服务端日志,确认时间主要消耗在连接状态切换的等待上。这个案例生动说明了第三方库中某个未公开的硬编码限制,可能对性能产生难以预料的影响。

本机暂存
IT DevOps/ 2012-12-24 13:31:35 / 累计浏览 2,659

用msmtp代替系统自身的sendmail

系统自带的sendmail因为漏洞多、配置复杂,常被管理员禁用,但这会导致cron任务出错时无法及时知晓。作者为了解决这个问题,放弃了之前使用的但已停止维护的ssmtp,转而寻找并采用了msmtp作为轻量级替代方案。 文章详细分享了从安装、配置到与系统深度集成的完整步骤。关键不仅在于如何配置msmtp连接邮件服务器,更在于两个精妙的实践:一是修改`/etc/mail.rc`让系统`mail`命令默认使用msmtp;二是在crond配置中为`CRONDARGS`参数正确添加了`-t`选项。 作者特别指出,这个`-t`参数至关重要,它确保msmtp从标准输入读取收件人列表。此前遗漏此参数导致了cron任务虽然输出了日志但邮件发送状态异常的诡异问题。这个解决方案是作者在实际踩坑后总结出的独家经验。通过这一套替换,既保留了系统邮件通知的能力,又极大地简化了管理负担。

本机暂存
IT AI/ 2012-12-24 13:29:37 / 累计浏览 3,887

为什么特斯拉是史上最伟大的geek?

这篇讲的是尼古拉·特斯拉如何被大众严重低估,而商业巨头托马斯·爱迪生却被误认为“电力之父”的故事。作者通过一系列具体对比,勾勒出一个被遗忘的天才极客形象。 核心在于颠覆认知:我们今天依赖的交流电系统、无线电技术、雷达概念乃至X射线的早期研究,关键突破都指向特斯拉。他像一个痴迷的极客,不断“修补没坏的东西”,将人类带入第二次工业革命。相比之下,爱迪生被刻画为精明的CEO,他擅于改进和专利垄断,甚至曾用不光彩的手段诋毁交流电。 文章抛出了一连串震撼的事实:特斯拉的17项专利构成了马可尼无线电的基础,他早在1917年就向美国海军提出了雷达方案,而他对X射线的危险性也早有警告。这些细节串联起来,旨在为这位孤独的发明家正名——他定义了现代世界的电力与无线通信基石,却长期活在另一位更懂营销的“发明家”阴影之下。读完会让人重新思考,真正的极客精神究竟是什么。

本机暂存
IT DevOps/ 2012-12-23 23:39:11 / 累计浏览 3,404

通过blktrace, debugfs分析磁盘IO

这篇讲的是当磁盘利用率飙到100%、程序变卡时,如何揪出背后的“元凶”文件。作者从实际场景出发,演示了如何组合使用blktrace和debugfs这两个工具,层层追查IO的来源。 具体来说,当iostat显示磁盘压力巨大时,先用blktrace捕获块设备层的IO请求。关键点在于grep出以“A”开头的日志行,这里是原始请求的入口,能清晰看到读写操作对应的源设备扇区。接着,通过debugfs的“icheck”命令,根据扇区号换算出的文件系统块号,反查到对应的inode号。最后,用“ncheck”命令把这个inode号映射为具体的文件路径——比如例子中的“test_file”。 整个流程就像顺藤摸瓜:从设备层的扇区,到文件系统的块和inode,最终定位到用户可见的文件。拿到这个结果后,就能结合自己的应用程序,分析为什么这个文件会被频繁读写,从而进行优化。文章给出了完整的命令示例和输出解读,实操性很强。

本机暂存
IT 数据库/ 2012-12-23 23:31:47 / 累计浏览 6,100

Ubuntu工作机使用FlashCache技术加速

作者从Facebook开源的FlashCache项目切入,介绍如何利用一块闲置SSD为Ubuntu等Linux系统的机械硬盘分区提供缓存加速。文章核心解决的是传统磁盘性能不足的问题,方案是在机械硬盘前放置SSD作为写回缓存:数据先高速写入SSD,再由后台异步同步至机械硬盘,从而在保证数据最终落盘安全的前提下,显著提升大容量存储的读写体验。 具体步骤上,文章详细演示了从获取源码、编译安装模块,到使用`flashcache_create`命令初始化缓存设备、设置开机自动挂载的完整流程。作者以加速`/home`分区为例,提供了清晰的命令行操作指南,并提醒了数据迁移时需注意的权限问题。 文章最后指出了该方案的权衡点:SSD空间将完全用于缓存而非存储文件,因此只适合拥有空余SSD容量的用户。整体而言,这为拥有多硬盘或闲置SSD的用户,提供了一个低成本、高可靠性的系统加速思路。

本机暂存
IT 前端/ 2012-12-23 23:29:43 / 累计浏览 6,671

正则表达式 — QQ微信、优酷前端 邮箱正则表达式验证 Bug

作者从一个具体的“坑”入手,揭示了众多网站(包括优酷、QQ微信)在邮箱验证环节可能存在的通用缺陷。他发现,许多广泛流传的正则表达式无法正确匹配像 i@julying.com 这样用户名或域名仅为单个字母的合法邮箱,根源在于早期代码为了图省事,未考虑这种边界情况,而后继开发者则盲目沿用。 文章不仅指出了这个容易被忽略的验证漏洞,还分析了其“代际传递”的技术债成因。作为解决方案,作者提供了经过改进的PHP和JavaScript版邮箱正则表达式,并附上了新手实例代码,这些新表达式明确支持了对单字母部分的验证。 这篇文章的价值在于提醒开发者,处理用户输入时绝不能有侥幸心理。那些“感觉上”少见的情况,恰恰可能是系统的薄弱环节。它以小见大,强调了对所有数据可能性进行严格验证的重要性,避免重蹈类似SQL注入等历史问题的覆辙。

本机暂存
IT AI/ 2012-12-23 23:22:09 / 累计浏览 5,136

谈谈SVD和LSA

这篇讲的是SVD(奇异值分解)和LSA(隐含语义分析)之间的关系。作者首先拆解了LSA的核心思想:它是一种主题模型,认为词语背后由潜在主题驱动。比如“计算机”和“电脑”在传统词向量空间中无关,但在LSA看来它们同属一个主题,因此包含它们的文章也相关,这突破了表面词汇的限制。 而SVD正是实现LSA的关键数学工具。文章从特征值与特征向量这些基础概念切入,为理解SVD如何分解文档-词矩阵、提取潜在语义结构做了铺垫。作者也点出SVD的广泛应用,比如它同样是PCA(主成分分析)和图像压缩的技术基础。整篇文章从数学基础讲到实际应用,清晰地勾勒出SVD作为通用分解方法,如何催生了LSA这一文本分析利器。

本机暂存
IT 数据库/ 2012-12-23 23:19:41 / 累计浏览 6,801

HBase Thrift 接口使用注意事项

这篇讲的是作者在实际使用HBase Thrift接口(基于0.92.1版本)时,总结出的几个关键陷阱和注意事项,对开发者在实际对接时避坑非常实用。 文章首先强调了字节存储顺序的重要性。由于HBase内部按字典序排序,row key和value中的数值类型在转换成byte数组时,必须严格使用大端序进行打包和解包,否则会导致数据无法正确检索。作者给出了C++和PHP中的具体处理示例。 接着,文章指出了一个在PHP和C++接口中行为差异显著的“TScan设置陷阱”。在PHP中,直接设置属性即可生效;但在C++中,必须通过专用的`__set_xxx()`方法赋值,才能将内部的`__isset`标记置为true,否则服务端会忽略这些设置,导致扫描从头开始。 最后,文章从运维角度提出了两点建议:一是合理配置Thrift Server的并发线程数(通过`-threadpool`参数),避免请求被阻塞;二是当进行带缓存的扫描操作时,需要调大Thrift Server的最大堆内存(`HBASE_HEAPSIZE`),以防止因缓存数据过多而引发内存溢出错误。 这些问题都是实际开发部署中容易忽略的细节,但对系统性能和功能正确性有着直接影响。

本机暂存
IT 开发者/ 2012-12-23 23:18:50 / 累计浏览 1,790

微活动-微营销实例分析

这篇讲的是微博“微活动”中的一种高性价比玩法——有奖转发的实操分析。作者以商麦网在六一期间的小霸王游戏机活动为例,拆解了从设置到评估的全流程。 文章核心是引入了CPS(Cost Per Share,即每次转发成本)这个关键指标来衡量活动效果。计算方式很直白:奖品成本除以总转发次数。比如那个65元成本的活动,在获得299次转发时,CPS仅为0.22元。作者还将此与投入iPhone 4S的大型活动(CPS约0.17元)对比,说明即使奖品预算不高,通过创意和结合热点也能达到不错的传播性价比。 除了数据计算,文章也细致总结了有奖转发设置中的诸多“坑”与要点,比如标题要突出奖品、转发内容是传播核心、一张好图片比什么都重要,以及奖项设置对效果的影响最为直接等。这为想尝试微活动的运营者提供了一份简明的操作检查清单。

本机暂存
IT 后端/ 2012-12-23 23:17:26 / 累计浏览 4,764

进程上下文切换 – 残酷的性能杀手(下)

这篇讲的是进程上下文切换如何成为性能杀手的实测篇。作者从自己开源的并发网络库chaos中选取task_service模块,通过编译宏控制,对比了pthread条件变量、sleep、pipe、socketpair、eventfd以及boost::io_service这几种线程间通信机制的实际表现。 测试数据清晰展示了不同机制的CS/s(每秒上下文切换次数)和整体耗时:pthread条件变量切换高达60万次且最慢,而eventfd的切换次数低至200次,效率遥遥领先。有趣的是,boost::io_service的CS也高达75万次,但整体效率却比pthread模型更好,作者推测这与其内部高效的队列实现有关。 结论很直接:上下文切换次数与程序运行效率基本呈反比,减少CS是优化后台服务性能时必须考量的关键因素。文章用硬核的实测数据说话,为开发者选择并发模型提供了切实参考。

本机暂存
IT 安全/ 2012-12-23 23:12:20 / 累计浏览 8,794

sshd+chrome+switchsharp翻墙

这篇讲的是如何在Linux系统下,通过SSH隧道结合Chrome浏览器的SwitchySharp插件,为团队成员快速搭建一条稳定的访问通道。作者从团队获得了一个付费SSH翻墙账号的背景出发,解决了此前免费账号质量不稳定、无法流畅访问Google、Twitter等网站的问题。 文章的核心方案分为三步。首先,利用`putty-tools`中的`plink`命令建立本地SOCKS代理,关键参数是`-D 127.0.0.1:7070`,并将其封装为可执行脚本`fan.sh`以便一键启动。其次,为Chrome浏览器安装代理切换插件`proxy-switchysharp`。最后,详细配置插件,设置代理类型为SOCKS5,并配置自动切换规则,例如通过正则`(google|facebook|twitter|youtube){1}`来区分哪些网址需要走代理。 完成上述配置后,只需运行脚本并启用SwitchySharp的“自动切换模式”,即可实现对目标站点的代理访问。整个过程清晰、可操作性强,为需要特定网络环境的开发者提供了一个轻量且有效的解决方案。

本机暂存
IT DevOps/ 2012-12-23 23:11:50 / 累计浏览 6,991

linux目录跳转快捷方式——z武器

这篇讲的是Linux下如何告别繁琐的`cd`命令,实现目录的“智能跳转”。作者从在机房目睹资深工程师行云流水般的`cd`操作说起,分享了自己想提升效率却常被“忘记目标目录在哪一层”困扰的经历,从而引出了一个名为“z”的命令行小工具。 z本质上是一个轻量的shell脚本,它通过自动记录你常访问的目录路径,让你只需输入目录名称的关键词就能一键跳转。文章清晰地介绍了它的核心用法:安装后,z会默默记住你的操作习惯。以后,无论你身处何处,只需输入`z 关键词`(例如`z python`),就能立刻进入之前记录过的、包含该关键词的目录,彻底省去了层层递进的`cd`和反复`Tab`补全的麻烦。 对于需要在多个项目目录间频繁切换的开发者和运维人员来说,这个小工具能显著提升命令行操作的流畅度与效率,是一个即学即用的实用技巧。

本机暂存
IT DevOps/ 2012-12-23 23:09:13 / 累计浏览 3,798

GTD时间管理

这篇讲的是作者如何从自己“忙到脑子不好用”的日常出发,借助GTD(Getting Things Done)理念和一款叫Remember The Milk的工具,重新夺回生活与工作的控制权。 作者面临的困境很典型:邮件堆积、任务优先级模糊,加上采用Sprint式的项目管理,每小时都需安排任务,压力之下难免感到“被剥削”。他提出的解法核心在于两点:一是建立条理,二是借助工具。 在方法论上,他提炼出GTD的几个关键实践:两分钟内能完成的事立刻去做;按“紧急性”与“重要性”将任务划入四个象限,重点警惕“紧急但不重要”的事务陷阱;通过持续回顾来积累智慧。工具选择上,他推荐了免费功能丰富的Remember The Milk,特别点出了其“双坐标”(列表与关键字)分类、通过“smart add”快速定义任务属性,以及方便的提醒和周计划视图等特色功能,甚至支持好友间互派任务与手机同步。 文章并非空谈理论,而是从个人痛点切入,将抽象的时间管理原则与具体的软件操作细节相结合,最后落脚于“轻松一点,快乐工作”的实在祝愿,为同样在效率迷宫中挣扎的读者提供了一份可操作的指南。

本机暂存
IT 后端/ 2012-12-23 23:08:30 / 累计浏览 5,249

Tips of Linux C programming

这篇文章分享了Linux内核和GNU C中一些不那么为人所知却非常实用的编程技巧。作者从链表的非常规定义讲起,展示了如何将链表节点嵌入到数据结构中,并利用`container_of`宏从节点地址反推出宿主结构体,这种方法比传统教科书定义更灵活优雅。 随后,文章深入到编译器与硬件层面:介绍了用`likely`/`unlikely`宏提示编译器优化分支预测,减少流水线冲刷;演示了通过内联汇编和`lock`指令前缀实现原子加法,保证多处理器环境下的数据一致性;还探讨了GNU C特有的零长度数组特性,用于在运行时动态分配结构体尾部的变长数组。最后,简短提到了三目运算符`a = x ? : y`这种简洁的省略写法。 这些技巧都源自真实的内核开发或GCC特性,能帮助C程序员写出更高效、更地道的代码。文章穿插了关键的代码片段和原理剖析,对希望提升底层编程技巧的读者很有启发。

本机暂存
IT DevOps/ 2012-12-23 23:03:36 / 累计浏览 8,658

你应该知道的16个Linux服务器监控命令

这篇讲的是Linux系统管理员必备的16个服务器监控命令。作者从追求最佳服务器性能的角度出发,强调了相比于GUI工具,命令行监控能更精准地洞察系统内部的真实状况。文章开篇就建议将服务器设置为运行级别3(纯命令行模式),以减少不必要的资源消耗。 随后,文章逐一介绍了从iostat、mpstat到netstat、top等16个核心命令。每个命令都附带了具体的用法示例和输出解读,例如用iostat快速定位潜在的IO瓶颈,通过free -m查看内存概况,使用mpstat分析多核CPU负载,以及利用netstat诊断网络连接状态。这不仅是一份命令清单,更是一套组合拳,帮助管理员全面掌握CPU、内存、磁盘IO和网络等关键指标的实际状况。 值得注意的是,文章没有停留在基础命令的罗列,还提及了如nmon这样集成了多种监控视图的工具,并说明了pmap、strace等用于深入排查特定进程问题的命令。对于希望从“救火队员”转变为能提前预见并解决问题的专业运维人员,这些基于命令行的监控技巧正是其核心能力所在。

本机暂存
IT 前端/ 2012-12-23 23:02:45 / 累计浏览 4,520

CSS基线之道

这篇讲的是CSS中容易被忽视的“垂直基线网格”问题。文章从印刷设计中的基线对齐谈起,对比了网页设计的现状:我们熟悉水平网格,却常常忽略垂直方向的一致性,这其实是基于人类大脑的“模式识别”原理——规整、可预测的间距能降低阅读的认知负担。 作者指出,CSS的`line-height`属性与真实基线存在差异,使得精确的垂直对齐变得棘手,但这恰恰是值得我们追求的。文章核心分享了一种基础的CSS实现思路:从最小的正文字体(如14px/22px)出发,定义一个基线单位(22px),并让页面所有元素的`line-height`、`padding`、`margin`都成为这个单位的整数倍。为了可伸缩性,这些像素值应转换为`em`单位。 通过这种简单的数学约束和可见网格的辅助检查,设计师能构建出结构清晰、节奏一致的页面布局,尤其在多列文本场景下,整齐的垂直对齐能带来类似印刷品的专业与可信感。这为处理复杂的垂直节奏提供了一套扎实的基础方法。

本机暂存