Siyuan Blog Write Some Code

比特币与中心化交易所

最近我花时间好好钻研了下比特币,越研究越觉得,目前ICO和比特币的骗局很多。如果大家愿意听的话,我来一点点写文章说明。第一篇文章要解释的是下面一个问题:既然比特币是去中心货币,为什么要有个中央交易所呢?

比特币简要来说是一个分布式的账本,所有参与比特币的人都有一本帐,上面记录了从比特币诞生到现在的所有交易记录,每个人有多少比特币都能从这个账本算出来。这个记录每20分钟更新一次,更新账本的人会得到一定量的比特币。每次更新的时候,账本最多能更新4MB的信息,因此,比特币现在的交易速度只能达到每秒钟7笔左右,而且需要等待至少20分钟作为确认。作为对比,visa平均每秒钟交易2000笔

问题来了,既然比特币交易速度那么慢,那每天大量的比特币交易是怎么来的?确实,每天在交易所里有及大量的比特币交易。GDAX 网站上会实时显示GDAX的实时挂单和成交,每秒钟至少有50笔以上的交易,而且交易是实时的。难道这些交易所有黑魔法,可以突破比特币本身的限制?

其实道理很简单,交易所本身也有个账本,这个账本里面存储每个用户“应当”有多少比特币和多少现金。当你从交易所提现或者提币的时候,才能真正的取得比特币。换言之,你在交易所买的比特币,只是交易所内的一个帐目,不是比特币。交易所有这么做的理由:中心化的数据库比比特币不知道快了几百倍;比特币在交易的时候需要支付佣金,而如果交易所能场内撮合交易,则几乎没有花费。

这个方法其实大家都在用,你存到银行里的钱,其实就是银行的账上的一个数字,银行不会傻傻的把你的现金存到金库里面去,而是把一部分钱存起来,另一部分作为贷款借给别人。每年,国家都会对银行进行压力测试与审计,来保证银行的稳定性。

然而,国内的比特币交易所完全没有上述的制度,没有说明准备金制度,也没有进行过第三方审计,更没有压力测试。如果你是比特币交易所,你只要在帐目上增加一个数字,就可以得到一个比特币或者几千美金,有什么理由不干呢?Mt.Gox就是因为这个才破产的,而现在Mt.Gox手里的比特币,比特币身上的大炸弹之一。

pic

一点建议:

  1. 如果你打算长期持有比特币,请把你的btc提出来,打印到纸上或者用硬件钱包保护,交易所随时可能跑路。
  2. 如果你打算投资比特币,在了解各种比特币的原理之前不要进场,这里的交易是没有监管的,割韭菜割的更为凶狠。

Learn Java

如何自学Java

声明:我和这篇教程里面推荐的任何书籍与教程的作者和发行商都没有关系,只是网络上搜罗了一些有用的资源希望和大家分享。

之前写过一篇介绍如何学习Python的文章,收到了很不错的反响。但是Python只是我由于个人兴趣学习的语言,很多语言细节和学习不如很多在日常中使用python的人。我个人在工作中主要使用的是Java,对Java相对比较熟悉,希望这篇教程能够帮助很多希望学习编程的人。

引言

Java是一门历史悠久的语言,从1994年公布到现在,Java一直保持极高的使用频率。你可以在服务器开发中使用Java,可以在手机开发中使用Java,可以在嵌入式开发中使用Java。尽管这门语言被人诟病很多,但是Java仍是当前最流行的语言没有之一。

Java语言的好处在于,他巧妙的取得了语言功能和语言复杂度的平衡,任何一个有经验的程序员都可以在最短的时间内上手Java,写出符合质量的代码。Java不是最快的语言,它比C慢一倍,但是有着远超过其他基于VM语言(比如Python)的运行效率。Java语言上的功能不足由各种函数库补足,你能想到的几乎任何功能都能有相应的Java库帮你实现了,很多时候只需要根据你的业务调用这些库就行了。

学习完Java之后,如果你对Java这门语言不满意,可以学习JVM(Java虚拟机)上面的其他语言,比如ClojureScalaKotlin。Clojure这个是一个Lisp方言,学习Clojure能很好的学习函数式编程的思想。Scala是Java语言作者新开发的一门语言,包含了很多高端大气上档次的语言特性,但是就是相当难以学习。Kotlin是一门很适合移动开发的语言,Kotlin对Java进行了简化,让开发者更容易完成移动应用。但是学习这些语言的前提是,你足够熟悉Java。

书籍

我自己学习Java的时候,因为有过C++的编程经验,所以几乎没费什么力气就学会了这门语言。然而对于初学者来说,Java的面向对象思想是一个需要时间消化和理解的新事物,书籍可以帮助你理解这些晦涩难懂的概念。

