利用GitHub Actions自动将项目贡献者列表添加到README中 (wiki.eryajf.net)
当我们负责的项目有越来越多的人加入进行协作之后,将贡献者添加到 README 中是一个很好的激励作用,很多大的项目也都是这么做的,本文就来讲一下,如何借助 Github Actions 自动将项目贡献者列表添加到 README 中。
by @技术头条 2023-05-02 18:00 分享 查看详情
一个诡异的 Pulsar InterruptedException 异常 (crossoverjie.top)
背景今天收到业务团队反馈线上有个应用往 Pulsar 中发送消息失败了,经过日志查看得知是发送消息时候抛出了 java.lang.InterruptedException 异常。和业务沟通后得知是在一个 gRPC 接口中触发的消息发送,大约持续了半个小时的异常后便恢复正常了,这是整个问题的背景。

最后归根结底发现是代码不合理导致的,首先是自己中断了线程但也没使用,从而导致有被其他基础库使用的可能,所以会造成了一些不可预知的后果。

再一个是不建议在业务代码中使用 Thread.currentThread().interrupt(); 这类代码,第一眼根本不知道是要干啥,也不易维护。

其实本质上线程中断也是线程间通信的一种手段,有这类需求完全可以换为内置的 BlockQueue 这类函数来实现。
by @技术头条 2023-05-02 17:59 分享 查看详情
Jenkins-Groovy中三元表达式的用法 (wiki.eryajf.net)
我们在使用pipeline的时候,如果某一个变量没有正常声明,则会遇到变量定义失败的错误,这个时候,我们可以借助三元表达式来解决这个问题。
by @技术头条 2023-05-02 17:58 分享 查看详情
Jenkins结合MySql Database插件的平台化实践思路 (wiki.eryajf.net)
以往Jenkins实践当中,配置了共享库的流水线方案,通过将核心公共逻辑抽离成膜版,项目个性化配置信息放到引导文件中的方式进行推进。这种方案没有什么毛病,对于运维的维护工作也是比较友好的,只是后来我们打算再在Jenkins上层做一下平台化封装的时候,发现还是存在一些问题,并且有一些难度的。最近我了解学习到了一个与 MySQL Database 插件结合的思路,能够比较好解决这种问题,那么接下来话不多说,直接进入正题,让我们来认识一下这个插件。
by @技术头条 2023-05-02 17:57 分享 查看详情
Linux 网络工具中的瑞士军刀 - socat & netcat (thiscute.world)
netcat(network cat) 是一个历史悠久的网络工具包,被称作 TCP/IP 的瑞士军刀,各大 Linux 发行版都有默认安装 openbsd 版本的 netcat,它的命令行名称为 nc.

而 socat(socket cat),官方文档描述它是 "netcat++" (extended design, new implementation),项目比较活跃,kubernetes-client(kubectl) 底层就是使用的它做各种流量转发。

在不方便安装 socat 的环境中,我们可以使用系统自带的 netcat. 而在其他环境,可以考虑优先使用 socat.
by @技术头条 2023-04-29 21:00 分享 查看详情
我在创业公司做技术一年多的一点体会 (thiscute.world)
公司的技术骨干们都是创业思维,他们或者乐在其中,或者愿意为了老板描述的未来忍一时痛苦。他们都愿意为了产品付出更多。 但是我发现对公司,我不愿意付出太多。在这里,我一直就是个普通上班族的想法,高点工资,多点个人时间,做着自己喜欢的事情。
by @技术头条 2023-04-29 20:59 分享 查看详情
解决Blazor Server读取localstorage内容过大无响应的问题 (blog.wixy.cn)
最近在用blazor server对接OpenAI的api,开发自己的ChatGPT网页,这边设计的是聊天内容存储在浏览器的localstorage里面,每次打开网页的时候获取聊天记里并渲染界面。

在开发和使用期间,偶发的会进不进去网站,也没发现有报错,最后清理浏览器缓存解决了问题。

