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

最新文章

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

IT 后端/ 2013-08-08 23:30:13 / 累计浏览 2,399

从概念的角度审视一淘商品搜索的Online系统架构

这篇技术文章从概念角度剖析了一淘商品搜索系统中的信息组织架构,直指当前设计的不足与优化方向。作者指出,随着商品数量增长,类目、产品节点(SPU/SKU)等层级信息在现有系统中存在割裂,特别是产品节点的类目关系和父子层级在Online系统中未被有效利用,导致搜索结果页(SRP)展示和导航逻辑存在缺陷。 文章引入了两个核心概念:AP(访问点/聚合点)与TAG(属性)。AP用于路径导航(如类目、SPU),TAG用于结果筛选(如颜色、尺寸),两者可动态转化。作者认为,当前依赖离线统计的QP决策机制存在局限,而通过构建并利用一棵完整的“AP树”,系统可以进行实时在线统计,从而更智能地决定产品的展示层次、结构化组合(Combo)以及跳转逻辑,大幅降低人工干预成本,提升用户导航体验。 其核心方案是统一CatId、SpuId、SkuId的数值空间,构建更完整的层级树,并增强模块的数据更新能力。这一架构不仅旨在解决当前节点展现别扭、导航路径单一的问题,还为关联推荐、公共信息提取等更丰富的产品功能打开了空间。

本机暂存
IT AI/ 2013-08-08 23:27:38 / 累计浏览 3,487

只有算法的个性化推荐没有未来

这篇来自淘宝技术团队的文章,探讨了个性化推荐系统的发展方向。作者从淘宝的实际应用出发,区分了依赖数据挖掘与机器学习的“黑盒推荐”,以及融合内容理解与领域知识的“白盒推荐”。他认为,当前业界过于追求算法模型的优化,却忽视了推荐的根本是服务于人。 文章从经济学的“理性人”假设切入,指出算法模型将人抽象为数据,但现实中的人是充满情感、存在个体差异且行为具有不确定性的。作者举了一个例子:即使拥有一个人完整的购物历史,也很难精准预测他当下的需求,这正是纯算法推荐的局限所在。 基于此,作者提出优秀推荐系统的原则应包含可解释性,即算法必须把“数字”还原成“人”的行为逻辑。文章最终认为,只有当算法能融合常识、技术与运营紧密结合时,个性化推荐才能迈向新的高度——成为“融合常识的推荐”。

本机暂存
IT 开发者/ 2013-08-05 23:29:34 / 累计浏览 4,998

为什么优秀的程序员既懒又笨

这篇讲的是一个反直觉却真实的现象:那些被视为优秀的程序员,身上往往同时具备“懒”和“笨”的特质。 作者从观察出发,指出“懒惰”并非贬义——优秀的程序员会为了一劳永逸地摆脱重复劳动,主动编写工具和脚本,从而在客观上提升了代码的可维护性和产品质量。而“笨”则是一种宝贵的思维品质,它让程序员保持谦逊、持续学习,并且像孩子一样提出最基础的问题,避免因自以为是而陷入思维定式。文章中那个排查logo显示问题的虚拟对话很有意思,它生动地说明,只有放下“聪明人”的预设,用最朴素的“傻办法”刨根问底,才能触及真正简单却容易被忽视的根源。 作者想传达的是,这种“懒”驱动效率提升,“笨”保障问题定位的思维方式,是实用主义程序员的核心素养之一。它提醒我们,有时放下精妙的预设,回归简单质朴的思考,恰恰是解决复杂技术问题的捷径。

本机暂存
IT 前端/ 2013-08-02 13:29:59 / 累计浏览 4,112

JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述

这篇从Web2.0时代JavaScript的角色演变谈起,指出在敏捷开发中借助JS框架是效率与深度的双赢,并重点对比了几大主流框架的特性与适用场景。 作者将JQuery评为首推的五星级框架,理由在于其体积小巧、学习曲线平缓、强大的DOM操作与灵活的UI扩展性。Extjs和YUI则凭借出色的UI组件,更适配后台管理系统或网盘这类复杂交互的应用。Dojo功能最为全面,尤其适合需要离线存储、数据网格等企业级特性的产品,但代价是庞大的体积和陡峭的学习成本。Mootools则以其纯正的面向对象设计和低耦合的模块化见长。 文章的核心观点是:没有“最好”的框架,只有“最适合”的选择。开发者应依据项目实际需求来决策,如果感到迷茫,不妨从最灵活的JQuery入手开始实践。

