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

最新文章

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

IT 安全/ 2016-02-06 11:31:19 / 累计浏览 2,567

学习手册:浅析DDoS的攻击及防御

这篇讲的是DDoS攻击的完整图景——从基础概念到实战工具。作者从“拒绝服务”和“分布式”这两个核心点出发,解释了攻击如何演变成依靠“僵尸网络”进行的协同作战。文章梳理了DDoS的发展史:早期只是黑客的炫技游戏,后来被宗教和商业组织用于勒索与报复,最终甚至成为国家级网络战争的武器,其中中国和美国是受灾最严重的地区。 在技术层面,文章将攻击方式归纳为四类:耗尽网络带宽的流量洪水、针对TCP连接表的SYN洪水、专门攻击DNS和Web服务的应用层攻击,以及混合多种手段的综合性攻击。特别提到随着僵尸网络小型化,慢速应用层攻击正成为新的趋势。文章还介绍了几款知名的开源工具,比如曾被广泛使用的低轨道离子炮(LOIC)和专门产生HTTP流量的HULK,让读者直观了解攻击的实现手段。 整体而言,这篇文章不仅解释了DDoS“是什么”,更通过攻击工具和态势分析展现了“如何发生”,对于理解当前网络空间中的流量型威胁提供了清晰的框架。

本机暂存
IT 移动开发/ 2016-02-06 11:27:50 / 累计浏览 1,639

Swift 的sizeof 和 sizeofValue

这篇讲的是从 C 过渡到 Swift 的开发者,在处理内存尺寸计算时需要注意的关键差异。文章从 C 语言中无处不在的 `sizeof` 运算符切入,指出它在 Swift 中被封装成了两个独立的方法:只能接受类型的 `sizeof` 和接受具体值的 `sizeofValue`。 最关键的区别在于 `sizeofValue` 的行为。它返回的并非像 C 那样的数组内容总大小,而是这个值本身(在 Swift 中往往是一个引用)的内存尺寸。作者用一个 `[CChar]` 数组的例子做了清晰对比:在 C 中 `sizeof(bytes)` 得到 3,而在 Swift 中 `sizeofValue(bytes)` 在 64 位系统下得到的是 8,这实际上是数组引用的长度。 文章接着指出了由此带来的实践影响:若要在 Swift 中像生成 `NSData` 时计算缓冲区大小,不能再直接使用 `sizeofValue`,而需要结合 `sizeof(CChar)` 和 `count` 属性进行手动计算。最后,文章通过一个关于枚举类型的练习题,引导读者深入思考 `sizeof` 与 `sizeofValue` 配合原始值时的不同表现,巩固对这一新模型的理解。

本机暂存
IT 数据库/ 2016-02-06 11:25:27 / 累计浏览 2,403

实例解析MySQL性能瓶颈排查定位

这是一篇典型的故障排查实战文章。作者从线上MySQL实例负载告警入手,完整记录了从操作系统层面到数据库内部的定位过程。通过`w`、`sar`、`top`、`iotop`等命令,一步步锁定了高负载源于某个MySQL实例严重的磁盘I/O等待。 深入该实例后,发现瓶颈来自一条低效的SQL查询:它通过正序排序后取最大值,导致每次执行都需要全表扫描500多万行数据。作者将其优化为直接倒序排序取首条记录,将执行时间从上百秒降至毫秒级,性能提升显著。文章最后也总结了此类问题的常见成因,如大单次读写、缺少索引或突发流量等。对于需要处理数据库性能问题的开发者来说,这份从现象到根因的清晰排查路径很有参考价值。

本机暂存
IT 安全/ 2016-02-06 11:19:22 / 累计浏览 1,617

文档安全加密系统的实现方式

这篇讲的是文档安全加密系统如何实现高效且透明的安全防护。文章从加密技术的基础出发,指出虽然DES、RSA等算法是核心,但真正决定系统效能的,是加密操作在系统中的实现方式。它重点对比了静态加密与动态加密:前者需要用户手动解密才能使用文件,后者则在后台实时处理,合法用户完全无感,文件访问体验与未加密时无异。 实现真正的动态加密极具挑战,因为它需要在操作系统内核层进行干预。文章清晰地剖析了Windows文件操作流程的四个层次,指出只有在内核层的文件过滤驱动程序中,才能拦截所有文件操作请求,从而实现实时加解密。位于应用层的方案本质上只是“伪动态”,无法做到真正的透明。 最后,文章以亿赛通SmartSec系统为例,展示了动态加密的落地架构:通过内核层的文件过滤驱动实现核心加解密,同时结合应用层进行访问控制和行为审计,两者配合既提升了安全性,也优化了系统性能。这种分层协同的设计思路,为构建企业级文档安全方案提供了清晰参考。

