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

最新文章

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

IT 设计/ 2016-02-11 14:51:49 / 累计浏览 3,289

为什么我认为架构师需要坚持写代码?

这篇文章从近期技术圈关于“架构师应具备哪些能力”的讨论切入,剖析了架构师的两种类型:一种擅长任务分解、资源整合与项目交付,本质上是在既定框架内填充内容;另一种则具备“技术杠杆”能力,能借助代码与技术方案大幅提升效率或创造新可能,例如通过算法改进用户体验。作者的核心观点是,后者才是能驱动技术变革的关键角色,而这样的架构师必须坚持写代码。 文章进一步指出,不写代码的架构师容易沦为“填格子的人”,难以深入理解技术细节,更无法运用技术力量放大业务价值。在评估架构师能力时,作者提到一种实用的面试方法:让候选人先完成小型代码编写测试,以此作为能力基线,再讨论架构设计。这能有效区分出真正有一线编码经验、能用技术解决问题的候选人,而非仅擅长沟通与流程管理的人。 整体来看,作者强调架构师的价值不仅在于设计蓝图,更在于通过亲手实践保持技术嗅觉,从而找到以技术杠杆撬动更大成果的机会。这对团队如何定义架构师角色、进行人才评估,提供了务实的视角。

本机暂存
IT 前端/ 2016-02-11 14:49:39 / 累计浏览 2,485

用JavaScript将数字转换为大写金额

这篇讲的是前端开发中一个常见但容易被忽视的需求:如何在JavaScript里将数字金额规范地转为“壹佰贰拾叁元整”这样的大写汉字格式。 作者直接分享了一个可以拿来即用的`digitUppercase`函数。它的核心思路很清晰:先用两个数组分别定义好“零”到“玖”和“角”、“分”等单位,然后通过循环和取余运算,逐位将数字映射到对应的大写汉字和货币单位上。函数巧妙地用正则表达式对转换后的字符串进行了多次清洗,处理了像“零元零角”这样可能出现的冗余情况,确保输出的格式既准确又符合中文财务书写习惯。 这个实现考虑得比较周全,能正确处理负数、小数(到分)以及像万亿这样的大额数字。对于需要实现发票打印、账单生成等场景的开发者来说,这段代码可以直接解决实际问题。

本机暂存
IT 安全/ 2016-02-11 14:48:09 / 累计浏览 2,180

JAVA序列化和反序列化及漏洞补救

这篇从最近一起Joomla高危漏洞事件讲起,探讨了由此延伸出的Java序列化与反序列化的安全风险。文章首先用通俗的语言解释了什么是对象序列化——即将内存中的对象转换为可存储或传输的字节流,以及其反向过程。 重点在于,作者揭示了反序列化过程中的一个致命风险:当应用接受并反序列化外部输入时,如果缺乏检查,攻击者可构造恶意字节流,在服务器端触发任意代码执行。即便代码未直接使用危险类,只要运行环境中存在如Apache Commons Collections这样的依赖库,漏洞就可能被利用。 对此,文章给出的补救方案包括:升级Apache Commons Collections至3.2.2及以上版本,并通过配置默认关闭那些不安全的Transformer类序列化支持;同时,参考RedHat等厂商发布的针对具体产品(如JBoss)的补丁。文章还提到一个更根本的思路:通过限制JVM执行外部命令的能力,来降低未知漏洞的危害。 最后,作者点出这类问题的本质常在于反射的滥用,提醒开发者在跨网络传输序列化数据时,必须将安全性作为核心考量。

本机暂存
IT 安全/ 2016-02-10 23:17:17 / 累计浏览 1,942

如何hook一个系统调用

