Mac安装k8s for docker desktop

安装docker desktop for mac

  1. 下载 Docker CE最新版本
    地址: https://store.docker.com/search?type=edition&offering=community
    版本信息:

  2. 配置镜像加速

    mac配置:

开启kubernetes

  1. 下载离线镜像

    1
    2
    3
    git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop
    cd k8s-for-docker-desktop
    ./load_images.sh
  2. 安装并启动kubernetes

    • 配置 CPU 和 内存资源
    • 开启 Kubernetes

安装k8s dashboard应用

  1. 部署dashboard

    1
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

    或者

    1
    kubectl create -f kubernetes-dashboard.yaml
  2. 开启API Server访问代理

    1
    kubectl proxy
  3. 访问Kubernetes dashboard
    URL:
    http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default

  4. 配置控制台访问令牌

    登录dashboard时

    • 选择令牌,输入下文控制台输出的内容
    1
    2
    3
    TOKEN=$(kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}')
    kubectl config set-credentials docker-for-desktop --token="${TOKEN}"
    echo $TOKEN
    • 选择 Kubeconfig 文件
      路径如下:$HOME/.kube/config

安装过程中的问题

kubernets is starting
k8s 一直是开始状态而不是running状态,查看官方的issue列表中找到如下解决方案
1. 使用如下命令查看日志

1
2
$ pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
$ /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"

2. 卸载docker panel
3. 删除 .kube file
1
rm -rf ~/.kube

4. 编辑/etc/hosts. (第一行包含docker-for-desktop)
编辑后如下:
1
2
3
127.0.0.1truelocalhost docker-for-desktop
255.255.255.255 broadcasthost
::1 localhost

5. 重新安装kubernets

问题参考链接
https://github.com/docker/for-mac/issues
https://github.com/docker/for-mac/issues/3327

CentOS 7和8下搭建shadowsocks-libev

CentOS 7和8下搭建shadowsocks-libev

安装shadowsocks-libev

1
2
cd /etc/yum.repos.d/
curl -O https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.repo

源路径在CentOS7和8下不同,如下:

1
2
3
4
# CentOS7
URL=https://copr.fedorainfracloud.org/coprs/outman/shadowsocks-libev/repo/epel-7/outman-shadowsocks-libev-epel-7.repo
# CentOS8
URL=https://copr.fedorainfracloud.org/coprs/outman/shadowsocks-libev/repo/epel-8/outman-shadowsocks-libev-epel-8.repo

安装

1
2
3
4
yum update
yum install -y epel-release
yum install -y libsodium shadowsocks-libev simple-obfs
yum install -y shadowsocks-libev

配置ss

打开/etc/shadowsocks-libev/config.json,如果不存在该文件则需要新建。

配置对应的参数:

  • server:当前自己的服务器的地址
    比如:0.0.0.0

  • server_port:ss服务的端口
    一般要大于1024,小于65536,可以随意取值,只要不和其他端口冲突即可
    比如:21500

  • password:ss客户端使用ss时要使用的密码
    最好设置一个复杂但安全的密码,例如:Ci20s5a6y96F

  • method:加密方式
    以前常见的方式是:aes-256-cfb
    最新更加复杂但更安全的是:chacha20-ietf-poly1305
    注意: 需要ss客户端要支持该加密方式才能正常使用ss服务

  • timeout:超时时间,单位:秒
    比如:300

  • mode:ss服务的模式
    比如:tcp_and_udp,即支持tcp也支持udp

示例:

1
2
3
4
5
6
7
8
{
"server": "0.0.0.0",
"server_port": 21500,
"password": "Ci20s5a6y96F",
"method": "chacha20-ietf-poly1305",
"timeout": 300,
"mode": "tcp_and_udp"
}

防火墙上打开端口

1
2
firewall-cmd --permanent --add-port=xxxx/tcp
firewall-cmd --reload

启动shadowsocks-libev

启动:

1
systemctl restart shadowsocks-libev

开机启动:

1
systemctl enable shadowsocks-libev

生成复杂但安全的密码

http://ucdok.com/project/generate_password.html

Debug

查看服务状态

1
systemctl status shadowsocks-libev

查看日志

1
journalctl -u shadowsocks-libev

查看端口是否启动

1
netstat -tnlp | grep xxxx

实现shadowsocks-libev多用户

新建另外一个配置文件,比如:

1
/etc/shadowsocks-libev/config2.json

内容和之前一致,只是端口号server_port和密码password改了一下即可:

1
2
3
4
5
6
7
8
{
"server": "0.0.0.0",
"server_port": 21501,
"password": "passowrd2",
"method": "aes-256-cfb",
"timeout": 300,
"mode": "tcp_and_udp"
}

注意: 端口号不要和系统中其他服务的端口号冲突了。

另外再去用:

1
setsid ss-server -c /etc/shadowsocks-libev/config2.json -u

启用新端口对应的ss服务。

MySQL面试题

MySQL面试题

基础知识

  • 常用的MySQL引擎有哪些? MyISAM和InnoDB区别
  • MySQL事务,解释ACID
  • SQL标准定义的四个隔离级别
  • CHAR和VARCHAR的区别?
  • FLOAT和DOUBLE的区别是什么?
  • 列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?
  • BLOB和TEXT有什么区别?
  • Heap表是什么?
  • DROP、DELETE、TRUNCATE的区别
  • MySQL里记录货币用什么字段类型好
  • 通用SQL函数有哪些?
  • NOW()和CURRENT_DATE()有什么区别?
  • MySQL查询是否区分大小写?
  • 主键 超键 候选键 外键
  • 视图的作用,视图的优缺点,视图可以更改么?
  • MySQL有关权限的表都有哪几个?
  • MySQL数据表在什么情况下容易损坏?
  • 对Explain参数及重要参数的理解?
  • MySQL binlog的几种日志录入格式以及区别

