Author Archives: mine260309

在同一根网线上支持电信宽带和4K IPTV

由于弱电箱到客厅只有一根线,一个网口,之前写过一篇文章介绍如何在一根网线上承载两路网络

这个方式有两个缺点:

  1. 带宽只有100M,而现在电信的宽带已经用上200M了,浪费了一半的带宽;
  2. 用了4K IPTV的话,IPTV的机顶盒在一根网线上需要同时获得VLAN的IP和公网IP才能正常工作。

第一个缺点还能忍,第二个问题,如果还用之前的方式,IPTV就彻底不能用了。
所以要解决这个问题。

原因

首先看一下,4K IPTV是如何在一根网线上同时获得VLAN和公网的IP的。

  • 光猫作为路由器,IPTV直接接LAN2;
  • 光猫的设置里,VLAN和LAN2之前有数据绑定;

所以LAN2既能直接上网(有公网IP),也连接了电信的VLAN,而IPTV通过LAN2就可以同时获得这两个IP了。

解决

目标还是和之前一样,我要让光猫只当猫,由我自己的路由器来拨号,4K IPTV只能接到我自己的路由器上,让路由器来支持4K IPTV。所以网络变了一点点:
家庭网络设备

所以路由器相比之前,要多做一件事:把电信IPTV的VLAN桥接到我的内网来,并把VLAN里DHCP的消息也桥接进来。

而我的R6300v2的官方固件是不支持VLAN的,所以只能刷其它固件了,我选了梅林。

以下同详细的设置:

  1. 光猫的配置和以前差不多,桥接Internet(为了路由器拨号),桥接VLAN(为了IPTV)
    光猫VLAN设置
  2. 路由器端,拨号设置跟以前一样,多加一个dnsmasq的配置:
    # cat /jffs/scripts/dnsmasq.postconf
    #!/bin/sh
    CONFIG=$1
    source /usr/sbin/helper.sh
    
    # 通过 pc_append把dhcp相关的设置append到 /tmp/etc/dnsmasq.conf 文件里
    # 这样IPTV就能获取到VLAN的IP了
    pc_append "dhcp-option-force=125,00:00:00:00:1a:02:06:48:47:57:2d:43:54:03:04:5a:58:48:4e:0a:02:20:00:0b:02:00:55:0d:02:00:2e
    dhcp-option=15
    dhcp-option=28
    dhcp-option=60,00:00:01:06:68:75:61:71:69:6E:02:0A:48:47:55:34:32:31:4E:20:76:33:03:0A:48:47:55:34:32:31:4E:20:76:33:04:10:32:30:30:2E:55:59:59:2E:30:2E:41:2E:30:2E:53:48:05:04:00:01:00:50" /tmp/etc/dnsmasq.conf
    
    # 配置VLAN
    robocfg vlan 51 ports "0t 1t 2t 3t 4t 8t" vlan 85 ports "0t 1t 2t 3t 4t 8t"
    

以上配置好之后,打开IPTV,它能在路由器上同时获取到公网和VLAN IP,可以正常工作了。
而且,这样连接方式,路由器和光猫之间是通过千兆网络连接的,公网的带宽也不受影响,喜大普奔~

注:以上配置完全参考[教程] 上海电信完美解决4K IPTV一劳永逸增强板,其中光猫的配置的截图也来自于这个链接。
非常感谢这个贴子!

Share

记两个gcc的bug

一般来说程序的编译、运行遇到问题,只会怀疑code有问题,而不会怀疑是编译器的问题。不过日子久了,总会遇到各种各样奇怪的问题,最近遇到了两个gcc相关的bug,记录一下。

问题一

在编译一个并不复杂的文件的时候,gcc报内存不够的错误。
这个文件只是定义了一个嵌套了几层的std::map,而且,如果用GCC 4.8来编译,很快就编译完了,占的内存也不多。
然而,如果用GCC 6.2 (或者最新的7.1)来编译,会发现占用的时间非常长,而且占用内存特别多,最终(如果内存不够)会报internal compiler error: Killed的错。
观察发现,在编译的过程中gcc占用的内存越来越多,分配了足够多的swap之后能编译成功,最终内存要占到16~20GiB左右。
同事去submit了一个bug,https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80290,被confirm了。
不过,从comments看,似乎还挺复杂的,什么时候能修好,就难说了。。。
另外,用clang的话也不会出现这个bug。

