但求一缕清风

by’s blog


  • 首页

  • 归档

  • 标签

  • 公益404

  • 搜索
close

区块链入门教程&&比特币入门教程&&加密货币的本质

发表于 2018-01-30   |     |   阅读次数

区块链入门教程

优秀留言:区块链的应用可以渗透到非常多的行业,合同,税收,财产公示(可以含私隐的公示),防伪,交易,选举,信用体系…等等,这些都只是本人想到的,其实也还有更多地方可以去应用,而比特币(泛指去中心加密数字货币)主要应用了财产公示,交易…

1.我又去了解一下coin 居然有狗币

2.以后会需要越来越多的算力,最后还不是被算力大的机构操控(当他有超过50%的算力的时候?)

3.机构与机构之间的竞争,有可能统一吗???

4.我觉得这个用来做公共信用系统还是不错的.还有有没有可能做选举,甚至代表政府(其实大部分人对政治并没有那么上心,政治是很累的事情,人们关心的利益和享受,还不是会被当权人或者掌权人或者财团控制,买取支持,不过经济真的可能去中心化吗,政治也有可能去中心化吗,这已经超出了我的知识边界,不知道如何去思考)

5.现在用这个搞传销的有点火…

作者: 阮一峰

区块链入门教程

比特币入门教程

加密货币的本质

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。

可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。

img

下面,我就来尝试,写一篇最好懂的区块链教程。毕竟它也不是很难的东西,核心概念非常简单,几句话就能说清楚。我希望读完本文,你不仅可以理解区块链,还会明白什么是挖矿、为什么挖矿越来越难等问题。

需要说明的是,我并非这方面的专家。虽然很早就关注,但是仔细地了解区块链,还是从今年初开始。文中的错误和不准确的地方,欢迎大家指正。

一、区块链的本质

区块链是什么?一句话,它是一种特殊的分布式数据库。

img

首先,区块链的主要作用是储存信息。任何需要保存的信息,都可以写入区块链,也可以从里面读取,所以它是数据库。

其次,任何人都可以架设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。

二、区块链的最大特点

分布式数据库并非新发明,市场上早有此类产品。但是,区块链有一个革命性特点。

区块链没有管理员,它是彻底无中心的。其他的数据库都有管理员,但是区块链没有。如果有人想对区块链添加审核,也实现不了,因为它的设计目标就是防止出现居于中心地位的管理当局。

正是因为无法管理,区块链才能做到无法被控制。否则一旦大公司大集团控制了管理权,他们就会控制整个平台,其他使用者就都必须听命于他们了。

但是,没有了管理员,人人都可以往里面写入数据,怎么才能保证数据是可信的呢?被坏人改了怎么办?请接着往下读,这就是区块链奇妙的地方。

三、区块

区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。

img

每个区块包含两个部分。

  • 区块头(Head):记录当前区块的元信息
  • 区块体(Body):实际数据

区块头包含了当前区块的多项元信息。

  • 生成时间
  • 实际数据(即区块体)的 Hash
  • 上一个区块的 Hash
  • …

这里,你需要理解什么叫 Hash,这是理解区块链必需的。

img

所谓 Hash 就是计算机可以对任意内容,计算出一个长度相同的特征值。区块链的 Hash 长度是256位,这就是说,不管原始内容是什么,最后都会计算出一个256位的二进制数字。而且可以保证,只要原始内容不同,对应的 Hash 一定是不同的。

举例来说,字符串123的 Hash 是a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六进制),转成二进制就是256位,而且只有123能得到这个 Hash。

因此,就有两个重要的推论。

  • 推论1:每个区块的 Hash 都是不一样的,可以通过 Hash 标识区块。
  • 推论2:如果区块的内容变了,它的 Hash 一定会改变。

四、 Hash 的不可修改性

区块与 Hash 是一一对应的,每个区块的 Hash 都是针对”区块头”(Head)计算的。

Hash = SHA256(区块头)

上面就是区块 Hash 的计算公式,Hash 由区块头唯一决定,SHA256是区块链的 Hash 算法。

前面说过,区块头包含很多内容,其中有当前区块体的 Hash(注意是”区块体”的 Hash,而不是整个区块),还有上一个区块的 Hash。这意味着,如果当前区块的内容变了,或者上一个区块的 Hash 变了,一定会引起当前区块的 Hash 改变。

这一点对区块链有重大意义。如果有人修改了一个区块,该区块的 Hash 就变了。为了让后面的区块还能连到它,该人必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于后面要提到的原因,Hash 的计算很耗时,同时修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。

正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变。

img

每个区块都连着上一个区块,这也是”区块链”这个名字的由来。

五、采矿

由于必须保证节点之间的同步,所以新区块的添加速度不能太快。试想一下,你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步。因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块。所以,你别无选择,一听到信号,就必须立刻同步。

所以,区块链的发明者中本聪(这是假名,真实身份至今未知)故意让添加新区块,变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。

这种产出速度不是通过命令达成的,而是故意设置了海量的计算。也就是说,只有通过极其大量的计算,才能得到当前区块的有效 Hash,从而把新区块添加到区块链。由于计算量太大,所以快不起来。

这个过程就叫做采矿(mining),因为计算有效 Hash 的难度,好比在全世界的沙子里面,找到一粒符合条件的沙子。计算 Hash 的机器就叫做矿机,操作矿机的人就叫做矿工。

img

六、难度系数

读到这里,你可能会有一个疑问,人们都说采矿很难,可是采矿不就是用计算机算出一个 Hash 吗,这正是计算机的强项啊,怎么会变得很难,迟迟算不出来呢?

原来不是任意一个 Hash 都可以,只有满足条件的 Hash 才会被区块链接受。这个条件特别苛刻,使得绝大部分 Hash 都不满足要求,必须重算。

原来,区块头包含一个难度系数(difficulty),这个值决定了计算 Hash 的难度。举例来说,第100000个区块的难度系数是 14484.16236122。

img

区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target)。显然,难度系数越大,目标值就越小。

img

Hash 的有效性跟目标值密切相关,只有小于目标值的 Hash 才是有效的,否则 Hash 无效,必须重算。由于目标值非常小,Hash 小于该值的机会极其渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。

区块头里面还有一个 Nonce 值,记录了 Hash 重算的次数。第 100000 个区块的 Nonce 值是274148111,即计算了 2.74 亿次,才得到了一个有效的 Hash,该区块才能加入区块链。

七、难度系数的动态调节

就算采矿很难,但也没法保证,正好十分钟产出一个区块,有时一分钟就算出来了,有时几个小时可能也没结果。总体来看,随着硬件设备的提升,以及矿机的数量增长,计算速度一定会越来越快。

为了将产出速率恒定在十分钟,中本聪还设计了难度系数的动态调节机制。他规定,难度系数每两周(2016个区块)调整一次。如果这两周里面,区块的平均生成速度是9分钟,就意味着比法定速度快了10%,因此难度系数就要调高10%;如果平均生成速度是11分钟,就意味着比法定速度慢了10%,因此难度系数就要调低10%。

难度系数越调越高(目标值越来越小),导致了采矿越来越难。

八、区块链的分叉

即使区块链是可靠的,现在还有一个问题没有解决:如果两个人同时向区块链写入数据,也就是说,同时有两个区块加入,因为它们都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?

img

现在的规则是,新节点总是采用最长的那条区块链。如果区块链有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为”六次确认”)。按照10分钟一个区块计算,一小时就可以确认。

