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

最新文章

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

IT DevOps/ 2016-02-11 23:02:39 / 累计浏览 2,733

NodeJS服务监控报警系统的核心实现和开源共建

这篇文章讲述了一个NodeJS开发者如何从实际需求出发,独立打造了一套名为PM25的服务监控报警系统。作者观察到,随着NodeJS服务的增多,团队迫切需要一个能统一管理集群状态、及时发现内存泄露、慢路由等异常的监控平台。商业方案如Keymetrics成本高且涉及数据外传,直接调用PM2 API又不利于多机管理和安全,于是他决定基于PM2进行二次开发。 PM25系统实现了多项实用功能:支持用户登录与服务分桶管理,提供主机与进程的实时CPU、内存等关键指标,并能整合Falcon进行历史图表查看和报警配置。它还创新性地通过扩展包收集慢路由数据,并支持云端对进程进行重启等远程控制。文章详细介绍了项目的开源结构(包含CLI、云端控制台、服务端等模块)、数据库设计以及部署拓扑。 项目的初衷是分享并推动Node生态的建设,作者期望通过代码开源,吸引更多开发者共同完善这个工具。目前,完整代码已在Github上开源。

本机暂存
IT 安全/ 2016-02-11 22:59:35 / 累计浏览 1,845

Joomla反序列化漏洞的查漏补缺

当2015年Joomla曝出高危的反序列化漏洞时,安全社区迅速展开了分析。但这篇来自绿盟科技的技术复盘,却质疑了当时主流分析中的一个共识——“漏洞源于Joomla自定义了SESSION序列化机制”。作者通过源码分析指出,Joomla虽然注册了自定义的session处理函数,但其write方法并未改变PHP默认的序列化格式(键名+竖线+serialize值)。问题根源不在于此。 文章随后将矛头指向了更底层的问题:PHP本身的SESSION序列化处理器配置。它引用ryat的经典研究,说明当系统配置中写入SESSION(如php_serialize处理器)与读取SESSION(如php处理器)使用了不同的处理器时,会导致数据解析出错,从而触发反序列化对象注入。Joomla的漏洞正是利用了这种配置不一致。 这篇文章的价值在于“查漏补缺”,它引导读者跳出对应用层“奇技淫巧”的讨论,重新审视PHP底层机制本身可能埋下的坑。对于安全研究者和开发者而言,这是一个重要的提醒:漏洞的根源有时藏在更基础的依赖配置之中。

本机暂存
IT 移动开发/ 2016-02-11 22:56:52 / 累计浏览 2,837

小心别让圆角成了你列表的帧数杀手

这篇讲的是在iOS滚动列表中滥用圆角导致性能暴跌的“坑”。作者实测发现,为cell中的UIImageView设置`cornerRadius`时,随着圆角视图数量增加,帧率会迅速下滑至45fps甚至30fps以下,造成明显的卡顿感。 更出人意料的是,使用`layer.mask`来实现圆角,性能比`cornerRadius`还要差,帧率可能直接跌到20fps。文章剖析了根源在于**离屏渲染**,特别是频繁的上下文切换带来了数十倍于普通渲染的开销。 对此,作者给出了明确的避坑指南:滚动列表中应尽量避免使用`cornerRadius`或`mask`。如果必须使用,可以通过开启`shouldRasterize`来缓存渲染结果,或者采用预处理圆角图片、覆盖镂空图层等更高效的替代方案来保障流畅度。

本机暂存
IT 前端/ 2016-02-11 22:55:55 / 累计浏览 2,881

用 HTML 标记的古怪代码注释

这篇讲的是作者如何从一个令他头疼的实际问题出发,为自己“定制”了一套代码注释方法。作者坦言自己一直无法掌握传统的注释方式,尤其是当代码嵌套层次变深后,注释无法清晰标记代码块的开始和结束,导致可读性反而下降。 为了解决这个痛点,他受HTML标签清晰界定范围的特性启发,创造了一种“古怪”的注释风格:在代码块的首尾添加类似``和``的注释。他声称在PHP、JavaScript、甚至Shell脚本中都使用这种方法。这不仅能让他在快速浏览文件时立刻定位到功能模块的边界,还意外获得了一个好处:在Sublime Text编辑器中,整个代码块可以像HTML标签一样被直接折叠起来,让视图更清爽。 作者知道这做法可能不符合某些严苛的编码规范,但他认为这种“小聪明”确实提升了自己定位和理解代码的效率。这篇文章的核心在于展现一个实用主义程序员如何为了实际工作流的顺畅,打破常规、对工具进行个性化改造的思路。

