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

最新文章

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

IT 前端/ 2013-06-02 20:19:05 / 累计浏览 2,494

开发者调试工具Chrome Workspace

这篇讲的是Chrome开发者工具中一个能直接提升前端调试效率的内置功能:Workspace。 它允许开发者在DevTools里直接修改JS和CSS代码,并且改动会实时、自动地保存回本地文件。这省去了以往“在工具中调试确认效果,再切回编辑器手动同步修改”的重复步骤。过去实现类似自动保存需要依赖第三方工具(如autosave)并手动启动本地服务,现在Chrome正式版已原生支持,流程大大简化。 文章详细说明了启用方法:对于普通Chrome用户,需先在`chrome://flags/`中启用开发者工具实验选项,重启DevTools后在设置的“Experiments”中开启“File system folders in Sources Panel”。出于安全考虑,还需在目标项目根目录下创建一个名为`.allow-devtools-edit`的空文件(文中提供了Windows和Mac的命令行创建方式),然后在Workspace中添加该目录即可开始使用。作者也提醒,若资源通过URL加载,需使用Mappings设置映射,并特别注意路径结尾不要加反斜杠。 最后文章指出,尽管Workspace在调试阶段能有效提效,但其目前并不支持SCSS、LESS等预处理器文件的编辑,这是一个尚待完善的限制。

本机暂存
IT 算法/ 2013-06-02 19:43:32 / 累计浏览 3,800

由原子操作引起的关于Cache的讨论

这篇讲的是一个实际的性能排查案例:在MPI集群上,当PLDA算法与MLR或PLSA同时运行时,后者效率会大幅下降。问题最初被指向PLDA中频繁使用的原子操作——`lock incl`指令。用户担心这个`lock`前缀会锁死内存总线,拖垮整台机器。 作者澄清了一个常见误解:在现代CPU(如Nehalem架构)上,`lock`前缀在绝大多数情况下并不会锁总线,而是通过一种被称为“cache lock”的机制,在cache line级别实现原子性。他结合Intel手册与同行讨论,进一步指出硬件上并不存在真正的“cache lock”,而是依赖MESI这类缓存一致性协议来保证原子性。例如,带有写意图的原子读操作会触发RFO,导致其他核心的相关缓存失效,但这并不等同于锁住整个总线。 基于这个理解,问题的优化方向就清晰了:为了最小化不同任务之间的干扰,可以通过cgroup将它们绑定到不同的物理CPU上,从而隔离L1缓存。最终,作者通过共享内存和原子操作,替代了原先为每个线程分配独立大内存的做法,得以在限制内存占用的同时,启动更多线程将CPU利用满,反而获得了整体性能的提升。 对读者而言,这是一次从具体现象深入到底层硬件原理(CPU缓存一致性协议)的实用分析,有助于理解并发编程中原子操作的真实开销与优化思路。

本机暂存
IT 算法/ 2013-06-02 19:42:39 / 累计浏览 6,749

无锁HashMap的原理与实现

这篇讲的是如何绕过传统锁机制,实现一个能在多线程环境下高性能运行的HashMap。作者从Java中HashMap的线程安全痛点出发,指出常用的锁替代方案都存在性能或复杂性问题,从而引出了基于CAS(比较并交换)指令的无锁编程思路。 文章的核心是清晰地拆解了无锁HashMap的实现蓝图。它先带你理解了更基础的无锁链表如何利用CAS保证插入和删除操作的原子性,然后直面HashMap最大的挑战——ReHash(扩容)。作者巧妙地借鉴了“分裂有序链表”的思想,通过一种预先对节点哈希值进行位翻转排序并引入哨兵节点的方法,让整个链表在逻辑上始终有序。这样一来,数组扩容时节点只需要确认自己在新链表中的归属,而无需物理移动,从而破解了传统实现中需要同时原子修改多个指针的难题。 此外,文章还提到了为了提升效率而采用的数组懒加载、分块初始化等工程细节。整体而言,这是一篇从原理到实现都讲解得非常扎实的文章,把一个复杂的并发数据结构设计问题,梳理得条理分明。

