当前位置: 首页 > news >正文

windows+Anaconda环境下安装BERT成功安装方法及问题汇总

前言

在Windows+Anaconda环境下安装BERT,遇到各种问题,几经磨难,最终成功。接下来,先介绍成功的安装方法,再附上遇到的问题汇总

成功的安装方法

1、创建虚拟环境

注意:必须加上python=3.7.12以创建环境,否在在虚拟环境里直接使用pip会遇到很多问题,有可能导致pip安装的包会挂到其他环境里,导致无法使用

conda create --name bert python=3.7.12

2、切换到创建的虚拟环境

conda activate bert

查看pip 的位置,确保是在虚拟环境下:

(bert) C:\Users\Carino\BERT练习>pip -V
pip 23.0.1 from C:\Users\Carino\.conda\envs\bert\lib\site-packages\pip (python 3.10)

从上面可以看出,pip已经在创建的bert虚拟环境里,因此,接下来可以直接使用pip安装依赖包

3、 安装依赖包,最好使用conda安装

注意:由于使用conda安装招不到BERT相关的依赖包,只能使用pip安装

pip install bert-serving-server -i https://pypi.tuna.tsinghua.edu.cn/simple #服务端
pip install bert-serving-client -i https://pypi.tuna.tsinghua.edu.cn/simple # 客户端

4、下载并解压预训练模型文件

[BERT-Base, Chinese]
在这里插入图片描述

5、启动服务

bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=2

6、服务启动成功

运行成功后,会显示:

I:[33mWORKER-0[0m:use device cpu, load graph from C:\Users\Carino\AppData\Local\Temp\tmpm2mrl2ke
I:[33mWORKER-1[0m:use device cpu, load graph from C:\Users\Carino\AppData\Local\Temp\tmpm2mrl2ke
I:[33mWORKER-0[0m:ready and listening!
I:[33mWORKER-1[0m:ready and listening!
I:[35mVENTILATOR[0m:all set, ready to serve request!

7、编写服务调用程序

编程服务程序BertClient.py,并将其放在模型文件所在的目录:

from bert_serving.client import BertClient
bc = BertClient()
value = bc.encode(['你真的很优秀', '你很厉害啊'])
print(value)

8、调用服务

启动另一个Anaconda prompt,切换到刚刚创建的bert虚拟环境,运行:

python BertClient.py

9、服务调用成功

服务调用成功后,在服务端会显示:

I:[35mVENTILATOR[0m:new config request        req id: 1       client: b'c736012d-9e44-4cdd-8861-55bc0bd762ff'
I:[32mSINK[0m:send config     client b'c736012d-9e44-4cdd-8861-55bc0bd762ff'
I:[35mVENTILATOR[0m:new encode request        req id: 2       size: 3 client: b'c736012d-9e44-4cdd-8861-55bc0bd762ff'
I:[32mSINK[0m:job register    size: 3 job id: b'c736012d-9e44-4cdd-8861-55bc0bd762ff#2'
I:[33mWORKER-1[0m:new job     socket: 0       size: 3 client: b'c736012d-9e44-4cdd-8861-55bc0bd762ff#2'
I:[33mWORKER-1[0m:job done    size: (3, 768)  client: b'c736012d-9e44-4cdd-8861-55bc0bd762ff#2'
I:[32mSINK[0m:collect b'EMBEDDINGS' b'c736012d-9e44-4cdd-8861-55bc0bd762ff#2' (E:3/T:0/A:3)
I:[32mSINK[0m:send back       size: 3 job id: b'c736012d-9e44-4cdd-8861-55bc0bd762ff#2'

在客户端会显示:

(bert) C:\Users\Carino\BERT练习\chinese_L-12_H-768_A-12>python BertClient01.py
[[ 0.47229123 -0.4915491   0.43824643 ...  0.07783739  0.4108253-0.7585359 ][ 0.29905218  0.11368733  0.25767356 ...  0.04950948  0.35148147-0.97578394]]

问题汇总及解决办法

1、 NumPy版本过低

当尝试启动服务时,出现错误提示:

FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.

这个是numpy的版本过低导致的,实际测试下来,不影响bert的适应,因此也没有管它

2、protoc版本过低

当尝试启动服务时,出现错误提示:

---以上省略---File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\tensorflow\core\framework\resource_handle_pb2.py", line 41, in <module>serialized_options=None, file=DESCRIPTOR),File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\google\protobuf\descriptor.py", line 561, in __new___message.Message._CheckCalledFromGeneratedFile()
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:1. Downgrade the protobuf package to 3.20.x or lower.2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates

这个是protobuf版本太高导致,需要调整其版本,
查看现有版本:

pip show protobuf(bert) C:\Users\Carino\BERT练习>pip show protobuf
Name: protobuf
Version: 4.22.1
Summary:
Home-page: https://developers.google.com/protocol-buffers/
Author: protobuf@googlegroups.com
Author-email: protobuf@googlegroups.com
License: 3-Clause BSD License
Location: c:\users\carino\.conda\envs\bert\lib\site-packages
Requires:
Required-by: tensorboard, tensorflow

删除现有版本,

pip uninstall protobuf

然后安装低版本

pip install protobuf==3.19.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

3、启动服务失败,缺tensorflow模块

在conda prompt里运行:

bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=2

报错:

(bert) C:\Users\Carino\BERT练习\chinese_L-12_H-768_A-12>bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=2
Traceback (most recent call last):File "C:\Users\Carino\.conda\envs\bert\lib\runpy.py", line 196, in _run_module_as_mainreturn _run_code(code, main_globals, None,File "C:\Users\Carino\.conda\envs\bert\lib\runpy.py", line 86, in _run_codeexec(code, run_globals)File "C:\Users\Carino\.conda\envs\bert\Scripts\bert-serving-start.exe\__main__.py", line 4, in <module>File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\__init__.py", line 29, in <module>_tf_ver_ = check_tf_version()File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\helper.py", line 170, in check_tf_versionimport tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'

解决办法就是安装TensorFlow

4、已安装TensorFlow,但是启动bert-serving-server失败,提示 self.graph_path, self.bert_config = pool.apply(optimize_graph, (self.args,))TypeError: cannot unpack non-iterable NoneType object

pip install tensorflow==2.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

继续尝试启动服务,报错:

(bert) C:\Users\Carino>bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=2
C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\helper.py:175: UserWarning: Tensorflow 2.10.0 is not tested! It may or may not work. Feel free to submit an issue at https://github.com/hanxiao/bert-as-service/issues/warnings.warn('Tensorflow %s is not tested! It may or may not work. '
usage: C:\Users\Carino\.conda\envs\bert\Scripts\bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=2ARG   VALUE
__________________________________________________ckpt_name = bert_model.ckptconfig_name = bert_config.jsoncors = *cpu = Falsedevice_map = []do_lower_case = Truefixed_embed_length = Falsefp16 = Falsegpu_memory_fraction = 0.5graph_tmp_dir = Nonehttp_max_connect = 10http_port = Nonemask_cls_sep = Falsemax_batch_size = 256max_seq_len = 25model_dir = ./chinese_L-12_H-768_A-12/
no_position_embeddings = Falseno_special_token = Falsenum_worker = 2pooling_layer = [-2]pooling_strategy = REDUCE_MEANport = 5555port_out = 5556prefetch_size = 10priority_batch_size = 16
show_tokens_to_client = Falsetuned_model_dir = Noneverbose = Falsexla = FalseI:[35mVENTILATOR[0m:freeze, optimize and export graph, could take a while...
C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\helper.py:175: UserWarning: Tensorflow 2.10.0 is not tested! It may or may not work. Feel free to submit an issue at https://github.com/hanxiao/bert-as-service/issues/warnings.warn('Tensorflow %s is not tested! It may or may not work. '
E:[36mGRAPHOPT[0m:fail to optimize the graph!
Traceback (most recent call last):File "C:\Users\Carino\.conda\envs\bert\lib\runpy.py", line 196, in _run_module_as_mainreturn _run_code(code, main_globals, None,File "C:\Users\Carino\.conda\envs\bert\lib\runpy.py", line 86, in _run_codeexec(code, run_globals)File "C:\Users\Carino\.conda\envs\bert\Scripts\bert-serving-start.exe\__main__.py", line 7, in <module>File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\cli\__init__.py", line 4, in mainwith BertServer(get_run_args()) as server:File "C:\Users\Carino\.conda\envs\bert\lib\site-packages\bert_serving\server\__init__.py", line 71, in __init__self.graph_path, self.bert_config = pool.apply(optimize_graph, (self.args,))
TypeError: cannot unpack non-iterable NoneType object

查找原因,说是因为TensorFlow的版本过高,需要降低到TensorFlow==1.*版本,首先卸载已经安装好的TensorFlow,

pip uninstall tensorflow

下载TensorFlow1.* 的.whl安装文件:tensorflow · PyPI


切换到.whl文件所在路径,执行安装命令:

pip install tensorflow-1.13.1-cp37-cp37m-win_amd64.whl

5、使用pip安装.whl文件失败

虽然已经将.whl文件下载到本地,但在使用pip安装.whl文件时,仍然会从https://pypi.org/上下载其他的依赖包,在这过程中,因为网络的原因,要么提示无法连接,要么提示无法找到指定版本的依赖包,真的很沮丧。
但是,经过多次在Anaconda prompt里反复执行安装命令

pip install tensorflow-1.13.1-cp37-cp37m-win_amd64.whl

最终安装成功。

6、如果遇到各种依赖库版本的问题,最好的办法就是建一个新的虚拟环境,选择其他的版本,重新安装


其他可能会遇到的问题

anaconda删除虚拟环境

conda remove -n <env-name> --all

anaconda查看环境包

conda info --envs

查看pip安装包的依赖包及版本

使用pipdeptree -p <pkg-name>查看

为什么conda的base环境里明明有pip,但在创建的其他虚拟环境里使用pip安装依赖包时,却安装到了系统环境的Python路径下

原因是因为在创建虚拟环境时,没有添加python=3.8类似的参数,导致没有在虚拟环境里安装Python,因此无法使用base环境下的pip

conda安装依赖包如何添加镜像源

要添加镜像源以加速conda包的下载,可以按照以下步骤操作:

  1. 打开终端或Anaconda Prompt。
  2. 输入以下命令:
conda config --add channels <镜像源地址>

其中,<镜像源地址>是你想要添加的镜像源地址,可以是国内的镜像源如清华大学、中科大等,也可以是其他自行维护的镜像源。

例如,假设要添加清华大学的镜像源,可以输入以下命令:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  1. 通过以下命令验证是否添加成功:
conda config --show channels

会打印出当前的镜像源列表,包括官方和你刚刚添加的镜像源。

现在,当你使用conda安装依赖包时,它们将从你添加的镜像源中下载,大大加快下载速度。

如何查看conda安装的依赖包

你可以使用conda env export命令来查看当前环境中所有包及其依赖关系。

conda env export --name myenv > myenv.yml

这将导出确认许可的环境myenv并将其保存在名为myenv.yml的文件中。

你还可以使用conda list命令来列出当前环境中安装的所有包,包括其版本和构建信息。

conda list

这将列出所有包的名称、版本和构建信息。

你可以学习如何使用conda的其他功能。

conda里如何安装bert-serving-server

  1. 首先需要确保已经在conda中安装了bert-serving-server的依赖包:
conda install tensorflow-gpu
  1. 接着,在conda中安装bert-serving-server:
conda install -c anaconda bert-serving-server
  1. 确认是否安装成功
bert-serving-start -version

输出的版本号即为服务器版本,如果输出了版本号,则说明安装成功,可以开始使用bert-serving-server。

CMD里如何启动bert-server

  1. 安装bert-serving-server模块,可以使用pip命令安装:pip install bert-serving-server
  2. 下载需要使用的BERT模型并解压缩,可以在官方GitHub仓库中找到。例如,下载中文BERT模型:
wget https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
unzip chinese_L-12_H-768_A-12.zip -d chinese_L-12_H-768_A-12/
  1. 在命令行中进入解压缩后的BERT模型目录下执行bert-serving-start命令,启动BERT Server:
bert-serving-start -model_dir chinese_L-12_H-768_A-12/ -num_worker=4 -max_seq_len=50

其中,-num_worker表示启动的进程数,-max_seq_len表示最大处理文本长度。 4. 启动成功后,可以通过HTTP请求访问BERT Server提供的API接口进行使用。例如,使用Python代码:

from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['输入文本'])

这将返回一个嵌套列表,每个列表代表一个输入。列表中包含一个NumPy数组,表示该输入文本的特征表示。

如何查看BERT-SERVING-SERVER是否启动

为了指导bert-serving-server是否启动,你可以尝试以下步骤:

  1. 检查是否安装了bert-serving-server。在命令行中输入 bert-serving-start,如果出现“命令未找到”的错误消息,则需要先安装bert-serving-server。
  2. 在命令行中输入以下命令启动bert-serving-server:
bert-serving-start -model_dir /path/to/bert_model/ -num_worker=4

请将上述命令中的 /path/to/bert_model/ 替换为你实际的BERT模型文件路径,并根据需要指定 -num_worker 参数(默认值是1,可以增加多个工作线程来提高性能)。

  1. 查看命令行输出以确认BERT服务器是否已经启动。如果一切正常,应该看到类似以下的输出:
[2019-12-19 02:01:53,810] INFO:root:initialize variables ...
[2019-12-19 02:01:56,667] INFO:tensorflow:Saver not created because there are no variables in the graph to restore
[2019-12-19 02:01:56,812] INFO:root:running at localhost:5555...

这表明bert-serving-server已经成功启动,并正在监听端口5555上的请求。

  1. 在另一个终端窗口中运行BERT客户端代码,以测试BERT服务器是否正常运行。例如,你可以使用bert-client Python库来构建一个客户端程序:
from bert_serving.client import BertClient
bc = BertClient()
result = bc.encode(['Hello, World!'])
print(result)

如果BERT服务器正常运行,应该会输出一组向量值,可用于执行文本分类、情感分析等NLP任务。

相关文章:

windows+Anaconda环境下安装BERT成功安装方法及问题汇总

前言 在WindowsAnaconda环境下安装BERT&#xff0c;遇到各种问题&#xff0c;几经磨难&#xff0c;最终成功。接下来&#xff0c;先介绍成功的安装方法&#xff0c;再附上遇到的问题汇总 成功的安装方法 1、创建虚拟环境 注意&#xff1a;必须加上python3.7.12以创建环境&a…...

git - 简易指南

git - 简易指南 创建新仓库 创建新文件夹&#xff0c;打开&#xff0c;然后执行 git init 以创建新的 git 仓库。 检出仓库 执行如下命令以创建一个本地仓库的克隆版本&#xff1a; git clone /path/to/repository 如果是远端服务器上的仓库&#xff0c;你的命令会是这个样…...

[论文笔记]Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

引言 我们知道Transformer很好用&#xff0c;但它设定的最长长度是512。像一篇文章超过512个token是很容易的&#xff0c;那么我们在处理这种长文本的情况下也想利用Transformer的强大表达能力需要怎么做呢&#xff1f; 本文就带来一种处理长文本的Transformer变种——Transf…...

华为OD机试题 - 找目标字符串(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:找目标字符串题目输入输出示例一输入输出说明Code解题思路版权说…...

C++面向对象编程之六:重载操作符(<<,>>,+,+=,==,!=,=)

重载操作符C允许我们重新定义操作符&#xff08;例如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;等&#xff0c;使其对于我们自定义的类类型对象&#xff0c;也能像内置数据类型&#xff08;例如&#xff1a;int&#xff0c;float&#xff0c;double&…...

JS_wangEditor富文本编辑器

官网&#xff1a;https://www.wangeditor.com/ 引入 CSS 定义样式 <link href"https://unpkg.com/wangeditor/editorlatest/dist/css/style.css" rel"stylesheet"> <style>#editor—wrapper {border: 1px solid #ccc;z-index: 100; /* 按需定…...

Django实践-06导出excel/pdf/echarts

文章目录Django实践-06导出excel/pdf/echartsDjango实践-06导出excel/pdf/echarts导出excel安装依赖库修改views.py添加excel导出函数修改urls.py添加excel/运行测试导出pdf安装依赖库修改views.py添加pdf导出函数修改urls.py添加pdf/生成前端统计图表修改views.py添加get_teac…...

java并发入门(一)共享模型—Synchronized、Wait/Notify、pack/unpack

一、共享模型—管程 1、共享存在的问题 1.1 共享变量案例 package com.yyds.juc.monitor;import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.MTest1") public class MTest1 {static int counter 0;public static void main(String[] args) throws InterruptedEx…...

Ast2500增加用户自定义功能

备注&#xff1a;这里使用的AMI的开发环境MegaRAC进行AST2500软件开发&#xff0c;并非openlinux版本。1、添加上电后自动执行的任务在PDKAccess.c中列出了系统启动过程中的所有任务&#xff0c;若需要添加功能&#xff0c;在相应的任务中添加自定义线程。一般在两个任务里面添…...

用Python暴力求解德·梅齐里亚克的砝码问题

文章目录固定个数的砝码可称量重量砝码的组合方法40镑砝码的组合问 一个商人有一个40磅的砝码&#xff0c;由于跌落在地而碎成4块。后来&#xff0c;称得每块碎片的重量都是整磅数&#xff0c;而且可以用这4 块来称从1 至40 磅之间的任意整数磅的重物。问这4 块砝码片各重多少&…...

离散Hopfield神经网络的分类——高校科研能力评价

离散Hopfield网络离散Hopfield网络是一种经典的神经网络模型&#xff0c;它的基本原理是利用离散化的神经元和离散化的权值矩阵来实现模式识别和模式恢复的功能。它最初由美国物理学家John Hopfield在1982年提出&#xff0c;是一种单层的全连接神经网络&#xff0c;被广泛应用于…...

Retrofit核心源码分析(三)- Call逻辑分析和扩展机制

在前面的两篇文章中&#xff0c;我们已经对 Retrofit 的注解解析、动态代理、网络请求和响应处理机制有了一定的了解。在这篇文章中&#xff0c;我们将深入分析 Retrofit 的 Call 逻辑&#xff0c;并介绍 Retrofit 的扩展机制。 一、Call 逻辑分析 Call 是 Retrofit 中最基本…...

源码分析spring如和对@Component注解进行BeanDefinition注册的

Spring ioc主要职责为依赖进行处理&#xff08;依赖注入、依赖查找&#xff09;、容器以及托管的(java bean、资源配置、事件)资源声明周期管理&#xff1b;在ioc容器启动对元信息进行读取&#xff08;比如xml bean注解等&#xff09;、事件管理、国际化等处理&#xff1b;首先…...

C语言--字符串函数1

目录前言strlenstrlen的模拟实现strcpystrcatstrcat的模拟实现strcmpstrcmp的模拟实现strncpystrncatstrncmpstrstrstrchr和strrchrstrstr的模拟实现前言 本章我们将重点介绍处理字符和字符串的库函数的使用和注意事项。 strlen 我们先来看一个我们最熟悉的求字符串长度的库…...

Webstorm使用、nginx启动、FinalShell使用

文章目录 主题设置FinalShellFinalShell nginx 启动历史命令Nginx页面发布配置Webstorm的一些常用快捷键代码生成字体大小修改Webstorm - gitCode 代码拉取webstorm 汉化webstorm导致CPU占用率高方法一 【忽略node_modules】方法二 【设置 - 代码编辑 - 快速预览文档 - 关闭】主…...

源码分析Spring @Configuration注解如何巧夺天空,偷梁换柱。

前言 回想起五年前的一次面试&#xff0c;面试官问Configuration注解和Component注解有什么区别&#xff1f;记得当时的回答是&#xff1a; 相同点&#xff1a;Configuration注解继承于Component注解&#xff0c;都可以用来通过ClassPathBeanDefinitionScanner装载Spring bean…...

vector的使用及模拟实现

目录 一.vector的介绍及使用 1.vector的介绍 2.vector的使用 1.vector的定义 2.vector iterator的使用 3. vector 空间增长问题 4.vector 增删查改 3.vector 迭代器失效问题&#xff08;重点&#xff09; 1. 会引起其底层空间改变的操作 2.指定位置元素的删除操作--erase 3. Li…...

“华为杯”研究生数学建模竞赛2007年-【华为杯】A题:基于自助法和核密度估计的膳食暴露评估模型(附获奖论文)

赛题描述 我国是一个拥有13亿人口的发展中国家,每天都在消费大量的各种食品,这批食品是由成千上万的食品加工厂、不可计数的小作坊、几亿农民生产出来的,并且经过较多的中间环节和长途运输后才为广大群众所消费,加之近年来我国经济发展迅速而环境治理没有能够完全跟上,以…...

刷题(第三周)

目录 [CISCN2021 Quals]upload [羊城杯 2020]EasySer [网鼎杯 2020 青龙组]notes [SWPU2019]Web4 [Black Watch 入群题]Web [HFCTF2020]BabyUpload [CISCN2021 Quals]upload 打开界面以后&#xff0c;发现直接给出了源码 <?php if (!isset($_GET["ctf"]))…...

新C++(14):移动语义与右值引用

当你在学习语言的时候&#xff0c;是否经常听到过一种说法,""左边的叫做左值&#xff0c;""右边的叫做右值。这句话对吗&#xff1f;从某种意义上来说&#xff0c;这句话只是说对了一部分。---前言一、什么是左右值?通常认为:左值是一个表示数据的表达式(…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...