纯Java实现Google地图的KMZ和KML文件的解析

目录 前言 一、关于KMZ和KML 1、KMZ是什么 2、KML是什么 二、Java解析实例 1、POM.xml引用 2、KML 基类定义 3、空间对象的定义 4、Kml解析工具类 三、KML文件的解析 1、KML解析测试 2、KMZ解析测试 四、总结 前言 今天是六.一儿童节,在这里祝各位大朋友们儿童节快乐,同时祝祖国的所有花朵们更加快乐。童年的欢乐可以治愈一切。不知道各位的儿童节是怎么度过的呀,是在陪孩子呢,还在在享受自己的欢乐时光,只愿大家都欢乐就好。这是写在最前面祝福的话,愿我们都开心快乐。 最近碰到有朋友咨询,大致的问题是,他在项目中要实现KMZ数据的解析和WebGIS的可视化。刚好他用的技术栈是Java,同时KMZ的解析在各个网站上的相关解析代码不多。有很多代码是解析KML的,但是解析KMZ的相对比较少。一时没有参考的例子,希望能结合JAVA讲一下如何进行KMZ数据的解析。其实话说回来,虽然大致了解KMZ是什么数据,但是在之前的项目过程中,接触的空间数据也基本都是shp、gdb等等,至于google的KMZ还真的是第一回接触。 本文主要讲解如何用JAVA语言,直接解析KMZ数据。文章首先介绍google地图中的KMZ和KML数据,然后使用代码的方式实现数据的解析,最后展示解析成果以及如何将数据转换成空间WKT数据。关于JAVA解析KML的博客和资料有不少,但是KMZ文件的还是比较稀少的,供各位朋友在工作中解析KMZ文件有一个参考。 一、关于KMZ和KML 在进行相关文件的解析之前,首先我们来看一下KMZ和KML这两种文件,先了解这两种文件是什么?用来做什么的,具体的文件内容是什么样的。本节主要提供这些基础知识的讲解。 1、KMZ是什么 KMZ 文件包含主 KML 文件以及0个或多个用 ZIP 格式打包成一个单元的支持文件(称为归档)。然后,KMZ 文件就可以作为单个实体进行存储和通过电子邮件发送。NetworkLink 可从网络服务器提取 KMZ 文件。将 KMZ 文件解压缩后,主 .kml 文件及其支持文件便分离成其各自的原始格式和目录结构,以及原始文件名和扩展名。除了变成归档格式外,ZIP 格式也会受到压缩,因此归档只能包含一个大型 KML 文件。根据 KML 文件的内容,此过程通常会产生10:1的压缩。10千字节的 KML 文件可以用1千字节的 KMZ 文件来提供。 KMZ是Google Earth默认的输出文件格式,是一个经过ZIP格式压缩过的KML文件,当我们从网站上下载KMZ文件的时候,Windows会把KMZ文件认成ZIP文件,所以另存的时候文件后缀会被改成.ZIP,因此需要手动将文件后缀改成.KMZ。 KMZ文件用ZIP工具软件打开,然后解压缩即可得到原始KML文件。当然,KMZ文件也有自己的好处,就是KMZ文件的自身可以包含影像,这样就可以不依赖引用网络上的截图。 一般情况下,双击KMZ/KML文件即可从Google Earth中打开地标文件,但是需要注意的是,KMZ/KML地标文件名不能包含中文字符,文件存放的路径也不能有中文字符,否则将无法在Google Earth中打开。 这里我们以漂亮国的全球基地为说明,验证一下上述的内容。把KMZ文件的后缀名修改为zip,然后用压缩文件打开。可以看到以下的文件: 总结一下,KMZ就是把KML文件,进行了一个打包。这个很重要,在后面的解析过程中,会用到这个知识点。讲完了KMZ,下面介绍一下KML。 2、KML是什么 KML 代表 钥匙孔标记语言。此 GIS 格式基于 XML,主要用于 Google 地球。KML由Keyhole Inc开发,后来被Google收购.KMZ(KML-Zipped)取代KML成为默认的Google地球地理空间格式,因为它是文件的压缩版本。KML/KMZ于2008年成为开放地理空间联盟的国际标准。经度和纬度分量(十进制度)由 1984 年世界大地测量系统 (WGS84) 定义。垂直分量(高度)以米为单位从 WGS84 EGM96 大地水准面垂直基准面开始测量。

