伪·2018届校招面经

作为一名曾经的2018届硕士毕业生,为找工作忙活了大半年,最终收获了微软、百度、头条、Face++等十多个Offer。校招季对我来说,在9月份就差不多结束了。本来很早就酝酿了这篇博客,但是由于之后一系列事情,耽搁至今,趁着提交完年终技术报告,回家之前,把这段经历记录一下。 首先介绍一些计算机专业校招的基本情况。由于移动互联网、人工智能等浪潮的兴起,计算机专业的毕业生就业前景可谓一片大好,尤其是对于名校毕业基础扎实的同学,应届生薪资倒挂老员工的事情几乎每年都在上演。所以首先祝贺所有CSer,这是属于你们的时代,各行各业都有属于你的舞台,尽情去施展才华吧。 本专业的毕业生就业去向主要有这么几类:国内互联网公司、国外互联网公司(外企)、国企。其中国内互联网公司又分大厂和新兴创业公司,大厂如BAT、网易、360、京东、华为等,创业公司主要集中在人工智能这块,如商汤科技、Face++、头条、滴滴等。外企大概也分为两类,一类是来自日本的企业,比如Indeed、WAP;另一类是来自美国的企业,比如Microsoft、Google、Hulu、FreeWheel、Amazon等。国企是指传统的国有企业里面的IT部门,比如各大银行、证监会等。这几类公司的校招时间刚好都错开了,一般来说,日企来华校招是最早的,大概每年5月份就来了;接着是国内互联网公司的内推季,大概在7~8月份;进入9月份之后,就是国内互联网公司的正式校招了;美国的企业大概会在9~10月份启动校招,有可能一直持续到11月份;国企就比较晚了,听说最晚能持续到第二年3、4月份的。这种安排,对我们来说,既是好事,也是坏事,好处就是对于纠结的同学,可以每种类型的公司都试一试,多拿几个offer,最后根据自己的情况决定去哪里;坏处就是持续时间真的很长,面到最后,身心俱疲,需要做好心理准备。 我经历过的面试主要是国内互联网和部分外企的研发岗,下面也将主要介绍这两类企业,按时间先后顺序。 Indeed(FAILED) Indeed是全球最大的招聘信息搜索引擎公司,总部位于美国德州的首府奥斯汀,2012年被日本的Recruit收购,然后成立了Indeed Tokyo办公室。本文提到的Indeed都是指Indeed Tokyo,即拿到offer的话,要求去东京工作,不过可以轮转去奥斯汀总部。 Indeed是最早开始校招的,当国内公司还在实习招聘的时候,它就跑来进行校招了。我参加了2017年4月17日在北大举办的校园宣讲会,介绍了Indeed的基本情况和招聘流程,以及抽奖机械硬盘等。Indeed的办公室很有科技范,其工位设置尤为吸引人,是六边形的环形设计,每个人既可以专注于自己的工作,又便于和组内同事讨论。宣讲的人包括HR和从该校毕业的学长,这个HR是中国人,后面有一轮HR面也是他,大家可以多多留意。 Indeed最大的吸引力是,700万~800万日元的年薪,折合人民币大概四五十万吧,这样诱人的薪资,让每个路过其宣传海报的同学都驻足观看。当然其面试难度也不小,首先有一轮在线笔试,这个在线笔试有三次机会,只要有一次全部AC,就算通过。在线笔试题一共4道,难度比LeetCode稍大,但是一定提醒大家,他们家的题都有数据范围,而且范围很小,前3题用暴力解法几乎都可以过,所以一定要先试试暴力求解,不行再想DP。 通过在线笔试之后,会有一个大约30分钟的HR面,就是上面提到的来华宣讲的中国人。这个面试严格来说是Case interview,通过Skype进行,主要考察逻辑逻辑思维能力和英文口语能力。由于是中国人,所以刚开始会用中文介绍下题意,然后让你思考一下,最后用英文给出解答。我当时的题目是,如何把微信支付的流水从xxx提高到yyy。由于提前非常认真的看了http://www.caseinterview.com/的视频教学,学到很多,这次HR面顺利通过。 通过HR面之后,还有一轮Skype技术面,是从Indeed Tokyo那边打过来的,需要解算法题,通常是一题+好几个follow up。不过很多是往年的原题,在一亩三分地上都有,大家可以仔细在上面看看。我当时被问到的题是之前准备过的,但是没答好,比较突兀的给出了最优解,面试官可能觉得我是背答案了吧。。。 如果这轮Skype技术面也通过的话,就可以免费飞到东京参加on-site面了,听说on-site面是3轮面试,一整个上午或一整个下午,几乎也是原题,可以在一亩三分地上找到。 说来也奇怪,Indeed每年的面试题都差不多,但通过面试的人总是寥寥无几,这才是高级的面试官,考察的是应聘者的解题思路,而不是答案。 Indeed Tokyo很不错,如果能拿到Offer,说明你很优秀,离人生巅峰也不远了。 Works Applications(FAILED) Works Applications简称WAP,是一家日本的ERP软件开发公司,ERP全称是Enterprise Resource Planning,简单理解就是面向企业用户的各种管理系统。WAP是正宗的日本企业,其风格和Indeed Tokyo截然不同,上班要求穿正装,估计各种行为规范也不少,但是钱也不少,折合人民币估计也有四十多万吧。WAP虽然总部在东京,但它在上海有办公室,国内校招生基本上都在上海办公。 WAP的招聘流程和Indeed很像,首先会有一个宣讲会,建议大家都参加,类似于报名考试。宣讲会之后会收到一个在线笔试的链接,要求3天之内做完2道编程题,题目比较简单。在线笔试通过之后,有一轮在线技术面试,使用的是牛客网平台,要求视频面时不能离开面试页面查资料。视频面也比较简单,大概Leetcode的easy~medium题。 对于WAP,前期的在线面试只是开胃小菜,好戏还在后头。通过两轮在线面试之后,会邀请去某个酒店现场面试。现场面试有三轮,全程英文,一般是先来段英文自我介绍,然后开始做题。比较搞笑的是,见到一面面试官时,被问到感觉如何,我说good,然后面试官说别人都是很nervous,我居然说good,感觉要被自己坑了,还好出的题都会做。前两面都不难,大概LeetCode中等题,第三面感觉是一个boss,已经不考LeetCode算法题了,考类似智力题的东西,比如有人被考到囚犯和帽子颜色的问题,我被问到的是怎样实现求两数的平均值,常规的(a+b)/2有可能导致a+b溢出,我想了很多方法,面试官都不满意,后来发现《程序员面试笔试宝典》上有。求平均值的问题可以先转换为求和,用位运算是a+b=((a&b)«1)+(a^b),a+b就是按位加,对应二进制也是按位加,要进位的情况就是对应位都为1,所以先用a&b找出需要进位的位,然后左移1位表示进位;还有些位可能只有一个1或者没有1,这部分加和的结果可以用异或表示,即a^b,所以a+b=((a&b)«1)+(a^b)。那么,求平均值就是(a+b)/2=(a&b)+((a^b)»1)。要是早点看了《程序员面试笔试宝典》,我估计也能拿到WAP的Offer了。 三轮技术面之后,会有一个HR面,听说如果前面的技术面过关的话,HR面会遇到日本boss,直接发放Offer;否则是一个中国人,寒暄几句之后,被告知技术面没有通过,但是可以参加暑期为期一周的实习活动,实习通过的话,也可以获得Offer。每年的实习主题都差不多,比如做一个酒店管理系统、电影院管理系统之类的,由于我觉得时间代价太高了,没有参加暑期实习。 虽然WAP的工资很好,但是要想拿Offer,比Indeed简单,LeetCode中等题足够,好好准备一下现场第三面。另外,即使拿到Offer,也要考虑一下工作内容是否符合自己的兴趣,毕竟ERP和当前火热的AI相比还是太古老了,而且穿正装上班估计也只此一家了。 深信服(OFFER) 深信服公司是面向企业的安全与云计算解决方案供应商,可以理解为企业版360。听说创始人是从华为跳出来的,公司整体风格和华为很像,从宣讲会上还听说这家薪资不错,尤其是博士,宣称比BAT华为都高。 深信服的提前批招聘也很早,7月初就来所里宣讲了。首先有两轮电话技术面试,面试官都会提前短信约时间,给人感觉不错。电话面试的内容比较广,网络、操作系统、C++、算法等都会问到。面试官手里应该有一个问题清单,挨个问下去,不会的跳过,节奏比较快。所以面试深信服之前,要好好复习计算机基础,尤其是网络相关的,因为其主营业务和网络密切相关。 能通过前两轮电话面试的,基础都很扎实,接下来会邀请去参加他们的星云计划暑期夏令营。原本夏令营是要去深圳总部的,但是北京的很多同学都没时间,于是临时把夏令营分成了南北两波,北京的同学被安排在九华山庄度假村。在这里会听好多深信服的介绍和讲座,其中有一个清华的博士,在校期间发过很牛的Paper,自称是那一届的全国博士Top5,谈了很多选择去深信服的理由,核心思想是博士在深信服有很大的自主权,可以试错,主导一些项目,而且薪资估计真的很高。最后会有一个Boss面,主要是问项目经历,Boss是连夜赶来北京的,面试的时候哈欠连天,也没问什么实质性的问题。去的人应该都过了。其实这个夏令营主要是去体验生活的:) 最后的Offer,中规中矩,薪资并没有想象的高,也不是自己喜欢做的事情,拒。 华为(OFFER) 华为就不用介绍了,早年凭借电信网络产品赚得盆满钵满,近几年的智能手机业务更是冲出国门走向世界,真的是我国民族企业的榜样。华为严格来说是一个制造商企业,不算互联网企业,而且其招聘比较看重学历,给人感觉有点像国企。但是毕竟其产品都是计算机相关设备,对计算机专业人才的需求还是很旺盛的。华为的另一大特点是有钱,并且舍得给员工砸钱,我上一届的硕士师兄去了华为,工资碾压BAT,成功倒挂一大批老员工。仔细看看近几年各大重点高校的毕业生去向,去华为的占了很大比例,如果你想快速积累财富,又能吃苦,去华为能很好的满足你的要求。 因为师兄去了华为,3月份收到内部通知说可以提前批内推了,于是把简历给了师兄进行内推。7月初的时候要求做一个性格测试,华为特色,其他公司都没有这一环节,据说是在筛选符合华为价值观的同学。7月22日参加华为提前批优招,真的是优招,去的大部分是清北中科院的,猜测还要求本科是985高校。 优招面试很简单,因为是业务面试,主要问问项目,面试官是那种成功人士风格的Boss。二面就不问技术了,会问周围同学老师是怎样评价自己的,科研压力大吗,想去哪工作之类的,类似的问题也是在衡量应聘者和华为公司的match程度。我应该是非常match的,面试结束的时候,Boss还跟我握手了! 优招面试结束后没几天,会有一个在线笔试,编程题,三道题,最好全AC,我是前两题AC,第三题过了80%。至此,华为所有的笔试面试都结束了。但是直到9月初,才被再次邀请去华为北研参加Offer沟通会,这个会和大一刚入学参加各大社团的招新差不多,华为的各大部门开始抢人,我去了2012实验室中央软件院。 四维图新(OFFER) 华为虽然是最早面完的,但是Offer迟迟没有下来,国内其他互联网公司又还没开始面试,心急之下,看到四维图新在招聘C++研发工程师,做地图搜索的,和自己有点关系。网上查了一下,发现还是腾讯地图的数据供应商,而且还是母校武大测绘学院有很紧密的合作,应该是个靠谱的公司。 跑去面试,可能是公司比较小,面试流程还很原始,直接在接待室问了我几个问题,有些题目有一定难度,连红黑树都被问到了。然后被直接拉去工位,打开VS,开始编程,所幸全部AC。等了一会,直接HR面,拿到普通OFFER。我说想申请SP,HR说下周再来一轮Boss面吧。于是下周又跑去Boss面,Boss果然是Boss,气场就不一样,问题也很灵活,都是他们地图搜索开发过程中的实际问题,比如给定中国地图和一个GPS坐标,怎样快速定位这个坐标。类似的题目很有意思,虽然有一个题目回答得不是很好,但总体上聊得还比较开心。Boss面完之后,又一轮HR面,被告知拿到SP,而且如果能来实习,实习表现好,且能申请到户口指标,则有可能有户口。 这个Offer是我校招季拿到的最早的Offer,薪资还不错,也算是稳住了阵脚。但是公司规模和名气都不算大,暂时拿来保底吧。 百度(OFFER) 百度公司和我的专业是最匹配的了,国内做搜索技术最强的,非百度莫属。百度很人性化的一点是,公司不同部门的招聘分开进行,互不冲突,所以可以同时向不同部门投递简历。我就一口气投递了网页搜索部、商务搜索部和基础架构部。很幸运,同时拿到了这三个部门的提前批Offer。 百度各部门的面试流程都很像,前两轮技术面,第三轮是Boss面或者HR面,越往后面试官的级别越高,第三面的面试官很可能就是你未来的Leader。第一轮面试比较基础,问一些网络、操作系统、C++的基础知识,然后写两道算法题。第二面先写两道算法题,然后问项目,项目问得很细,我的几个搜索引擎的项目,不但问了项目的实现细节,还问了很多follow up,比如,在实战场景中,千亿级别的数据量,怎样建索引使得查询更高效,如何实现怎个搜索过程等。因为面的是搜索部门,他们对相关的技术非常了解,不要抱任何侥幸心理,不会就说不会,切莫班门弄虎。第三面Boss面比较宏观,问问职业规划,如果面试官对你比较感兴趣,会主动介绍本部门的工作,凤巢的三面面试官甚至直接加了我的微信,受宠若惊啊。 提前批面试完毕之后,9月初会有一个在线笔试,这个笔试也会刷人,所以不要掉以轻心,一定要认真准备。我当时是因为宿舍网络问题,被坑死了,那个在线笔试的系统也很变态,是个国外的系统,动不动就掉线,还只能登陆3次,超过自动退出。于是,很悲剧的3题只AC了2题。之后的几天,一直寝食难安,担心会栽在最后的笔试上。 所幸,没过多久,收到了电话通知,笔试通过,需要确定部门,让我从三个部门中选一个。我当时那个纠结啊,网页搜索部、商务搜索部和基础架构部都是百度非常核心的部门,基架的低层技术很强,网搜是典型的文本检索,商搜是广告检索,网搜的三面面试官对我很好,时不时在微信上联系我;我和商搜的三面面试官也聊得很开心,商搜是百度最赚钱的部门,各种大牛非常之多。几番权衡之后,选择了商搜(凤巢),同时也拿到了SP。 Microsoft(OFFER) 微软是我面的唯一一个美国外企,面试流程数它最多了,前后经历了:1轮在线笔试+2轮skype面试+3轮on-site面试。 首先,要拿到微软的skype面试机会就很难,需要通过Hihocoder的在线笔试。Hihocoder的题型和难度都相比于LeetCode复杂得多,我有一次很幸运的做到了前100名好像,拿到了skype面试机会。两轮skype面试难度也不小,比如search range,不但要求bug free,还要求你写测试用例;还比如对快排进行优化;手写堆排序;概率题等。微软的在线编程和skype面试和国内互联网不太一样,建议大家看看一亩三分地上的面经。 过了两轮skype面之后,会被邀请去参加他们的探星夏令营,大概是在8月中旬,地点就在丹棱街的微软大厦。探星夏令营第一天是参观,我因为实验室忙就没去,第二天是三轮面试。我因为研究的方向是搜索引擎,所以被安排到bing组面试了。微软的现场面试难度也不小,不是像LeetCode那样直接叫你写个DP、排序什么的,而是给出一个实际问题,需要将其抽象成一个计算机问题,然后才是代码实现。前两面顺利通过。此时已经是下午4点多了,HR说三面安排不过来,让回去等。这一等直接从8月中旬等到9月初,期间还以为是二面挂了,“让回去等”是委婉的拒绝 ,看来微软还是说话算话的。三面是Boss面,和国内互联网比较像,面项目,问了很多细节,然后根据项目衍生出一个字符串压缩的题目,让写压缩和解压缩的代码。虽然写完了,但是没保证bug free,和面试官聊了聊可能的bug以及解决方案。 过了大概一周,面试结果出来了,没有直接说给Offer,但是说面试反馈非常Positive,让加一个微信群。国庆节之前,收到微软HR电话,让我们稍安勿躁,国庆后会给正式Offer。后来直到10月31日,才收到HR的电话,正式通知Offer详情。接起电话,HR就说准备好纸笔,因为Offer内容比较多,然后就说了Package里面的各种福利,各种美金。总的来说,Package加起来在硕士里面应该是Top级别的,外企各种Balance,不加班,做的是自己喜欢的方向,而且还有可能拿户口,甚至人肉翻墙,可以说这个Offer是非常诱人的。 京东(OFFER) 京东和百度类似,也是部门自己招聘,所以可以面多个部门。我面了AI和大数据部门以及商业推荐部门。印象比较深的是,原本面了一个做分布式的组,一面发现我更适合做搜索和架构,然后就被推荐到一个做京东智能音箱的组,这个组的三面面试官是从雅虎北研过来的,听口音感觉是广东人。因为我是做搜索,智能音箱里面也需要搜索,两个人聊得很不错,面试官当场就说帮我争取SP。 面完技术面之后,过了大概一周,还要进行HR面。面试通知邮件也没说是哪个部门的。其中有个部门的HR面居然是群面,太奇葩了,也是我经历过的唯一一个群面。一屋子3个面试官,6个学生,就菜鸟网络和京东物流的对比展开讨论。首先自我介绍,有清华北大的,也有中科院各所的,还有北邮的。每次讨论我都是倒数几个发言的,对于这种压力测试,真是不适用。不过还好,HR后来跟我说我的表现不错。 HR跟我谈薪资的时候,我客套说差不多就行,后来这两个部门都拿到了Offer,薪资还真的就是差不多,白菜价。因为已经有其他选择,也没有再争取SP。听别人说争取一下能有28左右?感觉京东的定价真是因人而异啊。后来有一天还收到三面面试官的电话,问我去向定哪了,真觉得有点愧对他。 360(OFFER) 本来不打算面360,但是该公司在8月8号组织了一场中科院专场招聘会,在所有OFFER都还没有最终确定的情况下,去360逛一逛也没坏处。360的办公楼在酒仙桥,和MTK在一起,周围在施工,几乎没有吃饭的地方,给人的第一印象不是很好。10点钟到现场之后,已经人山人海了,和菜市场没什么区别,中间等待的时间都超过了面试时间。 面试分为三轮,前两轮是技术面,第三轮是HR面。一面问了一些基础知识,写了一两个算法题。二面遇到了负责360地图开发的程序员,因为地图中也涉及POI搜索,聊得很欢。HR面被问到知道360的哪些产品,虽然我现在一个360的产品都不用了,但是知道的还是不少。 面完之后,觉得Offer稳了,然后开心的回所里。第二天收到邮件通知,面试通过,还需参加一个在线笔试,类似于行测。做完之后,查看状态,被告知所有面试笔试都通过了,个人信息已经在Offer池中,但是没有正式Offer。Offer池是什么鬼,也就是没人要被扔到池子里等人捞呗。问了下其他人,大部分也是被扔到池子里了,只听说有一个人收到书面Offer。从此对360无感,无论是你们组织面试,还是我们参加面试,费了一天劲,硬是不发OFFER,坑爹。后来在10月16日,收到一封360的邮件,正式书面Offer,难道是被人相中捞起来了,真是无语。拒。 阿里巴巴(FAILED) 阿里内推只能选一个部门,内推失败之后也只有一次校招机会,所以大家选部门一定要慎重,根据自己的实力和兴趣进行选择。当时群里给出了蚂蚁金服的内推消息之后,我第一时间就选择内推蚂蚁金服了。结果面了两轮之后查状态已经挂了,也没感觉面得差。可能是因为内推蚂蚁金服的人太多了,实力要求也很高,而且自己做搜索引擎的,和蚂蚁金服不太match。 因为内推挂了之后,无法再面其他部门了。只能参加校招流程,校招在线笔试之后一直就没消息,状态也没更新,难度笔试挂了? ...

