Latest

容器环境中的几种文件系统

Docker 的存储驱动是容器文件系统的关键组成部分,决定了容器镜像和数据的存储方式。以下是常见的存储驱动及其优缺点: 1. OverlayFS/Overlay2 简介: Overlay 是现代 Linux 文件系统中一种高效的联合文件系统,Overlay2 是其改进版本,是 Docker 的默认驱动。 Overlay文件系统允许将两个或多个文件系统的内容合并呈现给用户。这种技术常用于容器技术,比如Docker和Kubernetes,以实现文件系统的层叠。Overlay文件系统通过将一个文件系统层“覆盖”在另一个文件系统层之上,使得两个文件系统看起来像是一个统一的文件系统。 优点: * 性能好:特别是在现代 Linux 系统上,Overlay2 的写入和读取性能优于 Overlay。 * 资源利用率高:只在需要时合并文件,减少了存储和 I/O 开销。 * 镜像层管理简单:支持更深的层数,适合大多数工作负载。 * 社区支持:得到 Docker 官方的推荐和持续优化。 缺点: * 内核依赖:需要 Linux

从Debian bookworm升级到Debian trixie后,podman使用中出现`User-selected graph driver "overlay" overwritten by graph driver "vfs" from database`的解决办法

执行podman命令时,出现一条警告: podman ps ERRO[0000] User-selected graph driver "overlay" overwritten by graph driver "vfs" from database - delete libpod local files ("/home/nalan/.local/share/containers/storage") to resolve. May prevent use of images created by other tools CONTAINER ID IMAGE COMMAND CREATED

Ghost 6.0缺陷重重

不知道Ghost团队是如何考虑的,她们将许多JS和CSS文件外包给jsdelivr。但jsdelivr的访问是时好时坏的。因此这个外包的文件通常都无法访问,导致功能异常。 因上述原因,搜索、注册框无法访问。 因上述原因,管理界面的Networks无法访问。 之前的Explore似乎被取消了。Ghost团队真是随意抛弃功能。 管理界面单独设定了域名后,activitypub接口无法访问。 容器化版本的Ghost(Docker Hub),似乎没有办法固定到指定的版本使用。无论是测试还是日常使用,都非常不便。只能使用最新版本。而最新版本问题多多。 正在考虑停止使用Ghost。

在Debian trixie中升级PostgreSQL 15到PostgreSQL 17

首先,升级Debian bookworm到Debian trixie。 升级后,不要急。不要急着清理(purge)旧的软件包。待升级PostgreSQL 15到PostgreSQL 17后,再清理旧的postgresql-15软件包。 如果你和我一样,已经将postgresql-15软件包清理了,则需要先安装postgresql-15软件包。当然,Debian trixie已经不再提供postgres-15软件包了,所以需要从第三方处安装。 如果已经将postgresql-15包清理了,执行下列脚本: /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh 该脚本将Postgreql官方提供的(而不是Debian项目提供的)仓库加入软件源中。 再更新软件源。 apt update 再安装postgresql-15软件包。 apt install postgresql-15 执行postgresql数据的更新。 查看先有的数据库集群: pg_lscluster 升级数据库集群: pg_upgradeclu

Debian 12到Debian 13的升级(Debian bookworm到Debian trixie的升级)

Debian 12代号:bookworm Debian 13代号:trixie 从Debian 12升级到Debian 13,是主要改动,有大量的破坏性更新。因此升级需要小心谨慎。 首先需要确定CPU架构,Debian 13支持以下CPU架构: * 64-bit PC (amd64) * 64-bit ARM (arm64) * ARM EABI (armel) * ARMv7 (EABI hard-float ABI, armhf) * 64-bit little-endian PowerPC (ppc64el) * 64-bit little-endian RISC-V (riscv64) * IBM System z (s390x) 此外,在64位的PC机器上,部分用户空间的32位程序(i386)是可用的。但整体而言,不支持i386架构的机器。因此,i386架构的机器不应该升级到Debian

podman主机和容器间文件的复制

使用容器时,在主机和容器直接复制文件是常见的需求。本文简述这一流程的操作过程。 podman cp命令被用于主机和容器之间的文件复制。可以复制目录,也可以复制文件。使用podman cp命令,可以将文件从容器复制到主机,也可以将文件从主机复制到容器,还可以在两个容器之间复制文件。 将目录从主机复制到容器: podman cp images container-id:/my_app/images 这个命令会将images目录下的文件和目录复制到容器中的目标文件夹下。 将文件从主机复制到容器: podman cp images/girl.png container-id:/my_app/images 这个命令会将这个文件复制到容器中的目标文件夹下。 podman cp container-id:/my_app/images ./images 将目录从容器复制到主机: podman cp container-id:/my_app/images/girl.png ./images 这个命令会将容器中的指定目录中的文件复制到主机的目标目录下。

