自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

guotianqing的博客

人生如画,画如人生。

  • 博客(301)
  • 收藏
  • 关注

原创 zmq.hpp编译报错:‘is_trivially_copyable’ is not a member of ‘std’

现象在ubuntu18.04上编译好的代码,拉到centos7上编译时,报错如下:是zmq.hpp报的错,已经使用-std=c++11选项。使用zmq库的是libzmq_4.3.2,zmq.hpp来自cppzmq,它是在libzmq上做了一层c++的封装。定位网上查了一下,有说是GCC版本太低导致的。从ubuntu18.04到centos7,gcc的版本也由7.5.0下降到了4.8.5。有可能就试一下,升级gcc,注意,不建议这样操作,因为一旦升级了gcc,原来在该服务器上编译的代码可能

2021-05-23 15:15:12 1699

原创 c++11中emplace_back vs push_back

引言在C11中,有两种方法可以把元素放入容器中:emplace_back和push_back。push_back是C11之前就有的,而emplace_back是C11中新加的。既然它们的作用都是一样的,那么为什么C11中又加入了一个emplace_back?既生瑜,何生亮?在实际的项目编码中,到底用哪个呢?优先选用emplace_back考虑下面这段非常常见的代码:std::vector<string> vs;vs.push_back("xyz");其中,vs容器持有

2021-05-16 21:18:39 761

原创 进程无故被kill,非OOM,是病毒

现象我的一个进程,是由crontab定时任务管理的,每天早上启动,晚上自动退出。已经在服务器上稳定运行了几个月。但是今天发现系统不太对,下游的服务不动作了,一查原因,原来的我的进程退出了。没有看到有core或者异常日志。为了先保证系统正常运行,手动启动它,结果刚运行1分钟左右,看到如下输出:[1] + 16957 killed ./a.out数次重启都被干掉了。问题如此严重,需要好好查一下子。定位OOM进程被kill掉,如果不是有进程主动为之,那就是被操作系统干掉了。

2021-05-13 19:38:13 1012

原创 浅谈std::thread的可联结性

联结性对于std::thread创建的线程对象,要么join它,要么detach它,否则会导致程序崩溃。要想从理论上解释上述原因,就要了解一下thread的可联结性。std::thread对象都是处于两种状态之一:可联结的和不可联结的。可联结状态:std::thread对应底层以异步方式已运行或可运行的线程对应的底层线程处于阻塞或等待调度对应的底层线程已运行至结束不可联结状态:默认构造的std::thread:它没有可以执行的函数,因此没有对应的底层执行线程已移动的std::th

2021-05-09 15:25:06 446

原创 使用std::async代替std::thread启动异步任务

std::threadc++11在语言层面对并发编程提供了有力的支持,std::thread就是一例,它以线程的方式启动异步任务。关于thread创建线程对象并使用的用法,请参考 std::thread创建线程的几种方式使用thread对象,并在其上运行一个函数,这是基于线程的程序设计:int DoAsyncWork();std::thread t(DoAsyncWork);std::async还有一种更好的方式:基于任务的程序设计。即把任务函数传递给std::async,示例:aut

2021-05-09 14:06:53 1733

原创 Mysql历险记: Job for mysqld.service failed because the control process exited with error code

现象经过一个五一小长假,电脑也得到了很好的休息。开工第一天,发现Mysql挂掉了,原因是其他服务产生了大量日志,把磁盘搞满了。理论上,磁盘满了,删除点文件,把空间释放出来,再重启Mysql就好了。但这次,重启不了了,查看状态显示如下:定位解决重启了几次,查看状态时,都是报这个错误。下面看一下Mysql的日志吧:这里的信息比较详细,可以看出Mysql在几天前已经挂掉了,它把丢弃无法恢复的数据。好在它给出了解决方法:set innodb_force_recovery=1于是,修改配置

2021-05-08 12:16:13 32655 1

原创 C++11中的万能引用和右值引用使用注意事项

