从python2.7向 python3 转换(by《笨办法学python3》)

大嘎好,半吊子程序员从网线的这一端向您问好。

过去的还是会过去,就像时间,就像流水,就像python 2.7

终于还是要向python3切换

网上搜索了一下,还是用《笨办法学python3》这个文档开始吧。地址在:https://www.bookstack.cn/read/LearnPython3TheHardWay/spilt.1.learn-py3.md

————以下是书里的摘录部分的分割线———-

程序员总是自诩为数学天才,其实事实并非如此。如果他们是数学天才,他们就会去研究数学,而不是去写那些 bug 连篇的网站框架以便能开上豪车。

打印: print(“xxxxxxxxx”)

print(“Hens”, 25 + 30 / 6)

格式化字符串,只需要在“”前加上f,表示 format

somear = "world"

print( f"Hello, {somevar}")

.format()也可以格式化

joke_evaluation = “Isn’t that joke so funny?! {}”

print(joke_evaluation.format(hilarious))

print(“How old are you?”, end=’ ‘)

age = input()

# 我们在每一个打印行末尾放一个 end=' ' ,是为了告诉 print 不要另起一行。

y = input("Name?") 提示信息在()内

age = input("How old are you? ")

命令行参数

from sys import argv
script, filename = argv

argv 和 input() 之间的区别是什么? 区别取决于用户在哪被要求输入,如果是在命令行,就用 argv。如果你想让它们在程序已经运行的情况下用键盘输入,那就用 input()

读取文件

txt_again = open(file_again)

print(txt_again.read())

txt = open(filename) 会返回文件的内容吗? 不会。它其实是创建了一个叫做“文件对象”(file object)的东西

exists。它会基于一个字符串里面的变量文件名来判断,如果一个文件存在,它就会返回 True,不存在就会返回 False

from os.path import exists

exists(to_file)

  • close – 关闭文件,就像编辑器中的 “文件->另存为”一样。
  • read – 读取文件内容。你可以把读取结果赋给一个变量。
  • readline – 只读取文本文件的一行内容。
  • truncate – 清空文件。清空的时候要当心。
  • write(‘stuff’) – 给文件写入一些“东西”。
  • seek(0) – 把读/写的位置移到文件最开头。

用 32 个比特来编码一个 Unicode 字符 , 一个 32 位比特的数字意味着我们可以存储 4,294,967,295 个字符(2^32), 这对任何一种人类语言,甚至外星语言来说,都够用了

next_lang = line.strip()

raw_bytes = next_lang.encode(encoding, errors=errors)

cooked_string = raw_bytes.decode(encoding, errors=errors)

DBES”这个辅助记忆词吗?“Decode Bytes, Encode Strings”,解码字节==》字符串,编码字符串==》字节( 有字节要字符串,解码字节,有字符串要字节,编码字符串 )。

你需要做的就是记住如果你有原始字节,那你必须用 .decode() 来获取字符串。

关于while语句

  • 保守使用 while-loop,通常用 for-loop 更好一些。
  • 检查一下你的 while 语句,确保布尔测试最终会在某个点结果为 False。
  • 当遇到问题的时候,把你的 while-loop 开头和结尾的测试变量打印出来,看看它们在做什么。在这个练习中,你要通过以下三个检查来学习 while-loop:

if语句的编程习惯,

if 语句的规则:

  • 每一个“if 语句”必须包含一个 else。
  • 如果这个 else 永远都不应该被执行到,因为它本身没有任何意义,那你必须在 else 语句后面使用一个叫做 die 的函数,让它打印出错误信息并且死给你看,就像我们上节课做的那样,按照这个思路你可以找到很多错误。
  • “if 语句”的嵌套不要超过 2 层,最好尽量保持只有 1 层。
  • 把“if 语句”当做段落来对待,其中的每一个 if, elif, else 就跟段落中的句子一样。在每句前后留一个空行以作区分。
  • 你的布尔测试应该很简单,如果它们很复杂的话,你需要将它们的运算事先放到一个变量里,并且为变量取一个好名字。

如果你遵循上面的规则,你就会写出比大多数程序员都好的代码来。

python的数据类型

//地板除法(商向下取整)2 // 4 = 0

继承的大多数用法都可以用组合(composition)来简化或替换。并且无论如何都要避免多重继承

以下三个关键词需要加强一下

with-as 语句

lambda 创建一个短的匿名函数

yield

—–再结合总结一下—————————

1:print() 变成了函数

2: 默认使用UTF-8编码,不需要 u”xxxx” 这样子了

3:增加一个地板除运算符 // , 如 9//4 = 2

4:异常处理 , 只有继承 BaseException 的对象才可以被抛出

try:
  raise TypeError("xxx")
excpt TypeError as err:
  print(err)

5:不等于运算符只能使用 !=

6:增加bytes类型

b=b'中国'
type(b)
s = b.decode()
b2 = s.encode()

其他只有等实际中遭遇到再详细了解,目前感觉python2升到python3并不是太大的变更

应该问题不大的

ssl安全证书过期导致网站https访问出现不安全问题

大嘎好,半吊子运维又出现了。

一个网站,用得好好的,忽然说不安全了。登上去一看,果然不安全。

