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

最新文章

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

IT 后端/ 2016-03-30 13:02:30 / 累计浏览 1,922

玩转npm

这篇讲的是npm这个包管理工具的各种实用技巧。作者从日常使用出发,重点分享了安装、更新、发布这几个核心操作的“正确姿势”,比如用npm init -y快速生成package.json,通过-i、-S、-D等选项管理依赖,以及如何用npm version patch/minor/major优雅地更新版本号。 文章还对比了npm2和npm3在依赖处理上的关键差异。npm3最大的改进是将依赖模块扁平化存放,从而解决了Windows系统上因node_modules目录嵌套过深而导致的路径过长问题。虽然初期安装速度较慢,但后续版本已明显优化。作者建议大家及时更新到npm3,以获得更好的依赖管理体验和修复后的安装进度条显示。 对于想尝试最新库的开发者,文中介绍了如何使用npm dist-tags ls和npm outdated来查看版本信息并进行更新,整个流程非常清晰实用。

本机暂存
IT 移动开发/ 2016-03-30 12:11:13 / 累计浏览 3,113

一张图帮你看懂 iPhone 的屏幕分辨率

这篇讲的是 iPhone 6 Plus 屏幕分辨率的一个常见困惑。作者从官方标称的 1920×1080 与 Xcode 模拟器显示的 2208×1242 这一“看似奇怪”的差异出发,借用一张清晰的信息图,直观拆解了其中的技术细节。 关键差异在于,2208×1242 是屏幕实际需要渲染的物理像素,而 1920×1080 是最终输出时经过缩小处理的结果。文章引用 Stack Overflow 上的解答点明了核心原因:为了让切图的放大倍数(如 @3x)和实际渲染像素都能保持为整数,系统选择了将 2208×1242 缩小约 17% 来得到标准的 1920×1080 输出。 这个解释清晰地说明了 iOS 屏幕适配中“逻辑点”与“物理像素”之间的映射关系,对于理解 Retina 显示和多分辨率适配原理很有帮助。

本机暂存
IT 前端/ 2016-03-30 12:07:28 / 累计浏览 1,834

ReactJS组件间沟通的一些方法

这篇详细梳理了React中组件通信的几种核心方法。文章从最基础的父子组件props传递和回调函数讲起,清晰地演示了数据如何向下流动、事件如何向上传递。针对非父子关系的兄弟组件,作者指出需要将状态提升至共同的父组件来管理,并给出了代码示例。 更进一步,文章直面了组件嵌套层级过深时,层层回调导致的代码混乱难题。对此,作者对比了两种更优雅的方案:一是使用全局事件总线(如EventEmitter)解耦组件,实现直接通信,但需注意事件的解绑与数据流的可维护性;二是利用React的Context(上下文)机制,让子组件能直接访问祖先组件的状态与方法,避免中间组件的逐层传递。 文章不仅给出了问题场景与解决方案,还提醒了各自的注意事项与适用边界,帮助开发者根据项目实际情况,在遵循单向数据流与解决实际复杂度之间找到平衡点。

本机暂存
IT 后端/ 2016-03-30 12:05:38 / 累计浏览 3,065

Java处理InterruptedException异常小结

这篇文章聚焦于Java开发中一个常见却容易被误用的异常处理场景:如何正确对待 `InterruptedException`。作者指出,许多开发者习惯性地“吞掉”这个异常,但这会损害程序响应中断、实现优雅取消的能力。 文章的核心在于阐明 `InterruptedException` 的特殊含义:当一个方法抛出此异常,它不仅是一个检查型异常,更是在声明自己是一个可被中断的阻塞方法。基于此,作者对比了几种关键的处理策略:其一是将异常直接向上抛出;其二是在进行必要的清理工作后重新抛出;其三,当在Runnable中无法抛出时,必须通过 `Thread.currentThread().interrupt()` 恢复中断状态。文中同时明确批判了仅仅记录日志或完全忽略的“生吞”做法。 通过代码示例,文章清晰地展示了正确与错误模式之间的分野,并解释了为何必须保留中断信号——因为中断是协作式的,且可能由线程池等机制多重消费。最终,作者建议通过轮询中断状态来实现灵活的、可取消的任务。整篇文章为处理这类并发问题提供了明确、实用的操作指南。

