Paul Jiang's Blog

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

基于Mirror Driver的屏幕捕捉技术

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 多媒体
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
int _tmain(int argc, _TCHAR* argv[])
{
//获取屏幕DC
HDC hDesktopDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
//内存DC
HDC hMemoryDC = CreateCompatibleDC(hDesktopDC);

//得到屏幕宽度
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);

//根据屏幕DC创建屏幕位图
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);

//将位图选择到内存DC中
SelectObject(hMemoryDC, hCaptureBitmap);

//将屏幕DC传送到内存DC中
BitBlt(hMemoryDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0, 0, SRCCOPY);

//得到鼠标位置
POINT pt;
GetCursorPos(&pt);
//加载鼠标位图
HCURSOR m_hcursor = LoadCursor(NULL, IDC_ARROW);

DrawIconEx(hMemoryDC, pt.x, pt.y, m_hcursor, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);

SelectObject(hMemoryDC, hCaptureBitmap);

char str1[50] = "D:/123.bmp";
SaveBMPToFile(hCaptureBitmap, str1, pt.x, pt.y);

DeleteDC(hDesktopDC);
DeleteDC(hMemoryDC);
DeleteObject(hCaptureBitmap);
}

多媒体技术教程-数字音频

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 多媒体

什么声音?

声音是一种波动现象,一些物理器件的运动导致了空气分子的震动,进而产生声波。
声波数字化
声波都带有可测量的压力值,因此我们使用压力传感器将压力转换成电压差,从而通过检测某个区域的压力值来探测声音。要将信号全部数字化,我们就要在每一维(时间维和幅值)上采样。
在时间轴上的采样简称”采样”,采样的速度称为采样率。人能够听见从20Hz~20kHz的声音。根据奈奎斯特理论,我们需要使用的的采样频率至少是信号中最高频率的两倍。
在振幅维上的采样成为量化。如果幅度的划分是等间隔的就称为线性量化,否则就称为非线性量化。韦伯定律指出,声音自身的强度越大,就越需要更大的振幅来让我们感受到声音的变化。例如我们能够感受到从10磅到11磅的变化,那么从20磅开始,需要增加到22磅我们才能感受到同样的重量变化。

信噪比

在模拟系统中,随机的波动会在信号里产生噪声,测量电压会因此而变得不准确。正确信号的能量和噪声能量的比称为信噪比(Signal-to-Noise Ratio, SNR)。
SNR = 10lg( ( Vsignal ) ^ 2 / ( Vnoise ) ^ 2 ) = 20lg(Vsignal/Vnoise)
我们把周围环境中的声音和我们能够听到的最轻的声音求能量比,然后得到dB值,用它来衡量声音的强度。

采样精度

样本大小是用每个声音样本的位数表示的,它反映度量声音波形幅度的精度。位数越多,存储空间越多,声音越精确。
假设Vnoise = 1,采样精度为1位表示Vsignal = 2^1,它的信噪比SNR = 6dB
假设Vnoise = 1,采样精度为16位表示Vsignal = 2^16,它的信噪比SNR = 96dB

编译libjpeg-6b

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 多媒体

1、下载libjpeg的源代码jpegsr6.zip

2、解压出来一堆文件,打开命令行窗口(CMD),进入代码所放的目录下

3、运行命令:nmake /f makefile.vc nodebug=1 开始编译,然后问题就来了

4、“nmake 不是内部或外部命令”
这个执行文件在VC的安装目录中,解决方法:输入命令 path C:\Program Files\Microsoft Visual Studio 9.0\VC\bin; %SystemRoot%\system32;回车

5、makefile.vc<11>:fatal error U1052: file ‘win32.mak’ not found
提示找不到win32.mak文件,这个文件定义了一些必须的宏,这个文件在Windows SDK的安装目录中,打开makefile.vc文件修改第12行为:
!include <C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\win32.mak>
保存,再执行编译命令又有新的错误。

6、NMAKE:fatal error U1073: don’t know how to make ‘jconfig.h’
这是个奇怪的问题,在网上搜了半天没有结果,最后才发现原来目录中没有这个文件。其实只要把文件jconfig.vc更名为jconig.h即可。再执行编译命令又有新的错误。

