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

最新文章

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

IT 后端/ 2015-01-11 23:45:41 / 累计浏览 3,539

从未降级的搜索技术-天猫SKU搜索

这篇技术文章详细拆解了天猫搜索从“商品级”跨越到“SKU级”的完整演进历程。作者直面传统搜索的痛点:当用户想买特定规格(如64G白色iphone6)时,旧引擎只能按商品维度返回结果,导致价格展示不准确、过滤和排序形同虚设。 文章核心聚焦于如何实现既能支持SKU粒度精准检索,又不造成海量数据冗余的难题。最终提出的“主表(商品)+子表(SKU)”二维架构是解决方案的关键:引擎能同时处理两个维度的查询,并形成“一主带多子”的结果结构,让过滤、排序等环节都能基于真实的SKU信息工作。 通过CSPU聚合、精准排序等具体场景的实现,该技术上线后在多个类目带来了可度量的收益,例如沙发类目平均IPvUV价值增长8.50%。这不仅是一次架构升级,更是将“尺码个性化”等精细体验从想法变为现实的基石。

本机暂存
IT 前端/ 2015-01-11 23:41:02 / 累计浏览 2,868

Github 的 CSS 风格指南

这篇讲的是GitHub内部如何“写”CSS。它并非基础教程,而是一套从实战中淬炼出的系统性工程规范,直接解决了前端开发中代码混乱、维护困难的痛点。 文章清晰定义了从微观编码到宏观架构的每一层细节。微观上,它明确了如双空格缩进、属性冒号后加空格、优先使用`//`注释等具体规则,确保代码风格统一可读。更关键的是架构层面,它倡导使用SCSS,并给出了清晰的目录组织范例(components, globals, sections等),强调`$variable`与`@mixin`的集中管理。 在CSS特异性控制上,指南给出了极具操作性的原则:谨慎使用ID选择器,优先使用类名,倾向直接后代选择器(`>`)以降低复杂性。对于字体大小等单位选择、`js-`与`is-`类名的命名区分,也都有明确约定。整套体系的目标是提升代码的一致性、可维护性与团队协作效率,对于任何希望规范化CSS项目的团队都具有很高的参考价值。

本机暂存
IT 前端/ 2015-01-11 23:39:59 / 累计浏览 2,953

消除疑问:CSS动画 VS JavaScript

这篇讲的是CSS动画和JavaScript动画之间的选择,并非像很多人想的那样简单。作者从自己作为动画爱好者的亲身体验出发,深入研究后发现,被广泛推崇的CSS动画其实存在一些缺陷。 文章首先指出了CSS的一个明显短板:它的`transform`属性将缩放、旋转和位移捆绑在一起,无法用不同的时间和缓动函数独立控制,这在复杂动画序列中是个实际问题。 更关键的是,作者拆解了“CSS动画性能更好”这一普遍认知。文章详细分析了“硬件加速”的两个层面:一是GPU层的创建,但这并非CSS专利,JavaScript通过`translate3d`等3D变换同样可以触发;二是将计算转移到不同线程,但这个过程本身有开销,且只对与文档流无关的属性有效,实际收益可能被高估。文中还通过压力测试对比显示,现代JavaScript动画库(如GSAP)的性能可以远超jQuery,并不逊色于基于CSS的方案。 最终,文章澄清了一个核心观点:CSS动画并非在所有情况下都是“更干净”或性能更优的选择。理解它们各自的局限和性能本质,才能根据项目需求——是简单的整体变换,还是需要复杂独立控制的序列——做出更合理的技术决策。

本机暂存
IT 设计/ 2015-01-11 23:37:42 / 累计浏览 2,299

走近用户,从访谈开始

