白亮吖雅黑丫の小站 - 学习笔记
type: channel
link: http://www.520315.xyz/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
items: .pom文件详解
items: Web 开发的安全之旅 —— 攻击篇 - XSS - CSRF - Injection - Dos - 中间人攻击
items: 让数据库不再成为业务发展瓶颈——分布式数据库架构设计
items: 学习笔记之计算机网络--运输层
items: 百度新闻爬虫搜索引擎实战---爬虫篇（3）
items: 百度新闻爬虫搜索引擎实战---爬虫篇（2）
items: 百度新闻爬虫搜索引擎实战---爬虫篇（1）
items: 快速掌握软件测试
items: 快速掌握计算机网络
items: 快速掌握操作系统

.pom文件详解
type: item
date: 2021-10-06T16:23:00+08:00
description: .pom文件详解<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <parent> <artifactId>xxx</artifactId> <groupId>xxx</groupId> <version>xxx</version> <relativePath>xxx</relativePath> </parent> <modelVersion> 4.0.0 </modelVersion> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <packaging> jar </packaging> <version> 1.0-SNAPSHOT </version> <name> xxx-maven </name> <url> http://maven.apache.org </url> <description> A maven project to study maven. </description> <prerequisites> <maven></maven> </prerequisites> <issueManagement> <system> jira </system> <url> http://jira.baidu.com/banseon </url> </issueManagement> <ciManagement> <system></system> <url></url> <notifiers> <notifier> <type></type> <sendOnError></sendOnError> <sendOnFailure></sendOnFailure> <sendOnSuccess></sendOnSuccess> <sendOnWarning></sendOnWarning> <configuration></configuration> </notifier> </notifiers> </ciManagement> <inceptionYear /> <mailingLists> <mailingList> <name> Demo </name> <post> banseon@126.com </post> <subscribe> banseon@126.com </subscribe> <unsubscribe> banseon@126.com </unsubscribe> <archive> http:/hi.baidu.com/banseon/demo/dev/ </archive> </mailingList> </mailingLists> <developers> <developer> <id> HELLO WORLD </id> <name> banseon </name> <email> banseon@126.com </email> <url></url> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <organization> demo </organization> <organizationUrl> http://hi.baidu.com/xxx </organizationUrl> <properties> <dept> No </dept> </properties> <timezone> -5 </timezone> </developer> </developers> <contributors> <contributor> <name></name> <email></email> <url></url> <organization></organization> <organizationUrl></organizationUrl> <roles> <role> Project Manager </role> <role> Architect </role> </roles> <timezone></timezone> <properties> <dept> No </dept> </properties> </contributor> </cont…

