前言
最近在写实验室的项目ROI,项目原本使用Python开发,由于之前种种原因造成项目种种问题,包括但不限于小bug众多、大bug难调、结构臃肿不够清晰等等。
本次重写准备用C++,项目环境CLion+QtCreator。这两者都不是很熟悉,所以在摸索。利用QtCreator写好简单的UI之后(这不是重点,随便画了一下,这个后面都好调),如何在CLion中编译便成了问题,Qt编译的原理有些绕,因为涉及到了元对象系统、uic方面的东西,所幸已经看过一些Qt编译的基本原理所以半天就搞定了。顺便在二月的最后一天,水一篇博客(逃)。
官方也提供了这方面的知识CMake Manual 5.10;
项目目录
这里提一下:
- ROI项目的整体结构是,下面一个UI项目目录,用于编辑UI,还有一个GNURadio目录,用于编写后台代码。CMakeLists.txt放在ROI目录下。
├─ROI
├─bin % 存放编译生成的可执行文件
└─ROI % 编译生成的可执行文件
├─GNURadio % 源文件目录之一
└─top_block.cpp % 源文件
├─UI % 源文件目录之一
├─main.cpp % 源文件
├─widget.cpp % 源文件
├─widget.h % 源文件
├─widget.ui % 源文件
├─UI.pro % QtCreator项目文件,直接打开可以编辑UI
└─UI.user.pro % 不用管
├─build-UI-Desktop... % QtCreator产生的影子目录
├─cmake-build-debug %
└─CMakeLists.txt % CMake文件
再提几点:
- QtCreator的影子目录(shadow build)。Q
Boost.Asio 初探
简而言之,通过利用Boost.Asio,I/O对象可以执行异步/同步的操作。在使用Asio之前,先介绍Asio的工作原理。分为两种情况,同步和异步。
同步
同步情况下,当socket执行一个连接(connect)操作时,工作原理如下图:
如图中所示,你的程序需要一个I/O对象(如socket),一个io_service
对象,io_service
对象可以理解为调度器,其主要作用是将程序和操作系统的I/O服务相连。
// 通过asio库,新建io_service对象
boost::asio::io_service io_service;
// 利用io_service对象构造I/O对象,比如TCP套接字
boost::asio::ip::tcp::socket socket(io_service);
当一个异步连接操作发生时,会有如下事件发生:
1. 调用I/O对象,进行连接操作的初始化
\\ 初始化连接操作,即指出所监听的端口
socket.connect(server_endpoint);
- I/O对象将请求转发给
io_service
对象 io_service
对象调用系统的I/O服务进行连接操作- 操作系统将操作结果返回给
io_service
对象 io_service
将操作结果中的任何错误传入一个boost::system::error_code
类型的对象中去。error_code
可以与特定值进行比较,或者作为布尔值进行判断(比如,false表示没有发生错误)。接着,io_service
将结果转发回I/O对象。- 如果操作失败,则
io_service
将跑出类型为boost::system::system_error
的异常。如果代码如下:
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
则不会有异常抛出,取而代之的是,将error_code
变量的值传入ec中返回。
异步
异步的工作原理与同步不一样,如下图:
事件发生顺序如下:
1. 调用I/O对象,进行连接的初始化
socket.async_conne
图像转ascii码文本
环境: ubuntu 16.04
安装 aview
sudo apt aview
aview的作用是将pnm格式的图片转换为ASCII文本,并显示。aview只支持pnm、pgm、pbm和ppm格式的图片,所以需要将其他格式的图片转换,它提供了一个asciiview的脚本,利用convert转换图片格式,然后再传递给aview。
因此,直接可以执行
asciiview laotouzi.jpg -driver X11
laotouzi.jpg 为我处理的图片,-driver是要选择的设备,这里选择X11,是为了可以改变字体,以提高/减小分辨率
改变字体大小
- 为改变字体大小,需要执行
export AAFont=-*-fixed-bold-*-*-*-*-35-*-*-*-*-*-*
设置环境变量,这里设置字体大小35
2. 然后再执行asciiview的命令即可看到改变后的字体大小
其他
jp2a 是另一个工具,用来转换的工具
0x00 环境
- 系统:ubuntu14.04或者ubuntu16.04
- vim --version查看是否支持python2或者3,并且vim版本大于等于7.4.143
0x01 安装YCM
一般有两种安装方式,推荐使用第一种
通过Vundle安装YCM
安装 Vundle插件
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
在vim的配置文件 ~/.vimrc添加插件
call vundle#begin()
" 其他插件
Plugin 'Valloric/YouCompleteMe’
" 其他插件
call vundle#end()
配置完.vimrc保存,并运行:PluginInstall安装插件,该插件安装时间较长,须耐心等待
通过git安装YCM
下载 (在 ~/.vim/bundle
目录下)
$ git clone --recursive https://github.com/Valloric/YouCompleteMe.git
检查完整性(在 ~/.vim/bundle/YouCompleteMe
目录下)
$ git submodule update --init --recursive
0x02 下载最新版的libclang的预编译二进制文件
如果不需要C系语言的语义补全,则跳过0x02,否则继续
下载libclang的预编译二进制文件(version >= 3.9)
找个地方存放,比如我将解压之后的文件存放在~/download/ycm_tmp_clang_llvm/
目录下,其下有bin,include,lib,libexec,share文件夹。
0x03 编译安装ycm_core库
安装编译YCM core库所需要的依赖
# python的开发包
sudo