OpenCV(Open Source Computer Vision Library) is the world’s biggest computer vision library.
OpenCV is open source, contains over 2500 algorithms, and is operated by the non-profit Open Source Vision Foundation.

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效:由一系列C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。

阅读全文 »

信号是一种软件中断。常驻程序尤其需要注意处理这些信号,如果没有处理,同时也没有了解信号的默认动作,进程可能会莫名其妙的退出或者core。信号早已有之,但在老的操作系统中,可能会出现信号丢失。4.3BSD和SVR3之后增加了可靠信号机制,我们可以放心使用信号机制。本文根据阅读Nginx代码,参考其信号处理机制,总结了信号使用方法和注意事项。

阅读全文 »

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

阅读全文 »

我们知道一个程序可以包含多个进程,每个进程中可以创建多个线程,在线程中又可以创建成千上万甚至更多个协程。进程和线程的创建以及调度需要在内核态和用户态之间切换;而协程的创建和调度都在用户态,不需要和内核态进行交互。所以这就注定创建和维持协程运行所牺牲的性能,要远小于进程和线程。另外,协程都是以一组的形态存在于一个特定的线程内,那么对于数据的共享,不必使用互斥锁或者条件变量,来保证互斥和同步,应用程序性能上也有了很大的提升。这就是我们使用协程的原因。

协程适用于IO密集型,而不适用于计算密集型的程序。对于IO密集型程序,无论是读取socket还是硬盘,这些操作基本上都是阻塞式调用,当协程遇到阻塞时,当前协程显式或者隐式主动放弃控制权,保存当前协程的硬件上下文和栈,然后调度器切换到其他就绪的协程继续执行,而当阻塞IO完成后,调度器获得通知,恢复原来协程的硬件上下文以及栈,再切换回来运行。而对于计算密集型的程序,当前协程除非显式切换协程或者设置定时器,由定时器主动引起切换,否则通常不会主动放弃控制权,其他协程可能会一直等待调度,得不到运行。

一组协程运行在一个线程内,它们是串行运行的,而非并行,即是运行在一个CPU核上,那么协程就无法利用多核CPU资源。如果我们既想使用协程,又想利用多核CPU,一般我们就采用”多进程+协程“的方式。

目前网上有很多协程的实现例子,本文主要分析云风的协程库,来探究协程的实现原理。大家也可以直接看协程库的注释版

阅读全文 »

关于pthread条件变量

1
$ man pthread_cond_init | col -b > pthread_cond.man

得到manual中的描述:

A condition (short for ‘’condition variable’’) is a synchronization device that allows threads to suspend execution and relinquish the processors until some predicate on shared data is satisfied. The basic operations on conditions are: signal the condition(when the predicate becomes true), and wait for the condition, suspending the thread execution until another thread signals the condition.

条件变量是同步线程的一种机制,它允许线程挂起,让出处理器等待其他线程向它发送信号,该线程收到该信号后被唤醒继续执行程序。对条件变量基本的操作就是:a)向条件变量发送信号,唤醒等待的线程;b)等待条件变量并挂起直至其他线程向该条件变量发送信号。为了防止竞争,条件变量总是和一个互斥锁同时使用。

阅读全文 »

关于字节序(大端法、小端法)的定义

《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序(Little-Endian);大端存在起始地址,即是大端字节序(Big-Endian)。
也可以说:

  • 小端法就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。
  • 大端法就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内存中,分别如图1所示的方式存放。

阅读全文 »

头文件:

1
2
3
4
5
/usr/include/x86_64-linux-gnu/bits/sockaddr.h

/usr/include/x86_64-linux-gnu/bits/socket.h

