一次由于Channel buffer size导致Go内存泄漏的分析

我代码里面有这么一段逻辑

func foo() int {
ch := make(chan int)
go func() {
ch <- 1
}()
go func() {
ch <- 2
}()
ret := <- ch
return ret
}

这里问题出在make(chan int)时,默认buffer size是0,这样两个go协程在试图往ch里加东西时,如果没有消费者,其实会一直卡死等待。但是我只消费一个,所以会导致一定有一个协程没有退出,导致内存泄漏。

我是通过go tool pprof 把goroutine的占用情况找出来发现这个问题的:

论文阅读笔记:Efficient Neural Architecture Search via Parameter Sharing

ENAS 主要做的是对于一个DAG图,i向i+1,…,n有边。i->j的权值矩阵是$\omega _{j, i}$。有一个Controller 会选择一些边激活,然后根据激活的边去建立一个网络。

基本方法:

对于RNN,DAG的1号节点接受$x_t, h_{t-1}$,分别为时间$t$的输入,和上一个的输出。然后对于每个节点,选择前面的节点是哪些。输出$h_{t}$是DAG的终点的平均。(我对RNN不了解,所以再细节的我没有太看明白)

对于CNN,有两种搜索方法。一种是宏观(marco)搜索,一种是围观(mirco)搜索。宏观搜索中每个DAG的节点代表一层layer,然后有33conv,55conv,sep-33conv,sep-55conv,max-pooling,avg-pooling,(不同层之间的参数不共享)。

微观搜索搜出来conv cell和reduction cell,然后如下图组合到一起。这里是直接把这一个cell复制N遍,第$i$层接受第$i-1$和第$i-2$层的输出。其中layer i就是第$i$层的输出。

Read More

从ubuntu server 开始,配置自动分流的软路由

花了好长时间,配置好了一台软路由,现在可以自动分流,国外流量通过vps出去。我自己还造了一个dns服务器的轮子,现在可以预查一下,国内的用114,国外的用vps的那边ip作为edns_ip去查一下。这样cdn能用国内的也会尽量用国内的,还是防污染的,国外cdn也不会绕路。

我是在淘宝上买的一台专门用来做软路由的x86 的小机器。有4个网卡,j1900的cpu。其实如果有不用的机器而且有两个网卡的话,也可以搭起来。我是直接从ubuntu server 开始搭的,没有用什么固件,因为洁癖哈哈哈哈。

现在我的路由拓扑大概长这样:

        -----------              -------
        | CERNET  |              | ISP |
        -----------              -------
            ||                     ||
            nat                    nat
            ||                     ||
----------------             -----------------
|  bj00        |             |  sf01         |
| 10.56.1.0/20 |  <=======>  | 10.56.16.0/20 |
|              |             |               |
---------------              -----------------
     ||
    lan
     ||
 10.56.1.0/24

基本路由功能

Lan Interface
首先把一个网卡设置成内网的接口(interface),在路由器上这个网卡的设置可以写在/etc/network/interfaces里面,把下面内容写到里面末尾:

auto enp2s0
iface enp2s0 inet static
address 10.56.1.1
netmask 255.255.255.0

接下来运行sudo service networking restart 去重启,运行ip addr就可以看到新配置的接口。注意我的接口名字就叫做enp2s0,你可以通过ip addr查看你的接口名字。

其实这样就可以自动配置好到10.56.1.0/24这个子网的路由之类的。

sysconf
把这些项加到 /etc/sysctl.conf 里面

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

