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

最新文章

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

IT 后端/ 2018-06-26 12:28:57 / 累计浏览 1,501

我的阿里面试之路

这篇讲的是作者长达三个月的阿里云技术岗面试全记录。与许多“面经”不同,它并非一份简单的答案清单,而是从面试者的视角出发,详细还原了从电话面到交叉面、最终拿到offer的曲折过程。 文章坦诚地分享了作者在算法题、系统设计以及技术深度探讨中遇到的具体挑战,尤其是几次因准备不足或理解偏差而差点“翻车”的真实时刻。作者从中总结出几个核心发现:阿里面试尤其看重对技术原理的深刻理解与现场推导能力,而非死记硬背;同时,清晰的沟通逻辑与展现解决问题的思维过程,有时比直接给出最优解更重要。 对于正在准备大厂技术面试,或是对阿里巴巴技术文化感兴趣的读者来说,这篇复盘不仅提供了实战细节,更揭示了面试背后对技术底蕴与临场应变能力的双重考验。它像一面镜子,能让读者在别人的经历中照见自己的准备方向。

本机暂存
IT 数据库/ 2018-06-26 12:28:00 / 累计浏览 1,399

如何在命令行中整理数据

数据审计中常遇到格式错误、乱码、控制字符等棘手问题,而许多人却执着于寻找昂贵的专用工具或编写复杂脚本。这篇文章作者结合自身兼职数据审计的经验,提出了一个返璞归真的解决方案:直接使用命令行工具链。 作者处理过十万至百万行、包含多达两百个字段的导出表格,发现混乱无处不在。他指出,人们往往陷入“数据悲伤”的五个阶段,最终才承认需要帮助,并误以为必须依赖特定软件。实际上,Bash shell本身就是一个强大的工具箱。grep、cut、awk这些经典的文本处理器,在应对脏数据时既可靠又高效。 文章用一个具体例子展示了威力:如何用一行组合命令(tail、cut、awk),在短短4秒内从超过112万条记录中精准找出某个字段的最长数据项,并封装成可重复使用的函数。作者强调,这种方法的安全优势尤为突出——所有操作都在数据库外部进行,使用的是导出后的纯文本副本,因此完全不影响原始数据库的结构与安全。 对于受过Unix训练的读者,这或许是一次怀旧;但对于更多人,它是一个实用提醒:在追求复杂方案前,不妨先“保持冷静,打开一个终端”。

本机暂存
IT 后端/ 2018-06-26 12:25:17 / 累计浏览 1,863

通过Twemproxy提升PHP/Redis的性能

这篇文章讲的是如何用 Twemproxy 这个看似“古老”的 Redis 代理,来解决 PHP 应用中难以实现真正连接池的性能痛点。作者没有从复杂的理论入手,而是直接从一个已知的“曲线救国”方案(借助 Nginx Stream 模块)出发,转而尝试用现成的 Twemproxy 来达到相同目的。 核心方案是让 Twemproxy 与 PHP 部署在同一台服务器上,并通过本地 Unix Domain Socket 进行连接。经过初步压测,作者发现默认的单进程 Twemproxy 并没有带来性能提升,问题根源在于其单线程架构无法利用多核 CPU。因此,他调整策略,按照 CPU 核心数启动了多个 Twemproxy 进程,并让 PHP 请求随机分配到这些进程对应的 Socket 上。 最终的测试结果非常直观:性能提升了整整 100%。作者在文中指出了性能跃升的关键因素:Twemproxy 的 Pipelining 功能将多个请求打包发送,减少了网络 RTT,同时还优化了连接建立过程。文章不仅给出了具体的配置文件示例和压测命令,还提到了如 mbuf-size 设置和绑定 CPU 等实战细节,为读者提供了可直接参考的落地步骤。

本机暂存
IT DevOps/ 2018-03-12 17:31:12 / 累计浏览 2,113

如何免费的让网站启用HTTPS

