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

最新文章

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

IT 算法/ 2020-02-01 17:01:15 / 累计浏览 2,308

视频的容器与格式

这篇梳理视频格式领域的基础文章,从“编码”与“容器”两个核心维度展开。作者将视频编码(如H.264、H.265)比作内容的“压缩标准”,决定了画面质量与文件大小;而容器(如MP4、MKV)则是装载这些内容的“打包盒子”。文章依次介绍了从经典的MPEG-1/2到目前主流的H.264、代表趋势的H.265等编码技术的演进与特点,并对比了MOV、AVI、MKV等主流容器的优劣——例如MKV因其超强的包容性而被称为“万能容器”,能封装几乎任何格式的音视频流。 对于需要处理或选择视频格式的开发者、创作者而言,文章提供了清晰的脉络:H.264+MP4是当下兼容性最广的选择,而H.265则代表了在同等画质下更高效压缩的未来方向。无论是理解DVDRip中的MPEG-2,还是分辨RMVB文件背后的RealVideo编码,这篇文章都给出了直观的解答。

本机暂存
IT DevOps/ 2020-02-01 16:51:06 / 累计浏览 2,529

Centos 7 SSH连接超时自动断开的解决方案

这篇讲的是在Centos 7服务器上,SSH连接因闲置超时频繁自动断开,影响操作效率的问题。 作者从自身在Centos 7下安装软件时的困扰出发,定位到问题根因在于SSH服务端的连接保活机制。当客户端一段时间无数据交互,服务端会主动切断连接。解决方法很直接:编辑SSH守护进程的配置文件`/etc/ssh/sshd_config`,调整两个关键参数。将`ClientAliveInterval`从默认的0(禁用)改为60秒,意味着服务端会每60秒向客户端发送一次保活信号;同时将`ClientAliveCountMax`保持为3次,即如果连续3次(共180秒)都没有收到客户端响应,才会真正断开连接。 完成修改后,执行`systemctl restart sshd`重启服务使其生效。此后,即使长时间不操作终端,连接也能保持稳定,不再被意外中断。这个调整方案简单有效,对于需要长时间保持SSH会话的运维或开发场景非常实用。

本机暂存
IT 算法/ 2020-02-01 16:50:18 / 累计浏览 2,087

增长二三事

这篇讲的是作者在听了Hola Group增长负责人Daisy的分享后,对“增长”这件事梳理出的几点核心认知。文章没有停留在理论,而是直面增长中的现实矛盾与动态规律。 作者开篇就挑战了一个常见误解:获客成本(CAC)并非越低越好,而是随着拉新规模的扩大必然上升。为此,他用了一个很直观的45度线上升曲线来比喻。接着,他将用户划分为铁杆粉丝、中需求群体等不同圈层,指出每个圈层的用户终身价值(LTV)、CAC和数量(N)都不同,这构成了增长公式 MAX[(LTV - CAC) * N] 的动态变量。文中以抖音从垂类泛化到全民产品的过程为例,说明了清晰计算各圈层模型、用商业化能力覆盖不同CAC水平的重要性。 文章进一步探讨了“努力”的意义——在CAC必然上升的趋势下,精细化的运营(如裂变、广告优化)能像压弹簧一样,在同一圈层内尽可能降低CAC。作者还强调了流量的季节性波动、留存问题的复杂性(可能源于渠道不匹配或短期活动),以及流量红利载体(从App到小程序、共享设备)的快速变迁。最后,他提出了一个评估流量价值的双维视角:用户交互时长与支付金额,并回归到产品市场契合度(PMF)与增长公式的结合,才是驱动增长的王道。 对于运营者或产品经理而言,这篇文章最大的启发或许在于:增长不是套用单一公式,而是持续、动态地计算不同用户群的商业模型,并敏锐捕捉变化中的流量机会。

本机暂存
IT DevOps/ 2020-02-01 16:49:42 / 累计浏览 2,256

centos查找大文件

