Git Product home page Git Product logo

note's Introduction

Hi there

Yunbin Liu's github stats

note's People

Contributors

liuyunbin avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

yuyfbj

note's Issues

包管理器和源码编译的优缺点

包管理器

优点:

  1. 安装,卸载 或 升级方便
  2. 不容易对系统造成污染(可能性极小)
  3. 不需要处理复杂的依赖关系

缺点:

  1. 需要有管理员权限
  2. 安装的版本可能比较旧
  3. 不能指定编译参数

源码编译到系统目录

优点:

  1. 可以安装指定的版本
  2. 可以指定编译参数

缺点:

  1. 需要理员权限
  2. 可能需要处理复杂的依赖关系
  3. 可能会对系统造成污染
  4. 安装,卸载 或 升级比较麻烦

源码编译到用户目录

优点:

  1. 可以安装指定的版本
  2. 可以指定编译参数
  3. 不会对系统造成污染
  4. 不需要管理员权限(需要管理员提供编译工具)

缺点:

  1. 可能需要处理复杂的依赖关系
  2. 安装,卸载 或 升级比较麻烦

个人建议:

  1. 如果没有管理员权限,只能选择源码编译到用户目录
  2. 如果有管理员权限,优先选择包管理器,而后选择编译安装到用户目录,尽量不要编译安装到系统目录

Vim 入门教程

简介

Vim 是 Linux 下的一个编辑器

测试环境

  • Ubuntu 18.04 LTS

安装

sudo apt install vim

配置文件 .vimrc

设置显示行号

set number

设置 Tab 所占的宽度

set tabstop=2

设置自动缩进的宽度

set shiftwidth=2

将 Tab 扩展成空格

set expandtab

使用 C 风格的自动缩进

set cindent

EditorConfig 入门教程

简介

EditorConfig 用于在不同的编辑器和 IDE 中保持相同的配置

使用

打开文件时,将依次查找当前目录以及各个父目录中的配置文件 .editorconfig,
直到在配置文件中找到配置选项:root = true

注意:配置选项由顶层目录到当前目录的顺序查找,相同的配置将被覆盖

配置规则

  • * 匹配任意字符( / 除外)
  • ** 匹配任意字符
  • ? 匹配任意单个字符
  • [name] 匹配在 name 中的任意单个字符
  • [!name] 匹配不在 name中 的任意单个字符
  • {s1, s2, s3} 匹配给定的字符串中的任意一个
  • {num1..mum2} 匹配在范围 [num1, num2] 中的任意数字

常见配置选项

标明顶层配置

root = true;

设置要匹配的文件

[]

配置行结束符

end_of_line = cr
end_of_line = lf
end_of_line = crlf

配置编码格式

charset = utf-8

配置是否移除行末的空白字符

trim_trailing_whitespace = true
trim_trailing_whitespace = false

配置文件是否以空行结束

insert_final_newline = true
insert_final_newline = false

配置缩进使用 Tab(hard tabs)还是空格(soft tabs)

indent_style = tab
indent_style = space

设置使用空格缩进时的缩进大小

indent_size = 2

设置使用 Tab 缩进时的缩进大小,默认值为 indent_size

tab_width = 2

参考资源

CMake 入门教程

简介

CMake 是一个构建工程的工具

测试环境

  • Ubuntu 18.04 LTS
  • CMake 3.10.2

安装

$ sudo apt install cmake

使用

1. 在指定目录下写 CMakeLists.txt,文件名区分大小写

2. 创建并切换到构建目录

$ mkdir -p build
$ cd build

3. 设置安装前缀,生成 Makefile

$ cmake -DCMAKE_INSTALL_PREFIX=/usr  ..

4. 编译

$ make

5. 测试(可选)

$ make test

6. 安装(可选)

$ make install

说明:内部编译会导致文件结构混乱,因此这里使用外部构建

CMake 常用命令

CMake 命令不区分大小写,以下说明均用小写字母说明

指定 CMake 的最小版本

cmake_minimum_required(VERSION min-version)

指定项目名称

project(project-name)

向用户输出提示信息

message(STATUS "message to display")

向用户输出错误信息,构建直接停止

message(FATAL_ERROR "message to display")

添加子目录

add_subdirectory(source-dir)

添加头文件的搜索目录

include_directories(include-dir)

添加动态库的搜索目录

link_directories(library-dir)

构建二进制文件

add_executable(executable-name source.cc)

对文件添加需要链接的库文件

