HomeLab:中年男人的快乐源泉
未读
增加 KVM 虚拟机磁盘容量在 KVM 中扩展虚拟机磁盘容量分为两步:扩展虚拟磁盘文件 和 扩展虚拟机内的分区和文件系统。
第一步:扩展虚拟磁盘文件1. 确认虚拟磁盘文件路径使用以下命令查找虚拟机磁盘文件的位置:
1virsh domblklist <虚拟机名称>
示例输出:
123Target Source------------------------------------------------vda /var/lib/libvirt/images/vm-disk.qcow2
记下磁盘文件路径(例如 /var/lib/libvirt/images/vm-disk.qcow2)。
2. 扩展磁盘文件假设需要将磁盘扩展为 50 GB,根据磁盘格式选择以下命令:
QCOW2 格式磁盘扩展
1qemu-img resize /var/lib/libvirt/images/vm-disk.qcow2 50G
RAW 格式磁盘扩展
1qemu-img resize /var/lib/libv ...
AI:人工智能
未读使用 vuepress 搭建自己的博客
Vuepress 介绍官网: https://vuepress.vuejs.org/
类似 hexo 一个极简的静态网站生成器, 用来写技术文档不能在爽. 当然搭建成博客也不成问题.
Vuepress 特点
响应式, 也可以自定义主题与 hexo 类似
内置 markdown (还增加了一些扩展), 并且可以在其使用 Vue 组件
Google Analytics 集成
PWA 自动生成 Service Worker
快速上手安装初始化项目
12yarn init -y# 或者 npm init -y
安装 vuepress
12yarn add -D vuepress# 或者 npm install -D vuepress
全局安装 vuepress
12yarn global add vuepress# 或者 npm install -g vuepress
新建一个 docs 文件夹
1mkdir docs
设置下 package.json
123456{ "scripts": { ...
zuihou-admin-cloud基于 SpringCloud(Hoxton.SR1) + SpringBoot(2.2.2.RELEASE) 的 SaaS 型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、Xss 防跨站攻击、自动代码生成、多存储系统、分布式事务、分布式定时任务等多个模块,支持多业务系统并行开发, 支持多服务并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,非常适合学习使用。核心技术采用 Nacos、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Seata、Nacos、Sentinel、 RabbitMQ、FastDFS 等主要框架和中间件。
希望能努力打造一套从 SaaS基础框架 - 分布式微服务架构 - 持续集成 - 系统监测 的解决方案。本项目旨在实现基础能力,不涉及具体业务。
部署方面,可以采用以下 4 种方式,并会陆续公布 jenkins 集合以下 3 种部署方式的脚本和配置文件:
IDEA 启动
jar 部署
docker 部署
k8s 部署
租户后台 和 开发 ...
1. 概述这篇文章将阐述怎么在 Spring 中使用 Profile
从 Spring 3.1 开始,我们能够将 bean 映射到不同的 profile 上,如 dev, test, prod 等。
我们也能够根据环境 (environment) 来激活不同的 profile,从而加载我们需要的 bean。
2. 在 Bean 上使用 @Profile我们先从简单的例子开始,看看怎么把 bean 绑定到不同的 profile 上。
使用 @Profile 注解,我们可以将 bean 绑定到指定的 profile 上。这个注解支持绑定一个或多个 profile。
试想这样一个场景:我们有一个 bean,只在开发环境需要,线上环境不需要。那么我们可以通过注解将这个 bean 绑定到 dev profile 上。这样,这个 bean 只会存在于开发环境,而在其他环境中不会被加载。如下所示:
1234@Component@Profile("dev")public class DevDatasourceConfig
上面的写法是指绑定 bean 到 dev pr ...
互联网是基于 HTTP 协议构建的,而 HTTP 协议因为简单流行开来,但是 HTTP 协议是无状态(通信层面上虚电路比数据报昂贵太多)的,为此人们为了追踪用户想出了各种办法,包括 cookie/session 机制、token、flash 跨浏览器 cookie 甚至浏览器指纹等。
[
把用户身份藏在每一个地方(浏览器指纹技术甚至不需要存储介质)
讲使用 spring security 等具体技术的资料已经很多了,这篇文章不打算写框架和代码的具体实现。我们会讨论认证和授权的区别,然后会介绍一些被业界广泛采用的技术,最后会聊聊怎么为 API 构建选择合适的认证方式。
认证、授权、凭证首先,认证和授权是两个不同的概念,为了让我们的 API 更加安全和具有清晰的设计,理解认证和授权的不同就非常有必要了,它们在英文中也是不同的单词。
[
认证是 authentication,指的是当前用户的身份,当用户登陆过后系统便能追踪到他的身份做出符合相应业务逻辑的操作。即使用户没有登录,大多数系统也会追踪他的身份,只是当做来宾或者匿名用户来处理。认证技术解决的是 “我是谁?” 的问题。
授权 ...
新时代码农
未读Maven 相关问题
由于未统一管理多个模块的 jar 依赖, 每个模块都各自为政;模块之间的配置相互拷贝, 有用的没用的都拷了;升级版本麻烦, 每个相关模块都得改版本.
1. 重复的依赖
redis-cache 模块的 pom.xml
2. 重复的插件
mamagesystem 模块的 pom.xml
3. 依赖冲突
mamagesystem 模块的 pom.xml
4. 重复的配置
导致的问题有可能导致出现以下几种异常:
java.lang.ClassNotFoundException
java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError
解决方案
所有模块使用一个父模块来管理将重复配置迁移到 parent pom.xml 中;使用 dependencyManagement 来统一管理 jar 依赖;使用 pluginManagement 统一管理插件依赖;所有 jar 依赖的版本全部使用 properties 管理;使用 excludes 排除冲突的 jar 包;
代码问题1. 代码不规范
格式 ...
缓存服务组件
依赖于:
jedis
spring-data-redis
spring-session-data-redis
redis 集群使用的是 ShardedJedisPool, redis 3.x 后自带集群负载
jar 中重要的类
JedisConnectionFactory用于获取 jedis 实例,从而操作 redis
ShardedJedisPool用于连接 redis 集群
cache 重要的类
RedisDataSource使用 JedisConnectionFactory 从 ShardedJedisPool 连接池中获取 jedis
RedisClientTemplate依赖 RedisDataSource 操作 redis 的具体模板方法
RedisCacheServiceImpl对 RedisClientTemplate 再次封装
JedisPool(非切片链接池) 和 ShardedJedisPool(切片链接池) 有什么区别JedisPool 连一台 Redis,ShardedJedisPool 连 Redis 集群,通过一致性哈希算法 ...
新时代码农
未读JDK5 新特性Java5 开发代号为 Tiger(老虎),于 2004-09-30 发行
1、泛型所谓类型擦除指的就是 Java 源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为 Object 类型,并在实际使用时强制转换为指定的目标数据类型。而 C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。
1Map<Integer, Integer> squares = new HashMap<Integer, Integer>();
通配符类型:避免 unchecked 警告,问号表示任何类型都可以接受
12345public void printList(List<?> list, PrintStream out) throws IOException { for (Iterator<?> i = list.iterator(); i.hasNext(); ) & ...
IDEA Plugin API
文件操作Virtual File SystemVirtual File System 是处理文件的一套机制, 用于处理如何加载文件, 如果保存文件, 当文件变化时如何更新缓存等.
IntelliJ Platform 将操作文件封装成了 Virtual File System, 提供了以下几点主要功能:
封装处理文件的通用 API, 不论文件在磁盘, 存档, HTTP 服务器或者其他地方, 都使用同一套 API;
提供快照功能, 能跟踪文件的修改;
提供将附加持久数据与 VFS 中的文件相关联;
为了提供最后两个功能,VFS 管理用户硬盘的某些内容的持久快照。快照仅存储通过 VFS API 至少请求过一次的文件,并且异步更新以匹配磁盘上发生的更改。
快照是应用程序级别,而不是项目级别 - 因此,如果某个文件(例如,JDK 中的某个类)被多个项目引用,则其内容的一个副本将存储在 VFS 中。
所有 VFS 访问操作都通过快照。
如果通过 VFS API请求某些信息但快照中没有这些信息,则会从磁盘加载并存储到快照中。如果快照中有可用信息,则返回快照数据。仅 ...
IDEA Plugin 配置持久化
持久化与设置面板上传到 Aliyun OSS 需要几个参数:
endpoint
accessKeyId
accessKeySecret
bucketName
filedir (此参数可不填)
本章节将介绍怎样创建设置面板和持久化配置
设置面板直接使用 IDEA 自带的 GUI 插件来画图, 需要开启 UI Designer 插件
持久化 PersistentStateComponent
介绍 IDEA Plugin 开发入口
接下的文档都会根据前一篇的需求来找到解决方案, 对于不熟悉 IDEA 插件开发的同学 (说的就是我), 可能一时找不到各个公共的入口, 这个是否就要看一些开源的插件,从中找到功能入口.
右键菜单入口需求中提到 「在编辑视图中直接右键 –> upload to Aliyun OSS」
因此我们需要扩展右键菜单, 来添加我们自己的功能入口.
现在介绍一种新的添加 AnAction 的方式:
这么多 Group. 好了, 懵逼了….
那么我们怎么来找我们需要的 Group 呢?我这里用个笨办法, 看别人的插件配置呗, 这里通过看 Alibaba Java Coding Guidelines 这个插件的配置, 可以确定的有:
MainToolBar
ProjectViewPopupMenu
ChangesViewPopupMenu
EditorPopupMenu
先来第一个, 在编辑器右键菜单中添加我们的 action, 很明显是用 EditorPopupMenu
1234567891011121314151617<action id ...
插件需求分析
先来梳理下需求:
开发一款插件将 Markdown 文档中的图片上传到 Aliyun OSS.
具体需求入下:
上传需求解析所有 ![]() 图片标签:
如果图片在本地, 则上传到 Aliyun OSS;
如果以 http:// 或者 https:// 开头, 则根据设置判断是否上传 (迁移图片到 Aliyun OSS)
上传完成后:
根据设置将 ![](./03161253/xxx) 标签转换成 <a data-fancybox title="" href="http://xxxx" >![](./03161253/xxx)</a> 标签
这里有 2 个设置:
是否转换为 <a> 标签:
如果开启, 在判断是否显示大图 (这个主要针对 vuepress 构建的博客)
1<a data-fancybox title="" href="http://xxxx">![](http://xxxx)</a>
且要修改 c ...
这篇大致介绍一下 IDEA 插件的几种类型
插件的主要类型IntelliJ IDEA 的强大之一就是有一个易于扩展的插件系统, 所有插件都可在 JetBrains 插件库 找到.
最常见的插件类型包括:
自定义语言支持
框架集成
工具集成
用户界面附加组件
自定义语言支持自定义语言支持提供了使用特定编程语言的基本功能, 包括:
文件类型识别
词汇分析
语法突出显示
格式化
代码洞察和代码完成
检查和快速修复
意图行动
框架集成框架集成包括改进的代码洞察功能, 这些功能对于给定的框架是典型的, 以及直接从 IDE 使用框架特定功能的选项. 有时它还包括自定义语法或 DSL 的语言支持元素.
具体的代码见解
直接访问特定于框架的功能
工具集成通过工具集成, 可以直接从 IDE 操作第三方工具和组件, 而无需切换上下文.
比如:
实施其他行动
相关的 UI 组件
访问外部资源
用户界面附加组件此类别中的插件会对 IDE 的标准用户界面应用各种更改.一些新添加的组件是交互式的并提供新功能, 而其他组件仅限于视觉修改. 所述 背景图像 的插件可以作为一个例子.
👉 推荐一款 ...
查看 IDEA Plugin 开发日志
上一节已经说过, IntelliJ IDEA SDK 中已经有了日志框架, 用于输出日志, 但是在哪里看日志呢.
我们可以这样查看:
最终我们知道 idea.log 会在 .sandbox/system/log/idea.log.
然后我们可以通过 Grep Console 这个插件的 Tail File in Console 或者 Tail Current File in Console 来实时查看日志.
然后我们会发现所有的日志等级都是 INFO, 在我们调试的时候 DEBUG 日志看不到, 如果全部设置成 INFO 级别调试的时候很方便, 但是大量打印日志有性能损耗,因此我们需要将日志等级降低, 又能打印到文件中.
你可以这样设置:
说明已经写得很详细了, 按照上面的来, 然后将调试日志等级设置为 TRACE 即可看见日志.
其他你也可以直接修改下面这个文件
[👉 扩展阅读 - 怎么将老的 plugin 项目转换成 gradle 项目]
由于官方开发文档写得很烂, 有多东西都没有写到, 所有我们只有看别人的代码来了解未知的 AP ...