搜索引擎项目测试报告

news2024/9/21 12:47:17

目录

  • 单元测试
    • 构建索引模块
    • 文档信息对象Document的构建的单元测试
      • **针对每一篇文档进行分析、处理、分词**
    • 针对文档内容提取关键字的测试(正则表达式)
      • 测试去掉script
      • 测试去掉标签
      • 完整测试Document类中的parseContent方法
    • 关于ansj分词器的测试
    • 关于构建倒排索引的测试
    • 批量插入的测试
  • 界面测试
      • 测试1 界面布局是否合理,展示位置是否正确
  • 功能测试
    • 测试1 不同搜索方式下的关键字搜索
      • 搜索为空或者为一个空格
      • 搜索一个关键字
      • 搜索多个关键字中间加入空格
      • 搜索多个关键字中间加入逗号
      • 搜索多个关键词间隔多个空格
      • 搜索英文和数字的混合
      • 搜索数字
    • 测试2 点击标题可以正常跳转
    • 测试3 翻页功能
      • 点击翻页按钮,正常翻页
      • 搜索最后一页的下一页
      • 搜索第一页的上一页
    • 测试4 高亮显示
    • 测试5:历史记录展示
  • 易用性测试
    • 搜索大写字母,自动转小写
    • 内容复制粘贴
    • 回车键搜索
    • 下拉框时,搜索框不变
  • 兼容性测试
  • 安全性测试
    • 搜索的数据网络传输中是否被损坏
  • 性能测试
    • 正排索引构建时间
    • 倒排索引构建时间
    • 搜索时间
        • 搜索单个关键字
        • 搜索多个关键字带空格

单元测试

构建索引模块

1.扫描文档目录下的所有文档
以 rootPath 作为根目录,开始进行文件的扫描,把所有符合条件的 File 对象,作为结果,以 List 形式返回

首先在该类上按 Ctrl + Shift + t,可以自己生成测试的类

1.测试时,先给一个根目录的文件,需要确保这个目录存在 && 一定是一个目录,他的文件以 .json 为结尾。当一个文件满足这些条件时,说明是 true 。

2.再得到他的标准文件名

3.使用断言进行判断 Assert,我通过代码得到的文件名如果和我写的正确的文件名相同的话,证明这个测试用例是通过的。

package com.peixinchen.searcher.indexer;

import com.peixinchen.searcher.indexer.util.FileScanner;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@SpringBootTest
public class Indexer {
    @Autowired
    private FileScanner fileScanner;

    @SneakyThrows
    @Test
    void testFileScanner() {
        //  双\\表示转义
        List<File> list = fileScanner.scanFile("D:\\index", file -> {
			return file.isFile() && file.getName().endsWith(".json");
//            return file.isFile() && file.getName().startsWith("forward");
        });

        // 1. 针对每个 File 对象,调用 file.getCanonicalPath(),得到 String 类型的绝对路径
        // 2. 针对结果做排序
        // 3. Stream<String> -> List<String>
        List<String> filenameList = list.stream()
                .map(file -> {
                    try {
                        return file.getCanonicalPath();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                })
                .sorted()
                .collect(Collectors.toList());

        Assert.isTrue(filenameList.equals(Arrays.asList(
                "D:\\index\\forward.json"

        )));
    }
}

文档信息对象Document的构建的单元测试

针对每一篇文档进行分析、处理、分词

根据扫描出的 html 文件提取他的 标题 和 url 是否正确

package com.peixinchen.searcher.indexer;

import com.peixinchen.searcher.indexer.model.Document;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;

import java.io.File;

import static sun.plugin.javascript.navig.JSType.Document;

/**
 * @author SongBiao
 * @Date 14:29
 */
@SpringBootTest
public class DocumentTest {
    @Test
    public void testDocumentConstructor() {
        File rootFile = new File("D:\\学习资料\\搜索引擎\\docs\\api");
        File file = new File("D:\\学习资料\\搜索引擎\\docs\\api\\javax\\sql\\DataSource.html");
        String urlPrefix = "https://docs.oracle.com/javase/8/docs/api/";

        Document document = new Document(file, urlPrefix, rootFile);

        Assert.isTrue(document.getTitle().equals("DataSource"));
        Assert.isTrue(document.getUrl().equals("https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html"));
    }
}

针对文档内容提取关键字的测试(正则表达式)

在这里插入图片描述

测试去掉script

