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 教程:蛋白配体…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
