Shell's Home

Nov 6, 2017 - 1 minute read - Comments

Boracay潜水攻略

大致情况介绍 Boracay,菲律宾长滩岛。关于菲律宾的基础信息不介绍了,这篇里面都有。我们就说一点当地的东西吧。 我们主要在西边活动,东边没怎么去,据说不太平。Boracay西边有个贼长无比的海滩,一条繁华的海滩商业街就沿着那里展开。初此外还有一条主路。基本你就沿着这两条路走,一定能找到你要去的地方。海滩商业街上有很多店,基本都是餐饮,按摩,小商品,潜水,辫子,纹身。我们所说的大部分店,都在海滩边上。如果不在,我会特别指出。 潜店 Boracay的潜店一大堆,我随便走走都能看到10多家。但是在padi上注册过的并不多。我这里看到的idc有Calypso Diving School International和Sea World Dive Center。从padi上看,watercolors也是idc。但是他的注册位置和实际位置不大一样。其他的都不是idc,或者没有在padi上注册过。 Sea World我路过去看过。当时打着中文广告,我还以为是中国人开的,结果是韩国人开的。广告很NB,岛上唯一一家五星IDC。岛上究竟几家上面我都列出来了。不过不说别的,他们的位置和店面都很不错。而且店员会中文,这点对很多人很有用。 Boracay的价格基本都稳定下来了,FD标价都在1800PHP左右,偶尔能见到1900,比较贵。我选的一家是朋友推荐的,老板是韩国人(很帅的欧巴哦)。标价都是1800,去了才发现地方略偏,但是有好处的。除了两潜外,潜导都是1对1服务。不过最后一天我才发现,两个潜导一个SSI一个CMAS。幸好我有一支和老板一起下水了,所以让老板给我签个PADI的,好规避review问题。 最后说一点,DSD。岛上的DSD才是最大的潜种,而不像有些地方,基本都是FD。这很好理解,Boracay是一个休闲旅游岛,而不是一个专门潜水的岛。在我选的这家店里,有次我看到十多个人在那里做DSD培训(店里有人会中文),出去的时候还要加十个左右的instructor(有负责照相的)。30个人浩浩荡荡两条船跑出去。 做DSD的(虽然我估计DSD不大可能来我的blog,会来的不是程序员就是老潜水员)请千万注意几个问题。DSD最主要的安全问题是什么?潜导不足潜导违规。只要配够instructor按规定操作,DSD几乎没有风险。说几乎是因为,就算平地走路都可能被雷劈死,跳到海里去潜水不会更加安全的。因此体验潜水一个强制要求是,instructor和潜水员比例不得超过1:2。 这两天闲聊的时候,我听到的范围里,所有潜店都坚持了这个比例配置。但是如果坚持这个比例,你就可以算出来,做DSD好像还没有FD赚啊(1:1的这种FD不谈)。所以很多DSD有一定的玩花样的成分。例如水下配个AOW下去给你照相,回头卖你相片。还有气不给打足,20多分钟就可以上来了。当然,万幸的是,好歹大家节操还比较足,不会出现耳压培训不做就踢下水,然后等你受不了升水的情况(三亚名产)。 潜点 Boracay通常流都不大,因为大部分情况下洋流都是东西向的,而岛是南北向的。因此在西面大部分时候都没有流,或者小流。在岛的最南和最北有大洋流,所以去的人很少。西面大部分时候都是南向北或者北向南的一节流。人类活动较多,水下能见度一般。 照片在这里。 Camia Wreck 11° 57.115’ N, 121° 54.523’ E Max: 28.4, Avg: 19.5, Vis: 10+, Current: 1 海滩正对面的一个沉船,没啥好多说的。有几条非常大的鱼,品种搞不清楚。中间船舱有个地方能沉下去,然后穿过大约3-5米的封闭船舱(警告:这是潜水违规操作),右转上升出舱。中间距离非常大,对脚法没有要求。这个点有种非常大的鱼,谁知道是什么? Angol Point 11° 56.828’ N, 121° 55.2’ E Max: 14.3, Avg: 7.9, Vis: 10+, Current: 0 海滩对面的浅点,非常容易。基本就在里面玩了一阵而已,没啥难度。照到了三个海兔排排坐。另外,下去之前我的reg的O-ring爆裂了。 Friday Rock 11° 58.083’ N, 121° 54.263’ E Max: 17.4, Avg: 12.8, Vis: 10+, Current: 0

Nov 1, 2017 - 1 minute read - Comments

golang安装和编译环境搭建

我本来以为是个挺简单的问题,结果实践一下发现还是挺多人不明白的。所以我写一下。 安装 挺简单的。你在golang.org下载一个合适的安装包,回来之后找个地方解开——例如~/usr/share/go这个目录。 而后你需要调整两个变量,GOROOT和PATH。PATH是必须调整的,GOROOT原则上可以不管。当你使用了正确的go程序后,GOROOT会自动设定。但是我习惯先设定GOROOT,然后计算出PATH。像下面这样(注意环境变量里要用绝对路径,不要用~)。 export GOROOT=/home/user/usr/share/go export PATH=$GOROOT/bin:$PATH 一般我会将这个设定设在bashrc里,变成我私有的设定。这样不会对系统产生干扰。在经过这个设定后,你需要让所有bash载入这个设定。最快的是重启,不喜欢动静太大的可以source ~/.bashrc。载入完成后,你可以试试go version,看看是否生效,版本是否正确。 配置环境 golang的编译环境配置只需要配置一个变量,GOPATH。例如我将GOPATH设定到~/usr/,在bashrc中加入export GOPATH=/home/user/usr,那么源码路径就是~/usr/src。将来下载的所有包,都会根据这个位置自动计算路径。例如http2的包,名字叫做golang.org/x/net/http2,下载时的路径就会是~/usr/src/golang.org/x/net/http2。你可以用go get golang.org/x/net/http2来自动下载这个包。 如果你自己开了一个项目,那么你需要搞一个url,例如github。然后把你的项目放到对应路径——例如~/usr/src/github.com/username/project。然后在这个路径下做所有操作。最后你可以使用go build package编译它,非常容易。 install golang除了源码之外,还有很多的编译结果。例如go项目自己的源码在~/usr/share/go/src/下面,可执行文件在~/usr/share/go/bin/下面。而你和你下载的各种项目的编译结果就在~/usr/bin/下面——是不是觉得和linux的文件管理方式非常像? 所以上面的bashrc配置还需要做一点调整,以便让你除了能用go做编译外,还能直接使用go编译出来的项目。 export GOROOT=/home/user/usr/share/go/ export GOPATH=/home/user/usr/ export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

Oct 10, 2017 - 2 minute read - Comments

法国游记

