快速入门

登陆方式

工作站只允许已经授权的用户进行登录。在从管理员处获得你的账号名和初始密码后, Linux 或 Mac 用户可直接从命令行登录我们的工作站,使用 ssh 命令即可

ssh username@ip_addressusername为管理员给你的账号,ip_address为远程主机的地址
比如:ssh zhangsan@172.18.121.14

对于windows用户,可以使用PuTTY,secureCRT,mobaterm等SSH客户端工具。就个人而言,mobaterm官网地址使用最顺手。

mobaterm使用示例

更多使用可以参考mobaterm使用

SLURM脚本---作业调度

SLURM 资源管理系统的管理对象包括:节点,分区,作业和作业步。

  • 节点:Node

    • 即指计算节点
    • 包含处理器、内存、磁盘空间等资源
    • 具有空闲、分配、故障等状态
    • 使用节点名字标识
  • 分区:Partition

    • 节点的逻辑分组
    • 提供一种管理机制,可设置资源限制、访问权限、优先级等
    • 分区可重叠,提供类似于队列的功能
    • 使用分区名字标识
  • 作业:Job

    • 一次资源分配
    • 位于一个分区中,作业不能跨分区
    • 排队调度后分配资源运行
    • 通过作业 ID 标识
  • 作业步:Jobstep

    • 通过 srun 进行的任务加载
    • 作业步可只使用作业中的部分节点
    • 一个作业可包含多个作业步,可并发运行
    • 在作业内通过作业步 ID 标识

三种模式:srun(交互模式)sbatch(批处理模式) salloc(分配模式)

名为 bcm的主机仅仅为用户提供了登录操作的 平台,但程序的运行需要交给它背后的计算节点们完成。那么如何告诉工作站来运行我们的程序? 我们需要使用作业调度系统 SLURM,它给我们提供了若干运行程序的方式,在本章节 里我们简要介绍最常用的方式:提交 SLURM 作业脚本的批处理方式

man slurm

sacct(1), sacctmgr(1), salloc(1)分配模式,  sattach(1),  sbatch(1)批处理模式运行,  sbcast(1),  scan‐cel(1),  scontrol(1),  sinfo(1),  smap(1),  squeue(1),  sreport(1),  srun(1)交互模式,sshare(1), sstat(1), strigger(1), sview(1), slurm.conf(5),  slurmdbd.conf(5),slurmctld(8), slurmd(8), slurmdbd(8), slurmstepd(8), spank(8)

上面命令举例说明:

srun将任务分配到运行节点中

srun -n 8 -c 1 --gres=gpu:2 --pty bash
参数说明,-n 任务个数
“ --gres = gpu:2,mic:1”,“-gres = gpu:kepler:2”和“ --gres = help”。 注意:通用资源,显式设置--gres的值以指定零每个通用资源的计数或设置为“ --gres = none”或设置为对应数量
-c num 使用cpu数量
--pty bash 进入该节点的终端
-w node02 进入指定节点

squeue查看全部用户任务情况

sacct -S MMDD则会输出从 MM 月 DD 日起的所有历史作业

sacct -S 0916JobID    JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
2635               bash       defq      users          8     FAILED      6:0
2636               bash       defq      users          8  COMPLETED      0:0

sinfo查看节点情况

defq*        up   infinite      1   drng node05
defq*        up   infinite      3    mix node[01,06-07]
defq*        up   infinite      2   idle node[02-03]idle表示空闲,mix表示有任务在跑,但有空闲智源,drng表示无

scontrol show jobs 显示作业具体信息

JobId=962 JobName=bashUserId=zhangtao(1010) GroupId=zhangtao(1010) MCS_label=N/APriority=4294901079 Nice=0 Account=users QOS=normalJobState=RUNNING Reason=None Dependency=(null)Requeue=1 Restarts=0 BatchFlag=0 Reboot=0 ExitCode=0:0RunTime=96-11:29:28 TimeLimit=UNLIMITED TimeMin=N/ASubmitTime=2020-05-14T09:07:43 EligibleTime=2020-05-14T09:07:43AccrueTime=UnknownStartTime=2020-05-14T09:07:43 EndTime=Unknown Deadline=N/APreemptTime=None SuspendTime=None SecsPreSuspend=0LastSchedEval=2020-05-14T09:07:43Partition=defq AllocNode:Sid=bcm:10241ReqNodeList=(null) ExcNodeList=(null)NodeList=node05BatchHost=node05NumNodes=1 NumCPUs=8 NumTasks=8 CPUs/Task=1 ReqB:S:C:T=0:0:*:*TRES=cpu=8,node=1,billing=8,gres/gpu=2Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0Features=(null) DelayBoot=00:00:00OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)Command=bashWorkDir=/home/zhangtao/zy/CFFPower=TresPerNode=gpu:2

