leetcode_811. 子域名访问计数

题目链接:https://leetcode.cn/problems/subdomain-visit-count/description/ 涉及知识点:库函数atoi,库函数strstr,库函数strchr,库函数sprintf,UT_hash 解法一:自己构造结构体 #define LEN 100 typedef struct { char str[LEN]; int cnt; } MARK_S; char ** subdomainVisits(char ** cpdomains, int cpdomainsSize, int* returnSize){ int i ,j; MARK_S mark[300] = {0}; char temp[LEN]; int mark_size = 0; for (i = 0; i < cpdomainsSize; i++) { char *p = strstr(cpdomains[i], " "); int space_index = p - cpdomains[i]; char rep[LEN] = {0}; memcpy(rep, cpdomains[i], sizeof(char) * space_index); int count = atoi(rep); strcpy(temp, cpdomains[i] + space_index + 1); for (j = 0; j < mark_size; j++) { if (strcmp(mark[j].

Elasticsearch父子关联

目录 1、Elasticsearch父子关联简介 2、使用对象数组存在的问题 3、嵌套对象 3.1、在索引中使用嵌套对象 3.2、嵌套对象的搜索 3.3、嵌套对象的聚集 3.3.1、嵌套聚集 3.3.2、反转嵌套聚集 4、join字段 4.1、在索引中使用join字段 4.2、join字段的搜索 4.2.1、以父搜子 4.2.2、以子搜父 4.2.3、父文档主键搜索 4.3、join字段的聚集 4.3.1、children聚集 4.3.2、parent聚集 5、在应用层关联数据 6、小结 1、Elasticsearch父子关联简介 在使用关系数据库进行开发的过程中,你可能会经常使用外键来表示父表和子表之间的关联关系,在Elasticsearch中,有哪些方法可以用来让开发者解决索引之间一对多和多对多的关联关系的问题呢?由于多对多的关联可以转换为两个一对多的关联来处理,所以这篇文章将主要探讨在Elasticsearch中解决索引之间一对多父子关联的方法。 在列举一对多的关系实例时,会以一个作者包含多本书籍的数据为例,来说明Elasticsearch支持的几种不同方式在解决父子关联的问题时有哪些不同的特点。这篇文章的主要内容有以下几点: 用对象数组保存父子关联关系时存在的问题。对比嵌套对象和对象数组的区别,了解嵌套对象的使用、搜索和统计方法以及优缺点。使用join字段类型解决父子关系的存储和搜索问题,以对join字段做统计分析。join字段的优缺点。在应用层解决父子关联的问题,有哪些优缺点。 2、使用对象数组存在的问题 在Elasticsearch中,你可以很方便地把一个对象以数组的形式放在索引的字段中。下面的请求将建立一个author索引,里面包含对象字段“books”,它用来存放作者包含的多本书籍的数据,从而在作者和书籍之间建立起一对多的关联。 PUT author-obj-array { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "author_id":{ "type": "integer" }, "author_name":{ "type": "keyword" }, "author_birth":{ "type": "date", "format": ["yyyy-MM-dd HH:mm:ss"] }, "author_desc":{ "type": "text", "fields": { "keyword":{ "type":"keyword", "ignore_above":256 } } }, "books":{ "properties": { "

Go Metrics SDK Tag 校验性能优化实践

背景 Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK,在字节内数十万服务中集成,应用广泛,因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例,讲述对打点 API 的 hot-path 优化的实践。 用户在使用 SDK API 进行打点时,需要传入指标对应的 Tag: tags := []m.T{{Name: "foo", Value: "a"}, {Name: "bar", Value: "b"}} metric.WithTags(tags...).Emit(m.Incr(1)) SDK 内部需要对用户传入的 Tag Value 的合法性进行校验,IsValidTagValue,是 SDK 中对 Tag Value 进行字符合法性校验的 util 函数,在对内部一些用户的业务使用 pprof 拉取 profile 时,发现这两个函数的 CPU 消耗占整个打点 API 过程的10%~20%,由于该函数发生在打点 API 的 hot-path 上,因此有必要对其进行进一步优化。 分析 当前实现 我们先看一下 IsValidTagValue 函数内部的实现方式,是否有可优化的点。当前的实现,对于通过 API 传入的每一个Tag Value,会进行以下操作来判断其合法性: 先判断是否是在 Letter、Number 的范围内,是则直接通过; 存储所有允许的特殊字符白名单,遍历 Tag Value 对比其每个字符是否在白名单内。

基于java的个人日记本系统设计与实现

基于java的个人日记本系统设计与实现 I. 引言 A.研究背景和动机 研究背景: 随着信息技术的迅速发展和应用,个人日记本作为一种个人信息管理工具,受到了广泛的关注和应用。在数字化时代的推动下,传统的手写日记本已经无法满足人们的需求。为了提高个人日记本的管理效率和服务质量,开发和实现一个基于Java的个人日记本系统设计与实现具有重要的研究背景和丰富的应用场景。 近年来,个人日记本的应用越来越广泛,传统的手写日记本存在着很多问题,如信息难以查找、信息难以分类、信息难以保存等。而基于Java的个人日记本系统设计与实现,可以提供一种集中、高效、易用的管理方式,使得个人日记本的管理更加便捷和智能化。 此外,随着人们生活节奏的加快和信息量的不断增加,人们需要一种更加高效的方式来记录和管理自己的日记。基于Java的个人日记本系统设计与实现能够提供一种更加便捷和高效的管理方式,使得人们可以更加方便地记录和管理自己的日记。 动机: 基于以上研究背景和问题现状,进行基于Java的个人日记本系统设计与实现的毕业设计具有以下动机: 提高个人日记本管理效率:传统的个人日记本管理方式需要大量的人力和时间成本,而基于Java的个人日记本系统设计与实现可以自动化和集中化管理各项日记信息,大大提高管理效率。提升服务质量和用户体验:基于Java的个人日记本系统设计与实现可以为使用者提供更加便捷、快速、易用的记录和查询服务,提升用户体验。优化个人日记本利用率:通过个人日记本系统设计与实现,可以更加精确地统计和分析个人日记本的使用情况,优化记录方式和存储结构,提高个人日记本的利用率。探索软件开发技术和工具:通过进行基于Java的个人日记本系统设计与实现的毕业设计,可以深入学习和应用Java语言、数据库技术、界面设计等相关知识和技术,探索软件开发技术和工具。实践软件工程方法和流程:通过毕业设计实践软件工程方法和流程,可以提高实际软件开发的能力,为今后的工作和学习奠定基础。 基于Java的个人日记本系统设计与实现的毕业设计具有重要的研究意义和实践价值。通过提高个人日记本管理效率、优化个人日记本利用率、提升服务质量和用户体验、探索软件开发技术和工具等方面的需求,可以设计和实现一个功能完善、高效可靠的个人日记本系统。同时,该毕业设计也为实践软件工程方法和流程提供了机会,有助于提高实际软件开发的能力。 B.目标和意义 基于Java的个人日记本系统设计与实现的目标是构建一个面向个人的日记本管理系统,旨在提供一个高效、便捷和安全的方式来记录和整理个人日记。该系统将帮助用户轻松地创建、编辑、阅读和保存他们的日记,同时提供一些附加功能以增强用户体验。 目标: 用户友好的界面:设计一个用户友好的界面,使得用户可以轻松地创建、编辑和阅读日记。界面应该包括易于使用的输入框、选项卡、导航菜单等功能,以提供良好的用户体验。快速检索与查看:实现一个高效的检索功能,使用户可以快速查找和查看以前的日记。检索功能可以根据日期、关键字或其他相关属性进行搜索,以提供个性化的查询体验。存储与备份:设计一个可靠的存储方案,确保用户的数据安全。系统应该能够自动备份用户的数据,以防止数据丢失或损坏。附加功能:提供一些附加功能,如日记统计、密码保护、导出日记等,以满足用户的个性化需求。 意义: 基于Java的个人日记本系统设计与实现具有重要的实际意义和社会价值。 个人记录与管理:通过该系统的实现,用户可以方便地记录和管理自己的日记。系统提供了一个集中化的平台,使得用户可以轻松地创建、编辑和整理日记,避免了传统手写或电子文档管理的繁琐性。信息检索与整理:该系统提供了快速检索与整理的功能,使得用户可以按照日期、关键词或其他属性查找和整理日记。这有助于用户更好地组织和理解自己的记录,方便回顾和总结生活经验。数据安全与隐私保护:系统设计应注重数据安全和隐私保护,确保用户的数据不会被未经授权的第三方获取或滥用。通过密码保护和数据备份功能,系统能够提供安全的个人数据存储环境。学习和实践软件开发技术:基于Java的个人日记本系统设计与实现是一个良好的学习与实践平台,可以帮助学习者掌握Java语言、数据库技术、界面设计等相关知识和技术。通过该项目的实践,学习者可以提高软件开发能力和系统设计能力,为未来的职业发展打下基础。 基于Java的个人日记本系统设计与实现的目标是构建一个面向个人的高效、便捷和安全的日记本管理系统。该系统不仅可以帮助用户记录和管理个人日记,还提供了一些附加功能以增强用户体验。通过该项目的实践,学习者可以提高软件开发能力和系统设计能力,为未来的职业发展打下基础。因此,该项目具有重要的实际意义和社会价值。 II. 相关技术和工具 A.Java语言 Java语言是一种面向对象的高级编程语言,由Sun Microsystems(现在是Oracle公司)于1995年发布。它被设计成可移植、可靠、安全和简单易学的语言,以及具有优秀的性能和高效的垃圾回收机制。Java语言在各个领域得到广泛应用,特别在Web开发、移动应用开发和企业应用开发领域占据主导地位。 下面介绍一下Java语言的背景和历史。 在1990年,Sun公司的一个小组开始开发一种新型的编程语言,以满足当时对分布式应用的需求。这个小组的领导者是James Gosling,他们希望创造一种可以在任何平台上运行的语言。经过几年的开发,Java语言于1995年年底正式发布。从一开始,Java就具有跨平台的特性,因为它编译成字节码并运行在Java虚拟机(JVM)上。 Java语言的目的是让开发者能够编写一次,到处运行。这意味着Java程序在编译后生成的字节码可以在任何支持JVM的平台上运行,而不需要重新编译。这种特性使得Java成为了一种非常流行的跨平台语言。 Java语言是一种真正的面向对象编程语言,具有封装、继承和多态等面向对象的概念和特征。这使得Java具有更好的结构化、可读性和可维护性。Java的面向对象特性使得它成为了一种非常强大的编程语言,可以用于构建各种类型的应用程序。 Java语言还具有自动内存管理机制,即垃圾回收器。垃圾回收器可以自动识别并回收不再使用的内存资源,避免了内存泄漏和野指针等问题。这使得Java程序员无需手动管理内存,从而提高了开发效率和程序的稳定性。 此外,Java提供了强大的多线程支持,使得程序能够同时执行多个任务。多线程可以提高程序的性能和响应能力,特别是在需要处理大量数据或进行实时交互的应用中。 Java还拥有丰富的类库和应用程序接口(API),包括各种功能和领域所需的类和方法。这些类库和API极大地简化了程序开发工作,提高了开发效率。特别是在Web开发和企业应用开发领域,Java的类库和API提供了许多方便的工具和框架,使得开发者能够快速构建复杂的应用程序。 在安全性方面,Java对安全性有着很高的重视。Java的设计者通过字节码验证、安全管理器等机制来防止恶意代码的执行。Java还提供了各种安全特性,如访问控制、数字签名等,以增强应用程序的安全性。 总的来说,Java语言是一种通用的、高效的、可移植的编程语言,具有强大的功能和良好的安全性。它拥有丰富的类库和API,可以用于构建各种类型的应用程序。Java在Web开发、移动应用开发和企业应用开发领域占据主导地位,同时也是学习编程和软件开发的理想选择。 B.数据库技术 数据库技术是信息时代不可或缺的一部分,它为大量数据提供了有效的存储、管理和检索功能。数据库技术是一种用于设计、开发和管理数据库的软件工具和技术。本文将详细介绍数据库技术的概念、发展和应用。 数据库系统的概念: 数据库系统是一种软件系统,用于管理大量数据并支持多种应用程序的访问。它使用数据库来存储和管理数据,并提供一系列功能,如数据存储、查询、修改和保护等。数据库系统可以满足各种数据管理和应用需求,如数据处理、决策支持、电子商务和大数据分析等。 数据库技术的发展: 数据库技术的发展可以追溯到20世纪60年代。随着计算机应用领域的不断扩大,数据量急剧增长,传统的文件管理方式已经无法满足大量数据的处理需求。为了解决这个问题,人们开始研究如何有效地存储和管理数据。在此基础上,网状数据库、层次数据库和关系数据库等相继出现。其中,关系数据库是最为成熟和广泛应用的数据库类型。 数据模型: 数据模型是描述和组织数据的形式化表示。常见的数据模型包括层次模型、网状模型、关系模型和面向对象模型等。其中,关系模型是最常用的数据模型,它将数据组织成表格形式,通过定义表格之间的关系来表示数据之间的联系。关系模型包括表、元组、属性、关系和约束等概念。 关系数据库: 关系数据库是建立在关系模型基础上的数据库,它通过表格来存储数据,并使用查询语言来检索和操作数据。关系数据库具有易于维护、较高的安全性和可靠性等特点。一些常见的关系数据库包括Oracle、MySQL、SQL Server和DB2等。 数据库设计: 数据库设计是指在数据库系统中创建数据库的过程。它涉及到确定数据的结构、属性、关系和约束等。良好的数据库设计可以提高数据查询和操作的效率,减少数据冗余和不一致性。数据库设计应该遵循一些基本原则,如保持数据完整性、避免数据冗余、提高数据一致性等。 数据库查询语言: 数据库查询语言是用于查询和操作数据库的语言。常见的查询语言包括结构化查询语言(SQL)和面向对象的查询语言(OQL)。通过查询语言,用户可以方便地对数据库进行查询、过滤、排序等操作。SQL是一种标准化的查询语言,它具有简单易用的特点,可以用于各种关系数据库的操作。 数据库索引: 数据库索引是一种用于加速查询操作的数据结构。它可以帮助数据库系统快速定位需要查询的数据。常见的索引结构包括B树索引、哈希索引和全文索引等。索引可以提高查询效率,但也会增加系统开销。在数据库设计中,需要根据实际情况选择合适的索引策略。 数据库事务: 数据库事务是一系列对数据库的操作,它要么全部执行成功,要么全部回滚。事务可以确保数据库操作的原子性、一致性、隔离性和持久性。事务是实现数据库操作安全性和可靠性的重要机制。 数据库安全性: 数据库安全性是指保护数据库免受非法访问、损坏和数据泄露的能力。数据库系统提供了用户身份验证、权限管理和数据加密等安全机制,以确保数据的完整性和机密性。在网络安全日益重要的今天,数据库安全性成为了保护敏感数据的关键环节。 数据库备份与恢复: 数据库备份与恢复是保护数据库免受数据丢失和系统故障的措施。数据库备份可以将数据库的副本保存到其他存储设备中,以防止数据损坏。当数据库出现故障时,可以通过恢复机制还原数据库到之前的状态。 数据库性能优化: 数据库性能优化是提高数据库系统的查询和操作效率的过程。通过设计良好的数据库结构、优化查询语句和配置合理的索引,可以提高数据库的响应速度和吞吐量。在处理大规模数据时,优化数据库性能对于提高系统的整体性能至关重要。 数据库技术应用: 数据库技术在各个领域都得到广泛应用。在企业中,数据库技术被广泛应用于企业资源计划(ERP)系统、客户关系管理(CRM)系统和供应链管理系统等。在互联网领域,数据库技术被用于支持大规模的数据存储和管理,如社交网络、电子商务和大数据分析等。在科研和教育领域,数据库技术被用于创建和管理科学数据和图书馆资源。此外,数据库技术还应用于医疗信息管理、金融数据分析、地理信息系统等众多领域。 总之,数据库技术是信息时代不可或缺的一部分,它为大量数据提供了有效的存储、管理和检索功能。通过不断发展和应用新技术,数据库技术将继续为各个领域的数据管理和应用提供强有力的支持。 C.GUI技术 GUI(Graphical User Interface,图形用户界面)技术是一种使用图形化元素和用户交互的技术。它通过图形化界面,使用户能够直观地与计算机程序进行交互。GUI技术简化了计算机操作,使得用户不再需要记忆复杂的命令和操作序列,从而提高了用户的工作效率和使用体验。本文将详细介绍GUI技术的背景、原则、主要组件和应用领域。 一、背景 在早期的计算机系统中,用户界面主要依赖于文本命令行界面(CLI,Command Line Interface)。用户需要记忆各种命令和参数,并通过输入命令来执行操作。这种方式对于普通用户来说非常不友好,且学习成本高。随着计算机硬件和软件技术的发展,GUI技术逐渐成为主流。

Linux mv命令:移动文件或改名

mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。该命令的基本格式如下: [root@localhost ~]# mv 【选项】 源文件 目标文件 -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖; -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项); -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户; -v:显示文件或目录的移动过程; -u:若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级; 需要注意的是,同 rm 命令类似,mv 命令也是一个具有破坏性的命令,如果使用不当,很可能给系统带来灾难性的后果。 【例 1】移动文件或目录。 [root@localhost ~]# mv cangls /tmp #移动之后,源文件会被删除,类似剪切 [root@localhost ~]# mkdir movie [root@localhost ~]# mv movie/ /tmp #也可以移动目录。和 rm、cp 不同的是,mv 移动目录不需要加入 "-r" 选项 如果移动的目标位置已经存在同名的文件,则同样会提示是否覆盖,因为 mv 命令默认执行的也是 "mv -i" 的别名,例如: [root@localhost ~]# touch cangls #重新建立文件 [root@localhost ~]# mv cangls /tmp mv:县否覆盖"tmp/cangls"?y #由于 /tmp 目录下已经存在 cangls 文件,所以会提示是否覆盖,需要手工输入 y 覆盖移动 【例 2】强制移动。之前说过,如果目标目录下已经存在同名文件,则会提示是否覆盖,需要手工确认。这时如果移动的同名文件较多,则需要一个一个文件进行确认,很不方便。如果我们确认需要覆盖已经存在的同名文件,则可以使用 "-f" 选项进行强制移动,这就不再需要用户手工确认了。例如:

Spring AOP源码解读

今天我们来分析Spring中AOP的源码,主要是关于SpringAOP是如何发挥作用的。 前期准备 首先我们需要有一个Spring AOP项目,添加好了SpringAOP的依赖。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.2</version> </dependency> <!--spring aop依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>6.0.2</version> </dependency> <!--spring aspects依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.0.2</version> </dependency> 开始分析 首先我们肯定是需要先定义一个我们启动类,这里我采用AnnotationConfigApplicationContext来进行测试,当然还需要一个AppConfig。 @ComponentScan("com.zly.aop.learn") @Configuration @EnableAspectJAutoProxy public class AppConfig { 我这里主要是为了扫包而已,然后使用Aop还得开启EnableAspectJAutoProxy,这个就和我们在以往的xml开启aop:aspectj-autoproxy是一样的作用,这里也支持xml的所有配置。 切面的定义 关于切面的定义和对应的通知,我就不再解释了,实在不了解可以看我之前写的博客或者去网上进行了解。 @Component @Aspect public class AopAspect { /** * 设置切入点和通知类型 * 切入点表达式 execution(访问修饰符 返回值类型 方法所在类的全路径 方法名 参数列表 * 通知类型: * 前置@Before * 返回@AfterReturning * 异常@AfterThrowing * 后置@After * 环绕@Around() */ @Before(value = "pointCut()") public void beforeMethod(JoinPoint joinPoint) { String methodName = joinPoint.

【论文复现:Active Learning via Local Structure Recontruction】

论文复现:Active Learning via Local Structure Reconstruction 目标函数优化过程公式(16)推到python代码链接如下: 目标函数 优化过程 公式(16)推到 原文中省略了上述推导过程 在这里我们自己推导一下,只要有一点数学基础就很简单: A = ( Q T Q + γ G ) − 1 Q T X A = (Q^TQ+\gamma G)^{-1}Q^TX A=(QTQ+γG)−1QTX 根据伍德伯里矩阵恒等式: A = G − 1 Q T ( Q G − 1 Q T + γ I d ) − 1 X A = G^{-1}Q^T(QG^{-1}Q^T+\gamma I_d)^{-1}X A=G−1QT(QG−1QT+γId​)−1X 推到过程: A = ( Q T Q + γ G ) − 1 Q T X = [ G − 1 − G − 1 Q T ( γ I d + Q G − 1 Q T ) − 1 Q T G − 1 ] Q T X = [ G − 1 Q T − G − 1 Q T ( γ I d + Q G − 1 Q T ) − 1 Q T G − 1 Q T ] X = [ G − 1 Q T − G − 1 Q T ( γ I d + Q G − 1 Q T ) − 1 ( I d + Q T G − 1 Q T − I d ) ] X = [ G − 1 Q T − G − 1 Q T [ I − ( γ I d + Q G − 1 Q T ) − 1 ) ] ] X = [ G − 1 Q T − G − 1 Q T + G − 1 Q T ( γ I d + Q G − 1 Q T ) − 1 ) ] X = G − 1 Q T ( γ I d + Q G − 1 Q T ) − 1 X \begin{aligned} A &= (Q^TQ+\gamma G)^{-1}Q^TX \\ & = [G^{-1} - G^{-1}Q^T(\gamma I_d+QG^{-1}Q^T)^{-1}Q^TG^{-1}]Q^TX \\ & = [G^{-1}Q^T - G^{-1}Q^T(\gamma I_d+QG^{-1}Q^T)^{-1}Q^TG^{-1}Q^T]X \\ & = [G^{-1}Q^T - G^{-1}Q^T(\gamma I_d+QG^{-1}Q^T)^{-1}(I_d+Q^TG^{-1}Q^T-I_d)]X \\ & = [G^{-1}Q^T - G^{-1}Q^T[I-(\gamma I_d+QG^{-1}Q^T)^{-1})] ]X \\ & = [G^{-1}Q^T - G^{-1}Q^T+G^{-1}Q^T(\gamma I_d+QG^{-1}Q^T)^{-1}) ]X \\ & = G^{-1}Q^T(\gamma I_d+QG^{-1}Q^T)^{-1}X \end{aligned} A​=(QTQ+γG)−1QTX=[G−1−G−1QT(γId​+QG−1QT)−1QTG−1]QTX=[G−1QT−G−1QT(γId​+QG−1QT)−1QTG−1QT]X=[G−1QT−G−1QT(γId​+QG−1QT)−1(Id​+QTG−1QT−Id​)]X=[G−1QT−G−1QT[I−(γId​+QG−1QT)−1)]]X=[G−1QT−G−1QT+G−1QT(γId​+QG−1QT)−1)]X=G−1QT(γId​+QG−1QT)−1X​

