GPT-4o 免费开放!体验 AI 对话的无限可能!手把手教你普通用户如何切换到4o版本使用!

大家好,我是影子。今天一觉醒来,发现朋友圈传开了GPT-4o可以免费使用了。 相信大家都使用过GPT-3.5的版本,但是无论是智能程度还是联网查询等一些需求都无法给我们实现,这不,4o的出现直接解决了这些问题。 下面影子将从三个方面让你明白4o的功能,并且使用起来。 一、4o与4的区别 这里贴出一份图片比较版 二、扩展功能 OpenAI 一直在努力改进用户通过语音与 ChatGPT 交流的体验,力求让对话更加逼真。然而,早期版本由于响应延迟,影响了对话的流畅性和沉浸感。GPT-4o 引入了全新的技术,大幅提升了响应速度。穆里·穆拉蒂指出,新版本能够迅速回应用户的提问,带来更自然的对话体验。 此外,GPT-4o 还扩展了其功能,除了文字、图片和语音处理外,还支持 AI 视频通话。通过视频,GPT-4o 能识别用户的表情和情绪变化,并解答各种问题,如在线解数学题,甚至可以和用户一起逗狗。 在发布会上,OpenAI 展示了 GPT-4o 的语音对话能力,演示了其快速响应和文本转语音的功能,对话显得更加真实自然。GPT-4o 还能根据要求调整语气和声音,比如看到写着“我爱ChatGPT”的纸条时,会模仿小女生害羞地尖叫。发布会还展示了其唱歌和指导数学题解的能力,能够帮助用户求解简单的方程。 此外,OpenAI 还推出了桌面版 ChatGPT 和新的用户界面。穆里·穆拉蒂表示:“虽然这些模型越来越复杂,但我们希望用户与 AI 的互动变得更加自然和轻松,使用户可以专注于与模型的协作,而不必费心于操作界面。” 三、普通用户使用流程 影子发现还是有一部分小伙伴不知道如何切换到4o的版本,这里给大家做个演示。 大家今天进入GPT页面后,会收到这个试用的邀请,点击立即试用后进入对话页面即可。 ps:如果没有收到这个邀请,可能是灰度测试阶段,稍等一段时间再进入看看。 2. 直接在对话框进行对话,会发现已经自动切换到4o版本。 此外,影子还测试了 GPT-4o 的速度,结果显示它相比于 GPT-3.5 确实有了显著的提升。GPT-4o 不仅响应速度更快,还新增了联网功能,使得其在处理和获取实时信息方面更加便捷和高效。用户现在可以通过 GPT-4o 获取最新的资讯,解决更复杂的问题。 然而,需要注意的是,普通用户每天使用 GPT-4o 的次数是有限制的。超出这个限制后,使用将受到限制。这意味着用户需要合理安排与 GPT-4o 的互动,确保在有限的使用次数内最大化利用其强大的功能和服务。 这一限制虽然存在,但 GPT-4o 的性能提升和新增功能依然为用户带来了更优质的体验。无论是日常信息查询、复杂问题解答,还是通过联网功能获取最新资讯,GPT-4o 都展现出了强大的能力。用户在使用时需注意次数限制,合理规划与 GPT-4o 的互动,才能充分体验其带来的便利和高效服务。 本文完。 以上就是本次的分享,下面是影子为你带来的两份大礼。 一、欢迎加我的微信围观影子的AI编程玩法,你可以直接与影子交流,无论是Java领域还是AI编程玩法,影子都已深耕多年,期待与你的相遇~ 二、加好友时备注 AI+编程,送你一份影子沉淀多个月的AI学习资料,帮助你快速入门。详细可参考下面的文章: AI编程学习https://blog.csdn.net/yingzix688/article/details/137894050 最后影子再做个自我介绍: AI+编程深耕者,致力于通过AI减少工作时间,提高开发效率,帮助小白早日踏进AIG的时代。 在影子这里,如果你是小白,你可以学习到AI+编程的入门玩法,帮助你解决一些编程开发的重复性问题;如果你有基础,影子可以给你提供进阶的知识,让你的AI+编程能力更进一步。 同时影子也会分享自己使用AI作为副业赚钱的经历。 影子的梦想是帮助更多编程小白入门AI+编程,而在即将到来的AIG时代,只会淘汰不会使用AI的编程者,希望能有更多的人可以在影子这里学习到AI编程的能力,在未来的AI时代中,不被淘汰。

Android 高德地图 添加 天地图 卫星瓦片图片(解决高德地图部分地区放大后无卫星图片问题)

废话不多说,直接商代吗 高德地图的加载就不多说了,这个直接去高德官网看就行了 高德官网:概述-Android 地图SDK | 高德地图API 下面我们就说如何添加天地图瓦片图层 天地图官网:天地图API 1.先去天地图注册成为开发者 2.创建应用,需要添加你的Android发布的密钥sha1,这里生成的key需要在添加图层时用 3.高德地图添加图层代码如下 final String url = "http://t4.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION" + "=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=%s&" + "TILEROW=%s&TILECOL=%s&tk=天地图申请key"; final String url2 = "http://t4.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION" + "=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=%s&" + "TILEROW=%s&TILECOL=%s&tk=天地图申请key"; 加载图层的方法onlineTdtLoad(),直接在你地图初始化后执行就可以 mAMap是你实例化的高德地图 aMap.setMaxZoomLevel(Float.parseFloat("18.5")); //设置最大缩放等级 这里注意一下,在实例化高德地图时,需要设置一下最大的缩放等级,要不然放到最大,天地图也会出现没有卫星图的问题 private void onlineTdtLoad() { UrlTileProvider mUrlTileProvider = new UrlTileProvider(256, 256) { @Override public URL getTileUrl(int x, int y, int zoom) { try { String real_url = String.format(url, zoom, y, x); LatLng mLatLng = mAMap.getProjection().fromScreenLocation(new Point(x,y)); Log.