February 4, 2018 · 1 min

厦门之行

2017年12月7日~13日,打着参加“第三届全国质谱分析学术报告会”的旗号,实验室一行11人开启了为期一周的厦门之旅。有关学术交流的总结报告,已经在实验室内部分享了,这篇博客还是来聊聊吃喝玩乐的事吧:) 第一次乘坐飞机 本次出行分为飞机组和火车组,大部队说飞机不安全要坐火车,我因为想体验一下乘坐飞机的感受,于是选择了飞机组。第一次坐飞机,体验有三点:1)快。从北京到厦门,横跨整个中国,只花了3个小时,真的好快,除去吃午餐等时间,连一部电影都没看完!2)噪。起飞和降落的时候噪声特别大,平飞的时候噪声也不小,而且快要到目的地时,会有短暂的耳胀,孙老师说第一次坐飞机的人好像都会出现耳胀的情况。还有就是有时候飞机比较颠簸,放在桌子上的水都快晃出来了。3)美。我因为第一次坐飞机,特地选了一个靠窗的位置,想体验一把俯瞰神州大地的感觉。从窗户往下看时,地形地貌和谷歌卫星地图一摸一样,窗外的云就像一朵朵棉花糖,很漂亮,很像各种神话剧中的天庭。 飞机上不让开手机,这是在北京首都国际机场起飞前抓拍的照片,以后坐飞机记得带相机 南国风光 下飞机之后,立即体验到了厦门这座城市的“热情”,20℃左右的温度,卸下厚重的羽绒服,看着路边的红花绿叶正艳,来到沙滩上,吹吹海风,一身清爽。南方的城市由于经常下雨,街道看起来很干净,柏油马路显露着其原本的黝黑色,路边的叶子绿的发亮,不像在北京被蒙上厚厚的一层灰。路上车辆和红绿灯不多,也很少听到鸣笛,听说厦门全岛禁止鸣笛,斑马线处虽然没有红绿灯,但是有摄像头,强制车辆遇到行人时必须礼让。这种规定在北京是不可能实行的吧。总体而言,厦门彰显了南方城市应有的魅力,和杭州类似,但又更加清新靓丽,是一个休闲生活的好地方。 厦门大学——也许是中国最美丽的大学 本次参会,我们特地提前一天到达,留出时间来参观游览,地点之一就是厦门大学。厦大很美,这是来自一个在武大待了4年的人的由衷赞美。得益于其依山傍水的地理位置,校园内有锦绣的芙蓉湖、美丽的情人谷水库等景点,气氛十分静谧,这点相比于武大小小的鉴湖就好很多。由于地处热带,校园内随处可见高大挺拔的棕榈树,配上古朴的清水墙、多彩的琉璃顶,给人一种别样的美感。如果你要问厦大和武大哪个更美,我只能说她们都美!武大是幽静娴雅的大家闺秀,厦大则像开放热情的新时代女子。武大更加符合中国传统的园林审美,厦大更具风情和现代气息。两校都有山有水,都无愧于中国最美丽的大学的称号! 看见有人在厦大的情人谷水库泛舟,真是“亦可赛艇”呀:) 厦大还有一个特别的地方——芙蓉隧道,长达一公里,隧道内壁两侧,画满了风格各异,色彩缤纷的涂鸦,号称是中国最文艺的隧道,中国最长的涂鸦隧道。致青春,怀念那种开放、包容的大学氛围。 环游鼓浪屿 会议结束的那天下午,我们前往国家5A级旅游景区鼓浪屿风景名胜区游玩。鼓浪屿,面积不到2平方千米,人口约2万,有“海上花园”、“万国建筑博览会”、“钢琴之岛”之美称。除环岛电动车外不允许机动车辆上岛,因此气氛幽静。2005年《中国国家地理》杂志将鼓浪屿评为“中国最美的城区”第一名。2017年7月在波兰克拉科夫举行的第41届世界遗产大会上被正式列入《世界遗产名录》。鼓浪屿、厦门岛和大陆的关系,就像月球、地球和太阳的关系。 我们首先从厦门国际邮轮中心乘坐邮轮前往鼓浪屿的三丘田码头,邮轮北边能看到远处横跨鹭江海沧大桥,非常的简洁漂亮,据说是亚洲第一、世界第二(仅次于丹麦)的三跨连续全漂浮钢箱梁悬索桥,代表着20世纪中国建桥水平最高成就。由于是国际邮轮中心,所以也能看到不少外国邮轮,我当时就看到了欧洲和韩国的邮轮经过。 20分钟之后,就到达了鼓浪屿的三丘田码头。我们沿着鼓浪屿的海岸线,优哉游哉的走着,嬉笑打闹,听着浪涛声,赏着落日余晖,好不惬意。 我们原本是打算步行环岛游览一周的,但是走到卢戆章雕塑的地方,好多人都走不动了,打算穿过岛屿,提前返回。我个人其实挺想继续前进到鼓声洞的,鼓浪屿名称的由来就是因为在鼓声洞能听到阵阵浪涛拍击岩洞而发出轰隆巨响。 横穿鼓浪屿的路不是很好走,蜿蜒曲折、上下颠簸,走到龙头路小吃街的时候,大家都饿得不行。小吃街排队的食客特别多,为了早点吃饱,大家分头行动,每两三个人排一家店,所以最终还吃了不少美食,比如沈家闽南肠粉、小马哥起司马铃薯、汤满贯等。有意思的是,在沈家闽南肠粉和小马哥起司马铃薯的中间,有一家土耳其冰淇淋店,两边的食客都排起了长龙,唯独这家店门前冷落鞍马稀。大家吃着美食就开始聊起来了,虽说厦门冬天不冷,但也没有热到对冰淇淋有那么大的渴望。更重要的是,走到此处的游客肯定饿了,首先想到的是填饱肚子,冰淇淋属于饭后甜点,应该算“奢侈品”了,如果这个店换成“土耳其烤肉”,估计能火,哈哈。 岛上其实还有很多景点,比如风琴博物馆、菽庄花园、日光岩、海底世界等,但是我们都没进去,可能是因为沿途的风景太美了,这些收费的室内景点还不足以吸引我们吧。鼓浪屿的风景太美,可玩、可看的景点太多,半天的时间绝对不够用。下次再去,一定要细细品味。 http://j.map.baidu.com/M2cPN 厦门植物园 回北京之前,我们去了火车站附近的厦门植物园游玩。厦门植物园也称为万石植物园,背靠五老峰南普陀,集植物景观、自然景观、人文景观于一体,景色相当不错。我们沿路经过了百花厅、奇趣植物区、新碑林、摩崖石刻、长寿峡、半山观景台、多肉植物区、雨林世界、药用植物区,看到了很多奇花异草,整个行程在多肉植物区看到高大的仙人掌时达到高潮,非常值得游览的一个景点。 厦门植物园石碑 类似食人花的猪笼草,开启之后像一个笼子 奇丑无比的白花异木棉 万石丛中 半山观景台,背景是厦门世茂双子塔 疯狂生长的仙人掌和仙人球 类似毛毛虫的仙人掌。。。 放了一个大招,生出许多仙人掌:) 胡吃海喝 在厦门的这一周,大家都说不是在吃就是在吃的路上,不论是酒店的自助餐还是在外面吃饭,都吃得很不错,我基本上每餐都是十分饱。在酒店的伙食,相对来说,早餐是最好的,午餐和晚餐比较一般,可能是因为早餐酒店提供,午餐和晚餐是会议主办方提供吧,毕竟会议注册费很便宜,伙食也不会太好。不过每餐都有海鲜、厦门特色沙茶面、各种肉、水果、甜点、饮料,相比于北京的食堂是好太多了。 丰盛的早餐 到厦门的第一天晚上,我和师弟去中山路小吃街逛了逛,结果并没有任何惊喜,感觉全国的小吃街都差不多:烧烤、臭豆腐、各种煎饼包子、粥、饼。中山路的新华书店倒是值得一逛,他们家第三层的书不少,国内外文学、小说、工具书一应俱全,一改我对新华书店只有教科书的旧思想。 在外面吃的话,每餐必点被称为花蛤的“虫子”,还有另一种称为蛏(cheng)子的“虫子”,和花蛤很像,但是是长方形,且有两条美腿。知乎上有一个回答仔细的辨析了花蛤、蛏子、蚬子、蚶子、蛤蜊、海瓜子、贝壳的区别,很有意思。不过话说这些海底动物长得都很奇怪,有些还有很多软体触角,看着让人恶心。席间,有个师兄讲了个笑话,问为啥海底动物长得都这么丑,答案是因为海底没光,反正都看不见,大家就随便长长了:)。 说到海产品,必不可少的是鱼了,厦门的清蒸金昌鱼非常好吃,味道鲜美,没有小刺,和上次在杭州吃到的西湖醋鱼简直是一个天上,一个地下,强烈推荐。 ...

