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

最新文章

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

IT 开发者/ 2014-11-23 21:06:37 / 累计浏览 2,299

熬夜

作者回顾了自己在北京近二十年来,几种不同性质的“熬夜”经历。从学生时期为赚取生活费、在机房“偷电”学习计算机的被动熬夜,到初入IT行业为掌握新技术而如饥似渴的主动学习,再到后来出入三里屯工体、社交饮酒带来的“模糊”熬夜,最终在创业阶段,熬夜成为伴随日常的“理所当然”。 文章并非讨论健康建议,而是通过个人时间线,呈现了一个技术人生活状态的变迁缩影:初期是生存与求知驱动,中期混杂着社交惯性,后期则是被事业责任与焦虑裹挟。作者坦言,熬夜早已成为难以摆脱的习惯,并坦诚表达了对未来的担忧。 这篇分享的动人之处在于其真实性,它映照出许多同龄人相似的矛盾——一边熬夜,一边焦虑。最终,作者送上了朴素的祝福,希望所有熬夜的朋友都能身体健康。

本机暂存
IT 前端/ 2014-11-23 21:04:40 / 累计浏览 3,334

支付方式选择页面的设计

这篇文章讲的是支付环节这个“临门一脚”的页面设计,看似简单,却常常因为糟糕的设计阻碍用户完成付款。作者从国际网站需要支持多样化支付方式的现实背景出发,重点剖析了几个典型的设计误区。 比如,像Office Max那样把信用卡和账单选项的单选按钮分开摆放,或者Avon把支付选项和对应的表单区域在视觉上割裂,都会破坏“邻近性”原则,让用户难以理解选项间的互斥关系,甚至不知道自己当前处于哪个支付流程。更极端的案例是Diapers.com,在页面上同时堆砌多个支付表单和不同颜色的按钮,让用户完全不知道下一步该点哪里。 作者通过这些反面案例,引出了设计支付方式选择界面的核心原则:将所有支付选项集中布局、清晰标示当前激活状态、只展开与当前选项相关的表单区域,并可考虑预设最流行的支付方式来加速流程。文章的最终目的,是帮助设计者在支持多种支付方式的复杂性与用户操作的流畅性之间找到平衡,减少选择困难,确保用户能顺利付款。

本机暂存
IT 设计/ 2014-11-23 21:01:43 / 累计浏览 3,509

iOS和Android设计规范备忘表

这篇介绍了一个iOS与Android设计规范的对照表,作者认为这是目前较为清晰易用的参考资源。文章直接呈现了一个全面的对比图表,涵盖了两个平台在导航、交互、图标、排版等核心方面的设计差异。 例如,iOS的设计强调简洁和一致性,导航常置于底部,交互反馈偏向微妙动画;而Android更

本机暂存
IT 前端/ 2014-11-23 21:00:43 / 累计浏览 1,175

浏览器兼容模式X-UA-Compatible的设置

X-UA-Compatible是开发者控制IE浏览器使用何种渲染引擎的核心手段。这篇文章系统梳理了该属性的常用值及其工作逻辑。 文章详细对比了IE=7、8、9这类绝对模式与IE=EmulateIE7、EmulateIE8这类模拟模式的关键区别。绝对模式强制以特定版本渲染,而Emulate模式则会参考文档的DOCTYPE声明,在标准模式下模拟指定版本,在怪癖模式下回退到IE5。对于多数站点,EmulateIE7曾被推荐为首选兼容模式。 此外,文章还解释了IE=edge模式的作用:它让IE始终使用当前版本支持的最高标准来渲染,避免版本锁定。一个更有趣的方案是整合Google Chrome Frame,即通过`chrome=1`强制IE使用Chrome内核,文章甚至给出了检测并提示用户安装该插件的代码。 最终,文章指出了最佳实践是组合使用`IE=edge,chrome=1`。这能确保在装有Chrome Frame的IE中走Chrome内核,在其他IE中则启用最新的渲染模式,有效兼顾了兼容性与现代标准支持。

本机暂存
IT 后端/ 2014-11-23 20:57:53 / 累计浏览 2,493

分布式缓存的一起问题

这篇文章聚焦于分布式缓存主从架构中一个典型的“踩坑”场景:当master节点突发故障时,原本设计用于保障数据一致性的CAS(Compare-and-Swap)流程却会导致slave副本数据静默过期。作者从实际业务故障出发,剖析了问题根源——master cas失败后并未对slave执行set操作,导致新变更无法写入缓存。 文章进一步探讨了自动切换master角色为何不可行,以及手工切换或采用“delete slave”或“设置短过期”等补救方案时,仍需面对命中率下降、接口职责模糊等棘手权衡。最终,作者将问题抛回给读者:在这种对可用性与一致性都有要求的场景下,一个更完美的解决方案应该如何设计?

