编程笔记

lifelong learning & practice makes perfect

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
// 用于staff的排序
type StaffWrapper struct {
Staffs []*Staff
Compare func(a, b *Staff) bool
}

func (sw StaffWrapper) Len() int {
return len(sw.Staffs)
}

func (sw StaffWrapper) Swap(a, b int) {
sw.Staffs[a], sw.Staffs[b] = sw.Staffs[b], sw.Staffs[a]
}
func (sw StaffWrapper) Less(i, j int) bool {
return sw.Compare(sw.Staffs[i], sw.Staffs[j])
}

func SortStaff(staffs []*Staff, by SortBy) {
sort.Sort(StaffWrapper{
Staffs: staffs,
Compare: by,
})
}

SortStaff(staffs, func(a, b *Staff) bool {
return a.BelongCorpID < b.BelongCorpID
})

//参考:https://www.cnblogs.com/wangchaowei/p/7802811.html

  • what is it
  • how it looks like
    1
    2


  • how to solve
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import "github.com/astaxie/beego/plugins/cors"
// 跨域问题尝试解决
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
//允许访问所有源
AllowAllOrigins: true,
//可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有)
//其中Options跨域复杂请求预检
AllowMethods: []string{"*"},
//指的是允许的Header的种类
AllowHeaders: []string{"*"},
//公开的HTTP标头列表
ExposeHeaders: []string{"Content-Length"},
//如果设置,则允许共享身份验证凭据,例如cookie
AllowCredentials: true,
}))



beego.Controller.Ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin",
beego.Controller.Ctx.Request.Header.Get("Origin"))
  • why

连接

  • -i指定密钥

  • -o加option

    1
    2
    -o TCPKeepAlive=yes        //长连接
    -o ServerAliveInterval=30 //

端口转发

1
2
3
4
ssh -L local_port:localhost:remote_port -N -T user@server_address -p   server_ssh_port
如:
ssh -L 9999:localhost:8888 -N -T user_test@111.111.111.111 -p 22
将发送到本地端口9999的请求数据转发到111.111.111.111转发到8888端口

配置

  1. config文件配置: ~/.ssh/config

    1
    2
    3
    4
    5
    6
    7
    8
    #配置
    Host gitee.com
    HostName gitee.com
    IdentityFile xxx/xxx/_id_rsa
    PreferredAuthentications publickey
    User xxx
    TCPKeepAlive=yes
    ServerAliveInterval 60
  2. 配置服务端

  • 件位置,全局位置: /etc/ssh/sshd_config
  • 文件位置,termux: $PREFIX/etc/ssh/sshd_config
  • 配置:
    • PasswordAuthentication (密码验证) yes/no
    • 启用密钥验证
      • RSAAuthentication (rsa秘钥) yes/no
      • PubkeyAuthentication (公钥) yes/no
  1. 认证秘钥,将公钥写入该文件(authorized_keys),就可使用该公钥登陆
    • 位置: ~/.authorized_keys

工具

  • windows terminal

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    连接远程机器使用 ssh 配置
    {
    "guid": "{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}",
    "hidden": false,
    "name": "xxxxxxx",
    //密钥放在本地,-i 指定密钥位置
    "commandline": "ssh -i xxxxxxx_id_rsa user@host -p xxxxxxxx -o TCPKeepAlive=yes -o ServerAliveInterval=30",
    "startingDirectory": "/home/xxxxxxx",
    "icon" : "ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.png"
    }

什么是微服务,微服务概览

微服务设计

服务治理

服务发现

grpc

多租户&多集群

service mesh

  1. excelize 介绍
1
2


  1. 时间格式读取

excel表格操作库,对日期格式的数据读写还不是很完善,能识别的日期格式返回一个01-02-06(day-month-day)格式的字符串,无法识别时直接返回的是excel表格中的原始数据,一个浮点型数,在excel中支持很多种日期格式显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
file,err:=excelize.OpenFile(filepath)
if err!=nil{
return
}

strTime,err:=file.GetCellValue("Sheet1","A1")
if err!=nil{
return
}

// 方式一:正常识别,通过time的库函数转换
resTime, err = time.ParseInLocation("01-02-06", strTime, time.Local)

// 方式二:未正常识别,先转换成int型数据再转换
intTime,err:=strconv.Atoi(strTime)
if err!=nil{
return
}

//转换为time.Time
time.Time=excelize.ExcelDateToTime(float64(intTime),false)
  1. 时间格式写入
    通过excelize写入时间格式的数据到文件,需要设置单元格格式,excelize支持写入的格式包含有time.Time,但是写入时需要使用UTC格式。
1
2
3
4
5
6
7
8
file:=excelize.NewFile()
//style 格式编号
style,err:=file.NewStyle(`{"number_format": 14}`)
if err!=nil{
return
}
file.SetCellValue("Sheet1","A1",time.Now().UTC())
file.SetCellStyle("Sheet1","A1","A1",style)

hexo clean 清除用于部署博客文件
删除.deploygit(也是)

先将themes/下要使用的主题作为git submodule,(git submodule add https://****.git)
添加后可使用git submodule查看子模块

将hexo根目录下的文件(含themes source scaffolds 等的目录)添加到git上传到私有项目

设置workflow等

由于使用了子模块

checkout的workflow最好找对应的submodule checkout

参考

系统依赖

  • Jenkins
  • nginx
  • golang后端
  • 前端

问题

  1. 接口调用失败,到服务器上本地请求接口失败
  2. 通过ps搜索后端进程,发现服务进程不存在,判定=>Jenkins构建失败
  3. 然后到Jenkins上查看构建日志,发现报错信息,’sudo stop xxxx [no runing]’,错误判定为有人修改了服务器配置,问了一圈人,没有修改
  4. 排除员工原因,查找代码原因,尝试直接执行在服务器本地的后端可执行程序,报错
  5. 排查代码原因

反思

大部分错误最先从代码层面开始找,比较有效率,服务器配置之类的改动毕竟比较少;错误日志需要仔细查看,往往兜兜转转找了一圈会发现
错误提示一开始就清晰地摆在面前.
下决定前多思考.

command

  1. lsb_release : 查看LSB(Linux Standard Base),Distribution information

description & usage

  1. LSB (Linux Standard Base)
  2. tldr description
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    lsb_release

    Provides certain LSB (Linux Standard Base) and distribution-specific information.

    - Print all available information:
    lsb_release -a

    - Print a description (usually the full name) of the operating system:
    lsb_release -d

    - Print only the operating system name (ID), suppressing the field name:
    lsb_release -i -s

    - Print the release number and codename of the distribution, suppressing the field names:
    lsb_release -rcs

    example

    1
    2
    3
    4
    5
    LSB Version:    :core-4.1-amd64:core-4.1-noarch
    Distributor ID: CentOS
    Description: CentOS Linux release 8.2.2004 (Core)
    Release: 8.2.2004
    Codename: Core