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

最新文章

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

IT DevOps/ 2021-05-27 07:41:33 / 累计浏览 1,643

迁移到 Octopress

作者将用了三年的 WordPress 博客迁移到了 Octopress。主要动机是 WordPress 太过臃肿,仅几个 PHP-FPM 进程和 MySQL 就占用了约 400MB 内存,对于访问量不高的博客来说资源消耗很不划算。Octopress 作为一个静态发布系统,以其配置简单、原生支持 Markdown 语法、模板美观等优点,迅速吸引了作者。 迁移过程主要参考了 Octopress 官方文档和几篇社区文章,几个小时内便完成了数据导出、导入和部分文章的润色,一个全新的静态博客就基本可用。不过作者也指出了 Octopress 不够完美的地方,例如插件生态较少,甚至缺少标签云这类基础功能。在迁移中还遇到了一个具体坑:更换正式域名后,生成的静态页面和 RSS 中的 URL 会新旧随机变化,导致 IFTTT 误认为文章全部更新而向 Twitter 发送了大量重复信息。清除缓存目录后问题得以解决。 总的来说,Octopress 虽不完美,但已能很好地满足作者对轻量、高效博客系统的需求。

本机暂存
IT 后端/ 2021-05-27 07:40:19 / 累计浏览 2,154

让服务器响应整个网段中的请求

这篇讲的是如何让一台服务器响应整个网段的所有IP地址请求。作者从实际需求出发,发现这个看似复杂的网络配置,核心方案其实异常简洁,仅需两步关键操作。 第一步是在路由器上为目标网段(如 172.16.0.0/16)添加静态路由,将其网关指向服务器的物理地址。第二步则是在服务器本机,使用一条 `ip route add local` 命令,将该网段绑定到本地回环接口(lo)上。作者特别指出,这样能确保服务器正确接收并回复所有来自该网段的数据包,且比使用 ARP 代理(如 tarpd、ndppd)的传统方式性能更优,不会导致网关和服务器的邻居表爆炸。 此外,作者还补充了该方法对 IPv6 同样有效,并提示路由应配置在 lo 而非 eth0 接口上以避免潜在问题。整体来看,这是一个高效、干净的解决方案,通过巧妙的路由表配置,用最小的改动实现了复杂需求,尤其适合开发测试或需要模拟多服务端点的场景。

本机暂存
IT 安全/ 2021-05-27 07:14:04 / 累计浏览 1,950

sudoers: 允许用户免密用root权限执行某些命令

作者从系统管理的实际需求出发,介绍了如何通过配置 sudoers 文件,让特定用户或组能在不输入密码的情况下,以 root 权限执行命令。文章提供了三种典型配置场景,各有侧重。 首先,针对个人用户,比如 felix021,可以直接在 sudoers 中添加一行,允许该用户免密 sudo 执行所有命令,这适合开发或测试环境中需要快速提权的场景。其次,对于团队协作,文章演示了如何允许整个组(如 adm)免密 sudo 执行所有命令,这便于批量管理权限,但需注意安全性。最后,文章展示了更精细的控制:通过 Cmnd_Alias 定义命令别名 APT_CMD,限定只允许 apt-get 或 apt install 相关的安装命令,然后允许所有用户免密执行这些特定命令,这在生产环境中能减少风险,确保只有必要操作被授权。 关键差异在于授权范围:第一种是用户级别的全权,适合个人便利;第二种是组级别的全权,适合团队协作;第三种是命令级别的限制,适合需要最小权限原则的场景。作者通过代码示例直观展示了这些配置,让读者能根据自身环境选择合适方案。 文章最后提醒,虽然免密 sudo 提升了效率,但需权衡安全性,避免过度授权带来的风险。

本机暂存
IT 设计/ 2021-05-27 07:10:31 / 累计浏览 1,636

从用户嘴里找答案

这篇讲的是产品客服如何与用户有效沟通,以及如何从反馈中挖掘真实需求。作者观察到,很多产品的反馈区充满火药味,根源在于产品方与用户之间的信息差和沟通姿态问题。 文章指出,大部分客服答疑工作本质是消除信息差,但这容易变得机械,失去人性关怀。而用户的情绪化表达背后,其实蕴藏着对产品的期望与思考。作者认为,破解僵局的关键在于转变视角:客服应尝试理解用户,顺着吐槽揪出产品痛点并坦然承认,这样才能建立共情,引导对话走向对本质诉求的探讨。 作者进一步提出,产品的驱动力分为自驱力和外驱力,而后者最核心的来源正是用户反馈。要从用户“嘴里”找到答案,需要解决一个根本挑战:如何让用户愿意且持续真诚地吐露心声?文章最后点明,明白了这一点,反馈区的火药味就会少一些,产品也会做得更好一点。

