mysql 检查死锁日志

show engine innodb status
防止死锁的最简单的办法就是永远使用主键更新一条数据。

发表在 mysql | 留下评论

查看所有人某个命令是否被执行过

#!/bin/bash
#mac 用户目录,linux改成 home
 for user in `ls /Users`
 do

#zsh 的命令历史存放文件
     file="/Users/"$user"/.zsh_history"
     if [ -e $file ]; then
         for a in `grep  $1 $file`
         do
             echo $user" "$a
         done
     fi
 done

把上述代码保存到 myhistory中,然后

chmod +x myhistory

要查看谁执行过 ls 命令:

./myhistory ls
发表在 Shell | 留下评论

匿名函数和闭包的区别

匿名函数是“函数”,闭包是一个关注的是变量所处的一个特殊环境的一个代码结构

//这是一个匿名函数,这个匿名函数返回一个闭包
function(){
   return function(){}
}

函数在程序执行的时候,内部的变量会随着使用的结束而释放(因为函数内部的变量只有函数内部能访问,外部是访问不了的,不释放的话也没有意义,还浪费资源)。但是在函数式编程里打破了这个规则,因为“函数式编程”里函数是“一等公民”,他和其他类型的值一样可以被复制给变量,所以函数也能返回一个函数,这个被返回函数使用了所依托函数的内部变量,所以依托函数使用后,也不能把变量释放,这种特殊变量(也称之为“自由变量”)所在的函数被叫做“闭包”。
闭包和匿名函数其实是两个概念,但是使用上很容易弄混。比如:

//把匿名函数当作闭包使用
for(var i = 0; i < 5; i++){
    setTimeout(function(){console.log(i)}, 1000)
}
//上面的想法初期的想法是:1秒钟之后输出0,1,2,3,4,但是结果是输出了5个5
//把上面的函数等价下面的写法,这样你就能看懂了,其实你打印的一直是最外面的i
var func = function(){console.log(i)}
for(var i = 0; i < 5; i++){
    setTimeout(func, 1000)
}

//---------下面的是闭包正确的写法---------
var func = function(i){
    return function(){
        console.log(i)
    }
}
for(var i = 0; i < 5; i++){
    setTimeout(func(i), 1000)
}
//---------当然也放到一起----------------
for(var i = 0; i < 5; i++){
    setTimeout((function(i){
        return function(){
            console.log(i)
        }
    })(i), 1000)
}

//---------再当然匿名函数的话还能这么实现---------
for(var i = 0; i < 5; i++){
    let j = i//这里是let,不是var,如果是var将得到5个4,
    setTimeout(function(){console.log(j)}, 1000)
}
发表在 js, 程序基础 | 标签为 | 留下评论

preventDefault,stopPropagation,stopImmediatePropagation 区别

event.preventDefault
阻止浏览器默认行为,例如:点击a链接,浏览器会跳转到链接,这个“跳转到链接”就是浏览器默认行为。
https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault

event.stopPropagation
阻止事件冒泡
https://developer.mozilla.org/zh-CN/docs/Web/API/Event/stopPropagation

event.stopImmediatePropagation
一个dom的一个事件可以有多个监听,当一个事件被触发,则这些监听事件会按顺序执行,这个按函数阻止其他监听事件执行
https://developer.mozilla.org/zh-CN/docs/Web/API/Event/stopImmediatePropagation

引申阅读:
https://zh.javascript.info/ui
https://zh.javascript.info/bubbling-and-capturing

发表在 js | 留下评论

webpack 设置局域网内他人可以访问

首先,我先问一下,网上说那些把host设置成0.0.0.0, 或者说 使用 disableHostCheck:true, 或者说 使用allowedHosts参数的,你们怎么是让别人访问的?别人的浏览器输入什么才能访问到你的webpack服务器呢?

我的方法,先知道自己机器的IP地址,然后host指向自己的IP地址,这样,局域网内的其他人就可以通过这个ip地址和端口访问的webpack服务器了。

发表在 webpack, 前端 | 留下评论

js罗马数字转换

function convert(num) {
 //数级定义
 var roman = {
   1000 : 'M',
   500 : 'D',
   100 : 'C',
   50 : 'L',
   10 : 'X',
   5 : 'V',
   1 : 'I'
 }, res='', i = '', j = 0, p =0, indexes = [], n=0;
  
  for(i in roman){
    indexes.push(i - 0);
  }
  //倒序
  indexes.sort(function(p, n){
    return n - p;
  });
  
  indexes.forEach(function(i){
    p =  num / i;
    if(p < 1 || num == 0) return;
    //k是基数,比如说1~9基数是1,10~99的基数是10,101~999基数是100
    var k = i/((i+"")[0]);
    
    /**
     *罗马数字规则,进9 和 进4 不一样,
     *进9:本级基数 + 是下级数,
     *进4: 本级数 + 下级数
     */
    //进9
    if( ((num + k) / ( i + 5 * k)) >= 1  && indexes.indexOf(i + 5 * k) > -1){
      res += roman[k] + roman[i + 5 * k];
      num -= i + 4 * k;//本级数 + 4倍的基数
    }else{
      n = Math.floor(p);
    
      if(n == 4 && indexes.indexOf(i + k * 4) > -1){//进4
        res += roman[i] + roman[i + k * 4];
      }else{
        for(j = 0; j<n; j++){
          res += roman[i];
        }
      }
      num -= n * i;
    }
  });
 
 return res;
}

convert(9002);
发表在 js | 留下评论

图标-Font Awesome

Font Awesome 是一个非常方便的图标库。这些图标都是矢量图形,被保存在 .svg 的文件格式中。这些图标就和字体一样,你可以通过像素单位指定它们的大小,它们将会继承其父HTML元素的字体大小。

你可以将 Font Awesome 图标库增添至任何一个应用中,方法很简单,只需要在你的 HTML 头部增加下列代码即可:

发表在 前端 | 留下评论

积分模块

积分模块实现解决方案
https://gitee.com/ivhong/points_module/
交流请mailto:hong350@163.com

发表在 自研 | 留下评论

mysql 分页优化

SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE ......  limit M, N;
SELECT FOUND_ROWS();
发表在 mysql | 留下评论

Yii2 添加请求日志

#SQL
CREATE TABLE `log` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `action` varchar(50) NOT NULL DEFAULT '' COMMENT 'action',
  `url` varchar(500) DEFAULT NULL COMMENT 'url',
  `params` text COMMENT 'POST参数',
  `usetime` float(11,8) DEFAULT NULL COMMENT '耗时秒,action处理错误,此值为0',
  `return` text COMMENT '返回值,action处理错误,此值为空',
  `create_time` int(11) DEFAULT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='访问日志';
public function beforeAction($action) {
        $data = [
            'params' => json_encode($this->params, 1),
            'url' => Yii::$app->request->url,
            'action' => $action->id,
            'create_time' => time(),
        ];
        
        $this->usetime = microtime(1);
        
        Yii::$app->db->createCommand()->insert('log', $data)->execute();
        $id = Yii::$app->db->getLastInsertID();
        $this->logid = $id;
        
        return parent::beforeAction($action);
    }
    
    public function afterAction($action, $result) {
        if($this->logid){
            $data = [
                'usetime' => round(microtime(1) - $this->usetime, 3),
                'return' => json_encode($result, 1)
            ];
            
            Yii::$app->db->createCommand()->update('log', $data, ['id'=>$this->logid])->execute();
        }
        return parent::afterAction($action, $result);
    }

发表在 yii2, 框架 | 留下评论