本机暂存
IT 开发者/ 2013-06-02 19:41:12 / 累计浏览 3,798

《打造 Facebook》笔记

这篇讲的是作者从雅虎到Facebook的亲身体验与观察,核心是探讨两家公司截然不同的文化如何塑造了工程团队和产品开发。 作者首先指出雅虎存在严重的部门墙(BU),团队协作差,文化上缺乏整体使命感。与之形成鲜明对比的是,Facebook强调所有人为了整个公司的发展而工作。这种理念差异具体体现在诸多实践中:例如在招聘上,Facebook通过“文化适应性面试”和集体决策会议,严格筛选不仅技术一流、且认同公司使命的人才,认为一流人才只会与同等水平的人共事。在工程管理上,这里鼓励工程师发挥主动性、快速迭代产品,并持续改进内部工具以提升整体效率。作为管理者,重点在于“榜样示范”和设定合理挑战,而非单纯管控。 对于想提升技术团队效能与文化的读者,这篇文章的启示在于:伟大的产品源于对“人”的极致重视,包括严格的筛选、文化的塑造以及赋予工程师真正的自主权和责任感。它展示了一种将“文化”从虚泛口号,落实到招聘、开发、管理每个具体环节的系统性方法。

本机暂存
IT 后端/ 2013-06-02 19:40:33 / 累计浏览 3,822

Java将Object对象转换为String的总结合集

这篇讲的是Java开发中一个高频却容易出错的细节:如何将Object对象稳妥地转换为String字符串。作者直接从常见的三种转换方式切入——Object.toString()、强制类型转换(String)object,以及String.valueOf(object)。 文章没有停留在简单介绍,而是深入剖析了每种方法的“脾气”和陷阱。比如,直接调用toString()必须警惕null指针;强制转换看似语法正确,但在运行时可能因类型不符而抛出ClassCastException;而看似万能的String.valueOf(),在传入null时返回的是字符串“null”而非null引用,这个细微差别足以导致后续的判断逻辑出现严重错误。 作者通过源码片段和代码对比,把这些容易踩坑的点讲得非常透彻。后半部分还扩展到了Integer包装类与基本类型转换、不同进制间的转换,以及字节数组与数值类型互转等实用技巧,内容相当扎实。对于需要经常处理数据类型转换的Java开发者来说,这是一篇能帮你理清思路、避开常见错误的实用指南。

本机暂存
IT 后端/ 2013-06-02 19:39:17 / 累计浏览 6,414

C的那些事儿

这篇讲的是C语言在Linux生态中的实践心得与工具推荐。作者从C语言作为许多人的编程启蒙谈起,指出尽管学习路径在演变,但C语言在Linux系统编程领域——如操作系统、数据库等高性能场景——仍占据着核心地位。 文章重点分享了提升C语言“品味”的具体路径。一方面推荐使用Source Insight这类静态分析工具,通过代码跳转、关系图等功能,在庞大的开源代码库中理清脉络;另一方面更推崇借助gprof和cgprof进行动态性能分析,生成可视化的函数调用图,直观展示函数调用次数与时间占比,以真实运行数据替代主观猜测。 作者还特别赞赏了Linux的管道(Pipe)机制,它让不同程序能够无缝衔接,实现了二进制层面的高效代码复用,这比单纯的语句级复用更为精妙。文中以通过管道串联grep、awk等命令为例,展现了这种设计的优雅与强大。 整篇文章并非泛泛而谈,而是结合了作者手边的函数手册、亲测有效的工具链(从编译选项`-pg`到生成调用图的完整流程),以及对Linux设计哲学的具体感受,为想在开源世界中精进C语言的读者,提供了一条清晰、可操作的实践思路。

本机暂存
IT 前端/ 2013-05-29 23:09:58 / 累计浏览 4,565

JavaScript的5种调用函数的方法

