第8章 未执行缓存的强制清理操作导致显示异常解决方案

news2024/12/25 9:01:12

1 异常产生原因:

    由于未为Role实体定义相就的缓存强制销毁器类:Services.Customers.Caching.RoleCacheEventConsumer,从而导致Services.Events.EventPublisher.PublishAsync<TEvent>(TEvent @event)中的 consumers实例为0,如下图所示:

 2 Core.Events.EntityInsertedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体插入事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化插入操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityInsertedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityInsertedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

3 Core.Events.EntityUpdatedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体更新事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化更新操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityUpdatedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityUpdatedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

4 Core.Events. EntityDeletedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体持久化/逻辑删除事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化/逻辑删除操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityDeletedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityDeletedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

5 Core.Events.IEventPublisher

 namespace Core.Events

 {

    /// <summary>

    /// 【缓存移除事件触发--接口】

    /// <remarks>

    /// 摘要:

    ///     通过继承于该接口的具体实现类中的方法成员用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

    /// </remarks>

    /// </summary>

    public interface IEventPublisher

     {

        #region 方法

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【异步触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        Task PublishAsync<TEvent>(TEvent @event);

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        void Publish<TEvent>(TEvent @event);

        #endregion

    }

}

6 Core.Events.EventPublisherExtensions

using Core.Domain;

namespace Core.Events

 {

    /// <summary>

    /// 【事件触发器扩展--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的成员方法以指定事件触发类的指定实例进行实例化,从而为执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项提供实例支撑。

    /// </remarks>

    /// </summary>

    public static class EventPublisherExtensions

     {

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体插入】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityInsertedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             await eventPublisher.PublishAsync(new EntityInsertedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【实体插入】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityInserted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             eventPublisher.Publish(new EntityInsertedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体更新】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化更新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityUpdatedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             await eventPublisher.PublishAsync(new EntityUpdatedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体更新】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化更新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityUpdated<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            eventPublisher.Publish(new EntityUpdatedEvent<T>(entity));

        }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体删除】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityDeletedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            await eventPublisher.PublishAsync(new EntityDeletedEvent<T>(entity));

        }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【实体删除】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityDeleted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            eventPublisher.Publish(new EntityDeletedEvent<T>(entity));

        }

    }

 }

7 Core.Events.IConsumer<T>

namespace Services.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:实体插入事件类的类型实例、实体更新事件类的类型实例或实体持久化/逻辑删除事件类的类型实例)</typeparam>

    /// <summary>

    /// 摘要:

    ///     通过继承于该接口具体实现类中的方法成员,在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作时,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </summary>

    public interface IConsumer<T>

    {

        /// <param name="eventMessage">实体插、更新或持久化/逻辑删除事件类的1个指定实例。</param>

        /// <summary>

        /// 【异步句柄事件】

        ///  <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体实例的分布式缓存的强制移除操作提供数据支撑,从而为新变更的实例缓存操作,预留出相应的内存空间。

        /// </remarks>

        /// </summary>

        Task HandleEventAsync(T eventMessage);

    }

}

8 Core.Events.EventPublisher

using Core.Events;

using Core.Infrastructure;

namespace Services.Events

{

    /// <summary>

    /// 【缓存移除事件触发--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员用于实例化缓存项的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

    /// </remarks>

    /// </summary>

    public class EventPublisher : IEventPublisher

    {

        #region 方法--接口实现

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【异步触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task PublishAsync<TEvent>(TEvent @event)

        {

            //获取所有继承于“IConsumer”接口具体实现类的实例。

            var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();

            foreach (var consumer in consumers)

            {

                try

                {

                    //在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,触发执行缓存项的强制移除句柄,从而移除缓存数据库中该实体所有相关的缓存项。

                    await consumer.HandleEventAsync(@event);

                }

                catch (Exception exception)

                {

                    try

                    {

                    }

                    catch

                    {

                        // ignored

                    }

                }

            }

        }

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public virtual void Publish<TEvent>(TEvent @event)

        {

            //获取所有继承于“IConsumer”接口具体实现类的实例。

            var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();

            foreach (var consumer in consumers)

                try

                {

                    //在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,触发执行缓存项的强制移除句柄,从而移除缓存数据库中该实体所有相关的缓存项。

                    consumer.HandleEventAsync(@event).Wait();

                }

                catch (Exception exception)

                {

                    try

                    {

                    }

                    catch

                    {

                        // ignored

                    }

                }

        }

        #endregion

    }

}

9 Services.Customers.Caching.CacheEventConsumer