本机暂存
IT 后端/ 2013-08-02 13:27:44 / 累计浏览 2,722

Java包的静态导入import static和import的区别

作者从Java 5引入的静态导入特性出发,详细对比了普通的`import`与`import static`在语法和使用上的区别。普通导入让我们能直接使用类名调用其静态成员,而静态导入则能进一步省去类名前缀,使得代码书写更简洁。 文章通过`System.out.println()`和`Integer.MAX_VALUE`等具体例子展示了这一点。使用静态导入后,冗长的`System.out.println(…)`可以简化为`out.println(…)`,`Integer.toHexString(42)`则变为`toHexString(42)`。这在需要频繁调用同一类静态方法或常量时,确实能提升编码的简洁度。 不过,作者也提醒了它的适用场景和注意事项。静态导入更适合存在大量重复调用的代码段,若仅有零星使用,直接写全称反而更清晰。同时,需要警惕命名模糊问题,例如同时静态导入`Integer`和`Long`后直接使用`MAX_VALUE`会导致编译器错误,因为它无法判断你指的是哪一个。 总的来说,这篇文章讲清楚了如何在代码简洁与可读性之间找到平衡点,帮助开发者更有效地运用这一语法糖。

本机暂存
IT 开发者/ 2013-08-02 13:26:49 / 累计浏览 1,955

编程中的硬编码问题

这篇文章切中了编程中一个看似简单却影响深远的痛点——硬编码。作者从基础概念讲起,解释了硬编码就是将可变变量用一个固定值代替,这会导致程序后续修改异常困难。通过清晰的代码对比(如 `if(a==2)` 与 `if(a==b)`,或圆面积计算中直接使用 `3.14` 与定义变量 `V_PI`),直观展示了硬编码与灵活编码的关键差异。 文章不止于概念,更深入分析了硬编码在实际业务场景中的危害。例如,用中文字符串“拟制中”做条件判断,一旦系统国际化就会失效;或将特定管理员姓名写死在逻辑里,一旦人员变动程序便会出错。这些例子点明了硬编码带来的维护噩梦和系统脆弱性。 核心观点很明确:硬编码是为了短期方便而埋下的长期隐患。作者主张,无论是在条件判断、常量定义还是环境适配(如仅针对IE的JavaScript代码)上,都应通过设置常量、变量或采用动态配置的方式,让编码变“软”,从而提升系统的可维护性和扩展性。这对于开发者和设计者都是一种重要的警示。

本机暂存
IT 安全/ 2013-08-02 13:25:27 / 累计浏览 3,186

GFW的后果 兼谈管制

这篇从马云关于互联网管制的言论切入,用数据梳理了中国互联网在“保护”下的真实处境。作者调出2006年的Alexa全球前十网站列表,其中中国网站占四席;而到了2013年,这一数字减至三家,且百度等头部站点的排名略有下滑。更关键的是,在这段时期里,海外榜单迅速纳入了Facebook、YouTube等新巨头,国内的新鲜血液却相对稀缺。 文章的核心观点是:GFW在屏蔽外部竞争、为国内企业提供“安全”发展环境的同时,也深刻塑造了中国互联网的基因。由于政治表达空间有限,大量的用户注意力和资本涌向了娱乐与情绪宣泄领域,而非深度信息获取。这导致中国互联网可能正走向一条“娱乐化”的道路,与更偏向信息与思考的美国互联网形成差异。作者将这称为一种“中国特色”,并预见其速度可能会因资本催化而加快。 这不仅仅是一次对政策与技术墙的讨论,更是对一个产业生态如何被无形力量重塑的观察。它提醒我们,任何技术干预都具有双面性,在获得短期庇护与独特发展模式的同时,也可能在某种程度上限定了长远的可能性和想象空间。

本机暂存
IT 后端/ 2013-08-02 13:23:40 / 累计浏览 3,259

