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

最新文章

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

IT 后端/ 2018-12-26 23:38:42 / 累计浏览 2,353

交易系统如何确保账簿100%准确

这篇讲的是如何从设计层面根本性解决交易系统的账簿对账难题。作者指出,对账处理不好会带来巨大的人力成本和线上修改风险,因此提出一个核心设计原则:时刻保持整个系统的资产负债表为零。 文章以一个比特币交易系统为例,展示了只存储用户余额(资产)的账户表为何难以对账。关键一步是引入一个虚拟的“负债”(DEBT)账户来平衡整个资产负债。这样,无论用户间如何交易、资产如何转移(包括手续费进入FEE账户),所有账户的余额按币种求和,结果理论上都应精确为零。 基于此,对账逻辑变得极其简单:在每笔交易后执行一句SQL查询,检查各币种余额总和是否为零。文章还解释了用户入金和出金的本质是资产与负债账户之间的转移。这套设计不仅让系统能自动化、近乎实时地验证账簿准确性,也极大简化了财务核算,体现了用清晰架构提升系统可靠性的思路。

本机暂存
IT 移动开发/ 2018-12-26 23:37:12 / 累计浏览 3,317

如何在毕业三年完成技术跃迁

这篇讲的是在毕业招聘季的宣讲中,作者分享了程序员如何在职业初期实现关键技术跃迁的经验思考。 他借用量子力学“跃迁”的概念,将技术成长描绘成一个从新手到单领域专家的非连续性跳跃过程。作者用一条清晰的曲线指出,大部分程序员会经历一个漫长的“稳定期”进行知识积累,只有当离散的知识点有意识地联结成网,构建起个人的技术知识体系,才能完成向专家的第一次跃迁。 文章以开发一个App登录功能为例,生动展示了具备知识体系的工程师会如何系统性地进行设计:从确立可靠性、安全性的目标,到考虑架构、网络、多线程、存储等层面的具体设计,而非一上来就编码。 对于如何实现跃迁,作者给出了方法论:持续夯实包括操作系统、网络、算法、架构设计在内的基础知识体系,并在项目中积累平台知识,最后通过不断的反思与总结,将点状经验编织成网。对于即将步入职场的工程师而言,这提供了一份清晰而务实的成长路线参考。

本机暂存
IT 开发者/ 2018-12-26 23:33:28 / 累计浏览 3,286

技术跃迁书单推荐

作者结合自身8年互联网行业经验,分享了一份带有个人色彩的技术书单,核心观点是:读书是形成体系化知识的关键,其作用无法被工作、看博客等碎片化学习所替代。 书单主要覆盖编程基础、设计与架构、网络三大领域。在编程基础部分,推荐了被誉为“一部神书”的《代码大全》,以及《重构:改善既有代码的设计》;设计架构部分,推荐了讲解深入浅出的《设计模式之禅》、免费的《Software Architecture Patterns》电子书以及经典著作《Software Architecture in Practice》;网络部分则推荐了入门读物《图解HTTP》与《图解TCP/IP》、案头常备的《HTTP权威指南》以及实践派的《Web性能权威指南》。 作者对每本书都给出了直白的个人评价,例如指出《代码大全》能帮读者“大概率超越80%的程序员”,而《重构》则“看起来厚,读起来很快,忘得更快”,更适合当作常备工具书。这份书单会不定期更新,为处于不同阶段的开发者提供了清晰、具体的阅读指引。

本机暂存
IT 开发者/ 2018-12-24 23:58:32 / 累计浏览 2,327

在命令行中步入黑客帝国

这篇文章从经典科幻电影《黑客帝国》上映二十周年的怀旧情怀出发,介绍了一个能让你在终端中体验“数字雨”视觉效果的命令行玩具——cmatrix。作者首先回顾了电影中那些令人印象深刻的代码流特效,随后将话题引向今天的主角。 cmatrix是一个开源工具,能够完美复刻电影中绿色字符如瀑布般滚落的场景。文章不仅说明了它在Fedora等系统上简单的安装方式(例如使用`dnf install cmatrix`),还直接展示了运行后的生动效果。对于喜爱折腾终端和怀旧的极客而言,这是一个既简单又有趣的视觉装饰。 作为“命令行玩具”系列的一篇,本文也延续了该系列的宗旨:在严肃的开发工作之余,探索终端里那些纯粹为了好玩和消遣的小项目。如果你正在寻找一种快速为单调的命令行界面注入一点电影感和趣味的方法,这个工具或许能给你带来片刻的灵感与放松。

