vivado中IP核调用方法简介

目录 一、基于Vivado的IP核使用方法 二、常用IP核调用方法案例 2.1FIFO IP核 2.2UART IP核 2.3 DDR3 IP核 2.4 PLL IP核 2.5AXI GPIO IP核 三、总结 Vivado是Xilinx公司推出的一款集成化设计环境,可以用于FPGA和SoC的设计和实现。在Vivado中,可以使用IP核来快速实现一些常见的功能模块,例如时钟管理、数字信号处理、图像处理等等。下面将介绍基于Vivado的IP核的使用方法,并给出5个以上的常用IP核调用方法案例以及对应的testbench。 一、基于Vivado的IP核使用方法 打开Vivado,新建一个工程,选择FPGA或SoC的型号和目标平台。 在工程中添加IP核,可以选择从Xilinx的IP库中选择一个现成的IP核,也可以自定义设计一个IP核。 在IP核的配置界面中,根据实际需求进行参数配置,可以选择使用默认值或手动设置参数。 生成IP核的RTL代码和IP核的包装文件。 在设计中实例化IP核,根据实际需求对IP核进行连接和配置。 运行综合、实现和生成比特流文件。 将比特流文件下载到目标平台中进行验证和测试。 二、常用IP核调用方法案例 2.1FIFO IP核 FIFO(First-In-First-Out)是一种常见的数据缓存结构,常用于数据的存储和传输。在Vivado中,可以使用FIFO IP核来快速实现FIFO缓存。以下是一个FIFO IP核的调用方法案例: // FIFO IP核的实例化和连接 fifo_inst fifo ( .din(din), // 输入数据 .wr_clk(wr_clk), // 写时钟 .wr_en(wr_en), // 写使能 .rd_clk(rd_clk), // 读时钟 .rd_en(rd_en), // 读使能 .dout(dout), // 输出数据 .full(full), // FIFO满标志 .empty(empty) // FIFO空标志 ); // FIFO IP核的测试 initial begin wr_en = 1; wr_clk = 1; rd_en = 0; rd_clk = 1; #10 din = 8'b00001111; #10 din = 8'b00010010; #10 din = 8'b01010101; #10 wr_en = 0; #10 rd_en = 1; #10; while(!

caj能转成pdf格式吗?这三个方法建议收藏!

CAJ是中国学术期刊全文数据库中文件的一种格式,用于使用CAJ全文浏览器进行阅读。虽然CAJ全文浏览器支持多种格式,包括CAJ、NH、KDH和PDF,但由于PDF具有集成度高、安全可靠等众多优点,以及方便查看内容的需求,将CAJ格式转换成PDF格式成为常见操作。那么,我们来详细了解一下CAJ转PDF的具体方法。 1.使用CAJ阅读器(CAJViewer) 下载安装CAJ阅读器(CAJViewer),打开该软件,在打开的界面里头,点击“文件”,在下拉菜单下找到“打印”。 点击“打印”,在弹出的菜单里头,选取自己安装的打印机,并点“确定”。 打印完成后,自动有弹窗出来提示文件保存的位置和格式,保存类型选择PDF格式即可。 2.修改文件后缀名 双击打开我的电脑,点击“组织”——“文件夹和搜索选项”——“查看”,找到并取消“隐藏已知文件类型扩展名”勾选,然后选择“应用”; 点击“确定”完成显示文件扩展名的设置,然后把原文件中的后缀名(CAJ)去掉改为自己想要的后缀名(PDF),这时CAJ格式就转为PDF格式了。 3.使用记灵在线工具 访问记灵在线工具的网站或应用。 找到相应的转换功能,并点击进入。 选择要转换的CAJ文件,上传至记灵在线工具。 在转换选项中,选择将CAJ文件转换为PDF格式。 点击转换按钮,等待转换过程完成。 转换完成后,您可以下载生成的PDF文件到本地设备。 无论是使用CAJ阅读器(CAJViewer)、修改文件后缀名的方式,还是使用记灵在线工具转换,都可以实现将CAJ格式转换为PDF格式的目标。记灵在线工具的出现为用户提供了另一种便捷的在线转换选择。根据个人喜好和实际需求,选择适合自己的方法进行转换。无论您选择哪种方法,都能轻松完成格式转换,方便您进行内容阅读和管理。

jmeter性能测试常见报错问题解决

启动jmeter.bat,出现报错:Not able to find Java executable or version. Please check your Java installation. errorlevel=2 请按任意键继续. . . 如图 问题原因:未正确安装jdk或未把jdk引用到环境变量中去,jmeter是由java语言开发的,需要java环境才可运行 解决办法:下载jdk:Java Downloads | Oracle 安装jdk 步骤1 步骤2 安装中 安装完成后编辑环境变量 步骤1 新建变量,变量名输入:JAVA_HOME 变量值输入:D:\java (这里输入安装jdk的路径),点击确定 步骤2 查找CLASSPATH变量,若是有直接编辑,若是没有就需要新建。输入变量值【.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar;】(中括号里面的内容就是变量值,复制时注意不要复制中括号。) 步骤3 找到Path变量进行编辑,将“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”加入Path的变量值中 步骤4: 最后记得点击确定 环境配置弄好了,直接去jmeter文件夹里bin目录下双击:ApacheJMeter.jar就可以打开啦!! 打开如图,注:切换主题可换背景颜色,一般默认背景颜色是黑的 总结不易,您的点赞是我最好的动力!!!!!

Oracle数据库安全评估工具(DBSAT)

目录: 工具概述:先决条件:一、支持的操作系统及DB版本:1.支持的操作系统2.支持的数据库版本 二、评估工具的前提条件:1.所需安装包及工具2.Collector的先决条件3.Reporter的先决条件4.Discoverer的先决条件 工具下载:工具使用:1.安装 DBSAT2.创建数据库用户3.运行收集器4.运行报告器5.分析报告 工具概述: Oracle数据库安全评估工具(DBSAT)是一个流行的命令行工具,它可以帮助识别数据库配置、操作或实施引入风险的领域,并建议改变和控制以减少这些风险。DBSAT帮助评估数据库配置的安全程度,确定谁是用户和他们的权利,并确定敏感数据在数据库中的位置。DBSAT可以区分企业内部的Oracle数据库、自主数据库(共享的和专用的)和DBCS。根据数据库的目标类型,DBSAT执行不同的检查,并提供针对目标的注释。 DBSAT有三个组成部分: 收集器、报告器和发现器。收集器和报告器一起工作,发现风险区域,并就这些风险区域产生报告–数据库安全评估报告。发现器是一个独立的模块,用于定位和报告敏感数据–数据库敏感数据评估报告。 收集器负责通过执行SQL查询和操作系统命令从目标数据库收集原始数据。 报告器读取收集到的数据,对其进行分析,并产生带有发现的报告。报告器输出四种报告,分别是:HTML、XLS、JSON和文本格式。 发现器对数据库字典视图执行SQL查询以发现敏感数据,并以HTML和CSV格式的报告。从12.2.0.8版本开始,Discoverer CSV报告可以加载到Oracle Audit Vault和Database Firewall、以在新的数据隐私报告中添加敏感数据背景。关于此功能的更多信息,请参见将敏感数据导入 敏感数据导入AVDF库,见《Oracle审计库和数据库防火墙审计员指南》。 先决条件: 一、支持的操作系统及DB版本: 1.支持的操作系统 数据库配置收集查询可以在大多数支持的Oracle数据库平台上运行。然而,目前在Windows平台上,操作系统数据收集将被跳过 Oracle DBSAT运行在: • Solaris x64 and Solaris SPARC64 • Linux x86-64 • Windows x64 • HP-UX IA (64-bit) • IBM AIX (64-bit) & Linux on zSeries (64-bit) 2.支持的数据库版本 你可以在Oracle数据库11.2.0.4及以后的版本中,在企业内部或云端,在Oracle数据库标准版2和Oracle数据库企业版上运行Oracle DBSAT。 注意: Oracle数据库标准版2从Oracle数据库12c版本1(12.1.0.2)。对于12.1.0.1,Oracle数据库标准一版和Oracle数据库标准版可用。 参考资料:https://docs.oracle.com/database/121/DBLIC/editions.htm#DBLIC109 二、评估工具的前提条件: 1.所需安装包及工具 DBSAT需要在Unix/Linux系统上安装bash shell,Zip和UnZip Oracle DBSAT使用Zip和Unzip来压缩或解压生成的文件。 Oracle DBSAT在默认位置搜索Zip和Unzip工具,如下所示。 下的默认位置。为了使用其他的Zip和Unzip工具,请在相关脚本中更新以下几行。 相关脚本中的以下几行。 Windows(dbsat.bat脚本): SET ZIP_CMD=%ORACLE_HOME%\bin\zip.exe SET UNZIP_CMD=%ORACLE_HOME%\bin\unzip.exe 注意:

Git重命名远程分支名称并关联本地

注意: 当前分支名(本地) 与 远程分支名完全一致下!!! 注意: 当前分支名(本地) 与 远程分支名完全一致下!!! 注意: 当前分支名(本地) 与 远程分支名完全一致下!!! 假设本地与远程分支名都为A,现更换成B,操作如下: 第一步: 重命名本地分支: git branch -m B 第二步: 删除远程分支 git push --delete origin A 第三步: 推送新命名的本地分支到远程 git push origin B 第四步: 关联修改后的本地分支与远程分支 git branch --set-upstream-to origin/B

比对隔离电源与非隔离电源

