自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

、Edgar的博客

以一颗看破世间的心,写给一群想看的人

  • 博客(282)
  • 资源 (1)
  • 收藏
  • 关注

原创 使用 dlv 进行 debug

本文主要讲解如何使用 dlv 对 go 的产物进行 debug

2022-11-17 23:53:24 944 1

原创 Git 基本使用

概念当我们看到 Git 的时候,涌现上来的第一个想法就是 Git 是什么,我们为什么要使用 Git ?首先解决一下第一个问题,Git 是什么?Git 官网上有一段说明: Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. 翻译一下就是说:Git

2021-12-18 11:44:12 863

原创 动手写一个 HTTP 正向代理

概念首先我们来了解一下 HTTP 代理的相关概念,通常来说,有两类 HTTP 代理,一类是正向代理,一类是反向代理,虽都是代理,但仍有区别。我们平时使用的 VPN 就是正向代理,我们指定一个服务器,然后通过正向代理去连接这个服务器获取资源Nginx 是典型的反向代理服务器,可以用于负载均衡和缓存,我们不清楚服务器的地址,但是我们访问反向代理服务器的时候,它会自动为我们请求服务器,并且返回相应的内容。总结:正向代理下,我们知道服务器的具体地址,反向代理下,我们只需要知道代理服务的地址,无需知道具

2021-12-06 15:17:59 2831

原创 八大排序算法及其Go代码实现