本机暂存
IT 数据库/ 2021-05-26 23:07:42 / 累计浏览 1,613

按照重要程度划分数据库级别

这篇讲的是一个为数据库重要性分级的实用框架。作者没有空谈理论,而是直接给出了从S级到D级的清晰划分,并为每个级别匹配了具体的业务场景、潜在影响范围以及相应的灾难恢复成本。 比如,一个仅影响几十人的测试系统(D级)与像12306这样的大型公共应用(S级),在业务类型、灾难救援价格(从几千元到50万元以上)以及需要的备份与灾备设施(从“几乎无任何有效备份”到“全冗余部署”)上,有着天壤之别。 这套体系的价值在于,它让技术团队能清晰地评估和沟通数据库资产的业务价值,并据此决定投入多少资源来保障其数据安全与业务连续性。文章用一个简洁的表格呈现了这种对应关系,对于需要制定数据保护策略的团队来说,这是一个非常直观的决策参考。

本机暂存
IT 开发者/ 2021-05-26 22:57:06 / 累计浏览 1,841

选择开源项目的几点原则

这篇讲的是资深工程师在面对琳琅满目的开源项目时,如何做出不后悔的选择。作者从自己曾受邀为校招生做技术分享的背景出发,分享了沉淀下来的三点实用原则。 核心观点非常明确:选项目,本质上是选“人”。具体来说,一要看项目是否活跃,有持续演进的历史,拒绝“已死”的项目;二要看项目主导者是否善于沟通,这是项目能否健康演进的关键;三要看项目是否专注,解决单一问题的“小而美”项目更便于集成与取舍。 作者特别强调,我们不必苛求代码完美,因为选择使用一个开源项目,就意味着选择了与维护者同行。真正重要的是找到那些勤奋、开明且专注的“合作伙伴”。文中还顺带吐槽了国内某些只发代码快照、缺乏持续维护的“伪开源”现象,让这个选择原则显得更加切中时弊。

本机暂存
IT 后端/ 2021-05-26 22:53:10 / 累计浏览 2,007

内存的惰性初始化

这篇文章从一个 MMO 服务器压力测试的优化场景切入,探讨了当使用 A* 算法在一个巨大的三维网格(10MB 内存)中寻路时,如何解决初始化开销过大的矛盾。 实现者为避免每次调用都 memset 清零,采用在格点中记录版本号的技巧,实现了“用到时再判断”的惰性逻辑,但这依然需要全局保留这块内存。作者从更高层面指出,这本质上是一个用平坦内存空间模拟稀疏矩阵的权衡问题。 为此,他设计了一套惰性初始化的内存结构:以 64 字节(cacheline 大小)为单位划分内存,仅用一个二级标记树(总开销约 20KB)来记录哪些段落已被初始化。访问时检查标记,按需清零。这样,绝大多数未被访问的内存区域永远不会被初始化,将时间开销降至接近于零,同时空间代价极小。 文章结尾更提出了一个巧妙的延伸思路:对于这种障碍物静态且局部的寻路,与其在运行时寻路,不如用巨大的预计算空间将路径全部存储下来,实现 O(1) 查询。这为解决此类特定问题提供了不同的架构视角。

本机暂存
IT 移动开发/ 2021-05-26 22:50:44 / 累计浏览 2,347

编译 RenderDoc 的安卓 apk(带interceptor-lib)

作者以亲身经历开篇:之前编译过安卓版的RenderDoc,但因未留笔记,再次需要时只能重头再来。这次他想为需要强Hook能力的版本做详细记录,因为核心的interceptor-lib组件依赖一个非常古老的LLVM版本,编译过程颇为繁琐。 文章的核心价值在于点出了一个官方文档中未明说的关键陷阱。尽管流程大体可循——先按指南配置好JDK/SDK/NDK,再克隆interceptor-lib并修改其构建脚本——但在实际使用CMake生成工程时,新版本CMake与Android NDK工具链的交互方式已经变化。直接使用常见的`-DANDROID_TOOLCHAIN=clang`参数实际上无效,导致构建会默认选用无法工作的GCC工具链。 作者给出的解决方法是使用正确的CMake参数:`-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang`,并指明了可参考的具体CMake模块文件路径。这个细微的修正,正是避免编译功亏一篑的关键。文章最终明确,遵循此调整后的步骤,即可成功编译出具备强Hook能力的RenderDoc安卓APK。

