Shawn's Blog
5 分钟阅读

使用 nose 与 mock 对 Python 程序进行简单的单元测试

0X00 install 安装nose:pip install nose 安装mock:pip install mock Python3 中mock模块已成为标准库,无需单安装 在任意目录下执行nosetests看到有输出就是已经安装好了nose。进入到Python shell中执行import mock没有报错也就是mock安装好了。 0X01 用于测试的代码 这里先贴出这次被测的代码simple_math.py,是一个非常简单的数字计算类。 这里的代码是有问题的,毕竟是要拿来作为单元测试的样例的嘛。 0X02 编写单元测试 我们要针对上述文件创建一个新的test.py来测试其中的MyMath类。 从代码中可以看到首先导入了需要测试的类MyMath,然后就写了几个test_开头的方法,方法内部是模拟调用MyMath中的方法,并将得到的结果与预期结果相互匹配,最终使用assert语法来判断是否返回了理想的值。测试代码写好之后在当前目录下执行nosetest -v来运行我们的单元测试吧,输出结果如下。 0X003 简单解释一下…

2 分钟阅读

Django REST framework 中不那么常用的 Fields

平时使用Django REST framework的时候除了常用的几个字段类型之外其实没有哪些字段是必须的了,不过了解一下这些「非必需」的字段能给日常的编程任务带来大幅度的效率提升呢。 0X00 EmailField 首先是EmailField,这个字段本质上是CharField但是单纯的添加了一个完善的校验,可以免去我们手工编写正则和对应报错信息的过程,简单地定义之后就可以使用了。 0X01 URLField 这里的URLField跟上面的EmailField类似,在CharField的本质上添加了对应的校验,使用时会校验该字段是否符合url的校验规则。 0X02 IPAddressField IPAddressField也是一样,只是在CharField上添加校验。不过有一个针对ip的参数protocol,顾名思义,可以设定校验不同版本的ip地址。protocol参数的值从这三个中选一个both/IPv4/IPv6,其中默认选择的是both,也就是说同时会接受IPv4和IPv6两种地址。 0X03 DecimalField 带有精度的…

6 分钟阅读

职场新人培训总结

上周参与了公司举办的针对应届毕业生员工的一次培训课程,讲到了职场新人需要注意的一些问题。每个人的收获都是不同的,针对我自己认为的重点总结一下也算是给两天的时间一个交代。 0X00 同理心与同情心 同情心和同理心我们大家多少都会听过,不过多数人可能都会像我一样没有思考过其中的区别。其实同情心大家都会有,比如你看到一个人流离失所,被家人朋友抛弃,身上破破烂烂蹲在马路边乞讨,多少都会有些同情他,比如给他一些零钱之类的。这能够算是同情心,但是同情心并不是帮助别人的良好方案。我们古人就有“嗟来之食”之说:一位乞讨的人在面对别人用脚踢来的食物时宁可饿死也不会吃一口。我们也都知道既然要给别人食物就不应该用脚踢过去。所以这个提供食物的人是具有同情心的,但是不具有同理心。同理心强调“感同身受”,这不是随随便便就能做到的。 具有同理心的人肯定不会用脚踢过去,可能会带着食物过去他旁边聊起天来。说一说自己以前窘困的时候也是饥不择食,真切的体会他此时的痛苦,在这种情况下大家才能互相坦诚的交流。…

9 分钟阅读

作为实习生的一年

0X00 When and Why 我是大三下学期即将结束的时候出来实习了,故事说来比较诡异。一天下午像往常一样背着包到教室准备上小学期的课程(小学期就是为期一个月的综合实践),一个朋友跑过来悄悄跟我说“hey 大家都在找实习了,你怎么还不着手找哇”。当时一听我就慌了,很慌的那种慌,然后那天下午把之前准备的简历投了出去。毕竟学期即将结束,其实我是想要回家过一个暑假的,所以我也就没打算真的找到实习,只是说尝试着面试一下赚一些面试经验。那既然目标是赚取面试经验就只投大厂呗,小公司面试经历的用处可能没有那么大。当天下午我就只投递了“知道创宇/知乎/陌陌”三家,结果还没下午课程还没结束呢就收到了创宇的面试通知。另外两家其中一家拒绝了我,另一家一直没有回馈信息。 后来面试还算比较顺利,拿到了offer后就咬牙放弃了最后一个暑假回家的机会,退掉了好不容易抢到的火车票,在2017-07-24就正式入职创宇的实习生岗了。所以说我几乎是被朋友忽悠出来实习的,再加上运气好拿到了创宇的offer,要不然我还要回家过暑假呢,哈哈 0X01 面试&笔试…

3 分钟阅读

Django 中的一些非入门级用法

为什么这里说是"非入门级"用法呢,因为我个人觉得这是我接触Django之后一段时间才开始了解的用法,但是说是高级用法又太夸张了,所以用了这么一个诡异的”非入门级“的定位。 下面的示例中使用下面的model,简单描述一下并非真实代码 0X00 使用Avg()/Sum()/Count()/Max()/Min() 这些方法的用法很简单,顾名思义。不过需要配合下面介绍的annotate()或aggregate()使用。 from django.db.models import Avg, Sum, Count, Max, Min name | function | Avg | 求平均数 Sum | 求和 Count | 计数 Max | 求最大 Min | 求最小 0X01 使用annotate() 最基础的查询就是从一张表中查询符合某条件的字段,而使用annotate()可以得到一些我们手动计算得到的值,并将其作为Queryset中Item的一个属性来调用。…