废话不多说了,讲点实在的吧。首先上照片。 常识 法国使用法语,通行欧元。对他们来说,英语是一种外语,学习难度和我们学日语差不多。旅游业有关的人,英语水平还是不错的。但是其他地方很可能碰到不会英语的人,尤其是列车上查票的小姐姐。大部分地区都能用信用卡,只有少数地方不行,例如地方集市上的小贩(因为他正职可能是个普通社员)。信用卡里Visa比较好用,Master就到处被歧视,至于JCB就不提了。目前EUR和CNY比例1:8左右,国内到处都能换,所以不要紧张。但是要注意,某些卡在非美元区会有额外手续费(例如招行的),法国当然不是美元区。手机供应商有好几家,我们用了一家德国的公司,漫游过来。根据某个法律,他们漫游是不收费的。(中国的运营商你们看看)电源插头是欧标,记得提前买。 衣 我们是10月去的,当时法国并不冷,和上海差不多。单长裤,上装长袖短袖都行。特别冷的地方需要加一件外套,不要太厚。当时猫说法国很冷,我就带上了贝加尔湖那套。从头到尾没用上,还在南法被热了个半死。 食 法国吃的很贵,因此要吃饱吃好是有点技巧的。 一般的法式餐饮,早餐是各种甜品和茶,午餐和晚餐是正餐,两道式或三道式的。两道是前菜加主菜,或者主菜加甜点,三道就是一起上。比比中国就弱爆了,随便上个餐馆都是两菜一汤呢。 价格各地不一样,三道式10-20欧不等。一般来说,巴黎比其他地方贵,景区比外面贵,好吃的店比不好吃的贵,米其林比上述都贵。如果时间不方便,或者没钱,法国街头并没有什么其他选择(是的,悲剧),不过还是有一些不得已的选项的。下面我们分三个方面细说。 超市 首先,我假定你比较穷。那么,超市将是你的大食堂。 我不是让你去买超市里做好的三明治,或者色拉。那个一份2-4EUR,根本吃不饱。再来一份就会变成6EUR,合CNY48。怎么想都太过分了吧。 你可以在超市里找香肠。能够直接吃的,2欧以下的香肠。我在法国各地的monoprix里,都找的到法兰克福肠,1.5EUR 6根,配上一条面包,能顶一顿饭。这不过是3EUR不到,可谓食肉动物最佳选择。有钱的还可以换2EUR 10根的更大包装。我还找到一种烟熏马鲛鱼,2EUR 200g,味道比较咸,配上面包更好。一般两人一顿饭就是一大条面包,加一包肠,加马鲛鱼,总计5EUR左右。算下来20CNY一人,可谓便宜到了头。 当然,我看不懂法国那堆复杂的香肠,法兰克福肠是经常吃的,比较保险。如果你比较有挑战精神,可以试试其他种类,有没有物美价廉的。我还看到加了大蒜的肠,类似哈尔滨肠那种。不过比较贵,4EUR。 超市里值得买的还有水。法国这里原则上是可以直接饮用自来水的。但是我们并不习惯,所以还是出来买水。一般超市放在外面的,都是500ml 2EUR的高价水。你往里找找,有一些饮料,柠檬或者橙子一类的。其中有很多味道比较淡,而价格又比较亲民。1EUR 1L左右。晚上买个两瓶,喝一晚,带一瓶,应该够用。不够就再找一次超市,应该不难。饮料分为有气的和没气的,要带的话建议没气比较好。 法国超市要注意两个问题,一个是周日多数不开。法国周日是家庭日,所以很多地方不开门。景点是否开放也要预先查一下。另一个就是,由于周日不开,因此周五六,周一晚上。尤其是周六晚上,人会非常多。要提前屯货,同时避开高峰。 小吃 法国街头基本没什么小吃,除了满地的kebab。我吃到的版本是一个大饼烤一下,里面塞上切下来的土耳其烤肉,再加点洋葱什么的。一般这么一个2EUR(南法物价)。加上一小盒薯条和一罐饮料3EUR(还是3EUR和4EUR?我记不清了)。反正不贵的情况下,也能把一顿饭对付过去。不过烤肉又油又咸,我家猫不很喜欢吃。 另一种则是可丽饼,也就是法国版本的山东杂粮煎饼,里面可以放甜的或咸的。随着放的东西不一样价格也不大一样,原味的1EUR,放点果酱就要2.5EUR的样子。据说法国人早上只吃甜的,而日间只吃咸的。这两种可丽饼叫法还不大一样的样子。不过可丽饼一般一个吃不饱,我们俩要吃三个。加各种酱料的话,搞不好一顿要超过8EUR,还是有点小贵的。 另外我们在小镇(Annecy)上买到过烤鸡腿,3EUR,味道很不错。在石头城本地集市上买到过烤肠,2.5EUR,西红柿汉堡,2.5EUR,鸡大腿肉,3.5EUR。不算便宜,但是风味很好,也算是物美价尚可的选择。不过Annecy的那个店中午关门了(?!!)。是的,吃饭时间呢,关门了。集市每周就开一早上。这些都是隐藏道具,碰到就碰到了,没碰到,就这样了。指望不住。 餐馆 在进餐馆之前,请确认一下您的钱包。没有一人20EUR的打算是不要坐进去的。大多数餐馆的两道或三道式也不算很多,吃菜是吃不饱的。虽说一般餐馆都会无限(我还没测试出限量多大,难道真要吃八个?)供应面包,但如果您进餐馆就为了吃面包吃个粗饱,为什么不直接选用超市呢? 我在法国吃过很多不同的东西。最贵的是米其林一星,两个人吃了70EUR(没留神,矿泉水被坑了10EUR)。照片在这里。 贵归贵,菜非常赞,服务也很好,餐馆和餐具都很漂亮,感觉非常超值。老婆点了一道法国蜗牛。我的主菜是一道蔬菜烧三文鱼什么的,不知道怎么搞的,三文鱼刚刚好熟透,却又非常嫩。做过的人应该都知道难度。强烈建议去吃一趟。不要点水,两个人60EUR就行了。500CNY级别的米其林一星啊。餐馆的名字是这家Benoit Paris 然后是法国附近的黑暗料理——fondue。我总共吃了两回。第一回想吃的是奶酪锅,但是点成了肉锅。把牛肉,鸡肉,鸭肉放在油里面炸。20EUR。实话说不是特别喜欢吃。第二回就更糟了,确实是奶酪锅,15EUR,用各种食材沾奶酪吃。但是食材本身都太咸,搞的我满口都是咸腥味。而且奶酪的味道比较重,吃不惯。建议大家先在本地试试改良版fondue。如果改良版都不是很有爱,还是不要去原版那里冒险了。 比较特殊的餐馆是这家Mirama。中文是美丽华酒家。这是一家中国菜。我家猫中国胃嘛,结果我们就去吃了两次,其实味道放在中国一般。正宗的广式厨房,没有改良的粤菜。牛腩面上面真是一大堆牛肉,对得起9.6EUR的价格。烤鸭(其实应该是烧鸭,这个和北京烤鸭不是一回事)也不错。放在中国大概是一家还算可以的街边小餐馆。当然,在法国也是,只是价格从60CNY变成了40EUR。 实话说,我一直觉得中国的吃的挺好的,便宜好吃。虽然顶级的料理,玩装逼和意境的那些还不如国际同行,但是各种日常餐饮实实在在能吊打大部分地区。你在欧洲能吃四菜一汤盘盘见肉么?你能天天吃四菜一汤顿顿不重翻一个月花样么?你能靠上班工资天天吃四菜一汤还有人管送么?上海一般小店里面,也就是150-200两个人,一天也就是300-350,老顾客还有折扣,一个人150上下,吃到翻过来。靠工资不是吃不起。法国,我按南法物价算好了,15EUR一顿,算上甜品还不到四道菜,普通人也勉强吃的起。可盘盘见肉吃到翻过来我就见了鬼了。我在法国感受最深的不是好吃,而是吃不饱。像日本菜似的,嘴一张一合,吃的没了,好像还缺点啥。严格说起来,应该不是东西不好吃,而是工资不够高,简称穷。 至于翻一个月花样就更呵呵了。你看看他们菜单上几个菜。按四道执行,差不多一天一家餐馆就没花样了,周围30家餐馆,还得不重样,鬼知道要跑多远。至于送,更是没得说。Thomas老婆没事就在和我感慨,你们厂赶紧来法国营业吧,我太怀念打个电话就有东西吃的日子了。我说可以啊,按照法国物价,你这地方10EUR肯送的都是铁哥们——成本都不够。上下山都得开汽车,小摩托不知道要开到猴年马月。而且汽车一趟来回一小时,一天最多送8趟。偏偏法国低保给力,不干活都有900EUR,一天开40EUR都不知道有没有人给你干,而且绝对工作不到8小时。一单10EUR是不是成本价?这地方要真执行,一单起码30EUR以上,运费比餐费还贵。她说50EUR肯来就不错了。他们水工,上门费200EUR,啥都不干。我说上海修电脑,上门费就100,还是人民的币。 住 法国酒店比上海贵的多,我们在Fontaine Saint-Michel旁边,订了一个超级小的酒店,800多一天。上海随便一个地方找个三星,要求不高的,也就400撑死了吧。 注意,法国还有个选择,Airbnb。Airbnb并没有便宜很多,但是对于自定行程来说,会方便一些。因为法国的酒店里一般不提供热水壶。是的,你没看错,我也没写错。Thomas家不算,我住了四个酒店。只有一个酒店提供了热水壶。但于此同时还提供了洗衣机洗碗机和厨房,所以这应该算Airbnb的待遇。如果你订Airbnb,可以使用很多设备,例如厨房和洗衣机。有厨房你就能用外面买的材料简单做一顿,这对中国胃来说太重要了。至于洗衣机,我就不说了。 行 法国的铁路很发达,巴黎地铁四通八达,居然地铁票能在Gare de Lyon换车去Fontainebleau这么个鬼地方。这就像上海地铁能把你从滴水湖送到昆山是一个概念。不过相对的,车票也很贵。一张票2EUR不到。你可以在售票机上直接买10张ticket+,15EUR。便宜一些。有朋友吐槽,为什么售票机上有8张和9张的选项呢?钱更贵票更少。我只能说,这是一个feature。 法国地铁支线众多,上车前一定要看明白这辆车是去哪的。例如同样是RER,分为RER A/B/C/D,这是不同线路。同一个RER A,还有分叉。最简单的办法是找站台上的一个大板,然后看你要去的站前面的那个灯有没有亮。亮了就可以放心上,没有就要再等等。 巴黎和里昂都有日票,里昂的日票是5EUR有效24小时。巴黎是按照zone算的,我们5zone的要13EUR(具体数字不是很确定,反正十几)。算起来也很贵。但是到Fontainebleau单程也没便宜几块。合理使用日票和通票能够有效减少你的车票费用。上海地铁也有类似的日票,单日18,只是很少有人知道。这里多扯一句日票的设计,一般都是遵循4次左右平衡。里昂是3次,上海是4.5次。如果你乘地铁次数会远高于这个值,可以考虑使用日票。而频繁乘坐地铁的,一般都是短距离场景。 法国的火车也很不错,火车分为TGV(高铁)和普通列车。TGV速度250公里/小时,和中国高铁是一个级别的东西,分分钟吊打印度“高铁”。但是法国地方比中国小,所以从南法回巴黎,穿越半个国家,只用了三个小时,还带换车。坐火车要注意电子票和纸质票。法铁上车时不剪票,上车后查票。票分为固定时间和可变时间的,车次分为固定座位和随便坐的。如果你是固定时间的,那么啥都不用做。电子票一般都是固定时间的。但如果是可变时间的,需要在进站前,在黄色的机器那里打一下卡。靠左插进去,咔咔一声,就能看到时间,这相当于剪票了。如果不打印时间的话,你这张票今天能坐,明天又坐一遍。如果查票的小姐姐发现这种情况,理论上会罚款20欧。我们就碰到了。不过运气很好,两个小姐姐认为我们是外国人第一次来,不知道规矩。所以直接用笔给我们写了时间,相当于补剪一下,没罚款。所以后来我们就所有票都咔咔一下。结果用巴黎通票去Fontainebleau的时候又出了问题。那个是小型票,肯定没法打。查票的小姐姐说,你们这张票没写时间哎。然后又用笔给我们补了时间。 感觉法国的车票管理比上海的难搞懂的多,也许是不大习惯。 巴黎 我们刚到法国,在机场买了博物馆通票。40EUR多点吧,4天,一大堆美术馆博物馆,非常合算。注意到手之后在上面写一下时间。然后坐RER地铁到我们住的地方。七绕八绕,从巴黎圣母院门口冒了出来。当时还不认得巴黎圣母院,也不知道自己在哪里。跟着导航走到了地方。最后一天转回去的时候发现,我们初次上来的地方就在法国测地原点旁边。 巴黎我们刷了这么几个地方: Fontaine Saint-Michel 圣米歇尔喷泉 Musée du Louvre 卢浮宫 Cathédrale Notre-Dame de Paris 巴黎圣母院 Sainte Chapelle 巴黎圣礼拜教堂 Conciergerie 巴黎古监狱 Le Centre Pompidou 蓬皮杜中心 Église Saint-Merri Saint Merri Church Tour Eiffel 埃菲尔铁塔 Château de Versailles 凡尔赛宫 Panthéon 先贤祠 Musée d’Orsay 奥赛博物馆 Musée de l’Orangerie 橘园美术馆 Arc de Triomphe 凯旋门 Square Louise Michel 路易丝米歇尔广场 Sacré-Cœur 圣心堂 Le mur des je t’aime 爱墙 Moulin Rouge 红磨坊 Château de Fontainebleau 枫丹白露宫 在Conciergerie,我还被老婆带错了路,跑到了旁边的原顶建筑。人家问我们来干嘛,我们说观光。人家很奇怪的说,这是法院啊(Greffe du Tribunal de commerce de Paris 巴黎商业法院登记处)。好么,生平头一次给老婆送进法院。从法院出来,又进了监狱——Conciergerie。