本机暂存
IT 后端/ 2021-05-26 22:49:42 / 累计浏览 2,582

Golang socket 里面奇怪的 pipe 使用

这篇讲的是一个Go语言代理服务器在排查文件描述符时遇到的蹊跷事。 作者日常监控发现,一个TCP连接数两万多的服务,在系统的`/proc/pid/fd`目录下却有五万多个pipe文件描述符,数量远超socket本身。这不符合直觉,于是开始深挖源码。 根因最终指向了Go在Linux下对`net.Conn.readFrom`方法的优化。为了减少用户态内存拷贝,Go会尝试使用`splice`系统调用在内核态直接完成数据传输。而`splice`要求一方必须是管道,因此其实现略显“绕”:每次`readFrom`操作都会先通过`pipe2`创建一对临时管道,再分别进行`splice`操作,用完即关。这完美解释了那些额外pipe的来源。 作者也指出,尽管这种“管道中转”的实现看起来不甚优雅,但在像代理这样`readFrom`生命周期较长的场景中,其性能收益依然可观,因此通常无需优化。文章通过一次具体的生产现象,清晰揭示了Go网络库中一个精巧但隐蔽的内核级优化机制。

本机暂存
IT 算法/ 2021-05-26 22:46:03 / 累计浏览 1,874

Raft 为什么不能直接 commit 前任的日志?

这篇讲的是 Raft 共识协议中一个容易被忽略但至关重要的设计细节:为什么 Leader 不能直接提交前任任期的日志,而必须通过提交本任期的新日志来“隐式”提交。 作者从 Raft 的几项基本原则出发,进行逻辑推演。他指出,一旦日志被 commit,对状态机的影响就不可撤销;而未 commit 的日志则可能被同一 index 不同 term 的新日志替换。核心目标是让所有节点最终提交相同的日志。 问题在多个 Leader 交替时浮现。例如,前两任 Leader 针对同一 index 产生的日志均未形成多数派,第三任 Leader 可能继承其中任一个,这就会导致另一条日志被替换。文章强调,只有 commit 自己任期的日志才能确保它“永不丢失”。这是因为现任 Leader 永远不会撤销自己任期的日志,且新当选的 Leader 一定包含上一个任期多数派中的最新日志。因此,确认本任期日志已复制到多数节点,就能保证它被所有后续 Leader 继承。 这个推理解释了 Raft 论文中反例背后的深层原理,揭示了“隐式提交”机制是如何在日志可能被覆盖的复杂场景下,依然坚定地维护日志一致性的。

本机暂存
IT 后端/ 2021-05-26 22:41:36 / 累计浏览 1,881

实现 go 的 goroutine 本地存储又一种方式

这篇讲的是Go语言中goroutine本地存储的一种新颖实现方案。 作者指出,Go本身没有提供便捷的goroutine本地存储,虽然可以通过`context`传递数据,但这要求在调用链上处处传递,侵入性较强。他发现Go标准库中用于性能剖析的`pprof`包里,隐藏着一个可以携带数据的`label`机制。 基于此,作者设计了一个巧妙的方案:利用其中一个label,通过一些底层技巧将一个`map`结构“塞”进去,从而在单个goroutine中携带所需的本地数据。同时,为了与标准库中基于`context`操作label的逻辑兼容,还做了相应的处理,防止数据被意外覆盖。 通过这种方式,作者将对原有pprof功能的干扰降到了最低。为此,他编写并开源了一个简洁的库:`github.com/xiezhenye/gls`,为需要goroutine本地状态的场景提供了一个侵入性较低的新选择。

本机暂存
IT 安全/ 2021-05-24 22:46:03 / 累计浏览 2,613

用 Pomerium 来实现基于身份的访问控制

这篇讲的是如何将 Google 提出的零信任安全架构 BeyondCorp 中的一个关键环节——基于用户身份的访问控制——通过开源项目 Pomerium 进行落地实施。作者从 BeyondCorp “内网不再等于安全”的核心理念出发,选择了 Pomerium 作为实现鉴权反向代理的方案。 文章没有停留在理论介绍,而是详细记录了在 FreeBSD 系统上的完整实践过程。从安装(甚至为系统制作了 port)、配置必要参数(如证书、随机密钥),到处理非特权用户使用 443 端口的系统限制,都给出了具体说明。核心部分聚焦于如何将 Pomerium 与 OAuth 2.0 认证流程、Google 或 Azure 等身份提供商集成,并根据系统规模选择 allowed_users、allowed_domains 或 allowed_groups 策略。 作者还特别指出了两个实践中的“坑”:一是身份提供商(如 G Suite)对服务账户权限的特殊要求,二是需防止后端服务器在重定向时陷入循环。整篇文章像是一份扎实的部署笔记,不仅分享了工具的使用,更传递了将一个安全理念转化为实际配置时需要注意的细节和经验。对于想尝试零信任方案或寻找身份感知代理工具的读者,这提供了可操作的参考路径。