本机暂存
IT 后端/ 2018-12-24 23:49:43 / 累计浏览 2,092

一起来学 Spring 2.X

这是一份针对 Spring Boot 2.x 的全面学习指南,由作者唐亚峰在其个人博客上连载。系列文章从最基础的构建第一个 Spring Boot 工程讲起,为读者铺设了一条清晰的学习路径。 整个系列系统性地覆盖了 Spring Boot 2.x 开发中的核心技术栈。作者不仅详细解释了配置管理、日志框架这些基础内容,还深入到整合 Thymeleaf 模板、使用 JdbcTemplate、Spring Data Jpa 以及 MyBatis 进行数据库访问的实战环节。对于进阶需求,文章进一步探讨了如何集成 Lettuce Redis 做缓存、利用 Spring Cache 二级缓存、接入 RabbitMQ 消息队列(包括延迟队列的实现),以及使用 Swagger 进行接口在线调试。 除了核心功能集成,系列也关注应用运维与工程化实践。例如,通过 Actuator 与 Spring Boot Admin 实现服务监控与管理,配置定时任务,实现文件上传与全局异常处理,以及借助 Liquibase 进行数据库版本管理。在安全与性能方面,讲解了整合 Shiro 安全框架,使用本地锁与分布式锁防止重复提交,并探讨了分布式限流方案的优雅实现。甚至包括 JDK8 日期格式化这种实用细节和 WebSocket 聊天室搭建这样的趣味课题。 这个系列最大的特点是循序渐进且内容扎实,每一讲都聚焦一个明确的主题并提供可运行的示例,非常适合希望从零开始或系统性巩固 Spring Boot 2.x 开发技能的读者作为案头参考。

本机暂存
IT 开发者/ 2018-09-20 21:53:32 / 累计浏览 2,209

四年努力,梦归阿里,和大家聊聊成长感悟

这篇文章讲述了技术博主“五月的仓颉”在工作四年后,成功加入阿里的经历与感悟。作者从毕业初期的迷茫讲起,分享了他如何通过系统性地研究招聘需求、制定学习计划,并在一年内高强度学习JDK源码、虚拟机等核心知识,最终实现目标的具体过程。 文中重点探讨了程序员成长的阶段划分。作者认为,工作五年是一个关键节点,此时应从扎实的个人基本功(如框架原理、JVM、分布式知识等)和项目实战能力(独立处理复杂业务、排查疑难问题、带领小团队)两方面同步提升。他特别强调“深度优先、广度次之”的学习策略,即在一到两个方向上深耕,远胜于广泛涉猎但浅尝辄止。 最后,作者指出进入大厂并非终点,而是更努力的新起点。全文没有空泛的鸡汤,而是用亲身经历和技术思考,为处于成长期的程序员提供了一份清晰的路线图和真诚的鼓励。

本机暂存
IT 算法/ 2018-09-20 21:51:35 / 累计浏览 3,666

一维数组的聚类

这篇讲的是如何更智能地划分一维数据的区间。作者从分析订单价格分布的实际问题出发,指出简单按固定梯度(如每100元)划分可能忽视数据中天然存在的“分隔点”(比如Airbnb房价分布),导致分组不自然。 文章详细比较了三种解决一维聚类的方案。首先是将数据reshape成二维后使用通用的K-Means算法。其次是专门针对一维数据的Jenks Natural Breaks自然断点法,它通过最小化类内方差之和来寻找最佳分界点,并探讨了使用GVF指标来确定最优聚类数K的经验方法。第三种是利用核密度估计,通过寻找概率密度曲线的极值点(波峰与波谷)来自动划分数据。作者不仅阐述了原理,还提供了Python实现代码,清晰地展示了如何运用Jenks算法计算GVF值,以及如何用KDE寻找数据的自然断裂处。整个对比有助于读者根据数据特点和分析需求,选择最合适的区间划分工具。

本机暂存
IT DevOps/ 2018-09-20 21:40:57 / 累计浏览 2,210

