域名解析里正常解析80,在nginx里转发
1 | server { |
域名解析里正常解析80,在nginx里转发
1 | server { |
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的部分)
参考教程:https://github.com/xdp-project/xdp-tutorial/
ebpf介绍:https://sysdig.com/blog/sysdig-and-falco-now-powered-by-ebpf/
1 | ${workspaceFolder}/** |
map常用路径:/sys/fs/bpf
创建:mount -t bpf bpf /sys/fs/bpf/
参考:https://github.com/xdp-project/xdp-tutorial/blob/master/common/common_user_bpf_xdp.c
载入ebpf
的obj
,根据是否重用已有map调用不同的APIload_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
指令ethtool可显示配置网卡硬件
参考:https://man.linuxde.net/ethtool
RTNETLINK允许对内核路由表进行读和更改,它用于内核与各个子系统之间(路由子系统、IP地址、链接参数等)的通信,
参考:https://www.cnblogs.com/wenqiang/p/6634447.html
利用PER_CPU类型的map来避免同步带来的开销(只利用特定的CPU来进行计算)
1 | Host [配置名] |
服务器端ssh设置:https://www.runoob.com/w3cnote/set-ssh-login-key.html
简单说就是到etc/ssh/sshd_config
里开了
1 | RSAAuthentication yes |
然后往/ssh/suthorized_keys
里加公钥
修改.gitmodules后执行
1 | git submodule sync |
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 | repoPath=$(git rev-parse --show-toplevel) |
1 | git submodule deinit <submodule name> |
1 | git clone --bare [url from] |
1 | git branch -d [branchname] |
环境变量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 | # 获取当前所在仓库根目录在本机上的绝对路径 |
参考资料: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)
来获取匹配值。2>1>
课上对博弈树的$\alpha-\beta剪枝$算法没有完全理解,写个博客理一理……
(双方、确定、有限状态、离散状态、完全信息下的零和博弈,极大极小策略下的情况)
因为代码部分实现比较简单,先从伪代码部分开始说起,无剪枝博弈树的深度优先策略伪代码如下:
succsor
代表该状态可能的后继状态value
代表该状态的收益值isTerminal
判断是否是叶节点1 | gameTree(state,player): |
下意识就写成了类似python的格式
比较简单的算法(当然以为是伪代码所以并不是完整的实现),目的就是对MAX玩家而言,找到子节点中值最大的,对MIN玩家而言,找到子节点中最小的,不断迭代就好
由于计算量比较大,所以引入了$\alpha-\beta剪枝$,用于剪掉一部分不必要的搜索,添加剪枝后的伪代码如下:
1 | gameTree(state,player,alpha,beta): |
可以看到和之前相比就是MAX(MIN)中途如果检测到比父节点传来的beta(alpha)更大(小)的alpha(beta)就将后续的搜索全部剪掉。
嗯,就是实现来说还是比较容易理解的,但是为什么能这样剪?
由于alpha值只会在遍历到比他大的值时才会更新,所以只要能提前得知某个子节点的分支全部搜索完的alpha值必然小于或等于自己的alpha时,那么就可以直接省略掉该节点剩下的搜索了
考虑到beta值只会在遍历到比他小的值时才会更新,只要我们发现MIN节点的当前的beta值小于或等于其父节点的alpha值时,我们就可以保证无论是否继续搜索下去,该MIN节点的beta值都会小于等于其父节点的alpha,故剩余的搜索就可以省略了,因为父节点必然不会采纳这个点来更新alpha
我们搜索子节点的目的就是需要更改祖先节点alpha或者beta值,所以我们需要剪枝的是那些没有办法更改的祖先节点。
假设一个节点可以更改其祖先节点的值,那么它将会一层层向上传递,所以它至少需要满足的条件是:大于最大值祖先节点,或者值小于最小值祖先节点。
剩下的推理就和临近分支类似了。
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
问号的地方是自己可能之后需要再找些资料深入理解的地方(虽然鸽掉的可能性更大……)
之前人们的语言生成据大多数都限制在特定任务使用监督方式
自编码和RNN不适用于从任意隐藏层表示生成(?)
更近的研究尝试VAE和GAN来生成文本,然而他们的生成有极大的随机性和不可控性
这篇论文试图解决受控文本生成的问题
他们关注于生成真实的段落利用dr表示
挑战之一:
是离散文本不可微,无法使用全局判别器来反向梯度
解决方式是策略梯度(SeqGAN(训练高方差))、连续近似(预先定性存在的结果)(?)。半监督VAE最小化逐元素重构误差(丢失了段落的整体信息)
挑战之二:
控制生成与disentangled representation learning相关
可能进行限制时,产生的属性并不一定是我们需要的
模型优势:高度表示设计好的语义结构,用动态的执行属性生成段落。
基于VAE,结合整体判别器,端到端优化
模型可描述为带wake-sleep(笔者注:现在还能看到这个术语有点意外……不过说起来为啥这东西之后就没见怎么用过了)功能的增强版VAE
判别器与传统方法相比优点在于不同属性可以独立训练
将特征向量分为两部分,结构化和非结构化
结构化部分是我们需要调整的部分,这部分交给discriminator来拟合自己定义的值,从而进行约束
非结构化部分用于储存不是我们需要约束的那些所有特征信息
退火算法可以解决梯度离散问题(?)