BioTech - 大型蛋白质复合物的组装流程 (CombFold)

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/136187314

CombFold是用于预测大型蛋白质复合物结构的组合和分层组装算法,利用AlphaFold2预测的亚基之间的成对相互作用。CombFold的组装流程分为以下几个步骤:

  • 亚基结构预测:对于每个亚基,使用 AlphaFold2 预测其单链结构,并将其保存为PDB文件。
  • 亚基相互作用预测:对于每对亚基,使用 AlphaFold2 预测其双链结构,并从中提取亚基之间的接触信息,包括距离、角度和置信度。
  • 亚基组合:根据亚基相互作用的置信度,将亚基按照从高到低的顺序排序,并使用一种贪心算法,从最高置信度的亚基对开始,逐步将亚基组合在一起,形成一个初始的蛋白质复合物。
  • 亚基优化:对于每个组合后的亚基,使用一种基于梯度下降的算法,根据亚基之间的接触信息,调整其相对位置和方向,以最小化亚基之间的能量和冲突。
  • 亚基筛选:对于每个组合后的亚基,计算其与其他亚基的接触面积和重叠度,如果低于一定的阈值,则将其从蛋白质复合物中移除,以减少过度组合的情况。
  • 亚基重复:对于每个组合后的亚基,检查其是否存在重复的亚基,如果存在,则将其合并为一个亚基,以减少冗余的情况。
  • 亚基排序:对于每个组合后的亚基,计算其在蛋白质复合物中的重要性,根据重要性的高低,将亚基按照从高到低的顺序排序,并输出前十个最重要的亚基作为最终的蛋白质复合物结构。

CombFold 的优点是能够利用 AlphaFold2 的高精度预测,快速地组合和优化亚基,从而生成高质量的蛋白质复合物结构,还支持结合交联质谱的距离约束和快速枚举可能的复合物组成。

CombFold:
CombFold

测试效果:7QRB

准备数据:

MSA: 7qrb_A292_B286_C292_D292_1162
FASTA: 7qrb_A292_B286_C292_D292_1162.fasta
PDB: 7qrb_A292_B286_C292_D292_1162.pdb

FASTA 是 A3B1 的格式:

>A
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>B
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>C
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>D
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK

评估结果:

PDBTMScoreDockQRMSDlDDT
AFM Baseline10.29930.030648.31480.5350
AFM Baseline20.44260.026145.97450.5331
CombFold0.28360.015452.47470.5369

推理 AFM 的 Baseline 效果:

# 测试路径 mydata/test-case/combfold_baseline
bash run_alphafold.sh \
-o mydata/test-case/combfold_baseline/ \
-f fasta_100/7qrb_A292_B286_C292_D292_1162.fasta \
-m "multimer" \
-l 2 

推理单个结构,时间大约 933.2s,即 15.55 min

1. 生成 subunits.json 文件

调用 generate_subunits.py 脚本:

python myscripts/generate_subunits.py \
-i xxx.fasta \
-o subunits.json

FASTA 示例,即 7qrb_A292_B286_C292_D292_1162.fasta

>A
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>B
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>C
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK
>D
LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK

输出结果 subunits.json ,即:

{"A0": {"name": "A0","chain_names": ["A","C","D"],"start_res": 1,"sequence": "LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRDARTHQHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK"},"B0": {"name": "B0","chain_names": ["B"],"start_res": 1,"sequence": "LRVGNRYRLGRKIGSGSFGDIYLGTDIAAGEEVAIKLECVKTKHPQLHIESKIYKMMQGGVGIPTIRWCGAEGDYNVMVMELLGPSLEDLFNFCSRKFSLKTVLLLADQMISRIEYIHSKNFIHRDVKPDNFLMGLGKKGNLVYIIDFGLAKKYRHIPYRENKNLTGTARYASINTHLGIEQSRRDDLESLGYVLMYFNLGSLPWQGLKAATKRQKYERISEKKMSTPIEVLCKGYPSEFATYLNFCRSLRFDDKPDYSYLRQLFRNLFHRQGFSYDYVFDWNMLK"}
}