Python的第三方库OS库

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀OS/SHUTIL 的方法描述🚀OS/SHUTIL 的方法实操⭐️⭐️⭐️总结 🔥前言 Python的OS库提供了许多用于文件和目录操作的基本功能,如重命名、复制、删除等,能够方便地进行文件系统管理。优点包括易于学习和使用,功能丰富;缺点则是有些操作需要更多复杂的处理,可能不够高效。适合场景包括需要对文件和目录进行简单管理和操作的应用,如文件整理、备份等。 优点: 易于学习和使用,Python的OS库提供了简单直观的接口,适合初学者或快速开发。 功能丰富,能够完成大部分基本的文件和目录操作,满足一般需求。 跨平台性,适用于不同操作系统,使得程序具有更好的可移植性。 缺点: 对于复杂的文件操作可能需要更多的代码处理,不如一些专门的第三方库方便。 有些操作可能不够高效,特别是处理大量文件时可能会导致性能下降。 适用场景: Python的OS库适合处理简单的文件和目录操作,例如文件重命名、复制、移动、删除等。常见的应用场景包括文件整理、备份、批量重命名等操作。如果需要更高级的功能或更好的性能,可以考虑使用一些专门的第三方库来完成。 🚀OS/SHUTIL 的方法描述 方法/函数描述os.rename(src, dst)重命名文件或目录os.listdir(path)返回指定目录下的所有文件和目录os.getcwd()返回当前工作目录os.chdir(path)改变当前工作目录os.path.join(path1, path2)将两个路径组合成一个完整路径os.path.exists(path)检查指定路径(文件或目录)是否存在os.path.isfile(path)检查路径是否为文件os.path.isdir(path)检查路径是否为目录os.path.basename(path)返回路径中的文件名os.path.dirname(path)返回路径中的目录名os.path.split(path)返回路径的目录名和文件名os.path.splitext(path)分割路径的文件名和扩展名os.makedirs(path)递归创建目录os.remove(path)删除文件os.rmdir(path)删除空目录shutil.copy(src, dst)复制文件或目录shutil.move(src, dst)移动文件或目录shutil.rmtree(path)递归删除目录和文件 以上是一些常用的os和shutil库函数/方法,用于处理文件和目录操作。这些函数可以帮助你在Python中执行文件的移动、复制、删除、重命名等操作。 🚀OS/SHUTIL 的方法实操 1️⃣我的C盘文件夹下的Pythonspider,有Python爬虫相关的20份左右的文件,我想把这些文件重命名一下,于是这便用到了OS库来进行重命名操作了。 2️⃣我对这些文件的命名特点进行共性分析,便于新命名的规律 文件名是这一串:python_python_v1.0_第3章_Python爬虫_02-xpath表达式&案例_[代码]_11_7_xpath表达式案例 其他文件都是基于这一规律的:我想着是提取改文件名的中间一部分便找到了“_”这个分割 具体代码如下: import os # 设置文件夹路径 folder_path = r'C:\Pythonspider' # 获取文件夹下的所有文件和文件夹 entries = os.listdir(folder_path) # 遍历文件夹中的所有条目 for entry in entries: # 获取每个条目的完整路径 full_path = os.path.join(folder_path, entry) # 检查是否是文件 if os.path.isfile(full_path): # 分割文件名和扩展名 filename, ext = os.path.splitext(entry) # 假设文件名以'_'分隔,我们可以通过分割字符串并选择特定部分来实现 parts = filename.

完美解决Python中Numpy与TensorFlow版本兼容问题

前言 在用Python做图像识别的时候,需要借助TensorFlow库,但Numpy库和TensorFlow库版本不兼容就会出现问题。同时Numpy库得适应Python版本。 TensorFlow不兼容问题 如果TensorFlow低于numpy库版本则会报错:AttributeError: module 'numpy' has no attribute 'typeDict' 如果TensorFlow高于numpy库版本则会报错:TensorFlow ImportError: initialization failed 解决方法 方法一: 首先安装一遍TensorFlow。 pip install tensorflow 然后通过下面代码检查一下TensorFlow的版本。 pip show tensorflow 可以看见我这里的版本号是2.13.0 通过查表 然后安装对应的代码 pip install tensorflow==<version> 方法二: 不需要查表,更直接的方法。首先保证你的numpy的版本和python兼容,且最好保证已经装过TensorFlow.然后通过运行下面代码,这里的1.21是随便一个 pip install --user --upgrade numpy 那么程序会给升级到最高版本,但可能会报错。2.12.0是我安装的TensrFlowd的版本号。 tensorflow-intel 2.13.0 requires numpy<=1.24.3,>=1.22, but you have numpy 1.24.4 which is incompatible. 然后你只需要按照错误提示再重新输入需要的版本号。上面版本报错TensorFlow2.12.0需要numpy<=1.24,>=1.22,因此numpy在numpy<=1.24,>=1.22都可以。 pip install --user --upgrade numpy==1.23 最后安装完成,没有报错。 总结 TensorFlow是图像识别必要的库,numpy是机器学习的库,在python里两者需要兼容才可以使用,希望我的分享可以帮助到大家。

原码一位乘法(计算机组成原理)

算法原理 每次将1位乘数所对应的部分积与原部分积的“累积和”相加,并移位 设置寄存器 存放部分积累积和、乘积高位存放被乘数存放乘数、乘积低位 法则 乘积的数值位俩数绝对值之积;符号位 位 俩数符号位进行异或,即 p= x ⊕ y 步骤 设部分积z=0乘数最低位为1 ,z+|x|; 乘数最低位为0 ,z+0部分积和乘数同时右移1位重复上述步骤 例子 x=0.1101 ,y =0.1011,求x*y 笔算过程 计算机中过程 得到|x| 和 |y| 操作高位部分积低位部分积/乘数丢失部分说明初始00.0000101100.1101(被乘数)1011开始乘1011 中的最低位相加00.11011011整体右移,是包括高位和低位00.01101101100.11011101开始乘1011 中的倒数第二位相加01.001111011整体右移,是包括高位和低位00.100111101100.0000111011开始乘1011 中的倒数第三位0相加00.1001111011整体右移,是包括高位和低位00.0100111101100.11011111011开始乘1011 中的最后一个 1相加01.00011101011整体右移,是包括高位和低位00.100011111011 最后得到的高位+ 低位是 00.10001111 符号位有 x和y的符号位确定 ,0 异或 0 =0 最后 x*y = 0.10001111

