咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

升级

2022-02-09 当前版本

1
2
3
4
5
6
7
8
9
10
Android Studio Arctic Fox | 2020.3.1 Patch 4
Build #AI-203.7717.56.2031.7935034, built on November 21, 2021
Runtime version: 11.0.10+0-b96-7249189 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 2280M
Cores: 4
Registry: external.system.auto.import.disabled=true
Non-Bundled Plugins: wu.seal.tool.jsontokotlin

点击 “检查更新” 升级到最新版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
The latest stable release of Android Studio is now available for download.
Android Studio Bumblebee | 2021.1.1 Patch 1 is a major new release and includes performance improvements, bug fixes and new features.
Intellij 2021.1.1 Platform Update
New Device Manager
ADB over Wi-Fi
Run Instrumented Tests in Android Studio using Gradle
Android Gradle Plugin Upgrade Assistant now updates API usage
Non-Transitive R classes on for new projects
Apple Silicon Support Update
Jank detection track in Profilers
Profileable app profiling support in Studio Profilers
Network Inspection and ability to capture Layout Inspector snapshots
Support for Compose semantics in the Layout Inspector
Interactive Preview
Animated Vector Drawables Preview
Updated Device picker for Design Tools
Important After updating, you need to restart Android Studio to apply any memory settings you migrate from an earlier version of the IDE.
阅读全文 »

2018年用过EMQ的2.3版本(【EMQ阿里云集群部署】),到现在2022年EMQ已经更新了好多个版本,我也需要重新学习一下。它的项目名称由emqttd改为emqx,目前emqx社区版最新是v4.3.11,完整支持 MQTT V5.0 协议规范,向下兼容 MQTT V3.1 和 V3.1.1。
这家公司它现在主推 EMQX Cloud云原生版和企业版,官网上难找到社区开源版的资料了,社区版需要去Github上查找资料,这里也是为了备忘一下,方便后续使用。

【EMQ X Broker Github仓库】
【下载 EMQ X 开源版】
【文档:快速开始使用 EMQ X】

常用命令

1
2
3
4
5
6
7
8
# Start emqx
./bin/emqx start

# Check Status
./bin/emqx_ctl status

# Stop emqx
./bin/emqx stop

默认参数

阅读全文 »

一路从10.5.5 升级到 12.9.5 后,发现项目默认启用了CI/CD Pipeline流水线,如果项目有 git push 就会触发Pipeline自动构建,构建失败会发邮件通知。
Pipeline这个东西暂时还没有研究过,【有兴趣请参考】,但我项目中无需自行自动构建和部署,所以暂时不需要,想关掉它。

Gitlab-CI使用入门

每个项目关闭

在Gitlab网页端项目的 设置 -> 通用 -> 可见性、项目功能、权限 可以关闭 Pipeline。

在项目配置文件中禁用

阅读全文 »

2017年在 Ubuntu14.04 中安装 Gitlab社区版 ,自从做过一次升级至版本 10.5.5 后,直到目前没升级过,版本落后太多,而且最近暴露的日志等漏洞也波及到Gitlab,为了安全要升级一下。

在官网得知:如果想要升级到最新版本,得一个一个版本的升级,不能跨版本升级,每个版本之间有依赖,感觉好麻烦。

之前都是下载deb包安装升级的,这次尝试一下apt升级。

注意:下面的命令都是以root的身份执行,普通用户需带sudo

一、升级Gitlab失败

阅读全文 »

【这里】 发现很多好用的软件

010 Editor

一款全新概念的十六进制编辑器,能解析和编辑一切可视的二进制文件方面功能强大,有别于传统的十六进制编辑器,特别对一些二进制文件进行分析时,简直是神器。。其最强大的功能在于支持模板和脚本操作,只要你为一种类型的二进制文件定义了模板,在以后编辑同一类型的文件的时候就能够调用原来的模板来进行自动分析文件。

Hex Workshop

一款非常专业的十六进制编辑器,功能强大的开发工具, 可以方便地进行十六进制编辑、插入、填充、删除、剪切、复制和粘贴操作, 配合查找、替换、比较以及计算校验和等命令使工作更加快捷。速度快,算法 精确,并附带计算器和转换器工具。

阅读全文 »

按照官网的 【Quick Start】 教程做一遍

一、创建工程

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
$ mkdir electron-app
$ cd electron-app/
$ yarn init 或者 npm init
$ ls
package.json
$ cat package.json
{
"name": "electron-demo",
"version": "1.0.0",
"description": "this is demo",
"main": "index.js",
"author": "demo",
"license": "MIT"
}

