day27-单元测试/日志

news2024/11/15 23:39:32

1.管理系统与服务器集成

1.1准备工作【应用】

  • 需求

    对之前写过的信息管理系统进行改进,实现可以通过浏览器进行访问的功能

  • 准备工作

    • 将资料中的管理系统代码拷贝到当前模块下

    • 导包的代码可能报错,因为之前的包路径可能和当前代码不一致,将导包的代码修改下
      在这里插入图片描述

  • 业务分析
    在这里插入图片描述
    在这里插入图片描述

    1. 解析URL封装到HttpReques对象
    2. DynamicResourceProcess类(执行指定动态资源的service方法)
    3. 定义servlet类完成查询学生、添加学生、删除学生、修改学生的逻辑
  • 项目结构
    在这里插入图片描述在这里插入图片描述

1.2HttpRequest类代码实现【应用】

  • 实现步骤

    1. 提供一个存储url中用户信息的map集合
    2. 提供一个getParamter方法,用于根据请求参数的名称获取请求参数的值
    3. 提供一个parseParamter方法,用于解析请求参数把请求参数存储到map集合中
  • 代码实现

    // 此处只给出了新增的代码,其他代码同之前没有变化
    public class HttpRequest {
       
        //用来存储请求URL中问号后面的那些数据
        //id=1  name=itxxx
        private Map<String,String> paramterHashMap = new HashMap<>();
    
        //parse --- 获取请求数据 并解析
        public void parse(){
            try {
                SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                StringBuilder sb = new StringBuilder();
                //创建一个缓冲区
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                int len;
                //循环读取
                while((len = socketChannel.read(byteBuffer)) > 0){
                    byteBuffer.flip();
                    sb.append(new String(byteBuffer.array(),0,len));
                    //System.out.println(new String(byteBuffer.array(),0,len));
                    byteBuffer.clear();
                }
                //System.out.println(sb);
                parseHttpRequest(sb);
    
                //解析请求参数,把请求参数存储到paramterHashMap集合
                parseParamter();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //解析请求参数,把请求参数存储到paramterHashMap集合
        private void parseParamter(){
            //获取请求的uri
            String requestURI = this.requestURI;
            //按照问号进行切割,然后再获取到第二部分
            String[] uriInfoArr = requestURI.split("\\?");
            //判断数组的长度,如果长度为2,说明是存在请求参数。
            if(uriInfoArr.length == 2){
                //获取请求参数内容(问号后面的那些参数)
                String paramterInfo = uriInfoArr[1];
    
                //使用&进行切割
                String[] paramterInfoArr = paramterInfo.split("&");
    
                //遍历数组
                //id=1 name=itxxx age =23
                for (String paramter : paramterInfoArr) {
                    String[] paramterArr = paramter.split("=");
                    //获取请求参数名称
                    String paramterName = paramterArr[0];
                    //获取请求参数的值
                    String paramterValue = paramterArr[1];
                    //添加到集合中
                    paramterHashMap.put(paramterName,paramterValue);
                }
            }
        }
      
        //id=1 name=itxxx
        //可以根据请求参数的名称来获取请求参数的值
        public String getParamter(String name){
            return paramterHashMap.get(name);
        }
    
    }
    

1.3DynamicResourceProcess类代码实现【应用】

  • 实现步骤

    获取的uri是包含?后边的数据的,要进行切割,只要?号前边的内容

  • 代码实现

    // 此处只给出了新增的代码,其他代码同之前没有变化
    public class DynamicResourceProcess {
    
        public void process(HttpRequest httpRequest,HttpResponse httpResponse){
            //获取请求的uri
            String requestURI = httpRequest.getRequestURI();
            //对requestURI进行切割操作
            String[] split = requestURI.split("\\?");
            //根据请求的uri到map集合中直接找到对应的servlet的对象
            HttpServlet httpServlet = ServletConcurrentHashMap.map.get(split[0]);
            System.out.println(httpServlet);
          	// ...
        }
    }  
    

1.4StudentServlet类代码实现【应用】

  • 实现步骤

    1. 在service方法中获取请求参数中的数据
    2. 判断是要添加学生还是修改学生等
    3. 调用对应的方法,执行对应的操作
  • 代码实现

    @WebServlet(urlPatterns = "/servlet/studentservlet")
    public class StudentServlet implements HttpServlet {
    
        @Override
        public void service(HttpRequest httpRequest, HttpResponse httpResponse) {
            //获取method请求参数
            String method = httpRequest.getParamter("method");
            System.out.println(method);
            //判断
            if ("addStudent".equals(method)) {
                //添加学生
                addStudent(httpRequest, httpResponse);
            } else if ("delStudent".equals(method)) {
                //删除学生
                delStudent(httpRequest, httpResponse);
            } else if ("updateStudent".equals(method)) {
                //修改学生
                updateStudent(httpRequest, httpResponse);
            } else if ("findStudent".equals(method)) {
                //查询学生
                findStudent(httpRequest, httpResponse);
            }
        }
    
        //查询学生
        private void findStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
    
        //修改学生
        private void updateStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
    
        //删除学生
        private void delStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
    
        //添加学生
        private void addStudent(HttpRequest httpRequest, HttpResponse httpResponse) {   
        }
    }
    

1.5查询学生【应用】

  • 实现步骤

    1. 创建StudentService对象
    2. 调用StudentService中的findAllStudent方法,完成学生数据的查询操作
    3. 遍历数组,拼接成一个字符串
    4. 将拼接的结果响应给浏览器
  • 代码实现

    @WebServlet(urlPatterns = "/servlet/studentservlet")
    public class StudentServlet implements HttpServlet {
        //1.创建StudentService对象
        private StudentService studentService = new StudentService();
    
        @Override
        public void service(HttpRequest httpRequest, HttpResponse httpResponse) {
            //获取method请求参数
    
            String method = httpRequest.getParamter("method");
            System.out.println(method);
            //判断
            if ("addStudent".equals(method)) {
                //添加学生
                addStudent(httpRequest, httpResponse);
            } else if ("delStudent".equals(method)) {
                //删除学生
                delStudent(httpRequest, httpResponse);
            } else if ("updateStudent".equals(method)) {
                //修改学生
                updateStudent(httpRequest, httpResponse);
            } else if ("findStudent".equals(method)) {
                //查询学生
                findStudent(httpRequest, httpResponse);
            }
        }
    
        //查询学生
        private void findStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
            //2.调用StudentService中的findAllStudent方法,完成学生数据的查询操作
            Student[] allStudent = studentService.findAllStudent();
            //3.遍历数组,拼接成一个字符串
            StringBuilder sb = new StringBuilder();
            for (Student student : allStudent) {
                sb.append(student.getId()).append(", ").append(student.getName()).
                        append(", ").append(student.getAge()).append(", ").
                        append(student.getBirthday()).append("<br>");
            }
            String result = sb.toString();
            //4.将拼接的结果响应给浏览器
            //告诉浏览器响应的类型
            httpResponse.setContentTpye("text/html;charset=UTF-8");
            if (result == null || "".equals(result)) {
                httpResponse.write("暂无学生数据。。。。");
            } else {
                httpResponse.write(result);
            }
        }
        //修改学生
        private void updateStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
    
        //删除学生
        private void delStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
    
        //添加学生
        private void addStudent(HttpRequest httpRequest, HttpResponse httpResponse) {   
        }
    }  
    

1.6添加学生【应用】

  • 实现步骤

    1. 获取id的请求参数
    2. 判断id是否重复
    3. 如果重复。给浏览器响应,id已经重复
    4. 如果id不重复。添加学生。并给浏览器响应添加学生成功
  • 代码实现

    @WebServlet(urlPatterns = "/servlet/studentservlet")
    public class StudentServlet implements HttpServlet {
        //1.创建StudentService对象
        private StudentService studentService = new StudentService();
    
        @Override
        public void service(HttpRequest httpRequest, HttpResponse httpResponse) {
            //获取method请求参数
    
            String method = httpRequest.getParamter("method");
            System.out.println(method);
            //判断
            if ("addStudent".equals(method)) {
                //添加学生
                addStudent(httpRequest, httpResponse);
            } else if ("delStudent".equals(method)) {
                //删除学生
                delStudent(httpRequest, httpResponse);
            } else if ("updateStudent".equals(method)) {
                //修改学生
                updateStudent(httpRequest, httpResponse);
            } else if ("findStudent".equals(method)) {
                //查询学生
                findStudent(httpRequest, httpResponse);
            }
        }
    
        //查询学生
        private void findStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
           //...
        }
        //修改学生
        private void updateStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
        //删除学生
        private void delStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
        }
        //添加学生
        private void addStudent(HttpRequest httpRequest, HttpResponse httpResponse) {
            //1.获取id的请求参数
            String id = httpRequest.getParamter("id");
            //2.判断id是否重复
            boolean exists = studentService.isExists(id);
            httpResponse.setContentTpye("text/html;charset=UTF-8");
            if (exists) {
                //3.如果重复。给浏览器响应,id已经重复
                httpResponse.write("id已经存在,请重新输入。。。");
            } else {
                //4.如果id不重复。添加学生。并给浏览器响应添加学生成功
                String name = httpRequest.getParamter("name");
                String age = httpRequest.getParamter("age");
                String birthday = httpRequest.getParamter("birthday");
                //对数据进行处理
                try {
                    int ageInt = Integer.parseInt(age);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = sdf.parse(birthday);
                    //创建一个学生对象
                    Student s = new Student();
                    s.setId(id);
                    s.setName(name);
                    s.setAge(age);
                    s.setBirthday(birthday);
                    //调用studentservice里面的方法
                    studentService.addStudent(s);
                    //给浏览器响应
                    httpResponse.write("学生数据添加成功....");
                } catch (ParseException e) {
                    httpResponse.write("日期格式不正确,正确的格式为:yyyy-MM-dd");
                    e.printStackTrace();
                } catch (NumberFormatException e) {
                    httpResponse.write("年龄只能为整数");
                    e.printStackTrace();
                }
                //birthday  yyyy-MM-dd
            }
        }
    }
    