这篇讲的是在CentOS系统中快速定位那些悄悄吃掉磁盘空间的大文件。作者直接切入实用场景,给出了三个层层递进的命令技巧。 首先,文章介绍了如何用 `find` 命令高效找出系统中所有超过200MB的文件,这是解决磁盘告警问题的第一步。接着,针对“不确定是哪个目录占用空间”的常见困境,用 `du -h --max-depth=1` 命令可以直观地查看当前目录下每个子目录的磁盘占用情况。最后,为了快速锁定“元凶”,文章还展示了如何用管道将 `du` 的输出通过 `sort -n` 进行数值排序,让占用空间最大的目录一目了然。 整个过程没有复杂理论,直接给出了可复制粘贴的解决方案,非常适合系统管理员和运维人员在日常维护中快速上手操作。

本机暂存
IT 开发者/ 2020-02-01 16:45:03 / 累计浏览 2,381

游戏引擎中的资源生命期管理问题

这篇讲的是游戏引擎开发中资源生命期管理的架构演进与权衡。作者从团队实际遇到的问题出发:最初依赖Lua的垃圾回收,但其触发时机不可控,易造成图形渲染卡顿;而随着场景复杂化,单帧内过多的资源API调用甚至导致渲染后端崩溃。 为应对这些问题,团队先后尝试了经典的引用计数方案,但作者认为在Lua框架与内存受限的移动设备上,单纯基于“是否还有引用”来决定资源释放并非最优解。他将资源分为两类:一类是可从磁盘重新加载的IO资源(如贴图),另一类是依赖上下文、难以重建的运行时生成资源。 针对第一类资源,作者提出不应被引用关系束缚,而应遵循LRU原则,允许引擎随时释放长期未用的内存。对于第二类资源的处理灵感则来自imgui:采用“每帧主动创建”的方式来规避复杂的重建回调,再将结果缓存。这样一来,所有资源都可以统一由LRU策略管理,在内存压力下安全淘汰。文章梳理了从全量保留、Lua GC、引用计数到统一LRU缓存的完整思考路径,展现了从具体约束中提炼通用架构的工程智慧。

本机暂存
IT 设计/ 2020-02-01 16:44:33 / 累计浏览 2,409

资源文件的转换问题

这篇讲的是作者在自研游戏引擎中遇到的一个资源转换缓存失效问题,以及由此展开的架构优化。 他们引擎的资源转换采用惰性策略:在虚拟文件系统中,根据`.lk`描述文件和平台信息按需生成最终资源。但最近发现,对于 shader 这类依赖其他 include 文件的“代码型”资源,仅靠源文件和`.lk`文件的 hash 作为缓存 key 是不够的——修改依赖文件后,系统并未感知变化,错误地返回了旧缓存。 根因在于初始设计过于简化,未考虑编译的完整依赖链。放弃惰性构建的方案很快被否决,团队最终提出一个更巧妙的方案:当请求构建时,系统会在后台无条件重新编译,并将此次编译的**完整参数和依赖关系**(包括所有依赖文件的路径及当前 hash)写入一个新的构建脚本文件(如 `a.sc.lk.ios`)。这个文件本身唯一确定了一个编译结果,其 hash 就成了新的、精确的缓存 key。 这个机制既保留了惰性转换的优点,又实现了准确缓存。相比 Unity 的 cache server,它的优势很明显:缓存键是包含依赖的完整过程,因此可以跨项目复用(同一张贴图不会因路径改变而需重新编译)。此外,文件服务器还能利用空闲时间预编译其他平台版本,这是纯键值存储的 cache server 做不到的。这个设计有点类似 Git 大文件存储,用一个轻量引用指向背后的编译服务。

本机暂存
IT 开发者/ 2020-02-01 16:40:12 / 累计浏览 1,530

程序员应该怎样提高自己

