如何掌握SaaS重要知识点

没有基础怎么学云计算?如何掌握SaaS重要知识点?云计算市场前景广阔、人才需求旺盛吸引很多有志学子转行加入其中,考虑到学习效果和企业招聘需求,参加专业学习被当做是*快捷的学习方式。在学习专业技能之余,我们还需要对整个市场发展趋势有一个了解,下面就给大家介绍一下比较基础但重要的知识点——SaaS。

%title插图%num

众所周知,云计算的服务可以分为三个层面,分别是IaaS、PaaS和SaaS。SaaS是Software-as-a-Service(软件即服务)的简称,它是一种通过Internet提供软件的模式,通过灵活租赁的收费方式,免却了软件安装实施过程中一系列专业并复杂的环节,让软件的实施使用变得简单易掌握。

就实际应用而言,SaaS在业务起步阶段还是有价值的,主要表现在: 1)降低入行门槛,帮助入局者快速熟悉业务; 2)大幅降低启动阶段的产品技术研发成本;3)规避政策风险,特别是在金融领域; 4)刺激一个新兴行业,让更多人参与进来,比如物联网领域。

但是,业务成熟以后,将SaaS作为战略依赖却有点不妥。首先是因为安全性。很多企业,尤其是大型企业,很不情愿使用SaaS正是因为安全问题,他们要保护他们的核心数据,不希望这些核心数据由第三方来负责;其次标准化。

SaaS解决方案缺乏标准化,这个行业刚刚起步,没有明确的解决办法,一家公司可以设计建立一个解决方案。鉴于复杂和高度可定制的ERP产品,这是一个冒险的建议。

零基础转行学习云计算一定要考虑好自己未来的职业规划,比如需要怎样学习才能提高效率、了解企业的技能需要等等。随着国家一系列政策扶持以及互联网的高速发展,云计算未来前景可期,云计算人才也将是不可或缺的高薪高职人才,如果你想要入行云计算行业,现在学习正当时。

电脑联网了但是浏览器代理服务器出现了问题

可能出现了以下情况:
感染了病毒所致 ;
与设置代理服务器有关;
DNS服务器解释出错;
系统文件丢失导致IE不能正常启动。
以上四种情况的解决方法可参考以下:
在任务管理器里查看进程,(进入方法,把鼠标放在任务栏上,按右键—任务管理器—进程)看看CPU的占用率如何,如果是100%,可以肯定,是感染了病毒,这时就要查查是哪个进程贪婪地占用了CPU资源;
在浏览器里设置了代理服务器(控制面板–Internet选项—连接—局域网设置—为LAN使用代理服务器),设置代理服务器是不影响QQ联网的,因为QQ用的是4000端口,而访问互联网使用的是80或8080端口,如果有这样设置的,请把代理取消就可以了;
如果DNS服务器出错,可把路由器关一会再开,或者重新设置路由器。或者是网卡无法自动搜寻到DNS的服务器地址,可以尝试用指定的DNS服务器地址。在网络的属性里进行,(控制面板—网络和拔号连接—本地连接—右键属性—TCP/IP协议—属性—使用下面的DNS服务器地址)。不同的ISP有不同的DNS地址,如电信常用的是202.96.134.133(主用) 202.96.128.68(备用);
可尝试修复系统,2K或XP系统下,放入原安装光盘(注意:一定要原安装光盘),在开始—运行里输入sfc /scanow,按回车键。把*近安装的硬件或程序卸载,2K或XP的系统可以在机器启动后,长按F8,进入启动菜单,选择“*后一次正确的配置”,若是XP系统,还可以利用系统的还原功能,一般能很快解决问题。

Win10 代理服务器出现问题 或者地址有误

本人win10系统,今天晚上使用浏览器,打开页面的时候突然出现了:

代理服务器出现问题 或者地址有误。

具体诊断,错误截图也就不放了。

解决办法:原本那个使用代理服务器不知道怎么的打开了,关掉之后再通过浏览器就可以上网了。

%title插图%num

把使用代理服务器关掉即可。

Linux配置Apache服务器全攻略

一,使用源代码安装

(1) 获得源代码

# lynxhttp://www.apache.org/dist/httpd/httpd-2_0_NN.tar.gz

NN表示当前所用的版本号。

(2) 解压缩

# gzip -d httpd-2_0_NN.tar.gz

# tar xvf httpd-2_0_NN.tar

(3) 配置.

