中学网上做试卷的网站/百度快照如何优化
一、说明
- 第 1 部分:Python 包探讨了 Python 模块、Python 包的基础知识以及如何将模块导入您自己的项目。【Python 程序设计】包和数据人员入门【01/8】
- 第 2 部分:介绍了依赖项管理和虚拟环境。【Python 程序设计】数据人员入门【02/8】
- 第 3 部分: 项目的最佳实践,涵盖了构建项目的 9 个最佳实践和示例。【Python程序设计】 项目的最佳实践【03/8】
- 第 4 部分: Dagster 管道,我们探讨了设置 Dagster 项目以及数据资产的关键概念。【Python程序设计】 从 Python 项目到 Dagster Pipelines【04/8】
- 第 5 部分:我们将介绍环境变量的重要性以及如何使用它们。【Python程序设计】Python 中的环境变量【05/8】
- 第 6 部分:类型提示,或类型提示如何减少错误。
- 第7 部分:模式,或学习设计模式,它们是软件设计中常见问题的可重用解决方案。【Python程序设计】 工厂模式【07/8】
二、Python 编程中的工厂模式
在本系列中,你了解了数据工程中的 Python 最佳实践,以及如何构建更健壮和可扩展的软件。今天,我们将采用一种称为设计模式的更高级编程概念,它是软件设计中常见问题的可重用解决方案。您可能会在数据工程项目中遇到这些问题。
我们将看看什么是设计模式,为什么要使用它们,并特别深入探讨一种模式:工厂模式。我们还将讨论为什么数据工程师会从使用工厂模式中受益。
工厂模式优雅地简化了数据连接器的创建,并使现有数据基础结构更具可扩展性。这对于处理具有不同处理需求的各种数据源的数据工程师特别有用。
工厂模式定义:在软件设计中,“工厂模式”允许您创建一个类,其子类决定要实例化哪个类。工厂模式允许在不指定将要创建的确切对象类的情况下创建对象,从而促进代码中的松散耦合和可伸缩性。此模式通常使用工厂方法或工厂类来实现,以基于输入条件或条件生成对象的实例。
工厂模式称为“创建设计模式”(本文稍后将对此进行说明)。
在本课程的这一部分中,我们将了解工厂模式如何在数据工程中实现可重用性、可伸缩性和可维护性。
三、 设计模式 101
Python 中的设计模式作为模板工作,可以应用于重复性任务或问题,因此在数据工程中非常有用。对于 Python 数据工程师来说,设计模式为数据处理和集成任务中反复出现的挑战提供了结构化且高效的解决方案。它们还提供共享词汇表,促进团队成员之间更清晰的沟通,从而实现更一致和协作的软件设计。
3.1 设计模式的类型
Python 中的设计模式以及一般编程中的设计模式通常被认为是中级到高级概念,因为它们通常需要了解编程原理、面向对象设计以及识别和抽象更大、更复杂的系统(即代码架构)中反复出现的问题的能力。Python的设计模式通常分为三种类型:
- 创建模式:这些模式包括工厂模式,可用于实例化和管理数据库连接,确保无论是连接到 SQL 数据库还是 NoSQL 存储,该过程都得到简化且一致
- 结构模式:提供有关组织和链接不同组件的指导,在集成不同的数据源时可能非常宝贵。例如,您可以使用适配器模式将来自旧系统的数据与现代分析平台协调,从而确保无缝数据流
- 行为模式:提供对象之间有效沟通和交互的策略。例如,可以使用观察者模式来监视数据集中的更改:想象一下,每当新数据到达时,数据引入过程都会通知多个下游处理任务。
3.2 为什么要在数据工程中使用设计模式?
设计模式为数据工程任务提供了明显的优势,这些任务与软件设计的核心原则相呼应:
- 声明:通过设计模式,数据工程师可以定义最终目标或他们想要实现的目标,而不会陷入程序应该如何执行的细节中。通过定义你想要什么,底层逻辑会处理“如何”。这种抽象简化了过程。
- 可 重用: 将设计模式视为蓝图。正如建筑计划可用于建造各种建筑物一样,这些模式可以应用于不同的管道或项目,确保您的工作不仅限于一个解决方案,而是可以多次利用。
- 一致: 数据世界是广阔而多样的。通过采用设计模式,数据工程师可确保数据资产(无论其来源或应用程序如何)都遵循一致的结构和行为。这使得数据操作可预测并减少异常,从而产生更强大的数据系统。
通过将资产工厂等设计模式集成到数据工程工作流(从数据提取、分析数据、数据转换等)中,我们为更顺畅的操作、更少的错误和更高效的系统铺平了道路,确保管理和优化数据以获得最佳结果。
每个设计模式都用于防止在项目缩放时出现特定问题。今天,我们将重点介绍工厂模式,该模式用于构建多个类似的东西,以促进集中配置、标准化测试,并在遵守一致性的同时允许灵活性。
四、工厂模式如何工作?
工厂模式被归类为创建模式,因为它们在 Python 编程中创建对象。它们根据某些条件语句或参数返回不同的对象。
4.1 将对象创建与主应用程序分离
将工厂模式视为公司中的一个专业部门,只专注于生产某些产品。该部门负责制造的所有细节,公司的其他部门只需在需要时要求产品,而不必担心其制造方式。
同样,工厂模式负责创建特定对象的所有细节。应用程序的其余部分不需要知道这些对象的创建方式或它们需要哪些参数。它只是要求“工厂”生产对象,并信任它来处理其余的。这种分离使代码更清晰、更易于理解。
4.2 Python 中的工厂模式
在 Python 中,实现工厂模式特别精简,这要归功于它的动态类型和一流的函数。您可以从工厂函数返回不同的类甚至函数,而无需太多样板。
此外,许多 Python 库和框架利用工厂模式或类似工厂的模式,即使它不是显式的或完全相同的。例如,像SQLAlchemy这样的ORM(对象关系映射库)使用工厂来创建数据库会话对象。SQLAlchemy 可以比作工厂模式,因为它生成新的会话实例,充当数据库通信的主要接口。sessionmaker()
4.3 使用 Python 在数据工程中使用工厂模式:示例
Python 的内置功能(如装饰器)可用于增强工厂模式。例如,装饰器可用于向工厂注册类,从而扩展工厂的功能,而无需显式修改它。
想象一下数据工程中的一个常见场景:用于操作来自不同文件格式的数据的数据管道:CSV、JSON 和 XML 文件。根据文件类型,应应用不同的分析步骤。
我们将使用一个简单的字典作为这些文件解析器的“注册表”,并将函数作为我们的工厂。
首先,我们将定义解析函数:
import csv
import json
import xml.etree.ElementTree as ETdef parse_csv(file_path):with open(file_path, mode='r') as file:reader = csv.reader(file)return list(reader)def parse_json(file_path):with open(file_path, mode='r') as file:return json.load(file)def parse_xml(file_path):tree = ET.parse(file_path)root = tree.getroot()return root # you'd typically add more logic to process the XML tree
然后,我们将定义一个装饰器来注册这些解析器:
PARSERS = {}def register_parser(file_type):def decorator(fn):PARSERS[file_type] = fnreturn fnreturn decorator
我们将注册我们的解析器:
@register_parser('csv')
def csv_parser(file_path):return parse_csv(file_path)@register_parser('json')
def json_parser(file_path):return parse_json(file_path)@register_parser('xml')
def xml_parser(file_path):return parse_xml(file_path)
最后,我们将编写一个函数来获取正确的解析器,并使用工厂来解析文件:
def get_parser(file_type):return PARSERS.get(file_type)data_csv = get_parser('csv')('data.csv')
data_json = get_parser('json')('data.json')
data_xml = get_parser('xml')('data.xml')
对于数据工程师来说,处理多种文件格式是很常见的,并且能够使用新的解析器(如XML,Parquet等)轻松扩展系统至关重要。通过此设置,数据工程师只需定义一个新的解析函数并将其注册到装饰器,即可轻松扩展系统以支持新的文件类型。
无需接触现有的工厂逻辑,使其易于维护和扩展。通过将工厂模式与装饰器一起使用,我们可以简化此过程并维护更干净、更模块化的代码。
五、使用工厂模式进行数据工程
数据工程师或数据科学家经常将工厂模式用于日常任务,例如批处理、构建实时数据流和 ETL 管道。
例如,假设工作流中有各种类型的数据连接,例如数据库、文件或 API。您可以使用工厂模式根据当时的需求为您创建正确的连接,而不是手动创建与每个连接的连接。可以把它想象成一条装配线,在需要时准确地生产你需要的东西,而不会用不必要的细节弄乱其余的代码。
5.1 在数据管道中
让我们考虑一个需要连接到不同类型的数据库的场景,如MySQL和PostgreSQL。工厂模式可用于根据给定输入创建适当的数据库连接。下面是一个说明此模式的简单示例:
让我们首先定义每个数据库的连接:
import mysql.connector
import psycopg2def connect_mysql(host, user, password, database):connection = mysql.connector.connect(host=host,user=user,password=password,database=database)return connectiondef connect_postgresql(host, user, password, database):connection = psycopg2.connect(host=host,user=user,password=password,dbname=database)return connection
接下来,我们将定义一个装饰器来注册数据库连接:
DB_CONNECTIONS = {}def register_db_connector(db_type):def decorator(fn):DB_CONNECTIONS[db_type] = fnreturn fnreturn decorator
然后,我们将注册连接:
@register_db_connector('mysql')
def mysql_connector(host, user, password, database):return connect_mysql(host, user, password, database)@register_db_connector('postgresql')
def postgresql_connector(host, user, password, database):return connect_postgresql(host, user, password, database)
最后,我们将编写一个函数来获取正确的连接器,并使用工厂来获取适当的数据库连接:
def get_db_connector(db_type):if db_type not in DB_CONNECTIONS:raise ValueError(f"Unsupported database type: {db_type}")return DB_CONNECTIONS[db_type]# Example usage:
mysql_conn = get_db_connector('mysql')('localhost', 'user', 'password', 'mydb')
postgres_conn = get_db_connector('postgresql')('localhost', 'user', 'password', 'mydb')
通过此设置,将来添加对新型数据库连接的支持非常简单。我们首先定义连接函数,然后使用装饰器注册它。无需更改其他部件,展示了工厂模式的可维护性和可扩展性优势。
六、实际方案中的工厂模式
工厂在以下情况下特别有用:
- 处理可能随时间变化的外部库或系统,让您隔离这些更改
- 实现系统的插件或扩展
- 需要出于对象池、延迟初始化或日志记录等目的控制对象实例化
我们将看两个示例,说明工厂资产在现实世界中的工作方式。
6.1 示例 1:抓取维基百科
当您需要抓取不同类型的页面但希望为所有页面保持一致的界面时,工厂模式在网页抓取中特别有用。让我们看看工厂模式如何用于按人口抓取维基百科的国家和依赖关系表:
首先,请确保安装以下内容:
pip install requests
pip install beautifulsoup4
然后,定义函数以从维基百科中抓取不同的表。假设维基百科可能有多个表以不同的格式表示这些数据。一个表可能是标准表,而另一个表可能是针对移动设备优化的。
from bs4 import BeautifulSoup
import requestsdef scrape_standard_table(url):page = requests.get(url)soup = BeautifulSoup(page.content, 'html.parser')# Assuming the first table on the page is the one of interesttable = soup.find_all("table")[0]rows = table.find_all("tr")data = []for row in rows[1:]: # skipping the header rowcolumns = row.find_all("td")country = columns[0].get_text(strip=True)population = columns[1].get_text(strip=True)data.append((country, population))return datadef scrape_mobile_table(url):page = requests.get(url)soup = BeautifulSoup(page.content, 'html.parser')# Mobile tables might be different, for the sake of example let's assume they're div-basedtable_div = soup.find("div", {"class": "mobile-table"})rows = table_div.find_all("div", {"class": "row"})data = []for row in rows:country = row.find("div", {"class": "country"}).get_text(strip=True)population = row.find("div", {"class": "population"}).get_text(strip=True)data.append((country, population))return data
然后,我们将定义一个装饰器来注册抓取函数:
SCRAPERS = {}def register_scraper(scraper_type):def decorator(fn):SCRAPERS[scraper_type] = fnreturn fnreturn decorator
现在我们将注册我们的抓取函数:
@register_scraper('standard')
def standard_scraper(url):return scrape_standard_table(url)@register_scraper('mobile')
def mobile_scraper(url):return scrape_mobile_table(url)
最后,我们将编写我们的函数来获取正确的抓取工具,并使用工厂从维基百科获取数据:
def get_scraper(scraper_type):if scraper_type not in SCRAPERS:raise ValueError(f"Unsupported scraper type: {scraper_type}")return SCRAPERS[scraper_type]# Example usage:
url = "https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population"
data_standard = get_scraper('standard')(url)
# data_mobile = get_scraper('mobile')(url) # if you had a mobile URL
在此示例中,添加对将来抓取不同格式的支持(如维基百科中的不同表结构)很简单:定义抓取函数,然后使用装饰器注册它。这可确保抓取代码保持模块化且易于扩展,而无需修改现有逻辑。
6.2 示例 2:数据编排
Dagster 是一个数据编排器,可为数据处理的不同阶段(从引入到机器学习)提供单一管理平台。Dagster帮助安排和观察广泛的数据工程工具,Python作为其编程语言。它被数据工程师和数据科学家广泛用于数据科学、数据分析、大数据、机器学习等一系列应用。
Dagster 的功能之一是能够管理资产,这些资产是数据计算的输出。资产表示一段数据或具有价值且值得跟踪的计算结果。这可以是数据库中的表、磁盘上的文件、模型工件等。资产通常是管道的输出。
资源工厂是 Dagster 中的一项功能,允许用户以声明方式定义资产的生成方式。它们可以被视为通过定义生成资产所需的输入、输出和计算来创建资产的模板。
让我们演练一个简单的示例,在该示例中,我们将通过在 Dagster 中应用 Factory 模式来重构现有代码块以生成一组资产。
在开始之前,请确保安装Dagster:
pip install dagster dagster-webserver
假设我们是非营利组织数据工程团队的一员。我们有一些现有的代码来查询捐赠者平台的 API 并将结果写入文件(CSV 或 JSON)。它目前看起来像这样:
from dagster import asset
import requests
import csv@asset
def volunteers():result = requests.get('www.donorplatform.org/api/v1/volunteers')with open('volunteers.csv', 'w') as f:writer = csv.writer(f)writer.writerows(result)@asset
def donations():result = requests.get('www.donorplatform.org/api/v2/donations')with open('donations.csv', 'w') as f:writer = csv.writer(f)writer.writerows(result)@asset
def donors():result = requests.get('www.donorplatform.org/api/v1/donors')with open('donors.json', 'w') as f:f.write(result)
我们的运营团队最近扩大了对捐赠者平台的使用,并要求我们从 50 个新的 API 端点运行数据提取。这变得不守规矩且难以管理,因为您知道这将需要很长时间,数据工程师将偏离他们检索数据的方式,并且很难测试。
使用我们新的 python 技能,让我们为此应用工厂模式来解决这些问题。
首先,让我们定义可以配置的内容。需要为每个资产自定义三个部分:
- 资产的名称
- 它查询的终结点
- 结果保存为的文件类型
因此,我们将定义一个 JSON 对象来集中资产的可能配置。
specs = [{'name': 'volunteers','endpoint': 'v1/volunteers','file_type': 'csv'},{'name': 'donations','endpoint': 'v2/donations','file_type': 'csv'},{'name': 'donors','endpoint': 'v1/donors','file_type': 'json'}
]
然后,我们将定义和泛化我们的资产函数,以采用规范并生成资产
spec = specs[0] # take a single spec as reference while building@asset(name=spec['name'])
def generic_asset():result = requests.get(f'www.donorplatform.org/api/{spec["endpoint"]}')with open(f'{spec["name"]}.f{spec["file_type"]}', 'w') as f:if spec["file_type"] == 'csv':writer = csv.writer(f)writer.writerows(result)elif spec["file_type"] == 'json':f.write(result)
最后,让我们将通用资产包装在一个函数中,该函数将用作生成所有资产的工厂。该函数将采用规范并将其应用于我们的资产。
def generate_donor_platform_asset(spec):@asset(name=spec['name'])def _asset():result = requests.get(f'www.donorplatform.org/api/{spec["endpoint"]}')with open(f'{spec["name"]}.f{spec["file_type"]}', 'w') as f:if spec["file_type"] == 'csv':writer = csv.writer(f)writer.writerows(result)elif spec["file_type"] == 'json':f.write(result)return _asset
在您的工厂中,您只需定义其他规格即可生产更多资产。以下是它在生产中的使用方式:
from dagster import Definitions, asset
import requests
import csvspecs = [{'name': 'volunteers', 'endpoint': 'v1/volunteers', 'file_type': 'csv'},{'name': 'donations', 'endpoint': 'v2/donations', 'file_type': 'csv'},{'name': 'donors', 'endpoint': 'v1/donors', 'file_type': 'json'},{'name': 'projects', 'endpoint': 'v1/projects', 'file_type': 'json'},{'name': 'fundraisers', 'endpoint': 'v1/fundraisers', 'file_type': 'csv'},
]def generate_donor_platform_asset(spec):@asset(name=spec['name'])def _asset():result = requests.get(f'www.donorplatform.org/api/{spec["endpoint"]}')with open(f'{spec["name"]}.f{spec["file_type"]}', 'w') as f:if spec["file_type"] == 'csv':writer = csv.writer(f)writer.writerows(result)elif spec["file_type"] == 'json':f.write(result)return _assetdefs = Definitions(assets=[generate_donor_platform_asset(spec) for spec in specs])
如果您运行 ,您将可以访问 dagster 的 UI 和 localhost:3000 上的资产图。当您向列表中添加更多规范并重新加载定义时,您将看到生成的更多资产。dagster dev
这是 Dagster 中资产工厂入门的基本数据工程示例。随着您深入研究 Dagster,您可以探索更高级的功能。Dagster还提供与许多数据库和数据系统的集成。这使得使用资源工厂以各种格式和位置生成资产变得容易。可以使用资产工厂在云存储系统上生成文件、执行 SQL 或训练机器学习模型。
因此,python项目中的资产工厂提供了相同的三个好处:
- 声明:资源工厂允许您指定要生产的内容,而无需编写如何生成它的详细逻辑
- 可 重用:由于资源工厂是模板,因此可以在不同的管道或项目中重复使用它们
- 一致:使用资源工厂可确保以一致的方式生成资产,无论它们在何处或如何使用
七、结论
工厂模式是数据工程师的宝贵工具,尤其是在处理不同类型的数据源或复杂对象创建时。它简化了您的代码,使其更具可重用性、可扩展性和可维护性。
作为最流行的编程语言之一,在使用 Python 进行数据工程时,工厂模式非常有用。虽然这些也适用于其他语言,但您最有可能遇到 Python 作为通用编程语言,落后于大多数流行的数据工程任务工具。
相关文章:

【Python程序设计】 工厂模式【07/8】
一、说明 我们探索数据工程中使用的设计模式 - 软件设计中常见问题的可重用解决方案。 以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。 迄今为止,…...

PHP8的多维数组-PHP8知识详解
今天分享的是php8的数组中的多维数组,主要内容有:多维数组的概念、创建和输出二维数组、创建和输出三维数组。 1、多维数组的概念 多维数组是包含一个或多个数组的数组。在多维数组中,主数组中的每一个元素也可以是一个数组,子数…...

【【STM32--28--IO引脚的复用功能】】
STM32–28–IO引脚的复用功能 STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制,我们称之为通用 复用: IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功…...

CodeJock Active-X / COM v22.1.0 Crack
CodeJock Active-X / COM v22.1.0--这个支持 Unicode 啦, Unicode Unicode 创建专业应用程序,其中包含一整套高度可定制的用户界面组件,包括 Visual Studio 风格的对接窗格和 Office 风格的功能区、工具栏和菜单,为您的应用程序…...

mac通过docker搭建elasticsearch:8.9.2以及kibana:8.9.2
1.elasticsearch.yml配置修改: cluster.name: "docker-cluster" network.host: 0.0.0.0 http.port: 9200 #discovery.seed_hosts: ["172.17.0.2"]#----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # T…...