简介右值引用仅会绑定到右值,主要用于识别出可移对象。可以绑定到左值、右值、const、非const、volatile、非volatile等等一切对象的引用,称为万能引用。右值引用和万能引用都使用形如“T&&”的符号表示。下面做个小测试,试着区分一下下面的引用属于万能引用还是右值引用:// 1.void f(Foo&& p);// 2.Foo&& var1 = Foo();// 3.auto&& var2 = var1;

2021-04-25 13:21:30 674 1

原创 C++使用TensorFlow加载python训练好的模型

简介工作流程:python: 使用keras训练模型并保存为h5(keras以tensorflow为引擎)python: 转换h5为pb文件python: 加载模型,并验证模型无误c/c++: 加载并使用模型依赖安装:# 指定版本安装# 如果已经存在该包的更高版本,会自动卸载并重新安装# 显示卸载示例:pip uninstall opencv-pythonpip install tensorflow==1.13.1pip install h5py==2.10pip instal

2021-04-22 09:04:04 1809

原创 浅谈C++11中的move和forward

含义move和forward都是C++11中引入的,它们是移动语义和完美转发实现的基石。move:不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue)forward: 不转发任何东西,也是执行左值到右值的强制类型转换,只是仅在特定条件满足时才执行该转换典型使用场景:某个函数模板取用了万能引用类型为形参,随

2021-04-18 18:18:54 2372

原创 Python使用json可视化Redis集群中的protobuf数据

背景在项目中,数据经过protobuf序列化后存入Redis集群。这是由c++来做的。但pb序列化的数据是二进制的,不便于人工查看。通过RedisDesktopManager查看时,是这样的:可以使用Python写个脚本反序列化一下,并打印出json格式的字符串,这样调试就方便多了。Python连接Redis集群Python连接Redis和连接Redis集群使用的包是不一样的。默认的redis只能连接Redis单实例,使用redis-py-cluster连接到集群:pip install

2021-04-16 08:40:53 692

原创 c++ vector的reserve到底对性能影响几何?

几个属性关于vector,有以下几个与Capacity相关的属性需要了解:size: 实际大小,即实际含有几个元素max_size:最大能容纳的元素个数,取决于操作系统和编译器,一般不会变化resize:改变实际大小到指定值,没有设置值的位置使用默认值填充capacity:容量,当前已经分配的内存能够容纳的元素个数,该值大于等于sizeempty:是否为空,同 size == 0?,若为空则返回true,否则falsereserve:预先设定容量到指定值,背后执行的可能是内存分配shri

2021-04-15 08:32:11 1727

原创 pandas读写csv

pandaspython提供了csv库专门用于csv文件的读写,但它的功能不是很强大。而pandas则弥补了这些问题:有专门支持读取csv文件的pd.read_csv()函数读取为DataFrame格式支持通过列名查找特定列功能强大,方便扩展以下是待处理的csv文件:读取读取csv文件只需要一行代码:#--coding: utf-8--import pandas as pdfile_path = r'./demo.csv'df = pd.read_csv(file_p

2021-04-11 12:42:15 1338

原创 Python读写Excel——Pandas

简介常用的读写Excel的库:pandasopenpyxlxlrd/xlwt/xlutils使用它们都能够达到读写Excel的目的,但它们的侧重点又略有不同。具体如下:pandas:数据处理最常用的分析库之一,可以读取各种各样格式的数据文件,一般输出dataframe格式,功能强大openpyxl:主要针对xlsx格式的excel进行读取和编辑xlrd库:从excel中读取数据,支持xls、xlsxxlwt库:对excel进行修改操作,不支持对xlsx格式的修改xlutils库

2021-04-10 18:41:42 1926

原创 浅谈Redis延迟测试方法

简介使用Redis的小伙伴们都希望能够获取最大的性能收获,不管什么操作,越快越好。然而,在实际的使用中,却发现有些指令的执行并不像想象中的那样flash。怎么办?我觉得首先需要回答下面这个问题:到底是Redis本身慢了,还是业务逻辑性能出了问题?本文主要针对第一种情况,来进行一下Redis延迟的基准性能测试。如果基准测试没有问题,那么Redis自身大概是没有什么问题的,就要检查一下业务逻辑或者使用的指令是否是慢指令了。基本延迟下面的测试都是使用 redis-cli 客户端进行,基础命令如