target_link_libraries(executable-name library-name)

设置二进制文件的输出目录

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

构建动态库

add_library(library-name SHARED source.cc)

设置动态库的输出目录

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

设置动态库的版本

set_target_properties(
    library-name-shared
    PROPERTIES
        VERSION 1.2  # 设置动态库的版本
        SOVERSION 1) # 设置 API 版本

构建静态库

add_library(library-name STATIC source.cc)

设置静态库的输出目录

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

同时构建动态库和静态库

add_library(library-name-shared SHARED source.cc)
add_library(library-name-static STATIC source.cc)

set_target_properties(
    library-name-shared
    PROPERTIES
        OUTPUT_NAME library-name)  # 设置库文件的输出名字

set_target_properties(
    library-name-static
    PROPERTIES 
        OUTPUT_NAME library-name) # 设置库文件的输出名字

设对象的属性

set_target_properties(
    target  # 对象名称 
    PROPERTIES
        OUTPUT_NAME huge_number  # 设置输出名称
        OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/huge-number  # 设置输出目录
        VERSION 1.2  # 设置动态库的版本
        SOVERSION 1  # 设置 API 版本
    )

通过通配符,将指定文件存入变量

file(GLOB HEADERS "*.h")  # 非递归
file(GLOB_RECURSE HEADERS "*.h")  # 递归

设置需要安装的文件

install(TARGETS executable-name library-name-shared library-name-static
    RUNTIME DESTINATION bin  # 设置二进制文件的安装目录
    LIBRARY DESTINATION lib  # 设置动态库的安装目录
    ARCHIVE DESTINATION lib) # 设置静态库的安装目录

install(FILES hearder-name.h 
    DESTINATION include) # 设置普通文件的安装目录

激活测试命令

enable_testing()

添加测试程序

add_test(test-name executable-name arg)

设置变量的值

如果有多个值,将以分号分割,例如:如果设置 set(var a b c)${var} 的值将为:"a;b;c"

set(variable-name value)

添加用户的 make doc 命令

