DoneSpeak

DoneSpeak

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

为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...
n 阶幻方问题
前言这是很久以前做的一个实验的内容,觉得特别有意思,所以一直想发布出来,没想到拖着拖着就到现在了。 问题描述一个n阶幻方是把从1到n^2的整数赶往一个n阶方阵,每一个数只出现一次,每一行、主副对角线的和都相等。 分析和本文基本概念分析据了解,4阶幻方个数的基本型就有880个,通过旋转和反射总共可有7040个不同的形式的,5阶幻方基本型有275 305 224个,6阶幻方的个数非常之多,皮恩和维茨考夫斯基利用蒙特卡洛模拟和统计学方法,也只能获得一个大概的估计数字,其数量在1.7743 x 10^19 ~ 1.7766 x 10^19之间,可见随着幻方阶数的增加其数量将会快速地增长。同时6阶...
初步认识 Stripe 支付
前言这段时间在做支付相关的工作,由于业务主要是面向国外的用户,因而就接触了部分国外的支付支付相关的平台。接下来的内容主要是初步看了 Stripe 平台的文档所了解到的基本内容,后面会在使用的过程中不断地进行完善。 基本介绍和与其他支付平台的对比什么是StripeStripe - 基于API的便捷支付渠道 中对Stripe所提供的功能/产品给了较为不错的参考。 使用范围在我写这篇博客之时(2019-04-07),stripe已经支持32个国家的使用,而我在查找资料的时候,看到的基本都是说25个国家。支持的国家(https://stripe.com/global) 从列表中我们可以看到,其...
Git-Flow规范和指令
前言在利用Git管理团队代码的时候,都会涉及到如何管理分支,如何发布版本的问题。如果能够制定一套统一的规则,就能够有效的保障团队的开发流程和效率。如下流程主要参考自 A successful Git branching model 进行的一个设计。能够确保各个分支的合理使用,以及发布版本的管理。此外,以下介绍的流程没有涉及到Pull Request 相关的操作,为的是能够快速地将每个开发的代码合并到主要分支,如果希望添加 Pull Request 的流程,可以在功能分支合并到开发分支中添加。 流程详细见:中文:介绍一个成功的 Git 分支模型英文:A successful Git bra...
avatar
DoneSpeak
唯爱、艺术与美食不可辜负