Kafka

1.Kafka简介 消息队列 消息队列——用于存放消息的组件程序员可以将消息放入到队列中,也可以从消息队列中获取消息很多时候消息队列不是一个永久性的存储,是作为临时存储存在的(设定一个期限:设置消息在MQ中保存10天)消息队列中间件:消息队列的组件,例如:Kafka、Active MQ、RabbitMQ、RocketMQ、ZeroMQ Kafka的应用场景 异步处理 可以将一些比较耗时的操作放在其他系统中,通过消息队列将需要进行处理的消息进行存储,其他系统可以消费消息队列中的数据比较常见的:发送短信验证码、发送邮件 系统解耦 原先一个微服务是通过接口(HTTP)调用另一个微服务,这时候耦合很严重,只要接口发生变化就会导致系统不可用使用消息队列可以将系统进行解耦合,现在第一个微服务可以将消息放入到消息队列中,另一个微服务可以从消息队列中把消息取出来进行处理。进行系统解耦 流量削峰 因为消息队列是低延迟、高可靠、高吞吐的,可以应对大量并发 日志处理 可以使用消息队列作为临时存储,或者一种通信管道 消息队列的两种模型 生产者、消费者模型 生产者负责将消息生产到MQ中消费者负责从MQ中获取消息生产者和消费者是解耦的,可能是生产者一个程序、消费者是另外一个程序 消息队列的模式 点对点:一个消费者消费一个消息发布订阅:多个消费者可以消费一个消息 Kafka集群搭建 使用docker安装kafka version: '3' services: zookeeper-kafka: image: wurstmeister/zookeeper restart: unless-stopped hostname: zookeeper-kafka container_name: zookeeper-kafka ports: - 2181:2181 volumes: - ./data:/data - ./datalog:/datalog kafka: image: wurstmeister/kafka:2.12-2.4.1 depends_on: - zookeeper-kafka container_name: kafka ports: - 9092:9092 environment: KAFKA_ADVERTISED_HOST_NAME: kafka KAFKA_BROKER_ID: 0 KAFKA_ZOOKEEPER_CONNECT: 192.168.200.135:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.200.135:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 restart: unless-stopped volumes: - ./docker.sock:/var/run/docker.sock ip要改成自己的ip 云服务器需要开放端口 出现报错可以查看docker容器日志排查

Android 10 设置安装白名单,禁止其他app安装

Android 10 设置安装白名单,禁止其他app安装 文章目录 Android 10 设置安装白名单,禁止其他app安装@[TOC](文章目录) 前言一、问题解决1.分析问题2.解决问题 效果总结每日赠言 前言 在进行frameworks定制开发的时候,客户需要需求需要系统支持应用白名单(包名和签名sha256),用于app安装需校验白名单规则,参考多位大神的博客总结了个方法。 一、问题解决 1.分析问题 应用安装有多种方法 1、 直接调用安装接口。 2、通过命令进行安装 pm install 经过加打印发现在pms中无论是adb shell 还是代码安装都会走preparePackageLI方法。 可以在preparePackageLI方法执行安装前进行判断是否为白名单内的包名然后再进行安装,最终选择通过遍历文件内保存的包名来确定是否是白名单内的应用。 2.解决问题 路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java +++ a/android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java @@ -307,6 +307,7 @@ import com.android.server.SystemServerInitThreadPool; import com.android.server.Watchdog; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.pm.Installer.InstallerException; +import com.android.server.pm.PackageManagerService.PostInstallData; import com.android.server.pm.Settings.DatabaseVersion; import com.android.server.pm.Settings.VersionInfo; import com.android.server.pm.dex.ArtManagerService; @@ -339,6 +340,7 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedOutputStream; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -347,6 +349,7 @@ import java.

【Python】新手入门学习:什么是python解释器以及它的作用和特性是什么