本机暂存
IT 后端/ 2014-11-23 20:57:04 / 累计浏览 2,297

记我配置Nginx代理的遭遇

这篇讲的是作者自认熟悉Nginx,却在配置一个简单的代理转发时连踩五个大坑的曲折经历。 核心任务是将形如 `/search/lamp` 的请求,代理到新服务并转换为 `/search?q=lamp` 的参数格式。作者从最直接的正则捕获与变量拼接方案开始尝试,但首次运行就遇到了“未定义resolver”的经典报错。根因在于代理地址中使用了变量时,必须显式配置DNS解析器。 作者不喜欢硬编码resolver,于是尝试移除变量,却立即触发第二个限制:在正则表达式定义的location块内,`proxy_pass` 指令不允许包含URI。被迫改用 `rewrite` 重写请求URI后,又遭遇变量作用域问题,正则捕获的变量无法直接在 `rewrite` 中使用。 借助社区提醒,通过 `set` 指令中转变量解决了传递问题,但这并非终点——新的问题是正则匹配会自动解码URL,导致传参错误。最终,作者通过使用 `$request_uri` 变量获取原始未解码的URI,并配合 `if` 指令进行条件判断,才在第五次尝试中成功搞定。这篇文章生动演示了Nginx配置中变量、位置块与指令之间复杂的相互作用,对避开这些“老坑”有直接的参考价值。

本机暂存
IT 后端/ 2014-11-22 23:50:00 / 累计浏览 1,837

PHP中字符串截取的效率

这篇讲的是 PHP 中一个性能细节:截取单个字符时,`substr()` 函数与直接使用 `$string{$start}` 或方括号访问的效率差异。 作者从算法优化的角度切入,因为在密集循环中,单个操作的微小差异会被放大。他设计了一个简单的基准测试,循环十万次来对比两种写法。结论很直观:直接使用 `$string{$start}` 的方式,执行速度大约是调用 `substr()` 函数的 **10 倍**。 文章还附上了这段测试代码,方法清晰易懂。这个发现意味着,在 PHP 中进行高频字符串操作(例如实现某些算法或处理大量文本)时,优先使用数组式的直接下标访问,不仅能写出更简洁的代码,还能获得显著的性能提升。对于追求代码效率的开发者来说,这是一个值得记住的实用技巧。

本机暂存
IT 设计/ 2014-11-22 23:49:31 / 累计浏览 1,955

量化用户研究

这篇讲的是如何量化地理解用户——从《Quantifying the User Experience》一书中摘出的核心章节。文章开篇用Edward Tufte的一句调侃点出“用户”这个称呼的特殊性:只有计算机设计和贩毒行业会这样叫。它聚焦于前者,即那些使用软件、网站和设备来完成目标的人,并强调我们的核心兴趣在于“如何量化用户的行为”。 作者重点剖析了可用性测试,清晰区分了两种类型:以发现问题、驱动改进为目的的“形成性测试”,和以指标描述产品可用性水平的“总结性测试”。绝大多数测试属于后者,通常会收集完成率、错误、任务时间等数据。文章纠正了一个常见误区:样本量并非越大越好。它以1936年《文学文摘》著名的民调失败为例,说明样本的“代表性”远比“随机性”或“大小”更重要——一个从正确人群中选取的小样本,远胜于从错误人群中抽取的大样本。即便只有2-5个用户,也能通过分层取样等方法获得有统计意义的量化结论。 文章还梳理了数据收集方式,从传统实验室到远程主持与无主持测试的演进,并介绍了“完成率”(成功率)这一最基本的二进制指标。整体上,它为从业者提供了一套在资源有限下,依然能做出扎实数据驱动决策的实用框架。

本机暂存
IT 后端/ 2014-11-22 23:48:11 / 累计浏览 1,800

Web框架与太阳系

