跳到主要内容

2025-07/deno

· 阅读需 2 分钟

Deno Land (github.com) 安装

deno --version

deno run main.js

Deno 目前提供了以下内置工具,在使用 JavaScript 和 TypeScript 时非常有用,只需要执行以下命令即可:

  • deno bundler (自带打包和 tree shaking功能,可以将我们的代码打包成单文件)
  • deno compile (将 Deno 项目构建为完全独立的可执行文件)
  • deno installe (可以将我们的代码生成可执行文件进行直接使用)
  • deno info (查看所有模块的依赖关系树)
  • deno doc (将源代码中的注释生成文档)
  • deno fmt (递归地格式化每个子目录中的每个文件)
  • deno repl (启动一个 read-eval-print-loop,它允许您在全局上下文中交互式地构建程序状态)
  • deno test (对名为 .test 的文件进行单元测试)
  • deno lint (代码检测器)

2025-07/shell工具

· 阅读需 1 分钟

mobaxterm

finalshell

vscode + remote-development

oh my zsh + iterm2

2024/Java

· 阅读需 1 分钟

https://cloud.tencent.com/developer/article/1890758

visualvm

http://visualvm.github.io/download.html

[[jvm 参数]]

修改 \visualvm_213\etc 下的config文件种jdk路径

visualvm_jdkhome="C:\jdk-17"

[[Java读取文件内容的六种方式]]

[[Java字符串和16进制数转换]]

[[Java密封类]]

[[弱引用]]

[[Java虚拟机规范]]

[[Objects.requireNonNull]]

2024/Java字符串和16进制数转换

· 阅读需 2 分钟


import java.io.IOException;

public class HeStrTest {

public static void main(String[] args) throws IOException {
String he = string2Unicode("汉字123abcAb!@slc");
System.out.println(he);
System.out.println("=====16进制========");
he =strTo16(he);
System.out.println(he);


System.out.println("-------------------------");
System.out.println("16转字符串");
he = hexStringToString(he);
System.out.println(he);
System.out.println("unicode转文字11111111111111111");
he =unicode2String(he);
System.out.println(he);
}

public static String hexStringToString(String s) {
if (s == null || s.equals("")) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "UTF-8");

} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}

/**
* 字符串转换unicode
*/
public static String string2Unicode(String string) {
StringBuffer unicode = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
// 取出每一个字符
char c = string.charAt(i);
// 转换为unicode
unicode.append("\\u" + Integer.toHexString(c));
}
return unicode.toString();
}

/**
* unicode 转字符串
*/
public static String unicode2String(String unicode) {
StringBuffer string = new StringBuffer();
String[] hex = unicode.split("\\\\u");
for (int i = 1; i < hex.length; i++) {
// 转换出每一个代码点
int data = Integer.parseInt(hex[i], 16);
// 追加成string
string.append((char) data);
}
return string.toString();
}


/**
* 字符串转化成为16进制字符串
* @param s
* @return
*/
public static String strTo16(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
return str;
}


}


2024/Java密封类

· 阅读需 1 分钟
  • 定义密封类 SealedParent , 子类A、B、C,同时继承List接口
import java.util.List;

public sealed interface SealedParent extends List permits A, B, C {

void test();
}

密封类子类


public final class A implements SealedParent {

}
~~~




# Java模式匹配


~~~
public static void main(String[] args) {
Object a = 1;
switch (a){
//如果是Integer 匹配Integer
case Integer i-> System.out.println(i);
case String s->{
//字符串匹配
System.out.println("多行");
System.out.println("多行");
}
//支持null
case null-> System.out.println("null");
//默认
default -> System.out.println("default");
}
}

~~~


~~~
int a = 3;
switch (a){
case 1-> System.out.println(1);
case 2->{
System.out.println("多行");
System.out.println("多行");
}
default -> System.out.println("default");
}

~~~

2024/Java读取文件内容的六种方式

