Shell's Home

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或者干脆直接抓包诊断。

Feb 20, 2017 - 1 minute read - Comments

Disney Shanghai信息

这篇都不是攻略了,因为实在太“略”了。简单来说,就是我和老婆去了一趟Disney。 很近,从16号线换11号,大概半小时就能到。路上有一堆人卖雨衣什么的。别管他们,园区里雨衣10元一件。而且以我的惨痛经历来说,雨衣并没有什么卵用。雨衣只能防住上半身,我当天穿了一件冲锋衣,也能防住。可TM当天一个浪过来,直接打湿了大半裤子。这就尼马尴尬了。于是我就去他们的厕所里,弄了一堆擦手的纸巾擦了一下——半干。另外还有两个小伙子也是类似情况,纸巾居然瞬间就见底了。可见这种现象应该是相当频繁的。然后我就带着半湿的裤子在冬天的乐园里继续玩。。。 我的建议是。穿防水裤,并且尽量避开上去的那两个位置(就是开口最大的两个)。东西放在身上的时候,最好用塑料袋包一下。毕竟凡事都有万一。。。 乐园里的简餐没有传说中那么贵。当时一个牛肉卷(就是和老北京鸡肉卷很像的那种卷饼,里面是五方嫩牛的内容物),大约是55元。我没记错的话,五方嫩牛也要20多,而且这还是号称全中国最良心餐饮企业之一。在正餐餐厅里随便吃一点大约是50-70。我们点了个烤猪肋排。份量很大的三根肋排骨,酱汁非常入味,也只要98。我觉得在上海随便一家中档餐厅里吃饭大概也就是这个水准了。但是有一点很奇怪的是。我们中饭和晚饭在两家餐厅吃,两家餐厅类似价钱的食物量和味道可差了好多。中午在海盗湾吃的,味道和量都不错。晚上在Peter Pan旁边的餐厅,猪肉拉面能淡出鸟,量也明显小一截。。。 另外就是关于排队问题。我们去的几个地方都是一小时一小时的排队,玩其实也就几分钟。从性价比来说非常不值得。最好能搞到快速通道券。另外就是在晚上的时候,很多项目排队时间会突然缩短。我本来以为随着有些项目关门,时间应该变长的。老婆说这是因为熊孩子们被爸妈抓走了的缘故。反正晚上6点多的时候,急速光轮排队时间已经从巅峰的两小时降到15分钟了——基本就是走通道的时间。我们只在通道尽头等了两三分钟就被弹上了轨道。。。 晚上和朋友聊这事。我表示我头次知道tron原来是Disney的IP。他说他更无法接受星战被米老鼠收购的事。确实,一只米老鼠说,I’m your father,然后掏出光剑来开打。想想也诡异了点。。。 最后就是关于季度卡。我们很晚才知道季度卡的事,其实早知道的话会直接买季度卡。以季度周日卡为例。820左右,能去12次。就算各种因素不能每个周日都去,跑个六次不算多吧。合每次150不到。相当于花半小时跑一趟游乐园,150一次在里面玩到爽。而且如果玩这么多次的话,其实甚至可以等下午三点多出门,吃个晚饭去排15分钟一次的急速光轮,两个小时刷个6轮。。。 当然,我们得知的最新消息是,最近的季度卡到3.31日截止了,下面的活动没有消息。无论如何,对于住的近的人来说,这种折扣值得关注。 最后是一个个人问题,有人知道哪里有卖Disney的花栗鼠纪念品么?我们转了一圈只找到松鼠的。

Feb 5, 2017 - 1 minute read - Comments

广东游记

