网站定制兴田德润实力强百度小程序怎么打开

news/2025/9/24 1:28:59/文章来源:
网站定制兴田德润实力强,百度小程序怎么打开,网站建设网络推广首选公司,新野网站建设前言友情提示:建议阅读本文之前先了解下.Net Core配置体系相关#xff0c;也可以参考本人之前的文章《.Net Core Configuration源码探究 [1]》然后对.Net Core的Configuration体系有一定的了解#xff0c;使得理解起来更清晰。在.Net6中关于配置相关多出一个关于配置相关的类… 前言友情提示:建议阅读本文之前先了解下.Net Core配置体系相关也可以参考本人之前的文章《.Net Core Configuration源码探究 [1]》然后对.Net Core的Configuration体系有一定的了解使得理解起来更清晰。    在.Net6中关于配置相关多出一个关于配置相关的类ConfigurationManager如果大概了解过Minimal API中的WebApplicationBuilder类相信你肯定发现了在Minimal API中的配置相关属性Configuration正是ConfigurationManager的对象。ConfigurationManager本身并没有引入新的技术也不是一个体系只是在原来的基础上进行了进一步的封装使得配置体系有了一个新的外观操作暂且可以理解为新瓶装旧酒。本文我们就来了解下ConfigurationManager类来看下微软为何在.Net6中会引入这么一个新的操作。使用方式关于.Net6中ConfigurationManager的使用方式我们先通过简单的示例演示一下ConfigurationManager configurationManager new(); configurationManager.AddJsonFile(appsettings.json,true,reloadOnChange:true); string serviceName configurationManager[ServiceName]; Console.WriteLine(serviceName);当然关于获取值得其他方式。比如GetSection、GetChildren相关方法还是可以继续使用的或者使用Binder扩展包相关的Getstring()、GetValueNacosOptions(nacos)类似的方法也照样可以使用。那它和之前的.Net Core上的配置使用起来有什么不一样呢我们看一下之前配置相关的使用方式如下所示IConfigurationBuilder configurationBuilder new ConfigurationBuilder().AddJsonFile(appsettings.json); IConfiguration configuration configurationBuilder.Build(); string serviceName configuration[ServiceName]; Console.WriteLine(serviceName);这里需要注意的是如果你是使用ConfigurationManager或者是IConfiguration封装的Helper类相关并没有通过框架体系默认注入的时候一定要注意将其设置为单例模式。其实这个很好理解先不说每次用的时候都去实例化带来的内存CPU啥的三高问题。读取配置文件本质不就是把数据读到内存中吗?内存中有一份缓存这就好了每次都去重新实例去读本身就是一种不规范的方式。许多时候如果你实在不知道该定义成什么样的生命周期可以参考微软的实现方式以ConfigurationManager为例我们可以参考WebApplicationBuilder类中对ConfigurationManager注册的生命周期[点击查看源码[2]]public ConfigurationManager Configuration { get; } new(); //这里注册为了单例模式 Services.AddSingletonIConfiguration(_ Configuration);通过上面我们演示的示例可以看出在ConfigurationManager的时候注册配置和读取配置相关都只是使用了这一个类。而在之前的配置体系中注册配置需要使用IConfigurationBuilder然后通过Build方法得到IConfiguration实例然后读取是通过IConfiguration实例进行的。本身操作配置的时候IConfigurationBuilder和IConfiguration是满足单一职责原则没问题像读取配置这种基础操作应该是越简单越好所以微软才进一步封装了ConfigurationManager来简化配置相关的操作。在.Net6中微软并没有放弃IConfigurationBuilder和IConfiguration因为这是操作配置文件的基础类微软只是借助了它们两个在上面做了进一层封装而已这个是需要我们了解的。源码探究上面我们了解了新的ConfigurationManager的使用方式这里其实我们有疑问了为什么ConfigurationManager可以进行注册和读取操作。上面我提到过ConfigurationManager本身就是新瓶装旧酒而且它只是针对原有的配置体系做了一个新的外观接下来哦我们就从源码入手看一下它的实现方式。定义入手首先来看一下ConfigurationManager的的定义如下所示[点击查看源码[3]]public sealed class ConfigurationManager : IConfigurationBuilder, IConfigurationRoot, IDisposable { }其实只看它的定义就可以解答我们心中的大部分疑惑了之所以ConfigurationManager能够满足IConfigurationBuilder和IConfigurationRoot这两个操作的功能是因为它本身就是实现了这两个接口集它们的功能于一身了IConfigurationRoot接口本身就集成自IConfiguration接口。因此如果给ConfigurationManager换个马甲的话你就会发现还是原来的配方还是原来的味道ConfigurationManager configurationManager new(); IConfigurationBuilder configurationBuilder configurationManager.AddJsonFile(appsettings.json, true, reloadOnChange: true); //尽管放心的调用Build完全不影响啥 IConfiguration configuration configurationBuilder.Build(); string serviceName configuration[ServiceName]; Console.WriteLine(serviceName);这种写法只是为了更好的看清它的本质如果真实操作这么写确实有点画蛇添足了因为ConfigurationManager本身就是为了简化我们的操作。认识IConfigurationBuilder和IConfiguration通过上面我们了解到ConfigurationManager可以直接注册过配置文件就可以直接去操作配置文件里的内容这一步是肯定通过转换得到的毕竟之前的方式我们是通过IConfigurationBuilder的Build操作得到的IConfiguration的实例那么我们就先来看下原始的方式是如何实现的。这里需要从IConfigurationBuilder的默认实现类ConfigurationBuilder说起它的实现很简单[点击查看源码[4]]public class ConfigurationBuilder : IConfigurationBuilder {/// summary/// 添加的数据源被存放到了这里/// /summarypublic IListIConfigurationSource Sources { get; } new ListIConfigurationSource();public IDictionarystring, object Properties { get; } new Dictionarystring, object();/// summary/// 添加IConfigurationSource数据源/// /summary/// returns/returnspublic IConfigurationBuilder Add(IConfigurationSource source){if (source null){throw new ArgumentNullException(nameof(source));}Sources.Add(source);return this;}public IConfigurationRoot Build(){//获取所有添加的IConfigurationSource里的IConfigurationProvidervar providers new ListIConfigurationProvider();foreach (var source in Sources){var provider source.Build(this);providers.Add(provider);}//用providers去实例化ConfigurationRootreturn new ConfigurationRoot(providers);} }这里我们来解释一下其实我们注册配置相关的时候比如AddJsonFile()、AddEnvironmentVariables()、AddInMemoryCollection()等等它们其实都是扩展方法本质就是添加IConfigurationSource实例而IConfigurationBuilder的Build本质操作其实就是在IConfigurationSource集合中得到IConfigurationProvider集合因真正从配置读取到的数据都是包含在IConfigurationProvider实例中的ConfigurationRoot通过一系列的封装让我们可以更便捷的得到配置里相关的信息。这就是ConfigurationBuilder的工作方式也是配置体系的核心原理。我们既然知道了添加配置的本质其实就是IConfigurationBuilder.Add(IConfigurationSource source)那么我就来看一下ConfigurationManager是如何实现这一步的。我们知道ConfigurationManager实现了IConfigurationBuilder接口,所以必然重写了IConfigurationBuilder的Add方法找到源码位置[点击查看源码[5]]private readonly ConfigurationSources _sources new ConfigurationSources(this); ; IConfigurationBuilder IConfigurationBuilder.Add(IConfigurationSource source) {_sources.Add(source ?? throw new ArgumentNullException(nameof(source)));return this; }这里返回了this也就是当前ConfigurationManager实例是为了可以进行链式编程ConfigurationSources这个类是个新物种原来的类叫ConfigurationSource这里多了个s表明了这是一个集合类我们就来看看它是个啥操作找到源码位置[点击查看源码[6]]/// summary /// 本身是一个IConfigurationSource集合 /// /summary private class ConfigurationSources : IListIConfigurationSource {private readonly ListIConfigurationSource _sources new();private readonly ConfigurationManager _config;/// summary/// 因为是ConfigurationManager的内部类所以传递了当前ConfigurationManager实例/// /summary/// param nameconfig/parampublic ConfigurationSources(ConfigurationManager config){_config config;}/// summary/// 根据索引获取其中一个IConfigurationSource实例/// /summary/// returns/returnspublic IConfigurationSource this[int index]{get _sources[index];set{_sources[index] value;_config.ReloadSources();}}public int Count _sources.Count;public bool IsReadOnly false;/// summary/// 这是重点添加配置源/// /summary/// param namesource/parampublic void Add(IConfigurationSource source){//给自己的IConfigurationSource集合添加_sources.Add(source);//调用了ConfigurationManager的AddSource方法_config.AddSource(source);}/// summary/// 实现IList清除操作/// /summarypublic void Clear(){_sources.Clear();//这里可以看到ConfigurationManager的ReloadSources方法很重要//通过名字可以看出是刷新配置数据用的_config.ReloadSources();}public void Insert(int index, IConfigurationSource source){_sources.Insert(index, source);_config.ReloadSources();}public bool Remove(IConfigurationSource source){var removed _sources.Remove(source);_config.ReloadSources();return removed;}public void RemoveAt(int index){_sources.RemoveAt(index);_config.ReloadSources();}//这里省略了实现了实现IList接口的其他操作//ConfigurationSources本身就是IListIConfigurationSource }正如我们看到的那样ConfigurationSources本身就是一个IConfigurationSource的集合在新的.Net体系中微软喜欢把集合相关的操作封装一个Collection类这样的好处就是让大家能更清晰的了解它是功能实现类而不在用一个数据结构的眼光去看待。通过源码我们还看到了Add方法里还调用了ConfigurationManager的AddSource方法这究竟是一个什么操作我们来看下[点击查看源码[7]]private readonly object _providerLock new(); private readonly ListIConfigurationProvider _providers new(); private readonly ListIDisposable _changeTokenRegistrations new(); private void AddSource(IConfigurationSource source) {lock (_providerLock){//在IConfigurationSource中得到IConfigurationProvider实例var provider source.Build(this);//添加到_providers集合中//我们提到过从配置源得到的配置都是通过IConfigurationProvider得到的_providers.Add(provider);//IConfigurationProvider的Load方法是从配置源中得到配置数据加载到程序内存中provider.Load();//注册更改令牌操作,使得配置可以进行动态刷新加载_changeTokenRegistrations.Add(ChangeToken.OnChange(() provider.GetReloadToken(), () RaiseChanged()));}//添加新的配置源要刷新令牌操作RaiseChanged(); }private ConfigurationReloadToken _changeToken new(); private void RaiseChanged() {//每次对配置源进行更改操作需要得到新的更改令牌实例用于可重复通知配置变更相关var previousToken Interlocked.Exchange(ref _changeToken, new ConfigurationReloadToken());previousToken.OnReload(); }从上面的ConfigurationSources方法里我们可以看到动态的针对ConfigurationSources里的ConfigurationSource进行更改会每次都调用ReloadSources方法我们来看一下它的实现[点击查看源码[8]]private readonly object _providerLock new(); private void ReloadSources() {lock (_providerLock){//释放原有操作DisposeRegistrationsAndProvidersUnsynchronized();//清除更改令牌_changeTokenRegistrations.Clear();//清除_providers_providers.Clear();//重新加载_providersforeach (var source in _sources){_providers.Add(source.Build(this));}//重新加载数据添加通知令牌foreach (var p in _providers){p.Load();_changeTokenRegistrations.Add(ChangeToken.OnChange(() p.GetReloadToken(), () RaiseChanged()));}}RaiseChanged(); }这个方法几乎是重新清除了原来的操作然后完全的重新加载一遍数据理论上来说是一个低性能的操作不建议频繁使用。还有因为ConfigurationManager实现了IConfigurationBuilder接口所以也必然实现了它的Build方法少不了看一下它的实现[点击查看源码[9]]IConfigurationRoot IConfigurationBuilder.Build() this;这波操作真的很真的很骚气我即是IConfigurationRoot我也是IConfigurationBuilder反正操作都是我自己所以这里你可劲的Build也不影响啥反正得到的也都是一个ConfigurationManager实例。到了这里结合我们之前了解到的传统的IConfigurationBuilder和IConfiguration关系以及我们上面展示的展示的ConfigurationSources类的实现和ConfigurationManager的AddSource方法。其实我们可以发现我们上面展示的ConfigurationManager类的相关操作其实就是实现了之前ConfigurationBuilder类里的操作。其实这里微软可以不用实现ConfigurationSources类完全基于ConfigurationBuilder也能实现一套但是显然微软没这么做具体想法咱们不得而知估计是只想以来抽象而并不像以来原来的实现方式吧。我们上面展示的这一部分的ConfigurationManager代码其实就是替代了原来的ConfigurationBuilder类的功能。读取操作上面我们看到了在ConfigurationManager中关于以前ConfigurationManager类的实现。接下来我们看一下读取相关的操作即在这里ConfigurationManager成为了IConfiguration实例,所以我们先来看下IConfiguration接口的定义[点击查看源码[10]]public interface IConfiguration {/// summary/// 通过配置名称获取值/// /summary/// returns/returnsstring this[string key] { get; set; }/// summary/// 获取一个配置节点/// /summary/// returns/returnsIConfigurationSection GetSection(string key);/// summary/// 获取所有子节点/// /summary/// returns/returnsIEnumerableIConfigurationSection GetChildren();/// summary/// 刷新数据通知/// /summary/// returns/returnsIChangeToken GetReloadToken(); }通过代码我们看到了IConfiguration的定义也就是在ConfigurationManager类中必然也实现也这几个操作首先便是通过索引器直接根据配置的名称获取值得操作[点击查看源码[11]]private readonly object _providerLock new(); private readonly ListIConfigurationProvider _providers new(); /// summary /// 可读可写的操作 /// /summary /// returns/returns public string this[string key] {get{lock (_providerLock){//通过在IConfigurationProvider集合中获取配置值return ConfigurationRoot.GetConfiguration(_providers, key);}}set{lock (_providerLock){//也可以把值放到IConfigurationProvider集合中ConfigurationRoot.SetConfiguration(_providers, key, value);}} }其中_providers中的值是我们在AddSource方法中添加进来的这里的本质其实还是针对ConfigurationRoot做了封装。ConfigurationRoot实现了IConfigurationRoot接口IConfigurationRoot实现了IConfiguration接口。而ConfigurationRoot的GetConfiguration方法和SetConfiguration是最直观体现ConfigurationRoot本质就是IConfigurationProvider包装的证据。我们来看一下ConfigurationRoot这两个方法的实现[点击查看源码[12]]internal static string GetConfiguration(IListIConfigurationProvider providers, string key) {//倒序遍历providers因为Configuration采用的后来者居上的方式即后注册的Key会覆盖先前注册的Keyfor (int i providers.Count - 1; i 0; i--){IConfigurationProvider provider providers[i];//如果找到Key的值就直接返回if (provider.TryGet(key, out string value)){return value;}}return null; }internal static void SetConfiguration(IListIConfigurationProvider providers, string key, string value) {if (providers.Count 0){throw new InvalidOperationException();}//给每个provider都Set这个键值虽然浪费了一部分内存但是可以最快的获取foreach (IConfigurationProvider provider in providers){provider.Set(key, value);} }关于GetSection的方法实现本质上是返回ConfigurationSection实例ConfigurationSection本身也是实现了IConfiguration接口所有关于配置获取的操作出口都是面向IConfiguration的。public IConfigurationSection GetSection(string key) new ConfigurationSection(this, key);GetChildren方法是获取配置的所有子节点的操作本质是返回IConfigurationSection的集合实现方式如如下private readonly object _providerLock new(); public IEnumerableIConfigurationSection GetChildren() {lock (_providerLock){//调用了GetChildrenImplementation方法return this.GetChildrenImplementation(null).ToList();} }这里调用了GetChildrenImplementation方法而GetChildrenImplementation是一个扩展方法我们来看一下它的实现[点击查看源码[13]]internal static IEnumerableIConfigurationSection GetChildrenImplementation(this IConfigurationRoot root, string path) {//在当前ConfigurationManager实例中获取到所有的IConfigurationProvider实例//然后包装成IConfigurationSection集合return root.Providers.Aggregate(Enumerable.Emptystring(),(seed, source) source.GetChildKeys(seed, path)).Distinct(StringComparer.OrdinalIgnoreCase).Select(key root.GetSection(path null ? key : ConfigurationPath.Combine(path, key))); }通过这段代码再次应验了那句话所有获取配置数据都是面向IConfiguration接口的数据本质都是来自于IConfigurationProvider读取配置源中的数据。ConfigurationBuilderProperties在ConfigurationManager中还包含了一个Properties属性这个属性本质来源于IConfigurationBuilder。在IConfigurationBuilder中它和IConfigurationSource是平行关系IConfigurationSource用于在配置源中获取数据而Properties是在内存中获取数据本质是一个字典private readonly ConfigurationBuilderProperties _properties new ConfigurationBuilderProperties(this); IDictionarystring, object IConfigurationBuilder.Properties _properties;这里咱们就不细说这个具体实现了我们知道它本质是字典然后操作都是纯内存的操作即可来看一下它的定义[点击查看源码[14]]private class ConfigurationBuilderProperties : IDictionarystring, object { }基本上许多缓存机制即内存操作都是基于字典做的一部分实现所以大家对这个实现的方式有一定的认识即可即使在配置体系的核心操作ConfigurationProvider中读取的配置数据也是存放在字典中的。这个可以去ConfigurationProvider类中自行了解一下[点击查看源码[15]]protected IDictionarystring, string Data { get; set; } protected ConfigurationProvider() {Data new Dictionarystring, string(StringComparer.OrdinalIgnoreCase); }总结    通过本文我们了解到了.Net6配置体系中的新成员ConfigurationManager它是一个新内容但不是一个新技术因为它是在原有的配置体系中封装了一个新的外观以简化原来对配置相关的操作。原来对配置的操作需要涉及IConfigurationBuilder和IConfiguration两个抽象操作而新的ConfigurationManager只需要一个类其本质是因为ConfigurationManage同时实现了IConfigurationBuilder和IConfiguration接口拥有了他们两个体系的能力。整体来说重写了IConfigurationBuilder的实现为主而读取操作主要还是借助原来的ConfigurationRoot对节点数据的读取操作。References[1] .Net Core Configuration源码探究 : https://www.cnblogs.com/wucy/p/13172284.html[2] 点击查看源码: https://github.com/dotnet/aspnetcore/blob/v6.0.1/src/DefaultBuilder/src/WebApplicationBuilder.cs#L103[3] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L17[4] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationBuilder.cs[5] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L97[6] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L181[7] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L127[8] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L142[9] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L103[10] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfiguration.cs[11] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L42[12] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationRoot.cs#L114[13] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/InternalConfigurationRootExtensions.cs#L21[14] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs#L262[15] 点击查看源码: https://github.com/dotnet/runtime/blob/v6.0.1/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationProvider.cs#L30

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

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

