No.5412 站

吒


  • 首页

  • 归档

mac系统-docker魔法

发表于 2022-09-28 | 分类于 Learning

一、Fix Fatal: can’t open lock file /run/xtables.lock: Read-only file system when use docker-desktop-for-mac:

  1. kubectl get pods
  2. docker ps | grep {YOUR_POD_NAME} | grep istio-proxy
  3. docker inspect -f {{.State.Pid}} {CONTAINER_HASH}
  4. docker run -it --rm --privileged --pid=host justincormack/nsenter1
  5. nsenter -n -t {YOUR_CONTAINER_PID}
  6. iptables -L

mac系统通过docker搭建kafka环境

发表于 2022-04-14

背景

本地开发任务需要启动个 kafka 环境, 模拟测试

环境

  1. MacOS
  2. Docker Desktop Version 4.6.1
  3. HOST_IP=宿主机网络IP | 个别情况可以使用 host.docker.internal
  4. KAFKA_TOPIC=xxxxxxx
  5. KAFKA_GROUP=xxxxxxx

安装步骤

  1. 启动 zookeeper

    1
    kafka docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
  2. 启动 kafka

    1
    2
    3
    4
    5
    6
    docker run -d --name kafka --link zookeeper -p 9092:9092 \
    -e KAFKA_BROKER_ID=0 \
    -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${HOST_IP}:9092 \
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
    -t wurstmeister/kafka
  3. 创建 topic

    1
    2
    3
    4
    5
    docker run --rm wurstmeister/kafka kafka-topics.sh --create \
    --zookeeper ${HOST_IP}:2181 \
    --partitions 1 \
    --replication-factor 1 \
    --topic ${KAFKA_TOPIC}
  4. 创建 consumer

    1
    2
    3
    4
    5
    docker run --rm wurstmeister/kafka kafka-console-consumer.sh \
    --bootstrap-server ${HOST_IP}:9092 \
    --topic ${KAFKA_TOPIC} \
    --group ${KAFKA_GROUP} \
    --from-beginning
    1
    2
    3
    4
    5
    6
    docker run --rm wurstmeister/kafka kafka-console-consumer.sh \
    --bootstrap-server ${HOST_IP}:9092 \
    --topic ${KAFKA_TOPIC} \
    --offset earliest \
    --max-messages 10 \
    --partition 0
  5. 创建 producer

    1
    2
    3
    docker run --rm wurstmeister/kafka kafka-console-producer.sh \
    --bootstrap-server ${HOST_IP}:9092 \
    --topic ${KAFKA_TOPIC}
  6. 查看 group 状态

    1
    2
    3
    4
    docker run --rm  wurstmeister/kafka kafka-consumer-groups.sh \
    --describe \
    --bootstrap-server ${HOST_IP}:9092 \
    --group ${KAFKA_GROUP}

C 语言重学之旅 - 从 redis 中学习 C 语言

发表于 2022-04-08 | 更新于 2022-05-16 | 分类于 C , redis

变量

  1. 变量: 其实只不过是程序可操作的存储区的名称.
  2. 类型: 变量存储的大小和布局
  3. 变量定义: 就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
  4. 常量: #define 预处理器, 复制多份, const 直接定义一份
  5. 变量存储位置:
    1. 栈: 用来做函数调用, 参数传递等, 程序运行过程中操作最频繁的数据区.
    2. 全局静态区: 变量一直存在于内存, 整个运行中不会被销毁.
    3. 堆: 由操作系统维护的大空间伸缩区, 在程序运行中动态申请

类型

  1. const void * 万能不可修改数据指针
  2. size_t,全称应该是size type,就是说“一种用来记录大小的数据类型”, 一种“整型”类型, 不同平台的size_t会用不同的类型实现, 使用size_t而非int或unsigned可以写出扩展行更好的代码, 即是为了提供一种可移植的代码形式.

修饰符

  1. static
    1. 修饰局部变量时: 变量存储在全局静态区, 作用域局部
    2. 修饰全局变量时: 限定作用域为本文件可见
    3. 修饰函数时: 限定作用域为本文件