2.单元测试

2.1概述【理解】

JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具

2.2特点【理解】

  • JUnit是一个开放源代码的测试工具。
  • 提供注解来识别测试方法。
  • JUnit测试可以让你编写代码更快,并能提高质量。
  • JUnit优雅简洁。没那么复杂,花费时间较少。
  • JUnit在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色。

2.3使用步骤【应用】

  • 使用步骤

    1. 将junit的jar包导入到工程中 junit-4.9.jar
    2. 编写测试方法该测试方法必须是公共的无参数无返回值的非静态方法
    3. 在测试方法上使用@Test注解标注该方法是一个测试方法
    4. 选中测试方法右键通过junit运行该方法
  • 代码示例

    public class JunitDemo1 {
        @Test
        public void add() {
            System.out.println(2 / 0);
            int a = 10;
            int b = 20;
            int sum = a + b;
            System.out.println(sum);
        }
    }
    

2.4相关注解【应用】

  • 注解说明

    注解含义
    @Test表示测试该方法
    @Before在测试的方法前运行
    @After在测试的方法后运行
  • 代码示例

    public class JunitDemo2 {
        @Before
        public void before() {
          	// 在执行测试代码之前执行,一般用于初始化操作
            System.out.println("before");
        }
        @Test
        public void test() {
          	// 要执行的测试代码
            System.out.println("test");
        }
        @After
        public void after() {
          	// 在执行测试代码之后执行,一般用于释放资源
            System.out.println("after");
        }
    }
    

