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

后端

共 1964 篇文章

IT 2012-01-08 22:13:40 / 累计浏览 5,184

为什么国内还有那么多网站使用.NET架构?

这篇讲的是一个有趣的技术选型现象:在Node.js、Go、Java等技术席卷互联网的今天,为什么国内仍有不少知名网站选择坚守.NET架构?文章从具体案例切入,列举了包括电商、金融等领域在内的一批大型站点,并分析了它们共同的技术背景与历史沿革。 作者并未停留在表面的列举,而是深入探讨了几个核心原因:.NET框架本身成熟的工程化能力、与Windows生态深度集成的历史红利、以及Visual Studio等工具链带来的极高开发效率。文章特别指出,随着.NET Core的跨平台演进,一些团队开始利用其高性能特性重构关键服务,形成了一种“前端多技术栈、后端.NET核心化”的混合架构模式。 对比其他技术路线,作者认为.NET在国内的持续存在,既是技术路径依赖的体现,也反映了特定业务场景下对稳定性和开发效率的务实选择。对于正在做技术选型的团队来说,这篇文章提供的视角不是盲目追随潮流,而是从团队基因与业务需求出发进行冷静评估。

本机暂存
IT 2012-01-03 23:52:15 / 累计浏览 2,061

zend studio常见问题解答

这篇讲的是Zend Studio 9这款PHP IDE在实际开发中可能遇到的各类“小坑”及其解决方法。从项目编码设置、自动提示失效,到隐藏.svn目录、配置代码格式化规则,内容非常具体。 例如,它详细说明了如何将工作区默认编码从GBK切换到UTF-8,并支持为单个项目单独设置编码。对于代码自动提示失效和想对Zend Studio进行汉化这两个常见需求,文章也给出了明确的操作步骤和资源链接。此外,文章还解答了为何新建项目会自动生成index.php文件,以及如何通过安装插件来添加最新版的SVN支持。 可以说,这篇文章更像一份实用的速查手册,覆盖了环境配置、版本控制、界面汉化等多个开发场景。遇到类似问题时,可以快速找到对应的解决方案,节省排查时间。

本机暂存
IT 2012-01-03 23:45:06 / 累计浏览 3,083

Node.js中相同模块是否会被加载多次?

这篇讲的是Node.js模块加载机制中一个容易被忽略的细节:当你用require()引入同一个模块时,它真的会重复执行代码吗?作者从require函数的执行流程切入,逐步拆解了模块缓存机制的工作原理。 文章首先澄清了一个常见误区——Node.js其实内置了缓存机制。首次require时,模块代码会被执行,其导出结果会被存入一个缓存对象;后续再require同一模块时,会直接返回缓存内容而不会重复执行。作者通过示例代码演示了这一过程,验证了模块内的全局变量状态确实会被保留。 更值得细看的是对循环依赖的处理。当模块A和B互相引用时,Node.js并不会陷入死循环,而是返回一个尚未完成的“半成品”exports对象。文章用流程图梳理了这个微妙的加载顺序,解释了为什么某些变量在此时可能还是undefined。 最后,作者还提到了开发者可以利用require.cache手动操作缓存,比如在开发时热更新模块。不过也提醒了直接修改缓存可能带来的风险。整篇文章把看似简单的require()背后的完整逻辑讲透了,从原理到实践都有覆盖。

本机暂存
IT 2012-01-02 20:58:19 / 累计浏览 3,600

关于内存的申请与释放

这篇讲的是C/C++开发中内存管理的核心痛点。作者从实际项目中常见的内存泄漏和重复释放问题切入,对比了传统手动管理(如malloc/free)与现代C++智能指针(如shared_ptr、unique_ptr)两种范式。文章不仅解释了它们在实现机制上的关键差异——比如引用计数与作用域绑定如何工作,还通过代码实例展示了不当使用会导致的具体后果,比如循环引用造成的泄漏。最后,作者总结出清晰的选择指南:对性能敏感、生命周期明确的场景,手动管理或unique_ptr更高效;而对于对象所有权复杂、需要共享的场景,shared_ptr则是更安全的选择。

本机暂存
IT 2012-01-02 20:54:31 / 累计浏览 3,522

还记得这些 Linux 发行版吗?(六)

