0%

关于 python 语言的学习,参见 c++ 开发人员学习 python 的记录

上述笔记缺少了 Python 环境和包管理方面的内容,在这里补充。

在 Linux 环境下,系统可能自带某个版本的 Python;而 Windows 系统一般没有。

无论哪种平台,一般不会更新升级/直接安装 Python 使用。而是,借用虚拟环境管理工具管理 Python 的版本。

每个环境可以使用不同版本的 Python ,安装不同版本的依赖包。

conda

conda 是一个开源的包管理系统 + 环境管理系统。

作为包管理系统,conda 和 Python 官方的 pip 各有侧重:

  • conda 更适合需要管理复杂依赖关系和创建隔离环境的数据科学和机器学习项目;

  • pip 更适合管理纯 Python 包,并且在 Python 开发社区中被广泛使用。

避免在同一个环境中混用 conda 和 pip,以防止潜在的冲突。

conda 在环境管理方面非常强大,是不二之选。

阅读全文 »

如何改进上网环境?如何在监控环境下相对舒适地“搬砖”,如何利用虚拟机?

整体方案很简单,将认证工具、监控工具放在虚拟机 Ubuntu 中,网络选择桥接模式,直连园区无线网完成帐号认证工作;新增网卡将网络分享给其他虚拟机。

2021年11月22日更新,Ubuntu 虚拟机已删除 。

知易行难,具体实现过程中,因为缺乏网络相关的知识体系(尤其是路由配置等)花了较多时间,绕了很多弯。

查看 IP 地址

在终端中查看 IP 地址的命令:ip a,在 Debian 10 或 Ubuntu 20 版本中已经没有 ifconfig 命令、iptables 命令。

更多请参考 如何在 Ubuntu 中检查你的 IP 地址

配置生效

最初每次更改之后都是重启系统,保证配置生效。网络不通的原因可能很多,也弄不明白,按照网上的教程操作之后还是失败就难免怀疑配置是否生效。

重启系统很笨重,但又不清楚针对网络配置的刷新(或重启)命令,后来发现图形界面网络配置项是提供了开关按钮的:重启(开关一次)网络配置生效。

阅读全文 »

国标阅读笔记

  • MANSCDP 协议(监控报警联网系统控制描述协议,Monitoringand Alarming Network System Control Description Protocol),在 GB/T 28181-2016 的附录 A 描述
  • MANSRTSP 协议(监控报警联网系统实时流协议,Monitoring and Alarming Network System Real-Time Streaming Protocol),在 GB/T 28181-2016 的附录 B 描述

XML 数据类型

XML Schema 简介

SVAC 音视频编解码协议

《SVAC 安全防范监控数字视音频编解码技术标准》(简称 SVAC,Surveillance Video and Audio Coding)。其国标号是 GB/T 25724-2017,于 2010 年提出 SVAC1.0 标准,2017 年升级为 SVAC2.0 版本,现行标准为 SVAC2.0 标准。

GB28121 中使用的 2010 年的 v1.0 版本 SVAC。

阅读全文 »

音视频领域、流媒体领域涉及的协议,逐步了解。

GB/T 28181-202n 笔记

9.1.1 注册和注销 f) 提到了 NAT 穿透的细节

9.2.2.1 中三方呼叫的概念?

MESSAGE 消息头 Content-type 头域为 Content-type: Application/MANSCDP+xml;

9.8 历史音视频的回放,提到 媒体回放控制命令引用 MANSRTSP 协议

实时音视频点播 & 历史音视频回放,是将所有的历史音视频都存下来了吗?

SIP 协议

SIP 会话发起协议(Session Initiation Protocol,缩写SIP),GB28181-2016 中称为“会话初始协议”

SIP 与许多其它的协议协同工作,仅仅涉及通信会话的信令部分(control message)。SIP 报文内容发送会话描述协议(SDP),SDP 协议描述了会话所使用流媒体细节,如:使用哪个 IP 端口,采用哪种编解码器等等。SIP 的一个典型用途是:SIP “会话”传输一些简单的经过报文的实时传输协议流。RTP 本身才是语音或视频的载体。