3.日志

3.1概述【理解】

  • 概述

    程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。

  • 日志与输出语句的区别

    输出语句日志技术
    取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好
    输出位置只能是控制台可以将日志信息写入到文件或者数据库中
    多线程和业务代码处于一个线程中多线程方式记录日志,不影响业务代码的性能

3.2日志体系结构和Log4J【理解】

  • 体系结构
    在这里插入图片描述

  • Log4J

    Log4j是Apache的一个开源项目。

    通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等位置。

    我们也可以控制每一条日志的输出格式。

    通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

    最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

  • Apache基金会

    Apache软件基金会(也就是Apache Software Foundation,简称为ASF),为支持开源软件项目而办的一个非盈利性组织。

3.3入门案例【应用】

  • 使用步骤

    1. 导入log4j的相关jar包
    2. 编写log4j配置文件
    3. 在代码中获取日志的对象
    4. 按照级别设置记录日志信息
  • 代码示例

    // log4j的配置文件,名字为log4j.properties, 放在src根目录下
    log4j.rootLogger=debug,my,fileAppender
    
    ### direct log messages to my ###
    log4j.appender.my=org.apache.log4j.ConsoleAppender
    log4j.appender.my.ImmediateFlush = true
    log4j.appender.my.Target=System.out
    log4j.appender.my.layout=org.apache.log4j.PatternLayout
    log4j.appender.my.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n
    
    # fileAppender��ʾ
    log4j.appender.fileAppender=org.apache.log4j.FileAppender
    log4j.appender.fileAppender.ImmediateFlush = true
    log4j.appender.fileAppender.Append=true
    log4j.appender.fileAppender.File=D:/log4j-log.log
    log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.fileAppender.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n
    
    // 测试类
    public class Log4JTest01 {
    
        //使用log4j的api来获取日志的对象
        //弊端:如果以后我们更换日志的实现类,那么下面的代码就需要跟着改
        //不推荐使用
        //private static final Logger LOGGER = Logger.getLogger(Log4JTest01.class);
    
        //使用slf4j里面的api来获取日志的对象
        //好处:如果以后我们更换日志的实现类,那么下面的代码不需要跟着修改
        //推荐使用
        private static  final Logger LOGGER = LoggerFactory.getLogger(Log4JTest01.class);
    
        public static void main(String[] args) {
            //1.导入jar包
            //2.编写配置文件
            //3.在代码中获取日志的对象
            //4.按照日志级别设置日志信息
            LOGGER.debug("debug级别的日志");
            LOGGER.info("info级别的日志");
            LOGGER.warn("warn级别的日志");
            LOGGER.error("error级别的日志");
        }
    }
    