本机暂存
IT 后端/ 2016-02-06 11:17:20 / 累计浏览 3,010

PHP扩展迁移为兼容PHP7记录

这篇讲的是PHP7扩展开发中,由于内核API的多项变更,在迁移旧版扩展代码时需要处理的兼容性问题。作者详细记录了多个具体函数签名的变化与修正方法。 核心问题在于PHP7对底层进行了重构。很多常用函数如`add_assoc_stringl`、`RETURN_STRINGL`的参数个数减少了;`zval`变量的内存分配方式从堆(使用`ALLOC_INIT_ZVAL`)改为栈(直接声明`zval sarray_l;`)。此外,类型系统也发生了变化,例如布尔类型`IS_BOOL`被拆分为`IS_TRUE`和`IS_FALSE`,相关的宏`Z_BVAL`和`Z_TYPE_PP`也不再存在。 文章还解决了一些编译错误,例如缺少`INT64_MAX`定义时需要手动添加`#include `和相关宏定义;对于字符串,需使用`ZSTR_VAL()`宏将新的`zend_string`类型转换为传统的`char*`;在创建对象时,需要自定义一个`fetch_object`函数来替代旧的`zend_object_store_get_object`。 对于正在迁移或维护PHP扩展的开发者来说,这些来自一线的“踩坑”记录,清晰地指出了代码调整的具体方向,提供了实用的排查和修改参考。

本机暂存
IT 后端/ 2016-02-06 11:04:03 / 累计浏览 4,670

C++之stl::string写时拷贝导致的问题

这篇讲的是作者在实现数据结构序列化时,因滥用 `std::string` 作为缓冲区而踩到的一个隐蔽陷阱。具体来说,作者直接通过 `(char*)s.c_str()` 获取内部指针并使用 `fread` 写入数据,这在多数情况下看似高效且可行。然而,当代码中发生类似 `string s2 = s;` 的拷贝操作后,再对 `s2` 进行同样的 `fread` 操作,原本期望保持不变的 `s` 内容却意外被篡改了。 问题的根源在于部分 STL 实现(如旧版 GCC)采用了“写时拷贝”(copy-on-write)机制来优化 `string` 的拷贝性能。此时,拷贝操作仅共享底层指针,而非进行深拷贝。这就导致通过强制类型转换修改共享内存区的数据时,所有持有该指针的 `string` 对象都会受到影响。文章清晰对比了“写时拷贝”与“立即拷贝”(eager-copy)两种策略的差异与适用场景,并指出该 bug 因其延迟显现的特性而极难定位。 作者最终总结道,尽管将 `string` 作为临时缓冲区的写法在网络上屡见不鲜,但在“写时拷贝”的实现下,这种用法存在严重隐患。对于需要直接操作内存的场景,开发者应意识到 STL 容器的这些实现细节,或考虑使用更明确的缓冲区类型,以避免类似的陷阱。

本机暂存
IT 后端/ 2016-02-06 10:51:58 / 累计浏览 3,241

限流系统如何发现系统的热点

这篇讲的是如何利用限流系统的内部机制,来解决一个棘手的实际问题:如何在海量调用参数中,实时发现系统热点。 作者从热点的两个核心挑战出发:一是如何在海量参数中只保留最可能成为热点的记录,二是如何在分布式集群中高效汇总统计信息。文章的核心方案巧妙地结合了两种技术:用ConcurrentLinkedHashMap(一种LRU缓存结构)控制内存,仅保存近期访问量最高的参数;同时利用限流系统已有的动态滑动窗口算法,计算这些参数在短时间内的平滑QPS。 对于分布式统计,文章利用了限流系统自身暴露的QPS端口作为数据采集点,并通过多线程任务队列进行快速合并,使得在千台机器规模的集群上也能在数秒内获得结果。最终的性能数据表明,该方案在日常机器上可达到29万的吞吐量,内存消耗可控,有效解决了实时热点发现与系统性能之间的平衡问题。

本机暂存
IT DevOps/ 2016-02-06 10:51:29 / 累计浏览 1,821

弹性伸缩部署