December 16, 2017 · 1 min

逻辑回归之Python应用实例

上一篇博客主要介绍了逻辑回归的理论知识,这篇博客咱们用Python机器学习包sklearn中的LogisticRegression做一个分类的实例。 数据还是学生样本,只有两个特征,分别是两门课的分数score1和score2,类标号y表示这个学生是否能被录取。先上分类效果图: 完整的Python代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 # -*- coding: utf-8 -*- """ Created on Wed Nov 08 17:49:41 2017 @author: zhenlin """ import numpy as np import pandas as pd from sklearn.cross_validation import train_test_split from sklearn.linear_model import LogisticRegression import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve from sklearn.metrics import classification_report # 1. 构造数据 sample_number = 200 # 第一个高斯分布参数 mean1 = [0, 4] # 两个维度上的均值 cov1 = [[5, 3], [3, 10]] # 两个维度的协方差矩阵,必须满足对称半正定 # 第二个高斯分布参数 mean2 = [7, 5] cov2 = [[7, 2], [2, 15]] # 从两个二元高斯分布中随机采样数据点 class1_x1, class1_x2 = np.random.multivariate_normal(mean1, cov1, sample_number).T # .T表示转置 class2_x1, class2_x2 = np.random.multivariate_normal(mean2, cov2, sample_number).T # 两个高斯分布对应两个类标号 data = [[class1_x1[i],class1_x2[i],0] for i in range(sample_number)]+[[class2_x1[i],class2_x2[i],1] for i in range(sample_number)] # 填充到pandas中 data = pd.DataFrame(data,columns=['score1','score2','result']) score_data = data[['score1','score2']] result_data = data['result'] # 2. 训练模型 average_precision = 0 # 平均准确度 iters = 10 # 交叉验证次数 for i in xrange(iters): # 数据划分,80%用于训练,20%用于预测 x_train, x_test, y_train, y_test = train_test_split(score_data, result_data, test_size = 0.2) # 构造默认逻辑回归模型 model = LogisticRegression() # 训练 model.fit(x_train, y_train) # 预测 predict_y = model.predict(x_test) # 计算测试集上的准确度 average_precision += np.mean(predict_y == y_test) average_precision /= iters # 3. 绘制分类面 - 法1 x1_min, x1_max = score_data['score1'].min() - .5, score_data['score1'].max() + .5 def generate_face(prob): y = -np.log(1.0 / prob - 1.0) n = 500 x1 = np.linspace(x1_min, x1_max, n) # w1x1+w2x2+b=y x2 = (-model.coef_[0][0] / float(model.coef_[0][1])) * x1 + (y - model.intercept_) / float(model.coef_[0][1]) return x1, x2 pos_data = data[data['result'] == 1] neg_data = data[data['result'] == 0] plt.scatter(x = pos_data['score1'], y = pos_data['score2'], color = 'black', marker = 'o') plt.scatter(x = neg_data['score1'], y = neg_data['score2'], color = 'red', marker = '*') face_04_x1, face_04_x2 = generate_face(0.4) face_05_x1, face_05_x2 = generate_face(0.5) face_06_x1, face_06_x2 = generate_face(0.6) plt.plot(face_04_x1, face_04_x2) plt.plot(face_05_x1, face_05_x2) plt.plot(face_06_x1, face_06_x2) plt.xlim(score_data['score1'].min(), score_data['score1'].max()) plt.ylim(score_data['score2'].min(), score_data['score2'].max()) plt.xlabel('score1') plt.ylabel('score2') plt.legend(['prob_threshold = 0.4', 'prob_threshold = 0.5', 'prob_threshold = 0.6'], loc='center left', bbox_to_anchor=(1, 0.865)) plt.show() # 4. 绘制分类面 - 法2 pos_data = data[data['result'] == 1] neg_data = data[data['result'] == 0] h = 0.02 s1_min, s1_max = score_data['score1'].min() - .5, score_data['score1'].max() + .5 s2_min, s2_max = score_data['score2'].min() - .5, score_data['score2'].max() + .5 # 生成s1在[s1_min, s1_max],且s2在[s2_min, s2_max]的网格数据点 # meshgrid含义参见:http://blog.sciencenet.cn/blog-791749-675394.html s1, s2 = np.meshgrid(np.arange(s1_min, s1_max, h), np.arange(s2_min, s2_max, h)) # 把两个坐标的值按列拼在一起构成二维数据点 Z = model.predict(np.c_[s1.ravel(), s2.ravel()]) # 绘制边界和散点 Z = Z.reshape(s1.shape) # 坐标点是(s1[i], s2[i]),对应颜色是Z[i],颜色主题使用plt.cm.Paired plt.pcolormesh(s1, s2, Z, cmap = plt.cm.Paired) plt.scatter(x = pos_data['score1'], y = pos_data['score2'], color = 'black', marker = 'o') plt.scatter(x = neg_data['score1'], y = neg_data['score2'], color = 'red', marker = '*') plt.xlim(s1.min(), s1.max()) plt.ylim(s2.min(), s2.max()) plt.xlabel('score1') plt.ylabel('score2') plt.show() # 5. 评估模型 # 对于测试数据,模型输出1的概率 answer = model.predict_proba(x_test)[:,1] # 计算不同概率阈值下的P和R precision, recall, thresholds = precision_recall_curve(y_test, answer) # prob > 0.5的报告为1 report = answer > 0.5 print(classification_report(y_test, report, target_names = ['neg', 'pos'])) print('average precision: %f'%average_precision) # 6. 绘制PRC曲线 # step阶跃图,在点(recall[i],precision[i])进行跳变 plt.step(recall, precision, color='b', alpha=0.2, where='post') # 对PRC下方填充颜色 plt.fill_between(recall, precision, step='post', alpha=0.2, color='b') plt.xlabel('Recall') plt.ylabel('Precision') plt.ylim([0.0, 1.05]) plt.xlim([0.0, 1.0]) plt.title('2-class Precision-Recall curve') plt.show() 下面将逐模块介绍代码细节,大神可以略过。 ...

