MySQL篇

一条 SQL 查询语句是如何执行的

  1. 连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。
  2. 查询缓存: MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value 对的形式,被直接缓存在内存中。
  3. 分析器:你输入的是由多个字符串和空格组成的一条SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。
  4. 优化器:优化器是在表里面有多个索引的时候,决定使用哪个索引; 或者在一个语句有多表关联(join )的时候,决定各个表的连接顺序。
  5. 执行器: MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
阅读更多...

GDB笔记

最近早手撕一个内存池,结果程序无法通过边界测试,找了许久也没找到问题,就学习了GDB进行调试,突然发现我之前过的是什么苦日子,早用上GDB我之前蓝桥杯不乱杀。特此记录一下。

编译

  • 添加-g,生成调试文件
  • 删除-O1/-O2/-O3,关闭编译器优化

一、程序启动与加载

命令 简写 用法 示例
gdb <可执行文件> - 加载调试程序 gdb a.out
run r 启动程序(可带参数) run arg1 arg2
set args - 设置程序启动参数 set args -b -x
attach <pid> - 附加到正在运行的进程 attach 1234
file <可执行文件> - 在GDB内加载程序 file a.out

二、断点管理

命令 简写 用法 示例
break <行号/函数名> b 设置断点 b mainb 101
break <文件:行号> b 指定文件断点 b test.c:20
break *<内存地址> b 内存地址断点 b *0x400448
break ... if <条件> b 条件断点 b 30 if i==5
info breakpoints i b 查看所有断点 -
delete <断点编号> d 删除断点 delete 2
disable/enable <断点编号> - 禁用/启用断点 disable 1
tbreak tb 设置临时断点(命中后自动删除) tbreak foo
watch <变量> - 监视变量变化 watch x
阅读更多...

八股文心得体会

为期40天的八股文训练营,让我收获颇丰。记得第一次面试的时候,面试官问的基本都是八股文上的题目,我虽然有着计算机网络、数据库、操作系统、C++等内容的知识储备,但是在面试的压力下,加上知识不成体系,回答的模棱两可、支支吾吾。而经过长达40天的训练,我对面试开始得心应手起来。我认为训练营的亮点如下:

  • 训练营的随时补签、周末休息的打卡机制,让意志稍微不那么坚定的同学也能够检查下来。
  • 训练营打卡要求的时口头回答,而非文字,更加贴合面试的场景,能够逐步改善我们的语言习惯,在面试的过程不在支支吾吾。我就在训练营中,逐步改掉了额、嗯等语气词,面试的回答也更加流畅自然。
  • 训练营下提供了可供参考的他人的优秀回答录音,这样可以让我们想优秀的人不断学习,修正答案,获得自己的答案。
  • 训练营鼓励答案要有自己的理解和补充,形成适合自己的答案,而非死记硬背,让我们在面试的时候能够更加流畅的回答的同时,引导面试官问题方向。
  • 训练营提供问题的详细资料,这让我们能够从更深、更细、更底层、更系统的原理解析、应用,理解问题背后形成的原因和机理,让我们不是死记硬背,而是理解后经过整理的自然阐发
    最后,非常感谢代码随想录,虽然还没有让我成功找到实习,但是在我不知所措时给出了路径和方法。我相信,亡羊补牢,为时未晚。虽然我准备和出发的时间比较晚,但我相信我终究上岸。

在未来,我将根据我的理解,不断完善和扩充这一份笔记。

资源链接整理

精品软件:各种软件的特殊版、精简版、第三方版本
中文技术文档大全:各种技术的中文技术文档
Learn Anything:学习各种技术的教程(计算机科学)
即时工具:在线工具箱,包含很多日常常用的在线功能
Adobe全套设计软件:全套的Adobe软件破解版
软仓:各种设计软件破解版
302.AI:国内外各种AI综合平台
聚合数据:各种常用的免费API数据接口服务

通信协议笔记

I2C

主要特性

  • 两根信号线通信:串行数据线SDA、串行时钟线SCL;
  • SDA和SCL的输出引脚驱动为开漏输出,外接上拉电阻
  • 所有设备通过7位地址软件寻址,高四位由厂家设定,为设备类型,低三位由用户定义
  • 所有设备都具有自动应答功能,主机和从机区别在于主机有对SCL的发送权
  • 最大挂载数取决于总线上的最大电容值,一般为400pf

工作时序

  • 数据读取在SCL为高时发生,所以当SCL为高时,数据要保持稳定
  • SCL为高时,SDA从高跳到低为开始信号start,从低跳到高为结束信号stop
  • SDA传送字节数没有限制,传送完紧跟应答信号,数据高位在前
    d3bbca378362c28829cee243a8497ef7.png
  • 当应答信号为高电平时,为ACK信号,当应答信号为高电平时,为NACK信号
  • 主机发送从机接受时,ACK由从机发出,若为NACK,主机直接尝试STOP信号终止后续传输
  • 从机发送主机接收时,ACK有主机发出,表示还要接受数据,当接受完后,发送NACK,告知从机读取结束,释放总线,随后主机发送stop命令,将释放总线,结束读操作。
