ops

records of learning.

Python的while 1跟while True到底有什么区别?

定义两个方法,分别使用while循环 def t1(): while 1: pass def t2(): while True: pass 单从功能上说,两种无任何区别,那么,来看看字节码上的区别: For Python 2.x import dis #载入反编译模块,Python内置的 dis.dis(t1) #对应的是while 1,下面是输出 2 0 SETUP_LOOP 3 (to 6) 3 >> 3 JUMP_ABSOLUTE 3 >> 6 LOAD_CONST 0 (None) 9 RETURN_VALUE dis.dis(t2) #对应的是while True,下面是输出 2 0 SETUP_LOOP 10 (to 13) >> 3 LOAD_GLOBAL 0 (True) 6 POP_JUMP_IF_FALSE 12 3 9 JUMP_ABSOLUTE 3 >> 12 POP_BLOCK >> 13 LOAD_CONST 0 (None) 16 RETURN_VALUE 很明显, while 1的字节码只有while True的一半.

libvirt 4.5 virModuleLoadFile:53

CentOS 7.5.1804的libvirt从3.9升级至4.5时,无法启动,报错如下: error : virModuleLoadFile:53 : internal error: Failed to load module ‘/usr/lib64/libvirt/storage-backend/libvirt_storage_backend_rbd.so’: /usr/lib64/libvirt/storage-backend/libvirt_storage_backend_rbd.so: undefined symbol: rbd_diff_iterate2 详细报错如下: [root@localhost ~]# libvirtd -v 2019-01-15 08:56:53.433+0000: 34181: info : libvirt version: 4.5.0, package: 10.el7_6.3 (CentOS BuildSystem <http://bugs.centos.org>, 2018-11-28-20:51:39, x86-01.bsys.centos.org) 2019-01-15 08:56:53.433+0000: 34181: info : hostname: localhost.localdomain 2019-01-15 08:56:53.433+0000: 34181: info : virObjectNew:248 : OBJECT_NEW: obj=0x56166f5da690 classname=virAccessManager 2019-01-15 08:56:53.434+0000: 34181: info : virObjectNew:248 : OBJECT_NEW: obj=0x56166f5cbfe0 classname=virAccessManager 2019-01-15 08:56:53.434+0000: 34181: info : virObjectRef:382 : OBJECT_REF: obj=0x56166f5da690 2019-01-15 08:56:53.

Python数据库连接池实例--PooledDB

不用连接池的MySQL连接方法 import MySQLdb conn= MySQLdb.connect(host='127.0.0.1',user='root',passwd='password',db='DB_test',port=3306) cur=conn.cursor() SQL="select * from table_test" cur.execute(SQL) r=cur.fetchall() cur.close() conn.close() 用连接池后的连接方法 import MySQLdb from DBUtils.PooledDB import PooledDB pool = PooledDB(MySQLdb,5,host='127.0.0.1',user='root',passwd='password',db='DB_test',port=3306) #5为连接池里的最少连接数 conn = pool.connection() #以后每次需要数据库连接就是用connection()函数获取连接就好了 cur=conn.cursor() SQL="select * from table_test" cur.execute(SQL) r=cur.fetchall() cur.close() conn.close() PooledDB的参数 mincached: 最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接 maxcached: 最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接 maxconnections: 最大的连接数, blocking: 当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错, maxshared: 当连接数达到这个数,新请求的连接会分享已经分配出去的连接 连接池对性能的提升表现在 在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度 关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接 避免mysql连接数耗尽 DBUtils下载地址:https://pypi.python.org/pypi/DBUtils/

使用curl请求https时指定IP

一般使用curl请求自定义IP地址并且指定HOST的话可以这样。 curl -H 'Host: ops.m114.org' http://127.0.0.1 但是如果你需要请求的地址是HTTPS就不行了 $ curl -H 'Host: ops.m114.org' https://127.0.0.1/ curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate. 因为IP绝大多数情况下无法通过域名证书验证,还好curl中有--resolv参数可以让我们方便的指定域名的解析 # --resolv参数形式 --resolv host:port:address # 示例 curl --resolv ops.m114.org:443:127.0.0.1 https://ops.m114.org Ps: 小编经常使用的CentOS6的自带curl就不支持此参数,幸运的是CentOS7已经支持。

go如何编译出更小的执行文件?