7、NMAKE: fatal error U1077: ‘…\cl.EXE’ : return code ‘0xc0000135’
CL命令未能执行,我们直接在命令行提示后面输入cl回车,会有个提示“没有找到 mspdb80.dll ”。解决方法:输入 vcvars32 回车,这是一个用来设置VC路径环境的批处理。再次执行编译命令,出现了一行行字符快速的刷新,哈哈,已经开始编译了。最后又出现一个错误,这个就不用管它了,因为我们需要的libjpeg.lib文件已经出现在了当前目录中。

数学符号

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数学
  1. 基本符号:+ - × ÷(/)
  2. 分数号:/
  3. 正负号:±
  4. 相似全等:∽ ≌
  5. 因为所以:∵ ∴
  6. 判断类:= ≠ < ≮(不小于) > ≯(不大于)
  7. 集合类:∈(属于) ∪(并集) ∩(交集)
  8. 求和符号:∑
  9. n次方符号:¹(一次方) ²(平方) ³(立方) ⁴(4次方) ⁿ(n次方)
  10. 下角标:₁ ₂ ₃ ₄ (如:A₁B₂C₃D₄)
  11. 或与非的”非”:¬
  12. 导数符号(备注符号):′ 〃
  13. 度:° ℃
  14. 任意:∀
  15. 推出号:⇒
  16. 等价号:⇔
  17. 包含被包含:⊆ ⊇ ⊂ ⊃
  18. 导数:∫ ∬
  19. 箭头类:↗ ↙ ↖ ↘ ↑ ↓ ↔ ↕ ↑ ↓ → ←
  20. 绝对值:|
  21. 弧:⌒
  22. 圆:⊙
  23. 平均数-,ba拔
  24. 存在:∃

InfluxDB-基本概念

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数据库

InfluxDB是一个无模式数据库,可以随时添加新的measurement,tags和fields。

  1. database
    数据库可以包含多个用户、保留策略、连续查询和时间序列数据的逻辑容器。

  2. measurement
    measurement是包含timestamp, field和tag的容器。相当于数据库中的表。

  3. timestamp
    时间戳

  4. field
    字段由字段键(field key)和字段值(field value)构成。字段是InfluxDB中必须存在的,没有字段就不能保存数据。相当于表中的列名和列的值。
    但是,字段不能进行索引,进行字段匹配的时候会导致全表扫描。如果需要作为查询条件,需要设置为tags。

  5. tags
    标签由标签键(tag key)和标签值(tag value)构成。不同于字段,标签是可选,同时是被索引的。标签适合存储查询用的元数据。

  6. point
    同一个序列(serie)和时间戳(timestamp)中的字段集(field set)。

  7. retention policy
    保留策略描述了InfluxDB保存数据的持续时间,这些数据的副本数量以及分片组覆盖的时间范围。

  8. series
    InfluxDB数据结构中的数据集合,共享measurement、retention policy、measurement和tag set

安装

root权限

网络端口

8086:用于客户端和服务器之间的通信

8088:用于备份和还原

配置

1
2
influxd config
influxd --config /etc/influxdb/influxdb.conf

MongoDB-介绍

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数据库

背景

开始时只有很少的数据,一台服务器就可以了。然后就得建立备份,以便应对大量的读取和不时的宕机。用不了多长时间,就得加一个缓存层,调整所有的查询,投入更多的硬件。
最后,你会发现自己需要将数据切分到多个集群中,并重新构建大量的应用逻辑以适应这种切分。之后不久,你又会发现被自己数月前设计的数据库结构限制住了。
这是应为集群中大量的数据需要更改模式,会花费很长时间,也需要DBA投入相当多的宝贵时间。在代码中处理要简单一些,但也需要小型开发团队数月的努力。
为了应对现在Web应用的数据膨胀,开源社区像以往一样提供了太多的“好方法”。从内存中的键值型存储到可以使用SQL的MySQL/InnoDB变种等复杂方法。
MongoDB在功能和复杂性之间取得了很好的平衡,并且将原先十分复杂的任务大大简化。也就是说,它具备支撑今天主流Web应用的关键功能:索引、复制、分片、丰富的查询语法,特别灵活的数据模型。与此同时还不牺牲速度。

下载

mongodb:https://www.mongodb.org/

配置&启动