# ./configure –prefix= /usr/local/apache –enable-so

表示Apache将安装在/usr/local/apache目录下

(4) 编译与安装

# make

# make install

(5) 测试

# /usr/local/apache/bin/apachectl start

二,使用RPM包安装

# rpm —ivh apache-*.rpm

完成安装后,配置文件在/etc/httpd/conf/目录下,文件根目录为/var/www/html,工具文件在/etc/rc.d/init.d/目录下,日志文件在/var/log/httpd/目录下。

第三站 Apache 2.0的配置

Apache 2.0的主配置文件为httpd.conf。如果以上述源代码安装则配置文件保存在/usr/local/apache/conf/目录下,若以RPM包方式安装则配置文件保存在/etc/httpd/conf/目录下。我们可以直接修改httpd.conf文件也可以用redhat linux 9自带的图形化工具来配置。打开启动程序->系统设置->服务器设置->HTTP服务器,可以进行相关。主界面如图:

下面我们来看一下httpd.conf中的几条指令,“#”后加入了注释说明。

Port 80 #定义了web服务器的侦听端口,默认值为80,它是TCP网络端口之一。若写入多个端口,以*后一个为准。

User apache #一般情况下,以nobody用户和nobody组来运行web服务器,因为web

Group apache # 服务器发出的所有的进程都是以root用户身份运行的,存在安全风险。

ServerAdmin root@localhost #指定服务器管理员的E-mail地址。服务器自动将错误报告到该地址。

ServerRoot /etc/httpd #服务器的根目录,一般情况下,所有的配置文件在该目录下

ServerName new.host.name:80 #web客户搜索的主机名称

KeepAliveTimeout 15 #规定了连续请求之间等待15秒,若超过,则重新建立一条新的TCP连接

MaxKeepAliveRequests 100 #永久连接的HTTP请求数

MaxClients 150 #同一时间连接到服务器上的客户机总数

ErrorLog logs/error_log #用来指定错误日志文件的名称和路径

PidFile run/httpd.pid #用来存放httpd进程号,以方便停止服务器。

Timeout 300 #设置请求超时时间,若网速较慢则应把值设大。

DocumentRoot /var/www/html #用来存放网页文件

第四站 Apache的管理

(1) 启动和停止Apache

/etc/rc.d/init.d/httpd start

/etc/rc.d/init.d/httpd stop

(2) Apache的日志文件

有人说判定一个管理员是否优秀之一就是看他是否是一个分析日志的能手,因为从日志文件中获取的反馈信息对管理员来说是相当重要的。Apache的日至文件主要包括访问日志和错误日志。访问日志记录了该服务器所有的请求的过程,主要记录的是客户的信息,通过它我们可以知道什么人访问了该网站,什么时候访问的,访问的内容是什么等等。错误日志则是记录了服务器出错的细节和如何处理等。日志文件的位置是由上述主配置文件httpd.conf来规定的。Redhat中有一个查看日志的工具——系统日志。其主界面如下

下面各举一个例子来说明他的格式:

错误日志的写法:

[Mon sep 22 14:32:52 2003] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

[Mon sep 22 14:32:52 2003] 错误发生的时间。

[error] 表示错误的级别。有debug,info,notice,warn,error,crit,alert,emerg,这些级别由低到高表示了错误的严重性。

[client 127.0.0.1] 表示客户端IP地址。

client denied by server configuration: /export/home/live/ap/htdocs/test 标是错误的具体信息。

访问日志的写法:

127.0.0.1 – wangdong [22/sep/2003:13:55:36 -0800] “GET /apache_pb.gif HTTP/1.0” 200 2326

127.0.0.1 表示访问这台服务器的客户端IP地址。

Wangdong 表示用户的登录名。

[22/sep/2003:13:55:36 -0800] 服务器完成客户端请求的时间,格式为[日/月/年:小时:分钟:秒 时区]

“GET /apache_pb.gif HTTP/1.0” 表示客户端访问该资源所使用的方法。

200 记录的是服务器返回给客户的状态码。200表示成功,以4打头的表示访问出错。

2326 表示发给客户端的总字节数。若是“—”表示没有找到访问资源。

但在实际应用中,对于大型网站,日志文件往往增长的很快,不利于我们查询,降低服务器的效率,而且占用大量的磁盘空间,所以我们必须对日志进行定期的维护。

