一、暴力破解 1、概述 “暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 2、基于表单的暴力破解 条件:用户没有任何安全验证,可直接抓包进行暴力破解。
3、验证码绕过 验证码绕过(on server):验证码校验在服务端完成,但是验证码存在时效性,这个时候我们可以在这个时效内进行抓包实现短时间内的验证码绕过。
验证码绕过(on client):在前端进行验证码的校验,这个时候驶入正确的验证码提交,进行抓包后,我们通过修改密码和账号发现我们不需要再对验证码进行修改,从而绕过了验证码,实现暴力破解。
4、token防爆破? 由于token值输出在了前端的源码中,容易被获取,因此也就失去了防爆破的意义。我们可以在每次暴力破解的过程中获取到前端页面生成的token的值,从而实现暴力破解。
5、安全策略 1.是否要求用户设置复杂的密码;
2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机app;
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
4.是否采用了双因素认证;
二、XSS 1、基本概念和原理介绍 跨站点脚本攻击,指攻击者通过篡改网页,嵌入恶意脚本程序,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS
交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询
2.存储型XSS
交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。
3.DOM型XSS
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
形成原因
形成xss漏洞的主要原因是程序对输入输出的控制不够严格,导致“精心设计”的脚本输入后,在输出到前端时被浏览器当作有效代码执行从而产生危害。
2、跨站脚本漏洞测试流程 (1)在目标站点上找到输入点,比如查询接口,留言板等。
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理。
(3)通过搜索定位唯一字符,结合唯一字符前后语法确认是否可以执行js的条件(构造闭合)。
(4)提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在现在xss漏洞;
TIPS:
(1)一般查询接口容易出现反射型xss,留言板容易出现存储型xss;
(2)由于后台可能存在过滤措施,构成的script可能会被过滤掉,二无法生效,或者环境限制了执行(浏览器)。
(3)通过变化不同的script,尝试绕过后台过滤机制。
3、安全策略 (1)输入时:严格过滤单引号,双引号,尖括号。
记住一点:不要相信任何输入的内容。例如用户名只能以字母和数字组合,手机号码只能有 11 位且全部为数字,否则即为非法。这些格式检查类似于白名单效果,限制输入允许的字符,让一下特殊字符的攻击失效。
(2)输出时:对单引号,双引号,尖括号等转化为HTML实体。
三、csrf 1、原理 CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。
2、如何确认一个web系统纯在CRSF漏洞 (1)对目标网站增删查改的地方进行标记,并观察其逻辑,判断是否可以被伪造
–比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;
功能:
1.输入网址生成二维码
2.二维码可以下载
3.可以更改二维码中心的图片
4.可以通过本地相册的二维码进行解码
1.下载三个插件 下载vue-qr,用于生成二维码
npm install vue-qr 下载vue-jimp并指定版本号,最新版不行,实现不了 。Jimp 库读取图片数据。Jimp 是一个用于处理图像的 JavaScript 库,它可以从数据中创建图像对象。
npm install jimp@0.16.1 下载jsqr,用于将二维码进行解码
npm install jsqr 2.完整代码如下 不太好讲我直接做了注释,看注释应该能看懂吧
<template> <div class="content-box"> <div class="container"> <h1>二维码输入网址生成、下载</h1> <el-row> <el-col :span="6"> <el-input v-model="text" placeholder="输入要生成二维码的网址"></el-input> </el-col> <el-col :span="4" :push="1"> <el-button><a :href="href" target="_blank" download="已下载二维码" rel="noopener noreferrer">下载二维码</a></el-button> </el-col> <el-col :span="4" :push="1"> <input type="file" @change="updateImg" name="file" class="element" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" /> </el-col> </el-row> <el-row style="margin-top: 20px;"> <el-col :span="6"> <vue-qr qid="qrid" :text="text" :size="size" :bgSrc="
说明 该指令用于实现页面元素滚动到窗口可视范围时,执行动画,并且执行一次。动画为从底向上的移入效果,可以指定距离和动画的持续时间,不指定则为默认设置的距离与时间
当书写指令后打开页面没效果先想一下是不是一开始就在可视范围了
当指定的距离是负数时将会从上到下移入
指令源代码 const DISTANCE = 100; // 距离 const ANIMATIONTIME = 500; // 500毫秒 let distance: number | null = null, animationtime: number | null = null; const map = new WeakMap(); const ob = new IntersectionObserver((entries) => { for (const entrie of entries) { if (entrie.isIntersecting) { const animation = map.get(entrie.target); if (animation) { animation.play(); ob.unobserve(entrie.target); } } } }); function isBelowViewport(el: HTMLElement) { const rect = el.
目录
一.耦合性
1.内容耦合
2.公共耦合
4.控制耦合
5.标记耦合(特征耦合)
6.数据耦合
7.非直接耦合
二.内聚性
1.偶然内聚
2.逻辑内聚
3.时间内聚
4.过程内聚
5.通信内聚
6.顺序内聚
7.功能内聚
一.耦合性 耦合性是指软件结构中模块相互连接的紧密程度,是模块间相互连接性的度量耦合强度的大小是由模块间接口的复杂程度决定的。
具体从三个方面衡量:
① 方式——块间联系方式由“直接引用”或“过程语句调用”。
② 作用——块间传送的共用信息(参数)类型,可为“数据型”、“控制型”或“混合型” (数据/控制型)
③ 数量——块间传送的共用信息的数量。
模块分解的一个目标是使模块之间的联系尽可能少,实现目标可通过以下措施:
① 每个模块用过程语句(或函数方式等)调用其他模块。
② 模块间传送的参数为数据型。
③ 模块间公用的信息(如参数等) 尽量少
耦合的类型:
1.内容耦合 (1)一个模块直接访问另一模块的内部数据。
(2)一个模块不通过正常入口转到另一模块的内部。
(3)一个模块有多个入口。
(4)两个模块有部分代码重迭。
注:在高级语言中是不允许出现的,但在汇编语言中可能出现(所以在编写汇编语言中,要仔细检查,以免出现内容耦合)。
2.公共耦合 若干模块访问一个公共的数据环境(全局数据结构、共享的通信区、内存的公共覆盖区等)。耦合的复杂程度随耦合模块的数量的增加而显著增加。
公共耦合的两种情况:
•松散公共耦合: 模块同时只对公共数据环境进行读或写一种操作;
注:松散公共耦合是目前使用较多的低耦合方式。
•紧密公共耦合:若干模块对公共数据环境同时读和写操作;
这种耦合使公共数据区的变化影响所有公共耦合模块,严重影响模块的可靠性和可适应,降低软件的可读性。这是一种强耦合方式。
例如:
•无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性;
•使软件的可维护性变差。若一个模块修改了公共区的数据,则会影响与此数据相关的所有模块;
•降低了软件的可理解性。因为各个模块使用公共区数据的方式是隐含的,哪些数据被哪些模块共享,不容易搞明白,诊断错误困难。
一般来说,仅当模块间共享的数据很多,且通过参数的传递很不方便时才使用公共耦合。
3.外部耦合
一组模块都访问同一全局简单变量(而不是同一全局数据结构 ),而且不是通过参数表传递该全局变量的信息。
例如:static 静态变量就属于全局变量,会造成模块间耦合度较高,尽量少用全局变量
4.控制耦合 一个模块传递给另一模块的信息是用于控制该模块内部逻辑的控制信号。显然,对被控制模块的任何修改,都会影响控制模块。
改进:控制耦合中被调函数的判定,上移到主调函数当中,即可从控制耦合转化为数据耦合
5.标记耦合(特征耦合) 一个模块传送给另一个模块的参数是一个复合的数据结构。模块间共享了数据结构,如高级语言中的数组名、记录名等,其实传递的是这些数据结构的地址。标记耦合会使某些本来无关的模块产生相互依赖性,同时由于某些模块包含了不需要的数据,也给纠错带来了麻烦。
当我通过住户情况查用水量时,我只需要查用水量,但是同时也将用电量等其他数据也一起查询了
改进:将特征耦合转化为数据耦合
6.数据耦合 一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数组。模块间传递的是简单的数据值,相当于高级语言中的值传递。
7.非直接耦合 两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。这种耦合程度最弱,模块的独立性最高。
1.基本概念 在Web应用中,Session对象代表了用户从打开浏览器到关闭浏览器的整个访问过程,用于跟踪用户的活动和存储用户特定的数据。Session对象存储了关于用户会话的信息和数据,每当用户访问一个Web应用时,服务器会为该用户创建一个唯一的Session对象。
2.设置Session的过期时间的四种方式 2.1 web容器设置 以tomcat为例,在web.xml配置文件新增或者修改配置项:
<session-config> <session-timeout>30</session-timeout> </session-config> 注:时间单位为分钟。tomcat默认session超时时间为30分钟,负数或0为不限制session失效时间。
2.2 普通 java web项目 找到java web项目的web.xml文件,新增或者修改如下配置项:
<session-config> <session-timeout>30</session-timeout> </session-config> 注:时间单位为分钟。默认session超时时间为30分钟,负数或0为不限制session失效时间。
2.3 Spring框架设置 3.1 application.properties方式
# 单位为秒,这里设置Session的过期时间为30分钟 server.servlet.session.timeout=1800 3.2 application.yml方式
server: servlet: session: timeout: 1800 # 单位为秒,这里设置Session的过期时间为30分钟 2.4 java代码设置 当然也可以使用java代码动态地设置Session的过期时间:
HttpSession session = request.getSession(); // 设置1800秒后过期,即30分钟 session.setMaxInactiveInterval(1800); 注意:四种方式优先等级:1 < 2 =3 < 4
3.注意事项 3.1 优先级 上述四种方式优先等级为:1 < 2 =3 < 4。简单来说,java代码设置的优先级最高,项目级别设置的其次,容器级别设置的最低。如果设置过期时间使用了多种方式,那么最高优先级的会生效。
3.2 过期时间刷新机制 session有刷新过期时间的机制,如果在过期时间内再次访问了web项目,那么session的过期时间会重置,从头开始计时。
4.session过期的意义 设置Session的过期时间有其必要性。首先,防止会话劫持,限制了非法用户访问或窃取其他用户Session的机会。其次,有效管理服务器资源,当用户长时间无活动时,自动结束Session可以释放服务器资源。最后,提升用户体验,频繁要求用户登录验证可能会影响用户体验。
本人偶尔使用服务器,也就是部署自己的后端项目测试
起因是收到腾讯云发来的短信
寻思怎么会违规于是登录腾讯云看看(平时喜欢用宝塔,因为命令记不住)
导致原因 6379 端口 自己傻波使用redis没设置密码
解决办法: 1、先在腾讯云把6379端口禁用了 2、查看定时任务 crontab -l 3、删除异常的定时任务,在/var/spool/cron文件中,每一个用户都会创建一个文件 自己先查看,然后删除异常的(不是自己设置的,执行很频繁的定时任务)
我没使用过定时任务,我就把/var/spool/cron/root文件删了
提示权限什么的无法删除
lsattr 文件名 又i的话
执行chattr -i 文件名
再删除
4、使用top命令查看进程,哪个进程占用cpu异常结束哪个 如果top看不到,就使用htop查看(如果提示找不到命令,安装一下yum install -y htop)
上图为本人服务器进程(前几个都是异常的)
然后全部结束这些异常的进程
多观察一会 直接给/usr/local/bin/pnscan删除了
根据那些进程提示的文件地址删除那些恶意文件
DataV.GeoAtlas地理小工具系列http://datav.aliyun.com/portal/school/atlas/area_selector 获取地理坐标网址,记录下
基于小波变换的图像融合python版(红外和可见光) 一、小波变换二、图像融合1、采用对比度拉伸,完成红外图像增强2、采用Surf特征点匹配,完成图像配准3、采用HSV通道小波变换,完成图像融合4、总的代码5、融合效果 上图 三、视频融合四、总结 一、小波变换 小波分析是一个比较难的分支,用户采用小波变换,可以实现图像压缩,振动信号的分解与重构等,因此在实际工程上应用较广泛。小波分析与Fourier变换相比,小波变换是空间域和频率域的局部变换,因而能有效地从信号中提取信息。小波变换通过伸缩和平移等基本运算,实现对信号的多尺度分解与重构,从而很大程度上解决了Fourier变换带来的很多难题。
小波分析作一个新的数学分支,它是泛函分析、Fourier分析、数值分析的完美结晶;小波分析也是一种“时间—尺度”分析和多分辨分析的新技术,它在信号分析、语音合成、图像压缩与识别、大气与海洋波分析等方面的研究,都有广泛的应用。
二、图像融合 1、采用对比度拉伸,完成红外图像增强 # 裁剪线性RGB对比度拉伸:(去掉2%百分位以下的数,去掉98%百分位以上的数,上下百分位数一般相同,并设置输出上下限) def truncated_linear_stretch(image, truncated_value=2, maxout=255, min_out=0): def gray_process(gray, maxout=maxout, minout=min_out): truncated_down = np.percentile(gray, truncated_value) truncated_up = np.percentile(gray, 100 - truncated_value) gray_new = ((maxout - minout) / (truncated_up - truncated_down)) * gray gray_new[gray_new < minout] = minout gray_new[gray_new > maxout] = maxout return np.uint8(gray_new) (b, g, r) = cv2.split(image) b = gray_process(b) g = gray_process(g) r = gray_process(r) result = cv2.
前言:谈到当下应用最广的大数据技术,很多人都会说是数据分析;而体现大数据分析能力的则是OLAP。在大数据高速发展时期,多个技术团队基于OLAP的应用需求,开发出多种OLAP技术,如Hive、SparkSql、FlinkSql、Impala、Kylin、ClickHouse、Doris等,或者在实现其他应用需求的时候,发现自带OLAP应用能力,如ES。将OLAP需求拆解,可以分类两类:第一类是在存储系统的基础上,发展灵活的OLAP计算引擎,这类引擎可灵活解析多种存储格式的数据,如MapReduce,SparkSQL、FlinkSQL;第二类是基于固定的存储格式或自建存储系统,自定义查询引擎的,如Hive、impala、Kylin、Druid、ClickHouse、Doris。本文将以第二类OLAP技术为主,第一类为辅助,分析OLAP各阶段发展原因和各技术的特性。
一、OLAP研发目的和功能分析 技术的发展源于当下技术状态和应用需求,OLAP引擎的发展历史也如此。大数据技术的起点源于谷歌的三驾马车,2000年左右,谷歌的市场应用服务产生大量数据,对大量数据的存储、处理、分析、应用成为了当时的需求;2005年前后,谷歌发布了大数据领域三篇划时代论文,构建了三个基础能力:分布式文件存储系统GFS,分布式计算框架MapReduce与早期大数据领域存算一体的BigTable;这三种技术就是如今Hadoop基础。这三种技术架构,基本形成了后续OLAP发展基调:存算分离和存算一体。
1.1 Hive的出现和特性 我们回看一下2008年的技术环境,当时的OLAP大数据技术只有HDFS和MapReduce(Hbase偏向数据应用,不算OLAP)。
当时面临着什么问题呢?
对大数据的分析应用,当时除此这两种技术之外,别无选择,但是这套方案对于多数企业来说太重了,特别是MapReduce的编程太繁琐。在没有大数据技术的时候,类似的场景都是用OLTP数据库做处理,OLTP数据库是存算一体的,只需要简单的写DSL语句,就可以完成传统业务的数据分析,这是一种简单又高效的方式,但当时没有这样大数据场景的数据库。
所以当时发展产生了两个方向:一个是在hadoop生态基础上做优化,优化开发和处理性能;另一个是自建存算一体的数据库,借用已有的分布式的思想重构新的存储、计算系统。不同的技术团队基于应用需求,开始了各自的探索和发展,比如当时的hive和百度的PALO。
基于Hadoop生态做优化: 基于已有产品的优化,是最能快速产生成效的方式。在OLAP领域,Hive快速脱颖而出;开始是雅虎开发工程师在开发MapReduce时,发现编程麻烦,于是开发了pig语法,用于转换MapReduce编程任务,但是pig也不是默认的标准语法,Facebook在2010年发布了HIve,可以把SQL语言转换成MapRedcue的计算程序;然后HIve迅速发展,成为后续10年构建离线数仓的标准组件,极大的降低了大数据处理和分析的门槛。
注:Hive是存算分离的技术标准;这里Hive有两个特性,一个是数据处理(MapReduce+UDP函数定制化处理);一个是OLAP分析。这里需要单独的说处理能力,处理能力是构建离线数仓的基础能力,而围绕离线数仓,大数据制定了标准的数据开发和数据管理规范,有现成的方法论去管理和实现离线数据数据开发,如基于维度模型的星型模型和雪花模型等。
以下是是自建存算一体数据库的探索与发展:
1.2 Druid和kylin的出现和特性 早期OLAP场景围绕着Hive构建生态和优化性能,但是在大量使用过后,发现基于Hive技术架构,存在无法在优化满足的业务需求:实时性;基于Hive构建一套OLAP分析系统,只能做离线指标分析;对于快速得到分析结果的需求场景,当时市场上没有成熟的技术产品;这时,OLAP数据库技术方向,Druid和kylin两个技术团队分别开始了各自的研究。(附加:对于实时需求,灵活计算方面,Saprk在自己的技术架构上研发了Spark-Streaming模块,Flink专门为了解决实时问题而生)
Druid是美国的一个广告技术公司研发的,它们是一家专门做在线媒体的数据服务公司,对实时性要求非常高,原有的大数据方案无法满足业务需求,所以Druid就应运而生;kylin是一个诞生于中国发展计划的产品,实现的功能和druid类似,快速导入大量数据,基于多个维度,快速预计算得到指标结果,这个阶段的OLAP技术被归类为MOLAP;目标是一样的,但是实现思路却完全不同:Druid通过自定义数据模型,对数据维度快速处理,自定义加工和查询方式,实现实时OLAP应用;Kylin通过cube,一种预计算方式,预先定义多个维度索引,查询只扫描索引而不访问详细数据而提速,实现实时OLAP应用。
这个阶段,大数据开始做应用级的实时分析能力,期间ES原本想做搜索引擎的,但是由于其出色的存储和搜索能力,发现在OLAP场景的应用同样适用,ES就这样做到了能力跨界应用。这个阶段主打一个实时性,实时分析;对比HIve离线分析阶段,会发现MOLAP阶段为了实现实时分析性能,损失了数据处理能力,所以Hive面对于Kylin和 Druid,依然有自己独特的特性优势,数据处理能力。
注:MOLAP和ROLAP的区分大致如下图所示:
1.3 impala、ClickHouse和Doris的出现和特性 由各类大数据产品,高效技术架构的出现,最开始存算一体这条路发展的数据库,发现借鉴这些优秀的技术思想,能突破原先架构上的性能瓶颈,这些技术团队开始发力;这些优秀技术,最核心的就是MPP技术的突破。
由于HIve的基础生态绑定太多,Hadoop团队最开始基于Hive,做了一个只算不存的MPP服务impala,共享Hive的元数据,然后利用MPP的计算能力,补齐了HIve实时分析场景的应用功能;虽然功能是满足了,但是Hadoop生态有个无法绕过去的弊端,组件太多,运维麻烦,且Hive的基础架构实时性能不高。
ClickHouse的开发团队,是一家俄罗斯的搜索引擎公司,对于搜索业务,有实时分析的需求;它们的目标就是打造一个专门的OLAP实时分析数据库,利用MPP技术和列存储思想,自建了存算一体的数据库;当CK出来的时候,当时市场上基本没有同等特性的竞品,它解决了HIve+Impala一起才能做得实时OLAP分析能力,比Druid和Kylin在构建数据模型上更简单。2016年左右开源,在即席查询和实时分析场景做到了当时的极致,且具有很好的稳定性;为了满足实时分析,CK专注于单表性能的提升;OLAP实时数据分析的核心架构可以总结为大宽表,CK将大宽表数据生成在落库之前,用以满足实时分析的应用需求。
实际上CK的实时分析应用能力,可以用ES实现,都是基于大宽表实时分析;且都有实时数据API输出数据;但是他们在性能上有一些不同,ES是基于Java开发的,应用类服务对内存要求较多,CK基于C++开发,在一些系统性能上,比Java好些;但是ES不归为OLAP存算一体的数据库,它的核心是搜索引擎,且是一整套的平台方案,采集fileBeat/LogStash,内部单独的存储系统和搜索引擎,还有前端分析和运维的Kibana。总结下来,CK基本能实现实时OLAP的需求场景,只对关联查询的场景存在性能短板(关联查询是数据处理的基础)。
Doris最开始的开发技术团队,是中国的搜索引擎公司百度,同样的实时分析需求,Doris的愿景更大一点,它想打造一个可以拥有数据处理、联邦查询和实时OLAP分析的数据库,基于MPP技术,存储上采用了Hive类似的分区分桶的文件划分思想,但是又借鉴了列存的数据存储模型,自定义了存储数据模型和计算引擎。采用FE记录(java)、BE存算(C++),兼容了多种存储、计算场景,这难免会造成FE过度包装分类、加工任务调度逻辑的情况,但是瑕不掩瑜。
基于Doris的伟大愿景,大数据实时分析场景的一些必要特性,可以很好的兼容在一起:数据处理和实时分析;实时分析的场景主要是大宽表,数据处理的能力在实时分析中看似没什么用,但是它能很好的兼容多个基于中间维度表的宽表关联使用场景,尽管关联Shuffle性能上对于大宽表会有损耗,但是这个特性在目前实时OLAP技术能力中,从性能和应用能力上基本独一份。
二、现阶段OLAP应用能力分析 2.1 OLAP组件可用能力分析 OLAP数据库的发展主要围绕三个核心能力展开:数据处理,OLAP分析能力,实时数据API接口。技术的发展可分为离线和实时两个阶段:
离线阶段以Hive为主,后续都是在数据处理TPS性能上的提升,tez计算框架,sparkSQL计算框架,FlinkSQL,都是提升计算引擎的处理能力和性能;然后将分析结果数据,写入第三方中间件,后端自定义API提供数据服务。
实时阶段,通过自定义存储模型和计算引擎,包装存算一体的数据库;各种实时OLAP数据库的基础能力是:实时分析能力和实时数据API。
其中ClickHouse目标就是构建实时的OLAP分析数据库,他对于单宽表的实时OLAP计算是最直接的,但其解决的应用场景单一,完全是为了满足实时OLAP的业务需求;其中ES由于其存储引擎、搜索引擎以及内置数据API的能力,在实时OLAP场景同样满足:ES的scheam ON Read特性可以让数据写入index的时候不用构建DDL(十分好用的特性);其中Doris的发展目标愿景不单单是做一个实时分析引擎,细看它的功能,有数据处理,联邦查询,实时分析等多种能力;数据处理可以做离线场景的数仓构建,联邦查询可以做数据中台的数据查询管理,实时引擎可以做实时分析的支撑,只是包装多种功能,对单应用场景的性能造成了一些影响;从Doris的功能分析,这是一个有大愿景的技术团队,只是功能集成得越多,对自身系统的负担越大,希望Doris能在功能基础上,能兼容好各种应用场景的性能。我喜欢精益数据分析作者的一句话:以最大愿景去做最小可行性产品;相信Doris社区能将他们的最大愿景实现,他们的这套技术,是市场上最接近统一离线/实时OLAP分析,存算一体应用这个愿景的团队。 2.2 OLAP组件能力描述 各类OLAP开源技术,在处理、分析、提供结果数据的周期过程中:
Hive就像一个庄稼汉:可以在没有开垦的土地上,使用很多手动工具,开垦、存储、统计;什么都能做,但是效率不高;
impala就像Hive请来的收购商:不负责粮食存储和加工,但是能用它自己的方式,快速的对粮食情况做分析;
Druid和kylin就像个粮站:不负责粮食加工,但是加工好的粮食进入仓库的时候,会有个记录员,然后想知道粮食情况,直接和记录员沟通就好;
ClickHouse就像一个自动化的粮食存储工厂:只要把粮食放到传输带上,检测机器会自动识别分类,当想知道粮食情况的时候,粮食工厂能快速基于条件得到结果;
ES就像一个粮食实验基地:原本是用来检测各种粮食情况的,结果构建的粮食分类系统,在粮食统计的时候依然好用;
Doris就像一个自动化农场:可以在农场内部使用自动化工具,开垦、存储和自动化统计粮食,而且效率高,但是在一些外部交流场景里,受限于农场自己的承载、处理和对接能力。
三、总结 大数据OLAP分析能力,纯计算的有:MapReduce、SparkSql、FlinkSql,这些都是可以灵活构建在存储系统之上,拥有数据处理和分析能力; 存算嵌合的组件有:Hive、Impala、Druid、kylin、ES、ClickHouse、Doris,这些都具备OLAP分析能力,实时分析还拥有实时数据API支持能力(关注QPS性能)。基于离线OLAP分析,数据处理是构建数仓的核心能力,有HIve和Doris;基于实时OLAP分析需求,可选择ES、ClickHous、Doris,核心是大宽表数据模型、OLAP分析能力和实时数据API。
目录
一、下载安装phpstudy
二、配置phpstudy
三、配置DVWA
一、下载安装phpstudy
1.访问官网:https://www.xp.cn/,点击下载Windows版PHPstudy客户端
2.下载完成后, 解压,双击打开下图所示的安装包。
3.安装:安装到没有中文、空格或其他特殊字符的路径下,点击立即安装。
二、配置phpstudy 1.打开安装好的phpstudy,程序启动后,在首页将Apache和MySQL服务启动。
2.问题一:无法启动,可能时端口已经被占用。
2.1php默认使用端口是80,需要到设置中检测端口是否被占用
2.2如果已经被占用,需要到网站中,找到相应得站点,进行修改端口(修改端口之前,可以现在设置中检测一下端口是否被占用,避免修改得的端口也被占用,服务无法启动)
2.3修改完成之后,可再次到首页启动Apache和MySQL服务。
2.4 服务启动之后,运行状态中显示服务已启动。
3.问题二:无法启动MySQL服务
3.1 原因:之前已经在本地安装好了一个MySQL服务,而phpstudy里的MySQL服务与本地的MySQL占用的都是3306端口,产生了冲突
3.2 方案:按下win+R 执行 services.msc 进入服务,查找到MySQL,点击停止服务
3.3 解决链接:https://blog.csdn.net/m0_55887872/article/details/121956192
三、配置DVWA 1.下载DVWA包:https://github.com/digininja/DVWA/archive/master.zip
2.解压后会得到一个“DVWA-master”文件,重命名为“dvwa”,复制到phpstudy的WWW文件夹内
3.在dvwa/config路径下找到“config.inc.php.dist”文件,去掉后缀,重命名为“config.inc.php”
4.打开“config.inc.php”文件,修改内容
添加以下内容,保存
$_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';
$_DVWA[ 'recaptcha_private_key']='6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';
5.打开浏览器,输入网址,即可打开DVWA网站 http://127.0.0.1:8009
6.错误处理
原因:php的配置文件中,allow_url_include的配置缺失 方案:打开php.ini,将allow_url_include=Off修改为allow_url_include=On。
修改的php.ini是安装php目录下的而不是DVWA下的(phpstudy-extensions-php-php.ini)
修改完成后再重启Apache,报错消失
7.创建数据库成功
8.登录
点击logout,跳转至登录页面
默认用户名:admin,默认密码:password
文章目录 前言一、Makefile的引入——最简单的gcc编译过程二、Makefile的规则三、Makefile的语法3.1、通配符3.2、假想目标 .phony3.3、即时变量 延时变量 四、Makefile的函数4.1、foreach4.2、filter4.3、wildcard4.4、patsubst 五、Makefile升级5.1、包含头文件在内的依赖关系(自动生成依赖文件)5.2、添加CFLAGS 六、通用Makefile模板 前言 开发板平台:飞凌嵌入式ElfBoard ELF-1
参考视频和资料:飞凌嵌入式ElfBoard ELF-1软件学习书册
韦东山:https://www.bilibili.com/video/BV1kk4y117Tu?p=6&vd_source=3018264d4331e8fc267f9d68c24ee20f
一、Makefile的引入——最简单的gcc编译过程 keil,mdk,avr这些工具全自动编译的内部机制依然是makefile
这里我们先随便写两个C文件(a.c 和b.c),用最传统的gcc编译一下:
a.c:
#include <stdio.h> void funB(); int main() { funB(); return 0; } b.c:
#include <stdio.h> void funB() { printf("hello B!\n"); } 然后我们上传到虚拟机上进行编译:
gcc -o test a.c b.c 然后执行
./test 从a.c b.c到可执行文件test经历了什么?:
总的来说就是四步:预处理,编译,汇编,链接(一般来说前三步统称为编译)
a.c ->a.s->a.o
b.c ->b.s->b.o
最后两个.o链接在一起生成可执行文件test
我们可以在gcc命令后加上 -v看到编译链接的完整过程:
gcc -o test a.c b.c -v 具体内容很多,就不一一截图了:
这样gcc有个很明显的缺点:
不论a.c b.c有没有被更改过,每次gcc都会重新编译链接所有的C文件。有的时候我们只修改了很小一部分的C文件,但此时我们gcc会全部重新编译,这很耽误时间。
makefile就能解决这个问题。
它可以把刚刚gcc这个过程解构成一系列小的编译过程:
gcc -c -o a.
大家好,我是阿赵。
可能很多朋友都知道,我刚进入游戏行业的时候,做的是美术工作,包括了建模、贴图、动画等,都做过。我对各种美术资源制作也都很熟悉,懂得很多制作的技术。但最后,我却没有继续做美术工作,而改行做了程序员。这是为什么呢?
举一个例子,如果给我一张设计完整的原画,我可以照着做出效果不错,还原度很高,并且布线合理,面数较少的3D模型。这一个步骤,可以说我的技术不错。但假如没有设计好的原画,就算我的技术再高,也很难做出好看并且有特色的3D模型。
很明显,我所掌握的,是技术方面的技能,但我并不具备创造性的能力。换句话说,我只是一个技工,并不是一个艺术家。
在美术的各个岗位,我个人认为都需要有艺术创造性的存在。比如现在游戏行业的UI工作,现在很多做游戏界面的UI美术工作者,可能只会根据原画分离图层出图,可能会做引擎里面拼一下界面,但至于一个界面怎样好看,用多少种字体,配多少种颜色,其实是完全没有概念的。假如按照这个情况继续工作下去,他们可以达到一个怎样的高度?是使用Photoshop非常熟练?使用Unity拼界面的速度很快?还是怎样?
刚刚过去的2023年,有一个关于美术的话题估计是要载入史册的,就是AI画图让很多公司对原画美术裁员。为什么会出现这种情况?AI画图是非常的快,但实际上AI能做的事情并没有想象中那么多的,它只是把已有的资源进行分析、组合,然后产生新的图片,这些新图片,并不会产生一种新的风格,也不会产生一些新的创意。但为什么AI还是可以取代这么多原画师的工作?很明显,大部分初级的原画师,他们的工作也是从网上找各种素材,然后做拼接,他们的工作内容和AI没有太大区别,但他们远远没有AI那么快。只有技术而没有艺术创作性的美术工作者,被AI取代我觉得并不是什么不可思议的事情。
那么,是不是只要有艺术,就可以完全不懂技术,就可以很好的从事游戏美术工作呢?游戏美术和别的行业的美术不一样的地方是显而易见的,比如电影也好,海报也好,它们都是所见即所得的,只要电影的画面看起来是正确的,只要海报印刷出来没有错误,就可以了。但游戏美术不一样,游戏都是需要使用各种技术,让画面中需要的地方显示出来。不论游戏使用的是哪一种技术或者引擎,都需要遵循一定的规则,才能正确的把美术资源表达出来。比如游戏特效,它能实现的手段就很多,可以是粒子特效,可以是序列帧动画,可以是顶点动画,可以是UV动画,等等。不同的技术手段能达到的效果都不一样,如果游戏美术的设计者只懂艺术,不懂任何懂技术,他很难知道自己设计的效果通过游戏引擎之后能表达出百分之多少?如果设计者能懂得一定的技术手段,就能百分之一百的把自己的设计通过游戏引擎表达出来。
我是一个只懂技术的低级美术,所以很明显我以后在美术上的发展前景不会很好,所以我只能更极致的往技术方面发展了。
/* /dts-v1/是Device Tree Source(DTS)文件的版本声明。它指定了DTS文件的版本,以便 正确解析和处理文件内容,在DTS文件中,/dts-v1/通常是文件的第一行。 */ /dts-v1/ /*是一个C/C++中的预处理指令,用于在代码中包含一个名nrf52833_qiaa.dtsi的文件。 这个文件可能是一个设备树源文件,用于描述硬件设备的配置和功能。 设备树是一种描述硬件设备的数据结构,他独立于具体的处理器架构和操作系统。设备树 源文件(.dts或dtsi)描述了硬件设备的层次结构,寄存器地址,中断等信息。在编译时, 设备树源文件会被编译成二进制设备树文件(.dts),然后由操作系统加载和解析。 #include <nordic/nrf52833_qiaa.dssi>指令表示在代码中包含名为nrf52833_qiaa.dtsi 的设备树源文件。这样做可以将设备树的配置和功能添加到代码中,以便在运行时使用。*/ #include <nordic/nrf52833_qiaa.dtsi> #include "nrf52833dk_nrf52833-pinctrl.dtsi" /* 这个头文件可能时用于定义输入事件代码的,在嵌入式系统中,输入设备会生成不同的输入事件, 每个事件都有一个唯一的代码哎标识他,这个头文件可能包含了这些输入事件的代码定义。 */ #include <zephyr/dt-bindings/input/input-event-codes.h> / { /* 是一个字符串变量的赋值语句,这是一个简单的赋值操作。 */ model = "Nordic nRF52833 DK NRF52833"; compatible = "nordic,nrf52833-dk-nrf52833"; /* 这段代码是一个设备树文件中的一个节点描述,它定义了一些属性和值。在这个节点中,属性 zephyr,console\zephyr,shell-uart\zephyr,uart-mcumgr\zephyr,bt-mon-uart\ zephyr,bt-c2n-uart等这些分别对应了不同的设备或功能,这些属性的值是对应设备或功能的 引用,例如"&uart0"表示引用了名为"uart0"的设备。 这段代码的作用是将这些设备或功能与节点"chosen"关联起来,以便在系统运行时进行配置和使用 */ chosen { /* 具体的来说,它将uart0的地址赋值给zephyr和console变量 这种操作可以用于将一个串口设备与zephyr操作系统的控制台进行关联。通过将串口设备的地址 赋值给zephyr和console变量,可以实现在控制台上进行输入和输出操作。 */ zephyr,console = &uart0; /* 下面的语句,是一个zephyr中的配置选项,用于将uart0与shell绑定,这个配置选项的作用是将 UART0作为shell的输入和输出接口。 通过将uart0与shell绑定,可以在zephyr中使用shell命令行界面来与外接设备进行交互。 */ zephyr,shell-uart = &uart0; /* uart-mcumgr是zephyr RTOS中的一个子系统,用于管理和控制UART设备,它提供了一组命令和 API,使开发者能够通过UART与设备进行通信,并执行各种操作,如读取设备状态,配置设备参数, 发送和接收数据等。 */ zephyr,uart-mcumgr = &uart0; /* 下面的语句是一个在zephyr操作系统中设置蓝牙监视器UART的语句,它将蓝牙监视器UART与UART0设备进行关联。 在zephyr中,可以通过设备树 device tree来配置和管理硬件设备。设备树是一种描述硬件设备和其属性的数据 结构。通过设备树,可以在zephyr中定义和配置各种硬件设备。 在这个语句中,zephyr,bt-mon-uart是一个设备树属性,用于指定蓝牙监视器UART的名称,&uart0是一个引用, 用于指定与UART0设备相关联。 */ zephyr,bt-mon-uart = &uart0; /* */ zephyr,bt-c2h-uart = &uart0; zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; zephyr,ieee802154 = &ieee802154; }; /* 设备树节点 这个设备树节点信息定义了4个LED,每个LED都有一个GPIO引脚和一个标签。GPIO引脚用于控制LED 的亮灭状态,标签用于标识LED的名称。 */ leds { /* 下面的语句是设备树中的一个属性,用于指定设备节点的类型为GPIO LED,它表示该节点是一个 GPIO LED设备。 有两个设备树节点使用了compatible = "
uint32_t *model = recv_info->recv_buffer+25; 把recv_buffer[25] recv_buffer[26] recv_buffer[27] recv_buffer[28] 四个字节转换为整数(4个字节的)
注意这种转换法只能是指针对指针
recv_buffer是uint8类型的
前言 Python爬虫项目100例(一):入门级
CentOS环境安装
和谐图网站爬取
美空网数据爬取
美空网未登录图片爬取
27270图片爬取
蜂鸟网图片爬取之一
蜂鸟网图片爬取之二
蜂鸟网图片爬取之三
河北阳光理政投诉板块
Pyt图虫网多线程爬取
行行网电子书多线程爬取
半次元COS图爬取
斗图啦表情包多线程爬取
All IT eBooks多线程爬取
石家庄政民互动数据爬取
500px摄影师社区抓取摄影师数据
【----帮助Python学习,以下所有学习资料文末免费领!----】
CSDN博客抓取数据
煎蛋网XXOO图片抓取
51CTO学院IT技术课程抓取
慕课网免费课程抓取
网易云课堂课程数据抓取
CSDN学院课程数据抓取
石家庄链家租房数据抓取
微医挂号网doctor数据抓取
知乎文章图片爬取器之一
知乎文章图片爬取器之二
Python爬虫项目100例(二):pyspider
微医挂号网专家团队数据抓取pyspider
虎嗅网文章数据抓取 pyspider
手机APP数据抓取 pyspider
Python爬虫项目100例(三):scrapy
高考派大学数据抓取 scrapy
36氪(36kr)数据抓取 scrapy
B站博人传评论数据抓取 scrapy
《海王》评论数据抓取 scrapy
掘金网全站用户爬虫 scrapy
知乎网全站用户爬虫 scrapy
酷安网全站应用爬虫 scrapy
云沃客项目外包网数据爬虫 scrapy
教育部高校名单数据爬虫 scrapy
天津市科技计划项目成果库数据抓取 scrapy
博客园Python相关40W博客抓取 scrapy
Python爬虫项目100例(四):手机抓取相关
Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分
爬取儿歌多多APP数据-手机APP爬虫部分
百思不得姐APP数据-手机APP爬虫部分
Charles的安装与使用-手机APP爬虫部分
Charles抓取兔儿故事-下载小猪佩奇故事-手机APP爬虫部分
Charles抓取手机收音机-手机APP爬虫部分
mitmproxy安装与安卓模拟器的配合使用-手机APP爬虫部分
使用mitmdump抓取手机惠农APP-手机APP爬虫部分
前言 Python爬虫项目100例(一):入门级
CentOS环境安装
和谐图网站爬取
美空网数据爬取
美空网未登录图片爬取
27270图片爬取
…
【----帮助Python学习,以下所有学习资料文末免费领!----】
Python爬虫项目100例(二):pyspider
微医挂号网专家团队数据抓取pyspider
虎嗅网文章数据抓取 pyspider
手机APP数据抓取 pyspider
Python爬虫项目100例(三):scrapy
高考派大学数据抓取 scrapy
36氪(36kr)数据抓取 scrapy
B站博人传评论数据抓取 scrapy
《海王》评论数据抓取 scrapy
掘金网全站用户爬虫 scrapy
知乎网全站用户爬虫 scrapy
…
Python爬虫项目100例(四):手机抓取相关
Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分
爬取儿歌多多APP数据-手机APP爬虫部分
百思不得姐APP数据-手机APP爬虫部分
Charles的安装与使用-手机APP爬虫部分
Charles抓取兔儿故事-下载小猪佩奇故事-手机APP爬虫部分
…
Python爬虫项目100例(五):爬虫进阶部分
Python3爬虫爬取VIP视频-Python爬虫6操作
Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作
Python3爬虫获取博客园文章定时发送到邮箱
Python3爬虫获取三亚天气做旅游参照
博客园等博客网站自动评论器
Python爬虫项目100例(六):验证码识别技术
python爬虫高级技术之验证码篇
python爬虫高级技术之验证码篇2-开放平台OCR技术
python爬虫高级技术之验证码篇3-滑动验证码识别技术
python爬虫高级技术之验证码篇4-极验证识别技术之一
python爬虫高级技术之验证码篇5-极验证识别技术之二
python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干
Python爬虫项目100例(七):反爬虫技术
写个爬虫碰到反爬了,动手破坏它!
30岁了,想找点文献提高自己,还被反爬了,Python搞起,反爬第2篇
Python字体反爬之一,没办法,这个必须写,反爬第3篇
反爬教科书级别的网站-汽车之家,字体反爬之二
爬虫与反爬虫的修罗场,点评网站,字体反爬之三
…
Python爬虫项目100例(八):分布式爬虫技术
分布式爬虫初步解析-配好环境肝完一半
Python分布式爬虫顶级教程
Python分布式夯实,夯实,还是**夯实
celery分布式爬虫抓取豆瓣那些书
用Celery继续搞定分布式爬虫
Python爬虫项目100例(九):爬虫高级扩展部分
增量爬虫不得不说的故事
用Scrapy+BloomFilter再写个增量爬虫
Python Portia爬虫框架-在Win7里面配置起来
Python 玩转NewSpaper爬虫框架
前言 下面从这几个方面来详细详解python面向对象:
初识对象
成员方法
类和对象
构造方法
其它内置方法
封装
继承
类型注解
多态
综合案例
(文末送读者福利)
一、初识对象生活中数据的组织 学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填。
改为登记表,打印出来让学生自行填写:
程序中数据的组织
在程序中简单使用变量来记录学生信息
使用对象组织数据
在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。
在程序中设计表格,我们称之为:设计类(class)
在程序中打印生产表格,我们称之为:创建对象
在程序中填写表格,我们称之为:对象属性赋值
二、成员方法类的定义和使用 在上一节中,我们简单了解到可以使用类去封装属性,并基于类创建出一个个的对象来使用。现在我们来看看类的使用语法:
成员变量和成员方法
那么,什么是类的行为(方法)呢?
可以看出,类中:
不仅可以定义属性用来记录数据
也可以定义函数,用来记录行为
其中:
类中定义的属性(变量),我们称之为:成员变量
类中定义的行为(函数),我们称之为:成员方法
成员方法的定义语法
在类中定义成员方法和定义函数基本一致,但仍有细微区别:
可以看到,在方法定义的参数列表中,有一个:self关键字
self关键字是成员方法定义的时候,必须填写的。
它用来表示类对象自身的意思
当我们使用类对象调用方法的是,self会自动被python传入
在方法内部,想要访问类的成员变量,必须使用self
注意事项
self关键字,尽管在参数列表中,但是传参的时候可以忽略它。如:
可以看到,在传入参数的时候,self是透明的,可以不用理会它。
三、类和对象现实世界的事物和类 现实世界的事物也有属性和行为,类也有属性和行为。使用程序中的类,可以完美的描述现实世界的事物。
类和对象
基于类创建对象的语法:
类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作这种套路,称之为:面向对象编程。
使用类和对象描述现实事物
在现实中,生产事物
在程序中通过类来描述
基于类创建对象
这就是面向对象编程:设计类,基于类创建对象,由对象做具体的工作。
四、构造方法属性(成员变量)的赋值 构造方法
Python类可以使用:init()方法,称之为构造方法。
可以实现:
在创建类对象(构造类)的时候,会自动执行。
在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。
构造方法注意事项
重要的事情说三遍,构造方法名称:init init init , 千万不要忘记init前后都有2个下划线
构造方法也是成员方法,不要忘记在参数列表中提供:self
在构造方法内定义成员变量,需要使用self关键字
这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示。
五、其它内置方法魔术方法 上文学习的__init__ 构造方法,是Python类内置的方法之一。
以下是CPython的一些特点和功能:
语言兼容性:CPython兼容Python的标准语法和语义,因此与其他Python实现的代码可以无缝地在CPython上运行。
C扩展支持:CPython允许使用C语言编写扩展模块,这些模块可以通过Python的标准C API与CPython解释器进行交互。这使得CPython可以利用C语言的高性能和底层操作能力。
标准库:CPython附带了一个丰富的标准库,提供了许多用于处理文件、网络、数据库、图形界面等常见任务的模块和功能。
全局解释锁(GIL):CPython的一个特点是全局解释锁(GIL),它是一种线程同步机制,确保在同一时刻只有一个线程执行Python字节码。这可以简化解释器的设计,并提供线程安全的执行环境,但也限制了CPython在多核处理器上的并行性能。
调试器支持:CPython提供了内置的调试器,可以帮助开发人员诊断和修复代码中的错误。
跨平台支持:CPython可以在多个操作系统上运行,包括Windows、macOS和Linux等。
需要注意的是,虽然CPython是最常用的Python解释器,但也有其他Python实现,如Jython(使用Java实现)和IronPython(使用.NET实现)。这些实现有自己的特点和用途,可以根据项目需求选择合适的解释器。
Python虽然是一种解释型语言,但在CPython实现中,它也是有编译过程的。Python代码不是编译成机器码,也不是直接在解释器中运行,而是先被编译为字节码,之后在CPython的解释器中运行。有时运行后的Python项目会出现一些.pyc后缀的文件,这就是为了加快运行而缓存下来的字节码文件。这些字节码文件的作用就是重用,在下一次运行时可以直接运行字节码文件,节省了从python源代码到字节码的过程。pyc文件中包含了生成时间和解释器版本,当源代码被修改后,运行pyc文件时就会检测出来其已经过期,重新执行字节码的生成。
相比于C和C++这种需要手动控制内存申请与释放的语言,python将这一过程隐藏了,并使用引用计数和垃圾回收进行自动内存管理。
每当在python中声明一个新变量时,就会为该变量维护一个引用计数。引用计数的初始值是1,当变量超出作用域时,例如函数返回或代码块结束,引用计数递减。当该计数变为0时,就会触发PyObject_Free()释放该对象。
垃圾回收不是立即发生的,要释放不再使用的对象的内存也是具有开销的,通常在经过一定数量操作后垃圾回收才会启动。python提供了一个gc标准库,可以查看垃圾回收的状态和手动触发垃圾回收。
https://github.com/python/cpython
CPython执行过程 从Python源代码到其在CPU运行需要经历诸多过程:
1.建立运行时配置
在执行任何python代码之前,运行时首先建立配置。该配置位于Include/cpython/initconfig.h中
包括:
各种模式(如debug)的flag执行模式,如传递文件名执行或者-m 执行模块扩展选项,通过 -X环境变量 该配置数据用于运行时启用或禁用某些功能
2.读取文件或输入
python有多种调用python执行的方式:
使用python -c “code”执行单行code使用python -m module执行模块使用python filepath执行文件使用python交互式窗口(REPL)...... 3.词法分析和语法分析
在Grammar目录中定义了Python语法和token表,据此生成的语法表将指导解析器把源代码转换为一个CST。
4.抽象语法树生成
将解析器生成的 CST 转换为可以执行的更合乎逻辑的东西。该结构是代码的更高级别的表示形式,称为抽象语法树 (AST)。
5.编译
现在解释器有一个 AST,其中包含每个操作、函数、类所需的属性。编译器的工作是将 AST 转换为 CPU 可以理解的东西。
此编译任务分为两部分:
遍历树并创建一个控制流图,该图表示执行的逻辑序列将控制流图中的节点转换为较小的可执行语句,称为字节码 最终生成code object
6.执行
从pyc文件中读取code object或将内存中code object传递给执行组件。每个字节码操作被封装为堆栈帧来执行,具体内容可以参考:您的CPython源代码指南 - 真正的Python (realpython.com)
CPython中的对象 Python中一切皆对象,内置了许多基本类型,如int、str、list、tuple、dict等。所有类都继承了object这个基类。
在C实现中,该类为PyObject,定义如下
struct _object { _PyObject_HEAD_EXTRA #双向链表节点,将所有活动的堆对象串起来 union { Py_ssize_t ob_refcnt; #if SIZEOF_VOID_P > 4 PY_UINT32_T ob_refcnt_split[2]; # 引用计数 #endif }; PyTypeObject *ob_type; # 类型 }; PyObject使用PyTypeObject作为类型标识,通过该成员来表现出对不同类对象的函数调用的效果,也就是多态。
🔥博客主页:小王又困了
📚系列专栏:C++
🌟人之为学,不日近则日退
❤️感谢大家点赞👍收藏⭐评论✍️
目录
一、日期类的实现
📒1.1日期类功能
📒1.2拷贝日期
📒1.3重载关系运算符
📒1.4重载+、+=
📒1.5重载 -、-=
📒1.6重载++、--
一、日期类的实现 通过前面的知识,我们要实现一个日期类,巩固前面学习的类和对象。这里我们也要使用多文件来完成我们的日期类。
📒1.1日期类功能 头文件中是我们要实现日期类功能的函数声明。这里我们要注意拷贝函数,只能在函数声明时写缺省值,防止我们在声明和定义是给的缺省值不一样。
#include <iostream> #include <assert.h> using namespace std; class Date { public: Date(int year = 1, int month = 1, int day = 1); void Print(); int GetMonthDay(int year, int month); bool operator==(const Date& y); bool operator!=(const Date& y); bool operator>(const Date& y); bool operator<(const Date& y); bool operator>=(const Date& y); bool operator<=(const Date& y); int operator-(const Date& d); Date& operator+=(int day); Date operator+(int day); Date& operator-=(int day); Date operator-(int day); Date& operator++(); Date operator++(int); Date& operator--(); Date operator--(int); private: int _year; int _month; int _day; }; 📒1.
互联网的数据爆炸式的增长,而利用 Python 爬虫我们可以获取大量有价值的数据:
1.爬取数据,进行市场调研和商业分析
爬取知乎优质答案,筛选各话题下最优质的内容; 抓取房产网站买卖信息,分析房价变化趋势、做不同区域的房价分析;爬取招聘网站职位信息,分析各行业人才需求情况及薪资水平。
2.作为机器学习、数据挖掘的原始数据
比如你要做一个推荐系统,那么你可以去爬取更多维度的数据,做出更好的模型。
3.爬取优质的资源:图片、文本、视频
爬取商品(店铺)评论以及各种图片网站,获得图片资源以及评论文本数据。
掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现。
但建议你从一开始就要有一个具体的目标,在目标的驱动下,你的学习才会更加精准和高效。这里给你一条平滑的、零基础快速入门的学习路径:
1.了解爬虫的基本原理及过程
2.Requests+Xpath 实现通用爬虫套路
3.了解非结构化数据的存储
4.应对特殊网站的反爬虫措施
5.Scrapy 与 MongoDB,进阶分布式
有些项目可能比较老了,不能用了,大家可以参考一下,重要的是一个思路,借鉴前人的一些经验,希望能帮到大家,需要的小伙伴们私信小编“学习”领取下资料包。
一、爬虫是什么?
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序。
从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用;
二、爬虫的基本流程
用户获取网络数据的方式:
方式1:浏览器提交请求—>下载网页代码—>解析成页面
方式2:模拟浏览器发送请求(获取网页代码)->提取有用的数据->存放于数据库或文件中
爬虫要做的就是方式2。
1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等
Request模块缺陷:不能执行JS 和CSS 代码
2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response包含:html,json,图片,视频等
3、解析内容
解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以wb的方式写入文件
4、保存数据
数据库(MySQL,Mongdb、Redis)
文件
三、http协议 请求与响应
**Request:**用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)
**Response:**服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)
**ps:**浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
四、 request
1、请求方式:
常见的请求方式:GET / POST
2、请求的URL
url全球统一资源定位符,用来定义互联网上一个唯一的资源 例如:一张图片、一个文件、一段视频都可以用url唯一确定
url编码
图片会被编码(看示例代码)
网页的加载过程是:
加载一个网页,通常都是先加载document文档,
在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求
3、请求头