大模型管理工具Ollama搭建及整合springboot

目录 一、Ollama介绍 1.1 什么是Ollama 1.2 Ollama特点与优势 二、Ollama本地部署 2.1 版本选择 2.2 下载安装包 2.3 执行安装 2.4 Ollama常用命令 三、使用Ollama部署千问大模型 3.1 千问大模型介绍 3.2 部署过程 四、springboot接入Ollama 4.1 引入Ollama依赖 4.2 添加配置文件 4.3 使用Ollama聊天api 五、写在结尾 一、Ollama介绍 1.1 什么是Ollama Ollama是一个用于部署和运行各种开源大模型的工具,能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。对用户来说,只需要通过执行几条命令就能在本地运行开源大模型,如Llama 2等。 官网地址:Ollama 1.2 Ollama特点与优势 Ollama具备如下特点和优势 功能齐全 Ollama将模型权重、配置和数据捆绑到一个包中,定义成Modelfile。它优化了设置和配置细节,包括GPU使用情况,从而提高了模型运行的效率。轻量级 Ollama的代码简洁明了,运行时占用资源少。这使得它能够在本地高效地运行,不需要大量的计算资源。此外,它还支持热加载模型文件,无需重新启动即可切换不同的模型,这使得它非常灵活多变。易用性 Ollama提供了多种安装方式,支持Mac和Linux平台,并提供了Docker镜像。用户只需按照安装指南进行操作即可完成安装,无需具备专业的技术背景。捆绑模型组件 它将模型权重、配置和数据捆绑到一个包中,称为 Modelfile,这有助于优化设置和配置细节,包括 GPU 使用情况。支持多种模型 Ollama 支持多种大型语言模型,如 Llama 2、Code Llama、Mistral、Gemma 等,并允许用户根据特定需求定制和创建自己的模型。跨平台支持 支持 macOS 和 Linux 平台,Windows 平台的预览版也已发布。安装过程简单,用户只需访问 Ollama 的官方网站下载相应平台的安装包即可。 二、Ollama本地部署 接下来演示如何在本地的windows系统上安装Ollama,根据你的实际情况,也可以选择Linux系统进行部署 2.1 版本选择 进入网站之后,点击右上角的 Download按钮,根据个人的实际情况,选择不同类型的安装包进行部署,我这里选择的是Windows的版本; 注意,Ollama部署的时候,对服务器或机器是有一定要求的,所以需要根据你的机器配置情况进行选择,在Ollama的官网通过github的链接点进去,可以看到如下的相关参数指导说明,在这里,你部署的大模型参数越多,理论上来说,对机器的配置要求就越高,目前先关注这一点即可。 2.2 下载安装包 这里选择下载的是windows版本

C++面试题其三

继续解答常见的C++面试题 继续上篇博客的解答,我们将进一步探讨C++中的一些关键概念和常见面试问题。 29. typedef和define的区别 typedef:用于为现有类型定义一个新的名字。typedef是编译时的操作,它提供了类型别名,可以提高代码可读性和维护性。typedef unsigned long ulong; #define:用于定义宏,它可以在预处理阶段进行文本替换,适用于常量、代码段等,但不具备类型检查。#define PI 3.14159 30. 引用作为函数参数以及返回值的好处 引用作为函数参数: 效率:避免了传值时的拷贝,提高了效率。修改原值:可以直接修改实参,允许函数改变调用者的变量值。传递大对象:适用于传递大对象,避免复制开销。 引用作为返回值: 返回修改后的值:函数可以返回内部变量的引用,从而允许调用者继续操作这个变量。链式操作:可以进行链式调用。 31. 纯虚函数 纯虚函数是一个没有实现的虚函数,声明方式为: virtual void functionName() = 0; 纯虚函数要求派生类必须提供具体实现,使得类不能实例化,成为抽象类。 32. 什么是野指针 野指针是指向已释放内存或未分配内存的指针,使用野指针会导致未定义行为,如程序崩溃或数据错误。避免野指针的方法包括初始化指针、及时置空和小心内存管理。 33. 线程安全和线程不安全 线程安全:代码在多线程环境下运行时,不会引发数据竞争和未定义行为,通常通过锁、互斥量等机制实现。线程不安全:代码在多线程环境下可能引发数据竞争,导致不可预测的行为和数据错误。 34. C++中内存泄漏的几种情况 未释放动态内存:分配的内存未被释放,如new没有对应的delete。循环引用:智能指针之间形成环状引用,导致内存无法释放。忘记释放资源:文件句柄、网络连接等资源未关闭。 35. 栈溢出的原因以及解决方法 原因:函数递归调用过深,局部变量过多,超过了栈的大小限制。解决方法:优化递归算法,减少递归深度,或者增大栈的大小限制。 36. C++标准库vector以及迭代器 vector:动态数组,提供随机访问和自动扩展功能。常用操作包括push_back、pop_back、size等。迭代器:用于遍历容器,提供了类似指针的接口。常见迭代器操作包括begin、end、++、--等。 38. C++中vector和list的区别 vector: 动态数组,支持随机访问。内存连续,插入和删除元素代价较高(需要移动元素)。 list: 双向链表,不支持随机访问。插入和删除元素代价低,只需调整指针。 39. C++中的基本数据类型及派生类型 基本数据类型:int、char、float、double、bool等。派生类型:包括数组、指针、引用、函数、类、结构体、联合体、枚举等。 40. 友元函数和友元类 友元函数:允许访问类的私有和保护成员的函数,在类中使用friend关键字声明。class MyClass { friend void myFriendFunction(MyClass&); }; 友元类:允许另一个类访问本类的私有和保护成员。class AnotherClass { friend class MyClass; }; 41. C++函数库中一些实用的函数 std::sort:对容器进行排序。std::sort(vec.begin(), vec.

