Author Archives: mine260309

记两个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

台湾周末两日游

趁着台湾出差的机会,周末在台北、基隆玩了两天,简单写个游记。

交通:

  • 推荐在任何便利店(比如7-11)买张悠游卡,方便坐火车和捷运。
  • 在台北基本上靠捷运,在基隆基本上靠打车。
  • 台北-基隆之间的交通就靠火车了,台北火车站、松山火车站都有班车到基隆火车站。

住宿:

  • 因为平时工作的地方在七堵,离基隆比较近,所以就住在基隆了;
  • 基隆似乎是个比较老的城市,推荐住长荣桂冠酒店,目测4星;
  • 但是只能订到两晚的长荣桂冠,剩下的日子住在了欧香精品商旅,非常不推荐——小,吵,卫生状况一般,wifi等于没有,唯一的优点在于它就在基隆庙口,下楼就是夜市。

游:

周六一整天逛了台北,从台北火车站,沿着捷运的线路一路玩。

* 中正纪念堂

蒋校长在国内的宣传中一直是反动派,不过我们都知道抗日的主力军是谁。
在台湾能看到校长的另一面,显然,地位要高太多了,大概也是按最高领导人的待遇来纪念的吧。
纪念堂挺大一块地方的,好多厅都有不错的展览,推荐一逛,我在这儿有晃荡了3个小时。
中正纪念堂_1中正纪念堂_2中正纪念堂_3

纪念堂的对面,过条马路就是国家图书馆,走过去晃荡了一下,似乎要办了证才能进去,于是就到此一游了。
国家图书馆

 

* 101大楼

逛完中正纪念堂,已经12点多了,坐捷运到了101大楼。
楼底有很多吃的,看到一家”米其林北海道介绍店“的梅光轩,它家的面确实不错!
101大楼_1101大楼_2101大楼_梅光轩

本来想去101大楼的楼顶去看看风景的,但是想想已经爬过魔都的100层了,风景也就那样了,于是去周边转了一圈。
发现旁边的世贸正好有漫画展,而且有海贼王的特展,正好进去逛了一圈,买了件OnePiece路飞的衣服和小纪念品~
漫展_2漫展_3漫展_1漫展_4

 

* 国父纪念馆

捷运往回坐,然后转两条线到了国父纪念馆,国父孙中山在国内和台湾的地位都很高,作为曾经在南京呆过7年去过若干次中山陵的人,国父纪念馆也是必去的了。
插个题外话,PokemonGo正好在台湾流行中,我在这里抓到两只皮卡丘!
相比起中正纪念堂,国父纪念馆的规模似乎要小一点,展厅似乎也少了一些,不过这里还有各种其它展览(书法、绘画),还有常年都在旁边跳舞的团体,也算是个大众文化中心了。不错。
国父纪念馆_1国父纪念馆_2国父纪念馆_3国父纪念馆_4

顺便一提,这里看101大楼的视角要比在101大楼底要好太多了。
国父纪念馆_101大楼

 

* 诚品书店

从国父纪念馆出发,可以走路去诚品书店,大概不到2公里路,我逛累了,往回坐了一站捷运少走了些路。
本来以为,诚品书店总店应该是个规模很大的地方,到了才发现,”果然”跟想像得不一样。书店占了写字楼里2F一层,其实不是很大,尤其是跟南京的先锋书店里,规模还是小多了。不过书确实很多,也很多人或坐着椅子或坐在地上看着书,氛围挺好的。
B2层还有诚品的文具馆、儿童馆、音乐馆,音乐馆的感觉不错。
诚品书店_1诚品书店_2诚品书店_3诚品书店_4

逛完诚品书店,下午5点多了,跟Bob汇合吃了个晚饭,坐火车滚回基隆。。。

周日

查了一些基隆的景点,发现北边有个国立海洋科技博物馆,附近有八斗子海滨公园和著名的望幽谷,决定主要去那边玩。
这一天太阳很大,天热,正好适合室内的活动——于是先去了海洋科技博物馆。
海洋科技博物馆

地方其实挺偏僻的感觉,不过这个博物馆很新很干净,7层楼,1、3、5、7有各个展厅,旁边还有剧场、探索馆之类的地方。
整体感觉,跟上海科技馆类似,分主题的展厅,但大都是模型、视频 介绍,有部分互动的可以做实验的东西(但有部分是维护中…)。但不管怎么说, 是个非常适合带小朋友过来学习的地方!
海洋科技博物馆_2海洋科技博物馆_3海洋科技博物馆_4

从博物馆出来,沿着一条小路往山上爬上1~2公里,就来到了八斗子海滨公园。
这是一个开放的公园(好评!)有各种山路和明确的指示牌,所以很方便闲逛。
在山顶上,往北就是蔚蓝的大海,往西南就是八斗子海港,风景很赞。下面的山谷,据说走到这儿,看着风景就能忘却各种烦恼,于是被称为忘忧谷,又
名望幽谷。在这里,随便用手机拍点照片,都能当桌面背景~
望幽谷_1望幽谷_2望幽谷_3

然后打车回基隆市,半路上有个叫做”海门天险”的地方,是清代台湾防守基隆港的军队驻扎地,有一些炮台。
既然叫”天险”,果然又是要爬山的(天好热!)。爬到山顶(其实也就一小会儿),能看到炮台阵地,可惜都是复原过的模型,不是实物。不过从位置看,确实是个防守的好地方——往北正对着基隆港,要是敌船来犯,正好是炮弹的火力范围。
海门天险_1海门天险_2海门天险_3

从海门天险回来,赶紧回酒店休息了,两天的行程就是这样。

Share