C语言全网最全sscanf函数用法,没有的评论区提,随时更新

本教程分初级、进阶、实战用例,有基础的直接跳到后面吧。本文主要拿AT指令做例子。写得不好别喷,合理的要求可以提出来我尽力改。 本教程应该足以面对大部分的解析。 最后部分主要是实战为主。各位有想解析的字符串可以放到评论区,比较经典的我会放到文章里。 一、函数原型解析 直接看以下: #include <stdio.h> /* 引用这个标准的头文件 */ /** * @function: sscanf * @brief C语言格式化输入函数,可用作解析字符串中的参数。 * @param {char} *str: 源字符串,也就是要被解析的字符串。 * @param {char} *format: 解析格式。 * @param {...} 要取出的值,要取几个?要取什么类型的?排好队,一个一个来 * @return {int} 返回int类型,返回值代表解析了几个值。 */ int sscanf(const char *str, const char *format, ...); 二、初级用法 这里包含了最基础的%s, %d, %f的用法。你想取出什么类型的值就用什么类型的方法。新手一定一定要注意格式! 1. 取字符串 %s 这里会把你输入的 AT+COM= 过滤掉,取出后面的所有字符串。 /* * @Author: Troubadour 2276791354@qq.com * @Date: 2024-04-20 19:47:51 * @LastEditors: Troubadour 2276791354@qq.com * @LastEditTime: 2024-04-20 20:10:09 * @Version: * @Description: */ #include <stdio.

Spring AI项目Open AI绘画开发指导