业务快速发展时流量暴增导致超时限流,业务收缩期又闲置大量服务器——这篇讲的是如何用弹性伸缩让资源“活”起来。 作者从实际运维痛点切入,介绍了弹性伸缩中间件的设计逻辑。系统通过监控集群水位、CPU队列等指标自动决策扩容缩容,并提供了观察、自动、计划三种伸缩模式。其中自动伸缩给出了具体策略:比如设置集群水位超过40%且CPU负载持续升高2分钟时扩容,低于13%且空闲持续5分钟时缩容,期望水位控制在35%左右。 文章还拆解了弹性伸缩的运维架构,包含监控大盘、成本分析和自动化部署等模块,并通过架构图和流程图展示了计算资源的动态调度模型。对于大促等可预见高峰,则支持基于业务预估的计划伸缩。 整体方案旨在让无状态应用能根据负载自动伸缩机器,既应对流量洪峰又避免资源闲置,把运维同事从反复扩缩容中解放出来。

本机暂存
IT 后端/ 2016-02-06 10:45:18 / 累计浏览 5,874

osx平台上lol英雄联盟launcher启动器的分析实现

这篇讲的是,一位LOL玩家因为只有Mac电脑却玩不了国服、只能忍受外服高延迟,从而萌生了自己动手破解OSX客户端连接国服想法的技术实践。 作者通过对比分析发现,腾讯运营的国服与Riot运营的国际服在启动流程上存在关键差异:国服是先登录再选区,而国际服是先选区再登录。核心突破口就在于,国服的登录认证信息是作为CLI参数(如gameSignature)传递给LolClient.exe的。这意味着,只要能在OSX上模拟出这一自动登录过程,就有可能连上国服。 为实现这一点,作者在Windows上深入剖析了国服启动器(lol.launcher_tencent.exe)的进程行为。他发现该进程监听了本地8393等多个TCP端口,并通过抓包分析,明确了它与LolClient.exe之间的本地通信协议。整个分析过程从目录结构对比、启动参数截获,到进程树与本地通信的逆向,层层递进。 最终结论是,理论上只要在OSX上实现一个功能等价的Launcher,替代Windows版启动器的角色,就能驱动OSX版客户端完成国服登录并进入游戏。文章完整展示了一次从需求出发、通过逆向分析定位核心机制并得出可行方案的技术探索路径。

本机暂存
IT / 累计浏览 0

本机暂存
IT 数据库/ 2016-02-06 10:37:53 / 累计浏览 1,078

SLAVE为什么一直不动了

这篇讲的是MySQL复制延迟中一种“假死”现象的排查。作者从一次延迟超大(超过3小时)但SQL线程却“无事可做”的报警出发,展示了如何一步步定位。 初步检查显示,主从IO和SQL线程都在正常运行,但从`show slave status`看,Relay Log的执行位点(Exec_Master_Log_Pos)却纹丝不动。关键的突破点在于检查主库的Binlog内容。作者发现,从卡住的位点(294959)开始,整个事务是一个巨大的`DELETE`操作——它来自Bacula备份系统的自动清理任务,一次性删除过期数据,事务提交耗时超过2000秒,产生的Binlog数据量接近3.9G,几乎填满了整个Binlog文件。 根因就在于此:这个超大事务在主库执行完毕并生成Binlog后,从库需要将其“重放”一遍。由于事务过于庞大,应用这个DELETE操作本身就需要极长时间,导致复制位点看起来一直“卡住”。文章不仅点明了直接原因,还提醒了这类大事务的潜在危害:除了延迟,还可能长时间锁住数据行,引发连锁的锁等待。 对于通用应用,作者给出的解决方案很务实:在代码层面控制事务粒度,比如每删除几千条记录就提交一次,避免生成这种“一镜到底”的巨型事务。这比直接修改第三方软件的源码更可行。

本机暂存
IT 后端/ 2016-01-27 22:45:22 / 累计浏览 3,666

PHP7扩展开发之hello word

这篇讲的是如何从零开始构建一个PHP7扩展,并让PHP脚本调用其中的函数输出“hello word”。作者以最简功能为例,拆解了扩展开发的核心步骤:从使用 `ext_skel` 工具生成骨架代码,到修改 `config.m4` 配置文件启用扩展,再到编写 C 代码实现 `say` 函数并将其注册到PHP函数表中。 整个过程清晰展示了扩展从代码到加载的完整链条,尤其是 `config.m4` 中注释配置的选择,以及函数注册这一步骤,是理解PHP扩展工作原理的关键。文章最后给出了编译安装和测试验证的完整命令,并附上了源码下载,适合想动手实践PHP底层开发的读者按图索骥。