Scrot:让你在命令行中进行截屏更加简单

很多人的习惯是使用图形界面工具来截屏,比如 Shutter 或系统自带的功能。但如果你在一台没有桌面环境的服务器上,或者在一台配置较低、不值得安装重型工具的老机器上,想快速抓一张图该怎么办?这篇讲的是一个久经考验的解决方案——命令行工具 Scrot。 文章开篇点明了 Scrot 的适用场景:当你需要轻量、快速的截屏,或者系统缺乏图形化工具时,它便能派上用场。接着,作者没有停留在“它能做什么”,而是深入演示了具体用法:从基础的全屏截图 `scrot [文件名]`,到使用 `-u` 参数截取当前窗口,再到用 `-s` 参数交互式地框选屏幕特定区域。为了让操作更实用,文章还详细解释了如何通过 `-d` 参数设置延迟截图,以便有足够时间切换到目标窗口。 除了核心功能,文中还补充了一些提升效率的实用选项,例如用 `-t` 生成方便分享的缩略图,以及用 `-c` 在延迟时显示倒计时。文章最后回归简单,指出 Scrot 虽然功能基础,但在其设计的初衷上做得非常可靠,尤其适合服务器运维或老设备等特定场景。

本机暂存
IT DevOps/ 2018-09-20 21:40:26 / 累计浏览 3,214

初学者指南:在 Ubuntu Linux 上安装和使用 Git 和 GitHub

对于刚开始接触 Linux 和版本控制的开发者来说,如何将本地代码可靠地同步到云端协作平台,往往是迈向开源世界的第一道坎。这篇文章就为 Ubuntu 用户提供了一份清晰、可操作的入门路线图。 它没有停留在抽象概念,而是直接从终端命令开始,手把手演示了在 Ubuntu 系统上完成 Git 安装、GitHub 账户配置、创建本地仓库、添加文件、提交更改,直至最终将整个项目推送到 GitHub 远程仓库的全过程。文章特别强调了几个关键步骤的实际操作:例如使用 `sudo apt-get install git` 进行安装,通过 `git config` 命令绑定你的用户名与邮箱,以及用 `git add` 和 `git commit` 来管理文件变更。这些步骤都配有具体的命令示例和效果截图,让读者能逐一对照执行。 整篇指南面向已注册 GitHub 账号、但对 Git 工作流尚不熟悉的 Linux 初学者。它省略了复杂的理论铺陈,聚焦于“如何让它跑起来”,非常适合想要立刻动手实践、将自己的第一个小项目托管到 GitHub 上的新手开发者。

本机暂存
IT DevOps/ 2018-09-20 21:39:26 / 累计浏览 2,268

如何从 Linux 命令行安装软件

这篇讲的是,即使在图形界面盛行的今天,许多资深Linux用户依然偏爱用命令行安装软件——因为它更快、更直接。文章从25年Linux用户的经验出发,介绍了包管理器的核心概念:它如何像一个智能助手,自动处理应用的安装、更新与依赖关系。 作者重点对比了两大主流系统:Debian、Ubuntu等基于`.deb`的发行版,常用`apt`或`dpkg`命令;而Red Hat、CentOS等基于`.rpm`的系统,则主要使用`yum`、`dnf`或`rpm`命令。文中清晰列出了从安装、卸载到升级的具体命令示例,比如`sudo apt install`与`sudo dnf install`,让读者能直观看到操作差异。 无论你使用哪种发行版,掌握对应的包管理命令行工具,都能让软件管理变得更高效。文章最后也提醒,一旦习惯了这种方式,你会发现它比图形界面工具还要快。

本机暂存
IT 算法/ 2018-07-05 14:00:16 / 累计浏览 3,742

相似度计算之兰氏距离