img

由于新区块的生成速度由计算能力决定,所以这条规则就是说,拥有大多数计算能力的那条分支,就是正宗的比特链。

九、总结

区块链作为无人管理的分布式数据库,从2009年开始已经运行了8年,没有出现大的问题。这证明它是可行的。

但是,为了保证数据的可靠性,区块链也有自己的代价。一是效率,数据写入区块链,最少要等待十分钟,所有节点都同步数据,则需要更多的时间;二是能耗,区块的生成需要矿工进行无数无意义的计算,这是非常耗费能源的。

因此,区块链的适用场景,其实非常有限。

  1. 不存在所有成员都信任的管理当局
  2. 写入的数据不要求实时使用
  3. 挖矿的收益能够弥补本身的成本

如果无法满足上述的条件,那么传统的数据库是更好的解决方案。

img

目前,区块链最大的应用场景(可能也是唯一的应用场景),就是以比特币为代表的加密货币。下一篇文章,我将会介绍比特币的入门知识。

十、参考链接

  • How does blockchain really work?, by Sean Han
  • Bitcoin mining the hard way: the algorithms, protocols, and bytes, by Ken Shirriff

(完)

比特币入门教程__作者:阮一峰

比特币(bitcoin)诞生于2008年的一篇论文。

一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?

img

但是,狂想居然变成了现实。随后的几年,在全世界无数爱好者的支持下,比特币网络运行起来了,越来越多的人和资本参与,星星之火,终成燎原。刚刚过去的2017年,比特币迎来了爆发式的增长,从年初的1000美元,最高涨到了2万美元,全世界都为之震动,上到政府,下到普通百姓都在关注。事实就是比特币已经并将继续改变世界。

img

新闻媒体往往只关注它的火爆表现,忽视或者无法回答一些基本的问题。

  • 比特币的原理是什么?
  • 为什么这个无人管理的体系可以成功运作?
  • 比特币交易的流程是怎么回事?
  • 它与区块链又是什么关系?

下面,我尝试回答这些问题,希望帮助大家理解比特币。抛开技术细节,还是很容易解释的。

有一点说明,本文只讨论技术问题,不涉及如何投资比特币,更不会预测价格走势。事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。

一、非对称加密

首先,理解比特币,必须理解非对称加密。

你可能听说过这个词,所谓非对称加密,其实很简单,就是加密和解密需要两把钥匙:一把公钥和一把私钥。

img

公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名(更详细的介绍请看《什么是数字签名》)。

现在请设想,如果公钥加密的不是普通的信息,而是加密了一笔钱,发送给你,这会怎样?

首先,你能解开加密包,取出里面的钱,因为私钥在你手里。其次,别人偷不走这笔钱,因为他们没有你的私钥。因此,支付可以成功。

这就是比特币(以及其他数字货币)的原理:非对称加密保证了支付的可靠性。

由于支付的钱必须通过私钥取出,所以你是谁并不重要,重要的是谁拥有私钥。只有拥有了私钥,才能取出支付给你的钱。(事实上,真实的交易流程稍有不同,私钥保证的不是取出支付给你的钱,而是保证只有你能把这些属于你的钱支付出去,详见后文。)

二、比特币钱包

对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。这就是交易匿名性的根本原因,因为没有人知道,那些私钥背后的主人是谁。

所以,比特币交易的第一件事,就是你必须拥有自己的公钥和私钥。

你去网上那些比特币交易所开户,它们会让你首先生成一个比特币钱包(wallet)。这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把钥匙,然后放在钱包里面。

img

根据协议,公钥的长度是512位。这个长度不太方便传播,因此协议又规定,要为公钥生成一个160位的指纹。所谓指纹,就是一个比较短的、易于传播的哈希值。160位是二进制,写成十六进制,大约是26到35个字符,比如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。这个字符串就叫做钱包的地址,它是唯一的,即每个钱包的地址肯定都是不一样的。

img

你向别人收钱时,只要告诉对方你的钱包地址即可,对方向这个地址付款。由于你是这个地址的拥有者,所以你会收到这笔钱。

由于你是否拥有某个钱包地址,是由私钥证明的(具体的证明方法稍后介绍),所以一定要保护好私钥。这是极其重要的,如果你的私钥被偷了,你的比特币也就等于没了,因为他人可以冒用你的身份了,把钱包里面的钱都转走。

同样的,你向他人支付比特币,千万不能写错他人的钱包地址,否则你的比特币就支付到了另一个不同的人了。

三、交易过程

下面,我把整个流程串起来,看看比特币如何完成一笔交易。

一笔交易就是一个地址的比特币,转移到另一个地址。由于比特币的交易记录全部都是公开的,哪个地址拥有多少比特币,都是可以查到的。因此,支付方是否拥有足够的比特币,完成这笔交易,这是可以轻易验证的。

问题出在怎么防止其他人,冒用你的名义申报交易。举例来说,有人申报了一笔交易:地址 A 向地址 B 支付10个比特币。我怎么知道这个申报是真的,申报人就是地址 A 的主人?

比特币协议规定,申报交易的时候,除了交易金额,转出比特币的一方还必须提供以下数据。

  • 上一笔交易的 Hash(你从哪里得到这些比特币)
  • 本次交易双方的地址
  • 支付方的公钥
  • 支付方的私钥生成的数字签名

验证这笔交易是否属实,需要三步。

第一步,找到上一笔交易,确认支付方的比特币来源。

第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。

第三步,使用公钥去解开数字签名,保证私钥属实。

经过上面三步,就可以认定这笔交易是真实的。

四、交易确认与区块链

确认交易的真实性以后,交易还不算完成。交易数据必须写入数据库,才算成立,对方才能真正收到钱。

比特币使用的是一种特殊的数据库,叫做区块链(blockchain),详细的介绍请看《区块链入门教程》。本文只讨论交易如何写入区块链。

首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的 Hash。

img

计算 Hash 的过程叫做采矿,这需要大量的计算。矿工之间也在竞争,谁先算出 Hash,谁就能第一个添加新区块进入区块链,从而享受这个区块的全部收益,而其他矿工将一无所获。

一笔交易一旦写入了区块链,就无法反悔了。这里需要建立一个观念:比特币不存放在钱包或其他别的地方,而是只存在于区块链上面。区块链记载了你参与的每一笔交易,你得到过多少比特币,你又支付了多少比特币,因此可以算出来你拥有多少资产。

五、矿工的收益

交易的确认离不开矿工。为什么有人愿意做矿工呢?

比特币协议规定,挖到新区块的矿工将获得奖励,一开始(2008年)是50个比特币,然后每4年减半,目前(2018年)是12.5个比特币。这也是比特币的供给增加机制,流通中新增的比特币都是这样诞生的。

你可能看出来了,每4年奖励减半,那么到了2140年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。

一个区块的奖励金12.5个比特币,再加上手续费,收益是相当可观的。按照目前的价格,可以达到100万~200万人民币。想想看,运气好的话,几分钟就能挖到一个区块,拿到这样一大笔钱,怪不得人们对挖矿趋之若鹜。

六、区块的扩容

《区块链入门教程》说过,比特币协议规定,平均10分钟诞生一个区块。区块的大小只有 1MB,最多只能包含2000多笔交易。也就是说,比特币网络每10分钟,最多只能处理2000多笔交易,换算一下,就是处理速度为3~5笔/秒。