	@Test
	public void testTrimScriptTag() {
		String s = "Hello <script>...</script> World";
		// 第一步,从 "Hello <script src="...">...</script> World" -> "Hello   World",此时注意hello和world之间有三个空格
		// 第二部,从 "Hello   World" -> "Hello World",把三个空格变成一个
		s = s.replaceAll("<script.*?>(.*?)</script>", " ").replaceAll("\\s+", " ");	// 这里就是正则替换
		String m = "Hello World";
		Assert.isTrue(s.equals(m));
	}

测试去掉标签

@Test
	public void testTrimTag() {
		String s = "<div><h1>你好</h1><p>Hello</p><p>World</p></div>";
		s = s.replaceAll("<[^>]*>", " ").replaceAll("\\s+", " ").trim();
		String m = "你好 Hello World";
		Assert.isTrue(s.equals(m));
	}

完整测试Document类中的parseContent方法

我们选取一个文档内容如下:(注意因为java的这些文档都是英文的,所以我们选择的是ISO-8859-1这个字符集,所以我们测试文档中是不会出现中文的)

在这里插入图片描述

@Test
	public void testDocumentContent() {
		File file = new File("D:\\学习资料\\搜索引擎\\test.html");
		String s = "Hello World Holo Wald \"Holo Wald\" is our first application.";
		Document document = new Document(file, "/", new File("D:\\学习资料\\搜索引擎\\"));
        //返回的是true即可
		Assert.isTrue(s.equals(document.getContent()));
	}

关于ansj分词器的测试

	@Test
	public void testAnsj() {
		Result result = ToAnalysis.parse("我爱北京天安门,天安门上太阳升。");
		List<Term> termList = result.getTerms();
		for (Term term : termList) {
			System.out.print(term.getName() + ", ");
			System.out.print(term.getNatureStr() + ", ");
			System.out.println(term.getRealName());
		}
	}

在这里插入图片描述

在这里插入图片描述

关于构建倒排索引的测试

编写测试方法:

 /*
    正排索引的测试方法
     */
    public void printForwardIndex() {
        int size = forwardIndex.size();
        for (int i = 0; i < size; i++) {
            int docId = i;
            IndexDocument indexDocument = forwardIndex.get(docId);
            System.out.printf("docId: %d -> IndexDocument: %s\n", docId, indexDocument);
        }
    }

    /*
    倒排索引的测试方法
     */
    public void printInvertedIndex() {
        Set<String> wordSet = invertedIndex.keySet();
        for (String word : wordSet) {
            System.out.printf("%s: \n", word);
            List<DocWeight> docWeightList = invertedIndex.get(word);
            for (DocWeight docWeight : docWeightList) {
                System.out.printf("    docWeight: %s\n", docWeight);
            }
        }
    }

来到我们写的测试类中:

@Test
	public void testBuildIndex1() {
		String content = "I want you to know\n" +
				"\n" +
				"one thing.\n" +
				"\n" +
				"\n" +
				"\n" +
				"You know how this is:\n" +
				"\n" +
				"if I look\n" +
				"\n" +
				"at the crystal moon, at the red branch\n" +
				"\n" +
				"of the slow autumn at my window,\n" +
				"\n" +
				"if I touch\n" +
				"\n" +
				"near the fire\n" +
				"\n" +
				"the impalpable ash\n" +
				"\n" +
				"or the wrinkled body of the log,\n" +
				"\n" +
				"everything carries me to you,\n" +
				"\n" +
				"as if everything that exists,\n" +
				"\n" +
				"aromas, light, metals,\n" +
				"\n" +
				"were little boats\n" +
				"\n" +
				"that sail\n" +
				"\n" +
				"toward those isles of yours that wait for me.\n";

		Document document = new Document("If You Forget Me", "构建索引不需要url", content.replaceAll("\n", " ").replaceAll("\\s+", " "));
		System.out.println(document);

		indexManager.add(document);

		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();
	}

