普通视图

发现新文章,点击刷新页面。
昨天以前程序猿DD

2.1K Star,一个帮你自动完成JavaDoc注释的IDEA插件

作者 翟永超
2023年9月4日 01:30

大家好,我是TJ!有段时间没给大家推荐好用工具了,主要是最近工作摸鱼太厉害了,所以也没去探索和接触新东西。

前几天,TJ被领导喷了,原因是代码里注释太少,导致写的SDK在生成JavaDoc文档的时候,有价值的说明内容太少,以后维护不方便。于是马上着实去优化这个是,现在是AI时代了,肯定不能死做,第一反应就是去找找看是否有直接可以用的工具。

于是,我找到了这么个IDEA插件:Easy Javadoc

大家有需要的可以直接打开IDEA,在plugins市场里搜索,就能获得。

在安装完插件之后,您只需要记住下面这些快捷键,然后就可以去代码里自动生成了:

下面跟着动图演示,来体验一下该插件快速生成JavaDoc的能力:

可以看到,它的主要功能就是根据函数名称、参数名称等代码层面的信息,通过翻译,自动生成相关的中文注释。所以,虽然有插件的辅助,但开发者还是要有良好的编码习惯,写能让人看得懂的参数定义、方法定义。这样,后续的其他自动化生成工具就都能完美的用上,来提高我们的工作效率了。

由于该插件会用到翻译功能,所以各位用户还要去选择和配置一下你需要使用的翻译API,每个供应商每月都有免费额度,对于个人来说,都足够使用了,下面是主流的一些翻译API,需要的可以自取:

好了,今天的分享就到这里,感兴趣的可以根据下面相关链接了解更多内容:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

Java 21 新特性:String Templates(字符串模版)

作者 翟永超
2023年9月2日 05:07

在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织。也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种:

  • 使用+拼接
  • 使用StringBufferSpringBuilder
  • String::format and String::formatted
  • 使用java.text.MessageFormat

下面,我们一起来学习一下Java 21中的新方案!如果您对于上面这些还不熟悉的话,建议可以先看一下这篇《Java自带的4种字符串组织和格式化方法》,了解以前的机制,这样与最新的处理方案做对比,理解会更深刻。

模版表达式

在Java 21中处理字符串的新方法称为:Template Expressions,即:模版表达式。

模版表达式是Java语言中的一种新表达式。它可以执行字符串插值,帮助开发人员通过编程的方式安全高效地组织字符串。此外,模板表达式不仅仅可以用于组织字符串,它还可以根据特定模型的规则将结构化文本转换为任何类型的对象。

下面通过一个简单的案例来认识一下它:

String blog = "blog.didispace.com";
String str = STR."My blog is \{blog}";

上述代码中的第2行就是一个模版表达式,其中主要包含三个部分:

  • 模版处理器:STR
  • 包含内嵌表达式(\{blog})的模版
  • 通过.把前面两部分组合起来,形式上类似方法调用

当模版表达式运行的时候,模版处理器会将模版内容与内嵌表达式的值组合起来,生成结果,所以上面案例中的字符串str在运行时的结果为:My blog is blog.didispace.com

多行模版表达式

还记得之前我们的Java新特性专栏中,介绍过Java 15中的文本块特性吗?类似下面这样的写法:

String html = """
<html>
<body>
<h1>Java 15 新特性:文本块 | 程序猿DD</h1>
<p>didispace.com</p>
</body>
</html>
""";

模版表达式也支持类似的多行字符串处理,所以开发者可以用它来方便的组织html、json、xml等字符串内容,比如下面这样:

var json = STR."""
{
"user": "\{name}",
"age: \{age}
}
""";

STR模版处理器

上面案例中我们所用的STR模版处理器中的内嵌表达式都采用了字符串内容,而实际上STR模版处理器还有更多的用途。

  1. 内嵌表达式中还可以之前数学运算,比如:
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

最终s字符串结果为:10 + 20 = 30

  1. 内嵌表达式中还可以调用方法,比如:
String s = STR."My blog is \{getMyBlog()}";

假设getMyBlog方法返回的内容为blog.didispace.com,那么最终s字符串结果为:My blog is blog.didispace.com

  1. 内嵌表达式中还可以访问对象的成员变量,比如:
User u = new User("didi", "blog.didispace.com"); // 构造函数参数为name属性和blog属性
String s = STR."\{u.name}的博客地地址为:+ \{u.blog}";

最终s字符串结果为:didi的博客地址为:blog.didispace.com

FMT模版处理器

除了STR模版处理器之外,Java中还提供了另外一个模版处理器:FMT。FMT模版处理器除了与STR模版处理器一样提供插值能力之外,还提供了左侧的格式化处理。下面通过例子来直接理解FMT的功能:

