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

最新文章

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

IT 后端/ 2016-03-21 14:07:28 / 累计浏览 2,127

探究 Node.js 中的 drain 事件

这篇讲的是 Node.js 中一个容易被忽视的事件——`drain`,作者从自己频繁看到却不知其所以然的使用场景出发,带着“什么时候触发”和“能用来干嘛”的疑问,进行了一番探究。 核心发现直指 `socket.write` 的返回值与底层“高水位线”(`highWaterMark`,默认 16KB)的关系:只有当写入的数据量累积超过这个阈值,`write` 才会返回 `false`,并在缓冲区被清空后触发 `drain` 事件。这解释了为什么简单的数据写入或高并发但数据处理极快的场景下,事件往往不会出现。 作者通过传输大文件的 HTTP 服务器实验,成功复现了事件触发,并揭示了它的核心作用——**用于实现流量控制,避免内存无限增长**。最佳实践是:当 `write` 返回 `false` 时暂停读取或生产数据的流,在 `drain` 事件触发后恢复,从而根据消费速度反向调节生产速度。 文章最后通过内存监控数据的对比,直观地验证了这种流控制策略在防止内存泄漏方面的必要性和有效性。

本机暂存
IT 数据库/ 2016-03-21 13:56:01 / 累计浏览 2,898

获取 MySQL 崩溃时的 core file

这篇讲的是如何让 MySQL 在崩溃时可靠地生成 core file 用于调试。文章作者从一个常见痛点切入:即使运维人员设置了 `ulimit -c unlimited` 并且在配置中开启了 `core-file`,mysqld 在实际 crash 时可能还是不会留下核心转储文件,给故障排查带来很大障碍。 作者点明了问题的关键在于几个容易被忽略的 Linux 系统参数。因为 MySQL 进程通常以 suid 方式运行,系统默认禁止为这类进程生成 core 文件,所以需要将 `/proc/sys/fs/suid_dumpable` 的值设为 2。此外,还需要确保 `core_pattern` 指向一个明确的、有写入权限的绝对路径(例如 `/var/crash/core`),并启用 `core_uses_pid` 以方便识别。 文章没有停留在理论,而是直接给出了一套可执行的修改命令和验证方法:通过 `kill -SEGV` 主动触发崩溃,然后检查目标路径。这套从问题定位、原因剖析到具体操作验证的完整思路,对于需要处理 MySQL 底层故障的开发者和 DBA 来说非常实用。按这个流程配置并验证,就能确保获得崩溃时的诊断数据。

本机暂存
IT 后端/ 2016-03-21 13:46:42 / 累计浏览 2,533

WordPress 插件工作原理剖析

这篇文章从一个资深开发者的视角出发,剖析了 WordPress 插件系统背后精巧的实现逻辑。作者首先拆解了插件的发现与管理过程:系统通过扫描特定目录并解析文件头部的注释块来获取插件列表和描述信息。 文章的核心在于揭示插件的“激活”与“工作”机制。它并非简单地将代码塞进系统,而是依托一套优雅的“钩子(Hook)”与“事件(Action)”体系。每个启用的插件在页面加载时都会被包含进来,并利用 `add_action` 等函数将自身功能注册到系统预定义的扩展点(如 `admin_head`、`publish_post`)上。当系统执行到对应环节时(通过 `do_action` 触发),便会调用所有已挂接的插件函数。 这种类似“插销”与“插座”的设计,使得功能扩展变得异常灵活且低侵入。无论是后台界面输出一段文字,还是添加一个管理菜单,插件只需关注自己要挂接的事件,无需修改核心代码。正是这种开放且规范的插件架构,成为了 WordPress 生态能够蓬勃发展的重要基石。

本机暂存
IT 安全/ 2016-03-21 13:41:44 / 累计浏览 1,127

Linux的chattr与lsattr命令

