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

最新文章

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

IT 移动开发/ 2016-04-02 23:22:02 / 累计浏览 3,273

自己动手写一个 iOS 网络请求库(一)—— NSURLSession 初探

这篇讲的是,作者从一个具体目标出发——从零开始构建一个自己的 iOS 网络请求库——并选择从苹果现代的 NSURLSession 框架入手探索。文章首先简要对比了 NSURLSession 与旧有的 NSURLConnection,点明了前者在应用进入后台后更灵活的 Background Session 能力是核心优势。 随后,作者带领读者一步步动手:从创建项目、绑定按钮事件,到使用 NSURLSession.sharedSession() 发起一个最简单的 GET 请求,成功获取数据。为了更深入地理解框架行为,代码中特意引入了 sleep(5) 的延迟,验证了网络回调是在后台线程异步执行的,并未阻塞主线程。 一个有趣的发现是,当连续快速点击按钮时,请求会依次排队执行。作者据此初步推断,NSURLSession 的单例共享会话呈现出一种“异步阻塞”的队列模型。这种通过亲手编码、观察现象来反推框架内部机制的学习方式,让抽象的概念变得非常直观。文章最后附上了完整的代码示例和作者的相关开源项目。

本机暂存
IT 移动开发/ 2016-04-02 23:13:01 / 累计浏览 2,281

对Android中的多图片异步加载的重新思考

这篇讲的是图片加载策略引发的性能反思。作者从开源中国客户端的一个实际问题出发:早期版本采用多线程并发下载图片,结果在列表加载时,图片反而出现明显的延迟和卡顿,尤其是在网络条件不佳的情况下。 核心发现直觉与效果的悖论:为什么传统观念中能提升资源利用率的并发,在这里却拖了后腿?文章用了一个生动的比喻——如同一个人同时推进两个相似项目,虽然总工时可能缩短,但单个项目完成的周期却被拉长,导致用户感知到的响应变慢了。 作者进一步剖析了 Android 系统本身的演进:在 Android 3.0 之后,AsyncTask 从默认的并发执行改为了串行执行队列。这个看似“退步”的设计,实际上是为了规避高并发下可能引发的资源耗尽与崩溃风险。在图片加载场景中,配合滚动时及时取消无效任务的机制,串行执行不仅更安全,从用户体感上看也避免了任务间的相互“干扰”,使图片能更连贯、流畅地逐张呈现。 这篇技术复盘最终指向一个启发:在移动端资源受限的环境下,技术方案的选择需要超越纸面的性能理论,紧密结合具体的使用场景和用户体验来重新审视。有时,看似“更慢”的串行,反而是通往“更快”感知的路径。

本机暂存
IT 移动开发/ 2016-04-02 23:10:40 / 累计浏览 2,804

仿iPhone辅助球实现

这篇讲的是如何在Android上实现一个类似iOS辅助球的悬浮手势菜单。作者从一个很实用的角度出发,复盘了去年完成的一个个人项目,核心要解决的问题就是:如何让一个View脱离Activity,悬浮在所有界面甚至桌面上,并且能自由拖动和响应点击。 文章深入解释了两个关键的技术实现。第一,如何让Service能够显示View。作者厘清了原理,指出在Service中,通过获取系统的WindowManager服务并调用它的addView方法,就能将自定义View添加到屏幕上,从而实现全局悬浮。第二,如何实现手势交互。这里作者采用了更直接的方式,通过为View设置OnTouchListener,实时获取手指的屏幕坐标,并动态更新View的位置参数(Margin),来实现平滑的拖拽效果。 整篇文章从原理分析到核心代码一气呵成。给出的TopFloatService类代码完整展示了如何创建悬浮球、注册触摸事件监听、以及在点击时弹出菜单,思路清晰,对于想实现类似功能的开发者来说,具有很高的参考价值和实操性。

本机暂存
IT 移动开发/ 2016-04-02 23:07:35 / 累计浏览 2,280

Android Studio使用过程中遇到的一些问题及解决方案