滚动轴承故障检测---基于希尔伯特变换解调(python实现)

一、基本原理 请转向这里查看 二、方法实现 2.1 加载故障数据 下面先以轴承外圈故障数据进行分析。原始数据为mat文件,是matlab文件,定义一个函数进行数据读取 from scipy.io import loadmat import matplotlib.pyplot as plt import math import numpy as np import scipy plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False def data_acquision(file_path): """ fun: 从cwru mat文件读取加速度数据 param file_path: mat文件绝对路径 return accl_data: 加速度数据,array类型 """ file = loadmat(file_path) # 加载mat数据 file_keys = file.keys() for key in file_keys: if 'DE' in key: files = file[key].ravel() return files if __name__ == "__main__": # step1: 获取测试数据 path = r'D:\360安全浏览器下载\轴承故障检测\数据源\西储大学\CWRU轴承数据\cwru_data\0HP\12k_Drive_End_OR007@6_0_130.mat' data = data_acquision(path) #获取原始数据 plt.

【图像边缘检测】基于matlab CNN灰度图像边缘提取【含Matlab源码 490期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭:行百里者,半于九十。 更多Matlab仿真内容点击👇 Matlab图像处理(进阶版) 路径规划(Matlab) 神经网络预测与分类(Matlab) 优化求解(Matlab) 语音处理(Matlab) 信号处理(Matlab) 车间调度(Matlab) ⛄一、简介 0 前言 边缘检测是图像处理中最古老和最基本的问题之一。灰度 边缘检测算法的发展时间较长, 算法较多。基于梯度的边缘检 测算子最早出现, 基于优化目标函数的方法, Canny算子被广泛使用。另外还有基于其它技术的边缘检测方法, 如多尺度方法、统计过程、曲面拟和和支持向量等。 近年来, 由于数字彩色图像的广泛运用, 使彩色数字图像处理技术日益受到关注。现有的一些彩色图像边缘检测方法中, 有相当部分是灰度图像边缘检测的推广, 也即首先基于某一彩色分量红® 、绿(G) 或蓝(B) 的图像进行灰度图像边缘 检测, 然后再将每一独立分量的边缘图联合形成彩色图像的边缘。这些方法忽略了人眼对颜色的视觉感知, 没有考虑各颜色分量之间的联系, 往往得不到好的边缘检测效果。而基于彩色空间的边缘检测方法可以充分利用彩色图像中携带的彩色信息。为了充分考虑人眼对不同颜色感知程度的不同, 同时克服彩色空间角向量距离计算复杂的缺点, 本文使用彩色空间 Mahalanobis 距离作为彩色象素之间差异的度量。 所有的常规边缘提取方法输出结果都是二值图像。因此, 提取的边缘丢失了许多重要的信息, 尤其体现在有丰富细节和 微小变化的区域。为了解决这个问题, 利用细胞神经网络 (CNN) 多值输出的特点来进行彩色图像边缘检测。 1 细胞神经网络(CNN) 美国科学家 L.O.Chua 等人 1988 年提出的细胞神经网络 (CNN) 。由于其具有可并行计算、便于硬件实现等特性, 故它比传统方法有更大的潜力。 CNN的数学描述如下: 2 彩色空间 2.1 RGB 彩色空间 RGB( 红、绿、蓝) 是众多彩色空间的一种。由于红、绿、蓝三个通道里的灰阶值各自独立控制红、绿、蓝三种颜色的亮度, 形成数学上的一个三维空间。记录及显示彩色图像时, RGB是最常见的一种方案。因为彩色图像有三个分量, 彩色象素实际上是向量。在RGB 系统中, 每个彩色点都会在 RGB 坐标系中作为一个从原点延伸到那一点的向量来描述。 令c 代表 RGB 彩色空间中的任意向量:

leetcode_1339. 分裂二叉树的最大乘积

题目链接:1339. 分裂二叉树的最大乘积 DFS两次即可 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MOD ((int)pow(10, 9) + 7) static void post_order_traversal(struct TreeNode* node) { if (!node) { return; } post_order_traversal(node->left); post_order_traversal(node->right); if (node->left) { node->val += node->left->val; } if (node->right) { node->val += node->right->val; } } static void dfs(struct TreeNode* node, const long long sum, long long *ans) { if (!node) { return; } long long a = node->val; long long b = sum - node->val; *ans = MAX(*ans, (a * b)); dfs(node->left, sum, ans); dfs(node->right, sum, ans); } int maxProduct(struct TreeNode* root){ post_order_traversal(root); long long sum = root->val; long long ans = 0; dfs(root, sum, &ans); return (ans % MOD); }

解决恶意IP地址攻击:保卫网络安全的有效方法

随着互联网的发展,网络安全威胁变得日益复杂,其中包括恶意IP地址攻击。这些攻击通常是网络犯罪分子的手段之一,用于入侵系统、窃取数据或进行其他恶意活动。本文将探讨如何解决恶意IP地址攻击,以保护网络安全。 恶意IP地址攻击是指来自恶意或已知的恶意来源的IP地址对目标网络或系统发起攻击的行为。这些攻击可能包括端口扫描、拒绝服务攻击、恶意软件传播等。了解这些攻击的种类和工作原理是解决它们的第一步。 下面是一些解决恶意IP地址攻击的有效方法: 1. 使用防火墙: - 防火墙是网络安全的第一道防线,可以阻止恶意IP地址的入侵。 - 设置防火墙规则,只允许特定IP地址或IP地址范围访问网络资源,限制其他恶意IP地址的访问。 2. 使用入侵检测系统(IDS)和入侵防御系统(IPS): - IDS和IPS可以监控网络流量,检测异常活动并采取必要措施,如封锁恶意IP地址。 - 这些系统可以帮助防止拒绝服务攻击和其他网络入侵。 3. 使用威胁情报服务: - 订阅威胁情报服务,以获取有关已知恶意IP地址的信息。 - 将这些信息集成到安全策略中,以自动阻止来自这些地址的攻击。 4. 加强身份验证和访问控制: - 强化身份验证和访问控制措施,确保只有授权的用户和设备可以访问网络资源。 - 这可以减少对恶意IP地址的攻击威胁。 5. 实时监控和响应: - 部署实时监控系统,以快速检测和应对恶意IP地址的攻击。 - 及时采取行动以限制潜在威胁的影响。 6. 更新和维护系统: - 及时更新操作系统、应用程序和安全软件,以填补已知漏洞。 - 确保网络设备和防护系统的正常运行。 恶意IP地址IP数据云 - 免费IP地址查询 - 全球IP地址定位平台攻击对网络安全构成了严重威胁,但通过使用综合的安全措施,可以有效减轻这些威胁的风险。使用防火墙、IDS和IPS、威胁情报服务、加强身份验证和访问控制、实时监控以及及时更新和维护系统,组织可以更好地保护自己免受恶意IP地址攻击的影响。在不断变化的网络安全威胁环境中,维护高水平的网络安全措施至关重要。

