Ubuntu20.04安裝運行DynaSLAM

目錄

一、安裝Anaconda

二、相關依賴庫安裝?

1、boost安裝

2、Eigen 3安裝

3、opencv安裝?

4、Pangolin安裝

三、配置Mask_RCNN環境

四、DynaSLAM編譯

五、DynaSLAM運行


一、安裝Anaconda

打開以下鏈接:

Index of /

下載和自己系統匹配的安裝包。這里下載的是Anaconda3-2024.02-1-Linux-x86_64.sh。

148cccaf43e249e5a4cad1d878a2e189.png?

在下載安裝包的目錄下打開終端,執行以下命令進行安裝。

bash Anaconda3-2024.02-1-Linux-x86_64.sh

出現以下畫面,按提示進行回車:

33e1734597ee48578835573f6b5e73b3.png?

一直按回車,或按q直接跳過,直到出現“Do you accept the license terms”, 輸入“yes” 。

4f82f76b6a1c4e6ea4f80047b34023a7.png?

默認位置已經足夠,按ENTER確認安裝位置。

b89dfbfc76d74bd2988a8be445179f12.png?

出現是否要運行conda init,輸入yes。

e27837ec4f0c44f08b0b725efa58b3f6.png?

出現以下畫面,Anaconda安裝成功:

e794e3355bd946a6a29f622c333ba6f4.png?

安裝好后,source一下環境或者重新打開一個終端。

source ~/.bashrc 

會多一個(base)的前綴。

5b3c54a4e7cd40fab3acb94c209a1097.png?

附:如果希望 conda 的基礎環境在啟動終端時不被激活,將?auto_activate_base?參數設置為 false:

conda config --set auto_activate_base false

后面想要再進入conda的base環境,只需要使用conda指令激活:

conda activate base

二、相關依賴庫安裝?

1、boost安裝

?通過以下鏈接下載boost1.71:

https://archives.boost.io/release/1.71.0/source/boost_1_71_0.tar.gz

將下載的源碼解壓縮至home下,在boost目錄下打開終端,依次執行以下命令,等待安裝完成即可:

sudo ./bootstrap.sh
sudo ./b2 install

2、Eigen 3安裝

在home下打開終端,終端執行以下命令下載Eigen3源碼:

git clone https://github.com/eigenteam/eigen-git-mirror

?然后依次執行以下命令進行安裝:

cd eigen-git-mirror
mkdir build && cd build
cmake ..
sudo make install

3、opencv安裝?

版本一定要對應,不然編譯過程中會報各種錯誤。

通過以下鏈接下載opencv3.4.5:

https://github.com/opencv/opencv/archive/refs/tags/3.4.5.tar.gz

終端執行以下命令,安裝所需的依賴項:

sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev  libtiff5-dev libopenexr-dev libtbb-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev pkg-config

在opencv目錄下打開終端,執行以下命令編譯安裝:?

mkdir build && cd build
cmake ..
sudo make -j4
sudo make install

終端執行以下命令,修改/etc/ld.so.conf文件:

sudo gedit /etc/ld.so.conf

在打開的文件中加上一行?include /usr/local/lib,/usr/local是opencv的默認安裝路徑,這樣告訴系統以后去lib目錄下找opencv的庫文件。

include /usr/local/lib

執行以下,命令使得conf生效:?

sudo ldconfig

終端執行以下命令,修改bash.bashrc文件:

sudo gedit /etc/bash.bashrc 

在文件末尾加上以下內容:?

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

?然后source使得bash生效:

source /etc/bash.bashrc

輸入以下命令查看opencv版本信息:?

pkg-config opencv --modversion

顯示版本,表示安裝成功!
?

4、Pangolin安裝

Pangolin一定要v0.5版本的,其他版本會報錯。

由于我這里之前安裝過Pangolin,因此需要卸載之前的版本。

(1)刪除庫和頭文件

cd Pangolin/build
make clean
sudo make uninstall

(2)刪除源代碼

cd ../..
sudo rm -r Pangolin

(3)刪除殘留文件夾

sudo updatedb
locate pangolin
sudo rm -r /usr/local/include/pangolin

通過以下鏈接下載Pangolinv0.5源碼:

?https://github.com/stevenlovegrove/Pangolin/archive/refs/tags/v0.5.tar.gz

將其解壓縮到主目錄home下,打開Pangolin文件夾,打開終端執行以下命令:

mkdir build && cd build
cmake ..
sudo make -j4
sudo make install

安裝時會出現報錯,因此需要對文件進行修改:

/Pangolin/CMakeModules/FindFFMPEG.cmake中63,64行

        sizeof(AVFormatContext::max_analyze_duration2);}" HAVE_FFMPEG_MAX_ANALYZE_DURATION2

換成

        sizeof(AVFormatContext::max_analyze_duration);}" HAVE_FFMPEG_MAX_ANALYZE_DURATION

/Pangolin/src/video/drivers/ffmpeg.cpp中第37行 namespace pangolin上面加上

#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER

第78,79行

TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC); 
TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);

改為

#ifdef FF_API_XVMCTEST_PIX_FMT_RETURN(XVMC_MPEG2_MC);TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);
#endif

第101-105行

    TEST_PIX_FMT_RETURN(VDPAU_H264);TEST_PIX_FMT_RETURN(VDPAU_MPEG1);TEST_PIX_FMT_RETURN(VDPAU_MPEG2);TEST_PIX_FMT_RETURN(VDPAU_WMV3);TEST_PIX_FMT_RETURN(VDPAU_VC1);

改為

#ifdef FF_API_VDPAUTEST_PIX_FMT_RETURN(VDPAU_H264);TEST_PIX_FMT_RETURN(VDPAU_MPEG1);TEST_PIX_FMT_RETURN(VDPAU_MPEG2);TEST_PIX_FMT_RETURN(VDPAU_WMV3);TEST_PIX_FMT_RETURN(VDPAU_VC1);
#endif

第127行

	TEST_PIX_FMT_RETURN(VDPAU_MPEG4);

改為

#ifdef FF_API_VDPAUTEST_PIX_FMT_RETURN(VDPAU_MPEG4);
#endif

Pangolin/include/pangolin/video/drivers/ffmpeg.h開頭加上

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

更改完后,重新安裝即可。

三、配置Mask_RCNN環境

在Anaconda虛擬環境下配置,終端依次執行以下命令:

# 創建一個虛擬環境
conda create -n MaskRCNN python=2.7
conda activate MaskRCNN
# 這一步可能報錯,多嘗試幾次
pip install tensorflow==1.14.0
pip install keras==2.0.9
pip install scikit-image
pip install pycocotools

?在安裝pycocotools時報錯:

?

通過以下命令安裝pycocotools:

conda install -c conda-forge pycocotools

下載DynaSLAM并測試環境,終端執行以下命令下載DynaSLAM源碼:

git clone  https://github.com/BertaBescos/DynaSLAM.git

通過以下鏈接,下載mask_rcnn_coco.h5文件:

https://github.com/matterport/Mask_RCNN/releases/download/v1.0/mask_rcnn_coco.h5

然后把mask_rcnn_coco.h5文件放在DynaSLAM/src/python/文件夾下。

在DynaSLAM目錄下打開終端,然后執行以下命令(需在剛剛創建的MaskRCNN環境下):

python src/python/Check.py

出現如下:Mask R-CNN is correctly working

則說明Mask_RCNN環境配置成功了。

四、DynaSLAM編譯

編譯之前需要對部分代碼進行修改。

(1)DynaSLAM/CMakeLists.txt

C++11改為C++14

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 ")
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")
......................
#find_package(OpenCV 2.4.11 QUIET)
#if(NOT OpenCV_FOUND)
#    message("OpenCV > 2.4.11 not found.")
#    find_package(OpenCV 3.0 QUIET)
#    if(NOT OpenCV_FOUND)
#        message(FATAL_ERROR "OpenCV > 3.0 not found.")
#    endif()
#endif()find_package(OpenCV 3.4 QUIET)
if(NOT OpenCV_FOUND)find_package(OpenCV 2.4 QUIET)if(NOT OpenCV_FOUND)message(FATAL_ERROR "OpenCV > 2.4.x not found.")endif()
endif()
......................
set(Python_ADDITIONAL_VERSIONS "2.7")
#This is to avoid detecting python 3
find_package(PythonLibs 2.7 EXACT REQUIRED)
if (NOT PythonLibs_FOUND)message(FATAL_ERROR "PYTHON LIBS not found.")
else()message("PYTHON LIBS were found!")message("PYTHON LIBS DIRECTORY: " ${PYTHON_LIBRARY} ${PYTHON_INCLUDE_DIRS})
endif()
......................
#find_package(Eigen3 3.1.0 REQUIRED)
find_package(Eigen3 3 REQUIRED)
......................
# add_executable(mono_carla
# Examples/Monocular/mono_carla.cc)
# target_link_libraries(mono_carla ${PROJECT_NAME})