索引、锁

  • MySQL索引的目的和原理
  • MySQL索引的数据结构和算法原理
  • 索引对性能的影响
  • 索引的使用场景
  • 索引的创建原则
  • 什么是索引合并?
  • 什么是覆盖索引?
  • MySQL索引的注意事项
  • 列举创建索引但是无法命中索引的情况
  • 为什么使用B+Tree
  • B-Tree和B+Tree的区别
  • 最左前缀原理
  • 什么是聚集索引和非聚集索引
  • 可以使用多少列创建索引?
  • MySQL中有哪几种锁?
  • 什么是乐观锁和悲观锁
  • 乐观锁和悲观锁的区别及使用场景
  • 乐观锁常见的两种实现方式
  • 乐观锁的缺点
  • 什么是MVCC
  • MySQL的innodb引擎是如何实现MVCC的
  • MySQL中InnoDB引擎的行锁是怎么实现的?为什么是这样子的?

调优诊断

  • 对SQL语句优化有哪些方法?
  • MySQL如何优化DISTINCT?
  • 锁的优化策略
  • MySQL数据库CPU飙升到500%的话他怎么处理?
  • MySQL数据库服务器性能分析的方法命令有哪些?
  • 数据库结构优化的建议有哪些
  • Schema设计对系统性能有什么影响?

解答题

  • 一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把MySQL重启,再insert一条记录,这条记录的ID是18还是15 ?
  • 如何在MySQL种获取当前日期?
  • 如何查询第n高的工资?
  • 有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中同一记录中的c1,c2字段中
  • 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
  • 1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?

运维安全

  • SQL注入漏洞产生的原因?如何防止?
  • 关于SQL语句应该考虑哪些安全性?
  • 简述数据库的读写分离?
  • 简述数据库分库分表?(水平、垂直)
  • MySQL的复制原理以及流程
  • Mysql热备方案和原理

Java面试题

Java面试题

Java基础面试知识点

  • java中==和equals和hashCode的区别
  • int、char、long各占多少字节数
  • int与integer的区别
  • 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)
  • String、StringBuffer、StringBuilder区别
  • 什么是内部类?内部类的作用
  • 抽象类和接口区别
  • 抽象类的意义
  • 抽象类与接口的应用场景
  • 抽象类是否可以没有方法和属性?
  • 接口的意义
  • 泛型中extends和super的区别
  • 父类的静态方法能否被子类重写
  • 进程和线程的区别
  • final,finally,finalize的区别
  • 序列化的方式
  • transient关键字的作用
  • Serializable 和Parcelable 的区别
  • 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
  • 静态内部类的设计意图
  • 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
  • string 转换成 integer的方式及原理
  • 反射是如何实现的,在哪些场景用到反射
  • 反射中 Class.forName 和 ClassLoader 区别
  • 反射创建类实例的三种方式是什么
  • 如何通过反射调用对象的方法,获取和设置对象私有字段的值
  • 反射机制的优缺点
  • 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配
  • 什么是懒加载(Lazy Loading)
  • 什么是尾递归,为什么需要尾递归

Java高级面试题

  • 讲一下常见编码方式?
  • utf-8编码中的中文占几个字节;int型几个字节?
  • 静态代理和动态代理的区别,什么场景使用?
  • Java的异常体系
  • 修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
  • 为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里
  • 可以在 hashcode() 中使用随机数字吗?
  • Java中实现多态的机制是什么?
  • 如何将一个Java对象序列化到文件里?
  • 说说你对Java反射的理解
  • Java动态代理的实现方式及原理
  • 说说你对Java注解的理解
  • 说说你对依赖注入的理解
  • 说一下泛型原理,并举例说明
  • Java中String的了解
  • String为什么要设计成不可变的?
  • java中的四种引用的区别以及使用场景
  • 强引用置为null,会不会被回收?

Java数据结构

  • 常用数据结构有哪些
  • 并发集合了解哪些?
  • 列举java的集合以及集合之间的继承关系
  • 集合类以及集合框架
  • 容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)
  • List、Set、Map的区别
  • List和Map的实现方式以及存储方式
  • ArrayList和LinkedList的区别,以及应用场景
  • 数组和链表的区别
  • HashMap的实现原理及源码理解
  • HashMap如何put数据(从HashMap源码角度讲解)
  • HashMap的遍历方式及效率
  • 怎么手写实现一个HashMap
  • HashTable实现原理
  • TreeMap具体实现
  • ConcurrentHashMap的实现原理
  • ArrayMap和HashMap的对比
  • HashMap与HashSet的区别
  • HashMap 、HashTable、ConcurrentHashMap 的区别
  • HashMap、LinkedMap、TreeMap的区别
  • 如何决定选用HashMap还是TreeMap
  • HashSet与HashMap怎么判断集合元素重复
  • 集合Set实现Hash怎么防止碰撞
  • WeakHashMap 是怎么工作的?
  • 二叉树的深度优先遍历和广度优先遍历的具体实现
  • 堆的结构
  • 堆和树的区别
  • 堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?
  • 什么是深拷贝和浅拷贝
  • 讲一下对树、B+树的理解
  • 讲一下对图的理解
  • 判断单链表成环与否?

