使用 Visual Studio CodeRemote - SSH 插件连接服务器开发时,有可能会遇到不同的服务器对应不同的私钥的情况,这时就需要单独为各个服务器指定私钥的位置。打开 SSH 配置文件(默认路径是 ~/.ssh/config),在需要指定私钥路径的服务器下添加 IdentityFile path-to-private-key 即可,例如:

1
2
3
4
5
Host your-host
HostName your-host-name
User your-host-user
ForwardAgent yes
IdentityFile path-to-private-key

参考:

在某些场景下,编写 Dockerfile 时需要定义变量来避免重复出现的值,例如下面的例子中,Gradle 的版本号出现了三次,如果未来需要更新 Gradle 的版本号,则需要修改三次。

1
2
3
RUN wget https://services.gradle.org/distributions/gradle-6.3-bin.zip
RUN unzip gradle-6.3-bin.zip
RUN gradle-6.3/bin/gradle task

可以通过 ARG variable-name=variable-value 来定义一个变量,使用变量时通过 $variable-name 访问即可,对开头的例子使用变量修改后如下:

1
2
3
4
ARG GRADLE_VERSION=6.3
RUN wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip
RUN unzip gradle-$GRADLE_VERSION-bin.zip
RUN gradle-$GRADLE_VERSION/bin/gradle task

参考:

Math

Computer Science

Algorithm & Data Structures

Compiler & Interpreter

Operating Systems

Database

Networking

Linux

Programming

Programming Languages

C

Java

JavaScript

TypeScript

Python

Clojure

Ruby

Racket

Rust

Go

OCaml

Haskell

Redis

Git

German

Others

首先构建一个多模块的 Maven 项目,项目结构如下:

1
2
3
4
5
6
7
├── product-service
│ └── pom.xml
├── sum-service
│ └── pom.xml
├── app
│ └── pom.xml
├── pom.xml

其中 product-servicesum-service 表示功能代码,app 负责测试用例的整合。product-servicesum-service 分别包含一个 ProductService 类和 SumService 类,具体代码如下:

1
2
3
4
5
6
// ProductService
public class ProductService {
public int product(int x, int y) {
return x * y;
}
}
1
2
3
4
5
6
// SumService
public class SumService {
public int sum(int x, int y) {
return x + y;
}
}

app 内的测试用例如下:

1
2
3
4
5
6
7
public class AppTest {
@Test
public void shouldCalculateCorrectSumAndProduct() {
Assert.assertEquals(10, new ProductService().product(2, 5));
Assert.assertEquals(5, new SumService().sum(2, 3));
}
}

然后在 root 模块的 pom.xml 文件中配置 JaCoCo 插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

最后在 app 模块的 pom.xml 文件中配置 JaCoCo 插件:

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
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>${argLine} -Xms256m -Xmx2048m</argLine>
<forkCount>1</forkCount>
<runOrder>random</runOrder>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<executions>
<execution>
<id>report-aggregate</id>
<phase>test</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

此时在 root 模块下执行 mvn test,执行成功后在 app/target/site/jacoco-aggregate 目录下就会生成各个模块的覆盖测试报告:

alt

完整的代码可参考 GitHub

参考:

在某个 Web 应用中,引用了 豆瓣读书 的图片,大部分图片会无法显示并返回 403 Forbidden 错误,一个可能的原因是触发了 豆瓣 的图片防盗链机制。

一般来说,防盗链机制会判断图片请求的 Request Headers 里的 Referer 字段的值是否是允许的地址,如果不是,则不允许访问相应的资源。所以,一种可能的解决办法是在 HTML 页面中设置 Referrer-Policyno-referrer,在发送 HTTP 请求时不发送 Referer 信息:

1
<meta name="referrer" content="no-referrer" />

参考:

由于网络原因,Flutter 项目获取包依赖时有可能会失败,可通过设置镜像地址解决,新增如下两个环境变量即可:

1
2
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

参考:

在某些场景下,我们会使用 {} 来存储某类对象的映射关系,例如车主和车子的映射关系可记为:

1
2
3
4
{
'Alice': new Car(),
'Bob': new Car()
}

而在 TypeScript 中声明这种对象的类型时遇到了问题:该对象的属性名是未知的,不过所有属性名对应的值的类型是确定的。这种情况下可以借助 Indexable Types 解决,以上述的例子为例:

1
2
3
4
5
6
7
8
interface CarOwners {
[key: string]: Car;
}

const carOwners: CarOwners = {
'Alice': new Car(),
'Bob': new Car()
}

参考:

可以使用清华大学开源软件镜像站上的镜像。例如需要下载 Ubuntu 18 的镜像,先在站内找到对应镜像的地址(例如:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/bionic/20191211/bionic-server-cloudimg-amd64-vagrant.box),然后在终端执行 vagrant box add 镜像的地址 --name ubuntu/bionic,下载完成后即可执行 vagrant init ubuntu/bionic 等操作。

参考:

0%