函数

  1. void memset(void s, int ch, size_t n); 将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s .

编译器特性

  1. gcc -g main.c 在编译的时候,产生调试信息。
  2. gcc -E main.c > main.s, 只激活预处理
  3. gcc -S main.c 只激活预处理和汇编, 产生汇编代码
  4. gcc -c main.c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  5. attribute((packed)) 取消结构体在编译过程中的优化对齐,按尽可能小的size对齐——也就是按1字节为单位对齐

标准库

  1. libc
    1. void *memmove( void* dest, const void* src, size_t count ); 拷贝字节, 保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.
    2. void *calloc(size_t __count, size_t __size) __result_use_check __alloc_size(1,2); 批量分配内存 size * size, 并自动初始化为0
    3. void *malloc(size_t __size) __result_use_check __alloc_size(1); 分配内存, 不初始化数据
    4. int snprintf(char* dest_str,size_t size,const char* format,...); 将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
  2. <sys/time.h>, 系统时间相关库
    1. timeval {tv_sec, tv_usec} 秒和纳秒时间戳
    2. timezone {tz_minuteswest, tz_dsttime} 时区
    3. int gettimeofday(struct timeval *tv, struct timezone *tz); 获取当前时间戳
  3. <sys/termios.h>, 终端相关库
    1. int tcgetattr(int, struct termios *); 获取终端参数
  4. <sys/ioctl.h>, input/output control
    1. int ioctl(int, unsigned long, ...); 专用于设备输入输出操作的系统调用,该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。
  5. <sys/fcntl.h>, 通过文件描述符, 操作稳健
    1. int fcntl(int, int, ...) __DARWIN_ALIAS_C(fcntl);, 获取\设置文件 flag, 锁等
  6. <sys/socket.h>
    1. SOCKET PASCAL FAR socket( int af, int type, int protocol); 创建套接字
      1. af 地址描述
      2. type 类型描述
      3. protocol 所用协议
    2. int connect(SOCKET s, const struct sockaddr * name, int namelen); 建立套接字链接
  1. <unistd.h>
    1. int isatty(int handle); 检查给定的设备类型, 普通文件 返回 0 ,设备 返回 -1
    2. ssize_t write(int __fd, const void * __buf, size_t __nbyte) __DARWIN_ALIAS_C(write); 写入数据
    3. ssize_t read(int, void *, size_t) __DARWIN_ALIAS_C(read); 读取数据
    4. pid_t getpid(void); 获取进程 ID
  2. <stdio.h>
    1. int fileno(FILE *); 返回文件描述符
  3. <stdlib.h>
    1. char *getenv(const char *); 获取 env 值
    2. long long strtoll(const char *__str, char **__endptr, int __base); 字符串转 long long
    3. int atoi(const char *); 字符串转数字. 按十进制理解字符串.
    4. double atof(const char *); 字符串转 double.
    5. int atexit(void (* _Nonnull)(void)); 用来注册执行exit()函数前执行的终止处理程序.
  4. <string.h>
    1. int strcmp(const char *__s1, const char *__s2); 两个字符串比较, s1 < s2 => < 0, s1 > s2 => >0, s1 = s2 => 0
    2. int strncasecmp(const char *, const char *, size_t); 不区分大小写比较前n个字符
    3. const char* strchr(const char* __s, int __c) 返回字符在字符串中第一次出现的位置, 没又返回一个NULL 指针
    4. char *strdup(const char *__s1); 字符串拷贝函数
  5. <sys/signal.h>
    1. void(*signal(int, void (*)(int)))(int); 系统信号处理函数, 第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:
      1. SIG_IGN: 忽略该信号
      2. SIG_DFL: 恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作
      3. sighandler_t类型的函数指针
  6. <netdb.h>
    1. int getaddrinfo( const char hostname, const char service, const struct addrinfo *hints, struct addrinfo **result );
      1. hostname: 一个主机名或者地址串( IPv4 点分十进制串或者 IPv6 的16进制串)
      2. service: 服务名, 十进制端口号, 也可以是已定义的服务名称, 如 ftp\http
      3. hints: 一个空指针或者 addrinfo 结构体的指针, 填入关于期望返回的信息类型暗示, 例如将 ai_sockettype 设置为 SOCK_DGRAM 使得返回仅仅适用于数据报套接口的信息.
      4. result: 本函数通过 result指针返回一个指向 addrinfo 结构体链表的指针
      5. 返回值: 0 –成功, 非 0 –出错

