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

最新文章

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

IT 后端/ 2013-11-21 23:08:20 / 累计浏览 11,086

浅谈TCP优化

这篇讲的是TCP性能优化背后的原理与可操作的调优方法。作者以《High Performance Browser Networking》一书为依托,将看似晦涩的流量控制、慢启动和拥塞避免机制,用通俗的比喻讲得清晰明白。例如,用“吃几碗饭”比喻接收窗口(rwnd)的限制,用拳击试探比喻拥塞窗口(cwnd)的增长。 文章深入浅出地解释了网络吞吐量受限的核心逻辑:传输性能由rwnd和cwnd中较小的值决定。针对百兆网络却跑不满速的常见问题,作者给出了具体解决方案——根据带宽延迟乘积(BDP)来计算合理的rwnd大小,并介绍了Linux内核中的自动调优机制与关键参数。 对于网页加载等短连接场景,文章通过生动的类比(博尔特百米起跑)和数据对比,揭示了cwnd初始值设置对效率的巨大影响,并引用了Google的研究结论,建议将其调整为10个MSS大小。从原理到实践,文章提供了一套可落地的优化思路。

本机暂存
IT 开发者/ 2013-11-21 00:21:33 / 累计浏览 2,868

享受造轮子的乐趣

这篇讲的是“重复造轮子”在技术圈内常被讳莫如深,但作者认为,有时大胆造轮子不仅无妨,反而是技术创新和团队成长的重要路径。 文章以Linux和搜索引擎领域的创新为例,指出若当年坚持“不造轮子”,可能就没有今天的开源系统和竞争格局。作者区分了“设计”与“使用”技术的不同层次,强调为用户提供更好方案的目标,常常需要我们跳出直接使用现有产品的思路。 更重要的是,造轮子本身的价值:它能帮助团队深入理解领域,启发重新思考与改进。同时,富有挑战的项目还能吸引顶尖人才——优秀开发者渴望解决难题,而这类“轮子”正好提供了舞台,从而通过技术杠杆推动业务。但作者也提醒,同一公司内无意义的重复不可取,关键在于把握“农闲”与“农忙”的时机,让积累在需要时发挥作用。

本机暂存
IT 开发者/ 2013-11-20 23:59:07 / 累计浏览 9,425

编程能力与编程年龄

程序员的职业寿命究竟有多长?“35岁危机”和“青春饭”的说法一直存在。本文通过解读一篇基于StackOverflow数据的研究,为这一争论提供了扎实的数据视角。 作者引用了北卡罗来纳州立大学对近8.5万名活跃开发者的分析。研究发现,程序员的技术能力并非在30岁达到顶峰后下滑,而是会持续上升,直到50岁左右。更重要的是,所谓“老程序员”学习新技术的能力并不比年轻开发者差。 基于这些数据,文章的核心观点非常明确:许多人的“35岁危机”实则是能力瓶颈。作者指出,如果30岁还没能成为合格的程序员,那恰恰是经验与能力积累不足的表现。真正的技术能力是随时间增长的硬通货,而非青春饭。这篇文章用数据为那些长期坚持技术深耕的从业者正了名。

本机暂存
IT 前端/ 2013-11-20 23:55:45 / 累计浏览 4,662

防止表单重复提交的几种策略

这篇讲的是多用户Web应用中一个经典问题:表单重复提交。从用户误点两次按钮、刷新页面,到使用浏览器前进/后退,甚至网络层的重复请求,都可能导致同一数据被多次处理,带来数据不一致或资源浪费。 文章梳理了四种常见的应对策略。前端层面,可以暂时禁用提交按钮,但这依赖客户端JavaScript,不够稳健。更推荐的做法是采用Post/Redirect/Get模式——提交后立即重定向到结果页,从根本上避免刷新或回退带来的重复提交。后端控制上,可以在session中为每次生成的表单嵌入一个一次性令牌,服务器处理时立即核验并删除,这是一种结合了安全考虑的有效方案。最后,从数据源头兜底,在数据库层面设置唯一约束或索引,确保即使重复数据到达也能被拦截。 这些方法各有侧重,从用户交互、请求流转、会话状态到数据存储形成了多层次的防御。实际开发中,往往会根据应用的安全要求和复杂度,选择组合使用这些策略。

