当前位置:网站首页>【冷冻电镜】RELION4.0之subtomogram对位功能源码分析(自用)
【冷冻电镜】RELION4.0之subtomogram对位功能源码分析(自用)
2022-07-29 05:27:00 【吃吃今天努力学习了吗】
源码地址
relion源码指路(注意选择4.0版本的branch)。
对 subtomo averaging 我也还有很多疑惑,还在摸索期,如有任何问题,欢迎大家私信交流,祝大家科研顺利~
What’s NEW in RELION 4.0 ?
- subtomogram averaging 新方法:
Jasenko Zivanov 和 Joaquin (Kino) Oton 在低温电子断层扫描中实施了一种新的平均方法,它用伪子断层图的概念代替了标准的子断层图。 新方法可以更好地加权在 relion_refine 中构成倾斜系列的单个 2D 图像,并且现在还为断层扫描数据实施了贝叶斯抛光和 CTF 细化的单颗粒概念。 关于这项工作还待发表。 - VDAM 细化算法:
Dari Kimanius 实现了一种新的梯度驱动算法,该算法具有隐式正则化,称为具有自适应矩的可变度量梯度下降 (VDAM)。 VDAM 算法取代了先前实现的用于初始模型生成的 SAGD 算法,并使 2D 和 3D 分类更快,尤其是对于大型数据集。
为了绕开cryoSPARC的SGD短发专利,RELION4.0开发了Variable-metric Gradient Descent with Adaptive Moments(VDAM),能够加快二维分了速度并获得更均匀的分类结果。 - 自动 2D 类选择:
Liyi Dong 开发了一种自动选择 2D 类平均图像的新算法,该算法将从 RELION 的 2D 分类元数据中提取的特征与作用于 2D 类平均值本身的卷积神经网络相结合。对应的程序relion_class_ranker
可以通过Subset selection任务调用。
以前2D分类的自动筛选可以通过TranSPHIRE中的Cinderella,以及2DAccess软件实现,这些方法都是通过AI的训练模型来自动选取2D分类结果。RELION4.0借鉴了这一思想,在subset selection中新增了自动选择2D分类的功能。 - 自动执行工作流
Sjors 开发了一个用于自动执行预定义工作流的框架,在 On-the-fly 处理部分中有更详细的解释。RELION-4.0进一步优化了relion_it.py
自动流程化数据处理脚本,可以从导入数据开始全流程自动化处理数据,得到最终结果。 在relion_it.py GUI
里,可以先设置好数据的相关参数,以及需要运行的任务类型,然后点击save&run
按钮,即可开始预处理流程,界面会自动跳转到 RELION-4.0 主界面,并实时显示预处理运算进度和后处理运算进度。 - 流水线与 CCP-EM 软件的更紧密集成
CCP-EM 团队,主要是 Matt Iadanza、Colin Palmer 和 Tom Burnley,已经在 CCP-EM 软件中实现了一个基于 python 的管道器,它模仿了 RELION 管道器,但也将扩展到包括其他 CCP-EM 软件。 python 接口便于编写脚本,也可以从 RELION 的主 GUI 中调用,方法是添加附加参数relion --ccpem &
。 - 更好地整合了Topaz:
为了优化用户体验,RELION-4.0 完整地整合了 Topaz。可以在manual picking
中直接调用topaz denoise
,对图像进行降噪处理后再进行手动挑颗粒操作,也可以在auto-picking
中Topaz tab
中使用 Topaz 训练模型和自动挑颗粒。对于Topaz denoise,可以在 manual picking 页面中将OR:use Topaz denoising?
设为Yes,并且设置好Topaz可执行文件的位置,便可以在进行 manual pick之前调用Topaz进行去噪操作。
源码结构
其中和tomo相关的代码主要在/src/jaz/tomography/programs/
里面,在编译生成命令的时候,都在前面加了relion_tomo_
的前缀。
subtomogram 相关部分
数据类型
RELION 使用到了以下数据类型:
Tomogram set
层析图像集描述了一个项目中定义的所有层析图像(tomograms),也就是倾斜序列。通常命名为 tomograms.star。它包含了 T+1 个表,其中 T 代表层析图像的数量。例如下图是demo数据集里的tomogram set 示例(可以看到有一个global表,然后分别是5个层析图的信息):
第一个表(名为 global)定义了和每个层析图相关的属性。每一行对应一个层析图,它列出了以下属性:
- tomogram name (
rlnTomoName
): 层析图的名字,在项目中引用此层析图的唯一标识符(即在层析图像集、粒子集和流形集内)。- tilt series file name (
rlnTomoTiltSeriesName
):图像stack的路径- frame count (
rlnTomoFrameCount
)- tomogram size (
rlnTomoSize<X/Y/Z>
)- handeness (
rlnTomoHand
):这个值是+1或-1,它描述焦点是增加还是减少,作为深度的函数(投影Z坐标)。它不是先验的,必须通过实验来确定。在整个数据集中通常是相同的。- pixel size (
rlnTomoTiltSeriesPixelSize
):单位是 Å 。- voltage (
rlnVoltage
):单位是kV 。- spherical aberration (
rlnSphericalAberration
)- amplitude contrast (
rlnAmplitudecontrast
)- (optional) The path to a STAR file containing the 3D positions of fiducial markers detected by relion_tomo_find_fiducials (
rlnTomoFiducialsStarFile
)
之后的表格分别对应一个断层扫描图,它们的名字与它们所指的断层扫描图相同。每一行对应一个倾斜图像,描述以下属性:
- The rows of the projection matrices that map points in 3D space onto the 2D image (
rlnTomoProj<X/Y/Z/W>
): 将3D空间中的点映射到2D图像的投影矩阵。- astigmatic defocus (
rlnDefocus<U/V>
,rlnDefocusAngle
):像散的散焦。- intensity scale factor related to effective ice thickness at each tilt angle (
rlnCtfScalefactor
):强度尺度因子与有效冰厚在每个倾斜角度。(一般是1)- cumulative radiation dose (
rlnMicrographPreExposure
):累积剂量。
断层图集(tomogram set)通常是作为新项目的一部分创建的第一个数据文件。它可以通过调用relion_tomo_import_tomograms
程序从IMOD
导入现有的对齐来生成。初始对齐可以并且应该再继续使用relion_tomo_align
程序进行优化。
Particle set
通常命名为particles.star
,列出了数据集里的所有颗粒。大致相当于relion中SPA程序所使用的粒子文件,是tomography程序和一般细化程序之间的绑定元素,也是RELION中唯一可以被SPA程序所理解的断层扫描数据文件。
与SPA粒子集一样,tomography的粒子集由optics表和particle表组成。与SPA粒子集不同,粒子的坐标是3维的(rlnCoordinate<X/Y/Z>
和rlnOrigin<X/Y/Z>Angst
),并且每个粒子还需要一个tomogram名称(rlnTomoName
),用于识别粒子的原始层析图,正如tomogram set中定义的那样。
另外,与SPA不同的是,断层扫描颗粒不应该被认为是存储在磁盘上的像素数据,而应该被认为是这个文件中定义的抽象实体。用于细化的3D图像可以用relion_tomo_subtomo
程序创建,但应该把它们看成是瞬态数据,一旦其层析图的任何其他属性被更新,这些瞬态数据就会失效。因此,在处理断层扫描数据集期间,这些3D图像通常被创建多次。
和2D颗粒集的另一个不同之处在于,断层扫描的颗粒可以有选择地拥有两个不同的方向。在断层扫描中,粒子的近似方向通常由几何背景(geometric context)决定(例如它们嵌入的膜的方向)。
因此,通过定义每个subtomogram相对于该几何图形的初始方向(使用字段rlnTomoSubtomogram<Rot/Tilt/ Psi>
),然后在细化过程中应用强先验来约束描述粒子本身相对于其subtomogram的方向的角度(rlnAngle<Rot/Tilt/ Psi>
),可以极大地加速subtomogram对齐。 由于 relion_refine 仅考虑后一个角度,因此先验只会影响这些角度。 通常,这意味着 rlnAngleTilt
角度将受到约束,而其他两个通常是未知的,即使在断层扫描中也是如此。
然后在细化过程中应用强大的先验约束的角度描述粒子的取向本身的subtomogram 。由于relion_refine
只考虑后一个角度,所以先验只会影响这些角度。通常,这意味着rlnAngleTilt
的角度会受到限制,而其他两个通常是未知的,即使在断层扫描中也是如此。
目前有两种方法可以创建新的粒子集:
- 从现有数据集导入;
- 使用程序
relion_tomo_sample_manifold
沿着一组用户定义的(并且可能拟合的)manifold 对粒子进行采样。
在后一种情况下,程序将自动定义子断层图相对于manifold的方向,这样(尚未创建的)子断层图的 Z 轴将垂直于manifold。relion_tomo_import_particles
中提供了有关如何从现有数据集中导入粒子的更详细说明。
Trajectory set
轨迹集(通常命名为motion.star
)包含对应粒子集中所有粒子的运动轨迹。 可以使用程序 relion_tomo_align
估计轨迹,并且它们将被任何需要粒子位置的 relion 断层扫描程序考虑。
轨迹文件由 P+1 个表组成,其中 P 是相应粒子集中的颗粒数。 第一个表只包含粒子的数量,而每个后续的表都列出了每个粒子的轨迹。 轨迹以 Å 为单位,它们与颗粒在按时间顺序排列的第一个倾斜图像(即累积剂量最低的图像)中的位置有关。
Manifold set
流形集通常命名为manifolds.star
,它列出了所有断层图中定义的所有流形。 在这种情况下,所有流形都是嵌入在 3D 空间中的 2D 表面。 目前仅支持球体和球状体。 球状体是类球表面(斑点),其与球体的偏差使用球谐函数基表示。 可以使用程序 program_tomo_add_sphere
导入球体,而可以使用程序 relion_tomo_fit_blobs_3d
将球状体从初始球体拟合到膜囊泡。
流形文件包含每个断层图的一个表,每个表都以相应的断层图名称命名(参见断层图集)。 表的每一行对应一个流形,列出其:
- number (
rlnTomoManifoldIndex
), - type (
rlnTomoManifoldType
), - and parameters (
rlnTomoManifoldParams
).
参数集因流形类型而异:
- 对于球体,前 3 个系数描述球体中心的位置,而第四个系数描述其半径。
- 对于椭球体,前 3 个系数也描述了位置,而其余的系数是描述每个 Spherical Harmonics 基函数的贡献的系数 。 然后,每个连续参数都会通过应用高阶球谐函数来扭曲该半径的球体。
给定一组流形,程序 relion_tomo_sample_manifold
允许用户沿每个流形对粒子进行采样,生成一个新的粒子集。 这些粒子排列成使得它们的 Z 方向垂直于流形的表面法线。 这允许在细化期间应用强倾斜先验以节省时间。
Optimisation set
优化集是 relion 断层扫描项目中的中心数据类型,它只包含其他文件的路径。 它通常被命名为 optimisation_set.star
。
具体来说,它可以指向以下数据文件:
- tomogram set:列出所有断层图的断层图集。
- particle set:列出所有粒子的粒子集。
- trajectory set:描述所有粒子运动的轨迹集。
- manifold set:列出所有流形(例如球体或斑点)的流形集。
- 一对参考半图 half maps。
- 对应于参考 maps 的 FSC。
- 与参考 maps 一起使用的 mask。
所有这些条目都是可选的,不同的程序需要不同的输入。所有程序都将优化集作为输入,并且大多数程序也会写出一个。如果数据文件由程序创建或更新,则将其添加到程序写出的优化集中。这使用户不必跟踪哪些程序更新了哪些数据文件。例如,relion_tomo_refine_ctf
只会更新 tomogram set,因为对于每个倾斜图像只定义一次散焦,而 relion_tomo_align
将更新断层图集、粒子集和轨迹集。
运行程序时,始终使用 --i
参数指定输入优化集。此外,也可以单独指定单个数据文件,在这种情况下,单个文件将覆盖优化集中列出的文件。这使用户可以轻松地执行与交换特定数据文件的相同程序。如果程序所需的所有数据文件都已单独指定,则根本不需要优化集。各个数据文件的输入参数始终命名如下:
--t
for the tomogram set--p
for the particle set--mot
for the trajectory set--man
for the manifold set.--ref<1/2>
for the respective reference map--mask
for the reference mask--fsc
for the reference FSC
有 3 种方法可以创建初始优化集:
- 使用实用程序
relion_tomo_make_optimisation_set
。 - 运行任何程序并指定单个数据文件。 然后程序将输出一个新的优化集。
- 手动写一个。
相关程序
Core programs (核心程序)
1. relion_tomo_reconstruct_particle
:
(对应代码: /src/jaz/tomography/programs/reconstruct_particle.cpp)
从给定的数据集生成高分辨率map。该程序根据给定的优化集(optimisation set)构建高分辨率 3D reference maps。 它类似于 relion_reconstruct
,只是它不需要预先提取的粒子图像。 相反,它直接从倾斜序列中提取任意大小的方形窗口(--b
参数),并将其用于重建(使用傅立叶反变换)。它考虑了单个粒子的散焦,以及粒子运动和高阶像差。
输出由一对maps(每半个集合一个)以及一个合并map组成。 此外,还有 3 个map的分子(数据项)和分母(权重项)(参见|RELION| 论文中的公式 3),以方便进一步处理。
相关参数:
--i
--p
--t
--mot
: 输入的 optimisation-set 和/或它的各成分。--b
: 重建的box size。注意,这与用于细化粒子的框大小无关。 这允许用户构建任意大小的 3D 地图,以获得粒子周围结构的概览。 足够大的框尺寸还允许捕获更多已被 CTF 离域的高频信号。--crop
:裁剪框大小。 如果设置,程序将输出一组额外的已裁剪为此大小的map。 如果需要的 map 小于检索 CTF 离域信号所需的 box 的大小,这将很有用。--bin
:下采样(分箱)因子。 注意,这不会改变 box 的大小。 重建的区域反而变得更大。--SNR
: 应用具有此信噪比的维纳滤波器。如果省略,重建将使用启发式方法来防止除以过小的数字。请注意,使用低(即使是现实的)SNR 可能会冲掉较高的频率,这可能会使map不适合用于进一步细化。--sym
: 对称类的名称(例如,C6 表示六重点对称).--mem
: (近似)用于重建的最大内存量(见下文)。--j
: 用于程序非重构部分的线程数(例如对称应用或网格校正)。这应该设置为可用的 CPU 内核数。--j_out
: 并行计算部分重建的线程数。这更快,但它需要为每个线程额外的内存。当与 --mem 参数一起使用时,这个数字将减少到(大约)维持强加的内存限制。--j_in
: 用于每个部分重建的线程数。这是并行化过程的较慢方法,但它不需要额外的内存。除非内存有限,否则应该首选 --j_out 选项。 --j_out 和 --j_in 的乘积不应超过可用的 CPU 内核数。--o
: 输出目录的名称(将被创建)。
程序输出:
运行程序后,输出目录(–o 参数)将包含以下项目:
<half1/half2/merged>.mrc
:重建的裁剪后的maps。<half1/half2/merged>_full.mrc
:重建的全尺寸maps,以防全尺寸(–b 参数)与裁剪后的尺寸(–crop 参数)不同。data_<half1/half2/merged>.mrc
:全尺寸的重构数据项。weight_<half1/half2/merged>.mrc
:全尺寸的重构权重项。note.txt
:包含运行程序的命令的文本文件。
2. relion_tomo_subtomo
:
(对应代码: /src/jaz/tomography/programs/subtomo.cpp)
创建伪子断层作为relion_refine
的输入。
该程序创建可以输入 relion_refine
以执行 subtomogram 对齐的pseudo subtomograms
。这些伪子断层图并不意味着代表粒子的实际密度分布,而是抽象的 3D 图像描述项,允许 relion_refine 近似在相应的 2D 图像堆栈上执行对齐时会出现的成本函数。具体来说,每个伪子断层图由 CTF 加权观测值的总和(数据项)以及相应的 CTF² 项总和(权重项)组成。此外,输出权重项还包含 - 沿 Z 轴连接的 - 3D 多重图像(对每个傅里叶体素有贡献的傅里叶切片数),允许 relion_refine
估计一个球型对称噪声分布。
重建的 pseudo subtomo 会考虑粒子的运动,以及高阶像差(如果它们已被估计)。该程序将输出一个新的粒子集
,以及一个新的优化集
,其中初始粒子集已被新生成的粒子集替换。该粒子集可以输入 relion_refine
。
如果 subtomo 方向已定义(参见 particle set),那么将在该坐标系中构建 subtomo。 如果粒子的近似方向是从周围的几何形状先验已知的,这允许在 relion_refine 中使用角度先验以避免搜索不合理的方向。 特别是对于从流形采样的粒子(使用 relion_tomo_sample_manifold),子断层坐标系的 Z 轴始终垂直于局部流形。 然后可以应用强倾斜角先验来仅搜索不会使粒子倾斜太远离该方向的方向,而其余两个角度不受约束(即倾斜方向和围绕 Z 轴的旋转)。
相关参数:
--i
和/或--p
、--t
和 –mot
:输入优化集和/或其组件(参见优化集)。--b
:重建的初始框大小。足够大的框尺寸允许捕获更多已被 CTF 离域的高频信号。--crop
:裁剪后的输出框大小。构建后,生成的伪子断层图被裁剪到这个大小。较小的框尺寸允许使用 relion_refine 进行的(通常昂贵的)细化更快地进行。--bin
:下采样(分箱)因子。请注意,这不会改变初始或裁剪框的大小。重建的区域反而变得更大。--cone_weight
:在傅里叶空间中沿 Z 轴(由粒子的坐标系定义)对锥体进行减重。这对于嵌入膜中的粒子很有用,因为它可以防止对齐被膜信号驱动(平面膜的信号位于 3D 傅里叶空间中的一条线内)。请注意,粒子的坐标系由 subtomogram 方向(如果已定义)和粒子方向(参见粒子集)给出。这允许用户首先获得膜驱动的对齐,然后专门抑制该方向的信号。--cone_angle
:要抑制的锥体的(完整)开口角度,以度为单位。该角度应包括膜方向的不确定性及其在亚断层图中表示的区域的变化。--j
:用于并行重建伪子断层图的线程数。每个线程都需要额外的内存,因此应该将其设置为可用的 CPU 内核数,除非内存要求变得过高。--o
:输出目录的名称(将被创建)。
程序输出:
运行程序后,输出目录(-- o 参数)将包含以下项目:
- particles.star:一个新的粒子集,包含重建的子断层图的文件名。 relion_refine 可以理解这个文件
- optimisation_set.star:指向新粒子集的新优化集。
- Subtomograms/<
particle_name
>_data.mrc:表示所有 subtomograms 的数据项的 3D 图像。 - Subtomograms/<
particle_name
>_weights.mrc:所有 subtomograms 的权重项。 每个 3D 图像包含沿 Z 连接的图像,描述所有 CTF² 的总和,以及描述多重性的图像。 - note.txt:包含运行程序的命令的文本文件。
Refinement programs
这些程序使用现有的粒子集和一对高分辨率的 3D reference maps 来估计或改善不同的属性。
relion_tomo_align
:
aligns the images of a tilt series and estimates beam-induced motion to better fit a set of particles. 将倾斜序列的图像对齐,并估计光束诱导的运动,以更好地匹配一组粒子。relion_tomo_refine_ctf
:
refines the astigmatic defocus, signal intensity (i.e. ice thickness) and higher-order aberrations. 细化像散焦,信号强度(即冰厚度)和高阶像差。
defocus: 在层析成像中,粒子之间的相对深度距离是从粒子的三维位置可知的。因此,对每个倾斜图像中的所有粒子只估计一个离焦值。由于每个层析图像中通常有大量的粒子,这个值通常可以比单粒子分析估计得更精确,在单粒子分析中,每个粒子的离焦必须独立估计。
ice-thickness: 较厚的样本允许更少的电子通过,这降低了信号的尺度。除了试样厚度的实际变化外,冰的有效厚度也随着试样的倾斜而增加。该程序允许用户对每个倾斜图像独立估计信号强度,或通过拟合基础厚度,初始光束亮度和假设 Beer-Lambert定律 的样本表面法向。在后一种情况下,整个倾斜序列只估计了一个表面法线和基础厚度,这使得可以用层析图中更少的颗粒得到更稳定的拟合结果。
Higher-order optical aberrations: 该算法的工作原理类似于单粒子分析的 relion_ctf_refine。与单粒子分析一样,每个光学组估计像差。这允许用户对具有相同像差的粒子进行分组,可以根据图像区域或倾斜序列子集进行分组,也可以同时进行分组。同时支持对称(偶)和反对称(奇)像差。关于像差估计算法的详细描述可以在有关像差的文章中找到。
将估计的离焦值和冰厚值写入输出的 tomogram set,将像差写入particle set,并且替换掉 optimization set 中以前的值。relion_tomo_local_particle_refine
:
offers a rapid way to refine the angles and positions of individual particles. 提供了一种快速的方法来细化单个粒子的角度和位置。relion_tomo_fit_blobs_3d
:
fits a set of spherical manifolds representing vesicles to the observed membranes. 将一组表示囊泡的球形流形贴合到观察到的膜上。
Utility programs
relion_tomo_import_tomograms
:
imports new tilt series to create or extend a tomogram set.relion_tomo_import_particles
:
imports new particles.relion_tomo_reconstruct_tomogram
:
creates a (typically low-magnification) tomogram.relion_tomo_make_optimisation_set
ties a set of disparate data elements into an optimisation set.
将一组不同的数据元素绑定到一个优化集。relion_tomo_make_reference
runsrelion_postprocess
on a pair of reference half maps.relion_tomo_add_spheres
:
creates a manifold set from a set of spheres given in .cmm format.relion_tomo_find_fiducials
:
detects the fiducial markers in a given data set.relion_tomo_sample_manifold
:
samples a set of particle positions and orientations from a set of manifolds.
从一组流形中采样一组粒子的位置和方向。
Q&A
CTF在哪个阶段引入?
二维的CTF在最开始导入tomograms的时候传入,每一个断层序列 tilt series 对应一个CTF参数文件。通过
--i input/tomograms_descr.star
中的_rlnTomoImportCtfFindFile
字段传入 CTF 参数文件(如使用CTFFind得到的TXT file)的路径。如图所示:倾斜序列中的每一张micrograph对应一行参数:
这些参数会用于创建 pseudo subtomograms——构造的 3D 数据数组集,其中包含预乘了CTF的倾斜系列图像的总和,以及包含相应 CTF 平方和的辅助数组以及每个 3D 体素被观察到的频率。
在得到伪子断层并进行平均以后,还会对倾斜序列的 CTF 参数进行重新估计和更新。每张图像上的颗粒除散焦以外使用相同的CTF参数。
体的重构调用了什么API?
体的重构分成 tomograms 的重构和 particle 的重构(subtomogram)。
在生成伪子断层时调用的是subtomo.cpp
。particle 的重构调用的 API 是 reconstruct_particle.cpp
。
在进行 reconstruct particle 的时候,直接从倾斜序列中提取任意大小的方形窗口,并将其用于重建(使用傅立叶反变换)。并且考虑了单个粒子的散焦,以及粒子运动和高阶像差。
参数优化是在频域还是空间域,调用了什么API?
参数优化是在傅里叶频域。调用的是和单颗粒分析流程中相同的API:ml_optimiser.cpp
。
是否进行了缺失楔的mask操作?
没有进行缺失楔的mask操作。通过使用 2D 数据模型,不再需要缺失楔校正。相反,该问题接近于单颗粒分析,其中来自不同方向和不同结构状态的投影被同时整理出来。
Reference:
relion官方教程网址指路
relion4.0 beta测试结果
relion-4.0 YouTube 视频
边栏推荐
- Floating point multiplication and division of vivado IP core floating point
- 注解(Annotation)
- CNN convolutional neural network
- Hongke share | bring you a comprehensive understanding of "can bus error" (I) -- can bus error and error frame
- Network Security Learning (I)
- Let the computer run only one program setting
- 成长为架构师途中的一些思考
- VMware虚拟机在物理机win10系统下如何连接外网
- apisix健康检查测试
- SQL developer graphical window to create database (tablespace and user)
猜你喜欢
day02_ Basic grammar
C语言数据类型
Hongke share | bring you a comprehensive understanding of "can bus error" (I) -- can bus error and error frame
损失函数——交叉熵损失函数
Tcp/ip 五层参考模型以及对应的典型设备以及ipv6
Ansible(自动化软件)
NeuralCF-神经协同过滤网络
Hongke automation SoftPLC | Hongke kPa modk operation environment and construction steps (3) -- modk routine test
day17_ Under collection
5、 Wireless communication network
随机推荐
Instruction rearrangement under multithreading concurrency
greenplum企业部署
How to use SFTP command to access SFTP server on the development board
Relationship between subnet number, host number and subnet mask
day02_ Basic grammar
Base64与File之间的相互转化
Ansible(自动化软件)
Leetcode刷题记录
Shell脚本-全局变量、局部变量、环境变量
FIR filter design (1) -- using the FDATool toolbox of MATLAB to design FIR filter parameters
Case supplement, ATM
Several misunderstandings about DDoS
Multiple IO usage
VMware虚拟机在物理机win10系统下如何连接外网
Shallow reading of reentrantlock source code of abstractqueuedsynchronizer (AQS)
Design and simulation code of 4-bit subtracter based on FPGA
What is WAF protection
NeuralCF-神经协同过滤网络
Solution for website being suspended
Those vulnerability attacks on app