学习 redis -- Makefile 篇

发表于 2021-02-01 | 更新于 2021-02-03 | 分类于 redis

make 命令简介

make 命令格式:make [-f Makefile] [option] [target]

make 是一个解释 makefile 中指令的命令工具。make 工具最主要也是最基本的功能:就是通过 makefile文件 来描述源程序之间的相互关系并自动维护编译工作。而 makefile文件 需要按照某种语法进行编写,文件中需要说明如何编译各个源文件,并连接生成可执行文件,并要求定义源文件之间的依赖关系。

redis 中的 Makefile 使用

  1. $(MAKE) 代表 make 命令本身
  2. .PHONY 伪指令, 用于处理 Makefile 所在目录有与自命令重名文件的问题
  3. $@ 代表 命令传过来所有参数 makefile 中 $@ 与 bash 脚本中的含义不一样
    1. $@ 表示规则中目标
    2. $< 表示规则中的第一个依赖条件
    3. $^ 表示规则中的所有依赖条件

      1. test 1 2 3 4 5
      2. $# 是传给脚本的参数个数 ps: 5
      3. $0 是脚本本身的名字 ps: test
      4. $1是传递给该shell脚本的第一个参数 ps: 1
      5. $2是传递给该shell脚本的第二个参数 ps: 2
      6. $@ 是传给脚本的所有参数的列表 参数独立看待 ps: for 循环可循环 5 次
      7. $* 是传给脚本的所有参数的列表 所有参数整体看待 ps: “1 2 3 4 5”, for 循环循环 1 次

  4. 版本号生成

    1
    2
    3
    4
    #!/bin/sh
    GIT_SHA1=`(git show-ref --head --hash=8 2> /dev/null || echo 00000000) | head -n1`
    GIT_DIRTY=`git diff --no-ext-diff 2> /dev/null | wc -l`
    BUILD_ID=`uname -n`"-"`date +%s`
  5. 执行shell uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')

    1. := $() 赋值命令执行后的输出
    2. /dev/null 一个特殊的设备文件,这个文件接收到任何数据都会被丢弃
    3. 2>/dev/null 将标准错误的输出重定向到 /dev/null, 此处意在不输出标准错误信息, 如shell脚本失败, 只输出 not
    4. Linux 系统预留了三个文件描述符
      1. 0 标准输入 stdin
      2. 1 标准输出 stdout
      3. 2 标准错误 stderr
  6. Makefile 赋值操作
    1. = 是最基本的赋值 make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值
    2. := 是覆盖之前的值 变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值
    3. ?= 是如果没有被赋值过就赋予等号后面的值
    4. += 是添加等号后面的值
  7. Makefile 中的 if 语句 及函数调用

    1
    2
    3
    4
    5
    6
    STD=-pedantic -DREDIS_STATIC=''
    ifneq (,$(findstring clang,$(CC)))
    ifneq (,$(findstring FreeBSD,$(uname_S)))
    STD+=-Wno-c11-extensions
    endif
    endif