相关文章

山西专业制作网站免费软件站

1 引言 在Anaconda中如果没有指定路径,虚拟环境会默认安装在anaconda所安装的目录下,但如果默认环境的磁盘空间不足,无法满足大量安装虚拟环境的需求,此时我们需要更改虚拟环境的安装路径,有以下两种方案: 方案1: 每次…

系统集成销售和网站建设销售重庆住房和城乡建设厅官方网站

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…

wordpress全站美化流水线 东莞网站建设

WhisperFusion 基于 WhisperLive 和 WhisperSpeech 的功能而构建,在实时语音到文本管道之上集成了大型语言模型 Mistral (LLM)。 LLM 和 Whisper 都经过优化,可作为 TensorRT 引擎高效运行,从而最大限度地提高性能和实时处理能力。WhiperSpe…

seo长尾关键词搜外seo

目录 一、3407. 子字符串匹配模式二、3408. 设计任务管理器三、3409. 最长相邻绝对差递减子序列四、3410. 删除所有值为某个元素后的最大子数组和 一、3407. 子字符串匹配模式 题目链接 字符串匹配问题,把字符串 p 分成两段 、,i 是 ’ * ’ 的下标&am…

字符串哈希模板

bool isprime(int n) {if (n <= 1) {return false;}for (int i = 2; i * i <= n; i++) {if (n % i == 0) {return false;}}return true; } int findPrime(int n) {while (!isprime(n)) {n++;}return n; }void sl…