全世界的比特币交易这么多,可是区块链每秒最多只能处理5笔,这已经成为制约比特币发展的一个瓶颈。

很早就有人呼吁,改革比特币协议,提升处理速度。这件事在2017年8月有了一点眉目,当时区块链发生了一次分叉,诞生了一个新协议,称为 Bitcoin Cash(简称 BCH)。这种新货币其他方面都与比特币一致,就是每个区块的大小从 1MB 增加到了 8MB,因此处理速度提升了8倍,手续费也低得多。该协议是对原有区块链的分叉,因此当时持有比特币的人,等于一人获赠了一份同样数量的 BCH。

img

BCH 等于创造了一种新货币,还有人提议,原始比特币的区块大小提升到 2MB,这称为 SegWit2x 。这个建议原定于2017年11月实施,但是最后一刻由于缺乏共识,就被取消了,目前还在讨论中。

七、点对点网络

比特币是一个全世界的开放网络,只要你有服务器,就能加入这个网络,成为一个节点。每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。

img

当你发生了一笔支付,你所在的节点就会把这笔交易告诉另一个节点,直至传遍整个网络。矿工从网上收集各种新发生的交易,将它们打包写入区块链。一旦写入成功, 矿工所在节点的区块链,就成为最新版本,其他节点都会来复制新增的区块,保证全网的区块链都是一致的。

最后,你所在的节点也拿到了最新的区块链,从而得知你早先的那笔交易,已经写在里面了,至此交易确认成功。

八、还有一个问题

写到这里,我就介绍完了比特币的基本知识,希望你已经明白了比特币是怎么回事。但是还有一个根本的问题,我没有回答:比特币的本质到底是什么?

说到底,比特币只是区块链的一条记录,是凭空生成的,为什么可以当钱用?举例来说,矿工获得12.5个比特币的奖励,其实就是区块链有一个记录:”xxx地址获得12.5个比特币”。正是这行记录,导致该矿工获得了大笔金钱。如果区块链突然增加了一条记录,记载你的地址获得了1000个比特币,你就真的会有1000个比特币。这到底是为什么?

这篇文章已经够长了,这个问题就留到下次再谈,欢迎关注本系列的最后一篇文章《加密货币的本质》。

九、参考链接

  • How Bitcoin works , by Timothy B. Lee
  • Bitcoins the hard way: Using the raw Bitcoin protocol, by Ken Shirriff

(完)

加密货币的本质

去年,比特币暴涨,其他币也像雨后春笋一样冒出来,已经有1000多种了。

很多人都在问,加密货币(cryptocurrency)的时代,真的来临了吗?将来会不会人类不再使用美元、人民币,改用加密货币?那么多品种,我应该使用哪一种币?要不要现在就去投资一些?

img

这些问题的答案,我也想知道,就花了很多时间查阅资料、研究协议。前两周发表的《区块链入门教程》和《比特币入门教程》,是我的学习心得。但是,那两篇教程主要介绍基本概念、探讨协议的可行性,没回答一个根本的问题:加密货币到底是什么?

下面就是我对这个问题的思考。阅读之前,如果你已经了解区块链和比特币,那很好;如果不了解,也没关系,本文不涉及技术,只讨论最基本的原理。

img

一、钱是什么?

我们都知道,人民币是钱,美元是钱,金银财宝是钱。我问一个问题,它们为什么能成为钱?

你可能回答,因为它们有价值,或者是价值的代表。但是,有价值的东西多了,为什么只有这些品种成为了钱?

img

答案很容易想到,因为人们普遍相信(认同)它们的价值,其他东西的价值难以得到普通认同,无法成为钱。比如,邮票的价值就没有普遍的认同,除了集邮爱好者,其他地方都不能当钱用。一般来说,认同的人越多,这种钱的通用性就越高。

img

我曾经去俄罗斯旅行,当地货币是卢布。可是,一旦离开俄国,没人相信它的购买力,所以卢布离开俄国就没用了。相反,全世界人民都相信美元的价值,所以全世界都能用。我用美元付账的时候,我发现那些俄国人都很满意。

img

所以,钱的本质,或者说货币的本质,就是它的可信性。它必须使人们相信,它是有价值的,然后才能成为钱,才能被收藏和支付。

二、可信性

为什么钱必须是可信的?因为对方必须相信它的价值,否则你没法支付出去。那么,接下来的问题就是,可信的东西是否就是钱?

我的回答是 Yes。一样东西能否成为钱,只取决于人们是否相信它的价值,至于它是不是真的有价值,根本不重要。

如果马云在一张纸条上写”这张纸条价值10000元”,下面签了他的名,并且附上防伪标记。你说这纸条是钱吗?我跟你保证,这就是钱,你用来支付,人们都会接受,马云等同于发行了一种新的纸币。

img

比特币也是如此,它是什么,其实不太重要。重要的是,它必须保证自己是可信的,这样才能让足够的人相信它的价值,然后才能成为钱。

三、比特币的可信性

比特币要解决的核心问题,就是创造一种可信的数字凭证。由于这种凭证可信,所以能够当做货币。

比特币的技术基础是加密学,因为只有加密学才能保证它的可信性。一旦加密被破解,它就没法当作货币了。这也是这一类数字凭证被称为”加密货币”的原因。

技术人员对比特币感兴趣,还有一个重要原因。任何需要可靠的数字凭证的场合,也许都可以用到这种技术。

四、比特币的特点

比特币有三个特点,就是因为做到了这三点,所以它可信,能够当作钱。

首先,它不会被(轻易)偷走。或者反过来说,它使得你无法去偷别人,你只能花你自己的钱。因为必须要有别人的私钥,才能取出他的钱。正常情况下,你拿不到别人的私钥。

其次,它无法伪造。每一个比特币都能追溯来源,而所有比特币都来源于矿工获得的奖励。矿工只有新建区块,才能获得奖励,这是很难的事情,所以无法伪造比特币。

最后,它无法大批生成。原因跟上一条一样,比特币的发行速度是稳定的,现在每10分钟新增12.5个,然后每四年减半,最终停止增长。因此不会像纸币那样,政府滥发导致通货膨胀。

五、比特币有实体吗?

由于后面要提到的原因,比特币不可能拥有实体,没法做到”从口袋里掏出一个币”这种场景,交易都必须通过互联网完成。

你可能会说,钱都有实体,怎么可能存在无形的钱呢?答案正好相反,钱就应该是无形的,那些实体的钱其实是对物质材料的浪费,由于技术不够发达,不得不做成实体。

我小时候买东西,都必须用现金,否则没法证明,自己拥有购买力。只有通过实体的钱,才能保证对方确实收到了钱。如果银行业发达,就不用现金了,可以使用银行卡。支付的时候,对方抄一下银行卡号码,查询银行”这个账户有钱吗”。银行回答有钱,OK,成交。

但是,互联网使得实体的银行卡也不需要了。如果存在一个开放的中央记账系统,任何人都可以查询,你把钱划到老板的账户,老板查询一下,发现收到了,交易自动成交,整个过程都是无形的,还需要什么银行卡呢?

img

这个中央记账系统已经实现了,就叫做区块链。

六、区块链的作用

区块链就是一个数据库,记载了所有的交易,用作中央记账系统。

每笔交易的核心,就是一句话,比如”张三向李四转移了1个比特币”。为了证明这句话可信,张三为它加上了数字签名。任何人都可以用张三的公钥,证明这确实是张三本人的行为。另一方面,其他人无法伪造张三的数字签名,所以不可能伪造这笔交易。