扩展知识

  1. Makefile 规则

    targets… : prerequisites…
    [table] commands…

  2. make 工作流程
    1. make会在当前目录下找名字叫 Makefile 或 makefile 的文件
    2. 如果找到,它会找文件中的第一个目标文件(target),并把它作为最终的目标文件
    3. 递归 target 的 prerequisites, 如果不存在或者其所依赖更新, 执行对应的 command 生成自己
    4. 如果 target 文件不存在,或所依赖的文件更新,执行 command 生成 target
  3. make 命令执行步骤
    1. 读入所有的 Makefile
    2. 读入被 include 的其它 Makefile
    3. 初始化文件中的变量
    4. 推导隐晦规则,并分析所有规则
    5. 为所有的目标文件创建依赖关系链
    6. 根据依赖关系,决定哪些目标要重新生成
    7. 执行生成命令
  4. 文件搜索 VPATH vpath %.h ../headers
    1. 如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件了。
    2. vpath pattern directories, 为符合模式 pattern 的文件指定搜索目录 directories
    3. vpath pattern 清除符合模式 pattern 的文件的搜索目录
    4. vpath 清除所有已被设置好了的文件搜索目录
  5. 命令执行

    1. @ 不输出命令
    2. - 忽略错误继续执行
    3. 定义命令包

      1
      2
      3
      4
      define customCommand
      command
      command...
      endef
  6. 函数

    1. 使用方式 $(function arguments)
    2. 字符串操作函数列表 (待完善)
    3. 文件操作函数列表 (待完善)
    4. 命令函数调用方式 $(shell command args)
  7. 预定义变量, 见附表一
  8. 命令行选项, 见附表二

附表一

命令行选项 含义
-C DIR 在读取 makefile 之前改变到指定的目录 DIR
-f FILE 以指定的 FILE 文件作为 makefile
-i 忽略所有的命令执行错误
-I DIR 当包含其他 makefile 文件时,可利用该选项指定搜索目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示 make 变量数据库和隐含规则
-s 在执行命令时不显示命令
-w 在处理 makefile 之前和之后,显示工作目录
-W FILE 假定文件 FILE 已经被修改

附表二

命令行选项 含义
-C DIR 在读取 makefile 之前改变到指定的目录 DIR
-f FILE 以指定的 FILE 文件作为 makefile
-i 忽略所有的命令执行错误
-I DIR 当包含其他 makefile 文件时,可利用该选项指定搜索目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示 make 变量数据库和隐含规则
-s 在执行命令时不显示命令
-w 在处理 makefile 之前和之后,显示工作目录
-W FILE 假定文件 FILE 已经被修改

每日一记-20201217

发表于 2020-12-17 | 分类于 每日一记
  1. docker 清理不用的资源
    1. 清理悬空镜像(无容器引用亦无tag) docker image prune -a 清除所有无容器引用的镜像
    2. 清除容器 docker container prune -f | –force 强制清除, –filter 设置过滤参数
    3. 清除挂载卷 docker volume prune -f | –force 强制清除, –filter 设置过滤参数
    4. 删除所有不用资源 docker system prune –volumes 17.06 版本后默认不删除挂载卷

SetMaxIdleConns && SetMaxIdleConns

发表于 2020-06-03 | 分类于 GO

Go 的 sql 包中 DB struct SetMaxIdleConns 与 SetMaxOpenConns 存在意义

1
2
3
4
5
6
7
8
9
// SetMaxOpenConns sets the maximum number of open connections to the database.
//
// If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than
// MaxIdleConns, then MaxIdleConns will be reduced to match the new
// MaxOpenConns limit.
//
// If n <= 0, then there is no limit on the number of open connections.
// The default is 0 (unlimited).
func (db *DB) SetMaxOpenConns(n int) {}

1
2
3
4
5
6
7
8
9
10
11
// SetMaxIdleConns sets the maximum number of connections in the idle
// connection pool.
//
// If MaxOpenConns is greater than 0 but less than the new MaxIdleConns,
// then the new MaxIdleConns will be reduced to match the MaxOpenConns limit.
//
// If n <= 0, no idle connections are retained.
//
// The default max idle connections is currently 2. This may change in
// a future release.
func (db *DB) SetMaxIdleConns(n int) {}

传送门

以免大家打不开传送门

SetMaxIdleConns 设置数据库连接池可以保留的连接数,用来复用连接。
SetMaxOpenConns 设置数据库可以打开的最大连接数。
意义:因为你可能希望MaxIdleConns是低的,但是MaxOpenConns是高的。这意味着您的应用程序可以在需要的时候打开尽可能多的连接,但在不需要的时候却消耗最少的资源:适合于突发负载。–Danver Braganza 2015年8月11日22:55

19年面试清单(总)

