自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(582)
  • 资源 (2)
  • 收藏
  • 关注

转载 解决 git 同步错误 gnutls_handshake() failed

今天在服务器上使用 git 访问 GitHub 时,出现了 gnutls_handshake() failed 错误,经过分析,问题应该在 gnutls 模块上。该错误可以通过从源码构建 git 安装包,并将 gnutls 替换为 openssl 解决。

2022-06-19 21:41:23 4401

原创 [c++] c++17 在编译期判断是否存在某个函数

#include <bits/stdc++.h>namespace detail {template <class Default, class AlwaysVoid, template <class...> class Op, class... Args>struct detector { using value_t = std::false_type; using type = Default;};template &

2021-11-01 13:09:41 866

原创 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 245

原创 使用 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 199

原创 使用 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 309

原创 [linux] gcore生成运行程序的 core 文件

GCORE(1) GNU Development Tools GCORE(1)NAME gcore - Generate

2021-06-15 19:30:15 1769

转载 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 803

原创 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 332

原创 [git]push 到远端的不同 branch

本地分支 push 到远端的不同 branchgit push origin local_branch:remote_branch从远端的不同branch pull 代码git pull origin remote_branch

2021-04-27 09:53:09 644

原创 [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 1875

转载 [转]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 252

原创 [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 331

原创 [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 372

原创 [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 513

原创 [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 148

原创 [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 1330 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 1587

原创 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 1405

转载 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 1770

原创 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 939 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 578

原创 c++ 构造函数抛异常

如果构造函数抛异常,则析构函数不会被调用,已经初始化了成员变量则被系统依次释放,此处可能引起内存泄露#include <iostream>class T2{public: T2(){std::cout << "T2()" << std::endl;} ~T2(){std::cout << "~T2()" << std::endl;}};class T1{public: T1(){ a = ne

2021-03-02 15:44:50 351

原创 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 346

原创 [c++]数组全排列

#include <vector>#include <functional>#include <iostream>using namespace std;constexpr int empty_val = -1;void Permutation_List(vector<int> &array, int pos, function<void(const vector<int> &x)> &foo)

2020-12-20 21:53:28 503

原创 [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 224

原创 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 893

原创 int64的读写操作是否具有原子性质

在 x86-64 机器上,int64 的读写操作是否具有原子性?假设变量 val 是 int64, 现在有两个线程,线程 writer 只负责向 val 写入数据,线程 reader 只负从 val 读取数据假设 val 当前值为 0x0102030405060708writer 线程正在执行写操作,将数据 0x0000111100002222 写入 valreader 线程正在执行读操作,从 val 读取数据那么 reader 线程得到的 val 只能是 0x0102030405060708

2020-11-21 11:50:07 1006

原创 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 419

原创 [pulsar] pulsar go sdk 测试

docker 启动 pulsardocker run --rm -p 6650:6650 -p 8080:8080 apachepulsar/pulsar:2.6.0 bin/pulsar standalonepulsar go sdkpackage mainimport ( "context" "encoding/binary" "github.com/apache/pulsar-client-go/pulsar" "log" "sync")func main() { cli

2020-11-03 14:59:10 491

原创 etcd 分布式锁实现原理

docker 启动 etcddocker run --rm -p 2379:2379 -p 2380:2380 --name etcd \quay.io/coreos/etcd:v3.4.9 etcd \--name node1 \--initial-advertise-peer-urls http://127.0.0.1:2380 \--listen-peer-urls http://0.0.0.0:2380 \--advertise-client-urls http://127.0.0.1:

2020-11-02 17:25:34 1012

原创 Mongodb go sdk 测试

启动 mongodbdocker run -it --rm -p 27017:27017 --name mongodb -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo:4.4mongo_exp1.gopackage mainimport ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mon

2020-10-21 13:31:45 260

原创 使用 Docker 启动 mongodb

使用 docker 启动 mongodb$ mkdir db$ docker run -it --rm -p 27017:27017 -v ${PWD}/db:/data/db --name mongodb -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo:4.4安装 mongodb-shell $ wget -qO - https://www.mongodb.org/static/pgp/

2020-10-20 21:22:55 1223

原创 [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 387

原创 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 182

原创 [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 7610

原创 [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 544

原创 [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 1974 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 182

原创 [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 423

原创 [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 684

fetch12306

本文在Linux平台上,以Python为开发工具,介绍12306抢票软件的基本原理,并引入示例,讲解如何自己编写一个12306抢票软件。

2016-12-22

lq51--自己写的基于51单片机的嵌入式实时操作系统

Keil 自带的 RTX51—Tiny 系统有这样几个缺点:1、非占先式任 务调度,这样系统的实时性就很难保证;2、提供的系统服务太少, 只有 wait 与 signal。而 RTX51—Tiny 的优点是:1、Keil 公司自己开 发的,使用_task_关键字区别每个任务,这样可以使得被不同任务调 用的不同函数即使没有相互调用,他们的局部变量也不会相互覆盖。 免去了在 SmallRTOS 中需要手动制止函数间局部变量的相互覆盖。 2、内核小。整个 RTX51--Tiny 完整编译只需 900B 的空间。 lq51 系统整合了 RTX51—Tiny 的优点。1、在 lq51 系统中_task_ 关键依然有效,0 号任务依然是最高优先级的任务,1 号任务次之, 依次类推。2、lq51 系统完整编译只需 2.5K 的 ROM,并且系统自带 的 128B RAM 对 lq51 系统也是绰绰有余的。同时 lq51 系统弥补了 RTX51—Tiny 的缺点。首先 lq51 系统采用占先式任务调度,这样可 以最大限度保证系统的实时性。其次 lq51 系统提供 lqDelay、lqWaitFlg、 lqWaitSem、lqWaitMsg 这样四种系统服务,并 且每种系统服务都是可裁剪的。 lq51 系统中很多关于实时系统的概念及实现方法是从 ucosII 中学 来的,同时借鉴了 SmallRTOS 及 RTX51—Tiny。

2009-04-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除