本机暂存
IT 开发者/ 2016-03-29 23:46:18 / 累计浏览 1,610

54chen的程序人生

这篇讲的是一位近十年经验的程序员,回溯二十年前前辈文章后,对自己职业人生的思考。作者从自身成长经历出发,提出程序员应具备的四种核心品质:坚定(对计算机的热爱不因外界枯燥而消退)、乐观(面对行业压力与温饱现实仍不放弃)、冷静(以逻辑战胜困难而非焦虑)、钻研(视排查问题为学习契机而非负担)。 文章具体提及了早期通过小霸王、BBS、外包项目接触计算机的同行共性,也分享了金山实习时“工资只够付房租”的真实窘境,对比了同事因bug焦虑失措的案例。作者最终将程序员的人生路径归结为两条:或以专业积累实现迁移,或跳出纯技术视角转向创业。 这并非一篇技术方案讨论,而是一份带着代码注释风格的职业心路记录,冷静中透着乐观,写给同样在键盘前思考去向的同行。

本机暂存
IT 移动开发/ 2016-03-29 23:36:39 / 累计浏览 2,037

探索react native首屏渲染最佳实践

这篇讲的是React Native应用如何通过一系列实战优化,将首屏渲染耗时从接近原生体验的770ms大幅降低,以逼近原生100ms左右的表现。 文章首先定义了首屏耗时的计算方式,作者发现初始渲染耗时高达约700ms。核心优化分为三步走:首先,引入AsyncStorage缓存数据,让渲染不再完全依赖网络请求,这一步将耗时直接腰斩至400ms。接着,针对轮播图组件进行重构,摒弃全量创建所有图片视图的做法,改为复用单一视图并动态切换图片URL,既减少了渲染开销,也降低了内存占用。整个过程逻辑清晰,从度量问题、定位瓶颈到分模块实施优化,每一步都配有清晰的原理图和效果数据。最终,文章展示了一个从发现问题到动手解决,并取得显著性能提升的完整优化案例。

本机暂存
IT 前端/ 2016-03-29 23:34:32 / 累计浏览 1,411

从Promise的Then说起

这篇讲的是从Promise的`.then`方法切入,探讨如何让异步代码变得像同步一样线性可读。作者指出,传统的回调写法迫使开发者跳着读代码,破坏了从上到下的自然阅读流,而Promise正是为了解决这一痛点而生。 文章通过对比callback和Promise的代码示例,直观展示了Promise如何将嵌套逻辑“拉平”成清晰的链式调用。随后,内容深入到一个具体的技术疑点:当手动给`Array.prototype`添加`then`方法后,`Promise.all`的执行会“卡住”。通过查阅资料和剖析源码,作者引导读者理解Promise A+规范中的一个关键细节——如果`.then()`回调返回的对象具有`then`方法,它将被视为一个“thenable”对象并被尝试解包,这正是数组原型污染影响`Promise.all`行为的根源。 最后,文章以BlueBird库的实现为例,揭示了其内部如何通过`PromiseArray`来可靠地处理传入的可迭代对象。整篇文章从一个高频痛点出发,层层递进,最终落脚于规范与具体实现,巧妙地将一个看似奇怪的Bug与底层原理连接了起来。

本机暂存
IT 移动开发/ 2016-03-24 17:24:13 / 累计浏览 3,024

Android的Handler机制原理