1
2
3
4
5
6
7
8
9
systemLog:
destination: file
path: "D:/MongoDB/log/mongodb.log"
logAppend: true
net:
bindIp: 127.0.0.1
port: 27017
storage:
dbPath: "D:/MongoDB/data"
1
/bin/mongod.exe --config mongodb.conf

停止

最基本的方法就是向MongoDB服务器发送一个SIGINT或者SIGTERM信号。如果服务器是作为前台进程运行在终端的,就直接按Ctrl-C。否则,就用kill这种命令发出型号。如果mongod的PID是10014,就可以kill -2 10014 (SIGINT)或者kill 10014 (SIGTERM)。

千万不要向运行中的MongoDB发送SIGKIILL(kill -9)。这样会导致数据库直接关闭,上面讲到的步骤都将被忽略,这会使数据文件损毁。要是真的发生了不幸,一定要在启动备份之前修复数据库。
当mongod收到时,会稳妥退出。也就是说会等到当前运行的操作或者文件预分配完成,关闭所有打开的连接,将缓存的数据刷新的磁盘,最后停止。

另一种稳妥的方式就是使用shutdown命令,{“shutdown”:1}。这是管理命令,要在admin数据库下使用。

GridFS

GridFS是一种在MongoDB中存储大二进制文件的机制。使用GridFS存文件有如下几个原因。

  • 利用GridFS可以简化需求。要是已经用了MongoDB, GridFS就可以不需要使用独立文件存储架构。
  • GridFS会直接利用已建立的复制或分片机制,所以对于文件存储来说故障恢复和扩展很容易。
  • GridFS可以避免用于存储用户上传内容的文件系统出现的某些问题。例如,GridFS在同一目录下放置大量的文件是没有任何问题的。
  • GridFS不产生磁盘碎片,因为MongoDB分配数据文件空间时以2GB为一块。

RRDTool-基本概念

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数据库

rrdtool是一个固定大小的,基于文件的时序数据库。

基本概念

PDP(Primary Data Point):主数据点
CDP(Consolidation Data Point):聚合数据点
解析度(resolution):指的就是时间跨度
DS(Data Source):数据源,每一个数据源都可以对其做单独的聚合

rrdtool create

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
rrdtool create filename [--start|-b start time] [--step|-s step]
[DS:ds-name:DST:dst arguments]
[RRA:CF:cf arguments]
filename: 默认为.rrd为后辍的文件,名称自己随意取;
--start: 指定RRDtool的第一个记录的起始时间,--start选项的值必须是timestamp的格式。
如查你想自己设定时间可以使用--start $(date -d '1 days ago' +%s) ,当然还有一种方法就是使用rrdtool fetch filename.rrd AVERAGE;
--step: 就是RRDtool“期望”每隔多长时间就收到一个值;
DS: 用于定义数据源;
ds-name: 指定数据源的名字,随意取。必须是1到19个字符,且是a-z、A-Z、或者0-9;
DST: 定义源数据类型,源数据类型分以下几种:
1、COUNTER 数据必须是递增的,保存的是相对于前面的一个值
2、GAUGE 保存原值
3、DERIVE 可增可减
4、ABSOLUTE 相对于初始值的数值
5、COMPUTE 对于COMPUTE数据源来说格式是DS:ds-name:COMPUTE:rpn-expression
dst argument:数据源参数,形式是: heartbeat:min:max
heartbeat: 定义在我们这个时间跨度之内,再过多长时间过期,过期的标记为unknown;
min: 接收的最小值,一般我们可以都设为0;
max: 接收的最大值,如果不是很清楚其最大值可以设置为U;
RRA: 用于指定数据如何存放;
CF: 指定数据合并方法,合并方法分以下几种:
1、AVERAGE 平均值
2、MAX 最大值
3、MIN 最小值
4、LAST 当前值
cf arguments:数据保存,它的形式是: xff:steps:rows
xff: 定义PDP中出现unknown的百分比高于设置的这个比例以后CDP也被标记为unknown;
steps: 聚合函数对多少个pdp做聚合生成cdp;
rows: 保存多少个聚合的cdp结果;

rrdtool update