程序员工具大全

vscode 插件 1.代码格式化插件: Prettier - Code formatter 2.中英文翻译插件 (推荐) var-translate 1调色网站 有大量调好的颜色 可直接使用 uiGradients - Beautiful colored gradients 2 免费大量设计图 背景图 但每日限制游客次数 https://www.freepik.com/​www.freepik.com/ 3大量的 icon 图标 但需要登录 Leto icons - Iconfinder 4 动画库工具 animate.css; wow 动画库 (77条消息) wow.js实现各种动画特效_wow.js 滚动消失_zihanzy.com的博客-CSDN博客 5 免费视频转 gif动图 网站 制作gif动图 可放在前端页面上 在线视频转GIF软件_视频转GIF在线制作工具_图贴士 (tutieshi.com) 6 录制视频工具 EV录屏电脑版-鲁大师应用市场下载 (cuanfeng.cn) 1 Git 版本可视化工具 sourcetree 2 修改导航栏顶部的 小图标 图片转换成 icon的网站 https://www.favicon-generator.org/ 或者 改图鸭 JPG、PNG、BMP转ICON-在线图片格式转换成ICON-改图鸭 (gaituya.com) 转换ico 放在img下 一个 ★

minio + linux + docker + spring boot实现文件上传与下载

minio + docker + spring boot实现文件上传与下载 1.在linux上安装并启动docker2.在docker中拉取minio并启动3.Spring Boot 整合 minio4.测试 minio 文件上传、下载及图片预览等功能 1.在linux上安装并启动docker 检查linux内核,必须是3.10以上 uname ‐r 安装docker yum install docker 启动docker systemctl start docker 2.在docker中拉取minio并启动 搜索镜像 docker search minio 拉取镜像 docker pull minio/minio 启动minio docker run -p 9000:9000 -p 9090:9090 --name minio \ -d --restart=always \ -e MINIO_ACCESS_KEY=vinci \ -e MINIO_SECRET_KEY=123456\ -v /usr/local/minio/data:/data \ -v /usr/local/minio/config:/root/.minio \ minio/minio server /data --console-address ":9000" --address ":9090" -p: 指定端口映射,格式为:主机端口:容器端口 (这里注意要映射两个,否则API会访问不到) -e “MINIO_ROOT_USER=vinci” minio用户名;