本机暂存
IT 开发者/ 2021-05-24 22:45:21 / 累计浏览 1,782

在家工作一周年

这篇文章记录了作者从2020年3月开始,持续在家工作一整年的回顾与思考。作者结合2003年SARS的“宅家”经验,原本对疫情持续时间预计乐观,但事实远超预期。文章详细描述了从公司通知可自愿远程办公、自己随后出现流感症状并康复,到逐步搭建起稳定家庭办公环境的全过程。 技术细节上,作者分享了配置居家办公设备时遇到的实际“坑”:例如使用HP USB-C显示器为Pixelbook供电时,发现显示器供电不足,需额外占用USB-C口或使用带供电的Hub;某些设备直接连接显示器无法工作,改用USB-A转C线缆则能解决。这些具体经验对面临类似设备兼容问题的读者有直接参考价值。 生活层面,文章记录了为适应居家状态,在购物(转向农场团购)、车辆维护、个人护理(购置推子自助理发)及家庭清洁(引入扫地机器人)等方面发生的切实变化。此外,作者还提及在加州山火季,如何制定应急撤离清单并检查数字备份,展现了应对突发风险的准备思路。 结尾部分,作者在反思中指出,尽管居家一年完成了不少工作,但疫情无疑打乱了许多计划,也影响了更深远影响力的产生。文章在平静的记述中,流露出对逝去时光的感慨和对行业困境的观察。

本机暂存
IT 前端/ 2021-05-24 22:43:35 / 累计浏览 1,520

浅谈阿里前端的多样化

这篇讲的是阿里前端团队如何跳出传统 Web 开发的范畴,在互动体验、业务搭建乃至 Serverless 等多个领域发挥关键作用。作者从有趣的 Atwood 定律(所有应用最终都会用 JavaScript 编写)出发,结合阿里内部的实践,展示了前端技术的边界如何被不断拓宽。 文章以“双十一”等大型活动为例,详细介绍了前端如何驱动从“网页特效”到大型游戏化互动产品的演变,并构建了一套集框架、素材中心和研发平台于一体的互动技术体系。同样,在低代码搭建领域,前端工作也从单纯页面交付,演变为贯穿选品、算法、跨端渲染等完整业务链条的产品工程。 更深入的变革来自 Serverless。它让前端工程师得以摆脱运维和底层架构的束缚,有机会转型为离业务更近的“产品工程师”,从而重新定义前后端的协作边界。作者认为,这种角色演变正是前端多样化发展的必然方向。文章最后借 Reg Braithwaite 的箴言提醒我们:技术的强大在于无所不能,而挑战在于如何明智地选择与运用。

本机暂存
IT DevOps/ 2021-05-24 22:42:27 / 累计浏览 2,140

CentOS 在线升级 Oracle Linux 的方法

这篇文章讲的是如何将正在运行的 CentOS 系统在线、平滑地升级为 Oracle Linux,尤其适合因 CentOS 停止维护而寻找迁移路径的运维人员。作者从实际操作出发,详细拆解了六个关键步骤:先用 rpm 强制安装 Oracle Linux 的核心发布包与红帽发布包,接着移除原有的 CentOS 相关包与 epel 源,再安装 Oracle Linux 专属的 release 包以完成源切换。随后,系统便可通过 yum 正常更新。对于需要高性能内核的场景,文章最后还提供了可选方案——安装 Oracle 打造的 UEK 内核。整个流程的核心在于巧妙利用 rpm 与 yum 工具,在不重装系统的前提下,将软件仓库彻底切换至 Oracle Linux,从而实现平滑过渡并持续获得安全更新与技术支持。

本机暂存
IT 数据库/ 2021-05-17 23:26:41 / 累计浏览 1,724

修复 MySQL 编码问题