December 5, 2017 · 4 min

初探逻辑回归

最近实验室在组织学习NG的机器学习视频,我也跟进了一下。讲到逻辑回归那一课,一直想不明白,逻辑回归到底是怎样分类的?逻辑回归的分类面在哪里?逻辑回归有像SVM的max margin那样清晰的推导过程吗?为什么需要Sigmoid函数?今天就让我们来一窥逻辑回归的始末。 假设有一堆学生样本,为了简单起见,只有两个特征,分别是两门课的分数score1和score2,类标号y表示这个学生是否能被录取。可视化如下图,黑点表示y=1即被录取,红点表示y=0即未被录取,可以看到黑点处在score1和score2都比较高的区域。我们的任务就是给定这些训练样本,需要确定一个分类面来划分这两类数据。 分类面的实质就是\(y=\mathbf{w^T x}+b\),其中\(\mathbf{w}\)和\(\mathbf{x}\)都是向量,对应到本例中,展开为\(y=w_1x_1+w_2x_2+b\)。所以,寻找分类面的过程就是寻找倾斜度\(\mathbf{w}\)和截距\(b\)。 因为分类的结果是离散的,只有0或者1,可以用感知机来分类。即 但是怎样找这里的\(\mathbf{w}\)和\(b\)使得分类结果最好呢,我们需要定义一个优化的目标函数或者说损失函数。这里只能定义为分类错误的个数,只能一点点挪动超平面来找分类错误最少的超平面了,即只能用暴力枚举的方法来找\(\mathbf{w}\)和\(b\)。 另一种方法是令我们的分类面算出来的值和真实标号越接近越好,即最小化误差\((\mathbf{w^T}x^{(i)}+b-y^{(i)})^2\),然后通过梯度下降求解\(\mathbf{w}\)和\(b\)。 但是这会有一个问题,对于上图数据,可以求到一个比较好的分类面,如下左图。但是如果数据中出现了如下右图右边的一个离群点或者噪声,为了最小化这个点的误差,即\((\mathbf{w^T}x^{(i)}+b-1)^2\),导致分类面往右偏了,这一偏直接导致很多y=1的样本分类错误。所以这种最小化误差的方法对离群点很敏感。 假设分类超平面还是\(f(\mathbf{x})=\mathbf{w^T x}+b\),我们希望的分类效果是这样的:\(f(\mathbf{x})=0\)是分类面;\(f(\mathbf{x})>0\)分类为1,且不管\(f(\mathbf{x})\)多大,都分为1;\(f(\mathbf{x})<0\)分类为0,且不管\(f(\mathbf{x})\)多小,都分为0。 因为类标号是离散的{0,1},所以想到把\(f(\mathbf{x})\)映射到[0,1]之间,即\(g(f(\mathbf{x}))\)。为了满足上述条件,\(g(f(\mathbf{x}))\)需要满足: \(g(0)=0.5\),即在分类面上无法判断类标号是0还是1 当\(f(\mathbf{x})>0\)时,\(g(f(\mathbf{x}))>0.5\) 当\(f(\mathbf{x})\rightarrow+\infty\),\(g(f(\mathbf{x}))\rightarrow 1\),且\(g'(f(\mathbf{x}))\rightarrow 0\),即对于上右图右边的离群点,分类为1,且导数趋近于0,表示对其不敏感 当\(f(\mathbf{x})<0\)时,\(g(f(\mathbf{x}))<0.5\) 当\(f(\mathbf{x})\rightarrow-\infty\),\(g(f(\mathbf{x}))\rightarrow 0\),且\(g'(f(\mathbf{x}))\rightarrow 0\),和第3点类似 满足上述性质的函数之一就是Sigmoid函数,其定义域为\([-\infty,+\infty]\),值域为[0,1],正好把原始的函数结果\(f(\mathbf{x})\)映射到了[0,1],而概率的取值范围正好是[0,1],所以Sigmoid函数正好可以作为分类为1的概率。 所以逻辑回归最终的形式就是: $$g(\mathbf{x})=\frac{1}{1+e^{-(\mathbf{w^T x}+b)}}$$分类面依然还是\(f(\mathbf{x})=\mathbf{w^T x}+b=0\),因为\(f(\mathbf{x})=0\)时,\(g(\mathbf{x})=0.5\),正好满足上述条件1。 Sigmoid函数的另一个优点是,它把原始函数值映射到了概率空间,这样就可以用极大似然的方法求解参数\(\mathbf{w}\)和\(b\)。下面用参数\(\mathbf{\theta}\)代表参数\(\mathbf{w}\)和\(b\),用\(h_{\mathbf{\theta}}(\mathbf{x})\)代表\(g(f(\mathbf{x}))\)。则有: $$P(y=1|\mathbf{x};\mathbf{\theta})=h_{\mathbf{\theta}}(\mathbf{x})$$$$P(y=0|\mathbf{x};\mathbf{\theta})=1-h_{\mathbf{\theta}}(\mathbf{x})$$合并成一个式子就是: $$P(y|\mathbf{x};\mathbf{\theta})=h_{\mathbf{\theta}}(\mathbf{x})^y(1-h_{\mathbf{\theta}}(\mathbf{x}))^{1-y}$$由于所有样本独立同分布(I.I.D.),似然函数就是 $$L(\mathbf{\theta})=P(\mathbf{y}|X;\mathbf{\theta})=\prod\limits_{i}P(y^{(i)}|\mathbf{x}^{(i)};\mathbf{\theta})=\prod\limits_{i}h_{\mathbf{\theta}}(\mathbf{x}^{(i)})^{y^{(i)}}(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))^{1-y^{(i)}}$$最大化似然的含义就是,在给定样本\(X\)的情况下,我们想找一个参数\(\mathbf{\theta}\),使得观测到类标号\(\mathbf{y}\)的概率最大。 最大化似然等价于最大化log似然,log展开之后就是: $$l(\mathbf{\theta})=logL(\mathbf{\theta})=\sum\limits_{i}y^{(i)}logh_{\mathbf{\theta}}(\mathbf{x}^{(i)})+(1-y^{(i)})log(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))$$而很巧的是,最大化log似然,其实等效于最小化log对数损失。对于单个样本,损失为: $$cost(h_{\theta}(\mathbf{x}),y) = \begin{cases}-log(h_{\theta}(\mathbf{x})) & \text {if y=1} \\ -log(1-h_{\theta}(\mathbf{x})) & \text{if y=0} \end{cases}$$即如果正确类标号是1,但算出来的\(h_{\theta}(\mathbf{x})\)很接近0的话,则损失\(-log(h_{\theta}(\mathbf{x}))\)就会很大。类标号为0的情况类似。把这两种情况合成一个式子就是: $$cost(h_{\theta}(\mathbf{x}),y) = -ylog(h_{\theta}(\mathbf{x})) – (1-y)log(1-h_{\theta}(\mathbf{x}))$$所有样本的损失之和就是: $$J(\mathbf{\theta})=cost(h_{\theta}(X),\mathbf{y}) = \sum\limits_{i}-y^{(i)}logh_{\mathbf{\theta}}(\mathbf{x}^{(i)})-(1-y^{(i)})log(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))$$所以最大化对数似然\(\max l(\mathbf{\theta})\)和最小化对数损失\(\min J(\mathbf{\theta})\)是等效的!最优化求解的方法用梯度下降和牛顿法都可以。 和Sigmoid很像的函数还有很多,比如y=arctan(x)也可以,不过Sigmoid有一个很好的特点,即它的导数可以由自身算出来,\(f'(x)=f(x)(1-f(x))\)。 传统的逻辑回归只能处理二分类问题,那么怎样将其扩展到解决多分类问题呢?有两种方法,一种方法是建立k个二元分类器,比如类标号有A,B,C,则建立3个二元分类器,分别是1)A和非A;2)B和非B;3)C和非C。训练每个2元分类器时,都对所有的数据重新标号为0或1,这样共需要训练k个二元分类器。 还有一种方法是直接将二元逻辑回归推广到多元回归,即Softmax回归,有关Softmax回归的内容,请参考此博客,非常详细。简单来说,二元逻辑回归的假设函数是:多元Softmax回归的假设函数在形式上有所不同:其中是模型的参数。请注意这一项对概率分布进行归一化,使得所有概率之和为1。 Softmax回归的损失函数如下,其实就是logistic回归损失函数的推广: 二元逻辑回归是多元Softmax回归在k=2时的特例,令k=2并利用Softmax回归参数冗余的特点,可以得到一般形式的二元逻辑回归假设函数,具体可以看原博客。 面对一个多元分类问题,是选择Softmax回归还是k个二元分类器呢,这取决于你的类别之间是否互斥,如果互斥,可以用Softmax回归,否则,请用k个二元分类器。 这就是逻辑回归的理论知识,下一篇博客将介绍逻辑回归在Python中的应用。 参考: http://www.cnblogs.com/sparkwen/p/3441197.html https://tech.meituan.com/intro_to_logistic_regression.html http://blog.csdn.net/bitcarmanlee/article/details/51165444 http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

November 26, 2017 · 1 min

2017年国庆旅行——郑州、杭州

今年国庆假期连着中秋,加起来有8天时间,考虑到上半年忙着找工作,太累了,打算利用这个假期好好放松一下。 一、行程规划 9月份的某个周末,规划好行程,制定了人生第一份独自出游的计划。整个过程只花了一天的时间,包括景点规划、住宿、车票购买。其实9月初就在脑海中规划这个事情,当时想的还是2个人同行,但是中间遇到了一些事情,最终只能一个人出游。一个人的话,不用考虑太多,为了节省路上的时间,全程购买高铁票,唯独从杭州回北京的高铁票没有了,幸运的是利用分流抢票软件抢到了一张硬座。住宿方面,一个人住青旅是再好不过了,既便宜、又可以遇到有意思的驴友。国内正规青旅可以在YHAChina上预定,我就是在这个网站上预定了杭州荷方青年旅社。没有在YHA上注册的青旅,可以通过booking.com预定,booking的优势是预定不收费,入住当天前取消也不收费,很不错,我就是在这个网站上预定了郑州的畅旅太空舱宾馆,不过到店之后老板建议我取消网站上的预定,进行线下支付,可以便宜几块钱。。。 二、郑州半日游 3号到达郑州之后开始下雨,booking上的青旅地址有误,浪费了不少时间才找到宾馆并办理了入住。这个太空舱宾馆是在某个高层小区的6层,由居住房改造而成的,开始我还担心是黑店,要求查证件,毕竟第一次住青旅,还是有点担心。后来陆续来了一些驴友,有俄罗斯帅哥、韩国萌妹,又考察了一下房间和网上的照片是一样的,也就不太担心了。太空舱宾馆在医学院地铁站旁边,楼下有一个永辉超市,地理位置还是很不错的。 办完入住之后已经4点多了,行程单上的郑州大学、河南博物馆肯定是没时间去了。于是去了农科路的一家巴奴火锅店吃火锅,一个人吃火锅心里真不是滋味。 回青旅的路上,需要经过二七广场站,虽然有点晚了,但想着别错过郑州为数不多的景点,就跑出来看了看。二七广场周边都是一些商场,没啥意思,二七纪念塔也已经闭馆了。看着联体双塔造型的二七纪念塔,觉得好奇怪,为什么要建成联体的呢,网上查阅资料才得知,此塔为纪念二七大罢工(也称为京汉铁路工人大罢工)中牺牲的汪胜友、司文德两位烈士,我猜大多数郑州人也不知道吧。 三、少林寺一日游 4号早上6:30起床,7点出门去郑州长途汽车中心站,准备坐大巴前往登封市。无奈天公不作美,还在下雨,汽车中心站在郑州火车站旁边,地铁只能到郑州火车站,前前后后还要步行。所以虽然青旅离中心站不远,但到中心站的时候已经8:15了。 中心站大厅有很多自动售票机,而且可以在线支付,所以快速购买了8:40前往登封的汽车票,票价28元。进站的时候,安检居然不让带水进去,太可恶了,只能把水扔掉。上车之后,磨蹭到9点才发车,到达登封汽车站的时间已经是中午11点了。这个时候,有很多黑车拉客去少林寺景区,需要四五十块钱,在我犹豫的时候,直达少林寺景区的8路公交来了,只要5块钱,所以这里提醒大家,从登封汽车站去少林寺景区,等8路公交是最实惠的。 前往少林寺景区的路上拥堵不堪。将近12点才到达景区门口。买了少林寺景区通票100元(学生票半价,后悔本科的时候没多出去玩玩)。 进入景区之后,跟着人群,先后经过了演武厅、少林寺常住院、塔林。演武厅要2点才上演武术表演,所以略过。少林寺常住院里面就是各种殿,比如大雄宝殿、藏经阁。基本上每个殿里面都会有一个佛像,供游客参拜。说实话,这些殿堂,没有解说,看完也就看完了,并没有留下深刻的印象。 3点钟的时候,做了个明智的选择,乘少林索道去看自然风光了(注意嵩杨索道是去看二祖庵的,还是人文景观)。下了索道,瞬间被眼前的景色惊艳住,由于下雨,山上烟雾缭绕,如临仙境;山涧瀑布飞流直下,哗哗作响;三皇栈道奇峰怪石,好不惊险。本来还想去感受下垂悬雾中的吊桥,由于时间关系只得作罢。 回来的路上,雨过天晴,一扫连日来的阴霾,真是豁然开朗,心情极其舒畅! 返程时没必要先坐8路公交到登封汽车站了,在景区出口右侧有从少林寺直达郑州火车站的大巴,票价30,很方便。 四、杭州半日游 5号早上6点起床,赶8点去杭州的高铁。下午1点多到达杭州,根据导航前往荷方青年旅社。走出定安路地铁口,扑鼻而来的桂花香,甜到心里了,看着周围的白墙黛瓦、花格窗棂,我知道我来到江南了! 入住的杭州荷方青年旅社在清河坊步行街的尽头,所以导航的时候,顺带逛了逛清河坊小吃街。沿街的酒幡和各种幌子瞬间有种回到南宋的感觉。旅舍由二十世纪五六十年代的传统江南风格的四合院民居改建而成,傍山而居。白墙黛瓦,花格窗棂,青石板,柚子树,清爽舒适。 办理好入住之后,根据计划前往浙大紫金港校区。浙大今年120周年校庆,校门口站了两个志愿者,看起来一脸青涩,我问他们浙大的外语学院和计算机学院在哪里,他们说他们是大一新生,不知道这两个学院在哪…真不知道志愿者是干啥的。 浙大紫金港校区里面有个人工湖,叫启真湖,还挺大的,有点类似于北大未名湖,湖里还养殖了黑天鹅,比武大的鉴湖有意思。除此之外,其他的建筑并没有太多的特点,也就是一个正常的学校了。走在校园里,也是满园的桂花飘香,此时好想回到武大。 吃过晚饭之后,听说南山路的夜景不错,于是在南山路上溜达了一圈,权当饭后消食。 五、西湖一日游 西湖很大,为了不错过每一个景点,我在网上查了很多攻略,其中知乎上一个用户的骑行线路深得我心,我是完完全全的根据他给的线路图一个景点一个景点遍历的。虽然清河坊离柳浪闻莺最近,但我还是硬生生先骑车到断桥残雪作为起点,固执可见一斑:-) 另外,吸取了游少林寺看不懂人文景观的教训,这次我提前下载了一个口袋导游APP,该APP可以根据定位自动播放所在景点的介绍,很不错。 漫步在西湖边,给我最大的感受就是舒适、悠闲。依然是熟悉的桂花香,随处可见的荷叶,清风徐来,杨柳依依。若是走累了,坐在湖边的石头上,观鱼逗鱼也别有一番乐趣。 这次环游西湖很有意思的一件事是自己和自己玩定向越野。当我来到第一个景点断桥残雪时,我发现有一个御碑亭和对应的标志碑,上面都写着“断桥残雪”,只不过御碑亭上是康熙、乾隆等皇帝题写的,标志碑是中华人民共和国国务院立的。所以西湖十景的每个景点肯定都有对应的御碑亭和标志碑,我当时就决定,每到一个景点,请路人帮我拍一张和标志碑的合影,一来观景有了目标,二来强迫自己开口说话,和路人搭讪。 由于我是严格按照上面的路线图游完的,没有经过双峰插云和三潭印月,所以只有8张合影。 看着这些照片,我只想说路人和路人的拍照水平差别好大:-) 其实重点不是照片,而是寻找标志碑和找路人拍照的过程。比如雷锋夕照的标志碑并不在雷峰塔脚下,而是要走出雷峰塔,去到旁边的小山丘上才能找到。而柳浪闻莺的标志碑就更难找了,这个公园很大,标志碑的位置很隐蔽,我用百度地图导航来回走了3遍都没找到,最后问了景点的一个售货员才知道,这个标志碑在钱王祠前面,路的内测,需要绕一个很长的弯才能找到。最后当我找到柳浪闻莺的标志碑的时候,天已经黑了,由于位置比较偏僻,几乎没有游客,我等了十分钟,终于等来一个游客,帮我拍了一张合影,我猜80%的游客都未曾找到过这个标志碑。 关于拍照。以前自己不敢也不想麻烦路人帮忙拍照,现在算是勇敢的做出尝试,其实路人是很愿意帮助别人的,当然我找的都是年轻人。有意思的是,在雷峰塔脚下,我看到一个和我一样独自游览雷峰塔的年轻人,想自拍又苦于无人帮助,于是我主动提出帮忙,正好也借机让他帮我拍照。互拍完之后我们就散了,没想到登上雷峰塔塔顶之后,我们又相遇了,一阵欣喜之后,又决定互拍。真是猿粪呀。 环游西湖结束之后,准备找一个特色餐厅吃饭。阿溜说她之前在西湖边的外婆家吃过,挺不错的。外婆家的slogan是“我家就在西湖边”,那就去尝尝地道的外婆菜咯。取完号之后发现前面还有40+桌在等,火爆程度可见一斑。幸好带了kindle,就坐在湖边的长凳上看起了《月亮与六便士》。等到大概8点的时候,终于叫上号了。点了西湖有名的西湖醋鱼和东坡肉,还点了一杯稻花米乳。这大概是我点菜最失败的一次了,西湖醋鱼是草鱼,刺太多,而且有点腥;东坡肉一整块也没完全切开,拿下去重新切了之后,一块块七零八落,观感极差。至于稻花米乳,就是真真正正的稻米磨成的汁,无味。虽然菜不好吃,但没尝试过怎么知道呢,所以秉承“勇于尝试”的精神,我并没有感到太沮丧。 回到清河坊特色街已经晚上10点了,为了挑选纪念品,挨个店进去考察。到最后发现能体现杭州西湖特色的也就是印有西湖十景的冰箱贴了,以后决定每去一个地方都买当地的冰箱贴,争取博士毕业前把工位上的墙贴满。 六、西溪一日游 制定计划的时候,考虑到6号骑行环游西湖肯定会很累,所以决定7号去西溪,乘坐游船转一圈,正好歇歇脚。 西溪湿地很大,分为东、中、西三个部分,中部是生活街区,免费开放的,东西部要收费。门票全价80,船票全价60,电瓶车5元。 我在西溪天堂买好所有的票之后,乘坐电瓶车到天目山路周家村出入口,沿着游船线路,先后游玩了周家村→渔村烟雨→深潭口。 周家村在办火柿节,没什么好玩的。渔村烟雨的花样比较多,主要有三个展厅,第一个展厅演示了西溪当地人养蚕织布的情景;第二个展厅西溪人家展示了西溪当地人家的家具、饮食等风格,诸如灶台、风车、打谷机等都和我老家的很像;第三个展厅表演西溪当地人婚嫁的情景,因为此处陆路不通,迎娶新娘只能乘船,挺有意思的。深潭口有一片养殖珍珠的水域,电影《非诚勿扰》曾在这里取景,除此之外,好像没有什么特别的地方。 西溪游船如下左图所示,十几分钟就能从一个景点到达下一个景点,每经过一个景点,就会在船票上戳一个孔表示你不能再在这个点上船了。下次有机会要试一下右图的摇橹船,哈哈。 西溪湿地公园给我的感觉和西湖是完全不一样的,西湖是美景+人文情怀,是阳春白雪似的美,声名远扬,游人如织;而西溪湿地更多的是江南水乡的体现,是下里巴人的美,更加贴近普通老百姓的生活,游人可能只有西湖的20%? ...

