文章851
标签121
分类10

踩坑 IPV6 mysql ip chat(15) 引发bug

看标题应该就明白了
Mysql 设计的 IP 存储字段 chat(15) 太短了, 存IPv4还ok, 存IPV6 就截断了.

增加IP 字段长度即可解决Bug

使用 Supervisor 进行进程监控

Supervisor 是一个进程管理工具,允许用户监控和控制多个进程。它适用于 UNIX/Linux 系统,特别是在需要管理多个后台任务时非常有用。

1. Supervisor 概述

  • 功能:可以启动、停止、重启和监控进程。
  • 配置:通过配置文件定义要管理的进程。
  • WEB 界面:提供 Web 界面来监控进程状态。

2. 安装 Supervisor

在 Ubuntu 或 Debian 系统上,可以使用以下命令安装:

sudo apt update
sudo apt install supervisor

在 CentOS 或 RHEL 系统上:

sudo yum install epel-release
sudo yum install supervisor

3. Supervisor 配置文件

Supervisor 的主要配置文件通常位于 /etc/supervisor/supervisord.conf。可以在此文件中设置全局选项和进程配置。

3.1 创建进程配置

创建一个新的配置文件,例如 /etc/supervisor/conf.d/myprogram.conf,内容如下:

[program:myprogram]
command=/path/to/your/program  # 要执行的命令
autostart=true                  # 启动时自动启动
autorestart=true                # 进程退出后自动重启
stderr_logfile=/var/log/myprogram.err.log  # 错误日志
stdout_logfile=/var/log/myprogram.out.log  # 输出日志

3.2 配置说明

  • command:要执行的命令。
  • autostart:程序是否在 Supervisor 启动时自动启动。
  • autorestart:程序退出后是否自动重启。
  • stderr_logfile:标准错误输出的日志文件。
  • stdout_logfile:标准输出的日志文件。

4. 启动和管理 Supervisor

4.1 启动 Supervisor

使用以下命令启动 Supervisor:

sudo service supervisor start

4.2 更新 Supervisor 配置

在添加或修改配置后,使用以下命令更新 Supervisor:

sudo supervisorctl reread       # 重新读取配置文件
sudo supervisorctl update       # 更新配置

4.3 管理进程

使用 supervisorctl 命令管理进程:

  • 查看状态

    sudo supervisorctl status
  • 启动进程

    sudo supervisorctl start myprogram
  • 停止进程

    sudo supervisorctl stop myprogram
  • 重启进程

    sudo supervisorctl restart myprogram

5. 使用 Web 界面(可选)

Supervisor 提供 Web 界面,便于监控和管理进程。要启用 Web 界面,请在 supervisord.conf 中添加以下内容:

[inet_http_server]
port=*:9001            # 监听的端口
username=user          # 用户名
password=pass          # 密码

重启 Supervisor 后,您可以通过 http://your_server_ip:9001 访问 Web 界面。

AC自动机 算法详解及模板

AC 自动机(Aho-Corasick 自动机)是一种用于多模式字符串匹配的高效算法。它结合了 Trie 树和 KMP 算法的思想,能够在 O(n + m + z) 的时间复杂度内完成字符串匹配,其中 n 是文本长度,m 是所有模式串的总长度,z 是匹配结果的数量。

1. AC 自动机的基本思想

AC 自动机主要由以下几个部分组成:

  • Trie 树:用于存储所有的模式串。
  • 失败指针:用于处理不匹配的情况,类似于 KMP 算法中的部分匹配表。
  • 输出函数:用于记录匹配的模式串。

2. AC 自动机的构建步骤

2.1 插入模式串

首先,我们构建一个 Trie 树,将所有要匹配的模式串插入到树中。

输入模式串: "he", "she", "his", "hers"

Trie 树结构:

        root
        /  \
       h    s
      /      \
     e        h
             / \
            i   e
           /
          s

2.2 构建失败指针

接下来,我们为 Trie 树中的每个节点建立失败指针。如果当前节点无法匹配下一个字符,则通过失败指针回溯到更高层次的节点。

构建失败指针的步骤:

  1. 使用 BFS 遍历 Trie 树,初始化根节点的失败指针为自身。
  2. 对于每个节点,遍历其子节点,设置失败指针。
失败指针示例:

        root
        /  \
       h    s
      /|    |
     e |    h
        |   / \
        |  i   e
        | /
        s
  • 节点 h 的失败指针指向 root
  • 节点 s 的失败指针指向 root
  • 节点 e 的失败指针指向 root
  • 节点 i 的失败指针指向 h(因为 hi 的最长前缀)。
  • 节点 hers 的失败指针指向 hers 本身。

2.3 匹配过程

在匹配过程中,从根节点开始,逐字符遍历文本字符串。如果当前字符在当前节点的子节点中,则继续向下遍历;如果不在,则通过失败指针回溯,直到找到匹配或到达根节点。

3. 示例代码

以下是 AC 自动机的基本实现模板:

class ACNode:
    def __init__(self):
        self.children = {}
        self.fail = None
        self.output = []

class ACAutomaton:
    def __init__(self):
        self.root = ACNode()

    def insert(self, pattern):
        node = self.root
        for char in pattern:
            if char not in node.children:
                node.children[char] = ACNode()
            node = node.children[char]
        node.output.append(pattern)

    def build_fail_pointers(self):
        from collections import deque
        queue = deque([self.root])
        while queue:
            current = queue.popleft()
            for char, child in current.children.items():
                # Find fail pointer
                fail_node = current.fail
                while fail_node and char not in fail_node.children:
                    fail_node = fail_node.fail
                child.fail = fail_node.children[char] if fail_node else self.root
                # Merge output
                if child.fail:
                    child.output.extend(child.fail.output)
                queue.append(child)

    def search(self, text):
        node = self.root
        results = []
        for char in text:
            while node and char not in node.children:
                node = node.fail
            if node:
                node = node.children[char]
            else:
                node = self.root
            
            if node.output:
                results.extend(node.output)
        return results

