docker 卸载 使用yum安装docker 如需卸载docker可以按下面步骤操作:
1、停止docker服务 systemctl stop docker 2、查看yum安装的docker文件包 yum list installed |grep docker 3、查看docker相关的rpm源文件 rpm -qa |grep docker 4、删除所有安装的docker文件包 把以下截图五个文件全部复制到yum -y remove 后面执行 [root@localhost ~]# yum -y remove docker-compose-plugin-2.20.2-1.el7.x86_64... 其他的docker相关的安装包同样删除操作,删完之后可以再查看下docker rpm源文件,全部删干净
rpm -qa |grep docker 5、删除docker的镜像文件,默认在/var/lib/docker目录下 删除上述的docker目录
rm -rf /var/lib/docker 6、验证是否安装成功[docker version] 到此docker卸载就完成了,表示虚拟机中没有docker了
亲测有效快去尝试吧!!!
前言: 公司项目是有做资金管理相关的,涉及到充值,提现,转账等关键性的功能,需要保证数据传输的安全性,所以使用了较为简单的RSA进行生成秘钥且每个接口都需要做验签。
简介: RSA是一种非对称加密算法,它是由Rivest-Shamir-Adleman三位密码学家于1978年提出的。
RSA算法的加密规则如下:
钥匙生成:RSA算法使用两个密钥,一个是公钥(public key),用于加密数据,另一个是私钥(private key),用于解密数据。首先,密钥生成者生成一对公钥和私钥,其中公钥可以公开给任何人使用,而私钥必须保密。
加密过程:发送方使用接收方的公钥对数据进行加密。发送方将数据按照一定的规则进行转换,并使用公钥进行加密操作。加密后的数据将无法直接被解密,只能使用私钥才能将其解密。
解密过程:接收方使用自己的私钥对加密后的数据进行解密。接收方使用私钥对加密后的数据进行解密操作,从而得到原始的明文数据。
RSA算法的安全性基于两个数学难题:
质因数分解问题:将一个大的合数(通常是两个大素数的乘积)分解成质数的乘积。这个问题在目前的计算能力下非常困难。
数论中的指数问题:计算一个大数的指数函数的反函数。这个问题同样在目前的计算能力下非常困难。
通过利用这两个数学难题,RSA算法能够保证数据的加密和解密过程的安全性,确保只有持有私钥的人才能够解密数据。
本次案例用于签名验证,使用私钥用于数字签名,公钥用于验证签名的有效性
测试代码:
public static void main(String[] args) { Entity entity = new Entity(); // 使用RSA算法生成 公钥与私钥, 生成的公私钥 是一一对应的。 createRSAKey(entity); String body = "123456"; String body2 = "77897"; // 将入参数据以及私钥进行数字加签 String sign = sign(body, entity.getPrivateKey()); // 根据入参数据以及公钥进行验证签名,若入参数据body被修改或者秘钥不正确都会导致验签失败;例如加签使用body,验签使用body2则导致验签失败 boolean verifyFlag = verify(body,entity.getPublicKey(), sign); if (verifyFlag) { logger.info("验签成功"); } else { logger.info("验签失败"); } } 1. 根据RSA生成一对秘钥 构建保存秘钥的实体类Entity
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Entity { /** * 公钥 **/ private String publicKey; /** * 私钥 **/ private String privateKey; } 根据RSA算法生成秘钥
一、工具的选择 近期想将vue+js+elementUI的项目升级为vue3+ts+elementUI plus,以获得更好的开发体验,并且vue3也显著提高了性能,所以在此记录一下升级的过程 对于一个正在使用的项目手工替换肯定不是个可实现的解决方案,更优方案是基于 AST(抽象语法树)解构代码,根据既定规则,批量修改然后输出文件。 目前主流的转换工具大致有babel插件、gogo code、jscodeshift 等等,在对比了官方文档、使用方式等方面最后决定使用gogo code来进行便捷升级。(官方文档相比之下更为清晰,使用方式更为方便,对于某些代码的转换核心代码更为简洁) gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。
当前 GoGoCode 支持解析和操作如下类型的代码:
○JavaScript(JSX)
○Typescript(TSX)
○HTML
○Vue
二、升级相关依赖 1.使用gogo code
npm install gogocode-cli -g 2.迁移源文件
gogocode -s ./src -t gogocode-plugin-vue -o ./src-out // ./src为目标目录,./src-out为输出目录,若两者一致则会覆盖 3.升级依赖
gogocode -s package.json -t gogocode-plugin-vue -o package.json 4.升级elementUI
gogocode -s ./src -t gogocode-plugin-element -o ./src // elementUI不支持vue3,需升级至elementUI plus //图标相关的展示还需手动适配 //代码有语法错误的情况下进行转换会出现卡顿的情况,需手动处理 5.下载相关依赖
npm install 6.升级前注意事项
1)可能存在转化停顿情况,需要排查转换卡住的文件并暂时删除从而转化成功;
2)代码转换将根据gogocode内置的风格进行转换,可能改变原有代码的代码风格;
3)同时因为gogocode仍处于迭代过程中,不同版本会造成升级的效果有差异;
7.工具的优缺点
-h, --help:显示帮助信息并退出。
--exit:安装后立即终止。
--data-dir:指定存储所有用户数据的基本路径,默认为"./"。
--config:用于构建模型的配置文件路径,默认为 "configs/stable-diffusion/v1-inference.yaml"。
--ckpt:稳定扩散模型的检查点路径;如果指定,该检查点将被添加到检查点列表并加载。
--ckpt-dir:稳定扩散检查点的目录路径。
--no-download-sd-model:即使没有找到模型,也不下载SD1.5模型。
--vae-dir:变分自编码器模型的路径。
--gfpgan-dir:GFPGAN目录。
--gfpgan-model:GFPGAN模型文件名。
--codeformer-models-path:Codeformer模型文件的目录路径。
--gfpgan-models-path:GFPGAN模型文件的目录路径。
--esrgan-models-path:ESRGAN模型文件的目录路径。
--bsrgan-models-path:BSRGAN模型文件的目录路径。
--realesrgan-models-path:RealESRGAN模型文件的目录路径。
--scunet-models-path:ScuNET模型文件的目录路径。
--swinir-models-path:SwinIR和SwinIR v2模型文件的目录路径。
--ldsr-models-path:LDSR模型文件的目录路径。
--lora-dir:Lora网络的目录路径。
--clip-models-path:CLIP模型文件的目录路径。
--embeddings-dir:用于文本逆向的嵌入目录,默认为 "embeddings"。
--textual-inversion-templates-dir:文本逆向模板的目录。
--hypernetwork-dir:超网络目录。
--localizations-dir:本地化目录。
--styles-file:用于样式的文件名,默认为 "styles.csv"。
--ui-config-file:用于UI配置的文件名,默认为 "ui-config.json"。
--no-progressbar-hiding:不隐藏Gradio UI中的进度条(默认隐藏,因为在浏览器中使用硬件加速会降低机器学习速度)。
--max-batch-count:UI的最大批次计数值,默认为16。
--ui-settings-file:用于UI设置的文件名,默认为 "config.json"。
--allow-code:允许从Web UI执行自定义脚本。
--share:使用Gradio的share=True,并使UI通过其网站访问(对我来说不起作用,但您可能会更幸运)。
--listen:使用0.0.0.0作为服务器名称启动Gradio,允许响应网络请求。
--port:使用给定的服务器端口启动Gradio,需要根/管理员权限才能使用1024以下的端口,默认为7860(如果可用)。 34. --hide-ui-dir-config:从Web UI中隐藏目录配置。
--freeze-settings:禁用编辑设置。
--enable-insecure-extension-access:无论其他选项如何,都启用扩展选项卡。
--gradio-debug:使用--debug选项启动Gradio。
--gradio-auth:设置Gradio身份验证,如 "username:password";或逗号分隔多个,如 "u1:p1,u2:p2,u3:p3"。
--gradio-auth-path:设置Gradio身份验证文件路径,例如 "/path/to/auth/file",与--gradio-auth的格式相同。
--disable-console-progressbars:不在控制台输出进度条。
--enable-console-prompts:在使用txt2img和img2img生成时,在控制台打印提示。
--api:使用API启动Web UI。
--api-auth:设置API身份验证,如 "username:password";或逗号分隔多个,如 "u1:p1,u2:p2,u3:p3"。
--api-log:启用所有API请求的日志记录。
--nowebui:仅启动API,不启动UI。
--ui-debug-mode:不加载模型以快速启动UI。
--device-id:选择要使用的默认CUDA设备(可能需要在此之前设置CUDA_VISIBLE_DEVICES=0,1等环境变量)。
--administrator:管理员权限。
--cors-allow-origins:以逗号分隔的列表形式允许的CORS来源(无空格)。
--cors-allow-origins-regex:以单个正则表达式的形式允许的CORS来源。
--tls-keyfile:部分启用TLS,需要--tls-certfile才能完全生效。
--tls-certfile:部分启用TLS,需要--tls-keyfile才能完全生效。
1,表达式 --replace() --语法: REPLACE ( string_expression , string_pattern , string_replacement ) --参数: string_expression:字符串表达式 string_pattern:想要查找的子字符串 string_replacement:想要替换成的子字符串 2、查询替换 --将address字段里的 “区” 替换为 “呕” 显示,如下 select *,replace(address,'区','呕') AS rep from test_tb --ERP中我们对某一个字段中的数据进行去括号 YS = replace(replace(SCDDH.YSJ,'(',''),')','') 先用replace去左括号: replace(SCDDH.YSJ,'(','') 再用replace去右括号 )replace(SCDDH.YSJ,'(','') 2、更新替换 将address字段里的 “东” 替换为 “西” ,如下 update test_tb set address=replace(address,'东','西') where id=2 总结:对字段中局部字符串做更新替换。 3、插入替换 将id=6的name字段值改为wokou replace into test_tb VALUES(6,'wokou','新九州岛','日本') 总结:向表中“替换插入”一条数据,如果原表中没有id=6这条数据就作为新数据插入(相当于insert into作用);如果原表中有id=6这条数据就做替换(相当于update作用)。对于没有指定的字段以默认值插入。
文章目录 1 前言2 API获取3 官方文档的调用代码4 Streamlit 网页的搭建4.1 代码及效果展示4.2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0,这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日,博主对讯飞认知大模型进行了详细的分析,详情请至博文《星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)》了解。
总的来说,讯飞星火认知大模型表现出卓越的整体性能,在多个领域展现出优秀水平,并且独具多模交互的能力,使其适用的领域更为广泛。特别值得关注的是其中的语义测试、常识性测试以及事件分类测试,这些测试项目揭示了讯飞认知大模型与GPT之间的差异。在常识和事件分类测试中,讯飞认知大模型展示出更出色的表现,而在语义测试中,GPT在准确识别讽刺意味方面更为优秀!
本篇博文聚焦于利用讯飞星火认知大模型的API,基于Streamlit构建个人Web智能对话应用的实践案例。
在本文中,我们将深入探讨如何利用讯飞星火认知大模型的强大功能,为个人Web应用赋予智能对话的能力。我们将介绍整个开发过程的步骤和技术细节,并分享一些关键的使用经验和优化策略。无论您是对智能对话应用开发感兴趣的开发者,还是想要了解讯飞星火认知大模型在实际应用中的表现的研究者,本文都将为您提供宝贵的参考和实践经验。
如果您对Streamlit感兴趣,并且希望深入了解更多相关知识,我强烈推荐您关注我的专栏——《最全Streamlit教程》。
在这个专栏中,我将分享一系列深入而详尽的Streamlit教程和实战案例。我们将探索Streamlit在Web应用开发中的广泛应用,从基本概念到高级功能的全方位覆盖。
通过这些教程,您将深入了解Streamlit的核心原理、工作流程和常见用法。我将解析Streamlit的各个组件和功能,并提供实用的示例代码和技巧,助您快速上手并构建出令人惊叹的交互式应用程序。
2 API获取 要使用讯飞星火认知大模型的功能,您需要向讯飞官方提交申请表单(官网地址)。
在页面上点击"API测试申请",按照指示填写并创建应用,填写正确的信息后,您只需稍等一两天,便可收到讯飞发来的短信通知。随后,您可以登录到开发者工作台,获取所需的appid、api_secret、api_key等关键信息。
3 官方文档的调用代码 为了在Python环境下使用Streamlit工具,博主下载了讯飞官方文档中的Python调用示例,以便更好地理解和应用该工具。您可以通过以下链接下载官方文档:下载链接
在解压后的文件夹中,您将找到两个Python文件:SparkApi.py和test.py。其中,SparkApi.py是讯飞官方提供的库文件,无需进行任何修改。而我们的重点将放在对test.py文件的研究和修改上。
在您的环境中,为了确保能够成功搭建本篇博文所介绍的项目,您至少需要安装以下必要的库:
pip install streamlit pip install websocket-client pip install streamlit_chat 我们来看看test.py文件中的代码:
import SparkApi #以下密钥信息从控制台获取 appid = "XXXXXXXX" #填写控制台中获取的 APPID 信息 api_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #填写控制台中获取的 APISecret 信息 api_key ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #填写控制台中获取的 APIKey 信息 #用于配置大模型版本,默认“general/generalv2” domain = "general" # v1.5版本 # domain = "generalv2" # v2.
文章目录 前言效果展示原理说明服务器端代码说明微信小程序代码说明代码链接总结更新日志2023/5/13 14:42更新 前言 我在前一段时间突发奇想,就使用java来调用chatgpt的接口,然后写了一个简单小程序,也上了热榜第一,java调用chatgpt接口,实现专属于自己的人工智能助手,事实上,这个程序毛病挺多的,最不能让人接受的一点就是返回速度非常缓慢(即使使用非常好的外网服务器)。
现在,我改进了一下程序,使用异步请求的方式,基本可以实现秒回复。并且还基于webSocket编写了一个微信小程序来进行交互,可以直接使用微信小程序来进行体验。
现在我将所有代码都上传了github(链接在文章结尾),大家可以clone下来,部署到服务器上,真正实现自己的聊天机器人!!!
效果展示 部分截图如下
原理说明 在 java调用chatgpt接口,实现专属于自己的人工智能助手 我说明了java调用chatgpt的基本原理,这里的代码就是对这个代码的改进,使用异步请求的方式来进行。
注意看官方文档,我们在请求时可以提供一个参数stream,然后就可以实现按照流的形式进行返回,这种方式基本可以做到没有延迟就给出答案。
由于这次改进的思路主要就是将请求改为了异步,其他的基本一样,所以就不做解释,直接给出代码了,代码上面都有注释
/** * 这个方法用于测试的,可以在控制台打印输出结果 * * @param chatGptRequestParameter 请求的参数 * @param question 问题 */ public void printAnswer(ChatRequestParameter chatGptRequestParameter, String question) { asyncClient.start(); // 创建一个post请求 AsyncRequestBuilder asyncRequest = AsyncRequestBuilder.post(url); // 设置请求参数 chatGptRequestParameter.addMessages(new ChatMessage("user", question)); // 请求的参数转换为字符串 String valueAsString = null; try { valueAsString = objectMapper.writeValueAsString(chatGptRequestParameter); } catch (JsonProcessingException e) { e.printStackTrace(); } // 设置编码和请求参数 ContentType contentType = ContentType.
点击名片关注 阿尘blog,一起学习,一起成长
本文主要分享由微软开发的实现Web UI自动化测试工具Playwright库,相比于之前学习过selenium库,playwright对于编写自动化代码绝对是更轻松了,因为它支持脚本录制,如果只求简单点可以不用写一行代码就能够实现自动化,而且playwright有许多强大的api,很多功能比起selenium都轻松简单,好了话不多说,开启正文~
playwright简介和初步使用 1.1 playwright简介 playwright优点(这里就直接摘抄一下官网的哈,不是重点)
任意浏览器 • 全平台 • 同一套 API
跨浏览器。 Playwright 支持所有现代渲染引擎,包括:Chromium、WebKit 和 Firefox。
跨平台。 适用于 Windows、Linux、macOS、本地运行、 CI、headless 和 headed。
跨语言。 在 TypeScript, JavaScript, Python, .NET, Java 中使用 Playwright API
测试移动端 Web 。 对 Android 和 Mobile Safari 的 Google Chrome 原生移动端模拟。与你的移动端和云端应用采用相同的渲染引擎。
强适应性 • 测试不再容易失效
自动等待(auto-waits)。 Playwright 能够自动等待元素达到可操作的状态,外加一系列丰富的内置事件。不用再人工定义超时(timeouts) —— 这是测试容易失效的主要原因。
Web 优先的断言。 Playwright 断言专门为动态加载的 web 应用设计。能够在满足需要的条件前自动重试。
可追踪。 通过配置重试策略,采用捕捉执行轨迹、视频、截图来解决测试容易失效的问题。
不用再权衡取舍 • 不再有限制
浏览器在不同进程中运行属于不同来源的 Web 内容。Playwright 与现代浏览器架构保持一致,并在进程外运行测试。这使 Playwright 摆脱了典型的进程内测试运行程序限制。
简单几步实现本地ASP.Net.Core web 站点结合cpolar内网穿透工具实现远程访问
1. 创建站点 *环境搭建,这边测试,使用.NET 6.0 SDK,可以点击跳转到官网下载,下载后安装即可.
安装完成后,进入到某个文件夹,打开powershell执行下面命令,创建新的 Web 应用,名称叫:aspnetcoreapp
dotnet new webapp -o aspnetcoreapp 2. 运行站点 信任开发证书,ASP.Net Core站点可以使用https,我们执行下面命令开启
dotnet dev-certs https --trust 然后进入站点目录
cd aspnetcoreapp 运行站点
dotnet watch run 执行运行命令后,我们可以看到有两种访问方式,一种https和http
使用https地址访问,我们即可看到web站点界面,默认会自动跳转到浏览器打开,这样我们站点就启动了,端口是7032
3. 安装cpolar cpolar官网:https://www.cpolar.com/
访问cpolar官网,注册一个账号,然后下载并安装客户端,具体安装教程可以参考官网文档教程。
windows系统:在官网下载安装包后,双击安装包一路默认安装即可。linux系统:支持一键自动安装脚本,详细请参考官网文档——入门指南 cpolar安装成功后,在浏览器上访问本地9200端口【http://localhost:9200】,使用cpolar账号登录。
4. 创建公网地址 点击左侧仪表盘的隧道管理——创建隧道,创建一个我们上面https访问方式的7032隧道,https方式需要特别注意在填写本地地址的时候!
隧道名称:可自定义命名,注意不要与已有的隧道名称重复协议:选择http本地地址:https://127.0.0.1:7032域名类型:免费选择随机域名地区:选择China vip 点击创建
隧道创建成功后,点击左侧的状态——在线隧道列表,查看所生成的公网地址,有两种访问方式,一种是http 和https
5. 公网访问 我们使用https公网地址访问,即可看到我们本地的ASP.Net.Core站点,这样一个公网地址访问就创建好了,哪怕本地是https也是可以访问的
6. 固定公网地址 由于以上使用cpolar所创建的隧道使用的是随机公网地址,24小时内会随机变化,不利于长期远程访问。因此我们可以为其配置二级子域名,该地址为固定地址,不会随机变化【ps:cpolar.cn已备案】
注意需要将cpolar套餐升级至基础套餐或以上,且每个套餐对应的带宽不一样。【cpolar.cn已备案】
登录cpolar官网,点击左侧的预留,选择保留二级子域名,设置一个二级子域名名称,点击保留,保留成功后复制保留的二级子域名名称
保留成功后复制保留的二级子域名地址
登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的3000隧道,点击右侧的编辑
修改隧道信息,将保留成功的二级子域名配置到隧道中
域名类型:选择二级子域名Sub Domain:填写保留成功的二级子域名 点击更新
更新完成后,打开在线隧道列表,此时可以看到公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称
最后,我们使用固定的公网地址访问ASP.Net.Core站点,可以看到访问成功
以看到公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称
[外链图片转存中…(img-iJjZf9h5-1688039516163)]
最后,我们使用固定的公网地址访问ASP.Net.Core站点,可以看到访问成功
内容简介
前言: 摊牌了,本来就有点喜新厌旧的我,特意把系统和开发环境都拉到比较高,想试验一下兼容性和某些新特性,探索了一下新大陆,也见识了各种光怪陆离的妖魔鬼怪。
因为要着手云平台项目的重构改版和新系统的架构和开发,而Nacos和MySQL总是出现各种奇奇怪怪的问题,考虑到可能是因为JDK版本和系统版本比较高,兼容性和稳定性还是有些担忧,于是放弃幻奔回解放前,顺手讲JDK回退至JDK1.8 。 当然另一个主要原因是jdk 1.8以上版本据说已经开始收费了,想到当年O哥和G哥因为JAVA干官司,咱还是用用免费JDK版本算了。
处理过程备个忘,弥补一下本来就稀缺的大脑🧠内存资源。也就此分享给需要的胖友们。
一、Mac OS 查看系统版本信息/硬件信息的命令 文章目录 1、查看硬盘信息2、查看系统内核信息3、查看 OS 版本信息 1、查看硬盘信息 MacBook-Pro$ system_profiler SPHardwareDataType Hardware: Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro14,3 Processor Name: Quad-Core Intel Core i7 Processor Speed: 2.9 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (per Core): 256 KB L3 Cache: 8 MB Hyper-Threading Technology: Enabled Memory: 16 GB System Firmware Version: 515.0.0.0.0 OS Loader Version: 577.
前言:
💥🎈个人主页:Dream_Chaser~ 🎈💥
✨✨专栏:http://t.csdn.cn/oXkBa
⛳⛳本篇内容:c语言数据结构--带头双向循环链表
目录
一.带头双向循环链表
A.带头双向循环链表概念
B.带头双向循环链表的实现
1.带头双向循环链表的结构
2.动态申请节点函数
3.链表的初始化
4.链表打印
5.链表尾部插入节点
6.链表头部插入节点
7.链表尾删节点 8.链表头删节点
9.链表查找/修改某个值
10.在链表pos位置之前插入值
LTInsert实现尾插操作:
LTInsert实现头插操作:
11.在链表pos位置处删除此节点
LTErase实现尾删:
LTErase实现头删
12.求链表的长度函数
13.释放链表动态申请的空间
Test.c
List.h
List.c
一.带头双向循环链表 链表的分类 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
怎么算出8种情况:每次两种情况,三次,所以是2*2*2=8。
1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:
1. 无头单向非循环链表: 结构简单 ,一般不会单独用来存数据。实际中更多是作为 其他数据结 构的子结构 ,如哈希桶、图的邻接表等等。另外这种结构在 笔试面试 中出现很多。 2. 带头双向循环链表: 结构最复杂 ,一般用在单独存储数据。实际中使用的链表数据结构,都 是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带 来很多优势,实现反而简单了,后面我们代码实现了就知道了。 A.带头双向循环链表概念 带头双向循环链表(Doubly Circular Linked List with a Head)是一种链表数据结构,它具有以下特点:
头节点:带头双向循环链表包含一个头节点,它位于链表的起始位置,并且不存储实际数据。头节点的前驱指针指向尾节点,头节点的后继指针指向第一个实际数据节点。
循环连接:尾节点的后继指针指向头节点,而头节点的前驱指针指向尾节点,将链表形成一个循环连接的闭环。这样可以使链表在遍历时可以无限循环,方便实现循环操作。
双向连接:每个节点都有一个前驱指针和一个后继指针,使得节点可以向前和向后遍历。前驱指针指向前一个节点,后继指针指向后一个节点。
总结:带头双向循环链表可以支持在链表的任意位置进行插入和删除操作,并且可以实现正向和反向的循环遍历。通过循环连接的特性,链表可以在连续的循环中遍历所有节点,使得链表的操作更加灵活和高效。
B.带头双向循环链表的实现 1.带头双向循环链表的结构 typedef int LTDataType;//代码中将int定义为LTDataType是为了提供代码的可读性和可维护性,并增加代码的灵活性。 typedef struct ListNode { struct ListNode* next;//存储下一个节点的地址 struct ListNode* prev;//存储上一个节点的地址 LTDataType data; }LTNode;//重新命名结构体类型 通过将int定义为LTDataType,可以在代码中使用LTDataType作为数据类型,而不是直接使用int。这样做的好处有以下几点:
目录
一、Bean的初始化过程
1. 加载Spring Bean
2. 解析Bean的定义
3. Bean属性定义
4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象
6. Aware感知
7. 初始化方法
8. 后置处理
9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式(Singleton)
2.2 多例模式(Prototype)
2.3 案例演示:
2.3.1 单例模式:
2.3.2 多例模式:
2.4 总结
三、关于bean的生命周期面试题
1. 请详细描述Spring框架Bean的生命周期包括哪些阶段?
2. 请详细描述一下Spring Bean的初始化过程
3. Spring Bean的销毁过程是怎样的?
4. Spring Bean的后置处理器是什么?在项目中如何使用它?
5. Spring Bean的生命周期中,哪些方法可以进行自定义操作?
6. 什么是Bean的作用域?Spring中有哪些Bean的作用域?
7. Bean的作用域是如何实现的?请描述其原理。
8. 请解释Spring中的延迟初始化是什么,如何配置延迟初始化?
一、Bean的初始化过程 1. 加载Spring Bean 通过XML、Java annotation(注解)以及Java Configuration(配置类)等方式加载Spring Bean:这是指在Spring容器启动时,通过配置文件、注解或配置类等方式告诉Spring框架需要创建哪些Bean。
2. 解析Bean的定义 BeanDefinitionReader:这是一个解析器,它将Bean的定义解析成Spring内部的BeanDefinition结构。可以将其理解为将配置文件中的<bean>标签转换为Spring框架内部使用的数据结构。
可理解为:将spring.xml中的 <bean> 标签转换成BeanDefinition结构有点类似于XML解析。
前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。
一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的
webview_flutter 不建议使用,因为效果不怎么样,当然也可能是我太菜不会用,下面这个问题就很难理解为什么会这样?
基本使用 官方文档
https://pub-web.flutter-io.cn/packages/webview_flutter
安装
flutter pub add webview_flutter 加载并显示web
可以加载html字符串,也可以直接加载url链接。官方都提供了对应的方法,这里演示加载url
初始化 late WebViewController webViewController; //初始化 @override void initState() { super.initState(); webViewController = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted); } 显示
显示的时候一般需要结合FutureBuilder,比较这是一个异步的过程 FutureBuilder( // 异步方法 future: searchNovelFromWeb(), builder: (context, snapshot) { // 等待状态显示的widget if (snapshot.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); // 错误时显示的widget } else if (snapshot.hasError) { return const Text('Error'); } else { return snapshot.data ?
概述 HttpUtil是应对简单场景下Http请求的工具类封装,此工具封装了HttpRequest对象常用操作,可以保证在一个方法之内完成Http请求。
此模块基于JDK的HttpUrlConnection封装完成,完整支持https、代理和文件上传。
导包 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.1</version> </dependency> 读取页面,返回整个页面内容报文 针对最为常用的GET和POST请求,HttpUtil封装了两个方法,
HttpUtil.getHttpUtil.post
这两个方法用于请求普通页面,然后返回页面内容的字符串,同时提供一些重载方法用于指定请求参数(指定参数支持File对象,可实现文件上传,当然仅仅针对POST请求)。 get 请求页面 // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS String result1= HttpUtil.get("https://www.baidu.com"); // 当无法识别页面编码的时候,可以自定义请求页面的编码 String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8); //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("city", "北京"); String result3= HttpUtil.get("https://www.baidu.com", paramMap); 返回结果:
post 请求页面 HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("city", "北京"); String result= HttpUtil.post("https://www.baidu.com", paramMap); 上传文件 HashMap<String, Object> paramMap = new HashMap<>(); //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别 paramMap.put("file", FileUtil.file("D:\\face.jpg")); String result= HttpUtil.post("https://www.baidu.com", paramMap); 下载文件 因为Hutool-http机制问题,请求页面返回结果是一次性解析为byte[]的,如果请求URL返回结果太大(比如文件下载),那内存会爆掉,因此针对文件下载HttpUtil单独做了封装。文件下载在面对大文件时采用流的方式读写,内存中只是保留一定量的缓存,然后分块写入硬盘,因此大文件情况下不会对内存有压力。
前言
在当今数字时代,前端技术正日益成为塑造用户体验的关键。我们在开发中需要用到很多js的内置对象的一些属性来帮助我们更快速的进行开发。或许你是刚踏入前端领域的小白,或者是希望深入了解内置对象的开发者,不论你的经验如何,本篇博客都将给你详细的讲解js的内置对象。
🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈:Vue、React、Python、Java
🎈 本文收录于小豪的前端系列专栏,后续还会更新前端入门以及前端面试的一些相关文章,手把手带你从零学习前端到面试找工作,并如果有想进入前端领域工作的同学,这个前端专栏会对你有所帮助,欢迎关注起来呀
🌼 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中,大家感兴趣的可以关注一下我的人工智能专栏
🌊 云原生的入门学习系列,大家有兴趣的可以看一看
本文目录 全局对象值属性Infinity说明示例 NaN说明示例值校验 undefined说明 函数属性eval语法说明示例 isNaN语法说明示例 parseFloat语法示例 parseInt语法示例 decodeURI语法示例 encodeURI语法说明示例 Object语法Object.assign语法描述示例基本示例 Object.create语法示例类式继承 Object.defineProperties语法示例 Object.defineProperty语法示例对象属性劫持 Object.entries语法方法说明代码示例 Object.entries语法方法说明代码示例 Object.getOwnPropertyDescriptor语法示例 Object.getOwnPropertyDescriptors语法代码示例 Object.getPrototypeOf语法示例基本示例标准内置对象 Object.is语法描述示例 Object.keys语法描述示例数组类数组不可枚举属性 Object.setPrototypeOf语法示例代码实现 Object.values语法方法说明代码示例 Object.prototype.hasOwnProperty语法描述示例基本示例自有属性与继承属性 Object.prototype.isPrototypeOf语法示例 Object.prototype.prototypeIsEnumerable语法示例基本示例自有属性与继承属性 Object.prototype.toString语法描述示例基本示例检测对象类型 Object.isExtensible语法描述示例 Function语法Function.prototype.apply语法描述示例数组元素添加内置函数使用 Function.prototype.call语法示例 Function.prototype.bind语法描述示例创建绑定函数偏函数配合定时器 String语法说明模板字面量 String.fromCharCode语法使用示例 String.prototype.charAt()语法说明示例 String.prototype.charCodeAt()语法说明示例 String.prototype.concat()语法说明示例 String.prototype.endsWith()语法说明示例 String.prototype.includes()语法示例 String.prototype.indexOf()语法示例区分大小写统计字符串中字母数量检测字符是否存在 String.prototype.match()语法 说明示例全局模式和不区分大小写模式不传参数判断是否是微信浏览器 String.prototype.replace()语法描述示例代码示例 String.prototype.slice()语法描述示例代码示例 String.prototype.split()语法描述示例代码示例 String.prototype.toLowerCase()语法描述示例 String.prototype.toUpperCase()语法描述示例 Array 对象语法Array.from()语法方法说明代码示例基本用法 Array.isArray()语法代码示例 Array.prototype.concat()语法方法说明代码示例连接两个数组 Array.prototype.indexOf()语法方法说明代码示例基本用法 Array.prototype.join()语法方法说明代码示例基本用法 Array.prototype.flat()语法代码示例基本用法 Array.prototype.every()语法方法说明代码示例 Array.prototype.filter()语法方法说明代码示例基本用法 Array.prototype.find()语法代码示例用对象的属性查找数组里的对象 Array.prototype.findIndex()语法代码示例基本用法 Array.prototype.forEach()语法方法说明代码示例 Array.prototype.map()语法方法说明代码示例 Array.
思路: 通过媒体录制器MediaRecorder实现:MediaRecorder是Android自带的音频和视频录制工具,它通过操纵摄像头和麦克风完成媒体录制,既可录制视频,又可单独录制音频。
MediaRecorder常用方法(录音与录像通用): reset:重置录制资源。prepare:准备录制。start:开始录制。stop:结束录制。release:释放录制资源。setOnErrorListener:设置错误监听器。可监听服务器异常和未知错误的事件。需要实现接口MediaRecorder.OnErrorListener的onError方法。setOnInfoListener:设置信息监听器。可监听录制结束事件,包括达到录制时长或达到录制大小。需要实现接口MediaRecorder.OnInfoListener的onInfo方法。setMaxDuration:设置可录制的最大时长,单位毫秒。setMaxFileSize:设置可录制的最大文件大小,单位字节。setOutputFile:设置输出文件的路径。 setOutputFormat:设置媒体输出格式OutputFormat类的输出格式格式分类扩展名格式说明AMR_NB音频.amr窄带格式AMR_WB音频.amr宽带格式AAC_ADTS音频.aac高级的音频传输流格式MPEG_4视频.mp4MPEG4格式THREE_GPP视频.3gp3GP格式 音频录制示例,上代码 一.权限添加 <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> 权限区分版本33及以上和以下
动态权限请求:
使用权限请求库,在app的build.gradle添加
// 权限请求 implementation 'com.guolindev.permissionx:permissionx:1.7.1' 使用音频抖动动效
// https://github.com/xfans/VoiceWaveView implementation 'com.github.xfans:VoiceWaveView:1.0.2' /** * 请求视频、音频、图片权限 */ private void requestPermission() { ArrayList<String> requestList = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requestList.add(Manifest.permission.READ_MEDIA_IMAGES); requestList.add(Manifest.permission.RECORD_AUDIO); requestList.add(Manifest.permission.READ_MEDIA_VIDEO); } else { requestList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); requestList.add(Manifest.permission.READ_EXTERNAL_STORAGE); requestList.add(Manifest.permission.RECORD_AUDIO); } PermissionX.init(this) .permissions(requestList) .onExplainRequestReason((scope, deniedList) -> { scope.
一、活动任务 资源类型时间上传地址上传【计算机课程作业/毕设】资源6月14日-8月31日https://upload.csdn.net/creation/uploadResources?taskId=6497e9f74782d60772285433&utm_source=blog上传【电赛】资源8月17日-8月31日https://upload.csdn.net/creation/uploadResources?spm=1003.2105.3001.5355&taskId=64ddc9191063c149c034e037&utm_source=blog上传【Java】资源6月14日-12月31日https://upload.csdn.net/creation/uploadResources?taskId=64883dedc49a4f1e400e647e&utm_source=blog上传【python】资源7月25日-9月25日https://upload.csdn.net/creation/uploadResources?taskId=64bf6153bcf37b287917ad2d&utm_source=blog上传【Matlab】资源7月12日-9月30日https://upload.csdn.net/creation/uploadResources?spm=1003.2105.3001.5355&taskId=64ae79cebf6b846021156e93&utm_source=blog上传【C语言】资源7月27日-9月27日https://upload.csdn.net/creation/uploadResources?taskId=64c1db11265ed072321059d5&utm_source=blog上传【C++】资源7月27日-9月27日https://upload.csdn.net/creation/uploadResources?taskId=64c1dbeb265ed072321059d6&utm_source=blog上传【MySQL】资源7月27日-9月30日https://upload.csdn.net/creation/uploadResources?taskId=64c1dc3d265ed072321059d7&utm_source=blog其他VIP专享资源每月一期https://upload.csdn.net/creation/uploadResources?utm_source=blog 往期奖励:(戳此查看)
二、奖励对象 1、Lv1级以上的CSDN文库作者在活动时间内上传【VIP专享资源】及【积分资源】并选择参与活动
2、参与本活动的作者上传的资源在活动时间内获得下载即有机会获得作者奖励
>>>查看我的作者等级
三、奖励设置 作者奖励=资源下载奖励+上榜奖励
①资源下载奖励: 采取奖金池模式,具体收益与活动期间参与上传资源的质量、下载人数有关。上传更多优质资源并获得下载,奖励会越高(单个资源最高奖励88元)
②上榜奖励:参与本活动的资源下载人数≥20时或每期成长任务上传资源量(审核通过)大于100个,即有机会上榜,最终取榜单前5名给予CSDN定制T恤一件。
四、奖励发放 1、结算时间:每个奖励周期结束后的7个工作日内发放(遇节假日顺延)
2、发放方式:奖励现金奖励。现金奖励发放至作者参与本活动时使用的CSDN账号下载收益中;虚拟奖品发放至作者参与本活动时使用的CSDN账号中,实物奖品将由工作人员联系您提供地址后寄出。
五、活动说明 上传的资源需符合CSDN站内规定,符合相关法律法规要求; 在非活动期上传的资源或资源不符合活动规则时,无法参与瓜分奖金的活动 CSDN鼓励优质原创内容,重复/低质/违反CSDN站内规定/违反法律法规的资源不可参加本活动; 如发现作弊或有违反活动规则或CSDN站内规定等情形的,CSDN有权收回奖励并取消其活动参与资格,并有权对其账号进行处罚(第一次发现禁止上传3天,第二次禁止上传30天,第三次禁止上传6个月),平台有权追究其法律责任; CSDN 提醒作者注意以上活动规则,参与活动即视为作者已阅读并认可本活动规则,理解并愿意接受本活动规则的约束。 六、往期获奖 四月【上传资源,瓜分现金】活动获奖结果已出炉(https://upload.csdn.net/creation/uploadResources?taskId=64bf6153bcf37b287917ad2d&utm_source=blog)
无人机集群在遂行编队飞行时,为避免外界干扰,应尽可能保持电磁静默,少向外发射电 磁波信号。为保持编队队形,拟采用纯方位无源定位的方法调整无人机的位置,即由编队中某 几架无人机发射信号、其余无人机被动接收信号,从中提取出方向信息进行定位,来调整无人 机的位置。编队中每架无人机均有固定编号,且在编队中与其他无人机的相对位置关系保持不 变。接收信号的无人机所接收到的方向信息约定为:该无人机与任意两架发射信号无人机连线 之间的夹角(如图 1 所示)。例如:编号为 FY01 、 FY02 及 FY03 的无人机发射信号,编号为 FY04 的无人机接收到的方向信息是 𝛼 1 , 𝛼 2 和 𝛼 3 。 图 1 无人机接收到的方向信息示意图 请建立数学模型,解决以下问题: 问题 1 编队由 10 架无人机组成,形成圆形编队,其中 9 架无人机(编号 FY01~FY09 )均 匀分布在某一圆周上,另 1 架无人机(编号 FY00 )位于圆心(见图 2 )。无人机基于自身感知 的高度信息,均保持在同一个高度上飞行。 图 2 圆形无人机编队示意图 (1) 位于圆心的无人机(FY00)和编队中另 2 架无人机发射信号,其余位置略有偏差的无 机被动接收信号。当发射信号的无人机位置无偏差且编号已知时,建立被动接收信号无人机 的定位模型。(2) 某位置略有偏差的无人机接收到编号为 FY00 和 FY01 的无人机发射的信号,另接编队中若干编号未知的无人机发射的信号。若发射信号的无人机位置无偏差,除 FY00 和 FY01 外,还需要几架无人机发射信号,才能实现无人机的有效定位? (3) 按编队要求, 1 架无人机位于圆心,另 9 架无人机均匀分布在半径为 100 m 的圆周上。 当初始时刻无人机的位置略有偏差时,请给出合理的无人机位置调整方案,即通过多次调整, 每次选择编号为 FY00 的无人机和圆周上最多 3 架无人机遂行发射信号,其余无人机根据接收到的方向信息,调整到理想位置(每次调整的时间忽略不计),使得 9 架无人机最终均匀分布在某个圆周上。利用表 1 给出的数据,仅根据接收到的方向信息来调整无人机的位置,请给出具体的调整方案。 2.
问题描述 开了网络代理之后,python 的 pip 就无法安装包了,报如下错误:
$ pip install netsm Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1123)'))': /simple/netsm/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1123)'))': /simple/netsm/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.
一、html2canvas – 将dom变成图片: 下载或者安装html2canvas:官网 1、将文档放在本地,用原生js进行引用和使用。 ① 新建一个名为 html2canvas.min.js 的文件,并且将线上的内容进行复制。
② 引入 js 文件:
// js直接引入 -- 未尝试 <script type="text/javascript" src="XXX/html2canvas.js"></script> // layui使用 // 首先在html2canvas.js文件中添加exports layui.define([],function(exports){ // 复制的内容... exports('html2canvas',html2canvas); }) // 其次进行自定义插件的引入 layui.define(['appsmenu'],function (exports) { exports("conf", { // 第三方扩展 extend: { // 引入html转图片的插件 html2canvas: "lay/extends/html2canvas.min", } } }) 2、使用 npm 进行安装使用: 待续。。。
二、jsPDF – 将图片变成pdf: 下载或者安装jsPDF : github中文网站CDN Jspdf.es.js:ES 2015 模块格式。Jspdf.umd.js:UMD模块格式,用于 AMD 或脚本标签加载。Jspdf.polyfills.js:Internet Explorer等旧浏览器所需的兼容文件。 1、将文档放在本地,用原生js进行引用和使用。 ① 新建一个名为 jsPDF.min.js 的文件,并且将线上(我找到的都不能用)或者资源 的内容进行复制。