record Rectangle(String name, double width, double height) {
double area() {
return width * height;
}
}
Rectangle[] zone = new Rectangle[] {
new Rectangle("Alfa", 17.8, 31.4),
new Rectangle("Bravo", 9.6, 12.4),
new Rectangle("Charlie", 7.1, 11.23),
};
String table = STR."""
Description Width Height Area
\{zone[0].name} \{zone[0].width} \{zone[0].height} \{zone[0].area()}
\{zone[1].name} \{zone[1].width} \{zone[1].height} \{zone[1].area()}
\{zone[2].name} \{zone[2].width} \{zone[2].height} \{zone[2].area()}
Total \{zone[0].area() + zone[1].area() + zone[2].area()}
""";

上面这块是由STR模版处理器组织字符串表格数据,从模版表达式来看是非常整齐的,但是由于模版中内嵌表达式的值长短不一,最终输出结果很有可能差强人意,比如STR模版处理器处理后的结果是这样的:

Description  Width  Height  Area
Alfa 17.8 31.4 558.92
Bravo 9.6 12.4 119.03999999999999
Charlie 7.1 11.23 79.733
Total 757.693

为了解决这个问题,就可以采用FMT模版处理器,在每一列左侧定义格式

String table = FMT."""
Description Width Height Area
%-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()}
%-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()}
%-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()}
\{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
""";

这样的结果将是如下这样,获得一个整齐的结果:

Description     Width    Height     Area
Alfa 17.80 31.40 558.92
Bravo 9.60 12.40 119.04
Charlie 7.10 11.23 79.73
Total 757.69

关于Java 21中推出的String Templates特性还有很多高级能力,比如:自定义模版处理器等。因为该特性还处于Preview阶段,所以DD也还没有深入研究,仅尝鲜了一下基本功能,如果您对其他高级能力感兴趣,也可以通过官网学习。等该功能正式发布之后,我会在 Java新特性专栏 中更新解读所有内容,欢迎关注与收藏。

Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法

作者 翟永超
2023年8月17日 17:07

这两天给我们开发的Chrome插件:Youtube中文配音增加了账户注册和登录功能,其中有一步是邮箱验证,所以这边会在Spring Boot后台给用户的邮箱发个验证信息。如果发邮件,之前的文章教程里就有,这里就不说了,着重说说这两天发现所有用Gmail注册的用户都被退件的问题。

报错现象

先来看看具体报错(如果您也碰到这种情况,那么可以看看后面的内容):

退信原因:发件人(youtubedubbing@mail.spring4all.com)域名的DNS记录未设置或设置错误导致对方拒收此邮件。
host gmail-smtp-in.l.google.com[142.251.10.26] said: 550-5.7.26 This mail is unauthenticated, which poses a security risk to the sender and Gmail users, and has been blocked. The sender must authenticate with at least one of SPF or DKIM. For this message, DKIM checks did not pass and SPF check for [mail.spring4all.com] did not pass with ip: [54.204.34.130]. The sender should visit https://support.google.com/mail/answer/81126#authentication for instructions on setting up authentication. k191-20020a636fc8000000b00565bcd33890si6279798pgc.848 - gsmtp (in reply to end of DATA command)
解决方案:请通知你的邮箱管理员为邮箱域名设置正确的DNS(SPF、DKIM、DMARC)记录。详细请见 http://service.exmail.qq.com/cgi-bin/help?subtype=1&&no=1000580&&id=20012

问题分析

从退信原因中Google给的链接内容非常多,大致内容就是Google针对垃圾邮件滥用邮箱等行为做的防护机制。所以,如果您要支持Gmail的话,就必须符合它所制定的身份配置要求,里面包含了:SPF配置、DKIM配置、ARC配置以及DMARC配置。

Google官方提供了一个工具:https://toolbox.googleapps.com/apps/checkmx/,可以用来检测你的一些列配置是否符合要求。您只需要输入你的邮箱域名,就可以看到如下的诊断结果:

那么多警告,显然是要慢慢解决才能不被拒收吧。。。不过那么多配置,是不是一下就晕了?

如果你懒得深入看的话,下面DD就讲一下比较快速的解决不被拒收的配置。

解决方案

不要看有那么多警告和配置内容,其实只需要把SPF配置完成,Gmail的发送就不成问题了。配置方法也很简单,就是在域名解析里加一条记录即可。

Gmail官网也给出了介绍:

但第一次也许你会跟我犯一样的错,就是直接用v=spf1 include:_spf.google.com ~all这个value了。。。其实应该要修改成你所用企业邮箱服务商的spf域名。

