Maven使用
微服务
非单体项目,可以用下面的脚本启动微服务。
!/bin/bash |
核心命令是这一条:
mvn spring-boot:run -pl $your_service |
想要增加JVM参数,指定端口可以加上
-Dspring-boot.run.arguments=--server.port=$your_port |
非单体项目,可以用下面的脚本启动微服务。
#!/bin/bash |
核心命令是这一条:
mvn spring-boot:run -pl $your_service |
想要增加JVM参数,指定端口可以加上
-Dspring-boot.run.arguments=--server.port=$your_port |
#外岛数量 #bfs
杰克船长在公海上游荡,每发现一处岛屿,他就会绕着岛走一圈,并把这个岛标记到地图上。
这个问题的解决方法就在这里:我们一定要有一片完全连通的公海,只有在公海上遇到岛屿,才标记岛屿数量;绝不踏入内海。
可是测试用例是这样的:
5 5 |
这个测试用例,只有(0, 0)
是公海,怎么办呢?
我们用一圈公海把测试用例包围起来:
private static void processInput(Scanner sc) { |
排序每一个单词,就知道是不是异位词。
从数组中,找到nums[i] + nums[j] == target
,并返回{ i, j }
。
思路是双重循环,遍历每一个元素,求和是否为target。
然而,双重循环需要O(N2)的复杂度。因此,可以使用一张表,使用containsKey
方法识别是否存在当前i的target - nums[i]
,即可减少一重循环。
用Map高效率查找,减少一重循环。
从乱序数组中,找到最长连续(数组中不一定连续)的序列。要求O(N)。
首先用数组的值存入哈希表,然后遍历数组,判断map.constains(curNum++)
。
然而,即使这样还是效率不够高。
优化
!contains(curNum - 1)
判断是否为序列开始值去重;不处理中间值
self
上进行开发develop
分支,git pull --rebase
同步最新代码不要使用Git Pull
git pull
会创建一个新的merge commit
,这样提交历史不是一条清晰的线,包含无意义的分支合并,非常混乱。
而git pull --rebase
会解决这个问题,这个命令首先把你的commit
放到一边,拉取最新分支状态,最后为你自动变基到最新状态。
如果遇到合并冲突,使用git rebase --abort
撤回rebase
,然后使用git pull
或者使用交互式变基。
self
,git rebase develop
对齐代码合并冲突分支是临时的,完成了分支的职责后,就删除此分支。不要重复用分支,而是从主分支再创建一条特性分支。
git config --list --show-origin
查看所有git配置以及所在文件git config --global
可以设置git的基本信息(如用户名、邮箱),使用--unset
取消设置
git config --global user.name "191220000-Zhang San" |
git init
创建一个新的 git 仓库,其数据会存放在一个名为 .git
的目录下git add <文件名字,*表示全部> |
git clone
克隆远端仓库# 查看remote |
不推荐dsa和rsa,推荐ed25519
ssh-keygen -t ed25519 -C "your_email@email.com" |
git tag v0.0.version |
Before starting the topic let me introduce myself. I am a Mobile Developer currently working in Warsaw and spending my free time for interview preparations. I started to prepare for interviews two years ago. At that time I should say I could not solve the two sum problem. Easy problems seemed to me like hard ones so most of the time I had to look at editorials and discuss section. Currently, I have solved ~800 problems and time to time participate in contests. I usually solve 3 problems in a contest and sometimes 4 problems. Ok, lets come back to the topic.
Recently I have concentrated my attention on Dynamic Programming cause its one of the hardest topics in an interview prep. After solving ~140 problems in DP I have noticed that there are few patterns that can be found in different problems. So I did a research on that and find the following topics. I will not give complete ways how to solve problems but these patterns may be helpful in solving DP.
Modularity: 模块化,分而治之
Abstraction: 抽象,接口与实现分离,遵循宽进严出原则。例如虚拟内存、文件系统
对于大型系统,只有模块化和抽象,可能导致划分模块太多,交互关系复杂,因此还需要引入分层和层次结构控制复杂度。
Layering: 分层,每个层级是一套完整机制。通常一个模块只能与本层和上下层交互,不能跨层。例如OSI、TCP/IP
Hierarchy: 层次结构,大的子系统由多个小的子系统组织成。即同级模块的分层
宽进严出原则:容忍各种输入(包括恶意输入),严格控制模块的对外输出
宏内核架构:单点bug使整个系统崩溃。
微内核:解耦单个功能/模块(如文件系统、设备驱动)作为独立服务隔离运行,使内核成为一个最小功能集。
微内核架构服务隔离,单点出问题系统不会崩溃
内核态部分,称为μkernel
微内核优势:
现代操作系统特征:1)虚拟内存;2)用户态、内核态隔离。
网址就是请求服务器上对应的文件
DNS从顶级域名开始根据网址查IP。DNS服务器通过缓存查过的IP来加快服务响应(缓存拥有有效期)。
浏览器调用Socket库建立连接管道
应用将数据分割为许多个网络包,TCP加上头部发送出去。需要发送的信息会缓存起来,超出计时时间或者数据量大于一个包大小时才发出去。
TCP需要确认对方收到数据,但是为了不浪费时间,实际上TCP在等待确认信息的过程中也在发送包,这个方法称为滑动窗口。
为了使接收方有足够的时间处理数据,接收方有一个接收缓存,当缓存满了会在TCP头部中通知发送方;处理完成,缓冲区有空余时也会通过TCP头部通知发送方。
通信完成后,发送方会保留套接字一段时间,以防对方的FINISH信号发送有延迟,把新的相同端口的套接字错误删除。
用电信号传输数据时,用高电平表示1,低电平表示0.为了防止连续的低电平读不出来,会有一条时钟信号(固定切换高低电平)
ICMP:定义各种消息,如超时、无法到达、超出转发能力
UDP在发送的数据少于一个包(重发也只需要发一个包,代价小,如DNS查询控制信息)、发送的数据具有时效性(如音视频,必须快速发送,即使重发也没有意义)的情况下使用。UDP只负责收发数据,对方没收到就全部重发一遍。
有状态:用户请求接口 -> 从Session中读取用户信息 -> 根据当前的用户来处理业务 -> 返回
缺点:不支持分布式
无状态:用户携带Token请求接口 -> 从请求中获取用户信息 -> 根据当前的用户来处理业务 -> 返回
<dependency> |
public class JwtUtils { |
public class JwtAuthenticationFilter extends OncePerRequestFilter { |
// 将Session管理创建策略改成无状态,这样SpringSecurity就不会创建会话了,也不会采用之前那套机制记录用户,因为现在我们可以直接从JWT中获取信息 |
采用黑名单方案。一台服务器存储JWT黑名单,共享给所有微服务。
JWT.create() |
public class JwtUtils { |
本章将介绍MIPS汇编语言指令。
add a, b, c // a = b + c
MIPS汇编语言使用这样的固定记法。
每条MIPS算术指令只执行1个操作,仅有3个变量。
变量f、g、h、i、j依次分配给$s0~$s4,编译下面的C语句
f = (g + h) - (i + j); |
只有少量数据存在寄存器中,因此需要在存储器和寄存器间传输数据
A的基址是存在$s3,编译下面的C语句
A[12] = h + A[8] |
addi $t0, $t1, 4 // t0 = t1 + 4;无需读取4,作为立即数相加 |