2017年总结

去年没有像往常一样,在31号这天写年终总结,倒不是事情多,最近好不容易有三天假期,玩游戏去了。

去年发生了好多事啊,川普当上了总统,暴雪出了守望先锋,英国脱欧,土耳其军事政变,网络直播更火了,传互联网行业进入下半场,共享单车又火了起来,漂亮的小黄车突然都是。

对我来说,2016年也是非常精彩的一年。这年最大的事情,是我人生中第一次踏出祖国。在德国做交换生的半年,让我的视野和性格变得大有不同。

前年年末的申请本来是抱着试一试的心态的,结果就成功了。很多事情不会等你准备好,你也永远都不会有准备好的时候,要是你想着“这次先算了,等我准备足够充分了再试一试”,那就永远都不会有这个时候。

3月份出发,8月底回国。这六个月像梦一样。现在偶尔挺高在国外经常听的那些歌,在国外的那些感觉就会切实的感觉到。好像自己还在308的厨房,好像刚从Penny回来,可以叫朋友来这里一起做饭吃,好像还还能随时和Igor,Ed,Sah,Ibrahim他们开开玩笑。热情的姐姐Dviya。和国内的狐朋狗友一样的Paul,Juho,Lucas。跨年的这几天,Vj,Ibrahim他们发消息祝福,我更想他们了。我用自己不熟练的语言,和他们表达自己的意思,竟然也能谈心,谈政治。这是一群可爱的人们,来自不同的国家,却相处的很好,性格大差不离。那时候都没什么学习压力,每天都想着去哪里玩。

潇洒了半年之后,回国就感受到了压力。秋招太快,我天真的以为是“秋天”的秋,结果10月份都已经快结束了。准备的不好,败的很惨。也让我明白自己还有很多要学习的,把心态放低,一点一点学。

回国之后在学校分配的公司实习,非常不喜欢,技术太浅太杂,都是些乱七八糟的杂活,幸好后面有时间自己学习了。后来转到一个面试过了的公司,遇见比较亲和,技术靠谱的上司,成长就比较快了。一边学一边用,学的也比较扎实。

今年还做了一件事,从零开始用django搭建疯驴户外俱乐部的官网。从3月份开工,用自己空闲的时间,断断续续开发,也算是上线了。中间接触了Ouath2,微信支付宝支付,移动端适配,部署线上环境,django的数据迁移等各种各样的坑,自己一个人负责所有工作,在难的东西也得自己搞,搞不定就换个方式搞,在搞不定就用本办法丑陋的实现,总之得搞出来。现在整个流程通了,可以不断迭代了。

今年还给csdn写了一年稿子。从稿费看,字数在二三十万吧。今年回国之后,我同时有四份工作,鉴于学校的狗屁学分制度必须去分配的实习,得空就去热心大哥的公司实习(这个比较好),晚上回来写稿子,维护网站。2点睡6点半起,坐1个半小时1辆公交三辆地铁去上班,累的吐血。于是年底的时候,和曙光说csdn这边的稿子,先放一放了。其实写到现在,动力基本上只剩下钱了,可以学到的东西不多。但是一年之前,卢老师耐心的给我校对,出错了也不说什么,稿费照发,我还是很感动的。想快点进步,翻译些优秀的东西出来,对得起自己的工资。

面对选择兼职,选择工作,我都比较果断,判断做还是不做就看两点,给多少钱,能学到多少东西。如果第二点可以的话,第一条可以放宽。学新东西我自己也快乐,这种快乐也算是回报吧。

今年在德国认识了欣,后来恋爱。这也是我第一次比较认真的恋爱吧,有很多快乐的时候,也遇到过很多问题。对我来说,这样的亲密关系难度比较大。因为我这个人比较喜欢简单的方式,和朋友相处有什么说什么,比如有人借我的钱,我会问清楚什么时候还,到时间就要钱,还不了以后就不会再借了,就这么简单。工作上也是,做技术很好的一点就是,没啥人情世故,拿那些钱,做好自己的事,不用看别人脸色。老板要是有毛病,我走人就是了。这么努力的学习,要的就是给自己带来的自信,今天走了,马上能再找一份更好的工作。但是恋爱就不一样了,她是你最爱的人,总不能直来直去的,对我来说,这太难了。我比较傻,吵架吧,总喜欢分析出对错,然后就越吵越厉害,欣又爱哭,所以很多事情让我处理的很糟糕。后来逐渐变好一些了,我不那么较真了,很多事情不用管谁对谁的错,哄哄就过去了。我觉得这就是所谓的情商高吧,我还是适合情商低一点,以后还是把情商都留给女朋友,处理别的事情上随自己的性子,算是个让步吧。欣现在是我生命中非常重要的一部分,这对我以后的计划有很大的影响,我自由自在的生活已经没有了,以后很多事情可能不会由着我的想法了,我们之间还存在很多分歧,比如对游戏的看法上,这些都要以后继续沟通和互相理解。为我们两个加油。