using Core.Domain.Customers;

using Services.Caching;

namespace Services.Customers.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在角色实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免角色实体的列表渲染显示出现的异常。

    /// </summary>

    public class RoleCacheEventConsumer : CacheEventConsumer<Role>

    {

       

    }

}

注意:

    RoleCacheEventConsumer类必须被定义,且注意其具体定义内容,否则会因角色实例的分布式缓存的未被强制移除,从而导致角色实体的列表渲染显示出现的异常。

10 重构Program.cs文件

using Core.Configuration;

using Core.Infrastructure;

using Data;

using Data.Configuration;

using Microsoft.EntityFrameworkCore;

using Framework.Infrastructure.Extensions;

using Core.Caching;

using LinqToDB.DataProvider.SqlServer;

using Core.Events;

using Services.Events;

using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

//如果启动项中不存在“appsettings.json”文件,则通过.Net(Core)的内置方法自动新建“appsettings.json”文件。

builder.Configuration.AddJsonFile("appsettings.json", true, true);

//把当前程序中所有继承了“IConfig”接口的具体实现类的实例,依赖注入到.Net(Core)内置依赖注入容器实例中,如果需要并把这些数据持久化存储到"appsettings.json"文件。

builder.Services.ConfigureApplicationSettings(builder);

builder.Services.AddScoped<INopFileProvider, NopFileProvider>();

builder.Services.AddSingleton<ILocker, MemoryCacheManager>();

builder.Services.AddSingleton<IStaticCacheManager, MemoryCacheManager>();

builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

builder.Services.AddSingleton<IEventPublisher, EventPublisher>();

var typeFinder = Singleton<ITypeFinder>.Instance;

var consumers = typeFinder.FindClassesOfType(typeof(IConsumer<>)).ToList();

foreach (var consumer in consumers)

    foreach (var findInterface in consumer.FindInterfaces((type, criteria) =>

    {

        var isMatch = type.IsGenericType && ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition());

        return isMatch;

    }, typeof(IConsumer<>)))

        builder.Services.AddScoped(findInterface, consumer);

//注意:在动态对EntityFrameworkCore中间件进行实例化时,必须使用“AddDbContextPool” 内置方法替换“AddDbContext”内置方法,

//否则就会出现异常:“System.InvalidOperationException: The service collection cannot be modified because it is read-only”

builder.Services.AddDbContextPool<EFCoreContext>(options => {

    //从单例实例的字典成员实例中获取当前程序所有配置相关数据。

    AppSettings _appSettings = Singleton<AppSettings>.Instance;

    //从应用配置类实例中获取数据库连接相关数据。

    DataConfig _dataConfig = _appSettings.Get<DataConfig>();

    //说明:如果想要“EntityFrameworkCore”中间件支持多数据库软件,则把选择条件中的所有中间件都注入到依赖注入到.Net(Core)框架内置容器即可,

    //选择条件来限定当前程序只支持所设定的1个数据库软件,当然“DataConfig”类与“appsettings.json”文件也必须为支持多数据库软件进行重构。

    if (_dataConfig.DataProvider.ToString().Equals("sqlserver", StringComparison.InvariantCultureIgnoreCase))

    {

        //通过“DbContextOptionsBuilder”实例中的参数实例,为“Microsoft.EntityFrameworkCore.SqlServer”中间件的实例化提供参数实例,

        //最终把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)框架内置容器中。

        //IIS发布部署连接字符串必须使用“SQL Server身份认证数据库连接方式,才能实现发布部署程序与数据库的CURD的操作。

        options.UseSqlServer(_dataConfig.ConnectionString);

    }

});

//通过AddRazorRuntimeCompilation依赖注入中间件实现页面修改热加载(Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)

builder.Services

    .AddControllersWithViews()

    .AddRazorRuntimeCompilation();

//把具体现类和中间件注入到内置依赖注入容器后,并把.NetCore框架内置依赖注入容器接口实例所存储的当前程序中的具体现类和中间件的实例通过“Engine”(引擎)单例实例存储到单例类的字典属性成员实例中。

//注意:从依赖注入到.Net(Core)框架内置容器中,获取“IServiceProvider”接口实例,必须定义在最后,

//否则“GetServices”/“GetRequiredService”方法将有可能不能获取取1个指定类的实例,因为该类的实例还没有依赖注入到.Net(Core)框架内置容器中。

builder.Services.ConfigureApplicationServices(builder);

var app = builder.Build();

// Configure the HTTP request pipeline.

if (!app.Environment.IsDevelopment())