2. 调用函数生成一组 FASTA 文件

调用默认函数 scripts/prepare_fastas.py ,将 subunits.json 拆解成多个 fasta 文件,如 AA、AB、AAA、AAB 等,即:

  • 输入已生成的 subunits.json 文件
  • --stage 选择 pairs 模式,同时支持 groups 模式
  • --output-fasta-folder 是输出文件夹,例如 mydata/fastas
  • --max-af-size 是最大序列长度,即 1800

即:

# 默认 pairs 生成
python3 scripts/prepare_fastas.py mydata/subunits.json --stage pairs --output-fasta-folder mydata/fastas --max-af-size 1800
# 根据 groups 生成
# python3 scripts/prepare_fastas.py mydata/subunits.json  --stage groups --output-fasta-folder mydata/fastas --max-af-size 1800 --input-pairs-results <path_to_AFM_pairs_results>

输出文件夹的内容如下,例如 mydata/fastas,即:

A0_A0.fasta
A0_A0_A0.fasta
A0_A0_B0.fasta
A0_B0.fasta

3. 根据 AFM 的搜索生成一组 MSAs

调用函数 generate_comb_msa.py

  • -i:输入已生成的一组 FASTA 文件
  • -m:AFM 搜索的 MSAs 文件夹,例如 7qrb_A292_B286_C292_D292_1162/msas
  • -o:输出的一组 MSAs 文件,例如 mydata/comb_msas

即:

python myscripts/generate_comb_msa.py \
-i mydata/fastas \
-m [afm searched msas]
-o mydata/comb_msas

输出文件夹 mydata/comb_msas 示例:

A0_A0/
A0_A0_A0/
A0_A0_B0/
A0_B0/

调用 AFM 程序,执行 Subunits PDB 推理:

bash run_alphafold.sh \
-o mydata/comb_msas/ \
-f mydata/fastas/ \
-m "multimer" \
-l 5

4. 导出 Subunits 的 PDBs 文件

调用函数 export_comb_pdbs.py

  • -i:输入 AFM 已生成 Subunits 的 PDB 文件,例如 mydata/comb_msas
  • -o:输出 一组 PDB 文件,合并至一个文件夹,并且重命名,例如 mydata/pdbs

即:

python myscripts/export_comb_pdbs.py \
-i mydata/comb_msas \
-o mydata/pdbs

导出的 PDBs 文件如下:

AFM_A0_A0_A0_unrelaxed_model_1_multimer_v3_pred_0.pdb
AFM_A0_A0_A0_unrelaxed_model_1_multimer_v3_pred_1.pdb
AFM_A0_A0_B0_unrelaxed_model_1_multimer_v3_pred_0.pdb
AFM_A0_A0_B0_unrelaxed_model_1_multimer_v3_pred_1.pdb

5. 调用 Comb Assembly 程序

调用函数 myscripts/run_examples.py,具体参数源码,即:

path_on_drive = os.path.join(DATA_DIR, "example_1")  # @param {type:"string"}
max_results_number = "5"  # @param [1, 5, 10, 20]
create_cif_instead_of_pdb = False  # @param {type:"boolean"}subunits_path = os.path.join(path_on_drive, "subunits.json")
pdbs_folder = os.path.join(path_on_drive, "pdbs")
assembled_folder = os.path.join(path_on_drive, "assembled")
mkdir_if_not_exist(assembled_folder)
tmp_assembled_folder = os.path.join(path_on_drive, "tmp_assembled")

最终输出文件 assembled,即:

confidence.txt
output_clustered_0.pdb

最终结果,即 output_clustered_0.pdb

其中,也可以输入 Crosslinks 交联质谱数据。来源于 pLink2 软件的交联肽段的分析结果。

每一行代表一个交联对,由两个肽段组成,即:

  • 第1维和第2维,表示 蛋白质序号 与 蛋白质链名。
  • 第3维和第4维,同上,即表示 A链中的a位置蛋白,与B链中的b位置蛋白,相互作用。
  • 第5维和第6维,表示 联剂的类型 与 交联剂的臂长,确定交联位点的距离限制和交联剂的选择。
  • 第7维表示为置信度。

