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

最新文章

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

IT 数据库/ 2015-10-04 23:15:06 / 累计浏览 2,078

清官谈mysql中utf8和utf8mb4区别

这篇文章对比了MySQL中两种常见的字符编码:utf8与utf8mb4。作者从实际存储问题出发,解释了核心差异:MySQL的utf8编码最大仅支持3个字节的UTF-8字符,因此无法存储Emoji表情、部分生僻汉字等占用4个字节的Unicode字符,插入时可能导致异常。而utf8mb4作为其超集,专门用于兼容这类四字节字符。 文章进一步追溯了问题根源,指出这与MySQL早期设计时Unicode尚未扩展辅助平面有关,当时的utf8被限制为最多3个字节。作者建议,尽管utf8在多数情况下足够且更节省空间,但为了更好的兼容性和前瞻性,应始终优先使用utf8mb4字符集(需MySQL 5.5.3以上版本)。同时,他提到使用utf8mb4时,对于CHAR类型数据会额外消耗空间,官方推荐使用VARCHAR类型进行替代。

本机暂存
IT 算法/ 2015-10-04 23:11:14 / 累计浏览 5,750

Java程序员必知的8大排序算法

这篇讲的是Java程序员几乎绕不开的排序算法集合。排序是编程基础,但很多人可能只记得零散的冒泡和快排,对其他几种知其然不知其所以然。这篇文章就系统性地梳理了直接插入、希尔、简单选择、堆排序等经典算法。 它不像教科书那样堆砌公式,而是像一张清晰的导航图,先用一张图展示8种排序之间的演进与关系,帮助读者建立整体认知。对于每一种算法,都拆解成三部分:先讲清楚核心思想和解决问题的逻辑,比如堆排序如何借助“堆”这种数据结构进行树形选择;然后给出一个直观的排序实例图,让抽象过程可视化;最后附上可直接运行的Java代码,将思想落地。 尤其值得一提的是,文章在讲解复杂算法(如堆排序)时,通过分解“建堆”和“交换”两个关键步骤的可视化过程,让算法的巧妙之处一目了然。这种从原理、图示到实现的递进式讲解,能帮助开发者不仅学会怎么用,更理解算法背后的设计考量,从而在面对不同数据规模或特征时,能更从容地做出选择。

本机暂存
IT 后端/ 2015-10-04 23:09:59 / 累计浏览 2,221

让你的PHP7更快之Hugepage

这篇讲的是PHP7的RC4版本如何通过启用Hugepage特性来提升执行性能。作者从虚拟内存分页的基础问题出发,指出默认4KB页面在地址转换时需要频繁查表,CPU的TLB缓存有限,导致Cache Miss拖慢效率;而启用2MB的Hugepage能减少TLB条目数,间接降低这种开销。文章核心是指导读者实操:编译PHP7时保持默认选项(不要加-disable-huge-code-pages),在php.ini中配置opcache.huge_code_pages=1,并通过sysctl分配系统Hugepages。作者的测试显示,在WordPress上能稳定获得2%~3%的QPS提升,效果显著。 不过,文章也提到

本机暂存
IT 移动开发/ 2015-10-04 23:08:18 / 累计浏览 1,290

Objective-C 运行时的黑魔法之Swizzle

这篇讲的是Objective-C运行时里一项既强大又颇具风险的特性:Swizzle(方法交换)。作者从一个实际需求切入——如何在不改动项目原有代码结构的前提下,为应用中成百上千个UIButton的点击事件统一添加统计逻辑。 文章清晰地揭示了Swizzle的原理:Objective-C在调用方法时,依赖类的“调度表”通过selector查找对应的实现。我们可以在运行时替换这个映射关系,从而“偷天换日”。相比于创建子类或逐处修改代码的传统思路,这无疑是一劳永逸的“黑魔法”。 其核心实现也十分巧妙:通过`method_exchangeImplementations`交换两个selector对应的方法指针。文中以一段Swift示例代码具体展示了如何为UIButton扩展一个计数方法,并与原方法交换实现。最有趣的一点是,在替换方法中调用“自身”时,看似会死循环,实则因为实现已被交换,调用的恰是原始逻辑。 最后,文章还提醒了在Swift中应用Swizzle的注意事项,例如需要利用`initialize`方法触发交换,以及对纯Swift类需要使用`dynamic`修饰以启用动态派发。这既是一次对运行时机制的精彩剖析,也提供了解决特定工程难题的优雅范本。

本机暂存
IT AI/ 2015-10-04 23:07:00 / 累计浏览 2,795

行为树及其实现