作者分享的是他将个人技术博客CoolShell从HTTP升级到HTTPS的完整实践过程。文章背景很具体:因为HTTP访问在国内被运营商劫持注入了广告,同时考虑到HTTP在搜索引擎中的排名劣势,作者决定为网站免费启用HTTPS加密。 核心方案围绕开源的证书颁发机构Let’s Encrypt展开。作者通过其官方推荐的Certbot工具,在Nginx和Ubuntu系统上实现了证书的自动签发与安装。文章不仅给出了具体的命令行步骤,还分享了一个关键优化点:建议在Nginx配置中开启HTTP/2协议,以显著提升HTTPS下的传输性能。此外,针对Let’s Encrypt证书90天过期的特点,作者演示了如何用crontab设置定时任务来自动续期证书,确保服务不间断。 最后,文章也指出了启用HTTPS后的“收尾工作”:需要在WordPress等内容管理系统中,将所有的资源链接从http://强制修改为https://,并更新相关缓存插件设置,否则浏览器会因混合内容而阻断页面加载。整个过程从问题出发,到具体实施与优化,形成了一个清晰可复现的免费方案闭环。

本机暂存
IT 数据库/ 2017-12-24 20:00:05 / 累计浏览 2,109

60 TB 数据:Facebook 是如何大规模使用 Apache Spark 的

这篇讲的是Facebook如何将一个关键的大数据流水线,从古老的Hive迁移到现代的Apache Spark上。背景是,他们用于实时实体排名的特征准备流程,原本基于Hive,由数百个小作业组成,耗时长达三天,且极其难以监控和维护。为了追求更快的速度和更好的可管理性,他们选择将整个流水线整合成一个单独的Spark作业,直接处理高达60TB的压缩数据。 迁移过程并非一帆风顺。作者坦言,第一次甚至第十次尝试都未成功,因为要可靠地运行一个处理如此大规模shuffle数据的作业,挑战巨大。团队对Spark的可靠性进行了大量修补,例如提升节点频繁重启时的容错能力,修复了从PipedRDD获取失败到执行器内存溢出等一系列问题。这使得作业得以稳定运行。 在性能优化上,他们的努力同样深入。通过自定义的火焰图等分析工具定位瓶颈后,他们对Spark底层进行了关键修改:修复排序器的内存泄漏带来了30%的速度提升;优化Snappy压缩调用节省了10% CPU;减少不必要的重排文件打开操作最高提升了50%的性能。最终,这个迁移项目不仅让Facebook自身受益,所有改进也被回馈给了开源Apache Spark社区。

本机暂存
IT 后端/ 2017-12-24 19:54:15 / 累计浏览 2,703

浅谈《守望先锋》中的 ECS 构架

这篇技术博客的作者从《守望先锋》GDC演讲出发,深入浅出地解析了游戏开发中的ECS架构。文章直面传统面向对象游戏引擎的痛点——每个游戏对象都捆绑了所有功能模块的Update方法,导致模块间耦合严重、内聚性差。对于像《守望先锋》这类需要复杂网络预测与同步的游戏,传统架构显得力不从心。 作者详细拆解了ECS(Entity-Component-System)的核心设计:Entity仅作为带ID的生命体容器;Component是纯数据(如位置、输入状态);System则是纯逻辑处理单元。框架负责根据System声明的Component组合,自动筛选出它关心的Entity子集进行遍历。这使得每个System能高度专注且松耦合。文章还提到了Singleton Component的演进、Utility函数的使用以及如何集中处理有副作用的行为。 最终,作者指出ECS最大的优势在于清晰分离状态与逻辑,这极大简化了网络同步中的状态快照与回滚操作。《守望先锋》利用这套架构,在60fps的固定更新频率下,优雅地处理了客户端预测、服务器仲裁及网络波动时的“时间压缩”同步难题,展现了架构在管理复杂度上的强大能力。

本机暂存
IT DevOps/ 2017-12-24 19:51:34 / 累计浏览 2,996

使用 Ubuntu Cleaner 为 Ubuntu/LinuxMint 释放空间