Java线程、多线程、线程池、锁

  • 开启线程的三种方式?
  • 线程和进程的区别?
  • 为什么要有线程,而不是仅仅用进程?
  • run()和start()方法区别
  • 如何控制某个方法允许并发访问线程的个数?
  • 在Java中wait和seelp方法的不同;
  • 谈谈wait/notify关键字的理解
  • 什么导致线程阻塞?
  • 线程如何关闭?
  • 讲一下java中的同步的方法
  • 数据一致性如何保证?
  • 如何保证线程安全?
  • 如何实现线程同步?
  • 两个进程同时要求写或者读,能不能实现?如何防止进程的同步?
  • 线程间操作List
  • Java中对象的生命周期
  • Synchronized用法和原理
  • 谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
  • static synchronized 方法的多线程访问和作用
  • 同一个类里面两个synchronized方法,两个线程同时访问的问题
  • volatile的原理
  • 谈谈volatile关键字的用法和作用以及场景
  • 谈谈NIO的理解
  • synchronized 和volatile 关键字的区别
  • synchronized与Lock的区别
  • ReentrantLock 、synchronized和volatile比较
  • ReentrantLock的内部实现
  • lock原理
  • 死锁的四个必要条件?
  • 怎么避免死锁?
  • 对象锁和类锁是否会互相影响?
  • 什么是线程池,如何使用?
  • Java的并发、多线程、线程模型
  • ThreadLocal 用途是什么,原理是什么,用的时候要注意什么
  • ThreadPool用法与优势,线程池队列已满时会发会生什么
  • 线程池的实现策略
  • 线程池的关闭方式有几种,各自的区别是什么
  • 线程池中submit() 和 execute()方法有什么区别?
  • 谈谈对多线程的理解
  • 多线程有什么要注意的问题?
  • Java中用到的线程调度算法是什么
  • 什么是多线程中的上下文切换,避免上下文切换的方案(无锁编程/CAS/合理的创建线程)
  • JAVA线程间的状态转换
  • 你对线程优先级的理解是什么
  • Java多线程的三大核心是什么?(原子性、可见性、顺序性)
  • 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)
  • 谈谈你对多线程同步机制的理解?
  • 什么是多线程环境下的伪共享(false sharing)
  • 如何保证多线程读写文件的安全?
  • 多线程断点续传原理
  • 断点续传的实现

并发编程

  • 谈谈你对并发编程的理解并举例说明
  • Java 中锁机制:synchronized、Lock、Condition
  • 深入分析ConcurrentHashMap
  • BlockingQueue是什么
  • 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处
  • ArrayBlockingQueue, CountDownLatch的用法
  • CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么
  • Semaphore的用法
  • 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题
  • 解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁
  • 什么时候应该使用可重入锁
  • 简述锁的等级方法锁、对象锁、类锁
  • Java中活锁和死锁有什么区别?
  • 什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁
  • 死锁与活锁的区别,死锁与饥饿的区别
  • 怎么检测一个线程是否拥有锁
  • 如何实现分布式锁
  • 有哪些无锁数据结构,他们实现的原理是什么
  • 读写锁可以用于什么应用场景

JVM

  • Java 内存模型,1.8和1.9的区别
  • Java类加载机制
  • Java 堆内存溢出分析
  • MetaSpace (元数据) 内存溢出一般是什么原因
  • 垃圾回收算法有哪些
  • 哪些情况下的对象会被垃圾回收机制处理掉?
  • 深入理解java内存模型–参考InfoQ系列文章

架构设计和设计模式

  • 聊了下曾经参与设计的服务器架构
  • 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?
  • BS与CS的联系与区别
  • 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别
  • 什么是领域驱动开发(Domain Driven Development)
  • 请简要讲一下你对测试驱动开发(TDD)的认识
  • 微服务(MicroServices)与单体应用(Monolithic Applications)之间的区别在哪里
  • REST、RPC、RMI有什么区别
  • MVC MVP MVVM原理和区别
  • 你所知道的设计模式有哪些?
  • 项目中常用的设计模式
  • 手写生产者/消费者模式
  • 写一个你认为最好的单例模式
  • 写出观察者模式的代码
  • 适配器模式,装饰者模式,外观模式的异同?
  • 用到的一些开源框架,介绍一个看过源码的,内部实现过程。
  • 从0设计一个小程序项目整体架构,如何去做?
  • 说一款你认为当前比较火的应用并设计(比如:电商、直播APP,P2P金融,小视频等)
  • 谈谈对java状态机理解
  • 对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?
  • 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些
  • 实现一个Json解析器(可以通过正则提高速度)
  • 什么样的项目不适合用框架
  • 新浪微博是如何实现把微博推给订阅者
  • 说出数据连接池的工作机制是什么
  • 怎么提升系统的QPS和吞吐量
  • 你有了解过存在哪些反模式(Anti-Patterns)吗
  • 你用过的网站前端优化的技术有哪些
  • 如何搭建一个高可用系统
  • 如何启动时不需输入用户名与密码
  • 如何在基于Java的Web项目中实现文件上传和下载
  • 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。
  • 如何实现负载均衡,有哪些算法可以实现
  • 如何设计一个购物车?想想淘宝的购物车如何实现的
  • 如何设计一套高并发支付方案,架构如何设计
  • 如何设计建立和保持 100w 的长连接
  • 如何避免浏览器缓存。
  • 如何限流?在工作中是怎么做的?说一下具体的实现?
  • 如何进行熔断?
  • 熔断框架都有哪些?具体实现原理知道吗?
  • 如何进行降级?
  • 如何防止缓存雪崩
  • 如果有人恶意创建非法连接,怎么解决
  • 什么是微服务?微服务之间是如何独立通讯的?
  • Spring Cloud 和 Dubbo 有哪些区别?
  • Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
  • 什么是服务熔断?什么是服务降级?
  • 微服务的优缺点分别是什么?说一下你在项目开发中碰到的坑?
  • 你所知道的微服务技术栈都有哪些?
  • Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?

