当前位置: 首页 > news >正文

road to master

零、学习计划

  • 数据库相关
    • 索引
      • 我以为我对数据库索引很了解,直到我遇到了阿里面试官 - 知乎 (zhihu.com)
      • 给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)
      • 聚集索引(聚类索引)与非聚集索引(非聚类索引) - 知乎 (zhihu.com)
      • (2 封私信 / 6 条消息) 索引是什么? - 知乎 (zhihu.com)
    • 存储引擎
      • 一张图让你看懂InnoDB (360doc.com)
    • 事务
    • 解析、优化、执行等过程
    • mysql脏页是什么 - 知乎 (zhihu.com)
  • 数据结构
    • 数据库相关结构体:B树、B+树、红黑树…
    • 如何系统地学习数据结构与算法? - 知乎 (zhihu.com)
    • 红黑树,超强动静图详解,简单易懂_吴师兄学算法 (cxyxiaowu.com)
    • 完全二叉树的节点数,你真的会算吗? (qq.com)
  • 算法
    • leecode564. 寻找最近的回文数-困难题目 - 知乎 (zhihu.com)
  • 网络通信
    • 15w+字的计算机网络知识核心总结!再也不怕面试官问我网络知识了,飘了!_小林coding的技术博客_51CTO博客
    • 突击大厂面试,图解网络开放下载! (qq.com)
    • 答应我,这次搞懂 I/O 多路复用!_小林coding的博客-CSDN博客
    • 无锁编程基础与代码实现 - 知乎 (zhihu.com)
    • SQL Server里的闩锁介绍 - Woodytu - 博客园 (cnblogs.com)
  • 性能相关
    • 面试官:如何写出让 CPU 跑得更快的代码_51CTO博客_写代码吃cpu吗
    • TLB miss与cache miss
      • TLB缓存是个神马鬼,如何查看TLB miss? - 知乎 (zhihu.com)
      • Cache原理简介及cache miss_cache miss rate_hithj_cainiao的博客-CSDN博客
  • 计算机相关
    • 浮点数的二进制表示 - 阮一峰的网络日志 (ruanyifeng.com)
    • 内存管理
      • Linux内存管理:linux内存管理—虚拟地址、逻辑地址、线性地址、物理地址的区别(一)_鱼思故渊的博客-CSDN博客
      • Linux内存管理 – /proc/{pid}/smaps讲解 - 简书 (jianshu.com)
      • Linux 内存管理 - 简书 (jianshu.com)
  • 优秀博主
    • 小林coding的博客_CSDN博客-图解计算机网络,图解操作系统,图解MySQL领域博主

一、计算机相关

1. cache miss

2. TLB miss

二、Linux

1. 基础命令