阅读全文 »

关键任务:open-webrtc-toolkits

目标:

  1. 搭建环境,能够简单使用上述工具包:客户端 windows sdk 或 js,部署服务端
  2. 既然是 Intel 推出,是否支持低成本的 x86 架构,其他架构呢?跨平台特性?
  3. 过程中是否需要很多知识点或者工具链,是影响任务进度的关键

8/19/21 周五,工作计划:

  1. 了解 JavaScript 的语法,编写 demo
  2. 执行 OWT 的代码实验室的 js client。失败,案例描述和仓库代码不一致,本地服务器能够访问,但按钮功能异常。
阅读全文 »

记录编写 C++ 代码过程中的疑惑、避坑的技巧等

深入理解 C++

模板遇上 DLL 导出

模板是为了共用代码,使用模板时首先要完成实例化,而实例化要求看到模板的完整定义才可以。所以,如果给用户使用暴露模板,就要暴露模板的实现细节。

DLL 是为了隐藏实现,只给用户暴露使用的接口,其中的具体实现用户是看不到的,也不需要关心。DLL 包装起来的是类的定义,而不是模板。所以,不存在“导出模板”,如果暴露模板定义给用户,那么用户是应当看到模板所有细节的,直接使用模板实例化(类或者函数)来用即可。

如果不想暴露具体的实现,只能先实例化成具体的类或函数,然后将类或者函数导出。

阅读全文 »

这里不讲条件变量 std::conditional_varibale 的具体使用,自行上 cppreference 网站查阅手册。

条件变量

std::condition_variable 类型描述

在 pthread 中条件变量的惯用手法是将 wait 放在 while 循环中。在 C++11 之后,常见的书写形式为

1
2
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return ready;});

其完全等价于循环方式,而将 wait 放到循环中,主要是因为虚假唤醒的存在。

此重载可用于在等待特定条件成为 true 时忽略虚假唤醒。

初次之外,还有 wait_forwait_util

阅读全文 »

1
2
3
4
5
// OK
for (auto itor = _functionCode.cbegin(); itor != _functionCode.cend(); ++itor)
// ERR
for (auto const itor = _functionCode.cbegin(); itor != _functionCode.cend(); ++itor)
// why?

auto 能够自动推导常量吗?引用呢?——不能!

auto 一般会忽略掉顶层 const,如果希望推导出的 auto 类型是一个顶层 const,需要明确指出。P66

可以将引用的类型设为 auto,此时原来的初始化规则仍然使用。设置一个类型为 auto 的引用时,初始值中的顶层常量属性仍然保留。P66

const_iterator 可以读取元素,但不能修改元素的迭代器类型

阅读全文 »

using 指示,第 703 页,两种使用场景:

  • using declaration 声明 using std::cout;
  • using directive 指示 using namespace std;

using 指示(using directive)和 using 声明类似的地方是,我们可以使用命名空间名字的简写形式;和 using 声明不同的地方是,我们无法控制哪些名字是可见的,因为所有名字都是可见的。

后者不能用在类作用域中;前者虽然能用在类作用域中但只能指向基类成员。更多知识请进一步学习《C++ Primer》

75 页明确提到头文件中不应使用 using 声明:

位于头文件的代码一般来说不应该使用 using 声明。这是因为头文件的内容会拷贝到引用它的文件中去,如果头文件有某个 using 声明,那么每个使用了该头文件的文件就都会有这个声明。对应某些程序来说,由于不经意间包含了一些名字,反而可能产生始料未及的名字冲突

702 页提到使用 using 指示也可能造成名字冲突问题:

如果我们提供了一个对 std 等命名空间的 using 指示而未做任何特殊控制的话,将重新引入由于使用了多个库而造成的名字冲突问题。

在源文件中使用 using 指示是否能够接受呢?能够节省大量的重复代码,注意规避名字冲突即可——除非源文件引入了较多的三方库,名字冲突并不常见。