Head First Java 是一本很不错的教学书,除了Head First Java之外,还有Head First设计模式,Head First Python等等书籍。Head First系列是由UCLA的一位教授编写的编程入门教材,深入浅出,易学易懂。这系列书籍的成书日期都很早,因此很多新的技术都跟不上年代了。比如在Head First Java中,使用的是Java1.5作为教学内容而不是最新的Java1.8,如果你之前对编程没有了解,我推荐使用这本书作为你的入门书。

Java核心技术是一本非常著名的教材,这本教材每当Java更新版本的时候都会推出,紧跟时代潮流。这本书的写作方式由浅入深,阐述了Java语言的方方面面。如果你想通过一本书了解Java的话,这本书就十分的切合你的要求。这本书有上下两卷,上卷叙述了Java语言的基本特性,下卷叙述了各种Java标准库的特性,比如文件IO,比如Sql读取和写入。这本书的上卷,可以作为入门使用,对于这本书的下卷,我推荐作为进阶学习使用。

疯狂Java讲义国人写的教材,没有读翻译教材的时候那种生硬的感觉,更加贴合国人的学习需求。不过这本书有人说讲的过于细致,就像一本字典而不是一本教程。有需要的同学可以试读之后在进行选择。

Effective Java历久弥新的神作,Bloch大神在Google多年经验的总结。在学习完Java语言之后就推荐看这本书,实践并思考这些条条框框之后的原因。学会Java之后,如果你能实践这本书里面的意见,那么你的Java代码能被很多有经验的开发人员认同,从而在面试中无往不利。买了这本书之后,每隔半年可以把自己的实践经历和这本书的内容对照,对这本书才能有更好的理解。

还有一些没有详细介绍的书籍:

  1. Think in Java 如果你有C语言编程基础,这本是很好的教学书。不过内容很深,不适合初学者。
  2. 深入理解Java虚拟机 这本书也算是进阶书籍,讲述的是Java是怎么运行起来的。

视频资源

相对于硬邦邦的书籍而言,通过视频学习能够极大的提高你的学习效率。对于视频教学,我推荐马士兵JAVA基础教程,我试着听了一下,老师讲的比较风趣,同时看课程安排也比较合理。很多人都通过这个视频教程学习Java。

IDE

在学习Java的时候,有一个趁手的IDE是十分必要的,Java这门语言如果不用IDE的话会非常的繁琐,IDE能够帮你减轻90%以上的工作,让你学习更加轻松愉快。

Intellij截图

Intellij 是目前Java最强的IDE,没有之一。自动补全功能强大的丧心病狂,而且他会根据你的代码自动的进行提示,保证你写出的代码符合Java的最佳实践。缺点是这个IDE吃资源有点多,如果家里电脑不是很强大的话,用这个IDE会比较卡。

Eclipse 也是一个强大的Java IDE,很多教程都是用Eclipse作为教学用的IDE,如果你使用的教程是用Eclipse的,那么用Eclipse作为你的开发IDE是比较好的选择。

如何刷题

很多人学习Java的目标就是找工作,对于国外的同学来说,刷题更是一项避不开的修行。当程序员在找工作的时候,很多时候都要在黑板或者电脑里面写面试题。通过用Java解决面试题目来展现自己的编程水平,获得你心仪的Offer。对于我自己来说,我也是有过刷题找工作这种经历的。程序员面试就是面试你的代码能力以及算法熟悉能力,代码能力是通过你的代码整洁程度,是否进行了异常检查等等方面显现出来的。你的算法熟悉能力是通过不断的刷题进行提高的。

对于算法的学习,可以从公开课开始,这里我推荐MIT的公开课。在学习的过程中,我推荐大家集中在基础算法,比如遍历,查找,排序,动态规划等,而对于复杂的算法比如平衡树等做了解就好。毕竟在面试的时候也不会让你手写一个平衡树的,这种面试问题不能体现出被面试者的水平。对于这些复杂的算法,Java语言都提供了相应的实现,你需要了解这些实现。

之后就是刷题过程了,刷题是一个锻炼面试者解决问题能力的过程。在用下面刷题网站的时候,最好不要参考答案,即使参考了答案也要整理出自己的思路。很多人遇到题目不会写之后就去找答案了,认为只要把这里的题目都背下来就能够拿到好成绩了。然而到面试的时候出一道其他的问题,这些背答案的人就傻眼了。刷题最重要的是,任何一道题目用自己理解的思路来写,而不是按照其他人的思路生搬硬套。

同时,刷题的时候还有一个小技巧,就是给自己设置一个时间。很多时候自己做编程题目的时候,都处于一个很闲散的状态,一点点的解决这个问题。然而在面试的时候,只有很少的时间给你了解问题,解决问题,这就要求你对面试题目要能够足够快的反应,足够快的给出思路。在平常练习的时候,就要给自己一个时间限制,在这个时间限制的时候,全力思考解决问题,这样才能达到良好的训练效果。