RAID卡MTRR的RAID模式write-combining

这篇讲的是CPU中一个常被忽略的硬件优化机制——合并写(write-combining)缓冲区,以及如何通过代码设计来利用它提升性能。 现代CPU为了弥合与主存的速度鸿沟,不仅依赖多级缓存,还内置了数量有限的、大小与缓存行相同的写缓冲区。当写入操作未命中缓存时,数据会暂存于此。如果后续有针对同一缓存行的写入,硬件能将这些数据在缓冲区中合并,等凑够有效数据后再一次性传输到下级缓存,从而极大提升总线效率。 文章通过一段Java代码做了生动对比:一种写法是在单个循环中连续写入6个不同数组的相同内存位置;另一种则是将任务拆分,先用一个循环写入前3个数组,再用另一个循环写入后3个数组。测试结果显示,拆分循环的方式耗时几乎减少了一半(例如从约14秒降至约8秒)。这个反直觉的结果,正是因为它更好地匹配了CPU有限的写缓冲区(例如Intel CPU通常只有4个),确保每次循环写入都在缓冲区容量内,从而有效触发了合并写机制,避免了缓冲区被过早填满而带来的性能惩罚。 文章通过这个具体例子揭示,理解CPU微架构的底层细节,有时能写出表面冗余但实际运行更快的代码。即使做了更多循环迭代,但优化的内存访问模式带来了实实在在的性能收益。

本机暂存
IT 后端/ 2013-07-31 13:33:06 / 累计浏览 4,460

Php session内部执行流程的再次剖析

这篇讲的是PHP session扩展在底层的完整执行流程。作者从技术实现的角度,将session的整个生命周期拆解成了几个清晰的阶段。 首先,文章指出了一个核心概念:PHP session本质上是一个内核扩展。当它加载时,PHP会做两件关键的事:初始化用于读写session数据的`save_handler`(默认是文件,但也支持自定义),以及根据`session.auto_start`配置决定是否自动开启session。 接下来,重点剖析了session启动时的具体逻辑。如果客户端是首次访问(请求中没有session ID),PHP会生成唯一的ID并通过Set-Cookie头部下发。如果携带了session ID,则会执行一系列严谨的操作:从Cookie中提取ID、调用`save_handler`的`open`接口、验证并注册`$_SESSION`全局数组,最后通过`read`接口(如从文件或数据库)加载序列化的数据到数组中。 文章的收尾部分解释了请求结束时的数据持久化过程:PHP会收集`$_SESSION`数组的变化,将其序列化后,通过`write`接口存储起来。 整体来看,作者没有停留在概念层面,而是深入到内核函数的调用顺序和数据流转,将看似黑盒的session机制剖析得条理分明。对于想理解PHP底层工作原理的开发者来说,这是一次扎实的流程拆解。

本机暂存
IT 后端/ 2013-07-31 13:32:23 / 累计浏览 3,732

进程管理器supervisor的使用(django实例)

这篇讲的是用Supervisor管理多个Django进程的具体实践。作者从Python生产环境中常见的进程管理需求出发,介绍了Supervisor这个由Python实现的工具。 在典型的部署场景里,通常需要用Supervisor同时启动多个Django或Tornado应用,让它们监听不同端口,再由前端的Nginx进行反向代理。文章以Ubuntu环境为例,详细演示了从创建Python虚拟环境、安装Supervisor,到编写配置文件的完整过程。 配置是关键,作者分享了几个核心点:通过`numprocs`参数指定启动的进程数,结合`process_num`变量动态分配不同端口;特别提到了配置Unix socket文件时,权限设置需使用`sockchown`而非`chown`的坑。最终的目标是让一个名为“sayhello”的Django项目成功运行在8000和8001两个端口上。 文章也坦诚地提到,对于这种架构是否算负载均衡,作者尚未深入研究,展现了实践中边做边学的真实状态。整体而言,这是一篇聚焦于具体配置和常见陷阱的实用向导。

本机暂存
IT 数据库/ 2013-07-31 13:24:10 / 累计浏览 1,921

数据的游戏:冰与火

