使用词云图 使用npm下载依赖
npm install echarts-wordcloud@1.1.3 --save demo例子:
<template> <div class="result"> <el-tabs type="border-card" v-model="name"> <el-tab-pane label="各省累计确诊" name="0"> <div ref="chart1" style="width: 800px;height:600px;"></div> </el-tab-pane> </el-tabs> </div> </template> <script> import * as echarts from "echarts"; import "echarts-wordcloud/dist/echarts-wordcloud"; import "echarts-wordcloud/dist/echarts-wordcloud.min"; export default { name: "VisitShow", data() { return { userVisitNum: [], date: [], goodVisitNum: [], goodsName: [], name: "0" }; }, mounted() { this.showEeharts(); }, methods: { showEeharts() { var chart1 = echarts.init(this.$refs.chart1); var presents = [ "
cumsum() 是 Python 中的一个函数,它可以将输入的数组或序列按元素顺序进行累加,并返回一个新的数组,其中新数组的每个元素都是原数组中前面所有元素的和。例如:
import numpy as np a = np.array([1, 2, 3, 4]) b = np.cumsum(a) print(b) # 输出:[ 1 3 6 10] 上述代码中,函数 cumsum() 将输入数组 a 的每个元素进行累加,得到新数组 b。新数组 b 的第一个元素是 a 的第一个元素,第二个元素是 a 的前两个元素的和,以此类推。
需要注意的是,cumsum() 函数需要使用 NumPy 库,因此需要在使用时先导入 NumPy 库。
此外,cumsum() 函数还可以接受一些其他参数,如指定累加的轴、指定累加的数据类型等。详细信息可以参考 NumPy 官方文档。
前言 大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好理解一些。
css元素定位方式往往被忽略掉了,其实css元素定位方式也有它的价值;相对于xpath元素定位方式来说,css元素定位方式更快,语法更简洁。
一、css元素定位:通过元素的标签或者元素的id、class属性定位 1、css元素定位方式可以通过元素的id、class、标签这三个常规属性直接定位。
2、举例:如下是百度输入框的的html代码:
<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd"/> ①css元素定位使用#号表示id属性,如:#kw
②css元素定位方式使用.表示class属性,如.s_ipt
③css元素定位方式也可以直接使用标签名称,而没有任何标识符,如:input
二、css元素定位:通过元素的其它属性定位 1、css元素定位除了可以通过标签、class、id这三个常规属性定位外,也可以通过元素的其它属性定位。例如: 三、css元素定位:通过标签与属性的组合来定位元素 四、css元素定位:通过元素的层级关系来定位 1、css元素定位可以达到类似xpath元素定位通过元素的层级关系来定位,例如:
xpath元素定位: //form[@id='form']/span/input 和 //form[@class='fm']/span/input 也可以用css实现 五、css元素定位:通过元素的并列索引来定位 1、以下图为例:与四相似。 2、css元素定位也可以通过索引option:nth-child(1)来定位子元素,这点与xpath写法用很大差异,其实很好理解,直接翻译过来就是第几个小孩 六、css元素定位:通过对元素属性的逻辑运算来定位 1、css同样也可以实现逻辑运算,同时匹配两个属性,这里跟xpath不一样,无需写and关键字。
七、处理selenium中的css_selector定位元素的模糊匹配问题 ① 匹配元素的id属性,先指定一个html标签,然后加上“#”符号,再加上id的属性值。
driver.find_element_by_css_selector('div#ID').click() ②匹配元素的class属性,先指定一个html标签,然后加上“.”符号,再加上class的属性值。
driver.find_element_by_css_selector('div.CLASS').click() ③匹配元素的其他属性。【这里不再是‘.’或者‘#’符号,而是采用了"标签名[属性名=属性值]"的方式定位元素】
driver.find_element_by_css_selector('div[name=NAME]').click() ④组合匹配【支持定位元素对象通过两组或两组以上的属性】
driver.find_element_by_css_selector('div[name=NAME][type=TYPE]').click() ⑤匹配头部
driver.find_element_by_css_selector('div[style^="sp.gif"]').click() ⑥匹配尾部
driver.find_element_by_css_selector('div[style$="sp.gif"]').click() ⑦匹配中间
driver.find_element_by_css_selector('div[style*="sp.gif"]').click()
前面,给大家推荐了一款新面市不久的接口测试神器:Apifox,如果还未了解的读者,感兴趣的话可查阅原文:是时候扔掉 Postman 了,Apifox 不香吗_测试小鬼的博客-CSDN博客
为了照顾新进来的读者,且最近一年,Apifox官方又发布了一些新特性,趁此机会,再给大家分享一波。
简单来说,Apifox它是集:接口文档管理、接口调试、Mock、接口自动化测试于一体的全流程集成工具,覆盖从开发->测试->管理等环节,等同于 Postman + Swagger + Mock + JMeter几款工具功能累加。
利用Apifox可以实现:
通过Apifox可实现一套系统、一份数据,解决多个系统之间的数据同步问题。
只要定义好接口文档,接口调试、数据 Mock、接口测试就可以直接使用,无需再次定义;
接口文档和接口开发调试使用同一个工具,接口调试完成后即可保证和接口文档定义完全一致。
一、从接口管理现状聊起 在提及Apifox之前,需要先从接口管理现状聊起,对于接口管理的现状来说,目前行业大部分采取的解决方案有如下几种:
使用 Swagger 管理接口文档。使用 Postman 调试接口。使用 RAP或Easy Mock来进行 Mock 数据。使用 JMeter 做接口自动化测试。 二、现有方案面临的问题 维护不同工具之间数据一致性非常困难、低效。并且这里不仅仅是工作量的问题,更大的问题是多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。
开发人员在 Swagger 定义好文档后,接口调试的时候还需要去 Postman 再定义一遍。前端开发 Mock 数据的时候又要去 RAP 定义一遍,还需要手动设置 Mock 规则。测试人员需要去 JMeter 再定义一遍。前端根据 RAP Mock 出来的数据开发完,后端根据 Swagger 定义的接口文档开发完,各都试测试通过了,本以为可以马上上线,结果一对接发现各种问题: 开发过程中接口变更了,只修改了 Swagger,但是没有及时同步修改 RAP。后端开发的接口数据类型和文档不一致,肉眼难以发现问题。同样,测试在 JMeter 写好的测试用例,真正运行的时候也会发现各种不一致。时间久了,各种不一致会越来越严重。 三、Apifox 如何解决这些问题 在前面提到了Apifox = Postman + Swagger + Mock + JMeter 它是通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好接口文档,接口调试、数据 Mock、接口测试就可以直接使用,无需再次定义;接口文档和接口开发调试使用同一个工具,接口调试完成后即可保证和接口文档定义完全一致。高效、及时、准确!
目录
一:安装必要的库
二:数据分析 条形图可视化
三:数据分析 词频统计 词云图可视化
一:安装必要的库 导入必要的库
import collections # 词频统计库 import os import re # 正则表达式库 import urllib.error # 指定url,获取网页数据 import urllib.request import jieba # 结巴分词 import matplotlib.pyplot as plt # 图像展示库 import numpy as np # numpy数据处理库 import pandas as pd import wordcloud # 词云展示库 import xlwt # 进行excel操作 from PIL import Image # 图像处理库 from bs4 import BeautifulSoup # 网页解析,获取数据 from pyecharts.charts import Bar # 画柱形图 导入的库,如果出现报错,自己安装即可 如下安装示例1
文章目录 一、回顾C文件接口1.打开和关闭2.读写文件3.细节 二、系统文件I/O 1.open和closeumask小细节 2.read和write1.write2.read3.小总结 三、理解文件四、文件描述符fd1.引入2.理解3.分配规则4.close(1)问题 五、重定向1.重定向2.接口3.追加重定向4.输入重定向 六、Linux一切皆文件 一、回顾C文件接口 1.打开和关闭 对于C语言的文件操作,首先我们需要打开(fopen)文件,打开失败将会返回NULL ,而打开成功则返回文件的指针(FILE*)
最后我们则需要关闭(fclose)文件。
FILE *fopen(char *filename, char *mode) filename为文件名(包括文件路径),mode为打开方式,它们都是字符串
int fclose(FILE *stream) stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。
下面我们用C语言来实现打开和关闭文件:
2.读写文件 我们可以通过fgets和fputs以字符串形式进行读写,也可以通过fprint和fscanf进行格式化读写
int fputs (const char * str, FILE * stream ); char * fgets (char * str, int num, FILE * stream ); int fprintf (FILE * stream, const char * format, ... ); int fscanf (FILE * stream, const char * format, .
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。
测试设备:OrangePi 5
参考资料 https://github.com/Tencent/ncnn https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux
编译安装过程 拉取源码
git clone https://github.com/Tencent/ncnn.git 进入源码目录
cd ncnn/ 更新子模块
git submodule update --init 更新软件源
sudo apt update 安装现关工具
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev sudo apt install mesa-vulkan-drivers 创建编译文件夹
mkdir -p build 进入编译文件夹
cd build cmake编译
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_BUILD_EXAMPLES=ON .. 编译
make -j$(nproc) 完成!
测试,执行基准测试 cd ../benchmark ../build/benchmark/benchncnn 10 $(nproc) 0 0 在OPI 5上测试的结果为
C 是一种编程语言,它是一种通用的、面向过程的编程语言。C 语言具有很高的灵活性和简洁的语法,并且可以轻松地与底层操作系统进行交互。C 语言是许多其他编程语言的基础,包括 C++、Java、C# 等。它的应用广泛,在许多领域都有应用,如操作系统、数据库、编译器、网络协议、嵌入式系统等。
C 是一种通用的、高效的、结构化的计算机编程语言,它被广泛应用于计算机科学、电子工程、软件工程等领域。C 语言既具有高级语言的易用性,又具有汇编语言的效率,因此它是一种常用的编程语言。C 语言的主要特点包括:
简单易学:C 语言的语法简单易懂,容易上手。
高效:C 语言的编译器和程序运行效率高,适用于计算密集型任务。
灵活:C 语言提供了较多的控制语句和运算符,可以灵活地编写程序。
广泛应用:C 语言在很多领域都有广泛应用,如操作系统、编译器、数据库、图形图像处理等。
目录
一:获取网页重要信息
二:爬取网页数据
三:源码分享
一:获取网页重要信息 在要爬取数据信息的网页上,F12进入查看网页内容
二:爬取网页数据 1 导入模块
import requests from bs4 import BeautifulSoup import urllib.request import random 2 设置header 防止403资源不可用
# 设置header 防止产生403forbidden my_headers = [ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.
文章目录 1. 前言2. 教程3. 官网 4. 在线demo 4.1. 本地部署4.2. 安装4.2.1. Python源码构建安装4.2.1.1. 安装redis数据库4.2.1.1.1. 下载redis源码4.2.1.1.2. 启动redis服务4.2.1.1.3. 安装redis服务4.2.1.1.4. 再次通过命令启动redis服务4.2.1.1.5. 测试redis服务是否可用 4.2.1.2. 下载proxy_pool源码4.2.1.3. 安装依赖4.2.1.4. 更新配置4.2.1.4.1. 配置参数4.2.1.4.2. 配置参数案例 4.2.1.5. 启动项目4.2.1.6. 测试API的调用4.2.1.6.1. 直接打开网页版4.2.1.6.2. 代码测试 4.2.2. docker安装4.2.3. API调用 5. 报错 1. 前言 之前做爬虫的时候,经常会遇到对于一个网页,使用同一个IP多次会被禁掉IP的问题,我们可以自己手动更换代理IP再继续这个问题但多少会有点麻烦,我对于一个懒人来说,手动更换IP太麻烦,而且也不符合程序员懒惰的美德,于是便有了下面的故事。proxy_pool 是一个开源的代理池,聚合了各大免费的 ip 代理池。当自己的爬虫因为爬的太快了 ip 被封了的时候,代理池就可以派上用场啦爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。 2. 教程 部署自己的代理池 - idealclover 3. 官网 GitHub - jhao104/proxy_pool: Python爬虫代理IP池(proxy pool) 4. 在线demo demo.spiderpy.cn/ 4.1. 本地部署 4.2. 安装 python爬虫添加代理ip池ProxyPool (Windows) - 灰信网(软件开发博客聚合) 4.2.1. Python源码构建安装 4.2.1.1. 安装redis数据库 4.2.1.1.1. 下载redis源码 Windows下安装Redis图文教程_喵代王-香菜的博客-CSDN博客_windows安装rediswindows首先下载安装Redis安装包,并解压到合适位置(放哪都行) 4.
目录
1. 准备 1.1 mysql安装
1.2 创建nacos需要的数据库
1.3 下载nacos镜像
1.4 创建自定义网络 (可省略)
1.5 获取nginx镜像
2. nacos集群部署
2.1 将mysql连接到mynet网络(可以省略)
2.2 nacos集群
2.3 使用nginx访问集群
1. 准备 1.1 mysql安装 下载镜像 docker pull mysql/mysql-server:5.7 在宿主机中相关目录,用于挂载容器的相关数据 mkdir -p /data/mysql/{conf,data} 编写my.cnf配置文件,在/data/mysql/conf目录中 (或下载 直接上传即可) my.cnf.txt - 蓝奏云 / 需要把后面的txt扩展名删除
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] ##官方的配置 # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
//c# modbus 类,在windows系统可以用
//读取输出线圈 功能码0x01
//读取输入线圈 功能码0x02
//读取保持型寄存器 功能码0x03
//强制单线圈 功能码0x05
//预置单字保持型寄存器 功能码0x06
//预置多字保持型寄存器 功能码0x10
using System.IO.Ports;//在vs2019平台.net4.0FrameWork
public class Modbus
{
//定义串口类对象
private SerialPort MyCom;
//定义CRC校验高低位
private byte ucCRCHi = 0xFF;
private byte ucCRCLo = 0xFF;
//定义接收字节数组
byte[] bData = new byte[1024];
byte mReceiveByte;
int mReceiveByteCount = 0;
//定义设备地址
int CurrentAddr;
int iMWordLen;
int iMBitLen;
//定义返回报文
string strUpData;
public Modbus()
{
MyCom = new SerialPort();
}
#region 打开关闭串口方法
/// <summary>
1.Vscode 插件中心搜索插件Code Runner,正常安装
2.打开设置页面,快捷键:Ctrl+,直接打开。
设置搜索输入:code runner map,打开settings.json 配置
3.图中红框处的php配置修改为你电脑php的执行文件路径保存即可,后面的-f $fileName可不填
4.这样就可以快速的右键:Run Code 调试运行php代码了
整理时间:2020-06-28
matlab appdesigner 灰色区域无法编辑!!! 求助~~
整理时间:2020-02-29
回答这个问题,网上发帖未果,依旧很无助,自己琢磨来来去去,终于有招了。
比如上面的这个控件,虽然在 设计视图 中 删除了,但是 代码视图 中没有被删除。
那么,我想删掉这段代码怎么办,有办法的,在 回调 那里 删除!!
另外,出现一些错误时候,你可以试试关闭app 重新打开。
THE END~
很简单,使用audio标签把它放在body或head里面就行
<audio src="yp/sybj.mp3" id="dd" autoplay="autoplay" controls="controls" loop="loop"></audio> autoplay在页面加载完成就开始播放音频
controls显示播放栏
loop循环
如果你还需要用js灵活的控制它的播放有否,你可以用如下代码
<button onclick="dt()">停止播放</button> <button onclick="st()">开始播放</button> <button onclick="rs()">重置播放</button> <script type="text/javascript"> function dt(){ var dd = document.getElementById("dd") dd.pause() } function st(){ var dd = document.getElementById("dd") dd.play() } function rs(){ var dd = document.getElementById("dd") dd.load() } </script> 一定一定要给权限!!!要给权限!!!要给权限!!!,这个代码在运行以后会弹出权限请求窗口,但是一般情况下,会触发浏览器自带是否允许弹出通知提醒。
你的声音文件需要放在一个可访问的web资源路径下。不要直接指定成本地文件。
还有就是要确定你的声音打开了,搞半天发现自己声音没开,那就尴尬了
文章目录 1. 前言2. 效果展示3. 准备🍑 下载编译器🍑 下载插件 4. 源码🍑 HTML🍑 JS🍑 CSS 5. 结语 1. 前言 一年一度的圣诞节和考研即将来临,那么这篇文章将用到前端三大剑客 HTML + CSS + JS 来实现动态圣诞树!
2. 效果展示 在手机上还可以通过左右滑动来控制雪花的方向哦!
3. 准备 🍑 下载编译器 这里的话推荐使用 VScode(方便!)
🍑 下载插件 Auto Rename Tag:改善标签后自动完善
Chinses语言包:把编译器语言换成中文(默认英文)
open in browser:让代码在网页中打开,快捷键 Alt + B
4. 源码 以下源码都已经准备好了,大家复制即可。
🍑 HTML 代码示例
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title>CodePen - Christmas Tree and Snow</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css"> <link rel="stylesheet" href="
一.密码服务:公司统一进行数据库密码管理,为了防止密码泄露,会不定时更换密码,服务端就需要获取密码,类似key,value账号类型,首先根据数据库名去密码服务注册一个账号,后面通过这个注册的这个账号去获取密码。
有以下几种方式去实现:
1.定时任务
开启定时任务去监控数据库密码是否更改或者去检查数据源是否有报错信息:
(1)监控数据库密码是否更改:密码服务使用hashMap缓存密码到本地,所以通过获取上次缓存的密码接口和最新的密码接口,通过比较这来两个密码是否相等,不等则调用DruidDataSource中的restart()方法重置数据库连接池;
(2)检查数据源是否有报错信息:获取DruidDataSource中的getLastCreateError()和getLastCreateErrorTime()方法,判断数据源是否发生错误,然后判断是否是10s以内的错误,判断之后再重新获取密码,restart()方法重置数据库连接池
2.自定义sql异常处理类(验证不可用,有待改进,原因:一般我们都会用一些数据库组件如Druid,它们都会去处理数据库基本异常,像密码错误等,所以在外面捕获不到异常信息)
在异常类中判断如果错误码是1045这个错误代码的意思为登录账号的密码错误或者是没有权限,则重新调用密码服务获取密码,然后restart()方法重置数据库连接池;
(1)全局捕获sqlException,
(2)自定义注解和aop切面的方式进行判断:
@Target -注解用于dao层的包即ElementType.PACKAGE: 用于描述包
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After: 最终通知(在目标方法执行后调用,无论目标方法是否出现异常,都会执行),不管是抛出异常或者正常退出都会执行
使用@AfterThrowing或者@After,在其方法中如果有SqlException则调用sql异常处理类去处理
注意:
1.因为restart()不会重新获取设置密码,还需要调用setPassword();
2.已经创建的连接还可以使用,直到连接用完或者失效,连接数以及失效时间都是可以进行配置的。
3.如果使用了Druid则可以重写DruidAbstractDataSource类(直接把依赖包里面的源码按照相同包路径复制过来,src和jar包里面的类路径相同,则会优先加载src下的),经debug发现DruidAbstractDataSource类中createPhysicalConnection方法中会捕获SQLException异常然后抛出到DruidDataSource去处理,所有我们只需要在抛出异常去处理之前重新去获取数据库密码,通过DruidDataSource中的setPassword()更新密码就可以。
在使用过程中有几个问题:
(1)为什么要重写抽象类DruidAbstractDataSource类,而不是重写实现这个抽象类的DruidDataSource
因为重写DruidDataSource比较困难,涉及到的方法比较多,需要全部拿出来重写,而抽象类就不存在这些问题;
(2)
二.mysql多数据源
application.yml中简单配置:
spring:
datasource:
数据库1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: username:
DBSourceKey: 获取密码服务的key
数据库2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: username:
DBSourceKey: 获取密码服务的key
其他配置:
#数据库连接配置 #驱动 spring.datasource.driverClassName = com.mysql.jdbc.Driver #数据库链接 spring.datasource.url = jdbc:mysql://localhost:3306/testdb #用户名 spring.datasource.username = root #密码 spring.datasource.password = 123456 #数据库连接池配置 #初始化链接数 spring.datasource.initialSize=5 #最小的空闲连接数 spring.
(七)波形的发生和信号的转换 正弦波振荡电路RC正弦波振荡电路LC正弦波振荡电路 电压比较器单限比较器过零比较器一般单限比较器 滞回比较器窗口比较器电压比较器例题 非正弦波发生电路 正弦波振荡电路 概念和原理
振荡条件
正弦波振荡电路的组成部分
滤波电路:即选频网络,保留了所需要的信号,过滤了不需要的信号
非线性环节:为了保证最终的正弦波幅值能达到一个稳态(饱和)
理想集成运放工作在线性区,所以要加非线性元件
分立元件(晶体管)本身是非线性元件,不需要额外加元件
RC正弦波振荡电路 RC桥式正弦波振荡电路
只选定了fo处的信号,滤去了其他频率的信号,此时 |F|=1/3,|A|≥3
典型的RC桥式正弦波振荡电路
没有外部输入,输入就是反馈构成的选频网络,接在了同相输入端,是一个同相比例运算电路
下图中还需要在Rf处并联一个稳压管(非线性元件)才能够稳定输出
例题
“反馈构成的选频网络”的输入来自原电路的输出
“反馈构成的选频网络”的输出是原电路的输入(原电路没有外部输入)
在fo处,|F|=1/3,|A|≥3
LC正弦波振荡电路 LC正弦波振荡电路
变压器反馈式
电感三点式
电容三点式
判断LC正弦波振荡电路能否振荡
例题
电压比较器 在第五章和第六章中,研究的运算电路是引入负反馈的集成运放,其工作在线性区,可以实现信号的运算第七章,即本节所讲的电压比较器,是集成运放工作在非线性区时的电压比较特性,即输出电压为高/低电平,此时集成运放无反馈(开环)或之引入正反馈 电压传输特性
解题重点:画出电压传输特性曲线
描述"输出电压"`与"输入电压"之间的函数关系
电压比较器传输特性的基本要素 电压比较器的分析方法
单限比较器 过零比较器 单限比较器的特例
输入电压与0进行比较过零——同相输入端/反相输入端其中一个接地(零电平)另一个输入端无参考电压阈值电压UT为0 一般单限比较器 存在参考电压UREF,阈值电压不再为0利用虚断列写KCL方程 滞回比较器 引入正反馈有两个阈值电压UT+与UT-仅在“下一个”阈值电压处发生一次跃变 输入无参考电压UREF,所以阈值电压关于原点对称
窗口比较器 利用二极管的单向导电性重点在于判断二极管的工作状态有两个阈值电压URL与URH会发生两次跃变 电压比较器例题 非正弦波发生电路 矩形波是基础波形,可以通过波形变换得到其他波形
矩形波(方波)——积分——三角波矩形波(方波)——正、反向积分速度不同——锯齿波矩形波(方波)——微分——尖顶波 本节重点:求解非正弦波振荡电路的振荡频率(周期)及振幅
波形种类主要参数备注矩形波方波占空比可调:加两个二极管三角波发生电路调整三角波的振幅和频率:
先调整R1&R2得到符合需求的三角波振幅,再调整R3得到合适的频率以满足设计的要求锯齿波发生电路
目录
一. 在下面的网站中下载OpenCV文件
二. 在虚拟环境中使用pip安装该文件
三、官网下载OpenCV源代码(后续使用)
四、pycharm中打开该虚拟环境
五、安装numpy和matplotlib
六、pycharm找不到cv2模块解决:
七、在pyhcharm中使用cv不自动提示函数,不进行自动补全
八、测试使用CV模块 一. 在下面的网站中下载OpenCV文件 Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)
注意:
cp39指Python的版本为3.9,amd64指操作系统为64位,我下载的是opencv_python-4.5.5-cp39-cp39-win_amd64.whl
二. 在虚拟环境中使用pip安装该文件 1. 打开conda prompt,在其中创建并激活虚拟环境
我的虚拟环境名称为testOpencv,Python版本为3.9
conda create --name testOpencv python=3.9 2. 激活虚拟环境
conda activate testOpencv 3. 把刚刚下载的whl文件移动到虚拟路径的文件夹下
4. 定位到该虚拟环境的路径中
使用cd命令定位到虚拟环境创建的路径中,为后面安装OpenCV文件做准备。
5. 使用pip命令下载文件
pip install opencv_python-4.1.5-cp39-cp39-win_amd64.whl 三、官网下载OpenCV源代码(后续使用) Releases - OpenCV
1. 进入官网后选择系统版本
2. 点进去之后等待下载即可。
四、pycharm中打开该虚拟环境 project -> settings -> python interpreter (5条消息) 如何在pycharm中使用anaconda的虚拟环境_大雾的小屋的博客-CSDN博客_pycharm使用anaconda环境
最近写完了自己的操作系统,深感有一个方便的调试环境是有多么重要,能够提升不少开发效率。恰好最近在的技术交流群里群友在问如何搭建VSCode调试操作系统的环境,刚考完试,就先把这篇VSCode调试C/C++的通用教程发出来,而后针对VSCode调试操作系统的特定环境的教程稍后再发出来 VSCode调试C/C++项目 VS Code作为宇宙第一编辑器,在众多插件的加持下,具有了调试、单元测试等等功能,使其越来越像一个IDE。
然而很多人其实并不会使用VS Code的调试功能,只是把VS Code当做了一个带有语法补全的编辑器。这实际上极大地浪费了VS Code的功能,尤其是对于C/C++开发者来说,使用命令行的GDB调试远不如使用VS Code内嵌的GDB图形化界面调试来的舒服。
本文就讲介绍如何使用VS Code调试C/C++项目
1. 概述 通常我们在调试一个C/C++工程的时候,大体上的流程可以分为两步:
启动调试器(GDB)前的准备工作启动调试器(GDB)进行调试 例如对于一个CMake组织的C/C++项目,这两大步具体包含的流程如下(编写CMakeLists.txt是在编码阶段,编码是与调试独立的阶段):
启动调试器(GDB)前的准备工作 创建build文件夹:mkdir -p build切换到build文件夹:cd build配置(Configure)项目:cmake .. <option>构建/编译(Build)项目:make 启动调试器(GDB)进行调试 启动调试器:gdb <path-to-executable 对于不同的项目(npm项目、C#项目、java项目等等),可能在启动调试器前的准备工作不同,但是大体上都可以分为进行调试前需要进行的一系列任务,以及结合具体参数启动时调试器
因此,对于这两个阶段,VSCode中提供了tasks.json和launch.json两个文件来分别描述调试前的准备工作以及以指定的参数启动调试器
2. 调试前的准备工作:tasks.json VSCode使用tasks.json来描述启动调试前的准备工作。
A. tasks.json的结构 tasks.json的结构一般如下
{ "version": "2.0.0", "tasks": [ ], "inputs": [ ] } B. version标签 version标签指定了Tasks.json的版本,因为不同的版本支持的标签不一样,所以需要使用version标签指明版本。
目前version支持2.0.0版本,所以直接指定version为2.0.0即可。
C. tasks标签 tasks标签是一个列表,我们在其中定义不同的task,而关于具体的task如何定义则见下
我们以创建build文件夹这个任务为例
{ "label": "create dir", "type": "shell", "command": "mkdir", "args": [ "-p", "build" ], "windows": { "args": [ "
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.box {
height: 100px;
width: 200px;
margin: 150px auto;
background-color: aquamarine;
text-align: center;
overflow: hidden;
border-radius: 10px;
}
.a {
height: 30px;
width: 80px;
border: 1px black solid;
text-align: center;
line-height: 30px;
margin: 15px auto 10px;
}
button {
height: 30px;
width: 40px;
}
</style>
</head>
<body>
<div class="box">
<div class="
目录
一、VMware Workstation虚拟机软件的下载
二、镜像文件的下载 三、Windows Server 2016虚拟机的创建
四、虚拟机系统安装
五、最后
一、VMware Workstation虚拟机软件的下载 官网下载入口:Download VMware Workstation Pro - VMware Customer Connect
下载最新版的VMware即可,我这里下载的是VMware Workstation17.0版本,各个版本之间差别也不大。
下载好之后自己看着提示安装软件就好,这里我就不详细说明了。
二、镜像文件的下载 下载网站入口:MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn)
在网站里面根据自己的需求下载对应的版本,因为我的分享安装的是Windows server2016版本的客户机,所以我就下载了这个版本的镜像文件。为了照顾想要省事的同学,我就直接给出个下载链接,复制一下打开迅雷就可以下载了:
ed2k://|file|cn_windows_server_2016_x64_dvd_9718765.iso|6176450560|CF1B73D220F1160DE850D9E1979DBD50|/ 注意哦,这个是Windows Server 2016版本的镜像文件下载链接,需要下载其他版本的还得自己在网站里面自己找。
到这里,准备工作就做好了,接下来就是我真正分享的内容。
三、Windows Server 2016虚拟机的创建 1、鼠标右键点击VMware Workstation pro的桌面快捷方式,以管理员身份运行
注:必须要以管理员身份运行软件,否则可能因为操作权限不足而无法成功创建虚拟机 。
2、点击左上角的文件->新建虚拟机
3、点击新建虚拟机之后会跳出一个窗口,如下图,在这里默认选择典型即可,然后点击下一步
4、选择稍后安装操作系统,点击下一步。
5、
1)选择客户机操作系统:根据自己提前下载好的镜像选择;
2)版本:根据自己提前下载好的镜像选择;
3)点击下一步。
这里我选择的是Microsoft Windows(W)客户机操作系统和Windows Server 2016版本,软件会根据你的选择分配硬件设置。
6、
1)虚拟机名称:起一个你喜欢的名字;
2)位置:建议更改一下虚拟机的位置,不要放在系统C盘;
3)点击下一步。
7、这里的最大磁盘大小不是说你设置了60GB,就会占用多大的空间,这只是一个分配,并不是实际占用这些空间,这60GB的磁盘大小是软件建议的,当然你也可以把它改成40GB,但是也不能太小,不然虚拟机无法正常使用,毕竟系统的安装也需要占用一定的空间。
一般默认即可,点击下一步。
8、点击自定义硬件
9、硬件设置
1)内存、处理器:默认即可,要是电脑配置不高,可以改成内存1GB 和处理器1个
一. 简介 买了一个圆形的WS2812模块玩玩,特来总结一下驱动方法,感觉对比于普通的RGB灯来说,还是有点不一样的。
踩了一些坑,也在此列出。
二. ws2812驱动 驱动方法其实很简单,就是发送一个24bit的数据即可,数据0和1的定义分别如下。
三. 特别提示 它没有所谓的空闲态,如果两个24bit的数据传输时间间隔相差过大,那个第二个24bit数据,不会传递到后面的ws2812灯上,而是会更新当前ws2812灯的状态。 四. FPGA实现 整个模块的实现方式如下,欢迎关注,写的比较随便了。
module ws2812_driver( input sys_clk_50M, input rst_n, output ws2812_o, //外部控制 input ws2812_req, //显示请求 output ws2812_ack, //显示完成应答 input ws2812_reset, //显示复位 output ws2812_reset_ack, //显示复位完成 input[7:0] ws2812_r, //显示的数据 input[7:0] ws2812_g, input[7:0] ws2812_b ); //逻辑0高低电平持续周期数 localparam T0_H = 6'd16; //320ns localparam T0_L = 6'd42; //840ns //逻辑1高低电平持续周期数 localparam T1_H = 6'd42; //840ns localparam T1_L = 6'd16; //320ns //复位持续周期数 localparam T_RESET = 14'd15000;//300us localparam S_IDLE = 3'd0; localparam S_DATA = 3'd1; localparam S_RESET = 3'd2; localparam S_ACK = 3'd3; localparam S_Sub_IDLE = 4'd0; localparam S_Sub_T0_L = 4'd1; localparam S_Sub_T0_H = 4'd2; localparam S_Sub_T1_L = 4'd3; localparam S_Sub_T1_H = 4'd4; localparam S_Sub_ACK = 4'd5; reg[2:0] state , next_state; reg[3:0] sub_state , sub_next_state; reg[13:0] t_cnt; //时间计数 reg[5:0] bit_cnt; //发送比特位计数 reg[23:0] color_rgb; assign ws2812_o = (sub_state == S_Sub_T0_L || sub_state == S_Sub_T1_L || state == S_RESET) ?
做希腊买房移民项目的打算是在今年十月份全家从欧洲旅游回来之后产生的。在欧洲主要游玩的地方有两处印象深刻,一个是希腊,一个是意大利。而之所以选择希腊而非意大利,是因为回到国内之后,我和妻子商量,结合这两个国家移民的优劣势,我们最终决定在希腊买房做希腊移民身份。主要原因是希腊环境好没有移民监要求,适合我们想要去欧洲度假而非定居的想法,其次是因为希腊买房移民可以直接刷人民币,还有申请条件也比意大利要简单很多。移民希腊门槛低,只需要在当地购买25万欧元的房产就可以,并且在希腊经济复苏的同时,购买房产升值的空间大。
刚一决定移民希腊,我们就百度一些移民机构,咨询了一些关于希腊买房移民的问题。再向洲际移民的顾问Laura的咨询中,我知道了移民购房的大致流程并签了考察合同。去希腊当地考察虽然对于一个经常在外旅游的人来说就是一个小事,但是考察购房和旅游是不同的,除了签证以外,还要有律师和翻译,一系列的申请书也是必要的。这些我们都通过洲际移民来完成。再次出发去希腊是今年的11月份,考虑到孩子还在读书,便只有我和我的妻子去。到了希腊有洲际移民当地的陪同人员Jason以及其它工作人员,他们会在购房移民的过程中提供一些翻译帮助和代理申请等专业工作。由于在去希腊看房之前,顾问Laura也给我看好了好几处房源,两处是在希腊首都雅典,另一处是在麦西尼州,所以我们的考察行程比较轻松。而移民希腊看房,处处是我们想不到的惊喜。
1. 雅典别墅海景房
考察行程开始,Jason便和一些工作人员一起带领我们到这几处地方看房,首先是雅典东南部的房源,是一处精装极其豪华的独栋海景别墅,周围有许多所国际学校,有一个大学城位于雅典的中部。这处的海景房有210平方米,它的客厅宽阔、卧室面积适中,别墅整体设计优雅、色调柔和、舒适自然,落地窗面积大,你站在巨大的阳台或者落地窗前可以看到远处美丽的海景,给我一种精致典雅的感觉。当时我便和妻子商量,一致认为可以,但同时因为又因为预约了其它房源,所以也和Jason等人一起去了雅典另一处的房源。
2. 雅典新马克公寓
在看完雅典的海景别墅之后,希腊这边已经是晚上了,认真负责的Jason和我们商量可以明天再看房,这样我们便在雅典的一处酒店入住了。到了第二天,我们继续和Jason一起去了新马克里公寓,这是一处希腊移民投资房源,Jason建议我们如果购买可以用来出租,新马克里公寓是一处高档公寓位于雅典北部的新马克里,并且靠近闻名的爱琴海,只要步行几分钟即到爱琴海。我们大致看了下新马克里公寓,它的构造布局合理,也和第一次看的别墅海景房一样,带有大型的客厅,采光充足,视线适宜,可以直接看到地中海的美景,与雅典东南部的海景房很相似。
3. 麦西尼州酒店式公寓
到了第二天的下午,Jason又将我们带到希腊的麦西尼州来看房,这是我们在国内选择好的第三个房源,是一座酒店式公寓,当时我选择时,认为可以度假兼投资,希腊优美的自然风光给旅游业带了很大的发展空间,必定会带动酒店居住行业的发展。当时我妻子也根据她多年在投行方面的经验,认为此时购买投资是一个不错的机遇。到了麦西尼州后,酒店周边交通方便,也靠近爱琴海,旅游者到爱琴海这边游玩只要几分钟就可以拎包入住。
在相继看了三处的房源之后,我和我妻子最终决定初步选择雅典别墅海景房作为家庭度假使用,麦西尼州酒店式公寓作为出租投资使用,并且将这两处的房源照片发给现在国内的儿女看,他们也觉得这两处很好,都很喜欢。于是我们在当地付了定金,办了手续,回国内后付了尾款!一系列的购房手续办好之后,我和妻子回到国内,提交希腊移民申请之后不到两个月的时间就成功拿到了蓝纸,接下来换好居留卡后,我们一家就能随时去欧洲旅游了!
欧洲购房移民一直以来以其门槛低、价格优惠、审批迅速等优势吸引了来自世界各地的投资者,其中希腊买房移民优势最为明显,备受国人追捧。为了帮大家进一步了解希腊买房移民的相关情况,本文为大家着重分析一下希腊买房移民除了房款还需要交哪些税费。
1.房产税 正常过户时,如果房子是2006年1月1日之前买入的,需要交纳总房款3%的税金,之后买入的缴纳24%,当您购买了房产之后,就要通过会计在政府注册,并交纳0.2%的房屋持有税。以25万欧元的房产税为例,每年持有税为500欧元。
2.物业费 依据面积不同,正常是20-150欧元每个月,但需要注意的是,无论是否入住,都需要交纳物业费。如果出租,你的租金里是包含这些税费的,也就是说作为房东你需要交纳上述两项费用,实际金额根据房产项目不同有所差异。
3.个人所得税 每年一缴,本年度缴纳上一年的。根据每年房租总收入而定,年租金1.2万欧以下的,税费为年租金的15%;年租金1.2万-3.5万欧,税费为年租金的35%;3.5万欧以上的则为45%。
4.房屋保险费和出租费 房屋保险费大约350欧元/套/年,主要根据住宅年龄,面积而定,以保险公司实际收费为准。如果后期想要出租房产的话,房屋中介会收取1个月房租作为中介费。
5.房屋托管费 如果人不在希腊,需要中介公司全部托管,比如漏水,各种维护维修,租客会通知中介,中介会收取一年600-800欧的服务费,他们会派人与租客沟通,找相关公司来维护维修,但第三方的花费要由房东支付。如果想完全当个甩手掌柜,可以选择开发商的全包服务,包租,包回报,每年有3-5%的回报,但房屋保险+会计费+房屋持有税等还是要由你自己交纳。
6.律师费和公证费 房屋过户的律师费是房价的1.24%,无论您是从个人手里买房还是开发商手里买都是一样的。
公证费是房屋总价的1%-1.5%,最终收费以希腊公证处计算为准。
7.装修费用 如果您购买的房产价格极低,房屋状态残破,需要全面装修,像开发商那种简装需要350-400欧元一平米,可以按你要购买的房产面积来计算装修花费,大的房屋中介就有自己的装修公司可以委托来装修,也可以在外面找其它公司装修。
以上就是希腊买房移民除房款以外的全部税费啦。希腊买房移民门槛低、投资少,回报高,对有任何移民想法的申请者来说都是十分适合的。
很多人在移民后都担心无法融入当地生活,很担心当地有排外现象,或者不喜欢中国人怎么办?这对移民后的生活质量确实影响很大。那世界上有哪些国家最友好,最容易接纳新移民呢?一起来看看吧。
近期发布的《2020年移民融入政策指数》按各国移民政策对保障移民的基本权利、平等机会及未来发展这三方面的表现评分,以100分为总分,计算出其移民政策的平均得分,并排列出各国的移民政策对移民友善的程度。
如图,排名前十的国家分别是:瑞典、芬兰、葡萄牙、加拿大、新西兰、美国、比利时、挪威、澳大利亚、巴西、卢森堡、爱尔兰、西班牙、德国。
总体来看,移民最容易融入的国家,依然停留在传统英语移民国家、北欧国家,以及新晋崛起的葡萄牙。
葡萄牙黄金签证申请条件:
主申请人:
· 年满18周岁的非欧盟公民
· 无犯罪记录
· 购买私人健康保险
附属申请人:
· 主申请人的配偶;
· 主申请人及配偶的父母;
· 18周岁以下子女;
· 18周岁以上未婚、在读、经济不独立的子女。
葡萄牙黄金签证投资方式:
· 基金项目:35万欧元投资葡萄牙JWP基金;
· 房产项目:35万/50万欧元投资葡萄牙房产
*里斯本和波尔图地区房产2021年7月1日起不参与黄金居留计划。
目录
前言
一、什么是链表
1.1链表的结构和概念
1.2 链表的分类
二、无头单向非循环链表
2.1 创建结构体
2.2 动态申请一个节点
2.3 单链表打印
2.4 单链表尾插/尾删
2.4.1 单链表尾插
2.4.2 单链表尾删
2.5 单链表头插/头删
2.5.1 头插
2.5.2 头删
2.6 单链表查找
2.7 单链表中间插入/中间删除
2.7.1 中间插入
2.7.2 中间删除
2.8 单链表销毁
三、双向带头循环链表
3.1 结构体的创建
3.2 创造节点
3.3 创建返回链表的头结点(哨兵位)
3.4 双链表打印
3.5 双链表的尾插/尾删
3.5.1 尾插
3.5.2 尾删
3.6 双链表的头插/头删
3.6.1 头插
3.6.2 头删
3.7 双链表的查找
3.8 双链表的中间插入/中间删除
3.8.1 中间插入
3.8.2 中间删除
3.9 双链表的销毁
四、链表和顺序表的区别
五、代码及代码展示
5.1 单向链表
Spring-_-Bear 的 CSDN 博客导航 本题要求实现一个简单函数,找出两个数中的最大值。
函数接口定义:
void findmax( int *px, int *py, int *pmax ); 其中 px 和 py 是用户传入的两个整数的指针。函数 findmax 应找出两个指针所指向的整数中的最大值,存放在 pmax 指向的位置。
裁判测试程序样例:
#include <stdio.h> void findmax( int *px, int *py, int *pmax ); int main() { int max, x, y; scanf("%d %d", &x, &y); findmax( &x, &y, &max ); printf("%d\n", max); return 0; } /* 你的代码将被嵌在这里 */ 输入样例:
3 5
输出样例:
5
来源:
来源:PTA | 程序设计类实验辅助教学平台
需求背景:使用实体里的多个属性重新构建集合 模拟需求:已知Organization对象有orgCode、orgName两个属性,同为String类型,现有多个Organization对象构成的list对象,需使用上述两个属性重新构建一个泛型为String的Set集合。 本质是合并流FlatMap的使用。
List<Organization> a = new ArrayList<>(); Organization organization1 = new Organization(); organization1.setOrgName("aa"); organization1.setOrgCode("bb"); Organization organization2 = new Organization(); organization2.setOrgName("cc"); organization2.setOrgCode("dd"); Organization organization3 = new Organization(); organization3.setOrgName("tt"); organization3.setOrgCode("bb"); a.add(organization1); a.add(organization2); a.add(organization3); Set<String> set2 = a.stream().flatMap(o -> Stream.of(o.getOrgName(),o.getOrgCode())).collect(Collectors.toSet()); set2.forEach(System.out::println); 输出为:
aa bb cc dd tt 符合预期
问: 这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。
列表方法 append() 和 extend() 有什么区别?
答1: huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
append 在列表末尾附加一个指定对象:
>>> x = [1, 2, 3] >>> x.append([4, 5]) >>> print(x) [1, 2, 3, [4, 5]] extend 通过附加来自指定迭代的元素来扩展列表:
>>> x = [1, 2, 3] >>> x.extend([4, 5]) >>> print(x) [1, 2, 3, 4, 5] extend 和仅使用加法运算符(在上面的示例中为 x = x + [4, 5])有什么区别?
实际上有一个很大的不同 - x + [4, 5] 为您提供了一个分配给 x 的新列表 - x.extend() 改变了原始列表。我在下面的答案中详细说明。
@AaronHall @Rohan 但它与 x += [4,5] 相同。
git log git reset --hard XXXXXX //XXXXXX指的是要采用的版本commit git push -f -u origin 远程分支 第一步,git log 查看提交记录
比如我们要去除“测试回退版本”这次记录,回到“vue项目屏幕适配”,只需要找到“vue项目屏幕适配”的commit 也就是红色框出来的位置
git log后,按q 进入输入状态;输入命令
第二步,找到要回退的版本
git reset --hard 3ba743c2d60be945785f29b7eac589ee56f619dc
或者
git reset --hard 3ba743c (提交前几位值也可以)
第三步,强制推送到远程仓库
git push -f -u origin dreamy
-f 强制推送
可以看到命令执行完再次查看记录已经没有了“测试版本回退”的提交记录了~
在 JavaScript 中,可以使用 if 语句来校验密码是否正确。
下面是一个简单的示例,假设你有一个表单,其中包含一个输入字段,用于输入密码,以及一个按钮,用于提交表单。在这个例子中,密码的正确值是 "password":
<form> <label for="password">请输入密码:</label><br> <input type="password" id="password" name="password"><br> <button type="submit" onclick="checkPassword()">提交</button> </form>
好的,我来给你介绍一下如何使用 Java 来实现五子棋游戏。
首先,你需要准备一个二维数组来表示棋盘,其中 0 表示这个位置没有棋子,1 表示黑色棋子,2 表示白色棋子。
然后你需要编写一个函数来判断当前局面是否有一方胜利。可以按如下步骤来判断:
枚举棋盘上的每一个位置,如果这个位置有棋子,就向四个方向(上下左右)扩展,如果有五个连续的相同颜色的棋子,就表示这一方胜利。如果棋盘已经满了,但是没有一方胜利,就表示平局。 示例代码如下:
``` public class FiveChess { // 定义棋盘大小 private static final int ROW = 15; private static final int COL = 15; // 定义棋盘数组 private int[][] chessBoard;
public FiveChess() { // 初始化棋盘数组 chessBoard = new int[ROW][COL]; } // 判断是否有一方胜利 public boolean checkWin(int x, int y, int color) { // 向左搜索 int count = 1; for (int i = x - 1; i >= 0; i--) { if (chessBoard[i][y] == color) { count++; } else { break; } } // 向右搜索 for (int i = x + 1; i < ROW; i++) { if (chessBoard[i][y] == color) { count++; } else { break; } } if (count >= 5) { return
目录
一、引入moment.js
1.Node.js方式引入
2.浏览器方式引入
二、moment时区和转换
1.时区的设置
2.UTC和北京时间的互转
三、使用
1.获取时间
2.......
.js:是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率。日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等。下面就是我对moment.js使用过程中的整理,方便以后查阅。
官网:文档 | Moment.js 中文网
一、引入moment.js 1.Node.js方式引入 (1)安装
npm install moment 或者 yarn add moment (2)引入
// require 方式 var moment = require('moment'); // import 方式 import moment from 'moment'; 2.浏览器方式引入 <script src="moment.js"></script> 二、moment时区和转换 1.时区的设置 // require 方式 require('moment/locale/zh-cn') moment.locale('zh-cn'); // import 方式 import 'moment/locale/zh-cn' moment.locale('zh-cn'); //使用utc时区,后面可继续添加相关获取时间或格式化操作 moment.utc() 2.UTC和北京时间的互转 2.1 目标是UTC时间,则用moment(utcTime).utc()方法,举例:
moment(utcTime).utc().format('YYYY-MM-DD HH:mm:ss') 2.2 目标是北京时间,则用moment(utcTime).utcOffset(8)方法,举例:
moment(utcTime).utcOffset(8).format('YYYY/MM/DD HH:mm:ss') 三、使用 1.获取时间 (1)获取当前时间
Mac 必备的 8 款软件工具,强烈推荐 这些软件都是小编自己在用的,通过下面的截图也可以看得出来,真的非常好用,你可以不用但是不能不知道这些软件
一、Paste ⇲ 一款简单且强大的剪贴板工具,使用快捷键 command + shift + V 调出历史剪切板面板,支持图片、文本、文件、视频等多种格式,而且还支持搜索分类,工作效率提升 800%
二、Snipaste ⇲ 国民级截图神器,通过快捷键 F1 开始截图,可以标注或贴到屏幕上,功能完善,操作简单而最重要的是所有功能均免费
三、MacZip ⇲ MacZip (原 eZip) 是一款支持压缩包内文件预览的全能型 Mac 解压缩应用。支持 rar, zip, 7z, tar, gz, bz2, iso, xz, lzma, apk, lz4 等超过 20 种常见压缩格式。完美处理加密解密、中文乱码等问题!批量文件加密,永久免费!
四、Downie ⇲ Mac 必备视频下载神器,支持大多网站视频下载,其中 哔哩哔哩、YouTube 等还可以设置 4K 分辨率下载,赞~
五、Permute ⇲ Downie 的兄弟软件,主要用于视频、图片、音频等格式的转换,功能十分强大,与 Downie 搭配使用,犹如喷子加狙,还有谁!
六、Magnet ⇲ 桌面窗口管理软件,可以通过快捷键去控制应用窗口大小
如图:有多种快捷键操控你的应用窗口
七、One Switch ⇲ Mac 系统快捷开关控制,我们的 Mac 有很多设置隐藏的比较深,这款软件将常用的开关设置都集成到了一起,像显示隐藏文件、一键推出所有磁盘、清洁你的Mac等功能非常实用
八、Bartender ⇲ 菜单栏管理器 - 它能够让你设置你的菜单栏显示哪些软件,隐藏哪些软件,甚至还可以设置微信来消息显示微信图标,没有消息时就隐藏,还可以调整间距等操作,功能十分强大。让你的菜单栏更加的简洁美观
说到MySQL中的查询语句,就不得不说说SQL语句的分类,一共分为三大类或者四大类。
三大类主要为:
DDL(数据库定义语言,不可被ROLLBACK回滚)CREATE \ ALTER \ DROPDML(数据库操作语言,可以被ROLLBACK回滚)INSERT \ DELETE \ UPDATE \ SELECTDCL(数据库控制语言)COMMIT \ ROLLBACK 四大类则是将DML中的SELECT查询单独列为DQL(数据库查询语言)
最基本的SELECT语句:
1. SELECT 字段1 , 字段2 , .... , FROM 表名;
mysql> SELECT bid , bname , pubDate FROM book; +---------+---------+---------------------+ | bid | bname | pubDate | +---------+---------+---------------------+ | ISBN001 | java | 2002-02-09 00:00:00 | | ISBN002 | .net | 2003-03-09 00:00:00 | | ISBN003 | java | 2002-02-09 00:00:00 | | ISBN004 | MySQL | 2003-03-09 00:00:00 | | ISBN005 | jav | 2002-02-09 00:00:00 | | ISBN006 | 42.
排序是Excel中最常用的功能之一,也是数据分类和汇总操作的重要前提。excel如何排序?本文介绍如何给Excel里面的数据进行排序,方法很简单。感兴趣的朋友,赶紧来看看吧!
操作环境:
演示机型:Dell optiplex 7050 系统版本:Windows 10 一、常规排序 有没有什么快速排序的方法?excel如何排名次?可以看看这个方法:常规排序。方法简单又快速。
操作步骤:鼠标箭头放在你要进行排序的地方,例如,箭头放在【销量】列下的任意单元格。然后鼠标右键单击,在弹出的菜单栏中,选择【排序】。然后你就可以在排序的右侧看到【升序】、【降序】,根据你自己的需要选择即可。如下图:
二、关键字排序 除了上面的常规方法,有没有可以按照自己的需要来进行排序的方法?excel如何按照自己要求排序?那就看看下面关于关键字排序的方法。
操作步骤:
步骤1:首先选中Excel里面的所有数据,在页面的上方找到【数据】,并点击它。再点击【排序】。如下图:
步骤2:点击【排序】后,你就可以在里面输入数据。比如:在【主要关键字】选择【销量】,在【排序依据】这里选择【单元格值】,在【次序】选择【降序】。如下图:
备注:里面的内容可以根据你的实际情况来调整。
步骤3:如果你想要另外添加条件,就直接点击窗口上方的【添加条件】。例如:在【次要关键字】选择【价格】,【排序依据】仍然选择【单元格值】,【次序】也选择降序。根据你的需要选择就可以了。如下图:
数据分类是数据分析的重要组成部分。excel如何排序?我们可以按照多列甚至一列来对Excel数据进行排序,排序可以按照升序或降序执行。以上的两个方法都有详细讲解,有需要的朋友赶紧操作起来!
往期推荐:
电脑怎么隐藏文件夹?6个步骤完成!https://mp.csdn.net/mp_blog/creation/editor/128370947如何磁盘格式化?分享格式化U盘的3个方法https://mp.csdn.net/mp_blog/creation/editor/128344795
OrangePi5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备) 说明 本文的软路由作为家中的二级路由,用一根网线连接主路由的LAN口和二级路由的WAN口(当主路由使用配置类似)
如果你想要作为旁路由或中继路由使用,在本文末尾会有相应文章的链接,但是Docker以及网卡的配置有一些坑建议参考本文。
准备 在开始安装之前,你需要准备好一些设备。
OrangePi5(其他版本或者树莓派都可以)刷有系统的TF卡(以香橙派官方提供的Ubuntu镜像)电源一个USB的网卡(我这里用的是绿联的千兆网口,型号是AX88179。如果你的设备有多个网口的话就可以不用这个了)双绞线若干 首先将香橙派组装好,插上USB网卡并在设备自带的网口上插上网线(网线另一端为主路由器的LAN),通电,进入系统(刷系统以及SSH配置等环节不是本文重点,详细看我以前文章或自行百度,本文默认基本环境已经配置完成并且读者能在终端简单使用vim等)
如果你要拿本设备当作主路由使用,但是身边没有其他路由器可用来帮助配置,可以将PC的网口与设备的网口用一根网线对等连接,只不过PC的默认网关必须手动设置为设备的IP地址。对等配置的方法可参考文章双网口主机通过 docker 安装 openwrt 实现软路由功能-CSDN
连接设备 使用你的PC通过SSH连接香橙派,或者直接在香橙派上接屏幕和键盘在终端中执行
网卡配置 获取信息 在终端中执行以下命令检验USB网卡是否挂载
lsusb 如果出现对应的设备信息,应该就是成功了(这里的AX88179就是我的USB网卡)
Bus 001 Device 002: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet 再执行以下命令
ifconfig 一般设备自带的名称为eth0,记录它被分配的IPv4地址及子网掩码。
而USB的网卡名称与品牌和型号有关,我的名称是enx后面跟上mac地址,这需要根据你自己的情况做判断,本文以enx名称为例。(如果设备是双网口而不是用的USB网卡的话,此处应该是eth1,若果是无线网卡的话应该是wlan0。不绝对,仅供参考)
除此之外我们还要拿到默认网关的地址(默认网关一般是所连接的路由器的地址)
route -n 找到Destination字段为0.0.0.0的那一行的Gateway字段对应的地址即为默认网关
例如我拿到的ip为192.168.1.24,子网掩码为255.255.255.0,默认网关为192.168.1.1,下文将以此地址为例进行配置(你的可能跟我不一样,在配置的时候以你为准)。
另外补充一点,我们会在接下来将eth0对应的网口作为WAN口,env对应的外接USB网口作为LAN口。
开启网卡的混杂模式 执行以下命令,将上述网卡设置成混杂模式
ip link set eth0 promisc on ip link set env promisc on 要取消的话将上述命令的on改为off即可
开启ipv4转发 修改配置文件
vim /etc/sysctl.conf 添加一行配置
net.ipv4.ip_forward = 1 或者将原文件中的net.ipv4.ip_forward = 1注释给取消
'InstructPix2Pix Learning to Follow Image Editing Instructions是一篇非常有意思的文章,有意思说的是效果,要做出论文的效果过程并没那么顺利。首先需要微调GPT3模型,这个花钱花力气,在之前的文章里已经提过,可以参考finetune一个GPT3。在此基础上稍微修改一下prompt2prompt的代码获取相关样本,然后再按论文的方法修改网络和初始化权重,fine tune一下stable diffusion。代码放在: xuduo35/InstructPix2Pix
此处,咱就demo一下效果。
python3 stable_txt2img.py --ddim_eta 0.0 --n_samples 4 --n_iter 1 --ddim_steps 50 --ckpt logs/instruct/checkpoints/last.ckpt --W 256 --H 256 --init_img ./samples/tower.jpg --prompt "add fireworks-in sky"
python3 stable_txt2img.py --ddim_eta 0.0 --n_samples 4 --n_iter 1 --ddim_steps 50 --ckpt logs/instruct/checkpoints/last.ckpt --W 256 --H 256 --init_img ./samples/tower.jpg --prompt "add fireworks-in sky" --negprompt "blurred"
python3 stable_txt2img.py --ddim_eta 0.0 --n_samples 4 --n_iter 1 --ddim_steps 50 --ckpt logs/instruct/checkpoints/last.ckpt --W 512 --H 512 --init_img .
初识Express Express简介 官方给出的概念: Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架
通俗的理解: Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的
Express的本质:就是一个npm 上的第三方包,提供了快速创建Web 服务器的便捷方法
Express 的中文官网
Express 能做什么 对于前端程序员来说,最常见的两种服务器,分别是:
Web 网站服务器:专门对外提供 Web 网页资源的服务器API 接口服务器:专门对外提供API 接口的服务器 使用Express,我们可以方便、快速的创建 Web 网站的服务器或API 接口的服务器
Express 基本使用 Express 安装 初始化根目录 npm init -y安装express npm i express@4.17.1 创建基本的服务器 app.listen(端口号, 启动成功后的回调), 启动服务器
// 导入express const express = require('express') // 创建web服务器 const app = express() // 调用app.listen(端口号, 启动成功后的回调), 启动服务器 app.listen(8099, function () { console.
mac版本微信中并没有指定备份路径的功能,备份的聊天记录文件也在一个很难找的位置。对于使用256g硬盘的mac的用户,微信聊天记录动辄十几G、几十G的大小,会造成非常严重的硬盘容量恐慌。所以把微信备份文件迁移到外置硬盘是一件非常有意义的工作。
微信的备份路径 微信的备份在 ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9这个目录下面的 Backup 文件夹里面。
每一个微信账号的聊天记录备份对应这个目录下的一个文件夹(名称为一长串的字母及数字)
知道了文件备份在那个目录,其实我们只需要每次备份完成之后,把这个里面的文件夹剪切粘贴到移动硬盘的指定位置即可。
需要恢复备份的时候再从移动硬盘里面把文件拷贝回这个目录即可。
软链接备份 前一种方式操作起来稍微有点麻烦,需要自己来回复制,怎么才能省略掉这两个手动复制粘贴的操作呢,答案就是使用软连接的方式。
如果你的mac版微信没有执行过备份操作,那可能没有这个Backup目录,或者Backup目录下面没有子目录,为了保证文件权限一致,需要先执行一次备份生成这个目录(无需全量备份,只备份一个人的聊天记录都行)
备份完成之后,将该 Backup 目录复制到移动硬盘下的某个目录,比如 /Volumes/硬盘名/backup/wechat
复制完成之后就可以把微信默认备份路径下的 Backup 目录删除了,当然你不放心的话,也可以删除前先备份一下。
然后创建软连接,打开终端,执行如下命令。(注意。此处的 硬盘名 要改成你自己的外置硬盘的盘符名称)
ln -s /Volumes/硬盘名/backup/wechat/Backup ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9/Backup 此时就能看到软连接已经创建好了,微信目录下的Backup已经指向到了移动硬盘下的Backup目录
第一步的时候我们已经备份了一次,此时进入微信的备份设置那里进入管理备份文件栏目之后,按道理是能看到一个备份的,但是实际上却毛都没有,这又是闹哪样呢因为mac下的应用是以沙盒模式运行,无法直接读取不在该应用程序目录以外的目录,所以虽然创建软连接把备份目录指向外置硬盘了,但实际上还是读取不到的。要解决这个问题需要先退出微信,然后重新签名微信,再执行如下代码即可给微信重新签名。 sudo codesign --sign - --force --deep /Applications/WeChat.app 重签之后再打开微信,再次进入管理备份文件 栏目,会弹出一个是否允许访问外挂硬盘的提示,点击同意之后就能看到我们之前的备份了。
Ending 软链接的方式更方便,只要硬盘插着的,你执行备份、恢复的操作都会直接走移动硬盘,相当于直接正常操作就会把文件备份到移动硬盘里面。既不占用电脑存储空间,又不需要额外操作。
今天使用Ubuntu的时候发现root密码忘了
于是,在网上找各种方法来解决,尝试了很多,最后推荐一种非常好用的方式
步骤如下:
1. cmd打开命令提示符窗口(管理员权限)
2. 输入 wsl -u root 登录root用户
3. 输入passwd 修改密码
4. 修改成功
操作实例:
好的,我可以给你一些用 C 语言实现简单加密的思路。
首先,你需要有一个加密算法。最简单的加密算法之一就是按字母表顺序移位。例如,如果你想将所有字母向后移动 3 个位置,那么字母 A 就会变成字母 D,字母 B 就会变成字母 E,以此类推。
其次,你需要读入输入文本,并将其转换为你要加密的字符串。你可以使用 C 语言的 fgets 函数来读取一行文本,或者使用 scanf 函数来读取单个字符。
然后,你可以使用循环来遍历字符串,并对每个字符执行加密操作。你可以使用 C 语言中的 if 语句来检查字符是否为字母,并使用其他语句来执行移位操作。
最后,你可以使用 printf 函数将加密后的文本输出到屏幕上,或者使用 fprintf 函数将其写入文件中。
这是一个简单的例子,其中包含了这些步骤:
``` #include <stdio.h> #include <ctype.h>
#define SHIFT 3
int main(void) { char ch;
printf("Enter message to be encrypted: "); while ((ch = getchar()) != '\n') { if (isalpha(ch)) { if (isupper(ch)) { ch = ((ch - 'A') + SHIFT) % 26 + 'A'; } else { ch = ((ch - 'a') + SHIFT) % 26 + 'a';
什么是虚继承? C++支持多继承的形式,但若被继承的不同基类又同属与某一个接口类or基类的派生类,那么很容易产生经典的菱形继承问题,这样不可避免的带来了命名冲突,访问不明确的问题,如图所示:
虚继承解决的问题菱形继承是什么? 基类A派生出类B和类C派生类D同时继承自类B和类C,这时候基类A中的成员变量、成员函数在类D中变成了两份路径1:A–>B–>D;路径2:A–>C–>D 派生类中保留间接基类的多份成员,保留的成员分别存储在不同的直接基类下,虽然可以通过类+作用域的形式去访问修改,但这很容易产生bug,大多数情况下都是冗余的。
代码释义及原理分析 //base基类A class A { protected: int m_a; }; //派生基类B class B : public A { protected: int m_b; }; //派生基类C class C : public A { protected: int m_c; }; //派生类D class D : public B, public C { public: void Set_a(int a) { m_a = a; //访问不明确 C::m_a = a; //C中的a B::m_a = a; //B 中的a } private: int m_d; }; 这个问题在编译期就会报错,告知访问不明确,从D的内存布局上们也可以清楚的看到m_a变量会有两份,分别在Base Class B和Base Class C下面
一、设计要求 某单波束测深仪最大测量水深为300米,请根据《水声学原理》和《数字信号处理》相关知识,仿真设计该单波束测深仪的数字信号处理系统(包括模拟滤波器参数、采样频率、量化精度等工作参数;FIR/IIR滤波器设计,并对数字信号进行:匹配滤波;底检测;底跟踪和声呐图绘制等处理)。
(PS:需要全部代码文件文件请点击这里,需要Bellhop使用说明书请点击这里。)
二、采样数据模拟生成 1.理想条件下声呐采样波形生成
1.1假设出的理想条件:
(1)基于射线声学理论
(2)几何衰减按球面波传播衰减规律衰减,不考虑吸收衰减
(3)仅考虑水底的反射
(4)考虑在高斯白噪声背景下
(5)整个空间声速分布均匀
1.2在假设信号发射的时刻为零时刻的前提下,输入的参数说明
表1 输入参数说明
C=1500
声速
单位:m/s
f0=15e3
信号频率
单位:Hz
fs=f0*10
采样率,最高频率的5倍
单位:Hz
Tao=5/f0
信号脉宽
单位:s
Sample_time=0.1
采样时长
单位:s
SNR=60
信噪比
单位:dB
H=10
水深
单位:m
H1=5
发射换能器水深
单位:m
H2=5
接收换能器水深
单位:m
D=1
接收与发射换能器水平距离
单位:m
Re_coef_bottom
水底反射系数
单位:无
1.3生成发射信号并模拟反射环境
data_generation.m
function receive_signal = data_generation(c,fs,f0,Tao,Sample_time,SNR,H,H1,H2,D,Re_coef_bottom) %**********************************通信声呐水听器数据生成函数************************************ %几点假设: %(1)基于射线声学理论 %(2)几何衰减按球面波传播衰减规律衰减,不考虑吸收衰减 %(3)仅考虑水底的反射 %(4)考虑在高斯白噪声背景下 %(5)整个空间声速分布均匀 %***************************************输入参数说明****************************************** % c 声速 Unit:m/s % fs 采样率 Unit:Hz % f0 信号频率 Unit:Hz % Tao 信号脉宽 Unit:s % Sample_time 采样时长 Unit:s 假设信号发射的时刻为零时刻 % SNR 信噪比 Unit:dB % H 水深 Unit:m % H1 发射换能器水深 Unit:m % H2 接收换能器水深 Unit:m % D 接收与发射换能器水平距离 Unit:m % Re_coef_bottom 水底反射系数 存在半波损失 Ts = 1/fs; %采样时间间隔 sample_num = fix(Sample_time*fs); %采样总点数 nTs = (0:sample_num-1)/fs; %离散的采样时刻 sample_num1 = fix(Tao*fs); %信号的采样点数 nTs1 = (0:sample_num1-1)/fs; %信号的离散的采样时刻 receive_signal = zeros(size(nTs)); %用于存储水听器接收的信号 d0 = sqrt((H1-H2)^2+D^2); %两个换能器的直线距离 S0 = 1/d0; %直达波的声压幅值 Noise_var = 10^(-SNR/20)*S0; %白噪声的方差 %% 计算到达回波信号 real_time = d0/c; %信号的实际到达时刻 signal_start_time = fix(real_time*fs)+1; %信号第一个采样点的时刻 phase = (signal_start_time*Ts-real_time)/Ts*2*pi; %得到信号的第一个采样点的相位 receive_signal(signal_start_time:(signal_start_time+sample_num1-1)) = S0*sin(2*pi*f0*nTs1+phase); %模拟采样 receive_signal = receive_signal + Noise_var*randn(size(nTs)); %加入噪声 M=power(D/(2*H-H1-H2),2); d1=sqrt(M+1)*(H-H1); d2=sqrt(M+1)*(H-H2); dib= d1+d2 %反射波总路程 Sib=1/dib*Re_coef_bottom; %反射波的声压幅值 real_time = dib/c; %信号的实际到达时刻 signal_start_time = fix(real_time*fs)+1; %信号第一个采样点的时刻 phase = (signal_start_time*Ts-real_time)/Ts*2*pi; %得到信号的第一个采样点的相位 receive_signal(signal_start_time:(signal_start_time+sample_num1-1)) =.
需求如下:当写入SQL语句中有任意一个字段在数据库中存在时,不可写入,并返回具体的重复字段。 使用Java Steam处理数据集循环执行SQL需要多次执行SQL,适合单条件索引的情况下使用,现状是想执行少量的SQL实现需求,固出现以下SQL思路,欢迎讨论。
模拟需求如下:当id和name有任意一个名称重复的情况下,不可写入,并返回是id重复或者name重复。
建表SQL 模拟四条数据:
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES (1, 'name1'); INSERT INTO `sys_user` VALUES (2, 'name2'); INSERT INTO `sys_user` VALUES (3, 'name3'); INSERT INTO `sys_user` VALUES (4, 'name4'); SET FOREIGN_KEY_CHECKS = 1; 实现思路:
记账本应用程序的需求分析包括对应用程序的功能和性能进行评估,以确定应用程序的设计和开发应该包含哪些内容。
首先,应对记账本应用程序的用户进行用户调研,以了解用户的使用需求。这可以包括访问用户的使用情况,以及他们希望记账本应用程序具有哪些功能。
其次,应确定记账本应用程序的目标市场,以确定应用程序的设计应该如何进行。这可能会考虑该应用程序的使用者人群,以及应用程序的使用场景。
随后,应分析记账本应用程序的竞争对手,以了解应用程序的功能和性能应该如何与其他类似应用程序相匹配。
最后,应确定记账本应用程序的技术要求,包括所使用的硬件和软件平台,以及所需的网络连接情况。这可以帮助确定应用程序的设计应该具有哪些功能,以及如何使用这些功能来满足用户的需求。
💖🔥作者主页:计算机毕设老哥🔥 💖
精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻
Java实战项目专栏 Python实战项目专栏 安卓实战项目专栏 微信小程序实战项目专栏 文章目录 Java实战项目专栏Python实战项目专栏安卓实战项目专栏微信小程序实战项目专栏 一、开发介绍1.1 开发环境 二、系统介绍2.1图片展示 三、部分代码设计总结<font color=#fe2c24 >有问题评论区交流Java实战项目专栏Python实战项目专栏安卓实战项目专栏微信小程序实战项目专栏 一、开发介绍 1.1 开发环境 技术栈:spark+hadoop+hive
离线ETL+在线数据分析 (OLAP)+流计算+机器学习+图计算
二、系统介绍 2.1图片展示 注册登录页面:大数据可视化分析模块:管理员后面模块:
三、部分代码设计 package org.pact518 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.mllib.recommendation._ import org.apache.spark.rdd.RDD import scala.math.sqrt import org.jblas.DoubleMatrix object alsBatchRecommender { private val minSimilarity = 0.6 def cosineSimilarity(vector1: DoubleMatrix, vector2: DoubleMatrix): Double = vector1.dot(vector2) / (vector1.norm2() * vector2.norm2()) def calculateAllCosineSimilarity(model: MatrixFactorizationModel, dataDir: String, dateStr: String): Unit = { //calculate all the similarity and store the stuff whose sim > 0.
学习目标: Unity Shader的渲染渲染顺序中的透明材质
学习内容: 1、透明度测试
2、透明度混合
3、渲染队列
4、透明模型
缘由:一般渲染的话会根据深度缓冲来确定渲染顺序的,但是由于透明材质需要关闭深度写入,因为透明材质会混合队列中其他材质的颜色,不能用普通材质的方法来渲染,1和2分别讲两种实现透明的方式
1、透明度测试 比较极端的测试,如果片元的透明度不满足某个阈值,那么会被直接舍弃,否则会跟不透明片元一样进行深度测试、深度写入等,不考虑关闭深度写入的问题,结果只会是完全透明或者不透明
2、透明度混合 该方法可得到真正的半透明效果,核心理念是与将自身的透明度与已经存在颜色缓冲中的颜色进行混合,该方法要点是要记住如果是以 透明->不透明 物体的顺序进行渲染,那就先渲染不透明物体,再将颜色缓冲中的颜色与透明片元进行混合,如果反过来,是不透明->透明的话那么就不会渲染透明片元,所以渲染队列十分重要。
3、渲染队列 渲染队列可以理解为多个火车车厢,分别为多个组,会根据队列索引号来渲染,每个队列都有特定功能 我们上面讲过因为不能使用深度环存因此,渲染顺序十分重要,就有了渲染队列
4、透明模型 本项目为书籍自带的模型,实际效果如下
透明的部分为贴图特定的颜色分布,上面展示的是使用透明度测试的方法制作的,显示出来的两种极端要么完全消失,要么可见。
代码如下
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Unity Shaders Book/Chapter 8/Alpha Test" { Properties { _Color ("Color Tint", Color) = (1, 1, 1, 1) _MainTex ("Main Tex", 2D) = "white" {} _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5 } SubShader { Tags {"