Aug 28, 2017 - 2 minute read - Comments

使用Debian作为Router

设备是一台D525的多头主机,2G内存,4G电子盘,有4个网口,两个USB口,一个Serial口(很特殊吧),还有一个VGA口。原本预装是RouterOS的。最近给RouterOS整烦了,所以把路由器洗了换成Debian了。由于不想干掉原本的电子盘,所以新买了一块msata的电子盘。JD上大概80,自己买就行。 目标 我希望整个路由能够为家里的网络系统提供良好的基础。因此,我确立了一系列目标: 全家能够上网,并充分利用带宽。 能够映射外网地址到内网,提供一定的服务(例如通过https管理内部,或者做bt)。 能够分离两个区域,一个可信区域,一个只能上外网(guest网络环境)。 能够为家里的所有用户,包括guest,提供有限目标翻墙,例如只翻google。该机制不会使访问国内网络受影响,例如变慢。可以限制部分IP不翻,例如bt。 下面是一些可选目标。 能够直接通过机器名解析出DHCP地址。这样就无需为每个需要被访问的机器总是分配固定IP。 对guest网络提供配额限制。 对总体能做一定的QoS。 基础设施层面的防投毒/欺骗/攻击。 支持IPv6,家里每个设备至少一个IPv6地址,且外网可访问。 架构 首先是分离设计。用两个网口分别提供两个网段,作为可信区域和guest网络用。然后提供一个VPN,允许guest区域进入可信区域。对于可管理交换机而言,其实也可以用vlan技术。一个网口打到交换机上,然后在交换机上设定哪些是guest口。我这里没有可管理交换机,而桌面交换机有多。所以直接出两个口就好。核心路由是四口的,一个外网,两个内网,还有富裕。 以下是主要目标的工程清单: 多头主机,上防火墙,建立Serial和ssh双管理机制。 内网dnsmasq,外网NAT。最后测速。 DDNS,外网port mapping。 安装openvpn做vpn-in。 做vpn out,调整路由表。 多网段,内部互通限制。 安装 Debian的安装没什么好多说的,我直接用VGA安装的。stretch,目前stable版,没什么特殊的。等进入系统了,直接改grub配置,改成serial能够控制。这样将来路由器出问题的时候只要用Console线接上,就能登录系统排查问题了。具体方法搜一下就行,我是用这个页面,按照里面改了以下三个参数。 GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 quiet" GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1" 然后再用putty访问就行,指令是putty -serial -sercfg 115200,8,n,1,N。注意速率要和设定一致。 安装过程中我注意到有一点坑。在上海电信这种环境,Router要上网需要PPPoE拨号。我找到了Debian官方的说明页面,里面提到了三个包,ppp,pppoe,pppoeconf。但是默认光盘里没有。说是有的,甚至还有篇文档叫做通过 PPP over Ethernet (PPPPoE) 来安装 Debian GNU/Linux。但是我按照Guide,修改了光盘的boot line,自动搜索DSL拨号配置的时候,直接失败了。幸好我早做了准备,把这几个包提前下载下来了,然后手工安装。但是比较坑的是,实现pppoe还需要一个额外的包,libpcap0.8。这个包wiki里没说,所以我就没下。但是想下的时候,原有Router又洗掉了。最后我是用手机下载传上去的,同样情况的朋友请自行注意。 初始化 进入系统后没啥复杂的,先设定PPPoE拨号,照着官方的说明页面就行。拨号成功后,首先先更新软件并重启。因为原本的系统和最新补丁会有一点时间的差异,而安装时我们没有网,所以没有安装更新补丁。 补丁升级完成并重启后,先下载iptables-persistent这个包。这个包会把你的防火墙配置固化下来并自动加载。没有这个,防火墙功能运作是缺失的。如果在无持久化的情况下安装了服务,你又需要重启路由器,就要先断开外网才能安全重启了。否则防火墙规则是空的,服务外网可访问。而且进系统后又得重新配置防火墙。所以比较简单的方法就是先装持久化包。至于防火墙,我的初始化配置是这样的。 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -i ppp0 -j DROP -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 第一条允许已经建立好的连接访问,第二条允许ping,第三条不限制本地访问,第四条禁止外网访问,第五条打开OpenSSH端口,最后别忘了INPUT默认DROP。因此第二个包就是安装OpenSSH。安装完了这个包,再配置本地网口。接下去就可以把路由器复位,通过远程来控制,而不是serial了。