这篇讲的是 JavaScript 开发中一个高频踩坑点:函数调用方式如何直接影响 `this` 的指向。作者从自身经历出发,指出许多 bug 的根源在于对函数调用机制理解不深。 文章通过一个简单的 `makeArray` 函数,逐步演示了四种核心调用场景。无论是看似直接的全局调用、作为对象方法调用、使用 `apply`/`call` 显式指定上下文,还是作为构造函数配合 `new` 使用,其返回的 `this` 值都截然不同。例如,直接调用时 `this` 指向全局对象(浏览器中是 `window`),而作为对象方法调用时,`this` 则指向该对象本身。 作者还点明了事件处理中常见的 bug 陷阱:当函数被赋值给 DOM 事件属性后,若再将其作为普通函数调用,`this` 会丢失元素上下文。这也解释了为什么 jQuery 等库需要在内部重新绑定 `this`。 文章最终归纳了几条关键规则,清晰指出了不同调用方式下 `this` 的绑定逻辑。理解这些细微差别,是编写可预测、少 bug 的 JavaScript 代码的重要一步。

本机暂存
IT DevOps/ 2013-05-29 22:37:00 / 累计浏览 4,549

如何诊断CDN故障

这篇讲的是当使用第三方CDN出现文件下载报错时,如何一步步锁定问题节点并诊断根源。作者从实际项目遇到的、节点众多导致排查困难这一痛点出发,分享了一套可操作的方法论。 核心步骤很清晰:先借助阿里测或Just-Ping等服务获取CDN的节点IP列表,然后利用一条结合xargs的shell命令并发测试所有节点的下载情况,通过对比下载文件的MD5值来精准定位异常节点。最后,再用淘宝IP库反查问题节点的地理位置,与用户反馈对照,就能确诊是哪个区域的网络或服务出了问题。 文中不仅给出了具体的命令示例,还贴心地列举了国内外常用的Javascript CDN地址作为参考。整篇文章从工具准备到执行验证,逻辑链条完整,对于运维和后端开发人员来说,是一份在CDN排障时能直接上手的实用指南。

本机暂存
IT DevOps/ 2013-05-29 22:36:11 / 累计浏览 4,552

Shell的那些事儿

这篇讲的是 Shell 语言如何从大学里一个简单的工具,成长为作者工作中不可或缺的效率利器。作者从学生时代用 Shell 命令裁减文件系统、处理 BAT 脚本讲起,到工作后利用 `grep -Irl` 快速查找文本文件,或用 `find |xargs wc -l` 统计代码行数,生动展现了 Shell 在解决实际问题时“组合命令”的核心魅力。 文章并未停留在基础用法,而是深入探讨了 Shell 的“工程化”一面。作者分享了在性能团队学到的实用技巧,比如用 `-x` 选项调试脚本执行过程、设置参数默认值以及实现进程并发控制。同时,也坦诚讨论了 Shell 语法的灵活性甚至“不严谨”之处,比如 `if` 语句的多种写法和对换行符的敏感,并澄清了如何正确处理分号与命令返回值 `$?` 的使用。 作者的最终观点很明确:相对于 C/C++/Java 等编译型语言,Shell 作为一种“工具性语言”,以其无需编译、即写即测的特性,提供了无与伦比的开发效率。无论是压力测试还是复杂逻辑控制,它都是快速将想法落地的首选。文末那句“不熟悉 Shell 都不好意思说会性能调优”,既是对 Shell 地位的肯定,也点明了在追求效率的现代开发中,掌握这门语言的重要性。

本机暂存
IT AI/ 2013-05-29 22:35:23 / 累计浏览 5,789

基于用户行为分析的搜索引擎自动性能评价

