https://cdn.programmer.work/icon/avatar.jpg

Shawn's blog

分享我的知识、经验、生活与感悟

文章内容可能过时、有瑕疵、有误、甚至和主流价值观相违背

Python 中 OS 库的常用方法

在写一些系统脚本或者自动化运维脚本的时候经常会用到os库,这里做个整理,方便查找

os.sep

获得当前操作系统使用的目录分隔符,比如Windows就会得到\而Linux/Unix就会得到/

浅析 HDFS

0X00 HDFS的设计

HDFS作为GFS的开源实现,和GFS是高度一致的。在HDFS中有着下面的优点

  1. 对超大文件支持良好,由于其分布式实现,可以存储超大文件,甚至单个文件大小可以超过集群中任意一台机器的磁盘大小
  2. 采用流式数据访问,一次写入、多次读取是最高效的访问模式。因为Hadoop作为一个大数据处理平台,并没有频繁的写入操作,只是在需要的时候一次将大量的数据写入然后在对这些数据进行读操作
  3. Hadoop并不需要运行在昂贵且高可靠的硬件之上,单个节点可能性能可靠性都参差不齐,但是由于其高可靠性的设计,使之能在遇到节点故障时继续运行且不让用户察觉到明显的终端

但是HDFS也不是适用于各种场景,一下的几种场景就不适

Java 中的字符串

String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。 —《Java编程思想》第13章

Python 奇技淫巧 (五) 系统脚本

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 退出程序,显示错误信息

写脚本的时候经常会有执行出错,出错的时候可以用一句话把程序退出并且打印错误信息 raise SystemExit('error message')

Python 奇技淫巧 (四) 文件&I/O

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 指定编码

每个文本文件都是以某一编码格式保存的,如果解码格式和文本格式不同就会出现乱码,在Python中可以简单的控制用什么编码来打开文件以读写文件。使用open打开文件的时候指定一个encoding参数就可以使用其他而非默认编码打开文件了。这里用到了一个打开文件的方式是with open() as f:这样,这样做的话在这个with下面的代码块中可以直接调用f这个文件对象,并且执行到with代码块之外的时候会自动关闭文件,不需要再手动关闭文件。

Python 奇技淫巧 (三) 函数

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 任意个参数

Python中一般定义函数是这样的def add(a, b),参数的个数是固定的,那么怎么才可以接收任意多个参数就像rm 1.txt 2.jpg 3.mp3 4.cpp这样?很简单,使用***就可以。下面代码里第一个参数a接收到了hello,world*b则接收到了其余所有的参数,将其作为一个元组。

Python 奇技淫巧 (二) 字符串、文本

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 split升级

字符串有一个split方法,可以用某个字符或字符串把源字符串切开。但是存在一个弊端,切割位置是固定的,不能灵活切割。有这样一个需求,将这个字符串hello 1 wrld 2 python 3 linux切割开,以每个数字为分隔符。这样标准的str.split就不能完成任务了。但是在re模块中有一个re.split可以完成这任务。这个方法的分隔符不是使用准确不变的字符/串而是使用正则表达式。

Python 的实例方法、静态方法、类方法

0X00 实例方法

Python中的实例方法是在面向对象编程中用到的最多的方法类型了。 实例方法 从字面理解就可以,就是说这个方法是属于实例的。每次实例化一个对象出来,这个对象都会拥有这个方法。从下面代码中就可以看得出来,这里我定义了一个实例方法’get_name()’,定义实例方法不需要任何特殊的修饰符。

简述几种简单的页面置换算法

0X00 最优算法—不可能实现算法

最优算法听起来很棒,但是 实现起来是不可能的 。最优算法是:当发生缺页中断时,将最晚会用到的页换出。也就是说,有三个页,现在发生了缺页中断,第一个页在第201条指令的时候会用到,第二个页在第5001条指令的时候会用到,第三个页在第20000条指令的时候会用到,那么第三个页面就是最晚会被用到的,就将其换出。这样确实是最好的效率,但是真正实现不了的原因是:程序不可能知道自己在什么时候需要哪些内存,所以就不能找到最晚会被用到的页。因为要用未来的事情来判断所以我一般称之为未来算法。虽说实现不了,也不是说这个算法就没意义了。这个算法最大的意义就在于可以比较效率。效率越是接近最优算法的就越好,当一个算法已经能达到最优算法效率的101%时,就没必要累死累活的去优化效率了,可以去找一些别的瓶颈了。

