记一次抢救被 force push 的 GitHub 仓库
就在刚刚,我一个误操作,在没有本地备份的前提下,force push 了一个 GitHub 上的仓库。万幸最后恢复成功,数据拿回来了。惊魂未定之余,在此记录我的抢救过程以供参考。 前景提要在闲逛 GitHub 的时候,发现了一个叫 snk的项目,可以在我的 profile readme 里面放个贪吃蛇,遂照着它的 example with cron job抄了一个 workflow 过来。但是这里我自作聪明地想着把东西全放在 master 上,就把 38 行的 target_branch 改成了 master。结果一运行吓一跳,我的 README.md 没了,仓库只剩下 snk 生成的 svg 文件。这不行啊,我花了好久的时间才整出来的东西,不能说没就没啊!于是赶紧开始网上冲浪,看怎么抢救被 forc..
更多让 nohup 不输出 appending output to 'nohup.out'
在使用 nohup 的时候,它总会打印一条 nohup: appending output to 'nohup.out' 这样的信息,并且必须敲一下回车。 因为 nohup: appending output to 'nohup.out' 这条信息是打印到 STDERR 的,所以解决的方法很简单,把 STDERR 重定向至 STDOUT 就可以了,比如这样: 1nohup doSomething > nohup.out 2>&1 &
更多使用 SSH config 简化 SSH 连接
如果你有很多的服务器要连接,如果对你来说记住那些服务器的地址、端口实在是一种痛苦,如果你一直在寻找一种能够简化在命令行下连接 SSH 服务器的办法,那么,本文将给你提供一种解决问题的思路,那就是,使用 SSH 的 config 文件。 SSH config 文件是什么Open SSH 客户端配置文件,允许你以配置项的形式,记录各个服务器的连接信息,并允许你使用一个定义好的别名来代替其对应的 ssh 命令参数。 SSH config 文件该怎么用创建 SSH config 文件通常来说,该文件会出现在两个地方,一个是 /etc/ssh/ssh_config,一个是 ~/.ssh/config。 /etc/ssh/ssh_config 文件通常用来定义全局范围上的 SSH 客户端参数,而 ~/.ssh/c..
更多在 Spring Boot 应用中启用 HTTPS
在 application.yml 中添加如下配置,即可在 Spring Boot 项目中开启 HTTPS。 12345678910111213server: # 如果有需要的话,配置应用监听HTTPS的默认端口 port: 443 ssl: # 我把证书放在了 resources/cert/certificate.pfx下 # 使用时需要按照实际情况修改下面的路径 key-store: classpath:cert/certificate.pfx key-store-password: pA55w0Rd # 证书类型需要按照实际类型填写 # 本例使用PKCS12格式,所以写PKCS12。如果是JKS格式,那么需要填写JKS # 因为PKCS12比JKS有更..
更多在 Spring 中通过配置类注入配置文件的值
我们在开发过程中,为了保证项目的灵活性,经常会选择将一些值放在配置文件中,并在代码中将它注入并使用。将值注入代码最常见的一种方法,则是使用 @Value() 注解搭配 SpEL 直接注入我们需要的属性。但是鲁迅先生有云:从来如此,便对吗?这里,我想介绍一个我个人认为更好的实践:通过配置类来注入属性的值。 旧的做法有什么问题假设我们现在有这样一个 application.yml,其中 credentials 部分是我自定义的一个属性: 12345server: port: 9999credentials: token: A_VERY_SECRET_TOKEN 然后,我们会在用到它的地方,直接通过 @Value 注解把它注入进来,就像这样: 123456@Componentpublic class ..
更多Shell 脚本中 set -ex 命令的作用
刚刚学会了一个很实用的 shell 命令 set -ex,在这里分享一下。 稍有常识的人都能看出,这是 set 命令加上了 -e 和 -x 两个参数 (废话么这不是)。那么,我就把这两个参数拆开,分别说一下它在脚本中的用处。 set -e先说说 set -e,这个参数的含义是,当命令发生错误的时候,停止脚本的执行。 通常来说,我们会习惯于使用 && 来实现这样的功能,比如: 123#!/bin/bashecho 1 && rm non-existent-file && echo 2 但是,写成一行呢,可读性有点差,分成多行的话,也得注意换行符 \ 和 && 号,我就有过好几次忘了加这俩东西,还是挺麻烦的是吧。 更麻烦的是,&&a..
更多分环境为 Git 指定单独的配置
有的小伙伴,在公司需要使用公司的 Git 来干活,同时自己也有些托管在 GitHub 等其他仓库的代码,在这种情况下会有一个烦恼,就是怎么样在多个仓库之间使用不同的配置。比如在公司仓库和个人仓库之间使用不同的身份信息,或者在公司仓库和个人仓库之间,使用不同的 GPG 签名。 在 2.13 版本之前,大概你就只能单独为每一个仓库单独设定这些信息了,但是,在 2.13 这个版本中,Git 引入了一个名为 “按条件引入”(Conditional includes) 的功能。这个功能允许用户通过指定一定的条件,来使 Git 从不同的配置文件中取得配置项。 准备工作“按条件引入” 功能可以根据目录或者分支来决定使用哪个配置,显然根据分支无法区分工作环境和私人环境,所以首先需要分别为工作环境和私人环境创建各自的目..
更多使用 Tailscale 部署虚拟局域网
最近折腾了下用 Tailscale 搭建虚拟局域网,在这里记录一下折腾的过程和一些心得。 什么是 Tailscale说起 Tailscale,就不得不提到最近很火的 Mesh VPN 这个概念。 经典的 VPN 是作为一个网关,让外网用户通过它来访问内网。比如传统的 L2TP VPN: 但是 Mesh VPN 提出了一种全新的拓扑结构,这种结构中每个节点之间都相互连接,不再存在中心的 VPN 服务器。 上图提到的 Wireguard 就是一个 Mesh VPN 的实现,但是 Wireguard 配置比较繁琐,维护成本也比较高,所以 Tailscale 在基于 Wireguard 的基础上做了一些优化,比如用于 NAT 穿透的 DERP 协议、建立了公网 coordinator 服务器用于下发配置,..
更多配置 Caddy 作为静态网站服务器和前置代理
之前听闻有个新的 Web Server,名曰 Caddy,其配置简单,还默认启用 HTTP/2,并且可以自动申请 Let’s Encrypt 的 HTTPS 证书。试用了一番,觉得不错,便把这个博客的服务程序换成了 Caddy。在这里呢,记录一下安装和配置的过程。 安装万事第一步,先安装。 下载页面概览打开 Caddy的下载页面,页面的内容简洁明了,左侧是 4 个要配置的项,右侧是每个配置项实际的内容。 选择运行平台首先,选择好 Caddy 要在哪个操作系统下运行。Caddy 支持的平台还是足够多的,而且覆盖到了主流的操作系统,所以甭管您是 Windows,还是 Linux,抑或是 BSD,都可以运行 Caddy。因为我的服务器运行的是 64 位 Ubuntu,所以选择 Linux 64-bit。 ..
更多追根究底:不打开 DevTools 时,console.log 会不会内存泄漏?
TL;DR:会。并且虽然 Chromium 有试图做限制,但因为方法不合适所以并没能解决问题。JavaScript 的内存泄漏原因有很多,例如 DOM、计时器、闭包、意外的全局变量,以及本文的主题:console.log。关于 console.log 会不会造成内存泄漏,掘金上面有大佬发过两篇文章:千万别让 console.log 上生产!用 Performance 和 Memory 告诉你为什么console.log 一定会导致内存泄漏?不打开 devtools 就不会这两篇文章的结论是:在打开 DevTools 时一定有泄漏(文中的代码很显然可以证明),但如果没打开 DevTools,似乎就不会有问题了(文中 performance 的数据也可以证明)。但我结合自己之前的经验,产生了一个疑惑:如果不会..
更多