StephenShawn's Blog

love&&curiosity

安装、网络、包源配置

阿里镜像

  • rockylinux下载地址https://mirrors.aliyun.com/rockylinux
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/Rocky-*.repo

dnf makecache

# RHEL常用命令

- [DNF](https://wangchujiang.com/linux-command/c/dnf.html)
- [NetworkManager](https://blog.csdn.net/yangshihuz/article/details/106643970)
- [sytemctl](https://linux265.com/news/3385.html)
- [firewalld](https://blog.51cto.com/andyxu/2137046)

!用法

  • 用在变量前表示取反

  • 用在赋值的内容后时,使null和undefined类型可以赋值给其他类型并通过编译,表示该变量值可空

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    let y:number

    y = null // 无法通过编译
    y = undefined // 无法通过编译

    y = null!
    y = undefined!
    // 由于x是可选的,因此parma.x的类型为number | undefined,无法传递给number类型的y,因此需要用x!
    interface IDemo {
    x?: number
    }

    let y:number

    const demo = (parma: IDemo) => {
    y = parma.x!
    return y
    }
  • 如果存在空情况的判断并赋具体值时,可以不用!,但是如果要想令y存在等于undefined的情况还是需要用!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    interface IDemo {
    x?: number
    }

    let y:number

    const demo = (parma: IDemo) => {
    y = parma.x || 1 // 如果为undefined,返回y=1,如果不为undefined,则返回parma.x的值
    return y
    }

?用法

  • 除了表示可选参数外,常用于防御性编程
    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
    const a = fetch(...) || {}		// 假设a是从后端拿到的一个对象类型数据
    const unsafeData = a.b.c // 这样写时不安全的,无法确保b是否有值,如果为空则b.c会进行报错
    const safeData = a?.b?.c // 实际上就是相当于 const safeData = a && a.b && a.b.c
    当使用A对象属性A.B时,如果无法确定A是否为空,则需要用A?.B,表示当A有值的时候才去访问B属性,没有值的时候就不去访问,如果不使用?则会报错

    // 由于函数参数可选,因此parma无法确定是否拥有,所以无法正常使用parma.x,使用parma?.x向编译器假设此时parma不为空且为IDemo类型,同时parma?.x无法保证非空,因此使用parma?.x!来保证了整体通过编译
    interface IDemo {
    x: number
    }

    let y:number

    const demo = (parma?: IDemo) => {
    y = parma?.x!
    console.log(parma?.x) // 只是单纯调用属性时就无需!
    return y
    }

    // 如果使用y = parma!.x!是会报错的,因为当parma为空时,是不拥有x属性的,会报找不到x的错误
    但是?用法只能读操作而不能写操作,对一个可能为空的属性赋值是不会被编译通过的,此时还需用用到类型断言

    interface IDemo {
    x: number
    }

    // 编译报错,不能赋值给可选属性
    const demo = (parma?: IDemo) => {
    parma?.x = 1
    }

    // 使用类型断言
    const demo_ = (parma?: IDemo) => {
    let _parma = parma as IDemo
    _parma.x = 1
    }

CommonJS

ESM

Kubernetes镜像

简介

Kubernetes是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现。

下载地址:https://mirrors.aliyun.com/kubernetes/

配置方法

Debian / Ubuntu

1
2
3
4
5
6
7
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

CentOS / RHEL / Fedora

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装

相关链接

在Java8及高版本以上的版本在调用ssl时会出现javax.net.ssl.SSLHandshakeException: No appropriate protocol的异常。

1
2
3
4
5
6
7
8
9
10
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171) ~[na:1.8.0_292]
at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98) ~[na:1.8.0_292]
at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220) ~[na:1.8.0_292]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428) ~[na:1.8.0_292]
at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:316) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:331) ~[mysql-connector-java-8.0.17.jar:8.0.17]
... 68 common frames omitted

解决办法如下:

  1. 修改jre/lib/security/java.security中的disabledAlgorithms,删除SSLv3, TLSv1, TLSv1.1,然后重启应用即可。在vim下,可以使用/disabledAlgorithms快速查找。

jdk.tls.disabledAlgorithms=RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ include jdk.disabled.namedCurves

如果修改了,保存了,重启了还是没有效果,就看下面这个方法:

  1. 修改jdk配置文件/etc/crypto-policies/back-ends/java.config,类似上面方法一样,删除SSLv3, TLSv1, TLSv1.1,保存重启应用。

