2021-04-28 18:34:26    26    0    0
# Raspberry ## 安装 全程未使用显示器,但使用了一个直连网线. 0. 前往[官网](https://www.raspberrypi.org/downloads/raspbian/)下载镜像 * 使用种子文件下载才是最新版 * 下载完成后务必确认文件完整 `sha1sum *-raspbian-jessie.zip` 0. 烧录启动盘 ```bash unzip *-ra
2021-04-28 15:23:03    29    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    33    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    18    0    0
## 背景 在使用缓存时,容易发生缓存击穿。 **缓存击穿**:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去读数据库,这些请求都会击穿到数据库,造成瞬时请求量大、压力骤增。 ## singleflight **介绍** `import "golang.org/x/sync/singleflight"` singleflight类的使用方法: 新建一个singl
2021-04-03 00:08:21    41    0    0
1. 先插入一个U盘 2. 安装下载大师 ![](/api/file/getImage?fileId=60673f5004aa04416a00142a) 3. 在系统设置处开启SSH功能 下面我们用SSH登录路由器 ``` ssh 用户名@IP地址(或域名) ``` 回车后提示你输入密码,输入完密码后就可登录 进入一下/opt环境看一下我
arm    2021-04-02 22:40:05    21    0    0
不知道什么原因导致AC68U插入U盘后显示未挂载,即使在无线网络那边的专业设置里 关闭了2.4G USB3.0干扰功能后,还是一样显示未挂载。无奈之下只能选择手动挂载,网上搜了一些教程,搞定。 1.使用ssh工具登陆路由器 2.输入`fdisk -l` 查看U盘的信息,比如我的U盘,就显示为 /dev/sda1 3.把U盘格式化,使用mkfs.ext2命令。`mkfs.ext2 /de
2021-02-17 20:56:08    42    0    0

使用 n 命令切换 node/npm 版本

centos 下使用 yum 默认安装的 nodejs 版本为 v6.x。可以使用 n 命令来升级切换 nodejs 版本。

安装 n 命令

n 是一个 nodejs 管理工具,https://github.com/tj/n

$ npm install -g n

使用 n 安装 nodejs 版本

安装最新版本

$ n lat
2021-01-30 19:16:55    64    0    0
包下载:go get github.com/go-playground/validator/v10

一、概述

在接口开发经常会遇到一个问题是后端需要写大量的繁琐代码进行数据校验,所以就想着有没有像前端校验一样写规则进行匹配校验,然后就发现了validator包,一个比较强大的校验工具包下面是一些学习总结,详细内容可以查看validator

二、操作符说明

标记
2020-11-24 10:53:43    57    0    0
使用命令: ``` git log file.txt ``` 然后按`G`(shift+g)
2020-11-23 16:13:15    70    0    0
方法一: ``` git pull origin master --allow-unrelated-histories ``` 方法二: ``` git push --force origin master ```
2/6