本机暂存
IT 算法/ 2013-11-20 00:18:00 / 累计浏览 3,055

数据可视化初体验(R语言)

这篇文章以作者初入数据可视化领域的体验为线索,分享了其核心理解与R语言实践。作者引用“图画最大价值在于迫使我们注意到从未预料到的内容”这一观点,强调可视化不仅是展示数据,更能通过图像残留增强思考,揭示隐藏规律,并以Twitter用户分布图为例加以印证。 在实践部分,作者以中国航空数据为例,展示了如何用R的ggplot包将“实体”与“联系”的逻辑转化为可视化步骤:从用直方图展示机场航线数量,到在地图上叠加点线图呈现地理位置与航线网络,最终生成GIF动画,层层递进。文章还简要提及了基于Knitr包实现可重复自动化统计报告的方法,对比了其相较于传统数据报表的优势。 整篇文章从感性认识到理性实践,结合了数据可视化的哲学思考与R语言的具体实现,为初学者提供了一个清晰的入门框架与案例。

本机暂存
IT 开发者/ 2013-11-20 00:17:15 / 累计浏览 3,511

程序员的18个有趣的事实

这是一篇充满黑色幽默与职业共鸣的程序员文化观察。作者从开发日常中提炼出18条令人会心一笑的“真理”,精准捕捉了程序员群体在自嘲中展现的独特智慧。 文中的事实从多个角度切入:有对版本迭代的幽默解构(“如果第一次运行不成功,那就叫它1.0版吧”),有对bug的哲学化开脱(“那些只是开发出来的随机的功能特征”),还有对编程本质的尖锐洞察(“编程是10%的科学,20%的创造力,和70%的让这创造力符合科学”)。这些看似玩笑的语句,实际映射着调试的挫败感、对完美的执着、以及咖啡与代码间的生化反应。 文章没有停留在单纯的趣味列举。它像一面镜子,照见了程序员在理性框架下的感性挣扎:既抱怨被用户“不够友好”地对待,又承认自己或许“没有源代码”去改变世界;既明白代码错误需用一生维护,又依然享受着编译通过瞬间的纯粹快乐。这种矛盾恰恰揭示了这个职业最真实的核心——在严谨的逻辑系统中,依然保有鲜活的人性与创造力。 读罢这些事实,你或许会笑,但更会思考:在那些看似怪诞的幽默背后,藏着多少深夜调试时的心照不宣,又定义着怎样一种用逻辑丈量世界的浪漫。

本机暂存
IT 开发者/ 2013-11-19 23:20:30 / 累计浏览 4,077

十种更好的表达“你的代码写的很烂”的方法

如何指出代码质量问题是许多技术团队避而不谈的尴尬。直接说“你的代码很烂”可能引发对抗,而沉默或抱怨又无法解决问题。这篇文章正是从这个常见的协作困境出发,提供了十个具体、可操作的沟通策略。 作者并非空谈理论,而是结合了iOS开发者Tim Burks、Adobe研究员Tom Jacobs等业内人士的实践智慧。这些方法的核心思路是将“批评”转化为“协作邀请”。例如,“开门见山”法不是指责,而是诚恳地请求对方帮你理解代码逻辑;“糖衣炮弹”法则在提出改进点前后,先肯定代码中值得学习的部分;“偷换概念”法通过改变主语(如“我需要重构这段代码”而非“你写得乱”),有效降低对方的防御心理。 文章最实用之处在于,它揭示了所有这些技巧的共同点:将对话焦点从评判“人”转向优化“代码”本身。无论是通过非正式的啤酒聊天来理解对方的编码习惯,还是通过组织编程大赛来营造安全的讨论氛围,目标都是让代码质量提升成为团队共同追求的目标,而非个人之间的对错之争。对于任何需要进行代码评审或团队协作的开发者,这些沟通心法都值得借鉴。