如何在 Ubuntu 16.04 上为 Nginx 创建自签名 SSL 证书

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 TLS,即传输层安全协议,及其前身SSL,即安全套接字层,是用于将普通流量包装在受保护的加密包装中的网络协议。 使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部方拦截。证书系统还帮助用户验证他们正在连接的站点的身份。 在本指南中,我们将向您展示如何在 Ubuntu 16.04 服务器上为 Nginx web 服务器设置自签名 SSL 证书。 先决条件 在开始之前,您应该已经配置了一个具有sudo权限的非根用户。您可以按照我们的 Ubuntu 16.04 初始服务器设置指南来了解如何设置此类用户帐户。 您还需要已安装 Nginx web 服务器。如果您想在服务器上安装完整的 LEMP(Linux、Nginx、MySQL、PHP)堆栈,可以按照我们的 Ubuntu 16.04 上设置 LEMP 的指南进行操作。 如果您只想要 Nginx web 服务器,可以按照我们的 Ubuntu 16.04 上安装 Nginx 的指南进行操作。 完成先决条件后,请继续以下操作。 步骤 1:创建 SSL 证书 TLS/SSL 通过使用公共证书和私钥的组合来工作。SSL 密钥在服务器上保密。它用于加密发送给客户端的内容。SSL 证书与请求内容的任何人公开共享。它可用于解密由相关 SSL 密钥签名的内容。 我们可以使用 OpenSSL 一次性创建自签名密钥和证书对: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt 您将被要求回答一系列问题。在我们讨论这些问题之前,让我们看看我们正在发出的命令中发生了什么: openssl:这是用于创建和管理 OpenSSL 证书、密钥和其他文件的基本命令行工具。req:此子命令指定我们要使用 X.509 证书签名请求(CSR)管理。“X.

如何在 Ubuntu 12.04 VPS 上使用 MongoDB 创建分片集群

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 MongoDB 是一个 NoSQL 文档数据库系统,可以在水平方向上很好地扩展,并通过键值系统实现数据存储。作为 Web 应用程序和网站的热门选择,MongoDB 易于实现并可以通过编程方式访问。 MongoDB 通过一种称为“分片”的技术实现扩展。分片是将数据写入不同的服务器以分发读取和写入负载以及数据存储需求的过程。 在之前的教程中,我们介绍了如何在 Ubuntu 12.04 VPS 上安装 MongoDB。我们将以此为起点,讨论如何在多个不同节点上实现分片。 MongoDB 分片拓扑结构 分片通过三个单独的组件实现。每个部分执行特定的功能: 配置服务器:每个生产分片实现必须包含确切的三个配置服务器。这是为了确保冗余和高可用性。 配置服务器用于存储将请求的数据与包含该数据的分片相关联的元数据。它组织数据,以便可以可靠和一致地检索信息。 查询路由器:查询路由器是您的应用程序实际连接的机器。这些机器负责与配置服务器通信,以确定请求的数据存储在何处。然后从适当的分片中访问和返回数据。 每个查询路由器运行“mongos”命令。 分片服务器:分片负责实际的数据存储操作。在生产环境中,一个单独的分片通常由一个副本集而不是单个机器组成。这是为了确保在主分片服务器下线时数据仍然可以访问。 实现副本集超出了本教程的范围,因此我们将配置我们的分片为单个机器而不是副本集。如果您希望为自己的配置配置副本集,可以轻松修改此设置。 初始设置 如果您在上面注意到,您可能已经注意到此配置需要相当多的机器。在本教程中,我们将配置一个示例分片集群,其中包含: 3 个配置服务器(生产环境中必需)2 个查询路由器(至少需要 1 个)4 个分片服务器(至少需要 2 个) 这意味着您需要九个 VPS 实例才能完全跟随。实际上,一些功能可以重叠(例如,您可以在用作配置服务器的同一 VPS 上运行查询路由器),并且您只需要一个查询路由器和至少 2 个分片服务器。 我们将超过此最小值,以演示每种类型的组件的多个组件。为了清晰和简单起见,我们还将把所有这些组件视为独立的机器。 设置初始基础镜像 要开始,使用此指南在 Ubuntu 上安装和配置初始 MongoDB 服务器。我们将使用此服务器来引导我们的其他分片组件。 完成第一个服务器的教程后,使用以下命令关闭实例: sudo shutdown -h now 现在,我们将对此配置的 droplet 进行快照,并使用它来启动我们的其他 VPS 实例。虽然可能对运行中的系统进行快照,但关闭可以确保文件系统处于一致状态。快照费用为每月每 GB 0.05 美元,基于文件系统中使用的空间量,因此最好在完成后删除快照。 在您的 DigitalOcean 控制面板中,选择 droplet。单击“快照”选项卡。输入快照名称,然后单击“拍摄快照”: !DigitalOcean take snapshot

