0%

旅途终了,总感觉是要写点什么的。

八方旅人一代给我的感觉非常好,一个史诗、绚烂、浪漫的旅途。旅途——总是浪漫的。玩完之后的那种寂寥,感觉那八个人离我而去了,是非常不舍的。

不知是二代退步了,还是我本人心态有所变化,那种游戏通关后的寂寥感,是没了。

现在是 2023年,毕业后三年,初玩八方旅人一代大抵在我上大学那会儿,貌似时间间隔也不久。

阅读全文 »

ARP 格式

image-20230304013902868

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct arphdr
{
unsigned short int ar_hrd; /* Format of hardware address. */
unsigned short int ar_pro; /* Format of protocol address. */
unsigned char ar_hln; /* Length of hardware address. */
unsigned char ar_pln; /* Length of protocol address. */
unsigned short int ar_op; /* ARP opcode (command). */
};

struct ether_arp {
struct arphdr ea_hdr; /* fixed-size header */
uint8_t arp_sha[ETH_ALEN]; /* sender hardware address */
uint8_t arp_spa[4]; /* sender protocol address */
uint8_t arp_tha[ETH_ALEN]; /* target hardware address */
uint8_t arp_tpa[4]; /* target protocol address */
};
阅读全文 »

创建用户和数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入命令行
su -u postgre
psql

# 创建用户
create user vksir with password 'passwd';

# 创建数据库并赋予用户权限
create database db owner vksir;
grant all privileges on datebase db to vksir;

# 退出
\q

# 使用新用户登录数据库
psql -U vksir -d db
阅读全文 »

代码

loging\logging.go

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
package logging

import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)

const logPath = "./log.txt"

func SugaredLogger() *zap.SugaredLogger {
return zap.S()
}

func init() {
encoder := getEncoder()
writeSyncer := getWriteSyncer()
core := zapcore.NewCore(encoder, writeSyncer, zap.DebugLevel)
logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
zap.ReplaceGlobals(logger)
}

func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewConsoleEncoder(encoderConfig)
}

func getWriteSyncer() zapcore.WriteSyncer {
f, err := os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
panic(err)
}
return zapcore.NewMultiWriteSyncer(zapcore.AddSync(f), zapcore.AddSync(os.Stdout))
}
阅读全文 »

Gin 使用 validator 库做数据校验,如下可以实现自定义校验、及自定义校验错误信息。

其中,自定义错误信息无法用于多层嵌套结构体,可能可以通过反射做到,但感觉在性能上很捉急。

代码

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
package main

import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
"net/http"
"reflect"
"strings"
)

type Body struct {
Name string `json:"name" binding:"oneof=vk vksir" err:"one of vk,vksir"`
Age int `json:"age" binding:"BodyAgeValidate" err:"only 18"`
}

func BodyAgeValidate(f validator.FieldLevel) bool {
value := f.Field().Int()
if value != 18 {
return false
}
return true
}

func GetValidateErr(obj any, rawErr error) error {
validationErrs, ok := rawErr.(validator.ValidationErrors)
if !ok {
return rawErr
}
var errString []string
for _, validationErr := range validationErrs {
field, ok := reflect.TypeOf(obj).FieldByName(validationErr.Field())
if ok {
if e := field.Tag.Get("err"); e != "" {
errString = append(errString, fmt.Sprintf("%s: %s", validationErr.Namespace(), e))
continue
}
}
errString = append(errString, validationErr.Error())
}
return errors.New(strings.Join(errString, "\n"))
}

func ping(c *gin.Context) {
b := Body{}
if err := c.ShouldBindJSON(&b); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"detail": GetValidateErr(b, err).Error()})
return
}
c.JSON(http.StatusOK, gin.H{})
}

func main() {
e := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("BodyAgeValidate", BodyAgeValidate)
}
e.GET("/ping", ping)
e.Run("127.0.0.1:8080")
}
阅读全文 »

习惯了使用 Unix 风格的终端,过去在 Windows 上,一直给 Clion 配置 Git Bash 作为终端:

1
"D:\Program Files\Git\bin\sh.exe"

但近来发现,在 Git Bash 中运行编译好的 C++ 程序时,有时候会没有回显。Cygwin Terminal 就没这问题,Clion 中配置 Cygwin Terminal 如下:

1
"D:\Dependencies\cygwin64\bin\sh.exe" -lic "cd ${OLDPWD-.}; bash"
阅读全文 »

其实可以将它视为动漫。

因其人物性格鲜明独特,画面精致,节奏紧凑……这么一说来其实更像是电影,但为何我觉得它更像动漫?

——星期三。

不像是电影亦或是电视剧中出现的人物,其性格——毒舌……说病娇不准确,有病无娇;说乖张不准确,并非疯狂,而是冷静沉着中满是怪异。经常会发出一些惊人之语,类似于“躺在停尸间冷冻柜里说,‘我感觉我快要好起来了。’”,”挖坟时深吸一口:‘Smell good.’”

Screenshot_20221212_224106_com.microsoft.emmx

阅读全文 »

是值得一看的故事,也是需要记录的一个故事。

用最萌的画风讲述最黑深残的故事,仿佛这样能够把故事中的残酷和绝望气氛冲淡一些——像《少女终末旅行》。


深渊阿比斯是一个巨洞,人类还未探索完全的地方。深渊很危险,但其中有着价值连城的遗物,吸引着无数“探窟家”前来探索——亦或是仅仅因为对未知的好奇而去探索。

探窟是成本高昂的,因阿比斯有一个特性——只许下不许上。向下探索得越深,返回时受到的诅咒就越强烈。

阅读全文 »