总结起来,在工作站上进行运算的步骤如下:

  • 登录主节点,准备程序和数据。

  • 编写 SLURM 脚本/进入交互模式,设置作业属性(例如占用的资源,最长运行时间)。

  • 检查可用资源,提交作业脚本,检查任务状态(使用 squeue 和 sinfo)。

  • 等待运行结束,验收结果。

配置服务器个人运行环境

为了满足同学们计算任务的需求,服务器中安装了各种版本的软件。大家可在同一软件的不同版本之间切换,也可以在同一功能的不同软件之间切换,以此来选择最合适的编程环境和运行环境。使用系统命令 module 可以快速地达到这一效果。

module(可使用module就可弹出来)

Loading / Unloading commands:add | load      modulefile [...]  Load modulefile(s)rm | unload     modulefile [...]  Remove modulefile(s)purge                             Unload all loaded modulefilesreload | refresh                  Unload then load all loaded modulefilesswitch | swap   [mod1] mod2       Unload mod1 and load mod2Listing / Searching commands:list            [-t|-l]           List loaded modulesavail   [-d|-L] [-t|-l] [mod ...] List all or matching available modulesaliases                           List all module aliaseswhatis          [modulefile ...]  Print whatis information of modulefile(s)apropos | keyword | search  str   Search all name and whatis containing stris-loaded       [modulefile ...]  Test if any of the modulefile(s) are loadedis-avail        modulefile [...]  Is any of the modulefile(s) availableinfo-loaded     modulefile        Get full name of matching loaded module(s)Collection of modules handling commands:save            [collection|file] Save current module list to collectionrestore         [collection|file] Restore module list from collection or filesaverm          [collection]      Remove saved collectionsaveshow        [collection|file] Display information about collection
savelist        [-t|-l]           List all saved collectionsis-saved        [collection ...]  Test if any of the collection(s) existsShell's initialization files handling commands:initlist                          List all modules loaded from init fileinitadd         modulefile [...]  Add modulefile to shell init fileinitrm          modulefile [...]  Remove modulefile from shell init fileinitprepend     modulefile [...]  Add to beginning of list in init fileinitswitch      mod1 mod2         Switch mod1 with mod2 from init fileinitclear                         Clear all modulefiles from init fileEnvironment direct handling commands:prepend-path [-d c] var val [...] Prepend value to environment variableappend-path [-d c] var val [...]  Append value to environment variable

module avail

blacs/openmpi/gcc/64/1.1patch03    intel-tbb-oss/ia32/2019_20191006oss
blas/gcc/64/3.8.0                  intel-tbb-oss/intel64/2019_20191006oss
bonnie++/1.97.3                    iozone/3_482
cm-pmix3/3.1.4                     keras-py36-cuda10.1-gcc/2.3.1
cuda10.1/blas/10.1.243             lapack/gcc/64/3.8.0
cuda10.1/fft/10.1.243              ml-pythondeps-py36-cuda10.1-gcc/3.0.0
cuda10.1/nsight/10.1.243           mpich/ge/gcc/64/3.3
cuda10.1/profiler/10.1.243         mvapich2/gcc/64/2.3
cuda10.1/toolkit/10.1.243          nccl2-cuda10.1-gcc/2.4.8
cudnn/7.5.0                        netcdf/gcc/64/4.6.1
default-environment                netperf/2.7.0
fftw2/openmpi/gcc/64/double/2.1.5  openblas/dynamic(default)
fftw2/openmpi/gcc/64/float/2.1.5   openblas/dynamic/0.2.20
fftw3/openmpi/gcc/64/3.3.8         opencv3-py36-cuda10.1-gcc/3.4.7
gcc5/5.5.0                         openmpi/cuda/64/3.1.4
gdb/8.2                            openmpi/gcc/64/1.10.7
globalarrays/openmpi/gcc/64/5.7    protobuf3-gcc/3.7.1
hdf5/1.10.1                        pytorch-py36-cuda10.1-gcc/1.3.0
hdf5_18/1.8.20                     scalapack/openmpi/gcc/64/2.0.2
hpcx/2.4.0                         sge/2011.11p1
hpl/2.2                            slurm/18.08.8
hwloc/1.11.11                      tensorflow-py36-cuda10.1-gcc/1.14.0