如何在 Ubuntu 14.04 上使用 Apache 配置 WebDAV 访问

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 WebDAV 是 HTTP 协议的扩展,允许用户在服务器上管理文件。有许多使用 WebDAV 服务器的方式。例如,您可以通过将 Word 或 Excel 文档上传到您的 WebDAV 服务器,与同事共享文件。您甚至可以通过简单地给他们一个 URL,与家人和朋友分享您的音乐收藏。所有这些都可以在他们不安装任何东西的情况下实现。 有许多方法可以管理远程服务器上的文件。WebDAV 相对于其他解决方案(如 FTP 或 Samba)具有几个优点。在本文中,我们将介绍如何配置 Apache 服务器,以允许来自 Windows、Mac 和 Linux 的本机 WebDAV 访问,并进行身份验证。 为什么选择 WebDAV? WebDAV 提供了几个优点: 在所有主要操作系统(Windows、Mac、Linux)上具有本机集成;无需安装第三方软件即可使用 WebDAV。支持部分传输。身份验证选择更多。由于在 HTTP 上,因此 NTLM、Kerberos、LDAP 等都是可能的。 根据您的情况,WebDAV 可能是您需求的最佳解决方案。 为什么选择 Apache? 有许多支持 WebDAV 的 Linux 上的 Web 服务器。然而,Apache 在那里拥有最符合 WebDAV 协议的实现。在撰写本文时,Nginx 和 Lighttpd 上的 WebDAV 可以工作,但只能部分工作。 先决条件 您需要一个 Ubuntu 14.04 服务器。 在开始之前,让我们首先创建一个具有 sudo 访问权限的用户。您可以以 root 身份运行命令,但由于安全问题,这并不被鼓励。如果您希望了解更多信息,可以参考一篇关于在 Ubuntu 14.04 上添加用户的优秀文章。

数据在内存中的存储<C语言>

导言 在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而解,所以本文将着重介绍,整数在内存中的存储、大小端字节序和判断、浮点数的存储。 整数在内存中的存储 这部分的内容在前面已经讲过,现在让我们来复习一下: 一个数的二进制表示方法有三种:原码、反码、补码 原码:直接将数转为2进制序列,得到的就是原码 反码:符号位不变,将其它位取反 补码:在反码基础上+1 在C语言中整数可分为有符号整数和无符号整数 有符号整数:有符号位(第一位),0为正、1为负 有符号整数:没有符号位,即全为正数。 在计算机内部存放的是补码,为啥是补码? 因为CPU只有加法器,在计算机内部,正数的补码是本身,负数补码符号位不变,其他位取反,存放补码可实现加减法的统一运算(不需要添加减法器): //在计算机内部存放的是补码,为啥是补码? int main() { int a = 9; //a的补码:00000000 00000000 00000000 00001001 int b = 4; //b的补码:00000000 00000000 00000000 00000100 int c = a - b; //c=a-b会被转化为c=a+(-b) // a的补码:00000000 00000000 00000000 00001001 //-b的补码:11111111 11111111 11111111 11111100 // c的补码 100000000 00000000 00000000 00000101 //相加结果多出一位,int型只有4字节、32位,高位抛弃 // c的补码: 00000000 00000000 00000000 00000101 //正数原反补相同,10进制数为5 printf("%d", c); return 0; } 运行结果:

从0开始制作微信小程序

目录 前言 正文 需要事先准备的 需要事先掌握的 什么是uniapp 平台应用的分类方式 什么是TypeScript 创建项目 项目文件作用 源码地址 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University of Nottingham Ningbo China📫 You can reach me by url below:My Blog Website: https://blog.yiming1234.cn My CSDN Blog: https://yiming1234.blog.csdn.netMy Email:Pleasure@yiming1234.cnMy Github:Pleasurecruise (自由的世界人) · GitHubIt's my pleasure to see you follow me! 原文地址:从0开始制作微信小程序 - Pleasure的博客 下面是正文内容: 前言 放暑假了,闲着也是闲着,开始捣鼓微信小程序,逐渐实现跨平台的统一... 由于数据类型的统一需要用到TypeScript,可能又要了解新的语言了...[捂脸] 正文 需要事先准备的 ①编程软件和环境:微信开发者工具,VScode或者WebStorm或者HBuilderX等编辑软件都可以 因为要使用Vue3所以要事先准备NodeJS环境这边就直接跳过了 微信开发者工具下载地址:https://servicewechat.com/wxa-dev-logic/download_redirect?type=win32_x64&from=mpwiki&download_version=1062405010&version_type=1

【C++】list的使用(上)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C++ 目录 前言🌈关于list🔥默认成员函数==构造函数(constructor)====析构函数(destructor)====赋值运算符重载== 🔥迭代器接口(Iterators)🔥容量获取接口(Capacity)==empty和size== 🔥元素获取(Element access)🔥修改器(Modifiers)==assign====push_back,pop_back,push_front和pop_front====insert====erase====resize====clear== 结语 前言 本篇博客主要内容:STL库中list的介绍以及list用法的讲解。 我们已经知道,string和vector的底层都是简单的顺序表,而list的底层就和之前的两个大不相同了,list的底层是一个带头双向循环链表。学习list之前,如果你还不知道什么是链表,完全由必要学习一下,可以看看我初阶数据结构所讲到的内容:初阶数据结构-顺序表和链表(C语言) 在C++中,我们可以直接使用list创建链表。 🌈关于list list是可以在常数范围内任意位置进行插入和删除的序列式容器,并且可以前后双向迭代。 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针向其前一个元素和后一个元素。 list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已经让其更简单更高效。 与其他序列式容器相比(array,vector,deque),list通常在任意位置进行插入,移除元素的执行效率更好。 于其他序列式容器相比,list和forward_list最大的缺陷是不支持元素的随机访问,比如:需要访问list的第六个元素,必须从已有的位置(比如头部或尾部)迭代到该位置,这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个结点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)。 🔥默认成员函数 构造函数(constructor) 注:对于最后一个参数(alloc),可以不用深究,在后期学了内存池相关的内容后会细讲。 构造一个list容器对象,可以根据以下四种方式初始化: default (1) explicit list (const allocator_type& alloc = allocator_type()); 这是std::list的无参构造。它创建了一个不含任何元素的空list对象。其中explicit关键字阻止了隐式类型转换。 fill (2) explicit list (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()); 构造一个含有n个val值得list对象。 range (3) template <class InputIterator> list (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()); 按迭代器区间[first, last) 的内容顺序构造list对象。