这篇讲的是如何通过hook系统调用来定位一个隐蔽的bug。作者从一个具体问题出发:他们使用的某个库会断言socket的文件描述符必须大于0,但系统运行一段时间后这个断言会失败,意味着有人错误地关闭了标准输入(fd=0)。 面对这个难题,作者没有选择在每个close调用处手动添加日志(工作量大且易遗漏),而是利用了Linux下动态链接的一个精妙特性:`LD_PRELOAD`。文章详细展示了如何编写一个名为`my_close.c`的共享库,在其中重新定义`close`函数。这个函数会先检查传入的fd是否为0,如果是则直接让程序崩溃(coredump),否则通过`dlsym`获取并调用原始的`close`函数。 通过设置`LD_PRELOAD`环境变量指向这个自定义库,程序在运行时就会优先加载它,从而劫持所有的`close`调用。这样,一旦程序中有代码试图关闭标准输入,就能立刻被定位到。整个过程巧妙地利用了系统机制,将原本需要大范围排查的问题,转化为了一个精准的触发点,是调试动态库和大型程序时一个非常实用的技巧。

本机暂存
IT 数据库/ 2016-02-10 23:11:17 / 累计浏览 2,525

MySQL drop database恢复(恢复方法同样适用MySQL drop table,delete,truncate table)

这篇讲的是一个真实的数据库灾难恢复案例。作者从一起线上事故切入:有人误点了产品软件的“清空数据”功能,导致一个MySQL数据库被直接执行了drop database操作,且事前没有任何备份。情况很紧急,但处理思路很清晰——立刻封存现场,将核心的InnoDB表空间文件ibdata1备份了出来。 接下来,作者借助专业的MySQL recovery工具,对这个18MB的ibdata1文件进行了深度解析。文章中展示了使用stream_parser工具扫描和提取数据的命令行过程,这是恢复的关键第一步。经过6个小时的分析和处理,最终的核心成果是:实现了核心数据的零丢失。 这个案例的价值不仅在于给出了drop database后的具体恢复路径,也印证了这类误操作在数据库管理中并非个例。它提醒我们,即便在高度自动化的系统中,对“清空数据”这类高危功能的设计和权限控制需要格外谨慎,而及时、有效的应急响应和文件级备份(而非仅依赖逻辑备份)在极端情况下可能是最后的救命稻草。

本机暂存
IT 前端/ 2016-02-10 23:09:10 / 累计浏览 2,475

跨域访问和防盗链基本原理(二)

这篇文章深入拆解了Web前端跨域访问的核心原理,重点对比了两种主流解决方案:JSONP与CORS。作者从跨域访问的定义切入,清晰区分了浏览器Referer请求与脚本发起请求在安全性上的根本差异——后者可能被恶意利用截获数据,因此成为需要重点管控的技术问题。 文章详细剖析了JSONP的工作机制:它巧妙地利用了浏览器允许加载外部脚本的特性,通过客户端预先定义函数、服务端返回调用该函数的脚本代码来传递数据。作者也客观指出了JSONP的局限:只能发起GET请求、依赖客户端与服务端的特定配合,且数据必须是JSON格式。 随后,文章将视角转向更现代的CORS方案。这里作者解释了其核心是服务端通过设置HTTP响应头(如Access-Control-Allow-Origin)来显式授权跨域访问。浏览器在正式发送请求前,会通过OPTIONS预检请求与服务端协商权限,这一流程使得跨域访问的控制权更规范地回归到了服务端。文中配有的流程图,清晰地展示了这一交互过程。 最后,文章简要提及了服务器代理、修改域标识等其他方案,但明确指出JSONP与CORS构成了当前跨域访问实践的两大基石。整体上,文章从原理到实践,系统地梳理了这一前端关键技术点的演进与现状。

本机暂存
IT 前端/ 2016-02-10 23:07:10 / 累计浏览 2,787

跨域访问和防盗链基本原理(一)

这篇讲的是防盗链的基本原理。作者从网页资源的加载过程切入,指出浏览器呈现一个完整页面需要发起大量GET请求,其中既包括本站资源,也可能包含非本站托管的外部资源。当网站A未经允许直接引用网站B的图片等资源,并从中获益时,就构成了“盗链”,这会消耗B站的流量。 文章核心对比了两种请求情况:直接访问页面时不会携带来源信息,而浏览器加载页面内的外部资源时,会自动在HTTP请求中加入`Referer`头,明确标示出请求的来源页面。资源服务器正是通过检查这个头域,来判断请求是否为本站或允许的来源。 对于非授权来源的请求,服务器可以拒绝提供资源,返回错误图片或提示信息,从而有效防止盗链。文章通过抓包截图直观展示了请求过程,清晰阐述了如何利用`Referer`机制实现基础防护,并为后续讨论跨域访问问题做了铺垫。

