目录
一、Pulsar介绍
1.1 Pulsar基本介绍
1.2 Pulsar架构
Producer & Consumer
Apache Zookeeper
Pulsar Brokers
Apache Bookkeeper
二、Zookeeper集群安装
三、Pulsar集群安装
3.1 bookie与broker配置
3.1.1 修改bookie配置文件
3.1.2 修改broker配置文件
3.2 元数据初始化
3.3 服务启动
3.4 消息收发测试
四、Pulsar admin manger图形界面安装
一、Pulsar介绍 1.1 Pulsar基本介绍 pulsar是一个云原生企业级的发布订阅(pub-sub)消息系统,最初由Yahoo开发,并于2016年底开源,现在是Apache软件基金会顶级开源项目。Pulsar在Yahoo的生产环境运行了三年多,助力Yahoo的主要应用,如Yahoo Finance、Yahoo Sports、Flickr、Gemini广告平台和Yahoo分布式键值存储系统Sherpa。
Apache Pulsar的功能与特性:
多租户模式灵活的消息系统云原生架构segmented Sreams(分片流)支持跨地域复制 1.2 Pulsar架构 Pulsar官网: Apache Pulsar | Apache Pulsar
Producer & Consumer Pulsar客户端包含一个消费者和一个生产者。生产者写入消息到某个主题。消费者从主题读取消息,并确认特定消息或所有特定消息。
Apache Zookeeper Pulsar和BookKeeper使用Apache ZooKeeper保存节点之间协调的元数据,例如每个主题的分类账列表,每个分类账的片段,以及主题包到代理的映射。它是一个由高可用性和可复制的服务器组成的集群(通常是3个)。
Pulsar Brokers 主题(即分区)在Brokers代理之间进行划分。代理接收主题的消息,并将它们附加到托管在Bookkeeper集群上的主题的活动虚拟文件(又称分类账)。代理从缓存(大部分)或BookKeeper读取消息,并将它们分发给消费者。代理也接收消息确认并将其持久化到BookKeeper集群。代理是无状态的(不使用/不需要磁盘)。
Apache Bookkeeper Apache BookKeeper是一个称为bookies的节点集群。每个虚拟文件(又名账本)被分成连续的段,默认情况下,每个段由3个bookies 保存(由客户端复制,即经纪人)。由于不需要在它们之间进行数据重组(移动),运营商可以快速添加博彩公司。它们立即共享传入的写负载。
测试环境
主机名
IP
文章目录 ☃️可重入锁原理☃️锁重试和WatchDog机制☃️MutiLock原理 上一篇文章讲解了 Rediision的使用 ,这篇文章讲解其原理
☃️可重入锁原理 在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state=0,假如有人持有这把锁,那么state=1,如果持有这把锁的人再次持有这把锁,那么state就会+1 ,如果是对于synchronized而言,他在c语言代码中会有一个count,原理和state类似,也是重入一次就加一,释放一次就-1 ,直到减少成0 时,表示当前这把锁没有被人持有。
在 Redission 中,我们的也支持支持可重入锁
在分布式锁中,他采用hash结构用来存储锁,其中大key表示表示这把锁是否存在,用小key表示当前这把锁被哪个线程持有,所以接下来我们一起分析一下当前的这个lua表达式
这个地方一共有3个参数
KEYS[1] : 锁名称
ARGV[1]: 锁失效时间
ARGV[2]: id + “:” + threadId; 锁的小key
exists: 判断数据是否存在 name:是lock是否存在,如果==0,就表示当前这把锁不存在
redis.call('hset', KEYS[1], ARGV[2], 1);此时他就开始往redis里边去写数据 ,写成一个hash结构
Lock{
id + **":"** + threadId : 1
}
如果当前这把锁存在,则第一个条件不满足,再判断
redis.call('hexists', KEYS[1], ARGV[2]) == 1
此时需要通过大key+小key判断当前这把锁是否是属于自己的,如果是自己的,则进行
redis.call('hincrby', KEYS[1], ARGV[2], 1)
将当前这个锁的value进行+1 ,redis.call('pexpire', KEYS[1], ARGV[1]); 然后再对其设置过期时间,如果以上两个条件都不满足,则表示当前这把锁抢锁失败,最后返回pttl,即为当前这把锁的失效时间
如果小伙帮们看了前边的源码, 你会发现他会去判断当前这个方法的返回值是否为null,如果是null,则对应则前两个if对应的条件,退出抢锁逻辑,如果返回的不是null,即走了第三个分支,在源码处会进行while(true)的自旋抢锁。
"if (redis.call('exists', KEYS[1]) == 0) then "
🐇明明跟你说过:个人主页
🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、Elasticsearch简介
2、为什么在k8s中部署elasticsearch
二、k8s基础
1、k8s简介
2、Pods、Services、StatefulSet等基本概念
2.1 Pods
2.2 Services
2.3 StatefulSets
三、Elasticsearch集群架构
1、Elasticsearch集群的组成
2、Elasticsearch工作原理
3、集群高可用设计
四、部署环境准备
1、准备k8s集群
2、准备StorageClass 五、部署Elasticsearch集群 1、编写部署Elasticsearch的YAML文件
2、部署 Elasticsearch
3、查看Pod状态
4、访问测试 一、引言 1、Elasticsearch简介 Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。
1. 核心特性:
分布式:Elasticsearch是分布式的,可以在多个服务器上运行,并且能够自动将数据在服务器之间进行负载均衡。可扩展性:Elasticsearch提供了可扩展的架构,无论是存储、节点还是查询吞吐量,都可以随着业务需求的变化而增加资源。它可以扩展到上百台服务器,处理PB级别的数据。实时性:Elasticsearch能够实时地处理数据,提供了近实时的搜索和分析功能。全文检索:Elasticsearch提供了全文检索功能,支持对大量数据进行复杂的搜索和分析。分析性:Elasticsearch提供了强大的分析功能,包括聚合、统计和排序等。多租户能力:Elasticsearch可以配置为多租户环境,允许不同的用户和应用共享相同的集群资源。监控和警报:Elasticsearch提供了内置的监控和警报功能,使得用户可以实时了解系统的运行状态,并在出现异常时得到通知。 2. 数据支持:
Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都能以支持快速搜索的方式高效地存储和索引它。 3. 技术实现:
Elasticsearch使用Java开发,并基于Lucene作为其核心来实现所有索引和搜索的功能。但其目的是通过简单的RESTful API来隐藏Lucene的复杂性,通过面向文档从而让全文搜索变得简单。Elasticsearch支持多种数据类型,包括字符串、数字、日期等。Elasticsearch的水平可扩展性允许通过增加节点来扩展其处理能力。在硬件故障或节点故障的情况下,Elasticsearch具有容错能力,能够保持数据的完整性和服务的可用性。 4. 应用场景:
Elasticsearch在众多场景下都有广泛的应用,如企业搜索、日志和事件数据分析、安全监控等。 5. 集成方案:
Elasticsearch与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。 2、为什么在k8s中部署elasticsearch 1. 自动化和编排
自动化部署和管理: Kubernetes 提供了自动化的部署、扩展和管理功能,可以简化 Elasticsearch 集群的配置、启动和监控。自愈能力: Kubernetes 能够自动检测并重新调度失败的 Pod,确保 Elasticsearch 集群的高可用性和稳定性。 2. 可扩展性
水平扩展: Elasticsearch 的节点可以在 Kubernetes 中水平扩展,通过增加或减少节点数目来应对数据量和查询量的变化。弹性资源分配: Kubernetes 允许为不同的 Elasticsearch 节点(如数据节点、主节点、协调节点)分配不同的资源配额,确保资源的合理利用和优化。 3.
JSON_ARRAYAGG 是 Oracle 数据库中用于将多行数据聚合为一个 JSON 数组的函数。这个函数对于将查询结果转换为 JSON 格式特别有用,尤其是在 RESTful API 或需要 JSON 输出的应用中。
语法
sql
JSON_ARRAYAGG ( [ DISTINCT | UNIQUE ] expr [ ON NULL { NULL | ABSENT | EMPTY_ARRAY | EMPTY_OBJECT } ]
[ ORDER BY { order_by_clause | NULL } ]
[ FORMAT JSON ]
[ PRETTY ]
[ RETURNING CLOB | VARCHAR2(size) ]
[ NULL ON NULL ]
[ STRICT ]
)
expr:要聚合的表达式,可以是任何可以求值为 JSON 对象的表达式。
下面列出了一些知名度高和广泛使用的技术组件,以及它们相应的现存公司,按照知名度和使用者数量进行排序:
Meta Platforms, Inc. (之前称为 Facebook): React: 一个用于构建用户界面的JavaScript库,广泛用于前端开发。
React Native: 一个用于开发原生移动应用的框架。
Google LLC: Angular: 一个强大的前端Web应用框架。
TensorFlow: 一个开源的机器学习库,广泛应用于研究和商业项目。
Kubernetes: 一个领先的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
Microsoft Corporation: .NET Framework / .NET Core: 一个广泛使用的开发平台,用于构建各种类型的应用程序。
TypeScript: 一个JavaScript的超集,添加了静态类型定义的特性。
Visual Studio Code: 一个开源的代码编辑器,广泛使用于软件开发。
Amazon Web Services (AWS):
Amazon DynamoDB: 一个托管的NoSQL数据库服务,支持键值和文档数据结构。
Elastic N.V.: Elasticsearch: 一个基于Lucene的搜索和分析引擎,经常用于日志分析和复杂搜索需求。
Red Hat, Inc. (现在是 IBM 的一部分): Ansible: 一个IT自动化和配置管理工具。
Red Hat Enterprise Linux (RHEL): 一个广泛使用的企业级Linux发行版。
GitLab Inc.: GitLab: 一个开源的DevOps平台,提供从代码管理到CI/CD的全套服务。
Databricks Inc.:
Apache Spark: 由 Databricks 的创始人开发,是一个用于大规模数据处理的统一分析引擎。
使用 JDK 17 和 Spring Boot 时,推荐选择适配的 Maven 和 Spring Boot 版本,以确保最佳兼容性和性能。
Maven 版本 对于 JDK 17,建议使用 Maven 3.8.1 或更高版本。Maven 3.8.1 及之后的版本已经对 JDK 17 做了相应的兼容性调整,因此这些版本可以更好地支持 JDK 17 的新特性和改进。
推荐版本:Maven 3.8.6(或更高版本)
Spring Boot 版本 Spring Boot 2.5.x 及更新版本开始支持 JDK 17。因此,建议使用 Spring Boot 2.5.x 或更高版本。如果你希望使用最新的功能和改进,可以选择最新的稳定版本。
以下是一些推荐的 Spring Boot 版本:
Spring Boot 2.6.xSpring Boot 2.7.xSpring Boot 3.x (如果你想使用最新的特性和改进) 推荐版本:Spring Boot 2.7.x 或 Spring Boot 3.x
1.在官网下载jdk17或使用idea下载jdk17,如图
2.然后下载maven.可以从官网下载,这是下载链接:https://dlcdn.apache.org/maven/maven-3/3.9.7/binaries/apache-maven-3.9.7-bin.zip
记住maven解压包的路径
3.1.然后配置jdk17的环境变量
此电脑->属性
在搜索栏搜索"高级系统设置"
打开点击环境变量,开始设计环境
大家好,当你完成了一段精彩的 Python 代码,你可能会想要与其他人分享它。但是,你可能担心其他人是否拥有足够的环境来运行你的代码。或者,你可能希望保护你的源代码,以防止他人查看或修改它。在这种情况下,PyInstaller 是你的救星。
PyInstaller 是一个强大的工具,可以将 Python 代码打包成独立的可执行文件,无需安装 Python 解释器即可在其他计算机上运行。无论你是想要与朋友分享一个小工具,还是构建一个商业应用,PyInstaller 都能帮助你实现这一目标。
一、简介 在软件开发的世界里,分享和部署你的代码是至关重要的一环。然而,随着软件复杂度的增加和用户环境的多样化,这项任务变得越来越具有挑战性。Python 作为一种流行的编程语言,具有丰富的库和功能,但是要求用户必须安装 Python 解释器才能运行你的代码。这为分享和部署带来了一定的困难。
在这种情况下,PyInstaller 成为了解决方案。PyInstaller 是一个功能强大的工具,它可以将你的 Python 代码打包成一个独立的可执行文件,无需用户安装 Python 解释器。简单来说,PyInstaller 可以将你的 Python 脚本转换成一个独立的应用程序,使得用户可以在没有 Python 环境的情况下运行你的代码。
PyInstaller 的作用不仅仅是简单地将 Python 代码打包成可执行文件,它还提供了许多其他的功能和优点:
方便分享和部署: PyInstaller 能够将你的 Python 代码和依赖项打包成一个独立的可执行文件,使得分享和部署变得非常简单。用户只需双击该文件即可运行你的应用程序,而无需进行任何额外的设置或安装。
保护源代码: PyInstaller 可以将你的 Python 代码转换成字节码,从而隐藏源代码,提高代码的安全性。这意味着你可以将你的应用程序分发给用户,而不必担心他们查看或修改你的源代码。
跨平台支持: PyInstaller 支持在 Windows、Linux 和 macOS 等操作系统上打包和运行你的应用程序。这意味着你可以开发一个跨平台的应用程序,并确保它能够在不同的操作系统上正常运行。
PyInstaller 是一个强大的工具,可以帮助你轻松地分享、部署和保护你的 Python 代码。无论你是想要与朋友分享一个小工具,还是构建一个商业应用,PyInstaller 都能够满足你的需求,使得 Python 开发变得更加便捷和灵活。
二、安装 PyInstaller 在开始使用 PyInstaller 之前,首先需要确保你的系统已经安装了 Python 解释器。PyInstaller 兼容 Python 2.7 和 Python 3.x 版本。
摘要: RPC(Remote Procedure Call)是一种通信协议,用于实现跨网络的进程间通信。它提供了一种简单高效的方式,使得分布式系统中的不同组件能够像调用本地函数一样调用远程函数。本篇博客将介绍RPC的基本概念,适用场景,技术特点,常见的技术实践举例,历史框架如CORBA,以及近几年RPC在Java、Go、C++和Python中的实践案例,并展望未来RPC的发展前景。
随着分布式系统的普及和应用,RPC技术日益受到重视。它是一种实现远程通信的机制,允许一个进程调用其他进程(在不同的地址空间或机器上)的过程,就像调用本地过程一样。
一、什么是RPC? RPC是一种远程过程调用协议,它允许一个程序调用另一个程序在不同的地址空间上执行的子程序。在分布式系统中,RPC通过封装远程调用的细节,提供了一种透明化的方法,使得开发人员可以像调用本地函数一样调用远程函数,从而简化了分布式系统的开发和维护工作。
RPC基本概念是建立在Client-Server架构上的通信模式。Client通过调用本地的Stub(本地代理)代理对象,Stub负责将调用参数封装并通过网络发送至Server端,Server端接收到消息后执行相应的逻辑,再将结果返回至Client端。
二、适用场景 RPC在分布式系统中有广泛的应用场景,广泛应用于需求频繁的跨网络调用场景,如微服务架构中的服务调用、分布式计算和数据分析中的远程调用等。包括但不限于以下几个方面:
微服务架构:RPC可以实现微服务之间的通信,各个微服务可以独立部署和扩展。跨语言通信:RPC可以解决不同语言之间的通信问题,使得不同语言编写的服务可以互相调用。分布式计算:RPC可以用于分布式计算任务的调度和协调,提高计算资源的利用率。高性能网络传输:RPC可以通过优化网络传输协议和序列化机制,提高数据传输的效率和性能。 三、技术特点 透明性:RPC屏蔽了底层的通信细节,使得远程调用看起来像是本地调用,对开发者透明。灵活性:RPC支持多种传输协议和序列化机制,可以根据实际需求选择合适的组合。高性能:RPC通过优化网络传输和序列化机制,提供了高效的远程调用性能。可靠性:RPC提供了可靠的通信机制,包括超时处理、重试机制和错误处理等,确保调用的可靠性。网络传输效率高: 使用二进制协议传输数据,减少了数据传输大小和序列化、反序列化的开销。可扩展性强: 支持服务发现、负载均衡、集群调用等功能,方便系统扩展。易于定位和排错: 提供了面向服务的调用方式,便于排查和修复问题。 四、常见的技术实践举例 Apache Thrift:Apache Thrift是一个跨语言的RPC框架,支持多种编程语言,包括Java、Go、C++和Python等。它使用IDL(Interface Definition Language)定义接口,并生成不同语言的代码,简化了跨语言通信的开发工作。gRPC:gRPC是由Google开发的高性能、开源的RPC框架,使用Protocol Buffers作为默认的序列化机制。它支持多种传输协议,如HTTP/2和TCP,可以在不同平台上进行快速且可靠的通信。Dubbo:Dubbo是阿里巴巴开源的高性能Java RPC框架,广泛应用于微服务架构。它提供了负载均衡、故障转移、容错和集群等特性,保证了系统的稳定性和可扩展性。 五、历史框架与发展趋势 在RPC的发展历史中,CORBA是最早的面向对象的RPC框架之一,但由于复杂性和性能问题,没有得到广泛应用。近年来,随着微服务架构的流行,轻量级的RPC框架如gRPC和Dubbo开始崭露头角。同时,Java、Go、C++和Python等编程语言都推出了丰富的RPC库和框架,使得开发者能够更便捷地构建分布式系统。
在RPC技术发展历程中,CORBA(Common Object Request Broker Architecture)等框架曾经辉煌一时。近年来,各种语言的开源RPC框架层出不穷,例如:
Java: Dubbo、gRPC、Apache Thrift
Go: Go Micro、gRPC-Go
C++: gRPC、Apache Thrift
Python: Pyro、gRPC-Python
未来,随着云原生、边缘计算和物联网等技术的快速发展,RPC将继续发挥重要作用。预计未来RPC框架将更加注重性能和安全性,支持更多的语言和平台,并提供更丰富的功能和扩展性。同时,新兴技术如Service Mesh和Serverless也将与RPC紧密结合,推动RPC在分布式系统中的进一步发展。
最后 RPC作为一种高效可靠的分布式通信方式,已经在各种分布式系统中发挥着重要作用。通过透明的远程调用机制,RPC大大简化了分布式系统的开发和维护工作。随着微服务架构的兴起和分布式计算需求的增加,RPC框架也在不断发展和演进。未来,RPC将继续发挥着重要作用,并与其他新兴技术相互融合,推动分布式系统的发展和创新。
随着微服务架构和分布式系统的不断发展,RPC技术将在通信效率、吞吐量、安全性等方面不断完善和优化。未来,我们可以期待如下发展趋势:
更高性能的实现: 针对大规模服务调用场景,提高RPC框架的性能,支持更高的并发和吞吐量。
更加智能化的功能: 引入AI技术,优化负载均衡算法、服务发现等功能,提升系统的智能化与自愈能力。
跨语言、跨平台支持: 进一步提高RPC框架的兼容性和易用性,支持多语言、多平台的开发。
在之前我们写的程序中当程序结束,内存就被回收数据就丢失了,那么在计算机中的那些需要保存写下的数据时,只把数据写到内存当中就无法一直保留,如果要将数据进行持久化的保存这时就需要再将数据传输到磁盘(硬盘)的文件上。这本篇中我们就来了解文件是什么、有哪些类型的文件,以及学习在程序中实现文件的读和写,还有实现读和写相关的函数,相信看完本篇的讲解能对文件有一定的认识,加油吧!!!
1.什么是文件? 磁盘(硬盘)上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.1 程序文件 程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程(windows环境后缀为.exe)。
1.2 数据文件 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
在以前各篇所处理数据的输入输出都是以终端为对象的,即从终端的键盘输⼊数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
2.文件名 ⼀个文件要有⼀个唯一的文件标识,以便用户识别和引用
文件名包含3个部分:
1.文件路径 2.文件主干名 3.文件后缀
例如:C:\Users\zhuohongze\Desktop\c-language\test_6_10(1).txt
在以上的文件名中也是由三部分组成的
3.二进制文件和文本文件 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件。
⼀个数据在文件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节。
在二进制文件的读和写将在以下的了解fwrite和fread函数时进行细致的讲解
4.文件的打开与关闭 4.1 流和标准流 4.1.1流 在学习文件的打开关闭前先要来了解流,在我们将数据传到外部设备时或者要读取外部设备的数据,外部设备可能是光盘也可能是硬盘上的文件等等,但是不同的外部设备的输入和输出方式可能不同,这时我们要操作外部设备方法都不同,如果给每个外部设备都写一个操作方法就会很繁琐,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
有了流程序员就不需要了解外部设备是怎么操作的,只需要关注怎么样操作流就可以了,而流怎么把数据给外部设备这种底层的东西就不需要关注了
C程序针对文件、画⾯、键盘等的数据输入输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要先打开流,然后操作。 4.1.2 标准流 那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语⾔程序在启动的时候,默认打开了3个流:
• stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
• stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
• stderr - 标准错误流,大多数环境中输出到显示器界面。
编写时程序默认打开了这三个流,所以我们使用scanf、printf等函数就可以直接进行输入输出操作的。
4.2 文件指针 缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了⼀个相应的⽂件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE
例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE; 这以上就可以看出FILE是对结构体struct _iobuf的重命名
废话不多说,直接先放git仓库:GitHub - linyuye/Bilibili_crawler: bilibili爬虫,基于selenium获取oid与cookie,request获取api内容
〇:概念简述 oid:视频/动态的uuid,b站对于发布内容的通用唯一识别码
cookie:内含个人登录信息,爬虫头必需
其余内容请看该文档含义:
bilibili-API-collect/docs/comment/list.md at master · SocialSisterYi/bilibili-API-collect · GitHub哔哩哔哩-API收集整理【不断更新中....】. Contribute to SocialSisterYi/bilibili-API-collect development by creating an account on GitHub.https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/list.md
一:前言 首先,让我们了解,动态网站/静态网站的区别:
动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。动态网站体现在网页一般是以asp,jsp,php,aspx等技术,而静态网页一般是HTML(标准通用标记语言的子集)结尾,动态网站服务器空间配置要比静态的网页要求高,费用也相应的高,不过动态网页利于网站内容的更新,适合企业建站。动态是相对于静态网站而言。——百度百科
通俗来说,就是网页内容是否写在网站源代码里面的区别。
以编写日期时,bilibili每周必看视频榜一为例:https://www.bilibili.com/video/BV1ay411h74i/
对于第一条评论:在网页源代码中不存在,所以数据是从后端/数据库返回的,那么我们就可以通过查看网络请求。发现数据在main?oid这里面返回得到,至此,我们知道了评论是从哪里返回的。
二:API详解 api分析来源:GitHub - SocialSisterYi/bilibili-API-collect: 哔哩哔哩-API收集整理【不断更新中....】哔哩哔哩-API收集整理【不断更新中....】. Contribute to SocialSisterYi/bilibili-API-collect development by creating an account on GitHub.https://github.com/SocialSisterYi/bilibili-API-collect
https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/list.md
通过翻阅上述API文档,我们得知,使用正常API获取评论,在页数到达400页之后无法返回内容,好在b站提供了一个懒加载api能够爬取所有内容。
https://api.bilibili.com/x/v2/reply/main懒加载api,无需wbi签名
https://api.bilibili.com/x/v2/reply/reply获取子评论的api
对评论区请求需要以下data数据:(1为评论,2为子评论)
参数名类型内容必要性备注access_keystrAPP 登录 TokenAPP 方式必要typenum评论区类型代码必要类型代码见表oidnum目标评论区 id必要modenum排序方式非必要默认为 3
0 3:仅按热度
1:按热度+按时间
2:仅按时间nextnum评论页选择非必要按热度时:热度顺序页码(0 为第一页)
按时间时:时间倒序楼层号
默认为 0psnum每页项数非必要默认为 20
定义域:1-30 access_keystrAPP登录 TokenAPP 方式必要typenum评论区类型代码必要类型代码见表oidnum目标评论区 id必要rootnum根回复 rpid必要psnum每页项数非必要默认为20
目录
一.KeepAlived补充知识
1.一个合格的群集应该具备的特点
2.健康检查(探针)常用的工作方式
3.相关面试问题
问题1
问题2
二.Keepealived脑裂现象
1.现象
2.原因
硬件原因
运用配置原因
3.解决
4.预防
方法1
方法2
方法3
方法4
三.实验部署
1.两台nginx做初始化操作并安装nginx
2.四层反向代理配置
2.1.修改主调度器配置
2.2.修改备调度器配置
2.3.浏览器测试两台nginx服务器
3.配置高可用
4.准备检查nginx运行状态脚本
4.1.主服务器
4.2.备服务器
5.开启keepalived服务并测试
5.1.分别开启主备两台服务器keepalived
5.2.浏览器测试
一.KeepAlived补充知识 1.一个合格的群集应该具备的特点 负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat故障转移 通过VIP漂移实现主备切换 VRRP 脚本 2.健康检查(探针)常用的工作方式 发送心跳消息 vrrp报文 ping/pongTCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常HTTP URL检查 向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET 请求方法如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常 3.相关面试问题 问题1 Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP
答案
Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址 问题2 keepalived的抢占与非抢占模式
什么是ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;
最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
大家都知道,OSI模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层(网络层), MAC地址在第二层(数据链路层)。协议在发送数据包时,首先要封装第三层(IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务拿到MAC地址。
ARP工作过程 假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:
主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。 当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。
ARP缓存表和TTL ARP表 网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表现会被自动删除。如果目标设备位于其他网络则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。
ARP表项又分为动态ARP表项和静态ARP表项。
动态ARP表项 动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。每个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。
静态ARP表项 静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。直到重新启动计算机为止。
配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。
静态ARP表项分为短静态ARP表项和长静态ARP表项。
在配置长静态ARP表项时,除了配置IP地址和MAC地址项外,还必须配置该ARP表项所在VLAN和出接口。长静态ARP表项可以直接用于报文转发。在配置短静态ARP表项时,只需要配置IP地址和MAC地址项。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发;如果出接口是VLAN虚接口,短静态ARP表项不能直接用于报文转发,当要发送IP数据包时,先发送ARP请求报文,如果收到的响应报文中的源IP地址和源MAC地址与所配置的IP地址和MAC地址相同,则将接收ARP响应报文的接口加入该静态ARP表项中,之后就可以用于IP数据包的转发。 一般情况下,ARP动态执行并自动寻求IP地址到以太网MAC地址的解析,无需管理员的介入。
当希望设备和指定用户只能使用某个固定的IP地址和MAC地址通信时,可以配置短静态ARP表项,当进一步希望限定这个用户只在某VLAN内的某个特定接口上连接时就可以配置长静态ARP表项。
ARP报文格式 在局域网中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送,因此发送站还必须有接收站的物理地址,所以需要一个从IP地址到物理地址的映射。APR就是实现这个功能的协议。
ARP协议是通过报文进行工作的,是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为下图所示。
前面Ethernet Address of destination, Ethernet Address of sender 和 Frame Type属于数据链路层的封装,往后的就是真正的ARP报文数据结构。
ARP请求 下面是Wireshark抓的ARP请求报文,大家可以看到数据链路层的Ethernet Address of destination是全ff,说明这是一个广播包,是为了获取指定IP的MAC地址,可以看到ARP包中的Target IP address是192.168.0.7,但Target MAC address是全0,说明当前还不知道目标主机的MAC地址,Opcode为1,说明这是一个ARP请求报文。
ARP响应 下面是Wireshark抓的ARP响应报文,大家参照上面的报文格式解析一下咯:
免费ARP 免费 ARP(Gratuitous ARP)包是一种特殊的ARP请求,它并非期待得到IP对应的 MAC 地址,而是当主机启动的时候,发送一个 Gratuitous ARP请求,即请求自己的IP地址的MAC地址。
免费ARP报文与普通ARP请求报文的区别在于报文中的目标IP地址。普通ARP报文中的目标IP地址是其他主机的IP地址;而免费ARP的请求报文中,目标IP地址是自己的IP地址。
免费 ARP 数据包有以下 3 个作用。
实验二:贪心算法
【实验目的】
应用贪心算法求解活动安排问题。
【实验性质】
验证性实验。
【实验要求】
活动安排问题是可以用贪心算法有效求解的很好的例子。
问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:
i
1
2
3
4
5
6
7
8
9
10
11
s[i]
1
3
0
5
3
5
6
8
8
2
12
f[i]
4
5
6
7
8
9
10
11
12
13
14
将此表数据作为实现该算法的测试数据。
【算法思想及处理过程】
1.定义了活动结构体Activity,包含活动的名称name、开始时间start和结束时间end。
2.定义了比较函数compare,用于按照活动的结束时间升序排序。
3.定义了一个活动安排函数activityArrangement,接受一个活动数组和活动个数作为参数,并按照活动结束时间排序后进行活动安排。
4.在活动安排函数中,首先使用sort函数对活动数组进行排序,排序规则是使用之前定义的比较函数compare。
5.输出第一个活动的信息。
6.初始化一个变量lastEnd,用于记录最后一个加入最大相容子集的活动的结束时间。
7.遍历剩下的活动数组,如果当前活动的开始时间晚于等于lastEnd,即活动不与已加入的活动冲突,将该活动加入最大相容子集,并更新lastEnd为该活动的结束时间。
8.输出结果。
在主函数中,首先获取用户输入的活动个数,然后根据输入的活动个数循环获取活动的名称、开始时间和结束时间。最后调用活动安排函数(activityArrangement)进行活动安排。
【程序代码】
#include <iostream>
#include <algorithm>
using namespace std;
struct Activity {
int name;
题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
示例 1:
输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。
原题链接:https://leetcode.cn/problems/longest-common-subsequence/description/
思路 以 dp[i][j] 表示,text1[0:i] 和 text2[0:j] 的最长公共子序列长度。
找转移方程:
当 text[i] == text[j] 时,即两个子字符串末尾的字符相同时,dp[i][j] = dp[i-1][j-1] + 1。
当 text[i] != text[j] 时,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
找边界条件:
当 i=0 或 j=0 时,显然可得 dp[i][0]、dp[0][j] = 0
代码 class Solution { public: int longestCommonSubsequence(string text1, string text2) { int m = text1.
1.缓存穿透 描述:查询数据在redis不存在,请求打到数据库
解决方法:
缓存空值
当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间极短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。但这种处理方式是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。
使用布隆过滤器。
如果布隆过滤器判定某个 key 不存在布隆过滤器中,那么就一定不存在,如果判定某个 key 存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一个布隆过滤器,将数据库中的所有key都存储在布隆过滤器中,在查询Redis前先去布隆过滤器查询 key 是否存在,如果不存在就直接返回,不让其访问数据库,从而避免了对底层存储系统的查询压力。 2.缓存击穿 描述:缓存过期,伴随大量对该 key 的请求
1)互斥锁
比如某个key只允许一个线程查询数据和写缓存,其他线程等待。这种方式会阻塞其他的线程,此时系统的吞吐量会下降
2)热点数据永不过期
物理不过期,针对热点key不设置过期时间
逻辑不过期,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建
3)熔断降级
3.缓存雪崩 描述:同一时间大批量的 key 过期
解决方法:
1)热点数据不过期
2)随机分散过期时间
4.缓存预热 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请 求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
解决思路:
1、直接写个缓存刷新页面,上线时手工操作下;
2、数据量不大,可以在项目启动的时候 自动进行加载;
3、定时刷新缓存;
5.缓存更新 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们 还可以根据具体的业务需求进行自定义的缓存淘汰,
常见的策略有两种:
(1)定时去清理过期的 缓存;
(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系 统得到新数据并更新缓存。
两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第 二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家 可以根据自己的应用场景来权衡。
6.缓存降级 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流 程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自 动降级,也可以配置开关实现人工降级。 降级的最终目的是保证核心服务可用,即使是有损的。而 且有些服务是无法降级的(如加入购物车、结算)。
以参考日志级别设置预案:
(1)一般:比如 有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
(2)警告:有些服务在一 段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
(3)错 误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大 阀值,此时可以根据情况自动降级或者人工降级;
(4)严重错误:比如因为特殊原因数据错误 了,此时需要紧急人工降级。
汽车租赁系统中的用例图简述(10分) 本系统根据功能可以分为三个用例图:
客户用例图:主要描述客户注册、登录、找回密码、查询车辆信息(包括所有车辆信息、已借车辆信息、租赁历史信息)、修改个人信息、网上预订车辆、电话预定车辆、查询还车时间、取消预定的车辆、可以通过支付宝、微信和网银交订金。系统维护人员用例图:主要描述系统维护人员登录系统、查询用户基本信息、注销用户、删除信用不良好的用户、同意用户的预订申请、同意用户的借车信息、同意用户的还车信息、清算用户的费用、催缴到期未还的用户、管理员工信息、分配操作权限给员工和客户。技术人员用例图:主要描述技术人员登录系统、修改个人信息,增加、删除、修改、查询车辆信息 汽车租赁系统相关用例图(20分,文字描述5分,图15分) 客户相关的用例图中,客户注册、登录、找回密码、查询车辆信息、修改个人信息、网上预订车辆、电话预定车辆、查询还车时间、取消预定的车辆、交订金都是客户可以在系统中完成的操作,因此这十个用例跟读者是关联关系;同时,系统提供了三种不同的查询方式,每一种查询方式都可以继承查询车辆信息的行为和含义,因此,这三种查询方式和查询书籍是泛化关系。系统提供了三种不同的交订金方式,每一种交订金方式都可以继承交订金的行为和含义,因此,这三种交订金方式和交订金是泛化关系,如下图所示
四:用例描述(每个用例10分)
(1)客户注册
用例编号
UC0001
用例名称
客户注册
用例说明
注册新用户,并保存到系统中
前置条件
无
基本事件流
1、客户向系统发出“客户注册”请求;
2、系统要求客户填写信息
3、系统自动保存。
其他事件流
无
异常事件流
如果客户输入的信息错误,则要求客户重新填写;
如果客户取消输入,则结束用例,不存入到系统。
后置条件
完成客户信息的录入和存储
其他说明
无
(2)客户登录
用例编号
UC0001
用例名称
客户登录
用例说明
客户进入系统
前置条件
客户注册
基本事件流
1、客户向系统发出“登录”请求;
2、系统比对客户信息
其他事件流
无
异常事件流
如果客户输入信息错误,则要求客户重新填写信息或者取消;
如果客户取消输入,则结束用例
后置条件
登录系统
其他说明
无
(3)技术人员登录系统
用例编号
UC0001
用例名称
技术人员登录系统
用例说明
技术人员进入系统
前置条件
技术人员注册
基本事件流
1、技术人员向系统发出“登录”请求;
2、系统比对技术人员信息
其他事件流
无
异常事件流
如果技术人员输入信息错误,则要求技术人员重新填写信息或者取消;
如果技术人员取消输入,则结束用例
后置条件
登录系统
其他说明
目录
AI大模型的战场:通用与垂直的较量
1.引言
2.通用大模型的优势
2.1 概念
2.2 谷歌的BERT模型
2.3 OpenAI的GPT模型
2.4 微软的Visual Studio Code
2.5 结论
3.垂直大模型的崛起
3.1 概念
3.2 医疗影像分析的AI模型
3.3 自动驾驶领域的AI模型
3.4 金融风控模型
3.5 结论
4.大模型的赛点:谁将占据优势?
5.结语
AI大模型的战场:通用与垂直的较量 在人工智能的快速发展浪潮中,大模型技术已经站在了科技革命的前沿。随着技术的不断进步和应用场景的不断拓展,AI大模型的战场正在经历一场深刻的分化。本文将探讨这一现象,并分析通用大模型与垂直大模型在落地场景中的不同优势,以及它们在未来竞争中的潜在赛点。
1.引言 AI大模型,以其强大的计算能力和广泛的应用范围,已经成为推动各行各业智能化转型的关键力量。然而,随着市场和技术的不断发展,大模型的发展方向出现了分化:一方面是功能全面、应用广泛的通用大模型;另一方面是专注于特定领域、具有高效率和高精准度的垂直大模型。这两种模型各有千秋,它们在不同的场景下展现出各自的优势。
2.通用大模型的优势 2.1 概念 通用大模型,顾名思义,是指那些能够处理多种类型任务的AI模型。它们通常具有较高的灵活性和广泛的适用性,能够适应多变的市场需求和多样化的应用场景。
广泛的应用场景:通用大模型可以应用于从自然语言处理到图像识别,再到数据分析等多个领域,几乎涵盖了人工智能的所有应用范畴。技术成熟度:由于长期的技术积累和大量的研究投入,通用大模型在算法和架构上更加成熟,能够提供稳定可靠的服务。持续的创新能力:通用大模型由于其广泛的应用基础,能够吸引更多的研究者和开发者,推动技术的持续创新。 2.2 谷歌的BERT模型 背景:BERT(Bidirectional Encoder Representations from Transformers)是由谷歌在2018年提出的预训练语言表示模型,它在自然语言处理(NLP)领域取得了革命性的进展。
技术特点:
BERT采用了Transformer架构,通过注意力机制来捕捉词与词之间的关系。它能够理解语言的双向上下文,从而提供更准确的语言表示。 应用场景:
文本分类:如情感分析、主题分类等。问答系统:BERT能够理解问题的上下文,并在大量文本中找到准确的答案。机器翻译:通过预训练的模型,BERT能够提供高质量的翻译结果。 代码示例(使用Hugging Face的Transformers库):
from transformers import BertTokenizer, BertModel # 加载预训练的BERT模型和分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # 准备输入文本 text = "The quick brown fox jumps over the lazy dog"
💛前情提要💛
本文是传知代码平台中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间,对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步伐吧~
📌导航小助手📌 💡本章重点🍞一. 概述🍞二. 论文方法🍞三. 实验🍞四. 关键代码🫓总结 💡本章重点 ERA-CoT: 实体关系推理 🍞一. 概述 该论文提出了一种新的框架,称为基于链式思维的实体关系分析(ERA-CoT),旨在解决涉及多个实体的复杂场景中的推理任务。通过提取文本中的所有实体及其显式关系,并基于这些关系和隐藏信息推断隐式关系,ERA-CoT显著提高了大语言模型(LLMs)的推理能力和问题回答的准确性。
实验结果表明,ERA-CoT在各种基准测试中均优于现有的链式思维提示方法,在GPT-3.5上平均提升了5.1%的准确率。
本篇在论文代码的基础上增加了llama2模型的相关文件,修改了模型相关代码。
🍞二. 论文方法 论文中提出的ERA-CoT框架包含五个步骤:
实体提取:
利用大型语言模型(LLMs)的信息提取能力,从文本中提取所有实体及其类型。具体来说,模型接受一个输入句子,利用其命名实体识别(NER)功能预测相应的实体范围和分类。为了提高实体提取的准确性,采用了自一致性(Self-Consistency, SC)方法,多次验证实体提取结果,确保提取的实体可靠。 显式关系提取:
在零样本设置下,探讨不同实体之间的显式关系。通过LLM的上下文理解能力,从文本中直接提取实体对之间的关系,生成关系三元组。同样地,使用SC方法评估显式关系的可靠性。 隐式关系推断:
基于显式关系和文本中的隐藏信息推断实体之间的隐式关系。通过生成多个可能的隐式关系,并使用模型进行评分,确定这些关系的可靠性。具体来说,通过分析上下文中的隐含信息,推断出未显式提到但可能存在的实体关系。 关系过滤:
使用模型对隐式关系的可靠性进行评分,设定阈值筛除低于阈值的隐式关系。这一步骤确保了最终关系集的高质量和准确性。 问题回答:
基于提取的实体以及获得的显式和隐式关系回答问题。在这个过程中,模型利用之前提取和过滤的关系信息,提供更准确和详细的答案。
通过这些步骤,ERA-CoT框架在处理复杂实体场景中的推理任务时展示了强大的性能和准确性提升
🍞三. 实验 论文通过在六个广泛采用的数据集上进行实验,验证了ERA-CoT的有效性,并与四种基线方法进行了对比。结果表明,ERA-CoT在几乎所有基准测试中均表现出色,平均提升了大约5.1%的准确率。
在GPT-3.5和Llama-2两种大语言模型上,ERA-CoT在常识推理、数学推理和逻辑推理三种类型的问题上均表现出显著提升,表明增强模型的实体关系理解能力能够显著提高推理能力和问题回答的准确性。
创建虚拟环境并激活
安装环境依赖
运行llama2的预测代码
🍞四. 关键代码 实体提取: import json # from config import args prompt_prefix = '''Given a sentence, possible entities may include:''' prompt_suffix = ''', Find all entities based on the provided sentence.
DBUS_SESSION_BUS_ADDRESS 环境变量通常在用户会话环境中定义,用于指示会话总线的地址。在 root 用户环境下,这个环境变量可能为空,原因如下:
原因分析 会话总线与用户会话相关:
会话总线(session bus)是与特定用户会话相关的总线,每个用户登录后都会启动一个会话总线守护进程,并设置 DBUS_SESSION_BUS_ADDRESS 环境变量以指示其地址。
root 用户通常没有独立的图形会话,因此不会自动设置 DBUS_SESSION_BUS_ADDRESS。
root 用户环境不同:
root 用户的环境变量通常不会包括与图形会话相关的变量,因为 root 用户不需要运行用户级别的图形应用程序。
在某些情况下,root 用户可能会在没有图形环境的终端(如 SSH 会话)中运行,因此不会有会话总线。
区分系统环境变量和用户环境变量 系统环境变量:
系统环境变量通常在系统启动时设置,适用于所有用户。
这些变量可以在 /etc/environment、/etc/profile、/etc/bash.bashrc 等全局配置文件中设置。
例如,PATH 是一个常见的系统环境变量,定义了系统查找可执行文件的路径。
用户环境变量:
用户环境变量在用户登录时设置,适用于特定用户。
这些变量可以在用户的主目录下的配置文件中设置,如 ~/.bashrc、~/.profile、~/.bash_profile 等。
DBUS_SESSION_BUS_ADDRESS 就是一个典型的用户环境变量,只有在用户图形会话启动时才会被设置。
如何为 root 用户设置 DBUS_SESSION_BUS_ADDRESS 如果需要在 root 用户下运行需要会话总线的应用程序,可以手动设置 DBUS_SESSION_BUS_ADDRESS。具体步骤如下:
在普通用户环境下获取 DBUS_SESSION_BUS_ADDRESS:
在普通用户会话中,使用以下命令获取当前的 DBUS_SESSION_BUS_ADDRESS: echo $DBUS_SESSION_BUS_ADDRESS 将其导出到 root 用户环境: 切换到 root 用户并导出会话总线地址: sudo -i export DBUS_SESSION_BUS_ADDRESS=your_session_bus_address your_session_bus_address 是从普通用户环境中获取到的会话总线地址。 在 root 用户环境中运行应用程序: 现在可以在 root 用户环境中运行需要会话总线的应用程序,例如: gnome-terminal 示例脚本 以下是一个示例脚本,用于在 root 用户环境中继承普通用户的会话总线地址:
免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。
目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目录扫描2.4.1 dirb目录扫描2.4.2 dirsearch目录扫描 2.5 漏洞切入点2.5.1 访问首页2.5.2 nmap漏洞扫描2.5.3 nikto漏洞扫描2.5.4 enum4linux漏洞扫描2.5.5 wfuzz模糊测试2.5.6 searchsploit搜索samba漏洞 三、渗透测试3.1 SQL注入3.1.1 Burp Suit抓登录包3.1.2 爆破数据库3.1.3 当前连接的数据库3.1.4 连接的数据库的表名3.1.5 字段名3.1.6 用户名和密码 3.2 shell逃逸3.2.1 ssh登录3.2.2 shell逃逸 3.3 mysql udf提权3.3.1 查看服务3.3.2 php文件查找3.3.3 查看php文件3.3.4 登录mysql数据库3.3.5 查看udf表3.3.6 管理员用户组添加3.3.7 切换超级管理员3.3.8 flag 渗透总结参考文章 前言 今日测试内容渗透Kioptrix Level #4靶机:
Vulnhub是一个提供各种漏洞环境的靶场平台,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞。本文介绍Kioptrix Level #4靶机渗透测试,内容包括主机扫描(nmap\netdiscover)、端口扫描(nmap\masscan)、目录扫描(dirb\dirsearch)、SQL注入、udf系统提权等内容。
Description
Back to the Top
Again a long delay between VMs, but that cannot be helped.