AIGC drug design 人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用
人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用
1. 人工智能生成模型:解密 GPT 的工作原理
目录
-
引言
1.1 背景介绍
1.2 人工智能生成模型的兴起
1.3 GPT 系列模型的地位与影响 -
GPT 模型概述
2.1 什么是 GPT
2.2 GPT 的发展历程
2.3 GPT 与其他生成模型的对比 -
GPT 的核心原理
3.1 转换器架构(Transformer Architecture)
3.1.1 自注意力机制(Self-Attention)
3.1.2 多头注意力(Multi-Head Attention)
3.1.3 前馈神经网络(Feed-Forward Neural Networks)
3.2 训练过程
3.2.1 预训练与微调
3.2.2 损失函数与优化算法
3.3 生成文本的机制
3.3.1 语言建模
3.3.2 采样策略 -
GPT 在各领域的应用
4.1 自然语言处理
4.1.1 机器翻译
4.1.2 文本生成
4.2 代码生成与理解
4.3 科学研究与创新
4.3.1 药物发现
4.3.2 化学结构生成 -
生成 SMILES 的原理与实现
5.1 SMILES 简介
5.1.1 SMILES 的定义
5.1.2 SMILES 的应用
5.2 使用 GPT 生成 SMILES
5.2.1 数据准备
5.2.2 模型训练
5.2.3 生成与验证
5.3 Python 实现示例
5.3.1 环境配置
5.3.2 代码示例
5.3.3 结果分析
5.4 挑战与未来展望 -
GPT 模型的优势与局限
6.1 优势
6.1.1 强大的语言理解与生成能力
6.1.2 广泛的应用场景
6.2 局限
6.2.1 计算资源需求
6.2.2 数据偏见与伦理问题 -
未来发展趋势
7.1 模型规模与效率优化
7.2 多模态生成模型
7.3 可解释性与透明性
7.4 跨领域协作与应用拓展 -
结论
8.1 主要发现
8.2 对未来的展望
5.3 Python 实现示例:生成 SMILES
以下是一个使用 Python 生成 SMILES 的示例代码。该示例使用了 transformers 库中的预训练 GPT-2 模型,并进行了简单的微调以生成 SMILES 字符串。
5.3.1 环境配置
首先,确保安装必要的库:
pip install transformers torch pandas scikit-learn
5.3.2 代码示例
import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel, Trainer, TrainingArguments
import pandas as pd# 1. 数据准备
# 假设我们有一个包含 SMILES 的 CSV 文件
data = pd.read_csv('smiles_dataset.csv') # CSV 文件需包含 'smiles' 列
smiles_list = data['smiles'].tolist()# 2. 模型与分词器加载
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')# 添加特殊字符(如果 SMILES 包含 GPT-2 未见过的字符)
special_tokens = {'additional_special_tokens': ['[CH]', '[OH]', '[NH]']}
num_added_toks = tokenizer.add_special_tokens(special_tokens)
model.resize_token_embeddings(len(tokenizer))# 3. 数据编码
def encode_smiles(smiles):return tokenizer.encode(smiles, add_special_tokens=True)encoded_smiles = [encode_smiles(smiles) for smiles in smiles_list]# 4. 创建训练数据集
from torch.utils.data import Datasetclass SMILESDataset(Dataset):def __init__(self, encoded_smiles):self.input_ids = encoded_smilesdef __len__(self):return len(self.input_ids)def __getitem__(self, idx):return torch.tensor(self.input_ids[idx])dataset = SMILESDataset(encoded_smiles)# 5. 训练参数设定
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=8,save_steps=500,save_total_limit=2,logging_steps=100,prediction_loss_only=True,
)# 6. 训练器初始化
trainer = Trainer(model=model,args=training_args,train_dataset=dataset,
)# 7. 模型训练
trainer.train()# 8. 保存模型
model.save_pretrained('gpt2-smiles')
tokenizer.save_pretrained('gpt2-smiles')# 9. 生成 SMILES 示例
def generate_smiles(prompt, max_length=50):inputs = tokenizer.encode(prompt, return_tensors='pt')outputs = model.generate(inputs, max_length=max_length, num_return_sequences=1, no_repeat_ngram_size=2, early_stopping=True)generated = tokenizer.decode(outputs[0], skip_special_tokens=True)return generated# 示例生成
prompt = "CCO" # 乙醇的 SMILES
generated_smiles = generate_smiles(prompt)
print(f"Generated SMILES: {generated_smiles}")
5.3.3 结果分析
上述代码展示了如何使用预训练的 GPT-2 模型进行简单的微调,以生成化学分子的 SMILES 表示。具体步骤包括:
- 数据准备:加载包含 SMILES 字符串的数据集。
- 模型与分词器加载:使用 GPT-2 作为基础模型,并根据需要添加特殊字符。
- 数据编码:将 SMILES 字符串编码为模型可理解的输入格式。
- 创建训练数据集:定义 PyTorch 数据集以供训练器使用。
- 训练参数设定:配置训练参数,如训练轮数、批次大小等。
- 训练器初始化与训练:使用
Trainer进行模型微调。 - 生成 SMILES:输入一个前缀,生成新的 SMILES 字符串。
注意事项:
- 数据质量:生成质量高度依赖于训练数据的质量和多样性。
- 模型复杂度:GPT-2 模型可能需要更大的模型规模和更多的训练数据以生成高质量的 SMILES。
- 后处理验证:生成的 SMILES 可能需要通过化学验证工具(如 RDKit)进行合法性检查。
5.3.4 完整示例的扩展
为了进一步提高生成 SMILES 的质量,可以考虑以下扩展:
- 使用专门针对化学数据训练的模型:如 ChemBERTa 或其他化学领域的预训练模型。
- 引入化学知识:在训练过程中加入化学规则或约束,以提升生成的合法性。
- 优化生成策略:采用束搜索(Beam Search)、温度采样(Temperature Sampling)等策略优化生成结果。
2. 人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用
目录
-
引言
1.1 背景与动机
1.2 人工智能在药物设计中的应用
1.3 生成式模型在药物发现中的重要性
1.4 本文结构 -
生成式人工智能模型概述
2.1 生成式模型的定义与分类
2.2 常见生成式模型介绍
2.2.1 生成对抗网络(GAN)
2.2.2 变分自编码器(VAE)
2.2.3 自回归模型(如 GPT)
2.3 生成式模型在化学中的应用案例 -
SMILES 简介与重要性
3.1 SMILES 的定义
3.2 SMILES 的结构与表示
3.3 SMILES 在药物设计中的应用
3.4 SMILES 的优势与局限 -
基于 GPT 的 SMILES 生成原理
4.1 GPT 模型概述
4.1.1 Transformer 架构
4.1.2 自注意力机制
4.2 GPT 在序列生成中的优势
4.3 GPT 模型适应化学结构的策略
4.3.1 特殊字符与标记
4.3.2 数据预处理与编码 -
人工智能生成式药物设计的步骤
5.1 数据收集与准备
5.1.1 数据源与获取
5.1.2 数据清洗与预处理
5.2 模型选择与架构设计
5.2.1 模型选择依据
5.2.2 模型架构调整
5.3 模型训练与优化
5.3.1 训练参数设定
5.3.2 超参数调优
5.4 生成 SMILES 与后处理
5.4.1 SMILES 生成策略
5.4.2 生成结果的验证与筛选
5.5 生成分子的评估与优化
5.5.1 化学有效性评估
5.5.2 药物相似性与多样性
5.5.3 结构优化与修饰 -
Python 实现示例:基于 GPT 的 SMILES 生成
6.1 环境配置
6.1.1 必要库的安装
6.1.2 硬件与软件要求
6.2 数据准备
6.2.1 数据集格式
6.2.2 数据加载与预处理
6.3 模型加载与微调
6.3.1 预训练模型选择
6.3.2 模型微调步骤
6.4 SMILES 生成与验证
6.4.1 生成策略实现
6.4.2 使用 RDKit 进行合法性检查
6.5 完整代码示例
6.5.1 代码结构概述
6.5.2 关键代码解析
6.5.3 运行与结果展示 -
案例研究:基于 GPT 的药物设计应用
7.1 案例背景
7.2 数据集选择与处理
7.3 模型训练与生成
7.4 生成分子的分析与评估
7.5 成果与讨论 -
挑战与未来展望
8.1 当前面临的主要挑战
8.1.1 数据质量与多样性
8.1.2 模型的可解释性
8.1.3 生成分子的化学有效性
8.2 未来发展方向
8.2.1 多模态生成模型
8.2.2 联合优化与强化学习
8.2.3 跨领域协作与集成 -
结论
9.1 主要成果总结
9.2 对药物设计的影响
9.3 未来工作的建议
第6章 Python 实现示例:基于 GPT 的 SMILES 生成
以下内容将详细介绍如何使用 Python 及相关库,基于 GPT 模型生成新的 SMILES 字符串。此示例涵盖数据准备、模型微调、生成与验证的全过程。
6.1 环境配置
6.1.1 必要库的安装
首先,确保安装以下必要的 Python 库:
pip install transformers torch pandas scikit-learn rdkit-pypi
- transformers:Hugging Face 提供的预训练模型库。
- torch:PyTorch 深度学习框架。
- pandas:数据处理与分析。
- scikit-learn:机器学习工具库。
- rdkit-pypi:用于化学信息学的 RDKit 库。
6.1.2 硬件与软件要求
- 硬件:建议使用具备 CUDA 支持的 NVIDIA GPU 以加速训练过程。
- 软件:Python 3.7 及以上版本,推荐使用虚拟环境(如 conda 或 virtualenv)以管理依赖。
6.2 数据准备
6.2.1 数据集格式
假设您拥有一个包含 SMILES 字符串的数据集,存储在 CSV 文件中,文件格式如下:
smiles
CCO
CCN
CCC
...
6.2.2 数据加载与预处理
import pandas as pd
from transformers import GPT2Tokenizer# 加载数据集
data = pd.read_csv('your_smiles_dataset.csv') # 替换为您的文件路径
smiles_list = data['smiles'].tolist()# 初始化 GPT-2 分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 添加特殊字符(如果需要)
special_tokens = {'additional_special_tokens': ['[CH]', '[OH]', '[NH]']}
num_added_toks = tokenizer.add_special_tokens(special_tokens)# 加载预训练模型时需要调整词表大小
from transformers import GPT2LMHeadModel
model = GPT2LMHeadModel.from_pretrained('gpt2')
model.resize_token_embeddings(len(tokenizer))
说明:
- 根据 SMILES 的特性,可能需要添加一些特殊字符以更好地表示化学结构。
- 调整模型的词表以包含新添加的特殊字符。
6.2.3 数据编码
将 SMILES 字符串编码为模型可接受的输入格式。
def encode_smiles(smiles):return tokenizer.encode(smiles, add_special_tokens=True)encoded_smiles = [encode_smiles(smiles) for smiles in smiles_list]
6.3 模型加载与微调
6.3.1 预训练模型选择
本示例使用 GPT-2 作为基础模型。您也可以选择其他自回归模型,如 GPT-Neo 或 GPT-J。
6.3.2 模型微调步骤
使用 Hugging Face 的 Trainer API 进行模型微调。
import torch
from torch.utils.data import Dataset
from transformers import Trainer, TrainingArguments# 定义 PyTorch 数据集
class SMILESDataset(Dataset):def __init__(self, encoded_smiles):self.input_ids = encoded_smilesdef __len__(self):return len(self.input_ids)def __getitem__(self, idx):return torch.tensor(self.input_ids[idx])# 创建数据集对象
dataset = SMILESDataset(encoded_smiles)# 定义训练参数
training_args = TrainingArguments(output_dir='./gpt2-smiles',overwrite_output_dir=True,num_train_epochs=5,per_device_train_batch_size=16,save_steps=500,save_total_limit=2,logging_steps=100,prediction_loss_only=True,
)# 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=dataset,
)# 开始训练
trainer.train()# 保存微调后的模型
model.save_pretrained('gpt2-smiles')
tokenizer.save_pretrained('gpt2-smiles')
说明:
- num_train_epochs:训练轮数,可根据数据集大小和模型表现调整。
- per_device_train_batch_size:根据 GPU 显存调整批次大小。
- save_steps 和 logging_steps:控制模型保存和日志记录的频率。
6.4 SMILES 生成与验证
6.4.1 生成策略实现
定义生成 SMILES 的函数,利用微调后的模型生成新的 SMILES 字符串。
def generate_smiles(prompt, max_length=50, num_return_sequences=10, temperature=1.0):input_ids = tokenizer.encode(prompt, return_tensors='pt')output_sequences = model.generate(input_ids=input_ids,max_length=max_length,temperature=temperature,top_k=50,top_p=0.95,num_return_sequences=num_return_sequences,do_sample=True,repetition_penalty=1.2,eos_token_id=tokenizer.eos_token_id)generated_smiles = []for generated_sequence in output_sequences:text = tokenizer.decode(generated_sequence, skip_special_tokens=True)generated_smiles.append(text)return generated_smiles
参数说明:
- prompt:生成 SMILES 的起始字符串。
- max_length:生成序列的最大长度。
- num_return_sequences:生成的不同序列数量。
- temperature:控制生成文本的随机性,值越高,生成越随机。
- top_k 和 top_p:控制采样策略,防止生成重复或无意义的序列。
- repetition_penalty:惩罚重复生成的概率。
6.4.2 使用 RDKit 进行合法性检查
生成的 SMILES 可能包含无效的化学结构,使用 RDKit 进行验证。
from rdkit import Chemdef validate_smiles(smiles):mol = Chem.MolFromSmiles(smiles)return mol is not None# 示例生成与验证
prompt = "CCO" # 乙醇的 SMILES
generated_smiles = generate_smiles(prompt)valid_smiles = [smiles for smiles in generated_smiles if validate_smiles(smiles)]
print("生成的有效 SMILES:")
for smi in valid_smiles:print(smi)
说明:
- Chem.MolFromSmiles:尝试将 SMILES 转换为分子对象,失败则表示 SMILES 无效。
- 过滤出有效的 SMILES 以供后续分析或使用。
6.5 完整代码示例
以下是整合上述步骤的完整代码示例:
import pandas as pd
import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel, Trainer, TrainingArguments
from torch.utils.data import Dataset
from rdkit import Chem# 1. 数据准备
class SMILESDataset(Dataset):def __init__(self, encoded_smiles):self.input_ids = encoded_smilesdef __len__(self):return len(self.input_ids)def __getitem__(self, idx):return torch.tensor(self.input_ids[idx])def encode_smiles(smiles, tokenizer):return tokenizer.encode(smiles, add_special_tokens=True)# 2. 加载数据集
data = pd.read_csv('your_smiles_dataset.csv') # 替换为您的文件路径
smiles_list = data['smiles'].tolist()
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 添加特殊字符(如果需要)
special_tokens = {'additional_special_tokens': ['[CH]', '[OH]', '[NH]']}
num_added_toks = tokenizer.add_special_tokens(special_tokens)# 加载并调整模型
model = GPT2LMHeadModel.from_pretrained('gpt2')
model.resize_token_embeddings(len(tokenizer))# 编码 SMILES
encoded_smiles = [encode_smiles(smiles, tokenizer) for smiles in smiles_list]
dataset = SMILESDataset(encoded_smiles)# 3. 训练参数设定
training_args = TrainingArguments(output_dir='./gpt2-smiles',overwrite_output_dir=True,num_train_epochs=5,per_device_train_batch_size=16,save_steps=500,save_total_limit=2,logging_steps=100,prediction_loss_only=True,
)# 4. 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=dataset,
)# 5. 模型训练
trainer.train()# 6. 保存模型
model.save_pretrained('gpt2-smiles')
tokenizer.save_pretrained('gpt2-smiles')# 7. 定义生成函数
def generate_smiles(prompt, max_length=50, num_return_sequences=10, temperature=1.0):input_ids = tokenizer.encode(prompt, return_tensors='pt')output_sequences = model.generate(input_ids=input_ids,max_length=max_length,temperature=temperature,top_k=50,top_p=0.95,num_return_sequences=num_return_sequences,do_sample=True,repetition_penalty=1.2,eos_token_id=tokenizer.eos_token_id)generated_smiles = []for generated_sequence in output_sequences:text = tokenizer.decode(generated_sequence, skip_special_tokens=True)generated_smiles.append(text)return generated_smiles# 8. 定义验证函数
def validate_smiles(smiles):mol = Chem.MolFromSmiles(smiles)return mol is not None# 9. 生成与验证
prompt = "CCO" # 乙醇的 SMILES
generated_smiles = generate_smiles(prompt)valid_smiles = [smiles for smiles in generated_smiles if validate_smiles(smiles)]
print("生成的有效 SMILES:")
for smi in valid_smiles:print(smi)
运行步骤:
- 准备数据:确保
your_smiles_dataset.csv文件存在,并包含smiles列。 - 配置环境:安装所需库,并确保硬件支持(建议使用 GPU)。
- 执行脚本:运行上述 Python 脚本,完成模型训练与 SMILES 生成。
- 查看结果:生成的有效 SMILES 将在控制台输出。
6.5.1 代码结构概述
- 数据准备:加载和编码 SMILES 数据。
- 模型加载与微调:加载预训练 GPT-2 模型,进行微调。
- 生成与验证:生成新的 SMILES,并使用 RDKit 验证其合法性。
6.5.2 关键代码解析
- 添加特殊字符:根据 SMILES 的特点,添加可能未在 GPT-2 中出现的特殊字符,以提高模型生成能力。
- 模型微调:使用自定义数据集对预训练模型进行微调,使其更适合 SMILES 生成任务。
- 生成策略:结合温度、top-k、top-p 等参数,控制生成文本的多样性与质量。
- 合法性验证:通过 RDKit 检查生成的 SMILES 是否对应有效的化学结构,过滤无效结果。
6.5.3 运行与结果展示
运行脚本后,模型将进行训练,并在训练完成后生成新的 SMILES 字符串。示例输出可能如下:
生成的有效 SMILES:
CCOCC
CCOCN
CCOCCO
CCOCCN
...
注意事项:
- 数据质量:高质量、多样性的 SMILES 数据集有助于生成更有效的分子结构。
- 模型规模:根据数据集规模和复杂度,调整模型大小和训练参数,以获得最佳性能。
- 后处理步骤:生成的 SMILES 可能需要进一步的筛选和优化,以满足特定的药物设计需求。
结语
通过上述详细的大纲和 Python 实现示例,您可以深入了解如何利用 GPT 模型进行生成式药物设计,特别是 SMILES 字符串的生成与应用。生成式人工智能在药物设计中展现出巨大的潜力,结合高效的模型训练与验证方法,可以加速新药物的发现与优化过程。希望本文能为您的学习与研究提供有价值的参考,如有更多问题,欢迎进一步交流!
相关文章:
AIGC drug design 人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用
人工智能生成式药物设计:基于 GPT 的 SMILES 生成与应用 1. 人工智能生成模型:解密 GPT 的工作原理 目录 引言 1.1 背景介绍 1.2 人工智能生成模型的兴起 1.3 GPT 系列模型的地位与影响 GPT 模型概述 2.1 什么是 GPT 2.2 GPT 的发展历程 2.3 GPT 与其…...
Python面试常见问题及答案4
一、内存管理相关 问题:Python中的垃圾回收机制是如何工作的? 答案:Python主要使用引用计数来进行垃圾回收,当对象的引用计数为0时,该对象就会被垃圾回收器回收。此外,Python还有一个循环垃圾收集器来处理循…...
开启第二阶段---蓝桥杯
一、12.10--数据类型的范围及转化 今天是刚开始,一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型,如果数值超出了 int 的范围,就会发生溢出错误。为了避免这个问题,可以将数字表示为 long 类型,方法…...
npm内存溢出
项目过大运行项目内存溢出 报错代码 运行内存溢出 increase-memory-limit ‘“node --max-old-space-size8192”’ 不是内部或外部命令,也不是可运行的程序 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of m…...
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…...
Android系统卡启动问题排查
Android系统启动正常来说会涉及到如下几个过程: 引导加载程序(Bootloader)Linux内核(Kernel),负责硬件抽象、内存管理、进程管理、网络堆栈等init进程 init进程读取init.rc配置文件,用于启动各…...
STP(生成树协议)
STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…...
【前端面试】随机、结构赋值、博弈题
解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。 1.…...
Volta——开箱即用的Node.js 版本管理工具
Volta volta 是一个较新的 Node.js 版本管理器,旨在简化 Node.js 和其他工具的安装和管理,在 2019 年出世,仍在积极开发中。Volta 采用了与 nvm 不同的方法:它不是管理 Node.js 的多个版本,而是管理项目及其依赖项。当…...
ubuntu 磁盘空间满,找不到占用文件的目录
解决方法: 检查磁盘空间: 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录: 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录,再逐一进入子目录使用相同命令查找。 清理缓存和临时文件: 清理 /t…...
1. 机器学习基本知识(5)——练习题(参考答案)
20.🔗本章代码笔记📓链接(需要🪜):(01_the_machine_learning_landscape.ipynb - Colab (google.com)) 如果你不想通过上面的官方网址下载本章的笔记,还可以在本篇博文的…...
spark-sql 备忘录
wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 读取json 文件 并通过sql 执行 join 查询 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…...
基于softmax回归的多分类
基于softmax回归的多分类任务是机器学习领域中的一种常见应用。softmax回归,又称多项逻辑回归或多类逻辑回归,是逻辑回归在多分类问题上的推广。以下是对基于softmax回归的多分类任务的详细解释: 一、softmax回归的原理 softmax回归的核心思想是通过softmax函数将输入数据…...
bs4基本运用
1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。 本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰&…...
MySQL 时区参数 time_zone 详解
文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...
Redis - 消息队列 Stream
一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...
Docker:国内加速源
阿里云docker加速云: sudo tee /etc/docker/daemon.json <<EOF { “registry-mirrors”: [“https://euf11uji.mirror.aliyuncs.com”] } EOFhttps://docker.mozhu.dev/ sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": [&qu…...
Android Studio更改项目使用的JDK
一、吐槽 过去,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 原本可以在这修改JDK: 但大家都知道,Android Studio的狗屎性能,再加…...
ubuntu+ros新手笔记(四):gazebo无法加载
以下为ChatGPT 的解决方案,对我来说是可行的!! 我按照第2步操作就解决辣!! 我的提问: 在ubuntu 22.04 和ros2 humble环境下,gazebo加载不了 ChatGPT 回答: 在 Ubuntu 22.04 和 …...
vue季度选择器(antd2.0 版本无此控件,单独写一个)
vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
