邓老师 发布的文章

Vim前端开发神器--Emmet(html编辑插件)
1)去home目录下,并查看home目录下是否有.vim目录和.vimrc文件,如果没有,则新建,执行以下命令:

cd ~/.vim
touch .vimrc

2)安装pathogen.vim,执行以下命令
pathogen是安装其他包的工具
创建目录:

mkdir -p ~/.vim/autoload ~/.vim/bundle

安装pathogen:

curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
curl是软件安装的一种方式

3)安装git

sudo apt-get install git
使用以下命令测试git是否安装成功

git --version

4) 使用pathogen.vim和git安装vim-emmet

5).进入.vim的bundle目录

cd ~/.vim/bundle

6).下载插件

git clone https://github.com/mattn/emmet-vim.git

7).编辑.vimrc
vim ~/.vimrc
输入以下内容:

"启动pathogen插件管理器
      execute pathogen#infect()
"默认的触发键是ctrl+y+,
"更改触发键为ctrl+e 
      let g:user_emmet_expandabbr_key = '<C-e>'
"在每行前面显示文本行数:
      set nu  
"设置tab键缩进间距为两个英文字母长度
      set tabstop = 2
"设置换行后缩进对齐
      set autoindent

8)测试
测试
vim index.html
输入 html:5
然后用快捷建 ctrl+e

效果

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
     _
</body>
</html>

嵌套操作符
使用 > 生成元素子节点

<!-- div>ul>li -->
<div>
    <ul>
        <li></li>
    </ul>
</div>

使用 + 生成元素兄弟节点

<!-- div+p+bq -->
<div></div>
<p></p>
<blockquote></blockquote>

操作符 ^ 的作用和 > 刚好相反
用 ^ 可以在父级生成新的节点

<!-- div+div>p>span+em^bq -->
<div></div>
<div>
    <p><span></span><em></em></p>
    <blockquote></blockquote>
</div>

用n个 ^ ,就可以在第n父级生成新的节点

<!-- div+div>p>span+em^^^bq -->
<div></div>
<div>
    <p><span></span><em></em></p>
</div>
<blockquote></blockquote>

使用 * 生成多个相同元素

<!-- ul>li*5 -->
<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

圆括号 () 是Emmet的高级用法,用来实现比较复杂的DOM结构

<!-- div>(header>ul>li*2>a)+footer>p -->
<div>
    <header>
        <ul>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
        </ul>
    </header>
    <footer>
        <p></p>
    </footer>
</div>

还可以嵌套使用圆括号 ()

<!-- (div>dl>(dt+dd)*3)+footer>p -->
<div>
    <dl>
        <dt></dt>
        <dd></dd>
        <dt></dt>
        <dd></dd>
        <dt></dt>
        <dd></dd>
    </dl>
</div>
<footer>
    <p></p>
</footer>

属性操作
Emmet给元素添加ID和CLASS的方法和CSS的语法类似

<!-- div#header+div.page+div#footer.class1.class2.class3 -->
<div id="header"></div>
<div class="page"></div>
<div id="footer" class="class1 class2 class3"></div>

使用[attr]标记来添加自定义属性

<!-- td[title="Hello world!" colspan=3] -->
<td title="Hello world!" colspan="3"></td>

使用 $ 操作符可以对重复元素进行有序编号

<!-- ul>li.item$*5 -->
<ul>
    <li class="item1"></li>
    <li class="item2"></li>
    <li class="item3"></li>
    <li class="item4"></li>
    <li class="item5"></li>
</ul>

还可以用多个 $ 定义编号的格式

<!-- ul>li.item$$$*5 -->
<ul>
    <li class="item001"></li>
    <li class="item002"></li>
    <li class="item003"></li>
    <li class="item004"></li>
    <li class="item005"></li>
</ul>

使用 @ 修饰符可以改变编号的格式
在 $ 后面添加 @- 可以改变编号顺序

<!-- ul>li.item$@-*5 -->
<ul>
    <li class="item5"></li>
    <li class="item4"></li>
    <li class="item3"></li>
    <li class="item2"></li>
    <li class="item1"></li>
</ul>

在 $ 后面添加 @N 可以改变编号基数

<!-- ul>li.item$@3*5 -->
<ul>
    <li class="item3"></li>
    <li class="item4"></li>
    <li class="item5"></li>
    <li class="item6"></li>
    <li class="item7"></li>
</ul>

还可以组合使用上面的修饰符

<!-- ul>li.item$@-3*5 -->
<ul>
    <li class="item7"></li>
    <li class="item6"></li>
    <li class="item5"></li>
    <li class="item4"></li>
    <li class="item3"></li>
</ul>

文本操作
Emmet使用 Text:{} 给元素添加文本内容