本机暂存
IT 前端/ 2016-01-27 22:44:11 / 累计浏览 2,062

充分发挥 JavaScript 语言的优势

作者从自身8年JavaScript开发经验出发,分享了如何从“将其视为辅助工具”到“真正发挥语言优势”的心得。他认为,随着Node.js和现代浏览器的发展,JavaScript已成为前端核心,但许多开发者仍未充分利用其特性。 文章聚焦于几个关键实践:利用“头等函数”实现简洁的函数式编程,掌握Array原生的map、reduce等方法来操作数据,以及拥抱ES6的箭头函数、解构等新语法让代码更直观。作者也强调了理解作用域、闭包和类型转换这些“绊脚石”的重要性,并建议谨慎使用class继承,转而以数据流和对象组合来思考程序结构。 对于有一定经验但感觉JavaScript“坑多”的开发者,这篇基于实战教训的总结,提供了从语言特性层面提升代码质量和效率的具体思路。

本机暂存
IT 移动开发/ 2016-01-27 22:41:02 / 累计浏览 1,571

Swift隐式解包 Optional

这篇讲的是 Swift 中 `ImplicitlyUnwrappedOptional`(隐式解包 Optional)的本质与使用权衡。 它指出,隐式解包 Optional(用 `!` 声明)在本质上与普通 Optional 完全相同,核心区别在于编译器会为其自动插入解包操作,允许你像访问非 Optional 类型一样直接访问其成员。这在代码书写上带来了便利,例如 `maybeObject.foo()` 无需手动加 `!`。 文章追溯了其历史成因:主要是为了在 Swift 早期,更方便地兼容和调用那些从 Objective-C 转换而来、且可能返回 `nil` 的 Cocoa API,作为一种“妥协方案”。不过,随着 Objective-C 引入 `nonnull`/`nullable` 等修饰符以及 Apple 对 Swift API 的不断完善,这种危险特性已大幅减少使用。 如今,最常见的场景仅限于 Interface Builder 连接的 `IBOutlet`。作者建议,在代码的其他部分应谨慎使用隐式解包 Optional,因为它并不意味着“变量一定有值”,而只是一种可能引发崩溃的便捷写法。对于绝大多数情况,使用 `if let` 进行 Optional Binding 是更安全的选择。

本机暂存
IT 前端/ 2016-01-27 22:40:02 / 累计浏览 1,565

CSS 的 22 个必备技巧

这篇讲的是那些能让你的CSS代码更优雅、效果更出彩的实用技巧。文章从现代浏览器开始支持的混合模式(mix-blend-mode)聊起,展示了如何像PS一样在网页上玩转图层混合效果。接着,它解决了“如何给边框加上渐变”这个常见需求,方法是通过一个负z-index的伪元素来巧妙实现。 你还会发现,原来z-index的值也能参与CSS过渡动画,让层级变化变得平滑;一个简单的currentColor关键字,就能让SVG图标和边框颜色自动跟随文字颜色变化,省去了大量重复定义的代码。对于图片显示难题,文章推荐用object-fit属性来替代背景图的background-size,实现更灵活的裁剪和缩放。 此外,文章还分享了如何用纯CSS为复选框和单选按钮打造自定义外观。整体来看,这些技巧都紧贴日常开发场景,代码示例清晰可复用,能帮助前端开发者快速提升页面表现力与代码效率。

本机暂存
IT 前端/ 2016-01-27 22:35:05 / 累计浏览 1,135

CSS font关键字属性值的简单研究