这篇讲的是一位在Amazon和淘宝都有过实践的数据挖掘新人,在不到10个月里总结出的“冰与火”心得。作者开篇就点明,数据世界象征着权力与征服,但通往“王座”的道路布满荆棘。 文章的核心观点很明确:他从Amazon经验中提炼出数据团队的三大角色——苦累却至关重要的数据清洗员、技术含量最高的研究科学家、以及相对次要的软件开发工程师。作者强调“Garbage In, Garbage Out”,再牛的算法也敌不过一堆垃圾数据。 通过两个生动的案例,作者阐明了数据质量的重要性。一是像Amazon那样建立严格的商品ID(ASIN)作为数据标准;二是清洗海量但格式混乱、真假混杂的用户地址数据。他指出,数据不分大小,只分好坏,从80%的准确度提升到90%,所需成本远超过从60%到80%。 作者进一步讨论了业务场景对数据挖掘的制约。推荐系统在音乐和电商场景下逻辑截然不同,对书籍和服装的需求预测难度也有天壤之别。他提醒,数据挖掘远非人工智能,在特定业务场景下,资深从业者的经验甚至比机器学习更准。 最终,作者认为数据分析结果不能止步于统计呈现,必须能指导下一步行动。他抛出了数据挖掘中质量、场景与结果这三个关键问题,虽未给出标准答案,却为从业者揭示了被算法光环所掩盖的实践本质。

本机暂存
IT 前端/ 2013-07-31 13:22:00 / 累计浏览 2,592

加载,不只是少一点点

这篇讲的是前端性能优化中的“加载精简”策略,其核心目标是解决页面加载慢、带宽成本高的问题。文章重点剖析了离线存储(Application Cache)这一具体方案。 作者指出,加载精简能通过减少资源加载量来加速首屏,并在一定程度上提升渲染速度。具体实施上,离线存储依赖于manifest文件来划分需要缓存和在线获取的资源,在移动端(如离线APP)应用尤为广泛。文章详细说明了其配置方法、基于版本注释的更新机制,以及监听网络状态实现更智能更新的进阶思路。 然而,文章并未止步于优点。它坦诚地揭示了离线存储的“残缺美”:更新时全量下载导致效率低下,manifest文件可能因资源列表庞大而变得臃肿,以及无法很好处理同一页面的不同参数URL等问题。 因此,作者的结论非常务实:寻找适合项目自身阶段(如初期侧重SEO)和性质的方法至关重要,而非盲目采用。离线存储虽能有效“加速”,但其使用需要权衡其利弊与实际场景需求。

本机暂存
IT 前端/ 2013-07-31 13:18:59 / 累计浏览 4,467

JavaScript 设置浏览器标题闪动

这篇文章讲的是一个简单却实用的前端交互技巧:如何让浏览器标签页的标题闪动,从而在用户不看页面时也能有效提醒他们有新消息或内容更新。 作者直接给出了一个名为 `BlinkTitle` 的 JavaScript 类来实现这一功能。核心思路非常清晰:通过 `setInterval` 定时器,让 `document.title` 在一个新标题(如“新消息!”)和原始标题之间来回切换,制造视觉上的闪烁效果。代码实现中巧妙地做了备份和恢复,用户点击“停止”后,标题能立刻恢复原样。 这种方法不依赖任何库,代码轻量,非常适合嵌入到需要实时提醒的网页应用中,比如在线客服系统、后台管理界面或者任何使用 Ajax 长轮询的页面。当用户切换到其他标签页工作时,这个闪动的标题就能成为一个不容忽视的提醒信号。

本机暂存
IT 后端/ 2013-07-31 13:16:47 / 累计浏览 2,868

Storm入门教程 第五章 一致性事务