这篇文章讲的是如何用 Ubuntu Cleaner 快速释放 Ubuntu 及其衍生发行版(如 LinuxMint)的磁盘空间。对于 Linux 用户来说,系统长期使用后容易堆积缓存、旧内核和残留包,而手动清理过程繁琐又容易出错。 作者推荐了 Ubuntu Cleaner 这个工具,它其实源自经典的 Ubuntu Tweak 中的 Janitor 模块,后来由开发者独立维护并重新发布,算是让许多用户怀念的功能得以延续。这款工具能一键清理浏览器缓存、缩略图、APT 缓存、过期内核和无用包等“垃圾”,覆盖了大部分常见的空间占用源。 安装过程很简单,通过官方 PPA 源就能轻松搞定。使用起来也很直观:启动后勾选需要清理的项目,点击清理按钮即可。整个操作避免了手动执行复杂命令的风险,把原本耗时费力的系统维护变成了一次点击就能完成的事。 对于那些苦于系统空间不足,又不想折腾命令行的用户来说,这篇教程提供了一个高效、安全的解决方案。它让清理系统垃圾这件麻烦事变得轻松许多,尤其适合想要快速恢复磁盘空间的日常使用场景。

本机暂存
IT 设计/ 2017-12-24 19:46:45 / 累计浏览 2,221

六大标志性的开源形象概览

这篇文章认为,强大的品牌形象对于开源项目至关重要,它能帮助项目与商业软件竞争,并让人记住和信任。作者从六个标志性的开源吉祥物/Logo出发,讲述了它们背后的故事和品牌塑造的思考。 比如Linux那只憨态可掬的企鹅Tux,灵感竟来自Linus Torvalds被企鹅咬了一口后的喜爱;Firefox Logo中的“火狐”实则是中国的小熊猫,其命名和形象经历过多次变更与专业设计;而GIMP那只名为Wilber的奇幻生物,其物种设定甚至引发了社区长达数十年的热烈讨论。 PostgreSQL的大象Slonik象征着“让人印象深刻”,VLC的橙色交通锥筒则充满了校园趣闻与法兰西风情,甚至会在圣诞节悄悄戴上红帽子。这些案例共同说明,一个设计得当的Logo或吉祥物,能将项目的理念与个性凝聚成符号,成为开源社区宝贵的视觉资产。 文末,作者也热情邀请读者分享自己心中最爱或最令人印象深刻的开源品牌。

本机暂存
IT 移动开发/ 2017-12-08 15:24:17 / 累计浏览 2,256

马化腾:与阿里竞争是好事 以去中心化方式赋能企业

这篇讲的是腾讯创始人马化腾在2017年财富全球论坛上,就企业战略、技术竞争与创新生态等话题的深度分享。其中最引人注目的,是他对“赋能”理念的辨析——相较于阿里中心化的基础设施模式,马化腾强调腾讯追求的是“去中心化的赋能”。 他用一个生动的比喻解释了两者区别:腾讯不是让合作伙伴来租用平台的“柜台”,而是帮助他们自己“建房子”,建成之后客户、利润和经营自主权都属于企业自身,腾讯不掌控其命运。这一理念直接源于腾讯“把半条命交给合作伙伴”的开放生态战略,他们专注于通信社交与数字内容,将电商、出行等众多领域交给生态伙伴,避免内部竞争。 文章还透露了诸多细节:微信的诞生源于内部三个团队的“赛马机制”,广州团队胜出;马化腾坦言与阿里在十几个领域竞争“前所未有”,但认为良性竞争激发了潜能与团结。在技术层面,他提到了基于海量照片数据训练的人脸识别技术(用于寻回失踪儿童)、移动支付因竞争而快速普及,以及小程序将构建“没有APP,只有浮动代码”的未来生态。对于AI,他认为医疗影像最容易落地并展现价值。 整场对话展现了腾讯在移动互联网浪潮中的关键决策,以及通过开放与赋能来构建长期护城河的战略思考。

本机暂存
IT 后端/ 2017-10-15 10:17:30 / 累计浏览 3,040

分布式系统中唯一ID的生成

这篇讲的是分布式系统中一个看似简单却至关重要的问题:如何生成全局唯一的ID。作者从实际大型系统的共同需求出发,对比了几种主流方案,分析了它们各自的适用场景与取舍。 文章首先剖析了“独立生成服务”这类集中式方案。最典型的是利用数据库的自增序列,它保证了递增性,但存在单点瓶颈。对此,一个变通思路是通过划分序列范围或设置不同步长,用多个节点分摊生成任务,但这又牺牲了全局的递增性。作者重点介绍了开源方案Twitter Snowflake,它通过组合时间戳、节点编号和自增序列,在保证高性能与有序性的同时,减少了中心化依赖(尽管节点ID仍需从Zookeeper获取)。 另一大类是“本地生成器”。这类方案在节点本地生成ID,通常要求不同节点间无状态依赖。例如用主机号加时间戳,简单但受限于单毫秒只能生成一个ID;而UUID(通用唯一识别码)则提供了更灵活的128位随机标识,不过理论上仍存在极低概率的冲突。 整体来看,作者并未简单评判优劣,而是引导读者思考:在递增性、全局有序、高可用、高性能与实现复杂度这些不同维度间,应如何根据具体业务场景做出合适的选择。