	@Test
	public void testBuildIndex2() {
		Document d1 = new Document("行宫", "url", "寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗。");
		Document d2 = new Document("登鹳雀楼", "url", "白日依山尽,黄河入海流。欲穷千里目,更上一层楼。");
		Document d3 = new Document("新嫁娘词", "url", "三日入厨下,洗手作羹汤。未谙姑食性,先遣小姑尝。");
		Document d4 = new Document("静夜思", "url", "床前明月光,疑是地上霜。举头望明月,低头思故乡。");
		Document d5 = new Document("无题", "url", "宫花宫女在,白日月光行。更上一层楼,未谙姑食性。");

		indexManager.add(d1);
		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();


		indexManager.add(d2);
		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();


		indexManager.add(d3);
		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();


		indexManager.add(d4);
		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();


		indexManager.add(d5);
		System.out.println();
		System.out.println();
		indexManager.printForwardIndex();
		System.out.println();
		System.out.println();
		indexManager.printInvertedIndex();
	}
}

批量插入的测试

package com.peixinchen.searcher.indexer;

import com.peixinchen.searcher.indexer.command.Indexer;
import com.peixinchen.searcher.indexer.mapper.IndexDatabaseMapper;
import com.peixinchen.searcher.indexer.model.Document;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
class IndexerApplicationTests {
    @MockBean   // 通过这个 @MockBean 修饰,使得测试的时候,不需要真正的去执行 Indexer bean 下的操作
    private Indexer indexer;

    @Autowired
    private IndexDatabaseMapper mapper;

    @Test
    void batchInsert() {
        List<Document> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            String s = String.valueOf(i);
            Document document = new Document(s, s, s);
            list.add(document);
        }

        mapper.batchInsertForwardIndexes(list);

        for (Document document : list) {
            System.out.println(document);
        }
    }
}

在这里插入图片描述

对应的批量插入的sql语句如下所示:

insert into forward indexes (itle, url, content) values (?,?, ?),(?,?,?), (?,?, ?), (?,?, ?), (?,?, ?), (?,?, ?), (?,?, ?), (?,?, ?), (?,?, ?), (?,?, ?)

o(String), 0(String), 0(String),
1(String),1(String), 1(String),
2(String), 2(String), 2(String),
3(String),3(String), 3(String),
4(String), 4(String), 4(String),
5(String), 5(String), 5(Strinq),
6(String), 6(String), 6(String),
7(String), 7(String), 7(String),
8(String), 8(String), 8(String),
9(String). 9(String), 9(String)

界面测试

在这里插入图片描述

测试1 界面布局是否合理,展示位置是否正确

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目
测试步骤
打开浏览器,输入URL
测试数据
URL:http://127.0.0.1:8080/index.html

期望结果

在这里插入图片描述

测试结果

界面布局、扫面内容展示位置正确:

在这里插入图片描述

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目
测试步骤
在搜索框输入搜索内容后,进入搜索界面
测试数据
搜索:php

期望结果

在这里插入图片描述

测试结果

界面布局、扫面内容展示位置正确:

在这里插入图片描述

功能测试

在这里插入图片描述

在这里插入图片描述

测试1 不同搜索方式下的关键字搜索

搜索为空或者为一个空格

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,不输入内容或者输入一个空格
3.点击搜索

测试数据

空字符或者空格

期望结果

搜索失败,停留在搜索主界面

测试结果

在这里插入图片描述

搜索一个关键字

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入一个关键字
3.点击搜索

测试数据

输入Java

期望结果

搜索成功,打开包含java按照权重值排序后的列表页

测试结果

在这里插入图片描述

搜索多个关键字中间加入空格

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入多个关键字加空格
3.点击搜索

测试数据

搜索:list string

期望结果

搜索成功,打开包含list string按照权重值排序后的列表页

测试结果
在这里插入图片描述

搜索多个关键字中间加入逗号

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入多个关键字加逗号
3.点击搜索

测试数据

搜索:java,string

期望结果

搜索成功,打开包含java string按照权重值排序后的列表页

测试结果
在这里插入图片描述

搜索多个关键词间隔多个空格

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入多个关键字加空格
3.点击搜索

测试数据

搜索:java string list

期望结果

搜索成功,打开包含java string list按照权重值排序后的列表页

测试结果

在这里插入图片描述

搜索英文和数字的混合

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL:http://localhost:8080/index.html
2.点击搜索框,输入英文和数字的混合数字
3.点击搜索

测试数据

搜索list3

期望结果

搜索成功,打开包含list3的列表页

测试结果

在这里插入图片描述