可以看出集群自带的核心模块数量,可以使用module add+模块名加载或者module initadd+模块名加载(初始化加载)

加载的模块都在~/.bashrc中可以看到

module list查看当前加载的模块

Currently Loaded Modulefiles:
 1) slurm/18.08.8   2) cuda10.1/toolkit/10.1.243

删除与替换 module

如果要把某个模块从系统环境中删掉,需要使用

$ module remove <module name>
如果要删除全部的模块,可以直接使用$ module purge
一个模块删除之后,你将无法直接使用与之相关的命令。对应软件的执行目录无法被直接访问,或者是还原成系统默认的版本。有的时候,模块之间会有所冲突,你无法在同一时间同时加载两个模块。例如同一软件的不同版本,或者是接口相同的不同软件。当你载入其中一个后,再载入另一个就会出错

使用conda创建属于你自己的虚拟环境

conda info -e查看有哪些虚拟环境

conda activate +虚拟环境名称激活虚拟环境

创建虚拟环境并制定python版本
conda create -n your_env_name python=X.X

conda删除虚拟环境
conda remove -n tf2 --all

使用图形化界面

通常情况下,在集群中我们都在命令行中操作。但是有时我们需要打开某些软件的图形 界面,此时我们需要借助 X11 转发

注意:在网络不好的时候请谨慎使用此功能,此时经过 X11 转发的界面操作起来有 明显卡顿。尽量在校内有线网或信号较好的无线网的环境下使用

Linux

在 Linux 环境中启用 X11 转发非常简单,只需要在登录时加入 -X 参数。

xxk@laptop: $ ssh -X user@server_ip

此后登录集群可以直接输入命令开启图形界面的程序。例如

matlab
MATLAB is selecting SOFTWARE OPENGL rendering.firefox
Failed to open connection to "session" message bus: Using X11 for dbus-daemon autolaunch was disabled at compile time, set your DBUS_SESSION_BUS_ADDRESS instead
Running without a11y support!

Windows

使用 MobaXterm

推荐使用 MobaXterm 客户端进行连接。官网地址>>

在默认情况下 MobaXterm 会自动打开 X11 的转发,因此只需正常登录然后直接输入 打开软件的命令即可

传输文件

我们经常会将我们本地的一些文件上传到工作站上,或是从工作站下载文件。这些工作用命令行可以轻松完成。

建议在传输文件之前对要传输的文件进行打包,以便有更高的传输效率。在 Linux 下可以使用 tar 工具进行打包。

$ tar -cjf archive.tar.bz2 folder1/ folder2/

上面的命令是将两个文件夹下的所有文件打包到 archive.tar.bz2 文件中,并进行一定压缩。在工作站打包数据建议使用这个命令。

Windows 用户可以使用 WinRAR 或者 Zip 进行打包。

在服务器中,相应的解包命令为

$ tar -xjf archive.tar.bz2
$ unzip archive.zip
$ unrar e archive.rar

Linux 或 Mac

使用 scp

在命令行中可以使用 scp 命令进行传输文件。这是依赖于 SSH 的一个命令,如果已经配置了 SSH 无密码 登录那么每次复制将不必输入密码。否则,每次传输文件都需要输入密码。

以下命令均在本地计算机中执行。

$ scp file username@ip_address:
$ scp file username@ip_address:Documents/

上面的第一条命令即可将 file 传输到工作站相应账号的 HOME 文件夹下,如果想要指定目录,可以直接写 相对于 HOME 文件夹的路径,例如第二条命令。

如果要使用 scp 命令复制文件夹,需要加上 -r 参数。

$ scp -r folder username@ip_address:

从服务器传输文件到本地只需将两个参数的位置调换。

$ scp username@ip_address:file .

在这里我们使用 . 来表示本地的当前路径。

使用 rsync

rsync 是强大的同步文件的命令行工具,它比 scp 更加智能。rsync 支持从本地到本地, 从本地到服务器,从服务器到本地的文件传输。使用 rsync 访问服务器依赖于 SSH 的 配置。下面的例子假定用户已经配置了 SSH 无密码登录。

传输文件

rsync 基本的传输文件命令为

# 下载文件
rsync [OPTION...] [USER@]HOST:SRC... [DEST]# 上传文件
rsync [OPTION...] SRC... [USER@]HOST:DEST

其中 SRC 表示来源的路径,DEST 表示目标路径。由于要访问服务器,因此当来源或 目标不是本地时,需要指定服务器的用户和主机名。用户和主机名的指定可以直接使用 SSH 的 .ssh/config 表示的格式。

