目录 解决方案尝试1解决方案尝试2标题:【VScode】Remote-SSH XHR failed无法访问远程服务器,或者一直反复让你输入密码,但就是进不去。解决方案尝试3问题概述原因与解决方法 解决方案尝试1 最近通过vscode一直使用腾讯云的服务器作为远程开发环境,以前一直很好用。
直到最近重装了系统之后,发现vscode没法对云服务器进行连接了,即使在远程主机添加了本地的公钥也不行。直接报错:Could not establish connection to…
报错信息中有以下两条重点语句:
Host key verification failed. 过程试图写入的管道不存在。 这是因为vs code在连接和ssh终端连接类似,由于之前连过该ip对应的服务器,vscode本地(win本地)已经保存了该ip对应服务器的密钥。重置服务器当该ip对应的服务器发生变化时,连接的时候发现远程服务器发回来的密钥跟之前的对不上了,就连接失败了,本质上是vscode的阻止行为!不要怪罪远程服务器!
那么解决就需要将原来的密钥删掉。
解决方式
vscode是在win下的客户端,而保存这种连接密钥的路径是:用户
.ssh\known_hosts
我们在win下删掉用户.ssh\known_hosts中的known_hosts文件即可
解决方案尝试2 多次异常退出了服务端,可能导致后续vscode链接服务器时循环输入密码无法连接;
这时候我们需要将服务器端的root根目录~下的.vscode-server文件夹(ls -a可以查看 .开头的是隐藏文件)
将其全部删除:rm -rf .vscode-server
接着重新vscode链接服务器,就好啦!
标题:【VScode】Remote-SSH XHR failed无法访问远程服务器,或者一直反复让你输入密码,但就是进不去。 解决方案尝试3 问题概述 当使用VScode连接远程服务器时,往往需要使用Remote-SSH这个插件。而该插件有一个小bug,当远程服务器网络不佳时容易出现。
在控制台会出现下述语句:
Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/d:/Microsoft%20VS%20Code/resources/app/out/vs/workbench/workbench.desktop.main.js:77:1261) 原因与解决方法 原因
该插件在连接远程服务器时,插件会在服务器端自动运行一个脚本。该脚本的主要内容是检查服务器的vscode-server的运行情况,若服务器端不能运行,则会自动下载。而当服务器网络不佳时,下载往往会超时,导致连接失败。
解决方法
懂了报错的原因,那就可以从中找出解决方法。即手动在本地下载安装包,然后手动传到服务器端。这样是可以解决这个问题的,虽然不是很优雅。
步骤
1.通过其他SSH等方式(如:Xshell),进入远程服务器的Terminal。
2.在服务器端,进入下面的目录,获取commit id。
$ ls ~/.vscode-server/bin 2ccd690cbff1569e4a83d7c43d45101f817401dc 在这里,我的commit id就是2ccd690cbff1569e4a83d7c43d45101f817401dc。
3.手动下载出问题的包(tarball),注意下面的COMMIT_ID要替换成自己在上一步得到的commit id。
稳定版下载链接:https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/stable 内测版下载链接:https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/insider 如我的稳定版链接就是:https://update.code.visualstudio.com/commit:2ccd690cbff1569e4a83d7c43d45101f817401dc/server-linux-x64/stable
4.下载后会得到一个vscode-server-linux-x64.tar.gz,将其通过sftp等方式传到服务器上。路径:~/.vscode-server/bin/COMMIT_ID/vscode-server-linux-x64.tar.gz
这个报错通常是路由跳转时发生的,首先查看路由表中是否有当前页面。
路由表路径: entry > src > main > resources > base > profile > main_pages.json
注意:在pages目录下创建的文件会自动添加到main_pages.json文件中,在非pages目录下创建的页面,需要手动在该文件下添加路由信息。
例如,我components目录下的common.ets如果需要跳转到Demo页面,也需要在main_pages.json文件中声明,否则跳转会报错。
这是淘宝镜像证书过期导致的
过期地址
npm config set registry https://registry.npm.taobao.org 修改为,再次输入该命令即可
npm config set registry https://registry.npmmirror.com
当我们再写自己的网页的时候,我们通常会在一个大盒子里面放若干个小盒子,想要把这若干个盒子排成一排,,倘若我们给每个小盒子设置display:inline-block;并且设置好宽高之后,理论上是会排成一排的,但是在实际中却会出现最后一个盒子被挤掉的情况。
我们可以发现,小盒子之间出现了莫名的小空隙,而且这些空隙将后面的小盒子挤到了下一行。
代码如下
HTML部分
<body> <div class="box"> <div class="child red">1</div> <div class="child blue">2</div> <div class="child green">3</div> </div> </body> CSS部分
<style> .box { width: 150px; height: 150px; border: 1px solid #666; font-size: 0px; } .child { width: 50px; height: 50px; display: inline-block; font-size: 16px; } .blue { background-color: blue; } .green { background-color: green; } .red { background-color: red; } </style> 当我们给大盒子设置了 font-size: 0px; 就会发现,这个边距就会被取消掉了
这是由于我们在写代码是的回车造成的,我们每一个在盒子后面的回车就会造成一个文本节点,这个文本节点会占用我们盒子的一些距离。
解决方法也很简单,既然你是文本,我直接将你文本大小弄成0不就行了,在大盒子中设置font-size:0;就可以很好地实现我们的效果。
在Python的世界里,切片(Slicing)是一种高效访问序列元素(如列表、元组、字符串等)的方式。无论是新手还是资深开发者,掌握切片操作都能大大提高编程的效率。本文旨在通俗易懂的语言中,带你从入门到精通学习Python切片的使用。
切片基础 切片操作允许我们获取序列的一部分。其基本语法为序列[start:stop:step],其中start是开始索引,stop是结束索引,而step是步长。
示例1:基本切片操作 考虑一个简单的列表,我们来看看如何使用切片操作来访问它的部分元素。
# 定义一个列表 numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 获取列表的前三个元素 print(numbers[0:3]) # 输出: [0, 1, 2] # 如果从列表开头开始切片,可以省略 start print(numbers[:3]) # 输出: [0, 1, 2] # 获取列表的最后三个元素 print(numbers[-3:]) # 输出: [7, 8, 9] 示例2:步长的使用 步长step决定了切片操作中元素的间隔。
# 定义一个列表 numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 使用步长为2进行切片 print(numbers[::2]) # 输出: [0, 2, 4, 6, 8] # 使用步长为-1进行切片,即逆序 print(numbers[::-1]) # 输出: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 切片进阶 切片不仅可以用于列表,还能应用于字符串和元组等类型的数据。
1. 正则表达式,又称正规表达式、常规表达式
使用字符串来描述、匹配一系列符合某个规则的字符串
正则表达式组成:
普通字符包括大小写字母、数字、标点符号及一些其他符号。
元字符是指在正则表达式中具有特殊意义的专用字符
man 7 regex
可以使用man手册帮助
2、元字符
基础正则表达式常见元字符
(支持的工具:grep、egrep、sed、awk)
3、扩展正则表达式元字符
grep -E
字符作用+表示匹配前面的子表达式1次以上?表示匹配前面的子表达式0或者1次 ( )
将括号里的内容看成一个整体| 以或的方式匹配字符串
4. grep
格式:
grep [选项]… 查找条件 目标文件
-color=auto 对匹配到的文本着色显示
-m # 匹配到#次后停止;匹配到#行后停止
-v 显示没有被匹配到的行,即取反
-i 忽略字符大小写
-n 显示匹配到的行号
-c 统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A 匹配到的行后#行也显示出来
-B 匹配到的行前#行也显示出来
-C 匹配到的行前后各#行也显示出来
-e 实现多个选项间的逻辑or关系
-w 匹配整个单词
-E 扩展正则表达式,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f file根据模式文件,处理两个文件相同内容,把第一个文件作为匹配条件
-r 递归目录,但不处理软链接
-R 递归目录,处理软链接
实例:
统计当前主机的连接状态
统计当前连接的主机数
5. sed的基本概念
ECMAScript语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。接下来,就让我们一起先睹为快吧!
全文概览:
Promise.withResolversObject.groupBy / Map.groupByArrayBuffer.prototype.resizeArrayBuffer.prototype.transferString.prototype.isWellFormedString.prototype.toWellFormedAtomics.waitAsync正则表达式 v 标志 Promise.withResolvers() Promise.withResolvers() 允许创建一个新的 Promise,并同时获得 resolve 和 reject 函数。这在某些场景下非常有用,特别是当需要同时访问到 Promise 的 resolve 和 reject 函数时。
Promise.withResolvers() 完全等同于以下代码:
let resolve, reject; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); 通常,当创建一个新的 Promise 时,会传递一个执行器函数给 Promise 构造函数,这个执行器函数接收两个参数:resolve 和 reject 函数。但在某些情况下,可能想要在 Promise 创建之后仍然能够访问到这两个函数。这就是 Promise.withResolvers() 的用武之地。
使用 Promise.withResolvers() 的一个例子:
const { promise, resolve, reject } = Promise.
react中直接使用lodash的debounce函数,发现并未生效,1秒内多次触发,控制台仍有多次打印,这是因为debounceSearch函数被重新定义了,需要使用useCallback来包装函数。
import { ChangeEvent } from "react" import { useCallback, useState } from "react" import { Input } from "antd" import _ from "lodash" export default () => { const [idValue, setIdValue] = useState<string>("") const debounceSearch = _.debounce((value) => { console.log(value) }, 1000) ) const onIptChange = (e: ChangeEvent<HTMLInputElement>) => { debounceSearch(e.target.value) } return <Input value={idValue} onChange={onIptChange}/> } 使用useCallback,可以将这个函数缓存起来,避免重复定义。
const debounceSearch = useCallback( _.debounce((value) => { console.log(value) }, 1000), [] )
一、了解接口和接口测试 1、什么是接口? 电脑:USB,投影机(数据传输)
软件:统称APl,application,program,interface,微信提现和充值,支付宝支付,银联支付接口。(鉴权码:token,key,appkey)
2、接口包括:内部接口和外部接口 内部接口:开发人员自己开发的对自身系统提供的接口。
外部接口:开发系统调用外部的,微信,支付宝,其他的接口。
总结:接口就是软件提供给外部的一种服务。用于做数据传输。
3、软件为什么需要接口? 因为接口能够让内部的数据被外部进行修改。
4、我们为什么要做接口测试 ? (1)现在很多系统都是前后端分离,开发的进度不一样,需要把一开始开发出来的接口进行测试。
(2)基于安全考虑,前端有验证很容易绕过,直接请求接口,特别:身份证信息,银行卡,金钱交易。
(3)测试推崇的是测试左移,测试尽早的介入。
接口测试的本质:就是测试接口能否正常的交互数据,权限控制以及异常场景
5、接口测试的简介和分类 接口测试就是测试系统组件接口之间的一种测试。
分类:
测试外部接口:测试被测系统和外部系统之间的接口。(只需要测试正例即可)
测试内部接口:
1.内部接口只提供给内部系统使用。(预算系统,承保系统)(只需要测试正例即可)2.内部接口提供给外部系统使用。(测试必须非常全面,正例,各种异常场景,权限控制) 二、接口测试的流程以及用例的设计 1.拿到接口api文档(通过抓包工具获取),熟悉接口业务,接口地址,鉴权方式,入参码。
2.编写接口用例以及评审。
思路:
正例:输入正常入参,接口能够成功返回数据。
反例:
鉴权反例:鉴权码为空,鉴权码错误,鉴权码过期 参数反例:参数为空,参数类型异常,参数长度异常。 错误码覆盖:根据业务而定的。 其他错误场景:接口黑名单,接口调用次数限制,分页场景 3.编写用例和评审
4.使用接口测试工具Postman执行接口测试.
5.Postmain+Newman+Lenkins实现持续记成,并且输出测试报告并且发送邮件
三、接口返回数据和JSON详解 1、json格式:三组数据 {error_code:0,msg:"提现成功",data:[]} error code:错误码,0代表成功, codemsg:对错误码的中文说明 data:真正的返回的数据 2.html格式 <html> <title></title> <body> <error code>0</error code> ...... </body> </html> 3.xml格式 [ <?xml?version="1.0" encoding="utf-8"> <error code>0</error code> ...... </xml> 推荐一个网页工具在线JSON校验格式化工具(Be JSON)https://www.bejson.com/
四、接口测试协议 1、webservice协议: 接口地址: http://......?wsdl
http://192.168.12.1:8080/addUser
http://192.168.12.1:8080/delUser
搜索镜像 docker search nginx 下载拉取nginx镜像 docker pull nginx 查看镜像 docker images 启动容器 docker run -d --name nginx01 -p 3344:80 nginx 外部端口需要在服务器安全组中设置,使用docker镜像nginx以后台模式启动一个容器,并将容器命名为nginx01
-d 是后台访问
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
--name 为容器指定一个名称
查看容器 docker ps 测试访问 curl 127.0.0.1:3344 浏览器输入服务器地址加端口号出现下图即安装成功
进入容器修改界面 docker exec -it nginxd /bin/bash 查看nginx安装位置 whereis nginx 退出容器修改界面 exit
机器学习是什么以及有哪些应用场景 一、机器学习是什么二、机器学习有哪些应用场景三、如何学习机器学习 一、机器学习是什么 机器学习(Machine Learning, ML)是一种计算机科学技术,它允许计算机系统在没有明确编程的情况下通过从数据中学习和推断模式来改进其表现。这种技术的核心是构建和使用算法模型,这些模型能够通过分析大量输入数据自动“学习”规律,并基于这些规律做出预测、分类、聚类或决策。机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构,从而不断改善自身的性能。机器学习是人工智能的核心,是实现计算机智能化的根本途径。
机器学习使用计算机作为工具,致力于真实实时地模拟人类学习方式,并将现有内容进行知识结构划分,以有效提高学习效率。根据学习模式、学习方法以及算法的不同,机器学习存在不同的分类方法,例如监督学习、无监督学习和强化学习等。
在机器学习的实践中,主要有几种类型的学习方式:
监督学习:这是最常见的机器学习形式,在监督学习中,算法从带有标签的数据集中学习,即每个样本都有一个已知的结果(如垃圾邮件/非垃圾邮件)。算法通过学习这些例子之间的关联性来建立一个模型,以便对新数据进行预测。无监督学习:在这种情况下,算法处理的是没有标签或结果的数据集,目标是发现数据中的内在结构、模式或关系。例如,聚类算法可以将相似的对象分组到一起,而无需提前知道哪些对象应当被分在同一组。半监督学习:这是一种介于监督学习和无监督学习之间的方法,用于处理部分标记的数据集。在这种情况下,算法利用少量有标签的数据以及大量的未标记数据进行学习。强化学习:强化学习是让智能体在与环境互动的过程中通过试错法学习,以最大化长期奖励为目标,而非直接依赖于预先提供的标签。 此外,机器学习还包括其他子领域和技术,如迁移学习(Transfer Learning)、集成学习(Ensemble Learning)、深度学习(Deep Learning)等。这些技术在诸多现实世界的应用中发挥了重要作用,包括但不限于自然语言处理(NLP)、图像识别、推荐系统、金融风控、医疗诊断等诸多领域。
基于数据的机器学习是现代智能技术中的重要方法之一,研究如何从观测数据(样本)出发寻找规律,并利用这些规律对未来数据或无法观测的数据进行预测。机器学习的研究和发展已经历了多个阶段,并涉及到许多不同的算法和技术。
总的来说,机器学习是一门涵盖多个学科领域的交叉学科,其研究目标是让计算机能够像人类一样具有学习和适应的能力,从而实现智能化。机器学习的发展和应用对于人工智能技术的进步和发展具有重要的意义。
二、机器学习有哪些应用场景 机器学习是一种广泛应用的技术,其应用场景非常多样化。以下是一些常见的机器学习应用场景:
推荐系统:机器学习被广泛应用于推荐系统中,如电商网站的商品推荐、社交媒体的内容推荐等。通过分析用户的历史行为和偏好,机器学习算法可以预测用户可能感兴趣的内容,并提供个性化的推荐。自然语言处理:自然语言处理是机器学习的另一个重要应用领域,包括语音识别、机器翻译、情感分析、垃圾邮件过滤等。机器学习算法可以帮助计算机理解和生成人类语言,实现人机交互的智能化。图像识别和处理:机器学习在图像识别和处理方面也发挥着重要作用,如人脸识别、车牌识别、图像检索、物体识别等。通过训练大量的图像数据,机器学习算法可以学习并识别出图像中的特征,从而实现对图像的智能处理。金融和保险:机器学习在金融和保险领域也有广泛的应用,如信用评估、欺诈检测、风险管理等。通过分析大量的金融数据,机器学习算法可以帮助金融机构更好地评估风险和制定策略。医疗和生物科学:机器学习在医疗和生物科学领域也有重要的应用,如医学影像分析、药物研发、基因分析等。机器学习算法可以帮助医生更准确地诊断疾病和制定治疗方案,同时也可以帮助科研人员更好地理解和研究生物科学问题。 除此之外,机器学习还可以应用于交通、农业、物流、教育、政府等领域,为各个行业带来更高的效率和更好的服务。随着技术的不断发展和进步,机器学习的应用场景还将不断扩大和深化。
三、如何学习机器学习 学习机器学习可以遵循以下步骤:
基础知识准备 数学基础:掌握线性代数、微积分、概率论与统计学的基础知识,这些是理解机器学习算法的核心。编程语言:Python是目前最流行的机器学习编程语言,熟悉Python的数据处理和编程技巧很重要。当然,Java、R等其他语言也有相应的库支持机器学习。 安装开发环境 安装Anaconda或Miniconda,它们预装了大量科学计算和数据分析相关的库,并提供了方便的虚拟环境管理功能。在环境中安装常用的机器学习库,如Python中的Scikit-learn、TensorFlow、Keras、PyTorch等。 理论学习 学习机器学习的基本概念,包括监督学习、无监督学习、强化学习的不同类型和常见算法(如决策树、随机森林、SVM、KNN、神经网络、聚类算法等)。阅读相关书籍、教程、文档以及学术论文,了解不同算法的工作原理及其适用场景。 动手实践 从简单的数据集开始,例如在Kaggle上参与入门级别的竞赛项目,像泰坦尼克号乘客存活预测问题,通过实际操作来理解和应用机器学习模型。利用公开数据集进行数据清洗、特征工程、模型训练及调优、模型评估等一系列流程的实战演练。 使用工具和框架 熟悉并掌握如何使用所选编程语言的机器学习库,例如在Python中加载数据、构建特征矩阵、训练模型、交叉验证和网格搜索参数优化等。探索更高级的主题,如深度学习时,学习如何搭建神经网络结构,进行模型可视化和调试。 项目经验积累 参与实际项目,解决真实世界的问题,这将帮助你更好地理解如何在整个机器学习项目生命周期中工作,包括业务理解、数据获取、分析、建模到最后的产品化部署。 持续跟进和学习 关注机器学习领域的最新研究和技术动态,阅读技术博客、观看在线讲座、参加研讨会等。加入相关社区,如GitHub、Stack Overflow、Kaggle论坛等,分享交流经验和解决问题。 总之,学习机器学习是一个循序渐进的过程,需要理论与实践相结合,不断通过实验去验证和深化对算法的理解,并随着实践经验的增长逐步提高自己在这个领域的能力。
本文完结!
来源:算法进阶 本文详细研究这篇论文《Mamba:具有选择性状态空间的线性时间序列建模》。 Mamba一经出现就在人工智能界掀起波澜,被吹捧为Transformer的竞争对手。到底是什么让Mamba在拥挤的序列建模中脱颖而出? 今天我们来详细研究这篇论文《Mamba:具有选择性状态空间的线性时间序列建模》
在介绍之前先简要回顾一下现有的模型
Transformer:以其注意力机制而闻名,其中序列的任何部分都可以动态地与任何其他部分相互作用,特别是具有因果注意力机制的Transformer,擅长处理序列中的单个元素。但是它们带来了显著的计算和内存成本,与序列长度的平方(L²)成比例。
循环神经网络(rnn): rnn只考虑当前输入和最后一个隐藏状态,按顺序更新隐藏状态。这种方法允许它们潜在地处理无限序列长度和恒定的内存需求。但是rnn的简单性是一个缺点,限制了它们记住长期依赖关系的能力。此外,rnn中的时间反向传播(BPTT)是内存密集型的,并且可能遭受梯度消失或爆炸的影响,尽管有LSTM等创新部分解决了这个问题。
State Space Models(S4):这些模型已经显示出很好的特性。它们提供了一种平衡,比rnn更有效地捕获远程依赖关系,同时比transformer更高效地使用内存。
接下来Manba登场!
Mamba 选择性状态空间:Mamba建立在状态空间模型的概念之上,但它引入了一个新的变化。它利用选择性状态空间,支持跨长序列更高效和有效地捕获相关信息。
线性时间复杂度:与Transformer不同,Mamba在序列长度方面以线性时间运行。这个属性使得它特别适合涉及非常长的序列的任务,而传统模型在这方面会遇到困难。
Mamba以其选择性状态空间的概念引入了传统状态空间模型的一个有趣的改进。这种方法稍微放松了标准状态空间模型的严格状态转换,使其更具适应性和灵活性(有点类似于lstm)。并且Mamba保留了状态空间模型的高效计算特性,使其能够在一次扫描中执行整个序列的前向传递——这一特性更让人想起Transformer。
在训练期间,Mamba的行为类似于Transformer,同时处理整个序列。而lstm必须一步一步地计算前向传递,即使所有输入都是已知的。在推理中,Mamba的行为更符合传统的循环模型,提供有效的序列处理。
先验状态空间模型(ssm)的一个关键限制是其刚性的、输入不变的结构。这些模型为整个序列使用一组固定参数(我们称它们为a和B)。这种结构甚至比lstm等模型更具限制性,在lstm中,信号的转换可能依赖于先前的隐藏状态和输入。
Mamba则是一种范式转换,即如何计算向下一个隐藏状态的过渡?在Mamba的体系结构中,转换依赖于当前输入,这种方法在传统ssm的固定计算和循环神经网络的输入依赖动态性之间取得了平衡。
主要组成如下:
固定主干:从一个隐藏状态到下一个隐藏状态的转换仍然是一个固定的计算(由a矩阵定义),允许跨序列的预计算。
输入相关转换:输入影响下一个隐藏状态(由B矩阵定义)的方式取决于当前输入,而不是之前的隐藏状态。与传统ssm相比,这种输入依赖性提供了更大的灵活性。
为了满足这种方法的计算需求,Mamba使用了一种硬件感知算法。该算法使用扫描操作而不是卷积来循环执行计算,这样在gpu上是非常高效的。尽管输入依赖转换带来了算法复杂性,但这种效率对于保持高性能至关重要。
Mamba和选择性状态空间模型不是同义词。Mamba是一个使用选择性状态空间概念的实现。这种区别是至关重要的,因为它突出了Mamba的独特贡献:在保持计算效率的同时,使ssm框架更加灵活和相应输入。
SRAM和HBM gpu包含两种主要类型的内存:HBM (High Bandwidth memory)和SRAM (Static Random-Access memory)。HBM虽然带宽很高,但与更快但更小的SRAM相比,它的访问时间相对较慢。Mamba则使用SRAM在矩阵乘法期间进行快速访问,这是其计算的关键。
计算中的主要瓶颈通常不是计算本身,而是数据在内存类型之间的移动。Mamba通过显著减少传输大量数据的需求来解决这个问题。它通过直接在SRAM中执行算法的关键部分(如离散化和递归计算)来实现,从而减少延迟。
还引入了一个融合选择扫描层,使其内存需求与使用flash attention的优化Transformer实现相当。这一层对于保持效率至关重要,尤其是在处理模型中依赖于输入的元素时。
结果 Mamba代表了序列建模的重大进步,特别是在其高效使用GPU内存和计算策略方面。它具有高效率处理长序列的能力,使其成为各种应用的有前途的模型,我们下面来使用Pytorch来对其进复现。
Pytorch复现 导入基本库
import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset from torch.nn import functional as F from einops import rearrange from tqdm import tqdm import math import os import urllib.
现代操作系统阅读笔记 第一章 引论 1. 操作系统定义 操作系统是运行在内核态的软件,它执行两个基本上独立的任务。
隐藏计算机底层硬件的实现,为用户及应用程序提供一个资源集的清晰抽象。
管理计算机硬件资源。
任何操作系统的核心是它可处理的系统调用集。这些系统调用集真实地说明了操作系统做的工作。
2. 计算机运行模式 多数计算机有两种运行模式:内核态和用户态。
软件中最基础的部分是操作系统,它运行在内核态。这内核态模式下,操作系统具有对所有硬件的完全访问权,可以执行机器能够运行的任何指令。软件的其余部分运行在用户态下,在用户态下,只能使用机器指令中的一个子集。
3. shell 与 GUI 用户与之交互的程序,基于文本的通常称为shell,而基于图标的则称为图形用户界面(GUI)。
它们并不是操作系统的一部分,它们是运行在用户态最低层次的用户接口程序
4. 对于抽象的理解 现代计算机系统中,大量使用了抽象这一概念。抽象是管理复杂性的一个关键。好的抽象可以把一个几乎不可能管理的任务划分为两个可管理的部分。其中第一部分是有关抽象的定义和实现,第二部分是随时用这些抽象解决问题。
以抽象的角度看操作系统,它的任务就是创建好的抽象,并实现和管理它所创建的抽象。
5. 多路复用资源方式 在时间上复用:当一种资源在时间上复用时,不同的程序或用户轮流使用它。
在空间上复用:每个客户得到资源的一部分。
6. I/O 设备的结构 I/O 设备一般包括两个部分:设备控制器和设备本身。控制器插在电路板上的一块芯片或一组芯片,这块电路板物理地控制芯片,它从操作系统接收命令。
控制器的任务是为操作系统提供一个简单的接口。每类设备控制器是不同的,所以需要不同的软件进行控制。专门与控制器对话,发出命令并接收响应的软件,称为设备驱动程序。为了使用设备驱动程序,必须要把设备驱动程序装入到操作系统中,这样它可在核心态中运行。
每个设备控制器都有少量的用于通信的寄存器,所有的寄存器的集合构成了I/O 空间。
7. IDE 概念 IDE 表示集成驱动电子设备,是许多计算机的磁盘标准。
8. 实现输入输出的三种方式 第一种方式,用户程序发出一个系统调用,内核将其翻译成一个对应设备驱动程序的过程调用。然后设备驱动程序启动 I/O 并在一个连续不断的循环中检查该设备,看该设备是否完成了工作。当 I/O 结束后,设备驱动程序把数据送到指定的地方(若有此需要),并返回。然后操作系统将控制返回给调用者。这种方式称为忙等待(busy waiting),其缺点是要占据CPU ,CPU 一直轮询设备直到对应的 I/O 操作完成。
第二种方式,设备驱动程序启动设备并且让该设备在操作完成时发出一个中断。设备驱动程序在这个时刻返回。操作系统接着在需要时阻塞调用者并安排其他工作进行。当设备驱动程序检测到该设备的操作完毕时,它发出一个中断通知操作完成。
第三种方式,为I/O使用一种特殊的直接存储器访问(Direct Memory Access,DMA)芯片,它可以控制在内存和某些控制器之间的位流,而无须持续的CPU干预。
9. CMOS 存储器 CMOS 存储器是易失性的。许多计算机利用 CMOS 存储器保持当前时间和日期。 CMOS 存储器和递增时间的时钟电路有一块小电池驱动,所以,即使计算机没有上电,时间也可以正确地更新。
10. USB 概念 USB 是通用串行总线,是用来将所有的慢速 I/O 设备,诸如键盘和鼠标,与计算机相连。USB 是一种集中式总线,其根设备每 1ms 轮询一次 I/O 设备,看是否有消息收发。所有的 USB 设备共享一个 USB 设备驱动器,于是就不需要为新的 USB 设备安装新的设备驱动器了。
闩锁
Vivado日志文件报告已识别闩锁的类型和大小。
推断锁存通常是HDL编码错误的结果,例如不完整的if或case声明。
Vivado synthesis针对以下报告示例中显示的实例发出警告。此警告允许您验证推断的Latch功能是否为预期功能。
Latches Reporting Example ========================================================================= * Vivado.log * ========================================================================= WARNING: [Synth 8-327] inferring latch for variable 'Q_reg' ========================================================================= Report Cell Usage: -----+----+----- |Cell|Count -----+----+----- 2 |LD | 1 -----+----+----- =================================================================== Latch With Positive Gate and Asynchronous Reset Coding Verilog Example Filename: latches.v // Latch with Positive Gate and Asynchronous Reset // File: latches.v module latches ( input G, input D, input CLR, output reg Q ); always @ * begin if(CLR) Q = 0; else if(G) Q = D; end endmodule Latch With Positive Gate and Asynchronous Reset Coding VHDL Example Filename: latches.
/* void Weighting(uint32_t *Priary_Data,uint16_t Deal_Long,uint16_t Weight_Long,uint16_t Grade,float *Filter_Data) 定义:加权-滤波-阈值曲线 参数: //Priary_Data---输入--原始ADC数据 //Deal_Long-----输入--数据个数 //Weight_Long---输入--滤波处理长度最大为9,如果想输出原函数,配置Weight_Long=0 //Grade---------输入--滤波数据处理等级--处理层数,写0时也是一层 //up_thre_data--输入--阈值设置 //Filter_Data---输出--滤波数据 //Compare_Data--输出--参与波形比较 //Thre_Data-----输出--阈值曲线 返回值:无 */ #include "lock.h" void Weighting(uint32_t *Priary_Data,uint16_t Deal_Long,uint16_t Weight_Long,uint16_t Grade,float *Filter_Data) { uint16_t i=0; float temp_f=0.0f; uint32_t data_long=0; uint16_t Addr_Star=0,Addr_Stop=0; uint16_t G=0; uint16_t m=0; for(i=0;i<Deal_Long;i++) { for(G=0;G<Grade;G++) //第G层 G=0~Grade-1 { if(i<(Weight_Long-G)) Addr_Star=0; //第G层从Weight_Long-G位开始就能走完一遍了 else { if(Weight_Long<G) Addr_Star=i-(Weight_Long-G); else Addr_Star=i; } if(i>=(Deal_Long-Weight_Long+G)) Addr_Stop=Deal_Long-1; else { if(Weight_Long>=G) Addr_Stop=i+Weight_Long-G; else Addr_Stop=i; } for(m=Addr_Star;m<=Addr_Stop;m++) //求起始点和终止点的和 { temp_f+=(float)LSB_32(Priary_Data[m]); data_long++; } } Filter_Data[i]=temp_f/(float)data_long; //滤波值 temp_f=0.
目录
什么是集合框架
容器
时间复杂度
空间复杂度
包装类
装箱
拆箱
引出泛型
泛型类的使用
类型推导
泛型如何编译的
泛型的上界
泛型方法静态泛型方法以及泛型上界
什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。
如何理解这张图?
所有的这些从某种意义上说都实现了Iterable这个接口,然后collection继承extends了它也可以说拓展了它这个接口相当于collection这个接口具备了Iterable这个接口的功能,相当于这个接口定义的类型可以引用下面具体的对象,例如List list=new ArrayList()暂且这样写,后面同样一个道理
这张图描述了java当中 类与类 类与接口之间的关系
说明:java的集合类和关系不一定只有上图,上图只是描述了部分重要的常见的类
容器 每个容器其实都是对某种特定数据结构的封装
1. Collection : 是一个接口,包含了大部分容器常用的一些方法 2. List : 是一个接口,规范了 ArrayList 和 LinkedList 中要实现的方法 ArrayList : 实现了 List 接口,底层为动态类型顺序表 LinkedList :实现了 List 接口,底层为双向链表 3. Stack :底层是栈,栈是一种特殊的顺序表 4. Queue :底层是队列,队列是一种特殊的顺序表 5. Deque :是一个接口 6. Set :集合,是一个接口,里面放置的是 K 模型 HashSet :底层为哈希桶,查询的时间复杂度为 O(1) TreeSet :底层为红黑树,查询的时间复杂度为 O(Log2N ),关于 key 有序的 7.
#include<stdio.h> #include<assert.h> size_t my_strlen(const char* str) { assert(str); size_t count = 0; while (*str!='\0') { str++; count++; } return count; } int main() { char arr[] = "abcdef"; size_t n = my_strlen(arr); printf("%u\n", n); } 运行结果
在C++57个入门知识点_42:静态成员变量理解(static int m_nStatic;实现单独写在类外;本质是带类域的全局变量;可以不用产生对象即可访问CInteger::m_nStatic=1),C++57个入门知识点_43:静态成员函数(static静态成员函数声明,实现和调用;静态函数内部只能访问静态成员变量;本质是静态成员函数没this指针;带类域的全局函数可直接利用类调用静态成员函数)中我们学习了静态成员变量和静态成员函数,好像没有看到它们俩有大的作用,只是起到了类域限制的作用,其实不然,其在特定的场合有特定的作用。本篇介绍使用静态成员实现的很常见的一种设计模式-单例模式。
设计模式其实就是简单的代码复杂化,这是因为结构简单的代码在需求发生改变之后大概率就需要伤筋动骨的去修改的,使用一定的模式,就可以提高代码的复用率。大项目一般都是喜欢使用各种模式。本篇在学习完静态成员变量及函数后介绍用其实现单例模式。
总结放于前:
(1)什么是单例: 单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;
(2)单例模式典型应用:软件中生成log文件的操作,各种类调用生成log的类对象;
(3)单例实现方法:
懒汉式单例(静态对象指针实现):类的构造函数放于private中,通过static创建带类域的静态成员函数作为创建对象的接口,需要使用静态对象指针在没有创建对象的情况下赋给对象指针,有的话就直接返回静态指针,这样就可以实现单例的目的。利用静态对象引用的方法实现单例模式(更安全),利用静态对象引用的方式实现单例需要禁用拷贝构造及等号运算符重载。 文章目录 1. static内存相关知识2. 什么是单例模式3. 单例模式典型应用4. 单例模式的实现4.1 普通模式下创建对象的特点(多次创建,产生多个对象)4.2 利用静态对象指针实现单例模式(懒汉式,目前项目中常用的框架)4.3 利用静态对象引用的方式实现单例模式 1. static内存相关知识 要理解static关键字在C++中的所有作用,首先要明白程序所使用的不同内存区域的作用。
C++程序运行时使用三种内存,一种是static内存,还有一种是stack(栈)内存,以及heap(堆)内存(动态内存池)。
(1)static内存用于local static object,class static members,以及在函数外定义的全局对象。static对象在生成后一直存在,直到程序结束。 static内存由编译器直接管理,程序无法控制。
(2)stack内存用于函数内定义的变量。stack内存中的对象只是在函数块执行期间存在。stack内存也是由编译器所管理。
(3)每个程序都会拥有一个内存池,被称为free store或者heap,用于程序在运行时动态寻址的对象,这些对象的生存周期由程序负责管理,heap内存由程序所控制。
static关键字其实主要限定了C++中的对象所使用的内存区域。下面根据static所应用对象的不同,分别从全局对象,本地静态对象,和类静态成员角度来解释static在C++中的作用。
详细请参考:C++中static用法总结(静态对象,内存)
2. 什么是单例模式 什么是单例: 单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;
3. 单例模式典型应用 软件中生成log文件的操作,各种类调用生成log的类对象
4. 单例模式的实现 4.1 普通模式下创建对象的特点(多次创建,产生多个对象) 首先我们创建一个Singleton的类。
#include <iostream> class Singleton { public: Singleton() { printf("Singleton()construct"); } ~Singleton() { printf("Singleton()destruct"); } }; int main() { Singleton s1; Singleton s2; return 0; } 用户(main函数)在创建对象时,通过Singleton s1;Singleton s2;我们是创建了s1,s2 两个对象,显然这不是我们想要实现的唯一实例的情况。
上一讲中我们学习了python中枚举、魔数的使用,今天咱们来看看还有那些实用小TIP。
实用小贴士 布尔值其实是“数字” 在 Python 中,布尔值 True 和 False 在大多数情况下可以直接等同于两个整数 1 和 0,就像这样:
>>> True + 1 2 >>> 1 / False Traceback (most recent call last): File "", line 1, in ZeroDivisionError: division by zero 那么记住这一点有什么用呢?首先,它们可以与 sum 函数结合使用,在计算总数时简化操作。
>>> l = [1, 2, 4, 5, 7] >>> sum(i % 2 == 0 for i in l) 2 此外,如果布尔表达式用作列表的索引,它可以实现类似于三元表达式的目的。
# 类似的三元表达式:"Javascript" if 2 > 1 else "Python" >>> ["Python", "
一、初始Shell shell 是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。
Linux提供的Shell解析器有:
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
Centos默认的解析器是bash
/bin/bash
二、Shell脚本入门 1.shell脚本文件后缀.sh
2.脚本格式: 脚本以#!/bin/bash开头(指定解析器)
3.脚本的常用执行方式:
采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x) (a)首先要赋予XX.sh 脚本的+x权限(b)执行脚本 4.shell脚本的多命令处理
举个栗子:创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”。
touch batch.sh
vi batch.sh
在batch.sh中输入如下内容
#!/bin/bash
cd /home/atguigu
touch cls.txt
echo "I love cls" >>cls.txt
三、shell中的变量 一、系统变量 1. 常用系统变量
$HOME、$PWD、$SHELL、$USER等
(1)查看系统变量的值 : $HOME (2)显示当前Shell中所有变量:$set 二、自定义变量 1.基本语法 (1)定义变量:变量=值 (2)撤销变量:unset 变量(3)声明静态变量:readonly变量,注意:不能unset 2.变量定义规则 (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。(2)等号两侧不能有空格(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。(4)变量的值如果有空格,需要使用双引号或单引号括起来。 举个栗子:
(5)可把变量提升为全局环境变量,可供其他Shell程序使用
语法: export 变量名
【注意用户权限,用管理员才能操作】
三、特殊变量$n,$*、$@、$? (一)$n 1.基本语法
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
举个栗子:输出该脚本文件名称、输入参数1和输入参数2 的值