DNS 是如何工作的(Part 1)——getaddrinfo库函数
引入DNS 是计算机网络世界中十分基础的一个概念 / 技术,工作机制很简单,因此在许多计算机网络八股文中常常出现。
然而,我们真的理解 DNS 吗?在终端内输入 ping www.google.com 时,ping 程序的哪个函数负责把域名转变为 IP 地址?如果一个域名有多个 IP 地址,ping 了哪个?nslookup、dig 等工具又是如何实现 DNS 功能的,和 ping 共用了代码吗,还是自己单独实现?
除此之外,在 Nginx 中,我们可以配置一个 upstream,随后在 proxy_pass 中采用 http://<上游名> 的格式来访问上游。可是,上游得转变为 IP 才能访问呀,谁完成了这件事?如果一个上游对应多个 server 呢?
再比如,在 docker-compose 里,我们可以用服务名来访问微服务,而不需要指定 IP。比如在 Nginx 中配置 proxy_pass 的目标是 http://backend:8000,其中 backend 是后端服务名,对应了一个容器实例。这件事又是谁做的?
再推广到 kubernetes 中,P ...
长沙春日
4 月 9 日到 4 月 13 日去了长沙,在春日的美好时刻换一换脑子,感受除了嘉定以外的广阔天地。感觉,再度回到学校,我已经不是之前的那个我了,真的好神奇。
之前写的很多文章,都在遵循 markdown 的语法,要有标题、小标题、分节等等,其实不分节也不会怎样,就像是日记一样。那我就想到哪写到哪了。
之所以去长沙,并不是心血来潮。经过了之前一段比较复杂的感情经历,让我发现了张震岳这个歌手。最早听他的歌应该是《再见》。嗯,那是一个中午,标志着我们最后一天在毕业年级校区上课。走在走廊中,音响里放了许多歌曲,其中一首便是它。天花板是一片片方格板组成的,每块板子上星星点点着一些黑色圆点,是典型的教室 or 办公室陈设。走到校门口,老师为我们每个人戴上“金榜题名”手链。随后就是高考了。
或许《爱的初体验》以及《爱我别走》在孩童时期无意识地在哪里听到过,不然我为何耳熟能详?当然还有《亡命之徒》,这是他在纵贯线时期合作的作品,是我舅舅曾经的手机铃声,也是楼下小卖部的固话电铃,想想,大概是 10 年以前的事情了。
回到那段感情经历,感兴趣的读者或许可以翻看相关的帖子,应该有两个吧,展现了纯情少年一厢 ...
Nginx 解析 URL 中 斜杠(/) 的机制
说在前面配置了很多次 Nginx,一直没有搞明白,什么时候需要在路径中加上斜杠(/),什么时候不需要,以及与之相关的种种现象。在网络上找到了一些文章:
using trailing slashes in nginx configuration
Nginx:location、proxy_pass中的斜杠/
Nginx 带不带斜杆的区别最全分析
写的都不错,能够从具体例子的角度来解释是否带斜杠,但我觉得有几个不足:
缺乏简单易用的实验(第三篇有);
分析较为碎片化(alias, root, proxy_pass 分开讨论),缺少宏观的抓手,不方便记忆。
没有结合源代码来解释,欠缺说服力。
本文总体讨论 alias、root 与 proxy_pass 的共性与个性,并给出 docker-compose 的容器例子,以及在 AI 的帮助下结合 Nginx 的源代码做机制分析。
本文适合像笔者一样喜欢钻牛角尖以及探索 corner cases 的读者,只关注结论的读者可以仅阅读 TL;DR 小节。本文不是 Nginx 的入门文章,假设读者进行过简单的 Nginx 配置 ...
Leetcode Hot 100 | 滑动窗口
思想今天起的很早,来到编译原理的教室,空无一人,打开窗户换换气。果然到了大三,谁还会提早这么早到教室自习呢?校圈上、网络上总是有人询问所谓的通宵自习室在哪里,其实若能早起,能自习的地方有很多。
在本节,我们将见到两种类型的滑动窗口题型,同向而行与固定窗口大小。其中前者是双指针的一种,而后者一个指针就够了。滑动窗口的思想是增量更新,每到达一个新的位置后,只需要去掉边界外的值,增加新进来的值,而不需要对每个窗口进行遍历。
题目3. Longest Substring Without Repeating Characters这题要求我们找出字符串的最长子串,这个子串不含重复字符,而且是所有子串中最长的。
123456789101112131415161718192021class Solution {public: int lengthOfLongestSubstring(string s) { int left = 0; int len = 0; vector<int> cnt(128, 0); ...
Leetcode Hot 100 | 双指针
思想今天下了一整天的雨,多么适合分析一下「解雨水」这道题及其方法——双指针。双指针的思路是,采用两个指针分别记录两个不同的位置,从而完成题目。常见的情景有:
快慢指针。在链表中讨论;
相向滑动指针。如解雨水和最大接水容器;
同向滑动窗口。在滑动窗口专题讨论。
题目11. Container With Most Water这道题给了我们一堆间隔为 1、高度不同的柱子,要求找出哪两个柱子之间能盛放最多的水。
123456789101112131415161718192021class Solution {public: int maxArea(vector<int>& height) { int ans = 0; int left = 0, right = height.size() - 1; while (left < right) { int area = min(height[left], height[right]) * (right - left); ...
Leetcode Hot 100 | 二叉树
思想二叉树,和前面讲的回溯法或者二分查找相比,不可同日而语。二叉树不是一个方法,而是一个场景,回溯法和二分查找都是方法,因此有一套模板,而关于二叉树,或许只能概括在这个舞台上,有哪些好戏会上演,难以找到一个 silver bullet。
题目94. Binary Tree Inorder Traversal这道题是基础的二叉树中序遍历题目。
1234567891011121314class Solution {private: vector<int> result;public: vector<int> inorderTraversal(TreeNode* root) { if (!root) return {}; inorderTraversal(root->left); result.push_back(root->val); inorderTraversal(root->right); return result; ...
Leetcode Hot 100 | 二分查找
思想二分查找也是有一套模板的,可以用如下的步骤总结:
使用前提:元素在某种程度上有序;
明确下标的含义与边界;
left, right 赋值与计算中间 mid;
当决策边界合法时,进行判断;
根据条件剪枝,并得到新的边界;
边界非法,跳出循环,得到结果。
这 6 步具体怎么实施,从下面的几道题来讨论。
题目4. Median of Two Sorted Arrays先从一道 Hard 开始,它要求我们找到两个有序数组中的中位数。
123456789101112131415161718192021222324252627282930313233343536373839class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(), n = nums2.size(); if (m > n) { ...
Leetcode Hot 100 | 回溯法
最近在刷力扣,总结一些算法专题的思想。好记性不如烂笔头,不然全都忘记了。
思想回溯法,我认为是有一套模板的。
12345678910111213141516171819202122232425262728293031class Solution {private: vector<T> result; T path; // other attributespublic: void dfs(some input, current progress) { if (progress == end) { result.push_back(path); return; } for (auto opt : all_valid_options) { edit input; path.push_back(opt); dfs(input, new progress); ...
Docker 入门之实际应用
序在上一篇文章中,我们学会了 Docker 的原理与机制,侧重于 Docker 开发者的角度。这个文章中,我们从 Docker 使用者的角度来讨论如何让 Docker 便利软件开发与维护工作。
基本概念与逻辑这一节总结 Docker 中常见的术语,以及它们是如何关联起来,便利开发与运维工作的。
先看一个最基础的 Web 应用架构:
1234567891011121314my-app/├── docker-compose.yml├── .env├── nginx/│ └── default.conf├── backend/│ ├── Dockerfile│ ├── requirements.txt│ └── app.py└── frontend/ ├── Dockerfile ├── package.json ├── package-lock.json └── ...
这个 Web 应用涉及前端、后端、数据库以及 nginx 来进行反向代理。
注意到,在后端和前端的文件夹下,存有 Dockerfile 文件,这个文件指导我们如何构建一个 Dock ...
Docker 入门之概念理解
序为了面向就业或者读研的方向,最近决定开始学习 Docker、Kubernetes 等容器与容器编排技术。这篇文章先总结一下和 Docker 相关的概念辨析,如 Docker 和 VM,Docker 的原理,在 Windows 和 Linux 下运行 Docker 的异同等等。
为什么需要 Docker受到郝斌老师教学 C 语言的授课方式影响,在学习 Docker 之前,也需要先问一问,为什么需要使用 Docker。
就我个人的使用体会来说,我在以下这些场合遇到或者使用过 Docker:
数据库课程中,与 OceanBase DB 交互是通过 Docker 进行的,省去了配置环境的烦心事;
在 Github 上执行 Actions 时,需要用到 Docker 来创建一个干净的 runner 来完成任务;
软件工程课程中,我们的乙方采用了 Docker 构建前端、后端和数据库应用并交付给我们。
从上述用例中总结一下,Docker 为我们解决了配置环境的难题。如果需要使用某个应用或服务,但手头没有相应的支撑环境;或者需要确保开发、测试、生产环境的一致性——那就用 Docker 的容器来 ...