/usr/include/x86_64-linux-gnu/bits/in.h

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* Protocol families.  */
#define PF_UNSPEC 0 /* Unspecified. */
#define PF_LOCAL 1 /* Local to host (pipes and file-domain). */
#define PF_UNIX PF_LOCAL /* POSIX name for PF_LOCAL. */
#define PF_FILE PF_LOCAL /* Another non-standard name for PF_LOCAL. */
#define PF_INET 2 /* IP protocol family. */
#define PF_AX25 3 /* Amateur Radio AX.25. */
#define PF_IPX 4 /* Novell Internet Protocol. */
#define PF_APPLETALK 5 /* Appletalk DDP. */
#define PF_NETROM 6 /* Amateur radio NetROM. */
#define PF_BRIDGE 7 /* Multiprotocol bridge. */
#define PF_ATMPVC 8 /* ATM PVCs. */
#define PF_X25 9 /* Reserved for X.25 project. */
#define PF_INET6 10 /* IP version 6. */
#define PF_ROSE 11 /* Amateur Radio X.25 PLP. */
#define PF_DECnet 12 /* Reserved for DECnet project. */
#define PF_NETBEUI 13 /* Reserved for 802.2LLC project. */
#define PF_SECURITY 14 /* Security callback pseudo AF. */
#define PF_KEY 15 /* PF_KEY key management API. */
#define PF_NETLINK 16
#define PF_ROUTE PF_NETLINK /* Alias to emulate 4.4BSD. */
#define PF_PACKET 17 /* Packet family. */
#define PF_ASH 18 /* Ash. */
#define PF_ECONET 19 /* Acorn Econet. */
#define PF_ATMSVC 20 /* ATM SVCs. */
#define PF_RDS 21 /* RDS sockets. */
#define PF_SNA 22 /* Linux SNA Project */
#define PF_IRDA 23 /* IRDA sockets. */
#define PF_PPPOX 24 /* PPPoX sockets. */
#define PF_WANPIPE 25 /* Wanpipe API sockets. */
#define PF_LLC 26 /* Linux LLC. */
#define PF_IB 27 /* Native InfiniBand address. */
#define PF_MPLS 28 /* MPLS. */
#define PF_CAN 29 /* Controller Area Network. */
#define PF_TIPC 30 /* TIPC sockets. */
#define PF_BLUETOOTH 31 /* Bluetooth sockets. */
#define PF_IUCV 32 /* IUCV sockets. */
#define PF_RXRPC 33 /* RxRPC sockets. */
#define PF_ISDN 34 /* mISDN sockets. */
#define PF_PHONET 35 /* Phonet sockets. */
#define PF_IEEE802154 36 /* IEEE 802.15.4 sockets. */
#define PF_CAIF 37 /* CAIF sockets. */
#define PF_ALG 38 /* Algorithm sockets. */
#define PF_NFC 39 /* NFC sockets. */
#define PF_VSOCK 40 /* vSockets. */
#define PF_KCM 41 /* Kernel Connection Multiplexor. */
#define PF_QIPCRTR 42 /* Qualcomm IPC Router. */
#define PF_SMC 43 /* SMC sockets. */
#define PF_XDP 44 /* XDP sockets. */
#define PF_MCTP 45 /* Management component transport protocol. */
#define PF_MAX 46 /* For now.. */

/* Address families. */
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
#define AF_ROSE PF_ROSE
#define AF_DECnet PF_DECnet
#define AF_NETBEUI PF_NETBEUI
#define AF_SECURITY PF_SECURITY
#define AF_KEY PF_KEY
#define AF_NETLINK PF_NETLINK
#define AF_ROUTE PF_ROUTE
#define AF_PACKET PF_PACKET
#define AF_ASH PF_ASH
#define AF_ECONET PF_ECONET
#define AF_ATMSVC PF_ATMSVC
#define AF_RDS PF_RDS
#define AF_SNA PF_SNA
#define AF_IRDA PF_IRDA
#define AF_PPPOX PF_PPPOX
#define AF_WANPIPE PF_WANPIPE
#define AF_LLC PF_LLC
#define AF_IB PF_IB
#define AF_MPLS PF_MPLS
#define AF_CAN PF_CAN
#define AF_TIPC PF_TIPC
#define AF_BLUETOOTH PF_BLUETOOTH
#define AF_IUCV PF_IUCV
#define AF_RXRPC PF_RXRPC
#define AF_ISDN PF_ISDN
#define AF_PHONET PF_PHONET
#define AF_IEEE802154 PF_IEEE802154
#define AF_CAIF PF_CAIF
#define AF_ALG PF_ALG
#define AF_NFC PF_NFC
#define AF_VSOCK PF_VSOCK
#define AF_KCM PF_KCM
#define AF_QIPCRTR PF_QIPCRTR
#define AF_SMC PF_SMC
#define AF_XDP PF_XDP
#define AF_MCTP PF_MCTP
#define AF_MAX PF_MAX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef unsigned short int sa_family_t;

struct sockaddr
{
sa_family_t sa_family;

char sa_data[14]; /* Address data. */
};

typedef uint32_t in_addr_t;

struct in_addr
{
in_addr_t s_addr;
};

struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[sizeof(struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)];
};


背景

1
2
3
4
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

connect是socket套接口编程中非常重要的一个函数,它用于客户机连接使用TCP协议打开的服务机。

connect有同步连接和异步连接两种模式:

  • 同步连接指的是,我们设置socket套接字为阻塞模式,调用connect之后,程序一直等待,直到该函数返回成功或者失败。如果连接过程中,发生了超时重传,接口的耗时时间有可能达127秒之久。假如我们的服务器程序只有一个网络线程,同步connect会阻塞该网络线程较长时间,在这段时间内将不能给其他连接提供服务。
  • 异步连接指的是,我们设置socket套接字为非阻塞模式,调用connect之后,该函数会马上返回,如果连接立即成功,那么皆大欢喜,就不用进行下步操作了。如果连接没有立即成功,我们就用select或者epoll等待操作系统给我们通知,接到通知后,我们再判断连接成功与否。在高性能服务器程序中,我们优先使用异步连接这种模式。
阅读全文 »

参考图书

