rust Non-UTF-8 output
发布于
dev rust

Non-UTF-8 output

D:\dev\vs\Common7\Tools\VsDevCmd.bat
rstc 编译
error: linking with `link.exe` failed: exit code: 1112
  |
  = note: Non-UTF-8 output: msvcrt.lib(chkstk.obj) : fatal error LNK1112: xxx\r\n

error: aborting due to previous error

解决

用 D:\dev\vs\VC\Auxiliary\Build\vcvars64.bat 启动

微信版本历史
发布于
wechat

国内移动社交产品迭代的方向、中国移动社交的进化图谱

rabbitmq
发布于
mq

基本概念

Publisher 发的消息通过 Connection 中的 Channel 到达 Broker 某个 Virtual Host

消息经过指定的 Exchange,根据 Binding 依据,分发到 0~n 个 Queue 中

Queue 中消息等待 Consumer 消费


Message:由消息头和消息体组成。消息头由一系列的可选属性组成,routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(消息持久性)等

Broker:MQ server

Connection: 客户端和Broker间的TCP连接

Channel:要为每个Connection创建Channel,通过 Channel才能执行AMQP命令,一个Connection可包含多个Channels

Exchange:接收生产者发送的消息,并根据Binding规则将消息路由给队列

Queue:存未被消费者消费的消息

Binding:联系Exchange与Queue,Binding后生成路由表

Exchange收到Message解析Header得到Routing Key,根据Routing Key与Exchange Type将Message路由到Queue

  • Binding Key

    由Consumer在绑定Exchange与Queue时指定

  • Routing Key

    由Producer发送Message时指定,两者的匹配方式由Exchange Type决定

Virtual Host:类似于权限控制组,一个virtual host里面可以 若干个Exchange和Queue,权限控制的最小力度

os 内存布局 & malloc
发布于
os

堆/栈

  • 栈: 函数调用基础(维护函数调用的上下文),大多数编程语言存储局部变量函数参数的地方,线程私有

    自动分配,如函数局部变量 int b;自动在栈中为b开辟空间

  • 堆:应用程序动态分配的内存区域,malloc/new,通常是程序的运行库管理栈空间分配

    自行申请,并指明大小,如 p1 = (char *)malloc(10);或c++ new 运算符。注意p1本身在栈中

栈或堆现有大小不够用时,按增长方向扩大自身尺寸,直到预留的空间被用完为止

栈扩展,触发由 expand_stack() 在Linux中处理的页面错误,调用acct_stack_growth()检查是否适合扩展堆栈

栈大小低于RLIMIT_STACK(通常8MB),栈增长,如果已经达到最大栈大小,溢出,段错误(Segmentation Fault)

运行库向操作系统 批发 较大的堆空间,然后 零售 给程序用

全部“售完”或程序有大量的内存需求时,再根据实际需求向操作系统 进货

springcloud
发布于
java spring springcloud

你对Spring Cloud多了解源自于你对Spring Boot有多了解
你对Spring Boot多了解源自于你对Spring Framework有多了解

Spring Cloud是什么

一系列框架的有序集合,基于 Spring Boot,主要还是在 JVM 范畴内来解决微服务架构的挑战

利用Spring Boot的开发便利性简化分布式系统基础设施的开发,如:

服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署

将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来

通过Spring Boot风格进行再封装屏蔽掉复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

总结来说,Spring Cloud 的思路就是,已经有的我拿来用,实在没有的我再补充

相对于 Dubbo 来说,是整合了整套解决方案的框架,而 Dubbo 只是其中的一个点

版本对应关系

Release Train 发布时间 Spring Boot版本 SC Commons版本 维护信息 主要版本
2020.0.x 2020-12 2.4.x 3.0.0 按计划支持到2023-12
Hoxton 2019-07 2.2.x, 2.3.x (从SR5起) 2.2.x Finchley系列次要版本,常规维护到2021-6
2020-07特殊维护期(不加新功能,只改紧急bug)
2021-12只发布重大错误/安全补丁
Greenwich 2018-11 2.1.x 2.1.x 2020-01停止维护
2020-12-31终结特殊维护期
Finchley 2017-10 2.0.x 2.0.x 2018发布
Edgware 2017-08 1.5.x 1.3.x
Dalston 2017-05 1.5.x 1.2.x
Brixton 2016-09 1.3.x 1.1.x
Angel 2016-05 1.2.x 1.0.x
软中断
发布于
kernel

软中断

点完外卖后,平台虽会显示配送进度,但也不会傻盯着,得去干别的事情,等外卖到了配送员会通过「电话」通知,电话响了,就停下手中地事情,去拿外卖