2021-04-09 18:33:24 3317

原创 C++获取随机数的3种方式

简介随机数的使用越来越广泛。除了加密领域,在日常生活中也随处可见。如抽签、抽奖、测试等。这里描述一个与Redis使用有关的场景:Redis过期时间的设置。即建议对大批量的数据过期时间,设置一个值,并加上一个随机值,防止批量数据同时失效,造成缓存雪崩或影响性能。c++11 c++11引入了头文件,用于生成随机数。它包括两个部分:random engine: 生成随机的bit流distribution: 生成满足用户需求的随机数用法如下:使用seed初始化random engine

2021-04-03 10:25:42 14569

原创 浅谈生态系统的平衡

自然生态在城市里生活的人,大概都知道,周边有个公园的重要性。深居简出,以前是形容一些贤能之士,居住在密林清幽之处,很少与外界世俗打交道。现在,可以用来形容人们居住在钢筋混凝土浇铸的公寓之中,很少与外界自然打交道。所以,如果周边有个像样的小公园,基本上可以经常与自然界打交道了。所幸我们公司边上有个小公园,每天中午休息间隔可以去与自然界亲近一下。公园虽小,五脏倶全。这里有白杨、梧桐、桃李杏等,春天一到,百花盛开,香气扑鼻。这里还有各种各样的小动物,偶尔碰到几只小松鼠在松枝上嬉戏,好不愉快。这

2021-03-28 09:48:31 515 1

原创 opencv ImportError: libGL.so.1: cannot open shared object file: No such file or directory

ModuleNotFoundError: No module named ‘cv2’使用opencv测试时,发现没有安装,报错如下:安装一下吧:pip install opencv-pythonok了。但下面遇到了另一个错误。ImportError: libGL.so.1: cannot open shared object file: No such file or directory针对这个错误,网上有以下方法:yum安装:yum install libglvnd-glx-1.

2021-03-26 19:05:15 14320 14

原创 keras加载模型load_model时报错:AttributeError: ‘str‘ object has no attribute ‘decode‘ “

背景使用Keras训练了一个模型,训练好后保存为h5文件。再次加载这个模型时,报错了:AttributeError: ‘str‘ object has no attribute ‘decode‘ “:我是使用 keras_to_tensorflow.py 这个脚本的时候报的错。解决网上说了一些报这个错误的解决方法。python2和python3的编码方式不一致导致h5py包的版本不对导致第一种情况基本可以排除,因为我是用Anaconda安装的tf,python使用的是3.6,没有py

2021-03-26 18:58:31 11301 23

原创 CMake/CMakeLists精简模板

关于CMake由于CMake的跨平台特性,现在已经被越来越多的项目使用。关于CMake的基础介绍,请参考cmake入门实践。本文提炼了一个精简的CMakeLists文件,通过适当的修改,可用于简单的项目中。模板直接上CMakeLists文件:# 指定最低版本cmake_minimum_required(VERSION 2.8)# 指定项目名称project(demo)# 为当前路径以及子目录的源文件加入由-D预编译定义# add_definitions(-DFOO -DDEBU

2021-03-26 18:41:39 250

原创 保存与加载Keras训练好的模型

简介可以在训练过程中和训练完成后保存模型,这样就可以很方便地恢复和重用模型,节省模型训练时间。这样也便于别人使用你的模型,一般有两种方式共享模型:创建模型的源码训练好的模型(包括权重、参数等)这里主要使用第二种方式。使用的框架是TensorFlow2.4的高阶API:Keras进行模型训练。验证环境假设你已经安装好了TensorFlow2.4的运行环境。如未安装,请稳步 install安装依赖:pip install -q pyyaml h5py # Required to

2021-03-23 19:26:18 3283

原创 浅谈Redis分布式锁及redlock