Python 使用 threading 实现多线程

0X00 多线程

多线程是个提高程序运行效率的好办法,本来要顺序执行的程序现在可以并行执行,可想而知效率要提高很多。但是多线程也不是能提高所有程序的效率。程序的两个极端是‘CPU密集型’和‘I/O密集型’两种,多线程技术比较适用于后者,因为在串行结构中当你去读写磁盘或者网络通信的时候CPU是闲着的,毕竟网络比磁盘要慢几个数量级,磁盘比内存慢几个数量级,内存又比CPU慢几个数量级。多线程技术就可以同时执行,比如你的程序需要发送N个http数据包(10秒),还需要将文件从一个位置复制到另一个位置(20秒),然后还需要统计另一个文件中’hello,world’字符串的出现次数(4秒),现在一共是要用34秒。但是因为这些操作之间没有关联,所以可以写成多线程程序,几乎只需要20秒就完成了。这是针对I/O密集型的,如果是CPU密集型的就不行了。比如我的程序要计算1000的阶乘(10秒),还要计算100000的累加(5秒),那么即使程序是并行的,还是会要用15秒,甚至更多。因为当程序使用CPU的时候CPU是通过轮转来执行的,IO密集型的程序可以在IO的同时用CPU计算,但是这里的CPU密集型就只能先执行一会儿线程1再执行一会儿线程2。所以就需要15秒,甚至会更多,因为CPU在切换的时候需要耗时。解决CPU密集型程序的多线程问题就是CPU的事情了,比如Intel的超线程技术,可以在同一个核心上真正的并行两个线程,所以称之为‘双核四线程’或者‘四核八线程’,我们这里具体的先不谈,谈我也不知道。

Linux 下 MariaDB/MySql 的安装配置、用户管理和备份

0x00 MariaDB的身世

自从MySQL被Oracle收购之后,社区就一直担心MySQL可能会被闭源或者一些其他的原因导致MySQL的支持出现问题。所以现在好多发行版本默认的数据库都从MySQL转移到了Mariadb。而且社区也开始大力支持Mariadb,再加上Mariadb的使用和API和MySQL完全一样,所以这里选择使用Mariadb而不是MySQL。

文件系统简述

0X00 文件

** ‘文件’是进程创建的逻辑单元。 ** —《现代操作系统(原书第三版)》 文件我们再熟悉不过了,电脑磁盘上存的都是文件。在Windows里和Unix系列系统里,表面看上去文件之间还是有一点点小的区别。比如,在Windows里主要还是以文件的后缀名来标识文件具体是什么类型的,图片还是视频;在Unix系列里文件的后缀名就没那么重要,主要后缀名是用来帮助人们识别文件类型的,操作系统并不很关心。 ** 真正的文件类型 ** 是文件的本质类型,不是我们常说的exe类型、doc类型、更不是什么图片类型和视频类型。在Windows下有常见的普通文件和目录。 没错,目录其实是文件的 。在Unix里,还有一些叫字符特殊文件和块特殊文件的。

Linux 权限控制列表 ACL

0X00 ACL是什么

ACL的全称是Access Control List访问控制列表。在Linux中可以给文件设置权限,-rwx-rw-rw这样,但是这里并不能细分,只能分到用户、组、其他用户。如果我想给某个单独的用户设置权限的话是做不到的。所以有了ACL的出现。通过ACL可以给Linux下的文件提供详细的访问控制,比如我们在设置了基本的rwx权限之后,可以通过ACL在细分用户对文件的权限。

Python 异常处理 捕获异常

0X00 什么是异常

程序在运行出错的时候就会抛出异常,异常时在正确的代码里发生的,不是代码出现了错误。下面就是一个异常

    #!/usr/bin/python
    #coding=utf-8

    num_1 = 10
    num_2 = 0
    # 很明显这里是用一个数字去除以0
    # 小学老师就说过0不能作为被除数
    # 那么我们来看Python是如何处理这个问题的
    num_3 = num_1 / num_2
    print num_3

运行这个程序就会报出下面的错误,错误提示说在hello.py这个文件的第6行,出现了一个错误integer division or modulo by zero也就是说Python解释器发现你试图除以0或者试图用0取模。