搜索引擎性能评价一直是个难题。传统Cranfield方法需要人工标注标准答案,面对数十亿网页的搜索结果池,这项工作变得耗时耗力,难以满足算法快速迭代的需求。 作者从信息检索评价的核心困境出发,梳理了各种自动评价方案的探索与局限。无论是基于搜索结果反馈的“伪相关”标注,还是利用外部目录资源,其可靠性都存疑。文章进而聚焦于用户点击行为这一天然存在的行为日志,分析其作为自动化评价依据的潜力。作者通过对比不同搜索引擎上“电影”这一查询的点击分布,发现信息类、事务类查询的答案多元且用户行为差异大,难以跨系统评价。 因此,文章将自动评价的可行范围明确限定于“导航类查询”——这类查询通常只有一个明确的目标网站,用户点击行为高度一致且可靠。作者详细阐述了如何从海量日志中筛选导航类查询,并利用群体点击行为自动标注唯一正确答案,从而实现基于“首现正确结果排序倒数”等指标的全自动性能评测。这为搜索引擎在保持评价科学性的同时,大幅提升迭代效率提供了一条切实路径。

本机暂存
IT 前端/ 2013-05-29 22:34:16 / 累计浏览 3,968

HTTP的升级产品:SPDY

这篇讲的是Google推出的SPDY协议如何试图解决传统HTTP协议在现代Web下面临的性能瓶颈。文章从对比出发,清晰地指出HTTP的三大痛点:每个请求需要单独TCP连接导致的低效、服务端无法主动推送内容、以及重复的头部信息造成带宽浪费。 SPDY的核心思路是“增强而非取代HTTP”,它通过在一个TCP连接上实现多路复用,允许并行处理多个请求;引入服务器推送,让服务器能预加载资源;并压缩头部信息,从而大幅减少延迟和带宽消耗。同时,SPDY强制使用SSL加密传输,提升了安全性。文中特别指出,这使得现有服务端应用无需大改,只需增加SPDY传输层即可升级。 对于不同角色,SPDY的价值立竿见影:普通用户感受到更快的加载速度和更高的安全性;前端工程师可以利用请求优先级优化页面渲染;运维人员则能减少服务器连接资源消耗。文章最后也点明了SPDY作为HTTP 2.0重要候选者的背景,其目标就是让整个网络“快”起来。

本机暂存
IT 后端/ 2013-05-29 22:20:56 / 累计浏览 7,782

腾讯分析系统架构解析

这篇讲的是腾讯分析(TA)系统如何应对日均处理上TB级数据、实现秒级更新的架构挑战。作者从数据采集到实时计算、存储的全链路出发,揭示了TA“数据全二进制化、计算全内存化、存储NoSQL化”的核心设计思路。 文章的重点在于其实时解决方案。在计算层面,系统借鉴了流式计算框架,采用增量计算模型,通过将所有数据类型转化为整型来大幅提升内存与计算效率。在存储层面,系统则巧妙地针对不同数据特性,组合使用Redis(高频更新的统计数据)和LevelDB(固定不变数据),并深度扩展Redis命令(如支持四则运算和批量字段更新)来优化查询与写入性能,显著降低了延迟与资源消耗。 此外,文中还详细阐述了其分片策略与双写复制等高可用设计。整个架构解析为构建高吞吐、低延迟的实时数据处理系统提供了清晰且可落地的思路,尤其对类似流式计算与海量数据应用场景具有参考价值。

本机暂存
IT 后端/ 2013-05-29 22:19:50 / 累计浏览 7,654

Yupoo(又拍网)的系统架构

这篇讲的是国内最大图片服务商Yupoo又拍网的系统架构。文章没有空谈理论,而是直接列出其生产环境中使用到的具体技术栈,为读者提供了一个真实、可参考的大型互联网服务构建蓝图。 核心方案体现在对开源软件的组合运用上。操作系统层采用CentOS、Ubuntu等,服务器由Nginx、Apache、Squid共同处理请求;数据存储与缓存依赖MySQL、Memcached、Redis乃至Riak等多种方案;业务逻辑则由PHP、Python、Erlang等多语言实现。值得注意的是,其架构中还包含了Hadoop、Mogilefs用于分布式存储与计算,RabbitMQ处理消息队列,以及完善的监控(Nagios、Cacti)和任务管理(Redmine)体系。 这种“搭积木”式的架构,其效果在于通过成熟开源组件的高效组合,支撑起海量图片的上传、处理、存储与分发需求。对于技术团队而言,这份清单的价值在于它展示了一个经过实践验证的技术选型思路,而非单一工具的介绍。