本机暂存
IT 开发者/ 2016-02-10 22:55:55 / 累计浏览 4,363

七年工作,几个故事

这篇讲的是一位程序员从华为到亚马逊七年间的五个工作故事,以及从中提炼出的职业思考。作者开篇就点明了三个核心观点:要为自己工作,而非为项目或绩效;尊敬同行,但警惕那些异化工程师的制度与文化;要保持开阔眼界,时间会给对错一个公正的答案。 文章通过几个真实案例展开:在华为经历的高强度加班文化,项目结束后近三分之二的人离职;离职时因制度原因与年终奖失之交臂,体会到“人走茶凉”;曾作为“工具人”开发强制性的代码检查工具,反而阻碍开发效率,事后深感这是“助纣为虐”;也观察到换领导引发的办公室政治与人员动荡。最后一个故事则转向积极面,讲述了他和同事如何从传统软件行业转向互联网,甚至跨越国境去寻找更匹配的生活与技术环境。 作者没有给出简单结论,而是通过这些夹杂着无奈、反思与勇气的真实片段,呈现了技术人在职业道路上关于选择、环境与自我成长的复杂图景。对于身处类似阶段的读者,这篇文章更像一面镜子,提供的不是标准答案,而是关于如何清醒工作与生活的深度共鸣与参照。

本机暂存
IT 数据库/ 2016-02-10 22:53:20 / 累计浏览 4,563

SQLIte这么娇小可爱,不多了解点都不行啊

这篇以轻松比喻开篇的文章,将SQLite与MySQL、Oracle这些“壮汉”数据库对比,形象地突出了SQLite“轻量嵌入式”的核心定位。作者没有停留在简单的介绍,而是深入剖析了SQLite的设计哲学与技术细节。 文章系统梳理了SQLite的关键特点:零配置、无服务器、单文件存储、跨平台且体积极小(可低于300KiB),同时也坦诚指出了它在并发写入、存储过程和用户权限管理上的局限。其核心价值在于,对于移动设备等特定场景,这些缺点往往可以接受,而其优点则非常突出。 更深入的部分在于对SQLite事务与锁机制的解析。文章详细阐述了其5种锁状态(UNLOCKED到EXCLUSIVE)和3种事务类型(DEFERRED、IMMEDIATE、EXCLUSIVE)如何协同工作,并解释了潜在的死锁问题。特别针对SQLite 3.7.0引入的WAL(Write-Ahead Logging)机制,文章对比了传统的回滚日志方式,说明了WAL如何通过将修改写入单独文件来实现“读写并发”,显著提升了性能,同时也指出了其适用条件和潜在缺点。 总体来看,文章从形象类比到特性清单,再到深层机制剖析,层层递进。它告诉读者,SQLite并不仅仅是一个“简单”的数据库,其内部有着精巧的事务控制逻辑,理解这些是用好它的关键。

本机暂存
IT 数据库/ 2016-02-10 22:48:58 / 累计浏览 2,415

MySQL异常恢复之恢复数据字典表讲解

当InnoDB存储引擎崩溃或系统表空间损坏后,要从底层恢复用户数据,理解核心的数据字典表是关键的第一步。这篇文章深入剖析了MySQL(特指早期版本)InnoDB内部四个用于记录表与索引元信息的系统表:SYS_TABLES、SYS_INDEXES、SYS_COLUMNS和SYS_FIELDS。 作者从数据恢复的实际需求出发,没有停留在表面定义,而是清晰地拆解了每个表的核心字段及其在恢复流程中的具体作用。例如,指出了恢复时最依赖的是记录表信息的SYS_TABLES和记录索引B+树根页位置的SYS_INDEXES,而列信息表(SYS_COLUMNS)与索引列分布表(SYS_FIELDS)则在需要精确还原表结构时提供支持。文章还解释了这些表各自默认存储在哪个系统索引ID中(如SYS_TABLES在index_id 1,根页为8号页),这对于手工定位和抽取字典至关重要。 作者对每个表的核心字段都做了拆解,比如强调SYS_INDEXES中的PAGE_NO字段直接指向索引的根页,这是恢复数据的入口。通过理解这些底层元数据,DBA在面对无法正常启动的MySQL实例时,就能理清恢复思路,利用工具定向提取关键信息,为抢救数据奠定基础。