这篇讲的是作者如何将游戏AI中的行为树概念落地为一段具体的C代码实现。文章从游戏开发中传统状态机的扩展性难题切入,引出了行为树作为解决方案的背景。 作者梳理了行为树的核心结构:由负责逻辑判断的中间节点(如顺序、优先级)和执行动作的叶子节点构成,并通过“黑板”机制在节点间共享数据。重点在于其实现部分——作者对比了800行的C++实现,认为其封装偏深,因此用约400行C代码,以组合而非继承的方式完成了一个更轻量的版本,并解释了核心API如创建节点、分支与执行tick的设计。 文章还透露了行为树在工业实践中往往依赖可视化编辑器生成JSON描述,为后续扩展埋下了引子。整体而言,这是一次从理论到轻量级代码的实践记录。

本机暂存
IT 数据库/ 2015-10-04 22:52:44 / 累计浏览 2,423

MySQL索引原理与慢查询优化

这篇讲的是如何从原理层面理解MySQL索引,并将其应用于实际的慢查询优化。作者从“查询效率”这个基本需求出发,首先用字典类比引出索引概念,然后深入讲解了数据库为平衡磁盘IO成本所选择的数据结构——B+树。文章详细剖析了B+树的节点结构、查找过程以及高度可控的优势,解释了为什么索引字段要尽量小,以及复合索引的“最左匹配”原则是如何从B+树结构推导出来的。 在原理部分之后,文章给出了几条非常实用的建索引原则,比如索引列不能参与计算、尽量扩展而非新建索引等。最后,它提供了一套慢查询优化的基本步骤,并强调了`explain`命令中`rows`指标的核心作用。整篇文章将底层的数据结构原理与上层的SQL优化实践紧密串联,帮助读者不仅知道“怎么做”,更理解“为什么”。

本机暂存
IT 安全/ 2015-09-21 14:27:15 / 累计浏览 19,375

IOS安全–浅谈关于IOS加固的几种方法

这篇讲的是iOS平台加固方法的梳理与对比。作者开篇就点明了iOS系统在未越狱时的相对安全性,但同时也指出,针对逆向分析与破解的加固需求并未消失。 文章重点对比了市面上几款iOS加固产品的早期形态:从被作者认为是“噱头”的爱加密IOS加密,到使用起来需要替换编译器的Safengine工具,再到体验相对较好、考虑更周全的白盒加密方案。通过这些产品演进,带出了当前iOS加固的主流技术方向。 核心内容围绕四种具体方法展开:一是字符串加密,防止明文信息被静态分析直接获取;二是类名与方法名混淆,让通过class-dump得到的接口难以被理解;三是基于Clang编译器IR层的代码混淆,增加反编译后的逻辑分析难度;四是集成安全SDK,提供反调试、注入检测、越狱检测等运行时防护能力。文章不仅指出了问题现状,也给出了部分方法的开源实现参考。 作者以亲身实践的角度,串联起了iOS加固从工具产品到具体技术实现的全景,为关注移动端安全的开发者提供了清晰的入门图景。

本机暂存
IT 安全/ 2015-09-21 14:23:09 / 累计浏览 4,503

iOS安全系列之二:HTTPS进阶

这篇讲的是在iOS开发中如何让HTTPS连接更安全,作者从实际遇到的HTTPS问题出发,深入剖析了中间人攻击的几种常见形式。文章首先模拟了最简单的钓鱼式攻击,通过Charles代理工具详细演示了攻击者如何利用伪造证书窃取HTTPS流量,直观暴露了许多App仅依赖系统默认校验的安全隐患。 在此基础上,作者对比了SSL剥离等更具隐蔽性的攻击手段,并针对性地指出了防范关键:不仅要依赖系统校验,App内部更应对服务器证书进行本地的、硬编码的对比校验。文中还延伸讨论了iOS 9引入的App Transport Security(ATS)特性,以及如何使用Wireshark调试SSL/TLS通信,将理论与开发实践紧密结合。 对于希望加固应用网络安全的开发者而言,文章从攻击原理到防御代码都提供了具体思路,特别是关于WebView中易忽略的URL协议校验等细节,具有很强的实操参考价值。

本机暂存
IT 移动开发/ 2015-09-21 14:13:58 / 累计浏览 3,480

iOS安全系列之一:HTTPS

