项目前端中水印开发,支持自定义内容、字号、字体、倾斜度、透明度、左右间距、上下间距

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、展示效果二、使用步骤1.新建waterMark.js文件2.首页引入展示 总结 前言 产品经理的需求:pc端和移动端水印展示,支持自定义内容、字号、字体、倾斜度、透明度、左右间距、上下间距 一、展示效果 二、使用步骤 1.新建waterMark.js文件 代码如下(示例): 'use strict'; const watermark = {}; let timeId = null /** * 水印 * @param {*} params 水印配置 * @returns */ const setWatermark = (params) => { const { rotate = '-10', opacity = '0.6', x_space = 150, y_space = 150, fontSize = 16, fontFamily = 'Microsoft YaHei', text, id = 'watermark_0001' } = { rotate: params.rotate, // 水印角度 opacity: 1 - params.

sortablejs也支持不是表格的拖拽

文章目录 概要展示效果代码展示小结 概要 之前使用sortablejs都是拖拽表格,这次有个需求是直接拖拽div,发现原来也可以,就记录一下下 展示效果 代码展示 提示:sortablejs使用的版本是 "sortablejs": "^1.15.0", <template> <div class="darg_label"> <span class="darg-item" :title="item.name" v-for="item in list" :key="item.id">{{ item.name }}</span> </div> </template> <script> import Sortable from 'sortablejs'; export default { data() { return { list: [{ id: 1, name: '1' }, { id: 2, name: '2' }] } }, activated() { this.sortTab() }, methods: { sortTab() { // 获取需要拖拽节点的父节点 const box = document.querySelector('.darg_label'); console.log('box', box) // 创建拖拽实例 Sortable.create(box, { animation: 150, // 动画 handle: '.

基于QT的餐厅服务与管理系统

全套资料下载地址:https://download.csdn.net/download/sheziqiong/85584570?spm=1001.2014.3001.5503 全套资料下载地址:https://download.csdn.net/download/sheziqiong/85584570?spm=1001.2014.3001.5503 目 录 1系统功能设计 4 1.1总体功能描述 4 1.1.1开发背景 4 1.1.2顾客操作的相关功能 4 1.1.3服务人员操作的相关功能 4 1.1.4运营者操作的相关功能 4 1.2功能流程描述 5 1.2.1顾客 5 1.2.2管理员 6 1.2.3服务员、厨师 7 1.2.4经理 8 2系统结构设计 8 2.1模块说明概要 8 2.1.1数据库的构造 8 2.1.2界面层 9 2.1.3逻辑层 9 2.1.4数据库与逻辑层的交互 10 2.1.5逻辑层与界面层的交互 10 2.2UML 类图 10 3系统详细设计 13 3.1类结构设计 13 3.1.1Object 类 13 3.1.2Record 类 14 3.1.3Table 类 14 3.1.4Remark 类 14 3.1.5Data 类 14 3.2数据层 14 3.2.1表格的创建 14 3.2.2数据初始化 15 3.3.3 数据的储存 15

纯前端实现图片验证码

前言 之前业务系统中验证码一直是由后端返回base64与一个验证码的字符串来实现的,想了下,前端其实可以直接canvas实现,减轻服务器压力。 实现 子组件,允许自定义图片尺寸(默认尺寸为100 * 40)与验证码刷新时间(默认时间为60秒)。同时暴露绘制验证码方法drawPic(),允许父组件直接调用(需要利用ref实现),点击验证码也可手动刷新。 //VerifyCodeImg.vue <!--验证码生成--> <template> <canvas id="canvasDom" :width="props.canvasWidth" :height="props.canvasHeight" @click="drawPic"></canvas> </template> <script setup> import { onMounted, onBeforeUnmount, computed } from 'vue'; let props = defineProps({ canvasWidth: { // 容器宽度 type: Number, default: 100 }, canvasHeight: { // 容器高度 type: Number, default: 40 }, refreshTime: {//验证码刷新间隔时间 type: Number, default: 60 } }), emits = defineEmits(['getVerifyCodeStr']), verifyCodeTimeId = null,//定时器id randomStr = '0123456789abcdefghijklmnopqrstuvwxyz',// 所有随机字符串 trueRefreshTime = computed(() => { return props.

(附源码)基于Spring Boot的ERP仓储管理信息系统设计与实现 计算机毕设150958

基于Spring Boot的ERP仓储管理信息系统设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设ERP仓储管理信息系统。 本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。ERP仓储管理信息系统使用java语言springboot框架开发,完成了系统的主要模块的页面设计和功能实现。本文展示了首页、用户管理(管理员)、更多管理(工作人员、部门、职位、通知公告、仓库、入库、出库、供应商)等功能实现过程。 关键词:仓储管理;Java语言;ERP;数据存储 Design and implementation of ERP warehouse management information system based on spring boot Abstract The rapid development of scientific and technological progress has caused great changes in people's daily life. The rapid development of electronic information technology has popularized and applied the application level of electronic information technology in various fields. The advent of the information age has become an irresistible fashion trend, and the history of human development is entering a new era.

使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令

背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情。 解决方案 定制化一键 ESLint,执行文件下载地址: https://github.com/mazeyqian/go-gin-gee/releases/tag/v1.4.0 基础使用 以下案例以 macOS 为例,其他系统自行替换对应的文件。 案例 1:指定文件 file1.js 和 file2.js,使用默认的配置。 #!/bin/bash ./eslint-files-mac-darwin-amd64 -files="file1.js,file2.js" 案例 2:指定文件夹 src/views 和 src/components。 #!/bin/bash ./eslint-files-mac-darwin-amd64 -folders="/root/app/src/views,/root/app/src/components" 配合根目录 root 使用指定文件夹: #!/bin/bash ./eslint-files-mac-darwin-amd64 \ -folders="src/views,src/components" \ -root="/root/app/" 案例 3:指定 ESLint 配置文件 custom.eslintrc.js 和命令 --fix。 #!/bin/bash ./eslint-files-mac-darwin-amd64 \ -folders="/root/app/src/views" \ -esConf="custom.eslintrc.js" \ -esCom="--fix" 复杂场景 指定 ESLint 配置文件 custom.eslintrc.js;指定附带命令 --fix;指定文件和文件夹;指定文件后缀;添加前置和后置执行命令。 #!/bin/bash ./eslint-files-mac-darwin-amd64 \ -files="file1.js,file2.js" \ -folders="src/views,src/components" \ -root="/root/app/" \ -esConf="custom.eslintrc.js" \ -esCom="--fix" \ -ext="

yolox转rknn

使用瑞芯微版本的yolox:https://github.com/airockchip/YOLOXpip install torch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1 --no-cache -i https://pypi.tuna.tsinghua.edu.cn/simplepip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache参考这里准备数据、修改代码python setup.py develop训练:python -m yolox.tools.train -f exps/example/yolox_voc/yolox_voc_tiny.py -d 1 -b 2 --fp16 -c yolox_tiny.pth批量测试:python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_tiny.py -c YOLOX_outputs/yolox_voc_tiny/best_ckpt.pth --path ~/lwd/data --conf 0.25 --nms 0.45 --save_result --device gpu转化成pt格式:python tools/export_torchscript.py -f exps/example/yolox_voc/yolox_voc_tiny.py -c YOLOX_outputs/yolox_voc_tiny/best_ckpt.pth --rknpu rk3588pt转rknn代码:https://github.com/airockchip/rknn_model_zoocd rknn_model_zoo/models/CV/object_detection/yolo/RKNN_model_convert按自己的模型参数修改yolox.ymlsh convert_yolox.sh生成的模型在model_cvt里

Python unittest单元测试框架 —— 批量执行用例与HTML测试报告

批量执行用例 defaultTestLoader或者TestLoader()用于匹配执行目录下的用例 unittest.defaultTestLoader.discover( start_dir, pattern='test*.py', top_level_dir=None) start_dir :要测试的模块名或测试用例目录。 pattern='test*.py' :表示用例文件名的匹配原则。星号“*”表示任意多个字符。 top_level_dir=None :测试模块的顶层目录。None <=> 测试用例不是放在多级目录中中)。 示例: #构建测试用例集 discover=unittest.defaultTestLoader.discover('../testDirectory, pattern='*_test.py') #执行测试 runner = unittest.TextTestRunner() runner.run(discover) Html测试报告 下载HTMLTestRunner测试报告生成文件 HTMLTestRunner.py下载地址 采用HTMLTestRunner实现产生Html测试报告,python3.X需要改写 第94行,将import StringIO修改成import io 第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer= io.StringIO() 第642行,将if not rmap.has_key(cls):修改成if not cls in rmap: 第766行,将uo = o.decode('latin-1')修改成uo = e 第772行,将ue = e.decode('latin-1')修改成ue = e 第631行,将print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)) 使用方法 fp=open(filename, 'wb') # 写方式打开报告文件 runner = HTMLTestRunner.

VSCode配置Fortran并运行国际参考电离层2020模型(IRI2020)

VSCode配置Fortran并运行国际参考电离层2020模型(IRI2020) 由于VSCode具有轻量、强大的代码编辑功能和丰富的插件生态系统,受到广大编程人员的青睐,在科学研究中也应用广泛。在电离层研究中,IRI模型可以计算出给定的地点、时间的电离层高度范围内电子密度、电子温度、离子温度和离子成分的月平均值。本文主要介绍了配置Fortran和运行IRI2020模型时出现的问题及解决方案。 一、VSCode配置Fortran 安装配置等步骤详见以下博客: 1、https://blog.csdn.net/wokaowokaowokao12345/article/details/127076563 2、https://zhuanlan.zhihu.com/p/524480747 3、https://blog.csdn.net/qq_24197463/article/details/89634794 下面是我配置IRI时的task.json,仅作参考。 { "version": "2.0.0", "command": "gfortran", "args": [ "-g", "${fileDirname}\\*.f*", "-o", "${workspaceRoot}\\${fileBasenameNoExtension}.exe" ], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "new", "showReuseMessage": true, "clear": false } } 二、运行国际参考电离层2020模型(IRI2020) 1、下载IRI2020源码,地址为:http://irimodel.org/ 直接运行iritest.for会出现以下错误: undefined reference to ‘read_ig_rz_’ undefined reference to ‘readapf10.7_’ undefined reference to ‘read_web_’ 错误的原因是因为它找不到这三个函数,这里需要我们添加上。 要添加函数需要的源文件,在这里我全加在了iritest.for中 2、下面是IRI模型程序中的输入项,可以根据自己的需求选择。 c user input of IRI input parameters cccccccccccccccccccccccccccccccccccccc c defaults for jf(1:50) c jf(1)=.false. ! f=no electron densities (t) c jf(2)=.

【12】应用开发——Fragment的使用

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、Fragment的使用1.1 Fragment的基础使用1.2 动态添加Fragment1.3 实现Fragment返回栈1.4 Fragment和Activity之间的交互 二、Fragment的使用2.1 Fragment的生命周期2.2 Android中常见的限定符2.3 使用限定符动态加载布局2.4 使用最小宽度限定符加载布局 一、Fragment的使用 Fragment是一种可以嵌入在Activity中的UI片段,在平板上应用非常广泛。我们可以在一个Activity中引入多个Fragment来显示更多的内容,因此Fragment可以很好的在大屏幕Android设备中发挥作用。 1.1 Fragment的基础使用 我们创建一个FragmentTest项目,并新建一个左侧Fragment布局文件left_fragment.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Button" /> </LinearLayout> 然后新建右侧Fragment布局文件right_fragment.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:text="This is right fragment!" android:textSize="24sp" /> </LinearLayout> 在使用Fragment时,除了创建Fragment布局文件。我们还需要创建相应的类文件来表示该Fragment。这是因为Fragment本身是一个独立的组件,它可以在Activity中运行,并且有自己的生命周期和UI。: //注意是androidx中的fragment import androidx.fragment.app.Fragment · · · class LeftFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?

php+mysql基于微信的问卷调查小程序的设计与实现(附源码 论文 配置 讲解)

基于微信的问卷调查小程序的设计与实现 一、引言二、系统设计三、系统实现四、系统测试与优化五、界面展示六、源码获取 摘要: 本文主要探讨了一种基于微信的问卷调查小程序的设计与实现。该小程序实现了用户通过微信查看正在进行的问卷并参加,并可以查看自己参加的问卷调查。同时,管理人员可通过服务器后台对问卷调查进行添加、删除,并可以添加、修改、删除问卷的相关问题。该小程序的使用有效提高了问卷调查的效率和便利性,同时也提高了用户参与问卷调查的体验。 一、引言 随着移动互联网的普及和微信的广泛应用,人们的生活方式和工作方式都发生了巨大的变化。尤其是在问卷调查领域,传统的纸质问卷和人工统计方式已经无法满足现代市场调研的需求。因此,开发一种基于微信的问卷调查小程序,可以方便用户参与问卷调查,提高问卷调查的效率和便利性,同时也方便管理人员对问卷调查的管理。 二、系统设计 架构设计 本系统采用前后端分离的架构,前端使用微信小程序实现,后端通过服务器后台进行数据管理和业务处理。前端负责用户交互,后端负责数据持久化和业务处理。这种架构可以保证系统的可维护性和可扩展性。 功能设计 本系统主要分为用户和管理员两个角色。用户可以通过微信小程序查看正在进行的问卷并参加,并可以查看自己参加的问卷调查。管理员可通过服务器后台对问卷调查进行添加、删除,并可以添加、修改、删除问卷的相关问题。同时,系统还支持自定义问题的添加和删除,以满足不同调研需求。 数据设计 本系统采用关系型数据库进行数据存储。数据库表包括问卷调查表、问题表、用户参与表等。每个表都包含了相应的字段,以存储问卷调查信息、问题信息和用户参与信息。 安全设计 本系统采用前后端分离的架构,前端使用微信小程序实现,后端通过服务器后台进行数据管理和业务处理。前端负责用户交互,后端负责数据持久化和业务处理。这种架构可以保证系统的可维护性和可扩展性。同时,系统还采用了HTTPS协议进行数据传输加密,保证数据传输的安全性。另外,系统还采用了权限控制机制,只有具有相应权限的用户才能进行相应的操作。 性能设计 本系统采用了多种手段来提高系统的性能。首先,前端使用微信小程序实现,小程序的性能相对较好,可以保证系统的响应速度和稳定性。其次,后端使用服务器后台进行数据管理和业务处理,可以减轻客户端的负担,提高系统的整体性能。另外,系统还采用了缓存机制和负载均衡技术,以提高系统的并发处理能力和稳定性。 三、系统实现 前端实现 本系统前端使用微信小程序框架实现。开发过程中使用了WXML、WXSS和JavaScript等技术进行界面设计和逻辑处理。同时,使用了微信小程序云开发平台提供的云函数和云存储等服务来进行数据存储和数据处理。 后端实现 本系统后端使用服务器后台进行数据管理和业务处理。开发过程中使用了PHP语言和ThinkPHP框架进行开发。同时,使用了MySQL数据库进行数据存储和处理。后端主要负责数据的持久化和业务处理,包括问卷调查的添加、删除,问题的添加、修改、删除等操作以及用户参与记录的存储和处理等。 接口实现 本系统前后端之间通过HTTP接口进行数据传输和交互。开发过程中使用了RESTful API风格进行接口设计。同时,使用了JSON格式进行数据传输和交换。接口的实现包括问卷调查的查看、参加等操作以及问题的查看、添加、修改、删除等操作和用户参与记录的查看等操作。 安全实现 本系统采用了多种手段来保证系统的安全性。首先,前后端之间采用HTTPS协议进行数据传输加密,保证数据传输的安全性。其次,系统中采用了权限控制机制,只有具有相应权限的用户才能进行相应的操作。另外,系统中还采用了验证码验证和时间戳等技术来防止恶意攻击和数据篡改等安全问题。 四、系统测试与优化 在系统实现后,我们对系统进行了全面的测试,包括功能测试、性能测试、安全测试等。根据测试结果,我们对系统进行了优化调整,包括界面优化、数据处理优化、安全防护升级等。经过优化调整后,系统性能得到了进一步的提升同时提高了系统的安全性和稳定性也提高了用户参与问卷调查的体验。 五、界面展示 六、源码获取 欢迎大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻获取联系方式👇🏻👇🏻a2937

GoLang忽略文件夹

一、忽略 在使用GoLang开发的过程中,我们可能在搜索查找时,需要屏蔽一些日志文件或者编译文件,基于这样的需求,我们可以在GoLang编辑器中右键选择对应的文件夹-》Mark Directory as-》Ecluded。 这样就可以忽略掉对应的文件夹。 二、取消忽略 如果需要取消忽略,我们先在Project视图上右键-》Show Ecluded files。 然后,再在显示的文件夹中右键选择需要显示的对应的文件夹-》Mark Directory As-》Cancel Exclusion 最后,再右键Project视图上右键,取消“Show Ecluded files”上的“√”。

Matlab反复弹出登陆界面

原因:可能是用过梯子、并且之前在Matlab登陆界面已经选择了Location(比如国内)。 解决办法:清除浏览器的cookie,重新刷新登陆界面。

抖音直播新一代BVC编码器正式亮相

面临挑战 在直播行业发展如火如荼的今天,用户对视频体验的要求也水涨船高。视频基础体验的关键要素包括清晰度、流畅度、低延迟等,而这些要素的“第一性原理”,就是视频本身的编码效率,也就是压缩率。视频编码是整个技术体系的基座,编码效率的显著提升,能够在同等码率下极大提高画质,从而改善用户体验。 视频编码效率的重要性不言而喻,但进一步地提升也并非易事,尤其在直播场景中,对编码速度、延迟、码率控制等方面都有很高的要求。如何在保证画质不变的情况下,显著提高压缩率,同时满足实时性、低延迟的要求,是一个持续的技术挑战。 如何完成挑战 新一代编码器的采用 抖音基于BVC编码器,曾在世界杯中给数亿观众带来了极致的视频体验。而本次亚运会中,火山引擎多媒体实验室自研的新一代BVC编码器首次得到抖音直播全链路支持并在直播中使用。BVC编码器曾经在业界编码器大赛MSU中斩获多项指标的第一,具有行业领先的编码和计算性能,并还在持续不断地优化迭代中。新一代BVC编码器相比上一代,能在画质不变的情况下,显著降低码率,提升用户体验,降低带宽成本。 新一代BVC编码器在直播场景的优化 作为新一代编码器,引入了大量新的编码工具和算法,在显著降低码率的同时,也具有相当高的计算复杂度。而在直播场景中使用最新BVC编码,首先需要对计算复杂度进行大幅度的优化,才能达到实时性和低延迟的要求。 更极致、简洁的工程架构 首先,新一代BVC编码器在直播场景下,对所有编码工具和算法进行了测试,按照性价比筛选出了在直播的编码速度要求下能够投入使用的工具和算法集合。而基于这个集合重新设计轻量级的架构,能最大化减少计算流程损耗。新的编码器架构对整个编码流程进行了重新梳理,去除原先复杂的情况耦合,为特殊工具单独设计流程,实现了编码流程的最简化。同时,对数据结构也进行了更极致的优化,显著减少了数据量,提升了访存效率。此外,还通过大量的计算结果缓存及复用的机制,减少了重复计算,以及设计了高效的数据交换机制,减少了数据拷贝。在计算模块的优化上,挖掘了更多的计算流程整理为SIMD实现,同时对原有的SIMD实现进行了进一步优化,从而减少指令数。基于直播场景的编码器架构优化,在算法基本不变的前提下,为新一代BVC编码器节省了超过30%的复杂度。 灵活、精细化的并行框架 为了在计算复杂度提高的情况下,仍然能实现实时编码,充分利用多核处理器的能力至关重要。新一代BVC编码器针对直播场景进行并行框架的重新设计。首先将前处理、预分析、编码等过程并行起来,并在任务调度上分配合适的优先级,从而最大降低编码前的等待。对于编码过程的线程等待,精确计算等待的条件,并将条件限制降低到最小,从而降低等待时延。此外,基于帧内和帧间并行编码的模型,根据编码时依赖关系准确分配每个编码任务的线程优先级权重,对线程进行灵活而精细化地调度。经过优化,新一代BVC编码器的CPU利用率提升50%以上。 上百个快速算法 除了工程架构之外,新一代BVC编码器还增加了大量的快速算法,从而达到高分辨率、高码率和高帧率下的实时编码。新一代BVC编码器重构了编码块划分的框架,根据周围块和历史划分信息,自适应决策划分深度的范围,大幅减少了无效的划分尝试,从而降低编码复杂度。在模式决策中,为每个模块设计大量精细的初选快速算法,从而大幅减少最终尝试的模式数量。此外,还对前处理和预分析模块也进行了大量的简化处理。新一代BVC编码器为直播场景增加的上百个快速算法,在压缩率的损失较小前提下将整体编码速度提高了2倍以上。 亚运会的针对性优化 除了编码器内核本身的优化之外,新一代BVC编码器还对亚运会进行了专项优化。亚运会除了传统的运动项目之外,还增加了关注度较高的电竞项目。而新一代BVC编码器也对运动、游戏这两种场景进行针对性的优化。研发团队进行了大量的测试,对不同视频分辨率和复杂度下进行了编码档位的适配,调整了数十个编码参数来控制不同编码算法在运动、游戏场景中的性价比,在获得压缩率提高的同时实现了编码加速。此外,还对码率控制进行了调优,减少了高运动复杂场景中画面模糊的情况。 优化成果 新一代BVC编码器在直播场景中实现了1080P 50FPS的实时编码,在画质不变的情况下,相比上一代编码器实现了20%左右的码率节省。实际效果如下:(对比展示,上面是上一代BVC编码视频,下面是新一代BVC编码视频) 和广泛应用的开源编码器x265(v3.5)对比,新一代BVC编码器也具有显著优势,下图展现了性能对比数据。可以看出,在编码设置对齐的情况下(帧结构、码控方式、lookahead长度等),新一代BVC编码器,对于亚运会中的运动和游戏视频内容,平均能实现40%以上的码率节省,同时编码速度更快。

缓存(Redis)工具类,包含缓存击穿、缓存穿透、生成全局唯一id的解决方法

缓存(Redis)工具类,包含缓存击穿、缓存穿透、生成全局唯一id的解决方法 /** * 缓存(Redis)工具类,包含缓存击穿、缓存穿透、生成全局唯一id的解决方法 * */ public class CacheManipulate { //生成全局id所需变量 public static final long BEGIN_TIMESTEMP = LocalDateTime.of(2000,1,1,0,0).toEpochSecond(ZoneOffset.UTC); public static final int MOVE_BIT = 32; //注入redis private final StringRedisTemplate stringRedisTemplate; //创建一个线程池 private static final ExecutorService CACHE_REBUILD_EXECUTOR = Executors.newFixedThreadPool(10); public CacheManipulate(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } //获取锁 private boolean getLock(String key){ try { Boolean valid = stringRedisTemplate.opsForValue().setIfAbsent(key,"1",10,TimeUnit.SECONDS); return BooleanUtil.isTrue(valid); } catch (Exception e) { throw new RuntimeException(e); } } //解锁 private void unlock(String key){ try { stringRedisTemplate.

SNPE教程三:模型转换、量化

一、模型转换 1、转换指令: 这里只讲解onnx转换,其他类似 onnx转到dlc(snpe的模型文件)需要用到一个工具就是snpe-onnx-to-dlc。 snpe-onnx-to-dlc 转化指令参数 格式意义是否必要 --i 输入的onnx模型 指定输入模型必要 --output_path 输出dlc文件的路径 指定输出路径 --disable_batchnorm_folding 禁止将BN层融合到卷积中 --input_type 输入名字 输入类型 (类型支持image, default, opaque) 指定多个输入的输入类型 image就是输入均值是0.0f,最大值是255.0f那么就会将他银蛇到无符号八位 default就是浮点输入到dsp然后被量化 opaque就是如果输入时浮点特定层输入也要求浮点那就不量化 --input_encoding 输入名字 指定的编码格式 可以指定多个层级的输入的编码格式(包括(bgr, rgb, rgba, argb32, nv21, time_series, other) --validation_target 运行环境 运行设备 在指定的运行环境和运行设备上验证 运行环境:cpu,gpu, dsp 运行设备:snapdragon_801, snapdragon_820, snapdragon_835 如果不指定会在所有设备上验证 --strict 会严格在指定设备验证 --dry_run DRY_RUN 评估没有经过任何算子转化的模型并返回不支持的算子 DRY_RUN = {‘info’, 'debug'} debug可以看到更多信息 --udo_config_paths 自定义算子路径 指定自定义算子路径 例子:snpe-onnx-to-dlc --input_network models/bvlc_alexnet/bvlc_alexnet/model.onnx --output_path bvlc_alexnet.dlc 2、算子支持 各个框架的算子支持情况请看:Snapdragon Neural Processing Engine SDK: Supported Network Layershttps://developer.

MineCraft 1.20.1模组开发-(1)-为蓝宝石剑添加右键发射凋零骷髅头以及攻击附加漂浮的效果

MineCraft 1.20.1模组开发-(1)-为蓝宝石剑添加右键发射凋零骷髅头以及攻击附加漂浮的效果 以下均为Forge开发,使用JAVA编写,IDE为IDEA,版本为1.20.1 功能: 1、实现蓝宝石剑(自定义武器)右键释放凋零骷髅头,花费一点耐久,冷却时间为2s 2、实现左键攻击给敌人附加2s的漂浮效果 可以模仿WitherBoss类中的erformRangedAttack函数~~以及ShieldItem(实现冷却时间)~~实现 首先来看看WitherBoss(凋零)类中是如何发射凋零骷髅的,可以通过输入WitherBoss然后按ctrl点击跳转 类似的,我们可以在自定义的剑的类中在右键use方法中使用,通过重写Item类中的use方法实现。 具体步骤: 为了实现冷却时间效果,可查看Player中coolDown相关的信息->pPlayer.getCooldowns().addCooldown(this, 40); 为了实现发射骷髅头的效果,首先需要先获取目标地点,可以通过pPlayer.getLookAngle()得到看的角度,getLookAngle能够获取看向地点的角度,大概是一个以xz为平面,y为纵轴的三维坐标系中的一个向量,直接乘上距离再加上位置即可获得目标位置,具体可以看源码以及使用数学去解一下。其次是召唤凋零骷髅,本质上其实是生成一个Entity对象,因此只需要模仿WitherBoss类中的实现即可.最后,需要为其生成音效以及减少耐久,具体可见下面的源码。 源代码SapphireSword类 import xxx省略 public class SapphireSword extends SwordItem implements Vanishable{ public SapphireSword(Tier pTier, int pAttackDamageModifier, float pAttackSpeedModifier, Properties pProperties) { super(pTier, pAttackDamageModifier, pAttackSpeedModifier, pProperties); } @Override public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltipComponents, TooltipFlag pIsAdvanced) { pTooltipComponents.add( Component.literal("右键").withStyle(ChatFormatting.RESET).withStyle(ChatFormatting.LIGHT_PURPLE) .append(Component.literal("发射凋零骷髅头").withStyle(ChatFormatting.RESET) .withStyle(ChatFormatting.DARK_GRAY).withStyle(ChatFormatting.BOLD))); pTooltipComponents.add(Component.literal("冷却时间2s,消耗1耐久") .withStyle(ChatFormatting.RESET).withStyle(ChatFormatting.AQUA)); super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); } //实现右键释放凋零骷髅,使用花费一点耐久,冷却时间为2s // 可以模仿WitherBoss类中的performRangedAttack函数以及ShieldItem(实现冷却时间)实现 @Override public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { if (!

递归算法实现选择排序(YOJ2.0中的题)

一遍过! 没有草稿!没有任何错误! 太爽了! 因为必须是倒序输出,所以只能用递归,比起之前做的一题,这一题要求是比较严格的 而且最后正确的数列顺序是在改变步骤之后输出,而改变步骤必须伴随着改变后的数组输出 所以你得先正确选择排序一遍,得到排序后的数组,用新数组记录下来,旧数组随着改变步骤的输出而不断变回最开始的那个数组 最后输出步骤数和新数组 代码如下: #include<stdio.h> void function(int location); int num[101]; int num_last[101]; int n; int m;//交换次数 int main(void) { scanf("%d", &n); for(int i = 1; i <= n; i++)//从1开始记录 scanf("%d", &num[i]); function(1); printf("Total steps:%d\n", m); printf("Right order:"); for(int i = 1; i <= n; i++) { printf("%d", num_last[i]); if(i != n) putchar(' '); } return 0; } void function(int location) { int min = num[location], min_loc = location; for(int i = location + 1; i <= n; i++) if(min > num[i]) { min = num[i]; min_loc = i; } if(min_loc !

java-ssm使用逆向工程生成代码

一、新建项目 记得勾选,然后点next 二、导入jar包,没有jar包的,我会上传到gitee拉取一下就行,链接在末尾 选择你把jar包的位置即可,然后ok 再点击Artifacts选项,鼠标移入Fix,选择第一项,然后点击apply按钮,最后ok 三、然后新建好以下文件,内容代码都已为你准备好了,往下看 generatorConfig5.xml文件内容 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 无Example等内容--> <!--<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">--> <!-- 有Example查询条件内容--> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/shopping?characterEncoding=utf-8" userId="root" password="123456"> </jdbcConnection>--> <!--数据库连接的信息:驱动类、连接地址、用户名、密码--> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="scott" password="123456"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="

C++四种类型转换运算符

上节讲到,隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。 但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位关键代码。 为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加规范,C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是: 关键字说明static_cast用于良性转换,一般不会导致意外发生,风险很低。const_cast用于 const 与非 const、volatile 与非 volatile 之间的转换。reinterpret_cast高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的 C++ 类型转换。dynamic_cast 借助 RTTI,用于类型安全的向下转型(Downcasting)。这四个关键字的语法格式都是一样的,具体为: xxx_cast(data) newType 是要转换成的新类型,data 是被转换的数据。例如,老式的C风格的 double 转 int 的写法为: double scores = 95.5; int n = (int)scores; C++ 新风格的写法为: double scores = 95.5; int n = static_cast<int>(scores); static_cast 关键字 static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,例如: 原有的自动类型转换,例如 short 转 int、int 转 double、const 转非 const、向上转型等; void 指针和具体类型指针之间的转换,例如void *转int *、char *转void *等;