{

    app.UseExceptionHandler("/Home/Error");

    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.

    app.UseHsts();

}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

/*注意:

    .net7最好不要直接使用app.UseEndpointsapp.UseMvc来集成路由匹配模式,否则会出现:“ASP0014”警告信息,

为了避免该警告信息直接使用最小APIapp.MapControllerRoute来集成路由匹配模式。

 */

app.MapControllerRoute(

        name: "areaRoute",

        pattern: $"{{area:exists}}/{{controller=Install}}/{{action=Index}}/{{id?}}");

//动态实例化EntityFrameworkCore中间件,必须把InstallRefactoring/Index设定为默认启动页面,

//否则依然会因为当前类的拷贝构造方法实例化EntityFrameworkCore中间件是在程序启动前就被实例化的,如果无数据库如果数据库连接字符串,

//那么就会因EntityFrameworkCore中间件实例中不包含数据库如果数据库连接字符串,从而造成上述异常。

app.MapControllerRoute(

      name: "default",

      pattern: "{controller=InstallRefactoring}/{action=Index}/{id?}");

// 通过.NetCore框架的内置管道接口实例,实例化“IServiceProvider”接口实例,同时把继承于“IStartup”所有具体现类中的中间件实例集成到.NetCore框架内置管道中。

app.ConfigureRequestPipeline();

app.Run();

对以上功能更为具体实现和注释见230509_008ShopRazor(未执行缓存的强制清理操作导致显示异常解决方案)。

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

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

相关文章

深入理解移动端布局:Viewport与设备像素比

在移动端开发中&#xff0c;了解和掌握不同设备的布局特点是非常重要的。本文将介绍两个关键概念&#xff1a;Viewport 和设备像素比&#xff08;DPR&#xff09;&#xff0c;帮助你更好地理解移动端布局。 一、什么是 Viewport&#xff1f; Viewport 是用户在浏览器中可见的网…

JS知识点(包括原型,原型对象,数据类型,数据类型的检测)

目录 1、JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 2、基本数据类型和引用数据类型地区别&#xff1a; 3、数据类型检测的方式有哪些: 4、判断数组的方式有那些&#xff1f; 5、null和undefined区别&#xff1a; 6、为什么typeOf null得到object而不是n…

22个提升生产力的工具推荐,稳了

子曰&#xff1a;工欲善其事&#xff0c;必先利其器。 本文给大家推荐22个提高生产力的工具&#xff0c;总有一款符合你的需求。&#x1f604;&#x1f604;&#x1f604; 提高生产效率工具推荐 滴答清单/Todoist文件检索利器&#xff1a;Everything文件管理软件-Allen Explor…

基于SpringBoot的大学生租房系统

背景 大学生租房系统设计的目的是建立一个高效的平台&#xff0c;采用简洁高效的Java语言与Mysql数据库等技术&#xff0c;设计和开发了本大学生租房系统设计。该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c…

【电子学会】2023年03月图形化三级 -- 猫猫的儿童节

猫猫的儿童节 儿童节到了&#xff0c;给小猫绘制一个七彩的气球。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff1b; &#xff08;2&#xff09;选择“Button2”角色&#xff0c;添加文字“开始”&#xff1b; &#xff08;3&#xff09;默认白色背景。 2…

有人抱怨Android找不到工作,有人却收到了好几个Offer~

不知不觉&#xff0c;往年常说的面试黄金季就这样过去了&#xff0c;相信现在很多人都会抱怨说&#xff0c;现在是市场岗位缩水裁员季。有人抱怨&#xff0c;自然也有人喜悦&#xff0c;有失业人群在&#xff0c;自然就业人群也有&#xff0c;有人想找一份合理工作很难&#xf…

C高级(day1)

作业: 初始工作路径不在家目录下&#xff0c;在不切换路径的情况下&#xff0c;在家目录下创建一个subdir目录&#xff0c;在subdir这个目录下&#xff0c;创建subdir1和subdir2&#xff0c;并且把/etc/passwd拷贝到subdir1中&#xff0c;把/etc/group文件拷贝到subdir2中&…

David Silver Lecture 5: Model-Free Control

1 Introduction 1.1 内容 上一章是对一个unknown MDP进行value function的预测&#xff0c;相当于policy evaluation。这一章是对unknown MDP找到一个最优的policy&#xff0c; optimise value function. 1.2 On and Off-Policy Learning On-policy learning learn on the…

[oeasy]python0050_动态类型_静态类型_编译_运行

