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

最新文章

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

IT 前端/ 2012-12-14 14:07:00 / 累计浏览 4,044

取得当前script元素的src(path)

这篇讲的是如何在浏览器中准确获取当前正在执行的 script 元素的路径。作者从标准方案切入,介绍了 document.currentScript 这一便捷的 API,它不仅能拿到 src,还能区分脚本是同步还是异步加载。 不过,文章的重点落在了 IE 浏览器的“坑”上。当通过 document.write 动态插入多个 script 标签时,IE 下的 script readyState 状态与标准浏览器不同。例如,在一个由 a.js 动态写入 a.a.js 和 a.b.js 的场景中,a.a.js 通过 readyState 查找可能意外获取到 a.b.js 的路径,而其他浏览器则能正确识别自身。这揭示了 IE 独特的加载与执行机制:即便脚本已下载完成(loaded),其执行流程仍可能保持阻塞。 因此,作者提供了一个兼容函数,通过检查 document.currentScript 是否存在来降级,并针对 IE 实现了基于 readyState 的回退逻辑。文章通过这个具体的细节对比,点明了不同浏览器在脚本加载行为上的核心差异,对处理动态脚本场景的开发者有很强的实操参考意义。

本机暂存
IT 设计/ 2012-12-14 13:51:02 / 累计浏览 4,570

如此理解面向对象编程

这篇讲的是面向对象编程(OOP)可能被误解和滥用的问题。作者从一个打印操作系统信息的简单需求出发,展示了代码从最直接的“黑客方案”(一堆if-else),演进到过程化重构,再到“幼稚的”OOP(引入工厂模式),最后到“OO大师”的复杂方案(结合工厂、单例、注册表等模式)的全过程。 核心对比在于,最初的简单代码虽然直白,但随着需求增加会变得臃肿。而为了追求所谓的“消除逻辑分支”和“设计模式”,代码变得异常复杂,引入了大量接口和类。文章通过Rob Pike的评论犀利地指出,这种面向对象编程可能已经走进了死胡同——为了解决简单问题而构建了更复杂的系统。 这篇文章并非简单否定OOP,而是通过一个具体的代码演进实例,生动揭示了过度设计和模式滥用的现象。它提醒开发者,在选择编程范式和设计模式时,应警惕为了“纯粹”或“优雅”而牺牲代码的清晰性与简单性。最终,解决问题的“恰当”方式,往往比遵循某种固定的“高级”模式更重要。

本机暂存
IT 数据库/ 2012-12-14 13:49:58 / 累计浏览 4,989

关于一次导入数据提示的MySQL server has gone away

这篇讲的是一个看似平常的数据导入操作,如何引出对 MySQL 一个模糊报错的深度追查。作者从同事遇到的“MySQL server has gone away”问题出发,起初通过调大 `max_allowed_packet` 参数解决了表象。但作者敏锐地抓住了这个错误提示的“不友好”之处:并非所有包过大的情况都会报此错误,有时会有更明确的提示。 为了定位这类模糊报错的原因,作者没有停留在“突然想到”,而是设计了复现场景并深入到 MySQL 源码。分析发现,当 SQL 文件过大导致客户端发送网络包失败时,由于重连逻辑中的一处硬编码(`reconnect` 标志为0),MySQL 客户端库直接返回了 `CR_SERVER_GONE_ERROR`,从而掩盖了真正的错误——“发送通信包失败”。作者还展示了如何使用 GDB 调试获取被隐藏的真实错误码,为类似问题提供了系统的排查思路。 文章的核心在于揭示:一个不友好的错误提示背后,可能隐藏着完全不同的故障链路。与其猜测,不如顺着客户端的连接逻辑和错误处理流程去追溯,这才是定位复杂问题的可靠方法。

本机暂存
IT DevOps/ 2012-12-13 13:35:57 / 累计浏览 3,681

linux 定期自动备份mysql的shell

