木偶's Blog

如果发现能力无法支撑自己的野心,那就静下心来学习吧

当我使用 Windows 11 下的 VSCode 启动 Vue 项目时,出现以下报错:

1
2
3
4
5
6
7
8
ERROR  error when starting dev server:                                        
Error: listen EACCES: permission denied 0.0.0.0:5200
at Server.setupListenHandle [as _listen2] (node:net:1800:21)
at listenInCluster (node:net:1865:12)
at doListen (node:net:2014:7)
at process.processTicksAndRejections (node:internal/process/task_queues:83:21)

 ELIFECYCLE  Command failed with exit code 1
阅读全文 »

在 Apache ServiceComb 中,Highway, Vertx, 和 HTTP 都与微服务间的通信有关,但它们之间的角色和关系是不同的。下面是一个简要的描述来解释它们之间的关系:

  1. Highway:

    • Highway 是 ServiceComb 的一个通信协议。它是专为微服务通信而设计的一个高性能的二进制协议。如果两个微服务都支持 Highway,则它们可以使用此协议进行通信,通常会有更好的性能和更低的延迟。
  2. Vertx:

    • Vert.x 是一个为 JVM 提供的工具包,用于构建响应式应用程序。ServiceComb 使用 Vert.x 作为其反应性框架,这使其可以有效地处理大量并发连接和通信。
    • Vert.x 也支持多种通信协议,包括 HTTP/HTTP2 和其他定制协议(例如 Highway)。在 ServiceComb 中,Vert.x 主要用于处理请求/响应的生命周期、非阻塞的 I/O 处理以及提供异步编程模型。
  3. HTTP:

    • HTTP 是一个应用层的通信协议,用于在互联网上传输数据。在微服务架构中,HTTP(特别是 HTTP/2)常被用作微服务间的通信协议。
    • ServiceComb 支持基于 HTTP 的 RESTful 服务通信。这意味着微服务可以使用标准的 HTTP 方法(如 GET、POST、PUT 等)进行通信。

关系总结:

  • Highway 是 ServiceComb 中的一个专用通信协议,主要针对微服务间的高性能通信。
  • Vertx 是 ServiceComb 使用的反应性框架,提供了异步编程模型,并支持多种通信协议(包括 Highway 和 HTTP)。
  • HTTP 是一个标准的通信协议,在 ServiceComb 中,它常被用作微服务间的通信协议,特别是当使用 RESTful 服务时。

基于以上的描述,我们可以看到,Highway 和 HTTP 都是通信协议,但目标和设计思路略有不同,而 Vert.x 是提供通信框架和异步处理能力的库。

有时候,我们需要在 ARM 架构的平台构建 x86 架构的镜像,这时就可以使用 docker 在 19.03 版本引入的 docker buildx 特性。

[!info] Buildx
在 Docker 19.03 版本中,官方引入了一个强大的新功能 buildx,它是一个 Docker CLI 插件,通过集成 Moby BuildKit 提供了扩展的构建能力。123 其中最核心的功能之一就是支持跨平台构建,让你可以在单一主机上(例如 x86)构建出能在多种架构(例如 ARM64)上运行的镜像。低于 19.03 版本的话,需要另外想办法。

阅读全文 »

1.1 Java

Java 语言普遍用于开发各种类型的软件系统、应用程序和 Web 服务,包括财务软件系统、社交网络软件、移动应用程序(虽然现在多用 Kotlin)、虚拟现实系统、嵌入式系统、大数据应用程序等。

此外,Java 还常用于开发游戏服务器和游戏客户端、智能家居软件和安全相关软件。

1.2 Go

Go 语言很适合构建高性能的高并发的服务,可以在游戏、金融、物联网、系统工具等方面得到应用。Go 语言还可以开发分布式系统,构建容器、虚拟化、存储等云计算基础架构。因此 Go 语言可以用于以下任务:

  1. 后端服务:可以用 Go 语言构建高性能和高并发的后端服务
  2. 游戏开发:可以使用 Go 语言开发游戏;
  3. 网络编程:可以使用 Go 语言编写网络编程代码;
  4. 云计算:Go 语言可以编写容器、虚拟化、存储等基础云计算架构;
  5. 工具库:用 Go 语言可以构建各种高效工具库。
  6. 脚本语言:类似 Python 和 Shell

此外,Go 易学快捷,而且可以完成高效的字节码编译,所以适合建立大型应用系统和分布式系统。

1.3 Python