这篇讲的是作者如何从对现有PHP框架的迷茫中,转向自行设计一个名为“Beahoo”的迷你Web框架。他从太阳系的结构中获得灵感,提出利用“装饰器模式”来构建框架的构想。文章清晰地阐述了框架的核心设计目标:微内核、模块化与扩展性。 作者巧妙地将行星与卫星的关系类比为装饰器模式:月球装饰地球,地球又装饰太阳,层层嵌套,形成可扩展的系统。他展示了框架中仅几百行的Action与Decorator核心代码,这部分实现了类似“DNA双螺旋”的基础结构。随后,通过模拟创建太阳系的代码实例,直观地演示了如何用装饰器模式动态组合功能模块。 作者的核心观点是,借鉴这种自然界分层装饰的模式,可以用极简的代码构建出灵活强大的Web框架。尽管篇幅所限未展开全部功能,但这个从天文现象到软件架构的联想与实现过程,本身提供了一个非常有趣且具启发性的框架设计思路。

本机暂存
IT 前端/ 2014-11-22 23:20:57 / 累计浏览 2,554

jQuery的编码标准和最佳实践

想用好jQuery,光会调用API可不够,编码习惯同样重要。这篇文章从实际项目角度出发,系统梳理了从加载到编码的全套最佳实践。 它首先指出,通过CDN加载jQuery并配合本地回退脚本,能兼顾性能与可靠性,同时强调使用裸协议URL和将脚本放置于页面底部以优化加载。在版本选择上,文章给出了清晰的建议:需兼容旧版IE则选择1.x系列,否则推荐使用最新版本,并务必指定完整版本号以避免意外。 变量管理方面,建议为jQuery对象添加$前缀以清晰区分,并及时缓存选择器结果以提升性能。选择器的优化是另一个重点,文章通过对比指出,优先使用ID选择器速度最快,使用类选择器时避免指定元素类型,在父级ID下查找子元素则推荐使用.find()方法,这些都能有效利用底层原生方法,绕过较慢的Sizzle引擎。 此外,文章还提醒了在多框架并存时避免$符号冲突的解决方案。这些实践总结起来,核心目标就是写出更健壮、高性能且易于维护的jQuery代码。

本机暂存
IT 设计/ 2014-11-22 23:16:53 / 累计浏览 2,764

产品经理的取舍之道与抽象能力

这篇文章聚焦于产品经理在资源有限下的核心思维修炼,探讨了两个关键能力:如何取舍与如何抽象。 作者开篇从自身拖延症出发,引出资源永远有限的现实——时间、人力、精力都需“好钢用在刀刃上”。文章强调,取舍必须建立在系统全局观之上,可以沿用户、功能、内容、体验等多维度展开。舍弃并非绝对不做,而是明确现阶段的优先级,分阶段达成,最终目标是让团队清晰知道如何“咬下第一口”。文中分享的取舍模型,直观展示了从想做什么、能做什么到先做什么的决策路径。 第二部分着重剖析抽象能力。作者认为,真正的高手懂得先将事情想复杂以具备系统性,再通过抽象抽丝剥茧,回归简单。抽象的本质是从现象看到本质和整体,这决定了产品经理是点对点解决问题,还是能系统性地满足一类需求。文中特别指出,开发背景者通常抽象能力更强,而设计背景者需有意识地通过绘制架构图、概念图来训练这种“从复杂到简单”的思维,因为画图过程本身就是一个深度的抽象提炼过程。

本机暂存
IT 前端/ 2014-11-22 23:12:45 / 累计浏览 1,626

如何解决WordPress因加载Google链接变慢的问题

这篇讲的是WordPress网站莫名变卡的一个经典坑:因为默认调用Google Fonts和jQuery,导致国内访问加载缓慢。作者从“众所周知的原因”出发,详细拆解了各种应对方案。 常见的做法是安装插件(如Disable Google Fonts)或在functions.php中添加代码来禁用或替换Open Sans字体。但作者实测后认为这些方法治标不治本。更彻底的解决方案是深入系统核心:编辑`wp-includes/script-loader.php`文件,将其中引用的`ajax.googleapis.com`等Google域名批量替换为国内可用的镜像地址(如`ajax.useso.com`)。同时,也需要修改主题目录下`functions.php`中字体加载的URL。 文章的价值在于给出了超越常规插件思路的“手术刀”式修改方案,直接针对资源加载源头进行替换,能更根本地解决加载卡顿问题。

本机暂存
IT 后端/ 2014-11-22 23:11:59 / 累计浏览 1,175

汽车OBD设备市场的问题和出路