Web 开发的安全之旅 —— 攻击篇 - XSS - CSRF - Injection - Dos - 中间人攻击
type: item
date: 2021-09-19T17:31:00+08:00
description: Web 开发的安全之旅 —— 攻击篇 - XSS - CSRF - Injection - Dos - 中间人攻击生活中经常遇到诈骗的信息，Web开发中也会遇到很多安全的问题，这会危害到用户、公司、还有我们程序员自己（~要被送去祭天~）！！！下面分别从黑客与开发者的角度来看看网络安全的攻击与防御今天先来探索探索Web安全之攻击篇XSS 跨站脚本攻击 Cross-Site ScriptingXSS就是 攻击者往页面中插入攻击脚本，对页面进行攻击攻击者使用XSS，主要是利用了开发者盲目信任用户提交的内容（比如带有恶意的字符串）开发者直接把字符串生成DOM这些恶意的代码可能是document.writeelement.innerHTML = anyStringSSR(user_data) // 伪码XSS的一些特点通常难以从UI上感知（暗地执行脚本）窃取用户的敏感信息（cookie/token）绘制UI（比如弹窗），诱骗用户点击/填写表单举一个例子服务端的两个接口：submit会接收请求，将请求中的参数存入数据库中render会从数据库中读取内容，写在HTML里，然后返回给用户这里没有对用户提交的内容做任何过滤，如果我们是攻击者，可以这样进行攻击：数据使用一个script标签包裹，然后在里面写一些恶意脚本提交给服务器，之后服务器就会返回到页面，脚本就会被执行常见XSS攻击方式下面我们来介绍几种常见的XSS攻击方式存储型 Stored XSS恶意脚本被存在数据库中访问页面 -> 读数据 === 被攻击危害最大，对全部用户可见反射型 Reflected XSS不涉及数据库从URL上攻击在URL参数上加入恶意脚本，服务端解析参数放入响应体中，导致恶意脚本注入成功DOM型 Dom-based XSS不需要服务器的参与恶意攻击的发起 + 执行，都是在浏览器完成的注意反射型与DOM型的区别Mutation-based XSS利用了浏览器渲染DOM的特性（独特优化）不同浏览器，会有区别（按浏览器进行攻击）嵌入上面这样一段文本内容，导致浏览器解析出来的HTML是下面这样的img标签的src属性出错，导致执行onerror里的内容，这里可以注册恶意脚本，进行攻击CSRF 跨站请求伪造我们再来说说另一个攻击方式 Cross-site request forgery(CSRF) 跨站请求伪造它又哪些特点呢？在用户不知情的前提下利用用户的权限（cookie）构造指定HTTP请求，窃取或修改用户敏感信息看一个小demo示例 用户收到一封标题特别吸引人的邮件，他回点击进行查看，邮件是一个恶意的页面B，在访问这个B页面的时候，拿到了一些用户信息，然后他偷偷的将这些信息发送到 A服务上，这里用户是没有自己主动访问A的，此时A就拿到了用户的敏感信息，可以进行他想进行的操作了！可以发一个GET请求 可以把链接放在a标签或者img标签中，a标签需要用户主动点击触发，而img标签进入页面自动就会触发也可以是其他的请求类型利用表单，提交一个POST请求 注入 InjectionSQL注入我们来看看什么是SQL注入SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严，攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句，在管理员不知情的情况下实现非法操作，以此来实现欺骗数据库服务器执行非授权的任意查询，从而进一步得到相应的数据信息。我们来看一些例子① 服务端读取一些请求字段 ② 直接将这些字段以字符串的形式拼接 SQL 语句 如果这些字符串是恶意的，SQL语句随便删点东西，那就对我们的数据库进行了很大的损害了~其他注入不仅仅是SQL的注入，还可以是 ① cli ② OS command ③ SSRFcli调用虚拟视频格式转换脚手架，脚手架接收一些参数，这些参数允许用户自定义options 攻击者可以传入这样的options，直接删库，让他们程序员赶紧跑路OS command你的服务端暴露了一些敏感的重要文件，导致被攻击者读取和修改比如，通过nginx的配置，将访问流量转发到第三方网站，让他们的服务器不堪重负，直接下线Server-Side Request Forgery（SSRF）服务端伪造请求（严格⽽⾔，SSRF 不是 injection，但是原理类似）这样可能回将内网的信息暴露给外部，导致外部可能会对内网的一些配置进行攻击 DoS通过某种⽅式（构造特定请求），导致服务器资源被显著消耗， 来不及响应更多请求，导致请求挤压，进⽽雪崩效应。回顾一下：正则表达式——贪婪模式重复匹配时「?」 vs 「no ?」：满⾜“⼀个” 即可 vs 尽量多ReDoS 基于正则表达式的Dos贪婪：n 次不⾏？n - 1 次再试试？——回溯暴力回溯，会导致…