Jul 24, 2017 - 1 minute read - Comments

riot.im简介

riot是一个开源的去中心化聊天工具,提供了一个聊天的底线解决方案。 分布式 和大部分IM工具不同,riot的用户,是属于某个特定的服务器的。我们可以对比一下Email和QQ。Email里,你可以选用不同邮箱,不同邮箱之间是可以互相发送消息的。而QQ里,你的帐号必然只能在腾讯的体系里。前者,我们认为是一个分布的系统。用户分布在多个组织里,依靠协议互相通讯。后者,我们认为是集中的,供应商掌控一切。也许你会反驳说,QQ也分布在全国多个节点。这是对的,但是这是腾讯自己的分布,而不是用户的分布。用户对这事是没有感知的,也无权选择。 riot是一个用户分布式的IM系统。你需要找一个服务商,然后向他注册。就像你找一个邮箱供应商并注册一样。随后你会获得一个用户名和密码。配置用户名和密码,你就可以在各种地方登录。Windows,Mac,Linux,Android,iOS,web,我至少知道这几种客户端。登录之后,你可以找任何人聊天,哪怕他和你不在一个服务器。服务商会连接对方的服务器,并完成通话准备。如果你懒得找,riot.im官方也提供注册。你可以把他视为最大的供应商。 和印象相反,用户分布式的系统,听上去很高大上,其实是比集中式难用的。因为分布式系统依靠的是协议,而协议是很难更新的。只有大多数人跟进,一个特性才有用。就像反垃圾邮件,已经好几年了,推进仍然有限。而集中式体系则不然。只要供应商想,他们就可以不停升级协议。你现在还能用12年版的QQ协议么?不行了对吧。这样就使得一个新特性可以在很短时间内铺开。 那么分布式的好处在哪里? 分布式的用户体系,提供了一种可能性。即使在一个供应商出现种种问题的情况下,整个通讯系统依然不崩溃。你甚至可以换一家供应商,然后重新联系你原来的好友——只要你有好友的通讯录备份。这使得保持协议的同时更换供应商成为了可能——一种永远不可能在腾讯体系内实现的可能。 也许你会觉得,供应商会出什么问题?嘛,我们依然以腾讯为例。在中国,腾讯占有了很大的IM和游戏市场份额。作为腾讯的对手,你要警惕的不仅是企鹅帝国的挤压,还有,你要用什么IM作为办公工具。如果您依然认为QQ是个好选择,我只能祝愿您好运。当然,也许您会觉得,我们可以用钉钉。嘛,我也祝愿您好运。这是一个信仰问题,您开心就好。 riot的特性在此时就非常有用。你可以搭建一个自己的聊天服务器,自行维护。自然,此时就没有坑爹的国际线路问题,也没有企鹅运营问题。甚至,如果上下游的公司也选用了支持riot协议的体系,你们还能直接互相聊天。当然,在中国微信和QQ包打天下的格局下,这种情况基本是不大可能了。 类似的场景还有,如果你觉得企鹅家会在聊天记录里搞事。担心聊天记录泄密。严重洁癖甚至都不相信telegram。那么riot的纯开源自维护体系应该能让你感到满意。但是一切的一切,最关键的一点在于。只有你对聊天的供应商有选择权,供应商才会真正“听”你的话。在一个无法离开的体系里,只会变成:用户你好,我是你爸爸。 当然,使用riot要注意他的几个缺点。首先,riot的各个客户端维护的比较差。难看,功能有限,而且不稳定,修复时间长。其次,riot和现有的主流用户完全隔离,这对销售来说非常致命。 安全特性 riot的聊天是非加密的,对此你不应该感到意外。riot的安全是额外提供的,你必须手动打开。riot的加密系统非常有趣,不是基于用户的,而是基于设备。这种加密被称为E2E加密,意思是端到端。 手机在选项里拉到底,可以看到把对话转换为加密对话的选项。需要注意的是,打开E2E加密后,这个对话是不能转回去的。你可以开个新对话,把所有人都加进去。但是这个已经存在的对话本身是不能转换回去的。另外就是,由于E2E加密需要端点支持,所有web原则上是很难做出E2E的。因此web版本上这个功能基本是废的。 当你用一个新的终端登录,例如一台新手机连入的时候。所有人会看到你这个新终端,并选择是否信任你。如果他们信任你,那么你可以看到他们说的话,这个都能理解。如果他们不认可你呢?默认情况下也能看到。这是因为系统里有个选项,默认发消息给所有未信任终端。关闭之后,那些你不认可的人就看不到你讲的话了。当然,在进去的同时,你也会看到里面所有的端,并选择是否信任。 当你更换了一个客户端,例如换了一台手机。默认情况下,视同一个新手机登录,所有人都要重新信任,而且所有之前讲的话都会无法浏览。注意,哪怕在同一个手机上,当登出再登录时,也视同一个新客户端。所有人都要重新信任,之前所有会话无法浏览。如果要避免这个问题,你需要在登出前先导出自己的E2E密钥,登录后导入。 这里就要说一下用法问题了。首先,请关闭“发送消息给所有未信任终端”的选项。新用户无法查看之前的消息,但是能查看新的?这个简直了。其次,一开启E2E,就要导出密钥并妥善备份。否则每次都要重新认证终端,对其他人很不友好,而且不安全。第三,不要随便认证终端,一定要确保对方是本人。你可以问一些只有你们知道的问题,或者干脆看着他互相认证也行。 E2E加密的基本原理是,每个端携带一个密钥,进入聊天时把自己公钥发送出去。如果说话的人信任你这个终端,那么他就会认可你的公钥。客户端就会使用你的公钥加密发出去的信息,你在接受到之后就可以用自己的私钥解密。如果他不用你的公钥加密发出去的消息,那么你就看不到,或者说看不懂。 透过这个机制,我们可以理解上面如此设定的机理。当初次进入聊天时,虽然你可以从服务器端同步所有历史消息。然而由于这些消息都没有用你的key加密过,所以你看不懂。当对方开始用你的key加密消息了,你就可以看懂消息了。当登出时,未保存的E2E key会被丢弃。 E2E对抗的风险,就是服务器不可靠,例如被攻陷。或者用户不可靠,例如密码泄露。即便在服务器被攻陷,或者某个用户密码的情况下。E2E机制依然能让攻击者无法看到加密的消息(注意,这里前提就是你关闭了“发送消息给所有未信任终端”)。因为加解密都在客户端做,所有服务器端看到的消息本身就是一团乱码。攻击者拿到密码后,伪装客户终端进来。然而这个终端由于没有信任,因此既看不到历史记录,也看不到新消息。能够对付E2E机制的,只有导出的密钥备份丢失而且被破解,或者直接拿到终端。或者更干脆,聊天中某个人变节,把记录全部发了出去。