本机暂存
IT 安全/ 2017-10-15 10:09:58 / 累计浏览 3,604

手把手教你CSRF防护

这篇讲的是如何系统性地防御CSRF(跨站请求伪造)攻击。作者先厘清了核心概念:CSRF的本质是攻击者盗用你的合法身份去执行恶意操作,比如转账、发邮件。接着,文章从通用的防御思路入手,比如通过referer、token验证和验证码来检测用户提交,并建议尽量使用POST操作、严格设置Cookie域。 文章的重头戏是详细拆解了Django框架内置的CSRF防护方案。它利用中间件CsrfViewMiddleware自动为所有POST表单注入一个名为csrfmiddlewaretoken的隐藏字段,其值是会话ID与密钥的哈希。后续中间件会验证这个token,不匹配则直接返回403错误,从而阻断伪造请求。作者接着给出了从配置、模板到视图的实操指南:如何确保中间件正确启用,在模板中使用{% csrf_token %}标签,以及如何处理Ajax请求和Jinja2模板等特殊场景。 整体来看,这是一篇从原理到实践、手把手式的防护教程,特别对Django开发者具有直接的操作参考价值,清晰地展示了如何利用框架机制为应用加固一道安全防线。

本机暂存
IT DevOps/ 2017-10-15 10:03:55 / 累计浏览 2,722

如何快速实现一个基于 Nginx 网站的监控场景

这篇文章讲述了小明在一家电商创业公司,如何从零开始构建基于Nginx的服务监控体系,并最终转向一站式云产品的实践历程。 故事的起点是老板提出的明确需求:要能实时统计服务调用次数与返回码、实现阈值报警,并支持灵活的历史查询,同时要求系统具备良好的扩展性和成本控制。小明在对比了传统OLAP、搜索引擎和实时计算方案后,选择了自研实时计算架构,并详细设计了包含数据通道、计算引擎、存储和展示门户的完整链路。 然而,理想丰满,现实骨感。在长达两个月的开发过程中,小明遭遇了一系列典型痛点:多组件集成排查困难、Nginx日志清洗繁琐、为防数据重复计算而设计的存储幂等性问题、延迟数据如何合并、以及如何高效遍历所有服务进行报警检查等。这些挑战导致项目进度严重滞后。 转机来自一次与师兄的交流。小明了解到阿里云ARMS这款产品,它采用“实时计算+列式存储”架构,将日志采集、实时聚合、报警和可视化报表集成于一体。对于小明最核心的Nginx监控场景,ARMS提供了开箱即用的模板,只需在日志格式中加入如`$request_time`等字段即可快速接入。它不仅能直接提供监控大盘和报警功能,还开放了API,便于业务系统直接对接数据,从而将小明从繁琐的底层开发中解放出来。

本机暂存
IT 后端/ 2017-10-15 10:01:28 / 累计浏览 1,457

个人博客技术演进的流水账

这篇文章从个人博客的“搬家史”出发,串起了一个Web前端技术演进的缩影。 作者最初受困于商业博客平台的种种限制——域名不可控、内容易丢失、样式不自由,为了“把数据和控制权握在自己手里”,走上了自建博客之路。文章以这个起点展开,以博客系统的技术栈变迁为线索,梳理了Web开发的几个关键时期:从前后端不分的“SHTML+SSI”时代,到ASP/PHP动态脚本主导、MySQL普及的“前后端初分”时期;再到jQuery大行其道、前端资源开始分离,以及MV*框架、模块化构建工具与Node.js全栈模式兴起的高速迭代时代。 文中提及了SaBlog、WordPress、Ghost等具有代表性的博客系统,并剖析了它们在各自阶段如何体现当时的主流技术架构与痛点。作者的流水账,实际上记录了前端如何从一个“后台附属”逐渐走向工程化、复杂化并分担更多职责的过程。文章结尾留下的疑问,也为思考当下技术选型提供了一个历史参照。