Python 语言常用来做程序开发/应用开发、桌面开发(PyQt)、网络编程、Web 开发、科学计算、自动化测试、人工智能、大数据等任务。

此外,Python 还可以用来编写游戏,移动应用等,但很少被用来做这类事情。

1.1 问题描述

docker 导入镜像 tar 包报错,报错信息如下:

image-20221201153103996

1.2 解决方案

通过报错信息可以看出,是导入的时候,docker 对 SHA256 哈希码进行校验,没有校验通过,说明这个镜像 tar 包被修改过。为了验证,我们可以利用 MD5 对镜像进行比对

  1. 在通过 docker save 镜像名称/id -o demo.tar 命令导出镜像 tar 包后,计算出 tar 包的 MD5 值

    1
    md5sum demo.tar  # md5sum 是 Linux 自带的命令
  2. 将 demo.tar 从 Linux 下载下来后,再次对 demo.tar 计算 MD5 值

    1
    certutil -hashfile demo.tar MD5  # certutil 是 Windows 自带的程序

计算后,对比上面两步的 MD5 值,如果不一致,说明从 Linux 将 demo.tar 包下载下来时,可能因为网络等原因,导致数据发生了改变,从而产生这个错误。只需要重新从 Linux 下载 demo.tar 即可,下载后再次计算 MD5 进行对比,直到一致。

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass

问题描述

在使用 Spring 集成的 cglib 手动对某个类进行代理增强时报了以下错误:

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang” to unnamed module @5c29bfd

我的代码为:

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
public class CglibProxyForMultiInterfacesTest {
interface Service1 {
void m1();
}

interface Service2 {
void m2();
}

public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(new Class[]{Service1.class, Service2.class});
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法:" + method.getName());
return null;
}
});

Object proxy = enhancer.create();
if (proxy instanceof Service1) {
((Service1) proxy).m1();
}
if (proxy instanceof Service2) {
((Service2) proxy).m2();
}
System.out.println(proxy.getClass());
for (Class<?> anInterface : proxy.getClass().getInterfaces()) {
System.out.println(anInterface);
}
}
}

解决方案

貌似是高版本的 JDK 禁用了反射权限,需要添加 JVM 参数去开启

1
--add-opens java.base/java.lang=ALL-UNNAMED  

image-20221128141538748

问题描述

前端向后端发送 POST 请求,请求数据为 JSON 格式,其中有个字段为日期,后端 SpringBoot 通过 Date 类型去接收入参,结果发现比当前时间少了 8 个小时。

初步分析是时区导致的。

解决方案

第一步:

1
2
3
4
5
spring:
jackson:
// 注意格式不要写错了,例如 HH 不要写出 hh,否则可能会有其他问题
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8

第二步:时区用 Asia/Shanghai 或者 GMT%2B8

1
2
3
4
5
url: jdbc:mysql://127.0.0.1:3306/aaaaa?
useUnicode=true&
characterEncoding=utf-8&
useSSL=true&
serverTimezone=Asia/Shanghai

应届毕业生求职就业时的相关注意事项

本文主要是针对第一次找工作的应届毕业生。时间点在于面试后拿到 offer 一直到入职时的劳动合同签订。

企业逼签三方如何考虑

毕业生在秋招求职时,大概率会遇到这样的情况,拿到了几个公司的 offer,但还没签三方,公司那边催签三方,但是自己又想在看看其他公司。面对这种情况,这里有几个点可以综合考虑一下

公司是否靠谱

一般通过校招招聘新人的企业都是靠谱,但是拿到 offer 之后还是要第一时间了解清楚该公司的现状、其他人对该公司的评价;常用的渠道有天眼查企查查看准网offershow等等

岗位情况

如果公司靠谱,再考虑你要签约的岗位的发展前景如何,跟你的职业规划方向是否匹配

薪资情况

违约会怎样?

很多企业会规定违约金,一般情况是 3-8k,具体以公司的规定为准。如果违约了,是需要支付违约金的。此外,多数学校只允许学生毁约一次(签三方不止关系你和公司,还有学校)。所以需要跟就就业指导老师确认一下,如果毁约了,是否会给新的三方文件。

确定好了之后,如果想春招的时候再尝试一下,可以先签一个保底。

签三方前须知

户口

户口的重要性

户口是否重要,有什么用,网上的讨论很多。只能说,你觉得它重要,它就重要,你觉得不重要,它就不重要。个人觉得,如果想要在一个城市长久稳定地发展,那它就很重要。至于户口的实际作用,不同的城市不同。