这篇讲的是作者从Eclipse迁移到Android Studio后,在Windows环境下踩到的一系列“坑”以及他摸索出的解决方案。由于项目涉及JNI编译等复杂依赖,作者采取了在Eclipse中编译JNI、在AS中引用jar和so的过渡方案,并在此过程中总结了十七个具体问题。 文章内容非常“接地气”,直指迁移过程中的核心痛点。例如,如何在build.gradle中正确配置jniLibs路径以加载SO库,如何通过`lintOptions`避免因检查过严导致的编译失败,以及如何解决多模块间的资源文件冲突。除了这些编译与配置问题,文章也覆盖了许多提升效率的设置,比如自动导包、代码格式化快捷键、Logcat颜色自定义,甚至是删除Module的正确操作流程。 作者没有空谈理论,而是将每个问题的背景、原因和修改方法都直接呈现,其中的Gradle配置片段和菜单路径对于遇到同类问题的开发者来说极具参考价值。对于正在或计划进行Eclipse到AS迁移的团队,这些经过实践验证的经验,或许比官方文档更直接有效。

本机暂存
IT 后端/ 2016-04-02 22:59:49 / 累计浏览 1,911

使用 Elasticsearch 实现博客站内搜索

作者从使用 Bing 的 `site:` 搜索作为博客站内搜索方案所遇到的索引更新延迟问题出发,转而决定自建搜索服务。这篇实操记录详细介绍了如何使用 Elasticsearch 这一分布式搜索引擎来实现这一目标。 文章首先指导读者在 Ubuntu 环境下手动安装 Elasticsearch,随后重点讲解了配置的关键步骤:安装并编译 IK Analysis 插件以支持智能的中文分词(提供了 `ik_max_word` 与 `ik_smart` 两种粒度选项),以及通过修改配置文件添加同义词过滤器,让搜索能识别“js”和“javascript”这类等价术语。 在基础服务搭建完毕后,作者进一步展示了如何通过 Node.js 客户端将 Elasticsearch 无缝集成到现有的博客系统中。最终实现的搜索不仅支持中文分词与同义词,还通过定制查询策略达成了“标题匹配优先”和“近期文章优先”的优化效果,为读者提供了一个从部署到应用的全链路参考。

本机暂存
IT DevOps/ 2016-04-02 22:46:20 / 累计浏览 1,719

我是这样提高自己的效率

这篇讲的是作者如何通过一系列个人化的工具与习惯,系统提升工作效率的经验分享。作为开发者,作者的核心观点是:效率并非单纯靠速度,而是构建一套趁手且自洽的“工作流”。 文章从最基础的“兵器”谈起——高配电脑与机械键盘确保了硬件响应不拖后腿,多屏协作则优化了视觉工作区。接着,作者转向软件层面:一个插件精简但功能聚焦的Sublime Text编辑器,搭配自定义的代码检查与格式化工具,让编码过程更为顺畅。更关键的是跨设备环境的统一性,通过Git同步和标准化的Node+Nginx配置,实现了在公司、家里无缝衔接开发,本地域名以.me结尾的设计也避免了冲突。 最后,作者分享了几项提升操作效率的软技巧:一套跨Win与Mac的自定义快捷键、便于记忆的命令别名(alias),以及简短的hosts配置。文章结尾还提到了编写模块测试用例以减少Bug,以及跨技术栈沟通带来的思维启发。整篇文章没有空谈理论,而是用大量可落地的细节,描绘了一个开发者如何为自己打造高效、愉悦工作环境的完整图景。

本机暂存
IT 前端/ 2016-04-02 22:44:16 / 累计浏览 1,925

使用jquery卸载全部事件

这篇讲的是如何在jQuery中彻底卸载页面上全部事件的方法。作者从jQuery源码切入,揭示了其如何通过内部机制支持“匿名事件”的卸载——这正是我们通常无法直接用原生JS完成的。 文章清晰地梳理了背后的原理:jQuery会为绑定事件的元素(或像window这样的对象)打上一个独特的`expando`标识,并将所有事件处理函数存储在一个以该标识为键的`$.cache`全局缓存对象中。因此,卸载所有事件的关键,就在于切断元素与缓存的关联。 核心操作分为两步。首先是遍历页面所有元素以及window对象,尝试删除它们身上由jQuery添加的`expando`属性,清除连接标记。其次是重置`$.cache`对象和window上的`expando`,彻底清空事件缓存。这套组合拳能有效清理掉包括滚动、窗口调整等在内的所有jQuery绑定事件。 对于需要动态重建页面或排查内存泄漏的开发者而言,理解这个机制并掌握这种清理方法非常实用,它展示了jQuery内部精巧的设计如何被我们反向利用。

