- 博客(282)
- 资源 (2)
- 收藏
- 关注
原创 搭建Java开发环境(MAC、IDEA)
不管三七二十一,先把需要的资源下载下来,然后挨个安装。IDEA:IntelliJ IDEA(ideaIU-2021.3.3-aarch64)JDK:Java Downloads | Oracle(jdk-8u333-macosx-x64)Maven:Maven – Download Apache Maven(apache-maven-3.8.6-bin)Git:Git - Downloads(git-2.33.0-intel-universal-mavericks)idea中application.prop
2022-06-29 15:56:59 1305 1
原创 C/C++的标准演进及对应的编译器
ISO - ISO/IEC 14882:1998 - Programming languages — C++WG21是C++标准委员会,ISO/IEC JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPPC++98/C++03标准1998年制定出的第一个C++标准ISO/IEC 14882:1998。通常被称为C++98,它不仅描述了已有的C++特性,还对该语言进行了扩展,添加了异常、运行阶段识别符(RTTI)、模板和标准模板库(STL)。2003年,发
2022-06-01 23:35:43 2582
原创 服务熔断——断路器
就像电路中的保险丝熔断一样,微服务架构中,上游服务因为过载或者故障不可用时(这种不可用情况是指长时间不可用且持续性远程调用,非暂时故障),需要及时使用断路器在下游的服务调用方暂时熔断调用方和服务提供方之间的调用链,避免出现服务雪崩进而拖挂整个业务系统,从而保证部分服务与系统整体的稳定性和可用性。服务雪崩,是指调用链的某个环节不可用时,导致下游调用方环节不可用,最终这种影响像雪崩一样扩大到整个系统中,导致整个系统不可用。断路器模式断路器代理了服务调用方对提供方的请求,它监控了最近请求的失败和超
2022-05-31 01:02:30 694
原创 常见的线程模型
线程之间的调度永远是一个复杂的话题,但是并发编程必然会涉及到操作系统对线程的调度。根据资源访问权限的不同,操作系统会把内存分为内核空间和用户空间,内核空间的指令代码具备直接调度计算机底层资源的能力,比如说 I/O 资源等;用户空间的代码没有访问计算底层资源的能力,需要通过系统调用等方式切换为内核态来实现对计算机底层资源的申请和调度。线程作为操作系统能够调度的最小单位,也分为用户线程和内核线程:用户线程由用户空间的代码创建、管理和销毁,线程的调度由用户空间的线程库完成(可能是编程语言层次的线程库),无
2022-05-30 22:51:05 848
原创 Redis 及其数据类型、编码格式
Redis,全称为远程字典服务(Remote Dictionary Server)。Redis 印象Redis 为什么叫 Redis(远程字典服务)?从形式上,作为开源的 kv 存储系统,使用了字典 dict 结构来管理数据,内部定义了数据库对象 server.h/redisDb 负责存储数据。typedef struct redisDb { dict *dict; // 数据库字典,该redisDb所有的数据都存储在这里 dict *expires; //
2022-05-30 01:03:27 836
原创 Go context 上下文
Go Context,goroutine 并发的利器,可以取消正在执行的 goroutine,即通过 Context 控制并发使得 goroutine 退出。先来看一个例子eg.实现了一个监控 deamon,会让程序一直运行,每隔1秒就会打印一次package mainimport ( "fmt" "sync" "time")func watcher(strName string) { for { .
2022-05-28 22:42:34 230
原创 Go sync 同步原语
Go 中不仅有 channel 这种 CSP同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步原语。使用它们,可以更灵活的控制数据同步和多协程并发。sync.Mutex sync.RWMutex sync.WaitGroup sync.Once sync.Cond sync.Map在一个 goroutine 中,如果分配的内存没有被其他 goroutine 访问,只在该 goroutine 中被使用,不存在资源竞争的问题。但如果同一块内存被多个 gorou.
2022-05-28 19:08:39 1810
原创 Go channel实现顺序无限输出123123123...
分析:顺序:需要同步,无 buffer channel 正好可以实现;无限:主协程阻塞,子协程为 deamon,或者说无限循环;需要开3个线程(协程),一个线程用来输出1,无限输出 一个线程用来输出2,无限输出 一个线程用来输出3,无限输出实现无限输出 123123123...package mainimport ( "fmt" "time")func print(curCh chan struct{}, nextCh chan stru
2022-05-28 11:11:44 858
原创 Go channel 通道
go routine 可以使用 channel 来进行通信,使用通信的手段来共享内存。使用形式有下面几种,无缓冲 channel 有缓冲 channel 需要注意 channel 的关闭时机 单向 channel channel + select,实现多路复用基本语法make(chan Type) 等价于 make(chan Type,0)make(chan Type, capacity)ch<- value // 发送 value 到 ch<- ch...
2022-05-28 02:48:41 383
原创 搭建Go 开发环境(Ubuntu,Windows上类似)
Windows 、Linux 上搭建 Go 环境的流程和 Mac 类似,但要比 Mac上 简单,搭建Go开发环境,开发 RPC 服务(MAC、VSCode)_Schuyler_yuan的博客-CSDN博客步骤如下,1. 下载并解压 Go Linux 安装包$ wget https://dl.google.com/go/go1.18.1.linux-amd64.tar.gz$ sudo tar -zxvf go1.18.1.linux-amd64.tar.gz -C /usr/local/
2022-05-27 16:22:40 229
原创 GMP 线程调度模型
GMP 是 Go 协程调度的 CSP 并发模型实现。Golang 内部有三个对象,goroutine,machine,processor。研究这块最好结合源码。GMP 调度模型G=Goroutine 协程,P=Processor 处理器, M=Thread 线程全局队列(Global Queue):存放等待运行的 G。 P 的本地队列:同全局队列类似,存放的也是等待运行的 G,存的数量有限,不超过 256 个。新建 G’时,G’优先加入到 P 的本地队列,如果队列满了,则会把.
2022-05-26 19:14:02 877
原创 Go 并发模型
Go 语言中实现了两种并发模型,一种是依赖于共享内存实现的线程-锁并发模型,另一种则是CSP(Communicationing Sequential Processes,通信顺序进程)并发模型。大多数编程语言(比如 C++、Java、Python 等)的并发逻辑都是基于操作系统的线程。并发执行单元(线程)之间的通信利用的就是操作系统提供的线程或进程间通信的原语,如共享内存、信号、管道、消息队列、套接字等。在这些通信原语中,使用最广泛的就是共享内存。 而 Go 语言从设计之初,就将解决上面传统并发模型问题
2022-05-26 18:54:39 664
原创 并发和串行、并行的概念
先抛开语言不管,只聊概念,说起并发,就很容易想到它和串行、并行的区别。串行:一次只能取得一个任务并执行这个任务,这个任务执行完后面的任务才能继续;并行:一次可以取得多个任务,并且可以同时执行这几个任务,几个任务在同一时刻互不干扰地同时执行;并发:一次可以取得多个任务,但是只能同时执行一个任务。同时安排若干个任务,这些任务可以彼此穿插着进行;有些任务可能是并行的,比如买菜、发邮件和去幼儿园的某些路途是重叠的,这时你的确同时在做三件事;但进菜市场和发邮件和接娃三者是互斥的,每个时刻只能完成其中一件。
2022-05-26 11:39:08 6098
原创 VSCode(Ubuntu、C++)
Ubuntu安装VSCode去VSCode官网下载 deb 安装包,运行命令安装即可$ sudo dpkg -i code_1.67.2-1652812855_amd64.deb安装成功,去Ubuntu搜索vscode,打开即可。为了以后方便使用,也可以直接拖拽到菜单栏。可以根据自己的需要安装常用的插件了,C/C++插件是开发C++必须的。C/C++,肯定是必须的。C/C++ Snippets,即 C/C++重用代码块。C/C++ Advanced Li.
2022-05-25 18:45:11 1108
原创 Go routine、channel、sync、context和好用的并发模式
Go routine 协程协程和通道,是 Go 语言并发的基础。谈并发,就绕不开线程,操作系统会为 deamon 服务创建进程,进程可以看作一个服务的工作空间,它包含了服务运行所需的所有资源(PCB控制块),比如内存空间、文件句柄等。线程是进程的执行空间,一个进程可以有多个线程,线程被操作系统调度执行,也就是可以实现多线程的并发。Go 中的并发,是通过协程 goroutine 来实现的。相比线程来说,协程更加轻量,一个程序可以随意开启成千上万个 goroutine。协程是被 Go 运行时所调度的,这
2022-05-24 11:17:30 226
原创 Golang中的项目管理是对代码包的管理
引言如果想要在项目中使用第三方代码库,C/C++ 中一般会有两种方法,1. 将第三方源码合并到自己的工程文件中直接编译;2. 将第三方代码先编译生成静态链接库(.a、.lib)或动态链接库(.so 、.dll) 放到工程目录下,然后通过条件编译直接使用。目前大多数主流语言都有一套标准的包管理解决方案,比如 Java 有 maven,Python 有 pip,Ruby 有 RubyGems,Rust 有Cargo,Nodejs 有 npm,PHP 有 composer。包管理工具用于自动化构.
2022-05-12 23:29:23 740
原创 Golang一角:环境变量(Go开发必需的环境变量、普通环境变量)
“环境变量”这个词,有经验的开发同学对它一定很熟悉了,它提供给软件工程以高灵活性、高扩展性,大到操作系统,小到某个项目,都有它的影子,它的表现方式有很多。微服务应用提倡将配置存储在环境变量中,任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。但是在实际开发中,如果同一台机器运行多个项目,在操作系统中设置环境变量容易冲突,不实用,就会有了从.env文件中读取配置, 然后存储到程序的环境变量中。一个项目对应一个 .env 文件,在代码中读取 .env 文件的方式也非常方便。很多大..
2022-05-07 00:23:00 4109
原创 一份方便的 Vim 配置
先贴图Vim 编辑器配置执行命令,$ vi ~/.vimrc复制下面的内容粘贴即可。"~/.vimrc"vim config file"date 2022-03-31"Created by shouyuan """"""""""""""""""""""""""""""""""""""=>全局配置<="""""""""""""""""""""""""""""""""""""""关闭vi兼容模式"set nocompatible"设置历史记录步数"s
2022-05-01 23:47:54 834
原创 MAC机后端开发必备
开篇:相信很多日常使用 MAC 进行软件开发的同学会有一种感受,在换 MAC 机的时候,拿到的都是一些裸系统,有一些常用必备的软件需要重新来安装一遍。我也遇到几次这样的问题,发现每次配置开发环境时都要安装那么几个方便好用的软件,在这总结一下备忘踩过的坑。brew(Homebrew),Mac上的包管理器,一般拿到 MAC 就要先安装这个工具,方便后面使用brew命令(类似Linux中的yum)安装开发环境。Mac上有Homebrew和Homebrew-cask,它俩之间的区别可以参考之前的记录:Ma
2022-05-01 23:44:24 2454
原创 搭建Go开发环境,开发 RPC 服务(MAC、VSCode)
一、配置 Go 1.18 开发环境1. install golang by brew$ brew install go2. set Path for Go# .zshrc# goexport GOROOT=/opt/homebrew/Cellar/go/1.18/libexecexport GOPATH=$HOME/workspace/project/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/binexport GOPROXY=https:
2022-04-29 16:48:22 3337 2
原创 海量数据TopN问题
1. 在十万的数字中找出前100?答:快排patition+二分,堆2. 10亿的数字找前10万,空间给1亿?答:(分治法加堆),时间复杂度klogk3. 100亿数字找前10亿,空间1亿?答:这个问题不是算法问题了,应该是在问工程上的实现,基本得靠切分到多台机器并行运算来解决,具体怎么做,看下那个64马找前四的问题。总之,对于海量数据问题,都是用的“map-reduce”的思想来分而治之,分开局部处理,之后再汇总起来计算。参考:海量数据中的TOPK问题小结 - Exca
2022-02-27 14:48:05 217
原创 leetcode——旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在重复元素值的数组numbers,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路:这个题咋一看,就是求数组里边的最小值,求最小值有很多的解法,最...
2022-02-27 12:55:49 109
原创 leetcode076——数组中的第 k 大的数字
题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4提示:1 <= k <= nums.length <= 104-104<= nums[i] <= 104思路:最直观的...
2022-02-27 12:35:00 627 1
原创 排序——快速排序(快慢指针实现)
之前总结过快排的两种解法,可以参考快排的两种常见解法,最近又发现一种更容易理解的方法,在这里做下记录。这是一种使用 “快慢指针比较” 的方法,来实现快速排序算法。实现快速排序算法的关键,先在数组中选择一个数字(可以理解为轴值),把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。int partition(vector<int>& nums, int start, int end) { int index = (sta
2022-02-27 12:03:19 1817
原创 Linux 什么是正则表达式
正则表达式,是一个描述一组字符串的模式。它主要用来文本搜索和字符串处理,一个正则表达式匹配单个字符或一个字符串,或者字符串的一部分。在计算机科学中,正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表
2021-11-27 22:40:16 1599
原创 Linux -- ln
ln创建文件链接,为某一个文件在另外一个位置建立一个不同的链接(软连接、硬链接)。命令格式ln [options] source distln_help~ $ ln --helpUsage: ln [OPTION]... [-T] TARGET LINK_NAME (1st form) or: ln [OPTION]... TARGET (2nd form) or: ln [OPTION]... TARGET... DIRECTORY
2021-11-23 09:38:52 100
原创 Linux -- dd
dd用于读取、转换并输出数据,详细点说,就是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。参考:Linux dd 命令 | 菜鸟教程linux命令总结dd命令详解 - 琴酒网络 - 博客园Have Fun...
2021-11-22 13:32:27 78
原创 Linux -- od
od用于按指定格式输出文件内容。语法od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]命令选项 -a 此参数的效果和同时指定"-ta"参数相同。 -A<字码基数> 选择要以何种基数计算字码。 -b 此参数的效果和同时指定...
2021-11-22 13:24:59 95
原创 Linux -- dos2unix、unix2dos
dos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2unix命令其实就是将文件中的\r\n 转换为\n。而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Windows格式文件的命令。参考:Linux命令学习总结:dos2unix - unix2dos - 潇湘隐者 - 博客园Linux命令之do
2021-11-22 13:05:20 575
原创 Linux -- find、xargs、locate、slocate、mlocate、which、whereis
相比于find查找,locate查找具有无可比拟的更快的速度,这是因为locate不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息(也可以理解为建立了一个文件名称索引)。Linux系统自动创建这个数据库,并且每天通过crontab自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。slocate的完整名称叫做:secur...
2021-11-22 12:59:35 1376
原创 Linux -- ls、dir、vdir
lslist files,用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。语法ls [-alrtAFR] [name...]命令选项-a 显示所有文件及目录 (.开头的隐藏文件也会列出) -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 -r 将文件以相反次序显示(原定依英文字母次序) -t 将文件依建立时间之先后次序列出 -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录) -F 在列出的文件名称后加一符号;.
2021-11-22 11:21:04 850
原创 Linux -- touch、mkdir
touch用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。ls -l 可以显示档案的时间记录。语法touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]命令选项a 改变档案的读取时间记录。 m 改变档案的修改时间记录。 c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
2021-11-22 10:54:50 437
原创 Linux -- pwd
pwdprint work directory,用于显示工作目录。执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。Have Fun
2021-11-22 10:49:22 104
原创 Linux -- cd
cdchange directory,用于切换当前工作目录。语法cd [dirName]其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。另外,~也表示为 home 目录 的意思,.则是表示目前所在的目录,..则表示目前目录位置的上一层目录。Have Fun...
2021-11-22 10:27:35 351
Pima Indians Diabetes Data Set
2022-05-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人