本机暂存
IT 前端/ 2017-10-15 10:00:29 / 累计浏览 2,039

Chrome runtime 不稳定(GC)导致插件绑定事件失败

作者在重构Chrome插件时遇到了一个令人头疼的间歇性问题:插件完成加载后,在初始化绑定`chrome.webRequest`等事件时会概率性失败,控制台抛出`Cannot read property ‘onBeforeSendHeaders’ of undefined`的错误,导致后续逻辑完全中断。尤其是在调试页面时,错误源还会在`extensions::guestViewEvents`和`extensions::runtime`等内部脚本之间反复切换,让人难以定位。 经过排查,问题的根源在于Chrome扩展运行时的不稳定,这很可能与V8引擎的垃圾回收(GC)机制有关。在GC发生时,某些在初始化期间依赖的底层对象或接口可能被意外回收或未就绪,从而导致访问失败。 针对这个棘手的环境问题,作者尝试了包括简化代码、调整生命周期钩子(如onload、DOMContentLoaded)执行顺序等常见方法,但均未奏效。最终,他采用了一个务实但有效的容错方案:在初始化代码外包裹`try-catch`,一旦捕获到异常,就立即触发`location.reload()`进行页面自动重载。由于故障本身是概率性的,通过这种快速的自动恢复机制,可以很大程度上规避初始化失败导致的功能完全不可用。虽然这并非从根源上解决了运行时不稳定的问题,但在这种特定场景下,却是一个能够保障插件可用性的巧妙“妥协”。

本机暂存
IT 前端/ 2017-10-15 09:58:33 / 累计浏览 2,781

了解JS中的全局对象window.self和全局作用域self

这篇文章从初学者常有的疑问切入:JS全局对象window、window.self和直接使用self这几个写法到底有什么区别?文章首先澄清,在普通的Web页面上下文里,它们确实是等价的,仅凭这点self似乎可有可无。 真正的价值区分出现在HTML5时代。随着Service Workers和Web Workers的兴起,JavaScript需要在独立于浏览器主窗口的后台线程中运行,而Worker环境没有“窗口”的概念,因此不存在window对象。此时,self就成为了指代全局作用域的唯一关键。文章通过一个Service Worker注册的实例,清晰地展示了在Worker脚本中,如何通过`self.addEventListener`来监听事件,这正是self的核心应用场景。 简而言之,这篇文章厘清了self从“冗余别名”到“Worker环境基石”的角色转变,帮助开发者理解在不同的运行上下文中应该选择哪个全局引用。对于涉及前端性能优化、离线应用或后台数据处理的开发者来说,这是理解现代Web API一个不可或缺的细节。

本机暂存
IT 数据库/ 2017-10-15 09:57:25 / 累计浏览 1,401

Paradox 的数据文件格式

这篇文章探讨的是 Paradox 游戏引擎背后一套独特的数据文件格式。作者从游戏开发实践出发,比较了游戏行业常见的 CSV/Excel 表格模式与软件领域的 JSON/XML 模式,指出它们在处理复杂树状结构数据时各有局限。 有趣的是,Paradox 的格式初看像 JSON,但作者在使用 lpeg 编写解析器时有了顿悟:其核心是嵌套的列表结构,这本质上是 Lisp 的思想。这种格式语法简洁(仅用大括号和等号键值对),却拥有比 JSON 和 CSV 更强的表达能力,能优雅地定义游戏事件、触发条件等复杂逻辑,同时保持了策划人员编辑友好的可能性。 文章通过《群星》中一段具体的游戏事件代码作为实例,展示了这种格式如何清晰地组织条件判断、效果执行等游戏逻辑。作者最终得出结论:Lisp 模式在简洁性与表达力之间找到了一个更好的平衡点,为游戏数据的组织提供了一种优于传统方案的思路。

本机暂存
IT 后端/ 2017-10-15 09:56:47 / 累计浏览 1,856

sproxy开发体验