既然日志文件很大,那么我们如何把一大堆枯燥的数据整理成容易让我们看懂的形式呢?有没有这样的工具呢?非常幸运,在redhat linux 9中自带了一个分析日志的工具——webalizer,如图:

我们也可以在网上找到大量这样优秀的免费的工具,例如:WebTrends Analysis Series。

第五站 配置虚拟主机

虚拟主机是在一台www服务器上为多个单独的域名提供www服务,每个域名具有自己的目录和配置,相当于将一台主机分为多台主机,虚拟主机技术对于主机数量不足,但又想为不同的用户提供独立的Web服务的需求非常有效。而对于一个公司,利用价格昂贵的服务器只提供一种域名服务,似乎是不明智的,而现在越来越多的公司喜欢在一台服务器上使用多个域名服务,架设不同的网站,这样做的好处是显而易见。

Apache有两种方式支持虚拟主机,一种是基于IP的虚拟主机,另一种是基于名字的虚拟主机。基于名字的虚拟主机使用相同的IP地址来配置不同的虚拟主机,这就弥补了因IP地址不足而带来的问题。基于名字的虚拟主机的配置相当简单,你只需配置你得DNS服务器使每个主机名对应正确的IP地址,然后再配置Apache HTTP Server使它能认识不同的主机名就可以了。

假设我们组建了一家多媒体制作公司,有一台Apache服务器和一个IP地址:192.168.0.1 要运行两种业务,一种为电子商务网站,域名为www.business.media.com,另一种为教学网站,域名为www.teaching.media.com。先在DNS服务器中把域名www.business.media.comwww.teachin….conf就可以了。

NameVirtualHost 192.168.0.1
ServerNamewww.business.media.com

DocumentRoot /var/www/html/business

ServerNamewww.teaching.media.com

DocumentRoot /var/www/html/teaching

而基于IP的虚拟主机则要求使用不同的IP地址来区别不同的虚拟主机,这就要求使用多块网卡,把不同的IP地址捆绑到不同的网卡上,或者在一块网卡上捆绑多个IP地址。假设我们主机的IP地址为192.168.0.1(www.media.com),另外有两个IP地址别?..nf/httpd.conf。[/url]

ServerAdmin webmaster@ business.media.com

DocumentRoot /var/www/html/business

ServerNamewww.business.media.com

ErrorLog /var/www/html/business/logs/error_log

TransferLog /var/www/html/business/logs/access_log
ServerAdminwebmaster@teaching.media.com

DocumentRoot /var/www/html/teaching

ServerNamewww.teaching.media.com

ErrorLog /var/www/html/teaching/logs/error_log

TransferLog /var/www/html/teaching/logs/access_log

第六站配置Apache代理

代理服务器是网络信息服务的中转站。如果我们把Apache代理服务器形象地比喻成代理商的话,消费者向代理商购买东西时,如果代理商有的话,可直接卖给消费者,若没有,则代理商向厂家进货,再卖给消费者。这样做有以下几点好处:(1)提高了访问速度。(2)充当防火墙,增加了安全性。(3)可以过滤一些不良网站。(4)具有缓存功能。(5)节省IP开销。代理服务器可分为两种类型:客户端代理和服务器端代理。下面我们在讲解几个指令后举例说明各自的配置方法。

ProxyRequest On/Off #启用或者禁用Apache代理服务。

CacheRoot “/etc/httpd/proxy” #代理缓存的根目录。

CacheSize 5 #代理缓存的大小。

CacheGcInterval 4 #设定运行管理缓存的无用数据搜集程序的时间间隔

CacheMaxExpire 24 #文件过期时间。

CacheDefaultExpire 1 #指定未包含过期信息文件的有效期。

NoCache a-domain.com another-domain.edu #该网站的文件将不被缓存。

  • 客户端代理的配置

(1) 修改/etc/httpd/conf/httpd.conf中的相关指令

(2) 修改/etc/httpd/conf/httpd.conf,添加对代理目录的访问控制。

Order deny,allow

Deny from all

Allow from .your-domain.com

(3) 重启httpd。

  • 服务器端代理的配置

服务器端代理与客户端代理不同,它是在防火墙上安装Apache服务器,使用它提供对WWW服务器的代理访问。这种方法把WWW服务器与外部隔开,提高了安全性,而对用户来说,好像没有变化一样。假设在内部局域网中WWW服务器的IP地址为192.168.0.2,防火墙主机内部IP地址为192.168.0.5,外部IP地址为192.9.202.1。