3.4配置文件详解【理解】

  • 三个核心

    • Loggers(记录器) 日志的级别

      Loggers组件在此系统中常见的五个级别:DEBUG、INFO、WARN、ERROR 和 FATAL。

      DEBUG < INFO < WARN < ERROR < FATAL。

      Log4j有一个规则:只输出级别不低于设定级别的日志信息。

    • Appenders(输出源) 日志要输出的地方

      把日志输出到不同的地方,如控制台(Console)、文件(Files)等。

      • org.apache.log4j.ConsoleAppender(控制台)
      • org.apache.log4j.FileAppender(文件)
    • Layouts(布局) 日志输出的格式

      可以根据自己的喜好规定日志输出的格式

      常用的布局管理器:

      ​ org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

      ​ org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)

      	org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
      
  • 配置根Logger

    • 格式

      log4j.rootLogger=日志级别,appenderName1,appenderName2,…

    • 日志级别

      OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。

    • appenderName1

      就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。

      例如:log4j.rootLogger=INFO,ca,fa

  • ConsoleAppender常用的选项

    • ImmediateFlush=true

      表示所有消息都会被立即输出,设为false则不输出,默认值是true。

    • Target=System.err

      默认值是System.out。

  • FileAppender常用的选项

    • ImmediateFlush=true

      表示所有消息都会被立即输出。设为false则不输出,默认值是true

    • Append=false

      true表示将消息添加到指定文件中,原来的消息不覆盖。

      false则将消息覆盖指定的文件内容,默认值是true。

    • File=D:/logs/logging.log4j

      指定消息输出到logging.log4j文件中

  • PatternLayout常用的选项

    • ConversionPattern=%m%n

      设定以怎样的格式显示消息
      在这里插入图片描述