本机暂存
IT 前端/ 2016-02-10 22:46:37 / 累计浏览 2,215

jQuery Ajax请求下载文件资源

这篇文章解决了一个常见的前端困境:如何用jQuery Ajax处理需要根据情况返回JSON数据或文件下载的请求。作者从一个实际项目场景出发,发现单次Ajax请求难以同时满足这两种响应要求。 文章核心介绍了两种经过验证的“两次请求”解决方案。第一种方案,服务端逻辑保持不变,客户端在收到包含 `Content-Disposition: attachment` 头的响应后,动态构建一个隐藏表单并提交,从而触发浏览器的文件保存对话框。第二种方案则修改了服务端逻辑,首次请求只返回一个下载URL,再通过iframe或一个GET请求去获取实际文件。两种方案都成功实现了需求,但各有侧重:前者对服务端改动最小,但会带来一次多余的带宽开销;后者网络效率更高,但需要服务端提供额外的接口。 作者坦诚地分析了实现细节与权衡,并提供了完整的代码示例。对于正在寻找类似问题解决方案的开发者来说,这篇实践总结提供了清晰、可操作的参考路径。

本机暂存
IT DevOps/ 2016-02-10 22:45:53 / 累计浏览 2,746

Docker基础技术:AUFS

这篇讲的是 Docker 底层存储的关键技术之一:AUFS。它是一种联合文件系统,可以把多个目录合并挂载到一个统一的视图中。文章从 AUFS 的历史八卦切入——它由冈岛顺治郎开发,却因代码量庞大(3万行)而屡次被 Linus 拒绝合入 Linux 主线,但 Ubuntu 等发行版依然广泛采用了它。 核心价值在于它的分层与合并思想。作者通过一个“水果与蔬菜”目录的生动示例,演示了 AUFS 如何将多个目录联合,并通过权限设置(最左侧目录默认可读写,其余只读)来实现修改的隔离。当修改一个文件时,改动会“写”到可写层,而不会影响只读层的原始文件,这就为快照和模板提供了基础。 这个特性正是 Docker 镜像分层的基石。文章清晰地解释了 Docker 如何利用 AUFS(以及 Btrfs、Devicemapper 等其他存储驱动)构建出只读的基础镜像层和上层可写的工作层。你甚至可以查看 Docker 实际运行时的挂载点(如 /sys/fs/aufs/),直观看到多个只读层(ro+wh)和一个可写层(rw)的组合。 最后,文章还介绍了 AUFS 的具体权限类型(rw、ro、rr)以及 whiteout 机制——如何在只读层上“删除”文件。这不仅仅是理论讲解,更提供了从内核文件系统特性到容器实践完整的技术脉络。

本机暂存
IT 数据库/ 2016-02-10 22:35:12 / 累计浏览 1,153

MySQL 5.7 传统复制到GTID在线切换

这篇文章详细讲解了如何将 MySQL 5.7 的传统复制架构,在线、平滑地切换至基于 GTID 的复制模式。它首先明确了两个前提条件:版本需在 5.7.6 及以上,且初始所有节点必须处于 `gtid_mode=off` 状态。 核心方案是一套环环相扣的九步操作流程。文章特别强调了第一步设置 `enforce_gtid_consistency = warn` 时,必须确保所有节点都没有警告输出,这是后续切换成功的关键。切换过程通过逐步调整 `enforce_gtid_consistency` 和 `gtid_mode` 两个全局变量来实现,并建议在设置 `gtid_mode=on_permissive` 时,先从 slave 节点执行再操作 master,以确保新产生的日志立即带有 GTID。 整个流程中,一个重要的验证点是反复查询 `ongoing_anonymous_transaction_count` 状态值,必须在所有节点确认为“0”后,才能进行最终的 `gtid_mode=on` 设置。最后,文章还提醒需要将配置固化到配置文件,并重启从库复制服务以启用自动位置追踪(`master_auto_position=1`)。 整套方案无需停服,通过精细的状态控制与验证,实现了从传统复制到 GTID 复制的在线无损切换,是数据库管理员维护高可用集群时一份非常实用的分步指南。

