用户自定义函数(UDF)开发与应用(二)
五、UDF 在不同平台的应用
5.1 数据库中的 UDF 应用(如 MySQL、PostgreSQL)
在数据库领域,UDF 为开发者提供了强大的扩展能力,使得数据库可以完成一些原本内置函数无法实现的复杂操作。
以 MySQL 为例,假设我们有一个电商数据库,其中有一个orders表,包含order_id(订单 ID)、customer_id(客户 ID)、order_amount(订单金额)和order_date(订单日期)等字段。现在我们需要根据订单金额和订单日期,计算每个客户的订单金额增长率,以评估客户的消费增长趋势。由于 MySQL 内置函数无法直接实现这一复杂计算,我们可以通过创建 UDF 来完成。
首先,编写一个 C 语言代码实现该 UDF,代码如下:
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
extern "C" {
// 函数声明
my_bool calculate_growth_rate_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void calculate_growth_rate_deinit(UDF_INIT *initid);
double calculate_growth_rate(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
}
// 初始化函数
my_bool calculate_growth_rate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
if (args->arg_count != 2) {
strcpy(message, "Expected 2 arguments");
return 1;
}
if (args->arg_type[0] != REAL_RESULT || args->arg_type[1] != REAL_RESULT) {
strcpy(message, "Both arguments should be numeric");
return 1;
}
return 0;
}
// 反初始化函数
void calculate_growth_rate_deinit(UDF_INIT *initid) {}
// 主计算函数
double calculate_growth_rate(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
double current_amount = *((double *)args->args[0]);
double previous_amount = *((double *)args->args[1]);
if (previous_amount == 0) {
if (current_amount == 0) {
return 0;
} else {
return 100;
}
}
return ((current_amount - previous_amount) / previous_amount) * 100;
}
然后,将上述代码编译成动态链接库文件,例如calculate_growth_rate.so 。接着,在 MySQL 中注册这个 UDF:
CREATE FUNCTION calculate_growth_rate RETURNS DOUBLE SONAME 'calculate_growth_rate.so';
最后,在 SQL 查询中使用这个 UDF:
SELECT
customer_id,
order_date,
order_amount,
calculate_growth_rate(order_amount,
-- 使用子查询获取前一个订单金额
(SELECT order_amount
FROM orders o2
WHERE o2.customer_id = o1.customer_id
AND o2.order_date < o1.order_date
ORDER BY o2.order_date DESC
LIMIT 1
)
) AS growth_rate
FROM
orders o1
ORDER BY
customer_id, order_date;
通过上述步骤,我们成功在 MySQL 中创建并使用了 UDF,实现了复杂的业务计算逻辑。
在 PostgreSQL 中,UDF 同样有着广泛的应用。例如,在一个地理信息系统(GIS)数据库中,我们可能需要对地理坐标数据进行特定的计算和转换。假设我们有一个locations表,包含location_id(位置 ID)、latitude(纬度)和longitude(经度)等字段,现在需要编写一个 UDF 来计算两个位置之间的距离(使用 Haversine 公式)。
首先,编写一个 SQL 函数实现该 UDF:
-- 定义一个函数计算两个经纬度之间的距离(单位:千米)
CREATE OR REPLACE FUNCTION calculate_distance(
lat1 double precision, lon1 double precision,
lat2 double precision, lon2 double precision
) RETURNS double precision AS $$
DECLARE
-- 地球半径(单位:千米)
earth_radius double precision := 6371.0;
dlat double precision;
dlon double precision;
a double precision;
c double precision;
BEGIN
-- 将角度转换为弧度
dlat := radians(lat2 - lat1);
dlon := radians(lon2 - lon1);
lat1 := radians(lat1);
lat2 := radians(lat2);
a := sin(dlat / 2) * sin(dlat / 2) +
sin(dlon / 2) * sin(dlon / 2) * cos(lat1) * cos(lat2);
c := 2 * atan2(sqrt(a), sqrt(1 - a));
RETURN earth_radius * c;
END;
$$ LANGUAGE plpgsql;
然后,在 SQL 查询中使用这个 UDF:
SELECT
location_id,
latitude,
longitude,
-- 计算与指定位置(39.90, 116.40)的距离
calculate_distance(latitude, longitude, 39.90, 116.40) AS distance_to_beijing
FROM
locations;
通过这个例子可以看出,在 PostgreSQL 中使用 UDF 可以方便地实现特定领域的复杂计算,拓展数据库的功能。
5.2 大数据框架中的 UDF 应用(如 Hive、Spark)
在大数据处理领域,Hive 和 Spark 是两个广泛使用的框架,UDF 在这两个框架中都发挥着重要作用。
在 Hive 中,UDF 可以用于扩展 HiveQL 的功能,以满足复杂的数据处理需求。例如,在一个电商大数据分析项目中,我们有一个包含用户行为数据的 Hive 表user_behavior,其中包含user_id(用户 ID)、behavior_type(行为类型,如点击、购买、收藏等)和behavior_time(行为时间)等字段。现在我们需要统计每个用户在一天内不同行为类型的次数,但是 Hive 内置函数无法直接实现这种复杂的统计逻辑,我们可以创建一个 UDF 来完成。
首先,使用 Java 编写一个 Hive UDF:
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import java.util.HashMap;
import java.util.Map;
public class BehaviorCountUDF extends UDF {
private Map<String, Integer> behaviorCountMap;
public BehaviorCountUDF() {
behaviorCountMap = new HashMap<>();
}
public IntWritable evaluate(Text userId, Text behaviorType, Text behaviorTime) {
// 提取日期部分
String date = behaviorTime.toString().split(" ")[0];
String key = userId.toString() + "_" + date + "_" + behaviorType.toString();
behaviorCountMap.put(key, behaviorCountMap.getOrDefault(key, 0) + 1);
return new IntWritable(behaviorCountMap.get(key));
}
}
然后,将上述代码打包成一个 JAR 文件,并上传到 Hive 环境中。接着,在 Hive 中创建临时函数来使用这个 UDF:
-- 添加JAR包到Hive环境
ADD JAR /path/to/behavior_count_udf.jar;
-- 创建临时函数
CREATE TEMPORARY FUNCTION behavior_count AS 'com.example.BehaviorCountUDF';
最后,在 HiveQL 查询中使用这个 UDF:
SELECT
user_id,
behavior_type,
behavior_time,
behavior_count(user_id, behavior_type, behavior_time) AS behavior_count
FROM
user_behavior;
通过这个 UDF,我们可以方便地统计每个用户在一天内不同行为类型的次数,满足了复杂的数据处理需求。
在 Spark 中,UDF 同样是处理复杂数据转换和计算的有力工具。例如,在一个基于 Spark 的文本分析项目中,我们有一个包含新闻文章的 DataFrame,其中包含article_id(文章 ID)和content(文章内容)等字段。现在我们需要对文章内容进行情感分析,判断每篇文章的情感倾向(正面、负面或中性),但是 Spark 内置函数无法直接完成这一任务,我们可以通过创建 UDF 来实现。
假设我们使用 NLTK(Natural Language Toolkit)库来进行情感分析,首先定义一个 Python 函数作为 UDF:
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
from nltk.sentiment import SentimentIntensityAnalyzer
# 初始化情感分析器
sia = SentimentIntensityAnalyzer()
def analyze_sentiment(content):
if content is None:
return "中性"
sentiment_scores = sia.polarity_scores(content)
compound_score = sentiment_scores['compound']
if compound_score >= 0.05:
return "正面"
elif compound_score <= -0.05:
return "负面"
else:
return "中性"
# 注册UDF
analyze_sentiment_udf = udf(analyze_sentiment, StringType())
然后,在 Spark 中使用这个 UDF 对 DataFrame 进行处理:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SentimentAnalysis").getOrCreate()
# 假设已经加载了包含文章内容的DataFrame
article_df = spark.read.csv("news_articles.csv", header=True, inferSchema=True)
# 使用UDF进行情感分析并添加新列
result_df = article_df.withColumn("sentiment", analyze_sentiment_udf(article_df["content"]))
result_df.show()
通过这个例子可以看出,在 Spark 中使用 UDF 可以轻松地将自定义的业务逻辑应用到大规模的数据处理中,实现复杂的数据转换和分析任务。无论是 Hive 还是 Spark,UDF 都为大数据处理提供了高度的灵活性和扩展性,帮助开发者解决各种复杂的业务问题。
六、UDF 的优化与调试
6.1 性能优化技巧
在 UDF 开发过程中,性能优化是一个至关重要的环节,它直接影响到整个数据处理系统的效率和响应速度。以下是一些实用的性能优化技巧:
- 减少计算量:在 UDF 内部,应尽量避免不必要的计算。例如,在处理大数据集时,如果某些计算结果在多次调用 UDF 时不会发生变化,可以将这些计算提前到 UDF 外部进行,然后将结果作为参数传递给 UDF。以一个计算订单折扣的 UDF 为例,如果折扣率在一段时间内是固定的,就不需要在每次调用 UDF 时都重新计算折扣率,而是将其作为常量参数传递进去 。
- 合理使用数据结构:选择合适的数据结构可以显著提高 UDF 的性能。例如,在需要频繁查找元素的场景下,使用哈希表(如 Python 中的dict,Java 中的HashMap)可以将查找时间复杂度从线性级别降低到常数级别。假设我们有一个 UDF 需要根据客户 ID 查找客户的相关信息,如果使用列表来存储客户信息,每次查找都需要遍历整个列表,时间复杂度为 O (n);而使用哈希表,通过客户 ID 作为键,可以快速定位到对应的客户信息,时间复杂度为 O (1)。
- 避免重复操作:在 UDF 中,要注意避免重复执行相同的操作。例如,在处理字符串时,如果需要多次对同一个字符串进行相同的转换操作,可以将转换后的结果缓存起来,避免重复转换。比如,在一个对文本进行预处理的 UDF 中,需要将文本中的所有单词转换为小写形式,如果每次处理一个单词都进行一次转换,效率会很低。可以先将整个文本按单词分割成列表,然后一次性对列表中的所有单词进行小写转换,再进行后续处理。
- 使用高效算法:选择高效的算法是提升 UDF 性能的关键。例如,在进行排序操作时,快速排序、归并排序等高效排序算法的时间复杂度明显低于冒泡排序等简单排序算法。假设我们有一个 UDF 需要对一组数字进行排序,如果使用冒泡排序,时间复杂度为 O (n²),对于大规模数据处理效率较低;而使用快速排序,平均时间复杂度为 O (n log n),可以大大提高排序效率。
6.2 调试方法与工具
在 UDF 开发过程中,难免会遇到各种问题,这时就需要使用有效的调试方法和工具来快速定位和解决问题。以下是一些常用的调试方法和工具:
- 打印调试信息:这是最基本也是最常用的调试方法。在 UDF 代码中适当的位置添加打印语句,输出关键变量的值和程序执行的中间结果,通过观察这些输出信息来判断程序的执行逻辑是否正确。例如,在 Python 中,可以使用print()函数;在 Java 中,可以使用System.out.println()方法。以一个简单的 Python UDF 为例:
def add_numbers(a, b):
result = a + b
print(f"a的值为: {a}, b的值为: {b}, 相加结果为: {result}")
return result
add_numbers(3, 5)
- 断点调试:使用集成开发环境(IDE)的断点调试功能,可以让程序在指定的代码行暂停执行,以便观察变量的值、执行流程等。在 Python 的 PyCharm 中,只需在代码行号旁边点击即可设置断点,然后通过调试模式运行程序,程序会在断点处暂停,此时可以查看变量的值、单步执行代码等;在 Java 的 Eclipse 中,同样可以通过设置断点,使用调试透视图来进行调试操作。
- 日志记录:对于一些在生产环境中运行的 UDF,使用日志记录可以更好地跟踪程序的执行情况。可以使用日志库(如 Python 的logging库,Java 的log4j库)将 UDF 的执行信息、错误信息等记录到日志文件中,方便后续分析和排查问题。以 Python 的logging库为例:
import logging
# 配置日志记录
logging.basicConfig(filename='udf.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def divide_numbers(a, b):
try:
result = a / b
logging.info(f"成功计算 {a} / {b} 的结果为: {result}")
return result
except ZeroDivisionError as e:
logging.error(f"发生错误: {e}")
divide_numbers(10, 0)
- 单元测试:编写单元测试用例是确保 UDF 正确性的重要手段。通过对 UDF 的各种输入情况进行测试,可以发现潜在的问题。在 Python 中,可以使用unittest模块或pytest框架来编写单元测试;在 Java 中,可以使用JUnit框架。以 Python 的unittest模块为例:
import unittest
def multiply_numbers(a, b):
return a * b
class TestUDF(unittest.TestCase):
def test_multiply_numbers(self):
result = multiply_numbers(3, 4)
self.assertEqual(result, 12)
if __name__ == '__main__':
unittest.main()
通过这些调试方法和工具的综合使用,可以有效地提高 UDF 开发的效率和质量,确保 UDF 能够正确、高效地运行。
七、总结与展望
7.1 总结 UDF 开发与应用的要点
回顾本文内容,我们深入探索了用户自定义函数(UDF)开发与应用的关键知识点。从 UDF 的定义、与内置函数的区别以及广泛的应用场景,到开发基础,包括环境搭建、语法基础和数据类型处理,再到实战案例展示以及在不同平台的应用,最后探讨了优化与调试的方法。
UDF 的强大之处在于它赋予开发者根据特定业务需求定制功能的能力,极大地提高了代码的复用性、灵活性和可扩展性。在开发 UDF 时,我们需要熟练掌握编程语言的语法和特性,正确处理各种数据类型,同时要注意代码的结构和逻辑,确保函数的正确性和可读性。在不同平台应用 UDF 时,要了解各平台的特点和限制,遵循相应的开发规范和流程。性能优化和调试也是 UDF 开发过程中不可或缺的环节,通过合理的优化技巧和有效的调试方法,可以提高 UDF 的执行效率和稳定性,减少潜在的错误和问题。
7.2 展望 UDF 的未来发展
随着数据量的不断增长和业务需求的日益复杂,UDF 的未来发展前景十分广阔。在数据库领域,UDF 将继续朝着支持更多编程语言、提供更强大的功能和更高的性能方向发展。例如,未来的数据库系统可能会原生支持更多流行的编程语言,如 Python、R 等,使得开发者可以更加方便地使用熟悉的语言编写 UDF,进一步拓展数据库的功能边界。同时,数据库会不断优化 UDF 的执行引擎,提高 UDF 的执行效率,使其能够更好地处理大规模数据和复杂业务逻辑。
在大数据框架方面,UDF 也将不断演进以适应新的技术趋势和业务需求。随着人工智能和机器学习技术在大数据领域的广泛应用,UDF 有望与这些技术深度融合。例如,开发者可以利用 UDF 在大数据框架中实现自定义的机器学习算法和模型,对海量数据进行实时的分析和预测。此外,随着云原生技术的兴起,大数据框架将更加注重云原生支持,UDF 也需要适应这一趋势,具备更好的可扩展性和弹性,能够在云环境中高效运行。
对于广大开发者而言,UDF 是提升数据处理和编程能力的有力工具。希望读者能够继续深入探索 UDF 的应用,不断积累经验,将 UDF 灵活运用到实际项目中,解决更多复杂的业务问题,创造更大的价值。相信在未来,UDF 将在各个领域发挥更加重要的作用,为数据处理和编程带来更多的创新和突破。
相关文章:
用户自定义函数(UDF)开发与应用(二)
五、UDF 在不同平台的应用 5.1 数据库中的 UDF 应用(如 MySQL、PostgreSQL) 在数据库领域,UDF 为开发者提供了强大的扩展能力,使得数据库可以完成一些原本内置函数无法实现的复杂操作。 以 MySQL 为例,假设我们有一…...
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...
Tkinter样式与主题定制
在创建图形用户界面(GUI)应用时,除了功能的实现外,界面的外观和用户体验也非常重要。Tkinter提供了多种方式来定制控件的样式,使应用程序界面更加美观和易用。在这一章中,我们将介绍如何使用Tkinter的样式和…...
CSS 背景属性学习笔记
CSS 背景属性用于定义 HTML 元素的背景效果,包括背景颜色、背景图像、图像平铺方式、图像定位以及图像是否固定等。以下是关于 CSS 背景属性的详细学习笔记。 一、背景颜色(background-color) background-color 属性用于定义元素的背景颜色…...
信息安全管理与评估2023广东省样题答案截图视频
2023年广东省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 一、 赛项时间 9:00-13:30,共计4小时30分,含赛题发放、收卷时间。 二、 赛项内容 本次大赛,各位选手需要完成三个阶段的任务,其中第一个阶段需要…...
ubuntu学习day1
linux常用命令 1. 用户相关 1.1 切换用户 su root #切换到root用户 su user #切换到普通用户sudo能赋予普通用户管理者权限,一般不要直接使用root用户进行操作。 1.2 添加用户 useradd 用户名 useradd user1 #添加了用户名为user1的用户但在ubuntu中想要创建普…...
ubuntu22.04-VMware Workstation移动后无法连接网络
1.VMware 中查看NAT模式 2.查看宿主机VMnet8的IP地址 虚拟机里设置成192.168.20.160 , 255.255.255.0, 192.168.20.2 在ubuntu系统中设置如下: 至此可以连上了。...
如何评估大模型的性能?有哪些常用的评估指标?
评估大模型(如大语言模型 LLM)的性能是一个多维度的问题,常常需要结合多个指标从不同角度来考察模型的能力。以下是常见的评估方法和指标: 一、通用评估维度 任务性能(Task Performance) 衡量模型在特定任务上的表现,如问答、翻译、总结等。 语言能力(Linguistic Capa…...
Linux驱动开发-网络设备驱动
Linux驱动开发-网络设备驱动 一,网络设备总体结构1.1 总体架构1.2 NAPI数据处理机制 二,RMII和MDIO2.1 RMII接口2.2 MDIO接口 三,MAC和PHY模块3.1 MAC模块3.2 PHY模块 四,网络模型4.1 网络的OSI和TCP/IP分层模型4.1.1 传输层&…...
CTF web入门之文件包含
web78: include函数执行file引入的文件,如果执行不成功,就高亮显示当前页面的源码。 方法一:filter伪协议 file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/readc…...
error: failed to run custom build command for `yeslogic-fontconfig-sys v6.0.0`
rust使用plotters时遇到编译错误。 一、错误 error: failed to run custom build command for yeslogic-fontconfig-sys v6.0.0 二、解决方法 我用的是opensuse,使用下面命令可以解决问题。 sudo zypper in fontconfig-devel...
低资源需求的大模型训练项目---调研0.5B大语言模型
一、主流0.5B大语言模型及性能对比 1. Qwen系列(阿里) • Qwen2.5-0.5B:阿里2024年9月开源的通义千问系列最小尺寸模型,支持32K上下文长度和8K生成长度。在中文场景下表现优异,指令跟踪、JSON结构化输出能力突出&…...
信息安全管理与评估广东省2023省赛正式赛题
任务1:网络平台搭建(60分) 题号 网络需求 1 根据网络拓扑图所示,按照IP地址参数表,对DCFW的名称、各接口IP地址进行配置。(10分) 2 根据网络拓扑图所示,按照IP地址参数表,对DCRS的名称进…...
LeetCode.225. 用队列实现栈
用队列实现栈 题目解题思路1. push2. pop3. empty CodeQueue.hQueue.cStack.c 题目 225. 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现…...
CTF--bp
一、原题: (1)提示:弱密码top1000?z????? (2)原网页: 二、步骤: 1.先打开BP,随便输入一个密码: 2.打开BP,发现password&#…...
01_背包问题
package org.josh; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 物品数量 long w scanner.nextLong(); // 背包容量,使用long防止溢出 int[] v …...
ps 人像学习
视频: 一ps快捷键 1.1 创建图层 ctrlj 1.2 放大缩小图片的大小 按住alt 滚轮 1.3 移动图片 空格 左键 1.4 撤回 ctrlz 二 精修的第一步是去除斑点,瑕疵, 2.1 污点修复画笔工具 新建一个图层,点击污点修复工具进行修复…...
【AI论文】MM-IFEngine:迈向多模态指令遵循
摘要:指令遵循(IF)能力衡量多模态大语言模型(MLLM)准确理解用户告诉他们的内容以及他们是否做得正确的能力。 现有的多模态指令训练数据很少,基准测试简单,指令原子化,对于要求精确输…...
【C++初学】课后作业汇总复习(五) 单目运算符重载
本题主要考察-构造函数的定义和操作符重载、友元函数等 根据后缀和程序样例输出,完成分数类和相关函数的定义, 输入: -6 12 8 -16 输出: 1/2 1/1 -1/2 / -1/2 - -1/2 0/1 输入: 3 7 2 6 输出: 1/…...
Python基础语法速通(自用笔记)
目录 # 输出直接print就行了 # 次方,除法,取整 # 定义变量直接写就可以,不用写类型 # 基础的while不用写()和{},直接用冒号即可,缩进对齐 # 这里的for循环直接用in就可以,意思是从...中一个…...
Nginx基础讲解
Nginx基础讲解 Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,广泛用于负载均衡、静态资源托管、SSL 终端等场景。以下是对 Nginx 的详细讲解: 1. Nginx 核心概念 事件驱动架构:基于异步非阻塞模型,高效处理高并发连接…...
K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战
系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…...
组件安全工程化革命:从防御体系构建到安全基因重塑
文章目录 总起:数字世界的钢铁长城 分论: 一、组件生态的"七宗罪"与安全基因重组 二、百万级流量下的安全工程化实战 三、性能与安全的共生进化论 四、安全工程化全链路解决方案 总束:安全基因驱动的未来图景 五、时代思考…...
(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载
源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP,…...
发送加密信息的简单实现【Java】
(修改期) 一、代码的引用处 public static SecretKeys generateKeys() throws NoSuchAlgorithmException {: 定义一个公共静态方法,用于生成 AES 和 HMAC 密钥对。 public static String encrypt(String plaintext, SecretKey aesKey, S…...
阿里云域名解析
一、打开域名控制台 PC端浏览器打开阿里云域名控制台:域名控制台,点击"域名解析"。 二、添加解析设置 选择需要解析的域名,点击"解析设置"。 点击"添加记录"。 添加@和www即可。...
DNS域名解析服务(正向 反向 主从)
DNS 1.分散式管理: Hosts文件 一改百度就不会访问了 Ip地址 域名 121.226.246.3 www.jd.com 2.我们会搭建一台 域名解析服务器全世界得域名全靠这台服务器进行解析 中央集权制 域名是由多个部分组成的 www.baidu.com .baidu .com是域…...
ROS2---std_msgs基础消息包
std_msgs 是ROS 2(Robot Operating System 2)里的基础消息包,它定义了一系列简单却常用的消息类型,为不同节点间的通信提供了基础的数据格式。 1. 消息包概述 std_msgs 包包含了多种基础消息类型,这些类型用于表示常…...
python基础:数据类型转换、运算符(算术运算符、比较运算符、逻辑运算符、三元运算符、位运算符)
目录 一、类型转换 隐式类型转换/自动转换: 显示类型转换/强制转换: 二、运算符 算数运算符: - * / 比较运算符 逻辑/布尔运算符 赋值运算符: 三元运算符 位运算符 [二进制] 运算符优先级 一、类型转换 python变量的类…...
[特殊字符] 终端效率提升指南:zsh + tmux
在日常开发中,一个舒适、高效的终端环境能显著提升工作效率。本文将介绍如何通过配置 oh-my-zsh 和 tmux 打造一个功能强大、便捷实用的终端工具集。无论你是 Linux 新手,还是资深开发者,都能从中获得实用的提升技巧。 🌀 一、终…...
【Linux篇】深入理解文件系统:从基础概念到 ext2 文件系统的应用与解析
文件系统的魔法:让计算机理解并存储你的数据 一. 文件系统1.1 块1.2 分区1.3 inode(索引节点) 二. ext2文件系统2.1 认识文件系统2.2 Block Group (块组)2.2.1 Block Group 的基本概念2.2.2 Block Group 的作用 2.3 块组内部结构2.3.1 超级块(Super Bloc…...
MarkDown 输出表格的方法
MarkDown用来输出表格很简单,比Word手搓表格简单多了,而且方便修改。 MarkDown代码: |A|B|C|D| |:-|-:|:-:|-| |1|b|c|d| |2|b|c|d| |3|b|c|d| |4|b|c|d| |5|b|c|d|显示效果: ABCD1bcd2bcd3bcd4bcd5bcd A列强制左对齐…...
DOM解析XML:Java程序员的“乐高积木式“数据搭建
各位代码建筑师们!今天我们要玩一个把XML变成内存乐高城堡的游戏——DOM解析!和SAX那种"边看监控边破案"的刺激不同,DOM就像把整个乐高说明书一次性倒进大脑,然后慢慢拼装(内存:你不要过来啊&…...
Python 数组里找出子超集
碰见一个问题,有一个大数组,如下所示: xx [[1, 3, 4], [3, 4, 5], [1, 2, 3, 4, 5], [6], [7, 8], [6, 7, 8]]大数组里面有好多小的数组,观察发现,小的数组其实有挺多别的小数组的子集,现在问题来了&…...
上层 Makefile 控制下层 Makefile ---- 第二部分(补充一些例子与细节)
1. 递归调用子目录 Makefile 通过 $(MAKE) -C 进入子目录并执行其 Makefile,这是最常见的分层构建方法。 示例:基本递归调用 目录结构: project/ ├── Makefile # 顶层 Makefile ├── lib/ │ ├── Makefile # 子目录…...
LeetCode算法题(Go语言实现)_44
题目 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份是一组直接或间接相连的城市,组内不含其他没有相连的城市。 给你…...
STM32 HAL库之USART示例代码
串口发送和接收以及回调函数都可在这个文件中查询:stm32f1xx_hal_uart.h 串口配置初始化代码main.c中:MX_USART1_UART_Init();,初始化 UART 高层参数(波特率、数据位、停止位、校验、模式等) void MX_USART1_UART_In…...
头歌educoder——数据库 第10-11章
第10章 1、 事务的( )特性要求事务必须被视为一个不可分割的最小工作单元 A、 原子性 B、 一致性 C、 隔离性 D、 持久性 2、 事务的( )特性要求一个事务在执行时,不会受到其他事务的影响。 A、 原子性 B、 一致性 C…...
从 Vue 到 React:深入理解 useState 的异步更新与函数式写法
目录 从 Vue 到 React:深入理解 useState 的异步更新与函数式写法1. Vue 的响应式回顾:每次赋值立即生效2. React 的状态更新是异步且批量的原因解析 3. 函数式更新:唯一的正确写法4. 对比 Vue vs React 状态更新5. React useState 的核心源码…...
如何实现元素随滚动平滑上升
#技术栈Vue3TypeScript# 相比大家没少见过这个的效果: 作为视觉效果是很不错的 同时实现也很简单,本质是封装一个Vue指令 1,创建指令文件 src / directives / vSlidenIn.ts import type { Directive } from vueconst vSlideIn: Directive …...
Nginx部署spa单页面的小bug
没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…...
关于全球化大规模混合云 Kubernetes Prometheus 监控体系标准化及 GitOps 自动化改进方案
背景 现状 某司概况: PaaS/SaaS 公司,业务面向全球,包括 东南亚/南亚/中东/欧洲/非洲/美洲/东亚…生产 k8s 集群数十套,生产非生产 >100 套(多种集群类型,各种公有云/专有云/私有云/数据中心…)疫情以来ÿ…...
力扣DAY51 | 热100 | 岛屿数量
前言 中等 √ 做得我元气大伤,超级naive方法,新开辟一个数组存岛屿编号,一个数组存岛屿上的点。 题目 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 …...
二叉树的最近公共祖先二叉搜索树的最近公共祖先
1 二叉树的最近公共祖先 学习: 代码 class Solution:def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:if root is None or root is p or root is q:return rootleft self.lowestCommonAncestor(root.left,p,q)right …...
关于 LLB 的问题
This error occurs when you’re trying to run a program or library that was compiled with GLIBC (GNU C Library) version 2.29, but your system has an older version of GLIBC installed. Solutions: 1. Upgrade your system’s GLIBC (Recommended if possible) Fo…...
kafka4.0浅尝辄止
最近工作中接触消息队列比较多,前几周又看到kafka4.0发布,故写一篇博客对消息队列做一个复盘。 目录 消息队列对比1. Apache Kafka 4.02. RabbitMQ3. RocketMQ4. ActiveMQ5. Apache Pulsar6. NSQ kafka4.0鲜明的新特性Java 版本要求升级API 更新与精简移…...
nmcli创建wpa-psk2 wifi热点
1. 创建新的WiFi连接: sudo nmcli connection add type wifi ifname wlan0 con-name WiFi名称 autoconnect yes ssid WiFi名称 2. 配置接入点模式和IP共享: sudo nmcli connection modify WiFi名称 802-11-wireless.mode ap 802-11-wireless.band …...
分布式日志治理:Log4j2自定义Appender写日志到RocketMQ
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【STM32单片机】#8 定时器编码器接口ADC模数转换器
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...
dify部署,ollama部署,拉取模型,创建ai聊天应用
dify下载安装 dify1.0.1 windos安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.zip 链接: 百度网盘 请输入提取码 提取码: 1234 dify安装包 linux安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.tar.gz 链接: 百度网盘 请输入提取码 提取码…...