原文

接口是什么?

在面向对象的世界中,接口的意思是:“接口定义了对象的行为”。它只表明对象应该能做什么,而具体怎么做则由对象内部实现。

Go语言中,接口是方法的集合,若某个类型实现了接口中定义的所有方法,则可以说这个类型实现了这个接口。用OOP的形式来说就是: 接口表明了类型应该有哪些方法,而类型则决定如何实现那些方法

比如,WashingMachine这个接口中可以定义Cleaning()Drying()方法,任何类型实现了这2个方法都可以说是实现了WashingMachine接口。

阅读全文

原文,需要科学上网。省略了一些无关的内容。

上篇文章我们学习了如何编写区块链并且对进行Hash运算和验证,但所有都运行在一个节点。我们如何让其他的节点连接到我们的主节点并让这些新节点贡献新区块呢?并且,我们如何通知所有的节点区块链有更新呢?

这篇文章将进行就解答。

工作流

bk1

  • 第一个终端负责创建创世块和TCP服务以便新节点可以连接它

第一步

  • 打开一个新终端并使用TCP连接到第一个终端
  • 向第一个终端添加一个新区块

第二步

  • 第一个终端对区块进行验证
  • 第一个终端对所有节点进行广播通知有新区块生成

第三步

  • 所有终端都有同步后的新区块链

完成这篇文章后,尝试:让每个新终端都和第一个终端一样,有自己的TCP端口让其他节点连接,组成一个真实的网络!
阅读全文

原文,需要科学上网。省略了一些无关的内容。

世界上很多开发者听说过区块链却不知道它是怎么工作的,他们或许仅仅听过比特币或者智能合约一类的名词。这篇文章尝试用简明的语言说明区块链并且用不到200行的代码来实现你自己的区块链!文章的最后,你应该可以运行并且添加区块到区块链中并从浏览器中看到结果。

有什么学习区块链的方法比你亲自实现一个更好呢?

文章讲了什么

  • 如何创建自己的区块链
  • 如何使用Hash来维护区块链的完整性
  • 如何添加新区块
  • 如何解决多个节点同时生成区块导致冲突问题
  • 如何在浏览器中查看区块链
  • 如何生成新区块
  • 了解区块链的基础知识后,你可以决定你的未来发展方向

文章没讲什么

为了保持简单,我们并没介绍更高级的概念比如pow和pos的对比,我们模拟了网络交互所以你可以看到区块链并且添加区块,但网络广播部分将以后再讲。

阅读全文

区块链学习笔记1

发布在 区块链

区块链不等于XX币!

区块链不等于XX币!

区块链不等于XX币!

区块链本质是一种 去中心化的不可修改的分布式数据库核心要解决的是信任问题。 根据场景可以分为3类:

  1. 公开链
  2. 私有链
  3. 联盟链

著名的BTC以及各种XX币大多都是基于公开链的第一代应用,而以太坊(Ethereum)则更进一步,可以说是第二代的区块链应用。基于以太坊,更是诞生了智能合约(Smart contracts)应用,大大简化了编写区块链应用的难度。

而联盟链,现在最火的就是Linux基金会旗下的超级账本(hyperledger)了,相对而言,我个人更看好这个。另外还有个叫做闪电网络的(个人觉得这货有点类似于资金池,略有违背去中心化的初衷),也值得关注。

阅读全文

原文链接,省略了一些无关的句子。

这里有别人翻译好的,需要翻墙。

介绍

Go是一种新的语言,尽管它从其他语言中借鉴了很多特性,但有些不同寻常的特性让Go语言程序和其他程序有所不同。想要直接把C++或者Java代码转换成Go不会得到令人满意的结果,Java程序是用Java写的而不是GO。另一方面,从GO的角度来考虑问题可以写出成功运行但略有不同的程序。换句话说,想要写出好的GO程序,了解其特性是很重要的。同样,了解约定俗成的惯例也很重要,比如命名、格式、项目结构,这样你写的代码才能方便其他GO语言程序员理解。

这篇文档给你一些小建议以便写出简洁且符合规范的GO代码。看这篇文档前建议先看language specificationthe Tour of Go,和 How to Write Go Code

例子

GO源码不仅仅是作为核心库来使用,更可以用作写代码的实例参考。此外,你可以直接在官网上运行那些没有额外依赖的程序,比如这个。如果你有关于如何解决或实现某个问题的疑问,标准库中的文档、代码、例子可以提供答案或者思路。

阅读全文

首先从官网下载源码进行安装:

1
2
3
4
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf redis-3.2.1.tar.gz
make && make test
sudo make install

默认安装到/usr/local/bin目录。

阅读全文

python验证码识别实战2

发布在 Python

上一篇文章中,我们使用sklearn对验证码进行了识别,为了提高识别率,今天来进行进一步优化。

