自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(223)
  • 收藏
  • 关注

原创 系统建模的三个“陷阱”

为什么直接将系统运行模型作为传输模型定义门面服务API不是合理的做法,其中的关键原因在于我们的系统往往是复杂的,系统的复杂带来的是运行模型的复杂,复杂的运行模型作为传输模型会将很多不必要的信息暴露于外界,给外部调用方带去无谓的复杂性。一个系统值不值钱,就看它的领域建模值不值钱。简单来讲就是允许系统外部模型例如DO(存储模型)、DTO(传输模型)存在扩展参数,同时保证系统核心运行模型的完全结构化,不存在扩展参数,外部模型在转换为运行模型的过程中对扩展参数进行结构化转换,使扩展参数转换为运行模型的结构化参数。

2024-02-05 11:27:12 813

原创 代码整洁之道:一个提升代码可读性的小技巧

对于任意一个系统的任意系统行为,都可以将其进行步骤化拆解。例如对于用户详细信息查询行为进行步骤化拆解,可以拆解为:查询条件校验 -> 查询用户基本信息 -> 根据用户基本信息查询用户详细信息 -> 结果校验 -> 返回。以上对于系统行为的步骤拆解方式,拆解出来的步骤1 -> 步骤2 -> 步骤3 -> ……,总结起来其实就是行为的控制流。即任何系统行为都可以拆解为一段控制流。控制流描述目的或动机,对于控制流中的任意流程节点,其只关心该步骤的目的或者动机,与实现目的的过程没有关系,

2024-01-07 20:38:47 927

原创 【2023年终总结】谈谈一个新人眼里的阿里方法论

我是Ian,一个喜欢琢磨事儿的互联网从业者。如果你觉得我说得不对,那一定是你对,毕竟这只是一个工作小半年的职场新手的一些小小思考,但我所说的东西对你有一定的启发,欢迎一同交流,一起进步成长。

2023-12-31 19:17:20 981

原创 校招求职经验分享——我是如何本科进入大厂的

清晰的求职规划才能让你的求职毫不费力,这是决定你求职成败的关键要素所在。那么大学生如何做求职规划呢,从我的角度出发一共分为四大步:1. 求职方向选择 2.求职技能积累 3.职业实践(校园经历、企业实习) 4. 校招面试准备。只要前三步你做的足够好,第四步是不会给你造成太大的困难的。以上经验总结仅仅是站在本科生的角度去看待这个求职问题,所以注重于实践。也许研究生阶段有所不同,但我认为关键的——方向、技能、实践、面试,这四大步依然可供参考的。

2022-12-08 19:29:46 1599 2

原创 Tomcat详解之servlet的URL映射

    本文所要解决的问题是:如何让tomcat将HTTP请求映射到servlet类上让其实现功能。要搞清楚这个问题,我们首先弄清楚一个正确的对应一个servlet类的HTTP请求是怎样的:    例如,给定一个链接:http://localhost/web/test,其中最关键的部分是/web/test,称为request URL(不包括链接中附带的参数)。在/web/test中,/web称为context path(上下

2021-02-17 19:50:48 2734

原创 在Windows本地给Linux服务器安装JDK详细教程