October 8, 2017 · 1 min

Gperftools性能分析工具使用教程

上一篇博客简单介绍了Linux平台下不同性能分析工具的特点,最后是Google出品的gperftools胜出。今天我们将举一个用gperftools对链接库进行性能分析的例子。 假设我们创建了一个TestGperftools项目,其中包括一个动态链接库模块complex和主程序main,build文件夹用于存放动态链接库和可执行程序,文件结构如下所示。 1 2 3 4 5 6 7 8 9 10 11 12 13 czl@ubuntu:~/czl/TestGperftools$ tree . ├── build ├── complex │ ├── complex.cpp │ ├── complex.h │ └── Makefile ├── main │ ├── main.cpp │ └── Makefile └── Makefile 3 directories, 6 files 其中complex借用了这篇博客的第三个公式计算圆周率π,主要用来模拟一个很耗时的操作。该模块会生成一个libcomplex.so动态链接库供外部调用。其complex.cpp函数如下: ...

February 7, 2017 · 3 min

Linux性能分析工具简介

这半年一直在研究pLink 2的加速策略,了解了相关的性能分析工具,现记录如下。 对软件进行加速的技术路线一般为:首先对代码进行性能分析( performance analysis,也称为 profiling),然后针对性能瓶颈提出优化方案,最后在大数据集上评测加速效果。所以进行性能优化的前提就是准确地测量代码中各个模块的时间消耗。听起来很简单,不就是测量每行代码的运行时间吗,直接用time_t t=clock();不就好了,但是事情并没有那么简单。如果只进行粗粒度的性能分析,比如测量几个大的模块的运行时间,clock()还比较准确,但是如果测量的是运算量比较小的函数调用,而且有大量的小函数调用,clock()就不太准确了。 比如下面的一段代码,我最开始的性能分析方法是在fun1()~fun3()前后添加time_t t=clock(),然后作差求和的。但是3个fun()加起来的时间居然不等于整个while循环的时间,有将近50%的时间不翼而飞了! 1 2 3 4 5 6 7 8 9 10 11 while (true) { if (fun1()) { for (int i = 0; i < k; ++k) { if (flag1) { fun2(); } } } else { fun3(); } } 一种可能是while循环以及内部的for循环本身占用了较多的时间,但是好像不太可能呀。还有一种可能是clock()测量有误,time_t只能精确到秒,clock_t只能精确到毫秒,如果一次fun*()的时间太短,导致一次测量几乎为0,那么多次的while和for循环调用累加的时间也几乎为0,导致实际测量到的fun*()时间远小于真实时间。所以自己用代码进行性能分析可能会有较大的误差,最好借助已有的性能分析工具。 ...