1.选择排序原理每次选择数组中的最小元素,排在第一个位置算法步骤[38,65,97,76,13,27,49]13 [65 97 76 38 27 49]13 27 [97 76 38 65 49]13 27 38 [76 97 65 49]13 27 38 49 [97 65 76]13 27 38 49 65 [97 76]13 27 38 49 65 76 [97]13 27 38 49 65 76 97代码实现func SelectSort(data []int) { l

2021-11-29 18:00:14 444

原创 分布式 ID 生成器

背景假设我们有一个分布式系统,系统中需要维护全局 id 字段,我们可以把它认为是唯一的标识,不能够重复出现,那么问题来了,我们应该如何生成这样的 id 呢?其实很容易想到的一种解决方式就是使用 Redis 的键值对了,每次更新的时候直接调用 incr,生成的 id 也是唯一的,还有一种方式就是使用 MySQL 或者其他的数据库,因为我们知道 MySQL 中可以生成自增主键,使用这个主键作为一个分布式 id 也是可行的。但是上面的这两种方式效率不会特别高,并且依赖于第三方,我们如果想要更高效的生成分布式

2021-11-24 16:40:50 464

原创 一致性哈希算法原理及代码实现

一致性哈希安装go get -u github.com/junhaideng/consistent使用c := consistent.New()ips := []string{"192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4"}for _, ip := range ips { c.Add(ip)}fmt.Println("ip: ", c.Get("/hello.txt"))背景在介绍一致性哈希之前,首先来看

2021-11-10 21:43:17 1074

原创 Rust 引入其他的 rs 文件

最近在用 Rust 写一个课程项目,网上没有找到很好的文章说明如何引用文件,这里做一个简单的笔记。使用 mod 引入本地文件比如说,我现在通过 cargo new 创建一个项目,然后我新建了一个 cache.rs 文件,和main.rs同级,里面定义了一个结构体以及相关的函数pub struct Cache {}impl Cache { pub fn new() -> Cache { return Cache {}; } pub fn set(&amp

2021-10-28 23:30:50 13677 4

原创 Rust实现udp 服务端和客户端

客户端use std::io::{self};use std::net::UdpSocket;fn main() { let client = UdpSocket::bind("127.0.0.1:8889").unwrap(); client.connect("127.0.0.1:8080").unwrap(); let mut buf = String::new(); loop { let size = io::stdin().read_lin

2021-08-21 20:14:27 1633

原创 Rust tcp 客户端和服务端实现

客户端use std::io::{self, Write};use std::net::TcpStream;fn main() { let mut stream = TcpStream::connect("127.0.0.1:8080").expect("connect failed"); loop { let mut input = String::new(); let size = io::stdin().read_line(&mut input).expect

2021-08-21 19:57:15 4078

原创 NATS 基本使用

NATS 是一个开源的分布式消息队列系统,基于消息发布订阅机制。使用NATS我们的程序可以在不同的环境,不同的语言之间进行通信。客户端一般使用一个URL连接到NATS服务端,然后订阅消息或者发布消息。基于主题的消息机制NATS的消息基于subject,发送的消息和订阅的消息都有一个subject标记,简单来说,subject就是一串字符串,发布者和订阅者可以使用这些名称来查找对方NATS 服务端保留了几个特殊的字符,规范的subject只包括字母数字和.,并且区分大小写不能包含空格。主题层次

2021-07-13 10:21:22 9767

原创 爬取51Job数据

爬取前程无忧上的招聘岗位,项目地址:GitHub使用方式go get github.com/junhaideng/51job// 创建一个新的Job,指定log,数据保存地方以及关键字j := job.NewJob(zap.NewExample(), f, keyword)// 直接运行j.Run()效果数据列可以有很多,这里主要取了一部分job_name, job_href, company_name, company_href, salary, workarea, issuedat

2021-06-20 20:16:07 5354

原创 go get 指定commit 版本

今天使用go get命令下载包的时候,最开始因为自己上传到GitHub上的module名称有误,没有声明为github.com/xx/xx格式,后来修改之后重新push了一下,但是go get还是之前的commit的版本,这种情况下我们使用下面的命令即可// 这里以github.com为例,当然其他的仓库也是可以的go get github.com/xxx/xxx@commit-idcommit-id可以在本地查看,使用git log或者git reflog均可,也可以在网上仓库上查看,GitHub

2021-06-20 15:52:24 5575 1

原创 go 生成火焰图简单讲解

环境搭建进入 官网 安装好 graphviz使用方式首先,我们实现自己的逻辑代码,并且完成对应的基准测试代码编写,比如:func BenchmarkStrConcat(b *testing.B) { for i := 0; i < b.N; i++ { str := "" for i:=0; i < 128 ; i ++{ str += "Hi " } }}在运行测试代码的时候指定cpuprofile参数go test -bench . -cpuprofil

2021-06-18 09:59:34 1683

原创 如何查看本地windows 是否是NT内核

网上似乎没有直接的资料?下面提供一个简单的方式,通过F12进入开发者工具,选择Network(网络)选项,查看一条请求信息,如果没有请求数据,刷新一下网页,如下查看 User-Agent头部就可以知晓是否为NT内核,笔者这里表示的确为NT内核...

2021-06-06 16:34:52 2935

原创 全自动下载Leetcode题目

LeetCode 题目下载助手爬取所有的题目,保存在每一个文件夹下的README.md中,并且保存对应的代码模板源码见: GitHub运行之后会在对应的目录下写入题目描述和对应的代码模板leetcode/├── LCP 06 │ ├── README.md│ └── main.go ├── LCP 07 │ ├── README.md│ └── main.go ├── LCP 08 │ ├── README.md│

2021-06-05 22:44:11 1029

原创 多线程模型介绍

线程的实现方式有两种用户级线程内核级线程在用户级线程中,线程的管理都由应用程序完成,内核意识不到线程的存在,应用程序可以通过线程库设计成多线程程序在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口有些系统采用组合的方式,既有用户级线程,又有内核级多线程多线程模型有些系统同时支持用户级线程和内核级线程,由此产生了不同的多线程模型多对一模型多个用户级线程对应一个内核级线程 优点:线程管理在用户空间,不需要切换到内核态,消耗

2021-05-29 12:08:25 684

原创 linux下使用getaddrinfo获取相关地址信息

/* 使用getaddrinfo获取主机对应的相关数据*/#include <iostream>#include <netdb.h>#include <string.h>#include <iomanip>#include <netdb.h>#include <arpa/inet.h>using std::cout;using std::dec;using std::endl;using std::hex;

2021-04-24 08:53:07 709

原创 C++ vector 初始化大小

一维数组使用下面的代码可以初始化一个大小为n的一维数组vector<int> dp(n);二维数组使用下面的代码可以初始化一个row 行col列的二维数组 vector<vector<int>> dp(row, vector<int>(col));三维数组使用下面的代码可以初始化一个三维数组,维度分别为n1, n2, n3vector<vector<vector<int>>> dp(n1, vector&

2021-04-12 15:46:43 4183

原创 C++实现五种排序方式

插入排序#include <iostream>using std::cout;using std::endl;void printArr(int arr[], int n){ for (int i = 0; i < n; i++) { cout << arr[i] << "\t"; } cout << endl;}void insert_sort(int arr[], int n){ printArr(ar

2021-03-28 09:23:09 312

原创 g++ 编译之后中文乱码解决方式

设置下面的参数即可-fexec-charset=GBK如g++ -o .\bubbleSort.exe -fexec-charset=GBK .\bubbleSort.cpp或者将源文件的编码格式改成gbk, 如在Vs code中可以如下设置

2021-03-28 09:14:51 2809

原创 常用HTTP状态码及相关含义

2xx 200->表示请求成功,获取到相应的内容 204->服务器成功处理请求,但是没有返回内容 206->服务器成功处理请求,返回资源的一部分,一般在HTTP请求中设置了Content-Range字段3xx 301->请求的网页已经永久移动到另外一个位置,如果时Get或Head请求,会将请求转到新的位置 302->网站临时移动到另外一个服务器,但是请求者应该继续使用原有的位置来响应以后的请求。 303->查看其他位置 304->自上次请求之后

2021-03-03 12:03:05 142

原创 undefined reference to `__imp_WSAStartup‘

在windows下使用winsock2.h库的时候出现下面的问题:net.cpp:(.text+0x2f): undefined reference to `__imp_WSAStartup'net.cpp:(.text+0x48): undefined reference to `__imp_socket'net.cpp:(.text+0x93): undefined reference to `__imp_inet_addr'net.cpp:(.text+0xaa): undefined ref

2021-01-27 22:30:56 2168

原创 第一章--核心套路篇 之 滑动窗口算法框架

滑动窗口算法的主要代码框架如下// s 是所给的字符串或者其他数组// t 是目标值func slidingWindow(s, t string) { need := make(map[byte]int) window := make(map[byte]int) for i:=0;i<len(t);i++{ need[t[i]] ++ } left, right := 0, 0 valid := 0 // s不一定是字符串,还可以是其他类型的数组 // 如果右指针还没

2021-01-24 20:15:15 287

原创 第一章--核心套路篇 之 双指针技巧框架

双指针可以分成两类,一类是快慢指针,一类是左右指针,前者主要解决链表中的问题,比如典型的是判定链表中是否存在环;后者主要是解决数组或者字符串中的问题,比如二分搜索快慢指针的常见算法1.判定链表中是否存在环判断一个链表是否存在环的一个直接了当的方式就是设置一个map表,不断访问链表,如果访问的元素出现了重复,那么链表中便存在环,否则如果访问到了null,便不存在环,伪代码如下:type Node struct{ Data interface{} Next *Node}func hasCy

2021-01-24 11:47:29 227

原创 资源分配之最大最小公平分配算法

在实际生产过程中,我们经常面临给多个用户分配一组资源的场景,他们都有等价的权力来共享这一段资源,那么我们应该如何来分配资源呢?下面的最大最小公平分配算法是实际中广泛运用的一种算法最大最小公平分配算法的形式化定义如下:资源按照需求递增的顺序进行分配不存在用户得到的资源超过自己的需求未得到满足的用户等价的分享资源比如说有4个用户,分别需要[2,4,4,5]的资源量,总的资源只有12,那么首先进行第一次分配,平均分配12/4=3资源量,但是对于第一个用户来说分配的资源量大于需求,那么进行第二层分配的

2021-01-23 11:40:06 4739 1

原创 第一章--核心套路篇 之 BFS算法套路框架

BFS算法套路框架BFS(Breath First Search)和DFS(Depth First Search) 是两种十分常用的算法,其中DFS算法可以认为是回溯算法BFS算法和核心就是将问题抽象成图,从一点开始进行扩散,一般来说写BFS的时候均使用队列,每次将一个结点周围的所有结点加入到队列中BFS相对于DFS的主要区别是:BFS找到的路径一定是最短的,但代价是空间复杂度比DFS高算法框架func BFS(start Node, target Node) { // 假设Queue是已经实

2021-01-22 20:47:42 333

原创 第一章--核心套路篇 之 回溯算法解题套路框架

解决一个回溯问题,实际上就是一个决策树的遍历过程,需要考虑下面的三个要素:路径:已经做出的选择选择列表:当前可以做出的选择结束条件:达到决策树底层,无法做出选择的条件代码框架如下:var result []路径 // 保存结果的数组func backtrack(路径,选择列表){ if 满足结束条件{ 加入到result中 return } for _, 选择 := range 选择列表{ // 做出选择 路径 = append(路径, 选择)

2021-01-22 20:39:14 224

原创 第一章--核心套路篇 之 动态规划解题套路框架

首先动态规划问题的一般形式就是求最值,动态规划其实是运筹学中的一种最优化方法,只不过在计算机中的应用比较多,比如求最长递增子序列,最小编辑距离等既然是求解最值,核心问题就是穷举,因为要求最值,肯定要把所有可行的解全部穷举出来,然后在其中寻找最值,遇到最值问题,就要思考如何穷举所有可能结果。动态规划的穷举与一般的穷举有所不同,因为这类问题存在重叠子问题,如果暴力穷举,效率极其低下,所以需要使用备忘录或者dp table来优化穷举过程,避免不必要的计算动态规划类问题一定会具有最优子结构,这样才能通过子

2021-01-22 10:54:05 182

原创 Linux 下C++实现socket服务端和客户端

server.cpp#include <iostream>#include <unistd.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <thread>#include <signal.h>#include <arpa/inet.h>using namespace std;//

2021-01-21 13:16:43 1682

原创 Latex 常用数学符号

希腊字母表示法符号\alphaα\alphaα\etaη\etaη\nuν\nuν\tauτ\tauτ\betaβ\betaβ\thetaθ\thetaθ\xiξ\xiξ\upsilonυ\upsilonυ\gammaγ\gammaγ\iotaι\iotaι\phiϕ\phiϕ\deltaδ\deltaδ\kappaκ\kappaκ\piπ\piπ\chiχ\chiχ

2021-01-20 11:45:16 686

原创 Go获取腾讯动漫今日份更新动漫并使用飞书进行消息通知

喜欢看动漫,但是不喜欢记每天啥啥动漫更新了(也不太记得????),所以写了个小程序进行通知获取最近更新我们只需要获取到下面的这些内容就好了右击进行元素检查,很容易可以找到最近更新所在的元素那么我们只需要获取到对应的元素即可,下面使用colly进行抓取,当然你也可以使用python等语言继续进行操作// 保存相关内容type Info struct { Index int Title string Info string Href string}func getUpdate

2021-01-15 13:34:16 469

原创 Go中对于时间戳的操作

Go time包中包含了一系列对于时间的操作,下面的代码演示了如何获取到Time类型对应的时间戳以及如何将时间戳转换成对应的Time类型package mainimport ( "fmt" "time")func main(){ // 解析时间 t, err := time.Parse("2006-01-02 15:04:05", "2021-01-13 14:04:05") if err != nil{ fmt.Println(err) return } // 输出时间

2021-01-13 14:15:36 625

原创 RSA算法的加解密过程及Go语言中RSA使用

RSA算法过程首先选择两个不相等的素数 p,qp, qp,q计算p,qp, qp,q的乘积n=pqn=pqn=pq,nnn即为密钥的长度计算n的欧拉函数φ(n)=(p−1)(q−1)\varphi(n)=(p-1)(q-1)φ(n)=(p−1)(q−1)随机选择一个整数eee使得1<e<φ(n),(e,φ(n))=11<e<\varphi(n), (e, \varphi(n))=11<e<φ(n),(e,φ(n))=1,即e,φ(n)e, \var

2021-01-12 12:07:12 567

原创 使用Go对文件进行tar打包和解包

使用tar进行归档package mainimport ( "archive/tar" "fmt" "io" "os" "path/filepath" "flag")var filename string var directory string func init(){ flag.StringVar(&filename, "f", "", "the tar filename") flag.StringVar(&directory, "dir", "", "

2021-01-12 09:31:35 1144

原创 基于 React & Nodejs 搭建实时聊天系统

chat-room代码已经上传到 GitHub,如果喜欢,不妨给一个⭐️说明本项目灵感来自交大x字节跳动的公开课,样式参考其demo1,但本项目采用React2所写,UI组件使用Antd3本项目实现的功能有: 用户登录 用户注册 单人聊天 多人聊天 表情发送 文件传输 发送语音 视频通话本项目采用的技术有: React & Antd开发前端界面 Electron打包应用程序,本地测试不适用于https,因为证书不被信任 nodejs &

2021-01-08 12:45:18 1952 1

原创 使用Go自己动手搭建一个HTTP代理服务器

代理服务器的工作方式如下:客户端向代理服务器发送请求,表明自己需要请求的网站内容代理服务器接收到来自客户端的请求之后,通过解析,获取到需要访问的web服务代理服务器将客户端的请求信息全部转发给web服务器web服务器返回响应消息给代理服务器代理服务器将返回的消息转发给对应的客户端下面介绍一下如何使用golang搭建一个简单的HTTP代理服务器(不支持HTTPS)1. 首先,我们需要绑定一个端口监听客户端的请求,如果客户端发送请求,便进行相关处理func main() { // 端口

2021-01-07 09:58:39 2459

原创 椭圆曲线加法原理计算

公式定理这里我们仅考虑素域Fp(p>3)F_p(p>3)Fp​(p>3)上的椭圆曲线,因为素域FpF_pFp​的特征不为2,3,所以素域FpF_pFp​上的椭圆曲线E的WeierstrassWeierstrassWeierstrass方程可设为E:y2=x3+a4x+a6E: y^2 = x^3 + a_4x + a_6E:y2=x3+a4​x+a6​其判别式Δ=−16(4a43+27a62)≠0\Delta=-16(4a_4^3+27a_6^2)\neq0Δ=−16(4a43​

2021-01-03 08:32:59 6134 1

原创 golang http请求时设置代理ip

在http.Client中自定义Transport,设置Proxy即可,目前网上存在很多代理ip网站,本人也写过一些代理ip网址的爬取,见 GitHub// 如果需要代理验证,那么如下进行设置// 否则直接设置为url.Parse("http://inproxy.sjtu.edu.cn:8000")uri, err := url.Parse("http://username:password@inproxy.sjtu.edu.cn:8000")if err != nil{ log.Fatal("

2021-01-01 10:58:37 18885

原创 解决 pkg.go.dev 有时访问不了

在pkg.go.dev中查看文档的时候,有时候访问不了,但是有时候又可以正确访问,原因是这个网站对应多个服务器,有时候访问的时候解析DNS返回的ip地址无法访问,比如说对应的172.217.24.19地址无法ping通,但是216.58.200.51可以正确ping通我们可以在hosts文件中(windows 平台该文件在C:\Windows\System32\drivers\etc)进行修改,添加这样一行# pkg.go.dev216.58.200.51 pkg.go.dev然后刷新dns缓存

2021-01-01 10:07:29 1525

原创 golang multiple-value xxx in single-value context

使用下面的代码的时候会出现这样的错误,原因是user.Password()返回值有两个,但是只能在fmt.Println中一个位置只能使用一个值,所以会出现这样的问题user := url.UserPassword("username", "password")fmt.Println("username: ", user.Username())fmt.Println("password: ", user.Password())fmt.Println(user.String())解决方法:分别定

2021-01-01 01:36:23 4873

ppt普通版-实用版-等线版.pptx

上海交通大学统一PPT模板, 具体可以查看学校的网站 http://vi.sjtu.edu.cn/,上面有更多的资源可以下载

2020-05-15

空空如也

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

TA关注的人

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