【uni-app】App与webview双向实时通信

【uni-app】App与webview双向实时通信 在 Uniapp 中,App 与 里面嵌入的 webview 进行双向的实时通信 vue2 , 模拟器 主要分为两部分 webview 向 app 发送信息 app 向 webview 发送信息 以下是实现方式,用一个例子来说明 (文章最后我会放这个例子的github地址) webview 向 app 发送信息 示例: webview 里面向 app 发送 图片的 base64 , app 保存图片到系统相册; 此处分为, app 和 webview 部分: app 注册事件 webview 触发 app 的事件 app部分 保存到系统相册功能(功能具体细节不重要) // utils/appMessageHandler.js // 这里代码都在app下执行 function appSaveImgFile(params) { const { base64, downloadName } = params const bitmap = new plus.nativeObj.Bitmap("test"); bitmap.loadBase64Data( base64, function () { const url = "

链表OJ题

文章目录 1. [链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking)2. [相交链表](https://leetcode.cn/problems/intersection-of-two-linked-lists/description/)3. 链表中倒数第k个结点4. [环形链表](https://leetcode.cn/problems/linked-list-cycle/description/)5. [环形链表 II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)6. [随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/) 1. 链表的回文结构 因为单链表不能从后往前找节点,所以我们先找到中间节点,然后逆置,最后进行比较。 #include <stdio.h> #include <stdbool.h> typedef struct ListNode { int val; struct ListNode* next; }ListNode; struct ListNode* middleNode(struct ListNode* head) { ListNode* slow, * fast; slow = fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } return slow; } struct ListNode* reverseList(struct ListNode* head) { if (NULL == head) { return head; } ListNode* n1, * n2, * n3; n1 = NULL, n2 = head, n3 = head->next; while (n2) { n2->next = n1; n1 = n2; n2 = n3; if (n3) { n3 = n3->next; } } return n1; } bool chkPalindrome(ListNode* A) { ListNode* mid = middleNode(A); ListNode* rmid = reverseList(mid); while (A && rmid) { if (A->val !

Java学习【String类详解】

Java学习【String类详解】 String的介绍及定义方式String类型的比较String类型的查找charAt()访问字符indexOf()查找下标 转化和替换数值和字符串转化大小写的转换字符串转数组格式化替换 字符串的拆分和截取split()拆分substring()截取trim()去除两边空格 StringBuilder和StringjoinerStringBuilderStringJoiner String的介绍及定义方式 String也就是字符串类型,并不是基本数据类型,String在Java中是一个类,属于引用数据类型 可以看出String类实现的接口和一些属性,既然是类,我们先去了解它的构造方法 可以看出,String类又很多构造方法,下面介绍一下常用的定义方法 直接赋值 String s1 = “hello”; 注意: 内存中其实还有一块专门用来存放字符串常量的区域,叫做串池,只有通过直接赋值的方式创建的字符串才会被存储到串池中,通过new关键字获取到的对象就不会存储在这里 当使用直接赋值的方式创建字符串时,系统会检查该字符串是否在串池中,如果有就复用,没有才会创建新的字符串 例如: String s1 = “hello”; String s2 = “hello”; 这s2会复用s1,它们的地址值相同,这样也就节省了内存 通过创建对象的方式赋值 String s2 = new String(“hello”); 传入char类型数组 根据上面的构造方法,String类型在创建对象时可以传入一个char类型数组 char[] chars = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; String s3 = new String(chars); 也可以传入一个byte类型的数组 byte[] bytes = {97,98,99}; String s1 = new String(bytes); System.out.println(s1);//输出abc 这里要注意,输出的是数组中ASCII码对应的字符 String类型的比较 String因为不是基本数据类型,所以不能用 > ,< 这些比较符比较,当用 " = " 比较引用数据类型时,比的是两边的地址值是否相同

Java-----String类

1.String类的重要性 经过了C语言的学习,我们认识了字符串,但在C语言中,我们表示字符串进行操作的话需要通过字符指针或者字符数组,可以使用标准库中提供的一系列方法对字符串的内容进行操作,但这种表达和操作数据的方法不太符合面向对象的思想,所以在Java中提供了String类。 2. 认识String类 在Java中,String类是一种存储字符串数据类型的类。在Java中,String类属于引用数据类型,由String类创建的对象里面存的是引用。 2.1 字符串构造 在Java中,字符串的构造有很多种方式,常用的就以下三种。 public class Test { public static void main(String[] args) { //使用常量直接构造 String s1="haha"; System.out.println(s1); //直接new String对象 String s2=new String("man"); System.out.println(s2); //使用字符数组进行构造 char[] array={'w','c','I','s'}; String s3=new String(array); System.out.println(s3); } } 运行代码 2.2 深刻认识String类 我们知道String类的对象里面存的是引用,那字符串的内容具体是存在哪里的呢? 上图是String类里面的一些具体细节,发现里面有一个char[ ] value数组,所以字符串就是存储在这个数组中。 String类的堆栈图 2.3 String类的比较 1. 用 == 比较 当我们用 == 进行String类的对象进行比较时,是比较对象里面存的引用的值。 public class Test { public static void main(String[] args) { String s1="man"; String s2=new String("man"); String s3=s1; System.

编程羔才生-前端访问后端出现read ECONNRESET

排查了原因后发现是node的版本太低的问题造成的,所以升级了下node版本,就好了! 基本按照这个顺序排,但node的版本问题却是最后一个解决办法,所以前面时间都浪费了。所以分享! 根据网路资料,解决顺序:(还是倒着来更快!) "read ECONNRESET" 错误通常表明发生了连接重置,这可能是由于网络问题、对端服务器关闭连接或其他一些网络层问题引起的。 这个错误可能出现在不同的上下文中,例如 Node.js、浏览器 JavaScript 等。以下是一些可能导致这个错误的原因和解决方法: 网络问题: 如果是在进行网络通信时出现这个错误,可能是由于网络问题引起的。请确保您的网络连接正常,没有中断或不稳定的情况。 服务器端关闭连接: 如果是与服务器通信时出现的错误,可能是服务器主动关闭了连接。这可能是由于服务器端的某种配置、限制或错误引起的。检查服务器日志以获取更多信息。 代理问题: 如果您使用代理进行网络请求,代理可能会导致连接重置。尝试绕过代理或更改代理设置,看看问题是否解决。 防火墙或安全软件: 防火墙或某些安全软件可能会干扰网络连接。检查您的防火墙设置,确保没有阻止您的应用程序进行网络通信。 Node.js 版本问题: 在 Node.js 中,某些版本可能会在网络请求中出现 ECONNRESET 错误。尝试升级或降级 Node.js 版本,看看问题是否得到解决。

HDTune和CrystalDiskInfo硬盘检测S.M.A.R.T.参数当前值最差值阈值

高亮颜色说明:突出重点 个人觉得,:待核准个人观点是否有误 高亮颜色超链接 文章目录 S.M.A.R.T.监控技术磁盘健康状态监测,硬盘检测硬盘检测工具 HD Tune硬盘检测工具 CrystalDiskInfo 当前值最差值阈值原始值的含义二级标题待补充待补充 开头提醒, 想不丢数据最重要的事情是备份。其次是保持良好的使用习惯,包括安全删除、将硬盘连接到供电稳定充足的USB接口(如台式机后置接口,不要插分线器)、存放硬盘时把数据线从硬盘接口上拔出来(防止接口受损接触不良)、使用硬盘时不要碰硬盘防止接触不良断电、机械盘轻拿轻放且不用时及时拔出等。 S.M.A.R.T.监控技术 9636:S.M.A.R.T. Monitoring 20100528 S.M.A.R.T.(Self-Monitoring, Analysis, and Reporting Technology)是一种大多数现代硬盘都支持的监控技术。利用该技术,可以对磁盘的各种内部和外部问题(如大量坏块、错误或启动/停止循环次数增加、气流温度上升等)进行监测,并及时向用户报告。S.M.A.R.T.可以报告一些可能会导致即将发生的硬盘故障和数据丢失的机电问题。其他参数指示磁盘将来可能出现的问题,不需要立即采取行动。 统计上,S.M.A.R.T.可以预测一半以上的硬盘故障,这使得这项技术成为关于当前硬盘状态的可靠信息来源。但无论如何,这种监视并不能取代为数据保持最新备份的必要性。备份存档将保护您免受多种情况下的关键数据丢失,例如硬盘逻辑损坏、物理损坏、破坏甚至硬件丢失等,这些是任何一种监控都无法预测的。 S.M.A.R.T.参数描述硬盘状态的具体方面——表面损坏、读/写错误、机电部件问题等。当某个关键参数的值变小时,硬盘故障的概率会增加30倍。这意味着在不久的将来可能会发生崩溃,您需要紧急更换硬件以避免重要数据丢失。 每个硬件制造商都支持自己的一组S.M.A.R.T.参数,这些参数也可能因磁盘型号而异。所有S.M.A.R.T.参数都有多个值,其中最重要的是: 原始值具有供应商指定的格式。硬盘监测工具使用一些参数的原始值来计算磁盘健康状况。归一化值由制造商转换,取值范围为1 ~ 253。该值在磁盘的生命周期内逐渐减小。当归一化值低于阈值(如果指定)时,通常被认为是潜在的危险情况(警告);阈值是由制造商设置的S.M.A.R.T.参数的最低可接受值。对于某些参数,可能不需要设置此值。当该参数低于“阈值”时,说明该硬盘处于危险状态,需要更换,需要紧急关注需要保护的数据。这是超出阈值条件的情况,因此这样的磁盘可以在保修期内退回给制造商。 在本页面(9636:S.M.A.R.T. Monitoring 20100528 )搜索框搜索"S.M.A.R.T."可以获知更多 S.M.A.R.T. Attributes 的含义。 SMART Parameters and Early Signs of a Failing Hard Disk - iFixit SMART 关键指标解析, 如何通过解读 SMART 信息预测硬盘故障_二手硬盘 smart 187-CSDN博客 20190315 S.M.A.R.T.有非常多的属性,并且各个属性的意义不尽相同,并且其判断方式也不进相同,那么应该选取哪几个属性值进行监控并判断呢? 这里可以参照著名的备份厂商 backblaze 的文章 Hard Drive SMART Stats 20141112 中的建议,backblaze 建议主要监控以下五个属性的 RAW_VALUE 的值: SMART 5 – Reallocated_Sectors_Count.

【机器学习】基于YOLOv10实现你的第一个视觉AI大模型

目录 一、引言 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO 2.2 YOLO的网络结构 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 3.1.2 创建conda环境 3.1.3 下载并编译依赖 3.2 YOLOv10模型推理 3.2.1 模型下载 3.2.2 WebUI推理 3.2.3 命令行推理 3.2.4 推理格式转换 3.3 YOLOv10模型训练 四、YOLOv10实战:20行代码构建基于YOLOv10的实时视频监控 五、总结 一、引言 人工智能的终极形态,应该就是“具身机器人”——像人一样有眼睛(视觉)、耳朵(听觉)、嘴巴(语言)、舌头(味觉)、鼻子(嗅觉)等器官,味觉、嗅觉目前没有大的进展,视觉、听觉、语言能力在科学界与工程界已经取得重大突破: 视觉模型:YOLOv10、LLaVA、Qwen-VL等大语言模型的Vision版本听觉模型:TTS(文字转语音)、Whisper(ASR,语音转文字)语言模型:GPT4、LLaMA、Qwen、文心一言等等大语言模型 今天我们讲一下最近大火的YOLOv10(You Only Look Once v10),由清华大学5月23日发布,比YOLOv9在相同性能下延迟减少了46%,参数减少了25%。 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO YOLO(You Only Look Once)是基于深度神经网络的目标检测算法,用在图像或视频中实时识别和定位多个对象。YOLO的主要特点是速度快且准确度较高,能够在实时场景下实现快速目标检测,被广泛应用于计算机视觉领域,包括实时视频分析、自动驾驶、智能医疗等。 在YOLO出现前,主流算法为R-CNN,可以称之为“二阶段算法”:先锚框,再预测框内的物体。YOLO出现后,可以“一阶段”直接端到端的输出物料和位置。 一阶段算法:模型直接做回归任务,输出目标的概率值和位置坐标。例如:SSD, YOLO,MTCNN等二阶段算法:首先生成多个锚框,然后利用卷积神经网络输出概率值和位置坐标。例如:R-CNN系列 2.2 YOLO的网络结构 YOLOv10是YOLOv8的改进,这里简单看一下YOLOv8的网络结构: 图片来源:yolov8网络结构详解(逐行解析)_yolov8网络架构-CSDN博客 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 git clone https://github.com/THU-MIG/yolov10.git 3.1.2 创建conda环境 conda create -n yolov10 python=3.9 conda activate yolov10 3.

AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7:Function Calling技术实战自动生成函数 AI大模型探索之路-实战篇8:多轮对话与Function Calling技术应用 AI大模型探索之路-实战篇9:探究Agent智能数据分析平台的架构与功能 AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础 AI大模型探索之路-实战篇11: Function Calling技术整合:强化Agent智能数据分析平台功能 目录 系列篇章💥一、前言二、引入背景知识库1、定义OpenAI客户端2、定义工具函数生成器3、两次大模型API调用封装4、user_demographics数据查询服务封装5、user_demographics函数信息生成测试6、第一次数据查询对话测试7、读取数据字典8、第二次数据查询对话测试9、数据库基本信息查询测试10、数据分析调用测试 三、实现交互确认1、定义数据库基本信息获取函数2、函数信息生成测试检查:3、数据分析测试4、定义SQL提取函数5、两次次大模型API两次调用封装改造6、定义消息列表7、数据查询分析测试18、数据查询分析测试29、数据查询分析测试3 四、实现完整的多轮对话效果五、结语 一、前言 在Agent智能数据分析平台的实战开发中,继我们之前关于Function Calling技术整合的讨论之后,本文将专注于实现一个核心功能——多轮对话控制系统。这一机制能够让用户通过自然语言与系统进行连续的交流,从而更准确、更高效地完成数据分析任务。 二、引入背景知识库 引入数据字典知识,作为大模型对话的背景知识库。 1、定义OpenAI客户端 定义大模型客户端,用于与大模型交互对话 import openai import os import numpy as np import pandas as pd import json import io from openai import OpenAI import inspect import pymysql openai.api_key = os.getenv("OPENAI_API_KEY") client = OpenAI(api_key=openai.api_key) 2、定义工具函数生成器 定义一个函数,用于自动生成function calling功能需要的,工具函数信息体 def auto_functions(functions_list): """ Chat模型的functions参数编写函数 :param functions_list: 包含一个或者多个函数对象的列表; :return:满足Chat模型functions参数要求的functions对象 """ def functions_generate(functions_list): # 创建空列表,用于保存每个函数的描述字典 functions = [] # 对每个外部函数进行循环 for function in functions_list: # 读取函数对象的函数说明 function_description = inspect.