这年过的非常开心,非常精彩。昨天刚吃过了生日蛋糕,发现自己都22岁了,好像突然之间,变成了小时候的自己最想成为的年纪,有自己的收入,没有太大的压力,可以买好多好多游戏,做想做的事情,非常幸福。我前年列的心愿单都实现了,kindle又有了俩,女朋友送了我ps4,还是slim。啥都不缺了,越想越幸福。

2017年自己也有很多小目标,我已经开始努力了。不好意思写出来,怕完不成。给自己加油!

 

AngularJs与Django标签冲突的解决方案

Django和Angular的模板系统使用了非常相似的标签系统,比如说,都是使用{{ content }}表示变量名字。所以Django和Angular配合使用的时候,会引起冲突。我在网上找到了一些解决方法。

一、 改变AngularJs的默认标签

下面的代码可以将Angular原来的标签改成{[{ content }]}

这是比较简单,并且直观的一种方法。修改之后的代码比较容易阅读,一眼就能看出来是Django的标签还是Angular的。缺点是很容易与第三方的插件冲突(如果第三方的插件使用了指令等用到标签的地方)。

二、 告诉Django不要渲染模板的其中一部分内容

从Django 1.5开始,支持{% verbatim %}标签(verbatim的意思是逐字翻译的,字面意思的),Django不会渲染verbatim标签包裹的内容:

这个标签不支持嵌套,但是你可以为标签添加名字:

这样,Django会寻找myblock的endverbatim作为结束的标志,中间插入了verbatim标签,会作为myblock中不解释的一部分处理。

这种方案的优点是,不会增加代码的复杂度,并且是Django的原生支持,对Angular也没有影响。缺点是可能在很多地方用到很多verbatim标签,搞得template很乱。

三、 使用第三方插件

目前,我已知的有django-angular。这个插件有混合django和angular标签的功能。

正确解析angular标签的同时,还可以继续使用django的if等标签。

这样做的缺点是,引入插件增加了代码的复杂度,团队的所有人都需要学习这种写法,我个人感觉,也比较容易增加错误。

我觉得第二种比较合适, 写入变量的时候尽量前后端分开,django负责返回静态的模板,数据交给angular,没大问题。

参考:

  1. AngularJS with Django – Conflicting template tags
  2. Built-in template tags and filters
  3. Share a template between Django and AngularJS
 

记一次Django数据迁移Bug

Django的Model是按照每次的migrations管理(即app下的migrations包)的。每次更新Model之后,都需要先运行python manage.py makemigrations进行生成migration,这些migrations中记录了数据库的变更,然后用python manage.py migrate应用这些更改。

随着项目的增大,migrations也越来越多,每次新的migration都是基于前一次的,也就是说,每次更改数据库,都要把所有的migration走一遍。导致执行migrate的时候速度很慢。比如我们公司的仓库,每次migrate需要二十多分钟。大哥说可以删掉所有的migrations,重新生成,然后用migrate –fake命令“假装执行”,这样做一次,后面的操作都变快了。

今天,我想在自己的项目上用这个方法,于是照着大哥的方法做了遍。本地没有任何问题,做好之后,去服务器操作。结果挂了。服务器的错误如下:

试过很多办法,甚至把本地的数据库都删掉,也无济于事。

其中的一个尝试让我发现,服务器revert回去,先执行makemigrations,服务器没问题,然后git拉到本地,本地竟然出现了同样的问题。

尼玛,坑爹呢这是。

我打开migrations文件,看了看有个叫做('auth', '0008_auto_20160710_0926')的依赖,本地找不到。在项目里面全局搜了一下,也没搜到这个文件。

migrations-git-diff

最后用pycharm全局搜了一下,找到了…… 从pycharm的颜色可以看出,这并不是在项目中的一个文件,而是site-package的文件,竟然也有migrations,好坑啊……

从git diff可以看出,主要是文件名字的结尾不同。django生成migrations文件的明明规则是 次数+内容+时间的。这个不同得从我管理项目的方式说起。我觉得migrations文件不是项目代码的一部分(不是自动生成的),所以将migrations文件夹放到了gitignore中。每次更新数据库,本地做本地的migrations,服务器做服务器的。这样,就造成时间不同,本地是09:26,服务器是10:04. 两个文件名字不一样……所以有了上文的冲突。

比较好的解决方法是:用git连migrations一起管理着,服务器只执行migrate。说不定什么时候我们还需要手动修改生成的migrations呢!

瞎忙活了一下午,给我的教训是……不要手忙脚乱,认真看报错的信息,慢慢推理吧!慌什么呢!

教训2:还是实践让人学习啊,应该用git管理migrations而不是教给django去生成就行了。

 

网络攻防课程科创小组报告

本文是学院要求写的科创报告,用来换学分的。大部分内容都是在凑字数。

大一的时候,参加了一个校内科创小组。

说到这个科创小组,其实我一开始参加的不是网络攻防小组的,是个教PS的。第一节课,讲课的那个学长讲到一个地方卡住了,然后我上去讲的。讲完那节课我就再也没去过。