Jun 7, 2017 - 2 minute read - Comments

Puerro Galera游记

基本情况介绍 菲律宾通行货币是peso,缩写PHP(最好的语言,哈?)。去之前别忘了换一点PHP,带一些USD。PG那里我没找到ATM,上去都是换钱的。带着PHP回来只能再去菲律宾,带USD哪都能去。如果怕不安全的话,提前联系好中文潜店,商量好微信或者支付宝转账,再让他们帮你把房一起订了。这样你去的时候只用带上不多的钱就好。安全是一方面,同时也很方便。 交通 PG在马尼拉南边,从manila机场出来,不用过市区,直接往Batangas码头走,过海就到。坐大巴换公船的话,大概5个小时多点。 我这次来去都是找人拼的车船。去的时候16个人左右,100元包车船。回的时候5个人,价钱就到了200。但是反正我不觉得这是重点。毕竟你花了大几千的机票钱,飞到菲律宾,就想省个50,100的交通费?自己拼车船几个好处。一个是不用和人挤,车也好一点。另一个是车船中间的空档,如果是公船就必须留足时间以防没赶上。自己包的话到了就跑,省事的多了。 包车船的时候记得一点,先和老大讲好包不包高速费用,还有高架(sky way)。有的时候司机会问你要不要走高速,走的话费用自己掏。这样车船价格就贵了。你先讲明白了就OK了。 另外就是机场的住宿。T3有一个胶囊酒店,1000P一晚7个小时,就在麦当劳往里走一点的位置。如果你需要过夜,提前订好,带上自己的耳塞,住一晚,非常方便。这里推荐一个网站,http://www.sleepinginairports.net/,上面有非常多的机场住宿攻略。 方位 下船的地方叫Sabang。PG,即Puerro Galera,还在20分钟车程山路之外。我去PG看过,没Sabang繁华。所以你可以忘掉PG,只要考虑Sabang就好。如果有人给你推荐一个住宿在PG,不要犹豫,扇他就好。 Sabang坐南朝北,和Batangas的大灯塔隔海相望。西边是Big Lalaguna。去那鬼地方有三个方法: 码头上坐小船,200P就肯走了。有的时候会和你讲价,250P也死活磨半天什么的。一船能坐3-4个,我们这次坐了6个,还有我。感觉像个沙丁鱼罐头。 坐摩托车过去,50P。你给个100P能把你连人带行李搬过去。我就是这么搞的搬房间。注意,摩托不停沙滩,停在镇子的门口。你得穿过镇子里迷宫一样的道路才能到沙滩。反正经过几次之后,我觉得自己像一只白老鼠。 用脚。开始来的时候不知道,硬从沙滩上走过去的,15-20分钟,看脚程。 Sabang镇有个好处,吃的东西多,娱乐多。如果你打算天天往水里扎,起来就在房间里窝着,那就当我没说。不过如果你晚上还是想找个地方happy一下的,最好不要住Big Lalaguna。来去都有费用是一方面,另一方面是真心麻烦。 餐饮娱乐 说Sabang娱乐多,其实还是挺乏善可陈的。餐饮我点名这几家: 海明威,码头沿着沙滩往西去,过了Angelyn’s。建议别去。虽然并不难吃,但是性价比太低了。看攻略说还不错,去了发现有变化。 Tarmarine,就在Angelyn’s旁边。烧烤真心好吃,但是上菜一小时。而且服务员上来就告诉你,一小时。 TEQ’s,码头往山里方向(古堡那边)走,路左手有个牌子的。东西味道很不错,也不贵。但是第一次去,上菜一小时,还不提前说。第二次去,牛骨汤就给了一半。后面就再也不去了。 Sabang Fastfood。码头往山里方向(古堡那边)走,路右手。他们家的mongo shake真心顺滑,铁板亲子没有dong也不错(什么鬼?就是铁板鸡肉加鸡蛋啦)。 Capt’n Greggs。码头沿着沙滩,马上就能看到。他家牛排量超大,770P厚厚一大块。我们四个人吃两块吃的超级饱。Gin调的鸡尾酒也不错,超级大一壶,四个人根本喝不完(好吧,我不能喝)。 按摩。你随便找一家就得,400-500P。手法各自不同,略有差别。这个不贵,你开心就好。但是特别注意,深潜后原则上禁止按摩,容易诱发DCS。自己决定,别说我没提醒过。 更多介绍可以看这篇,上面的地图也不错。不过注意,我去的时候是17年5月,以我的经验来看,一两年后情况就完全不是一回事了。 潜店 好了,前面说了那么一堆,现在说最关键的问题,潜店。我所知道的有这么几家: scandi,在Big Lalaguna。我开始就潜的这家。看攻略以为是一家很严谨的潜店,结果依然八个粽子放风筝,还有AOW应届生一起。这样根本对不起我27刀的FD费用啊,于是果断转店。15支批发价,25刀。装备一天14刀。 divingpark。就在scandi隔壁,看公开报价是28刀,也不便宜。这家中国人比较多,大概是中文教练多。scandi的中文教练好像就一个北京的姐们。 asiadivers。貌似是岛上最高大上的潜店。我没找到他的具体报价,但是印象基本就一个字,贵。 蓝鳍,在热浪的后面,美杜莎隔壁。我最后是在他们家潜的。价格还行,10支批量1000P一次,包装备。140多点,这个价格基本和停泊岛的差不多。老板是个上海人,做事精明不小气。我不知道10支的事,下了9支。他直接给了折扣价。 大家特别注意,潜店好不好,主要看装备是不是够新够好,还有潜导是几个对几个。不要特意省钱去8v1,这样很不安全,而且体验很差。如果有条件,尽量在4v1以内。如果你需要一定2v1或者4v1,最好先沟通,约定好(有可能还要加钱)。这次指望scandi能良心点给个4v1,结果。。。 8v1的最大问题是,buddy大多都是刚拼凑的,很少有默契和能力保持整齐的队形。结果就是潜导叮叮一指,一群人端着相机就围了上去,像是在开秘密会议。然后所有人就撞成一堆。潜导一游动,队形完全走样,路上就不停的撞车,被踢。你有事,潜导一回头,根本看不到你。如果你有熟悉的buddy,最好固定组队。照相的话,和大部队保持一点距离。你上去照相的时候,buddy帮你看着点潜导。这样大家都会玩的很开心。 住宿 说到最后,说说住宿。如果你住高大上的度假村,他们自己就有住宿。如果没有,也可以自己订。我这次住了两家,scandi和古堡。先说scandi。 scandi是一个典型的resort,他们的住宿和潜店是前后的,所以可以潜水完了回房间休息一下。但是等你洗洗弄弄结束,休息不了半小时,又得出去了。而且你中午吃饭也必须在scandi,没法跑去别处。娱乐选择相对就少一点。古堡呢,到哪都很方便,但是回来的时候衣服都是湿的。好坏就自己选择吧。 古堡特别说一点,不要住他们Deluxe的房,住Suite的。大小翻倍,而且Deluxe里面蚊子超级多,似乎还有跳蚤。费用嘛,也就是40刀变50刀而已。 大概来说,你可以参考这篇 潜点 PG附近的潜点,我完全没记住。反正名字都写在dive log里了,然而谁是谁还是分不清。我都是回来才查的潜点。水温一般都在29-30左右,可以水母衣直接下水。但是很多地方有盐温交错面。Verde Island下去的时候,一过交错面我直接就冻毙了,怀疑水温低到27度左右。在底下甚至能肉眼看到强烈的交错面乱流。 Ernie’s Point 13° 31.398’ N, 120° 58.982’ E Max: 25, Avg: 15, Vis: Good, Current: Low