· 阅读需 4 分钟





import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Stream;

public class FileReadTest {


/**
* 第一种方式是Scanner,从JDK1.5开始提供的API,特点是可以按行读取、按分割符去读取文件数据,既可以读取String类型,也可以读取Int类型、Long类型等基础数据类型的数据。
*
* @throws IOException
*/

@Test
public void testReadFile1() throws IOException {
//文件内容:
String fileName = "D:\\1111.txt";

try (Scanner sc = new Scanner(new FileReader(fileName))) {
while (sc.hasNextLine()) { //按行读取字符串
String line = sc.nextLine();
System.out.println(line);
}
}

try (Scanner sc = new Scanner(new FileReader(fileName))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNext()) { //按分隔符读取字符串
String str = sc.next();
System.out.println(str);
}
}

//sc.hasNextInt() 、hasNextFloat() 、基础数据类型等等等等。
//文件内容:1|2
fileName = "D:\\1111.txt";
try (Scanner sc = new Scanner(new FileReader(fileName))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNextInt()) { //按分隔符读取Int
int intValue = sc.nextInt();
System.out.println(intValue);
}
}
}


/**
* 如果你是需要按行去处理数据文件的内容,这种方式是我推荐大家去使用的一种方式,代码简洁,使用java 8的Stream流将文件读取与文件处理有机融合。
*
* @throws IOException
*/
@Test
public void testReadFile2() throws IOException {
String fileName = "D:\\1111.txt";

// 读取文件内容到Stream流中,按行读取
Stream<String> lines = Files.lines(Paths.get(fileName));

// 随机行顺序进行数据处理
lines.forEach(ele -> {
System.out.println(ele);
});
}

/*
forEach获取Stream流中的行数据不能保证顺序,但速度快。如果你想按顺序去处理文件中的行数据,可以使用forEachOrdered,但处理效率会下降。

// 按文件行顺序进行处理
lines.forEachOrdered(System.out::println);
或者利用CPU多和的能力,进行数据的并行处理parallel(),适合比较大的文件。

// 按文件行顺序进行处理
lines.parallel().forEachOrdered(System.out::println);
也可以把Stream<String>转换成List<String>,但是要注意这意味着你要将所有的数据一次性加载到内存,要注意java.lang.OutOfMemoryError

// 转换成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
List<String> collect = lines.collect(Collectors.toList());

*/


/**
* 这种方法仍然是java8 为我们提供的,如果我们不需要Stream<String>,我们想直接按行读取文件获取到一个List<String>,就采用下面的方法。同样的问题:这意味着你要将所有的数据一次性加载到内存,要注意java.lang.OutOfMemoryError
*
* @throws IOException
*/

@Test
public void testReadFile3() throws IOException {
String fileName = "D:\\1111.txt";

// 转换成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
List<String> lines = Files.readAllLines(Paths.get(fileName),
StandardCharsets.UTF_8);
lines.forEach(System.out::println);

}


/**
* 从 java11开始,为我们提供了一次性读取一个文件的方法。文件不能超过2G,同时要注意你的服务器及JVM内存。这种方法适合快速读取小文本文件。
*
* @throws IOException
*/

@Test
public void testReadFile4() throws IOException {
String fileName = "D:\\1111.txt";

// java 11 开始提供的方法,读取文件不能超过2G,与你的内存息息相关
String s = Files.readString(Paths.get(fileName));
System.out.println(s);
}


/**
* 如果你没有JDK11(readAllBytes()始于JDK7),仍然想一次性的快速读取一个文件的内容转为String,该怎么办?先将数据读取为二进制数组,然后转换成String内容。这种方法适合在没有JDK11的请开给你下,快速读取小文本文件。
*
* @throws IOException
*/

