- 博客(603)
- 资源 (3)
- 收藏
- 关注
原创 conan 入门(三十五):在conanfile.py中获取C++编译器完整路径的方法
有的项目windows平台下构建时需要在msys2环境编译,而msys2也是可以有内置的c++编译器的。如果msys2中的c++编译器与profile中定义的gcc编译版本不一致。那么项目编译阶段可以正常通过,但在连接过程就有可能报错。因为如果项目的依赖库有C++库,那么它是按profile中定义的编译器版本提供的,就可能会因为符号表不匹配产生找不到引用的连接错误(undefiend reference)。
2023-12-05 17:15:23
44
原创 conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例
一些已有的较老旧的项目只有Makefile,一般在Linux下编译,windows下编译需要借助cygwin或msys2,对于这样的项目如何实现conanfile.py使用conan进行构建呢?本文以erpc/erpcgen为例,说明实现步骤。是一个适用于嵌入式系统的开源RPC框架,erpc/erpcgen为其下的IDL编译器,编译基于Makefile.现在需要把它封装为conan的package.这就是我最近遇到的问题。下面我们分步说明实现的要点。
2023-12-02 17:18:50
117
原创 conan 入门(三十三):requirements()指定header的可见性(transitive_headers)
不过conan包的头文件可见性只能传递一代,即只能传递直接引用包的项目,不能跨代传递。所以CMakeDeps generator为turbo-jpeg生成的cmake配置文件中定义的import target中没有将依赖库的头文件位置定义到。要解决这个问题,就是要更新jpegwrapper的conanfile.py中对于依赖库的定义方式,通过。conan 允许在conanfile.py的requirements()方法中手工指定依赖包的特性。类型的依赖包,库文件可以向下传递,但头文件对于下游默认不可见的。
2023-11-24 16:57:18
80
原创 conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake
conanfile.py中定义的方法用于向package的调用者(conumer)提供包库名,编译/连接选项,文件夹等等信息,有了这些信息构建工具的generator就可以根据它们生成对应的文件,用于调用者引用package.比如基于cmake的CMakeDeps可以根据这些信息自动生成和调用者的CMakeLists.txt中通过就可以自动找到package.创建对应的import target.比如我为mnn 项目写的conanfile.py(
2023-11-24 11:26:25
67
原创 conan入门(三十一):在命令行(shell)中从profile中读取配置参数
最近使用conan来执行本地或交叉编译时,我发现我需要知道当前profile定义的编译器的类型和版本以及平台,希望用profile中定义的os,arch,compier生成安装路径名如,该怎么实现呢?
2023-11-23 14:42:10
130
原创 conan入门(三十):对腾讯ncnn进行Conan封装
是腾讯开源的一个为手机端极致优化的高性能神经网络前向计算框架。因为项目中需要用到它,所以我需要对它进行conan封装,以支持我们基于conan管理的项目的引用。ncnn代码比较成熟,项目结构清晰,对于conan封装的主要工作量就是将CMakeLists.txt脚本的option命令定义的开关在conanfile.py的options中定义为对应的conan 选项开关.
2023-09-26 14:06:20
164
原创 conan入门(二十九):对阿里mnn进行Conan封装塈conans.CMake和conan.tools.cmake.CMake的区别
去年写过一篇博客,当时通过自己写conanfile.py,实现了对第三方库cpp_redis的conan封装。当时使用的conan 1.45.0时过一年多,conan版本也经过了很多次升级,最新的版本是2.x,不过为了保持兼容现在我使用的版本是1.60.0。
2023-09-26 12:51:52
165
原创 conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题
大意就是编译器不支持arm架构,如下图看,编译器还是用的本机编译器,而不是armv8的交叉编译器aarch64-linux-gnu,解决了conan 1.60.0交叉编译boost/1.80.1的问题后,我继续交叉编译openssl/3.1.2时又报错了。我查看了boost/1.81.0的conanfile.py,确实在python脚本中创建并引用了。,而openssl/3.1.2的conanfile.py并没用引用。这个问题我在上一博客中明明已经解决了呀,不就是把profile中。来定义使用的编译器的,
2023-09-22 11:16:50
526
原创 conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败
这个profile是我一年前写的,当时可以正确执行交叉编译,当然了,那个时候使用的conan 版本是1.45.0,一年多过去了,conan的版本迭代很快,目前我使用的是conan 1.x的接近最新版本1.60.0(1.x下当前最新版本是1.60.2),boost是由b2执行编译的,使用哪个编译器由环境变量CC来决定,CC定义在profile,所以问题应该出在profile.如下是执行aarch64-linux-gnu交叉编译使用的profile,的说明:从1.35.0开始新增加了这个字段,用于替换。
2023-09-22 10:50:08
391
原创 cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别
cmake定义的target有两个名字类似的属性:`POSITION_INDEPENDENT_CODE`和`INTERFACE_POSITION_INDEPENDENT_CODE`,本文说明它们的含义和区别
2023-09-21 12:04:11
163
4
原创 kafka:java client使用总结塈seek() VS commitSync()的区别(三)
最近一段日子接触了kafka这个消息系统,主要为了我的开源中间件项目增加kafka支持(基于kafka-client【java】),如今总算完成,本文是对这个过程中对kafka消息系统的使用总结。
2023-08-07 16:41:22
944
原创 kafka:消费者从指定时间的偏移开始消费(二)
但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第一次被消费者拉取消息时,因为得不到消费者的消费偏移,最后的结果,就是从0偏移开始拉取所有消息。并不能真正实现忽略上线之前所有消息的目的。为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。方法获取消费者的所有主题分区的指定时间的偏移,并将这个偏移作为消费开始的偏移(所以我又优化了方案。
2023-07-26 16:37:50
1192
原创 kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)
在对消息系统的应用场景中,当有实时性要求时,希望忽略掉上线之前的所有消息,只从所有消费者最后的消费偏移读取消息。那么我们接收消息之前就需要知道其他消费者的当前消费偏移,计算出最大值,从最大的偏移开始读取消息。以下示例基于AdminClient获取指定消费主题的所有消费者的消费偏移。Kafka消费者上线时默认都是从上次消费的偏移开始读取消息。就好比加入微信群时,不会收进群之前的消息。
2023-07-26 12:31:03
238
原创 BeanShell:多线程环境下Interpreter解释器的优化使用
是用 Java 编写的一个小型、免费、可嵌入的 Java 代码的脚本解释器。BeanShell动态执行标准Java语法,并使用通用语法对其进行扩展 脚本编写便利性,适用于 Java 的轻量级脚本。本文说明在并发环境下对BeanShell更加优化的使用方式。
2023-07-02 18:56:19
335
原创 java:String正则表达式替换时对$符号的特别处理塈异常IllegalArgumentException:Illegal group reference
它们其实是对应调用的同名方法如果你仔细看它们的方法说明就会看到请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;
2023-06-29 11:38:22
603
原创 BeanShell:检查变量是否为null的正确方式
是一个小型、免费、可嵌入的 Java 源代码 具有对象脚本语言功能的解释器,用 Java 编写。BeanShell动态执行标准Java语法,并使用通用语法对其进行扩展 脚本编写便利性,适用于 Java 的轻量级脚本。在Java中判断一个变量是否为null很简单的事儿null == v1BeanShell是一个支持Java语法的的脚本解释器,按道理null == v1也是支持的,我一直是这么理解的, 大量测试也没问题。但是今天在写单元测试时,因为手误,在解释器执行脚本时没有为变量v1定义值。
2023-06-23 00:23:10
419
原创 java:fastjson,jackson自定义反序列化器设计暨jackson反序列化时出现StackOverflowError异常的原因分析
方法实现字段解析,在字段解析过程中自动识别snake-case的数据库字段名转为camel-case的JavaBean字段名(参见findProperty方法),并在最后调用setter方法赋值modified,initialized字段确保它们的值与原始输入值一致。字段的值是不确定的。取决于这两个字段被反序列化时的顺序,如果它们被在放在最后反序列化,那它们的值是正确的,否则它们的值与原始输入值肯定是不一致的。为基类,BeanDeserializer是Jackson默认的Java Bean反序列化实现。
2023-05-04 12:43:19
942
原创 jsqlparser:解析SQL语句部件
对每个SQL部件,CCJSqlParser都有一个对应的无参解析方法,一般情况下,这个方法名是解析对象的类名。这个用于定义排序的ORDER BY语句解析为。
2023-03-24 14:37:19
374
原创 geometry:fastjson实现对JTS geometry对象的序列化和反序列化
在之前的博文中,实现了对MySQL数据库存储的WKB数据到JTS Geometry对象之间的转换。当我们从数据库中得到的Geometry对象后,我们需要把它提供给前端时,就需要将它转为JSON格式,或从前端将JSON数据反序列化为Geometry对象。本文说明使用JSON工具库Fastjson如何实现这个过程。JTS Geometry对象不是标准的Java Bean不能自动被Fastjson执行序列化和反序列化。所以我们需要为 Geometry对象实现自定义的序列化器和反序列化器。
2023-03-17 12:52:21
603
原创 geometry:Jackson实现对JTS geometry对象的序列化和反序列化
在上一篇博文中,实现了对MySQL数据库存储的WKB数据到JTS Geometry对象之间的转换。当我们从数据库中得到的Geometry对象后,我们需要把它提供给前端时,就需要将它转为JSON格式,或从前端将JSON数据反序列化为Geometry对象。本文说明使用JSON工具库Jackson如何实现这个过程。JTS Geometry对象不是标准的Java Bean不能自动被Jackson执行序列化和反序列化。所以我们需要为 Geometry对象实现自定义的序列化器和反序列化器。
2023-03-17 12:19:03
581
原创 geometry:MySQL的空间数据类型(Spatial Data Type)与JTS(OSGeo)类型之间的序列化和反序列化
现在很多应用都需要根据距离对信息进行排序,MYSQL5.7.28以后新增了空间数据类型(Spatial Data Type 即geometry)和相应的距离计算。关于如何进行距离计算和排序不是本文要说的重点。本文要说明的是如何将MySQL存储的空间数据类型(Spatial Data Type)转为对应的Java对象以方便访问。地理空间数据格式是有规范的,
2023-03-16 18:15:12
467
原创 java:基于guava缓存(LoadingCache)实现结果缓存避免重复计算
如果这个方法系统中会被反复调用,每次都对同一个Method要再进行一相重复的计算对系统的运行效率来说是很不划算的。Java程序在运行时每一个Method对象都是一个常量,所以每次调用这个方法的时候对于同一个Method返回的字符串也是必定是同一个字符串。在项目设计中,我们经常会遇到这样一种场景,输入一个参数,进行运算返回一个值,输入值和返回值是固定的映射关系。这个计算逻辑代码看着挺长的,挺复杂的,但无非就是对一个输入的Method对象返回一个String。方法来计算,如果存在则直接返回缓存的值。
2023-03-01 12:45:17
390
原创 基于JMS实现activemq订阅的断线自动重连示例
在使用基于JMS的ActiveMQ消息系统时,当正常订阅消息后,如果连接中断(如消息服务挂了,或网络中断)发生,订阅者肯定不能再收到订阅消息,即使消息服务重启或网络正常后,也不能正常收到订阅消息。接口用于侦听JMS消息连接异常,JMS的连接接口(javax.jms.Connection)提供了。接口,来让断连接和重连实现抽象化,应用层可以根据自己的需要,实现此接口,执行断开连接和重连的动作。的连接异常,就可以基于此实现自动重连接功能,以下是基于JMS的。为了适应应用层不同的重连接实现需要,我通过定义。
2023-02-05 23:20:43
794
原创 java:guava创建连接连续数字序列
如果需要生成一个0,1,2,3,4这样的数字序列,怎么办?的确是简单,但我还要写四行代码。能不能一行代码解决问题?Rang用于定义范围。即定义数字范围大等于于0且小于5,如果用方法即定义数字范围为大于等于0且小于等于5;
2023-01-16 17:16:09
296
原创 ANTLR4入门(四):在线语法调试塈Maven项目中使用语法调试工具TestRig
ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本和二进制文件。它被广泛用于学术领域和工业生产实践,是众多语言、工具和技术框架基石。一门语言的正式描述称为语法(grammar),ANTLR能够为该语言生成一个语法分析器,并自动建立语法分析树,ANTLR也能够自动生成树遍历器(Visitor),这样你就可以访问树中的节点,执行自定义的业务逻辑。
2022-12-20 13:09:35
843
原创 ANTLR4入门(三):使用maven ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器
在上篇博客,我费半天劲装好了Eclise的AntlrIDE插件,简单的创建一个ANTLR 4 工程,感受了一下AntlrIDE插件提供的语法高亮的便利性。及语法文件(.g4)自动生成解析器代码的过程然而热乎劲儿过后,我发现这个插件对于入门学习或许有用,但在基于maven构建的工程开发中实用性并不大,除了语法高亮比较方便外。在maven管理的项目中,项目编译可以在命令行进行并不一定依赖Eclipse等IDE环境。
2022-12-19 16:49:58
1983
原创 ANTLR4入门(二):图示说明eclipse Antlr4IDE插件的安装及语法测试过程
如果你能正常通过Eclipse Market找到antlr4的插件并正常安装,可以忽略本文。如果不能,那多半是因为网络问题导致安装Antlr4IDE插件时无法下载文件造成的。我就遇到了这个问题,无法下载的原因很复杂,我不想去深究了,我的办法就是绕过它。安装Eclipse ANTLR4IDE插件最终是访问 github上的仓库,如果你能正常访问github,就把这个仓库打包下载,解压到本地。然后如下以本地安装的方法安装插件。如果你也不能正常访问github,可以使用我从github上复制的仓库。
2022-12-17 23:05:23
608
原创 ANTLR4入门(一):Windows安装antlr4命令行环境
最近开始学习ANTLR4,《ANTLR 4权威指南》这本书是看完了,现在开始实践,本系列文记录实践过程中的遇到的问题解决过程及心得体会。
2022-12-17 17:34:55
1513
原创 java:javap查看class文件的JDK版本塈JDK版本与major version(45~55)的对照表
运行 Java 应用程序时,JRE 版本必须与用于编译应用程序的 JDK 版本匹配或更高。当尝试使用较低版本的 Java 运行高版本 JDK编译的应用程序时,就会抛出异常。在本文中,我们将介绍如何通过JDK工具检查class的 JDK 版本。
2022-12-17 15:52:55
2794
原创 eclipse 2022:安装中文语言包(babel language packs)塈切换语言的方法
我一直使用的eclipse版本是neon,2016年的版本,真是好老了,最近想安装一个antlr4IDE插件,总是安装不成功,同事的eclipse 2020就可以正常安装,我觉得我的Eclipse版本该升级了。我打算安装最新的eclipse2022,6年时间eclipse经历好多个版本的变化,但eclipse的安装方式基本没变。虽然英文也能看懂,但我还是喜欢用中文界面,工作效率高。所以我的eclipse都要安装中文语言包。以前因为网速慢,安装eclipse babel语言包都是直手工去。
2022-12-17 13:59:08
4367
原创 fastjson:对key为非String类型的Map的序列化和反序列化问题
fastjson 对于key为非String类型的Map,比如JSON标准要求key必须为双引号括起来的String,显然上面的这个字符串不标准。Jackson解析这个字符串就会抛出异常。fastjson 1.2.60版本可以解析这个字符串,但是Key也不是字符串,即:{12:“hello”}解决这个问题可以从两个方面处理。
2022-12-15 17:49:55
1722
原创 jsqlparser:修改语法定义(JSqlParserCC.jjt)实现UPSERT支持Phoenix语法ON DUPLICATE KEY IGNORE
https://gitee.com/l0km/JSqlParser.git 【gyd分支,gyd分支,gyd分支,重要的事情说三遍】为了这个我翻了jsqlparser的源码,找到了jsqlparser的语法定义文件(JSqlParserCC.jjt),是基于。为了看懂语法定义文件(JSqlParserCC.jjt),我又恶补了一下javacc,但是jsqlparser目前的最新版本支持UPSET语法,也支持。打开它在1635行就能找到UPSERT语句分析。语句的位置,如下修改增加对。
2022-12-10 17:54:37
634
1
原创 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
938
原创 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
367
原创 jsqlparser:基于语法分析实现SQL中的CAST函数替换
最近遇到一个问题,应用层提供的SQL语句中有这样的语句,在MySQL中执行肯定是没问题的,但是后台数据库切换到了HBase,使用apache phoenix 提供的JDBC驱动访问时却报错了,按照phoenix官方的文档,CAST函数是支持,但现实就是报错过不了,应该是我使用的phoenix版本问题,应该是个BUG,暂时无法通过升级版本解决。解决方案也不复杂就是用phoenix的Native函数函数来代替,将替换为。那么问题来了,如果让应用层来替换这事很方便,但是我们希望数据存储对应用层是透明的,应用层不需
2022-12-03 13:33:19
555
原创 java:BeanPropertySupport实现复杂类型对象的成员访问(支持Android)
在实际的工程设计中,当我们设计了一个复杂的数据对象,对象中还嵌套有子对象,子对象可能还会有更多的嵌套时,如果没有工具辅助,要获取一个对象的子成员下的子成员,需要写好几行代码逐级获取,这中间还要涉及到判空的问题,如果成员类型是Map/JSON对象那还要从Map中读取子成员,如果是Sting 类型JSON字符串,那获取下面的子成员更麻烦还要涉及解析JSON解析。要使用的实际 getter 或 setter 方法的名称是 JavaBeans 标准定义的,例如,名为“xyz”的属性将有一个名为。
2022-11-10 10:07:16
384
原创 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
1737
原创 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
1328
原创 jsqlparser:基于抽象语法树(AST)遍历SQL语句的语法元素
是一个java的SQL语句解析器,基于它可以实现很多之前无法完成的工作。
2022-10-31 13:03:49
2048
CMake脚本在ultraedit中的语法高亮支持
2023-06-08
erpcgen-windows-x86_64.zip
2020-09-17
windows下MSVC兼容的dirent.h
2016-03-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人