May 16, 2017 - 1 minute read - Comments

/proc/net/dev中bonding网卡的流量计算

最近有需要,看了一下。我觉得还是讲一下,但是不讲太细了。以下代码是以4.4为基准的,不是的会特别指出。 /proc/net/dev的读取问题 procfs的代码在fs/proc/proc_net.c,但是基本没干点啥事。真正的核心代码在net/core/net-procfs.c:dev_seq_show,我这里是105行。这个函数会打印个头,然后调用上面的dev_seq_printf_stats。dev_seq_printf_stats则是取设备最新信息,并打印。 这里要注意的一点是,整个过程并没有锁,只是在fs/seq_file.c:seq_read上面上了一把锁。这把锁的目地更像是排斥两个进程同时读取同一个文件,而不是保证计数器正确。因此,实际上每个设备的性能计数都是单独读取的,而且读取时计数器还在持续递增。 结论是什么?对于/proc/net/dev里的多个设备,做bonding加和是不可靠的。你不能假定设备1和2做了bonding,那么设备1的计数加上2的计数精确等于bonding的计数——虽然实际上就是这么算的。 bonding的数据获取 我们再看dev_get_stats,这个函数里面实际上是用了ops->ndo_get_stats来获得设备的数据。对于bonding来说,这个文件在drivers/net/bonding/bond_main.c:bond_get_stats。从下面的实现中,你能看到,实际上bonding网卡的计数就是用各个设备的加和。然而计算没有那么直接,用的是每个设备的当前值减去原来保存值,差值加到bonding的保存值上。换个说法就是,bonding的margin等于各个设备的margin。 这个特性是由这个补丁引入的:make global bonding stats more reliable,时间是2014年9月29日,版本是3.17.0-rc6。主要是解决bonding中去掉一块网卡的时候,计数器会掉下来的问题。在这个之前,还有两个补丁。 Enable 64-bit net device statistics on 32-bit architectures的引入时间是2010年6月8日,版本是2.6.35-rc1。这个版本首次引入了64位计数器(因此,RH6里面默认配置的2.6.32内核应当是32位计数器),但是写出了bug。 fix 64 bit counters on 32 bit arches的引入时间是2010年7月8日,版本同样是2.6.35-rc1。主要是解决补丁1在32位系统上非锁定读写64位计数器造成数据跨越总线宽度,导致多个CPU竞争读写时高低位被分别写入产生不一致的问题。 由这两个补丁,我们可以简单总结出bonding的问题历史。 在2010年,2.6.35之前,内核计数器只有32位,分分钟会出问题。实话说我完全不敢相信,有当时用过/proc/net/dev的朋友来讲讲么? 2010年的时候,有短暂的bug,只影响2.6.35。这是一个开发内核,我们可以忽略。 2014年,3.17.0之前。去掉一块网卡的时候,bonding计数器会掉下来。 然而,其实问题并没有结束。如果你仔细看代码的话,会发现,bond_get_stats根本没加锁。如果两个context同时调用,有可能发生这么一个过程。 context1读取数据并计算,计算完成后,写入bond->bond_stats数据前被switch out。 context2开始运算,完成计算并写入bond->bond_stats。很明显,由于context2的启动时间比1晚,context2的数据结果比1大。 context1被switch in,写入bond->bond_stats。 在随后的时间里,计数器的增长比context2和context1的差值大。 满足上述条件的话,bonding计数器就有可能倒涨。当然,里面还有其他竟态情况,可能导致各种问题。由于这是3.17.0内核引入的,因此只会发生在这个版本之后。 当然,有朋友可能会说,/proc/net/dev里有锁啊。问题是,dev_get_stats可不是只有/proc/net/dev会用,rtnetlink也有可能哦。 这个问题是这个补丁修复的:fix bond_get_stats,时间是2016年3月18日,版本是4.5.0-rc7。在补丁的说明里,说到了这个问题。 因此,我们延伸一下故障列表: 在2010年,2.6.35之前,内核计数器只有32位,分分钟会出问题。实话说我完全不敢相信,有当时用过/proc/net/dev的朋友来讲讲么? 2010年的时候,有短暂的bug,只影响2.6.35。这是一个开发内核,我们可以忽略。 2014年,3.17.0之前。去掉一块网卡的时候,bonding计数器会掉下来。 2014-2016年,3.17.0到4.5.0之间。多个CPU同时读写时,会发生竞争出错。 2016年,4.5.0版本以上。未知。 另外注意。并不是说3.17.0之前没有竞争问题,而是由于没有写回状态,所以竞争问题并不产生明显影响。