这篇讲的是,如何让业务方伙伴也能快速上手用户访谈,把这项用研核心技能变成拉近与用户距离的利器。文章开宗明义,点出访谈是用于定位问题、挖掘需求的定性方法,它要解答“是什么”和“为什么”,而非“有多少”。 作者将访谈要点提炼为几条关键法则:首先要像聊天一样提问,用生活化语言代替专业术语;其次,要聚焦用户过去和现在的真实体验,而非让他们凭空想象未知;再者,必须学会连贯追问,像“什么时间”、“什么场景”这样一步步把问题问透。 文章也直指业务方在初次尝试时容易踩的坑:提问不能过于开放模糊(比如“你觉得XX怎么样”),问题本身要避免带有倾向性(比如“这个功能好用吗”)。更重要的是,要多倾听,不随意打断用户,同时要引导用户详细描述遇到的问题本身,而不是直接跳到他们提供的解决方案上。 整篇文章就像一位经验丰富的用研在分享心法,既有方法论,也点出了实操中的具体陷阱,对于想亲自了解用户声音的业务方来说,是一份很实在的入门指引。

本机暂存
IT 前端/ 2015-01-11 23:30:59 / 累计浏览 3,864

jQuery选择器对应的DOM API ——选择元素

这篇技术指南直接拆解了常见的jQuery选择器写法,并展示它们在原生DOM API中的对应实现。作者的出发点很明确:在许多简单场景下,我们完全可以直接使用原生JavaScript,而无需依赖jQuery。文章并非完全否定jQuery,而是通过并列对比的方式,让开发者看清两者的功能重合点与差异。 例如,通过ID选取元素,jQuery的`$('#id')`在原生API中可以用兼容性更广的`document.getElementById()`,或者更现代的`document.querySelector()`来实现。文章详细覆盖了通过CSS类名、标签名、属性以及伪类选择等十余种高频场景,清晰地指出了在每种情况下如何用原生代码替代jQuery选择器。 这种对比的价值在于,它帮助前端开发者(尤其是习惯于jQuery的开发者)建立起对原生DOM查询方法的系统认知。理解这些对应关系,不仅能减少对库的依赖,也能在性能敏感或需要轻量级解决方案的项目中,提供更直接高效的选择。对于希望夯实基础、提升代码掌控力的开发者来说,这是一份非常实用的对照参考。

本机暂存
IT DevOps/ 2015-01-11 23:25:06 / 累计浏览 2,570

lftp利器与一次故障分析

作者分享了自己在使用lftp进行FTP目录同步时,从发现神器到“捅了大篓子”的完整经历。文章的核心是介绍lftp这款工具强大的`mirror`命令,它能像rsync一样递归同步整个目录,极大提升了原本繁琐的FTP文件发布效率。 作者通过一个实际的脚本故障,展示了使用中可能遇到的风险。在一次运行中,脚本因连接失败和`cd`命令返回550错误而中断,但脚本并未停止,导致本地开发目录被错误地同步到了线上正式环境,造成了严重事故。 经过排查,问题根因在于:lftp的命令流默认是顺序执行,即便中途失败也会继续向下。作者最终找到了一个简洁的解决方案:在每个lftp命令后使用`&&`操作符链接,确保只有上一个命令成功才执行下一个,从而彻底避免了目录切换失败后的误操作。 这篇文章从实际踩坑出发,生动展示了lftp的便利性及其潜在风险,并用几处符号的改动给出了一个高效的防御性编程技巧,这个经验教训很值得借鉴。

本机暂存
IT 前端/ 2015-01-11 23:24:03 / 累计浏览 2,759

css透明度的一些兼容测试

这篇讲的是前端开发中一个常见的“坑”:如何让CSS透明度效果兼容到IE8及以下浏览器。作者从接手一个外包项目时遇到的真实问题说起——原本用`opacity`属性实现的半透明遮罩层,在旧版IE上直接变成了不透的黑色色块,完全破坏了页面设计。 文章深入分析了问题根源:标准`opacity`会作用于整个元素及其所有内容,而IE的私有滤镜`filter: Alpha(opacity=...)`行为有所不同,且两者混合使用时在IE9等版本中会产生冲突。作者详细展示了三种解决方案的演进:先用`filter`配合`rgba`背景色打底;再针对IE9的异常表现,用条件注释单独处理;最后尝试用媒体查询hack(如`@media screen\9`)来更精简地分版本控制样式。 过程中,作者也坦诚讨论了各种方案的局限,比如`filter`在IE6下可能失效,以及hack写法对维护性的潜在影响。文末的建议很实在:除非对设计还原度有极致要求,否则应谨慎使用这些浏览器特有的hack。整篇文章从实际故障出发,逐步拆解,对需要处理多端兼容的前端开发者有很具体的参考价值。