这篇文章是一位拥有近30年经验的资深程序员,对“程序员如何提高自己”这一高频问题的系统性回应。作者认为,成长始于对代码优化的乐趣——正是“写出更高效代码”的追求,驱动着程序员自发去理解操作系统、内存模型等底层原理。 精通一门语言是基石,但这意味着要了解其所有特性的代价与惯用法。作者指出,设计模式本质上是语言特定惯用法的总结。而要突破瓶颈,则必须掌握第二门语言,通过对比不同范式来拓宽解决问题的思路。 在掌握具体技能之外,更高阶的能力在于分解问题、保持简洁的架构设计思维。作者强调,真正的简洁源于对优化与代价的深刻理解,而非一味追求技巧。同时,他呼吁重视工具链掌握、脚本编写等“软能力”,并积极参与开源协作,将沟通与理解能力视为与编码同等重要的核心素养。 这些源于长期实践的经验,为年轻程序员勾勒出一条从兴趣驱动到工程思维的成长路径。

本机暂存
IT 设计/ 2020-02-01 15:20:17 / 累计浏览 2,546

ECS 中的消息发布订阅机制

这篇讲的是作者在用Lua实现ECS框架时,如何解决“周期性状态迭代”与“响应式事件处理”之间的矛盾,并最终引入一套完备的消息发布订阅机制。 作者从实践中发现,纯粹的游戏循环难以高效处理复杂外部输入。因此,他最初刻意在ECS中回避事件系统,将内部事件都转化为状态变化。但这并不完全符合游戏混合型业务的本质。 于是,他决定为框架增加消息发布订阅模块。核心实现非常灵活:每条消息都是一个Lua table构成的键值对,例如 `{ type = "mouse", action = "move", x = 100 }`。系统通过 `world:pub` 发布,任何System则通过一个模式(pattern)来订阅感兴趣的消息,比如订阅所有 `type="new"` 的消息,或者只订阅特定实体的状态变化。 巧妙之处在于其性能优化思路。作者没有选择简单的遍历匹配,而是在订阅时建立索引缓存。发布时,先根据消息中的各个条件快速排除不相关的订阅者,大幅减少了比较次数。这种用空间换时间的策略,让消息分发效率更高。文章也探讨了面对复杂条件可能导致的缓存膨胀问题,为后续优化留下了空间。

本机暂存
IT 移动开发/ 2020-02-01 15:18:13 / 累计浏览 2,567

Android 中低内存对性能的影响

这篇文章从实际性能问题出发,系统分析了 Android 系统在低内存状态下对整机性能的拖累。作者首先点明了问题背景:随着系统与应用膨胀,4GB 以下设备在日常使用中极易陷入低内存状态,并直观表现为应用启动慢、列表滑动掉帧、设备发热等现象。 文章详细拆解了低内存的数据与行为特征。开发者可以通过 `dumpsys meminfo` 观察到 Free RAM 极低、ZRAM 使用率飙升等关键指标,同时在系统日志中能看到 Low Memory Killer (LMK) 与 kswapd 线程异常活跃,频繁执行内存回收与进程查杀。 更深入的是,作者剖析了低内存导致卡顿的具体机制:内存不足引发磁盘 IO 频繁,会阻塞主线程;内核回收线程 kswapd 会抢占 CPU 资源,与前台应用竞争;而 LMK 激进查杀后台进程,又会触发应用重启,形成 CPU、内存与 IO 资源的恶性循环。文章还涵盖了相关的调试方法与潜在的优化方向。

本机暂存
IT AI/ 2020-02-01 15:14:13 / 累计浏览 1,639

美好世界,源自不开心。

这篇讲的是科技史上那些划时代创新背后一个略带反直觉的驱动力:不开心。 作者从Linux之父Linus对迟迟未能工业化的Unix感到不满,到乔布斯对早期智能手机笨拙体验的厌烦,再到雷军、张小龙、王兴等国内创业者各自“忍无可忍”的痛点出发,串联起一系列经典案例。文章罗列了从iPhone、微信、美团到比特币、以太坊等重大产品与技术的诞生,都将起点归因于创造者对现状的强烈不满与情绪低落。这些故事横跨操作系统、移动互联网、社交网络与区块链等多个关键领域。 文章用戏剧化的叙述和排比,提炼出一个核心观点:对现有解决方案的深刻不满,甚至是一种情绪上的“不开心”,恰恰是颠覆式创新的重要火种。它将技术发展与个人情绪体验紧密挂钩,为读者理解创新动机提供了一个生动而富有冲击力的视角。当然,文末也注明了内容属于虚构创作,意在启发而非陈述史实。

