搭建基于tailscale的k3s集群
本文是我基于 tailscale 的 k3s 集群搭建过程的笔记。
安装 tailscale首先需要在全部的服务器上安装 tailscale 并且加入到网络里面
12curl -fsSL https://tailscale.com/install.sh | shtailscale up
安装 master主节点服务器安装 master安装 k3s,注意替换 ip 地址
12export INSTALL_K3S_EXEC="server --node-ip MASTER_IP --flannel-iface tailscale0 "curl -sfL https://get.k3s.io | sh -
获取 master 的 token 一会用的到
1cat /var/lib/rancher/k3s/server/node-token
安装 node注意替换掉下面的 MASTER_IP、TOKEN、NODE_IP
1234export K3S_URL=https://MASTER_IP:6443export K3S_TOKEN=TOKENexport INSTA ...
使用一个网段的ipv6地址作为出口ip
正常情况下选择出口 ip 的前提条件是要把这个 ip 静态配置在网卡上,但是如果是一个网段的 ipv6 可能难以做到的了。一方面他真的很多 linux 不支持配置这么多,另一方面性能也是个问题。因此这篇文章讨论的方案是一个动态话非配置的方式,直接在使用的时候指定 ip 的形式。
1. 动态绑定 IPv6 地址1.1 修改内核参数确保系统允许绑定非本地 IPv6 地址:
1sudo sysctl -w net.ipv6.ip_nonlocal_bind=1
要使更改在重启后依然生效
1echo "net.ipv6.ip_nonlocal_bind=1" | sudo tee -a /etc/sysctl.conf
1.2 设置本地路由对于使用的 IPv6 地址或地址范围,需要创建一个本地路由条目:
1ip route add local 2XXX:XXXX:XXXX:XXe4::/64 dev eth0
2. 配置 NDP 代理ndppd允许您对那些未直接分配给机器但您希望使用的 IPv6 地址进行代理。
2.1 安装 NDP1apt install ndppd ...
Docker Wine环境下DLL注入的路径问题
Wine 环境下进行 DLL 注入时,我遇到了一个奇怪的现象。尽管 DLL 成功注入,但随后程序却立即进入了 DLL_THREAD_DETACH 的生命周期阶段。这个问题困扰了我一段时间,后来我注意到,如果我在 Wine 的目录下(~/.wine)或者 WORKDIR 启动 exe,DLL 注入后程序就不会自动退出。
我怀疑这和 DLL 的搜索路径有关,在 Linux 环境可能没办法做的那么完美,或者和 Wine 的实现相关。如果大家有遇到类似的问题,可以尝试一下在 Wine 目录或者 WORKDIR 启动 exe 程序。
Github更换主邮箱导致无法登录Vultr
简介vultr 的 github 登录竟然是邮箱来识别的,真他妈的离谱。这个邮箱目前在 vultr 上也无法修改,真是蛋疼。
蛋疼的过程昨天发现 vultr 登录不上去了,提示Invalid username/password但是服务器还是可以用的。网上有说是被封号/删号了。因为我这边的的服务器还是可用的, 所以我排除了这种可能性。
发了一个邮件给他来询问账号怎么了。很快收到了回复,一个扯皮邮件。
我最后一次登录 vultr 是在一个月前,我就回忆了一下这个月自己对 github 账号进行了什么操作,改了个名字, 换了个邮箱。我一开始在想,vultr 不会这么蠢吧。然后,我就把 github 邮箱换回去了,然后就可以正常登录了。
后续因为那个邮箱我不在作为主邮箱使用,vultr 目前也无法在页面上进行修改邮箱,发了个邮件问了一下,Github 登陆的邮箱不支持修改。 看来只能等钱用完了换个号了。
解决poi读出来的sheet个数和实际看到个数不一致
背景业务那边给了个 excel,用 office 软件打开只显示一个 Sheet,但是使用 poi 读可以读出来 3 个 sheet,并且看了这个 excel 确实没有隐藏 sheet。
解决过程一开始用了一些关键字并没有找到相应的结果。并且使用 poi 查看这个看不到的 sheet 的 isHidden 也确实都是 fasle。后来快要放弃的时候,发现了 poi 接口有个方法
1org.apache.poi.ss.usermodel.Workbook#getSheetVisibility
这个方法和 isHidden 是同一个层级的,只是因为在找 isHidden 的时候 ide 自动提示出来的。然后我就调用了一下这个方法,发现看不到的 excel 使用这个方法返回的是VERY_HIDDEN这个枚举值。
有了这个关键字,然后去搜索这个关键字就比较容易了。找到了一个比较好的解释,链接我放到参考里面去了。大概意思 excel 有一种 very hidden 模式,这个模式默认情况下不会漏出来,需要在开发者模式下,或者像我这样用 poi 才能看到。
参考https://theexcelc ...
Windows远程唤醒
因为需要可能偶尔会需要远程一下家里的电脑,但是太穷了电脑不能一直开机。
通电唤醒这是之前用的方案,在电源上接一个智能插座,bios 设置通电自动开机。
网络唤醒可以参考一下这篇文章https://sspai.com/post/67003,说的比较详细了,设置网卡唤醒,然后使用 App 发送请求达到唤醒的目的。
开机卡这是我现在用的方案。比起网络唤醒更省电。而且现在的开机卡都比较智能了。可以直连家里的智能家居,可以受到小爱同学或者 siri 的控制。淘宝一搜就有。
开机卡一般使用 PCIE 供电,当然也有 USB 供电的。这里要额外说一下 PCIE 供电的,一般的主板都会有 PCIE 供电口,但是可能是消费级别的主板这个口一般用的不多,网上看到很多人都在吐槽显卡会挡住这个口,刚好我的主板的 PCIE 口就被显卡挡住了,而且是两个都被挡住了。没办法只要接了一个 PCIE 扩展线,把口接出来才能用。
岛屿的数量
原题连接 https://leetcode.cn/problems/number-of-islands/description/
方法 1 并查集这是一个很典型的并查集问题。初始化并查集,把全部的陆地分别设置成单独的集合,然后遍历,如果有陆地相连则把集合合并,最后计算最后剩余的集合个数
12345678910111213141516171819202122232425262728293031323334353637383940414243class Solution: def numIslands(self, grid: List[List[str]]) -> int: union_find = UnionFind(grid) l1,l2 = len(grid),len(grid[0]) for i in range(l1): for j in range(l2): if grid[i][j] == '1': # 这里做不做 ...
常用python3刷题语法
因为主编程语言不是 python,很多语法容易忘,特意记录一下。
循环普通循环range 是左闭右开区间
12for i in range(0, 10): print(i)
逆序12for i in range(10, 0, -1): print(i)
循环变量在循环体外面依然可以用
1234for i in range(0, 10): pass# 这里输出的是9,并不等价于类c语言里面的 for(i = 0;i < 10; i++)print(i)
enumerate返回的元组第一个参数是 index
123s = "abcd"for i,c in enumerate(s):
数组切片12345678910# 复制数组b = a[:]# 取前四个数b = a[:4]b = a[0:4]b = a[0:4:1]# 取前四个没隔两个一取b = a[:4:2]
数组比较直接比就可以了
1list1 == list2
字符串按照字典序排序12a = "dcba"b = "".join(sorted ...
pdfbox实现pdf合并
目前 Java 的 pdf 文档合并方案常见的有 spire.doc.free、itextpdf、pdfbox 三种。spire.doc.free 的免费版本有页数限制,这里就不考虑了。而性能最好的 itext 的开源协议是AGPL,为了避免以后可能出现的麻烦我放弃了他,选择了可以商用比较友好的 pdfbox。
pdfboxApache pdfbox 是一个开源 Java 库,可用于创建,渲染,打印,拆分,合并,更改,验证和提取 pdf 文件的文本和元数据。
maven 依赖12345<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version></dependency>
pdf 合并12345678910public void mergePdf(String... path) throws IOException { ...
Java字符串split、replaceAll忽略全半角和大小写
replaceAll忽略大小写很简,使用正则就可以实现
1String s = "Hello word".replaceAll("(?i)hello","你好");
忽略全角半角就需要自己实现了,实现思路是把原字符串、要匹配的字符串全部转换成半角(全角),然后对转换后的字符串做 indexOf,得到 index 之后替换原字符串。
1234567891011public static String replaceAllIgnoreHalfFull(String source, String toReplace, String replacement) { StringBuilder sbSource = new StringBuilder(source); StringBuilder sbSourceHalf = new StringBuilder(StringUtils.fullToHalf(source)); String searchString = StringUtils.fullToHa ...