这篇讲的是HTTPS,但不是泛泛而谈。作者从iOS开发者普遍对安全不够重视的现状出发,指出即便是未越狱设备,网络安全依然是不可回避的课题。文章的核心,是厘清HTTPS并非什么新协议,其本质只是在HTTP之下增加了一层SSL/TLS加密。 最硬核的部分在于对SSL/TLS原理的拆解:它通过四次握手交换三个随机数来生成安全的“对话密钥”,并依赖数字证书体系(PKI)进行身份验证。文章用清晰的逻辑讲透了证书的签发与验证流程——接收端如何通过哈希对比和递归验证,最终追溯到操作系统内置的根CA。这解释了“为什么信任链的起点如此重要”。 在实现层面,文章没停留在理论。它具体展示了如何在iOS的NSURLConnection中处理证书验证回调,利用Security Framework的API完成Trust Object的评估。无论是使用系统默认验证,还是为自建证书等高安全场景进行更严格的本地匹配校验,都给出了可落地的代码思路。对于想用AFNetworking简化流程的开发者,也有明确的指引。 从概念辨析到原理图解,再到代码级实践,这篇文章提供了一条清晰的路径,帮助开发者完成从HTTP到HTTPS的安全升级。

本机暂存
IT 后端/ 2015-09-21 13:50:53 / 累计浏览 1,796

Scala的模式匹配

这篇讲的是作者在从Java转向Scala学习过程中的一个核心发现:模式匹配。作者对比了自己学习Haskell和Scala的体验,指出Scala的模式匹配对有Java背景的开发者非常直观友好。 文章的核心在于对比。作者首先用Haskell的阶乘和字符串翻译为例,说明模式匹配本质上是一种强大的“变化点”控制机制,比传统if-else更清晰地处理多条件分支。接着,他将这一概念平移到Scala,展示了它不仅可以匹配值,还能匹配类型、拆解数据结构(如List)以及复杂的构造器组合。 更深入的对比在于设计范式。文章指出,传统的面向对象多态将行为内聚于类中,新增类型容易,但扩展接口(新增行为)则很麻烦。而模式匹配将核心逻辑抽离到函数中,使得新增一种数据类型(如一个新的树节点)需要修改所有匹配函数,但新增一种操作(如先序遍历)只需增加一个新函数。这清晰地揭示了两者在开闭原则应用上的不同侧重,帮助读者理解何时该选择哪种范式。 作者最后通过二叉树遍历的例子,具体展示了模式匹配如何优雅地处理递归和结构化解构,并给出了从Java转向Scala的实用学习路径建议。

本机暂存
IT 开发者/ 2015-09-21 13:46:59 / 累计浏览 1,737

那些我印象深刻的建议和教诲

这篇文章讲述了作者从大学到职场,在不同人生阶段收获的、影响其职业轨迹的关键建议。这些教诲并非空洞说教,而是来自老师、前辈和朋友的、在具体场景中点醒他的瞬间。 核心在于“选择”与“成长”。文章分享了“技术是安身立命之本”如何让他平衡兴趣与专业,在现实世界中站稳脚跟;“把目标设高一点”则启发他不给自己设限,走出了意想不到的职业道路。在实际技能层面,从“多用Google吧”这句来自项目经理的救命稻草,到“现在你们可以拿公司的钱做实验了”这种将工作环境转化为成长资源场的思维,都提供了可操作的方法论。 更深层次的,是关于心态和毅力的思考。创业前辈“大旗不倒,才有机会”的执着,以及关于“功夫不负有心人”与“蠢”只在结果之间微妙区别的故事,探讨了坚持的边界与价值。而朋友在饭桌上告诫的“面对自己的弱点,不要躲”,则直指个人成长中最困难却也最核心的一环——如何客观看待并克服自身不足。 这篇分享没有提供速成法则,而是通过真实经历呈现了那些“少走弯路”的智慧如何塑造一个人。它提醒我们,真正的成长往往来自于关键节点的认知突破,以及面对自己时的那份诚实。

本机暂存
IT 安全/ 2015-09-21 13:45:43 / 累计浏览 1,210

Android安全–DexClassLoader动态加载分析

这篇讲的是DexClassLoader在Android动态加载中的具体实现机制。作者从DexClassLoader的构造函数切入,像侦探一样,一步步追踪代码执行流程。 他沿着构造函数进入父类BaseDexClassLoader,再到关键的DexPathList,最终锁定了加载dex文件的核心函数`loadDexFile`与`openDexFile`。这条路径清晰展示了参数如何被解析与传递。 最巧妙的部分在于,作者将分析延伸到了native层。在`openDexFileNative`函数中,系统会根据文件后缀,分别调用`dvmRawDexFileOpen`处理dex文件或`dvmJarFileOpen`处理jar包,最终返回一个统一的`DexOrJar`结构。这揭示了Android如何将不同格式的代码包归一化处理,巧妙地衔接了Java与Native层的实现。