矿工们收到这句话,首先验证数字签名的可信性,然后验证张三确实拥有这些比特币(每一笔交易都有上一笔交易的编号,用来查询比特币的来源)。验证通过以后,就着手把这句话写入区块链了。一旦写入区块链,所有人就都可以查询到,因此这笔比特币就被认为,从张三转移到了李四。

img

区块链的作用就是把这句话永久保存下来了,让任何人都可以查看,并且任何人(包括张三本人在内)都无法再修改了。

货币是什么?其实就是这句话。这一句话就完成了一次支付。我们平时用人民币支付,其实只是用纸币表达这条信息。如果每个人都可以实时写入/读取中央记账系统(区块链),那么完全可以不携带货币。

七、双重支出

前面说过,交易不可能被伪造。但是,由于每一笔交易都是一串二进制信号,因此可能被复制。举例来说,”张三向李四转移了1个比特币”这句话,可能被其他人复制,也可能被张三自己复制,提交到区块链。

如果这句话被两次写入区块链,就意味着张三可以把同一笔钱花掉两次。但是,第二次写入的时候,查询区块链可以发现张三已经把这笔钱花掉了,从而认定这是不合法的交易,不能写入区块链。因此,复制交易是不可能的。

比较麻烦的是另一种情况,就是张三把同一笔钱付给两个人。他先向区块链提交一个交易”张三向李四转移了1个比特币”,然后又提交了另一个交易”张三向王五转移了1个比特币”。这两个交易都可能被认为是真实的交易,从而进入区块链。因此,必须有办法防止出现这种情况。

情况一:同一个矿工收到了这两个交易。那么他会察觉到,它们不可能同时成立,因此选择其中的一笔写入区块链。

情况二:矿工 A 收到了第一笔交易,矿工 B 收到了第二笔交易,他们各自都会认定这是合法的交易,分别把这两笔交易写入了两个区块,这时区块链就出现了分叉。

img

比特币协议规定,分叉点之后最先达到6个区块的那个分支,被认定为正式的区块链,其他分支都将被放弃。由于区块的生成速度由计算能力决定,所以到底哪一笔交易最后会被写入区块链,完全由它所在的分支能吸引多少计算能力决定。隐藏的逻辑是,如果大多数人(计算能力)选择相信某一笔交易,那么它就应该是真的。

综上所述,双重支出不可能发生。因为中央记账系统总有办法发现,你把同一笔钱花了两遍。但是,这也说明了比特币的一个代价,就是交易不能实时确认,必须等待至少一个小时。

八、参考链接

  • How the Bitcoin protocol actually works, by Michael Nielsen

(完)

师生关系

发表于 2018-01-24   |     |   阅读次数

师生关系

首先要明确的是, 在这门课中的师生关系是什么样的. 大学目前的师生关系是怎样, 什么样才是理想的师生关系? 我们先看一些例子:

不成关系的蜡烛、春蚕和园丁

一说到老师,很多人就会心情激动,把老师比作燃烧自己的蜡烛,吐丝的春蚕,且不说现在的老师早就不认可这种形象,那么学生是种关系这里面的什么东西呢?另一个比喻是园丁和树苗, 园丁多么崇高啊! 杏坛讲学, 桃李满天下… 其实未必,龚自珍的《病梅馆记》也描述了园丁的不当行为。 当树苗有自己的思想的时候, “树苗”有时候也不喜欢 “园丁”:

   又来给我施肥,剪枝,喷农药!我的枝条就要这样长,你管不着!农药好臭啊,我不要,差评!滚出!

大学生不是植物,而是有自己独立思想、人格的成年人, 他们在这种关系中不是任人摆布的物品。 如果把大学生当作成年人,我们就会进入下面几种比喻的一种:

Retailer / customer (餐馆/食客)?

一些学生说, 我既然交了学费来上学, 就像交了钱去自助餐厅一样, 想吃多少, 想吃什么, 都是我决定. 如果不喜欢, 就去下一个餐厅好了。 上课能这样么? 在饮食行业, 顾客拍拍屁股就可以离开一个餐馆,还可以给餐馆打分,写评论吐槽。在一些学校里, 是有不同的老师上类似的课程, 同学们可以根据老师的介绍和师兄师姐的提醒选择适合自己的老师。但是大家注意到没有,能看到老师分数的学校已经越来越少了,你的学校公布老师的教学评估分数么? 学生和家长有知情权么? 即使有教学评分,学生的 “选课学习” 和 “去餐馆吃饭” 还是不一样的。 食客会赞许 “菜新鲜,量大,菜品质量要求严格!” 但是大部分同学不会拍手赞美 “哇,老师好棒! 讲得深入,作业量大,考试严格!” 很多学生偏爱的是 “作业少、不点名、给分高” 的老师。你对午饭不满意,还可以马上去吃另外一家,但是选错了一门课,要付出更大的成本。 单纯依靠学生评价来驱动教学,会迫使老师把一门重课改成一门水课。 我们说十年树木百年树人, 既然成才需要时间,评价是否也需要时间? 学生给老师评价,最好的时间是什么时候?是上课刚结束时? 考试后?拿到毕业证后?毕业一年后,十年后? 学习最好的同学和学习最差的同学之间,他们评分的权重应该一样么? 最有效的评价教学水平的方式,和去餐馆吃饭点评是有很大区别的。

当老师和学生的关系完全陷入金钱关系之后,会堕落到这种情况:

  老师,我的家人已经给我找到工作了,未必和你的专业相关,我就差一个学位证就可以上班了。我花钱来上学,就是为了得这个证。 你能不能给我过了?

老师怎么回答?如果大学堕落成卖证的地方,那倒也讲得通啊?! 问题是,大学的目的是什么?大学给学生开各种课的目的是什么?是要保证学生达到毕业的最低标准。更多的情况下,在校学生未必有确定的工作, 他们必须要在一定期限内选课,完成学分。而老师掌握着最后给学生多少分, 学校掌握着毕业证。 所以这不是餐馆/食客的关系。 学生们有时非但不能成为有主动权的顾客, 反而会被人以分数/学位/毕业证相要挟, 成为下一种关系中的弱者:

Boss / employee (老板 / 雇员)?

在学校里, 很多学生把自己的指导老师叫做 ”老板”, 学生变成打工仔或打工妹。 不光有大老板, 还有小老板, 因为大老板太忙, 平时都是小老板在管理。 在一些学校, 博士生要延期一年才能毕业成为了众多潜规则之一。学生虽然是”雇员”, 但是并没有雇员的权利 (很多事例)。

Baby-sitter / babies (保姆 / 幼儿) ?

有时, 老师像保姆一样, 为学生操办一切, 关心学生的宿舍卫生,生怕学生在学校出什么问题。这种关心的态度是好的,但是在学业上,有些老师把把课程内容煮成婴儿食品, 一勺一勺地喂给同学。 同学们有什么问题, 都去找老师搞定。 学生把老师反复咀嚼过的东西再咀嚼一遍, 这种模式也许可以叫做 Learning by re-chewing. 大学生咀嚼这些别人嚼过的东西,会觉得课程很乏味,这样的教学方法可能在幼儿园有用,但是并不适用于大学,大学生并不会感谢保姆,而是想法逃离这种关系。 这个模式和这门课的 “做中学” (Learning By Doing) 有很大的区别。

