Chromium 使用安全 DNS功能源码分析c++
一、选项页安全dns选项如下图:
二、那么如何自定义安全dns功能呢?
1、先看前端部分代码调用
shared.rollup.jsclass PrivacyPageBrowserProxyImpl {.................................................................getSecureDnsResolverList() {return sendWithPromise("getSecureDnsResolverList") //获取dns列表}getSecureDnsSetting() {return sendWithPromise("getSecureDnsSetting") }isValidConfig(entry) {return sendWithPromise("isValidConfig", entry) //检测dns是否正确}probeConfig(entry) {return sendWithPromise("probeConfig", entry)}static getInstance() {return instance$g || (instance$g = new PrivacyPageBrowserProxyImpl)}static setInstance(obj) {instance$g = obj}
}
2、看c++代码对应的注册函数
chrome\browser\ui\webui\settings\settings_secure_dns_handler.cc
void SecureDnsHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("getSecureDnsResolverList",base::BindRepeating(&SecureDnsHandler::HandleGetSecureDnsResolverList,base::Unretained(this)));web_ui()->RegisterMessageCallback("getSecureDnsSetting",base::BindRepeating(&SecureDnsHandler::HandleGetSecureDnsSetting,base::Unretained(this)));web_ui()->RegisterMessageCallback("isValidConfig",base::BindRepeating(&SecureDnsHandler::HandleIsValidConfig,base::Unretained(this)));web_ui()->RegisterMessageCallback("probeConfig", base::BindRepeating(&SecureDnsHandler::HandleProbeConfig,base::Unretained(this)));web_ui()->RegisterMessageCallback("recordUserDropdownInteraction",base::BindRepeating(&SecureDnsHandler::HandleRecordUserDropdownInteraction,base::Unretained(this)));
}1、先看 前端"getSecureDnsResolverList "dns列表对应c+++获取函数
base::Value::List SecureDnsHandler::GetSecureDnsResolverList() {base::Value::List resolvers;// Add a custom option to the front of the listbase::Value::Dict custom;custom.Set("name", l10n_util::GetStringUTF8(IDS_SETTINGS_CUSTOM));custom.Set("value", std::string()); // Empty value means custom.custom.Set("policy", std::string());resolvers.Append(std::move(custom));//providers_ 是dns数据列表来源,定义参考下面介绍for (const auto* entry : providers_) {net::DnsOverHttpsConfig doh_config({entry->doh_server_config});base::Value::Dict dict;dict.Set("name", entry->ui_name);dict.Set("value", doh_config.ToString());dict.Set("policy", entry->privacy_policy);resolvers.Append(std::move(dict));}// Randomize the order of the resolvers, but keep custom in first place.base::RandomShuffle(std::next(resolvers.begin()), resolvers.end());return resolvers;
}2、重点看providers_函数 ,其赋值和定义看代码:chrome\browser\ui\webui\settings\settings_secure_dns_handler.hstatic net::DohProviderEntry::List GetFilteredProviders();net::DohProviderEntry::List providers_ = GetFilteredProviders();std::unique_ptr<chrome_browser_net::DnsProbeRunner> runner_;chrome_browser_net::DnsProbeRunner::NetworkContextGetternetwork_context_getter_ =base::BindRepeating(&SecureDnsHandler::GetNetworkContext,base::Unretained(this));// static
net::DohProviderEntry::List SecureDnsHandler::GetFilteredProviders() {return secure_dns::ProvidersForCountry(secure_dns::SelectEnabledProviders(net::DohProviderEntry::GetList()),country_codes::GetCurrentCountryID());
}providers_ 通过GetFilteredProviders()获取列表3、最后看列表定义net::DohProviderEntry::GetList()
net\dns\public\doh_provider_entry.cc
const DohProviderEntry::List& DohProviderEntry::GetList() {// See /net/docs/adding_doh_providers.md for instructions on modifying this// DoH provider list.//// The provider names in these entries should be kept in sync with the// DohProviderId histogram suffix list in// tools/metrics/histograms/metadata/histogram_suffixes_list.xml.static const base::NoDestructor<DohProviderEntry::List> providers{{new DohProviderEntry("AlekBergNl",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderAlekBergNl, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kAlekBergNl,/*ip_strs=*/{}, /*dns_over_tls_hostnames=*/{},"https://dnsnl.alekberg.net/dns-query{?dns}",/*ui_name=*/"alekberg.net (NL)",/*privacy_policy=*/"https://alekberg.net/privacy",/*display_globally=*/false,/*display_countries=*/{"NL"}, LoggingLevel::kNormal),new DohProviderEntry("CleanBrowsingAdult",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCleanBrowsingAdult, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"185.228.168.10", "185.228.169.11", "2a0d:2a00:1::1","2a0d:2a00:2::1"},/*dns_over_tls_hostnames=*/{"adult-filter-dns.cleanbrowsing.org"},"https://doh.cleanbrowsing.org/doh/adult-filter{?dns}",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false, /*display_countries=*/{},LoggingLevel::kNormal),new DohProviderEntry("CleanBrowsingFamily",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCleanBrowsingFamily, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kCleanBrowsingFamily,{"185.228.168.168", "185.228.169.168","2a0d:2a00:1::", "2a0d:2a00:2::"},/*dns_over_tls_hostnames=*/{"family-filter-dns.cleanbrowsing.org"},"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",/*ui_name=*/"CleanBrowsing (Family Filter)",/*privacy_policy=*/"https://cleanbrowsing.org/privacy",/*display_globally=*/true, /*display_countries=*/{},LoggingLevel::kNormal),new DohProviderEntry("CleanBrowsingSecure",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCleanBrowsingSecure, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"185.228.168.9", "185.228.169.9", "2a0d:2a00:1::2","2a0d:2a00:2::2"},/*dns_over_tls_hostnames=*/{"security-filter-dns.cleanbrowsing.org"},"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",/*ui_name=*/"", /*privacy_policy=*/"", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Cloudflare",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCloudflare, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kCloudflare,{"1.1.1.1", "1.0.0.1", "2606:4700:4700::1111","2606:4700:4700::1001"},/*dns_over_tls_hostnames=*/{"one.one.one.one", "1dot1dot1dot1.cloudflare-dns.com"},"https://chrome.cloudflare-dns.com/dns-query",/*ui_name=*/"Cloudflare (1.1.1.1)","https://developers.cloudflare.com/1.1.1.1/privacy/"/*privacy_policy=*/"public-dns-resolver/",/*display_globally=*/true, /*display_countries=*/{},LoggingLevel::kExtra),new DohProviderEntry("Comcast",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderComcast, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"75.75.75.75", "75.75.76.76", "2001:558:feed::1","2001:558:feed::2"},/*dns_over_tls_hostnames=*/{"dot.xfinity.com"},"https://doh.xfinity.com/dns-query{?dns}", /*ui_name=*/"",/*privacy_policy*/ "", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kExtra),new DohProviderEntry("Cox",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCox, base::FEATURE_DISABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"68.105.28.11", "68.105.28.12", "2001:578:3f::30"},/*dns_over_tls_hostnames=*/{"dot.cox.net"},"https://doh.cox.net/dns-query",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false, /*display_countries=*/{},LoggingLevel::kNormal),new DohProviderEntry("Cznic",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderCznic, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kCznic,{"185.43.135.1", "193.17.47.1", "2001:148f:fffe::1","2001:148f:ffff::1"},/*dns_over_tls_hostnames=*/{"odvr.nic.cz"}, "https://odvr.nic.cz/doh",/*ui_name=*/"CZ.NIC ODVR",/*privacy_policy=*/"https://www.nic.cz/odvr/",/*display_globally=*/false, /*display_countries=*/{"CZ"},LoggingLevel::kNormal),new DohProviderEntry("Dnssb",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderDnssb, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kDnsSb,{"185.222.222.222", "45.11.45.11", "2a09::", "2a11::"},/*dns_over_tls_hostnames=*/{"dns.sb"},"https://doh.dns.sb/dns-query{?dns}", /*ui_name=*/"DNS.SB",/*privacy_policy=*/"https://dns.sb/privacy/",/*display_globally=*/false, /*display_countries=*/{"EE", "DE"},LoggingLevel::kNormal),new DohProviderEntry("Google",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderGoogle, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kGoogle,{"8.8.8.8", "8.8.4.4", "2001:4860:4860::8888","2001:4860:4860::8844"},/*dns_over_tls_hostnames=*/{"dns.google", "dns.google.com", "8888.google"},"https://dns.google/dns-query{?dns}",/*ui_name=*/"Google (Public DNS)","https://developers.google.com/speed/public-dns/"/*privacy_policy=*/"privacy",/*display_globally=*/true, /*display_countries=*/{},LoggingLevel::kExtra),new DohProviderEntry("GoogleDns64",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderGoogleDns64, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"2001:4860:4860::64", "2001:4860:4860::6464"},/*dns_over_tls_hostnames=*/{"dns64.dns.google"},"https://dns64.dns.google/dns-query{?dns}",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Iij",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderIij, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kIij, /*ip_strs=*/{},/*dns_over_tls_hostnames=*/{}, "https://public.dns.iij.jp/dns-query",/*ui_name=*/"IIJ (Public DNS)",/*privacy_policy=*/"https://public.dns.iij.jp/",/*display_globally=*/false, /*display_countries=*/{"JP"},LoggingLevel::kNormal),new DohProviderEntry("NextDns",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderNextDns, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kNextDns, /*ip_strs=*/{},/*dns_over_tls_hostnames=*/{}, "https://chromium.dns.nextdns.io",/*ui_name=*/"NextDNS",/*privacy_policy=*/"https://nextdns.io/privacy",/*display_globally=*/false, /*display_countries=*/{"US"},LoggingLevel::kNormal),new DohProviderEntry("OpenDNS",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderOpenDNS, base::FEATURE_ENABLED_BY_DEFAULT),DohProviderIdForHistogram::kOpenDns,{"208.67.222.222", "208.67.220.220", "2620:119:35::35","2620:119:53::53"},/*dns_over_tls_hostnames=*/{},"https://doh.opendns.com/dns-query{?dns}", /*ui_name=*/"OpenDNS","https://www.cisco.com/c/en/us/about/legal/"/*privacy_policy=*/"privacy-full.html",/*display_globally=*/true, /*display_countries=*/{},LoggingLevel::kNormal),new DohProviderEntry("OpenDNSFamily",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderOpenDNSFamily, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"208.67.222.123", "208.67.220.123", "2620:119:35::123","2620:119:53::123"},/*dns_over_tls_hostnames=*/{},"https://doh.familyshield.opendns.com/dns-query{?dns}",/*ui_name=*/"", /*privacy_policy=*/"", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Quad9Cdn",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderQuad9Cdn, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"9.9.9.11", "149.112.112.11", "2620:fe::11", "2620:fe::fe:11"},/*dns_over_tls_hostnames=*/{"dns11.quad9.net"},"https://dns11.quad9.net/dns-query", /*ui_name=*/"",/*privacy_policy=*/"", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Quad9Insecure",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderQuad9Insecure, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"9.9.9.10", "149.112.112.10", "2620:fe::10", "2620:fe::fe:10"},/*dns_over_tls_hostnames=*/{"dns10.quad9.net"},"https://dns10.quad9.net/dns-query", /*ui_name=*/"",/*privacy_policy=*/"", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Quad9Secure",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderQuad9Secure, base::FEATURE_DISABLED_BY_DEFAULT),DohProviderIdForHistogram::kQuad9Secure,{"9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"},/*dns_over_tls_hostnames=*/{"dns.quad9.net", "dns9.quad9.net"},"https://dns.quad9.net/dns-query", /*ui_name=*/"Quad9 (9.9.9.9)",/*privacy_policy=*/"https://www.quad9.net/home/privacy/",/*display_globally=*/true, /*display_countries=*/{},LoggingLevel::kExtra),new DohProviderEntry("Quickline",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderQuickline, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"212.60.61.246", "212.60.63.246", "2001:1a88:10:ffff::1","2001:1a88:10:ffff::2"},/*dns_over_tls_hostnames=*/{"dot.quickline.ch"},"https://doh.quickline.ch/dns-query{?dns}",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Spectrum1",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderSpectrum1, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"209.18.47.61", "209.18.47.62", "2001:1998:0f00:0001::1","2001:1998:0f00:0002::1"},/*dns_over_tls_hostnames=*/{},"https://doh-01.spectrum.com/dns-query{?dns}",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Spectrum2",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderSpectrum2, base::FEATURE_ENABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"209.18.47.61", "209.18.47.62", "2001:1998:0f00:0001::1","2001:1998:0f00:0002::1"},/*dns_over_tls_hostnames=*/{},"https://doh-02.spectrum.com/dns-query{?dns}",/*ui_name=*/"", /*privacy_policy=*/"",/*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),new DohProviderEntry("Switch",MAKE_BASE_FEATURE_WITH_STATIC_STORAGE(DohProviderSwitch, base::FEATURE_DISABLED_BY_DEFAULT),/*provider_id_for_histogram=*/absl::nullopt,{"130.59.31.251", "130.59.31.248", "2001:620:0:ff::2","2001:620:0:ff::3"},/*dns_over_tls_hostnames=*/{"dns.switch.ch"},"https://dns.switch.ch/dns-query", /*ui_name=*/"",/*privacy_policy=*/"", /*display_globally=*/false,/*display_countries=*/{}, LoggingLevel::kNormal),}};return *providers;
}
三、至此数据来源分析完毕,如果想要用自己的dns只需要在
net\dns\public\doh_provider_entry.cc
const DohProviderEntry::List& DohProviderEntry::GetList() 函数里面按照此格式追加即可。
不同版本内核的浏览器有所差异。
相关文章:

Chromium 使用安全 DNS功能源码分析c++
一、选项页安全dns选项如下图: 二、那么如何自定义安全dns功能呢? 1、先看前端部分代码调用 shared.rollup.jsclass PrivacyPageBrowserProxyImpl {.................................................................getSecureDnsResolverList() {re…...

10.1 刷题
C语言 C...

车辆重识别(2021ICML改进的去噪扩散概率模型)论文阅读2024/9/29
所谓改进的去噪扩散概率模型主要改进在哪些方面: ①对数似然值的改进 通过对噪声的那个方差和T进行调参,来实现改进。 ②学习 这个参数也就是后验概率的方差。通过数据分析,发现在T非常大的情况下对样本质量几乎没有影响,也就是说…...

828华为云征文|针对Flexus X实例云服务器的CPU和内存性能测评
目录 一、Flexus X实例云服务器简介 1.1 产品摘要 1.2 产品优势 1.3 本次测评服务器规格 二、CPU性能测试 2.1 操作说明 2.2 操作步骤 2.2 结果分析 三、测试内存负载 3.1 操作说明 3.2 操作步骤 3.3 结果分析 四、测试终评 一、Flexus X实例云服务器简介 1.1 产品…...
Python知识点:如何使用Google Cloud IoT与Python进行边缘计算
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Google Cloud IoT与Python进行边缘计算 边缘计算作为一种新兴的计算模式…...

力扣 最小覆盖子串
最小覆盖子串 https://leetcode.cn/problems/minimum-window-substring/ 题目描述 题目分析f 覆盖子串:首先根据题意,要求目标字符串的元素必须都在子串中出现过,这表明可以是乱序出现。所以在解决问题是我们需要对子串和目标字符串做匹配&a…...

python的内存管理机制
python的内存管理机制主要分为三个部分:引用计数、垃圾回收和内存池机制。 引用计数机制: python通过维护每个对象的引用计数来跟踪内存中的对象。当对象被创建时就会有一个引用计数,当对象不再被使用时,引用计数为0,…...

阿布量化:基于 Python 的量化交易框架
阿布量化(AbuQuant) 是一个开源的量化交易框架,专为金融领域的研究者和交易者设计。它基于 Python 语言开发,提供了一整套从数据获取、策略开发、回测分析到交易执行的解决方案。阿布量化不仅能够帮助用户快速实现量化策略的设计与…...

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…...

【tower-boot 系列】开源RocketMQ和阿里云rockerMq 4.x和5.x集成 (一)
RocketMQ 简单介绍 阿里云rockerMq 4.x和5.x集成 一、云平台创建实例 参考文档: 阿里云api 阿里云 创建实例 二、skd集成思路 公司用的RocketMQ一般是自建开源apache的RocketMQ和上阿里云的RocketMQ,目前阿里云支持4.x和5.x版本 项目集成思路&…...

Pikachu-Cross-Site Scripting-反射型xss(post)
查看源代码 ,这是需要先登录,然后再去做xss攻击 使用admin ,123456 登陆; 登陆后,输入的message 内容直接返回 输入 <script>alert(1)</script> 得到xss攻击结果...
Vue3 工具函数(总结)
目录 前言 1.isRef 2.isReactive 3.isReadonly 4.isProxy 5.toRef 6.toRefs 7.unref 8.shallowRef 9.shallowReactive 10.triggerRef 11.customRef 12.markRaw 13.toRaw 14.readonly 15.watchEffect 前言 在 Vue 3 中,除了核心的响应式 API&#x…...

(undone) MIT6.824 Lab1
参考:http://nil.csail.mit.edu/6.824/2021/labs/lab-mr.html task1: 熟悉讲义,尤其是搞明白如何运行测试程序(完成) ------------------------------------------------ start 先看 Introduction 我们的目标:构建一个MapReduce系统。 细节&…...

SpringMVC——REST
路径请求方式请求行为 查询:GET 新增:POST 修改:PUT 删除:DELETE 有重复的东西怎么办...
【牛客网刷题记录】【java】二叉树
(1)二叉树的前中后遍历 最基本的树的遍历,不会可以重开了 public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param root TreeNode类 * return int整型一维…...

一文讲透大语言模型构建流程
最近已有不少大厂都在秋招宣讲了,也有一些在 Offer 发放阶段。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…...

VR视频怎样进行加密和一机一码的使用?--加密(一)
在视频加密领域,我们常见接触的就是在普通设备上使用的加密视频,如电脑、手机、平板等。Vr的发展和兴起给人们带来最真实的体验感受,不仅在游戏行业应用较广,在一些影院或者元宇宙文旅、展厅等视频场景也备受青睐。 随着VR视频场景…...

Ubuntu启动后第一次需要很久才能启动GTK应用问题
Ubuntu启动后第一次需要很久才能启动GTK应用问题 自从升级了 Ubuntu 之后,设备重启,发现打开 Terminal 、Nautilus 以及其他的GTK 应用都很慢,需要至少一分钟的时间启动。 刚开始也是拿着 journalctl 的异常日志去寻找答案,但是没…...

栏目二:Echart绘制动态折线图+柱状图
栏目二:Echart绘制动态折线图柱状图 配置了一个ECharts图表,该图表集成了数据区域缩放、双Y轴显示及多种图表类型(折线图、柱状图、象形柱图)。图表通过X轴数据展示,支持平滑折线展示比率数据并自动添加百分比标识&…...
Gromacs——使用过程中暴露问题分析及学习
gromacs——突变残基蛋白电场MD和基本分析从入门到发SCIENCE:基于Gromacs的蛋白小分子动态模拟全过程解析水溶性蛋白模拟全过程:从准备蛋白结构文件(top、itp、gro文件生成)到模拟数据分析GromacsGROMACS 教程:蛋白配体…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...