发表于 2019-05-01 | 更新于 2020-05-21 | 分类于 PHP
系统相关
  1. 一道面试题:说说进程和线程的区别

    1. 进程是资源分配的最小单位,线程是程序执行的最小单位。
    2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段、数据段、这种操作非常昂贵。而线程是共享进程中数据的,使用相同地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也要小很多。
    3. 线程之间通信更方便,同一进程共享全局变量、静态变量等数据,而进程之间需要以通信的方式(IPC)进行,不过如何处理好同步与互斥是编写多线程程序的难点。
    4. 但是多进程程序更加健壮,多线程程序只要有一个线程死掉,整个进程也就死掉了,而一个进程死掉不会对另一个造成影响,因为进程有自己的独立地址空间。
  2. shell 获取文件每行第三个元素 awk ‘{print $3}’ test”

  3. shell 输出当前的pid
    $$: 当前shell的pid
    $!:上一个进程的pid
    $?: 上个命令推出状态或函数返回值
    $0: 当前进程名
    $n: 传递给脚本第n参数
    $#: 传递给脚本或本函数的参数个数
    $*: 传给脚本的所有参
  4. 杀死所有的php-cgi进程

    1
    $kill -s 9 `ps -aux | grep php-cgi | awk '{print $2}'`

    《linux下杀死进程的10种方法》

  5. 查看 php-fpm

    1
    ps -ef|grep php

    《linux下查看php-fpm是否开启以及如何开启》

  6. 反射型XSS漏洞的条件+类型+危害+解决