让数据库不再成为业务发展瓶颈——分布式数据库架构设计
type: item
date: 2021-09-06T12:54:00+08:00
description: 让数据库不再成为业务发展瓶颈——分布式数据库架构设计摘要企业如何实现高容量大并发数据库服务？公司业务高速发展，单实例数据库到达瓶颈的情况下，如何做好分布式设计，提供高并发高性能的数据库服务以支撑业务增长？本次分享主要内容包括数据库分布式架构设计思路，拆分原理，改造难点，解决方案等，让数据库不再成为业务发展瓶颈。内容来源：2017年6月4日，袋鼠云首席数据库架构师宏翊在“企业互联网架构优化升级之路”进行《让数据库不再成为业务发展瓶颈——分布式数据库架构设计》演讲分享。IT 大咖说作为独家视频合作方，经主办方和讲者审阅授权发布。阅读字数：1705 | 3分钟阅读嘉宾演讲视频回放：http://t.cn/RQCVFyS为什么要做分布式？高并发：分布式应用带来更大量的数据库请求。高容量：业务增长，产生大量在线数据。资源向上扩展存在天花板。支撑业务高速发展，平滑扩容。拆分原则：循序渐进在业务初期，客户量比较少，可以把所有服务和数据都存在一个实例上，都能支持业务的发展。发展之后的客户量、数据量和并发都上来了，这时数据库很容易出现瓶颈。我们建议大家首先进行服务化的改造，将不同的业务模块做垂直梳理，把不同服务的数据库相互隔离，中间的交互由业务上去实现。这样数据库就可以分布在不同的实例上，能够支持相对较高的并发和容量。继续发展的话，实例依然是一个瓶颈，这时我们就要考虑做水平的拆分。把一个服务的数据分布到不同的实例上，以支持扩展、高并发、大容量的数据库服务。拆分需要循序渐进，然后做服务的梳理，最后再做水平拆分。水平拆分会引入一些复杂性，研发方面需要考虑的东西就比较多，所以需要谨慎地做拆分。数据库的拆分和业务架构紧密结合，有时在业务上的一个小改动完全可以把压力挡在数据库之外。水平拆分的难点水平拆分的一个服务数据会分布到不同的底层数据库上，所以会带来一些复杂性。系统架构需要适应数据库的分布式，就需要做一些改造。面临的技术挑战就是应用需要处理复杂的分布式逻辑，比如分布式的事务、跨库查询。在稳定性方面也会有一些挑战，但不是最主要的。主要是分布式的局限性，分布式数据分布在不同的数据库上，它不支持跨库的join、分布式事务、以及全局sequence等。解决方案：客户端实现数据路由在客户端直接做一个配置，去实现路由的功能。它的好处就是不需要引入额外模块，整体架构不变；程序的把控力强，场景简单方便使用；对代码的侵入性强；配置管理复杂。此方案不会引入额外的组建，架构上比较轻量，简单场景使用尚可，比如配置管理复杂等，不建议使用。解决方案：数据库中间件实现自动分库分表，对应用透明；使用门槛极低，应用改造量小；方便的动态水平扩容；针对分布式的各种定制功能，如异构索引、小表广播等；最重要的是，有了数据库中间件，应用看到还是单一的数据库。中间件的使用最大限度的屏蔽了分布式数据库所引入的复杂性，极大降低了研发的门槛。DRDS功能简介分库分表是DRDS的核心功能，支持数据的多维度切分和路由访问；内建读写分离功能，可以灵活配置访问权重；自带全局唯一ID组件；查询引擎识别和下推复杂查询，兼容98% MySQL语法；弹性扩容组件实现自动化在线水平扩容。DRDS物理框架数据拆分，能够组合1K个MySQL；分布式SQL查询引擎与高度的SQL兼容性；数据存储的平滑扩容；处理性能的弹性伸缩；读写分离（应用透明）；小表广播、跨库join、全局sequence。主库和读库通过数据库的原生复制实现，数据是强一致的。DRDS会自动判断请求，然后做分发。事务性的操作全部路由到主库上去，读库则承担一些读的操作。把join从DRDS层往下推，在MySQL层实现它的join，业务设计上要避免跨库join。分布式SQL规范设计：最佳实践查询尽可能带上分库条件。如果把一个表拆分到底层的十个库，查询的时候每次都带上一个拆分条件，DRDS能够很清楚地把请求路由到底层的库上。Join的时候有几种解决方案。一种是两个表的分库键都相等去做join，这样就能限定在一个库上。还有一种是广播表，join的字段不一样，但是每个表都带上分库的条件，这样还是会限定在同一个库里面。EasyDB：数据库自动化管理平台资源：实时监控数据库和服务器空间的使用状态。高可用：云上高可用架构设计，故障自动切换。备份：定期的数据库全量，增量备份，可灵活配置。监控：异常情况下自动捕获和告警，支持短信，邮件和微信通知。性能：超过50个指标性能趋势和SQL采集，实时监控数据库的运行状态。日志：数据库错误日志采集。安全：数据库账号和操作的审计，基于服务器的安全设计。我今天的分享就到这里，谢谢大家！https://juejin.cn/post/6844903552662552584?share_token=2e4ab195-e3fc-435f-abdc-ea…

