【STM32】FreeRTOS软件定时器学习

软件定时器 FreeRTOS提供了现成的软件定时器功能,可以一定程度上替代硬件定时器,但精度不高。 实验:创建一个任务,两个定时器,按键开启定时器,一个500ms打印一次,一个1000ms打印一次。 实现:在【STM32】FreeRTOS事件组学习基础上修改。 /* USER CODE END Variables */ osThreadId Task1Handle; osTimerId myTimer01Handle; osTimerId myTimer02Handle; /* Create the timer(s) */ /* definition and creation of myTimer01 */ osTimerDef(myTimer01, Callback01); myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL); /* definition and creation of myTimer02 */ osTimerDef(myTimer02, Callback02); myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerPeriodic, NULL); /* USER CODE BEGIN RTOS_TIMERS */ 上面的代码是CubeMX封装好的。 下面编写自己需要的任务代码。 第一步:修改记数周期 /* start timers, add new ones, ... */ xTimerChangePeriod(myTimer01Handle,500,200); xTimerChangePeriod(myTimer02Handle,1000,200); 第二步:按键任务

C语言入门 第一弹 一个简单的计算器

程序源代码 #include <stdio.h> int main() { char op; double num1, num2; printf("请输入第一个数字:\n"); scanf("%lf", &num1); printf("请输入运算符(+、-、*、/):"); scanf(" %c", &op); printf("请输入第二个数字:\n"); scanf("%lf", &num2); switch(op) { case '+': printf("%.2lf %c %.2lf = %.2lf\n", num1, op, num2, num1 + num2); break; case '-': printf("%.2lf %c %.2lf = %.2lf\n", num1, op, num2, num1 - num2); break; case '*': printf("%.2lf %c %.2lf = %.2lf\n", num1, op, num2, num1 * num2); break; case '/': if(num2 == 0) { printf("

zotero 使用方法

zotero 使用方法总结 前言: zotero 免费开源,功能强大,插件丰富,使用方便。zotero支持多种方式导入文件包括直接拖拽pdf导入文档、DOI、arXiv号或从剪切板导入,同时能够使用sci-hub(文献下载神器)下载参考文献,还可以通过第三方云盘进行备份和同步,非常方便,因此在这里总结自己的使用方法以供参考。 1. 下载安装Zotero zotero官方下载网址安装方法和普通软件相同,一路点击,选择 安装目录,再安装即可。 2. 下载安装插件 茉莉花(Jasminum)(下载caj时转换成pdf,需要pdftk serve)zotero connector(必装,从网页上抓取文献)Zotfile(批量重命名)zotero SCIHub(自动从sci-hub下载论文)better BibTex(导出Bib格式)PDF-tranlaste(划词翻译)DOI manager(获取文献DOI)Zotero PDF preview(预览pdf)Markdown here(支持markdown)zotero better note(用笔记做思维导图)PDFtk server(帮助操作pdf文件,配合茉莉花使用)zotero reference (获取论文里的参考文献,可以加入文库中)官方插件网址,不一定齐全,可以自行网上找。也可以在zotero中文社区中下载插件,具体可以参考zotero插件中文仓库。 3. 导入文献: 支持从其他文献管理软件如endnote(xml格式)等导入拖拽pdf到zotero支持DOI、arXiv ID、PMID或ISBN导入zotero connector支持自动识别网页并导入可以复制Bibtex参考文献,然后选择 【文件 -->从剪切板导入】 导入到文库中 4. 文献阅读和做笔记 导入文献后,会形成一个个条目,有关文献和附件都会在条目下,打开可以查看pdf文献。 去重:当导入的文档有重复时可以采用去重来避免混乱。 在工作区选择 重复条目,可以看到重复的文献,然后点击一个条目,在最右侧可以看到合并选项,这个是按照时间排序的,如下图。左侧是条目不一定是时间排序,要跟添加时间进行确认。 删掉的条目会移动的回收站,误删的话可以去回收站找回。 zotero自带pdf阅读器,功能比较简单,但是做笔记基本够用。包括高亮、笔记、选取区域和颜色。 安装插件后,选中单词和句子即可自动翻译 选择颜色进行高亮,高亮文本会在左侧保存成笔记,可以添加标签。高亮无法添加笔记,但是双击高亮文本可以编辑,与笔记效果相同。 选择区域可以添加评论,即笔记。 笔记可以整理和导出。 5. 参考文献格式【GBT 7714】 官方自带很多模板,可以搜索需要的格式模板。同时可以安装从网上下载的模板(cls格式文件),或者自定义模板。国内很多会用GB/T 7714,有时会导致中英文作者超过3个后都会显示为“等”的问题,修改方法参考:(Zotero修改英文文献的“等”为“et al”_陈嘿萌的博客-CSDN博客) Note:如果英文不能正确识别,还是会显示为“等”,将文献信息中国的语言属性改成“en”即可正确识别,再次感谢博客作者。 6. 插入参考文献 插入参考文献时需要保持zotero打开状态 打开word文档,会显示zotero加载项,如果没有的话,请在word 文件-选项-加载项中打开。下面1表示在文档中插入引用,2表示在光标位置处插入参考文献详细信息,3可以选择引用的格式,4为刷新,5为断开连接。当确定文档完成后就可以断开zotero连接,断开连接后再插入参考文献不会自动更新,建议备份。 在插入引用(上面图像中1)时,会弹出方框,搜索要插入的文献,建议选择经典模式(在首选项–引用中设置,如图),可以选择或搜索文献。单一来源只能选择一条文献,多于一条时会选择最后一条;当引用多于1条文献时,要选择多重来源,选好以后,可以调整文献顺序,然后点击确定就可以插入文献了。 7. RSS订阅 zotero支持期刊RSS订阅。在新建订阅中,选择来自URL(我用的这种,也可以选择OPML),然后在URL中添加订阅网址即可,如下图。 如何找到RSS订阅网址 首先找到期刊,例如IEEE Transaction on Instrumentation and measurement, 如下图。然后找的RSS订阅标志,类似wifi的标志。鼠标点击后,可以打开一个网址,里面是一些英文,然后将网址复制(格式为xxx.XML)到上一步中的URL处,保存即可。然后工作区会出现订阅的期刊,点击会出现本期文章。

SSL certificate problem: unable to get local issuer certificate解决办法

在github上用https克隆代码时报了如下错误 fatal: unable to access 'https://github.com/xiaogao67/gin-cloud-storage.git/': SSL certificate problem: unable to get local issuer certificate 这是由于当你通过HTTPS访问Git远程仓库的时候,如果服务器上的SSL证书未经过第三方机构认证,git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。解决办法就是通过下面的命令将git中的sslverify关掉: git config --global http.sslverify false 然后在执行克隆操作就成功了。

rollup工具打包报错问题汇总

1. (!) `this` has been rewritten to `undefined` 原因:这是因为打包后没有给this指向window,导致this undefined,因此需要配置context参数来指定代码执行环境的参数为window 解决:rollup.config.js文件中添加配置 module.exports = [ { input: 'src/index.ts', output: [ ... ], // 用来指定代码执行环境的参数,解决this执行undefined问题 context: 'window' } ];

Java-基础数据类型在内存中存储方式

首先8bit=1byte,内存地址一般以16进制表示(另:书面上的存储位置一般以h结尾,问就是我刷题刷到了) 1. 常量存储 存在JVM虚拟栈区,一般在栈帧的的局部变量区域,基本固定类型 序号数据类型数据名称字节(byte)位数(bit)默认值取值范围取值范围举例说明1byte位180-2^7,2^7-1-128~127byte b=102short短整数2160-2^15,2^15-1’-32768~32767short s=103int整数4320-2^31,2^31-1-2147483648~2147483647int i=104long长整数8640-2^63,2^63-1‘-9223372036854774808~9223372036854774807long l=10L5float单精度4320.0-2^31,2^31-1-2147483648~2147483647float f=10.0f6double双精度8640.0-2^63,2^63-1‘-9223372036854774808~9223372036854774807double d=10.0d7char字符216空0,2^16-10~32767char c='c'8boolean布尔值18FALSEtrue,falseboolean b=false 2. 字符串对象存储 但是生成的字符串变量存储在栈帧中局部变量的位置,如果是new字符串生成的对象,则存放在堆区。

Unity框架学习--资源管理器

资源加载方案 1、Inspector窗口拖拽 在脚本中用public声明变量,然后在Inspector窗口把要加载的资源拖拽给该脚本的变量。 不建议在大型项目使用。在公司的项目也不要用。 如果你是独立游戏开发者,则可以用。 不支持热更新。 2、Resources 用Resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。 可以在商业项目使用,包括公司的项目。但是Resources文件夹中可以存放的资源有限,大概只能存储2G左右的资源,因此要谨慎使用。 不支持热更新。 3、AssetBundle 用AssetBundle.LoadFromXXX方法来加载资源。 商业项目常用的资源加载方案,如果你在公司做项目,则推荐用这种方式来加载资源。 效率比Resources加载高,占用内存小,正式发布游戏后,资源所占用的空间也小。 支持热更新。 4、Addressables(可寻址资源系统) 可以理解为高级的AssetBundle,资源管理由Unity内部自动完成。 但是目前还在发展中,可能有bug。主流的商业游戏都是使用AssetBundle来做资源加载的。 支持热更新。 5、AssetDatabase 用AssetDatabase.LoadAssetAtPath方法来加载资源。 仅限于编辑器模式,主要用于在编辑器模式下用代码更改本地文件。 游戏运行时不会用这种方案加载资源。 不支持热更新。 Resources 动态加载资源 使用前必须在项目中创建一个名叫Resources的文件夹,这个名字是固定的。 在一个项目可以创建多个名叫Resources的文件夹,它们可以放在Assets文件夹中的任意位置,使用Resources的方法加载时,将对每个Resources文件夹进行查找。 注意:如果一个项目中有多个Resources文件夹,则应确保里面的文件的相对路径不重复,如果重复,则使用Resources.Load方法加载时,只会加载找到的第一个该名字的文件。 在同一个文件夹中,文件名不要重名,如果实在要重名,则加载时要使用泛型加载指定的类型。 使用Resources.Load或者Resources.LoadAll加载时,路径是从Resources文件夹里面的文件夹开始的,例如Resources文件夹里有一个Audio文件夹,Audio文件夹里面也有一个Music文件夹,Music文件夹有一个叫做Song的.mp3文件,则路径是"Audio/Music/Song" 路径中的文件名末尾一定不要写后缀,写了后缀反而加载不成功。 路径可以用反斜杠来写。"Audio/Music/Song"可以写成: "Audio\\Music\\Song" 或者 @"Audio\Music\Song" 不建议路径用反斜杠来写,建议统一都用正斜杠来写。 Resources.Load(string 要加载的资源的路径) 返回值是Object型。 同步加载Resources文件夹中的资源。 如果有多个相同路径的资源,则只会返回找到的第一个资源。 Resources.Load(string 要加载的资源的路径, System.Type 要加载的资源的类型的Type对象) 返回值是Object型。 同步加载Resources文件夹中的指定类型的资源。 如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。 或者使用函数重载指定类型: GameObject go = Resources.Load("Prefabs/Cube",typeof(GameObject)) as GameObject; Resources.Load<要加载的资源的类型>(string 要加载的资源的路径) 返回值是要加载的资源的类型。 同步加载Resources文件夹中的指定类型的资源。 如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。 Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径) 返回值是Object[]型。 同步加载Resources文件夹中指定路径的文件夹中的所有资源,包括其中子孙文件夹中的所有资源,然后返回到一个Object[]型数组。 如果该路径是一个文件,则只会加载该文件,并返回到一个Object[]型数组。 如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。 Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径,System.Type 要加载的资源的类型的Type对象)