微企点做的网站百度搜得到吗竞价如何屏蔽恶意点击

目录 冒泡排序算法:) 选择排序算法:) 插入排序算法:) 冒泡排序算法:) 思想&#xff1a;依次比较相邻两个元素&#xff0c;重复的进行直到没有相邻元素需要交换&#xff0c;排序完成。 #!/bin/bash arr(12 324 543 213 65 64 1 3 45) #定义一个数组 n${#arr[*]} #获取数组…

朋友圈网站文章怎么做的wordpress分类目录seo

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式是什么&#xff1f; Redis 的发布订阅模式允许多个客户端订阅一个频道&#xff0c;当消息被发布到该频道时&#xff0c;所有订阅该频道的客户端都会收到该消息。Redis 的发布订阅模式分为两个角色&#xff1a;发布者和订阅…

闲鱼怎么做钓鱼网站怎么推广自己的店铺

Go并发&#xff1a;Goroutine 1.并发基础概念&#xff1a;进程、线程、协程 (1) 进程 可以比作食材加工的一系列动作 进程就是程序在操作系统中的一次执行过程&#xff0c;是由系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程…

推荐几个高端大气上档次网站北京互联网金融公司排名

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…

网站开发好不好wordpress help主题

Maxi Di是Selex商业集团的成员&#xff0c;该集团在意大利拥有2500多家门店&#xff0c;是意大利最大的零售商之一。 由于公司的快速发展&#xff0c;其中央仓的存储容量很快面临饱和&#xff0c;公司不得不租用多个外部仓库以满足供应链的需求。 这导致高昂的租金成本以及库存…