Android开发中,UI线程阻塞和线程安全是两大经典难题。这篇文章从问题根源讲起:主线程负责UI交互和事件分发,一旦执行耗时操作就容易引发ANR,而子线程又不能直接更新UI。为了解决这个“两难”境地,Android引入了Handler机制作为线程间通信的桥梁。 文章核心梳理了Handler的工作流:子线程将耗时任务处理完成后,通过Handler将Message或Runnable发送到主线程的MessageQueue中;主线程则依靠Looper无限循环地取消息,再交回Handler的handleMessage方法处理,从而安全地更新界面。作者通过两个清晰的代码案例(sendMessage与postDelayed)展示了具体实现,让理论立刻落地。 整体上,这是一篇扎实的源码原理剖析。它不仅解释了Handler“是什么”,更紧扣“为什么需要”这个设计背景,将消息队列、循环器、消息对象这几个核心组件的协作关系讲得透彻明了,对于想深入理解Android异步消息处理机制的开发者来说,是一份逻辑清晰的参考资料。

本机暂存
IT 后端/ 2016-03-24 17:20:56 / 累计浏览 2,242

浅谈Web缓存

作者从Web性能优化的实践角度出发,深入探讨了缓存机制在提升网页加载速度中的关键作用。文章首先区分了数据库缓存、代理服务器缓存、CDN缓存和浏览器缓存等类型,并聚焦于浏览器缓存如何通过将资源保存在客户端来减少服务器请求、降低网络负荷。 核心内容详细解析了浏览器缓存的控制原理,重点对比了Cache-Control头部的多个指令:max-age(例如设置30天有效期)直接控制缓存时长,s-maxage则专用于CDN等共享缓存;public和private指令分别决定资源是否在多用户间共享或仅限私有使用;no-cache和no-store则涉及缓存验证和禁止策略。此外,文章对比了Expires、Last-modified和ETag的差异:Expires指定服务器端的具体过期时间点,但优先级低于Cache-Control;Last-modified基于文件最后修改时间进行验证,而ETag通过内容生成哈希字符串,更精确地检测资源变化,解决了Last-mod

本机暂存
IT 移动开发/ 2016-03-24 16:42:03 / 累计浏览 4,295

ReactNative Animated动画详解

这篇讲的是ReactNative中Animated动画的实际应用。作者从一个简单的淡入动画示例入手,展示了如何通过Animated.Value设定初始透明度,结合Animated.timing配置时长和缓动函数,让文字“悄悄的,我出现了”逐渐显示。 文章将实现步骤拆解为五个关键环节:使用Animated包裹的View/Image/Text组件、初始化数值、绑定动画属性、配置动画参数以及启动动画。特别提醒开发者务必使用Animated组件,否则会得到难以排查的报错——这个细节对新手很实用。 代码示例中的注释风格轻松,但背后是清晰的动画构建逻辑。作者最后也指出,基础渐显只是入门,更多组合动画技巧需要参考原文获取完整方案。整体上,这篇文章适合刚接触ReactNative动画的开发者,能快速建立实现路径的心智模型。

本机暂存
IT 前端/ 2016-03-24 15:34:33 / 累计浏览 3,062

经常在各种框架之间切换使用是种什么体验?

这篇讲的是前端开发中一个常见却少有人深入对比的话题:在不同主流框架间切换的真实体验。 作者以搭建同一个 todo list 应用为具体场景,分别用 Backbone.js、React 和 Vue 这三个代表不同开发哲学的框架进行了实现。文章没有停留在表面的 API 对比,而是深入到了开发思路的层面。比如,Backbone.js 如何通过 Model 和 Collection 来组织 MVC 式的数据流;React 如何将状态与视图解耦,强调“数据驱动”;Vue 又是如何通过响应式系统和声明式模板来降低心智负担的。 通过同一个项目的三重实现,文章清晰地揭示了它们在核心理念上的关键差异:是手动操作 DOM 的“控制”思维,还是维护状态让框架“自动更新”的“声明”思维。这种对比不仅让技术选型有了更具体的依据,也帮助开发者理解不同框架背后的“设计权衡”——Backbone 的灵活性与手动管理成本,React 的强大生态与 JSX 学习曲线,Vue 的平滑上手与灵活性边界。 对于经常需要技术选型或团队协作的前端开发者来说,这篇文章提供了一次非常扎实的“思维体操”,能帮助你在下次接触新框架时更快地抓住本质。