语言相关
  1. 打印前一天时间
    date('Y-m-d H:i:s',strtotime('-1 day'))
  2. echo count(strlen(“http://php.net"))
    遇见次数:2
    手册解释:count传入非数组值会返回1,如果传入的值为NULL,返回0
    php5.4 输出 1
    php7.3 将会返回一个warning级别的错误,Parameter must be an array or an object that implements Countable.
  3. PHP的垃圾回收机制详解
  4. php–转码函数
    iconv
    mb_convert_encoding
  5. PHP 加密方式
    md5() crypt() sha1() urlencode() base64_encode()

  6. 下面程序输出结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $num = 1;
    function mutiple() {
    $num = $num * 10;
    }
    mutiple();
    echo $num;
    function mutiple1($num) {
    $num = $num * 10;
    }
    mutiple1($num);
    echo $num;

    1, 1

    程序设计
  7. 面向对象与面向过程优缺点

    面向过程
    优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
    缺点:没有面向对象易维护、易复用、易扩展。
    面向对象
    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
    缺点:性能比面向过程低

  8. 设计模式好处及常规的设计模式

    帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

    《你所学习的设计模式到底有什么用?到底怎么用?》

  9. 不使用第三个变量交换两个变量
    出现次数: 1
    方法一: 使用异或操作。
    方法二: 使用list($a, $b) = array($a, $b), 注意php7 会改变$a, $b 顺序。
    方法三: 字符串可以将两变量拼接后去截取。
  10. 遍历文件夹,出现次数:1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function myScanDir($filename) {
    $files = [];
    if (is_dir($filename)) {
    $handle = opendir($filename);
    while($file = readDir($handle)) {
    if (in_array($file, [".", ".."])) {
    continue;
    }
    $chirldFilename = $filename . DIRECTORY_SEPARATOR . $file;
    if (is_dir($chirldFilename)) {
    $files[$file] = myScanDir($chirldFilename);
    } else {
    $files[] = $file;
    }
    }
    closedir($handle);
    }
    return $files;
    }
  11. 多进程同时读写一个文件
    协同锁、LOCK_SH、LOCK_EX、LOCK_UN、LOCK_NB、

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function myWrite($filename, $output) {
    $handle = fopen($filename);
    if(flock($handle, LOCK_EX)) {
    fwrite($handle, $output);
    fflush($handle);
    flock($handle, LOCK_UN);
    } else {
    throw new exception("文件被占用");
    }
    fclose($handle);
    }
  12. 冒泡排序

  13. 最近最少使用缓存失效策略算法实现 LRU
  14. 内存256M, 10G文件排序实现 file sort
  15. 敏感词过滤

    1
    2
    3
    4
    5
    6
    7
    $badword = array(    
    '张三','张三丰','张三丰田'
    );
    $badword1 = array_combine($badword,array_fill(0,count($badword),'*'));
    $bb = '我今天开着张三丰田上班';
    $str = strtr($bb, $badword1);
    echo $str;
  16. 正则匹配html标签
    /<[^>]+>/g;
    用正则表达式匹配HTML标签

  17. 用五种方法获取文件扩展名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    function get_ext1($file_name){
    return strrchr($file_name, '.');
    }

    function get_ext2($file_name){
    return substr($file_name, strrpos($file_name, '.'));
    }

    function get_ext3($file_name){
    return array_pop(explode('.', $file_name));
    }

    function get_ext4($file_name){
    $p = pathinfo($file_name);
    return $p['extension'];
    }

    function get_ext5($file_name){
    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
    }
    function get_ext6($file_name) {
    $tok = strtok($string, '.'); //使用strtok将字符串分割成一个个令牌
    while ($tok)
    {
    $arr[]= $tok;
    $tok = strtok('.'); //该函数会保持它自己的内部指针在字符串中的位置,
    //如果想重置指针,可以将该字符串传给这个函数.
    //所以当第二次调用strtok()函数时,如果对上一次的已分割的字符串进行分割,第1个参数可以省略
    }
    $count= count($arr);
    $i= $count-1;
    $file_type= $arr[$i];
    return $file_type;
    }
  18. 给定一个无序数组,找出其中未出现的最小正整数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
        function firstMissingPositive(array $input) :int {
    $l = count($input);
    $i = 0;
    //var_export($input);
    while($i < $l) {
    if ($input[$i] > 0 && $input[$i] <= $l && $input[$input[$i] - 1] != $input[$i]) {
    $temp = $input[$input[$i] - 1];
    $input[$input[$i] - 1] = $input[$i];
    $input[$i] = $temp;
    } else {
    $i++;
    }
    //var_export($input);
    }
    //var_export($input);
    $i = 0;
    while ($i < $l && $input[$i] == $i + 1) {
    $i++;
    }
    return $i;
    }
    ```

    1. [搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节](https://blog.csdn.net/u014686180/article/details/52190864)

    ##### 数据库设计
    1. mysql快速清空数据库``` select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where table_schema in ('数据库1','数据库2');``` 然后再替换替换。

    1. mysql 查找重复记录
    假设表名user, 字段分别为id, username, email, 查询username重复的记录
    方法一:``` select id,username,count(*) as counts from user group by username having counts > 1;``` 可能会报错,5.7版本增加了对功能依赖的检测,select 的字段必须出现在 group by 中。
    修改方法 ``` select @@global.sql_mode; set @@global.sql_mode = "ONLY_FULL_GROUP_BY,....";``` 删除其中的 ONLY_FULL_GROUP_BY.或者设置my.ini
    方法二:5.7 版本
    查询重复字段: ``` select username from user GROUP BY username HAVING COUNT(*) > 1;```
    查询重复记录:```select * from user a where (select count(*) from user where username = a.username ) > 1 order by username; ```
    过滤记录:``` select * from user where id in (Select min(id) From user Group By username);
  19. mysql 查学生各科分数前三
    student_score{id,name,subject_id,score}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # mysql 删除ONLY_FULL_GROUP_BY
    select a.user_id, a.subject_id,a.score from student_score a
    inner join student_score b on b.subject_id = a.subject_id and a.score <= b.score
    group by a.user_id, a.subject_id
    having count(*) <= 3
    order by a.score desc;

    # 兼容版本
    select c.* from student_score c inner join
    (select a.user_id, a.subject_id from student_score a
    inner join student_score b on b.subject_id = a.subject_id and a.score <= b.score
    group by a.user_id, a.subject_id having count(*) <= 3) as d
    on c.user_id = d.user_id and c.subject_id = d.subject_id
    order by c.subject_id,c.score;
  20. 数据库评论回复功能 详见CSDN某大神著作《数据库设计——评论回复功能》

  21. mysql基础概念 mysql 主键 外键 索引 覆盖索引 数据库引擎 查询缓存

    1. 主键:能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。
    2. 外键:是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。
    3. 索引:是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。
    4. 聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但innoddb 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。
    5. 数据库引擎:数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
    6. 查询缓存:Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。

      参考文献:
      《MySQL数据库(主键、索引、外键、触发器…》)
      《MySQL 聚簇索引》)
      《mysql 数据库引擎》)

  22. 学生、课程、授课老师

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    create table student
    (
    id int auto_increment primary key,
    student_name varchar(100) default '' not null comment '姓名',
    birthday int,
    sex tinyint,
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '学生表';

    create table teacher
    (
    id int auto_increment primary key,
    teacher_name varchar(100) default '' not null comment '姓名',
    birthday datetime,
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '教师表';

    create table lesson
    (
    id int auto_increment primary key,
    lesson_name varchar(100) default '' not null comment '姓名',
    status tinyint,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '课程表';

    create table teacher_lesson_relation
    (
    id int auto_increment primary key,
    teacher_id int,
    lesson_id int,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '教师课程关系表';

    create table student_lesson_relation
    (
    id int auto_increment primary key,
    student_id int,
    lesson_id int,
    created_at int,
    updated_at int
    ) engine = InnoDB charset=utf8 comment '学生课程关系表';
    1. 查询选了某个课程的所有学生
      select s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id where sl.lesson_id = ?
    2. 查询教某个老师教的所有课程
      select l.* from lesson l inner join teacher_lesson_relation tl on l.id = tl.lesson_id where tl.teacher_id = ?
    3. 查询某个老师的所有学生
      select distinct s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id inner join teacher_lesson_relation tl on sl.lesson_id = tl.lesson_id where tl.teacher_id = ?;
    4. 查询报了某个课程的所有年龄大于15的男学生
      select s.* from student s inner join student_lesson_relation sl on s.id = sl.student_id where sl.lesson_id = ? and sex = 1 and YEAR(CURDATE()) - YEAR(birthday) > 15
  23. Mysql 锁的机制
  24. mysql 主从复制原理
    mysql主从复制——Master-Slave搭建及注意事项
    怎样解决MySQL数据库主从复制延迟的问题
    MySQL主从库配置和主库宕机解决方案
    深入解析Mysql 主从同步延迟原理及解决方案
  25. mysql 2006
  26. mysql char 与 varchar

The Twelve Factors App

发表于 2019-05-01 | 更新于 2020-06-03 | 分类于 程序设计

传送门 Twelve-Factor

简介

现代纪元,软件一般发布为一个服务,一般称为 web-apps 或着 saas. Twelve-Factors-App 是一种方法论 用来构建有如下特征的 SaaS:

  • 使用声明式格式实现安装自动化,以减少部署的时间与人力成本。
  • 与底层操作系统有一个干净的契约,在执行环境之间提供最大的可移植性;
  • 适合在现代云平台上部署,不需要服务器和系统管理;
  • 最大限度地减少开发环境和生产环境之间的差异,实现持续部署以获得最大的敏捷性
  • 可以在不需要对工具、架构或开发实践进行重大更改的情况下进行扩展。
    十二因素方法可以应用于以任何编程语言编写的应用程序,这些应用程序可以使用任何后台服务(数据库、队列、内存缓存等)的组合。

背景

本文档的贡献者直接参与了数百个应用程序的开发和部署,并通过他们在Heroku平台上的工作间接见证了数十万个应用程序的开发、运行和扩展。

本文档综合了我们在各种软件即服务应用程序方面的所有经验和观察结果。它是对应用程序开发的理想实践的三角剖分,特别关注随着时间的推移应用程序的有机增长的动态、开发程序代码库的开发人员之间的协作动态,以及避免软件侵蚀的成本。

我们的动机是提高对我们在现代应用程序开发中看到的一些系统问题的认识,提供讨论这些问题的共享词汇表,并通过附带的术语为这些问题提供一组广泛的概念性解决方案。该格式的灵感来自Martin Fowler的《Patterns of Enterprise Application Architecture》和《Refactoring》。

谁应该读这个文档

任何构建作为服务运行的应用程序的开发人员。部署或管理此类应用程序的运维工程师。

1. 基准代码

一份在版本控制中被跟踪的基准代码,多份部署

一个12个因素的应用程序总是在一个版本控制系统(如Git,Mercurial,Subversion)中被跟踪。一份用来跟踪代码所有修订版本的数据库的副本被称作代码库(code repository),通常缩写为 code repo 或仅 repo.

基准代码是一个的 repo (集中式版本控制系统中,如 Subversion)或者 一组共享根提交的 repos (分布式版本控制系统,如 git).

基准代码和应用程序之间始终存在一对一的关联:

  • 如果有多个基准代码,那么它就不是一个应用程序,而是一个分布式系统。分布式系统中的每个组件都是一个应用,每个组件都可以单独满足12-Factors。
  • 多个应用程序共享相同的代码是违反12-Factors原则的。这里的解决方案是将共享代码拆分成独立类库,通过依赖关系管理器(php composer, go mod, python gem, node npm)进行管理。

codebase-deploys

每个应用程序只有一个基准代码,可以有多份部署。每个部署是基准代码的一个运行实例。这通常是一个生产环境站点,以及一个或多个预演站点。此外,每个开发人员都有一个在本地开发环境中运行的应用程序副本,每个副本都是一份部署。

基准代码在所有部署中都是相同的,尽管每个部署中可能有使用不同的版本。例如,开发人员有一些提交尚未部署到预演版本的代码;预演环境有一些提交尚未部署到生产环境。但它们都共享相同的基准代码,因此可以识别为同一应用程序的不同部署。

未完待续…..

Go-Tips

发表于 2018-12-19 | 更新于 2020-06-22 | 分类于 GO
  1. 数组长度是数组类型的一部分,eg:元素类型相同但是长度不同的两个数组不是同类型的。
  2. 切片slice[0:n]共享底层数组,可以使用copy方法避免共享底层数组。
  3. map是一种无序的键值对,它是数据结构hash表的一种实现方式。要求作为key的类型不能是数组、切片、map,其取值必须可以使用 == 判断;线程不安全,必要时加锁或者使用sync.Map;使用make函数初始化的时候,可以设置初始容量,如过使用var定义单不赋值,其值为nil且不可直接map[key] = value 进行赋值。
  4. 原始类型的所有操作同样适用于自定义类型,可以使用显示的类型转换进行转换。
  5. 结构体可以内嵌结构体,但是如果是其本身那么只能使用指针。
  6. 方法的接受者只能是使用type定义的类型,方法名不能重复,方法名也不能同字段名重复。
  7. defer延迟执行,倒序,可能会影响函数最终返回。
  8. goroutine:在for循环中注意参数作用域,非缓冲channel程序必须同时存在接收和写入chan的goroutine.单向chan通常作为函数参数。
  9. 切片也是并发不安全的。可考虑加锁,可使用sync.RWMutex来提高读的并发能力。
  10. file.Seek读并发不安全;file.ReadAt并发安全
  11. 追加写入文件的方法:

    1
    2
    3
    4
    func (f *File)Seek(offset int64, whence int)(ret int64, err)
    func (f *File) WreatAt([]byte, off int64)(n int, err)
    // 或以追加的方式打开直接写入
    f, err := os.OpenFile(filename, os.O_WRONLY | os.O_APPEND, 066)
  12. 空结构体,同一字面量,地址相同

    1
    2
    3
    4
    5
       type Conn struct {}
    c := Conn{}
    c1 := Conn{}
    // fmt.Println(&c == &c1) // 单独取消注释:output:false, 两行一起取消注释 output:true
    // fmt.Printf("%p == %p \n", &c, &c1) //output: 0x11a8c30 == 0x11a8c30

True liberty is to have power over oneself in all things.
真正的自由是在所有时候都能控制自己。
​

Hello World

发表于 2018-06-15 | 更新于 2019-04-15

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

朴朴君

万邪、诸恶的克星。

10 日志
8 分类
11 标签
github weibo linkedin
© 2022 朴朴君
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Mist v6.3.0