seo sem是啥苏州旺道seo

程序员的职业生涯是一段充满起伏的有趣经历。考虑到其陡峭的学习曲线&#xff0c;完全可以预见你将经历挫折、启蒙、骄傲自大这几个时期&#xff0c;以及穿插其间的各种心路历程。在这篇文章中让我们轻松一下&#xff0c;通过一系列搞笑 gif 图来回顾其中的每一个阶段 。 阶段…

怎么修改网站源文件域名邮箱免费注册

安装&#xff1a; 1、Docker要求CentOS系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2、更新yum包&#xff1a; sudo yum -y update 3、安装需要的软件包&#xff0c;yum-util 提供yum-config-manager功能&#xff0c;另外…

有优惠券网站 怎么做代理怎么攻击网站吗

借鉴adbms1818的底层驱动代码 前言&#xff1a;adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据&#xff0c;程序员需要通过特定的协议往寄存器里面写入或者读出数据 &#xff08;1&#xff09;定义一个结构体 里面存储了adbms1818的所有寄存器的信息。然后我们看…

支持支付宝登录的网站建设推广普通话喜迎二十ppt

噜噜哒这将使您将时区作为PHP变量。我使用jQuery和PHP编写了一个函数。这是经过测试的&#xff0c;而且确实有效&#xff01;在希望将时区作为变量的PHP页面上&#xff0c;在页面顶部附近有以下代码片段&#xff1a;<?php session_start();$timezone $_SESSION[time];…

