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

最新文章

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

IT DevOps/ 2015-04-08 13:41:50 / 累计浏览 3,175

开发者的黄金时代=运维人员的恶梦?

这篇文章从DevOps盛行的背景出发,探讨了软件开发环境巨变下开发与运维角色面临的不同境遇。 作者指出,过去十年,开源和云服务的兴起彻底改变了开发者的工具箱。他们不再受限于昂贵、整合慢的传统大型软件,而是可以根据需求自由选择免费、灵活的各类工具(如Redis、Elasticsearch等),实现了更快的集成与持续部署,产品迭代效率大幅提升,这正是“开发者的黄金时代”。 然而,工具的丰富与分工也为运维带来了“恶梦”。变更速度的加快意味着监控与响应需求激增;而由大量独立工具构成的现代基础设施,使得可移动部分增多、依赖关系复杂,导致“报警疲劳”。数据显示,运维人员多达50%—70%的时间可能被消耗在应对各类警报上,影响了其构建核心基础设施的工作。 文章最终落脚于,这种矛盾正推动DevOps模式的深化。它强调打破开发与运维的壁垒,通过建立共同的关系、流程与工具来协作应对挑战,从而更高效地创造商业价值。

本机暂存
IT 安全/ 2015-04-08 00:07:03 / 累计浏览 2,674

文件权限之粘滞位

这篇讲的是Unix/Linux系统中一个具体而微小的技术点:粘滞位(Sticky Bit)在可执行文件上的行为。作者从一个实际问题出发——如果给一个root属主的可执行文件设置了粘滞位,那么由它派生的其他进程,其有效用户ID(euid)还会是root吗? 为了验证,作者编写了一个简单的PHP脚本(test.php),其核心就是输出当前进程的euid和uid。随后,他通过给这个脚本文件设置粘滞位并以root身份执行来观察结果。测试发现,新进程的euid并没有如预期那样保持为root。 由此得出一个明确的结论:粘滞位(即使在可执行文件上)并不能在程序执行后被其创建的其他进程所继承。这个发现澄清了对文件权限位作用范围的一个常见误解。

本机暂存
IT DevOps/ 2015-04-08 00:06:09 / 累计浏览 3,047

Linux下使用rsync进行数据备份的命令详解

这篇讲的是运维中不可或缺的rsync数据备份工具。文章从rsync的核心优势切入——它通过只传输变化部分来节省带宽,利用SSH加密保障安全,并支持压缩传输。 作者没有停留在理论,而是直接通过六个具体命令示例,手把手展示了rsync的灵活应用。从最基础的本地目录同步与压缩选项(-zvr),到用“-a”参数保留所有文件属性,再扩展到跨机器的双向同步:既可将本地文件推送到远程服务器,也能将远程数据拉回本地。 文章还特别演示了如何用rsync比对源与目标间的文件差异,这对于确认同步状态非常实用。最后,示例展示了如何将rsync命令写入cron任务,实现自动化的定时备份。 整篇文章就像一份实战指南,把rsync从简单的复制工具提升到了可靠、高效的数据同步与备份方案,非常适合需要快速掌握rsync实际用法的运维人员参考。

本机暂存
IT 开发者/ 2015-04-08 00:05:30 / 累计浏览 9,686

你真的了解try{ return }finally{}中的return?

这篇文章从论坛上的一个经典问题出发,探讨了Java中`try`块内的`return`语句与`finally`块交互时一个看似反直觉的行为:为什么一段简单的代码最终返回的是2而不是3? 作者没有停留在表面结论,而是层层深入,像侦探一样剖析了整个执行流程。文章首先抛出了一连串关键问题:`try`中`return`后`finally`还会执行吗?执行顺序又是什么?接着,作者查阅了Java官方教程和JVM规范,明确指出`finally`块总会执行,并且是在方法实际返回控制权之前执行。为了验证这一点,文章通过IDE的调试模式,逐帧展示了变量`x`如何从1变为2,再在`finally`中变为3,最后却返回2的全过程。 真正的谜底藏在JVM的底层机制里:当执行`try`中的`return ++x`时,JVM会先计算返回值(即2),并将其保存在局部变量中,然后再去执行`finally`块。`finally`执行后,方法最终返回的是之前缓存的那个值,而不是被`finally`修改后的当前变量值。文章最后甚至通过分析字节码指令来巩固这一结论。对于任何想透彻理解Java异常处理与返回值机制细节的开发者来说,这篇文章都提供了一次清晰而深入的“解剖”示范。

