Haohao Notes

DREAM OF TECHNICAL ACHIEVEMENT

0%

什么是声音

声音是波

说到声音,爱好音乐的人首先可能会想到优美的音乐或者是劲爆十足的舞曲,这些音乐只是声音的一种。音乐是由乐器弹奏或者歌手演唱而产生的,那么声音是如何产生的呢?回想一下中学物理课本上的定义

– 声音是由物体振动而产生的

震动是声音的产生原因

当小球撞击到音叉的时候,音叉会发生振动,对周围的空气产生挤压,从而产生声音。声音是一种压力波,当演奏乐器、拍打一扇门或者敲击桌面时,它们的振动都会引起空气有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波(可以理解为石头落入水中激起的波纹),由此就产生了声波,这种现象会一直延续到振动消失为止。

声波的三要素

声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。

频率(过零率)越高,波长就越短。低频声响的波长则较长,所以其可 以更容易地绕过障碍物,因此能量衰减就小,声音就会传得远,反之则会 得到完全相反的结论。

响度其实就是能量大小的反映,用不同的力度敲击桌子,声音的大 小势必也会不同。在生活中,分贝常用于描述响度的大小。声音超过一定 的分贝,人类的耳朵就会受不了。

阅读全文 »

译者按:本文是来自一家乌克兰技术公司的文章。该文章译者认为着重在应用上,而非单纯的性能对比。给自己的平台选择一个合适的搜索引擎比任何一个吹嘘技术强大的好。虽然最近一两年 ES发展飞速,但sphinx的简单易用性还是赢得很多机构公司的青睐,比如优酷土豆都是用sphinx。所以使用之前,务必先了解自己的业务诉求,再选择合适的搜索引擎,而非一昧跟风。翻译若有误请指正,谢谢查看!

编译自:ELASTICSEARCH VS. SOLR VS. SPHINX: BEST OPEN SOURCE SEARCH PLATFORM COMPARISON

作者:Anna Klimenko

从业务角度来看,您应该将高效的搜索引擎视为一种强大的工具,能够提高转换率并为网站所有者带来更多利润。如果您的网站搜索机制没有提供相关结果或搜索性能太低,用户将离开网站并转到其竞争对手。

那么,什么是高效的搜索引擎?

搜索的主要目的是检索与用户查询最相关的匹配,排除网站上的其他常规内容。

在当前搜索引擎中可以获得的功能中,最受欢迎的是:

  • 全文搜索(通过简单的单词和短语或单词或短语的多种形式)
  • 多字段搜索
  • 高亮显示(在搜索框中输入的单词的高亮)
  • 按同义词搜索
  • 自动填充建议

Suggestions and highlighting on Bloomberg

  • 多值属性搜索(原文:faceted search,译者改成多值属性或许会更准确)(属性计数。例如,电子商务网站使用构面告诉客户特定型号,大小,颜色和其他属性的项目数量)
阅读全文 »

Docker 架构原理及简单使用

简介

了解docker的前生LXC

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。
与传统虚拟化技术相比,它的优势在于:

  1. 与宿主机使用同一个内核,性能损耗小;
  2. 不需要指令级模拟;
  3. 不需要即时(Just-in-time)编译;
  4. 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
  5. 避免了准虚拟化和系统调用替换中的复杂性;
  6. 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

总结:Linux Container是一种轻量级的虚拟化的手段。

Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

LXC与docker什么关系?

docker并不是LXC替代品,docker底层使用了LXC来实现,LXC将linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。

在LXC的基础之上,docker提供了一系列更强大的功能。

阅读全文 »

上周开发一个功能使用使用Blob

Safari 手机版下载提示 Mobile Safari download issue : The operation couldn’t be completed. (webkitblobresource error 1.)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
function downloadFile(content, filename) {
var blob = new Blob([content])
var url = window.URL.createObjectURL(blob)
var a = document.createElement('a')
a.style.display = 'none';
a.href = url
a.download = filename
document.body.appendChild(a);
a.click()
window.URL.revokeObjectURL(url);
document.body.removeChild(a);

}

查询Blob支持 Safari 6以上版本
https://developer.mozilla.org/en-US/docs/Web/API/Blob

Blob 浏览器兼容性图

浏览器兼容性图

如果要以编程方式将ancor标记作为解决方案注入DOM,请确保不要过早地清除它。所以延迟一秒清除解决.

解决示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function downloadFile(content, filename) {
var blob = new Blob([content])
var url = window.URL.createObjectURL(blob)
var a = document.createElement('a')
a.style.display = 'none';
a.href = url
a.download = filename
document.body.appendChild(a);
a.click()
setTimeout(() => {
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}, 1000);
}

在Linux下使用PHP连接SqlServer出现以下错误:

1
SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x2746

发现问题

https://github.com/microsoft/msphpsql/issues/1021

修复参考思路

https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1

解决方式

/etc/ssl/openssl.cnf配置CipherString改为DEFAULT@SECLEVEL=1

原配置

1
2
3
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

改后配置
1
2
3
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1

通过命令解决

阅读全文 »