1
2
3
4
5
6
rrdtool {update | updatev} filename [--template | -t ds-name[:ds-name]...]
[--] N | timestamp:value[:value...]
-t : 改变接收数据的次序
例如,我们定义的rrdtool create test.rrd DS:ds1 DS:ds2,默认情况下我们想这个数据库里面输入值得话是:rrdtool update test.rrd N:30(DS1值):40(DS2值),
使用rrdtool update test.rrd -t ds2:ds1 40:30 把循序给颠倒;
N: 表示当前时间

rrdtool info

1
rrdtool info filename    用于查看filename的数据结构(filename就是rrdtool create生成的数据库文件);

rrdtool fetch

1
2
3
rrdtool fetch filename [-r #] [CF]
-r #: 指定#个PDP为一个数据;
CF: 指定使用哪种合并函数,与rrdtool create中cf argument一样;

rrdtool graph

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
rrdtool graph|graphv filename [option ...][datadefinition ...][data calculation ...][variabledefinition ...][graph element ...][print element ...]
[-s|--start time][-e|--end time][-S|--step seconds]
[-t|--title string][-V |--Vertical-label string ]
[-w|--width pixels][-h|--height pixels][-j|--only-graph][-D|--full-size-mode]

OPTION:
Graph Limits
[-u | --upper-limit value]: 显示数值的最大上限的值
[-l | --lower-limit value]: 显示的最低下限的值
[-r | --rigid ]: 不会自动缩放,以定义的最大值和最小值来显示
[-A | --alt-autoscale ]: 启用自动缩放,但是最大的和最小的是不能超过上面的范围
[-J | --alt-autoscale-min]: 只自动缩放最小值
[-M | --alt-autoscale-max ]: 只自动缩放最大值
[-N | --no-gridfit]: 不显示网格线

定义横轴:
X-Axis
[-x|--x-grid GTM:GST(定义基准网格线,前面是单位,后面是数值)
:MTM:MST(定义主网格线,前面的是单位,后面的是数值)
:LTM:LST(定义横轴底面的标签的单位和距离,前面是单位,后面是距离)
:LPR:LFM(显示标签的显示格式)]
[-x | --x-grid none ]

Y-Axis
[-y|--y-grid grid(刻度是什么) step(多长显示一个刻度)
:label(卷标显示是什么) factor(卷标多长时间显示一个)]:
[-y|--y-grid none ]
[-Y| --alt-y-grid]

图片全局定义
[-c| --color COLORTAGE #rrggbb[aa]]
BACK #背景色
CANVAS #画布颜色
SHADEA #左边和上边的颜色
SHADEB #右边和下边的颜色
GRID,MGRID #主网格线的颜色
FONT #字体颜色
AXIS #坐标轴的颜色
FRAME #边框颜色
ARROW #箭头的颜色
-n | --font FONTTAG(字体名字):size(大小):[font(路径)] #指定字体的参数
[-R|--font-render-mode(字体格式) {normal(正常),light(发亮),mono(粗体)}]
[-a|--imgformat PNG|SVG|EPS|PDF] #图像输出格式
[-W| --watermark string ] #加水印

数据与变量
定义数据获取方式:
DEF:vname(变量名,只能包含数字和字母,最长不能超过255字符)=rrdfile(rrd文件路径):ds-name(数据源名称):CF(聚合函数)[:step=step][:start=time][:end=time]
CDEF:vname=RPN expression
VDEF:vname=RPN expression

图片
线状图:
LINE[width(线条的粗细程度,1最细的3是最粗的)
:value(上面定义的变量名称)[#color(线条颜色)]
[:[legend(底面的标签名称)][:STACK]]
[:dashes[=on_s[,off_s[,on_s,off_s]...]
[:dash-offset=offset]
面积图:
AREA:value[#color][:[legend][:STACK]]

样例

1
2
.\rrdtool.exe create test.rrd --step 60 DS:test:GAUGE:8:0:U RRA:LAST:0.5:1:3600
.\rrdtool.exe graph test.png --step 60 -t test DEF:vtest=test.rrd:test:LAST LINE1:vtest#FF0000:testline1 --font "DEFAULT:13:fonts\times.ttf"

高等代数-研究对象

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数学

线性空间

一个非空集合V如果规定了加法运算和数量乘法(数域与V中元素的乘法)运算,并且满足类似于几何空间中的加法的4条运算法则和数量乘法的4条运算法则,那么称V是数域上的一个线性空间。

线性映射

线性映射是研究数量关系中最基本的“线性关系”(即均匀变化的关系)以及空间形式中最基本的变换(例如,几何空间中的旋转、镜面反射、投影等)。

具有度量的线性空间以及度量有关的线性映射

几何空间中有长度、角度、正交(即垂直)、距离的等度量概念,它们可以统一用内积来刻画。由此受到启发,在线性空间中只要定义了内积,就可以引进度量的概念。

InfluxDB-数据库管理

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数据库

database

1
2
3
CREATE DATABASE <database_name> [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [NAME <retention-policy-name>]]

DROP DATABASE <database_name>

series

1
DROP SERIES FROM <measurement_name[,measurement_name]> WHERE <tag_key>='<tag_value>'

measurement

1
DROP MEASUREMENT <measurement_name>

retention policy

1
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]

Oracle-RAC体系结构

发表于 2018-05-26 | 更新于 2020-05-17 | 分类于 数据库

系统故障转移共有3种一般方法。按照可用性的升高顺序,依次为无故障转移、冷故障转移和热故障转移。

Oracle RAC在本质上是为多台服务器提供对同一数据副本进行一致性访问的能力。

尽管Oracle RAC能够很好地进行伸缩,但水平可伸缩性也有一个上限。一般来说,应用程序的可伸缩性取决于这个应用程序在单个实例上的工作状况。如果这个应用程序执行的SQL语言是高效的,使用的资源数量合理,那么通常可以认为它能很好地伸缩,相反,它还会使问题放大,使情况变得更糟。这一点也适用于Oracle RAC或任意其他可伸缩性解决方案。因此,在使用集群进行扩展之前,需要确保进行了应用程序级别的调优以清除瓶颈。

Oracle RAC允许多个实例访问同一个数据库,从Oracle 11g R2开始,Oracle集群件栈被称为”Oracle Grid Infrastructure”。

Oracle RAC的主要组件包括:

共享磁盘系统,Oracle集群件,集群互联,Oracle内核组件

可伸缩共享存储是Oracle RAC环境中的一个关键组件。传统上,使用主机本地的SCSI或SATA接口将存储设备连接到各个服务器。今天,更灵活的存储设备已经很流行了,可以使用常规的以太网,通过存储区域网络(SAN)或网络连接存储(NAS)来访问。这些新的存储选项使多台服务器能够通过一个网络访问同一组磁盘,简化了在任意分布式环境中提供存储的过程。

在共享存储中,数据库文件应当能提供所有节点平等地并发访问。一般的文件系统不允许在一个以上的系统中安装磁盘。依赖于单一节点,而且这个节点可能成为单一故障点(SPOF),所以它是对高可用性(HA)体系结构的另一个威胁。

主要有3种方法可以提供RAC所需要的共享存储:

  1. 原始卷
  2. 集群文件系统
  3. 自动存储管理(ASM):ASM是为Oracle数据库文件准备的一种可移植、专用、优化的集群文件系统。

“Oracle集群件”是可移植软件。它由几个后台进程组成,这些进程执行不同的功能,用以推动集群操作。

Oracle集群件由集群就绪服务(CRS)使用”Oracle集群注册表”和表决磁盘进行管理,OCR记录和维持集群及节点的成员资格信息,表决器在通信故障时充当一个仲裁者。在集群运行期间,来自所有节点的一致性心跳信息都会发送给表决磁盘。

构成Oracle集群件的后台进程和服务是CRSd(CRS守护进程)、OCSSd(Oracle集群同步服务守护进程)、OPROCd(进程监控器守护进程,在11g R2版本中废弃)、EVMd(事件卷管理器守护进程)和ONS(Oracle通知服务)。

Oracle 10g引入了一个名为”集群VIP”的新功能,集群VIP就是一个集群虚拟IP地址,外部世界将使用这个IP地址连接到数据库。这个IP地址应当不同于集群中的IP地址集。

应用程序VIP是一种用于管理网络IP地址的集群资源。如果一个应用程序依赖于应用程序VIP(AVIP),只要有一个节点停机,应用程序VIP就会故障转移到仍在正常运行的节点,并在这个节点上重新启动此应用程序进程。

1…202122

Paul Jiang

212 日志
26 分类
26 标签
Links
  • 褚霸
  • 章亦春
  • Martin Fowler
© 2020 Paul Jiang
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.5.0