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

最新文章

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

IT 移动开发/ 2019-04-09 00:33:19 / 累计浏览 2,718

USB 4:目前所知道的一切

这篇讲的是即将到来的下一代USB传输标准——USB 4。它并非简单迭代,而是带来三项核心变革:最高40Gbps的双通道速度、对Thunderbolt 3设备的广泛兼容,以及智能动态的带宽分配能力。 文章明确指出了其关键升级点:USB 4将彻底拥抱Type-C物理接口,并有望终结“速度与视频带宽互相挤占”的时代。例如,在同时输出4K视频与传输数据时,它能按需精准分配资源,避免性能浪费。作者也剖析了与Thunderbolt 3融合的现实前景,虽然并非所有厂商都必须实现,但行业预计将大规模支持,这将极大地降低高性能外接设备(如eGPU)的使用门槛。 此外,文章厘清了USB 4实际会存在10Gbps、20Gbps和40Gbps三档速度,并强制统一了USB供电标准。对于关心新标准具体落地影响的读者,这篇梳理了技术细节、兼容性现状与潜在限制的指南,提供了清晰的技术地图。

本机暂存
IT 安全/ 2019-04-09 00:29:49 / 累计浏览 3,446

IP团伙行为分析(更新中文版报告)

这篇讲的是绿盟科技首次以“IP团伙”为单位对DDoS攻击进行研究的报告。作者从一个新角度出发,将协作发起DDoS攻击的惯犯群体定义为“IP团伙”,并基于2017年以来的攻击数据,分析了如何识别这些团伙及其行为特征。 研究发现,这些团伙虽然只占攻击者总数的2%,却发起了约20%的攻击,且约20%的头部团伙对大部分攻击流量负责。在攻击方法上,反射型攻击(尤其是NTP反射)是团伙实施大流量攻击的首选。报告还揭示了一些反直觉的结论:团伙的攻击能力(如总流量、峰值带宽)与其成员规模并非简单正比,一个256人的团伙可能产生比大团伙更猛的攻击流量。 通过为团伙建立“画像”,研究旨在更精准地描述攻击者的行为模式、偏好与能力极限。这为网络安全防御提供了一个更聚焦的视角——不仅应对孤立事件,更能基于团伙历史行为来检测、缓解甚至预测未来的协同攻击。

本机暂存
IT 开发者/ 2019-04-09 00:25:32 / 累计浏览 2,027

代码不规范,同事两行泪,撸码七宗罪!

代码千万行,注释第一行;编程不规范,同事两行泪。这篇有趣的文章从技术圈广为流传的吐槽段子出发,直指协作中最令人头疼的痛点。 作者梳理了编程世界里的“七宗罪”,将那些看似不起眼、却会累积成“技术债”或团队矛盾的坏习惯一一列出。比如协作时拒绝使用版本控制,让代码合并变成一场噩梦;用 a、b、c 给变量命名,在大型项目中让人抓狂;盲目增加依赖库,甚至不经测试就升级核心组件(比如 React),可能直接引发连锁反应。文章还点名批评了不一致的代码格式、逃避错误处理(尤其要当心空指针),以及在复杂场景下选用不当的数据类型等常见问题。 这些“罪”之所以普遍,正因为它们常常被忽视。文章用生动的比喻和具体例子,提醒我们:代码的可读性与健壮性,往往就藏在这些细节里。遵守规范不仅是为了他人,更是为了一年后的自己不被自己写的代码“气哭”。

本机暂存
IT 前端/ 2019-04-09 00:20:48 / 累计浏览 2,723

Rax 系列教程(native 扫盲)