# 使用示例
ac = ACAutomaton()
patterns = ["he", "she", "his", "hers"]
for pattern in patterns:
    ac.insert(pattern)
ac.build_fail_pointers()
text = "ushers"
matches = ac.search(text)
print(matches)  # 输出匹配的模式串

在 SecureCRT 中添加 Mac Localhost

SecureCRT 是一款流行的终端仿真程序,支持多种协议(如 SSH、Telnet 等)。在某些情况下,您可能希望通过 SecureCRT 连接到本地运行的 Mac 服务。以下是如何在 SecureCRT 中设置连接到 Mac localhost 的步骤。

1. 确保 SSH 服务已启用

首先,确保您的 Mac 上已启用 SSH 服务。可以通过以下步骤检查和启用 SSH:

1.1 打开系统偏好设置

  1. 点击苹果菜单,选择 系统偏好设置
  2. 点击 共享

1.2 启用远程登录

  1. 在共享设置中,勾选 远程登录
  2. 记下您的 Mac 的 IP 地址(例如 192.168.1.10),您也可以使用 localhost127.0.0.1 进行本地连接。

2. 在 SecureCRT 中创建新会话

2.1 打开 SecureCRT

启动 SecureCRT 应用程序。

2.2 创建新会话

  1. 点击 文件 > 快速连接(或使用快捷键 Ctrl + Q)。
  2. 快速连接 窗口中,选择 SSH2 作为协议。

2.3 输入连接信息

  • 主机名: 输入 localhost127.0.0.1(如果您从本地连接)。
  • 端口: 默认 SSH 端口为 22,如果您未更改过,可以保持默认。
  • 用户名: 输入您的 Mac 用户名。

2.4 点击连接

点击 连接,SecureCRT 将尝试通过 SSH 连接到您的 Mac。

3. 保存会话

如果您希望将此连接保存为会话,以便下次快速访问:

  1. 在连接成功后,点击 会话 > 保存会话
  2. 输入会话名称,选择保存位置(通常是在 My Sessions 文件夹)。
  3. 点击 确定

4. 使用密钥认证(可选)

如果您希望使用 SSH 密钥进行认证,可以在会话设置中进行配置:

  1. 在会话列表中,右键点击刚创建的会话,选择 属性
  2. SSH2 选项卡中,找到 公钥认证 部分。
  3. 点击 添加密钥,选择您的私钥文件(通常以 .pem.ppk 结尾)。
  4. 点击 确定 保存设置。

5. 连接到 Mac

再次选择您的会话并点击连接,您将能够通过 SecureCRT 访问您的 Mac。

`docker-compose.yml` 文件详解

docker-compose.yml 是 Docker Compose 的配置文件,用于定义和运行多容器 Docker 应用。通过该文件,您可以轻松配置应用的服务、网络和卷等。以下是对 docker-compose.yml 文件的详细解析。

1. 基本结构

一个简单的 docker-compose.yml 文件结构如下:

version: '3'  # Docker Compose 文件的版本

services:     # 定义服务
  web:        # 服务名称
    image: nginx   # 使用的镜像
    ports:
      - "8080:80"  # 映射端口

2. 关键字段

2.1 version

指定 Docker Compose 文件的版本。不同版本支持的功能可能有所不同。常用版本包括 2.x3.x

2.2 services

定义应用的各个服务。每个服务都有自己的配置,包括镜像、环境变量、端口映射等。

2.3 服务配置选项

2.3.1 image

指定要使用的 Docker 镜像,可以是本地镜像或远程镜像。

image: nginx:latest  # 使用最新的 nginx 镜像

2.3.2 build

如果需要从 Dockerfile 构建镜像,可以使用 build 选项。

build:
  context: ./app  # Dockerfile 所在目录
  dockerfile: Dockerfile  # 指定 Dockerfile 名称(可选)

2.3.3 ports

定义容器内部和外部的端口映射。

ports:
  - "8080:80"  # 将主机的 8080 端口映射到容器的 80 端口

2.3.4 volumes

挂载卷,可以用于持久化数据或共享数据。

volumes:
  - ./data:/data  # 将主机的 ./data 目录挂载到容器的 /data 目录

2.3.5 environment

设置环境变量。

environment:
  - ENV=production
  - DEBUG=false

2.3.6 depends_on

指定服务之间的依赖关系,确保某个服务在其他服务启动之前启动。

depends_on:
  - db

2.3.7 networks

定义网络配置,服务可以通过网络进行通信。

networks:
  my_network:
    driver: bridge

3. 完整示例

以下是一个完整的 docker-compose.yml 示例,包含 Web 服务和数据库服务:

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:  # 定义持久化数据卷

4. 常用命令

使用 Docker Compose 管理应用的常用命令包括:

  • 启动服务

    docker-compose up
  • 后台启动服务

    docker-compose up -d
  • 停止服务

    docker-compose down
  • 查看服务日志

    docker-compose logs

5. 总结

docker-compose.yml 文件是 Docker Compose 的核心部分,通过它可以方便地定义和管理多容器应用。掌握其结构和配置选项,能够帮助用户快速部署和管理复杂的应用环境。

">