问题二

在一个动态库里,遇到一个std::unique_ptr相关的segment fault。这个变量在constructor里明明创建过了,但是运行时发现它还是nullptr
简化一下问题,如果一个动态库里有类似这样的code:

std::unique_ptr<MyStruct> s = nullptr;
void onLoad() __attribute__((constructor));
void onLoad()
{
  s = std::make_unique<MyStruct>();
}

当这个动态库被dlopen的时候,我期望s会被onLoad()初始化好,然而在别的函数里用这个s的时候,会segment fault,因为s里面是个空指针!
关于这个问题,我在SO上提了个问题,结果发现,跟这个GCC的这个bug有关:

简单的说,动态库里 constructor 和 global/static 变量的初始化顺序是unspecified,所以有可能onLoad()先执行,然后再初始化global变量s, 把它初始化成nullptr。注意这个时候只是初始化,原来的变量并不会被析构,其实也是内存泄露。
不过,这个bug看上去暂时不会被修复,只是会在文档里注明这种情况初始化顺序是不定的。
要修复这个问题,需要给变量指定初始化顺序:

std::unique_ptr<MyStruct> s __attribute__((init_priority(101))) = nullptr;

注意init_priority的值设为101~65534都可以。 0~100是reserved,用了会有warning; 最大值是65535,也是默认值,要是设成65535,就和__attribute__((constructor))一样,顺序就变成unspecified了。
另外,clang也支持这个属性,表现也gcc一样,有同样的bug。

Share

在墙内用gmail两步认证发送kernel patch

Linux Kernel的开发,都是通过邮件发patch的形式来review的。如果用自己的邮件服务器当然没问题。
不过如果想用gmail帐号来发patch,必须翻墙才行;
如果你的gmail帐号开通了两步认证(如果没有,建议开通),还需要额外的App-Specific密码。

这里介绍一个简便的方法。

前提

有一个翻墙的方式,比如Shadowsocks
开通了gmail两步认证。

原理

  • 配置git使用msmtp来发送邮件;
  • 通过proxychains来翻墙;
  • 通过App-Specific密码来登录Google的SMTP server

步骤(以shadowsocks为例)

  1. 安装msmtp, proxychains
    sudo apt-get install msmtp proxychains
    
  2. 配置msmtp使用gmail的SMTP服务
    $ cat ~/.msmtprc
    # Example for a user configuration file
    # Set default values for all following accounts.
    defaults
    tls on
    tls_trust_file /etc/ssl/certs/ca-certificates.crt
    logfile ~/msmtp.log
    # My email service
    account gmail
    host smtp.gmail.com
    port 587
    from <your-gmail-id>@gmail.com
    auth on
    user <your-gmail-id> @gmail.com
    password
    # Set a default account
    account default : gmail
    
  3. 配置proxychains使用shadowsocks
    $ cat /etc/proxychains.conf
    ...
    [ProxyList]
    # add proxy here ...
    socks5 127.0.0.1 1080 ## Set socks5 proxy to your sslocal ip/port
    
  4. 配置App-Specific Password
    1. 登录到https://security.google.com/settings/security/apppasswords
    2. Generate一个密码,建议设置一个custom name,比如说linux-kernel
    3. 这个密码一般是16个ascii码,保留好这个密码,建议保存在KeePass里。
  5. 生成git patch并发送邮件
    # 生成patch
    # 生成patch
    git format-patch --to=<kernel-mailing-list> --cc=<reviewer> --subject-prefix="PATCH linux" <revision range>
    
    # 启动shadowsocks
    sslocal -c <your-ss-config.json>&
    
    # 通过proxychains来发送邮件
    proxychains git send-email <your patches>.patch
    

    当它提示要输密码的时候,不要输gmail的密码,输入之前generate的linux-kernel的密码

    password for <your-gmail-id>@gmail.com at smtp.gmail.com:
    

Done!

Share

NASA – Space Center Houston一日游

在Austin出差,到Houston两个半小时的车程,所以很想去NASA的博物馆去逛逛,这回正好有机会去了!