本机暂存
IT DevOps/ 2013-11-19 23:19:55 / 累计浏览 4,074

Intel 10-GbE 网卡性能优化[翻译]

这篇翻译文档详细拆解了如何将一块 10GbE 网卡的性能从默认的“可用”状态压榨到“极限”。作者指出,Linux 的默认网络栈配置(如缓冲区大小、TCP 内存分配)是为了可靠性而非峰值吞吐量设计的,这对万兆网卡尤其不利。 文章的核心思路是分层优化,并基于 Intel 官方驱动文档提供了实操步骤。优先级最高的操作是在交换机和服务器两端启用巨型帧(MTU 9000),这能大幅提升大流量传输效率。其次是调整内核的 `sysctl` 参数,例如关闭 SACK 和时间戳、将 TCP 收发缓冲区统一设为 10MB,并提高网络设备积压队列上限。更进阶的操作是通过 `setpci` 命令调整网卡 PCI-X 总线的 MMRBC 寄存器,将内存读块大小提升到 4KB,以增强对突发流量的处理能力。 文章最有说服力的部分在于其测试数据:经过上述优化,使用 `iperf` 测试的吞吐量从优化前的约 4.70 Gbits/sec 飙升至 9.90 Gbits/sec,几乎跑满了万兆带宽。作者强调,优化过程需配合压力测试(如 iperf、netperf)来验证效果,结果可能因硬件和网络环境而异。对于需要榨干网卡性能的 HDFS、高性能计算等场景,这套调优方法提供了清晰的参考路径。

本机暂存
IT 算法/ 2013-11-19 23:18:48 / 累计浏览 2,630

两两接触的等粗且无限长的圆柱体

这篇文章从一个生活化的场景——多人碰杯时的接触难题——出发,引出了一个经典的几何学谜题:最多能让多少个等粗且完全相同的圆柱体实现“两两接触”?对于有顶面和底面的圆柱体,Martin Gardner 记录过5个和6个的经典构造,而 George Rybicki 等人更早指出了7个的可能性。 然而,问题的真正难点在于一个更严苛的版本:如果圆柱体是**无限长**的,无法借助任何端面进行接触,情况会如何?这个由 John Littlewood 在1968年提出的挑战,在近期由 Sándor Bozóki 等三位研究者通过数学手段攻克了。他们建立了一个包含20个未知数与20个方程的庞大方程组,并通过数值计算成功找到了两组不同的解,从而证明在无限长的情况下,7个单位半径的圆柱体依然能够实现两两接触。 这篇短文清晰梳理了该问题从有限长到无限长的探索脉络,并展示了现代数学工具如何为解决经典猜想提供新路径。当然,如文中末尾所言,关于不同高径比下的限制情况,探索或许仍在继续。

本机暂存
IT 前端/ 2013-11-06 23:32:18 / 累计浏览 19,805

响应式网页设计

这篇文章从一个核心问题出发:为什么不能用一套设计适配所有设备?它介绍了由 Ethan Marcotte 提出的“响应式网页设计”理念——这不仅仅是屏幕自适应或图片缩放,更是一种要求“向下兼容、移动优先”的全新思维模式。 文章结合了2012年的行业背景,指出PC互联网正加速向移动端迁移,并用一个例子点明痛点:缺乏响应式处理的营销页面,在手机上加载慢、体验差,会导致用户流失。它的核心价值在于系统性地对比了三种移动端方案:开发成本高昂的Native APP、需安装的Hybrid APP,以及基于HTML5的响应式Web APP,后者在成本、跨平台性和迭代速度上优势明显。 在实施层面,文章给出了具体指导:首先遵循“移动优先”原则,将移动端作为交互设计的基准。实现的关键在于弹性栅格布局和响应式内容,并详细介绍了使用viewport meta标签控制视口、以及通过CSS Media Queries适配不同设备样式等技术要点。对于开发者而言,这提供了一套清晰且低成本的移动端适配路线图。

本机暂存
IT DevOps/ 2013-11-06 23:28:21 / 累计浏览 5,397

