Shawn's Blog

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

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

提升 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…

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…

Linux 下日常使用软件推荐

本来准备总结一下Linux桌面系统使用一年以来的一些感受,以及为什么选择Linux作为桌面系统工作学习的,但是构思了半个小时也没能想到要写些什么。所以还是来推荐一下一年以来在Linux桌面平台下的软件体验和推荐吧。由于我这一年多以来一直使用的是Fedora Workstadion,所以并不能保证这些软件能在其他平台下的体验与我一致,不过一般来说都是没有问题的呢。 0X00 vim + spacevim 首先说明我不认为Vim比IDE写代码更好用,但是我仍然在使用vim。一个原因是觉得使用盗版IDE有些不太道德,另一个也是想要提升一下自己的代码水平,毕竟vim给出的提示会更少一些。IDE用户可以在IDE上安装vim的操作插件,毕竟vim的操作方式还是能很大程度上提升效率的。 SpaceVim 呢是vim的一个插件打包配置集成之后的一个版本。由于它集成了大量精选插件和配置,所以用起来很舒服,就把他当成一个高级的文本编辑器来用就好的。spacevim还有官方的中文文档可以查阅,虽然学习成本相对高一些,但是带来效率和爽快感的提升可不是一点点的。 0X01 ulaunch…

使用 Docker 部署 Sentry 服务

0X00 Sentry是什么 Sentry是一个统一收集整理程序异常错误的服务。如果你有一个程序在跑,并且配置了日志,那么可以轻松的找到程序出错的地方;甚至可以在报错后发邮件通知自己以便抓紧处理。但是如果你的团队有10个项目和50个人,并且这50个人并不是每人只负责一个项目,此时此刻该怎么办呢?难道为每个项目都配置很多人,并且在人员变动和项目变动的时候都去再修改吗?这样就未免有点傻了,Sentry就是用来做这个的。 你可以在Sentry上为每个项目创建一个Project用于收集项目的错误,再为每位成员创建用户,由用户去关注项目,就可以实现上述复杂的功能了。 0X01 如何部署 为了流程简洁,默认安装了docker和docker-compose。 上述命令执行完成后,输出的最后一行类似乱码的东西是我们所需的secret-key,将其复制粘贴之docker-compose.yml文件的SENTRY_SECRET_KEY后面,形似 SENTRY_SECRET_KEY: '***' SENTRY_MEMCACHED_HOST: memcached 然后初始化数据库docker-compose…

Django 中事务的三种简单用法

0X00 什么是“事务” “事务”简单的说就是把一些数据库操作打包起来,要么就全部执行要么就全部不执行。 假设有一个操作是新建一个学生信息,有多张表分别记录了“基本信息、家庭信息、学校信息等“,那么就需要分成多步来新增这个学生的信息。但是如果在添加了”基本信息和家庭信息“两张表的内容后在添加”学校信息“时出现了错误那么数据库中就会存在该学生部分信息,从而使得数据库中的数据出现错误。 如果将这些操作放到一个”事务“中执行就可以在中途出现错误的时候所有数据库操作都不生效,当顺利执行完成之后使所有数据库操作都生效。总的来说就是”事务中出现错误则所有数据库操作都不生效,否则所有数据库操作均生效“。 具体可参见下面几个链接 Database transaction - Wikipedia MySQL Document 0X01 将事务绑定到http请求…

Django 与 Django REST framework 中的这些 "空"

0X00 Django Model中的空 Django的Model常见两个与空有关的参数:null和blank。其中null是数据库层面的是否允许为Null,而blank则将空处理为空值。比如一个CharField的blank=True,那么这个字段在没有赋值的情况下入库,这个字段就会是空字符串而不是Null。 如果将blank=False再不赋值该字段进行保存则入库的就是Null。 所以换句话说,null=True是数据库层面允许存储Null,而blank=True则是允许存入"空字符串"等表示空的值。 0X01 Django REST framework中的空 在Django REST framework的serializer中的字段,有三个与空有关的,都是在创建或更新中生效。分别是allow_blank/allow_null/require这三个。其中allow_blank=True表示着CharField/ListField等允许传入""/[]等空值;allow_null=True表示着允许传入{"name": null, "age":…

Django REST framework 中要注意的几个点

0X00 Model中要注意的几点 verbose_name 和 help_text 属性 Model中通常第一个参数指定的是verbose_name,还要手动指定一个help_text属性。其中verbose_name属性是用来我们自己读的,而help_text是用于提供字段描述类的功能,比如在DJango Admin中verbose_name会变成字段的中文名,而help_text则会变成改字段的描述。 unicode 方法 每一个Model类我们最好都要重写一下这个__unicode__方法,使之返回一个有意义的数据。比如一个学生信息的Model,我们不去重写这个方法,最后在ipython中或是项目中直接调的话就是这个样子的<QuerySet <Student: 1>, <Student: 2>, <Student: 3>]>。如果我们重写了这个方法 那么返回值就是`<QuerySet <Student: (男)小明>, <Student: (女)小红>, <Student: (女)小兰d>]>。不仅是在调试过程中还是程序里都会有不错的效果。 关于choices…

使用 Django 中的 Q 对象查询

0X00 普通的查询 这种查询方式与普通的方式比起来没什么区别。 0X01 AND 把多个条件用逗号分割开就可以了,或者使用&符分割开。 0X02 OR 这里用|符号分割开筛选条件,最终筛选得到的是"所有女生、四川人和叫王铁蛋的人",也就是说相当于分别筛选了这三个条件,最终取了并集。这种查询如果用普通方法进行查询就会很麻烦,可能要写成下面这样: 0X03 NOT 使用Not查询的方式就比较诡异了 0X04 组合技 有的时候经常需要查询同样的条件多次,这种方法就可以一次编写查询条件多次执行

Fedora 中 dnf 命令使用 Socks5 代理

在Linux下安装软件通常会使用包管理工具自动处理依赖问题,在Fedora下一般使用dnf包管理工具。一般我们会给自己的源设置为国内的镜像源,比如 但是有的时候还是避免不了从国外源下载数据,这种情况下经常出现速度巨慢无比甚至会断开的情况。这种时候我们可以给dnf设置通过代理连接网络,这样一来下载速度就会快得多了。 sudo vim /etc/dnf/dnf.conf编辑dnf的配置文件,添加如下配置,保存后再执行dnf命令就可以使用代理的方式连接了。 需要注意的几点: 1. 本示例只是针对我自己的电脑,如果你自己的Shadowsocks配置跟我的不同,请根据自己的配置自行修改(没有密码的可以不写后两项) 2. 示例中使用了socks4://的协议,如果自己有其他方式的代理也可以使用,比如http://等 3. 当不再使用的时候记得将配置注释掉,以防连接国内源也使用代理