因此上传可用

# 假设已经配好了 SSH config,server 表示的主机有意义
rsync -avz folder server:# 如果没有配置 SSH config
rsync -avz folder user@server_ip:

其中的三个选项,a 表示归档模式,在这个模式下传输将递归地进行,并保留文件的 权限信息;v 表示将中间信息输出;z 表示在传输过程中进行压缩来减少传输量。 下载只需要将 SRC 和 DEST 的地位对换。

rsync 的优势在于,每次在传输之前会对文件进行比较,只会传输那些真正改变的文件, 在多数情况下会极大减小传输量。下面是一个例子。

[liuhy@laptop ~]$ ls test/
total 0                        # test 文件夹只有三个文件
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 1.txt
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 2.txt
-rw-rw-r--. 1 liuhy liuhy 0 Jul  1 15:25 3.txt# 使用 rsync 上传
[liuhy@laptop ~]$ rsync -avz test server:
sending incremental file list
test/
test/1.txt
test/2.txt
test/3.txtsent 213 bytes  received 80 bytes  195.33 bytes/sec
total size is 0  speedup is 0.00# 创建新文件 4.txt
[liuhy@laptop ~]$ echo "hello world" >> test/4.txt
[liuhy@laptop ~]$ rsync -avz test server:
sending incremental file list
test/
test/4.txt                    # <- 只上传了这一个文件!sent 184 bytes  received 42 bytes  150.67 bytes/sec
total size is 12  speedup is 0.05

同步时删除

使用 rsync 上传文件时,如果 SRC 的文件比 DEST 的文件要少时,rsync 默认不会去 处理 DEST 多出来的文件。如果要实现真的的完全同步,即删除 DEST 多出来的文件,需要 给 rsync 加上 --delete 选项。

接着上面的例子,在本地删除 1.txt,并告诉服务器也要删除这个文件

[liuhy@laptop ~]$ rm test/1.txt       # 删除 1.txt
[liuhy@laptop ~]$ rsync -avz --delete test server:
sending incremental file list
test/
deleting test/1.txt                   # <- 在做删除操作!sent 113 bytes  received 37 bytes  100.00 bytes/sec
total size is 12  speedup is 0.08

断点续传

rsync 的同步算法只能针对整个的文件。默认情况下,如果文件传输不完整,rsync 会 扔掉这些文件,在下次传输的时候重新处理。当要传输单个大文件时,由于网络等多方面 原因,传输很难一次完成,这时候就需要断点续传功能。