中断是一种 异步事件处理机制,可以提高系统的并发处理能力

OS 收到中断请求,会打断其他进程的运行,中断处理程序,要尽可能快的执行完,减少对正常进程运行调度的影响

中断处理程序在响应中断时,可能还会「临时关闭中断」,意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就说中断有可能会丢失,所以中断处理程序要短且快

再以外卖为例,点了两份不同的外卖,由不同的配送员来配送

当第一份外卖送到时,配送员给我打了长长的电话,说了一些杂七杂八的事情,比如给个好评等等

如果这时另一位配送员也想给我打电话,因为我在通话中(相当于关闭了中断响应),自然就无法打通我的电话,他可能尝试了几次后就走掉了(相当于丢失了一次中断)

java test-2 JUnit 4&5 部分基础
发布于
java
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-runner</artifactId>
    <scope>test</scope>
</dependency>

JUnit4和JUnit5在测试编码风格上没有太大变化

import org.junit.jupiter.api.*;

public class AppTest {

   @BeforeAll
   static void setup() {

      System.out.println("@BeforeAll executed");
   }

   @BeforeEach
   void setupThis() {

      System.out.println("@BeforeEach executed");
   }

   @Tag("DEV")
   @Test
   void testOne() {

   }

   @Tag("PROD")
   @Disabled
   @Test
   void testTwo() {

   }

   @AfterEach
   void tearThis() {

      System.out.println("@AfterEach executed");
   }

   @AfterAll
   static void tear() {

      System.out.println("@AfterAll executed");
   }
}

Assertion

org.junit.jupiter.Assertions

测试期望结果

assertEquals(expected, actual) 最常用

  • assertTrue()
  • assertFalse()
  • assertNotNull()
  • assertArrayEquals()

三方断言类库

JUnit Jupiter足以满足许多测试场景需要,更强大和附加功能,如匹配器,AssertJ,Hamcrest,Truth 等第三方断言库自由选择

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

@Test
void assertWithHamcrestMatcher() {
    assertThat(2 + 1, is(equalTo(3)));
}

JUnit 4 编程模型遗留继续用 org.junit.Assert.assertThat

assertThrows

@Test
void exceptionTesting() {
   Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
      throw new IllegalArgumentException("a message");
   });
   assertEquals("a message", exception.getMessage());
}

Fixture(生命周期相关)

用作 编写测试前准备、测试后清理的固定代码

@BeforeEach/@AfterEach和@BeforeAll/@AfterAll

  1. 实例变量,在 @BeforeEach 中初始化,在 @AfterEach中清理,它们在各个@Test方法中互不影响,因为是不同的实例
  2. 静态变量,在@BeforeAll中初始化,在@AfterAll中清理,它们在各个@Test方法中均是唯一实例,会影响各个@Test方法

大多用 @BeforeEach和 @AfterEach足够,只有某些测试资源初始化耗费时间太长,以至于不得不尽量“复用”时才用 @BeforeAll和 @AfterAll

condition

@Disabled

@EnabledOnOs(OS.WINDOWS)

@EnabledOnOs({ OS.LINUX, OS.MAC })

@DisabledOnOs(OS.WINDOWS)

@DisabledOnJre(JRE.JAVA_8)

@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")

@EnabledIfEnvironmentVariable(named = "DEBUG", matches = "true")

测试方法、测试类、测试集、测试运行器(Runners)

  • 测试方法就是用@Test注解的一些函数
  • 测试类是包含一个或多个测试方法的一个 **Test.java文件
  • 测试集是一个suite,可能包含多个测试类
  • 测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法

常见 Runners

  • @RunWith(Parameterized.class) 配合@Parameters使用JUnit的参数化功能

  • @RunWith(Suite.class)

    @SuiteClasses({ATest.class,BTest.class,CTest.class})

  • @RunWith(JUnit4.class) junit4的默认运行器

  • @RunWith(JUnit38ClassRunner.class),兼容junit3.8

  • @RunWith(SpringJUnit4ClassRunner.class)集成了spring的一些功能

JUnit 3 默认 JUnit4ClassRunner

JUnit4默认 BlockJUnit4ClassRunner

JUnit4 extends BlockJUnit4ClassRunner

@RunWith(JUnit4.class) 即调用默认JUnit 运行器

参数化测试

@ParameterizedTest

@ValueSource

@MethodSource

@CsvSource

@ParameterizedTest
@ValueSource(ints = { 0, 1, 5, 100 })
void testAbs(int x) {
    assertEquals(x, Math.abs(x));
}