本机暂存
IT 移动开发/ 2016-03-23 23:32:09 / 累计浏览 2,523

Android 三大图片缓存原理、特性对比

这篇技术分析深入对比了 Android 开发中三大经典图片缓存库:Universal ImageLoader、Picasso 和 Glide。作者从源码出发,剖析了它们的整体设计流程与核心模块,如 ImageLoader 的引擎、Picasso 的调度器、Glide 的生命周期管理等,并提炼出多级缓存、高可配置性等共同优点。 文章重点在于揭示三者的关键差异:ImageLoader 以功能全面和缓存算法多样见长;Picasso 背靠 Square 生态,具备流量监控和智能网络适配,但本地缓存依赖 OkHttp;Glide 则更像媒体缓存,它深度整合 Android 生命周期,并在内存管理上做了精巧优化(如 ActiveResources 计数和缓存缩略图),默认使用 RGB_565 格式以节省内存。 通过这种从原理到特性的系统对比,文章为开发者提供了清晰的选型参考:ImageLoader 适合需要高度定制化和传统方案的项目;Picasso 在追求代码简洁与网络状态感知的场景中表现出色;而 Glide 凭借其“内存友好”特性和对生命周期的良好支持,尤其适合界面频繁刷新、媒体类型复杂的应用。

本机暂存
IT 前端/ 2016-03-23 17:52:22 / 累计浏览 2,123

网页布局中对全局字体的最佳控制

这篇讲的是如何在网页CSS中设置全局`font-family`,作者基于实际踩坑经验,对比了几种常见写法的优缺点,最终给出了一个跨平台的推荐方案。 文章对比了包括`Arial, sans-serif`、`"宋体", sans-serif`、`Tahoma, sans-serif`等几种写法。例如,直接使用“宋体”在Safari和Vista的IE7下显示效果差,且英文部分不美观;而使用Tahoma虽然字体漂亮,但在IE6中会出现中文下划线贴紧、13px字号显示异常以及混合排版时`vertical-align`导致的文字错位等具体bug。 相比之下,`font-family: Arial, sans-serif;`被作者认为是全局字体设置中最合适的选择。它解决了Tahoma在IE6下的前两个问题,且第三个布局bug也有成熟的`zoom:1`解决方案。文章最后还补充了一个重要细节:在IE浏览器中,所有表单元素(如`input`、`select`)不会继承`body`的字体,需要单独显式设置。 作者从多种写法的实践对比出发,最终收敛到一个兼顾不同操作系统(XP、Vista、Mac)默认字体显示效果,且规避了常见浏览器渲染bug的解决方案,这对于处理复杂的前端兼容性问题有很强的参考价值。

本机暂存
IT 安全/ 2016-03-23 17:51:36 / 累计浏览 2,071

从无法开启 OCSP Stapling 说起

这篇讲的是,作者从读者常问的“为什么在Nginx中配置了 ssl_stapling on 却没生效”这个问题出发,深入剖析了OCSP Stapling的原理与实操。文章先简要回顾了OCSP(在线证书状态协议)会拖慢TLS握手,而OCSP Stapling(让服务端主动提供状态)是优化这一过程的关键。 接着,作者没有停留在理论,而是手把手教读者一个轻量的排查方法:使用openssl命令行工具进行验证。通过一条具体命令和对输出结果的解读(比如看到“OCSP Response Status: successful”就说明已开启),读者可以快速自检,而无需等待SSL Labs的漫长检测。 文章进一步深入,展示了完整的OCSP Response内容,并解释了其由“验证数据”和“签名证书”两部分组成。最后,文章还指导读者如何在本地获取证书链并主动查询OCSP信息,从原理层面帮助开发者真正理解这一机制,而不仅仅是配置一行代码。

