2020-12-28 13:38:16    10    0    0

ssh远程登录或者使用ssh协议的命令(比如scp)慢时,可以按照如下步骤检查

一. UseDNS

关闭 服务端 的sshd服务DNS解析配置,在服务端:

  1. sudo vim /etc/ssh/sshd_config
  2. # 修改
  3. UseDNS no
  4. sudo systemctl restart sshd
2020-12-25 08:42:45    12    0    0

一. 添加依赖

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-common</artifactId>
  4. <version>3.1.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hadoop</groupId>
  8. <artifactId>hadoop-client</artifactId>
  9. <version>3.1.1</version>
  10. </dependency>
2020-12-23 18:03:14    20    0    0

一. 添加依赖

  • 根据hbase的版本,添加相同版本的 hbase-client 客户端。
  1. <dependency>
  2. <groupId>org.apache.hbase</groupId>
  3. <artifactId>hbase-client</artifactId>
  4. <version>2.0.2</version>
  5. </dependency>

二. 配置文件

  • 将安装Hbase的配置文件hbase-site.xml拷贝到src/main/resources/目录下,如果需要打包然后在其他服务器上跑的话,将该配置文件放置在classpath下即可。

2020-12-21 22:58:58    10    0    0

一. slice的结构

slice 翻译成中文就是切片,它和数组(array)很类似,可以用下标的方式进行访问,如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。

  1. // runtime/slice.go
  2. type slice struct {
  3. array unsafe.Pointer // 元素指针
  4. len int // 长度
  5. cap int // 容量
  6. }
  • slice 共有三个属性:

    • 指针,指向底层数组;
    • 长度,表示切片可用元素的个数,也就是说使用下标对 slice 的元素进行访问时,下标不能超过 slice 的长度;
    • 容量,底层数组的元素个数,容量 >= 长度。在底层数组不进行扩容的情况下,容量也是 slice 可以扩张的最大限度。
2020-12-20 19:20:32    10    0    0

一. 使用方法举例

Java程序中,我们经常遇到一大堆单方法接口,即一个接口只定义了一个方法,此时可以以匿名类方式编写。如下是一个排序的例子

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. public class Main {
  4. public static void main(String[] args) throws Exception {
  5. String[] array = {"ccc", "aaa", "bbb"};
  6. Arrays.sort(array, new Comparator<String>() {
  7. public int compare(String s1, String s2) {
  8. return s1.compareTo(s2);
  9. }
  10. });
  11. System.out.println(Arrays.toString(array));
  12. }
  13. }
  • 如果使用Lambda的方式来编写,可以简化代码如下
  1. import java.util.Arrays;
  2. public class Main {
  3. public static void main(String[] args) throws Exception {
  4. String[] array = {"ccc", "aaa", "bbb"};
  5. Arrays.sort(array, (s1, s2) -> s1.compareTo(s2));
  6. System.out.println(Arrays.toString(array));
  7. }
  8. }
2020-12-20 17:34:58    13    0    0

一. 创建线程

  • 一个线程可以等待另一个线程直到其运行结束。例如,main线程在启动t线程后,可以通过t.join()等待t线程结束后再继续运行。如果去掉 t.join() 后,main主线程和新创建的子线程就是同步运行的。

  • 守护线程

    • 守护线程是指为其他线程服务的线程。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。
    • 在守护线程中,编写代码要注意:守护线程不能持有任何需要关闭的资源,例如打开文件等,因为虚拟机退出时,守护线程没有任何机会来关闭文件,这会导致数据丢失。
    • 使用 t.setDaemon(true) 设置线程为守护线程。

1.1 继承自Thread类

  1. public class Main {
  2. public static void main(String[] args) {
  3. Thread t = new MyThread();
  4. t.start();
  5. t.join();
  6. }
  7. }
  8. class MyThread extends Thread {
  9. @Override
  10. public void run() {
  11. System.out.println("start new thread!");
  12. }
  13. }

1.2 实现Runnable接口

2020-12-19 00:12:57    14    0    0

一. URL编码与解码

  • 和标准的URL编码稍有不同,URLEncoder把空格字符编码成+,而现在的URL编码标准要求空格被编码为%20,不过,服务器都可以处理这两种情况。
  1. import java.net.URLDecoder;
  2. import java.net.URLEncoder;
  3. import java.nio.charset.StandardCharsets;
  4. String encoded = URLEncoder.encode("中 文!", StandardCharsets.UTF_8);
  5. System.out.println(encoded);
  6. String decoded = URLDecoder.decode("%E4%B8%AD+%E6%96%87%21", StandardCharsets.UTF_8);
  7. System.out.println(decoded);

二. Base64编码与解码

  • Base64编码的目的是把二进制数据变成文本格式传输或处理,这样在很多文本中就可以处理二进制数据。
  • Base64编码可以把任意长度的二进制数据变为纯文本,且只包含A~Z、a~z、0~9、+、/、=这些字符。

  • 原理

    • 把3字节的二进制数据按6bit一组,用4个int整数表示,然后查表,把int整数用索引对应到字符,得到编码后的字符串。
    • 举个例子:3个byte数据分别是e4、b8、ad,按6bit分组得到39、0b、22和2d
    • 因为6位整数的范围总是0~63,所以,能用64个字符表示:字符A~Z对应索引0~25,字符a~z对应索引26~51,字符0~9对应索引52~61,最后两个索引62、63分别用字符+和/表示。
2020-12-18 10:53:42    10    0    0

一. 使用方法

注意: 使用matches是整个字符串的匹配,find可以提取出部分。

1.1 使用字符串匹配

  • 缺点
    反复使用String.matches()对同一个正则表达式进行多次匹配效率较低,因为每次都会创建出一样的Pattern对象。
  1. String regex = ".*";
  2. System.out.println("abc".matches(regex));

1.2 使用Matcher匹配

  • 优点
    可以先创建出一个Pattern对象,然后反复使用,就可以实现编译一次,多次匹配。
  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3. Pattern p = Pattern.compile(".*");
  4. Matcher m = p.matcher("abc");
  5. System.out.println(m.matches());
2020-12-17 18:28:13    12    0    0

一. 单元测试简单流程

1.1 准备待测试代码

Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。对于高质量的代码来说,测试覆盖率应该在80%以上。

  • HelloJava.java
  1. package com;
  2. public class HelloJava {
  3. public int age;
  4. public HelloJava(int age) {
  5. this.age = age;
  6. }
  7. }

1.2 准备单元测试

2020-12-17 00:18:16    12    0    0

时间 => 时间戳

  1. # 当前时间 => 时间戳
  2. date +%s
  3. # 指定时间 => 时间戳
  4. date +%s -d '2020-05-18 12:00:00'