February 7, 2017 · 1 min

2016年终总结

2017农历新年的钟声都已经敲响了,我这2016的年终总结才开始动笔。 2016年,经历了很多,也成长了很多,遇到了很多曾经以为只会出现在电视剧中的场景,令人开始怀疑这个世界。前几天在朋友圈看到一个同学发的状态,觉得很适合作为这篇年终总结的开端。(同学你要是觉得被侵权了,告诉我,我立马删掉:-)) 每个家庭的故事都会是一部长篇史诗。曾经总以为很多情节只会出现在电视剧中,现实的生活很是平淡无味,没有任何波澜,偶尔甚至还会抱怨一下自己不是故事的女主角,其不知现实的生活相比于电视剧,往往是有过之而无不及。 今天哥哥来电话了,从“天津”,一个美丽的谎言,一直在继续,还会坚持很久… 奶奶很开心… ——by angel 关于学习和科研。上半年在雁栖湖完成了研一的下半个学期,完完全全的结束了自己的学生时代。下半年开始进入实验室,直面惨淡的科研。原本以为会由组里的大师兄超哥指导我,没想到中秋前3天,直接接到H Boss的指令,要在中秋前完成一项我从来没做过的评测。不知道怎样设计实验,不知道怎样计算评价指标,甚至连需要评测的软件都不熟。不过好在加班加点完成了。 凌乱的工位 从9月到10月中旬,一直在各种数据集上做各种对比评测,基本上一周做完一个评测数据集,完成一份报告,直接提交给H Boss,下一周在做另一个评测的同时,要根据导师的反馈建议修改完上一个评测报告。这一个多月的时间,共完成了5份报告共计14个版本,真的是要吐了。 后来发现pLink要比对手慢,于是就尝试各种加速策略。开始从外围查找原因,尝试了各种策略,虽然多多少少能加速,但是效果都不完美,有可能对精度有影响。直到12月份,借助谷歌的开源性能分析工具gperftools才找到了软件的性能瓶颈,开始优化并取得了好几倍的加速效果。12月份对软件本身的性能优化大概是我这半年做的唯一一个和计算机本身有点关系的工作吧,可能也是为数不多的我比较享受的一件事。 整个这半年的工作,都是H Boss御驾亲征,亲自指导,当然这样有利有弊。好处是能直接和H Boss对话,机会难得呀,H那种严于律己、追求完美的品质,H的为人处世、口才都是非常值得我学习的。坦白说,虽然我只是无名小卒一个,但从小到大,真正让我从心里佩服的人没几个,H Boss绝对算是其中之一。当然不便之处也非常明显,首先会感觉特别累和压抑,除了每周一次的面谈,每天的邮件,还经常在晚上11点多收到老师的工作微信。所以这半年确实不轻松,工作日晚上基本都在加班,而且加班到晚上11点也是常事,周末也至少工作一天。几乎没有时间运动,身体素质应该下降了不少。与人的沟通也非常少,好几个师兄师姐都问我为啥看我整天都在工位上坐着,好像从来没有动过。夸张点说就是每天晚上下班要走的时候,才发现自己这一天还没有说话。 当然半年高强度的工作,也有不少的收获,基本摸清了pLink代码的来龙去脉,也加速了两三倍,自己的表现也稍微得到了老师和同学的肯定。不过我自己还是不太满意的,加速并没有达到理想的效果。 关于亲情。随着我们两兄弟的大学毕业,家里的情况也在稍稍好转,但是只能算是曲折前进吧。以前小的时候,都是爸妈两个人闹,现在哥哥出场了,真是可笑。谈了快两年的女朋友,女方父母又是要查户口本,又是催着要付定金,说什么不给定金就要拉回老家相亲。这TM比电视剧还荒唐,真把自己当商品了,是不是给的钱多就跟谁呀,混蛋。哥哥也不是个省油的灯,分手之后没过多久说什么被公司派去新加坡学习了,去了之后,连个固定的联系方式都没有,三天两头失联,都老大不小的人了,还让父母担心。工作了两年,一分钱都没攒到,连大学的助学贷款都要我这个还在上学的弟弟替他还。女朋友分手也就算了,没赚到钱也不要紧,关键是你不能让家人这样担心你呀,你定期给家人打个电话,说说你到底在哪里干什么,既然到了新加坡,发几张国外的照片回来分享一下,不可以吗?已经两年过年没回家了,而且两年除夕居然连个电话都没有,这不是不孝是什么,混蛋。 今年妈妈也终于愿意外出挣钱了,虽然不多,但是起码在和爸爸一起努力。家里装修好了一层房子,但是也就是把墙什么的弄好了,家具还没制备。本来想着过年回家给家里买个小米电视,但是爸妈死活说不要买,现在买了也就过年看几天,不划算。后来只好作罢。放假给老爸买的红米手机,终于在除夕这一天拿到手了。给爸妈包的红包,也在按计划逐年的递增着。 自己有时候也埋怨家里,为什么家境这么的不堪,为什么父母没有达到我理想的高度,为什么哥哥这么不争气,为什么没有人关心我。但是埋怨有用吗,肯定是没用的,还是要看各自的造化。 关于爱情。我还是太幼稚,看看我的家境吧,有哪个女生愿意摊上我家这些破事呢,我就不应该奢望有什么爱情。不过今年上半年,爱情确实来过,抛开所有的一切,纯粹的校园爱情。可是10月份的一件事,彻底打醒了我,爱情没有那么简单,需要考虑的问题太多了。关于那段时间的记忆,写过很多文字,也流过很多泪。回顾整个下半年,欣欣和我的状态都不太好,除了那件事的原因,和工作变化也有很大的关系。我们都从雁栖湖到中关村,需要经历一个由学生到科研工作者的角色转变,面对科研的未知,都显得有些手足无措。科研的不顺,生活的压力以及家里的一些烦心事,一股脑的涌向了我们,矛盾也时有发生。经历过不少的磕磕绊绊,总算顺利度过了2016年,没有了热恋时期的疯狂,生活终要归于平淡。正所谓陪伴是最长情的告白,爱情的意义是否就在于两个人一起经历,一起成长呢。让我们共同守护。 关于友情。是的,我还欠很多人一顿饭。很多同学,如果长时间不见面,恐怕真的要忘掉了。 关于个人提高。上半年忙于课程学习,下半年忙于科研,花在个人提高上的时间真的是太少了。不过感谢有欣欣一直做我的榜样,我现在的小目标就是希望比欣欣看更多的书、刷更多的题。 另外下半年回到市区之后,也去了一些之前没去过的地方,比如:清华艺术博物馆、繁星戏剧村、中国美术馆、三联书店、香山等地。其中前两个地方都是和欣欣一起去的,感觉超棒~第一次看达芬奇的特展,开始了解这样一个天才,后来还看过他的传记;第一次去剧院看话剧,感觉和看电影完全不一样,小剧场的效果也是棒棒的。2016年12月31日也是一个值得纪念的日子: 2017跨年活动~ 今年借着CNCP2016会议的机会,去了一次大连,见识了一下海滨城市的风貌,后来还跑去渤海学游泳,海水很脏,而且咸得发苦。希望今后每年都去一个除了上班地点和家里之外的第三个城市。 大连滨海国家地质公园 大连滨海国家地质公园 最后看看年初计划的完成情况: 完成国科大下学期的课程任务:完成 接手pLink软件:完成 刷完LeetCode所有题目:进度147/461,没有完成 读10本书:目前读了《数学之美》、《大话设计模式》、《我不知道该说什么,关于死亡还是爱情》、《男人来自火星、女人来自金星,卷I》、《只有医生知道,卷I》、《文学的种子》、《讲理》、《暗时间》、《达·芬奇传:放飞的心灵》、《人间失格》,刚好10本,圆满完成任务:-) 去电影院看10场电影:目前看了《美人鱼》、《北京遇上西雅图之不二情书》、《忍者神龟2:破影而出》、《七月与安生》、《湄公河行动》、《比利·林恩的中场战事》、《你的名字》、《血战钢锯岭》,只有8场,其中7场是和欣欣一起看的~ 改正坐姿:有一段时间刻意改正了,但是这东西貌似改不过来? 除了LeetCode完成度太差之外,其他计划完成度还是蛮高的。下面定一下2017年的年度计划: 发表pLink 2文章 至少完成毕业工作的80% 刷完LeetCode所有简单题和中等题,找工作之前最好刷完两遍 找到一个满意的工作 读10本书 去电影院看10场电影 看一场话剧(音乐会、歌剧等都可以) 学会游泳 去第三个城市 简短总结一下我的2016:完成了由上课到科研的转变;开始有能力感恩家人;遇到了欣欣,由一个人变成了两个人;第一次去剧场看话剧。展望2017,找工作和准备毕业迫在眉睫,注定又是繁忙的一年! 最后用汪老师的年终总结PPT封面的一句话来结束吧:

January 28, 2017 · 1 min

电动汽车加电站

今天中午和超哥在食堂吃饭的时候聊起了电动汽车加电站的问题,很有意思。 超哥现在开的是一辆电动汽车,他说目前也挺满意的,只要在北京市内开,几乎没问题,充电桩到处都有,马力也足,开起来没有任何噪声。唯一的问题是需要每天充电,去到稍微远一点的京郊可能会电量不足。 然后就讨论到目前电动汽车的瓶颈,主要还是在电池上,一个是续航时间短,另一个是充电时间慢。 然后我就想现在的加油车为什么没有上面的两个问题呢,第一个问题,如果加的油少的话,是不是也会出现续航时间短的问题呢,所以把电动汽车的电池做大一点,密度高一点是不是就可以了呢,虽然技术上可能会有难度,但是我觉得并没有第二个问题严重,所以我觉得电池续航短不是太大的问题。。。 对于第二个问题,在加油站给汽车加油只需要几分钟的时间,但是电动车在充电桩充电可能需要几十分钟甚至一个多小时,所以充电时间慢确实是一个很严重的问题。我当时就说一辆越野车如果要跑沙漠的话,会在车上预存好几桶油备用,类似的,电动车能不能在车上备上几个电池,没电了就换呢,就像手机备用电池一样。然后超哥进一步说不如干脆在现有加油站的基础上,建一个加电站,每辆电动车进站之后,卸下车上的电池,换上提前充满电的电池,整个过程和加油完全一样,还比加油干净。 我突然觉得,哇塞,这个idea不错呀,统一所有电动车的电池,电池没电之后,到站换电池,一个电池就像一个小型的集装箱(或者docker)一样,被卸下来,然后插上满电电池,so easy~但是为啥没公司这么做呢。此时旁边坐着的一位老师也加入了对话,他说电池寿命有长有短,如果自己刚买的新车,没电了拿去换了一个旧电池,肯定不爽;再说了,要统一全国的电池标准,几乎是不可能的,在全国建这样的加电站,没有哪个公司能承担得起这样的成本,最终羊毛出在羊身上,电动车的价格肯定会上涨的…. 这位老师说的都对,但是我依然觉得这个idea是可行的,关键是要看有关部门有没有这个魄力来做这件事。比如国家或行业层面可以强制统一电池的标准,XX汽车协会规定今后的汽车电池必须做成0.5m*0.5m*0.5m的方块,正负极距离5cm,便于拆卸等;同时要求电动汽车的电池安放位置必须在汽车的后右侧等一些列规定。即使国家层面没人愿意做这件事,哪家有魄力的电动汽车公司,是不是可以尝试一下呢,比如特斯拉,统一旗下所有电车的电池规格,并在全球建造加电站,统一更换特斯拉的电池。如果特斯拉这样做了,我相信买特斯拉的车主是愿意承担一部分费用的,毕竟这样的加电站最终还是方便了自己。至于说新车换到旧电池,其实大可不必担心,说不定你的旧车会换到别人的新电池呢,而且特斯拉可以建立一个标准,只有电池能量转换效率大于80%的电池才能进入加电站循环,这样保证了每个人换到的电池续航有保障,至于新旧,我才不管呢,反正下一次加电又要换了。 我个人还是挺喜欢电动汽车的,节能、环保、静音,还看起来酷酷的:-)好希望这个idea能在未来实现呀~ 知乎:电动汽车为什么不统一电池,充电站更换相同档次满电电池?