本机暂存
IT 后端/ 2016-02-11 22:54:42 / 累计浏览 2,891

系统设计的典型分层和涉及的知识点

这篇讲的是系统设计面试中的典型套路。作者发现,许多看似复杂的设计问题,其实可以拆解为几个标准层次来思考。文章通过一张清晰的图表,梳理了从问题分析到具体技术点的完整框架。 核心将问题分为两大块:一类是“问题本身的分析”,涵盖同步/异步、消息推拉模式、数据结构设计等常见考察方向。另一类是“系统实现的分析”,又进一步细分为前端展示层、业务逻辑层,以及最复杂的数据访问层。每一层都对应着具体的挑战,比如缓存需要分层设计(冷热数据),数据库要考虑分片,而性能优化的核心始终围绕吞吐量与延迟展开。 特别值得注意的是,作者强调一致性模型是分布式系统的灵魂,读写模型则常与存储结构紧密结合。这篇文章的价值不在于给出一个标准答案,而是提供了一个结构化的思考工具,帮助你在面对任何系统设计问题时,都能快速定位关键层次,有条不紊地展开分析。

本机暂存
IT DevOps/ 2016-02-11 22:53:23 / 累计浏览 2,757

如何从Linux系统中获取带宽、流量网络数据

这篇讲的是如何在Linux系统中,把系统记录的原始网络流量数据,转换成我们更常用的带宽指标。作者从国外云厂商(如AWS)以流量(Bytes)为单位监控网络的场景切入,引出了带宽与流量的换算关系:带宽 = 单位时间内的流量 × 8 / 时间段。核心是利用Linux系统 `/proc/net/dev` 文件,它详细记录了每块网卡收发的字节数、数据包数等信息。 文章不仅解释了字段含义,还提供了一个清晰的Shell脚本示例。这个脚本通过两次读取 `/proc/net/dev` 中的流量数据,计算差值,再结合采样时间间隔(如60秒),就能得出入向与出向的带宽(Mbps)。作者还提到,如果想简化计算,有个近似方法:直接将AWS流量数值后7位去掉,就能粗略得到带宽(单位:Mbps),虽有误差但很方便。 最后,文章做了延伸:除了整机网络数据,通过 `/proc/$PID/net/dev` 路径,还可以获取特定进程(包括虚拟机或Docker容器)的网络统计信息,为更细粒度的监控提供了思路。对于需要编写监控脚本或理解Linux网络底层数据的工程师,这是一篇很实用的指南。

本机暂存
IT 移动开发/ 2016-02-11 22:42:42 / 累计浏览 5,951

iOS的定位原理揭秘

这篇讲的是iOS设备上那个既快又准的Wi-Fi定位,究竟是怎么实现的。文章从一个很直觉的矛盾点切入:家里的Wi-Fi路由器本身没有位置信息,手机却能通过它定位,这背后藏着一段“商业史”与一套精巧的算法。 作者梳理了Wi-Fi定位数据库的演进:从最早由Skyhook公司开车采集,到苹果后来凭借庞大的用户设备群建立起自己的数据库,完成了从依赖第三方到自主可控的转变。定位的精度和速度也随之提升,如今甚至无需连接Wi-Fi,设备缓存的周边信号信息就足以完成估算。 文章核心深入到了技术原理。它区分了基于信号到达时间等需要特殊硬件、在手机上不实用的方法,以及更可行的基于信号强度的定位。在后者中,又对比了“三角定位”和“指纹算法”的差异。三角定位需要预先知道AP位置,而指纹算法更像机器学习——先离线采集区域内的信号“指纹”建立数据库,在线定位时则将实时数据与之匹配。后者因对环境变化更强的适应性,成为智能手机室内定位的主流选择。 整篇从一个有趣的现象讲起,层层剥开技术实现的逻辑,让读者对日常使用却未曾深究的定位功能有了更立体的认识。