例如:

94 2 651 C 0 30 0.85
149 2 651 C 0 30 0.92
280 2 196 A 0 30 0.96
789 C 159 T 0 30 0.67
40 T 27 b 0 30 0.86
424 2 206 A 0 30 0.55
351 2 29 T 0 30 0.84
149 2 196 A 0 30 0.93
761 C 304 T 0 30 0.95
152 2 651 C 0 30 0.94
351 2 832 C 0 30 0.87
206 A 645 C 0 30 0.75
832 C 40 T 0 30 0.85
424 2 23 b 0 30 0.75

0 表示交联剂是不可裂解型的,如 BS3 或 DSS2。30 表示交联剂的臂长是 30 A。

整体实现多链的组装效果,不适用于小型蛋白质复合物,而且依赖于 AFM 的预测亚基复合物结构。评估效果,如下:

PDB

源码:

generate_subunits.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""
import argparse
import collections
import json
import os
import sys
from pathlib import Pathp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from myutils.protein_utils import get_seq_from_fasta
from root_dir import DATA_DIRclass GenerateSubunits(object):"""从 fasta 生成 subunits.json"""def __init__(self):passdef process(self, input_path, output_path):print(f"[Info] input_path: {input_path}")print(f"[Info] output_path: {output_path}")seq_list, desc_list = get_seq_from_fasta(input_path)print(f"[Info] seq_list: {seq_list}")print(f"[Info] desc_list: {desc_list}")seq_dict = collections.defaultdict(list)for seq, desc in zip(seq_list, desc_list):seq_dict[seq].append(desc)su_dict = {}for seq in seq_dict.keys():chain_names = seq_dict[seq]su_name = chain_names[0] + "0"su_dict[su_name] = {"name": su_name,"chain_names": chain_names,"start_res": 1,"sequence": seq}with open(output_path, "w") as f:f.write(json.dumps(su_dict, indent=4))def main():parser = argparse.ArgumentParser()parser.add_argument("-i","--input-path",type=Path,required=True,)parser.add_argument("-o","--output-path",type=Path,required=True)args = parser.parse_args()input_path = str(args.input_path)output_path = str(args.output_path)assert os.path.isfile(input_path)gs = GenerateSubunits()gs.process(input_path, output_path)def main2():gs = GenerateSubunits()input_path = os.path.join(DATA_DIR, "7qrb_A292_B286_C292_D292_1162.fasta")output_path = os.path.join(DATA_DIR, "subunits.json")gs.process(input_path, output_path)if __name__ == '__main__':main()

