0%

一.运算符
1.1 运算符和表达式
•运算符:对常量或者变量进行操作的符号
•表达式:用运算符把常量或者变量连起来符合java语法的式子就可以称为表达式。
不同运算符连接到表达式体现的是不同类型表达式。
•举例说明:
int a=10;
int b=20;
int c=a+b;
+:是运算符,并且是算数运算符
a+b:是表达式,由于+是算数运算符,所以这个是算数表达式

符号 作用 说明
+ 加
- 减
* 乘
/ 除 获取的是两个数据除法的商
% 取余 获取的是两个数据除法的余数
整数相除只能得整,要小数需要浮点数参与
1.2 字符 的“+” 操作是拿字符在计算机底层对应的数值来进行计算的
‘A’=>65,A-Z是连续的
‘a’=>97,a-z是连续的
‘0’=>48,0-9是连续的
算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升。
提升规则:
•byte、short、和char类型将被提升为int类型
•整个表达式的类型自动提升到表达式中最高等级的类型
等级顺序:byte,short,char=>int=>long=>float=>double

1.3字符串的加操作:
当“+”操作出现在字符串时,整个“+”是连接符,而不是运算符。在+操作出现字符串,那就是连接操作,从左到右执行。

1.4赋值运算符
符号 作用 说明
+ 赋值 a=10,将10赋予a
+= 加后赋值 a+=b,将a+b的值赋予a
-= 减后赋值 a-=b,将a-b的值赋予a
*= 乘后赋值 a=b,将ab的值赋予a
/= 除后赋值 a/=b,将a/b的商赋予a
%= 取余后赋值 a%=b,将a/b的余数赋予a
扩展运算符隐藏了强制类型转换。
1.5自增自减运算符
符号 作用 说明
++ 自增 变量值加一
+- 自减 变量值减一
注意事项:
•++和–都可以放变量前面或者后面
•单独使用时,不论前后都是一样的
•参与操作时,如果放在变量后面,那么先将变量赋值再进行自增/减操作,如果在前面,先将变量做自增/减操作再进行赋值。
例:
a=10;
b=a++;此时先赋予b的值10,再自增11
c=++a;此时自增到11,再赋予c值

1.6 关系运算符
符号 说明

1
2
3
4
5
6
7
8
9
==	a==b,判断a与b的值是否相等,成立为true,不成立为false
!= a!=b,判断a与b的值是否不相等,成立为true,不成立为false

> a>b,判断a值是否大于b,成立为true,不成立为false
>
> = a>=b,判断a值是否大于等于b,成立为true,不成立为false
> < a < b,判断a值是否小于b,成立为true,不成立为false
> <= a<=b,判断a值是否小于等于b,成立为true,不成立为false
> 注意事项:关系运算符的结果都是boolean,要么true,要么false

1.7 逻辑运算符
逻辑运算符是用来连接关系表达式的运算符。
逻辑运算符也可以直接连接布尔类型的常量或变量。

符号 作用 说明
& 逻辑与 a & b,a和b都是true,结果为true,否则false
| 逻辑或 a | b,a和b都是false,结果为false,否则true
^ 逻辑异或 a ^ b,a和b结果不同为true,否则false
! 逻辑非 !a,结果和a的结果刚好相反
1.8 短路逻辑运算符
符号 作用 说明
&& 短路与 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果
注意事项:
•逻辑与&,无论左边真假,右边都要执行。
•短路与&&,如果左边真,右边要执行;如果左边假,右边不执行。
•逻辑或|,无论左边真假,右边都要执行。
•短路或||,如果左边假,右边要执行;如果左边真,右边不执行。
1.9 三元运算符
•格式:关系表达式?表达式1:表达式2;
•范例a>b?a:b;

计算规则:
首先计算关系表达式的值
如果值为true,表达式1就是运算结果
如果值为false,表达式2就是运算结果

一:注释方法
//单行注释

/*
多行注释
*/

/**
文档注释
*/
二:关键字定义&&赋值
​ 关键字字母全部小写,一般会highlight