学习笔记之计算机网络--运输层
type: item
date: 2021-07-31T21:35:00+08:00
description: 【学习笔记】计算机网络 谢希仁版（五）运输层（重点）教材：计算机网络(第七版)谢希仁版运输层1. 网络进程间的通信，端口号，套接字，在网络上唯一标识一个进程从通信和信息处理的角度看，运输层向它上面的应用层提供通信服务，它属于面向通信部分的最高层，同时也是用户功能中的最底层。这里要注意一点： 从运输层的角度看，通信的真正端点并不是主机而是主机中的进程，也就是说，端到端的通信应用进程之间的通信。运输层提供应用进程间的逻辑通信。好像这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。 从上图可以看出，网络层为主机之间提供逻辑通信，而运输层为应用进程之间提供端到端的逻辑通信。此外，运输层还要对收到的报文进行差错检测。2. UDP 与 TCP运输层需要有两种不同的运输协议，面向连接的TCP和无连接的UDP。用户数据报协议UDP传输控制协议TCP运输协议数据单元TPDU：两个对等运输实体在通信时传送的数据单元。运输层向高层用户屏蔽了下面网络核心的细节，他使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通路，但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时，这种逻辑通信信道仍然是一条不可靠信道。复用：应用层所有的应用进程都可以通过运输层再传送到IP层。分用：运输层从IP层收到发送给各应用进程的数据后，必须分别交付执明的各应用进程。2.1 端口服务器端使用的端口号这里分两类，最重要的一类叫熟知端口号或系统端口号。 值为0-1024客户端使用的端口号值为49152-65535 这类端口号仅在客户进程运行时才动态选择。因此又叫短暂端口号。2.2 UDP2.2.1 概述UDP是无连接的发送数据之前不需要建立连接，因此减少了开销和发送数据之前的时延。尽最大努力交付及不保证可靠交付，因此主机不需要维持复杂的连接状态表。面向报文发送方的UDP对应用程序交下来的报文，在添加首部后就向下交付IP层。UDP对应用层交下来的报文，既不合并，也不拆分。而是保留这些报文的边界。 4. UDP是没有控制拥塞的。 5. UDP支持一对一、一对多、多对一、多对多的交互通信。 6. 首部开销小，只有8字节，比TCP的20字节小。2.2.2 首部格式源端口源端口号。在需要对方回信时选用。不需要的时候可用全0。目的端口目的端口号。这在终点交付报文时必须使用。长度UDP用户的数据报长度。其最小值时8(仅有首部)。检验和检测UDP用户数据报在传输中是否有错。有错就丢弃。 注意：UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时，要在UDP用户数据报之前增加12个字节的伪首部。和IP数据报的检验和只检验IP数据报的首部不同，UDP的检验和是把首部和数据部分一起都检验。2.3 TCP2.3.1 特点面向连接的运输层协议。在应用程序在使用TCP协议之前，必须先建立TCP连接。在传送数据完毕后，必须释放已经建立的TCP连接。每一条TCP连接只能有两个端点，每一条TCP连接只能是点对点的。TCP提供可靠交付的服务。通过TCP连接传送的数据，无差错，不丢失，不重复，并且按序到达。TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。面向字节流。TCP的流是指流入到进程或从进程流出的字节序列。虽然应用程序和TCP的交互式一次一个数据块，但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。 TCP报文段先要传送到IP层，加上IP层首部后，再传送到数据链路层。再加上数据链路层的首部和尾部后，才离开主机发送到物理链路。3. TCP 报文段首部TCP虽然是面向字节流的，但TCP传送的数据单元却是报文段。源端口和目的端口：各占2个字节，分别写入源端口号和目的端口号。序号：占4字节。序号范围是[0,2e32-1]个序号。序号增加到2e32-1后，下一个序号就又回到0。也就是说，序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如，一报文段的序号是301，而接待的数据共有100字节。这就表明：本报文段的数据的第一个字节的序号是301，最后一个字节的序号是400。显然，下一个报文段（如果还有的话）的数据序号应当从401开始，即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。确认号：占4字节。是期望收到对方下一个报文段的第一个数据字节的序号。例如，B正确收到了A发送过来的一个报文段，其序号字段值是501，而数据长度是2…

百度新闻爬虫搜索引擎实战---爬虫篇（3）
type: item
date: 2021-03-01T12:45:00+08:00
description: 爬虫部分书接上回，我们讲到，要用elasticsearch来存储信息，那么我们首先就得安装elasticsearch。这里就不介绍了，默认已经装好elasticsearch，那我们就正式开始写爬虫了。1. Scrapy创建爬虫项目(baidunewsspider) C:\Users\LiTangMM\PycharmProjects>scrapy startproject baiduNewsSpider (baidunewsspider) C:\Users\LiTangMM\PycharmProjects\baiduNewsSpider>scrapy genspider newsbaidu http://ne ws.baidu.com/终端显示如上就说明爬虫已经创建好了。项目长这样。2. 爬取新闻链接2.1 定义字段我们首先得告诉scrapy，我们要哪些数据，编辑baiduNewsSpider/items.py 文件：# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class BaidunewsspiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() news_url = scrapy.Fileld() # 新闻链接 passpass 可以只是为了代码块完整性才加的，可以删除。2.2 实现newsbaidu.pyOK！下面就是爬取了，修改baiduNewsSpider/spiders/newsbaidu.py文件# -*- coding: utf-8 -*- import scrapy import json import re from baiduNewsSpider.items import BaidunewsspiderItem class NewsbaiduSpider(scrapy.Spider): name = 'newsbaidu' allowed_domains = ['http://news.baidu.com/'] start_urls = [] def start_requests(self): # 重写请求构造函数 baseurl = 'http://news.baidu.com/widget?id={}&ajax=json&t=1565919256596' widget_ids = ['civilnews', 'InternationalNews', 'EnterNews', 'SportNews', 'FinanceNews', 'TechNews', 'MilitaryNews', 'InternetNews', 'DiscoveryNews', 'LadyNews', 'HealthNews', 'PicWall'] return [scrapy.FormRequest(baseurl.format(_)) for _ in widget_ids] def parse(self, response): # 解析函数 widgetid = re.match(r'.*?id=(.*?)&', response.url).group(1) # 从response中提取url，使用正则匹配提取id值 jsondate = json.loads(response.text) # 将response的内容使用json解析 news_list = jsondate.get('data').get(widgetid).get('focusNews') # 提取内容 for news in news_list: yield BaidunewsspiderItem(news_url=news['m_url']) # 返回一个迭代器2.3 爬取并保存打开shell，输入scrapy crawl newsbaidu -o urls.csv 启动爬虫。我们使用命令将数据爬取并保存下来。3. 爬取新闻内容3.1 创建另一个爬虫scrapy genspider newsspider3.2 定义itemclass NewsItem(scrapy.Item): url = scrapy.Field() # 新闻链接 title = scrapy.Field() # 新闻标题 content = scrapy.Field() #…