书名 ISBN 作者 出版社 出版日期 备注
UNIX网络编程 卷1 套接字联网API 第3版 9787115517791 [美]W.理查德.史蒂文斯 人民邮电出版社 2019-10-01 P
UNIX网络编程 卷2 进程间通信 第2版 9787115517807 [美]W.理查德.史蒂文斯 人民邮电出版社 2019-10-01 P
TCP/IP高效编程:改善网络程序的44个技巧 9787115249371 [美]斯纳德 人民邮电出版社 2011-04-01 P
Linux高性能服务器编程 9787111425199 游双 机械工业出版社 2013-06-01 P
阅读全文 »

众所周知,我们在Linux系统上采用源码编译安装软件,一般就是 ./configure & make & make install 这三步。而 configure 是做什么用途?是怎么生成的?简单来说通过Autotools工具包以及辅助文件生成congfigure,然后该脚本文件生成定制化的Makefile。本系列文章,来探究Autotools的使用方法和实现原理。

阅读全文 »

从上文可知,目前已知有两处源代码下载地址,代码稍微不同,我们分别使用不同的源代码包进行编译安装。方法如下所述。

安装依赖项

1
2
$ sudo apt install zlib1g-dev
$ sudo apt install gettext

源代码编译(1)

使用如下命令进行编译安装:
下载地址:https://cdn.kernel.org/pub/software/scm/git
下载举例:https://cdn.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz

1
2
3
4
5
6
7
8
$ wget https://cdn.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz
$
$ tar -zxvf it-2.43.0.tar.gz
$ cd git-2.43.0
$
$ ./configure --prefix=/home/mancode/apps/git/git-2.43.0
$ make
$ make install
阅读全文 »

学习Git源代码之前,需要熟练使用Git。本文收集Git相关图书、教程等资料,用于使用学习。

参考图书

书名 ISBN 作者 出版社 出版日期 备注
Pro Git 2nd 9781484200773 [美]Scott Chacon Apress 2014年09月 P, E, M
Pro Git 2nd 中文版 9781484200773 [美]Scott Chacon Apress 2014年09月 P, E
精通Git 第2版 9787115463067 [美]Scott Chacon 人民邮电出版社 2017年09月 P
Git团队协作 9787115454676 [加]艾玛.简.霍格宾.韦斯特比 人民邮电出版社 2017年05月 P
Git版本控制管理 第二版 9787115382436 [美]乔恩·罗力格 人民邮电出版社 2022年07月
Git从入门到精通 9787301305874 高见龙 北京大学出版社 2019年12月
Git学习指南 9787115436764 [德]普莱贝尔 人民邮电出版社 2023年04月 P
阅读全文 »

Shell编程中常用的文件描述符有3个:
0:stdin,标准输入,默认指的是键盘输入
1:stdout,标准输出,默认指的是屏幕输出
2:stderr,标准错误输出,默认值得是屏幕输出

重定向简单例子
命令举例 含义
cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> fiel 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加)
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
cat <>file 以读写的方式打开 file
cmd < file cmd 命令以 file 文件作为 stdin
cmd << delimiter Here document 从 stdin 中读入,直至遇到 delimiter 分界符

SHELL读取文件的方法

1
2
3
4
5
//使用read命令读取一行数据
while read myline
do
echo "LINE:"$myline
done < datafile.txt

1
2
3
4
5
#使用read命令读取一行数据
cat datafile.txt | while read myline
do
echo "LINE:"$myline
done

1
2
3
4
5
#读取一行数据
cat datafile.txt | while myline=$(line)
do
echo "LINE:"$myline
done

1
2
3
4
5
#读取一行数据
while myline=$(line)
do
echo "LINE:"$myline
done < datafile.txt

1
2
3
4
5
6
7
#使用read命令读取变量数据
cat datafile.txt | while read paraa parab parac
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
done

1
2
3
4
5
6
7
#使用read命令读取变量数据
while read paraa parab parac
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
done < datafile.txt
阅读全文 »

0x01 Java基础编程

书名ISBN作者出版社出版日期备注
Java核心技术 卷1:开发基础(原书第12版) 9787111706410 [美]凯·S.霍斯特曼 机械工业出版社 2022年06月 Z
Java核心技术 卷2:高级特性(原书第12版) 9787111719748 [美]凯·S.霍斯特曼 机械工业出版社 2023年03月 Z
Java实战 第2版 9787115521484 [英]拉乌尔 人民邮电出版社 2019年12月 W
Java8实战 9787115521484 [英]拉乌尔 人民邮电出版社 2019年12月 W
剑指Java 核心原理与应用实践 9787121436642 尚硅谷教育 电子工业出版社 2022年06月 W
阅读全文 »

简单介绍STL对集合操作有标准的算法:

  • 交集set_intersection
  • 并集set_union
  • 差集set_difference
  • 对称差集set_symeetric_difference。

针对这里提及的四个集合运算必须特别注意:

  • 1、第一个算法需保证第一集合和第二集合有序,并从小到大排序,内部使用默认“<”操作符比较元素大小;
  • 2、第二个算法需保证第一集合和第二集合有序,排序方式参照Compare确定,内部使用Compare比较元素大小。
阅读全文 »