这篇讲的是Linux发行版系列回顾的第六篇,作者延续了之前的脉络,把目光聚焦在那些曾经闪耀但如今已不那么主流的名字上。文章没有泛泛而谈,而是具体提到了几个令人印象深刻的例子:极简主义的CrunchBang如何凭借精简的Openbox桌面获得一批忠实用户;BackTrack(Kali Linux的前身)怎样为安全爱好者搭建了渗透测试的基石;以及曾经的商业巨头Mandriva如何从辉煌走向没落,最终将接力棒交给了开源社区的Manjaro。 除了这些相对知名的系统,作者也提到了一些更为小众或已停止更新的发行版,并指出了一个关键观察:硬件厂商对Linux生态的直接支持(如提供官方驱动)往往决定着一个发行版能否在特定硬件上顺利普及,这比单纯的社区热情更为关键。整篇文章像是在翻阅一本Linux世界的旧相册,不仅回顾了不同发行版的技术特色与定位差异,也折射出开源社区项目兴衰的轨迹,让读者看到技术选择之外,市场与维护生态同样深刻地影响着系统的生命周期。

本机暂存
IT 2011-12-28 23:45:34 / 累计浏览 2,501

淘宝实习半年总结(2011/06/29-2011/12/29)

这篇总结记录了一位技术新人从2011年6月底加入淘宝开始,整整半年的实习心路历程。作者没有泛泛而谈,而是选择以入职第一天为起点,真实呈现了从校园踏入一线互联网公司时的观察与感受。 文章并非一份简单的工作流水账。作者坦诚地剖析了初期可能感到的“学校收获可以忽略不计”的心态,并记录了如何在实际工作中面对具体任务、融入团队文化、理解技术落地的现实挑战。字里行间,你能看到一个年轻人视角下的成长:从对代码与业务的陌生,到逐渐找到节奏;从单纯完成指派任务,到开始思考系统与架构的脉络。 对于正在或即将踏入技术领域的读者而言,这篇文章的价值在于其“过程性”。它揭示了技术成长中那些容易被忽略的软性环节——比如对业务的理解、工程规范的适应、团队协作的磨合,而这些恰恰是书本之外的关键一课。它提供了一份来自十多年前的鲜活样本,让我们看到早期大厂技术新人的普遍处境与思考。

本机暂存
IT 2011-12-28 23:34:35 / 累计浏览 2,103

由一个问题到 Resin ClassLoader 的学习

这篇讲的是作者如何从一个实际的Web应用类加载问题出发,系统性地探索了Resin服务器的ClassLoader实现。 文章背景是一个经典场景:在同一个Resin容器里部署两个Web应用,其中一个的类库需要被另一个调用,但遇到了类加载隔离导致的ClassCastException。作者没有止步于寻找一个简单的解决方案,而是沿着问题线索,一头扎进了Resin的类加载器设计之中。 他对比了Tomcat与Resin的不同类加载策略,详细剖析了Resin中WebAppClassLoader、ResinClassLoader等组件的协作原理。文章亮点在于清晰地展示了Resin如何通过类加载器的父子委派与可见性规则,来保证应用间的依赖隔离与共享。作者还结合源码,解释了像“类加载器的线程上下文”等机制是如何被巧妙利用的。 这种通过具体问题深入底层原理的学习路径,展现了扎实的技术探索精神。对于想理解类加载机制实际应用的开发者来说,跟着作者的思路走一遍,收获会非常具体。

本机暂存
IT 2011-12-22 22:25:05 / 累计浏览 3,961

storm常见问题解答

这篇整理自作者收到的真实邮件提问,集中解答了 Apache Storm 在使用中遇到的一系列常见问题。文章并非空谈理论,而是从开发运维人员的实际困惑出发,涵盖了从集群部署运维、性能调优到拓扑开发中 API 使用的多个层面。 比如,对于“如何提高拓扑处理性能”这类高频问题,作者没有停留在概念上,而是具体给出了通过调整并行度、优化序列化以及合理设置acker数量等一整套可操作的建议。对于初学者容易混淆的 Spout 与 Bolt 交互、消息可靠性保障机制等问题,也通过具体代码片段和案例进行了清晰辨析。 整体来看,这篇文章像是一份来自一线开发者的实战问答手记,它将零散的痛点问题串联起来,提供了切实可行的解决思路,对于正在使用或打算使用 Storm 的开发者而言,是一份不错的速查与避坑参考。

本机暂存
IT 2011-12-22 22:19:12 / 累计浏览 2,722

关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)

