0%

0X00 运行一个 Django 程序

运行一个 Django 程序可太简单了,从创建项目到运行起来总共也不超过 5 行代码。项目运行起来了就可以打开我们的 vim 或者 IDE 之类的一顿 coding 了。作为最最最开始写 Django 的同学来说到这里也就了解的差不多了,因为大家都是自己写好代码本地测试一下就提 Pul Request 到上游仓库了,然后什么单元测试、数据库迁移、测试环境版本发布甚至可能包含 docker 镜像更新就全都交给 CI 来做了。自己就这么开开心心的写了一段时间的代码,一切都在朝着好的方向发展。突然有一天部门主管或者老大告诉你有一个新项目要你来开个头,先搭好脚手架然后发布上去,后面再来人一起做功能迭代。
运行一个 Django 程序

然后你开开心心地django-admin startproject xxxx、开开心心地django-admin startapp xxxxx,一顿 coding 之后懵逼了,没有部署过测试环境,没有部署过生产环境,只知道 CI 给做了,却完全不知道做了什么。然后你跑去看 CI 脚本,去问其他同事同学,得到了一堆 Nginx 和 uWSGI 之类的答复。你也照着做了,但是完全不知道为什么,因为你觉得python manage.py runserver明明就可以启动项目了,为什么还需要搞什么 Nginx 和 uWSGI 呢?

阅读全文 »

0X00 前言

一见程序员,立刻想到 web 开发,立刻想到后台管理系统,立刻想到数据展示,立刻想到数据筛选筛选,立刻想到数据统计,立刻想到导出 Excel 表格。产品经理的想象惟在这一层能够如此跃进。 –鲁迅:我不是,我没有,别瞎说

我不是,我没有,别瞎说啊

虽然上面这种说法有点夸张了,不过确实很多很多很多人在工作中遇到过不止一次的需要在一个 web 系统里添加一个”数据导出”的功能,而且通常都是导出成 csv 这种文件。自然我也遇到了很多很多很多次,也写过那种最蠢的手拼逗号的 csv 导出,还看过别人效果更好代码量更少的版本。也就在此总结一下具体这个 csv 导出该怎么搞才好。

最蠢的方案可能就是我最早实习的时候写出来的那种手拼逗号的方案了,为了大家刚吃的早午晚饭着想,就不给大家看了,省得吐出来浪费粮食。真正用的比较多的是这么两种:一种是传统的拼接二维数组的方式来模拟表格,然后通过 Python 的 csv 库直接导出;另一种是使用 djcsv 来进行导出。下面来简单看一下嘞。

阅读全文 »

0X00 前言

啊,这个破系统怎么这么慢。 -你写的程序的用户

是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。

其中可能性比较多,我这里先挑几个我经常遇到的情况来说:不管自己的需求直接查询所有字段、完全不在意索引、疯狂使用in、循环创建/更新数据、不善于使用缓存。这几个问题其实都会对我们的API响应速度造成比较大的影响,下面我们来一个个介绍一下。

阅读全文 »

0X00 前言 & Pythonic

Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。

事先声明,这三个函数都是扩展性质的东西,从来不用这三个函数也可以正常的编写程序,没有什么功能是没了这三个函数就写不出来的。只不过是这三个函数的出现能让之前很丑陋的代码变得精简易读了而已。

这三个函数非常适合搭配lambda来使用,编写非常Pythonic的代码,具体什么是Pythonic其实很难定义,其实就是把Python编程一个形容词了,比如你看到一个人“穿了运动鞋牛仔裤帽衫双肩包黑框眼镜电子表”就会说他“太程序员了”,大概就是这么个意思。总结来说呢就是 非常具有Python特色的Python代码。比如下面这段代码明显就不Pythonic

1
2
for index in range(len(name_list)):
print(name_list[index])

而这种代码就是Pythonic的写法

1
2
for name in name_list:
print(name)

尤其是结合了lambda之后,就能写出更Pythonic的代码了,例如

1
2
3
4
5
def is_boy(student):
if student.gender == 'M':
return True
else:
return False

就可以直接用lambda改写成这个样子

1
is_boy = lambda studnet: student.gender == 'M'
阅读全文 »

0X00 GTD

尽管去做(英语:Getting Things Done / GTD),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。

GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。

​ –维基百科

GTD说白了就是把自己要做的事项从脑子里拿出来,写到纸上或者记到什么鬼地方,我最喜欢的就是”滴答清单”了。

最早的时候我用的是Google日历,在学校里的时候这样用了一两年还不错。后来大四出来实习,那段时间工作哪儿哪儿都不顺利,也就没心情安排自己的生活和学习了,所以实习的那一年基本就是下班了就趴在床上玩手机,什么都没干成。不只是没学习,而是没玩游戏没看电影,实打实的什么都没干成。后面又重拾了GTD,把自己安排的明明白白的,对我来说效果还是立竿见影的。我安排自己不只是学习,也包括社交和娱乐,约好什么时间和谁在哪儿吃饭或者干嘛的;自己给自己规定什么时间玩游戏,给自己规定什么时间看电影。

这样一套流程下来,有两个明显的好处:自己的时间利用率极大的提升了,不会出现坐在桌子前面考虑接下来要干什么的事情;另一个就是方便自己回顾生活,毕竟不写日记的话自己也搞不清楚哪天哪天干了什么事儿了。这里给大家看一下我滴答清单里的任务分类:

这里主要是学习类、个人日常生活类、工作和年度规划。除了每年年底会对新一年进行规划以外,还会在每个月对下个月进行规划。不过正所谓”取法其上,仅得其中;取法其中,仅得其下”,所以也不要因为自己没有完成月内所有计划或者年度计划而自我否定,只要在没有突发事件的情况下都按部就班完成了自己的任务安排,那损失的那一点点跟全局比起来都是小问题了。

安排时间的时候有个问题需要注意:给自己一定的缓冲时间,比如整整一周不要尝试将周一至周五的晚上都安排上学习,然后周六周日又安排三四部电影和游戏时间。因为很大可能你周五晚上下班是要跟朋友约出去吃吃喝喝的,很大可能周末会被叫出去玩或者自己睡过了之类的。而且即使没有这些外在因素,也不应该给自己安排的满满当当的。我自己的建议是这样:周一到周四的晚上安排三次学习,空出来一天用来缓冲;周五晚上不安排,即使没有约也可以自己给自己放个假;周六周日给自己安排一天半的时间,而且然后周六晚上不安排学习,可以的话给周日晚上安排一波学习。

仅从我自己的角度来说,这类GTD方案让我非常受用,不仅时间变多了,也更有节奏了。自己知道周一到周四晚上不该玩游戏,周末又可以玩一整天。时间拍起来之后的生活里我玩到了很多以前觉得没时间玩的优秀游戏,比如战神 塞尔达 GTA5 和一众优秀游戏,也看了很多以前觉得没时间看的豆瓣Top250电影。

阅读全文 »