这篇讲的是,一位作者从保障用户数据安全的实际需求出发,分享了一个简洁实用的MySQL自动备份方案。 他编写了一个Shell脚本,核心是利用`mysqldump`工具导出服务器上所有的数据库,并通过管道用`gzip`进行高压缩存储。脚本通过配置`crontab`定时任务,设定在每天凌晨3点自动执行,实现了完全无人值守的备份流程。 方案的一个关键设计在于备份文件的自动轮转清理。脚本采用目录轮转的方式(`backup.0`至`backup.4`),每次执行前会先删除最旧的一天备份,然后生成新的备份文件,从而确保服务器磁盘空间始终只被最近5天的备份占用,避免了存储空间无限增长的问题。 文章直接提供了完整的脚本代码,包括数据库连接信息、文件路径定义和命令组合等,读者可以根据自身环境稍作修改后直接使用。作者也提醒,从安全角度考虑,执行备份的脚本应使用Root权限,这提醒了读者在自动化运维中需兼顾权限管理。整个方案轻量、可靠,非常适合中小型项目或个人服务器进行日常数据保护。

本机暂存
IT 后端/ 2012-12-13 13:33:54 / 累计浏览 4,013

一个 Lua 内存泄露检查工具

这篇讲的是作者团队遇到服务器内存一夜暴增8G的紧急情况,通过快速自制的Lua内存快照工具定位泄露的故事。 问题出在一张地图的Lua State中,有对象持续生成却未释放引用。作者懒得搜索现有工具,自己用半天时间写了一个名为“snapshot”的开源库。它的巧妙之处在于:不对整个Lua State序列化,而是只记录table、thread等复杂对象间的引用关系,并且用C直接调用API遍历,避免了用Lua实现时“观察即改变”的干扰。 核心方法是对比两个时间点的快照,新增的内存和其引用链一目了然。工具返回的虽然是一堆指针和字符串,但足够定位到具体是哪行代码的哪个变量导致了泄露,比如示例中清晰地指向了dump.lua第7行的tmp和S1变量。 这个临时工具已经成功帮他们快速锁定了故障点,展示了在紧急问题下“轮子虽小但能快速解决问题”的实用主义思路。

本机暂存
IT 数据库/ 2012-12-11 22:23:20 / 累计浏览 16,558

由浅入深探究mysql索引结构原理、性能分析与优化

这篇文章系统梳理了MySQL索引的核心原理与实战优化。作者从最基础的索引定义(索引相当于书的目录)讲起,深入对比了MyISAM与InnoDB两种主流存储引擎的索引结构差异。 核心在于B+树的实现细节:MyISAM的索引与数据文件分离,索引叶子节点存储的是指向数据物理地址的指针;而InnoDB采用聚簇索引,主键索引的叶子节点直接包含了完整的行数据,这意味着其二级索引叶子节点存储的是主键值,需要通过主键进行“回表”查询。这一结构差异直接影响了查询性能和内存使用。 文章后半部分聚焦于优化实战,详细拆解了“最左前缀原则”在联合索引中的应用,剖析了ORDER BY与索引配合的五种场景,以及如何通过避免对索引列使用函数、谨慎选择OR/IN等操作来提升查询效率。最后,还涉及了系统配置调优与索引维护的命令。 内容覆盖了从存储结构原理到日常优化技巧的全链路,对理解“为什么这么写SQL更快”很有帮助,适合需要夯实数据库基础或进行性能调优的开发者阅读。

本机暂存
IT 安全/ 2012-12-11 22:00:01 / 累计浏览 6,982

浅谈php web安全

这篇笔记从一位PHP开发者的实践出发,系统总结了Web安全开发中那些容易被忽略却至关重要的要点。作者强调,安全意识是开发者必备的素养,不能因项目内部或认为用户“善良”而放松警惕。 文章从基础的PHP安全配置讲起,比如关闭错误提示以避免信息泄露、禁用`register_globals`等危险功能。核心部分则深入数据验证,指出必须对用户输入进行严格校验,包括类型、长度和危险字符,并特别提醒了表单元素后端验证、字段名避免暴露等常见疏漏。 在防注入环节,作者详细演示了如何判断SQL注入漏洞,并列举了多种常见攻击手法,如万能密码、通过`union`语句猜解表结构等。针对防御,提供了从使用`intval()`处理数字参数,到结合`addslashes`等函数进行过滤的代码示例。此外,文章还简要涵盖了XSS、CSRF以及防盗链等其他常见Web攻击的防护思路。 整篇文章并非高深的理论,而是一份扎实的“避坑指南”,旨在帮助PHP开发者在编码阶段就植入安全基因,从根源上减少漏洞。