这篇讲的是相似度计算中的兰氏距离,也被称为堪培拉距离,它被认为是曼哈顿距离的加权版本。作者从定义公式出发,展示了兰氏距离如何通过绝对差值除以绝对值之和来计算两个向量间的距离,公式为 \( d(\mathbf{p}, \mathbf{q}) = \sum_{i=1}^{n} \frac{|p_i - q_i|}{|p_i| + |q_i|} \)。 兰氏距离有几个关键特性:它对接近于零(大于等于零)的值的变化非常敏感,这使得它在处理包含小数值的数据时特别有用。同时,与马氏距离类似,兰氏距离对数据的量纲不敏感,无需标准化即可处理不同尺度的变量。不过,它假定变量之间相互独立,没有考虑变量间的相关性,这在某些复杂数据场景下可能限制其应用。相比之下,曼哈顿距离更简单但缺乏加权机制,而马氏距离能捕捉相关性但计算更复杂。 文章还提供了Python实现,代码简洁地通过循环累加每个维度的距离贡献,并处理了零值情况。这种实现突出了兰氏距离在实际编程中的易用性,适合快速集成到数据分析流程中。整体上,这篇文章清晰地剖析了兰氏距离的核心概念、优缺点和实际应用,帮助读者理解它在选择距离度量时的独特价值。

本机暂存
IT 后端/ 2018-07-05 13:44:37 / 累计浏览 2,637

Windows 下重定向当前进程的 stdout 到网络连接

这篇讲的是在 Windows 系统下,如何将一个正在运行的进程的标准输出(stdout)重定向到一个 TCP 网络连接中。这并非一个简单的 API 调用,作者为了解决这个需求,深入探索了 Windows 与 POSIX 在底层 I/O 机制上的根本差异。 作者指出,尽管 Windows 提供了 `_dup2` 来模拟 POSIX 的 `dup2`,但其进程标准输出句柄(HANDLE)与 C 运行时的文件描述符(fd)之间的绑定关系是静态的。在进程运行时调用 `SetStdHandle` 并无法影响 `cout` 或 `printf` 的输出流,这是解决问题的第一个关键障碍。 更麻烦的是,Windows 下的 socket 不能直接作为普通的文件句柄使用,因此无法通过 `dup2` 直接传递。作者最终采用的核心方案是:先用 `dup2` 将 stdout 重定向到一个匿名管道,然后启动一个独立的转发线程,持续从该管道读取数据并发送到目标网络连接中。这个方案还巧妙地解决了进程结束时可能丢失末尾输出的问题——通过主动关闭管道来通知转发线程结束,确保数据完整性。 整个探索过程涉及了 Windows 内核对象、句柄复制、管道 I/O 与多线程同步等多个层面的考量,最终作者将实现封装成了一个 Lua 模块,并在 GitHub 上提供了可运行的示例代码。

本机暂存
IT 数据库/ 2018-07-05 13:43:57 / 累计浏览 3,206

分表优化:千万级数据的插入方法

这篇讲的是对千万级数据进行分表存储时,如何高效地查询和迁移数据。作者没有停留在理论层面,而是直接给出了实操性很强的PostgreSQL SQL片段。 具体来说,文章先展示了两种从数字字段中提取首位字符的查询写法:一种是标准的子字符串函数调用,另一种是更常见的简写形式。核心技巧在于,作者演示了如何利用这类字符串函数作为条件,通过一条 `INSERT INTO ... SELECT` 语句,将特定规则(例如 `adv_id` 首位为‘2’且 `media_id` 首位为‘6’)的数据批量复制到新的分表中。 通过循环执行这样的复制操作,就能相对快速地完成海量数据的拆分。文章虽然简短,但抓住了分表场景中一个非常实际的动作——数据如何根据规则“落库”,并给出了清晰的语法参考。对于正在处理类似数据迁移或分表任务的开发者来说,这种直接可套用的片段往往比长篇大论更实用。

本机暂存
IT 后端/ 2018-07-05 13:35:26 / 累计浏览 2,285

对SaaS业务的几点感受

这篇分享的是作者从C端产品转型到B端SaaS业务后,经过一年实践所得的核心观察。作者发现,SaaS产品与C端产品存在本质差异,主要体现在四个方面。 首先,SaaS产品面对的角色和流程链条远比C端复杂。产品需要同时考虑商家内部不同岗位(如老板、运营、财务)的权限与协作,以及最终的消费者,设计思考维度显著增加。其次,产品启动期漫长。不同于C端可以靠一个“爆点”快速迭代,SaaS需要先夯实那些用户不会单独提出但必不可少的“底座”功能,非常考验团队的耐心和扎实程度。 第三,SaaS产品通常不具备强网络效应。一个商家选择哪款软件,很少会直接影响其他商家的选择。这决定了业务必须更注重全链条的服务和老用户的深度维护。最后,也是因此,SaaS业务离不开强烈的销售意识。产品设计本身就需要思考如何向付费者清晰地传递价值,这与纯粹依赖流量的C端逻辑大相径庭。 作者以一位“行业新人”的视角,坦诚地将这些来自一线的、关于业务模式与产品设计复杂性的观察总结出来,揭示了SaaS赛道需要长期深耕、心态稳健的本质。