加速scp传输速度

这篇讲的是如何突破scp文件传输的速度瓶颈。作者在实际场景中发现,默认配置下传输400GB文件耗时太长,于是系统性地测试了加密算法、压缩选项和完整性校验算法对速度的影响。 测试数据表明,选择更轻量的加密算法(如arcfour128、aes192-cbc)能显著提速,通常“越弱”的算法速度越快。有趣的是,启用ssh内置压缩反而常常拖慢速度,因为压缩本身消耗了时间,除非传输的是可压缩率极高的数据。此外,使用umac-64这类校验算法也比默认的hmac-md5带来约10%-20%的性能提升。 基于这些发现,作者建议直接尝试类似 `scp -c arcfour128 -o "MACs umac-64@openssh.com"` 的命令组合,往往能让传输速度翻倍。文章提醒,最终效果高度依赖数据类型和网络环境,关键在于根据实际情况做针对性调优。

本机暂存
IT 开发者/ 2013-11-05 23:26:58 / 累计浏览 4,874

个人订阅的10佳博客与相关介绍

作者从自己长期订阅的200多个涵盖数据库、编程、分布式系统等领域的技术博客中,根据更新频率、文章质量及对自身实际帮助等标准,精心挑选并介绍了10个“宝藏级”博客。 这些推荐并非简单罗列,而是作者多年深度阅读后的经验沉淀。例如,ACM Queue上的文章被形容为“顶级论文水准”,尤其在并发与性能领域极具价值;Amazon CTO Werner Vogels的个人博客,则展现了技术领袖坚持写作与阅读论文的独特实践。此外,还介绍了系统性能优化专家Brendan Gregg的技术博客等。 这篇文章的核心在于分享一套经过实践验证的优质信息源筛选方法。对于面临信息过载的技术人而言,这10个博客提供了一个高质量的阅读起点,其筛选思路本身也比清单更具参考意义。

本机暂存
IT DevOps/ 2013-11-01 13:59:43 / 累计浏览 16,313

Linux如何统计进程的CPU利用率

想在脚本里“非阻塞”地获取Linux进程CPU利用率,却遇到top需要等1秒、ps只显示平均值的问题?这篇文章就从这个实际需求出发,直接深入到/proc文件系统,带你看清背后的原理。 文章的核心是对比两种思路:使用现成工具vs手动计算。作者明确指出,像top和ps这样的工具,虽然方便,但本质上提供了不同的“快照”——ps给出的是进程生命周期的平均利用率,而top需要至少1秒的采样间隔。关键差异在于,它们都无法满足对“当前时刻”瞬时利用率的精确、非阻塞获取。 真正的解决方案隐藏在/proc/stat和/proc/[pid]/stat这两个文件中。文章详细拆解了其中各列的含义,并给出了具体的计算公式:在两个时间点分别读取系统总CPU时间片和进程CPU时间片,通过差值比来计算这段时间内的利用率。这就像用两张“照片”的位移差来算速度,揭示了CPU利用率本质是一个时间段内的统计量,而非一个瞬时值。 最后,文章还解释了ps命令中%CPU指标的准确含义,即它是进程自启动以来的累计平均利用率。如果你需要在监控脚本中实现高精度的进程CPU统计,或者对系统工具背后的实现原理感到好奇,这篇文章提供的思路和细节会很有参考价值。

本机暂存
IT DevOps/ 2013-11-01 13:56:41 / 累计浏览 16,963

记录一个软中断问题

这篇讲的是如何定位并解决Linux系统软中断负载不均的“坑”。作者从一台XEN虚拟机的Nginx服务器入手,通过top命令观察到软中断(si)数值异常,且几乎全部集中在CPU1上,导致该CPU成为性能瓶颈。 进一步用`/proc/softirqs`确认,网络收包中断(NET_RX)是主要来源。排查发现,问题根源在于宿主机的网卡运行在单队列模式,且中断被绑定到了特定CPU上。虽然尝试修改中断亲缘性(`smp_affinity`),但对单队列网卡无效。 最终,作者启用了Linux内核的RPS(Receive Packet Steering)功能,通过软件层面将网络包处理负载分摊到多个CPU核心。配置后,软中断成功从单一CPU分散到了两个CPU上,显著改善了负载不均的问题。 文章还附带介绍了`itop`这个中断监控小工具,并提及了Nginx的`worker_cpu_affinity`配置、NUMA架构调优等后续优化思路,为遇到类似网络中断瓶颈的开发者提供了一套完整的排查与优化路径。