本机暂存
IT 安全/ 2016-04-02 22:41:54 / 累计浏览 2,507

Certificate Transparency 那些事

这篇深入探讨了 Certificate Transparency(证书透明度)的重要性和实践。作者从本站启用 HTTPS 策略的两个变化切入,重点解释了 CT 要解决的核心问题:现有证书信任体系中,受信任的 CA 可能因失误或恶意签发“非法证书”,且域名管理不善也可能导致证书被冒领,而这些风险在传统机制下难以快速发现和消除。 文章清晰地拆解了 CT 系统的三部分——Certificate Logs、Certificate Monitors 和 Certificate Auditors,阐明了其作为现有 CA 体系补充的开放审计与监控原理。核心价值在于提供了实时、透明的证书状态查询能力,让域名所有者能主动发现错误签发。 文中重点对比了启用 CT 的三种方案:由 CA 承担高成本的 X.509v3 扩展、使用者成本较高的 TLS 扩展(通过 Web Server 发送 SCT),以及需 CA 配合的 OCSP Stapling。作者最终选择了普适性最强的 TLS 扩展方案,并提供了在 Nginx 环境下的具体操作步骤:从使用 ct-submit 工具获取 SCT 文件,到编译加入 nginx-ct 模块,再到最终的配置修改,形成了一个完整的实践闭环。对于关注 HTTPS 安全增强的技术人员而言,这是一份从理论到落地的详实参考。

本机暂存
IT 安全/ 2016-04-02 22:36:28 / 累计浏览 2,274

HTTP Public Key Pinning 介绍

这篇讲的是如何通过 HTTP Public Key Pinning(HPKP)技术,让网站主动指定可信任的证书颁发机构,以抵御中间人攻击。作者从当前 HTTPS 证书信任体系的漏洞切入——任何一家受信任的 CA 都可能为任意网站签发合法证书,虽然 Certificate Transparency (CT) 能通过审计机制改善此问题,但尚未完全普及。 HPKP 提供了另一种思路:网站通过响应头“固定”自己证书链中特定证书的指纹。浏览器后续访问时,必须验证证书是否匹配这些指纹,否则即便证书合法也会拒绝连接。文章详细说明了配置字段,并重点讨论了 `pin-sha256` 指纹的生成策略:使用中间证书指纹在安全性和易用性间取得了较好平衡,同时建议预备备用指纹以应对 CA 变更。作者还给出了使用 OpenSSL 生成指纹和配置 Nginx 的具体示例。 不过,HPKP 也存在首次访问可能被劫持的局限,类似 HSTS,目前主要依赖浏览器内置的 Preload List 来解决。整篇文章清晰对比了 HPKP 与 CT 的不同防护路径,并给出了切实的配置指导。

本机暂存
IT 前端/ 2016-04-02 22:34:34 / 累计浏览 1,815

前端用户模块

这篇讲的是前端项目中如何设计一个统一的用户状态管理模块,解决传统登录流程带来的体验割裂问题。 作者从实际痛点出发:在评论等场景中,用户输入内容后点击发布,却突然跳转登录页,登录返回后之前输入的内容丢失,体验非常糟糕。即使能用弹出层登录,也需要在每个需要登录的地方重复编写判断逻辑,繁琐且易出错。 为此,文章提出了一个基于加密Cookie标识和弹出层的全局用户模块方案。核心思路是模块在页面加载后初始化并读取登录状态,当开发者调用登录方法时,若用户已登录则直接执行回调,否则弹出登录层,成功后再执行回调。整个流程无需刷新页面,并通过事件机制(如login、exit)通知页面其他部分同步更新UI。 文章详细介绍了模块的API设计,包括登录、退出、状态检查以及事件的绑定与触发,并给出了评论登录、按钮跳转等具体代码示例。针对全局使用可能面临的跨域问题,文中建议采用后端代理的方式统一接口处理。最后,作者还展望了模块的扩展性,例如可以集成第三方登录、扫码登录以及登录状态的复杂业务逻辑。