本机暂存
IT 数据库/ 2013-05-29 22:17:54 / 累计浏览 3,885

Java的那些事儿

这篇讲的是作者从个人经验出发,分享对Java语言的理解与数据库开发实战心得。作者认为,Java因其设计上的后发优势、简单的语法和强大的生态(如优秀的IDE),相比C/C++在开发效率上更胜一筹,尤其在现代注重高并发与可扩展性的项目中。 文章的重点,落在了Java开发者(特别是使用Oracle数据库时)必须掌握的三个核心数据库优化点上:首先是连接池技术,以解决连接数失控或过度复用的问题,并给出了基于Oracle UCP的配置示例;其次是语句池技术,强调必须使用绑定变量并启用语句缓存,以避免昂贵的软解析开销;最后是资源泄露问题,指出Java的内存回收机制无法处理数据库连接、游标或事务锁的泄露,这常常是异常处理不严谨导致的,并附有锁等待的监控图作为例证。 作者从实用主义出发,最终将讨论落脚于具体的技术细节与解决方案,对于从事数据库应用开发的Java程序员来说,文中列出的这几点排查清单具有直接的参考价值。

本机暂存
IT 设计/ 2013-05-29 22:13:57 / 累计浏览 2,893

如何有效的向用户传递信息

这篇讲的是,产品经理和设计师如何让产品里的信息“说人话”。作者从一个基本共识出发:高效准确的信息传递是良好用户体验的基石。文章总结了几个关键原则,其中最核心的是“用用户能理解的语言沟通”和“无法言喻时,至少让它自我解释”。 文章通过正反案例生动地阐释了这些原则。好的设计,比如iOS经典的图标和iBooks的书架拟物界面,能跨越文字,让用户凭直觉就懂操作意图。而反例则展示了晦涩的术语、结构混乱的提示或过于抽象的广告信息如何阻碍用户理解,甚至引发困惑。文章还强调了“及时解释”的重要性,就像iPhone设置项下方的小字说明,在用户可能迟疑的地方,立刻提供背景知识,防止用户“卡住”。 这些分析并不空谈理论,而是扎根于产品设计中的常见场景。作者的观察提醒我们,有效的信息传递不是设计师的“自说自话”,而是一场需要设身处地、不断测试的真诚对话。

本机暂存
IT AI/ 2013-05-28 22:24:03 / 累计浏览 5,238

如何计算两个文档的相似度(二)

这篇系列文章的第二部分聚焦于gensim的实战上手。作者从安装这个看似简单的步骤切入,详细记录了在Ubuntu和Mac OS上配置gensim及其依赖库NumPy、SciPy时遇到的典型问题——比如Mac上因缺失Fortran编译器导致的SciPy安装失败,并给出了解决方案(通过Homebrew安装gfortran),这对国内开发者很有参考价值。 在核心的使用演示部分,文章没有照搬官方教程,而是另辟蹊径,使用了“Latent Semantic Indexing (LSI) A Fast Track Tutorial”中的三个简短英文文档作为案例。整个流程清晰展示了从文本预处理(小写化)、构建词袋字典、生成文档向量,到训练TF-IDF模型,最终通过LSI(潜在语义分析)将文档映射到二维主题空间的全过程。作者特别指出了gensim在计算IDF时未对出现频率为100%的词(如介词a, in, of)进行平滑处理导致其权重为零的现象,并以此反向论证了TF-IDF算法在过滤停用词上的有效性。 通过这个从安装到模型输出的完整闭环,文章为读者提供了一份可复现的gensim入门实践指南,为后续在“课程图谱”上的应用打下了基础。

本机暂存
IT AI/ 2013-05-28 22:24:02 / 累计浏览 6,808

如何计算两个文档的相似度(一)

