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

最新文章

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

IT 后端/ 2014-12-01 23:33:56 / 累计浏览 2,524

注意!PHP memcached扩展默认配置下无法自动failover

这篇讲的是PHP memcached扩展在默认配置下隐藏的一个严重隐患:当某个节点宕机时,它并不会如预期般自动failover,而是可能导致整个缓存读取失败。 作者从实际项目踩坑出发,通过在本地模拟两个memcache实例,生动演示了问题:关闭其中一个节点后,原本可以存取的数据返回了false。深入排查后发现,问题的根因在于memcached扩展默认使用的DISTRIBUTION_MODULA(取模)分发策略,结合底层libmemcached库的实现,不会触发自动剔除故障节点并重新选择host的关键操作。 解决方案是启用一致性哈希并显式开启自动故障转移功能。文章最终给出了有效的配置代码,核心在于设置`OPT_REMOVE_FAILED_SERVERS`选项(或旧版的`OPT_AUTO_EJECT_HOSTS`系列选项),并确保分布策略为`DISTRIBUTION_CONSISTENT`。这样,只要集群中还有一个健康节点,数据的存取就能得到保障,从而避免了线上环境中的潜在风险。文章通过源码分析,清晰地解释了为何默认配置会失效,具有很好的实践指导意义。

本机暂存
IT 后端/ 2014-12-01 23:25:43 / 累计浏览 4,653

一个echo引起的进程崩溃

这篇讲的是一个后台进程因简单 `echo` 语句而意外崩溃的真实案例。作者发现,通过 `&` 方式后台执行的PHP脚本,在SSH连接断开后常常莫名“死亡”,后续代码无法执行。 通过 `strace` 追踪系统调用,问题清晰浮现:进程尝试向标准输出(stdout)执行写操作(即 `echo`)时,返回了 `EIO`(输入/输出错误)。其根源在于Linux的会话管理机制——当用户SSH登录时,标准输入/输出/错误会绑定到一个伪终端(pty);而一旦退出登录,该终端的句柄会被置为不可读写状态。此时,后台进程若再向其写入,就会触发I/O错误,导致进程直接终止。 文章指出了两种有效的规避方法:一是使用 `> /dev/null 2>&1` 将输出重定向到空设备;二是推荐使用 `nohup` 命令运行进程,使其免疫终端信号的干扰。这个案例生动地提醒我们,在开发守护进程或长期运行任务时,妥善处理标准I/O流至关重要。

本机暂存
IT 后端/ 2014-12-01 23:21:26 / 累计浏览 1,332

【IPC通信】基于管道的popen和pclose函数

这篇讲的是C语言中errno的使用技巧,尤其关注如何将其转换为可读的错误信息。文章对比了strerror和perror两种主要方式:strerror可以将错误代码转换为字符串,方便与其他信息组合后输出到用户界面;而perror则能直接向标准错误流输出参数字符串和对应的错误原因,操作更为简便。 作者也指出了一个需要注意的地方:并非所有C库函数都会修改errno,例如gethostbyname函数。因此,正确的做法是仅在函数返回值表示异常时,再去检查errno的值。 文章进一步探讨了errno的线程安全性。通过引用系统头文件的内容,说明在现代Linux环境下,errno通常被实现为线程局部存储,从而确保了多线程环境下的安全。作者还提供了一段简单的代码,帮助读者自行验证当前编译器是否正确设置了相关宏定义,以确保errno行为符合预期。

本机暂存
IT 后端/ 2014-12-01 23:21:00 / 累计浏览 2,037

linux中c语言errno的使用

这篇讲的是Linux环境下C语言编程中errno的实战用法。作者从errno的基本特性切入,强调了它只在函数返回异常时才有意义,避免读者陷入盲目检查的误区。 文章的核心部分对比了两种将错误码转换为可读信息的方式:strerror函数允许将错误描述拼接到自定义输出中,适合构建详细的日志或用户提示;而perror函数则更直接,一行代码就能将错误消息附带到标准错误流。作者还提醒,并非所有库函数(如gethostbyname)都会设置errno,这是个容易忽略的细节。 针对errno在多线程编程中的可靠性,文章通过剖析errno.h头文件的宏定义,明确指出在启用可重入库(_LIBC_REENTRANT)的现代环境中,errno已被实现为线程局部变量,保证了安全性。最后附带的一段检测代码,让读者能轻松验证自己编译环境的相关定义是否生效。

本机暂存
IT 安全/ 2014-12-01 23:20:26 / 累计浏览 1,643