​ 变量:在程序运行过程中,其值可以发生改变的量。本质上讲,变量是内存的一小块区域。

​ 常量:在程序运行中,值不可更改的量
​ 常量分类:

字符串常量 用双引号括起来的内容 “Hello”,”一二三”
整数常量 不带小数点的数字 ±1
小数常量 带小数点的数字 ±3.14
字符常量 用单引号括起来的内容 ‘A’,’0’,’我’
布尔常量 布尔值,true/false true,false
空常量 特殊值,空值 null
/*
Java程序最基本组成单位:类
格式:
public class 类名称{
}
*/

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
public class HelloWorld{
//main方法是程序的入口方法,代码从main开始执行
public static void main(String[] args){
//字符串常量
System.out.println("HelloWorld,一");
//整数常量
System.out.println(1);
//小数串常量
System.out.println(3.14);
//字符常量
System.out.println('A');
System.out.println('0');
System.out.println('一');
//布尔常量
System.out.println(true);
System.out.println(false);

/*空常量,不能直接输出
System.out.println(null);

error: reference to println is ambiguous
System.out.println(null);
^
both method println(char[]) in PrintStream and method println(String) in PrintStream match
*/
}
}

三.数据类型
​ Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。

image

数据类型 关键字 内存占 取值范围
整数 byte 1 -128~127
short 2 -32768-32767
int (默认) 4 -2的31次方到2的31次方-1
long 8 -2的63次方到2的63次方-1
浮点数 float 4 负数:-3.402823E+38到-1.401298E-45
正数1.401298E-45到3.402823E+38
double (默认) 8 负数:-1.797693E+308到-4.9000000EE-324
正数:4.9000000EE-324到1.797693E+308
字符 char 2 0-65535
布尔 boolean 1 true,false
说明:E+38表示乘以10的38次方,E-45即乘以-10的45次方
四:名称定义
​ 标识符:就是给类、方法,变量等起名字的符号。
​ 定义规则:
​ •由数字、字母、下划线(_)和美元符($)组成。
​ •不能以数字开头。
​ •不能是关键字。
​ •区分大小写。
​ 常见命名约定:
​ 小驼峰命名法:方法、变量
​ •约定1:标识符是一个单词的时候,首字母小写。
​ •范例1:name
​ •约定2:标识符由多个字母组成时,第一个单词字母小写,其他单词首字母大写。
​ •范例2:firstName
​ 大驼峰命名法:类
​ •约定1:标识符是一个单词的时候,首字母大写。
​ •范例1:Student
​ •约定2:标识符由多个字母组成时,每个单词首字母大写。
​ •范例2:GoodStudent

五:类型转换
​ 自动类型转换:把一个表示数据范围小的值或者变量赋予给另一个表示数据范围大的变量。
​ 范例:double d = 10;

image

强制类型转换:把一个数据范围大的数值或者变量赋值给一个表示数据范围小的变量
•格式:目标数据类型 变量名=(目标数据类型)值或者变量
•范例int k = (int)88.88;

一.数组
1.1 数组概述:
•一次性声明大量用于存储的数据变量
•要存储的数据通常都是同类型数据。
1.2 什么是数组
数组(array)是一种用于存储多个相同类型数据的存储类型
1.3 数组定义的格式
•格式一:数据类型[]变量名
范例:int[] arr
•定义了一个int类型数组,数组名是arr

•格式二:数据类型 变量名[]
范例:int arr[]
•定义了一个int类型变量,变量名是arr数组

二. 数组初始化之动态初始化
2.1数组初始化概述
Java中的数组必须初始化才能使用
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组赋值

2.2数组初始化方式
•动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
•格式:数据类型[]变量名 = new 数据类型[数组长度]
•范例:int[] arr = new int[3]

•静态初始化

三.数组元素访问
3.1 数组元素访问
•数组变量访问方式
•格式:数组名

•数组内部保存的数据的访问方式
•格式:数组名[索引]

•索引是数组中数据的编号方式
•作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊变量名
•特征①:索引是从0开始的
•特征②:索引是连续增加的
•特征③:索引逐一增加,每次加1