广东其实没啥游记可写。论大小,这是个大城市,去过的人成千上万。论各种景点和攻略,在地的人足足可以写出一本书来(我倒是一直很想写一本上海攻略)。论美食,那更是高明到不知道哪里去了。我一个外地人,才去玩几天,有什么可写的呢? 所以这次就简单记录一下广东的一些吃喝和见闻。也许不是顶好,您也就别挑剔了。这也就是一只懒猫春节没处去,随便跑了有美食的地方。如果您有什么好的馆子可以推荐在下面,一是方便读者,二是我们也许下次还有机会去。 第一天下飞机,先去的西朗。飞机是晚班的,到了睡一晚,第二天坐广佛线去的祖庙。 话说广佛线真是个好东西。要是有地铁能把上海苏州直接打通的话,那就方便的很了(据说规划中)。如果能再打通杭州的话,就更不得了了。高铁也很方便,但是一来票价很贵,二来要提前买票准点候车。哪像城铁这样说走就走,而且运力极大。这也亏得城市之间距离比较近,中国基建能力又足。 祖庙那里没什么好说的,吃了一点双皮奶,鱼角,糯米鸡什么的。看了一场醒狮,又去岭南天地吃了一碗毋米粥。本来想吃水蛇粥,结果水蛇没有,换了牛展粥。味道也相当不错。 下午去了一趟梁园,一趟南风古灶,乏善可陈。 晚上我们去的另一家“行运楼”,价格略贵,菜量比较大。更适合多人去吃。我们都不够点他最著名的脆皮烧鸡,只能点了半只葱油鸡。味道比喵烧出来的好。 晚上出去吃了个甜品,一杯冻鲜奶,一碗猪脚姜。冻鲜奶就是冻鲜奶,就是冰的牛奶,只是说广东这里都是用的水牛奶。我吃不出有什么区别。猪脚姜就是猪脚姜,就是猪脚烧姜。我不是很吃得惯。 第二天直接去的西樵山。我本来以为爬个山而已,没想到人越来越多。后来上去一看,山顶有个宝峰寺,还有个南海观音。这就对了。才过年,拜佛的地方能不人山人海才奇怪了。我们对拜佛没兴趣,对修建时间小于500年的佛教景观更没什么兴趣。所以直接从旁边岔出去,去桃花林看桃花,茶花了。 在路上的村子里有农家乐。我们看时间差不多了,素斋那里都被游客堆的人山人海的。索性在农家乐这里吃点算了。没想到这里的豉油鸡是我这几天吃的最对胃口的一顿。无他,肥鸡重油,豉油入味,对上北方人胃口,自然吃的很香。我几乎一个人吃掉了一整只鸡,猫在旁边撩了一些。 晚上回来,我们去的天海酒店。这家据说是佛山本地人吃的,价格便宜上一大截。其中一道烧钳鱼(又是重油重口味),还有一道煎青椒,味道不错。青椒不辣,去子,内部塞上鱼滑,再煎过。这个做法很特殊,别处不是很常见。 第三天早起去了顺德。顺德对吃很讲究,果然不假。我们去的时候不知就里,先看了清辉园再去吃饭。大家居然都收市了。好歹找了一家酒店,在西餐部吃了一点茶点,都不是顺德本地菜,十分可惜。其中一道沙姜蒸凤爪,和普通广式的凤爪味道不同,反倒有点像肉骨茶的味道。我们就在推测,肉骨茶料中就有山萘。另外就是去民信仁信转了转。两家双皮奶老店果然不同凡响,整个下午店里都是人头满满,根本没地方坐。最后好歹在美食街仁信的一个小店面里吃了一碟萝卜糕,一碗双皮奶。实话说我对双皮奶这种东西一直很腹诽,总感觉像是奶膏一样,不是很好吃。 第三天晚上直接回了广州,顺德到广州的高速很快,一个小时不到就下了车(订正一下网上的资料,有说两个多小时的)。晚上就在沙面的陶然轩里面随便吃了一点。他们的菜不是很有特色,碟子和茶具倒是这两天里看到最好的一套。旁边的柜子里还摆放着老的外销瓷。 第四天就在广州随便逛了一圈,石室圣心大教堂,南越王墓,北京路,还有陈家祠。这几个自己去就行,没有什么好讲。晚上我家喵念念不忘顺德美食,结果果然有了回响。在沙面有一家“有腥气”,算是顺德菜。我们在里面吃到了拆鱼粥,还有煎鱼嘴。鱼嘴更像是鱼头,也不知道正宗的顺德菜是不是这个样子。据喵说应该是小鱼。拆鱼粥很鲜。 好了,这几天吃的美食大概就这些。如果你有什么推荐,请在下面留言。注意请不要推荐一些特别知名特别贵的酒店,我知道他们好吃,但是我不去是有原因的。一个是口味可能和普通市民口味有所区别,另一个就是穷。我真心的建议大家只要记住前一个原因就好,推荐我一些符合当地人口味的餐厅——同时也会便宜一些。

Jan 1, 2017 - 1 minute read - Comments

phuket旅游和潜水指南