比对隔离电源与非隔离电源 在给嵌入式系统设计电源电路,或选用成品电源模块时,要考虑的重要问题之一就是用隔离还是非隔离的电源方案。在进行讨论之前,我们先了解下隔离与非隔离的概念,及两者的主要特点。 一、电源隔离与非隔离的概念 电源的隔离与非隔离,主要是针对开关电源而言,业内比较通用的看法是: 1、隔离电源:电源的输入回路和输出回路之间没有直接的电气连接,输入和输出之间是绝缘的高阻态,没有电流回路。 2、非隔离电源:输入和输出之间有直接的电流回路,例如,输入和输出之间是共地的。 隔离电源示意图如图所示。 二、隔离电源与非隔离电源的优缺点 由上述概念可知,对于常用的电源拓扑而言,非隔离电源主要有:Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。 结合常用的隔离与非隔离电源,我们从直观上就可得出它们的一些优缺点,两者的优缺点几乎是相反的。 使用隔离或非隔离的电源,需了解实际项目对电源的需求是怎样的,但在此之前,可了解下隔离和非隔离电源的主要差别: 1、隔离模块的可靠性高,但成本高,效率差点。 2、非隔离模块的结构很简单,成本低,效率高,安全性能差。 因此,在如下几个场合,建议用隔离电源: 1、涉及可能触电的场合,如从电网取电,转成低压直流的场合,需用隔离的AC-DC电源; 2、串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据,这些相互连接的系统每个都配备有自己的电源,而且各系统之间往往间隔较远,因此,我们通常需要隔离电源进行电气隔离来确保系统的物理安全,且通过隔离切断接地回路,来保护系统免受瞬态高电压冲击,同时减少信号失真; 3、对外的I/O端口,为保证系统的可靠运行,也建议对I/O端口做电源隔离。 三、隔离与非隔离电源的应用场合 通过了解隔离与非隔离电源的优缺点可知,它们各有优势,对于一些常用的嵌入式供电选择,我们已可做成准确的判断: 1、 系统前级的电源,为提高抗干扰性能,保证可靠性,一般用隔离电源。 2、 电路板内的IC或部分电路供电,从性价比和体积出发,优先选用非隔离的方案。 3、 对安全有要求的场合,如需接市电的AC-DC,或医疗用的电源,为保证人身的安全,必须用隔离电源,有些场合还必须用加强隔离的电源。 4、 对于远程工业通信的供电,为有效降低地电势差和导线耦合干扰的影响,一般用隔离电源为每个通信节点单独供电。 5、 对于采用电池供电,对续航力要求严苛的场合,采用非隔离供电。 四、抗电强度 电源的隔离耐压在GB-4943国标中又叫抗电强度,这个GB-4943标准就是我们常说的信息类设备的安全标准,就是为了防止人员受到物理和电气伤害的国家标准,其中包括避免人受到电击伤害、物理伤害、爆炸等伤害。如下图为隔离电源结构图。 隔离电源结构图 作为模块电源的重要指标,标准中也规定了隔离耐压相关测试方法,简单的测试时一般采用等电位连接测试,连接示意图如下: 隔离耐压测试示意图 测试方法: 将耐压计的电压设为规定的耐压值,电流设为规定的漏电流值,时间设为规定的测试时间值; 操作耐压计开始测试,开始加压,在规定的测试时间内,模块应无击穿,无飞弧现象。 注意在测试时焊接电源模块要选取合适的温度,避免反复焊接,损坏电源模块。 买电子元器件现货上唯样商城 五、那么隔离电源与非隔离电源比较有什么的优缺点呢? 隔离电源与非隔离电源优缺点 通过了解隔离与非隔离电源的优缺点可知,它们各有优势,对于一些常用的嵌入式供电选择,我们可遵循以下判断条件: 对安全有要求的场合,如需接市电的AC-DC,或医疗用的电源,为保证人身的安全,必须用隔离电源,有些场合还必须用加强隔离的电源。 一般场合使用对模块电源隔离电压要求不是很高,但是更高的隔离电压可以保证模块电源具有更小的漏电流,更高的安全性和可靠性,并且EMC特性也更好一些,因此目前业界普遍的隔离电压水平为1500VDC以上。

广电用户画像分析之根据用户行为数据进行筛选与标签添加

