2021-05-03 21:48:18
276
0
0
1. 插上硬盘查看状态,可以看到/dev/sda1就是需要挂载的移动硬盘。
```
sudo fdisk -l
```
![](/api/file/getImage?fileId=608fff1d04aa04416a001648)
2. 查看硬盘状态,此时还没有挂载上去。
```
df -h
```
![](/api/file/getImage?file
2021-05-01 22:54:24
332
0
0
## 0x00 前言
最开始了解到 yubikey 是因为和一个朋友聊到 PGP 的问题,我觉得 PGP 保存私钥很麻烦,换一个环境或者电脑被搬走的话还是存在一些风险的,放云上就更加不用说了。然后他就说你可以考虑一下 yubikey。
其实我之前也听某个群里的大佬说到过 yubikey,初听时就觉得这个东西应该很不错,安全级别应该很高,因为那会还没有开始使用 PGP,只是把 yubikey
ubuntu
2021-04-29 12:45:18
857
0
0
## 查看openssl的版本
```
openssl version
OpenSSL 1.1.1f 31 Mar 2020
```
## 下载
到官网下载合适的openssl版本 https://www.openssl.org/source/
```
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zxf o
2021-04-29 12:38:47
418
0
0
## GPGTools
### 安装GPGTools
Mac用户在GPGTools官网下载,这是一款GUI的GPG管理软件,也会自动装上`gpg-agent`无需另行下载
### Yubikey
1. 安装Yubikey管理软件
```
$ brew install yubikey-personalization
```
2. 插入Yubikey
3. 设置Yubikey为`
# docker更新portainer-ce2.0
前两天,我在使用portainer的过程中发现左下角提醒有新版本的portainer需要安装,google了一圈如何升级portainer,并没有找到我需要的资料,就算获取了portainer:last也无效
后面查看了新版portainer的文章,发现images的名字是portainer-ce,好家伙,新版直接把镜像名字也改了。
#
2021-04-28 18:34:26
179
0
0
# Raspberry
## 安装
全程未使用显示器,但使用了一个直连网线.
0. 前往[官网](https://www.raspberrypi.org/downloads/raspbian/)下载镜像
* 使用种子文件下载才是最新版
* 下载完成后务必确认文件完整 `sha1sum *-raspbian-jessie.zip`
0. 烧录启动盘
```bash
unzip *-ra
2021-04-28 15:23:03
620
0
0
下面这个demo,在32位系统(我测试的运行环境:32位arm linux)会崩溃。
```
package main
import (
"sync/atomic"
)
type Foo struct {
a int64
b int32
c int64
}
func main() {
var f Foo
atomic.AddInt64(&f.a, 1) // 这里不会崩溃
atomic.AddInt64(&f.c, 1) // 这里会崩溃
}
```
崩溃信息如下:
```
panic: unaligned 64-bit atomic operation
goroutine 1 [running]:
runtime/internal/atomic.panicUnaligned()
/usr/local/go/src/runtime/internal/atomic/unaligned.go:8 +0x24
runtime/internal/atomic.Xadd64(0x1416084, 0x1, 0x0, 0x75fd8, 0x14000e0)
/usr/local/go/src/runtime/internal/atomic/asm_arm.s:233 +0x14
main.main()
/tmp/test.go:16 +0x3c
```
在Go源码go/src/sync/atomic/doc.go的注释中,有如下描述:
```
// BUG(rsc): On x86-32, the 64-bit functions use instructions unavailable before the Pentium MMX.
//
// On non-Linux ARM, the 64-bit functions use instructions unavailable before the ARMv6k core.
//
// On ARM, x86-32, and 32-bit MIPS,
// it is the caller's responsibility to arrange for 64-bit
// alignment of 64-bit words accessed atomically. The first word in a
// variable or in an allocated struct, array, or slice can be relied upon to be
// 64-bit aligned.
```
大致意思是,在一些32位的环境(包括x86和arm),标准库sync/atomic中操作int64的函数存在bug,调用者需自行保证,被操作的int64是按64位对齐的。。否则给你来个panic。惊不惊喜意不意外。。
这里简单说一下64位对齐是啥意思,拿上面那个demo来说:
```
type Foo struct {
a int64 // 位置从0开始,满足64位对齐
b int32
c int64 // 位置`size(a)+sizeof(b)=96`,不是64的倍数,就不满足了
}
```
所以,atomic.AddInt64(&f.a, 1)不会崩溃,atomic.AddInt64(&f.c, 1)会崩溃。
值得一提的有几点:
64位系统原子操作int64没这个问题
32位系统原子操作int32也没问题
32位系统原子操作int64有问题,注意,是原子操作有问题,并不是说int64不能用
uint64和int64是一样,也即这个问题只关心整型位数,不关心符号
以上说的原子操作,特指Go标准库sync/atomic中的函数
解决方法有两种:
1. 一种是保证结构体中的需要使用atomic的int64按64位对齐,比如最简单的就是把这些变量的声明写在结构体的最前面。同时,还需要保证这种结构体被其他结构体嵌套时,也要64位对齐。缺点是编写和维护代码的心智负担比较大。
2. 另一种就是把int64变量的原子操作改成mutex互斥锁保护。缺点是mutex比atomic的开销大。
2021-04-21 13:57:57
464
0
0
## 一、添加免密认证
```
# cat ~/.ssh/config
# gitlab
Host gitlab.xxx.com
Port 22
HostName gitlab.xxx.com
PreferredAuthentications publickey
IdentityFile your_private_key_path
User wangruixing
############
2021-04-18 14:54:49
156
0
0
## 背景
在使用缓存时,容易发生缓存击穿。
**缓存击穿**:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去读数据库,这些请求都会击穿到数据库,造成瞬时请求量大、压力骤增。
## singleflight
**介绍**
`import "golang.org/x/sync/singleflight"`
singleflight类的使用方法:
新建一个singl
2021-04-03 00:08:21
900
0
0
1. 先插入一个U盘
2. 安装下载大师
![](/api/file/getImage?fileId=60673f5004aa04416a00142a)
3. 在系统设置处开启SSH功能
下面我们用SSH登录路由器
```
ssh 用户名@IP地址(或域名)
```
回车后提示你输入密码,输入完密码后就可登录
进入一下/opt环境看一下我
5/10