Buddies / Buddies (哥们 / 哥们) ?

还有一种情况是, 老师和学生心照不宣一起混, “你对我好, 我就对你好”. 请看新闻:

http://edu.163.com/10/1106/10/6KQ4JC8800293L7F.html

部分大学课堂师生心照不宣一起混

“老师与学生一起应付”,这并非大学生们学习之余的调侃之语,而是不少大学课堂的真实写照。

有不少同学认为, 这种关系挺好的, 老师像哥们一样来关心你。当老师在第一节课说“我们一起来学习软件工程” 的时候,很多同学幻想和老师能形成平等的 “朋友” 关系。 其实, “平等的朋友” 这种亲密关系很少存在于师生之间。 首先, 你上完大学要找工作,老师已经有很稳定的工作了。 “一起学习” 只不过是套话! 其次,老师要为自己工作与生活奔忙,没有时间和几十个学生做亲密朋友; 最后, 大学的学习就是有难度的, 就是要付出足够的努力才能及格。老师就是要评判你的努力程度, 给你不留情面地打分, 一个幻想中的 “哥们儿” 帮不了你。你上课偷懒,逃课,不交作业, 你的“朋友” 看到后会怎么样?你的老师会有一样的反应么?

Stranger / Stranger (路人甲 / 路人乙)?

很多学校有巨大的新校区, 同学们来到新校区,不知道这是大学一年级,还是高中四年级。开学之后,老师乘车来到新校区,对着百人左右的课堂宣讲幻灯片, 下课后就乘车回老校区或市区的家里。 老师不认识学生, 也未必有精力了解具体学生的情况;学生平时也见不到老师,即使碰上了, 双方也形同陌路。

Prison Guard / Prisoner (狱警 / 犯人)?

还有一种情况是老师想方设法让学生来上课, 点名, 突然测验, 指纹打卡, 诱惑大家会在课堂上划重点,等等. 学生则想方设法逃课。 学生视上课为坐牢, 巴不得早一点解放。对于一些同学来说, 老师就是学生和 “自由” 之间的一道障碍。

一些读者幼稚地认为老师和学生的关系未必会堕落如此, 其实还有更差的, 大学老师在学校的教学任务是按照课时来计算的, 只要课时固定, 那么学生太多,反而对老师是负担。一个老师如果教得好, 很多学生来选课, 那么这个老师反而吃亏!如果老师严格要求,给差生不及格的分数,她还要准备补考的各种材料,这更浪费了老师的时间。 所以很多大学口头声称 “鼓励选课, 老师热爱教学…”, 其实都是烟雾弹。 对于很多管理者来说,最好的情况是:

  学生不能选课,老老实实呆几年毕业滚蛋, 然后学校满怀激情地希望毕业生在社会上马上做一个创新的人才…

这种情形类比于狱警/犯人的场景是很贴切的, 就是狱警希望自己上班时间管的犯人越少越好,越老实越好! 一个餐馆的老板当然希望食客越多越好, 但是狱警却不会这么想。大学生可以问自己的老师 “您希望有更多的学生来上这个课么?” 如果老师不希望, 那么,这更像一个 狱警/犯人 的关系。 ;)

说了这么多不好的例子, 我心目中理想的师生关系是什么? 是 Coach / Trainee (健身教练 / 健身学员) 的关系。

大家可以从各种各样的健身馆中看到这样的关系, 像健身,减肥,瑜珈等等。 在这种关系中, 是谁想提高自己水平? 是那些学员, 这些学员的想法得足够强烈, 他/她才会花钱去参加这样的健身活动。 在健身活动中, 谁要做各种运动, 流汗呢? 是学员。 谁在这个活动中对别人指指点点, 鼓励别人更加努力? 是教练。

那为什么教练可以这样做? 因为教练有下面的资源:

  1. 教练的资质, 教练本身应该在所教的项目中是很有经验的身体力行者。 如果我光看了少量瑜珈的书籍和录像, 或者得到某老师的PPT (如果瑜珈老师用PPT 的话), 我然后就照本宣科去教瑜珈, 虽然我讲的话和一个资深瑜珈教练的话没什么区别 – “现在开始练习冥想, 要尽量让自己内心安静下来,要保持呼吸均匀, 把精神集中在丹田 …” 可以肯定留在我这个班里的学生不会很多。
  2. 教练有一套训练计划和各种练习方法, 教练(场馆) 有仪器, 工具, 设备, 不是每一个人都打算在家里放一套各种重量的哑铃和杠铃。
  3. 教练可以随时指出学员锻炼的进步和不足。
  4. 教练(场馆) 能召集到有一群相似基础的队友, 这在有些类型的锻炼是很重要的。

教练和学员的关系如果确定, 就很好办了。 每一个来学习的学生, 都是想学好软件工程这门技术才来的。 各人的先天条件不同, 目标也未必相同。 有些同学想成为世界一流的程序员, 那老师就会以世界一流的标准来要求学生。有些同学只想拿一个及格的分数, 那老师也会告诉他如何才能及格。 但是,你别想只付出 “及格”的努力,却期望收获“优秀” 的结果。

谁要在这门课中写代码, 做实验, 找需求, 修bug?

​ 是学生, 不是老师。

谁要看各种与软件工程相关的书籍, 博客, 思考, 分析, 并定期汇报?

​ 是学生。

谁给各个学生设计练习, 回答疑问, 点评学生?

​ 老师。

如果学生的努力低于目标的要求, 谁会批评这个学生?

​ 老师。

谁会犯错误?

  学生,有时老师也会犯错误。

谁是完美无缺的?

  没人。 老师和学生都会犯错误,在快速变化的 IT 领域,我们要不断探索,犯错误是成长必经的道路。

有些学生说 - 老师, 你讲的特别好, 我特别想提高, 但是我太忙了, 所以没时间写程序, 我就是来听听。。。

这种情况放在健身学员的类比中会是这样:

​ 教练, 你讲的特别好, 我特别想减肥健美, 但我太忙了, 没时间练, 所以我办了卡, 就放在兜里,有时候拿出来看看。。。

这种学员还真的有, 据说健身场馆的很大一部分利润是来自于那些办了年卡但是很少来的人。

健身教练/健身学员的关系对教练也有要求, 最基本的就是及时给反馈。 很多老师给同学留下语焉不详的作业, 就听之任之了, 希望学生自主学习,自我提高, 这是不合格的教练! 想象一下,一个教练在16周的练习过程中, 只给学生两次反馈(期中,期末考试), 这是合格的健身教练么? 这种 “教练” 在大学里是不是很常见呢? 如果你经常去健身俱乐部练习各种器械和套路,你希望你的教练何时给你反馈,纠正你的动作,给你鼓励? 如果你的教练有一天说, “你两月前的某个动作不对啊”, 你能回忆起这个动作么?觉得这个教练合格么?

很多人希望老师和学生之间特别和谐,是否相安无事就是最好?古希腊学者普罗塔戈说过:「头脑不是一个要被填满的容器,而是一束需要被点燃的火把。」那火把在什么时候会被点燃?那么最好的情况是不是老师和学生的思维互相撞击,蹦出火花,一起燃烧?这种情况,会在餐馆/食客, 路人甲/路人乙,狱警/囚犯的模式下发生么? 很显然,教练/学员的关系是最有希望撞击出火星的,老师和学生之间要有足够的工作量,足够的张力,有冲突,有鼓励,有质疑,才会出现火花。