性能优化

  • 遇到过的内存泄漏或栈溢出场景,CPU利用率飙高,应用无响应时怎么解决?
  • 如何分析Thread dump
  • Java多线程引发的性能问题,怎么解决?
  • 如何保持应用的稳定性
  • 线上系统突然变得异常缓慢,你如何查找问题
  • 网站性能优化如何优化
  • SQL优化的常见手段

分布式

  • CDN实现原理
  • 什么是 Raft和Paxos 算法
  • 什么是 zab 协议
  • 解释什么是 MESI 协议(缓存一致性)
  • 解释CAP、BASE
  • 什么是幂等,如何实现
  • 分布式事务的原理,优缺点,如何使用分布式事务?
  • 你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?
  • 分布式ID 生成器的实现方案及优缺点(数据库、本地UUID、本地时间、雪花算法)
  • 分布式锁的实现方式及优缺点
  • 分布式缓存设计需要考虑哪些因素
  • 分布式 Session如何实现
  • 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
  • 如何保证消息队列的高可用?
  • 如何保证消息不被重复消费?(如何保证消息消费的幂等性)
  • 如何保证消息的可靠性传输?(如何处理消息丢失的问题)
  • 如何保证消息的顺序性?
  • 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
  • 高并发下,如何做到安全的修改同一行数据
  • 12306网站的订票系统如何实现,如何保证不会票不被超卖
  • 实现分布式环境下的 countDownLatch
  • es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
  • es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
  • es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
  • es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?

算法

  • 排序算法有哪些?
  • 最快的排序算法是哪个?
  • 手写一个冒泡排序
  • 手写快速排序代码
  • 手写一个折半查找
  • 手写堆排序
  • 实现一个电梯模拟器用
  • 随机产生20个不能重复的字符并排序
  • 写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组
  • 写一段代码在遍历 ArrayList 时移除一个元素
  • 快速排序的过程、时间复杂度、空间复杂度
  • 堆排序过程、时间复杂度及空间复杂度
  • 写出你所知道的排序算法及时空复杂度,稳定性
  • 二叉树给出根节点和目标节点,找出从根节点到目标节点的路径
  • 给阿里2万多名员工按年龄排序应该选择哪个算法?
  • GC算法(各种算法的优缺点以及应用场景)
  • 蚁群算法与蒙特卡洛算法
  • 约瑟芬环游戏
  • 子串包含问题(KMP 算法)写代码实现
  • 一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法
  • 万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)
  • 百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。
  • 两个不重复的数组集合中,求共同的元素。
  • 两个不重复的数组集合中,这两个集合都是海量数据,内存中放不下,怎么求共同的元素?
  • 一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法
  • 一张Bitmap所占内存以及内存占用的计算
  • 2000万个整数,找出第五十大的数字?
  • 烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
  • 求1000以内的水仙花数以及40亿以内的水仙花数
  • 5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同
  • 时针走一圈,时针分针重合几次
  • N*N的方格纸,里面有多少个正方形
  • x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完?
  • 50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少
  • 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
  • 如果让你实现一个并发安全的链表,你会怎么做
  • 计算两个日期之间的差距

编程题

1. 计算加班费

加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时)

  • 计算1000月薪,加班9小时的加班费
  • 计算2500月薪,加班11小时的加班费
  • 计算1000月薪,加班15小时的加班费

2. 卖东西

一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。

  • 模拟一个进货。红苹果跟青苹果各进200个。
  • 模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。

提示:一个苹果是一个单独的实体。

3. 日期提取

有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08

4. 线程

  • 8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
  • 用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出
  • wait-notify 写一段代码来解决生产者-消费者问题

5. 数字计算

  • 判断101-200之间有多少个素数,并输出所有素数

  • 用最有效率的方法算出2乘以17等于多少

  • 有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优

  • 2 亿个随机生成的无序整数,找出中间大小的值

  • 10 亿个数字里里面找最小的 10 个

  • 1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1

  • 一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数

  • 一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素

  • 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

  • 求100-1000内质数的和

  • 求1到100的和的平均数

  • 求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和

  • 算出1到40的质数,放进数组里

    • 显示放组里的数
    • 找出第[5]个数
    • 删除第[9]个数,再显示删除后的第[9]个
  • 有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。

  • 有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数

  • 计算指定数字的阶乘

  • 给定一个包含 N 个整数的数组,找出丢失的整数

  • 一个排好序的数组,找出两数之和为m的所有组合

  • 将一个正整数分解质因数。例如:输入90,打印出90=233*5。

  • 打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方

  • 原地交换两个变量的值

  • 找出4字节整数的中位数

  • 找到整数的平方根

6. 逻辑代码题

  • FizzBuzz问题
  • 实现斐波那契
  • 写一个死锁
  • 手写生产者/消费者模式
  • 写一个你认为最好的单例模式
  • 写一个观察者模式
  • 手写一个冒泡排序
  • 手写快速排序代码
  • 手写一个折半查找
  • 手写堆排序
  • 手写链表逆序代码
  • 合并有序链表
  • 约瑟芬环游戏

其他问题

  • 在你的职业生涯中,算得上最困难的技术挑战是什么
  • 如果有机会重新设计你们的产品,你会怎么做
  • 最近看什么书,印象最深刻的是什么
  • 你的学习方法是什么样的?实习过程中如何学习?实习项目中遇到的最大困难是什么以及如何解决的?
  • 如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办?
  • 工作过程中周围同事/同学有哪些值得学习的地方?

约瑟夫环问题

约瑟夫斯问题

有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。

人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。

问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。

问题

有n个人编号,站成一圈:
1 2 3 4 … … n-1 n

