【制作自签名证书】

一、预备工作

1、检查是否安装了openssl (一般自带有)

 rpm -qa | grep openssl

2、
预备工作:避免生成证书时 报错“ /etc/pki/CA/index.txt: No such file or directory ”

vim /etc/pki/tls/openssl.cnf 

查到dir的目录,一般是/etc/pki/CA

cd /etc/pki/CA 

 ls

执行

 touch index.txt 
 touch serial 
 echo "01" > serial
mkdir /etc/pki/CA/newcerts

3、开始生成证书

 mkdir caroll-ca 

 cd  caroll-ca

二、制作CA证书

openssl genrsa -des3 -out ca.key 2048 

1、生成CA的私钥

输入密码,这里我输入1234

可以看到当前目录底下生成了ca.key

2、生成CA公钥

 openssl req -new -x509 -days 7305 -key ca.key -out ca.crt 

重复输入密码。这里我输入1234,然后填写一些信息,后面三项可以不填

当前目录底下生成公钥

三、制作网站的证书

1、生成证书私钥

 openssl genrsa -des3 -out *.bigmen.cn.pem 1024 

输入两次密码,这里我输入1234,然后可查到当前目录生成了对应的pem文件

2、 将私钥解密生成key

 openssl rsa -in *.bigmen.cn.pem -out *.bigmen.cn.key

这一步很重要,否则拿到的是加密的私钥,无法直接使用 。这里之前的文章也有提过哟,不解密的话会在证书上传腾讯云控制台的时候报错,详情可以参考:https://cloud.tencent.com/developer/article/1452843

3、生成证书请求

 openssl req -new -key *.bigmen.cn.pem -out *.bigmen.cn.csr

当前目录底下生成csr文件

四、证书签名

【证书签名】

 openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in *.bigmen.cn.csr -out *.bigmen.cn.crt 

证书期限1460天就是4年

连续输入两个y

证书已经生成

//css
<style>
    .expandingArea{
        position:relative;
    }
    .expandingArea span{
        display: block;
        padding: 8px 12px;
        line-height: 1.42857143;
        font-size: 14px;
    }
    .expandingArea textarea{
        position:absolute;
        top:0;
        left:0;
        height:100%;
    }
</style>
//html
<div class="expandingArea"><pre style="display:block;visibility:hidden;"><span></span></pre><textarea rows="1" style="position:absolute;top:0;left:0;height:100%;" class="form-control money-input remark" <?=$action != 'edit'?'disabled': '' ?> ><%=d[i].remark%></textarea></div>

//js
$(function () {
    $("#qudao_data").on('keyup change blur', '.money-input.remark', function () {
            //编辑框自适应高度
            var text = $(this).val()
            $(this).parents(".expandingArea").find('pre span').text(text)
        })
})

jQuery autoResize 插件实现:

/*
 * jQuery autoResize (textarea auto-resizer)
 * @copyright James Padolsey http://james.padolsey.com
 * @version 1.04
 */