这篇讲的是Storm如何保证流数据的“精确一次”处理。作者从一个基本问题切入:Storm的ack机制保证了tuple被成功处理,但如果出错重传,如何确保同一个tuple不会被重复处理? 文章首先分析了两种朴素的设计:强顺序流(一次处理一个tuple,性能差)和强顺序Batch流(一次处理一批tuple,但batch间仍需串行)。这两种方案都因为顺序性限制而难以真正分布式。 为了突破这个瓶颈,文章详细拆解了Storm内部CoordinateBolt的工作机制,它是实现事务协调的关键。基于此,Storm提出了Transactional Topology,其核心是将计算分为可并行的“process”阶段和保证强顺序的“commit”阶段。通过为每个batch分配唯一的transaction id和attempt id,系统能够区分不同的batch以及同一batch的不同重试版本,从而在并行计算的同时实现事务的原子性与一致性。 尽管文章最后指出Transactional Topology已由更现代的Trident取代,但其分阶段处理与版本化ID的设计思想,对于理解分布式系统中如何平衡吞吐与一致性,依然有很高的参考价值。

本机暂存
IT 后端/ 2013-07-31 13:16:11 / 累计浏览 3,248

storm入门教程 第四章 消息的可靠处理

Storm 通过 tuple tree 机制确保从 Spout 发出的每条消息都被可靠处理。这篇文章从基础概念出发,清晰解释了 Storm 如何定义“消息被完整处理”:即由初始消息派生出的所有子消息构成的 tuple tree 被完全处理,且无新增节点。作者以单词统计为例,形象地说明了这种树形结构如何形成。 核心在于 Storm 的可靠 API 设计。开发者需要在创建新消息时进行“锚定”,将其关联到输入消息上,从而将新节点加入 tuple tree;同时在消息处理完毕后必须显式调用 ack 或 fail。文章特别指出,通过 BasicBolt 接口可以简化这类流程,但也说明了对于聚合、join 等需要延迟应答的场景,需要更灵活的处理。 Storm 内部则通过 Acker 任务高效跟踪这些可能变为 DAG 的 tuple tree。每个消息都有唯一 ID,Acker 利用这些 ID 追踪树的变化,并在树被完全处理时通知源 Spout。调整 Acker 的并发度(配置 TOPOLOGY_ACKERS)能提升高吞吐场景下的可靠性。整体上,文章将可靠消息处理的原理、API 用法和内部实现串联起来,为构建高容错实时应用提供了扎实的指引。

本机暂存
IT 后端/ 2013-07-31 13:15:21 / 累计浏览 2,630

Storm入门教程 第三章 Storm安装部署步骤

这篇讲的是如何动手搭建一个Storm集群的实战指南。文章基于Storm官方Wiki,从介绍集群架构开始——它由负责分发任务的Nimbus主节点和执行任务的Supervisor工作节点构成,两者通过Zookeeper进行协调,且设计为无状态、快速失败,保证了高可用性。 其价值不止于罗列安装步骤。作者真正强调的是部署中容易遇到的“坑”以及对应的解决方案。例如,在搭建Zookeeper时,提醒要配置监控程序实现自动重启,并定期清理日志以避免磁盘占满;在安装ZeroMQ依赖库时,明确指出应避开有严重bug的2.1.10版本,推荐使用2.1.7,并提供了特定系统报错时的解决方法。这些来自实践的细节,能帮开发者避开很多重复摸索。 对于想从零开始部署Storm或理解其底层协调机制的技术人员,这篇教程提供了清晰的路线图和宝贵的避坑经验,将理论步骤与实战注意事项结合得相当扎实。

本机暂存
IT 后端/ 2013-07-31 13:14:53 / 累计浏览 4,255

Storm入门教程 第二章 构建Topology

这篇讲的是Storm分布式计算框架的核心概念与Topology构建入门。文章从集群架构切入,清晰地对比了Storm与Hadoop的关键区别:Hadoop运行MapReduce作业会结束,而Storm的Topology一旦部署将持续运行。接着,它系统梳理了构成Storm处理逻辑的核心组件,包括作为数据生产者的Spout、执行具体业务逻辑的Bolt,以及定义数据流向与分发规则的Stream Grouping,并详细解释了Shuffle、Fields等七种分组模式的应用场景。 文章的重点在于演示如何将概念付诸实践。它通过一个经典的单词频率统计案例,手把手地展示了构建一个简单Topology的全过程:从设计数据流(KestrelSpout -> SplitSentence -> WordCount)开始,到代码实现与部署。这个过程不仅让读者理解Topology由Spout和Bolt通过流分组连接而成的本质,也直观呈现了Storm如何将一个分布式实时计算任务拆解并运行在多个工作进程上。对于刚接触流式计算的开发者,这是一种从抽象概念到具体实现的有效学习路径。

