domain 的自言自语 2309

安全

GitHub – felix-pb/kfd: kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.

开发

推出 RustRover – JetBrains 出品的独立 Rust IDE (qq.com)
JetBrains 发布 Rust 的独立版本 IDE 预览版,目前免费。

Port forwarding local services with VS Code (visualstudio.com)

网络

获取Tg的用户IP地址 (qq.com)
STUN 打洞泄露出口 IP。

https://support.fortinet.com/Download/VMImages.aspx
虚拟机版本的飞塔。

WireGuard Endpoint Discovery and NAT Traversal using DNS-SD | Jordan Whited
WireGuard 的一种 NAT 穿越方案。

无聊的东西

cs.uwaterloo.ca/~csk/slide/
不知道为什么很火的滑动解锁式游戏。

domain 的自言自语 2308

开发

面向插件开发者的语言服务器协议(LSP)| 技术解析 (qq.com)
JetBrains 自 2023.2 大版本开始引入 LSP 支持。

云原生

应用容器化后为什么性能下降这么多? (qq.com)

k8s无法删除namespace-腾讯云开发者社区-腾讯云 (tencent.com)

混沌故障演练如何尽可能保障生产环境不被破坏 (qq.com)

网络

Fortinet ZTNA远程办公解决方案全国首发评测_哔哩哔哩_bilibili
飞塔的 ZTNA。

MikroTik CRS310-8G+2S+IN 2.5G交换机 – YuS (irouteros.com)
MikroTik 发了个新的 2.5G 交换机,个人感觉性价比一般。

华为HN8145XR拆机,FTTR主光猫 (qq.com)

嵌入式

Github上的高热度嵌入式项目之——开源核辐射检测仪 (qq.com)

其它

xkcd: Security

在梅奥诊所查房,站友真的羡慕了! (qq.com)

domain 的自言自语 2307

开发

C++ Insights (cppinsights.io)

云原生

从 Istio 在 CNCF 毕业,看服务网格的架构变迁 (qq.com)

CNCF宣布CRI-O项目毕业 (qq.com)

是时候和 Jenkins 说再见了 (qq.com)

Linux

Linux 中不适用功能键切换TTY | 《Linux就该这么学》 (linuxprobe.com)

网络

Home (dn42.dev)
一直没有时间学 BGP…

光猫改桥接后速度降低的问题与运营商和厂商的探讨 – V2EX
时间错误导致丢包。

总结142款运营商定制WiFi6 mesh路由的配置,供大家参考(有几款可刷OPENWRT)-无线路由器硬件改造以及故障维修-恩山无线论坛 – Powered by Discuz! (right.com.cn)
运营商定制机是真的便宜。

AI

人类数据,要被 OpenAI 用完了,然后呢? (qq.com)
中文互联网的很多优质内容都被掌握在各大厂手里了。

智能家居

美的设备怎么进米家联动?教你如何通过易来Pro网关进行跨平台联动_哔哩哔哩_bilibili
那么,在哪里可以买到呢?

其它

GitHub – microsoft/win32-app-isolation: Tools and documentation for Win32 app isolation

thinking-in-se/《人件 原书第3版》.pdf at master · clsaa/thinking-in-se · GitHub

无法摆脱的干眼症,放不下手机的一代人 (qq.com)

节省数亿IT成本,B站FinOps实践 (qq.com)

如何理解 FinOps? (qq.com)

openSUSE Wicked 重新获取 DHCP 分配的地址

最近发现,如果在 DHCP 服务器上向 openSUSE 下发了 IPv4 地址,在该地址的老化时间内,即使是重新开启网卡接口、重启系统、重新插拔网线等行为,Wicked 也不会重新获取 IP 地址,查看 wickedd-dhcp4.service 的日志可以发现其检查了 IP 的有效时间,有效期内没有再重新获取一次。

解决方案

先删除 /var/lib/wicked 下的所有文件:

sudo rm -rf /var/lib/wicked/*

或者是只删除 /var/lib/wicked/lease-eth0-dhcp-ipv4.xml 也可以。

然后,重启该网卡接口:

sudo wicked ifdown eth0
sudo wicked ifup eth0

此时应该可以观察到 IP 地址已经刷新。

引用

Wicked keeps DUID on SLES15 even when NIC is replaced | Support | SUSE

Docker Compose 创建的容器无法访问 host.docker.internal

在 docker-compose.yml 中的 extra_hosts 字段中加上 host.docker.internal:host-gateway 即可。是的,一个魔法字符串。

这个并非由 Docker Compose 处理,而是传给 Docker Engine 这层来处理,具体见引用链接中的源码。

引用

https://github.com/docker/compose/issues/9768#issuecomment-1570319324

https://github.com/moby/moby/blob/9dbdbd4b6d7681bd18c897a6ba0376073c2a72ff/daemon/container_operations.go#L112-L129

迁移monorepo保留原仓库提交记录

将代码仓库转移到monorepo如果直接将代码复制到大仓中就会丢失原本的代码提交记录。而大多数情况下我们希望保留提交记录以方便后期问题定位等情况。

  • 在原仓库中进行以下操作,这里注意文件移动需要时间,确保全部文件移动完成后再进行下一步提交操作
# 移动文件
git mv -k * projects/{你的项目名}
git mv -k .* projects/{你的项目名} 

# 提交仓库
git commit && git push
  • 在迁移目标仓库中进行以下操作
git remote add -f my-app {原仓库git地址}

git merge my-app/{分支名} --allow-unrelated-histories

git remote remove my-app
git push

parseInt

parseInt永远将输入解析为字符串

parseInt({toString: () => 2, valueOf: () => 1}); // -> 2
Number({toString: () => 2, valueOf: () => 1}); // -> 1

一个常见的栗子

parseInt("apple"); // -> NaN
parseInt("apple", 16); // -> 10

上面这个例子是因为parseInt会一个个解析字符直到解析不了,所以解析十六进制中的a为10作为结果返回。

parseInt Infinity

parseInt("Infinity", 10); // -> NaN
// ...
parseInt("Infinity", 18); // -> NaN...
parseInt("Infinity", 19); // -> 18
// ...
parseInt("Infinity", 23); // -> 18...
parseInt("Infinity", 24); // -> 151176378
// ...
parseInt("Infinity", 29); // -> 385849803
parseInt("Infinity", 30); // -> 13693557269
// ...
parseInt("Infinity", 34); // -> 28872273981
parseInt("Infinity", 35); // -> 1201203301724
parseInt("Infinity", 36); // -> 1461559270678...
parseInt("Infinity", 37); // -> NaN

parseInt null

parseInt(null, 24); // -> 23

上面的结果都是一样的解析过程,按字母表排序,每个字符对应数字是固定的。比如,I对应18,在18进制中只能解析0-17,所以parseInt("Infinity", 18); // -> NaN,在19进制中就能解析出结果:parseInt("Infinity", 19); // -> 18

n对应23,在23进制中解析不了,只返回18,在24进制中就是18 * (24 ^ 5) + 23 * (24 ^ 4)+ 15 * (24 ^ 3)+ 18 * (24 ^ 2) + 23 * 24 + 18 = 151176378,其他依此类推。

八进制

parseInt("08"); // -> 8, 支持ES5
parseInt("08"); // -> 0, 不支持ES5

以0开头的数字可以被解析为10进制或8进制,ECMAScript 5规定为10进制,但不是所有浏览器都支持它。所以使用parseInt时指定进制是好习惯,有时可以避免不必要的bug。

浮点数

parseInt(0.000001); // -> 0
parseInt(0.0000001); // -> 1
parseInt(1/1999999); // -> 5

parseInt 接受一个字符串参数并返回一个指定基数的整数。 parseInt 还会去除字符串参数中第一个非数字之后的任何内容。0.000001转换为字符串后是"0.000001",0.0000001转换后是"1e-7",所以返回1,1/1999999转换后是5.00000250000125e-7,返回结果是5。

本地开发debug npm包

使用pnpm包管理

1. 在本地npm包目录下执行

pnpm link --global

2. 如果是cli,可直接在其他项目目录下调用

3. 如果需要在其他项目中引入npm包,在其他项目目录下执行

pnpm link --global npm-package-name

使用npm包管理

1. 在npm包目录下执行

npm link

2. 在其他目录使用

npm link 本地npm包绝对路径

官方文档:https://docs.npmjs.com/cli/v9/commands/npm-link

async/await class constructor

背景:期望在新建类时调后台接口对类进行配置,配置成功后才可以执行其他操作。

尝试封装类的构造函数为async/await,报错

Class constructor may not be an async method

原因:async函数返回值为promise,而构造函数返回值为object,同一个函数不可能返回值同时为promiseobject

解决:参考 jQuery's ready()方法

1. 类实现

    class myClass {
        constructor () {

        }

        async ready (callback) {
            await yourHttpRequest();
            // 回调函数绑定作用域
            callback.bind(this)();
        }
    }

2. 调用

    const myObj = new myClass();
    myObj.ready(function() {
        // 保证配置完才能执行其他操作
    });

参考:https://stackoverflow.com/questions/43431550/async-await-class-constructor