纯前端实现一个精致的中英文挖空提示功能
前言
这两天给我的学习卡盒小程序新增了一个提示功能,在卡片正面的时候,点击左下角的小灯泡,就会弹出背面内容的提示,这个提示是挖了空的,这种方式可以帮助我们循序渐进的回忆内容,而不是直接看答案。

实现
在实现之前,我们要先梳理一下需求,我要实现的效果是,有一个提示按钮,第一次点击,提示百分之二十的内容,第二次点击,基于第一次提示的基础之上,再提示百分之三十的内容,第三次点击就不再增加提示内容了,只修改一下提示文案。这里还涉及一个中英文挖空逻辑的问题:
中文:每个字都可以用于挖空,不要挖掉标点符号
英文:要先将词汇分开,挖空时只挖完整的单词,如果内容只有一个单词,就不执行挖空逻辑,也不要挖掉标点符号
首先我们定义一些正则规则:
const PATTERNS = {// 匹配中文字符CHINESE: /^[\u4e00-\u9fa5]+$/,// 匹配英文单词ENGLISH: /^[a-zA-Z]+$/,// 匹配标点符号和空白字符PUNCTUATION: /^[,。!?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+$/,// 分词正则SEGMENT: /([\u4e00-\u9fa5]+|[a-zA-Z]+|[,。?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+)/,
}
- CHINESE
(/^[\u4e00-\u9fa5]+$/)
: 这个正则表达式用于匹配仅包含中文字符的字符串。\u4e00-\u9fa5
是 Unicode 范围,涵盖了基本的汉字字符。 - ENGLISH
(/^[a-zA-Z]+$/)
: 这个正则表达式用于匹配仅包含英文字母的字符串。 [a-zA-Z] 表示匹配任何小写或大写英文字母。 - PUNCTUATION
(/^[,。!?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+$/)
: 这个正则表达式用于匹配仅包含中文标点符号、英文标点符号和空白字符的字符串。 字符串中包括中文标点符号(如,。!?、;:)、英文标点符号(如,.!?;😦)[]{}'")和空白字符(\s)。 - SEGMENT
(/([\u4e00-\u9fa5]+|[a-zA-Z]+|[,。?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+)/)
: 这个正则表达式用于分词,即把字符串分割成中文字符串、英文字符串或标点符号/空白字符的序列。([\u4e00-\u9fa5]+|[a-zA-Z]+|[,。?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+)
是一个分组,其中包含三个选项: [\u4e00-\u9fa5]+:匹配一个或多个连续的中文字符。 [a-zA-Z]+:匹配一个或多个连续的英文字符。 [,。?、;:“”‘’()【】《》,.!?;😦)[]{}'"/\s]
前三个好理解,第四个 SEGMENT 用于把中英文基于一些标点符号给分割开,方便下一步处理:
const regex = /([\u4e00-\u9fa5]+|[a-zA-Z]+|[,。?、;:""''()【】《》,.!?;:()[\]{}'"/\s]+)/g;
const text = "这是一个测试。This is a test。";
const matches = text.match(regex);console.log(matches);
// 输出是:["这是一个测试", "。", "This", " ", "is", " ", "a", " ", "test", "。"]
这个百分比的概率如何匹配呢?我们可以将一个字符串分割成单个的中文字符,或者是英文单词,我们称它为 SEGMENT
片段,每一个片段去进行一个判断逻辑,这个判断逻辑就是我们给定一个概率,假设是 20%
,也就是 0.2
那么判断的时候,我们就生成一个 0-1
的随机数,如果大于它就不展示,如果小于它就展示,每个片段这么操作之后,最终再拼接起来,虽然不是整体展示的内容只有 20%
,但是也能实现一个大致的随机挖空效果。
// 处理分段内容的通用函数
const processSegment = (segment: string, // 要处理的文本片段segmentIndex: number, // 片段在整体文本中的索引位置probability: number, // 显示提示的概率(0-1之间)positions: Set<number>, // 存储需要显示提示的位置集合
) => {// 判断是否为英文单词if (PATTERNS.ENGLISH.test(segment)) {// 按概率决定是否显示整个英文单词if (Math.random() < probability) {positions.add(segmentIndex)}} // 判断是否为中文字符else if (PATTERNS.CHINESE.test(segment)) {// 遍历中文字符串的每个字Array.from(segment).forEach((_, idx) => {// 对每个字符按概率决定是否显示if (Math.random() < probability) {// 将需要显示的字符位置添加到集合中positions.add(segmentIndex + idx)}})}
}
概率计算的原理知道后,我们可以进行字符串的处理:
const tipPositions = ref<Set<number>>(new Set())const initializeTipPositions = () => {if (!cardContent.value) returnconst segments = getSegments(cardContent.value)segments.forEach((segment, segmentIndex) => {processSegment(segment, segmentIndex, 0.2, tipPositions.value)})}
这里我维护了 tipPositions
这个 set 集合,它用于记录所有需要展示的字符的索引。第一次点击的时候,我们调用前面定义的概率匹配函数,如果满足可以展示的条件,就把它的索引放到 set 集合里面去。
const getTipContent = computed(() => {// 如果 cardContent 没有值,则直接返回一个空数组if (!cardContent.value) return []// 根据预定义的正则表达式将 cardContent 分割成多个段const segments = getSegments(cardContent.value)// 对每个段进行处理,并生成对应的提示内容数组return segments.map((segment, segmentIndex) => {// 如果当前段为空,则返回一个空数组if (!segment) return []// 如果当前段是标点符号,则直接返回包含该段文本的提示内容if (PATTERNS.PUNCTUATION.test(segment)) {return [{ type: 'text', text: segment }]}// 如果当前段是英文,则根据是否已设置提示位置来决定返回完整文本还是空白占位符if (PATTERNS.ENGLISH.test(segment)) {return tipPositions.value.has(segmentIndex)? [{ type: 'text', text: segment }] // 如果已设置提示位置,则返回完整文本: segment.split('').map(() => ({ type: 'blank-en', text: ' ' })) // 否则,返回下划线}// 对于非英文段(假设主要是中文),逐字处理并生成提示内容const chars = Array.from(segment)return chars.map((char, idx) => ({// 根据是否已设置对应字符位置的提示来决定类型和内容type: tipPositions.value.has(segmentIndex + idx) ? 'text' : 'blank',text: tipPositions.value.has(segmentIndex + idx) ? char : ' ',}))}).flat() // 将二维数组展平为一维数组as TipContent[]
})
这一步遍历我们的字符串,先做一些边界情况的处理,然后根据前面我们的 tipPositions
变量返回一个最终用于渲染的数组。
<textv-for="(item, index) in getTipContent":key="index":class="[item.type === 'blank' && 'tip-blank',item.type === 'blank-en' && 'tip-blank-en',item.type === 'text' && 'animate-fade-in-up animate-duration-200',]":style="{borderBottom:item.type === 'blank' || item.type === 'blank-en' ? '2px solid #ddd' : 'none',display:item.type === 'blank' || item.type === 'blank-en' ? 'inline-block' : 'inline',width: item.type === 'blank' ? '1em' : item.type === 'blank-en' ? '0.5em' : 'auto',verticalAlign:item.type === 'blank' || item.type === 'blank-en' ? 'bottom' : 'baseline',opacity: item.type === 'text' ? 1 : 0.5,margin: '0 0.5px',}">{{ item.text }}</text>
最后我们把字符串渲染出来就好啦~ 第二次点击的时候,我们只要遍历字符串,避开已经展示的索引,再执行一次概率判断的函数,就能实现基于第一次的内容展示更多文本内容的效果了。除此以外,我们还可以增加一个保底机制,毕竟目前的策略运气差有可能一个词都出不来:
// 如果一个字符都没有展示,随机选择一个展示if (tipPositions.value.size === 0) {const validSegments = segments.reduce<{ index: number; length: number }[]>((acc, segment, index) => {if (PATTERNS.ENGLISH.test(segment) || PATTERNS.CHINESE.test(segment)) {acc.push({index,length: PATTERNS.ENGLISH.test(segment) ? 1 : segment.length,})}return acc},[],)if (validSegments.length > 0) {const randomSegment = validSegments[Math.floor(Math.random() * validSegments.length)]if (PATTERNS.ENGLISH.test(segments[randomSegment.index])) {// 如果是英文单词,展示整个单词tipPositions.value.add(randomSegment.index)} else {// 如果是中文,随机展示一个字const randomCharIndex = Math.floor(Math.random() * randomSegment.length)tipPositions.value.add(randomSegment.index + randomCharIndex)}}}}
第一个处理会筛选出需要处理的有效文本(中英文),记录每个有效片段的:位置信息(index)长度信息(length),为后续随机选择提示位置做准备。
// 会生成类似这样的数据:
validSegments = [{ index: 0, length: 1 }, // "Hello" 作为一个英文单词{ index: 2, length: 3 } // "你好啊" 作为3个中文字符
]
第二步就是展示一个保底的词汇逻辑了。
原本我想用下划线字符 “_”
来作为挖空位置,但是我发现下划线的话效果不太好,虽说性能会好一点,可以整个字符串一起渲染,性能会好一些,但是下划线的宽度太窄了,样式也不好单独调整,所以我还是将整个字符串里的每个字符单独渲染,再根据不同的条件展示文字还是挖空,挖空的效果我使用了灰色的下边框去替代,这样看起来的效果会好很多。这里我有前后对比的截图给大家看看:
修改前 | 修改后 |
---|---|
![]() | ![]() |
这个功能的实现还是有点点复杂的,因为边界情况比较多,我现在也还陆陆续续在优化这个逻辑。目前这个功能已经上线到 学习卡盒 小程序了,大家可以去体验一下。小程序的 AI 功能已经 ready 了,现在还在调试中,后续也会写文章介绍实现方式的,如果文章对你有帮助,欢迎点个赞支持下,respect~
相关文章:
纯前端实现一个精致的中英文挖空提示功能
前言 这两天给我的学习卡盒小程序新增了一个提示功能,在卡片正面的时候,点击左下角的小灯泡,就会弹出背面内容的提示,这个提示是挖了空的,这种方式可以帮助我们循序渐进的回忆内容,而不是直接看答案。 实现…...
秘塔搜索AI多线程批量生成TXT原创文章软件
秘塔AI搜索是秘塔科技旗下的搜索产品,其产品是简单、无广告、直接的搜索答案。 秘塔AI搜索写出来的文章无AI味及无AI痕迹,在如今AI文章泛滥时代,搜索引擎喜欢抓取收录这样无AI味原创文章。 秘塔搜索AI多线程批量生成TXT原创文章软件介绍&am…...
鸿蒙生态的崛起:开发实践、认证路径与激励策略
目录 前言 鸿蒙生态能力和行业解决方案 1、鸿蒙创新能力 2、鸿蒙行业解决方案 中软鸿蒙生态业务布局 1、深度参与鸿蒙生态建设 2、提供一站式鸿蒙生态服务 (1)服务目录 (2)改造过程的关键点 (3)鸿…...
python调用matlab函数(内置 + 自定义) —— 安装matlab.engine
文章目录 一、简介二、安装matlab.engine2.1、基于 CMD 安装2.2、基于 MATLAB 安装(不建议) 三、python调用matlab函数(内置 自定义) 一、简介 matlab.engine(MATLAB Engine API for Python):…...
【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)
POI是Point of Interest的简称,意为“兴趣点”,是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点,例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现,并附带详细属性信息&#x…...
【设计模式】如何用C++实现观察者模式【发布订阅机制】
【设计模式】如何用C实现观察者模式【发布订阅机制】 一、问题背景 代码质量影响生活质量。最近工作中频繁接触各种设计模式,深刻体会到优秀的设计模式不仅能显著降低后续维护的压力,还能提升开发效率。观察者模式作为一种降低耦合度、提高扩展性的利器…...
Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控
一、前言 用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要࿰…...
深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等
光猫IPv6设置后的效果对比图: 修改前: 修改后: 一、DNS来源 1. 网络连接 来源: 从上游网络(如运营商)获取 IPv6 DNS 信息,通过 PPPoE 或 DHCPv6 下发。 特点: DNS 服务器地址直…...
Deepmotion技术浅析(五):运动追踪
运动追踪是 DeepMotion 动作捕捉和 3D 重建流程中的核心模块之一。该模块的主要任务是在视频序列中跟踪人体的运动轨迹,捕捉人体各部分随时间的变化,并生成连续的 3D 运动数据。DeepMotion 的运动追踪技术结合了计算机视觉、深度学习和物理模拟等方法&am…...
【html网页页面012】html+css制作品牌主题宏宝莱网页含视频、留言表单(7页面附效果及源码)
品牌主题宏宝莱网页制作 🥤1、写在前面🍧2、涉及知识🌳3、网页效果完整效果(7页):代码目录结构:page1、首页page2、衍生品page3、包装设计page4、视频介绍page5、留言板page6、联系我们page7、详情页(三层页…...
Java的栈与队列以及代码实现
Java栈和队列 栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组实现)用队列实现栈用栈来实现队列总结 栈的概念(Stack) 栈是常见的线性数据结构&…...
华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!
文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器(父子单向通信)1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器(父子双向通信)1. Link装饰器的特点3. Link使用示例 四…...
LeetCode:150. 逆波兰表达式求值
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:150. 逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表…...
LLM模型的generate和chat函数区别
在 Hugging Face 的 transformers 库中,GPT(Generative Pre-trained Transformer)类的模型有两个常用的生成文本的方法:generate 和 chat。这两个方法在使用上有一些区别。通常公司发布的 LLM 模型会有一个基础版本,还…...
Vulhub:Fastjson[漏洞复现]
1.2.24-rce(CVE-2017-18349-Fastjson反序列化) 对于 Fastjson 来说,该漏洞的主要问题在于其1.2.24版本中autotype特性允许任意类的反序列化,因此攻击者通过type指定自定义类并实例化,在特定条件下调用这些类的公共方法。如果一个不受信任的 J…...
C++学习日记---第19天
笔记复习 1.继承 在C中,我们通过函数来实现代码的复用,防止重复造轮子,但是使用函数也有一个缺点1,就是当函数被定义完成之后,它的功能也就确定了,无法被修改,这时候我们引入继承。 C中的继承…...
opencv-python的简单练习
题目1.读取一张彩色图像并将其转换为灰度图。 import cv2 # 读取图片文件 img cv2.imread(./1.png)# 将原图灰度化 img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片 cv2.imshow(img,img) cv2.imshow(img_g,img_gray) # 进行阻塞 cv2.waitKey(0) 题目2:…...
生活小妙招之UE CaptureRT改
需求,四个不同的相机拍摄结果同屏分屏显示 一般的想法是四个Capture拍四张RT,然后最后在面片/UI上组合。这样的开销是创建4张RT,材质中采样4次RT。 以更省的角度,想要对以上流程做优化,4个相机拍摄是必须的ÿ…...
源码编译jdk11 超详细教程 openjdk11
关于源代码 当前的openJDK的源代码已经被发布到了github上了,所以我们可以直接从github上下载到。 OpenJDK11u源码托管地址:https://github.com/openjdk/jdk11u 带后缀U的地址,或者发行的jdk包,表示当前版本下的持续跟新版。而…...
lightRAG 论文阅读笔记
论文原文 https://arxiv.org/pdf/2410.05779v1 这里我先说一下自己的感受,这篇论文整体看下来,没有太多惊艳的地方。核心就是利用知识图谱,通过模型对文档抽取实体和关系。 然后基于此来构建查询。核心问题还是在解决知识之间的连接问题。 论…...
计算机网络-数据链路层
以太⽹的帧格式 源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址), ⻓度是48位,是在⽹卡出⼚时固化的; • IP地址描述的是路途总体的 起点 和 终点; • MAC地址描述的是路途上的每⼀个区间的起点和终点;、 举个例子: 帧协议类型字段有三种值,分别对应IP、ARP、RARP...
ES6 混合 ES5学习记录
基础 数组 let arr [数据1,数据2,...数组n] 使用数组 数组名[索引] 数组长度 arr.length 操作数组 arr.push() 尾部添加一个,返回新长度 arr.unshift() 头部添加一个,返回新长度 arr.pop() 删除最后一个,并返回该元素的值 shift 删除第一个单元…...
Electron electron-builder.yml 配置 (自定义包名,用户自定义安装目录...)
electron-builder.yml 配置 # 唯一的应用程序标识符,用于操作系统级别的识别 appId: com.electron.app# 应用程序的名称,显示在用户界面上 productName: 我的应用# 定义构建资源目录,放置图标、证书等资源文件 directories:buildResources: …...
Python运维自动化之字典Dict
字典Dict(哈希表) Dict即Dictionary,也称为mapping。 Python中,字典由任意个元素构成的集合,每一个元素称为Item,也称为Entry。这个Item是由(key, value)组成的二元组。 字典是可变的、无序的、key不重复的key-value键值对集合。…...
开展新闻营销分为策划期、实施期、优化期三个重要阶段
也许有人会问:什么是新闻营销呢?这是一个在当今商业营销领域备受关注的概念。在信息爆炸的时代,企业都在绞尽脑汁寻找各种有效的营销方式来提升自己的品牌知名度、产品销量等,新闻营销便是其中一种重要的手段。 我们可以将“新闻营…...
解决 Git 默认不区分文件名大小写的问题
不得不说 Git 默认不区分文件名大小写真是一个大坑,由于之前的项目目录比较乱,项目下的文件夹命名都不规范,这两天一直在整理,然后今天从服务器将项目重新 clone 下来后发现,之前将所有文件名首字母改成大写的改动全部…...
Qt网络通信、线程之间通信详解
一、 网络通信协议主要包括TCP和UDP,但更常用和可靠的是TCP协议。TCP是一种面向连接的、可靠的、面向流的传输协议,特别适合用于连续数据传输。在Qt中,网络通信主要通过QTcpSocket类和QTcpServer类来实现。 QTcpSocket类用于建立TCP客户端和…...
java泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>) 称为泛型类、泛型接口,泛型方法、它们统称为泛型。 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检…...
C++入门(1)
一、第一个C程序 #include <iostream> using namespace std; int main() {cout << "hello world" << endl; return 0; } 1. main函数 main 函数是程序的入口,C 的程序不管有多少行代码,都是从 main 函数开始执行的&am…...
在Linux的嵌入式开发中,如何确定要操作的帧缓冲设备是第几个实例?即是fb0还是fb1还是fb2...
方法汇总 在实际编写程序时,要确定操作的帧缓冲设备(如 /dev/fb0、/dev/fb1 等),通常需要结合系统环境和硬件配置。以下是一些常见的方法,帮助你确定需要打开的帧缓冲设备实例: 1. 检查系统设备文件 查看…...
JS 中请求队列与锁的巧妙结合
一、引言 在 JavaScript 开发中,尤其是在涉及到异步操作和对共享资源的并发访问时,有效地控制请求顺序和资源访问权限至关重要。例如,在多个网络请求同时针对一个有限制访问频率的 API 或者多个异步任务竞争同一个文件写入权限的场景下&#…...
注意力机制+时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测
注意力机制时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测 目录 注意力机制时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测效果一览基本介绍程序设计参考资料 效果一览 基…...
Prefix Decoder /Causal Decoder/Encoder-Decoder的区别
Prefix Decoder 定义:Prefix Decoder,也称为非因果解码器,属于Decoder only结构。输入部分使用双向注意力,输出部分使用单向注意力。在生成新的输出时,会考虑到所有之前生成的输出。 特点:Prefix Decoder在…...
《智能体开发实战(高阶)》四、系统化的日志周报智能体开发计划
智能体扩展与完善规划 为了将前几个章节的智能体逐步扩展为支持整个公司团队使用的高效工具,以下是分阶段的完善与扩写规划。每个阶段旨在提升功能覆盖范围、处理能力和用户体验,并为企业提供实际价值。 阶段一:基础功能完善 目标:巩固现有功能,提升健壮性和适用性。 支…...
多线程编程杂谈(上)
问题 线程执行的过程中可以强制退出吗? 主动退出?被动退出? 问题抽象示例 需要解决的问题 g_run 全局变量需要保护吗? 如何编码使得线程中每行代码的执行可被 g_run 控制? 线程代码在被 g_run 控制并 "强制退…...
二五(Vue2-01)、创建实例、插值表达式、响应式、Vue指令、
1. Vue 概念及创建实例 <body><!-- 创建Vue实例,初始化渲染1. 准备容器 (Vue所管理的范围)2. 引包 (开发版本包 / 生产版本包) 官网3. 创建实例4. 添加配置项 > 完成渲染 --><div id"app"><h1>{{msg}}</h1><a href&…...
P8772 求和 P8716 回文日期
文章目录 [蓝桥杯 2022 省 A] 求和[蓝桥杯 2020 省 AB2] 回文日期 [蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1,a2,⋯,an, 求它们两两相乘再相加的和,即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a…...
Burp Suite(2)2024.1.1Burp Suite专业版激活(保姆级教程)
声明: 本文所使用的专业版BP在我的博客资源里面,需要的师傅可以自行下载。 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内…...
基于注意力的几何感知的深度学习对接模型 GAABind - 评测
GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…...
Python中的优化函数2:cvxpy包
文章目录 介绍使用步骤示例1示例2官方文档 介绍 它是一个基于 Python 的凸优化建模工具,专门用于定义和求解 凸优化问题(Convex Optimization Problems)。CVXPY 提供了一种直观的方式来表达优化问题,并通过高效的求解器来解决这些…...
【Linux】结构化命令
结构化命令structured command:允许脚本根据条件跳过部分命令,改变执行流程。 1、if-then语句 格式1: if command then commands fi 格式2: if command; then commands fi 运行if之后的command命令,如果它的退出状态码…...
3-机器人视觉-机器人抓取与操作
文章目录 3机器人视觉目录 1. 传感器和标定摄像头模型Intrinsic MatrixExtrinsic Matrix 标定内参标定手眼标定和外参标定 力传感器&其它传感器其它传感器 2. 神经网络和图像处理2D特征处理常见架构 训练流程推理流程部署流程2D 图像任务3D Point Cloud FeaturePointNet Ap…...
LINUX——shell编程
Shell 简介 Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。 下面是流程示意图ÿ…...
12.11函数 结构体 多文件编译
1.脑图 定义一个数组,用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息,删除后调用显示学生信息函数 显示 4> 封…...
【go语言】reflect包与类型推断
reflect 包的核心概念 Go 中的反射涉及两个核心概念: Type:表示一个类型的结构体,reflect.Type 是类型的描述。Value:表示一个值的结构体,reflect.Value 是一个具体值的包装。 反射让我们能够动态地访问对象的类型和…...
docker启动一个helloworld(公司内网服务器)
这里写目录标题 容易遇到的问题:1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法: 最简单的方式: docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World: docker…...
【瑞萨RA0E1开发板评测报告】IIC OLED 测试
【瑞萨RA0E1开发板评测报告】IIC OLED 测试 基于前面关于瑞萨 e studio 开发软件的使用,以及工程测试基础,本文进一步探索实现硬件 IIC OLED 的文字和图片显示。 1 背景 简单介绍 IIC 通信协议、OLED 显示原理、SS1306 驱动 IC 等。 IIC 通信协议 I…...
全球叉车市场 2023 - 2032 年发展趋势:自动化、电商与电动叉车的崛起
全球叉车市场到2032年将达到955.1亿美元,年复合增长率为7.49% | Astute Analytica 全球叉车市场正迎来显著增长,市场估值预计将从2023年的498.6亿美元增长至2032年的955.1亿美元,预测期内年复合增长率(CAGR)为7.49%。这…...
Kafka系列教程 - Kafka 生产者 -2
1. 生产者简介 不管是把 Kafka 作为消息队列系统、还是数据存储平台,总是需要一个可以向 Kafka 写入数据的生产者和一个可以从 Kafka 读取数据的消费者,或者是一个兼具两种角色的应用程序。 使用 Kafka 的场景很多,诉求也各有不同ÿ…...
【专题】2024年中国新能源汽车用车研究报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p38564 本年度,国家及地方政府持续发力,推出诸多政策组合拳,全力推动汽车产业向更高质量转型升级,积极鼓励消费升级,并大力推行以旧换新等惠民生、促发展举措。尤为引人注目…...