python实现排列组合代码
def combination(n, c, com1, limit0, per[]):for pos in range(limit, n):t per [pos]if len(set(t)) len(t):if len(t) c:yield [pos, ]else:for result in combination(n, c, com, com * pos, per [pos, ]):yield [pos, ] resultprint("排列:") …...

盲盒小程序开发方案
盲盒游戏作为一种富有趣味性和收藏价的虚拟盲盒产品,近年来在游戏市场中备受关注。本文将深入探讨盲盒游戏的开发方案,从市场趋势分析、用户体验设计、商业模式选择等多个维度,为开发者提供业且有深度的思考,以帮助他们在盲盒游戏…...

Mysql锁
文章目录 1. 概述2. 分类3. 全局锁4. 表级锁5. 行级锁 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并…...

Kubernetes(k8s)安装NFS动态供给存储类并安装KubeSphere
Kubernetes安装NFS动态供给存储类并安装KubeSphere KubeSphere介绍环境准备KubeSphereNFS动态供给 安装NFS动态供给搭建NFS下载动态供给驱动修改驱动文件安装动态供给 安装KubeSphere下载KubeSphere的yaml资源清单文件安装KubeSphere 使用KubeSphere部署应用创建项目部署MySQL …...

机器学习笔记 - 【机器学习案例】基于KerasCV的预训练模型自定义多头+多标签预测
一、KerasCV KerasCV 是一个模块化计算机视觉组件库,可与 TensorFlow、JAX 或 PyTorch 原生配合使用。这些模型、层、指标、回调等基于Keras Core构建,可以在任何框架中进行训练和序列化,并在另一个框架中重复使用,而无需进行昂贵的迁 KerasCV 可以理解为 Keras API 的水平…...