php中assert方法的安全问题

这篇讲的是PHP中`assert`函数的安全隐患。`assert`本是调试利器,当代码中的表达式为假时,它会发出警告而不中断执行,还能通过`ASSERT_CALLBACK`自定义处理逻辑,为调试提供了灵活控制。 然而,作者立刻点明:这种便利在生产环境中可能变成危险。`assert`的真正问题在于它会执行传入的字符串参数。文章通过一个直观的代码示例揭示了风险:若将未经验证的用户输入(`$_GET['func']`)直接拼接到`assert`语句中,攻击者就可能执行任意代码。例如,传入`func=file_put_contents('a.php','恶意内容')`,就会在服务器上创建文件,其危害可能比`eval`更严重。 因此,文章得出的明确结论是:`assert`仅适用于调试阶段。在部署到生产环境前,应当彻底禁用它,或确保其参数完全是可信的内部逻辑,从而杜绝因输入过滤疏忽而导致的严重漏洞。

本机暂存
IT 开发者/ 2014-12-01 23:19:58 / 累计浏览 2,539

那些和钱有关的事

这篇讲的是作者从腾讯离职创业后,对“钱”与“时间、服务、投资和决策”关系的深刻复盘。他通过自己装机、砍价外包、选择投资人、激励团队等亲身经历,提炼出几个反常识却至关重要的观点。 文章首先点破了“时间就是金钱”的真切感——为自己工作后,才发现半天时间创造的价值远超100块装机费。接着通过美术外包质量翻车的例子,揭示出购买服务时一味压价的陷阱:好服务的价格直接决定投入度与质量。在寻找投资时,他强调“拿谁的钱”比“有没有钱”更重要,价值观契合与避免“站队”是关键考量。最终,他总结出创业最大的挑战是如何“正确地花钱”,并用两个案例佐证:一笔额外的派驻费用解决了协作瓶颈,而一个镌刻名字的iPad比现金奖金带来了更好的团队激励效果。 对于正在创业或面临资源决策的读者,这些用真金白银换来的教训,提供了关于成本、价值和团队动力的务实视角。

本机暂存
IT 开发者/ 2014-12-01 23:17:06 / 累计浏览 5,885

emacs改变人生

这是一篇典型的个人观点与经验分享类文章。作者从自己从vim转向Emacs的经历出发,坦承标题“改变人生”带有夸张成分,但通过深入学习的过程,他重新诠释了“装逼”的正面内涵:即一种持续钻研、不安于现状的“折腾”精神。 作者详细描述了Emacs入门时面临的配置复杂、快捷键繁多等挑战,并以此引申出核心观点:在知识高度细分的现代社会,精深比泛学更重要。他认为,Emacs所代表的“折腾”过程——不断挖掘疑问、动手解决问题、打造个性化工作流——正是培养这种专精能力的体现。这种精神能带来持续的新鲜感,避免固步自封。 文章进一步将这种个人技能的学习,与理解世界运行的法则联系起来。作者以科技企业家多为程序员出身为例,指出通过编程(如同配置Emacs)制定规则的过程,也是构建个人认知系统、理解万物法则的方式。最终,文章以呼吁“不要放弃挣扎”收尾,将技术学习提升到了人生态度的层面。

本机暂存
IT 算法/ 2014-12-01 23:14:11 / 累计浏览 6,536

萃取(traits)编程技术的介绍和应用

这篇讲的是C++中一项优雅而实用的泛型编程技巧——萃取(traits)技术。作者从STL中迭代器与算法解耦的需求出发,首先展示了一个核心矛盾:为了让统一的算法(如find)既能作用于自定义容器迭代器,又能兼容原生指针(如int*),我们需要一种机制来统一获取迭代器所指对象的类型信息。文章清晰地介绍了如何通过`iterator_traits`这个中间层,结合模版偏特化来解决这一问题,使`int*`这样的原生指针也能被正确萃取出`value_type`。 接着,文章将这一思想从迭代器扩展到了更广阔的“类型萃取”领域。作者以SGI STL的`__type_traits`为例,说明了如何利用萃取技术探测类型特性(如是否有平凡的构造函数、析构函数)。通过为内置类型(如int)提供特化版本,算法(如copy)就能在运行时选择最高效的实现路径——比如直接进行内存拷贝而非调用复杂的构造函数,从而显著提升性能。 文章从具体问题切入,逐步抽象出“特性萃取”的通用编程模式,最后落脚于其对C++泛型库性能优化的实际价值,展示了如何通过编译期的类型信息提取来弥补语言本身的局限。