转载自:http://www.cnblogs.com/xinz/archive/2011/05/16/2048044.html

markdown学习笔记

发表于 2017-08-28   |     |   阅读次数

mac安装mtr测试网络连接

安装mtr

1.Mac下brew的安装

  • 打开系统终端,安装homebrow

    1
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.在brew里安装mtr

  • 终端输入
1
brew install mtr

使用mtr

  • 在终端里,如下使用即可
1
mtr baidu.com

常见问题

  • 不管遇到什么问题,先在终端里输入brew 来确认是否安装好brew
1
brew
  • 如果已经安装好了brew.再来确认一下是否安装好mtr,重进终端
1
mtr
  • 如果没安装好mtr,那再安装一次
1
brew install mtr
  • 运行mtr出现
1
-bash: mtr: command not found

​ 解决办法1:

1
alias mtr=/usr/local/sbin/mtr

​ 解决办法2:mtr 前面加上sudo

1
sudo mtr baidu.com
  • 运行mtr出现
1
mtr: unable to get raw sockets.

​ 解决办法:

1
ln -s /usr/local/Cellar/mtr/0.86/sbin/mtr /usr/local/bin/mtr
记得把版本号0.86改成你安装的版本对应的版本号.
  • 遇到问题后简单暴力的解决方法
1
brew update,然后再卸载mtr,然后重新安装

10000个小时成功的谬论

发表于 2016-11-14   |     |   阅读次数

10000个小时成功的谬论

​ 关于10000个小时成功的各种新闻,各种鸡汤,各种App层出不穷,世面上也有非常多的成功类书籍,职业指导类书籍也在用这个想法,这个理论.之前我也觉得这个想法不错啊,居然可以这样成功哦,是不是我也有可能这样迎娶白富美,从此走上人生巅峰,然后我在手机里也下了一个App,用来统计我想要在人生技能树上所点的点数.

​ 但是我发现,这个转换关系,这里的逻辑非常的混乱.

​ 我想到:成功是可以通过技能树上面的点点点来达到某个值就行了的吗(比如说10000).那么,首先就要确定说10000个小时成功这个理论要成立.

​ 很不幸的是,到目前为止,10000个小时还没有人实际的去验证过,没有这样的实际数据,案例.有一个美国人Dan尝试这个理论,结果没到10000个小时就放弃了.挑战者的维基百科)

下面这位记者的看法我非常的认同啊.一个人练练练,只是浪费各种时间,没有系统的路线,没有人指导,没有一个反馈环怎么行,需要微调的.很不幸的是,挑战者 a “meta” experience 这个愿望都没有实现.只给世人留下了一张没有完成的藏宝图.最后:Dan has quit the plan and now sells soda.

He started bouncing around instructors and posting swings that looked like he was not progressing as I would have hoped. Then as I looked deeper I could not find any information on what he was doing for deliberate practice. Some gym work, hitting balls, but nothing specific about what his practice routine was. I began to become disenfranchised.

As an engineer I felt his process for improving was a mess. I began to worry that at the conclusion of the Dan Plan were not going to be able to determine anything about the ten-thousand-hour theory. No conclusion, nothing. The investment of my time to follow him was going to be wasted.

​

更不幸的是往上看10000个小时,这个10000这个数字提出来是什么鬼,他怎么不是10000,然后我发现

  1. 1985年,芝加哥大学的 Benjamin Bloom 教授发现,所有被调查的精英人物,无一不是投入大量时间,刻苦练习。成就越大的人,似乎越勤奋,钻研业务的时间也越长。

    他最后的观点就是:天才不是天生的,而是后天训练出来的。

  2. 1993年,迈阿密大学的 Anders Ericsson 教授到柏林音乐学院,将那里的学生分成三组:普通的学生、优秀的学生、卓越的学生,一番数学统计,发现:普通的学生,练习弹琴的时间,总计在4000小时左右;优秀的学生,大约在8000小时左右;卓越的学生,没有一个人低于10000小时。然后发表一篇论文.《有目的的训练在专业人才培养中的作用》(The Role of Deliberate Practice in the Acquisition of Expert Performance)

    ​

  3. 2008年,畅销书作家 Malcolm Gladwell 将这篇论文写进了他的新书《异类:成功人士的故事》(Outliers: The Story of Success)。他概念化了原始论文的结论,宣称存在一个“10000小时规则”(10000 hour rule),即成功至少需要10000个小时的投入。

    ​

  4. 2009年,一位名叫 Dan McLaughlin 的人,读到了这本书。

    他是一位商业摄影师,但是对自己的工作,越来越没有兴趣。他想要改变人生。这本书启发了他。

    接下来的故事…

    ​

这个10000个小时,就是这样来的,人们是这样玩的,你们玩吧,我就不陪你们玩了.

参考:重新定义人生的10000个小时

五笔拼音+Emoji(Rime ver0.9.28)

发表于 2016-10-14   |     |   阅读次数

五笔拼音+Emoji(Rime ver0.9.28)

听闻Rime这个输入法扩展性能非常的高,还是一个开源的软件,所以决定试试.但是在实际使用过程中,发现一开始的配置过程和使用文档有非常大的出入啊,而且使用文档还是繁体版本,而且有些文档居然打不开.丢失了…我也是醉了。

安装配置

一开始,下载安装,会让你注销一次,注销回来问你要不要保存原安装文件。(留着干嘛?)

然后顶部栏手动切换到Rime输入法。

试试control+` 这个组合键有没有用,假设有用,发现默认的输入法只有拼音,还有仓颉输入法,还有什么简体字,什么语句流,还有繁体。这完全不是我想要的好么。

我只想要一个五笔拼音模糊输入法,顶部点开输入法,选择用户设定...

第一步:出现文件夹Rime,打开default.yaml (用文本编辑程序打开)找到schema_list字段,改为下面这样之后保存退出:

1
2
3
4
schema_list:
- schema: wubi_pinyin
- schema: luna_pinyin
- schema: emoji

第二步:打开Finder,前往文件夹(⇧+⌘+G),输入/Library/Input Methods/Squirrel.app/Contents/SharedSupport/ (为什么输入这个,见Rime的Wiki)

把wubi_pinyin.schema.yaml 这个文件复制到第一步打开的Rime文件夹里面。然后顶部点开输入法,点击重新部署。

完事。

我为什么放弃使用搜狗五笔输入法

用搜狗五笔,中英文标点(,。,.)切换非常不方便,当我写代码的时候。一般是用英语,那么我就要用英文标点(,.) 。这样下来,在用搜狗五笔的时候就是全局都是英文标点了。

而Rime,他用⇧切换中英文,在中文输入时它就是中文标点,在英文输入是它就是英文标点。

这是其一。

当点击、时他出现、//÷这样四种选项,非常的方便。还有⇧+4,出现¥$€£¥ 等等。。。可以说在符号使用上面,完爆我曾经使用过的其它输入法。

这是其二。

还可以扩展,可以自主选择想要的输入法。(emoji输入比ctrl+⌘+space快多了)

这一个输入法,可以顶得上我之前使用的搜狗五笔+搜狗拼音。什么时候我想写繁体了,只要添加相应的文件,改一下相应的字段就可以了。

这是其三。

参考资料:Rime 輸入方案設計書

​ 官网

markdown学习笔记

发表于 2016-09-20   |     |   阅读次数

想要设置 —>YAML Front Matters
三个减号 然后enter

通用markdow练习!!!!赞!赞!赞!

1
这个索引通过[toc]来实现

[TOC]

诗的引用

  • 引用:

一盏灯,一处昏黄;一简书,一杯淡茶.守着那一份淡定,品读属于自己的寂寞.保持淡定,才能欣赏到最美丽的风景!保持淡定,人生从此不再寂寞.

朝辞白帝彩云间

千里江陵一日还

两岸猿声啼不住

轻舟已过万重山

1
2
3
> 引用
>
> 引用

粗体和斜体

1
2
3
*斜体*
**粗体**
__粗体__

斜体
粗体
粗体

制表

command + T

注意:表格在从多到少的过程中,多出的部分会被自动删除掉,当然,我可以command + Z

超赞啊 这是第二 这是第三 这是第四
这是第
这是第col2,row5

来看看代码和数学公式输入:

代码

行内代码 这是行内代码 这是左右二边加了一个`