generate_comb_msa.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""
import argparse
import json
import os
import shutil
import sys
from pathlib import Pathp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from myutils.project_utils import mkdir_if_not_exist, traverse_dir_folders, traverse_dir_files
from myutils.protein_utils import get_seq_from_fasta
from root_dir import DATA_DIRclass GenerateCombMsa(object):"""根据已知的 MSA 搜索,构建新的 MSA 文件夹"""def __init__(self):passdef process(self, input_dir, msa_path, output_dir):print(f"[Info] input_dir: {input_dir}")print(f"[Info] msa_path: {msa_path}")print(f"[Info] output_dir: {output_dir}")paths_list = traverse_dir_files(input_dir, "fasta")print(f"[Info] fasta: {len(paths_list)}")for path in paths_list:self.process_fasta(path, msa_path, output_dir)print(f"[Info] 处理完成: {output_dir}")def process_fasta(self, input_path, msa_path, output_dir):mkdir_if_not_exist(output_dir)map_path = os.path.join(msa_path, "chain_id_map.json")folder_list = traverse_dir_folders(msa_path)chain_folder_map = {}for folder_path in folder_list:# print(f"[Info] folder_path: {folder_path}")name = os.path.basename(folder_path)chain_folder_map[name] = folder_path# print(f"[Info] chain_folder_map: {chain_folder_map}")with open(map_path, "r") as f:chain_id_map = json.load(f)# print(f"[Info] chain_id_map: {chain_id_map}")seq_folder_map = dict()for key in chain_id_map.keys():seq = chain_id_map[key]["sequence"]if key in chain_folder_map.keys():folder_path = chain_folder_map[key]seq_folder_map[seq] = folder_path# print(f"[Info] seq_folder_map: {seq_folder_map}")# 创建文件夹fasta_name = os.path.basename(input_path).split(".")[0]fasta_dir = os.path.join(output_dir, fasta_name, "msas")mkdir_if_not_exist(fasta_dir)new_chain_id_map = {}seq_list, desc_list = get_seq_from_fasta(input_path)copied_set = set()for seq, desc in zip(seq_list, desc_list):new_chain_id_map[desc] = {"description": desc,"sequence": seq}if seq in seq_folder_map.keys():if seq not in copied_set:copied_set.add(seq)output_msa_folder = os.path.join(fasta_dir, desc)if not os.path.exists(output_msa_folder):shutil.copytree(seq_folder_map[seq], output_msa_folder)output_map_path = os.path.join(fasta_dir, "chain_id_map.json")with open(output_map_path, "w") as f:f.write(json.dumps(new_chain_id_map, indent=4))print(f"[Info] fasta 处理完成: {fasta_dir}")def main():parser = argparse.ArgumentParser()parser.add_argument("-i","--input-dir",type=Path,required=True,)parser.add_argument("-m","--msa-path",type=Path,required=True,)parser.add_argument("-o","--output-dir",type=Path,required=True)args = parser.parse_args()input_dir = str(args.input_dir)msa_path = str(args.msa_path)output_dir = str(args.output_dir)assert os.path.isdir(input_dir) and os.path.isdir(msa_path)mkdir_if_not_exist(output_dir)gcm = GenerateCombMsa()gcm.process(input_dir, msa_path, output_dir)def main2():gcm = GenerateCombMsa()input_dir = os.path.join(DATA_DIR, "fastas")msa_path = "7qrb_A292_B286_C292_D292_1162/msas"output_dir = os.path.join(DATA_DIR, "comb_msas")gcm.process(input_dir, msa_path, output_dir)if __name__ == '__main__':main()

export_comb_pdbs.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/20
"""
import argparse
import os
import shutil
import sys
from pathlib import Pathp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from myutils.project_utils import mkdir_if_not_exist, traverse_dir_filesclass ExportCombPdbs(object):"""导出 Comb PDBs 文件"""def __init__(self):passdef process(self, input_dir, output_dir):print(f"[Info] input_dir: {input_dir}")print(f"[Info] output_dir: {output_dir}")mkdir_if_not_exist(output_dir)path_list = traverse_dir_files(input_dir, "pdb")for path in path_list:base_name = os.path.basename(path)folder_name = path.split("/")[-2]if not base_name.startswith("unrelaxed"):continue# AFM_A0_A0_A0_unrelaxed_rank_1_model_3.pdboutput_name = f"AFM_{folder_name}_{base_name}"output_path = os.path.join(output_dir, output_name)shutil.copy(path, output_path)  # 复制文件def main():parser = argparse.ArgumentParser()parser.add_argument("-i","--input-dir",type=Path,required=True,)parser.add_argument("-o","--output-dir",type=Path,required=True)args = parser.parse_args()input_dir = str(args.input_dir)output_dir = str(args.output_dir)assert os.path.isfile(input_dir)ecp = ExportCombPdbs()ecp.process(input_dir, output_dir)def main2():input_dir = "mydata/comb_msas"output_dir = "mydata/outputs"ecp = ExportCombPdbs()ecp.process(input_dir, output_dir)if __name__ == '__main__':main()

run_examples.py 源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/2/19
"""import os
import shutil
import sysp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from scripts import run_on_pdbs
from myutils.project_utils import mkdir_if_not_exist
from root_dir import ROOT_DIR, DATA_DIRclass RunExamples(object):"""运行程序"""def __init__(self):passdef process(self):# path_on_drive = os.path.join(ROOT_DIR, "example")  # @param {type:"string"}path_on_drive = os.path.join(DATA_DIR, "example_1")  # @param {type:"string"}max_results_number = "5"  # @param [1, 5, 10, 20]create_cif_instead_of_pdb = False  # @param {type:"boolean"}subunits_path = os.path.join(path_on_drive, "subunits.json")pdbs_folder = os.path.join(path_on_drive, "pdbs")assembled_folder = os.path.join(path_on_drive, "assembled")mkdir_if_not_exist(assembled_folder)tmp_assembled_folder = os.path.join(path_on_drive, "tmp_assembled")mkdir_if_not_exist(assembled_folder)mkdir_if_not_exist(tmp_assembled_folder)if os.path.exists(assembled_folder):answer = input(f"[Info] {assembled_folder} already exists, Should delete? (y/n)")if answer in ("y", "Y"):print("[Info] Deleting")shutil.rmtree(assembled_folder)else:print("[Info] Stopping")exit()if os.path.exists(tmp_assembled_folder):shutil.rmtree(tmp_assembled_folder)# 核心运行逻辑run_on_pdbs.run_on_pdbs_folder(subunits_path, pdbs_folder, tmp_assembled_folder,output_cif=create_cif_instead_of_pdb,max_results_number=int(max_results_number))shutil.copytree(os.path.join(tmp_assembled_folder, "assembled_results"),assembled_folder)print("[Info] Results saved to", assembled_folder)def main():re = RunExamples()re.process()if __name__ == '__main__':main()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亿道丨三防平板pad丨三防平板是指哪三防丨三防工业级平板电脑