本机暂存
IT 移动开发/ 2016-02-11 22:39:52 / 累计浏览 2,324

由App的启动说起

这篇讲的是从用户点击App图标到程序真正运行起来,这电光火石的一瞬间里到底发生了什么。作者从“我是谁”的哲学拷问切入,带我们深入App的“新生儿”阶段,探寻那些看不见的启动奥秘。 文章把焦点对准了构成iOS应用的核心——Mach-O文件格式。它细致地拆解了App Bundle的结构,解释了Universal Binary(胖二进制)如何通过一个巧妙的Fat Header将支持不同CPU架构的代码打包在一起,以兼顾兼容性和性能。比如,文中就提到新浪微博的执行文件支持多种架构,而QQ和微信为了控制包体积则没有支持全部新架构。 作者的解读从文件组成到加载机制,层层递进。核心在于揭示那个从二进制文件到活生生应用的“炼金”过程,帮你理解Xcode编译、链接、打包之后,系统是如何接手并启动这个程序的。这种对底层机制的梳理,能让开发者超越日常编码,更透彻地理解App的运行本质。

本机暂存
IT 安全/ 2016-02-11 22:37:04 / 累计浏览 1,920

Burpsuite插件开发之RSA加解密

这篇讲的是如何为 Burpsuite 开发一个处理特定混合加密格式的插件,核心目标是解密数据包、注入测试 payload 后再加密回传,主要用于针对自定义加密通信的 APK 进行安全测试。 作者面对的数据包是典型的“RSA+DES”混合加密结构:一个 JSON 串中包含用 RSA 加密的 DES 密钥(encryptKey)和用该 DES 密钥加密的数据(data)。插件开发的核心,在于正确实现了 `InsertionPoint` 接口,以支持这种非标准格式。具体思路是,在 `getInsertionPoints` 方法中,插件会解析请求参数,识别出特定的加密参数(如参数名“c”),随后依次用配置的 RSA 私钥解密得到 DES 密钥,再用该 DES 密钥解密出明文 JSON 内容。最后,将解密后的明文 JSON 中的各个键值对分别构造为独立的注入点,从而让 Burpsuite 的扫描器和 Intruder 模块能够直接对原本不可见的加密数据内部进行模糊测试或漏洞探测。 这个插件的价值在于,它将一个需要手工逆向分析加解密流程才能进行安全测试的场景,自动化为了一个可复用、可配置的插件。实现的关键在于透彻理解目标应用的加解密协议,并利用 Burpsuite 的 `InsertionPoint` 扩展点,巧妙地将加密解密逻辑无缝嵌入到测试流程中。

本机暂存
IT 移动开发/ 2016-02-11 22:33:11 / 累计浏览 1,572

Swift断言

这篇讲的是Swift开发中如何优雅地处理输入参数校验问题。作者从编码中的一个哲学困境切入:代码的调用者(无论是其他程序员还是未来的自己)往往不了解实现细节,难以保证传入正确的参数。传统的if条件判断虽然可行,但会增加API复杂度和运行时开销。 文章的核心方案是Swift提供的断言(assert)机制。它通过assert函数在开发阶段进行条件“论断”,一旦输入不满足预设条件(例如温度转换中摄氏温度低于绝对零度),便会中断运行并抛出明确的调试信息。这比冗余的错误处理逻辑更清晰。 断言的一个关键设计在于它是一个“开发时特性”:仅在Debug编译模式下生效,Release构建时会被移除,因此完全不影响最终产品的运行性能。这使得开发者可以放心地在代码中保留这些校验,无需在发布时手动清理。 文章还提及了如何通过编译标记(如-assert-config Release)在特殊情况下强制禁用或启用断言,并对比了在Release阶段需要强制终止程序时应选择fatalError。总之,断言是面向开发者的、轻量且高效的调试守卫。

本机暂存
IT DevOps/ 2016-02-11 22:32:28 / 累计浏览 1,932