这篇讲的是Linux系统运维中容易被忽略但极其重要的底层属性控制工具——chattr与lsattr。作者开篇就点明,与常见的chmod命令仅管理读写执行权限不同,chattr能在更底层的文件系统层面施加保护,这对保障服务器日志和核心配置文件的安全至关重要。 文章聚焦于两个最实用的参数:“a”(仅允许追加)和“i”(完全不可变)。作者通过具体场景阐释其价值:用`chattr +a`锁定日志文件,确保记录只增不删;用`chattr +i`保护系统配置文件如resolv.conf,使其无法被移动、修改或删除,从而防范误操作或攻击。这些设置甚至能解决实际故障——文中就演示了当passwd/shadow文件被意外设置i属性导致root密码修改失败时,如何用chattr解除限制再恢复安全状态。 核心在于,这些底层属性需由root用户显式设置,权限极高。理解它们,相当于为关键文件上了把“系统级”的锁,是构建纵深防御的实用一课。

本机暂存
IT AI/ 2016-03-21 12:11:45 / 累计浏览 2,528

协同过滤 Collaborative Filtering

这篇从推荐系统的“长尾现象”切入,解释了协同过滤算法为何诞生以及它的核心价值:在有限展示空间里,帮用户发现自己可能感兴趣的小众内容,从而释放长尾的商业潜力。 作者首先点出协同过滤最基础的假设——“人有感兴趣的领域”,并由此推论出两条关键逻辑:同时被一个人喜欢的两个事物可能类型不同,而同时被很多人喜欢的两个事物则可能类型相同。基于此,文章逐步拆解了算法的数学模型:如何用余弦相似度量化物品关联度,如何通过加权降低热门物品的干扰,最终计算出用户对未接触内容的偏好预测值。 文章没有停留在理论,还坦诚讨论了算法的优缺点:它实现简单、适用性广、效果稳定,但也面临冷启动、数据稀疏等实际挑战,并指出需要针对具体业务进行二次过滤与优化。 整篇文章就像一位工程师在分享实践经验,从背景假设到公式推导,再到利弊分析,把一个经典算法讲得既清晰又接地气。对于想了解推荐系统入门逻辑的读者,这是一篇扎实的起点。

本机暂存
IT 算法/ 2016-03-21 12:10:57 / 累计浏览 2,304

跳跃表

这篇讲的是从Redis底层实现引出的跳跃表数据结构。作者从结构图入手,说明它本质是多层链表的组合,底层S0存储有序数据,上层作为索引加速查找。查找时从顶层向下逐层扫描,插入时则通过随机概率P决定新节点能“跳”到多高,从而在期望O(logn)时间内完成操作。 文章展示了一组实验数据,对比了不同P值(如1/2、1/e)对平均操作时间、列高和跳跃次数的影响,直观体现了参数选择的权衡。最后,作者引用了Redis作者antirez的观点,点出跳跃表相比平衡树的核心优势:内存占用可控、对范围查询(ZRANGE)友好、实现与调试更简单。文末也补充说明,这种简单高效的特性使其同样适合算法竞赛场景。

本机暂存
IT 前端/ 2016-03-21 00:25:19 / 累计浏览 1,861

Ballade: 重新诠释 Flux 架构

这篇文章探讨了如何解决 Flux 在实际应用中遇到的一些痛点。作者首先指出了 Flux 的核心价值:作为一种单向数据流架构模式,它能有效解耦视图与数据。但与此同时,当 Flux 被直接作为框架使用时,其 Actions 和 Store Callbacks 的设计在实践中暴露出代码冗余、职责划分不够清晰等问题。 为此,作者开发了 Ballade 框架。它在保留 Flux 核心模式的同时,做了几项关键改进:强化了 Store 作为数据存储中心的“访问器”功能,并区分了可变与不可变数据结构;引入了 Actions Middleware 这一中间件层,将诸如异步数据获取等通用逻辑从 Action 中剥离,集中处理,这借鉴了 Redux 的思想但更贴合 Flux 的模式;同时,它简化了 Store Callbacks 的写法,让数据更新逻辑更清晰、封装性更强。 通过代码对比可以看出,Ballade 使得 Action 的定义更简洁,数据流的路径(Action -> Middleware -> Dispatcher -> Store Callback)也更具约束性。这篇文章的价值在于,它不仅提出了一个改进方案,更清晰地阐述了在 Flux 哲学下,如何通过增强约束和职责分离,让架构变得更清晰、更易维护。