本机暂存
IT 开发者/ 2016-02-10 22:33:09 / 累计浏览 2,764

Sublime Text 3常用快捷键

这篇整理了 Sublime Text 3 在日常编码中最为高频实用的快捷键,堪称一份“指尖提速”手册。作者将零散的命令系统化地分为选择、编辑、搜索、显示等类别,并通过“举个栗子”的方式解释了每个快捷键的具体应用场景。 文章的核心价值在于那些能显著提升效率的“大杀器”选择类快捷键,比如 Ctrl+D 连续选择相同文本、Alt+F3 一键选中所有同名单词,以及 Ctrl+Shift+L 为多行添加光标进行批量编辑。这些操作远比手动寻找替换更为高效。此外,像 Ctrl+P 结合 `@`、`#`、`:` 符号实现的文件、函数、变量快速跳转,也是 Sublime Text 高效导航的精髓。 从基础的缩进复制,到强大的多重选择与分屏浏览,文章覆盖了从入门到进阶的常用操作。掌握这些快捷键,能将重复性的键鼠操作化为流畅的键盘节奏,让代码编写过程更加专注于逻辑本身。

本机暂存
IT 后端/ 2016-02-09 23:35:05 / 累计浏览 3,577

微信朋友圈技术之道

这篇讲的是微信朋友圈在面临十亿级日发布、百亿级日浏览的海量压力时,如何保障系统稳定与性能的核心架构。 微信朋友圈负责人陈明分享了其背后的技术之道。面对移动互联网汹涌的峰值流量(如春节期间流量达平日5倍),系统通过一套自动化的服务优先级策略进行应对:优先保障支付与点对点消息,然后是群聊,最后才是朋友圈。在核心架构上,朋友圈采用“写扩散”模型——用户发布内容时,会将数据副本写入每个好友的时间线表。这种看似“重”的写入,换来了极其简单可靠的读取(只读自己的时间线),大幅降低了读失败的可能性。 文章还揭示了朋友圈数据依赖的四个核心表(发布、相册、评论、时间线)及其水平扩展方式,并详细阐述了多层级容灾设计。从同城多园区无感切换,到全球多数据中心的跨地域同步,微信甚至为适应高延迟、高丢包的跨国公网环境,自研了类TCP协议以保证数据同步的效率与安全。 整个分享从数据背景、架构选型到容灾细节,清晰展示了一个超大规模社交系统如何在性能与可靠性之间做出权衡与设计。

本机暂存
IT 数据库/ 2016-02-09 23:33:03 / 累计浏览 2,595

MySQL索引之主键索引

这篇文章厘清了MySQL中主键索引和辅助索引的几处关键区别。 作者从两者的定义出发,指出主键索引是唯一标识记录、不可为NULL的索引,而辅助索引则包括唯一索引和非唯一索引。核心对比在于不同存储引擎下的行为差异:在MyISAM中,一个不允许NULL的唯一索引与主键索引本质相同,性能也相当;但在InnoDB中,主键索引即聚集索引,而辅助索引(无论是否唯一)存储的都是指向主键的指针,因此通过辅助索引查找数据需要额外的转换步骤。 文章用一组测试数据直观地展示了性能区别:在100万行数据的MyISAM表上,普通索引的随机检索效率比主键索引慢了30%以上;而在InnoDB表上,唯一索引比主键索引慢约9%,普通索引的差距则扩大到50%以上。这清楚地说明,理解这些索引机制对于InnoDB的表结构设计与查询优化至关重要。

本机暂存
IT 前端/ 2016-02-09 23:31:26 / 累计浏览 1,827

jQuery对象和DOM对象小结