本机暂存
IT 后端/ 2012-12-11 21:57:16 / 累计浏览 17,476

浅析http协议、cookies和session机制、浏览器缓存

这篇讲的是从实际网站数据出发,拆解HTTP协议中几个关键但常被忽略的环节。作者从QQ空间的完整请求与响应头入手,直观展示了HTTP交互的全貌,比如请求行、状态行以及各头域的格式与作用。文章的核心在于实践对比,作者测试了包括CSDN、腾讯、新浪、百度在内的十余家主流网站,深入分析了`Connection`、`Content-Encoding`、`Server`、`Cache-control`等头域的具体表现。例如,为什么腾讯、新浪等部分大型网站会使用`Connection: close`而非默认的长连接?`Server`头域如何暴露了网站使用的服务器信息(如腾讯内部的QZHTTP、淘宝的Tengine),这又带来了哪些安全考量?这些对比都给出了作者的分析。更重要的是,文章并未止步于分析,而是提供了对应的PHP实现代码,比如如何通过`header()`函数设置`Connection`、`Cache-control`、`Last-Modified`,以及如何利用`if-modified-since`实现304缓存判断。整篇文章将理论知识与大站的实际运维策略、具体的编码实践紧密结合,对于想深入理解HTTP机制并应用于开发的读者来说,提供了非常具象的参考。

本机暂存
IT 前端/ 2012-12-11 21:51:31 / 累计浏览 7,946

各种浏览器审查、监听http头工具介绍

这篇文章的核心是在帮开发者解决一个实际问题:如何方便地查看和调试HTTP请求/响应头信息。作者从自己研究浏览器缓存和HTTP协议的实践出发,系统梳理了六种不同的解决方案。 文章详细对比了主流浏览器及相关工具的内置审查或插件支持。这包括了谷歌浏览器(Chrome)的开发者工具、专业的HTTPWatch、傲游3.0的网络面板、Safari浏览器上的Firebug Lite插件、火狐浏览器(Firefox)自带的Firebug,以及IE浏览器的内置监听工具。对于每一种工具,作者都给出了具体的开启步骤(比如快捷键或点击位置),并说明了如何在刷新页面后定位到目标资源,最终查看到包含Cookie、缓存状态等详细信息的HTTP头。 这些工具虽然入口各异,但核心目标一致,都是为了让开发者能“看见”网络传输中肉眼不可见的头部数据。对于前端工程师调试布局和资源加载,或是后端开发者排查缓存策略与接口响应,它们都是不可或缺的效率利器。文章用步骤截图的方式清晰地演示了操作流程,实用性很强。

本机暂存
IT 算法/ 2012-12-11 21:47:27 / 累计浏览 1,336

SNS网站的信息传播研究

这篇文章聚焦于社交媒体信息传播的底层逻辑,试图拆解从一条内容诞生到产生社会反馈的完整链条。 作者将SNS传播抽象为一个包含“产生、获取、加工、传递、效能、反馈”的环形过程。其中,信息的扩散依赖于“强关系”、“弱关系”和“无关系者”等不同社交距离的用户节点,并可能基于六度空间理论产生裂变。而信息效能的大小,则被归纳为受发布者地位、原文价值、分享者影响力、加工信息增值等多重变量的共同影响。 在此基础上,文章提出了一个更简洁的“元过程”模型,将参与者归纳为“发布者”、“内容”与“获取者”三个实体,并详细剖析了每个实体的核心需求。例如,发布者需要便捷的发布与控制能力;内容实体需要清晰的情景与权限展示;获取者则需要在认知和情感层面得到满足。 这种从过程到实体的拆解,不仅勾勒出了信息在社交网络中的生命周期,也为理解用户行为动机和设计平台功能提供了一个清晰的分析框架。对于从事社交产品设计或内容运营的人来说,这套分析思路或许能直接应用于用户参与路径的设计与优化之中。