ES6(第三版)知识点及各个版本总结

一、ES6与ECMAScript2015关系 ES:是编写js的标准,它规定了语法、语句、类型、关键字、保留字、操作符、对象等(js的国际标准) JS:JavaScript 1995诞生的目的是解决以前依赖服务器语言验证用户的输入验证操作。后期发展为一门编程语言。js包含:ECMAScript标准、DOM(DOM 把整个页面映射为一个多层节点结构,dom节点树,通过dom提供的 API,开发人员可以轻松自如地删除、添加、替换或修改任何节点)、BOM(浏览器对象模型) ES6第三版:ES2015、ES2016、ES2017版本迭代 二、let和const命令(es5用var来声明变量或function来声明函数,且es5只存在全局和函数作用域。es6增加声明变量的方法后存在块级作用域和暂时性死区) 1、let 1)let声明的变量只有在let命令所在的代码块内有效 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. let声明的只能在所在的代码块内有效,否则报错 b // 1 var声明的不存在块级作用域 好处:例如一般用在for循环中可解决循坏计数暴露为全局变量的问题 在for外部使用循环变量时会报错 console.log(i); // ReferenceError: i is not defined 内层变量可能会覆盖外层变量的问题 2)let声明的变量不存在变量提升(即声明后才可使用,否则会报错。而var声明的变量存在变量提升,在自己的作用域内提升) console.log(foo);// 输出undefined 提升后 var foo 会在console.log前 var foo = 2 console.log(foo);//报错ReferenceError 即在声明前使用就会报错 let foo = 2 3) 暂时性死区。在代码块内,使用let命令声明变量之前,该变量都是不可用的,会报错,就是在声明前都是它的死区 var tmp = 123; if(true){ tmp = ‘abc’ ;// ReferenceError