百度新闻爬虫搜索引擎实战---爬虫篇（2）
type: item
date: 2021-03-01T12:44:00+08:00
description: 爬虫部分新闻链接爬取（2）书接上回，我们获取到了使用动态加载技术加载的新闻链接，但是，有些不是动态加载的新闻链接，我们还没有处理。我们将doc类型文档拷贝下来，放入HBuilder X编辑器中，然后打开内置浏览器，打开开发者工具。这里不直接使用chrome定位元素，因为chrome看到的html实际上不是我们这个请求获取到的代码。我们定位到了一个 div 它子元素 是一个 div 和5个无序列表，显然，这就是我们要找的。仔细观察，我们发现新闻链接 a 标签都在 li 标签中。很好，那我们就有思路了。模拟请求，获取相应。取出 所有的 li 标签下的 a 标签。a 标签的href 属性就是我们要的新闻链接“Talk is cheap,give me code.”import requests import lxml.html url = 'http://news.baidu.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ron3RQTjnOqKPTpQT8r5b_OK5Oib4j-KbONab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TXDN0qtTteJb3fL-08MJnEqbTkq4bohjPyX-jeBtQm05bxobLyJD5b_n6Ljn8MMpkS-P5n0jcqbHrDs4PbWDFKMC_GjjthDjPVMmTt2tc2K6r-04_8Kb7VbIJCXMnkbftWXfvmQ-oI-jvdWx5n2t5ZSfnueMri5bK7yajK2hTJbD3MVlrh3bvsVCbPQJ7pQT8ryhAOK5OibCrk2b5oab3vOpRzXpO1KMPzBN5thURB2DkO-4bCWJ5TMl5jDh05y6TLeHLDtTkqtR3tWJTOaj6jDbTnMIT8bKCShUFsy5cJB2Q-5KL--qoZeJ4G5pnVMMtq5JrPXPnpJCczafbdJJjoh4Pl-to2-fD7jnQHKTQdBgTxoUJh5DnJhhvG-xAb…

百度新闻爬虫搜索引擎实战---爬虫篇（1）
type: item
date: 2021-03-01T12:42:00+08:00
description: 爬虫部分首先，我们得爬取百度新闻的信息。爬虫分为两部分：获取新闻链接通过链接爬取新闻信息新闻链接爬取（1）1.获取新闻链接1.1 分析请求打开chrome浏览器，输入百度新闻链接，按F12打开开发者工具，依次点击Network->Doc，再刷新一次网页，效果如下：我们看到了所有返回doc的请求。接着，我们点击Preview选项卡：通过预览，我们可以看到这个请求热点要闻、热搜新闻词和百家号三个模块的信息，这些蓝色的链接就是我们要的新闻链接。点击Headers选项，我们可以看到请求的构造：很好，我们现在就可以通过构造类似请求来获取到热点要闻、热搜新闻词和百家号三个模块的信息了。构造请求，获取相应，解析html。但是，事情并不简单。我们滚动页面：我们发现还有一些模块并不在我们找到的那个请求中。我们判断，这些内容是在我们滚动页面时通过动态加载上去的。点击XHR选项卡，我们找到了一些线索：我们发现这些请求都带着一个 id 属性，而这些属性的中文恰巧对应我们看到的那个模块的名字。我们看看第一个xhr类型请求：它比我们找到的第一个请求多了一个Query String Parameters 属性，id表示模块名，t表示时间，ajax表示返回类型。这个时间如果用 ms 表示49年多，而计算器时间都是从1970年开始算起，所以这个数字表示的是ms。看完了请求的结构，我们可以看看服务器相应的内容了这个请求返回了一个json 结构数据，新闻链接就放在键值对内。除了当地新闻模块，其他模块的请求都返回了一个html，新闻链接放在html中。值得注意的是这些模块的请求的Query String Parameters 属性中没有ajax键。1.2 构造请求我们暂时放下第一个请求。我们首先实现返回json数据的请求：import requests import json url = 'http://news.baidu.com/widget?id=LocalNews&ajax=json&t=1565742671236' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'http://news.baidu.com/guoji', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': 'BAIDUID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB:FG=1; BIDUPSID=BB2DCB09D0BCEF14D99F6A6A6CE5A1DB; PSTM=1549988189; BDUSS=H40YlBUdE5FaklweFFvc2szYmpILWRTdGlGeTlPRUxYZ3hPdVctQXVDYWVmelZkSVFBQUFBJCQAAAAAAAAAAAEAAAAVmE-ksKLA78K3ybXJtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ7yDV2e8g1dd; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1450_21092_29522_29518_29098_29568_28831_29221_22159; BDSFRCVID=M_0sJeCCxG3jeU3w_mtxLaFULTy8O-bEthyW3J; H_BDCLCKID_SF=tbkD_C-MfIvjHn8z2KT8bKCShUFsK6jW-2Q-5hOy3KO8eqRv5pnGX4P-KHrf3x6dtNLqL-L2MPOvhpFuDTtajj3QeaRt2tcyatj2WnTJ25r8e5rnhPF3yftTKP6-3MJO3b7B0l7FbM7G8h6bMf8By58dyajCQlkHaI5mohFLtDKhbKKCj5RMK4_SMUoHetrK-D5XQbC8Kb7VbpTEDMnkbfJBDGJR5-Pq-jvdblRhBCQIjMnTyURdXlD7yajKBlvWWmbx2Ro…

