CentOS 7.4
Python 3.9.1 可以去官网下载发行包 https://www.python.org/downloads/release/python-391/
在编译Python的时候,需要安装一些必要的模块。1
2
3
4
5
6
7
8
9
10
11yum -y install zlib zlib-devel
yum -y install bzip2 bzip2-devel
yum -y install ncurses ncurses-devel
yum -y install readline readline-devel
yum -y install openssl openssl-devel
yum -y install openssl-static
yum -y install xz lzma xz-devel
yum -y install sqlite sqlite-devel
yum -y install gdbm gdbm-devel
yum -y install tk tk-devel
yum -y install libffi libffi-devel
解压Python-3.9.1源码包1
tar -zxvf Python-3.9.1.tar.gz
进入目录1
cd Python-3.9.1
配置编译,设置安装目录,以及选择相应的模块1
2
3
4./configure --prefix=/usr/python3 \
--enable-shared CFLAGS=-fPIC \
LDFLAGS=-Wl,-rpath=/usr/local/openssl/lib:/usr/python3/lib \
--with-openssl=/usr/local/openssl
编译安装1
2
3make
make install
1 | ln -s /usr/python3/bin/python3 /usr/bin/python3 |
安装完成。
]]>插入排序(Insertion Sort)比较简单直观,原理是将为排序数据,在已排序序列中从后往前扫描,找到相应位置插入。
1 | def insertion_sort(nums): |
交换排序也是一种非常基础的算法,主要包含冒泡排序和快速排序。
1 | def bubble_sort(nums): |
快速排序,又称分区交换排序,简称快排,是对冒泡排序的一种改进。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def quick_sort(nums, low, high):
if low >= high: return
pivot = nums[low] # 选数列第一个元素作为"基准"
i, j = low, high
while i < j:
while i < j and nums[j] >= pivot:
j = j - 1
nums[i] = nums[j]
while i < j and nums[i] <= pivot:
i = i + 1
nums[j] = nums[i]
nums[i] = pivot
quick_sort(nums, low, i-1)
quick_sort(nums, i+1, high)
1 | def heap_sort(nums): |
快速排序虽然排序效率高,但是不稳定,时间复杂度介于O(nlogn)跟O(n2)之间。
而归并排序可以稳定在O(nlogn)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18def mergeSort(nums):
if len(nums) == 1:
return nums
mid = len(nums) // 2
left = mergeSort(nums[:mid])
right = mergeSort(nums[mid:])
result = []
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result += left
if right:
result += right
return result
解决办法1
for i in `ls -a|grep 5P7A`;do mv $i ${i/5P7A/IMG_};done
一行代码搞定。
]]>一、::
两个冒号,表示往一个集合的头部添加元素,构造一个新的集合。x::list 表示往 list 队列的头部添加元素 x1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//创建一个List
scala> val list = List(1,2)
list: List[Int] = List(1, 2)
//创建不变量x
scala> val x = 3
x: Int = 3
//将x插入到list头部
scala> x::list
res16: List[Int] = List(3, 1, 2)
// :: 的另一种使用形式
scala> list.::(x)
res17: List[Int] = List(3, 1, 2)
二、:+ 和 +:
冒号和加和组合的操作符,冒号在左边和冒号在右边的区别是分别是:1. list:+x 在集合尾部添加元素;2. x+:list在集合头部添加元素。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22//将x插入到list尾部
scala> list:+x
res18: List[Int] = List(1, 2, 3)
//将x插入到list头部
scala> x+:list
res19: List[Int] = List(3, 1, 2)
//也可以这样使用
scala> list.+:(x)
res20: List[Int] = List(3, 1, 2)
scala> list.:+(x)
res21: List[Int] = List(1, 2, 3)
//创建一个 Seq 类型集合
scala> val seq = Seq(1, 2, 3)
seq: Seq[Int] = List(1, 2, 3)
//seq调用 :+
scala> seq.:+(5)
res29: Seq[Int] = List(1, 2, 3, 5)
其中 +: 和 :: 类似,但是 :: 可以用于 pattern match,而 +: 不支持。
三、++
两个加号,表示连接两个集合。例如,list++list11
2
3
4
5
6
7
8
9
10scala> list1
res25: List[Int] = List(3, 4)
//list 加上 list1 中的元素
scala> list++list1
res26: List[Int] = List(1, 2, 3, 4)
//list1 加上 list 中的元素
scala> list1++list
res27: List[Int] = List(3, 4, 1, 2)
四、:::
三个冒号,表示连接两个 List 类型的集合。1
2
3
4
5
6
7
8
9
10
11
12
13//创建seq1
scala> val seq1 = Seq(4, 5)
seq1: Seq[Int] = List(4, 5)
//seq调用 ::: 去连接seq1,报错
scala> seq:::seq1
<console>:10: error: value ::: is not a member of Seq[Int]
seq:::seq1
^
//::: 只能用于连接两个 List 类型的集合
scala> list:::list1
res31: List[Int] = List(1, 2, 3, 4)
【开始】
上openSUSE的官网下载了最新的版本,openSUSE leap 42.1。这里我并不了解这个版本号的意义,也不清楚openSUSE的上一个版本是多少。直接下载了最新的稳定版42.1,开始了openSUSE的征程!
代码如下:1
2
3
4
5
6
7SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS num, id, salary
FROM
employee
LIMIT 10;
也可以这样写:1
2
3
4
5SELECT
(@row_number:=@row_number + 1) AS num, id, salary
FROM
employee,(SELECT @row_number:=0) AS t
LIMIT 10;
df -h
查看当前系统磁盘信息。1 | root@host01:/opt/hadoop-2.6.2/etc/hadoop# df -h |
2.执行 fdisk -l
查看系统中是否存在未挂载磁盘。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51root@host01:/opt/hadoop-2.6.2/etc/hadoop# fdisk -l
Disk /dev/vda: 26.8 GB, 26843545600 bytes
255 heads, 63 sectors/track, 3263 cylinders, total 52428800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0008d3a3
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 52426751 26212352 83 Linux
Disk /dev/vdb: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders, total 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000d5b4e
Device Boot Start End Blocks Id System
/dev/vdb1 63 33543719 16771828+ 82 Linux swap / Solaris
Disk /dev/vdc: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders, total 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e4ad7
Device Boot Start End Blocks Id System
/dev/vdc1 63 104856254 52428096 83 Linux
Disk /dev/vdd: 2147.5 GB, 2147483648000 bytes
14 heads, 61 sectors/track, 4911362 cylinders, total 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd15b19e1
Device Boot Start End Blocks Id System
/dev/vdd1 2048 4194303999 2097150976 83 Linux
Disk /dev/vde: 2147.5 GB, 2147483648000 bytes
14 heads, 61 sectors/track, 4911362 cylinders, total 4194304000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xef776a1b
Device Boot Start End Blocks Id System
/dev/vde1 2048 4194303999 2097150976 83 Linux
3.对磁盘分区。
执行 fdisk /dev/vdd1 命令,对磁盘进行分区。
依次输入,n,p,1,两次回车,再输入 wq 分区自动进行,并且很快完成。
4.查看分区 fdisk -l 可以看到,分区已经新建。
5.格式化新分区,输入 mkfs.ext3 /dev/xvdb1 进行格式化分区。
6.添加分区信息
使用“echo ‘/dev/xvdb1 /mnt ext3 defaults 0 0’ >> /etc/fstab”(不含引号)命令写入新分区信息。
然后使用“cat /etc/fstab”命令查看,出现以下信息就表示写入成功。
注:ubuntu12.04不支持barrier,所以正确写法是:echo ‘/dev/xvdb1 /mnt ext3 barrier=0 0 0’ >> /etc/fstab
7.挂载分区
使用“mount -a”命令挂载新分区,然后用“df -h”命令查看,出现以下信息就说明挂载成功,可以开始使用新的分区了。
1 | gjl: ~/bin/apache-hive-1.2.1-bin $bin/hive |
解决办法:
将 Hive 中的 jline 从 2.x 版本降级到 1.x 之后,将 Hadoop 中 share/hadoop/yarn/lib 目录下的 jline 升级到 2.x 版本。
更新Mac OS X 10.11后安装MySQLdb,进入ipython交互命令后,输入import MySQLdb1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16In [1]: import MySQLdb
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-dd22983d5391> in <module>()
----> 1 import MySQLdb
/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-intel.egg/MySQLdb/__init__.py in <module>()
17 from MySQLdb.release import __version__, version_info, __author__
18
---> 19 import _mysql
20
21 if version_info != _mysql.version_info:
ImportError: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-intel.egg/_mysql.so
Reason: image not found
由于EI Capitan 增加了System Integrity Protection 的功能,阻止了写入的操作的,默认是开启的,需要关闭。
重启电脑,开机时按住 cmd + R,进入 Recovery 模式。然后打开终端工具 ,输入命令:csrutil disable
,然后再次重启电脑。
重启后,打开terminal输入以下命令:1
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
如果不关闭写入操作,将会出现以下情况:1
ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted
http://segmentfault.com/q/1010000003026543
http://blog.csdn.net/janronehoo/article/details/25207825
http://stackoverflow.com/questions/10557507/rails-mysql-on-osx-library-not-loaded-libmysqlclient-18-dylib
二、配置
1.nginx配置
cd到nginx安装目录,ubuntu下使用apt-get安装默认路径是 /etc/nginx
nginx的配置文件为nginx.conf
看到最后面两行
include /etc/nginx/conf.d/.conf;
include /etc/nginx/sites-enabled/;
发现 nginx配置了启动时夹在conf.d下面的配置文件
2.在conf.d下新建一个配置文件为 zhou.conf(命名随意)
加入如下内容:1
2
3
4
5
6
7
8
9
10# zhou.conf
# configuration of the server
server {
listen 80;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
}
}
保存,退出。
重新载入nginx配置文件 nginx -s reload
3.启动uwsgi
cd到应用根目录,比如 /root/www
执行命令:
uwsgi –socket 127.0.0.1:8001 –wsgi-file hello.py –callable app –processes 4 –threads 2 –stats 127.0.0.1:9191
解释:–wsgi-file hello.py 其中hello.py为应用入口文件
若要让uwsgi以守护进程运行,可添加参数 –daemonize /var/log/uwsgi.log
参考:
[1]http://heipark.iteye.com/blog/1847421
[2]http://docs.jinkan.org/docs/flask/deploying/uwsgi.html
上网查了下需要用到组合命令:
find . -name “*.xx” -exec rm -rf {} \;
配置pptpd
1.修改主配置文件/etc/pptpd.conf 在最后添加:
localip 118.23.2.144 #这行是给VPN服务器设置一个隧道ip
remoteip 192.168.1.1-254 #自动分配给客户端ip地址范围
2.修改配置文件/etc/ppp/options.pptpd设定分配给客户端的dns
把ms-dns前的注释号去掉,改成可用dns 如ms-dns 8.8.8.8
为了方便查看调试信息,把debug行前面的注释取消即可。Dump前的注释也取消。
3.添加pptpd账号,编辑文件/etc/ppp/chap-secrets
编辑内容为(IP中*号代表所有):1
2
3
4
5# Secrets for authentication using CHAP
# client server secret IP addresses
用户名 pptpd 密码 \*
用户名 pptpd 密码 192.168.0.3
用户名 pptpd 密码 192.168.0.4
4.运行pptpd 执行命令service pptpd start
5.设置路由转发
按照以上步骤配置完vpn服务器后,通过客户端连接vpn服务器是不能直接访问vpn所在私有网络或者通过vpn访问互联网,需要设置路由转发。
(一)开启ip转发功能:修改配置文件/etc/sysctl.conf,使net.ipv4.iph_forward = 1
(二)写个脚本文件,实现路由,其内容大致如下:1
2
3
4
5[root@max-vpn ~]# more /usr/local/bin/vpn_route.sh
#!/bin/bash
/sbin/iptables -t nat -A POSTROUTING -s 192.168.195.0/24 -o eth0 -j SNAT --to-source 118.23.2.144
/sbin/iptables -t nat -A POSTROUTING -s 172.16.195.0/24 -o eth1 -j SNAT --to-source 192.168.195.166
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
目标网络/vpn的内部网络为192.168.195.0/24,vpn服务器有2个网卡,其中一个连接公网(eth0),ip地址是61.135.251.51,另外一个网卡连私有网络,ip是192.168.195.166。这样就能正常地路由所涉及的网络了。手动执行一下这个脚本,看客户端(windows)是否能访问目标网络里的机器:最简单的方法就是ping,假定目标网络里有一个192.168.195.100的机器,并请允许icmp通过,ping 192.168.195.100 ,正常的话,再进一步访问这个服务器(如远程登录)。没有问题的话,把它加在开机自启里面。为安全起见,你可以在这个脚本里加更多的iptables规则。
这样就可以在CentOS安装pptpd了。大家可以顺利的使用pptpd了。
6.linux系统电脑连接vpn服务器
配置pptp client 地址:http://pptpclient.sourceforge.net/
两个都是接受输入的函数,input()接受的是一个合法的表达式,而raw_input()输入的数据都为字符串类型。
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
当Python的某个对象的引用计数为0时,说明没有引用指向该对象,该对象就要成为被回收的对象了。例如,某个新建的对象被分配给某个应用,对象的引用计数为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收了。如下代码:1
2a = [1, 2, 3]
del a
Python是一门面向对象语言。任何在Python中创建的变量,最后都指向一个对象。指向这个对象的其实是一个引用。如果对于这个对象进行复制,一般只是增加了一个引用指向这个对象,没有复制对象本身。如果要复制对象的话,就涉及Python深拷贝的操作。
一、利用切片操作和工厂方法list方法拷贝就叫浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
二、利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。但是对于数字,字符串和其他原子类型对象等,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。
python内置了丰富的操作字符串的函数。下面就以s = ‘abc’为例,介绍几个常用的字符串操作函数。
一、列表转换成字符串
a = list(s) b = ‘’.join(a)
二、字符串反转
1.a = list(s) a.reverse() s = ‘’.join(a)
2.s = s[::-1]
三、分隔字符串
a.split() #括号里添加参数,如’#‘表示字符串以‘#’分开
面试题
a = ‘i am superman’将这个字符串按照每个单词反转输出,即a = ‘superman am i’
x = a.split(‘ ‘)
y = x[::-1]
z = ‘ ‘.join(y)
ps:这是我亲身经历过的题,很遗憾我是用最最原始的方法来做的,f*k,让面试官感到我不是一个接地气的pythoner
1 | { |
添加python安装目录的path路径,保存退出。
Ctrl+B运行python代码
看到网上有很多人在玩Raspberry Pi(树莓派),于是我也买了一个准备玩玩。关于树莓派的介绍就不多说了,想了解的自己gogole或者请戳 -> http://www.raspberrypi.org/
这是我从淘宝上买的树莓派和一些相关的附件
(一张来自2020年的配图,配件还有一块电源适配器)
整个树莓派就一块很小的电路板,大小跟一张信用卡差不多。我买的是树莓派基金会最新出的Raspberry Pi B+版本,CPU是Broadcom BCM2835 700MHz ARM1176JZFS 内存:512M 4个USB接口 一个10/100 BaseT RJ45网口 一个HDMI接口 一个音频输出口 15路MPI CSI-2连接器 和 一个MicroSD卡插槽
来自2020年的说明:我的这个树莓派已经是早期的型号了,现在新出的内存都已经上8GB了。
在CMD中输入:ssh pi@树莓派的ip,输入密码raspberry,登录到树莓派。
在有网络的情况下,输入sudo apt-get install xrdp