最近这两天使用的比较频繁,发现这个问题出现的概率有点高,最后定位下问题,发现是聊天记录获取的时候出现的问题,在Blazor中调用js的获取数据方法时程序就挂起了,没有继续往下执行,刚开始怀疑是不是存储方法或者json序列化的问题,换了写法,也不能解决问题。
by @技术头条 2023-04-29 20:57 分享 查看详情
Chromium 渲染流水线——字节码到像素的一生 (me.ursb.me)
在开始介绍渲染流水线之前,我们需要先介绍一下 Chromium 的浏览器架构与 Chromium 的进程模型作为前置知识。
by @技术头条 2023-04-29 20:56 分享 查看详情
使用 Dynamic Linq 构建动态 Lambda 表达式 (blog.yuanpei.me)
相信大家都有这样一种感觉,Linq和Lambda是.NET 中一以贯之的存在,从最早的 Linq to Object 到 Linq to SQL,再到 EF/EF Core 甚至如今的.NET Core,我们可以看到Lambda表达式的身影出现地越来越频繁。虽然 Linq to Object 和 Linq to SQL,分别是以IEnumerable<T>和IQueryable <T>为基础来实现的。我个人以为,Lambda呢,其实就是匿名委托的“变种”,而Linq则是对Lambda的进一步封装。在System.Linq.Expressions命名空间下,提供大量关于表达式树的 API,而我们都知道,这些表达式树最终都会被编译为委托。所以,动态创建 Lambda 表达式,实际上就是指从一个字符串生成对应委托的过程,而一旦这个委托被生成,可以直接传递给 Where()方法作为参数,显然,它可以对源数据进行过滤,这正是我们想要的结果。
by @技术头条 2023-04-29 20:56 分享 查看详情
Linux好用命令之watch命令 (wiki.eryajf.net)
watch命令能够将其他命令的输出定时输出到终端,从而实现监听的能力,在我们要对一些命令状态进行实时监听的场景中,有非常好的应用场景。
by @技术头条 2023-04-29 20:55 分享 查看详情
基于Zookeeper的分布式锁原理 (codeyee.com)
临时顺序节点 结合了 “临时节点” 和 “顺序节点” 的特性:在创建节点时 Zookeeper 根据创建的时间顺序给该节点进行编号,并根据该编号的顺序去分配临界资源的访问顺序,当创建节点的客户端与 Zookeeper 断开连接后,临时节点也会被删除。
by @技术头条 2023-04-29 20:54 分享 查看详情
浅淡JAVA虚拟机(JVM) (codeyee.com)
为什么要学习 JVM ?
1、能够明白为什么Java最早期被称为解释型语言,而后来为什么又被大家叫做解释与编译并存的语言(了解JVM中解释器以及即时编译器就可以回答这个问题);
2、你能够理解动态编译与静态编译的区别,以及动态编译相对于静态编译到底有什么好处(JVM JIT);
能够利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以辅助你观察Java应用在运行时堆的布局情况,由此你可以通过调整JVM相关参数提高Java应用的性能;
3、可以清楚知道Java程序是如何执行的;
4、可以明白为什么Java等高级语言具有可移植性强的特性。 其实这个问题相当于“为什么C/C++程序员需要学体系结构与编译原理?“
5、能够知道你的头发是怎么没有的。
那么来开始吧。

by @技术头条 2023-04-29 20:54 分享 查看详情
浅谈JAVA并发机制 (codeyee.com)
有四种使用线程的方法:
1、实现 Runnable 接口;
2、实现 Callable 接口;
3、继承 Thread 类;
4、通过线程池的方式去创建线程。

