杨 发布的文章

最大差值类

121.买卖股票最佳时机

抽象逻辑:在给定的数组中,求最大差值,前提是只能用后面的数减去前面的数。
思路:定义两个变量来维护最大差值max和最小值min,min=数组第一个元素nums[0],在遍历过程中只有两种情况,

  1. 当前值n大于min,说明是可以计算差值的,max = max(n-min, max),max取二者较大的。
  2. n小于min,则min=n。
    最终遍历结束,max即为最大差值。

glibc 对系统调用的封装

我们以最常用的系统调用 open,打开一个文件为线索,看看系统调用是怎么实现的。这一节我们仅仅会解析到从 glibc 如何调用到内核的 open,至于 open 怎么实现,怎么打开一个文件,留到文件系统那一节讲。
现在我们就开始在用户态进程里面调用 open 函数。
为了方便,大部分用户会选择使用中介,也就是说,调用的是 glibc 里面的 open 函数。这个函数是如何定义的呢?
int open(const char *pathname, int flags, mode_t mode)
在 glibc 的源代码中,有个文件 syscalls.list,里面列着所有 glibc 的函数对应的系统调用,就像下面这个样子:

# File name Caller Syscall name Args Strong name Weak names
open - open Ci:siv __libc_open __open open

另外,glibc 还有一个脚本 make-syscall.sh,可以根据上面的配置文件,对于每一个封装好的系统调用,生成一个文件。这个文件里面定义了一些宏,例如 #define SYSCALL_NAME open。
glibc 还有一个文件 syscall-template.S,使用上面这个宏,定义了这个系统调用的调用方式。

T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
ret
T_PSEUDO_END (SYSCALL_SYMBOL)
#define T_PSEUDO(SYMBOL, NAME, N) PSEUDO (SYMBOL, NAME, N)

这里的 PSEUDO 也是一个宏,它的定义如下:

#define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name) \
DO_CALL (syscall_name, args); \
cmpl $-4095, %eax; \
jae SYSCALL_ERROR_LABEL

里面对于任何一个系统调用,会调用 DO_CALL。这也是一个宏,这个宏 32 位和 64 位的定义是不一样的。






- 阅读剩余部分 -

人工回收

c语言由开发者来手动分配与回收内存,调用malloc或calloc分配内存,调用free清空这块内存。
手动回收会存在内存泄漏问题,即分配后没有释放。


- 阅读剩余部分 -

有些业务场景,为了提高查询速度,会将结果存在缓存中,当db数据变化时,将可能出现数据不一致问题。原因有三种:
1.db读写分离,主从延迟
2.时序性
3.原子性

解决方案:
1.强一致性。分布式事务(2pc, 3pc)
2.降低并发时脏数据的概率
3.缩小不一致的时间,保证最终一致性。

又到年末,各团队都开始了年终述职,即绩效参考。说来惭愧,工作了四年多,总共参加了两次述职,但是效果很差,找不到关键点。
年终述职的目的,是要让领导看到你的工作成果,发现你解决问题的思维方式。所以,总结工作亮点、处理问题的细节尤为重要。

总结几点

养成记录的习惯

年终述职一般只有10天左右的时间准备,在这么短的时间,靠回忆很容易遗漏一些不起眼的细节。
所以,在平时就要养成记录的习惯。我倾向于使用思维导图,用时间线或者类型分类记录。
记录内容

  • 项目主题
  • 项目背景
  • 遇到问题
  • 解决方案
  • 再遇到此问题如何提效

举个例子,

主题:创建账号生成默认密码
背景:在做进校业务中,需要在后台导入老师学生信息,创建账号,同时生成默认密码,生成规则是姓的全拼+123456
问题:找了很多提取汉字的拼音的开源包无法区分多音字,就会导致生成的密码并非是老师的姓的拼音。举个例子,有个老师姓曾,通过组件提取的拼音为【ceng】,生成的默认密码是ceng123456,影响老师使用体验。
解决方案:首先想到的是通过技术手段解决,找一个针对中国姓氏的转换包,不过调研一些开源项目后并没有找到。后来经过讨论分析,我们存储的用户名是老师的姓名全拼,这是由学校提供的,基本不会出现错误。于是,在生成默认密码时,将通过转换包生成的拼音来和老师全拼比较

if strings.HasPrefix(username, pinyin) {
    return pinyin + "123456"
}

一、查看磁盘使用情况

[rd@mark-k8s-log-213-235 mark]$ df -lh
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.8G     0  7.8G    0% /dev
tmpfs           7.8G   24K  7.8G    1% /dev/shm
tmpfs           7.8G  928K  7.8G    1% /run
tmpfs           7.8G     0  7.8G    0% /sys/fs/cgroup
/dev/vda1        50G  7.5G   40G   16% /
/dev/vdb1       394G  309G   86G   79% /data
tmpfs           1.6G     0  1.6G    0% /run/user/0
tmpfs           1.6G     0  1.6G    0% /run/user/2000

二、查看目录大小

[rd@mark-k8s-log-213-235 mark]$ du -sh *
3.3M    fe-mk-admin-mis
396K    fe-mk-h5-student
604K    fe-mk-h5-teacher
452K    fe-mk-rd-toolmis
1.3M    fe-mk-resource-mis
21M    fe-mk-teacher-mis
34G    markapi
43G    mkexam
108M    mk-node-export-server
7.3M    mkresource
113G    mkscanner
4.0G    mksmartpen
106M    mktag
50G    mktiku
75G    mktool
18M    rewrite

等同于

[rd@mark-k8s-log-213-235 mark]$ du -h --max-depth=1 
20M    ./fe-mk-teacher-mis
592K    ./fe-mk-h5-teacher
106M    ./mk-node-export-server
1.3M    ./fe-mk-resource-mis
72G    ./mktool
3.2M    ./fe-mk-admin-mis
7.4M    ./mkresource
106M    ./mktag
380K    ./fe-mk-h5-student
113G    ./mkscanner
49G    ./mktiku
18M    ./rewrite
33G    ./markapi
4.0G    ./mksmartpen
448K    ./fe-mk-rd-toolmis
41G    ./mkexam
309G    .

一、字符串转数字

number, _ := strconv.Atoi(str) //number 为int类型

二、数字转字符串

str := string(rune(number))

三、字符串转int64

int64, err := strconv.ParseInt(string, 10, 64)

四、int64转字符串

string:=strconv.FormatInt(int64,10)

git log 默认时区为UTC,显示时间比本地晚8小时

显示本地时间
git log --date=local