一大早,7点不到,从Austin出发,沿着290一路向东,开两个多小时就到Houston了。一路经过几个小镇,沿途的基本上都是草原,或者是牧场,牛、羊、马都有,风景不错。
IMG_20161112_080804IMG_20161112_081529

在Houseton市区,转到45号路,往东南方向再开个半个多小时,就到了Nasa路了,非常顺畅。
IMG_20161112_095415IMG_20161112_095912

Tips: 门票成人$24.95,可以在网上买好打印出来;停车费$6

到了Space Center Houston,就能看到巨大的波音747驮着一架航天飞机(Independence),这架航天飞机并没有真正上过天,只是供游客参观用的。不过它还是按真正的图纸打造的,所以可以认为它就是真正的航天飞机了。
IMG_20161112_100440IMG_20161112_100558

Tips: 强烈推荐在前台打印Timed Ticket(或者在网上预约好),一个是Tram Tour另一个是Orbiter Tour,上面有预约的时间,这样可以在指定时间,不用排队(或者说可以插队)进行这两个Tour了。Tram Tour人气最高,正常可能要排半个小的队。

进馆之后,可以随便参观了。挑重点的来说。

右手边是Destiny Theater,循环播放影片,穿过这个Theater,来到主题是月球的展馆(Starship Gallery),这里有登月的模型,月球车,更关键的是,有真实的月球岩石,还有一小块月岩可以让游客触摸。摸一下从月球上带回来的岩石,想想都有点激动!
IMG_20161112_145359IMG_20161112_145629
IMG_20161112_145738

从这个馆推门出去,就到了Orbiter Tour(Shuttle Tour),也就是航天飞机的参观(这边似乎排队不多,Timed Ticket没用上就进去了)。一开始我还以为这个航天飞机只能远远的看,没想到还能进去参观,相当地惊喜。

这里一共分为三层:
最顶上是航天飞机的驾驶舱,复杂的显示屏和无数的按钮,真心让人觉得,这太tm难了——现在不用航天飞机了,宇航员回地球相对简单,乘返回舱挂个降落伞就下来了——而坐航天飞机的,还要学会驾驶飞机,还要会降落!
中间层是甲板,更是巨大的货舱,空间站的材料就是这么一趟趟地运上去的。
最下面是波音747的客舱,里面有航天飞机的介绍,有飞洞的模型,挺有意思的。
IMG_20161112_120039IMG_20161112_115641IMG_20161112_120003IMG_20161112_121810

从Orbiter Tour下来,回到展馆里,在Destiny Theater的旁边是Blast-Off Theater,按点播放电影,看完电影,进到旁边一个像是控制中心的地方,工作人员会自豪地介绍目前国际空间站的情况,宇航员的情况,最新的进展,以及未来的Orion航天器的介绍,听着让人觉得NASA的未来一片光明,哈哈。
IMG_20161112_110524IMG_20161112_110658

回到中央,左边是国际空间站的缩小版模型,挂在空中,不太引人注意,再往左是Astronaut Gallery,这里有一个Live Show,配合着激光投影和星际争霸的音效,蛮好玩的;还有更多的展品,让人印象深刻的是被太空垃圾(或者太空尘埃)破坏的东西的展示,一个1.4cm的铝片以10000mph的速度击中一块钢板,击出一个大洞,幸好这个是外层的防护钢板。。。巧的是,这段时间我正在看《星空清理者》,主题就是太空垃圾,正好学会一个单词debris。
IMG_20161112_104448IMG_20161112_114215IMG_20161112_114442
IMG_20161112_114518

最后是重头戏Tram Tour,乘坐NASA的观光车,去NASA园区里溜一圈,注意,是正儿八经的NASA办公的园区,这个也能开放给游客看,佩服,而且相信这个NASA讨好公众,方便国会批钱的一种方式,赞!

Tram Tour分为Red和Blue,红线是参观园区(包括宇航训练中心的内部)和火箭公园,以观光为主;蓝线是参观Control Center,以听介绍为主。红线人非常多,一般可能要排队半个小时(下午可能会超过1个小时),所以推荐用Timed Ticket,在预约好的时间,可以走专门的通道,不用排队。