本机暂存
IT DevOps/ 2012-12-11 13:45:32 / 累计浏览 5,264

查看linux系统版本命令总结

这篇讲的是在Linux系统里,如何快速准确地查出你手头机器的内核版本和发行版信息。作者把常用的命令梳理成了两大类,看内核和看发行版,用实际的命令输出示例展示了不同方法之间的区别。 对于查看内核版本,文章对比了三种最常见的方式。直接读取`/proc/version`文件会得到非常详细的信息,包括编译器和精确的构建时间。而执行`uname -a`则会给出完整的系统信息,包括主机名、内核版本、架构和操作系统。如果只需要一个干净的版本号,`uname -r`是最简洁的选择。 在识别具体的Linux发行版(比如是CentOS还是Red Hat)时,方法就更多样了。`lsb_release -a`是一个通用性很强的命令,能列出标准的版本信息。`cat /etc/issue`通常能快速显示发行版,但格式可能不统一。对于Red Hat系的系统,`cat /etc/redhat-release`和`rpm -q redhat-release`则能提供更具体、甚至带有更新编号的版本信息。文章还补充了如何通过`file /bin/bash`这类方法,从系统工具的编译信息中间接推断内核版本。 整篇文章没有空谈理论,直接罗列了从最通用到特定发行版的各种“兵器”,并点明了各自输出的细节差异和适用范围。管理员或开发者在排查环境问题时,可以按图索骥,选择最适合当前场景的命令。

本机暂存
IT 前端/ 2012-12-11 13:40:11 / 累计浏览 4,199

javascript扩展Array(数组)类

这篇讲的是如何给 JavaScript 的 Array(数组)类“加餐”,作者通过几个实用的原型扩展方法,让数组操作变得更顺手。 文章逐一展示了八个常见的扩展场景,比如用 `clear()` 一行代码清空数组,用 `insertAt()` 和 `removeAt()` 精确控制元素位置。这些方法直接挂载到 `Array.prototype` 上,代码简洁,思路清晰,解决了原生数组操作中的一些不便。 其中最有意思的是一个功能更强大的 `select()` 方法。它能像数据库查询一样,从一个对象数组中灵活地“取出”特定字段,甚至支持重命名查询结果中的属性名。作者通过示例展示了如何用字符串、参数列表或配置对象等多种方式来调用它,实用性很强。 总的来说,这篇文章相当于一份数组操作的“工具箱”清单。作者提供的这些扩展,既能提升日常编码的效率,其中 `select` 的实现思路也能启发我们如何更好地处理复杂的数据转换需求。

本机暂存
IT 算法/ 2012-12-11 13:37:27 / 累计浏览 3,957

寄存器分配初探–问题描述( Register Allocation – The Problem )

这篇讲的是编译器如何解决“无限变量”与“有限寄存器”之间的根本矛盾。作者从程序员声明的逻辑变量出发,指出实际CPU的物理寄存器数量极其有限,因此必须由编译器决定在特定时刻将哪些变量放入寄存器。这直接关系到程序性能,因为访问内存比访问寄存器慢了100到1000倍。文章用延迟对比数据清晰地说明,优秀的寄存器分配策略能最大限度减少访存,是生成高效代码的关键。这也是一个经典的资源映射问题,其思想甚至能迁移到操作系统页着色等领域。作为系列文章的开篇,本文聚焦于问题定义和背景,为后续探讨图着色、线性扫描等具体算法做好了铺垫。

本机暂存
IT 算法/ 2012-12-11 13:36:09 / 累计浏览 2,708

关于大区间过滤优化内存设计