本机暂存
IT 移动开发/ 2014-12-01 23:10:39 / 累计浏览 7,592

App的成本

这篇讲的是开发一款App背后隐藏的、远超想象的成本账。作者以iPhone版为例,拆解了从团队组建到运营推广的全过程。最小团队配置也需要后端、客户端、UI和产品经理各一人,但实际组建一支合格团队的时间成本极高,往往是项目最大的隐形支出。从开发到产品稳定,通常需要1-3个季度。 然而,真正的“成本无底洞”在于后续运营。作者指出,分发渠道依赖、社交传播的不确定性、产品生命周期短暂,以及大公司的快速复制,都意味着产品必须依靠持续的营销投入才能存活,这笔费用可能是初期人力成本的数倍。这种高投入、高风险的模式,迫使绝大多数应用追求“做大”,反而导致了产品同质化,抑制了市场创新。 文章最后,作者反思了行业“输不起”的创新困境,并预告将推动一系列不求商业价值、但求创意绽放的小型应用项目。这不仅是对现状的犀利剖析,也提出了另一种可能性:在追求规模之外,产品开发也可以是一场激发创造力的游戏。

本机暂存
IT 后端/ 2014-11-30 23:55:53 / 累计浏览 7,096

Linux C语言编程学习材料

这篇整理了Linux C语言编程从入门到精通的完整学习路径。它把资源清晰地划分成三个阶段:快速入门用《Linux C编程一站式学习》打基础,长期深耕则推荐了C Primer Plus、经典数据结构教材以及APUE等“圣经”级著作。最硬核的部分在于高级网络编程资源,不仅覆盖了《Linux高性能服务器编程》等通用指南,还深入到Apache、Nginx的模块源码分析,以及MySQL内核、Redis实现剖析等具体高性能组件的“深水区”。 作者显然意图为志在开发高性能后端的工程师,构建一个从语言基础、系统编程到具体中间件实现的扎实知识栈。资料列表兼顾了经典纸质书与电子文档,尤其像Redis源码分析系列博客、PHP内核手册等,提供了贴近工程实践的切入点。整份清单像一份精心设计的“技术地图”,让学习者能按图索骥,逐步构建起支撑大规模服务的底层能力体系。

本机暂存
IT 开发者/ 2014-11-30 23:54:32 / 累计浏览 4,148

程序员的“横向发展”

这篇讲的是程序员除了深度与广度之外常被忽视的第三维度——“横向发展”。作者以亲身经历切入:初入职场时,他以为程序算出正确结果就完成了任务,却被项目经理批评未处理网络异常等现实问题。这让他意识到,学校里学的“技术化”编程与生产环境所需的“工业化”要求之间存在巨大鸿沟。 横向发展的核心,是让程序真正健壮可用。它不追求算法更快或语言更多,而是关注异常处理、持续监控、状态记录和故障可诊断性。作者观察到,许多程序员却讨厌这类工作,认为这是“找麻烦”,导致线上程序如同“豆芽菜”般脆弱——不记录运行状态,出了问题无法快速定位,陷入重复排障的循环。 文章指出,与其一味钻研新工具,不如先补上这关键一课:给程序加上“重心”,让它在真实复杂的世界中稳定站立。

本机暂存
IT 数据库/ 2014-11-30 23:48:52 / 累计浏览 2,100

深入剖析 redis 数据结构 redisObject

这篇讲的是Redis核心数据结构redisObject的设计。它只有32位,却极其高效地管理了所有类型的数据对象。 作者从结构体定义出发,揭示了它的精巧布局:type字段明确是字符串、列表还是哈希等类型;encoding字段则决定了底层是用普通字符串、压缩列表还是跳表来存储——同一个类型的数据可以有多种编码,Redis会根据数据规模自动选择最省内存的方案。比如一个小的集合可能用整数集合,变大了就切换为哈希表。 文章还详解了lru字段如何用于内存淘汰,以及refcount引用计数如何管理对象生命周期。最后那个void *ptr指针,才是真正指向数据的地方。 作者特别指出,得益于Redis单线程模型,引用计数的操作无需考虑线程安全,这是与Memcached等多线程系统的重要区别。整个设计将数据与元数据分离,各个字段职责清晰,正是Redis高效与灵活的重要基石。

本机暂存
IT 数据库/ 2014-11-30 23:48:02 / 累计浏览 4,347

深入剖析 redis replication 主从连接