(function ($) {

    $.fn.autoResize = function (options) {

        // Just some abstracted details,
        // to make plugin users happy:
        var settings = $.extend({
            onResize: function () {
            },
            animate: true,
            animateDuration: 150,
            animateCallback: function () {
            },
            extraSpace: 20,
            limit: 1000
        }, options);

        // Only textarea's auto-resize:
        this.filter('textarea').each(function () {

            // Get rid of scrollbars and disable WebKit resizing:
            var textarea = $(this).css({resize: 'none', 'overflow-y': 'hidden'}),
                // Cache original height, for use later:
                origHeight = textarea.height(),
                // Need clone of textarea, hidden off screen:
                clone = (function () {

                    // Properties which may effect space taken up by chracters:
                    var props = ['height', 'width', 'lineHeight', 'textDecoration', 'letterSpacing'],
                        propOb = {};

                    // Create object of styles to apply:
                    $.each(props, function (i, prop) {
                        propOb[prop] = textarea.css(prop);
                    });

                    // Clone the actual textarea removing unique properties
                    // and insert before original textarea:
                    return textarea.clone().removeAttr('id').removeAttr('name').css({
                        position: 'absolute',
                        top: 0,
                        left: -9999
                    }).css(propOb).attr('tabIndex', '-1').insertBefore(textarea);

                })(),
                lastScrollTop = null,
                updateSize = function () {

                    // Prepare the clone:
                    clone.height(0).val($(this).val()).scrollTop(10000);

                    // Find the height of text:
                    var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
                        toChange = $(this).add(clone);

                    // Don't do anything if scrollTip hasen't changed:
                    if (lastScrollTop === scrollTop) {
                        return;
                    }
                    lastScrollTop = scrollTop;

                    // Check for limit:
                    if (scrollTop >= settings.limit) {
                        $(this).css('overflow-y', '');
                        return;
                    }
                    // Fire off callback:
                    settings.onResize.call(this);

                    // Either animate or directly apply height:
                    settings.animate && textarea.css('display') === 'block' ?
                        toChange.stop().animate({height: scrollTop}, settings.animateDuration, settings.animateCallback)
                        : toChange.height(scrollTop);
                };

            // Bind namespaced handlers to appropriate events:
            textarea
                .unbind('.dynSiz')
                .bind('keyup.dynSiz', updateSize)
                .bind('keydown.dynSiz', updateSize)
                .bind('change.dynSiz', updateSize);

        });

        // Chain:
        return this;

    };


})(jQuery);

我们经常看到Mysql的explain语句执行结果Extra字段有using temporary、using filesort,理解这两个短语的含义,有助于进行SQL语句的优化。
什么是临时表(temporary table)
顾名思义,临时表也是一张表,只不过不是持久的,当会话结束,临时表就会被删除掉。

什么是文件排序(filesort)
文件排序是相对于索引排序而言的,当不能使用索引生成排序结果的时候,mysql需要进行文件排序,排序可能是在内存中进行的,也可能需要磁盘文件的辅助。当待排序的数据量小于排序缓冲区(sort buffer)的大小时,排序直接在内存中进行,否则就需要磁盘文件的辅助进行排序,无论是哪种情况,mysql并没有进行区分,统一使用filesort来表示。

mysql的关联查询是如何执行的
mysql对所有的关联查询都是通过循环嵌套来执行的。简单的讲,表1位于外层循环,表2位于内层循环,每次首先从外层循环中取出一条数据,然后在内存循环中进行匹配,匹配到的作为结果进行返回。下面的语句及其伪代码表示了实际的执行过程。

关联查询order by执行的两种情况
关联查询中如果有order by排序语句,排序的过程会分为两种情况。
第一种,order by语句中排序的列全部都出现在表1中,那么mysql在关联处理第一个表时就会进行文件排序,也就是在执行关联查询的外层循环时就进行排序,此时,mysql的explain结果中可以看到extra字段会看到using filesort.
第二种,除了第一种情况之外,mysql都会先将关联查询的结果存放到一张临时表中,然后在所有的关联都结束后,再进行文件排序,此时mysql的explain语句的extra字段就会看到using temporary;using filesort.

===============window10中的配置和设置==============
启用smb共享服务
Windows默认关闭了samba服务,需要将其开启。
1.打开控制面板,选择“程序”进入
2.选择“启用或关闭Windows功能”进入
3.勾选“SMB 1.0/CIFS 文件共享支持”点击确定
4.电脑自动配置
5.等到配置完成,重启电脑

创建访问账号
打开控制面板,账户,添加一个本地用户账号(非microsoft账户)用于远程系统登录到本机来访问文件夹

网络设置
1.打开控制面板,选择“网络和Internet”进入
2.进入“查看网络状态和任务”
3.进入“更改高级共享设置”
4.根据需求修改其中的共享选项:
一般默认就行了

共享文件夹设置
右键需要共享的文件夹,属性-共享-高级共享设置-权限-用户和组->添加,在对象和名称输入框输入刚刚创建的用户名,点击【检查名称】 ,然后确定。
在共享权限列表中选择这个用户,然后设置访问权限,再确定,再确定高级共享。
微信图片_20210914104731.png
再在属性面板点击【共享】,选择框下拉,选择创建的账户,再设置权限级别,最后点击【共享】
微信图片_20210914104727.png

