正则表达式指南
人生苦短,我用正则。
你有没有过这种体验:看着一串奇形怪状的符号,心里直犯嘀咕——这是在写魔法咒语吗?别怕,那不是巫术,那是正则表达式!虽然它一开始看起来像外星语言,但一旦掌握,你就能轻松驾驭文本世界,像武林高手挥剑断水一样精准又帅气。
今天,让我们带着轻松的心情,一起拆解正则表达式这位“复杂又迷人的老朋友”,顺便吐槽它那些让人又爱又恨的小脾气。
什么是正则表达式?正则表达式(Regular Expression,简称 RegEx),说白了就是一套用来描述文本模式的神奇符号规则。它能帮你快速找到、匹配、替换文本中的特定内容,效率堪比 Ctrl+F,但姿势更优雅。
想象一下,正则就像一位脾气古怪但超强的猎犬,只要你给出线索(规则),它就能飞速在大海一样的数据里嗅出目标,叼回来给你。
一个小小的栗子 🌰我们先来看一个最简单的例子,感受一下正则的神奇魅力:
假设你想在一大堆文字中找到所有的数字。正常人:👀肉眼一个个找;程序员:💻正则一把梭!
只需要一条简简单单的正则:
1\d
解释一下:
\d 代表 任意一个数字,也就是 0 到 9 中的任意一个。
它只匹配一个数字,如果想匹配 ...
Git小白成长记
Git 是现在最火的版本控制工具,开发合作时几乎人人都离不开它。但用着用着,什么工作区、暂存区、本地仓库、远程仓库就容易搞混;git checkout、git reset、git revert 这些命令也常常傻傻分不清。别担心,今天这篇文章就来帮你把 Git 理个明明白白,一次性搞懂它的运行逻辑和常用命令!
🚧 Git 的四个核心区域,一次说清!
在使用 Git 时,最容易混淆的就是它那几个「区」:工作区、暂存区、本地仓库、远程仓库。别急,我们一个个来认识它们。
🗂️ 1. 工作区(Working Directory)
这是你每天打开编辑器写代码的地方,也就是项目文件所在的真实目录。
📍 特点:
你看到的源代码文件就存在这里;
任何新增、修改、删除的文件都会首先出现在工作区;
还没被 Git 跟踪或提交。
🧠 可以理解为:你的“写字台”,你在上面涂涂改改,但 Git 还不知道你要保存哪些。
🗃️ 2. 暂存区(Staging Area / Index)
暂存区是一个中转站,告诉 Git 哪些改动你准备好了,要提交。
📍 特点:
通过 git add 把工作 ...
解决Ubuntu24安装搜狗输入法失败
新安装了Ubuntu24之后,无法成功安装搜狐输入法,原因是Ubuntu24使用的是fcitx5,版本过新,最简单的办法就是卸载fcitx5,安装老fcitx
12sudo apt remove fcitx5 fcitx5-chinese-addons fcitx5-module-chttrans fcitx5-module-fullwidth fcitx5-module-punctuationsudo apt install fcitx fcitx-data
然后剩下的内容按照搜狐官网的安装教程安装即可
https://pinyin.sogou.com/linux/help.php
hexo环境配置记录
该博客用于记录如何快速恢复博客环境
配置node
安装node环境
https://nodejs.cn/download/
安装最新版node,解压后配置环境变量,进入node的bin目录后链接npm和node到/usr/local/bin
12ln -s $(pwd)/node /usr/local/bin/nodeln -s $(pwd)/npm /usr/local/bin/npm
然后配置lib/node_modules到环境变量,node -g安装的应用会安装到这里
12echo "export \"PATH=\$PATH:$(pwd)\"" >> ~/.bashrcsource ~/.bashrc
如果没有梯子可以安装一下cnpm
1npm install -g cnpm -registry=https://registry.npm.taobao.org
配置Github SSH
非常简单,本地生成公钥私钥之后将公钥放在Github SSH中即可
1ssh-keygen -t rsa -C "xxx@xxx.co ...
openssl生成自签名证书
使用openssl可以方便的生成自签名证书,步骤如下
创建私钥
由于是自签名,该私钥会同时用于签名和服务器本身,采用如下命令生成
1openssl genrsa -out my.key 2048
基于私钥创建csr(证书请求签名),csr中包含服务器公钥
1openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
123456/C= Country 国家/ST= State or Province 省/L= Location or City 城市/O= Organization 组织或企业/OU= Organization Unit 部门/CN= Common Name 域名或IP
最后使用csr和key来生成证书
1openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650
lab1-添加内核模块
以题目一为例进行内核模块编程:
题目1:
设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。
设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态。具体参见教材P336
环境: ubuntu22
认识内核模块编程的基本框架
1234567891011121314151617181920#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>// 初始化函数static int hello_init(void){ return 0;}// 清理函数static void hello_exit(void){}// 函数注册module_init(hello_init); module_exit(hello_exit); // 模块许可申明MODULE_LICENSE(&quo ...
在linux上安装wireshark
wireshark是一款很好用的抓包工具,它可以安装在windows,linux,macos等平台上,在这个教程中,会告诉你如何安装wireshark在ubuntu上
用apt安装wireshark
可以直接使用apt安装wireshark,但是这样无法安装新版本,所以最好先手动添加仓库
123$ sudo add-apt-repository ppa:wireshark-dev/stable$ sudo apt update$ sudo apt install wireshark
安装时你可能会遇到这个选项,让你是否允许非root用户抓包,选择"是"
如果没有这个选项出现,可以执行一下命令
1$ sudo dpkg-reconfigure wireshark-common
之后我们需要把我们的用户添加到wireshark用户组
1$ sudo usermod -aG wireshark $(whoami)
然后重启机器就可以使用wireshark了
kube-proxy工作机制浅析
kube-proxy是k8s中的重要组件,在k8s的整个网络模型中有着重要的作用,kube-proxy有着多种工作模式,本博客只考虑在iptables模式下工作的kube-proxy
iptables
iptables是linux中著名的防火墙,有着过滤,转发等多种功能,iptables中有多张table,每张table有着不同的功能,一张table由多条chain组成,chain中的规则决定了包最后的走向
nat table有PREROUTING,OUTPUT,POSTROUTING等chains,这些chains中有若干rules,chains中的rules会决定流入的包的走向,特殊的,本地进程发出的包会走向OUTPUT,而外部的包不会
kube-proxy的工作机制
kube-proxy接受api-server的信息,接收到地址的映射信息以后修改iptables的内容,通过linux的iptables实现kubernetes的网络
可以通过下面的命令查看kube-proxy的工作模式
1$ curl localhost:10249/proxyMode
返回的内容就是kube ...
Go init函数分析
Go的所有init函数会在main函数执行之前运行,init的执行是runtime帮助我们完成的,我们来看看init的运行机制。
init函数的编译处理
12345678type initTask struct { // TODO: pack the first 3 fields more tightly? state uintptr // 0 = uninitialized, 1 = in progress, 2 = done ndeps uintptr nfns uintptr // followed by ndeps instances of an *initTask, one per package depended on // followed by nfns pcs, one per init function to run}
initTask是init初始化工作的关键结构体,一个包会有一个对应的initTask:
state: 该包的初始化函数是否被执行
0: 未执行
1: 正在执行
2: 执行完成
ndeps: 该包有几个依赖的包
...
重新认识C指针
指针是C语言中的难点,但其本质和其他类型并无不同,下面我们从几个方面来重新认识指针。
在这个过程中,我需要你先抛去对指针类型的认识,先忘掉指针的类型,认识纯粹的指针,然后再重新认识带着类型的指针。
认识纯粹的指针
我们先抛开指针的类型,看看指针是什么
1234567891011121314151617181920#include<stdio.h>struct Node{ int a; int b; int c; int d;};int main(){ int *a; unsigned int *b; double *c; struct Node * d; printf("int pointer = %d bytes\n",sizeof(a)); printf("unsigned int pointer = %d bytes\n",sizeof(b)); printf("double pointer = %d bytes\n&qu ...