Linux Debian常用70条经典运维命令和使用案例
一、前言 今天分享一些Linux Debian运维方法以及常用命令 二、运维方法 Linux Debian系统的运维涉及到各种任务,包括系统安装、配置、更新和维护,以及故障排查和性能优化等。下面是一些常用的运维命令: 1、以下是部分命令注释 1. apt-ge…...

【涵子来信】——步入中学,日积跬步,以致千里
大家好: 我是涵子,好久没有发文,今天发个文。 如果说,给你一次再入中学的机会,你会怎么想?对于刚刚步入中学的我,目前状况尚好,洛谷最近刷得紧,看看我的洛谷。 好的&…...
【sgCreateAPI】自定义小工具:敏捷开发→自动化生成API接口脚本(接口代码生成工具)
<template><div :class"$options.name"><div class"sg-head">接口代码生成工具</div><div class"sg-container"><div class"sg-start "><div style"margin-bottom: 10px;">接口地…...

数据库相关基础知识
第一章 概念 1、数据:描述事物的符号记录称为数据。特点:数据和关于数据的解释不可分。 2、数据库:长期存储在计算机内、有组织、可共享的大量的数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的冗余度、…...

LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和)
文章目录 前置知识贪心算法的本质什么时候用贪心算法?什么时候不能用贪心?贪心算法的解题步骤 455.分发饼干题目描述解题思路代码 376. 摆动序列题目描述解题思路代码 53. 最大子序和题目描述暴力解法动态规划贪心算法 总结 前置知识 贪心算法的本质 贪心的本质是选择每一阶…...