快速掌握软件测试
type: item
date: 2021-02-24T14:14:41+08:00
description: 1.两种集成测试1.1自顶向下测试特点：是从程序的初始模块开始测试。（1）该方法会在早期发现顶层的错误。（2）早期的程序框架可以进行演示（3）需要开发桩模块辅助测试。有些甚至需要多个桩模块辅助，加大了桩模块本来的错误影响。（4）测试完一个上层模块后，挑选哪个模块作为下一个测试模块，以及测试的顺序没有唯一的界定标准。优点：较早地验证了主要控制和判断点；按深度优先可以首先实现和验证一个完整的软件功能；功能较早证实，带来信心；只需一个驱动，减少驱动器开发的费用；支持故障隔离。缺点：柱的开发量大；底层验证被推迟；底层组件测试不充分。1.2自底向上测试：特点：是从程序的底层模块开始测试。（1）I/O操作可以提前测试，更好提交测试用例。（2）测试后比较容易观察输出。（3）需要开发驱动模块（4）直到最后一个模块提交，程序才能完整的系统测试。优点：对底层组件行为较早验证；工作最初可以并行集成，比自顶向下效率高；减少了桩的工作量；支持故障隔离。缺点：驱动的开发工作量大；对高层的验证被推迟，设计上的错误不能被及时发现。2.逻辑覆盖语句覆盖：（最弱）程序中每条可执行语句都有至少执行一次。判定（分支）覆盖：（较弱）每个判断的真假分支至少执行一次。条件覆盖：（弱）每个判定中的每个条件可能至少满足一次。判定/条件覆盖：（强）每个判断的真假分支至少执行一次。每个判定中的每个条件可能至少满足一次。条件组合覆盖：（较强）每个判定中条件的各种可能组合至少满足一次。路径覆盖：（最强）把所有可能路径至少都走一遍。3. 黑盒测试方法等价类划分法：边界值划分法：决策表法：错误推测法因果图法场景法4. 白盒测试方法代码检查法静态结构分析法逻辑覆盖法（*）基本路径测试法路径覆盖（*）5. 软件测试模型6. 自动化测试工具7.α、β、λ测试软件测试一般分α、β、λ三个阶段，α是第一阶段，一般只供内部测试使用，公司内部用户；β是第二个阶段，已经消除了软件中大部分的不完善之处，但仍有可能还存在缺陷和漏洞，一般只提供给特定的用户群来测试使用；λ是第三个阶段，此时产品已经相当成熟，只需在个别地方再做进一步的优化处理即可上市发行。8. 动态 静态测试静态测试： 静态测试是指不运行被测程序本身，通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。静态测试主要包括各阶段的评审、代码检查、程序分析、软件质量度量等，用于对被测程序进行特性分析。动态测试： 通过运行被测程序来检查运行结果与预期结果的差异，并分析运行效率和健壮性等指标；这种方法包括三部分：构造测试用例、执行程序、分析程序的输出结果。9. 测试过程按4个步骤进行，即单元测试、集成测试、确认测试和系统测试及发版测试。开始是单元测试，集中对用源代码实现的每一个程序单元进行测试，检查各个程序模块是否正确地实现了规定的功能。集成测试把已测试过的模块组装起来，主要对与设计相关的软件体系结构的构造进行测试。确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求，以及软件配置是否完全、正确。系统测试把已经经过确认的软件纳入实际运行环境中，与其它系统成份组合在一起进行测试。10. 冒烟测试（不过，返工或等下一次重建）概念冒烟测试就是在每日build（构建版本）建立后，对系统的基本功能进行简单的测试。这种测试强调程序的主要功能进行的验证，而不会对具体功能进行更深入的测试。题目冒烟测试为一个测试阶段 (×)冒烟测试需要把此次需求的主流程都走一遍 (×)其他研发需要对自己的代码审核， 检查代码的正确性，这个过程我们称为 代码走查在以下测试阶段中，哪些涉及到路径测试 集成测试、单元测试IOS单元测试框架：OCUnit 、XCTest、 GHUnit、 OCMock转载至CSDN博主：[李唐敏民]

