VS Code Prettier 插件设置不自动添加行位分号和不将单引号修改为双引号
1 | "prettier.semi": false -- 行尾不添加分号 |
1 | "prettier.semi": false -- 行尾不添加分号 |
在 Java 1.5 之前,传统定义枚举的方式是借用定义常量的方式,例如定义颜色:
1 | public static final int RED = 1; |
在 Java 1.5 中增加了新的引用类型枚举。
Java 的枚举类型的父类均为 java.lang.Enum,枚举本质上是 int 值。
使用枚举方式定义颜色:
1 | public enum Color { |
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过使用YAML文件来配置应用程序的服务,并使用docker-compose相关命令从配置中创建并启动所有服务。
使用Compose通常分为以下三部:
Dockerfile定义应用docker-compose.yml定义服务docker-compose up构建并启动应用docker-compose.yml配置文件一般长这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
运行下面的命令下载最新的Docker Compose
1 | $ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
为docker-compose命令添加可执行权限
1 | $ sudo chmod +x /usr/local/bin/docker-compose |
测试安装是否正确
1 | $ docker-compose --version |
1 | $ sudo rm /usr/local/bin/docker-compose |
创建一个测试目录
1 | $ mkdir composetest |
创建一个名为app.py的文件:
1 | import time |
上述例子中的redis是redis容器的在应用所属网络上的hostname,多个docker应用处于相同网络下时,通过hostname即可互相访问。
requirements.txt的文件并添加以下内容:1 | flask |
在这个步骤中,创建一个Dockerfile来构建Docker镜像。这个镜像包含Python环境和Python应用所需的所有依赖。
在项目目录中创建一个名为Dockerfile的文件并添加以下内容:1
2
3
4
5FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Dockerfile构建为镜像步骤:
.下的所有文件添加到镜像的/code目录中/codepython app.py在项目目录中创建一个名为docker-compose.yml的文件并添加以下内容:
1 | version: '3' |
上面这个Compose文件定义了两个服务,web和redis。
web服务:
Dockerfile所构建的镜像5000端口,这是Flask web的默认端口redis服务使用Docker Hub registry中的镜像构建。
在工程目录下执行docker-compose命令:
1 | $ docker-compose up |
在浏览器输入http://localhost:5000/查看应用是否运行正常。
在终端中输入docker images ls查看本地镜像:
1 | $ docker image ls |
修改docker-compose.yml,给web服务添加一个目录挂载
1 | version: '3' |
volumes键值把当前目录挂载到容器内/code目录
1 | $ docker-compose up |
如果你想让你的服务在后台运行,给docker-compose up添加-d参数,并使用docker-compse ps查看当前的运行:
1 | $ docker-compose up -d |
使用docker-compose run指令可以在容器内运行指令,例如查看web服务所在容器的环境变量:
1 | $ docker-compose run web env |
如果使用docker-compose up -d启动应用,可以使用docker-compose stop指令停止应用。
docker-compose down指令用来关闭所有,包括启动的容器,如果加上--volumes也会删除挂载的目录。
| Compose 文件格式 | Docker Engine 版本 |
|---|---|
| 3.7 | 18.06.0+ |
| 3.6 | 18.02.0+ |
| 3.5 | 17.12.0+ |
| 3.4 | 17.09.0+ |
| 3.3 | 17.06.0+ |
| 3.2 | 17.04.0+ |
| 3.1 | 1.13.1+ |
| 3.0 | 1.13.0+ |
| 2.4 | 17.12.0+ |
| 2.3 | 17.06.0+ |
| 2.2 | 1.13.0+ |
| 2.1 | 1.12.0+ |
| 2.0 | 1.10.0+ |
| 1.0 | 1.9.1.+ |
1 | version: "3" |
Compose文件是一个定义服务、网络、挂载卷的YAML文件,默认的路径是./docker-compose.yml。
.yml或.yaml扩展名都是可以的
服务定义包含了应用于该服务所启动的各个容器的配置,就像将命令行参数传递给docker container create一样。同样,网络和卷定义类似于docker network create和docker volume create。
跟docker container create一样,配置项是在Dockerfile中指定的,如CMD, EXPOSE, VOLUME, ENV, 因为这些都是默认的,所以不需要再docker-compose.yml中再次指定。
配置中可以使用类似Bash的${VARIABLE}语法在值中使用环境变量。
构建时应用的配置。
build可以指定为包含构建上下文路径的字符串:
1 | version: '3' |
或者作为一个在context下面指定路径的对象以及可选的Dockerfile和args:
1 | version: '3' |
如果在build时指定image,Compose会按照image中指定的imageName和tag构建镜像:
1 | build: ./dir |
上面的配置表示从./dir目录构建一个名为webapp标签为1.0的镜像。
该配置项在使用deploying a stack in swarm mode构建时会被忽略。
包含Dockerfile的目录的路径,或者是git仓库的url。
当提供的值是相对路径时,则表示相对于Compose文件的位置。此目录也是发送到Docker守护程序的构建上下文。
1 | build: |
Compose使用备用Dockerfile来构建,同时还必须指定构建路径。
1 | build: |
添加构建参数,这些参数只能在构建过程中访问。
首先,在Dockerfile中指定参数:
1 | ARG buildno |
然后在构建键下指定参数。可以传递映射或列表:
1 | build: |
参数也可以省略,在这种情况下,构建时的值是运行Compose的环境中的值。
1 | args: |
YAML中的布尔值(
true,false,yes,no,on,off) 必须用引号括起来,以便解析器将它们解释为字符串。
v3.2新增
设置一些引擎用于缓存解决方案的镜像:
1 | build: |
v3.3新增
使用Docker标签将元数据添加到生成的镜像中。可以使用数组或字典。
建议使用反向DNS表示法来防止标签与其他软件使用的标签冲突。
1 | build: |
v3.5新增
为此构建的容器设置/dev/shm分区的大小。
指定表示字节数的整数值:
1 | build: |
或表示字节值的字符串:1
2
3build:
context: .
shm_size: '2gb'
v3.4新增
根据Dockerfile中的定义构建指定的阶段:
1 | build: |
添加或删除容器功能:
1 | cap_add: |
该配置项在使用deploying a stack in swarm mode构建时会被忽略。
覆盖默认命令:
1 | command: bundle exec thin -p 3000 |
该命令也可以是一个列表,方式类似于dockerfile:
1 | command: ["bundle", "exec", "thin", "-p", "3000"] |
第一步,先插入U盘,打开终端使用下面的命令查看U盘是否已经mount到系统,这时在Finder下也能看到U盘。1
diskuitl list
终端输出类似如下内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20wangjindeMacBook-Pro:~ wangjin$ diskutil list
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 251.0 GB disk0
1: EFI EFI 314.6 MB disk0s1
2: Apple_APFS Container disk1 250.7 GB disk0s2
/dev/disk1 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +250.7 GB disk1
Physical Store disk0s2
1: APFS Volume Macintosh HD 222.4 GB disk1s1
2: APFS Volume Preboot 23.1 MB disk1s2
3: APFS Volume Recovery 506.6 MB disk1s3
4: APFS Volume VM 3.2 GB disk1s4
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *62.1 GB disk2
1: Windows_NTFS WANGJIN 62.1 GB disk2s1
可以看到,上面的/dev/disk2即是U盘挂载点
1 | diskutil unmountDisk /dev/disk2 |
1 | dd if=/Users/wangjin/Downloads/CentOS-7-x86_64-DVD-1708.iso of=/dev/disk2 bs=1m |
bs=1m表示设置写入块大小
1 | sudo killall -29 dd |


1 | <dependency> |
| 关键字 | 示例 | JPQL片段 |
|---|---|---|
| And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
| Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
| Is,Equals | findByFirstname, findByFirstnameIs, findByFirstnameEquals |
… where x.firstname = ?1 |
| Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
| LessThan | findByAgeLessThan | … where x.age < ?1 |
| LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
| GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
| GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
| After | findByStartDateAfter | … where x.startDate > ?1 |
| Before | findByStartDateBefore | … where x.startDate < ?1 |
| IsNull | findByAgeIsNull | … where x.age is null |
| IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
| Like | findByFirstnameLike | … where x.firstname like ?1 |
| NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
| StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
| EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
| Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
| OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
| Not | findByLastnameNot | … where x.lastname <> ?1 |
| In | findByAgeIn(Collection |
… where x.age in ?1 |
| NotIn | findByAgeNotIn(Collection |
… where x.age not in ?1 |
| True | findByActiveTrue() | … where x.active = true |
| False | findByActiveFalse() | … where x.active = false |
| IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中:1
2
3
4
5
6
7
8
9
10<html>
<head>
<script>
alert('Hello, world'); // 页面弹出Hello,world提示框
</script>
</head>
<body>
...
</body>
</html>
1 | $ git remote add [remote名称] <git_url> |
1 | $ git remote remove [remote名称] <git_url> |
1 | $ git remote set-url --add [remote名称] <git_url> |
1 | $ git remote set-url --delete [remote名称] <git_url> |
配置保存在.git/config文件中
1 | $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
1 | $ brew tap caskroom/cask |
应用也可以通过 App Store 安装,而且有些应用只能通过 App Store 安装,比如 Xcode 等一些 Apple 的应用。App Store 没有对应的命令行工具,还需要 Apple ID。倒是更新起来很方便。
几乎所有常用的应用都可以通过 brew-cask 安装,而且是从应用的官网上下载,所以你要安装新的应用时,建议用 brew-cask 安装。如果你不知道应用在 brew-cask 中的 ID,可以先用brew cask search命令搜索
1 | $ brew cask install java |
1 | $ brew cask reinstall java |
homebrew-cask-versions1 | brew tap caskroom/versions |
1 | brew cask upgrade |
1 | $ java -version |
使用brew cask安装JDK
1 | brew cask install java6 #JDK6 |
修改shell(.bash_profile,.bashrc,.zshrc)配置添加切换
1 | # Switch JDK |