本机暂存
IT 开发者/ 2020-02-01 15:13:41 / 累计浏览 1,836

工作七年小结: 学习,生活及其他

这是一位有七年工作经验的后端开发者的自述。文章以时间线回顾了他从测试开发转至Python后台开发,历经创业公司起伏后在现公司沉淀的历程,并由此分享了对学习、生活与工作的核心思考。 在学习上,作者形成了两个关键观点:一是从实际工作需求出发,进行“学以致用”的实践循环,避免无效投入;二是跳出日常,从职业规划与行业趋势出发,系统性地构建个人的技能树。他反思了过去盲目追求技术热点、购买大量书籍却转化率低的“盲区”,并推荐了以深度和体系化见长的学习资源。 生活方面,作者强调“follow your heart”做出选择并为之负责,同时要警惕注意力陷阱——通过限制屏幕时间、关掉不必要的通知,将更多精力投入到阳光、运动等真实生活的美好细节中。他提出通过仪式感(如“电影之夜”)打破模式化的僵局。 对于工作,他总结了几点心得:多站在对方角度思考、保持谦虚并真正反省改进、凡事“多走一步”,以及最根本的,建立自己专业与靠谱的口碑。 文章结尾处,作者坦言过往种种皆为积累,未来仍需不断学习与成长,并计划重新拾起笔记录思考。这七年的折腾与沉淀,最终指向一个清醒的认识:规划与持续行动是成长的关键。

本机暂存
IT 后端/ 2020-02-01 15:07:16 / 累计浏览 1,995

一文读懂分布式系统CAP定理

这篇讲的是分布式系统中著名的CAP定理,作者从自己初遇概念时的困惑出发,试图用更直白的方式把这个“看不见的手”讲明白。文章核心指出,在分布式环境中,一致性(C)、可用性(A)和分区容错性(P)三者不可兼得,必须做出权衡。 作者通过具体的MySQL集群案例,对比了三种典型选择:追求CA时,如基于主键的分库分表,能保证强一致和高可用,但无法应对网络分区;选择CP时,如严格的主从复制模式,数据一致性得到保障,但分区会导致写操作不可用;而倾向AP时,如允许异步复制的集群,则优先保证服务不中断,但可能读到过时数据。 文章最后自然引出了BASE思想,这是许多高并发系统在CAP约束下的实际选择——优先保障基本可用,接受临时数据不一致,最终达到一致。作者用面试经历和自学过程串联全文,让理论落地到实际架构的考量中。

本机暂存
IT DevOps/ 2020-02-01 15:05:01 / 累计浏览 2,330

图解4种git合并分支方法

这篇讲的是Git分支合并的“四重奏”。作者从“在Git里改变历史是可能的”这个有趣的比喻切入,把抽象的版本控制操作讲得像在不同宇宙间穿梭。 文章图解了四种核心合并方法:最常用的merge其实有三种模式——fast-forward在无分叉时直接移动指针,效率最高;`--no-ff`会强制保留合并节点,让历史更清晰;`squash`则把多个提交压成一个,适合整理功能分支。除此之外,还介绍了rebase,它通过重写提交历史来创造线性、干净的版本树;以及灵活的cherry-pick,可以像摘樱桃一样精确选择某个提交合入当前分支。 作者通过动态示意图,清晰展示了每种操作对提交历史树的影响,比如rebase会将原本分叉的提交“移植”成直线。这种可视化对比,能帮助开发者快速理解不同策略的差异:merge适合保留完整上下文,rebase擅长维护主线整洁,而cherry-pick在修复特定问题时无往不利。 掌握这些方法的区别,就像拿到了Git历史管理的完整工具箱,面对再复杂的分支拓扑也能从容应对。

本机暂存
IT 后端/ 2020-02-01 15:01:57 / 累计浏览 2,404