jdk.tls.disabledAlgorithms=DH keySize < 2048, SSLv2, SSLv3, TLSv1.1, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5

  1. 另外jdk奇数版本可用,偶数版本有上面这个问题,可用通过yum --showduplicate list java* | grep 1.8.0查看可用的版本,选择奇数版本安装也能解决这个问题。

  2. 更新crypto-policies

    update-crypto-policies --set LEGACY

1
2
3
4
5
6
7
8
9
 docker run -d -p 3306:3306 \
--privileged=true \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql01 mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

docker安装oracle

1、安装docker环境。

2、开始拉取oracle镜像

1
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

3、下载完成后,查看镜像

1
docker images

4、创建容器

1
docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

可以写成shell脚本,下次打开oracle数据库就可以一条命令创建容器。

shell脚本如下:

1
2
3
4
5
6
7
8
9
# BEGIN ANSIBLE MANAGED BLOCK
#!/bin/bash
docker rm -f oracle11;
docker run -it -d -p 1521:1521
--privileged=true \
-v /opt/oracle/oradata/dbs:/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs \
-v /opt/oracle/oradata:/home/oracle/app/oracle/oradata \
-e ORACLE_PWD=helowin --name oracle11 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
# END ANSIBLE MANAGED BLOCK

但为了保存上一次容易的配置值,是不建议写这个shell脚本的,下次打开直接用docker start oracle11命令打开。

如果创建成功能会返回容器id

5、进入镜像进行配置

1
docker exec -it oracle11 bash

6、进行sql登录

1
sqlplus /nolog

发现没有该命令,需要先配置环境变量,所以切换root用户。

1
su root 

输入密码:helowin

7、编辑profile文件配置ORACLE环境变量

打开:vi /etc/profile ,在文件最后写上下面内容:

1
2
3
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH

8、保存后执行source /etc/profile 加载环境变量;

9、创建软连接

1
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

10、切换到oracle 用户

1
su - oracle

这里还要说一下,一定要写中间的短横线 - 必须要,否则软连接无效

11、登录sqlplus并修改sys、system用户密码

1
2
3
4
5
6
7
8
sqlplus /nolog   --登录
conn /as sysdba --
alter user system identified by system;--修改system用户账号密码;
alter user sys identified by system;--修改sys用户账号密码;
create user test identified by test; -- 创建内部管理员账号密码;
grant connect,resource,dba to yan_test; --将dba权限授权给内部管理员账号和密码;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; --修改密码规则策略为密码永不过期;(会出现坑,后面讲解)
alter system set processes=1000 scope=spfile; --修改数据库最大连接数据;

12、修改以上信息后,需要重新启动数据库;

1
2
3
4
conn /as sysdba
shutdown immediate; --关闭数据库
startup; --启动数据库
exit:退出软链接

*上面提到的其中一个坑说明:*

当执行修改密码的时候出现 : database not open

提示数据库没有打开,不急按如下操作

输入:

1
alter database open;

注意了:这里也许还会提示 : ORA-01507: database not mounted

解决办法:

输入:

1
alter database mount;

输入 :alter database open;

然后就可执行 修改数据库密码的命令了

改完之后输入:

1
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

刷新下表 exit 是退出sql 软连接

13、复制oracle的数据及配置

1
sudo docker cp id:/home/oracle/app/oracle /opt/oracle

  1. DDL (Data Definition Language): 数据定义语言
  2. DML (Data Manipulation Language):数据操作语言
  3. DCL (Data Control Language): 数据控制语言
  4. DQL (Data Query Language): 数据查询语言
  • ddl:数据库或表的结构操作(****)
  • dml:对表的记录进行更新(增、删、改)(****)
  • dql:对表的记录的查询(****,难点)
  • dcl:对用户的创建及授权(****)

DDL

一、数据库

  • 查看所有数据库:

    1
    SHOW DATABASES
  • 切换数据库:

    1
    USE DATABASENAME
  • 创建数据库:

    1
    CREATE DATABASE IF NOT EXISTS MYDB CHARSET=utf8
  • 修改数据库:

    1
    AlTER DATABASE MYDB CHARSET SET utf8 
  • 删除数据库

    1
    drop database MYDB

数据类型

  • int:整型;
  • double :浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
  • decimal:浮点型 ,在表单钱方面使用该类型,因为不会出现精度缺失问题;
  • char:固定长度字符串类型,char(255);
  • varchar: 可变字符串类型:varchar(65535);
  • text(clob):字符串类型;
  1. tinytext 2^8-1 Byte
  2. text 2^16-1 Byte
  3. mediumtext 2^24-1 Byte
  4. longtext 2^34-1 Byte
  • blob :字节类型;
  1. tinyblob 2^8-1 Byte
  2. blob 2^16-1 Byte
  3. mediumblob 2^24-1 Byte
  4. longblob 2^34-1 Byte
  • date:日期类型,格式为:yyyy-MM-dd;
  • time: 时间类型 格式为:hh:mm:ss
  • timestamp: 时间戳类型;