【推荐】获取 aarch64 版本 libv8_monolith.a 静态库的三种方法

前言 前不久,为了搞定 OpenRASP for linux aarch64 版本,中间最关键的一个东西就是 Chromium 的开源 v8 引擎(俗称 libv8),通过静态库(libv8_monolith.a)的形式引入,官方提供的预编译版本是 7.8.279.19,相对较老,尝试从 V8 官方源码编译这个版本,运行总是 OOM(不知道是否编译环境的问题),含泪放弃~~~ 以下为过程中的报错信息: mvn install gdb ../build64/java/libopenrasp_v8_java.so core.xxxxx # xxxxx 为 coredump 的进程号 后来经过反复尝试(网络上的文章是真简短,但最终都是指向失败,求助 GPT 基本也是一顿胡说,让我走了不少弯路),发现 8.6.395.17 版本的 hello-world 可以正常运行,遂在这个版本基础上进行 OpenRASP 更新的后续工作。 这篇文章就讲一讲我这三周摸索出的三种获取 libv8_monolith.a 静态库的方法,供读者参考。 方法一:使用 Libv8 官方代码 优点:原生代码,干净;生成的库体积小、参数配置方便缺点:需要梯子才能访问、工具链庞大,编译环境搭建贼慢参考:https://github.com/tanjelly/openrasp-v8/blob/master/vendors/build-libv8.sh PS: 刚开始不知道项目中有这个脚本,走了不少弯路!!! 安装系统 Ubuntu22.04 X86_64 安装必要组件 sed -i 's#/archive.ubuntu.com#/mirrors.ustc.edu.cn#g' /etc/apt/sources.list sed -i 's#/security.ubuntu.com#/mirrors.ustc.edu.cn#g' /etc/apt/sources.list apt-get update apt-get upgrade apt-get install vim git python2 python3 python3-pip ninja-build clang-14 apt-get install pkg-config libglib2.

