每日学习总结20240220

news2025/1/14 4:04:07

每日总结

20240220

岁月极美,在于它必然的流逝;春花,秋月,夏日,冬雪。 ——三毛

1.svn操作

通过svn创建一个仓库 请写出一套配置 配置文件包括svnserve.conf passwd authz 三个文件 添加用户xiaoming 密码为lx,使得能访问仓库

要创建一个 Subversion (SVN) 仓库并配置用户访问权限,你需要执行以下步骤:

  1. 创建 SVN 仓库

    svnadmin create /path/to/repository
    
  2. 启动svn服务

    svnserve -d -r 目录 --listen-port 端口号

    • -r: 配置方式决定了版本库访问方式。
    • –listen-port: 指定SVN监听端口,不加此参数,SVN默认监听3690
  3. 配置 svnserve.conf 文件: 在 SVN 仓库的 conf 目录下创建一个 svnserve.conf 文件,并添加以下内容:

    [general]
    anon-access = none
    auth-access = write
    password-db = passwd
    authz-db = authz
    realm = My SVN Repository
    

    这段文本是一个典型的 Subversion (SVN) 服务器配置文件,用于设置 SVN 服务器的一般属性和权限控制。下面逐行进行详细介绍:

    1. [general]:这一行指定了一个一般设置的开始标记。在这个部分,你可以定义 SVN 服务器的一般属性和权限控制。
    2. anon-access = none:这一行设置了匿名用户的访问权限。在这个例子中,设置为 none,表示匿名用户没有访问权限。匿名用户是指没有经过身份验证的用户。
    3. auth-access = write:这一行设置了经过身份验证的用户的访问权限。在这个例子中,设置为 write,表示经过身份验证的用户有写入权限。这意味着用户需要通过用户名和密码进行身份验证,并且具有写入仓库的权限。
    4. password-db = passwd:这一行指定了用于存储用户认证信息的密码数据库文件的路径。在这个例子中,密码数据库文件位于 ./passwd
    5. authz-db = authz:这一行指定了用于存储权限控制信息的认证数据库文件的路径。在这个例子中,权限控制数据库文件位于 ./authz
    6. realm = My SVN Repository:这一行定义了服务器的认证域。认证域是一个逻辑实体,用于区分不同的 SVN 服务器。在这个例子中,认证域被命名为 My SVN Repository

    总体来说,这段配置文件设置了 SVN 服务器的一般属性和权限控制。匿名用户被禁止访问,只有经过身份验证的用户才能进行写入操作。用户认证信息存储在 /home/svn/passwd 文件中,权限控制信息存储在 /home/svn/authz 文件中。认证域被定义为 tiku。这样的设置可以根据实际需求来确保 SVN 服务器的安全和有效管理。

  4. 配置 passwd 文件: 在 SVN 仓库的 conf 目录下创建一个 passwd 文件,并添加以下内容:

    [users]
    xiaoming = lx
    
  5. 配置 authz 文件: 在 SVN 仓库的 conf 目录下创建一个 authz 文件,并添加以下内容:

    [groups]
    admin = xiaoming
    
    [/]
    @admin = rw
    

上述配置的含义是:

  • svnserve.conf 文件中配置了仓库的访问控制规则,禁止匿名用户访问,允许经过身份验证的用户具有写入权限,用户认证信息存储在 passwd 文件中,权限控制信息存储在 authz 文件中,认证域为 My SVN Repository
  • passwd 文件中添加了一个用户名为 xiaoming,密码为 lx 的用户,用于身份验证。
  • authz 文件中定义了一个名为 admin 的用户组,包含了用户 xiaoming。并为根目录 / 设置了 admin 用户组的读写权限。

在以上步骤完成后,你可以启动 SVN 服务器,让用户可以通过用户名和密码进行访问和操作 SVN 仓库。请确保将 /path/to/repository 替换为你实际的 SVN 仓库路径。

2.观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,其相关依赖对象都会收到通知并自动更新。在观察者模式中,有两种核心角色:观察者(Observer)和被观察者(Subject)。

  1. 观察者(Observer):观察者是接收被观察者状态变化通知的对象。它定义了一个更新方法,用于在收到通知时更新自身状态或执行相应操作。
  2. 被观察者(Subject):被观察者是维护一组观察者对象并负责通知它们状态变化的对象。它包含注册、删除和通知观察者的方法。

使用场景:

  • 当一个对象的状态变化需要通知其他对象,并且你不知道这些对象的具体数量或类型时,观察者模式非常适用。
  • 当一个对象的修改需要影响其他对象,但又希望对象之间保持松耦合时,观察者模式也很有用。

例如,一个消息队列中的发布-订阅系统(如MQTT)与观察者模式有着相似的行为。在MQTT中,发布者发布消息到主题(Topic),而订阅者订阅感兴趣的主题,并在该主题有消息发布时接收通知。