前言 本地默认编译出的文件总与官方提供的二进制文件大很多,Google之后得知通过编译参数控制还能编译出更小的可执行文件。 加-ldflags参数 在程序编译的时候可以加上-ldflags "-s -w" 参数来优化编译程序, 其实通过去除部分连接和调试等信息来使得编译之后的执行程序更小,具体参数如下: -a 强制编译所有依赖包 -s 去掉符号表信息, panic时候的stack trace就没有任何文件名/行号信息了 -w 去掉DWARF调试信息,得到的程序就不能用gdb调试了 测试代码如下 package main import "fmt" func main() { fmt.Println("Hello, 世界") } 编译方式及文件大小对比结果如下 编译参数 大小 go build(默认) 1.6M go build -ldflags -s 1.6M go build -ldflags “-s -w” 1.1M go build -ldflags -w 1.1M 测试环境: go 1.

Golang之command line flag笔记

示例代码,仅供参考 package main import ( "fmt" "flag" ) func main() { // golang的flag包的一些基本使用方法 // 待使用的变量 var id int var name string var male bool // 是否已经解析 fmt.Println("parsed? = ", flag.Parsed()) // 设置flag参数 (变量指针,参数名,默认值,帮助信息) // 也可以用以下带返回值的方法代替,不过他们返回的是指针,比较麻烦点 // Int(name string, value int, usage string) *int // String(name string, value string, usage string) *string // Bool(name string, value bool, usage string) *bool flag.IntVar(&id, "id", 123, "help msg for id") flag.StringVar(&name, "name", "default name", "help msg for name") flag.

analysing java core dump

In this post, I will show you how you can debug a Java core file to see what caused your JVM to crash. I will be using a core file I generated in my previous post: Generating a Java Core Dump. There are different ways you can diagnose a JVM crash, listed below: The hs_err_pid log file When a fatal error occurs in the JVM, it produces an error log file called hs_err_pidXXXX.

Error: 500 OOPS: priv_sock_get_cmd [SOLVED]

Troubleshooting seccomp filter sanboxing with vsftpd 3.0.x The following error may occur on ftp clients with vsftpd 3.0.x: 500 OOPS: priv_sock_get_cmd This is caused by seccomp filter sanboxing, which is enabled by default on amd64. To workaround this issue, disable seccomp filter sanboxing: echo 'seccomp_sandbox=NO' >> vsftpd.conf service vsftpd restart For further information, refer to Red Hat bug #845980.

Python版本号比较

第一种比较方法(StrictVersion) StrictVersion是由.将一串带有预发布标签的数字分隔为两个或三个部分的格式,预发布标签的字母只能是a或者b加数字版本号,而且只能在最末尾。预发布a版本低于b版本,并且预发布版本永远小于正式发布版本。 合法格式: 0.4 0.4.0 (相同版本) 0.4.1 0.5a1 (预发布版本a1,小于0.5,即0.5版本更新) 0.5b3 0.5 0.9.6 1.0 1.0.4a3 1.0.4b1 1.0.4 非法格式: 1 没有.分隔,需要分隔为2-3部分 2.7.2.2 被分隔成了4个部分 1.3.a4 预发布版本号应该在数字后面 1.3pl1 预发布版本号字母标签只能是a或者b 1.3B1 预发布版本号字母标签只能是a或者b 1.3c 预发布版本号字母标签后必须加数字版本号 版本比较 In [1]: from distutils.version import StrictVersion In [2]: StrictVersion('1.2a3') < StrictVersion('1.2b1') Out[2]: True In [3]: StrictVersion('1.2b1') < StrictVersion('1.2') Out[3]: True In [4]: StrictVersion('1.2') < StrictVersion('1.2.1') Out[4]: True In [5]: StrictVersion('1.2') == StrictVersion('1.2.0') Out[5]: True In [6]: StrictVersion('1.2.11') < StrictVersion('1.

golang sync.WaitGroup解决goroutine同步

go提供了sync包和channel来解决协程同步和通讯。新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题。 从字面就可以理解,sync.WaitGroup是等待一组协程结束。它实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。 sync.WaitGroup只有3个方法,Add(),Done(),Wait()。 其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 简单示例如下: package main import ( "fmt" "sync" ) var waitgroup sync.WaitGroup func test(shownum int) { fmt.Println(shownum) waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1) } func main() { for i := 0; i < 10; i++ { waitgroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1 go test(i) } waitgroup.Wait() //.Wait()这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞 fmt.Println("done!") } Ps: 此文为学习记录,如有错误还请多指教。