在你做完一遍题目之后,可以过一周再看一下自己写的代码,是否有能够改善的地方,是否用了过慢的算法等等。同时可以试着给自己写测试样例,在面试的时候如果能给出完整的测试,是有很多加分的。

最后给出两个在线编程练习的网站

  1. https://leetcode.com/
  2. https://www.careercup.com/

祝大家在刷题的过程中顺利!

语言之外

然而,学习语言仅仅是入门,这篇文章中还有很多很多的东西没有涉及。比如移动开发,比如网络后台开发,比如数据库等等,上面的教材可能已经有一些涉及了,但是还远远不够。

你想用Java开发数据库,首先要了解数据库的各种范式,了解不同数据库的性能差异,了解怎么调优,这样才能写出好的数据库代码。

想用Java开发桌面程序,需要了解点击是怎样在程序中被捕获的,如何才能让程序界面不停止同时进行复杂的运算,如何用多线程开发出稳定的GUI程序。这需要你对操作系统有足够的了解。

这些都不是一本书或者一个视频教程就能涵盖的,我在这里给大家列举一点入门的链接。

  1. 数据库
  2. 操作系统
  3. Android开发

希望这些内容对你们有帮助!有什么想法可以回帖或者私信或者发到smy20011 at gmail.com里!

Windows Tools In Python

上一次我们介绍了学习python的一些资料,这次我们来介绍一些工具,能让你的学习过程更加轻松愉快。

Pycharm

史上最强的Python IDE,没有之一。Pycharm的老爸(老妈)是一个著名的IDE开发公司,在程序语言方面浸淫了十几年。能够帮你自动的提示和补全Python的函数,变量名。帮你自动查出不好的写法,并提出更改意见。

Pycharm有社区版和商业版之分,一般我们就用社区版就可以了,商业版对有特殊开发需求的人有用,对于初学者来说,用社区版第一是支持正版,第二免去了安装时的很多麻烦。如果你第一次使用这个软件,肯定有诸多的不熟悉,下面这些教程可以帮到你。

  • Pycharm 官方教程 这个是pycharm官方出品的视频教程,每个教程5分钟左右介绍了Pycharm的基本特性,可以下到手机里慢慢观看。
  • Pycharm 教程系列 国内的Pycharm教程使用的版本相对比较老,不过大体上的功能没怎么变,因此老教程依然适用。

Cmder

使用Python的时候,避免不了和命令行打交道。如果你在windows平台下,CMD的使用体验会让你痛不欲生,幸运的是,有一些windows程序员开发出了一些十分漂亮的命令行,让你的开发过程轻松愉快。CMDer是基于ConEmu的一款软件,它为你提供了相当漂亮的初始设置,并且你能够对很多部分进行微调。支持多窗口,左右分屏等等功能。简单来说,如果你想要你的命令行从这样:

CMD.PNG

变成这样

Cmder.PNG

那么Cmder是你的绝佳选择,相关教程在这里

VS Code

如果你对Pycharm的速度不满意,或者你不满足使用ide,想用高大上的编辑器的话,VS Code是你比较好的选择。VS Code是微软被三哥占领后开发的一款强大的编辑器,拥有讨人喜欢的外观和不错的初始配置,适合各个熟练程度的开发者使用。其他的选项有Textmate和ultraedit,但是这两个编辑器都要钱,如果不购买的话会弹窗,比较影响体验。

Demo

安装VS Code之后需要你安装Python插件,教程在这里,很可惜的,没有很好的VS Code中文教程,要学习的话只能通过官网的教程进行学习。这里有一些英文的资料

Git

在写文档的时候,你有没有过因为不小心覆盖丢掉了几周的成果的经历,有没有想找出几周之前的版本看一看的经历。写程序的时候,几乎所有人都会遇到类似的事情:你想实验一个功能的不同写法,你想比对几周之前的程序和现在比有什么长进,更重要的是,你不希望你的程序因为系统故障而让你几个月的努力小时(活生生的例子在这里)Git以及其他的版本控制工具是解决这种问题的良方。

要说Git的身世真的不一般,它的老爸是Linus Torvalds。全世界80%的手机系统,70%以上的服务器,以及你现在在刷的s1,都是基于他的Linux系统。他在写Linux的时候使用的版本控制软件叫做BitKeeper,由于Linux内核的一个开发者逆向了这个工具,BitKeeper的开发商决定收回给Linus的免费使用权。Linus一怒之下在10天之内写出了git(不愧是大牛)。经过10年的发展,目前绝大部分的开源软件都是用git作为版本控制软件。著名的同性交友开源社区Github也得名于git。

