DoneSpeak

DoneSpeak

唯爱、艺术与美食不可辜负

LeetCode | 13. 罗马数字转整数
前言难得上一次“精选题解”,那就顺手发一下吧。 题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的...
Spring Security认证流程
前言Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固。 过滤器链和认证过程 一个认证过程,其实就是过滤器链上的一个绿色矩形Filter所要执行的过程。 基本的认证过程有三步骤: Filter拦截请求,生成一个未认证的Authentication,交由AuthenticationManager进行认证; AuthenticationManager的默认实现ProviderManager会通过AuthenticationProvider对Authentication进行认证,其本身不做认证处理; 如果认证通过,则创建一个认...
SpringBoot解决CORS问题
写在前面的话在做前后端分离的开发或者前端调用第三方平台的接口时经常会遇到跨域的问题,前端总是希望能够通过各种方法解决跨域的问题。但事实上跨域问题是安全问题。这篇文章将会讲解一些为什么会有跨域问题,并提供一个方便的解决方法。为了阅读的流畅,相关的参考链接均会在文章末尾给出。本文使用的springboot版本为2.1.6.RELEASE,相应的spring版本为5.1.8.RELEASE。 跨域问题的产生跨域问题的产生是因为浏览器的同源策略。同源策略将协议+域名+端口构成的三元作为一个整体,只有三者均相同的情况下才属于一个源。跨域问题也就是不同源之间访问导致的问题。 同源策略限制了从同一个...
为easyexcel设置TimeZone
写在前面导出Excel是系统中经常用到的功能。实现的方案也很多,可以自己去封装Apache Poi,也可以直接使用别人已经封装好的类库。如果需求简单的话,自己做实现也是可以的,所有的bug和feature都将是可控的。使用第三方的类库主要是方便,避免重复造轮子,但不好地方在于如果发现bug或者feature不满足时,会严重受限于类库版本的迭代。 在导出数据中经常会含有时间,在时间格式化时,如果不指定时区,则会使用服务器的时区进行格式化,这样可能导致导出的时间不是希望的时间。因而指定时区是一个很重要的功能。由于EasyExcel没有提供指定时区的功能,因而需要自己进行解决。 12345...
实现自己的Protobuf Any
前言在一种API的设计中,有如下的设计,这也是网上经常看到的。123456@Datapublic class ApiResult { private int code; private String error; private Object data;} 如果要等价替换的话,可以有如下的设计:12345message ApiResult { int32 code = 1; string error = 2; google.protobuf.Any data = 3;} google.protobuf.Any 可...
Protobuf与POJO的相互转化 - 通过Json
前言这篇文章是《Protobuf与Json的相互转化》的一个后续,主要是为了解决系统分层中不同ProtoBean与POJO的相互转化问题。转化的Protobuf和Pojo具有相同名称及类型的属性(当Proto属性类型为Message时,对应的为Pojo的Object类型的属性,两者应该具有相同的属性)。 转化的基本思路测试使用的protobuf文件如下: StudentProto.proto123456789syntax = "proto3";option java_package = "io.gitlab.donespeak.javatool.toolprotobuf.proto"...
Protobuf与Json的相互转化
前言最近的工作中开始使用Google的Protobuf构建REST API,按照现在使用的感觉,除了应为Protobuf的特性,接口被严格确定下来之外,暂时还么有感受到其他特别的好处。说是Protobuf比Json的序列化更小更快,但按照目前的需求,估计很就都没有还不会有这个性能的需要。既然是全新的技术,我非常地乐意学习。 在MVC的代码架构中,Protbuf是Controller层用到的技术,为了能够将每个层进行划分,使得Service层的实现不依赖于Protobuf,需要将Protobuf的实体类,这里称之为ProtoBean吧,转化为POJO。在实现的过程中,有涉及到了Prot...
Java 工具箱 | 图片-Base64 互转
前言最近真的被图片上传的功能给烦恼了。在web的项目中,我们经常会有上传图片的业务场景,最典型的是上传头像。为了解决头像上可以有如下的实现: 使用 multipart/form-data 上传用户信息和头像,也即是使用html里面的<form></form>。如 gitlab中修改用户信息的头像。 先将图片上传到图片服务,并获取图片连接,之后再用这个图片连接修改用户信息。 直接上传图片的Base64编码信息,作为图片的数据,后台再将编码转化为图片文件。 这里将讨论的是第三中实现方法的中的图片与Base64编码互转。 在网页中,会有如下两种处理图片的方式,一...
用回溯法计算消消乐游戏最大得分
前言这是一个非常非常简单的消消乐游戏。在一个 M*N 的网格中,一共有种物品。玩家可以列向或者行向得交换两个物品。当列向或者行向存在3 ~ 5个连续的相同物品时就可以消除将这些物品。消除3,4,5个连续的相同物品的得分分别为1,3,10。当物品被消除之后,上方的物品会垂直下落对空缺进行填补。如果填补之后依旧存在3~5个连续且相同的物品,则继续进行消除。如果交换操作无法消除任何物品,则禁止该操作。题目要求在指定的步数内拿到最高的分数。 如上图所示,交换了图中2和3之后,会存在连续的4个2和3个3的情况,然后会一起消除,得分为 1 + 3 = 4分。事实上,再消除完成之后,上方...
MySql 全文检索两个字符的内容无法得到结果
问题描述数据库中有如下的地址信息表,需要实现一个更具用户输入的任何内容进行搜索可能匹配的地址信息。12345678910111213-- MySQL版本: 5.7.25CREATE TABLE Address ( id BIGINT NOT NULL AUTO_INCREMENT, address VARCHAR(100) NOT NULL DEFAULT '', city VARCHAR(50) NOT NULL DEFAULT '', state VARCHAR(50) NOT NULL DEFAULT '', country VARCHAR(50) N...
avatar
DoneSpeak
唯爱、艺术与美食不可辜负