现在从1开始进行报数,报到k的出列自杀,然后剩下的人继续从1报数(当到达编号为n的人时,下一个报数的从编号为1的人开始进行):

1 2 3 4… k(出列自杀) 1 2 …

直到圈内只剩余m人,求胜利者的编号。

例如:当n=6, k=5, m=1时,5,4,6,2,3将会被依次处决,而1将会幸免。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.ArrayList;
import java.util.List;

public class JosephProblem {

/**
* 返回活着的人的位置
*
* @param total 总人数
* @param magicNum 报数到该数字的人自杀
* @param remain 笑着活下去的人
* @return
*/
private List getJosephNumbers(int total, int magicNum, int remain) {

List<Integer> peopleList = new ArrayList<>();
for (int i = 1; i <= total; i++) {
peopleList.add(i);
}
List<Integer> diedList = new ArrayList<>();


int index = -1; //当前应该删除的位置
while (true) {
index = (index + magicNum) % peopleList.size();

diedList.add(peopleList.get(index));
peopleList.remove(index);

//从上一个位置开始计数
index--;

//判断是否剩余m个,如果是的话结束
if (peopleList.size() == remain) {
System.out.println("共" + total + "人,依次报数,当报到" + magicNum + "的人自杀," + remain + "个人笑着活下去.");
System.out.println("死掉的序号顺序为:" + diedList);
System.out.println("笑着活下去序号为:" + peopleList);
System.out.println("----------------------------------");
return peopleList;
}
}
}

public static void main(String[] args) {
JosephProblem test = new JosephProblem();

test.getJosephNumbers(10, 4, 1);
test.getJosephNumbers(10, 2, 1);
test.getJosephNumbers(10, 3, 1);
test.getJosephNumbers(20, 10, 3);
test.getJosephNumbers(20, 4, 6);
}
}

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
共10人,依次报数,当报到4的人自杀,1个人笑着活下去.
死掉的序号顺序为:[4, 8, 2, 7, 3, 10, 9, 1, 6]
笑着活下去序号为:[5]
----------------------------------
共10人,依次报数,当报到2的人自杀,1个人笑着活下去.
死掉的序号顺序为:[2, 4, 6, 8, 10, 3, 7, 1, 9]
笑着活下去序号为:[5]
----------------------------------
共10人,依次报数,当报到3的人自杀,1个人笑着活下去.
死掉的序号顺序为:[3, 6, 9, 2, 7, 1, 8, 5, 10]
笑着活下去序号为:[4]
----------------------------------
共20人,依次报数,当报到10的人自杀,3个人笑着活下去.
死掉的序号顺序为:[10, 20, 11, 2, 14, 6, 19, 15, 9, 7, 5, 8, 13, 18, 12, 4, 17]
笑着活下去序号为:[1, 3, 16]
----------------------------------
共20人,依次报数,当报到4的人自杀,6个人笑着活下去.
死掉的序号顺序为:[4, 8, 12, 16, 20, 5, 10, 15, 1, 7, 14, 2, 11, 19]
笑着活下去序号为:[3, 6, 9, 13, 17, 18]
----------------------------------

团队规划考核

前言

团队需要一些好的机制来保障团队的目标达成,规划、汇报和考核需要做到常规化,下面写的是一些个人实践。

规划和汇报

  • 按季度/月度做规划,建议采用OKR或者OKR+KPI结合的方式来规划目标、拆解关键点以及结果。
  • 按双周迭代方式来进行开发测试,采用敏捷的方式

    腾讯TAPD是个不错的工具,经历了几家公司都推行使用,效果不错,关键是免费。

  • 按周进行团队事务管理
    • 每周一 团队协调人让组员规划本周所要做的事情,如有不合理需要沟通解决
    • 每天 组员自行记录工作日志

      今天做了什么、明天要做什么、有什么问题和困难

    • 每周末 团队协调人写周报(本周工作内容和下周计划),主要包含

      项目、月/季度目标、关键节点、负责人、当前进度、预期完成时间、问题

  • 按月进行绩效考核

    优秀的会有工资浮动

月度考核

目前的组织架构参考敏捷团队模型,我们把原有的职能型组织架构做成虚拟组织,采用敏捷团队(包含前后端测试)来推进,更加偏向于业务推进型,原有职能型组织的Leader组成委员会成员

类似与Spotify的分队和协会,具体理念参考Spotify大规模敏捷之路

对团队的评分标准参考下图:

说明如下:

    1. 先确定整个大团队月度优秀员工数量
    1. 由委员会和总监直接提名少量优秀员工,主要是针对有一些岗位不在团队内部或者在团队中占少数不好参与团队考核,比如助理、设计师、都是人数少的岗位。
    1. 确定团队的优秀员工数,按照下面的标准来评测
    • 第一和最末的团队,优秀员工数量加一和减一
    • 标准维度主要如下:
      1
      2
      3
      4
      项目进度(本月)
      项目质量(Bug数据)
      组内制度的制定与落地&外部沟通
      对公共项目、外部项目、委员会的工作支持
      数据依据:
      1
      2
      3
      4
      月初工作计划表
      TAPD Bug数据
      制度落地和实施状况及外部反馈
      委员会成员的评分
    1. 确定团队成员中哪些拿到优秀员工,有两条维度线来打分
    • Leader打分
    • 委员会打分
    • 得出分数排名,给与优秀员工

    委员会标准如下图:

RPA常见问题

What is RPA?

RPA (Robotic Process Automation) is a type of automation where a machine or computer mimics a human’s action in completing rules based tasks.

