wireguard折腾记录

wireguard折腾记录 条件: 有一个动态公网ip的服务器(openwrt),NameSilo域名+DDNS 需求:有两个局域网需要打通and有一个无公网ip的机器需要内网传统。 尝试两个wireguard服务器互联 两个服务器都安装wireguard,然后配置好服务器端和客户端,然后两个服务器互联,可以互相ping通。 用ipv6链接,盲猜校园网可以免流。 等等先 解决动态公网ip变更后wireguard无法连接的问题 自动重连、自动更新配置文件、自动更新域名解析 From: https://v2ex.com/t/863087 官网上说是不会自动解析域名,所以配置里面EndPoint填的是域名也没有用。 Endpoint with changing IP After resolving a server's domain, WireGuard will not check for changes in DNS again. If the WireGuard server is frequently changing its IP-address due DHCP, Dyndns, IPv6, etc., any WireGuard client is going to lose its connection, until its endpoint is updated via something like wg set "\(INTERFACE" peer "\)PUBLIC_KEY" endpoint "$ENDPOINT". Also be aware, if the endpoint is ever going to change its address (for example when moving to a new provider/datacenter), just updating DNS will not be enough, so periodically running reresolve-dns might make sense on any DNS-based setup. Luckily, wireguard-tools provides an example script /usr/share/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh, that parses WG configuration files and automatically resets the endpoint address. One needs to run the /usr/share/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh /etc/wireguard/wg.conf periodically to recover from an endpoint that has changed its IP. One way of doing so is by updating all WireGuard endpoints once every thirty seconds[6] via a systemd timer: 1 git clone https://git.zx2c4.com/wireguard-tools /usr/share/wireguard-tools 1 2 3 4 5 6 7 8 9 # sudo vim /etc/systemd/system/wireguard_reresolve-dns.timer [Unit] Description=Periodically reresolve DNS of all WireGuard endpoints [Timer] OnCalendar=*:*:0/30 [Install] WantedBy=timers.target 1 2 3 4 5 6 7 8 9 # sudo vim /etc/systemd/system/wireguard_reresolve-dns.service [Unit] Description=Reresolve DNS of all WireGuard endpoints Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/bin/sh -c 'for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh "$i"; done' 1 sudo systemctl enable wireguard_reresolve-dns.service wireguard_reresolve-dns.timer --now

2023/8/5
articleCard.readMore

DSB in SBG

《Diffusion Schrödinger Bridge with Applications to Score-Based Generative Modeling 》论文理解 Abstract翻译 逐步应用高斯噪声将复杂的数据分布转变为近似高斯的分布。逆转这一动态定义了一个生成模型。当正向噪声过程由随机微分方程(SDE)给出时,演示如何使用分数匹配来估计相关反向时间SDE的时间不均匀漂移。这种方法的局限性在于,正向时间SDE必须运行足够长的时间,以使最终分布近似于高斯,同时确保相应的时间微分误差得到控制。 相比之下,解决Bridge(SB)问题,即路径空间上的熵规整的最优传输问题,会产生扩散,在有限时间内从数据分布中产生样本。我们提出了扩散SB(DSB),一个解决SB问题的迭代比例拟合(IPF)程序的原始近似,并提供了理论分析和生成模型的实验。第一个DSB迭代恢复了由WWDC提出的方法,并且可以灵活地使用较短的时间间隔,因为随后的DSB迭代减少了前向(或后向)SDE的最终时间边际与高斯先验(或数据)分布之间的差异。 除了生成模型,DSB还提供了一个计算上的最优传输工具,作为流行的Sinkhorn算法的连续状态空间类似物。

2023/6/25
articleCard.readMore

ODE常微分方程总结