这篇文章讲的是一个技术人在升级MySQL后遭遇的乱码危机。作者发现自己的博客内容全都变成了乱码,查看建表语句后发现问题根源:数据表以latin1字符集存储了UTF-8编码的内容。 传统的ALTER TABLE转换方案效果不佳,于是作者转向了更灵活的mysqldump与重新导入策略。他先用 `mysqldump --default-character-set=latin1` 将数据按原貌导出,避免二次错误编码;接着通过sed命令将导出文件中的字符集声明从latin1批量替换为utf8;最后删除SET NAMES latin1语句,用utf8编码重新导入。这套组合拳成功将数据“救”了回来,避免了更糟糕的情况(如使用zfs回滚)。 整个过程清晰展示了面对编码“坑”时,如何通过理解底层原理(字符集与连接设置)来设计修复方案,而不仅仅是依赖单一命令。对于同样遭遇字符集问题的开发者,这份具体可复现的操作记录提供了直接的解决思路。

本机暂存
IT DevOps/ 2021-04-26 07:49:50 / 累计浏览 1,933

如何迁移一个Git仓库

作者从一次 Git 仓库迁移实践出发,指出不少人在操作时会遇到问题。文章系统梳理了三种主要的迁移方法,并剖析了其中的门道。 最常见的直接 `git push` 方法,其实只能迁移本地已有的分支引用,远端的其他分支和标签都会丢失。为了解决这个问题,文章介绍了两种更可靠的方案。一种是使用“裸仓库”(`--bare`),它只包含版本库数据而没有工作目录,非常适合用于纯粹的数据中转。另一种是“镜像仓库”(`--mirror`),它比裸仓库更进一步,保持了与源仓库的同步能力,适合需要后续持续更新的场景。 作者最终推荐使用裸仓库的方法进行一次性迁移,因为它操作直接且彻底。对于需要长期保持同步的场景,则可以选择镜像仓库。这篇文章清晰地对比了不同方法的原理与适用情况,能帮助读者根据自身需求选择最合适的迁移路径。

本机暂存
IT 开发者/ 2021-04-24 23:53:46 / 累计浏览 1,704

面试的艺术 - 如何面试别人

这篇讲的是,作者如何面对自己并非专家的岗位,去面试候选人。他坦言,面试是一门不完美的艺术,很难在短短几十分钟内准确判断一个人。我们能做的,是在有限时间内提高判断的正确率与召回率。 具体怎么做呢?作者的核心方法是“进行有区分度的考查”。他反对那种所有人都能答对或答错的问题。比如用算法题考察工程师的逻辑与智力,就是一种有效的区分手段。同时,面对光鲜的简历,要围绕一个项目深挖细节:问目标、问流程、问数据、问挑战。通过追问“为什么做”、“谁配合”、“最终结果如何”,能有效判断候选人是否真负责、做得好不好。 除了具体的专业技能,作者强调要关注一些基础素质,比如表达沟通能力(注意信息的“密度”)、工作热情、团队精神和学习习惯。最后,他建议将面试问题与经验标准化,形成可共享的“方法论”,并定期复盘迭代,以适应变化。 总的来说,面试不是一次性的考核,而是一个需要持续打磨和反思的技能。作者从实践出发,提供了一套可操作的框架,帮助面试官在不确定中做出更可靠的判断。

本机暂存
IT 安全/ 2021-04-24 14:50:10 / 累计浏览 1,816

SSH 密钥管理工具

这篇讲的是作者从自身日常维护多台服务器和树莓派SSH连接的痛点出发,分享了几个能显著提升效率、简化管理的密钥与配置工具。 文章首先回归基础,介绍了`ssh-keygen`生成密钥对这一安全实践。随后,重点对比了几种分发和管理公钥的实用工具:`ssh-copy-id`可以一键将本地公钥复制到目标主机,在家庭网络等信任环境中极为方便;而`ssh-import-id`则提供了更灵活的方案,它能直接从GitHub等平台导入你已有的公钥,不仅省去了手动复制粘贴的步骤,更成为管理多人访问服务器权限的利器——作者就用它轻松授权同事登录。 除了密钥,连接管理本身也是个麻烦事。文章推荐了一个名为`storm`的命令行工具,它通过交互式命令将复杂的连接参数(主机名、端口、用户等)快速添加到SSH配置文件中,之后你就可以用简单的别名(如`ssh pi3`)完成连接,无需记忆冗长命令。文章也点明了其本质就是管理`~/.ssh/config`文件,给喜欢手动配置的用户指明了方向。 作者的分享从密钥生成、安全分发到连接配置,形成了一套完整的效率提升工具链,让繁琐的SSH日常变得高效且有序。

本机暂存