锁锁是一个与多线程编程如影随形的技术。多线程是为了充分利用多核CPU,发挥出并行进程的效率。锁是为了在多线程编程中保证共享资源的安全性。得不到正确结果的程序,再快也没有用。但,使用锁,就会降低程序的性能。因为在有锁的地方,多个线程也必然顺序执行。所以,现在也有一些使用无锁队列的方式来保证多线程安全。对于只有一个客户端操作Redis实例时,在多线程的环境中,可以使用事务和WATCH组成的乐观锁来解决相关的并发问题。但是,在分布式系统,当多个客户端同时操作Redis时,可能就需要分布式锁才能保

2021-03-23 08:32:30 502 1

原创 std::thread创建线程的几种方式

简介自从c++11开始,使用std::thread类创建线程是非常方便的。类thread关联的对象构造后立即执行(当然会有操作系统调试延迟)作为构造函数参数的函数的返回值将被忽略如果函数通过抛出异常终止,则调用std::terminate但函数可通过std::promise或通过修改共享变量(可能需要同步,请参见std::mutex和std::atomic)将其返回值或异常传达给调用方注意以下几点:线程对象是不可复制的,只能移动线程对象要么被join,要么detach,否则可能会导致

2021-03-19 18:48:14 2182

原创 Linux使用Anaconda安装TensorFlow2.4.1

安装Anaconda官网下载:Anaconda3-2020.02-Linux-x86_64.sh直接执行脚本,开始安装过程,中间选项根据需求选择,不清楚的选默认。安抚完成。根据安装目录把conda加入到系统环境变量。创建虚拟环境开始前,先配置conda的下载源:conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels htt

2021-03-18 09:30:11 1889 3

原创 编译Tensorflow2.4.1 C++ API动态库

环境系统环境:% cat /etc/issueUbuntu 18.04.5 LTS \n \l安装的tensorflow为当前Release版本:tensorflow-2.4.1.tar.gz。可直接到github下载。在其他版本的Linux上也可以安装。本文目标:编译出tensorflow的动态链接库以及准备好tensorflow第三方依赖库。基础包包括但不限于python3、Numpy、tar、zip、git等。如果有缺失,安装过程中会报错,根据提示安装即可。大部分系统已经默认

2021-03-17 18:53:44 1450 1

原创 基于Tensorflow2.4的C API下载安装及应用构建

目标安装c语言版本的tensorflow2.4版本库及头文件。安装完成后,能够使用c语言调用tf2库。支持平台:Linux, 64-bit, x86。其他版本可在文后链接查询。安装直接使用编译好的动态库和打包好的头文件,免去编译过程,直接使用。下载地址:仅支持CPU版本:https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-2.4.0.tar.gz支持GPU版本:ht

2021-03-16 15:23:52 721 1

原创 解决已安装numpy仍然报错ModuleNotFoundError: No module named ‘numpy‘

简介目前,大多数Linux系统自带python2了。但是很多应用却需要python3。于是安装了python3。每次执行的时候,输入python时默认启动python2,输入python3才会启动python3。在pip安装了Numpy后,启动python3导致模块时,依然报错:ModuleNotFoundError: No module named ‘numpy’原因由于系统默认的是python2,所以pip直接执行时,安装的都是python2的包。安装后使用Python2是可以正

2021-03-16 15:22:41 13464 5

原创 浅谈Redis事务解决并发问题

简介和其他大部分的 NoSQL 不同,Redis 是存在事务的,尽管它没有数据库那么强大,但是它还是很有用的,尤其是在那些需要高并发的网站当中。使用 Redis 读/写数据要比数据库快得多,如果使用 Redis 事务在某种场合下去替代数据库事务,则可以在保证数据一致性的同时,大幅度提高数据读/写的响应速度。在 Redis 中,存在多个客户端同时向 Redis 系统发送命令的可能性,因此同一个数据,可能在不同的时刻被不同的线程所操纵,这样就出现了并发下的数据一致的问题。为了保证异性数据的安全性,Re

2021-03-15 18:55:17 1186 2

原创 在redis++中使用事务和watch应对hash并发