这篇从PHP的弱类型特性切入,剖析了浮点数处理的底层机制。文章首先展示了PHP内部如何用zval结构来承载所有变量——它就像一个“万能容器”,通过type字段标识实际存储的是整数、浮点还是其他类型,正是这种设计催生了无缝的隐式类型转换。 深入到浮点数本身,文章揭示了其二进制表示与十进制小数之间的天然鸿沟。比如开发者熟悉的“0.1 + 0.2 ≠ 0.3”问题,根源就在于计算机无法精确表示某些小数。更关键的是,文章指出了在PHP中进行浮点数比较时可能遇到的“陷阱”,直接使用==运算符可能导致非预期的结果,因为引擎会先进行宽松的类型转换。 作者进一步解释了PHP内部如何通过zval的type字段来管理这些转换,以及为什么某些看似正确的代码会产生“虚假”的错误结果。文章不仅分析了问题的成因,也给出了实践中的规避建议,比如使用高精度计算函数或设定误差范围(epsilon)进行比较。 通过拆解zval结构和浮点数的二进制特性,这篇文章帮助开发者理解那些“莫名其妙”的浮点数问题背后的原理,从而在编写涉及金额计算或科学计算的PHP代码时,能更加稳健可靠。

本机暂存
IT 2011-12-22 22:16:50 / 累计浏览 3,941

ZooKeeper FAQ

这篇FAQ整理自作者与同事的交流实践,集中解答了大家在使用ZooKeeper时最常踩的坑与产生的疑惑。 它直接切中一个核心认知问题:许多开发者容易高估ZooKeeper的能力,将其当作万能的分布式协调服务。文章不仅列举了典型场景下的具体问题,更重要的是明确了ZooKeeper的设计边界——它擅长处理哪些协调任务,又因何设计原则而“不能干什么”。这种澄清能帮助团队在技术选型时做出更合理的判断,避免因误解其定位而导致的架构风险。 页面承诺持续更新,意味着它汇集的并非一次性总结,而是来自实战的、不断积累的经验库。对于正在使用或考虑引入ZooKeeper的团队来说,这提供了一份难得的避坑指南,有助于从根源上理解其本质,从而更稳妥地将其融入架构中。

本机暂存
IT 2011-12-22 22:01:58 / 累计浏览 1,603

知心怪蜀黍NO.3 社区通讯录的定位与拆分

这篇讲的是社区产品中一个看似小却至关重要的模块——通讯录的定位问题。作者纯银从实际产品经验出发,指出很多社区将通讯录设计为“万能入口”,导致其功能杂糅、定位模糊。 核心的解决方案在于清晰地拆分与回归。作者认为,通讯录最健康、最高效的定位,应该是“私信的通讯录”,服务于用户之间建立直接连接的需求。它不应该承担“找人聊天”的随机社交功能,也绝不能挪用为内容运营或功能跳转的工具栏。文章通过具体案例,分析了通讯录在“找人”与“找内容”两个方向上可能发生的错位,并给出了明确的拆分逻辑与设计建议。 最终,文章回归到产品设计的底层逻辑:一个功能模块的价值,取决于它能否清晰、高效地解决一个核心用户问题。将通讯录从复杂的“超级入口”中解放出来,回归其连接用户的本质,反而能提升整个社区的沟通效率。

本机暂存
IT 2011-12-18 22:27:23 / 累计浏览 3,601

PHP扩展开发:第一个扩展

这篇讲的是如何亲手创建你的第一个PHP扩展。在上一篇搭建好开发环境之后,作者直接从最基础的步骤开始,采用最简单直接的方式引导读者完成整个流程。 文章没有空谈理论,而是聚焦于动手实践。作者可能会演示创建一个“最小化扩展”的完整步骤,让读者理解扩展的基本骨架和必要文件。你会看到如何编写声明扩展信息的代码,以及如何通过标准的构建流程,将这段代码编译成PHP能够加载的.so动态库文件。整个过程旨在消除初学者的神秘感,证明创建一个能工作的PHP扩展并不复杂。 对于想要深入理解PHP底层,或希望为语言添加自己定制功能的开发者来说,这是一个非常扎实的起点。它跳过冗余的解释,用一条清晰的路径,让你的第一个扩展从零到运行起来。

本机暂存
IT 2011-12-18 22:05:51 / 累计浏览 4,370

Redis源代码分析