本机暂存
IT 安全/ 2015-09-21 13:37:31 / 累计浏览 2,224

说说 XcodeGhost 这个事

这篇文章围绕曾经引起广泛关注的“XcodeGhost”事件展开。作者并非单纯复述事件经过,而是从一个技术观察者的视角,深入剖析了这场安全风波背后的技术逻辑与行业生态。 文章指出,被植入木马的Xcode确实导致了大量国产App被污染,但其实际危害程度需要理性评估。作者核心观点在于,iOS系统自身的安全设计(例如iCloud密码的高优先级保护、沙盒机制)构筑了多道防线,有效限制了恶意代码所能造成的最坏后果。他详细解释了为何直接窃取iCloud密码极其困难,并指出了用户可识别的钓鱼特征,如对话框反常地要求输入完整的Apple ID。 更重要的是,作者将此事与国内开发者普遍集成不明第三方SDK的风气进行了对比,认为后者对App信任链的破坏远超XcodeGhost。他借此批评了行业安全意识的薄弱,并呼吁用户(尤其是国产安卓用户)加强基本防护,如开启二步验证、谨慎对待系统弹窗。文章最后回归到技术本质,强调了操作系统层面安全机制的关键作用,为读者提供了在恐慌情绪之外更为冷静和深入的安全思考。

本机暂存
IT 后端/ 2015-09-04 22:46:04 / 累计浏览 2,943

nodejs中文md5与php结果不一致

作者在做流量接口时遇到了一个典型的跨语言互操作问题:Node.js和PHP对同一段中文字符串进行MD5加密,竟然产生了不同的结果,直接导致签名校验失败。而英文字符串则能通过,说明问题根源并不在算法本身。 经过排查,确认这是字符编码差异导致的经典坑点。Node.js的`crypto`模块在计算哈希时,如果没有显式指定输入字符串的编码,默认可能使用与PHP不同的字符集进行字节转换,从而生成不同的MD5值。文章给出了一个简洁的修复方案:在调用`instance.update()`方法时,第二个参数明确传入`'utf8'`,强制使用统一的UTF-8编码。 这个小坑的解决成本虽低,但排查时容易让人迷惑。作者通过实践验证了显式编码指定的必要性,确保了不同语言栈间哈希结果的一致性,为处理多语言环境的签名验证提供了直接参考。

本机暂存
IT 数据库/ 2015-09-04 22:45:06 / 累计浏览 1,342

[MySQL异常恢复]无主键情况下innodb数据恢复

这篇讲的是,当MySQL InnoDB数据库发生异常需要恢复时,一个常见的“坑”:通常恢复工具都假定表必须有主键或唯一索引,否则就无从下手。文章指出这其实不是绝对的死路。 核心在于,即便没有用户定义的索引,InnoDB也为每个表维护了一个内部的`index_id`。这个ID贯穿数据文件,是定位数据页的线索。作者从这个突破点出发,详细演示了如何在无主键的场景下进行数据恢复。 他通过创建一个真实的无主键表,并插入了32万余行数据来模拟故障现场。随后,文章逐步展示了使用工具解析ibdata1系统表空间文件的过程。关键步骤在于,如何从解析结果中筛选出对应表的`index_id`,并以此为线索重组数据。 这种方法为那些因设计疏忽或特殊原因未设主键的数据库,在遭遇崩溃时提供了一条可行的抢救路径,避免了数据彻底丢失的风险。

本机暂存
IT 数据库/ 2015-09-04 21:50:03 / 累计浏览 3,377

SQL 新手指南

这篇指南从“SQL无处不在”的现实切入,为零基础读者拆解了数据库与SQL的核心概念。作者将抽象的数据库比作更强大的Excel电子表格,清晰解释了表、行列、关系等基础元素,并用一个“电影台词”数据库作为贯穿示例,直观展示结构化数据如何被组织和关联。 文章的核心在于讲解SQL的四种基本操作(CRUD):创建、读取、更新和删除数据,这是与数据库沟通的基石。作者强调,尽管有各种可视化工具,但理解SQL语言本身至关重要——它语法接近英语,是一种声明式语言,掌握它能让你更高效、更灵活地解决问题。 整体而言,这是一份非常扎实的入门引导,不仅告诉你SQL是什么,更通过具体的表格实例,让你感受到关系型数据库如何将杂乱数据变为可高效查询的资产,为后续学习打下坚实基础。

本机暂存
IT 移动开发/ 2015-09-04 21:45:03 / 累计浏览 4,071