Docker基础技术:DeviceMapper

这篇讲的是,当Docker首选的AUFS文件系统因为不在Linux内核主干里而无法在CentOS等发行版上使用时,DeviceMapper是如何作为第二方案来实现镜像分层的。 作者首先从内核技术入手,解释了DeviceMapper是一个高度模块化的框架,其核心是Mapped Device、Mapping Table和Target device这三个对象概念。重点在于,Docker使用了该框架中的一个关键插件——Thin Provisioning Snapshot。 文章把Thin Provisioning类比为“虚拟内存”,即逻辑上提供无限空间,但实际按需分配。Docker正是利用其Snapshot技术,通过一系列内核命令(如dmsetup)来创建精简配置池(Thin Pool)和卷,从而高效地构建和管理容器镜像的分层结构。演示部分详细展示了如何用loopback文件搭建一个Thin环境,从创建元数据和数据文件,到最终格式化并挂载一个1GB的逻辑卷,过程非常具体。 通过DeviceMapper这套基于内核块设备的机制,Docker在非Ubuntu的Linux发行版上获得了可靠的分层存储能力。

本机暂存
IT 开发者/ 2016-02-11 16:24:48 / 累计浏览 2,901

研发团队的角色和构成

这篇文章从作者个人经历出发,讲述了研发团队角色与构成的演变。他对比了早年典型的分工模式与当下的新形态:过去团队里有明确的项目经理、SE(相当于产品经理)、独立的测试与QA等角色,流程偏向瀑布式。 如今,许多角色被融合或重新定义。项目经理常由团队负责人兼任,架构设计更多由资深工程师主导。一个显著趋势是“粘合剂”型工程师的出现——如SDE(软件开发工程师)需要承担从设计、编码到测试的更多职责。与此同时,纯粹的测试岗位在很多团队中正变得边缘或消失。 作者对此提出了自己的观察与争议性观点。他认为,将测试视为工程师的基本素养,比设置独立的测试岗位更有利于流程效率。他也提醒,全能型工程师虽好,但其精力若被过度分散于需求澄清或数据排查中,则可能暴露团队在产品设计或系统质量上的深层问题。 文章最终引发对工程师核心价值以及团队如何高效协作的思考。

本机暂存
IT 前端/ 2016-02-11 16:23:48 / 累计浏览 1,438

javascript定义对象的几种方法

这篇讲的是JavaScript中定义对象的几种经典方法。作者从最基础的对象扩充开始,逐步深入到工厂方式、构造函数、原型方式,最后介绍了试图融合两者优点的动态原型方式。 文章的核心价值在于对这些方式的细致对比。比如,它指出了“工厂方式”虽然方便,但每次创建对象都会生成新的函数实例,无法共享;而“构造函数方式”配合`new`关键字更规范,但方法不共享的问题依然存在。真正的突破点在于“原型方式”,它通过`prototype`让所有实例共享同一个方法,但作者也用代码清晰地演示了其中的陷阱:基本类型的属性变更不会同步,但引用类型(如数组)的变更却会在所有实例间反映出来。 最终,文章推荐了“动态原型方式”,它像一个精巧的折中方案:在构造函数内部通过一个标志变量,确保方法只添加一次到原型上,这样既保证了每个实例拥有独立的属性,又实现了方法的高效共享。这篇文章清晰地展示了每种方案的代码实现与适用场景,帮你理解为何需要从一种方式演进到另一种。

本机暂存
IT 开发者/ 2016-02-11 16:20:27 / 累计浏览 7,528

程序员和工程师有什么不一样?