计算机毕业设计springboot社区疫情防控管理系统372989[附源码]

本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。 系统的选题背景和意义 选题背景: 随着全球范围内新型冠状病毒的爆发,疫情防控成为当今社会最重要的议题之一。在这样的背景下,开发一款基于Spring Boot的社区疫情防控管理系统具有重要意义。该系统旨在通过信息化手段提供高效、准确的疫情数据管理和防控措施推广,以支持社区居民和相关部门在疫情期间的工作和生活。 选题意义: 首先,社区疫情防控管理系统能够提供实时、准确的疫情数据分析和监测功能。通过采集和整理社区居民的健康信息、疫情数据等关键信息,系统可以生成可视化的数据报表和图表,帮助相关部门了解疫情动态,及时制定相应的防控策略。 其次,该系统还能够提供便捷的疫情信息发布和宣传渠道。社区居民可以通过系统获取最新的疫情通报、防护知识、政府政策等相关信息,从而增强对疫情的认知和防范意识。同时,系统也可以提供在线咨询和问答功能,解答居民对疫情防控的疑问,提供科学、权威的建议。 此外,社区疫情防控管理系统还可以实现疫苗接种预约和记录管理。系统可以整合疫苗接种点的资源信息,为居民提供在线预约服务,并记录每个居民的接种情况,方便相关部门进行疫苗供应和接种进度的监管和统计。 综上所述,开发一款基于Spring Boot的社区疫情防控管理系统对于加强社区疫情防控工作、提高社区居民的防护意识和行动能力具有重要意义。 以上选题背景和意义内容是根据本选题撰写,非本作品实际的选题背景、意义或功能。各位童鞋可参考用于写开题选题和意义内容切勿直接引用。本作品的实际功能和技术以下列内容为准。 技术栈: 前端Vue:用于构建交互式用户界面。 后端Java开发语言:使用Java作为后端开发语言。 Spring Boot框架:作为快速开发框架,替代了SSM框架,提供自动配置、快速构建等功能。 MySQL 5.7数据库:用于数据存储和管理。 使用Spring Boot,你可以通过依赖管理和自动配置来减少手动配置工作,并使用Spring框架的各种功能,如依赖注入、面向切面编程等。同时,Spring Boot还提供了用于构建RESTful API、集成测试和部署的工具和插件,使得开发过程更加高效和便捷。 系统用例分析 社区疫情防控管理系统综合网络空间开发设计要求。目的是将社区疫情防控管理从传统管理方式转换为在网上管理,完成社区疫情防控管理的方便快捷、安全性高、交易规范做了保障,目标明确。社区疫情防控管理系统可以将功能划分为管理员功能和用户功能。 (1)、管理员关键功能包含个人中心、用户管理、健康上报管理、请假外出管理、行程上报管理、核酸检测点管理、核酸预约管理、疫苗接种点管理、接种预约管理、出入登记管理、疫情资讯管理、交流论坛、留言板、系统管理等进行管理。管理员用例如下: 图3-1 管理员用例图 (2)、用户关键功能包含首页、交流论坛、公告资讯、留言板、后台管理、个人中心等进行操作。用户用例如下: 图3-2 用户用例图 3.5系统流程分析 3.5.1用户登录流程 要想利用这个软件来进行系统的安全管理,首先需要登录到该软件中。如图3-3所示。 图3-3登录流程图 3.5.2添加信息流程 管理员可以添加信息,用户添加可以自己权限内的信息。添加信息流程如图3-4所示。 图3-4添加信息流程图 3.5.3修改信息流程 管理员可以修改社区疫情防控信息,用户可以修改自己权限内的信息,首先进入修改信息界面,输入需要修改信息,在系统进行判定为正确和合规后修改成功,并将数据更新至数据库。信息不合法则修改失败,重新输入。修改信息流程图如图3-5所示。 图3-5修改信息流程图 3.5.4删除信息流程 管理员可以删除社区疫情防控信息,点击删除按钮,系统会提示是否删除信息,点击确定,则信息被删除,数据库中的信息随之删除,删除信息流程图如图3-6所示。 图3-6删除信息流程图 3.6本章小结 基于springboot的社区疫情防控管理系统从市场、技术、经济、功能等方面分析了系统的功能需求,可以满足用户的社区疫情防控管理需求,帮助用户安全、高效地找到需要的社区疫情防控信息,因此有必要对其进行课题研究。 第4章 系统设计 系统设计是将被设计对象划分为单个模块进行构建,各个模块相互支持,相互制约,它们的组合是一个完整的系统。通过系统设计,可以最大限度地满足系统的预期目标,明确软件开发的目的。 4.1系统基本结构设计 本次系统采用springboot框架集进行开发,springboot框架是一款企业界主流的软件开发框架,其简化了开发流程,大大缩减了软件开发所需的时间提高了软件的响应速度。系统总体结构图如图4-1所示。 图4-1 系统总体结构图 4.2数据库设计 数据库结构设计的好坏直接影响到社区疫情防控管理系统的效率和实现的效果。本系统的数据库采用MySQL数据库,MySQL是一种开放源代码的关系型数据库管理系统,使用最常见的数据库管理语言SQL进行数据库管理。 4.2.1数据库E-R图设计 E-R图也可称为实体-联系图,其可以清楚的显示实体与实体之间的关系,是描述概念模型的有效方式,通过各实体间的关系方便数据库结构的设计。以下是本系统主要的实体属性图如下所示。 用户实体如图4-2所示。 图4-2用户实体属性图 健康上报实体如图4-3所示。 图4-3健康上报实体属性图 核酸预约实体如图4-4所示。 图4-4核酸预约实体属性图 核酸检测点实体如图4-5所示。 图4-5核酸检测点实体属性图 疫情资讯实体如图4-6所示。 图4-6疫情资讯实体属性图 系统实现 系统实现章节的主要内容是将系统分析和系统设计方案进行实现,按照各个系统角色进行功能介绍,系统实现就是一个真正开始编写的阶段,将前面的分析结果以及设计方案进行实现,最终做出一个符合用户需求的软件系统。

python的交互式库Qgrid

目录 Qgrid介绍Qgrid使用Qgrid使用过程中遇到的问题解决方案 Qgrid介绍 在Jupyter notebook中直接读取DataFrame数据,只显示为静态表格的形式,没有类似于excel的筛选等交互式功能。Qgrid作为 Jupyter notebook 组件,可以为我们的 DataFrame 添加交互属性。 普通的DataFrame数据 Qgrid显示的DataFrame数据 Qgrid使用 如何使用Qgrid呢?非常简单,只需要加载qgrid这个模块即可。 # 直接读取DataFrame数据 import pandas as pd df = pd.read_excel('tips.xls') df.head() 显示结果如下: # qgrid读取DataFrame数据 import qgrid qgridframe = qgrid.show_grid(df, show_toolbar = True) qgridframe 显示结果如下: 可以实现数据的筛选、复制、删除和排序,交互式效果更加利于数据初步探索分析。 Qgrid使用过程中遇到的问题解决方案 1)运行qgrid的代码却不显示结果,也不报错 原因在于没有在Jupyter notebook没有安装qgrid插件,在Anaconda Prompt中运行代码: jupyter nbextension enable --py --sys-prefix qgrid 运行成功没有报错再次运行代码即可显示交互式表格。 2)安装插件报错 PermissionError: [Errno 13] Permission denied: ‘D:\anaconda\etc\jupyter\nbconfig\notebook.json’ 原因在于权限访问受限,解决方案为通过管理员权限打开Anaconda Prompt,再次安装插件即可

带你掌握Stable Diffution商业级玩法

课程介绍 学习地址 《Stable Diffusion商业级玩法》通过详细讲解AI绘画技巧、实操演示和个性化指导,帮助您从零基础成为绘画高手,帮助您有效推广产品或服务,提升市场份额。教您掌握稳定扩散绘画技巧,开启艺术创作新篇章。

常用liunx命令

作者写这篇文章,只为记录一些自己办公时常用的Linux命令。后续会持续补充。 1、删除命令 删除文件夹 :rmdir 名称 删除文件:rm 名称 批量删除带有文件的文件夹:rm -rf 名称 模糊删除:rm i* 可以结合* 模糊删除rm -rf demo*可以删除所有以demo开头的文件 参数: -f 强制删除 -i默认删除方式,交互式删除会询问你是否删除 -r递归删除(删除文件夹) -rf强制递归删除 等价于 -r -f 2、添加命令 添加文件夹:mkdir 名称 添加文件:touch 名称 3、上传文件 rz 4、下载文件 wget 文件路径/文件名称 sz 文件名称 5、文件复制 cp 文件路径和名称 复制到路径 6、查看日志文件 tail -f 日志文件 cat 日志文件 7、jar包的解压 jar -xvf 解压包.jar 8、jar包的压缩 在jar 解压缩的目录下 输入 jar cvf0M name.jar ./ 9、文件的移动(一个文件移动到另一个文件夹方法) mv 文件名 目标文件夹路径 10、文件的复制(一个文件复制到另一个文件夹方法) cp -r "文件名" "目标文件夹路径" 11、修改文件名称 mv 源文件名称 修改后的名称 12、对.

五分钟 了解 Less 及使用