本机暂存
IT 后端/ 2015-04-08 00:03:59 / 累计浏览 1,437

php正则修饰符整理

这篇讲的是PHP正则表达式中那些容易被忽略却至关重要的修饰符。作者从实际开发经验出发,系统梳理了i、m、s、x、e、U等十余个修饰符的功能与适用场景。 文章重点辨析了几个常用修饰符的关键差异:比如`i`忽略大小写、`m`让`^`和`$`能匹配行首行尾、`s`让点号能匹配换行符、`e`则允许对匹配结果执行代码。同时,它也提醒了一些注意事项,例如在启用`m`时`D`修饰符会被忽略。 特别值得关注的是,作者指出了`u`修饰符(强制UTF-8编码)在UTF-8环境中可能引发特定Bug,并给出了相关警告。这些细节是理解PHP正则底层行为的关键。 虽然这些修饰符在日常开发中未必频繁使用,但精准理解它们,能让你在处理复杂文本匹配时写出更简洁、高效的正则表达式。

本机暂存
IT DevOps/ 2015-04-08 00:02:39 / 累计浏览 3,365

使用 Grafana+collectd+InfluxDB 打造现代监控系统

这篇技术文章介绍了一套完整的监控系统搭建方案,目标是使用开源工具组合出类似New Relic的实时可视化监控效果。其核心架构思路是让数据流依次经过采集、存储、展示三个环节,分别由collectd、InfluxDB和Grafana这三个各司其职的组件完成。 文章详细阐述了三者的分工与集成:collectd作为轻量级性能采集工具负责收集各类系统指标;InfluxDB作为专为指标数据设计的时序数据库,负责高效存储这些数据;最后,Grafana这个前端可视化工具连接InfluxDB,将数据转化为直观的仪表盘和图表。文章并没有停留在概念层面,而是给出了在Ubuntu系统上从零开始的具体部署指南。它逐步演示了如何安装配置InfluxDB,创建数据库,并启用其内置的collectd插件来直接接收数据流,省去了以往需要第三方代理的麻烦。同时,也清晰地说明了collectd客户端如何配置以将数据发送到指定服务器,以及Grafana如何连接数据源并启动。 通过这套方案,运维或开发团队可以摆脱昂贵的商业监控软件,利用成熟开源组件快速搭建起一套功能完备、数据实时刷新的监控平台,实现对服务器性能的深入洞察与管理。

本机暂存
IT DevOps/ 2015-04-08 00:01:25 / 累计浏览 8,195

Linux shell脚本使用while循环执行ssh的注意事项

当用while循环结合ssh批量处理服务器时,很多人会遇到脚本在首个任务后意外终止的诡异问题。这篇文章就针对这个经典“坑”,做了一次透彻的拆解。 问题现象很明确:一个用于批量获取服务器运行时间的脚本,在循环中调用ssh命令后,只处理了第一个IP就退出了。作者分析了根因——while循环通过重定向读取IP列表文件,但ssh命令会“吃掉”这个输入缓冲区,导致循环体内部的read命令无数据可读,循环因此提前结束。 解决这个坑提供了两种清晰的思路。一种是“换条路走”,直接将while循环改为for循环,因为for循环是逐词解析命令输出,不会预加载整个文件,从而避免了输入流被ssh截获。另一种是“原路修复”,在ssh命令后加上-n参数,该参数会明确禁止ssh从标准输入读取数据(等同于将输入重定向到/dev/null),从而“归还”了被占用的输入流,让while循环能正常推进。文章给出了具体的代码示例,是一个非常实用的填坑指南。

本机暂存
IT DevOps/ 2015-04-08 00:00:34 / 累计浏览 4,087

运维不得不知的 Linux 性能监控、测试、优化工具

系统性能专家 Brendan Gregg 在 LinuxCon NA 2014 大会上,更新了他关于 Linux 性能分析的经典演讲。这篇介绍正是基于他分享的最新内容,旨在为运维人员梳理一套实用工具集。 面对纷繁的 Linux 性能工具,Brendan Gregg 提出了一个朴素的观点:最好用的往往是那些久经考验、简单直接的小工具。文章的核心内容,就是三张清晰分类的工具全景图,分别对应性能工作的三个关键环节:监控、测试与优化。 具体来说,文章通过三张图表系统性地覆盖了 Linux 各个子系统(如 CPU、内存、磁盘 I/O、网络)在不同场景下可选用的工具。第一张图聚焦于系统可观测性,列举了用于实时监控和诊断问题的工具;第二张图总结了进行性能基准测试与评估的工具;第三张图则归纳了用于系统调优与参数设置的工具。这种结构化的梳理,直接解决了“该用哪个工具”的常见困惑。 这套工具的价值在于其历经实战检验,专注于解决具体问题。对于需要快速定位性能瓶颈或优化系统的运维人员而言,这相当于获得了一份经过专家认证的“工具菜单”,能帮助他们从眼花缭乱的选项中,高效地找到合适的武器。