为Java项目配备Maven腾讯云镜像,以加速项目依赖的解析和下载

Maven配置文件夹的路径: 全局配置:~/.m2/settings.xml 项目配置:./pom.xml Gradle配置文件夹的路径: 全局配置:~/.gradle/init.gradle 项目配置:./build.gradle 全局配置和项目配置根据实际情况配置即可。一般情况下,选择项目配置,无需全局配置。 一般的项目管理,会在maven和gradle两者构建工具中选择一个使用,因此仅需要修改一个工具的配置文件。 Maven配置文件需要添加的内容: <mirror> <id>nexus-tencentyun</id> <mirrorOf>*</mirrorOf> <name>Nexus tencentyun</name> <url&

为Gradle Wrapper配备腾讯云镜像,以加速Gradle二进制文件的下载

进入工程目录。 找到wrapper文件夹。这个文件夹通常在gradle/wrapper目录下。 修改gradle wrapper配置文件。用编辑器打开gradle-wrapper.properties文件。 修改distributionUrl。例如: distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.14-bin.zip 修改并检查无误后,之下gradlew命令。 ./graldew Gradle Wrapper这时会使用这里配备的镜像,下载Gradle二进制文件。 其他镜像: Gradle原始发布地址:https://services.gradle.org/distributions/ 腾讯云Gradle镜像:https://mirrors.cloud.tencent.com/gradle/ 阿里云Gradle镜像:https://mirrors.aliyun.com/gradle/ 除了 配备Gradle镜像外,还需要配备Maven仓库镜像,以便项目中的依赖使用。

Java学习笔记之十 继承

继承,inheritance。利用继承,人们可以基于已经存在的类构造一个新类。 继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加新的方法和域。 反射,reflection。反射,指在程序运行期间发现更多的类及其属性的能力。 类、超类、子类 class Manager extends Employee { ... } is-a关系是继承的一个明显特征。 关键字extends表示继承。 在Java中,所有的继承都是公有继承。 关键字extends表明正在构造的新类派生于一个已经存在的类。已存在的类被称为超类,superclass、基类,base class,或父类,parent class。新类被称为子类,subclass,派生类,derived class,或孩子类,child class。 如果需要调用超类的方法,可以使用关键字super。 super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。 在子类中可以增加域、增加方法或覆盖(override)超类的方法。

Java学习笔记之九 对象与类

面向对象程序设计概述 在20世纪70年代,流行“结构化”过程化程序设计开发技术。 在20世纪末,面向对象程序设计成为主流的程序设计范型。 面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 程序中的许多对象来自于标准库,还有一些是自定义的。 是自己构造对象,还是从外界购买对象,完全取决于预算和时间。 从根本上说,只要对象能够满足要求,就不必关心其功能的具体实现过程。 结构化程序设计通过设计一系列的过程(算法)来求解问题。这些过程一旦被确定,就要考虑存储数据的方式。所以,Pascal语言设计者Niklaus Wirth说:算法+数据结构=程序。(他1975年发布的书名)。这里,算法是第一位的,数据结构是第二位的。 面向对象程序设计中,数据被放在了第一位,之后再考虑操作数据的算法。 类(class)是构造对象的模板或者蓝图。由类构造(constuct)对象的过程称为创建类的实例(instance)。 用Java编写的代码都位于某个类的内部。 封装(encapsulation,有时称为数据隐藏)是与对象有关的一个重要概念。对象中的数据称

java学习笔记

Java学习笔记之三十三 括号与运算符级别

运算符有优先级。 如果不使用圆括号,则按运算符优先级次序进行计算。 除了右结合运算符外,同一个级别的运算符按从左到右的次序进行计算。 Java不使用逗号运算符,但在for语句中,可以使用逗号分隔表达式列表。 运算符 结合性 [ ] . ( ) (方法调用) 从左向右 ! ~ ++ -- + (一元运算) () (强制类型转换) new 从右向左 */ % 从左向右 + - 从左向右 << >> >>> 从左向右 < <= > >= instanceof 从左向右 == != 从左向右 & 从左向右 ^ 从左向右 | 从左向右 && 从左向右 || 从左向右 ?: 从右向左 = += -= *= /= %= &= |= ^= <<= >>

java学习笔记

Java学习笔记之三十二 强制类型转换

在Java中,允许没有信息丢失的数值类型的转换。 有时候,需要将double类型转换为int类型。这种情况可能会丢失一些信息。这种转换需要通过强制类型转换来实现。 强制类型转换:cast。 强制类型转换的语法是在圆括号中给出想要转换到的目标类型,后面紧跟带待转换的变量名。 例如: double x = 9.997; int nx = (int)x; // x is 9 强制类型转换通过截断小数部分将浮点数转换为整型。 如果需要对浮点数舍入,则需要用Math.round方法。 double x = 9.997; int nx = (int) Math.round(x); // nx is 10 不要再boolean类型和任何数值类型之间进行强制转换。 极少数情况下,需要将布尔类型转换为数值类型,可以使用条件表达式:b ? 1 : 0。