作者在构建“课程图谱”网站时,面临课程推荐系统冷启动的难题:缺乏用户行为数据,人工标注标签又耗时。一个可行的思路是直接利用课程文本内容计算相似度,而作者最终选择了基于主题模型的自动化方案。 核心工具是强大的Python库gensim,文章以LSI(浅层语义索引)模型为例,展示了如何将两篇文档映射到主题维度,进而计算其语义相似度。作者用不到百行的代码便实现了这一流程,并给出了以Andrew Ng《机器学习》课为示例的推荐效果图。文章还规划了进一步优化:利用全量英文维基百科语料,在普通笔记本电脑上训练更复杂的LSI和LDA模型,以提升相似度计算效果。 文章整体脉络清晰,分为三个部分:先简要铺垫TF-IDF、SVD等基础知识点并提供参考资料;再详解gensim的安装与具体实现;最后探讨在大规模语料上训练模型的应用。作者并非平铺直叙,而是从实际项目需求出发,分享了从选型到落地的完整思考与实践。

本机暂存
IT 安全/ 2013-05-28 22:20:58 / 累计浏览 3,836

Perl 程序源码怎么加密

这篇讲的是如何给Perl程序源码加上一层保护,防止被直接查看。作者从保护SSH密钥和商业程序源码的现实需求出发,介绍了一种基于`Filter`模块的轻量级加密方案。 核心思路是在Perl解释器前插入一个“过滤器”:通过`use`一个自定义模块,在源代码被解析前先进行解密。这类似于PHP中的Zend加密机制。文章详细演示了具体实施步骤:首先下载并解压`Filter`模块,然后需要修改两个关键文件——加密程序`encrypt`和解密端的C代码`decrypt.xs`,在其中设置统一的加密密钥(字符)。使用这个定制好的程序对你的`.pl`文件进行加密,生成后的文件外观已不可读,但功能完全正常。 这个方案的巧妙之处在于,加密与解密使用同一套自定义密钥逻辑。部署时,只需在目标服务器上安装好包含了你修改过的`decrypt.xs`所编译出的so文件的`Filter`模块。由于最终的解密逻辑被编译成了二进制的so文件,密钥不会直接暴露,从而在一定程度上保证了源码的安全性。文章还附带了一个用于验证或还原的反解程序,完成了从加密到部署再到可能的调试的完整闭环。

本机暂存
IT 前端/ 2013-05-28 22:15:26 / 累计浏览 3,428

说说弹窗和新窗口打开拦截

浏览器对非用户主动触发的弹窗和新窗口打开的拦截,常让开发者头疼,尤其在需要与第三方网站交互的场景下。作者从实际产品需求出发,比如传递用户数据、验证流程后跳转,探讨了如何绕过这些限制。核心方案是利用表单提交到新窗口,通过设置target属性为“_blank”,将数据先发送到本站处理页面,处理完毕后再跳转到第三方站点。同时,建议在

本机暂存
IT 前端/ 2013-05-28 22:14:04 / 累计浏览 3,806

如何判断Event事件是否是用户主动执行的

作者从网站模拟用户点击行为的常见做法出发,探讨了如何准确判断一个Event事件是否为用户真实触发的问题。在jQuery层面,可以通过检测`event.originalEvent`是否存在来实现,但这种方法并不完全可靠,因为程序完全可以通过`createEvent()`构造出一个几乎无法区分的模拟事件。 文章的核心发现在于,完全依靠JavaScript代码本身已无法彻底解决这一信任问题。最终的解决方案来自浏览器层面:根据DOM Level 3 Events标准,现代浏览器(如IE9+和Firefox)提供了`isTrusted`属性。该属性由浏览器内核自动设置,对于用户真实操作的事件返回`true`,对于程序合成的事件返回`false`,且开发者无法手动篡改它。 目前,基于WebKit的Chrome浏览器尚未支持此特性,但作者相信这会是未来的标准方向。这篇内容为前端开发者提供了一个从代码模拟局限到浏览器级解决方案的清晰思路,对于需要精确区分用户行为的场景(如安全防护、行为分析)很有参考价值。

本机暂存