0%

C++风格规范(Google版)

头文件

Self-contained头文件

所有头文件要能够自给自足。即:用户和重工具不需要为特别场合而包含额外的头文件。

#defined保护

所有头文件都应该使用#define来防止头文件被多重包含,命名格式是<PROJECT>_<PATH>_<FILE>_H
为保证唯一性,头文件的命名应该基于所在项目源代码树的全路径。

前置声明

尽可能地避免使用前置声明。使用#include包含需要的头文件即可。

定义

所谓前置声明(forward declaration)是类、函数和模板的纯粹声明,没伴随着其定义。

优点:
  • 前置声明能够节省编译时间,多余的#include会迫使编译器展开更多的文件,处理更多的输入。
  • 前置声明能够节省不必要的重新编译的时间。#inclue使代码因头文件中无关的改动而被重新编译多次。
缺点:
  • 前置声明隐依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。
  • 前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其API。
  • 前置声明来自命名空间std::的symbol时,其行为未定义。
  • 很难判断什么时候该用前置声明,什么时候该用#include。极端情况下,用前置声明代替inclues甚至都会暗暗地改变代码的含义。
  • 前置声明不少来自头文件的symbol时,就会比单单一行的include冗长。
  • 仅仅为了前置声明而重构代码,会使代码变得更慢更复杂。
结论:
  • 尽量避免前置声明那些定义在其他项目中的实体。
  • 函数:总是使用#include
  • 类模板:优先使用#include
Read more »

Python风格指南(Google版)

Python 是 Google主要的脚本语言。这本风格指南主要包含的是针对python的编程准则。使得Python代码编写更加规范、优美。

Python语言规范

Lint

对你的代码允许pylint

定义:

pylint是一个在Python源代码中查找bug的工具。对于C和C++这样的不那么动态的语言,这些bug通常由编译器来捕获。由于Python的动态特性,有些警告可能不对。不过伪告警应该很少。

优点:

可以捕获容易忽视的错误,例如输入错误、使用未赋值的变量等。

缺点:

pylint并不不完美。要利用其优势,我们有时侯需要:

  • 围绕着它来写代码
  • 抑制其告警
  • 改进它
  • 忽略它
结论:

确保对你的代码运行pylint。抑制不准确的警告,以便能够将其他警告暴露出来。

你可以通过设置一个行注释来抑制告警。

1
dict = 'something awful'  # Bad Idea... pylint: disable=redefined-builtin

pylint警告是以一个数字编号(如C0112)和一个符号名(如empty-docstring)来标识的。在编写新代码或更新已有代码时对告警进行抑制,推荐使用符号名来标识。

如果警告的符号名不够见名知意,那么请对其增加一个详细解释。

采用这种抑制方式的好处是我们可以轻松查找抑制并回顾它们。

你可以使用命令pylint --list-msgs来获取pylint告警列表. 你可以使用命令pylint --help-msg=C6409,以获取关于特定消息的更多信息。

相比较于之前使用的pylint: disable-msg,本文推荐使用pylint: disable

要抑制”参数未使用”告警,你可以用”_”作为参数标识符, 或者在参数名前加”unused_”。遇到不能改变参数名的情况,你可以通过在函数开头”提到”它们来消除告警。例如

1
2
3
def foo(a, unused_b, unused_c, d=None, e=None):
_ = d, e
return a
Read more »

基本数据结构

目标

  • 理解抽象数据类型的栈,队列,deque 和列表。
  • 能够使用 Python 列表实现 ADT 堆栈,队列和 deque。
  • 了解基本线性数据结构实现的性能。
  • 了解前缀,中缀和后缀表达式格式。
  • 使用栈来实现后缀表达式。
  • 使用栈将表达式从中缀转换为后缀。
  • 使用队列进行基本时序仿真。
  • 能够识别问题中栈,队列和 deques 数据结构的适当使用。
  • 能够使用节点和引用将抽象数据类型列表实现为链表。
  • 能够比较我们的链表实现与 Python 的列表实现的性能。
    Read more »

owt-server源码编译和部署

是什么

OWT的媒体服务器提供了一种高效的基于WebRTC的视频会议和流媒体服务。它将单个WebRTC流扩展到多个端点。同时,它为媒体流提供了媒体分析功能。它的特点:

  • 分布式、可扩展、可靠的SFU+MCU服务器
  • Intel®Core™和Intel®Xeon®处理器上的高性能VP8、VP9、H.264和HEVC实时转码
  • 广泛的流协议支持包括WebRTC, RTSP, RTMP, HLS, MPEG-DASH
  • 高效混合高清视频流,节省移动设备的带宽和电源
  • 智能服务质量(QoS)控制机制,以适应不同的网络环境
  • 客户定义的媒体分析插件,以执行分析流从MCU
  • 实时媒体流分析的使用场景,包括但不限于移动/对象检测

安装

环境部署

1
apt-get install sudo wget curl git make gcc-6 g++-6 libglib2.0-dev pkg-config libboost1.67-dev liblog4cxx-dev gyp libx11-dev libkrb5-dev intel-gpu-tools m4 autoconf libtool automake cmake libfreetype6-dev libgstreamer-plugins-base1.0-dev lsb-core net-tools

node安装