本机暂存
IT 前端/ 2016-03-21 00:24:38 / 累计浏览 3,280

React 高效开发环境的搭建

这篇文章从React初学者常见的Hello World示例切入,指出在浏览器中直接编译JSX的初级方式仅适用于简单应用。作者随后直指核心痛点:在模块化开发大项目时,这种依赖浏览器端实时编译的方式显得复杂且性能低下。为此,文章系统地讲解了如何使用Gulp、Browserify、Babelify等现代前端工具链,在本地环境中搭建一个高效的React开发环境。重点包括:利用Browserify实现实时模块合并与打包,通过Babelify完成JSX及ES6/ES7语法的转译以兼容主流浏览器,并配置Gulp-Connect搭建支持Livereload的本地服务器,实现文件保存后浏览器自动刷新。整篇文章通过具体的目录结构示例和关键任务代码,清晰地展示了从手动到自动化构建的实践路径,最终构建出的环境能流畅支持组件化开发与现代JavaScript语法。

本机暂存
IT 算法/ 2016-03-20 22:18:59 / 累计浏览 2,663

从Java和JavaScript来学习Haskell和Groovy(类型系统)

这篇技术文章从Java和JavaScript的类型系统出发,对比分析了Haskell和Groovy在类型设计上的核心差异。作者首先厘清了动态类型与静态类型、强类型与弱类型、类型推导等基础概念,并逐一拆解了四种语言的类型特性:Java是典型的静态强类型加显式指定,JavaScript则以动态弱类型和类型推导为主,Groovy提供了双模式——既能通过def实现动态推断,也能用显式类型转向静态检查,而Haskell则以静态强类型和类型推导体现了函数式语言的严谨性。 文章进一步深入到数据类型和函数行为的细节对比。例如,JavaScript中instanceof和typeof的混乱结果、Groovy的flow typing如何在运行时根据赋值推断类型,以及Haskell如何通过类型系统保障不变性。这些具体代码示例生动展示了语言设计背后的哲学:动态语言偏向灵活性,静态语言强调安全性。通过这样的跨语言比较,读者能更直观地理解不同类型系统的适用场景,比如Groovy如何在兼容Java的同时融入函数式特性,而Haskell又如何通过纯类型系统避免运行时错误。

本机暂存
IT 后端/ 2016-03-20 22:17:59 / 累计浏览 2,943

从Java和JavaScript来学习Haskell和Groovy(引子)

这篇讲的是作者如何打破两个根深蒂固的编程学习误区。他犀利地指出,“语言不重要”和“设计模式万能”这类观点在广义上是误导人的,尤其强调了编程语言绝不仅仅是语法工具,更是其背后范式与思维方式的载体。 作者以自身Java(静态)与JavaScript(动态)的背景为例,提出了一个清晰的学习路径:通过类比已知语言,来深刻理解新的编程范式。他瞄准了两个代表性目标:一是Groovy,为了探索动态语言强大的元编程能力;二是Haskell,为了领略纯粹函数式编程的严谨与独特魅力,比如模式匹配带来的优雅。 文章的后续计划也很明确,将从类型系统、元编程机制等维度,对这四门语言进行特性的横向比较。这种从熟悉到陌生、带着问题对比学习的方法,为想拓宽语言视野的开发者提供了一个扎实的起点。

本机暂存
IT 数据库/ 2016-03-20 22:15:56 / 累计浏览 2,870

MySQL如何将两个表名对调