java学习笔记

Java学习笔记之三十一 数值类型之间的转换

在程序运行时,经常需要将一种数值类型转换为另一种数值类型。 数值类型之间的合法转换: 实线箭头表示无信息丢失的转换。虚线箭头表示可能有精度损失的转换。 在两个数值进行二元计算时,会将两个操作数转换为同一种类型,再行计算。 * 两个操作数,其一为double类型,另一个会转换为double类型。 * 否则,其一为float类型,另一个会转换为float类型。 * 否则,其一为long类型,另一个会转换为long类型。 * 否则,两个操作数都被转换为int类型。

java学习笔记

Java学习笔记之三十 数学函数与常量

Math类包含了各种各样的数学函数。 一些数学函数: * Math.sqrt 平方根 * Math.pow 幂运算 * Math.sin 三角函数 * Math.cos 三角函数 * Math.tan 三角函数 * Math.atan 三角函数 * Math.atan2 三角函数 * Math.exp 指数函数 * Math.log 对数函数。指数函数的反函数。 这些方法都是Math类的静态方法。或者被称为类方法。 一些数学常量 * Math.PI 近似值 * Math.E 近似值 这些变量时Math类的静态变量。或者被称为类变量。 从JDK 5.0开始,不必在数学方法名和常量前面添加前缀Math.。只要在源文件顶部导入Math类即可。 import static java.lang.

java学习笔记

Java学习笔记之二十八 关系运算符和boolean运算符

关系运算符用来表示相等、不等、小于、大于、小于等于、大于等于。 关系运算符: * == * != * < * > * <= * >= boolean运算符。逻辑运算符。 * && 逻辑与。 * || 逻辑或。 * ! 逻辑非。 && 和 || 安装短路方式求值。 三元操作符。 * ?: condition ? expression1 : expression2 当条件condition为真时,计算第1个表达式,否则计算第2个表达式。

java学习笔记

Java学习笔记之二十七 自增运算符和自减运算符

对数值变量进行加一和减一的运算。 这两个运算符改变了变量的值,因此它的操作数不能是数值。 这两个运算符有两种形式:前缀形式和后缀形式。 前缀形式将运算符放在操作数的前面。++n 后缀形式将运算符放在操作数的后面。n++ 在表达式中,前缀方式先进行+1运算,后缀方式使用变量原来的值。 不要再其他表达式内部使用++,会造成误解和困惑。 int m = 7; int n = 7; int a = 2 * ++m; // now m is 8, a is 16 int b = 2 * n++; // now n is 8, b is 14

java学习笔记

Java学习笔记之二十六 浮点数算术精度问题

在Java中,double类型的数值采用64位存储。 在一些处理器中,使用80位的浮点寄存器。 这些寄存器增加了中间过程的计算精度。 这样导致的一个结果是,与一些64位浮点寄存器的机器的计算结果不同。 默认情况下,Java虚拟机设计者允许对中间计算结果采用扩展的精度。 对使用strictfp关键字标记的方法,必须使用严格的浮点计算。 如果将一个类标记位strictfp,则这个类中的所有方法都要执行严格的浮点计算。 实际的计算方式,依然取决于处理器。

java学习笔记

Java学习笔记之二十三 浮点类型

浮点类型用于表示有小数部分的数值。 Java中有两种浮点类型。 类型 存储需求 取值范围 float 4字节 大约 +-3.402 823 47E + 38F(有效位数为6 ~ 7位) double 8字节 大约 +-1.797 693 134 862 315 70E + 308(有效位数为15位) 大多数情况下,应用程序都采用double类型。 float类型有一个后缀F。 没有后缀F的浮点数值默认为dobule类型。 可以在浮点数值后面加D,表示double类型。 所有浮点数值的计算都遵循IEEE 754规范。 3个特殊的浮点数值: * 正无穷大 * 负无穷大 * NaN(不是一个数字) 浮点数值不适用于禁止出现舍入误差的金融计算中。 如果需要在数值计算中不含有任何舍入误差,应该使用BigDecimal类。这是一个类,不是基本数据类型。

java学习笔记

Java学习笔记之二十二 整型

整型用于表示没有小数部分的数值。 整型允许负数。 Java提供了4种整型。 类型 存储需求 取值范围 int 4字节 -2 147 483 648 ~ 2 147 483 647(正好超过20亿) short 2字节 -32 768 ~ 32 767 long 8字节 -9 223 373 036 854 775 808 ~ 9 223 372 036 854 775 807 byte 1字节 -128 ~ 127 int类型最常用。 使用哪种类型,根据具体要表示的数值大小和场合来定。 在Java中,整型的范围和运行Java代码的机器无关。所以,不同平台的机器,