类比示例:

  • 在观察者模式中,被观察者就像消息队列中的主题,观察者就像订阅了该主题的订阅者。
  • 当被观察者状态变化时,在观察者模式中,观察者会收到通知并更新自身状态。而在MQTT中,订阅了相关主题的客户端会收到发布的消息并执行相应操作。

下面是一个简单的C语言示例来说明观察者模式的实现:

#include <stdio.h>

#define MAX_OBSERVERS 10

// 定义观察者接口
typedef struct {
    void (*update)(void* data);
} Observer;

// 定义被观察者结构体
typedef struct {
    Observer* observers[MAX_OBSERVERS];
    int count;
} Subject;

// 初始化被观察者
void subject_init(Subject* subject) {
    subject->count = 0;
}

// 注册观察者
void subject_register_observer(Subject* subject, Observer* observer) {
    if (subject->count < MAX_OBSERVERS) {
        subject->observers[subject->count++] = observer;
    } else {
        printf("Cannot register more observers\n");
    }
}

// 通知观察者
void subject_notify_observers(Subject* subject, void* data) {
    for (int i = 0; i < subject->count; ++i) {
        subject->observers[i]->update(data);
    }
}

// 定义观察者更新函数
void observer_update_function(void* data) {
    int* value = (int*)data;
    printf("Received update: %d\n", *value);
}

int main() {
    Subject subject;
    subject_init(&subject);

    // 创建观察者
    Observer observer1 = { .update = observer_update_function };
    Observer observer2 = { .update = observer_update_function };

    // 注册观察者
    subject_register_observer(&subject, &observer1);
    subject_register_observer(&subject, &observer2);

    // 模拟状态变化并通知观察者
    int data = 42;
    subject_notify_observers(&subject, &data);

    return 0;
}

这个示例中,Subject代表被观察者,Observer代表观察者。subject_register_observer用于注册观察者,subject_notify_observers用于通知观察者。observer_update_function是观察者的更新函数,当被观察者发生变化时会被调用。

#include <iostream>
#include <vector>

// 观察者基类
class Observer {
public:
    virtual void update(int value) = 0;
};

// 具体观察者A
class ConcreteObserverA : public Observer {
public:
    void update(int value) override {
        std::cout << "ConcreteObserverA: Received update with value " << value << std::endl;
    }
};

// 具体观察者B
class ConcreteObserverB : public Observer {
public:
    void update(int value) override {
        std::cout << "ConcreteObserverB: Received update with value " << value << std::endl;
    }
};

// 主题类
class Subject {
private:
    int data;
    std::vector<Observer*> observers;

public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void setData(int value) {
        data = value;
        notify();
    }

    void notify() {
        for (Observer* observer : observers) {
            observer->update(data);
        }
    }
};

int main() {
    // 创建主题和观察者
    Subject subject;
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    // 订阅主题
    subject.attach(&observerA);
    subject.attach(&observerB);

    // 主题设置新数据,触发通知
    subject.setData(10);

    return 0;
}

这个示例中,我们定义了两个具体的观察者类 ConcreteObserverAConcreteObserverB,它们都继承自抽象观察者类 Observer,并实现了 update() 方法来接收主题的更新。

然后我们定义了主题类 Subject,它维护一个观察者列表,并提供了 attach() 方法用于订阅观察者,以及 setData() 方法用于设置主题的数据并通知所有观察者。

main() 函数中,我们创建了主题对象 subject 和两个观察者对象 observerAobserverB,然后通过 attach() 方法将它们订阅到主题上。最后,我们调用 setData() 方法来设置主题的新数据,这将触发通知,所有观察者都会收到更新。

在这里插入图片描述

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

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

相关文章

离线升级esp32开发板升级包esp32-2.0.14(最新版已经3.0alpha了)

1.Arduino IDE 2.3.2最新 2024.2.20升级安装:https://www.arduino.cc/en/software 2.开发板地址 地址&#xff08;esp8266,esp32&#xff09; http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32…

Java 面向对象进阶 07 继承中成员变量,成员方法的访问特点(黑马)

一、继承中成员变量的访问特点&#xff1a; 打印结果为&#xff1a;zishow 这种情况打印出来的结果是Zi 这种情况打印的是Fu 这种情况就会报错 对于重名的情况&#xff0c;没有关键字&#xff0c;那么就是就近原则&#xff0c;打印出的是ziShow&#xff1b; this.name 指的是Zi…

Rancher实用篇-使用rancher,部署微服务应用

说到rancher&#xff0c;我们必须先了解一下k8s 一、k8s简介 Kubernetes&#xff08;通常简写为 K8s&#xff09;是一个开源的容器管理系统&#xff0c;由Google于2014年发起&#xff0c;并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…

spring boot3参数校验基本用法

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校…

python celery使用队列

在celery的配置方法中有个参数叫task_routes&#xff0c;是用来设置不同的任务 消费不同的队列&#xff08;也就是路由&#xff09;。 格式如下&#xff1a; { ‘task name’: { ‘queue’: ‘queue name’ }}直接上代码&#xff0c;简单明了&#xff0c;目录格式如下&#x…