在数据处理和分析领域,我们经常需要根据用户的行为数据进行筛选和标签添加,以便更好地理解用户行为和偏好。在本篇博客中,我们将介绍两个示例,展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。 前情提要: 数据集分析: 广电用户画像分析之探索各个表中的记录数和字段phone_no的空值数 ) 数据预处理: 广电用户画像分析之数据基本分析与预处理) 根据用户收视行为数据中地区和语言偏好筛选数据 完整代码: package code.userprint import org.apache.spark.sql.SparkSession object MediaPrint { def main(args: Array[String]): Unit = { System.setProperty("HADOOP_USER_NAME", "root") val spark = SparkSession.builder().appName("media") .master("local[*]") .enableHiveSupport() .getOrCreate() // spark.sparkContext.setLogLevel("WARN") val media = spark.table("Processdata.media_index") import org.apache.spark.sql.functions._ // media.selectExpr("max(end_time) as max_month") // .selectExpr("add_months(max_month,-3) as beforeTime").show() // 2018-04-30 media.filter("end_time > '2018-04-30'") .groupBy("phone_no","audio_lang").agg(sum("duration")/(1000*60*60)/3 as "avgduration") .filter("avgduration > 5").select("phone_no","audio_lang") .write.mode("overwrite").saveAsTable("userPrint.languagePrint") media.filter("end_time > '2018-04-30'") .groupBy("phone_no","region").agg(sum("duration")/(1000*60*60)/3 as "avgDuration") .filter("avgDuration > 5").select("phone_no","region") .write.mode("overwrite").saveAsTable("userPrint.regionPrint") } } 该类的目的是根据用户观看媒体的语言和地区信息,统计其在过去三个月内的平均观看时长,并筛选出观看时长大于5小时的用户,将结果存储在两个不同的Hive表中,分别为languagePrint和regionPrint。

西门子变频器G120XA的快速调试方法分享

以西门子变频器G120XA为例,接着为大家介绍一下G120X和G120XA系列变频器的快速调试方法。 西门子发布的Sinamics G120X和G120XA系列变频器,专为风机和泵的应用而设计,实现高效节能、可靠稳定和简单易用。以G120XA为例,通过下面的调试流程图,为大家诠释其简单快捷的调试步骤。 通过上图可以看出,快速调试包含以下几个部分内容: 1、选择应用级P0096 P0096=0,专家模式,通过P1300设置电机控制方式 P0096=1,标准驱动方式,P1300默认设置为V/F控制 P0096=2,动态驱动模式,P1300默认设置问矢量控制 2、输入电机数据 电机标准P0100=0,IEC电机 设备输入电压P0210 选择电机类型P0300,1=异步电机,2=同步电机 电机额定电压P0304 电机额定电流P0305 电机额定功率P0307 电机额定频率P0310 电机额定转速P0311 3、选择电机控制方式P1300 当P0096=0时,需要设置 4、选择连接宏P0015 默认设置宏41,实现DI端子起停,模拟量调速 5、设置最大最小转速、斜坡上升和下降时间 电机最小转速P1080 电机最大转速P1082 斜坡上升时间P1120 斜坡下降时间P1121 Off3 停车时间P1135 6、电机数据检测P1900 P1900=2 电机静态数据检测 P1900=3 电机旋转检测(仅适用于矢量控制) 7、启动变频器,运行电机,执行数据检测 8、完成快速调试

MATLAB数学建模——贝叶斯预测模型

概念 贝叶斯预测模型是一种基于贝叶斯统计理论的预测方法。它利用已有的先验知识和数据,通过贝叶斯定理来更新概率模型,并得出对未来事件或未知量的预测。 在贝叶斯预测模型中,我们首先定义一个先验概率分布,该分布表示我们对未知量的初始信念。然后,我们通过观察到的数据,利用贝叶斯定理更新先验概率分布,得到后验概率分布。后验概率分布反映了我们对未知量的新信念,考虑了观察到的数据的影响。 贝叶斯预测模型的关键是利用数据来不断更新我们对未知量的估计。通过结合先验知识和观测数据,我们可以得到更准确的预测结果,并估计出预测结果的不确定性。 在实际应用中,贝叶斯预测模型可以用于各种领域,包括金融、医疗、天气预测等。它可以处理不确定性和变化的数据,并提供灵活的方法来更新和调整预测模型。 贝叶斯预测模型的一个常见实现是贝叶斯网络(Bayesian Network)。贝叶斯网络是一种图模型,用于表示变量之间的概率依赖关系,并通过贝叶斯推理来进行预测。它可以有效地处理复杂的不确定性问题,并提供直观的图形表示来理解变量之间的关系。 总的来说,贝叶斯预测模型是一种强大的预测工具,能够结合先验知识和观测数据,提供准确的预测结果,并考虑不确定性。它在许多实际应用中发挥着重要作用,帮助人们做出明智的决策和规划。 当谈论贝叶斯预测模型时,有几个重要的概念需要理解。以下是这些概念的解释: 先验概率(Prior Probability):先验概率是在考虑任何观测数据之前对未知量的概率分布的估计。它基于以前的知识、经验或主观判断,并在观测数据的影响下进行更新。 似然函数(Likelihood Function):似然函数是一个关于参数的函数,给出了在给定参数下观测数据出现的概率。它衡量了参数取值与观测数据的拟合程度。 后验概率(Posterior Probability):后验概率是在考虑观测数据后对未知量的概率分布的更新估计。它通过将先验概率与观测数据的似然函数结合起来,应用贝叶斯定理得到。 贝叶斯定理(Bayes’ Theorem):贝叶斯定理是一个基于条件概率的数学定理,描述了在给定观测数据的情况下如何更新概率分布。它表达了后验概率与先验概率和似然函数之间的关系。 先验知识(Prior Knowledge):先验知识是在进行预测或推断之前已经存在的关于未知量的信息。这些知识可以是基于经验、领域知识、先前研究或专家意见等。 不确定性(Uncertainty):贝叶斯预测模型能够处理不确定性。不确定性指的是我们对未知量的预测或估计存在的不确定程度。贝叶斯预测模型可以通过计算概率分布来量化不确定性,并提供关于预测结果的可信度度量。 这些概念共同构成了贝叶斯预测模型的基础,使其成为一种强大的预测工具,能够结合先验知识和观测数据,提供准确的预测结果,并考虑不确定性。 应用 以下是一个使用MATLAB实现贝叶斯预测模型的简单例子。这个例子假设你有一组观测数据,你希望通过这些观测数据来预测下一个未知数据点的值。 % 观测数据 observed_data = [2, 4, 6, 8, 10]; % 先验概率分布的参数 prior_mean = 0; % 先验分布的均值 prior_variance = 1; % 先验分布的方差 % 似然函数的参数 likelihood_mean = 0; % 似然函数的均值 likelihood_variance = 1; % 似然函数的方差 % 计算后验概率分布的参数 posterior_mean = (prior_mean * likelihood_variance + sum(observed_data) * prior_variance) / ... (prior_variance + length(observed_data) * likelihood_variance); posterior_variance = (prior_variance * likelihood_variance) / .

[docker]关于在使用mac Version 12.6 Apple M1 Pro下载镜像selenium/standalone-chrome无法使用的问题

mac上无法使用selenium/standalone-chrome问题 引言问题描述问题原因解决方案总结 引言 当我们需要使用selenium-grid来实现分布式时,遇到了一个问题,致使我们无法完成这个功能. 问题描述 记录使用的设备: 操作系统: macOS 系统版本: 12.6 芯片: Apple M1 Pro 记录时间: 2023年6月25日 在安装完docker后,拉取镜像selenium/standalone-chrome后,启动镜像 docker run --rm --cap-add=SYS_ADMIN -p 4444:4444 -p 5900:5900 -e ENABLE_VNC=true selenoid/vnc:chrome_99.0 本地编写代码进行连接测试 require "rubygems" require "selenium-webdriver" # 本地配置环境 # driver = Selenium::WebDriver.for :chrome # 配置远程连接环境 # options = Selenium::WebDriver::Chrome::Options.new # options.add_argument('--headless') # options.add_argument('--disable-gpu') # options.add_argument('--no-sandbox') # options.add_argument('--disable-dev-shm-usage') # driver = Selenium::WebDriver.for :remote, url: "http://127.0.0.1:4444", desired_capabilities: :chrome driver.navigate.to "https://www.baidu.com/" sleep 3 element = driver.

uniapp 前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)

前言 本文将介绍如何使用uniapp和百度AI开放平台的OCR(光学字符识别)API实现身份证、营业执照等卡证的识别和文字识别功能。 兼容说明 APP小程序H5√√√ 准备工作 1. 注册百度账号 前往百度AI开放平台官网,点击“登录”。使用百度账号登录,如果没有可以先注册百度账号。登录成功后,点击右上角的“开发者服务”->“API 服务”。 2. 进入开发者平台,创建OCR文字识别应用 在AI能力服务类目中选择“OCR文字识别”,进入文字识别产品的应用页。点击“立即使用”,进入OCR文字识别应用创建页。 3. 获取AppID和AK 输入应用名称,选择应用类型为“公开应用”或“私有应用”,填写验证码后点击“创建应用”。应用创建成功把对应的client_id和client_secret保存好添加到项目里 图片转base64(兼容APP、H5、小程序) 新建一个js文件导出toBase64函数 将图片文件路径转为base64格式 /** * @description 本地图片转base64方法(兼容APP、H5、小程序) * @param {number} path 图片本地路径 * @returns Promise对象 */ const toBase64 = (path) => { return new Promise((resolve, reject) => { // #ifdef APP-PLUS plus.io.resolveLocalFileSystemURL(path, (entry) => { entry.file((file) => { let fileReader = new plus.io.FileReader() fileReader.readAsDataURL(file) fileReader.onloadend = (evt) => { let base64 = evt.target.result.split(",")[1] resolve(base64) } }) }) // #endif // #ifdef H5 uni.

【八】并发编程之异步编程

【八】并发编程之异步编程 异步编程 基于 async 和 await 关键字的协程可以实现异步编程,这也是目前 Python 异步相关的主流技术。在这里我们主要介绍一下实现异步的模块:asyncio 模块 【一】asyncio 模块 asyncio 模块是 Python 中实现异步的一个模块,该模块在 Python3.4 的时候发布,async 和 await 关键字在 Python3.5 中引入。因此,想要使用asyncio模块,建议 Python 解释器的版本不要低于 Python3.5 。 【二】事件循环 所谓的事件循环,我们可以把它当作是一个 while 循环,这个 while 循环在循环生命周期内运行并执行一些任务,在特定的条件下结束循环。 在编写程序的时候可以通过如下代码来获取和创建事件循环: import asyncio loop = asyncio.get_event_loop() 【三】协程 & 异步编程 首先我们来看一下 协程函数 什么是协程函数呢?直白的讲,定义为如下形式的函数我们可以称之为协程函数,如下代码所示: async def fn(): pass 知道了什么是协程函数 接下来我们再来看一下什么是协程对象所谓的协程对象就是调用协程函数之后返回的对象我们称之为 协程对象,如下代码所示: res = fn() 注意事项:调用协程函数时,函数内部的代码不会执行,只是会返回一个协程对象! 【1】基本应用 在编写程序的时候,如果想要执行协程函数内部的代码,通过 函数名() 调用函数是不可以的,需要 事件循环 和 协程对象 配合才能实现,如下代码所示: import asyncio async def fn(): print('协程函数内部的代码') def main(): # 调用协程函数,返回一个协程对象 res = fn() # 执行协程代码的方式一 # todo:1、创建一个事件循环 # loop = asyncio.

Apache James邮件服务器搭建(linux)

1、配置jdk,此处不再赘述,随便搜一下然后照着操作即可 注意:后续james的版本是3.5.0,需要与jdk8配套 2、下载apache james ,apacheJames 下载之后可以直接运行,无需安装 注意:此处选择3.5.0版本,因为更高版本与jdk8不配套 Index of /dist/james/server/3.5.0 ​ 2、下载foxmail,用于后续进行测试 Foxmail for Mac ​ 3、安装foxmail 双击前一步下载的foxmail包,傻瓜式下一步安装即可 搭建ApacheJames邮件服务器 1、修改 mailetcontainer.xml,修改postmaster的值为postmaster@st.com 注意:下述@st.com为自定义的邮件域名,与@163.com类似 <context> <!-- When the domain part of the postmaster mailAddress is missing, the default domain is appended. You can configure it to (for example) <postmaster>postmaster@myDomain.com</postmaster> --> <postmaster>postmaster@st.com</postmaster> </context> 2、修改 smtpserver.xml 将authRequired、verifyIdentity值配置为false 将helloName配置为st.com。注意与步骤1中保持一致 <authRequired>true</authRequired> <verifyIdentity>true</verifyIdentity> <helloName autodetect="true">st.com</helloName> 3、修改 domainlist.xml 将autodetect、autodetectIP的值配置为false 将defaultDomain配置为st.com。注意与步骤1中保持一致 <domainlist class="org.apache.james.domainlist.jpa.JPADomainList"> <autodetect>false</autodetect> <autodetectIP>false</autodetectIP> <defaultDomain>st.com</defaultDomain> </domainlist> 4、启动james

Apache James邮件服务器搭建(windows)

准备工作 1、下载apache james ,apacheJames 下载之后可以直接运行,无需安装 注意:此处选择3.5.0版本,因为更高版本与jdk8不配套 Index of /dist/james/server/3.5.0 ​ 2、下载foxmail,用于后续进行测试 Foxmail for Mac ​ 3、安装foxmail 双击前一步下载的foxmail包,傻瓜式下一步安装即可 搭建ApacheJames邮件服务器 1、修改 mailetcontainer.xml,修改postmaster的值为postmaster@st.com 注意:下述@st.com为自定义的邮件域名,与@163.com类似 <context> <!-- When the domain part of the postmaster mailAddress is missing, the default domain is appended. You can configure it to (for example) <postmaster>postmaster@myDomain.com</postmaster> --> <postmaster>postmaster@st.com</postmaster> </context> 2、修改 smtpserver.xml 将authRequired、verifyIdentity值配置为false 将helloName配置为st.com。注意与步骤1中保持一致 <authRequired>true</authRequired> <verifyIdentity>true</verifyIdentity> <helloName autodetect="true">st.com</helloName> 3、修改 domainlist.xml 将autodetect、autodetectIP的值配置为false 将defaultDomain配置为st.com。注意与步骤1中保持一致 <domainlist class="org.apache.james.domainlist.jpa.JPADomainList"> <autodetect>false</autodetect> <autodetectIP>false</autodetectIP> <defaultDomain>st.com</defaultDomain> </domainlist> 4、启动james 进入james-server-app-3.5.0/bin目录中,windows执行run.bat,linux执行sh run.

MySQL压测实战

写作目的 最近看到一句话是MySQL的TPS是4000,这句话是不严谨的,因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。 注意:服务器不同结果不同,结果不具有普适性。 服务器配置 配置参数CPU2核内存4GMySQL5.7Linux7.5 MySQL安装 1)docker安装 2)docker安装MySQL docker run --name mysql-6-20220702 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 MySQL压测实践 压测工具的安装sysbench 执行 下载命令 curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash 安装 sudo yum -y install sysbench 查看版本 sysbench --version 构造测试表和数据 sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare 参数含义–db-driver=mysql这个很简单,就是说他基于mysql的驱动去连接mysql数据库,你要是oracle,或者sqlserver,那自然就是其他的数据库的驱动了–time=300这个就是说连续访问300秒–threads=10这个就是说用10个线程模拟并发访问–report-interval=1这个就是说每隔1秒输出一下压测情况–mysql-host=127.0.0.1这是你要连接的sql服务连接–db-driver=mysql这个很简单,就是说他基于mysql的驱动去连接mysql数据库,你要是oracle,或者sqlserver,那自然就是其他的数据库的驱动了–mysql-port=3306数据端口–mysql-user=test_user数据库用户名–mysql-password=test_user数据库密码–mysql-db=test_db哪个数据库进行压测,需要手动创建库–tables=20压测数据库创建多少张表–table_size=1000000压测数据库每张表插入多少数据oltp_read_write执行oltp数据库的读写测试–db-ps-mode=disable禁止ps模式(不知道干嘛的)prepare参照这个命令的设置去构造出来我们需要的数据库里的数据,他会自动创建20个测试表,每个表里创建100万条测试数据 执行上面命令完毕后数据库中会有这样的命令 压测结果解读DEMO 从10个线程开始压,压10秒,同时读写操作 sysbench --db-driver=mysql --time=10 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run [ 1s ] thds: 10 tps: 131.

MATLAB二维、三维图形的绘制

本篇文章主要介绍了MATLAB二维、三维图形绘制,图形属性的设置和图形修饰。二维图形绘制包括使用plot函数绘制二维曲线、选用绘图线型和颜色、添加文字标注、修改坐标轴的显示范围、子图和特殊图形绘制;三维图形的绘制介绍了绘制空间螺旋线和椭圆抛物面两个例子,供读者参考使用。 1.二维图形的绘制 (1)使用plot函数绘制一条正弦曲线和余弦曲线: clear x=linspace(0,2*pi,100); y1=sin(x); plot(x,y1) hold on %保持原有的图形 plot(x,cos(x)) 运行结果如下: (2)plot函数的参数也可以是矩阵: close all%关闭所有图形窗口 x=linspace(0,2*pi,100);%用于生成0到2*pi范围内的数据点 y1=sin(x); y2=cos(x); A=[y1;y2]';%把矩阵转置 B=[x;x]'; plot(B,A)%plot参数也可以是矩阵 本处程序与上面的程序表达意义相同,只是形式有所差别,仿真结果是一样的。 (3)选用绘图线型和颜色: %选用绘图颜色和线型 close all %关闭所有图形窗口 plot(x,y1,'g+',x,y2,'r:') grid on %添加网格线 注意运行这里的程序需要前面的程序在MATLAB的路径下,运行的结果如下: (4)添加文字标注: %添加文字标注 title('正弦曲线和余弦曲线') ylabel('幅度') xlabel('时间') legend('sin(x)','cos(x)') gtext('\leftarrowsinx')%可用鼠标选择标注的位置 % leftarrowsinx产生左箭头,‘\’为转义符 运行该段程序也需要前面的程序在MATLAB路径下,且运行得到的图形不能删除,运行结果如下图所示: 运行该段程序会先得到一个十字光标,可用鼠标点击需要标注的位置,在该光标点击处会显示一个箭头和sinx的符号,若要修改得到的标注只需要修改最后一段程序即可。 (5)修改坐标轴范围: axis equal %使x轴和y轴的比例相等 axis normal %防止图形显示时出现扭曲或拉伸 axis ([0 pi 0 1.5]) %axis函数语法为:axis([xmin xmax ymin ymax]) 运行结果如下: (6)子图和特殊图形的绘制 : subplot(2,2,1) t1=0:0.1:3; y1=exp(-t1); bar(t1,y1); %将数据以柱状图的形式展现 subplot(2,2,2) t2=0:0.2:2*pi; y2=sin(t2); stem(t2,y2); %将离散信号的取值以垂直信号的形式展现 subplot(2,2,3) t3=0:0.

git reset后撤回恢复到reset前的版本

在使用git reset 2命令后,你撤销了最近的两个提交并丢弃了相应的更改。如果你希望恢复这些提交和更改,可以采取以下步骤: 使用 git reflog 命令查看Git的引用日志,找到你之前所在分支的历史记录。你会看到所有的提交和操作记录。 针对你要恢复的提交,找到其对应的提交哈希值。 运行以下命令来恢复到该提交: git reset --hard <commit-hash> 将 <commit-hash> 替换为你想要恢复的提交的哈希值。 这将恢复到指定的提交,并恢复其更改。 请注意,在使用 git reset --hard 命令后,如果没有及时备份或推送到远程仓库,恢复被撤销的提交和更改可能会变得更加困难。因此,在执行任何重置操作之前,请确保你对重要的更改进行了备份。

Data Structure - Treap (Java)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程 package chimomo.learning.java.datastructure; import java.util.Random; /** * Implements a treap. * Note that all "matching" is based on the compareTo method. * * @author Created by Chimomo */ public class Treap<T extends Comparable<? super T>> { private TreapNode<T> root; private TreapNode<T> nullNode; /** * Construct the treap. */ public Treap() { nullNode = new TreapNode<>(null); nullNode.left = nullNode.right = nullNode; nullNode.priority = Integer.MAX_VALUE; root = nullNode; } // Test program.

行为型设计模式11-访问者模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 访问者模式 1、访问者模式介绍 访问者模式(Visitor Pattern)是一种行为型设计模式,它**允许你在不修改现有对象结构的情况下定义一些新操作**。通过将操作封装在一个访问者对象中,可以让你在不改变被访问对象的类的前提下,定义对该对象的新操作。 访问者模式的核心思想是将数据结构与数据操作分离。它适用于那些数据结构稳定,但需要经常添加新的操作的场景。通过引入访问者模式,可以避免在已有的数据结构中添加新操作时的修改和维护工作。 1.1 访问者模式的基本实现 访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式结构图: 访问者模式包含以下几个关键角色: 访问者(Visitor):定义了对每个元素的具体访问操作,它通过重载访问者的方法来实现不同的操作。具体访问者(ConcreteVisitor):实现了访问者定义的操作,并针对具体的元素类型提供了不同的访问实现。元素(Element):定义了一个接受访问者的方法,该方法将访问者作为参数传入,使访问者能够访问该元素。具体元素(ConcreteElement):实现了元素接口,具体元素中会包含接受访问者的具体实现,即调用访问者的方法。对象结构(Object Structure):包含元素的集合,提供了一个可以被访问的集合接口。 访问者模式的使用步骤如下: 定义访问者接口,该接口声明了多个访问方法,每个方法对应一个具体元素的访问操作。定义具体访问者类,实现访问者接口,并为每个具体元素提供不同的访问实现。定义元素接口,声明接受访问者的方法。定义具体元素类,实现元素接口,并在接受访问者的方法中调用访问者的相应方法。定义对象结构类,该类维护一个元素集合,并提供遍历元素集合的方法,将访问者作为参数传入元素的接受方法。 Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit 操作。 /** * @author Shier * CreateTime 2023/5/24 21:10 * 抽象访问者类 */ public abstract class Visitor { public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); } ConcreteVisitor1和ConcreteVisitor2类:具体访问者,实现每个由 Visitor声明的操作。每个操作实现算法的一部分,而该算法片断乃是对应于 结构中对象的类。 /** * @author Shier * CreateTime 2023/5/24 21:17 */ public class ConcreteVisitor1 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.

多层复杂jsonString转对象

背景 在开发过程中,有遇到需要透传其他子系统的接口信息的业务,看到相关对接接口的wiki文档。返回参数复杂的一批,此篇文章记录自己本人如何处理这种复杂json格式的,以便后续温故而知新。 demoDTO package com.yusenliang.springlearnproject.DTO; import lombok.Data; import java.util.List; @Data public class Layer1 { //层次1 List<Object> layer2; String layer1str; } ------------------------------------------------- @Data public class Layer2 { //层次2 List<Object> layer3; String layer2str; } -------------------------------------------------- @Data public class Layer3 {//层次3 Object layer4; String layer3str; } --------------------------------------------------- @Data public class Layer4 {//层次4 String layer4str; } demoJsonString [ { "layer2":[ { "layer3":[ { "layer4":{ "layer4str":"虞森良" }, "layer3str":"layer3str" } ], "layer2str":"layer2str" } ], "layer1str":"layer1" } ] 处理思路 1.

Spring Boot整合Spring Security实现认证鉴权

Spring Security 本文仅针对前后端分离项目采用的jwt方案来实现认证授权 相关概念来源网上查找(本文主要是涉及到使用,不会有太深的概念东西) Spring Security是一个基于Spring框架的安全性框架,可以为Web应用程序提供身份验证(Authentication)、授权(Authorization)、攻击防御等安全功能。Spring Security框架提供了一整套的身份验证、授权、ACL(访问控制列表)等模块和类库,还提供了一系列的安全过滤器、安全标签等,可以方便地实现常见的安全性控制。 Spring Security的核心组件如下: Authentication:身份验证组件,负责用户身份认证。 Authorization:权限授权组件,负责用户权限的授权管理。 Access Control、ACL:访问控制列表组件,负责资源的访问控制和权限的分配控制。 Session Management:会话管理组件,负责管理用户的会话,如Session ID管理等。 Web Security:使用Spring Security保护Web应用程序的安全组件。 Remember-me:记住我功能组件,负责实现自动登录功能。 OpenID:OpenID功能组件,负责与Open ID提供商的集成。 Spring Security的主要特点包含: 可扩展性:Spring Security框架提供了很多可扩展的类和接口,可以通过自定义实现这些接口和类来满足自己的需求。 配置简单:Spring Security框架的配置非常简单,只需配置几个关键的类即可实现基本的安全性控制。 弹性设计:Spring Security框架非常灵活,可以根据实际情况在不同的场景下灵活应对。 多种安全认证方式:Spring Security框架提供了很多种安全认证方式,如表单认证、基本认证、OAuth2等,可以根据实际需求选择合适的认证方式。 一、大体认证授权流程 官方说明: Spring Security的认证机制包括AuthenticationManager和AuthenticationProvider两个核心组件。AuthenticationManager是一个接口,定义了身份验证的入口方法authenticate(),该方法接受一个Authentication对象作为参数,并返回一个封装了认证信息的Authentication对象。AuthenticationProvider是一个接口,定义了身份验证的具体实现,该接口的实现类可以根据不同的身份验证方式(如用户名密码、数字证书等)来实现身份验证的功能。 在Spring Security中,用户请求经过过滤器链,经过身份认证和授权决策来保护资源的安全。身份认证包括认证请求的处理和身份验证的实现。认证请求的处理包括UsernamePasswordAuthenticationFilter、RememberMeAuthenticationFilter等过滤器的处理。身份验证的实现则是通过AuthenticationManager来实现的。 授权决策由AccessDecisionManager和AccessDecisionVoter两个核心组件来实现。AccessDecisionManager是一个接口,定义了授权决策的入口方法decide(),该方法接受三个参数:Authentication对象(当前用户的认证信息)、Object对象(正在访问的资源)、List对象(访问资源所需的权限列表)。AccessDecisionVoter则是一个接口,定义了对当前用户的认证信息、当前请求所需的权限、资源的访问控制列表进行比较的方法,以决定当前用户是否有访问该资源的权限。 总的来说,Spring Security的认证授权原理是通过AuthenticationManager和AuthenticationProvider实现身份认证,通过AccessDecisionManager和AccessDecisionVoter实现授权决策,以保护资源的安全。 具体的执行流程其实是一个过滤链: 1、用户向应用程序发起请求,请求需要经过Spring Security的过滤器链。 2、过滤器链首先会经过UsernamePasswordAuthenticationFilter过滤器,该过滤器判断请求是否是一个认证请求。如果是认证请求,过滤器将获取请求中的用户名和密码,然后使用AuthenticationManager进行身份认证。 3、AuthenticationManager会根据用户名和密码创建一个Authentication对象,并将该对象传递给AuthenticationProvider进行认证。 4、AuthenticationProvider会根据传递过来的Authentication对象进行身份认证,并返回一个认证成功或失败的结果。 5、如果认证成功,UsernamePasswordAuthenticationFilter会将认证信息封装成一个Authentication对象,并将其放入SecurityContextHolder上下文中。 6、用户请求获取资源时,会经过FilterSecurityInterceptor过滤器,该过滤器会根据请求的URL和HTTP方法获取访问控制列表(Access Control List)。 7、Access Control List会包含访问资源所需要的权限信息,FilterSecurityInterceptor会将Authentication对象和Access Control List传递给AccessDecisionManager进行授权决策。 8、AccessDecisionManager会调用多个AccessDecisionVoter进行投票,并根据投票结果来决定当前用户是否有访问该资源的权限。如果用户被授权访问资源,应用程序将返回资源的响应结果。 总结就是首先经过认证过滤器实现认证,认证成功的话就会将用户信息存到authentication对象里面放到security上下文去(后续的权限校验需要获取到),这里面是包括权限的,之后再由AccessDecisionManager去根据相关策略进行权限鉴定 二、集成完整案例代码 思路:从上面的总结来看,认证的话,因为使用的是jwt,因此直接自定义一个过滤器来实现认证,同时之后还需要在AccessDecisionManager权限鉴定,所以我们在这个认证的过滤器里面去做认证并且获取到该用户的权限创建出Authentication对象存放到security上下文以支持后续的鉴权 目录结构: 只针对主要的展示,例如security和controller相关的 0、数据准备 /* Navicat Premium Data Transfer Source Server : 本地 Source Server Type : MySQL Source Server Version : 80031 (8.

上传文件 运用element-plus组件实现

<!-- http-request覆盖默认的xhr行为,允许自行实现上传的请求 --> <el-upload class="upload-demo" drag accept=".xls,.xlsx" :http-request="uploadHandler" :show-file-list="false"> <el-icon class="el-icon--upload"> <upload-filled /> </el-icon> <div class="el-upload__text"> 拖拽 xls/xlsx 文件到这里 或者 <em>点击上传</em> </div> </el-upload> <el-table :data="tableData" v-if="tableData.length"> <el-table-column v-for="(value, key) in tableData[0]" :key="key" :prop="key" :label="key" align="center"> </el-table-column> </el-table> data(){ return { // excel 的数据 tableData: [] } methods: { uploadHandler(data) { // 这就是上传的那个文件 const file = data.file console.log(file) // 创建一个文件读取的实例 const reader = new FileReader() console.log(reader) // 读取成一个buffer格式的文件 reader.readAsArrayBuffer(file) // 当onload执行的时候 文件已经读取完成 reader.

使用matlab提取图片信息的简单代码

使用matlab提取图片信息的简单代码如下所示,其中row,col,channel的值由编者自己设置,使用该代码时需要注意将要读取的图片保存在matlab工作路径下,以使代码指示的图片能够被读取到。 img=imread('image.jpg'); %读取图片 [height,width,channels]=size(img); %获取图片大小 row=100; %行索引值 col=200; %列索引值 channel=3; %channel是颜色通道索引,1表示红色,2表示绿色,3表示蓝色 pixel_value=img(row,col,channel); %获取像素值,channel是颜色通道索引 gray_value=rgb2gray(img(row,col,:)); %获取灰度值 [x,y]=meshgrid(1:width,1:height); %获取像素坐标 imshow(img); %显示图片 imwrite(img,'new_image.jpg'); %保存图片 本次代码读取的图片如下所示: 代码运行的结果如下所示:

前端基础之CSS扫盲

文章目录 一. CSS基本规范1. 基本语法格式2. 在HTML引入CSS3. 选择器分类 二. CSS常用属性1. 文本属性2. 文本格式3. 背景属性4. 圆角矩形和圆5. 元素的显示模式6. CSS盒子模型7. 弹性布局 光使用HTML来写一个前端页面的话其实只是写了一个大体的框架, 整体的页面并不工整美观, 而CSS可以在HTML的基础之上将页面优化的非常好看, HTML只是描述了网页的结构和有什么内容(也就是让网页有了 “骨”), 而CSS可以自由的设置网页的布局和样式(包括大小/位置/字体/颜色/背景等), 可以让网页的内容充实起来(让网页有了 “皮和肉”), CSS也叫层叠样式表, 一个元素可以运用多组样式, 有多层叠加的效果. 一. CSS基本规范 1. 基本语法格式 选择器+{一条/N条声明} 选择器决定下面的这些声明针对谁起作用(修改谁).声明决定修改哪些内容.声明的属性是键值对, 使用;来区分键值对, 使用:区分键和值. 注意: CSS代码可以放到HTML文件中, 通常是放到style标签中.style标签可以放到页面上的任意位置, 一般放到head标签内.CSS使用/* */来作为注释. 2. 在HTML引入CSS 🎯1. 内部样式 写在style标签中然后嵌入到html代码内部, 理论上来说style可以放到html的任何位置, 但是一般都是放到head标签中, 内部样式的优点是能够让样式和页面结构分离, 缺点在于分离的还不够彻底, 尤其是CSS内容多的时候, 所以建议在CSS代码比较简单的时候使用内部样式. 在本篇博客中涉及到的代码都比较简单, 所以主要就使用内部样式来介绍了. 🎯2. 内联样式 使用HTML标签中的style属性来针对指定元素设置样式, 这种写法适合于非常简单的样式, 只针对某一个标签有效. 🎯3. 外部样式 把CSS代码写到一个单独的.css文件当中, 再通过link标签将CSS文件引入到HTML代码中, 这种写法让HTML的代码和CSS彻底分离了, 实际开发中使用的也一般是这种外部样式, 缺点是可能受到浏览器缓存影响, CSS效果不一定能立刻生效. 语法格式: <link rel="stylesheet" href="CSS文件路径"> 显示效果:

微信为什么使用 SQLite 保存聊天记录?

概要 SQLite 是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上,SQLite 是一个非常可靠的数据库,它可以处理 TB 级的数据,但它没有网络层。接下来,本文将与大家共同探讨 SQLite 在过去一年中最新的 SQL 功能。 SQLite “只是”一个库,它不是传统意义上的服务器。因此,在某些场合下,它确实不合适。但是,在相当多的其他场合,它却是最合适的选择。SQLite 号称是部署和使用最广泛的数据库引擎。我认为这很有可能,因为 SQLite 没有版权的限制。无论何时,只要开发者想使用 SQL 在文件中存储结构化的数据,SQLite 应是首选方案。 SQLite 的 SQL 方言也非常强大。它比 MySQL 早四年就开始支持 with 语句。最近,它还实现了对于窗口函数的支持,这仅仅比 MySQL 晚五个月。 接下来,本文将介绍 SQLite 在 2018 年新增加的 SQL 功能,也就是 SQLite 从版本 3.22.0 到 3.26.0 所新增加的 SQL 功能。 具体内容包括: 布尔字面量和判断 窗口函数 Filter子句 Insert … on conflict (“Upsert”) 重命名列 在Modern-SQL.com上接下来 布尔变量和判断 SQLite支持“假”布尔值:它接受Boolean作为类型的名称,但它将其当作整数看待(这一点非常类似于MySQL)。真值true和false分别由数值1和0表示(这一点和C语言一样)。微信搜索公众号:信安黑客技术,回复:黑客 领取资料 。 从版本3.23.0开始,SQLite将关键字true和false分别用数字1和0表示,并支持is [not] true | false的判断语句。现在,它不再支持关键字unknown。开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。 is [not] true | false这个判断语句很有用,它与比较操作的含义不一样:

手把手教你搭建vue-cli前端页面【超详细教程】

文章目录 配置前端运行环境Node.jsnpm工具搭建一个vue-cli项目安装组件路由ElementUI框架 配置前端运行环境Node.js 简单说Node.js是运行在服务器端的JavaScript 下载地址:http://nodejs.cn/download/ npm工具 npm是Node.js中的的包管理工具,用来安装各种Node.js的扩展 搭建一个vue-cli项目 这里我们使用软件HbuilderX做一个示范 选择vue项目2.6.10 项目结构: 运行方式 启动命令:npm run serve 项目地址: 安装组件路由 1.先创建一个Vue组件Login(登陆组件),导入背景图片 <template> <div class="login_container"> <!-- 登录盒子--> <div class="login_box"> <!-- 头像盒子--> <div class="img_box"> <img src="./assets/logo.png" /> </div> </div> </div> </template> <script> </script> <style> .login_container{ position: relative; height: 100vh; margin: 0px; padding: 0px; background-image: url(assets/bg.jpg); background-size: cover; } .login_box{ position:relative ; top:200px; width: 450px; height: 350px; background-color: #fff; border-radius: 10px; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); opacity: 0.

python将字典写入csv文件错误提示:a bytes-like object is required, not ‘str‘

问题:本打算将字典写入csv文件,却一直提示:a bytes-like object is required, not 'str' 关键代码如下: myDict={'唐僧': 880, '孙悟空': 52, '妖怪': 88} csvFile=open("out.json","wb") writer=csv.writer(csvFile) writer.writerow(myDict) 解决方案: 经观察发现,问题出在这段代码,:csvFile=open("out.json","wb") csv文件的打开方式为“wb” 将其改为“w”,即csvFile=open("out.json","w") 问题解决!

C语言如何给二级指针动态内存分配、初始化和释放

一、需求 需要动态创建二维数组,但数组大小是一个变量。 二、解决方案 #include<stdio.h> #include<malloc.h> int main() { int m = 10; int n = 0; //分配内存 int** arr = (int**)malloc(sizeof(int)*m); for(int i=0; i<m; i++) { arr[i] = (int*)malloc(sizeof(int)*m); } //初始化内存 memset(*arr, 0, sizeof(int)*m*n); //内存使用 //todo arr[i][j] //释放内存 for(int i=0; i<m; i++) { free(arr[i]); } }

基于Qt的智能管家客户端设计

基于Qt的智能管家客户端设计 前段时间学习嵌入式,所做毕业项目“智能管家”获得班级优秀项目奖,该项目实现在三星板子FS4412上面搭建服务器,然后客户端连接服务器,通过客户端实现M0板子上灯光,LED,蜂鸣器,摄像头,风扇登的控制,本人所做为客户端模块,界面如下: 界面演示 1.1、主界面介绍: 客户端采用Qt编写,主界面按功能不同分为不同的模块。左边家居生活模块,左上摄像头监控,左中为环境数据展示区,左下为家电控制区。右边娱乐影音模块,左上角小球为连接网络按钮,左中为日常生活模块,左下为机器人模块。提供语音识别以及语音控制。 1.2、功能介绍: 视频监控区:能够放大及悬浮摄像头,提供多路监控的扩展区。 环境数据区:实时显示检测到的环境数据,包括温湿度,光照强度,电压值。 设备控制区:点击开关有特殊音效,同时开关上面会交替出现ON/OFF,同时打开的相应设备图标变为彩色,关闭则图标为灰色。 连接服务器:点击连接服务器按钮(右上),会弹出连接服务器界面,等待用户输入服务器地址并确认。当连接成功后,连接图标 会由红叉变为绿勾。 娱乐影音区:当点击娱乐音乐区域按钮,就会打开相应网页,为用户提供看电影,听音乐,求医问药,运动健康,看书学习等服务,最后一个按钮会弹出软件的详细信息。 机器人区域:机器人图标会动以及眨眼,其右下方的语音按钮提供用户语音输入,按住图标变化并开始采集环境声音,放开便对声音进行识别,可以语音控制家电,以及日常聊天询问。 1.3 源码:https://download.csdn.net/download/qq_38853493/20198905

关于linux系统终端不能输入简体中文的解决思路

看不见图片转链接:新浪博客 问题描述: 虚拟机安装了linux操作系统(ubuntu,redhat小红帽,....),打开终端输入某些路径,当输入路径包含中文名称时,发现在系统终端无法输入中文。 解决办法: step1: 系统->首选项->输入法 step2: 点击首选输入法,弹出右侧窗体,将四个可以勾选的地方勾上, step3:回归图形界面(桌面),发现其右下角出现了语言复选框,接下来选择中间的 汉语-Bopomofo即可!问题不大,over!

虚拟机(VMware)安装ubuntu18过程中总是被卡死或者不能输入name,password解决办法

虚拟机(VMware)安装ubuntu18过程中总是被卡死或者不能输入name,password解决办法 问题描述: 虚拟机(VMware)安装ubuntu 18.4过程中总是被卡死或者不能输入name,password 解决办法: 第一步:选中图示ubuntu,点击鼠标右键,选择 设置 选项;进入硬件选框,, 第二步:提高其中的内存量和处理器数量和核心数,(本人设置内存容量2048MB,即2G,处理器为2个,核心数为2),接下来继续安装即可。 第三步:问题解决,完美安装,畅游吧! 若未成功安装,百度搜索其他答案,或者可留言! 但我觉得最好办法是加群:本人所建立,专供探讨各种编程问题:AT&T实验室(1018826259)

基于Qt\C++实现的网络远程控制系统

基于Qt\C++实现的网络远程控制系统 本系统在Qt平台上采用C++语言实现的网络远程控制。通过将server部署到腾讯云服务器上,利用云中转的内网穿透方式实现不同内网之间的远程控制。 该系统可以在主控端电脑上显示出被控端屏幕,同时通过鼠标键盘对被控端电脑进行远程操控,使得就像是使用自己的电脑一样,还可以自行调节控制屏幕的清晰度和流畅度。也能同时双方互相发送和接收文件。 一、模型图 二、注册界面 三、登录界面 四、流畅度清晰度设置界面 五、主菜单界面 源码链接:https://download.csdn.net/download/qq_38853493/20198965

Redis过期键的删除策略

Redis过期键的删除策略 1.Redis过期键的删除策略2.Redis key的过期时间和永久有效分别怎么设置?3.我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢? 1.Redis过期键的删除策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。 Redis中同时使用了惰性过期和定期过期两种过期策略。 2.Redis key的过期时间和永久有效分别怎么设置? EXPIRE和PERSIST命令。 3.我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢? 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1.定时去清理过期的缓存;2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。 上一篇:Redis持久化 下一篇:Redis的内存淘汰策略

【vue2,3使用QRCode进行二维码的生成和下载】

vue2,3使用QRCode进行二维码的生成和下载 1 vue2使用Qrcode1.1 安装Qrcode1.2 引入Qrcode1.3 生成二维码1.4 因弹窗显示二维码出现的dom延迟问题解决方式1.5 为什么使用$nextTick: 2.vue3使用Qrcode2.1 安装Qrcode2.2 代码展示2.3 二维码下载 使用QRCode生成二维码vue2和vue3都已实现。 在使用dialog弹窗中生成二维码会出现DOM延迟问题,本文也展示了DOM延迟的解决方法,可做参考。 1 vue2使用Qrcode 1.1 安装Qrcode npm install qrcodejs2 1.2 引入Qrcode import QRCode from 'qrcodejs2'; 1.3 生成二维码 <div style="justify-content: center;align-items: center;display: flex;" ref="qrcode"></div> ...... <script> new QRCode(this.$refs.qrcode, { text: this.item.title, // 替换为你要生成二维码的内容 width: 200, height: 200, }); </script> 1.4 因弹窗显示二维码出现的dom延迟问题解决方式 <template> <div class="notice"> <van-button type="primary" @click="onItemClick">打开二维码</van-button> <van-dialog v-model:show="show" :title="item.title" @confirm="changeStatus" showCancelButton="true" cancelButtonText="下载" cancelButtonColor="#ee0a24" @cancel="downloadCode"> <div style="justify-content: center;align-items: center;display: flex;"

Vue 综合应用 -网页音乐播放器

综合应用 - 悦听player 案例 使用 Vue 框架 + axios + api ,开发一个简易的网页音乐播放器 网易云免费歌曲接口: 歌曲搜索接口 地址:https://autumnfish.cn/search 方法:GET 参数:keywords 查询关键字 响应:歌曲搜索结果 ( 包含要使用的 歌曲 id、mvid) 歌曲url获取接口 地址:https://autumnfish.cn/song/url 方法:GET 参数:id 歌曲id,可以从 api 1 中获取 响应:歌曲url地址 歌曲详情获取 地址:https://autumnfish.cn/song/detail 方法:GET 参数:ids 歌曲id,可以从 api 1 中获取 响应:歌曲详情 (包括封面信息) 热门评论获取 地址:https://autumnfish.cn/comment/hot?type=0 方法:GET 参数:id (歌曲 id , 地址中的 type 固定为 0) 可以从 api 1 中获取 响应:歌曲的热门评论 mv地址获取 地址:https://autumnfish.cn/mv/url 方法:GET 参数:id ( mvid , 为 0 表示没有mv) 可以从 api 1 中获取

Bentley ContextCapture Center Master最新版2023汉化版下载安装教程

### Bentley ContextCapture Center Master:高效三维建模与现实建模解决方案 Bentley ContextCapture Center Master(以下简称ContextCapture)是一款由Bentley Systems公司开发的高效三维建模和现实建模软件。它通过处理无序的二维照片和点云数据,快速生成高质量的三维模型和实景模型。ContextCapture广泛应用于基础设施设计、城市规划、测绘等领域,受到了众多专业用户的推崇。本文将详细介绍ContextCapture的特点、功能以及适用领域。 下载地址百度网盘:https://pan.baidu.com/s/1ZrFYzF8_qorSYsDmenavBw?pwd=1234 #### 一、ContextCapture的核心特点 1. **高精度三维建模**:ContextCapture采用先进的图像匹配算法,可以从无序的二维照片和点云数据中自动生成高质量的三维模型,重建精度可达到厘米级别。 2. **快速现实建模**:ContextCapture具有高效的处理流程,可快速生成实景模型,帮助用户在短时间内实现基础设施设计和城市规划目标。 3. **易用性**:ContextCapture具有直观的用户界面,操作简单易上手,即使是没有三维建模经验的用户也能够快速上手使用。 4. **多数据源支持**:ContextCapture支持处理多种数据源,如无人机航拍数据、激光扫描数据等,为用户提供更广泛的数据支持。 5. **与Bentley软件集成**:ContextCapture与Bentley公司的其他软件(如MicroStation、OpenRoads等)集成,实现无缝的工作流程。 #### 二、ContextCapture的主要功能 1. **三维重建**:ContextCapture可以从无序的二维照片和点云数据中自动生成高质量的三维模型,支持多种输出格式(如3MX、3SM、3D Tiles等)。 2. **实景模型生成**:ContextCapture可以生成高分辨率的实景模型,用于基础设施设计、城市规划和地理信息系统(GIS)应用。 3. **地形模型生成**:ContextCapture可以自动生成地形模型,用于地形分析、水文模拟等领域。 4. **数据管理**:ContextCapture提供了方便的数据管理功能,用户可以轻松地对测量数据进行分类、筛选和搜索。 5. **与Bentley软件集成**:ContextCapture可以与Bentley公司的其他软件(如MicroStation、OpenRoads等)集成,实现无缝的工作流程。 #### 三、ContextCapture的适用领域 ContextCapture4. 环境监测与自然资源管理 5. 交通与公路工程 6. 水利与水资源工程 总之,Bentley ContextCapture Center Master凭借其高精度、高效率和易用性,在众多行业领域中得到了广泛的应用。无论您是专业的测绘人员还是非专业人士,都可以通过ContextCapture提高三维建模和现实建模工作的效率和精度,为您的项目带来更多的价值。

虚拟机安装完成后配置虚拟网络成功但是xshell等工具无法连接解决办法(已解决))

出现问题: 我使用的是finashell,这里和使用的工具没关系。 连接的时候就会出现这种情况,但是我在虚拟机里面可以ping www.baidu.com可以ping通。 这是什么问题呢?我们老师说物理网卡可能出现问题,如果这个解决不了,可能是物理网卡的原因 我们进入windows的网络网络连接里面 注意:我这里是解决问题后补充的图片,为了告诉你去哪看。 正常情况下你进这里是没有Vmnet8和Vmnet1的。上面我这个图片是有的,只是名称不是这个,可以点击以太网6,如下图。 所以我这个其实是有的。 问题解决:(注册表未清理干净,换一个工具深度清理) 删除虚拟机,cclear注册表不能完全删除,因为如果你以前清理过一次后,cclear就会默认不去清理某些部分了,所以这个时候你只需要换一个注册表清理工具就可以了。我使用的是下面这个工具 安装完成后,深度清理,然后重新安装vware即可。以上步骤就可以解决了。

AI自动生成视频Runway Gen-2免费试用指南

最近《瞬息全宇宙》幕后技术公司 Runway 公开了旗下具有 AI 功能的视频编辑工具 Gen-2,用户可以直接使用文本提示生成逼真的视频内容。 小编最近也试用了一下生成效果非常炸裂: 文字生成视频 提示词生成视频:无人机拍摄的山脉画面。 修改视频 用提示词修改视频:一隻白色皮毛上有黑色斑點的狗。 视频风格迁移 目前免费用户可以使用Gen-2生成5个5秒时长的视频。 使用指南 Gen-2 - Best AI App

网络安全实验五 密钥与加解密(一)

一、实验目的 本实验的学习目的是让学生熟悉密钥加密的概念,熟悉和了解加密算法(cipher)、加密模式(encryption mode)、 填充(padding)、以及初始向量(IV)的定义与作用。此外,学生还可以通过使用工具和编写程序加密/解密信息。 二、实验环境 实验环境拓扑: 实验机:ubuntu12.04 用户seed 密码dees 数据库用户root 密码seedubuntu 三、实验内容与实验要求 实验步骤一 学习使用不同的加密算法与加密模式进行加密。 你可以使用 openssl enc 命令来加密/解密一个文件。输入 man openssl 和 man enc 命令可以查看使用手册。 首先我们创建一个明文文件,内容为:seedlabtest(可以随意填写内容) $echo seedlabtest > plain.txt 使用openssl对明文进行加密,命令如下(请将下面命令中的 ciphertype 替换成指定的加密类型,比如-aes-128-cbc, -aes-128-cfb, -bf-cbc 等): $ openssl enc ciphertype -e -in plain.txt -out cipher.bin -K 00112233445566778899aabbccddeeff -iv 0102030405060708 任务:在本实验中你至少需要尝试使用三种不同的密码(cypher)与加密模式(encryption mode)对明文进行加密,并对密文进行解密。可以通过输入man enc命令了解到各选项的含义以及 openssl 所支持的所有加密类型。 注:密码(cipher):指 bf, cast, des, aes, rs2等 加密模式(encryption mode):指 cbc, ecb, cfb, ofb 等 上述命令参数选项释义: 实验步骤二 加密模式——ECB与CBC的区别

git下载总是报错:身份认证失败的解决办法

在利用git命令下载代码时,提示输入用户名和密码,但是总是显示身份认证失败,在修改密码后仍然没有解决。于是,换了一种方式,采用SSH。 首先在本地生成ssh-key 在虚拟机中执行命令 ssh-keygen -t rsa -C "github的注册邮箱" 一直回车,直至结束。在home/.ssh/文件夹下,找到id_rsa.pub文件,借助命令gedit该文件,复制其中的内容。(文件夹位置可能因为系统不同而不同,我这里是ubuntu) 将ssk-key同步到github上 github账户-Settings-SSH and GPG keys 新建一个SSH key,将复制好的内容粘贴到key一栏中,其余位置可以空白,添加即可。 使用 在下载时,要选择ssh的连接方式 git clone "ssh连接" 这里的ssh连接如何获取:找到你要下载的东西,code-SSH,

安装Altium Designer 2022版本步骤含阿里网盘安装包(不限速)

【Altium designer】学习笔记第一篇——安装Altium Designer2022步骤及阿里网盘安装包(不限速) 一、安装包链接 https://www.aliyundrive.com/s/e85bUWKU45N 提取码: jd63 (注:若该链接失效,可私聊我更新链接。) 二、软件介绍 Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件使电路设计的质量和效率大大提高。 三、安装步骤 1、右击下载的压缩包,解压。 2、打开解压后的文件夹“Altium.Designer.22” 3、右击“installer”,选择以管理员身份运行。 4、点击next 5、选择 “Chinese”,勾选 “I Accept” ,点击 “Next” 6、点击 “Next” 7、自定义安装位置,安装路径不要有中文,点击 “Next” 8、点击 “Next” 9、点击next 10、安装ing 11、安装结束后,取消Run…,点击Finish 12、回到安装包,打开 “!!AD 21 Unis License” 文件夹 13、右击复制 “shfolder.dll” 14.打开 “开始” 菜单栏找到程序 “Altium Designer” 打开文件位置,拖动到桌面创建快捷方式 15、在电脑中找到位置“C:\Program Files\Altium\AD22”,把复制的 “shfolder.dll” 粘贴到该文件夹下。 16、双击,运行软件。 17、点击【允许访问】 18、右上角点击 “Not Signed In”,选择 “Licenses…” 19、点击 “Add standalone license file” 20、在弹出的对话框中,打开解压后的Alitium.Designer.22安装包文件夹,打开 “!!AD 21 Unis License” 文件夹 打开[Licenses]文件夹,选中如图文件,点击[打开]

开关电源——DCDC变换器设计

开关电源——DCDC变换器设计 对于DCDC变换器来说,最重要的部分也是唯一一个磁学元件——电感需要考虑。 直流传递函数 正如之前我们所说,电感电流在开关导通的时候增加的电流必须等于在开关关断时候的减少的电流,即在一个工作周期中不积累能量,这称为 伏秒法则 。 V O N × t O N = V O F F × t O F F V_{ON} \times t_{ON} = V_{OFF} \times t_{OFF} VON​×tON​=VOFF​×tOFF​ 则占空比表示为: D = V O F F V O F F + V O N D = \frac{V_{OFF}}{V_{OFF} + V_{ON}} D=VOFF​+VON​VOFF​​ 上式对于任意拓扑都适用,但是三种拓扑的传递函数不同本质是是因为他们的 V O N V_{ON} VON​ 和 V O F F V_{OFF} VOFF​ 的表达式不同。 下标给出了三种拓扑的推导函数: 拓扑 V O N V_{ON} VON​ V O F F V_{OFF} VOFF​DC传递函数Buck V I N − V O V_{IN} - V_{O} VIN​−VO​ V O V_O VO​ D = V O V I N D = \frac{V_{O}}{V_{IN}} D=VIN​VO​​Boost V I N V_{IN} VIN​ V O − V I N V_O - V_{IN} VO​−VIN​ D = V O − V I N V O D = \frac{V_O - V_{IN}}{V_O} D=VO​VO​−VIN​​Buck-Boost V I N V_{IN} VIN​ V O V_O VO​ D = V O V I N + V O D = \frac{V_{O}}{V_{IN} + V_{O}} D=VIN​+VO​VO​​ 电感电流波形的直流分量和交流纹波 电感电流中存在两种分量:

在线广告系统工程架构

一、广告系统概览 广告投放系统:供广告主使用,核心功能包括会员续费、广告库管理、设定推广条件、设置广告出价、查看投放效果等。广告运营后台:供平台的产品运营使用,核心功能包括广告位管理、广告策略管理、以及各种运营工具。广告检索平台:承接C端的高并发请求,负责从海量广告库中筛选出几个或者几十个广告,实时性要求高,这个平台通常由多个微服务组成。AB实验平台:广告业务的稳定器,任何广告策略上的调整均可以通过此平台进行灰度实验,观察收入指标的变化。广告计费平台:面向C端,负责实时扣费,和收入直接挂钩,可用性要求高。账务管理中心:广告业务中的财务系统,统管金额相关的业务,包括充值、冻结、扣费等。大数据平台:整个广告系统的底盘,需要聚合各种异构数据源,完成离线和实时数据分析和统计,产出业务报表,生产模型特征等。 二、广告投放系统 广告平台提供对上游广告主和下游媒体(包括网站、APP等流量提供方)的整体服务能力。 供广告主使用,核心功能包括会员续费、广告库管理、设定推广条件、设置广告出价、查看投放效果等。 三、广告检索平台 广告检索平台负责承接C端的流量请求,从海量广告库中筛选出最合适的前N个广告,并在几十毫秒内返回结果,它是一个多级筛选和排序的过程。 Recall层侧重算法模型,Search层侧重业务。从下到上,计算复杂度逐层增加,候选集逐层减少。 3.1 广告检索设计重点 性能设计是检索平台的重点,通常有以下手段: 做好服务分层,各层均可水平扩展。采用Redis缓存,避免高并发请求直接打到数据库,缓存可按业务规划多套,进行分流。采用多线程并行化某些子流程,比如多路召回逻辑、多模型打分逻辑。热点数据进行本地缓存,比如广告位的配置信息以及策略配置信息,在服务启动时就可以预加载到本地,然后定时进行同步。非核心流程设置超时熔断走降级逻辑,比如溢价策略(不溢价只是少赚了,不影响广告召回)。和主流程无关的逻辑异步执行,比如扣费信息缓存、召回结果缓存等。精简RPC返回结果或者Redis缓存对象的结构,去掉不必要的字段,减少IO数据包大小。GC优化,包括JVM堆内存的设置、垃圾收集器的选择、GC频次优化和GC耗时优化。 四、广告计费平台 计费平台是核心系统,主要完成实时扣费功能。比如 CPC 结算方式下,广告主设置的预算是 50 元,每次点击扣 1 元,当扣费金额达到预算时,需要将广告及时下线。 除此之外,计费平台还需要支持 CPM、CPT 等多种结算方式,以及支持反作弊、余额撞线处理、扣费订单的摊销和对账等功能。 计费平台的特点是: 并发高、数据量大、同时可用性要求高,需要做到不少扣,不重复扣。 下面以 CPC 实时点击扣费为例,详细说下技术方案。 首先,整个扣费流程做了异步化处理,当收到实时扣费请求后,系统先将扣费时用到的信息缓存到 Redis,然后发送 MQ 消息,这两步完成后扣费动作就算结束了。 这样做的好处是:能确保扣费接口的性能,同时利用 MQ 的可靠性投递和重试机制确保整个扣费流程的最终一致性。 为了提高可用性,针对 Redis 和 MQ 不可用的情况均采用了降级方案。Redis 不可用时,切换到 TiKV 进行持久化;MQ 投递失败时,改成线程池异步处理。 每次有效点击都需要生成 1 条扣费订单,面临大数据量的存储问题。目前我们采用的是 MySQL 分库分表,后期会考虑使用 HBase 等分布式存储。另外,订单和账务系统之间的数据一致性,采用大数据平台做天级别的增量抽取,通过 Hive 任务完成对账和监控。 五、广告技术挑战 对广告业务有了初步了解后,再来看下广告系统面临的技术挑战: 1、高并发 :广告引擎和 C 端流量对接,请求量大(平峰往往有上万 QPS),要求实时响应,必须在几十毫秒内返回结果。 2、业务逻辑复杂 :一次广告请求,涉及到多路召回、算法模型打分、竞价排序等复杂的业务流程,策略多,执行链路长。 3、稳定性要求高 :广告系统直接跟收入挂钩,广告引擎以及计费平台等核心系统的稳定性要求很高,可用性至少要做到 3 个 9。 4、大数据存储和计算 :随业务发展,推广数量以及扣费订单数量很容易达到千万甚至上亿规模,另外收入报表的聚合维度多,单报表可能达到百亿级别的记录数。

python实现简单计算器

# *_* coding:utf8 *_* import tkinter from functools import partial # 按钮输入调用 def get_input(entry, argu): # 从entry窗口展示中获取输入的内容 input_data = entry.get() # 合法运算符 : + - * / -- ** // +- # ------------ 输入合法性判断的优化 ------------ # 最后一个字符不是纯数字(已经有算数符号),原窗口值不为空,且输入值为运算符 # if not input_data[-1:].isdecimal() and (not argu.isdecimal()): # if input_data[-2:] in ["--", "**", "//", "+-"]: # return # if (input_data[-1:] + argu) not in ["--", "**", "//", "+-"]: # return # ------------------------------------------------ # 出现连续+,则第二个+为无效输入,不做任何处理 if (input_data[-1:] == '+') and (argu == '+'): return # 出现连续+--,则第三个-为无效输入,不做任何处理 if (input_data[-2:] == '+-') and (argu == '-'): return # 窗口已经有--后面字符不能为+或- if (input_data[-2:] == '--') and (argu in ['-', '+']): return # 窗口已经有 ** 后面字符不能为 * 或 / if (input_data[-2:] == '**') and (argu in ['*', '/']): return # 输入合法将字符插入到entry窗口结尾 entry.

Uncaught SyntaxError: Unexpected token ‘.‘有可能不是代码问题?

Uncaught SyntaxError: Unexpected token ‘.‘ 今天在调试代码的时候,遇到了上述报错,因为是本地代码导入了内网环境,但本地没有任何问题。 最初考虑的是内外网的环境差异和代码一致性,做了很多验证,都没有解决, 后来经一位大佬提醒可能是浏览器版本的问题,因为最新的V3和Ts可能需要更高的浏览器版本,内网的浏览器为79,本地为110+,再替换版本以后,果然正常运行了。 有同样问题的同学可以换个角度测试一下哦~

书店管理系统

设计一个书店管理系统,能完成书店的日常管理工作。 要求完成的基本功能: 1、进货入库记录。 2、销售出货记录。 3、图书信息查询:可通过书名、作者等途径查询某本图书的详细信息(含书名、作者、出版社、页数、最新入库时间、库存量、价格等)。 4、自动预警提示(当某图书的库存量为1时自动预警提示) 模块化 根据类的继承与多态,我们可以创建以书Book为基类,BookStore为派生类,分为头文件.h和函数文件.c再加上主函数main.c即可 类的分别实现 类的实现是在分别的.h文件当中,并且.h文件当中应当包含类所含成员函数和属性等等。 Book.h #pragma once #include <iostream> #include <fstream> #include <cstring> #include <ctime> #include <cstdlib> using namespace std; class Book { private: string title, author, publisher, time; int pages, quantity; float price; public: Book(); void setTitle(string title); void setAuthor(string author); void setPublisher(string publisher); void setTime(string time); void setPages(int pages); void setQuantity(int quantity); void setPrice(float price); string getTitle(); string getAuthor(); string getPublisher(); string getTime(); int getPages(); int getQuantity(); float getPrice(); }; BookStore.

Python Selenium CSS 定位方法详解

目录 CSS 介绍 CSS定位常见符号 通过id, class, 标签 三个常规属性定位元素 1、通过id选择器查找 2、通过class选择器查找 3、通过标签定位元素 单属性选择器定位 组合属性定位: 层级选择器: CSS 介绍 CSS(Cascading Style Sheets)层叠样式表是一种用来表现HTML或XM等文件样式的计算机语言 CSS 使用选择器来为页面元素绑定属性, 这些选择器可以被 selenium 用作另外的定位策略 CSS 可以比较灵活选择控件的任意属性, 一般情况下定位速度要比 XPath 快,定位更稳定 源码如下: def find_element_by_css_selector(self, css_selector): """ Finds an element by css selector. :Args: - css_selector - CSS selector string, ex: 'a.nav#home' :Returns: - WebElement - the element if it was found :Raises: - NoSuchElementException - if the element wasn't found :Usage: element = driver.