Hi there 👋

Welcome to my blog

Java 中static关键字都能怎么玩

static 变量 static变量是使用 static关键字定义的变量,又被称为静态变量 静态变量是属于类的,也叫类变量;实例变量(非static变量)属于某个具体的对象 静态变量和非静态变量的区别: 静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化 非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响 静态变量可以通过类名直接引用。 class Dome { public static int staticVariable = 10; } public class Test { public static void main(String[] args) { System.out.println(Dome.staticVariable); } } static 方法 static方法是使用 static关键字定义的方法,和静态变量类似,同时它也不属于任何一个实例对象,即无需对象访问 class Dome { public static String staticMethod() { return "静态方法"; } } public class Test { public static void main(String[] args) { System.out.println(Dome.staticMethod()); } } static 代码块 静态代码块加载类时候加载,可以使用静态代码块初始化类,静态代码块可以出现在类的任意部分,当类被加载时按照静态代码块的顺序来执行每个代码块 class Dome { static { System....

2022-03-03 · 1 min · Jairo

OpenEuler安装Docker和踩坑分析

12 月 8 日,CentOS 开发团队在其官博宣布,CentOS 8 将在 2021 年 12 月 31 日结束支持,CentOS 7 会按照计划维护至生命周期结束即 2024 年 6 月 30 日,接下来接下来将重点建设 CentOS Stream。免费的RedHat没有了,但生活还得继续。 接下来我的目光转向openEuler,openEuler 是一个开源、免费的 Linux 发行版平台,将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系。它由华为公司开源,众多国内企业也积极加入到openEuler社区,其社区发展之速度令人吃惊,堪称是中国开源领域的里程碑。 进入正题 如果想忽略过程请直接查看结论:👉结论 我是用的openEuler版本:20.03 LTS SP1,安装在虚拟机中,使用ssh连接 在openEuler上安装Docker还是让我踩了不少坑,先看看这些坑是如何产生的 虽然官方没有说openEuler是基于什么开源系统开发的,但大致内容和CentOS相似,首先参照官网文档安装步骤如下: 这里插一嘴,旧版本的Docker称为Docker或Docker Engine。17年改为基于YY.MM的版本, Docker Engine改为Docker CE(社区版),Docker Data Center改为Docker EE(企业版) 如果要卸载旧版本查看官方文档:https://docs.docker.com/engine/install/centos/#uninstall-old-versions 安装方法 官方给出了3种安装方法: 从Docker的存储库中安装(https://docs.docker.com/engine/install/centos/#install-using-the-repository) 下载RPM包并手动安装(https://docs.docker.com/engine/install/centos/#install-from-a-package) 使用自动化脚本(https://docs.docker.com/engine/install/centos/#install-using-the-convenience-script) 安装步骤 我使用第一种方法进行安装 因为需要用到yum-config-manager工具,所以需要安装yum-utils包。之后使用 yum-config-manager 添加docker-ce的软件仓库 sudo yum install -y yum-utils 软件仓库里找不到这个包,那好吧,添加仓库源 我是用的是华为云开源镜像站的镜像(https://mirrors.huaweicloud.com) wget -O /etc/yum....

2022-03-03 · 4 min · Jairo

Python 标准库之 collections (数据类型)

虽然 Python 提供了一些简单的数据结构类型,如 list 、 tuple 、 set 和 dict;这些数据类型可以满足我们日常使用,但 collections 就是为了代替这些标准数据类型而来。 快速查看表 collections 提供了 8 个 对象和 1 个工厂函数 对象 功能 deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop) ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面 Counter 字典的子类,提供了可哈希对象的计数功能 OrderedDict 字典的子类,保存了他们被添加的顺序 UserDict 封装了字典对象,简化了字典子类化 UserList 封装了列表对象,简化了列表子类化 UserString 封装了列表对象,简化了字符串子类化 namedtuple() 创建命名元组子类的工厂函数 defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 namedtuple() 语法:namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)...

2020-06-06 · 5 min · Jairo

Javascript ES6 展开语法和解构赋值语法

展开语法 展开语法(Spread syntax), 可以在函数调用或数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按键值的方式展开。 函数参数展开 function fun(a, b, c) { console.log(a, b, c) } let args = [1, 2, 3] fun(...args) // 1 2 3 function fun1(a, b, c, d) { console.log(a, b, c, d) } let args = [2, 3] fun1(1, ...args, 4) // 1 2 3 4 数组使用展开语法 let array1 = [1, 2, 3] let array2 = ['hello', ...array1] console.log(array2) // ["hello", 1, 2, 3] 数组的深拷贝...