1
2
3
4
NSString *str = @"sxiaobb@yeah.net";
NSUrl *url = @"baidu.com";
6^2+53333*3-4/23=?
1
2
3
Here's an example:
​

function test() {
console.log(“notice the blank line before this function?”);
}
​

1
2
3
4
5
6
7
syntax highlighting:
​```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
​

1
2
Here's an example:

function test() {
console.log(“notice the blank line before this function?”);
}

1
2
3
4
5
6
syntax highlighting:
```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html

数学式子

1
2
3
4
5
6
7
$$
\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
\frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\
\frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 \\
\end{vmatrix}
$$

$$
\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k} \
\frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \
\frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 \
\end{vmatrix}
$$

用$$ 开头 用$$结尾

task list

- [ ] 在后面还有一个空格,依次输入 -,空格,[,空格,],空格. 这样六个字符…..

  • [ ] complete
1
如果要输出勾选了的 那是 - [X] 这样,注意:] 后面还有一个空格
  • [x] ​

有序和无序列

无序

1
2
3
4
5
* list1
- list
+ list
- list - list2 - list
- list
  • list1
  • list
  • list
  • list - list2 - list
  • list
1
2
3
4
5
6
* asfa 行一
* asff 行二
* sdf 行三
* sfff 行四
* adf 行五
像这样一级一级下去,是写好行一后enter 再tab一下 出现行二 类推下去
  • asfa
    • asff
      • sdf
        • sfff
          • ad

有序

1
2
3
1. name
2. property
3. test 像这样enter下去,前面的标号会自动加上去
  1. name
  2. property
  3. test
  4. ​

超链接

第一种情况

