![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++
文章平均质量分 56
风竹夜
github: https://github.com/fengzhuye
开源软件, github,c/c++, linux,orocos,ros,ethercat,canopen, matlab etc.
展开
-
vscode + ccls settings
【代码】vscode + ccls settings。原创 2022-09-27 10:29:52 · 711 阅读 · 1 评论 -
function calll in asm (todo ...) + setjump&longjump
https://www.cs.princeton.edu/courses/archive/spr16/cos217/lectures/15_AssemblyFunctions.pdfhttps://en.wikipedia.org/wiki/X86_calling_conventions原创 2021-02-18 16:49:27 · 166 阅读 · 0 评论 -
MySQL InnoDB Cluster + MySQL Router 8 + Async replication
MySQL 可扩展的 InnoDB 方案:在同一机房,或者邻近机房至少3台机器组成 InnoDB Cluster(网络连接较好)在网络连接较差的机房使用传统的 Master + Slave 异步 Replication, 其中的Master来之 InnoDB Cluster 中的任意一台机器。[mysqld]skip-host-cacheskip-name-resolvedatadir = /var/lib/mysql/general_log = OFFevent_scheduler=ON原创 2020-05-08 21:11:31 · 455 阅读 · 0 评论 -
gdb 常用命令 和 core dump 分析
https://cand-w18.unexploitable.systems/l/lab02/note-on-gdb.txt原创 2020-04-15 17:56:32 · 1057 阅读 · 0 评论 -
http & Restfulapi encryption,如何确保获取的数据没有被篡改。
由于部署和性能如果不能采用 https, 可以使用 hybrid encryption 保证数据不被串改(不能防中间人攻击,也不能防止数据的泄漏——除非采用白名单)。hybrid encryption:client—> send RSA 非对称的公钥给 serverserver 随机生成 AES 对称密钥用于加密数据,并用 client 的公钥加密 AES 对称密钥server 将...原创 2020-04-15 11:26:12 · 352 阅读 · 0 评论 -
how to install perf on customized kernel
下载kernel代码make -C <kernel source root directory>/tools/perf找一个最接近的版本安装:sudo apt-get install linux-toolsReading package lists... DoneBuilding dependency tree Reading state inform...原创 2019-11-22 10:44:05 · 469 阅读 · 0 评论 -
how-databases-work mark一下。。。
http://coding-geek.com/how-databases-work/转载 2018-05-09 16:05:26 · 314 阅读 · 0 评论 -
Orocos DataPort 解析: orocos lock free data object
Orocos有两种 dataPort (Input, Output),在 conncet(Output, Input) 之后,往 Output 中写的数据能够传递到 Input 中并读取, 一个OutputPort可以连接多个InputPort(类似于ROS中的Pub&Sub),这极大地提高了模块化设计的数据交换。 其中能够实现数据交换的关键是 ChannelDataElement 数据结构,在原创 2016-05-06 10:31:40 · 3781 阅读 · 0 评论 -
Lock-Free,无锁数据结构 & 无锁编程 Orocos — Muliti Writer Single Reader Queue
无锁数据结构无锁的数据结构应用越来越广泛,现在几乎所有的多核cpu都提供了 CAS 操作。实现无锁的 Muliti Writer Single Reader Queue 的关键还是 实现指针的 CAS( gcc: __sync_val_compare_and_swap ).这里有一个 Single Writer Mulity Reader 的 无锁实现 see link实现过程:创建一个数组 _bu原创 2016-06-03 15:59:21 · 3612 阅读 · 2 评论 -
stack unwinding & on_scope_exit & c++ exception:构造 析构 异常处理
在构造函数中可以抛出异常,但是该对象的析构函数不会被调用(因为异常导致该对象没有被正确生成,也就没有必要对其析构),所以,某些需要被清理的工作应该考虑 on_scope_exit 处理,例如将分配到内存放入智能指针中,这样即使析构函数不被调用也不会出现内存泄露。void f(){ X x; // If X::X() throws, the memory for x it原创 2015-09-29 16:32:44 · 2956 阅读 · 0 评论 -
cache line & False sharing mark
CPU的缓存是由SRAM(互锁的三极管)构成的, 因此速度快,容量小。而内存是由DRAM(三极管和电容)构成的,容量大,速度慢。例如,一个可能的时间数量级列举如下:L1 cache: 1ns to 2ns (2-4 cycles)L2 cache: 3ns to 5ns (6-10 cycles)L3 cache: 12ns to 20ns (24-40 cycles)RAM: 60ns (1原创 2018-04-03 17:23:04 · 367 阅读 · 0 评论 -
c++11 条件变量 std::condition_variable,多线程同步
一般来说,多线程中如果需要等待一个变量或者条件为true 或者同步多个线程,有两种方法:1 . 忙等待,不停地检查该变量是否满足条件while(pre) // polling loop{}该方式有很多缺点:占用cpu资源,变量 pre 必须多线程安全,或者为 atomic 类型。在while中sleep可以解决cpu占用为题,但是在变量满足条件时又不能及时的唤醒该线程。2 . 使用条件变量 st原创 2016-06-29 13:13:24 · 9032 阅读 · 0 评论 -
c++11 shared_ptr & unique_ptr & move semantics(右值引用) & emplace & lock_guard & final 和 override 关键字
使用任何指针是都要考虑ownership+memory-management+lifetime这几个问题。 who is the owner of this object? is there one owner or many? who will responese for the deletion?Just read it smart_ptr: https://mbevin.wordpres原创 2015-06-26 10:09:31 · 4486 阅读 · 0 评论 -
hash function & unordered_map & map
std::map 是通过数据结构红黑树实现的(自平衡二叉查找树)。因此,一个数据结构能够作为map的key的前提是,该数据结构能够 copiable and assignable ,并且能够被用来比较大小( overrides operator< )。 注意,这里的 operator< 要满足 strict weak ordering ,即 if( !(x<y) && !(y<x) ) 等价于 x翻译 2015-12-16 17:19:29 · 2821 阅读 · 0 评论 -
function call stack
写得太好了忍不住,直接复制过来的,侵删!https://www.recurse.com/blog/7-understanding-c-by-learning-assembly … Abstraction layers are great tools for building things, but they can sometimes get in the way of learning. My转载 2018-03-29 18:07:51 · 1279 阅读 · 0 评论 -
虚拟地址/物理地址——virtual address(memory)/physical address: 树莓派 mmap example
通常: If you want to find a way for access physical memory in Linux there are only two solutions. The first is to develop a module running in kernel space with the correct privileges to access physical原创 2015-10-30 23:43:53 · 8016 阅读 · 0 评论 -
windows上获得高精度时间戳 GetSystemTimeAsFileTime
如果你需要高精度时间戳(一个绝对时间点),而不是定时器(计算相对时间),那么可以考虑这个API:GetSystemTimeAsFileTime()引用自: https://stackoverflow.com/questions/1695288/getting-the-current-time-in-milliseconds-from-the-system-clock-in-windows The原创 2018-03-21 12:16:05 · 11835 阅读 · 0 评论 -
linux(or Windows) 异步网络编程 simple client-server-select 应用
一般的简单网络编程就是创建一个 server 和 一个 client,然后分别send&amp;amp;amp;amp;amp;amp;recv 数据:如果是针对一对一的连接(即一个服务器一个客户端),则如下代码:在 linux 中网络编程需要用到这么一些头文件:#include &amp;amp;amp;amp;amp;quot;sys/socket.h&amp;amp;amp;amp;amp;quot;#include &amp;amp;原创 2017-02-23 10:13:23 · 736 阅读 · 0 评论 -
The proper way of implementing user login system(mark learn)
存储一个密码:使用CSPRNG生成一个长的随机盐。将密码和盐拼接在一起,使用标准的加密hash函数比如SHA256进行hash将盐和hash记录在用户数据库中 盐要使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的ran原创 2017-10-18 14:01:14 · 539 阅读 · 0 评论 -
Visual Studio 调试技巧
总结一下在vs中常用的调试技巧最为农历新年到来之前的最有一更。。。作为宇宙中最强大的debug工具,vs有很多易用切功能强大的功能。断点 这个不说了,最常用的功能。这个要注意点的就是,在修改了源码之后,需要重新编译你的断点才能继续用,否则不生效。调用堆栈 Call Stack 通过该窗口可以看到函数的一级一级的调用过程,可以知道程序的执行路径。函数返回值 当通过F10单行运行时...原创 2018-02-09 11:13:24 · 1062 阅读 · 0 评论 -
关于 inline 函数的分析: *** undefined reference to ***
如果将函数的实现放在头文件中,那么每一个包含该头文件的cpp文件都将得到一份关于该函数的定义,那么编译器会报函数重定义错误。如果将函数的实现放在头文件,并且标记为 inline 那么每一个包含该头文件的cpp文件都将得到一份关于该函数的定义,并且编译器不会报错。如果将函数的实现放在cpp文件中,并且没有标记为inline,那么该函数可以被连接到其他编译单元中。如果将函数的实现放在cpp文件中,原创 2017-09-11 16:25:48 · 10447 阅读 · 10 评论 -
How ELF file maped in virtual memory? mark
ELF 文件的 .text .data .bss 等各个段是如何map到内存中的?程序运行时是如何access各个段?check this link: https://gist.github.com/CMCDragonkai/10ab53654b2aa6ce55c11cfc5b2432a4...原创 2019-07-05 16:21:22 · 262 阅读 · 0 评论 -
How Mutex&Lock works? mark...
mutex is just an integer in memory. But how it works?https://mortoray.com/2019/02/20/how-does-a-mutex-work-what-does-it-cost/https://eli.thegreenplace.net/2018/basics-of-futexes/原创 2019-06-27 16:29:31 · 202 阅读 · 0 评论 -
编译 Chromium Embedded Framework
编译 Chromium Embedded Framework需要设置代理,否则被墙:set https_proxy=http://localhost:8080set CEF_USE_GN=1set GN_DEFINES=use_jumbo_build=trueset GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*python...原创 2019-05-17 17:28:01 · 603 阅读 · 0 评论 -
How Debuger works Mark&Learn
好文齐分享。。。https://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1https://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpointshttps://eli.thegreenplace.net/2011/02/07/how...转载 2019-05-10 10:48:40 · 209 阅读 · 0 评论 -
关于 Dynamic atexit destructor for ***
Dynamic atexit destructor for xxx一般遇到这个 call stack 很可能是全局变量析构函数中有依赖导致的。这个 call stack 会很短(因为有可能是任何情况导致程序退出),直接分析可能找不出原因。至于全局变量的析构顺序,c++中没有明确定义,一般各个编译器实现为:根据构造的顺序逆向析构。但是全局变量的构造又是很难控制的,以为各个全局变量会分布在不同的...原创 2019-03-15 17:27:33 · 2064 阅读 · 0 评论 -
void pointer & type-punning & strict aliasing etc.
https://stackoverflow.com/questions/15745030/type-punning-with-void-without-breaking-the-strict-aliasing-rule-in-c99https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8原创 2018-11-14 15:02:33 · 556 阅读 · 0 评论 -
关于 “将静态库改成动态库” 的思考
this link: http://www.cplusplus.com/forum/general/120142/结论就是:在编写任何一个框架(c++ 库) 的时候,需要想好编译配置。静态库(简单)动态库(考虑好暴露哪些接口,需要在每一个暴露的接口处添加 API 宏)在暴露某一个类的时候,该类的所有成员都会暴露,如果使用了 标准库的某些成员,会导致很多编译错误,可以写成这样:clas...原创 2018-11-02 15:37:51 · 2109 阅读 · 0 评论 -
Memory Leak Debug with Visual Studio ...
结合这篇文章,完善一下Windows 和 Linux 内存泄漏 debug。本文总结一下之前在Windows上debug的一个内存泄漏问题的经过:一般一个程序出现少量内存泄漏的话(如果不是很严重),需要观察一段时间的内存占用才能被发现问题。观察内存占用一般是两个地方:打开Task Manager-&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Details 标签或者,打开 “Resource Monitor”如图(Co...原创 2018-10-24 10:58:40 · 730 阅读 · 0 评论 -
C++ 串行化——A practical guide to C++ serialization
Boost 有很多种 archive 格式,例如 Text, XML, and Binary archives,但是基本上只用 Text 和 XML,因为 Binary 的不保证 32bit/64bit 大端/小端等平台兼容性。这里只介绍 Non Intrusive Version,也就是不需要修改原来的类定义:。一个简答例子:#include &amp;amp;amp;amp;amp;amp;amp;amp;lt;boost/archive/te...原创 2018-08-17 14:37:03 · 1192 阅读 · 0 评论 -
关于 c++ lambda 函数需要注意的点
lambda 函数 capture by reference 很好理解,就类似于 Functor. 会在 closure 中定义一些指针指向使用的对象地址。然后 capture by value 正常也是会在 closure 中定义一些对象,然后复制这些对象进 closure.需要注意一点的是: One other thing that is sometimes overlooke...原创 2018-07-27 16:24:41 · 1460 阅读 · 0 评论 -
关于 visual studio 设置 头文件\库文件 路径的问题
visual studio 主要从这几地方加载项目属性(包括x86 or x64, Debug or Release, 头文件路径,库文件路径等等):项目属性已分层, 每层继承前一层的值,但是继承的值可以通过设置属性显式重写, 这是基本的继承树: 1. 来自 MSBuild CPP 工具集的默认设置(..\Program Files\MSBuild\Microsoft.Cpp\v...原创 2018-06-20 16:10:52 · 2593 阅读 · 0 评论 -
google test 例子 & coding style
google test & mock:编写单元测试是非常有用的,良好的单元测试能够极大地减少代码中bug,尤其是当多人协作时,谁用谁知道啊!自从 google code 关闭之后,gtest 被挪到了 github 中,不翻墙可以浏览了:-)一个最简单的例子:#include "gtest/gtest.h"// TEST宏需要两个字符串,在输出的时候能看到测试的是哪个caseTEST(MySimp原创 2015-09-28 16:39:39 · 3036 阅读 · 0 评论 -
WAMP RPC & Publish & Subscribe c++ 实现简析 & TCP 粘包处理方法
基于tcp/ip 的 RPC和Pub&Sub 基本上都是基于 boost::asio 实现的。一个wamp_session表示一个wamp端的连接,wamp 提供了注册 callee,调用一个caller 或者向一个 topic pub&sub 数据的功能。步骤:创建一个 wamp session,建立 TPC/IP 连接注册 callee, subscribe topic etc.wamp_原创 2016-06-16 15:05:59 · 3399 阅读 · 0 评论 -
logrotate 删除过期的日志
create 模式:重命名原先的日志文件,并通知程序重新打开一个日志文件(重启程序,或者发送信号通知应用程序重新打开一个日志文件)。Logrotate size option: Rotate the log file when file size reaches a specific limitIf you want to rotate a log file (for example, /tmp/o原创 2017-06-21 11:18:31 · 4474 阅读 · 2 评论 -
CANOpen,关于 DS402 电机驱动器的状态切换(控制字&状态字)
各种状态的迁移是通过控制字可状态字来完成的: 这是一段关于状态迁移的伪代码:if ( (input.status_word_& 0x007f) == 0x0037) // (正常工作状态)Switch On + Enable Operation + Quick Stop Off + No warning + Voltage On{ // 在这里正常发送控制指令,位置,速度,力矩等}原创 2016-03-31 13:09:22 · 30019 阅读 · 19 评论 -
C++ Has Become More Pythonic ( tuple & 可变模板参数 )
尊重作者,转载自: http://preshing.com/20141202/cpp-has-become-more-pythonic/ True and Indeed!C++ has changed a lot in recent years. The last two revisions, C++11 and C++14, introduce so many new features that转载 2015-12-10 09:10:29 · 3069 阅读 · 0 评论 -
设计模式——状态模式(有限状态机)
状态模式适用的情况:一个context对象根据其所处的状态改变其行为。在状态模式中,我们通过创建不同的state对象来表示不同的状态,而context对象则根据不同的state对象表现出不同的行为。状态模式将不同的状态结构化,以避免过多的 if else 和 switch case 等样版代码。用设计模式中的 状态模式(行为状态) 实现一个简单的状态机(fsm),其中 class Machine 为原创 2015-12-29 17:11:45 · 8217 阅读 · 0 评论 -
Orocos Activity&ExecutionEngine 解析
Orocos 每一个TaskContext 类表示一个完整的模块,该模块有configure,start,stop,clean,setPeriod等等方法来控制这个模块的运行。如果使用了该模块的setActivity方法,将该模块放在一个单独的线程中运行,该模块内便独立于其他模块,根据自己的周期频率执行各个函数,读写dataport等。setActivity 方法如下:bool TaskContex原创 2016-06-01 13:47:20 · 3359 阅读 · 0 评论 -
环形缓冲区-boost circular buffer & 读写锁(shared_mutex)
在涉及到缓存差值点数据的时候,一般会使用circular_buffer来实现。 It is a kind of sequence similar to std::list or std::deque. It supports random access iterators, constant time insert and erase operations at the beginning or原创 2016-05-24 10:43:51 · 6209 阅读 · 0 评论