Apr 23, 2017 - 1 minute read - Comments

SI的七个基础单位

大家上学的时候,也许听老师说过这么一句话。物理学里有七个基础单位,其他单位都是这七个基础单位推导的。我以前也没怀疑过,后来在看长度定义的时候看到这么一句话——一米等于光在多少多少秒里在真空中走过的距离。我突然想到,这其实是以秒来定义米啊。 后来我仔细想了一下,觉得七个基本物理单位这事有点不靠谱。我们先看一下七个基本物理单位和定义: 米:光在真空中于1/299792458秒内行进的距离定义为1米。 千克:存放于法国巴黎国际计量局的“国际千克原器”的质量定义为1千克。 秒:铯133原子基态的两个超精细能阶间跃迁对应辐射的9,192,631,770个周期的持续时间定义为1秒。 安培:在真空中相距为1米的两根无限长平行直导线,通以相等的恒定电流,当每米导线上所受作用力为2×10−7N时,各导线上的电流为1安培。 开尔文:水的三相点与绝对零度相差的1/273.16定义为1开尔文。 摩尔:所含基本微粒个数与0.012千克碳-12中所含原子个数相等的一系统物质的量定义为1摩尔。 坎德拉:给定一个频率为 540.0154×1012 Hz 的单色辐射光源(黄绿色可见光)与一个方向,且该辐射源在该方向的辐射强度为 1⁄683 W/sr,则该辐射源在该方向的发光强度为1坎德拉。 先特别注明一下,上述定义来自wiki国际单位制。下文就有一副图,把我下面要说的东西讲的非常清楚了。如果大家懒得看文字,可以去看图。但是个人觉得,那个图有点问题。 这七个基本物理量有什么问题呢?我们依次来看。 导出量 例如刚刚的米,本质上是用光速和秒来定义的。实际上米就是秒的导出量。 同样的还有安培。如果你仔细分析的话,1N = 1 kg.m/s2。所以定义本质上是用kg,m,s来导出A(更精确的说,这里也没有米什么事)。因此安培实际上是导出单位,而不是基本单位。 还有坎德拉。仔细分析一下定义,Hz实际上是1/s,W是m2.kg.s-3。sr是数学常数,一个全球面等于4π个球面度。 原器 千克的定义是,存放于法国巴黎国际计量局的“国际千克原器”的质量定义为1千克。 这个定义明显的过时了,人类在米上早就摆脱了原器制。随着测量能力的飞速上涨,千克居然还使用原器定义,这不能不说是和时代不符。更糟糕的是,如上面所说,安培和坎德拉也是千克的导出量,他们又构成了SI的整个世界。所以如果千克原器略略波动,全世界的仪器都要重新校正,不限于测重仪器。而且两个大学,校正时间不一样,对同一个实验的结果可能相差很远。这又干扰到了进一步的研究。 新国际单位制 由于上面的种种限制,因此新国际单位制被提出来。单位不再使用某人的手脚这种不靠谱的方法来定义,而是更多的采用自然现象(而且是无条件的自然现象,例如原子跃迁周期)和人为定义的常数来确定。使用这种方法来定义的单位,不需要原器,不随着时间和环境变化,能够多次产生,可以更好的反映事物的本质。 例如电流。国际计量委员会的新定义,使用电量来定义安培。因为一安培的电流,一秒流过的电量是一库仑。而一库仑的电荷数是确定的,即6.2415093×10^18个。因此,新的定义采用基本电荷和秒来定义电流,这就将安培和标准电荷这种根本性的东西挂钩起来。 新国际单位制下的基础单位 原本的七个单位里,刚刚已经说明了三个实际上是导出单位。因此我们还剩下四个单位:秒,千克,摩尔,开尔文。我们先说摩尔和千克。 摩尔实际上是阿伏伽德罗常数的倒数。对于给定的原子,阿伏伽德罗常数越大,摩尔数越小。如果改变摩尔的定义,一摩尔为一个原子,那么Na就会变成1。当然,由于未来的定义要同今日的定义相协调,因此新的定义可能会将Na定义为常数,从而固定mol为一个特定量。 而千克和摩尔的关系非常紧密。摩尔今日的定义实际上是从千克和C-12原子质量来推导Na(所以现在也是导出量,而且阿伏伽德罗常数目前会受到国际千克原器质量变动的影响)。将来mol被定义为基本量之后,kg看起来是从mol反推,即1mol的C-12重量为0.012kg(标准定义应该是XX mol的重量为1 kg,这里为了让大家看清,特意没调整)。当然,实践中采用的是硅原子球。 千克的另一个定义是从普朗克常数h推导。原谅我无法解说原理,因为我看了半天没看懂。基本理念是通过天平精密平衡质量受到的引力和电磁力,从而测量普朗克常数。电磁力的基本量纲中,米和秒都有定义。在千克固定在特定值的时候,测量得到的普朗克常数值和预订相符。此时质量即为1kg。 我之所以不理解是因为,从kg计算引力需要用到万有引力常数,这个常数是几大重要常数里最不精确的一个。拿这么不精确的常数来测量kg真的不要紧么? 然后我们再说开尔文。开尔文目前的定义是依据自然现象来确定的,新版想要修改为更加反应热能本质。具体来说,就是固定波尔兹曼常数成为定值(1.38064852×10^-23 JK-1)。由于波尔兹曼常数实际上联系着能量和温度,当波尔兹曼常数为定值后,给定能量即可给出温度。而能量J是SI的导出单位,等于m2.kg.s-2。因此K就成为了m.kg.s的导出单位。这一修改使得K和其他物理量之间的紧密联系更加清楚的暴露。 和其他单位相比,秒比较特殊。其他单位,要么是人为确定的值,和物理现象没有任何联系,例如mol。要么是通过固定的自然量从其他值中推导。例如m依据光速从s推导,kg依据原子质量从mol推导,A依据基本电荷从s推导。秒是依据特定的物理现象来测量,既不是人为定义,也不从其他物理量推导。 基础物理量和由其导出的整个世界 综合上面的信息,在我看来,基础的物理量有以下两个: 秒:基本物理量,由原子跃迁时间确定。 摩尔:人为认定数值,阿伏伽德罗常数个原子即一摩尔。 基本的导出物理量有这么三个: 米:基本物理量,通过光速,由秒导出。 公斤:基本物理量,通过由原子重量,由摩尔导出。 安培:基本物理量,通过基本电荷,由秒导出。 再导出的单位有这么两个: 开尔文:人为认定数值,通过波尔兹曼常数,由m.kg.s导出。 坎德拉:人为认定数值,由m.kg.s导出。(这里似乎缺一个常数) 总结以上数据,又能得到以下关键物理学常数: 原子跃迁时间。 阿伏伽德罗常数。 光速。 原子重量。 基本电荷。 波尔兹曼常数。