本机暂存
IT 前端/ 2016-04-02 14:19:34 / 累计浏览 1,854

从 Web Components 到 React 谈前端组件化

这篇讲的是前端组件化道路上,两种不同设计哲学的较量。作者从Web Components标准化方案的诞生与遇冷讲起,深入剖析了它如何通过Shadow DOM将结构、样式、行为完美封装。但理想丰满的标准化却在兼容性、性能和易用性上遇到了现实问题。 随后,文章将镜头转向React。它通过JSX让结构像HTML一样直观,用Inline Style将样式封装在JavaScript对象中,从而在一个类文件里完整定义了组件。这种看似“反模式”的务实做法,配合Virtual DOM对DOM操作的智能托管与高性能处理,解决了开发者的实际痛点。 文章的对比结论很清晰:尽管Web Components代表了标准的初衷,但React凭借其易用性与性能保障赢得了开发者的广泛青睐。它告诉我们,解决实际问题的设计,有时比遵循纯粹的标准化理念更具生命力。

本机暂存
IT 后端/ 2016-04-02 14:17:30 / 累计浏览 2,529

Java -- Hotspot虚拟机调优与GC垃圾回收策略

这篇讲的是Java HotSpot虚拟机如何进行性能调优,核心是理解并优化其垃圾回收(GC)机制。作者从Java与C/C++的常见争论切入,指出Java在动态优化方面的特性,引出对JVM和GC进行研究的必要性。 文章首先详细图解了JVM的堆内存分区:Eden、Survivor、老年代和持久代,解释了各区域的用途。接着,重点剖析了GC的核心流程与算法,从经典的引用计数法和Java实际采用的根搜索法说起,对比分析了标记-清除、复制(用于新生代)、标记-整理(用于老年代)等回收算法的原理与优缺点,特别阐述了它们如何协同工作以平衡效率与内存碎片问题。 最后,文章落脚于实践,列举了如-XX:-DisableExplicitGC、-XX:+UseConcMarkSweepGC等一系列关键的JVM启动参数,并结合Full GC与Young GC的特点,提供了具体的调优方向与性能优化Tips,帮助开发者从理论到实践全面掌握GC调优。

本机暂存
IT 后端/ 2016-04-02 14:12:38 / 累计浏览 1,539

Python UnicodeEncodeError问题的分析和思考

这篇讲的是作者在用Python爬取网络数据时频繁遇到的一个棘手问题:程序会因 `UnicodeEncodeError` 意外中断,报错指向一个无法编码的特殊字符 “·”(Unicode码点 u+2022)。问题的直接诱因是远程文件包含了本地编码无法表示的字符。 文章没有止步于解决问题,而是深入Python的“内核”,系统梳理了编码处理的全流程。作者解释了Python 2中字符串对象(str与unicode)的本质区别,以及它们如何受源文件编码和系统控制台编码(如Windows下的GBK)的影响。通过 `encode` 和 `decode` 的示例,厘清了编码转换的基本逻辑。 最关键的部分在于对输出环节的剖析。文章指出,`print` 语句会调用 `sys.stdout` 这个 `TextIOWrapper` 对象,它默认使用终端编码(如GBK)对unicode字符串进行 `encode`。当字符(如 u+2022)不在目标编码的码表中时,异常便产生了,这也解释了为何同样的代码在GBK终端的Windows上报错,而在通常使用UTF-8的Linux上却能正常运行。文章从IO层和编码映射原理上,把这个常见错误的来龙去脉讲得非常透彻。

本机暂存
IT 前端/ 2016-04-02 14:09:17 / 累计浏览 1,578

提高JavaScript性能