后来我就换到了这个网络攻防小组,但是还是什么都没有学到。最大的收获,就是认识了顾天宇学长,成为了好朋友,三年以来,在计算机、读书和一些想法。

想来,那时候刚进入大学,很多事情都比较迷茫,比如是不是应该听辅导员的话大一不要买笔记本电脑,买什么样的笔记本电脑,如果制作一个个人博客,怎么学编程,等等。顾天宇学长在这些方面给我的影响都很多。也是从那时候起,开始用wordpress写东西,开始学习用mac,linux。

刚进入大学,我认为自己是对编程有很强的兴趣的。但是上了几节课,我发现并不是这样,我发现自己不喜欢上课。不喜欢老师在上面讲的东西,学了一段时间,也不过是在命令行写个简单的循环判断。和顾天宇学长的交流,让我知道了很多在校内绝对接触不到的东西,让我知道,这个世界上的语言不只有C++和Java,还有很多不同特性,有不同优势的语言。

顾天宇学长送给我很多书。印象比较深的,一本《黑客,计算机革命的英雄》,从这本书中,我认识了很多像卡马克式的人物,我也想成为这样的人,拥有他们的能力,觉得什么不好,自己有能力去修改它们。让我更加坚定自己梦想。另外,顾天宇学长还送给我过很多别的书,《程序员的数学》之类的,还有一本《Objective-C教程》,但是那时苹果正好新开发布会发布了swift编程语言,这本书让我直接扔垃圾桶里了。除此之外,他还有很多不舍得送给我的,但是给我做了推荐,我去买来看,收获颇多。

后来,学长好像看了《葵花宝典》《计算机程序的构造与解释》,走火入魔沉迷lisp不能自拔。我也有学SICP的计划,但是看了第一章之后,就好久没再看了。这本书确实是好书,光是第一章,就让我学到不少东西,以后要找个时间看完。

再后来,学长突然消失了。跑到了瑞典学习了一年。让我第一次也有了出国的想法,于是他回来之后不久,我就去了德国。

很多地方,这些模仿都带给我了一些方法论类似的指导。从这样一个朋友身上,你可以看到生活中另一种可能,可以觉得很多离你很远的东西,其实就在眼前。不会畏惧尝试。就说这么多吧,再多的东西,我写了,你们也不懂。

网络攻防这个兴趣小组当时还有一个学长,姓李。这位学长非常耐心,我装MySQL数据库出问题,他耐心地跑到我宿舍给我调试,非常感激。不过后来就没联系了。大二的时候上体育课帮他喊了十几次到,再也没见到他人。他是个好人。

大学期间,让我一度怀疑上大学是不是个错误的决定。无休无止的生涯规划大赛,大学生生涯导航,看着同学们在台上说我以后要当XX,我对人生的计划XXX。政治课花的精力比计算机课都多,就是计算机课教的也都是十年前的东西。幸好,学院搞了个科创小组,让人激动!虽说什么都没学到,但是认识了气味相投的学长,让我知道自己还是正常的,也能在这种环境中思考和学习。现在我觉得,学习方面,别人能给的也就是个带进门的作用,真正要学到什么东西,还是得靠自己。要是不想学,学习的环境再好,别人再怎么逼,顶多也就是能逼你写完作业,又不能把知识塞进你的脑子里去。所以也就不怨学校的教育制度差、上的课质量不高、流于形式了。况且图书馆那么多书放着去读,已经够幸福的了。

所以说,现在想想,还是非常感激学院的这个项目的。这提供了学长和新生交流的平台,为志趣相投的人提供了相识的机会。我自己从中的收获也很大。真希望能一直办下去。这几年学生组织里我没发现一个办实事的,起码这个东西,还是本着学习的态度的。

 

Git免除每次都输入密码

每次通过git push或者fetch的时候,会被要求输入密码,很烦。通过在服务器加上自己的公钥,就不必再被要求密码验证了。

首先,公钥是针对SSH协议的,HTTPS协议方式的仓库是不可以使用这种方式的。所以第一步先看一下自己的仓库是不是用SSH协议的:查看.git/config文件。

如果是下面这样的格式,就是HTTPS协议的。

改成下面这样:

第二步,在服务器加上自己的ssh公钥。

一般,在~/.ssh/下会有一个 id_rsa.pub文件,通过下面这个命令将自己的公钥保存到服务器上,下一次,从这个服务器上的操作都不需要密码验证了(实际上,所有ssh操作都不需要再次输入密码了)。

如果仓库托管在github上。登录github之后在个人的settings有SSH and GPG keys选项,打开,上文中id_rsa.pub的内容复制过去就行了。

github-ssh-and-gpg-keys

如果没有id_rsa.pub,可以用ssh-keygen(这是ssh提供的)产生一个。

ssh-keygenid_rsa-pub

以后,github的仓库也不需要密码了。

参考:

  1. http://www.cnblogs.com/hanxi/archive/2012/07/31/2616628.html
  2. http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html