a{Click me}--><a href="">Click me</a>
<!-- a{click}+b{here} -->
<a href="">click</a><b>here</b>
<!-- a>{click}+b{here} -->
<a href="">click<b>here</b></a>
<!-- p>{Click }+a{here}+{ to continue} -->

<p>Click <a href="">here</a> to continue</p>


其他例子

<!-- #page>div.logo+ul#navigation>li*5>a{Item $} -->
<div id="page">
    <div class="logo"></div>
    <ul id="navigation">
        <li><a href="">Item 1</a></li>
     <li><a href="">Item 2</a></li>
        <li><a href="">Item 3</a></li>
        <li><a href="">Item 4</a></li>
        <li><a href="">Item 5</a></li>
    </ul>
</div>

Emmet没有预设任何标签名,所以可以使用任何可用名称来生成HTML标签:div →

或 foo →

其他常用快捷键:

,    展开简写式
d    Balance a Tag Inward(选中包围的标签?)
D    Balance a Tag Outward
n    进入下个编辑点
N    进入上个编辑点
i    更新图像尺寸
m    合并文本行
k    删除标签
j    分解/展开空标签
/    注释开关
a    从URL生成anchor标签
A    从URL生成引用文本

cmd 里面的 certutil
Power Shell 里面的 Get-FileHash

用法: CertUtil [选项] -hashfile InFile [HashAlgorithm]
certutil -hashfile D:\1.txt
certutil -hashfile D:\1.txt md5
Get-FileHash D:\1.txt
Get-FileHash D:\1.txt -Algorithm md5

mysqlslap -hlocalhost -uroot -p123456 -P3306 --concurrency=1100 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000 --debug-info

执行结果如下:
Benchmark

Running for engine innodb
Average number of seconds to run all queries: 1.630 seconds
Minimum number of seconds to run all queries: 1.630 seconds
Maximum number of seconds to run all queries: 1.630 seconds
Number of clients running queries: 1100
Average number of queries per client: 0

User time 0.53, System time 0.92

常用参数 [options] 详细说明:

--auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。
--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)。
--auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。
--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
--number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
--number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
--query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--create-schema 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database。
--commint=N 多少条DML后提交一次。
--compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
--concurrency=N, -c N 表示并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。例如:--concurrency=100,200,500。
--engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb。
--iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次。
--only-print 只打印测试语句而不实际执行。
--detach=N 执行N条语句后断开重连。
--debug-info, -T 打印内存和CPU的相关信息。

说明:
测试的过程需要生成测试表,插入测试数据,这个mysqlslap可以自动生成,默认生成一个mysqlslap的schema,如果已经存在则先删除。可以用--only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹。

各种测试参数实例(-p后面跟的是mysql的root密码):

单线程测试。测试做了什么。

mysqlslap -a -uroot -p123456

多线程测试。使用–concurrency来模拟并发连接。

mysqlslap -a -c 100 -uroot -p123456

迭代测试。用于需要多次执行测试得到平均值。

mysqlslap -a -i 10 -uroot -p123456

mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456

mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456

mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456

mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456

mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456

mysqlslap -a -e innodb -uroot -p123456

mysqlslap -a --number-of-queries=10 -uroot -p123456

测试同时不同的存储引擎的性能进行对比:

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -p123456

执行一次测试,分别50和100个并发,执行1000次总查询:

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -p123456

50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -p123456

https://blog.csdn.net/zhu19774279/article/details/38645663

  1. 硬件

今天,大数据集(largedatasets)的内存一般都是数以百G,即使是T级别也没什么好惊讶。MySQL需要足够多的内存,以提供最佳性能,如缓存热点数据、索引、大量变化(ongoing changes)。InnoDB有更短的响应时间,并能以更合理的方式利用磁盘IO。从CPU来看,当然是核越多、速度越快越好。32/64核的CPU已经越来越普遍,最新版本的MySQL在对多核CPU的支持上也比以前的版本要好得多。再来看存储,SSD正在取代传统的机械硬盘,并获得了巨大的成功,当然这是用钱来换最好的性能。RAID 10仍然是多数情况下的首选,但要确保你的RAID控制器能够很好的支持SSD硬盘,以免成为瓶颈。当然如果你对IOPS有很高的需求,可以选择多个PCI-e Flash卡。

  1. 操作系统