动态类型_静态类型 回忆上次内容 上次了解了 帮助文档的 生成 开头的三引号注释 可以生成 帮助文档文档 可以写成网页 python3 本身 也有 在线的帮助手册 目前的程序 提高了 可读性 有什么方法 可以让程序 更可读么&#xff1f;&#x1f914; 变量名 首先 在变量名上想办…

opencv_c++学习(六)

一、视频加载与摄像头调用 视频、摄像头加载 VideoCapture(filename, CAP_ANY)对以上实例解释如下&#xff1a; 若读取的为本地视频&#xff0c;则filename为视频名称&#xff0c;若读取的是摄像头数据&#xff0c;则为int类型的摄像头id。 视频属性的获取 视频属性可以通过…

手握美团offer,结果背调红灯,哭了....

相信很多人都会包装简历&#xff0c;尤其是工作经历&#xff0c;不过也有人会填一下虚假的背景信息&#xff0c;比如公司leader或HR&#xff0c;小公司没有实力过多进行背调&#xff0c;但是大企业就不同了&#xff0c;他们有方法了解到实际的情况。 背调包括候选人以往的经历…

RHCSA之Linux的安装步骤

目录 RHCSA之环境配置 需要的软件 VMwareWorkstation安装 1.打开VMwareWorkstation安装包 2.进入安装界面点击下一步 3. 在我接受许可协议打 √ 后&#xff0c;点击下一步 4.在安装位置选择更改 5. 更改目标安装位置&#xff0c;点击确定 6.疯狂点击下一步 8.点击安装 9.…

DDIM模型代码实现

背景 前面已经出了一系列的文章来介绍大模型、多模态、生成模型。这篇文章会从更微观和更贴近实际工作的角度下手。会给大家介绍下前面讲到的diffuiosn model具体怎么来实现。文章结构如下&#xff1a; 1.介绍Diffusion Model包括哪些零部件&#xff0c;这些零部件衔接关系 …

jvm梳理

jvm是一个虚拟机&#xff0c;用于运行java代码&#xff0c;类的编译到运行主要为一下&#xff1a; 通过javac.exe编译&#xff0c;产生class文件&#xff0c;然后通过类加载器加入jvm&#xff1a; 类加载器&#xff1a; 引导加载器&#xff1a;使用c编写&#xff0c;负责java的…

【高项】项目绩效域,信息文档配置与变更,标准与规范管理(第4版教材第18-19,24章,项目规范知识)

文章目录 1、配置与变更管理1.1 信息文档1.2 配置管理1.3 变更管理 2、标准规范&#xff08;合同管理&#xff0c;知识产权&#xff09;2.1 合同管理2.2 知识产权和标准规范&#xff08;合同法&#xff0c;招投标法&#xff0c;著作权法&#xff0c;政府采购法&#xff09;2.3 …

力扣算题Day17

110.平衡二叉树(递归很难理解,思维很重要) 下面才是做二叉树的一种正确思维&#xff1a; copy他人运行代码&#xff1a; class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself.left leftself.right right class Solution:def judgeDepth(self, …

自底向上分析概述

4-8自底向上的分析概述_哔哩哔哩_bilibili &#xff08;开始准备期末考试&#xff09;&#xff08;可菜&#xff09; 移入-规约分析&#xff1a; 每次归约的符号串称为“句柄”&#xff0c;一旦句柄在栈顶形成&#xff0c;我们立即将它规约&#xff0c;因此每一步规约都是最左…

[JAVA EE]创建Servlet——继承HttpServlet类笔记2

创建Servlet的方式之一&#xff1a;继承HttpServlet类&#xff08;经常使用&#xff09; 如果请求方式为get请求则调用doGet()方法; 如果请求方式为post请求则调用doPost()方法。 开发中通常不会在两个方法中写重复的代码&#xff0c;会造成代码冗余。 Request 一、获取请求…

[前端基础]websocket协议

(1)websocket websocket(简写为ws),是一种轻量化的协议,经过最开始的握手阶段以后,前后端之间允许自由地发送信息不受限制(建议发送json字符串).虽然理论上这个东西是属于协议内容,但是已经被疯狂封装得像框架一样了. websocket协议具有天然的优势处理前端多线程并发,并且只需…

Android---Glide的基本使用

目录 Glide 基本使用 Glide 进阶 Glide 是一个快速高效的 Android 图片加载库&#xff0c;可以自动加载网络、本地文件&#xff0c;app 资源中的图片&#xff0c;注重于平滑的滚动。 Glide 第一次加载一张图片后&#xff0c;就会自动帮我们把这张图片加入到内存中进行管理。…