本机暂存
IT DevOps/ 2015-04-07 23:56:44 / 累计浏览 3,645

Linux,du、df统计的硬盘使用情况不一致问题

在Linux服务器上用`du`统计目录大小只有2G,但`df`显示硬盘却已占用3G甚至更多,这种不一致让不少运维同学困惑过。这篇文章就系统地拆解了背后的三大元凶。 首先是ext文件系统预留的“急救空间”。这部分空间`df`会计入已用,但`du`完全感知不到,作者指明了如何用`tune2fs`查看和调整这个数值。 其次是“幻影文件”。当文件被删除但进程句柄未释放时,`du`已经不统计它了,但磁盘块仍被`df`计算在内。文中给出了通过`lsof`查找这类文件并处理进程的方法。 最隐蔽的是第三种情况:在目录挂载新设备前,如果其中已有数据,这些数据会被“隐藏”——`du`和`df`在新设备上都看不见它们,但它们实实在在占用了原设备的空间。文章详细说明了如何安全地卸载、清理这些残留数据。 这篇文章从运维中一个看似小、却容易让人卡住的矛盾点切入,清晰梳理了原理和排障路径。理解了这些机制,下次再遇到`du`和`df`“打架”,你就能快速定位是哪一种情况,并对症处理了。

本机暂存
IT 后端/ 2015-03-26 13:50:18 / 累计浏览 2,983

socket消息流程介绍及其C代码实现

这篇讲的是如何用C语言完整实现一个Linux下的TCP服务器,清晰地展示了socket通信从创建到结束的全过程。作者通过一个具体的程序示例,逐步拆解了socket编程的核心流程:首先创建socket并绑定指定的IP与端口,其中还设置了SO_REUSEADDR选项来处理端口复用;接着启动监听,循环接受客户端连接;最后接收指令、执行操作并返回结果。代码中对每个环节都加入了错误处理和状态反馈,使得流程健壮且逻辑清晰。文末还附上了makefile编译脚本和通过工具测试的运行结果,让读者能直观地看到“发送-接收-响应”的完整交互。对于想要理解底层网络编程细节的开发者来说,这篇从代码到理论再到实践的梳理,提供了一个非常扎实的参考范例。

本机暂存
IT DevOps/ 2015-03-26 13:36:06 / 累计浏览 2,924

Nginx带宽控制

这篇讲的是作者如何用Nginx替代Squid来实现文件下载的带宽控制。他首先介绍了Nginx自带的 `limit_rate` 和 `limit_rate_after` 指令,可以轻松设置“下载超过500KB后限速50KB/s”的规则。 但挑战在于,这是单连接限速。如果想控制总带宽(比如总出口100M),单纯限制每个连接速度并不够灵活,无法应对用户数变化带来的动态调整。为此,文章组合使用了 `limit_conn` 模块来限制并发连接数,从而变相控制总带宽,并分析了这种方案的局限性。 文章还探讨了更根本的解决方案:使用第三方 `limit_speed` 模块,或者借助Linux底层强大的TC命令进行流量整形(尽管配置复杂)。结尾处,作者推荐了功能相关但场景不同的 `limit_req` 模块。整体来看,文章从一个实际需求出发,梳理了Nginx在带宽控制方面的多种能力与边界,提供了不同复杂度下的实践思路。

本机暂存
IT 数据库/ 2015-03-26 13:34:46 / 累计浏览 3,978

Hermes:来自腾讯的实时检索分析平台