这篇讲的是作者兑现承诺,从文件结构入手深度剖析Redis服务端源代码的硬核文章。作者没有直接钻进某段代码,而是先从宏观视角把Redis服务端所有源码文件铺开,逐一厘清它们各自承担的职责。这种从架构布局切入的写法,能让读者先建立起清晰的“地图”,再跟着作者深入实现细节。 Redis以高性能著称,其单线程模型、高效的网络协议处理与内存数据结构是关键。文章将带领读者跟随代码,看Redis如何巧妙地将事件驱动、非阻塞I/O等机制编织在一起,从而在单线程内实现高并发的命令处理。作者对每个文件核心逻辑的解读,旨在揭示Redis在工程实现上的精巧与克制,比如其简洁的协议解析和极致优化的内存管理。对于想超越表面使用、一窥Redis内部运作奥秘的开发者来说,这份逐文件的源码导读提供了一个扎实的起点。

本机暂存
IT 2011-12-18 22:02:59 / 累计浏览 2,702

深入浅出jcr之16 该死的RMI,我们需要HTTP+简单RPC协议

这篇讲的是,作者从Apache Jackrabbit这个内容仓库项目的源码出发,开始探讨其技术选型上的一个“败笔”:使用RMI作为客户端与服务器之间的通信协议。 文章直指RMI在特定场景下的痛点——它基于Java,过于重量级且与语言强绑定,不够简单、灵活和跨平台。作者的核心观点很明确:对于这种需要远程调用的场景,应该果断抛弃RMI,转而采用更通用、更轻量的“HTTP + 简单RPC协议”。他主张通过这种组合,利用HTTP的普及性和简单RPC的清晰性,来构建一个更易用、更兼容的通信层。 作者没有停留在单纯批评,而是将这一具体的技术决策错误上升到了对项目架构和协议选择通用性的思考。他引导读者去审视那些看似“官方”或“默认”的技术栈,分析其背后真正的适用边界。这种对早期技术决策的反思,以及对更优替代方案的明确倡导,对于正在做类似技术选型的开发者来说,是一次很有价值的提醒。

本机暂存
IT 2011-12-18 21:57:02 / 累计浏览 2,141

Hadoop++:Hadoop的局部性能改良

这篇讲的是一个对Hadoop MapReduce框架本身进行性能优化的项目——Hadoop++。 它要解决的核心问题,是原生Hadoop在某些工作负载,特别是迭代式查询和表连接操作上的性能瓶颈。作者提出了一种“非入侵式”的优化思路,也就是说,不用侵入并修改Hadoop的底层核心代码。相反,他们通过自定义框架中的关键函数,比如数据分片(split)的逻辑,来让MapReduce作业在执行时能做出更聪明的决策。 这个项目由德国萨尔兰大学的Jens Dittrich教授团队主持。其巧妙之处在于,它允许用户在不抛弃现有Hadoop生态和代码的前提下,通过一个附加层来“加速”任务。根据项目描述,这种方式能显著提升查询和联接操作的效率,让Hadoop在处理复杂分析时跑得更快。 简单来说,Hadoop++就像给一辆稳重但速度普通的卡车,换上了一套更高效的传动系统和导航。它没有改变卡车的基本结构,却让它的特定性能(比如爬坡和城市穿梭)得到了实实在在的增强。对于需要优化Hadoop特定场景性能的开发者来说,这是一个值得了解的实现思路。

本机暂存
IT 2011-12-14 13:29:53 / 累计浏览 2,282

为 MogileFS 配置使用多个网络段/多数据中心

这篇讲的是如何让 MogileFS 这个分布式文件系统,优雅地跨越多个网络段甚至多个数据中心工作。作者从实际生产环境的需求出发——当存储集群不再局限于一个机房,或者需要为不同业务区隔网段时,MogileFS 默认的单一网络假设就不够用了。 文章的核心方案围绕着灵活的网络配置展开。它详细说明了如何在 MogileFS 的节点(Tracker、Storage)和客户端配置中,正确地设置和优先化多个网络接口与地址段。关键在于利用配置来引导节点间的通信和数据传输流量,确保内部管理流量和用户请求流量各走各路,既避免了网络风暴,也提升了跨数据中心访问的就近性与效率。 作者不仅给出了配置示例,还讨论了这样做的实际效果:系统获得了更好的网络隔离性与故障域控制能力,可以支持更复杂的拓扑部署。对于需要构建高可用、跨地域存储架构的运维和开发人员来说,这篇文章提供了一套清晰且经过验证的配置思路。

本机暂存
IT 2011-12-11 16:05:24 / 累计浏览 3,103

更简单的重现PHP Core的调用栈