Git做的事情很简单,就是给你的代码一个快照,称为一个commit。当你提交代码之后,你的代码就会变为Git系统里的一个快照,你可以通过一个命令回到过去,也可以从过去跳到现在(如下图)。

时间机器

除此之外,Git能让你对任何时候的快照进行分支,并让你能够尝试不同选择带来的不同结果。Git的特性使得开启一个分支几乎不用任何代价,你可以从容的从一个世界线分支跳转到另一个分支,尝试不同代码方式带来的结果,当你觉得这个分支的结果让你满意的时候,你可以把一个分支合并到另一个分支里面,得到一个让你满意的分支。基于Git开发流程就是开启branch,合并branch的过程。

branch

一位不称职的开发者开发的分支上错图片了

actual branch

基于分支的git开发流程。

学习Git,我推荐使用

看完上面任何一个教程之后,你可以尝试着用git的思路来画出命运石之门的剧情,写出每一个世界线代表哪一个分支,每一次胸针的动作代表着什么,画完之后你就出师了(误)。

熟练掌握git的好处是,之前我介绍的所有工具都能够跟Git无缝集成,学会了Git之后能让你用这些工具更加得心应手。

另外在找资料的过程中发现一个python的学习网站,推荐一下http://www.codingpy.com/

Python Resource For Beginners

为什么要学Python

在现在,编程不仅是程序员专属的技能,而是每个人都应该或多或少掌握的技能。任何人的工作,都几乎不能离开互联网,离不开计算机。在每天的工作中,你是否会对重复的工作感到厌烦:重复的打开表格,更改数字,提交报表。每天干的事情都相似,却占用了你大部分的时间,让你身心疲累。有没有想过花几个小时写就的小程序,可以在一分钟以内完成平常一个小时的任务,并比你平常完成的更好。如果不会编程,你只能做计算机的仆人,软件让你怎么干,只能怎么干。然而掌握程序思想之后,你能做计算机的主人,可以命令计算机,让他干你想干的事情。对于初学者,我推荐他们学习Python。

Python这门语言生于1989年,在设计之初,这门语言就着重强调简单,清晰。在Python编程语言中,有一个重要的格言“用一种方法,最好是只有一种方法来做一件事”。如果你遵循了python的开发守则,那么最好的python开发者和初学者写出来的代码看起来也是一样的清晰。相较于诘屈聱牙的C/C++/Java,Python是最适合初学者的语言。普通人大概花一周时间可以掌握Python的基本语法,剩下的时间就是把玩各种库了。

学习Python的资料

如果你不知道什么是IDE,什么是运行时环境,不知道如何下载python。那么最好的学习工具是在线课程。我推荐下面几个

  • 计蒜客 https://www.jisuanke.com/
  • CodeAcademy https://www.codecademy.com/

这两个网站的好处是即开即用,不用初学者操心编辑器设置,环境设置的问题,纯粹的进行语言学习。他们课程大概分7-8个小节,每一节都会有相应的提示,做对了会进入下一小节。就跟玩rpg一样,一个boss一个boss的打,打完最终boss你就出师了。

当然,学完了这两个并不说明你真正掌握了python,不过你可以用python做一些日常工作了。比如用python做一个下载爬漫画的软件。如果你觉得想深入了解学习python,推荐上MIT的编程课程,有人做了一个学习计划,可以参考一下。 这门课程会让你深入的理解计算机科学与编程语言,很多科班出身的程序员如果没有认真学习的话理解不一定有你多。俗话说,磨刀不误砍柴工,一个好的工具能让你事半功倍。我推荐

  • Pycharm 最舒服的python ide,初学者用这个就好了。听见有人给你推荐vim请打一顿,推荐emacs的请直接扔海里谢谢。
  • Repl.it 在写程序的时候,有时候会试一下程序怎么写,这时候这种repl网站就很有用了。当然你可以打开python的idle进行实验。
  • Stackoverflow 在这里你能找到一切编程问题的答案,出现问题的时候把错误在这个网站上搜索就能找到结果了,国内的社区是Segment Fault

mit公开课之后,你就像打通了任督二脉一样,天下任何事情都难不倒你了。现在如果你想做:

  • 网页开发Flask
  • 大数据 可以参考这个知乎帖子
  • 办公自动化 推荐学习xlrd这个库,能帮你减少很多痛苦。如果要更深入学习,推荐看一看微软的VBA,这门语言是和office套件紧密连接的。如果你有python基础,学习VBA几乎不费精力。

这个帖子会持续更新,如果大家有问题的话可以回帖留言。

第一篇Blog

Hello Everyone, this is my personal bolg. I will write blog about Android Development and other fields.