(一) 配置防火墙上的Apache

(1) 在/etc/httpd/conf/httpd.conf中添加虚拟主机。

ServerAdminwebmaster@business.media.com

DocumentRoot /www/docs/business.media.com

ServerNamewww.business.media.com

ErrorLog logs/business.media.com-error_log

CustomLog logs/business.media.com-log_common

(2) 配置局域网中的DNS服务器,把www.business.media.com指向192.9.201.1。

Linux系统下安装Apache服务器

Linux系统下安装Apache服务器
1.*步命令安装apache:

yum install httpd httpd-devel -y
1
2.第二步执行命令:
开启服务器

systemctl start httpd.service
1
执行下面命令,使服务器随Linux的启动而启动:

systemctl enable httpd.service
1
3.做到这里还是不行的,因为Linux系统中的防火墙会没有给Apache开放端口,所以需要做以下操作:

firewall-cmd –zone=public –add-port=80/tcp –permanent
1
firewall-cmd –reload
1
4.此时就可以在浏览器地址栏输入服务器的ip地址访问了,可以看到这样的界面:
%title插图%num

这样apache服务器就成功安装完成!
5.安装完成以后apache默认的安装地址为 etc/httpd/conf/httpd.conf
我们可以自定义apache的默认路径
首先在一个目录下面创建一个文件夹如:在home文件下架创建一个html文件夹

切换路径到home文件夹下:
cd /home
mkdir html
然后在打开apache原来的配置文件:

vi /etc/httpd/conf/httpd.conf
打开配置文件后将里面的/var/www/html/ 修改为/home/dic

6.做到这里还是出问题.访问ip时会出现这个问题

%title插图%num

问题出现原因是 Linux系统中SELinux关闭访问引起的
SELinux一共有三种状态分别是Enforcing,Permissive和Disabled状态,

执行命令 setenforce 0
1
临时关闭SELinux,就可以执行,但是下次重启服务器时,SELinux还是会恢复原始状态,
所以找到SELnux的配置文件设置为disable状态

vi /etc/selinux/config
1
重启linux系统就可以了!
完结!!

国家统计局新闻办对网民关注的几个问题的说明

  5月11日,国家统计局和国务院第七次全国人口普查领导小组办公室举办新闻发布会,对社会公布了第七次全国人口普查主要数据。在数据发布后,社会各界给予了*大关注,也有网民对个别数据提出了一些疑问。现就有关问题说明如下:   一、普查0-14岁少儿人口与历年出生人口数据的关系   普查结果显示,2020年我国0—14岁人口为25338万人,这个数据确实与相应年份公布的出生人口规模存在一定差异。这一差异首先是因为这两个数据的来源不同。根据我国现行的统计调查制度,普查每10年进行一次,两次普查之间的年份开展抽样调查,非普查年份出生人口主要是通过抽样调查数据推算的。由于抽样调查误差的存在,在利用抽样比推算人口总体时会存在一定的差异,反映在数据上就是部分年份公布的出生人口偏低。其次普查是全面调查,不需要进行推算,特别是这次人口普查采用了一系列新技术新方法,加强了全过程质量控制,普查现场登记也得到了广大普查对象的充分理解和支持,大幅降低了漏登率,普查漏登率仅为0.05%,这意味着很多原来漏登的人口通过这次普查都登记上来了,反映在数据上就会看到相应年龄的人口比之前公布的出生人口要多一些。此外,有的网民用的是14年数字,而0—14岁覆盖的是15年。   二、2020年普查数据与2019年常规统计数据的关系   有网民提出,根据普查结果,2020年11月1日0时全国人口为141178万人,这意味着2020年比2019年公布的140005万人增加了1173万人。这个增加量是真实的吗,怎么理解这个增加量?上面讲到,非普查年份的人口数是根据当年抽样调查数据推算的,由于部分年份抽样调查漏登率较高造成推算的人口总体会存在一定的偏差,而且随着时间的推移,这些偏差会不断累积,对年度数据以及2019年数据的准确性肯定会造成影响。因此,不应该直接用2019年原公布的总人口与2020年普查数据做比较来计算年度变化,人口年龄结构等其他数据也属于这种情况。   以上两个问题都是关于普查数据与非普查年度公布数据反映趋势出现不一致的情况,刚才已经说明了。这也正是开展10年一次人口普查的意义。通过普查,可以全面查清我国人口的数量、结构、分布等方面情况,让我们更加清楚地了解到过去10年我国人口发展情况,为更好地研究人口问题、制定人口相关政策提供了*为宝贵的数据资料。那怎么处理这种不一致的情况呢?按照国际惯例和通常做法,普查结束后一般会依据普查结果对两次普查之间公布的年度数据进行修订,以更加真实、客观地反映人口发展轨迹。在第六次全国人口普查以及刚刚结束不久的第四次全国经济普查,也都根据普查数据对历史数据进行了修订。目前这项工作正在进行中,相关数据在修订完成后择期予以发布。   三、关于两次普查总人口的口径和范围   在2010年第六次全国人口普查主要数据公报中,137054万人这个人口数据包括了大陆31个省、自治区、直辖市和现役军人的人口以及我国港澳台的人口,133972万人是大陆31个省、自治区、直辖市和现役军人的人口。第七次全国人口普查公报同样提供这两个口径的数据,在做两次普查人口变化比较时,要做相同口径比较。