实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以理解为任务是通过线程驱动从而执行的。
by @技术头条 2023-04-29 20:53 分享 查看详情
解决java的http请求库dongliu.requests请求结果中文乱码的问题 (codeyee.com)
在这之前了解到并且使用的 java 的 http 库都是 okhttp 、httpclient、RestTemplate 等,虽然这些库也简化了很多原生求的复杂配置过程,但对于一些需求还是需要自行去封装。操作体验和开发效率上都差了很多。
by @技术头条 2023-04-29 20:51 分享 查看详情
【Python并发编程】线程池与进程池 (codeyee.com)
在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪。
by @技术头条 2023-04-29 20:51 分享 查看详情
Windows部署minio注册成服务在后台保持运行 (jinyu.host)
最近在使用minio做资源存储,要求把minio部署到wondows上使用,发现官方提供的运行命令:.\minio.exe server .\data运行后,关闭cmd窗口,服务就会关闭。

所以需要通过winsw注册服务的方式,把minio注册成服务运行。
by @技术头条 2023-04-29 20:50 分享 查看详情
PDF转图片各种技术方案对接,寻找最优解 (www.ffeeii.com)
在和文档的对接中,少不了文档转换,比如Word转图片、Word转PDF、PDF转图片,方便人员在线浏览等,而安卓手机更不能方便的在线预览PDF的远程链接。为此整理几个常见的PDF转图片方案供大家参考。
by @技术头条 2023-04-29 20:48 分享 查看详情
并发编程锁之synchronized总结 (jinyu.host)
并发编程中数据同步需要依赖锁进行控制,通过ReentrantLock源码分析也对Lock实现锁机制的大致原理有了一个了解,Lock主要是通过编码的方式实现锁,其核心就是:CAS+循环,CAS原子操作需要依赖底层硬件层特殊的CPU指令。这节我们来看下Java中另一种非常常见的实现同步的方式:synchronized。synchronized主要通过底层JVM进行实现,而且JVM为了优化,产生偏向锁、轻量级锁、重量级锁,由于其处于JVM底层实现中,对很多并发编程人员来说能清晰理解它们间的区别还是件困难的事。通过本篇博文,构建出对Java中锁得体系结构,让你对其有个更系统全面的认知。
by @技术头条 2023-04-29 20:48 分享 查看详情
并发编程锁之ReentrantLock总结 (jinyu.host)
在并发编程中一个比较难解决的就是共享资源并发访问控制问题。如果同步做的不好,很容易出现不一致问题,从而导致业务逻辑的错误;但是如果对共享资源控制的过于严格,又很容易对性能造成很大的影响。在并发编程中,一方面多从大牛的源码中学习精巧的思想和结构设计;另一方面要对并发基础知识掌握的足够牢固,你才能游刃有余的结合些设计模式、架构思想做出些高质量的高并发、高性能的系统。并发编程对设计模式、架构设计是非常依赖的,因此,并发编程对经验的积累、知识的积累方面要求是比较高的。

刚才说过,共享资源在并发访问中很容易造成不一致问题,解决方案就是我们所熟知的悲观锁和乐观锁。悲观锁就如其名字一样:悲观锁认为并发访问一定会导致状态不一致问题,所以在并发操作前一定要锁住资源,让并发线程一个接一个串行化去访问。而乐观锁就不一样了,乐观锁认为并发访问在大多数情况下是不会导致状态不一致问题,所以可以放心的去访问,一旦出现问题再说,本质上乐观锁是不会对共享资源添加锁限制的。这是我个人的理解,可能直白不是那么的精准,有关悲观锁、乐观锁的定义可以搜索更准确的官方解释。

我们来看看在Java中是如何实现悲观锁和乐观锁的。悲观锁在Java中就是我们所熟知的锁,实现方式主要分为两种:synchronized和Lock,而乐观锁的实现主要通过CAS操作实现。
by @技术头条 2023-04-29 20:47 分享 查看详情
Docker 调试构建失败的 Dockerfile 的方法 (wiki.eryajf.net)
当我们基于 Dockerfile 构建一个镜像的时候,不可避免的会遇到错误或失败,这个时候,通常我们会核查对应步骤执行的指令,然后调整指令,再次构建镜像,这是一种常规的方法。其实,因为 Docker 底层存储的机制,我们可以直接进入到失败之前成功的那次状态中,然后二次调试我们的指令,从而做到有的放矢地验证。
by @技术头条 2023-04-29 20:44 分享 查看详情