逗哥上学记

幼儿园Day1⃣️
没有哭闹,没有抗拒,全程都很开心;
记住了一个小朋友的名字;
小便的时候会自己走到老师面前;
说老师让他不要站在板凳上,他说只是想看看窗外的风景;
说在幼儿园搭了城堡,老师教跳舞了,并且表演给我看;
你比麻麻想象的更懂事,加油,小伙子! ​​​​

补一个幼儿园Day2⃣️
到了班级头也不回就走了,连个再见都没有;
问我同学为什么要哭着找奶奶[笑cry]
晚上遛弯看到同班的小朋友会告诉我,那个是同学;
小伙子,继续加油💪 ​​​​

幼儿园Day3⃣️
1.老师点名:徐睿泽?
逗哥:(沉默了三秒)老师我姓刘!
2.记住了一声平二声扬三声拐弯四声降。 继续阅读逗哥上学记

[MYSQL5.7版本sql_mode=only_full_group_by问题]

下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了。

一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了

only_full_group_by 模式开启比较好。

因为在 mysql 中有一个函数: any_value(field) 允许,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

具体出错提示:

[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

1、查看sql_mode

`select @@global.sql_mode;`

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

`set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';`

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

`set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';`

 

解决办法大致有两种:

继续阅读[MYSQL5.7版本sql_mode=only_full_group_by问题]

删除ES索引中的数据

选择复合查询[+],然后在查询框操作如下内容:
一、 文本框

info-statistics-index/_delete_by_query

info-statistics-index为索引名

二、 协议
POST

三、 内容

{
    "query": {
        "match": {
            "type": "info-user-intent:delete"
        }
    }
}

type为字段属性
info-user-intent:delete为字段值

最后点击提交请求

页面右侧返回操作结果和删除条数,内容如下

{
    "took": 225,
    "timed_out": false,
    "total": 33,
    "deleted": 33,
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1,
    "throttled_until_millis": 0,
    "failures": []
}

至此,删除完毕。

Java8新特性学习笔记

lambda表达式学习,抛开语法从匿名内部类学习语法特性:

共6种场景
1接收一个参数,没有返回值;
2接收两个参数,返回一个参数;
3无参数,无返回;
4构造方法引用;
5静态方法应用;
6实例(对象)方法引用。

 

一、接收一个参数,没有返回值

定义一个接口(有且只有一个抽象方法)

public interface MyInterface {
    void print(String str);
}

测试类

public class Test {
    public static void main(String[] args) {
        MyInterface m1 = new MyInterface() {
            @Override
            public void print(String str) {
                System.out.println(str);
            }
        };

        //常规写法
        MyInterface m2 = (String str) -> {
            System.out.println(str);
        };

        //简写
        MyInterface m3 = str -> System.out.println(str);

        m3.print("hello lambda..");
    }
}

 

二、接收两个参数,返回一个参数

定义一个接口

public interface MyInterface {
    int sum(int num1, int num2);
}

测试类

public class Test {
    public static void main(String[] args) {
        /**
         * 匿名内部类方式
         */
        MyInterface m1 = new MyInterface() {
            @Override
            public int sum(int num1, int num2) {
                return num1 + num2;
            }
        };

        /**
         * lambda常规写法
         */
        MyInterface m2 = (int num1, int num2) -> {
            return num1 + num2;
        };

        /**
         * lambda简写
         * 1 不写入参格式,可以自动推断
         * 2 如果方法中语句只有一条可以省略{};如果是return返回数据,可以省略return
         */
        MyInterface m3 = (num1, num2) -> num1 + num2;
        System.out.println(m3.sum(123, 456));
    }
}

三、无参数,无返回

定义一个接口 继续阅读Java8新特性学习笔记

1349 – View’s SELECT contains a subquery in the FROM clause

场景:要导出视图并在另外一台服务器上创建,结果创建失败了。错误如标题所示,经过搜索找到原因,现总结下。

MySQL文档中对版本做了说明,5.7.7以前的版本不支持子查询的视图语句,要实现可以通过把子查询语句拆成单个视图,最后拼接在一起;获取使用高版本的MySQL(安装版本>5.7.7)即可。

补充:使用Navicat导出视图语句的方法 继续阅读1349 – View’s SELECT contains a subquery in the FROM clause

安全代码的检查清单

 

安全代码的检查清单

安全管理

有没有安全更新的策略和落实计划?

有没有安全漏洞的保密共识和规范?

有没有安全缺陷的评估和管理办法?

软件是不是使用最新的安全修复版?

有没有定义、归类和保护敏感信息?

有没有部署多层次的安全防御体系?

安全防御能不能运转良好、及时反应?

不同的安全防御机制能不能独立运转?

系统管理、运营人员的授权是否恰当?

有没有风险管理的预案和长短期措施?

代码评审

数值运算会不会溢出?

有没有检查数值的合理范围 继续阅读安全代码的检查清单

监听Apollo配置变动

监听Apollo配置变动


import lombok.extern.slf4j.Slf4j;
import com.ctrip.framework.apollo.ConfigFile;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
import org.springframework.stereotype.Component;
/**
* 监听Apollo配置属性变化事件
* 注意:Apollo配置的namespace为application,属性为json.config.{xx},属性值是JSON字符串
*/
@Slf4j
@Component
public class ApolloRefreshListener {

   /**
    * json.config.value=[{"someString":"hello","someInt":100}]
    */
   @ApolloJsonValue("${json.config.value}")
   private List<JsonBean> jsonBeanList;

   /**
    * 监听namespace,默认application,多个("namespace1","namespace2")
    */
   @ApolloConfigChangeListener("application")
   private void someOnChange(ConfigChangeEvent changeEvent) {
       boolean hasChange = false;
       //update injected value of batch if it is changed in Apollo
       for (String changedKey : changeEvent.changedKeys()) {
           log.info("changedKey:{}", changedKey);
           //json.config的key发生了改变(json.config.xx的配置发生了改变)
           if (changedKey.startsWith("json.config.")) {
               hasChange = true;
               break;
          }
      }
       if (hasChange) {
           ConfigFile content = ConfigService.getConfigFile(changeEvent.getNamespace(), ConfigFileFormat.Properties);
           List<JsonBean> result = jsonBeanList;
           log.info("result:{}", result);
      }
  }
   
   
}

直接获取json配置的namespace(添加namespace时,选择private,名称后缀选择json格式),代码如下 继续阅读监听Apollo配置变动

读MySQL数据库数据字段时间多了8小时

背景:使用Java程序的java.util.Date类型读取出MySQL中的Timestamp的值时发现大了8小时。

百度了下设置MySQL的时区,如下:

set global time_zone = '+8:00';##修改mysql全局时区为北京时间,即我们所在的东8区
set time_zone = '+8:00';##修改当前会话时区
flush privileges; #立即生效
show variables like "%time_zone%";

但是未能解决。又继续查看代码中的数据库连接。发现一处地方可能是问题的原因。

多了8小时的连接设置:?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

注意到可能是这个serverTimezone的问题,将其修改为serverTimezone=Asia/Shanghai ,再试一下,擦搞定了。赶紧记下来,于是有了这篇笔记。

多线程处理任务后,继续主线程任务

业务场景:获取三个表数据,发送至三个接口,响应后删除表数据

1 读取三张表数据


/**
 * 获取所有表数据
 */
private void getAllTableData(String curentTime, JSONArray requestArray) {
       List<DeviceStatus> deviceStatusList = getDeviceStatusLists(curentTime);
        int deviceStatusListSize = 0;
        if (!CollectionUtils.isEmpty(deviceStatusList)) {
            JSONObject json = new JSONObject();
            json.put("url", deviceStatusUrl);
            JSONObject param = new JSONObject();
            param.put("list", deviceStatusList);
            json.put("data", param);
            requestArray.add(json);
            deviceStatusListSize = deviceStatusList.size();
        }
        logger.info("deviceBriefStatusList-size:{}", deviceBriefStatusListSize);
        //***另外两张表
 }

2 将数据发送到线程里

public void executeScheduleTask() {
	String curentTime = DateUtils.getNowText();
	logger.info("操作时间:{}", curentTime);
   /*
    数据和请求地址放入到requestArray中
   */
    JSONArray requestArray = new JSONArray();
    getAllTableData(curentTime, requestArray);

    if (!CollectionUtils.isEmpty(requestArray)) {
        //申明线程池
        ExecutorService exc = Executors.newFixedThreadPool(requestArray.size());
        //申明数据毁掉处理类List<Future<JSONObject>>
        List<Future<JSONObject>> futures = new ArrayList<>();
        for (int i = 0; i < requestArray.size(); i++) {
            JSONObject json = requestArray.getJSONObject(i);
            //申请单个线程执行类
            DataHandleRequest call = new DataHandleRequest(json);
            //提交单个线程
            Future<JSONObject> future = exc.submit(call);
            //将每个线程放入线程集合,这里如果任何一个线程的执行结果没有毁掉,线程后都会自动堵塞
            futures.add(future);
        }
        //所有线程执行完毕之后会执行下面的循环,然后通过循环每个线程后执行线程的get()方法,每个线程的执行结果

        List<String> succList = new ArrayList<>();
        try {
            for (Future<JSONObject> future : futures) {
                JSONObject json = future.get();
                String returnData = json.getString("returnData");
                JSONObject valueJson = JSONObject.parseObject(returnData);
                if (valueJson.containsKey("code") && "000000".equals(valueJson.getString("code"))) {
                    succList.add(valueJson.getString("data"));
                }
                logger.info("同步调用结果:{}", returnData);
            }
            exc.shutdown();
        } catch (Exception e) {
            logger.error("同步数据失败:{}", e);
        }
        //删除已同步数据表
        deleteTable(curentTime, succList);
    }

  
    logger.info("同步数据表结束,耗时:cost={}ms", cost);
}

3数据发送,创建一个执行线程任务类DataHandleRequest 继续阅读多线程处理任务后,继续主线程任务