How RPA is different from Test Automation?

  • Both Test Automation and RPA involve “Automation” and offer advantages of reducing manual intervention and delivering quality, but these two or different…

  • RPA – Robotic Process Automation, Automates Business Processes like Data Entry, Queries, Calculations, and Transactions in various organizations. where as Test Automation Automates Software Testing Processes,It automates Functional Testing, Performance Testing, Web Services Testing Etc. of Software Products.

  • Using Blueprism, Automation Anywhere, Uipath etc… tools we can automate Business Automation, and Using Selenium, UFT/QTP, LoadRunner SoapUI etc…Software Tools we can automate software Testing Processes.

What type of processes can be automated with RPA?

  • RPA is software-based, it can be used to perform various tasks. These include Maintenance of records, queries, calculations, and transactions.

  • Additionally, any application commonly used by your company can be operated by RPA. Citrix, .NET, HTML, and Java are all technologies commonly supported by RPA.

  • Compatible systems include Mainframe Terminals, SAP, Oracle, Blackline, and many more. RPA can be configured to perform almost any rule-based task.

Popular Robotic Process Automation (RPA) Tools to automate the Business Processes.

  • Blue Prism

    Blue Prism is the trading name of the Blue Prism Group, a UK multinational software corporation, the term Robotic Process Automation was invented by Blue Prism, that itself proves they are the pioneers in Robotic Process Automation Software Development.

  • Automation Anywhere

    Automation Anywhere is another top RPA vendors providing powerful and User- friendly robotic process automation tools to automate tasks of any complexity.

  • UiPath

    UiPath is a Windows desktop Robotic Process Automation (RPA) Software used for automation for various web,desktop,citrix,etc based applications.

Other Popular RPA tools are Pega, Nice, and Workfusion etc…

How to Select a RPA Tool?

By considering several factors we select a RPA Tool for Businness Process Automation,

  • Technology

    First and foremost is the technology in which RPA tool has been built, like Microsift .NET, IBM Mainframe, Java, web etc. The tool has to be platform independent, considering many of the organizations perform their day to day tasks outside the local desktop using Citrix or Virtual machines etc. So the automation solution should be able to support any application and platform.

  • Interface

    Next most important feature is the RPA tool’s user interface. A complex user interface will delay the process of implementation and increase the learning curve and adaptability. A more user friendly interface like drag and drop, auto capture, image recognition etc. would be better.

  • Management

    It is important to know how effectively and easily the robots can be managed, considering these robots are going to be replacing your human workforce. There should be a high level of visibility and control in terms of process monitoring, process change, development, re-use etc.

  • Security

    Security is one of the most important factor to be considered. How safe are the robots when compared to the humans? After all robots/RPA tools are also a piece of software, so how much more security controls can be implemented, test the code rigidly and lock it up, the better.

6) What are the important Phases of RPA Life Cycle?

Phases of RPA Life Cycle:

  • Analysis

    Life cycle in RPA begins with analysis phase. Business team and RPA Architect work together to identify a business process for RPA development.

  • Bot Development

    RPA developer(Team) starts working on requirement in their environment possibly a separate development environment.

  • Testing

    There are two approaches on which testing is being carried out-

    Some organisations conduct Testing by Separate Testing Team, While other few have a dedicated testing team which perform a dedicated QA like normal SDLC flow.

    Best Practice is to have a dedicated testing team which perform QA of developed bot.

  • Deployment and Maintenance-

    After the Development and Testing closure, a bot is ready for deployment and enters maintenance phase.

How to implement Robotic Process Automation?

There are mainly 6 steps to be followed for a successful RPA implementation.

  • Identify the Automation Opportunities
  • Optimize the Identified Processes
  • Build a Business Case
  • RPA Vendor Selection
  • Pilot RPA Development
  • Ramp up and Continue Building Expertise RPA bots.

Explain about RPA Testing?

At a broader level RPA testing can be grouped in to 2 categories.

First one is testing the business processes automated through RPA and the second one is testing the instructions passed on to Robots to execute user actions.

  • Business Process Testing

    This is nothing but the conventional testing done for any application. The end to end business process automated by the RPA tool has to be validated here.

    If we have to test the RPA use case, a scenario would be to test if Robot is able to get the file from server, read the data from application, compare these two data sources, identify any conflicts and send an email notification to respective owner. All combinations of data are to be validate like it is done for any other application.

  • Robots Testing

    There are multiple aspects when testing Robots. The first one is interpretation of the models by Robots. It is very important that the Robots are able to interpret the instructions given through the models correctly and able to perform actions on the UI accordingly. This need not be tested regularly but when the model is designed/modified or before a Robot is put into use.

What are different RPA Jobs?

Robotics Process Automation jobs can be broadly classify into 3 major categories.

  • RPA Developers/Architects
  • Robotic Process Automation Consultants
  • RPA Leads/Managers

What are advantages of Robotic Process Automation?

  • Faster

    As bots are handling the execution here, a larger amount of work can be done in a relatively much shorter period. A faster delivery, coupled with accuracy.

  • Cost Effective

    It has been estimated that using robotics cuts operational costs, Robots can operate 24/7 and take no vacation, when compared to humans.

  • Consistency

    Robotics is a safe, non-invasive technology that doesn’t interfere with the inherent systems and provides perfect consistency in performing the activities across the board, each time and every time.

  • Accuracy & Quality

    RPA offers improved services to processes that have a high probability of human error, thereby increasing accuracy. Robots are reliable, and consistent and do not whine when expected to work tirelessly.

  • Increased Customer Satisfaction

    Delivering better quality of work with high accuracy and improved customer/client interaction leads to increased customer and client satisfaction.

  • Improved Analytics

    Having access to error free, accurate data from various sources would improve the quality of analytics in the process.