并发这里针对Redis操作中的并发,有两个层面的意思:在单进程中,同时多个线程执行Redis写操作在同一个连接中在不同的连接中在多个进程中,同时执行Redis写操作,相当于上述场景同时存在多个假设以下应用,对 hash 表执行以下操作(更新值):hget 读取指定 field 的 value修改 valuehset 重新写回在单线程中执行上述操作是没有任何问题的,下面分析一下多线程的情况。事务在多线程环境中,当只有一个连接时,可能会出现以下问题:线程A执行,步骤

2021-03-15 18:52:32 786

原创 Bazel 4.0.0在Linux下的安装(附国内安装包下载源)

简介Bazel是Google开源的编译构建工具,以Monolithic Repository为理念。与makefile & CMake不同,Bazel另起炉灶,采用client/server运行模式,为云编译而生。Bazel工具将编译过程分三个阶段:Load Phase/Analysis Phase/Execution phase。研发人员实现workspace/build/.bzl三种文件,Bazel执行这些文件生成action graph,执行action来构建项目。Bazel优点:

2021-03-11 14:39:19 1580 2

原创 Redis 6.2.0单机、主从、哨兵到集群

单机Redis存在的问题Redis单机部署简单方便,只需下载编译,启动服务即可使用。一个Redis服务就是一个Redis实例,对应于一个进程,Redis6.2版本支持多线程,但多线程只是用于网络和IO,执行命令依然是单线程。一般情况下,使用一个Redis实例进行测试是足够的。但在生产环境下,随着业务量增加,单机版Redis逐渐会暴露出以下问题:存储能力局限于单机内存,扩容不便Redis实例宕机后无法持续提供服务,达不到高可用所有读写操作单机承受,可能成为并发性能瓶颈这时候,Redis主

2021-03-09 18:20:29 1519

原创 Redis性能问题排查方法及优化

查看Redis各项指标首先要能够连接到Redis并获取性能相关的指标。本文使用redis-cli客户端指令连接到Redis,使用info [section]命令获取相关指标。不指定section时,会获取所有10项指标:ServerClientsMemoryPersistenceStatsReplicationCPUModulesClusterKeyspace也可以指定section为其中之一,这样只会输出相关内容:下面分析一下可能造成性能问题的指标。基准性能我们

2021-03-05 15:25:08 2455

原创 Ubuntu18.04:Redis最新版本从安装到卸载

默认安装使用Ubuntu18.04,默认安装Redis方式如下:sudo apt install -y redis-server默认方式会把Redis安装在/usr/bin/下:# whereis redis-serverredis-server: /usr/bin/redis-server /usr/share/man/man1/redis-server.1.gz但是,这里方式安装的Redis可能不是最新版本的。如我的机器上安装的版本是4.0.9:# redis-cli -vred

2021-02-25 19:47:09 1800

原创 Python使用Pygal可视化GitHub仓库排名

获取GitHub数据方式要想从网络获取数据,就要使用Web API,通过它可以使用非常具体的URL请求特定信息。返回的信息通常是JSON或CSV格式,使用Python能够很方便地处理它们。本节,我们请求的网站URL为:https://api.github.com/search/repositories?q=language:python&sort=stars它返回GitHub当前托管Python的仓库项目和按星标排序后的数据。返回的数据示例如下:可见,GitHub上共有Python仓

2021-02-15 15:46:04 272

原创 Python分析csv文件及可视化绘图

简介项目中经常需要对日志文件进行分析,之前使用Shell,常用的是grep, awk, sed等。使用Shell有一个缺点,就是可视化不友好,经常需要把分析后的文件导出,再用Python/Excel可视化一下。本文直接使用Python对日志文件进行分析,并使用matplotlib进行可视化。数据这里的数据文件选用一个天气数据文件,它存储了某地一个时间段的最高温度、最低温度等数据。目的是把不同时间点最高温度和最低温度数据进行可视化,用折线图的形式绘制出来。数据文件引用《Python编程——从

2021-02-13 11:35:01 12456 2

原创 知行合一,持续输出,以不变应万变