四.内存分配
4.1 Java中的内存分配
Java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对内存空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
数组在初始化时,会为存储空间提供默认值
•整数:默认值0
•浮点数:默认值0.0
•布尔值:默认false
•字符:默认空字符
•引用数据类型:默认null

•栈内存:存储局部变量
定义在方法中的变量,例如arr
使用完毕,立即消失
•堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
整数:默认值0
浮点数:默认值0.0
布尔值:默认false
字符:默认空字符
引用数据类型:默认null
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时回收。

4.2 单个数组的内存图
4.3 多个数组的内存图
4.4 多个数组指向相同的内存图
4.5 数组初始化之静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
•格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3…};
•范例:int arr[]=new int[]{1,2,3};
•简化格式:数据类型[]变量名={数据1,数据2…};
•范例:int[] arr={1,2,3};

4.6 数组操作的两个常见小问题
•索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
•空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常
•null:空值,引用数据类型的默认值,表示不指向任何有效对象

4.7 遍历
获取数组元素数量
•格式:数组名.length
•范例:arr.length
遍历通用格式

1
2
3
for(int x=0;x<arr.length;x++){
arr[x]
}

4.8 数组常见操作
获取最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
int[] arr={11,22,33,44}
//1.定义一个变量,用于保存最大(小)值
int max;
//2.取数组中的第一个数据作为变量的初始值
int max=arr[0];
//3.与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
for(int x=1;x<arr.length;x++){
if(arr[x]>max){
max=arr[x];
}
}
//4.循环结束后打印变量的值
System.out.println(arr[max]);

一. 流程控制
1.1 流程控制语句分类
•顺序结构
顺序结构是最基本的结构,按照代码先后依次执行。
•分支结构(if,switch)
•循环结构(for,while,do…while)

1.2 if语句①
格式:
if(关系表达式){
语句体;
}
执行流程:
①首先计算表达式的值
②如果关系表达式的值为true就执行语句体。
③如果关系表达式的值为false就不执行语句体。
④继续执行后面的内容。

1.3 if语句②

1
2
3
4
5
if(关系表达式){
语句体1
}else{
语句体2
}

①首先计算表达式的值
②如果关系表达式的值为true就执行语句体1。
③如果关系表达式的值为false就执行语句体2。
④继续执行后面的内容。

1.4 if语句③

1
2
3
4
5
6
7
8
if(关系表达式1){
语句体1
}else if(关系表达式2)(
语句体2
)...
else{
语句体n+1
}

①首先计算表达式的值
②如果关系表达式的值为true就执行语句体1。
③如果关系表达式的值为false就执行语句体2。
④…
⑤如果没有任何true,则执行语句体n+1。

二. switch语句
switch语句格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(表达式){
case1:
语句体1
break
case2:
语句体2
break
case3:
语句体3
break
default:
语句体n+1
[break;]
}

执行流程:
①首先计算表达式的值
②依次和case后面的值进行比较,如果有对应的值,就会执行语句,在执行过程中,遇到break就结束。
③如果所有的case后面的值和表达式的值都不匹配,就会执行default里的语句,然后程序结束。

三. for循环语句
3.1 循环结构
循环结构组成:
初始化语句:用于表示程序循环开始时的起始状态,简单说就是循环开始时什么样。
条件判断语句:用于表示程序循环反复执行的条件,简单说就是循环是否能一直执行下去。
循环体语句:用于表示程序循环反复执行的内容,简单说就是循环反复执行的事情。
条件控制语句:简单说就是循环每次变化的内容,简单说就是控制循环是否能执行下去。

循环结构对应的语法:
初始化语句:这是一条或多条语句,这些语句可以完成一些初始化操作。
条件判断语句:这里使用一个结果为boolean类型的表达式,这个表达式能决定是否执行循环体。
循环体语句:这里可以是任意语句,这些语句将反复执行。
条件控制语句:这里通常是使用一条语句来改变变量的值,从而达到是否让循环继续执行下去的结果。
3.2 for语句循环格式
格式:

1
2
3
for(初始化语句;条件判断语句;条件控制语句){
循环体语句
}

执行流程:
①首先执行初始化语句
②执行条件判断语句,true执行,false跳出。
③执行循环体语句
④执行条件控制语句
⑤回到②继续

四. while循环语句
4.1while循环语句格式
完整格式:

1
2
3
4
5
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}

执行流程:
①首先执行初始化语句
②执行条件判断语句,true执行,false跳出。
③执行循环体语句
④执行条件控制语句
⑤回到②继续

五. do…while循环语句
5.1 do…while循环语句完整格式:

1
2
3
4
5
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句)

执行流程:
①首先执行初始化语句
②执行循环体语句
③执行条件控制语句
④执行条件判断语句,true执行,false跳出。
⑤回到②继续

六.三种循环语句的区别
•for 循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
•do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体。(先执行后判断)
for和while的区别
•条件控制语句所控制的自增变量,因为归属for循环的语句中,在for循环结束后就不能再被访问到了。
•条件控制语句所控制的自增变量,因为不归属while循环的语句中,在while循环结束后,该变量还能继续使用。
死循环格式:
for(;;){}
while(true){}
do{}while(true);

七.跳转控制语句:
7.1 跳转控制语句概述
•continue 用在循环中,基于条件控制,跳过某次循环体内容执行,继续下一次执行
•break 用在循环中,基于条件控制,终止某次循环体内容执行,也就是说结束当前的整个循环。

八. 循环嵌套
语句结构:
•顺序语句:以分号结尾,表示一句话的结束。
•分支语句
一对大括号表示if的整体结构,整体描述一个完整的if语句
一对大括号表示for的整体结构,整体描述一个完整的for语句
•循环语句:
一对大括号表示while的整体结构,整体描述一个完整的while语句
一对大括号表示do…while的整体结构,整体描述一个完整的do…while语句
任何语句对外都可以看成是一句话,一句代码。
分支语句包含分支语句成为分支嵌套。
循环语句包含循环语句成为循环嵌套。

九. Random
9.1 random的作用和使用步骤
作用:用于产生一个随机数。
使用步骤:
①导包
import java.util.Random;
导包的动作必须出现在定义上面。
②创建对象
Random r = new Random();
上面这个格式里,只有变量名r可以变,其他都不允许变。
③接收数据
int number = r.nextInt(10);//数据获取的范围:【0,10),包括0,不包括10
上面这个格式里,变量名r可以变,数字范围10可以变,其他都不允许变。

一.运算符
1.1 运算符和表达式
•运算符:对常量或者变量进行操作的符号
•表达式:用运算符把常量或者变量连起来符合java语法的式子就可以称为表达式。
不同运算符连接到表达式体现的是不同类型表达式。
•举例说明:
int a=10;
int b=20;
int c=a+b;
+:是运算符,并且是算数运算符
a+b:是表达式,由于+是算数运算符,所以这个是算数表达式

符号 作用 说明
+ 加
- 减
* 乘
/ 除 获取的是两个数据除法的商
% 取余 获取的是两个数据除法的余数
整数相除只能得整,要小数需要浮点数参与
1.2 字符 的“+” 操作是拿字符在计算机底层对应的数值来进行计算的
‘A’=>65,A-Z是连续的
‘a’=>97,a-z是连续的
‘0’=>48,0-9是连续的
算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升。
提升规则:
•byte、short、和char类型将被提升为int类型
•整个表达式的类型自动提升到表达式中最高等级的类型
等级顺序:byte,short,char=>int=>long=>float=>double

1.3字符串的加操作:
当“+”操作出现在字符串时,整个“+”是连接符,而不是运算符。在+操作出现字符串,那就是连接操作,从左到右执行。