本机暂存
IT 后端/ 2013-07-31 13:13:57 / 累计浏览 5,113

storm入门教程 第一章 前言

这篇Storm入门系列的开篇第一章,从互联网对“实时性”的需求演进讲起。作者指出,从早期的Portal信息浏览到SNS、电子商务,数据爆炸与实时处理的需求催生了流式框架,而2010年S4、2011年Storm的开源,真正让开发者能低成本地构建实时应用。 文章重点解析了Storm作为分布式实时计算系统的六大核心特点。它借鉴了Hadoop的编程模型,提供了简单优美的原语来处理并行实时任务;其“可扩展性”体现在工作进程、线程和任务的多层并行结构上。尤为关键的是其“高可靠性”设计——Storm通过跟踪消息树并利用异或计算,确保每条消息都能被“完全处理”,并保证了容错性与水平扩展能力。此外,Storm还支持通过多语言协议使用任意语言开发,并提供了模拟集群的本地模式,极大方便了开发与测试。 本章不仅是功能列表,更描绘了Storm如何将开发者从繁琐的分布式系统底层细节中解放出来,使其能专注于业务逻辑。

本机暂存
IT 数据库/ 2013-07-31 13:12:54 / 累计浏览 2,931

HBase解决Region Server Compact过程占用大量网络出口带宽的问题

这篇讲的是作者在维护一个HBase 0.94.0集群时遇到的实际问题。他们发现多台Region Server的网络出口带宽经常跑满千兆网卡极限(接近100MB/s),机器负载也异常高。在排查中,一个关键疑点是:根据查询量估算,出口带宽本应只需约60MB/s,但实际观测值却多出了约40MB/s。 经过对源码(CompactSplitThread.java)的分析,根因被定位为集群在高写入压力下频繁触发了Compaction。由于Compaction过程本身需要读取大量数据,从而“偷走”了这部分额外的网络带宽。这是一个在0.92版本后,因引入small/large Compaction线程而可能出现的典型性能问题。 为此,作者提出了两个具体的配置调整方案。核心思路都是减少Compaction的并发度或触发频率:一是通过调大throttle值强制所有Compaction变为small类型,并保持线程数为1;二是直接将small Compaction线程数设为0以关闭它。应用配置后,Region Server的网络利用率显著下降至70MB/s以下,问题得到有效解决。

本机暂存
IT 前端/ 2013-07-31 12:53:05 / 累计浏览 7,223

如何成为一名优秀的web前端工程师(前端攻城师)?

作者开篇指出一个常见现象:许多前端程序员要么不断追问“如何学习”,要么轻视前端“就那么一点东西”,却很少有人思考如何成为一名优秀乃至卓越的前端工程师。 这篇文章系统剖析了这个职业。它首先厘清了前端工程师的核心技能栈——HTML、CSS与JavaScript,但强调其知识体系远不止于此,还需涵盖性能优化、SEO、服务器端基础以及各种辅助工具与架构理念。作者坦言前端入门快但精通难,学习曲线是“先快后慢”,许多从业者易停留在“会用”的阶段,而琐碎的知识点和快速迭代的技术更增加了系统化成长的难度。 文章的精华在于明确了优秀前端工程师的必备特质:既要具备知识的广度与深度,以应对从基础编码到复杂架构的全链条挑战;又必须拥有极快的学习速度,以跟上Web技术日新月异的变化。此外,沟通能力被提升到关键位置,因为前端工程师需要与产品经理、UI设计师、项目经理及最终用户等多方有效协作。文中引用了Yahoo工程师Nicholas C. Zakas的观点,称前端是计算机科学中最复杂的工种之一。 最后,作者推荐了一份从入门到精通的JavaScript书单,如《JavaScript高级程序设计》、《JavaScript权威指南》以及《JavaScript Patterns》等,并指出要成为真正的优秀者,还需深入研究高性能网站构建、HTML5/CSS3乃至后端语言,道路虽艰辛,但方向清晰。

本机暂存