Bash Basic CheatSheet
BashShebangSpecial comment, specifies that the file is a script and calls a certain interpreter (i.e., bash, sh, python)
1234567#!/bin/bash#!/bin/sh#!/usr/bin/env python#!/usr/bin/python
CommentsUse a pound/sharp/hashtag without a ! to write comments
1# This is a comment
Variablesshell variables
Whitespace matters!
Use $VAR to output the value of variable VAR
Display text with echo
12NAME="value"echo "$NAME"
Types? What types?
Bash variables are untyped
Opera ...
Docker Basic CheatSheet
Basic Commands:Container Lifecycle:docker run: Create and start a container.
1$ docker run -d -name my_container nginx
docker start/stop/restart: Start, stop, or restart a container.
123$ docker stop my_container$ docker start my_container$ docker restart my_container
docker ps: List running containers.
1$ docker ps
docker ps -a: List all containers (including stopped ones).
1$ docker ps -a
Image Management:docker pull: Fetch an image from a registry.
1$ docker pull ubuntu
do ...
顺德-流水账
02/05/2024 - 02/06/2024
高铁先去中山,春运很多人
到达小榄
红日饭店吃脆肉皖,嘎嘎香
第二天一早出发顺德,先去清晖园边上的香云纱酒店吃个早茶
清晖园乱转
中午吃的街边煲仔饭
民信双皮奶,味道不错
华盖山只在山脚下转了转,没往上爬
去 欢乐海岸plus 乱逛
柴油机1959创意园也去了
路边一户人家墙外的画,感觉非常非常的好看
渔人码头也去看看
晚餐是杏坛公粥底火锅,挺实惠的,也挺好吃
马路边上吃鱼皮
走之前再来一份民信的甜品
长沙-流水账
10/20/2023 - 10/22/2023
第一天大晚上睡一觉,硬卧到了
六点多到的,太早了,长沙还没睡醒
先恰个粉,卤肉米粉
没地方开门了,住宿的地方也还没到能进的时间,开斗!
终于等到大伙都上班了,茶颜悦色一下
国金中心转了转
步行街转了转
午饭笨萝卜,刚好不用排队
下午去橘子洲溜达
晚上在太平老街吃的公交新村面店
在街上闲逛一下
喝茶喝茶
第二天起床恰粉,原汁原味粉面店,唯一不辣的一餐
逛了个湖南米粉博物馆
去了个共产党纪念园
再来一杯
又到了愉快的吃饭时间,这次是大碗先生,好便宜
直奔岳麓书院
看了一眼爱晚亭,没去爬山了
没爬山,从入口溜了
溜进湖大转了转
这边的树真的会黄,好好看
罗森妮娜的奶油号角吃了
晚饭吃的这个光头佬家常菜是真的香喷喷,就是位置很偏僻
回去睡觉的路上吃个宵夜
第三天复兴时代广场周边转了转
没早饭了直接午饭鲁哥饭店,问就是搞太晚了hhh,咸蛋黄茄子很香
湖南省博物馆转了一下午
溜了溜了,结束旅程
sync.Mutex:标准库的互斥锁实现
是什么sync.Mutex 是 go 原生提供的互斥锁实现,也是最基本的同步原语了
合理利用锁即可避免并发编程中由于竞争引发的一些逻辑错误
Quick Startsync.Mutex 对外暴露的接口有三个
sync.Mutex.Lock 请求锁,如果锁忙,则阻塞。
sync.Mutex.TryLock 请求锁,如果锁忙则,则返回 false。这是非阻塞的获取锁的方式。
sync.Mutex.Unlock 释放锁
一个简单的例子:
123456789101112131415161718192021package mainimport ( "sync" "time")func main() { var m sync.Mutex cnt := 0 for i := 0; i < 10; i++ { go func() { m.Lock() cnt++ m.Unlock() }() } time.Sleep(time.Second) // 保证所有协程执行完 fmt.Print ...
sync.Once: 执行且仅仅执行一次动作
是什么sync.Once 是 Go 语言中的一种同步原语,用于确保某个操作或函数在并发环境下只被执行一次。
它只有一个导出的方法,即 Do,该方法接收一个函数参数。在 Do 方法被调用后,该函数将被执行,而且只会执行一次,即使在多个协程同时调用的情况下也是如此。
解决了什么问题对于同一个 sync.Once 实例,可以确保通过调用 Do 执行传入 Do 中的方法,执行且仅执行一次
主要用于以下场景
单例模式:确保全局只有一个实例对象,避免重复创建资源
延迟初始化:在程序运行过程中需要用到某个资源时,通过 sync.Once 动态地初始化该资源
只执行一次的操作:例如只需要执行一次的配置加载、数据清理等操作
Quick Start创建和使用
12345678910once := sync.Once{}for i := 0; i < 10; i++ { go func() { once.Do(func(){ fmt.Println("hello") }) }()}time. ...
lumberjack: 滚动日志源码走读
是什么Lumberjack 是一个用于将日志写入滚动文件的 Go 包,旨在成为日志系统基础设施的一部分。它不是一个一体化的解决方案,而是日志记录堆栈底部的一个可插入组件,仅控制写入日志的文件。
解决了什么问题
无侵入式的日志切割
关注点分离:只关注日志的文件管理
Quick Start1234567log.SetOutput(&lumberjack.Logger{ Filename: "/var/log/myapp/foo.log", MaxSize: 500, // megabytes MaxBackups: 3, MaxAge: 28, //days Compress: true, // disabled by default})
只需使用 *lumberjack.Looger 结构作为 io.WriteCloser 的实现替代例如 os.File 结构等,传入各类日志 logger 的配置中作为输出目标,即可将日志写入滚动文件
日志文件分割:日志文件大小超过限制,将日志归档 ...
ants: 协程池源码学习
是什么ants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理、goroutine 复用,允许使用者在开发并发程序的时候限制 goroutine 数量,复用资源,达到更高效执行任务的效果。
解决了什么问题
提升性能:主要面向一类场景,大批量轻量级并发任务,任务执行成本与协程创建/销毁成本量级接近
并发资源控制:研发能够明确系统全局并发度以及各个模块的并发度上限
协程生命周期控制:实时查看当前全局并发的协程数量;有一个统一的紧急入口释放全局协程
带来的价值:
限制并发的 goroutine 数量
复用 goroutine,减轻 runtime 调度压力,提升程序性能
规避过多的 goroutine 侵占系统资源(CPU&内存)
Quick Start创建 goroutine 池
1pool, _ := ants.NewPool(100)
提交任务
123ants.Submit(func(){ // do something})
动态调整容量
12pool.Tune(1000) // Tune its ...
hugo: 零成本自建技术博客
方案选择github pages 提供博客站点 + hugo 提供博客模板 + github actions 自动构建和发布
part 1 : Github Pages官网:GitHub Pages
选择 github pages 的优点就是 github 使用频率高,并且作为全球最大的代码托管平台,也很稳定,即使是免费提供使用也不用担心跑路的问题,缺点当然就是对于国内的网络访问不算友好
步骤如下:
新建 Repositories 用于存储博客内容,注意:名称格式为:<用户名>.github.io
将博客网页代码上传至仓库中
访问博客,博客站点访问地址为:**https://<用户名>.github.io/**
part 2 : hugo官网:The world’s fastest framework for building websites | Hugo (gohugo.io)
hugo 是使用 go 语言实现的静态博客网站生成器,可将 md 文章内容转换为美观的博客网站代码
步骤如下:
安装 git 用于将博客网页上传 Github, 安装 hugo ...
ssl 的中间人攻击原理
中间人攻击就是有一个中间人服务器,他一边跟客户端建立连接,冒充服务端,另外一边跟服务端建立连接,冒充客户端,实现窃听、篡改等攻击
具体的实现方式主要有两种,分别是 ssl 嗅探 和 ssl 剥离
ssl sniff(ssl 嗅探)Attacker在客户端发起连接时截获会话,用自己的公钥和公钥证书替换原本应该是由服务端提供的公钥和公钥证书。这样一来Attacker就可以用自己的私钥来解密客户端发送的请求,然后用来和服务端那边通信
问题:Attacker给客户端提供的证书毕竟不是真的证书,使用 https 单向认证,客户端去 ca 一检查就发现问题了,然后客户端可以自己选择是否继续连接,接受这个不受信任的证书。只要没有内鬼,遇到不受信任的就坚决不接受,就没有可乘之机。
ssl Strip(ssl 剥离)这种攻击更加复杂和麻烦,但是也更加高级和隐蔽、不需要伪造证书
Attacker在客户端与服务器建立连接时,在Attacker与服务器之间形成HTTPS连接,而在客户端与Attacker之间形成HTTP连接,即将SSL层从原HTTPS连接中“剥离”。这样,既避免了在客户端验证证书时难以避免的弹 ...