1.4赋值运算符
符号 作用 说明
+ 赋值 a=10,将10赋予a
+= 加后赋值 a+=b,将a+b的值赋予a
-= 减后赋值 a-=b,将a-b的值赋予a
*= 乘后赋值 a=b,将ab的值赋予a
/= 除后赋值 a/=b,将a/b的商赋予a
%= 取余后赋值 a%=b,将a/b的余数赋予a
扩展运算符隐藏了强制类型转换。
1.5自增自减运算符
符号 作用 说明
++ 自增 变量值加一
+- 自减 变量值减一
注意事项:
•++和–都可以放变量前面或者后面
•单独使用时,不论前后都是一样的
•参与操作时,如果放在变量后面,那么先将变量赋值再进行自增/减操作,如果在前面,先将变量做自增/减操作再进行赋值。
例:
a=10;
b=a++;此时先赋予b的值10,再自增11
c=++a;此时自增到11,再赋予c值

1.6 关系运算符
符号 说明

1
2
3
4
5
6
7
8
9
10
==	a==b,判断a与b的值是否相等,成立为true,不成立为false
!= a!=b,判断a与b的值是否不相等,成立为true,不成立为false
> a>b,判断a值是否大于b,成立为true,不成立为false
>= a>=b,判断a值是否大于等于b,成立为true,不成立为false
< a < b,判断a值是否小于b,成立为true,不成立为false
<= a<=b,判断a值是否小于等于b,成立为true,不成立为false
注意事项:关系运算符的结果都是boolean,要么true,要么false
1.7 逻辑运算符
逻辑运算符是用来连接关系表达式的运算符。
逻辑运算符也可以直接连接布尔类型的常量或变量。

符号 作用 说明
& 逻辑与 a & b,a和b都是true,结果为true,否则false
| 逻辑或 a | b,a和b都是false,结果为false,否则true
^ 逻辑异或 a ^ b,a和b结果不同为true,否则false
! 逻辑非 !a,结果和a的结果刚好相反
1.8 短路逻辑运算符
符号 作用 说明
&& 短路与 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果
注意事项:
•逻辑与&,无论左边真假,右边都要执行。
•短路与&&,如果左边真,右边要执行;如果左边假,右边不执行。
•逻辑或|,无论左边真假,右边都要执行。
•短路或||,如果左边假,右边要执行;如果左边真,右边不执行。
1.9 三元运算符
•格式:关系表达式?表达式1:表达式2;
•范例a>b?a:b;

计算规则:
首先计算关系表达式的值
如果值为true,表达式1就是运算结果
如果值为false,表达式2就是运算结果

  • 准备&&操作步骤

准备工具:
shadowsocks-NG

步骤:
1.ss-ng打开偏好设置
1.1 进入“高级”标签,将“本地socks5监听地址”改为0.0.0.0(同样为本地地址,所有均可监听)
1.2 进入“HTTP”标签,将“HTTP代理监听地址”改为0.0.0.0,并记下监听端口
2.在macOS查看本地ip地址
ifconfig
将en0(根据自己当前网卡连接选择)中的inet地址复制

3.PD虚拟机为原本配置,使用推荐:共享网络,不需更改。

打开win10设置-网络-代理,打开代理开关,填入macOS刚刚复制的ip地址,端口为SS的HTTP监听端口

完成。

  • 搬瓦工CentOS6 使用IPv6的SS

当前IPv4 IP被封,需要Google查资料,使用v6 IP勉强使用,此方法延迟大约是v4的10倍,原因可能与路由出口以及IP转化有关,但是方法十分简单。

当前系统环境(均为KVM自带):
centos6-bbr,
ss
网络环境:
电信网,支持IPv6

首先使用如下教程,获取IPv6的IP,并使其在server自启动
https://www.bandwagonhost.net/2144.html

我这ping通Google但是没有显示IP,不影响使用。
可以使用ip -6 route查看一下,自带的内容会error 113,但是自己添加的在最后4条,没有error。

到此,IPv6已经配置完成,本地也已经可以ping通服务器的IPv6地址。

但是CentOS的IPv6还有防火墙,会导致即使ping通,服务启动也无法使用ss。可以使用命令开启端口,我这里选择直接关闭。
service ip6tables stop
chkconfig ip6tables off

