自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(570)
  • 资源 (3)
  • 收藏
  • 关注

原创 java:基于guava实现Map的Key类型替换

google 的 guava是功能很丰富的基础工具库,它的com.google.common.collect.Maps工具类提供了很多对Map方便工具方法提供了一系列transform方法可以实现对Value的转换比如 可以通过一个Function将Map的所有Value转为另一个类型V2,即将转为但是没有提供Key类型的转换方法。不过知道了原理,自己实现也不复杂。如下是我基于和方法实现的Key类型转换工具方法,实现将转为调用示例:参考资料Maps.uniqueIndex(Iterable, Fun

2022-12-06 13:46:56 19

原创 jsqlparser:实现MySQL 函数DATE_FORMAT到Phoenix函数TO_CHAR的替换

上一篇博客《jsqlparser:基于语法分析实现SQL中的CAST函数替换》中我用jsqlparser这个神器实现了 替换。现在又遇到新问题了,MySQL中日期格式化函数为DATE_FORMAT,对应Phoenix中的函数为TO_CHAR,如果应用层使用函数,也要替换为才能在HBase数据库中正常执行。有了上次经验,这次就简单多了,不同的是的日期格式定义与Phoenix不同,所以的参数也需要自动替换,但是只能不完全替换。以下为实现代码完整的代码参见码云仓库:https://gitee.com/l0

2022-12-03 14:53:56 60

原创 jsqlparser:基于语法分析实现SQL中的CAST函数替换

最近遇到一个问题,应用层提供的SQL语句中有这样的语句,在MySQL中执行肯定是没问题的,但是后台数据库切换到了HBase,使用apache phoenix 提供的JDBC驱动访问时却报错了,按照phoenix官方的文档,CAST函数是支持,但现实就是报错过不了,应该是我使用的phoenix版本问题,应该是个BUG,暂时无法通过升级版本解决。解决方案也不复杂就是用phoenix的Native函数函数来代替,将替换为。那么问题来了,如果让应用层来替换这事很方便,但是我们希望数据存储对应用层是透明的,应用层不需

2022-12-03 13:33:19 130

原创 java:BeanPropertySupport实现复杂类型对象的成员访问

在实际的工程设计中,当我们设计了一个复杂的数据对象,对象中还嵌套有子对象,子对象可能还会有更多的嵌套时,如果没有工具辅助,要获取一个对象的子成员下的子成员,需要写好几行代码逐级获取,这中间还要涉及到判空的问题,如果成员类型是Map/JSON对象那还要从Map中读取子成员,如果是Sting 类型JSON字符串,那获取下面的子成员更麻烦还要涉及解析JSON解析。要使用的实际 getter 或 setter 方法的名称是 JavaBeans 标准定义的,例如,名为“xyz”的属性将有一个名为。

2022-11-10 10:07:16 170

原创 java: 自定义java.util.logging.Logger的日志输出格式,输出IDE(ECLIPSE)能自动识别行号的格式

我们知道在java环境有很不少第三方提供的日志记录库,比如常用的log4j,其实JDK (1.4 or above)本身也提供了日志输出工具,就是 .但这个工具吧,用也能用,却不好用,聊胜于无。对于用惯了log4j的我来说,它不好用,下是用输出的日志日志输出了两行,还没有显示行号,在开发环境中我找这行日志的输出位置很麻烦啊。同样的代码用log4j输出,比较就可以看出log4j提供的输出内容更短,但提供了更多有效内容,即代码行号,并且在eclipse等IDE中这个格式的输出可以提供超链直接定位到对应

2022-11-09 17:57:54 216

原创 jsqlparser:实现基于SQL语法分析的SQL注入攻击检查

sqlparser是一个java的SQL语句解析器,在上一篇博客:《jsqlparser:基于抽象语法树(AST)遍历SQL语句的语法元素》介绍了如何通过jsqlparser来遍历SQL语句中所有的字段和表名引用。其实它可以用来进行更复杂的工作,jsqlparser会将一条SQL语句的各种语法元素以抽象语法树(AST,abstract syntax tree)形式解析为很多不同类型对象,通过对AST的遍历就可以对SQL语句进行分析。采用这种方式做SQL注入攻击检查不会有误判,漏判的问题。

2022-11-09 12:53:53 454

原创 jsqlparser:基于抽象语法树(AST)遍历SQL语句的语法元素

是一个java的SQL语句解析器,基于它可以实现很多之前无法完成的工作。

2022-10-31 13:03:49 256

原创 spring-boot:The following method did not exist: com.google.gson.GsonBuilder.setLenient()

意思就是找不到方法,中的类确没有这个方法。初步判断这应该是gson库的版本不匹配造成的知道了原因,包中的GsonAutoConfiguration类中引用了‘方法,应该是较高的gson版本。我的项目中引用的库也依赖gson 2.2.4库,替换了中引用的gson高版本,导致错误发生。知道了原因,就知道怎么解决了:就要在项目强制使用spring-boot依赖的高版本。

2022-10-28 16:15:23 96

原创 java:commons-configuration2与spring的集成

类的实现并不复杂,如果你的项目有特别要求完全可以仿照它自己将配置对象封装为Spring的实例。commons-configuration2的实例注入Spring后,在各种Spring场景下可以以与application.yml中定义的配置参数一致的方式进行访问。如@Value。

2022-09-27 16:26:23 138

原创 sql2java-pagehelper:Spring AOP支持

字段名默认值参数名默认字段定义值说明页码参数pageNum1HTTP请求中定义pageNum(页码参数,1-based)的属性名每页数量pageSize10HTTP请求中定义pageSize(每页数量)的属性名排序字段orderBy取决于服务方法定义排序(ORDER BY) 字段变量名,用于前端定义排序字段名格式 `${column} [ASC。...

2022-08-30 16:27:42 266

原创 sql2java-pagehelper:参照Mybatis-PageHelper实现分页查询

是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供分页查询功能,于是我参照并借用其外部数据格式为sql2java实现的分页功能,将其封装为一个sql2java子项目。使用方式与Mybatis-Pagehelper基本一致。...

2022-08-30 16:19:28 144

原创 sql2java:WhereHelper基于Beanshell(bsh)动态生成SQL语句

是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。......

2022-08-30 12:49:14 144

原创 sql2java-excel(二):基于apache poi实现数据库表的导出的spring web支持

sql2java是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供导出excel的功能。就开始学习apache的POI,将它封装成一个通用库成为sql2java下的子项目[sql2java-excel],本文开始介绍sql2java-excel的spring支持.......

2022-08-30 12:18:06 305

原创 sql2java-excel(一):基于apache poi实现数据库表的导出及支持spring web

是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供导出excel的功能。就开始学习apache的,参照网上的示例实现了单张表的导出。并进一步将它封装成一个通用库成为sql2java下的子项目.以方便在其他项目中技术复用。本文开始介绍sql2java-excel的使用.......

2022-08-30 12:06:47 189

原创 java:蛇形命名法格式(snake-case)字符串变量名转驼峰命名法格式(camel-case)

在开发工作,比如涉及反射,数据库字段名转换为Java字段名,我们有时需要将这两种不同命名格式的变量名进行相互转换,做这个转换自己也不复杂,因为经常要用到而且要可靠,所以在网上找了找,找到如下这篇文章,比较全面的介绍了camel-case和snake-case之间转换的各种实现方案。看了文章才知道,其实一些著名的第三方库都提供了命名格式的转换工具,比如 Apache 的Commons Text和google的guava,...

2022-08-26 12:07:11 640

原创 beanshell入门:脚本中引用自定义的变量和方法和定义运行时变量

的set/*** 定义脚本执行变量,在{@link #with(Object)}方法之后调用有效* @param varname 变量名,为空或{@code null}忽略* @param value 变量的值* @return 当前对象if(!try {}有了上面的变量定义方法,就可以如下执行脚本")...

2022-08-26 11:31:56 279

原创 java/poi 调整Excel 列宽支持自适应中文字符宽度

方法计算的列宽是不正确的,算出的宽度不能完整显示中文内容。最近项目中就遇到了这个问题,于是参考网上的各类文章,自己实现了自动适应中文字符宽度的方法。在网还找到另一个实现就是直接用使用字符串的字节长度计算列宽,不需要统计汉字个数,实际测试效果也是一样的。上面的代码中计算汉字数量的方法chineseCharCountOf,为简化实现只统计编译范围在。的2万多汉字,这也是主要使用的汉字,实际汉字unicode编译的范围并不止这一个,参见。,如果更严谨的话,可以把这个方法再完善,将所有的编译范围都包括进去。...

2022-07-29 11:36:57 1554

原创 spring/jackson:实现对保存JSON字符串的字段自动序列化和反序列化

对于spring-web项目,在数据库设计时,当我们想增加一个字段时,并不希望修改表结构,希望设计一个专用的扩展字段,将增加的扩展字段以一个JSON字符串形式保存在这个专用字段中。spring对JSON的序列化和反序列化是依赖jackson来完成的。数据发送给前端的时候,我们希望jackson在序列化一个数据库记录对象时以JSON的形式返回这个JSON扩展字段的内容,而不是一个String,同时前端也能以一个JSON的形式定义这个JSON扩展字段,服务端在收到请求jackson在反序列化时能自动将这个

2022-07-06 17:11:29 738

原创 spring-boot:对日期(Date)类型数据的序列化

spring将Java 数据类型的序列和反序列化为JSON字符串是依赖jackson(com.fasterxml.jackson.core:jackson-core)库来实现的,对于Java Bean中的Date类型字段,可以使用注释来指定日期格式,示例如下:但是对于非类Java Bean的字段,怎么指定日期格式呢?比如一个value中有Date类型的类型序列化时,如何控制jackson对Date类型的日期格式呢?可以通过如下方式配置一个bean,如下示例指定将所有Date类型序列化时生成ISO8601

2022-06-06 10:39:48 846 1

原创 maven:profile应用示例,通过profile控制在不同的平台依赖对应的库

在基于maven的项目开发中,肯定会使用一些第三方库,有一些第三方库是有平台限制的,比如google的核心库guva,在22版本以后就区分为标准jre平台和android平台,如下图:如果你的应用项目使用了guava库并需要在android平台和标准jre平台上运行,那么就要使用不同的版本的依赖库。本文就是以guava库为例,说明如何解决在pom.xml通过profile来控制在不同的平台上自......

2022-04-30 18:30:17 330

原创 conan入门(二十六):使用make编译erpc/erpcgen(makefile)

conan 使用make编译makefileconan是个包管理工具,不仅仅支持cmake编译,还支持很多常用的构建工具如configure/make,msbuild,VisualStudo,meson,本文以NXP的Embedded RPC为例说明conan中如何使用make来构建项目。NXP的eRPC (Embedded RPC) 是用于多芯片嵌入式系统和异构多核 SoC 的开源远程过程调用 (RPC) 框架。目前只支持make构建,我的一个项目中用到了它,因为访问github比较慢,我fork了一

2022-04-08 10:50:03 2312

原创 java:版本号比较(compare version string)

java中如何实现两个版本号(如5.7 vs 5.7.36)怎么比较大小?百度上用java 比较版本号关键字搜索了一下都找到的文章都要自己写代码做字符串分割,分段比较。。。好麻烦。bing/google上搜索英文关键字java compare version,第二个就是这篇在stackoverflow上的文章https://stackoverflow.com/questions/198431/how-do-you-compare-two-version-strings-in-java给出了最简单的

2022-03-31 10:46:16 2779

原创 cmake:arm-xm-linux交叉编译工具链文件及交叉支持HTTPS的curl静态库

curl是一个成熟的HTTP client库,现在windows平台下可以使用cmake在命令行完成编译。TOOLCHAIN首先要准备工具链文件arm-xm-linux-uclibcgnueabi.toolchain.cmake# This one is importantSET(CMAKE_SYSTEM_NAME Linux)SET(CMAKE_SYSTEM_PROCESSOR arm)# _compiler_prefix 定义编译器安装位置 set(_compiler_prefix /

2022-03-28 17:39:01 1368

原创 conan入门(二十五):imports将包安装到本地项目或其他指定位置

conan imports将包安装到本地项目或其他指定位置在嵌入式平台开发中,我想将conan用作包管理器。例如,我想运行conan install将依赖库安装在在本地项目目录中,最好是直接安装到嵌入式平台供应商提供的SDK框架中,这样就可以直接利用SDK现成的编译架构完成最终程序编译生成镜像。所以我不希望从 ~/.conan 目录引用头文件和库。否则每次编译后都要手工复制库文件到SDK的文件夹中或要创建软连接,这都太麻烦了。imports可以实现这个要求。imports将文件从 ~/.conan 目录

2022-03-28 09:55:01 945 4

原创 cmake: MinGW编译时为httplib.h增加连接库支持

httplib.h是一个只有一个头文件的C++11语言的跨平台 HTTP/HTTPS 库。如果使用在自己的项目中,在MinGW下编译时,会报连接错误,因为找不到socket相关库。所以在连接时需要参照httplib.h中对MSVC的库依赖,添加ws2_32,crypt32,cryptui几个库的#ifdef _MSC_VER#pragma comment(lib, "ws2_32.lib")#pragma comment(lib, "crypt32.lib")#pragma comment(li

2022-03-27 16:53:06 396

原创 conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查

conan 通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查最近工作的一个单片机项目项目,用了一款不知名的芯片,坑爹的开发商提供的编译器中有C++编译器,但是不能正常工作。好在我们的项目是纯C项目不需要C++编译器,只要在项目的cmake脚本中project命令指定为Cproject($NAME LANGUAGE C),这个坑就暂且绕过。项目结构成型我打算将项目编译转为使用conan来管理。在安装项目的依赖库cjson的时候,出错了。cjson/1.7.15: Copying

2022-03-26 15:50:21 3880

原创 mysql:通过JDBC接口执行创建触发器的SQL语句

delimiter以下是从mysql官方文档《23.3.1 Trigger Syntax and Examples》抄来的一段创建触发器的SQL脚本,delimiter //CREATE TRIGGER upd_check BEFORE UPDATE ON accountFOR EACH ROWBEGIN IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN

2022-03-24 11:33:43 1172

原创 conan入门(二十三):Windows下MinGW编译libcurl

conan Windows下MinGW编译libcurlWindows平台用 conan 使用MinGW编译器编译libcurl,要如下执行CMD下执行$ conan install libcurl/7.80.0@ ^ -s compiler=gcc ^ -s compiler.version=5.2 ^ -e CC=P:\MinGW\mingw64\bin\gcc.exe ^ -e CXX=P:\MinGW\mingw64\bin\g++.exe ^ -o libcurl:with_uni

2022-03-20 23:39:25 868

原创 conan入门(二十二):编译 openssl要求python 3.7以上版本

conan 编译 openssl要求python 3.7以上版本今天在Windows平台 如下用MinGW(5.2.0)编译openssl的时候$ conan install openssl/1.1.1m@ -s compiler=gcc -s compiler.version=5.2 --build missing 报错了:pkgconf/1.7.4: Applying build-requirement: ninja/1.10.2Downloading conan_sources.tgz

2022-03-20 19:34:54 3563

原创 cmake:cpp_redis的find_package脚本 FindCppRedis.cmake

cpp_redis是个C++11的开源的redis client库,支持cmake构建,但并没有提供CONFIG模式的import target导入脚本,如果希望在cmake下以find_package方式导入cpp_redis的库,就需要自己写一个MODULE模式脚本,以下为FindCppRedis.cmake脚本实现FindCppRedis.cmake# FindCppRedis# --------## Find cpp_redis## Find the native cpp_redis

2022-03-19 10:08:36 554

原创 c++模板:调用模板成员函数需不需要加template关键字?

以下是个简单的模板类测试代码,模板类A中定义了模板函数hello,在模板函数test中调用A::hellotemplate_test.cpptemplate <class T>struct A{ template<class I> void hello(){} template<class I> void hello2(I i){}};template <class T>void test(A<T> & a){ a.

2022-03-18 13:31:20 501

原创 conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c

conan: 解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c今天在用conan使用MinGW编译openssl/1.1.k,执行如下命令:$ conan install openssl/1.1.1k@ -s compiler=gcc -s compiler.version=5.2 --build missing在编译到crypto/dso/dso_win32.c时报了一大堆错误,大概是这些:crypto/dso/dso_win32.c: In functi

2022-03-17 09:42:09 1299

原创 conan入门(二十):封装只包含头文件(header_only)的库示例

conan: 封装只包含头文件(header_only)的库示例有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢?Conan官方文档 《Package scaffolding for conan new command》给出了样例我就有这样一个项目 common_source_cpp收集了工作中常用的代码,以C/C++头文件形式为主,本文就以common_source_cpp为例说明如何实现conanfile.py将它封装为一个不需要编译只有头文件的Conan包。c

2022-03-16 17:06:58 827

原创 conan入门(十九):封装第三方开源库cpp_redis示例

conan: 封装第三方开源库cpp_redis示例在我的之前关于conan系列博客中,已经介绍过如何引用Conan中央仓库(conan-center)预定义的第三库(《conan入门(五):conan 交叉编译引用第三方库示例》),以及如何将自己的项目封装为Conan包以供第三方引用(《conan入门(七):将自己的项目生成conan包》)。但是这个世界实际是复杂的,虽然Conan中央仓库已经收录了上千个常用的开源第三方库,但仍然有更多的第三库并没被Conan中央仓库收录,你不能指望你所需要的任何第三

2022-03-15 15:11:00 1416

原创 conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require

conan:交叉编译libiconv报错Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require to apply it.今天在Windows下执行NDK交叉boost时报错了:libiconv/1.16: WARN: Error running `configure --help`: Cannot recognize the Windows subsystem, install MSY

2022-03-11 15:35:19 682

原创 conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板

上一篇博客以Android NDK交叉编译为例介绍了jinja模板在conan profile中的应用。如果针对不同的Android目标平台(armv7,armv8,x86,x86_64)都要维护一个profile也是挺麻烦的。本文在此基础上,更进一步改进将android NDK 对不同平台armv7,armv8,x86,x86_64交叉编译的profile基本于同一个模板统一实现

2022-03-09 12:30:58 2597

原创 bat:windows bat脚本修改文件内容

linux下命令行修改文件有很多工具,比如sed,但Windows下就没那么方便,不过for和move命令为命令修改文件提供一个途径,虽然不好用,但总比没有强啊。简单的修改还是可以的。原理就是for循环读取文件中的每一行,处理后输出到临时文件,然后用move命令将临时文件改名,覆盖原文件内容。以下是一个示例,修改一个Java代码,如果对以public static final NativeLibrary和public static final AppauthLibrary开头的行,添加//注释符rem

2022-03-07 16:17:14 3735 1

原创 conan入门(十六):profile template功能实现不同平台下profile的统一

#conan: profile template功能实现不同平台下profile的统一之前我写过的两篇博客《conan入门(十):Windows下Android NDK交叉编译Boost》,.《conan入门(十一):Linux下Android NDK交叉编译Boost》中介绍了在Linux和Windows下NDK交叉编译boost的过程在这两篇博客中针对Linux和Windows平台我定义了不同的profile文件,因为Linux和Windows的路径换行符不同,而且Linux和Windows下cla

2022-03-05 17:42:10 2916

原创 arm-xm-linux交叉编译openssl

编译环境Ubuntu 16.04 x86_64arm-xm-linux.tar.gz下载openssl源码wget https://www.openssl.org/source/openssl-1.1.0d.tar.gz解压源码tar xvf openssl-1.1.0d.tar.gz执行Configure脚本./Configure linux-generic32 \ no-shared \ no-asm \ no-async \ --prefix=/ilock/dist/xm

2022-03-04 16:06:47 168

原创 cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11

以前在cmake中要判断一个编译器是否支持C++11挺麻烦的,要根据编译器的类型和版本来判断。从cmake 3.1版本开始增加了一个CMAKE_CXX_COMPILE_FEATURES变量用于获取当前C++ 编译器支持的编译特性列表,列表中是一些定义在CMAKE_CXX_KNOWN_FEATURES(C++已知特性)中的特性名字,比如cxx_lambdas即为当前编译器支持lambda表达式。从cmake 3.8版本开始,cmake可识别的编译特性增加了代表C++标准的特性名:cxx_std_98,cx

2022-03-03 15:13:33 1243

erpcgen-windows-x86_64.zip

用cygwin编译的erpcgen,可以windows下直接通过IDL编译生成client/server端(C++)代码,有cygwin的童鞋也可以自行编译,很方便的。 erpc git仓位置: https://github.com/EmbeddedRPC/erpc

2020-09-17

windows下MSVC兼容的dirent.h

<dirent.h>是一个应用程序接口,主要用于文件系统的目录读取操作,主要提供了几个目录数据读取函数,<dirent.h>是unix系统下常见的接口,但windows平台的MSVC编译器并没有提供这个接口( Cygwin5 and MingW现在已经提供了dirent接口),对于跨平台的项目开发就会带来一些麻烦,如果在MSVC下编译时可能因为windows平台缺少这个接口就要为windows平台另外写一些代码。本资源是从网上找的,提供了windows下为MSVC实现的dirent.h接口实现,方便跨平台开发和移植。

2016-03-31

libb64--base64编码解码库

libb64是实现base64编码解码的开源库,还提供了C++封装,用起来挺方便

2016-03-31

空空如也

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

TA关注的人

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