1.在官网下载JDK安装包下载地址:点击这里注意:需要下载Linux版本2.将安装包传到Linux服务器方法一:使用FileZilla软件下载地址:点击这里方法二:在Linux中使用sftp传送(1)打开Linux服务器命令行窗口,输入alt+p打开sftp文件传输界面(2)使用put命令,输入 put + jdk安装包在本地windows下的地址,点击回车开始传输安装包3.将安装包解压(1)在Linux服务器的 /usr/local/ 目录下创建文件夹jdk[root@VM

2020-12-17 16:09:46 458 1

原创 欧拉图(欧拉回路与欧拉通路)

在一个图中(有向图或无向图),如果能够从一个结点出发一次性通过所有边且每条边只能通过一次,在通过所有边后能够回到出发点,则该回路称为该图的欧拉回路;不能回到出发点,则该通路称为欧拉通路。含有欧拉回路的图称为欧拉图,含欧拉通路的称为半欧拉图。最简单的欧拉图:最简单的半欧拉图:如何用算法得到一张有向图的欧拉通路呢(无向图算法类似)?我们来看下面这张图:假设1是起点,则有效的欧拉通路是1–>3–>4–>5–>3–>1–>2;看似我们只需要用最普通的DFS算法(DF

2020-08-27 21:35:42 2868

原创 leetcode647(回文字串:manacher算法)

给定一个字符串s,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。例:输入:输入:“bbb”输出:6解释:6个回文子串: “b”, “b”, “b”, “bb”, “bb”, “bbb”题解(一):动态规划,构造动态规划函数 F(x,y)记录字符串s第x-1个字符到第y-1个构成的子字符串是否为回文字符串。进行动态规划时,通过遍历字符串s,从找长度为1的回文子串开始,逐次增长回文字串长度进行回文字符串的判断。class

2020-08-20 12:07:00 273

原创 二叉搜索树的遍历搜索(Java实现)

1.二叉搜索树的概念一棵二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以以链表的数据结构来表示,其中的每个结点就是一个对象。2.二叉树结点对象的属性(1)key(关键字,用于代表整个对象)(2)基本数据和信息(3)left、right和p,分别指向结点的左子结点,右子结点,父结点(父节点的使用较少时,可以省略) class TreeNode { int key; //关键字 TreeNode left; //左节点 TreeNode right; //右

2020-08-11 19:32:39 352

原创 图的搜索——BFS和DFS

图是一种重要的数据结构,许多图的算法一开始都会先通过搜索来获取图的结构或者图中结点所保存的信息,图的搜索技巧就是图的相关算法的核心。图的搜索算法有两种设计核心,分别是BFS(breadth first search)和DFS(depth first search),表示广度优先搜索和深度优先搜索。1.BFS搜索算法所谓广度优先算法,就是对图G的边以结点为单位进行系统性的探索来发现从源节点出发能到达的其他所有结点,广度优先算法的特点是搜索位置每到达一个点,就会挨个继续探索这个点的所有出边(边的指向是从该

2020-08-04 21:39:29 334

原创 C++程序解线性一次方程组

利用矩阵的思想解方程组,将线性一次方程组写成增广矩阵,编写代码将增广矩阵中的系数矩阵通过行与行相消转化为上三角矩阵。int main() //解十二元一次方程组 { srand((unsigned)time(NULL)); double a[12][13]; for (int i = 0;i < 12;i++) { for (int k = 0;k < 13;k++) { a[i][k] = ra

2020-06-22 11:25:58 1329

原创 阻塞检查机制

如何感知线程是否发生阻塞,在很多应用场景下这都是值得我们去思考的问题。如果线程因为各种原因长时间发生阻塞,则会影响系统执行效率,降低系统tps。为了感知线程阻塞问题,我们可以建立一套线程阻塞自感知机制,对线程状态进行监控,当检测到当前任务执行线程的任务执行时间过长时,自动触发告警,提醒开发人员系统存在线程阻塞,进行问题定位和排查。

2022-09-03 22:35:35 486

原创 分布式锁的实现

为了在并发环境下保证数据的一致性,我们通常会采用加锁的方式。如果数据只存在于一台服务器上,则只需要使用单机锁则可以解决数据不一致的问题。而在分布式集群中,一个变量的值可能被一个集群的多个节点所共享,此时若要保证变量的一致性,仅在一台机器中加锁是不够的,我们需要做的是给集群加锁,这就是分布式锁。......

2022-07-16 20:18:26 534

原创 流量订阅框架flow-monitor设计

1. 流量订阅定义  在对流量进行监控并量化的基础上,在代码逻辑层面对特定的流量阈值进行事件响应,例如限流削峰、历史流量落库等2. 框架的设计思路  提供流量监控器对流量大小进行监控并实时精确量化,同时对特定流量大小提供自定义回调响应,在实时流量大小达到回调响应触发条件后,以异步或者同步的方式及时触发回调响应3. 框架设计目标   a.流量监控器对流量监控需要实时、准确、直观   b.订阅响应的触发时机精确,响应快速   c.高可扩展性、高可用性4. 流量订阅流程图5. 方案详细介绍 

2022-05-15 12:00:15 588 1

原创 go实现消息队列

使用Golang实现一个消息队列,具体要满足以下功能:可以向消息队列发送消息和拉取消息可以向消息队列发送消息和拉取消息发送的消息不能超过指定的容量拉取消息支持拉取指定数量的消息,如果不满足指定的数量,等待超时以后返回超时时间内拉取的所有消息(不会超过指定的数量)使用Golang中的基本数据结构和功能来实现package mainimport ( "time")// MessageQueue define the interface for the messag

2022-04-29 12:44:22 3201

原创 go容器介绍

1. 数组  数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,数组的长度是固定的。数组的初始化 var 数组变量名 [元素数量]Type // 定义三个整数的数组 var a [3]int var array_name [size1][size2]...[sizen] array_type // 声明一个二维整型数组,两个维度的长度分别是 4 和 2 var array [4][2]int数组间的比较  不同于Java,

2022-04-25 16:13:01 772

原创 限流削峰——限流器的实现

  限流削峰是对服务端进行流量控制的常见手段,控制QPS上限以达到减轻服务端负担的目的。  一个好的限流削峰方案应该实现以下三条原则:   1. 对系统入侵性小,与业务充分解耦,以降低维护成本   2. 使用合适的限流模型,达到流量QPS的精准控制   3. 高性能,响应迅速,尽量降低业务请求在限流逻辑上所花费的时间   目前主流的限流模型主要有三种:   1. 滑动时间窗  设置一个时间窗口,控制该时间窗口中能通过的最大请求数。虽然固定窗口方法提供了一个简单的思维模型,但有时它每分钟允许的请

2022-03-25 17:14:56 1842

原创 蚂蚁国际 一面、二面、HR面 已offer

1. 背景  中南大学智能科学与技术专业大三在读,本科期间参加过许多比赛,包括但不限于华为、麒麟软件、腾讯等公司举办的软件开发比赛,都拿过名次。目前在携程集团国际事业部实习,目前已经实习了三个月,打算换个公司看看。趁着阿里春招就投了蚂蚁的岗位,没想到流程推进的极快,一周的时间从一面到HR面就走完流程了,HR面完第二天就得到leader口头offer(这样不可能被挂了吧……)  岗位是国际支付中台基础架构部后端Java开发。2. 一面  由于我简历里面项目比较多,主要项目也和RPC、Netty相关,面

2022-03-22 17:16:32 4107 5

原创 分布式RPC框架

一、fastCall基本介绍fastCall是一个基于Java语言的分布式RPC框架demo,供RPC初学者学习使用 fastCall框架目前基于netty+zookeeper实现fastCall的设计架构主要参考了gRPC以及dubbo,分为客户端、服务端和注册中心,未来可能会加入服务治理监控中心,以及支持Restful API二、fastCall RPC分布式框架的实现基础Call ID映射,在远程调用的过程中,每个方法都需要对应一个具有唯一性的ID,这个ID在客户端和服务端中都是唯一确

2022-03-05 19:23:06 2128

原创 定时器Timer

  在JDK中,Timer类的主要作用是设置计划任务,即在指定时间执行某个任务,它在内部使用多线程的方式进行处理,与Java多线程技术有着非常大的关联。  以下为Timer类的简单使用示例public class TimerTest { public static void main(String[] args) throws InterruptedException { Timer timer=new Timer(); timer.schedule(new Ti

2021-12-05 21:10:30 176

原创 ThreadLocal类的使用

  线程之间的共享变量可以通过public static变量的形式实现,如果要实现每一个线程都有自己私有的变量,最简单的方法就是为每一个启动的线程初始化一个线程实例  一个线程对应一个线程实例,如以下代码所示:class MyThread extends Thread{ public String test; MyThread(String val){ this.test=val; } @Override public void run(){

2021-12-03 20:22:47 667

原创 SQL题:第二高的薪水

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。idsalary110022003300例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。SecondHighestSalary200题解1:使用子查询和limit...

2021-12-01 21:45:23 459

原创 字节跳动日常实习一面面经

岗位:字节跳动广告数据平台Java后端研发实习生面试轮次:一轮技术面1.基础知识TCP/IP四层模型  (1)应用层, 负责处理应用程序的逻辑,常用协议有HTTP协议、DNS域名服务、FTP协议等  (2)传输层,进行端到端的数据通信,常用协议有TCP协议、UDP协议  (3)网络层,IP数据包的封装和路径选择,常用协议有IP协议  (4)网络接口层RPC协议  RPC 即 Remote Procedure Call,是一种计算机通信协议,该协议允许运行于一台计算机的程序调用另一台

2021-11-29 22:49:29 877

原创 百度日常实习一面面经(Java后端)

  岗位:百度ACG物联网部门后端开发Java日常实习  面试轮次:技术面一面一、项目相关(Java Netty)NIO模型和BIO模型  BIO(blocking I/O),同步阻塞式I/O,即客户端与服务器建立一个连接时,服务器就会启动一个线程去进行处理,如果该连接上没有I/O请求,则负责处理该连接的线程就会发生阻塞。  NIO(no-blocking I/O),同步非阻塞式I/O,即当客户端与服务器建立一个连接后,会将该连接注册到多路复用器(selector)上,用一个线程对这些连接进

2021-11-26 20:25:20 935

原创 百度一面算法题:柱状图的最大矩形面积

给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例:输入:heights = [2,1,5,6,2,3]输出:10  这是我在百度日常实习一面中面试官出的一道算法题,在此记录一下解题思路。  这道题的解题突破口是水桶模型,也就是说一个水桶能装多少水是取决于最短的那块木板的。这道题同理,我们需要找到直方图中最矮的column,但不是简单的找到整个柱状图中最短的column就完了,而是一

2021-11-26 15:13:08 747

原创 JVM虚拟机底层结构

  Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。这些区域有不同的用途。  JVM结构模型如下图所示。  从上图中可以看出,JVM底层结构主要可以分成五个部分,分别是堆、方法区、虚拟机栈、本地方法栈、程序计数器。  1.线程共享  2.线程私有...

2021-11-15 22:25:40 1059

原创 electron-builder包下载过慢问题解决

  第一次使用electron-builder在不同平台进行打包时,会先在在github下载该平台对应的包,如果出现下载过慢的情况,可以切换镜像源,加快下载速度。  第一次打包时,使用以下指令:ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron/ electron-builder --linux/win...

2021-11-10 00:27:01 865

原创 Java缓存池

  Java对于每一种基本数据类型都会创建一个缓存池。  基本数据类型对应的缓存池如下:boolean values true and falseall byte valuesshort values between -128 and 127int values between -128 and 127char in the range \u0000 to \u007F  在使用这些基本类型对应的包装类型时,如果该数值范围在缓存池范围内,就可以直接引用缓冲池中的对象,否则会创建一个新的

2021-10-29 16:37:23 1188

原创 el-card设置滚轮(scrollbar)的位置

如何实现动态自定义设置el-card的滚轮位置  首先,我们要将el-card的滚动显示溢出内容的功能开启,具体做法:<template> <el-card class="card"> <div> <!-- your content --> </div> </el-card></template><style scope>.card{ overflow

2021-09-25 23:36:15 9079

原创 腾讯极客挑战赛第四期:鹅罗斯方块——赛后复盘

1.比赛总结  七月底的时候在网络上看到了这样一个赛事,赛题大概总结起来就是用代码玩一款十分经典的游戏俄罗斯方块,通过游戏得分来排名评比,觉得挺有意思,抱着随便试试的想法就参加了,结果最后获得了全国第49名,最终获得的最高分数是31万多一点,虽然和第一名的一百多万还是有不小的差距,需要改进反省的地方还有很多,但这一成绩还是基本达到了我的预期的,同时我也是成功获得了腾讯招聘的绿色通道,丰富了自己的履历。2.比赛复盘  在赛事官网可以找到俄罗斯方块游戏的比赛入口,进入游戏之后可以发现游戏的界面是一下这样

2021-08-14 23:02:04 1037 3

原创 electron-vue打包后运行exe文件白屏,但是在npm run dev之后再运行exe文件又可以正常显示

  最近在使用electron-vue的过程中遇到了一个特别神奇的问题。对electron-vue项目执行electron-builder进行打包后,运行exe文件始终不能显示正常内容,一直都是白屏。试过网上的很多方法解决问题均没有效果,但最后看到了一个方法:先执行npm run pack,生成dist文件,然后再执行electron-builder进行打包,最后问题得到了解决,可以正常显示内容了。...

2021-07-27 15:44:35 1285

原创 为什么在Java中重写equals()方法同时要重写hashcode()方法

  要彻底了解透为什么重写equals()方法同时要重写hashcode()方法,我们不妨先来看看这样一个例子: String a=new String("123"); String b=new String("123"); System.out.println(a==b); //false System.out.println(a.equals(b)); //true System.out.println(a.h

2021-07-22 23:01:13 300 5

原创 SuperDog——一个基于netty的web服务器开发项目

  netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。利用netty可以很轻松的实现一个接收web浏览器http请求并进行应答的http服务器demo...

2021-07-21 17:56:34 385

原创 leetcode1838(最高频元素的频数:滑动窗口)

元素的频数是该元素在一个数组中出现的次数。给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。实例:输入:nums = [1,2,4], k = 5输出:3题解:滑动窗口  此题中只能对元素进行增加操作,最先能想到的思路是:对数组先进行排序,然后遍历数组中的每一个数字,每遍历到一个数字,就计算出该数字的最大可能频数,最后比较返回最大可能频数即可,但这样去操

2021-07-19 10:12:53 205

原创 中南大学智能计组汇编实验,需要的自取

  中南大学计组汇编实验,一共十个题目,8086实现,我本身的编译环境是vscode上的masm/tasm插件,代码附详细注释  需要的自取,别忘了github上给一颗星星哈~  github地址:https://github.com/HelloWorld-Ian/8086_asm_experiment...

2021-07-09 17:46:03 366 2

原创 基于io.jsonwebtoken的jwt工具类——tokenUtils

   实习期间利用无聊的空余时间写的一个JWT的工具类,可以用于token生成,token解码,token刷新。工具类基于io.jsonwebtoken——一个jwt的生成库。import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import java.lang.reflect.Fie

2021-07-09 14:48:46 6433 1

原创 8086汇编实现KMP算法(中南大学智能计组实验)

  中南大学智能科学与技术专业计组实验题目:实现 KMP 算法,输入两个字符串(可以直接保存在内存中),实现快速匹配,用8086汇编实现  这个题目是所有实验题中最难搞得一个,这里附上代码,学弟学妹们需要的自取DATA SEGMENT TARGET DB "created by ian in 2021/7/8" ;define the target TARGET_LEN DW 26 ;length of

2021-07-09 09:54:17 914 2

原创 leetcode773(滑动谜题:BFS广搜)

在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。示例:输入:board = [[1,2,3],[4,0,5]]输出:1解释:交换 0 和 5 ,1 步完成输入:board = [[1,2,3],[5

2021-06-26 12:40:41 131

原创 求最大公约数

  求两数的最大公约数的方法:  方法一: public int gcd(int a, int b) { int min=Math.min(a,b); while (min>0){ if(a%min==0&&b%min==0){ return min; } min--; } return min; }

2021-06-24 08:50:32 100

原创 leetcode31(下一个排列:两边扫描)

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]题解:两边扫描  使用两遍扫描的方式来找出数组nums的下一个更大的排列,步骤如下:  1. 找出与数组末尾相连,从后往前的最大升序子数组(nums[ i ]>=nums[ i+1]),将指针left标记到该子数组左边界的左

2021-06-22 10:46:19 77

空空如也

空空如也

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

TA关注的人

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