这篇讲的是腾讯数据平台部推出的实时检索分析平台Hermes。它瞄准的是一个非常具体的痛点:当数据量达到千亿级别、维度上万时,如何还能做到秒级响应的多维交互式分析。 Hermes为营销分析、系统运维监控、长期趋势分析以及探索性分析等场景提供了一套完整方案。它的核心思路在于,针对海量数据重新设计了存储和计算引擎。例如,通过嵌套列存储、位图计算、前缀压缩等技术,有效规避了传统数据库和早期搜索引擎在超大规模索引下内存消耗大、扩容困难、恢复慢的问题。文章特别将Hermes与Solr、ElasticSearch做了定位对比:后者更擅长小规模数据的全文检索,而Hermes则为亿级到万亿级的数据仓库提供索引支持与即席分析能力,旨在成为数据仓库的高效分析层。 本质上,Hermes是在大数据领域,为“即查即所见”的敏捷分析体验提供的一个经过生产验证的基础设施选型参考。

本机暂存
IT 算法/ 2015-03-26 13:32:57 / 累计浏览 2,237

流式布局的原理和代码实现

这篇文章深入解析了流式布局的核心原理与代码实现,适合GUI开发者和前端工程师阅读。作者从最简单的布局模型出发,即控件靠左、靠右或堆叠排列,提出使用两个栈(Stack)数据结构——一个管理靠左控件的位置,另一个管理靠右控件——来高效实现流式布局。伪代码清晰展示了布局管理器的工作流程:当放置新控件时,先检查当前空间是否足够;若不够,则根据浮动方向从对应栈中弹出更高位置的控件来释放空间,确保布局不重叠。 文章重点讨论了两个实现关键:一是控件变化时的级联重布局,从子节点一直传递到根节点,这虽然简单但性能开销

本机暂存
IT 数据库/ 2015-03-26 13:32:09 / 累计浏览 2,784

如何统计Redis中各种数据的大小

这篇讲的是 Redis 内存占用分析的一个轻量级自定义方案。作者从一个常见的痛点出发:Redis 内存变大后,不像 MySQL 能轻易定位到具体是哪些“大表”,很难快速找出到底是哪些键占用了主要空间。 现有的分析工具如 redis-rdb-tools 可能无法满足所有定制化需求。为此,作者展示了如何仅用 SCAN 和 DEBUG 这类 Redis 原生命令,编写一个简短的脚本,就能实现按自定义模式统计键大小的功能。其核心思路是通过 SCAN 遍历所有键,利用 DEBUG OBJECT 获取每个键的序列化长度,再按照预定义的正则表达式模式进行分类和累加。这种方法非常灵活,你可以轻松定义比如“用户Session”、“缓存数据”等业务维度来查看各类数据的内存占比。 文章也补充了两个实用要点:一是可以通过 MONITOR 命令配合分析,来初步总结出可能的键命名模式;二是需要明白 DEBUG 返回的序列化长度(serializedlength)会比实际内存占用小,但作为相对大小的参考指标依然有效。

本机暂存
IT 后端/ 2015-02-26 22:43:07 / 累计浏览 2,201

java中文乱码解决之道(八)—–解决URL中文乱码问题

你是否在Java开发中,被URL传递中文参数时出现的“问号”乱码困扰过?这篇文章专门拆解这个棘手问题。作者指出,相比于表单提交,URL编码因涉及浏览器、操作系统和字符集等多种因素,情况更为复杂。核心解决思路是**主动控制编码**,避免浏览器“自由发挥”。 文章主要提供了两种实战方案。一是通过JavaScript前端编码,使用 `encodeURI` 等方法在请求发出前就对中文进行标准化处理,文章还详细对比了一次转码和二次转码在Java后台的解码方式差异。二是在服务端使用Filter过滤器,无论是直接设置请求编码格式,还是在过滤器中自动完成反编码并重新封装请求,都能有效拦截和处理乱码。每种方案都附有具体代码和配置示例,可直接复用。 无论你是正在排查此类问题,还是想从源头建立规范,文中这些经过验证的方法,能帮你一劳永逸地搞定URL中文乱码。

本机暂存
IT 后端/ 2015-02-26 22:41:33 / 累计浏览 1,760

java中文乱码解决之道(七)—–JSP页面编码过程

这篇讲的是JSP页面开发中那个让人头疼的中文乱码问题,尤其是根源常常藏在JSP转换为Servlet的编码过程里。作者直接拆解了关键指令页中的两个编码参数:`pageEncoding`(JSP文件本身的编码)和`contentType`的`charset`(发送给客户端的编码)。 文章核心梳理了转换过程的三次编码“变阵”:第一次JVM编译.jsp文件时,会依据`pageEncoding`或默认编码来读取源码;第二次生成.class文件时,所有内容都被统一转换成Unicode,之前的编码设置在此阶段无效;第三次业务处理后输出到浏览器,则由`contentType`的`charset`决定解码方式,否则会退回默认的ISO-8859-1。 所以,中文乱码的伏笔其实在这几个阶段的配合中早已埋下。搞清楚每个阶段谁说了算,才能在实际开发中精准配置,避免字符“南辕北辙”。