2020-05-05 · 4 min · Jairo

Python 标准库之 typing (类型标注)

PEP 3107引入了功能注释的语法,PEP 484 加入了类型检查 标准库 typing 为类型提示指定的运行时提供支持。 示例: def f(a: str, b:int) -> str: return a * b 如果实参不是预期的类型: 但是,Python运行时不强制执行函数和变量类型注释。使用类型检查器,IDE,lint等才能帮助代码进行强制类型检查。 使用NewType 创建类型 NewType() 是一个辅助函数,用于向类型检查器指示不同的类型,在运行时,它返回一个函数,该函数返回其参数。 import typing Id = typing.NewType("Id", int) a = Id(2020) 使用 NewType() 创建的类型会被类型检查器视为它的原始类型的子类。 回调(Callable) 将回调函数类型标注为 Callable[[Arg1Type, Arg2Type], ReturnType]。 from typing import Callable def f(a: int) -> str: return str(a) def callback(a: int, func: Callable[[int], str]) -> str: return func(a) print(callback(1, f)) 泛型 为容器元素添加预期的类型 from typing import Mapping a: Mapping[str, str] 通过 TypeVar 进行参数化来约束一个类型集合:...

2020-04-04 · 2 min · Jairo

Python 协程并发

先行内容 同步和异步 同步和异步关注的发送方和接收方是否协调步调一致。 同步:发送方发出请求后,等接收方发回响应以后才发下一个请求。 异步:发送方发出请求后,不等接收方发回响应,接着发送下个请求。 同步是指一个线程要等待上一个线程执行完之后才开始执行当前的线程。 异步是指一个线程开始执行,它的下一个线程不必等待它执行完成就可以开始执行。 阻塞和非阻塞 阻塞和非阻塞关注的是程序在等待调用结果时的状态。 当一个进程或线程被执行,他的下一个进程或线程需要等待它执行完成才能被执行,此时他的下一个进程或线程处于阻塞态。 阻塞和同步是描述一致的,只是关注点不同,同步是关注发送方和接收方的传递,阻塞是关注发送方和接收方传递的过程 我们去火车站人工购票时需要排序购票,当我们前面有其他人在进行排队或购票时我们要等待,此时可以说我们是处于阻塞态,这种购票方式可以认为是同步。 如果是网络购票,我们无需考虑前面是否有人,直接在购票即可,这是一种异步行为,这个过程是非阻塞状态。 并行和并发 并行:两个或者多个事件在同一时刻发生。 并发:两个或多个事件在同一时间间隔内发生。 通俗的说并行是指两个或多个任务同时执行,多线程是并行的;并发是两个或多个任务进行交替执行,某一时间段内只有一个任务在执行,协程是并发的。 协作式多任务和抢占式多任务 协程是协作式多任务的,而线程典型是抢占式多任务的 线程 线程(thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 👉Python 标准库之 threading (线程并行) 正文 协程 协程(coroutine)是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。 协程通过 async/await 语法进行声明 声明一个协程函数: async def f1(): pass 运行协程: 直接调用不会执行协程,标准库 asyncio 提供了相关功能 asyncio 有三种方式执行协程 通过 asyncio.run() 运行一个作为入口的协程函数 import asyncio async def f1(): print("hello") asyncio.run(f1()) 在线程函数种通过 await 运行一个协程函数 import asyncio async def f2(): print("f2") async def f1(): print("f1") await f2() asyncio....

2020-03-03 · 2 min · Jairo

Python 标准库之 threading (线程并行)

@[toc] 示例 返回活跃线程的数量 In [1]: import threading In [2]: threading.active_count() Out[2]: 22 In [3]: len(threading.enumerate()) Out[3]: 22 返回活跃线程列表 In [1]: import threading In [2]: threading.enumerate() Out[2: [<_MainThread(MainThread, started 3744)>, <HistorySavingThread(IPythonHistorySavingThread, started 9356)>, <Thread(ThreadPoolExecutor-0_0, started daemon 6552)>, <Thread(ThreadPoolExecutor-0_1, started daemon 9492)>, <Thread(ThreadPoolExecutor-0_2, started daemon 8740)>, <Thread(ThreadPoolExecutor-0_3, started daemon 4128)>, <Thread(ThreadPoolExecutor-0_4, started daemon 288)>, <Thread(ThreadPoolExecutor-0_5, started daemon 2804)>, <Thread(ThreadPoolExecutor-0_6, started daemon 5848)>, <Thread(ThreadPoolExecutor-0_7, started daemon 9608)>, <Thread(ThreadPoolExecutor-0_8, started daemon 6348)>, <Thread(ThreadPoolExecutor-0_9, started daemon 7156)>, <Thread(ThreadPoolExecutor-0_10, started daemon 4268)>, <Thread(ThreadPoolExecutor-0_11, started daemon 7364)>, <Thread(ThreadPoolExecutor-0_12, started daemon 7532)>, <Thread(ThreadPoolExecutor-0_13, started daemon 5888)>, <Thread(ThreadPoolExecutor-0_14, started daemon 364)>, <Thread(ThreadPoolExecutor-0_15, started daemon 5816)>, <Thread(ThreadPoolExecutor-0_16, started daemon 9636)>, <Thread(ThreadPoolExecutor-0_17, started daemon 6756)>, <Thread(ThreadPoolExecutor-0_18, started daemon 10080)>, <Thread(ThreadPoolExecutor-0_19, started daemon 7264)>] 创建一个线程 In [1]: import threading In [2]: thread = threading....

2020-03-03 · 3 min · Jairo

Linux MySQL 安装与远程访问 (最快捷的方法)

info Linux版本:Ubuntu 19.10 更换镜像源 备份 cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 设置为华为镜像源 sed -i "s@http://.*archive.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list sed -i "s@http://.*security.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list 执行 sudo apt update 更新索引 安装MySql sudo apt install mysql-server 登录报错:Access denied for user ‘root’@‘localhost’ : 安装完成后默认非root用户不能用 mysql -u root -p 登录MySQL 配置 MySql 切换到 root 用户模型下 sudo su 使用 root用户登录MySql mysql -u root -p `` 创建新用户 use mysql; ``...

2020-03-03 · 1 min · Jairo

Python 标准库之 re (正则表达式操作)

re 库的两种对象 Pattern :正则表达式对象 Match :匹配对象 常用内容 search 匹配字符串的第一个位置 In [1]: import re In [2]: s = "I am a simple string" In [3]: r = re.search("am", s) In [4]: r Out[4]: <re.Match object; span=(2, 4), match='am'> In [5]: r.span() Out[5]: (2, 4) In [7]: r.group() Out[7]: 'am' match 从字符串开始的位置匹配 In [1]: import re In [2]: s = "I am a simple string" In [3]: r = re.match("I", s) In [4]: r Out[4]: <re....

2020-03-03 · 3 min · Jairo

简析Python深拷贝和浅拷贝

简介 Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (Bindings) 关系。 示例: In [1]: a = [1, 2, 3] In [2]: b = a In [3]: a Out[3]: [1, 2, 3] In [4]: b Out[4]: [1, 2, 3] In [5]: id(a) Out[5]: 87660264 In [6]: id(b) Out[6]: 87660264 变量 a 与 b id 相同,也就说明他们指向同一地址,b 重复的引用了 a 指向的这个对象。 了解一下 Python 对象分为可变对象和不可变对象。可变对象是指,对象的内容是可变的。而不可变的对象则相反,表示其内容不可变。其区分可变对象与不可变对象其实就是通过对象是否可哈希来区分的。不可变对象是可哈希类型,可变对象是不可哈希类型。 In [1]: hash(1) Out[1]: 1 In [2]: hash(1.5) Out[2]: 1073741825 In [3]: hash(True) Out[3]: 1 In [4]: hash("123") Out[4]: 2090756218 In [5]: hash((1,2,3)) Out[5]: -2022708474 In [6]: hash([1,2,3]) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-35e31e935e9e> in <module> ----> 1 hash([1,2,3]) TypeError: unhashable type: 'list' In [7]: hash({1,2,3}) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-7-d5ba4eb1a90a> in <module> ----> 1 hash({1,2,3}) TypeError: unhashable type: 'set' In [8]: hash({"A": 1}) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-8-3d5562cfa16c> in <module> ----> 1 hash({"A": 1}) TypeError: unhashable type: 'dict' 内置类型不可变对象包括:...

2020-02-02 · 2 min · Jairo