6 分钟阅读

你为什么需要一台 NAS

自从一咬牙购入了一台Synology之后感觉网络和存储的体验提升了很多。在这里总结一下购买理由,方便犹豫不决的朋友做个参考。 0X00 来自百度云盘的惊悚事件 国内云盘一波洗牌过后,常用的几家都已经GG了,仅有一家百度还存活着。不过百度云说起来是免费的,实际如果使用的比较多的话就会发现,如果不充值为会员的话,速度就会非常的慢。所以说百度云盘也几乎是一个收费的网盘,超级会员算下来要将近30元/月。 其实收费无可厚非,毕竟大家花钱享受服务嘛。不过直到一天,在网上看到了这样一件事: 一个人在自己的百度云盘中上传了大量自己拍摄的照片(纯一手自己拍摄的),过段时间后因为一些原因从百度云盘手动删除了。又过了不短的一段时间 ,该用户再次将自己的这些照片上传至百度云盘,发现居然所有图片都是使用 急速秒传…

1 分钟阅读

Django 中的 F()

0X00 内容比较少,不分标题 我们对Django中的model进行查询时通常是某个字段和一个常量 对比,比如下面这种写法 如果遇到高级的查询可能会使用Q()查询,不过也只是进行多个条件的查询 这里是我的另一篇介绍Q()的博文。 但是如果有这样一个需求:”查询订单中结束时间和开始时间的间隔大于45分钟的“。那应该怎么办的?因为订单的开始时间和结束时间都是一个字段,我们需要对比同一条数据中的两个字段。这时候可以使用F()来查询。 本段内容的官方文档:<https://docs.djangoproject.com/en/2.1/ref/models/expressions/#f-expressions> 本段内容的另一篇博客:<https://www.cnblogs.com/liuq/p/5946803.html>

3 分钟阅读

关于 Python 函数默认值的小问题

Python一切皆对象 0X00 困扰我的一个问题 前两天在工作上遇到了个问题,说来很简单:我要在每天的固定时刻统计系统中当天产生的一些数据并且用邮件发送给指定的人,又考虑到了程序的可复用性(统计其他日期)我并没有把参数写死,而是将其默认为当天的日期并可以指定参数。很容易我就写出了类似下面的代码。Ps.伪代码,不要过分纠结。 并且将其配置在Celery中,每晚执行,并且在得到了第一天的正确数据后默认程序正确了。第二晚虽然收到了统计数据的邮件,但是发现日期是前一天的。以为是Celery或是服务器时间同步问题或是缓存等导致的,但是在多次检查后没有发现这个问题的根本原因。故临时使用crontab去执行这个定时任务,但这并不是长久之计。 0X01 到底发生了什么 纠结问题所在的时候突然想到“会不会函数的默认值在函数初次初始化的时候生成好就不再变了?”故而使用下面这段代码来检验自己的推断。 果然输出的结果和我以前的设想不同,按照我以前的想法应该是输出的几个时间间隔为1s,但是结果却是每一行都相同(果然我的1s不见了)。 0X02 那是为什么呢 Python一切皆对象…

2 分钟阅读

提升 git 新手效率的小技巧

内容比较少,只是今晚翻看教程的时候发现的几个可以替换调我以前一些诡异操作的方法,将其整理贴出。 0X00 git blame 是谁在代码里下了毒?是谁用了一个超酷炫的方法解决了你解决不了的问题?当你想知道仓库中的某行代码是谁提交的,就可以使用这个方法。git blame hello.py可以看到hello.py这个文件所有行的提交人是谁,于何时提交的。而且这个命令最常用的是和grep合用,git blame hello.py | grep prinft(是谁写错了这个单词+_+) 上面的例子是oh-my-zsh中README的部分输出 0X01 git commit --amend 如果你不小心把刚刚的commit写错了,现在还来得及后悔。 如果你刚刚commit,还没有进行新的改动,那么可以使用git commit --amend来修改上一次的commit。输入命令回车之后会打开你的编辑器,最上面的就是本次提交的commit message,动手修改之后保存就可以了。如果commit之后改动了很多才想起来那也可以先git add .再git…

3 分钟阅读

git 中的 bare repository

0X00 遇到了什么 我们使用git,绝大多数情况下都是大于等于一个人进行代码编辑,然后将自己的改动提交到github/gitlab/gogs等仓库,然后再通过pull request/merge request的方式进行代码合并。所以我们一般都是先从github上创建一个新的项目,然后按照向导在自己的本地git clone下来一个空项目,再提交代码上去;或者fork & clone的流程。 以前从来没有去想过github上的仓库是不是和我本地的相同,以至于今天第一次搭建自己的git服务时遇到了问题。我从服务器上一顿操作猛如虎mkdir xxx; cd xxx; git init; touch README.md; git add .; git commit -m "init the repository",结果不小心成了二百五。因为这个仓库根本不能clone到我本地,经过一番搜索发现了git中仓库之间的关系没有这么简单。 0X01 git中一般的repository git中一般的repository通常有两个来源:git clone或者在git…