这篇讲的是作者从个人兴趣出发,深入分析汽车OBD设备市场的现状、困境与可能出路。他指出,尽管OBD作为连接车辆与互联网的最简单方式备受关注,吸引了车厂、4S店和车主等多方目光,但按照当前主流硬件售卖、数据上传云端的玩法,这个市场“没戏”。 核心问题在于:4S店和车厂因数据归属与利益问题产生抵触,而车主端更缺乏持续使用的动力。作者敏锐地观察到,这类设备如同智能手环,往往新鲜两周后就被闲置,导致所谓大数据因缺乏持续有效的数据流而价值大减。 文章回归本质,提出车主需要的是“省心省钱”,OBD应作为无需用户感知的“基础性设备”默默工作。因此,出路不在于直接向消费者兜售硬件,而在于:一是通过数据赋能车险(如UBI)和二手车市场,让车主实际省钱;二是由车厂或4S店在出厂、交付时预装,服务退至幕后,像Intel Inside一样打造标准,反向驱动行业发展。

本机暂存
IT 数据库/ 2014-11-22 23:10:09 / 累计浏览 1,937

深入剖析 redis 数据结构 dict

这篇深度技术文章从源码层面拆解了 Redis 的核心数据结构——字典(dict)。作者首先指明,Redis 的每个数据库(db)本质上由两个哈希表(dictht)构成,真正存储键值对的是这两个表。文章重点剖析了 Redis 哈希表设计最精妙的部分:为何需要两个哈希表,以及如何利用它们实现 **渐进式 rehash(重哈希)**,从而在服务不中断的前提下完成表的扩容。 具体实现上,当触发扩展时,Redis 会为第二个哈希表分配新空间,并在后续的每次增删改查操作中,分批次地将数据从旧表迁移至新表。文章结合源码(`dictRehash` 函数)展示了这一“逐步搬家”的过程,并点明了其背后的设计考量:在服务器空闲时,定时任务会推进 rehash;在高负载时,操作本身的开销也会承担部分 rehash 工作,以此平衡性能。 此外,文章还分析了这种设计带来的“副作用”:由于查找操作需同时兼顾两个表,加上写操作本身包含多次查找,导致 Redis 在执行 SET 等写命令时效率并不高,这也从底层解释了其“重读轻写”的特性。最后,文章简要介绍了在涉及持久化(如 RDB/AOF)遍历哈希表时,也需要正确处理这两个表的过渡状态。全文逻辑清晰,从结构定义到核心算法,再到其对上层行为的影响,层层递进,非常适合想深入理解 Redis 高性能背后实现细节的开发者。

本机暂存
IT DevOps/ 2014-11-21 23:46:50 / 累计浏览 1,820

linux shell中”2>&1″含义

这篇讲的是Linux Shell中一个容易让人困惑的细节:标准错误重定向“2>&1”应该放在什么位置。作者从命令`/home/admin/demo.sh >/dev/null 2>&1 &`切入,直接点明了1代表标准输出,2代表标准错误,而“2>&1”的作用就是让标准错误也输出到标准输出指向的地方——这里是`/dev/null`,实现静默运行。 文章的核心是对比了两种写法产生的截然不同的效果。`command > file 2>&1`会成功将标准输出和错误都重定向到文件中,因为错误重定向是在输出重定向到文件之后执行的。而`command 2>&1 >file`则会导致只有标准输出进入文件,错误信息仍然打印到终端。 为了证明这一点,作者调用`strace`追踪了系统调用,清晰地展示了两者执行序列的差异:前者先打开文件,再依次重定向输出和错误;后者则先复制了当时的输出描述符(指向终端),然后才重定向输出到文件。这个底层的实现细节,彻底解释了为何重定向顺序至关重要。 掌握这个小知识,能避免在编写脚本时因日志丢失或终端输出混乱而踩坑。Shell的执行顺序,确实值得多留一个心眼。

本机暂存
IT 前端/ 2014-11-21 23:44:47 / 累计浏览 3,578

Chrome 远程调试协议分析与实战

作者从一个实际场景切入:当需要获取竞品网页的性能数据,却无法注入代码时,该如何应对?文章由此引出了 Chrome 强大却常被忽视的“远程调试协议”。 这篇内容详细拆解了该协议的结构与原理。它本质上是一个基于 WebSocket 的通道,将调试功能划分为 DOM、Network、Timeline 等不同“域”,每个域都定义了可执行的“命令”和能监听的“事件”。文章通过 Page 域的例子,展示了命令请求/响应、事件派发以及复杂数据类型定义的具体格式,让抽象的协议变得清晰可感。 更实际的部分在于“实战”章节。作者手把手演示了如何启动 Chrome 的调试端口、获取调试地址、建立 WebSocket 连接,并最终通过发送命令来远程操控浏览器,例如执行导航或收集性能数据。这为自动化性能分析、移动端调试,以及与 PhantomJS 等工具结合提供了直接的技术路径。 对于希望突破 DevTools 界面限制,进行深度自动化监控或分析的前端开发者而言,这篇文章提供了从理论到实践的扎实指引。