前两项后面配置策略路由的时候需要用到,后面两项是允许系统接受目的地不是本地的包。重启下机器生效(其实应该某条命令也可以生效的,我一直没成功233333

dhcp 服务器
安装isc-dhcp-server

sudo apt install isc-dhcp-server

接下来配置/etc/default/isc-dhcp-server,把接口改成刚才设置的接口:

INTERFACES=”enp2s0”

编辑/etc/dhcp/dhcpd.conf,把下面内容加进去:

subnet 10.56.1.0 netmask 255.255.255.0 {
range 10.56.1.20 10.56.1.100;
option routers 10.56.1.1;
option domain-name-servers 10.56.1.1;
}

那个domain-name-servers,我是已经配置好了一个dns server,所以填的服务器地址,如果没配置好可以先设置成114之类的。

接下来运行sudo service isc-dhcp-server restart 重启dhcp服务器。

现在路由器的基本功能应该是已经够了,把这个网口接上交换机或ap就已经可以组建一个局域网了。也可以直接可以插上一个网线到连到你的电脑上,你就可以看到自己被分配了一个内网的ip地址,还可以ping 10.56.1.1玩一下。

nat
需要nat才可以上外网。

运行下面这条命令就可以把源是内网ip,出口是enp1s0的加上一个nat。那个enp1s0是插公网网线的那个出口。

iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE

到现在位置你获得了一个高性能x86架构的普通的路由器了233333333

=========== 坑,哪天想起来继续填。。===========

策略路由

ipset&iptables
openvpn tunnel

无污染的dns,freedns

持久化配置

FreeDNS: 利用Google 的 DNS-Over-HTTPS 来实现无污染的DNS

现在已经不维护这个项目了,可以看一下https://github.com/Chenyao2333/freedns-go。用go写的,解决的问题是国内和国外都有cdn站点时,优先使用国内的结果。不过并非dns-over-https。

项目地址:https://github.com/Chenyao2333/freedns

用Node.js 写的,基于Google 的 DNS-Over-HTTPS。还实现了一个简陋的lazy 更新缓存。

比较糟糕的是有些网页用了各种cdn,各种奇怪的域名,基本上大概一个新网页就是几十的并发。但是因为缓存的存在,所以打开一次之后,再打开就非常顺畅。缓存的更新策略是当前链接小于3个的时候,就去查询被查询到的过期缓存。

我把这个架设到校内的工业云上面了,上面没有ipv6地址,我用isatap 连上了校内的ipv6 隧道。之后就可以直接查询到香港的Google 服务器,ping 的延迟在50+ ms 左右。应该可以支持小规模的访问,教育网的的同学可以把自己的地址设置到101_6_163_87 。之后有ipv6的情况下可以直接上google 之类的站点。(因为我没有设置死了edns为学校的ip,所以返回的应该是针对教育网的北京cdn,其他网络用起来可能比较慢)

遇到tentative dadfailed 的解决方案

发现无线网卡不能分配到ipv6的地址,觉得非常奇怪,通过ip addr发现被分配了几个本地的地址,并且有一个tentative dadfailed标记。

原因是因为ip地址冲突,但是非常奇怪为什么会冲突,解决方案及其暴力,就是允许接受冲突….:http://blog.clanzx.net/2013/11/16/ipv6-dad.html

新建一个/etc/sysctl.d/accept_dad.conf的文件,内容填上:

net.ipv6.conf.all.accept_dad = 0
net.ipv6.conf.default.accept_dad = 0

net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0

然后重启机器解决问题。

我其实还想换mac地址来着,但是不知道为啥换了以后不生效,遂放弃…

NOIP2016 Day1 天天爱跑步 题解

第一次出题好激动啊,这题是我在军训时候开脑洞想起来出的,其实一开始题目比这个难,但是我发现我做不出来了。最后经过多次迭代题目变成了这个样子。这个解法是某次ddl干不完于是去厕所冷静一发想出来的。

首先是求出来每条路径的LCA,倍增或者Tarjan都行。接下来路径变成向下和向上的路径。

先考虑向上的路径。对于节点$j$的$W_j$,只有起点距离$j$为$W_j$的路径可以被观察到。所以对于起点$S_i$,只有$deep[S_i] = deep[j] + W_j$的时候才能被$j$观察到,这样对于每个询问问题就成了:子树中有多少路径起点的深度值为$deep[j] + W_j$,且这个路径经过自己。这是个经典的离线问题,首先可以DFS一遍求出DFS序,之后一颗子树在序列上是连续的,所以相当于问一个区间有多少值为$deep[j] + W_j$,从左往右扫描一遍即可。记$pre_i$为DFS时初次访问节点$i$的dfs序,$suf_i$为退出节点$i$时的dfs序,再记录一个数组$a$,那么离线起来有这些事件:

  • 对于一个$W_j$,在扫描到$pre_j$时候记录下$a[deep[j] + W_j]$的值;扫描到$suf_j$的时候再记录下$a[deep[j]+W_j]$的值,两次做差就是$j$观察到人数
  • 对于一个向上的路径,起点为$S_i$,终点为$T_i$(这里的$T_i$是LCA不是原题的$T_i$),在扫描到$pre_{T_i}$时, 给$a[deep[S_i]]$加上1;扫描到$suf_{T_i}$时,给$a[deep[S_i]]$减去1。
    类似的,对于向下的路径,有$W_j - deep[j] = total_len - deep[T_i]$,其中$total_len$为路径的长度。之后可以用类似的算法做出来。

 

比赛的时候有个小插曲,当时我们班组织在圆明园玩,突然微信群上看到说我题目样例描述有问题…

ymy

还有天天小朋友长这样:

tt

以及我阿甘快刷不完了

冬天的圆明园还不错

noi2015-杭州游记

noi之前

我们提前来了几天跟着学军的大爷们一起集训,每天都处于被虐的状态。

报到日

因为之前一直住在学军附近宾馆,所以我们并不怎么着急,就是搬了个地方。下午的时候遇到了外语的小伙伴们,和安一的那个妹子。

到了寝室发现被分到了女寝,然后被寝室的画风吓傻了,乡下人没见过世面。还在墙上发现了某个鬼畜的树。之后就是翻一翻柜子看看会不会有妹子留下的什么奇怪的物品,雾

领物品的时候打开包发现真的给我发了粉色衣服,然后激动的拿了出来,被负责迎宾的妹子笑了一番QAQ。然后不知道什么缘故,夹心选的粉色衣服并没有给他,他表示相当气愤。

开幕式、笔试

开幕式上最大的感触就是“别人学校的妹子”。不得不说学军的妹子真的多才多艺。dzd像往常一样继续表示noip取消保送是CCF和教育部斗争的结果,但是大家的热情并不减之类的话。又说noi人数创新高,比去年多一人,似乎去年也是这么说的,CCF真机智啊,这样就可以实现每年NOI人数持续增长。C、D类的人数似乎还感受到了外快也创新高了

下午笔试,发现还是99分,并不知道哪里错了,和去年似乎一样。

下午的时候和rbw一起去操场转悠,遇到了两个妹子,操场上就我们4个人,不太好意思躲开就去要了QQ。发现里面其中一个人是mjy,看了她的成绩后被吓傻了,还是初三,感觉妹子这么厉害还怒虐男选手。

day1

不太明白为什么要在门口排队进,感觉这样还是很挤啊。

翻开题目被吓了一跳,卧槽这画风不对,没有提答,CCF想干嘛。看了第一题画风更不对了,似乎是个真·普及难度?我又读了几遍题还是不敢动键盘。第二题看了后感觉又不对了,树剖裸题?要干嘛?第三题看完之后觉得不会,可以玩4个小时第三题。为了吸取数次比赛跪的教训,最后再写数据结构题。不过中间剩3个小时的时候觉得保险还是去给前两题写了。此时t3并没有什么进展。最后YY了一个70分的算法,感觉自己代码能力有些坑,剩40分钟才搞完。测了一下给的样例对了,又跑了一下200\300的点,都能跑出来,最后试了一下500,发现卧槽0.4s就可以出解,是我常数压的小的缘故吗?

成绩出来后梦迪300分,我也是300分,感觉不错,真·暴力出奇迹。

下午讲题的时候第二题出题人被婊的好惨,第二题有200+人AC,出题人表示如果去看一眼BZOJ就不会发生今天这个情况…

社会活动日

先去阿里听报告,在路上导游介绍的时候我一直在玩马云不会写代码和支付裱这个梗…报告其实是从其他地方贴来的PPT换了封面,感觉应付一批一批的来听报告的人也是蛮辛苦的。

之后去西溪湿地,在车上的时候勾搭到了负责河南和贵州的妹子,她们原来是新高一的,随身还带着王后雄,感觉好厉害,感觉这预示着我NOI药丸,要回去高考。

在西溪湿地有个寻宝活动,但是可能我们走的比较慢的缘故,只发现了一张谢谢参与。不过这个似乎比河北他们拿到10张谢谢参与要强233333333。感觉西溪湿地的景色挺不错的,志愿者妹子也不错:)。玩到下午突然下起了雨,把我们都打散,学军也决定不去湿地博物馆了。在返回出口的电瓶车上和mjy坐到了一起,被吓得到处在爬。我们返回的时候发现车队停在了钉子路口,三个岔口路边都是车,并不知道哪辆是返回的车,3个方向都找了一遍才找到车,好感人。

