每周完成一个 ARTS: Algorithm: 每周至少做一个 LeetCode 的算法题 Review: 阅读并点评至少一篇英文技术文章 Tips: 学习至少一个技术技巧 Share: 分享一篇有观点和思考的技术文章
0098_validate_BST.go
/* ** in-ordering traverse binary search tree slice is a ordered slice ** using that propertity could validate binary search tree */ type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func isValidBST01(root *TreeNode) bool { treeNodeValue, treeNodeStack := []int{}, []*TreeNode{} if root == nil { return true } if root.Left == nil && root.Right == nil { return true } // inorder_travering for root != nil || !isEmpty(treeNodeStack) { for root != nil { // push treeNodeStack = append(treeNodeStack, root) root = root.Left } if !isEmpty(treeNodeStack) { // pop tempNode := treeNodeStack[len(treeNodeStack)-1] treeNodeStack = treeNodeStack[:len(treeNodeStack)-1] treeNodeValue = append(treeNodeValue, tempNode.Val) root = root.Right } } for i := 0; i < len(treeNodeValue) - 1; i++ { if treeNodeValue[i] >= treeNodeValue[i+1] { return false } } return true } func isEmpty(stack []*TreeNode) bool { if len(stack) == 0 { return true } else { return false } } /* ** using recursion realize binary search tree validation */ const ( MAX = 1 << 32 - 2 MIN = -1 << 32 - 1 ) func isValidBST02(root *TreeNode) bool { return recur(MIN, MAX, root) } func recur(min, max int, root *TreeNode) bool { if root == nil { return true } return min < root.Val && max > root.Val && recur(min, root.Val, root.Left) && recur(root.Val, max, root.Right) }0235_lowestCommonAncestor.go
package leetCode type TreeNode struct { Val int Left *TreeNode Right *TreeNode } // using binary search tree property: // root.value > left.value && root.value < right.value // if root.value > ( p.value && q.value ), ancestor in left subtree // if root.value < ( p.value && q.value ), ancestor in right subtree // if root.value > p.value && root.value < q.value, ancestor is root // if root.value < p.value && root.value > q.value, ancestor is root // if root.value == left.value || root.value == right.value, ancestor is root func lowestCommonAncestor02(root, p, q *TreeNode) *TreeNode { if root == nil || root == p || root == q { return root } if root.Val > p.Val && root.Val > q.Val { return lowestCommonAncestor02(root.Left, p, q) } else if root.Val < p.Val && root.Val < q.Val { return lowestCommonAncestor02(root.Right, p, q) } else { return root } return nil }0236_lowestCommonAncestor.go
package leetCode type TreeNode struct { Val int Left *TreeNode Right *TreeNode } // this question is find node in binary in actually // according to p and q position, figure out their first ancestor node func lowestCommonAncestor01(root, p, q *TreeNode) *TreeNode { // exist condition if root == nil || root == p || root == q { return root } // search nodes p and q in left subtree // if p and q in left subtree, right == nil, recurs left subtree // if p and q not in left subtree, left == nil, recurs right subtree // if p or q in left subtree, left != nil && right != nil, // first ancestor is root left := lowestCommonAncestor(root.Left, p, q) right := lowestCommonAncestor(root.Right, p, q) if left != nil && right != nil { return root } if left == nil { return right } if right == nil { return left } return nil }MySQL源码安装
MySQL源码安装,本例以在CentOS7上安装MySQL5.7为例
下载地址
https://dev.mysql.com/downloads/mysql/5.7.html#downloads安装依赖包
CentOS:
yum -y install gcc gcc-c++ cmake bison bison-devel ncurses ncurses-devel openssl-develUbuntu:
apt-get install cmake libncurses5-dev pkg-config openssl libssl-dev创建用户和组
groupadd mysql useradd -g mysql -s /sbin/nologin -M mysql创建文件目录
mkdir -p /usr/local/mysql mkdir -p /usr/local/boost mkdir -p /data/mysql修改目录权限:
chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /data/mysql预编译
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DSYSCONFDIR=/etc \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ -DDOWNLOAD_BOOST=1 \ #若boost已经下载更改为0即可 -DWITH_BOOST=/usr/local/boost /* 注意: 1、编译过程需要较长的时间,需耐心等待。 2、重新cmake时,由于cmake生成临时文件CMakeCache.txt,需要先删除CMakeCache.txt文件,避免不必要的错误,即 rm CMakeCache.txt */编译之后安装
make install配置环境变量
# 可编辑/etc/profile,增加内容: PATH=$PATH:/usr/local/mysql/bin export PATH初始化
# –initialize-insecure 不会生成密码 # -–initialize 会生成一个随机密码 # -–datadir 目标目录下不能有数据文件 # 初始化命令: mysqld --defaults-file=/etc/my.cnf \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/mysql \ --initialize # 如果需要重新初始化,清空datadir即可: rm -fr /data/mysql/* # 备注:5.7之前的版本采用mysql_install_db初始化配置mysql服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql启动服务
service mysql status/start/stop 或者 systemctl enable mysql systemctl status/start/stop mysql # 如果启动失败,查看/etc/my.cnf文件: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid修改/etc/my.cnf文件,配置见【配置关键参数】
配置root登录密码
mysql_secure_installation执行时出现”Can’t connect to local MySQL server through socket”错误时,尝试增加配置:
[client] socket = /tmp/mysql.sock创建远程访问用户
grant select, insert, update, delete on jasonhzy.* to 'test'@'%' identified by 'test'; flush privileges;配置关键参数
[client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 监听的TCP/IP端口 port = 3306 # mysql安装路径 basedir = /usr/local/mysql # 数据文件位置 datadir = /data/mysql # mysql socket连接文件 socket = /tmp/mysql.sock # mysql进程的文件 pid-file = /data/mysql/mysql.pid # 错误日志文件 log-error = /data/mysql/mysql-error.log # 字符集 character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # init_connect = 'SET NAMES utf8mb4' # skip-character-set-client-handshake = true # 禁用自动提交方式 # autocommit=0 # explicit_defaults_for_timestamp = true # 设置时区 # default-time-zone = '+8:00' # 库名、表名是否区分大小写。默认为0区分大小写。设置1不区分大小写,创建的表、数据库都以小写形式存放磁盘 # lower_case_table_names = 0 # 不在tcp/ip端口上进行监听,所有的连接都是通过本地的socket文件连 # skip-networking # 禁用DNS查询,不能在mysql的授权表中使用主机名,只能使用IP,例如: # grant all on test.* to root@localhost 这是不行的 skip-name-resolve # 默认存储引擎 default-storage-engine = InnoDB # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE # 若未指定,mysql默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED transaction_isolation = REPEATABLE-READ # 是否开启慢查询日志,1表示开启,0表示关闭 slow-query-log = 1 # 慢查询日志文件位置 slow-query-log-file= /data/mysql/mysql-slow.log # 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询. # long_query_time = 10 # 日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。 # log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。 # MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。 # 日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志, # 又需要能够获得更高的系统性能,那么建议优先记录到文件 # log_output=FILE # 指定mysql服务所允许的最大连接进程数,若访问时经常出现"Too Many Connections"的错误提示,则需要增大该参数值。 max_connections = 1000 # 每个主机连接允许异常中断的次数,当超过该次数mysql服务将禁止该主机的连接请求。若让禁止的host仍可连接,方法如下: # 1、重启mysql服务 2、flush hosts 3、mysqladmin flush-hosts -hlocalhost -P 3306 -uroot -p max_connect_errors = 1000000 # 服务器标识id(用于主从复制) server-id = 10 # 二进制日志存放路径 log_bin = mysql-bin log_bin_index = /data/mysql/mysql-bin.index # binlog格式,复制有3种模式STATEMENT,ROW,MIXED binlog_format = row # 如果你在使用链式从服务器结构的复制模式 (A->B->C), # 你需要在服务器B上打开此项. # 此选项打开在从线程上重做过的更新的日志, # 并将其写入从服务器的二进制日志. # log_slave_updates # 独立表空间,每个表的数据和索引单独存放在以表命名的.ibd文件中,最好在安装数据库就设置,使用之后再设置可能无法重启 # 节省空间/提升性能,但单表增加过大 innodb-file-per-table = 1 # 缓冲池大小,对Innodb表来说非常重要,一般设置为主机内存的70~80% innodb_buffer_pool_size = 6G # 1)为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行. 当事务提交时,不做日志写入操作。 # 当MySQL Crash和OS Crash或者主机断电之后,可能会丢失上一秒的事务数据 # 2)为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。最安全的设置,能够保证不论 # 是MySQL Crash还是OS Crash或者是主机断电都不会丢失任何已经提交的数据 # 3)为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下MySQL # 会每秒定时执行一次flush(刷到磁盘)操作。MySQL Crash并不会造成数据的丢失,但是OS Crash或者是主机断电后可能丢失 # 简单说来,可选值的安全性从0->2->1递增,分别对应于mysqld进程crash可能丢失 -> OS crash可能丢失 -> 事务安全。 innodb_flush_log_at_trx_commit = 2 #开启gtid gtid_mode=ON enforce-gtid-consistency=ON [mysqldump] max_allowed_packet = 256M # mysqldump导出大表时很有用,强制从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中。 quick注:本文转载自http://jasonhzy.github.io/2019/02/01/mysql-compile-install/