二、表

  • 创建表:
    1
    CREATE TABLE [IF NOT EXISTS] TABLENAME (cloumn01 type01,cloumn02 type02,cloumn03 type03);
  • 查看当前数据库中所有表名称:SHOW TABLES;
  • 查看指定表的创建语句:SHOW CREATE TABLE 表名(了解);
  • 查看表结构:DESC 表名;
  • 删除表结构:DROP TABLE 表名;
  • 修改表:前缀:ALTER TABLE 表名;
  1. 修改之添加列:
    AlTER TABLE 表名 ADD (
    列名 列类型,
    列名 列类型,

  2. 修改列类型(如果被修改的列已存在数据,那么新的列类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型
  3. 修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 新类型
  4. 删除列:ALTER TABLE 表名 DROP 列名
  5. 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名

DML

  • 添加表记录
    1
    INSERT INTO tableName (c1,c2,c3)values(v1,v2,v3);
  • 修改表记录
    1
    2
    3
    update tableName set c1 = v1,c2 = v2;
    update tableName set c1 = v1,c2 = v2 where c3 = v3 or c4 = v4;
    delete * from stu where gender is null;

DCL

  • 一个项目创建一个用户!一个项目对应的数据库只有一个!
  • 这个用户只能对这个数据库有权限,其他数据库不能操作
  1. 创建用户
  • 在指定的IP地址上登录
1
CREATE USER username@IP IDENTIFIED BY 'password'
  • 在任意的IP地址上登录
1
CREATE USER username@'%' IDENTIFIED BY 'password'
  1. 给用户授权
    1
    2
    3
    4
    -- 部分权限授权
    GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb.* TO shawn@IP
    -- 所有权限授权
    GRANT ALL ON mydb.* TO username@IP
  2. 撤销授权
    1
    REVOKE CREATE,ALTER,DROP,UPDATE,DELETE ON mydb.* FROM username@IP
  3. 查看权限
    1
    SHOW GRANTS FOR username@IP
  4. 删除用户
    1
    DROP USER username@IP

DQL

1
SELECT * FROM tableName;

常用函数

1
2
3
4
5
6
7
8
9
IFNUll(c1,v1);
DATE_FORMAT("yyyy-MM-dd",'%Y-%m-%d');
CONCAT(v1,v2,v3);
distinct;
-- '_'匹配一个字符
-- '%'匹配零个到N个字符
like '_%';
-- (当前页-1)* 每页记录数
limit (17-1)*8,8

聚合函数

联合查询

聚合函数

2.1. Empty Stream
We should use the empty() method in case of the creation of an empty stream:

Stream streamEmpty = Stream.empty();
We often use the empty() method upon creation to avoid returning null for streams with no element:

public Stream streamOf(List list) {
return list == null || list.isEmpty() ? Stream.empty() : list.stream();
}

阅读全文 »

常用快捷键1

常用快捷键2

  • ctrl + alt + o 代码优化(自动删除多余的包与变量)
  • Alt + F12 打开terminal(终端)
  • ctrl+shift+(+/-) 展开全部折叠全部
  • ctrl+(+/-) 展开折叠当前方法
  • shift + f6 重命名(重构)
  • ctrl + alt + l 代码格式化
  • alt + insert 创建内容
  • psvm main方法
  • sout 输出语句
  • Ctrl + d 复制一行
  • Ctrl + y 删除一行
  • Ctrl + Shift + Up/Down 代码向上/下移动
  • Ctrl + n 搜索类
  • alt + insert 生成代码
  • alt + Enter 导包,生成变量
  • Ctrl + / 或 Ctrl + Shift+ / 单行注释或多行注释
  • fori 回车即可 for循环
  • ctrl + alt + t 代码包围try-catch,if,while等
  • ctrl + alt + -> 向后 ctrl + alt + <- 向前
  • 显示代码结构:alt + 7
  • 显示导航栏:alt + 1
  • 撤销 ctrl + Z
  • REDO 操作 ctrl + shif + z
  • Tab 缩进 shift+Tab 撤销缩进
  • Ctrl + u 选择行
  • alt + f8 查看变量值
  • ctrl + alt +B 查找接口实现类
  • ctrl + h 查看类或接口的继承关系
  • ctrl + o 覆写方法

替换

  • ctrl + r 替换
  • ctrl + shift + r 路径中替换

调试debug

  • F9 调试
0%