1
2
3
4
5
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
nvm use v8.15.0
node -v
npm i --unsafe-perm
npm --unsafe-perm=true --user=0 i
Read more »

Clickhouse性能优化

视图

ClickHouse中分为:普通视图和物化视图

  1. 普通视图: 不会存储数据,只保存了一个query,一般用作子查询,当base表删除后不可用
  2. 物化视图: 存储执行query后得到的数据,创建视图时必须制定engine

物化视图

通常物化视图,会做两个层面的物化视图,一个是维度层面的物化,一个是时序层面的物化。

什么是物化视图,假设一个数据源的原始维度有十个列,通过分析查询请求发现,group1 中的三个维度和 group2 中的三个维度分别经常同时出现,剩余的四个维度可能查询频率很低。更加严重的是,没有被查询的维度列里面有一个是高基维,就是 count district 值很大的维度,比如说像 User id 这种。这种情况下会存在很大的查询性能问题,因为高基维度会影响 Druid 的数据预聚合效果,聚合效果差就会导致索引文件 Size 变大,进而导致查询时的读 IO 变大,整体查询性能变差。针对这种 case 的优化,我们会将 group1 和 group2 这种维度分别建一个预聚合索引,然后当收到新的查询请求,系统会先分析请求里要查询维度集合,如果要查询的维度集合是刚才新建的专用的索引维度集合的一个子集,则直接访问刚才新建的索引就可以,不需要去访问原始的聚合索引,查询的性能会有一个比较明显的改善,这就是物化视图的一个设计思路,也是一个典型的用空间换时间的方案。

Read more »

二叉搜索树的最近公共祖先

题目说明

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

Read more »

二叉树的最近公共祖先

题目说明

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

Read more »

Clickhouse集群搭建

简介

Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS)。
传统数据库在数据大小比较小,索引大小适合内存,数据缓存命中率足够高的情形下能正常提供服务。但残酷的是,这种理想情形最终会随着业务的增长走到尽头,查询会变得越来越慢。你可能通过增加更多的内存,订购更快的磁盘等等来解决问题(纵向扩展),但这只是拖延解决本质问题。如果你的需求是解决怎样快速查询出结果,那么ClickHouse也许可以解决你的问题。

ClickHouse作为分析型数据库,有三大特点:一是跑分快,二是功能多,三是文艺范

应用场景:

  1. 绝大多数请求都是用于读访问的
  2. 数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作
  3. 数据只是添加到数据库,没有必要修改
  4. 读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
  5. 表很“宽”,即表中包含大量的列
  6. 查询频率相对较低(通常每台服务器每秒查询数百次或更少)
  7. 对于简单查询,允许大约50毫秒的延迟
  8. 列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
  9. 在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)
  10. 不需要事务
  11. 数据一致性要求较低
  12. 每次查询中只会查询一个大表。除了一个大表,其余都是小表
  13. 查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小

本身的限制:

  1. 不支持真正的删除/更新支持 不支持事务(期待后续版本支持)
  2. 不支持二级索引
  3. 有限的SQL支持,join实现与众不同
  4. 不支持窗口功能
  5. 元数据管理需要人工干预维护
    Read more »

Accumulo集群搭建

开始安装

1
2
3
wget http://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/1.9.3/accumulo-1.9.3-bin.tar.gz
tar -zxvf accumulo-1.9.3-bin.tar.gz
cd accumulo-1.9.3

验证是否满足安装需求: ./bin/build_native_library.sh
yum install gcc-c++
注意: 需要首先安装Hadoop和Zookeeper,具体安装请查看本人文章CentOS下安装Hadoop集群

配置

  1. 初始化配置文件
    1
    ./bin/bootstrap_config.sh
    出现以下配置设置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Choose the heap configuration:
    1) 1GB
    2) 2GB
    3) 3GB
    4) 512MB
    #? 3
    Using '3GB' configuration

    Choose the Accumulo memory-map type:
    1) Java
    2) Native
    #? 1
    Using 'jvm' configuration


    Choose the Apache Hadoop version:
    1) Hadoop 2
    2) HDP 2.0/2.1
    3) HDP 2.2
    4) IOP 4.1
    5) Hadoop 3
    #? 1
    Using Hadoop version '2' configuration

    Setup complete
  2. 修改accumulo-site.xml文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vi conf/accumulo-site.xml

    <property>
    <name>instance.volumes</name>
    <value>hdfs://0.0.0.0:9000/accumulo</value>
    <description>comma separated list of URIs for volumes. example: hdfs://localhost:9000/accumulo</description>
    </property>

    <property>
    <name>instance.zookeeper.host</name>
    <value>0.0.0.0:2181</value>
    <description>comma separated list of zookeeper servers</description>
    </property>
  3. 修改accumulo-env.sh文件
    设置ZOOKEEPER_HOMEHADOOP_PREFIX,亦可在/etc/profile中,
    1
    2
    3
    4
    5
    export HADOOP_PREFIX=/data/hadoop
    export HADOOP_HOME=$HADOOP_PREFIX
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    export HADOOP_SSH_OPTS="-p 36000"
    export ZOOKEEPER_HOME=/data/zookeeper-3.4.14

    初始化

    1
    ./bin/accumulo init
    此时设置你的实例名root密码

    设置多个节点

    Read more »