# 安装electron开发依赖
$ yarn --registry=https://registry.npm.taobao.org add --dev electron
或者
$ npm --registry=https://registry.npm.taobao.org install --save-dev electron
$ ls
node_modules/ package.json yarn.lock
$ cat package.json
{
"name": "electron-demo",
"version": "1.0.0",
"description": "this is demo",
"main": "index.js",
"author": "demo",
"license": "MIT",
"devDependencies": {
"electron": "^16.0.6"
}
}

二、增加命令

package.json 增加一条 start 命令

阅读全文 »

QuarkusRedHat 的一款轻量级的 Java 微服务框架 ( MicroProfile 规范 )。

Quarkus 可以借助 GraalVM 编译成二进制文件,提供了优秀的容器化(Kubernetes)整合能力,相较于传统开发框架(Spring Boot)有着更快的启动速度、更小的内存消耗、更短的服务响应。

Quarkus的标签:RedHat / JVM / GraalVM / Vert.x (Netty) / MicroProfile / No Servlet /启动快 /占用内存小 / 容器 / Kubernetes

本文是阅读总结关键信息的笔记,更详细请阅读原文。
【如何借助 Quarkus 和 MicroProfile 实现微服务】
【英文原文:Implementing Microservicilities with Quarkus and MicroProfile】

Quarkus 实现 MicroProfile 规范微服务特性

阅读全文 »

Vert.x是一个基于 JVM、轻量级、高性能的应用平台,采用事件驱动的编程模型,底层使用的Netty作为通讯组件,为了降低使用门槛,屏蔽掉了许多底层netty相关的细节。

官网介绍:Vert.x™ Reactive applications on the JVM

历史背景

一位名叫 Tim Fox 的开发人员曾在 VMware 的 SpringSource 部门工作。在此期间,他领导开发了 Vert.x 项目。2012 年,Tim 跳槽到了 Red Hat 并希望能够继续从事该项目的开发,所以VMware和Redhat为此吵了一段时间,后来项目转移到Eclipse基金会。

快速创建项目

阅读全文 »

linux 下用for循环 ping 网段:10.0.1.*

1
for i in 10.0.1.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i Find the target; fi; done

苹果设备现在拍照的文件都是 .heic 格式,文件占的存储空间确实更小了,但导出到Windows查看,打开图片所在文件夹就被会卡到不行,为了方便整理图片,可以考虑将图片批量转为 pngjpg等格式。
网上很多网站提供在线转换,这对于大量图片来说肯定不适用,而且个人图片还存在隐私问题,所以考虑用Python来做这个事情。

一、格式详解

HEIFHEIC 的介绍请看这篇文章:【HEIF/heic图片文件解析】
简单来说,HEIF 是一个容器的图片格式,当前包含的编码 HEVC(256) 和 H.264/MPEG-4 AVC
在苹果设备采用的HEIC就是 HEIF采用 HEVC编码的一种,文件后缀为 *.heic

二、库

如果想自己去提取HEIF文件中的图片,一定会使用到诺基亚的C++库【nokiatech/heif】,我们用Python也是要用到这个库,但我们不直接安装这个库。

阅读全文 »

PyCharm创建项目有几种选择,这里记录一下。

1. Previously configured interpereter


这是使用系统安装的Python的环境,pip依赖也是安装在系统的。
优点:使用现成的环境,方便快捷。特别是依赖,只要系统中使用过的库,无需重新下载安装。
缺点:各个项目的Python版本可能不一样,会和系统的Python版本冲突。

2. Virtualenv


Virtualenv虚拟环境为项目提供隔离的Python,解决了不同应用间多版本的冲突问题。这是在项目根目录下有一个venv目录,里面下载了你选择的Python版本,默认会安装 pipsetuptools
优点:不会有多版本的冲突问题。
缺点:项目中的虚拟环境存在一个Python版本,依赖也是安装在虚拟环境下,耗时更加长。要手动安装依赖。

阅读全文 »

有项目对AES对称加密有需求,使用Java使用Aes过程中有些坑是要注意一下的。

跨平台问题

AES是对称加密,利用秘钥,可以对内容加密和解密,于是我在PC开发电脑上尝试以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static byte[] encrypt(String content, String password) {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(byteContent);
}

public static byte[] decrypt(byte[] content, String password) {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(content);
}

这段代码在本机加密和解密都没问题,是正常的,但如果跨机器执行很大概率会解密失败,这是由于不同机器很大概率是安装了不同平台厂商的JDK和版本(特别是Android 平台)。

阅读全文 »

【2021-12-03】手贱在Win10的电脑管家上升级了Git至版本【2.34.0】,无意中发现无法执行clone命令克隆Gitlab上的仓库,Gitee、Github上的可以。

Gitlab版本信息:

GitLab 10.5.5
GitLab Shell 6.0.3
GitLab Workhorse v3.6.0
GitLab API v4
Ruby 2.3.6p384
Rails 4.2.10
postgresql 9.6.5

故障表现为:

1
2
3
4
5
6
7
8
9
10
11
12
$ git clone git@192.168.0.186:kevin/test.git
Cloning into 'INNC'...
git@192.168.0.186's password:
Permission denied, please try again.
git@192.168.0.186's password:
Permission denied, please try again.
git@192.168.0.186's password:
git@192.168.0.186: Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
阅读全文 »

在Ubuntu桌面版中安装IDEA,Jetbrains只提供 tar.gz 格式包,解压即可使用,但需要执行 idea.sh ,没有快捷方式对桌面系统很不友好。

我们可以手动编辑一个快捷方式,在桌面创建一个名为 idea.desktop的文件,假如我们解压目录地址为 /usr/local 内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Desktop Entry]

Version=2021.2.2

Type=Application

Name=IDEA

Comment=IntelliJ IDEA

Exec=sh /usr/local/idea/bin/idea.sh

Terminal=false

Icon=/usr/local/idea/bin/idea.png

Terminal=false

Encoding=UTF-8

Categories=Development;

还需要给这个文件赋予运行权限:

1
$ sudo chmod +x idea.desktop
阅读全文 »

部署一个简单的 Springboot Web 项目在阿里云ESC公网,web容器由Tomcat切换为Undertow。

1. 异常信息

跑一段时间后,在日志中经常出现一些其他域名相关的奇怪异常,而且很难复现。如下:

以下只贴出带有域名的异常,其实IP的异常居多

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

2021-09-30 09:14:02.935 ERROR 18684 --- [ XNIO-1 I/O-1] io.undertow.request :
UT005071: Undertow request failed HttpServerExchange{ CONNECT www.baidu.com:443}

java.lang.IllegalArgumentException: UT000068: Servlet path match failed
at io.undertow.servlet.handlers.ServletPathMatchesData.getServletHandlerByPath(ServletPathMatchesData.java:83) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:88) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:162) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:100) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:57) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:291) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:286) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.QueuedNioTcpServer$1.run(QueuedNioTcpServer.java:129) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:582) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:466) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]



2021-10-02 01:57:00.626 ERROR 18684 --- [ XNIO-1 I/O-1] io.undertow.request :
UT005071: Undertow request failed HttpServerExchange{ GET ab2h}

java.lang.IllegalArgumentException: UT000068: Servlet path match failed
at io.undertow.servlet.handlers.ServletPathMatchesData.getServletHandlerByPath(ServletPathMatchesData.java:83) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:88) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:59) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:561) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]


2021-10-10 22:14:39.423 ERROR 18684 --- [ XNIO-1 I/O-1] io.undertow.request :
UT005071: Undertow request failed HttpServerExchange{ CONNECT www.sogo.com:443}

java.lang.IllegalArgumentException: UT000068: Servlet path match failed
at io.undertow.servlet.handlers.ServletPathMatchesData.getServletHandlerByPath(ServletPathMatchesData.java:83) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:88) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:162) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:100) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:57) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:291) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:286) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.QueuedNioTcpServer$1.run(QueuedNioTcpServer.java:129) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:582) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:466) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]


2021-10-11 19:53:54.083 ERROR 10473 --- [ XNIO-2 I/O-2] io.undertow.request :
UT005071: Undertow request failed HttpServerExchange{ CONNECT hotmail-com.olc.protection.outlook.com:25}

java.lang.IllegalArgumentException: UT000068: Servlet path match failed
at io.undertow.servlet.handlers.ServletPathMatchesData.getServletHandlerByPath(ServletPathMatchesData.java:83) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:88) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146) ~[undertow-servlet-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.handlers.accesslog.AccessLogHandler.handleRequest(AccessLogHandler.java:148) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:162) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:100) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at io.undertow.server.protocol.http.HttpOpenListener.handleEvent(HttpOpenListener.java:57) ~[undertow-core-2.0.29.Final.jar!/:2.0.29.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:291) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:286) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.QueuedNioTcpServer$1.run(QueuedNioTcpServer.java:129) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:582) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:466) ~[xnio-nio-3.3.8.Final.jar!/:3.3.8.Final]
阅读全文 »

【DB Browser for SQLite】是一个可视化SQLlite数据库管理工具,其主要实现了高质量、可视化、免费开源、设计与编辑与SQLite兼容的数据库文件。

现在国内免费的流程图画图软件网页版的居多,如 ProcessOn 、 GitMind 、DrawIO 等。现在发现一个新的选择,IDEA上的PlantUML是一个开源的插件,可以使用代码来画图。

Visio是商业软件 ,MasterMind 和 XMind 可以长期免费试用,只是导出文件有水印。

安装方法很简单,在插件市场上直接搜索安装。

创建一个PlantUML文件,选择图形类型,新文件会有示例代码

支持的类型挺多的,这里截图我关注的几个类型,效果还不错:

阅读全文 »