随手记
约 8826 字大约 29 分钟
2025-01-10
vscode 安装 go tools
go tools 是 go 语言提供的一些工具,首先安装 Go 插件,使 vscode 能支持 go 语言。接着在 IDE 的顶部点击查看
->命令面板
或者输入ctrl+shift+p/a
也能打开命令面板,输入Go:Install/Update Tools
,然后选择所有选项,就会自动安装 go tools,等待安装完成即可,工具被安装在$GOBIN
目录。
总共 7 个工具:
- gopls: Go 语言服务器,智能补全/跳转等
- dlv: Delve,Go 调试工具
- goimports: 自动格式化并添加/移除 import
- goreturns: 类似 goimports,可自动生成 return
- staticcheck: 静态代码分析工具
- go-outline: 支持代码大纲视图
2025-06-15 05:47
虚拟机磁盘/Ubuntu分区扩容
使用 VMware 虚拟机,安装了 Ubuntu 系统,可能发现刚开始分配的磁盘不足(仅20G),此时就需要扩容(到30G)。
扩容磁盘
1.关闭虚拟机。
2.编辑虚拟机,增加磁盘容量,然后启动虚拟系统。
3.进系统后输入
lsblk
,查看磁盘分区情况。NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 30G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1.8G 0 part /boot └─sda3 8:3 0 8.2G 0 part └─ubuntu--vg-ubuntu--lv 252:0 0 8.2G 0 lvm /
可以看到虚拟机磁盘
sda
总共有 30G,分为三个分区sda1
、sda2
、sda3
,但这三个分区加起来也只有10G(1M+1.8G+8.2G),说明原本的 20G 磁盘中有 10G 是没分配的,并且增加的 10G 磁盘也还没有分区。4.
sudo fdisk -l /dev/sda
查看未分配空间。5.安装分区工具
sudo apt update && sudo apt install cloud-guest-utils -y
。6.
sudo growpart /dev/sda 3
这会把sda3
分区结尾扩展到磁盘最大容量。此时使用lsblk
查看:NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 30G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1.8G 0 part /boot └─sda3 8:3 0 28.2G 0 part └─ubuntu--vg-ubuntu--lv 252:0 0 8.2G 0 lvm /
可以看到
sda3
分区扩大到整个磁盘了,但是根分区ubuntu--vg-ubuntu--lv
仍然没变。扩容根分区
1.sudo pvresize /dev/sda3
扩展 LVM 物理卷。
2.sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
扩展逻辑卷(根分区 /)。
3.sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
扩展文件系统(ext4格式用,ubuntu系统通常是这个),如果是 xfs 格式用sudo xfs_growfs /
,这让系统能使用新空间。此时使用lsblk
查看:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 28.2G 0 part
└─ubuntu--vg-ubuntu--lv 252:0 0 28.2G 0 lvm /
可以看到根分区ubuntu--vg-ubuntu--lv
已经使用 sda3 分区整个空间了。
2025-06-14 23:47
Git 配置仓库用户名和邮箱
为某个仓库设置单独的用户名和邮箱,需要在仓库根目录执行以下命令:
git config user.name "YourName"
git config user.email "you@example.com"
查看配置git config --local --list
,或者只查看邮箱git config user.email
。这个设置被保存在<本地仓库路径>/.git/config
文件中。
2025-06-14 20:32
OpenWrt UCI 配置操作函数
在/etc/init.d/*
下的脚本中如果想使用配置如何做呢?这就需要 UCI 配置操作的几个函数config_load
、config_foreach
、config_get
,见名知其意,大概知道函数的意思,但如何使用需要详细了解下。
例如脚本中存在这么一段:
start_instance () {
local section="$1"
config_get path "$section" 'path'
config_get port "$section" 'port'
service_start /usr/bin/svnserve -d --listen-port ${port} -r ${path}
}
start() {
config_load 'subversion'
config_foreach start_instance 'subversion'
}
config_load: 读取
/etc/config/*
下指定名称的文件,如config_load 'subversion'
即是读取/etc/config/subversion
文件,文件内容示例:subversionconfig svn option path '/srv/svn/repos' option port '3690' config pdd svn1 option path '/srv/svn/repos/clash-meta'
其中每一段表示为一个
section
,上述配置有 2 个 section;而svn
和pdd
表示section_type
,section_type 后面是section_name
它必须是唯一值,如果没有指定 section_name 则表示为匿名 section,会自动分配一个唯一 id 作为它的 name。config_foreach: 语法为
config_foreach <function> <section_type>
,遍历指定类型的 section,对每个 section 执行指定的函数。例如:# 遍历所有 section_type 为 svn 的 section,则 pdd 的 section 就不会被遍历 config_foreach start_instance 'svn'
config_get: 使用语法为
config_get <var> <section_name> <option> [<default>]
,var
是将读取的值用一个变量存储,section_name
是指定的段名,option
是 section 下的 option 名称,default
是当 option 不存在时的默认值。例如:# 加载配置文件 config_load 'subversion' # 读取名称为 svn1 的 section 下,option 为 port 的值,如果没有则默认为 8080,并将值存储在变量 p1 中 config_get p1 svn1 'port' 8080 config_foreach start_instance 'svn' # 这是提前定义的一个函数 start_instance () { # 系统会自动把 section_name 作为第一个参数传入。但这里 section_type 为 svn 的 section 是一个匿名的段,则分配的随机 id 可能为 cfg0a1b23 local section="$1" # cfg0a1b23 config_get path "$section" 'path' }
2025-06-06 04:41
Windwos 安装 SVN 客户端
可以上Apache Subversion下载二进制包,亦或者上TortoiseSVN(推荐)下载,Windows 上最常用的就是这个了。
在安装TortoiseSVN
的过程中要注意一点,Command Line Tools
默认不会安装,但需要勾选安装,这样在安装完成后会在C:\Program Files\TortoiseSVN\bin
目录下出现svn.exe
,然后就可以在其他代码编辑器中配置 SVN 插件了。
2025-06-05 17:35
编辑远程 Linux 文件
由于经常需要编辑 OpenWrt 系统上的文件,终端上编辑器不好用,下载编辑后再上传又麻烦。如果有一款工具可以连接远程主机,然后像 Windows 文件管理器那样可视化查看,双击编辑,保存就生效,那就需要WinSCP。
使用很简单,点击新建站点
,文件协议
选择SCP
,输入主机名
、用户名
、密码
,端口默认22
,然后连接即可。可以在选项
->编辑器
中配置外部编辑器为 VSCode。
2025-06-05 16:47
Windows11 设置加密 DNS
由于家里有 IPv6 的动态公网,做了 DDNS 解析,一开始好好的,一段时间后突然就发现连接不通了。首先检查域名托管商那的记录,发现记录的 IPv6 是最新地址,没毛病。然后通过ping <子域名>
发现返回的 IPv6 地址是旧的,这自然就不会通。但是用nslookup <子域名>
发现返回的 IPv6 地址是最新的,那么访问应该是没问题的。可我这是家宽啊,又不过 GFW,不应该是域名被墙了。由于我把主域名和泛域名解析的是同一地址,于是试了下ping <主域名>
发现返回的是最新的地址,再ping <子域名>
呢?仍然返回旧地址,说明运营商的 DNS 服务器没问题,就是单纯的把我子域名通过 DNS 污染了,解决方法到也简单,设置加密 DNS 即可。
打开设置
->网络和 Internet
,选择已连接
的网络->属性
,在DNS 服务器分配
一栏点编辑
。
默认是自动(DHCP)
意思就是说自动给的 DNS 服务器地址是 DHCP 服务器的地址,那么 DHCP 服务器是谁呢?简单来说就是谁分配 IP 谁就是 DHCP,对局域网来说这个 DHCP 就是路由器,但是路由器可以帮你做内网的地址交换,你如果请求的是一个互联网地址,它就只能把这个地址继续向上级请求,这里上级就是运营商的 DNS 服务器了,所以运营商就会在这个环节使坏,给一个错误的 IP 地址导致通过域名请求不通。
所以我们得改成手动
,因为我的域名只做了 IPv6 的地址解析,理论上来说改一下 IPv6 的 DNS 地址就可以了,不过为了隐私安全,最好还是连 IPv4 也设置下。
IPv4:
首/备选 DNS | DNS over HTTPS | DNS over HTTPS 模板 | 说明 |
---|---|---|---|
223.5.5.5 | 开(手动模板) | https://dns.alidns.com/dns-query | 阿里公共加密DNS |
119.29.29.29 | 开(手动模板) | https://doh.pub/dns-query | 腾讯公共加密DNS |
IPv6:
首/备选 DNS | DNS over HTTPS | DNS over HTTPS 模板 | 说明 |
---|---|---|---|
2400:3200::1 | 开(手动模板) | https://dns.alidns.com/dns-query | 阿里公共加密DNS |
2402:4e00:: | 开(手动模板) | https://doh.pub/dns-query | DNSPod加密DNS(腾讯系的) |
注意,2402:4e00::
这个并没有写错,看起来像是不完整,因为 DNSPod 它又很多 DNS 地址,这里写的是一个范围。
经过上述设置后,再ping <子域名>
已经可以返回最新的 IP 了,但整体速度很慢,大约 3~5 秒才响应,这个其实是运营商对我的 IPv6 访问限速了。不过对我来说问题不大,只要能通就行,毕竟这是一个非常低频的动作。
我的回家方式是,通过域名(IPv6)访问到家里路由器 WAN 网卡的固定端口,在这个端口上有一个反代服务指向了内网的一个 HTTP 服务,然后通过 HTTP 返回就能获取到 IPv4 的回家节点,之后全程用 IPv4 就可以满速回家了。
2025-06-04 06:36
Windows11 设置局域网代理
按Win + R
打开运行,然后输入inetcpl.cpl
在打开的面板中选择连接
->局域网设置
,在代理服务器
下手动设置地址和端口。
2025-06-04 06:32
Windows11 管理软件开机启动
一部分软件安装后可能会默认开机启动,但我并不需要,这反而增加了开机耗时。一般软件设置中都有自启开关,但也有没有这个开关的软件,例如Tailscale
。
我们可以按Ctrl + Shift + ESC
打开任务管理器,在启动
(Win10)或启动应用
(Win11)一栏中可以看到软件的状态,已启用
表示已开机自自启、已禁用
表示已禁止开机自启。鼠标右键单击相应的软件即可启用
/禁用
。
2025-06-04 01:19
ThinkPad 安装 Win7 系统
这个 ThinkPad E545 edge 购于 2013年左右,算是古董级电脑了。搭载 APU A8-5550M 性能中下,英雄联盟都玩不了,很拉跨。但硬件又还是好的,浏览网页还是没问题的。于是选择Win7 企业版 SP1,一定要带 SP1 否则有些软件可能安装不了。目前很多软件已经不支持这么老的系统了,但是没办法,古董级运行Win10太吃力了。
写盘工具可以选择rufus-3.22最后一个支持 Win7 的版本,或者微PE工具箱V1.3(推荐)。
开机按F1
进入 BIOS,系统安装完成后会发现没有任何驱动,无法联网(有线/无线),无法识别U盘,这就蛋疼了。不过随后发现 USB3.0 需要驱动,但 USB2.0 不需要驱动,此时可以下载360驱动大师网卡版,然后插 USB3.0 接口安装,如果不行可以进入到 PE 系统,然后安装。
2025-06-04 01:03
小米本安装 Win10 系统
这个小米购于 2019-11-11,比较老的电脑了,系统卡顿。网上找各种精简版系统体验都不好,打算下载 LTSC 版本(企业长期支持版)。此版本主打稳定少变动,相比家庭版本来就会精简一些。考虑到我这小米本发售的时间段,设备配套的系统往往都是出厂版本是最流畅的,于是下载Windwos10 2019 LTSC。
当前有两块硬盘(0: 因特尔;1: 三星),三星是自带的,因特尔是加装的。Windows 系统安装到三星硬盘,因为英特尔硬盘还能安装黑苹果,但三星硬盘不能。
下载Rufu 标准版将系统写入 U 盘,然后电脑开机按F2
进入 BIOS 设置 U 盘启动,保存后再开机即可进入 U 盘开始刷机。
重新进入系统后,激活系统,然后win+r
输入sysdm.cpl
回车打开窗口,在上方 tab 栏中选择高级
->设置
,然后更改选项调整为最佳性能
,这样会停用系统在的一些动态效果,使用更流畅且省电。
2025-05-29 11:23
为仓库单独设置 Git 提交邮箱
在工程的.git
目录下找到config
文件,在其中添加,如:
[user]
name = Bobby
email = bobby@qq.com
2025-01-27 16:36
Docker Desktop 设置仓库镜像
// Docker中国区官方镜像
https://registry.docker-cn.com
// 中科大
//https://docker.mirrors.ustc.edu.cn/
// 网易
https://hub-mirror.c.163.com/
// 腾讯
https://mirror.ccs.tencentyun.com
打开Docker Desktop设置 > Docker Engine
默认情况下配置如下:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false
}
新增配置后如下:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
使用docker info
命令可以查看 Docker 配置。
2024-04-28 22:43
Windows 找到所有应用
打开文件资源管理器
(Win + E),然后在地址栏中输入shell:AppsFolder
,然后按回车键。
2024-04-28 15:15
Windows 添加小鹤双拼
新建文本文件,将以下命令粘贴到文本中保存,文件后缀修改为.reg
,然后双击执行。 注意,文本默认是以UTF-8
编码保存,在 Windows 系统中文会乱码,需要将文本编码修改为GBK
才能正常显示。
添加小鹤双拼:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\InputMethod\Settings\CHS]
"EnableExtraDomainType"=dword:00000001
"Enable Double Pinyin"=dword:00000001
"DoublePinyinScheme"=dword:0000000a
"UserDefinedDoublePinyinScheme0"="小鹤双拼*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt"
关闭小鹤双拼:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\InputMethod\Settings\CHS]
"EnableExtraDomainType"=dword:00000000
"Enable Double Pinyin"=dword:00000000
"DoublePinyinScheme"=dword:00000000
"UserDefinedDoublePinyinScheme0"=-
2023-03-24 00:15
Windows 去除快捷方式小箭头
新建文本文件,将以下命令粘贴到文本中保存,文件后缀修改为.bat
,然后以管理员权限运行。
去除小箭头:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer
pause
恢复小箭头:
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer
pause
2023-03-18 21:21
Git 暂存代码
当我们在某一个分支进行开发时,突然要修一个紧急故障,就需要切换到其他分支,如果直接切到另一个分支,就需要提交当前分支代码,可是半成品代码提交上去也不合适。 此时就需要将代码压入暂存区,然后就可以切换到其他分支,待修复完后再切回来,将暂存区的代码弹出。
# 压入暂存区
git stash
# 弹出暂存区
git stash pop
2022-12-20 23:07
fastjson 转换 double变 decimal
fastjson 避免实体转 json 对象时,double 类型变成 decimal 类型
public JSONObject toUnderlineObj(Object object) {
int disableDecimalFeature = JSON.DEFAULT_PARSER_FEATURE & ~Feature.UseBigDecimal.getMask();
return JSON.parseObject(toUnderlineStr(object), JSONObject.class, disableDecimalFeature, Feature.OrderedField);
}
2022-12-20 22:55
RabbitMQ 消费者单活
当启动了多个消费者实例时,如果只允许其中一个进行消费,需要在创建 queue 时需指定参数。 Activity status
处于single active
的实例可以消费,其他实例为waiting
状态,只能在single active
实例停止消费后,才会有一个可以消费。
Map<String, Object> args = new HashMap<>();
args.put("x-single-active-consumer", true);
channel.queueDeclare(name, isDurable, false, false, args);
2022-12-20 22:49
Go 判断 struct 是否实现接口
var _ Animal = (*Dog)(nil)
var _ Animal = new(Dog)
2022-12-17 18:06
Elasticsearch 批量操作
我们在进行 es 批量写时,通常会用到 bulk api,它的 operateType 支持 4 种:
- create:如果文档不存在就创建,但如果文档存在就返回错误;
- index:如果文档不存在就创建,如果文档存在就更新;
- update:更新一个文档,如果文档不存在就返回错误;
- delete:删除一个文档,如果要删除的文档id不存在,就返回错误;
需要注意的是,index 操作可以实现 upsert 效果,但是它的更新方式是,先删除原文档,然后再插入文档。如果我们只想更新给定的字段,而已存在文档其他未指定字段不动,就需要用到如下方式:
@Test
void testEsAdd() {
JSONObject body = new JSONObject();
body.put("name","Regan");
body.put("age",20);
JSONObject source = new JSONObject();
source.put("doc",body);
source.put("upsert",body);
QueryRequest request = new QueryRequest(HttpMethod.POST.name(), "index_bobby/test/1/_update");
request.setJsonEntity(JSON.toJSONString(source, SerializerFeature.DisableCircularReferenceDetect));
es.bulk(Collections.singletonList(request));
}
bulk 的 operateType 使用 update。
2022-12-17 18:03
Goland 中使用 go 工具命令
在使用 Goland(IDEA 安装 Go 插件也可)时,我们创建一个运行/调试配置
,选择Go构建
面板,其中有Go 工具实参
和程序实参
两项。 当我们在程序中使用 flag 接收启动指令的参数,应该写在程序实参
栏中,例如:--debug
、--env=dev
。 当我们需要从外部替换源文件中的变量值,使用的是 go build -ldflags 参数名,则应在Go 工具实参
栏中填写,例如:-ldflags "-X 'core.Version=1.1.1'"
。 当我们需要条件编译时,使用的是 go build -tags 参数名,则应在Go 工具实参
栏中填写,例如:-tags pro
。前提是源文件中第一行有//go:build pro
或+build pro
。 //go:build
与+build
的区别://go:build
写法是 Go 1.17 引入的,旨在替换+build
写法。为什么要采用新写法呢,看如下两个示例:
//go:build linux && amd64 || darwin
+build linux,amd64 darwin
这两种实现效果等价。显而易见的是,go:build
这种写法对开发来说更直观,同时也与//go:embed
和//go:generate
命令,格式上进行了统一。 很多时候我们会看到一个文件顶部,同时有这两种写法,主要是为了兼容 Go 1.17 以下的版本。
2022-12-17 17:18
Linux 环境变量设置
- 系统级:
/etc/profile
、/etc/bashrc(Ubuntu和Debian中是/etc/bash.bashrc)
、/etc/environment
- 用户级:
~/.profile(推荐首选)
、~/.bashrc
系统级的环境变量在每个用户登录时都会加载,用户级的环境变量只有在当前用户登录时加载。开发环境建议配置为用户级环境变量。 在 JDK 官网下载的 .deb 文件,安装是在/usr/lib/jvm/
目录下。 /lib
是内核级目录,/usr/lib
是系统级目录,/usr/local/lib
是用户级目录。安装 Go、Node、Maven 等开发环境时,可以将压缩包解压至/usr/local/lib
目录中,然后在~/.profile
文件中配置用户环境变量。 进行设置后,可运用source ~/.bashrc
命令更新.bashrc
,也可运用source ~/.profile
命令更新.profile
参考:linux中环境变量在哪个文件、bashrc与profile的区别
2022-09-12 14:23
Webstorm 终端运行 hexo 服务
npx hexo clean `&` hexo server
腾讯云 cloudBase 中的构建命令
npx hexo clean & npx hexo generate
2022-09-03 19:45
Windows11 开启 SMB
win+x
打开运行
,然后输入shrpubw
,根据提示创建共享目录。
安卓端使用Oplayer
播放器,IOS端使用nplayer
播放器比较方便使用,如果要输入密码,则是 windows 的登录账号、密码。
2022-09-03 17:24
解决 coding 不能拉代码
coding 配置 ssh 秘钥,配置个人公钥是可以对账号所有的代码仓库进行读写。团队公钥默认只读,可以设置读写。但根据官网提示,配置完秘钥后,执行ssh -T git@e.coding.net
还是提示没有权限。
解决方法:找到 git 的安装目录C:\Config\Git\etc\ssh
下的ssh_config
文件,用记事本打开,在末尾处添加:
# Added by git-extra
Host *.coding.net
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
保存关闭即可,再次输入:ssh -T git@e.coding.net
,然后即可拉取代码。
2022-09-02 22:53
Git 优雅合并分支
当存在多个分支需要合并时,例如,master
(主干分支),dev
(开发分支),直接使用merge
会导致主分支混乱,看起来不是一条直线,解决方式是使用rebase
,具体操作:
checkout dev
rebase dev onto master
checkout master
merge dev into master
2022-07-05 16:55
Deepin 创建桌面图标和启动器图标
创建桌面图标
当我们用压缩包解压安装某个应用软件的时候,例如 IDEA,解压完成后,在桌面上创建一个文件例如
IDEA-2022.1.desktop
,后缀为.desktop
,但可以用文本编辑器打开,打开后在编辑内容如下:[Desktop Entry] Categories=Application;Development; Comment=IntelliJ IDEA Ultimate 2022.1 Encoding=UTF-8 Exec=/opt/apps/idea-IU-221.5080.210/bin/idea.sh Icon=/opt/apps/idea-IU-221.5080.210/bin/idea.png Name=IDEA-2022.1 StartupNotify=true Terminal=false Type=Application X-Deepin-Vendor=user-custom
其中Comment
和Name
自定义名字,Exec
和Icon
选择为实际路径,其余保持默认。
创建启动器图标
sudo cp IDEA-2022.1.desktop /usr/share/applications/
2022-05-21 23:30
Deepin 卸载自带的 OpenJDK
dpkg -l | grep openjdk # 查看openJDK的安装列表
sudo apt-get remove openjdk* # 卸载
2022-05-12 21:44
Linux 下安装 Go 开发环境
从官网下载 tar.gz 压缩包,sudo tar -xvf 文件.tar.gz -C /user/local
,然后在/usr/local
下会有一个go
的目录。
官网推荐解压放在usr/local
目录下,而macos下安装也是会自动放在此目录下。然后在用户目录下创建一个go
目录,用来当作gopath路径。
2022-05-11 12:13
解决 .gitignore 文件无法忽略
方法一:清除 Git 本地缓存,使其改变成未 track 状态,然后再提交(使用时最好所有文件已经完全 push 了):
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push -u origin master # 提交到 master 分支
方法二(推荐):在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
git update-index --assume-unchanged PATH # 在PATH处输入要忽略的文件
原因:.gitignore
只能忽略那些原来没有被track
的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore
是无效的。想要.gitignore
起作用,这些文件必须不在暂存区中才可以,.gitignore
文件只是忽略没有被taged(cached)
文件。对于已经被staged
文件,加入.ignore
文件时一定要先从staged
移除,才可以忽略。
特别注意:若在使用.gitignore
文件之前,这个要忽略的文件已经被推送到了远程仓,如何删除远程仓的而保留本地的?
此时不可直接使用git rm directory
,因为这样会删除本地仓的文件。可以使用git rm -r --cached directory
来删除缓冲,然后再commit
和push
,这样会发现那个要删除的目录或文件,在远程仓中就没有了,之后可以直接使用git add -A
来添加修改的内容,上传的文件就会受到.gitignore
文件的内容约束。
额外说明:Git 管理的目录中,文件大致有 4 种状态:
- Untracked:未跟踪, 此文件在文件夹中, 但并没有加入到 Git 仓库, 不参与版本控制。通过
git add
使状态变为staged
。 - Unmodify:文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为
Modified
;如果使用git rm
移出版本库,则成为Untracked
文件。 - Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过
git add
可进入staged
暂存状态;如果使用git checkout
则丢弃修改,返回到unmodify
状态,这个git checkout
即从库中取出文件,覆盖当前修改。 - Staged:暂存状态。执行
git commit
则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify
状态。执行git reset HEAD <filename>
取消暂存,文件状态为Modified
。
Git 状态untracked
和not staged
的区别:
untrack
表示是新文件,没有被git add
过,是未跟踪的意思not staged
表示git add
过的文件,即跟踪文件,再次修改后没有再git add
,就是没有暂存的意思
2022-05-06 11:23
Windows 下使用 make 和 gcc 命令
方法一:参考fyne(一款 go 的 gui 框架,其编译需要使用 gcc 命令)
中提及的方式,安装 MSYS2。安装完成后将C:\Application\msys64\mingw64\bin\mingw32-make.exe
在当前目录复制一份并重命名为make.exe
,然后将此目录添加到环境变量path
中,重启生效。
方法二:参考windows10配置make命令,安装MinGW
。安装完成后将C:\Application\MinGW\bin\mingw32-make.exe
在当前目录复制一份并重命名为make.exe
,然后将此目录添加到环境变量path
中,重启生效。
查看命令是否安装成功:
make -v
在上述完成后,就可以使用make
命令执行 Makefile 文件,但若 Makefile 文件中定义了有 shell 语句则依旧不能正确执行。解决方式是使用Git
,打开 IDEA 设置,在Tools Terminal
中将Shell Path
修改为C:\Config\Git\bin\bash.exe
,即可在 Git Bash 中执行 shell 命令。
Windows 下的 cmd 神器 - cmder,也可以模拟 Linux 环境,具体使用方式自行再探索。
2022-05-05 15:27
Git 配置全局用户名和邮箱
git config --global user.name "mayee"
git config --global user.email "maye_e@qq.com"
查看全局配置:
git config --global --list
显示:
user.name=mayee
user.email=maye_e@qq.com
生成 ssh 密钥:
ssh-keygen -t ed25519 -C "deepmi" # 使用 ed25519 算法生成秘钥
连续三次按回车,提示密钥被存储在/Users/用户目录/.ssh/id_ed25519.pub
中,然后用cat
命令查看密钥。
若需要使用多个 SSH 密钥对,在Enter file in which to save the key
步骤时,输入一个新的文件名称就可以避免覆盖已有的密钥对。
deepmi
是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
创建密钥前先确认是否对目录有读写权限:
icacls "C:\Users\maye\.ssh\github\Ma-yeah"
需要确认只有自己有访问权限,如果其他用户也有访问权限,需要重置:
icacls "C:\Users\maye\.ssh\github\Ma-yeah" /reset
默认情况下,密钥会生成在C:\Users\maye\.ssh\
目录下,但是我们可能会在GitHub
、Gitee
、GitLab
等多个平台有多个账号。默认生成秘钥时,如果不指定保存路径,那么就会覆盖之前的密钥。
例如,当我在我的微星电脑micro-star
上想为我的 GitHub 账号Ma-yeah
生成一个 SSH 密钥,可以按如下步骤操作:
- 在
C:\Users\maye\.ssh\
目录下手动创建目录,最终目录结构为C:\Users\maye\.ssh\github\Ma-yeah
; - 打开
Git Bash
输入ssh-keygen -t rsa -C "micro-star"
; - 按一次回车后,会询问你秘钥保存的位置,默认为
/c/Users/maye/.ssh/id_rsa
,此时修改为/c/Users/maye/.ssh/github/Ma-yeah/id_rsa
; - 然后连续回车即可;
创建完密钥后还需要设置,编辑C:\Users\maye\.ssh\
目录下的config
文件(注意文件没有后缀,如果文件不存在则创建),添加如下内容:
# GitHub
Host github.com
IdentityFile C:\Users\maye\.ssh\Github\Ma-yeah\id_ed25519
User git
# GitLab
Host gitlab.com
IdentityFile C:\Users\maye\.ssh\Gitlab\Mayee\id_ed25519
User git
之后测试 SSH 连接是否成功:
ssh -T git@github.com
生成 ssh 密钥也可以使用ssh-keygen -t rsa -C "deepmi"
,表示使用 RSA 算法生成秘钥。
如果 SSH 连接的是私有服务器,则在客户机上创建密钥对假设ssh-keygen -t ed25519 -C "client"
,假设存储密钥自定义路径是/c/Users/maye/.ssh/trae/ed25519
,之后将密钥复制到服务器假设ssh-copy-id -i /c/Users/maye/.ssh/trae/ed25519.pub mayee@192.168.0.1
,如果生成密钥时没有修改位置则可以省略掉-i
参数,然后就可以通过ssh -i /c/Users/maye/.ssh/trae/ed25519 mayee@192.168.0.1
连接到服务器了,如果不想在连接时指定参数,则可以通过上面的方式在config
文件中配置连接服务器主机对应的私钥位置。
说明:ssh key
的类型有四种,分别是dsa
、rsa
、ecdsa
、ed25519
。根据数学特性,这四种类型又可以分为两大类,dsa/rsa
是一类,ecdsa/ed25519
是一类,后者算法更先进。dsa
因为安全问题,已不再使用了,ecdsa
因为政治原因和技术原因,也不推荐使用,rsa
是目前兼容性最好的,应用最广泛的 key 类型,在用ssh-keygen
工具生成 key 的时候,默认使用的也是这种类型。不过在生成 key 时,如果指定的 key size 太小的话,也是有安全问题的,推荐 key size 是 3072 或更大。ed25519
是目前最安全、加解密速度最快的 key 类型,由于其数学特性,它的 key 的长度比rsa
小很多,优先推荐使用。它目前唯一的问题就是兼容性,即在旧版本的 SSH 工具集中可能无法使用。不过据我目前测试,还没有发现此类问题。
因此,优先选择ed25519
,否则选择rsa
。
以下是原文:
OpenSSH supports several signing algorithms (for authentication keys) which can be divided in two groups depending on the mathematical properties they exploit:
DSA and RSA, which rely on the practical difficulty of factoring the product of two large prime numbers, ECDSA and Ed25519, which rely on the elliptic curve discrete logarithm problem. (example)Elliptic curve cryptography (ECC) algorithms are a more recent addition to public key cryptosystems. One of their main advantages is their ability to provide the same level of security with smaller keys, which makes for less computationally intensive operations (i.e. faster key creation, encryption and decryption) and reduced storage and transmission requirements.
OpenSSH 7.0 deprecated and disabled support for DSA keys due to discovered vulnerabilities, therefore the choice of cryptosystem lies within RSA or one of the two types of ECC.
RSA keys will give you the greatest portability, while #Ed25519 will give you the best security but requires recent versions of client & server[2]. #ECDSA is likely more compatible than Ed25519 (though still less than RSA), but suspicions exist about its security (see below).
2022-05-04 15:51
Docker-Compose 重建容器
docker-compose up -d --force-recreate
2022-04-29 11:50
Fork 项目开发
当 fork 了别人的项目后,进行二次开发,源项目有提交后如何保持更新呢?
例如,源仓库为:https://github.com/halo-dev/halo.git, fork 到我的仓库后地址为:https://github.com/maye-e/halo.git。
之后在我的仓库中创建 dev 开发分支,stable 稳定分支,可以 release。master 分支不动,保持和源仓库进行同步。
将项目从我的仓库中拉取到本地,然后如下操作:
# 1.查看远程仓库:
git remote -v
# 显示:
origin https://github.com/maye-e/halo.git (fetch)
origin https://github.com/maye-e/halo.git (push)
# 2.设置 upstream 上游仓库(源项目地址)
git remote add upstream https://github.com/halo-dev/halo.git
# 3.再次查看远程仓库:
git remote -v
# 显示:
origin https://github.com/maye-e/halo.git (fetch)
origin https://github.com/maye-e/halo.git (push)
upstream https://github.com/halo-dev/halo.git (fetch)
upstream https://github.com/halo-dev/halo.git (push)
# 4.同步上游源仓库的 master 分支更改到本地(本地 master 分支,非我的远程仓库)
## 4.1.拉取更新的 branches 和 commits
git fetch upstream
## 4.2.切S本地分支
git checkout master
## 4.3.合并
git merge upstream/master
# 4.1 ~ 4.3的步骤也可以通过一条语句完成
git pull upstream master
此时,就可以任意进行合并分支了。若要将本地代码 push 到远程仓库:
# 切到要推送的分支,如 master
checkout master
# 推送到远程仓库。origin master 表示推送到远程仓库的 master 分支,如果分支不存在则自动创建
git push origin master
另外,如果需要将修改合并到源项目,需要在我的仓库中提交 Pull Request。
2022-04-16 03:13
Docker 常用命令
命令 | 含义 |
---|---|
docker kill $(docker ps -a -q) | 杀死所有正在运行的容器 |
docker rm $(docker ps -a -q) | 删除所有已经停止的容器 |
docker images | 查看本地镜像 |
docker ps | 查看本地容器 |
docker build -t name :tag Dockerfile路径 | 创建镜像 |
docker exec-it IMAGE ID 或者NAME /bin/bash | 进入容器 |
docker stop CONTAINER ID 或者NAMES | 关闭容器 |
docker start CONTAINER ID 或者NAMES | 重新启动关闭的容器 |
docker rm CONTAINER ID 或者NAMES | 移除本地容器 |
2022-02-19 13:43
npm 设置淘宝代理
# 永久设置
npm config set registry http://registry.npm.taobao.org
# 查看设置
npm config get registry
2021-10-26 01:37
Linux 文件目录权限
先看一个例子:drwxrwxrwx
、-rwxrwxrwx
。
文件权限分别对应 4 个部分: [文件或文件夹] [owner权限] [group权限] [others权限]。 因此上述例子表示为: [d] [rwx] [rwx] [rwx] 、[-] [rwx] [rwx] [rwx]
- [-] 表示文件;
- [d] 表示文件夹,即 directory;
[rwx] 分别表示拥有的权限:
- r 可读,read。如果是目录表示有权限执行 ls 命令;
- w 可写,write。如果是目录表示有权限创建目录;
- x 可执行,execute。表示有权限执行 ls -l 命令;
拥有该项权限为 1,没有权限为 0。drwxrwxrwx
表示为一个目录,对应权限值为 0777。0 标识这是 8 进制数(逢 8 进 1)。777 转为 2 进制为 111111111,则在 owner、group、others 下均有可读、可写、可执行权限;-rwxrwxrwx
表示为一个文件,对应权限值为 0777。0 标识这是 8 进制数(逢 8 进 1)。777 转为 2 进制为 111111111,在 owner、group、others 下均有可读、可写、可执行权限。
2021-11-22 17:46
Pinpoint部署
部署需要资源:服务器需安装 Docker Compose。当前测试部署的服务器 ip 为 192.168.30.73。
- 在 GitHub 上 clone pinpoint-docker 项目到本地,得到
pinpoint-docker-master.zip
压缩包。 - 解压后进入到
pinpoint-docker-master
目录中,将docker-compose.yml
和.env
两个文件拷贝一份出来。 - 打开
.env
文件,将第一行 PINPOINT_VERSION=2.2.1 修改为 2.2.0,保存文件;再打开docker-compose.yml
文件,其中 services 节点下包含 pinpoint-hbase、pinpoint-mysql、pinpoint-web、pinpoint-collector、pinpoint-quickstart、pinpoint-agent 等子节点。首先可以删除掉 pinpoint-quickstart 和 pinpoint-agent 这两个节点,接着再将 pinpoint-hbase、pinpoint-mysql、pinpoint-web、pinpoint-collector 这 4 个节点下的 build 节点删除,保存文件。 - 将修改后的
.env
和docker-compose.yml
文件上传至服务器,然后执行命令:docker-compose pull & docker-compose up -d,等待自动拉取镜像,启动容器,用时3分钟左右。 - 在 GitHub 上访问 pinpoint 的 release 页,下载 2.2.0 release notes 下的 pinpoint-agent-2.2.0.tar.gz 文件并解压,进入到 pinpoint-agent-2.2.0\profiles\release 目录下,打开
pinpoint.config
文件,搜索 ".ip" 将127.0.0.1替换为服务器真实 ip 192.168.30.73;再搜索 "profiler.sampling.rate" 将 20 修改为 1。 - 打开浏览器,访问 192.168.30.73:8079 即可。
- java -jar 启动服务时,加上如下 jvm 参数:
-javaagent:/home/pinpoint/agent/pinpoint-bootstrap-1.8.0.jar
-Dpinpoint.agentId=(要全局唯一建议用hostname,部署多个jvm的话加前缀)
-Dpinpoint.applicationName= 设置项目的名称(如果同一项目部署两台实例,这两台的参数应该一致)
2021-01-30 16:02
版权所有
版权归属:Mayee