这篇讲的是如何从多个层面提升JavaScript代码执行效率。作者开篇就指出了JavaScript作为解释型语言的固有速度劣势,与编译语言相比差距悬殊,因此优化显得尤为重要。 文章从具体实践出发,分享了四个核心优化方向。在作用域方面,强调通过缓存全局对象(如document)的引用来减少作用域链查找,并避免使用会拖慢速度的`with`语句。对于算法选择,文章深入到了循环优化的细节,包括采用减值迭代、简化终止条件,并介绍了如何运用Duff装置等技术来高效展开循环。 此外,作者还提醒开发者注意减少不必要的语句解析,例如合并变量声明、使用数组和对象字面量来替代`new`操作符。最后,文章点明了DOM操作是性能瓶颈的关键所在,因其会触发昂贵的页面重绘。 整体来看,这些技巧从微观的代码写法到宏观的策略选择,构成了一份实用的JavaScript性能优化清单。

本机暂存
IT DevOps/ 2016-04-02 14:07:40 / 累计浏览 3,349

CentOS上搭建Git服务器

这篇讲的是如何在CentOS服务器上从零搭建一套功能完备的Git代码托管环境。作者面对的核心需求是建立一个集中式的版本库,用于团队协作和代码管理,同时希望方案对服务器性能的影响尽可能小。 文章给出的解决方案是一套组合拳:使用Git作为底层版本控制工具,并搭配gitosis和gitweb两个组件。其中,gitosis专门负责基于SSH协议的仓库权限管理,而gitweb则提供了一个简单的Web界面,方便开发者在线浏览代码和提交历史。文章以“折腾”的口吻,依次拆解了这三个部分的安装与配置过程,从yum安装基础软件包、创建git用户,到克隆gitosis源码进行安装、配置SSH密钥实现安全访问,最后安装fcgiwrap与spawn-fcgi来驱动gitweb。 整个流程清晰且具有可操作性,比如在配置客户端多公钥共存时,就给出了具体的.ssh/config文件示例。最终搭建完成的服务器既能通过SSH进行高效的代码推送与拉取,也能通过网页轻松查看项目状态,是一个轻量且实用的自托管方案。

本机暂存
IT 前端/ 2016-04-02 13:50:02 / 累计浏览 1,518

从 React Router 谈谈路由的那些事

作者从 React Router 这个流行工具切入,为读者梳理了 Web 开发中“路由”这个核心概念的来龙去脉。文章没有一上来就讲解代码,而是先区分了容易混淆的“后端路由”与“前端路由”。 作者解释道,传统后端路由负责处理服务器端的地址分发;而前端路由则让浏览器在不刷新页面的情况下,通过改变 URL 的片段(早期的 hash)或利用 HTML5 history API 来切换视图。这直接带来了无网络延迟的流畅用户体验,是构建高性能单页应用(SPA)的关键。 在此基础上,文章用清晰的代码示例,展示了如何用 React Router 来实现这些功能:从基础的路由配置、Link 组件导航,到更灵活的嵌套路由和动态参数传递。整个讲解过程从原理到实践,层层递进,不仅告诉你“怎么用”,也解释了“为什么这么设计”。对于想从根源上理解前端路由机制,并掌握 React 生态中这一重要工具的开发者来说,这是一篇思路清晰、讲解透彻的实用指南。

本机暂存
IT 数据库/ 2016-04-02 13:49:03 / 累计浏览 1,861

MySQL relay_log_purge=0 时的风险

这篇讲的是当MySQL设置`relay_log_purge=0`时,一个容易被忽略的数据一致性风险。很多DBA为了在高可用切换后能用上relay log补齐数据,会选择禁止自动清除,但官方文档提示这在使用`relay_log_recovery=1`时并非“崩溃安全”。 文章深入剖析了这个“地雷”的成因:在崩溃重启后,由于IO线程位置可能不准,`relay_log_recovery`会从已执行的位置重新拉取binlog并开启新的relay log。若旧的relay log被保留(`purge=0`),就可能在两个场景下出问题。一是崩溃时最后一个relay log未执行完,重启后这部分数据被重新下载,导致重复;二是如果SQL线程追赶过快,可能在IO线程尚未将relay log刷盘时就已读取执行,造成新旧文件间出现一段数据空缺。 因此,若因特殊需求必须保留relay log,在解析时务必通过binlog头信息来校验,确保数据准确无误。文章还附上了配置crash safe复制的相关参考,帮助读者从根源上稳固复制架构。