搜索数字

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入一个数字
3.点击搜索

测试数据

搜索3

期望结果

搜索成功,打开包含3的列表页

测试结果

在这里插入图片描述

测试2 点击标题可以正常跳转

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL:http://localhost:8080/index.html

2.点击搜索框,输入关键字

3.点击搜索后跳转

4.点击结果中的标题

测试数据

搜索数据:map

url:https://docs.oracle.com/javase/8/docs/api/java/util/class-use/Map.html

期望结果

点击url后正确跳转到对应的网页

测试结果

正确显示页面

在这里插入图片描述

测试3 翻页功能

点击翻页按钮,正常翻页

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URLhttp://localhost:8080/index.html

2.点击搜索框,输入关键字

3.点击搜索后跳转

4.点击上一页,上一页正确显示内容

测试数据

搜索:java

期望结果

点击上一页,下一页都能正常显示内容

测试结果

点击上一页:
在这里插入图片描述

点击下一页:

在这里插入图片描述

搜索最后一页的下一页

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

在网页栏中输入url地址,观察结果

测试数据

搜索数据:php

url:http://localhost:8080/web?query=php&page=2

期望结果

弹出错误界面

测试结果

在这里插入图片描述

搜索第一页的上一页

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

在网页栏中输入url地址,观察结果

测试数据

搜索数据:php

url:http://localhost:8080/web?query=php&page=0

期望结果

停留在原页面即可

测试结果

在这里插入图片描述

测试4 高亮显示

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入map
3.点击搜索

测试数据

搜索:map

期望结果

搜索成功,所有关于map的单词都高亮显示

测试结果

在这里插入图片描述

测试5:历史记录展示

模块

主页展示模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1:在主页展示模块的搜索框中输入一个字母

2:看是否显示之前搜索的内容

测试数据

输入:a

期望结果

会出现之前以a开头的所有搜索记录

测试结果

在这里插入图片描述

易用性测试

在这里插入图片描述

搜索大写字母,自动转小写

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL:http://localhost:8080/index.html
2.点击搜索框,输入ARRAY
3.点击搜索

测试数据

搜索:ARRAY

期望结果

搜索到的内容都跟小写有关

测试结果
在这里插入图片描述

内容复制粘贴

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL:http://localhost:8080/index.html
2.点击搜索框,输入array,并复制
3.删除掉后再点击粘贴

测试数据

输入:array

期望结果

成功复制粘贴

测试结果

输入后,复制后删掉,成功粘贴:
在这里插入图片描述

回车键搜索

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL:http://localhost:8080/index.html
2.点击搜索框,输入array
3.点击搜索

测试数据

输入:array

期望结果

点击回车键后正确弹出搜索结果

测试结果
在这里插入图片描述

下拉框时,搜索框不变

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框,输入array
3.点击搜索

测试数据

输入array

期望结果

下拉查看搜索结果时,搜索框不变

测试结果

在这里插入图片描述

兼容性测试

在这里插入图片描述

模块

搜索模块,主页展示模块

测试环境

这里因为项目并没有推到线上使用,所以就选择当下市场上主流的浏览器覆盖,后期推到线上后,在添加其他浏览器测试即可

Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统

Firefox 103.0.2 (20220808125904) PC端 Windows系统

Microsoft Edge版本 104.0.1293.54 (正式版本) (64 位) PC端 Windows系统

前置条件
在IDEA中运行web项目

测试步骤

1:在Chorme浏览器中输入url:http://localhost:8080/index.html,然后在搜索框中输入关键字,正确弹出页面.

2: 在Firefox 浏览器中输入url:http://localhost:8080/index.html,然后在搜索框中输入关键字,正确弹出页面.

3:在Microsoft Edge浏览器中输入url:http://localhost:8080/index.html,然后在搜索框中输入关键字,正确弹出页面.

测试数据

url : http://localhost:8080/index.html

关键字 :java

期望结果

在各个浏览器中输入url后,输入关键字,正确弹出内容页面

测试结果

Chorme浏览器:

在这里插入图片描述

在这里插入图片描述

Firefox 浏览器:
在这里插入图片描述

在这里插入图片描述

Microsoft Edge浏览器:

在这里插入图片描述

在这里插入图片描述

安全性测试

在这里插入图片描述

搜索的数据网络传输中是否被损坏

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