这篇文章面向前端开发者,讲清楚了 Rax 在 native 端到底是什么,以及它和 React Native、Weex 这两个常见框架的核心区别。作者从“Rax = RN 语法 + Weex 能力”这个公式切入,指出 Rax 吸收了 React Native “一次学习”的开发体验,同时依托 Weex 实现了“一次编写,多端运行”的跨端目标。 文章重点拆解了 Weex 这个“幕后工作者”的运作机制。它详细解释了 Weex 从 DSL 代码到原生渲染的流程,包括 JS Framework 如何作为 JS 与 Native 通信的桥梁,以及 Weex 的 virtual-DOM 如何在简化传统 DOM 后高效控制原生视图。这些讲解剥离了复杂的客户端概念,专为前端同学理解而设计。 对于想上手的开发者,文章特别点明了 Weex 与 Web 的“天生不同”:布局上只有 Flexbox,样式不支持继承和许多 CSS 特效,单位处理也存在差异。这些细节直接关系到日常编码的取舍,比如为什么不能随意用 float 或 absolute 定位。 总之,这篇文章帮前端同学快速扫清了 Rax 背后的 native 知识盲区,理解框架的设计权衡,能更顺畅地处理跨端开发中遇到的差异问题。

本机暂存
IT 后端/ 2019-04-08 00:59:05 / 累计浏览 2,209

[译]Go开发中一些有用的模式

作者从使用VB、Java、C#和Python转向Go开发的视角出发,分享了在Go中实现几个经典设计模式的独特方式。文章的核心在于对比:与许多语言依赖注解(Annotation)实现装饰器不同,Go通过函数包装和接口适配来增强功能,使控制流更显式,避免了隐藏的配置陷阱。对于单例模式,Go利用`sync.Once`优雅地解决了其他语言中常见的并发初始化安全与性能问题,甚至结合装饰器模式将不安全的API包装成线程安全版本。此外,文章还介绍了用类型方法实现“静态成员”的技巧,以及如何用带缓冲的channel轻量级模拟信号量。这些示例不仅展示了Go的语法特性,更体现了其通过组合和并发原语来构建清晰、安全代码的哲学,对习惯其他语言范式的开发者很有启发。

本机暂存
IT 前端/ 2019-04-08 00:55:55 / 累计浏览 2,090

Javascript创建对象方式总结

这篇文章梳理了在JavaScript中创建对象的多种常见方式,从基础到进阶,覆盖了不同场景下的选择。作者从最简单的对象字面值讲起,逐步介绍了使用new关键字(包括内建和自定义构造函数)、原型方法、Object.create()、Object.assign()以及ES6的class等不同途径。 核心对比在于各方法的实现原理与适用性:对象字面值最为直接快捷;使用new和构造函数(或ES6类)能更结构化地创建多个相似实例,并涉及原型链绑定;Object.create()允许基于现有对象创建新对象,便于实现原型继承;Object.assign()则擅长合并多个源对象的属性,生成新对象。文章也提及了单例模式这种特殊用法。 对于初学者,掌握字面值和构造函数是关键;理解原型与Object.create()有助于深入对象模型;而在需要组合或扩展已有对象时,Object.assign()提供了便利。ES6的class语法糖则让基于类的写法更贴近传统面向对象语言的习惯。整体而言,文章系统梳理了这些方式的异同,为根据项目需求选择合适的对象创建模式提供了清晰参考。

本机暂存
IT 数据库/ 2019-04-08 00:54:00 / 累计浏览 1,598

MGR监控及优化点

这篇从实战角度出发,详细梳理了MySQL Group Replication(MGR)在日常运维中需要关注的核心监控指标与性能调优参数。文章开篇指出了MGR官方文档在监控优化方面资料较少的现状,因此作者结合自身教学经验进行了系统总结。 内容主要分为两大块。监控部分,不仅列出了判断节点状态(是否Online、是否可写)的SQL语句,更深入讲解了如何量化复制延迟(通过对比GTID)以及检查节点执行队列堆积情况。对于MGR特有的“流控”机制,文章解释了其触发条件(默认在延迟达25000个GTID时Block写操作),并给出了关闭流控的建议与注意事项,特别提到在多IDC部署时推荐关闭。 优化部分则直指复制性能的瓶颈,给出了具体的参数调整建议,例如将复制并行类型改为LOGICAL_CLOCK、增加并行线程数,以及针对大事务场景调整压缩阈值以减少CPU消耗。这些调优点都紧扣MGR基于逻辑重放的本质。 总的来说,这篇文章并非泛泛而谈,而是提供了许多即查即用的监控命令与可落地的优化参数,对需要实际运维或深入理解MGR性能机制的技术人员来说,是一份很好的实践参考。

