0X00 Python3的super
Python中对象的概念都快被大家淡忘了,因为一切都是对象(话虽然这么说,但是怎么可能淡忘对象呢)。看下面一段Python2的代码,Python2中麻烦的就是这个super()的用法。
在初学Python的时候,如果是Python2很大可能会在super(Student, self).__init__()这段迷惑好一阵子,不过好在Python2马上就要凉透了,在Python3中可以将代码改写成如下方式
其中super的用法由super(Student, self).__init__()改成了super().__init__(),看起来清晰多了,在使用Python3后不建议以任何理由使用老式Python中的super调用。
0X01 str
写一个自己的类通常都需要实现一个__str__方法,这个方法用于粗略的展示对象,可以看下面这个例子。
可以尝试先把__str__的定义注释掉执行一下,看到的输出应该是类似这样的:
如果再取消__str__的注释,看到的输出就是这样的了:
可以看到输出变成肉眼可识别的了。
通过 str(object)…
0X00 使用docker部署的优势
在使用docker部署之前,一般都是直接将MySQL和Redis这类服务直接安装在机器上的。以至于好多新手才开始安装使用的时候经常会出问题,出了问题解决不了就重装系统然后再重装软件,而且如果想同时用MySQL5和MySQL8就非常麻烦了。话说回来,在生产环境服务器上其实还是很多直装的服务的,不过其实使用docker部署一套相同的环境是非常有利于自己本地开发的。
我个人看来使用docker部署的优势有这几点比较明显的:
1. 很容易做到开发环境、测试环境和生产环境的“环境与版本”大统一;
2. 很容易在开发环境本地同时部署多套不同版本的同一服务;(比如你负责8个项目,这8个项目要用8个不同版本的MySQL)
3. 能很快部署一套开发环境;(事实证明在一台网络环境好的机器上,能在5分钟内部署一套数据库)
4. 整理好配置文件后可以很容易备份整套配置;
5. 安全问题,在物理机上直接装了MySQL,如果部署不够仔细的话有数据库被攻破后危及服务器的风险,而Docker部署的由于容器所在就不会有这种问题;
0X01…
0X00 线程池和进程池
多线程和多进程在平时编程中是挺常见的操作,不过控制进程和线程的数量是一件比较麻烦的事情。尤其是线程,之前在搜索到的关于线程池的内容多数都是“造轮子”,实际上Python已经给我们造好了这个轮子。文档在这里,甚至还是中文的<https://docs.python.org/zh-cn/3.7/library/concurrent.futures.html#module-concurrent.futures>
我这里简单的整理了一下,做个小样例展示出来方便查阅。这里就假装大家对Python有一定的了解,而且也对操作系统中的线程和进程有一些了解了。(哦对了,还需要了解一下GIL才行)
0X01 使用线程池
这段代码执行下来耗时3s大概,因为有两个线程在执行,所以第一次执行了两个任务,第二次两个,第三次一个。可以通过调整range()数量和max_workers来观察输出结果。
0X02 使用进程池
可以看到跟上面线程池的方案比起来就只是把ThreadPoolExecutor换成了ProcessPoolExecutor而已。
0X03 通用的部分…
0X00 前言
实话讲,Django的信号(signal)机制其实用到的时候并不多,但是某些特定场景下一个信号能解决非常大的问题,所以信号这个东西还是值得了解一下的。那么为什么这里只说一些初级内容呢,主要是因为通过调查发现信号的高级知识用(我)的(也)很(不)少(会)。
目前我工作中用到的信号机制也比较少,所以可能有些事情说不到点上还请见谅。那我们开始吧~
0X01 什么是信号
“信号机制”光从名字上来就大概能懂了。应该就是:某人发出某信号,某人接受到之后做一些事情。所以看起来非常类似我们熟悉的“订阅-发布”模式,实际上也也确实很类似。整个信号机制分成这么几个部分:发布者、信号、接收者和一个函数。
我们传统战场上的一个行为来类比会比较好解释
1. 发送者:类似于战场上打信号弹的人
2. 信号:信号弹(信号弹会分成几种比如红色、蓝色、绿色的)
3. 接受者:各个不同阵地都有人观察着战场的信号弹
4. 一个函数:接受者看到信号弹后会对应作出战术动作…
0X00 IO总是比运算慢
众所周知计算机的IO都要比计算慢很多很多,即时是目前民用的高级SSD:三星970PRO,它的读写速度都要比内存慢上几个数量级,更不要说CPU了。所以软件的IO通常都是瓶颈,很多时候都是CPU等内存,内存等磁盘,磁盘等网络。
那么如何才能提升自己web服务的响应速度呢?通常来说简单的操作有如下两种:换硬盘或者改SQL。
0X01 换硬盘
“这难道不是废话吗?”对呀,这就是废话。当瓶颈出现在数据库的查询上了,那么把正在用的机械硬盘换成固态硬盘当然会提升效率,稍微想想就呢能明白的事情。事实上也是这样的,之前我把同样量级的数据从我们的测试环境搞到我本地,测试环境是企业级HDD,而我本地是三星970EVOPlus的SSD,会发现查询同一个内容就快了好多好多。
那其实这个换硬盘并不是好办法,毕竟不能指望全都用上SSD。而且即使用上SSD了,在查询更复杂或者数据量更多的情况下还是会出现瓶颈。那首先想到的方式就是优化SQL了。
0X02 慢查询…
0X00 前言
这篇博客的目标读者:正在使用Linux桌面,打算长期继续使用下去的同学(这也就意味着熟悉Linux下的基础操作,理解Linux下的常见概念)。
这里有一个我之前写的“在Linux桌面下存活”可以参考一下。
0X01 颜值就是战斗力
Linux也不都是黑色背景白色字的命令行。
首先要换的就是一套主题和图标,不论是KDE、Gnome还是Xfce都可以在对应的网站找到大量的主题,简单换过图标和主题之后再配合一张好看的壁纸,整个观感立马就好了不少。
KDE: <https://store.kde.org/>
Gnome: <https://www.gnome-look.org/>
Xfce: <https://www.xfce-look.org/>
然后要换的就是字体了,等宽字体我推荐这几个Hack、Source Code Pro、Cascadia Code都很好看,适合在终端、IDE和编辑器里使用。
最后就是zsh主题,如果使用的是zsh的话推荐使用powerlevel10k这个主题,是由powerlevel9k发展而来的,但是速度比powerlevel9k快好多。…
0X00 前言
这篇博客的目标读者:有Linux使用基础,打算使用Linux作为桌面系统的人(这也就意味着熟悉Linux下的基础操作,理解Linux下的常见概念)。
注:这篇博客不讨论不对比Linux/Windows/MacOS等不同的操作系统。
0X01 首先选择一个发行版本
众所周知Linux是一个内核,在这个内核基础上有很多发行版本例如:Archlinux、Manjaro、Ubuntu、Deepin、Debian、openSUSE、Fedora等等。那我们首先要选择一个来安装到自己电脑上。
基于我自己的使用体验比较推荐使用的是:Manjaro、Ubuntu、Deepin这三个,他们共同的优点是:适合初次使用Linux桌面的人。
Manjaro
基于Archlinux,滚动更新。该发行版本最大的特点是软件版本紧跟最新,而且由于是滚动更新所以不用像多数系统一样隔一段时间来一次大版本更新。只要按照系统提示进行常规系统升级就可以将整个系统一直保持在最新的状态。…
0X00 就算只有一节我也要写标题
众所周知Dockerfile是构建Docker镜像的优良方式,而使用Dockerfile构建镜像最重要的就是为数不多的几个命令,而本次的主题COPY和ADD就是其中两个。我们知道这两个命令都是将文件搞到Docker镜像里用的,那究竟有没有区别,有什么区别呢?
首先我们看一下当前这个目录:
我们有着么一个Dockerfile,可以看到是基于fedora的一个镜像,并且将目录下的excited.tar放进了创建好的shawn目录中
我们可以看到工作目录下已经存在了一个excited.tar了,也就意味着我们成功将这个文件搞进去了。
如果同样的操作用ADD呢?看上去是类似的操作实际上并不是
我们进到容器里可以看到打包文件被拆解了(压缩文件也会被解压)
其实不止这样,ADD 命令还能下载文件:ADD https://too.young/too/simple.pdf /hello就能将文件下载下来并且命名为hello;如果是ADD https://too.young/too/simple.pdf…
0X00 Redis的分库
使用过MySQL或者类似的数据库都应该知道,一个数据库内部是可以分成多个库的。比如MySQL从上到下是MySQL service -> database -> table -> field,但是一开始使用redis的时候好像是没有database这一层的呢?其实是存在这么一层的,redis默认是存在编号0到15这总共16个库的,每个库除了命名空间不同以外都是相同的。也就是说在编号为0的库里set name shawn之后跑到编号为1的库里get name是拿不到的。
那这么说来这个分库究竟有什么用呢?其实很少用的到,甚至就连redis的设计者自己都说搞这个是较蠢的操作。我们日常用到的唯一一处地方就是在测试服务器上,因为一台机器部署了太多服务,而且每个服务又都要用redis所以就每个服务分开使用0~15这些数据库。
因为开一个完整redis实例的资源消耗本身就很小,所以分库这个操作就更显的不太用的到了,毕竟我们完全可以在一台机器上开多个redis实例从而实现相同的效果,而且又方便管理。…
0X00 最常见的两种构建方式
构建Docker镜像的方式并不多,最常用的也就只有:编写Dockerfile和使用docker commit这两种。既然方式分为两种那么肯定是有区别的(废话),那我们来看看吧。
首先来介绍一下这两种构建方式,假设打算使用docker部署我们的服务,那么我们来使用两种方式来构建一下这个镜像吧。
0X01 docker commit
像我们这种新手平时用的比较多的应该就是docker commit xxxxx hub.xxx.xxx/xxx:xxx这种方式了,我们称之为docker commit。这种方式比较好操作,比较好理解,操作也比较容易。如果掌握了git的工作流程,那么使用docker commit方式来构建镜像简直是小菜一碟。
1. 我们搞一个基础镜像比如fedora,那我们把它搞下来:docker pull fedora
2. 运行并进入到容器里docker run --name our_container -it fedora /bin/bash,此时shell已经接入到容器里了
3. 我们来安装吧 dnf install…