本机暂存
IT 后端/ 2016-04-02 13:46:04 / 累计浏览 1,091

专注和游离

作者在文中探讨了一个普遍困扰:为何总渴望“21天精通”,却常在该专注时沉迷碎片信息,在该放松时又陷入焦虑。他直指那种“快速提升”的幻想往往是骗局,真正的成长是持续、渐进的“日拱一卒”。 但作者也承认,在诱惑泛滥的时代,坚持“日拱一卒”极难。他分享了自己摸索出的方法:将晚上时间刻意切分为“专注”与“游离”两块。专注时段屏蔽一切干扰,全力用于写作、编程或深度学习;游离时段则坦然刷圈、看剧、泛读,用于放松和拓宽视野。这种有节奏的交替,让他能在效率和广度上逐步积累优势。 文章最终落脚于一个朴素的信念:对于大多数普通人,接纳成长的缓慢节奏,找到适合自己的专注与游离的平衡点,坚持下去,就是通往“大器晚成”的路径。文末引用的“十年学会程序设计”七条建议,如重实践、多交流、学多门语言,也为这条长期主义的道路提供了具体的路标。

本机暂存
IT 移动开发/ 2016-04-02 13:44:45 / 累计浏览 3,080

启动activity的4种模式(standard、singleTop、singleTask、singleINstance)

这篇技术文章深入浅出地解析了Android开发中核心却容易混淆的四种Activity启动模式:standard、singleTop、singleTask与singleInstance。作者没有停留在概念定义,而是通过一个简单的示例应用,在小米4真机上通过命令行抓取Activity栈信息,直观展示了每种模式下Activity实例的创建与复用规则。 文章详细对比了它们的关键差异:standard模式最“勤快”,每次启动都创建新实例并入栈;singleTop则更“聪明”,若目标Activity已在栈顶就复用,避免重复创建;singleTask拥有自己独立的任务栈,启动时会清除栈内其上的Activity;而singleInstance则最为“孤僻”,确保一个Activity全局只存在一个实例,且独占一个任务栈。作者特别指出,理解这些差异对于处理应用内页面跳转、通知栏启动、甚至多任务返回栈的行为至关重要。 最后,文章也提示了实际开发中这四种模式常与Intent标志位配合使用,以实现更精细的控制。对于Android开发者来说,无论你是刚入门还是需要厘清模糊概念,这篇基于实操对比的文章都能提供清晰的指导。

本机暂存
IT 移动开发/ 2016-04-02 13:42:06 / 累计浏览 4,853

启动Activity的流程(Launcher中点击图标启动)

这篇讲的是Android开发中最基础也最关键的一环:Activity是如何被启动的。作者没有泛泛而谈,而是聚焦于最常见的“Launcher桌面点击图标”这一场景,通过一个包含两个Activity(A和B)的完整案例,带你深入源码,剖析背后完整的调用流程。 文章的核心价值在于清晰的对比和串联。作者首先点明Activity启动的三种常见方式(桌面点击、代码调用、命令am start),并强调它们的底层处理逻辑是相通的。理解了其中一种,就能举一反三。 为了让你彻底看懂,文章提供了详实的“弹药”:从Activity A和B的具体Java代码、对应的XML布局,到清单文件中至关重要的`intent-filter`配置(特别是`MAIN`和`LAUNCHER`这两个标签),一应俱全。在案例中,点击A中的按钮跳转到B时,日志会明确显示出Activity生命周期的切换顺序——先执行A的`onPause`,然后才是B的`onCreate`和`onResume`,这个过程是理解Activity任务栈管理的关键。 对于想从“会用”进阶到“理解原理”的Android开发者来说,这是一次非常扎实的源码梳理。它不仅告诉你流程是怎样的,更通过可运行的案例让你亲手验证这个过程,将理论和实践紧密结合起来。

本机暂存