本机暂存
IT 后端/ 2019-03-28 22:28:54 / 累计浏览 2,715

重要的事情说三遍:ARQ协议

这篇讲的是作者从一个实际的网络难题出发,引出了ARQ(自动重传请求)协议这一关键概念。他家里的阿里云服务在公司访问异常,最后通过在家庭服务器和云服务器间建立可靠的“隧道”解决了问题,而这条隧道的核心就是ARQ。 文章随后像剥洋葱一样,清晰地解释了ARQ的精髓:它本质是一种在不可靠网络上实现可靠传输的错误控制策略,核心在于“确认”与“超时”机制,就像重要的事情没听清就要再说一遍。作者不仅给出了定义,更生动地对比了三种主流实现策略:最基础但低效的“停止并等待”、TCP所采用的“后退N帧”,以及更智能高效的“选择性重发”,把它们各自的原理和优劣讲得明明白白。 理解ARQ,不仅有助于我们看懂日常使用的TCP/IP协议背后的机制,也为在复杂网络环境下设计可靠的服务提供了思路。

本机暂存
IT 移动开发/ 2019-03-28 22:20:17 / 累计浏览 1,757

react-native-navigation 简单分析和跨页跳转

这篇讲的是作者在实际项目中使用React Native官方推荐的导航库react-native-navigation时,所遭遇的一系列痛点及其深度解析。文章并非泛泛而谈,而是直指该库的核心设计——一套独立于RN生命周期的事件机制与页面堆栈模型,并剖析了由此引发的问题。 作者重点分析了其“push不销毁当前页”的机制,这虽可能出于性能考虑,却为独占系统资源(如相机、麦克风)的组件埋下了隐患。由于资源不会在路由切换时自动释放,可能引发后续页面无法正常初始化资源的严重问题。文章对此提出了利用Modal Stack或调整交互顺序的解决思路。 更具实践价值的是,文章还探讨了如何“绕过”该库的串行栈限制,实现产品要求的跨页跳转。作者提供了两种具体的技术方案:一种是利用`willAppear`和`didDisappear`生命周期配合状态控制,实现“跳过”中间页的视觉假象;另一种则是通过`props`回调在父子页面间传递指令,巧妙地实现了“接力pop”,从而达到跨页返回的目的。这些技巧展现了在框架限制下寻找灵活解决方案的工程智慧。

本机暂存
IT 安全/ 2019-03-27 21:16:21 / 累计浏览 2,072

手机 APP 应该选用哪个加密算法 - 兼吐槽 TEA

这篇文章从手机APP防协议分析的实际需求出发,探讨对称加密算法的选型,并特别“吐槽”了国内开发者圈对TEA算法的盲目推崇。作者通过分析指出,TEA算法的安全性存疑,且其“速度快”的印象已是过时的陈旧观念。 文章的核心论点在于,在现代硬件环境下,AES算法凭借原生指令集支持,其性能已远超TEA。为了佐证,作者亲自编写代码,在骁龙835、联发科Helio P10以及苹果A8等多款典型手机处理器上进行了详细测试。数据清晰地显示,即使是在中低端CPU上,AES的加密速度也能达到TEA的数十倍。 结论非常明确:对于绝大多数APP开发场景,无论是在Android上使用Java,还是在iOS上使用Objective-C/Swift,AES都应当是首选的对称加密算法,它能同时提供最优的安全性和性能。文章为开发者提供了一个基于实测数据的、非常扎实的算法选型参考。

本机暂存
IT 后端/ 2019-03-26 22:21:59 / 累计浏览 2,356

ABTest 平台设计 - 如何进行流量分桶