【Python】新手入门学习:什么是python解释器以及它的作用和特性是什么 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、PyTorch、Python领域的优质内容!(希望得到您的关注~) 🌵文章目录🌵 🐍 一、Python解释器简介💻 二、Python解释器的作用📝 三、如何使用Python解释器🌐 四、Python解释器的跨平台性🔧 五、Python解释器的种类与选择🚀 六、Python解释器的性能优化📚 七、总结 🐍 一、Python解释器简介 Python解释器是Python程序运行的核心,它负责读取Python代码并将其转换为机器语言,从而使计算机能够执行。简单来说,Python解释器就像是Python代码与计算机之间的翻译官,把Python代码翻译成计算机能懂的语言。 举个例子,你写了一段Python代码,想要让电脑执行它,但是电脑并不懂Python语言。这时候,Python解释器就派上用场了。它会读取你的Python代码,然后将其翻译成电脑能懂的语言,从而让电脑执行你的代码。 💻 二、Python解释器的作用 Python解释器的主要作用有以下几点: 代码翻译:将Python代码翻译成计算机能理解的机器语言。动态执行:解释器可以实时执行Python代码,无需先编译成二进制文件。错误检查:在代码执行过程中,解释器会检查语法错误和运行时错误,并给出相应的错误信息。 通过Python解释器,我们可以方便地编写和运行Python程序,实现各种功能。 📝 三、如何使用Python解释器 使用Python解释器非常简单,只需在命令行中输入python命令即可启动解释器。下面是一个简单的示例: # 打开命令行终端 $ python Python 3.x.x (default, ...) [GCC ...] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 在>>>提示符下,你可以输入Python代码并立即看到执行结果。例如: >>> print("Hello, Python!") Hello, Python! 你也可以直接运行一个Python脚本文件,只需在命令行中指定脚本文件的路径即可: $ python my_script.py 这将使用Python解释器来执行my_script.py文件中的代码。 🌐 四、Python解释器的跨平台性 Python解释器具有很好的跨平台性,可以在Windows、Linux、macOS等多种操作系统上运行。这意味着你可以在不同的操作系统上编写和运行Python代码,无需进行复杂的配置和修改。 这种跨平台性使得Python成为一种非常流行的编程语言,广泛应用于数据科学、Web开发、自动化脚本编写等领域。 🔧 五、Python解释器的种类与选择 Python解释器有多种实现方式,其中最常见的是CPython。CPython是用C语言编写的Python解释器,也是官方推荐的解释器。除此之外,还有Jython(Java实现)、IronPython(.NET实现)等其他实现方式。

本地用AIGC生成图像与视频

最近AI界最火的话题,当属Sora了。遗憾的是,Sora目前还没开源或提供模型下载,所以没法在本地跑起来。但是,业界有一些开源的图像与视频生成模型。虽然效果上还没那么惊艳,但还是值得我们体验与学习下的。 Stable Diffusion(SD)是比较流行的开源方案,可用于文生图、图生图及图像修复。Stability AI最近发布了Stable Diffusion 3,采用的是与Sora类似的Diffusion Transformer(DiT)技术。另外,Stable Video Diffusion(SVD)将图像升级到视频,可用于文生视频和图生视频。 下面介绍下如何在本地机器上运行SD和SVD。首先假定有一台带GPU的机器(本人用的RTX 4070),并装好Python和CUDA基本环境。 Stable Diffusion 最简单的方式是用Python脚本运行。我们可以用diffusers库来运行。该库集成了各种diffusion pipeline。注意脚本可能尝试从hugging-face官方下载模型。如果下载失败,可以设置下面的环境变量: export HF_ENDPOINT=https://hf-mirror.com 按官方文档(https://hf-mirror.com/runwayml/stable-diffusion-v1-5)运行Stable diffusion 1.5: from diffusers import StableDiffusionPipeline import torch model_id = "runwayml/stable-diffusion-v1-5" pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "a photo of an astronaut riding a horse on mars" image = pipe(prompt).images[0] image.save("astronaut_rides_horse.png") 运行上面脚本,结果: 运行Stable Diffusion 2.1也是类似的。运行官方例子: import torch from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler model_id = "stabilityai/stable-diffusion-2-1" # Use the DPMSolverMultistepScheduler (DPM-Solver++) scheduler here instead pipe = StableDiffusionPipeline.

报Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String错误

在springboot中使用Mybatis出现Invalid value type for attribute 'factoryBeanObjectType': java.lang.String 1、没有使用mybatis 检查pom文件里面的mybatis 可能是缺少这个依赖,或者版本过低 重新导入依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.0</version> </dependency>

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意:ON DUPLICATE KEY UPDATE只是 MySQL的特有语法,并不是SQL标准语法! INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候,如果insert的数据会引起唯一索引(包括主键索引)的冲突,即唯一值重复了,则不会执行insert操作,而执行后面的update操作。 基本语法为: INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, ...; -- 一般 Update子句可以使用 VALUES(col_name)获取 insert部分的值 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...; 说明: table_name 是要插入数据的表名。(column1, column2, …) 是要插入的列名列表。(value1, value2, …) 是要插入的对应列的值列表。ON DUPLICATE KEY UPDATE 子句后面指定了在冲突时需要执行的更新操作。column1 = value1, column2 = value2, … 是要更新的列和对应的新值。column1 = VALUES(column1), column2 = VALUES(column2), … 是要更新的列和对应的新值(insert部分的值)。 insert-on-duplicate语句处理逻辑:

Llama_index利用本地大模型工具ollama(CPU)

基于ollama的本地大模型的LlamaIndex示例代码 from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.core.embeddings import resolve_embed_model from llama_index.llms.ollama import Ollama import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) documents = SimpleDirectoryReader("data").load_data() # bge embedding model Settings.embed_model = resolve_embed_model("local:/Users/leicq/ai_pychat/BAAI_bge-base-zh-v1.5") # ollama Settings.llm = Ollama(model="llama2-chinese", request_timeout=30.0) import os.path from llama_index.core import ( VectorStoreIndex, SimpleDirectoryReader, StorageContext, load_index_from_storage, ) # check if storage already exists PERSIST_DIR = "./storage" if not os.path.exists(PERSIST_DIR): # load the documents and create the index documents = SimpleDirectoryReader("

Elasticsearch 通过索引阻塞实现数据保护深入解析

《一本书讲透Elasticsearch:原理、进阶与工程实践 杨昌玉 著》 🎉🎉🎉🎉🎉 **重磅福利** 🎉🎉🎉🎉🎉 🎉本次送2套书 ,评论区抽2位小伙伴送书 🎉活动时间:截止到 2024-03-3010:00:00 🎉抽奖方式:评论区随机抽奖。 🎉参与方式:关注博主、点赞、收藏,评论。 ❗注意:一定要关注博主,不然中奖后将无效! 🎉通知方式:通过私信联系中奖粉丝。 Elasticsearch 是一种强大的搜索和分析引擎,被广泛用于各种应用中,以其强大的全文搜索能力而著称。 不过,在日常管理 Elasticsearch 时,我们经常需要对索引进行保护,以防止数据被意外修改或删除,特别是在进行系统维护或者需要优化资源使用时。 Elasticsearch提供了一种名为“索引阻塞(Index blocks)”的功能,让我们能够限制对某个索引的操作类型。 Elasticsearch的索引阻塞功能在早期版本中就已存在,用于管理对索引的访问和操作。随着 Elasticsearch 版本的更新,该功能也在不断得到改进和扩展。 大白话——"索引阻塞"就是给我们的索引加把锁,防止别人随意修改。 1、索引阻塞的种类 Elasticsearch中的索引阻塞可以根据需要,限制对索引的读取、写入或元数据操作。 所谓的元数据,可以理解为索引的基本信息和设置,比如索引包含哪些字段,这些字段是什么类型的等等。 这些阻塞可以通过动态索引设置添加或移除,也可以通过专门的API来添加,这样做的好处是能确保在添加写入阻塞后,所有索引的分片都正确地应用了阻塞,比如确保在添加写入阻塞后,所有正在进行的写入操作都已完成。 以下是一些动态索引设置,用于确定索引上存在的阻塞类型: index.blocks.read_only:设置为 true 使索引及索引元数据只读,设置为false则允许写入和元数据更改。 index.blocks.read_only_allow_delete:类似于index.blocks.read_only,但也允许删除索引以释放更多资源。 index.blocks.read:设置为 true 以禁用对索引的读取操作。 index.blocks.write:设置为 true 以禁用对索引的数据写入操作。与read_only不同,这个设置不影响元数据。例如,你可以调整带有写入阻塞的索引的设置,但不能调整带有read_only阻塞的索引的设置。 index.blocks.metadata:设置为true以禁用索引元数据的读写操作。 设置名称 描述 index.blocks.read_only 设置为true使索引及索引元数据只读,设置为false则允许写入和元数据更改。 index.blocks.read_only_allow_delete 类似于index.blocks.write,但也允许删除索引以释放更多资源。磁盘基础的分片分配器可能会自动添加和移除这个阻塞。 index.blocks.read 设置为true以禁用对索引的读取操作。 index.blocks.write 设置为true以禁用对索引的数据写入操作。与read_only不同,这个设置不影响元数据。例如,你可以调整带有写入阻塞的索引的设置,但不能调整带有read_only阻塞的索引的设置。 index.blocks.metadata 设置为true以禁用索引元数据的读写操作。 解释一下:index.blocks.read_only 和 index.blocks.write 区别? 如下设置了禁止写入,但是可以修改索引的设置,比如:副本数的调整,这个是允许的。 PUT test-001/_settings {<!-- --> "blocks.write": true } PUT test-001/_settings {<!-- --> "

城乡居民基本医疗信息管理系统|基于Springboot的城乡居民基本医疗信息管理系统设计与实现(源码+数据库+文档)

城乡居民基本医疗信息管理系统目录 目录 基于Springboot的城乡居民基本医疗信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、病例管理 2、医院资讯信息管理 3、医院资讯类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️ 主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。 🍅文末获取源码联系🍅 基于Springboot的城乡居民基本医疗信息管理系统设计与实现 一、前言 本次开发的城乡居民基本医疗信息管理系统实现了病例管理、病人管理、字典管理、医院资讯管理、药品管理、药品入库管理、药品使用管理、医生管理、医生咨询管理、医生挂号管理、用户管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让城乡居民基本医疗信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。 二、系统设计 在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功能的详细模块。绘制的管理员功能结构见下图。 三、系统功能设计 1、病例管理 此页面让管理员管理病例的数据,病例管理页面见下图。此页面主要实现病例的增加、修改、删除、查看的功能。 图5-1 病例管理页面 2、医院资讯信息管理 医院资讯信息管理页面提供的功能操作有:新增医院资讯,修改医院资讯,删除医院资讯操作。下图就是医院资讯信息管理页面。 图5.3 医院资讯信息管理页面 3、医院资讯类型管理 医院资讯类型管理页面显示所有医院资讯类型,在此页面既可以让管理员添加新的医院资讯信息类型,也能对已有的医院资讯类型信息执行编辑更新,失效的医院资讯类型信息也能让管理员快速删除。下图就是医院资讯类型管理页面。 图5.4 医院资讯类型列表页面 四、数据库设计 (1)下图是医生挂号实体和其具备的属性。 医生挂号实体属性图 (2)下图是用户实体和其具备的属性。 用户实体属性图 (3)下图是药品实体和其具备的属性。 药品实体属性图 (4)下图是医生咨询实体和其具备的属性。 医生咨询实体属性图 (5)下图是药品入库实体和其具备的属性。 药品入库实体属性图 (6)下图是病例实体和其具备的属性。 病例实体属性图 (7)下图是医院资讯实体和其具备的属性。 医院资讯实体属性图 (8)下图是病人实体和其具备的属性。 病人实体属性图 五、核心代码 package com.service.impl; import com.utils.StringUtil; import com.service.DictionaryService; import com.utils.ClazzDiff; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.reflect.Field; import java.

前端第三方组件库国内官网地址

Vant-ui 国内官网: https://vant-contrib.gitee.io/vant/#/zh-CN/ Element-ui 官网: https://element.eleme.cn/#/zh-CN/component/installation layui 官网: https://layuion.com/docs/element/color.html jQuery 官网:https://www.jquery123.com/ Apache ECharts 官网:https://echarts.apache.org/zh/index.html 微信开发文档官网:https://developers.weixin.qq.com/miniprogram/dev/framework/ w3c国内官网:https://www.w3school.com.cn/ mdn国内官网:https://developer.mozilla.org/zh-CN/docs/Web/HTML swiper官网 :https://www.swiper.com.cn/usage/index.html betterscroll官网:https://better-scroll.github.io/docs/zh-CN/

SQL server数据库日志文件收缩

收缩数据库日志文件不需要暂停数据库服务,收缩数据库日志文件时,数据库的数据文件和日志文件会重新组织,这会影响到数据库的读写性能,导致读写速度变慢,甚至出现服务器的假死情况。因此,在执行收缩操作时,需要提前做好规划,尽量避免在高峰期进行,同时也要做好应急预案。 1、首先打开数据库,选择需要收缩日志文件的数据库右键选择属性点击选项将恢复模式完整改为简单点击确定。 2、右击数据库选择收缩文件 3、选择收缩日志,更改想要收缩到的大小点击确定 4、收缩完成后将恢复模式改回完整 此时数据库日志文件将收缩到规定大小 收缩命令: -- 将数据库恢复模式更改为简单 ALTER DATABASE [ZiDanDataBase] SET RECOVERY SIMPLE; GO -- 收缩日志到1G DBCC SHRINKFILE (N'ZhiDan_log', 1024); GO -- 将数据库恢复模式更改为完整 ALTER DATABASE [ZiDanDataBase] SET RECOVERY FULL; GO

快速删除node_modules

要快速删除 node_modules 目录,你可以使用以下方法: 使用命令行(Windows): 打开命令提示符 (Command Prompt) 或者 PowerShell。 进入你的项目目录,确保当前目录下包含 node_modules 目录。 运行以下命令来删除 node_modules 目录及其所有内容: bash rmdir /s node_modules 使用命令行(Mac/Linux): 打开终端 (Terminal)。 进入你的项目目录,确保当前目录下包含 node_modules 目录。 运行以下命令来删除 node_modules 目录及其所有内容: bash rm -rf node_modules 使用第三方工具: 你也可以使用一些第三方工具来帮助快速删除 node_modules 目录,例如 rimraf。首先通过 npm 安装 rimraf: bash npm install -g rimraf 然后在项目目录下运行以下命令来使用 rimraf 删除 node_modules 目录: bash rimraf node_modules 不管你选择哪种方法,删除 node_modules 目录后,你可以重新运行 npm install 命令来重新安装依赖。这样可以保证你的项目处于干净的状态并重新获取所需的依赖项。请确保在删除 node_modules 目录之前备份任何重要的文件或数据。

手把手教你搭建 Android MVI架构: MVI + kotlin + Flow

一、什么是MVI Android MVI是一种用于构建Android应用程序的架构模式,其核心思想在于实现单向数据流和唯一可信数据源。在MVI架构中,应用程序的状态管理得到简化,并且用户界面与业务逻辑之间的交互更加清晰和规范。 二、MVI组成 MVI由Model、View和Intent三个核心组件组成: Model:代表数据模型,负责存储应用程序的状态。它是唯一可信的数据源,意味着应用程序的所有状态都集中在这里管理,避免了状态不一致的问题。 View:即用户界面,负责展示Model中的状态,并响应用户的操作。当用户与界面进行交互时,会产生相应的Intent。 Intent:表示用户的意图或操作。它是View向Model传递信息的方式,告诉Model用户想要执行的操作或期望达到的状态。 在MVI架构中,数据流动是单向的:View产生Intent,Intent传递给Reducer(一个处理Intent并更新Model状态的函数),Reducer根据Intent生成新的Model状态,并将这个状态发送回View进行渲染。这种单向数据流有助于简化状态管理,并使得代码更加可预测和易于维护。 MVI架构还强调代码分层和清晰的责任划分。ViewModel无需关心View如何触发和更新,它只需要维护Intent和State。View与ViewModel的交互更加规范,使用Kotlin的密封类特性来封装Intent和State,使得代码更加规范、整洁和易读。 从图中可以看到, 数据从Data Layer -> ViewModel -> UI,数据是单向流动的。ViewModel将数据封装成UI State传输到UI elements中,而UI elements是不会传输数据到ViewModel的。UI elements上的一些点击或者用户事件,都会封装成events事件,发送给ViewModel。ViewModel更新状态: 在处理事件的过程中,ViewModel 的内部状态(即 UI State)可能会发生变化。这些状态变化通常是基于用户操作和业务逻辑的结果。通知Vew UI更新: 一旦 ViewModel 的状态发生变化,它需要通知 UI 进行相应的更新。这通常是通过某种机制完成的,比如使用观察者模式(如 RxSwift、Kotlin Flow 等),或者通过数据绑定(如 Flutter 的数据流或 Jetpack Compose 的状态持有者)。当 UI 接收到 ViewModel 的状态更新时,它会根据新的状态重新渲染自己。 通过这样的流程,ViewModel 在应用程序中充当了一个中介角色,它接收 UI 的事件,处理这些事件并更新状态,然后通知 UI 进行相应的渲染。这种单向数据流的方式有助于保持代码的可维护性和可测试性,同时也有助于实现更清晰的组件间解耦。 三、MVI框架搭建 搭建步骤: 定义UI State、events构建UI State单向数据流UDF构建事件流eventsUI State的订阅和发送 3.1 定义UIState、events import androidx.annotation.Keep @Keep interface IUiIntent import androidx.annotation.Keep @Keep interface IUiState 然后根据具体逻辑定义页面的UIState和UiIntent。 data class MainState(val bannerUiState: BannerUiState, val detailUiState: DetailUiState) : IUiState sealed class BannerUiState { object INIT : BannerUiState() data class SUCCESS(val models: List<Banner>) : BannerUiState() } sealed class DetailUiState { object INIT : DetailUiState() data class SUCCESS(val articles: Article) : DetailUiState() } sealed class MainIntent : IUiIntent { object GetBanner : MainIntent() data class GetDetail(val page: Int) : MainIntent() } 通过MainState将页面的不同状态封装起来,从而实现唯一可信数据源

使用 ZipArchiveInputStream 读取压缩包内文件总数

读取压缩包内文件总数 简介 ZipArchiveInputStream 是 Apache Commons Compress 库中的一个类,用于读取 ZIP 格式的压缩文件。在处理 ZIP 文件时,编码格式是一个重要的问题,因为它决定了如何解释文件中的字符数据。通常情况下,ZIP 文件中的文本文件是以特定的字符编码格式存储的,例如 UTF-8 或 ISO-8859-1。但是,ZIP 规范并没有规定文件的编码格式,因此不同的 ZIP 文件可能使用不同的编码。 ZipArchiveInputStream 允许用户设置编码格式,以正确处理 ZIP 文件中的文件名或文件内容。默认情况下,ZipArchiveInputStream 可能使用 UTF-8 编码来读取文件名,但如果 ZIP 文件中的文件名使用了不同的编码,那么就需要显式地设置正确的编码格式。 例如,如果 ZIP 文件中的文件名使用了 GBK 编码,那么在创建 ZipArchiveInputStream 对象时,需要调用 setEncoding("GBK") 方法来设置正确的编码格式。这样,ZipArchiveInputStream 就能正确地解析文件名,避免乱码问题。 使用 ZipArchiveInputStream 的基本步骤如下: 创建一个 ZipFile 对象,传入一个 ZIP 文件的 File 对象或 ZIP 文件的路径作为参数。通过 ZipFile 对象的 getInputStream 方法获取一个 InputStream 对象,用于读取 ZIP 文件的数据。创建一个 ZipArchiveInputStream 对象,传入上一步获取的 InputStream 对象作为参数。使用 ZipArchiveInputStream 对象的 getNextEntry 方法来获取 ZIP 文件中的每一个条目(即压缩包内的文件或文件夹),并对其进行处理。可以使用 read 方法读取条目的数据。处理完一个条目后,使用 closeEntry 方法关闭该条目。 代码逻辑 public class Test { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(0); File file = FileUtil.

Android - 常用adb命令总结

文章目录 前言一.常用adb命令1.查询已连接设备2.获取设备状态(devices:正常连接,iffline:连接异常设备无响应,unknown:没有连接)3.获取电脑安装的adb版本号和路径4.apk安装卸载(apk名称和路径不能有中文)5.启动/关闭adb服务6.文件复制7.重启设备8.进入刷机模式9.WiFi连接adb10.抓取log11.获取root权限12.重新挂载设备 二.常用adb shell命令pm命令:1.列出设备所有应用包名2.列出系统应用3.列出第三方应用4.列出应用包名/apk名/存放位置5.列出指定应用的dump信息6.关键字筛选(windows上用findstr,在Linux上用grep),在命令最后加 | findstr 内容XXX7.安装卸载存放在安卓设备上的apk8.清除应用缓存9.设置/获取应用安装位置10.列出设备所有权限11.列出设备用户 am命令:1.MTK平台进入log设置界面2.启动一个activity3.启动默认浏览器打开一个网页4.启动拨号器拨打 100865.监控 crash 与 ANR6.启动一个 instrumentation , 单元测试或者 Robotium 会用到7.结束应用,com.example.filetorw为包名8.启动一个服务9.发送一个广播10.回到桌面11.进入设置界面 input命令1.发送文本内容,不能发送中文2.发送按键事件3.对屏幕发送一个触摸事件,tap后面为触摸点的坐标4.对屏幕发送一个滑动事件,swipe后面依次为起点坐标,终点坐标 其他命令1.截图命令2.屏幕录制命令,最多录制3分钟自动停止,如需提前停止ctrl + c 结束录制3.获取当前界面控件信息,会生成一个xml文件默认存放在sdcard下4.列出设备上的输入法5.设置指定的输入法6.获取设备分辨率7.打开整机monkey并保存log到sdcard中,正常日志和异常日志分开保存8.打开相机monkey并保存log到sdcard中,正常日志和异常日志分开保存9.查看 Android 设备的参数信息,结果以 key : value 键值对的形式显示10.获取CPU型号等信息,HardWare后面的就是CPU的型号11.导出设备信息12.打开TP划线13.打开TP小白点14.读写时间同步服务器ntp15.打开蓝牙16.关闭蓝牙17.查看蓝牙信息18.获取蓝牙开关状态 总结 前言 自己总结,方便自己使用 一.常用adb命令 1.查询已连接设备 adb devices 2.获取设备状态(devices:正常连接,iffline:连接异常设备无响应,unknown:没有连接) adb get-state 3.获取电脑安装的adb版本号和路径 adb version 4.apk安装卸载(apk名称和路径不能有中文) adb install xxx/xxx.apk adb uninstall com.app.xxx(应用包名) 5.启动/关闭adb服务 adb start-server adb kill-server 6.文件复制 从安卓设备复制到电脑: adb pull sdcard/xxx.txt d:\ 从电脑复制到安卓设备: adb push d:\xxx.txt sdcard/ 7.重启设备 重启 adb reboot 重启进入recovery模式

前端UNIAPP端webview嵌入H5使用说明文档

一、关闭webView窗口 plus.webview.close( id_wvobj, aniClose, duration, extras ); 功能说明 关闭已经打开的Webview窗口,需先获取窗口对象或窗口id,并可指定关闭窗口的动画及动画持续时间。 参数说明 参数是否必须参数类型/固定值说明id_wvobj是String 要关闭Webview窗口id或窗口对象,若操作窗口对象已经关闭,则无任何效果。 使用窗口id时,则查找对应id的窗口,如果有多个相同id的窗口则操作最先打开的窗口,若没有查找到对应id的WebviewObject对象,则无任何效果。aniClose否 auto (默认值):自动选择关闭动画效果。none:无动画效果,直接关闭。slide-out-right:从右向左滑出关闭动画。slide-out-left:从左向右滑出关闭动画。关闭Webview窗口的动画效果,如果没有指定关闭窗口动画,则使用默认值“auto”,即使用显示时设置的窗口动画相对应的关闭动画。duration否Number 关闭Webview窗口动画的持续时间,单位为ms,如果没有设置则使用显示窗口动画时间。extras否任意类型关闭Webview窗口扩展参数,可用于指定Webview窗口动画是否使用图片加速。 使用示例 function closeWebview(){ var ws=plus.webview.currentWebview(); plus.webview.close(ws); } 二、创建新的webView窗口 plus.webview.create( url, id, styles, extras ); 功能说明 创建Webview窗口,用于加载新的HTML页面,可通过styles设置Webview窗口的样式,创建完成后需要调用show方法才能将Webview窗口显示出来。 参数说明 参数是否必须参数类型/示例说明url否String 新窗口加载的HTML页面地址,新打开Webview窗口要加载的HTML页面地址,可支持本地地址和网络地址。id否String 新窗口的标识,窗口标识可用于在其它页面中通过getWebviewById来查找指定的窗口,为了保持窗口标识的唯一性,应该避免使用相同的标识来创建多个Webview窗口。 如果传入无效的字符串则使用url参数作为WebviewObject窗口的id值。styles否 JSON 创建Webview窗口的样式(如窗口宽、高、位置等信息)WebviewStylesextras否Object 创建Webview窗口的额外扩展参数,值为JSON类型,设置扩展参数后可以直接通过Webview的点(“.”)操作符获取扩展参数属性值, 如: var w=plus.webview.create('url.html','id',{},{preload:'preload webview'}); // 可直接通过以下方法获取preload值 console.log(w.preload); // 输出值为“preload webview” 使用示例 function create(){ var w = plus.webview.create('http://m.weibo.cn/u/3196963860'); w.show(); // 显示窗口 } 三、获取当前窗口的WebviewObject对象 plus.webview.currentWebview(); 功能说明 获取当前页面所属的Webview窗口对象。 使用示例 var ws=plus.webview.currentWebview(); console.log( "

国产Copilot--通义灵码安装教程

文章目录 在 Visual Studio Code 中安装通义灵码步骤1步骤2步骤3步骤4 参考 在 Visual Studio Code 中安装通义灵码 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/API 的使用场景调优,为开发者带来高效、流畅的编码体验。 兼容 Visual Studio Code、JetBrains IDEs 等主流 IDE; 支持 Java、Python、Go、C/C++/C#、JavaScript、TypeScript、PHP、Ruby、Rust、Scala 等主流编程语言。 官方网址:「通义灵码 · 体验 AI 编码,开 AI 盲盒」 直接安装步骤如下: 唤起 Visual Studio Code 插件市场直接安装,安装后请重启 IDE,即可开启智能编码之旅。 手动安装步骤如下: 步骤1 已安装 Visual Studio Code 的情况下,在侧边导航上点击扩展。 步骤2 如果没有安装,在vscode中搜索通义灵码(TONGYI Lingma),找到通义灵码后点击安装。 步骤3 重启 Visual Studio Code,重启成功后登录阿里云账号,即刻开启智能编码之旅。 可以直接点击该链接「通义灵码 · 体验 AI 编码,开 AI 盲盒」 步骤4 我们来验证一下是否好用,根据语法和跨文件的上下文,实时生成建议代码。 参考 「通义灵码 · 体验 AI 编码,开 AI 盲盒」

基于Python和OpenCV的产品码识别与验证案例

引言: 本案例展示了如何使用Python结合OpenCV库来实现产品码的识别与验证。首先,通过图像预处理技术(如灰度化、二值化、降噪等)优化产品码图像,然后利用OpenCV中的模板匹配或机器学习算法(如SVM、神经网络等)来定位并识别产品码。 目录 原理: 代码部分: 注意: 原理: 产品码识别与验证的核心在于图像处理与模式识别技术。首先,通过图像处理技术提取出产品码区域,去除背景干扰,增强产品码的可识别性。然后,利用模板匹配或机器学习算法识别产品码的具体内容。最后,将识别结果与预设的产品码进行比对,若一致则验证通过,否则验证失败。 代码部分: import cv2 import numpy as np # 读取产品码图像 image = cv2.imread('product_code.jpg') # 灰度化处理 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化处理,根据产品码和背景的对比度调整阈值 _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 降噪处理,使用形态学操作去除小的噪声点 kernel = np.ones((3, 3), np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) # 寻找轮廓,定位产品码区域 contours, _ = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 假设产品码是最大的轮廓 max_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(max_contour) product_code_region = gray[y:y+h, x:x+w] # 这里可以添加模板匹配或机器学习算法来识别产品码 # 假设我们已经有了一个识别函数,可以返回产品码字符串 def recognize_product_code(region): # 这里应该是具体的识别算法实现,比如使用SVM或神经网络进行识别 # 这里为了演示,我们直接返回一个模拟的识别结果 return "

idea连接sqlserver出现[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误

错误信息 选择对应的DataSource 修改两个地方即可 1. 修改Advanced页签的trustServerCertificate 在使用 JDBC 连接 SQL Server 数据库时,trustServerCertificate 是一个连接参数,用于指示客户端是否信任服务器端的证书。当 trustServerCertificate 参数设置为 true 时,客户端将信任服务器端的证书,即使证书没有经过有效的 CA(证书颁发机构)签名也会被接受。这通常用于开发和测试环境中,以简化配置和避免证书验证带来的麻烦。生产环境还是得设置为false的。2. 修改Advanced页签的VM options: 一开始是这样的 "-Djdk.tls.disabledAlgorithms=SSLv3, TLSv1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves" 将其中的 TLSv1和3DES_EDE_CBC 删除,改完后 "-Djdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, anon, NULL, include jdk.disabled.namedCurves" 然后测试连接

RabbitMQ命令行监控命令详解

在分布式系统中,消息队列中间件如RabbitMQ扮演着至关重要的角色。为了保证系统的稳定性和高可用性,对RabbitMQ进行有效监控是必不可少的。本文将详细介绍RabbitMQ提供的命令行工具rabbitmqctl,这些工具可以帮助我们监控和管理RabbitMQ服务器。 RabbitMQ简介 RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ用于在分布式系统中传递消息,支持多种客户端和编程语言。它提供了可靠的消息传输、灵活的路由、分布式部署等功能。 RabbitMQ监控的重要性 监控系统的性能和健康状况对于确保RabbitMQ的高可用性和可靠性至关重要。通过监控,我们可以及时发现潜在的问题并采取相应的措施。例如,我们可以监控队列的长度、消息的发布和消费速率、内存和磁盘使用情况等指标。 RabbitMQ命令行监控命令 RabbitMQ的rabbitmqctl 提供了一系列的命令行工具来帮助我们监控和管理RabbitMQ服务器。以下是一些常用的监控命令: 查看RabbitMQ服务器状态 rabbitmqctl status 这个命令用于查看RabbitMQ服务器的整体状态,包括节点名称、节点状态、应用状态、内存使用情况等。 查看RabbitMQ服务器的连接数 rabbitmqctl list_connections name user state channels 这个命令用于查看当前连接到RabbitMQ服务器的所有连接。它会显示连接的总数、客户端名称、客户端节点等信息。 查看RabbitMQ服务器的队列信息 rabbitmqctl list_queues name messages consumers memory 这个命令用于查看RabbitMQ服务器上所有的队列。它会显示队列的名称、声明的交换机、绑定的交换器、队列中的消息数量等信息。 查看RabbitMQ服务器的交换器信息 rabbitmqctl list_exchanges name type 这个命令用于查看RabbitMQ服务器上所有的交换器。它会显示交换器的名称、类型、是否持久化、绑定的队列数量等信息。 查看RabbitMQ服务器的用户和权限 rabbitmqctl list_users rabbitmqctl list_permissions 这两个命令分别用于查看RabbitMQ服务器上的用户列表和权限列表。它们会显示用户名、密码、角色等信息。 查看RabbitMQ服务器的节点信息 rabbitmqctl cluster_status 这个命令用于查看RabbitMQ集群的状态。它会显示集群中所有节点的名称、状态、角色等信息。 总结 通过以上介绍的RabbitMQ监控命令,我们可以方便地查看RabbitMQ服务器的各种信息,从而更好地监控和管理RabbitMQ。在实际使用中,我们可以根据需要选择适当的命令进行监控。同时,我们还可以通过编写脚本或使用第三方监控工具,定期执行这些命令并将结果发送到指定的邮箱或监控系统,以实现自动化监控。