回去之后跑去宾馆,洗澡的时候累的站不稳了,差点晕倒,感觉我的体质也是药丸。

day2

早上4点就醒了,床上翻滚了一个小时后去上个厕所就彻底睡不着了,

恩,直接让我们进了,没有排队,可能因为去的比较早的缘故并没有感觉挤。

翻开题目,没有提答,但是两题都有部分分,感觉不对劲。发现t1似乎K=2的时候把高度作为第二个键值建哈夫曼树做就行了。敲了以后发现对于其他情况似乎只要根节点儿子满了之后也是正确的,一直在想存在不存在一种调整方案,但是并没有想到。

t2似乎没有部分分,应该是作为送分题出的吧,想了想感觉把串反过来变成后缀,之后利用后缀自动机每个节点的性质做是裸题?其实后缀自动机我仅仅停留在看懂证明的状态,其他性质全是背下来的TAT,但是发现这些性质正好够用。后缀自动机的每个节点表示一类最后一个位置集合相同,suflink还构成了一棵树,得到这个集合大小后,可以直接搞出计数。对于最大值可以维护最大,次大一类的不断上传就行,大概是个树形DP。不过似乎用全是a的数据就会卡爆栈,改成非递归的才放心。

最后一题,感觉前两问可以dp做,最后一个似乎是网络流模型。但是我比较傻逼前两问并没有敲出来…而且那个网络流我似乎也不知道怎么写,感觉并不可惜。

萌帝230,我60+100+12(卧槽还对了一些点),感觉au要悬。

讲题时出题人怒婊全场,表示昨天出t2被骂很不爽。我当时觉得考跪,就没有心情上去正面刚。t1似乎直接补0就可以解决不满的问题了,t3那个网络流是有下界最小流。

最后知道分数线整个人都跳起来了,竟然这也能au。之后梦迪去了pku,我去thu了。

鬼畜运动会、闭幕式

运动会的时候大家表示都不太想来,最后我、萌帝、ztx、nh组了一队,玩的比较欢脱。那个毛毛虫竞技我们配合不好,之后我和萌帝就轧马步跑了过去,感觉规则并没有说必须要跳。反正最后很开心就对了。

闭幕式的时候wh说道这次比赛考查了并查集…的时候,大家一阵鼓掌,感觉NOI要变成noip普及组+数据结构专场。

吐槽一下,那个牌子的做工并没有去年深外的做工好。

不管怎样,高中生活就在最后一次NOI中结束了,感觉自己突然获得了一年自由的时间并没有什么想象的那么激动。我还没想好要怎么规划好这一年,毕竟真的玩一年不是特别好的样子。