本机暂存
IT DevOps/ 2018-07-05 13:32:32 / 累计浏览 2,724

修改Linux交换空间的使用率

这篇讲的是如何调整 Linux 系统对交换空间(swap)的使用倾向,核心是控制一个名为 `vm.swappiness` 的内核参数。 文章解释说,这个参数的默认值是 60,数值越大,系统就越倾向于将内存中的数据交换到 swap 分区。作者指出,将其设为 0 并不会完全禁用 swap,只是最大限度地避免使用它。通过 `sysctl -q vm.swappiness` 命令可以查看当前设置。 修改参数需要编辑 `/etc/sysctl.conf` 文件,添加一行 `vm.swappiness=10`,然后重启系统生效。如果不想重启,也可以用 `sysctl -p` 动态加载,但建议操作前先清空 swap。文章给出了清空 swap 的具体命令:`swapoff -a && swapon -a`。 文章最后还补充了 Linux 内存分配的一个关键机制:系统会优先使用物理内存,即使程序关闭,其占用的内存也可能被用作缓存,以加快后续访问。调整 swappiness 参数的目的,就是尽量利用物理内存,减少因使用 swap 而带来的性能开销。

本机暂存
IT 开发者/ 2018-07-05 13:31:24 / 累计浏览 2,471

断点单步跟踪是一种低效的调试方法

作者从自己二十年的开发经历出发,对“断点单步跟踪”这一经典调试方法提出了一个颇具挑战性的观点:它本质上牺牲了效率来换取低门槛,是一种低效的方法。 文章详细阐述了这一观点的由来。作者从早期深度依赖图形化调试器,到转向跨平台开发后因工具不便而开始反思,逐渐转向以代码审查(Code Review)和日志输出为核心的调试范式。他认为,调试器容易让人陷入“眼前状态”的机械追踪,忽视了对程序所有可能执行路径的并行思考。相比之下,经过训练的大脑在阅读代码时,能更高效地分析所有分支并做剪枝,对程序的理解是全局且可回溯的。 文章进一步论证了这一方法的优势:它能倒逼开发者写出复杂度更低的代码,并能与日志输出形成完美配合。日志不仅提供了调试器所需的路径与状态信息,还具备更好的回溯能力和对并发系统的适应性。作者并未完全否定调试器,认为在分析崩溃现场等场景下它依然有用,但日常的 Bug 定位,理应建立在更深刻的代码理解之上。 这篇文章在开发者群体中引发了广泛共鸣,它不仅仅是在对比工具,更是在倡导一种通过提升自身心智模型来驾驭复杂度的工程哲学。

本机暂存
IT 开发者/ 2018-07-05 13:27:32 / 累计浏览 2,894

评审的艺术——谈谈现实中的代码评审

这篇讲的是代码评审的实践智慧——那些很难从课本学到、却在日常团队协作中至关重要的经验。作者从自身出发,认为代码创造本身就带有个性,评审时过度追求一致既不现实也容易扼杀活力。他坦言评审风格因人而异,有人温和、有人直接,而自己更倾向于对事不对事地坚持原则。 文章将评审问题分为三类:需求业务层面、代码结构层面和风格格式层面。前两者可能成为合并代码的阻碍,而后者通常不是关键。作者分享了一套沟通技巧:比如为风格问题标注“picky”以降低火药味;多用“也许”“可能”等虚拟语气缓和建议;或是用提问代替断言(如“为什么这里用3?”)。他还强调,评审应“先抓主干”,遇到满是问题的代码时,先聚焦核心设计缺陷而非细枝末节。 一个有趣的观点是,评审标准不必完全统一。对新项目代码和新人提交的代码要求应更严格,前者影响后续质量基调,后者关乎职业习惯养成。最后作者指出,若对业务或技术背景不熟,勉强评审反而有害,此时不如坦诚沟通、确保质量。整篇文章没有空谈流程,而是像一位经验丰富的工程师在分享如何在真实团队中让评审变得高效而有人情味。

