运行
1 | java -jar XXX.jar |
查看文件
1 | jar tf XXX.jar |
更新文件
1 | jar uf XXX.jar /path/of/jar/file |
logstash:6.5.3
创建配置文件到 /usr/local/logstash/pipeline/tcp.conf
1 | input { |
启动 Logstash 容器,并挂载 tcp pipeline 配置
1 | docker run -d --rm -it --name logstash -p 9600:9600 -v /usr/local/logstash/pipeline/:/usr/share/logstash/pipeline/ logstash:6.5.3 |
Configuring Logstash for Docker
准备测试数据 test.json
1 | {"message":{"someField":"someValue"}} |
发送
1 | nc localhost 9600 < test.json |
「追寻历史:一个记者和他的20世纪」
「乔布斯传」
「硅谷钢铁侠」
「奈飞文化手册」
「看见」
「三体」1、2、3
环境: Unbuntu 16.04 TLS Server
Docker CE: Docker Community Edition
Docker EE: Docker Enterprise Edition
sudo apt-get update
可能出现错误:
1 | Ign:1 cdrom://Ubuntu-Server 16.04.3 LTS _Xenial Xerus_ - Release amd64 (20170801) xenial InRelease |
解决:
1 | sudo vi /etc/apt/sources.list |
注释掉 deb cdrom
打头的部分
deb cdrom:[Ubuntu-Server 16.04.3 LTS Xenial Xerus - Release amd64 (20170801)]/ xenial main restricted
保存后退出再次尝试 sudo apt-get update
下载 docker-ce-18.06(获取更多版本)
1 | cd /usr/local/docker |
安装
1 | sudo dpkg -i /usr/local/docker/docker-ce_18.06.3~ce~3-0~ubuntu_amd64.deb |
验证
1 | docker version |
通过 rancher 提供的安装脚本在线安装
curl https://releases.rancher.com/install-docker/17.06.sh | sh
安装完成后,通过以下命令验证安装结果
sudo docker version
或 sudo docker info
卸载Docker CE sudo apt-get purge docker-ce
删除Docker镜像、容器、数据卷等文件 sudo rm -rf /var/lib/docker
环境: Unbuntu 16.04 TLS Server
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
1 | sudo apt-get install openssh-server |
1 | sudo passwd root |
1 | vi /etc/ssh/sshd_config |
将 PermitRootLogin prohibit-password
修改为 PermitRootLogin yes
。
1 | sudo service ssh restart |
在终端命令行输入以下命令,其中 server-host
为服务器地址。按照提示输入密码,登录成功即可。
1 | ssh root@server-host |
原因是Ubuntu没有默认提供ssh服务,因此首先安装ssh服务:
1 | sudo apt-get install openssh-server |
如果安装完后该服务没有自动启动,则手工启动:
1 | sudo /etc/init.d/ssh start |
用 ssh 命令连接服务器之后,如果一段时间不操作,再次进入 Terminal 时会有一段时间没有响应,然后就出现错误提示:
Write failed: Broken pipe
只能重新用 ssh 命令进行连接。
ServerAliveInterval 60
ClientAliveInterval 60
$ ssh -o ServerAliveInterval=60 user@sshserver
本书适用于对区块链技术感兴趣,且具备一定信息和金融基础知识的读者;无技术背景的读者也可以从中了解到区块链的应用现状。
「区块链技术指南」在线阅读:https://www.gitbook.com/book/yeasy/blockchain_guide/details
以下为书摘(为了保持前后连贯顺畅,部分内容经过简单重组,仍与原文含义保持一致):
无论是货币,还是信用卡模式,都需要额外的系统(例如银行)来完成生产、分发、管理等操作,带来很大的额外成本和使用风险。诸如伪造、信用卡诈骗、盗刷、转账等安全事件屡见不鲜。
很自然的,如果能实现一种数字货币,保持既有货币的这些特性,消除纸质货币的缺陷,无疑将带来巨大的社会变革,极大提高经济活动的运作效率。
比特币是首次从实践意义上实现了一套去中心化的数字货币系统。
最早区块链技术雏形出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了近八年时间,支持了海量的交易记录,并未出现严重的漏洞。
公认的最早关于区块链的描述性文献是中本聪所撰写的「比特币:一种点对点的电子现金系统」,但该文献重点在于讨论比特币系统,实际上没有明确提出区块链的定义和概念。在其中,区块链被描述为用于记录比特币交易的账目历史。
从记账的角度来看,区块链是首个自带对账功能的数字记账技术实现。
区块链的基本概念包括:
如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。
区块链不是数据库。虽然区块链也可以用来存储数据,但它要解决的问题是多方的互信问题。单纯从存储数据角度,它的效率可能不高,笔者也不推荐把大量的原始数据放到区块链上。区块链不是要颠覆现有技术,作为基于多项已有技术而出现的新事物,区块链跟现有技术的关系是一脉相承的。
现代商业的典型模式为,交易方通过协商和执行合约,完成交易过程。区块链擅长的正是如何管理合约,确保合约的顺利执行。
从技术特点上,区块链一般被认为具有:
随之带来的业务特性将可能包括:
区块链并非凭空诞生的新技术,更像是技术演化到一定程度突破应用阈值后的产物,因此,其商业应用场景也跟促生其出现的环境息息相关。基于区块链技术,任何基于数字交易的活动成本和追踪成本都会降低,并且能提高安全性。笔者认为,能否最终带来成本的降低,将是一项技术能否被深入应用的关键。
区块链系统跟传统的分布式系统不同,其处理性能无法通过单纯增加节点数来进行扩展,实际上,很大程度上取决于单个节点的处理能力。高性能、安全、稳定性、硬件辅助加解密能力,都将是考察节点性能的核心要素。
世界上并没有绝对安全的系统。系统是由人设计的,系统也是由人来运营的,只要有人参与的系统,就容易出现漏洞。
最早出现的未必是先驱,也可能是先烈。创新固然很好,但过早播撒的种子,没有合适的土壤,往往也难长大。技术创新与科研创新很不同的一点便是,技术创新必须立足于需求,过早过晚都会错失良机。科研创新则要越早越好,最好像二十世纪那批物理巨匠们一样,让后人吃了一百多年老本。
根据参与者的不同,可以分为公开链、联盟链和私有链。
从功能上看,可以分为以货币交易为主的初代区块链(如比特币网络)、支持智能合约的二代区块链(如以太坊网络)、面向复杂商业应用场景支持链上代码的新一代区块链或分布式账本(如超级账本)。
如果一个分布式系统无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。
将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。
理想的分布式系统一致性应该满足:
绝对理想的强一致性代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,超强的一致性要求往往意味着越弱的性能。
强一致性主要包含:顺序一致性、线性一致性。
强一致性的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性,即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性。
实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。
共识算法解决的是对某个提案,大家达成一致意见的过程。
搞学术的人都喜欢对问题先确定一个界限,那么,这个问题的最坏界限在哪里呢?很不幸,一般情况下,分布式系统的共识问题无解。
当节点间网络不可靠时,很显然,无法确保实现共识。然而,即便在网络通信可靠的情况下,一个可扩展的分布式系统的共识问题的下限是无解。
这个结论,被称为 FLP 不可能性 原理,可以看做分布式领域的“测不准原理”。
FLP 不可能原理:在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性算法。
FLP 不可能原理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法。
但,学术界做研究,考虑的是数据和物理意义上极端的情形,很多时候现实生活要美好的多。科学告诉你什么是不可能的;工程则告诉你,付出一些代价,我可以把它变成可能。这就是工程的魅力。
科学上告诉你去赌场赌博从概率上总会是输钱的;工程则告诉你,如果你愿意接受最终输钱的结果,中间说不定偶尔能小赢几笔呢!?
在付出一定代价的情况下,我们能做到多少?回答这一问题的另一个很出名的原理:CAP 原理。
分布式系统不可能同时确保一致性(Consistency)、可用性(Availability)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证。
Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。
Paxos 能保证在超过 1/2 的正常节点存在时,系统能达成共识。
Paxos 存在两个阶段:准备(prepare)阶段和提交(commit)阶段。准备阶段解决大家对哪个提案进行投票的问题,提交阶段解决最终值的问题。
Raft 算法是 Paxos 算法的一种简化实现。
拜占庭问题更为广泛,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的一致性达成问题。
拜占庭算法讨论的是最坏情况下的保障。
面向拜占庭问题的容错算法,解决的是网络通信可靠,但节点可能故障情况下的一致性达成。
1 | 以函数来表示,将军的总数为 n,n 里面背叛者的数量为 t,则只要 n > 3t 就可以容错。 |
拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但一旦确认,即为最终确认。
比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work)算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。
后来的各种 PoX 系列算法,也都是沿着这个思路进行改进,采用经济上的惩罚来制约破坏者。
指标 | 概率可靠性 | 每年允许不可用时间 | 典型场景 |
---|---|---|---|
1个9 | 90% | 1.2 月 | 不可用 |
2个9 | 99% | 3.6 天 | 普通单点 |
3个9 | 99.9% | 8.6 小时 | 普通企业 |
4个9 | 99.99% | 51.6 分钟 | 高可用 |
5个9 | 99.999% | 5 分钟 | 电信级 |
6个9 | 99.9999% | 31 秒 | 极高要求 |
7个9 | 99.99999% | 3 秒 | N/A |
8个9 | 99.999999% | 0.3 秒 | N/A |
9个9 | 99.9999999% | 30 毫秒 | N/A |
依靠单点实现的可靠性毕竟是有限的,要想进一步的提升,那就只好消灭单点,通过主从、多活等模式让多个节点集体完成原先单点的工作。这可以从概率意义上改善服务的可靠性,也是分布式系统的一个重要用途。
Hash(哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能使任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
一个优秀的 Hash 算法,将能实现:
一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。也有一些 Hash 算法不是算力敏感的, 例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多的 CPU 来获得 hash 性能的提升。
数字摘要是 Hash 算法最重要的一个用途。数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。在网络上下载软件或文件时,往往同时会提供一个数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确保内容没有被修改过。
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文;解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。
类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。
数字证书用来证明某个公钥是谁的,并且内容是正确的。
对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。怎么确保一个公钥确实是某个人的原始公钥?这就需要数字证书机制。
顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发,权威的 CA 包括 Verisign 等。
在非对称加密中,公钥则可以通过证书机制来进行保护,如何管理和分发证书则可以通过 PKI (Public Key Infrastructure)来保障。顾名思义,PKI 体系在现代密码学应用领域处于十分基础的地位,解决了十分核心的证书管理问题。
一般情况下, PKI 至少包含如下组件:
常见的流程为,用户通过 RA 登记申请证书,CA 完成证书的制造,颁发给用户。用户需要撤销证书则向 CA 发出申请。
默克尔树(哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶子节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。
默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。
与同态加密相关的一个问题是函数加密。
同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。
做设计,很多时候都是在权衡(trade-off)。
比特币项目是区块链技术首个大规模的成功应用,并且是首个得到实践检验的数字货币实现,在金融学和信息技术历史上都具有十分重要的意义。
比特币是基于密码学和经济博弈的一种数字货币,也是历史上首个经过大规模长时间运作检验的数字货币系统。
基于经济博弈原理。
在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。
一个典型的例子
两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么指定规则才公平?
最简单的一个方案是负责切蛋糕的人后选。
比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉默成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。
比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。
因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。
从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140 年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。
目前,Proof of 系列中比较出名的一致性协议包括 PoW 和 PoS,都是通过经济惩罚来限制恶意参与。
PoW
工作量证明, Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题。保证在一段时间内,系统中只能出现少数合法提案。同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最长链上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。
超市付款需要排成一队,可能有人不守规矩要插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。只要大部分人不傻,就会自觉在最长的队伍上排队。
PoS
权益证明,Proof of Stake,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权。
比特币的区块链机制自身提供了很好的可信保障,但是很慢;另一方面考虑,对于大量的小额交易来说,是否真实需要这么高的可信性?闪电网络通过智能合约来完善链下的交易渠道。
核心概念:
RSMS(Recoverable Sequence Maturity Contract):解决链下交易确认的问题。
中文可翻译为“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,就是类似准备金机制。
HTLC(Hashed Timelock Contract):解决了支付通道的问题。
中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。
RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。整合这两种机制,就可以实现任意两个人之间的交易都可以在链下完成了。
在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。
允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。
君子和而不同。
以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约( Smart Contract )。
根据以太坊官方的宣称,以太坊( Ehtereum )目标是打造成一个运行智能合约的去中心化平台( Platform for Smart Contract ),平台上的应用按程序设定运行,不存在停机、审查、欺诈、第三方人为干预的可能。
以太坊平台由 Golang、C++、Python 等多种编程语言实现。
当然,为了打造这个平台,以太坊提供了一条公开的区块链,并制定了面向智能合约的一套编程语言。智能合约开发者可以在其上使用官方提供的工具来开发支持以太坊区块链协议的应用(即所谓的 DAPP )。
目前采用了 PoW 作为一致达成保证,未来可能迁移到 PoS 上。
设计核心思想是通过经济激励机制防止少数人作恶:
以太坊未来希望通过分片机制可以提高整个网络的扩展性。
分片之前整个网络的处理取决于单个节点的处理。分片后,只有同一片内的处理是同步的、一致的,不同分片之间则可以是异步的。
Hyperledger 项目是首个面向企业的开放区块链技术的重要探索。在 Linux 基金会的支持下,吸引了包括 IBM、Intel、摩根等在内的众多科技和金融巨头的参与。
该项目的出现,实际上宣布区块链技术已经不再是仅面向“社会实践”性质的应用场景,它已经正式被主流机构和企业市场认可;同时,Hyperledger 首次提出和实现的完备权限管理、创新的一致性算法和可插拔、可扩展的框架,对于区块链相关技术和产业的发展都将产生深远的影响。
懒惰和好奇,是创新与进步的源泉。
云的出现,让传统信息行业变得前所未有的便捷。只要云中有的服务,通过简单的几下点击,就可以获得一个运行中的服务实例,节约了大量的研发和运维的时间和成本。
现有的区块链分为三种:私有链、联盟链和公有链。私有链存在于机构内部,必要性较低,且在性能上弱于现有的分布式系统。联盟链建立在多个联盟机构之间,每个联盟成员之间各自拥有一个核心节点。公有链向社会开放,可以用于信息认证、公共资源共享。任何团体或个人可以加入公有链。
目前,业界已经开始有少数区块链前沿技术团队开发了区块链即服务( Blockchain as a Service,BaaS )的平台。根据上述划分,BaaS 平台可以面向用户群体提供联盟链及公开链两种服务,并根据不同的服务类型进行不同的结构设计及优化。
(完)
本文主要摘自「数学之美」(第二版)的关键内容,摘取内容与原书相比肯定不够全面。如果对此书内容感兴趣,强烈建议阅读原书。
以下为摘取内容(为了辅助说明,部分内容同时引用了相关网络资源,均有出处链接):
文字和语言与数学,从产生起原本就有相通性,虽然它们的发展一度分道扬镳,但是最终还是能走在一起。
人类对机器理解自然语言的认识走了一条大弯路。早起的研究中采用基于规则的方法,虽然解决了一些简单的问题,但是无法从根本上将自然语言理解实用化。直到多年以后,人们开始尝试基于统计的方法进行自然语言处理,才有了突破性进展和实用的产品。
统计语言模型是自然语言处理的基础,并且被广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼写纠错、汉字输入和文献查询。
中文分词是中文信息处理的基础,它同样走过了一段弯路,目前依靠统计语言模型已经基本解决了这个问题。
隐含马尔可夫模型最初应用于通信领域,继而推广到语音和语言处理中,成为连接自然语言处理和通信的桥梁。同时,隐含马尔可夫模型也是机器学习的主要工具之一。
隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。
在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。每一个状态在可能输出的符号上都有一概率分布。因此输出符号的序列能够透露出状态序列的一些信息。
信息是可以量化度量的。信息熵不仅是对信息的量化度量,也是整个信息论的基础。它对于通信、数据压缩、自然语言处理都有很强的指导意义。
作为现代自然语言处理的奠基者,贾里尼克教授成功地将数学原理应用于自然语言处理领域中,他的一生富于传奇色彩。
布尔代数虽然非常简单,却是计算机科学的基础,它不仅把逻辑和数学合二为一,而且给了我们一个全新的视角看待世界,开创了数字化时代。
互联网搜索引擎在建立索引前需要用一个程序自动地将所有的网页下载到服务器上,这个程序称为网络爬虫。它的编写是基于离散数学中图论的原理。
图论:图由一些节点和连接这些节点的弧组成。网络爬虫基于图论进行网页下载。
PageRank:网页民主排名。
核心思想为:如果一个网页被很多网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高。
TF-IDF:网页与查询相关性度量。
阮一峰的网络日志『TF-IDF与余弦相似性的应用(一):自动提取关键词』
第一步,计算词频。
考虑到文章有长短之分,为了便于不同文章的比较,进行“词频”标准化。
词频(TF)= 某个词在文章中的出现次数 / 文章总词数
第二步,计算逆文档频率。
这时,需要一个语料库(corpus),用来模拟语言的使用环境。
逆文档频率(IDF)= log(语料库的文档总数 / 包含该词的文档数 + 1)
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近 0 。分母之所以要加 1,是为了避免分母为 0(即所有文档都不包含该词)。log表示对得到的值取对数。
第三步,计算 TF-IDF。
TF-IDF = 词频(TF) * 逆文档频率(IDF)
可以看到,TF-IDF 与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。
地图和本地服务中要用到有限状态机和动态规划技术。这两项技术是机器智能和机器学习的工具,它们的应用非常广泛,还包括语音识别、拼写和语法纠错、拼音输入法、工业控制和生物的序列分析等。
「地址」是种有限状态机,导航的关键算法是图论中的动态规划。
有限状态机(Finite-State Machine,FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程、编译器、网络协议和计算与语言的研究。
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
辛格做事的哲学:先帮助用户解决 80% 的问题,再慢慢解决剩下的 20% 问题,是在工业界成功的秘诀之一。
计算机虽然读不懂新闻,却可以准确地对新闻进行分类。其数学工具是看似毫不相干的余弦定理。
阮一峰的网络日志『TF-IDF与余弦相似性的应用(二):找出相似文章』
因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。
余弦值越接近 1,就表明夹角越接近 0 度,也就是两个向量越相似,这就叫“余弦相似性”。
- 使用 TF-IDF 算法,找出两篇文章的关键字;
- 每篇文章各取出若干个关键词(比如 20 个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);
- 生成两篇文章各自的词频向量;
- 计算两个向量的余弦相似度,值越大就表示越相似。
“余弦相似性”是一种非常有用的算法,只要是计算两个向量的相似程度,都可以采用它。
无论是词汇的聚类还是文本的分类,都可以通过线性代数中矩阵的奇异值分解来进行。这样一来,自然语言处理的问题就变成了一个数学问题。
世间万物都有一个唯一标识的特征,信息也是如此。每一条信息都有它特定的指纹,通过这个指纹可以区别不同的信息。
密码学的根本是信息论和数学。没有信息论指导的密码是非常容易被破解的。只有在信息论被广泛应用于密码学后,密码才真正变得安全。
搜索引擎中排名靠前的网页也未必是有用的网页。消除这些作弊网页的原理和通信中过滤噪音的原理相同。
正确的数学模型在科学和工程中至关重要,而发现正确模型的途径常常是曲折的。正确的模型在形式上通常是简单的。
最大熵模型是一个完美的数学模型。它可以将各种信息整合到一个统一的模型中,在信息处理和机器学习中有着广泛的应用。它在形式上非常简单、优美,而在实现时需要有精深的数学基础和高超的技巧。
汉字的输入过程本身就是人和计算机之间的通信。好的输入法会自觉或不自觉地遵循通信的数学模型。当然要做出最有效的输入法,应当自觉使用信息论做指导。
将自然语言处理从基于规则的研究方法转到基于统计的研究方法上,宾夕法尼亚大学的教授米奇·马库斯功不可没。他创立了今天在学术界广泛使用的 LCD 语料库,同时培养了一大批精英人物。
判断一个元素是否在一个集合中,布隆过滤器是计算机工程中解决这个问题最好的数学工具。
贝叶斯网络是一个加权的有向图,是马尔可夫链的扩展。而从认识论的层面看:贝叶斯网络克服了马尔可夫链那种机械的线性约束,它可以把任何有关联的事件统一到它的框架下面。它在生物统计、图像处理、决策支持系统和博弈论中都有广泛的使用。
条件随机场是计算联合概率分布的有效模型,而句法分析似乎是英文课上英语老师教的东西,这两者有什么联系呢?
维特比算法是现代数字通信中使用最频繁的算法,同时也是很多自然语言处理的解码算法。可以毫不夸张地讲,维特比是对我们今天生活的影响力最大的科学家之一。因为如今基于 CDMA 的 3G 移动通信标准主要就是他创办的高通公司制定的。
只要有一些训练数据,再定义一个最大化函数,采用 EM 算法,利用计算机经过若干次迭代,就可以得到所需要的模型。这实在是太美妙了,这也许是我们的造物主刻意安排的。所以我把它称作上帝的算法。
逻辑回归模型是一种将影响概率的不同因素结合在一起的指数模型,它不仅在搜索广告中起着重要的作用,而且被广泛应用于信息处理和生物统计中。
Google 颇为神秘的云计算中最重要的 MapReduce 工具,其原理就是计算机算法中常用的“各个击破”算法,它的原理原来这么简单——将复杂的大问题分解成很多小问题分别求解,然后再把小问题的解合并成原始问题的解。由此可见,在生活中大量用到的、真正有用的方法常常都是简单朴实的。
Google 大脑并不是一个什么都能思考的大脑,而是一个很能计算的人工神经网络。因此,与其说 Google 大脑很聪明,不如说它很能算。不过,换个角度来说,随着计算能力的不断提高,计算量大但简单的数学方法有时能够解决很复杂的问题。
如果说在过去的 40 年里,主导全球 IT 产业发展的是摩尔定律,那么在今后的 20 年里,主导 IT 行业继续发展的动力则将来自于数据。
下载页面:https://dev.mysql.com/downloads/mysql/
本文使用的版本下载链接:
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-winx64.zip
将下载的zip文件解压到指定的路径,如:D:\Softwares\mysql-5.7.20-winx64,以下以 [MYSQL_DIR] 代替。
1 | cd [MYSQL_DIR]/bin |
初始化
1 | > mysqld --initialize --user mysql --console |
执行成功后会生成一个临时密码:
A temporary password is generated for root@localhost:
WjdKaOdBt5+0
安装
1 | > mysqld -install |
Service successfully installed.
启动服务
1 | > net start mysql |
MySQL 服务正在启动.
MySQL 服务已经启动成功.
登录
1 | > mysql -u root -p |
Enter password:输入上面生成的临时密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20
修改密码
1 | mysql> alter user root@localhost identified by "root"; |
Query OK, 0 rows affected (0.00 sec)
(完)
本文是对官方原文的理解翻译,利于自己更好的理解 RocketMQ。
Producer 将业务应用系统生成的消息发送到 Broker。RocketMQ 提供多种发送模式:同步、异步和单向。
相同角色的 Producer 会组织在一起。当原有的 Producer 在交易之后崩溃时,Broker 会协调同一组内不同的 Producer 完成相应事务的提交或回退。
注意:每个 Producer 组只会允许一个实例,以避免不必要的实例初始化。
Consumer 从 Broker 拉取消息并将其提供给应用程序。从应用的角度来看,有两种类型的 Consumer:
PullConsumer 从 Broker 拉取消息。当消息被拉取后,应用程序启动相应的消费处理程序。
PushConsumer 封装了消息拉取、消耗进度及其他维护工作,提供一个回调接口用于在消息最终到达时实现业务逻辑处理。
类似上面提到的 Producer Group,相同角色的 Consumer 会组织在一起并命名为 Consumer Group。
Consumer Group 是一个很好的概念,在消息消费方面实现负载均衡和容错目标是非常容易的。
注意:Consumer Group 中的Consumer 实例必须有完全相同的主题订阅。
Topic 是一个类别,用于 Producer 传递消息和 Consumer 拉取消息。Topic 与 Producer 和 Consumer 之间的关系是松散的。
具体来说,一个 Topic 可以由零个、一个或多个 Producer 向它发送消息;相反地,一个 Producer 能够发送消息到不同的 Topic。
从 Consumer 的角度来看,一个 Topic 可以由零个、一个或多个 Consumer Group 订阅。同样, 一个 Consumer Group 可以订阅一个或多个 Topic,只要这个组内保持订阅的一致。
Message 是要传递的信息。一个消息必须有一个主题,就像信件的邮件地址一样。
一个消息可能包含可选的标签和额外的键值对。例如,你可能给消息设置一个业务密钥,能够在 Broker 上查找消息,在开发时期进行问题诊断。
Topic 被分为一个或多个子主题,称为“消息队列”。
Tag ,为用户提供额外的灵活性。使用 Tag ,来自相同的业务模块具有不同目的的消息,可能具体相同的主题和不同的标签。Tags 能够有助于保持代码的整洁与连贯,并且 Tags 也可以方便 RoketMQ 提供的查询系统。
Broker 是 RocketMQ 系统的主要组件。它接收来自 Producers 的消息、存储他们并准备处理来自 Consumers 的请求。同时它还存储消息相关的元数据,包含 Consumer Groups,消费进度偏移和主题/队列信息。
Name Server 提供路由信息。Producer 和 Consumer 客户端查找主题以获取相应的 Broker 列表。
当使用 DefaultMQPushConsumer 时,你可以决定是有序的或并发的。
有序的
有序的消费消息意味着 Consumer 按照 Producer 发送的消息顺序进行消费。如果处理需要强制使用全局顺序的情况,请确保使用的主题只有一个消息队列。
如果指定有序消费,则消费消息的最大并发数是订阅消息的消费者组数量。
并发的
当消费消息是并发的,消费消息的最大并发数受限于为每个消费者指定的线程池。
在这种模式下,不再保证消息的顺序。
本文实践环境说明:Windows 10 专业版,JDK 1.8.0_65。
http://rocketmq.apache.org/dowloading/releases/
解压 rocketmq-all-4.1.0-incubating-bin-release.zip
到 <rocketmq-installed-dir>
启动 NameServer
1 | %ROCKETMQ_HOME%/bin/mqnamesrv -n 127.0.0.1:9876 >E:\logs\mqnamesrv.log |
The Name Server boot success. serializeType=JSON
启动 Broker
1 | %ROCKETMQ_HOME%/bin/mqbroker -n 127.0.0.1:9876 >E:\mqbroker.log |
配置环境变量: NAMESRV_ADDR
-> 127.0.0.1:9876
发送消息
1 | %ROCKETMQ_HOME%/bin/tools org.apache.rocketmq.example.quickstart.Producer |
SendResult [sendStatus=SEND_OK, msgId=0A00BF859C787EA987AC2DCBCA8A0354, offsetMsgId=0A00BF8500002A9F00000000000256A2, messageQueue=MessageQueue [topic=TopicTest, brokerName=Dawn, queueId=0], queueOffset=213]
SendResult [sendStatus=SEND_OK, msgId=0A00BF859C787EA987AC2DCBCA8C0355, offsetMsgId=0A00BF8500002A9F0000000000025756, messageQueue=MessageQueue [topic=TopicTest, brokerName=Dawn, queueId=1], queueOffset=213]
SendResult [sendStatus=SEND_OK, ……
接收消息
1 | %ROCKETMQ_HOME%/bin/tools org.apache.rocketmq.example.quickstart.Consumer |
ConsumeMessageThread_2 Receive New Messages: [MessageExt [queueId=1, storeSize=180, queueOffset=249, sysFlag=0, bornTimestamp=1510233930866, bornHost=/10.0.191.133:10130, storeTimestamp=1510233930867, storeHost=/10.0.191.133:10911, msgId=0A00BF8500002A9F000000000002BC96, commitLogOffset=179350, bodyCRC=1102156316, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TopicTest, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1510233997434, UNIQ_KEY=0A00BF859C787EA987AC2DCBCC7203E5, WAIT=true, TAGS=TagA}, body=18]]]
ConsumeMessageThread_1 Receive New Messages: [MessageExt [queueId=1, storeSize=180, queueOffset=248, sysFlag=0, bornTimestamp=1510233930852, bornHost=/10.0.191.133:10130, storeTimestamp=1510233930854, storeHost=/10.0.191.133:10911, …
停止 Broker
1 | %ROCKETMQ_HOME%/bin/mqshutdown broker |
killing broker
成功: 已终止 PID 为 42376 的进程。
Done!
停止 NameServer
1 | %ROCKETMQ_HOME%/bin/mqshutdown namesrv |
killing name server
成功: 已终止 PID 为 39464 的进程。
Done!