这篇讲的是ABTest平台设计中的一个核心难题:如何科学地进行用户流量分桶。作者从实践中常见的错误切入——比如简单用UserID取模或手机尾号分桶,指出这种做法虽看似随机,但在长期、多实验场景下会导致实验间相互干扰、用户群体行为产生偏差,且流量利用率极低。 文章的核心方案是介绍业界主流的“可重叠分层分桶”方法。其关键思路是将流量划分为多个逻辑层(如UI层、算法层),在每一层内使用不同的哈希函数(以层信息作为Seed)对用户ID进行分桶,从而确保各层之间的流量正交,互不影响。这样一来,一份流量可以同时参与多个层的不同实验,极大提升了迭代效率。作者还提到了适用于海量并行实验的“无限分层”思路,以及这对组织协调能力提出的更高要求。 对于想设计或优化自己实验平台的技术团队,这篇文章从错误案例到系统方案,梳理得相当清晰,文末也附上了Google相关的经典论文供深入研究。

本机暂存
IT 后端/ 2019-03-26 22:21:54 / 累计浏览 2,980

ABTest 平台设计 - 如何进行流量分桶

这篇讲的是ABTest平台设计中一个看似简单却容易踩坑的环节:如何进行用户分桶。作者从很多初创公司常见的错误做法——直接用UserID取模分桶——出发,点明了这种看似随机的方法在长期、交叉实验场景下会导致流量利用率低、实验结果互相干扰以及桶间用户行为产生偏差的三大问题。 为了解决这些痛点,文章引出了业界主流的解决方案:可重叠的分层分桶方法。核心思路是将流量划分为多个逻辑层(如UI层、算法层),在每层内使用不同的随机算法(如Hash(Layer, Tag) % 1000)进行正交分桶。这样,同一份流量可以同时穿过多个实验层而互不干扰,极大提升了实验效率。文章还对比了适用于大公司的“无限分层”探索,指出其对组织管理和数据能力的更高要求。 作者最后提到了Google相关论文作为延伸,并预告下一篇将讨论实验开关与信息传递,为搭建完整的ABTest平台提供了清晰的脉络参考。

本机暂存
IT 前端/ 2019-03-26 22:18:33 / 累计浏览 1,468

Atag - Web Components 最佳实践

这篇讲的是作者基于在淘宝小程序基础组件 Atag 中的实践,总结了 Web Components 的开发经验与避坑指南。文章从 Web Components 的核心优势切入——它由 W3C 标准驱动,具备可重用、封装性好且无框架“传染性”的特点,因此非常适合用于开发底层基础组件。 作者详细分享了几个关键的实战要点。在基础设施方面,强调了 polyfill 库 `webcomponentsjs` 和 Polymer 3 的选型与使用建议。在构建配置上,他点出了一个经典陷阱:Babel 将 ES6 class 转译为 ES5 时会导致自定义元素注册失败,并提供了解决方案。兼容性分析显示,在移动端通过 polyfill 可覆盖绝大多数用户。 文章还提供了直接的性能对比数据。在渲染 1 万个组件的场景下,原生 Web Components 的表现显著优于 React,而 Polymer 在注册阶段虽略有开销,但其开发便利性带来的整体收益依然很高。这些基于具体数据和踩坑经验的总结,对于考虑使用 Web Components 构建可复用组件的开发者来说,有很强的参考价值。

本机暂存
IT 后端/ 2019-03-26 09:52:05 / 累计浏览 2,180

折腾 Python logging 的一些记录

这篇讲的是 Python logging 模块的深度“折腾”与实战技巧。作者从 logging 的官方流程图和源码出发,清晰地拆解了从日志请求发出,到经过 Logger、Filter、Handler 层层处理,最终格式化输出的完整链路。 文章的亮点在于,它没有停留在理论层面,而是基于对这套机制的理解,分享了如何巧妙地扩展功能。比如,利用 Filter 不仅能过滤还能**改写** LogRecord 的特性,为日志添加了项目相对路径(`relpath`)。文章也指出了配置中的一个“坑”:自定义 Filter 无法通过 `fileConfig` 文件配置,必须使用 `dictConfig` 或 Python 字典。 更进一步,作者将这套扩展思路应用到了实际工程中。通过 Filter 动态地向 LogRecord 注入上下文,成功地为 Flask 请求和 Celery 任务日志串联上了关键的 `request_id` 和 `task_id`。文章还提到了用装饰器自动记录函数调用参数与返回值,并处理了其中容易出错的日志定位问题。 整体而言,这不仅是一次对 logging 内部机制的剖析,更是一份如何将其“驯服”并服务于复杂应用场景的实践指南,对想深入理解或定制 Python 日志系统的开发者很有启发。