(2)DynaSLAM/Thirdparty/DBoW/CMakeLists.txt

#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall  -O3 -march=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall  -O3 ")
......................
# find_package(OpenCV 3.0 QUIET)
find_package(OpenCV 3.4 QUIET)

(3)DynaSLAM/Thirdparty/g2o/CMakeLists.txt

#SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
#SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 ")
......................
#FIND_PACKAGE(Eigen3 3.1.0 REQUIRED)
FIND_PACKAGE(Eigen3 3 REQUIRED)

(4)DynaSLAM/include/Conversion.h

// cv::Mat toMat(const PyObject* o);cv::Mat toMat(PyObject* o);

(5)DynaSLAM/src/Conversion.cc

/*** This file is part of DynaSLAM.* Copyright (C) 2018 Berta Bescos <bbescos at unizar dot es> (University of Zaragoza)* For more information see <https://github.com/bertabescos/DynaSLAM>.**/#include "Conversion.h"
#include <iostream>namespace DynaSLAM
{static void init(){import_array();}static int failmsg(const char *fmt, ...){char str[1000];va_list ap;va_start(ap, fmt);vsnprintf(str, sizeof(str), fmt, ap);va_end(ap);PyErr_SetString(PyExc_TypeError, str);return 0;}class PyAllowThreads{public:PyAllowThreads() : _state(PyEval_SaveThread()) {}~PyAllowThreads(){PyEval_RestoreThread(_state);}private:PyThreadState *_state;};class PyEnsureGIL{public:PyEnsureGIL() : _state(PyGILState_Ensure()) {}~PyEnsureGIL(){// std::cout << "releasing"<< std::endl;PyGILState_Release(_state);}private:PyGILState_STATE _state;};using namespace cv;static PyObject *failmsgp(const char *fmt, ...){char str[1000];va_list ap;va_start(ap, fmt);vsnprintf(str, sizeof(str), fmt, ap);va_end(ap);PyErr_SetString(PyExc_TypeError, str);return 0;}class NumpyAllocator : public MatAllocator{public:
#if (CV_MAJOR_VERSION < 3)NumpyAllocator(){}~NumpyAllocator() {}void allocate(int dims, const int *sizes, int type, int *&refcount,uchar *&datastart, uchar *&data, size_t *step){// PyEnsureGIL gil;int depth = CV_MAT_DEPTH(type);int cn = CV_MAT_CN(type);const int f = (int)(sizeof(size_t) / 8);int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE: depth == CV_16U  ? NPY_USHORT: depth == CV_16S  ? NPY_SHORT: depth == CV_32S  ? NPY_INT: depth == CV_32F  ? NPY_FLOAT: depth == CV_64F  ? NPY_DOUBLE: f * NPY_ULONGLONG + (f ^ 1) * NPY_UINT;int i;npy_intp _sizes[CV_MAX_DIM + 1];for (i = 0; i < dims; i++){_sizes[i] = sizes[i];}if (cn > 1){_sizes[dims++] = cn;}PyObject *o = PyArray_SimpleNew(dims, _sizes, typenum);if (!o){CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));}refcount = refcountFromPyObject(o);npy_intp *_strides = PyArray_STRIDES(o);for (i = 0; i < dims - (cn > 1); i++)step[i] = (size_t)_strides[i];datastart = data = (uchar *)PyArray_DATA(o);}void deallocate(int *refcount, uchar *, uchar *){// PyEnsureGIL gil;if (!refcount)return;PyObject *o = pyObjectFromRefcount(refcount);Py_INCREF(o);Py_DECREF(o);}
#elseNumpyAllocator(){stdAllocator = Mat::getStdAllocator();}~NumpyAllocator(){}UMatData *allocate(PyObject *o, int dims, const int *sizes, int type,size_t *step) const{UMatData *u = new UMatData(this);u->data = u->origdata = (uchar *)PyArray_DATA((PyArrayObject *)o);npy_intp *_strides = PyArray_STRIDES((PyArrayObject *)o);for (int i = 0; i < dims - 1; i++)step[i] = (size_t)_strides[i];step[dims - 1] = CV_ELEM_SIZE(type);u->size = sizes[0] * step[0];u->userdata = o;return u;}UMatData *allocate(int dims0, const int *sizes, int type, void *data,size_t *step, int flags, UMatUsageFlags usageFlags) const{if (data != 0){CV_Error(Error::StsAssert, "The data should normally be NULL!");// probably this is safe to do in such extreme casereturn stdAllocator->allocate(dims0, sizes, type, data, step, flags,usageFlags);}PyEnsureGIL gil;int depth = CV_MAT_DEPTH(type);int cn = CV_MAT_CN(type);const int f = (int)(sizeof(size_t) / 8);int typenum =depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE: depth == CV_16U  ? NPY_USHORT: depth == CV_16S  ? NPY_SHORT: depth == CV_32S  ? NPY_INT: depth == CV_32F  ? NPY_FLOAT: depth == CV_64F  ? NPY_DOUBLE: f * NPY_ULONGLONG + (f ^ 1) * NPY_UINT;int i, dims = dims0;cv::AutoBuffer<npy_intp> _sizes(dims + 1);for (i = 0; i < dims; i++)_sizes[i] = sizes[i];if (cn > 1)_sizes[dims++] = cn;PyObject *o = PyArray_SimpleNew(dims, _sizes, typenum);if (!o)CV_Error_(Error::StsError,("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));return allocate(o, dims0, sizes, type, step);}bool allocate(UMatData *u, int accessFlags,UMatUsageFlags usageFlags) const{return stdAllocator->allocate(u, accessFlags, usageFlags);}void deallocate(UMatData *u) const{if (u){PyEnsureGIL gil;PyObject *o = (PyObject *)u->userdata;Py_XDECREF(o);delete u;}}const MatAllocator *stdAllocator;
#endif};NumpyAllocator g_numpyAllocator;NDArrayConverter::NDArrayConverter() { init(); }void NDArrayConverter::init(){import_array();}cv::Mat NDArrayConverter::toMat(PyObject *o){cv::Mat m;if (!o || o == Py_None){if (!m.data)m.allocator = &g_numpyAllocator;}if (!PyArray_Check(o)){failmsg("toMat: Object is not a numpy array");}int typenum = PyArray_TYPE(o);int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE                     ? CV_8S: typenum == NPY_USHORT                     ? CV_16U: typenum == NPY_SHORT                      ? CV_16S: typenum == NPY_INT || typenum == NPY_LONG ? CV_32S: typenum == NPY_FLOAT                      ? CV_32F: typenum == NPY_DOUBLE                     ? CV_64F: -1;if (type < 0){failmsg("toMat: Data type = %d is not supported", typenum);}int ndims = PyArray_NDIM(o);if (ndims >= CV_MAX_DIM){failmsg("toMat: Dimensionality (=%d) is too high", ndims);}int size[CV_MAX_DIM + 1];size_t step[CV_MAX_DIM + 1], elemsize = CV_ELEM_SIZE1(type);const npy_intp *_sizes = PyArray_DIMS(o);const npy_intp *_strides = PyArray_STRIDES(o);bool transposed = false;for (int i = 0; i < ndims; i++){size[i] = (int)_sizes[i];step[i] = (size_t)_strides[i];}if (ndims == 0 || step[ndims - 1] > elemsize){size[ndims] = 1;step[ndims] = elemsize;ndims++;}if (ndims >= 2 && step[0] < step[1]){std::swap(size[0], size[1]);std::swap(step[0], step[1]);transposed = true;}if (ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize * size[2]){ndims--;type |= CV_MAKETYPE(0, size[2]);}if (ndims > 2){failmsg("toMat: Object has more than 2 dimensions");}m = Mat(ndims, size, type, PyArray_DATA(o), step);if (m.data){
#if (CV_MAJOR_VERSION < 3)m.refcount = refcountFromPyObject(o);m.addref(); // protect the original numpy array from deallocation// (since Mat destructor will decrement the reference counter)
#elsem.u = g_numpyAllocator.allocate(o, ndims, size, type, step);m.addref();Py_INCREF(o);// m.u->refcount = *refcountFromPyObject(o);
#endif};m.allocator = &g_numpyAllocator;if (transposed){Mat tmp;tmp.allocator = &g_numpyAllocator;transpose(m, tmp);m = tmp;}return m;}PyObject *NDArrayConverter::toNDArray(const cv::Mat &m){if (!m.data)Py_RETURN_NONE;Mat temp;Mat *p = (Mat *)&m;
#if (CV_MAJOR_VERSION < 3)if (!p->refcount || p->allocator != &g_numpyAllocator){temp.allocator = &g_numpyAllocator;m.copyTo(temp);p = &temp;}p->addref();return pyObjectFromRefcount(p->refcount);
#elseif (!p->u || p->allocator != &g_numpyAllocator){temp.allocator = &g_numpyAllocator;m.copyTo(temp);p = &temp;}// p->addref();// return pyObjectFromRefcount(&p->u->refcount);PyObject *o = (PyObject *)p->u->userdata;Py_INCREF(o);return o;
#endif}
}

?終端執行以下命令進行編譯:

conda activate MaskRCNN
cd DynaSLAM
chmod +x build.sh
./build.sh

若報出以下錯誤:?

?

終端執行以下命令安裝:?

sudo apt-get install python2.7-dev

若還有其他的錯誤,按照對應的包即可解決。?

安裝完后,重新編譯即可。重新編譯時把前一次編譯生成的?build文件刪除。

五、DynaSLAM運行

運行時需要先激活創建的虛擬環境:

conda activate MaskRCNN

創建dataset文件夾,將數據集文件rgbd_dataset_freiburg3_walking_xyz放在dataset下,如果不知道如何生成associations.txt關聯文件,以下這兩篇均有提到:

使用evo工具/rgbd_benchmark_tools評估TUM RGB-D數據集_orb-slam3 評測工具evo-CSDN博客

?YOLO_ORB_SLAM3編譯運行_yolo-orb-slam3-CSDN博客

在DynaSLAM目錄下打開終端,執行以下命令:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt ./Examples/RGB-D/TUM3.yaml ./dataset/rgbd_dataset_freiburg3_walking_xyz/ ./dataset/rgbd_dataset_freiburg3_walking_xyz/associations.txt ./dataset/mask ./dataset/output

如果運行時報以下錯誤:Light Tracking not working because Tracking is not initialized...

Geometry not working.

可以將DynaSLAM/Examples/RGB-D/TUM3.yaml文件里的ORBextractor.nFeatures參數值由1000改為3000。或再檢查一下需要修改的文件內容有沒有全部修改。

運行成功畫面如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73327.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73327.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

X86 RouterOS 7.18 設置筆記三:防火墻設置(IPV4)

X86 j4125 4網口小主機折騰筆記五&#xff1a;PVE安裝ROS RouterOS X86 RouterOS 7.18 設置筆記一&#xff1a;基礎設置 X86 RouterOS 7.18 設置筆記二&#xff1a;網絡基礎設置(IPV4) X86 RouterOS 7.18 設置筆記三&#xff1a;防火墻設置(IPV4) X86 RouterOS 7.18 設置筆記四…

從 YOLOv1 到 YOLOv2:目標檢測的進化之路

引言 你有沒有想過&#xff0c;當你用手機拍一張照片&#xff0c;里面的人、車、狗是怎么被自動識別出來的&#xff1f;這背后靠的就是目標檢測技術。目標檢測是計算機視覺中的一個重要領域&#xff0c;它不僅要回答“圖片里有什么”&#xff0c;還要告訴你“這些東西在哪里”…

數據的存儲---整型、浮點型

目錄 一、整型在內存中的存儲 1. 原碼、反碼、補碼 2. 大端與小端 二、浮點數在內存中的存儲 1.浮點數的存 2. 浮點數的取 3. 題目解析 一個變量的創建需要在內存中開辟空間&#xff0c;而開辟的空間大小是由數據類型決定的。下面我們就來討論一下整型、浮點型在內存中的…

Java 大視界 -- Java 大數據在智能教育虛擬實驗室建設與實驗數據分析中的應用(132)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

??Jolt -- 通過JSON配置來處理復雜數據轉換的工具

簡介&#xff1a;一個能夠通過JSON配置&#xff08;特定的語法&#xff09;來處理復雜數據轉換的工具。 比如將API響應轉換為內部系統所需的格式&#xff0c;或者處理來自不同來源的數據結構差異。例如&#xff0c;將嵌套的JSON結構扁平化&#xff0c;或者重命名字段&#xff0…

47.全排列 II

47.全排列 II 力扣題目鏈接 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出…

centos沒有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

04 1個路由器配置一個子網的dhcp服務

前言 這是最近一個朋友的 ensp 相關的問題, 這里來大致了解一下 ensp, 計算機網絡拓撲 相關基礎知識 這里一系列文章, 主要是參照了這位博主的 ensp 專欄 這里 我只是做了一個記錄, 自己實際操作了一遍, 增強了一些 自己的理解 當然 這里僅僅是一個 簡單的示例, 實際場景…

網絡空間安全(31)安全巡檢

一、定義與目的 定義&#xff1a; 安全巡檢是指由專業人員或特定部門負責&#xff0c;對各類設施、設備、環境等進行全面或重點檢查&#xff0c;及時發現潛在的安全隱患或問題。 目的&#xff1a; 預防事故發生&#xff1a;通過定期的安全巡檢&#xff0c;及時發現并解決潛在的…

在IGH ethercat主站中Domain和Entry之間的關系

在 IGH EtherCAT 主站中&#xff0c;“domain”&#xff08;域&#xff09;和 “entry”&#xff08;條目&#xff09;存在著緊密的關系&#xff0c;具體如下&#xff1a; 數據組織與管理方面&#xff1a;“domain” 是 EtherCAT 主站中用于管理和處理從站配置、數據映射和數據…

信息學奧賽一本通 1449:【例題2】魔板

題目 1449&#xff1a;【例題2】魔板 分析 首先注意&#xff1a;輸入是按順時針給出的&#xff0c;但我們處理時需要按正常順序排&#xff0c;可以用以下代碼讀入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…

Unity開發的抖音小游戲接入抖音開放平臺中的流量主(抖音小游戲接入廣告)

前言:作者在進行小游戲審核版本的過程中,碰到了下列問題,所以對這個抖音小游戲接入廣告研究了下。 還有就是作者的TTSDK版本號是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的兩個版本號保持一致,因為我發現TTSDK舊版的很多函數在新版中就已經無法正常使用了,必…

【xv6操作系統】系統調用與traps機制解析及實驗設計

【xv6操作系統】系統調用與traps機制解析及實驗設計 系統調用相關理論系統調用追溯系統調用實驗設計Sysinfo&#x1f6a9;系統調用總結&#xff08;結合trap機制&#xff09; traptrap機制trap代碼流程Backtrace實驗alarm實驗 系統調用 相關理論 隔離性&#xff08;isolation)…

Docker文件夾上傳秘籍Windows下的高效傳輸之道

哈嘍,大家好,我是木頭左! 一、理解Docker容器與Windows文件系統的差異 在深入探討如何從 Windows 系統將文件夾及遞歸文件夾和文件上傳到 Docker 容器之前,有必要先明晰 Docker 容器與 Windows 文件系統之間存在的本質差異。 (一)Docker 容器的文件系統特性 Docker 容…

08 | 實現版本號打印功能

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

在微信小程序或前端開發中,picker 和 select 都是用戶交互中用于選擇的組件,但它們在功能、設計和使用場景上有一定的區別

在微信小程序或前端開發中&#xff0c;picker 和 select 都是用戶交互中用于選擇的組件&#xff0c;但它們在功能、設計和使用場景上有一定的區別。 1. picker 的特點 描述&#xff1a; picker 是微信小程序中的原生組件&#xff0c;通常用于選擇單項或多項值&#xff0c;如時…

PMP 證書的含金量怎么樣?

pmp含金量&#xff0c;這是一個很有爭議的話題&#xff0c;我根據我以往的面試跟工作經歷對 PMP 也有幾點看法&#xff0c;想跟大家聊一聊。 一、如果真心想做項目管理&#xff0c;PMP 一定要去考一個 現在的早已不是憑經驗做項目的時代了&#xff0c;各大企業都追求專業式的…

Springboot連接neo4j

?一、Spring Data Neo4j 核心知識體系 ?1. 核心概念 ?圖數據庫特性&#xff1a; 數據以 ?節點&#xff08;Node&#xff09;? 和 ?關系&#xff08;Relationship&#xff09;? 形式存儲&#xff0c;支持屬性&#xff08;Property&#xff09;。查詢語言&#xff1a;Cyp…

我與DeepSeek讀《大型網站技術架構》- 大型網站架構技術一覽與Web開發技術發展歷程

文章目錄 大型網站架構技術一覽1. 前端架構2. 應用層架構3. 服務層架構4. 存儲層架構5. 后臺架構6. 數據采集與監控7. 安全架構8. 數據中心機房架構 Web開發技術發展歷程一、靜態HTML階段二、CGI腳本模式階段三、服務器頁面模式階段 大型網站架構技術一覽 1. 前端架構 瀏覽器…

Python數據類型進階——詳解

—— 小 峰 編 程 目錄 1.整型 1.1 定義 1.2 獨有功能 1.3 公共功能 1.4 轉換 1.5 其他 1.5.1 長整型 1.5.2 地板除(除法&#xff09; 2. 布爾類型 2.1 定義 2.2 獨有功能 2.3 公共功能 2.4 轉換 2.5 其他 做條件自動轉換 3.字符串類型 3.1 定義 3.2 獨有功能…