三防工业级平板电脑成为许多行业中的重要工具。本文将介绍三防工业级平板电脑的特点以及其在各个领域中的广泛应用。 三防工业级平板电脑的特点 三防工业级平板电脑是指具备防水、防尘和防震功能的平板电脑。这些特点使得它们能够在恶劣环境中工作&#xff0c;如沙尘飞扬的工地…

SpringCloud-Nacos集群搭建

本文详细介绍了如何在SpringCloud环境中搭建Nacos集群&#xff0c;为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤&#xff0c;包括安装、配置以及Nginx的负载均衡设置&#xff0c;读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos&#xff0…

ctfshow MISC类部分wp

2023愚人杯 1. 阿尼亚哇库哇库 压缩包里两个文件&#xff1a; 阿尼亚哇库哇库&#xff01;.doc 和 HINT.png 先看HINT.png,图片打不开 使用01打开: 发现文件头有问题&#xff0c;前几位修改为89 50 4E 47后&#xff0c;图片打开依然不正常。发现长高尺寸不对。用脚本根据CR…

滑动变阻器在电路中的连接方式有哪些?

滑动变阻器是可以改变电阻值的电子元件&#xff0c;广泛应用于各种电路中。在电路中&#xff0c;滑动变阻器的连接方式主要有以下几种&#xff1a; 1. 串联连接&#xff1a;滑动变阻器与被测电阻串联在一起&#xff0c;通过改变滑动变阻器的阻值来改变整个电路的总阻值。这种连…

linux---内存管理

一 虚拟内存 即使是现代操作系统中&#xff0c;内存依然是计算机中很宝贵的资源&#xff0c;看看你电脑几个T固态硬盘&#xff0c;再看看内存大小就知道了。 为了充分利用和管理系统内存资源&#xff0c;Linux采用虚拟内存管理技术&#xff0c;利用虚拟内存技术让每个进程都有…

Flume(二)【Flume 进阶使用】

前言 学数仓的时候发现 flume 落了一点&#xff0c;赶紧补齐。 1、Flume 事务 Source 在往 Channel 发送数据之前会开启一个 Put 事务&#xff1a; doPut&#xff1a;将批量数据写入临时缓冲区 putList&#xff08;当 source 中的数据达到 batchsize 或者 超过特定的时间就会…

创新工作方式:低代码拖拉拽实现业务流程智能化

前言 “低代码”这个火热的概念在近些年来备受追捧&#xff0c;由此引发了业内关于其前景和应用范围的广泛热议。作为一种新兴的开发方式&#xff0c;低代码技术正在站在技术领域的风口浪尖&#xff0c;成为行业的一个重要趋势。它以其高效、灵活和可定制的特性&#xff0c;为…

