June 20, 2017
使用Let’s Encrypt 给网站加 HTTPS
"2017.03.27更新:/usr/bin/letsencrypt 被 /usr/bin/certbot 替代,更新文章中所用到的命令。参考: Archlinux Let’s Encrypt Wiki\nLet’s Encrypt 证书生成不需要手动进行,官方推荐 certbot 这套自动化工具来实现。3步轻松搞定:\n下载安装 certbot (Let’s Encrypt项目的自动化工具) 创建配置文件 执行证书自动化生成命令 环境: centos7 64位 nginx\n一、安装certbot\n$yum -y install certbot #检查安装是否成功\n$certbot --help 如果安装过程中遇到python的问题,解决办法请参考: https://blog.haohtml.com/archives/17491 二、生成域名证书\n这里使用的域名为 blog.haohtml.com, 网站根目录为 /data/wwwroot/haohtml/blog\n#为一个已经存在的站点生成证书文件,一个证书可以多个域名共用,一次也可以生成多个域名谈证书(内容放在了同一个文件里),命令格式 …"
May 18, 2017
pushState + Ajax 技术
"有时间我们要实现动态修改URL地址,同时更新部分页面内容,但不刷新整个页面,这种情况下用就需要用到一些pjax技术了。\nwindow.history.replaceState 和 window.history.pushState 类似,不同之处在于replaceState不会在window.history里新增历史记录点,其效果类似于window.location.replace(url),都是不会在历史记录点里新增一个记录点的。当你为了响应用户的某些操作,而要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适, 两者的参数是完全一样的。\nwindow.history.replaceState(state, title , url) // “页面标题”目前浏览器暂不支持\nstate:一个与指定网址相关的状态对象{},popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。\ntitle:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。\nurl:新的网址,必须与当前页面处在同一个域。浏览器的地址栏 …"
April 13, 2017
MongoDB中字段的添加与删除
"mongoDB添加和删除表中一个字段\n使用update命令\nupdate命令格式:\ndb.collection.update(criteria,objNew,upsert,multi)\n参数说明:\ncriteria:查询条件\nobjNew:update对象和一些更新操作符\nupsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。\nmulti:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。\n//例如要把User表中address字段删除 db.User.update({},{$unset:{‘address’:”}},false, true)\n参考: https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter\n==================\n添加一列 $set\n//字符类型 db.User.update({},{$set:{‘app_id’:’1′}}, …"
March 29, 2017
git无法pull仓库refusing to merge unrelated histories的解决办法
"在本地有一个很久的项目,需要上传到远程git仓库中,先在远程创建了一个仓库,在本地配置好后,发现上传的时候,提示先git pull 一下,但git pull的时候提示这个错误,主要是因为目前两个git仓库信息不一致问题,我们要将两个项目合并在一起,需要添加一个 –allow-unrelated-histories 参数即可。\n先进入cli命令行模式,执行\ngit pull origin master --allow-unrelated-histories 然后再执行git pull origin master 即可。\n参考: http://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories"
February 7, 2017
查看InnoDB的磁盘空间利用率
"这周阿里集团DBA内部分享时,支付宝的黄忠同学提了一个问题,关于InnoDB索引page 的利用率。\npage********利用率\n主要是指btee里面每个page的使用被使用的空间大小。我们知道InnoDB默认一个page大小是16k。但实际使用情况不会总用满\n我们定义为所有page的总使用字节除以总字节数。\n在理论分析之前,我们要先弄个工具,查一下。\n实例统计\n写了一个简单的工具,读ibd文件上的每个page,算出每个page的实际使用字节,可以得到利用率。\n我们找了线上一个库来模拟。表中有1个自增主键和3个非聚簇索引。不影响结论地简化为如下:\nCREATE TABLE ctu_factor_risk_99_03 (\nseq_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,\na varchar(32) DEFAULT NULL,\nb varchar(32) DEFAULT NULL,\nc varchar(32) DEFAULT NULL,\nKEY a (a),\nKEY bc (b,c),\nKEY cb (c,b),\n) …"
February 7, 2017
关于InnoDB表的page利用率和optimize table
"上一篇我们介绍了ibd_used这个工具,我们用来量化看表数据文件的page使用率。这里用来说明optimize table这个命令的问题和优化。\n实例准备\n建一个这样的表\nCREATE TABLE tb (\nseq_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,\na varchar(32) DEFAULT NULL,\nb varchar(32) DEFAULT NULL,\nc varchar(32) DEFAULT NULL,\nd char(255) DEFAULT NULL,\nPrimary key (seq_id),\nKEY a (a),\nKEY bc (b,c),\nKEY cb (c,b)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n执行语句为“insert into tb(a,b,c) values(randstr, randstr, randstr);” randstr是客户端程序生成的长度30字节的随机字符串。30个线程并发,每个线程插入1w条记录。\n等待更新完成后(包括purge完成,从系统 …"
February 7, 2017
关于 InnoDB 索引长度限制的 tips
"有同学问到InnoDB的索引长度问题,简单说几个tips。\n关于3072\n大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。\n[][1]\n可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825(255*3*5)\u0026gt;3072,报错。\n为什么3072\n我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。\n所以一个记录最多不能超过8k。 又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。 由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。\n单列索引限制\n上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4\u0026gt;767, 于是增加了一个参数叫做 innodb_large_prefix。\n这个参数默认值是OFF。当改为ON时, …"