# 使用 rsync 指定 --partial 选项来保留传输未完成的文件
[liuhy@laptop Downloads]$ rsync -avz --partial --progress gcc-7.3.0.tar.xz server:
sending incremental file list
gcc-7.3.0.tar.xz36,208,640  57%   11.43MB/s    0:00:02  ^CKilled by signal 2.# ^ 使用 Ctrl+C 强制终止
rsync error: unexplained error (code 255) at rsync.c(638) [sender=3.1.2]
# 指定 --append 选项来传输未完成的文件
[liuhy@laptop Downloads]$ rsync -avz --append --progress gcc-7.3.0.tar.xz server:
sending incremental file list
gcc-7.3.0.tar.xz62,462,388 100%   11.71MB/s    0:00:02 (xfr#1, to-chk=0/1)sent 26,481,503 bytes  received 34 bytes  7,566,153.43 bytes/sec
total size is 62,462,388  speedup is 2.36# ^ 注意这是从 57% 开始传的,sent 和 total size 不一样。

将工作站目录挂载到本地

如果不想使用 scp 命令,可以利用 sshfs 将服务器的 HOME 目录挂载到本地。这并不会消耗你本地的存储空间。

首先,使用如下命令安装 sshfs 应用

$ sudo apt install sshfs

其中 apt 是 ubuntu/debian 的安装包管理器,如果你在使用其它 Linux 发行版,请使用相应的安装包管理器进行安装。

安装完毕后,在你喜欢的本地目录下建立挂载点,为了方便,可以选择个人的本地 HOME 文件夹。

$ mkdir workstation

其中 workstation 为挂载点的名称,可以随意填写。

最后,将服务器端的 HOME 文件夹挂载到本地

$ sshfs username@ip_address: workstation

其中 username 为你用户名,ip_address为服务器的地址。上面命令的最后一个 workstation 表示将服务器文件夹挂载到刚创建的挂载点 workstation 上。使用时请将其替换成你实际创建挂载点的路径。

挂载成功后,你可以从挂载点处(在本说明中为本地 HOME 文件夹下的 workstation 目录)直接访问你的服务器远端的目录,非常方便。

当你不需要使用服务器文件时,需要将服务器挂载目录卸载。命令为

$ fusermount -u workstation

其中 workstation 为你事先创建好的挂载点。卸载前请确保本地没有程序在使用远程目录下的文件。

让代码在后台运行

第一种 nohup

nohup python train.py

默认会生成nohup.out的日志文件

第二种 screen

可以简单的认为用这个命令你可以为不同的任务开不同的窗口,这个窗口之间是可以切换的,同时,窗口和你的会话连接基本上没有任何区别,这样你可以在开一个连接的时候同时干多件事情,并且在终端看得到运行过程的同时而不会由于断网而导致代码停止运行。其常用命令如下:

screen -S name #创建一个窗口,并且为这个窗口命名
快捷键Ctrl+a+D断开这个窗口的连接而回到连接会话界面screen -r name #进去那么窗口kill +pid 或者 进入窗口exit可以完全退出窗口

第三种 Tmux : 强烈推荐

很多开发者经常登录到服务器都遇到这些尴尬:

  • 想同时打开多个目录不得不开很多终端标签来回切换
  • 开了一个 vim 窗口之后,想切到其他目录不得不重新打开个一个终端窗口 ssh 到服务器
  • 运行一个脚本,服务器断掉失联之后当前进程被服务器给无情地杀掉,不得不用 nohup 等方式让脚本在后台跑
  • 每次 ssh 到服务器都要重新切到工作目录,打开多个进程等,之前的工作记录会丢失
  • 鼠标是个伟大的发明,但不幸的是,开发者使用终端的时候在鼠标和键盘之间来回移动和定位,不仅浪费时间,还可能会影响你的思

Tmux 是一个终端复用工具,用于在一个终端窗口中运行多个终端会话。

mux 中有几个重要概念:

  • 会话(session): 建立一个 tmux 工作区会话,会话可以长期驻留,重新连接服务器不会丢失,我们只需重新 tmux attach 到之前的工作区就可以恢复会话,这样你的工作区就可以常驻服务器了,非常方便
  • 窗口(window): 容纳多个窗格
  • 窗格(pane): 可以在窗口中分成多个窗格,每个窗格都可以运行各种命令

这种方式最好!在集群中就算退出,深度学习任务还可以在后台继续跑

查询所有会话(Session)
在命令行输入下列命令查询当前所有会话。tmux ls创建会话(Session)
tmux new -s session-name断开会话(Session)
使用下列命令断开当前会话(断开会话并不影响会话中运行的程序,断开后还可以重新连接)tmux detach或者使用tmux中的快捷键Ctrl+b d(即先使用Ctrl+b快捷键前缀,然后再按d)重新连接会话(Session)
在命令行输入tmux a即可快速连接第一个所有会话中的第一个。tmux a
或者通过会话名连接该一个会话tmux a -t session-name
关闭会话
通过下列命令关闭会话后,会话中的程序也会全部关闭。tmux kill-session -t session-name
当然你也可以通过直接按Ctrl+d关闭会话、窗口或窗格。tmux中的快捷键参考
注意以下快捷键适用于tmux会话中,使用前皆需要按下快捷键前缀Ctrl+b。帮助
? 获取帮助信息
会话(Session)管理
s 列出所有会话
$ 重命名当前的会话
d 断开当前的会话
窗口(Window)管理
c 创建一个新窗口
, 重命名当前窗口
w 列出所有窗口
% 水平分割窗口
“ 竖直分割窗口
n 选择下一个窗口
p 选择上一个窗口
09 选择09对应的窗口
窗格(Pane)管理
% 创建一个水平窗格
“ 创建一个竖直窗格
q 显示窗格的编号
o 在窗格间切换
} 与下一个窗格交换位置
{ 与上一个窗格交换位置
! 在新窗口中显示当前窗格
x 关闭当前窗格

工作站(集群)使用说明及相关工具相关推荐

  1. UltraLAB基因测序、生物信息分析平台高性能工作站/集群最新硬件配置方案

    新冠疫情席卷全球,对于人类而言是前所未有的挑战,迅速找到未知病毒的发源地及特效治疗方案,需要海量检测.基因测序.生物信息分析等研究,对计算机计算能力要求至关重要. 西安坤隆计算机科技有限公司自2020 ...

  2. 无人机航测倾斜摄影测量内业工作站集群的搭建方法与操作步骤详解:以CC软件(Context Capture)为例

    引言 现阶段,无人机航测作业主要分为外业和内业两个方面.而老话说得好,工欲善其事,必先利其器,倾斜摄影测量外业数据采集工作需要熟练稳重的飞手,搭配上安全稳定的飞机和性能卓越.工作稳定的相机.同样地,内 ...

  3. 集群的可扩展性及其分布式体系结构(1)

    前言 "话说天下大势,分久必合,合久必分"高端计算的体系结构发展正是遵循着这样一个规律.从金融.电信等大行业的数据集中处理到分布计算处理,再到二次集中和海量计算,趋势和应用显然是在 ...

  4. 并行计算与集群技术(2)

    云计算基础架构--集群技术 集群的基本概念 集群是一组独立的计算机(结点)的集合体,结点间通过高性能网络相连接,各结点除了作为一个单一的计算资源供用户使用外,还可以协同工作,并表示为一个单一的.集中的 ...

  5. Docker——docker-registry私有仓库集群构建

    摘要 随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库.目前常用的两种仓库:公共仓库和私有仓库.最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传 ...

  6. ANSYS最快最完美工作站与集群配置方案2019

    NSYS是美国ANSYS公司研制的大型通用有限元分析(FEA)软件,在核工业.铁道.石油化工.航空航天.机械制造.能源.汽车交通.国防军工.电子.土木工程.造船.生物医学.轻工.地矿.水利.日用家电等 ...

  7. 2019年最快电磁仿真HFSS计算工作站与多机集群硬件配置方案

    ANSYS HFSS是目前市场客户最多的一款3D电磁(EM)仿真软件,用于设计和仿真高频电子产品,如天线,天线阵列,射频或微波元件,高速互连,滤波器,连接器,IC封装和印刷电路板.全球工程师使用ANS ...

  8. 网站站群相关工具001---WebPlus集群平台

    之前从来没接触过webplus这个集群平台,偶然的机会才听说,后来百度看了一下,网上能百度出来的无非乎是这个平台的地址和操作手册,但是目前为止都未曾见过这个平台的百科百科,哪怕是知道上的问题都很少见. ...

  9. 宝贝鱼(CshBBrain)集群配置使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 最近有不少朋友在询问宝贝鱼(CshBBrain)集群的问题,说集群老不成功,本篇文章主要就是解答这个问题的. 首先介绍下宝贝鱼 ...

最新文章

  1. Ajax实现无刷新三联动下拉框
  2. 网工路由基础(4)EIGRP协议
  3. 舍本求末的运维自动化技术热潮
  4. Objective C中@protected等关键字概述
  5. APP技巧:微信中这6个设置建议关闭,可以防止个人信息或将全暴露,赶快看一看吧!...
  6. 六.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---4.laserMapping.cpp--后端建图和帧位姿精估计(优化)
  7. Linux关键字查询
  8. 《30天自制操作系统》03_day_学习笔记
  9. Linux系统日志分析与管理
  10. 利用scrapy爬取58同城租房信息
  11. 云原生 | Docker:基础篇
  12. 送外卖优先级_如何在恶劣天气让外卖小哥优先送您的订单?
  13. vue3+heightchart实现3D饼图,echarts3D饼图,3D饼图引导线实现
  14. Connor学Android - JNI和NDK编程
  15. 程序人生--2003年(21)
  16. STM32+ULN2003驱动步进电机
  17. 通用能力-数量关系专项练习(2)
  18. 小程序中image标签的mode属性,防止图片调整宽高而导致拉伸的问题
  19. [词根词缀]leg/lega/lev/liber/lig词根由来
  20. RuntimeError: Failed to init API, possibly an invalid tessdata path: C:\User

热门文章

  1. 海外SDK之----------苹果支付
  2. 为RMI实现类Jini的发现机制
  3. Diffusion Models从入门到放弃:必读的10篇经典论文
  4. win10蓝牙功能不见了_Win10 2004更新了什么?新功能新特性汇总
  5. C#上位机(数据校验发送指令来控制下位机)
  6. python turtle画彩虹的代码_python绘制彩虹图
  7. 计算机主机只有通电的情况下,台式联想电脑不通电怎么办
  8. 全面了解风控指标体系
  9. 文本分割之垂直投影法基于OpenCV(python)的实现
  10. win11动手学深度学习安装过程(GPU版)( CUDA Anaconda Mxnet )