这篇讲的是Redis主从复制机制的底层实现,特别是积压空间(repl_backlog)的设计与作用。 文章从主从架构的概述切入,指出其支持灵活的DAG拓扑以实现数据弱一致性。核心剖析聚焦于“积压空间”这一关键数据结构:它本质上是一个环形缓冲区,用于暂存数据变更记录。作者通过源码追踪,清晰展示了变更记录的写入路径:当命令执行修改了数据后,会经由 `call() -> propagate() -> replicationFeedSlaves()` 链路,最终被同时写入积压空间并分发给所有在线从机。 文章巧妙地解释了这种“双重写入”的设计意图:积压空间是为那些因故障断开连接的从机准备的。这些从机重连后,可以优先从这个环形缓冲区中获取断开期间错过的数据变更,进行高效的增量同步(部分同步),而非每次都进行全量同步。只有当断开时间过长,缓冲区无法覆盖时,才会退化为全同步。 通过对核心数据结构(如 `repl_backlog_size`, `repl_backlog_idx` 等)和关键函数的源码解读,文章深入浅出地揭示了Redis如何在保证实时同步的同时,优雅地处理节点故障恢复的场景,展现了其在工程实现上的细腻考量。

本机暂存
IT 数据库/ 2014-11-30 23:39:36 / 累计浏览 3,895

深入剖析 redis RDB 持久化策略

这篇讲的是 Redis RDB 持久化的底层实现。作者从 RDB 与 AOF 的基本概念切入,随后迅速深入核心,剖析了负责持久化 IO 操作的关键数据结构 `struct rio`。 文章的亮点在于对 `rio` 结构的拆解。它巧妙地通过函数指针(如 `read`、`write`)抽象了读写行为,并用一个 `union` 联合体统一了对内存缓冲区和文件的处理,使得一套代码能同时服务于内存缓存和磁盘文件两种场景,设计上颇具巧思。 接着,作者以 `rdbSave()` 函数为主线,通过代码注释的方式,清晰地勾勒出整个 RDB 写文件的流程:从创建临时文件、初始化 `rio` 结构,到遍历每个数据库、写入操作码和数据项。这个过程不仅解释了数据是如何被序列化到磁盘的,也揭示了 BGSAVE 等后台操作的基础——主进程 `fork` 出子进程来执行这个主逻辑,从而避免阻塞服务。 对于想了解 Redis 如何将内存数据“快照”到硬盘的开发者而言,这篇文章提供了一个从数据结构到执行流程的清晰视角。

本机暂存
IT 后端/ 2014-11-30 23:36:04 / 累计浏览 3,104

Django 源码小剖: Django ORM 查询管理器

这篇讲的是 Django ORM 中 `Book.objects` 这类查询入口背后的精巧设计。我们平时写 `Book.objects.filter()` 只图方便,但作者从源码出发,揭示了这行简单代码背后隐藏的机制。 文章首先点明,`objects` 并非 Model 类自带的属性,而是在 Django 启动时,通过 `ensure_default_manager` 函数动态“挂”上去的。真正的查询逻辑由 `Manager` 类承担。 但更巧妙的是 Django 的“保护技法”:`objects` 属性实际上是一个 `ManagerDescriptor` 描述符的实例。它利用 Python 的描述符协议,在 `__get__` 方法中判断访问者是类还是类实例。如果误在对象实例上调用 `book_obj.objects`,会直接抛出 `AttributeError`,确保了语义正确——查询只能从“类”这个集合概念发起,而非从单个数据实例。 作者通过剖析这一层包装,清晰地展现了 Django 如何在工程细节上贯彻设计原则,让 ORM 接口既简洁又严谨。他在 GitHub 上维护的 Django 源码注释项目,也为想深入探索的开发者提供了很好的路径。

本机暂存
IT 后端/ 2014-11-30 23:34:30 / 累计浏览 5,402

memcached 源码阅读笔记

这篇讲的是作者深入阅读 memcached 源码后梳理出的核心流程。作者从程序的入口函数 `main()` 出发,剖析了 memcached 如何基于 libevent 构建起高效的事件驱动模型。初始化过程涉及事件中心、内部数据结构、空闲连接池以及工作线程的创建与配置。 文章重点分析了 memcached 两种可配置的服务模式:UNIX 域套接字与 TCP/UDP。前者在本地通信中性能更优,后者则提供了更通用的网络接入能力。两者通过注册 `event_handler()` 回调来处理客户端连接。 在多线程协作方面,文章揭示了一个巧妙的设计:每个工作线程拥有独立的连接队列(CQ)和 libevent 事件中心,并通过创建读写管道进行线程唤醒。主线程通过 `dispatch_conn_new()` 将新连接分发到指定线程的队列,工作线程则监听管道事件,按需取出并执行任务。这种基于事件驱动和管道通信的线程调度机制,保证了高并发下的处理效率。 作者从全局到细节,清晰展现了 memcached 如何用简洁的 C 代码,借助 libevent 实现了一个高性能、多线程的网络服务框架。

