nginx 二级域名转发

域名解析里正常解析80,在nginx里转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;

# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332

server_name [在这填网站];

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://0.0.0.0:3000;
}
}

Docker相关

Docker清华镜像
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

Docker安装
https://docs.docker.com/install/linux/docker-ce/ubuntu/

Docker Compose安装
https://docs.docker.com/compose/install/

Docker国内镜像加速
https://www.daocloud.io/mirror

将正在运行的容器打包成镜像
https://www.jianshu.com/p/608998d7ec9f

遇上的坑
用户组问题:https://www.cnblogs.com/studyNT/p/10836021.html
子网网关问题:https://www.cnblogs.com/lemon-le/p/10531449.html

用docker-compose down来停止

docker-compose up参数:
-d后台运行
--build 重新构建镜像(对含有build的部分)

XDP杂语

参考教程:https://github.com/xdp-project/xdp-tutorial/

ebpf介绍:https://sysdig.com/blog/sysdig-and-falco-now-powered-by-ebpf/

包含路径

1
2
3
4
${workspaceFolder}/**
/usr/include
/usr/include/linux
/usr/lib/llvm-6.0/lib/clang/6.0.0/include

bpffs(bpf用文件系统)

map常用路径:/sys/fs/bpf

创建:mount -t bpf bpf /sys/fs/bpf/

loader读取数据(不用libbpf情况下的步骤):

参考:https://github.com/xdp-project/xdp-tutorial/blob/master/common/common_user_bpf_xdp.c

载入ebpfobj,根据是否重用已有map调用不同的API
load_bpf_object_file_reuse_maps / load_bpf_object_file

通过title找到ebpf中的特定程序(函数),title是自己在编译前指定的
bpf_object__find_program_by_title
(没有title的单函数obj也可以通过bpf_program__next来得到第一个)

获取程序的文件描述符,用于后续载入
bpf_program__fd

根据类型的不同,将文件描述符传入以载入程序
xdp_link_attach(XDP类型下)

[可选,libbpf下函数(不用libbpf会相对复杂)]共享/解除共享BPF map,使得多个bpf程序可以共用(在bpf文件系统中可见/不可见,不确定有没有持久化功能)
bpf_object__pin_maps / bpf_object__unpin_maps

读取ebpf程序存入map的数据
bpf_map_lookup_elem

概念

ifindex(接口索引):物理或逻辑接口的唯一识别索引
参考:https://www.cisco.com/c/zh_cn/support/docs/ip/simple-network-management-protocol-snmp/28420-ifIndex-Persistence.html

BTF(Bpf Type Format):map中key-value对只关注数据类型的字节占用大小,没有语义信息。而BTF为map在debug时提供有结构的语义信息。
参考:https://github.com/torvalds/linux/blob/master/Documentation/bpf/btf.rst

(xdp_md ctx): 上下文数据结构
其内部结构的__u32不是真正的结构,只是为了确定数据位数,需要手动转化为long
一个包的长度可以通过内部的data_end - data运算得到
参考:https://elixir.bootlin.com/linux/v5.0/ident/xdp_md

XDP无关

指令ethtool可显示配置网卡硬件
参考:https://man.linuxde.net/ethtool

RTNETLINK允许对内核路由表进行读和更改,它用于内核与各个子系统之间(路由子系统、IP地址、链接参数等)的通信,
参考:https://www.cnblogs.com/wenqiang/p/6634447.html

TIPS

利用PER_CPU类型的map来避免同步带来的开销(只利用特定的CPU来进行计算)

git的一些指令

切换submodule的仓库

修改.gitmodules后执行

1
2
3
git submodule sync
git submodule init
git submodule update

submodule在init时的HEAD是独立于对应的仓库的(它只是一个指向对应commit的指针),要让submodule的修改引用于其对应的仓库,见:
https://stackoverflow.com/questions/9189575/git-submodule-tracking-latest
https://stackoverflow.com/questions/5828324/update-git-submodule-to-latest-commit-on-origin
https://stackoverflow.com/a/19872486

总结:

1
git submodule update --remote --merge

可以确保拉取的是仓库中的最新版,然后自己手工或脚本在update后checkout每个submodule到master分支

重定向HEAD到master(<path>记得修改成自己的仓库路径)

1
2
repoPath=$(git rev-parse --show-toplevel)
git submodule foreach --recursive 'branchName=$(git config -f $repoPath/.gitmodules submodule.$name.branch);git checkout $branchName'

从仓库移除submodule

1
2
git submodule deinit <submodule name>
git rm --cached <submodule name>

迁移git仓库

1
2
git clone --bare [url from]
git push --mirror [url to]

删除本地分支

1
git branch -d [branchname]

使用其他ssh

环境变量GIT_SSH可以指定使用的ssh连接命令,因此可以通过这个来改变使用的公钥

1
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"

https://www.cnblogs.com/chenkeyu/p/10440798.html

路径相关

1
2
3
4
# 获取当前所在仓库根目录在本机上的绝对路径
git rev-parse --show-toplevel
# 获取仓库内文件相对于仓库根目录下的路径
git ls-files

Python正则表达式

参考资料:https://www.crifan.com/python_re_sub_detailed_introduction/

匹配中可用\1,\2……等代表匹配的组(括号内的)

sub替换下,若参数为字符串,可用\g<1>,\g<2>……代表匹配的组,当匹配中有设定(?P<name>)时,\g<name>可以对该组进行匹配(name可是任意其它字符串);若参数为函数,函数的输入参数是一个match object,可以用obj.groups()或者obj.group(int)来获取匹配值。

博弈树剪枝相关

课上对博弈树的$\alpha-\beta剪枝$算法没有完全理解,写个博客理一理……

(双方、确定、有限状态、离散状态、完全信息下的零和博弈,极大极小策略下的情况)

代码部分

​ 因为代码部分实现比较简单,先从伪代码部分开始说起,无剪枝博弈树的深度优先策略伪代码如下:

  • 函数succsor代表该状态可能的后继状态
  • 函数value代表该状态的收益值
  • 函数isTerminal判断是否是叶节点
1
2
3
4
5
6
7
gameTree(state,player):
if isTerminal(state):
return value(state)
if player is MAX:
return max(gameTree(next,MIN) for next in succsor(state))
else:
return min(gameTree(next,MAX) for next in succsor(state))

下意识就写成了类似python的格式

​ 比较简单的算法(当然以为是伪代码所以并不是完整的实现),目的就是对MAX玩家而言,找到子节点中值最大的,对MIN玩家而言,找到子节点中最小的,不断迭代就好

​ 由于计算量比较大,所以引入了$\alpha-\beta剪枝$,用于剪掉一部分不必要的搜索,添加剪枝后的伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
gameTree(state,player,alpha,beta):
if isTerminal(state):
return value(state)
if player is MAX:
for next in succsor(state)
alpha = max(alpha, gameTree(next,MIN,alpha,beta))
if alpha > beta:
break
return alpha
else:
for next in succsor(state)
beta = min(alpha, gameTree(next,MIN,alpha,beta))
if alpha < beta:
break
return alpha

​ 可以看到和之前相比就是MAX(MIN)中途如果检测到比父节点传来的beta(alpha)更大(小)的alpha(beta)就将后续的搜索全部剪掉。

​ 嗯,就是实现来说还是比较容易理解的,但是为什么能这样剪?

对alpha-beta剪枝的理解

临近分支情况

​ 由于alpha值只会在遍历到比他大的值时才会更新,所以只要能提前得知某个子节点的分支全部搜索完的alpha值必然小于或等于自己的alpha时,那么就可以直接省略掉该节点剩下的搜索

​ 考虑到beta值只会在遍历到比他小的值时才会更新,只要我们发现MIN节点的当前的beta值小于或等于其父节点的alpha值时,我们就可以保证无论是否继续搜索下去,该MIN节点的beta值都会小于等于其父节点的alpha,故剩余的搜索就可以省略了,因为父节点必然不会采纳这个点来更新alpha

跨节点情况

​ 我们搜索子节点的目的就是需要更改祖先节点alpha或者beta值,所以我们需要剪枝的是那些没有办法更改的祖先节点

​ 假设一个节点可以更改其祖先节点的值,那么它将会一层层向上传递,所以它至少需要满足的条件是:大于最大值祖先节点,或者值小于最小值祖先节点

​ 剩下的推理就和临近分支类似了。

最近的NLP记录

关于disentangled representation learning(解耦表示?)

https://www.zhihu.com/question/329025043
https://www.zhihu.com/question/329270182
https://blog.csdn.net/cv_family_z/article/details/77868401

看了点东西之后感觉就是将特征的不同分量表示为不同的物体属性,从而只改变一些分量的情况下可以只变化物体的某一些属性而对另一些影响不大

有点感兴趣的东西

Wasserstein Auto-Encoders

一些大概算是摘抄翻译?

问号的地方是自己可能之后需要再找些资料深入理解的地方(虽然鸽掉的可能性更大……)

Toward Controlled Generation of Text

之前人们的语言生成据大多数都限制在特定任务使用监督方式
自编码和RNN不适用于从任意隐藏层表示生成(?)
更近的研究尝试VAE和GAN来生成文本,然而他们的生成有极大的随机性和不可控性

这篇论文试图解决受控文本生成的问题
他们关注于生成真实的段落利用dr表示

挑战之一:
是离散文本不可微,无法使用全局判别器来反向梯度
解决方式是策略梯度(SeqGAN(训练高方差))、连续近似(预先定性存在的结果)(?)。半监督VAE最小化逐元素重构误差(丢失了段落的整体信息)

挑战之二:
控制生成与disentangled representation learning相关
可能进行限制时,产生的属性并不一定是我们需要的

模型优势:高度表示设计好的语义结构,用动态的执行属性生成段落。
基于VAE,结合整体判别器,端到端优化
模型可描述为带wake-sleep(笔者注:现在还能看到这个术语有点意外……不过说起来为啥这东西之后就没见怎么用过了)功能的增强版VAE

判别器与传统方法相比优点在于不同属性可以独立训练
将特征向量分为两部分,结构化和非结构化
结构化部分是我们需要调整的部分,这部分交给discriminator来拟合自己定义的值,从而进行约束
非结构化部分用于储存不是我们需要约束的那些所有特征信息

退火算法可以解决梯度离散问题(?)

MyPage 相关

Docker相关

docker-compose up

出问题时试试先restart docker,似乎能解决不少问题

Go相关

go.mod中module改为main,main内引用本地包XX时用”main/XX”

go.mod和gopath不能在/指向同一个目录

`go run main (在src目录下)

离线包下载后,解压到 $GOPATH$/src对应的路径,然后执行 go install [包名]安装包(存疑)

React相关

模态框实现

|