1.打开浏览器,输入URL
2.点击搜索框输入数据
3.点击搜索后查看数据有没有被损坏

测试数据

搜索:java

期望结果

正确显示内容

测试结果

在这里插入图片描述

性能测试

在这里插入图片描述

正排索引构建时间

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

后台运行构建正排索引代码,查看运行时间

期望结果

构建正排索引时间小于1s

测试结果

正排索引构建时间为0.931s,低于1s
在这里插入图片描述

倒排索引构建时间

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤

后台运行构建倒排索引代码,查看运行时间

期望结果

构建倒排索引时间小于1min

测试结果

倒排索引构建时间为13s,远远小于1min
在这里插入图片描述

搜索时间

搜索单个关键字

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤
1.点击搜索框输入数据
2.打开chorme浏览器进行调试,摁fn+F12查看接口的响应时间

测试数据

搜索:java

期望结果

搜索时间小于1s

测试结果

接口响应时间小于1s,符合预期

在这里插入图片描述

搜索多个关键字带空格

模块

搜索模块

测试环境
Chrome 版本 103.0.5060.66(正式版本) (64 位)PC端 Windows系统
前置条件
在IDEA中运行web项目

测试步骤
1.点击搜索框输入数据
2.打开chorme浏览器进行调试,摁fn+F12查看接口的响应时间

测试数据

搜索:java string

期望结果

搜索时间小于1s

测试结果

接口响应时间小于1s,符合预期
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CleanMyMac4.12.2最新免费的macOS电脑清理工具

相信不少的小伙伴都在用苹果电脑&#xff0c;不论是 iMac&#xff0c;还是 MacBook&#xff0c;用着用着电脑就变慢了。这通病与苹果电脑的性能无关&#xff0c;主要是硬盘空间不足的问题&#xff01;当然你可以在购买电脑的时候就把硬盘升级&#xff0c;但主要的问题是 – 没有…

python代码圣诞树你还没有嘛?所有画法都在这篇文章里拉~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 今天&#xff0c;我就来给大家分享一下python制作的几种圣诞树吧~ 一&#xff1a;唯美圣诞 代码展示 导入模块 完整源码点击领取即可 import turtle as t from turtle import * import random as r import time n 100.0spee…

【JavaWeb】Tomcat的入门使用

1Tomcat的相关概念: Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP少量JavaEE规范。 概念中提到了JavaEE规范&#xff0c;那什么又是JavaEE规范呢? JavaEE: Java Enterprise Edition,Java企业版。指Java企业…

5年Java开发干到月薪38k?当初实习期2.5k的苦我也吃过...

每一个能在所属行业中成为佼佼者的人&#xff0c;一定都会有他自己的独到的见解以及成长方法......这个观点我非常认同&#xff0c;我不自诩自己是个大佬&#xff0c;但现在也算是做出了头&#xff0c;我从刚毕业做 Java 实习生月薪 2.5k&#xff0c;到现在干了 5 年 Java 开发…

仿雷速体育app踢足球tab