3.5在项目中的应用【应用】

  • 步骤

    1. 导入相关的依赖
    2. 将资料中的properties配置文件复制到src目录下
    3. 在代码中获取日志的对象
    4. 按照级别设置记录日志信息
  • 代码实现

    @WebServlet(urlPatterns = "/servlet/loginservlet")
    public class LoginServlet implements HttpServlet{
    
        //获取日志的对象
        private static final Logger LOGGER = LoggerFactory.getLogger(LoginServlet.class);
    
        @Override
        public void service(HttpRequest httpRequest, HttpResponse httpResponse) {
           //处理
            System.out.println("LoginServlet处理了登录请求");
    
            LOGGER.info("现在已经处理了登录请求,准备给浏览器响应");
    
           //响应
            httpResponse.setContentTpye("text/html;charset=UTF-8");
            httpResponse.write("登录成功");
        }
    }
    

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

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

相关文章

【Linux】Linux下的调试器-gdb的使用

目录1.debug和release拓展2.如何使用gdb调试3.指令集我们平常调试C/C代码大多实在Windows平台下的VS中&#xff0c;在LInux中&#xff0c;我们通常使用gdb来调试代码&#xff0c;虽然我们很少在LInux上对代码进行调试&#xff0c;gdb在实际的使用中用的较少&#xff0c;但我们必…

【C++】从0到1入门C++编程学习笔记 - 核心编程篇:类和对象(下)

文章目录五、运算符重载5.1 加号运算符重载5.2 左移运算符重载5.3 递增运算符重载5.4 赋值运算符重载5.5 关系运算符重载5.6 函数调用运算符重载六、继承6.1 继承的基本语法6.2 继承方式6.3 继承中的对象模型6.4 继承中构造和析构顺序6.5 继承同名成员处理方式6.6 继承同名静态…

Java练习:面向对象进阶(上)

Java练习&#xff1a;面向对象进阶&#xff08;上&#xff09;一、定义数组工具类a. 工具类b. 测试类c. 输出结果二、定义学生工具类a. 学生类b. 工具类c. 测试类d. 输出结果三、继承和多态综合练习a. 动物类b. 饲养员类c. 狗类d. 猫类e. 测试类f. 输出结果一、定义数组工具类 …

S60v3固件备份

清理老硬盘 该删资料了 以前的N年前备份的帖子放在CSDN备份吧 没啥用的 以后用来讲故事的 大家不要介意. RM-632102.002 E5-00极限版 RM-566031.023 6730c极限固件 RM-469091.004 E52极限固件 E5-00 一代神机 RM-632 WIFI 横屏 500MP 内存256 S60V3FP2E5的ROM估计现在太难找…

Special Weekly | 瑞兔送福,Live Long and Prosper

SOFAWish 送虎迎兔各位 SOFAStack 社区的朋友好&#xff1a;我是 SOFAStack 社区的负责人鲁直&#xff0c;度过了令人难忘的虎年&#xff0c;我们即将迈入充满希望的兔年&#xff0c;在这里给大家拜个早年&#xff0c;祝大家兔年吉祥。虎年虽然有诸多的不便与艰难&#xff0c;…

ROS2机器人编程简述humble-第二章-SIMULATED ROBOT SETUP .4

ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2ROS2机器人编程简述humble-第二章-Executors .3.5书中没有使用几乎所有教程都会采用的turtlesim。美美的圣诞树画出来-CoCube如何将数学曲线变为机器人轨迹-花式show爱心代码-turtlesim篇直接…

Ribbon集成Nacos实现权重配置(本篇暂未支持spring gateway)

1场景&#xff1a;本篇&#xff0c;是师范 ribbon 与nacos 的权重测试&#xff0c;ribbon读取 nacos内权重设置。在调用端增加配置文件代码如下&#xff1a;&#xff08;1&#xff09; 本次测试nacos 1.4.1&#xff1b;&#xff08;2&#xff09; spring cloud 版本&#xff1a…

趣味三角——第2章——弦

目录 2.1 三角学的雏形与和弦表的产生 2.2 解读残缺粘土板“Plimpton 322”上的三角学 “知识来自影子&#xff0c;影子来自 磬折形(The knowledge comes from the shadow, and the shadow comes from the gnomon)” ——摘自<<Chou-pei Suan-king>>(周髀(b)算经…

while循环——求100以内偶数和