快速掌握计算机网络
type: item
date: 2021-02-24T14:14:00+08:00
description: 考点一：OSI七层参考模型OSI从逻辑上，把一个网络系统分为功能上相对独立的7个有序的子系统，它们由低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。（1）物理层（Physical，PH）传递信息需要利用一些物理传输媒体，如双绞线、同轴电缆、光纤等。物理层的任务就是为上层提供一个物理的连接，以及该物理连接表现出来的机械、电气、功能和过程特性，实现透明的比特流传输。在这一层，数据还没有组织，仅作为原始的比特流提交给上层——数据链路层。（2）数据链路层（Data-link，D）数据链路层负责在2个相邻的结点之间的链路上实现无差错的数据帧传输。每一帧包括一定的数据和必要的控制信息，在接收方接收到数据出错时要通知发送方重发，直到这一帧无差错地到达接收结点，数据链路层就是把一条有可能出错的实际链路变成让网络层看起来像不会出错的数据链路。实现的主要功能有：帧的同步、差错控制、流量控制、寻址、帧内定界、透明比特组合传输等。（3）网络层（Network，N）网络中通信的2个计算机之间可能要经过许多结点和链路，还可能经过几个通信子网。网络层数据传输的单位是分组（Packet）。网络层的主要任务是为要传输的分组选择一条合适的路径，使发送分组能够正确无误地按照给定的目的地址找到目的主机，交付给目的主机的传输层。（4）传输层（Transport，T）传输层的主要任务是通过通信子网的特性，最佳地利用网络资源，并以可靠与经济的方式为2个端系统的会话层之间建立一条连接通道，以透明地传输报文。传输层向上一层提供一个可靠的端到端的服务，使会话层不知道传输层以下的数据通信的细节。传输层只存在端系统中，传输层以上各层就不再考虑信息传输的问题了。（5）会话层（Session，S）在会话层以及以上各层中，数据的传输都以报文为单位，会话层不参与具体的传输，它提供包括访问验证和会话管理在内的建立以及维护应用之间的通信机制。如服务器验证用户登录便是由会话层完成的。（6）表示层（Presentation，P）这一层主要解决用户信息的语法表示问题。它将要交换的数据从适合某一用户的抽象语法，转换为适合OSI内部表示使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩、加密和解密等工作都由表示层负责。（7）应用层（Application，A）这是OSI参考模型的最高层。应用层确定进程之间通信的性质以满足用户的需求，以及提供网络与用户软件之间的接口服务。考点二： TCP/IP 体系结构TCP/IP 是Internet上的标准通信协议集，该协议集由数十个具有层次结构的协议组成，其中TCP和IP是该协议集中的两个最重要的核心协议。TCP/IP协议族按层次可分为以下四层：应用层、传输层、网络层和网络接口层，各层对应的PDU数据单元的名称如下图所示。考点三： IP协议在网络层工作，为了解决MAC地址不能区分两台主机是否属于同一个网络，制定的一套新地址，即IP地址。IPv4表达方式有两种表达方式，十进制和二进制（8bit），分为4组，每组范围是[0~255]。IPv4地址结构（重要）A类：第一组范围为0~127的地址，即第一组二进制首位为0B类：第一组范围为128~191的地址，即第一组二进制首位为10C类：第一组范围为192~223的地址，即第一组二进制首位为110D类：第一组范围为224~239的地址，即第一组二进制首位为1110E类：第一组范围为240~255的地址，即第一组二进制首位为1111子网寻址IP地址分为三级：网络号、子网号、主机ID。子网号：原有主机号借用若干位。网络号：网络信息中心分配。子网掩码(重要)子网掩码中，1对应ip中的网络号和子网号，0对应主机号。将ip地址与子网掩码进行按位与运算，得到的便是子网标识符。例题：已知一个IP地址为10.5.136.5, 子网掩码为255.255.64.0, 他的网络号和主机号分别是？136 为 10001000，64 为 01000000与运算为 0 ，所以 网络号为 10.5.0.0 ，主机号为 5ARP，ICMPARP：地址解析协议，将IP地址映射为MAC地址ICMP：Internet控制报文协议，控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。Ping和tracert原理特殊用途地址127.0.0.1：指电脑本身0.0.0.0 :集合255.255.255.255：广播地址IP数据包考点四：TCP协议TCP报文确认号ack：占4个字节，期待收到对方下一个报文段的第一个数据字节的序号；确认ACK：占1位，仅当ACK=1时，确认号字段才有效。ACK=0时，确认号无效三次握手四次挥手私有地址的范围分别是：A类地址范围：10.0.0.0—10.255.255.255；B类地址范…