阅读更多...

cmake简易入门

构建步骤

  1. 创建 CMakeLists.txt 文件:定义项目、目标和依赖。
  2. 创建构建目录:保持源代码目录整洁。
  3. 配置项目:使用 CMake 生成构建系统文件。
  4. 编译项目:使用构建系统文件编译项目。
  5. 运行可执行文件:执行生成的程序。
  6. 清理构建文件:删除中间文件和目标文件。
    1
    2
    3
    4
    5
    6
    7
    配置CMakeLists.txt后
    mkdir build 创建目录
    cd build
    cmake .. # 配置
    make # 编译
    ./MyExcutable # 运行
    make clean # 清理

基本

  • cmake_minimum_required(VERSION <num>):设置最低版本

  • project(<name> [version]):设置项目名和版本

  • add_executable(<target> [dependence]):添加项目可执行文件和依赖

  • set(<var> <val>):设置变量

  • ${var}:变量使用

  • configure_file(<ifile> <ofile> [copy_only] [escape_quotes] [@only]):复制一个文件到目标位置,并对文件内容进行变量替换

    • ifile:指定输入文件的路径。
    • ofile:指定输出文件的路径
    • COPY_ONLY:如果指定这个选项,CMake将不会对文件内容进行变量替换,只是简单地复制文件。
    • ESCAPE_QUOTES:如果指定这个选项,CMake将对输出文件中的双引号进行转义。
    • @ONLY:如果指定这个选项,CMake将只替换@符号包围的变量。这在某些情况下可以提高性能。
    阅读更多...

jupyter notebook简易入门

hzem0kll.l4w.png

安装

安装notebook和插件

1
2
3
4
5
6
7
8
9
10
11
12
# 安装notebook,7.*版本对插件支持有点问题
$ conda install notebook=6.4

# 安装插件管理器jupyter_contrib_nbextensions
$ pip install jupyter_contrib_nbextensions
$ jupyter contrib nbextension install --user

# 安装可视化功能
$pip install jupyter_nbextensions_configurator
## can be skipped for notebook >=5.3
$jupyter nbextensions_configurator enable --user

在conda中,jupyter为notebook的别名,notebook才是包的官方名

常用插件

  • Toggle all line numbers
  • Collapsible headings
  • Variable Inspector
  • Execute time
  • Hinterland
  • Table of Contents(2)
  • Autopep8
阅读更多...

Makefile教程

项目结构

1
2
3
4
5
6
7
<project>
├── Makefile
├── build
└── src
├── hello.c
├── hello.h
└── main.c

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SRC_DIR = ./src
BUILD_DIR = ./build
TARGET = $(BUILD_DIR)/world.out

CC = cc
CFLAGS = -Wall

# ./src/*.c
SRCS = $(shell find $(SRC_DIR) -name '*.c')
# ./src/*.c => ./build/*.o
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
# ./src/*.c => ./build/*.d
DEPS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.d,$(SRCS))

# 默认目标:
all: $(TARGET)

# build/xyz.d 的规则由 src/xyz.c 生成:
$(BUILD_DIR)/%.d: $(SRC_DIR)/%.c
@mkdir -p $(dir $@); \
rm -f $@; \
$(CC) -MM $< >$@.tmp; \
sed 's,\($*\)\.o[ :]*,$(BUILD_DIR)/\1.o $@ : ,g' < $@.tmp > $@; \
rm -f $@.tmp

# build/xyz.o 的规则由 src/xyz.c 生成:
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c -o $@ $<

# 链接:
$(TARGET): $(OBJS)
@echo "buiding $@..."
@mkdir -p $(dir $@)
$(CC) -o $(TARGET) $(OBJS)

# 清理 build 目录:
clean:
@echo "clean..."
rm -rf $(BUILD_DIR)

# 引入所有 .d 文件:
-include $(DEPS)
阅读更多...

大众与小众的选择

前几天,我看到一个很有意思的问题:我们既从众,跟随潮流,同时我们又追求小众,选择与众不同。这既矛盾又统一的现象,引起了我对其本质以及我们的人生的一些思考。

场景决定我们的选择

大众与小众的选择,本质上是我们在不同场景下的选择。在面向效率的场景下,我们更倾向于大众,因为使用者众多,代表有更多的资源就行维护与优化,就有着更加方便、高效的使用体验。而在面向娱乐的场景下,可以选择小众,展示自己的与众不同,展示自己的特立独行。

真的是由场景决定的吗?

阅读更多...
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信