每日学习总结20240220

每日总结

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() 方法来设置主题的新数据,这将触发通知,所有观察者都会收到更新。

在这里插入图片描述

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值