FreeRTOS学习2018.6.27

《FreeRTOS学习》 1.freeRTOS基本功能函数: 定义任务:ATaskFunction(); 创建任务:xTaskCreate(); 改优先级:vTaskPrioritySet(); 系统延时:vTaskDelay(); 精确延时:vTaskDelayUntil(); 空闲任务钩子函数:vApplicationIdleHook(); 2.freeRTOS实用总结: 1.使用互斥信号量保护临界区代码。 2.程序中注意避免优先级反转和死锁问题。 3.使用守护任务避免上述问题。 4.内存管理(FreeRTOS的head_2.c):pvPortMalloc()、vPortFree() 3.错误排查(栈溢出): 可使用下述函数完成程序中的栈溢出处理: uxTaskGetStackHighWaterMark(); 查询运行中,栈的最小剩余空间。(可用来做栈空间的规划,可进行实测得到运行的最小剩余空间,来推断应该对任务规划多少栈空间。) 扩展:是否可以运用该函数,完成预先判断栈溢出的功能,可规定如果程序运行中最小剩余空间超过定义的最小值后,对该任务进行关闭,并扩大其栈空间后再开启,如果可行,则可达到自动栈空间规划。 vApplicationStackOverflowHook(); 栈溢出钩子函数。 可运用该函数完成栈溢出的处理,如果程序还能挽回,则可进行相应的操作。 附: 仿真时发现不能打断点 在项目Option->C/C++compiler->Output选项卡中需勾选Generate debug informat设置。

YModem协议总结

《YModem协议总结》 目录 第1章 YModem协议简介 4 1.1 基本介绍 4 1.2 YModem基本介绍 4 第2章 YModem传输协议 5 2.1 起始帧的数据格式 5 2.2 数据帧的数据格式 5 2.3 结束帧数据结构 6 2.4 文件传输过程 6 2.5 CRC的计算 7 附录A 附录 8 A.1 附录 8 第1章 YModem协议简介 1.1基本介绍 最常用的几种通信传输协议有:XModem、YModem、ZModem等。 XModem是最早的协议之一,几乎所有的通讯程序支持的文件传输协议,它传输128字节信息块。 YModem协议是XModem的改进协议,它最用于调制解调器之间的文件传输的协议,具有快速,稳定传输的优点。它的传输速度比XModem快,这是由于它可以一次传输1024字节的信息块,同时它还支持传输多个文件,也就是常说的批文件传输。 ZModem速度快于XModem和YModem,而且可以更好地断开后恢复传输。 如今,XModem基本已经被淘汰,最常用的就是YModem与ZModem。 1.2YModem基本介绍 YModem分成YModem-1K与YModem-g。 YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。 YModem-g传输形式与YModem-1K差不多,但是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K来得快。一般都会选择YModem-1K传输,平时所说的YModem也是指的是YModem-1K。 第2章 YModem传输协议 2.1起始帧的数据格式 YModem的起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=33字节。它的数据结构如下: SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL 其中SOH=0x01,表示这个数据帧中包含着128字节的数据部分; 在SOH后面的00 FF,00表示数据帧序号,因为是起始帧,所以它的帧序为00,至于FF,它是帧序的取反; filename[ ]就是文件名,如文件名foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00,一定要在文件名最后跟上一个00,表示文件名结束; filesize[ ]就是文件大小,如上面的foo.

ROS学习记录2018.7.10

