- 博客(35)
- 收藏
- 关注
原创 RPC01-原理概念
RPC(Remote Procedure Call)远程过程调用,一个RPC框架应该是帮我们屏蔽网络编程的细节,实现远程调用就跟本地调用一样的体验。总的来说,RPC的作用就是体现在这样两个方面:屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。为什么需要RPC?或如果没有 RPC 会怎样?所有的代码堆砌在一个项目中,开发过程中可能就会遇到,在只需要改一行代码, 编译却需要花很长时间。如果是团队开发项目,别人把接口定义改了的话,我们连
2021-12-05 15:37:04
515
原创 消息队列(MQ)学习笔记
概述Kafka本质上是一个消息队列(基于发布/订阅模式),主要用于 大数据实时处理领域(Spark 绝大部分是对接 Kafka)。A, B 两个系统间不直接链接,可以通过消息中间件传递消息。消息队列解耦:允许独立的拓展和修改消息队列两端的处理过程,只要其均遵守同样的接口约束即可。可恢复性:消息队列降低了进程间的耦合度,所以系统的一部分组件失效时不会影响整个系统。即使一个处理消息的进程挂掉,消息队列中的消息依然可以在其恢复后进行处理消费缓冲:控制和优化数据流经过系统的速度,解决生产速度和消
2021-09-16 23:03:42
217
原创 谷粒商城(二)——组件选型
接上篇:谷粒商城实战(一) 中,其他组件选型的内容:注册中心(服务发现/注册): SpringCloud Alibaba - Nacos配置中心(动态配置管理): SpringCloud Alibaba - Nacos负载均衡: SpringCloud - Ribbon声明式HTTP客户端(调用远程服务RPC?): SpringCloud - Feign服务容错(限流、降级、熔断): SpringCloud Alibaba - SentinelAPI网关(webflux编程模式): Spring
2021-09-12 19:28:23
238
原创 谷粒商城实战(一)——背景及环境准备
文章目录商城基础架构图:必要组件准备docker安装sql,redis指令VsCode 及相应插件创建所有的微服务目录利用现有后台管理框架二次开发代码生成其他组件选型商城基础架构图:必要组件准备docker安装sql,redisdocker的每个镜像,都可看做是在一个完整独立的Linux系统上加载了一个应用程序。指令更详细的指令学习,可参考:docker指令学习docker images:查看安装的镜像1、安装mysql镜像:去docker仓库,里搜索mysql各版本镜像sudo
2021-09-12 12:05:43
273
原创 SpringBoot-02一些注解
@Configuration 注解,与Spring中的 @Configuration 一样。基本使用:Full模式与Lite模式最佳实战配置类的 组件之间无依赖关系 用Lite模式加速容器启动过程,减少判断配置类的 组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式。解释:Full 模式,会保证实例的唯一性,即每次都会检查容器中是否存在对应的组件,然后在进行创建(即,单实例模式)。Lite 模式: 不检查,直接创建。###################
2021-08-22 23:01:42
133
原创 SpringBoot-01
概述为什么用SpringBoot?Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.即:快速创建出生产级别的Spring应用SpringBoot优点Create stand-alone Spring applications创建独立Spring应用Embed Tomcat, Jetty or Undertow
2021-08-22 19:52:42
114
原创 Java多线程
基本概念:进程与线程程序:是为完成特定任务而用某种语言编写的一组指令的集合。即指一段静态的代码。进程:是程序的一次执行过程(将程序加载到内存中进行运行),或是正在运行的一个程序。 是一个动态的过程:有他自身的产生、存在和消亡的过程(生命周期)。程序是静态的,进程是动态的进程作为 资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。线程:进程可进一步细化为线程,是一个程序内部的一条执行路径。若一个进程同一时间 并行 执行多个线程,则该进程支持多线程。线程作为 调度和执行
2021-05-29 08:46:33
79
原创 MyBatis
DAO层的其他工具与框架JDBC 的缺陷:代码啰嗦、开发效率低需要关注 Connection, preparedStatement, ResultSet 对象的创建与释放对 ResultSet 的查询结果,需要自己封装为 List代码重复的地方多,业务代码和数据库的操作混杂在一起最严重的:SQL语句是硬编码在程序中的,造成了强耦合——如果要优化 SQL 语句,就需要对整个项目进行重新编译,打包。Hibernate-数据库交互的框架(Object Relation Mapping,ORM)
2021-05-29 08:42:50
119
原创 CentOS 语言汉化
操作系统汉化包:dnf install langpacks-zh_CN安装 中文输入法:dnf install -y ibus-libpinyin.x86_64切换输入法:Windows + 空格查看已经安装的语言:locale -a
2021-04-19 21:31:57
338
原创 python 深度学习图片格式转换的总结
cv2 转 tensorimg = cv2.imread("a.png")# 转成 RGB 形式img0 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 归一化,并添加一个维度(Batch)img0 = torch.from_numpy(img0).div(255.0).unsqueeze(0) # N*W*H*C# 置换维度形式为 N*C*W*Himg = img0.permute(0, 3, 1, 2)cv2 转 numpy(PIL.Image)imp
2020-11-27 12:38:06
653
原创 XGBoost 与 LightGBM
XGBoost在商业实战中有非常广泛的应用场景,例如金融反欺诈模型、信用卡评分模型等。XGBoost 核心思想以 CART 回归树为基学习器的 梯度提升 算法boosting 继承学习多轮迭代,每轮迭代产生一个弱分类器(对上一轮 残差 进行拟合),每个分类器在上一轮分类器的梯度基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。让损失函数持续下降 --> 模型在不断下降。数学原理作为 GBDT 算法的高效实现,XGBoost 算法在如下两个方面做了优化算法
2020-08-26 17:27:31
526
原创 SSL握手过程
首先建立起一个TCP连接,然后开始SSL握手:客户发送它支持的密码算法的列表,连同一个客户的不重数;服务器从该列表中,服务器选择一种对称算法(例如AES)、一种公钥算法和一种MAC算法。它把它的选择和证书(包含公钥)和一个服务器不重数回给客户;客户验证该证书,并从中提取服务器的公钥,生成一个RSA公私钥、会话密钥。用服务器的公钥加密该 客户端公钥、会话私钥,发送给服务器;使用相同的密钥导出函数,客户和服务器独立地从 PMS 和不重数中计算出主秘钥(MS)。...
2020-08-18 16:50:18
303
1
原创 SVM 硬核推导,逻辑清晰
预备知识超平面 y=wTx+by = w^Tx + by=wTx+b 的性质:对 w,bw, bw,b 进行放缩,当倍数相同时,超平面不变点 xix_ixi 到超平面的距离计算式为:L=∣wTxi+b∣∥w∥L = \frac{|w^Tx_i+b|}{\|w\|}L=∥w∥∣wTxi+b∣超平面将空间划分为了三部分:面内:wTx+b=0w^Tx+b = 0wTx+b=0面上:wTx+b>0w^Tx+b > 0wTx+b>0面下:wTx+b<0w^Tx+b &l
2020-08-16 18:49:53
143
原创 C++ 多重继承之菱形继承
多重继承有如下的多重继承模式例子:#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class A{public: int _a;};// class B : public Aclass B : public A{public: int _b;};// class C : public Aclass C : public A{public: int _c;};cl
2020-08-14 10:45:29
226
原创 条件变量condition_variable 与生产者消费者问题
condition_variable 与 unique_lock 搭配使用。因为 lock_guard 不提供灵活的开锁unlock接口。condition_variable::wait(lck),等到收到通知:当前线程(应已锁定 lck 的互斥锁)的执行被阻塞,直到得到通知为止。在阻塞线程时(wait()):该函数会自动调用 lck.unlock(),从而允许其他锁定的线程继续执行。一旦收到通知(明确地由其他线程通知),该函数将取消阻塞并调用 lck.lock() 上锁,从而使 lck.
2020-08-11 15:32:57
460
原创 C++ 一些小功能的快速实现
求一个二进制数中 1 的个数class Soulution{public: int hammingWeight(uint32_t n) { int ans = 0; unsigned int flag = 1; while(flag){ if(flag & n) ans++; flag <<= 1; } return ans; }}判断一个数是不是 2 的幂,不可用循环语句/* 这样的数转换为二进制是 10、100..
2020-08-10 19:56:01
250
原创 C++11 多线程编程(三)——条件变量及生产者消费者问题
上一节 讲了互斥锁 mutex。其最为常见,但并发效率不高。一个简单的消费者生产者模型的组成:一个生产者线程向队列中放入数据;一个消费者线程从队列中取数据,取数据前需要判断一下队列中确实有数据。由于这个队列是线程间共享的,所以,需要使用 互斥锁 进行保护,一个线程在往队列添加数据的时候,另一个线程不能取,反之亦然。用互斥锁实现如下:#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <thread>
2020-08-09 16:07:45
563
3
原创 C++11 多线程编程(二)——锁
C++ 的 mutexC++11 中提供了互斥锁 mutex,可以用来对共享资源进行保护。其有两种操作:锁定 lock()与解锁 unlock()。例子:#include <iostream>#include <thread>#include <string>#include <mutex>using namespace std;mutex Mutex;// 使用锁保护// 形成一个线程安全的 print 函数void shared_p
2020-08-09 13:15:13
359
原创 C++11 多线程编程(一)
C++11 中提供了多线程的标准库:thread,其提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。一个简单的例子:#include <iostream>#include <thread>void f1(int i) { std::cout << "This is f" << i << " thread" << endl;}int main() { std::thread t1(f1, 1); t1.j
2020-08-09 11:48:13
215
原创 统计学习方法(二)
首先:李航——统计学习方法课后答案感知机notebook 实现属于比较简单的二分类模型,其思想是:错误驱动、梯度下降。且解不唯一(只要能满足样本点正确分类就视为成功),与初始状态和优化过程有关。其由输入空间到输出空间的函数如下:f(x)=sign(wTx+b)f(x) = sign(w^Tx + b)f(x)=sign(wTx+b)因此,对于给定的训练数据集:T=(x1,y1),(x2,y2),...,(xN,yN)T = {(x_1, y_1), (x_2, y_2), ..., (x_N,
2020-08-06 21:41:57
110
原创 统计学习方法(一)
首先:李航——统计学习方法课后答案正则化 正则化是结构风险最小化策略的实现,即:在经验风险(Loss)上加上一个正则化项(惩罚项)。正则化项一般是模型复杂的单调递增函数,即模型复杂度越大,正则化项的值就越大。其一般形式如下:minf∈F=1N∑i=1NL(yi,f(xi))+λJ(f)min_{f \in \mathcal{F}} = \frac{1}{N}\sum_{i=1}^N L(y_i, f(x_i)) + \lambda J(f)minf∈F=N1i=1∑NL(yi,f(x
2020-08-06 20:36:34
141
原创 进程、线程、协程的总结
学习 程序员小灰 - 一文讲透 “进程、线程、协程”的笔记记录进程程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。进程是-操作系统 提供的 抽象概念,是系统进行 资源分配和调度的 基本单位(出现线程以后,调度的基本单位就是线程),是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。当程序需要运行时,OS 将代码和所有静态数据记载到内存和进程的地址空间(每个进程都拥有唯一的地址空间)中,通过创建和初始化栈(局部变量,函数参数和返回地址)、分配堆内存以
2020-08-05 10:12:25
262
转载 信号量和互斥量的区别
参考:互斥量和信号量的区别互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源以上区别是主要想记住的。note:信号量可以用
2020-08-04 08:56:46
658
原创 MySQL 面试知识点总结
MySQL默认端口:33061. MyISAM 和 InnoDB 的区别索引结构不同MyISAM 是非聚簇索引:叶子节点中只保存了索引和与索引对应记录的物理页地址。InnoDB 是聚簇索引:即叶子节点中保存了完整的行记录,所以 InnoDB 文件自身就是索引文件。另一方面 InnoDB 的辅助索引树中,叶子节点中存储的是主索引,而不是地址和数据。换句话说,InnoDB 中使用辅助索引时,需要先遍历辅助索引树找到主索引,在依据主索引来主索引树中寻找对应的记录。是否只是行级锁MyISAM 只
2020-08-02 18:08:23
123
1
原创 C++ 单例模式及线程安全最佳实现
单例模式(Singleton Pattern)的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。介绍意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:
2020-08-01 20:31:57
664
原创 malloc 底层实现及Linux内存分配原理
1) malloc 函数实在虚拟地址空间中划分一片区域,而没有与物理页对应。1)当开辟的空间小于 128K 时,malloc 的底层实现是调用 brk()系统调用函数来在虚拟地址空间分配内存,其主要移动指针 _enddata (此时的 _enddata 指的是 Linux 地址空间中堆段的末尾地址,不是数据段的末尾地址,因为堆地址是向高地址增长的。)2)当开辟的空间大于 128K 时,malloc 的底层实现是 mmap() 系统调用函数在 虚拟地址空间中分配空间。这时候不再是单纯的堆高 _endata
2020-08-01 19:57:35
869
原创 python 禁止系统调用弹窗
例如:import oscmd = 'ping 127.0.0.1'os.system(cmd)这样会一直弹命令窗口;解决方案:使用 `subprocessimport subprocesscmd = 'ping 127.0.0.1'subprocess.run(cmd, shell=False)
2020-07-20 20:54:33
908
原创 C/C++ 避免重复定义
加入宏定义:第一种:#ifndef _STUDENT_H #define _STUDENT_H // student.h 中的内容置于此 struct ListNode{ int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} };#endif第二种, 在起始行加入:#pragma once这种方法可移植性较差(编译器可能不支持),并且也不够灵活,因为其只能作用于整个.h文件夹。...
2020-07-12 12:45:50
1441
原创 使用hexo搭建博客并部署到服务器
阿里云建站1. 购买阿里云服务器2. 配置服务器3.下载管理工具4.登录自己的云服务器5.下载JDK,Tomcat, git2. 配置服务器环境 nginx3. git如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章...
2020-01-27 23:47:41
1489
1
原创 指针作为函数的参数
在 C/C++ 语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值例子如下:当指针作为形参时,我们仅仅是用于改变指针所指向变量(实参)的值时,这是可以改变的。int a = 3;int *p = &a;void func1(int* val){ *val =...
2019-12-27 13:26:53
2613
原创 特征提取模型的轻量化之路(一)
一、 参数量和理论计算量1、计算公式:假设卷积核大小为 Kh×Kw{K_h×K_w}Kh×Kw,输入通道数为 Cin{C_{in}}Cin,输出通道数为Cout{C_{out}}Cout,输出特征图的宽和高分别为W{W}W和H{H}H,这里忽略偏置项CONV 标准卷积层:params:Kh×Kw×Cin×Cout{K_h×K_w×C_{in}×C_{out}}Kh×Kw...
2019-12-12 21:31:47
2191
原创 C++ const关键字
1 const与#define的区别 1. #define是预处理器选项,可能会不被认为是语言的一部分–在预处理阶段就完成了变量名的替换. const是编译器可见的,其占存储空间,位于符号表(symbol table)而不是内存. 在调试时可以"追根朔源". 2. 相较于#define,const更节省内存,其只有一份备份.而#define在程序预处理时,会将程序段中的所有宏进...
2019-11-27 11:29:58
137
原创 pytorch 1.0实现faster R-CNN,检验自己的数据集
pytorch 1.0实现faster R-CNN简介Step1、安装Step2、下载特征提取层的预训练(pre-trained)权重Step3、训练前的其他准备1)、准备数据集2)、修改相关代码Step4、开始训练Step4、批量Test训练好的model1、修改demo.py文件[1]2、输入指令3、可能遇到的问题及解决方案:简介 这个工程实战是***在Ubuntu***系统上基于jwy...
2019-07-22 17:04:28
10535
72
原创 PIC24HJ系列入门: 配置位及时钟配置
1、下载MPLAB X IDE 在MPLAB x 官网下载对应系统的mplab x IDE 并安装。如果是采用C语言编辑 还需要安装相对应的xc compiler编辑器。 楼主使用的是pic24hj256GP206A 所以用的是xc16或者c30。2、MPLAB X 操作简介导入低版本工程step 1、在文件下找到import,进入子菜单选择MPLAB IDE v8项目。step...
2019-04-20 14:41:42
2225
原创 Ubuntu16.04,Nvidia驱动+CUDA10.0+cuDNN7.4+CMake+OpenCV3.4.5+Darknet+tensorflow-gpu安装配置流程
1、系统及硬件我的系统是ubuntu16.04,显卡是双2080Ti。因为楼主也是初次基础ubuntu系统,所以在安装这些东西的时候多次把系统搞崩溃,导致系统重复登陆,或是无图形服务。这篇文章我会尽量写详细一些。如果有什么问题可以在讨论。2、Nvidia驱动卸载及安装2.1、下载驱动这里一定要注意!!!!这里一定要注意!!!!这里一定要注意!!!!进入tensorflow官网的Inst...
2019-04-06 20:36:20
719
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人