本机暂存
IT 前端/ 2015-01-11 23:23:12 / 累计浏览 4,867

移动前端不得不了解的html5 head 头标签

这篇讲的是移动端开发中容易被忽视但至关重要的HTML head头标签最佳实践。文章从移动端工作的重要性切入,系统梳理了从基础到进阶的各类头部声明。 它首先明确了``和``这些基础标签的写法。随后,重点解析了`lang`属性更标准的写法(如`zh-cmn-Hans`)及其意义。文章还针对国内复杂的浏览器环境,给出了具体的解决方案:比如使用``让360浏览器切换到极速内核,以及添加``来禁止百度转码。 这些内容并非纸上谈兵,而是来自一线开发者的经验总结(如一丝和百度FEX的整理),直指实际项目中会遇到的兼容性和体验问题。对于移动前端开发者来说,这相当于一份即拿即用的头部标签配置清单,能帮助规避很多隐蔽的坑。

本机暂存
IT 后端/ 2015-01-11 23:19:57 / 累计浏览 3,761

为什么超长列表数据的翻页技术实现复杂(二)

这篇讲的是如何为超长列表设计高效的翻页方案。作者延续上篇对问题的探讨,以新浪评论系统的经典演进为引子,剖析了从缓存翻页到自定义文件索引等方案的演进与局限,最终聚焦于一个核心矛盾:MySQL常用的B-TREE索引结构,虽擅长点查,却天生不利于范围查询(Range Scan),导致翻页性能低下。 为此,文章提出了两种实用的二级索引思路。一是“Count index”,通过额外记录每个非叶子节点下的条目总数,实现对任意offset位置的快速定位。二是“Offset index”,在应用层(如Redis)缓存部分offset与对应ID的映射关系,当需要定位某个offset时,可以从最近的缓存点开始扫描。 文章进一步给出了这两种思路在MySQL和Redis中的具体实现示例。比如Count index可以建一张辅助表按月份记录各用户的评论计数,而Offset index则在用户翻页时动态缓存到Redis,并在数据变更时及时清理。这两种方法都已在实际生产环境中得到验证,为解决超长列表的翻页难题提供了清晰且可落地的技术路径。

本机暂存
IT 后端/ 2015-01-11 23:18:21 / 累计浏览 3,398

第三方支付为什么会兴起

这篇文章从作者多年的外贸经验切入,探讨了一个有趣现象:为何在国际贸易中早已成熟的银行担保模式(如信用证),到了国内电子商务领域,却被第三方支付全面取代。 作者指出,支付宝的担保交易原理与信用证如出一辙,都是为了解决远程交易中的信任问题。但奇怪的是,银行并未将这套成功的经验复制到国内网购市场,这种“不闻不问”的态度,为第三方支付的崛起留下了巨大的市场空白。文章还对比了信用卡的历史——它同样由第三方机构首创,后因银行受地域经营限制,才催生出跨行合作的卡组织来反超。 核心观点在于,银行因过往业务过于舒适,低估了互联网支付的战略意义,未能及时行动。等到第三方支付从工具演化到金融平台时,格局已定。文章最后抛出一个开放性问题:历史上第三方支付曾颠覆信用卡旧模式,未来它是否会进一步侵蚀银行信用证业务?这不仅是商业策略的复盘,也揭示了技术浪潮中,巨头的疏忽如何让机遇溜走。

本机暂存
IT 后端/ 2015-01-11 23:15:18 / 累计浏览 1,828