本机暂存
IT 后端/ 2018-07-05 13:23:13 / 累计浏览 2,615

UMStor Hadapter:大数据与对象存储的柳暗花明

这篇讲的是大数据存储里一个经典矛盾的解决方案。作者从武侠江湖的比喻切入,指出数据湖架构也分“计算存储融合”(以HDFS为代表)与“计算存储分离”(以S3A+Ceph对象存储为代表)两大派系。前者有数据本地性优势,但NameNode易成瓶颈且弹性差;后者扩展灵活,但所有请求必须经过RGW网关,多了一跳,影响性能且不支持追加上传。 文章的核心亮点在于提出了一条“柳暗花明”的路径。作者团队受NFS-Ganesha启发,利用Ceph提供的librgw函数库,绕过了RGW网关这一中间环节。据此开发的Hadapter插件,能让Hadoop客户端直接通过librados与OSD通信。这相当于在保留对象存储管理优势的同时,借鉴了HDFS直接交互的思路,在IO路径上少了一跳,理论上能获得更好的读写性能,并补齐了社区版S3A在追加上传上的短板。 摘要最后可以简要提及Hadapter的部署便利性(一个jar包)和其作为Hadoop存储插件的定位,让读者对这个方案的具体形态有个直观了解。整篇文章的脉络是从问题拆解到方案融合,对架构选型有切实参考价值。

本机暂存
IT DevOps/ 2018-07-05 13:13:56 / 累计浏览 2,097

如何在 Linux 中使用 find

这篇讲的是如何真正发挥 Linux 中 `find` 命令的威力。作者从最简单的 `find /` 命令会输出海量无用信息这一常见困境出发,手把手地演示了如何通过组合使用各种参数,让这个工具变得精准而高效。 文章从查找指定名称(`-name`)和大小写不敏感(`-iname`)的基础开始,迅速引入了使用 `-o` 进行逻辑或组合,以及用 `-type` 区分文件与目录。这些是让搜索结果从“杂乱”变得“可用”的关键一步。接着,文章展示了更高级的过滤条件:如何通过 `-mtime` 按修改时间(如过去一周)筛选,通过 `-size` 找出占用大量空间的大文件,通过 `-owner` 定位特定用户拥有的文件,甚至通过 `-perm` 查找权限可能设置不当的文件。 作者并没有停留在列举参数上,而是强调 `find` 的真正潜力在于将这些测试条件与布尔逻辑结合,并最终可以通过 `-exec` 或 `-delete` 对找到的文件直接执行操作。整篇文章从一个朴素的需求切入,层层递进地给出了解决方案,完整展现了如何将一个基础命令用成系统管理的利器。

本机暂存
IT DevOps/ 2018-07-05 10:15:29 / 累计浏览 2,205

使用 syslog-ng 可靠地记录物联网事件

面对日益增多的物联网设备,可靠地记录和监控其运行事件,是排查问题与保障安全的基础。这篇文章以开源日志守护程序 syslog-ng 为例,详解了如何构建一个高效、可移植的集中式日志方案。 作者从日志的基础概念讲起,重点剖析了 syslog-ng 的四大核心能力:从多样来源(如系统日志、文件、管道)收集信息;通过解析器、重写等功能处理日志;基于内容进行智能过滤与路由;最终将日志保存至文件或 Elasticsearch、Kafka 等大数据平台。文章特别强调了将非结构化日志转换为键值对格式的价值,这能极大提升后续分析的效率。 更值得关注的是 syslog-ng 在真实物联网场景中的广泛应用。文中提到,其最流行的版本(1.6)竟运行在超过 1 亿台亚马逊 Kindle 设备上,同时也被用于宝马电动汽车、开源路由器和工业测量设备中。对于资源受限或异构的嵌入式环境,syslog-ng 的高性能与多架构支持显得尤为实用。 总结来看,syslog-ng 通过其灵活的架构,将系统日志、应用数据乃至测量信息统一收集和处理,为物联网设备提供了从边缘到中心的可靠日志管道,有效支撑了监控、安全与数据分析的需求。

本机暂存