Python也有pdb

Python也有pdb

 

C有gdb,Python也有pdb
写过C语言的同学们想必都很怀念(读者:¿)gdb调试器,使用gdb可以随意在程序运行过程中暂停流程、查看变量。

很多时候,我们单纯分析代码流程和日志信息无法定位的问题,都得靠调试器来帮忙;可以说有了调试器,程序员才是代码世界完整的上帝。

Python当然也不示弱,同样存在这样的巴别塔可以让人升天

01
——不过阿酱必须承认的是,现代IDE集成的图形化调试功能已经很好使了,一般情况下使用命令行工具的场景并不多。

但是也确实存在无法使用图形化IDE的情况,因此对pdb工具略作了解还是很有必要的。毕竟谁也不知道可能被扔给一个什么样的环境啊哈哈

pdb的使用
作为解释型语言,Python调试工具的使用跟gdb毕竟还是有区别的。

比如Python的调试就不需要什么符号表之类的东西,说到底,*终Python虚拟机执行的逻辑也是自带符号的。

也正是由于Python的这种特殊性,所有pdb其实有两种不太一样的使用方式,即侵入式和非侵入式。

其实按字面意思就很容易理解在两种方式的使用。类比一下脑机接口,也分为侵入式和非侵入式。侵入式就表示要将电*、芯片植入大脑皮层,“侵入”人体;而非侵入式则是在头骨外收集脑电波进行分析。

同样地,侵入式pdb调用就是将调用pdb的代码直接写入Python脚本当中;而非侵入式则是从命令行调用pdb,执行相应被调试脚本。

侵入式pdb

使用方式如下代码所示,在代码中途插入一行调用:

import pdb; # pdb.set_trace()

a = “just”
b = “do”

pdb.set_trace()