网站绑定ftp做网站没有学历的人会吗

选择IP代理时&#xff0c;许多用户可能会因为对代理服务的不了解而陷入一些误区。这些误区不仅可能影响代理服务的效果&#xff0c;还可能带来安全风险。以下是一些在选择IP代理时需要避开的误区&#xff1a; 第一点是一个常见的误区是过于追求低价&#xff1a;市场上有很多代…

酷家乐网站做墙裙教程修改WordPress上传图片时间

刷题记录 *56. 携带矿石资源&#xff08;第八期模拟笔试&#xff09;198. 打家劫舍213. 打家劫舍 II*337. 打家劫舍 III解法一 &#xff08;记忆化递推&#xff09;*解法二 &#xff08;动态规划&#xff09; *56. 携带矿石资源&#xff08;第八期模拟笔试&#xff09; leetco…

株洲网站设计公司服务类网站模板

来源&#xff1a;科技智谷编译&#xff1a;徐浩75年前&#xff0c;宝丽来相机拍摄出第一张即时照片&#xff0c;是人类第一次以逼真的二维图像快速捕捉三维世界&#xff0c;具有划时代的意义。今天&#xff0c;人工智能的研究人员正在进行相反的工作&#xff0c;力求在几秒钟的…

如何用h5做网站珠海十大网站建设公司哪家好

背景 拍摄APP项目上线有一阵了&#xff0c;每天的拍摄数据呈现波动上升状态、业务方需要对数据进行加工&#xff0c;如果能有对未来的数据量的预测就好了 。 目标 在端侧展示拍摄数据可视化趋势图等、并能推断数据&#xff08;选择预测日期&#xff09; 简单实现个demo gif背…

内江做网站哪里便宜wordpress实现动漫播出时间表

1.分支语句/判断语句 if 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } if…else 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 / } else { / 如果布尔表达式为假将执行的语句 */ } if…else if…else语句 if(boolean_expressi…