月度归档:2017年07月

比特币和区块链技术

一、去中心化
在介绍比特币和区块链技术之前,我们先来看两个日常生活中很常见的交易场景。

  • 实物交易
    水果店的老板卖水果给顾客,顾客付了钱之后得到苹果,一手交钱一手交货,交易完成。仔细想想你会发现这笔交易是完全基于老板和顾客之间的,并没有第三方参与。道理很简单,因为双方都是面对面交易的,苹果怎么样,给了多少钱,双方都是亲眼所见的,是否满意当场就可以判断出来,所以不需要第三方监督。
  • 虚拟物品交易
    但是在电子货币时代这一切就没那么简单了,比如用户A要从自己的银行账户转账给用户B,这笔看似只有A和B参与的交易其实并不只有他们两,还有一个隐形的第三方参与者:银行。假如没有银行的监督,我们如何知道A的账户里是否有足够的钱转给B?我们如何知道A在给B转账的同时有没有转给C?这一切都需要第三方的监督,换句话说,这笔交易只有在被银行认可之后才会生效,银行是一切交易的中心。所以从本质上来说,银行对每个人的账户拥有至高无上的权限,只要它想,它就可以对账户做一切它想做的事,而且这一切操作对外都是不透明的。虽然银行有政府做背书一般不会干这种坏事,但是万一突然遇到个兵荒马乱的时代,那一切都说不准了。[……]

    继续阅读

  • WordPress如何显示数学公式

    这段时间写了几篇machine learning的文章,需要用到很多数学公式,这些文章里所有的数学公式基本都是贴图的,其实这样并不方便,而且很不美观。主要是自己懒,觉得能截图就截图了,感觉在wordpress里编辑数学公式肯定很麻烦,但实际上在wordpress里显示数学公式是一件非常简单的事,出乎意料的简单,连插件都不需要装。我采用的方案是一个基于LaTeX显示数学公式的JavaScript引擎-MathJax-https://www.mathjax.org/,这个JS引擎的优点是全浏览器支持,不需要额外插件设置,非常方便。具体使用步骤如下:

  • 在header.php文件里添加JS引用,具体步骤:登陆wordpress,进入外观->编辑->主题页眉 (header.php)。在head标签里添加一行代码引入MathJax: 值得注意的是,这行代码必须要放到 <?php wp_head(); ?>之前,否则不生效)这里的JS地址用的是MathJax的官方CDN,其实也完全可以把这个MathJ[……]

    继续阅读

  • 解决异常Certificates does not conform to algorithm constraints

    这两天线上一批测试服的环境从JDK7升级到JDK8,上线之后突然不能充值了,后台日志报错如下:

    java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

    这个异常字面的意思就是:在进行SSL握手时,所采用的证书算法不符合约束条件,抛了异常。结合堆栈信息,很快定位到代码层面:是我们游戏充值时要向腾讯的服务器发送一个https请求以获取token,然而因为腾讯服务器所采用的ssl证书算法不符合某种约束条件而抛异常了,从而导致充值异常!那到底什么约束条件呢?网上搜索了一下基本都是让你改这个文件:
    $JAVA_HOME/jre/lib/security/java.security
    把其中的配置项:
    #jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \ DSA keySize < 1024, EC keySize < 224
    改成:
    jd[......]

    继续阅读

    Machine Learning-聚类(Clustering)(二)-主成分分析(PCA)

    一、降维(Dimensionality Reduction)
    我们知道在实际场景中,很多特征向量之间都是有强相关性的,比如有两个特征分别用英尺和平方米来丈量房屋的面积大小,那么这两组数据就 是冗余的(为什么会出现这么明显的冗余?因为在实际场景中会有几百甚至是上千的特征,很难判断两个特征之间是否是冗余的。),我们完全可以使用一个一维的特征变量来表示房屋的面积大小,这就是降维。举个例子:
    2DTo1D
    如上图所示,我们把原来的两个向量x1和x2降维到只是用一个向量z1来使用。更直观的,可以看一个三维降低到二维的例子:
    3DTo2D
    我们可以发现三维空间里离散的点被映射到了一个二维空间平面之中。

    那么为什么要降维呢?

  • 压缩数据,节省存储空间
  • 提高算法执行速度
  • 用于数据可视化,使视图更简洁,更容易发现数据之间的规律
  • 二、主成分分析(Principal Component Analysis)

    1.PCA的数学表达
    在介绍PCA的计算方法和原理之前,我们先了解下PCA主要做的事情是什么,并且用数学语言把它表达出来。看个例子:
    PCA_2DTo1D
    这个例子是把二维的数据降低到一维,它所做的事[……]

    继续阅读

    简单理解KMP算法

    KMP是非常著名的字符串匹配算法,学生时代看了几遍都没有真正理解。偶然的,今天在微博上看到有人在哔哩哔哩上直播讲解KMP,看完之后觉得没讲到点子上,他只是教你怎么使用,却没有说出为什么要这么做。
    网上关于KMP算法的介绍太多了,我就不再写了,可以先看完这几篇文章:
    字符串匹配的KMP算法-阮一峰
    (原创)详解KMP算法-孤影
    KMP算法的Next数组详解-北京小王子
    看完之后感觉自己好像是理解了,但是又总感觉没有真正理解。直到某一个瞬间突然灵光乍现,豁然开朗!我们知道,KMP有个重要的概念是要构造查询串的前缀和后缀,然后通过一个next数组来移动指针,以加快匹配效率。
    但是为什么要构造前缀和后缀呢?
    string_match
    如上图所示,当我我们移动到红圈位置时,发现C和D是不一样的,这时候蛮力的做法就是把下面的字符串一个个往右移,但这样做效率并不高。仔细观察一下会发现:C和D之前的最长公共子序列肯定是一样的(也就是上图的ABCDAB),我们定义上面的为X,下面的为Y。现在想象一下:X不动,Y开始向右移动1个长度,那么匹配的就是X的后5位(BCDAB)和Y的前5位(ABCDA),发现并不匹配。[……]

    继续阅读