c = [‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
print(a)
运行脚本,会进入这样一个交互式界面:

D:\000-GitHub\python-examples\xuanyuanyulong\2020-11-04-python-pdb>python test_pdb_intrusive.py
> d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py(21)<module>()
-> c = [‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
(Pdb)
到这里已经启动了pdb,并且打印内容中-> c = [‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]行首的箭头,表示当前程序执行流到了这一行代码,如果继续执行,将首先执行该行。

非侵入式pdb

非侵入式要xue微简单一些,*大的好处是不需要改动代码。

我们在控制台执行以下命令:

D:\000-GitHub\python-examples\xuanyuanyulong\2020-11-04-python-pdb>python -m pdb test_pdb_intrusive.py
> d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py(1)<module>()
-> import pdb; # pdb.set_trace()
(Pdb)
可以看到,通过这种方式进入调试,程序执行流停在了程序开头。

通过分析进入调试时代码执行流的位置,我们可以发现,实际上侵入式的插入pdb.set_trace()调用,等价于我们从命令行启动pdb,然后在这个调用的下一行打了一个断点,然后直接运行程序。

简单命令
gdb中有一些常用的简单命令,本节阿酱带大家熟悉一下,后续会做更深入的讨论。

h(elp)

在pdb界面下输入h或help命令,即可列出pdb中支持的各种命令:

(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where

Miscellaneous help topics:
==========================
exec  pdb
在pdb后带一个命令作为参数,还可进一步看到相应的使用说明:

(Pdb) h h
h(elp)
Without argument, print the list of available commands.
With a command name as argument, print help about that command.
“help pdb” shows the full pdb documentation.
“help exec” gives help on the ! command.
相信我,help其实才是pdb里面*重要的命令。别的什么都可以记不住,但是help一定要记住。在以结果为导向的职场生活中也是一样,遇到问题要及时求助哟~

l(ist)

打印当前文件的源代码。不带参数的话,默认打印当前行前后共计11行代码。继续执行该命令的话,则会继续往后打印*多11行代码,直到遇上文件结束符EOF。

用.作为参数则限定要强一点,只会打印当前行前后11行代码。

(Pdb) l
1  -> import pdb; # pdb.set_trace()
2
3
4     def addStr(a, b):
5         return a + b
6
8         return ”.join(l)
9
10     def getSlogan(a, b, c):
11         result = addStr(a, b) + mergeChar(c)
当指定两个参数时,则打印这个区间内的代码:

(Pdb) l 3, 7
3
4     def addStr(a, b):
5         return a + b
6
7  -> def mergeChar(l: list):
而当第二个参数b比*个参数a小的时候,则表示“从第a行开始,继续往后打印b行”,也就是总共打印(1+b)行:

(Pdb) l 7, 3
7  -> def mergeChar(l: list):
8         return ”.join(l)
9
10     def getSlogan(a, b, c):
p/pp

打印某个对象的值。区别在于pp调用的是pprint函数,打印更加美观。

(Pdb) p a
‘just’
(Pdb) p addStr
<function addStr at 0x000002087B0F9C80>
!

使用!可以在pdb环境下,执行一般的Python语句。通常我们可以用来改变变量的值——要不怎么说调试器可以让你成为上帝呢?还有比这更为所欲为的吗?

一般的话这个!其实可以省略,但是当要执行语句开头的单词与pdb的已有命令冲突,就得不到预期结果了,所以建议还是加上。

这个用!领起命令的做法跟vim编辑器的逻辑很像,可以类比记忆。不熟悉的读者可以忽略。

(Pdb) !a = “python”
(Pdb) p a
‘python’
r(eturn)

pdb中,r和return表示同一个意思,即“运行当前函数直到返回”。

这一点上,r在pdb和gdb中的含义是不同的。读者不必在意

run/restart

表示重新运行当前被调试程序。使用这个命令,可以为需要传入参数的脚本传入所需参数。

格式与命令行执行该脚本一样,只是把相应的python命令和脚本路径替换为了run或restart。

(Pdb) run a b c d kkk
Restarting test_pdb_intrusive.py with arguments:
test_pdb_intrusive.py
> d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py(1)<module>()
-> import pdb; # pdb.set_trace()
(Pdb) !import sys
(Pdb) p sys.argv
[‘test_pdb_intrusive.py’, ‘a’, ‘b’, ‘c’, ‘d’, ‘kkk’]
b(reak)

查看/添加断点。

不带任何参数时,即列出当前已有断点。

(Pdb) b 21
Breakpoint 1 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
(Pdb) b 17
Breakpoint 2 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
2   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
同时,通过run和restart重新运行被调试程序,不会清除已有断点:

(Pdb) run
Restarting test_pdb_intrusive.py with arguments:
test_pdb_intrusive.py
> d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py(1)<module>()
-> import pdb; # pdb.set_trace()
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
2   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
cl(ear)

有三种使用方式:1)类似设置断点时,清除特定文件特定行的断点;2)将要清除的断点号列出来,以空格分隔;3)不带参数,清除所有断点。

下面一一演示:

1)类似设置断点时,清除特定文件特定行的断点

(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
2   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
(Pdb) clear test_pdb_intrusive.py:21
(Pdb) b
Num Type         Disp Enb   Where
2   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
2)将要清除的断点号列出来,以空格分隔

(Pdb) b 21
Breakpoint 3 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
(Pdb) b 15
Breakpoint 4 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) b
Num Type         Disp Enb   Where
2   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
3   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
4   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) clear 2 4
Deleted breakpoint 2 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
Deleted breakpoint 4 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) b
Num Type         Disp Enb   Where
3   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
3)不带参数,清除所有断点

(Pdb) b 17
Breakpoint 5 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
(Pdb) b 15
Breakpoint 6 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) b
Num Type         Disp Enb   Where
3   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
5   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
6   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) b
Num Type         Disp Enb   Where
3   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
5   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
6   breakpoint   keep yes   at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) clear
Clear all breaks? yes
Deleted breakpoint 3 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:21
Deleted breakpoint 5 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:17
Deleted breakpoint 6 at d:\000-github\python-examples\xuanyuanyulong\2020-11-04-python-pdb\test_pdb_intrusive.py:15
(Pdb) b

