亲测可行
一.下载依赖包 npm install -S file-saver xlsx npm install -D script-loader npm install xlsx 二. 在src文件夹下创建excel文件夹,导入Blob.js和Export2Excel.js文件并在使用的组件中引入 两个文件的地址:
链接:https://pan.baidu.com/s/10j6EPR-bK6ZL5AL5xOCiCw
提取码:118y
我在使用的组件中引入xlsx,没有放到全局
import XLSX from ‘xlsx’
- 导出 1.在template <el-table :data="tableData" style="width: 100%"> <el-table-column prop="index" label="id" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="nickName" label="描述"> </el-table-column> </el-table> <el-button type="primary" size="small" @click="export2Excel()">导出</el-button> 2.data中模拟数据 tableData: [ {'index':'0',"nickName": "小明是个帅哥", "name": "小明"}, {'index':'1',"nickName": "小红是个美女", "name": "小红"}, {'index':'2',"nickName": "小兰是个美女", "name": "小兰"} ] 3.在methods中定义方法 //在methods中定义方法 export2Excel() { require.
文章目录 前言最终成果详细步骤1.导入要用的库2.得到地址的函数3.传入地址后得到数据的函数4.将数据写入CSV5.将CSV转换成html,用pyecharts将数据进行可视化展示 完整代码补充 前言 主要内容:
简单地搭建了一个flask页面,自己输入要查找的城市和年份,返回该城市这一年的平均天气情况。
用pyecharts做了一个时间轴的可视化展示,感觉比较美观。
(这次的内容是在以前代码的基础上进行扩展的,这是之前做出来的项目 爬取天气信息,在他的基础上可以自己输入要找的城市和年份,并且用了flask搭建网页)
使用环境:
vscode;
各种python库(如何在vscode中安装python库请参照这篇链接在vscode环境里导入python库(三种方法) | 详细过程)
最终成果 大致效果:
这个是flask进入界面(比较简单,不够美观~~)
p.s. 之后对该页面进行了美化,可以参考我的这篇文章
效果图:
输入查找的城市之后,会像之前一样进行可视化展示(其实就是展示之前生成的html页面)
详细步骤 第一部分:
将得到网页地址,按照地址得到数据,解析数据,把数据写入CSV,将CSV转换成html 这些功能都以函数形式封装,并写到一个文件里 weather.py
1.导入要用的库 解析数据的,生成随机headers的库,可视化要用的库等等
from os import write import requests #替代浏览器进行网络请求 from lxml import etree #进行数据预处理 import csv #写入csv文件 import pandas as pd """ 生成随机headers """ from fake_useragent import UserAgent """ 可视化部分 """ #需要先导入pandas和pyecharts包 import pandas as pd #pandas主要用于数据分析 #可视化 from pyecharts import options as opts #导入配置项 from pyecharts.
//鼠标按下判断开台
private void GridMouseDown()
{
string statu = dataTable.Rows[0][“Status”].ToString();//获取餐桌状态
int people = Convert.ToInt32(dataTable.Rows[0][“People”].ToString());//餐桌容纳人数
int tabletypeID = Convert.ToInt32(dataTable.Rows[0][“TableTypeID”].ToString());//桌子ID
if (dataTable.Rows[0][“orderID”].ToString() != “”)//判断是否下单
{
OrderID = Convert.ToInt32(dataTable.Rows[0][“OrderID”].ToString());//获取订单ID
}
if(statu == “空桌”)
{
KaiTaiKaiTai orderKT = new KaiTaiKaiTai();
var orderKTViewModel = (orderKT.DataContext as OrderKtViewModel);
orderKTViewModel.TableTypeID = TableTypeID;
orderKTViewModel.People = people;
//弹出窗口
orderKT.ShowDialog();
if (DiningTable != null)
{
DiningTable();
}
}
}
进去之后就是一个页面选择菜品样式
然后查询出菜品样式
private void SelectAtion(WrapPanel wp)
{
//获取WrapPanel
WP = wp;
网络时代的到来使得电脑的普及率越来越高,而在面对电脑问题,还是一大堆疑问,很多其他学校的人问买电脑的时候要看什么配置啊,什么样的品牌会质量好而且又便宜,又需要考虑些什么性能等等,为此,小编就给大家带来了买电脑主要看配置的经验。
对于很多不懂电脑的小白来说,初次买电脑,往往不知道主要看什么,买笔记本电脑需要注意些什么?其实无论是台式电脑、组装电脑又或者笔记本,买电脑最重要的是看性能,而决定电脑性能的核心硬件,又是由CPU、显卡、内存、硬盘等硬件决定。下面,小编就来跟大家介绍买电脑主要看哪些配置。
买电脑主要看哪些配置
买电脑主要看什么?
硬件设备的性能是决定电脑优劣的关键因素。买电脑主要看CPU、显卡、主板、内存、硬盘等硬件的性能参数,电脑配置的好坏也取决于这些硬件性能参数。
1.CPU: 这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。
系统配置电脑图解1
2.内存: 内存的存取速度取决于接口、颗粒数量多少与储存大小(包括内存的接口,如:SDRAM133,DDR333,DDR2-533,DDR2-800,DDR3-1333),一般来说,内存越大,处理数据能力越强,速度就越快。
3.主板: 主要还是处理芯片,如:笔记本i965比i945芯片处理能力更强,i945比i910芯片在处理数据的能力又更强些,依此类推。
电脑配置电脑图解2
4.硬盘: 硬盘在日常使用中,考虑得少一些,不过也有是有一些影响的,首先,硬盘的转速(分:高速硬盘和低速硬盘,高速硬盘一般用在大型服务器中,如:10000转,15000转;低速硬盘用在一般电脑中,包括笔记本电脑),台式机电脑一般用7200转,笔记本电脑一般用5400转,这主要是考虑功耗和散热原因。硬盘速度又因接口不同,速率不同,一般而言,分IDE和SATA(也就是常说的串口)接口,早前的硬盘多是IDE接口,相比之下,存取速度比SATA接口的要慢些。硬盘也随着市场的发展,缓存由以前的2M升到了8M,现在是16M或32M或更大,就像CPU一样,缓存越大,速度会快些。
系统配置电脑图解3
5.显卡: 这项与运行超大程序软件的响应速度有着直接联系,如运行CAD2007,3DStudio、3DMAX等图形软件。显卡除了硬件级别上的区分外,也有“共享显存”技术的存在,和一般自带显存芯片的不同,就是该“共享显存”技术,需要从内存读取显存,以处理相应程序的需要。或有人称之为:动态显存。这种技术更多用在笔记本电脑中。
6.电源: 这个只要功率足够和稳定性好,稳定的电源是很重要的。
7. 显示器 : 显示器与主板的接口也一样有影响,只是人们一般没有太在乎。
电脑电脑图解4
怎么看电脑配置?
1.借助第三方软件,比如著名的硬件检测软件 Everest ,它可以详细的显示出电脑硬件的信息,Everest 软件非常的强大,是电脑装机必备的一个软件。其他还有一些比较好的电脑配置信息检测软件,比如优化大师、鲁大师等可以用来帮助你了解怎么看电脑配置。另外,专 门 检测cpu的软件:CPU-Z,专门检测显卡的软件:GPU-Z,专门检测硬盘的软件:HDTune,专门检测内存的软件:memtest,专门检测LCD显示器的软件:DisplayX,专家检测笔记本电脑电池的软件:BatteryMon 等等,大家可以下载这些软件来获取怎么看电脑配置的知识电脑配置单。
系统配置电脑图解5
2.还有什么办法看电脑配置呢,最直接的办法就看,点我的电脑-属性,属性下面有关于电脑配置的信息。右键“我的电脑”--属性(打开系统属性)--“硬件”选项下的“设备管理器”,里面就是电脑配置信息。 但请注意:这里的配置属性是可以通过特殊软件修改的,比如有些JS拿一些打磨品,修改为好的cpu,这种情况会出现二手电脑市场。
以上就是买电脑主要看哪些配置的解说了。
全国计算机等级考试一级WPS Office考试大纲(2021年版)
基本要求
1.具有微型计算机的基础知识(包括计算机病毒的防治常识)。
2.了解微型计算机系统的组成和各部分的功能。
3.了解操作系统的基本功能和作用,掌握Windows的基本操作和应用。
4.了解文字处理的基本知识,熟练掌握文字处理WPS文字的基本操作和应用,熟练掌握一种汉字(键盘)输入方法。
5.了解电子表格软件的基本知识,掌握WPS表格的基本操作和应用。
6.了解多媒体演示软件的基本知识,掌握演示文稿制作软件WPS演示的基本操作和应用。
7.了解计算机网络的基本概念和因特网(lntermet)的初步知识,掌握浏览器软件和OutlookExpress软件的基本操作和使用。
考试内容
一、计算机基础知识
1.计算机的发展、类型及其应用领域。
2.计算机中数据的表示、存储与处理。
3.多媒体技术的概念与应用。
4.计算机病毒的概念、特征、分类与防治。
5.计算机网络的概念、组成和分类;计算机与网络信息安全的概念和防控。
6.因特网网络服务的概念、原理和应用。
二、操作系统的功能和使用
1.计算机软、硬件系统的组成及主要技术指标。
2.操作系统的基本概念、功能、组成及分类。
3.Window。操作系统的基本概念和常用术语,文件、文件夹、库等。
4.Window。操作系统的基本操作和应用∶
(1)桌面外观的设置,基本的网络配置。
(2)熟练掌握资源管理器的操作与应用。
(3)掌握文件、磁盘、显示属性的查看、设置等操作。
(4)中文输入法的安装、删除和选用。
(5)掌握检索文件、查询程序的方法。
(6)了解软、硬件的基本系统工具。
三、WPS文字处理软件的功能和使用
1.文字处理软件的基本概念,WPS文字的基本功能、运行环境、启动和退出。
2.文档的创建、打开和基本编辑操作,文本的查找与替换,多窗口和多文档的编辑。
3.文档的保存、保护、复制、删除、插入。
4.字体格式、段落格式和页面格式设置等基本操作,页面设置和打印预览。
5.WPS文字的图形功能,图形、图片对象的编辑及文本框的使用。
6.WPS文字表格制作功能,表格结构、表格创建、表格中数据的输入与编辑及表格样式的使用。
四、WPS表格软件的功能和使用
1.电子表格的基本概念,WPS表格的功能、运行环境、启动与退出。
2.工作簿和工作表的基本概念,工作表的创建、数据输入、编辑和排版。
3.工作表的插入、复制、移动、更名、保存等基本操作。
4.工作表中公式的输入与常用函数的使用。
5.工作表数据的处理,数据的排序、筛选、查找和分类汇总,数据合并。
6.图表的创建和格式设置。
7.工作表的页面设置、打印预览和打印。
8.工作簿和工作表数据安全、保护及隐藏操作。
五、WPS演示软件的功能和使用
1.演示文稿的基本概念,WPS演示的功能、运行环境、启动与退出。
2.演示文稿的创建、打开和保存。
3.演示文稿视图的使用,演示页的文字编排,图片和图表等对象的插入,演示页的插入,删除、复制以及演示页顺序的调整。
4.演示页版式的设置、模板与配色方案的套用、母版的使用。
5.演示页放映效果的设置、换页方式及对象动画的选用,演示文稿的播放与打印。
六、因特网(Internet)的初步知识和应用
1.了解计算机网络的基本概念和因特网的基础知识,主要包括网络硬件和软件,TCP/IP协议的工作原理,以及网络应用中常见的概念,如域名、IP地址、DNS服务等。
2.能够熟练掌握浏览器、电子邮件的使用和操作。
考试方式
1.采用无纸化考试,上机操作。考试时间为90分钟。
2.软件环境∶Windows 7操作系统,WPS Officece2012办公软件。
3.在指定时间内,完成下列各项操作∶
(1)选择题(计算机基础知识和网络的基本知识)。(20分)
(2)Windows操作系统的使用。(10分)
(3)WPS文字的操作。(25分)
(4)WPS表格的操作。(20分)
(5)WPS演示软件的操作。(15分)
(6)浏览器(IE)的简单使用和电子邮件收发。(10分)
文章推荐:
温馨提示:
想要了解更多的计算机等级考试题库请点击下载>>>计算机等级考试题库
gradle里面compileSdkVersion和buildToolsVersion版本过高,超过Android Studio支持范围
某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见操作,如查找数组元素、对数组元素进行排序等。现以排序操作为例,使用策略模式设计该数组操作类,使得客户端可以动态地更换排序算法,可以根据需要选择冒泡排序或选择排序或插入排序,也能够灵活地增加新的排序算法。
public class ArrayHandler { private Sort sortObj; public int[] sort(int arr[]) { sortObj.sort(arr); return arr; } public void setSortObj(Sort sortObj) { this.sortObj = sortObj; } } public class BubbleSort implements Sort { public int[] sort(int arr[]) { int len=arr.length; for(int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { int temp; if(arr[i]>arr[j]) { temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } } System.out.println("冒泡排序"); return arr; } } public class Client { public static void main(String args[]) { int arr[]={1,4,6,2,5,3,7,10,9}; int result[]; ArrayHandler ah=new ArrayHandler(); Sort sort; sort=(Sort)XMLUtil.
机房总安排表
鹤壁市机电信息工程学校计算机第一机房安排表
星期一星期二星期三星期四星期五一
二1233Flash1233AVID1233Word1234AVID1233AVID郑红霞北薛林莉北李建民薛林莉北薛林莉北1110计应用1234Flash11会计电算化1109计应用王相利南郑红霞北郭智花北王相利北三
四1234Flash1234AVID1233AVID1234AVID郑红霞北薛林莉北薛林莉北薛林莉北11计组装11动漫组装11计组装胡玉琴胡玉琴胡玉琴五
六11动漫组装1233Flash1234Word1233Flash1236PS胡玉琴郑红霞北李建民郑红霞北周艳芳北12023Dmax1109计应用王基文王相利北备注:1、上课老师请组织本班学生打扫机房卫生,下课后鹤壁市机电信息工程学校计算机第二机房安排表
星期一星期二星期三星期四星期五一
二1236PS1110计应用1229计应用1233Word1231计应用周艳芳南王相利北马红霞北李建民马红霞北1234Word1235Flash1236Flash1236Flash李建民北张红英南张红英南张红英南三
四1236PS1236Flash1236AE1235Flash1236AE周艳芳南张红英南吴辉南张红英南吴辉南1233Word1235Word李建民北温守坤五
六1218计应用1228计应用1230计应用1234Word1232计应用马红霞北马红霞北马红霞北李建民马红霞北1236AE1235Word1235Word1235Flash吴辉南温守坤温守坤张红英南鹤壁市机电信息工程学校计算机第三机房安排表
星期一星期二星期三星期四星期五一
二11会计电算化1210计应用1232AUTO11动漫VB1235AVID郭智花西任晓霞东闪双风西刘明月东周艳芳西11计算机VB11计组装1232AUTO11动漫VB1234Flash刘明月东胡玉琴东杨磊磊东杨磊磊东郑红霞东三
四11动漫VB11计算机VB1213计应用1216计应用1235AVID刘明月东刘明月东杨磊磊东杨磊磊东周艳芳西1211计应用1232AUTO任晓霞西闪双风西五
六1219计应用1217计应用1214计应用11动漫组装于九九东杨磊磊东杨磊磊东胡玉琴东1235AVID1229CD11工美CD1229CD周艳芳西秦蕾蕾西秦蕾蕾西秦蕾蕾西七
八12023Dmax王基文西
cat <<EOF 什么意思?
cat命令表示查看,而cat <<EOF命令表示将进行输入,直到以EOF终止符来结束输入(最后的新行)。EOF必须写在一行的头部,前面不能有制表符或者空格。如果结束符EOF前面有制表符或者空格,则EOF不会被当做结束符,只会被视为继续输入的状态。
简单的理解,就是随意输入一堆字符,当输入EOF的时候才真正结束。
如果还想写入到某个文件,可以 cat <<EOF > 某个文件,每次写入文件都会覆写而不是追加写。
这种是正确的写法:
cat <<EOF Hello,world! EOF
而<<-可以解决上面所说的问题:
cat <<-EOF Hello,world! EOF
虽然最后的EOF结束符前面有多个制表符和空格,但仍然会被当做结束符,表示输入的结束。输入内容是"Hello,world!"。
对于google浏览器,你只要点到“关于Chrome”界面,它就会自动更新,这对于开发人员来说非常的恶心,因此需要想办法阻止其自动更新。
第一步,首先是禁止Google更新服务
win+r,打开“运行”,输入services.msc,回车。
将两个Google 更新服务禁用掉(如果没有这两个服务,跳过这一步即可,不会影响到后边的操作)。
第二步,删除自动更新任务
win+r 打开“运行”,输入“taskschd.msc”,回车
删除掉google的所有更新任务(右键-->删除)
最后一步,修改Google浏览器自动更新目录的权限,使其无法访问此目录。
进入%HOMEPATH%\AppData\Local\Google目录,我们看到目录下有个Update文件夹,我刚开始想的是删除掉这个文件夹,但是后边还是自动更新了,因此可以推测浏览器会自动创建这个文件夹,并且生成里边的数据,所以我可以不删除这个文件夹,但是可以修改Update文件夹的访问权限,让浏览器无权限访问此目录,对于Update文件夹里边的东西,其实删不删都无所谓,不过最好还是删掉,因为他还是占用电脑存储空间的。
接下来一步步更改Update文件夹的权限,小板凳做好了。
1. 右键Update文件夹,打开属性,点到“安全”界面,然后点击右下角的“高级”
2. 点击禁用继承,选择“从此对象中删除所有已继承的权限”
3. 此时权限条目下边就全部为空了,然后点击左上角的更改所有者
4. 左边输入“Administrator” ,点击右边的检查名称,如果输入正确,会自动补全成下边这个样子,然后点击“确定”。
5. 此时可以看到Update文件夹的所有者已经成了Administrator,并且所有组或用户均不具有访问此对象的权限。然后点击“应用”,此时会有一个弹框提示,点击确定就行,最后一路确定,直到关闭属性窗口。
6. 现在双击进入Update目录,会提示无权限访问,你点击“继续”也访问不了,这下应该总算安全了吧。
此时你再去查看“关于Chrome”,会提示无法启动更新检测,完美。
int转CString int port = 8080; CString tempPort;
tempPort.Format(_T("%d"), port ); //Use Unicode Character Set
CString转int CString strData = “8888”
int data = _ttoi(strData)
使用 Unicode 字符,用_ttoi(),在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi()
————————————————
版权声明:本文为CSDN博主「pengshengli」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pengshengli/article/details/89092335
点击↑上方↑蓝色“编了个程”关注我~
这是Yasin的第 49 篇原创文章
Y说 今天没什么要说的。我个人很喜欢拍天空的照片,放一张前段时间晚上拍的照片吧。
join方法释放锁吗? 前段时间,有一个读者私信我,问了这么一个问题:Thread实例的join方法内部是调用的wait方法,而wait方法是会释放锁的,为什么网上很多文章(包括我们之前写的开源书《深入浅出Java多线程》)会说join方法不释放锁?
释放thread对象锁 我们先用书中的一个例子说起:
public class Join { static class ThreadA implements Runnable { @Override public void run() { try { System.out.println("我是子线程,我先睡一秒"); Thread.sleep(1000); System.out.println("我是子线程,我睡完了一秒"); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new ThreadA()); thread.start(); thread.join(); System.out.println("如果不加join方法,我会先被打出来,加了就不一样了"); } } 在这个例子中,我们在main方法中调用了thread.join(),打印出来的效果就是:
我是子线程,我先睡一秒 我是子线程,我睡完了一秒 如果不加join方法,我会先被打出来,加了就不一样了 这个例子想要表达的意图很简单,就是通过thread实例的join方法,达到main线程等待thread线程执行完后再继续执行的效果。
那join方法底层是如何实现这个功能的呢?究竟会不会释放锁呢?我们点进去看看源码。
if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.
[ACTF新生赛2020]crypto-classic1 题目
hint
哇,这里有压缩包的密码哦,于是我低下了头,看向了我的双手,试图从中找到某些规律 xdfv ujko98 edft54 xdfv pok,.; wsdr43 解题
看向自己的双手,xdfv ujko98 edft54 xdfv pok,.; wsdr43
键盘加密,每组字母包围起来的字母分别为:circle
解压,得到:SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}
提示是维吉尼亚加密,
c='SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}' m='ACTF{' a=[] for i in range(4): a.append(str(ord(c[i])-ord(m[i]))) print(m,end='') for i in range(5,len(c)): if 'A'<= c[i]<= 'Z': print(chr((ord(c[i])-int(a[i%4])-ord('A'))%26+ord('A')),end='') else: print(c[i],end='') 得到:ACTF{WHAT_A_CLASSICAL_VIGENERE}
最后将其中字母换成小写就行了
答案
flag{what_a_classical_vigenere}
[AFCTF2018]你听过一次一密么? 题目
Problem
25030206463d3d393131555f7f1d061d4052111a19544e2e5d 0f020606150f203f307f5c0a7f24070747130e16545000035d 1203075429152a7020365c167f390f1013170b1006481e1314 0f4610170e1e2235787f7853372c0f065752111b15454e0e09 081543000e1e6f3f3a3348533a270d064a02111a1b5f4e0a18 0909075412132e247436425332281a1c561f04071d520f0b11 4116111b101e2170203011113a69001b475206011552050219 041006064612297020375453342c17545a01451811411a470e 021311114a5b0335207f7c167f22001b44520c15544801125d 06140611460c26243c7f5c167f3d015446010053005907145d 0f05110d160f263f3a7f4210372c03111313090415481d49 解题
一次一密是无条件安全的。
那这道题应该是二次密码本加密了
参考关于Many-Time-Pad的某大佬笔记、关于ACTF解题笔记
写脚本中、、、、
算了,我放弃,还是来看大佬的吧:
import string import collections import sets, sys # 11 unknown ciphertexts (in hex format), all encrpyted with the same key c1='25030206463d3d393131555f7f1d061d4052111a19544e2e5d' c2='0f020606150f203f307f5c0a7f24070747130e16545000035d' c3='1203075429152a7020365c167f390f1013170b1006481e1314' c4='0f4610170e1e2235787f7853372c0f065752111b15454e0e09' c5='081543000e1e6f3f3a3348533a270d064a02111a1b5f4e0a18' c6='0909075412132e247436425332281a1c561f04071d520f0b11' c7='4116111b101e2170203011113a69001b475206011552050219' c8='041006064612297020375453342c17545a01451811411a470e' c9='021311114a5b0335207f7c167f22001b44520c15544801125d' c10='06140611460c26243c7f5c167f3d015446010053005907145d' c11='0f05110d160f263f3a7f4210372c03111313090415481d49' ciphers = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11] # The target ciphertext we want to crack #target_cipher = "
室内定位-架构设计(一) 一、 定位模式 快速定位 用于移动速度较快或路径弯曲的定位,A点跳到B点; 步行模式 慢速、匀速,A点平滑到B点; 导航模式 吸附,点位始终附着在最近路径上; 二、 SDK 蓝牙扫描sdk 扫描模式: 1)定位巡检模式 0 阀值 1~10(数字越大,精准度越高) 2)定位导航模式 1 阀值 1~5 (数字越大,越趋向于平滑,相对较为延迟1、2秒) 定位sdk 定位模式: 1)静止、运动状态检测 0(静止) 1(运动) 2)三边加权算法 (默认开启) 3)指纹算法 (指纹库对比默认不开启) 3)惯性 (根据静止、运动状态,经验值姿态平滑前行,需要配合三边加权纠正偏移) 地图sdk 1)2D地图:基于D3,svg矢量图 2)3D地图:基于Three 3D引擎; 三、基础功能演示 室内定位
19.给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
删除第n个结点,很容易就想到了先反转链表然后删除第n个结点后再反转过来,这样貌似要走很多次循环,一开始还怕过不了,但没想到实现效果貌似还行。 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ //反转链表 struct ListNode* reverseList(struct ListNode* head){ //p用来指向q指向的前一个指针,q用来遍历链表 struct ListNode *p = NULL, *q = head, *temp; while (q != NULL) { temp = q->next; q->next = p; p = q; q = temp; } return p; } struct ListNode* removeNthFromEnd(struct ListNode* head, int n){ if (n < 0 || head == NULL) return head; head = reverseList(head); struct ListNode *dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode)); dummyHead->next = head; int count = 0; struct ListNode *curNode = dummyHead; while (curNode !
segy格式道头中对应字节处的数据说明和su道头关键字的描述
1-4 tracl 测线中的道顺序号
5-8 tracr segy文件中的道顺序号,一般等于tracl
9-12 fldr 野外原始记录号,一般为炮号
13-16 tracf 野外原始记录的道号,一般为检波器号
17-20 ep 震源点号,一般与野外炮号相等
21-24 cdp 道集号
25-28 cdpt 道集的道数
73-76 sx 震源x坐标
77-80 sy 震源y坐标
81-84 gx 检波器x坐标
85-88 gy 检波器y坐标
参考链接https://max.book118.com/html/2018/0505/164759043.shtm
截图来自李宏毅2020机器学习深度学习。
有监督学习supervised learning需要提供一些有目标值的数据给机器去学习。用loss来判断函数的好坏,loss越小函数越符合我们的期待。reinforcement learning强化学习,机器自主进行学习。(Alpha Go是supervised learning + reinforcement learning)unsupervised learning无监督学习,给机器提供一些无目标值的数据去学习。meta learning:让机器学习如何去学习 文章目录 一、Regression(一)建模过程(二)误差来源(三)Gradient Descent 二、Classification(一)建模过程(二)Logistic Regression 三、Deep Learning(一)深度学习步骤(二)BackPropogation(三)卷积神经网络CNN(四)Tips for Traning DNN(五)PyTorch(六)图神经网络GNN(七)循环神经网络RNN 四、Semi-supervised Learning半监督学习五、Unsupervised Learning无监督学习(一)聚类Clustering(二)Dimension Reduction降维(三)word embeding词嵌入向量(四)Neighbor Embeding邻域嵌入方法(五)Auto-encoder 六、Explainable ML七、Attack ML Models八、Network Compression 一、Regression Regression应用:股票预测、无人驾驶、推荐系统。 (一)建模过程 步骤:
(1)构建模型(函数的集合,即同一函数式,但是有不同的权重和偏置);
(2)收集训练数据;有了训练数据然后通过一个Loss function(参数为函数,用于判断函数的好坏程度,而函数又是由权重和偏置来决定的,所以其实也是用来判断一组参数的好坏程度)
Loss function能够自己定义,常使用的一种定义如下:给定一个函数,即给定一个线性函数的权重和偏置,计算每一个训练数据根据该函数计算出来的y值与实际y值之间的偏差再求和。(最小二乘法)(w和b就是权重和偏置,y^就是实际值,n代表第n个值,并不是n次方,cp不用管,是题目里的一个下标)
(3)从函数集合中挑选出最好的一个函数,即Loss值最小的函数,也即找到使得Loss值最小的一组权重和偏置。 求解最好的一组权重和偏置的一种好方法是Gradient Descent,梯度下降,只要Loss函数是可微分的,Gradient Descent就能够帮助找到较好的参数。
比如Loss函数是一个参数的,可以穷举Loss函数的所有可能的情况,然后取随机值(取Loss函数上某一个点),计算微分(其实就是计算导数),根据计算结果大小即正负决定下一个值取在哪(事先规定一个η决定移动距离的远近),迭代多次,当导数结果为0时,则求得较好的参数,但可能是局部最优解(在线性回归中不会出现局部最优解这种情况,不会因为取随机值的不同而产生结果不同)。
当Loss函数是两个参数时,其实也差不多,仍然取随机的一组参数,然后分别计算对每个参数的偏微分(偏导数),然后再更新着两个参数,迭代多次找到较好的一组参数。
Gradient其实就是将求得的偏微分排成一个列向量。
实际例子:
(4)找出一组较好的参数后,也即确定了我们的模型,利用测试集来测试模型的效果,然后根据测试的效果再对模型进行调整优化,甚至是重新设计。(并不一定要设计过于复杂的模型,过于复杂的模型可能会导致过拟合现象,在训练集的表现很好,到测试集的表现就拉跨)因此我们要重新回到第一步,根据前面得到的模型,重新设置我们的函数集合。
(5)有了新的函数集合后,也要重新设计Loss函数,比如在原先的基础上加上用于Regularization(正则化)的一项用于平滑函数(λ后期要进行调整,平滑函数一般都只跟权重wi有关,跟偏置b无关,因为偏置b只是让函数上下移动0)。(比较平滑的函数在收到非正常输入的时候会受到较少的影响,在测试集上的表现可能会更好,但注意不能过于平滑)
(二)误差来源 我们构建出来的模型与实际存在误差的主要原因来源于偏差bias和方差variance。我们比较喜欢的模型就是低偏差和低方差的模型,偏差越小点距离中心就越近,方差越小数据就越集中。 较简单的模型的方差一般会比较小,因为不容易受到样本数据的影响,模型越复杂,方差就可能越大。
较简单的模型的偏差一般会比较大,而较复杂的模型偏差可能会比较小。较简单的模型包含的结果范围会比较小,可能并没有把中心值(实际值)包含进去,而较复杂的模型包含的结果范围会比较大,把中心值(实际值)包含进去的可能性更大。
可以看到,偏差随着模型的复杂程度上升而下降,方差随着模型的复杂程度上升而上升,由方差过大所引起的错误就是过拟合现象,由偏差过大所引起的错误就是欠拟合现象。
如果你的模型无法拟合你的训练集,那么可能你的模型的bias是大的,代表是欠拟合的,与正确的模型还存在着一定的距离。bias大说明目前你的模型可能并不包含实际值(实际的模型计算出来的值),那么接下来需要做的就是重新设计模型的式子(考虑更高方次或者更多的特征),模型不好收集更多的数据也没有作用。
如果你的模型可以拟合训练集,但是在测试集上表现并不好,那么可能你的模型的variance是较大的,代表是过拟合的。接下来要做的就是收集更多的数据(往往有困难,但不会对偏差bias造成影响),也可以对Loss函数进行Regularization,那么最终得到的模型也会变得平滑一点(多次训练得到的模型会相对集中一点,variance就会降低一点,但是可能会对bias产生影响,因为调整后每次训练后得到的模型会偏向于平滑的模型,可能没有办法包含实际的模型,这时候就需要在variance和bias做一下权衡)。
如果现在有训练集跟测试集的话,如果通过训练集得到几个模型后,然后通过测试集来选择最终的模型,那么这个模型对于实际数据来说可能效果并没有想象中那么好。较可靠的做法应该是这样,将训练集分成训练集和验证集,分出来的训练集拿来训练模型,验证集拿来选择最终的模型(如果觉得分成训练集和验证集后会导致原有训练集数据减少的话,那么也可以在利用验证集选择了最终的模型后,再拿原先整个训练集对这个模型进行再次训练),这样得到的最终模型在测试集上的表现,跟真实数据的表现才应该是差不多的。 如果觉得利用上面这种做法可信度不高的话,那么可以进行n折交叉验证得到最终模型。比如采用三折交叉验证的话,将原先的训练集分为三份,依次让三份中的两份当训练集,另一份当验证集,然后对利用上面这种做法得到的几个模型重新训练并计算平均错误率,然后找到一个最好的模型,再将原先完整的训练集在这个模型上进行训练。
(三)Gradient Descent Gradient Descent:前面提到用Gradient Descent来求解函数集中较好的一组参数,这里补充一些在进行Gradient Descent时的细节。 在进行Gradient Descent时,在选取随机的一组参数之后,需要对这组参数进行不断更新,在参数进行更新的时候,除了要计算参数的偏微分之外,还涉及到一个参数η(学习率),对这个参数的设置不能太大或太小,因为太小了的话更新参数每次走的步伐会比较小,loss值的下降比较慢;太大的话每次更新参数的步伐又太大,可能会跳过最优的那组参数,也可能卡在某处出现loss不变化的情况。很多时候当参数的个数变多之后,就无法将参数的变化跟loss值的变化可视化出来,但是可以将loss值的变化跟η的变化可视化出来,来判断η值的好坏。进行Gradient Descent的时候往往需要将画出loss随η变化而变化的图。
提示:聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容,不做示例演示。
1、聚合报告介绍 在使用JMeter进行性能测试时,聚合报告(Aggregate Report)可以说是必用的监听器。
(1)聚合报告的生成方式
聚合报告有2中生成方式:
在已有.jtl文件的情况下,直接选择加载文件即可生成聚合报告。在运行JMeter的过程中,动态生成聚合报告。 提示:我们一直使用GUI模式操作JMeter,所以看到的聚合报告组件中的内容,是第二种生成方式。等之后我们介绍非GUI模式操作JMeter时,会讲解第一种方式生成的聚合报告。
(2)聚合报告的数据来源
聚合报告中统计的数据来源,其实都是从统计的SampleResult中收集的数据。
需要特别注意的是:
聚合报告中的每一行,代表一个请求。注意:同名的请求会只显示一个,把结果合并。聚合报告中的每一列信息,是由SamplingStatCalculator类的不同方法实现统计的,相同名称的请求会共用同一个SamplingStatCalculator。不管是JMeter实时生成聚合报告,还是根据已经存在.jtl结果文件生成的聚合报告,最终的底层都是调用StatGraphVisualizer类的add(sampleResult)方法来生成表格的一行数据,传递的参数为每个请求的请求结果(sampleResult)信息。 add方法的调用时机:
1)根据.jtl文件生成报告时,每解析一行数据就调用一次add方法。
2)实时运行生成聚合报告,每请求一次,就调用一次add方法。
提示:
1、注意:使用聚合报告时,测试计划中不要用相同的的请求取样器名称。
2、观察聚合报告的结果发现,聚合报告是累加的,即每次运行的结果统计都是基于前一次运行的结果进行统计,包括发起的请求样本数等都是叠加的。
2、聚合报告界面详解 添加聚合报告组件方式:选中“线程组”右键 —> 添加 —> 监听器 —> 聚合报告。
界面内容如下图所示:
聚合报告界面说明:
名称:聚合报告组件的自定义名称,见名知意最好。注释:即添加一些备注信息,对该聚合报告组件的简短说明,以便后期回顾时查看。 (1)将所有数据写入一个文件
在JMeter中,我们可以将脚本测试中每个用户的访问内容,都存储到一个文件中。
需要操作聚合报告组件中的如下位置:
说明:
文件名:输入一个文件的完整路径,后缀可以为.csv,.html等。文件若不存在,则创建该文件;若已存在该文件,运行结果选择覆盖原有文件即可。
显示日志内容:
1)仅日志错误:仅保存错误的日志信息到文件中。
2)仅成功日志:仅保存正常响应的日志信息到文件中。
配置(configure):配置测试结果文件中需要记录的内容,可以依据自己需求来选择。
如下图所示:
提示:我们可以点击“浏览”按钮,选择已存储的聚合报告文件,来查看之前脚本的请求结果。
(2)聚合报告列表项介绍
1、Label:请求的名称,就是脚本中Sampler的名称。
2、#Samples(样本):总共发给服务器的请求数量,如果模拟10个用户,每个用户迭代10次,那么总的请求数为:10*10 =100次。
3、Average(平均值):默认情况下是单个Request的平均响应时间,当使用了Transaction Controller(事务控制器) 时,也可以用Transaction的时间,来显示平均响应时间 ,单位是毫秒。
4、Median(中位数):50%用户的响应时间小于该值。
5、90% Line(90% 百分位):90%用户的响应时间小于该值。
6、95% Line(95% 百分位):95%用户的响应时间小于该值。
7、99% Line(99% 百分位):99%用户的响应时间小于该值。
8、Min(最小值):最小的响应时间。
9、Maximum(最大值):最大的响应时间。
10、Error%(异常%):错误率=错误请求的数量/请求的总数。
11、Throughput(吞吐量):默认情况下表示每秒完成的请求数(Request per Second)。
12、Received KB/sec (接收数据):每秒从服务器端接收到的数据量。
13、Sent KB/sec(发送):每秒发送到服务器端的数据量。
背景介绍 中国科学院国家空间科学中心是中国空间科学及其卫星工程项目的总体性研究机构,面向全中国的空间科学创新平台,负责组织开展国家空间科学发展规划研究,具体负责中国科学院空间科学先导专项的组织与实施,开展空间科学及相关应用领域的创新性科学与技术研究工作,为空间科学先导专项及未来发展提供科学与技术支撑,引领空间科学发展,带动空间技术创新。
中国科学院国家空间科学中心的前身可追溯至开创了中国人造卫星事业的“中国科学院‘581’组办公室”(简称“581”组)。1
宣传幻灯片 百度百科 ↩︎
来源:Coursera吴恩达深度学习课程
这篇文章将探讨学习词嵌入的具体化,当我们应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵(embedding matrix)。
和之前一样,假设我们的词汇表有10,000个单词,词汇表里有a,aaron,orange,zulu,可能还有一个未知词标记UNK。我们要做的就是学习一个嵌入矩阵E,它将是一个300×10,000的矩阵,如果你的词汇表里有10,000个,或者加上未知词就是10,001维。这个矩阵的各列代表的是词汇表中10,000个不同的单词所代表的不同向量。假设orange的单词编号是6257,代表词汇表中第6257个单词,我们用符号O_6257来表示这个one-hot向量(这个向量除了第6527个位置上是1,其余各处都为0),显然它是一个10,000维的列向量,它只在一个位置上有1,它的高度和左边的嵌入矩阵的宽度(行数)相等。
假设用嵌入矩阵E去乘以O_6257,那么就会得到一个300维的向量,E是300×10,000的,O_6257是10,000×1的,所以它们的积是300×1的,即300维的向量。以此类推,直到你得到这个向量剩下的所有元素。得到的300维向量我们记为e_6257,这个符号是我们用来表示这个300×1的嵌入向量(embedding vector)的符号,它表示的单词是orange。
要记住我们的目标是学习一个嵌入矩阵E。在之后的操作中你将会随机地初始化矩阵E,然后使用梯度下降法来学习这个300×10,000的矩阵中的各个参数,E乘以one-hot向量会得到嵌入向量。但当你动手实现时,用大量的矩阵和向量相乘来计算它,效率是很低下的,因为one-hot向量是一个维度非常高的向量,并且几乎所有元素都是0,所以矩阵向量相乘效率太低。所以在实践中你会使用一个专门的函数(function)来单独查找矩阵E的某列,而不是用通常的矩阵乘法来做,但是在画示意图时(上图所示,即矩阵E乘以one-hot向量示意图),这样写比较方便。
在本篇文章中我们见到了在学习嵌入向量的过程中用来描述这些算法的符号(notations)以及关键术语(key terminology),矩阵E它包含了词汇表中所有单词的嵌入向量。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。
1.火狐浏览器有个好用的插件(releative xpath assistant)可以根据表格元素书写xpath,我将它用于按名称定位表格中的内容。
2.
2.1 相对定位 -- 以// 开头 如://form//input[@name="phone"]
2.2 绝对定位 -- 以/ 开头,但是要从根目录开始,比较繁琐,一般不建议使用 如:/html/body/div/a
3.
3.1【文本定位】使用text()元素的text内容 如://button[text()="登录"]
3.2【模糊定位】使用contains() 包含函数 如://button[contains(text(),"登录")]、//button[contains(@class,"btn")]
3.3 使用逻辑运算符 -- and、or;如://input[@name="phone" and @datatype="m"]
4.
nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点。..选取当前节点的父节点。@选取属性。
问题:一般生产环境的日志级别都在INFO及以上,程序出现异常则需要结合更详细的日志去分析问题。这时候就需要动态的更改日志级别,以便定位问题。
解决方法:
1.自定义api动态修改日志级别
2.手动修改logback-spring.xml文件, 在configuration根节点配置属性scan和scanPeriod,scan为true时,配置文件被修改会被重新加载,scanPeriod定义了扫描文件变化的周期,默认6000毫秒。生产出现问题可以手动去修改,这种方式适用于服务节点很少,弊端就是定位出问题需要将日志级别更改回去。
<configuration scan="true" scanPeriod="6000"/>
3. 集成第三方工具
1)集成boot-admin或actuator
pom.xml引入包
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
我们知道不少朋友在上网的时候,会遇到网络请求超时的情况,那造成网络请求超时的原因是什么呢?网络请求超时就是在程序默认的等待时间内没有得到服务器的响应.跟着小编一起来看看请求超时解决方法。
网络请求超时的原因:
1、网络不稳定,网络无法完整传送服务器信息 ;
2、网络断开,不过经常显示无法连接或是网络阻塞,导致你不能在程序默认等待时间内得到回复数据包 ;
3、系统:系统资源过低,无法为程序提供足够的资源处理服务器信息;
4、路由器、猫、网卡等设备故障,也会引起网络卡,建议先重启,如果不能解决,建议更换;
5、查看网络连接是否正常,可以给网络运营商打电话,要求查询线路,也可以将同网络内的其他人的网速限制一下;
6、全盘查杀病毒后重新联网。
7、电脑网卡驱动程序需要重新安装一下,再重新联网;
扩展资料:
网络连接超时常见解决办法:
1、检查网线,更换接口;
2、在早上上网人数少的时候注册;
3、使用加速软件,如果要下载东西尽量在没有网络使用需求情况下载;
4、杀毒;
5、如果使用网卡,可以更换一下网卡。
以上就是小编带来的网络请求超时怎么解决的全部内容,希望可以提供帮助。
搭建Hadoop环境(本地模式、伪分布模式和全分布模式) 1 Hadoop的目录结构和脚本1.1 核实已有配置1.2 安装Hadoop1.3 Hadoop环境变量配置1.4 Hadoop主要脚本命令 2 本地模式搭建3 伪分布模式搭建4 全分布模式搭建4.1 准备工作4.2 Hadoop部署4.3 hadoop启动 手动反爬虫,禁止转载: 原博地址 https://blog.csdn.net/lys_828/article/details/118635494(CSDN博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 Hadoop的目录结构和脚本 在进行Hadoop环境安装之前,需要对Hadoop的目录结构和主要脚本有个清晰的认知。
1.1 核实已有配置 在进行介绍之前核实一下之前的操作是否无误。
(1)首先看一下之前配置的主机名和IP地址(核实无误)
(2)防火墙关闭(核实无误)
(3)Java JDK和环境变量(核实无误)
(4)之前上传Java时候顺带上传了Hadoop安装包(核实无误)
其中最后面的tree-1.6.0-10.el7.x86_64.rpm文件就是执行tree指令要安装的一个文件
1.2 安装Hadoop 以上的内容核实无误后就可以进行Hadoop的安装了,解压安装包指令为:tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/
安装tree指令文件:rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
程序执行后的结果可以通过查看training文件夹下内容进行查看
至此Hadoop和tree都已经安装完成,那么就可以直接通过指令查看Hadoop的文件目录结构,具体的指令为:tree -d -L 3 hadoop-2.7.3/ 其中-d表示查看目录,-L表示查看深度,3表示3层,最后的输出结果为
1.3 Hadoop环境变量配置 既然是安装在Linux上的软件,为了方便使用,环境变量的设置必不可少。之前已经配置好了Java的环境变量,这里就是同样的操作,在Java环境变量之后追加Hadood的环境变量,代码指令和操作如下
切换路径:cd hadoop-2.7.3/
编辑环境变量:vi ~/.bash_profile
HADOOP_HOME=/root/training/hadoop-2.7.3 export HADOOP_HOME PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export PATH 环境变量生效:source ~/.bash_profile
环境变量检验:echo $HADOOP_HOME
然后是配置环境变量生效,进行echo检验
1.4 Hadoop主要脚本命令 开启服务:
Hadoop启动进程:start-all.sh(包含了启动HDFS和yarn)启动HDFS:strat-dfs.sh(对应NameNode、DataNode、SecondaryNameNode)启动yarn:start-yarn.sh(对应Nodemanager、ResourceManager) 关闭任务,将上面的start换成stop即可
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
该题目是个困难题,又没有什么思路(哭)。先来看题解的暴力解法,遍历找到字符串s中的所有长度大于等于字符串t的子串,然后再从这些子串中找到含有字符串t中的字符的字符串,最后再从这么符合条件的子串中找到最短的子串。
一到六章
第六章
第二章
第一章
第三章
第五章
第四章
趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
描述:
假设以ABCDEFG入栈(出栈顺序随机),现在给你一段出栈序列比如DACBEFG,判定是否满足FILO的要求。
思路:
先ABCDEFG进栈的时候看出栈序列,如果对上了,退栈,如果发现栈满了,或者到G都进完栈了,出栈的还是对不上,那就不满足,如果最后全都对上了,而且栈空了,那就是满足。
代码:
#include<stdio.h> int main(){ char v='A',s,Q[8]; Q[0]=v; int count=0,top=1; while(count<8){ scanf("%c",&s); count++; while(Q[top-1]!=s&&v<'H'){ Q[top++]=++v; } if(Q[top-1]==s&&v<='H'){ top--; } else{ break; } } if(top){ printf("0"); } else{ printf("1"); } return 0; } 栈这结构其实用一个数组和一个top指针就可以维护了,出栈的话是Stack[--top],入栈的话是Stack[top++],注意前置和后置的区别,然后出栈顺序有一个231invalid的性质,就是如果入栈顺序是123,那么是一定不会出现231的出栈顺序的。
ROS联合Webots实现机器人视觉巡线刷圈 注意:
再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识 ubuntu版本:20.04
webots版本:2021a
ros版本:noetic
前言 最近看到Youtube上大部分博主都在做巡线,笔者也来凑凑热闹。
此项目基于tianbot_mini机器人完成。
项目开源地址:tianbot_mini_webots
效果 小车已经设置为最高速度10
ROS控制方案 在功能包中添加opencv库因为机器人要行使,所以首先要使能电机要用到camera,所以使能camera调整camera的前瞻角度写opencv检测算法更具PID控制算法控制两个轮子的速度 1. 配置功能包 1.1 配置CMakeLists.txt 自己找到相应位置添加
set(CMAKE_CXX_FLAGS "-std=c++11") # 调用OpenCV配置:C++版本为11 find_package(OpenCV 4.2 REQUIRED) # 找OpenCV 4.2 安装路径 include_directories( ${OpenCV_INCLUDE_DIRS} # 加载OpenCV 4.2 安装路径 ) add_executable(tianbot_line_follow src/tianbot_line_follow.cpp) add_dependencies(tianbot_line_follow webots_ros_generate_messages_cpp) target_link_libraries(tianbot_line_follow ${catkin_LIBRARIES}) target_link_libraries(tianbot_line_follow ${OpenCV_LIBS}) # 使用到Opencv库需要通过Opencv链接库 2. 使能电机 笔者这边写了tianbot_velocity.cpp来使能左右电机,其主要代码如下所示:
// 初始化电机 for (int i = 0; i < NMOTORS; ++i) { // 速度控制时position设置为缺省值INFINITY(必须要这一步,否则webots会报错) set_position_client = n->serviceClient<webots_ros::set_float>(string("/tianbot_mini/") + string(motorNames[i]) + string("
安装环境
首先,在 Linux操作系统中压测,我们需要安装 JMeter环境,具体安装教程,可以看我这的另外一篇博客。 《Linux环境搭建JMeter》.
单机压测
安装好之后,我们将脚本文件上传到Linux,输入 jmeter -n -t 文件名称 进行压测
-n :命令行模式,no GUI-t :jmx脚本路径-l:jtl结果文件存放路径 压测数据分析
首先,我们看第三列的数据,每一行都是一串数字,这个数字则表示,在某个时间段我们的请求数,我们可以看到旁边有个 + 和 = 号,可以发现,第一列 1836 + 第 二列 12385 = 第三列的数据14221,由此我们不难发现他的请求数,是不断累计的。 下面我们可以看到,每30s秒,他的总请求数 这里显示的是我们的平均TPS,可以看到我们没秒钟可接收的请求数,平均是在453.0/s Avg 这个相信做过压测的朋友都不难理解,这里记录的是我们每秒的平均最小响应时间和最大响应时间。 这里显示的则是错误率,旁边是错误个数,后面是错误率。我们在压测的时候需要关注错误率,如果说错误率较高,那就意味着系统已经报错了,或者说脚本出现问题。那么我们需要进行排序错误原因。 Active:正在活动的线程数Started:已经启动的线程数Finished:已经结束的线程数 JMeter参数优化
我们进入到 JMeter的bin目录下,打开jmeter.properties配置文件
1、控制台取样间隔时间设置
summariser.interval=10,默认30s,最低可修改为6s
设置完成之后,我们可以除了第一次以外(因为这个跟Jmeter底层的配置有关),下方的数据,每10s就会更新一次。说明我们更改的配置文件已经生效了。
2、JVM参数优化
bin目录下, vi jmeter,修改HEAP的size大小,默认1024M,可以设置成2048M(前提是内存够) HEAP="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=256m"
3、默认编码修改
samplersult.default.encoding=UTF-8
jmeter结果报表
三种方式来获取JMeter的结果报告
在GUI模式下跑JMeter的脚本,用tps插件实时展示图标(在实际工作中,不推荐第一种执行方式,会影响JMeter的性能。)
在命令行模式下跑JMeter的脚本,生成jtl文件,在GUI界面的聚合报告里打开,可以展示tps和响应时间等。
使用如下命令,生成压测报告
jmeter -n -t Linux.jmx -l result2.jtl 执行之后,我们可以看到文件中新增了一个result2.jtl的文件
下面我们使用sz命令,将文件下载到我们电脑中。使用聚合报告打开文件即可
在命令行找下跑JMter的脚本,生成jtl文件,通过Jmeter自带的命令,生成html报表。
HTML报表生成步骤:
1、进入jmeter的bin目录下,修改reportgenerator.properties
2、修改jmeter.reportgenerator.overall_granularity = 1000(报表中数据展示间隔1秒)
两条命令顺序执行命令间加;(cd /usr/ ; ls)
du 查看大小 du -sh du -sh*
wc -l 统计行数
选择指定的shell,声明shell位置 Sha-Bang
#!/bin/bash
#这里表示注释
bash file.sh #(可以不用赋予执行权限就可以执行,会产生新的进程执行,执行完会回到当前目录) ./file.sh #(必须要有可执行权限,会产生新的进程执行,执行完会回到当前目录) source file.sh #(在当前进程运行,不会产生新的进程执行,执行完不会回到当前目录) .file.sh #(在当前进程运行,不会产生新的进程执行,执行完不会回到当前目录) 默认输入设备:标准输入STDIN文件描述符:0 /dev/xxx
默认输出设备:标准输出STDOUT文件描述符:1 /dev/xxx
标准错误输出:STDERR文件描述符:2 /dev/xxx
输入重定向 < 命令 < file.txt
输出重定向 >(清空输入) >>(尾部追加) 2>(错误重定向) &>(输出全部重定向)
设置变量
read 变量名(手动输入变量)
echo $变量名 (读取变量)
在脚本内生产另一个文件
cat > /date/file.sh <<EOF (EOF指定结束符)
(这里输入要写入文件的内容)
EOF(表示要写入的内容在这里结束)
shell 变量不区分类型,弱类型
设置变量
read 变量名(手动输入变量)
echo $变量名 (读取变量)
变量名=值 a=123 (不允许空格)谨防手抖
let为变量赋值 let a=10/2 计算性能最低(解释性脚本语言)
文章目录 前言1 终值(resolve)和拒因(reject)2 then3 then链4 then的顺延和async和await的使用4.1 `.catch`语法糖4.2 async和await的使用(只能返回成功的结果)4.3 try catch finally(能够返回失败的结果) 前言 本质是一个类:Promise(翻译:承诺;保证)
创建对象:new Promise时,传的函数叫执行器 这个执行器是立即执行的
作用:promise是为了让你更加优雅写异步代码,避免回调地狱。
回调地狱
回调地域,表示回调函数中嵌套回调函数。
利用回调函数实现异步有什么不足:如果层数非常多,就会出现回调地域,代码的可读性不好。
创建出来的promise对象有三个状态: 1)默认情况下,处于pending状态 pendding是等待 2)成功状态,fulfilled 3)失败状态,rejected 注意: 1)处理等待状态的promise,要么转化成成功状态的promise,要么转化成失败的promise。不可能既成功又失败。 2)如果一个promise从等待转化成了成功状态,就不可以再转化成失败状态。 3)如果一个promise从等待状态转化成了失败状态,就不可能再转化成成功的状态。 1 终值(resolve)和拒因(reject) 在执行器中,有两个参数,一个resolve,一个叫reject:
resolve(翻译:解决;决心):调用 resolve 以让promise对象从等待状态变成成功状态,调用resolve,可以传递一个终值(value)。reject(翻译:拒绝):调用 reject 可以让promise从等待状态变成失败状态,调用reject,可以传递一个拒因(reason)。 new Promise时,传的函数叫执行器 这个执行器是立即执行的。
let p1 = new Promise(function(resolve,reject){//两个参数 // "包包"叫终值 成功的结果 // resolve("包包") // 一旦成功了,就不能再转成失败态 // "没钱"叫拒因 失败的结果 reject("没钱"); }); // console.log(p1); // Promise { <pending> } pending是等待的意思 // console.log(p1); // Promise { '包包' } console.
charles 手机证书下载安装
本文的Charles,适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码;
用的版本是V4.1.2,其它版本原理类似;
charles如果不配置SSL通用证书;
会导致HPPTS协议的域名抓取失败/乱码的现象;
现在SSL越来越多,很多博客都上了SSL,支付相关的行业更是基础配置;
charles配置SSL证书,算起来很简单,操作简洁;
首先分析我们需要怎么做?
第一步:电脑端安装 Charles 的 CA 证书(必须)
charles需要下载安装ssl/https证书,因为charles是作为中间的过滤器使用的,具体原理请查看 charles使用教程
这样你就可以访问PC端的https资源了,windows/MAC原理一样;
第二步:电脑上charles的SSL抓取设置(必须)
charles并不是默认抓取ssl的,所以即使你安装完证书之后,Charles 默认也并不截取 Https的信息,你需要在SSL proxy里设置需要抓的域名;
当然如果你想抓取手机端的HTTPS相关资源,还需要下面的第三步;
(还不会手机抓包普通HTTP的,请点击 charles手机抓包设置 )
第三步:手机安装SSL证书;
无论IOS/Android,都需要安装SSL证书,原理是手机的SSL证书与电脑上charles SSL证书对接;
*****************************具体的操作方法**********************************
第一步:电脑安装SSL证书
选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,如果设置了安全防护,会ranging输入系统的帐号密码。
会让你开始安装charles的证书操作;
一路下一步即可;
第二步,配置SSL的抓取域名;
你可以单独配置,必须看到某个想要抓取的域名,右键点击“SSL proxying :Enableed”那么当前你设置后的域名,再次访问就可以抓到了;设置如下图
我个人并不喜欢这种的设置;每次都需要一个一个的配置,很蛋疼;
可以看到我上面的配置,那个“SSL proxying :Enableed”配置 默认就是灰色的,这是因为我做了通用设置的原因;我是设置为所有的HTTPS协议全部允许捕获;
我的设置如下;
首先找到proxy – SSL Proxying Settings;
然后选中启用SSL代理(Enable SSL Proxying),因为charles的location配置都是支持通配符的,所以在HOST里设置一个”*”就可以了,port不写;
如果你需要配置某个指定域名,也是在这里填写的;
配制特定域名的时候,一般port为443(SSL常规为443);
这样,你就可以愉快的抓取到HTTPS的内容了;
第三步:手机安装SSL证书(如果你需要抓取手机访问的HTTPS网站,需要做此设置,但如果你不需要手机抓取HTTPS,就没有必要安装了)
和上面类似,也是HTLP下面的 SSL Proxying,选择”Install Charles Root Certificate on a Mobile Device or remote Browser” (在移动设备或远程浏览器上安装SSL证书)
1. 问题描述:
你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。
示例:
输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987
说明:
n 的取值范围为 [1,8]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product
2. 思路分析:
分析题目可以知道最容易想到的思路是暴力枚举,这里使用到的一个技巧是每一次不是枚举两个数字然后再判断是否是回文数这里我们可以从大到小枚举回文数,也即从大到小枚举答案这样当我们找到两个n位数相乘的回文数之后可以直接返回。我们可以先生成当前n位数的最大值,将其转换为字符串之后得到a,将a翻转之后可以得到字符串b,那么num = a + b就是当前最大的回文串,使用一个循环来枚举能够凑成num的两个数字,可以枚举较大的那个数字,设较大的那个数字为a1,较小的数字为b1,则a1 >= b1,那么循环的条件为a1 * a1 >= num,因为如果a1 * b1能够拼成num,那么必然存在a1 * a1 >= a1 * b1 = num。
3. 代码如下:
class Solution: def largestPalindrome(self, n: int) -> int: # 当n = 1的时候只有3 * 3 = 9才是回文数其余的都不是 if n == 1: return 9 # maxv为n位数字的最大值 maxv = 10 ** n - 1 i = maxv while i: a = str(i) b = a[::-1] num = int(a + b) j = maxv # j * j要大于num才枚举 while j * j >= num: if num % j == 0: return num % 1337 j -= 1 i -= 1 return 0
在数据可视化中,地图是很重要的一个环节,很多时候需要展现的不仅是国家地图,还需要能从国家进入到省市。这个逐级进入的过程就是我们今天说的地图下钻。
地图下钻看起来很屌、很高大上,但是仔细琢磨一下,技术实现上真的很简单。
实现思路 这里以中国地图为例
•获取中国地图的 JSON 数据•绘制中国地图•监听下级层次地图(省级)的点击事件•获取所点击省份的 JSON 数据•擦除中国地图并重新绘制点击省份地图•递归上述过程直到市县级
技术实现 实现地图下钻效果需要庞大的地图数据,一个一个地图去下载真的是太浪费时间了,这里给大家介绍一个强大的地图API。
地址: http://datav.aliyun.com/tools/atlas 通过网址大家一定能看得出来点东西,没错,这个 API 就是传说中的大屏数据可视化天团-阿里 DataV 团队提供的。
为了给大家更加直观的展现地图下钻的实现过程,这里使用简单易懂的 Echarts 来实现。
定义绘制地图的方法 地图下钻的过程,需要不断的绘制地图,因此,首先定义一个绘制地图的函数。
这个函数共 4 个参数, geoJson 为地图 JSON 数据,name 为地图标题名称,chart 是 Echarts初始化实例,alladcode 是全国省市县的 adcode 代码数组(同样通过请求 API 获得)。这个所有的adcode地址不好找,给大家列出来:
https://geo.datav.aliyun.com/areas_v2/bound/all.json 地图绘制函数中使用了递归的方法。大家看下源码理解一下,应该很好理解的。
这里所有的地图数据请求均是通过 jQuery 的 Ajax 请求实现的。
实现地图下钻 我们定义好绘制地图的函数后,按照常规思路读取中国地图 JSON 数据并调用这个绘图函数,地图下钻完成!是不是很简单?
效果欣赏 小结 总结一下,实现地图下钻的过程,绘制中国地图,监听省份点击事件,点击省份获取对应省份地图 JSON 数据,然后递归上述过程即可。
这里仅仅是地图下钻的简单实现,有兴趣的小伙伴可以进一步优化实现,得到更加优美流畅的结果。
源码地址: https://xuxiaoyang.github.io/echarts/chinaDrill.html
文章目录 前言正文1.导入要用的包2.读取CSV数据3.处理数据3.1. 日期数据3.2. 月份数据3.3. 设置列名3.4. 取出可视化要用的数据3.5. 将数据可视化 完整代码遇到的问题 前言 主要内容:
爬取某城市天气信息,将一整年里每月份的各种天气出现次数以可视化形式展现出来
跟着b站教学视频做的
主要是提供自己初步学习爬虫的过程,为他人做个参考
准备:
用的vscode写的,没有特殊要求,如何安装库也有详细方法介绍
代码过程很详细,应该都能看懂,不需要大量知识储备。但是每个函数对应的详细讲解还是要靠自己了解,本文没有展开细讲
正文 这是文章的第一部分,讲了数据爬取和数据处理部分,并且以CSV形式进行了存储,接下来将数据进行可视化展示
第二部分:数据可视化
新建立了一个文件 data_show.py
1.导入要用的包 需要先导入pandas和pyecharts包,具体导入过程可以参考这篇文章在vscode环境里导入python库
#需要先导入pandas和pyecharts包 import pandas as pd #pandas主要用于数据分析 #可视化 from pyecharts import options as opts #导入配置项 from pyecharts.charts import Pie,Bar,Timeline #导入图形项 2.读取CSV数据 读取CSV数据存入df
视频里面用的是’gb18030’解码方式,但是我解码出来是乱码,后来试了一下’utf-8’解出来就可以了,这两种哪种可以就用哪种
还有一种解码是’gbk’,因为’gb18030’包含’gbk’,所以使用’gb18030’更好
#读取数据 #df=pd.read_csv('weather.csv',encoding='gb18030') # 可以使用'gb18030'或者‘utf-8’,哪个能跑出来结果就用哪个,其中gb18030范围比gbk大点 df=pd.read_csv('weather.csv',encoding='utf-8') #测试 #print(df['日期']) 这是CSV文件最终呈现效果
(我在vscode里面装了一个Rainbow CSV插件,让CSV里面每列数据颜色不一样,方便查看)
3.处理数据 3.1. 日期数据 将string字符串类型的日期数据转换成datetime日期格式的数据
用了匿名函数lambda,比较简单,自行学习
df['日期']=df['日期'].apply(lambda x:pd.to_datetime(x)) 3.2. 月份数据 因为要根据每个月的数据进行整合,所以用groupby() 函数分组,把数据存入df_agg
df['month']=df['日期'].dt.month #取出月份这个数据,方便后面进行统计 df_agg=df.
opencv-python 图像轮廓: link.
形态学开闭运算:link.
SKimage 目录1:link.
目录2:limk.
有关win10系统无法启动或停止“Modules installer服务”提示错误1053的操作方法想必大家有所耳闻。但是能够对win10系统无法启动或停止“Modules installer服务”提示错误1053进行实际操作的人却不多。其实解决win10系统无法启动或停止“Modules installer服务”提示错误1053的问题也不是难事,小编这里提示两点:1、在开始搜索框键入“services.msc”命令,按回车键打开本地服务设置窗口; 2、在右侧窗口找到并双击“windows Modules installer”服务;;掌握这些就够了。如果还想了解更多详细内容,可继续学习下面关于win10系统无法启动或停止“Modules installer服务”提示错误1053的操作方法的介绍。
推荐:
方法一:
1、在开始搜索框键入“services.msc”命令,按回车键打开本地服务设置窗口;
2、在右侧窗口找到并双击“windows Modules installer”服务;
3、进入“常规”选项卡设置界面,复制以下可执行文件的路径;
4、单击左下角的“开始”菜单,单击“运行”项;
5、在运行对话框中键入“regedit”命令,按回车键打开注册表编辑器;
6、在左侧窗口依次展开以下分支:HKEY_LoCAL_MACHinE/sYsTEM/CurrentControlset/services/Trustedinstaller,双击右侧窗口的“imagepath”键值,将刚才复制的可执行文件路径粘贴进去,单击“确定”。
方法二:
1、单击“开始”菜单,单击“所有程序”,单击“附件”,在命令提示符上鼠标右键“以管理员身份运行”;
2、然后再打开命令提示符窗口键入以下命令,按回车键即可写入注册表。
01sc config Trustedinstaller binpath= “%systemRoot%/servicing/Trustedinstaller.exe” 复制代码 sc config Trustedinstaller binpath= “%systemRoot%/servicing/Trustedinstaller.exe”
关于win10系统无法启动或停止“Modules installer服务”提示错误1053如何解决就给大家介绍到这边了,遇到这样情况的用户们可以采取上面的方法来处理,相信可以帮助到大家。
文章目录 前言正文1.导入对应模块2.确定爬取的网站3.得到数据4.数据处理5.将所得数据写入CSV 完整代码补充:数据可视化 前言 入门学习这个部分是跟着b站教学视频做的,记录了所有过程和代码。
然后在此基础上自己进行了扩展,简单地搭建了一个flask页面,可以自己输入要查找的城市和年份,返回该城市这一年的平均天气情况。
这是记录自我扩展部分的文章进阶学习·详细过程·爬取天气信息1(python+flask+pyecharts)
入门学习的效果图:用pyecharts做了一个时间轴,以可视化形式展示了每个月各种天气的对应次数
本篇会记录详细过程、遇到的问题及解决方案和全部代码的展示
照着代码敲就可以,基本不需要什么基础(毕竟我也是个新手,正在学习过程中)
正文 第一部分:数据爬取+处理
1.导入对应模块 import requests #替代浏览器进行网络请求 from lxml import etree #进行数据预处理 import csv #写入csv文件 2.确定爬取的网站 爬取网站为:https://lishi.tianqi.com/
选择对应的城市,此处我选择重庆,即爬取 https://lishi.tianqi.com/chongqing/ 网站内的天气信息
因为要爬取全年的信息,所以选择去年的天气
发现每个月天气对应的网站链接是有规律的
选择一月
选择六月
即发现url规律为 https://lishi.tianqi.com/chongqing/+年份+月份.html
将中间的“年份+月份”的变量命名为weather_time
其中,某些月份对应的数字需要进行处理,比如六月份要写成06,而不是6
将得到的月份信息都转化成string类型
'''得到url''' #发现url规律 +年份+月份.html for month in range(1,13): #range()左闭右开 #某年某月的天气信息 if month<10: weather_time='2020'+('0'+str(month)) else: weather_time='2020'+str(month) #也可以将上面的写成简洁的三元表达式 #weather_time='2019'+('0'+str(month) if month<10 else str(month)) url=f'https://lishi.tianqi.com/chongqing/{weather_time}.html' 3.得到数据 得到网站后,爬取天气信息并封装代码
写一个函数getWeather(url) 用于获取天气信息
3.1.
先在里面构造一个空列表weather_info=[],存储信息格式为[{‘日期’:…,‘最高气温’:…,‘天气’:…},{‘日期’:…,‘最高气温’:…,‘天气’:…}…],即记录每个日期对应的最高气温,天气等等信息
3.2.
设置一个请求头header。(如何得到该请求头请自行百度,很简单
3.3.
用 requests.
1、None类型为NoneType NaN类型为float
2、都能组成字典的Key {None:1} {Nan:1},并且认为为不同的key
3、Series函数中的表现:
s = Series([None, NaN, 'a']) s.map({None:1,'a':'a'}) s.map({NaN:1,'a':'a'})
s都转为1了
s.map({NaN:2,'None':1,'a':'a'})
NaN转为2,None不变
嵌入式/单片机printf的几种办法: 关键词:名词释义参考博客(大牛)打印的几种方式printf1软件仿真printf2串口重定向printf3SWO打印输出printf3.1名词释义3.2硬件接线3.3软件配置3.3.1SWO管脚配置3.3.2重定向代码添加3.3.3使用keil查看、设置3.3.3使用JLINK-SWO Viewer查看、设置 3.4查看效果3.5 SWO的其他功能 4Link-RTT打印输出5总结 关键词: ITM、SWO、semihosting、Keil Debug Viewer、RTT、串口重定向printf。
名词释义 ITM: https://blog.csdn.net/hanchaoman/article/details.
SWO: https://blog.csdn.net/weixin_30407613/article/details.
semihosting:半主机模式 https://blog.csdn.net/yhneng/article/details/6299893.
需要注意的是,我并没有学会半主机模式,该方式似乎是对调试器有特殊要求,JLINK不能实现,并且ARM后面又推出了ITM机制,所以下文不再讲述半主机的printf方式
Keil Debug Viewer : https://blog.csdn.net/yhneng/article/details/6299893.
参考博客(大牛) https://blog.csdn.net/ybhuangfugui/article/details/94378013
打印的几种方式printf 1.软件仿真打印输出
2.串口UART打印输出
3.SWO打印输出
4.JLink-RTT打印输出
printf方式优点缺点软件仿真printf无须硬件很多项目不能运行串口打印适用于正式运行产品、无须调试器串口打印耗时,影响MCU的实时性SWO打印不影响MCU的实时性必须使用仿真器RTT打印不影响MCU的实时性必须使用JLINK 来看一下实时性的对比图:
打印82个字符
RTT仅耗时1us
SWO耗时120us(速率设置为1500Khz)
半主机模式耗时10.7ms
串口打印耗时约1ms(波特率115200情况下)
在实时性上,RTT > SWO >串口 >半主机模式
1软件仿真printf 何为软件仿真printf? 就是只在集成开发环境中模拟printf仿真输出,不需要连接开发板(硬件MCU)即可实现。
这种方法非常不推荐,因为软件仿真与真实环境有很大的差异,很多工程代码,在软件仿真的时候根本跑不了。就会出现卡在某个地方不动的尴尬情况(软件仿真的时候会有绿色的方框,如下图)
如果你不清楚,可以参照,以下所有的博客都是指的软件仿真:
软件仿真https://blog.csdn.net/ybhuangfugui/article/details/94378195?
半主机模式的软件仿真https://blog.csdn.net/zhc335134701/article/details/81261070?
keil软件仿真https://blog.csdn.net/weixin_45380951/article/details/103372085?.
没错,基本上博客写明Use Simulator ,并修改Dialog DLL的情况都是软件仿真。
2串口重定向printf 这种方式有非常多的博客可以参考,例如:
串口重定向博客1https://blog.csdn.net/qq_39101111/article/details
串口重定向博客2https://blog.csdn.net/zouleideboke/article/details
串口重定向博客3https://blog.csdn.net/qq_22329595/article/details
该方式比较简单,不再重复论述。
3SWO打印输出printf 3.1名词释义 先看此博客使用SWO代替UART,实现Printf打印功能https://blog.csdn.net/qq_37663138/article/details
再稍微解释一下:
1 在Cortex-M3\M4\M7系列MCU中,内核的调试组件有一个仪器跟踪宏单元(ITM) 。请注意如果你的芯片是 Cortex-M0 或者其他ARM内核,不支持ITM
《力扣算法训练提升》图解数组篇-打卡数组统计-【435】最小移动次数使数组元素相等
数组的基本特性 数组是最简单的数据结构。
数组是用来存储一系列相同类型数据,数据连续存储,一次性分配内存。
数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。
囧么肥事今日打卡题目 力扣【435.最小移动次数使数组元素相等】
给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。
具体描述
解题讨论 跨步计算示例
讨论归纳
第一步:排序 第二步:遍历数组,计算跨步,即最大值和最小值差值 第三步:累加跨步 动画模拟 示例一:跨步计算
// 排序后计算跨步,最大值到最小值跨步累加就是操作次数 public static int minMoves(int[] nums) { // 4 1 9 3 // 1 3 4 9 排序后 // 9 11 12 9 跨步:8 // 12 14 12 12 跨步:3 // 14 14 14 14 跨步:2 Arrays.sort(nums); int count = 0; int min = nums[0]; int step = 0; for (int i = nums.
执行:
figure(); 会显示一个标题为Figure1的窗口。
figure(); figure(); 这样的话就会显示两块窗口,名字分别为Figure1,Figure2。
figure('Name', '显示图片'); 在括号中加入(‘Name’, ’ '),给窗口命名。
如果想要不显示前边的figure,可以在后边加上’NumberTitle’, ‘off’
figure( 'Name', '显示图片','NumberTitle', 'off'); 改变窗口的位置和大小要用到(‘Position’,[100, 100, 300, 200]),[]中前两个数值代表以左下角为原点的窗口的位置,后两个数值代表窗口的大小。
比如:
figure( 'Name', '显示图片','NumberTitle', 'off','Position',[100, 100, 300, 200]);
文章目录 方法一:配置在vscode环境里方法二:直接在vscode里面导入方法三:利用anaconda导入 如果vscode存储位置和代码存储位置不一致时,个人推荐第一种方法
方法一:配置在vscode环境里 步骤如下
1.打开vscode,随便运行一串代码,下方会有python具体安装路径出现
也就是这里c盘的地址(后面d盘的地址是我运行代码的保存地址,不用管
截取前面部分,即C:\Users\Rover\AppData\Local\Programs\Python\Python38-32
2.在电脑对应地址打开该文件夹,找到Scripts文件夹,进入,会发现有一个pip.exe,这就是用来安装的工具。
然后复制改文件夹地址: C:\Users\Rover\AppData\Local\Programs\Python\Python38-32\Scripts
3.win+r打开cmd,输入-cd C:\Users\Rover\AppData\Local\Programs\Python\Python38-32\Scripts 进入该文件夹
4. 此处以安装 python-pptx 为例,输入 -pip install python-pptx(替换成任意库名即可
5. 自动下载成功后会出现如下提示
到此结束
扩展: 他提醒我对pip进行升级,输入指令 python -m pip install --upgrade pip或者python.exe -m pip install --upgrade pip 即可
输入指令:
成功!
方法二:直接在vscode里面导入 在控制台输入 pip install option(写导入的库名,比如这里导入option)
方法三:利用anaconda导入 参考这篇文章通过anaconda安装python库
1、系统整体工作原理
(1)应用层->API->设备驱动->硬件
(2)API:open、read、write、close等
(3)驱动源码中提供真正的open、read、write、close等函数实体
2、file_operations结构体(用来挂接实体函数地址)
(1)元素主要是函数指针,用来挂接实体函数地址
(2)每个设备驱动都需要一个该结构体类型的变量
(3)设备驱动向内核注册时提供该结构体类型的变量
3、注册字符设备驱动
驱动向内核注册函数register_chrdev()在(#include <linux/fs.h>)中
4.从零开始编写一个驱动程序
首先应该有一个最简单的驱动程序原型,详细可见博客中-》linux驱动开发(最简单的驱动模块,内核printk函数)这篇。
(1)先定义file_operations结构体变量,在工程中随便搜索一个file_operations结构体变量看别人怎样定义的,再修改成自己想要的。
(2)open和close函数原型确定、内容填充。
找到file_operations结构体中的open函数,跳到open函数定义的地方,复制别人的open函数,修改成自己想要的,其他函数一样的道理。
(3)模块安装,注册驱动。
往模块安装函数里面添加注册驱动函数,以及返回值的检测。
主设备号的选择(cat /proc/devices 查看当前可用的主设备号,确定没用过的先随便定一个)
(4)模块卸载,
(5)最后编写好的驱动模块
#include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit #include <linux/fs.h> #define MYMAJOR 200 #define MYNAME "testchar" int mymajor; static int test_chrdev_open(struct inode *inode, struct file *file) { // 这个函数中真正应该放置的是打开这个设备的硬件操作代码部分 // 但是现在暂时我们写不了这么多,所以用一个printk打印个信息来做代表。 printk(KERN_INFO "test_chrdev_open\n"); return 0; } static int test_chrdev_release(struct inode *inode, struct file *file) { printk(KERN_INFO "
【问题背景】 电脑:Windows10系统,安装了docker
【操作步骤及现象】 打开已经安装的逍遥安卓模拟器电脑蓝屏重启,每次都会蓝屏 【问题原因】 在windows 10 系统上,我们会用vmware,virtual box ,hyper-v,安卓模拟器,360安全卫士的晶核模式等等,而这些都依赖vt技术,而vt只能独占,不能共用,所以,当你考虑让某个软件使用的时候,考虑让其他的程序不使用vt。
【解决办法】 1. 打开控制面板->程序->启用或关闭Windows功能,去掉勾选的hyper-v选项,重启电脑
2. 步骤1中,hyper-v并没有关闭彻底,需要使用bcedit指令进行关闭,操作步骤为:
按下键盘:win+x键,选择windows powershell(管理员),执行以下命令
bcdedit /set hypervisorlaunchtype off 3. 重启电脑后即可正常打开安卓模拟器
【备注】 如果想要开启hyper -v,使用以下命令:
bcdedit / set hypervisorlaunchtype auto
临时删除节点 hadoop-daemon.sh stop datanode hadoop-daemon.sh stop tasktracker 1在master中配置hdfs-site.xml <property> <name>dfs.hosts.exclude</name> <value>/usr/hadoop/hadoop-2.7.7/etc/hadoop/excludes</value> </property> 2将需删除的节点机器名添加到文件中 vim /usr/hadoop/hadoop-2.7.7/etc/hadoop/excludes #添加slave2 slave2 3主节点刷新 hadoop dfsadmin -refreshNodes 查看存活节点
hadoop dfsadmin -report 正在执行Decommission,会显示: Decommission Status : Decommission in progress
执行完毕后,会显示: Decommission Status : Decommissioned
4slave2上关闭进程 yarn-daemon.sh stop nodemanager hadoop-daemon.sh stop datanode #数据块均衡 start-balancer.sh 5删除主机名 从NameNode的excludes文件及slaves文件、hosts文件中去掉已经移除的主机名
在所有DataNode上执行hadoop-pull.sh脚本,同步配置。
一旦采用微服务系统架构,就势必会遇到这样几个问题:
这么多小服务,如何管理他们? ----组件来解决这些问题这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?这么多小服务,一旦出现问题了,应该如何自处理?这么多小服务,一旦出现问题了,应该如何排错? 对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。
如图所示组件
图片所示组件详解见下篇--微服务架构的常见概念
一、谷歌浏览器开发者模式
F12打开调试模式
【箭头图标】用于在页面选择一个元素来审查和查看它的相关信息,当我们在Elements这个按钮页面下点击某个Dom元素时,箭头按钮会变成选择状态【设备图标】切换到不同的移动终端设备模式,同时可以选择不同的尺寸比例【Elements】元素面板,查看Web页面的HTML与CSS,可以双击对当前页面进行修改【Console】控制台面板,JavaScript输出信息的控制台,在这里可以查看到JS的错误信息,也可以执行键入的JS脚本【Sources】源代码面板,我们在这个页面对JS代码进行调试,可设置断点【Network】网络面板,可以明确的查看到访问Web页面所产生的全部请求(包括应答状态、响应时间、数据量等信息)和下载的资源文件,并可以模拟不同的网络状态(在线、离线、3G等)下对Web的加载情况,可以用于分析和优化网页加载性能【Performance】性能面板,记录和查看Web页面在浏览器中运行时的性能表现,主要用于发现Web页面运行时性能瓶颈和性能调优【Memory】内存面板,记录执行JS函数对CPU和内存的使用情况,可以识别开销大的JS函数,跟踪内存泄露,帮助代码优化,提高JS执行性能【Application】应用面板,记录Web页面加载的所有资源信息,包括存储数据、缓存数据、图片、字体、JS脚本、CSS样式表等【Lighthouse】审计面板,从性能(Performance)、PWA兼容性(Progressive Web App)、可访问性(Accessibility)、最佳实践(Best Practices)、搜索引擎优化(SEO)这五个维度给出网站的评估报告【Security】安全面板,查看Web页面的安全和认证情况,确保网站上正确地实现了HTTPS 二、常用功能菜单
1、【Elements】查看,修改页面上的元素,包括DOM标签,以及css样式的查看,修改,还有相关盒模型的图形信息
2、【Console】打印和输出相关的命令信息,执行JS脚本
3、【Sources】1-资源区、2-工作区、3-监控台
资源区:
【Page】:展示当前Web页面所包含的资源文件(图片、CSS样式表、JS脚本等)
【Filesystem】:当我们的Web页面在本地时,我们就可以通过Filesystem选项卡,将本地项目文件夹添加到DevTools的工作区,以直接将对页面的修改保存到本地,还提供对本地文件进行管理(添加文件、删除文件、修改文件等)
【Overrides】:当我们的Web页面在远程服务器上,本地没有项目源码,我们也可以通过Overrides选项卡选定目录让DevTools创建一个文件夹来保存对远程Web页面的所有修改。修改完成后,用这些文件直接去覆盖远程服务器上的源文件就完成了页面的修改
【Content script】:用于存放的是Chrome扩展的“注入”页面的JS脚本的独立空间(这里的JS脚本共享页面DOM与消息机制,与页面的JS脚本互相不知道对方的存在,无法访问对方的变量和函数)
【Snippets】:可以在这里创建代码片段,并独立运行和调试,刷新页面不会丢失
工作区:
针对JS脚本可以添加/移除断点,在断点上打开右键菜单可以禁用断点,以及设置断点触发条件进行编辑
监控台:
【Watch】:跟踪监控变量,点击"+"号添加变量名
【Call Stack】:函数调用栈,显示执行路径
【Scope】:查看属性作用域
【Beakpoints】:这里可以查看到所有的断点启用状态及位置
【XHR/fetch Breakpoints】:当XHR的请求URL包含某一特定的字符串时所触发的断点
【DOM Breakpoints】:当改变一个节点或其子元素时所触发的断点
【Global Listeners】:全局监听器,绑定在 window 对象上的事件
【Event Listener Breakpoints】:事件发生时所触发的断点
说明:上图中“{ }”可以格式化JS脚本。
4、【Network】网络请求
【区域1】
从左至右,功能分别为:
请求信息记录按钮,关闭状态则不会记录
请求信息清楚按钮,一键清除请求信息
请求过滤,可以自定义筛选条件
请求检索,检索符合条件的请求
Preserve log 保留日志,重新加载url时,之前请求显示的资源信息,会保留下来,不会清空
Disable cache 否进行缓存,打开这个开关,则页面资源不会存入缓存
No throttling 模拟多种网络的访问
Network conditions 网络请求设置
上、下箭头 导入或导出网页交互操作产生的报文
【区域2】请求过滤
过滤条件输入框,可以输入一些字符串、域、大小、状态码、媒体类型等等
data URLs指一些嵌入到文档中的小型文件,在请求表里面以data:开头的文件就是,如较为常见的svg文件。勾选Hide data URLs复选框即可隐藏此类文件
All、XHR、JS、CSS、Img、Media、Font、Doc、WS、Manifest、Other 根据请求资源类型筛选,其中All是所有类型,XHR指异步网络请求,WS指webSocket连接
【区域3】时间轴
根据请求发出时间呈现,可选择时间段展示该时段内请求
计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?
2019-12-0215:00:25
来源: 作者:songzini
1
//计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?
全国计算机一级证作为一个最基础的计算机证件,每年报考人数还是挺多的,但对于很多第一次报考生来说,还是存在很多疑问的,下面小编就给大家解惑一下。
一、计算机一级考试科目有哪些?
计算机一级主要是考核计算机基础知识和使用办公软件及因特网的基本技能。
计算机一级考试科目主要有4个,如下所示:
1、计算机基础及ms office应用,是一级中最火热的科目,实用性比较高,主要是考计算机基础知识及office办公软件的基础运用。
2、计算机基础及WPS office应用,与ms office类似,但相对简单很多,只有Word、excel和PPT,主要也是考计算机基础知识及WPS办公软件的基础运用。
3、计算机基础及Photoshop应用,一般报考的人多是与设计专业相关的,报考人数相对少一些,主要是考计算机基础知识及Photoshop软件的基础运用。
4、一级新科目“网络安全素质教育”,这个是今年9月份才正式开考的科目,相关资讯很少。
注:每次考试只能报考一个科目,只能在一个地点报考。
二、WPS和ms考试的题目一样吗?
计算机一级中WPS和ms都是考察的对于office软件的运用,因此很多人都表示“考察的软件差不多,那是否考试题目也是一样的呢”。
对此,我可以很明确的告诉大家,是不一样的,因为两者的考试内容是有区别的,ms office比较侧重计算机基础知识、操作系统的功能和使用,相关组件更多等,而WPS则比较侧重于文字的编辑和打印,组件也只有Word、excel和PPT三个。
计算机一级整体来说并不是很难,不过也还是需要花一定的时间来备考的,备考时建议可以使用上学吧计算机一级考试题库,去做做里面的历年真题,然后多上机实操,加强对软件的使用和掌握。
计算机一级是很常见的一个证件考试,每年报考的人数也很多,是由国家统一组织、统一考试的,因此认可度也比较高,那计算机一级考试难不难?有没有什么考试技巧呢?下面就跟小编一起探讨一下吧!
一、计算机一级难不难?
计算机一级考试主要是考核计算机基础知识和使用办公软件及因特网的基本技能。
主要是上机考试,以选择题和操作题的形式出题,都是比较基础的知识,考试难度不大,主要就是多练几套题,可以借助上学吧计算机一级考试题库去练习,选题题大部分都是在题库中历年真题里抽取的,操作题也是主要多上机操作几次,掌握熟练,考试时就没什么问题了。
二、计算机一级有什么考试技巧?
计算机一级考试还有很多的考试小技巧,可以帮助你考试更顺利。
1、选择题不要太耽误时间,会做的先做了,不会的也不要太纠结。
2、Office考试的文字录入题把字录入了再编辑,不然如果把字体那些设置了再做,是会降低分的,而且是计时的,中途一定不能退出。
3、Word、Excel、PowerPoint等操作题做好后一定要记得进行保存操作,并且退出应用程序,这些都是要计分的。
4、Excel需要操作公式、函数、图表等,是最花时间的,所以建议留在最后做,并且时间留多一点。
好啦!计算机一级考试小技巧就分享到这了,希望对你们有所帮助,另外,复习时还推荐大家可以借助上学吧计算机一级考试题库,去多多练练里面的历年真题,有助于提高复习效率。
免下载,即可体验强大搜题神器
温馨提示:因考试政策、内容不断变化与调整,上学吧提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准。
我们在日常工作,有时候会遇到需要把文字图片或者扫描的文件变成word文档,最笨的方法就是一个一个字的打到word文档,有一些图片的文字是可以在搜索引擎上找到的,但是首先这个需要运气好。不过,现在小编就要教打一种新的方法,用的软件就是我们常用的Word。具体步骤如下:
1、首先保障你计算机的office安装有Microsoft Office Document Imaging组件,如图1,如果你安装的是迷你Office可能就没有,请安装完整版的Office就行了;
Microsoft Office Document Imaging组件
2、随便在电脑中哪儿新建一个Word文档,进入后选择插入--图片--来自文件;
新建文件
3、在插入图片文件框中找到你想要从中抓出文字的图片;
4、将图片成功插入Word中;
图片插入
5、依次点击文件--打印,打开打印窗口,只要你安装了Microsoft Office Document Imaging组件,完成我告诉你的第一步操作,这样在打印机名称下拉选项中肯定有一个名为Microsoft Office Document Imaging的打印机;
打印对话框
6、点击打印并不会真正打印,而是出现一个另存为的对话框;
另存为对话框
7、再点击保存后office会自动启动Microsoft Office Document Imaging组件打开你刚刚保存的文件;
word面板
8、在Microsoft Office Document Imaging组件右边的窗口中直接用左键圈中你欲复制的文字,再点击右键选择复制;
选择复制
9、点击复制后稍等几秒钟就会出现一个ocr字体识别的进度条,这个过程只需要短短几秒钟时间,此后你就可以新建一个空白的文本文档,在文档中直接复制就可以将刚刚从图片上所抓的文字复制到文本中来;
抓字
10、在第8部完成后你也可以再在Microsoft Office Document Imaging组件右边的窗口中点击右键--将文本发送到Word(T);
将文本发送到Word
11、点击后Office同样会自动打开一个新的Word文档,在这个新打开的Word文档中就有了我们刚刚从图片上所抓的文字。
将文本复制到Word