观察验证码后,发现还可以对其进行旋转处理,这个验证码旋转角度在-30~30之间,那么如何判断旋转角度呢?这里我使用最简单粗暴的判断方式——如果旋转后的字符宽度小于旋转之前,则认为是合理的旋转。但这里还有一个问题需要处理,上一篇文章中我们为了简便直接根据固定的宽度对字符进行了分割,但是分割后字符在小图片中的位置不是固定的,需要手动将其放在中心位置。

阅读全文

python验证码识别实战

发布在 Python

陆陆续续的学习了验证码的灰度、二值化、分割等方法,还了解了机器学习中最基本的3个分类方式——KNN、决策树、朴素贝叶斯。基于这些,今天结合这些工具来写一个简单的验证码识别程序,本来想使用现有的库来生成验证码,但无意间发现了之前写某个程序时下载的200个验证码,正好可以拿来练手。另外,虽然之前已经实现了上面3种算法,但这里还是会使用sklearn这个强大的三方库,学习原理是为了知其所以然,有现成工具还是要拿来用的。

阅读全文

朴素贝叶斯

发布在 Python, 机器学习

朴素贝叶斯是贝叶斯决策理论的一部分,贝叶斯概率引入先验知识和逻辑推理来处理不确定命题。又可以称为“条件概率”(Conditional probability),与之相对的则是“频数概率”(frequency probability)。

强烈推荐看阮一峰大牛的这篇文章,看完基本贝叶斯就明白了。

我们把\(P(A|B)\)称为在B条件下A的概率,若只有A、B两个事件那么\(P(A|B)= {P(AB) \over P(B)} \) 。

全概率 公式:
$$P(B)=P(B|A)P(A) + P(B|\overline A)P(\overline A) $$

贝叶斯 公式:

$$P(A|B)={P(B|A) × P(A) \over P(B)}$$

对公式进行变形:

$$P(A|B)={P(A){P(B|A) \over P(B)}}$$

这里称P(A)为先验概率(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。P(A|B)称为后验概率(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。P(B|A) / P(B) 称为可能性函数(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

这里以贝叶斯界的”Hello World”为例,判断某种疾病患病概率问题:

已知某种疾病的发病率是0.001,即1000人中会有1个人得病。现有一种试剂可以检验患者是否得病,它的准确率是0.99,即在患者确实得病的情况下,它有99%的可能呈现阳性。它的误报率是5%,即在患者没有得病的情况下,它有5%的可能呈现阳性。现有一个病人的检验结果为阳性,请问他确实得病的可能性有多大?

我们假定阳性概率为P(B),发病的概率为P(A)=0.001,则没得病的概率\(P(\overline A)\)=0.999,确实得病且阳性概率为P(B|A)=0.99,没患病但阳性\(P(B|\overline A)\)=0.05,那么我们要求的问题就是P(A|B)了。

结合上面提到的全概率公式和贝叶斯公式,可以计算出他确实得病的概率仅为0.019,即“假阳性”。

如果把问题改成检验结果为阴性,问其患病的可能性。

我们假定阴性概率为P(B),发病的概率为P(A)=0.001,没得病的概率\(P(\overline A)\)=0.999,确实得病但阴性概率为P(B|A)=0.01,没患病且阴性\(P(B|\overline A)\)=0.95,那么检查为阴性但患病的概率就是:

$$P(A|B)={0.001×0.01 \over {0.01×0.001 + 0.95×0.999}} \approx 0.000011 $$

即便阴性也是有患病几率的,但概率十分低。

还有一个重要的公式叫做 联合概率 ,作用就是在已知多个事件发生的情况下,另一个事件发生的概率:

$$P ={ {P_1P_2…P_n } \over { {P_1P_2…P_n}+{(1-P_1)(1-P_2)…(1-P_n)} } } $$

阅读全文

原文地址,向原作者表示感谢。

我们在Mapado的工作就是收集世界上所有“要做的事”。

为了得到大量数据,我们抓取整个网络,就像Goole做的那样,搜集所有关于演唱会、演出、访问、景点……当我们发现一个有趣的页面,我们就尝试从这个页面提取“好”的数据。

我们面临的一个主要挑战就是如何从垃圾信息中(广告、导航栏、页脚、相关内容……)分离我们感兴趣的内容(标题、简介、图片、日期……)

在这个挑战中,一个任务就是重组在视觉上相近的内容。通常,组成页面主要部分的元素相互之间距离是很近的。

当我们开始进行任务时,很天真的以为可以操作DOM来实现。在DOM中,元素以层级结构存储,所以在同一个父元素中的元素很大可能是相关的。

一个非常有趣的介绍页面分割的论文可以在这里找到 Page Segmentation by Web Content Clustering

阅读全文
作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China