这篇小结聚焦于jQuery开发中一个基础却易混淆的概念:jQuery对象和DOM对象的区别与转换。作者从实际编码中的常见错误切入,清晰阐述了两者的关系和使用场景。 DOM对象是通过原生JavaScript方法(如getElementById)获取的元素节点,可以直接使用innerHTML等标准DOM API。而jQuery对象则是通过$()函数包装DOM对象后产生的,拥有jQuery特有的方法链和便捷功能,例如用.html()获取内容。关键差异在于,两者的方法集完全不同,混用会导致运行时错误。 文章详细介绍了相互转换的技巧:jQuery对象转DOM对象可通过索引[0]或.get(0)方法;DOM对象转jQuery对象则只需用$()包裹。例如,var cr = document.getElementById('cr')得到的DOM对象,通过$(cr)就能变成jQuery对象。这些转换确保了开发者能灵活调用对应方法,避免代码失效。 通过实例对比,如$('#foo').html()与document.getElementById('foo').innerHTML,这篇总结以简洁方式强化了基础认知,帮助前端开发者写出更健壮的代码。

本机暂存
IT 开发者/ 2016-02-09 23:11:30 / 累计浏览 4,791

C++线程池实现原理

这篇讲的是C++线程池中一个核心但常被忽略的机制——闭包(Closure)是如何工作的。作者没有一开始就堆砌复杂概念,而是从一段注释丰富的简单示例代码切入,展示了使用线程池的标准写法。 然后,他带读者聚焦到那个让人困惑的`NewClosure`函数。文章的巧妙之处在于,它揭示了这个“闭包”其实是一个简单的模板对象。其核心思路是:通过模板类`ObjClosure1`,将对象指针、成员函数指针以及参数值,这三样东西打包存储起来。当线程池的工作线程取出这个任务时,调用的`Run()`方法内部,再通过`(p_->*fun_)(arg1_)`这样的C++成员函数指针调用语法,把这些元素重新组合起来执行。 文章把这个过程比作“打包”与“拆解执行”,解释得清晰直白。作者的目标是让初学者看完后,从“不明觉厉”变为“原来如此”。对于想了解线程池任务封装原理,却又对模板和函数指针感到头疼的C++开发者来说,这是一篇很好的入门拆解。

本机暂存
IT 开发者/ 2016-02-09 23:10:22 / 累计浏览 5,457

Sublime Text 3最好的功能、插件和设置

这篇翻译自scotch.io的文章,为开发者精选了Sublime Text 3中最值得掌握的功能、插件与配置。它没有泛泛而谈,而是直接深入到提升编码效率的具体场景中。 文章首先聚焦于几个核心的内置功能,比如通过`ctrl+shift+p`唤出的命令面板,它几乎成了所有操作的入口;又如用`ctrl+p`实现的模糊文件查找,以及`ctrl+r`的代码符号快速跳转,这些都是告别低效鼠标操作的关键。这些快捷键组合构成了高效使用Sublime的骨架。 在此基础上,文章进一步推荐了能极大扩展编辑器能力的插件生态,并分享了相关的优化设置。作者的选材体现了从基础操作到深度定制的完整路径,旨在帮助读者系统性地挖掘这款编辑器的潜力。无论你是刚接触Sublime的新手,还是想更上一层楼的用户,都能从中找到切实可行的优化点。

本机暂存
IT 安全/ 2016-02-09 23:09:08 / 累计浏览 1,468

iOS安全—dumpdecrypted APP砸壳

这篇讲的是iOS应用逆向工程中一个关键步骤:如何给从App Store下载的加密应用“砸壳”。作者从dumpdecrypted这个工具出发,详细拆解了整个解密流程。 文章首先点明背景:商店下载的应用都带有加密壳,阻碍了class-dump或IDA这类静态分析工具的使用。核心方案分三步走:首先在本地下载并编译dumpdecrypted源码,生成一个dylib动态库;接着,通过Cycript等工具定位到目标应用的沙盒目录——因为只有沙盒内才有读写权限;最后,将生成的dylib上传至该目录并注入,启动应用即可完成解密。 其巧妙之处在于原理的简洁:通过DYLD_INSERT_LIBRARIES环境变量,强制让App加载这个自定义的dylib。动态库在初始化时便会执行dump操作,从而在运行时将解密后的二进制数据导出。整个过程清晰地展示了如何利用系统机制与沙盒环境来实现对加密应用的动态脱壳,为后续的深度分析扫清了障碍。

本机暂存