比如,DD这边用的是腾讯的企业邮箱,所以值要设置成:v=spf1 include:spf.mail.qq.com ~all。直观的讲,你的域名解析里需要有这样一条TXT记录:

SPF汇总

这边汇总一下,国内比较常用的企业邮箱SPF配置,如果您正好碰到类似问题,可以直接选取使用:

  • 腾讯企业邮箱:v=spf1 include:spf.mail.qq.com ~all
  • 阿里企业邮箱:v=spf1 include:spf.mxhichina.com -all
  • 网易企业邮箱:v=spf1 include:spf.163.com -all

今天的分享就到这里,希望对您有所收获!码字不易,欢迎关注、收藏、分享,支持一下。本文可以任意转载,但请注明原文链接 ^_^

34.9K Star!超受欢迎的开源免费后台模版:tabler

作者 翟永超
2023年8月15日 04:09

大家好,我是TJ

之前给大家推荐过好几款后台模版,都很受欢迎。今天继续再给大家推荐一款非常热门、广受好评的后台模版:tabler

tabler作为一款国外的开源项目,目前已经收获了34.9K Star,含金量非常高。它的主要特点总结如下:

  • 响应式布局:支持移动、平板电脑和台式机显示器,无论您使用哪种设备。Tabler在所有主流浏览器中都能很好的展示内容。
  • 跨浏览器支持:tabler与最新的Chrome、Firefox+、Safari、Opera、Edge和移动版本的浏览器都能完美兼容
  • HTML5和CSS3:采用HTML5和CSS3实现,模版中还包括了一些微妙的CSS3动画,用户体验极佳
  • 干净的代码:严格遵循Bootstrap开发标准,容易阅读,也更容易二次开发
  • 丰富的演示:模版提供了丰富的掩饰内容,各种组件提供了20多个单独的页面,让您可以自由选择和组合。所有组件的颜色和样式都可能不同,您可以使用Sass轻松进行修改。
  • 单页应用版本:tabler还有一个React版本,可以帮助你构建单页版本的应用

下面我们一起欣赏下tabler官方提供的demo:

Dashboard

Form

Button

Tables

Badges

Email Template

最后,奉上相关地址,感兴趣的可以前往了解更多:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

10.4K Star!程序员为程序员针对性优化的开源免费笔记

作者 翟永超
2023年8月14日 12:35

大家后,我是TJ

最近身体不太舒服,好多天没写代码,也没给大家推荐好工具了。

平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品。上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:VNote

VNote一个由程序员为程序员打造的开源笔记应用,基于Qt开发,专注于使用 Markdown 来写作的群体。它提供完美的编辑体验和强大的笔记管理功能,使得使用Markdown记笔记更加轻松简单。VNote将来还会支持更多的文档格式。由于Qt的支持,VNote可以高效地运行在Linux、Windows和macOS平台上。

VNote的编辑可以通过下面的几张截图来初步了解:

可以看到,VNote的界面非常简洁且符合现代审美。它支持原地预览和双边预览,方便我们查看编写效果。同时,在界面左右两侧提分别提供了文件目录和文章大纲,方便作者快速切换。

对于一些复杂的UML图、流程图、数学公式也有很好的支持,具体如下:

关于文章内容的存储,是很多作者都会关注的。VNote在这方面采用了以文件形式的本地存储,一个笔记对应一个目录。所以,用户可以自由的选择第三方同步服务来备份和同步多端工作。

怎么样,VNote是你心目中想要的笔记软件吗?

最后,老规矩,奉上相关地址:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

Java自带的4种字符串组织和格式化方法

作者 翟永超
2023年8月8日 03:05

在Java中,组织字符串是平时最常见的操作,这里总结一下Java自带的四种处理方式。

1. 使用+拼接

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = "hello " + name + ", your blog is " + host;

这种方法很容易上手,甚至可以混合使用非字符串值来一起组织。然而,结果代码编写起来非常不易阅读和维护。最大的缺点是每次我们使用+运算符时都会分配一个新的字符串。所以,JDK中还提供了多种优化策略来减少字符串的创建,比如下面的方案2。在工作中,要尽量避免使用方案1,而是下面的方案。

2. 使用StringBufferSpringBuilder

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = new StringBuilder()
.append("hello ")
.append(name)
.append(", your blog is ")
.append(host)
.toString();

StringBufferStringBuilder是专门用于字符串连接的实现类,它们都提供了用于插入、替换和查找字符串的方法。但它们之间还有一定区别,StringBuffer是线程安全的,而StringBuilder则不是,所以在使用的时候要注意场景。

3. 使用String::format and String::formatted

案例:

String name = "DD";
String host = "blog.didispace.com";
String template = "hello %s, your blog is %s";
String result = format.formatter(name, host);

String类本身也提供了一些格式化方法,比如:

  • static String format(String format, Object... args)
  • static String format(Locale locale, String format, Object... args)
  • String formatted(Object... args) (Java 15+)

这些方法是以模版的方式来实现字符串的拼接,可以有效地节省字符串创建的数量。

4. 使用java.text.MessageFormat

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = MessageFormat.format("hello {0}, your blog is {1}", name, host);

MessageFormat类型与上面String本身自带的format有点类似,但语法风格上有很大的差别。MessageFormat的参数风格有点像slf4j,而String自带的format风格更像C语言中的print。

除了这些JDK自带的方案之外,还有很多开发者自己封装的处理方法,后面再总结一些优秀的封装,感兴趣的记得关注下程序猿DD或者收藏我的博客。

开源免费、开箱即用的中后台管理模版:vue-pure-admin

作者 翟永超
2023年8月9日 04:09

大家好,我是TJ

之前陆陆续续给大家推荐过很多后台管理模版了,但是模版这东西永远不嫌多,所以,今天再添一枚:vue-pure-admin

vue-pure-admin采用了当下最为流线的技术栈,其中主要包括:

  • Vue3
  • Vite
  • Element-Plus
  • TypeScript
  • Pinia
  • Tailwindcss

很多热门模版一般功能都特别强大,这也导致了内容非常多,但实际很多时候我们就只要一个主体内容就可以。所以,这里值得注意的是,vue-pure-admin还提供了一个精简版本,更适合直接引入到项目作为开发初始版本。

vue-pure-admin提供的精简版打包后全局引入(包含Element-Plus的情况下)才2.3MB的大小,再利用brotli压缩之后,甚至低于350kb,可谓是极致精简了!

该模版还贴心的提供了教程视频,简直是保姆级模版了,实属难得:

接下来一起欣赏下vue-pure-admin的效果吧:

登录界面

Dashboard

流程图组件

表单设计组件

文本编辑器组件

PPT在线操作组件

这里就简单预览一下,其实还有更多有意思的组件展示,留给大家自己去探索吧!最后,奉上相关地址,喜欢的直接冲吧!

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

内网穿透最好用的还得是ngrok,一行命令就搞定!

作者 翟永超
2023年8月6日 06:34

最近在写支付的东西,调试时候需要让支付平台能够回调本地接口来更新支付成功的状态。但由于开发机器没有公网IP,所以需要使用内网穿透来让支付平台能够成功访问到本地开发机器,这样才能更高效率的进行调试。

推荐内网穿透的文章已经很多很多,还有很多大合集的推荐,但也因为推荐的太多,也会让人眼花缭乱,不断尝试不断受挫。有的接受不了收费、有的配置繁琐,有的运行不稳定,还有的有病毒。

这里DD就不多推荐了,只推荐一个个人认为最好用的,那就是:ngrok 。只需要一行命令就能帮你轻松实现内网穿透!

下面你可以跟着我的操作来完成第一次使用:

注册登录账号