显示NET::ERR_CERT_DATE_INVALID

赶紧登录到服务器上看一看是怎么肥事

得知是nginx的搭的服务器

nginx -t 看一下

再看一下 /etc/nginx/nginx.conf, 啥也没有,再仔细瞄一下原来放在 include /etc/nginx/conf.d/*.conf;

server
{
listen 80;

            listen [::]:80;

            server_name sub.xxx.com;

            location / {
                    return 301 https://sub.xxx.com$request_uri;
            }
    access_log /data/logs/www.log main;
            error_log /data/logs/www_error.log error;

}

server
{
listen 443 ssl http2;
server_name sub.xxx.com;
index index.php index.html;
root /data/wwwroot/xxxxxx;

    location / {
        rewrite ^/$ /index.php last;
        if (!-e $request_filename) {
            rewrite "^/(.*)$" /index.php/$1 last;
        }
    }

    location ~ ^(.+\\.php)(.*)$ {

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;

        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        access_log off;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        access_log off;
    }
    location /_log {
       autoindex on;
       autoindex_localtime on;
    }
    access_log /data/logs/www.log main;
            error_log /data/logs/www_error.log error;
            ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_certificate /etc/letsencrypt/live/sub.xxx.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/sub.xxx.com/privkey.pem; # managed by Certbot

}

看来用的是Let’s Encrypt免费SSL证书,这个证书有个麻烦一点的地方就是90天过期,看来自从上次更新之后已经有90天了,所以过期了。

找到原因就好办了,将证书续期一下完事。

发现原来运维使用了 certbot ,那就更简单了。

# certbot certificates 看一下,果然有相应的证书

那就用certbot 更新一下证书 renew ,成功完成。

如果显示不成功,需要先暂停 nginx (systemctl stop nginx.service)

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log


Processing /etc/letsencrypt/renewal/sub.xxx.com.conf


Cert is due for renewal, auto-renewing…
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for sub.xxx.com
Waiting for verification…
Cleaning up challenges


new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/sub.xxx.com/fullchain.pem



Processing /etc/letsencrypt/renewal/xxx.com.conf


Cert is due for renewal, auto-renewing…
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for xxx.com
Waiting for verification…
Cleaning up challenges


new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/xxx.com/fullchain.pem



Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/sub.xxx.com/fullchain.pem (success)
/etc/letsencrypt/live/xxx.com/fullchain.pem (success)


参考文章: https://www.liaosam.com/use-cron-service-and-certbot-for-renewal-of-letsencrypt-ssl-certificates.html

升级centos后php中imagick模块错误解决

阿里云上一台跑php应用的服务器,centos 7

收到一个信息说云服务器上说有什么什么漏洞,需要进行升级

当时也没有想太多,老规矩,先做个系统快照。

然后登录系统,把软件和内核一起升级一下

#yum update

一切看起来非常的顺利,搞完之后重启一下。

虽然有点夜深,但是还是要测试一下应用是否正常。

做为一个半吊子运维的基本素养还是要有的

好了,一访问冒出一串问题

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/imagick.so’ – libMagickWand.so.5: cannot open shared object file: No such file or directory

Filename: Unknown

Line Number: 0

Backtrace:

感觉身上有点热,这么冷的天,我仿佛出汗了。

需要回滚快照?

幸好是深夜,白天交代过晚上会更新系统,应该不会有人使用。

那就先看一看有没有办法解决吧

# php –version 同样提示 imagick.so 无法 load

#vi /etc/php.ini

extension=imagick.so 先把这一行给注释了。

发现 imagick.so在 /usr/lib64/php/modules/ imagick.so 目录下,文件明明在的,为什么load不上呢?

那就删了重新装一下,试试。

# pecl uninstall imagick

#pecl install imagick

#vi /etc/php.ini 把 extension=imagick.so 打开

#php –version 正常

再启动一下nginx ,发现一切正常

世界又恢复了美好。

洗洗睡。

继续假装是个运维小哥。

惠普hp笔记本切换Fn功能键

刚刚用电脑,打开东方财富,按了下F12本来想进交易里看一下的,结果黑屏了,原来电脑进入了睡眠状态。

要怎么样才能将笔记本键盘的Fn的功能键象普通键盘一样呢?

其实很简单,先按住 左下角的 Fn 键,然后按 Shift 键,此时 Fn 键上亮起了小白灯,这个时候按F12,就跳出交易了。

解决笔记本电脑找不到按键如scroll lock 的问题

用笔记本电脑是方便,现在的笔记本又轻又小巧,普通一台已经做得和macbook差不多,然而价钱只有一半,真是便宜又大碗。

然而有的时候还是不熟悉键盘布局,或者错误地按到键,却怎么也恢复不了,急死个人。比如刚刚就发生了,乱按乱按导致excel里的单元格不能移动,一瞄左下角,赫然写着一个滚动,原来是scroll lock键被锁按到了,可是这笔记本的键盘仔细瞅了一瞅,没有看到哪个键上写着 scroll lock。

还是召唤出虚拟键盘吧,win+R 唤出运行,输入 osk,找到ScrLk 果然亮着,把这个按掉一切又正常了。

虚拟键盘真好用!!