当时明月在 曾照彩云归
编程三日,两耳不闻人生,只有硬盘在唱歌
知识碎片

本篇内容,主要记录日常工作生活中遇到的一些问题思考以及一些常见技巧。

网络相关

NAT 后无法在内网通过外部 IP 访问内部服务

之所以会出现无法在 NAT 的内部网络通过 NAT 服务的外部 IP 地址来访问的情况,是因为如果服务从内部请求,那么经过 DNAT 转换后,将目标 IP 改写成内网 IP,如 192.168.1.3,而发送请求的机器 IP 是 192.168.1.4,数据包被网关 192.168.1.1 顺利的重定向到 192.168.1.3 的服务端口,然后 192.168.1.3 根据请求发送响应给目的 IP 地址,也就是 192.168.1.4,但是,问题出现了,因为 192.168.1.4 请求的地址是外部 IP 假设是 106.54.43.50,所以它等待着 106.54.43.50 的响应,但是由于是局域网,所以路由器不经过封装,直接转发,所以 192.168.1.3 的响应请求被看做是非法的,被丢弃了。这就是问题的所在了,该问题称为 NAT 回流,解决方案在此不再赘述。

HTTP 请求组件是否区分大小写

组件 是否区分大小写
HTTP 版本 是
HTTP 方法 是
URI scheme 否
URI host 否
URI path、query、fragment 是
Header Field Name 否
Header Field Value 是
Body 是

路由器

路由器三大品牌: 华硕(Asus)、网件(Netgear)、领势(LinkSys)
路由器模式:

  1. 路由模式
  2. 有线中继(AP)
  3. 无线中继

其中,接入路由模式路由器的终端 IP 地址是由该路由器分配,接入中继模式路由器的终端 IP 地址是由该路由器的上级路由器分配。

Windows 技巧

命令行

查看端口占用

## 查看被占用端口对应的 PID
netstat -aon | findstr "{port}"

## 查看指定 PID 的进程
tasklist | findstr "{pid}"

## 强制结束进程
taskkill /T /F /PID {pid}

## 在 windows terminal 还可以使用如下命令
## 查看指定名称的进程,支持通配符
ps -Name {进程名称}

## 结束指定名称的进程,支持通配符
kill -Name {进程名称}

查看文件的哈希值

certutil -hashfile {文件} [SHA1 | SHA256 | MD5]

查看 WIFI 密码

# 查看所有连接过的 wifi 名称
netsh wlan show profile

# 关键内容即为密码
netsh wlan show profile key=clear name="[wifi名]"

路由追踪

tracert [域名/IP]
# 通过最多 30 个跃点跟踪
# 到 XiaoQiang [192.168.31.1] 的路由:
# 1 3 ms 1 ms 1 ms XiaoQiang [192.168.31.1]
# 2 9 ms 7 ms 16 ms 42.103.52.1
# 3 * * * 请求超时
# ...
# 14 88 ms 67 ms 67 ms 106.54.43.50
# 跟踪完成。

出现全是星号时间的,是该路由器禁止追踪。

测试网络可达性

ping [域名/IP]

# 正在 Ping 0xfee1dead.cn [106.54.43.50] 具有 32 字节的数据:
# 来自 106.54.43.50 的回复: 字节=32 时间=50ms TTL=50
# 来自 106.54.43.50 的回复: 字节=32 时间=49ms TTL=50
# 来自 106.54.43.50 的回复: 字节=32 时间=49ms TTL=50
# 来自 106.54.43.50 的回复: 字节=32 时间=49ms TTL=50

# 106.54.43.50 的 Ping 统计信息:
# 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
# 往返行程的估计时间(以毫秒为单位):
# 最短 = 49ms,最长 = 50ms,平均 = 49ms

# 检测域名/IP 及端口是否可达
telnet [域名/IP] [Port]

域名解析

nslookup

# 默认服务器: UnKnown
# Address: 240e:30a:2e:6800::1

# 默认查询 A 记录
> 0xfee1dead.cn
# 服务器: UnKnown
# Address: 240e:30a:2e:6800::1

# 非权威应答:
# 名称: 0xfee1dead.cn
# Address: 106.54.43.50

# 设置查询 CNAME 记录
> set type=cname

# 设置查询 TXT 记录
> set type=txt

U盘制作系统盘后容量变为 4M

# 进入 DISKPART
diskpart
# DISKPART>

# 列出所有硬盘
list disk
# 磁盘 ### 状态 大小 可用 Dyn Gpt
# -------- ------------- ------- ------- --- ---
# 磁盘 0 联机 476 GB 2048 KB *
# 磁盘 1 联机 28 GB 0 B

