本代码只针对单音节字母进行了处理,不支持双音节和特殊符号。若想扩展,只需要把code_map的key类型更改为string即可。

构建树

首先要构建一个下图这样的树状结构。
avatar

typedef struct Node {
    Node *l;
    Node *r;
    std::string value;
    Node(const char *v):value(v) {
    }
    Node() {
        l = nullptr;
        r = nullptr;
    }
    Node(const std::string &v):value(v) {
    }
}Node;

std::map<char, const char*> code_map;

void build_code_map() {
    code_map['T']=" - ";
    code_map['M']=" - -   ";
    code_map['O']=" - - - ";
    code_map['H']=" - - - -";
    //    code_map['Ö']=" - - - .";
    code_map['G']=" - - . ";
    code_map['Q']=" - - . -";
    code_map['Z']=" - - . .";
    code_map['N']=" - .   ";
    code_map['K']=" - . - ";
    code_map['Y']=" - . - -";
    code_map['C']=" - . - .";
    code_map['D']=" - . . i";
    code_map['X']=" - . . -";
    code_map['B']=" - . . .";
    code_map['E']=" . ";
    //    A32 -62 -73 32 -30 -128 -109 32 32 32
    code_map['A']=" . -   ";
    code_map['W']=" . - - ";
    code_map['J']=" . - - -";
    code_map['P']=" . - - .";
    code_map['R']=" . - . ";
    //   code_map['Ä']=" . - . -";
    code_map['L']=" . - . .";
    code_map['I']=" . .   ";
    code_map['U']=" . . - ";
    //  code_map['Ü']=" . . - -";
    code_map['F']=" . . - .";
    code_map['S']=" . . . ";
    code_map['V']=" . . . -";
    code_map['H']=" . . . .";
}

Node* new_node(Node *root, bool l) {
    Node *newNode = new Node();
    if(l) {
        if(root->l == nullptr) {
            root->l = newNode;
        }
        return root->l;
    }else {
        if(root->r == nullptr) {
            root->r = newNode;
        }
        return root->r;
    }
}


void build_tree(Node *root, char ch, const char*code) {

    for(int i = 0; i < strlen(code); ++i) {
        char cur_code = code[i];
        if(cur_code == '.' || cur_code == '-') {
            Node *child_node = new_node(root, cur_code == '.');
            build_tree(child_node, ch, code+i+1);
            return;
        }
    }

    root->value = ch;
}

解码

void display_node(Node *root) {
    if(root == nullptr || root->value == std::string("root")) {
        std::cout << ' ';
        return ;
    }
    std::cout << root->value;
}

void encode(Node *root,  const char*code, int &index) {
    if (root == nullptr) {
        std::cout << "err";
        return ;
    }
    for(index; index < strlen(code); ++index) {
        char cur_code = code[index];
        if((cur_code == '.' || cur_code == '-')) {
            index = index +1;
            if(cur_code == '.') {
                encode(root->l, code, index);
            }else {
                encode(root->r, code, index);
            }
            return;
        }
        // 空格结束  连续空格表示单词分隔
        display_node(root);
        ++index;
        return;
    }
    //结尾
    display_node(root);
    ++index;
}

完整代码


#include <string>
#include <iostream>
#include <map>
#include <string.h>

using namespace std;

typedef struct Node {
    Node *l;
    Node *r;
    std::string value;
    Node(const char *v):value(v) {
    }
    Node() {
        l = nullptr;
        r = nullptr;
    }
    Node(const std::string &v):value(v) {
    }
}Node;

std::map<char, const char*> code_map;

void build_code_map() {
    code_map['T']=" - ";
    code_map['M']=" - -   ";
    code_map['O']=" - - - ";
    code_map['H']=" - - - -";
    //    code_map['Ö']=" - - - .";
    code_map['G']=" - - . ";
    code_map['Q']=" - - . -";
    code_map['Z']=" - - . .";
    code_map['N']=" - .   ";
    code_map['K']=" - . - ";
    code_map['Y']=" - . - -";
    code_map['C']=" - . - .";
    code_map['D']=" - . . i";
    code_map['X']=" - . . -";
    code_map['B']=" - . . .";
    code_map['E']=" . ";
    //    A32 -62 -73 32 -30 -128 -109 32 32 32
    code_map['A']=" . -   ";
    code_map['W']=" . - - ";
    code_map['J']=" . - - -";
    code_map['P']=" . - - .";
    code_map['R']=" . - . ";
    //   code_map['Ä']=" . - . -";
    code_map['L']=" . - . .";
    code_map['I']=" . .   ";
    code_map['U']=" . . - ";
    //  code_map['Ü']=" . . - -";
    code_map['F']=" . . - .";
    code_map['S']=" . . . ";
    code_map['V']=" . . . -";
    code_map['H']=" . . . .";
}