以北京为例

如果没有北京户口,当你想跳槽时,会发现能选择的单位很有限,因为很多单位招人时,往往都要求北京生源、北京户口,没有北京户口,也无法参加北京市公务员考试,这是户口带给我们的直接影响。

所以,如果不打算在某一个城市长待或者出国,那么户口可能就不重要了。

入户

入户有些公司会帮忙解决,有些则不会,一般通过 HR 或者宣讲会可获知。而且是否需要重视这个问题主要看城市,如果是在广深地区基本不用怎么操心,有公司解决自然不用说。如果没有也没关系,可以自己牵,只是需要多跑几趟派出所。

如果自己迁,需要注意的是,毕业时,保管好毕业报告证,并将自己档案挂在人才市场,再去迁。毕业两年内,都可以以人才引进的方式入户。其实如果是在广深,这些都是不需要怎么担心的,到时候自然水到渠成。

如果是在北京上海,就需要注意了。

北京上海对双外卡得比较严,所以公司能否给你解决户口是非常重要的。一般来说大多数国企、事业单位、研究所、公务员都是有能力解决的,但除此之外的,则需要询问清楚。对于大多数人来说,想要获得北京、上海户口,基本上就只有毕业这一次机会,所以请尽量想清楚。

特别说明的是,对于那些只是承诺“尽力解决户口”、“不保证解决户口”的公司,跟你签了三方,实际上你就要承担一定风险。一旦最后没给你落下,那么算单位违约,三方必然要退给你,你再回学校办改派。大多数情况下,户口和档案会被打回原籍,因为那时再签约别的单位已经不可能了。

整体薪资

薪资

纯小白如何自学编程

看似一个简单的问题但包藏着很多信息,绝对不是简单几句话就能说清楚。首先程序员也分为很多种。例如从大的方向来说,有后端、web,移动端、嵌入式等等。再从编程语言方向细分,如后端程序员又分为 Java、PHP、.NET 等等,所以无论是自学还是报班都要先搞清楚你要学习或者你感兴趣的方向,其次再确定编程语言,之后再开始学习。这个顺序不搞清楚,自学起来就会稀里糊涂,越学越累,走很多弯路。

即使我这么描述了一圈,还是有一些读者接着问,“后端程序员又是个啥玩意?”,每次听到这类问题我都感觉很无语,不知道怎么解释。但闲下来后再想想,这些茫然我也是经历过,被嘲笑过,被无语过,毕竟我也算是 0 基础自学过来的,所以,今天趁着周末,我会尽可能的在自己的知识范围内为大家梳理一下这些问题。

首先就从大家经常接触的前端开始。这里的前端并不是单单指 web,其实应该叫终端。再通俗点说可以理解为给用户使用的产品。你打开的一个网页、一个 App、或者 PC 端的一个软件,都可以理解为前端,而这些产品需要程序员用不同的编程语言开发。这里先给大家大致梳理一下关于前端的一下东西。

image-20210904124356657

这图应该还算清晰吧,假如你想学习 Android 开发,那首先学习的编程语言就应该是 Java 或者 Kotlin。当然这张图还是非常笼统的,只不过是让大家先有个简单的认识,毕竟是给小白写的不能太复杂。前端的东西相对还是很好理解的,毕竟看得见摸得着。

那后端又是啥玩意呢?可以简单理解为运行在远程服务器上的代码程序,主要是为前端提供数据。例如网站上展示的文字图片;用户的登录及用户信息的存储等,都是有后端程序完成的。而一个最基本的后端也至少包含两部分:处理程序和数据库。能够开发后端程序的技术也是有很多,不同的技术也使用不用的编程语言。大概如下图。

image-20210904124442490

再强调一下,此图只是一个最基本的后端,而后端范畴远不止于此。这里就不扩展开来讲了。很多东西都是在学习的过程中慢慢理解的。

那么前后端是如何通信的呢。那就不得不说到 HTTP 请求了。

image-20210904124507450

至此,别说是小白了,就算是个猴子也应该对前后端/对自学编程有初步的认识了吧!(开个玩笑)

那么肯定又有读者会纠结:到底是学习前端还是后端呢?哪个简单?哪个工资高?只能说因人而异吧。作为初学者也别太纠结,都学就是了,先找找感觉,后面再选择一个技术栈深造!后端的程序员多少要懂点前端,而前端程序员大概率都会点后端技术。

0%