从官网(https://ngrok.com/)右上角 Sign Up 进入,完成庄户注册。如果您跟我一样是开发者的话,直接GitHub授权登录,快得很!

完成注册并登录之后,可以看到Dashboard中就给出了使用的三个步骤:

是不是超级简洁?接下来就来一起完成这三步!

安装Ngrok

进入官网的下载页面:https://ngrok.com/download

官方清晰地给出了各个系统的安装方法:

个人推荐直接下载ZIP包,然后直接解压,这种方式最为迅速!

配置账户

直接复制Dashboard中第二步的ngrok config add-authtoken xxxxx命令,然后打开终端,定位到之前解压ngrok的位置执行它!

终端会输出为你保存的配置路径,具体如下:

Authtoken saved to configuration file: /Users/zhaiyongchao/Library/Application Support/ngrok/ngrok.yml

启动ngrok

执行命令启动内网穿透:

ngrok http 8080

这里没用dashboard的80端口,因为我们写Java应用一般都是8080嘛,如果你本地的服务用了其他端口,记得修改一下就可以了。

此时,终端也变了一副画面,具体如下:

你需要关注一下其中的Forwarding内容,后面的域名就是用来通过公网访问您本地8080端口应用接口的地址了。

是不是超级方便?有没有比国内的那些换皮产品好多了?

一款开源免费、更符合现代用户需求的论坛系统:vanilla

作者 翟永超
2023年8月4日 04:29

大家好,我是TJ

对于个人建站来说,WordPress相信很多读者都知道了。但WordPress很多时候我们还是用来建立自主发布内容的站点为主,适用于个人博客、企业主站等。虽然有的主题可以把WordPress变为论坛,但效果并不是很好。

所以,今天给大家推荐一个开源的论坛项目:vanilla,有建站需求的小伙伴可以关注一下!

主要特性

  • 重构了传统的论坛以迎合大众的需求。
  • 灵活的主题机制
  • 支持单点登录和嵌入式集成
  • 强大的社区管理功能
  • 插件机制,可以进一步扩展功能

下面通过图片来直观认识一下它:

论坛主页:

富文本编辑器:

Dashboard:

使用案例

vanilla的官网就是用vanilla构建的,所以感兴趣的用户可以直接通过访问官网来体验它的强大的功能:

看界面元素确实很符合现代论坛的用户需求吧。

最后,奉上相关地址,感兴趣的小伙伴可以冲了:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

69.9K Star,最强开源内网穿透工具:frp

作者 翟永超
2023年8月3日 03:52

大家好,我是TJ君

作为一名开发者,有很多场景需要用到内网穿透,比如:我们在接入一些大平台做第三方应用时,在本地开发微信公众号工具的时候需要让微信平台能否访问到本地提供的接口。除此之外,还有很多其他场景,也会用到,比如:把放在家里的NAS或服务器暴露到公网上,这样在外面的时候也可以随时随地的访问。

说到内网传统,TJ君第一个想到的是国内最早的一款知名软件:花生壳。但是今天不是要推荐它,而是要推荐一个更牛的开源项目:frp!该项目目前已经收获了69.9 K Star,在GitHub上获得了极大的认可!

下载安装

frp目前已经提供了大部分操作系统的支持版本,通过这个链接:https://github.com/fatedier/frp/releases, 就可以下载到适合你使用的安装。

图 1

以Windows的包为例,解压后可以获得这些内容:

图 2

frps是服务端程序,frpc是客户端程序。ini文件就是对应的配置文件。

暴露内网服务

内网穿透的玩法有很多,这里列举一个比较常见的例子。

比如:我要暴露一个只有自己能访问到服务器。那么可以这样配置:

配置 frps.ini,并启动服务端 frps

[common]
bind_port = 7000

在需要暴露到外网的机器上部署 frpc,配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

在想要访问内网服务的机器上也部署 frpc,配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 SSH 服务
bind_addr = 127.0.0.1
bind_port = 6000

把frpc也都启动起来之后,通过 SSH 就可以访问内网机器了

ssh -oPort=6000 test@127.0.0.1

其他支持

除了上面的玩法之外,frp还有很多玩法,比如:

  • 自定义域名访问内网的 Web 服务
  • 转发 DNS 查询请求
  • 转发 Unix 域套接字
  • 对外提供简单的文件访问服务
  • 为本地 HTTP 服务启用 HTTPS
  • 点对点内网穿透

篇幅有限,具体如何配置这里就不多说了,有需要的读者可以直接查看官方文档,均有详细的服务端客户端配置案例。

最后,奉上相关链接:

开源地址:https://github.com/fatedier/frp/
文档地址:https://gofrp.org/docs/

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

Notion的开源替代方案:AFFiNE

作者 翟永超
2023年7月23日 17:06

Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记。今天给大家推荐一个最近比较火的开源替代方案:AFFiNE。目前该开源项目已经斩获20.1K Star,热度非常的高,下面一起来认识一下这个继Notion之后,被热捧的开源软件吧。

通过官方首页的介绍,我们可以知道,AFFiNE是一款集写作、绘画、计划管理与一体的软件。对标的是Notion、Miro、Monday这些热门当下热门的笔记软件。

功能特性

TJ下载了最新版本,体验了一下AFFiNE,下面几个特性可以说眼前一亮,非常好用!

  1. 简洁易上手的UI,这个不用多介绍,看界面就相信你能快速上手使用

  1. 白板和文档的超融合,你可以在你的文档笔记中,像白板一样轻松的涂涂画画

  1. 直观且强大的块级编辑

价格体系

AFFiNE同大部分热门开源软件一样,采用了社区版免费的策略。

AFFiNE对于免费用户来说提供以下支持:

  • 支持离线使用
  • 支持跨设备的点对点同步
  • 支持有限的云存储备份

对于个人用户来说,这些功能已经完全够了。而专业版、团队版和企业版主要提供一些团队协作管理所需要的能力,比如:

  • 基于AFFiNE Cloud的实时同步、协作和备份
  • 基于AI Copilot的增强创意和知识管理
  • Web发布权限管理
  • 工作空间等管理上需要的能力

相关链接

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

你的Spring Boot应用启动很慢?不妨试试这个工具!

作者 翟永超
2023年7月22日 18:03

睡不着闲逛,在GitHub上看到一个不错的开源项目:Spring Startup Analyzer

从项目名称中就大概能猜到,这是一个分析Spring应用启动过程的工具。Spring Startup Analyzer通过采集Spring应用启动过程的数据,进而生成一个交互式的分析报告,帮助用户发现Spring应用启动慢的位置。同时,Spring Startup Analyzer还提供了Spring Bean异步初始化的工具,来帮助开发者加快Spring应用的启动时间。

下面一起来看看其提供的强大功能。

分析能力

我们可以先从该项目中给出HTML样例报告(点击这里查看)来看看它所提供的分析功能。

把报告内容的细节部分都收起来,可以看到如下图所示的内容:

主要有六个部分:

  • 启动的统计数据。其中包括:启动时间、Bean的数量、使用/总共的JAR包数量、未使用/总共的JAR包数量、ClassLoader数量

  • Spring Bean初始化数据。这里采集了每个Spring Bean的初始化时间及其细节内容

  • Bean初始化时间线。通过时间线的方式,清晰地展现了Spring应用启动时候,各个Bean的顺序关系以及时间消耗

  • 方法调用的详细信息。这里统计了每个方法的调用时间、总时间开销和每次调用的平均时间

点开之后,还能看到具体每次调用时候的时间开销和一些调用细节:

  • 启动后未使用的JAR。列出了所有Spring应用启动后没有使用的jar包,可以有效的帮助你清理不需要的依赖,为应用瘦身

  • 应用启动过程的线程火焰图

如何使用

通过上面的介绍,相信你已经了解该工具的强大之处了。接下来就可以通过下面的方法尝试分析一下自己的应用吧:

第一步:从里面的链接中下载最新的安装包

https://github.com/linyimin0812/spring-startup-analyzer/tags

第二步:解压下载的安装包,记住解压后的路径,下面一步要用

第三步:编辑Spring Boot的启动参数,包括:

  1. 该工具采用agent的方式启动,所以要添加参数-javaagent:$HOME/spring-startup-analyzer/lib/spring-profiler-agent.jar,这里$HOME代表以前的解压路径,记得根据上面解压后的路径编辑这个参数
  2. 配置分析工具的参数,这里根据自己需要添加即可,比如可以配置超时时间30分钟:-Dspring-startup-analyzer.app.health.check.timeout=30,其他可配置项如下表,你可以工具自己应用的情况去修改:

第四步:查看该工具的日志,可以通过$HOME/spring-startup-analyzer/logs路径,这里$HOME代表以前的解压路径,日志文件的类别为:

  • startup.log: 启动过程中的日志
  • transform.log: 被re-transform的类/方法信息

另外,该工具还支持自定义扩展,这里DD没试过,就不具体介绍了。感兴趣的童鞋可以根据文档去试试。

启动优化

这里提到了一个启动加速的优化思路,就是把一些耗时的Bean初始化改成异步就能实现。该项目提供了Bean的异步初始化工具,也非常好用,只需要下面几步就能完成。

第一步:引入依赖

<dependency>
<groupId>io.github.linyimin0812</groupId>
<artifactId>spring-async-bean-starter</artifactId>
<version>2.0.2</version>
</dependency>

第二步:配置参数

# 异步化的Bean可能在Spring Bean初始化顺序的末尾,导致异步优化效果不佳,打开配置优先加载异步化的Bean
spring-startup-analyzer.boost.spring.async.bean-priority-load-enable=true
# 指定异步的Bean名称
spring-startup-analyzer.boost.spring.async.bean-names=testBean,testComponent
# 执行异步化Bean初始化方法线程池的核心线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-core-size=8
# 执行异步化Bean初始化方法线程池的最大线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-max-size=8

第三步:检查Bean是否异步初始化。查看日志$HOME/spring-startup-analyzer/logs/startup.log文件,对于异步执行初始化的方法,会按照以下格式写一条日志:

async-init-bean, beanName: ${beanName}, async init method: ${initMethodName}

但是,作者在文档中也提到了,异步并不是万能的,你还需要注意以下这几点:

  • 应该优先从代码层面优化初始化时间长的Bean,从根本上解决Bean初始化耗时长问题
  • 对于二方包/三方包中初始化耗时长的Bean(无法进行代码优化)再考虑Bean的异步化
  • 对于不被依赖的Bean可以放心进行异步化,可以通过各个Bean加载耗时中的Root Bean判断Bean是否被其他Bean依赖
  • 对于被依赖的Bean需要小心分析,在应用启动过程中不能其他Bean被调用,否则可能会存在问题

好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

最后,奉上项目地址:https://github.com/linyimin0812/spring-startup-analyzer

一款滴滴开源的流程图编辑框架:LogicFlow

作者 翟永超
2023年7月20日 19:13

最近因为要在系统里植入一个流程图的灵活绘制功能。如果说自己写一个,那必将是个庞大的工程,所以就在GitHub上调研了一番。最后发现了今天要给大家推荐的这个开源框架:LogicFlow

LogicFlow是一款流程图编辑框架,它提供了必要的流程图交互和编辑功能,同时还支持节点自定义和插件拓展。LogicFlow可以用于各种逻辑编排场景,例如流程图、ER图和BPMN流程。它在工作审批配置、机器人逻辑编排和无代码平台流程配置等方面都有广泛应用。

快速入门

LogicFlow的使用非常简单,只需要两步:

  1. 引入依赖
<!--LogicFlow core包css-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@logicflow/core/dist/style/index.css"
/>
<!--LogicFlow extension包css-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@logicflow/extension/lib/style/index.css"
/>
<!--LogicFlow core包js-->
<script src="https://cdn.jsdelivr.net/npm/@logicflow/core/dist/logic-flow.js"></script>
<!--LogicFlow的插件支持单个引入,这里以菜单插件为例-->
<script src="https://cdn.jsdelivr.net/npm/@logicflow/extension/lib/Menu.js"></script>

也可以使用npm引入,只需要:

npm install @logicflow/core
npm install @logicflow/extension
  1. 可以编写一个简单的案例
import LogicFlow from "@logicflow/core";
import "@logicflow/core/dist/style/index.css";

const lf = new LogicFlow({
container: document.querySelector("#container")
});

lf.render({
nodes: [
{
id: "node_id_1",
type: "rect",
x: 100,
y: 100,
text: {
x: 100,
y: 100,
value: "节点1"
},
properties: {}
},
{
id: "node_id_2",
type: "circle",
x: 200,
y: 300,
text: {
x: 200,
y: 300,
value: "节点2"
},
properties: {}
}
],
edges: [
{
id: "edge_id",
type: "polyline",
sourceNodeId: "node_id_1",
targetNodeId: "node_id_2",
text: {
x: 139,
y: 200,
value: "连线"
},
startPoint: {
x: 110,
y: 140
},
endPoint: {
x: 200,
y: 250
},
pointsList: [
{
x: 100,
y: 140
},
{
x: 100,
y: 200
},
{
x: 200,
y: 200
},
{
x: 200,
y: 250
}
],
properties: {}
}
]
});

这里不得不提一下,LogicFlow提供了一个工具,可以帮助大家所见即所得的绘图,效果如下:

工具地址:https://codesandbox.io/s/logicflow-example-1-zy3o85?file=/step1/index.js:0-1170

最后,奉上最关键的几个传送门:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

基于Spring Boot 3的开源培训系统,学习和自用都不错

作者 翟永超
2023年7月17日 15:39

一个好企业,应该有完善的个人成长体系。每一个员工在为公司付出的时候,个人也能不断的成长。相信这是每个打工人希望遇到的,但要做好这一切并不容易。

如果您正在搭建公司的成长培训体系,那么今天的推荐也许可以助你一臂之力!

今天要推荐的开源项目名为:PlayEdu

这是一款适用于搭建内部培训平台的开源系统,旨在为企业/机构打造自己品牌的内部培训平台。

PlayEdu 基于 Java + MySQL 开发,采用前后端分离模式,前台采用 React18 为核心框架,后台采用 SpringBoot3 为核心框架。

功能体验

该开源项目提供了体验版DEMO,感兴趣的小伙伴可以直接通过下面的链接体验一下该项目的功能:

您也可以直接通过下面的截图了解一二:

学员端口界面预览

管理后台界面预览

相关链接

如果该项目对您有用,可以直接通过下面的了解更多!

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

一个提高学习效率的开源教育平台

作者 翟永超
2023年7月13日 14:09

作为一名学生,为了高效率的管理好自己的学习功课,你需要使用多个应用程序。这包括笔记、日历、任务管理等应用程序。很多信息都散落在不同的应用程序中,这样管理非常繁琐也不利于搜索和分析。

今天要给大家推荐的Noodle,就是解决这个问题的开源平台。该项目旨在通过提供一个单一的平台来管理学生与教育相关的一切来解决这个问题。

通过Noodle管理学习中涉及的所有数据,我们就可以为学生提供强大的洞察力和自动化能力,帮助他们更加高效地完成学业。

作为一个开源平台,Noodle致力于培养一个由学生和开发者共同贡献建设最优秀的学生生产力平台的社区。所以不论你是学生还是想要帮助学生,都可以参与进来。

下面一起来看看这个开源平台吧:

图 0

从界面来看,就非常酷吧!

图 1

再来看看官网的口号:一个多产学生的新时代开始了,也是振奋人心,TJ在想,如果我们读书那会有这个那该多好啊!

介绍就到这里,感兴趣的小伙伴可以通过下面的地址探索起来吧:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

新版GitHub桌面客户端,更方便地管理你的开源项目!

作者 翟永超
2023年7月12日 01:14

今天给大家推荐一个桌面工具:GitHub Desktop

看名字就知道,这是一个GitHub的客户端程序,但这个是新版的客户端,相信很多小伙伴还没有用过。该版本的GitHub Desktop要比之前的更加强大,因为该版本的目标是:无论您是Git新手还是经验丰富的用户,GitHub Desktop都可以简化您的开发工作流程!

通过使用GitHub Desktop可以让你:

  1. 更轻松的与协作者一起提交代码

使用客户端程序,可以快速的添加协作者到您的commit中。这个小功能可以帮助你在提交代码的时候,给那些帮助过你的协作者们表达感谢。同时,在Commit历史页面上,大家也可以看到这些协作者的信息:

  1. 更方便地检出PR分支和查看CI状态

通过客户端程序,用户可以看到所有的PR,并且可以方便地检出分支到本地。同时,还能当PR通过的时候,还能查看CI状态。

  1. 高亮查看文件差异

新版GitHub桌面支持在查看各种不同语言的差异时突出显示语法。

是不是跃跃欲试了呢?那就通过下面的链接快来试试吧:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

一款漂亮的开源JSON工具:支持VS Code、可内嵌个人网站

作者 翟永超
2023年7月4日 11:41

今天给大家介绍一个JSON工具:JSON CRACK

didispace.com

JSON Crack是一款创新的、免费的、开源可视化工具。用户可以通过它讲复杂的JSON数据变的更为简洁易懂,且支持搜索、高亮显示等基本能力。

didispace.com

一旦该应用程序被嵌入,用户就可以使用它直接在网站上查看和分析JSON数据。这可用于各种目的,例如快速检查JSON文件的结构或验证其中包含的数据。

对于VS Code用户而言,JSON Crack还提供了VS Code的插件:

didispace.com

看数据就知道是该插件也是大家非常喜欢的!如果您还没用上的话,可以考虑安装了试试看。

关于JSON Crack的其他信息,您可以通过下面的链接了解更多。

开源项目:https://github.com/AykutSarac/jsoncrack.com

官方网站:https://jsoncrack.com/

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

6.7K Star,Minecraft 风格的开发字体

作者 翟永超
2023年7月2日 11:43

不知道您是否跟我一样,对Minecraft非常痴迷。今天瞎逛看到一个为Minecraft痴迷者量身定制的等宽字体项目:Monocraft

先来看看效果:

didispace.com

该字体除了沿袭Minecraft的像素风格之外,对于下面这些符号也提供了另一种与我们日常书写匹配的显示风格:

didispace.com

如果您对该字体也喜欢的话,只需要通过下面的方式安装即可使用,幻想下在Minecraft中开发软件的感觉。

安装方式

Mac:

brew tap homebrew/cask-fonts
brew install –cask font-monocraft
其他系统:

从下面地址下载ttf文件,并安装到操作系统中

https://github.com/IdreesInc/Monocraft/releases

更多关于该字体的介绍可以通过下面的地址查看:

https://github.com/IdreesInc/Monocraft

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

VSCode中打开NodeJS项目自动切换对应NodeJS版本的配置

作者 翟永超
2023年7月6日 17:27

这几年搞了不少静态站点,有的是Hexo的,有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同,所以本机上不少NodeJS的版本。

关于如何管理多个NodeJS版本,很早之前就写过用nvm来管理的相关文章,这里就不赘述了,有需要的可以看这篇Node.js环境搭建

虽然有了多版本管理,但是默认版本只有一个,所以很多时候,在用VSCode打开不同项目的时候,还需要用nvm use来切换不同的版本使用。显然一直这样操作很麻烦,而且容易忘记什么项目用什么版本。

所以,最好就是能打开项目的时候,自动就切换到对应的NodeJS版本。

要实现这样的效果只需要下面两步:

第一步:安装VSCode插件vsc-nvm

第二步:在项目根目录下创建文件.nvmrc,文件内容为版本号,比如:

v10.13.0

完成配置后,关闭VSCode,再重新打开,可以看到终端自动打开,并执行了nvm use命令,实现了NodeJS版本的自动切换

好了,今天的分享就到这里,希望对您有用。码字不易,欢迎转载,但请附上本文链接~

❌
❌