本机暂存
IT 算法/ 2013-11-01 13:54:26 / 累计浏览 2,056

Python语言的创始人解释为什么Python数组的索引从0开始

Python的创始人自己解释了,为什么Python选择从0开始索引数组,而不是像一些语言那样从1开始。 这个问题源于Twitter上的一次提问。他回顾了对Python有重要影响的几种语言:ABC语言(Python的祖先)使用1-based索引,而C语言使用0-based索引。他自己最早接触的语言如Algol和Fortran等则各有不同。 最终决定采用0-based索引的关键原因,是Python切片语法的优雅性。在0-based索引下,`a[:n]`可以清晰地表示“取前n个元素”,`a[i:i+n]`表示“从第i位开始取n个元素”。而在1-based索引下,要表达同样的“取n个元素”操作,就需要繁琐地写成`a[i:i+n-1]`,或者改用不直观的`起始索引+长度`的表达方式。 这种设计还带来了一个巨大的好处:当进行连续切片时,索引能够自然衔接。例如,要将数组在`i`和`j`两处分割成三部分,可以非常优雅地写为`a[:i]`、`a[i:j]`和`a[j:]`。切片的终点恰好是下一段的起点,无需做任何调整。 这种对语法简洁性的追求,深刻影响了Python日常编码的体验,让数组和列表的操作直观而富有美感。

本机暂存
IT 后端/ 2013-11-01 13:52:54 / 累计浏览 24,509

Linux大棚版Thrift入门教程

这篇讲的是如何快速上手Thrift——这个最初由Facebook开发、现在由Apache维护的跨语言RPC框架。文章从“thrift”一词的节俭本意巧妙切入,指出在技术语境下,它代表的是一种高效解决跨语言服务通信的“节俭”之道。 作者没有停留在概念介绍,而是通过一个具体的成绩查询系统案例,生动对比了传统“手工作坊”式开发与使用RPC框架的效率差异。他清晰地拆解了Thrift的四个使用步骤:定义接口文件、生成代码、实现服务端逻辑、编写客户端调用,让读者对工作流程一目了然。 教程的详尽之处在于,它系统地讲解了Thrift接口描述文件(IDL)的编写规范,包括基础类型、容器、结构体、异常和服务等核心元素的定义方式,并辅以代码示例。特别是对required/optional字段、oneway异步调用等细节的说明,为初学者扫清了常见困惑。对于想了解如何在Linux环境下搭建并利用Thrift构建高效、跨语言服务的开发者,这是一份条理清晰、实例丰富的入门指南。

本机暂存
IT DevOps/ 2013-11-01 13:51:46 / 累计浏览 1,247

MogileFS 复制不正常,发现文件少于指定的份数解决方法

这篇文章聚焦于一个MogileFS部署中的棘手故障:安装最新版后文件复制功能异常,副本数始终无法达到设定值。作者通过telnet监控发现replicate进程不断报错退出,日志显示“Child died: 256 (UNEXPECTED)”。 经过深度调试,作者定位到根本原因:Perl的Sys::Syscall模块升级至0.25版本后与新版MogileFS存在兼容性问题,导致底层复制操作失败。文章给出了明确的排查与解决路径:首先使用命令检查模块版本,确认是否为0.25;若是,则通过CPAN回退安装稳定的0.23版本即可恢复正常复制功能。此外,文章还补充提醒了最新客户端对数据库密码的硬性要求。 这是一次典型的、由依赖库升级引发的隐蔽故障排查记录。作者不仅详细描述了故障现象,更关键的是找到了那个“不兼容的精确版本”,并给出了可立即操作的修复命令,为同样遇到此问题的开发者节省了大量排错时间。