这篇讲的是作者从初入职场时对“程序员”与“工程师”称谓的困惑出发,通过多年观察和反思,系统阐述了两者在工程实践层面的核心区别。 作者首先指出,工程师绝不写“黑箱程序”——那些难以调试、运行状态不可见的代码。他强调,成熟的系统需要清晰的层次划分和完善的运行信息暴露机制,这与单纯追求功能实现的程序员思维形成对比。 其次,作者强调工程师具备强烈的“接口意识”。他们不仅完成功能,更会设想代码的使用场景与扩展性,实现逻辑与具体操作的分离。文中列举了登录模块、数据加载等例子,说明接口分离如何提升系统的灵活性与可维护性。 此外,工程师注重功能点之间的逻辑联系。他们不止于堆砌功能,而是持续构建系统的逻辑框架,将复杂操作整合为有意义的动作(如“登录”),从而控制整体复杂度,避免系统沦为一堆割裂的操作手册。 文章从个人实践出发,具体剖析了工程师在代码可维护性、设计前瞻性和架构逻辑性上需要具备的素养,对理解软件开发中的工程思维很有启发。

本机暂存
IT 后端/ 2016-02-11 14:59:45 / 累计浏览 2,330

垃圾收集器选择

这篇讲的是JVM垃圾收集器的核心选择问题。作者从JDK版本演进切入,指出在串行收集器只适用于小数据量的前提下,真正的选择主要发生在并行收集器与并发收集器之间。 文章清晰地梳理了两者的定位与典型配置。吞吐量优先的并行收集器(如UseParallelGC),通过最大化处理器利用率来服务后台批处理任务,并提供了调整GC线程数、暂停时间及自适应策略等关键参数。而响应时间优先的并发收集器(如UseConcMarkSweepGC),则致力于最小化应用停顿,更适合在线服务场景。文章也具体指出了像-XX:+UseConcMarkSweepGC可能会导致-XX:NewRatio失效,以及如何通过参数处理并发收集器产生的内存碎片问题。 它不仅给出了“是什么”和“为什么”,更提供了“怎么配”的实战代码示例。无论你是在做科学计算需要高吞吐,还是运营在线系统要求低延迟,都能从中找到明确的调优方向和参数依据。

本机暂存
IT 安全/ 2016-02-11 14:59:15 / 累计浏览 1,924

IOS安全—阻止tweak注入hook api

这篇讲的是如何通过一种简单的编译设置来阻止iOS应用被Tweak注入和Hook。作者从网上看到一个通过添加特定Linker Flags来防止dylib注入的方法,并动手进行了验证。 他先用Theos编写测试Demo,在不添加任何flags的情况下,成功Hook了viewDidLoad方法并打印日志。随后,在Xcode的Other Linker Flags中加入`-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null`并重新编译。再次测试后,发现注入的dylib无法加载,Hook失败。通过MachOView可以看到,二进制文件中多出了一个名为`__RESTRICT/__restrict`的段。 文章深入分析了其原理:根据dyld源码,当主可执行文件包含此特定段时,系统会忽略`DYLD_INSERT_LIBRARIES`等环境变量,从而阻断了动态库注入的途径。这是一种轻量级的防护手段。然而,作者也展示了攻防的动态性——他使用010 Editor手动修改了这个段的名称,重新签名安装后,应用又能够被成功注入了。这清晰地揭示了该防护机制的核心依赖于段的特定名称,为安全研究提供了有价值的视角。

本机暂存
IT 移动开发/ 2016-02-11 14:56:27 / 累计浏览 2,248

大屏 iPhone 的适配

这篇讲的是苹果推出 iPhone 6 系列后,iOS 开发者面临的屏幕适配挑战。文章直接切入核心问题:旧工程在新设备上默认以“兼容模式”运行,导致显示模糊。作者总结出两种让应用进入高分辨率模式的有效方法——要么添加对应的 LaunchImage,要么使用 Xcode 6 引入的 Launch Screen 文件。考虑到对旧版 iOS 的兼容性,文章推荐了更稳妥的第二种方案。 文章还深入到了资源显示层面,指出了一个关键差异:iPhone 6 Plus 的设备像素密度更高,需要使用 @3x 图片,并且其内部逻辑分辨率与实际物理分辨率之间存在一个 1/1.15 的缩放过程。对于开发者最关心的屏幕参数,文章附上了一份清晰的对比表格,列出了从 iPhone 到 iPhone 6 Plus 各代设备的 Point 值、像素值、Scale 和 PPI,为具体适配工作提供了直接的数据参考。

本机暂存
IT 移动开发/ 2016-02-11 14:55:28 / 累计浏览 2,307