从在Tram上,在地道穿过一条马路,就来到了NASA的园区,一路会介绍各个建筑的功能,能看到液氮和液氦的保存罐,到Space Vehicle Mockup Facility这幢楼时,会进到里面去参观,能看到各个航天器的mockup,研究中的,已经投入使用的,等等。有各种舱,各种机器人,各种四轮、六轮车,甚至还有像蜘蛛一样的机器人,当然,也有SpaceX的龙飞船。NASA在介绍private company的时候也挺自豪的——节省成本,可以报钱花在刀刃上之类的。挺好一件事,在国内应该还做不到,中国基本上还是只能靠国家自己的投资来做宇航事业吧。
IMG_20161112_131523IMG_20161112_132607IMG_20161112_133656
IMG_20161112_134216

逛完一圈,往回的时候,会经过一条Memorial路,两边有为航天事件牺牲的人员的墓碑,Tram在这里停了一会儿,让大家缅怀“先烈”,同时放了一段小布什在哥伦比亚号失事后的讲话,这一段路走得挺感人的。然后能看到NASA的广阔的“草原”上栖息着各种动物,松鼠,羚羊,公牛,似乎与自然和谐一体了。
IMG_20161112_142547

到了Rocket Park,是一个大仓库,外面有两个早期的火箭,还有几个火箭的引擎,而仓库里面,就是著名的Saturn V火箭,目前最大的火箭,美国登月时发射用的火箭,一级是五个超级大的F-1发动机,二级也是五个,略小一点的J-2发动机,还有第三级,是一个J-2发动机,第四级就是载荷了,比如说,阿波罗登月舱。在这个大仓库里,人站在旁边,完全能感受这个火箭的巨大 ,震撼!
IMG_20161112_140255IMG_20161112_140555IMG_20161112_140729IMG_20161112_140826

从火箭公园出来,乘坐Tram回到Space Center,红线就算看完了。
Tram Tour还有蓝线,由于时间原因,蓝线没有去看,这样正好,给我一个理由,下次可以再来。

Space Center里还有很多适合小孩子看,听,动手的项目,要是带着娃,这里也是个好地方。
总之,强烈推荐,如果对宇宙、对宇航感兴趣,一定要来一次,我大概会来两次~
人类的未来一定在星辰大海~

IMG_20161112_103802
IMG_20161112_145218

Share

在Android 7.0上解决感叹号问题 [更新至7.1.1]

背景

从Android 5.0 (Lollipop)开始,安卓为了检测各种需要登录的Wifi服务,提供了captive_portal_detection_enabledcaptive_portal_server这两个设置,分别作为检测的开关和服务器。原理是访问http://<server>/generate_204这个URL:

  • 如果返回204,就说明wifi可以直接连接,不需要登录;
  • 如果返回非204并且非空的内容,说明wifi需要登录。

默认的服务器是被墙的google的服务器,所以总是检测不正确,导致出来感叹号。

具体情况可以参看小狐狸的这篇文章,里面详细介绍了原理,以及如何设置墙内的服务器。

问题

不过,从Android 7.0 (Nougat)开始,这个设置稍微有点变化,在某些服务器上会导致又出现感叹号,这里介绍一下。

Android 7.0 引入了一个新的设置:CAPTIVE_PORTAL_USE_HTTPS(captive_portal_use_https),默认值是1,也就是说,默认情况,它会用https://<server>/generate_204这个URL来判断isCaptivePortal()
具体的code请移步NetworkMonitor.java#285

假如原来的服务器不支持HTTPS,或者支持了HTTPS但是这个URL没有返回204,都会导致感叹号的问题。

解决

所以解决问题的方式也很简单:

  • 要么配置墙内的服务器,让它在https的情况也也返回204;
  • 要么在手机上把HTTPS的值设为0 (settings put global captive_portal_use_https 0)

比如说,V2EX刚提供了captive.v2ex.co这个URL,同时支持HTTP和HTTPS。
本站也提供http://ping.mine260309.me/generate_204https://mine260309.me/generate_204这两个URL。

更新

升级到7.1.1之后,会发现感叹号(或者x号)又出现了。
感谢@tedjiang的comment,解决办法是:

settings put global captive_portal_https_url https://captive.v2ex.co/generate_204
Share