本机暂存
IT 安全/ 2014-11-30 23:33:23 / 累计浏览 10,622

初探单点登录 SSO

这篇讲的是单点登录(SSO)的基本原理,并通过淘宝与京东的实例,对比了两种主流实现策略的差异。 文章先阐释了SSO如何解决多产品线下的用户体验问题,即“一次登录,处处通行”。其核心在于认证系统为每个应用颁发“钥匙”(存于Cookie)。关键差异在于应用间如何获取这把钥匙。 作者通过抓包分析揭示了两种路径:淘宝的策略更偏向“后置式”,用户访问聚划算等未登录站点时,通过一系列跳转,由主站(taobao.com)的凭证去认证中心为当前站点领取新凭证。而京东的策略则是“前置式”,用户登录主站(jd.com)后,页面中的JS代码会立即通过JSONP跨域请求,主动为旗下所有子应用预置好登录凭证,实现更无缝的体验。 这种基于实际网络请求的剖析,清晰展示了SSO在“便利性”与“安全流程”之间的权衡,对于理解企业级统一认证架构的设计思路很有启发。

本机暂存
IT DevOps/ 2014-11-30 23:28:07 / 累计浏览 3,035

实用命令行工具详解(五)—crontab

这篇讲的是Linux系统里“定时任务”的核心工具——crontab。文章从crontab的基础概念和命令格式讲起,比如常见的-l(查看)、-e(编辑)、-r(删除)等操作。 但真正的干货在后半部分的应用实例。作者没有停留在理论,而是直接给出了大量贴近实战的crontab写法,从“每晚21:30重启Apache”到“每周一到周五下午5点发邮件”,覆盖了日常运维和开发中高频出现的定时需求。特别是对时间字段(分、时、日、月、周)的各种灵活组合进行了拆解,例如“0 23-7/2,8 * * *”这种稍显复杂的表达式,都附有清晰的说明。 通过这些具体例子,文章把抽象的cron表达式变得具体可见,非常适合需要快速查阅或学习如何编写定时任务的读者。

本机暂存
IT DevOps/ 2014-11-30 23:27:39 / 累计浏览 2,303

实用命令行工具详解(四)—netcat

这篇讲的是Linux下的网络调试利器netcat(简称nc),它被称作“网络工具中的瑞士军刀”,能通过TCP和UDP在网络中读写数据。文章具体拆解了它的三个实用场景:建立监听端口进行基础通信、利用管道实现文件快速传输,以及通过-w参数设置连接超时以控制会话时长。每个场景都提供了清晰的客户端与服务器端命令示例,比如用`cat local | nc localhost 9999`来推送文件内容,或用`nc -w 10`来自动中断空闲连接。这些例子展示了如何将netcat与重定向、管道结合,在脚本或临时调试中灵活使用。

本机暂存
IT DevOps/ 2014-11-30 23:27:11 / 累计浏览 2,574

实用命令行工具详解(三)—ngrep

这篇文章介绍的是一个实用的网络抓包工具——ngrep。当httpclient请求出现线上问题却难以直接调试时,ngrep提供了一种轻量、高效的抓包分析方案。 与经典的tcpdump相比,ngrep更像是网络版的grep。它聚焦于“搜索”特定数据包内容这一核心功能,依赖libpcap库,能识别TCP、UDP等主流协议。对于开发者而言,它的最大优势在于简单直接:可以用类正则表达式直接匹配数据包中的文本内容。 文章通过一个捕获HTTP POST请求的实例,展示了ngrep的典型用法。例如,使用`sudo ngrep -q -W byline "(POST).*"`命令,就能快速过滤出所有POST请求,并清晰显示其完整的Header和Body内容,这对分析接口调用问题非常直观。文中还详细解读了各个参数,如`-q`静默模式、`-W byline`格式化显示、`-d`指定网卡等,帮助读者按需组合,精准定位问题流量。 总的来说,ngrep将强大的grep理念带入了网络诊断领域。对于需要在线上环境快速排查HTTP请求异常、进行轻量级协议分析的场景,它是一个上手快、效率高的得力工具。

本机暂存