教材:DLI-BSc-Mathematics-Documents/Ordinary Differential Equatrions.pdf at main · JavaZeroo/DLI-BSc-Mathematics-Documents (github.com) 第一章 Explicit First Order Equations 这种形式的 \[y' = f(x, y)\] 称为 'Explicit First Order Equations' 。 \(y'=f(x)\) 1. Equations with Separated Variables \[y' = f(x)g(y)\] 这种可以直接变成 \(\frac{dy}{g(y)}=f(x)dx\) 积分完后 \[\int\frac{dy}{g(y)}=\int f(x)dx\] IVP: \(y(\xi)=\eta\) \[\int^y_{\eta}\frac{dy}{g(y)}=\int^x_{\xi} f(x)dx\] 这里需要注意的是如果\(g(y(\xi))=g(\eta)=0\) 那么,直接就有 \(y'=0\) 因此\(y=\eta\) ; 2. 普通的替换 \[y'=f(ax+by+c)\] 这种情况用\(u(x) = ax+by+c\) 去替换掉变量\(x\) 。原理是\(u'=a+by'(x)=a+bf(u)\)。很关键的一点是,\(u\) 和\(y\) 都是一次的。求导后刚好是线性关系。 因此 最后得出的\(u(x)\)后可以直接利用\(u(x)=ax+by+c\)得到\(y\)。 3. 普通的Homogeneous Differential Equation \[y'=f\left(\frac{y}{x}\right)\] 同样的道理用\(u(x) = \frac{y(x)}{x}, (x\neq0)\)替换掉变量\(y\)。有\(y'=u+xu'=f(\frac{y}{x})\) ,可得\(u'=\frac{f(u)-u}{x}\) 因此 最后得出的\(u(x)\)后可以直接利用\(u(x)=\frac{y(x)}{x}\)得到\(y\)。 4. 高级的 Homogeneous Differential Equation \[y'=f\left(\frac{ax+by+c}{\alpha x+\beta y+ \gamma}\right)\] 这个的核心思想是转换成“普通的Homogeneous Differential Equation”。 首先分析行列式 \[\left | \begin{matrix}a &b \\\alpha &\beta \\\end{matrix} \right | \] 行列式为零时,说明\(a=\lambda_a \alpha, b=\lambda_b \beta\) 此时 可以直接转换成“普通的Homogeneous Differential Equation” 行列式不为零的时候,说明方程组有唯一解。 首先解方程组 \[\left\{\begin{align} ax+by+c&=0\\ \alpha x+\beta y+ \gamma&=0\\\end{align}\right.\] 可以解出一组\((x_0, y_0)\) 利用这组解将“高级的 Homogeneous Differential Equation”转换成“普通的Homogeneous Differential Equation”。 原理是新建坐标系得\(\bar{x}:=x-x_0, \bar{y}:=y-y_0\) 那么在这个坐标系下面原方程就变成了\(\bar{y}(\bar{x}):=y(\bar{x}+x_0)-y_0\)。对这个方程求导可以将\(y\)消掉,将原问题变\(\bar{y}\)和\(x\)的关系。这样做的目的就是将“高级的 Homogeneous Differential Equation”转换成“普通的Homogeneous Differential Equation”。 对\(\bar{y}\)求导后可以发现(利用方程\(\bar{y}(\bar{x}):=y(\bar{x}+x_0)-y_0, ax_0+by_0+c=0, \alpha x_0+\beta y_0+ \gamma=0\)) \[\frac{\bar{y}(x)}{d\bar{x}} = y'(\bar{x}+x_0)=f\left(\frac{a\bar{x}+b\bar{y}(\bar{x})}{\alpha\bar{x}+\beta\bar{y}(\bar{x})}\right)\] 这里就可以像刚才的普通的Homogeneous Differential Equation一样去做了。值得注意的是,这样解出来的\(\bar{y}\)需要转换成原来的\(y\)。这里可以用 \[y(x):=y_0+\bar{y}(x-x_0)\] 得到最后的\(y\)。 The Linear Differential Equation 这种形式的 \[y' + g(x)y=h(x)\] 称为 'The Linear Differential Equation' 。 这时有两种情况:\(h(x)=0\)和\(h(x)\neq0\), 分别称为"homogeneous" 和"nonhomogeneous" 事实上当\(h(x)=0\)也就是"homogeneous"时,就是上面的"Explicit First Order Equations",这里就不在赘述了。 对于\(h(x)\neq0\)的情况,也就是"nonhomogeneous"时,我们需要用到"Method of variation of constants"。 Method of variation of constants:这个方法首先计算出齐次的时候的通解。对于方程\(y'+g(x)y=h(x)\)他的齐次方程的通解是通过解\(y'+g(x)y=0\),可得 \[y=C\cdot e^{-\int g(x)dx}\] 此时我们将常数\(C\)作为一个与\(x\)的函数\(C(x)\)。这个时候,只需要解出一个\(C(x)\)就是非齐次情况下的答案。 那么现在的问题就变成了,如何得到一个\(C(x)\)使得\(y' + g(x)y=h(x)\)? 首先先计算\(C'(x)\) \[\begin{align}y &=C(x)\cdot e^{-\int g(x)dx}\\y'&=\left( C(x) \right)'\cdot e^{-\int g(x)}+C(x)\cdot \left( e^{-\int g(x)dx }\right)' \\y'&=C'(x)\cdot e^{-\int g(x)}+C(x)\cdot \left( e^{-\int g(x)dx }\cdot\left(-\int g(x)\right)'\right) \\y'&=C'(x)\cdot e^{-\int g(x)}+C(x)\cdot \left( e^{-\int g(x)dx }\cdot -g(x)\right) \\&\Downarrow \\y'&=C'\cdot e^{-\int g(x)}-gC\cdot e^{-\int g(x)dx}\end{align}\] 然后代入\(y' + g(x)y=h(x)\) \[\begin{align}L_y \equiv y' + g(x)y&=h(x)\\L_y&=C'\cdot e^{-\int g(x)dx}-gC\cdot e^{-\int g(x)dx}+gC\cdot e^{-\int g(x)dx}\\L_y&=C'\cdot e^{-\int g(x)dx}=h(x) \\&\Downarrow \\C'(x)&=h(x)\cdot e^{\int g(x)dx} \\&\Downarrow \\C(x)&=\int h(x)\cdot e^{\int g(x)dx}dx + C_0\end{align}\] 现在我们可以知道,当\(y=C(x)\cdot e^{-\int g(x)dx}\)且\(C(x)=\int h(x)\cdot e^{\int g(x)dx} + C_0\)时。,有\(y' + g(x)y=h(x)\)。这里有个二级结论 If \(y, \bar{y}\), yare two solutions to the nonhomogeneous equation \(L_y = h\), then \(L(y - y) = L_y - L_{\bar{y}} = 0, i.e., z(x) = y - \bar{y}\) is a solution of the homogeneous equation \(L_y = 0\). Thus all solutions \(y(x)\) of the nonhomogeneous equation can be written in the form \[y(x)=\bar{y}+z(x)\] 这里面\(z(x)\)就是刚刚的\(y=C\cdot e^{-\int g(x)dx}\),\(\bar{y}\)就是\(C(x)=\int h(x)\cdot e^{\int g(x)dx} + C_0\)和\(y=C\cdot e^{-\int g(x)dx}\)的结合中的\(y\),也就是\(\bar{y}=\left(\int h(x)\cdot e^{\int g(x)dx}dx + C_0\right)\cdot e^{-\int g(x)dx}\) Bernoulli's Equation 这种形式的 \[y'+g(x)y+h(x)y^{\alpha}=0.\alpha \neq 1\] 非常的简单,只需要把\(y^{\alpha}\)解决了就可以了。等式去除\(y^{\alpha}\)有 \[y'y^{-\alpha}+g(x)y^{(1-\alpha)}+h(x)=0\] 利用\(z=y^{(1-\alpha)} \implies z'=(1-\alpha)y^{-\alpha}\cdot y'\)替换原式得 \[\frac{1}{1-\alpha}z'+g(x)z+h(x)=0\] 现在,就变成了nonhomogeneous的"The Linear Differential Equation"。最后解出\(z\),别忘了替换回\(y\)。 Exact differential equations 这种形式的 \[M(x,y)dx+N(x,y)dy=0,\\ \exists\ U(x, y)\ s.t.\ U_x(x,y)=M(x,y),U_y(x,y)=N(x,y)\] \(xdx+ydy=0\) is an exact equation, and \(U(x,y)=1/2 (x^2+y^2 )\)is a potential function. Integrating Factors Integrating Factors是用来让非 Exact 变成Exact differential equations。 E.g. \(ydx + 2xdy = 0\) is not exact. However, it can easily be made an exact differential equation (in the domain \(x > 0\)) by multiplying the equation by \(1/\sqrt{x}\). The resulting differential equation \[\frac{y}{\sqrt{x}}dx+2\sqrt{x}dy=0\] is exact, and a potential function is given by \[F(x,y)=2y\sqrt{x}=0\ (x>0)\] 对于一个not excat differential equation我们需要找到一个Factor \(U(x,y)\) 使得\(U(x,y)\cdot M(x,y)dx+U(x,y)\cdot N(x,y)dy=0\)变成一个Exact differential equations。 这里有一个"Theorem on potential functions"保证可以找到\(U(x,y)\) 现在的问题就是,如何去找?首先令\(M' = U\cdot M,N'=U\cdot N\)如果\(F_x=M',F_y=N'\)则有\(M'_y=N'_x\)。利用这个关系可以知道 事实上就是\(F_{xy}=F_{yx}\) (Jacobian Matrix) \[\begin{align}&(U\cdot M)_y=(U\cdot N)_x\\\implies &U_y\cdot M+U\cdot M_y=U_x\cdot N+U\cdot N_x \\\end{align}\] 此时需要考虑,Integrating Factors是只与\(x\)有关还是只与\(y\)有关(只需要选一个) 假如只与\(x\)有关则\(U_y=0\)则有 \[\begin{align}U_y\cdot M+U\cdot M_y&=U_x\cdot N+U\cdot N_x \\U\cdot M_y &= U' \cdot N+U \cdot N_x \\\frac{1}{U}U'&=\frac{M_y-N_x}{N} \\(\ln U)'&=\frac{M_y-N_x}{N} \\U&=e^{\int \frac{M_y-N_x}{N}dx}\end{align}\] 这里的答案不是\(U=C\cdot e^{\int \frac{M_y-N_x}{N}dx}\)的原因是,我们只需要找到一个\(U\),因此你可以认为我们选择\(C=1\)作为答案。下面的情况同理。 假如只与\(y\)有关则\(U_x=0\)则有 \[\begin{align}U_y\cdot M+U\cdot M_y&=U_x\cdot N+U\cdot N_x \\U'\cdot M+U\cdot M_y &= U \cdot N_x \\\frac{1}{U}U'&=\frac{N_x-M_y}{M} \\(\ln U)'&=\frac{N_x-M_y}{M} \\U &=e^{\int \frac{N_x-M_y}{M}}\end{align}\] Implicit First Order Differential Equations 这种形式的 \[F(x, y, y')=0\] 一般来说有两种解决办法。要么通过一些方法获得explicit differential equation,要么就用参数化。 在这里我们只讨论两种情况: $F(x, y')=0 $, \(F(y, y')=0\) \(y=f(x,y')\), \(x=f(y,y')\) 第一种情况 对于$F(x, y')=0 $我们使用参数化: \[\left\{\begin{array}{l}x=\phi(t) \\y'=\psi(t)\end{array}\right.\] 此时方程变为\(F(\phi(t), \psi(t))=0\),同时我们有 $$ \[\begin{align}y'&=\frac{dy}{dx} \ \text{and} \ \phi'(t)=\frac{d\phi(t)}{dt} \\dy&=y'dx \ \ \text{and} \ d\phi(t)=\phi'(t)dt\\ y&=\int y'dx + C\\y&=\int \psi(t)d\phi(t) + C \\y&=\int \psi(t)\phi'(t)dt +C\end{align}\] \[最后得到:\] {\[\begin{array}{l}x=\phi(t) \\y=\int \psi(t)\phi'(t)dt +C\end{array}\] . $$ 第一种情况2 对于\(F(y,y')=0\)我们仍然参数化: \[\left\{\begin{array}{l}y=\phi(t) \\y'=\psi(t)\end{array}\right.\] 此时有\(F(\phi(t),\psi(t)=0\),同时有: \[\begin{align}y'&=\frac{dy}{dx} \ \text{and} \ \phi'(t)=\frac{dy}{dt} \\dx&=\frac{dy}{\psi(t)} \ \text{and} \ dy=\phi'(t)dt \\dx&=\frac{\phi'(t)dt}{\psi(t)} \\\int dx&= \int \frac{\phi'(t)dt}{\psi(t)} \\x&=\int \frac{\phi'(t)dt}{\psi(t)}\end{align}\] An Existence and Uniqueness Theorem 中文名是存在唯一性定理。首先我们介绍Lipschitz condition: We consider the following initial value problem \[y' = f(x,y),\ \text{for}\ \xi \leq x\leq \xi+a,\ y(\xi)=\eta\] The main assumptions in the following theorem are that \(f\) is continuous in the strip \(S=J\times\mathbb{R}\) with \(J=[\xi,\xi+a]\) and satisfies a Lipschitz condition with respect to \(y\) in \(S\) \[|f(x,y)-f(x, \bar{y})|\leq L|y-\bar{y}|\] No restrictions are placed on the value of the Lipschitz constant \(L\geq 0\) 然后引出存在唯一性定理: Let \(f \in C(S)\) satisfy the Lipschitz condition. Then the IVP has exactly one solution \(y(x)\). The solution exists in the interval \(J: \xi\leq x \leq\xi +a\) The extension of solutions. 以下三个定理是用于 The extension of solutions. 1️⃣Local Lipschitz condition. The function \(f(x,y)\) is said to satisfy a local Lipschitz condition with respect to \(y\) in \(D\subset R^2\) if for every \((x_0,y_0 )\in D\) there exists a neighborhood \(U=U(x_0,y_0 )\) and an \(L=L(x_0,y_0 )\) such that in \(U\cup D\) the function \(f\) satisfies the Lipschitz condition \(|f(x,y)-f(x,\bar{y})|\leq L|y-\bar{y}|\). 注意!我们一般通过连续性来判断Local Lipschitz condition If \(D\) is open and if \(f \in C(D)\) has a continuous derivative \(f_y\) in \(D\), then f satisfies a local Lipschitz condition in this set. 2️⃣Theorem on local solvability If \(D\) is open and \(f\in C(D)\) satisfies a local Lipschitz condition in \(D\), then the IVP is locally uniquely solvable for$ (x_0,y_0 )∈D$; i.e., there is a neighborhood \(I\) of$ x_0$ such that exactly one solution exists in \(I\). 3️⃣Theorem on the extension of solutions Let \(f \in C (D)\) satisfy a local Lipschitz condition with respect to \(y\) in \(D\). Then for every \((x_0, y_0)\in D\) the initial value problem \(y' = f (x, y), y(x_0) = y_0\) has a solution that can be extended to the left and to the right comes arbitrarily close to the boundary of \(D\). 最后我们有: The Peano existence theorem. If \(f(x,y)\) is continuous in a domain \(D\) and \((\xi,\eta)\) is a point in \(D\), then at least one solution of the differential equation \(y′=f(x,y)\) goes through \((\xi,\eta)\). Every solution can be extended to the left and to the right up to the boundary of \(D\). Linear System 这里开始就是在讨论,常微分方程组。 Systems of n Linear Differential Equations 给出常微分方程组的形式: $$ \[\begin{align}y_1' &= a_{11}(t)y_1+\cdots+ a_{1n}(t)y_n+b_1(t) \\&\ \ \vdots \\y_1' &= a_{11}(t)y_1+\cdots+a_{1n}(t)y_n+b_1(t) \\\end{align}\] \[或者:\] '=A(t)+(t)\ \ A(t)=(a_{ij}(t)), (t)=(b_1(t), , b_n(t))^ $$ 值得一提的是,存在唯一性定理在常微分方程组也同样适用。 Homogeneous Linear Systems 对于齐次的形式,常微分方程组就变成了: \[\mathbf{y}'=A(x)\mathbf{y}\] 此时,根据存在唯一性定理有: \[\exist \text{ exactly one solution } \mathbf{y}=\mathbf{y}(t;\tau,\boldsymbol{\eta})\ \forall \tau \in J, \boldsymbol{\eta}\in \R^n\text{ or }\C^n\] 当然,齐次常微分方程组有一些重要的性质: $ $ in $ J$ is a solution of the homogeneous linear systems. There exist \(n\) linearly independent solutions \(_1,\dots,\mathbf{y}_n\). Every such set of \(n\) linearly independent solutions is called a fundamental system of solutions. If \(\mathbf{y}_1,\dots,\mathbf{y}_n\) is a fundamental system, then every solution \(\mathbf{y}\) can be written in a unique way as a linear combination \(\mathbf{y}=C_1 \mathbf{y}_1+\dots+C_n \mathbf{y}_n\). A system of \(n\) solutions \(\mathbf{y}_1,…,\mathbf{y}_n\) can be assembled into an \(n\times n\) solution matrix \(\Phi(x)=(\mathbf{y}_1,\dots,\mathbf{y}_n )\). If \(n\) solutions \(\mathbf{y}_1,\dots,\mathbf{y}_n\) are linearly independent, then \(\Phi(x)\) is a system of \(n\) solutions \(\mathbf{y}_1,\dots,\mathbf{y}_n\) can be assembled into an \(n\times n\) solution matrix \(\Phi(x)=(\mathbf{y}_1,\dots,\mathbf{y}_n )\). If \(n\) solutions \(\mathbf{y}_1,\dots,\mathbf{y}_n\) are linearly independent, then \(\Phi(x)\)is a Fundamental Matrix. The Wronskian 现在讨论一下,齐次常微分方程的解,是线性无关还是线性相关。 The Wronskian. If \(\Phi(x)=(\mathbf{y}_1,\dots,\mathbf{y}_n )\) is a solution matrix of \(\mathbf{y}^′=A(x)\mathbf{y}\), then its determinant \(W(x)=|\Phi(x)|\)is called the Wronskian determinant. Theorem If \(\mathbf{y}_1,\dots,\mathbf{y}_n\) are linearly dependent in \(J\), then the Wronskian \(W(x)\equiv0\). Theorem If \(\mathbf{y}_1,…,\mathbf{y}_n\) is a fundamental system of equation \(\mathbf{y}'=A(x)\mathbf{y}\), then the Wronskian \(W(x)\neq0\) in \(J\). Theorem. There exists a fundamental system of solutions for equation \(\mathbf{y}'=A(x)\mathbf{y}\). 因此,我们先求出\(n\)个解,然后再去判断这\(n\)个解的Fundamental Matrix的行列式,也就是The Wronskian,是否为零。 Inhomogeneous Systems 对于非齐次的常微分方程组,就是最开始样子: \[\mathbf{y}'=A(t)\mathbf{y}+\mathbf{b}(t)\] 下面这个定理类似线性代数,非齐次方程组的通解是,齐次方程组的通解+非齐次方程组的特解: Theorem. Let \(\tilde{\mathbf{y}}(x)\)be a fixed solution of the inhomogeneous equation (1). If \(\mathbf{y}_0 (x)\) is an arbitrary solution of the homogeneous equation, then \(\mathbf{y}(x)=\tilde{\mathbf{y}}(x)+\mathbf{y}_0 (x)\)is a solution of the inhomogeneous equation, and all solutions of the inhomogeneous equation are obtained in this way.

2023/2/24
articleCard.readMore

Windows分应用跳过管理员弹窗

程序设置管理员启动 右键exe文件->属性 程序设置管理员启动 把程序打开一次后关闭(这个时候还会有弹窗是正常的,别急😠) 进入注册表 摁住Win+R,输入regedit打开注册表编辑器 注册表编辑 在Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers下面找到对应的程序,然后修改程序的数值为RUNASINVOKER 编辑值 再次打开软件就不会有弹窗了。

2022/11/15
articleCard.readMore

docker配置wikijs

默认你已经安装好了docker 安装 安装centos 1 docker run -i -t -d -p 8888:8888 -p 888:888 -p 80:80 -p 3306:3306 --privileged=true -v [随便设置一个文件夹]:/wwwroot --name=baota centos:7 /usr/sbin/init 进入docker内的centos 1 docker exec -i -t baota /bin/bash 安装宝塔 1 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 进入宝塔后,在宝塔内地软件商店安装Postgresql和Node.js 安装插件 下载wiki.js后在/www/wwwroot下解压

2022/11/6
articleCard.readMore

使用socket代理解决企业微信可信ip问题

最近在网上看到了使用微信测试公众号给女朋友弄的每日推送。不过还是有很多问题的,主要是不能更改头像和名字,非常的不优雅。于是找到了企业微信的api,非常满足我的需要求。 于是打算自己重新写一个。直达链接 (目前还没有施工完🛠️) 主要思路 首先我们需要明确需求:需要一个固定的公网ip来访问企业微信的api。 那第一反应当然就是租用云服务器,然后同时购买固定的公网ip,然后再把云服务器作为代理服务器,帮助我们去访问企业微信api。 flowchart LR A[本地服务器] --->|Socks代理| B[云服务器] ---> C[企业微信api] C -.-> B -.->|Socks代理| A 为什么用Socks代理而不用http? 主要是因为http代理无法代理https的流量,比较麻烦。 Socks代理性能更好,因为他只负责转发流量,简单理解为Socks代理更纯粹。 实际操作 我的内核: CentOS Linux release 7.6.1810 (Core) 安装socks5服务端 项目地址:https://github.com/Lozy/danted 项目给出了两种安装方式,我这里使用的是脚本安装,直接安装在服务器上。(主要是腾讯云上貌似没有自带docker,懒得折腾了) 首先下载脚本 1 wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh 安装脚本 1 chmod +x install.sh && ./install.sh 默认配置的端口是2016,且没有账号密码!!!! 如果需要自定义参数可以加上: 1 2 3 --port=端口 \ --user=账号 \ --passwd=密码 安装完成界面 后续配置 参考 Socks:https://cloud.tencent.com/developer/article/1682604?from=15425 安装:https://blog.csdn.net/weixin_44471270/article/details/121343578

2022/9/21
articleCard.readMore

PowerShell美化

最近刚刚重装了系统,记录一下美化的过程 ## PowerShell 7 安装 在这里面下载最新的PowerShell安装文件,建议使用.msi文件 1 https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2#installing-the-msi-package 下载完之后,一路下一步就行 ⚠️这里建议安装的时候,将PowerShell加入到Windows Terminal中。避免后面手动添加 ohmyposh安装 官方教程: 点这里 这里我就直接用wget了 1 https://ohmyposh.dev/docs/installation/windows 然后要安装Nerd类型的字体(就是一种将一部分字符变成好看的符号的字体🥰) 官方是用ohmyposh内置的安装方法。其实我更推荐下载字体文件下来双击安装。这样更熟悉一点。(拒绝离开舒适区🙅🏻) 当然,安装完字体后需要在Windows Terminal上设置一下 设置位置 马上就好了! 现在一切准备就绪,只需要稍微设置一下PowerShell就行了 输入: 1 notepad $PROFILE 把下面这行复制进去,保存! 最后复制这个!就行了! . $PROFILE 这里说个题外话😁,其实就是设置Shell的配置 用过linux可能比较熟悉 1 2 vim ~/.bashrc source ~/.bashrc 其实是一一对应的,原理都差不多 主题!(当然你可以不弄) 这里你可以用下面这个指令看到所有的预设主题 1 Get-PoshThemes 选一个你喜欢的,比如说jandedobbeleer 那么你就可以输入下面这个指令换成这个主题: 1 oh-my-posh init pwsh --config ~/.jandedobbeleer.omp.json | Invoke-Expression 其实可以看出来~/.jandedobbeleer.omp.json 这个就是jandedobbeleer对应的json文件,所有主题都是以json文件储存的。 其实你可以自己创建一个主题,这里是官方教程,事实上他包括很多插件,eg. Spotiy; 这里给出我自己的json 你只需要复制以下代码,并且创建一个json文件。然后把上面的~/.jandedobbeleer.omp.json换成你的json文件就行; 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 { "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json", "blocks": [ { "alignment": "left", "segments": [ { "background": "#003543", "foreground": "#fff", "powerline_symbol": "\ue0b0", "style": "powerline", "template": " {{ if .WSL }}WSL at {{ end }}{{.Icon}}", "type": "os" }, { "background": "#003543", "foreground": "#d2ff5e", "powerline_symbol": "\ue0b0", "style": "powerline", "template": "{{ .HostName }} ", "type": "session" }, { "background": "#0087D8", "foreground": "#003544", "powerline_symbol": "\ue0b0", "properties": { "folder_separator_icon": "/", "style": "full" }, "style": "powerline", "template": " \ue5ff {{ .Path }} ", "type": "path" }, { "background": "#d2ff5e", "background_templates": [ "{{ if or (.Working.Changed) (.Staging.Changed) }}#ff9248{{ end }}", "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#f26d50{{ end }}", "{{ if gt .Ahead 0 }}#89d1dc{{ end }}", "{{ if gt .Behind 0 }}#f17c37{{ end }}" ], "foreground": "#193549", "powerline_symbol": "\ue0b0", "properties": { "fetch_stash_count": true, "fetch_status": true }, "style": "powerline", "template": " {{ .HEAD }}{{ if .Staging.Changed }} \uf046 {{ .Staging.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Working.Changed }} \uf044 {{ .Working.String }}{{ end }}{{ if gt .StashCount 0 }} \uf692 {{ .StashCount }}{{ end }} ", "type": "git" } ], "type": "prompt" }, { "alignment": "right", "segments": [ { "background": "#0087D8", "foreground": "#003544", "invert_powerline": true, "powerline_symbol": "\ue0b2", "properties": { "display_mode": "context", "fetch_virtual_env": true }, "style": "powerline", "template": " \ue235 {{ .Venv }} ", "type": "python" }, { "background": "#003543", "foreground": "#fff", "invert_powerline": true, "powerline_symbol": "\ue0b2", "style": "powerline", "template": "<#fff> \uf64f </>{{ .CurrentDate | date .Format }} ", "type": "time" } ], "type": "prompt" }, { "alignment": "left", "newline": true, "segments": [ { "foreground": "#FFD700", "style": "plain", "template": " \u26a1 ", "type": "root" }, { "foreground": "#f1184c", "style": "plain", "template": "💫", "type": "text" } ], "type": "prompt" } ], "console_title_template": "PowerShell", "final_space": true, "transient_prompt": { "background": "transparent", "foreground": "#FFD700", "template": "{{if .Root}}\u26a1 {{end}}💫 " }, "version": 2 }

2022/9/3
articleCard.readMore

Kaggle比赛RSNA-2022骨折检测

记录一下第一次认真参加Kaggle比赛 比赛链接:https://www.kaggle.com/competitions/rsna-2022-cervical-spine-fracture-detection 等待更新☺️

2022/9/1
articleCard.readMore

CloudComPy库安装

下载链接:https://www.simulation.openfields.fr/index.php/download-binaries 官方教程:https://github.com/CloudCompare/CloudComPy/blob/master/doc/UseLinuxCondaBinary.md Installing, testing and using a CloudComPy binary on Linux, with conda 🚫 建议切换SHELL为bash 🚫 我在zsh上安装失败,切换bash成功 先下载 CloudComPy_Conda39_Linux64_-date-.tgz here GLIBC版本需要2.29以上。 检查GLIBC版本: 1 ldd --version 必须先更新conda 1 conda update -y -n base -c defaults conda 新建一个conda环境 1 conda create --name CloudComPy39 python=3.9 安装需要的包 1 2 3 4 conda activate CloudComPy39 conda config --add channels conda-forge conda config --set channel_priority strict conda install "boost=1.72" "cgal=5.0" cmake ffmpeg "gdal=3.3" jupyterlab "matplotlib=3.5" "mysql=8.0" "numpy=1.22" "opencv=4.5.3" "openmp=8.0" "pcl=1.11" "pdal=2.3" "psutil=5.9" "qhull=2019.1" "qt=5.12" "scipy=1.8" sphinx_rtd_theme spyder tbb tbb-devel "xerces-c=3.2" 如果遇到Solving environment: failed with initial frozen solve. Retrying with flexible solve. 可以尝试重新新建一个conda环境 如何使用: 不能用conda activate <env>需要使用 CloudComPy39/bin/condaCloud.sh 替代 将<path install>替换成你的CloudComPy39的目录 1 . <path install>/bin/condaCloud.sh activate CloudComPy39 Remark: 可能需要安装 libomp.so.5: 1 2 sudo apt-get install libomp5 测试所有项目(大约需要2分钟): 1 2 3 . <path install>/bin/condaCloud.sh activate CloudComPy39 cd <path install>/doc/PythonAPI_test ctest 测试会输出到这里: ${HOME}/CloudComPy/Data 在vscode上编辑 如果直接打开在vscode的话就无法import cloudComPy 正确的做法是 1 2 . <path install>/bin/condaCloud.sh activate CloudComPy39 code -g <folder to edit> 官方文档 https://www.simulation.openfields.fr/documentation/CloudComPy/html/index.html 一些小细节 读取CloudComPy的点云数据 和open3d不太一样,读取点云数据有两种选择 需要去修改点云的位置时用toNpArray() 复制出点云的点时用toNpArrayCopy() 给CloudComPy点云上色 当前版本(2.12)好像存在一些问题,建议转成open3d的数据类型后再添加颜色🤨

2022/8/30
articleCard.readMore

Pandas的数据操作

最近在打Kaggle,遇到很夸张的数据预处理。 平时每次要用pandas都是现翻文档,感觉太慢,以后用到什么pandas的函数就在这里记录一下😘 提取数据 loc、iloc、ix 都是对DataFrame类的方法。 loc:通过选取行(列)标签索引数据 iloc:通过选取行(列)位置编号索引数据 ix:既可以通过行(列)标签索引数据,也可以通过行(列)位置编号索引数据

2022/8/30
articleCard.readMore

齐次坐标系的理解

在计算机图形学里面会经常碰到几何体的平移,旋转,缩放以及投影变换. 一般情况下会涉及到齐次坐标与变换矩阵. 为了后续对变换矩阵内容的讲解, 在这里先简要的介绍一下什么是齐次坐标. 提出问题 两条平行线可以相交吗? 在欧氏空间(几何学)中,同一平面上的两条平行线不能相交,或者说不能永远相交。这是一个大家都熟悉的常识。 但是,在投影空间中就不一样了,比如,下图上的火车铁路在远离眼睛的时候会变得更窄。最后,两条平行的铁轨在地平线处相交,也就是无限远处的一点。 铁路变窄,在地平线处相交 欧氏空间(或笛卡尔空间)能很好地描述我们的2D/3D几何,但它们不足以处理投影空间(实际上,欧氏几何是投影几何的一个子集)。一个2D点的笛卡尔坐标可以表示为\((x,y)\)。 如果这个点远去到无穷远呢?无穷远处的点在欧氏空间中无法具体展示。在投影空间中,平行线会在无穷远处相遇,但在欧氏空间中却做不到。 解决方法 由 August Ferdinand Möbius(不错,就是那个莫比乌斯圈的那位) 提出的齐次坐标,使图形和几何学的计算在投影空间中成为可能。齐次坐标是用\(N+1\)个数来表示N维坐标的一种方式。 要制作二维齐次坐标,我们只需在现有坐标中增加一个额外的变量w。因此,笛卡尔坐标中的一点,\((X,Y)\)在齐次坐标中就变成了\((x,y,w)\)。而笛卡儿坐标中的X和Y在齐次坐标中的\(x\)、\(y\)和\(w\)则重新表达为 \[\begin{aligned}X = \frac{x}{w} \\ Y = \frac{y}{w}\end{aligned}\] 为什么叫 “齐次”呢? 如前所述,为了将齐次坐标\((x,y,w)\)转换为笛卡尔坐标,我们只需将\(x\)和\(y\)除以\(w\)即可。 \[(x, y, w) \Leftrightarrow \Big(\frac{x}{w}, \frac{y}{w}\Big)\] 将Homogeneous转换为Cartesian,我们可以发现一个重要的事实。让我们看看下面的例子。 \[\begin{aligned}Homogeneous& \quad Cartesian& \\(1, 2, 3)\ &\Rightarrow \Big( \frac{1}{3}, \frac{2}{3} \Big)& \\(2, 4, 6)\ &\Rightarrow \Big(\frac{2}{6}, \frac{4}{6} \Big)& &=\Big(\frac{1}{3}, \frac{2}{3}\Big) \\(4, 8, 12)\ &\Rightarrow \Big(\frac{4}{12}, \frac{8}{12} \Big)& &=\Big(\frac{1}{3}, \frac{2}{3}\Big) \\&\;\;\vdots \\(1a, 2a, 3a)\ &\Rightarrow \Big(\frac{1a}{3a}, \frac{2a}{4a} \Big)& &=\Big(\frac{1}{3}, \frac{2}{3}\Big) \\\end{aligned}\] 如你所见 \((1, 2, 3), (2, 4, 6)\)和\((4, 8, 12)\)这三个点对应于同一个欧氏点\((\frac{1}{3}, \frac{2}{3})\). 而任何乘以\(a\)的数\((1a,2a,3a)\)与欧氏空间中的\((\frac{1}{3},\frac{2}{3})\)是同一个点。因此,这些点是 “homogeneous/齐次 “的,因为它们在欧氏空间(或笛卡尔空间)中代表同一个点。换句话说,齐次坐标是与乘数\(a\)不相关的。 Homogeneous2Cartesian.jpg 数学证明: 两条平行线可以相交 考虑以下欧氏空间的线性系统。 \[\left \{ \begin{array}{c}Ax+By+C=0 \\ Ax+By+D=0\end{array}\right.\] 而我们知道,由于C≠D,所以上述方程没有解。 如果C=D,那么两条线是相同的(重叠的)。 让我们重写投影空间的方程,将x和y分别替换为x/w,y/w。 \[\left\{\begin{array}{l}A \frac{x}{w}+B \frac{y}{w}+C=0 \\ A \frac{x}{w}+B \frac{y}{w}+D=0\end{array} \quad \Rightarrow\left\{\begin{array}{l}A x+B y+C w=0 \\ A x+B y+D w=0\end{array}\right.\right.\] 现在,我们有一个解,\((x,y,0)\),因为\((C-D)w=0,\therefore w=0.\) 因此,两条平行线在\((x,y,0)\)处相交. \((x,y,0)\)在几何上代表一条没有起点与终点, 也没有长度的射线,它只有方向。 齐次坐标的应用 齐次坐标在计算机图形学中是非常有用的基本概念,通过增加一个额外的维度\(W\)后,可以用来对几何体进行缩放,旋转,平移,透视投影的矩阵变换. 任何\(N\)维度齐次坐标,只要\(W\)不为\(0\),都可以通过将每一个分量除以\(W\)来转换到 \(W=1\)的向量, 然后获得其\(N-1\)维的欧式空间的点值。 而当\(W=0\)时,这个坐标表示无限长的一个向量,通常表示\(N-1\)维的矢量。

2022/8/26
articleCard.readMore

NgeNet论文理解

由于点云传统配准(ICP:迭代最近点算法)效果不佳,于是考虑使用深度学习的方法。 这里采用NgeNet。 Neighborhood-aware Geometric Encoding Network 邻域感知几何编码网络 论文链接:https://arxiv.org/abs/2201.12094 Introduction 点云配准深度学习方法的分类 作者将其分为了两种 end-to-end:将feature learning 和 transformation estimation 融合到了一个模型 其中有一些方法依赖相关性的建立来进行后续的Procrustes分析 而其他方法则更关注点云之间的全局特征 feature-learning:更加关注learning of discriminative point feature(学习辨别性的点的特征),而transformation则是由pose estimators来估计的 提出网络 NgeNet利用多尺度结构明确地生成具有多种邻域大小的点状特征,并利用几何指导的编码模块来最大限度地利用几何信息。具体来说,设计了一个投票机制,为每个点选择一个合适的邻域大小,并拒绝在无法区分的表面上出现虚假的特征。 主要贡献 多尺度结构与几何引导编码相结合,产生多层次的几何和语义信息编码的特征。 多层次的一致性投票,为每个点选择适当的邻域并拒绝虚假的邻域。 我们的方法中所提出的技术是与模型无关的,能够很容易地移植到其他骨干结构上并提高性能。 Preliminaries (引言) 点云配准问题的数学表达 arg 是变元(即自变量argument)的英文缩写。 arg min 就是使后面这个式子达到最小值时的变量的取值 arg max 就是使后面这个式子达到最大值时的变量的取值 例如 函数F(x,y): arg min F(x,y)就是指当F(x,y)取得最小值时,变量x,y的取值 arg max F(x,y)就是指当F(x,y)取得最大值时,变量x,y的取值 \[arg\ \underset{T}{\mathrm{min}}\frac{1}{|\sigma|}\sum_{(i, j)\in \sigma}||T (x_i ) − y_j ||_2\] Cardinal Number(基数):集合论中刻画集合大小的数 邻域分析 在特征学习中常常用到encoder-decoder网络来提取特征; 模型的输入为\(X\in\mathbb{R}^3\) 维数从\(N\times 3\) -> $N C $意思是每个点输出C维的特征 有两种方式去影响领域的范围一个是依靠连续的卷积层,隐形的增加了领域的范围;另一个是在encoder-decoder网络中常常使用两倍大小的分层卷积层来模拟点云的down sample。 方法 网络 NgeNet的网络架构 可以很清楚的看到NgeNet是一个encoder-decoder网络 - encoder模块由:residual-style KPConv/strided KPConv层、instance norm层和Leaky ReLU层(k=0.1)组成 KPConv 是用于三维点云中的一种卷积方式 decoder模块由:decoder中的上采样块采用最近搜索来进行特征插值。 unary block由一个线性(MLP)层、一个实例范数层和一个 Leaky ReLU 层 (k=0.1) 组成,而last unary block仅由一个线性层(MLP)组成 Input是什么? Input为the source point cloud \(X\) and its initial descriptor \(F_X\) , the target point cloud \(Y\) and its initial descriptor \(F_Y\) 其中\(F_X\) and \(F_Y\) 都被init为全部为\(1\)的矩阵 组成部分 SIAMESE MULTI - SCALE BACKBONE 连体式多级骨干(什么鬼翻译 用途:用于处理输入的点云 如何工作? Shared Encoder:可以在绿色的Encoder部分看到一共做了四次卷积;这样做是为了拓展领域特征。此时一共有四个输出,最后的输出得到Super points \(X'\) (\(X'\)集合会在下文经常提到其中包括他的点\(x'_i \in X '\))和它的feature \(F^{en}_{X'}\)(我理解上标的en意思是end;最后一个输出);前三步输出的feature作为中间变量也被保存了下来,为了decoder去生成multi-scale的feature。这三个中间变量被记为\(F^1_{X}, F^2_{X}, F^3_{X}\)。这里需要注意的是,每个点特征的邻接点的感知范围从\(F^1_X\)延伸到\(F^3_{X}\) (最后一句话是KPConv的知识) 最后Shared Encoder输出的是\(X' \in \mathbb{R}^{N' \times 3}\) 和\(F^{en}_{X'} \in \mathbb{R}^{N' \times D_{en} }\) ,加起来是应该是\((X', F^{en}_{X'}) \in \mathbb{R}^{N' \times (3+D_en)}\)(有待考证) Parallel Decoder:上面说在decoder的时候需要用到我们刚才保存的\(F^1_{X}, F^2_{X}, F^3_{X}\),同时还有之后会介绍的\(F^{inter}_{X'}\),一共这四个输入。最后得到的output是关于\(X'\)的高、中、低级别的feature 现在我们定义一个函数(后面要用) \[\phi (F^1 , F^2 , g) = cat[Up(g(F^2 )), F^1 ]\] 其中\(F^1\)和\(F^2\)是输入的feature,\(g\)是一个代表MLP或者Identity Layer的函数, \(cat\)表示concatenation(拼接矩阵),\(Up\)是nearest upsampling 现在可以表示 \(F^l_X , F^m_X\) 和 \(F^h_X\) 的计算方式 \[\begin{split}F^l_X &= MLP_2(\phi(F^1_X, F^2_X, MLP_1), \\F^m_X &= MLP_5(\phi(F^1_X, \phi (F^2_X, F^3_X, MLP_3), MLP_4), \\F^h_X &= MLP_8(\phi(F^1_X, \phi (F^2_X, \phi (F^3_X, F^{inter}_X, Identity), MLP_6), MLP_7 ).\end{split}\] 同时给出overlap(重复性)分数\(O_X\)和saliency(显著性)分数\(S_X\) GEOMETRIC - GUIDED ENCODING 几何学引导式编码 GGE模块是一个 一个输入一个输出的模块 GGE模块 用途:GGE将super points和潜在的feature(也就是Shared Encoder输出的\((X', F^{en}_{X'}) \in \mathbb{R}^{N' \times (3 + D_{en})}\))作为输入;然后输出几何增强后的feature 如何工作? Normal vectors smoothing:这里计算Normal vector的方式比较特别。这一步的目的是去获得super points的Normal vector,但是他没有直接去用open3d的库直接计算。而是将super points的点映射回原来的全部点集中。再通过全部点集中,super points周围点的normal vectors去平均得到super points的normal vector。 \[N_{X_i^{'}}=\frac{1}{|J_i^N|}\sum_{x_j \in J_i^N}{N_{X_j}}\] 公式里面\(J_i^N = \{x_j| \left|| x_j-x'_i \right|| < r^N \}\) 其中\(x_j\in X\),\(r^N\)是\(x'_i\)的邻域。 稍微解释一下公式: \(N_{X'_i}\)是我们想要的\(X'\)的normal vector的集合 \(J^N_i\)代表得是点\(x_i\)邻域内的点 Geometric encoding:这里我们想要的是每个点的几何特征,记为\(G_{x'_i}\),利用PPF(Point Pair feature)去计算几何特征 \[\begin{equation}\begin{split}PPF(x'_i, x'_j) &= (\angle(x'_j-x'_i, N_{x'_i}), \angle(x'_j-x'_i, N_{x'_j}), \angle(N_{x'_i}, N_{x'_j}), \left|| x'_i - x'_j\right||_2), \\G_{x'_j} &= f_1(x'_i, x'_j-x'_i, PPF(x'_i, x'_j)), \\G_{x'_i} &= max\{ G_{x'_j}|x'_j \in J^G_i \}.\end{split}\end{equation}\] 公式里面\(\angle(\cdot, \cdot)\in(0, \pi)\) 代表两个向量之间的夹角, \(f_1\)是pointnet里的一个函数, \(J^G_i = \{x'_j \left|| x'_j-x'_i\right||<r^G\}\),\(r^G\)是\(x'_i\)邻域的半径,\(max(\cdot)\)意思是channel-wise max-pooling 这个公式也解释一下: PPF我这里理解的就是一个四维向量包含了(按照NgeNet的顺序),一个法向量和{两个法向量之间的向量d}的夹角,另一个法向量和{两个法向量之间的向量d}的夹角,两个法向量的夹角,两点之间的距离。对应下图的\((F_2, F_3, F_4, F_1)\) 原论文的图片 \(f_1\)函数:暂时不清楚什么意思 \(G_{x'_i}\):找到\(G_{x'_j}\)中最大的;至于channel-wise再点云中代表什么几何含义,暂时不清楚 Semantic encoding:需要更新 损失函数 这里我们将损失函数从两个方面来看:特征损失 和 重叠与显着性损失 特征损失 这里说的特征损失,就是我们之前提到的\(F^h_X, F^m_X, F^l_X, F^h_Y, F^m_Y, F^l_Y\) 两个点云三个类别的特征。 重叠与显着性损失 投票机制 为什么要投票 不同级别的特征 在Parallel Decoder我们强调了,在每一次计算特征的时候,我们都保存下来了那些中间变量;他们是\(F^l_X\) 和\(F^m_X\) ,最后的输出是\(F^h_X\) 。 此时它们三个分别可以决定哪些source的特征点和target的特征点可以一一对应。那么每一个特征点都会存在三种方案。所以需要通过投票决定使用哪一种。 如何投票 投票算法

2022/8/25
articleCard.readMore

2023年必装的Windows软件

更新于 2023/02/15 ⚒️生产力 平时学习、Coding、内容生产必备工具 Adobe 全家桶 可以去微博关注@Vposy下载破解版 Visual Studio Code:文本编辑器 网页版:vscode.dev 生产力插件 Markdown All In One Markdown Preview Enhanced 需要安装Pandoc 美化插件 Rainbow Brackets OBS:非常强大的开源录屏软件 可能需要配置。待补充 office tools PowerToys Diskitude:只有10kb的磁盘分析工具 Diskitude 非常必要!!! 很小巧,磁盘满的时候可以用这个删除大文件 使用方法 双击打开 选择磁盘or文件夹 左键打开文件夹,右键在Diskitude内拓展。 Starship:比oh-my-posh更好用的windows terminal美化软件 配置截图 另附我的配置文件 Auto Dark Mode 配合Wallpaper Engine(壁纸引擎)可以实现自动切换动态壁纸 Start All Back 软件截图 想要Win11的动画,又想要win10的菜单🥰 (小孩子才做选择,成年人全都要 Eagle 这辈子买过最亏的软件。素材管理不如直接文件夹,对我来说唯一有点用的可能就是字体管理了。 😍 娱乐 听歌、电影、打游戏 PotPlayer:最强播放器不接受反驳 需要手动配置。待补充 Spotify:国外音乐流媒体软件 具体教程可看我b站视频

2022/8/25
articleCard.readMore