流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗

1.1 数量滚动窗口

0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)

1.1.1 代码分析

Tumbling Count Windows是指按元素个数计数的滚动窗口。
滚动窗口是指没有元素重叠的窗口。
(1)构造了一个KeyedStream,用于存储word_count_data中的数据。

word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])

我们并没有让Source是流的形式,是因为为了降低例子复杂度。但是我们将runntime mode设置为流(STREAMING)模式。

(2)定义一个Reduce类,用于对元组中的数据进行计算。
这个类需要继承于WindowFunction,并实现相应方法(本例中是apply)。
apply会计算一个相同key的元素个数。

class SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]

(3)keyed_stream.count_window(2)将此keyyedstream窗口转换为滚动计数窗口或滑动计数窗口。

out_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(2).apply(SumWindowFunction(), out_type_info))

1.1.2 整体代码

from typing import Iterable
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import CountWindowclass SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(4).apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

1.1.3 结果

(1)window=1,
A的个数是3,被3个窗口承载
B的个数是1,被1个窗口承载
在这里插入图片描述

(2)window=2
A的个数是3,但是会产生两个窗口,第一个窗口承载了前两个元素,第二个窗口当前只有一个元素。于是第一个窗口进行了Reduce计算,得出一个(A,2);第二个窗口还没进行reduce计算,就没有展现出结果;
B的个数是1,被1个窗口承载,只有一个元素,还没进行reduce计算,没有展示结果。
在这里插入图片描述
(3)window=3
A的个数是3,被1个窗口承载,有3个元素;
B的个数是1,被1个窗口承载,只有一个元素,还没进行reduce计算,没有展示结果。
在这里插入图片描述
(4)window=4
A的个数是3,被1个窗口承载,只有3个元素,还没进行reduce计算,没有展示结果。
B的个数是1,被1个窗口承载,只有1个元素,还没进行reduce计算,没有展示结果。
输出空

1.2 数量滑动窗口

0基础学习PyFlink——个数滑动窗口(Sliding Count Windows)

1.2.1 整体代码

“滑动”是指这个窗口沿着一定的方向,按着一定的速度“滑行”。
滚动窗口,则是一个个“衔接着”,而不是像上面那样交错着。
它们的相同之处就是:只有窗口内的事件数量到达窗口要求的数值时,这些窗口才会触发计算。

from typing import Iterable
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import CountWindowclass SumWindowFunction(WindowFunction[tuple, tuple, str, CountWindow]):def apply(self, key: str, window: CountWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream.count_window(2,1).apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

1.2.2 结果

(1)window=1,slide=1
在这里插入图片描述

(2)window=2,slide=1
在这里插入图片描述
(3)window=1,slide=2
在这里插入图片描述

2 时间窗

2.1 时间滚动窗口(处理时间)

参考0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)
对于数量滚动窗口,如果窗口内元素数量没有达到窗口大小时,计算个数的函数是不会被调用的。
如果想让不满足数量的窗口,也执行计算,就可以使用时间滚动窗口。
它不依赖于窗口中元素的个数,而是窗口的时间,即窗口时间到了,计算就会进行。

2.1.1 代码分析

(1)构造了一个KeyedStream,用于存储word_count_data中的数据。

word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])

我们并没有让Source是流的形式,是因为为了降低例子复杂度。但是我们将runntime mode设置为流(STREAMING)模式。

(2)定义一个Reduce类,用于对元组中的数据进行计算。
这个类需要继承于WindowFunction,并实现相应方法(本例中是apply)。
apply会计算一个相同key的元素个数。

class SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]

(3)这儿我们的Window使用的是滚动时间窗口(处理时间),其中参数Time.milliseconds(2)是指窗口时长,即2毫秒一个窗口。

 # reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(TumblingProcessingTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()

2.1.2 整体代码