为什么 skynet 提供的包协议只用 2 个字节表示包长度

这篇讲的是 skynet 框架中一个经典设计决策:为什么它的 netpack 库坚持使用 2 字节(最大 64KB)来表示 TCP 数据包长度,而不是更“灵活”的 4 字节。 作者从游戏客户端网络通信的实际场景出发,解释了这并非简单的技术限制,而是一种有意的引导。核心原因在于,在单个 TCP 连接中允许过大的数据包(比如 100KB)是一个糟糕的设计。这会在弱网环境下长时间阻塞整个通信信道,连带心跳包等需要及时响应的小数据包也被延迟,严重影响实时性。更进一步,4 字节的长度头还存在被恶意攻击耗尽服务器内存的安全风险。 因此,作者主张正确的做法不是放宽包长度限制,而是在“长度+内容”协议之上增加一层,将大数据块分片传输。这个设计看似“绕”,但它强制开发者去思考和解决数据传输的阻塞问题,最终能实现单个 TCP 连接承载多个逻辑信道的能力,比如区分高优先级的心跳/关键指令和低优先级的聊天信息或大文件分片。 所以,skynet 这个看似限制性的选择,其实是在用简洁的接口引导使用者构建更健壮、响应更及时的网络架构。

本机暂存
IT 前端/ 2015-01-05 23:49:40 / 累计浏览 2,712

JavaScript內存优化

这篇讲的是JavaScript如何从语言底层进行内存优化。作者从作用域、作用域链和闭包这三个基础但关键的机制切入,解释了它们如何影响内存的分配与释放,比如未用`var`声明的变量会意外挂到全局作用域,而闭包则会延长内部变量的生命周期。 文章进一步剖析了V8引擎(Node.js和Chrome的核心)的内存回收策略,包括其分代管理思想(新生代与老生代)以及Scavenge、Mark-Sweep等主要垃圾回收算法。核心观点在于,理解“引用”是判断对象是否存活、能否被回收的根本,这直接决定了优化的方向。 最后,文章将理论落地到实践,推荐了如“善用函数作用域包裹代码”等具体优化技巧,其背后的逻辑正是利用函数作用域来及时终结不再需要的变量引用,避免内存泄漏。对于前端开发者、Node.js服务端开发者而言,理解这些原理是写出高性能、低开销代码的重要一步。

本机暂存
IT 前端/ 2015-01-05 23:48:28 / 累计浏览 2,185

前端代码异常监控

这篇讲的是,一个线上前端代码的低级拼写错误,如何催生了一套异常监控体系的实践。 作者分享了一个真实教训:上线一段简单的统计脚本时,误将变量“len”写成“l”,导致后续JS全部失效,广告功能瘫痪,引发大量用户投诉。这个案例引出了一个核心反思:与其在问题爆发后被动响应,不如建立机制主动感知。 文章核心探讨的解决方案是,在用户侧部署前端异常监控。通过 try-catch 捕获代码块错误或监听全局 window.onerror 事件,将捕获到的语法和运行时错误信息上报服务器。关键在于对异常数据的量化分析。文章展示了如何通过监控异常数量的曲线,与历史数据(如前一天或上周同期)对比,来实时感知异常波动。案例中,上线时曲线飙升,修复后迅速回落,形成一个完整的“发现问题-定位-修复-验证”闭环。这让开发者能在用户投诉之前,就主动发现问题并介入处理,极大地提升了线上功能的稳定性和故障响应效率。它让抽象的“前端健壮性”概念,有了具体可操作的数据抓手和处置流程。

本机暂存
IT 移动开发/ 2015-01-05 23:43:55 / 累计浏览 3,688

微信webview模拟器