MyTabLayout MyTabLayout用法参照BaseLibrary的Demo GitHub仓库地址 效果图 引入 gradle allprojects {repositories {maven { url https://jitpack.io }} }implementation com.github.DL-ZhangTeng:BaseLibrary:2.3.0属性 MyTabLayout属性名描述&#xff1a;可参考原生控…

Chat GPT使用体验,它真的好厉害!!!

最近的chat GTP很火&#xff0c;起因是OpenAI发布了一个全新的聊天机器人模型。就连马斯克也在感叹“很多人疯狂地陷入了 ChatGPT 循环中”&#xff0c;“ChatGPT 好得吓人&#xff0c;我们离强大到危险的人工智能不远了”。 官方的介绍是&#xff0c;这一模型可以与人类进行谈…

人类特有本能:保护族群老弱病残

人有哪些特有的本能&#xff1f; - 知乎 对于动物群体来说&#xff0c;受伤了就不管了&#xff0c;自生自灭。对于人类来说&#xff0c;受伤了尽量照顾恢复。这看起来吃亏&#xff0c;实际上划算。一个成年人&#xff0c;长大需要20年&#xff0c;受伤恢复只要3个月。 远方青木…

全新CorelDRAW2023最新版矢量图软件功能简介

CorelDRAW2023简介 &#xff1a;设计绘画 CorelDraw 是一个绘图与排版的软件&#xff0c;它广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等诸多领域。 作为一个强大的绘图软件&#xff0c;它被喜爱的程度可用下面的事实说明&#xff1a;用作商业设计和…

WPFUI LiveCharts使用记录(一)柱状图

前言&#xff1a;LiveCharts是一个图标控件库集&#xff0c;可以实现柱状图、折线图、饼图、仪表盘等图表控件。而且最新版本支持全平台使用&#xff0c;实现的样例展示可以点击查看作者Alberto Rodrguez的 github仓库 1.背景 1.1 新建项目 这篇文章使用的是.NET framework4.…

Foxmail升级后图片链接乱

升级后默认勾选了总是以纯文本格式阅读邮件。 在设置-高级-中取消勾选

ZooKeeper组件的核心知识总结,吐血总结,一文带你学会

文章目录数据模型数据存储Watch机制会话机制ACL权限序列化方式集群ZAB协议日志清理实现分布式锁实现分布式ID实现负载均衡开源框架使用案例Zookeeper 基本介绍Apache ZooKeeper 是由Apache Hadoop的子项目发展而来&#xff0c;为分布式应用提供高效且可靠的分布式协调服务。 在…

java计算机毕业设计ssm医院管理系统3w16k(附源码、数据库)

java计算机毕业设计ssm医院管理系统3w16k&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

【应用】OPC 通讯协议

OPC 通讯协议OPC 通讯协议基础OPC 简介OPC 与 OPC UAOPC 逻辑对象模型OPC 通信方式Java 实现 OPC 的方式Java 实现 OPC-clientOPC-DAOPC-UA模拟数据进行代码测试OPC-DA 代码验证OPC-UA 代码验证OPC 通讯协议基础 OPC 简介 OPC 全称 OLE For Process Control&#xff0c;即用于…

8. 发布确认高级

二八佳人体似酥&#xff0c;腰间仗剑斩愚夫。虽然不见人头落&#xff0c;暗里教君骨髓枯。 在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&am…

PyQt - 使用多线程避免界面卡顿

PYQT作为界面程序包&#xff0c;为Pythoner快速构建界面&#xff0c;提供了便利性。特别是结合Pycharm扩展工具&#xff08;QTdesigner&#xff09;能够通过“拖拖拽拽”的方式构建简单界面。通过UIC将UI文件快速转化为PY文件&#xff0c;节省了时间。 PYQT的项目实践&#xff…

痞子衡嵌入式:我被邀请做贸泽电子与非网联合推出的《对话工程师》节目嘉宾...

《对话工程师》是「贸泽电子」赞助、「与非网」制作的一档网络节目&#xff0c;自2022年11月起&#xff0c;邀请不同技术领域的资深工程师&#xff0c;聊聊开发过程中的经验感悟&#xff0c;栏目共 10 期&#xff0c;痞子衡有幸被邀请做了第 4 期节目的嘉宾(12月5日在 「B站 - …

COVID

不信谣不传谣&#xff0c;只是自己的一点记录&#xff0c;有引用到各位大佬的内容&#xff0c;侵删&#xff0c;感谢感谢&#xff0c;对自己可以理中客&#xff0c;对别人还是尽可能主观上的友好&#xff0c;不要慷他人之慨。 准备 喉咙刺痛方面&#xff1a;柠檬&#xff08;…

Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)

前言 今天给大家介绍的是Python爬取手机商品信息数据&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的人会很多&…

读《冯诺伊曼传》

关于冯诺依曼几年前读了本冯诺依曼的书&#xff0c;冯诺依曼是20世纪的全才&#xff0c;原名约翰尼&#xff0c;匈牙利美籍科学家&#xff0c;被称为计算机之父和博弈论之父。计算机和博弈论都深刻改变人类的生活工作和思维方式&#xff0c;极大地促进了社会和人类文明的进步发…

CMake中add_definitions/add_compile_definitions的使用

CMake中的add_definitions命令用于在源文件的编译中添加-D定义标志&#xff0c;其格式如下&#xff1a; add_definitions(-DFOO -DBAR ...) 将当前目录中的target的定义添加到编译器命令行(compiler command line)中,无论是在调用此命令之前还是之后添加的,还是之后添加的子目…