- 博客(160)
- 资源 (1)
- 收藏
- 关注
原创 vmware虚拟机增加磁盘容量
当初始分配给虚拟机的磁盘空间不够时,需要从外部的主系统增加配给。具体操作分为两步:一:通过虚拟机界面添加分配的磁盘配给;二:将新分配的配给给使用起来。
2024-07-03 15:42:34 252
原创 记一次ndk版本升级
事情的起因是做一次android版本的业务迭代,发现程序crash掉了。经过分析,原因是中台部门对库进行了升级,正好我们的业务也会用到库,导致两个库版本冲突。具体crash的原因可以参见参考文献1。为了解决该问题,中台的同学提出让我们升级ndk版本,使之和中台用到的库版本保持一致。
2024-06-27 17:20:15 1113
原创 CMakeFile根据不同指令集配置加载obj对象
Android Studio可以使用不同的指令集进行编译,如arm64-v8a,armeabi-v7a。有时我们需要在c层感知当前编译的指令集,并进行适当的调整,如使用不同的obj对象(.o文件)。本文介绍具体的做法。
2024-06-07 17:30:44 241
原创 C++默认构造函数/拷贝构造函数/赋值构造函数
本文主要讲解C++默认构造函数,拷贝构造函数和赋值构造函数在哪些场景下会被调用到场景一调用代码输出注:虽然对于c的赋值使用的是等号,但是调用的仍然是拷贝构造函数输出
2024-03-12 14:44:17 449
原创 g2o -- circle_fit代码解析
***/class VertexCircle : public g2o::BaseVertex { // 顶点包含3个参数public:void setToOriginImpl() override { // 设置顶点的初始值void oplusImpl(const double* update) override { // 增量更新函数/***/
2024-03-05 11:15:57 418
原创 g2o -- curve_fit代码解析
***/class VertexParams : public g2o::BaseVertex { // 它包含三个参数public:void setToOriginImpl() override {} // 设定参数的原始值void oplusImpl(const double* update) override { // 增量更新函数,调整当前参数的值// 构造参数增量/***/
2024-03-04 20:02:23 504
原创 g2o--icp代码解析
概要个人理解Icp是一种location算法。我们先将全局的事物特征化,提取出特征点。在求解过程中,将观察的的图像,同样进行特征化。将全局点与当前特征点进行匹配,就可以求得观察者当前的位姿。Icp算法通常分为粗匹配和精细匹配两部分。粗匹配是将观察特征点移动到对应全局特征点的附近,而精细匹配这是将一个一个对应的特征点,使用最小二乘优化进行调整。在精细匹配的过程中,特征点对的选取也很重要,icp是一套迭代的算法,每次变换后都需要重新选取特征点对。
2024-01-29 17:54:17 559
原创 g2o--ba代码解析
g2o是常用的图优化理论c++库,其自带了很多example讲解如何使用该库文件,本文分析其中ba的示例代码。所谓的图优化,就是把一个常规的优化问题,以图(Graph)的形式来表述。在图中,以顶点表示优化变量,以边表示观测方程。于是总体优化问题变为n条边加和的形式边是约束在具体编写g2o代码时,我们也需要明确哪些是顶点(优化项),哪些是边(约束项)。
2024-01-25 17:45:03 507
原创 CMake编译选项CMAKE_CXX_FLAGS详解
概要本文涉及cmake在模式下的编译选项控制,其具体的实践是基于submodule的代码组织形式。基础知识先看一下和相关的参数默认值参数默认值无-g如果对应参数未设置,则使用默认值。我们在使用cmake命令时会指定使用哪种编译模式,它是通过来定义的,如我们可以这么干:Debug编译:Release编译:对于debug模式,实际使用的编译选项是对于release模式,实际使用的编译选项是代码假设我们有个工程,代码组织如下。
2024-01-11 17:38:12 4406
原创 双buffer切换与代码实现
在很多场景需要并发的去读写数据,如下图所示:考虑到数据写入的顺序性,通常只会有一个线程写入,读数据是可以多线程的。由于对于Data的一次写入不是原子操作,一个常用通常的方式就是在写的时候加写锁,读的时候加读锁。这在同一个线程每次读数据没有依赖时是可行的,否者还是可能出现问题。如在一次数据处理中,先通过用户“姓名”找到Data中对应的id,再通过id去Data中查找用户其它信息。在这两步之前,写线程可能已经把该用户从Data中删除了,这时就会出现异常。
2024-01-10 16:41:42 962
原创 std::cout输出设置项
在c++编程中,我们常常需要使用std::cout来打印日志,但是std::cout打印日志的格式可能和预期的不一致。笔者最近遇到有两处需要修改默认项的,都是针对double类型,记录如下。
2024-01-09 16:45:26 535
原创 在macos上查看当前进程的栈信息
在调试程序时,如cpu莫名的高或低,一个常用的方式就是打印当前进行的调用栈,然后确认各线程的执行函数是否有异常。在linux系统中可以使用pstack命令,直接打印各线程的栈信息,可惜在macos上没有该命令。一种解决方式就是将代码迁移到linux平台上进行debug(事实上笔者也是这么做的,因为linux平台有很多熟悉的工具),但代码迁移存在成本(系统函数版本不一致),macos上的系统文件版本和linux平台上大概率是不同的。
2024-01-08 19:40:03 980
原创 DWA算法实现
动态窗口算法(Dynamic Window Approaches, DWA) 属于局部路径规划算法,能有效避开障碍物。本文主要介绍dwa算法的一种c++实现,源代码库见(而这段时间是否会和障碍物接触会由开销函数来保证。算法还是希望能高速运行。
2023-11-01 20:31:58 889
原创 pragma once与ifndef的区别
代码编译过程中,为了防止同一份代码被重复引用,通常有两种实现方式方式一方式二#endif //!TEST_H通常情况下,使用上述两种方式中的任意一种都是可以的。最近工作中,代码按照其功能性被划分出不同的模块,这时二者的区别就体现出来了。
2023-10-19 19:06:04 211
原创 通过lambda表达式实现上下层类型的解耦
代码架构中一种常见的组织结构 class A --> class B,A作为上层类型,可以调用类型B的方法。然而B类型也有可能会回调A类型的方法(同时修改A成员变量的值)。实现时可能有多种方案(假设都是单例模式)B类型中也包含A类型指针作为成员变量,这种方式实现最为简单,但要求A类型对于B类型是完全可见的(紧耦合);使用lambda表达式,在A类型调用B类型方法时,指定回调函数,这样B类型就不必去感知A类型的存在(松耦合);
2023-08-17 15:01:47 123
原创 异构线程池的c++实现方案
概要通常线程池是同质的,每个线程都可以执行任意的task(每个线程中的task顺序执行),如下图所示:但本文所介绍的线程和task之间有绑定关系,如A task只能跑在A thread上(因此称为异构线程池,每个线程的功能是有所区别的),如下图所示:接口设计TThreadPool接口设计TThreadPool类的主要功能是管理创建的线程(TThread,它是线程的具体实现),它提供了增加/删除线程的接口,同时给每个线程打上了标签(name)。TThread接口设计。
2023-07-26 19:30:55 171
原创 awk中的strftime浅析(含小数)
在文件数据处理中,awk是常用的unix工具命令。如果需要将unix时间戳(1687057855)转换成标准时间格式(06/18/23 13:07:28),可以使用其自带的strftime函数。
2023-07-10 09:43:13 468
原创 python numpy库简介
numpy库是python语言处理矩阵运算常用的工具,本文对其常用命令进行简单的介绍。zeros,ones,empty[初始化数组]ravel[多维数组转换为一维数组]argwhere[满足条件的索引]reshape[改变列表的结构]delete[删除任意行|列]shape[数组的维度]array[创建数组]mean[求取平均值]diff[计算差值]
2023-03-24 17:53:47 173
原创 AStar路径规划算法
概要AStar是一种路径规划算法,其思想包含Dijkstra算法和启发式算法。该算法也是通过起点开始,逐步记录能够搜索到的节点,并记录它们离起点的最短距离;同时还会估算搜索到的点离终点的距离。公式G -- 当前节点离起点的距离H – 估算当前节点离终点的距离F = G + H两个队列开启列表 – 当前寻址到的节点,包含GHF三个值,但其值可能会在随后的迭代搜寻中被更新。在每次寻址的过程中,会有新的节点存入开启列表(除非当前节点寻址到的所有节点都已经在开启列表中),也会有一个节点从开启列表移
2023-01-11 17:07:10 996
原创 python包版本不一致问题排查
因为能确认该代码之前是能运行成功的,因此排除是代码的问题。同时怀疑是依赖的包版本发生了变化(在公共服务器上,有root权限的人都能随意改动)。pip install -v [package]==[version] // 安装指定版本的包。pip show [package] // 展示当前安装package的信息,包含版本号。pip install [package]== // 查看包有哪些适用版本。好嘛,使用的版本是4.21,明显高于代码中使用到的版本号。因此首先卸载该包,同时安装符合预期的版本。
2022-12-22 15:45:43 1033
原创 贝叶斯基础
举个例子,如果A和B发生的概率都是50%,但两者是强相关的,A出现时B必然出现,那么P(A and B)=50%;从机器学习的角度,从全局无法知道事件(A)发生的概率,但是如果能确认一些事情发生,如事件(B),那么就可以更新事件(A)发生的概率,从而逼近真实值。解答:首先P(A)=20%, P(B)=50%, P(C)=30%,另一个条件,假设缺陷产品的事件为D,则P(D|A)=2%, P(D|B)=1%, P(D|C)=3%, 问题是P(B|D)边际概率是一个事件的概率,与另一个变量的结果无关。
2022-12-21 15:08:34 941
原创 C++ json-cpp库的基本使用方法
Json::Value value = array[i] // 每个元素也是一个Json::Value类型。double json_double = value.asDouble() // double类型。float json_float = value.asFloat() // float类型。bool json_bool = value.asBool() // bool类型。// value是一个有赋值的json类型.int json_int = value.asInt() // int类型。
2022-12-02 14:52:09 1760 1
原创 数据挖掘对道路地理位置的修正
另一方面,在某些特定的地理条件下(高山、峡谷等),gps定位系统给出的位置信息(统计平均)与实际也可能产生偏差。本文提出了一种纠偏的思路,它基于离线数据挖掘,将全局轨迹匹配的道路与线上服务实时匹配的道路进行比较,挖掘出哪些道路存在位置偏差(或gps偏差),将其补齐后在线上服务中应用,以提升线上匹配的准确性。MM按照匹配的实时性可以分为全局匹配和实时匹配,全局匹配的效果无疑是最优的,但实时匹配的互动性更加。在车载导航等场景需要用到实时匹配。本文的思路就是通过离线的全局匹配,来辅助线上实时匹配的准确性。
2022-11-17 10:35:37 248
原创 《Hidden Markov Map Matching Through Noise and Sparseness》读书笔记
个人觉得如果eta时间能比较准确的话,确实是一个好办法)In our map matching algorithm, the states of the HMM are the individual road segments, and the state measurements are the noisy vehicle location measurements. (隐马尔可夫模型的观察变量和隐形状态的定义)通常会认为频率越高,对算法是越友好的。(基于绕路惩罚的转移概率)低频下匹配准确度的变化趋势。
2022-11-16 14:10:56 674
原创 《Map-Matching for Low-Sampling-Rate GPS Trajectories》 读书笔记
这是我见过对场景定义最清楚的一篇论文了Definition 1 (GPS Log): A GPS log is a collection of GPS points 𝐿 = {𝑝1, 𝑝2,... , 𝑝𝑛} . Each GPS point 𝑝𝑖 ∈ 𝐿 contains latitude 𝑝𝑖 . 𝑙𝑎𝑡, longitude 𝑝𝑖 . 𝑙𝑛𝑔 and timestamp 𝑝𝑖 . 𝑡, as illustrated in the left part of Figure 3. (定义点的集合)
2022-11-10 20:49:49 503
原创 libcurl库简介
/一旦实例化后需要通过下一个函数清理,否则会产生内存泄漏设置headers// headers再赋值后也需要清理// 设置headers// 释放资源设置请求类型curl_easy_setopt(curl, CURLOPT_POST, 1) // post请求curl_easy_setopt(curl, CURLOPT_GET, 1) // get请求url设置超时设置// 读写超时// 连接超时写body接收返回的headers// 设置headers的载体//设置回调函数。
2022-11-10 14:54:54 592
原创 隐马尔可夫模型在map-matching中的应用
状态值的取值空间:图中所示有五条线段,因此状态空间为{S1,S2,S3,S4,S5}。考虑到map-matching是一个处理连续轨迹点的问题,因此我们可以以当前点的位置坐标出发,一定范围内的link都属于状态空间。有时连续两个gps点的位置差异过大,超过一定范围的点称之为跳点,对于跳点需要过滤掉。{o1,o2,o3,o4,o5,o6,o7,o8}(经纬度,方向,速度等)。转移概率矩阵:这里最主要考虑到的是轨迹的连续性。
2022-10-11 19:24:06 1541 1
原创 linux:argument list too long的解决方案
我们使用“find”命令和“xargs”命令组合,先找出需要删除的文件,每找到一个匹配的文件,通过pipeline的方式传递给后面的“rm”命令进行操作。(猜测)shell命令在做通配符匹配时,会计算匹配到的文件名个数。一旦超过设定值,则会放弃该命令的执行,同时报错。
2022-10-11 10:28:49 861
原创 一种路网划分的策略
一条link包含起点(start_node)和终点(end_node),非极端情况下,这条link所属的分片可以等价于起点所属分片与终点所属分片的并集(最多属于两个分片),这样就将link所属分片的问题转化为点所属分片的问题。遍历每一条link,将start_node和end_node离散化成represent_node1和represent_node2,并利用上述的映射关系,找出对应的分片数,其值就是link对应的分片值。在上图中,link1/2/4均满足之前的假设,只有link3是横跨的3个分片。
2022-09-30 16:07:22 548
原创 二级模式存储大数据
设计表初期,也需要考虑数据增长的问题,当数据量增长过快时,可以将部分bucket中的映射关系改到新增的表中,然后再对原有的数据进行迁移。本人多年前也遇到过数据量巨大的项目,使用单mysql表读写性能非常的差,后来经过调研,使用了hbase存储加上spark计算的方式,存储效率和计算效率都得以巨大的提升,效果可以说是非常的好的。二是运维成本也较大,hbase底层使用hdfs进行数据存储,spark也是基于内存的并行计算框架,对资源的消耗都是巨大的。那么对于无限增长的数据,有什么简单又可靠的存储方式么?...
2022-08-31 10:05:33 167
原创 双版本数据加载的系统设计
很多服务依赖数据版本迭代。如搜索系统,每天会产生一个全量索引版本。路网系统,每天会加载新版本的路网数据。一个简单的做法是每次更新数据版本时,都停止服务,重新加载最新的数据(通常在流量最低的时间点)。但这种做法显然不够优雅。更常用的方案是加载双版本数据,动态切换,而不需要停止服务。本文介绍这种方案的一种实现方式。...
2022-08-17 15:21:48 245
原创 兜底策略在微服务系统中的应用
微服务的广泛应用,使得模块间功能划分更加清晰,代码可维护性高。但并不是说微服务的运维成本更低了。假设原先是一个单体服务,我们将它进行微服务化的改造,拆成了多个服务,这时一旦下游服务出现问题,整体服务也会受到影响。兜底策略是在整体(微服务)系统出现问题时,仍然尽可能去保障服务的可用性(通常以一定数据精度损失作为代价)。...
2022-08-16 16:22:18 1285
原创 Golang HTTP Fileserver
fileserver是静态文件服务,其主要功能是根据提供文件查询与文件传输的功能。由golang标准库提供。
2022-07-19 16:36:08 1890
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人