LabVIEW读取excel日期

LabVIEW读取excel日期 | Excel数据表格中有日期列和时间列&#xff0c;如下表所示&#xff1a; 通过LabVIEW直接读取Excel表格数据&#xff0c;读出的日期列和时间列数据与原始表格不一致&#xff0c;直接读出来的数据如下表所示&#xff1a; 日期、时间列数据异常 问题产生原因…

哈希应用位图 | 位图概述与代码实现 | 关于位图的几个面试题

文章目录 1.位图的概述与实现1.1.位图的引出与概述1.2.位图的代码实现1.3.位图的应用及其他面试题 1.位图的概述与实现 当然C库中也有位图的实现&#xff1a;链接 1.1.位图的引出与概述 面试题&#xff1a;给40亿个不重复的无符号整数&#xff08;0~2^32&#xff09;&#xf…

消息中间件之RocketMQ源码分析(十一)

Namesrv路由原理 Namesrv获取的Topic路由信息来自Broker定时心跳&#xff0c;心跳时Broker将Topic信息和其他信息发送到Namesrv。 Namesrv通过RequestCode.REGISTER_BROKER接口将心跳中的Broker信息和Topic信息存储在Namesrv中 路由注册 registerBrokerWithFilterServer()方…

手撕扩散模型(一)| 训练部分——前向扩散,反向预测代码全解析

文章目录 1 直接使用 核心代码2 工程代码实现2.1 DDPM2.2 训练 三大模型VAE&#xff0c;GAN&#xff0c; DIffusion扩散模型 是生成界的重要模型&#xff0c;但是最近一段时间扩散模型被用到的越来越多的&#xff0c;最近爆火的OpenAI的 Sora文生视频模型其实也是用了这种的方…

【Java期末】学生成绩管理系统(MySQL数据库)

诚接C语言、C、Java、Python、HTML、JavaScript、vue、MySQL相关编程作业&#xff0c; 标价10-20每份&#xff0c;如有需要请加文章最下方QQ。 本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88856340 1.题目要求 学生成绩管理系统 通过Java控制…

PNG图片压缩-UPNG.js参数说明及示例

UPNG.js是一个非常轻量且高效的库&#xff0c;用于处理PNG图像。它可以编码和解码PNG图片&#xff0c;同时支持压缩和解压缩功能。特别适合在前端项目中处理图像&#xff0c;尤其是在需要优化图像大小而不牺牲质量时。 UPNG.encode()函数是UPNG.js中用于将图像数据编码成PNG格…

量化巨头“卖空”被刷屏!网友:又一类量化策略要“收摊”了

量化圈遇到了龙年首宗“大事件”&#xff01; 2月20日晚间&#xff0c;沪深交易所同时出手对量化巨头灵均投资的异常交易行为进行“处理”。 沪深交易所均称发现灵均在2月19日开盘1分钟内&#xff0c;名下多个账户通过计算机程序自动生产交易指令&#xff0c;短时间大量下单卖…

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…

过了30岁了,一定要专注一件事情?视频号值得尝试!

经常说视频号下载助手&#xff0c; 但发现大多数的大佬都只是先专注一件事情。 小编初6就回来了&#xff0c;和一个大佬吃饭&#xff0c;虽然人家规模并不大&#xff0c;但日引客户上千也是基本的。 这里给大家揭秘一下&#xff0c;他的做法&#xff01;&#xff01;&#x…

猫头虎分享已解决Bug || 脚本执行错误(Script Execution Failure):ScriptError, ExecutionFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

挑战30天学完Python:Day15 错误类型

&#x1f4d8; Day 14 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…

Linux编辑器——Vim详解

目录 ⭐前言 ⭐vim的基本概念 ⭐vim的基本操作 ⭐vim命令模式命令集 ⭐vim末行模式命令集 ⭐简单vim配置 ⭐配置文件的位置 ⭐常用配置选项 ⭐前言 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容…

课程大纲:图像处理中的矩阵计算

课程名称&#xff1a;《图像处理中的矩阵计算》 课程简介&#xff1a; 图像处理中的矩阵计算是图像分析与处理的核心部分。本课程旨在教授学员如何应用线性代数中的矩阵计算&#xff0c;以实现各种图像处理技术。我们将通过强调实际应用和实践活动来确保学员能够理解和掌握这些…

代码随想录算法训练营第三六天 | 无重叠区间、划分字母区间、合并区间

目录 无重叠区间划分字母区间合并区间 LeetCode 435. 无重叠区间 LeetCode 763.划分字母区间 LeetCode 56. 合并区间 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠…

vue3 之 商城项目—会员中心

整体功能梳理 1️⃣个人中心—个人信息和猜你喜欢数据渲染 2️⃣我的订单—各种状态下的订单列表展示 路由配置&#xff08;三级路由配置&#xff09; 准备模版member/index.vue <script setup> </script><template><div class"container">…