一、什么是Less预处 CSS预处理定义了一种新的语言;其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。 使用CSS预处理器语言,可以有让CSS更加简洁、适应性更强、可读性更佳,更易于代码的维护等诸多好处。 Less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS文件,只有在被编译后才能够被浏览器识别使用 二、预处理编译工具Koala koala是一个前端预处理器语言图形编译工具,支持LesS、SassCompass、CoffeeScript,帮助web开发者更高效地使用它们进行开发。跨平台运行,完美兼容windows、linux、mac。 这个工具会将less 转换输出成 css 官网地址:Koala - a gui application for LESS, Sass, Compass and CoffeeScript compilation. 基本介绍 设置中文 模板介绍 如何使用 添加项目 输出文件 注意事项 1、可以关闭自动保存功能 2、less文件名也不要和其他css重名 自动解析出来的css文件会以less 文件名字相同,如果重名那么生成的css文件就会重名 三、Less语法 本案例的html部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./css/reset.css"> </head> <body> <div class="box">这是一段文字</div> <div class="wrap"> <h3>title</h3> <div class="con"> <h3>title</h3> <p>段落文本</p> <p>段落文本</p> <p>段落文本</p> </div> <p>段落 <a href="

面试必备:Nginx的20道高频面试题合集(2023最新)

文章目录 一、关于Nginx二、写本篇文章的目的三、Nginx核心面试知识点20题3.1 Nginx和Apache有什么区别3.2 如何安装Nginx3.3 Nginx有哪些配置文件?3.4 Nginx有哪些命令,如何重载Nginx配置文件?3.5 如何将Nginx设置为反向代理服务器?3.6 Nginx可以用于负载均衡吗?如何实现?3.7 如何限制特定IP地址或IP地址段的访问?3.8 Nginx如何启用HTTPS(SSL/TLS)支持?3.9 Nginx如何处理静态文件和动态请求?3.10 Nginx如何实现URL重写?3.11 Nginx的工作流程是什么?3.12 Nginx可以缓存静态文件吗?如何配置缓存?3.13 Nginx可以进行内容压缩吗?如何配置?3.14 如何查看Nginx的日志文件?3.15 如何限制同时连接到Nginx的客户端数量?3.16 如何限制某个URL的访问速率?3.17 如何实现HTTP重定向?3.18 如何防止DDoS攻击?3.19 Nginx如何通过IP获取所在国家及地理位置?3.20 Nginx如何监控性能? 四、总结 一、关于Nginx Nginx是一个开源的高性能的Web服务器和反向代理服务器。其主要特点包括高性能、高并发处理能力、低内存消耗、事件驱动架构、模块化设计以及良好的可靠性和稳定性。它可以处理数千个并发连接,适用于大规模的互联网应用、负载均衡、反向代理以及静态资源缓存等场景。 Nginx通过使用异步非阻塞的事件驱动模型,有效地避免了传统Web服务器中一个线程只能处理一个请求的缺点。这使得Nginx在高并发情况下能够迅速响应并处理大量的请求。 二、写本篇文章的目的 ⭐最近我在做一个PHP专栏的面试大集合,Nginx是其中非常重要的一部分,Nginx是目前最流行的Web前端服务器。对于后端、运维、前端都是必须掌握的知识,学会Nginx已经成为一种必须的技能。 Nginx本身作为服务中间件,有非常明显的优势和特点,学习好它也是非常有助于我们技术视野的提升,前一段时间我大量研究了关于Nginx的面试内容,今天将核心高频的20道面试题整理出来,分享给各位粉丝,读者以及朋友们。 ⭐⭐⭐先收藏,再浏览。⭐⭐⭐ 三、Nginx核心面试知识点20题 3.1 Nginx和Apache有什么区别 Nginx和Apache是两种常见的Web服务器软件,它们在一些方面有着明显的区别。以下是Nginx和Apache的一些主要区别的表格描述: 区别NginxApache处理方式事件驱动多线程内存消耗低高并发连接高适中静态文件处理能力高适中可用模块少丰富配置灵活性较高较高模块加载方式动态加载静态/动态加载主要应用场景高并发环境、反向代理、负载均衡一般网站、动态内容 具体的特性和性能还取决于实际的配置和使用场景。不过目前来说,Nginx已经成为绝对的主流。 3.2 如何安装Nginx 下面给出在CentOS上面的安装方式。 第一步:更新系统软件包 首先,需要确保系统中的软件包是最新的。打开终端,并使用以下命令执行系统软件包更新: sudo yum update 第二步:安装EPEL存储库 Nginx在CentOS默认软件源中不可用,但可以通过EPEL存储库来获取。使用以下命令安装EPEL存储库: sudo yum install epel-release 第三步:安装Nginx 执行以下命令以安装Nginx: sudo yum install nginx 第四步:启动Nginx服务 安装完成后,可以使用以下命令启动Nginx服务: sudo systemctl start nginx 要检查Nginx是否已成功启动,请使用以下命令: sudo systemctl status nginx 3.3 Nginx有哪些配置文件? Nginx具有以下几个重要的配置文件,它们各自位于不同的文件夹下面,具体的配置文件和文件夹路径可能因Nginx版本、操作系统以及自定义设置等因素而有所不同。下面提到的路径是在Linux系统上使用默认安装路径时的常规配置。

NginxWEBUI框架RCE任意命令执行漏洞深度分析(含Poc和EXP)

