Notes
我如何从零开始学习一门编程语言
作为一门全栈开发,我理应掌握多门语言。截止 2024 年 9 月,我掌握了超过 30 门编程语言,可以使用它们构建简单的应用程序、为开源社区提交代码、为公司开发产品。我们不讨论对于“掌握”的定义,让我梳理思路,详细阐述我是怎么一步步掌握如 此多的编程语言的。如果你也想学习一门新的编程语言,希望这篇文章能够帮助到你。
Notes
作为一门全栈开发,我理应掌握多门语言。截止 2024 年 9 月,我掌握了超过 30 门编程语言,可以使用它们构建简单的应用程序、为开源社区提交代码、为公司开发产品。我们不讨论对于“掌握”的定义,让我梳理思路,详细阐述我是怎么一步步掌握如 此多的编程语言的。如果你也想学习一门新的编程语言,希望这篇文章能够帮助到你。
Notes
或许你在学习 Spring 的时候曾听过,Spring 提供的容器叫做 IoC 容器。 IoC 是 Inversion of Control 的缩写,中文翻译为控制反转。控制反转是一种设计原则,早在 2004 年 Martin Fowler 便提出依赖反转,即依赖对象的获得被反转了。 非控制反转的问题 大多数应用程序都是由两个或是更多的类或组件通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。 如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。 直接实例化与紧耦合 比如 A 组件需要调用 B,一般情况下你可能会在 A 的 constructor 或 init 块中显式建立 B 组件然后调用。 class A { private val b = new B(
Notes
由于近期忙于公司事务和新系统的架构设计工作,博客的文章已经停更了数月。近几个月对我个人来说产生了很大的变化,我很难讲清其中的具体,但这大概会在后续的博客文章更新中体现。 但我认为,停更并非好事,而是应当避免的,因此我也在有片刻闲暇的今日在已经停止更新五个月的博客的第一篇文章。 序言 数学是科学的基础,而素数是数学的基石之一。尽管素数的概念简单直观——只有 1 和自身两个正因数的自然数——但它们在数学和计算科学领域却扮演着重要角色。 素数并非我们独立发现的,它们在自然界中以复杂的规律存在。通过对素数的理解和应用,我们得以解决各种问题,从密码学的加密算法,到搜索引擎的数据结构,甚至到量子计算的未来发展。因此,有效地检测一个数字是否为素数,对于编程来说是至关重要的技能。 在本篇博客文章中,我们将深入探讨素数校验在程序设计中的实现。我们将先从基础的数学理论开始,逐渐深入到各种算法的优化。同时探讨不同的素数检验算法,从最基础的试除法到更复杂高效的算法(如 Miller–Rabin primality test),来感受算法的历史与更迭。 素数的基础知识 在我们深入
Notes
这篇博客将向您介绍如何使用 GitHub CI 自动将 Docker 镜像推送到 Google Artifact Registry(GAR)的自动构建仓库。 GitHub CI 的功能使得代码推送到 GitHub 仓库时,能够自动构建 Docker 镜像并推送到 GAR。这种自动化流程有助于提高了开发效率,同时还可确保在发布新版本时代码和镜像的一致性和可靠性。 本文将为您提供详细的步骤和指南,帮助您轻松实现自动构建和推送 Docker 镜像的流程。 相关服务介绍 在本章中,我们将简要介绍 Google Artifact Registry 和 IAM 的 Service Account 授权模式的概念和特点,以便读者更好地理解如何使用它们来构建和管理 Docker 镜像。我们还将介绍 Artifact Registry 和 IAM Service Account 之间的关联,并讨论如何创建和配置
Notes
TypeScript 是 JavaScript 的超集,其最显著特征是在 JavaScript 原有的语言模式上加入了类型强制,即静态类型系统。以此保证代码中变量处于类型安全状态,即只能赋同类型的值,而对象只能访问其自身所拥有的属性、方法。 类型安全 & 型变 类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释,使开发者可以及早在编译时期就捕捉到潜藏的错误 let num: number = 1; let bool: boolean = num; // Error: Type 'number' is not assignable to type 'boolean'. 在上述情况中,number 类型与 boolean 类型是完全不同的,它们不构成继承关系,因此他们不能相互赋值。 那么,当我们需要将一个 `number` 存储的数字转换为
Notes
Source Global CDN 的海外中转链路往往需要对多个域名进行反向代理,之前的方案是给每个域名单独创建 vhost。但在链路增长、服务器增多的现实情况下,这一方案变得越来越难以维护。 我作为 Source Global CDN 的主要运维人员,自然而然地承担起了此任务。 问题 随着服务使用服务器增多,链路增长,我们面临以下问题: 1. 在配置出现更变时,需要为所有服务器进行内容修改,费时费力。 2. 如有服务新增,需要在所有服务器中进行多个操作,且需进行相关测试。 3. SSL 证书、vhost 的 conf 文件管理混乱。 在经过深思熟虑后,我们大致想出以下解决方案: 1. 使用泛域名解析,提高内聚性,使得所有服务器可以自动配合增删改的操作,无需单独配置。 2. 使用私有DNS服务,在一个平台管理链路,无需在服务器中进行修改。 高内聚的泛域名解析方案使得vhost文件数目和SSL数目大幅减小,私有DNS避免服务器内数据不修改的问题。 实施 泛域名解析 经过考虑,
Notes
在当前互联网架构圈子,容器化、微服务,是被主要讨论的话题。 显然,对于互联网的发展趋势来看,项目正在变得愈加庞大。单一的巨大的项目是不利于维护和开发的,开发者的电脑几乎难以直接承载阿里云、Azure这种巨大的项目,那我们就需要对其进行解耦。也就是说,应用的组件化、容器化、微服务化必将成为趋势。 在容器化应用程序开发这一点,我在之前的开发历程中有些许心得,在本文我将对其具体阐述。 先前的语言选用 在开始学习 Golang 之前,我曾尝试过很多语言。 就如我的个人简介所写的一样,较为经典的PHP、Java,较为复杂的CPP,较为有趣的Express.js、Koa.js、Next.js,我都曾使用过。即使是现在,你也可以在我的GitHub账号找到许多之前的练习品,如 AH-dark/bing-image-api。但这些语言或多或少都有一些不足之处,因而被我放弃。 Java Spring 全家桶在中国大陆被广泛地使用,特别是阿里巴巴,几乎可以算是 Spring 的最主要用户之一。 依靠阿里巴巴,SpringBoot
Notes
在近期,我逐步将近乎所有的服务所使用的邮件服务都更换为 Mailgun,本文我将讲述我作出这一决定的原因和具体做法。 在确定使用 Mailgun 以前,我曾对SMTP邮件推送这一部分有过多种尝试。 曾用品 阿里/腾讯 企业邮箱(国内) 在我仍在职圆云的时候,我们依靠阿里云的企业邮箱进行企业事务处理。 企业邮箱同时兼具收发功能,具有较好的稳定性,但价格较高。对于个人服务来说,买五个账号起步,每年600元的企业邮箱,似乎毫无必要。 而腾讯企业邮箱等服务依赖企业微信,过于冗杂,对于个人来说过于麻烦,而且 Exchange 协议支持的不完善。 因此,我放弃这一想法。 阿里/腾讯 邮件推送 * 阿里云邮件推送:https://www.aliyun.com/product/directmail 我曾在圆云时期使用阿里云的邮件推送进行邮件通知。其好处在于,稳定性较高,且支持多域名多用户等情况。 但其只提供了邮件发送服务,完全不对邮件接收做支持,甚至不支持转发,因此在使用一段时间后我放弃了这一方案。 ahdark.com
Notes
前言 在参与 Star Horizon 的一个项目时,我得到团队内同学的启发,发现了 Wire 这个神奇的东西。Wire 是 Google 研发并开源的一个 Golang 依赖注入解决方案,它通过解释原有文件生成新文件并用 Go Build Injector 实现编译环节的代码区分。 根据 Go Blog 所属,Wire 最先用于 Google 开源的 Go Cloud 项目中。 google/wire 应用 场景 我们通常会在构建 SDK 时在 Client 中嵌套 Services,在这种场景下 Client 依赖于 Services。 但常见的问题是:随着 Services 的增多,代码变得越来越冗杂,
Notes
消息队列,即 Message Queue,是我们在构建 Gin 等持久化 Golang 应用程序的常用组件。消息队列在实际应用中包括如下四个场景:应用耦合、异步处理、限流削峰和消息驱动的系统。本文将介绍如何基于 Channel 实现一个简易的内存消息队列组件。
Notes
4月9日,我注册了 ahd.im 域名并打算以此为基础搭建短链接系统。但当我在 GitHub 等平台搜索了一圈,却没有找到令我满意的作品。大多数UI丑陋或是算法效率低下,难以满足我的愿景,因此我决定着手写一套自己的短链接系统。 选择 这是我第一次独立完成一套全栈系统,其摸索的过程自然会为我全栈开发能力积累经验。因此,选择一套高效、高兼容、普适的技术栈自然是极为重要的一步。 后端 对于后端,最重要的是保证代码质量和执行效率。 PHP 效率太低,代码混乱,不被我欣赏。 ExpressJS 不适合写较大的系统应用,其并发也不强,且代码中同步异步容易混乱。 Golang 尽管性能较强,但不符合我的代码习惯。 C++ 应该就没有一个能用的Web开发框架。 最后,我选择了使用 Java Spring Boot 框架撰写后端功能,使用 MyBatis + MySQL 进行数据控制。 前端 前端便没有那么多选择了。 jQuery 我不是很熟悉,且当今时代高级前端框架林立,
Notes
2021年对我而言,是充满挑战和成长的一年。我参与了许多前所未有的项目,其中包括我的第一个创业公司——圆云科技有限公司。这段经历不仅带给了我宝贵的经验,也让我学会了如何在困难中成长和进步。