Python 下载文件的多种方法

Python 下载文件的多种方法

 

本文档介绍了 Python 下载文件的各种方式,从下载简单的小文件到用断点续传的方式下载大文件。

Requests
使用 Requests 模块的 get 方法从一个 url 上下载文件,在 python 爬虫中经常使用它下载简单的网页内容

import requests

# 图片来自bing.com
url = ‘https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg’

def requests_download():

content = requests.get(url).content

with open(‘pic_requests.jpg’, ‘wb’) as file:
file.write(content)
urllib
使用 python 内置的 urllib 模块的 urlretrieve 方法直接将 url 请求保存成文件

from urllib import request

# 图片来自bing.com
url = ‘https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg’

def urllib_download():
request.urlretrieve(url, ‘pic_urllib.jpg’)
urllib3
urllib3 是一个用于 Http 客户端的 Python 模块,它使用连接池对网络进行请求访问

def urllib3_download():
# 创建一个连接池
poolManager = urllib3.PoolManager()

resp = poolManager.request(‘GET’, url)

with open(“pic_urllib3.jpg”, “wb”) as file:
file.write(resp.data)

resp.release_conn()
wget
在 Linux 系统中有 wget 命令,可以方便的下载网上的资源,Python 中也有相应的 wget 模块。使用 pip install 命令安装

import wget

# 图片来自bing.com
url = ‘https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg’

def wget_download():
wget.download(url, out=’pic_wget.jpg’)
也可以直接在命令行中使用 wget 命令

python -m wget https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg
分块下载大文件
在需要下载的文件非常大,电脑的内存空间完全不够用的情况下,可以使用 requests 模块的流模式,默认情况下 stream 参数为 False, 文件过大会导致内存不足。stream 参数为 True 的时候 requests 并不会立刻开始下载,只有在调用 iter_content 或者 iter_lines 遍历内容时下载

iter_content:一块一块的遍历要下载的内容 iter_lines:一行一行的遍历要下载的内容

import requests

def steam_download():
# vscode 客户端
url = ‘https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe’

with requests.get(url, stream=True) as r:
with open(‘vscode.exe’, ‘wb’) as flie:
# chunk_size 指定写入大小每次写入 1024 * 1024 bytes
for chunk in r.iter_content(chunk_size=1024*1024):
if chunk:
flie.write(chunk)
进度条
在下载大文件的时候加上进度条美化下载界面,可以实时知道下载的网络速度和已经下载的文件大小,这里使用 tqdm 模块作为进度条显示,可以使用 pip install tqdm 安装

from tqdm import tqdm

def tqdm_download():

url = ‘https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe’

resp = requests.get(url, stream=True)

# 获取文件大小
file_size = int(resp.headers[‘content-length’])

with tqdm(total=file_size, unit=’B’, unit_scale=True, unit_divisor=1024, ascii=True, desc=’vscode.exe’) as bar:
with requests.get(url, stream=True) as r:
with open(‘vscode.exe’, ‘wb’) as fp:
for chunk in r.iter_content(chunk_size=512):
if chunk:
fp.write(chunk)
bar.update(len(chunk))
tqdm 参数说明:

total:bytes,整个文件的大小

unit=’B’: 按 bytes 为单位计算

unit_scale=True:以 M 为单位显示速度

unit_divisor=1024:文件大小和速度按 1024 除以,默认时按 1000 来除

ascii=True:进度条的显示符号,用于兼容 windows 系统

desc=’vscode.exe’ 进度条前面的文件名

示例结果

断点续传
HTTP/1.1 在协议的请求头中增加了一个名为 Range的字段域, Range 字段域让文件从已经下载的内容开始继续下载

如果网站支持 Range 字段域请求响应的状态码为 206(Partial Content),否则为 416(Requested Range not satisfiable)

Range 的格式

Range:[unit=first byte pos] – [last byte pos],即 Range = 开始字节位置-结束字节位置,单位:bytes
将 Range 加入到 headers 中

from tqdm import tqdm

def duan_download():
url = ‘https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe’

r = requests.get(url, stream=True)

# 获取文件大小
file_size = int(r.headers[‘content-length’])

