程序员工具分享-转载

程序员

分享一些我常用的提升开发效率的工具:

AI工具

GitHub Copilot:能极大的提高效率,不仅能在编辑器中根据代码上下文自动编写代码,还能以ChatGPT对话的方式回答问题。有了它,极大的降低了对StackOverflow的依赖。

ChatGPT:虽然GitHub Copilot以及能在写代码方面平替ChatGPT,但ChatGPT的GPT4 V的识图功能、DALL E3的绘图功能、移动端的语音对话功能都是GitHub Copilot无法替代的。用ChatGPT绘图或练英语还是很方便的。

redis介绍

Redis是一个开源的内存数据存储解决方案,它可以用作缓存、数据库和消息代理。以下是它的主要特点和原理:

  • 内存存储:将所有数据存储在内存中,以实现快速读写访问。同时,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合

shade打包后对于META-INF/services数据丢失

GeoTools 中的 ReferencingFactoryFinder 类用于查找和获取 CRS(坐标参考系统)工厂类实例,其主要查找路径和实现机制如下:

  1. 它会查找所有 META-INF/services/目录下名为 org.opengis.referencing.Factory 的文件。

thymeleaf渲染

解决Thymeleaf模板引擎中的自定义属性和XML命名空间问题

Thymeleaf是一个流行的模板引擎,常用于生成HTML页面。在使用Thymeleaf时,我们可能会遇到自定义属性和XML命名空间的问题。这篇文章将介绍如何使用Thymeleaf来解决这些问题,并提供了一些实际示例。

前情介绍

在使用Thymeleaf时,有两个常见问题需要解决:

modelmap的使用和部分配置介绍

ModelMapper 是一个智能的Java对象映射库,它提供了一种方便高效的方式来映射不同模型之间的对象,使得在不同模型之间转换数据变得更加容易。

使用ModelMapper,开发者可以使用简单直观的API定义对象之间的映射关系。它支持不同属性名称或类型之间的映射,使用自定义转换器处理复杂映射,甚至可以映射嵌套对象。

ModelMapper 的一个关键特点是它能够根据属性的名称和类型智能地确定如何进行映射,这消除了开发者为每个属性编写手动映射代码的需求,节省了时间和精力。ModelMapper 还提供了条件映射等高级功能,允许开发者定义属性何时应该映射或不映射的规则。

使用Lettuce客户端或者redis连接变化时的触发事件

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
39
40
41
42
43
44
45
46

@Configuration
@EnableCaching
public class CacheConfig {

@Bean
public RedisConnectionFactory redisConnectionFactory() {

RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName("127.0.0.1");
config.setPort(11);
config.setPassword("root");

return new LettuceConnectionFactory(config);
}

@Primary
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();

template.setConnectionFactory(factory);

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);

template.setHashKeySerializer(stringRedisSerializer);

GenericJackson2JsonRedisSerializer redisSerializer = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(redisSerializer);

template.setHashValueSerializer(redisSerializer);
return template;

}

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer())).disableCachingNullValues();

return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();
}
}

Windows下bat脚本文件编写

先给个实例来表示 使用杀死 指定端口

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
39
40
41
42
43
44
@echo off
set default_port=8080
set /p port=type need killed port (press enter for default port %default_port%): %=%
if "%port%"=="" set "port=%default_port%"
rem set /p port=type need killed port:

for /f "tokens=5 delims= " %%a IN ('netstat -a -n -o ^| findstr :%port%.*LISTENING') do (
set pid=%%a
)
if not defined pid (
echo not found port %port%
) else (
taskkill /F /pid %pid%
echo already kill %port%
)


set /p port=type need killed port:
for /f "tokens=5 delims= " %%a IN ('netstat -a -n -o ^| findstr :%port%.*LISTENING') do (
set pid=%%a
)
if not defined pid (
echo not found port %port%
) else (
taskkill /F /pid %pid%
echo already kill %port%
)



set /p port=type need killed port:
for /f "tokens=5 delims= " %%a IN ('netstat -a -n -o ^| findstr :%port%.*LISTENING') do (
set pid=%%a
)
if not defined pid (
echo not found port %port%
) else (
taskkill /F /pid %pid%
echo already kill %port%
)


pause