一 影响范围 nginxWebUI <= 3.5.0 二 漏洞原理 Payload: http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令(需要经过url编码) 2.1 AppFilter过滤器 框架内所有流量均经过AppFilter过滤器进行过滤,相关代码如下 可以看到在这里doFilter过滤器过滤了相关含有"/adminPage"的请求,但是与Poc中的不同,此过滤器并没有过滤大小写不一样的,含有"AdminPage"的请求(ADMINPAGE等同理)。那按理说请求到的路径也应该是AdminPage,为什么使用AdiminPage也会转到adminPage一样的请求上呢? 2.2Spring中@RequestMap的机制 在spring中,经常使用requestmap+controller的方式去获取请求路径,但是这里的请求路径是不区分大小写的,也就是说,你请求AdminPage和请求adminPage是一样的! 三 Poc分析 3.1参数走向 都说到这里了,Poc分析也就是这样了 http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令(需要经过url编码) 相关的请求通过AppFilter过滤器,由confController处理相关命令 可以看到当请求runCmd接受后,并没有再去判断这个请求是否合法,并将结果转化为JSON串直接返回给了前端。 3.2 漏洞修复 官方已经在最新版的NginxWEBUI修复了这一漏洞,相关的修复代码如下 在confController层的修复代码如下 @Mapping(value = "runCmd") public JsonResult runCmd(String cmd, String type) { if (StrUtil.isNotEmpty(type)) { settingService.set(type, cmd); } // 仅执行nginx相关的命令,而不是其他的恶意命令 if (!isAvailableCmd(cmd)) { return renderSuccess(m.get("confStr.notAvailableCmd")); } try { String rs = ""; if (SystemTool.isWindows()) { RuntimeUtil.exec("cmd /c start " + cmd); } else { rs = RuntimeUtil.

Visual Studio 配置远程调试

1.在Visual Studio安装目录中找到远程调试工具(msvsmon.exe)。 2.将x64文件夹压缩成压缩包,然后拷贝到客户机 3.将pdb文件拷贝到客户机上版本对应的文件夹中。 4. 启动Visual Studio开始进行远程调试 选择“调试”> “附加到进程”

【STM32】FreeRTOS事件组学习

事件组(Event Group) 一个任务执行之前需要经过多个条件进行判断,当条件全部满足或多个条件中的某一个条件满足才执行。 实验:创建两个任务,一个事件组,当按键一二三都按过一遍才打印。 实现:FreeRTOS在CubeMX中使用V1版本的时候,没法设置Events,必须手动添加,或者是使用V2版本。 这里使用V1版本,在【STM32】FreeRTOS互斥量学习基础上修改代码实现 第一步:创建事件组 /* USER CODE BEGIN FunctionPrototypes */ //创建事件组 EventGroupHandle_t myEventGroup=NULL; /* USER CODE END FunctionPrototypes */ 第二步,初始化 void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ //事件组初始化 myEventGroup=xEventGroupCreate( ); xEventGroupClearBits(myEventGroup,0X000); /* USER CODE END Init */ /* Create the thread(s) */ /* definition and creation of Task1 */ osThreadDef(Task1, StartDefaultTask, osPriorityNormal, 0, 128); Task1Handle = osThreadCreate(osThread(Task1), NULL); /* definition and creation of Task2 */ osThreadDef(Task2, StartTask02, osPriorityNormal, 0, 128); Task2Handle = osThreadCreate(osThread(Task2), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, .

Flink状态和状态管理

1.什么是状态 官方定义:当前计算流程需要依赖到之前计算的结果,那么之前计算的结果就是状态。 这句话还是挺好理解的,状态不只存在于Flink,也存在生活的方方面面,比如看到一个认识的人,如何识别认识呢?就是眼睛看到这个人的样子,再和大脑记忆中的人做对比,就知道认识这个人,其中大脑记忆中的人就是存储在状态中。 状态又分为无状态和有状态。 无状态:例如消费延迟计算,单条输入包含所有的信息,不依赖于历史消息。在这种模式的计算中,无论这条输入进来多少次,输出的结果都是一样的,因为单条输入中已经包含了所需的所有信息。消费落后等于生产者减去消费者。生产者的消费在单条数据中可以得到,消费者的数据也可以在单条数据中得到,所以相同输入可以得到相同输出,这就是一个无状态的计算。有状态:例如访问量统计,单条输入仅包含部分信息,依赖历史消息。这种模式是将数据输入算子中,用来进行各种复杂的计算并输出数据。这个过程中算子会去访问之前存储在里面的状态。另外一方面,它还会把现在的数据对状态的影响实时更新,如果输入100 条数据,最后输出就是 100 条结果。 2.状态应用场景 通常以下4种场景会用到状态: 去重:比如上游的系统数据可能会有重复,落到下游系统时希望把重复的数据都去掉。去重需要先了解哪些数据来过,哪些数据还没有来,也就是把所有的主键都记录下来,当一条数据到来后,能够看到在主键当中是否存在。窗口计算:比如统计每分钟 Nginx 日志 API 被访问了多少次。窗口是一分钟计算一次,在窗口触发前,如 08:00 ~ 08:01 这个窗口,前59秒的数据来了需要先放入内存,即需要把这个窗口之内的数据先保留下来,等到 8:01 时一分钟后,再将整个窗口内触发的数据输出。未触发的窗口数据也是一种状态。机器学习/深度学习:如训练的模型以及当前模型的参数也是一种状态,机器学习可能每次都用有一个数据集,需要在数据集上进行学习,对模型进行一个反馈。访问历史数据:比如与昨天的数据进行对比,需要访问一些历史数据。如果每次从外部去读,对资源的消耗可能比较大,所以也希望把这些历史数据也放入状态中做对比。 3.状态管理 实时计算中的状态的功能主要体现在任务可以做到失败重启后没有数据质量、时效问题。 数据质量问题:当实时任务挂掉后,从消息失败offset位置开始消费,数据就错误。数据时效问题:实时任务要求有时效性,当从源offset开始位置运行时,需要好几个小时才能追上当前offset。时效性就很差。 针对以上问题,就引出了状态管理。 当我们把数据定期(例如每隔10min)的给存储到 HDFS 上面时,任务挂了、恢复之后。我们的任务还可以从 HDFS 上面把这个数据给读回来,接着从最新的一个 Kafka Offset 继续计算就可以,这样既没没有数据质量问题,也没有数据时效性问题。 因此,实时计算中提到的状态的概念重点不止在于状态本身,更重要的在于强调 "管理" 状态。 基于上述,状态管理对流式作业的要求总结如下: 7*24小时运行,高可靠;数据不丢不重,恰好计算一次;数据实时产出,不延迟; 但是基于以上要求,内存的管理就会出现一些问题。由于内存的容量是有限制的。如果要做 24 小时的窗口计算,将 24 小时的数据都放到内存,可能会出现内存不足;另外,作业是 7*24,需要保障高可用,机器若出现故障或者宕机,需要考虑如何备份及从备份中去恢复,保证运行的作业不受影响;此外,考虑横向扩展,假如网站的访问量不高,统计每个 API 访问次数的程序可以用单线程去运行,但如果网站访问量突然增加,单节点无法处理全部访问数据,此时需要增加几个节点进行横向扩展,这时数据的状态如何平均分配到新增加的节点也问题之一。因此,将数据都放到内存中,并不是最合适的一种状态管理方式。 最理想的状态管理需要满足易用、高效、可靠三点需求: 易用,Flink 提供了丰富的数据结构、多样的状态组织形式以及简洁的扩展接口,让状态管理更加易用;高效,实时作业一般需要更低的延迟,一旦出现故障,恢复速度也需要更快;当处理能力不够时,可以横向扩展,同时在处理备份时,不影响作业本身处理性能;可靠,Flink 提供了状态持久化,包括不丢不重的语义以及具备自动的容错能力,比如 HA,当节点挂掉后会自动拉起,不需要人工介入。 4.状态后端 做状态数据(持久化,restore)的工具就叫做状态后端。比如在 Flink 中见到的 RocksDB、FileSystem 的概念就是指状态后端。这些状态后端就是实际存储上面的状态数据的。比如配置了 RocksDB 作为状态后端,MapState 的数据就会存储在 RocksDB 中。 总的来说可以这么理解:应用中有一份状态数据,把这份状态数据存储到 MySQL 中,这个 MySQL 就能叫做状态后端。 5.Checkpoint和Savepoint 概念:协调整个任务 when,how 去将 Flink 任务本地机器中存储在状态后端的状态去同步到远程文件存储系统(比如 HDFS)的过程就叫 Checkpoint、Savepoint。

matlab保存图片

仅作为记录,大佬请跳过。 文章目录 用界面中的“另存为”用saveas 用界面中的“另存为” 即可。 参考 感谢大佬博主文章:传送门 用saveas 必须在编辑器中的plot之后用saveas(也就是不能在命令行中单独使用——比如在编辑器中plot,在命令行中调试输入saveas保存-这样保存的是空白图) 程序 % 画图 datenn = datenum(time); plot(datenn,P); % plot(datenn,MIN);hold on; % plot(datenn,MAX); DateString = {'01/01/2022';'01/02/2022';'01/03/2022';'01/04/2022';'01/05/2022';'01/06/2022';'01/07/2022';'01/08/2022';'01/09/2022';'01/10/2022';'01/11/2022';'01/12/2022';'31/12/2022'}; formatIn = 'dd/mm/yyyy'; set(gca,'xtick',datenum(DateString,formatIn)) datetick('x','yyyy-mm-dd','keepticks') set(gca,'XTickLabelRotation',46); set(gca,'yticklabel',{'20%','30%','40%','50%','60%','70%','80%','90%','100%'}); % set(gca,'yticklabel',{'0%','10%','20%','30%','40%','50%','60%','70%','80%','90%','100%'}); % grid on; % ylabel("MW"); % legend("最小出力","最大出力"); saveas(gcf, 'E:\kunkun\guowang\matlab', 'png');

vantUI 2.x 版本,picker组件支持特殊索引的数据(非纯数组)

组件代码 <!-- 该picker组件是用于字典数据第一项索引不是从0开始的特殊数据集 --> <template> <div class="picker-con"> <div class="picker-box" @click="handleClick"> <span class="select-tip" v-if="!selectName">请选择</span> <span class="select-value" v-else>{{selectName}}</span> <div class="arw-box"> <van-icon name="arrow" /> </div> </div> <van-popup v-model="showPicker" round position="bottom"> <van-picker @confirm="onConfirm" show-toolbar :columns="option" value-key="name" :default-index="defaultIndex" @cancel="showPicker = false" /> </van-popup> </div> </template> <script> export default { props: { // v-model 默认值 value: { default: '' }, // 下拉选项 option: { default: () => [] }, readonly: { // 只读 type: Boolean, default: false } }, data () { return { defaultIndex: 0, // 默认选中项的索引 selectName: '', selectValue: '', showPicker: false } }, model: { prop: 'value', event: 'getValue' }, watch: { value: { handler (value) { if (!

vue3.0关于文件导入(上传)方法

在我们开发中,有时会用到文件上传或者文件导入,如图,我们需要在文本框中输入内容或者直接导入文件内容,此输入框由按钮和上传组件一块组成,实现方法如下: 1.该输入框和上传按钮组成部分代码: <el-form-item label="上传文件 :" prop="regexRule"> <el-input size="large" v-model="form.regexRule" placeholder="请输入内容或导入文件内容" > <template #append> <el-upload ref="uploadRef" class="upload-demo" multiple v-model:file-list="fileList" :on-change="fileChange" :http-request="uploadFile" accept=".txt" :limit="2" > <template #trigger> <el-button @click="showchange" plain style="height: 42px;" > 导入 </el-button> </template> </el-upload> </template> </el-input> </el-form-item> 2.js代码组成部分: const fileList = ref([]); const uploadRef = ref(); //判断上传文件格式、第二次上传文件是否保留、文件大小 const fileChange = (uploadFile, fileList) => { let imgSize = Number(uploadFile.size / 1024 / 1024); const isXlS = 'text/plain'; if (![isXlS].includes(uploadFile.type)) { ElMessage.

c语言打印一个菱形!!小白思路篇!!

目录 1.做题思路 2.怎么实现呢 3.代码的解释 第一个for循环用于打印多行 第二个for循环用于打印空格,有菱形可以看出第一行的空格为6个,所以line - 1 - i的意思是,line - 1是因为第一行已经有一个星星,所以要先减一,- i的意思是每行少一个空格。 第三个for循环则是用来打印打印星星,因为每一行星星加两个,且第一行本来就存在1个星星所以,第二个表达式中 2 * i + 1的含义是每一行多两个星星且还有第一行的第一个星星。 用C语言在屏幕上输出以下图案: 1.做题思路 一个菱形可以拆解为两个三角形一个大一个小,由此思路就是先打印上面的三角形在打印出下面的三角形。 2.怎么实现呢 第一行只有一个星星后续每一行多两个星星(前面的星星是把空格取代,后面的星星是自然多出的),再看每一行的空格数量,明显空格的数量是自第一行每一行减一的。这样就可以构思出代码。 3.代码的解释 输入要打印的上半三角的行数,后利用for循环的嵌套 第一个for循环用于打印多行 第二个for循环用于打印空格,有菱形可以看出第一行的空格为6个,所以line - 1 - i的意思是,line - 1是因为第一行已经有一个星星,所以要先减一,- i的意思是每行少一个空格。 第三个for循环则是用来打印打印星星,因为每一行星星加两个,且第一行本来就存在1个星星所以,第二个表达式中 2 * i + 1的含义是每一行多两个星星且还有第一行的第一个星星。 记得最后要换行哦!!!。 本题对于初学者而言还是挺绕的,不懂的uu可以多看看熟悉一下奥 int main() { int line = 0; int i = 0; scanf("%d", &line);//7 //打印上半部分 for(i=0; i<line; i++) { //打印一行 //打印空格 int j = 0; for(j=0; j<line-1-i; j++) { printf("

【kubectl详解】

目录 一、陈述式资源管理方法二、基本信息查看1、查看 master 节点状态2、查看命名空间3、查看命名空间的所有资源4、创建命名空间app5、删除命名空间app6、在命名空间kube-public 创建副本控制器(deployment)来启动Pod(nginx-dz)7、描述某个资源的详细信息8、查看命名空间kube-public 中的pod 信息9、kubectl exec可以跨主机登录容器,docker exec 只能在容器所在主机上登录10、查看pod中容器的日志11、删除(重启)pod资源,由于存在deployment/rc之类的副本控制器,删除pod也会重新拉起来12、扩容缩容 三、项目的生命周期1、创建 kubectl create命令2、发布 kubectl expose命令3、、更新 kubectl set4、回滚 kubectl rollout5、删除 kubectl delete 四、应用的发布策略五、声明式管理方法 一、陈述式资源管理方法 陈述式资源管理方法: 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径 3.kubectl 的命令大全 kubectl --help k8s中文文档:http://docs.kubernetes.org.cn/683.html 4.对资源的增、删、查操作比较方便,但对改的操作就不容易了 //查看版本信息 kubectl version //查看资源对象简写 kubectl api-resources //查看集群信息 kubectl cluster-info //配置kubectl自动补全 source <(kubectl completion bash) //node节点查看日志 journalctl -u kubelet -f 二、基本信息查看 kubectl get [-o wide|json|yaml] [-n namespace] 获取资源的相关信息,-n 指定命令空间,-o 指定输出格式

实现zotero星标功能且可以排序

Quicker的文献标记 主要功能 (1)给已读、已记笔记的文献做标记,便于后续查找; (2)对文献重要性进行评级,便于高效文献管理; (3)可根据个人需要,修改动作个性化添加其他符号,不限于 ⭐📝和📖 ; (4)可鼠标右击,一键清理所有标记,但请谨慎操作。 效果如图: 1.Quicker与Zotero环境配置 1.1 下载Quicker:Quicker软件 您的指尖工具箱 - Quicker 1.2 在Zotero中安装debug-bridge 插件: Github下载链接:Release debug-bridge · retorquere/zotero-better-bibtex · GitHub CSDN下载链接:debug-bridge-6.7.79.emile.limonia.xpi资源-CSDN文库 (安装debug-bridge 插件是为了实现Zotero执行外部javascript文件) 1.3 在Zotero中点击菜单Tools(工具)—>Developer(开发者)—>Run Javascript,在Code文本框中输入并运行如下代码: //配置执行外部javascript文件的密码 Zotero.Prefs.set("extensions.zotero.debug-bridge.password","CTT",true); //设置界面语言为英文,有利于键盘快捷操作 Zotero.Prefs.set("intl.locale.requested","en-US",true); Zotero.Prefs.set("intl.accept_languages","en-US, en",true); //配置Ctrl+Shif+C为复制选择文献到剪贴板 Zotero.Prefs.set("extensions.zotero.keys.copySelectedItemsToClipboard","C",true); //取消文献经典插入窗口选项 Zotero.Prefs.set("extensions.zotero.integration.useClassicAddCitationDialog",false,true); //配置手动运行Run JavaScript窗口快捷键 Zotero.Prefs.set("extensions.zutilo.shortcut.openRunJSWindow",'{"modifiers":"alt control","key":"R","keycode":null}',true); //配置Lookup item by idenifier快捷键 Zotero.Prefs.set("extensions.zutilo.shortcut.lookupID",'{"modifiers":"control shift","key":"@","keycode":null}',true); //自定义Translator快速获取文献citationKey、doi、title、journal、select、附件地址等信息 let code=`{ "translatorID": "cttb4cc3-8334-4bbc-a5f0-fe66317c8811", "label": "Taotao Copy2", "creator": "Taotao Chen", "target": "json", "minVersion": "5.0.82", "maxVersion": "", "priority": 200, "

Oracle软件在主机平台的应用

课程介绍学习地址 课程由浅入深将oracle的学习过程切割为六大模块,SQL、体系结构、备份、dataguard、优化、RAC,每一个模块都为大家准备了大量的示例,真实演示oracle的实际操作,这套视频的目的是让没有接触过oracle的也能了解和使用oracle产品,已经了解oracle的人可以加深对oracle的认识。因为时间有限,不可能涵盖oracle中的所有操作,所以本套视频更加注重的是原理,重道不重术,我们想传递给大家的是学习的思路和oracle的设计思想,在了解原理之后你自然就可以解决变化万千的现实问题!本视频所推崇的思想:做人以至诚为本,读书以明理为先!本套视频将会成为你dba之路上的第一块坚实奠基石。

Docker容器进入的4种方式(推荐最后一种)

Docker容器进入的4种方式【推荐最后一种】 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。 一、使用docker attach进入Docker容器二、使用SSH进入Docker容器三、使用nsenter进入Docker容器四、使用docker exec进入Docker容器五. 为什么不需要在Docker容器中运行sshd假设你正在假设一个Redis Server或Java Webservice的Docker镜像, 我会问你以下几个问题:但我该如何做…备份我的数据?检查日志?重启service?修改我的配置文件 调试我的应用?介绍 nsenter从哪里获得 nsenter ?如何使用? 远程访问怎么样?总结 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下: 使用docker attach使用SSH使用nsenter使用exec 一、使用docker attach进入Docker容器 Docker提供了attach命令来进入Docker容器。 接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。 $ sudo docker run -itd ubuntu:14.04 /bin/bash 然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器 $ sudo docker attach 44fc0f0582d9 可以看到我们已经进入到该容器中了。 但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。 因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。 二、使用SSH进入Docker容器 在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入 容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容 器内。关于为什么不建议使用,请参考如下文章: 为什么不需要在 Docker 容器中运行 sshd 三、使用nsenter进入Docker容器 在上面两种方式都不适合的情况下,还有一种比较方便的方法,即使用nsenter进入Docker容器。关于什么是nsenter请参考如下文章: https://github.com/jpetazzo/nsenter 在了解了什么是nsenter之后,系统默认将我们需要的nsenter安装到主机中 如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像) 具体的安装命令如下: $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz $ tar -xzvf util-linux-2.24.tar.gz $ cd util-linux-2.24/ $ .

如何在React项目中动态插入HTML内容

React是一种流行的JavaScript库,用于构建用户界面。它提供了一种声明式的方法来创建可复用的组件,使得开发者能够更轻松地构建交互性的Web应用程序。在React中,我们通常使用JSX语法来描述组件的结构和行为。 在某些情况下,我们可能需要在React组件中动态地插入HTML内容。这可能是因为我们从后端接收到的数据包含了HTML标记,或者我们想要在组件中显示富文本内容。在这种情况下,我们可以使用React的v-html指令来实现。 v-html是Vue.js框架中的一个指令,用于将HTML字符串插入到DOM元素中。尽管React没有内置的v-html指令,但我们可以通过使用dangerouslySetInnerHTML属性来实现类似的功能。 要在React中使用v-html,我们需要遵循以下步骤: 导入React库和相关的组件: import React from 'react'; 创建一个React组件: class MyComponent extends React.Component { render() { return ( <div> <h1>React中使用v-html的示例</h1> <div dangerouslySetInnerHTML={{ __html: this.props.htmlContent }}></div> </div> ); } } 在上面的代码中,我们创建了一个名为MyComponent的React组件,并在render方法中使用了dangerouslySetInnerHTML属性。这个属性接受一个对象,其中的__html属性用于存放我们要插入的HTML字符串。 在其他组件中使用我们的自定义组件: class App extends React.Component { render() { const htmlContent = '<p>这是一个使用v-html的示例</p>'; return ( <div> <MyComponent htmlContent={htmlContent} /> </div> ); } } 在上面的代码中,我们创建了一个名为App的React组件,并在render方法中使用了我们的自定义组件MyComponent。我们将一个包含HTML内容的字符串传递给MyComponent组件的htmlContent属性。 运行React应用程序: ReactDOM.render(<App />, document.getElementById('root')); 通过上述步骤,我们就可以在React中使用类似于v-html的功能了。当我们在MyComponent组件中使用dangerouslySetInnerHTML属性时,需要注意潜在的安全风险。由于该属性直接将HTML字符串插入到DOM中,可能存在跨站脚本攻击(XSS)的风险。因此,在使用dangerouslySetInnerHTML属性时,务必确保所插入的HTML内容是可信的,并且不包含恶意代码。 总结起来,React中没有内置的v-html指令,但我们可以通过使用dangerouslySetInnerHTML属性来实现类似的功能。通过小心地处理HTML内容,我们可以在React组件中动态地插入HTML字符串。然而,为了确保安全性,我们应该谨慎使用dangerouslySetInnerHTML属性,并确保所插入的HTML内容是可信的。

linux中vim编译安装到指定路径(无需sudo),vim插件安装及调试python程序

一、安装vim 查看系统中是否有vim which vim 可以看到列举了一系列文件夹里都找不到vim,注意若没有sudo权限可以参考这里列举的文件夹,带当前用户名的路径则是可以不用sudo直接安装vim的地方 1、下载vim git clone https://github.com/vim/vim.git 2、更新到最新版本 cd vim git pull 3、make 在make之前要指定安装目录执行configure文件,如指定到/home/user文件下 ,其他如配置支持python语言等特性 cd src make distclean # if you build Vim before ./configure --prefix=/public/home/usr/ --with-features=huge --enable-python3interp --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --with-python3-config-dir=/usr/lib/python3.7/config-x86_64-linux-gnu/ --enable-rubyinterp --enable-luainterp --enable-multibyte --enable-cscope 指定后执行 make make install 参考: https://www.vim.org/git.php https://developer.aliyun.com/article/195099 二、安装插件 这里有两种方式,通过管理器vim-plug或者手动下载插件文件 方式一:通过管理器vim-plug 1、使用curl命令下载vim-plug源码 curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 注:若这里下载失败可以从网页先下载plug.vim文件: https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 然后再将plug.vim文件移动到.vim/autoload/的路径下: mv plug.vim ~/.vim/autoload/ 2、在.vimrc配置文件中进行配置 vim ~/.vimrc 这里如果没有.vimrc文件会自动创建 3、在.vimrc文件中输入要安装的插件命令(这里用i进入输入模式) 插件类型有很多种 ,这里暂时列出安装在github中的插件 如要安装插件Auto Pairs(用于自动匹配括号)

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrl+k(代码中编辑) 2、快捷键ctrl+l 右侧打开窗口

apache doris和StarRocks的区别

记录一下最新要用到2个新数据库的区别 Apache Doris是一个分布式的列式存储系统,它的设计目标是提供大规模数据处理的可靠性和高性能。Doris采用了集群方式,通过将数据分布在多个机器上进行处理来提高性能,并提供了SQL查询接口方便用户使用。 StarRocks是一个分布式存储系统,它建立在Apache Hadoop之上,旨在为大型超级计算机提供结构化数据存储解决方案。StarRocks采用了列式存储模型,并利用Hadoop的分布式计算框架来管理数据和提供高性能的数据处理。 Doris和StarRocks的主要区别在于: 底层架构不同:Doris是一个独立的分布式存储系统,而StarRocks是建立在Hadoop之上的。存储模型不同:Doris使用列式存储模型,而StarRocks使用Hadoop中的HDFS文件系统来存储数据。处理能力不同:Doris提供高性能的数据处理能力,而StarRocks利用Hadoop的分布式计算框架来处理数据。

golang操作excel的高性能库——excelize/v2

目录 介绍文档与源码安装快速开始创建 Excel 文档读取 Excel 文档打开数据流流式写入 [相关 Excel 开源类库性能对比](https://xuri.me/excelize/zh-hans/performance.html) 介绍 Excelize是一个纯Go编写的库,提供了一组功能,允许你向XLAM / XLSM / XLSX / XLTM / XLTX文件写入和读取。支持读取和写入由Microsoft Excel™ 2007及更高版本生成的电子表格文档。通过高度兼容性支持复杂组件,并提供了流式API,用于生成或从包含大量数据的工作表中读取数据。此库需要Go版本1.16或更高版本。可以使用Go的内置文档工具查看完整文档,也可以在go.dev和文档引用中在线查阅。 另外还有另外一个库:github.com/360EntSecGroup-Skylar/excelize/v2,不过它已经没了,或者说它和github.com/xuri/excelize/v2是一个东西,用法功能都完全一样。。。。 文档与源码 Github源码:https://github.com/qax-os/excelize 中文文档:https://xuri.me/excelize/zh-hans/ 安装 go get github.com/xuri/excelize/v2 快速开始 创建 Excel 文档 package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f := excelize.NewFile() defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() // 创建一个工作表 index, err := f.NewSheet("Sheet2") if err != nil { fmt.

JVM相关概念及功能&logstash在JVM栈堆运行的原理

JVM代表Java虚拟机(Java Virtual Machine)。它是Java平台的核心组成部分之一,用于执行Java程序。JVM是一个软件程序,它在物理计算机和Java应用程序之间提供了一个抽象层。 Java是一种高级编程语言,而JVM负责将Java字节码(由Java编译器生成的中间代码)转换为适当的机器指令,以在不同的计算机系统上执行。 JVM具有如下主要功能: 1.类加载:JVM负责在运行时动态加载Java类文件,解析类文件中的字节码,并将类定义加载到内存中。它实现了Java的类加载机制,包括类的验证、准备、解析和初始化等步骤。 2.内存管理:JVM管理Java应用程序的内存使用。它有一个称为Java堆的内存区域,用于存储对象实例和数组。此外,JVM还管理堆栈、方法区和本地方法栈等内存区域。 3.垃圾回收:JVM提供了自动垃圾回收机制,它会自动检测并回收不再使用的对象内存,以避免内存泄漏和资源浪费。 4.JIT编译器:JVM还包括即时编译器(Just-In-Time Compiler),它负责将经常执行的代码(热点代码)动态地编译成本地机器代码,以提高程序的执行性能。 5.安全性管理:JVM提供了安全管理机制,可以限制Java程序的访问和操作系统资源的能力。它通过安全策略文件控制对文件、网络和系统资源的访问。 总之,JVM是一个独立于硬件和操作系统的虚拟计算机,它使得Java程序具有跨平台的能力,可以在任何支持JVM的系统上运行。它提供了内存管理、垃圾回收、类加载和执行引擎等核心功能,使得Java成为一门可移植、安全且高性能的编程语言。 Logstash 是一个开源的数据处理和传输工具,它用于收集、转换和传输数据。Logstash 运行在 Java 虚拟机(JVM)上,因此它的运行原理与 JVM 的栈和堆有一定的关系。 当 Logstash 启动时,JVM 会为 Logstash 分配一定的堆空间,这是 Logstash 用于存储数据和执行代码的内存区域。Logstash 可以通过 JVM 参数来控制堆空间的大小。 **Logstash 使用 JVM 的栈来执行线程的调用栈,每个线程都有自己的栈空间。**线程在执行过程中,会将方法的参数、局部变量以及方法的返回值等信息保存在栈帧中,这样可以保证线程的执行状态和上下文切换。 Logstash 在处理数据时,它的主要工作流程如下: 1.输入阶段:Logstash 通过输入插件从各种数据源(如文件、网络、消息队列等)中读取数据。读取的数据经过处理后被存储在内存中。 2.过滤阶段:Logstash 将存储在内存中的数据传递给过滤插件进行处理。过滤插件可以对数据进行解析、过滤、转换等操作,并将结果存储在内存中的事件队列中。 3.输出阶段:经过过滤后的数据会通过输出插件发送到相应的目标,如数据库、搜索引擎、日志文件等。输出插件将从事件队列中提取数据,并将其传输到目标位置。 *Logstash 的运行原理与 JVM 的栈堆密切相关, 它使用堆空间来存储数据和执行代码, 而使用栈空间来管理线程的调用栈和执行上下文。 *通过合理配置 JVM 的堆大小和调整 Logstash 的输入、过滤和输出插件,可以优化 Logstash 的性能和内存使用。

深度优先遍历实现对象深复制

function deepClone(obj, visited = new WeakMap()) { // 如果是基本数据类型(null、undefined、字符串、数字、布尔值),直接返回 if (obj === null || typeof obj !== "object") { return obj; } // 检查是否已经复制过这个对象,避免循环引用导致的无限递归 if (visited.has(obj)) { return visited.get(obj); } let clone; if (obj instanceof Array) { // 如果是数组,创建一个新的空数组作为复制对象 clone = []; // 将原数组与复制数组关联起来,以便处理循环引用 visited.set(obj, clone); // 遍历原数组的每个元素,递归调用 deepClone 函数复制元素 for (let i = 0; i < obj.length; i++) { clone[i] = deepClone(obj[i], visited); } } else { // 如果是对象,创建一个新的空对象作为复制对象 clone = {}; // 将原对象与复制对象关联起来,以便处理循环引用 visited.

基于javaweb+mysql的ssm社团管理系统(java+ssm+jsp+jquery+mysql)

基于javaweb+mysql的ssm社团管理系统(java+ssm+jsp+jquery+mysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基于javaweb+mysql的SSM社团管理系统(java+ssm+jsp+jquery+mysql) 项目介绍 本社团管理系统是根据大学社团管理的实际应用而开发的,采用JSP技术,JAVA编程语言,基于SSM框架,使用MySQL数据库,充分保证系统的安全性和稳定性,使得社团管理工作系统化、规范化、高效化。 该系统主要分为前台和后台两大功能模块,共包含两个角色:用户、管理员。 具体的系统功能如下: 1.前台功能 前台首页、新闻公告、规章制度、社团活动、活动报名、互动交流、用户注册、用户登陆、用户中心、修改密码、个人信息、我的社团活动、物资申请、退出登陆等功能。 2.后台功能 后台系统登陆、社团用户管理、管理员管理、网站公告管理、社团活动管理、申请类型管理、用户申请管理、活动报名管理、留言交流管理等功能。 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 否;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 6.数据库:MySql 5.7/8.0等版本均可; 技术栈 后台框架:Spring、SpringMVC、MyBatis UI界面:JSP、jQuery 数据库:MySQL 使用说明 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目; public class RoleController { @Autowired private RoleService roleService; @Autowired private PermissionService permissionService; @RequestMapping("/list") @RequiresPermissions("role:list") public String roleList() { return "role/list"; @ResponseBody @RequestMapping("/getRoles") criteria.andRolenameEqualTo(name); if (roleService.selectByExample(roleExample).size() != 0) { return false; return true; @RequestMapping("

基于javaweb+mysql的ssm火车票预订管理系统(java+ssm+vue+elementui+mysql)

基于javaweb+mysql的ssm火车票预订管理系统(java+ssm+vue+elementui+mysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8、Node.js≥10 开发工具 后端:eclipse/idea/myeclipse/sts等均可配置运行 前端:WebStorm/VSCode/HBuilderX等均可 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基于javaweb+mysql的SSM火车票预订管理系统(java+ssm+vue+elementui+mysql) 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 6.数据库:MySql 5.7/8.0等版本均可; 技术栈 后端:SSM(Spring+SpringMVC+Mybatis-plus) 前端:ElementUI+Vue 使用说明 使用Navicat或者其它工具,在mysql中创建对应sql文件名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目; 3. 将项目中config.properties配置文件中的数据库配置改为自己的配置,然后运行; 个人中心Controller: /** * 个人中心Controller */ @Controller public class UserInforController { @Autowired private UserInforServiceImpl userInforService = null; /** * 修改密码操作 * @param oldPassword Integer eid = (Integer) httpSession.getAttribute("employeeId"); try { userInforService.updateEmployeePassword(eid, oldPassword, newPassword); map.put("type","success"); map.put("msg","密码修改成功"); return map; } catch (CustomException e) { map.

基于javaweb+mysql的ssm图书管理系统(java+ssm+jsp+jquery+mysql)

基于javaweb+mysql的ssm图书管理系统(java+ssm+jsp+jquery+mysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基于javaweb+mysql的SSM图书管理系统(java+ssm+jsp+jquery+mysql) 项目介绍 本图书馆管理系统主要分为前台和后台两大功能模块,共包含两种角色,分别是:读者、管理员。 其功能如下: 1.前台功能 前台首页、网站公告、图书浏览、图书详情、图书搜索、图书分类展示、推荐图书、全部图书、预约图书、图书借阅、图书评论、收藏图书、用户注册、用户登陆、用户中心、修改个人信息、修改密码、我的借阅历史、我的收藏、我的意见反馈、退出等功能。 2.后台功能 后台系统登陆、用户信息管理、新闻公告信息管理、图书类型管理、图书信息管理、图书预约管理、延期申请管理、图书评价管理、意见反馈管理、统计信息等功能。 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 否;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目; 6.数据库:MySql 5.7/8.0等版本均可; 技术栈 后台框架:Spring、SpringMVC、MyBatis UI界面:JSP、jQuery 数据库:MySQL 使用说明 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目; @Controller public class BookController { @Autowired private BookService bookService; @Autowired private LendService lendService; private Date getDate(String pubstr) { try { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return df.parse(pubstr); @Autowired private ReaderCardService readerCardService; private ReaderInfo getReaderInfo(long readerId, String name, String sex, String birth, String address, String phone) { ReaderInfo readerInfo = new ReaderInfo(); Date date = new Date(); try { SimpleDateFormat df = new SimpleDateFormat("

开发微信小程序时WX文件与html、css文件的区别

1.WXML vs HTML 1.标签名称不同 HTML:div、span、img、a WXML:view、text、image、navigator 2.属性节点不同 <a href='#'>超链接</a> <navigator url="./../..?"> 3.提供Vue模板语法 数据绑定 列表渲染 条件渲染 2.WXSS vs CSS 1.新增加了rpx尺寸单位 CSS中需要手动进行像素单位换算,例如 rem WXSS在底层支持新的尺寸单位rpx,在不同大小的屏幕上小程序会自动进行换算 2.提供了全局的样式和局部样式 项目根目录中的app.wxss 会作用于所有小程序页面 局部页面的.wxss样式仅对当前页面生效 3.WXSS仅支持部分选择器 .class和#id element 并集选择器、后代选择器 ::after和::before 等伪类选择器

跨域问题出现 => 解决办法

什么是跨域问题呢? 跨域(Cross-Origin)指的是在 Web 开发中,一个网页的运行环境(域)与所请求资源的域不一致,即请求的目标资源与当前网页的域名(协议、域名或端口)不同。 同源策略 Web 浏览器遵循同源策略(Same-Origin Policy),这是一种安全策略,旨在防止潜在的恶意网站窃取用户数据或进行其他安全攻击。同源策略要求网页的运行环境和所请求的资源必须拥有相同的协议、域名和端口,否则浏览器会阻止跨域请求的执行。 举例来说,每个网站都有一个域名或者IP地址(实际上域名就是对IP地址的别名,方便人们记忆)。当我们访问一个网站时,浏览器会将某个页面下载到本地并解析,以展示图形页面。为了支持更多的业务需求,在这个页面中可能会发起一些额外的请求。为了避免页面卡顿,我们使用了Ajax技术偷偷地通过后门请求数据。偷偷走后门是可行的,但是必须遵循规则,不可以随意发起请求。 假设当前页面是www.baidu.com,在这个页面中发送了一个Ajax请求。浏览器允许请求发送出去,但是请求的地址不是本身的地址,而是www.hao123.com/api/xxxx这样的地址。此时,浏览器会检查响应,并查看服务端是否允许任何来源发起请求。如果服务端允许,浏览器将放行请求。否则,浏览器会报错,这种错误就是跨域问题。 如何处理跨域问题呢? 1.JSONP(JSON with Padding) 核心思想是浏览器只限制ajax,不限制图片、多媒体、css、js等资源访问其他网站,恰好利用这个特性,使用一些技巧来解决跨域。 JSONP 是一种通过添加一个<script>标签来进行跨域请求的方法。服务器返回的不是纯JSON数据,而是一个包含JSON数据的函数调用。这个函数会被前端代码定义,从而实现跨域数据的获取。JSONP只支持GET请求。 有局限性,需要回调函数 +别人服务端配合 2.CORS(Cross-Origin Resource Sharing) CORS 是一种由服务器设置的响应头,允许特定的源在浏览器上进行跨域访问。服务器可以设置Access-Control-Allow-Origin响应头来指定允许的源,以及其他相关的CORS头,如Access-Control-Allow-Methods、Access-Control-Allow-Headers等。CORS支持各种HTTP方法。 有局限性,需要服务端配合,别人服务端安全性降低 3.代理服务器(Proxy) 前端可以通过在自己的服务器上设置代理,使其能够代替浏览器向目标服务器发起请求。前端代码向自己的服务器发送请求,然后服务器再将请求转发到目标服务器,并将响应返回给前端。这样可以避免跨域问题,因为浏览器实际上只与同源的服务器通信。 这个是比较好的解决方案 4.WebSocket 如果需要进行实时通信,WebSocket 提供了一种在浏览器中实现跨域通信的方法。WebSocket 协议允许在不受同源策略限制的情况下建立双向通信。 这些就是当在项目中遇到跨域问题时快速的解决办法。

Java字符串去掉空格的几种方法

去掉首尾空格 String str = "Hello java! "; System.out.println(str.trim()); 去掉所有空格,包括中间 String str = "Hello java! "; String str2 = str.replaceAll(" ", ""); System.out.println(str2); 替换大部分空白字符,不限于空格 String str = "Hello java! "; String str3 = str.replaceAll("\\s*",""); System.out.println(str3); 其中,\s可以匹配空格、制表符、换页符等空白字符 Java正则表达式

java算法系列,第十一篇:合并有序链表

现在有两个链表: [1,3,8,9], [2,4] 要求合并成一个新的有序列表:[1,2,3,4,8,9] 这该怎么办呢? 方法一: 循环比较两个链表中的值,谁小就在该次循环中取它的节点添加到一个新链表去循环完了以后将剩余的节点追加到新链表 /** * 合并两个有序列表 * @param p1 有序列表1 * @param p2 有序列表2 * @return 合并后的有序列表 */ public ListNode mergeTwoLists(ListNode p1, ListNode p2) { ListNode s = new ListNode(-1,null);//头哨兵 ListNode p = s; while (p1 != null && p2 != null) { if(p1.getVal() < p2.getVal()) { p.setNext(p1); p1 = p1.getNext(); } else { p.setNext(p2); p2 = p2.getNext(); } p = p.getNext();//更新p } if(p1 != null)//如果p1还不为空,就把p1剩下的追加到p后面 { p.

使用PHP生成MySQL数据字典

一个项目完成之后,按照需求,我需要给这个项目写设计文档,数据库字典。 设计文档到时好说,但是数据库字典可真的是有点吓到我了。 项目开始的比较急,最开始建数据库的时候没有用excel写数据库字典。 这几十张表的数据库,一个一个的写,那真的是酸爽。 但是,这一切好像又都不是事。 我们有强大的PHP啊。 下面给大家分享一个自己写的函数:使用PHP生成mysql字典。 <?php $dbhost = '127.0.0.1:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $dbname = "shopxo"; //$mysql = mysqli_connect($dbhost, $dbuser, $dbpass);//这是mysql的链接方法 $mysql = new mysqli("localhost", $dbuser,$dbpass,$dbname, "3306"); //这是mysqli的链接方法 if(! $mysql ) { die('连接失败: ' . mysqli_error($mysql)); } $html = expertDirectory($mysql,$dbname); echo "<pre>"; var_dump($html); /** * 导出数据库字典 */ function expertDirectory($mysql,$dbname) { mysqli_query($mysql, "set names utf8"); $table_result = $mysql->query('show tables'); $no_show_table = array(); //不需要显示的表 $no_show_field = array(); //不需要显示的字段 //取得所有的表名 while($row = mysqli_fetch_array($table_result)){ if(!

PHP使用phpmailer及SMTP服务实现邮件发送

博客升级中,把之前没有想到的功能一点点的完善。 这篇日志记录一下,使用phpmailer实现邮件发送的这样一个操作。 博客偶尔会有留言和评论,我也会及时回复,但是有一个问题,我回复了,给我留言的人如果不再次进我的博客查看,他是不知道的,这个很不合理。 去看了下其他人的博客。多都是通过邮件回复的。 这个挺好,搞一个。 百度上基本上介绍了两种方法。 第一种是PHP通过qq邮箱或者网易邮箱的SMTP服务器来实现邮件发送。 第二种是使用phpmailer来实现邮件发送。 注意,第二种方法也需要你的邮箱开启SMTP服务。 如何开启邮箱的SMTP服务请参考《QQ邮箱开启SMTP服务》,最终效果如下图所示: 在开启过程中,页面中会提示一个你调用SMTP的授权密码,如下图所示,此密码一定要记住,如果没记住,可再次生成,我上边开启了两个SMTP服务,以最后的授权密码为准。 第一种方法尝试过了,报错如下: Trying to smtp.qq.com:587 220 smtp.qq.com Esmtp QQ Mail Server Connected to relay host smtp.qq.com > HELO localhost 250 smtp.qq.com > AUTH LOGIN ODA1Nzk1OTU1QHFxLmNvbQ== 530 Must issue a STARTTLS command first. Error: Remote host returned "530 Must issue a STARTTLS command first." Error: Error occurred while sending HELO command. Error: Cannot send email to <1150366147@qq.com> Disconnected from remote host 百度了一下,没有找到明确的答案。如果你们有遇到过这样的问题,请在下方留言,我们可以交流一下。

PHP报错:Deprecated Methods with the same name as their class will not be constructors in a future vers

务器的PHP版本从5.6升级到了7.2。 运行之前写的一个项目的时候,报错: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP 这是啥错,没见过啊。 百度了一下,官方给的说法是:PHP7以后的类的构造函数必须是__construct。 所以找到对应的类,找到与类同名的函数,将函数名改为__construct即可。 PHP OOP使用和类名相同的方法名作为构造方法,是 PHP4 的写法,PHP 5中同时支持__construct和类同名方法,但__construct方法具有优先性。 PHP 7开始使用和类名相同的方法名作为构造方法会报E_DEPRECATED级别的错误,提示在未来版本中会彻底抛弃类同名方法作为构造函数。 但程序仍然会正常执行。 例如 <?php class a{ function a(){ } } ?> 改成: <?php class a{ function __construct(){ } } ?> 以上就是全部内容 有好的建议,请在下方输入你的评论。

linq中的where条件拼接

在LINQ中,可以使用多种方式拼接Where查询条件,以满足不同的需求。以下是几种常用的方法: 1. 使用多个Where方法: var query = list.Where(doc => doc["key1"] == value1) .Where(doc => doc["key2"] == value2); 上述示例将两个条件分别作为不同的Where方法来处理,这将返回满足key1字段等于value1和key2字段等于value2的元素。 2. 使用逻辑运算符: var query = list.Where(doc => doc["key1"] == value1 && doc["key2"] == value2); 上述示例中,使用&&运算符将两个条件连接起来,这将返回同时满足两个条件的元素。 3. 动态拼接查询条件: var filters = new List<Func<BsonDocument, bool>>(); if (condition1) { filters.Add(doc => doc["key1"] == value1); } if (condition2) { filters.Add(doc => doc["key2"] == value2); } var query = list.Where(doc => filters.All(filter => filter(doc))); 上述示例中,将查询条件存储在一个List<Func<BsonDocument, bool>>列表中,根据条件动态地添加不同的过滤器函数。然后使用All方法确保所有过滤器都返回true。 使用这些方法,你可以根据具体需求动态拼接查询条件。请根据你的实际情况选择适合的方式进行条件拼接。

mysql cdc 整库迁移 (mysql to mysql)

技术思想 利用 mysql catalog,mysql cdc,flink jdbc 等技术实现 mysql 整库迁移至下游数据库,这里是示范 mysql to mysql ,其他 sink 组件可自行扩展实现。 通过 flink ParameterTool,可以选择是整库同步还是多表亦或单表同步,可以设置全局并发,源表 mysql 参数,目标表 mysql 参数 通过 sql Connection 实现自动建表逻辑 (mysql 数据类型众多,这里并没有测试所有的类型参数,如担心建表不成功,可手动建表,不影响程序运行) 下游使用 flink jdbc 来实现,语法为 upsert 即幂等写入(重复数据只会写入一次) 使用 mysql catalog 来实现源表元数据的获取 自定义 CustomDebeziumDeserializer 实现 DebeziumDeserializationSchema 接口对数据进行转换 该任务本质上是 单 source 多 sink 任务,不同的表数据不一样可能会有一定的反压 程序测试 生成五百万条数据 五张表 一分钟左右完成,增量数据一万条,可以同步完成 环境 flink 1.17 cdc 2.4.0 refer: https://nightlies.apache.org/flink/flink-docs-release-1.16/ https://blog.csdn.net/qq_36062467/article/details/128117647 https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc%28ZH%29.html 代码 github 地址 https://github.com/SophiaData/Bigdata_Code_Tutorial/blob/master/sync_database_mysql/src/main/java/io/sophiadata/flink/sync/FlinkSqlWDS.java /** (@SophiaData) (@date 2022/12/1 16:02).

【Android】 Firebase登录、FCM、Google Play支付、adbrix、ONEStore、Galaxy Store、Google Install Referrer

Android SDK接入 最近接了一个韩国的渠道,之前没有接过这些原生的sdk,头大啊。本来也不是搞android开发的,只能强搞了。还是国内的好啊,都给你整合完了。 如有问题,麻烦大佬指教一二,非常感谢。 一.Firebase,FCM,Google Login,fb Login 这里我把Google,Firebase,Facebook相关的都放在一起了,因为这些东西有很多的关联。 以下是官方文档,推荐先看一遍。 Firebase FCM Google Login Facebook Login 1.相应app的build.gradle 顶部加上 // 声明是要使用谷歌服务框架 apply plugin: 'com.google.gms.google-services' 在 dependencies 里加上 dependencies { // ========== firebase ========== implementation 'com.google.firebase:firebase-auth:20.0.4' // Import the Firebase BoM implementation platform('com.google.firebase:firebase-bom:28.4.2') // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries implementation 'com.google.firebase:firebase-analytics' // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-messaging' implementation 'com.

windows无盘启动技术开发之使用本地镜像文件启动电脑

by fanxiushu 2023-07-26 转载或引用请注明原始作者。 其实使用本地镜像文件启动电脑,这个windows操作系统本身就是自带的功能。 win7以上的系统,制作 vhd或vhdx格式的镜像文件, 然后在镜像文件中安装windows操作系统,然后放到真实硬盘的某个分区的某个目录中。 然后在真实的操作系统中修改BCD配置文件,把BCD配置成从刚才安装了操作系统的vhd或vhdx镜像文件启动, 这样电脑下次启动的时候,就自然从vhd或vhdx的镜像文件中启动了。 自从win7开始,创造了 vhd或vhdx格式的镜像文件以来,就有了这样的功能。 只不过我一直没用过,不知道能用来干嘛。 不过也确实挺新奇的, 你想啊,本来按照正常的思路,应该是老老实实的在真实硬盘分区中安装操作系统, 然后从真实硬盘分区中启动电脑, 现在变成了:可以从真实硬盘中的某个镜像文件(vhd或vhdx格式文件)中启动电脑。 本文并不打算介绍windows自带的这种功能, 而是从windows无盘启动技术出发,开发我们自己的从本地镜像文件启动windows操作系统的功能。 这个应该是我在阐述 UEFI引导程序开发的第2篇文章末尾提到过这么一个类似的功能: windows无盘启动技术开发之UEFI(新一代BIOS)引导程序开发之二_uefi驱动开发_雨中风华的博客-CSDN博客 从无盘启动技术出发,开发自己的从本地镜像文件启动windows操作系统。 可以让我们从原理上深入理解windows上面的从vhdx这样的镜像文件启动系统的骚操作。 同时从原理上掌握,让我们有了更多的自主权, 比如镜像文件格式可以自己定义,(我一般都是使用原始镜像文件格式,因为这样简单而且高效) 比如把各类不同操作系统集成到一起来, 比如把linux和windows的镜像文件都放到NTFS分区的硬盘中, 当然这需要linux和windows中都开发类似的功能,工作量也不少。 而且牵涉到linux使用不同的文件系统,还得在linux内核中开发对应的NTFS文件系统。 当然,如果全程都是自己开发的网络方式的无盘启动,这个事情就变得轻松了些, 甚至可以把从从本地镜像文件启动这个功能,加入到网络无盘启动中去,作为一个小小的附加子功能。 我就是这么做的,在实现了网络方式的无盘启动之后, 也许是好玩,也许是验证这种技术可行性,当然目前好像也没发现这玩意有啥用处。 反正不管怎么说,先让我们来看看下面的演示视频: win10系统的无盘启动过程 win7 无盘系统启动过程+ 第二个视频的前半部分,是展示从网络方式的无盘启动过程。 视频的后半部分,展示的是从本地镜像文件启动的过程。 本地镜像启动稍微快些,因为毕竟是读写本地镜像文件,比网络传输快些。 现在,我们来看看本地镜像启动的具体实现过程。 其实正如我在在阐述 UEFI引导程序开发的第2篇文章末尾所提到的。 如果你对整个无盘启动技术熟悉,那么对从本地镜像文件启动的理解,也不会有什么难度。 本文主要讲述的是在UEFI启动环境下的本地镜像文件启动。 其实传统的BIOS也可以实现的,但是在传统BIOS下实现起来过于繁琐。 主要是我不是太熟练传统BIOS环境下16位程序的详细开发过程。 (CSDN阐述 Legacy BIOS引导程序开发,那个代码基本做于多年前, 当时也是花了想当多的精力到处查资料,恶补16环境下的程序开发, 随着传统BIOS渐渐退出历史舞台,对16位程序的开发只会越来越陌生。) 比如第一个难题就是如何在传统BIOS环境下,实现 NTFS文件系统。 虽然可以查很早以前关于DOS的实现, 或者比如WINXP泄露的代码,找到16位环境的NTFS实现,但是我想肯定得花相当多的精力。 再比如Legacy BIOS中,有部分实现代码必须是放到固定扇区的, 实现NTFS文件系统的代码也必须放到固定扇区中,就像 windows中的ntldr,bootmgr等这些引导程序一样。 Legacy BIOS不像 UEFI, UEFI全程使用文件系统方式,你不用关心引导文件究竟该放到磁盘哪些扇区位置。 所以最终也只好放弃,只实现 UEFI 环境下的本地镜像文件启动。 自己实现本地镜像文件的启动,其实跟网络方式的无盘启动类似,

Microsoft Defender打不开,提示win11页面不可用你的it管理员已经限制对此应用解决思路

如果你在使用 Windows 11 时出现“页面不可用,你的 IT 管理员已经限制对此应用”的错误提示,这意味着你的计算机可能被配置为受控设备,受到了一些安全策略的限制,这些限制可能阻止你访问某些应用或设置。 由于这个问题导致安装某些应用时被直接删除,无法安装,为此搜寻网上解决之道未果。 Win+R gpedit.msc 将计算机配置-Windows设置-安全设置-本地策略-安全选项-用户帐户控制:以管理员批准模式运行所有管理员-已禁用 重启电脑-------无效 其他各类能搜寻来的方法一一照做,系统顽固,故障依旧(见上图)。当然重装系统肯定能解决,但这不是我想要的结果:不重装系统就能够正常安装使用特定应用程序。 于是转变思路,放弃Microsoft Defender系统组件中的Microsoft Corporation(微软杀毒),改用360杀毒软件替代它。虽然仍有“提示win11页面不可用你的it管理员已经限制对此应用”,但解决了安装特定软件的目的。 以上截图为安装360杀毒前,360杀毒安装之后见下面的截图 这个定期扫描开关始终无法打开,只要不影响安装其他应用,不管它了。 

【Docker】基于Ubuntu安装Docker和配置加速镜像

更新软件列表 sudo apt update 更新软件 sudo apt-get upgrade 安装Docker依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 添加Docker官方GPG密钥用于软件包验证。 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 添加Docker存储库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 安装Docker引擎 sudo apt install docker-ce docker-ce-cli containerd.io 启动Docker服务 sudo systemctl start docker 添加自动启动Docker服务 sudo systemctl enable docker 打印Docker版本查看是否安装成功 docker --version 安装docker-compose sudo apt install docker-compose 添加加速镜像 sudo mkdir -p /etc/docker 下面从“sudo”到“EOF”一起复制粘贴到命令行使用 sudo tee /etc/docker/daemon.

idea打war包的两种方式

idea打war包的两种方式 idea打war包方式一方式二:通过maven插件打包maven构建过程,Lifecyclemvn clean ----- 【清理】mvn compile — 【编译】mvn test-------- 【测试】mvn package----【打包】mvn install 使用idea自带的打包方式(多module时maven打包插件不管用)问题1:项目近期要上线,在对SpringCloud项目进行打包时,先是打包报错,找不到依赖的entity、utils等module项目问题2:项目在IDEA中可以正常运行,但是打包后运行jar包,还是找不到依赖module的CLASS Springboot项目打成War包和Jar包的区别以及如何转换 idea打war包 方式一 打war包快捷键:Ctrl+Shift+Alt+S 执行完上述操作之后参考下图: 最后再按照下图操作: 最后再对应的文件夹下面就会生成我们的war包: 方式二:通过maven插件打包 maven构建过程,Lifecycle mvn clean ----- 【清理】 将编译(mvn compile)产生的【target】文件夹删除掉,但是不会删除本地的maven仓库已经生成的jar文件。 mvn compile — 【编译】 在项目根目录生【target】目录,里面包含【classes】文件夹,里面是已经编译好的java类(.class文件) mvn test-------- 【测试】 会先生成target文件夹,里面有【classes】和【test-classes】文件夹,所 以执行mvn test命令时,会先编译项目,在执行测试代码 mvn package----【打包】 看到项目的根目录下【编译】后生成的【target】文件夹中多了一个Hello-0.0.1-SNAPSHOT.jar,这个Hello-0.0.1-SNAPSHOT.jar就是打包成功之后Maven帮我们生成的jar文件,package命令会先执行编译再执行打包 mvn install 是把maven构建项目的【清理clean】→【编译】→【测试】→【打包】的这几个过程都做了,同时将打包好的jar包发布到本地的Maven仓库中,所以maven最常用的命令还是"mvn install",这个命令能做的事情最多,所以这个最常用 maven在执行一个生命周期的命令的是时候将会执行之前的所有生命周期操作,比如执行mvn install,会执行前面一系列的动作包括 compile , package , test 等,具体请查看maven的官方文档。这个特性使maven的命令更加简洁易用。 详细请参考: maven的debugg信息非常完备,需要查看debug信息只要在命令后面添加 -X 参数即可,如: mvn clean package -X 就能看到非常丰富的DEBUG信息。 使用idea自带的打包方式(多module时maven打包插件不管用) 问题1:项目近期要上线,在对SpringCloud项目进行打包时,先是打包报错,找不到依赖的entity、utils等module项目 解决1:此情况下,IDEA打包顺序应该为:clean–>compile–>install,好了,打包完成。但是遇到问题2 问题2:项目在IDEA中可以正常运行,但是打包后运行jar包,还是找不到依赖module的CLASS 解决2:在parent(也就是父module)的pom.xml文件中,加入如下代码: <plugin> <groupId>org.

网口bond配置

在实际环境中,通常都要配置bond,起到一个冗余和负载均衡的作用,提高保障,接下来介绍bond的配置 一、拷贝需要配置的网卡配置文件到home目录(该步骤起到一个备份作用) 1、cd /etc/sysconfig/network-scripts/,执行cp ./ifcgf-* /home 二、创建bond配置文件 1、vim /etc/sysconfig/network-scripts/ifcfg-bond0,把下面的配置文件写入配置文件当中 DEVICE=bond0 TYPE=Ethernet NM_CONTROLLED=yes IPADDR=IP NETMASK=子网掩码 GATEWAY=网关 USERCTL=no #可写可不写 BOOTPROTO=static ONBOOT=yes BONDING_MASTER=yes BONDING_OPTS='mode=4 miimon=100 xmit_hash_policy=layer3+4' #(3+4层模式=IP+端口),这里为mode4,需要在交换机端配置动态链路聚合 三、将网卡1加入bond vim /etc/sysconfig/network-scripts/ifcfg-网卡名称 修改成如下: DEVICE=网卡名称 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none MASTER=bond0 #需要和上面 ifcfg-bond0配置文件中的DEVICE的值对应 SLAVE=yes 四、将网卡2加入bond vim /etc/sysconfig/network-scripts/ifcfg-网卡名称 修改成如下: DEVICE=网卡名称 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none MASTER=bond0 #需要和上面 ifcfg-bond0配置文件中的DEVICE的值对应 SLAVE=yes 五、重启网络,查看网卡speed service network restart ethtool bond0(bond1)