快速掌握操作系统
type: item
date: 2021-02-24T14:12:50+08:00
description: 1 处理机调度和死锁1.1 处理机调度在多道程序系统中，调度的实质是一种资源分配，处理及调度是对处理及资源进行分配。1.1.1 层次高级调度（外存 -> 内存 -> 就绪）（多道）又称长程调度或作业调度，调度对象是作业。主要功能是根据某种算法，决定将外存上处于后备队列中的哪几个作业调入内存，为它们创建进程、分配必要的资源，并将它们放入就绪队列。低级调度（就绪 -> 运行）（多道、分时、实时）又称短程调度或进程调度，调度对象是进程。主要功能是，根据某种算法，决定就绪队列中哪个进程获得处理机。中级调度（内存外存）又称内存调度。提高内存利用率和系统吞吐量。为此，把暂时不能运行的进程，调至外存等待（挂起）。当它们具备运行条件且内存有空闲是，把外存上的就绪进程重新调入内存（就绪）。1.1.2 处理机调度算法的目标共同目标提高资源利用率公平性平衡性策略强制执行批处理系统的目标平均周转时间短系统吞吐量高处理机利用率高分时系统的目标响应时间快均衡率实时系统的目标截止时间的保证可预测性1.2 作业与作业调度算法1.2.1 先来先服务（FCFS）和短作业优先（SJF）1.2.2 优先级调度算法（PSA）和高响应比（HRRN）1.3 进程调度1.3.1 轮转调度算法（RR）1.3.2 优先级调度算法1.3.3 多队列调度算法1.3.4 多级反馈调度算法1.4 实时调度1.4.1 最早截止时间优先（EDF）1.4.2 最低松弛度优先（LLF）1.6 死锁（特别重要）1.2.1 定义在一组进程发生死锁的情况下，这组死锁进程中每一个进程，都在等待另一个死锁进程所占有的资源。或者说，每个进程所等待的事件是该组中其他进程释放所占用的资源。但由于所有这些进程都已无法运行，因此它们谁都不能释放资源，致使没有任何一个进程可被唤醒。1.2.2 起因竞争不可抢占性资源竞争可消耗资源引起死锁进程推进顺序不当1.2.3 产生的必要条件死锁发生必须具备四个必要条件：1. 互斥条件： 分配的资源使用具有排它性。2. 请求和保持条件：进程已经保持至少一个资源，但又提出了新的资源请求。3. 不可抢占条件：进程已获得不能被剥夺。4. 循环等待条件：存在一个资源环形等待链。1.2.4 处理方法预防死锁避免死锁检测死锁解除死锁1.2.5 预防死锁破坏请求和保持条件所有进程开始运行之前，必须一次性地申请其在运行过程中所需的全部资源允许一个进程只获得运行初期所需要的资源后开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源，然后再请求新的所需资源。破坏不可抢占条件当一个已经保持了某些不可被抢占资源的进程，提出新的资源请求而不能得到满足时，它必须释放已经保持的所有资源，待以后需要时再重新申请。破坏循环等待条件对系统所有资源类型进行线性排序，并赋予不同的序号。规定每个进程必须按序号递增的顺序请求资源。一个进程在开始时，可以请求某类序号为 i 的资源，以后只能请求 序号大于 i 的资源，或释放 i 请求任意资源。1.2.6 避免死锁银行家算法进程（重要）1. PCBPCB是用来记录进程信息的数据结构2. 进程的状态就绪状态执行状态阻塞状态3. 状态变化事件空->新建：创建执行一个程序的新进程，可能的事件有：新的批处理作业、交互登录（终端用户登录到系统）、操作系统因为提供一项服务而创建、由现有的进程派生等。新建->就绪：操作系统准备好再接纳一个进程时，把一个进程从新建态转换为就绪态。就绪->运行：需要选择一个新进程运行时，操作系统的调度器或分配器根据某种调度算法选择一个处于就绪态的进程。运行->退出：导致进程终止的原因有：正常完成、超过时限、系统无法满足进程需要的内存空间、进程试图访问不允许访问的内存单元（越界）、算术错误（如除以0或存储大于硬件可以接纳的数字）、父进程终止（操作系统可能会自动终止该进程所有的后代进程）、父进程请求终止后代进程等。运行->就绪：最常见的原因是，正在运行的进程到达了“允许不中断执行”的最大时间段，该把处理器的资源释放给其他在就绪态的进程使用了；还有一中原因可能是由于具有更改优先级的就绪态进程抢占了该进程的资源，使其被中断转换到就绪态。运行->阻塞：如果进程请求它必须等待的某些事件，例如一个无法立即得到的资源（如I/O操作），只有在获得等待的资源后才能继续进程的执行，则进入等待态（阻塞态）。阻塞->就绪： 当等待的事件发生时，处于阻塞态的进程转换到就绪态。就绪->退出：在上图中没有标出这种转换，在某些进程中，父进程可以在任何时刻终止一个子进程，如果一个父进程终止，所有相关的子进程都被终止。阻塞->退出：跟上一项原因类似。内存管理要解决的两个问题每个进程代码中使用的地址可能相同。解决思路：对代码中的地址重定向（加个基地址）。物理内存可能比较小，不能同时放很…