这篇讲的是在检索场景下,如何优化“大区间过滤”时的内存结构设计。作者指出,传统做法中以 docId 为下标存储域值的方式存在内存浪费,尤其在域值(如日期类型)重复率很高的场景下。 核心方案是引入两个互补的数组:第一个数组以域 Term 的遍历位置(Position)为下标,直接存储对应的域值,这利用了域值在遍历过程中天然有序的特点;第二个数组则以 docId 为下标,存储该文档在第一个数组中的对应位置。这样一来,大量重复的域值(例如“20101202”)在第一个数组中只存储一次,通过第二个数组的间接映射,就能为每个 docId 快速定位到其域值。 作者通过示意图和实际业务分析说明,对于时间这类重复率极高的域,该设计能显著压缩内存占用。整个方案的精髓在于通过空间换时间的思想,巧妙地将高重复的域值“去重”存储,并用一次额外的间接查找换取整体内存效率的提升。

本机暂存
IT DevOps/ 2012-12-11 13:34:09 / 累计浏览 2,656

Windows: 使用Win7自带的远程协助功能

这篇讲的是Windows 7中一个实用但常被忽略的功能:让IT管理员主动发起远程协助,而非传统地等待用户发出邀请。 作者从实际IT支持场景出发,指出了传统方式的不便——必须等待用户创建邀请文件和验证码。文章的核心是介绍Windows 7新增的“主动远程协助”方案,它允许管理员在知道用户IP或计算机名的情况下,直接发起连接,更符合日常运维流程。 文章具体梳理了三种协助方式的区别,并详细拆解了启用该功能所需的三个关键配置步骤:开启远程协助权限、在本地用户组中添加协助者、以及通过组策略启用并指定允许的协助管理员。最后,通过命令行`msra.exe /offerra`即可发起连接,并提到了内置的聊天功能。 整个流程设置一次后,管理员便能高效地为遇到问题的用户提供“即时”屏幕共享与控制,为预算有限的团队提供了一个无需额外软件的轻量级远程支持方案。

本机暂存
IT 开发者/ 2012-12-11 13:33:03 / 累计浏览 8,010

程序员疫苗:代码注入

这篇讲的是“代码注入”这类常见的安全漏洞,作者将其比喻为程序员世界的病毒,并希望通过真实代码演示来为新人“注射疫苗”。文章详细剖析了Shell注入、SQL注入等多种攻击手法。 例如,在Shell注入中,通过拼接未经校验的用户输入,攻击者可以轻松执行任意系统命令。而在SQL注入部分,作者将其称为“黑客的填空游戏”,演示了如何通过构造恶意输入来绕过登录验证、窃取数据甚至删除整个数据库。文章还点出了变量覆盖、文件包含等其他危险操作。 作者通过Perl、PHP等不同语言的实例,清晰地展示了漏洞的原理和可怕后果。其核心目的不是罗列防御方法,而是让开发者先深刻理解攻击是如何发生的,从而在编码之初就建立起牢固的安全意识。这就像为程序员接种了第一剂防御“代码病毒”的疫苗。

本机暂存
IT 后端/ 2012-12-11 13:32:03 / 累计浏览 2,824

关于两种限流模式

这篇讲的是高并发系统中两种主流的限流模式:滑窗模式与响应模式。滑窗模式是“事后统计”,通过检查过去多个单位时间窗口内的请求总量是否超标来决定是否放行。它的实现像一个环形计数器数组,逻辑直观,但阈值设定依赖经验或压测,且可能因单位时间请求分布不均导致“先松后紧”。文章指出,它更适合作为对单一资源(如数据库、特定API)的刚性保护承诺。 而响应模式则是一种“实时反馈”策略,它只关心当前正在处理的请求数。文章巧妙地指出了限流的根本目的——是保护系统资源不被拖垮。由于系统容量会受GC、依赖抖动等动态因素影响,响应模式通过公式(QPS/1000*RT)动态计算最大并发数,让限流阈值能随系统实际承载能力自动调整,展现了更强的适应性。 文章最后对比了二者的实现思路:滑窗模式基于数组和环形队列记录历史计数;响应模式则仅需一个原子计数器跟踪活跃请求数。这为在确定性资源保护和自适应系统保护两种场景下的选型提供了清晰的技术参考。

本机暂存
IT 后端/ 2012-12-09 20:33:45 / 累计浏览 7,730