本机暂存
IT 后端/ 2019-03-26 09:50:55 / 累计浏览 2,146

管理 Node.js 进程从未如此优雅

这篇讲的是 Node.js 进程管理长期存在的痛点,以及团队如何通过开发 Pandora.js 来提供一个更优雅的解决方案。 文章从传统 Cluster 或 Master/Worker 模型在实际应用中的局限性说起:增减进程困难、进程间通信复杂、定时任务可能拖垮主服务,更深层的问题是进程模型与框架绑定过深,限制了 Node.js 应用的扩展性(比如难以同时处理 Web 和 RPC 服务)。为了解决这些“修修补补”带来的窘境,团队推出了 Pandora.js。 其核心思路是引入一个名为 `procfile.js` 的进程结构定义文件,通过简单的代码(如 `pandora.fork('processA', './app.js')`)来声明进程,而将底层的创建、通信和伸缩交由框架自动处理。例如,通过 `scale(5)` 这样的属性就能自动完成 Cluster 模式的进程扩展,开发者无需关心具体实现。除了管理进程,Pandora.js 还提供了守护、日志切割、监控指标采集等一整套能力,为构建更健壮、可观测的 Node.js 应用打下了基础。 文章最后提到,这只是介绍 Pandora.js 的开始,后续还将分享其在监控、追踪和可视化 Dashboard 等方面的实践。

本机暂存
IT 后端/ 2019-03-26 09:48:04 / 累计浏览 2,262

一位资深Java的阿里系公司实战面试经验,套路还是面试官的多

这是一篇阿里系Java工程师的实战面试复盘。作者以亲历者视角,详细还原了从项目经验到技术基础的多轮面试场景,生动展现了面试官如何通过层层追问,考察候选人的知识深度和临场应变能力。 文章的核心亮点在于“场景还原”与“答题策略”。在项目经验环节,作者以Netty线程模型为例,演示了如何将问题引导至自己熟悉的领域,并分享了如何描述项目难点(如业务逻辑阻塞Work线程导致QPS上不去)及解决方案。在基础知识考察部分,以线程池原理和锁机制(Synchronized/ReentrantLock/CAS)为例,揭示了面试官常见的问题链——例如从线程池核心参数一路追问到“秒杀”场景下的线程池配置,或是从CAS原理深挖到其操作系统指令实现及ABA问题。 文章并非单纯罗列知识点,而是通过真实的对话片段,点明了一个关键:面试的“套路”实则是考察思维逻辑与知识内化程度。作者提醒,即便面对不记得的细节或不了解的领域(如读写锁),诚实沟通比硬撑更重要。对于正在准备技术面试的读者而言,这篇复盘的价值在于揭示了面试背后的考察逻辑,并提供了如何梳理项目故事、应对深度追问的实用思路。

本机暂存
IT 算法/ 2019-03-25 23:35:42 / 累计浏览 2,134

阿里面试题:为什么Map桶中个数超过8才转为红黑树

这篇讲的是一个经典的Java面试题:为什么HashMap的桶中链表长度达到8才转为红黑树?作者从一个好友的阿里面试经历切入,直接打开了源码中的注释,发现它只记录了阈值,却未解释原因。 文章的核心在于对源码“Implementation notes”的深入解读。作者指出,红黑树节点占用的空间是普通节点的两倍,因此转换是一种空间与时间的权衡。更关键的是,文章引用了源码中一段关于泊松分布的注释:在随机哈希算法下,桶中节点数量遵循特定的概率分布,链表长度达到8的概率极低(仅约千万分之六)。这从统计学角度证明了阈值8的选取并非随意,而是经过严谨计算的。 此外,文章也驳斥了一种常见但不够严谨的“性能对比”解释,强调了设计背后的科学性。通过剖析源码与概率模型,这篇文章将一个常见面试考点还原成了其严谨的设计思想,适合所有想理解Java集合框架底层优化的开发者。