===============linux中的配置和设置==============
安装cifs文件系统(微软出的一个文件系统)

apt-get install cifs-utils
#或者
yum install cifs-utils

使用mount挂载远程目录

mkdir /mnt/window
mount -t cifs -o username=myuser,password=xxx,vers=1.0 //192.168.0.126/slim_share /mnt/window

#可读写挂载
mount -t cifs -o username=myuser,password=xxx,rw,file_mode=0777,dir_mode=0777 //192.168.1.95/web /www/web/

常见问题
查看日志tail /var/log/kern.log
1.最基本的错误——共享没放开权限
2.账户密码错误:属于比较常见的。最好查看一下win的用户,哪些是开启的哪些是禁用的,还需要特别注意“名称”和“全名”是不一样的,“全名”只是个昵称而已
3.没有写权限:共享文件夹放在C盘,对C盘的写是需要认证管理员权限的,所以尽量不要放到C盘
4.Remote IO Error:这个错误比较难排查,属于win系统错误,google上有一些解决方案,修改一下注册表参数就正常了

添加开机自动挂载
mount命令是手动挂载的,系统重启就没有挂载了,要想开机自动挂载,可以把挂载命令写到开机启动文件自动执行挂载,怎么添加到启动脚本,每种linux系统有可能不一样,自行查找方法吧,这里不多写了

错误信息如下 :

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

查看innodb状态:

show engine innodb status

结果:

------------------------

LATEST DETECTED DEADLOCK

------------------------

2017-01-04 09:25:17 7f553477d700

*** (1) TRANSACTION:

TRANSACTION 124378994, ACTIVE 0.007 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 4 lock struct(s), heap size 1184, 8 row lock(s), undo log entries 7

LOCK BLOCKING MySQL thread id: 11573556 block 11572504

MySQL thread id 11572504, OS thread handle 0x7f56342fb700, query id 3368968901 10.44.182.0 shzfstore updating

UPDATE `sku` SET `quantity`=quantity-'1',`lock_stock`=lock_stock+'1',`sys_version`=sys_version+1 WHERE `id` = '15608' AND `quantity` >= '1' limit 1

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 393 page no 45 n bits 248 index `PRIMARY` of table `store_product`.`sku` trx id 124378994 lock_mode X locks rec but not gap waiting

Record lock, heap no 19 PHYSICAL RECORD: n_fields 19; compact format; info bits 0

......

*** (2) TRANSACTION:

TRANSACTION 124378995, ACTIVE 0.004 sec starting index read

mysql tables in use 1, locked 1

3 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1

MySQL thread id 11573556, OS thread handle 0x7f553477d700, query id 3368968902 10.172.221.117 shzfstore updating

UPDATE `sku` SET `quantity`=quantity-'1',`lock_stock`=lock_stock+'1',`sys_version`=sys_version+1 WHERE `id` = '15504' AND `quantity` >= '1' limit 1

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 393 page no 45 n bits 248 index `PRIMARY` of table `store_product`.`sku` trx id 124378995 lock_mode X locks rec but not gap

Record lock, heap no 19 PHYSICAL RECORD: n_fields 19; compact format; info bits 0

......

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 393 page no 43 n bits 240 index `PRIMARY` of table `store_product`.`sku` trx id 124378995 lock_mode X locks rec but not gap waiting

Record lock, heap no 81 PHYSICAL RECORD: n_fields 19; compact format; info bits 0

......

*** WE ROLL BACK TRANSACTION (2)

LATEST DETECTED DEADLOCK记录了最近一次的死锁情况。上面还可以看出两个事务之间发生锁竞争时,给我们留下的部分数据
事务1

UPDATEskuSETquantity=quantity-'1',lock_stock=lock_stock+'1',sys_version=sys_version+1 WHEREid= '15608' ANDquantity>= '1' limit 1

事务2

UPDATEskuSETquantity=quantity-'1',lock_stock=lock_stock+'1',sys_version=sys_version+1 WHEREid= '15504' ANDquantity>= '1' limit 1