1
2
3
This is [an example](http://example.com/ "Title") inline link.
[This link](http://example.net/) has no title attribute.

This is an example inline link. ( 这个和下面这一行没什么区别啊!!)(加了一个title属性,然并卵)

This link has no title attribute.

第二:参考式[link text][name]

1
2
[link text][A]
[A]: www.baidu.com

link text

([id]: http://example.com/ "Optional Title Here")(原来这个是这样用! 必须是www.baidu.com)

link text

  • 下面是一个参考式链接的范例:

I get 10 times more traffic from Google than from
Yahoo or MSN.

  • 如果改成用链接名称的方式写:(这样就省略了name,直接用前面的来做name)

I get 10 times more traffic from Google than from
Yahoo or MSN.

  • 下面是用行内式写的同样一段内容的 Markdown 文件,提供作为比较之用:

I get 10 times more traffic from Google
than from Yahoo or
MSN.(和用二个[]的做比较而已)

参考式总结:参考式的链接其实重点不在于它比较好写,而是它比较好读

然而,最简单的超链接

<http://example.com/> 右右一个< > 就搞定了

http://example.com/

这样不行。。。(要加上http://) http://baidu.com

zby2008lkw@163.com

图片

下面来插入图片 格式:

1
![](https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png)

  • 参考式的图片语法则长得像这样:

    1
    ![Alt text][id]

    ​

Alt text
「id」是图片参考的名称,图片参考的定义方式则和连结参考一样:

第二种情况(显示链接中带括号的图片)

链接中带括号,所以用二个[];

删除线

删除掉自己 这个是在左右二边分别加上二个~~ 这样写删除线

制表符\

#

\

*

Markdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:

\ 反斜线
` 反引号

  • 星号
    _ 底线
    {} 花括号
    [] 方括号
    () 括弧

    井字号

  • 加号
  • 减号
    . 英文句点
    ! 惊叹号

Emoji

​:smile: 这个是这样打出来的: :smile: 左右一个冒号

¥100!!!

¥100
1
2
3
4
5
6
## 下标和上标
用右右<u>分别</u>一个~

H~2~O
H^2^

1
2
3
4
5
6
7
H~2~O
H^2^
## 下划线
<u>下划线</u>

下划线产

1
2
3
4
5
6
7
## 角注 注释
```markdown
You can create footnotes like this[^footnote].
[^footnote]: Here is the *text* of the **footnote**.

You can create footnotes like this[^footnote].

[^footnote]: Here is the text of the footnote.

1
2
3
我来试试角注,这个世界谁最帅[^答案].
[^答案]: 这个世界最帅的当然是作者.

我来试试角注,这个世界谁最帅^答案.

水平分隔线



Input *** or --- on a blank line and press return will draw a horizontal line.

Inline Formatting 行内样式

The following is a list of optional inline markups supported:

Option name Markup Result if enabled
Intra-word emphasis So A*maz*ing So Amazing
Strikethrough ~~Much wow~~ Much wow
Underline [^under] _So doge_ So doge
Quote [^quote] \”Such editor\” Such editor
Highlight(高亮) \==So good\== So good
Superscript hoge\^(fuga) hogefuga
Autolink http://t.co http://t.co
Footnotes [\^4] and [\^4]: [^4] and footnote 4

Happy writing! [^4]

[^4]: test from by

[^emphasize]: If Underlines is turned on, _this notation_ will render as underlined instead of emphasized

swift start

发表于 2016-07-29   |     |   阅读次数

Swift

1
2
3
4
5
6
7
8
9
10
11
class Game {
var bugs: Int
var hasMusic: Bool
var levels: Int
init(bugs: Int, hasMusic: Bool, levels: Int) {
self.bugs = bugs
self.hasMusic = hasMusic
self.levels = levels
}
}

func

1
2
3
4
5
6
有返回值的func
func nameOfFunction(/* parameters */) -> Type {
var valueToReturn: Type
// 函数的其余代码
return valueToReturn
}

一开始设置了默认的值:0.15

2.func进阶:

==函数重载==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct House {
let numberOfBedrooms: Int
let numberOfBathrooms: Int
}
func doubleMe(number: Int) -> Int {
return number * 2
}
func doubleMe(string: String) -> String {
return string + string
}
func doubleMe(house: House) -> House {
return House(numberOfBedrooms: house.numberOfBedrooms * 2,
numberOfBathrooms: house.numberOfBathrooms * 2
}

在 Swift 中这是可行的,因为编译器的智能足以检测函数调用时传入的参数类型,并选择正确的 doubleMe 函数

在此,每个函数调用对应 doubleMe 的版本,对于后者,自变量类型匹配参数类型。这种定义函数的方式称为函数重载,因为我们已经根据参数“重载”了单个函数名称,从而具有许多含义。

==元组==

1
2
3
4
let myTuple = ("Question 1", false, false, true)
print(myTuple.0) // prints "Question 1"
print(myTuple.3) // prints "true"
1
2
3
4
5
6
func funcName(paraments:type) -> (type1,type2) {
return value1,value2 //value1,value2 的类型分别为 type1,type2
}
let bytuple = funcName(paraments:argument)
bytuple.0 //得到返回的value1
bytuple.1 //得到返回的value2
1
2
3
4
5
6
如果是这样-> (up: Bool, right: Bool, down: Bool, left: Bool, numberOfWalls: Int)
那么就可以myTuple.up
myTuple.down
myTuple.left
myTuple.numberOfWalls
这样通过点运算来取值

==In-Out参数==

1
2
3
4
5
6
如果我们希望对参数的更改在调用函数后保留下来,则需要将参数声明为输入-输出参数(注意:您无法将常量作为输入-输出参数传递到函数中):如上图
为声明参数为 in-out,我们在参数名称前面添加了关键字 inout。此外,我们还必须在通过引用传递值的参数名称前面放一个与号 (&)。“通过引用传递”意味着不创建副本,在函数内部修改参数,而函数外部的参数都是相同的。您在上面可以看到,stats 在函数内进行了修改,在函数调用之后,这些更改仍然保留。
注意:In-out 参数与函数的返回值是不一样的。
in-out 参数让我们能够在函数内部更改参数值,并将这些更改反映在函数外部,我们必须注意这些类型的参数。

==内部与外部参数名==

就是调用函数的时候省略掉了parament

1
2
3
4
5
6
func addExcitementToString(_ string: String) -> String {
return string + "!"
}
addExcitementToString("Swift") //这二句是一样的
addExcitementToString(string: "Swift") // 我们需要忽略掉它!
1
2
3
4
5
func combineStrings(_ s1: String, _ s2: String) -> String {
return s1 + s2
}
combineStrings("We love", " Swift!")

==enum==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
enum Season {
case Fall
case Winter
case Spring
case Summer
}
let myFavoriteSeason = Season.Fall
var favoriteActivity = ""
switch (myFavoriteSeason) {
case .Fall:
favoriteActivity = "seeing the leaves change color."
case .Winter:
favoriteActivity = "skiing."
case .Spring:
favoriteActivity = "seeing the wildflowers bloom"
case .Summer:
favoriteActivity = "swimming in the river"
}

字符串

请记住,属性和方法与特定类型有关联:属性好比值,而方法好比函数(它们本质相同,只是属性和方法是设计层面的术语,而值和函数是程序层面的术语。)。

==reverse() 翻转==

1
2
3
4
// Reverse the characters in a string 翻转:比如,把zby 翻转为ybz
var forwardString = "spoons"
var charactersReversed = forwardString.characters.reversed() //reversed()方法返回所有字符的集合而不是一个字符串
var backwardsString = String(charactersReversed) //使用 String 初始化方法来它转化为字符串类型。

字符串组

1
2
3
4
5
6
7
8
9
10
11
12
// Concatenation
let theTruth = "Money can't buy me love"
let alsoTrue = "but it can buy me a boat."
let combinedTruths = theTruth + ", " + alsoTrue
// Finding a substring within a string
var word = "fortunate"
word.contains("tuna")
// Replacing a substring
var password = "Mary had a little loris"
var newPassword = password.replacingOccurrences(of: "a", with: "A")

零值

可选值

option

可选值类型可作为参数传递给函数

1
2
3
4
5
6
7
func pickUpGroceries(car:Car?) {
if let car = car {
print("We'll pick up the groceries in the (car.model)")
} else {
print("Let's walk to the store")
}
}

此函数容纳可选值类型 Car? 的参数。如果变量 car 有值,则开车到杂货店。如果 car 为零值,则步行到商店。以下是这两种情况可能显示的内容:

var someCar = Car(make: “Toyota”, model: “Corolla”)
pickUpGroceries(someCar)
然后输出可能为: We’ll pick up the groceries in the Corolla

在为零值的情况下:

pickUpGroceries(nil)
输出为: Let’s walk to the store

数组

1
2
3
4
5
6
7
8
// The verbose way
var numbers = Array<Double>()
// More often you will see ...
var moreNumbers = [Double]()
// Array literal syntax
let differentNumbers = [97.5, 98.5, 99.0]

Mac端python支持中文

发表于 2016-07-25   |     |   阅读次数

>>> WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable. Visit http://www.python.org/download/mac/tcltk/ for current information.

Mac新安装的 3.5版本 打开IDLE 会出现如上这句.这是在说Tcl/Tk (8.5.9) 没安装好

解决方法: 打开终端,进入brew

1
$ brew

然后

1
$ brew install tcl-tk

这时终端会建议:To install it, run:
brew install homebrew/dupes/tcl-tk

听他的

1
brew install homebrew/dupes/tcl-tk

等待一会儿,就把tcl-tk-8.6.6 给装好了

**以上是没用的!!**

https://www.webucator.com/blog/2015/02/idle-warning-the-version-of-tcltk-8-5-9-in-use-may-be-unstable/

正解如下:1,登入到这个网站http://www.activestate.com/activetcl/downloads

根据需要下载正解的版本(不要下载最新的,比如我的警告是让我去8.5.9 那这里我下载8.5.18.0 这个版本)

下载完成了安装后重启IDLE即可!

今天立个flag

发表于 2016-07-18   |     |   阅读次数

今天立个flag

最近感觉身体有点差了

一定要多运动,多健身。

平常常起来走动一下,活动一下身体的备注循环,活动一下心肺功能,放松一下眼睛和脖子。

这还是其次,重要的是要有一个强健的身体。

为了激发我的内在潜力,我决定接下来,只要天气可以用冷水洗手,那么就坚持用冷水来洗澡!

这样我就不得不在洗澡前好好的热身热身了!

这是基本限度

每天Keep30分钟,还是可以的,#每日健身打卡

#

在云端更新博客

发表于 2016-07-15   |     |   阅读次数

在一台陌生的电脑上面更新已经创建好的博客

使用场景:在公司的电脑上更新博客.

1,搭建平台

1).安装git

2).安装node.js

官网安装

3).安装hexo

安装好git和node后,执行命令安装hexo

1
2
> $ sudo npm install -g hexo
>

安装好后,难证一下

1
$ hexo version

初始化一下hexo

在想保存博客项目的地方创建文件夹,终端cd进入,执行init命令初始化hexo到你指定的目录,

1
$ hexo init

验证一下是否初始化好

1
$ hexo s

然后浏览器打开 http://localhost:4000

将出现Hexo的欢迎界面.终端ctrl+c退出本地模式.

2.克隆项目

把项目克隆到本地.

克隆下来的文件里面已经有博客的配置以及主题的设置了!

验证一下是否克隆成功,(先cd进那个)

2.配置平台

把保存在云端的文件下载来覆盖新建创建的hexo文件…

也可以保存在github仓库的分支里面

把分支下载下来,hexo直接

参考文件:

在云端更新博客

hexo的初始化文件,即folder文件保存在dropbox里面.然后正常操作,换电脑了的话,就在新电脑内安装环境,就行了.

未完待续

12
by

by

We are all in the gutter,but some of us are looking at the stars.

14 日志
8 标签
GitHub Email
© 2018 by
由 Hexo 强力驱动
主题 - NexT.Pisces