本机暂存
IT 后端/ 2019-03-25 23:34:37 / 累计浏览 2,510

从php源码分析mkdir()函数

这篇讲的是PHP中`mkdir()`函数为何在不同环境下会出现诡异的行为差异。作者从一次WordPress漏洞分析中遇到的疑惑出发,发现当`recursive`参数为`false`或`true`时,函数在Windows+NTS(非线程安全)环境下能成功穿越目录创建文件夹,但在其他配置下却会失败。 为了彻底搞清楚,作者重新编译了PHP进行调试,对比了PHP 7.2.16的TS(线程安全)和NTS版本。测试结果揭示了一个关键规律:只有在非线程安全(NTS)版本且`recursive=false`时,`mkdir()`才能成功创建目录。 深入源码后,文章揭示了这背后是PHP内核的线程安全(TS)与非线程安全(NTS)机制在起作用,导致了函数内部对参数的处理逻辑产生分支。这不仅仅是一个简单的函数使用问题,更引出了理解PHP运行模式重要性的线索。文章从具体现象切入,通过编译调试和源码追踪,最终将问题落脚到了语言运行时的核心机制上。

本机暂存
IT DevOps/ 2019-03-25 23:30:48 / 累计浏览 2,438

在 Linux 中运行特定命令而无需 sudo 密码

这篇讲的是如何在自动化运维场景中,为特定Linux用户开放免密执行sudo命令的权限。作者从一个实际问题出发:在AWS的Ubuntu服务器上,需要一个每分钟运行的脚本来检查并自动重启某个服务,但执行启动命令必须使用sudo权限,而交互式输入密码与自动化目标冲突。 文章的核心方案是通过编辑`/etc/sudoers`文件,使用`visudo`工具安全地为指定用户(如`sk`)添加一条规则,例如`sk ALL=NOPASSWD:/bin/mkdir`。这样,该用户执行这条特定命令时便无需输入密码。作者详细演示了如何为命令添加多个以逗号分隔的权限项(如同时为`mkdir`、`chmod`和`apt`命令授权),并特别强调了必须使用命令的绝对路径(可通过`whereis`命令查找)。 此外,文章还介绍了如何混合配置免密和需密命令(如在配置行中加入`PASSWD:`前缀来指定需要密码的命令),以及如何撤销这些权限。最后,作者给出了重要的安全警告:免密码执行sudo命令是一把双刃剑,配置不当(例如为`rm`命令开放权限)可能导致数据误删等严重后果,使用时务必谨慎。整篇文章提供了一个清晰、可操作的自动化运维技巧,同时也强调了安全边界。

本机暂存
IT 数据库/ 2019-03-25 23:29:04 / 累计浏览 1,911

删库跑路救命策略

这篇文章从作者亲身经历的“血泪教训”出发:休假期间因备份脚本的字符集设置错误,导致数据回滚失败,最终背锅降绩效。基于这次事故,作者系统梳理了MySQL误删数据的常见“坑”、预防措施以及紧急恢复方案。 预防篇提出了五条实用建议,比如将 `rm` 改为 `mv`、删除对象先 `rename` 归档、操作前善用事务与小批量验证等,核心在于培养操作习惯并保持敬畏之心。恢复篇则针对误删库表、物理文件被删、未提交事务的 `delete` 等不同场景,给出了从“立刻 kill 进程”到利用 `innodb_force_recovery` 启动恢复模式等具体的急救步骤。 文章结尾强调,无论平台如何发展,物理与逻辑备份都是不可替代的底线。这篇分享将事故复盘与实战经验结合,对所有涉及数据库操作的人员都是一次生动的安全警示。

本机暂存