Shawn's Blog

git 初步使用经验

0X00 怎样正确使用分支 通常情况下一个git仓库要保持三个及以上的分支,基本的分支明明如下: name | function | master | 正常运行的稳定版本 develop | 正常运行的开发版 feature | 添加新功能的分支 hotfix | 紧急修复bug的分支 如果你已经fork了一份代码到自己本地,当你想添加一个新功能比如「用户管理」的时候,就应该先换到develop分支,然后由这个分支创建一个新的名为feture_add_usermanager的分支。在新分支里编写代码后将代码提交一个PullRequest到自己的develop分支,合并起来后再提交一个PullRequest到团队的仓库中,等待团队其他成员review后就可以正式将代码合并到团队的develop中了。等下一次发布新版本的时候就可以将团队的develop分支合并到团队的master分支中了了。…

用好 Linux 之:软件推荐

0X00 推荐一波Linux下的软件 Linux对于普通用户可能确实没有那么友好,但是对于计算机“专业”人士来说就好多了。我从接触Linux到现在也有个三两年了,而且用Linux桌面也有一段时间了。这段时间里也发现了不少好用的软件和工具,在这里整理一下也向大家推荐一波。这些工具有些是用来提升工作效率的,有些是用来娱乐的等等。。不过每一个都是我离不开的好工具。 非常重要的一点是,我推荐的这些软件除了为知笔记以外都是 免费的 ,而且还有一大半是 开源的 。 0X01 zsh Linux真正效率高的地方就在于Terminal,那我们就需要选一个好用的SHELL。目前绝大多数Linux发行版本都默认使用Bash,这是一个非常好用非常成熟的SHELL。但是有一个更好用的Shell叫做zsh,可以从官网安装也可以直接apt install zsh就装上了。这个shell一定要配合着oh-my-zsh来使用。oh-my-zsh可以让你的SHELL发挥最大的效率。 0X02 vim vim 的好处就不多说了。在这里推荐一套开源的配置,在自己没有配置vim的情况下直接安装就好了。…

Python 使用 virtualenvwapper 管理虚拟环境

0X00 virtualenv好用但有瓶颈 virtualenv固然好用,可以给你每一个Python项目创建一个独立的Python环境互不干扰。有三五个Python项目的时候用的很开心,有十几个项目的时候还凑合,如果有更多的项目virtualenv就会出现瓶颈。因为virtualenv会给每一个Python虚拟环境创建一个目录来保存相关文件,项目一多这个虚拟环境的目录也就多了起来,每次在多个环境之间source ../../../xxx/bin/active 和 deactive 也挺烦的,并且很容易把某些环境搞丢。不过开源世界最不缺的就是解决问题的方法了,既然有人遇到了这个问题,那么八成就已经有了解决这个问题的好办法。 0X01 virtualenvwrapper 这个东西名字确实有点长,顾名思义就是把virtualenv包装起来。首先来安装一波这个东西 安装好后要进行简单的配置 向文件中添加 WORKON_HOME=~/Envs 表示将未来所有的虚拟环境都放在 ~/Envs 中。然后创建这个目录 mkdir -p $WORKON_HOME…

Python中的 *args和 **kwargs

