05-10 周五 FastBuild 容器启动引起超时问题定位与解决

news2024/11/17 2:50:09
05-10 周五 FastBuild 容器启动超时问题
时间版本修改人描述
2024年5月11日16:45:33V0.1宋全恒新建文档
2024年5月11日22:37:21V1.0宋全恒完成解决方案的撰写,包括问题分析,docker命令

简介

 关于FastBuild的优化,已经撰写了多个博客,具体如下所示:

博客描述
04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)-CSDN博客记录了部署FastBuild的完整过程,基本流程
04-25 周四 FastBuild重构实践-TLS、全局捕获异常、一键配置-CSDN博客记录了第一次优化的过程,完成配置文件移入数据库
05-08 周三 FastBuild FastAPI 引入并发支持和全局捕获异常-CSDN博客记录了并发支持和全局捕获异常。解决拉取和check解耦问题以及超时问题。

问题

问题1 容器启动时/bin/bash不存在

 可以使用

docker run -it --rm [image_name] ls /bin

 这将列出容器中/bin目录下的所有文件,包括bashdash

10.200.88.53/xyy-zhejianglab.com/123:1

image-20240510200146027
root@iZ1pp06qu51oiqqddsrnuvZ:~# docker inspect d94e2b46e87b
[
    {
        "Id": "sha256:d94e2b46e87b3df99b8371a632b467fe5cc39dae04f882991af1ed1b8353c336",
        "RepoTags": [
            "10.200.88.53/xyy-zhejianglab.com/123:1"
        ],
        "RepoDigests": [
            "10.200.88.53/xyy-zhejianglab.com/123@sha256:2625be6a2bc2aedfe4d91961b2037e557b0d1739a9c87677c184421c7d215d77"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-06-08T12:33:13.003229175Z",
        "Container": "3b0058616208c2df9bf5122ca6d3d2c3eef81ab200b17693a2578dbec7db56d3",
        "ContainerConfig": {
            "Hostname": "3b0058616208",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/sh\" \"-c\" \"/bin/cp -rf /jacocoagent.jar /tmp/\"]"
            ],
            "Image": "sha256:c83155cc95491342b169187489dfe5b9b32157adce169144b51a65f4e9a552bd",
            "Volumes": null,
            "WorkingDir": "/",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.1",
        "Author": "cuisj@isyscore.com",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "/bin/cp -rf /jacocoagent.jar /tmp/"
            ],
            "Image": "sha256:c83155cc95491342b169187489dfe5b9b32157adce169144b51a65f4e9a552bd",
            "Volumes": null,
            "WorkingDir": "/",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 5866405,
        "VirtualSize": 5866405,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/e6ec3bebc8c50e24ef8786628813c76df51885d0009b8ee48cf51f21effbcad1/diff",
                "MergedDir": "/var/lib/docker/overlay2/b4f143ad6a63d5641c51350dc152d27e7831bcff5e127055dfd6a73c63b71d7e/merged",
                "UpperDir": "/var/lib/docker/overlay2/b4f143ad6a63d5641c51350dc152d27e7831bcff5e127055dfd6a73c63b71d7e/diff",
                "WorkDir": "/var/lib/docker/overlay2/b4f143ad6a63d5641c51350dc152d27e7831bcff5e127055dfd6a73c63b71d7e/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a",
                "sha256:7aec0e78f86e45c647f9166c795e14a4025e698d082f506fc84027cea786c1f0"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

问题2 Container is not running

image-20240510200515738

思考

/bin/bash不存在

 这个问题是不存在的,因为容器的启动使用了镜像默认的entrypoint和cmd。但是如果代码写死了直接使用/bin/bash来启动容器,则是有问题的,应该先判断/bin/bash的存在。这是问题解决初期的思路。

root@iZ1pp06qu51oiqqddsrnuvZ:~# docker run -it --rm d94e2b46e87b /bin/bash
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown.

 可以使用

docker run -it --rm [image_name] ls /bin

 这将列出容器中/bin目录下的所有文件,包括bashdash

10.200.88.53/xyy-zhejianglab.com/123:1

root@iZ1pp06qu51oiqqddsrnuvZ:~# docker run -it d94e2b46e87b ls /bin
arch           echo           kill           netstat        sh
ash            ed             link           nice           sleep
base64         egrep          linux32        pidof          stat
bbconfig       false          linux64        ping           stty
busybox        fatattr        ln             ping6          su
cat            fdflush        login          pipe_progress  sync
chgrp          fgrep          ls             printenv       tar
chmod          fsync          lzop           ps             touch
chown          getopt         makemime       pwd            true
conspy         grep           mkdir          reformime      umount
cp             gunzip         mknod          rev            uname
date           gzip           mktemp         rm             usleep
dd             hostname       more           rmdir          watch
df             ionice         mount          run-parts      zcat
dmesg          iostat         mountpoint     sed
dnsdomainname  ipcalc         mpstat         setpriv
dumpkmap       kbd_mode       mv             setserial

启动方式

注:在容器启动时通过entrypoint和cmd配合,可以探测/bin/bash的存在。下面描述了cmd和entrypoint的作用

cmd和entrypoint作用

  • CMD:设置容器启动后默认执行的命令及其参数。不过,CMD 指定的命令可以通过 docker run 命令行参数来覆盖。它主要用于为容器设定默认启动行为。如果 Dockerfile 中有多个 CMD 指令,只有最后一个生效。

  • ENTRYPOINT:配置容器启动时运行的命令,功能上与 CMD 类似,但有一个关键区别——即使在 docker run 时指定了其他命令,ENTRYPOINT 也不会被忽略,而是会与这些命令结合使用(除非使用 --entrypoint 覆盖)。当容器作为应用程序或服务运行时,推荐使用 ENTRYPOINT,并且最好采用 Exec 格式。


  1. 使用 RUN 命令来安装应用程序和包,并创建新的镜像层。
  2. 如果Docker镜像的目的是运行一个应用程序或服务,例如运行 MySQL,那么应该优先使用 Exec 格式的 ENTRYPOINT 命令。CMD 可以为 ENTRYPOINT 提供额外的默认参数,并且这些默认参数可以被 docker run 命令行替换。
  3. 如果你想为容器设置默认的启动命令,可以使用 CMD 命令。用户可以在 docker run 命令行中覆盖这个默认命令。

docker:RUN CMD ENTRYPOINT区别_docker run entrypoint-CSDN博客 这个文章描述的比较清楚,CMD和EntryPOINT指令

docker中的run/cmd/entrypoint的区别详解_docker_脚本之家 比较清楚的演示了作用

 CMD 可以被覆盖。

 CMD 可以为ENtrypoint 提供参数

注,镜像设置了entrypoint之后,docker run之后的命令相当于提供给entrypoint的参数,这个在docker中的run/cmd/entrypoint的区别详解_docker_脚本之家有清晰的演示。

entrypoint中的参数始终会被使用,而cmd的额外参数可以在容器启动时动态替换掉。

探测/bin/bash存在,启动镜像容器结论

 如果镜像中已经配置了entrypoint,可以通过如下的方式

docker run --entrypoint /bin/ls f45dbefbae90  "/bin"
CMDEntrypoint启动方式
/bin/bash存在,用CMD指定/bin/bash即可
2.使用/bin/sh, 启动
3. 报错
判断存在 用entrypoint指定/bin/ls,cmd指定"/bin"判断bash是否存在。
docker run -it --entrypoint /bin/ls d94e2b46e87b “/bin”
  • CMD 是容器启动时如果没有指定命令时的默认行为,它的灵活性较高,易于被 docker run 后的命令覆盖。
  • ENTRYPOINT 更像是容器的核心功能定义,常用于定义容器的主应用程序,并且能接收 docker run 的参数,这样可以确保容器启动时总是执行预期的程序,并且可以处理任何额外的参数。

总结:

无论什么镜像,我们直接使用entrypoint 和CMD来获取/bin/bash是否存在,如果不存在,要用sh.

 即无论镜像的元数据,即entrypoint和cmd配置与否,我们可以通过指定entrypoint和cmd来按照我们预期的方式来探测镜像中/bin/bash的存在,进而确定启动容器的方式是使用/bin/sh还是/bin/bash

oot@iZ1pp06qu51oiqqddsrnuvZ:~# docker images |  grep f45
10.200.88.53/songquanheng-zhejianglab.com/python                   <none>                                                       6de34f45a879   4 days ago          7.57GB
10.200.88.53/framework/jax                                         0.4.8-python3.8.10-ubuntu18.04-cuda11.7-cudnn8-ssh-jupyter   f45dbefbae90   12 months ago       8.3GB
root@iZ1pp06qu51oiqqddsrnuvZ:~# docker run --entrypoint /bin/ls f45dbefbae90  "/bin"
bash
bunzip2
bzcat
bzcmp
bzdiff
bzegrep
bzexe
zmore
znew

 其实简单一点,如果镜像配置了Entrypoint,则CMD即作为entrypoing的参数,而entrypoint是可执行程序的路径。CMD作为参数,如果没有设置entrypoint,则cmd自身即为可执行的命令,而且在docker run时可以灵活的指定。

注,经过思考,发现问题的关键并不在于这个方向,即启动容器的方式,关键在于镜像之前的配置,导致容器的启动无法长时间运行。

结论

 经过仔细的思考发现,由于FastBuild要判断镜像默认启动中,是否包含了sshd服务和jupyterlab服务,倘若我们通过覆盖entrypoint和cmd的方式,来修改了容器启动的方式,则服务判断是无法进行的。

 根据上面的结论,可以得到如下的结果,即,无法覆盖entrypoint和cmd。

 问题进而转化为,如何解决超时问题,超时问题是因为系统内部启动容器,结果镜像启动容器的命令是类似cp文件的命令,容器执行完了命令,自动停止了,不在处于运行状态,导致系统无法和容器交互获取其中容器的python,pip等环境,因此,是镜像自身的问题,因此,我们可以通过捕获异常的方式来提示用户,该镜像问题。

解决方式

问题代码修改

    def collect_image_info(self, image_name):
        image_meta = self.get_image_meta(image_name)
        container = self.get_image_container(image_name)

        print(f"启动容器, 镜像名称: {image_name}, 容器id: {container.short_id}")
        extractor = ArtifactExtractor(image_name, container, image_meta)
        descriptor = extractor.get_image_descriptor()
        print("镜像类型: " + image_meta["Architecture"])
        print("镜像大小: " + str(round(float(image_meta["Size"]) / 1000000000, 2)) + "G")
        return descriptor, image_meta

 代码修改为

    def collect_image_info(self, image_name):
        try:
            image_meta = self.get_image_meta(image_name)
            command, entrypoint = self.get_cmd_entrypoint(image_meta)
            container = self.get_image_container(image_name)
            print(f"{image_name}镜像的command:{command}, entrypoint:{entrypoint}")
            print(f"启动容器, 镜像名称: {image_name}, 容器id: {container.short_id}")
            extractor = ArtifactExtractor(image_name, container, image_meta)
            descriptor = extractor.get_image_descriptor()
            print("镜像类型: " + image_meta["Architecture"])
            print("镜像大小: " + str(round(float(image_meta["Size"]) / 1000000000, 2)) + "G")
            return descriptor, image_meta
        except APIError as err:
            print(f"在镜像环境收集时失败,镜像自有的启动命令command:{command}, entrypoint: {entrypoint}")
            raise FBException(15005, f"镜像启动命令command:{command}, entrypoint: {entrypoint}需要保证容器在环境探测过程中保持运行状态"
                                     f"请检查镜像启动命令是否正确,错误信息:{err}")

 可以看出,主要是将上述问题代码添加try,捕获异常APIError,这样系统出现了这个异常之后,通过捕获重新抛出了FBException,而这被全局捕获异常处理的方式告诉给前端,即解决了超时问题。

解决问题中Config和ContainerConfig

 下述内容记录了通过镜像元数据读取entrypoint和cmd的过程,这样方便在提示中正确的提示用户,是镜像出问题了。顺道解决超时问题

在Docker镜像的元数据中,Config 和 ContainerConfig 表示镜像的配置和容器的配置。它们的区别在于:

Config:

Config 指的是镜像的配置。这个配置是在构建镜像时定义的,并保存在镜像的元数据中。它包含了构建镜像时使用的各种指令,比如 CMD、ENTRYPOINT、ENV 等。这些配置会影响到使用该镜像创建的所有容器。
ContainerConfig:

ContainerConfig 指的是容器的配置。这个配置是在创建容器时指定的,并保存在容器的元数据中。它包含了在创建容器时传递给 Docker 引擎的各种参数,比如 CMD、ENTRYPOINT、ENV 等。与镜像的配置不同,容器的配置可以覆盖镜像的配置,允许用户在创建容器时对容器的行为进行定制。
因此,Config 表示镜像的静态配置,而 ContainerConfig 表示容器的动态配置,可以根据需要在创建容器时进行调整。
image-20240511171735546

docker命令

 下述命令是定位解决两个问题的方式

打印系统中的所有镜像:tag

docker 获取镜像名称和tag

root@iZ1pp06qu51oiqqddsrnuvZ:~# docker images --format "{{.Repository}}:{{.Tag}}" | grep -v none
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715413002:1
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715412764:1
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715411659:1
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715411501:1
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715410460:1
10.200.88.53/liuyangyang-zhejianglab.com/ui_test_image1715409964:1

不能覆盖镜像的启动的信息,因为要根据启动的信息判断服务的存在。

docker run --entrypoint /bin/ls -it  /bin

打印系统所有镜像的entrypoint和cmd

root@iZ1pp06qu51oiqqddsrnuvZ:~# docker images --format "{{.Repository}}:{{.Tag}}" | grep -v none | xargs -I {} docker inspect --format='{{range .Config.Cmd}}{{.}} {{end}}|{{range .Config.Entrypoint}}{{.}} {{end}}' {}
|/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
|/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
|/bin/sh -c /usr/bin/supervisord -c /etc/supervisor/supervisord.conf 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
|/bin/sh -c /workspace/env_entrypoint.sh 
|/bin/sh -c /usr/bin/supervisord -c /etc/supervisor/supervisord.conf 
/bin/bash |
|/bin/bash -c bash run.sh 
|/bin/bash -c bash run.sh 
|/bin/bash -c bash run.sh 
|/bin/bash -c bash run.sh 
bash |
bash |
/bin/bash |
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
/bin/bash |/bin/sh -c /opt/conda/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
/bin/bash |
/bin/bash |
/bin/bash |
/bin/bash |
|/bin/bash -c MASTER_HOST=`cat /etc/volcano/master.host | tr "\n" ","`;
WORKER_HOST=`cat /etc/volcano/worker.host | tr "\n" ","`;
mkdir -p /var/run/sshd; /usr/sbin/sshd;
mkdir -p /etc/mpi/;
cp /etc/volcano/master.host /etc/mpi/hostfile;
echo >> /etc/mpi/hostfile;
cat /etc/volcano/worker.host >> /etc/mpi/hostfile;
echo >> /etc/mpi/hostfile;
echo -e 'jupyter lab --ip=* --port=8888 --no-browser --notebook-dir=/home --allow-root' > /tmp/run.sh;bash /tmp/run.sh
 
|/bin/sh -c /usr/bin/supervisord -c /etc/supervisor/supervisord.conf 
|/bin/bash -c bash start.sh 
|/bin/sh -c /workspace/env_entrypoint.sh 
|/bin/bash -c MASTER_HOST=`cat /etc/volcano/master.host | tr "\n" ","`;
WORKER_HOST=`cat /etc/volcano/worker.host | tr "\n" ","`;
mkdir -p /var/run/sshd; /usr/sbin/sshd;
mkdir -p /etc/mpi/;
cp /etc/volcano/master.host /etc/mpi/hostfile;
echo >> /etc/mpi/hostfile;
cat /etc/volcano/worker.host >> /etc/mpi/hostfile;
echo >> /etc/mpi/hostfile;
echo -e 'jupyter lab --ip=* --port=8888 --no-browser --notebook-dir=/home --allow-root' > /tmp/run.sh;bash /tmp/run.sh
 
/bin/bash |/bin/bash -c /etc/init.d/ssh start && sleep infinity 
|/bin/bash /alphadrug/run.sh 
|/bin/bash /alphadrug/run.sh 
|/bin/bash -c /etc/init.d/ssh start && sleep 365d 
/bin/bash |
/bin/bash |
/bin/bash |
bash |/bin/bash -c bash start.sh 
bash |/bin/bash -c bash start.sh 
|/bin/sh -c /usr/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
|/bin/sh -c /usr/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
|/bin/bash -c /etc/init.d/ssh start && sleep infinity 
/bin/bash |
/bin/bash |/bin/bash -c /usr/local/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
/bin/bash |/bin/bash -c /usr/local/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
/bin/bash |/bin/bash -c /usr/local/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
/bin/bash |/bin/sh -c /opt/conda/bin/supervisord -c /etc/supervisord.d/supervisord.conf 
/bin/bash |
/bin/sh -c /bin/cp -rf /jacocoagent.jar /tmp/ |

总结

 通过这个问题解决的过程,解决了在交互过程中而导致内部服务器错误,前端无法接收到后端响应,而出现的Bad Request的问题。文章包含了完整的分析过程,教训是惨痛的,程序还是需要健壮的,多亏了之前的全局捕获异常,可以很好的将这个异常传达给上层。

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

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

相关文章

C#知识|无边框的WinForm窗体,如何拖动位置?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 上一节时练习做了一个简单的登录窗体界面&#xff0c;为了美观设置成了无边框&#xff0c; 当运行起来&#xff0c;发现无边框的窗体无法用鼠标拖动位置&#xff0c; 本节记录通过添加代码实现无边框窗体实现移动&…

IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案

文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时&#xff0c;会有以上两个选项&#xff0c;这两个选项有什么区别&#xff1f; 答&#xff…

二、jacoco代码覆盖率工具

jacoco代码覆盖率工具 一、jacoco介绍二、常见的java代码覆盖率工具三、为什么选择jacoco四、jacoco的特点五、Jacoco 支持的覆盖率指标六、那些暂未支持的覆盖率指标七、jacoco技术原理八、Jacoco 下载与配置九、jacoco主要文件十、jacoco使用流程 一、jacoco介绍 JaCoCo 是一…

【GESP】2023年12月图形化二级 -- 小杨报数

小杨报数 【题目描述】 小杨需要从 1 1 1到 N N N报数。在报数过程中&#xff0c;小杨希望跳过 M M M的倍数。例如&#xff0c;如果 N 5 N5 N5&#xff0c; M 2 M2 M2&#xff0c;那么小杨就需要依次报出 1 1 1&#xff0c; 3 3 3&#xff0c; 5 5 5。 默认小猫角色和白色背…

LED液晶显示屏(LCD/TFT)抗干扰太阳光模拟器

LED&液晶显示屏(LCD/TFT)抗干扰太阳光模拟器&#xff1a;解决驾驶员视线问题 在驾车过程中&#xff0c;太阳光的干扰是一个常见的问题。特别是在高速公路等需要高度集中注意力的情况下&#xff0c;太阳光的干扰会严重影响驾驶员的视线&#xff0c;增加驾驶风险。为了解决这…

eNSP中小型园区网络拓扑搭建(上)

→b站直通车&#xff0c;感谢大佬← →eNSP中小型园区网络拓扑搭建&#xff08;下&#xff09;← 不带配置命令的拓扑图已上传~ 项目背景&#xff1a; 某公司准备新建一张网络供企业办公使用。写字楼共3层&#xff0c;一层会客大厅、二层行政部及市场部、三层研发部。一层设…

容器监控与日志管理

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Docker监控工具 二、容器日志工具docker logs 三、第三方日志工具 四、容器日志驱动 五、示例 5.1、查看容器中运行的进程的信息 5.2、查看…

TEINet: Towards an Efficient Architecture for Video Recognition 论文阅读

TEINet: Towards an Efficient Architecture for Video Recognition 论文阅读 Abstract1 Introduction2 Related Work3 Method3.1 Motion Enhanced Module3.2 Temporal Interaction Module3.3 TEINet 4 Experiments5 Conclusion阅读总结 文章信息; 原文链接&#xff1a;https:…

BUU-[极客大挑战 2019]Http

考察点 信息收集 http构造请求数据包 题目 解题步骤 参考文章&#xff1a;https://zhuanlan.zhihu.com/p/367051798 查看源代码 发现有一个a标签&#xff0c;但是οnclick"return false"就是点击后不会去跳转到Secret.php的页面 所以我就自己拼接url http://no…

工业机器人应用实践之玻璃涂胶(篇二)

工业机器人 接上篇文章&#xff0c;浅谈一下实践应用&#xff0c;具体以玻璃涂胶为例&#xff1a; 了解工业机器人在玻璃涂胶领域的应用认识工具坐标系的标定方法掌握计时指令的应用掌握人机交互指令的应用掌握等待类指令用法&#xff08;WaitDI、WaitUnitl 等&#xff09;认…

表面的相似,本质的不同

韩信与韩王信&#xff0c;两个韩信的结局都是被刘邦所杀&#xff0c;似乎结局类似。但是&#xff0c;略加分析&#xff0c;就会发现其中存在本质的区别。 韩信属于必杀。他的王位是要来的&#xff0c;有居功自傲的本意&#xff0c;功高震主而且毫不避讳。而且年轻&#xff0c;…

REFORMER: 更高效的TRANSFORMER模型

大型Transformer模型通常在许多任务上都能达到最先进的结果&#xff0c;但是训练这些模型的成本可能会非常高昂&#xff0c;特别是在处理长序列时。我们引入了两种技术来提高Transformer的效率。首先&#xff0c;我们用一种使用局部敏感哈希的点积注意力替换了原来的点积注意力…

Apache ECharts

Apache ECharts介绍&#xff1a; Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html Apache ECh…

Django简介

Django 1.安装Django pip install djangopython的包的分布 \python- python.exe- Scripts- pip.exe- django-admin.exe [工具&#xff0c;创建django项目]- Lib- 内置模块- site-packages [安装的包]- pymysql- flask- django [框架的源码]2.创建项目 Django项目会有…

Windows系统下通过nginx配置多项目

文章目录 前言大概思路实际操作记录&#xff1a;查看nginx 错误日志问下AI注意点&#xff1a; 当访问域名根路径时&#xff0c;重定向到/pc解决&#xff1a; 总结 前言 在windows电脑启动一个nginx 测试配置多前端项目&#xff0c;一个pc端&#xff08;vue3tsvite &#xff0c…

鸿蒙ArkUI:【编程范式:命令式->声明式】

命令式 简单讲就是需要开发用代码一步一步进行布局&#xff0c;这个过程需要开发全程参与。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Objective-C ObjectiveC 复制代码 UIView *cardView …

【C/C++笔试练习】DNS设置文件、应用层、Dos攻击、DNS服务、DNS、子网划分、http状态、路由设置、TCP连接、HTTP状态码、剪花布条、客似云来

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS设置文件&#xff08;2&#xff09;应用层&#xff08;3&#xff09;Dos攻击&#xff08;4&#xff09;DNS服务&#xff08;5&#xff09;DNS&#xff08;6&#xff09;子网划分&#xff08;7&#xff09;http状态&am…

嵌入式C语言高级教程:实现基于STM32的智能健康监测手环

智能健康监测手环能够实时监控用户的生理参数&#xff0c;如心率、体温和活动量&#xff0c;对于健康管理和疾病预防非常有帮助。本教程将指导您如何在STM32微控制器上实现一个基本的智能健康监测手环。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xf…

进程间通信(二)

共享内存 当进程A和进程B有一块共享的内存空间时&#xff0c;这两个进程之间的数据交互就会变的很简单&#xff0c;只需要像读取自己内存空间中的元素一样去读取数据即可。实现共享内存进行数据交互的一般步骤&#xff1a; 创建/打开共享内存内存映射数据交换断开与共享内存的…

【数组算法】598. 区间加法

给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大整数的个数 。 示例 1: …