Linux是最常见的高性能MySQL的服务器。请确保使用最新的内核和现代的文件系统,如EXT 4或XFS。两种文件系统都有各自的优缺点:如XFS删大文件时比较快,EXT4却能让SSD硬盘有更好的性能。选择权在你手上。这篇文章(www.ssdperformanceblog.com/2013/04/testing-the-micron-p320h/)(很奇怪这个网站用Firefox、chrome或IE都打不开,翻墙也打不开,实在不知道什么原因——译者注)告诉你如何让EXT4比XFS有更好的性能。当你的表特别多,而你又使用了innodb_file_per_table参数的时候,noatime和nodiratime将会给你带来一点点的性能提升。Linux的默认I/O调度程序是CFQ(Completely Fair Queuing),实际上多数情况下Noop/Deadline有更好的性能。对于MySQL专用服务器,将swappiness设为0是一个不错的选择,因为这可以降低swapping的延迟。要确保MySQL的主机不会出现内存不足的情况。swapping对MySQL是有害的,并且会阻止内存中的缓存。想了解更多有关swapping的知识,可以阅读这篇文章(www.mysqlperformanceblog.com/2008/04/06/should-you-have-your-swap-file-enabled-while-running-mysql/)。

  1. MySQL InnoDB 配置

从5.5开始,InnoDB是默认的引擎,所以这些参数能够比以前更好的优化性能。最重要的是以下这些:

    innodb_buffer_pool_size:缓冲池对InnoDB的影响很大,一定要配置正确,因此要给这个值分配足够的内存。通常是可用内存的70%-80%。更确切地说,如果你的内存比数据集大那么一点,那么让这个值比数据库的大小大一点最好,当然你需要注意数据库大小的增长,并经常调整innodb缓冲池的大小,使二者大小保证一致。(这句话没看太懂,原文是:More precisely, if you have RAM bigger than your dataset setting itbit larger should be appropriate with that keep in account of your databasegrowth and re-adjust innodb buffer pool size accordingly.)如果你用的是PerconaServer 5.1或Percona Server 5.5,那么在代码级别对InnoDB的缓冲有优化,相关知识可以看这篇文章http://www.percona.com/doc/percona-server/5.5/scalability/innodb_split_buf_pool_mutex.html。

    innodb_buffer_pool_instances:InnoDB1.1和MySQL5.5中介绍了多Innodb缓冲池。5.5中这个值默认大小是1,而5.6中是8。这个参数的取值范围是1-64。在高并发的任务中允许使用innodb_buffer_pool_instances会非常有效,因为它能够减少全局互斥锁(global mutexes)的存在。(这个参数在CentOS版的MySQL-5.5.39的配置文件中没有,不知原文作者说的5.5中的默认值哪来的——译者注)

    Dump/Restore Buffer Pool:这个参数能够在重启时,提高保存、恢复缓冲池内容的速度。这个特性最早出现在Percona Server 5.5中,可以通过这两篇文章做进一步了解(http://www.percona.com/doc/percona-server/5.5/management/innodb_lru_dump_restore.html?id=percona-server:features:innodb_lru_dump_restore,http://www.mysqlperformanceblog.com/2010/01/20/xtradb-feature-save-restore-buffer-pool/)。MySQL 5.6中也加入了该特性,要在数据库启动或关闭时自动dump数据,需要将innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup设置为ON。

    innodb_log_file_size:足够大的InnoDB事务日志,对于稳定的、高质量写性能至关重要。但巨大的日志文件同样意味着崩溃以后的恢复会很慢。当然,在5.5进行巨大改进以后,这一点已经不再是经常争论的重点。MySQL 5.6将默认值从5MB调整到50MB,但这个值对于很多情况依然太小。另外,在MySQL 5.6中,如果这个参数值被改变,那么MySQL将会在重启的时候自动调整大小。在MySQL 5.6中,合并后的日志文件大小从4G调整到512G。有关日志最佳大小的问题,可以阅读这篇文章(http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/)

    innodb_log_buffer_size:InnoDB的写操作,将数据写入到内存中的日志缓存中,由于InnoDB在事务提交前,并不将改变的日志写入到磁盘中,因此在大事务中,可以减轻磁盘I/O的压力。通常情况下,如果不是写入大量的超大二进制数据(a lot of huge blobs),4MB-8MB已经足够了。

    innodb_flush_log_at_trx_commit:这个值设为1时,将会在每次日志提交时,将日志缓冲(log buffer)中的内容刷入硬盘,以确保数据最大限度的完整性,当然这样也会对性能带来影响。如果设为2,表示每次日志提交时,仅仅将日志缓冲中的内容刷入操作系统的文件缓存。如果你对ACID不那么关注,并且对于OS崩溃前最后一两秒的事务丢失不那么在意的话,设为2将带来更好的性能。

    innodb_thread_concurrency:随着InnoDB的改善,现在推荐大家使用默认值0,即由InnoDB引擎自己控制并发。如果你看到并发相关的讨论,可以调整这个参数。推荐值的简单计算方法是(CPU的数量+硬盘数量)*2(2 times the number of CPUs plus the number of disks)。这是一个动态变量,这意味着改变这个值不用重启MySQL即可生效。

    innodb_flush_method:DIRECT_IO能减轻I/O的压力。直接I/O不进行缓存,如果设置为O_DIRECT可以避免缓冲池与文件系统的双缓冲,但是需要有RAID控制器以及电池备份的写缓存。(原文不是这样,但原文没看太懂Given that you have hardware RAID controller and battery-backedwrite cache.)

    innodb_file_per_table:从MySQL 5.6开始,这个值默认是ON。这个是默认值是因为可以避免产生巨大的共享表空间,并且可以在drop和truncate一张表的时候,迅速释放空间。独立的表空间同样在Xtrabackup的部分备份时有优势。

除了以上这些,Percona Server 5.5和MySQL 5.6对InnoDB有很多增强。在Percona Server 5.5的XtraDB中加入了Persistentoptimizer statistics,通过innodb_use_sys_stats_table参数控制,相关知识可以阅读这篇文章(http://www.percona.com/doc/percona-server/5.5/diagnostics/innodb_stats.html?id=percona-server:features:innodb_stats&redirect=1#innodb_use_sys_stats_table),在MySQL 5.6中也引入了这个特性。在MySQL5.6中,使用两个新表mysql.innodb_index_stats和mysql.innodb_table_stats来存储persistentstats。通过这个,在查询(query)的时候,能够保证更精确和一致性。更多细节请阅读文档这里http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html#innodb-persistent-stats。同样PerconaServer 5.5里介绍了来自于线程池的特性,可以阅读这个官方文档http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html。另外线程池的知识还可以还可以阅读这里http://www.mysqlperformanceblog.com/2013/03/16/simcity-outages-traffic-control-and-thread-pool-for-mysql/

PerconaServer是免费且开源的。是在MySQL基础上修改的,上面有的特性只有Percona Server才有。

还有很多参数可以调整,但是在这篇文章我们只关注InnoDB。

  1. 为InnoDB优化应用程序

对于应用程序,尤其是以前使用MyISAM引擎的程序来说,需要进行以下调整。

首先,确保在更新操作(update)时使用事务,这样既可以保证一致性,也能够获得更好的性能。其次,如果你的程序有任何写操作,都应该要考虑可能发生的死锁。再次,请检查你的表结构,以确保他们能从InnoDB属性中获得性能改善,如:用主键聚集数据,所有索引都有主键(因此要保证主键短),用主键进行快速查找(试着使用join),大的未压缩的索引(使主键尽可能的简单。)(这一段话不太懂:clustering by primary key, having primary key in all indexes (sokeepprimary key short), fast lookups by primary keys (try to use it in joins),largeunpacked indexes(try to be easy on indexes).)

  1. 总结

本文几乎覆盖了所有和MySQL性能有关的参数,包括InnoDB的基础或进阶参数、OS的参数和硬件配置。通过这些修改,可以确保所有MySQL服务器的性能都得到优化。

1.查看docker版本
docker -v

2.查看镜像仓库中某个镜像
docker search docker镜像
镜像的核心概念

  • 容器技术募集硬件资源的目的,是为了运行软件,提供服务
  • 镜像是容器中运行软件的集合
    Docker镜像仓库: https://hub.docker.com/

3.镜像仓库中下载某个镜像
docker pull ubuntu

4.查看当前已经下载的镜像
docker images

根据"镜像ID"将镜像保存成一个tar文件:
docker save 镜像ID -o 输出文件名.tar

将本地tar镜像载入:
docker load -i 本地tar镜像文件名.tar

载入后会没有tag名称,需要更改tag
docker tag 镜像ID tag名称

5.查看当前所有容器
docker ps -a

6.启动一个新容器
docker run --name 容器名称 -p 宿主端口:容器端口 -d 镜像 -v 宿主数据目录:容器数据目录

跟随宿主主机启动容器
--restart=always

交互式进入容器:
docker exec -it 容器名称 /bin/bash

7.启动/重启/停止一个容器
docker start/restart/stop 容器ID

8.删除一个容器
docker rm -f 容器ID

9.查看运行容器中的进程信息
docker top 容器名称

10.优化Docker镜像代理

查看docker信息

docker info

11.将容器导出为压缩文件
docker export -o 保存文件.tar 容器id或容器名称

优化docker代理

vim /etc/docker/daemon.json
在daemon.json文件中输入以下代理配置
{"registry-mirrors":["https://obou6wyb.mirror.aliyuncs.com"]}

加载代理配置

加载代理配置

systemctl daemon-reload

重启docker服务

systemctl restart docker

查看docker信息 验证配置

docker info