这篇文章解决的是一个在数据库迁移或结构变更中可能遇到的棘手问题:如何在不停服或最小化影响的情况下,安全地对调两个MySQL表的名称。作者从类似`pt-osc`工具的操作场景切入,指出了许多人的第一反应——先后执行两次`RENAME`——其实存在数据写入失败的风险。 核心方案其实非常精巧且直接:利用MySQL的表级锁机制,一次性将两个表都锁定为写模式,然后通过一条临时表(`t3`)作为中转,用连续的`ALTER TABLE ... RENAME`语句完成对调。操作完成后解锁,整个过程对应用层是原子的,不会出现中间状态的脏数据。 这种“同时上锁、中转对调”的方法,用最基础的SQL命令优雅地解决了一致性问题。文章的价值不仅在于提供了一段可直接复用的代码,更在于它提醒我们:在对关键数据表进行重命名这类元数据操作时,思考操作的原子性和并发影响,是保证业务安全的基础。

本机暂存
IT 后端/ 2016-03-20 22:02:49 / 累计浏览 3,646

分布式系统设计系列 -- 基本原理及高可用策略

这篇从分布式系统的基本构成讲起,将其拆解为节点、网络、存储三元组,并探讨了节点状态(有状态与无状态)及系统异常的基本分类。文章的核心在于剖析分布式环境与单节点系统的关键差异:例如,一次write()调用并不能保证对端成功接收数据;TCP协议虽可靠,但双方无法同时确认消息送达,这引出了经典的“拜占庭将军”问题。开发者必须面对多出的“超时”等第三种不可控状态,并将各种故障视为常态而非偶然。 在此基础上,文章重点解读了分布式系统的经典CAP理论(一致性、可用性、分区容忍性),阐明了强一致性与弱一致性的具体应用场景与权衡。最后,文章开始介绍应对这些挑战的设计策略,比如通过重试机制处理暂时性故障。对于希望构建健壮分布式系统的工程师而言,理解这些无法绕开的底层原理与固有约束,是进行可靠架构设计的第一步。

本机暂存
IT 后端/ 2016-03-20 21:57:39 / 累计浏览 3,039

ZooKeeper编程指导

这篇讲的是 ZooKeeper 这个分布式协调服务的编程实战指南。作者从分布式应用开发者的角度出发,将 ZooKeeper 的核心概念与实际操作紧密结合,提供了一份从入门到避坑的完整路线图。 文章前半部分重点梳理了关键概念:比如类似文件系统的分层数据模型,以及其中每个“znode”节点可以携带数据和监听器(Watches)的特性;会话的生命周期管理,包括超时与断线重连的机制;还有确保分布式一致性的基础。这部分为理解 ZooKeeper 如何工作打下了必要的理论基础。 后半部分则深入实际编程场景,覆盖了客户端操作指南、常用语言绑定,以及简单的程序结构示例。特别值得一提的是,文章专门总结了“陷阱:常见问题和故障排查”,将分布式系统中常见的“羊群效应”、会话过期处理等难题和盘托出,实用性很强。 无论你是想了解 ZooKeeper 如何通过临时节点、顺序节点实现分布式锁、队列等协调服务,还是需要在生产环境中规避网络分区、会话管理带来的风险,这篇文章都从原理到细节给出了扎实的指引,是扎实理解并用好 ZooKeeper 不可多得的参考资料。

本机暂存
IT DevOps/ 2016-03-20 21:56:35 / 累计浏览 1,731

git diff(merge) with beyond compare

这篇讲的是如何在Mac上将Beyond Compare配置为git的差异对比和合并工具。作者从实际需求出发,指出了一个常见问题:macOS版本的Beyond Compare默认并未安装命令行工具,这使得它无法直接被git调用。文章详细说明了通过特定方式安装命令行的过程,并解释了生成的 `bcomp`(等待操作完成)和 `bcompare`(立即返回)两个命令的区别。 核心内容聚焦于git difftool的配置。作者梳理了git支持的各类图形化diff工具列表,并分析了其中 `bc`(即Beyond Compare)与 `bc3` 的关系,指出git虽内置这些工具的配置,但需在图形环境下才能正常工作。文章通过实例,如 `git difftool -t vimdiff` 的指定方式,以及使用 `-x` 选项自定义命令的技巧,展示了配置的灵活性。最终,读者可以借助这些步骤,将强大的Beyond Compare无缝集成到自己的git工作流中。