Android安全–检测是否为Android模拟器

这篇讲的是如何在应用层面检测 Android 模拟器环境。作者从应用安全的角度出发,指出在某些场景下(如反欺诈、版权保护)需要区分真机与模拟器,随后提供了一套完整的检测代码实现。 文章的核心思路是综合利用模拟器环境在多个维度留下的特征。代码中演示了几个典型的检查点:首先扫描系统中是否存在已知的 QEMU 虚拟管道文件(如 `/dev/socket/qemud`)或特定的驱动程序标识(如 `goldfish`),这些是 Android 模拟器的标准配置产物;其次,通过读取 `/proc/cpuinfo` 文件检查 CPU 信息,或查询电池状态(如电量始终为满且温度恒定),因为模拟器硬件信息往往显得“完美”且缺乏真实设备的动态变化。 这些检测手段组合起来,能形成一个相对可靠的模拟器判断模型。文章没有停留在理论层面,而是直接给出了可集成的 Java 代码片段,对于需要快速落地检测功能的开发者来说,提供了一个开箱即用的参考方案。

本机暂存
IT 设计/ 2015-09-04 21:42:55 / 累计浏览 2,666

产品设计之尊重常识

这篇讲的是产品设计中一个常被忽视却至关重要的原则:尊重常识。 作者从一个很接地气的视角切入,指出常识往往是“大家第一秒都懂,但实际情况中却总被忽略”的东西。他举了一系列生动例子:不可能既要流量又便宜又精准;不可能要求设计快、质量高还薪水低;用户天然讨厌繁琐操作和强制登录门槛——比如早期在交易网站强推登录,就是违背“用户来是为了买东西”这个基本常识。 文章的核心观点在于,尊重常识是产品设计的起点,本质是回归事物的本来面貌。它强调,好的产品应该把绝大多数精力(90%)用于思考“内在驱动”,也就是用户、场景、需求与解决方案的匹配;而只用少量时间(10%)去处理“外在表现”,如界面颜色、功能入口等表面问题。 作者以此指出,许多看似“很美”的设计之所以失败,恰恰是因为脱离了常识。这篇文章对产品经理和设计师的启发在于:先沉下心深度思考,再动手实现,别让表面的精致掩盖了本质的缺失。

本机暂存
IT 前端/ 2015-09-04 21:40:50 / 累计浏览 2,064

CSS深入理解vertical-align和line-height的基友关系

这篇技术文章用生动的方式剖析了CSS中vertical-align和line-height这两个属性的内在关联。作者从图片下方常出现的意外空白间隙问题出发,揭示了这一现象的根本原因:图片默认以基线对齐,而基线的位置由行高(line-height)决定,因此间隙实际上是两者共同作用的结果。 文章深入解释了vertical-align的百分比值并非基于字体大小,而是直接相对于line-height计算,这是两者存在紧密联系的核心证据之一。为帮助理解,作者提出了“幽灵空白节点”的概念,即在HTML5声明下,块状元素内部的内联元素行为,仿佛存在一个看不见的空白节点,其高度由line-height撑开,从而影响vertical-align的对齐计算。 基于此原理,文章指出了消除间隙的两种主要思路:一是通过display:block等方式使vertical-align失效;二是直接控制line-height的值。这种从具体问题入手,逐步拆解底层机制的讲解方式,为理解和解决CSS中复杂的垂直对齐问题提供了清晰的思路。

本机暂存
IT 安全/ 2015-09-04 21:39:16 / 累计浏览 1,937

Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用

文章从研究Android图形子系统时发现的一个整数溢出漏洞讲起,这个漏洞存在于libcutils库的native_handle_create函数中。作者龚广(@oldfresher)揭示了,当传入精心构造的numFds和numInts参数时,会导致堆内存分配大小计算溢出,进而引发堆破坏。具体来说,这个漏洞可通过Android图形系统的Binder接口(如IGraphicProducer的setSidebandStream)被低权限进程跨进程触发。 更巧妙的是,作者构建了一条清晰的提权路径:从普通应用出发,必须按顺序依次注入mediaserver、surfaceflinger,最终目标是获得system_server的“半神”权限。摘要中点明了这一“三步走”策略的必要性——每一步获取的权限是攻击下一步的门票。文中还提及了攻击过程需克服的ASLR、SELinux以及je_malloc堆管理器等现实障碍,并以mediaserver注入为例,详细拆解了从控制Binder服务线程到最终代码注入的五个步骤。整篇文章不仅定位了漏洞根源,更完整呈现了从漏洞发现到实现高权限提权的复杂工程化利用全貌。

本机暂存