C++算法 —— 分治(2)归并
文章目录 1、排序数组2、数组中的逆序对3、计算右侧小于当前元素的个数4、翻转对 本篇前提条件是已学会归并排序 1、排序数组 912. 排序数组 排序数组也可以用归并排序来做。 vector<int> tmp;//写成全局是因为如果在每一次小的排序中都创建一次,更消耗时间和…...

Hadoop YARN HA 集群安装部署详细图文教程
目录 一、YARN 集群角色、部署规划 1.1 集群角色--概述 1.2 集群角色--ResourceManager(RM) 1.3 集群角色--NodeManager(NM) 1.4 HA 集群部署规划 二、YARN RM 重启机制 2.1 概述 2.2 演示 2.2.1 不开启 RM 重启机制…...

BBS+商城项目的数据库表设计
本文章是对于BBS商城项目的数据库的初步设计,仅供参考! -- 创建用户表 CREATE TABLE Users (id bigint(20) PRIMARY KEY COMMENT 用户ID,username varchar(255) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,status int(1) DE…...

如何使用Savitzky-Golay滤波器进行轨迹平滑
一、Savitzky-Golay滤波器介绍 Savitzky-Golay滤波器是一种数字滤波器,用于平滑数据,特别是在信号处理中。它基于最小二乘法的思想,通过拟合数据到一个滑动窗口内的低阶多项式来实现平滑。这种滤波器的优点是它可以保留数据的高频信息&#…...

Nomad系列-Nomad网络模式
系列文章 Nomad 系列文章 概述 Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Consul 及 CNI 等不同组件也会导致网络模式各不相同. 本文详细梳理一下 Nomad 的主要几种网络模式 在Nomad 1.3发布之前&a…...

OpenCV项目开发实战--实现面部情绪识别对情绪进行识别和分类及详细讲解及完整代码实现
文末提供免费的完整代码下载链接 面部情绪识别(FER)是指根据面部表情对人类情绪进行识别和分类的过程。通过分析面部特征和模式,机器可以对一个人的情绪状态做出有根据的猜测。面部识别的这个子领域是高度跨学科的,借鉴了计算机视觉、机器学习和心理学的见解。 在这篇研究…...

Validate表单组件的封装
之前一直是直接去使用别人现成的组件库,也没有具体去了解人家的组件是怎么封装的,造轮子才会更好地提高自己,所以尝试开始从封装Form表单组件开始 一:组件需求分析 本次封装组件,主要是摸索封装组件的流程,…...

企业架构LNMP学习笔记32
企业架构LB-服务器的负载均衡之LVS实现: 学习目标和内容 1)能够了解LVS的工作方式; 2)能够安装和配置LVS负载均衡; 3)能够了解LVS-NAT的配置方式; 4)能够了解LVS-DR的配置方式&…...