机器人十大前沿技术(2023-2024年)

2023-2024年机器人十大前沿技术 1. 具身智能与垂直大模型 具身智能是指拥有自主感知、交互和行动能力的智能体&#xff0c;能够与环境进行实时互动&#xff0c;从而实现对环境的理解和适应。 “大模型”是指在深度学习和人工智能领域中&#xff0c;使用大量参数和数据进行训…

python自学...

一、稍微高级一点的。。。 1. 闭包&#xff08;跟js差不多&#xff09; 2. 装饰器 就是spring的aop 3. 多线程

解决ubuntu登录密码问题

解决ubuntu登录密码问题 不要随便删除密码&#xff0c;不要随便改密码&#xff0c;很容导致密码过期&#xff0c;或者密码无效。参考了很多人的做法&#xff0c;都没有得到解决。下面的过程&#xff0c;够详细了&#xff0c;我就是这么搞好的。 1、重启虚拟机&#xff0c;不停…

RMAN备份与恢复

文章目录 一、RMAN介绍二、全量备份三、增量备份0级备份1级增量备份累积性差量备份总结 四、压缩备份压缩备份介绍压缩备份操作压缩备份优缺点 五、异常恢复1、恢复前的准备2、恢复数据库 六、RMAN相关参数 一、RMAN介绍 RMAN&#xff08;Recovery Manager&#xff09;是Oracl…

react使用Map方法遍历列表不显示的问题

问题&#xff1a; 在最开始搭建选项卡的时候&#xff0c;我的js代码是这样的 import React, { Component } from react import ./css/02-maizuo.css export default class App extends Component {state {list: [{id: 1,text: 电影},{id: 2,text: 影院}, {id: 3,text: 我的}…

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天&#xff0c;这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址&#xff1a;www.drhchina.com 防泄密系统的主要功能通常包括&#xff1a; 文…

【力扣白嫖日记】1965.丢失信息的雇员

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1965.丢失信息的雇员 表&#xff1a;Employees 列名类型employee_idintnamevarchar employee_id 是该表中具…

数据结构-邻接链表

介绍 邻接矩阵是运用较多的一种储存图的方法&#xff0c;但如果一张网图边数较少&#xff0c;就会出现二维矩阵中大部分数据为0的情况&#xff0c;浪费储存空间 为了避免空间浪费&#xff0c;也可以采用数组与链表结合的方式来存储图 假设有这样一张图 我们可以先用一个数组…

Facebook元宇宙探索:虚拟社交的新时代

在数字化时代的浪潮中&#xff0c;人类社交的模式和形式正在经历着翻天覆地的变化。而当下&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正积极探索着元宇宙的未来。元宇宙被认为是虚拟世界的下一步进化&#xff0c;它将重新定义人们的社交方式、娱乐体验以…

redis的搭建 RabbitMq搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

【Linux 04】编辑器 vim 详细介绍

文章目录 &#x1f308; Ⅰ 基本概念&#x1f308; Ⅱ 基本操作1. 进入 / 退出 vim2. vim 模式切换 &#x1f308; Ⅲ 命令模式1. 光标的移动2. 复制与粘贴3. 剪切与删除4. 撤销与恢复 &#x1f308; Ⅳ 底行模式1. 保存文件2. 查找字符3. 退出文件4. 替换内容5. 显示行号6. 外…

vue框架-vue-cli

vue-cli Vue CLI是一个官方的脚手架工具,用于快速搭建基于Vue.js的项目。Vue CLI提供了一整套可配置的脚手架,可以帮助开发人员快速构建现代化的Web应用程序。 Vue CLI通过提供预先配置好的Webpack模板和插件,使得开发人员可以在不需要手动编写Webpack配置的情况下快速创建…

2.20 Qt day1

一. 思维导图 二. 消化常用类的使用&#xff0c;以及常用成员函数对应的功能 按钮类QPushButton&#xff1a; mywidget.h&#xff1a; #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QPushButton>//按钮类 #include<QIcon>class MyW…