防盗链、断点续传、多线程多线程下载 一点心得

这篇讲的是在需要向用户售卖带时间限制的下载地址时,如何巧妙兼顾防盗链、断点续传与多线程下载的实战心得。 作者从一个具体需求出发:既要防止链接被非法分享,又要支持大文件的断点续传和多线程下载。他首先分析了常见做法——通过PHP脚本读取文件并输出二进制流。这种方法虽然便于控制访问和统计,但根本性缺陷在于,一旦客户端断点重连,服务器会因无法处理请求的文件偏移量而直接报错,因此只适用于图片等小文件。 接着,作者提供了一种更巧妙的方案:将.htaccess文件本身当作一个动态的“索引表”。为每个用户生成一对随机字符串作为伪地址,并在.htaccess中添加对应的RewriteRule规则指向真实文件。每天定期清理过期规则。这种做法无需复杂的脚本解析,直接利用Apache服务器原生能力,从而完美支持了断点续传和多线程下载,且服务器负载很低。 当然,该方案也有代价,即无法精细统计下载次数。作者坦言,这主要适用于用户量在千级、文件体积达GB级的场景。如果用户规模更大,拥有服务器控制权,则可以直接在Apache层面进行更专业的配置。文章结尾将思考抛给读者,共同探讨更优解。

本机暂存
IT 前端/ 2012-12-09 20:30:08 / 累计浏览 4,357

10个超棒jQuery表单操作代码片段

这篇文章收集了10个在jQuery表单处理中非常实用的代码片段,直接针对前端开发中的常见痛点。它涵盖了从基础交互到数据管理的多个场景,比如如何防止用户意外按回车提交表单、一键重置所有表单字段,以及在Ajax请求前后有效地禁用和启用提交按钮来避免重复点击。 其中一些技巧设计得相当巧妙。例如,作者指出直接通过`.attr('disabled', false)`来启用按钮是不正确的,应该使用`.removeAttr('disabled')`。另一个亮点是关于防止表单多次提交的方案,它通过在提交时动态设置按钮状态并利用数据存储来标记提交状态,逻辑清晰且可靠。 文章还包括诸如根据输入内容动态启用按钮、高亮当前聚焦的输入框等增强用户体验的代码。这些片段虽然简短,但每个都解决了一个具体而微的问题,组合起来形成了一套高效的表单处理工具箱。作者在文末也鼓励读者分享自己的相关代码,显示出这是一个注重实践交流的实用集合。

本机暂存
IT 设计/ 2012-12-09 20:19:27 / 累计浏览 5,049

行进在产品经理的路上

这是一篇产品经理的复盘与思考。作者从美术与用户体验设计起步,逐渐转向产品经理岗位,并分享了自己在YY和昆仑两家公司的实践心得。 文章的一个关键洞察是:交互与视觉是深层次需求,如果产品方向错误,再好的体验也只是引来围观。作者在YY的早期经历便印证了这一点——当时产品界面“山寨”,但凭借正确的方向(解决网游公会的核心需求)积累了大量用户。这一发现促使他将核心能力从画原型、写PRD,转向了更底层的“产品思想”。 那么,如何构建这种核心能力?作者提出了几个关键方法。把握用户需求上,他强调“多用”、“多聊”、“多看”、“多学习”,要成为产品的深度使用者,与用户交朋友,并广泛涉猎行业动态与专业知识。在获取信任方面,他认为对上需要通过持续提出并被验证的正确建议来建立信任;对下则需尊重团队,清晰传达“为何做此功能”,用激情感染他人,将产品成功视为共同目标。 最后,作者将做产品的方法论应用于自身职业规划:明确自己的核心优势,并保持每天比昨天进步一点的心态。他认为,成为优秀产品经理没有捷径,唯有怀着对产品成功的坚定信念,不断学习和实践,在持续行进中接近目标。对于同行而言,这篇文章的价值在于它将抽象的“产品感”拆解为可观察、可操作的方法,并强调了信念与坚持在漫长职业道路中的根本作用。

本机暂存