本机暂存
IT 数据库/ 2016-03-19 22:55:41 / 累计浏览 2,392

MySQL问题之修改my.cnf配置不生效

这篇讲的是 MySQL 中一个常见但容易被忽略的坑:为什么明明修改了配置文件 my.cnf,但配置就是不生效。 核心原因在于你可能修改了“错误”的那个 my.cnf。作者指出,MySQL 系统中存在多个配置文件,比如 /etc/my.cnf、~/.my.cnf 等,程序会按特定顺序(例如 /etc/my.cnf 优先)读取它们。如果你的修改没有落在优先级正确的文件里,配置就不会如你所料地起作用。文章列出了完整的读取顺序清单,并补充了更细致的控制方法——可以通过 -defaults-file 或 -defaults-extra-file 参数来显式指定配置文件。 解决思路很直接:要么确认并修改正确路径(通常是全局的 /etc/my.cnf)下的文件,要么在启动服务时用参数明确指定你的配置文件。对于多实例部署的环境,后者是更规范的做法。

本机暂存
IT 后端/ 2016-03-19 22:50:41 / 累计浏览 1,666

Linux内核参数调整

这篇讲的是如何通过调整一系列Linux内核参数,来解决高并发服务器性能瓶颈与稳定性问题。作者从实践出发,将原本分散的配置点系统地串联起来。 文章的核心在于将ulimit文件描述符限制提升到10万以上,这是支撑海量并发连接的基础。同时,详细拆解了几个关键网络参数的调整:比如增大socket缓存区以优化数据吞吐,设置tcp_tw_reuse和tcp_tw_recycle以加速服务重启时的端口回收,以及启用tcp_syncookies来防御SYN洪水攻击。对于进程间通信,也给出了消息队列的具体配额建议。 除了性能,文章还关注了调试与兼容性。它解释了如何开启并配置coredump,以便在程序崩溃时快速定位问题;并补充了FreeBSD/MacOS下的类似调整方法。整篇文章更像一份精心整理的“调优清单”,把影响高负载服务器的文件限制、网络栈、IPC和故障诊断等关键环节都梳理到了一起,给出了从原理到具体配置值的直接指导。

本机暂存
IT 后端/ 2016-03-19 22:46:41 / 累计浏览 1,275

分布式选主 -- 利用Mysql ACID和Lease协议实现选主和高可用

在分布式系统中,选主和高可用是常见挑战。作者从实际生产场景出发,探讨了在对一致性要求并非极致严格、且允许短暂不可用的情况下,一种利用现有基础设施实现简易选主的方案。 针对ZooKeeper在节点存活不足半数时无法工作的限制,文章提出了一种基于MySQL ACID特性与Lease(租约)协议的替代设计。核心思路是利用一张MySQL表的唯一记录来维护全局Master信息,其事务特性保障了数据一致性。集群中的每个节点持有一个唯一ID,并按照约定的Lease周期进行心跳维护和竞选。 具体运作上,Master节点需定期向MySQL更新心跳,确保Lease未过期。其他Slave节点则定期检查:若发现数据库中Master的Lease已过期,便发起竞争写入自己作为新主。通过Lease机制,即使原Master因网络分区而失联,它也会在租期耗尽后自动停止服务,有效避免了“双主”脑裂问题。方案也坦诚指出了在数据库访问时延等情况下,可能存在极短时间窗口内的极限冲突,但可通过后续选举自动恢复。 该方案特别适用于需要一主一备、且对秒级故障可容忍的系统,它在ZooKeeper集群规模受限或希望降低依赖复杂度的场景中,提供了一个轻量且实用的工程化思路。