0X00 *args是什么 我们知道Python3中的print从一个关键字变成了一个函数,那么调用的时候我们可以这样调用这个函数,可以随便接受几个参数。 那么如果我们想自己实现类似这样‘变态’的函数该怎么实现呢?这就需要用到*args了,可以将一个非键值对的可变数量的参数列表传给一个函数(换个书佛啊:可以传n个参数给函数,而且n不是固定的),举个例子就容易理解多了。 运行这个例子的输出就是这样的 还有一个更棒的例子来自Gitbook 输出是这样的 这个例子完整的说明了\args的用法,我们传入的第一个参数被函数指定的f_arg接收到了,其余的都被args接收到了。 0X01 **kwargs是什么 写代码的时候还会有一种函数调用,大概是这个样子json.dumps(dict_data)和json.dumps(dict_data, indent=4)。当然,实现这种的方式有一个最简单的方案就是def dumps(input_data,…

Python 中 Virtualenv 和 pip 的简单用法

0X00 安装环境 我们在Python开发和学习过程中需要用到各种库,然后在各个不同的项目和作品里可能用的版本还不一样,正因为有这种问题的存在才催生了virtualenv的诞生。virtualenv可以在电脑上创建一个虚拟环境,可以针对每一个项目创建一个虚拟环境,这样就不用担心各个不同的项目用不同版本的库的时候出现的冲突了。 下面的内容只适用于Linux/OSX,未经Windows环境测试 要使用这个功能还是需要安装,安装virtualenv肯定就得直接用pip安装了,pip install virtualenv就可以轻松装上了。装好之后我们就可以来测试一波了。 0X01 初始化一个空的工作环境 首先在一个空的环境中执行virtualenv --no-site-packages…

使用 Python 操作消息队列 RabbitMQ

内容参考自python - 操作RabbitMQ 0X00 安装环境 首先是在Linux上安装rabbitmq 然后用pip安装Python3的开发包 安装好软件之后可以访问http://115.xx.xx.xx:15672/来访问自带的web页面来查看和管理RabbitMQ。默认管理员的用户密码都是guest 0X01 简单的向队列中加入消息 0X02 简单的从队列中获取消息 0X03 万一消费者掉线了 想象这样一种情况: 消费者从消息队列中获取了n条数据,正要处理呢结果宕机了,那该怎么办?在RabbieMQ中有一个ACK可以用来确认消费者处理结束。就有点类似网络中的ACK,消费者每次从队列中获取了数据之后队列不会立刻将数据移除,而是等待对应的ACK。消费者获取到数据并处理完成之后会向队列发送一个ACK包,通知RabbitMQ这堆消息已经处理妥当了,可以删除了,这时候RabbitMQ才会将数据从队列中移除。所以这种情况下即使消费者掉线也没有什么问题,数据依旧会在队列中存在,留给其他消费者处理。 在Python中这样实现:…

使用 Flask 设计实现一套 REST API【成绩管理系统】

0X00 什么是REST风格的API 众所周知http协议有GET/PUT/POST/PATCH/DELETE等众多方法,还能在提交请求和发送响应的时候携带数据。REST风格的API就是使用了这些HTTP特性的API。针对一个URL可以有多种动词(方法)来表示不同的操作。 更多详细的内容可以点击查看阮一峰的博客:理解RESTful架构 0X01 怎么选用HTTP动词 常见的动词有这五种,可以对应自己的需求选用 | 动词 | 类似的SQL关键字 | 功能 | | |: :|: :| | GET | SELECT | 获取资源 | | POST | CREATE | 创建资源 | | PUT | UPDATE | 更新资源(需要提供改变后的完整资源) | | PATCH | UPDATE | 更新资源(需要提供改变的属性) | | DELETE | DELETE | 删除资源 | 0X02 设计URL REST风格的API因为可以用HTTP的动词,所以URL中是不带有动词的,如果我要获取某个学生的信息应该是[GET]…

Python 中 OS 库的常用方法

在写一些系统脚本或者自动化运维脚本的时候经常会用到os库,这里做个整理,方便查找 os.sep 获得当前操作系统使用的目录分隔符,比如Windows就会得到\而Linux/Unix就会得到/ os.name 获得当前使用的操作系统,Windows是NT内核,所以会得到nt,而Linux/Unix用户则会得到posix os.getcwd() 获得当前工作目录,即当前Python脚本工作的目录路径。 os.getenv() 用来获得环境变量 os.getenv('PATH') os.environ 可以获取并修改环境变量 os.listdir() 列出某目录下所有的目录和文件 print(os.listdir()) os.remove() 删除文件 os.remove('D:/test.file') os.system() 运行Shell或者CMD命令 os.system('ifconfig') os.linesep 获取当前平台使用的行终止符。例如,Windows使用\r\n,Linux使用\n而Mac使用\r。 os.path.split()…

浅析 HDFS

0X00 HDFS的设计 HDFS作为GFS的开源实现,和GFS是高度一致的。在HDFS中有着下面的优点 1. 对超大文件支持良好,由于其分布式实现,可以存储超大文件,甚至单个文件大小可以超过集群中任意一台机器的磁盘大小 2. 采用流式数据访问,一次写入、多次读取是最高效的访问模式。因为Hadoop作为一个大数据处理平台,并没有频繁的写入操作,只是在需要的时候一次将大量的数据写入然后在对这些数据进行读操作 3. Hadoop并不需要运行在昂贵且高可靠的硬件之上,单个节点可能性能可靠性都参差不齐,但是由于其高可靠性的设计,使之能在遇到节点故障时继续运行且不让用户察觉到明显的终端 但是HDFS也不是适用于各种场景,一下的几种场景就不适 1. 低时间延迟的数据访问,因为HDFS是以时间延迟为代价针对高数据吞吐量优化的,所以HDFS不适用与低延迟的数据访问 2. 大量的小文件,因为Namenode的设计是将文件系统的元数据存储在内存中的,所以理论上HDFS中的文件最大数量受限于Namenode的内存容量,因此大量的小文件会占用Namenode大量的内存 3.…

Java 中的字符串

String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。 《Java编程思想》第13章 0X00 String常量池 如果使用常用的方式定义两个内容完全一样的字符串,那么Java使用常量的方式,也就是说第二个字符串并没有生成一个对象而是引用了之前的字符串,导致他们的本质是一样的,所以当使用==判断两个字符串对象是否是同一个对象的时候,会显示是同一个对象。但是如果我们每次声明一个字符串的时候使用new String()的方式,则会每次创建一个String对象,两者就不是同一个对象了。 0X01 StringBuilder 字符串的拼接在Java中非常方便,但常用的使用+来拼接字符串效率很低,在需要拼接的次数不是很多的时候不会影响多少效率,但当需要拼接的字符串数量很多的时候就需要使用StringBuilder来拼接。该类中有一个append()的方法,就是将一个字符串连接到本对象的字符串后面。下面我们来对比一下这两个拼接方法的速度差异。 执行结果如下 使用+连接耗时: 850…