1.1 so相关
# 查看.so导出函数
nm -D **.so(可加grep)
objdump -tT **.so
# 查看哪些so导出了指定函数
find / -name "*.so" | xargs nm -AD | grep "T usleep"
1.2 文件文本相关
# 搜索多个文件里面的字符串
grep -niR check_argument build/*.sh
find -type f -name "*.sh" |xargs grep "check_arguments"
# 查找匹配行,及显示它上下n行
cat xxx.txt |grep str -C 10
1.3 vi命令
# 字符串替换
:%s/gmdb-kvlite/GMDB-Lite/g:%s/GmcYangTreeNodeT/GmcYangNodeT/g
1.4 压缩、解压相关
# tar.gz 压缩
tar -zcvf xxx.tar.gz xxx/
# rpm 解压
rpm2cpio xxx.rpm | cpio -di
1.5 查看进程、线程
# 查看线程
ps -T -p `pidof fwmd`
1.6 远程scp
scp local_file remote_username@remote_ip:remote_file

2. C编程

2.1 占位符的使用
数据类型格式化符号说明
uint64_tPRIu64在x86下,使用%llu,在x86_64下,对应%lu,不同场景,尽量使用一致的打印
uint32_tPRIu32为了保持写法一致,推荐使用PRI*系列
int64_tPRId64同上
int32_tPRId32同上
size_t%zusizeof、strlen返回都是size_t,需使用%zu,否则在不同平台上容易编译报错
枚举变量对枚举增加强转,再使用匹配的类型打印在C标准对枚举的长度没有准确定义,甚至是有符号还是无符号可能都有不一致。复杂,打印它的格式化转换,需要注意
枚举常量根据枚举值选择,如有符号用%d,无符号用%u常量编译后,直接在代码段,不用强转
long编译跨平台的软件时尽量不要使用long类型,或者需要对long类型做特殊处理

3. GLIBC版本

查看GLIBC版本号

# libc.so打印信息中包含有版本号
/lib64/libc.so.6
# lib.so通常支持多个版本,即向前兼容,查看该文件中包含的字符串可以看到其支持的版本,通常是连续的
strings /lib64/libc.so.6 |grep GLIBC
# ldd是glibc提供的命令
ldd --version
# getconf GNU_LIBC_VERSION
getconf GNU_LIBC_VERSION

编码中的预编译宏,判断版本号

#if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 30

4. 共享内存

# 清理共享内存
ipcrm -a
# 查看共享内存
ipcs

5. 进程状态

状态描述
O进程正在处理器运行(这个状态很少见)
S休眠状态(sleep)
R进程处于运行或就绪状态
I空闲状态(idle)
Z僵尸状态(zombie)
T跟踪状态(traced)
B进程正在等待更多的内存页
D不可中断的深度睡眠

三、shell

$用法

# 命令替换(括号或者反引号)
$(pwd)
$`pwd`# 变量替换($var和${var}本质上相同,但后者会精确变量名的范围)
A=hello
A_1=$AB        # A_1值为空,因为没有名字为AB的变量
A_2=${A}B    # A_2值为helloB# 其他用法
$0    # shell本身文件名
$?    # 最后运行命令的返回值
$!    # shell最后运行的后台process的PID
$$    # shell本身的pid
$#    # shell的参数个数
$@    # 所有参数列表, 以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个
$*    # 所有参数列表, 以"$1" "$2" … "$n" 的形式输出所有参数
$1    # 表示第一个参数,$2表示第二个参数,$n表示第n个参数
  • $@$* 的区别

    当他们不被 “” 包含时,他们之间没有任何区别,都是将所有参数当成一份数据,彼此之间用空格分隔;

    当它们都被 “” 包含时,区别如下:

    • "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据
    • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的

set命令

Linux set命令用于设置shell的执行方式,可根据不同需要来做设置

以下只列举常用的几个,具体百度:

set -e    # 若指令执行结果不为0,立即结束shell
set -f    # 取消使用通配符
set -t    # 执行完随后的指令,立即退出shell
set -v    # 显示shell所读取的输入值

变量(字符串)

# 变量声明# 直接赋值NAME=proj-name# 通过命令替换赋值CUR_DIR=$(cd "$(dirname $0)"; pwd)    # $()用来命令替换,$0表示当前shell脚本的文件名# 变量使用,通过变量给变量赋值OUTPUT_DIR="$CUR_DIR"/output# 变量替换($var和${var}本质上相同,但后者会精确变量名的范围)
A=hello
A_1=$AB        # A_1值为空,因为没有名字为AB的变量
A_2=${A}B    # A_2值为helloB# 获取字符串长度
echo ${#A}# 提取子字符串
echo ${A:0:2}    # 输出 he

运算符

# 关系运算符 -eq(相等) -ne(不等) -gt(大于) -lt(小于) -ge(大于等于) -le(小于等于)
if [ $a -eq $b ]; thenecho $a
fi# 逻辑运算符 ! && ||
if [ !$a && $b ]# 字符串运算符# = 检测两个字符串是否相等if [ $a = $b ]# != 检测两个字符串是否不相等if [ $a != $b ]# -z 检测字符串长度是否为0if [ -z $a ]# -n 检测字符串长度是否不为0if [ -n $a ]# $ 检测字符串长度是否为空if [ $a ]# 文件测试运算符
file="/var/test.sh"
if [ -r $file ]# -b 检测是否为块设备文件# -c 检测是否为字符设备文件# -d 检测是否为目录# -f 检测是否为普通文件# -g 检测是否设置了SGID位# -k 检测是否设置了粘着位(Sticky Bit)# -p 检测是否为有名管道# -u 检测是否设置了SUID位# -r 检测是否可读# -w 检测是否可写# -x 检测是否可执行# -s 检测是否为空# -e 检测是否存在# -S 检测是否为socket

流程控制

# 退出shell
exit 0

文件包含

shell脚本可以包含外部的脚本,包含后可以使用被包含脚本的函数和变量

# 用 . 的方式包含外部脚本
. ./test.sh
# 用source的方式包含外部脚本
source ./test.sh

参数解析

# 调用脚本传入参数
./test.sh -a aarch64 -b dev -t release -v 2.0.1
# test.sh文件中的参数解析
arch=''; branch=''; type=''; version=''; date=''; command='';
while getopts ":a:b:c:d:t:v:" opt
docase "$opt" ina)arch="$OPTARG";;b)branch="$OPTARG";;c)command="$OPTARG";;d)date="$OPTARG";;t)type="$OPTARG";;v)version="$OPTARG";;?)echo "Unknown Parameters."; exit 1;;;esac
done

四、UML类图

类图、接口图

类图

类图通常分为三层。

第一层:表示类的名称,如果是抽象类,用斜体表示

第二层:表示类的特性,通常就是字段和属性

第三层:表示类的操作,通常就是方法或行为

前面符号的含义

‘+’ :public

‘-’ :private

‘#’ :protected

接口图

接口图和类图的区别是顶端有<>显示。

接口图通常分为两层。

第一层:表示接口名称

第二层:表示接口方法

此外,接口还有另外一种表示方法,俗称棒棒糖表示法。

UML六种关系

UML分别有以下六种关系:实现、泛化、组合、聚合、关联、依赖。

关系紧密程度:组合 > 聚合 > 关联 > 依赖 > 泛化 = 实现

实现

表示类与接口之间的关系,指类实现了该接口。

虚线 + 空心三角形 表示。

泛化

表示类与类之间的关系,指类之间的父子关系,一个类继承了另一个类。

实线 + 空心三角形 表示。

组合 & 聚合

组合与聚合都是表示部分与整体的关系,它们的区别如下:

聚合

表示一种弱的拥有关系,即A对象可以包含B,但B不是A的一部分,可以脱离A而存在。

例子:雁群(A)与大雁(B),雁群可以包含大雁,但大雁不是雁群的一部分,它脱离雁群也能存在。

表示方法:空心菱形 + 实线箭头

组合

表示一种强的拥有关系,即A对象的组成结构中包含B,A和B的生命周期一样。

例子:大雁(A)与翅膀(B)就是组合关系。

表示方法:实心菱形 + 实线箭头

关联

表示类与类之间的关系,指A类中拥有B类。

  • 例子:企鹅(A类)需要知道天气(B类)情况,所以A类中包含B类。
  • 表示方法:用 实线箭头 来表示。
依赖

表示类与类之间的关系,指A类的方法依赖B类。

  • 例子:动物(A类)在活动(方法)时需要氧气和水(B类),这样就形成了依赖关系。
  • 表示方法:用 虚线箭头 来表示。

五、设计模式

六大设计原则

单一原则(SRP)

一个类只专注于做一件事,应该有且仅有一个原因引起类的变更。即高内聚,低耦合。

里氏替换原则(LSP)

所有引用父类的地方必须能透明地使用其子类的对象。属于代码规范

子类必须完全实现父类的抽象方法,但不得重写父类的非抽象方法。

子类中可以增加自己的特有方法。

子类可以重载父类方法,但不能覆盖。

子类实现抽象方法时,返回值可以是父类返回值的子类。

依赖倒置原则(DIP)

定义

高层模块不应该依赖底层模块,两者都应该依赖其抽象;

抽象不应该依赖细节;

细节应该依赖抽象。

具体实现

模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,依赖关系是通过接口或抽象列产生;

接口或抽象类不依赖于实现类;

实现类依赖接口或抽象类。

接口隔离原则(ISP)

只给客户端提供其需要的接口,把不需要的剔除掉。

迪米特原则

一个对象应该对其他对象有最少的了解。

你的内部是如何实现和我没关系,我只需要知道你提供的public内容,其他的一概不关心。

开闭原则(OCP)

对拓展开放,对修改关闭。

重要性

开闭原则是最基础的一个原则,前面介绍的所有原则都是开闭原则的具体形态,而开闭原则才是其底层逻辑。

创建型模式

结构型模式

装饰模式

场景

当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,从而增加了主类的复杂度,装饰模式提供了一个非常好的解决方案。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。

概念

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

模式解析

  1. 装饰模式利用SetComponent来对对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

UML类图解析

Component

定义一个对象接口,可以给这些对象动态地添加职责。

ConcreteComponent

定义了一个具体的对象,也可以给这个对象添加一些职责。

Decorator(装饰抽象类)

继承了Component,从外类来拓展Component类的功能。但对于Component来说,是无需知道Decorator的存在的。

ConcreteDecorator(装饰对象类)

定义了具体的装饰类,起到给Component添加职责的功能。

优点:

  • 把类中的装饰功能从类中搬移去除,简化了原有的类
  • 有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的逻辑

行为模式

策略模式

场景

在可能遇到多种不同算法或者策略的情形,根据实际业务逻辑来变化使用的算法,这时可以根据上下文来决定使用哪种算法。

概念

策略模式就是一种定义了一系列的算法,将每个算法封装起来,并可以相互替换。策略模式让算法独立于它的客户而变化,策略模式是一种对象行为型模式

模式解析

  1. 策略模式是对算法的封装,把算法的责任和算法本身分开,委派给不同的对象管理。
  2. 策略模式中,由客户端决定在什么情况下使用什么策略。
  3. 策略模式仅仅封装算法,提供新算法到系统中,以及老算法从系统中“退休”。

UML类图解析

Context(环境类)

环境类是使用算法的角色。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy(抽象策略类)

为所有支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

StrategyA(具体策略类)

实现了抽象策略中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类的对象。

优点:

  • 完美支持“开闭原则”,用户可以在不修改原有系统的基础上选择算法或策略, 也可以灵活地增加或删除。
  • 提供了管理算法族的办法,易于管理,且可避免重复代码。
  • 使用策略者模式可以避免多重条件选择语句,多重条件选择语句是硬编码,不易维护。

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。所以策略模式只适用于客户端知道所有的算法或行为的情况,同时也加重了客户端的使用难度。
  • 策略模式将造成系统产生很多具体策略类,任何消息的变化都会导致系统增加一个新的具体策略类。
  • 无法同时在客户端使用多个具体策略类

模式对比

策略模式和状态模式的类图相似。

六、锁

基础锁 – 互斥锁、自旋锁

互斥锁和自旋锁是最底层的两种锁,很多高级的锁都是基于他们实现的,可以认为是各种锁的地基。

比如:读写锁既可以选择用互斥锁实现,也可以用自旋锁实现。

区别
  • 互斥锁:加锁失败后,线程会释放CPU,给其他线程(发生线程切换)
  • 自旋锁:加锁失败后,线程会忙等,直到它拿到锁(忙等)
互斥锁

互斥锁是一种独占锁,比如当A线程加锁成功后,只要线程A没有释放锁,线程B加锁就会失败,于是会释放CPU给其他线程,最终线程B由于一直加锁失败,释放CPU,最终被阻塞。

对于互斥锁加锁失败而阻塞的现象,是由操作系统内核实现的。当加锁失败时,内核会将线程置为睡眠状态,等锁被释放后,内核会在合适的时间唤醒线程,当这个线程成功获取到锁后,继续执行。

所以,互斥锁加锁失败时,会从用户态陷入到内核态,让内核帮我们切换线程,虽然简化了锁的难度,但是存在一定的性能开销成本(在加锁失败和锁被释放时,分别会有一次上下文切换,如果代码执行的时间很短,可能上下文切换的时间都比锁住的代码执行时间还长)。

所以,如果能确定被锁住的代码执行时间很短,就不应该用互斥锁,而选择自旋锁

自旋锁

自旋锁是通过CPU提供的CAS函数(Compare And Swap),在用户态完成加锁和解锁的操作,不会主动产生上下文切换,所以相比互斥锁来说,会快一些,开销也小一些。

加锁过程:

  • 查看锁状态,如果锁是空闲的,执行第二步
  • 将锁设置为当前线程持有

CAS函数把这两个步骤合并成一条硬件级指令,形成原子指令,这样保证了这两个步骤的原子性。

自旋锁是比较简单的一种锁,一直自旋,利用CPU周期,直到锁可用。需要注意:在单核CPU上,需要抢占式的调度器(即不断通过时钟中断一个线程,运行其他线程),否则自旋锁在单核CPU上无法使用,因为自旋的线程永远不会释放CPU。

读写锁

读写锁由读锁和写锁构成,只读取共享资源用读锁(共享锁),修改共享资源用写锁(独占锁)。

使用场景:能明确区分读操作和写操作的场景。

读优先锁&写优先锁

介绍

读优先锁:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 仍然可以成功获取读锁,最后直到读线程 A 和 C 释放读锁后,写线程 B 才可以成功获取读锁。

写优先锁:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 获取读锁时会失败,于是读线程 C 将被阻塞在获取读锁的操作,这样只要读线程 A 释放读锁后,写线程 B 就可以成功获取读锁。

缺点

不管是优先读锁还是优先写锁,都有可能出现把非优先的一方饿死的情况,为了解决这个问题,可以搞个公平读写锁,不偏袒任何一方。

公平读写锁

介绍

用队列把获取锁的线程排队,不管是写线程还是读线程都按照先进先出的原则加锁即可,这样读线程仍然可以并发,也不会出现饿死的现象。

乐观锁&悲观锁

前面提到的互斥锁、自旋锁、读写锁,都属于悲观锁。

悲观锁

悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,很容易出现冲突,所以访问共享资源前,先要上锁。(相反,如果多线程同时修改共享资源的概率比较低,可以采用乐观锁)

乐观锁

乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间有没有发生冲突,如果没有其他线程在修改资源,那么操作完成;如果发现有其他线程已经修改过资源,就放弃本次操作。

其实,乐观锁全程并没有加锁,所以它也叫无锁编程

在线文档编辑、git、svn等都使用了乐观锁。

乐观锁虽然去除了加锁解锁的操作,但是一旦发生冲突,重试的成本非常高,所以只有在冲突概率非常低,且加锁成本非常高的场景下,才考虑使用乐观锁

七、代码坏味道

坏味道概述

直观

一眼过去就可以看到的问题,比如:

  • 魔鬼数字
  • 函数/类过长
  • 圈复杂度高
  • 函数/变量命名不规范等

建议:规范性的问题,尽量通过工具去扫描

微观

需要仔细检查才能发现的问题,比如:

  • 类字段定义不合理
  • 函数功能不单一
  • 变量作用域过长等

建议:代码局部层面问题,重点排查,优先关注

宏观

代码架构上的整体的问题,比如:

  • 类职责不单一
  • 上帝类
  • 分层不清楚
  • 上下文混乱等

建议:需求本身设计,类定义,类结构关键设计问题,这些问题需要结合业务和架构发展

设计原则 - 简单设计四个基本原则

  • 通过所有测试:软件系统对外部需求被正确的完成,包括功能性需求和非功能性需求,并通过客户验收的标准
  • 尽可能消除重复:让软件走向高内聚,低耦合,达到良好正交性的过程(并不是所有的重复都可以消除,这条原则被描述为最小化重复,而不是消除重复)
  • 尽可能清晰表达:漂亮的代码如同优美的散文,从不隐藏设计者的意图,恰如其分的抽象,直截了当的控制代码被阅读的次数远远大于其修改的次数
  • 更少的代码元素:尽可能降低设计的复杂度,保持简单

坏味道

重复代码

现象

在多个地点上看到同样的程序结构

解决方法

  • 提炼函数
  • 函数上移:两个互为兄弟的子类中有重复代码,提取公共函数,到父类中
  • 塑造模板函数:部分代码相似,细节不同。先提取函数,再制造模板方法模式,把差异部分交给子类实现
  • 提炼类:两个毫不相关的类出现重复,提取到一个类中
过长函数

现象

函数体过长,复杂度高,难理解,后续修改容易引入问题

解决办法

  • 提炼函数:将重复代码放到一个函数中,并让函数名清晰的解释函数的用途
  • 以查询取代临时变量:程序中将表达式结果放到临时变量中,可以将这个表达式提炼到一个独立函数中,调用这个新函数去替换这个临时表达式,这个新函数就可以被其他函数调用
  • 引入参数对象:将参数封装到一个对象中,以一个对象取代这些参数
  • 分解条件表达式:将if else等语句的条件表达式提炼出来,放到独立的函数中去
  • 保持对象完整:从某个对象里取出若干值,将其作为某次函数调用时的参数,由原来传递参数改为传递整个对象
  • 以函数对象取代函数:大型函数中有许多参数和临时变量,将函数放到一个单独对象中,局部变量和参数就变成了对象内的字段,然后可以在同一个对象中将这个大型函数分解为许多小函数
过多的注释

现象

一段代码有长长的注释,然后发现,这些注释之所以存在是因为代码很糟糕

解决方法

注释应该是解释why,而不是how和what,代码告诉你how,而注释告诉你why

你感觉需要撰写注释,请先尝试重构,试着让所有注释都变得多余

  • 提炼函数
  • 重命名函数
夸夸其谈未来性

现象

过度关注未来可能的变化,增加了不必要的东西:

  • 在理解需求时主观的认为需求变动非常大,在设计过程中出现过度的设计
  • 追求设计模式的使用,经常对程序不必要的地方进行设计模式的使用,导致代码不易理解
  • 程序的设计过程中封装变化混乱,没有将封装变化进行到底。最后,过滤考虑了程序的未来性,但这些未来性并不明确

解决办法

  • 如果某个抽象类其实没有太大的作用,请运用折叠继承关系
  • 非不要的委派(delegation)可与用inline class除掉
  • 如果函数的某些参数未被用上,可删除
  • 如果函数名称带有多余的抽象意味,可修改函数名,让它现实一些
过大的类

现象

一个类过于臃肿,出现太多实例变量。容易产生重复代码,维护困难,代码复用性变差

解决办法

  • 提炼类:建立一个新类,将相关的函数和字段从旧类搬移到新类
  • 提炼子类:一个类中的某些特性只能被一部分实例使用到,可以新建一个子类,将只能由一部分实例用到的特性转移到子类中
  • 提炼接口:两个类中的接口有相同的部分,此时可以将相同的子集提炼到一个独立接口中
  • 复制被监视数据
冗余类

现象

某个类原本对得起自身的价值,但重构使它身形缩水,不再做那么多工作;或开发者事前规划了某些变化,并添加一个类来应付这些变化,但变化实际没有发生

解决办法

  • 折叠继承关系:某个子类并未带来该有的价值,因此需要把类折叠起来
  • 将类内联化:如果一个类不再承担足够责任、不再有单独存在的理由,就用内联将其塞进去
过长参数列表

现象

函数有太多的参数(常常同时存在过长函数、数据泥团、基本类型偏执等其他坏味道)

解决办法

  • 一个参数可通过另一个参数查到时,可使用“以查询取代参数”
  • 多个参数属于同一个数据结构时,可传入数据结构的对象,以保持对象完整
  • 多个参数有关联,总是同时使用,可以引入参数对象
  • 某个参数是空标记用于区分函数行为,可移除标记参数
  • 多个函数有相同的参数,实际上是围绕这些参数工作,可以将多个函数组合成类
发散式变化

现象

某个class经常因为不同的原因在不同的方向上变化

解决办法

  • 提炼类:建立一个新类,将相关的函数和字段从旧类搬移到新类
霰弹式修改

现象

如果每遇到某种变化,都必须在许多不同的classes内做小修改。需要修改的代码散布四处,不但很难找到它们,也很容易忘记某个重要的修改

解决办法

主要思路是将功能集中到一起,常用到以下手段:

  • 搬移函数、搬移字段、搬移语句到函数等搬移特性的重构手法
  • 如果本身架构层次上不应该分开,可使用内联函数、内联类、移除子类等手法将模块合并到一起
依恋情节

现象

函数对某个class的兴趣高过对自己所处host class的兴趣。

解决办法

  • 搬移函数:在该函数最长引用的class中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将就函数完全移除。
  • 提炼函数
数据泥团

现象

两个类中的相同值域、或许多函数签名中的相同参数。这些"总绑在一起出现的数据"真应该放进属于他们自己的对象中。

解决办法

  • 提炼类:建立一个新类,将相关的函数和字段从旧类搬移到新类
  • 引入参数对象:将参数封装到一个对象中,以一个对象取代这些参数
  • 保持对象完整:从某个对象取出若干值,将其作为某次函数调用是的参数,由原本传递参数改为传递整个对象
基本类型偏执

现象

使用大量基本数据类型,而不是将数据定义成数据结构

解决办法

  • 以对象取代数据值:将数据值变成对象
  • 以类取代型别码:如果带着一个有意义的符号名,type code的可读性还是不错的。问题在于,符号名终究只是个别名,编译器看见的、进行型别校验的,还是背后那个数值
  • 以子类取代型别码:它把“对不同行为的了解”从class用户那儿转移到了class自身。如果需要再加入新的行为变化,我这是需要添加subclass就行了。如果没有多态机制,就必须找到所有条件式,并逐一修改它们
switch惊悚现身

现象

switch语句是根据类型码进行的多分支选择语句,写出短小的switch语句很难,即便只有两种条件的switch语句也比我们想要的单个代码块或函数大得多。

解决办法

如果是面向对象语言,大多数情况可以用多态替换:

  • 提取函数:将switch语句提取到一个函数中
  • 搬移函数:将它移到需要多态性的类中
  • 通过 子类/状态/策略 中的一种取代类型码
  • 最后以多态取代条件表达式

如果是面向过程语言:

  • 如果case分支超过5个,为了使代码看起来更简洁,考虑用表驱动的方式
  • 如果可以预见类型码会不断新增,考虑采用策略模式,将控制和处理分离,可以提高扩展性,符合开闭原则
平行继承关系

现象

当为某个class增加一个subclass,必须也为另一个class增加一个subclass。如果发现某个继承体系的名称前缀和另一个继承体系的名称前缀完全相同,那么就是平行继承关系

解决办法

让一个继承体系的实例引用另一个继承体系的实例。如果再接再厉运用搬移函数和搬移字段,就可以将引用端的继承体系消弭于无形

令人迷惑的临时字段

现象

有时你会看到这样的对象:其内某个变量仅为某种特定场景而设,或者只在该对象某一段声明周期内生效

解决办法

提炼类:把这些变量和其相关函数提炼到一个独立class中,提炼后的新对象将是一个method object

过度耦合的消息链

现象

如果你看到用户向一个对象请求另一个对象,然后再向后者请求另一个对象,然后在请求另一个对象…这就是消息链

解决办法

  • 隐藏委托关系
  • 提炼函数:观察消息链最终得到的对象是用来干什么的,可以的话将使用该对象的代码提炼到一个独立函数中
中间人

现象

某个类接口有一半的函数都委托给其他类,这样就是过度运用。

解决办法

  • 移除中间人:直接跟真正负责的对象打交道
  • 将函数内联化:如果这样的函数只有少数几个,可以用内联把他们放进调用端
  • 以继承取代委托:如果这些中间人还有其他行为,可以用继承取代委托,把它变成实责对象的子类
狎昵关系

现象

有时你会看到两个类过于亲密,花费太多时间去探究彼此的私有数据

解决办法

  • 搬移函数、搬移字段:帮他们划清界限,减少狎昵行径
  • 将双向关联改为单向
  • 提炼类:把两者共同点提炼到一个新的类
异曲同工的类

现象

两个函数做同一件事,却有着不同的签名

解决办法

  • 重命名函数:根据他们的用途重新命名
  • 搬移函数:将某些行为植入类,直到两者的协议一致为止
不完美的库类

现象

库构造得不够好,不能让我们修改其中的类使它完成我们希望完成的工作

解决办法

纯稚的数据类

现象

Data Class是指,它们拥有一些字段,以及用于访问这些字段的函数,除此之外一无长处

解决办法

  • 封装字段:类的数据如果有public字段,将其封装
  • 封装集合:类中如果有容器类的字段,将其封装
  • 移除setting函数:对于不该被其他类修改的字段,移除设置函数
被拒绝的遗赠

现象

继承某个类的子类,并不需要父类的某些函数、数据或不需要实现父类实现的接口

解决办法

  • 下移方法、下移字段:让子类拥有只有子类需要的方法或字段
  • 以委托代替继承:如果子类复用了父类的方法,却不愿意支持父类的接口,考虑用此方法

八、编译相关

先由cmake工具,输出标准的构建文件:makefile或project文件,然后再由make构建出最终的执行文件。

CMAKE

简介

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

CMake 的组态文件取名为 CMakeLists.txt,所有语句都写在这里面,当CMakeLists.txt文件确定后,直接使用cmake命令运行,就能得到输出文件。

Cmake 并不直接建构出最终的软件,而是产生标准的建构文件(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再按照一般的建构方式使用。

执行流程
# 1. 用于配置编译选项,一般不需要配置,但如果第2步出现错误,就需要执行此步
$ ccmake dirName
# 2. 根据CMakeLists.txt生成Makefile,一般跳过第1步直接执行此步
$ cmake dirName
# 3. 执行Makefile文件,编译程序,生成可执行文件
$ make
CMakeLists.txt

MAKE

编译so

#  将test.c编译成libtest.so
gcc -fPIC -shared test.c -o libtest.so

九、Git相关

基本概念

  • workspace:工作区(就是电脑能看到的目录)
  • stage area:暂存区/缓存区(.git目录下的index文件中)
  • local repository:版本库/本地仓库(.git目录)
  • remote repository:远程仓库
  • HEAD:一个指向当前工作中的本地分支的指针,可以当做当前分支的别名

仓库操作

# 初始化仓库
git init# 克隆仓库到本地# 通用git clone ssh://git@isource-nj.huawei.com:2222/Gauss/gmdb-kvlite.git# 克隆指定分支git clone -b branchName url

提交、修改

# 添加文件到缓存区# 通用git add *# 把所有文件加入缓存区,根据.gitignore过滤(-u表示只添加有更新的文件)git add . -u# 提交改动到本地仓# 通用git commit# 继续上一次的提交git commit --amend    # 如果上一次已经push过,那么这次push要用 git push -f

查看状态

# 查看改动
git diff# 查看当前分支状态# 通用git status# 查看当前分支状态(只看被追踪的文件)git status -uno

撤销操作

# 放弃文件更改(工作区),撤销修改、撤销文件删除
git checkout -- xxx.cpp# 回退代码到指定版本
git reset xxxx# 清除所有未跟踪文件
git clean -dfx .

git reset

用于回退版本,可以指定退回某一次提交的版本

不止可以回退到之前的版本,还可以回到之后的版本(比如有A->B->C三个版本,当前从C回退到A版本,可以直接从A回到C版本)

参数:

  • –mixed:只保留工作目录的改动,将缓存区和本地仓库回退,默认
  • –soft:保留工作目录和缓存区的改动,将本地仓库回退
  • –hard:没有保留,将工作区、缓存区和本地仓库都回退
  • 注意:慎用–hard参数,它会删除回退点之前的所有信息
# 回退到上一个版本(mixed)
git reset HEAD
# 回退所有内容到上一版本
git reset HEAD^
# 回退指定文件的版本到上个版本
git reset HEAD^ filename
# 回退到指定版本
git reset --soft 052e
# 回退到上上上个版本
git reset --hard HEAD~3
# 将本地的状态回退到和远程一样
git reset --hard origin/master
git rm
git mv
git fetch

用于拉代码,fetch + merge = pull

# 拉取远程仓origin的master分支
git fetch origin master
git remote

用于操作远程仓库

# 显示所有远程仓库(-v显示出详细信息)
git remote -v
# 显示指定远程仓库的信息
git remote show url
# 添加远程仓库(reponame是本地的仓库)
git remote add reponame url
# 删除远程仓库
git remote rm reponame
# 修改仓库名
git remote rename old_name new_name
git rebase
# cherry-pick两个commit点
git cherry-pick xxx1
git cherry-pick xxx2
# rebase到cherry-pick之前的commit点
git rebase -i xxx0
# 之后进入到第一个修改"git文件"页面,将不需要的commit点标题前面的"pick"改为"s"
# 然后进入到第二个修改"git文件"页面,将不需要的commit点的标题删掉,保留一个即可
# 推到远程仓
git push -f nixing dev_V5R3_RD:dev_V5R3_RD

日志操作

git log
git reflog

设置命令

# 设置大小写敏感
git config --global core.ignorecase false

分支操作

# 查看所有分支
git branch -a
# 查看当前分支
git branch
# 切换分支
git checkout branchName
# 删除分支
git branch -d branchName
# 强制删除分支
git branch -D branchName

标签说明

标签名说明
feature新功能(feature)开发
fixbug修复
refactor重构代码、优化配置&参数、优化逻辑及功能
test添加单元测试用例相关
docs添加文档/注释等
style不修改业务逻辑下,仅做代码规范的格式化
chore构建脚本变动
release发布版本,用于开发分支到release分支的同步

git mm

基本工作流程(需安装git mm)

# 1. 初始化git仓
git mm init -u ssh://git@source.huawei.com:2222/DCP_Industry_ServiceRouter/manifest.git -b br_V8R21C00_main_c30001215_B271_gmdb
# 2. 同步代码
git mm sync build fullcode/cmake fullcode/manifest fullcode/router_base
# 3. start
git mm start br_V8R21C00_main_c30001215_B271_gmdb
# 4. 修改文件后,先 git add 和 git commit,然后 git mm upload

十、单位转换

时间转换

秒(s)毫秒(ms)微秒(us)纳秒(ns)
1100010000001000000000
110001000000
11000

存储转换

MBKBBbit
110241024 * 10241024 * 1024 * 8

相关文章:

road to master

零、学习计划 数据库相关 索引 我以为我对数据库索引很了解&#xff0c;直到我遇到了阿里面试官 - 知乎 (zhihu.com)给我一分钟&#xff0c;让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)聚集索引&#xff08;聚类索引&#xff09;与非聚集索引&#xff08;非聚类…...

<深度学习基础> 激活函数

为什么需要激活函数&#xff1f;激活函数的作用&#xff1f; 激活函数可以引入非线性因素&#xff0c;可以学习到复杂的任务或函数。如果不使用激活函数&#xff0c;则输出信号仅是一个简单的线性函数。线性函数一个一级多项式&#xff0c;线性方程的复杂度有限&#xff0c;从…...

评价指标BLUE了解

BLEU (Bilingual Evaluation Understudy&#xff0c;双语评估基准&#xff09;是一组度量机器翻译和自然语言生成模型性能的评估指标。BLEU指标是由IBM公司提出的一种模型评估方法,以便在机器翻译领域中开发更好的翻译模型。BLEU指标根据生成的句子与人工参考句子之间的词、短语…...

5G网关如何提升智慧乡村农业生产效率

得益于我国持续推进5G建设&#xff0c;截至今年5月&#xff0c;我国5G基站总数已达284.4万个&#xff0c;覆盖全国所有地级市、县城城区和9成以上的乡镇镇区&#xff0c;实现“镇镇通5G”&#xff0c;全面覆盖了从城市到农村的延伸。 依托5G网络的技术优势&#xff0c;智慧乡村…...

微信小程序分享后真机参数获取不到和部分参数不能获取问题问题解决

微信小程序的很多API&#xff0c;都是BUG&#xff0c;近期开发小程序就遇到了分享后开发工具可以获取参数&#xff0c;但是真机怎么都拿不到参数的问题 一、真机参数获取不到问题解决 解决方式&#xff1a; 在onLoad(options) 中。 onLoad方法中一定要有options 这个参数。…...

Confluence使用教程(用户篇)

1、如何创建空间 可以把空间理解成一个gitlab仓库&#xff0c;空间之间相互独立&#xff0c;一般建议按照部门&#xff08;小组的人太少&#xff0c;没必要创建空间&#xff09;或者按照项目分别创建空间 2、confluence可以创建两种类型的文档&#xff1a;页面和博文 从内容上来…...

网络基础知识socket编程

目录 网络通信概述网络互连模型&#xff1a;OSI 七层模型TCP/IP 四层/五层模型数据的封装与拆封 IP 地址IP 地址的编址方式IP 地址的分类特殊的IP 地址如何判断2 个IP 地址是否在同一个网段内 TCP/IP 协议TCP 协议TCP 协议的特性TCP 报文格式建立TCP 连接&#xff1a;三次握手关…...

基于SpringBoot的员工(人事)管理系统

基于SpringBoot的员工&#xff08;人事&#xff09;管理系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于SPringBoot的员工管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;BootS…...

【计算机网络】序列化与反序列化

文章目录 1. 如何处理结构化数据&#xff1f;序列化 与 反序列化 2. 实现网络版计算器1. Tcp 套接字的封装——sock.hpp创建套接字——Socket绑定——Bind将套接字设置为监听状态——Listen获取连接——Accept发起连接——Connect 2. 服务器的实现 ——TcpServer.hpp初始化启动…...

Linux内核学习(七)—— 定时器和时间管理(基于Linux 2.6内核)

目录 一、内核中的时间概念 二、节拍率&#xff1a;HZ 实时时钟 系统定时器 三、定时器 系统定时器是一种可编程硬件芯片&#xff0c;能以固定频率产生定时器中断&#xff0c;它所对应的中断处理程序负责更新系统时间&#xff0c;也负责执行需要周期性运行的任务。 一、内…...

Tortoise Git(乌龟git)常用命令总结

查看全局和本地 Git 配置 打开命令行终端&#xff08;如 Git Bash&#xff09;&#xff0c;分别执行以下命令查看全局和本地的 Git 配置信息&#xff1a; git config --global -l git config --local -l确保配置中没有任何与 SSH 相关的设置 移除全局和本地 SSH 相关配置&…...

SSM商城项目实战:物流管理

SSM商城项目实战&#xff1a;物流管理 在SSM商城项目中&#xff0c;物流管理是一个重要的功能模块。通过物流管理&#xff0c;可以实现订单的配送、运输和签收等操作。本文将介绍如何在SSM商城项目中实现物流管理功能的思路和步骤代码。 实现SSM商城项目中物流管理的思路总结如…...

nlp系列(7)三元组识别(Bert+CRF)pytorch

模型介绍 在实体识别中&#xff1a;使用了Bert模型&#xff0c;CRF模型 在关系识别中&#xff1a;使用了Bert模型的输出与实体掩码&#xff0c;进行一系列变化&#xff0c;得到关系 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&…...

Druid配置类、Dubbo配置类、Captcha配置类、Redis配置类、RestTemplate配置类

DruidConfig配置类package com.xdclass.app.config;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.V…...

Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图

Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图 作者:安静到无声 个人主页 目录 Pyecharts教程(十二):使用pyecharts创建带有数据缩放滑块和位置指示器的K线图前言代码讲解总结完整代码推荐专栏前言 本博客将详细解释如何使用Python中的pyech…...

MySQL 基本操作

目录 数据库的列类型 数据库基本操作 SQL语言规范 SQL语句分类 查看表&#xff0c;使用表 管理数据库 创建数据库和表 删除数据库和表 向数据表中添加数据 查询数据表中数据 修改数据表的数据 删除数据表中数据 修改表明和表结构 扩展表结构&#xff08;增加字段&…...

HHDESK一键改密功能

HHDESK新增实用功能——使用SSH连接&#xff0c;对服务器/端口进行密码修改。 1 测试 首页点击资源管理——客户端&#xff0c;选择需要修改的连接&#xff1b; 可以先对服务器及端口进行测试&#xff0c;看是否畅通&#xff1b; 右键——测试——ping&#xff1b; 以及右…...

瞬态电压抑制器(TVS)汽车级 SZESD9B5.0ST5G 工作原理、特性参数、封装形式

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…...

ChatGPT 一条命令总结Mysql所有知识点

想学习Mysql的同学,可以使用ChatGPT直接总结mysql所有的内容与知识点大纲 输入 总结Mysql数据库所有内容大纲与大纲细分内容 ChatGPT不光生成内容,并且直接完成了思维导图。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Offi…...

Nginx-报错no live upstreams while connecting to upstream

1、问题描述 生产环境Nginx间歇性502的事故分析过程 客户端请求后端服务时一直报错 502 bad gateway&#xff0c;查看后端的服务是正常启动的。后来又查看Nginx的错误日志&#xff0c;发现请求后端接口时Nginx报错no live upstreams while connecting to upstream&#xff0c…...

五种 CSS 位置类型以实现更好的布局

在 Web 开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;用于设置网站样式的设置。为了控制网页上元素的布局&#xff0c;使用CSS的position属性。因此&#xff0c;在今天这篇文章中&#xff0c;我们将了解 CSS 位置及其类型。 CSS 位置属性用于控制网页上元素的位置…...

【真题解析】系统集成项目管理工程师 2022 年下半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2022 年下半年真题&#xff08;全国卷&#xff09;&#xff0c;包含答案与详细解析。考试共分为两科&#xff0c;成绩均 ≥45 即可通过考试&#xff1a; 综合知识&#xff08;选择题 75 道&#xff0c;75分&#xff09;案例分析&#x…...

视频中的声音怎么提取出来?这样做提取出来很简单

提取视频中的声音可以有多种用途。例如&#xff0c;我们可能希望从视频中提取音乐或音效&#xff0c;以在其他项目中使用。或者&#xff0c;可能需要将视频中的对话转录为文本&#xff0c;以便更轻松地编辑和共享内容。无论目的是什么&#xff0c;提取视频中的声音都可以帮助我…...

【Qt学习】05:自定义封装界面类

OVERVIEW 自定义封装界面类1.QListWidget2.QTreeWidget3.QTableWidget4.StackedWidget5.Others6.自定义封装界面类-显示效果&#xff08;1&#xff09;添加设计师界面类&#xff08;2&#xff09;在ui中设计自定义界面&#xff08;3&#xff09;在需要使用的界面中添加&#xf…...

网络服务第二次作业

[rootlocalhost ~]# vim /etc/httpd/conf.d/vhosts.conf <Virtualhost 192.168.101.200:80> #虚拟主机IP及端口 DocumentRoot /www/openlab #网页文件存放目录 ServerName www.openlab.com #服务器域名 </VirtualHost> …...

【记录】USSOCOM Urban3D 数据集读取与处理

Urban3D数据集内容简介 Urban3D数据集图像为正摄RGB影像&#xff0c;分辨率为50cm。 从SpaceNet上使用aws下载数据&#xff0c;文件夹结构为&#xff1a; |- 01-Provisional_Train|- GT|- GT中包含GTC&#xff0c;GTI&#xff0c;GTL.tif文件&#xff0c;GTL为ground truth b…...

flutter ios webview不能打开http地址

参考 1、iOS添加信任 webview_flutter 在使用过程中会iOS出现无法加载HTTP请求的情况&#xff0c; 但是Flutter 却可以加载HTTP请求。这就与两个的框架有关了&#xff0c;Flutter是独立于UIKit框架的。 解决方案就是在iOS 的info.plist中添加对HTTP的信任。 <key>NSApp…...

【SpringBoot】详细介绍SpringBoot中Entity类中的getters和setters

在Spring Boot中的Entity类中&#xff0c;getters和setters是用来获取和设置对象属性值的方法。它们是Java Bean规范的一部分&#xff0c;并且通常被用于向开发人员和框架公开类的属性。 在Entity类中&#xff0c;getters和setters方法通常通过property来实现&#xff0c;即将…...

阿里云服务器搭建FRP实现内网穿透-P2P

前言 在了解frp - p2p之前&#xff0c;请先了解阿里云服务器搭建FRP实现内网穿透-转发: 文章地址 1、什么是frp - p2p frp&#xff08;Fast Reverse Proxy&#xff09;是一个开源的反向代理工具&#xff0c;它提供了多种功能&#xff0c;包括端口映射、流量转发和内网穿透等。…...

Vue3 Element-plus Upload 上传图片

技术栈&#xff1a;Vue3 Ts Element-plus 官网地址&#xff1a;Upload 上传 | Element Plus 一、背景&#xff1a; 表单上传图片功能 二、效果&#xff1a; 三、流程&#xff1a; ①点击上传图片按钮&#xff0c;系统弹出文件选择对话框&#xff0c;选择图片并确认 ②调…...

PCL | Ubuntu18安装CloudCompare

文章目录 操作教程 操作教程 CloudCompare下载官网&#xff1a;https://www.danielgm.net/cc/release/ 安装flatpak插件 sudo apt install flatpak添加库路径 flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo安装CC flatpak install flathub or…...

【LeetCode-中等题】138. 复制带随机指针的链表

文章目录 题目解题核心思路&#xff1a;找random指针指向思路一&#xff1a;哈希思路二&#xff1a;迭代构造新链表 方法一&#xff1a;哈希递归方法二&#xff1a;纯哈希方法三&#xff1a;迭代 节点拆分 题目 解题核心思路&#xff1a;找random指针指向 这里的拷贝属于深拷…...

C++--动态规划背包问题(1)

1. 【模板】01背包_牛客题霸_牛客网 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vivi​ ,价值为wiwi​。 &#xff08;1&#xff09;求这个背包至多能装多大价值的物品&#xff1f; &#xff08;2&#xff09;若背包恰好装满&a…...

【Android-Flutter】我的Flutter开发之旅

目录: 0、文档&#xff1a;1、在Windows上搭建Flutter开发环境&#xff08;1&#xff09;[使用中国镜像(❌详细看官方文档)](https://docs.flutter.dev/community/china)&#xff08;2&#xff09;[下载最新版Flutter SDK&#xff08;已包含Dart&#xff09;](https://docs.flu…...

【Linux】深入理解文件操作

文章目录 初次谈论文件重温C语言文件操作系统文件操作接口openwriteread 再次谈论文件文件描述符文件描述符的分配规则 重定向什么是重定向重定向的本质系统调用接口实现重定向<、>、>> 初次谈论文件 开始之前先谈论一下关于文件的一些共识性问题。 一个文件可以…...

异地使用PLSQL远程连接访问Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…...

【方案】基于AI边缘计算的智慧工地解决方案

一、方案背景 在工程项目管理中&#xff0c;工程施工现场涉及面广&#xff0c;多种元素交叉&#xff0c;状况较为复杂&#xff0c;如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时&#xff0c;需要提前报告&#xff0…...

华为各型号交换机开启SNMP v3

设备型号&#xff1a;华为S5720S-28P-LI-AC 设备软件版本&#xff1a;V200R011C10SPC600 调试命令&#xff1a; snmp-agent snmp-agent sys-info version v3 snmp-agent group v3 GroupName privacy //{GroupName}是设置一个SNMP的组名&#xff0c;我设置是SNMPGroup snm…...

CocosCreator3.8研究笔记(一)windows环境安装配置

一、安装Cocos 编辑器 &#xff08;1&#xff09;、下载Cocos Dashboard安装文件 Cocos 官方网站Cocos Dashboard下载地址 &#xff1a; https://www.cocos.com/creator-download9下载完成后会得到CocosDashboard-v2.0.1-win-082215.exe 安装文件&#xff0c;双击安装即可。 …...

【JavaWeb 专题】15个最经典的JavaWeb面试题

文章目录 HTTP长连接和短连接HTTP/1.1 与 HTTP/1.0 的区别可扩展性缓存带宽优化长连接消息传递Host 头域错误提示 AjaxAjax 的优势&#xff1a; JSP 和 servlet 有什么区别&#xff1f;定义区别 JSP 的9大内置对象及作用JSP 的 4 种作用域&#xff1f;session 和 cookie 有什么…...

力扣:75. 颜色分类(Python3)

题目&#xff1a; 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort …...

JVM 内存大对象监控和优化实践

作者&#xff1a;vivo 互联网服务器团队 - Liu Zhen、Ye Wenhao 服务器内存问题是影响应用程序性能和稳定性的重要因素之一&#xff0c;需要及时排查和优化。本文介绍了某核心服务内存问题排查与解决过程。首先在JVM与大对象优化上进行了有效的实践&#xff0c;其次在故障转移与…...

vue indexedDB 取指定数据库指定表 全部key用request.onsuccess

1 例子 export async function funcGetKey(dbName, tableName) {return new Promise((resolve, reject) > {// 打开指定的数据库const request indexedDB.open(dbName);request.onerror (event) > {console.error(打开数据库失败: , event.target.error);reject(event…...

Java 数据结构使用学习

Set和List的区别 Set 接口实例存储的是无序的&#xff0c;不重复的数据。List 接口实例存储的是有序的&#xff0c;可以重复的元素。 Set 检索效率低下&#xff0c;删除和插入效率高&#xff0c;插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。 List 和数…...

monorepo更新组件报错,提示“无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本”

解决方法&#xff1a; 第一步&#xff1a;管理员身份运行 window.powershell&#xff0c; win x打开powerShell命令框&#xff0c;进入到对应项目路径。 第二步&#xff1a;执行&#xff1a;get-ExecutionPolicy&#xff0c;显示Restricted&#xff0c;表示状态是禁止的; 第…...

vue中html引入使用<%= BASE_URL %>变量

首先使用src相对路径引入 注意&#xff1a; js 文件放在public文件下 不要放在assets静态资源文件下 否则 可能会报错 GET http://192.168.0.113:8080/src/assets/js/websockets.js net::ERR_ABORTED 500 (Internal Server Error) 正确使用如下&#xff1a;eg // html中引…...

Android全面屏下,默认不会全屏显示,屏幕底部会留黑问题

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 公司以前的老项目&#xff0c;便出现了这种情况&#xff0c;网上搜索了各种资料&#xf…...

5.Redis-string

string 字符串 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; 1.⾸先Redis中所有 key 的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都是在字符串类似基础上构建的&#xff0c;例如 list 和 set 的元素类型是字符串类型。 2…...

docker高级(redis集群三主三从)

1. 新建6个docker容器redis实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilegedtrue -v /…...

linux 设置与命令基础(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、系统基本操作 二、命令类型 三、命令语法 四、命令补齐 五、命令帮助 六、系统基本操作命令 总结 前言 这是本人学习Linux的第二天&#xff0c;今天主…...