作者从微信webview开发调试的痛点出发:JSAPI无法调试、登录态难模拟、手机与PC开发环境难以互通。安卓模拟器方案又过于笨重。为此,他提出一个轻量级的解决方案:一个运行在Chrome浏览器中的“微信webview模拟器”插件。 这个工具的巧妙之处在于实现方式。它通过浏览器书签栏执行一段JS脚本,动态在当前页面绘制一个模拟的iPhone外壳,并用iframe加载待调试的网页。关键的一步是,利用同域策略向iframe内部注入模拟的`WeixinJSBridge`对象,并触发`WeixinJSBridgeReady`事件,从而“欺骗”网页认为自己运行在微信环境中。 效果立竿见影:开发者现在可以直接在PC上连接内网开发机或本地页面进行调试。所有JSAPI的调用参数都会在控制台清晰打印,收藏、分享到朋友圈等常用操作也模拟出了UI界面。这套方案绕开了环境与资源的限制,让微信网页调试变得像调试普通网页一样直接方便。

本机暂存
IT 安全/ 2015-01-05 23:41:09 / 累计浏览 3,545

SSLStrip 的未来 —— HTTPS 前端劫持

这篇文章探讨的是在HTTPS日益普及的今天,传统的中间人攻击工具SSLStrip面临的挑战与进化。作者从后端劫持的局限性出发,指出SSLStrip这类纯流量层的工具在现代Web面前已力不从心,难以处理动态生成的链接、数据包分片以及高昂的性能开销。 核心思路因此转向“前端劫持”。通过向页面注入脚本,利用事件捕获机制(如监听全局点击事件),攻击者可以在用户点击链接的瞬间,临时将HTTPS地址修改为HTTP。这种方法巧妙地绕过了后端的种种问题:只需处理页面首个数据块即可完成渗透,对性能影响极小;同时能应对各种动态添加的链接,甚至表单提交、脚本弹窗和框架页面。文章详细解释了如何通过修改链接的href属性并在下个事件循环中还原,来实现实时且无痕的替换,比传统的DOM扫描轮询方案更为优雅和彻底。 本质上,这篇内容揭示了网络攻击手段随技术栈演进的路径——从粗放的流量篡改,转向更精细、更贴近应用层的前端逻辑操控。对于安全研究人员和前端开发者而言,它清晰地展示了一种新型攻击面的技术原理与实现细节。

本机暂存
IT 安全/ 2015-01-05 23:38:27 / 累计浏览 2,148

WebView跨源攻击分析

这篇技术分析深入探讨了WebView中的跨源安全问题。作者从浏览器最核心的同源策略(SOP)讲起,通过清晰的表格对比了不同URL是否同源,为后续分析打下基础。 文章重点剖析了Android WebView中与`file://`协议相关的几个关键API配置:`setAllowFileAccess`、`setAllowFileAccessFromFileURLs`和`setAllowUniversalAccessFromFileURLs`。作者通过代码示例和机制解释,揭示了当这些开关设置不当时,恶意网页如何利用`file://`协议绕过同源策略,读取应用沙箱内的任意文件,造成严重的安全风险。文中还提到了不同浏览器对`file://`协议处理的差异,增加了讨论的深度。 对于从事移动端开发或安全研究的读者来说,这篇文章清晰地梳理了WebView配置中那些看似平常却可能致命的开关。理解这些细节,是构建安全WebView应用的基础。

本机暂存
IT 安全/ 2015-01-05 23:38:22 / 累计浏览 2,635

WebView跨源攻击分析

这篇讲的是WebView安全中一个核心但常被忽视的问题:同源策略在本地文件场景下的边界。 作者龚广从浏览器同源策略的基本原理讲起,用一个清晰的对比表格说明了协议、域名、端口三要素如何共同决定URL的同源性,比如“http://www.360.cn:8088”因端口不同就与基准URL非同源。文章的核心深入到了file协议这个特殊领域:当JavaScript通过http页面加载时,file协议通常被视为非同源以阻止读取本地文件;但当JS本身通过file协议加载时,不同浏览器的处理策略则存在显著差异,这为攻击留下了可能的缝隙。 具体到Android WebView,文章通过示例代码展示了四个关键API设置——从是否允许加载file URL,到是否允许file URL中的JS进行跨域访问。这些配置如同一组开关,开错一个就可能让应用暴露在风险中。文章没有停留在理论,而是将同源策略的复杂边界与移动开发的具体实践结合,揭示了WebView安全配置中那些看似细微、却至关重要的决策点。

