Docker

Docker#

docker img

教程手册#

好用的使用教程

Install#

略过~ 😁

打镜像和跑#

docker build -t server:v0 . -f server.dockerfile

#

docker run -p 9080:80 --name server server:v0

指定启动命令#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "echo hello"

加入自定义网络#

--network {{network name}} 详见:[[#Network]]

跑出问题-进入容器排查#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "bash"

使用-it进入容器手动执行命令进行调试

启动全部容器#

docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker start

Network#

  1. docker run时容器加入方法-redis为例
  2. 后期加入方式
  3. 创建一个新网
  4. 检测
    init_redis:
    	docker run -p 6379:6379 \\
    	--network websafe-network \\
    	--name redislatest redis:latest --requirepass 3b21d032a7fd8eb51fa7bd8a2e812b78b7b3a36f 
    
    join_network:
    	docker network connect websafe-network mysql56
    	docker network connect websafe-network daemon-xxx
    
    init_network:
    	docker network create websafe-network
    
    check_network:
    	docker network inspect websafe-network
    	docker network inspect websafe-network | findStr IPv4Address
    

删除#

可视化#

go install github.com/jesseduffield/lazydocker@latest

如果需要sudo权限的话无法直接执行命令,只能where获取原始路径后sudo+原始路径执行 如:

Docker

Docker#

docker img

教程手册#

好用的使用教程

Install#

略过~ 😁

基础命令#

打镜像和跑#

#

docker build -t server:v0 . -f server.dockerfile

dockerignore#

如果您想在 Dockerfile 中将当前目录中的所有文件都复制到 Docker 镜像中,可以使用 Dockerfile 中的 COPY 指令。具体的语法如下:

COPY . /目标路径/

其中. 表示当前目录,/目标路径/ 表示目标路径,这里可以是绝对路径或相对路径。 这将会将当前目录中的所有文件复制到镜像中的 /app/ 目录下。请注意,在这种情况下,所有文件和文件夹都会被复制到镜像中,包括隐藏文件和文件夹。如果您不想复制某些文件或文件夹,可以在运行 COPY 指令之前通过 .dockerignore 文件来指定忽略的文件和文件夹。

#

docker run -p 9080:80 --name server server:v0

指定启动命令#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "echo hello"

加入自定义网络#

--network {{network name}} 详见:[[#Network]]

跑出问题-进入容器排查#

sudo docker run -it -p 9080:80 --name nova_server nova_server:v0 sh -c "bash"

使用-it进入容器手动执行命令进行调试

Git

Git#

1. 同步远端放弃本地#

git fetch --all
git reset --hard origin/master
git pull 

Windows下问题#

[[Problem of Windows#Windows下Git问题]]

2. git 项目由 Ext4 -> NTFS 复制后#

文件权限发生变化, Git追踪文件权限的话会标记所有文件都需要修改 因为在Linux 下文件权限为 -rw-r--r--(所有者可读写,其他用户只读),但是Linux下挂载NTFS文件权限为 -rwxr-xr-x(所有者可读、写、执行,其他用户可读、执行)就很难受

git config core.filemode false # 关闭github监控文件权限
# git config core.filemode false --global

3. 自己的小仓库 - Gogs 简介#

Gogs (Go Git Service) 是一个用 Go 语言编写的自托管 Git 服务,类似于 GitHub Gitlab Gitee。它轻量、快速且易于安装,适合个人或小团队使用。Gogs 提供了基本的 Git 仓库管理功能,包括代码托管、问题跟踪、Pull Request 等。

源码安装#

  1. 安装依赖

    • 确保已安装 Go 语言环境(1.13 或更高版本)。
    • 安装 Git 和 MySQL/PostgreSQL/SQLite3 数据库。
  2. 下载源码

UE4 笔记

UE4 笔记#

ue4

手机#

  • 路径必须不能用汉字, 一律全英文(神奇…以前习惯就是全英,以为这问题是上世纪的了,测试时不知怎么就把顺手的英文换成中文了,结果就莫名中枪了)
  • java8 (ue4.26.2, 之前4.25也是, 反正就找个稳定版java一直使吧, 这语言太amazing了.)
  • 虽然对java版本有一定要求, 不过按照我这次的测试和使用, 觉得折腾那么久完全是汉字项目名不支持…所以java版本要求应该不是很严重

动画#

事件图表&动画图表#

  • 事件图表: 收集动画->存储在变量中
  • 动画图表: 驱动所有动作

事件图表#

isValid#

蓝图不知道被哪个实例持有(通用)

朝向#

主角本地坐标X轴正方向表正前方

  1. GetVelocity

  2. RotationFromXVector

  3. GetControlRotaion

2,3求Delta.

输出#

  • 速度
  • 方向

总步骤#

  • 向量长度获取Speed
  • 向量方向-控制器方向获取Direction
  • 以上2保存为变量, 交由动画图表

动画图表#

Params-Blend-Result:

  1. 获取速度,方向(看情况可多可少)
  2. 1输入动画混合空间
  3. 输出姿势

State Machine#

在以上一组动作中加入状态细分

  • State Machine - State1-(rule)-State2…StateN
  • State - (Params-Blend-Result)

生效#

  1. 角色
  2. 网格体(骨骼网格体)
  3. 动画-动画类-动画蓝图

Nginx高可用

Keepalived+Nginx实现高可用#

Keepalived+Nginx实现高可用示意图

Nginx 关键字#

  • IO多路复用epoll(IO复用)
  • 轻量,插件: Nginx仅保留了HTTP
  • CPU亲和: 每个worker进程固定在一个CPU

Nginx配置#

代理#

正向代理示意图 正向代理意义?

反向代理示意图

动静分离#

动态页面和静态页面交给不同的服务器来解析

负载均衡#

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

server { 
    server_name  fe.server.com;
    listen 80;
    location /api {
        proxy_pass http://balanceServer;
  }
}

机制#

  • 默认: 轮询, 单机卡顿, 影响分配在这台服务器下的用户
  • 默认: 权重轮询, 宕机Nginx会自动剔除出队列, ip_hash-来源IP分配分配给同个服务器
  • fair: 根据相应时间均衡分配, 默认不支持. 需安装upstream_fair, url_haship_hash同样需要安装Nginx的hash软件包.

Keepalived 配置#

粘贴自: 这里

概览#

VIPIP主机名Nginx端口默认主从
192.168.50.130192.168.50.133liuyazhuang13388MASTER
192.168.50.130192.168.50.134liuyazhuang13488BACKUP

主机器配置#

vi /etc/keepalived/keepalived.conf
# 主要
global_defs {
	## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP
	router_id liuyazhuang133 ## 标识本节点的字条串,通常为 hostname
} 
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
	interval 2 ## 检测时间间隔
	weight -20 ## 如果条件成立,权重-20
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
	state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP
	interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 我的是 eth0
	virtual_router_id 33 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
	mcast_src_ip 192.168.50.133 ## 本机 IP 地址
	priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
	nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
	advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
	## 设置验证信息,两个节点必须一致
	authentication {
		auth_type PASS
		auth_pass 1111 ## 真实生产,按需求对应该过来
	}
	## 将 track_script 块加入 instance 配置块
	track_script {
		chk_nginx ## 执行 Nginx 监控的服务
	} #
	# 虚拟 IP 池, 两个节点设置必须一样
	virtual_ipaddress {
		192.168.50.130 ## 虚拟 ip,可以定义多个
	}
}

备份机配置#

vi /etc/keepalived/keepalived.conf
# 备份
! Configuration File for keepalived
global_defs {
	router_id liuyazhuang134
}
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh"
	interval 2
	weight -20
}
vrrp_instance VI_1 {
	state BACKUP
	interface eth1
	virtual_router_id 33
	mcast_src_ip 192.168.50.134
	priority 90
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}
	track_script {
		chk_nginx
	}
	virtual_ipaddress {
		192.168.50.130
	}
}

Nginx 运维命令#

# 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop

# 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit

# 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload

# 重新打开日志文件
nginx -s reopen

# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename

# 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t

#  显示 nginx 的版本
nginx -v

# 显示 nginx 的版本,编译器版本和配置参数
nginx -V

# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

Tips of debuggers

Clang && lldb#

听说clang+lldb >= gcc + gdb, 所以一试:

lldb基本命令#

与GDB相同

  • break (b) - 设置断点,也就是程序暂停的地方
  • run (r) - 启动目标程序,如果遇到断点则暂停
  • step (s) - 进入下一条指令中的函数内部
  • backtrace (bt) - 显示当前的有效函数
  • frame (f) - 默认显示当前栈的内容,可以通过 frame arg 进入特定的 frame(用作输出本地变量)
  • next (n) - 运行当前箭头指向行
  • continue (c) - 继续运行程序直到遇到断点。
clang hello.c -g -o hello
lldb hello
# lldb
b main
run
n
p str

还有颜色 😂 可视效果确实提高了不少 而且这四个工具可以混用,也蛮好.

GDB#

gdb

First and foremost, you will need to compile your program with the flag “-g” (for debug) to run it via GDB. From there the syntax to start debugging is:

愉快的Java(happy to learn the fuck java)

happy to learn the fuck java 😅#

<微人事> 笔记 -> ψ(._. )>#

先贴官方文档 哦 还有官方项目地址

Java语法#

爪哇方法定义:#

修饰符  返回值类型  方法名(参数类型  参数名){
    方法体;
	return 返回值;
}

# 示个例
public boolean NiHou(int num){
	int a = num;
	return turn;
}

// `boolean` 处 可为
public Collection<? extends GrantedAuthority> getAuthorities(){
	List<GrantedAuthority> authorities = new ArrayList<>();
	return authorities;
}
// 表泛型中可以是的`GrantedAuthority`所有子类

爪哇抽象方法(即Python父类中直接pass的函数…)#

abstract

  1. 包含抽象方法必须得是抽象类
  2. 任何子类必须重写父类抽象方法,或者声明自身为抽象类
public abstract class Employee
{
   private String name;
   private int number;
   
   public abstract double computePay();
   
   //其余
}

爪哇接口#

interface, implements

Golang笔记

Golang笔记#

golang 先贴一个客观的教程文档网站http://www.runoob.com/go/go-slice.html

垃圾回收#

常见的回收算法#

  1. 引用计数
    • 优点:对象可以被很快回收
    • 缺点:不太好处理循环引用
  2. 标记-清除
    • 优点:解决了引用计数的缺点
    • 缺点:需要 STW(Stop The World),暂时停止程序运行
  3. 分代收集(按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,段的放入新生代,不同代有不同的回收算法和回收频率)
    • 优点:回收性能好
    • 缺点:算法复杂
  4. 三色标记法(初始状态:白色、从根节点开始遍历,遍历到的变成灰色,遍历灰色,将灰色引用的标记灰色,遍历过的灰色对象变为黑色。循环遍历灰色对象。通过写屏障检测对象的变化,重复。收集所有白色对象(垃圾))

GPM调度和CSP模型#

CSP 模型?#

CSP 模型是“以通信的方式来共享内存”,不同于传统的多线程通 过共享内存来通信。用于描述两个独立的并发实体通过共享的通 讯 channel (管道)进行通信的并发模型。

GPM 分别是什么、分别有多少数量?#

• G(Goroutine): 即Go协程,每个go关键字都会创建一个协 程。 • M(Machine):工作线程,在Go中称为Machine,数量对应真 实的CPU数(真正干活的对象)。 • P(Processor): 处理器(Go中定义的一个摡念,非CPU), 包含运行Go代码的必要资源,用来调度 G 和 M 之间的关联关 系,其数量可通过 GOMAXPROCS() 来设置,默认为核心数。 M必须拥有P才可以执行G中的代码,P含有一个包含多个G的队 列,P可以调度G交由M执行。

Goroutine调度策略#

• 队列轮转:P 会周期性的将G调度到M中执行,执行一段时间 后,保存上下文,将G放到队列尾部,然后从队列中再取出一个 G进行调度。除此之外,P还会周期性的查看全局队列是否有G等 待调度到M中执行。 • 系统调用:当G0即将进入系统调用时,M0将释放P,进而某个空 闲的M1获取P,继续执行P队列中剩下的G。M1的来源有可能是 M的缓存池,也可能是新建的。 当G0系统调用结束后,如果有空闲的P,则获取一个P,继续执 行G0。如果没有,则将G0放入全局队列,等待被其他的P调度。 然后M0将进入缓存池睡眠。 ![[goroutine.png]]

CHAN 原理#

结构体#

type hchan struct {
	qcount uint // 队列中的总元素个数
	dataqsiz uint // 环形队列大小,即可存放元素的个数
	buf unsafe.Pointer // 环形队列指针
	elemsize uint16 //每个元素的大小
	closed uint32 //标识关闭状态
	elemtype *_type // 元素类型
	sendx uint // 发送索引,元素写入时存放到队列中的位置
	recvx uint // 接收索引,元素从队列的该位置读出
	recvq waitq // 等待读消息的goroutine队列
	sendq waitq // 等待写消息的goroutine队列
	lock mutex //互斥锁,chan不允许并发读写
}

读写流程#

向 channel 写数据:#

  1. 若等待接收队列 recvq 不为空,则缓冲区中无数据或无缓冲区,将直接从 recvq 取出 G ,并把数据写入,最后把该 G 唤醒,结束发送过程。
  2. 若缓冲区中有空余位置,则将数据写入缓冲区,结束发送过程。
  3. 若缓冲区中没有空余位置,则将发送数据写入 G,将当前 G 加入sendq ,进入睡眠,等待被读 goroutine 唤醒。

从 channel 读数据#

  1. 若等待发送队列 sendq 不为空,且没有缓冲区,直接从 sendq中取出 G ,把 G 中数据读出,最后把 G 唤醒,结束读取过程。
  2. 如果等待发送队列 sendq 不为空,说明缓冲区已满,从缓冲区中首部读出数据,把 G 中数据写入缓冲区尾部,把 G 唤醒,结束读取过程。
  3. 如果缓冲区中有数据,则从缓冲区取出数据,结束读取过程。
  4. 将当前 goroutine 加入 recvq ,进入睡眠,等待被写 goroutine唤醒。

关闭 channel#

  1. 关闭 channel 时会将 recvq 中的 G 全部唤醒,本该写入 G 的数据位置为 nil。将 sendq 中的 G 全部唤醒,但是这些 G 会panic。
panic 出现的场景还有:#
  • 关闭值为 nil 的 channel
  • 关闭已经关闭的 channel
  • 向已经关闭的 channel 中写数据

无缓冲 Chan 的发送和接收是否同步?#

// 无缓冲的channel由于没有缓冲发送和接收需要同步
ch := make(chan int)
//有缓冲channel不要求发送和接收操作同步
ch := make(chan int, 2)

channel 无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读 到数据;channel有缓冲时,当缓冲满时发送阻塞,当缓冲空时接 收阻塞。

tip Of vim

Vim 使用#

vim 除去“简便生活”里的几条配置,在纠结是否添加到别的地方,果然还是单独给vim一个使用手册比较好……

注释#

    # 注释
    112s/^/#/g   
    ---
    # 取消注释
    112s/^#//g     

其实 是vim中的 :s替换命令… 下方解释

或者,使用列编辑的模式:

v、选择区域、ctrl q置行首、I插入#、Esc应用到全列
ctrl v、I、#、Esc
因为有的ctrl q或者ctrl v 不能用……

取消,即使用上述方法选中行首,删除第一个字节即可了

替换#

:s/oldWords/newWords/g

g : 代表当前光标所在行。

由此可知:#

^表行首标识符。 /^/表示行首的空字符。 而取消注释中的/^#/即表示行首的#,被//空字符所替换。

删除:g/出现计算意外/d#

:g/出现计算意外/d

查找高亮#

    set hlsearch
    set nohlsearch  

分屏#

实现#

  • 在外部使用-o or -O参数
  • 内部split or vsplit

操作#

  • 移动光标 Ctrl + w hjkl
  • 移动分区Ctrl + w HJKL
  • 统一高度Ctrl + w =
  • 改变高度Ctrl + w +-

more and less#

阅读器~~~ 因为经常读大文件发现了这两个的无敌好处——快。

Vn.Py学习笔记(Python交易平台框架)

author: Ian

Vn.Py笔记 ✏📔#

vn.py#

一个开源Python交易软件,主使用CTP协议。当然,还有其他协议了其源项目在http://www.vnpy.org/




初期笔记#

报单交易过程中,

CTP使用BrokerID 从业务层面完全隔离不同经纪公司的交易、风控及结算用户的接入。
BrokerID具体取值咨询开户的经纪公司。

CTP中 UserID为操作员代码,InversterID为投资者代码; 投资者自己下单两者同为投资者代码

CTP-API中,OrderRef和OrderAction    前者为CTP后台提供给客户端标识一笔报
单的字段,从客户端可通过(FrontID、SessionID、OrderRef)唯一确定一笔报
单;;;后者与OrderRef功能相似,提供给客户端来标识一笔撤单。
前者的数据类型为字符数组,必须为阿拉伯数字字符。
OrderRef(OrderActionRef)取值必须保证在同一会话内发送的报单
OrderRef(OrderActionRef)值大于之前的最大值,开发多线程客户端尤为需要  
注意。

CTP-API库:

error.dtd\error.xml 错误定义文件    ----   ThostFrfcMdApi.h 
交易接口类定义文件  
———   ThostFtfcUserApiDataType.h 类型定义文件  ------    
thostmduserapi.lib,thostmduserpi.dll 行情接口库文件     -----   
thosttraderapi.lib,thosttraderapi.dll交易接口库文件   ----- 

交易和行情接口类定义文件都包含API 和 SPI类定义,客户端使用API向CTP后台
发送请求,CTP后台则使用SPI向客户端回传响应及回报

行情Demo开发:
    1.将API文件复制到工程目录;并将所有的头文件和静态、动态库连链接库
并将文件导入到项目工程中。
    先继承行情接口类CThostFtdcMdspi,并实现需要实现的虚函数。  
OnFrontConnectde、OnFrontDisconnected、OnPspUserLogin、
OnRspSubMarketDAta

/API工作流程***/

API压缩包——API含常量对应字符、类型定义、操作系统编译定义、回调函数(MdSpi)(柜台向用户端发送信息后被系统自动调用的函数)、主动函数(MdApi)(向柜台发送各种请求和指令)

API工作流程: 创建MdSpi对象(回掉函数),调用MdApi类,以Create开头的静态方法,创建MdApi对象(主动函数),注册MdSpi对象指针,行情柜台前置机地址,调用MdApi对象Init方法初始化连接前置机,连接成功会通过OnFrontConnected回调通知用户,用户获得连接成功通知后,调MdApi的ReqUserLogin登陆,登陆后MdSpi的OnRsqUserLogin通知用户 ———————-到此登陆完成———————

MdApi:(行情相关)
    使用MdApi对象的SubscribeMarketData方法,传入参数为想要订阅的“合约
代码”,订阅成功当合约有新行情通过MdApi的OnRtnDepthMarketData回调通知   
用户

———————-至此订阅完成——————— 当用户的某次请求发生错误时,会通过OnRspError通知用户 MdApi也含有退订合约、登出功能。 而一般退出程序则直接杀进程(不太安全便是)