深入理解RunLoop

这篇讲的是 iOS/macOS 系统中至关重要的事件循环机制——RunLoop。作者从 CFRunLoop 的开源源码出发,带我们看清了这个底层对象的真实面貌。 文章不止于概念,而是层层深入:解释了 RunLoop 与线程一对一的绑定关系,剖析了 Source(事件源)、Timer、Observer 这三个核心组件的区别与协作,特别是区分了需要手动唤醒的 Source0 和能主动唤醒线程的 Source1。对于 Mode 的机制讲解也十分关键,说明了 RunLoop 每次运行只能处理特定模式下事件的设计意图。 最实用的部分在于,文章详细拆解了苹果是如何基于这套机制来实现自动释放池、触摸事件分发、屏幕刷新(CADisplayLink)、定时器等日常功能的。最后,通过分析 AFNetworking 和 AsyncDisplayKit 这两个经典框架的用法,展示了 RunLoop 在高性能网络监听和界面异步渲染中的巧妙应用,让理论立刻有了落脚点。 通篇将源码逻辑与系统设计结合,不仅解释了“是什么”,更阐明了“为什么这么实现”,对于想穿透 API 层、理解 iOS 系统运行原理的开发者来说,是一次扎实的源码导览。

本机暂存
IT 移动开发/ 2016-02-11 14:54:53 / 累计浏览 1,630

iOS 处理图片的一些小 Tip

这篇讲的是 iOS 开发中几个容易被忽略的图片处理细节,作者从实际编码经验出发,给出了不少实用技巧。 比如保存 GIF 动图,直接用 UIImageWriteToSavedPhotosAlbum 会转码成 PNG,正确做法是通过 ALAssetsLibrary 的 writeImageDataToSavedPhotosAlbum 来保留原始动图格式。保存 UIImage 到磁盘时,用 NSKeyedArchiver 其实是性能最差的方案,对于不含透明像素的图片,用 UIImageJPEGRepresentation(0.9) 压缩保存反而在编码速度和文件体积上都更优。 文章还深入解释了 UIImage 的缓存机制。通过 imageNamed 创建的图片,其解码数据在第一次显示时才会生成,并缓存在全局缓存中,通常只在 App 退后台或收到内存警告时清空。即使使用 imageWithData 创建图片,底层也会启用缓存。想要避免缓存,可以手动调用 CGImageSourceCreateWithData 并关闭缓存参数,或者更常见地,将图片绘制到画布再取出数据——这也是很多网络图片库采用的做法。 此外,文章还介绍了如何直接获取图片解码后的原生数据、快速判断文件图片类型,以及如何利用 CGImageSource 的 Incremental 方式实现像浏览器那样边下载边显示图片的效果,并对比了 PINRemoteImage、YYWebImage 与 SDWebImage 在这方面的实现差异。

本机暂存
IT 前端/ 2016-02-11 14:54:11 / 累计浏览 2,201

JavaScript初体验

这篇文章源于作者一次愉快的阅读体验。在读完《JavaScript语言精粹》后,他结合自己的使用经历,分享了几个对JavaScript印象最深的特点。 作者认为,JavaScript的灵活性是其核心魅力。比如“函数即变量”的特性,为异步和回调提供了天然支持;而JSON作为JS的“最伟大副产品”,极大地简化了数据序列化过程,对比传统语言的RPC工具堪称“酸爽”。他同时指出,抛开“原型继承”、“闭包”等看似高深的标签,JS其实是一门简单的语言,其Array、Object、函数参数等设计都透着直接和灵活。 文章也记录了作者的一些个人疑惑:他质疑JSONP在URL里写回调的方式是否足够优雅,思考Promise之外更佳的异步解决方案,并对Node.js在后端生态的统治地位表达了既批判又看好的复杂态度。在书评部分,他认为本书相比冗长的《权威指南》更为“接地气”。 通篇来看,这更像是一位有经验的开发者,在语言特性、生态现状和学习资源之间穿梭,给出的个人化思考笔记。对于想了解JS本质魅力或资深开发者心得的读者,其中的观察角度很有启发。

本机暂存