这篇讲的是CSS `font`属性中一个容易被忽略但很实用的特性——关键字属性值。我们平时用`font`多半是做缩写,比如`font: 14px simsun;`,但作者从这里出发,引出了另一种完全不同的用法:直接使用`caption`、`menu`、`status-bar`等系统关键字。 这两种方式有着根本区别。缩写至少要指定`font-size`和`font-family`,而关键字是独立的单一值,它直接映射到操作系统部件(如按钮、菜单、状态栏)所使用的字体。作者通过在Windows 7和iOS上对Chrome、Firefox、IE等浏览器的实测发现,虽然所有现代浏览器都支持规范内的这些关键字,但不同关键字在不同系统和浏览器中映射到的字体和字号存在明显差异。例如,同一个`caption`关键字,在Windows Chrome下可能是16px的微软雅黑,在iOS Safari下则可能是13px的另一种字体。文章也指出了非标准关键字(如`-moz-button`)兼容性较差,实际应用价值不大。 那么,这个特性有什么用?作者发现它最大的价值在于优雅地实现跨平台字体自适应。比如,我们希望在Windows下使用微软雅黑,而在iOS下使用系统默认的、更好看的字体,以前可能需要写浏览器判断或CSS hack。现在,只需在`body`上设置`font: menu;`或`font: status-bar;`,再补上统一的`font-size`即可。这样就让每个系统自动调用其最匹配的界面字体,代码简洁且兼容性有保障。

本机暂存
IT 移动开发/ 2016-01-27 22:33:27 / 累计浏览 1,975

Swift的多重 Optional

这篇技术博客聚焦于Swift语言中一个容易引起混淆的细节——多重Optional。作者从Optional本质是一个枚举类型(`enum Optional`)出发,指出它能够嵌套装入另一个Optional自身,形成了“盒中盒”的结构。 文章的核心对比在于两种对`String??`类型赋值nil的方式。一种是通过已有的Optional变量赋值(`var anotherNil: String?? = aNil`),另一种是直接对字面量nil赋值(`var literalNil: String?? = nil`)。虽然两者打印调试信息时都显示`nil`,但它们的内部结构不同:前者是“盒子中装着一个空盒子”,后者是“盒子中直接是空”。这种差异在使用`if let`进行解包时会显现出来——前者能成功进入代码块,后者则不能。 为解决调试时的困惑,作者推荐使用LLDB的`fr v -R`命令来查看变量的未加工内存布局,从而清晰分辨出`Some(None)`与`None`的区别。文章通过生动的比喻和具体的代码示例,揭示了这一语法陷阱的根源,为开发者在处理复杂Optional解包和调试时提供了明确的指引。

本机暂存
IT DevOps/ 2016-01-27 22:32:32 / 累计浏览 1,999

非侵入式监控PHP应用性能监控分析

这篇讲的是如何在不触碰业务代码的前提下,对PHP应用进行性能监控。作者从“非侵入”这个实际需求出发,给出了从易到难的两种可行路径。 对于基础的请求耗时监控,最简单的方式是分析Nginx日志。文章清晰解读了日志中两个关键字段的区别:`$request_time`是端到端的总耗时,而`$upstream_response_time`则精准反映后端PHP处理的耗时。只需关注后者,就能快速定位PHP服务本身的性能瓶颈。 如果要深入分析单个请求内部的性能热点,文章详细介绍了使用xhprof扩展的完整方案。它不仅提供了xhprof的安装与配置步骤,其亮点在于展示了一套“无侵入”的部署技巧:通过Nginx的`auto_prepend_file`或php.ini配置,让监控脚本自动加载,实现了对业务代码的零修改。同时,方案还内置了按URL和超时时间智能采样的逻辑,避免了全量监控带来的性能开销。 整篇文章从日志层面的快速概览,到代码执行层面的精准剖析,形成了一套层次分明的监控方法论,为PHP开发者提供了实用的性能分析工具箱。

本机暂存
IT 数据库/ 2016-01-27 00:01:32 / 累计浏览 4,400

微博分布式存储作业实现方法

这篇讲的是微博如何在单表60亿条数据的极端场景下,设计分布式存储系统。作者从新兵训练营的实际练习题出发,拆解了社交场景下“查最近微博”和“翻阅用户全部微博”两大核心访问需求,以及由此带来的扩展性、成本与高可用设计挑战。 文章详细讨论了基于用户ID(UID)的范围分片与哈希分片策略,并对比了各自的利弊。重点分享了如何通过“冷热数据分离”来平衡成本与性能:近期数据(如最近10天)采用UID结合权重哈希的方式,均匀分散高并发读取压力;历史数据则按时间维度(如半年)分库,便于管理与冷存储。针对复杂的分页跳转查询,还提出了增加二级索引表等具体的索引设计思路。 文中展示了多个投稿案例,包括一种通过ZooKeeper动态调整分片策略、以灵活应对流量突变的方案。整体思路清晰,从约束条件到具体技术选型层层递进,为处理超大规模社交数据的存储与查询提供了切实可行的架构参考。

本机暂存