至此,本机可以ping通、telnet通IPv6的主机地址。重启ss服务后,将IPv6地址添加到本地Client,其他配置文件不需修改,即可使用。
(若多人账号,需要自行配置json文件并添加自启动)

1
2
3
4
5
6
7
8
相关ip6tables命令:
/sbin/ip6tables -A INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT;
/sbin/ip6tables -A INPUT -m state –state NEW -m tcp -p udp –dport 8080 -j ACCEPT;

ss相关:
多人用户自行配置ss.json,并添加至rc.local自启动
/usr/bin/ssserver -c /etc/ss.json -d start
/usr/bin/ssserver -c /etc/ss.json -d stop

  • Centos 8 repo & pd_tools

接上篇已配置好本地local.repo,安装好图形界面
进入网络设置,打开本地连接开关
1.将本地repo取消

1
2
cd /etc/yum.repo.d/
mv local.repo local.repo.bak

2.备份远程源

1
2
3
cp CentOS-AppStream.repo{,.bak}
cp CentOS-Base.repo{,.bak}
cp CentOS-Extras.repo{,.bak}

3.添加阿里源,修改如下

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
vi CentOS-AppStream.repo

[AppStream]
name=CentOS-$releasever - AppStream

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os/

gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

vi CentOS-Base.repo

[BaseOS]
name=CentOS-$releasever - Base

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/

gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

vi CentOS-Extras.repo

[extras]
name=CentOS-$releasever - Extras

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/extras/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os/

gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

4.清理缓存并更新源

1
2
dnf clean all
dnf makecache

5.安装pd_tools
虚拟机光盘挂载prl-tools-lin.iso

1
2
3
4
#进入terminal
mount -t auto /dev/cdrom /mnt/cdrom
cd /mnt/cdrom
./install

如果一切正常则安装完毕,若遇到如下问题
dkms
hpijs

dkms
pjijs
则尝试安装

1
2
3
4
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
#手动安装dkms
yum install -y dkms
yum install -y hpijs

再次尝试
to be continued
//切勿尝试不同版本的prl_tools_lin.iso,会直接导致图形界面宕机

安装机型:Thinkpad E450C
安装版本:DS3617xs-6.17

镜像下载地址:
http://www.nasyun.com/thread-64575-1-1.html

工具:
空U盘(16G),img写盘工具,win8 PE盘一块

步骤:
使用二合一包比自行安装少很多步骤,仅需恢复后重置引导即可。

1.下载3617xs UEFI镜像后解压出约15G文件,存入16G空U盘
2.下载img写盘工具,一并存入(若PE已有该工具可跳过。img写盘工具比win32diskimager写入快3倍左右,建议使用)
3.使用PE引导Thinkpad进入PE界面
4.打开img写盘工具,选择解压后的镜像,目标选择 物理盘 Physical Disk,进行写入。
5.写入完成后已有一台可以直接硬盘启动的黑群晖,但是空间仅9G

接下来按照教程进行:
http://www.nasyun.com/forum.php?mod=viewthread&tid=65425&page=1#pid486522

1.删除存储空间和RAID空间,新建硬盘获得所有空间
3.重启进入winPE,打开DiskGenius,读取14G镜像
4.在刚刚创建的存储空间前有一个127M的小分区,创建63M和64M两个分区后删除63MB的,保存下一步
5.将虚拟镜像的EFI分区克隆进64MB分区中,重启
6.重启后硬盘自动引导,可以通过群晖安装助手查询该机器IP,登陆后即可操作

Python官网出中文版文档(进阶部分仍是英文),但是Dash更新好像无法下载中文文档,遂自建

方法非常简单:

python先根据自己版本下载doc2dash
pip3 install doc2dash

然后去官网下载中文版html
https://docs.python.org/zh-cn/3/archives/python-3.7.3-docs-html.tar.bz2

解压为python-3.7.3-docs-html文件夹(可在此改名)

然后运行doc2dash python-3.7.3-docs-html
Adding table of contents meta data… [#########################################################################################################################################################] 100%
即可在目录创建出python-3.7.3-docs-html.docset

复制到Dash默认路径打开即可导入