本机暂存
IT 移动开发/ 2016-03-23 17:25:14 / 累计浏览 3,688

微信收费事件背后被广泛忽略的技术细节

这篇讲的是当年微信与运营商“对峙”背后,那些被忽视的技术账。 作者从通信和互联网两个行业的“隔阂”切入,指出双方都在“互防”,而用户承受了后果——手机耗电快、网络信令压力大。他提供了一个关键对比:Google的PUSH心跳周期在正常网络下可达28分钟,但在中移动2.5G网络上,因为空闲5分钟连接就会被释放,微信Android版被迫缩短到5分钟。这意味着你的手机每天要被唤醒近300次来“续命”,耗电15%以上只是表面问题。 更深层的症结在于:由于谷歌服务在国内不可用,每个App都得独立维护一条PUSH“长连接”,信令风暴和耗电是成倍增加的。这本质上是运营商2G网络为应对IP流量做了“聪明反被聪明误”的限制定制,而互联网行业只能在TCP层上打补丁,无法用到通信层更高效的“天然PUSH通道”。 文章最终指向一个出路:与其互相掣肘,不如让运营商开放信令通道,以“免费+增值服务”的模式,同时解决三方的痛。这或许比单纯争论“该不该收费”更能推动行业走向共赢。

本机暂存
IT 前端/ 2016-03-23 17:22:30 / 累计浏览 3,629

基于HTTP缓存轻松实现客户端应用的离线支持及网络优化

传统客户端开发中,实现离线支持往往需要引入本地数据存储,并维护“离线”与“在线”两套并行的业务逻辑,这不仅增加了数据结构兼容与版本迁移的复杂度,也给测试和维护带来了持续的负担。 这篇讲的是作者团队在实际项目中探索出的一条新路径:直接复用并扩展HTTP协议自身的缓存机制(Cache-Control),将API响应也纳入缓存管理,从而优雅地解决了上述问题。核心思路是在API client层透明地处理所有请求,对绝大部分GET类API,智能协调网络请求与本地缓存,使得业务层代码几乎无需关心离线状态。只要遵循在线逻辑编写,应用就能自动获得离线能力。 文章深入剖析了这一方案的具体优势,比如基本消除了本地数据存储需求、大幅降低代码侵入性、在弱网下提供无缝体验等。同时,它以“用户信息离线展现”和“可翻页清单离线浏览”为例,详细说明了如何通过设计API的URL结构和缓存策略(如结合Vary头与令牌实现连带失效),来应对复杂场景。最后,文章还提到了在Android和iOS平台上的具体实现要点,包括对不同系统版本HTTP缓存组件的选择建议。 通过将HTTP缓存从事实上的“静态资源优化工具”升级为一套轻量级的客户端数据层框架,该方案不仅实现了离线支持,还顺带优化了在线网络传输,为客户端架构提供了一种简洁高效的思路。

本机暂存
IT 前端/ 2016-03-23 17:01:39 / 累计浏览 2,865

我是如何从装修转到前端

这是一篇关于个人职业转型的复盘文章,作者分享了自己从一名建筑装修工人转向前端开发的完整心路历程。 文章从作者早年从事外墙装修的经历讲起,描绘了这份工作的艰辛与局限。转机源于对计算机根植于心的兴趣——从初中时在书店自学设置BIOS,到工作后用省下的工钱购买技术书籍,这份热爱一直未曾熄灭。 真正的转折发生在2009年,作者自费进入电脑学校学习。在校期间,他并非被动接受知识,而是将“折腾”精神发挥到极致:从为电脑C盘“扩容”而破解冰点还原软件,到通过记忆老师密码、分析网络规则并模仿MAC地址,最终用批处理脚本突破学校的上网限制。这些充满探索欲和实操性的“传奇”小故事,生动展现了驱动他前行的核心动力。 作者的经历并非简单的“逆袭”,而是一个凭借纯粹热情与动手能力,不断凿开新可能的过程。对于许多同样渴望转型或对技术有好奇心的读者而言,这个故事提供了一种真实而鼓舞人心的参考。