1 问题 求100以内的偶数和。 2 方法 public class EvenNumber{ public static void main(String[] args){ int i 1; int sum 0; while(i < 100){ if(i % 2 0){ System.out.println(i); sum sum i; } i; } System.out.println("100以内的偶数和为&#xff1a;"…

Java-线程基础

Java 线程详解 一个程序至少需要一个进程&#xff0c;而一个进程至少需要一个线程&#xff0c;它也被称为主线程。 线程是程序执行流的最小单位&#xff0c;而进程是系统进行资源分配和调度的一个最小单位。 在单个进程中&#xff0c;可以拥有多个并发执行的线程&#xff0c…

MYSQL分页查询时没有用ORDER BY出现数据重复的问题

背景 产品反馈&#xff0c;用户在使用分页列表时&#xff0c;出现数据重复的问题&#xff0c;查看代码后发现对应的分页SQL并没有使用order by进行排序&#xff0c;但是印象中Mysql的InnoDB引擎会默认按照主键id进行排序&#xff0c;本地测试了一下的确出现了部分数据在不同的页…

单线程事件处理器ControllerEventManager

0 前言 单线程事件处理器&#xff0c;Controller端定义的一个组件。该组件内置了一个专属线程&#xff0c;负责处理其他线程发送过来的Controller事件。还定义了一些管理方法&#xff0c;为专属线程输送待处理事件。 0.11.0.0版本前&#xff0c;Controller组件源码复杂。集群…

【Ajax】XMLHttpRequest和Level2

一、XMLHttpRequest什么是XMLHttpRequestXMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数&#xff0c;就是基于 xhr 对象封装出来的。二、了解xhr…

java面试

java面试目录概述需求&#xff1a;设计思路实现思路分析1.代码&#xff1a;参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Surv…

【数据结构】保姆级队列各接口功能实现

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、队列概述&#x1f95d;&#xff1a; 1.队列的概念&#xff1a; 2.队列的结构&#xff1a; &#x1f349;二、队列的各接口功能实现&#x1f349;&#xff1a; 1.初始化队列&#xff1a; 2.入队&#…

k8s之挂载NFS到POD中

写在前面 在k8s之挂载本地磁盘到POD中 一文中我们看了如何将POD中的数据写到本地磁盘中&#xff0c;这种方式要求POD只能在指定的Node上&#xff0c;一旦POD更换Node&#xff0c;数据依然会丢失&#xff0c;所以本文看下如何通过将数据写到NFS中来解决这个问题。下面我们就开始…

sklearn数据降维之字典学习

文章目录字典学习简介构造函数实战Step1 制作实验数据Step2 小批字典学习Step 3 参数调整字典学习简介 如果把降维理解成压缩的话&#xff0c;那么字典学习的本质是编码&#xff0c;其目的是找到少量的原子&#xff0c;用以描述或构建原始样本。举个一维的例子&#xff0c;以a…

程序员护眼指南

前言 前言&#xff1a;脱发和近视是当代年轻人的两大痛点&#xff0c;今天来聊聊如何护眼。 文章目录前言一、护眼的核心二、调节睫状肌的方法1. 眨眼2. 望远3. 睡觉4. 促进血液循环5. 吃补剂6. 好的屏幕一、护眼的核心 护眼的核心就是保护睫状肌。 睫状肌是眼内的一种平滑肌…

一起自学SLAM算法:7.7 典型SLAM算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 针对式&#xff08;7-38&#xff09;所述的在线SLAM系统&#xff0c;以扩展卡尔曼滤波&#xff08;EKF&#xff09;为代表的滤波方法&#xff0c;是求解该状态估计问题最典型的方法&#xff0c;在7.4节中已经详细…

GY-US42超声波传感器模块介绍

GY-US42超声波传感器模块简介GY-US42 是一款低成本高品质测距传感器模块。工作电压 3-5v&#xff0c;功耗小&#xff0c;体积小&#xff0c;安装方便。其工作原理是&#xff0c;探头发射超声波&#xff0c;照射到被测物体后&#xff0c;探头接收返回声波&#xff0c;利用时间差…