Mar 2, 2017 - 4 minute read - Comments

模拟网络丢包延迟和TC的使用

iptables方案 这个方案纯基于iptables,不需要内核模块,对容器更加友好一些。 iptables -A OUTPUT -d xx.xx.xx.xx -m statistic --mode random --probability 0.1 -j DROP 但是这个方案有个副作用。ping的时候,能看到错误“不允许的操作”。 tc方案 tc方案相对比较复杂。我们先不说这些复杂的事情,先说结果。 tc qd add dev wlan0 root netem delay 100ms tc qd change dev wlan0 root netem loss 50% 一个是延迟一个是丢包,一个是设定一个是修改。netem还允许你做乱序和重复。方法就不细写了。删除是这么干。 tc qd del dev wlan0 root netem 你再用tc qd show看看是不是规则已经没了? tc简述 tc是linux下面用来控制网络发包(注意是发包)的一套系统。基本的设计目标是确定优先级,限流,也有测试性的丢包之类的策略。可以配合iptables和route协同工作。 基本原理 包从进入tc开始,分为多个qd(qdisc)。每个qd可以包含多个子qd,qd彼此连接形成一颗树。每个qd上可以附加filter,选择进入哪个child。如果都没命中,那就看本身规则。 我们先从最简单的例子开始。将root qd改为prio。 sudo tc qdisc add dev eth0 root handle 1: prio 使用tc qd show查看变化。完成后使用sudo tc qdisc del dev eth root删除变化,还原为默认的pfifo_fast。

Feb 24, 2017 - 1 minute read - Comments

两台机器上TCP状态不一致的排查

简介 TCP状态不一致是一种常见故障。双方的机器上列出连接,其中一方连接存在,另一方则没有任何连接。如果连接存在的一方有数据正在发送,则存在两种可能性。一种是对方收到数据报文后发现这个报文没有socket对应,于是返回一个RST,导致连接存在的一方连接直接消失。这种情况下问题很难察觉。另一种是对方(或者中间方)收到报文后直接丢弃。发送方经过一定次数(tcp_retries2,一般来说就是15分钟左右)的重试后,认为连接已死,连接会自动消失。如果tcp连接打开了keep-alive,经过7200s(具体值看socket设定),即等于有数据发送。后同。 一般来说,有三种常见理由: RST报文丢失。在RST报文丢失时,发送方连接直接消失,接收方由于没有任何消息,因此连接始终存在。 FIN报文丢失。FIN报文丢失和RST报文丢失情况类似,但是发送方会进入FIN_1状态,经过一定次数重发(tcp_orphan_retries)无回应后连接消失。 内核错误。 排障时,应当首先考虑RST报文和FIN报文丢失的情况。 排障 首先应排除三种常见场景: 场景一:接收缓冲区满。 当接收缓冲区满时,FIN报文会直接丢失。这常见于接收方处理上下文堵死导致不再处理新数据的情况。特征是发送方可以观察到一定量的FIN_1状态链接(常见于接收方不处理fin报文的情形下),接收方缓冲区满,可作为特异性标识。 确证方法:在接受方使用ss观察接收缓冲区。如果接收缓冲区极大而且基本不下降,配合发送方可见FIN_1状态,可以断定此场景。 场景二:RST报文丢失。 当中间有IDS之类(F5/SDN/firewall)的网络设备时,RST报文可能丢失。特征是发送方socket直接消失,接收方socket无任何异常。检查可见netstat -s中reset的发出和接收状况不一致,但是无法作为确证标准。 确证方法:双方抓RST包,无法对齐。 场景三:FIN报文丢失。 情况和场景二类似,网络中有IDS类设备。但是丢失的报文是FIN。这导致发送方可见FIN_1状态,接收方缓冲区没有异常。 确证方法:双方抓FIN包,无法对齐。 内核错误导致的TCP状态不一致很少见,建议升级到最新内核后重测。如无法复现可以合理推测这种可能性,但是无法确证。确证需要systemtap。 PS:FIN_1状态同时也受到tcp_max_orphans的限制。如果tcp_max_orphans被设定为0以清理TIME_WAIT状态的情况下,可能导致FIN_1状态很难察觉。可考虑恢复tcp_max_orphans或者干脆直接抓包诊断。