首先引用一下美国著名诗人 罗伯特·弗罗斯特的一首诗叫<<未选择的路>>

金黄色的树林里,分出两条路。可是我不能同时涉足啊。我在那久久伫立,我向着其中一条路极目望去,直到它消失在丛林的深处。但是,我却选择了另外一条路,留下一条路,等改日再见。但是我知道,路径延续无尽头的,恐怕我难以再回返。也许多少年后,在某个地方,我将轻声叹息,把往事回顾,一片树林,分出两条路,而我选择了其中人迹更少的一条,从此决定了我一生的道路。 —— 罗伯特 弗罗斯特

在我们人生当中经常会遇到两条路或者多条路的选择,然后你很清楚选了一条其他的就和你没有关系了,你将在也没有机会走了上它了,这就是人生最大的尴尬.

这种困境是每个人都会遇到的共同困境.

有历史记载至少有两个人,一个是春秋时期的杨朱,另一个是魏晋南北朝的阮籍.这两个人一看到有分岔的路,一条通往南一条通往北,不知道该如何选择,而后临歧路而痛哭.

当今社会,一个人光每天吃什么就要面对至少200多种选择.

老人们,经常拉着我们的手说:男怕入错行,女怕嫁错郎.这种选择才是真真的麻烦,它会随着我们的选择影响我们一生啊!

终局思维

很多人说我们做选择要把目光放的够长远,怎么样才算是放的够长远呢?

阿里巴巴公司参谋长曾鸣教授提出来的叫”终局思维”

阅读全文 »

GTID介绍

GTID概念

GTID( Global Transaction Identifier)全局事务标识,由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL集群内也是唯一的。GTID是 MySQL 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于Binlog文件+Position的主从复制,基于GTID的主从复制,数据一致性更高,主从数据复制更健壮,主从切换、故障切换不易出错,很少需要人为介入处理。

划重点:

  1. 全局事务表示(Global Transaction ID)
  2. GTID与事务一一对应,并且全局唯一ID.
  3. 一个GTID在一个服务器上执行一次.
  4. MySQL 5.6.5开始支持GTID.

GTID特点

  1. 事务提交产生GTID,GTID与事务及事务提交所在的节点绑定,GTID与事务一起写入Binlog,但是从库应用Binlog并不会生成新的GTID。
  2. 集群中的任何一个节点,根据其GTID值就可以知道哪些事务已经执行,哪些事务没有执行,如果发现某个GTID已执行,重复执行该GTID,将会被忽略,即同一个GTID只能被应用一次。
  3. 当一个连接执行一个特定GTID的事务,但是还没有提交,此时有另外一个连接也要执行相同GTID的事务,那么第二个连接的执行将会被阻塞,直到第一个事务提交或者回滚。如果第一个事务成功提交,第二个事务将会被忽略。如果第一个事务回滚,第二个事务正常执行。

GTID组成

GTID = server_uuid:transaction+id

查看server_uuid:

1
2
3
root@a84d983d7d50:/var/lib/mysql# more auto.cnf 
[auto]
server-uuid=59fd3bd6-a6da-11ea-91d7-0242ac110003

阅读全文 »

复制概述

MySQL中的主从复制是将数据从一端(通常称为Master,即主库)复制到另一端(通常称为Slave,即从库).

MySQL的复制特性操作很灵活,即可以实现整个服务级别的复制,也可以只复制某一个数据库,甚至某个数据库中的某个表对象;

  • 主从单向复制(即可以实现从A复制到B)
  • 单主多从复制(B在复制到C,也可以实现A直接复制到B和C)
  • 双主复制(甚至是A的数据复制给B,B的数据也复制回A)

一主多从架构与双主双从架构

服务器间复制数据有很多种解决方案,究竟哪种方案最适合,取决于使用的数据引擎和期望实现的复制需求.一般来说,可以将MySQL的复制特性应用在下来场景上:

  • 实时灾备,用于故障切换
  • 读写分离,提供查询服务
  • 备份
  • 延时库

搭建环境

由于MySQL安装方式 网上很多教程 这里就不重复写了

  • 运行环境 CentOS 7.5
  • 数据库环境 MySQL 5.7.30
阅读全文 »

Socket编程

套接字概念

Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。

既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。

套接字的内核实现较为复杂,不宜在学习初期深入学习。

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。

套接字通信原理如下图所示:

套接字通信原理

在网络通信中,套接字一定是成对出现的。 一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符索发送缓冲区和接收缓冲区。

TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API。本章的主要内容是socket API,主要介绍TCP协议的函数接口,最后介绍UDP协议和UNIX Domain Socket的函数接口。

阅读全文 »

同步概念

所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等…

而,编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。“同”字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。

线程同步

同步即协同步调,按预定的先后次序运行。

线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。

举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000

举例2: 内存中100字节,线程T1欲填入全1, 线程T2欲填入全0。但如果T1执行了50个字节失去cpu,T2执行,会将T1写过的内容覆盖。当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行结束,内存中的100字节,既不是全1,也不是全0。

产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。

“同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。

阅读全文 »