from typing import Iterable
from pyflink.common import Types, Time
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow, TumblingProcessingTimeWindowsclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(TumblingProcessingTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.1.3 结果

运行多次代码可以得到不同的结果。
可以发现结果并不稳定。但是可以发现,每个元素都参与了计算,而不像数量滚动窗口那样部分数据没有被触发计算。
这是因为每次运行时,CPU等系统资源的繁忙程度是不一样的,这就影响了最后的运行结果。
(1)第一次运行
在这里插入图片描述
(2)第二次运行
在这里插入图片描述
(3)第三次运行
在这里插入图片描述

2.2 时间滑动窗口(处理时间)

0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

2.2.1 整体代码

from typing import Iterable
from pyflink.common import Types, Time
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow, SlidingProcessingTimeWindowsclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]word_count_data = [("A",), ("A", ), ("B", ), ("A",), ("A", ), ("B", ), ("A",)]def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING()])# 从列表生成source,指定列表中每个元素的类型source = env.from_collection(word_count_data, source_type_info)# 按键分组keyed_stream = source.key_by(lambda i: i[0])# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (keyed_stream\.window(SlidingProcessingTimeWindows.of(Time.milliseconds(2),Time.milliseconds(1)))\.apply(SumWindowFunction(), out_type_info))# define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.2.2 结果

运行两次上述代码,我们发现每次都不同,而且有重叠计算的元素。
(1)第一次运行
A:9,B:3
在这里插入图片描述
(2)第二次运行
A:7,B:3
在这里插入图片描述

4.3 时间滚动窗口(事件时间)

0基础学习PyFlink——事件时间和运行时间的窗口
使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间,得到的结果是不稳定的。
这是因为每次运行时,CPU等系统资源的繁忙程度是不一样的,这就影响了最后的运行结果。
为了让结果稳定,我们可以不依赖运行时间(ProcessingTime),而使用不依赖于运行环境,只依赖于数据的事件时间(EventTime)。

一般,我们需要大数据处理的数据,往往存在一个字段用于标志该条数据的“顺序”。
这个信息可以是单调递增的ID,也可以是不唯一的时间戳,我们可以将这类信息看做事件发生的时间。

那如何让输入的数据中的“事件时间”参与到窗口时长的计算中呢?这儿就要引入时间戳和Watermark(水位线)的概念
假如我们把数据看成一张纸上的内容,水位线则是这张纸的背景。它并不影响纸上内容的表达,只是系统要用它来做更多的事情。
将数据中表达“顺序”的数据转换成时间戳,我们可以使用水位线单调递增时间戳分配器

2.3.1 代码分析

(1)构造了一个Stream,用于存储word_count_data中的数据。

word_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.101"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)

(2)定制策略

class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_ms
# 定义水位线策略
watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())

for_monotonous_timestamps会分配一个水位线单调递增时间戳分配器,然后使用with_timestamp_assigner告知输入数据中“顺序”字段的值。这样系统就会根据这个字段的值生成一个单调递增的时间戳。这个时间戳相对顺序就和输入数据一样,是稳定的。
(3)运行策略
然后对原始数据使用该策略,这样source_with_wartermarks中的数据就包含了时间戳。

# 对原始数据使用该策略
source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)

(4)使用TumblingEventTimeWindows,即事件时间(EventTime)窗口,而不是运行时间(ProcessingTime)窗口。

# reducing
out_type_info = Types.TUPLE([Types.STRING(), Types.INT()])
reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sink
reduced.print()# submit for execution
env.execute()

2.3.2 整体代码

from typing import Iterable
from pyflink.common import Types, Time, WatermarkStrategy
from pyflink.common.watermark_strategy import TimestampAssigner
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow,  TumblingEventTimeWindows
import datetimeclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_msword_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.110"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)# 定义水位线策略watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())# 对原始数据使用该策略source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.3.3 结果

数据乱序也没关系,会自动排序。
在这里插入图片描述

在这里插入图片描述

2.4 时间滑动窗口(事件时间)

2.4.1 整体代码