Spring AI项目创建 Spring AI简介创建Spring AI项目配置项目pom和application文件controller接口开发运行测试 Spring AI简介 Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。特征:跨AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能。 聊天模型:OpenAI、Azure Open AI、Amazon Bedrock、Cohere’s Command(AI21 Labs’ Jurassic-2、Meta’s LLama 2、Amazon’s Titan)、Google Vertex AI Palm、Google Gemini、HuggingFace (access thousands of models, including those from Meta such as Llama2)、Ollama(run AI models on your local machine)、MistralAI… 创建Spring AI项目 打开IDEA创建一个新的spring boot项目,填写项目名称和位置,类型选择maven,组、工件、软件包名称可以自定义,JDK选择17+即可,java语言标准和JDK相同即可 配置Spring Boot版本和开发所需的依赖,主要如下图所示 Spring Boot版本可以选择3.2.5或者更高的版本(作者使用3.2.5和3.2.6(SNAPSHOT)可以正常开发)Spring Boot DevTools:spring项目热部署工具,修改完代码(不含application和pom配置文件)即刻热部署项目Lombok:通过配置快速配置对象的get、set、toStringSpring AI:Spring AI是一个用于AI工程的应用框架 创建完成后,项目结构大体如下(这里删除了无用的maven文件内容、修改application的文件格式为yaml) 配置项目pom和application文件 注意:修改pom文件,重新下载spring ai依赖需要科学上网,请确保网络连接没有问题 打开项目的pom文件,修改spring ai的版本(项目默认使用稳定版0.

爆肝!超详细的胎教级Midjourney使用教程,看这一篇就够!

大家好,用奶奶都能听懂的方式分享可以落地实操的干货 MJ的使用教程也肝出来了 从手把手注册账号,到熟悉Midjourney操作界面,再到实战案例制作 最后到超好用的翻译软件 每一步都有详细的教程,并且用实际的例子讲解 让大家看文章的同时能直接上手操作 看完也可以做出有趣的照片! 一、Midjourney强大在哪里? 1.照片风格多样 在Midjourney里面,几乎可以生成各种风格的照片(不可以涩涩) 2.操作简单,照片质量高 AI绘画没有大家想象的那么难 在Midjourney里面,简单到只要打几个字,就可以出来质量非常高的照片 比如“一只正在笑的狗”、“一个可爱的动漫女孩” 3.富有想象力 在Midjourney里面,我们不仅可以生成一些常规的图片 我们还可以去尝试生成一些更加有趣、更有想象力的照片 比如会开车的狗、练太极的猫 掌心上的超小猫咪,超大的西瓜,还有中国风钢铁侠 二、Midjourney究竟是什么? 1.Midjourney的介绍 MidJourney 是一个文本到图像的 AI,基于Discord平台搭建,它可以根据您的文本提示生成具有视觉效果的图像 说人话就是:你输入文字,它给你生成画面! 2.Discord的介绍 讲到Midjourney(简称MJ),我们还要知道Discord是什么 Discord就是一个聊天软件,可以把它想象成微信,它的着重功能在聊天室上 而MJ就是这个聊天软件上的一个功能 【看下图】 一的部分代表了服务器:可以理解为一个社群圈子,比如我要搞钱,我就可以创建一个一起搞钱的圈子 二的部分代表了频道,我这个圈子要有市场部人员,产品部人员等等,我就给每个部门设置单独的频道 三的部分代表了聊天室,在这里大家可以互相交流说话 Midjourney就是搭建在这样一个平台上的工具, 这个Midjouney的服务器里面有很多频道 一些是作为公告和规则用,一些是直接的聊天室 在聊天室里面调用Midjouney功能,通过打字就可以生成图片 ======= ======= 三、Midjourney和Stable Diffusion以及其他绘图工具有什么区别? 1.MJ和SD的说明 AI绘画工具除了Midjourney以外,还有DALL-E 2,Stable Diffusion,Disco Diffusion等软件 我们拿最常见的Midjourney(简称MJ)和Stable Diffusion(简称SD)来对比 **Midjourney:**一个商业产品,其公司主要负责模型开发、训练、调整和用户界面,为用户提供打开即用的体验 **Stable Diffusion:**一个支持开源生态系统的软件,模型的代码和训练数据可供所有人访问,用户可以在此基础上构建并微调模型,以达到想要的效果 说人话就是: Midjourney是付费的,更容易上手,它的公司把一切都包装好了,你打开输入文字就可以使用,而且速度非常快 Stable Diffusion是免费的,没有公司在经营,它只是一串模型代码 你需要安装在你自己的电脑里,用自己的GPU来渲染出图,同时很多数据模型都要自己去练(或者网上下载别人分享的) 虽然麻烦,但可定制化程度更高一些,可以控制图片构图和姿势 2.MJ和SD的选择 所有取决于你想要做什么: 如果你想要: 无需深入学习就可生成惊人的图像 你很忙,没有时间学习和训练模型 你不介意花钱 那就选MJ(Midjourney) 如果你想要 完全免费的解决方案 你希望在本地运行内容 你喜欢调整你的设置,更多的控制图像 那就选SD(Stable diffusion)

Kafka 和 RabbitMQ用哪个?一篇文章告诉你他们的区别

经常有人问我 有个 xx 需求,我应该用 Kafka 还是 RabbitMQ ? 这个问题很常见,而且很多人对二者的选择也把握不好。 所以我决定写篇文章来详细说一下:Kafka 和 RabbitMQ 的区别,适用于什么场景? 同时,这个问题在面试中也经常问到。 下面我会通过 6 个场景,来对比分析一下 Kafka 和 RabbitMQ 的优劣。 一、消息的顺序 有这样一个需求:当订单状态变化的时候,把订单状态变化的消息发送给所有关心订单变化的系统。 订单会有创建成功、待付款、已支付、已发货的状态,状态之间是单向流动的。 ​ 好,现在我们把订单状态变化消息要发送给所有关心订单状态的系统上去,实现方式就是用消息队列。 ​ 在这种业务下,我们最想要的是什么? 消息的顺序:对于同一笔订单来说,状态的变化都是有严格的先后顺序的。 吞吐量:像订单的业务,我们自然希望订单越多越好。订单越多,吞吐量就越大。 在这种情况下,我们先看看 RabbitMQ 是怎么做的。 首先,对于发消息,并广播给多个消费者这种情况,RabbitMQ 会为每个消费者建立一个对应的队列。也就是说,如果有 10 个消费者,RabbitMQ 会建立 10 个对应的队列。然后,当一条消息被发出后,RabbitMQ 会把这条消息复制 10 份放到这 10 个队列里。 ​ 当 RabbitMQ 把消息放入到对应的队列后,我们紧接着面临的问题就是,我们应该在系统内部启动多少线程去从消息队列中获取消息。 如果只是单线程去获取消息,那自然没有什么好说的。但是多线程情况,可能就会有问题了…… RabbitMQ 有这么个特性,它在官方文档就声明了自己是不保证多线程消费同一个队列的消息,一定保证顺序的。而不保证的原因,是因为多线程时,当一个线程消费消息报错的时候,RabbitMQ 会把消费失败的消息再入队,此时就可能出现乱序的情况。 ​ T0 时刻,队列中有四条消息 A1、B1、B2、A2。其中 A1、A2 表示订单 A 的两个状态:待付款、已付款。B1、B2 也同理,是订单 B 的待付款、已付款。 到了 T1 时刻,消息 A1 被线程 1 收到,消息 B1 被线程 2 收到。此时,一切都还正常。

java mapper批量更新、插入、查询

1、组合字段批量查询 <select id="batchSelect" resultMap="BaseResultMap"> select <include refid="BaseColumnList"/> from good where mark = 1 and (shop_id,sku_id) in <foreach collection="list" item="item" open="(" separator="," close=")"> (#{item.shopId},#{item.skuId}) </foreach> </select> 2、根据id批量更新 <update id="batchUpdate" parameterType="java.util.List"> update good <trim prefix="set" suffixOverrides=","> <trim prefix="sku_id =case" suffix="end,"> <foreach collection="list" item="item" index="index"> <if test="item.skuId!=null"> when id=#{item.id} then #{item.skuId} </if> <if test="item.skuId == null"> when id=#{item.id} then good.sku_id </if> </foreach> </trim> <trim prefix="shop_id =case" suffix="end,"> <foreach collection="list" item="item" index="index"> <if test="

MySQL8.4一主一从环境搭建

MySQL8.4一主一从环境搭建 一、MySQL数据库服务环境搭建 1.1、下载及上传mysql二进制安装包 下载地址 MySQL :: Download MySQL Community Server 上传mysql-8.4.0-linux-glibc2.17-x86_64.tar.xz到soft目录 ls -lsa /soft 1.2、增加MySQL用户组及用户 groupadd mysql useradd -r -s /bin/false -g mysql mysql mkdir -p /mysql/data/3306/data mkdir -p /mysql/backup/backup-db chown -R mysql:mysql /mysql 1.3、编辑配置文件my.cnf vi /mysql/data/3306/my.cnf [mysqld] server-id=573306 port=3306 basedir=/mysql/app/mysql datadir=/mysql/data/3306/data log-error=/mysql/log/3306/superdb-error.log socket=/mysql/data/3306/mysql.sock pid-file=/mysql/data/3306/mysql.pid character-set-server=utf8mb4 lower_case_table_names=1 innodb_log_file_size=1G default-storage-engine=INNODB mysql_native_password=on secure_file_priv='' [mysql] prompt=(\\u@\\h)[\\d]>\\_ [client] port=3306 default-character-set=utf8mb4 1.4、解压 cd /soft ls xz -d mysql-8.4.0-linux-glibc2.17-x86_64.tar.xz tar xvf mysql-8.4.0-linux-glibc2.17-x86_64.tar mv mysql-8.4.0-linux-glibc2.17-x86_64 /mysql/app/mysql

PostgreSQL导入Excel数据

当我们有着大量的Excel数据,并且想将其导入至我们的数据库中。 有以下两种方法: 1 使用COPY命令 2 在pgAdmin中直接导入 注意: excel表的数据类型与格式要与数据库中表格的数据类型相匹配。excel表中如果出现以 文本形式存储的数字 的提示可以忽略 一 使用COPY命令 首先创建table create table people( id int, name varchar(20), age int, birth timestamp ); 使用COPY,先将excel转为csv以逗号分隔的格式,再导入。注意数据的格式一定要严格对应,尤其是时间。如下图所示,如果时间格式有问题,导入会出错 两种格式皆可行 copy firelocation FROM 'C:\Users\Lenovo\Desktop\people.csv' DELIMITER ',' CSV HEADER; 但是会报错,我也不知道为什么 可能原因: 1 目录太深 2 目录有中文 3 csv中有无表头 二 使用pgAdmin导入 该方法时可行的 右击已创建好的表,选择导入 选择准备好的excel数据 勾选标题 点击确定即可 查询结果 关于第一种方法为何不行,欢迎大家讨论

JavaScript 对象入门:基础用法全解析

目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可以被理解成是一种数据集合。它由属性和方法两部分构成。 ✨语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 这是创建单个对象最直接的方法。只需简单地列出以逗号分隔的键值对,用花括号包围起来即可。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript对象</title> </head> <body> ​ <script> // 声明字符串类型变量 let str = 'hello world!' // 声明数值类型变量 let num = 199 ​ // 声明对象类型变量,使用一对花括号 // user 便是一个对象了,目前它是一个空对象 let user = {} </script> </body> </html> ✨属性和访问 数据描述性的信息称为属性,如人的姓名、身高、年龄、性别等,一般是名词性的。 属性都是成对出现的,包括属性名和值,它们之间使用英文 : 分隔 多个属性之间使用英文 ',' 分隔 属性就是依附在对象上的变量

2024年最新RocketMQ与Kafka架构深度对比_kafka与rocketmq多方面剖析,2024年最新实践出真知

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 需要这份系统化资料的朋友,可以戳这里获取 目录 一、系统设计与组件构成 1.1 RocketMQ 1.2 Kafka 二、数据流向与扩展性 2.1 RocketMQ 2.2 Kafka 三、容错性与一致性 3.1 RocketMQ 3.1 Kafka 四、总结与展望 一、系统设计与组件构成 1.1 RocketMQ RocketMQ的系统设计更偏向于队列模型,提供了丰富的消息队列语义,如顺序消息、事务消息和定时消息等。它主要由NameServer、Broker、Producer和Consumer组成。NameServer负责服务注册与发现,Broker负责存储消息,Producer和Consumer分别负责发送和消费消息。此外,RocketMQ还支持Filter Server组件,用于支持消息过滤功能。这种设计使得RocketMQ在处理复杂业务逻辑时更加灵活。 1.2 Kafka 相比之下,Kafka的系统设计更偏向于日志模型,强调数据的顺序性和持久性。它主要由Producer、Consumer、Broker和ZooKeeper(或KRaft)组成。Producer和Consumer分别负责发送和消费消息,Broker负责存储消息,ZooKeeper(或KRaft)负责协调管理。Kafka的Broker是无状态的,可以独立处理请求,并通过ZooKeeper(或KRaft)进行协调管理。这种设计使得Kafka在处理高吞吐量日志数据时更加高效。 二、数据流向与扩展性 2.1 RocketMQ 在RocketMQ中,数据从Producer发送到Broker,Consumer从Broker拉取数据进行消费。RocketMQ支持消息的Tag过滤和SQL过滤,可以在Broker端进行消息过滤。此外,RocketMQ还支持事务消息和顺序消息,可以确保数据的强一致性和有序性。在扩展性方面,RocketMQ支持Broker的横向扩展,通过增加Broker节点来提高系统的吞吐量和可用性。同时,RocketMQ还支持Topic和Queue的灵活配置,可以根据业务需求进行动态调整。 2.2 Kafka 在Kafka中,数据从Producer发送到Broker的特定Partition,Consumer从Broker的Partition拉取数据进行消费。Kafka支持按照Key进行消息分区,确保相同Key的消息发送到同一个Partition。在扩展性方面,Kafka的Broker是无状态的,可以方便地进行横向扩展,提高系统的吞吐量和可用性。同时,Kafka支持Partition的动态调整,可以通过增加Partition数量来提高系统的并行处理能力。 三、容错性与一致性 3.1 RocketMQ RocketMQ采用主从复制机制来提高容错性。当Master出现故障时,Slave可以自动升级为Master继续提供服务。同时支持Dledger多副本机制,进一步提高系统的容错性。在一致性方面,RocketMQ通过主从复制和顺序消息机制保证数据的一致性和有序性。此外,RocketMQ还支持消息的幂等性处理,避免重复消费导致的数据不一致问题。 3.1 Kafka Kafka则通过ISR机制保证数据的可靠性和一致性。当Leader出现故障时,Follower可以通过选举成为新的Leader继续提供服务。Kafka还支持多副本存储和Min.ISR配置,确保数据的可靠性和容错性。在一致性方面,Kafka通过ISR机制和分区顺序性保证数据的一致性和有序性。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 需要这份系统化资料的朋友,可以戳这里获取 面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** 需要这份系统化资料的朋友,可以戳这里获取

百度文心一言 java 支持流式输出,Springboot+ sse的demo

参考:GitHub - mmciel/wenxin-api-java: 百度文心一言Java库,支持问答和对话,支持流式输出和同步输出。提供SpringBoot调用样例。提供拓展能力。 1、依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.18</version> </dependency> 2、配置apikey和secretkey 3、主要使用的接口 4、返回的json格式 3、WenxinEventSourceListener 事件监听器 和其他的接口不一样 需要 CompletionsResponse.data 封装下 ,不然前端页面需要兼容非json的格式 @Slf4j public class WenxinEventSourceListener extends EventSourceListener { private long tokens; private SseEmitter sseEmitter; public WenxinEventSourceListener(SseEmitter sseEmitter) { this.sseEmitter = sseEmitter; } @Override public void onOpen(EventSource eventSource, Response response) { log.info("建立sse连接..."); } @SneakyThrows @Override @JsonIgnoreProperties(ignoreUnknown = true) public void onEvent(EventSource eventSource, String id, String type, String data) { ChatResponse bean = JSONUtil.

探索前端监控的新纪元:Web-Tracing 插件

探索前端监控的新纪元:Web-Tracing 插件 项目介绍 Web-Tracing 是一款强大的前端监控插件,基于 JavaScript 设计,兼容跨平台使用。它以全方位的监控功能为核心,涵盖了【埋点、行为、性能、异常、请求、资源、路由、曝光、录屏】等多个领域,旨在帮助开发者轻松实现对前端项目状态的实时监控和问题排查。 技术分析 Web-Tracing 实现了一整套完善的监控机制,包括但不限于: 事件监听:通过对用户交互和系统事件的捕获,实现精准的用户行为跟踪。错误监听:实时监测并记录JavaScript运行时的错误,提供详细的错误信息和回放功能。资源监听:监测网页中的资源加载情况,帮助识别性能瓶颈。 该项目的核心设计注重代码封装与灵活性,通过提供多种定制API,使开发者能够按需调整和扩展监控策略。此外,Web-Tracing 还利用Vue响应式原理,增强了配置对象的动态性,并采用monorepo架构管理多版本代码,保证了代码质量和维护性。 应用场景 Web-Tracing 在各种类型的前端项目中都能发挥重要作用,尤其适用于: 企业级应用:帮助企业构建自有的前端监控平台,提升用户体验,及时发现和解决线上问题。电商网站:追踪用户购物行为,优化购物流程,提升转化率。复杂单页应用:监控路由变化,确保页面切换顺畅无误。 项目特点 Web-Tracing 的突出特点包括: 全面覆盖:覆盖了前端监控的各个方面,满足多样化需求。高效定制:提供钩子函数和本地化选项,允许灵活控制数据发送,节省带宽。智能优化:如批量错误处理和抽样发送,有效减少不必要的网络负担。结构清晰:同一项目内包含示例、SDK 和文档,便于开发调试与部署。良好的社区支持:作者积极回应反馈,不断迭代更新,未来计划实现服务端监控和可视化后台。 加入我们,一起探索! 如果你正在寻找一个强大且易用的前端监控解决方案,Web-Tracing 绝对值得尝试。无论是初学者还是经验丰富的开发者,都可以从它的详尽文档和丰富示例中获益。现在就加入我们的行列,为你的项目加上一双洞察一切的眼睛吧! 点击这里,访问官方文档,了解更多详情并开始使用 Web-Tracing。同时,别忘了在GitHub上给予项目一个Star,以示支持和鼓励!让我们共同推进前端监控技术的发展。

Python-VBA函数之旅-type函数

目录 一、type函数的常见应用场景 二、type函数使用注意事项 三、如何用好type函数? 1、type函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、type函数的常见应用场景 type函数在Python中有多个实际应用场景,尽管它主要用于获取对象的类型,但在某些特定情况下,它也能提供重要的信息或用于编程的某些方面,其常见的应用场景有: 1、类型检查: 当你需要确保某个变量或对象具有特定的类型时,可以使用type()函数进行检查,这在编写函数或方法时特别有用,尤其是当函数需要特定类型的参数时。 2、动态类型判断:在某些情况下,你可能需要根据对象的类型来执行不同的操作,使用type()函数可以帮助你实现这种动态类型判断。 3、反射和元编程:在需要编写能够处理不同类型对象的通用代码时,可以使用type()函数和相关的元编程技术。例如,你可以检查一个对象的类型,并基于该类型调用不同的方法或执行不同的操作。 4、注册和类型映射:在构建大型系统时,可能需要将对象类型映射到特定的处理函数或类,type()函数可以用于实现这样的类型到行为的映射。 5、工厂函数和类工厂:在需要基于输入参数动态创建不同类型对象的情况下,可以使用type()函数作为类工厂,这在实现复杂的工厂模式或元编程时可能很有用。 6、调试和日志记录:在开发过程中,type()函数可以帮助你确定变量的实际类型,这在调试或记录对象状态时可能很有用。 7、与其他类型系统交互:当与需要明确类型信息的外部系统或库交互时,type()函数可以帮助你提供正确的类型信息。 8、与内建类型进行比较:有时你可能想要检查一个对象是否是某个特定的内建类型(如int, str, list等),虽然isinstance()函数是更推荐的做法,但type()函数也可以用于此目的。 二、type函数使用注意事项 在Python中使用type()函数时,请注意以下几点: 1、避免直接使用type()函数进行类型检查:虽然type()函数可以用来检查对象的类型,但在实践中,更推荐使用isinstance()函数来进行类型检查,这是因为isinstance()会考虑子类关系,而type()则不会,如果你的代码期望接受某个类或其子类的实例,使用isinstance()会更加灵活和健壮。 2、动态类型与静态类型:Python是一种动态类型语言,这意味着变量的类型可以在运行时改变,因此,过度依赖type()函数进行类型检查可能并不符合Python的哲学,在编写Python代码时,应该尽量利用动态类型的优势,而不是试图强制所有变量都保持固定的类型。 3、使用type()创建新类型:虽然type()函数可以用于在运行时动态地创建新的类型,但这种用法在Python中并不常见,Python提供了更直观和易于理解的class语法来定义新的类型,这在大多数情况下都是首选的方法。 4、不要修改内建类型的 `__name__` 或 `__class__` 属性:尽管Python允许你修改对象的属性,但你应该避免修改内建类型或对象的 `__name__` 或 `__class__` 属性,这些属性在Python的内部机制中扮演着重要的角色,修改它们可能会导致不可预测的行为或错误。 5、理解type()函数和class的关系:在Python中,type()函数实际上是一个内建的元类,它负责创建和管理类,当你使用class关键字定义一个类时,Python会自动使用type()作为元类来创建这个类,理解这个关系有助于你更深入地理解Python的类系统。 6、处理NoneType:当你使用type()函数检查一个值为None的变量时,它将返回<class 'NoneType'>,确保在代码中正确处理这种情况,特别是当你期望某个变量可能是None时。 7、注意类型注解(从Python 3.5开始):虽然类型注解(如 `def foo(x: int) -> str:`)并不会改变Python 的动态类型特性,但它们为代码提供了额外的类型信息;类型注解主要用于文档、类型检查和可能的静态类型分析,type()函数与类型注解没有直接关系,但在编写和阅读带有类型注解的代码时,你应该意识到这些注解的存在和用途。 三、如何用好type函数? type()函数在Python中用于获取对象的类型,这个函数非常有用,尤其是在你想了解某个对象的类型,或者你想根据对象的类型来执行不同的操作时。为了用好type()函数,请遵循以下建议和方法: 1、获取对象的类型:使用type()函数可以轻松地获取任何对象的类型。 2、判断对象的类型:你可以使用type()函数来判断一个对象是否属于特定的类型,但是,通常建议使用内置的isinstance()函数来进行类型检查,因为它支持子类检查(即如果对象是某个类的子类的实例,isinstance()也会返回True)。 3、在动态类型系统中使用:Python是一种动态类型语言,但type()函数仍然在某些情况下很有用。例如,你可能有一个函数,它接受一个对象并根据该对象的类型执行不同的操作。 4、与isinstance()函数结合使用:虽然type()函数可以用于类型检查,但isinstance()函数通常是更好的选择,但是,你可以结合使用type()和isinstance()两个函数来检查对象是否属于特定的元组或集合中的类型。 ​​​​​​​ 1、type函数: 1-1、Python: # 1.函数:type # 2.功能: # 2-1、一个参数:用于获取对象的类型 # 2-2、多个参数:用于获取新的类型对象 # 3.语法: # 3-1、type(object) # 3-2、type(name, bases, dict, **kwds) # 4.

Flutter ios 使用ListView 。滚动时 AppBar 改变颜色问题

在Ios 中 列表滚动条向下滚动一段距离后 会导致 AppBar 颜色改变 可以给 AppBar 或者 AppBarTheme。 scrolledUnderElevation: 0.0 属性 全局: MaterialApp( theme: ThemeData( appBarTheme: AppBarTheme(scrolledUnderElevation: 0.0) ) ) 局部: AppBar( scrolledUnderElevation: 0.0 ) 效果: 滚动前滚动后 x ke z

2024年最新Qt QMessageBox用法详解_qt message,程序人生

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 如果你需要这些资料,可以戳这里获取 一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人 都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 已剪辑自: http://c.biancheng.net/view/vip_9658.html QMessageBox 是 Qt 框架中常用的一个类,可以生成各式各样、各种用途的消息对话框,如图 1 所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbRMV43l-1669281066525)(http://c.biancheng.net/uploads/allimg/211028/1641194U7-0.gif)] 图 1 QMessageBox消息对话框 很多 GUI 程序都会用到消息对话框,且很多场景中使用的消息对话框是类似的,唯一的区别只是提示信息不同。为了提高程序员的开发效率,避免重复地“造轮子”,Qt 开发者设计好了几种通用的 QMessageBox 消息对话框,需要时可以直接使用。 通用的QMessageBox消息框 Qt 提供了 6 种通用的 QMessageBox 消息对话框,通过调用 QMessageBox 类中的 6 个静态成员方法,可以直接在项目中使用它们。 1) information消息对话框 information 对话框常用于给用户提示一些关键的信息,它的外观如下图所示: 图 2 information 消息对话框 在项目中使用 information 消息对话框,直接调用 QMessageBox 类中的 information() 静态成员方法即可,该方法的语法格式如下: StandardButton QMessageBox::information(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton) 各个参数的含义是: parent:指定消息对话框的父窗口,消息提示框会作为一个独立的窗口显示在父窗口的前面。消息提示框从弹出到关闭的整个过程中,用户无法操作父窗口,更不能删除父窗口;title:指定消息对话框的标题,即图 2 中的 Titile;text:指定消息对话框的具体内容,即图 2 中的 text;buttons:指定消息对话框中包含的按钮。默认情况下,消息对话框只包含一个按钮,即图 2 中显示的 “OK” 按钮。根据需要,我们可以用|按位或运算符在消息对话框中设置多个按钮,例如 QMessageBox::Ok|QMessageBox::Cancel;defaultButton:指定 Enter 回车键对应的按钮,用户按下回车键时就等同于按下此按钮。注意,defaultButton 参数的值必须是 buttons 中包含的按钮,当然也可以不手动指定,QMessageBox 会自动从 buttons 中选择合适的按钮作为 defaultButton 的值。 information() 函数会返回用户按下的按钮。StandardButton 是 QMessageBox 类中定义的枚举类型,每个枚举值代表一种按钮。StandardButton 类型中的值有很多,下表给大家罗列了几个常用的:

AI智能体|我把Kimi接入了个人微信

大家好,我是无界生长。 最近加入AI学习交流群的小伙伴越来越多,我打算在微信群接入一个聊天机器人,让它协助管理微信群,同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的,得上AI大模型,不然档次太低了。经过一番调研后,发现有现成的技术方案能满足需求,直接上手进行部署测试,流程成功跑通。昨天的文章《AI智能体|手把手教你申请一个Kimi(Moonshot)的API KEY》介绍了如何申请Kimi的API KEY,今天分享一下如何把Kimi接入个人微信,充当聊天机器人。本文会出现一些技术术语,有技术基础容易上手一些,不太懂技术也不用担心,按照步骤一步步操作,完全可以学会。学会了的话,欢迎分享转发! 前提 一个微信号一个有余额的Kimi账号一台linux服务器/开发机 说明: 微信号建议注册一个微信小号,懂的都懂。不建议用大号测试!Kimi账号在Moonshot官网使用手机号注册,新用户有15元代金券调用Kimi的api,对机器配置要求不高,无需GPU资源,普通配置即可 流程梳理 资源准备 账号资源服务器资源部署Cow项目 安装Anaconda创建并激活python虚拟环境安装Cow项目依赖包修改配置启动项目绑定微信效果测试 Cow开源项目 项目介绍 这里引用官方文档 chatgpt-on-wechat(简称CoW)项目是基于大模型的智能对话机器人,支持微信公众号、企业微信应用、微信、飞书、钉钉接入,可选择GPT3.5/GPT4.0/Claude/Gemini/LinkAI/ChatGLM/KIMI/文心一言/讯飞星火/通义千问/LinkAI,能处理文本、语音和图片,通过插件访问操作系统和互联网等外部资源,支持基于自有知识库定制企业AI应用。 项目地址 GitHub - zhayujie/chatgpt-on-wechat: 基于大模型搭建的聊天机器人,同时支持 微信 公众号、企业微信应用、飞书、钉钉 等接入,可选择GPT3.5/GPT4.0/Claude/文心一言/讯飞星火/通义千问/Gemini/GLM-4/Claude/Kimi/LinkAI,能处理文本、语音和图片,访问操作系统和互联网,支持基于自有知识库进行定制企业智能客服。 安装部署 Cow项目支持四种部署方式: 本地运行:一般用于功能调试,程序退出Bot就失效了,不适合长期部署;服务器部署:操作相对麻烦一些,也是我们演示的安装部署方式,挑难的做才有挑战性Docker部署:依赖docker环境,安装部署简单Railway部署:支持一键部署,账号不充钱无法成功部署 服务器部署 我这里使用的是ModelScope提供的免费CPU实例进行演示,实例申请参考:纯福利|手把手教你如何白嫖免费的GPU资源(二)。在其他云平台提供的服务器上操作类似,不逐一演示。 启动实例 登录ModelScope账号,点击“我的NoteBook”,在“魔搭平台免费实例”标签页,选择“PAI-DSW”的CPU实例,预装镜像选择“ubuntu20.04-py38-torch2.0.1-tf2.13.0-1.9.5”,然后点击“启动实例”按钮,我这里实例已经启动了,所以截图中没有“启动实例”按钮 实例启动成功后,点击“查看Notebook”按钮,进入工作台,注意红色箭头指向的“Terminal”图标 点击“Terminal”,连接服务器,默认工作路径是在 /mnt/workspace 目录下 安装Anaconda 下载Anaconda安装脚本 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 执行Anaconda安装脚本 bash Anaconda3-2023.09-0-Linux-x86_64.sh 安装过程中,会有询问,直接“yes”回车,默认安装路径是:/root/anaconda3 更新环境变量 source ~/.bashrc 创建并激活python虚拟环境 使用anaconda创建python3.8的虚拟环境,名称为chat /root/anaconda3/bin/conda create -n chat python=3.8 激活chat conda activate chat 安装Cow项目依赖包 从github拉取项目代码 git clone https://github.com/zhayujie/chatgpt-on-wechat 进入项目代码目录 cd chatgpt-on-wechat 安装必要依赖 pip3 install -r requirements.

2024年前端最新最新的Vue面试题大全含源码级回答,吊打面试官系列,前端初级面试题

Vue 面试题 1.Vue 双向绑定原理 2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程? 3.你是如何理解 Vue 的响应式系统的? 4.虚拟 DOM 实现原理 5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异? 6.Vue 中 key 值的作用? 7.Vue 的生命周期 8.Vue 组件间通信有哪些方式? 9.watch、methods 和 computed 的区别? 10.vue 中怎么重置 data? 11.组件中写 name 选项有什么作用? 12.vue-router 有哪些钩子函数? 13.route 和 router 的区别是什么? 14.说一下 Vue 和 React 的认识,做一个简单的对比 15.Vue 的 nextTick 的原理是什么? 16.Vuex 有哪几种属性? 17.vue 首屏加载优化 18.Vue 3.0 有没有过了解? 19.vue-cli 替我们做了哪些工作? 如果你觉得对你有帮助,可以戳这里获取:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】 return vm } …

2024年大数据最新使用logstash迁移ES数据并解决限流等问题,不了解这些多线程的基础知识很难学懂大数据开发

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。 需要这份系统化资料的朋友,可以戳这里获取 一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 原来如此,需要指定routing,配置文件一通改,就变成了下面的模样 input { elasticsearch { hosts => "http://es1.es.com:80" index => "xxx" user => "elastic" password => "XXX" query => '{ "query": { "query_string": { "query": "*" } } }' size => 2000 scroll => "1m" docinfo => true # input中添加routing docinfo_fields => ["_index", "_id", "_type", "_routing"] } } output { elasticsearch { hosts => "http://es2.es.com:80" index => "xxx" user => "elastic" password => "XXX" document_id => "

【数据结构】栈和队列OJ面试题

20. 有效的括号 - 力扣(LeetCode) 思路:由于C语言没有栈的接口,所以我们需要自己造一个“模子”。我们直接copy之前的实现的栈的接口就可以了(可以看我之前的博客【数据结构】栈和队列-CSDN博客copy接口),同时要注意要将typedef的STDataType从int类型改成char类型。在此之后,依次取出字符串中的字符判断,如果是左括号,则入栈。如果是右括号,则依次和栈顶字符去进行配对,然后出栈。再进行判断,配对则返回false,否则判断下一个字符。再while循环结束后还要再一次判空,排除栈中还有字符未进行判断的情况。 225. 用队列实现栈 - 力扣(LeetCode) 思路:由于C语言没有队列的接口,所以同样也需要我们自己造出一个“模子”来。再【数据结构】栈和队列-CSDN博客这篇博客中同样也有关于队列的接口,再这里我们直接copy一下队列的接口。 关于用队列实现栈,我们的思路是这样的,首先,创建出两个队列,一个队列用来在出栈时拷贝,一个队列用来在出栈时接受拷贝,所以这就要求一个队列必须是空的,而另一个队列的功能就是扮演栈的角色(因为队列出入数据是先进先出的,栈出入数据是先进后出的,所以在数据出栈的时候,只能用队列的拷贝来实现栈的数据出栈)。其他接口直接使用队列的接口就基本可以完成。 另外,要注意的是,在最后销毁栈的时候,需要先销毁两个队列再销毁栈,以免出现有野指针的情况。 232. 用栈实现队列 - 力扣(LeetCode) 思路:这道题同样需要用之前写的栈造一个“模子”。在解决这道题目时,需要我们创建两个栈去实现(st1用来存放数据,st2用来导数据)。当我们pop数据的时候,需要先将创建好的st1中的数据依次出栈到st2的栈中,然后将st2中的栈顶数据pop掉 ,最后将st2中的数据重新导回到st1中。在实现myQueuePeek(myQueuePeek接口要求我们返回队列开头的元素)接口的时候也是同样的方法,先将st1中的数据导到st2中,只不过接下来不需要pop栈顶元素,只需要记录下栈顶元素,然后再导回st1中,最后再返回记录下的元素就好了。其他的接口用之前实现栈的接口就可以基本解决了。 622. 设计循环队列 - 力扣(LeetCode) 思路:在这道题目中,我们采用顺序表的方法来完成。首先需要动态申请一个数组,然后初始化结构体。结构体中的head指向数组中的第一个节点,tail指向数组中最后一个节点的下一个节点,k的意思是数组中一共有k个数据。这里有接口需要我们判空和判满,但是如果就按这种思路写下去的话,我们会发现判空和判满的条件是一样的,都是head==tail。 那么我们应该如何去解决这个问题呢?这里我们有两种解决方案。第一种是在多开一个数组的空间,这样当队列满的时候的判空条件就变成了tail+1==head了,就避免了判空和判满条件一样的情况了。第二种方法是加一个size去判断队列中数据的个数。在此我们采用第一种方法来完成代码。 还需要注意的一个接口是取队尾的接口,这个接口需要取tail前一个结点,但是有一种特殊的情况就是tail是数组中第一个空间,这时候tail在-1的话就会变成-1,而不是指向第5块空间。这是我们可以进行一个判断,如果tail是第一块空间,那么则返回地5块空间的数据,否则返回第tail-1块的空间就可以了。或者我们可以取第((tail-1)+(k+1))%(k+1)个数据就是队列的队尾数据。