# 选择有问题的硬盘号
select disk 1
# 磁盘 1 现在是所选磁盘。

# 清除磁盘
clean
# DiskPart 成功地清除了磁盘。

在磁盘管理中重新新建简单卷即可解决该问题。

扩充磁盘显示脱机状态

# 进入 DISKPART
diskpart

# 选择脱机的硬盘号
select disk 1

# 联机
online disk

# 重置
attribute disk clear readonly

快捷键

  1. Win + Shift + s: 截图
  2. Alt + Enter: 查看属性
  3. Alt + F4: 快速关闭应用
  4. Ctrl + Shift + Esc: 快速打开任务管理器
  5. Win + d: 返回桌面
  6. Win + e: 快速打开资源管理器
  7. Win + g: 录屏
  8. Win + x: 简易开始菜单
  9. Win + i: 打开设置
  10. Win + p: 多显示器投影设置
  11. Win + .: 表情
  12. Shift + 鼠标右键: 菜单选项可以直接复制文件路径
  13. F2: 文件、文件夹重命名
  14. Win + k: 蓝牙连接
  15. Win + Ctrl + D: 新建虚拟桌面
  16. Win + Ctrl + 左右箭头: 切换虚拟桌面
  17. Win + Ctrl + F4: 删除虚拟桌面
  18. Ctrl + Insert: 复制
  19. Shift + Insert: 粘贴
  20. 在任务管理器按住 Ctrl 阻止刷新

快捷命令

  • control: 打开控制面板
  • regedit: 打开注册表
  • wt: Windows Terminal
  • services.msc: 查看服务列表
  • msinfo32: 查看系统信息
  • shell:startup: 开机启动程序目录

cpl 是 Control Panel extension 的缩写。在 C:\windows\system32 下面有一系列 cpl 文件,它们分别对应着控制面板中的项目。
常见 cpl 项目及对应功能:

  • firewall.cpl: Windows 防火墙设置
  • powercfg.cpl: 电源选项
  • sysdm.cpl: 系统属性

用 win+r 启动常用程序

  1. 新建可执行程序程序快捷方式
  2. 创建一个公用文件夹作为所用常用程序快捷方式的存放目录
  3. 将该目录添加到环境变量中
  4. 修改可执行程序程序快捷方式名称,以简写命名即可

Linux 技巧

ssh 免密登录

如果免密登录失败,需检查:

  1. SELinux 是否禁用
  2. ~/.ssh/ 文件夹权限是否为 700
  3. ~/.ssh/authorized_keys 文件权限是否为 600

ssh 保持连接

~/.ssh/config 文件中每个 Host 添加 ServerAliveInterval 60

软件

软件版本号

  1. Alpha: α 是希腊字母的第一个,表示内部测试版,一般不对外部发布,bug 较多,功能不全,一般经由测试人员测试使用
  2. Beta: β 是希腊字母的第二个,表示公开测试版,主要会有”粉丝用户”测试使用,该版本仍然存在很多 bug,但比 alpha 版本稳定一些。经过 bug 修复和功能添加,可又分为 Beta1、Beta2 等版本,直到逐渐稳定下来进入 RC 版本
  3. RC: Release Candidate,发行候选版本,基本不再加入新的功能,主要任务为修复已知 bug。是最终发布成正式版的前一个版本
  4. GA: General Availability,正式发布的版本,官方开始推荐广泛使用,有的软件还会使用例如 Release、Stable、Final 等表示正式发布版本

CDN

刷新 jsDelivr 缓存

jsDelivr 提供的全球 CDN 加速,CDN的分流作用不仅减少了用户的访问延时,也减少的源站的负载。但其缺点也很明显: 当网站更新时,如果 CDN 节点上数据没有及时更新,即便用户再浏览器使用 Ctrl + F5 的方式使浏览器端的缓存失效,也会因为 CDN 边缘节点没有同步最新数据而导致用户端未能及时更新。
对于 jsDelivr,缓存刷新的方式也很简单: 将希望刷新缓存的链接 https://cdn.jsdelivr.net/… 替换为 https://purge.jsdelivr.net/… 即可实时刷新。刷新成功后,浏览器会返回缓存刷新成功的 JSON 信息。

Chrome

调试技巧

Windows下使用快捷键 Ctrl+Shift+p 可开启快捷面板。

  1. Capture full size screeshot: 截网页全图
  2. Clear console history: 清空控制台历史
  3. Disable javascript/Enable javescript: 禁用/启用 javascript