死锁的两个资源均被lock_mode X locks了

最后,mysql给了很重要的一个数据“WE ROLL BACK TRANSACTION (2)” MYSQL回滚了事务2。既然mysql回滚了事务2,那么肯定是事务2的语句触发了死锁,被mysql回滚了,也就是应该为报错日志所记录的那部分。同时,MYSQL执行了事务1,那么事务1的SQL语句肯定被记录在BINLOG中了。

2.查看binlog日志,找出事务1所执行的语句
查找依据:

SQL语句,根据LATEST DETECTED DEADLOCK提供的死锁时记录的sql语句。
线程ID(mysql的唯一标识): MySQL thread id 11572504
执行时间(时间线):2017-01-04 09:25:17 7f553477d700
根据以上三个标识,以及BINLOG的起始标志“BEGIN、COMMIT”,几乎可以100%确定事务1所包含的SQL语句。

binlog信息大致如下

#170104  9:25:17 server id 3194178605  end_log_pos 137170469 CRC32 0x1b6559de   Query   thread_id=11572504  exec_time=0 error_code=0
SET TIMESTAMP=1483493117/*!*/;
BEGIN
......
### UPDATE `store_product`.`sku`
### WHERE
###   @1=15504
###   @2=11516
###   @3=0.01
###   @4=120065
###   @5=109433
###   @6=19
### SET
###   @1=15504
###   @2=11516
###   @3=0.01
###   @4=120065
###   @5=109432
###   @6=20
# at 137172557
......
### UPDATE `store_product`.`sku`
### WHERE
###   @1=15608
###   @2=11551
###   @3=0.01
###   @4=120077
###   @5=109426
###   @6=19
### SET
###   @1=15608
###   @2=11551
###   @3=0.01
###   @4=120077
###   @5=109425
###   @6=20
......
COMMIT/*!*/;

3.还原事务2所包含的执行语句
事务1的语句找齐了,接下来找事务2的语句,还记得我们开头提供的报错日志吗,那个日志里也详细记录了发起请求时的参数情况(截图未展示),根据参数和我们处理业务的代码,可以复现事务2所要执行的语句

BEGIN
......
### UPDATE `store_product`.`sku`
### WHERE
###   @1=15608
###   @2=11516
###   @3=0.01
###   @4=120065
###   @5=109433
###   @6=19
### SET
###   @1=15608
###   @2=11516
###   @3=0.01
###   @4=120065
###   @5=109432
###   @6=20
......
### UPDATE `store_product`.`sku`
### WHERE
###   @1=15504
###   @2=11551
###   @3=0.01
###   @4=120077
###   @5=109426
###   @6=19
### SET
###   @1=15504
###   @2=11551
###   @3=0.01
###   @4=120077
###   @5=109425
###   @6=20
......
COMMIT/*!*/;

根据两个事务所执行的sql语句,目前可以还原死锁产生的原因了

4.查看两个事务执行语句的顺序:

顺序    事务1    事务2    说明
1    begin        
2        begin    
3    update        事务1 给 sku表 id 15504记录上 X 锁
4        update    事务2 给 sku表 id 15608记录上 X 锁
5    update        这里是关键,事务1想给sku表 id 15608上X锁,发现被别人(事务2)上锁了,等待锁释放
6        update    事物2打算给sku表id为15504记录上 X 排它锁,发现被其他事务上了,而且此事务居然还在等他提交,这时MYSQL立刻回滚事务2…(php发现MYSQL返回死锁信息,记录该信息到错误日志…发送回滚指令…mysql已经“帮”他回滚了…)
7    执行成功        事务1发现别人的锁释放了,获得X锁,执行成功
8    commit        事务1执行成功,记录binlog日志

解决方案
减小事务中的语句数量
在业务中调整语句的执行顺序,例如可以按照where条件中字段的大小进行一下排序,按照排序后顺序执行,让死锁变为锁等待。
相关补充
innodb的行锁,锁的是查询条件中的索引字段,以及索引字段对应的primary key字段

本文转自:https://www.jianshu.com/p/6049b046e7b4,仅作学习参考