from typing import Iterable
from pyflink.common import Types, Time, WatermarkStrategy
from pyflink.common.watermark_strategy import TimestampAssigner
from pyflink.datastream import StreamExecutionEnvironment, RuntimeExecutionMode, WindowFunction
from pyflink.datastream.window import TimeWindow,  SlidingEventTimeWindows
import datetimeclass SumWindowFunction(WindowFunction[tuple, tuple, str, TimeWindow]):def apply(self, key: str, window: TimeWindow, inputs: Iterable[tuple]):print(inputs, window)return [(key, len(inputs))]class ElementTimestampAssigner(TimestampAssigner):def extract_timestamp(self, value, record_timestamp)-> int:time_str = value[1]dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")ts_s = dt.timestamp()  # 时间戳,单位秒ts_ms = int(ts_s * 1000)  # 时间戳,单位毫秒return ts_msword_count_data = [("A","2024-06-04 08:10:11.100"),("A", "2024-06-04 08:10:11.110"),("B", "2024-06-04 08:10:11.102"),("A","2024-06-04 08:10:11.103")]
def word_count():env = StreamExecutionEnvironment.get_execution_environment()env.set_runtime_mode(RuntimeExecutionMode.STREAMING)env.set_parallelism(1)  # 将所有数据写到一个文件source_type_info = Types.TUPLE([Types.STRING(),Types.STRING()])source = env.from_collection(word_count_data, source_type_info)# 定义水位线策略watermark_strategy = WatermarkStrategy.for_monotonous_timestamps() \.with_timestamp_assigner(ElementTimestampAssigner())# 对原始数据使用该策略source_with_wartermarks = source.assign_timestamps_and_watermarks(watermark_strategy)# reducingout_type_info = Types.TUPLE([Types.STRING(), Types.INT()])reduced = (source_with_wartermarks.key_by(lambda i: i[0])\.window(SlidingEventTimeWindows.of(Time.milliseconds(4),Time.milliseconds(2)))\.apply(SumWindowFunction(), out_type_info))# # define the sinkreduced.print()# submit for executionenv.execute()if __name__ == '__main__':word_count()

2.4.2 结果

在这里插入图片描述

3 pyflink中文乱码的问题

pyflink遇到的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了,也能够执行代码了,但是代码错了该如何调试呢?Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序: 但是我们尝试…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性,使得编写和维护汇编程序更加方便;在 MASM(Microsoft Macro Assembler)中,宏的定义和使用非常常见。以下是对汇编语…

java面试题:springMVC的执行流程

请求到达前端控制器DispatcherServlet,该组件是SpringMVC的核心组件,负责接收所有的请求。 DispatcherServlet根据请求中的URL和HandlerMapping找到对应的Controller对象,HandlerMapping是一个接口,定义了请求的URL和对应的Contro…

【linux网络(三)】HTTP协议详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux网络 1. 前言2. 序列化和…

定个小目标之刷LeetCode热题(16)

针对本题排序流程,主要是将链表拆分为长度为subLength的子链表1和子链表2,然后把子链表1和子链表2合并为一条有序链表,重复上述步骤直到把链表都拆分完,这样这条链表每段长度为2的子链表都是有序的,那么要整条链表有序…

学习ZYNQ——HLS

文章目录 前言一、HLS是什么?二、HLS开发流程三、HLS工程创建四、代码编写1.led.h2.led.cpp3.test_led.cpp 五、C仿真与C综合六、联合仿真七、添加ap_int.h八、再次进行C仿真的Cosimulation九、导出IP核的时候出现报错: 前言 本文主要记录自己学习HLS的…

JavaScript-DOM

DOM 全称:DOM(Document Object Model--文档对象类型) 作用:用来操控网页类容的功能,开发网页特效和实现用户交互 DOM 结构 将HTML文档以树形结构表现出来称之为DOM树 获取DOM 语法:document.querySelector(css选择器) 参数&…

AIGC实践|用AI制作视频短片创作全流程

前言: 在深入探讨了AI在动态有声绘本和小游戏开发的应用之后,本次我们将聚焦于视频创作领域。本篇文章将详细展示如何使用AI工具从概念构思到画面生成再到最终成片的全过程,涵盖剧本创作、分镜头设计、视觉效果生成及音乐配制等各个阶段。让…

B+索引的分裂及选择率和索引基数