file_name = ‘vscode.exe’
# 如果文件存在获取文件大小,否在从 0 开始下载,
first_byte = 0
if os.path.exists(file_name):
first_byte = os.path.getsize(file_name)

# 判断是否已经下载完成
if first_byte >= file_size:
return

# Range 加入请求头
header = {“Range”: f”bytes={first_byte}-{file_size}”}

# 加了一个 initial 参数
with tqdm(total=file_size, unit=’B’, initial=first_byte, unit_scale=True, unit_divisor=1024, ascii=True, desc=file_name) as bar:
# 加 headers 参数
with requests.get(url, headers = header, stream=True) as r:
with open(file_name, ‘ab’) as fp:
for chunk in r.iter_content(chunk_size=512):
if chunk:
fp.write(chunk)
bar.update(len(chunk))
示例结果

启动下载一段时间后,关闭脚本重新运行,文件在断开的内容后继续下载

用 Python 实现带音乐的雪花飘落雪景图

用 Python 实现带音乐的雪花飘落雪景图

 

这几天很多地方陆续出现了降雪的天气,对于年内的*场雪,大家的热情显然是比较高涨的,比如很多人顶着雪花到各种景点打卡,再比如一位东北大哥要直播卖雪送辣白菜给南方人。

此事还上了微博热搜,博主唐僧评论:“对卖家来说是买辣白菜送雪,对南方人来说是买雪送辣白菜”,网友 melodyming2 回复:“圣僧我悟了”,大家如果有兴趣的话,可以到网上看一下详细报道,这里就不多说了。

回到正题,本文我们使用 Python 来实现带音乐的雪花飘落雪景图,功能实现用到的 Python 库为 pygame,之前已经多次介绍了,相信大家应该都比较熟悉了。

实现
雪景图的实现还是比较简单的,基本思路如下:

找一张自己喜欢的图片作为背景图

添加雪飞飘落效果

添加音乐效果

首先,我们来生成主窗口及设置背景图,代码实现如下:

bg_img = “bg.jpeg”
bg_size = (900, 500)
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption(“雪景图”)
bg = pygame.image.load(bg_img)
窗口的宽、高根据背景的尺寸来设置。

接着我们来实现雪花飘落效果,先来定义一个雪花列表,代码实现如下:

snow_list = []
for i in range(150):
x_site = random.randrange(0, bg_size[0])   # 雪花圆心位置
y_site = random.randrange(0, bg_size[1])   # 雪花圆心位置
X_shift = random.randint(-1, 1)         # x 轴偏移量
radius = random.randint(4, 6)           # 半径和 y 周下降量
snow_list.append([x_site, y_site, X_shift, radius])
再来实现雪花位置更新,实现动态下雪的效果,代码实现如下:

for i in range(len(snow_list)):
# 绘制雪花,颜色、位置、大小
pygame.draw.circle(screen, (255, 255, 255), snow_list[i][:2], snow_list[i][3] – 3)
# 移动雪花位置(下一次循环起效)
snow_list[i][0] += snow_list[i][2]
snow_list[i][1] += snow_list[i][3]
# 如果雪花落出屏幕,重设位置
if snow_list[i][1] > bg_size[1]:
snow_list[i][1] = random.randrange(-50, -10)
snow_list[i][0] = random.randrange(0, bg_size[0])
因为我们要实现的是雪花不断飘落的效果,因此再来设置一个循环来不断刷新屏幕,代码实现如下:

while not done:
# 消息事件循环,判断退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.blit(bg, (0, 0))
# 雪花列表循环
for i in range(len(snow_list)):
# 绘制雪花,颜色、位置、大小
pygame.draw.circle(screen, (255, 255, 255), snow_list[i][:2], snow_list[i][3] – 3)
# 移动雪花位置(下一次循环起效)
snow_list[i][0] += snow_list[i][2]
snow_list[i][1] += snow_list[i][3]
# 如果雪花落出屏幕,重设位置
if snow_list[i][1] > bg_size[1]:
snow_list[i][1] = random.randrange(-50, -10)
snow_list[i][0] = random.randrange(0, bg_size[0])
# 刷新屏幕
pygame.display.flip()
clock.tick(20)
*后,我们再来为雪景图添加一段音乐效果,代码实现如下:

track = pygame.mixer.music.load(‘my.mp3’)  # 加载音乐文件
pygame.mixer.music.play() # 播放音乐流
pygame.mixer.music.fadeout(100000)  # 设置音乐结束时间
————————————————