大致行程 简单来说,就是带着我家猫去普吉岛玩玩。一天潜水(diving),一天浮潜(snorkeling),一天jungle fly,剩下的时间就是吃吃吃买买买。 当然,执行下来完全不是这么回事。基本上每天都是满的,都是各种行程搭配。虽然就住在Jungceylon隔壁,却基本没有买买买的机会。吃吃吃倒是问题不大,各处都有不错的食物。不说精致,便宜好吃是起码的。更何况Jungceylon后门还有Banzaan Fresh Market,门口一到晚上就大开夜市。 哦,还有说到Jungceylon,这次来了才发现,这不就是上次逛的那个大市场么?连我拍某个卖玩具妹子的哈根达斯前面的四面神像都没变化。然后顺便回翻了一下游记,发现上次住的那个Blue Marine,就在我们住的地方到FantaSea的中间,能路过。 好么,净是熟人。 潜水行程 按照我的计划,第二天的行程是一整天的潜水,我家猫就去玩冲浪。 这次由于是圣诞-元旦行程,因此我比较担心人多,所以提前在网上订了行程。潜店选择是这家,原因是比较近。其实还有更近的All4Diving,在步行街上还能看到他们。但是事先咨询的结果,他们的船都是固定的,那天只有Phi Phi岛的行程。而我对Phi Phi岛的潜水又不是很感兴趣,所以还是选择了thailand divers。 他们家别的还不错,有在线的客服帮你讲解和指导,能通过paypal来支付费用,基本上是挺方便的。只有一个不大不小的问题——他们没告诉我,不能在游艇上付费。所以我付了一个定金后,本来打算在游艇上支付剩余费用。结果他们前一天下午写信过来告诉我现在就必须付钱。我说我人TM在FantaSea Show现场,手机都马上要寄存了,付个毛啊。他们说那没办法。然后就在FantaSea Show手机寄存排队的时候,赶紧输入各种信息来付账。一堆信息,还全是信用卡相关的,一个不留神就容易出现盗刷,手机上又很难查证。所以搞的非常紧张。这点让我感觉很不爽,其他的还算满意啦。 潜水船没什么好介绍的,双层普通潜水船,上层观光,下层内舱,后舱是四排气瓶,最后从尾部的平台上下。尾部有一个清水桶,供清洗相机什么的。两个淋浴头两个花洒,可以简单清洗或者下水前做个防雾什么的。比较有意思的倒是当天的同船。小一半是欧美人,我也分不大清楚都是哪里的。潜伴的小哥是东欧的,怀疑是俄罗斯人。因为潜导是个波兰妹子,和他用俄语聊了两句。好歹也去过一圈俄罗斯,虽然听不懂,但是大概也能分的出。船长是个泰国人,长的像是神盾里面那个独眼局长。戴一只耳环,说话泰国腔,但是很风趣。另一半则是东南亚人,以日本居多。一个很瘦的日本姐姐,拿一个超级巨大的水摄装备。三个很卡哇伊的日本妹子,清一色的涂着指甲,戴着tusa家的潜水表,估计是几个认识的朋友一起出来玩。一个日本超级帅哥,和一个没那么超级的帅哥,英语很流利。还有一对日本夫妻。中国人也不少,一对香港人,看样子是情侣或者夫妻,但是我不确定。说来好笑,日本帅哥以为船上就他们几个日本人,所以一群人在那里用日语聊天。偏偏我不会日语但是能听个大概,所以坐在旁边听他们聊斯米兰船宿。但是香港夫妇聊什么,虽然是中文,我可就完全听不懂了。另外还有三个,两女一男,看来是出来玩的朋友。男的自我介绍是教练,福建人,从新加坡过来的。 潜水基本情况简介 本次潜水主要在Andaman Sea水域,Chalong到Koh Phi Phi之间。环境洋流South to North,估计速度在2-4knots之间,部分区域可见极端高速洋流。天气晴朗(回程有雨),海面浪高0.5米左右。海水基本清澈,能见度10-20之间。 Koh Dok Mai 7° 47.786’ N, 98° 31.85’ E Max: 20.4, Avg: 13.4, Vis: 15, Current: about 1 knot 离码头大约20km的Andaman Sea洋面上,一个小的突出海礁。下面有垂直的海底岩壁。我们从南面下海,向东逆时针顺流绕行。原本计划是放流到北角升水,但是船长担心要在大流里升水比较麻烦,就改为顶流绕回南角升水。水下洋流还算平缓,水面流比较大。下水后可以见到成群的褐色鱼群形成瀑布,由于鱼群遮蔽岩石,无法估计规模。可见海兔(nudibranch),海鳗(moray eel)。本次潜水因在未知海域首次潜水,配重6kg,RMV在15.7左右。 King Cruiser Wreck 7° 48.148’ N, 98° 38.599’ E Max: 25.6, Avg: 16.5, Vis: 10, Current: 3-4 knots 在Koh Dok Mai向东约15km的洋面上,一艘1997年沉默的双体渡轮。船体南北走向,潜水计划是从北面的浮标下水,抓绳上下,在船体中部游览,运气好的话可以到达舰桥。由于大深度潜水,需要严格安全停留。高速洋流环境下要稳定停留,最后必须回到北面浮标处升水。因此SPG+Computer双计数,NoDec<10mins || SPG<70bars开始折返。本次潜水配重降低到5kg。