调试PHP崩溃时,Core文件是定位问题的金钥匙,但要从中清晰地还原出完整的调用栈,尤其是函数调用参数,过去的方法往往步骤繁琐。这篇讲的正是如何更简洁、更直接地从Core文件中提取出这份关键的上下文信息。 文章的核心在于介绍了一种改进后的调试思路。它不再依赖复杂的手动解析,而是利用PHP内部机制,提供了一种更直接的方式来重现故障现场的调用栈与参数。这不仅让信息获取的路径变短,更重要的是,得到的结果也更加清晰和可靠。 相比于以往的方法,这个新思路巧妙地绕过了一些中间环节,使得调试流程更为直观。对于需要经常分析PHP底层问题的开发者而言,这意味着能更快地锁定问题根源,节省宝贵的排查时间。

本机暂存
IT 2011-12-11 16:02:24 / 累计浏览 3,304

Erlang虚拟机内存使用问题以及监控

这篇讲的是 Erlang 平台在实际运维中一个常见但容易被忽视的陷阱:内存使用过量导致的虚拟机崩溃。作者从“N个9”高稳定性宣称与线上真实 Crash 的落差切入,指出许多 Erlang VM 相关的崩溃,根源都指向内存问题。 文章揭示了 Erlang 内存管理的核心机制:采用一种“集中批发,零售分配”的模式。VM 作为总仓,一次性从操作系统获取大块内存,再按需分配给用户进程、ETS 表等各个消费单元。这种设计的精妙之处在于高效,但也埋下了隐患——内存的增长曲线并非线性,而是近似斐波那契数列的方式攀升。作者特别警告,当内存消耗达到 GB 级别后,后续的分配速度会陡然加快,远超预期,很容易在短时间内耗尽资源。 因此,对于使用 Erlang 构建高可用服务的团队而言,建立精细的内存监控体系至关重要。这篇内容提醒我们,不能只信赖语言本身的稳定性神话,而必须深入理解其资源管理特性,主动监控并预防内存的“雪崩式”增长。

本机暂存
IT 2011-12-11 15:28:41 / 累计浏览 3,965

php抓取页面与代码解析

作者从实际需求出发,讲的是在开发天气预报或RSS订阅这类应用时,一个很实用的技术点:如何用PHP模拟浏览器,去“抓”非本地页面的内容。文章的核心思路是,通过PHP发起HTTP请求来访问目标URL,拿到返回的HTML或XML原始数据。 但拿到“毛坯”数据只是第一步。作者接着点明了关键:这些原始代码通常不能直接使用,必须进行解析和提取。比如,从杂乱的HTML中筛选出需要的天气信息或新闻条目,然后再进行格式化,最终以更清晰、友好的方式呈现给用户。 这篇文章没有空谈概念,而是紧扣“获取”与“处理”这两个实际步骤,把一个常见的网络数据采集流程拆解清楚了。对于正在学习PHP网络编程,或者需要实现类似爬虫功能的开发者来说,这种从问题到解决方案的叙述方式,应该能提供一个清晰的实现思路。

本机暂存
IT 2011-11-24 00:01:55 / 累计浏览 2,762

Erlang R15的内存delay dealloc特性对消息密集型程序的影响

这篇讲的是 Erlang R15 版本引入的内存“延迟释放”特性,如何在高消息吞吐量的场景下,显著提升基于 NUMA 架构服务器的性能。 文章从 NUMA 架构的核心挑战切入:在新的多路服务器上,每个 CPU 访问本地内存快,但跨节点访问远程内存时,由于需要经过 QPI 通道,延迟可能增加 40%。对于 Erlang 这类极度依赖进程间消息传递的并发模型,频繁的跨节点内存访问会成为性能瓶颈。 R15 的解决方案是在 Erlang VM 中引入了“delayed deallocation”机制。简单说,当一个进程的堆内存不再需要时,系统不会立即将其归还给操作系统,而是暂时保留,以便后续新创建的进程可以优先复用这块仍然属于“本地节点”的内存。这巧妙地减少了跨节点内存分配的概率,降低了对慢速 QPI 通道的依赖。 作者通过对比测试验证了这一点:在模拟的密集消息传递场景下,启用该特性后,程序的吞吐量和 CPU 利用率都得到了可观提升。这不仅仅是版本迭代的一个小改进,对于运维着大规模 Erlang 集群、处理海量并发请求的架构师而言,它提供了一种从运行时层面优化 NUMA 感知性能的有效思路,有助于榨干现代硬件的最后一点潜力。

本机暂存