本机暂存
IT 后端/ 2016-03-23 15:50:52 / 累计浏览 2,423

协程与多任务调度

这篇讲的是如何用协程和 yield 手工打造一个协作式多任务调度系统。作者从现代计算机主流的抢占式多任务说起,自然地引出协程作为更轻量的协作式方案,并重点解决了一个关键问题:如何让协程真正“调度”起来。 文章的核心是实现一个调度器。它定义了任务类来封装协程,设计了调度器来管理任务队列。最巧妙的地方在于利用 yield 的“暂停-恢复”特性,实现了任务的交替执行,这就像一个简单的协作式中断。每当任务 yield,控制权就交还调度器,调度器再运行下一个任务。 更进一步,文章还演示了如何通过 yield 进行双向通信。任务可以 yield 一个系统调用对象,调度器捕获它并执行相应操作(如获取任务ID),再将结果 send 回协程。这模仿了操作系统与进程的交互模式,展示了协程调度的灵活性和控制能力。 对于想理解协程调度本质、不满足于仅会用 yield 关键字的开发者来说,这篇文章提供了一个从零构建的完整思路。它剥离了底层复杂性,让你看清协作式多任务调度器是如何用最基本的工具一点点搭建起来的。

本机暂存
IT 移动开发/ 2016-03-23 15:39:08 / 累计浏览 1,937

滚动定位在移动端的研究

这篇文章聚焦于移动端一个常见却棘手的体验问题:滚动定位。 作者首先回顾了传统的滚动监听实现思路——通过比较滚动位置与目标元素的偏移量,动态切换 `fixed` 定位。但在实际移动端场景中,由于系统自带的滚动缓冲和惯性效果,这种 JS 方案会导致吸附效果生硬、延迟,体验并不理想。 文章的转折点来自对京东商品页的观察,其流畅的吸附效果启发作者去探究背后的实现。通过分析源码,作者发现了关键:优先使用 CSS3 的 `sticky` 定位属性。`sticky` 完美融合了相对定位与固定定位的优点,能让元素在滚动出视窗时平滑地“粘”在屏幕边缘,这正是理想的吸附体验。 因此,核心的解决方案是特性检测与分级回退:优先使用 `sticky` 这种声明式、性能更优的方案;仅当浏览器不支持时,才退回至传统的 JS 监听方案。作者通过在线 demo 的直观对比,清晰地展示了 `sticky` 在移动端带来的显著体验提升——过渡丝滑,接近原生。对于移动端开发者而言,这篇文章清晰地指出了问题根源,并给出了一套实用、高效的现代解决方案。

本机暂存
IT 后端/ 2016-03-23 15:30:23 / 累计浏览 2,286

学习设计API

这篇文章讲的是如何为前后端交互设计出清晰、可协作的API。它从API的基本定义出发,聚焦于一个实际问题:当团队协作时,混乱的接口定义会导致沟通成本激增。作者给出的核心方案是,团队必须先就返回值格式达成明确约定。 文章重点对比了两种主流的JSON返回值结构。第一种方式中,`errcode`字段可选,它的出现即意味着错误,并伴有可选的`msg`描述。成功则通常返回`items`数据或特定字段。第二种方式则要求`errcode`必须存在,并约定以`0`表示成功,其他值则为错误码。文章指出,这些错误码可以建立为公共码(如1001代表未登录),便于前端统一处理。 作者强调,JSON因其轻量和可扩展性已成为首选。通过建立这样的强约定,前端可以依据`errcode`进行明确的逻辑判断,而后端也能遵循规范返回数据。这种前置的、统一的接口设计,能够显著减少联调时的误解,让前后端协作更加顺畅,也使得接口本身更为健壮和可维护。

本机暂存