TPS及计算方法

这篇围绕TPS(每秒事务数)及其计算方法展开。文章首先明确了TPS的基本定义,并通过一个简单示例说明了如何基于事务数量和响应时间(节拍)来计算。 接着,文章引入了经典的利特尔法则,并详细解释了其在生产环境中的应用逻辑。作者通过两个生动的示例——一个是关于并发服务器容量规划,另一个是排队问题——展示了如何利用该法则推导系统行为,指出提升性能的关键在于增加并发处理量或缩短处理时间。 更进一步,文章探讨了在负载模型中影响TPS的两个关键因子:响应时间和节拍。通过具体示例对比了当节拍为零与不为零时,TPS受谁主导,进而推导出负载模型中利特尔法则的扩展公式:系统内平均用户数 = (平均响应时间 + 思考时间)× 吞吐量。最后给出了一个具体的计算实例,清晰地呈现了各参数之间的关系。 掌握这些概念,对于准确进行性能评估与容量规划至关重要。

本机暂存
IT 前端/ 2020-02-01 14:59:54 / 累计浏览 2,448

一图看懂HTTP缓存控制/浏览器缓存控制

这篇从一张广为流传但部分有误的HTTP缓存控制流程图说起,系统梳理了浏览器缓存的两大核心机制:强缓存与协商缓存。 作者清晰对比了两者的关键差异。强缓存(状态码200)在资源有效期内直接从本地读取,不发起网络请求,主要依赖`Cache-Control`(相对时间)和`Expires`(绝对时间)头部控制,前者优先级更高。而协商缓存(状态码304)则需服务器验证资源是否更新,核心涉及`ETag/If-None-Match`与`Last-Modified/If-Modify-Since`两组字段的配合,服务器会优先校验ETag。 文章还深入解答了常见实践问题:例如,为何需要ETag(解决Last-Modified在秒级修改和内容不变时更新时间等情况下的局限性),以及在未设置任何缓存策略时,浏览器采用的启发式算法。最终,作者提供了一张更正后的流程图,将复杂的缓存判断逻辑可视化,帮助开发者理清`Cache-Control`、`ETag`、`Last-Modified`等字段在决策树中的具体位置与作用,避免在实际开发中配置出错。

本机暂存
IT 前端/ 2020-02-01 14:50:59 / 累计浏览 1,903

浏览器中丢失referrer和HTTPS=>HTTP丢失referer的解决:基于会话的站内来源地址URL还原

这篇讲的是浏览器中Referer丢失导致来源分析失效的常见痛点,以及一个巧妙的后端解决方案。作者从实际项目出发,梳理了Referer丢失的五种主要场景:代码因素如JavaScript构造链接、HTTPS降级到HTTP时的协议限制、多核浏览器切换内核或隐私模式、鼠标手势等高级功能的干扰,以及来自微信或微博等移动App的点击。这些问题逐一修补开发量巨大,且浏览器兼容性复杂。 核心方案是采用基于会话的站内来源地址URL还原。具体做法是在服务端设置会话Cookie,例如通过OpenResty的encrypted-session模块生成加密会话,然后在日志分析系统中跟踪同一Cookie的访问路径。这样就能模拟还原用户完整的站内导航轨迹,无需依赖前端Referer头。 作者指出,这种方法绕开了传统修复中代码层面的繁琐调整,尤其应对多核浏览器和隐私模式这类难以控制的因素。通过后台日志的会话跟踪,网站能可靠地进行来源分析,提升了数据追踪的完整性和可维护性。

本机暂存
IT 后端/ 2020-02-01 14:41:51 / 累计浏览 2,018

令人困惑的strtotime

