索引超出数组范围是指在通过索引获取数组内的值时,索引超出了数组的总长度,数组Array中有10个元素,它的总长度是10,索引是【0-9】,如果索引是10,则会报错。
索引超出了数组界限是指在通过索引获取数组内的值时,索引超出了数组的总长度。
例如:int[] Array = {1,2,3,4,5,6,7,8,9,10};
在这个int型数组Array中有10个元素,它的总长度是10,索引是0-9。
当使用for循环获取数组内的值时,如果索引是10,则会报错,错误原因是
索引超出了数组界限。for(int i=0;i<11;i++) {
System. out .println( String. format(“ 第%d元素的值是%\n",i+1 ,Array[i]));
}
扩展资料
数组的特点:
1、数组是相同数据类型的元素的集合。
2、数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
3、数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。相关免费学习推荐:编程视频
最近有一个实际的场景需求,需要实时统计总数,于是想到了flink,从入门到实战,整个过程中一直不断的思考实际业务中的问题,在flink中如何解决,与kafka-stream的对比和spark的对比等等。
整个思考和写出demo的过程中,对window机制有了深入的了解,并通过阅读flink java client的源码,了解了其trigger的实现。
本文从实际需求出发,通过提出问题解决问题,结合源码了解flink。
问题分析 从实际场景出发
场景:实时统计人流量总数,可以根据卡口按时段统计,可以是实时刷新,也可以是定期查询前一段时间。
流处理面临的问题
通常流处理框架,就是实时计算,数据源源不断输入,实时输出结果,所以面临以下几个问题:
窗口的划分数据乱序、延迟到达何时触发窗口计算计算状态的存储和过期 时间 通常流处理框架都有以下几个时间概念
Event Time:事件时间,从事件的消息体中提取时间Ingestion Time:到达时间,消息到达流处理器的时间(kafka-stream存在)Process Time:消息被处理的时间 前两者都可能存在乱序的情况(out of order),process time可以保证时间顺序是递增的。
如何设置EventTime
flink 通过env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)来设定流处理中window使用的时间类型(主要是用于划分window和管理window的生命周期,包括创建、销毁)
在flink流处理的Source中或者处理window之前,都可以通过调用assignTimestampsAndWatermarks来指定如何从消息中获得当前事件时间(watermark在后文讲)
窗口 窗口类型
Tumbling windows
翻转窗口:固定大小,窗口不重叠、窗口之间没有间隔Sliding windows
滑动时间窗口:由窗口大小和滑动间隔确定,例如窗口大小为5000,间隔(滑动)3000的窗口,可以得到[0;5000),[3000;8000),..Hopping windows
跳跃时间窗口:kafka自己的概念,和sliding相似,kafka说这是学术上的概念Session window
基于事件的,动态大小,例如间隔超出N(称为gap)没有新数据,之后的数据就是一个新session 从另一个维度来说,窗口可以是时间驱动的,即Time window,对应可以得到翻转时间窗口和滑动时间窗口;也可以是基于数据的,例如Count Window,当窗口数量达到一定值时关闭,可以得到翻转计数窗口和滑动计数窗口
Flink Window 原生支持
Tumbling Time WindowSliding Time WindowTumbling Count WindowSliding Count WindowSession Window 上文提到了如何获取时间,那么何时触发窗口的计算呢?
window的生命周期
创建:当第一个元素落入到window中的时候被创建触发:根据配置的trigger确定销毁:
根据配置的时间是event time还是process time,当获得到的当前event/process time, 大于窗口的endtime+watermark+lateness时候,窗口被销毁。
如果持续一段时间没有数据,也就不能获得最新的时间,则最后几个窗口会一直保持开启。 a window is created as soon as the first element that should belong to this window arrives, and the window is completely removed when the time (event or processing time) passes its end timestamp plus the user-specified allowed lateness(see Allowed Lateness)
InnoDB数据库死锁问题处理_MySQL
场景描述
在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...)。
问题分析
这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常,所以需要解决一下。
解决方法
在应用程序中update的地方使用try-catch。
我自己封装了一个函数,如下。
/**
* 2016-03-15
* linxuan
* handle deadlock while update table
*/
private void updateWithDeadLock(TestMapper mapper, Test record) throws InterruptedException {
boolean oops;
int retries = 5;
do{
oops = false;
try{
mapper.updateByPrimaryKeySelective(record);
}
catch (DeadlockLoserDataAccessException dlEx){
oops = true;
Thread.sleep((long) (Math.random() * 500));
}
finally {
}
} while(oops == true && retries-- >0);
成功解决ROS报错RLException: [turtlebot3_fake.launch] is neither a launch file in package [turtlebot3_fake] nor is [turtlebot3_fake] a launch file name
解决方案 错误原因为环境变量设置有问题
运行下方代码后再执行roslaunch
source ~/catkin_ws/devel/setup.bash roslaunch turtlebot3_fake turtlebot3_fake.launch 参考资料 [1]链接: https://community.bwbot.org/topic/603
没有安装对应的软件包
看看你的src文件夹内是不是有对应的软件包
软件包名称输入错误
输入软件包名称和launch文件名称时可以使用tab键自动补全。
环境变量设置有问题
在执行roslaunch前是否执行了source /opt/ros/kinetic/setup.bash(以kinetic版本为例)和source你的工作空间。
如果是通过修改~/.bashrc文件的方式改变环境变量。对应的修改要重新开启一个命令行窗口后才会生效。
可以通过roscd 你的包来测试一下环境变量是否有问题。如果正常,那么你应该能通过这种方式进入自己的软件包。
不是一个有效的ROS软件包
比如自己写的一个ROS包,但是没有添加CMakeLists.txt文件和package.xml文件
1 什么是canal canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。(数据库同步需要阿里的otter中间件,基于canal)
2 canal使用场景 (1)阿里otter(阿里用于进行异地数据库之间的同步框架)中间件的一部分,这是原始场景
(2)更新缓存:如果有大量的请求发送到mysql的话,mysql查询速度慢,QPS上不去,光查mysql可能会瘫痪,那就可以在前面加个缓存,这个缓存有2个主要的问题。一是缓存没有怎么办,二是数据不一致怎么办。对于第一个问题查缓存没有就差mysql,mysql再往缓存中写一份。对于第二个问题,如果数据库修改了,那就采用异步的方式进行修改,启动一个canal服务,监控mysql,只要一有变化就同步缓存,这样mysql和缓存就能达到最终的一致性。
(3)抓取业务数据新增变化表,用于制作拉链表:做拉链表是需要有增加时间和修改时间的,需要数据今天新增和变化的数据,如果时间不全就没办法知道哪些是修改的。可以通过canal把变化的抽到自己的表里,以后数据就从这个表出。
(4)取业务表的新增变化数据,用于制作实时统计
3 canal工作原理 首先了解一下mysql主备复制原理:
(1)master主库将改变记录,发送到二进制文件(binary log)中
(2)slave从库向mysql Master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log)
(3)slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库
canal的工作原理:把自己伪装成slave,从master复制数据。读取binlog是需要master授权的,因为binlog是加密的,授权分用户名密码才能读。master授权后不知道读他的binlog的是从机还是canal,他的所有传输协议都符合从机的标准,所以master一直以为是从机读的。
4 mysql的binlog 4.1 二进制日志 mysql的二进制日志记录了所有的DDL和DML(除了数据查询语句),以事件的形式进行记录,包含语句执行消耗的时间,mysql的二进制日志是事务安全型的。
开启二进制日志大概会有1%的性能损坏。二进制日志有2个主要的使用场景:①mysql的主备复制②数据恢复,通过使用mysqlbinlog工具来恢复数据(用这个做恢复是备选方案,主方案还是定期快照,定期执行脚本导数据,其实就是把当前所有数据导成insert,这个量少)
二进制日志包括2类文件:①二进制日志索引文件(后缀为.index)用于记录所有的二进制文件②二进制日志文件(后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)
4.2 开启binlog 修改mysql的配置文件my.cnf。
# vim /etc/my.cnfgG 在[mysqld] 区块 添加
log-bin=mysql-bin mysql-bin表示binlog日志的前缀,以后生成的的日志文件就是 mysql-bin.000001 的文件后面的数字按顺序生成。 当mysql重启或到达单个文件大小的阈值时,新生一个文件,按顺序编号。
4.3 binlog分类 binlog的格式有三种:STATEMENT,MIXED,ROW对比如下
格式描述优点STATEMENT语句级别,记录每一次执行写操作的语句,相对于ROW模式节省了空间,但是可能产生数据不一致如update tt set create_date=now(),由于执行时间不同产生饿得数据就不同节省空间可能造成数据不一致ROW行级,记录每次操作后每行记录的变化。假如一个update的sql执行结果是1万行statement只存一条,如果是row的话会把这个1000行的结果存这。持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果占用较大空间MIXED是对statement的升级,如当函数中包含 UUID() 时,包含 AUTO_INCREMENT 字段的表被更新时,执行 INSERT DELAYED 语句时,用 UDF 时,会按照 ROW的方式进行处理节省空间,同时兼顾了一定的一致性还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便 4.4 binlog格式选择 如果只考虑主从复制的话可以用mixed,一般情况下使用statement,遇到几种特殊情况使用row,同步的话有SQL就行,因为手里有数据,前提是有数据才能执行这个SQL。在大数据场景下我们抽取数据是用于统计分析,分析的数据,如果用statement抽了SQL手里也没数据,不知道执行修改哪些,因为没有数据,所以没办法分析,所以适合用row,清清楚楚的表明了每一行是什么样。
4.5 修改配置文件 修改my.cnf文件,在[mysqld]模块下添加如下内容
server-id= 1 log-bin=mysql-bin binlog_format=row binlog-do-db=bigdata binlog-do-db用于指定库,缩小监控的范围,server-id不能和mysql集群的其他节点重复
Eureka报错 概述 分享一个eureka的错误及解决方案,话不多说上代码
org.apache.http.conn.ConnectTimeoutException: Connect to eureka7001.com:7001 timed out com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 解决方案,修改C:\Windows\System32\drivers\etc下的host文件
具体操作,点击电脑左下角搜索框,搜索记事本,选择管理员身份运行。点击文件——》打开——》找到C:\Windows\System32\drivers\etc下的host文件,添加属性
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
点击保存。这个时候只能另存。不过没关系。保存为host.txt文件后。将原本的host文件删除。修改host.txt的后缀名。把txt干掉即可。如果不显示文件后缀名可参考
https://jingyan.baidu.com/article/7c6fb428f01e8c80642c90e0.html
ps:第二天运行报错了检查一下host文件。我的电脑关机之后,修改的内容被清空了
大家好,我是目前在帝都奋斗的一名程序员。
我目前的工作是一名爬虫工程师,之前在这个领域里也下了不少功夫,在爬虫方面如果大家有需要我帮助的,尽管向我咨询。之前也接触过一段时间的nlp算法,并且github上的一个nlp入门项目还获得了不少star,所以nlp方面指引一下新手也还是可以的。本来想从爬虫入手,最终成为一名nlp算法工程师,后来发现自己的学历是个硬伤,而且随着时间的推移,自己对算法也慢慢变的没有那么感兴趣了。
由于公司业务需要,我后面可能会慢慢转向后端,这也是我希望的,因为我喜欢接触新的知识。同时2021年我决定进行考研,算是了结自己的一个遗憾吧,总得尝试一下。
开通这个公众号的目的,一方面是希望能给予更多的人帮助,希望你们看到我分享的经验之后能够给你们一些启发,另一方面也是顺便记录一下自己的奋斗历程。
来日正长,大家一起加油!
查看系统时间
date
查看硬件时间
hwlock --show
安装ntpdate
apt-get install -y ntpdate
删除etc/localtime文件
rm -rf etc/localtime
复制shanghai时区文件替换到这里
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
更新时间
ntpdate -u ntp.api.bz
此时系统时间已经更新
将系统时间同步到硬件时间
hwclock -w
从上到下一步一步执行即可,记得先快照一下系统
1. 前言 之前说了m_map的下载、安装与基本使用(Matlab下地形图绘图包m_map安装与使用),以及晕渲地形图的绘制(m_map绘制晕渲(shaded relief)地形图),现在再说一下高分辨率海岸线、国界线与河流的绘制。
2. 安装 高分辨率地形和海岸线数据的安装已经在Matlab下地形图绘图包m_map安装与使用中说的比较详细了,这里不再赘述。
3. 参数设置 可以打开m_gshhs函数查看具体设置。
>> help m_gshhs m_gshhs Add a coastline to a given map using the Global Self-consistant Hierarchical High-resolution Shorelines, Rivers, and Borders m_gshhs(RES, (standard line option,...,...) ) draws the coastline river network, or borders as simple lines. m_gshhs(RES,'patch' ( ,standard patch options,...,...) ) draws the coastline as a number of patches (rivers and borders are not arranged so patches can be drawn).
如题 现象如下解决办法经过以上5个步骤,问题可解 现象如下 解决办法 首先登录官网:https://login.teamviewer.com/
经过以上5个步骤,问题可解 本文转载自csdn文章:[解决]:【TeamViewer作为个人用途免费,但仅可使用在有限数量的设备上。您已经到达可使用设备的上线】
展开全部
一、函数类型不同
stem画出来是离散函数,杆32313133353236313431303231363533e58685e5aeb931333431366237图。
plot是连续函数。
二、绘制的图形不同
在matlab中,stem函数用于绘制火柴梗图。stem英文有“(工具的)柄,把,杆,茎,(树)干,(叶)柄的意思。
plot则是普通的连续曲线。
扩展资料:
一、plot函数语法
plot函数的基本调用格式为:
1、plot(y)
当y为向量时,是以y的分量为纵坐标,以元素序号为横坐标,用直线依次连接数据点,绘制曲线。若y为实矩阵,则按列绘制每列对应的曲线。
2、plot(x,y)
若y和x为同维向量,则以x为横坐标,y为纵坐标绘制连线图。若x是向量,y是行数或列数与x长度相等的矩阵,则绘制多条不同色彩的连线图,x被作为这些曲线的共同横坐标。若x和y为同型矩阵,则以x,y对应元素分别绘制曲线,曲线条数等于矩阵列数。
3、plot(x1,y1,x2,y2,……)
在此格式中,每对x,y必须符合plot(x,y)中的要求,不同对之间没有影响,命令将对每一对x,y绘制曲线。
以上三种格式中的x,y都可以是表达式。plot是绘制一维曲线的基本函数,但在使用此函数之前,须先定义曲线上每一点的x以及y坐标。
在MySQL中使用DEFAULT关键字将默认值设置为NULL。让我们首先创建一个-mysql> create table DemoTable1440
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20) DEFAULT NULL,
-> StudentAge int DEFAULT NULL
-> );
使用insert命令在表中插入一些记录。对于保留为空的值,将插入默认值-mysql> insert into DemoTable1440(StudentName,StudentAge) values('Chris',21);
mysql> insert into DemoTable1440 values();
mysql> insert into DemoTable1440(StudentName) values('David');
mysql> insert into DemoTable1440(StudentAge) values(24);
使用选择显示表中的所有记录-mysql> select * from DemoTable1440;
这将产生以下输出-+-----------+-------------+------------+
| StudentId | StudentName | StudentAge |
+-----------+-------------+------------+
| 1 | Chris | 21 |
| 2 | NULL | NULL |
1.ODV 简介 Ocean Data View(http://odv.awi.de/)是一个用于交互式勘探和图形显示海洋和其他地学参考剖面、轨迹或时间序列数据的计算机程序。该软件可用于Windows、Mac OS、Linux 和 Unix 系统。ODV 数据和设置文件独立于平台,可在所有支持的系统之间进行交换。
ODV 允许用户在廉价的便携式硬件上维护和分析非常大的数据集。它可以十分容易生成各种格式的输出图形,包括高质量站位图、单站或多站属性交会图、选定测站散点图、任意航线剖面图和属性平面分布等值面图。
ODV 支持通过彩色点、数字值或箭头显示原始标量和矢量数据。此外,还可以在三种不同的网格算法之间进行选择,提供对自动生成的网格的计算,并允许对区域和等轴面上的字段进行颜色着色和轮廓绘制。
2. 使用教程 详细的中文使用教程可参考百度文库:Ocean Date View中文教程
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。
电脑开机黑屏出现英文字符的解决方法:
1、如果是显示左上角光标闪烁或Error 1962,可将电脑关机断电后,将除了显示器之外的所有外部设备移除,只保留显示器设备进行测试,测试确定正常后,再重启电脑,就不会出现黑屏情况。
2、如果开机提示DHCP错误,则需重启电脑后连续点击键盘F1键,进入Bios找到Devices选项下面的Network Setup菜单,将下面的Boot Agent改为Disabled , 等待电脑重启即可。
3、如果电脑上显示Fan error,则指机器风扇问题,可以关机断电之后打开主机机箱,查看CPU风扇的连接线是否有松动,然后看看风扇是否灰尘过多,用手转动风扇检查是否阻力过大,清理好风扇后再次尝试开机,只要不是风扇损坏基本上都可以解决问题。
电脑(computer,又称计算机)是一种用于高速计算的电子计算机器,被称为“20世纪最先进的科学技术发明之一”。电脑由硬件系统和软件系统所组成,具有进行数值计算、逻辑计算和存储记忆等多项功能。它的应用领域从最初的军事科研应用扩展到社会的各个领域,带动了全球范围的技术进步。主板又叫Mother Board(母板)。它其实就是一块电路板, 上面密密麻麻都是各种电路。它可以说是PC机的神经系统,CPU、内存、显示卡、声卡等等都是直接安装在主板上的,而硬盘、软驱等部件也需要通过接线和主板连接。
当多个设备连接到计算机时,断开一个设备可能会使另一设备消失。当您启动一个新的应用程序以使用扫描仪时,找不到它。在本文中,当其他设备断开连接后,应用程序找不到新的扫描设备时,我们将分享解决方案。
当您断开设备上的Web服务(WSD)扫描器或将其连接到基于Windows的计算机时,或者将其他扫描设备(例如USB扫描器)连接到计算机时,可能会出现此问题。所有这些都指向状态更改。如果找不到计算机,则表明它仍处于脱机状态。当操作系统查询其状态时,它将收到
WIA ERROR OFFLINE错误。
WIA_ERROR_OFFLINE,设备处于脱机状态,确保设备已开机并连接至PC,错误代码0x80210005
Windows Image
Acquisition(WIA)使图形软件能够与成像硬件(例如扫描仪)进行通信。初始化过程失败时,将在此处发生错误。
应用程序找不到扫描仪
在大多数情况下,问题是暂时的,重新启动扫描仪和计算机都可以解决问题。这是我们的建议:
您可能需要一个管理员帐户才能从设备管理器中删除设备。
1]在连接扫描仪后重新启动计算机
由于状态将被重置,因此大多数情况下它将解决该问题。当设备处于离线模式时,扫描仪驱动程序 调用IStiDevice ::
LockDevice方法时可能会遇到 WIA_ERROR_OFFLINE错误 。重新启动后,状态将重置。
2]卸载连接的扫描仪设备并重新连接
使用WIN + X键盘快捷方式打开“电源”菜单,然后选择“设备管理器”。
找到扫描仪,右键单击并卸载
重新启动电脑
回到您的帐户后,重新连接扫描仪。
Windows将再次开始检测它并安装所需的驱动程序。
3]重新启动Windows图像获取(WIA)服务
我们已经讨论过WIA服务,并且重启它也是一个好主意。
*在“运行”提示中,键入services.msc,然后按Enter键。
*Loca WIA服务。描述应为“ 为扫描仪和照相机提供图像采集服务。”
*双击打开,然后单击“停止”按钮,然后单击“开始”按钮。
*您也可以右键单击该服务,然后从上下文菜单中选择“重新启动”。
希望该指南易于阅读,并且其中一种解决方案可以解决该问题-在断开另一个设备的连接后,应用程序找不到新的扫描设备。
2008-05-07
开机等待问题电脑开机后要等很长时
速度、木马、系统漏洞、病毒等综合性影响,常规解决办法:
1、解决杂乱文件影响(减少电脑负担)。
清理杂乱文件有三个方法,第一是点网页上的“工具”,点“Internet选项(0)”,在新页面分别点“删除Cookies(I)”“删除文件(F)”“清除历史记录(H)”、最后“确定”;第二是用“磁盘清理”,把鼠标指向程序——附件——系统工具——就显示出“磁盘清理”,所有的盘C、D、E等都要清理(主要是系统盘C),第三是“整理磁盘碎片”,把鼠标指向程序——附件——系统工具——就显示出“整理磁盘碎片程序”,主要是整理系统盘C,很慢一般要一到两个小时甚至更多时间。 这三种方法可以单独使用,都可以有效的...全部
速度、木马、系统漏洞、病毒等综合性影响,常规解决办法:
1、解决杂乱文件影响(减少电脑负担)。
清理杂乱文件有三个方法,第一是点网页上的“工具”,点“Internet选项(0)”,在新页面分别点“删除Cookies(I)”“删除文件(F)”“清除历史记录(H)”、最后“确定”;第二是用“磁盘清理”,把鼠标指向程序——附件——系统工具——就显示出“磁盘清理”,所有的盘C、D、E等都要清理(主要是系统盘C),第三是“整理磁盘碎片”,把鼠标指向程序——附件——系统工具——就显示出“整理磁盘碎片程序”,主要是整理系统盘C,很慢一般要一到两个小时甚至更多时间。
这三种方法可以单独使用,都可以有效的清除正常浏览网页没有保存的所有临时文件,有用的系统文件和安装保存的文件不会被清理。用第一或第二的方法配合第三的方法效果会更好,可以明显改善电脑速度。
2、解决恶意流氓软件和恶意流氓插件影响。
恶意流氓软件和恶意流氓插件除少数是躲在自己下载的软件和安装的代码里面以外,主要是自己强行安装进电脑的,目的就是干扰操作系统,影响程序正常工作,用“磁盘清理”清不掉,杀毒软件发现不了,用瑞星卡卡助手、奇虎360、清理大师、木马清道夫等等凡杀毒软件配置的助手,都可以用系统优化功能、系统防护功能等有效的清除恶意流氓软件和恶意流氓插件,只要经常清理,就可以保证电脑不受影响。
3、系统修复,恶意流氓软件、恶意流氓插件、病毒等有机可乘的原因就是操作系统有漏洞,经常检查漏洞,及时修复系统不但可以使操作系统流畅,而且可以减少恶意流氓软件、恶意流氓插件、病毒等进入电脑的机会。
4、经常更新病毒库,升级杀毒,不要让病毒长期存留在电脑里,选择高级设置,发现病毒杀毒,杀不了隔离文件、隔离不了删除 文件、要保证电脑没有保存有病毒,有病毒及时根除。
5、电脑遭遇病毒是难免的,为了减少重装系统的麻烦,一定要在装系统时装“一键恢复” 。
“一键恢复”就是操作系统备份,一般是装系统时设置,也就是确保操作系统健康。 在电脑遭遇病毒无法清除、程序错乱,速度特别慢等严重问题时,任何时候“一键恢复”,电脑就恢复到健康正常的系统,保证正常操作。
6、检查内存条:用鼠标对准桌面,右键点击,点对话框“属性”,会显示电脑资料,下方有内存条容量,如果你的电脑内存容量是512M及以下,可以加一个同容量或原来2倍容量的内存条(小了不起作用,大了没有意义,),或者换一个2—3倍原来容量的内存条,可以明显改善电脑运行速度。
(注意的是:内存条最好是同规格的,规格不同的插口一定要相同,单插口的只有选择换一个,双插口的选择加一个,加好后可以用上面的方法检查容量。
。收起
前言: 本文的作者认为对于 GNN 的可解释性不足。基于此,作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合,超越或匹配最先进的 GNN 。具体如下:
(i)误差相关性:传播训练数据中的残余误差以纠正测试数据中的错误信息
(ii)预测相关性:在测试集数据上进行平滑预测
作者将整个过程称为 Correct and Smooth (C&S)。其中后处理步骤是通过对早期的基于图的半监督学习方法的标准标签传播方法进行修改实现的。该方法实现了惊人的性能提升,在 OGB-Products 数据集上使用比现有方法少137倍的参数量和100倍的训练时间达到了更佳的性能。
该方法的性能突出了如何直接将标签信息合并到学习算法(正如在传统技术中所做的那样)产生简单和实质性的性能增益。同时还可以将该技术整合到大型GNN模型中,提升模型性能。
论文链接:https://arxiv.org/abs/2010.13993
github:https://github.com/CUAI/CorrectAndSmooth
0. 标签传播算法 标签传播算法(label propagation)的核心思想非常简单:相似的数据应该具有相同的label。LP算法包括两大步骤:
1)构造相似矩阵;
2)标签传播。
0.1 相似矩阵构建 LP算法是基于Graph的,因此我们需要先构建一个图。我们为所有的数据构建一个图,图的节点就是一个数据点,包含labeled和unlabeled的数据。节点 i i i 和节点 j j j 的边表示他们的相似度。这个图的构建方法有很多,这里我们假设这个图是全连接的,节点 i i i 和节点 j j j 的边权重为:
w i j = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 α 2 ) (1) w_{ij}=exp(-\frac{||x_i-x_j||^2}{\alpha^2})\tag{1} wij=exp(−α2∣∣xi−xj∣∣2)(1)
其中 α \alpha α 作为超参
模拟电路中的无源滤波器是由无源元件R、L、C组成的,而有源滤波器是由运放、R、C组成的,可以不用电感就能实现低通、高通、带通、带阻等功能,而且输入阻抗高、输出阻抗低、负载效应小。
下面介绍二阶有源低通滤波器的数学模型——传递函数。
1.电路原理图
二阶有源低通滤波器是由两个独立的储能电容、外围电阻和一个运放组成的,电路图如下所示:
电路原理图 其中,R、C、R1、Rf代表的是电阻电容的阻值或容值。
根据电路中的复频域分析方法,画出电路的频域模型:
电路频域模型 、 均为电路中的中间变量, 、 分别是模型的输入、输出变量。
2.传递函数的推导
根据运放的虚短特性,得到
根据虚断特性,得到
根据KCL,在结点A,有
代入 的表达式,整理得到
滤波器的传递函数为
写成更一般的形式
这个传递函数 就是这个二阶有源低通滤波器的数学模型。
问题:
在Winodws 10下使用conda安装第三方包时报错:”EnvironmentNotWritableError: The current user does not have write permissions to the target environment. location:
主要原因:用户没有对anaconda3文件夹的读写权限,造成其原因可能是由于在安装anaconda时使用了管理员权限。
解决方法:解除对错误中location:*部分涉及的文件夹的权限限制
1、把鼠标光标移动到文件夹上,鼠标右击,在出现的选项中选择【属性】。
2、在属性界面中上方有6个选项,点击第四个【安全】。
3、接下来在更改权限的右边点击【编辑】。
4、在权限界面中点击中间的【添加】,准备添加权限。
5、在【选择用户和组】界面中点击下方的【高级】选项。
6、接下来的界面中点击【立即查找】,这时会在下方出现很多用户选项,选择【Everyone】。
7、最后再权限中把所有的权限都给勾选上,点击【确定】。
最后重新安装就可以了。
1、下载安装依赖:
npm install postcss-pxtorem -save
2、新建一个rem.js的文件,在main.js中引用。
(function() { const baseSize = 16; // 32 function setRem() { const scale = document.documentElement.clientWidth / 375; // 750 document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + "px"; } window.onresize = function() { setRem(); }; })(); 注: 以设计稿自定义为375px 测量值直接写入即可,如是750px,则乘以2
3、在根目录下新建一个postcss.config.js
module.exports = { plugins: { // 兼容浏览器,添加前缀 autoprefixer: { overrideBrowserslist: [ "Android 4.1", "iOS 7.1", "Chrome > 31", "ff > 31", "ie >= 8", "
概念: 折半查找法又称为二分查找法,该方法要求带查找的表是顺序存储结构并且表中的关键字大小有序排列。
查找过程: 先确定待查记录所在的区间,然后逐渐通过待查找值与区间中间值进行比较进而调整区间大小,不断缩小范围,直到找到或者找不到为止。
具体方法: 将表中间值与待查找值进行比较,如果二者相等则查找成功;否则利用中间为止记录将表分成前后两个子表,如果待查找值大于区间中间值,则在后一个子表中继续查找;反之,则在前一个子表中查找。重复上述过程,直到找到目标值,则查找成功。否则,目标不存在,查找失败。
算法思想: “分治法”,将一个大的区间,不断“折半”,在小区间内查找,分而治之。
实例: 题目描述:
任意输入十个整数,再输入一个整数,利用“折半查找法”验证该数字是否在该数列中。如果存在,则输出其序号;否则,输出不存在。
注释:不考虑大整数的情况
解析:首先,对于输入的十个整数,可能是无序的,所以要先用选择排序法进行排序。再利用折半查找法查找待查找数。
代码如下: #include"stdio.h" int main() { void sort(int a[10],int m);//排序函数 void search(int a[10],int n);//查找函数 int a[10],n,i; printf("请输入10个整数:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("请输入你想要查找的数字:\n"); scanf("%d",&n); sort(a,10); search(a,n); return 0; } void sort(int a[10],int m)//选择排序法 { int i,j,k,temp; for(i=0;i<m-1;i++) { k=i; for(j=i+1;j<m;j++) { if(a[j]<a[k]) k=j; } temp=a[i];a[i]=a[k];a[k]=temp; } printf("排序后:\n"); for(i=0;i<m;i++) printf("%d ",a[i]); printf("\n"); } void search(int a[10],int n) { int low=0,high=9,mid,flag;//low,high分别为区间的左端点和右端点,mid为区间中间,flag存放逻辑值 while(low<=high) { mid=(low+high)/2;//折半 if(n==a[mid]) { flag=1;//如果区间中间值等于待查找值,则查找成功,flag值为 1,为真 break;//找到,则终止循环 } else if(n<a[mid])//待查找值小于中间值,则在前一半区间内继续查找 high=mid-1;//调整右端点 else if(n>a[mid])//待查找值大于中间值,则在后一半区间内继续查找 low=mid+1;//调整左端点 } if(flag==1)//如果找到 printf("
6.1 原点位置校准
6.1.1 原点位置校准
所谓的原点位置校准是指机器人位置和绝对编码器位置进行对照的操作。
原点位置校准是在出厂前进行的,在下列情况下必须进行原点位置校准。
• 改变机器人和控制柜 (DX100)的组合时。
• 更换了电机、绝对值编码器时
• 存储内存被删除的时候 (YIF01 基板的更换、电池耗尽时)
• 机器人撞到工件原点偏移时
用轴操作键使机器人运动到原点位置姿态进行原点位置校对。有以下两种
方法。
• 全轴同时登录
• 各轴单独登录
已知原点位置姿态绝对原点数据的情况,可直接输入绝对原点数据。
6.1.2 操作方法
6.1.2.1 进行全轴登录
1. 选择主菜单的 【机器人】
2. 选择 【原点位置】
–显示原点位置校准画面。
3. 选择菜单的 【显示】
选择翻页
或者按翻页键
–显示下拉菜单。
4. 选择要控制的轴组。
5. 选择菜单的 【编辑】
–显示下拉菜单
6. 选择 【选择全部轴】
–显示确认下拉菜单。
7. 选择 【是】
–显示的全轴当前值作为原点输入。
–选择 【不】,则操作停止。
6.1.2.2 进行单独登录
1. 选择主菜单的 【机器人】
2. 选择 【原点位置】
3. 选择希望的控制轴组
–在前一项的 【进行全轴的一次性登录】的 3、4 操作里,选择希
删除交换机:
在官网rabbitmqctl命令中没有找到删除交换机的命令,然后管理后台的端口又没有开放出来,只能使用命令访问管理后台删除交换机
exchangeName:为交换机名称
name:password:登录管理后台的账号和密码
curl -u name:password -X DELETE http://localhost:15672/api/exchanges/%2f/exchangeName '{vhost: "/", name: "exchangeName "}' --header "Content-Type: application/json"
删除队列:
rabbitmqctl delete_queue exchangeName
有些朋友在安装CAD2012的时候安装不上去,有的一安装就成功了。可能会是什么原因呢,怎么解决呢,本人一同分享CAD2012的安装错误及解决。
未在英文目录下安装
1、安装时弹出下图错误,表示未在英文目录下安装,或者你下载的CAD2012解压后放在了中文的目录下。解决方法:重新解压在英文目录下。还有一个可能就是压缩包解压时缺少文件,需要重新下载解压。
.NET framework 未安装结束
1、如果是.NET framework 未安装结束,就突然跳到安装完成,并显示三个红X,那可能是注册表未清理。
2、我们先下载.NET Framework Cleanup Tool。然后解压后打开软件。选择是。
3、然后选择"YES"
4、选择“cleanup now",需要等待一会,直到清理完成后,EXIT按键可以点击为止。
5、下面,清理下注册表,我们可以通过系统优化大师或者魔方优化(其他可以清理注册表的软件都行),清理注册表。
6、最后我们需要安装下.NET Framework 4.0,解压后,双击安装即可。安装完成后,我们就可以安装CAD了,祝大家顺利!
注意事项: 清理过注册表后,最好重启下,安装包目录和安装目录都必须是英文目录。
import socket import os import re import time from multiprocessing import Process class CHttpServer(object): """Httpserver服务端类""" def __init__(self): self.m_serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.m_serverSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) self.m_buf_size = 8 * 1024 * 1024 def start(self): self.m_serverSocket.listen(128) while(True): m_clientSocket,m_clientAddr = self.m_serverSocket.accept() m_clientSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) print("创建的socket是", end="") print(m_clientSocket) print('[%s,%s]用户连接上了服务器' % m_clientAddr) handle_client_process = Process(target = self.handle_client,args=(m_clientSocket,)) handle_client_process.start() m_clientSocket.close() #数据处理进程 def handle_client(self,clientSocket): ''' 处理客户请求操作 ''' #获取客户请求数据 print("进程:", end="") print(os.getpid()) request_data = clientSocket.recv(2048) print('接收到的数据:%s' % request_data) request_lines=request_data.splitlines() bytes_start = "" bytes_end = "
展开全部
K1M0是M0123的意思,K2M0是M01234567的意思;K3M0是M0123 4567 10 11 12 13
K4M0是M0123 4567 10 11 12 13 14 15 16 17。
也就是说,K1M0对应的是M0,M1,M2,M3,自己类推。
简单理解就是,例:K1M0中,M0=0,M1=1,M2=1,M3=0,把这个数62616964757a686964616fe78988e69d8331333431373839值放到D0里面就是0110。
扩展资料:
二进制就是以0或者1表示的,打个比方。
K1Y0指4个一组,即Y3.Y2.Y1.Y0.分别是指8.4.2.1。MOV K() K1Y0。传送(8)给K1Y0就是1000即=Y3亮。传送(4)就是0100=Y2亮。以此类推。
对于八位的单片机来说,高八位和低八位是很少用到的,但也有用到的地方,比如程序计数器PC,高八位代表地址的A15~A8,低八位代表地址的A7~A0;再比如数据地址指针DPTR,也是如此分为DPH的高八位和DPL的低八位,再比如定时器计数器TH0、TH1是高八位,TL0、TL1是低八位等等。
对照上面的公式你要Y1和Y3亮就是4+8=12。即MOV K12 K1Y0,可以写程序试试,MOV K12 K1Y0就是把十进制转换成二进制传送到K1Y0中。
Tomcat报404错误,源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。  **错误原因**:如果你的tomcat正常启动的话,那有可能是把浏览器访问的地址弄错了,我这里出现的情况是,如果让idea自己打开浏览器访问的话,会报错,如果点击"idea右上角的浏览器图标"进行访问的话,就能正常访问。所以需要修改浏览器访问的地址。 下面讲如何修改地址:
1.点击运行(run)–>编辑配置
2.找到Tomcat Server的配置,在服务器这一界面,检查URL地址栏中“8080/”后的的名字是否跟“部署”界面的"应用程序上下文(application context)“的名字一样。我这里的“部署”界面的"应用程序上下文"的名字是"TomcatWeb”,所以我需要在“服务器”界面的url地址栏必须要写TomcatWeb,而且不能写错,否则就报错。因为“部署”界面的"应用程序上下文"填写的是个虚拟地址,这里写的是什么,就要在服务器界面地址栏写上什么,如果"应用程序上下文“的名字是"/",那么服务器界面地址栏就写http://localhost:8080/index.jsp。
”部署“界面
还有一点注意的是,当项目写了新的文件时,我们要想访问的话,我们需要重复运行tomcat,这样太麻烦了,如果有一种办法让新的代码或文件直接加载到项目里,而不需要重启tomcat的话,那就更美好了。只需在下面两个地方设置成"更新资源"就可以了。
#include <stdio.h>
#include <stdlib.h>
//带多类型参数的函数,实现选择加减乘除运算
void tip()
{
printf(“\n");
printf("\n”);
printf(“请输入一种算法\n");
printf("设计者:罗可飞\n”);
printf(“\n");
printf("\n”);
}
int jia(int a,int b)
{
int z;
z = a + b;
return z;
}
int jian(int a,int b)
{
int z;
z = a - b;
return z;
}
chen(int a,int b)
{
int z;
z = a * b;
return z;
}
float chu(float a,int b)
{
float z;
z = a / b; //不同类型数据运算时,比如两个整数相除,必须将除数或者将被除数强制转换成小数,否则小数后面的小数点后面的数据会被忽略
启动journalnode报错如下
[hadoop@salve001 ~]$ hdfs --daemon start journalnode ERROR: Cannot set priority of journalnode process 74165 [hadoop@salve001 ~]$ 查看报错日志提示
2021-02-03 10:42:05,421 ERROR org.apache.hadoop.hdfs.qjournal.server.JournalNode: Failed to start journalnode. org.apache.hadoop.util.DiskChecker$DiskErrorException: Cannot create directory: /data1/hadoop/dfs/jn 根据提示目录无法创建,手动创建
[root@salve001 ~]# mkdir -p /data1/hadoop/dfs/jn 切换hadoop用户启动journalnode
1 概述 Flink在做流数据计算时,经常要外部系统进行交互,如Redis、Hive、HBase等等存储系统。系统间通信延迟是否会拖慢整个Flink作业,影响整体吞吐量和实时性。
如需要查询外部数据库以关联上用户的额外信息,通常的实现方式是向数据库发送用户a的查询请求(如在MapFunction中),然后等待结果返回,返回之后才能进行下一次查询请求,这是一种同步访问的模式,如下图左边所示,网络等待时间极大的阻碍了吞吐和延迟。
Flink从1.2版本开始就引入了Async I/O(https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/asyncio.html)。异步模式可以并发的处理多个请求和回复,也就是说,你可以连续的向数据库发送用户a、b、c、d等的请求,与此同时,哪个请求的回复先返回了就处理哪个回复,从而连续的请求之间不需要阻塞等待,如上图右边所示,这也是Async I/O的实现原理。
2 Future和CompletableFuture 先了解一下Future和CompletableFuture
2.1 Future 从JDK1.5开始,提供了Future来表示异步计算的结果,一般需要结合ExecutorService(执行者)和Callable(任务)来使用。Future的get方法是阻塞的
package com.quinto.flink; import java.util.concurrent.*; public class FutureTest { public static void main(String[] args) throws ExecutionException, InterruptedException { // 核心线程池大小5 最大线程池大小10 线程最大空闲时间60 时间单位s 线程等待队列 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); Future<Long> future = executor.submit(() -> { // 故意耗时 Thread.sleep(3000); return System.currentTimeMillis(); }); System.out.println(future.get()); System.out.println("因为get是阻塞的,所以这个消息在数据之后输出"); executor.shutdown(); } } 结果为
1612337847685 因为get是阻塞的,所以这个消息在数据之后输出 Future只是个接口,实际上返回的类是FutureTask:
public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; } protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); } FutureTask的get方法如下
目录
前言:
一. 各种名词解释
1.1 ODS是什么?
1.2 数据仓库层DW?
1.2.1 DWD明细层?
1.2.2 DWM 轻度汇总层(MID或DWB, data warehouse basis)
1.2.3 DWS 主题层(DM,data market或DWS, data warehouse service)
1.3 APP?
1.4 数据的来源
1.5 ODS、DW → App层
1.6 维表层DIM?
1.7 层级的简单分层图
二. 问题
2.1 DWS 与 DWD?
2.2 ODS与DWD区别?
2.3 app层干什么的?
三. 总结
前言: 不是做数仓的,但是也需要了解数仓的知识。
其实分层好多因人而异,问了同事好多分层的区别也不是很清晰。
所以后续有机会还是跟数仓的同事碰一下吧~
一. 各种名词解释 1.1 ODS是什么? ODS层最好理解,基本上就是数据从源表拉过来,进行etl,比如mysql 映射到hive,那么到了hive里面就是ods层。ODS 全称是 Operational Data Store,操作数据存储.“面向主题的”,数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的 ETL 之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。但是,这一层面的数据却不等同于原始数据。在源数据装入这一层时,要进行诸如去噪(例如有一条数据中人的年龄是 300 岁,这种属于异常数据,就需要提前做一些处理)、去重(例如在个人资料表中,同一 ID 却有两条重复数据,在接入的时候需要做一步去重)、字段命名规范等一系列操作。 1.2 数据仓库层DW? 数据仓库层(DW),是数据仓库的主体.
系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向“对象”编程这类段子,而面向对象编程的语言都会有三大特征:封装、继承、多态。
我们平时接触到的很多函数、方法的操作都具有这些性质,我们只是会用,但还没有去深入了解它的本质,下面就介绍一下关于类和对象的相关知识。
封装
封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象。
首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房。
class XiaoMing:
#属性
height = 180
weight = 65
sex = '男'
#方法
def run(self):
print('小明在跑步')
def sleep(self):
print('小明在睡觉')
在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。
属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象。
In[1]:print(XiaoMing.height)
Out[1]:180
In[2]:print(XiaoMing.run)
Out[2]:
这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值。
In[3]:print(XiaoMing.weight)
Out[3]:65
In[4]:XiaoMing.weight = 100
In[5]:print(XiaoMing.weight)
Out[5]:100
而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:
In[6]:ming = XiaoMing()
ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法。
In[7]:ming.run()
Out[7]:小明在跑步
In[8]:print(xiaoming.height)
Out[8]:180
#通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果
In[11]:XiaoMing.run(ming)
Out[11]:小明在跑步
魔法方法__init__
类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数。
而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子。
class Coordinates:
def __init__(self,x,y):
self.x = x
self.y = y
def print_coor(self):
print('当前坐标为(%s,%s)'%(self.x,self.y))
可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中。
In[9]:coor = Coordinates(5,3)
本人具有3年+Python编程经验,目前在一头部教育类公司担任Python开发的工作。经过自己大量的实践与摸索为大家总结一条最佳Python学习路径。此外,本人最近新建了一个Python萌新交流群,由我本人亲自带,如有需要,可关注公号加群。
对于没有编程基础且非科班出身的同学而言,其实第一步是最困难的,也劝退了很多人,就是搭建开发环境。所以新手在刚刚开始学习编程的时候,最好是找视频教程来看,而且是那种手把手教的那种。从搭建环境到写出一个简单的程序HelloWorld,并且初步了解该语言。
在通过视频学习过后,已经基本上了解了该语言,并可以写简单程序的情况下。后续就不要再看视频了,因为视频花费的时间太多,而吸入的知识量太小,这时候就要学会看文档或者博客。通过文字的形式来吸收,速度会进步的更快些。我当时在这个阶段是看的廖雪峰老师的Python教程,大家也可以跟着教程学习,并且跟着教程多敲代码多练。进阶推荐看《流畅的Python》这本书,教程中有感觉困难的点不用死磕,因为可能那个知识点对于现阶段的你理解很困难,但是通过后面的大量练习再反过头来看,有可能就会有恍然大悟的感觉。
在跟着教程学习完之后,可能还是会有自己什么都不会的感觉。别担心,是很正常的情况。这个时候最好选定一个方向,来做几个项目,做项目既能够锻炼自己的代码能力,也能够加强自己的自信心。就以Python举例而言,可选的方向有爬虫,数据分析,后端以及算法。现在企业中用Python来做算法的需求还是挺大的,但是算法这块对于学历而言是有要求的,最好是硕士。当然,如果你能力特强,那就可以忽略。
我当时选的方向是爬虫,因为感觉能够获取到数据感觉好炫酷,由此走上了一条不归路。在爬虫这条道路上,我做了很多项目,也学习了很多教程,量多的我自己都记不太清了。但是可以给大家推荐一本书,是我认为写的非常好而且也适合初学者的一本书。就是崔庆才大佬写的《Python3网络爬虫开发实战》,如果能把这本书的知识完全吃透,可以说应聘一个爬虫工程师的岗位已经不在话下。
如果按照上面我给的路径学习完了的话,恭喜你,已经是一名合格的爬虫工程师了,可以应对现在市面上90%的网站了。剩下的10%的网站就需要用到js逆向的知识了,而且现在很多数据开始转移到app端,所以最近很多公司招聘的爬虫工程师也需要具备app抓取的能力。当然,这都是后面爬虫工程师进阶的内容了,等你走到那一步了可以再找我详聊哦。
以上就是我所分享的关于新手如何学习编程的知识啦。大家学习编程不要怕,只要迈出第一步,后面的路自然就越走越顺啦。学习知识的时候遇到困难的点不用死磕,先放一放,等后面经过大量的练习自然慢慢的就懂啦。一句话,多敲代码。
来日正长,大家一起加油!
如需获取Python各类资料以及想加入交流群记得关注公众号哦!
如果本文对您有所帮助,可以点一下赞👍
本文只是学习笔记,欢迎指错,转载标明出处
1、查询表名,注释 SELECT table_name, table_comment FROM information_schema.TABLES WHERE table_schema = '数据库名' and table_name = "表名" 2、查询列名,注释 select table_name, column_name, column_comment from information_schema.columns where table_name = '表名'; 3、列名拼接操作 -- 单个格最大存储的字节数 show VARIABLES LIKE 'group_concat_max_len' -- 设置大一些,防止显示不全, session表示当前回话有效,关闭窗口重新打开失效 SET SESSION group_concat_max_len=10240; select id,group_concat("需要拼接的字段" separator '分隔符') from 表名 group by id;
如果本文对您有所帮助,可以点一下赞👍
本文只是学习笔记,欢迎指错,转载标明出处
1、OutputStream转InputStream这是一个不合常理的想法 1.1、OutputStream和InputStream均是抽象类,它们内部并有保存数据的变量,转换并没有有意义,定义如下,
public abstract class InputStream implements Closeable { //... } public abstract class OutputStream implements Closeable, Flushable { //... } 1.2、OutStream和InputStream的作用不同
一个OutputStream是用来写的,
一个IntputStream是用来读的。
假设一个是用来写"abc.txt",一个是用来读"abc.txt",这两的概念不同。
2、为什么有人想要OutputStream转InputStream 2.1有个场景如下,后端需要生成一个文件,而开发者又不想在本地缓存(磁盘io效率低),所以在生成文件的时候,会得到一个OutputStream的流(OutStream便于输出文件),开发者这时候有需要将新生成的文件上传到文件服务器(一般文件服务提供的sdk需要的参数就是IntputStream,因为IntputStream便于读取需要上传的文件)。现在的情况就是生成的是OutStream类,但是上传的却是IntputStream,部分的开发者就会想“OutputStream如何转InputStream”这个问题。
2.2真正的解决方法是使用缓存数组和java继承思想
ByteArrayOutputStream是OutputStream的一个实现类,在生成文件的时候它可以代替OutputStream的位置,并且它里面会有个byte buf[],里面才是存储文件实际数据的变量
//定义如下 public class ByteArrayOutputStream extends OutputStream { protected byte buf[]; //... } 同理ByteArrayIntputStream是IntputStream的一个实现类,在生成文件的时候它可以代替IntputStream的位置。ByteArrayOutputStream转换ByteArrayIntputStream,其实就是转换里面byte数组
byte[] buffer =byteArrayOutputStream.toByteArray(); InputStream sbs = new ByteArrayInputStream(buffer);
pycharm的Teminal执行allure命令报错:‘allure’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。(已解决) 解决方法:以管理员权限运行pycharm
分享一个我目前在用的时间差工具类,比较实用,方便检测方法的耗时 /** * @author : xuzhennan * @email : xuzhennan@58.com * @date : 2021年01月15日 8:19 上午 */ public class TimeUtils { /** @return 当前毫秒数 */ public static long nowMs() { return System.currentTimeMillis(); } /** * 当前毫秒与起始毫秒差 * * @param startMillis 开始纳秒数 * @return 时间差 */ public static long diffMs(long startMillis) { return diffMs(startMillis, nowMs()); } public static long diffMs(long startMillis, long endMIllis) { return endMIllis - startMillis; } } 在项目中的应用,主要是在日志中记录该方法的耗时时长 logger.
Centos7下安装了jenkins, 却发现安装不了插件。
jenkins安装插件失败 Caused: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1890) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1885) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1884) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1457) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at hudson.model.UpdateCenter$UpdateCenterConfiguration.download(UpdateCenter.java:1258) 修改default.json, 重启解决 /var/lib/jenkins/updates/ sudo sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json sudo sed -i 's#www.google.com#www.baidu.com#g' default.json sudo sed -i 's#https://mirrors.tuna.tsinghua.edu.cn#http://mirrors.tuna.tsinghua.edu.cn#g' default.json systemctl restart jenkins
随着新能源三电、智能驾驶等新技术的应用,汽车中衍生出很多的安全零部件,如BMS、VCU、MCU、ADAS等,相应的软件在汽车中的比重越来越大,随之而来的安全性、可靠性要求也越来越高。
ANSYS主要针对安全零部件的嵌入式产品级软件提供了SCADE开发套件,支持嵌入式软件详细设计和代码自动生成,有效缩短产品研制周期,提高产品研制效率,提高产品质量。
产品功能
SCADE开发套件由以下主要部分组成:
• SCADE Architect:支持SysML建模能力,可以利用 SysML模型对系统行为及架构进行建模。还在SysML的基础上进行封装定制,扩展出了针对汽车嵌入式系统设计解决方案(AUTOSAR)、AADL及FACE解决方案等。
• SCADE Suite:套件的核心组件,支持控制逻辑详细建模、仿真验证、代码自动生成。基于形式化语言“SCADE”,语法严谨,减少代码生成配置环节,一键从模型生成代码,且代码生成器通过ISO 26262等行业安全标准认证(TCL3),经过安全认证(ASIL D)的代码生成器,适用于高安全软件开发(适用于C 和Ada),支持标定和NI/dSPACE等HIL桥接。
• SCADE Suite Gateway for Simulink:支持将Simulink模型与SCADE模型的双向转换。
• SCADE Display:支持HMI详细设计、仿真验证、代码自动生成。支持生成OpenGL/OpenGL Safety/OpenGL ES代码,代码生成器的通过行业安全标准认证,适用于高安全软件开发。
• SCADE Test:支持对SCADE模型进行验证,包括对SCADE模型进行覆盖率分析、自动化测试环境以及和目标测试平台工具的桥接等。
• SCADE Lifecycle:支持和ALM/PLM(例如DOORS、Reqtify、Polarion)进行桥接实现生命周期数据管理、文档自动生成等。
• SCADE汽车包,专为汽车领域提供SCADE Architect 和SCADE Suite扩展,包括:
♦ AUTOSAR定制符合AUTOSAR4.2.2标准
♦ 支持SCADE Architect项目ARXML文件的导入/导出
♦ 支持SCADE Architect和SCADE Suite进行双向同步,确保架构模型和详细设计模型一致性
♦ SCADE Suite生成的代码符合AUTOSAR标准
♦ 支持ASAM MCD-2 DC(aka ASAP2)软件标定和测量
文章目录 前言一、使用rabin karp算法寻找目标字符串在原字符串中的位置。总结 前言 注:本文主要作为自己学习的记录,并没有详细介绍算法的每一步骤,如有问题欢迎讨论。
要解决的问题如下例:
在"abcde" 中寻找"bcd",则返回位置:1。
一、使用rabin karp算法寻找目标字符串在原字符串中的位置。 代码如下:在这里插入代码片
public int targetIndex(String source, String target) { if (source == null || target ==null || source.equals("") || target.equals("")) return -1; final int BASE = 1000000; int tL = target.length(); // 31^tL; power的作用是用于减去原先第一个数,例如: abcd - a; // 为什么不是31^(tL-1)呢,因为bcd最高次数为31^(tL-1),因此被减去的a的位数只能是31^(tL-1) int power = 1; for (int i = 0; i < tL; i++) { power = (power * 31) % BASE; } int targetCode = 0; for (int i = 0; i < tL; i++) { targetCode = (targetCode * 31 + target.
STM32-HAL库-printf函数重定向(USART应用实例) 文章目录 STM32-HAL库-printf函数重定向(USART应用实例)前言一、STM32CubeMX配置串口二、代码修改1.引入printf重定向代码块2.添加#include 前言 为了便于调试,我们可以利用printf打印出调试的信息,在STM32应用中,我们就可以利用printf函数通过串口打印信息到串口调试助手上
一、STM32CubeMX配置串口 配置好时钟树后配置串口:
二、代码修改 1.引入printf重定向代码块 代码如下:
/* USER CODE BEGIN 0 */ #include <stdio.h> #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int _io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__*/ /****************************************************************** *@brief Retargets the C library printf function to the USART. *@param None *@retval None ******************************************************************/ PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF); return ch; } /* USER CODE END 0 */ 经博主反复尝试和测试,这段代码最适合加在CubeMX自动生成后的usart.c文件的 / * USER CODE BEGIN 0 * / 和 / * USER CODE END 0 * / 中间
let num: number = 123456789.789; let str: string = num.toFixed(2); 还是可以 //1. typeof typeof padding === "number"; typeof padding === "string"; typeof obj === "object"; //2. instanceof if(padder instanceof User){ } //3. constructor.name if(this.constructor.name=="User"){ } /** * 校验字符串是否是数值(包含小数与负数) * 示例: * false : . 1. 1sr - 12. -12. * true: -12 -12.0 -12.056 12 12.0 12.056 * * @param str 需要校验的字符串 * @return false :不是数值 true:是数值 */ public Boolean checkNumber(String str) { String regex = "
修改安装路径 打开 C:\Program Files,查看是否有 Microsoft Office 文件夹,如有则删除;若先前已安装 Office,则将其卸载后删除该文件夹,如不重新安装直接剪切文件夹将无法使用 OneDrive 并持续报错,注:32 位系统对应目录为C:\Program Files (x86)在想要存放的位置新建名为 Microsoft Office 的文件夹,下以 D:\Program Files 为例以管理员权限打开命令提示符:开始菜单-Windows 系统-命令提示符-右键-更多-以管理员身份运行右键粘贴并回车执行这条命令 mklink /j "C:\Program Files\Microsoft Office" "D:\Program Files\Microsoft Office"C:\Program Files 出现带箭头文件夹图标即成功链接文件夹注:C:\Program Files\Microsoft Office 15 也是安装目录,但占用空间小,可不理会,下面进入安装阶段 下载并安装 下面开始,注意office 2021(从2019开始只支持Windows 10)
https://www.microsoft.com/en-us/download/office.aspx 找到Office Deployment Tool 工具,打开网页后,下载 或直接打开Download Office Deployment Tool from Official Microsoft Download Center
我们得到一个类似这样的文件:officedeploymenttool_14326-20404.exe。双击运行解压,指定一个目录,得到如下四个文件:
这里只需要保留setup.exe,其它的预设xml配置文件可以删掉,我们接下来要自己生成配置文件。
创建自定义配置文件 https://config.office.com/
首先左侧选择64位Office,然后在产品一栏中选择要部署的产品和应用下拉菜单,点击添加,之后添加按钮变为更新按钮。右侧栏显示当前的已选择配置。
之后对update channel升级通道进行选择。默认是Office 2019 Perpetual Enterprise通道,部署版本为“最新”或者根据需要点击下拉菜单选择需要的版本。
对产品和版本选择完毕之后。进入下一步的语言选择。
根据需要选择需要使用的界面主要语言(必选)和附加语言(可选)。此处我们以简体中文Chinese(Simplified China)为例。
语言选择完毕之后进入下一步的安装选项,主要是设定Office产品的部署方式,包括CDN和本地,以及安装时的用户交互及细节设定。根据需要进行选择。个人用户选择CDN即可。
对安装部署方式设定完毕之后进入下一步的更新和升级选项。和上一步对应可选有CDN和本地源。这里默认勾选了删除传统Office MSI版本的选项。以及具体的安装卸载设定。根据需要进行勾选即可。
对安装和更新选项设定完毕之后进入授权和激活步骤。以KMS激活方式为例。
我们想在建立局域网时共享数据和设备。有些朋友认为在计算机上设置局域网资源共享步骤太麻烦了。他们下载了一键式局域网资源共享工具,但对其软件并不熟悉。他们询问如何在win10系统中使用一键局域网共享工具。让我们看看
win10系统中如何实现一键共享局域网?事实上,市面上有很多一键式的局域网共享工具,操作起来非常方便。一个按钮可以设置局域网共享。Win7和win10系统适用。我已经整理出如何使用win10一键局域网共享工具。让我们了解一下
win10的一键LAN共享工具 1。打开下载一键式局域网共享工具,根据需要选择共享模式,点击界面右下角的共享设置
局域网共享图详情-1
2。在设置界面,选择打开的假冒案件局域网共享,点击完成设置
Win10一键LAN共享图详细信息-2
3。单击下面菜单中的“共享文件夹”按钮
Win10图表详细信息-3
4。弹出“浏览文件夹”窗口,选择要共享的文件,然后单击“确定”
局域网共享图详情-4
5。输入共享名称,选择共享模式,然后单击“确定”以共享。然后其他人可以看到您通过其他计算机共享的文件
局域网共享图详情-5
以上是如何使用win10一键局域网共享工具。如果你学会了如何使用它,试试看
在编写代码的过程中,为了提高代码的运行速度,我们常常需要对书写的python代码进行性能测试,而代码性能高低的直接反馈之一就是电脑运行代码所需要的时间。今天小编在这里给大家介绍几种常用的测试代码运行速度的方法。
第一种:使用time模块对代码的运行时间进行统计
效果如下:
我们采用time 模块给所要测试的代码的前后加上时间戳,一个记为start_time,一个记作end_time,最后代码块的运行时间为end_time-start_time,单位为s(秒)。当然在python中还有许多的记录时间的模块,这里不做过多讨论,均类似于time模块,实现思路上一致,代码实现上大同小异。
第二种:使用IPython的Built-in magic commands,%time
这个类定义是可以去掉的,并不会影响最终的结果,%time 后面加上想要计算时间的代码,然后编译器就会在运行后自动给出所测试代码的运行时间,但是经过测试,%time方法测出的时间并不准确,时间波动范围非常大,这个是很好理解的,因为计算机每时每刻都在处理一些进程,也就是说计算机的运行状态每时每刻都是不同的,所以在不同的时刻测试同一段代码的运行时间也会得到不同的结果。
第三种:用IPython的另一个Built-in magic commands,%timeit,使用方法类似于%time
我们可以看到得到的结果是:每个循环8.53 ms±452 µs(平均±标准偏差,共运行7次,每个循环100个)%timeit相比于%time,%timeit会多次执行测试代码,并且会取它们运行时间的平均值,并且还会计算出它们的标准差,因此这种计算方法计算的结果相对于使用%time执行测试代码一次是比较准确的。
第四种:导入timeit模块来计算代码块的执行时间
效果如下:
导入timeit模块后使用timeit.timeit()来测试想要测试的代码,并且代码以string的形式进行输入,并且需要设定number值,设定测试的该段代码需要执行的次数,最终我们得到0.05363089999991644,单位是s(秒),与内置魔法方法%timeit方法不同的是虽然也是多次计算,但是最终获取的时间是n次执行代码所需的总时间而不是执行一次的时间。
以上,放进自己的代码里试试看吧~
蜗牛星际 B款 设置、安装OpenMediaVault采办来由& b+ Y1 r% i0 e1 ~; Z5 X9 \' |0 k
自从客岁手机莫名坏掉,致使大部分照片损失后,我就起头自己在家组nas,用于存储家里每小我手机中的照片、视频,同时也作为下载电影的家庭收集硬盘。最关键的,划出了自力的分区用来备份我工作的材料。比来“喜逢”蜗牛星际矿难,大量矿难机低价出现在市道上。我看了一下,J1900的CPU,4焦点4线程,2G主频,4G内存,还送个16G的MSATA口的SSD,4硬盘位。除了电源比力渣滓,是150W之外,其他还行,最最少值了260元的票价了。经过谨慎挑选,动手了B款(仿“万由”)单网卡版本。今朝看,这个版本的硬件题目最少。
) k7 ^1 x( J9 r" o3 v/ ?表面展现: d& o V; U1 a7 z6 N0 Y
021516573pyni310int.jpg (83.45 KB)
021516573pyni310int.jpg
2019-4-2 14:57 上传
- C5 U& Q6 e5 L+ I4 _3 G利用感受
. s) b9 s( K/ `4 U! D$ _1BIOS设备安装系统之前,先搞定BIOS设备。原本的设备为了采矿办事,插电会自动开机,而且貌似没有插显现器还不能开机……(这个题目倡议左右开弓,BIOS改,操纵系统也改)下面把我的BIOS设备贴上来,只贴点窜的部分。1.1设备“启动系统”设备启动系统,保证安装NAS系统后,可以经过远程方式关机。进入“Advanced”页,“OS Slection”挑选“Windows 8.X”。
$ `+ {- m# ]0 q0 w5 |
02151657g2lcaqbfcbf.jpg (91.02 KB)
一个比较简单的实践代码一次能过,代码如下
#!/user/bin/python3 # -*- coding = utf-8 -*- # @Time : 2021/1/31 # @Author : schKatze # @File : try # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import re import urllib.request, urllib.error import xlwt findLink = re.compile(r'<a href="(.*?)">') findImgSrc = re.compile(r'<img.*src="(.*?)">', re.S) findTitle = re.compile(r'<span class="title">(.*)</span>') findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>') findJudge = re.compile(r'<span>(\d*)人评价</span>') findInq = re.compile(r'<span class="inq">(.*)</span>') findBd = re.compile(r'<p class="">(.*?)</p>', re.S) def getData(baseurl): datalist = [] for i in range(0, 10): url = baseurl + str(i * 25) html = askURL(url) soup = BeautifulSoup(html, "
1. 引言 BottomSheetBehavior能实现怎样的效果,一图胜千言。
如果仅仅是实现上下拖动和隐藏的功能。抛开BottomSheetBehavior自己实现也不难,在没有CoordinatorLayout的年代,这种效果往往是纯手工打造。既然如此为何Google要专门设计BottomSheetBehavior呢?为了搞清楚这个问题,我查阅源码探究了一番,确实发现了一些隐秘的角落。我将从以下几个方面讲解BottomSheetBehavior的设计思路
讲解BottomSheetBehavior的几种状态讲解BottomSheetBehavior的事件分发讲解BottomSheetBehavior如何处理嵌套滑动实现高德地图首页效果,欢迎关注字节小站微信公众号号 2. BottomSheetBehavior的几种状态 BottomSheetBehavior一共有6种状态
STATE_EXPANDED 全部展开状态STATE_COLLAPSED 收起状态STATE_DRAGGING 拖动状态STATE_SETTLINGSTATE_HIDDEN 隐藏状态STATE_HALF_EXPANDED 半展开状态 系统通过哪种方式实现每种状态不同的偏移量呢?
layout阶段通过ViewCompat.offsetTopAndBottom(child, offset)实现偏移量用户触摸交互阶段通过ViewDragHelper.dragTo(left,top,dx,dy)实现偏移量 2.1 Layout阶段 Layout阶段最后会通过findScrollingChild方法,寻找开启了嵌套滑动的后代View。其实这就是Google单独研发出BottomSheetBehavior的主要考量。满足支持嵌套滑动的BottomSheet效果。
2.2 用户触摸交互阶段 2.3 状态对应的偏移量 状态偏移量STATE_COLLAPSEDcollapsedOffsetSTATE_EXPANDEDgetExpandedOffset()STATE_HALF_EXPANDEDhalfExpandedOffsetSTATE_HIDDENparentHeight 1. 计算 collapsedOffset 变量名默认值PEEK_HEIGHT_AUTO常量值-1peekHeightMin默认值64dp,用户不可修改peekHeightAuto默认值true,用户可设置peekHeight默认值0,如果设置为PEEK_HEIGHT_AUTO peekHeightAuto为true否则为false,如果设置小于-1则为0fitToContents默认值true,用户可设置fitToContentOffsetMath.max(0, parentHeight - child.getHeight()) peekHeight默认值为0。设置逻辑如下
height为-1,则peekHeightAuto设置为true。否则peekHeightAuto为false,而且peekHeight最小值为0。
计算collapsedOffset值有四种情况
CasepeekHeightAutofitToContentscase1truetruecase2truefalsecase3falsetruecase4falsefalse 返回值
Case返回值Case1Math.max(parentHeight - Math.max(peekHeightMin, parentHeight - parentWidth * 9 / 16), fitToContentsOffset)Case2parentHeight-Math.max(peekHeightMin, parentHeight - parentWidth * 9 / 16)Case3Math.max(parentHeight - peekHeight, fitToContentsOffset)Case4parentHeight - peekHeight 2. 计算 halfExpandedOffset 3. 计算 expandedOffset 4.如何固定BottomSheetBehavior的高度? 了解这些值的计算有什么好处。假设我想让BottomSheetBehavior,固定高度,不能向上滑也不能向下滑。那我们则需要将collapsedOffset和expandedOffset设置为一样的值才行。
文章目录 前言:安装anacondaAnacond的介绍Anacond下载与安装 测试vscode配置环境结语 前言: 刚开始用vscode学习写python,遇到许多问题。
这次的代码需要导入numpy,pandas等多种库,在网上浏览众多方法后找到了自认为最简便的方法:用anaconda来导入库。
同时也方便以后继续导入其他的库。
已有环境:已装 vs code和运行python所用的插件
安装anaconda Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(400+MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。
Conda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换
Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等
Miniconda包括Conda、Python
Anacond下载与安装 官网下载地址:link
可以参考这篇文章进行下载和安装,有几个注意点:link
测试 参考文章:link
1.打开cmd [WIN+R /cmd]
输入-conda list。
如下图所示,Anaconda安装成功。
2.创建环境
输入-conda create -n test python=3.8.3 pip
#根据版本号修改Python版本,例如你的python版本是3.7,则改成-conda create -n test python=3.7 pip
#可以在vs code 页面左下角看到Python版本
会出现Proceed (y/[n])? ,输入y即可
其余的步骤在上面链接的文章里讲的很清楚
vscode配置环境 遇到的问题:当前代码需要导入numpy库
解决方案:
1.还是点击 vs code 左下角版本号的地方,会出现下图的选项,选择解释器为test:conda这个版本
2.此时运行仍然报错,说没有 numpy这个库,我们需要安装这个库
3.打开cmd,输入-conda install numpy,安装numpy库成功后再次运行,问题解决
安装库的过程参考文章:link
结语 1.可以用上述方法安装各种库,简易方便。
2.通过学习别人的方法然后汇总记录,希望能解他人之便
1. 编译器、调试器安装 1.1 安装GCC, GDB sudo apt update #通过以下命令安装编译器和调试器 sudo apt install build-essential gdb 安装成功确认
# 以下命令确认每个软件是否安装成功 # 如果成功,则显示版本号 gcc --version g++ --version gdb --version 1.2 CMake安装 # 通过以下命令安装编译器和调试器 sudo apt install cmake 安装成功确认
# 确认是否安装成功 # 如果成功,则显示版本号 cmake --version 2. GCC编译器 GCC 编译器支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)
等程序;Linux 开发C/C++ 一定要熟悉 GCCVSCode是通过调用GCC编译器来实现C/C++的编译工作的; 实际使用中:
使用 gcc 指令编译 C 代码;使用 g++指令编译 C++ 代码
2.1 编译过程 1. 预处理-Pre-Processing //.i文件
# -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.