本机暂存
IT 前端/ 2013-10-29 23:07:34 / 累计浏览 2,405

(续)为什么很多技术合伙人参与创业时会先谈钱?

这篇回应文章深入探讨了前文引发的讨论,聚焦于技术合伙人参与创业时常被误解的三个核心问题。作者从实际的创业对接经验出发,澄清了几个常见误区。 首先,文章指出创业项目并不适合外包模式。因为创业产品的需求是动态且不确定的,需要持续的沟通和迭代,这与外包“需求明确、一次交付”的模式根本冲突。同时,愿意接受远低于市场薪资的人员,其合作心态也与外包截然不同。 其次,关于激情,作者认为技术人员的创业激情并非凭空设想而来,而是在产品上线、获得用户正向反馈的过程中逐步点燃的。这种基于逻辑和实际成果的激励,比空谈梦想更为持久和重要。 最后,文章探讨了技术合伙人的定位问题。创始人不能简单地将产品规划完全抛给技术方,双方容易因角色认知差异产生鸿沟。可行的方案是创始人学习制作产品原型,或引入产品合伙人作为桥梁,最终实现业务与技术视角的真正融合。 整体而言,文章并非否定谈钱,而是呼吁创业各方基于对彼此工作模式的深刻理解,建立更健康、对等的合伙关系。

本机暂存
IT 后端/ 2013-10-29 23:04:41 / 累计浏览 1,949

MooseFS之虚拟机惹的祸

这篇讲的是一个生产环境MooseFS集群的惊险故障复盘。国庆后,一台ChunkServer重启导致Master无响应几十分钟,整个集群瘫痪。排查日志发现,海量的“nonexistent chunk”错误日志打印是罪魁祸首。 作者深入源码分析,发现处理逻辑本身多为内存操作,问题出在单线程的Master进程调用syslog写磁盘这个操作上。通过对比线上和测试环境的TPS数据,性能差异达到惊人的65倍。最终锁定根因:运维此前将Master从物理机迁移到了虚拟机,而虚拟机的系统盘直接挂载在性能较差的网络iSCSI设备上,导致磁盘I/O成为致命瓶颈。 文章不仅给出了直接注释日志代码和迁移回物理机的解决方案,更提炼出关键经验:MooseFS Master的单线程架构对磁盘I/O极其敏感,一旦涉及磁盘写入就可能成为性能瓶颈,因此强烈不建议将其部署在虚拟机环境。作者还结合HDFS对比,指出了单线程设计在高并发场景下的局限性,为存储选型提供了直观参考。

本机暂存
IT 后端/ 2013-10-29 23:04:06 / 累计浏览 1,604

解决HDFS磁盘扫描导致死亡结点的问题

这篇讲的是作者在升级Hadoop至2.0后,处理的一个棘手的生产故障:集群中磁盘数量多的DataNode会周期性地变为“死亡结点”,虽未立刻影响业务,但一次双副本DataNode同时死亡导致了数据丢失。 问题排查的关键突破口在于“6小时”这个固定间隔。作者将它锁定为DataNode的周期性磁盘扫描任务,并通过jstack抓取堆栈发现了隐蔽的根因:在扫描过程中,数据块对比的步骤需要对核心的DataSet对象加锁,而该步骤中一个看似无害的`File.length()`方法调用,在底层会执行磁盘IO操作。在磁盘压力较大时,这个操作会耗时很长,导致DataSet锁被长时间持有,进而阻塞了心跳线程和所有数据传输线程,造成DataNode被NameNode误判为死亡。 解决方法巧妙且高效:将引发IO操作的`getlength`提前到第二步异步的磁盘扫描任务中执行,从而将持锁时间从几十分钟大幅缩短至2秒左右。文章完整还原了从现象观察、假设推翻到利用工具(jstack)锁定真凶的全过程,对理解分布式系统中锁竞争、IO影响以及复杂故障排查思路很有启发。最终,他们将修复补丁提交至了Apache社区(HDFS-5341)。

本机暂存