Published on

ARTS 第4周

Authors

Algorithm

Median of Two Sorted Arrays

package org.nocoder.leetcode.solution;

import java.util.Arrays;

/**
 * 4. Median of Two Sorted Arrays
 * <p>
 * There are two sorted arrays nums1 and nums2 of size m and n respectively.
 * <p>
 * Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
 * <p>
 * You may assume nums1 and nums2 cannot be both empty.
 * <p>
 * Example 1:
 * <p>
 * nums1 = [1, 3]
 * nums2 = [2]
 * <p>
 * The median is 2.0
 * <p>
 * Example 2:
 * <p>
 * nums1 = [1, 2]
 * nums2 = [3, 4]
 * <p>
 * The median is (2 + 3)/2 = 2.5
 *
 * @author jason
 * @date 18/7/27.
 */
public class MedianofTwoSortedArrays {
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;

        // 创建一个新数组 a, 存放nums1和nums2的元素
        int[] a = new int[m + n];

        for (int i = 0; i < m; i++) {
            a[i] = nums1[i];
        }

        for (int j = 0; j < n; j++) {
            a[m + j] = nums2[j];
        }

        // 数组a排序
        Arrays.sort(a);

        double result;
        int len = a.length;
        if (len == 1) {
            return a[0];
        }else if (len == 2){
            return (a[0] + a[1]) / 2.0;
        }

        if (len % 2 == 0) {
            // 数组a的长度为偶数时,取中间的两个值,数组下标取 length/2 - 1, length/2
            result = (a[(len / 2 -1)] + (a[len / 2])) / 2.0;
        } else {
            // 数组a的长度为基数时,取最中间的一个值返回,数组下标取 length%2
            result = a[Math.round(len / 2)];
        }
        return result;
    }

    public static void main(String[] args) {
        int[] nums1 = new int[]{};
        int[] nums2 = new int[]{1,2,3,4,5};
        double result = findMedianSortedArrays(nums1, nums2);
        System.out.println(result);
    }
}

Review

Docker for beginners

https://docker-curriculum.com/

公司最近刚好在搞CI和CD,初步选择了Docker + Jenkins pipline 来配置自动化流程。这篇文章是耗子叔在极客时间专栏《程序员练级攻略(2018):容器化和自动化运维》文中推荐的入门Docker的文章,对docker的基本概念和和入门操作讲的很到位,很适合跟着搭一遍环境初步感受一下docker。文章中对docker run、docker pull、 docker images、docker ps、docker rm命令都给出了示例,并根据Dockerfile来创建Docker镜像,演示了在AWS上怎么运行Docker应用、多容器的环境、Docker Network,Docker Compse等,使用Elastic Container 等。我在实际操作中也参考了《Docker Practice》、《第一本Docker书》,私有镜像仓库使用nexus3来搭建。跟着操作下来,对docker有了初步的认识。

Best practices for writing Dockerfiles

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 啃英文文章的速度还是非常慢,英文词汇量很小,边查词边理解内容,啃下来感觉还是很吃力,继续努力吧!

  • Create ephemeral containers
  • Understand build context
  • Pipe Dockerfile through stdin
  • Exclude with .dockerignore
  • Use multi-stage builds
  • Don’t install unnecessary packages
  • Decouple applications
  • Minimize the number of layers
  • Sort multi-line arguments
  • Leverage build cache

Tip

Canal 找不到binlog问题分析

项目中使用了阿里的canal,主要用来实时往统计相关表里更新数据,使用的1.0.22版本,经常会抛出binlog找不到的异常,难过的是之前异常的log被误删,排查起来很吃力,最终决定先升级到1.0.24版本,观察一段时间看看情况。排查过程中也学习到了一些mysql bin log相关的知识。

  • https://github.com/alibaba/canal
  • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  • mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  • canal解析binary log对象(原始为byte流)
  • meta.dat中记录的是客户端最后一次ack的binlog信息
  • 如果删除了meta.dat记录中对应的的binlog文件,并且此时重新启动canal server,会HY000抛异常,提示找不到对应的binlog,解决办法是删除meta.dat
  • 使用purge master logs before语句无法删除当前正在使用的binlog
  • reset master 可以清空所有的binlog文件,并新生成一个从1开始计数的binlog文件
  • Connection reset by peer
-- 查看bin log
show binary logs;

-- 新生成一个binlog文件
flush logs;

-- 查看binlong清理时间
show variables like 'expire_logs_days'

-- 删除指定日期之前的binlog
purge master logs before'2018-07-25 13:29:59';

Share

本周的 Share 聊一些跟技术本身不相关的吧,主题是日常学习时间的安排。

对于我这个夜猫子型的人来说,早晨起床看书学习是一件很痛苦的事情,效率极低,所以很多时候是老婆孩子睡觉了以后,我再看书学习、写写程序,一般是1、2点睡觉,有时debug到3、4点。我很享受这种感觉,夜晚无干扰的coding,思路很清晰,效率很高,我初中背单词就是晚上背,然后第二天很自信的拿到高分的单词听写成绩,哈哈。

我家小孩刚刚10个月,双方父母都在工作也比较远,所以我媳妇儿全职带孩子,真的很累啊,更心疼我媳妇儿,没办法,终究要经历这一过程。下班回家陪我儿子玩,小孩睡的也晚,非得闹腾到11-12点才肯睡觉。之后的时间就可以任我嗨了,可是有的时候也困得要命,喝咖啡也不管用,扛不住就只能去睡了。

这几次的ARTS,我自己是很不满意的,因为连着两次都是短时间突击出来的,更像是在完成任务。我更希望能通过解决日常工作的问题和工作积累中就把Review、Tip、Share给完成,花2个小时写两道leetcode算法题、2个小时整理文档。为了能达到轻松完成ARTS,我修改了日常worklog的模板,把遇到的问题及解决办法也一并记录下来,包括查了哪些资料,链接也贴上去,供每周ARTS的内容参考。希望通过这份热忱和不断的坚持,不断的提高自己。