January 3, 2017 · 1 min

最怕空气突然安静

最怕空气突然安静 最怕朋友突然的关心 最怕回忆突然翻滚绞痛着不平息 最怕突然听到你的消息 想念如果会有声音 不愿那是悲伤的哭泣 事到如今终於让自已属於我自已 只剩眼泪还骗不过自己 突然好想你你会在哪里 过的快乐或委屈 突然好想你突然锋利的回忆 突然模糊的眼睛 我们像一首最美丽的歌曲 变成两部悲伤的电影 为什麽你带我走过最难忘的旅行 然後留下最痛的纪念品 我们那麽甜那麽美那麽相信 那麽疯那麽热烈的曾经 为何我们还是要奔向 各自的幸福和遗憾中老去 突然好想你你会在哪里 过的快乐或委屈 突然好想你突然锋利的回忆 突然模糊的眼睛 最怕空气突然安静 最怕朋友突然的关心 最怕回忆突然翻滚绞痛着不平息 最怕突然听到你的消息 最怕此生已经决定自己过 没有你却又突然听到你的消息 就好像是突然之间,整个世界都失去了你的声音,以前每天都会收到你的喜怒哀乐、衣食住行、午安晚安,突然之间,空气都安静了,没有了你的消息。翻遍你的空间、朋友圈、微博、博客,都没有消息,不知道你在干什么,好伤心。 想你,想知道你在哪里,想知道你在干什么,想要发消息给你,又害怕不能收到你的回信,然后郁闷一整天。想要引起你的注意,绞尽脑汁故意发一些不着边际的微博,等了一整天,没有收到你的点赞或评论。 约你出来吃饭,你一句简单得不能再简单的“可以”,冷冰冰。见到你,裹着厚厚的棉衣,戴着帽子和手套,没有一丝的眼神交流,两个人就这样默默的吃着不知道什么味道的饭菜。 想要打破这宁静的空气,之前想到无数要和你说的人和事,现在却一句话也说不出。两个最熟悉的人,突然之间,像多年未见的朋友,因完全不同的人生轨迹而没有任何共同语言,成了最熟悉的陌生人。 你说最近科研压力很大,周围的同学又是发论文,又是发专利,你却一无所有。挑战赛答辩和开题答辩在即,手足无措。 你说未来太渺茫,没钱买房买车,就算月入两万,要在北京买房也得攒20年。即使买了房,在北京还要买车还要摇号,看病也很贵,还要担心孩子上学各种问题。 我向来是个不会安慰别人的人,但是我尽力想要告诉你,你已经很优秀了,从小到大的尖子生,多才多艺,研一在雁栖湖那么多高手,你照样轻松拿下第一。你的编程能力也远超你们实验室的人,只不过你目前处于一种有力没处使的状态,你的导师让你干一些杂活,如果你的导师也让专心指导你的挑战赛,你现在肯定也写论文了。 我尽力安慰你,希望你对对未来乐观一点。面包会有的,不要太在意这些东西,生活快乐最重要,不要太在意别人的看法,自己纵向比较有进步就行了。突然觉得自己词穷,完全不会安慰一个人。 世界上比你悲惨的人多得太多了,为什么不想想自己有的,至少你有一个健康的身体。 是的,我猜到了,你不理我和我们上周的体检结果有关。我有病,是的,我有病,而且是不可能治好的病,是随时都可能发病的病。我知道这对于你来说很为难,你有矛盾,我理解,只是我希望你能把你的所有顾虑都告诉我,至少让我和你一起分担,如果你说因为我的病,因为我那卑微的背景,想要离开我,我无话可说,这也无可厚非,我接受。 刚开始交往时,我没有告诉你,是我的错。上周的检查结果至少说明你是健康的,我很庆幸,没有伤害到你。如果因为我而让你不开心,让你纠结,请一定让我知道,我会默默走开,我是一个讲理的人。希望你永远健康快乐。 你说这东西还有窗口期,我认,再过几个月,我们再去检查一次,我默默祈祷你是健康的。我知道你和我一样,对一件微小的事也要纠结半天,我不想让你那样难过。 我原本以为我是一个耐得住安静和寂寞的人,我一度还觉得你像一个叽叽喳喳的小鸟不停的在我耳边发出噪声。直到有一天,我发现你的声音不见了,我开始慌了,不安、烦躁、忧郁充斥我的大脑,想要马上见到你问个一清二楚。也许这就是日久生情,这就是感情吧。 熟悉了你随性而又纠结的脾气;习惯了每次和你一起吃饭时纠结菜里到底有没有混猪肉;习惯了每次吃饭时要双份碗筷和三份汤的感觉;渐渐喜欢上了和你一起漫无目的的逛街试衣服的感觉;习惯了买两本一样的书,然后每次你看得都比我快,逼迫我不得不也快快的看;喜欢和你一起看电影出去玩的感觉。 也不知从什么时候开始,微信里的情侣表情都积了厚厚的一层灰;好久好久都没有掰你了,你的手指应该纤细如初了吧。带上耳机,听了一整晚的音乐,已经很久很久没有听歌了。 以前常常对电视剧里的爱情嗤之以鼻,完全不能理解他们为什么要为爱情哭得死去活来,现在,我大概理解了。 你说每个正常人遇到我这种情况,都会矛盾,会需要思考、抉择和权衡,是的,爱情完全不是小说里的义无反顾,说到底是各种利益的权衡。 10月真是一个让人忧伤的月份,亲人的离世,自己也前前后后进了三次医院,揭开了深藏心底N年的伤疤,曾经一直陪伴在身边的人也想要离开。科研上的压力就更不说了,老板一直不停的催促,每天活得像个陀螺,没有方向的转,没有一丝的停顿。 这病态的社会。 亲爱的,我愿意等你,我尊重你的决定,如果你离开,我会祝福你,如果你留下,我希望你不是在怜悯我。

October 28, 2016 · 1 min