本机暂存
IT 数据库/ 2014-11-21 23:22:05 / 累计浏览 3,496

深入剖析 redis 数据结构 skiplist

这篇讲的是Redis有序集合ZSet背后的灵魂——跳表(skiplist)。作者从Redis源码出发,一层层拆解了这个经典数据结构。 文章首先点明跳表的核心价值:它用空间换时间,通过预先在有序链表上建立多级“索引”,实现了类似二分查找的高效查询。Redis正是利用它来支撑ZSet的排序和范围查询操作。 更精彩的部分在于对Redis具体实现的剖析。文章不仅给出了核心结构体`zskiplistNode`和`zskiplist`的定义,还深入到了插入和删除操作的算法细节。比如,插入时如何随机生成新节点的层数,以及如何通过`update`数组和`rank`数组来精确地调整每一层的前驱指针和`span`值。`span`这个设计很巧妙,它记录了两个节点之间跳过了多少元素,是实现按排名查询的关键。 作者没有停留在理论,而是结合代码注释,把查找、插入、删除的完整流程都梳理了一遍。从概念到实现,从宏观到微观,清晰地展现了Redis是如何用这套机制来保障其高性能的。对于想理解Redis内部原理的开发者来说,这篇源码分析对数据结构的剖析很到位。

本机暂存
IT 安全/ 2014-11-21 23:18:24 / 累计浏览 2,967

流量劫持 —— 浮层登录框的隐患

这篇技术文章深入剖析了看似“华丽”的网页浮层登录框背后隐藏的安全风险。作者从传统登录跳转模式说起,对比指出,尽管现代浮层登录框通过HTTPS传输数据,但其寄生在HTTP主页面中的特性,使得整个登录过程极易受到XSS注入攻击。更关键的是,文章通过实战演示揭示了它与“缓存投毒”攻击相结合的巨大危害:攻击者只需短暂劫持网络,即可篡改长期缓存的脚本,从而在用户回到安全网络后,仍能悄无声息地替换掉官方登录框,窃取账号密码。 文章的核心结论是,这种交互模式的改变“不可逆”地削弱了用户原有的安全识别习惯。即使网站撤回浮层设计,黑客利用XSS伪造的相似界面仍可能骗取用户信任。最终,作者给出的终极安全建议是全站推进HTTPS,彻底消除攻击面。整个分析过程结合了原理讲解与攻击复现,警示意义明确。

本机暂存
IT 安全/ 2014-11-21 23:09:56 / 累计浏览 2,304

XSS 前端防火墙 —— 内联事件拦截

传统XSS防御依赖服务端过滤与转义,但漏洞仍频发。这篇文章另辟蹊径,提出了一种部署在用户浏览器端的“前端防火墙”预警方案。 作者的核心思路是将防御逻辑从被动的事后过滤,转向主动的事前拦截。他认为XSS的执行本质是浏览器中的事件触发,因此可以借助DOM事件模型,在攻击代码实际运行前对其进行拦截分析。 文章详细探讨了如何针对“内联事件”这类常见XSS注入点,利用addEventListener的捕获阶段机制,抢先一步执行防御脚本。这套方案不仅能拦截恶意事件,还能实时上报异常信息,让开发团队在漏洞被大规模利用前就收到预警。它把每一个用户的浏览器都变成了一个实时的监控节点,变被动为主动。

本机暂存
IT 前端/ 2014-11-21 22:59:13 / 累计浏览 11,198

7 天打造前端性能监控系统

这篇讲的是作者从一次公开承诺出发,用7天时间系统化梳理了如何从零搭建前端性能监控系统。文章并非纸上谈兵,而是将“性能影响公司收益”这一核心认知作为起点,引用了Google、Bing等巨头因延迟导致用户量与收入下降的具体数据,强调了监控的必要性。 接着,作者将实施过程拆解为7天,从认知到工具逐步推进。文中重点介绍了Page Speed、WebPagetest、PhantomJS等工具的实战用法,并特别指出了衡量用户体验的关键指标——白屏时间和首屏时间。文章最后落脚于,性能会随产品迭代而衰减,因此需要一套可持续的监控系统来量化问题、指导优化。 整个方案从“为何要做”切入,落到“具体用什么、怎么做”,为希望提升Web页面加载性能的开发者提供了一份清晰的行动蓝图。

本机暂存