@Test
public void testReadFile5() throws IOException {
String fileName = "D:\\1111.txt";

//如果是JDK11用上面的方法,如果不是用这个方法也很容易
byte[] bytes = Files.readAllBytes(Paths.get(fileName));

String content = new String(bytes, StandardCharsets.UTF_8);
System.out.println(content);
}


/**
* 最后一种就是经典的管道流的方式
*
* @throws IOException
*/
@Test
public void testReadFile6() throws IOException {
String fileName = "D:\\1111.txt";

// 带缓冲的流读取,默认缓冲区8k
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}

//java 8中这样写也可以
try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}

}


/*
这种方式可以通过管道流嵌套的方式,组合使用,比较灵活。比如我们
想从文件中读取java Object就可以使用下面的代码,前提是文件中的数据是ObjectOutputStream写入的数据,才可以用ObjectInputStream来读取。

try (FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis)){
ois.readObject();
}

*/

}



2024/Jenkins

· 阅读需 3 分钟

Jenkins 安装启动问题

JVM 设置

查看管理员密码

cat /var/lib/jenkins/secrets/initialAdminPassword

安装Jenkins插件配置

1.找到jenkins安装路径C:\ProgramData\Jenkins.jenkins,

  • 或者 /var/lib/jenkins

然后更改hudson.model.UpdateCenter.xml文件中的url为

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

2.找到jenkins安装路径,C:\ProgramData\Jenkins.jenkins\updates

/var/lib/jenkins/updates

  • 然后更改default.json文件中的url
`安装好jenkins后,输完页面密码,这时候jenkins需要的文件目录已经生成完毕了.default.json 是下载安装插件时调用的配置文件,其中的下载地址还是updates.jenkins.io,我们需要将其更改为国内的清华源。   default.json的具体路劲是:{jenkins的工作路径}/updates/default.json   使用sed -i命令将其更换   `


å~~~



sed -i 's/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json && sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json


### 二、替换国内插件更新地址

选择:系统管理–>[插件管理](https://so.csdn.net/so/search?q=%E6%8F%92%E4%BB%B6%E7%AE%A1%E7%90%86&spm=1001.2101.3001.7020)–>Advanced settings



修改替换1
https://www.google.com 替换成 https://www.baidu.com
修改替换2
https://updates.jenkins.io/download 替换成

https://mirrors.tuna.tsinghua.edu.cn/jenkins

**hudson.model.UpdateCenter.xml和default.json都必须更换,不然不生效**

然后根据需求安装git,allure等插件


# 修改启动用户
/lib/systemd/system/jenkins.service
vim /usr/lib/systemd/system/jenkins.service

User=root Group=root

systemctl daemon-reload


### log
cd /var/log

chmod 777 -R jenkins/


# 自己设置记录
# 下载插件 Jenkins control

server address http://192.168.3.5:8080/ username 登门名 pwd 登录密码 crumb data http://192.168.3.5:8080//crumbIssuer/api/xml?tree=crumb# jenkins version 选择ver 2.x

# 修改配置文件
/usr/lib/systemd/system
sudo vim jenkins.service
找到下面这行

Arguments for the Jenkins JVM

Environment="JAVA_OPTS=-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"


# 重启

sudo systemctl daemon-reload
sudo systemctl restart jenkins


------------


# 博客

参考 https://blog.csdn.net/xundh/article/details/110221975


#



# Jenkins设置
### Jenkins开启CSRF
- 已不适用: 低版本的Jenkins到Jenkins-Configure Global Security,取消”防止跨站点请求伪造“复选框。

如果需要开启此功能,则访问: http://jenkins地址/crumbIssuer/api/xml?tree=crumb# 来获取crumb值,填写到Idea的Jenkins插件设置里。



高版本的Jenkins要到配置文件设置取消CSRF:

vim /etc/sysconfig/jenkins

修改下面的行 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

对于使用service命令启动的情况来说,要把参数加到下面文件:

cd /usr/lib/systemd/system sudo vim jenkins.service sudo systemctl daemon-reload sudo service jenkins restart