现状几十年前,还没有手机,没有网络,人们获取新闻的方式是报纸。而每天读报纸的人并不多。几年前,人人都有一部手机,人人都可以同时获取世界上任一角落发生的事情。即使你并不想知道。如今,短视频、长视频、视频号统统安装在手机上,人人都可以看到世界任一角落的人。即使你并不关心。未来,虚拟现实?瞬间转移?世纪穿越?还是其它?回归本质社会的发展是日新月异的,而人类本身的发展,依然一如既往。借助于飞机汽车,人类可以轻易日行万里。借助于眼镜,人类可以看到原本看不到的极限。人类会使用工具,这是人类与其他动

2021-02-11 10:18:37 203

原创 Linux下C++跨平台获取高精度时间戳

简介C++语言本身及Linux操作系统均提供了时钟相关的函数,可以方便获取时间。但是,在一些场合下,需要的时间精度不同,又不能通用。如果依赖于Linux平台,又不能做到跨平台。所以优化考虑使用C++语言本身提供的函数。本文介绍使用 std::chrono 命名空间下的函数来获取时间戳。需要 c++11 支持。关于时间函数的介绍,请参考 Linux c++获取本地毫秒级精确时间 。获取时间跨度在测试一段程序的耗时时,经常需要统计时间跨度。示例代码如下:int countTimeCons

2021-02-10 14:27:58 2139

原创 程序员、律师和医生,中年危机是程序员专利?

高知背景程序员、律师和医生,是我们在生活中经常需要打交道的角色。律师和医生很容易理解,需要的时候自然要向他们寻求帮助。而程序员,小到外卖小哥被困,大到火箭升空失败,都有可能把他们推到我们的视野里。他们大概有一个共同特点,那就是高知识、高学历的背景。很可能,也只有这一个共同点。选择的路世上本没有路,走的人多了,便有了“路”。高中时,你的同桌、你的同学,几年后,就是一个个的程序员、律师、医生…这没有定数,只是选择使然。在学生时代,大家都是一样的热血少年,走出大学校门,没有两个人会经历完全

2021-02-06 17:23:16 1432 1

原创 为什么成年人都开始炒股了,是想不通过努力获取财富么

背景这是之前看到过的一篇文章,今天突然又想起来了。现在想想问题,有点想笑。但自己上学时,做家教也经常看到那小孩的父亲在看股票走势,也想过上述问题。说到投资,不能回避的问题有两个:一个是房子,一个是股票。时至今日,自己也有了一套房子,也有了一点投资基金和股票的经验,想谈谈对这件事情的理解。房子现在政策已经很明确了:房子是用来住的,不是用来炒的。这是2016年政府提出的,新闻报道如下:2016年12月中旬,中央经济工作会议提出,要坚持“房子是用来住的,不是用来炒的”的定位,要求回归住房居

2021-01-31 16:23:09 410 4

原创 使用循环神经网络预测温度

简介本文以天气时间序列数据集为例,讨论如何使用深度学习模型预测未来天气温度。使用的是由德国耶拿马克思普朗克生物地球化学研究所的气象站记录。数据每10分钟记录一次,共记录14种不同的量,如气温、气压、湿度、风向等,原始数据可追溯到2003年,本例只使用2009-2016年的数据。数据下载并解压数据略。加载数据:data_dir = r'E:\practice\tf2\temperature'fname = os.path.join(data_dir, 'jena_climate_2009_

2020-12-31 21:42:03 4672 5

原创 使用循环神经网络RNN进行IMDB影评分类

简介这是一个使用深度学习处理文本序列的示例。我们已经尝试使用密集连接层处理过IMDB数据集,回顾请参考Imdb影评分类。本文使用循环神经网络来处理文本序列。文本处理文本可以理解为单词序列或字符序列。现在已经广泛使用的自然语言理解、文档分类、自动问答等都可以看作是深度学习在文本识别领域的应用。本文介绍的深度学习模型并没有像人类一样真正地理解了文本,而只是映射出书面语言的统计结构,但这也足以解决许多简单的文本处理任务。深度学习用于自然语言处理是将模式识别应用于单词、句子和段落,这与计算机视觉

2020-12-29 16:39:03 3786 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除