public class StringUtils {
    public static String capitalize(String s) {
        if (s.length() == 0) {
            return s;
        }
        return Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase();
    }
}

参数化测试,不但要给出输入,还要给出预期输出。测试方法至少需要接收两个参数:

@ParameterizedTest
void testCapitalize(String input, String result) {
    assertEquals(result, StringUtils.capitalize(input));
}

@MethodSource,写个同名静态方法提供测试参数:

@ParameterizedTest
@MethodSource
void testCapitalize(String input, String result) {
    assertEquals(result, StringUtils.capitalize(input));
}

static List<Arguments> testCapitalize() {
    return asList(
            Arguments.arguments("abc", "Abc"), 
            Arguments.arguments("APPLE", "Apple"), 
            Arguments.arguments("gooD", "Good"));
}
@CsvSource({ "abc, Abc", "APPLE, Apple", "gooD, Good" })
@CsvFileSource(resources = { "/test-capitalize.csv" })

Categories

public interface FastTests { /* category marker */ }
public interface SlowTests { /* category marker */ }

public class A {
  @Test
  public void a() {
    fail();
  }

  @Category(SlowTests.class)
  @Test
  public void b() {
  }
}

@Category({SlowTests.class, FastTests.class})
public class B {
  @Test
  public void c() {

  }
}

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class })
public class SlowTestSuite {
  // Will run A.b and B.c, but not A.a
}

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses( { A.class, B.class }) 
public class SlowTestSuite {
  // Will run A.b, but not A.a or B.c
}

测试套件

@RunWith(JUnitPlatform.class)
@SelectPackages("junit5.examples")
public class JUnit5TestSuiteExample {
}

过滤测试包、类甚至测试方法

  1. @IncludePackages@ExcludePackages来过滤包
  2. @IncludeClassNamePatterns@ExcludeClassNamePatterns过滤测试类
  3. @IncludeTags@ExcludeTags过滤测试方法
@RunWith(JUnitPlatform.class)
@SelectPackages("junit5.examples")
@IncludePackages("junit5.examples.packageA")
@ExcludeTags("PROD")
public class JUnit5TestSuiteExample {
}

maven FailSafe & Surefire

  • Surefire插件用来执行单元测试

  • FailSafe插件用来执行集成测试

maven的生命周期与集成测试相关的四个阶段

1.pre-integration-test:准备集成测试环境,类似于junit单元测试中的setUp

2.integration-test:执行集成测试

3.post-integration-test:销毁集成测试的环境,类似于junit单元测试中的tearDown

4.校验:分析集成测试的结果

FailSafe工作在integration-test以及verify阶段,与surefire插件不同的是不会因为集成测试中失败而终止整个过程,即post-integration-test可以确定执行

FailSafe插件有两个goal:integration-test 和verify

1、3 如通过容器插件,jetty/tomcat plugin 或cargo plugin实现

2、4由failsafe实现

cargo可加载命令行参数,通过jacoco统计测试覆盖率,tomcat plugin就无法做到

 <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-failsafe-plugin</artifactId>
     <executions>
         <execution>
             <id>integration-test</id>
             <goals>
                 <goal>integration-test</goal>
             </goals>
         </execution>
         <execution>
             <id>verify</id>
             <goals>
                 <goal>verify</goal>
             </goals>
         </execution>
     </executions>
</plugin>

IT用例如果和UT用例放在同项目,必须在在UT的surefire中exclude所有的IT用例

spring boot service注入

junit5

@ExtendWith(SpringExtension.class) 

junit4

@RunWith(SpringRunner.class)

不加,service无法注入,值为null

ref

https://www.cnblogs.com/felixzh/p/12554701.html

https://zhuanlan.zhihu.com/p/162032557

https://www.baeldung.com/junit-5-migration

https://blog.csdn.net/HeatDeath/article/details/79841526

https://www.cnblogs.com/lspz/p/6727123.html

http://www.jfh.com/jfperiodical/article/1455?

https://doczhcn.gitbook.io/junit5/index/index

java test-1 JUnit 简介
发布于
java
public class Max {

   public int max(int a, int b) {

      if (a > b) {
         return a;
      } else {
         return b;
      }
   }
}
public class Test {

   public static void main(String[] args) {

      Max max = new Max();
      if (2 == max.max(1, 2)) {
         System.out.println("pass");
      } else {
         System.out.println("fail");
      }
   }
}

main()方法测试缺陷

不能把测试代码分离

添加新测试方法,要在main() 添加方法调用

没有打印出测试结果和期望结果,例如,expected: 2, but actual: 1

需要对打印或者输出结果进行人为的判断

……