作者分享了开发sproxy代理工具时的一些实战经验。起初是为了解决内网服务需要统一通过代理访问公网的需求,他用Go编写了支持多种协议的sproxy。在后续迭代中,为了能对接Shadowsocks等服务,只需利用golang.org/x/net/proxy库并借助环境变量配置,就能轻松增加SOCKS5链式代理支持。 这次经历虽只涉及少量代码改动,却让他收获了多个实用的排坑心得。例如,在Mac上调试监听443端口的程序时,因权限不足,他通过端口重定向巧妙地解决了问题。更关键的是,他发现本地DNS解析可能被污染,导致调试时访问特定网站不通,将域名解析环节调整到SOCKS5代理之后进行则可解决此问题。文章还简要提及了dnscrypt等更复杂的DNS安全方案,以及对SOCKS5协议特性和Go语言调试环境的观察。 这些来自一线开发的具体细节与思考,对于同样在处理网络代理、开发环境调试的开发者来说,提供了不少可直接参考的路径和启发。

本机暂存
IT 安全/ 2017-10-15 09:55:48 / 累计浏览 2,112

OpenBSD 将在每次重启后都使用和之前不同的内核

OpenBSD 近期在测试快照中引入了一个有趣的内核安全特性:每次系统重启或升级后,都会生成一个内部结构完全不同的新内核。这个名为 KARL(内核地址随机化链接)的功能,通过随机重组内核内部目标文件的链接顺序,使得每个用户的内核二进制文件都是独特的。 与我们常听到的 ASLR(地址空间布局随机化)不同,KARL 并不改变内核加载到内存的地址,而是在构建阶段就改变了内核自身的内部结构。这样一来,即使攻击者掌握了某个内核的漏洞,也无法轻易利用已知的函数偏移信息去攻击另一台机器上的 OpenBSD 系统,因为它们的内核“指纹”截然不同。 文章指出,这是一个目前 OpenBSD 独有的功能。Linux 和 Windows 虽然广泛采用了 KASLR(将相同的内核加载到随机内存地址),但并未实现 KARL 这种在二进制层面的随机化。多位安全专家在文中评价这一设计思路新颖且具有价值,认为它可能为其他操作系统平台的内核防护带来新的启发。

本机暂存
IT 前端/ 2017-10-15 09:42:39 / 累计浏览 3,070

Web开发中的响应式图片处理

这篇讲的是移动时代网页图片如何“看人下菜碟”的难题。随着设备屏幕尺寸和像素密度千差万别,传统的三种方案——要么全加载高清图耗流量,要么依赖JS异步加载损SEO,要么靠服务端cookie处理欠灵活——都显得捉襟见肘。 作者详细拆解了HTML5带来的原生解决方案:为img标签添加srcset和sizes属性。核心在于理解“设备CSS像素”、“设备物理像素”和“设备像素比”这三个概念。通过“w”(物理像素宽度)和“x”(像素比)两种描述符,浏览器能自动选择最匹配设备屏幕的图片。文章通过对比实例指出,“w”描述符比“x”更灵活,能精确控制图片在不同屏幕宽度下的显示比例。 最后,文章推荐了一个名为“Responsive Image”的开源工具。它解决了手动准备多套图片的麻烦,通过简单的URL规则(如/crop和/reduce),就能在服务器端动态生成并缓存适配各种设备的图片,实现了灵活性与性能的平衡。

本机暂存
IT 数据库/ 2017-10-15 09:41:14 / 累计浏览 2,383

sqlite3导入到mysql

这篇讲的是如何将一个膨胀到15GB的SQLite3数据库(具体来自磁力链接抓取工具magnetico)成功迁移到MySQL。作者从实际问题出发:SQLite3文件过大且不支持分布式,因此需要“魔改”为MySQL,但迁移过程卡在了导入环节。 文章清晰地拆解了整个流程:先用`.dump`导出SQL,但面对大文件,导入常常中途失败。作者的核心技巧在于利用`awk`按行号切分文件,从失败点重新开始。同时,必须调整MySQL的`max_allowed_packet`参数,并使用`sed`对导出的SQL进行“方言翻译”——比如将双引号包裹的表名改为反引号,并处理十六进制数据,以解决SQLite与MySQL的语法兼容问题。 最终,通过这些针对性的步骤和一条关键的`-f`强制导入参数,完成了大规模数据的跨库迁移。对于面临类似场景的开发者,这提供了一套可复现的实战解决方案。

本机暂存