SQL

SQL 查询执行顺序

Order by 中的 Case When

Select * from tableA
ORDER BY colA ,
CASE
WHEN type = 1 THEN 100
WHEN type = 2 THEN 200
END

通常情况下,order by 后面跟数字是代表以第几列进行排序。而上述示例中,在 case when 后跟数字,与原含义大不相同,其代表新创建一列,按该列排序,等价于:

Select * from tableA
ORDER BY colA ,
CASE
WHEN type = 1 THEN 100
WHEN type = 2 THEN 200
END AS order1

递归树结构查询

通常使用递归 CTE 来利用一条 SQL 语句实现树形结构的查询,模板如下:

with recursive cte_name (column1, column2, ...) as ( 
-- 非递归部分(初始数据)
initial_query
union all
-- 递归部分(递归逻辑)
recursive_query
)
select * from cte_name;

示例,假设有一张 employees 表,包含 employee_id 和 manager_id,使用递归 CTE 查询组织层次结构:

with emp_cte (employee_id, manager_id, level) as ( 
-- 非递归部分:起点是最高层的员工(无管理者)
select employee_id, manager_id, 1 as level from employees where manager_id is null
union all
-- 递归部分:找到直接下属
SELECT e.employee_id, e.manager_id, ec.level + 1 from employees e join emp_cte ec on e.manager_id = ec.employee_id
)
select * from emp_cte;

基础常识

Terminal/TTY 和 Shell

终端(Terminal)有时候又被称作 TTY,来源于电传打字机(teletype printer)。最早是一个硬件概念,DEC 公司的 VT05 是第一款基于 CRT 显示器的远程终端。其作用是控制远端的大型机设备。

我们现在常说的终端指的一般都是软件终端,即终端模拟器(Terminal Emulator)。我们常见的终端模拟器有 Windows Terminal、iTerm2、Cmder 等。

Shell 负责解释你输入的命令,并根据你输入的命令,执行某些动作。常见的 shell 包括:

  • sh
  • bash
  • csh
  • fish
  • zsh

FileSystem 和 BlockDevice

块设备是 i/o 设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。
当给计算机连接块设备(硬盘)后,系统检测的有新的块设备,该类型块设备的驱动程序就在 /dev/ 下创建个对应的块设备的设备文件,用户可以通过设备文件使用该块设备。

ls /dev/
# /dev/sda/ dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/hda ...

其中,以 sd 开头的块设备文件对应的是 SCSI 硬盘,以 hd 开头的块设备文件对应的是 IDE 接口的硬盘或光驱,以 fd 开头的块设备文件对应的是软盘。
检测到的第一个硬盘名为 /dev/sda,检测到的第二块硬盘命名为 /dev/sdb,以此类推。磁盘上的分区则通过在磁盘名后面加上一个十进制数字表示,如sda1 和 sda2 表示系统中第一个磁盘驱动器的第一个和第二个分区。

文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易。文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘或者光盘的地址为多少的数据块上。
常见的文件系统:

  • FAT32
  • exFAT
  • NTFS
  • APFS
  • ext3
  • ext4
  • ext5
  • ZFS

块存储、文件存储、对象存储

  • 块存储: 是指直接利用块设备对某个块进行快速读写,常见于对 IO 敏感的服务,例如数据库等。在企业服务开发中基本不会用到。
  • 文件存储: 在操作系统之上,利用该文件系统提供的树级形式进行文件的存储。
  • 对象存储: 常见于云服务(S3、OSS),利用键值对形式,对文件进行唯一索引存储。

入网方式

常见的入网方式分为:

  1. 电话拨号接入
  2. ADSL 宽带接入
  3. 光纤宽带接入

上网设备都需要”猫”,猫的作用是调制解调。其中电话拨号需要电话猫,ADSL 和 光纤上网需要宽带猫。宽带猫又分为 ASDL 猫和光猫。
其中电话猫和 ADSL 猫是进行数模转换,光猫是进行光电转换。



定位系统

  1. 美国 GPS
  2. 欧洲伽利略
  3. 中国北斗
  4. 俄罗斯格洛纳斯

字符编码

不同格式互相读取

特点 示例 原因
古文汉字以及一些特殊符号 鍟婂€掕惃鎾掑 GB2312 读取 UTF8
多为显示� ��� UTF8 读取 GB2312
显示锟斤拷 锟斤锟斤拷 UTF8 读取 GB2312 后并保存,再次用 GB2312 读取