1、B树索引的分裂 B树索引页的分裂并不总是从页的中间记录开始,这样可能会导致页空间的浪费。 例子 比如下面这个记录: 1、2、3、4、5、6、7、8、9 由于插入是以自增的顺序进行的,若这时插入第10条记录然后进行页的分裂操作,那…

鹧鸪云光伏业务管理系统,助力企业数智化发展

在当今数字化浪潮席卷全球的背景下,光伏行业作为绿色能源的重要组成部分,其业务管理的数智化转型显得尤为重要。鹧鸪云光伏业务管理系统,以其强大的功能和卓越的性能,正成为企业实现数智化转型的重要助力。 作为光伏行业的领军软…

Spring Boot:Java 应用开发高效之道

Spring Boot 是一种革命性的框架,旨在简化 Java 应用的创建和部署过程。通过自动化配置和简化项目搭建流程,Spring Boot 大大加速了开发周期,让 Java 应用开发变得更加高效和便捷。 核心优势: 快速启动和简化配置:Spr…

redis 笔记2之哨兵

文章目录 一、哨兵1.1 简介1.2 实操1.2.1 sentinel.conf1.2.2 问题1.2.3 哨兵执行流程和选举原理1.2.4 使用建议 一、哨兵 1.1 简介 上篇说了复制,有个缺点就是主机宕机之后,从机只会原地待命,并不能升级为主机,这就不能保证对外…

【python】docker-selenium 分布式selenium模拟浏览器 |可视化 或 后台运行selenium 部署与使用

一、分布式selenium 1、部署 docker-selenium Github官方地址如下: https://github.com/SeleniumHQ/docker-selenium?tabreadme-ov-file 执行安装指令: 1、这里可以将dashboard映射接口改为 14444(记得开放安全组) docker run …

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoia/&a…

细说ARM MCU的串口发送数据的实现过程

目录 1、条件及工程配置 2、实现串口发送的库函数 3、修改whlie(1)中的代码 4、修改回调函数 5、下载运行 前面的文章介绍了用串口的接收中断来接收数据,本文介绍通过串口从MCU向外发送数据。 1、条件及工程配置 文章依赖的硬件及工程配置同本文作者的其他文…

【Unity】Inspector排版扩展学习初探

一、简单的Unity Inspector扩展 [SerializeField] [SerializeField] 作用:让private属性也可以显示在面板上 [Range(x , y)] [Range(x , y)] 作用: 让参数从输入框变为范围滑条 [Header(" 标题 ")] [Header(" 标题 ")]作用&am…

GPT-4o更容易越狱?北航南洋理工上万次测试给出详细分析

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践,基于大语言模型和RAG技术,集合海量工业领域生态资源方优质产品和知识服务,旨在通过智能搜索、连续交互,实时生成个性化的内容…

CentOS7下快速升级至OpenSSH9.7p2安全版本

一、CentOS7服务器上编译生成OpenSSH9.3p2的RPM包 1、编译打包的shell脚本来源于该项目 https://github.com/boypt/openssh-rpms解压zip项目包 unzip openssh-rpms-main.zip -d /opt cd /opt/openssh-rpms-main/ vim pullsrc.sh 修改第23行为source ./version.env 2、sh pull…

比较市场上14款最佳的看板工具软件

文章对比了14款看板工具软件:PingCode、Worktile、Trello、Asana、Teambition、Monday、ClickUp、Wrike、Jira、Kanban Tool、MeisterTask、Teamhood、Leankit by Planview、ZenHub。 看板工具以其直观的设计和灵活性,成为团队协作和项目跟踪的首选。通过…

【阅读论文】-- LiveRAC:系统管理时序数据的交互式可视化探索

LiveRAC:系统管理时序数据的交互式可视化探索 摘要引言相关工作系统管理角色和活动当前工具的局限性 迭代设计方法参加者设计阶段 设计要求可视化解决方案设计原则LiveRAC 接口执行 纵向评价非正式纵向研究方法对设计的影响使用场景 结论致谢参考文献 摘要 我们介绍…