ROS学习记录2018.7.10 1.ROS基础了解 开源机器人操作系统ROS(robot operation system) 分级: 1.计算图集(一种网络结构) 1.节点:执行运算的进程(做基础处理的单元) 2.消息:有严格数据结构的通讯 3.主题:发布者/订阅者之间的媒介(类似报纸、凤凰新闻这类) 4.服务:一个请求/一个回应的唯一的ROS控制器(类似常说的服务器) 2.文件系统集(ROS代码组织架构) 1.包package:软件各种文件的组织 2.堆stack:包的集合 注:manifest为提供元数据、许可信息、文件间依赖关系、编译参数。 3.社区集(代码库联合系统) 构造函数: 与类同名的函数,在调用类的时候会启动构造函数对类进行操作。 析构函数: 与类同名但名前多了~符号的函数,在释放类的时候会启动析构函数对类进行内部释放操作。 ros::NodeHandle成员介绍: 1.NodeHandle::advertise 回调函数:void connectCallback(const ros::SingleSubscriberPublisher& pub); 例:ros::Publisher pub = handle.advertise<std_msg::String>(“name”, 1, (ros::SubscriberStatusCallback) connectCallback); 2.NodeHandle::subscribe 回调函数:void Foo::Callback(const std_msg::String::ConstPtr& message); 例:ros::Subscriber sub = handle.subscribe (“name”, 1, &Foo::Callback); 3.NodeHandle::serviceClient 例:ros::ServiceClient client = handle.serviceClien<std_msg::String>(“name”); 4.NodeHandle::serviceServer 例:ros::ServiceServer service = handle.advertiseService (“name”,Callback); 2.ROS使用 1.基础操作 $ rospack find ‘nameofstack’:查找安装过的功能包集 $ rosls ‘nameofstack’:显示功能包集下的文件列表 $ roscd ‘nameofstack’:进入功能包文件夹 2.创建ROS功能包: $ roscreate-pkg [name] [depend1] [depend2] [depend3]

相似歌曲(YOJ2.0中的题)

又水了一道数组题 这次比较快,而且是一遍过 代码如下: #include<stdio.h> #include<math.h> int main(void) { int Q_frequency[16] = {0}; int n_0; scanf("%d", &n_0); for(int i = 0; i < n_0; i++) { int tmp; scanf("%d", &tmp); Q_frequency[tmp / 16] += 1; } int n, k; scanf("%d%d", &n, &k); int S_frequency[n][16]; for(int i = 0; i < n; i++) for(int j = 0; j < 16; j++) S_frequency[i][j] = 0; for(int i = 0; i < n; i++) { scanf("

“淘宝” 开放平台接口设计思路|开放平台接口接入流程教程

最近对接的开放平台有点多,像淘宝、京东、快手、抖音等电商平台的开放平台基本对接了个遍,什么是CRUD BODY也许就是这样的吧!!! 虽然对接各大开放平台没啥技术含量,但咱也得学点东西不是,不能白对接哈!经过这几天的整理,脑子里大概有了个开放平台接口的设计套路,故整理成文章方便有需要的时间去实现自己的开放平台接口。 开放平台比较关注的几个点: 易用性:接口设计要简洁,请求参数要见名知意,使服务商能快速接收,为用户提供服务 安全性:开放平台接口是暴露在外网,必须保证用户数据的安全 稳定性:开放平台接口是给上游的服务商使用,必须保证稳定为服务商应用提供服务 ... 服务商应用 开放平台可以分为几大部分: 接入指南:帮助服务商接入开放平台 接口文档:帮助服务商的开发人员,实现业务功能 应用:服务商应用在开放平台的身份标示 服务商接入开放平台的首要步骤就是创建应用,有了服务商应用平台内部就能辨别服务商的身份,这样就能很方便的做限流、权限控制等。 基本属性 服务商应用一般有appid、appsecret、授权回调地址这三个基本的属性: appid: 服务商应用的唯一标识 appsecret:服务商应用的密钥签名、验证身份时用到 授权回调地址:授权时会用到 授权认证 授权不是开放平台对服务商应用的授权 ,而是需要开放平台的客户(用户)对服务商应用的授予,比如ERP应用,也就是淘宝的店铺商家对应用进行授权,使其能够拉取到店铺的订单来完成订单履约。 淘宝授权页 所以授权需要三个角色才能完成: 开放平台 提供授权页面,引导客户完成服务商应用的授权 客户完成授权后,跳转到服务商应用提供的授权回调地址同时带上授权信息 客户:在开放平台提供的授权页面中,完成对服务商应用的授权 服务商应用:接收开放平台回调的授权信息,完成务商应用与客户的绑定关系、保存授权信息 当然也可以使用appid + appsecret 直接认证服务商应用的身份,这种适合没有第三方的时候,数据都是属于开放平台的,跟客户没有半点关系,也就不存在需要客户授权的问题。 OAuth2授权机制 OAuth2是一套授权标准,现在互联网做授权基本都用它,如github登陆 、微信公众号授权等都是基于OAuth2的应用。 授权流程 请求参数 请求参数分两类:系统参数、业务参数: 系统参数:每次API调用都必需携带的参数 业务参数:开放平台根据不同的业务,提供的参数。 业务参数根据业务来定,先说系统参数一般包含: appid:服务商应用唯一标识 appsecret: 服务商应用密钥 timestamp:时间戳 sign:请求签名 系统参数使用url参数传递 业务参数 业务参数是调用开放平台接口时传递的请求参数,如一次订单查询接口,要实现按订单状态的维度查询订单,那么订单查询接口就需要接收status参数,然后去查库后返回订单数据。 业务参数的载体,常用的如:application/json、application/x-www-form-urlencode等。 业务参数使用post请求参数的方式传递,同时也需要参与签名,后面说签名会提到 请求签名 对请求签名的目的就是防止数据被篡改,常见的md5、sha都可以用来做为签名算法,理论上只要保证双方能够生成签名和验签就行,像支付宝这类高安全级别的应用就是使用的非对称加密,双方各生成一对私钥和公钥,然后交换公钥用于验签即可。 生成签名的方式自行定义,这里列举一个常见的签名生成方式: sign = appsecret + appid + timestamp + 业务参数(排序后) + appsecret 伪代码 String appid = "