add_custom_target(doc COMMAND doxygen doc/Doxyfile 
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

CMake 常用变量

CMake 变量区分大小写

项目名称

CMAKE_PROJECT_NAME

项目的源目录

CMKAE_SOURCE_DIR

项目的构建目录

CMKAE_BINARY_DIR

安装目录前缀

CMAKE_INSTALL_PREFIX 

C++ 编译选项

CMAKE_CXX_FLAGS

CMake 常用控制指令

判断变量是否定义

if(val)
   command()
endif(val)

判断变量是否未定义

if(not val)
   command()
endif(not val)

参考资源

ClangFormat 入门教程

简介

  • ClangFormat 是一个规范代码的工具
  • ClangFormat 支持的语言有:C/C++/Java/JavaScript/Objective-C/Protobuf/C#
  • ClangFormat 支持的规范有:LLVM,Google,Chromium,Mozilla 和 WebKit

测试环境

  • Ubuntu 18.04 LTS
  • clang-format-6.0

安装

$ sudo apt install clang-format

使用

作为单独的命令使用

预览规范后的代码

$ clang-format main.cc

直接在原文件上规范代码

$ clang-format -i main.cc

显示指明代码规范,默认为 LLVM

$ clang-format -style=Google main.cc

将代码规范配置信息写入文件 .clang-format

$ clang-format --dump-config -style=Google > .clang-format

使用自定义代码规范

规范位于当前目录或任一父目录的文件 .clang-format 或 _clang-format 中(如果未找到文件,使用默认代码规范)

$ clang-format -style=file main.cc

在 Vim 中使用

1. 查找文件 clang-format.py 所在的目录

$ dpkg -L clang-format | grep clang-format.py

2. 在 .vimrc 中加入以下内容

function! Formatonsave()
  let l:formatdiff = 1
  py3f <path-to-this-file>/clang-format.py
endfunction
autocmd BufWritePre *.h,*.cc,*.cpp call Formatonsave()

说明:

  1. 上述的内容表示:当使用 Vim 保存文件时,会按照当前目录 或 任一父目录的文件 .clang-format 或 _clang-format 指定的规范来规范代码(如果未找到文件,使用默认代码规范)
  2. 上述 <path-to-this-file> 指的是 clang-format.py 的目录
  3. let l:formatdiff = 1 的意思是只规范修改过的部分,可以用 let l:lines = "all" 取代,表示规范所有的内容
  4. 在 Ubuntu 18.04 LTS 下,clang-format 的默认版本为 clang-format-6.0,clang-format-6.0 的 clang-format.py 使用的是 Python 3,而 Ubuntu 18.04 LTS 默认的 Python 版本为 Python 2.7,所以上面使用的是 py3f 而不是 pyf

参考资源

Git 入门教程

简介

Git 是一个分布式版本管理的工具

测试环境

  • Ubuntu 18.04 LTS
  • Git 2.17.1

安装

$ sudo apt install git

配置

配置用户名

$ git config --global user.name liuyunbin

配置邮箱

$ git config --global user.email [email protected]

配置默认编辑器

$ git config --global core.editor vim

检查配置信息

$ git config --list

生成密钥

$ ssh-keygen -t rsa -b 4096 -C [email protected]

复制公钥到 GitHub

将文件 ~/.ssh/id_rsa.pub 里的公钥添加到:https://github.com/settings/keys

使用

三个工作区域:

  1. Git 仓库
  2. 暂存区域
  3. 工作目录

文件和目录的分类:

  1. 未跟踪的(untracked),位于工作目录
  2. 已暂存的(staged),属于暂存区域,位于 Git 仓库目录
  3. 已提交的(committed),位于 Git 仓库目录
  4. 已修改的(modified),位于工作目录
  5. 已忽略的文件或目录,位于工作目录

忽略文件或目录

在文件 .gitignore 中添加要忽略的文件或目录,规则如下:

  1. 空行或以 # 开头的行将被忽略
  2. / 开头防止递归
  3. / 结尾表示目录
  4. ! 开头,表示不忽略文件或目录
  5. * 匹配任意字符(不包括 /
  6. ** 匹配任意字符
  7. [abc] 表示匹配方括号内的任意单个字符
  8. [0-9] 表示匹配范围 [0, 9] 内的任意单个个字符
  9. ? 匹配任意单个字符

Git 常用命令

注意:以下说明中均不包含被忽略的文件和目录

初始化仓库

$ git init

克隆仓库

$ git clone [email protected]:liuyunbin/liuyunbin-toys

添加内容到下一次提交当中

未跟踪状态 ----> 已暂存状态 或 已修改状态 ----> 已暂存状态

$ git add README

提交

$ git commit -m "message"

跳过使用暂存区域,直接提交

$ git commit -a -m "message"

修改提交信息,或增加提交的文件或目录

$ git commit --amend

列出处于未跟踪 或 已修改 或 已暂存的文件的状态

$ git status

查看工作目录中已修改的文件和暂存区域内的文件的差异

$ git diff

查看暂存区域内下一次要提交的内容

查看暂存区域内的文件和 Git 仓库内的文件的差异

$ git diff --staged

从暂存区域内移除文件或目录,同时在工作目录中删除

$ git rm README

仅仅从暂存区域内移除文件或目录,工作目录中的文件保留

$ git rm --cached README

移动文件或目录

$ git mv file_from file_to

查看提交历史

$ git log

取消暂存的文件

已暂存状态 ----> 已修改状态

$  git reset HEAD README

撤销对文件的修改

已修改状态 ----> 已提交状态

$  git checkout -- README

查看远程仓库

$ git remote -v

添加远程仓库

$ git remote add <shortname> <url>

从远程仓库获取数据

$ git fetch [remote-name]

推送数据到远程仓库

$ git push origin master

查看某个远程仓库的详细信息

$ git remote show origin

重命名远程仓库

$ git remote rename pb paul

删除远程仓库

$ git remote rm paul

列出标签

$ git tag

列出所有的分支

$ git branch

新建分支

$ git branch test-branch

切换分支

$ git checkout test-branch

新建并切换分支

$ git checkout -b test-branch

新建并切换到独立分支

$ git checkout --orphan test-branch

合并分支

$ git merge test-branch

删除分支

$ git branch -d test-branch

查看远程分支

$ git branch -r
$ git ls-remote (remote) 

拉取并合并数据

$ git pull 

删除远程分支

$  git push origin --delete serverfix

变基

将 server-branch 分支变基到 master 分支

$  $ git rebase master server-branch

参考资源

  1. https://help.github.com/en/articles/set-up-git
  2. https://git-scm.com/book/zh/v2

程序的错误处理

错误的种类

第一类:语法错误

例如:括号不匹配,多或少分号,等等。
对于此类错误,慢慢调试吧。

第二类:程序可以直接处理的错误

对于此类错误,直接有约定的处理方式。
例如:程序需要从配置文件读入配置信息,如果配置文件不存在,直接使用默认配置,等等。

第三类:程序无法处理的错误

具体可分为:

  • 调用者的错误,例如:指针参数为空,索引超出范围,矩阵不匹配,等等
  • 内存错误,例如:new 返回 nullptr,等等
  • 其它函数错误等等

对于此类错误:

  • 如果是自己使用 或者 自己团队使用,直接退出即可
  • 如果是封装成库让别人使用,应该抛出异常 或 返回错误代码,让用户自己看情况处理

对于调用者的错误,有时,出于效率等的考虑,也可以不处理此类情况,例如:strcpy() 等等

异常 和 错误代码的优缺点

异常:

优点

  • 异常可以自动向上层栈传递
  • 除非手动忽略,否则,必须处理所有异常
  • 异常不会占据参数 或 返回值
  • 异常可以携带更多的信息
  • 可以在构造函数中抛出异常
  • 可以使用面向对象构建自己的异常体系
  • 异常类型是强类型的,int 不会匹到 double
  • 不发生异常时,额外的时间开销几乎为零

缺点

  • 会有一些空间开销

错误代码

优点:

  • 没有额外的时间 和 空间开销

缺点:

  • 必须手动检测函数是否出错,如果漏掉某一个,可能导致程序带错误运行
  • 检测每一个出错的函数很麻烦
  • 错误代码会占据函数的返回值,而有的函数的返回值有约定,比如,赋值运算符
  • 错误代码,只能说明,函数出错,不能说明是出了什么错误
  • 无法处理构造函数的错误

所以: 个人建议,使用异常而不是错误代码

参考资源

google-glog 入门教程

简介

google-glog 是 Google 的一个开源的日志库

测试环境

  • Ubuntu 18.04 LTS
  • google-glog 0.3.5
  • google-gflags 2.2.1

安装

$ sudo apt install libgflags-dev
$ sudo apt install libgoogle-glog-dev

使用

1. 添加需要的头文件

#include <glog/logging.h>

2. 设置使用文档(可选)

google::SetUsageMessage("How to use");

3. 设置版本(可选)

google::SetVersionString("1.0.0");

4. 配置 LOG(见下文)(可选)

5. 解析命令行(可选)

google::ParseCommandLineFlags(&argc, &argv, true);

6. 初始化 google-glog

google::InitGoogleLogging(argv[0]);

7. 使用 LOG(见下文)

8. 编译,链接动态库

$ g++ main.cc -lgflags -glog

配置 LOG

google-glog 日志分四类:INFO,WARNING,ERROR 和 FATAL。
对于 FATAL ,程序输出日志后将退出

常用配置选项如下:

设置是否输出到标准错误,默认否,即输出到文件

命令行参数配置
$ --logtostderr=1 # 1,true  和 yes(大小写均可)意思相同
$ --logtostderr=0 # 0,false 和 no (大小写均可)意思相同
程序中配置
FLAGS_logtostderr = 1; # 1 和 true  意思相同
FLAGS_logtostderr = 0; # 0 和 false 意思相同

设置将指定等级及其以上等级的日志输出到标准错误,默认为 ERROR

配置中 0 表示 INFO,1 表示 WARNING,2 表示 ERROR,3 表示 FATAL

命令行参数配置
$ --stderrthreshold=2
程序中配置
FLAGS_stderrthreshold = 2;

设置输出指定等级及其以上等级的日志,默认为 INFO

配置中 0 表示 INFO,1 表示 WARNING,2 表示 ERROR,3 表示 FATAL

命令行参数配置
$ --minloglevel=0
程序内配置
FLAGS_minloglevel = 0;

设置日志目录,默认为 /tmp

命令行参数配置
$ --log_dir=/tmp
程序内配置
FLAGS_log_dir = "/tmp";

设置 log 是否使用颜色,默认不使用

命令行参数配置
$ --colorlogtostderr=1 # 1,true  和 yes(大小写均可)意思相同
$ --colorlogtostderr=0 # 0,false 和 no (大小写均可)意思相同
函数内配置
FLAGS_colorlogtostderr = 1; # 1 和 true  意思相同
FLAGS_colorlogtostderr = 0; # 0 和 false 意思相同

使用 LOG

常用的日志宏

简单的输出日志

LOG(INFO) << "message";

按条件输出日志

LOG_IF(INFO, a > 0) << "message";

检查某个条件是否成立

CHECK(a > 0) << "message";

检测两个值是否相等

CHECK_EQ(a, b) << "message";

检测两个值是否不相等

CHECK_NE(a, b) << "message";

检测是否为空指针,将返回该指针

CHECK_NOTNULL(p);

打印系统错误

PLOG();
PLOG_IF();
PCHECK();

参考资源

Doxygen 入门教程

简介

  • Doxygen 是一个将文件的特定注释转化为文档的工具
  • Doxygen 默认支持的语言有:
    C,C++,C#,Objective-C,IDL,Java,VHDL,PHP,Python,Tcl,Fortran 和 D

测试环境

  • Ubuntu 18.04 LTS
  • Doxygen 1.8.13
  • C++

安装

$ sudo apt install graphviz
$ sudo apt install doxygen

使用

1. 生成配置文件

默认配置文件名为:Doxyfile

$ doxygen -g <config-file>

或(不含注释)

$ doxygen -s -g <config-file>

2. 修改配置文件(见下文)

3. 给代码添加注释(见下文)

4. 生成文档

$ doxygen <config-file>

修改配置文件

常用配置选项如下:

设置项目的编码,默认为 UTF-8

DOXYFILE_ENCODING = UTF-8

设置项目的名称

PROJECT_NAME = "project-name"

设置项目的版本号

PROJECT_NUMBER = "1.0.0"

设置项目的描述

PROJECT_BRIEF = "这是项目描述"

设置项目的 logo

PROJECT_LOGO = ""

设置需要处理的输入目录,如果未设置,则在当前目录查找

INPUT = src

设置需要匹配的输入文件

FILE_PATTERNS = *.cc *.h

设置不需要处理的输入目录

EXCLUDE =

设置不需要匹配的输入文件

EXCLUDE_PATTERNS =

设置输入编码,默认为 UTF-8

INPUT_ENCODING = UTF-8

设置是否递归搜索输入目录,默认为 NO

RECURSIVE = NO

设置是否提取所有类,函数等(不包括类的私有成员和静态成员),默认为 NO

EXTRACT_ALL = NO

设置是否提取类的私有成员,默认为 NO

EXTRACT_PRIVATE = NO

设置是否提取类的静态成员,默认为 NO

EXTRACT_STATIC = NO

设置文档是否包含源文件,默认为 NO

SOURCE_BROWSER = NO

设置是否对每个类都链接其所在的头文件中,默认值为 YES

VERBATIM_HEADERS = YES

设置文档的输出目录,如果未设置,输出到当前目录

OUTPUT_DIRECTORY = doc

设置是否支持 Markdown,默认值为 YES

MARKDOWN_SUPPORT = YES

设置文档的主界面

USE_MDFILE_AS_MAINPAGE = README.md

设置文档的语言,默认为 English

OUTPUT_LANGUAGE = Chinese         

其它配置选项见:http://www.doxygen.nl/manual/config.html

给代码添加注释

常用的注释风格有:

在全局作用域,类前 或 函数前 注释

/**     注释的内容       */
/*!     注释的内容       */
///     注释的内容
//!     注释的内容

在文件成员,类成员,结构体成员,共同体成员,枚举成员 或 函数参数 后注释

int a; /**<      注释的内容        */
int a; /*!<      注释的内容        */
int a; ///<      注释的内容        */
int a; //!<      注释的内容        */

其它注释风格见:http://doxygen.nl/manual/docblocks.html

常用的注释标记如下(标记以 / 或 @ 开头表示):

添加简单描述

@brief 简要描述

添加详细描述

@details 详细描述

添加类信息

@class 类名 类所在的文件 类所在的文件(可包括路径) 

添加结构体信息

@struct 结构体名 结构体所在的文件 结构体所在的文件(可包括路径)

添加参数说明

@param [in]  输入参数名 说明
@param [out] 输出参数名 说明

添加返回说明

@return 返回说明

添加返回特定值说明

@retval 特定值 特定返回值说明

添加异常说明

@exception 异常类型 异常说明

添加代码

@code
...代码...
@encode

添加参考

@see 参考其它

添加过时说明

@deprecated 过时说明

添加 bug 说明

@bug "bug 说明"

添加例子

@example 例子文件名

添加警告信息

@warning 警告信息

添加开始使用的版本

@since 版本

添加注意事项

@note 注意事项

添加作者声明

@author liuyunbin

添加版权声明

@copyright GPL-3.0

其它标记选项见:http://www.doxygen.nl/manual/commands.html

参考资源

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.