What are Limitations of Robotic Process Automation?

  • RPA certainly boosts company efficiency by automating repetitive human effort, but there are limitations to the types of work that it can be applied to – specifically ones that require judgement.

  • RPA cannot read any data that is non-electronic with unstructured inputs.

  • companies need to be aware of diverse inputs coming from multiple sources.

  • RPA is not a cognitive computing solution. It cannot learn from experience and therefore has a ‘shelf life’. As processes evolve

  • Applying RPA to a broken and inefficient process will not fix it. RPA is not a Business Process Management solution and does not bring an end-to-end process view.

Libra环境搭建和第一笔交易

环境准备

  • Linux或者Mac OS系统,本次测试使用CentOS 7.5
  • 稳定的网络环境,并且连接到互联网
  • 提前安装Git
  • 如果是MacOS,需要提前安装Homebrew
  • yum 或者 apt-get命令

踩的坑:

  • 安装包:yum install -y git gcc gcc-c++ ncurses-devel bison
  • CMake版本低(2.8)导致编译错误,升级到3.14.4解决

安装Libra Core

克隆代码库

1
git clone https://github.com/libra/libra.git

运行安装脚本,安装依赖

1
2
cd libra
./scripts/dev_setup.sh

该初始化脚本执行了如下动作:

  • 安装rustup – rustup是Rust官方的跨平台安装工具器, Libra Core使用Rust来实现
  • 安装rust-toolchain的必要版本
  • 安装CMake – 管理编译和构建
  • 安装protoc – protocol buffers的编译器
  • 安装Go – 为了构建protocol buffers使用

构建Libra CLI客户端并连接到测试网络

执行客户端脚本来连接到测试网络上的节点,时间较长,需耐心等待。。。

1
./scripts/cli/start_cli_testnet.sh

一旦连接到网络会看到如下输出信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Connected to validator at: ac.testnet.libra.org:8000
usage: <command> <args>

Use the following commands:

account | a
trueAccount operations
query | q
trueQuery operations
transfer | transferb | t | tb
true<sender_account_address>|<sender_account_ref_id> <receiver_account_address>|<receiver_account_ref_id> <number_of_coins> [gas_unit_price_in_micro_libras (default=0)] [max_gas_amount_in_micro_libras (default 10000)] Suffix 'b' is for blocking.
trueTransfer coins (in libra) from account to another.
help | h
truePrints this help
quit | q!
trueExit this client


Please, input commands:

libra%

使用help可以看到命令列表,可以执行的命令如下:

  • account – 账户相关操作
    • create – 创建账户
    • list – 查看所有账户列表
    • mint – 增加libra币
    • write – 保存libra钱包到磁盘
    • recover – 从磁盘恢复libra钱包
  • query – 查询操作
    • balance | – 查询账户余额
    • sequence – 获得账户当前sequence number
    • account_state – 获取账户最近状态
    • txn_acc_seq – 通过账号或者sequence number获取已提交的交易
    • txn_range – 通过version范围获取已提交的交易
    • event – 通过账号或者事件类型来获取事件列表
  • transfer – 转账操作
    • transfer – 从一个账户转libra币到另外一个账户
    • transferb – transfer的阻塞式操作
  • quit – 退出连接

创建账户

创建账户A

1
2
3
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 1b7f0e3123d52cd4b80d451da785a1db96a5ec6a9cdcd84d5d344341b8e77158

创建账户B

1
2
3
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #1 address fc5fecde4dee37102a49085725f5d4491d9e9cda00afba078988eba0696c4691

列出本地所有账户信息:

1
2
3
libra% account list
User account index: 0, address: 1b7f0e3123d52cd4b80d451da785a1db96a5ec6a9cdcd84d5d344341b8e77158, sequence number: 0, status: Local
User account index: 1, address: fc5fecde4dee37102a49085725f5d4491d9e9cda00afba078988eba0696c4691, sequence number: 0, status: Local

A和B只是为了方便书面称谓,Libra目前不支持给账户命名,但如上A对应编号为0的账户,B对应编号为1的账户。地址后面的 sequence 指的是这个账户主动发起转账的次数,目前两个账户都还没有发起过转账,所以都是 0。

给账户铸币

给A账户铸币1000

1
2
3
libra% account mint 0 1000
>> Minting coins
Mint request submitted

可能会由于网络原因失败

1
2
3
4
libra% account mint 0 1000
>> Minting coins

[ERROR] Error minting coins: error trying to connect: failed to lookup address information: Name or service not known

给B账户铸币50

1
2
3
libra% account mint 1 50
>> Minting coins
Mint request submitted

查询账户余额

1
2
3
4
5
libra% query balance 0
Balance is: 1000

libra% query balance 1
Balance is: 50

发起转账交易

查询账户的sequence,由于两个账户都没有交易记录,所以都是0

1
2
3
4
5
6
libra% query sequence 0
>> Getting current sequence number
Sequence number is: 0
libra% query sequence 1
>> Getting current sequence number
Sequence number is: 0

从A给B转账100

1
2
3
4
libra% transfer 0 1 100
>> Transferring
Transaction submitted to validator
To query for transaction status, run: query txn_acc_seq 0 0 <fetch_events=true|false>

查询账户余额:

1
2
3
4
libra% query balance 0
Balance is: 900
libra% query balance 1
Balance is: 150

再次从A给B转账100

1
2
3
4
5
libra% transferb 0 1 100
>> Transferring
[waiting Transaction completed, found sequence number 2]
Finished transaction!
To query for transaction status, run: query txn_acc_seq 0 1 <fetch_events=true|false>

再查询账户余额:

1
2
3
4
libra% query balance 1
Balance is: 250
libra% query balance 0
Balance is: 800

查询A和B账户的sequence, A的账户sequence number是2表示A发起了两个交易,B账户的sequence number是0表示B账户没有发起交易

1
2
3
4
5
6
libra% query sequence 0
>> Getting current sequence number
Sequence number is: 2
libra% query sequence 1
>> Getting current sequence number
Sequence number is: 0

可以使用 query txn_acc_seq 0 0 true查询详细的转账信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
libra% query txn_acc_seq 0 0 true
>> Getting committed transaction by account and sequence number
Committed transaction: SignedTransaction {
raw_txn: RawTransaction {
truesender: 1b7f0e3123d52cd4b80d451da785a1db96a5ec6a9cdcd84d5d344341b8e77158,
truesequence_number: 0,
truepayload: {,
truetruetransaction: peer_to_peer_transaction,
truetrueargs: [
truetruetrue{ADDRESS: fc5fecde4dee37102a49085725f5d4491d9e9cda00afba078988eba0696c4691},
truetruetrue{U64: 100000000},
truetrue]
true},
truemax_gas_amount: 10000,
truegas_unit_price: 0,
trueexpiration_time: 1561190218s,
},
public_key: 2a9c5aa44975912b7eda3bc9df6047d19dd5f4937404bade1f922acce9cab42c,
signature: Signature( R: CompressedEdwardsY: [203, 171, 64, 238, 247, 224, 54, 137, 221, 158, 125, 30, 230, 58, 66, 151, 147, 23, 112, 148, 192, 216, 201, 210, 123, 53, 94, 96, 129, 180, 182, 126], s: Scalar{
truebytes: [71, 53, 181, 160, 59, 152, 34, 26, 218, 59, 72, 202, 235, 202, 104, 248, 52, 52, 53, 191, 171, 105, 222, 117, 50, 57, 155, 35, 206, 52, 185, 14],
} ),
}
Events:
ContractEvent { access_path: AccessPath { address: 1b7f0e3123d52cd4b80d451da785a1db96a5ec6a9cdcd84d5d344341b8e77158, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: fc5fecde4dee37102a49085725f5d4491d9e9cda00afba078988eba0696c4691, amount: 100000000 } }
ContractEvent { access_path: AccessPath { address: fc5fecde4dee37102a49085725f5d4491d9e9cda00afba078988eba0696c4691, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/received_events_count/" } , index: 0, event_data: AccountEvent { account: 1b7f0e3123d52cd4b80d451da785a1db96a5ec6a9cdcd84d5d344341b8e77158, amount: 100000000 } }

Over!

Git仓库的多个子目录独立成一个新仓库

需求描述

我有一个仓库AAA,目录结构如下:

1
2
3
4
5
6
7
8
$ tree
├── .git
├── common-api
├── commons-pojo
├── commons-utils
├── account
└── payment
└── product

现在我需要把common-api、commons-pojo、commons-utils独立为一个新仓库xxx-common
从网上找到可以用”git filter-branch”和”git subtree split”两种方式独立目录为仓库,但是”git subtree split”只能独立一个目录为仓库,如果需要独立多个目录为仓库需要使用”git filter-branch”。

实施步骤

1. Clone原有仓库到本地

1
git clone git@192.168.0.xxx:test/AAA.git

2. 在本地创建需要保留的分支

下面示例中保留了dev和feature_20190516_xxx_aaa_bbb

1
2
git checkout -b dev origin/dev
git checkout -b feature_20190516_xxx_aaa_bbb origin/feature_20190516_xxx_aaa_bbb

3. 取消远程库的关联

1
git remote rm origin

4. 删除所有tag

需要删除所有的tag,否则会出错

1
git tag -l | xargs git tag -d

5. 保留需要的目录和git历史

把”GIT_COMMIT –”后面的目录改为自己需要保留的

1
2
git filter-branch -f --prune-empty --index-filter \
'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- commons-api commons-pojo commons-utils' -- --all

6. 清理仓库并减小体积

1
2
3
4
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now

7. 关联到新的远程库(空仓库),并推送代码到远端

1
2
3
4
git remote add origin git@192.168.0.xxx:test/xxx-common.git
git push -u origin master
git push -u origin dev
git push -u origin feature_20190516_xxx_aaa_bbb

上线发布流程

上线发布流程图

计划阶段

在迭代完成前半周的会议上确认迭代是否需要发布版本,如果需要则制定发布计划并确定是否需要做回归测试

是否需要回归测试?

1
2
3
4
5
现有的分支模型为开发直接从Master拉取feature分支,测试从Master拉取release/test分组然后合并feature branch到release/test形成测试分支
上线前如果Master分支上没有其他feature上线,则直接使用release/test打包上线

以下情况需要回归测试:
上线前如果Master分支上有其他feature上线,则从Master拉取release/pro并合并相关feature branch打包上线,并进行回归测试

发布策略

能做灰度发布尽量灰度,并且设计开关,有些Bug在测试环境测不出来

常见策略:

  • 灰度/金丝雀
  • 滚动发布
  • 蓝绿发布

上线审批

使用邮件或者TAPD流程进行审批

如下为内容框架:

  • 上线时间
  • 上线内容
  • 影响范围
    • 影响到的服务
    • 数据变更说明
    • 配置变更说明
  • 详细操作步骤(测试和运维可以操作的step by step说明)
  • 上线注意事项
  • 数据监控

上线后

  • 线上验收
    • 验证特性的正确性
    • 验证所有业务流程
    • 检查各项数据的正确性
  • 数据监控
    • 线上数据的正确性
    • 临界值监控
  • Copyrights © 2018-2024 李一
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信