June 11, 2018
Linux下对进程通信管理的信号机制概述
"\u003cp\u003e今天看到了篇使用golang实现的系统无感重启的文章, \u003ca href=\"https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\"\u003ehttps://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\u003c/a\u003e,一般用来平滑处理一些系统服务,避免先停止再启用导致的服务不可用的情况。其中用到了信号机制,这里找了一些文章主要有来介绍这方面的文章,以便加深理解。 \u003ca href=\"https://blog.csdn.net/junyucsdn/article/details/50519248\"\u003ehttps://blog.csdn.net/junyucsdn/article/details/50519248\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/tiany524/article/details/17048069\"\u003ehttps://blog.csdn.net/tiany524/article/details/17048069\u003c/a\u003e \u003ca href=\"https://my.oschina.net/chenliang165/blog/125825\"\u003ehttps://my.oschina.net/chenliang165/blog/125825\u003c/a\u003e\u003c/p\u003e"
June 7, 2018
MySQL中的sql_mode模式
"\u003cp\u003e官方文档: \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\"\u003ehttps://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、模式分类\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在MySQL8.0中主要包括以下几种模式\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003eONLY_FULL_GROUP_BY\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eSTRICT_TRANS_TABLES\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_IN_DATE\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_DATE …\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
June 7, 2018
了解MySQL中的驱动表
"\u003cp\u003e\u003cstrong\u003e一、为什么要用小表驱动大表\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、驱动表的定义\u003c/p\u003e\n\u003cp\u003e当进行多表连接查询时, [驱动表] 的定义为:\u003c/p\u003e\n\u003cp\u003e1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]\u003c/p\u003e\n\u003cp\u003e2)未指定联接条件时,行数少的表为[驱动表](重要)\u003c/p\u003e\n\u003cp\u003e忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 MySQL 运行时自行判断\u003c/p\u003e\n\u003cp\u003e既然“未指定联接条件时,行数少的表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示),就别指定谁 left/right join 谁了,请交给 MySQL优化器 运行时决定吧。\u003c/p\u003e\n\u003cp\u003e2、mysql关联查询的概念:\u003c/p\u003e\n\u003cp\u003eMySQL 表关联的算法是 \u003ca href=\"http://lizhen3708693.iteye.com/blog/1631406\"\u003eNest Loop Join(嵌套循环)\u003c/a\u003e,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。\u003c/p\u003e\n\u003cp\u003e例: user表10000条数据,class表20条数据\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSELECT * FROM user u LEFT JOIN class c u.userid=c.userid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样则需要用user表循环10000次才能查询出来,而如果 …\u003c/p\u003e"
April 26, 2018
U盘安装Centos7.4
"\u003cp\u003e启动盘制作教程: \u003ca href=\"https://www.cnblogs.com/yeeo1/p/7306611.html\"\u003ehttps://www.cnblogs.com/yeeo1/p/7306611.html\u003c/a\u003e \u003ca href=\"http://blog.51cto.com/mifan6/2070118\"\u003ehttp://blog.51cto.com/mifan6/2070118\u003c/a\u003e\u003c/p\u003e"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"\u003cp\u003e\u003cstrong\u003e//创建一个独立的容器目录\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir docker-db\ncd docker-db\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e前提、创建 docker Compose 配置文件\u003c/strong\u003e\n#vi docker-compose.yml 文件,内容如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n\n db:\n image: hub.c.163.com/library/mysql:5.7\n restart: always\n environment:\n MYSQL_ROOT_PASSWORD: 123456\n MYSQL_DATABASE: wordpress\n MYSQL_USER: root\n MYSQL_PASSWORD: 123456\n MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34;\n ports:\n - \u0026#34;33061:3306\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eimage也可以直接写mysql:5.7 …\u003c/p\u003e"
March 29, 2018
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
"\u003cp\u003eInnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。\u003c/p\u003e\n\u003ch1 id=\"innodb有三种行锁的算法\"\u003e\u003cstrong\u003eInnoDB有三种行锁的算法\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e1,Record Lock:单个行记录上的锁。\u003c/p\u003e\n\u003cp\u003e2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。\u003c/p\u003e\n\u003cp\u003e3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e锁的是索引,并不是记录。\u003c/strong\u003e\n记录锁(Record Lock): 单个索引行记录上的锁\n间隙锁(Gap Lock):一般是针对非唯一索引而言的.\n后码锁(Next-Key Lock):记录锁和间隙锁的结合,对于InnoDB中,更新\u003cstrong\u003e非唯一索引\u003c/strong\u003e对应的记录,会加上Next-Key Lock。在RR下如果where未使用索引会使用全表扫描,这个时候会有Next-Key Lock。如果更新记录为空,就不能加记 …\u003c/p\u003e"
March 29, 2018
聚簇索引概念(Myisam与Innodb索引的区别)转推荐
"\u003cp\u003emyisam的主索引和次索引都指向物理行,下面来进行讲解\u003c/p\u003e\n\u003cp\u003einnodb的主键下存储该行的数据,此索引指向对主键的引用\u003c/p\u003e\n\u003cp\u003emyisam的索引存储图如下,可以看出,无论是id还是cat_id,\u003cstrong\u003e下面都存储有存储物理地址的值。通过主键索引或者次索引来查询数据的时候,都是先查找到\u001b数据地址,然后再到物理位置上去寻找数据\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/myisam-index-struct.png\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003einnodb的索引存储图如下,我们会发现,\u003cstrong\u003e主键索引下面直接存储有数据,而次索引下,存储的是主键的id(不同于MyISAM,存储的是内容数据的物理地址)\u003c/strong\u003e。通过主键查找数据的时候,就会很快查找到数据,但是通过次索引查找数据的时候,需要先查找到对应的主键id,然后才能查找到对应的数据。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/innodb-index-struct.png\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\nInnoDB的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对\u003cstrong\u003e主键的引用\u003c/strong\u003e.\nMyisam中, 主索引和次索引,都指向物理行(\u003cstrong\u003e磁盘位置\u003c/strong\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意:对InnoDB来说,\u003c/strong\u003e\n1: 主键索引 既存储索引值,又在叶子中存储行的数据\n2: 如果没有主键, 则会Unique key做主键\n3: 如果没有unique,则系统生成一个内部的rowid做主键.\n4: \u003cstrong\u003e像innodb …\u003c/strong\u003e\u003c/p\u003e"
March 27, 2018
IE浏览器报Promise错误的解决办法
"\u003cp\u003e说明ie浏览器不支持Promise,可搜索关键字 polyfill,引入以下库即可\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=es6\"\u003ehttps://cdn.polyfill.io/v2/polyfill.min.js?features=es6\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e官方文档: \u003ca href=\"https://cdn.polyfill.io/v2/docs/\"\u003ehttps://cdn.polyfill.io/v2/docs/\u003c/a\u003e\n参考: \u003ca href=\"https://www.cnblogs.com/XHappyness/p/7919610.html\"\u003ehttps://www.cnblogs.com/XHappyness/p/7919610.html\u003c/a\u003e\n参考: \u003ca href=\"https://www.jianshu.com/p/2888a8e204e8\"\u003ehttps://www.jianshu.com/p/2888a8e204e8\u003c/a\u003e\u003c/p\u003e"
March 12, 2018
linux下git版本过底引起的无法git clone的解决方案
"\u003cp\u003e刚安装的新系统,git版本为1.8.3,使用git clone命令的时候,提示“… Peer reports incompatible or unsupported protocol version”\u003c/p\u003e\n\u003cp\u003e只需要升级一下基本包即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo yum update nss curl \u003cspan style=\"color:#75715e\"\u003e# nss为名称解析和认证服务 curl为网络请求库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
March 8, 2018
Go中slice作为参数传递的一些“坑”
"\u003cp\u003e看明白了这篇文章,下面的例子基本也就明白了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\ta := []int{1,2,3}\n\tabc(a)\n\tfmt.Println(a)\n}\nfunc abc(a []int) {\n\ta[0] = 2 //修改后还是原来的a\n\ta = append(a, 4) // 此a非原a,使用append导致了重新分配内存地址(存储空间不足,系统自动分配一块新的足够大的内存地址,此时a的物理内存地址已经发行了变化,并将原来a的值copy一份到新的内存地址,所以这里修改的只是新内存地址的值,原来内存地址的值并没有改变),试着删除这行运行一次再看结果\n\tfmt.Println(a)\n\n\ta[0] = 7 // 新a,因为上面执行了append\n\tfmt.Println(a)\n\n\tfmt.Printf(\u0026#34;\\n===\\n\u0026#34;)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e解释:\n[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/golang_slice_append.png\" alt=\"\"\u003e][1]\u003c/p\u003e"
March 3, 2018
golang中string rune byte 三者的关系
"\u003cp\u003e\u003ccode\u003eGo\u003c/code\u003e 语言中 \u003ccode\u003ebyte\u003c/code\u003e 和 \u003ccode\u003erune\u003c/code\u003e 实质上就是 \u003ccode\u003euint8\u003c/code\u003e 和 \u003ccode\u003eint32\u003c/code\u003e 类型。 \u003ccode\u003ebyte\u003c/code\u003e 用来强调数据是 \u003ccode\u003eraw data\u003c/code\u003e,而不是数字;而 \u003ccode\u003erune\u003c/code\u003e 用来表示 \u003ccode\u003eUnicode\u003c/code\u003e 的 \u003ccode\u003ecode point\u003c/code\u003e。参考 \u003ca href=\"https://golang.org/ref/spec#Numeric_types\"\u003e规范.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在Golang中 string 底层是用byte字节数组存储的,并且是不可以修改的。\u003c/p\u003e\n\u003ch1 class=\"postTitle.wp-block-heading\" id=\"go语言中的byte和rune区别对比\"\u003eGo语言中的byte和rune区别、对比\u003c/h1\u003e\n\u003cp\u003e例如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003es:=\u0026#34;Go编程\u0026#34;\nfmt.Println(len(s)) //输出结果应该是8因为中文字符是用3个字节存的(2+3*2=8)。\nfmt.Printf(\u0026#34;%d\u0026#34;, len(string(rune(\u0026#39;编\u0026#39;)))) //经测试一个汉字确实占用3个字节,所以结果是3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果想要获得字符个数的话,需要先转换为rune切片再使用内置的len函数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efmt.Println(len([]rune(s))) // 结果就是4了。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\n\u003ccode\u003erune …\u003c/code\u003e\u003c/p\u003e"
February 21, 2018
解决mac下brew link python3出错brew Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
"\u003cp\u003emac上默认的python版本为2.7.10版本,需要升级到python3 版本,通过brew升级\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$brew install python3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提示错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ brew install python3 Warning: python3 3.6.3is already installed, it‘s just not linked. You can use \u003ccode\u003ebrew link python3\u003c/code\u003e to link this version. $ brew link python3 Linking /usr/local/Cellar/python3/3.6.3… Error: Permission denied @ dir_s_mkdir\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e发现\u003ccode\u003e/usr/local/\u003c/code\u003e下没有路径\u003ccode\u003e/usr/local/Frameworks\u003c/code\u003e\n需要新建该路径,并修改权限\u003c/p\u003e\n\u003cp\u003e解决:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo mkdir /usr/local/Frameworks\n$ sudo chown $(whoami):admin /usr/local/Frameworks\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew link python3\nLinking …\u003c/code\u003e\u003c/pre\u003e"
February 8, 2018
Docker Machine 简介
"\u003cp\u003e一句话概括的话就是 Docker Machine是一个可以方便对多个宿主服务器中的多个容器进行管理的工具。\u003c/p\u003e\n\u003cp\u003eDocker 与 Docker Machine 的区别 \u003ca href=\"https://www.cnblogs.com/sparkdev/p/7066789.html\"\u003ehttps://www.cnblogs.com/sparkdev/p/7066789.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 工具出现的意义 \u003ca href=\"https://www.2cto.com/net/201707/660864.html\"\u003ehttps://www.2cto.com/net/201707/660864.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 用法 \u003ca href=\"http://www.linuxidc.com/Linux/2017-06/145232.htm\"\u003ehttp://www.linuxidc.com/Linux/2017-06/145232.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 命令 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMac平台上Docker安装与使用 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e"
February 8, 2018
windows平台在dos下执行docker pull 命令出错
"\u003cp\u003e\u003cstrong\u003e这里docker Machine 是安装和管理 Docker 的工具(用来代替Boot2Docker,对于个人玩的话,不建议使用docker Machine,毕竟多了一个虚拟层,不如直接使用当前物理机器作为容器的宿主机)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker pull gitlab/gitlab-ce:latest\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eWarning: failed to get default registry endpoint from daemon (error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the …\u003c/p\u003e\u003c/blockquote\u003e"
January 26, 2018
利用“码云gitee”的钩子实现git仓库自动更新
"\u003cp\u003e使用git时,传统发布方式是手动将新代码 上传到远程仓库,然后在登录服务器执行git pull命令拉取最新的代码,这种操作如果频繁更新的话,我们可以利用git的钩子来实现自动 部署 功能。\u003c/p\u003e\n\u003cp\u003e前提:\nlinux\nphp (gitpull.php)\nnginx 运行用户为 www\u003c/p\u003e\n\u003cp\u003e注意网站 gitpull.php 文件权限问题,还有是否有shell_exec 命令的执行权限\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、先创建自动部署用户的密钥\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo - www\nssh-keygen -t rsa -C \u0026#34;[email protected]\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e二、将用户www生成的公钥添加到码云后台\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecat ~/.ssh/id_rsa.pub\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e三、将码云域名gitee.com 添加到授权白名单\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003essh-keyscan -t rsa gitee.com \u0026gt;\u0026gt; ~/.ssh/known_hosts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e或者以www用户执行一次gitpull命令\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo - www\ncd /data/wwwroot/www\ngit pull\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e根据提示,输入 yes 即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e四、在码云的部署钩子里进行url设置\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eurl …\u003c/p\u003e"