树莓派安装虚拟化平台VMware ESXi
准备工作
下载VMware ESXi
Download ESXi for ARM (vmware.com)
Github上下载最新树莓派固件
https://github.com/raspberrypi/firmware
Github Release上下载最新树莓派UEFI固件
Releases · pftf/RPi4 (github.com)
下载rufus软件用于烧录VMware ESXi镜像
Rufus - 轻松创建USB启动盘
制作UEFI启动TF卡
格式化TF卡
格式化TF卡为FAT32卷标设置为UEFI
写入fireware文件到tf卡
解压fireware-master.zip下的boot文件夹中的所有文件到tf卡中
删除所有的kernal*.img文件
覆盖UEFI固件文件
打开RPi4_UEFI_Firmware_*.zip文件,解压覆盖所有的文件到tf卡中。
制作VMware ESXi启动u盘
安装ESXi
树莓派插上制作好的tf卡,u盘,开机出现树莓派LOGO时候按ESC进入UEFI固件设置页面。
树莓派4的UEFI固件默认有一个使用3G ...
Hadoop环境搭建
配置虚拟机环境
建立四台虚拟机,配置Hadoop的分布式集群。并且配置静态ip地址如下,最终实现master能够直接与三个节点ssh无密码联通。
主机名
ip地址
master
192.168.166.100
node1
192.168.166.101
node2
192.168.166.102
node3
192.168.166.103
安装VMware虚拟机平台
略
新建虚拟机
略
安装CentOS-7系统
略
安装Java环境
略
克隆虚拟机
略
配置静态ip与hosts文件
略
配置ssh免密登陆
使用 ssh-keygen -t rsa 生成一对RSA公私钥,将公钥放在目标登录的服务器上,私钥放在本地。当ssh客户端发出请求,请求使用基于密钥的安全验证,服务器将先寻找公钥,并与传递过来的公钥做比较,若一致,则服务器使用公钥加密一个challenge并返回客户端,客户端通过私钥解密challenge并发送到服务器即可完成安全验证。
ssh-copy-id -i ~/.ssh/id_rsa.pub master
ssh-copy-i ...
软件测试过程
软件测试过程
软件测试是有阶段性的,软件测试过程与软件设计周期有相互对应的关系。从过程来看,软件测试可分为单元测试、集成测试、系统测试和验收测试等一系列不同的测试阶段。
概述
单元测试的目的是保证每个模块单独运行正确,多采用白盒技术,检查模块控制结构的某些特殊路径,期望覆盖尽可能多的出错点。
经单元测试后的模块,组装为软件包,对软件包进行集成测试,主要测试软件结构问题,因测试建立在模块间的接口上,所以多为黑盒测试,适当辅以白盒测试技术,以便能对主要控制路径进行测试。
系统测试主要是检验软件是否满足功能、行为和性能方面的要求,这一步完全采用黑盒测试技术。
验收测试是检验软件产品的最后一道工序,与前面各种测试过程的不同之处主要在于它突出了客户的作用,同时软件开发人员也要参与。
单元测试
单元测试是对软件设计的最小单元——模块进行正确性检验的测试工作,主要测试模块在语法、格式和逻辑上的错误。
单元测试应对模块内所有重要的控制路径进行测试,以便发现模块内部的错误。单元测试是检查软件源程序的第一次机会,通过孤立地测试每个单元,确保每个单元工作正常,这样比单元作为一个更大系统的一个部分更容易 ...
软件测试概述
软件测试概述
软件测试模型
V模型
V模型是最具有代表意义的测试模型 ,反映出了测试活动与分析设计活动的关系。
V模型指出如下要求,
单元和集成测试应检测程序的执行是否满足软件设计的要求;
系统测试应检测系统功能、性能的质量特性是否达到系统要求的指标;
验收测试确定软件的实现是否满足用户需要或合同的要求。
W模型
W模型由两个V字型模型组成,分别代表测试与开发过程。
W模型强调:
测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序,需求、设计等同样要测试,也就是说,测试与开发是同步进行的。
H模型
H模型将测试活动完全独立出来,形成了一个完全独立的流程,将测试准备活动和测试执行活动清晰地体现出来。
H模型揭示了软件测试是一个独立的流程,贯穿产品整个生命周期,与其他流程并发地进行。
其他模型
除上述几种常见模型外,还流传着其他几种模型,例如X模型、前置测试模型等。
X模型
X模型提出针对单独的程序片段进行相互分离的编码和测试,此后通过频繁的交接,通过集成最综合成为可执行的程序。
前置测试模型
前置测试模型体现了开发与测试的结合,要求对每一个交付内 ...
Leetcode-357-统计各位数字都不同的数字个数
题目
357. 统计各位数字都不同的数字个数
给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。
示例 1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例 2:
输入:n = 0
输出:1
提示:
0 <= n <= 8
解题
题目分析
我们逐一考虑各种情况, 设函数d(t)d(t)d(t)的值为n=tn = tn=t时的结果, 设函数f(t)f(t)f(t)为仅含有t位数字的各位数字都不同的数字x的个数
当t = 0 时候, 0≤x<10\leq x < 10≤x<1, 此时x只能选择0, 即有1种选择
即d(0)=1d(0) = 1d(0)=1
当t = 1 时候, 0≤x<100\leq x < 100≤x<10, 此时x只能选择0~9, 即有10种选择
即d(1)=10d(1)=10d(1)=10
当t = 2 ...
Leetcode-310-最小高度树
题目
原文
原题链接
树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。
可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树 。
请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。
树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。
样例输入: n = 4, edges = [[1,0],[1,2],[1,3]]
样例输出: [1]
示例 1:
输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。
示例 2:
...
Leetcode-307-区域和检索-数组可修改[线段树]
Leetcode-307-区域和检索-数组可修改
题目
给你一个数组 nums ,请你完成两类查询。
其中一类查询要求 更新 数组 nums 下标对应的值
另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right
实现 NumArray 类:
NumArray(int[] nums) 用整数数组 nums 初始化对象
void update(int index, int val) 将 nums[index] 的值 更新 为 val
int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 (即,nums[left] + nums[left + 1], …, nums[right])
解题思路
暴力法
根据题意不难直接写出暴力解决方案, 当然直接TLE
可以得出, 更新操作时间复杂度O(1)O(1)O(1), 求和操作时间复杂度O(r−l)O(r-l)O( ...
二叉树的遍历
准备工作
我们定义一个树的结点的结构体如下,
123456789101112struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int val) : val(val), left(nullptr), right(nullptr) {} TreeNode(int val, TreeNode *left) : val(val), left(left), right(nullptr) {} TreeNode(int val, TreeNode *left, TreeNode *right) : val(val), left(left), right(right) {}};
定义一系列调试输出函数
12345678910111213141516171819202122232425262728293031// 美化输出一颗二叉树void output(TreeNode *root) ...
创造一块虚拟硬盘
/dev/zero讲解
在Linux中,文件/dev/zero是在逻辑上存放了无限大小的0x00数据。
我们可以写一段简单的Python脚本验证,
1234f = open('/dev/zero')f.read(1)f.read(10)f.read(100)
如下图,可以发现输出结果全是字节为0的二进制数据。
注意:read中参数表示一次读取多少字节数据,如果你不传入参数,即使用默认参数-1,就表示一次性完整读取整个文件并加载到内存中,然而/dev/zero是逻辑上的文件,拥有无限大小,永远也读不完。所以,如果你直接使用f.read()那么你可以看到电脑内存将飙升,直到内存不足死机。[doge]
创造虚拟硬盘
现在,我们需要创建一块虚拟硬盘,虚拟硬盘本质上就是一个文件,把这个文件当作一块硬盘,进行原始的读写硬盘操作,所以创建一块虚拟硬盘就是创建一个一定大小的文件。我们现在有一个目标,就是创建一块100M大小的文件,内容全部填充为0x00。
在Linux中,使用cat命令可以读取文件并输出到终端,使用>操作符可以使终端输出重定向到指定文件的输入。
我们使用 ...
Android-ConstraintLayout实战
需求分析
使用ConstraintLayout,完成以下布局的设计
实施
整体边距约束
对最外层ConstraintLayout添加属性,实现整体的内边距
android:padding=“20dp”
第一个标题
设置尺寸自适应,字号30sp,加粗显示后
设置该控件位于父容器左上角,即
Start与父容器的Start对齐
app:layout_constraintStart_toStartOf=“parent”
Top与父容器的Top对齐
app:layout_constraintTop_toTopOf=“parent”
123456789<TextView android:id="@+id/third_text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:textStyle ...