Linux
adream307
这个作者很懒,什么都没留下…
展开
-
解决 git 同步错误 gnutls_handshake() failed
今天在服务器上使用 git 访问 GitHub 时,出现了 gnutls_handshake() failed 错误,经过分析,问题应该在 gnutls 模块上。该错误可以通过从源码构建 git 安装包,并将 gnutls 替换为 openssl 解决。转载 2022-06-19 21:41:23 · 4849 阅读 · 0 评论 -
2021-10-25
示例程序#include <stdio.h>int main(int ac, char **av) { int localfn(int a) { return a+ac; } int (*fptr)(int) = localfn; printf("%d\n", fptr(-1)); return 0;}编译 1gcc trampoline.c -z execstack -原创 2021-10-25 11:14:33 · 305 阅读 · 0 评论 -
使用 sanitize工具检查内存为题
// g++ str_view_test.cpp -fsanitize=address -std=c++17 -o s#include <bits/stdc++.h>std::string f1() { std::string val; val += "123"; val += "456"; return val;}void f2(std::string_view val) { std::cout << val << std:原创 2021-10-25 09:41:06 · 257 阅读 · 0 评论 -
使用 time 统计程序最大内存
使用 time 统计程序最大内存以及 CPU时间,IO信息等/usr/bin/time -f "parse:[MEM]max:%M, avg:%t; [CPU]real:%e, user:%U.sys:%S, cpu:%P; [IO]i%I, o:%O" program args原创 2021-10-20 09:05:03 · 378 阅读 · 0 评论 -
[linux] gcore生成运行程序的 core 文件
GCORE(1) GNU Development Tools GCORE(1)NAME gcore - Generate原创 2021-06-15 19:30:15 · 1886 阅读 · 0 评论 -
Modern C++ development in (Neo)vim
tl;dr - What are we doing here?We’ll set up an IDE like C(++) dev environment in (neo)vim including:A Language Server Protocol implementation (ccls) and client (coc.nvim)Syntax Highlighting using vim-lsp-cxx-syntax-highlightingLinting via cpplint and转载 2021-04-27 17:49:30 · 906 阅读 · 0 评论 -
vim 常用配置
vim config编译 vim 8.2git clone https://github.com/vim/vim.gitcd vim./configure --enable-python3interp --with-x --prefix=/usr/localmake -jsudo make install./src/vim --version 输出类似如下, 确保 +python3 和 +clipboard 使能/src/vim --versionVIM - Vi IMproved 8原创 2021-04-27 10:16:34 · 388 阅读 · 0 评论 -
[git]push 到远端的不同 branch
本地分支 push 到远端的不同 branchgit push origin local_branch:remote_branch从远端的不同branch pull 代码git pull origin remote_branch原创 2021-04-27 09:53:09 · 698 阅读 · 0 评论 -
[linux] 解决 ubuntu 安装依赖失败的问题
使用 apt-get 安装 zlib1g-dev 时出现如下错误The following packages have unmet dependencies: zlib1g-dev : Depends: zlib1g (= 1:1.2.11.dfsg-2ubuntu1) but 1:1.2.11.dfsg-2ubuntu1.2 is to be installed解决方式是重新安装 zlib1g=1:1.2.11.dfsg-2ubuntu1sudo apt-get install --reinst原创 2021-04-19 12:03:14 · 2270 阅读 · 0 评论 -
[转]network namespace 实验
原文链接 : https://www.infoq.cn/article/docker-kernel-knowledge-namespace-resource-isolation首先我们可以创建一个命名为 test_ns 的 network namespacesudo ip netns add test_ns当 ip 命令工具创建一个 network namespace 时,会默认创建一个回环设备(loopback interface:lo),并在 /var/run/netns 目录下绑定一个挂载转载 2021-04-13 16:51:20 · 329 阅读 · 0 评论 -
[linux] 手动设置进程的 rlimit 信息
实例代码如下,设置进程只能打开 8 个文件描述符号#include <unistd.h>#include <sys/resource.h>#include <stdlib.h>#include <stdio.h>int main(){ struct rlimit old; if(getrlimit(RLIMIT_NOFILE,&old)<0) return EXIT_FAILURE; printf("rlimi原创 2021-04-12 17:15:45 · 375 阅读 · 0 评论 -
[linux] 阻塞进程的所有信号
#include <unistd.h>#include <signal.h>#include <stdio.h>int main(){ sigset_t mask; sigfillset(&mask); int ret = sigprocmask(SIG_BLOCK,&mask,NULL); if(ret<0) return -1; for(int i=0;i<3;i++){ printf("block all signa原创 2021-04-01 11:51:20 · 409 阅读 · 0 评论 -
[linxu]SUBREAPER 设置祖父进程接管孙子进程
测试代码#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<sys/prctl.h>int main(){ pid_t pid = fork(); if(pid<0) return -2; if(pid==0){ //child printf("child, pid = %d, ppid = %d\n",getpid(),getpp原创 2021-03-31 19:43:32 · 575 阅读 · 0 评论 -
[linux] setsid测试
测试程序如下#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(){ printf("start...\n"); int err = setenv("ENV_TEST","VALUE_TEST",0); if(err<0) return err; int pid = fork(); if(pid<0) return -1; if(pid==0){ // if(原创 2021-03-31 16:45:12 · 184 阅读 · 0 评论 -
[docker]使用 crun 本地跑container
crun 的官网只介绍了如何使用 podman 运行 crun ,本文介绍如何使用纯粹的 crun 跑一个容器1.下载镜像文件skopeo copy docker://alpine:latest oci:alpine:latest2.解包镜像文件sudo umoci unpack --image alpine:latest alpine-bundle3.修改目录权限sudo chown abc:abc alpine-bundle4.进入 alpine-bundle 目录cd alpi原创 2021-03-27 16:51:18 · 1574 阅读 · 1 评论 -
[linux]指定数据出口网口
假设计算机A有两个网口,IP 信息如下:192.168.1.105/24192.168.2.123/24计算机B只有一个 网口,IP 信息如下:192.168.1.107默认配置下,A访问 B的数据必定通过 192.168.1.105/24 网口现在要求 A 访问 B 的数据必须通过 192.168.2.123/24网口,解决方案就是手动添加路由规则sudo route add 192.168.1.107 gw 192.168.2.123...原创 2021-03-20 15:07:37 · 1754 阅读 · 0 评论 -
etcd revision 测试
docker-compose启动 etcd 集群docker-compose -f etcd-only.yml up -detcd-only.yml,设置 snapshot 为100,即每 100 个修改,产生一次 snapshot,清除 WALversion: '3.5'services: machine-1: image: quay.io/coreos/etcd:v3.4.9 hostname: machine-1 container_原创 2021-03-16 16:32:59 · 1490 阅读 · 0 评论 -
go 的可执行程序生成 core dump 文件
Open a terminal in the directory with the file .Set the ulimit parameter to unlimited: ulimit -c unlimited.Build the program by running go build . in the terminal. The build command creates a binary file in the current project folder (for example, aweso.转载 2021-03-05 19:03:04 · 1923 阅读 · 0 评论 -
ssh 执行远程命令和端口转发
执行远程命令查看远程主机是否运行进程httpdssh user@remote_host 'ps ax | grep httpd'绑定本地端口假定我们要让 1081 端口的数据,都通过 SSH 传向远程主机,命令就这样写ssh -D 1081 user@remote_hostSSH 会建立一个 socket,去监听本地的 1081 端口,所有链接本地 1081 端口的数据都会被转发到 remote_host如果 remote_host 具备翻墙的功能,那么这个命令相当于在本地的 1081 端原创 2021-03-05 16:31:35 · 1094 阅读 · 1 评论 -
使用指定的 SSH key 操作 git
Starting from Git 2.3.0 we also have the simple command (no config file needed):GIT_SSH_COMMAND='ssh -i private_key_file -o IdentitiesOnly=yes' git clone user@host:repo.gitWith git 2.10+ (Q3 2016: released Sept. 2d, 2016), you have the possibility to se原创 2021-03-05 16:28:23 · 632 阅读 · 0 评论 -
mysql 和 TiDB 在 snapshot 隔离级别上的区别
如果一个事务包含多条 SQL 语句,在 snapshot 隔离级别上,mysql 并不是事务开始的时候获得一个 snapshot 而是在执行第一条 SQL 语句的时候获得 snapshot 的; 而 TiDB 是在事务开始的时候获得一个 snapshot参考 https://pingcap.com/blog-cn/tikv-source-code-reading-12/ TiDB 在事务开始的时候从 PD 获得一个 start_TS,这个 start_TS 就标记一个 snapshot启动 mysql原创 2020-12-22 12:08:38 · 375 阅读 · 0 评论 -
[SQL] 将子查询改写成hash join
这个是当时给新员工做培训时,我认为最难的一条 SQL语句原始 SQL 语句select A.a1from Awhere A.a2 > ( select max(B.b1) from B where B.b2= A.a3);很多人看到这条语句时,表示不知道这条语句在干什么,这里简单解释一下:从表A中取出一行,记为 ax1,ax2,ax3根据ax3的值,在表B中删选出所有满足 B.b2==ax3在第2步筛选出的表B的所有行中,选出 B.b1 的最大值,记为 maxB1根据第1原创 2020-12-12 10:30:58 · 257 阅读 · 0 评论 -
go 语言动态添加 select case
go 语言中传统的 select case 必须固定写死,即我们在编码阶段必须明确知道当前有几个 case,如下select{ case <- chan1: //todo case <- chan2: //todo case <- chan3: //todo case <- chan4: //todo}如果我在编码是不确定有几个 case,只在运行是才能知道,应该如何处理? 示例代原创 2020-11-30 13:40:52 · 969 阅读 · 0 评论 -
int64的读写操作是否具有原子性质
在 x86-64 机器上,int64 的读写操作是否具有原子性?假设变量 val 是 int64, 现在有两个线程,线程 writer 只负责向 val 写入数据,线程 reader 只负从 val 读取数据假设 val 当前值为 0x0102030405060708writer 线程正在执行写操作,将数据 0x0000111100002222 写入 valreader 线程正在执行读操作,从 val 读取数据那么 reader 线程得到的 val 只能是 0x0102030405060708原创 2020-11-21 11:50:07 · 1124 阅读 · 0 评论 -
bash 脚本设置 GOPATH
go-path.sh#!/bin/bashif [ $# -ne 1 ];then echo "usage : go-path: <go-path>" exit 0fiif [ ! -z $GOPATH ];then echo "origin GOPATH = ${GOPATH}" echo "origin PATH = ${PATH}" go_bin_path=:${GOPATH}/bin原创 2020-11-03 19:39:57 · 474 阅读 · 0 评论 -
[cpp] 使用 shared_ptr的自定义删除函数模拟 go 语言的 defer 功能
go 语言的 defer 定义函数退出时的行为,c++ 的 shared_ptr 可以自定义deleter 函数明确变量在析构时的行为。因此可以使用 share_ptr 的自定义 deleter 函数模拟 go 语言中的 defer 行为#include <memory>#include <iostream>int main(){ int x = 5; std::shared_ptr<int> tx(nullptr,[&](int *){原创 2020-10-10 13:59:19 · 423 阅读 · 0 评论 -
MySQL的隔离性测试
在阅读本文前,请思考以下分别输出什么操作序列1在数据库中存入 A=1Client1启动一个事物T1Client2启动一个事物T2Client1 读取 A 的值 X1Client2设置 A=2Client2提交事物T2Client1 读取 A 的值 X2Client1提交事物T1Client1 读取 A 的值 X3请问 X1 X2 X3 分别为什么值?操作序列2在数据库中存入 A=1Client1启动一个事物T1Client2启动一个事物T2Client2设置 A=2C原创 2020-09-17 16:14:54 · 203 阅读 · 0 评论 -
[docker]运行指定 GPU
docker 内运行运行所有的 GPU docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi输出结果+-----------------------------------------------------------------------------+| NVIDIA-SMI 450.57 Driver Version: 450.57 CUDA Version: 11.0 ||--------原创 2020-09-14 12:09:01 · 7820 阅读 · 0 评论 -
[go] 检查 channel 是否已经被关闭
val, ok := <-ch如果 channel 已经被关闭,上述调用立刻返回,并且 ok 为 false,完整测试代码如下package mainimport ( "log" "sync")func main() { ch := make(chan int) var wg sync.WaitGroup go func() { for i := 0; i <= 100; i++ { ch <- i } close(ch) }() wg.Ad原创 2020-09-11 11:55:54 · 589 阅读 · 0 评论 -
[go]zap配合logrotate实现日志滚动
zap是Uber 提供的GoLang高性能日志库,zap 本身并不提供日志滚动功能,官方 FAQ 提到,可以使用Linux系统自带的 logrotate 或lumberjack实现日志滚动功能lumberjack 只能向文件输出日志,如果我们希望同时向stderr 和文件输出日志,只能使用 logrotate 配合自定义 WriteSyncer 实现了Go代码package mainimport ( "bufio" "context" "fmt" "go.uber.org/zap" "g原创 2020-09-10 17:01:27 · 2125 阅读 · 1 评论 -
[go] 快速排序
实现go 的 sort.Interface接口,实现自定义数据类型的快速排序package mainimport ( "log" "sort")type myStructExp struct { id int}type myStructExps []*myStructExpfunc (s myStructExps) Len() int { return len(s)}func (s myStructExps) Less(i, j int) bool { return s[原创 2020-08-29 16:31:15 · 212 阅读 · 0 评论 -
[linux] page 写磁盘并不是原子性
以 page 为单位,向磁盘写数据,并不是原子性的,举例说明:写线程 writer 每次向磁盘输入一个 page 的数据量,w1 w2 w3 ...w1 w2 w3 ... 分别代表一个 page 的数据量读线程 reader 每次从磁盘读一个 page 的数据量操作系统并不保证 writer 写完整个 page 后,才让当前写入的数据整体对 reader 可见reader 读取一个 pape 的数据,可能部分来自 w1 部分来自 w2测试代码如下:package mainimport原创 2020-08-28 11:00:51 · 467 阅读 · 0 评论 -
[etcd] WithMaxCreateRev 和 WithRev 的区别
阅读 etcd 分布式锁 mutex 的源码时,遇到 waitDeletes 函数func waitDeletes(ctx context.Context, client *v3.Client, pfx string, maxCreateRev int64) (*pb.ResponseHeader, error) { getOpts := append(v3.WithLastCreate(), v3.WithMaxCreateRev(maxCreateRev)) for { resp, err :原创 2020-08-26 11:06:00 · 725 阅读 · 0 评论 -
[etcd] 删除后重新插入,版本号重新计数
在 etcd 中,数据删除后重新插入,对应的版本号重新计算,测试代码如下:$ etcdctl --endpoints=http://127.0.0.1:10001 put k1 v1 -w json{"header":{"cluster_id":18293669711776909085,"member_id":8241799522139745222,"revision":2,"raft_term":2}}$ etcdctl --endpoints=http://127.0.0.1:10001 put原创 2020-08-24 14:30:30 · 392 阅读 · 0 评论 -
[go] go 面试题--变量作用域
以下程序,输出的 &i 是否相同package mainimport ( "fmt" "math/rand")func randInt() (int, int) { return rand.Int(), rand.Int()}func main() { p1, i := randInt() fmt.Printf("1: &i = %x, %d\n", &i, p1) p2, i := randInt() fmt.Printf("2: &i原创 2020-08-24 13:55:40 · 160 阅读 · 0 评论 -
[cpp]无符号数据测试
#include<stdio.h>int main(){ unsigned int x1 = -1; unsigned int x2 = 0; unsigned int x3 = x2-x1; printf("x1 = %u\n",x1); printf("x2 = %u\n",x2); printf("x3 = %u\n",x3); printf("x2-x1 = %u\n",x2-x1); if(x2>x1) printf("x2 > x1\n"); els原创 2020-08-10 19:13:22 · 185 阅读 · 0 评论 -
plotly绘制轮廓图
参考代码: plotlyimport plotly.express as pxg0={'type': 'Polygon', 'coordinates': [[[-86.496774, 32.344437], [-86.717897, 32.402814], [-86.814912, 32.340803], [-86.890581, 32.502974], [-86.917595, 32.664169], [-86.71339, 32.661732], [-86.714219, 32.705694],原创 2020-06-08 19:34:39 · 816 阅读 · 0 评论 -
[c++]蛋疼的面试题目
#include<stdio.h>int main(){ int a[]={10,11,12,13,14,15}; int b=3; printf("%d, %d\n",a[b],b[a]); return 0;}输出结果13, 13原创 2020-05-09 18:35:54 · 255 阅读 · 0 评论 -
[linux]手动下载maven包
由于网络问题,自动下载maven的包依赖时经常出错,遇到如下错误:::: ERRORS SERVER ERROR: HTTPS Required url=http://repo1.maven.org/maven2/org/scala-tools/sbinary/sbinary_2.9.0/0.4.0/sbinary_2.9.0-0.4.0.pom新建脚本download.sh#!/bin/bashtarget=$1mv_dir=${HOME}/.m2/repository/${target}原创 2020-05-09 10:24:49 · 865 阅读 · 0 评论 -
[python]yield测试
python函数运行到yield的地方暂停,并返回。调用next后冲上次yield结束的位置重新运行测试程序如下:def yield_test(): print("first") yield 1 print("second") yield 2for x in yield_test(): print("=======") print(x) ...原创 2020-04-21 20:51:49 · 249 阅读 · 0 评论