Node* new_node(Node *root, bool l) {
    Node *newNode = new Node();
    if(l) {
        if(root->l == nullptr) {
            root->l = newNode;
        }
        return root->l;
    }else {
        if(root->r == nullptr) {
            root->r = newNode;
        }
        return root->r;
    }
}


void build_tree(Node *root, char ch, const char*code) {

    for(int i = 0; i < strlen(code); ++i) {
        char cur_code = code[i];
        if(cur_code == '.' || cur_code == '-') {
            Node *child_node = new_node(root, cur_code == '.');
            build_tree(child_node, ch, code+i+1);
            return;
        }
    }

    root->value = ch;
}

void display_node(Node *root) {
    if(root == nullptr || root->value == std::string("root")) {
        std::cout << ' ';
        return ;
    }
    std::cout << root->value;
}

void encode(Node *root,  const char*code, int &index) {
    if (root == nullptr) {
        std::cout << "err";
        return ;
    }
    for(index; index < strlen(code); ++index) {
        char cur_code = code[index];
        if((cur_code == '.' || cur_code == '-')) {
            index = index +1;
            if(cur_code == '.') {
                encode(root->l, code, index);
            }else {
                encode(root->r, code, index);
            }
            return;
        }
        // 空格结束  连续空格表示单词分隔
        display_node(root);
        ++index;
        return;
    }
    //结尾
    display_node(root);
    ++index;
}


int main() {

    build_code_map();
    Node *root = new Node("root");
    for(auto it = code_map.begin(); it != code_map.end(); ++it) {
        build_tree(root, it->first, it->second);
    }

    int index = 0;
    const char *code  = ". .-- .---  --    ";
    std::string str;
    std::getline(std::cin, str);
    if(!str.empty()) {
        code = str.c_str();
    }
    std::cout << code << std::endl;
    for(;index < strlen(code);) {
        encode(root, code, index);
    }

    return 0;
}

InnoDB存储格式

在InnoDB中有两个存储格式,分别为Compact和Redundant。
在MySQl5.1及其以后默认保存为Compact格式。
想要查看自己服务的格式可以使用下面命令:

show table status like 'table_name';

在创建表的时候也可以执行使用的格式 row_format=compact;



- 阅读剩余部分 -

产品开发-知识图谱-脑图版

产品开发-知识图谱-脑图版

Imagemap
      usemap=

- 阅读剩余部分 -

启动consul

使用docker启动多个consul agent实例
docker-compose.yml文件

version: '3.0'
services:
    consulserver1:
        image: consul:1.9.4
        restart: always
        container_name: consulserver1
        hostname: consulserver1
        command: agent -server -bootstrap -client=0.0.0.0 -ui -node=consulserver1 -enable-script-checks=true
        ports:
            - 8500:8500
    consulserver2:
        image: consul:1.9.4
        restart: always
        container_name: consulserver2
        hostname: consulserver2
        command: agent -server -join=consulserver1 -node=consulserver2 -enable-script-checks=true
        depends_on:
            - consulserver1

    consulserver3:
        image: consul:1.9.4
        restart: always
        container_name: consulserver3
        hostname: consulserver3
        command: agent -server -join=consulserver1 -node=consulserver3
        depends_on:
            - consulserver1

    consulclient1:
        image: consul:1.9.4
        restart: always
        container_name: consulclient1
        hostname: consulclient1
        command: agent -client=0.0.0.0 -retry-join=consulserver1 -node=consulclient1
        depends_on:
            - consulserver2
            - consulserver3
        ports:
            - 8600:8500
    consulclient2:
        image: consul:1.9.4
        restart: always
        container_name: consulclient2
        hostname: consulclient2
        command: agent -client=0.0.0.0 -retry-join=consulserver1 -node=consulclient2
        depends_on:
            - consulserver2
            - consulserver3
        ports:
            - 8700:8500
    consulclient3:
        image: consul:1.9.4
        restart: always
        container_name: consulclient3
        hostname: consulclient3
        command: agent -client=0.0.0.0 -retry-join=consulserver1 -node=consulclient3
        depends_on:
            - consulserver2
            - consulserver3
        ports:
            - 8800:8500

- 阅读剩余部分 -