log4cplus日志系统 一站式安装说明与测试程序编写
简介log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License保护。作者是Tad E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 你可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
下载地址https://github.com/wilx/log4cplus
安装说明LinuxGit clone https://github.com/wilx/log4cplus --recursive
Cd log4cplus
./configure
make
make install
安装成功
接下来将上面的Lib地址里的文件全部复制到/usr/lib/里cp -r Lib地址 /usr/lib
问题汇总1、GCC编译器版本过低 error: *** A compiler with support for C++17 language features is r ...
算法复习-动态规划 (1)
原理问题的最优解如果可以由子问题的最优解推到得到,则可以先求解子问题的最优解,再构造原问题的最优解;若子问题由较多的重复出现,则可以自底向上从最终子问题向原问题逐步求解。
特点
将原始问题划分为一系列子问题
求解每一个子问题仅一次,并将结果保存在一张表中,以后用到直接存取,不需要重复计算
整体问题的最优解取决于子问题的最优解(状态转移方程,即将子问题称为状态,最终状态的求解归结于其他状态的求解)
设计步骤
递归+记忆化 —> 递推
找到状态变量并定义
寻找状态转移方程
分析分解条件
优化子结构例题讲解讲解动态规划这个算法没有什么例子斐波拉契数列更经典的了。后面大部分的动态规划题目都是以斐波拉契数列为基础展开的。题目:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…请求出第n个数回溯法(递归)很明显的,从第三个数字开始,后面每个数字的值都是前两个数字相加得到的,那么我们可以写出一个很简单的递归程序.int Solution(int n)
{
if(n<=1)
return 1;
return Solution(n-1)+Solu ...
LeetCode刷题(2)最长回文子串
题目Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: “babad”Output: “bab”Note: “aba” is also a valid answer.Example 2:
Input: “cbbd”Output: “bb”
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
My Solutionclass Solution {
public:
string longestPalindrome(string s) {
string temp="",maxStr="";
int maxLeft=0,maxRight=0,max=0;
...
上位机崩溃问题解决 2019-12-9
知识点程序的可移植性某些支持库没有安装、dll文件缺失但是运行的时候并不是提醒而是直接变现为崩溃的现象。
问题&BUG老问题,一到某个位置就崩溃。
过程及解决方案
过程:让对方用串口调试助手+虚拟串口模拟真机跑一遍,同时我的电脑也跑一遍发现对方的机器崩溃了,在确认对方操作没问题的情况下得出是运行环境的问题。
解决方案:实地调试,可能是系统原因吧。心得体会发现是运行环境的问题的时候,我吐了。发誓以后都不再用微软的东西了,恶心。
C# 上位机 崩溃 2019-12-8
知识点异常处理机制try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。抛出异常意味着可以自定义异常消息,可以将异常处理的方法交给外部,内部只需要将异常出现时出现的原因(消息)告诉(比较简单的使用时throw(new ApplicationException(“字符串”)))外部就好了。
简单来说,对于一个可能出现问题的函数/过程我们用
try{
内容
}catch(exception e)
{
出现问题后我们的处理方案
}
问题&BUG硬件设备不在身边,串口收发数据方面出现问题,根据描述可以将错误定位在以下几个方面:
DLL函数调用出错
下位机数据发送太快,出现粘包
信号量或者互斥锁释放异常
过程及解决方案
过程询问另一个 ...
观察者模式
QT中的信号和槽机制就相当于观察者模式的一种扩展,全局实现了观察者模式,如果对QT的信号槽机制很了解的话对于观察者模式应该得心应手,因为信号和槽机制实现起来比观察者模式难得多(我说的不是简单的connect这样子…)什么是观察者模式?就是当目标发送了某个信号后与其绑定的对象执行特定的动作。就类似于开关和灯的关系,开关发送通电信号,灯观察到了这个信号后执行亮灯动作。所以开关是被观察的目标,灯是观察者。
首先明确一点,使用这个模式的目的是什么?假设我是一名嵌入式工程师,我需要编写一个开关类,当开关类中的一个位置被置1的时候,通知所有插在这个开关上的设备都通电。
不使用观察者模式的实现在开关类中设置一个bool flag同时开关类作为全局对象,所有的设备类都去循环检查这个值,如果为真就执行对应的动作。(最简单的实现)
优点:简单毫不做作
缺点:无形之中浪费很多性能,我需要在一个线程中不断的去检查这个值,直到flag置为1的时候才需要触发对应的动作(通电)。团队开发的时候全局变量很容易出问题,经常被某某某给乱用就用出问题了。观察者模式首先明确一个观察者:“设备”,被观察的“目标”:开关。 ...
LeetCode刷题(1)两数之和
题目You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8Explanation: 342 + 465 = 807.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers著作权归领扣网络所有 ...
多线程(2)互斥锁和信号量
引用自维基百科互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区域(critical section)达成。临界区域指的是一块对公共资源进行访问的代码,并非一种机制或是算法。一个程序、进程、线程可以拥有多个临界区域,但是并不一定会应用互斥锁。
信号量(英语:Semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态.
互斥锁的作用在多线程编程中,多条线程对同一内存区域进行操作时,会产生意料之外的情况发生。这时候就需要用到互斥锁,线程对当前需要 ...
多线程(1)线程的定义和相关API
线程的定义(以下摘自维基)线程是操作系统能够进行运算调度的最小单位。包含在进程中,是进程中实际的运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程可以并发多个线程,每个线程并行执行不同的任务。(在一些类Unix的系统中也被称为轻量进程,但是轻量进程更多指的是内核线程,而用户线程称为线程)线程是独立调度和分配的基本单位。同一进程中的多条线程将共享进程中的全部系统资源。例如虚拟地址空间,文件描述符和信号处理等等,因为线程没有自己单独的地址空间(共享进程的地址空间),当一个线程死掉就等于整个进程死掉。但是每个线程都有各自的调用栈(call stack)、寄存器地址(register context)和本地存储(thread-local storage)。在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。
PO ...
Apache占用内存太高解决方案
内存占用突然飙高的原因竟然是…最近,我在写博客的时候发现总是写着写着就崩了,重启之后就可以了。 本来以为是服务器IP突然被墙无法访问的原因(这个原因事后想来很蠢,因为重启之后就可以继续访问了所以肯定排除了服务器IP的问题),导致我换了好几次机房都无果。突然意识到,会不会是因为服务器的内存占用比太高了导致一些服务崩掉了。后来查了一下服务器后台的内存占用数据,果然。。。 再顺手一查发现果然是httpd占用太高了。 这是解决后的(虽然仍然占比很多,但这是我在编辑文章的时候截的,实际效果好很多)
查看Apache是什么模式的httpd -VPs:如果遇到找不到httpd命令的话,说明apache的文件夹没有加到全局变量里面。那么你就需要执行:export PATH=/usr/local/apache/bin:$PATH当然,这个只是一次性的,如果你不想下次用的话还需要翻阅你的浏览记录来查找这篇博客的话(尽管我很希望如此),那么就需要将这句话加入到全局配置文件中(或者在用用户目录下修改~/.bashrc用户配置文件)vi /etc/profile 写入以下内容:export PATH=" ...
Gcc链接 动态库静态库
一、基本概念Linux下的库有两种:静态库和动态库(又称共享库),.a表示静态库,.os表示动态库两者的区别为载入到代码的时刻不同。静态库的代码在编译过程中就已经载入到可执行程序中,类似于头文件加载一般,产生的程序体积较大。动态库的代码是在可执行程序在运行的时候才载入到内存中,在编译中仅做一个简单的引用,因此生成的体积较小ldd命令可以查看一个可执行程序依赖的共享库,
例如$ ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依赖于libc库和ld-linux库
动态库
优点:生成程序体积小,方便更新,不同程序当调用同一个库时可以共享一个动态库,只要在内存中有
缺点:程序不稳定,动态库一旦丢失就无法启动,给其他人使用时需要对方有相应的动态库。动态库链接时搜索的路径顺序
编译目标代码时指定的动态库搜索路径;
环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
配置文件/etc/ ...
关于正则表达式的笔记
用来记录一些正则表达式下的一些东西怕自己忘了首先是一些常用的符号的意思
^:表示开头
$:表示结尾
*:表示任意字符或者无字符
.:表示单一字符
(.* 这样连起来的应用就是至少要有一个字符字符)
[] :表示字符集,意味着这里面的内容都可以被匹配到下面是一些常用的字符集,也可以直接使用自己定义的字符集,如[# ]这个字符集里只有一个[:alnum:] 数字字符 [:digit:] : 数字字符 [:punct:] 标点符号字符[:alpha:] 字母字符 [:graph:] 非空格字符 [:space:] 空格字符[:blank:] 空格与定位字符 [:lower:] 小写字母字符 [:upper:] 大写字母字符[:cntrl:] 控制字符 [:print:] 可显示的字符 [:xdigit:] 16进制数字 例子 sed ‘/^[# ]/d’ file 删除开头是# 的行 sed ‘/^\s$/d’ file 删除空行