- 博客(127)
- 资源 (12)
- 收藏
- 关注
原创 Linux下Spark offline安装graphframes包
offline install graphframes lib for spark
2024-02-17 22:42:43
934
原创 Vatti clipping 算法介绍
生成图形的LML根据LML的root vertex,生成一个Scan Beam List(SBL), SBL里面是按从小到大排好序的root vertex的Y坐标值从SBL中取出最小的Y值,找到和纵坐标值为Y的Scan line相交的所有活跃边(Active edges)处理找到的Active edges将每条Active edge的终点的Y坐标加入到SBL, 并将SBL维持在有序状态。
2022-11-06 22:12:34
4597
1
原创 Lua和C++中的浮点数的比较
在Lua 5.2以及以前的的版本中,所有的数值都采用double-precision floating-point来表示,也就是64位bit来表示整数或数,由表1,用来表示双精度浮点数的小数部分有52个bit, 根据问题4的结论,Lua的双精度浮点数可以连续准确表示的整数范围是。第三行的左侧由于会提升到浮点数,但是由于9007199254740993在浮点数中没有精确表示,只能近似表示为9007199254740992, 而右侧是整型,可以精确表示,所以第三行输出为。也是能被浮点数精确表示。
2022-10-31 23:54:58
896
原创 C++编译期循环获取变量类型
这里,通过AttributeType就可以得到float 类型{{通过std::tuple定义变量类型集合,通过typename std::tuple_element::type获取某个变量类型通过编译期递归实现编译期字符串比较通过std::get(attribute2type)获取属性编译期递归实现循环获取变量类型。
2022-09-08 15:39:32
1351
原创 GLIBC中的Symbol Versioning
由glibc编译得到的动态库是libc.so, glibc可以通过改变soname来发布新的版本,比如libc.so.6等等, 在实际中, 改变soname通常是大的发布, 如果需要一些小的改动,可以通过Symbol Versioning的方式实现.
2022-09-04 23:09:27
773
原创 Clipper2中的术语和基本概念
通过填充,可以表明哪些区域是位于Closed path的内部,哪些区域是位于Closed path的外部。给出了另外一个比较直观的方法:从图形的左边外部和需要计算winding number的子区域的一点,比如P所在的区域画一条线,最外部的winding number 是0, 当虚线延长到P点的过程中,如果图形由右至左穿过虚线那么,winding number加1,如果图形由左至右穿过虚线那么,winding number减1,这样任何一点的winding number就可以计算出来了。...
2022-08-31 16:32:44
6049
原创 GCC编译宏_GLIBCXX_USE_CXX11_ABI背景分析和实现原理
如果当前项目需要链接第三方库的API,比如第三方库编译时使用_GLIBCXX_USE_CXX11_ABI=0,当本项目编译时用的是_GLIBCXX_USE_CXX11_ABI=1,这个时候两个库ABI不兼容,应该报错;从上面1和2的分析,GCC5.1之后,要实现上面的功能,必须修改std::string和std::list的源代码,对于std::list, 它必须添加一个成员记录当前list的元素个数才能保证std::list时间复杂度为O(1)的要求。
2022-08-21 21:12:33
7162
2
原创 C++ std::list中size()的时间复杂度
通常情况下_GLIBCXX_USE_CXX11_ABI是非0的,也就是说C++11中size的时间复杂度是O(1),但当系统中需要混用不同版本的GCC编译的库时,必须将_GLIBCXX_USE_CXX11_ABI设置为0以保证ABI兼容,这种情况下size的时间复杂度是O(n)。可以发现,当_GLIBCXX_USE_CXX11_ABI=0时,size的时间复杂度是O(n),否则为O(1)。C98中size()的时间复杂度是O(N),C++11中正常配置下,是O(1),其它情况下是O(N)...
2022-08-02 15:55:33
2159
原创 std::minmax使用的注意事项
文章目录预备知识问题介绍问题分析问题解决解决方案1解决方案2预备知识C++11中新增加了一个函数,std::minmax, 它可以获取两个或者多个元素的最大最小值。相比之前我们先用std::max求处最大值,再用std::min求出最小值,它的优势是可以一次遍历获得最大最小值。问题介绍最近在项目中遇到了一个比较诡异的问题,就是一个unittest在开发中使用的debug build进行运行时,没有问题,但是在release build进行运行时就会挂掉。debug build默认使用的是-O0,
2021-12-13 09:34:28
2074
2
原创 std::enable_if与boost::enable_if,boost::enable_if_c的区别与联系
标准库与boost的这三个enable_if系列的函数可以帮助我们实现模板函数的重载。一般函数的重载先看一个一般函数重载的例子:#include <iostream>void print(int i){ std::cout << "Integral: " << i << std::endl;}void print(double f){ std::cout << "Floating point: " << f
2021-10-29 23:13:33
597
原创 解决用gcc7.3链接gtest1.7的问题
最近要在新系统中使用gcc7.3, 配套使用的gtest是1.7版本的,对于下面的程序:#include <gtest/gtest.h>TEST(testSuite, ShouldSucceed) {EXPECT_EQ(1, 1);}int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);采用下面的命令~/gcc/7.3.0_1/bin/g++ -std=c++11 -o g
2021-10-27 15:10:11
1883
原创 Linux上采用rdtsc指令对C/C++程序进行性能测试
RDTSC是什么RDTSC是 “Read Time-Stamp Counter”的缩写,它是目前intel和AMD的CPU都普遍支持的一条CPU指令,该指令可以把当前处理器的时间戳加载到EDX:EAX寄存器供外部使用。RDTSC的优点RDTSC是内置的CPU指令,而一般CPU单条指令运行也就需要几十个CPU cycles, 所以采用RDTSC指令可以在开销比较小的情况下获取程序的性能数据,可以说RDTSC是指令级别的性能测试利器。RDTSC的历史最初的RDTSC指令确实读取的是CPU自..
2021-08-29 17:30:39
5012
原创 CUDA中的几种并行计算模型
BackgroundCUDA编程中由于thread space和input space通常是不同的:Thread Space最多可以是5D,2D Grid + 3D BlockInput Space通常是1D,有时也有2D的矩阵等这就导致了我们需要将inputs映射到threads中去,比如我在《CUDA中线程与数据的对应关系》中所写的,主要就是考虑线程数和数据数下的映射关系。如果我们有一个1D的Input array, 采用不同的thread space, thread index和inp
2021-06-08 17:35:34
1696
3
原创 李弘毅机器学习课程笔记(二):机器/深度学习入门
上一篇我们已经找到了一个Model,那么这个Model是不是最优的呢?模型回顾将Model应用到训练集上的Loss是0.48K,运用到测试集上的Loss是0.58K,那么,是不是还可以做得更好呢?通过观察下图实际数据和预测数据的对比图:我们发现预测数据总是稍微领先于实际数据,这也很好解释,模型显示,预测数据几乎就是用前一天的实际数据加上0.1K。另外,我们发现数据似乎以一周为一个周期:每逢周五周六,观看人数处于最低值,每逢周一周二,观看人数处于最高值。很自然的,我们考虑将前7天,前28天,前
2021-05-05 18:11:52
302
1
原创 李弘毅机器学习课程笔记(一):机器/深度学习入门
文章目录什么是MLML分类一个例子Model(function)Loss functionError surfaceOptimizationConclusion最近在Youtube上(当然万能的B站上也有)看了台大李弘毅老师的机器学习课程,感觉非常不错,介绍概念清晰明了,但是看时一时爽,看到后面就会发现前面的一些似乎清晰的概念似乎模糊了,再往后看可能会越来越模糊,因此决定在这个讲自己学习过程中的一些问题Mark下来,为后面的学习打牢基础。下面截图均来自来自台大2021春机器学习课程。什么是MLML
2021-04-27 16:19:37
379
原创 CUDA中线程与数据的对应关系
引子由于NVIDIA GPU采用的是SIMT的运行模式,CUDA编程中线程数量与数据的对应关系是什么呢?首先,我们来看一个经典的例子:#include <stdio.h>#define N (2048*2048)#define THREADS_PER_BLOCK 512__global__ void add(int *a, int *b, int *c){ int index = threadIdx.x + blockIdx.x * blockDim.x; c[index]
2021-03-28 21:24:22
1500
原创 C++11 Type-rich编程
文章目录背景问题预备知识类型(type)和单位(unit)带有单位的值初步解决方案解决方案完善重载运算操作符重载文字运算符(suffix literal operator)背景Bjarne在*Software Development for Infrastructure*中提到过一个因为参数类型不匹配导致重大损失的例子:1999年9月23日,NASA的Mars Climate Orbiter探测器由于导航问题消失在太空中,经济损失达6.5亿美元左右,问题的原因很简单,NASA开发的航天器的基础软件采用
2021-03-28 18:03:39
556
原创 在C++类的外部调用类的私有方法
文章目录引子问题技术准备1. pointers to member functions2. The explicit template instantiation3. Passing a member-function pointer as a non-type template parameter4. Passing a private pointer-to-member-function as a template parameter5. FriendPut the magic pieces toget
2021-02-20 16:22:08
4944
2
原创 在const和non-const functions间复用代码
文章目录const getter和non-const getterconst function和non-const function方案1方案2方案3方案4const getter和non-const getter在C++中,我们经常会用到const版本的getter和non-const的getter, const 版本不会修改成员对象,非const 版本用来进行修改,如下面来自Stackoverflow类似的代码:class Z{ // details};class X{
2021-02-19 19:27:32
347
原创 C++11中的NAN
C++11中引入了NAN, NAN是Not-A-Number的简写,表示不是一个数值,那么下面的代码:#include <cmath>#include <iostream>int main(int argc, const char *argv[]) { if (NAN == NAN) { std::cout << "NAN == NAN is true" << std::endl; } else { st
2021-02-19 15:00:40
3798
原创 Linux中的umask及权限管理
什么是umaskLinux中,“Every thing is a file”, 文件就涉及到文件权限管理,umask(user file-creation mode mask)的作用是用来设置每一个新增的文件、目录的权限(permission)。事实上,每个用户在登入系统时,都会有默认的umask,比如/etc/bashrc中:一般用户的umask默认是002, 其它特殊用户如系统进程等的umask是022。用户也可以在自己的bashrc文件中设置自己默认的umask。文件权限介绍在系统的b
2020-11-01 11:54:02
2857
1
原创 SPrinter:一个基于Clang-Tidy的C++程序智能指针错误检查工具
最近项目中需要对C++智能指针做一些代码合入前检查,特别的,发现我们使用的Cppcheck, PCLint+都只支持对一般指针的检查,不支持智能指针,因此,在网上看到这个SPrinter, 发现它比较全面的支持了常见的智能指针错误检查,基于其论文,在这里智能指针错误类型及SPrinter工具的使用方法做一个简要介绍。...
2020-10-13 21:57:10
1409
1
原创 C++中的Covariant返回值类型
C++中当子类覆写(override)父类虚函数时,子类函数的返回值类型可以和父类函数的返回值类型不一致吗?先说结论:可以,但当且仅当它们的返回值类型是协变返回值类型(Covariant)时可以。C++中gcc从3.4开始支持这一特性。什么是协变返回值类型(Covariant)函数的协变返回值类型指的是子类中的成员函数的返回值类型不必严格等同与该函数所重写的父类中的函数的返回值类型,而可以是更 “狭窄” 的类型。C++/Java等面向对象编程语言均支持协变返回值类型。例子class Shape {
2020-10-11 21:27:19
455
原创 C++子类函数为什么不能重载父类函数
参考网页:https://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-thehttps://bastian.rieck.me/blog/posts/2016/name_hiding_cxx/
2020-09-24 10:24:37
1985
1
翻译 我编程20年的指导原则
My guiding principles after 20 years of programmingI’ve been programming since 1999 and this year I’ve officially coded for 20+ years. I started with Basic but soon jumped into Pascal and C and then ...
2020-03-07 21:08:52
638
1
原创 使用python生成模拟花朵生长的gif动图(Simulate flower grow process with python)
使用python生成模拟花朵生长的gif动图(Simulate flower grow process with python)在网上读到刘大可的文章《关于“植物身上的黄金分割”的叫你恍然大悟的文章》,里面的动图非常有趣,本文是自己尝试用python语言生成这些动图的过程。原理首先要理解花瓣的生长过程,上面的文章中有一段话:图1: 图片来源:https://card.weibo.com/...
2019-10-18 17:03:12
1649
翻译 Modern Microprocessors A 90-Minute Guide
译者的话文章标题说是一篇90分钟的简介,在我看来,90分钟不一定能够读完,但是内容相当的精彩,完全值得读上180分钟:在提高单核的性能上:作者从处理器的频率出发,分析处理器为什么要引入流水线,为什么会出现超标量流水器,为什么需要乱序执行,为什么需要分支预测,流水线的深度是否越深越好,处理器的发射宽度是否越宽越好,是否乱序执行一定比顺序执行要好,业界主流CPU厂商是如何做的?继而分析了为什么单核...
2019-07-21 22:56:42
1841
原创 C++智能指针使用须知
我在《C++ 智能指针(shared_ptr/weak_ptr)源码分析》已经介绍了智能指针的一些使用注意点,本文在此基础上,基于C++11中的语法特性,介绍一些智能指针的使用须知。std::unique_ptr如果不需要共享,同时需要防止内存泄漏, std::unique_ptr是替代raw pointer(裸指针)的第一选择:它的大小和raw pointer一样,解引用的速度也和raw ...
2019-04-30 23:43:44
565
原创 When to use checkbox, when to use radio button
做UI或者GUI界面开发的人对checkbox和radio button都非常熟悉,本文简要介绍二者的区别和各自适用的使用场景。参考文章:https://www.justinmind.com/blog/checkboxes-or-radio-buttons-let-the-ui-design-battle-commence/...
2019-03-30 11:35:45
531
翻译 Tutorial: When to Write Which Special Member(编写C++特殊成员的指导原则)
C++中的特殊成员,即编译器可能会自动生成的成员函数或操作符,即默认构造函数、析构函数、拷贝构造函数、移动构造函数,拷贝赋值操作符,移动赋值操作符当给人解释这些特殊成员的使用规则以及什么时候需要自己手动编写其中的某个时,人们总会提起下面的这幅图。但是,我不认为这个图是特别有用的。它覆盖了所有的组合,有些组合其实是不太合理的。在这篇文章中,我们主要介绍你实际应该知道的关于特殊成员的知识以及什么时...
2019-03-21 22:15:45
461
原创 catch2:一个好用的C++单元测试框架
文章目录为什么需要catch简单易用命令行选项SectionsBDD-styleAssertion MacrosFloating point comparisonsExceptionsMatchersString matchersVector matchersFloating point matchersCustom matchers最近发现一个简单易用的C++开源测试开源库:Catch2(C+...
2019-02-24 23:17:08
24573
翻译 Undefining the C++ Pre-processor(取消C++中的预处理器)
取消C++中的预处理器There are only two kinds of languages: the ones people complain about and the ones nobody uses (世界上只有两类编程语言:一类是被人们抱怨的,一类是没人使用的)— Bjarne Stroustrup我喜欢上面这句话。它能说明JavaScript and Haskell被人抱...
2019-02-20 13:59:48
1502
原创 NVIDIA CUDA nbody problem源码分析
N体问题(n-body problem)是一个非常著名物理问题,大刘的《三体》的开篇中就有一篇以三个太阳(三体)为背景展开过。具体的,是指已知N个物体的初始位置、速度和质量,在经典力学情况下它们的后续运动情形,包括预测它们的轨迹等等。目前N&amp;amp;amp;amp;amp;amp;amp;gt;=3的N体问题是没有解析解的。给定N个物体,以及每个物体的位置xix_ixi和初始速度viv_ivi (1≤i≤N1 \leq i \leq N1...
2019-02-02 22:44:16
7554
翻译 C++对象计数
有时简单的事情看起来非常简单,但是他们却是非常微妙的。例如,你有一个Widget类,你想知道一共在运行时一共创建了多少个Widget对象。一个简单可行的方法是在Widget内部创建一个static counter,当对象创建时增加计数器的值,当对象销毁时减少计数器的值。同时,也要创建一个static类型的成员函数howMany,用来返回当前有多少个Widgets对象存在。如果Widget类只有简单...
2019-01-26 12:25:33
4637
1
原创 NVIDIA CUDA原理和基础知识
为什么使用GPU为什么现在使用GPU(Graphics Processing Unit)编程越来越多,主要是因为GPU相对于CPU的运算速度,内存带宽均有较大的优势,下面是摘自《CUDA C PROGRAMMING GUIDE》中的图片:浮点数运算速度:内存带宽:GPU为什么性能高这是因为GPU中硬件更多的用于data processing而不是data caching 或 flow...
2019-01-21 17:45:08
12066
6
原创 记一次解决ubuntu18.04无法进入图形用户界面(GUI)的过程
最近尝试使用一个比较好用的Markdown软件vnote, 由于其release版本貌似托管在aws上,国内下载非常不方便. 虽然提供了百度网盘的下载地址,但是在Linux系统上又无法使用百度网盘客户端,于是尝试使用代码构建appimage, 发现代码目录下有一个.travis_linux.sh的脚本,看了下像是用来生成appimage,于是自己尝试运行该脚本,然后噩梦就开始了.重启系统后Lin...
2019-01-05 19:32:43
33239
2
C++ 智能指针(shared_ptr/weak_ptr)源码
2016-06-10
google's page rank and beyond&&&Understanding search engines
2009-09-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人