基于Jetty9的Geoserver配置https证书
1.环境准备 由于Geoserver自带的jetty版本不具备https模块,所以需要下载完整版本jetty。这里需要先查看本地geoserver对应的jetty版本,进入geoserver安装目录,执行如下命令。 java -jar start.jar --version Jetty Server Classpath: -----…...

企业互联网暴露面未知资产梳理
一、互联网暴露面梳理的重要性 当前,互联网新技术的产生推动着各种网络应用的蓬勃发展,网络安全威胁逐渐蔓延到各种新兴场景中,揭示着网络安全威胁不断加速泛化。当前网络存在着许多资产,这些资产关系到企业内部的安全情况&#…...

【动态规划刷题 12】等差数列划分 最长湍流子数组
139. 单词拆分 链接: 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: …...

react-redux 的使用
react-redux React Redux 是 Redux 的官方 React UI 绑定库。它使得你的 React 组件能够从 Redux store 中读取到数据,并且你可以通过dispatch actions去更新 store 中的 state 安装 npm install --save react-reduxProvider React Redux 包含一个 <Provider…...

77 # koa 中间件的应用
调用 next() 表示执行下一个中间件 const Koa require("koa");const app new Koa();app.use(async (ctx, next) > {console.log(1);next();console.log(2); });app.use(async (ctx, next) > {console.log(3);next();console.log(4); });app.use(async (ctx,…...

【css】z-index与层叠上下文
z-index属性用来设置元素的堆叠顺序,使用z-index有一个大的前提:z-index所作用元素的样式列表中必须有position属性并且属性值为absolute、relative或fixed中的一个,否则z-index无效。 层叠上下文 MDN讲解 我们给元素设置的z-index都是有一…...

系统架构设计师(第二版)学习笔记----多媒体技术
【原文链接】系统架构设计师(第二版)学习笔记----多媒体技术 文章目录 一、多媒体概述1.1 媒体的分类1.2 多媒体的特征1.3 多媒体系统的基本组成 二、多媒体系统的关键技术2.1 多媒体系统的关键技术2.2 视频技术的内容2.3 音频技术的内容2.4 数据压缩算法…...