这篇讲的是PHP中strtotime函数的一个常见坑点。当开发者使用“-1 month”、“+1 month”或“next month”等相对日期字符串时,结果往往出人意料。比如从2018-07-31执行strtotime("-1 month"),会得到2018-07-01而非预期的2018-06-30,这让人对函数的可靠性产生疑惑。 问题的根因在于strtotime的内部处理逻辑:它先执行月份运算,再对日期进行规范化。以2018-07-31为例,减一月后得到06-31,但6月没有31天,于是日期被自动调整为07-01,就像时间计算中2点60分等于3点一样。文章通过多个代码示例验证了这一原理,例如在2017-08-31上加一月会得到2017-10-01,在2017-01-31上使用next month会跳到2017-03-03,因为2月天数不足导致规范化后月份再进位。 如何解决这个陷阱?作者指出,从PHP5.3版本

本机暂存
IT 后端/ 2020-02-01 14:38:37 / 累计浏览 2,427

深入理解PHP7内核之Reference

这篇讲的是PHP7内核中对引用(Reference)机制的一次重要重构。作者从PHP5时代用标志位实现引用带来的性能瓶颈出发,剖析了为何在PHP7中必须将“引用”升级为一种独立的数据类型(IS_REFERENCE)。 文章的核心在于解释这个新类型如何解决实际问题。PHP7的zval结构被优化为直接存储简单类型(如整数),但引用需要计数,这产生了矛盾。解决方案是引入一个“间接层”:IS_REFERENCE类型的zval内含一个指向zend_reference结构体的指针,该结构体才真正持有引用计数和另一个zval。这个设计精巧地解决了“整数引用”这类问题。 更重要的是,文章通过代码示例对比了新旧机制在“写时复制”(Copy-On-Write)行为上的差异。在PHP5中,复制一个共享的引用变量会强制发生复制,导致内存开销;而在PHP7下,复制操作只会增加内层zval的引用计数,避免了不必要的内存拷贝,文章中的测试数据也直观证实了这一点。这使得引用的处理在内核层面变得更高效、更清晰。

本机暂存
IT 后端/ 2020-02-01 14:36:16 / 累计浏览 2,519

PHPTS:一键免费搭建 Nginx + PHP + MySQL + Redis + Memcached 网站、APP、小程序服务器端运行环境

这篇讲的是如何在 Windows 上快速搭建网站服务器环境。传统方式需要手动安装和配置 Nginx、PHP、MySQL 等一堆组件,过程繁琐且容易出错,尤其是官方 Nginx for Windows 版本在连接数和性能模型上限制明显,往往只能用于测试。 文章介绍的 PHPTS 软件给出了一个“一键搞定”的方案。它将上述组件集成为一个安装包,并对关键的 Nginx 进行了深度优化——采用了 Windows IOCP 模型并支持多进程,将连接数上限从官方版本的 1024 大幅提升至 32768,使其在 Windows 上也能胜任生产环境。这解决了长期困扰 Windows 开发者的性能痛点。 除了作为本地开发环境,软件还定位为边缘计算平台。它可以运行在各类本地设备上,利用本地算力完成 AI、音视频处理等任务,减少对公有云的依赖,并支持与云服务组建混合云。对于需要在 Windows 下快速启动 Web 服务或探索本地化部署的开发者来说,这提供了一个免费且开箱即用的选择。

本机暂存
IT 后端/ 2019-08-11 12:23:37 / 累计浏览 2,591

Http/2知识图谱

这篇讲的是HTTP/2环境下依然有效的十大通用性能优化规则。作者从HTTP/2与HTTP/1.x的显著差异出发,提炼出一系列核心实践。 文章具体列出了这些优化点:包括通过优化DNS查询来避免请求阻塞,充分利用HTTP/2的单TCP连接特性,以及谨慎处理跨域重定向。它强调了客户端与CDN边缘缓存的必要性,并提到了使用条件缓存、gzip压缩和针对性图片优化等具体手段。同时,文章也客观指出,像激进的预获取资源这类做法,在HTTP/2下可能收效甚微且开销大。 文章的一个关键亮点是,除了正面规则,还专门指出了HTTP/2下应避免的反模式,并配有一张清晰的知识图谱。这为开发者提供了直接的避坑指南。对于追求Web性能优化的工程师来说,这份结合了新旧协议考量的规则清单,具有很强的实操参考价值。

本机暂存