本机暂存
IT 后端/ 2016-03-19 22:42:12 / 累计浏览 1,382

Yahoo的流计算引擎基准测试

这篇来自雅虎工程博客的文章,对他们团队开源的流计算基准测试(streaming-benchmarks)进行了详细解读。测试背景是雅虎生产环境中大规模使用Storm,但面对Flink、Spark Streaming等新兴框架的竞争,需要一份更贴近真实世界场景的性能对比报告。 基准测试设计了一个典型用例:从Kafka读取JSON事件,处理后写入Redis时间窗口计数。核心对比聚焦于三大主流引擎:Apache Storm、Apache Flink 和 Apache Spark Streaming。 测试的关键结论非常明确:Storm 0.10.0 和 Flink 0.10.1 均展现出亚秒级的低延迟特性,其中Storm在99%的百分位数上取得了最低的延迟表现,体现了其在实时性上的传统优势。Flink在保持低延迟的同时,也提供了较高的吞吐量。相比之下,Spark Streaming 1.5.1 能够支持很高的吞吐量,但代价是其端到端延迟明显高于前两者。 文章也坦诚地指出,早期版本的Flink基准测试代码存在一个调试残留问题,这提醒读者在参考任何性能数据时,都需要关注其测试条件与代码版本的严谨性。整个测试的价值在于,它并非空谈理论,而是基于一个与雅虎内部使用场景高度相似的开源基准,为不同流处理技术在延迟与吞吐量这对核心指标上的权衡,提供了直接的参考依据。

本机暂存
IT 后端/ 2016-03-19 22:40:54 / 累计浏览 1,530

Akka简单性能分析

这篇讲的是如何把异步任务从应用服务器拆分出去时遇到的问题与选型。作者面临的需求是将异步处理独立部署,最初考虑了MQ配合线程池的传统方案,但发现这种方式在某些场景下仍需依赖共享变量(如HashMap或ThreadLocal),导致客户端阻塞,本质上并未完全摆脱多线程共享状态的并发隐患。 于是转向了更现代的Akka框架。文章梳理了Akka的核心特性:高吞吐(单机每秒千万级消息)、低内存占用(1GB内存可承载250万Actor)、弹性自愈与无中心设计。作者没有停留在理论介绍,而是用一个极简的例子——循环发送一千万条消息——做了直观的性能验证。通过VisualVM监控截图可以看出,Akka的调度器(dispatcher)仅凭三个线程就高效完成了海量异步消息的处理,展现了其轻量与高性能的特点。 整体来看,作者通过实际场景对比,清晰地指出了传统MQ方案在并发模型上的局限,并用可复现的测试案例证明了Akka在实现高性能异步处理时的优势,为架构选型提供了扎实的参考。

本机暂存
IT 后端/ 2016-03-18 17:11:42 / 累计浏览 4,375

RabbitMQ与Redis队列对比

这篇技术文章聚焦于RabbitMQ与Redis作为消息队列时的核心差异。作者从可靠消费、发布确认、高可用性、持久化、负载均衡等关键维度展开对比,指出Redis在消息可靠性和系统监控方面需要较多自行实现,而RabbitMQ内置了完整的确认、持久化和监控机制。 具体来看,两者在可靠消费上差异明显:Redis消费失败可能导致消息丢失,而RabbitMQ能自动将失败消息重归队列。性能测试数据显示,在处理128Bytes到10K的不同数据体量时,两者出入队性能各有特点。文章最终提炼出适用场景:Redis更适合轻量级、高并发的即时计算或缓存场景,例如秒杀计数器;RabbitMQ则更适用于需要保证消息可靠传递的批量异步处理或任务负载均衡。 文章并未给出绝对结论,而是强调最终选择需结合系统对可靠性、监控能力和实际负载的具体要求来综合权衡。

本机暂存