本机暂存
IT 前端/ 2015-01-05 23:36:09 / 累计浏览 3,693

写了10年Javascript未必全了解的连续赋值运算

这篇讲的是连续赋值运算符“=”在JavaScript中一个反直觉的表现。作者从阅读jQuery源码时遇到的一行代码 `a.x = a = {n:2}` 出发,对它的执行顺序和内部机制产生了好奇。代码中,初始 `a` 指向 `{n:1}`,执行后 `a.x` 为 `undefined`,这个结果并不直接。 作者首先提出了两种常见的错误猜想:一种认为是从左到右赋值,另一种认为是从右到左但引擎会阻止赋值。为了验证,他引入了一个关键变量 `b` 来持有 `a` 的原始引用。实验结果令人惊讶:`a.x` 仍为 `undefined`,但 `b.x` 却变成了 `[object Object]`。这说明 `a.x = {n:2}` 这个赋值实际上执行了,只是发生在 `a` 被重新赋值之前。 文章揭示的核心机制是:该表达式被引擎解释为 `a.x = (a = {n:2})`。首先,最右边的 `a = {n:2}` 执行,使 `a` 指向新对象;然后,这个新值 `{n:2}` 被赋给左边 `a.x` 中的 `a`。关键在于,左边的 `a.x` 在表达式求值时,其引用(指向原对象 `{n:1}`)已被锁定,因此赋值操作作用于原对象,而非新对象。作者用箭头图示清晰地展示了这一引用分裂现象。 文章最后还以一个函数中 `var a = b = 5` 导致 `b` 泄漏为全局变量的例子,延伸了连续赋值的另一个常见陷阱。整篇文章通过对一个细节的深度追问,澄清了连等赋值的真实执行路径与引用关系的变化。

本机暂存
IT 前端/ 2015-01-05 23:34:46 / 累计浏览 7,165

为什么++[[]][+[]]+[+[]]=10?

这篇讲的是JavaScript中一个令人费解的表达式++[[]][+[]]+[+[]]为何能成功计算并返回"10"。文章从这个看似荒诞的等式出发,带领读者深入理解JavaScript底层的一系列特性:一元加运算符的强制类型转换、数组的隐式字符串拼接,以及自增运算符的优先级。作者将这个天书般的表达式层层拆解,从+[]变为0,到数组访问和自增操作,最终揭示1与字符串"0"的拼接过程。最巧妙的是,文章没有停留在表面解释,而是清晰地展示了JavaScript在处理隐式转换时那些违反直觉却符合规范的行为,让原本晦涩的规则变得具体可感。这不仅是一次对特定表达式的解构,更是一次对语言本质特性的生动展示。

本机暂存
IT 开发者/ 2015-01-05 23:32:25 / 累计浏览 2,404

如何构建优质代码

这篇讲的是如何编写出高质量、易维护的代码。作者从实际工程经验出发,总结了10条核心原则。 他开篇就强调了DRY(不要重复自己)的重要性,并举了单元测试中违反此原则会导致维护成本剧增的例子。文章还指出,写出短小的方法、采用能“望文生义”的命名规范,能让代码更易读和重用。 在设计层面,文章建议让每个类只承担“正确的”职责,并注重接口的稳定性而非实现细节。为了保障质量,作者大力推荐编写大量的单元测试,并以此为安全网,进行小步、持续的代码重构。 最后,他提到了一个颇具争议的观点:比起写糟糕的注释,不如花时间重构代码使其更清晰。同时,强调了代码审查机制对于发现错误和共享知识的价值,但要求审查者能力合格,并对代码负责。 这些原则共同指向一个目标:编写出更健康、更易于协作和演进的软件。

本机暂存