本机暂存
IT 数据库/ 2015-02-26 22:36:24 / 累计浏览 1,650

kvproxy配置文件之集群设置

这篇讲的是kvproxy配置文件中集群设置的具体方法和注意事项。作者开篇就点明了kvproxy集群分为三种:默认集群、读集群和备份集群,后两者都是可选的,各自承担读写分离与数据同步的职责。 文章重点解析了几个核心配置要点:集群名可自定义,但同一集群内的数字id必须唯一,它作为实例标识在更换节点时能确保数据路由的一致性;权重数值并非百分比,而是代表实例在一致性哈希环中的虚拟节点数,数值越大承载的数据通常越多。 为了让概念更具体,作者提供了一个memcached集群配置实例。其中清晰展示了如何通过设置`hosts`、`hosts_backup`和`hosts_read`来分别指定默认、备份和读集群,并详细列出了每个集群成员的IP、端口、ID和权重。通过这个配置,读请求会由`read`集群处理,所有写操作则会同步到`slave`备份集群,从而实现了基本的读写分离和数据备份。整个讲解从概念到实践,条理清晰。

本机暂存
IT 数据库/ 2015-02-26 22:35:56 / 累计浏览 1,559

kvproxy的数据主从复制简介

这篇讲的是如何为Memcached缺少的数据主从同步能力打上补丁。 作者从Memcached用户在多集群部署时面临的数据一致性痛点出发,介绍了kvproxy提供的一个核心功能:通过主从复制实现集群间的数据同步。文章没有停留在概念层面,而是直接拆解了典型场景,比如应对单点故障做热备份,以及跨机房部署时减少网络延迟。 核心方案是让kvproxy代理层支持同步与异步两种复制策略。同步复制保证强一致但增加延迟,异步复制响应快但数据有滞后。文章很细致地指出了如何通过配置文件设置主从集群、指定复制策略前缀,比如让以“+”开头的Key强制走同步通道。 这相当于在缓存层引入了一个可控的数据同步管道,对于既想用Memcached高性能、又需要一定可靠性的团队,提供了一个具体的参考实现路径。

本机暂存
IT 前端/ 2015-02-26 22:30:04 / 累计浏览 1,995

CSS中height:100%和height:inherit的异同

这篇讲的是CSS中`height:100%`与`height:inherit`看似简单却容易被忽略的差异。作者从日常编码中的一个小吐槽切入,对比了两者的兼容性与核心行为。 多数情况下,两者表现一致:父容器定高时继承相同高度,父容器高度为auto时则同为auto。但真正的关键差异出现在子元素为绝对定位,且父容器未设置定位(position为static)的场景。此时,`height:100%`会寻找已定位的祖先元素,导致高度计算异常;而`height:inherit`则忠实地继承父元素的高度,即使父元素没有定位特性。 文章附带的在线演示清晰地展现了这种区别:使用`height:100%`的元素“深入地域”,而使用`height:inherit`的元素则完美自适应父级。这个特性在避免复杂布局中滥用`position: relative`以防止层级混乱时,显得尤为实用。

本机暂存
IT 后端/ 2015-02-26 22:29:04 / 累计浏览 1,610

Plack 代码和结构分析-PSGI Application Architecture[译]

这篇文章深入剖析了Perl Web框架Plack的核心架构,重点解读了基于PSGI规范的应用构建方式。作者从PSGI应用的基本定义出发——它本质上是一个接收环境哈希并返回状态、头部、正文三元组的代码块——进而阐明了Plack中最精妙的“洋葱模型”设计。 文中具体展示了中间件如何通过`wrap`方法层层封装核心应用,形成可叠加的处理链。例如,请求会从最外层的中间件C进入,依次经过B、A,最终到达应用核心,响应则反向穿过中间件层返回。这种事件驱动的链式回调结构,使得功能模块(如日志、认证)能以解耦的方式灵活组合。 此外,文章还区分了`Plack::Middleware`和`Plack::Component`的角色,指出后者为创建更复杂的应用组件提供了便捷接口,但核心PSGI应用依然可以保持简洁的代码引用形式。对于想理解Plack如何将简单内核扩展为强大生态的读者,这篇源码级的分析提供了清晰的实现路径。

本机暂存