关于断言的使用
断言主要用于检测传入参数是否合法。如果参数不合法则会报错并退出程序,因而只能用于测试开发阶段。
原则断言的使用和参数的检测一样,在保证合理运行的基础上,参数的限制越少越好。
使用场景FIXME 中使用 在使用 FIXME 的地方检测你需要关注的参数,如果没有要验证的参数,则可以不写。
示例代码摘抄自ffmpeg4.2.2的 libavcodec/encode.c 中的ff_alloc_packet2():
12345678if (avctx && 2*min_size < size) { // FIXME The factor needs to be finetuned av_assert0(!avpkt->data || avpkt->data != avctx->internal->byte_buffer); if (!avpkt->data || avpkt->size < size) { av_fast_padded_malloc(&a ...
位运算的奇淫巧技
由于本人在阅读 FFmpeg 的源代码过程中,发现有很多的位运算相关内容。但是,由于本人半路出家对于这些基础知识不扎实且不成体系,因而在此记录本人遇到的和百度发现的。下方会附上原文链接。
位运算实现四则运算
乘除法:这个相对简单,就是简单的左移右移
123int a = 2;a >> 1; ---> 1a << 1; ---> 4
加减法:此方法在某些特殊值域范围内有效,目前阅读 FFmpeg 代码发现 8192 与其它值能有效保证此结构。请注意自己区分。
123int a = 1, b = 2, c = -1;a | b; ---> 3a | c; ---> 0
位运算交换两数123a ^= b;b ^= a;a ^= b;
位运算判断奇偶只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数
123if(0 == (a & 1)) { //偶数}
位操作求绝对值整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 3 ...
C语言的线程pthread
讲解 Linux 系统中的线程的使用
本文主要用于记录所学所用!
背景知识 Linux 没有真正意义上的线程,它的实现是由进程来模拟,所以属于用户级线程,位于 libpthread 共享库(所以线程的 ID 只在库中有效),遵循 POSIX 标准。
历史上,Linux 有三种线程实现。分别是 LinuxThreads,NGPT(Next Generation POSIX Threads),NPTL(Native POSIX Threads Library)。
LinuxThreads:受限于内核特性,违背了 SUSV3 Pthreads标准。
NGPT: 由 ibm 开发,曾被作为 LinuxThreads 的继任者。
NPTL: 由于性能由于 NGPT, 因而目前使用的就是 NPTL。
有关 Linux 线程进一步介绍请看Linux历史上线程的3种实现模型
Windows 下有一个真正的数据结构 TCB 来描述线程。
进程与线程的区别
进程:程序的一个动态运行实例,承担分配系统资源的实例。( Linux 实现进程的主要目的是资源独占)
线程:在进程的内部运行(进程的地 ...
C 语言中的字符串处理
本文主要讲解在 Linux平台下 string.h 库中的字符串处理函数以及其中额外带的内存操作函数。
任何语言中涉及的常规操作其中使用频率从上到下依次减小
计算字符串的长度:strlen()
比较字符串是否相等:strcmp()、strncmp()
查询一个字符在字符串中的索引位置:由于有指针的原因,直接返回对应字符位置的指针,更容易操作
分割字符串:采用偏移数组起始位置与strncpy()或memcpy()实现
查找某个字符串在字符串中出现的位置:strstr()
字符串全部变为大写或小写:
查询字符串中是否存在某个字符:strchr()、strnchr()
字符串处理函数为了提高程序在不同机器上的移植性,利用 typedef 定义新类型名,即typedef unsigned int size_t。
在 Linux 系统中 string.h 的库函数关于字符串处理的有以下函数内容。
函数
说明
char *strcat(char *restrict, const char *restrict);
把最后一个参数连接到第二个参数的后面
char *strchr( ...
C语言读写文件
主要讲解系统提供的读写文件的函数简单使用方式,以及简单的示例代码与运行结果
fgetc和fputc此函数主要用于字符的读入与写出出,一般一次读入或写出一个字符。
函数原型1234567891011121314151617// focus 重点int fgetc(FILE *stream);int getc(FILE *stream);int getchar(void);int ungetc(int c, FILE *stream);// focus 重点int fputc(int c, FILE *stream);int putc(int c, FILE *stream);int putchar(int c);
函数介绍函数描述12345678910111213fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.getc() is equivalent to fgetc() excep ...
Fork 学习
TODO
js变量的解构赋值与基本使用场景
主要讲解JS变量的解构赋值的语法,与其在开发过程中的实际使用场景。
js解构赋值数组解构赋值数组的解构遵循只要等号两边的模式相同,左边的变量就会被赋予对应的值。在使用的过程中可以使用默认值,默认值可以引用解构赋值的其他变量,但该变量必须已经声明
注意:数组的解构赋值,如果右边不是数组(不是可遍历的结构)会报错
正常的使用情况
123456789101112131415161718//完整的使用 //结果:a=1,b=2,c=3 var [a, b, c] = [1, 2, 3]; //结果:foo=1,bar=2,baz=3 let [foo, [[bar], baz]] = [1, [[2], 3]];//左边少,右边正常 //结果:c=3 var [, , c] = [1, 2, 3] //结果:a=1 var [a] = [1, 2, 3] //剩下的情况,聪明的你肯定已经明白//右边少,左边正常 //结果:a=1,b=undefined,c=undefined var [a, b, c] = [1] / ...
音视频领域认识
这个音视频领域主要集中在流媒体这一块,主要讲解视频会议、直播与点播。由于曾供职于一家传统视频会议厂商,后供职于一家互联网公司(需要做点播服务),因而对本人的经历进行总结。其中音视频领域分布很广,就我所知在这其中还有信令与编码两块主要内容,我主要关注于相对简单的信令层面。
视频会议、直播与点播的异同视频会议视频会议基本认知视频会议的本质就是要保证视频双方能够互相实时的交流沟通。
无论中间经过多少个MCU与桥接,都是为了互连互通,保证实时的交流沟通。
市场格局如题主要专注于专业视频会议这一块儿。区别与微信,qq,facebook等互联网视频互连,视频会议对于画质成像,音频音质,网络带宽,私有部署等都有着较高的要求。
这一块市场各方势力犬牙交错,有着CISCO、HUAWEI、宝利通等老牌厂商,也有诸如小鱼,VHD,腾讯视频会议,钉钉会议等新入局的硬件或软件企业。其中腾讯视频会议、钉钉会议主要解决的是传统厂商领域无法触及的公共视频服务领域,但是就本人观察而言他们与传统视频会议领域有一定的重合性。例如,在一些非重要场合有些部门仍采用公共视频服务。在疫情新新形势下,专业视频会议与公共视频服务的更是 ...
Mybatis基本使用
本文主要讲解mybatis的$与#的使用,关联查询中各个关键字的使用
动态语法的使用#{}的使用解析为一个JDBC预编译语句的参数标识符,把参数部分用占位符?代替
123select * from t_user from username = ?;#处理后,会对传入数据加''select * from t_user from username = 'Alice';
${}的使用只做简单的字符串替换,在动态SQL解析阶段将会进行变量替换
1select * from t_user where username = 'Alice';
#{}与${}对比#{}用占位符站位后,JDBC的PreparedStatement会对传入的参数进行校验,防止SQL注入。
${}替换为具体的字符串后不会再做任何检测
使用场景${}可以用于order by后的排序字段,表名,列名等。其中表名只能采用此
注:能使用#{}尽量用,如表名,order by的排序字段作为变量时使用${}
关联查询之一对多association与c ...
springcloud服务注册-eureka的使用
本文主要讲解eureka的简单使用,由于eureka的停更所以目前的学习只作为基础的了解。其中eureka的配置主要涉及pom(依赖导入)、application.yaml(配置)、代码注解这三个方面,本文主要着重在这三个方面!
Eureka服务端服务端pom的引入内容123456789101112131415<!--引入最新的eureka的server端--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><!--引入springboot的web启动程序--><dependency> <groupId>org.springframework.boot</groupId> &l ...