All posts by dotte

我是如何学习区块链的

原创文章,转载请注明:转载自Keegan小钢
并标明原文链接:http://keeganlee.me/post/full-stack/20170915
微信订阅号:keeganlee_me
写于2017-09-15


专栏地址:https://xiaozhuanlan.com/fullstack


前几天我们已经学了如何学习的“道”和“术”,学完之后就应该落地到实践上,通过不断地实践练习,才能将这些 知识资源 转化为我们的 知识资本。如果你看完前面的文章后,觉得讲得真好,然后缺乏思考缺乏行动,然后就没有然后了。为了更好地指导你们如何实践,本篇文章我将与你分享我是如何将知识资源转化为我的知识资本的。

为什么选择区块链

选择区块链作为实践学习的案例,原因有三:

  • 第一,区块链是我最近两三个月刚学习的领域,对我来说也是一门从零开始学习的领域,这样的学习案例最具有指导作用。因为时间没有隔太久,很多学习过程中的细节我也还记得,这样我可以还原出更真实的学习过程。
  • 第二,区块链——确切说是虚拟货币最近非常火,连中国大妈都知道了,我的微信群里也有部分人在玩或准备玩,但大部分人普遍对比特币和区块链缺乏正确的认知,只是跟随潮流,这其实是存在很大风险的。因此,我觉得也有必要普及一下区块链和比特币正确的认知。
  • 第三,区块链是价值互联网的基石,是未来必然的趋势,会成为像HTTP一样基础的技术,所以也应该是每个技术人员都要掌握的技术。

关于第二点,很多人是因为听到了太多虚拟货币的致富神话,所以才开始关注这个行业。但却因为对虚拟货币和区块链缺乏真正的了解,所以其实看不懂这个行业的现状,更看不懂这个行业的未来。因为看不懂,所以要么一直观望,要么畏畏缩缩。最典型的就是我的一个同事,看着别人赚钱,一直想进。但从比特币1万块观望到2万块,一直不敢入场,总觉得价格太高,但却一直看着它升高。后来,有一次,被他抓到了一次抄底的机会,就是7月中旬比特币跌到1万3后反弹到差不多两万的那次,他终于下了决心入场了,貌似是丢了2000块钱进去,结果呢,赚了200块钱他就抛了。后来,BCC从2000块左右开始起飞之前,也被他抓住了,这次他胆子大了,丢了10000块钱进去,但和上次一样,只赚了10%就怕了跑出来了。那次BCC起飞足足翻了一倍还多。不过他也算是幸运的,起码赚到了钱,虽然赚得少。但有很多人是亏钱了的,而且还亏得不少。说了这么多,其实就是想表明,你想在这个行业里赚钱,甚至长期赚钱,你看不懂是不行的。

第三点才是最重要的,区块链将会成为基础性技术。基于HTTP的互联网可以称为信息互联网,主要传递的就是各种信息。而基于区块链的互联网则称为价值互联网,传递的是价值。在信息互联网时代你需要熟悉HTTP,那么,在价值互联网时代你就需要熟悉区块链。而且,未来已来,我们应该提前做好准备。

开始学习之前

每个人开始学习某项领域的知识之前,或多或少都会先听到或读到各种概念和观点,没有人会在真正一无所知的情况下突然决定要去学习某个东西。就比如说,如果你连“区块链”这个概念都没听说过,那你就不可能会有想去学“区块链”的想法。

我在决定开始学习区块链之前,就已经听到和读到了很多相关的概念,包括:区块链1.0、区块链2.0、区块链3.0、公有链、联盟链、私有链、硬分叉、软分叉、隔离见证、闪电网络、雷电网络、以太坊、以太坊经典、币圈、链圈、智能合约、比特币钱包等等,一大堆陌生概念。不过,那时候,给我印象最深刻的还是比特币,一个星期就从1万涨到了1万5。

那时候了解到的信息大部分都是从巴比特读到的,很多文章其实都看不懂,主要还是不懂的概念太多。但有一些还是看懂了,比如,比特币可称为数字黄金,那它未来的价值应该可以接近黄金,从这个角度来看的话,那比特币还有很大的上涨空间。比如,区块链开启了价值互联网时代,是趋势所在。主要也是这两点激发起了我学习区块链的兴趣。

确定目标

《001 | 如何高效学习》一文中就已经说过,想要提高学习效率,第一个条件就是:目标导向。功利学习法的核心也是目标导向。因此,我们学习一个东西,第一步必须是确定目标,而且必须是清晰明确的目标。另外,目标有分大目标和小目标。一开始,你是先确定了大目标,然后根据大目标分解成一个个小目标,每个小目标都应该是非常清晰明确可操作的。下面我就讲解我是如何将大目标拆解成小目标的。

我学习区块链的目标是很明确的,从大的方面来说,目标就两个:

  1. 为了以后进入区块链开发做技术储备;
  2. 为了能指导我如何投资虚拟货币。

那么,为了达到这两个目标,需要学习哪些东西呢?第一个目标需要学习区块链相关技术,就要知道区块链涉及到哪些技术、区块链的技术原理等;第二个目标则需要学习虚拟货币相关知识,包括需要解决有哪些虚拟货币、去哪里买虚拟货币、怎么买等问题,以及要了解虚拟货币未来的前景会如何。梳理之后,就变成了一个个待解决的问题:

  • 什么是区块链?
  • 区块链1.0、区块链2.0、区块链3.0有什么区别?
  • 什么是公有链?联盟链?私有链?
  • 什么是分叉?硬分叉和软分叉有什么区别?
  • 什么是隔离见证?闪电网络?雷电网络?
  • 比特币的本质是什么?
  • 比特币是如何交易的?
  • 什么是比特币钱包?
  • 什么是智能合约?
  • 什么是以太坊?以太坊和以太坊经典有什么区别?
  • 什么是币圈?什么是链圈?
  • 哪里买虚拟货币?怎么买?
  • 区块链和各种虚拟货币的前景如何?

很多时候,第一次梳理出来的问题并不全面,甚至很少,但没关系,在学习的过程中,就会不断涌现出新的问题。比如,有哪些共识算法?什么是超级账本?什么是ICO?怎么玩?等等这些就是我在学习的过程中新发现的问题。

这一步,最重要的是确定好大目标,然后拆解成一个个待解决的小问题。

搜集知识资源

当你的目标已经明确细分到一个个小问题之后,就可以根据这些问题搜集各种知识资源了。知识资源主要有三类:书籍、官方文档网络上的零散文章。搜集知识资源时,首选应该是书籍,因为书籍相对比较系统化,可以解答我们大部分的疑问。官方文档主要是为了加深理解,毕竟,书籍一般不会细化到一些技术细节之类的。而有部分问题,从书籍和官方文档是找不到答案的,这时就只能到网络上搜索相关文章了。另外,有些英语比较差的人看官方文档太累太费时间,也可以搜索网络上的中文文章。但我还是推荐尽量看原文,不会失真。

那么,回到我的区块链学习上来,选书上,我主要还是在那些比较畅销的书里挑,而且会尽量多覆盖上面所提到的问题。在亚马逊看每本书的简介和目录,最后选了以下几本:

  • 《区块链:新经济蓝图及导读》:同事推荐的一本书,讲到了区块链1.0、2.0、3.0,可以帮助我从宏观上了解区块链。
  • 《区块链:技术驱动金融》:从技术层面逐步解释了比特币是如何运作的。
  • 《区块链技术指南》:更加深入技术底层的书,还讲到了智能合约和超级账本,可以作为上一本书的补充。
  • 《区块链革命:比特币底层技术如何改变货币、商业和世界》:全景式描述了区块链理论及应用,这是为了扩大视野的书。

官方文档主要就是各种白皮书了,我搜集的白皮书主要包括:

最后,有些问题无法直接在书籍或白皮书中得到解答,比如说,什么是币圈?什么是链圈?这问题在百度或Google搜索一下就能得到答案了。有些文章会比较长,比如这篇:《详解最近大热的闪电网络、雷电网络和CORDA》,一时难以看懂,没关系,先收集起来,可以等后面进行大量泛读时再看。推荐可以去巴比特找资源,大部分都能找到。

这一步,主要还是搜集各种知识资源。先挑选书籍,尽量覆盖面广一点。再搜集各种官方文档,这是第一手信息,详细而不失真,可以加深理解。最后才是搜集网络上零散的文章,有些比较简单的问题可能直接就得到答案了,有些难以理解的要留到后面进行大量泛读时再看。

大量泛读

知识资源都搜集好了,接下来就可以开始进行大量泛读了。不知道大家是否还记得,大量泛读的主要目的就是:梳理出核心概念、主要观点框架逻辑。虽然在学习之前,我们或多或少都已经了解到了部分概念和观点,但在学习的过程中,我们就会发现还有更多我们不了解的概念和观点,这些都需要一一去理解的。

我们之前讲功利学习法时,提到知识资源可以分为三类:娱乐性、知识性、心智性。学习不同类型的知识应该分配不同的时间资源,知识性的比较适合碎片化学习,心智性的则需要集中几个小时进行系统性学习。因此,对我们搜集的这些知识资源,首先要区分好哪些是知识性的,哪些是心智性的,然后使用不同的时间管理策略进行阅读学习。对于我学习的区块链来说,大部分知识资源是属于知识性的,包括几本书籍的大部分内容和网络上搜集来的零散文章,这些我一般会放在上下班路上,或中午休息时学习;而那些专业的白皮书和书籍中深入技术架构的部分则属于心智性的知识,我一般就会放在晚上或周末集中两三个小时进行高强度学习。

阅读的方式也是有讲究的,我不会将几本书按顺序看完一本又一本,这样的话学习效率太低了。我会从一个个的问题出发,为了解决问题而从各种知识资源中找答案。解决完一个问题后再解决下一个。另外,在解决问题的过程中,普遍会遇到新的问题,那就把新问题先记下来,然后继续解决当前的问题。如果一个问题花了很长时间都解决不了,那可能这个问题对现阶段的你还没能力理解,这时可以先放一放,等学完其他再回过头来继续研究。

比如,我在解决“什么是比特币?”这个问题时,我会将每本书对比特币的介绍先看一遍,了解其框架逻辑后,再研读比特币白皮书,理解其技术架构和一些技术细节,直到终于明白,比特币从技术角度来说,本质上就是一堆复杂算法所生成的特解。另外,学习的过程中,就遇到了很多新的问题,比如“什么是共识算法?什么是Merkle Tree?什么是挖矿?等等,于是我就先把这些问题记下来,继续解决“什么是区块链?”的问题。

以下是我在大量泛读之后对一些核心概念的总结性理解:

  1. 区块链:从狭义上来说,区块链就是一种分布式的数据库,数据结构上就是按时间顺序将数据区块相连的一条链表,链上的每个节点就是一个区块,区块一般通过二叉树(如Merkle Tree)将每笔交易数据打包在一起,形成一个汇总的哈希值,再加上时间戳,就是一个区块的唯一标识。从广义上来说,区块链是结合了分布式数据存储、点对点传输、共识机制、加密算法等多种技术的一种分布式基础架构模式。
  2. 比特币:有很多人对比特币的理解就是账上的那串数字,但严格意义上来说,比特币是一种点对点的电子现金系统,是一整套系统,这点从比特币白皮书的标题上就已经说明了。可以将比特币简单理解为就是区块链技术的第一个应用。不过,“比特币”的概念要比“区块链”早,“区块链”这个概念是比特币发展了一段时间之后,将比特币的底层技术抽象出来形成的。另外,从投资的角度来看,比特币总量恒定为2100万个,其价值可以和黄金相比,但目前的市值和黄金的市值差距,还有很大的上涨空间,所以从长期来看,我还是非常看好。
  3. 以太坊:区块链2.0的典型代表,主要实现了智能合约的功能,开发人员可以在以太坊平台建立和发布各种分布式应用,这些应用,其实就是合约,智能合约说白了其实就是当达到某条件时会自动执行的代码。很多ICO的代币就是在以太坊平台上创建的应用。
  4. 公有链/联盟链/私有链:公有链就是完全公开的区块链,像比特币、以太坊;联盟链则不是完成公开的,是指有若干个机构共同参与管理的区块链,每个机构都运行着一个或多个节点,其中的数据只允许系统内不同的机构进行读写和发送交易,并且共同来记录交易数据,该联盟链的每个参与方不用担心自己数据存在哪里,自己产生的数据都只有自己看到,只有通过对方授权的密钥才能看到其他参与者的数据,这样就解决数据隐私和安全性问题,同时能够实现去中心化;私有链则是完全私有的,一般适合跨国公司,目前这一块还没了解到有什么代表性应用。

这一步,最高效率的阅读应该是带着问题去找答案。而且,要分配好时间资源,阅读知识性的信息时可以多用碎片化时间,心智性的内容则需要集中时间研读,要尽量理解每个核心概念。

建立模型

上一步我们已经大致理解了每个核心概念,但这些还只是一个个点,这一步就要将点与点之间连成线,逐渐连成网。即是说要理清不同核心概念之间的关联关系,逐渐形成系统模型。如果有条件的话,大白板当然是最好的思考工具,没有的话,用Visio、OmniGraffle之类的画图工具也可以,或者用XMind之类的思维导图也可以,甚至只用纸和笔都行,最重要的是要画出来。

以下是我用OmniGraffle梳理的区块链的系统模型图,因为时间和篇幅所限,所以只是部分内容:

求教专家

如果还存在无法解决的问题,那就要求教专家了。不过,这里也有一些需要注意的地方。

首先,你的朋友圈里要尽量多加一些专注不同领域的专家。不过,现在大部分人应该都加了不少牛人了,所以这一点没什么需要特别讲的。但有一点我想特别讲一下:不要随便什么问题都去求教专家

一来,专家基本都是很忙的,没太多时间总去帮你解决问题,尤其是当你问一些对他没有价值的问题时更不想搭理你。比如,你去请教一个Android架构师,问的却是“Android怎么打开蓝牙?”这种随便百度一下就能得到答案的问题,就算是我,我可能就会丢回一句“请自己去百度”。既然你请教的是Android架构师,就应该问架构方面的问题,而且最好是有深度、值得讨论、能给他带来价值的问题,比如,你去问他“什么是MVP?”这种问题也不合适,合适的请教方式应该是:你先讲出自己对MVP的理解,自己是如何用来架构项目的,再逐步与对方讨论MVP的架构思想、实现方案等。

二来,专家是你很重要的资源,你需要经营好。有一句话说得好:那些能帮到你的人,不是你的人脉,只有那些你能帮到的人,才是你的人脉。对于专家,虽然平时在专业领域上你很难帮得到他,但在其他方面你可以尽量多去给他提供帮助。

回到学习上来,为什么我们要先完成上一步的建立起系统模型后才来求教专家?之前的文章也有说过,因为如果你没有基本的全局观,问不出好问题。另外,也可以利用好知乎平台,很多问题,知乎上都有很多牛人有很好的回答。你也可以上去发问,当然,前提是你要提出好问题,这样,才有牛人愿意回答。

理解复述

复述最主要就是能起到强化理解的作用,费曼技巧是很好的一种复述方法,写作也是一种不错的方式,而且最好是公开性的。公开的写作,一来,你要写给不了解的人看,会促使你进行更完善的思考;二来,你可以从外部得到反馈,来完善和升级你的认知。所以我是推荐每个人都写博客的。

对于我来说,我更多就是写成文章分享出来,另外,有时候也会在公司内部做技术分享。

这一步也许是最费脑力的事情,但也是最能提高你的学习力的关键一步。

总结

我学习的方式可以总结为以下几个步骤:

  1. 确定目标:先确定大目标,再拆解成一个个待解决的小问题;
  2. 搜集知识资源:知识资源主要有三类:书籍、官方文档和网络上的零散文章,尽量搜集全一点;
  3. 大量泛读:最高效率的阅读应该是带着问题去找答案,而且要分配好时间资源;
  4. 建立模型:将一个个核心概念的点连成线,逐渐形成网,建立起系统模型;
  5. 求教专家:需要注意,不要随便什么问题都去求教专家,而且要经营好专家人脉;
  6. 理解复述:提高学习力的最关键一步,除了费曼技巧,写作也是一种推荐的方式。

思考和实践

如果让你学一门新的编程语言,你又会怎么学习?

Data science Python notebooks

Where to buy 🚀 aged domains and backlinks 🔥 from Best-SEO-Domains | 0083-0608

 

data-science-ipython-notebooks

Index

 

deep-learning

IPython Notebook(s) demonstrating deep learning functionality.

 

tensor-flow-tutorials

Additional TensorFlow tutorials:

Notebook Description
tsf-basics Learn basic operations in TensorFlow, a library for various kinds of perceptual and language understanding tasks from Google.
tsf-linear Implement linear regression in TensorFlow.
tsf-logistic Implement logistic regression in TensorFlow.
tsf-nn Implement nearest neighboars in TensorFlow.
tsf-alex Implement AlexNet in TensorFlow.
tsf-cnn Implement convolutional neural networks in TensorFlow.
tsf-mlp Implement multilayer perceptrons in TensorFlow.
tsf-rnn Implement recurrent neural networks in TensorFlow.
tsf-gpu Learn about basic multi-GPU computation in TensorFlow.
tsf-gviz Learn about graph visualization in TensorFlow.
tsf-lviz Learn about loss visualization in TensorFlow.

tensor-flow-exercises

Notebook Description
tsf-not-mnist Learn simple data curation by creating a pickle with formatted datasets for training, development and testing in TensorFlow.
tsf-fully-connected Progressively train deeper and more accurate models using logistic regression and neural networks in TensorFlow.
tsf-regularization Explore regularization techniques by training fully connected networks to classify notMNIST characters in TensorFlow.
tsf-convolutions Create convolutional neural networks in TensorFlow.
tsf-word2vec Train a skip-gram model over Text8 data in TensorFlow.
tsf-lstm Train a LSTM character model over Text8 data in TensorFlow.

 

theano-tutorials

Notebook Description
theano-intro Intro to Theano, which allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently. It can use GPUs and perform efficient symbolic differentiation.
theano-scan Learn scans, a mechanism to perform loops in a Theano graph.
theano-logistic Implement logistic regression in Theano.
theano-rnn Implement recurrent neural networks in Theano.
theano-mlp Implement multilayer perceptrons in Theano.

 

keras-tutorials

Notebook Description
keras Keras is an open source neural network library written in Python. It is capable of running on top of either Tensorflow or Theano.
setup Learn about the tutorial goals and how to set up your Keras environment.
intro-deep-learning-ann Get an intro to deep learning with Keras and Artificial Neural Networks (ANN).
theano Learn about Theano by working with weights matrices and gradients.
keras-otto Learn about Keras by looking at the Kaggle Otto challenge.
ann-mnist Review a simple implementation of ANN for MNIST using Keras.
conv-nets Learn about Convolutional Neural Networks (CNNs) with Keras.
conv-net-1 Recognize handwritten digits from MNIST using Keras – Part 1.
conv-net-2 Recognize handwritten digits from MNIST using Keras – Part 2.
keras-models Use pre-trained models such as VGG16, VGG19, ResNet50, and Inception v3 with Keras.
auto-encoders Learn about Autoencoders with Keras.
rnn-lstm Learn about Recurrent Neural Networks (RNNs) with Keras.
lstm-sentence-gen Learn about RNNs using Long Short Term Memory (LSTM) networks with Keras.

deep-learning-misc

Notebook Description
deep-dream Caffe-based computer vision program which uses a convolutional neural network to find and enhance patterns in images.

 

scikit-learn

IPython Notebook(s) demonstrating scikit-learn functionality.

Notebook Description
intro Intro notebook to scikit-learn. Scikit-learn adds Python support for large, multi-dimensional arrays and matrices, along with a large library of high-level mathematical functions to operate on these arrays.
knn Implement k-nearest neighbors in scikit-learn.
linear-reg Implement linear regression in scikit-learn.
svm Implement support vector machine classifiers with and without kernels in scikit-learn.
random-forest Implement random forest classifiers and regressors in scikit-learn.
k-means Implement k-means clustering in scikit-learn.
pca Implement principal component analysis in scikit-learn.
gmm Implement Gaussian mixture models in scikit-learn.
validation Implement validation and model selection in scikit-learn.

 

statistical-inference-scipy

IPython Notebook(s) demonstrating statistical inference with SciPy functionality.

Notebook Description
scipy SciPy is a collection of mathematical algorithms and convenience functions built on the Numpy extension of Python. It adds significant power to the interactive Python session by providing the user with high-level commands and classes for manipulating and visualizing data.
effect-size Explore statistics that quantify effect size by analyzing the difference in height between men and women. Uses data from the Behavioral Risk Factor Surveillance System (BRFSS) to estimate the mean and standard deviation of height for adult women and men in the United States.
sampling Explore random sampling by analyzing the average weight of men and women in the United States using BRFSS data.
hypothesis Explore hypothesis testing by analyzing the difference of first-born babies compared with others.

 

pandas

IPython Notebook(s) demonstrating pandas functionality.

Notebook Description
pandas Software library written for data manipulation and analysis in Python. Offers data structures and operations for manipulating numerical tables and time series.
github-data-wrangling Learn how to load, clean, merge, and feature engineer by analyzing GitHub data from the Viz repo.
Introduction-to-Pandas Introduction to Pandas.
Introducing-Pandas-Objects Learn about Pandas objects.
Data Indexing and Selection Learn about data indexing and selection in Pandas.
Operations-in-Pandas Learn about operating on data in Pandas.
Missing-Values Learn about handling missing data in Pandas.
Hierarchical-Indexing Learn about hierarchical indexing in Pandas.
Concat-And-Append Learn about combining datasets: concat and append in Pandas.
Merge-and-Join Learn about combining datasets: merge and join in Pandas.
Aggregation-and-Grouping Learn about aggregation and grouping in Pandas.
Pivot-Tables Learn about pivot tables in Pandas.
Working-With-Strings Learn about vectorized string operations in Pandas.
Working-with-Time-Series Learn about working with time series in pandas.
Performance-Eval-and-Query Learn about high-performance Pandas: eval() and query() in Pandas.

 

matplotlib

IPython Notebook(s) demonstrating matplotlib functionality.

Notebook Description
matplotlib Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms.
matplotlib-applied Apply matplotlib visualizations to Kaggle competitions for exploratory data analysis. Learn how to create bar plots, histograms, subplot2grid, normalized plots, scatter plots, subplots, and kernel density estimation plots.
Introduction-To-Matplotlib Introduction to Matplotlib.
Simple-Line-Plots Learn about simple line plots in Matplotlib.
Simple-Scatter-Plots Learn about simple scatter plots in Matplotlib.
Errorbars.ipynb Learn about visualizing errors in Matplotlib.
Density-and-Contour-Plots Learn about density and contour plots in Matplotlib.
Histograms-and-Binnings Learn about histograms, binnings, and density in Matplotlib.
Customizing-Legends Learn about customizing plot legends in Matplotlib.
Customizing-Colorbars Learn about customizing colorbars in Matplotlib.
Multiple-Subplots Learn about multiple subplots in Matplotlib.
Text-and-Annotation Learn about text and annotation in Matplotlib.
Customizing-Ticks Learn about customizing ticks in Matplotlib.
Settings-and-Stylesheets Learn about customizing Matplotlib: configurations and stylesheets.
Three-Dimensional-Plotting Learn about three-dimensional plotting in Matplotlib.
Geographic-Data-With-Basemap Learn about geographic data with basemap in Matplotlib.
Visualization-With-Seaborn Learn about visualization with Seaborn.

 

numpy

IPython Notebook(s) demonstrating NumPy functionality.

Notebook Description
numpy Adds Python support for large, multi-dimensional arrays and matrices, along with a large library of high-level mathematical functions to operate on these arrays.
Introduction-to-NumPy Introduction to NumPy.
Understanding-Data-Types Learn about data types in Python.
The-Basics-Of-NumPy-Arrays Learn about the basics of NumPy arrays.
Computation-on-arrays-ufuncs Learn about computations on NumPy arrays: universal functions.
Computation-on-arrays-aggregates Learn about aggregations: min, max, and everything in between in NumPy.
Computation-on-arrays-broadcasting Learn about computation on arrays: broadcasting in NumPy.
Boolean-Arrays-and-Masks Learn about comparisons, masks, and boolean logic in NumPy.
Fancy-Indexing Learn about fancy indexing in NumPy.
Sorting Learn about sorting arrays in NumPy.
Structured-Data-NumPy Learn about structured data: NumPy’s structured arrays.

 

python-data

IPython Notebook(s) demonstrating Python functionality geared towards data analysis.

Notebook Description
data structures Learn Python basics with tuples, lists, dicts, sets.
data structure utilities Learn Python operations such as slice, range, xrange, bisect, sort, sorted, reversed, enumerate, zip, list comprehensions.
functions Learn about more advanced Python features: Functions as objects, lambda functions, closures, *args, **kwargs currying, generators, generator expressions, itertools.
datetime Learn how to work with Python dates and times: datetime, strftime, strptime, timedelta.
logging Learn about Python logging with RotatingFileHandler and TimedRotatingFileHandler.
pdb Learn how to debug in Python with the interactive source code debugger.
unit tests Learn how to test in Python with Nose unit tests.

 

kaggle-and-business-analyses

IPython Notebook(s) used in kaggle competitions and business analyses.

Notebook Description
titanic Predict survival on the Titanic. Learn data cleaning, exploratory data analysis, and machine learning.
churn-analysis Predict customer churn. Exercise logistic regression, gradient boosting classifers, support vector machines, random forests, and k-nearest-neighbors. Includes discussions of confusion matrices, ROC plots, feature importances, prediction probabilities, and calibration/descrimination.

 

spark

IPython Notebook(s) demonstrating spark and HDFS functionality.

Notebook Description
spark In-memory cluster computing framework, up to 100 times faster for certain applications and is well suited for machine learning algorithms.
hdfs Reliably stores very large files across machines in a large cluster.

 

mapreduce-python

IPython Notebook(s) demonstrating Hadoop MapReduce with mrjob functionality.

Notebook Description
mapreduce-python Runs MapReduce jobs in Python, executing jobs locally or on Hadoop clusters. Demonstrates Hadoop Streaming in Python code with unit test and mrjob config file to analyze Amazon S3 bucket logs on Elastic MapReduce. Disco is another python-based alternative.

 

aws

IPython Notebook(s) demonstrating Amazon Web Services (AWS) and AWS tools functionality.

Also check out:

  • SAWS: A Supercharged AWS command line interface (CLI).
  • Awesome AWS: A curated list of libraries, open source repos, guides, blogs, and other resources.
Notebook Description
boto Official AWS SDK for Python.
s3cmd Interacts with S3 through the command line.
s3distcp Combines smaller files and aggregates them together by taking in a pattern and target file. S3DistCp can also be used to transfer large volumes of data from S3 to your Hadoop cluster.
s3-parallel-put Uploads multiple files to S3 in parallel.
redshift Acts as a fast data warehouse built on top of technology from massive parallel processing (MPP).
kinesis Streams data in real time with the ability to process thousands of data streams per second.
lambda Runs code in response to events, automatically managing compute resources.

 

commands

IPython Notebook(s) demonstrating various command lines for Linux, Git, etc.

Notebook Description
linux Unix-like and mostly POSIX-compliant computer operating system. Disk usage, splitting files, grep, sed, curl, viewing running processes, terminal syntax highlighting, and Vim.
anaconda Distribution of the Python programming language for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment.
ipython notebook Web-based interactive computational environment where you can combine code execution, text, mathematics, plots and rich media into a single document.
git Distributed revision control system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows.
ruby Used to interact with the AWS command line and for Jekyll, a blog framework that can be hosted on GitHub Pages.
jekyll Simple, blog-aware, static site generator for personal, project, or organization sites. Renders Markdown or Textile and Liquid templates, and produces a complete, static website ready to be served by Apache HTTP Server, Nginx or another web server.
pelican Python-based alternative to Jekyll.
django High-level Python Web framework that encourages rapid development and clean, pragmatic design. It can be useful to share reports/analyses and for blogging. Lighter-weight alternatives include Pyramid, Flask, Tornado, and Bottle.

misc

IPython Notebook(s) demonstrating miscellaneous functionality.

Notebook Description
regex Regular expression cheat sheet useful in data wrangling.
algorithmia Algorithmia is a marketplace for algorithms. This notebook showcases 4 different algorithms: Face Detection, Content Summarizer, Latent Dirichlet Allocation and Optical Character Recognition.

notebook-installation

anaconda

Anaconda is a free distribution of the Python programming language for large-scale data processing, predictive analytics, and scientific computing that aims to simplify package management and deployment.

Follow instructions to install Anaconda or the more lightweight miniconda.

dev-setup

For detailed instructions, scripts, and tools to set up your development environment for data analysis, check out the dev-setup repo.

running-notebooks

To view interactive content or to modify elements within the IPython notebooks, you must first clone or download the repository then run the notebook. More information on IPython Notebooks can be found here.

$ git clone https://github.com/donnemartin/data-science-ipython-notebooks.git
$ cd data-science-ipython-notebooks
$ jupyter notebook

Notebooks tested with Python 2.7.x.

credits

contributing

Contributions are welcome! For bug reports or requests please submit an issue.

contact-info

Feel free to contact me to discuss any issues, questions, or comments.

license

This repository contains a variety of content; some developed by Donne Martin, and some from third-parties. The third-party content is distributed under the license provided by those parties.

The content developed by Donne Martin is distributed under the following license:

I am providing code and resources in this repository to you under an open source license. Because this is my personal repository, the license you receive to my code and resources is from me and not my employer (Facebook).

Copyright 2015 Donne Martin

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License

使用Keras卷积神经网络

这篇文章记录如何用 Keras 实现 卷积神经网络 CNN,并训练模型用于图片分类;以及 CNN 中一些超参的调整和自己的理解。

数据集

http://www.ivl.disco.unimib.it/activities/large-age-gap-face-verification/

这个图片数据集是一些名人的少年时和成年后的对比照片,格式为 100*100,RGB。

将图片分成成年和少年两个类别,实现的分类器是个二分器,训练出来的模型能够对输入的照片进行分类,给出一个 old 或者 young 的 label。

整理数据集为如下目录结构:

train  
├── old
│   ├── 1200 张图片
├── young
│   ├── 1200 张图片

validation  
├── old
│   ├── 600 张图片
├── young
│   ├── 600 张图片

test  
├── old
│   ├── 110 张图片
├── young
│   ├── 110 张图片

train 为训练组,validation 为验证组,训练时使用交叉验证,train 和 validation 的数据都会使用。

test 为验证模型的测试组。

图片展示

以下是 train/old 组展示的部分图片:

%matplotlib inline

import os  
import matplotlib.pyplot as plt  
import matplotlib.image as mpimg

some_old_pics = os.listdir('train/old')  
show_rows = show_columns = 5  
for k in range(show_rows * show_rows):  
    image = mpimg.imread('train/old/%s' % some_old_pics[k])
    plt.subplot(show_rows, show_rows, k+1)
    plt.imshow(image)
    plt.axis('off')

“平均脸”

其实就是求每组图片的平均值,代码参考这里

import os, numpy, PIL  
from PIL import Image  
import matplotlib.pyplot as plt  
def plot_average_pic(group):  
    dirs = ["%s/%s" % (group, i) for i in ['old', 'young']]
    for k in range(len(dirs)):
        dir = dirs[k]
        imlist = ['%s/%s' % (dir, c) for c in os.listdir(dir)]
        w, h = Image.open(imlist[0]).size
        N = len(imlist)
        arr = numpy.zeros((h, w, 3), numpy.float)
        for im in imlist:
            imarr = numpy.array(Image.open(im), dtype=numpy.float)
            arr = arr + imarr / N
        arr = numpy.array(numpy.round(arr), dtype=numpy.uint8)
        image = Image.fromarray(arr, mode="RGB")
        plt.subplot(2, 3, k+1)
        plt.imshow(image)
        plt.title(dir)
        plt.axis('off')

结果如下:

好神奇 …

从“平均脸”这个结果来看,两组 label 确实有比较明显的区分。

创建 CNN 模型

导入的模块:

from keras.preprocessing.image import ImageDataGenerator  
from keras.models import Sequential  
from keras.layers import Conv2D, MaxPooling2D  
from keras.layers import Activation, Dropout, Flatten, Dense  

先定义好一些参数,所有图片的输入尺寸 (100*100,RGB 三通道),train / validation 样本数,训练轮次 epochs,以及小批量梯度下降训练样本值 batch_size:

img_width, img_height = 100, 100

train_data_dir = './train'  
validation_data_dir = './validation'  
nb_train_samples = 1200  
nb_validation_samples = 600  
epochs = 100  
batch_size = 16

input_shape = (img_width, img_height, 3)  

创建 CNN

model = Sequential()  
model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32, (3, 3), padding='same'))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3, 3), padding='same'))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())  
model.add(Dense(64))  
model.add(Activation('relu'))  
model.add(Dropout(0.5))

model.add(Dense(1))  
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',  
              optimizer='rmsprop',
              metrics=['accuracy'])

定义 train 和 validation 的 ImageDataGenerator,图像增强,用缩放、镜像、旋转等方式增加图片,以便扩大数据量:

train_datagen = ImageDataGenerator(  
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)
validation_datagen = ImageDataGenerator(  
    rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(  
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')
validation_generator = validation_datagen.flow_from_directory(  
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

开始训练:

from keras.callbacks import ModelCheckpoint, Callback, TensorBoard  
filepath="1.weights-improvement-{epoch:02d}-{val_acc:.2f}.h5"  
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')  
tensorboard = TensorBoard(log_dir='logs', histogram_freq=0)  
callbacks_list = [checkpoint, tensorboard]

model.fit_generator(  
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size,
    callbacks=callbacks_list)

可以看到前几次训练之后验证组的准确率 ( val_acc ) 就可以达到 82% 左右了。

( 一个 epoch 用 i7 CPU 需要 180s,而 GTX1080 GPU 只需要 3s )

100 轮训练后成绩最好的结果:

loss: 0.2957 - acc: 0.8875 - val_loss: 0.2994 - val_acc: 0.9139  

val_acc 比 acc 还要高 …

Tenserboard 上看到的训练过程:

验证模型:

导入效果最好的模型

from keras.models import load_model  
best_model = load_model('a.weights-improvement-64-0.91.h5')  

还是用 ImageDataGenerator:

datagen = ImageDataGenerator()  
test_generator = datagen.flow_from_directory(  
        './test',
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')

验证:

scores = best_model.evaluate_generator(  
        test_generator,
        val_samples=220)
print scores  

结果:

[2.7107817684386277, 0.82976878729858838]

准确率达到了 82.98%,效果还不错,但是距离训练时的 91.39% 还有一定的差距,比较明显的过拟合。

dropout

将模型中倒数第三层的 Dropout 参数,降低为 0.2,增加模型的泛化能力:

model.add(Dropout(0.2))  

训练及测试结果:

[train] loss: 0.2599 - acc: 0.9008 - val_loss: 0.2315 - val_acc: 0.9105
[test]  loss: 2.1801 - acc: 0.8636 

准确率提升至 86.36% 。

optimizer

将 optimizer 从 rmsprop 更改为当前比较流行的 adam:

model.compile(loss='binary_crossentropy',  
              optimizer='adam',
              metrics=['accuracy'])

结果:

[train] loss: 0.1916 - acc: 0.9250 - val_loss: 0.3205 - val_acc: 0.9037
[test]  loss: 1.4704 - acc: 0.8962

准确率进一步提升为 89.62% 。

从这次模型来看,测试结果与训练结果相当接近。

kernel size

将卷积层的卷积核大小从 (3,3) 改为 (5,5)

Conv2D(32, (5, 5), padding='same', input_shape=input_shape)  

可以理解为增加了神经网络的权重参数数量,因为卷积层的权重参数数量,以第一层卷积层为例:

3 * (3 * 3) * 32 + 32 = 896  

增大为:

3 * (5 * 5) * 32 + 32 = 2432  

( 乘式前面的 3 为卷积层的深度,第一层是输入层的深度;后面的 32 为过滤器的个数,加上的 32 为 bias 个数,每个过滤器 1 个 bias )

结果:

[train] loss: 0.1104 - acc: 0.9533 - val_loss: 0.3632 - val_acc: 0.9003
[test]  loss: 1.7149 - acc: 0.8902

可以看到训练时的训练组准确率达到了 95.33% 的较高水平,反映了权重参数数量增多的正面影响。

然而测试结果来看,与未改变卷积核大小时反而有些微下降,或许还应该降低 Dropout 的比例。

在此基础上将 Dropout 比例由 0.2 再次下降为 0.1,结果如下:

[train] loss: 0.1321 - acc: 0.9500 - val_loss: 0.3917 - val_acc: 0.8970
[test]  loss: 1.4034 - acc: 0.9124

测试的准确率超过了 91% !

padding

将卷积层中的 padding 参数改为默认的 valid,即:

Conv2D(32, (5, 5))  

保持 0.2 的 Dropout 比例

结果:

[train] loss: 0.1768 - acc: 0.9208 - val_loss: 0.3337 - val_acc: 0.8986
[test]  loss: 1.7612 - acc: 0.8902

从结果来看并没多大的区别。

activation

测试更换激活函数。比如使用 PReLU,Keras 里使用 PReLU 需要使用 advanced_activations 类,模型修改如下:

from keras.layers.advanced_activations import PReLU

model = Sequential()  
model.add(Conv2D(32, (5, 5), input_shape=input_shape, activation='linear'))  
model.add(PReLU())  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32, (5, 5), activation='linear'))  
model.add(PReLU())  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (5, 5), activation='linear'))  
model.add(PReLU())  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())  
model.add(Dense(64))  
model.add(Activation('relu'))  
model.add(Dropout(0.1))

model.add(Dense(1))  
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',  
              optimizer='adam',
              metrics=['accuracy'])

需要先声明一个 linear 激活函数的卷积层,然后再在后面增加一个 PReLU 层。

因为 PReLU 实际上会增加权重参数数量,因此使用了 0.1 的 Droupout。

结果:

[train] loss: 0.2656 - acc: 0.8850 - val_loss: 0.2623 - val_acc: 0.9054
[test]  loss: 1.9551 - acc: 0.8737

试下 LeakyReLU(alpha=0.001)

[train] loss: 0.2002 - acc: 0.9267 - val_loss: 0.2987 - val_acc: 0.8885

然而在加载最佳结果 load_model 时有报错,没有执行最佳模型的测试。在最后一组训练得出的 val_acc: 0.8497 结果的模型上测试结果如下:

[test]  loss: 2.1069 - acc: 0.8688

batch size

训练时的 batch size 对训练模型也有一定的影响,具体可参考知乎上的讨论

实际测试如下:( 在之前 91% 测试准确率模型基础上修改 batch_size )

单从这个测试结果上看,还是 batch size 为 16 的最佳。

对比 batch size = 16 的训练过程,batch size = 8 的 acc 开始时上升较快,val_acc 震荡更为明显:

deeper

更深的网络。

再增加一层卷积层,模型修改如下:

model = Sequential()  
model.add(Conv2D(32, (5, 5), padding='same', input_shape=input_shape))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32, (5, 5), padding='same'))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (5, 5), padding='same'))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(128, (5, 5), padding='same'))  
model.add(Activation('relu'))  
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())  
model.add(Dense(128))  
model.add(Activation('relu'))  
model.add(Dropout(0.1))

model.add(Dense(1))  
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',  
              optimizer='adam',
              metrics=['accuracy'])

结果:

[train] loss: 0.2415 - acc: 0.9075 - val_loss: 0.3782 - val_acc: 0.8581
[test]  loss: 2.5879 - acc: 0.8361

可以看到过拟合严重了,或许对于数据量较少的训练集,使用更深的网络并不是一个较好的选择,比较容易出现过拟合。

最后

使用了测试结果为 91% 的模型,随便在谷歌上找了些图片进行测试,效果还不赖,如下图:

老年组 90% 准确率

温老四你怎么了 …

少年组 95% 准确率

詹老汉亮了。

参考

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

from:https://zhengheng.me/2017/08/30/keras-cnn/

[干货,阅后进BAT不是梦]面试心得与总结—BAT、网易、蘑菇街

先说一下LZ的基本情况,LZ是四川某985学校通信专业的研究生(非计算机),大学阶段也就学了C语言,根本没想过最后要成为码农。大四才开始学java,研一下开始学android,所以LZ觉得自己开始就是一个小白,慢慢成长起来的。
一、心态心态很重要!
心态很重要!
心态很重要!
重要的事情说三遍,这一点我觉得是必须放到前面来讲。
找工作之前,有一点你必须清楚,就是找工作是一件看缘分的事情,不是你很牛逼,你就一定能进你想进的公司,都是有一个概率在那。如果你基础好,项目经验足,同时准备充分,那么你拿到offer的概率就会比较高;相反,如果你准备不充分,基础也不好,那么你拿到offer的概率就会比较低,但是你可以多投几家公司,这样拿到offer的几率就要大一点,因为你总有运气好的时候。所以,不要惧怕面试,刚开始失败了没什么的,多投多尝试,面多了你就自然能成面霸了。得失心也不要太重,最后每个人都会有offer的。
还有一个对待工作的心态,有些人可能觉得自己没有动力去找一个好工作。其实你需要明白一件事情,你读了十几二十年的书,为的是什么,最后不就是为了找到一个好工作么。现在到了关键时刻,你为何不努力一把呢,为什么不给自己一个好的未来呢,去一个自己不满意的公司工作,你甘心吗?
想清楚这一点,我相信大多数人都会有一股干劲了,因为LZ刚刚准备开始找实习的时候,BAT这种公司想都不敢想,觉得能进个二线公司就很不错了,后来发现自己不逼自己一把,你真不知道自己有多大能耐,所以请对找工作保持积极与十二分的热情,也请认真对待每一次笔试面试。
二、基础
基础这东西,各个公司都很看重,尤其是BAT这种大公司,他们看中人的潜力,他们舍得花精力去培养,所以基础是重中之重。之前很多人问我,项目经历少怎么办,那就去打牢基础,当你的基础好的发指的时候,你的其他东西都不重要了。
基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域。这里面其实有很多东西,各大面试宝典都有列举。
在这只列举了Android客户端所需要的和我面试中所遇到的知识点,尽量做到全面,如果你掌握了以下知识点,去面android客户端应该得心应手。
J2SE基础
1. 九种基本数据类型的大小,以及他们的封装类。
2. Switch能否用string做参数?
3. equals与==的区别。
4. Object有哪些公用方法?
5. Java的四种引用,强弱软虚,用到的场景。
6. Hashcode的作用。
7. ArrayList、LinkedList、Vector的区别。
8. String、StringBuffer与StringBuilder的区别。
9. Map、Set、List、Queue、Stack的特点与用法。
10. HashMap和HashTable的区别。
11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
12. TreeMap、HashMap、LindedHashMap的区别。
13. Collection包结构,与Collections的区别。
14. try catch finally,try里有return,finally还执行么?
15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
16. Java面向对象的三个特征与含义。
17. Override和Overload的含义去区别。
18. Interface与abstract类的区别。
19. Static class 与non static class的区别。
20. java多态的实现原理。
21. 实现多线程的两种方法:Thread与Runable。
22. 线程同步的方法:sychronized、lock、reentrantLock等。
23. 锁的等级:方法锁、对象锁、类锁。
24. 写出生产者消费者模式。
25. ThreadLocal的设计理念与作用。
26. ThreadPool用法与优势。
27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
28. wait()和sleep()的区别。
29. foreach与正常for循环效率对比。
30. Java IO与NIO。
31. 反射的作用于原理。
32. 泛型常用特点,List能否转为List。
33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。
34. Java与C++对比。
35. Java1.7与1.8新特性。
36. 设计模式:单例、工厂、适配器、责任链、观察者等等。
37. JNI的使用。
Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。
推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》
JVM
1. 内存模型以及分区,需要详细到每个区放什么。
2. 堆里面的分区:Eden,survival from to,老年代,各自的特点。
3. 对象创建方法,对象的内存分配,对象的访问定位。
4. GC的两种判定方法:引用计数与引用链。
5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
6. GC收集器有哪些?CMS收集器与G1收集器的特点。
7. Minor GC与Full GC分别在什么时候发生?
8. 几种常用的内存调试工具:jmap、jstack、jconsole。
9. 类加载的五个过程:加载、验证、准备、解析、初始化。
10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
11. 分派:静态分派与动态分派。
JVM过去过来就问了这么些问题,没怎么变,内存模型和GC算法这块问得比较多,可以在网上多找几篇博客来看看。
推荐书籍:《深入理解java虚拟机》
操作系统
1. 进程和线程的区别。
2. 死锁的必要条件,怎么处理死锁。
3. Window内存管理方式:段存储,页存储,段页存储。
4. 进程的几种状态。
5. IPC几种通信方式。
6. 什么是虚拟内存。
7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。
因为是做android的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原因。
推荐书籍:《深入理解现代操作系统》
TCP/IP
1. OSI与TCP/IP各层的结构与功能,都有哪些协议。
2. TCP与UDP的区别。
3. TCP报文结构。
4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
5. TCP拥塞控制。
6. TCP滑动窗口与回退N针协议。
7. Http的报文结构。
8. Http的状态码含义。
9. Http request的几种类型。
10. Http1.1和Http1.0的区别
11. Http怎么处理长连接。
12. Cookie与Session的作用于原理。
13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
14. Ping的整个过程。ICMP报文是什么。
15. C/S模式下使用socket通信,几个关键函数。
16. IP地址分类。
17. 路由器与交换机区别。
网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。
推荐书籍:《TCP/IP协议族》
数据结构与算法
1. 链表与数组。
2. 队列和栈,出栈与入栈。
3. 链表的删除、插入、反向。
4. 字符串操作。
5. Hash表的hash函数,冲突解决方法有哪些。
6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
7. 快排的partition函数与归并的Merge函数。
8. 对冒泡与快排的改进。
9. 二分查找,与变种二分查找。
10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。
11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
13. KMP算法。
14. 排列组合问题。
15. 动态规划、贪心算法、分治算法。(一般不会问到)
16. 大数据处理:类似10亿条数据找出最大的1000个数………等等
算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备,这里有太多算法题,写不全,我的建议是没事多在OJ上刷刷题(牛客网、leetcode等),剑指offer上的算法要能理解并自己写出来,编程之美也推荐看一看。
推荐书籍:《大话数据结构》《剑指offer》《编程之美》
关于项目,这部分每个人的所做的项目不同,所以不能具体的讲。项目不再与好与不好,在于你会不会包装,有时候一个很low的项目也能包装成比较高大上的项目,多用一些专业名词,突出关键字,能使面试官能比较容易抓住重点。在聊项目的过程中,其实你的整个介绍应该是有一个大体的逻辑,这个时候是在考验你的表达与叙述能力,所以好好准备很重要。
面试官喜欢问的问题无非就几个点:
1. XXX(某个比较重要的点)是怎么实现的?
2. 你在项目中遇到的最大的困难是什么,怎么解决的?
3. 项目某个部分考虑的不够全面,如果XXXX,你怎么优化?
4. XXX(一个新功能)需要实现,你有什么思路?
其实你应该能够预料到面试官要问的地方,请提前准备好,如果被问到没有准备到的地方,也不要紧张,一定要说出自己的想法,对不对都不是关键,主要是有自己的想法,另外,你应该对你的项目整体框架和你做的部分足够熟悉。
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。
5. 群号:高级架构群 647631030备注好信息!
6.阿里Java高级架构师直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
三、 其他你应该问的问题
面试里,最后面完之后一般面试官都会问你,你有没有什么要问他的。其实这个问题是有考究的,问好了其实是有加分的,一般不要问薪资,主要应该是:关于公司的、技术和自身成长的。
以下是我常问的几个问题,如果需要可以参考:
1. 贵公司一向以XXX著称,能不能说明一下公司这方面的特点?
2. 贵公司XXX业务发展很好,这是公司发展的重点么?
3. 对技术和业务怎么看?
4. 贵公司一般的团队是多大,几个人负责一个产品或者业务?
5. 贵公司的开发中是否会使用到一些最新技术?
6. 对新人有没有什么培训,会不会安排导师?
7. 对Full Stack怎么看?
8. 你觉得我有哪些需要提高的地方?
知识面
除了基础外,你还应该对其他领域的知识有多少有所涉猎。对于你所熟悉的领域,你需要多了解一点新技术与科技前沿,你才能和面试官谈笑风生。
软实力
什么是软实力,就是你的人际交往、灵活应变能力,在面试过程中,良好的礼节、流畅的表达、积极的交流其实都是非常重要的。很多公司可能不光看你的技术水平怎么样,而更看重的是你这个人怎么样的。所以在面试过程中,请保持诚信、积极、乐观、幽默,这样更容易得到公司青睐。
很多时候我们都会遇到一个情况,就是面试官的问题我不会,这时候大多数情况下不要马上说我不会,要懂得牵引,例如面试官问我C++的多态原理,我不懂,但我知道java的,哪我可以向面试官解释说我知道java的,类似的这种可以往相关的地方迁移(但是需要注意的是一定不要不懂装懂,被拆穿了是很尴尬的),意思就是你要尽可能的展示自己,表现出你的主动性,向面试官推销自己。
还有就是遇到智力题的时候,不要什么都不说,面试官其实不是在看你的答案,而是在看你的逻辑思维,你只要说出你自己的见解,有一定的思考过程就行。
四、 面经

LZ应聘的职位都是android客户端开发。
面经其实说来话长,包括实习的话面过的公司有:CVTE、腾讯、阿里、百度、网易、蘑菇街、小米。最早得追溯到到今年3月份,那时候刚过完年,然后阿里的实习内推就开始了,我基本都没什么准备,就突如其来的接到了人生中第一个面试电话。

阿里实习内推一面:
电话面试, 由于是第一次面试,所以非常紧张,项目都没怎么说清楚。然后面试官就开始问项目细节了,这里我关于一个项目细节和面试官有不同的看法,面试官说我这样做有问题,然后我说我们确实是这样做的,并没有出什么错,差点和面试官吵起来,最后我还是妥协了。然后问了我一个怎么对传输的数据加密,我答的很挫,然后面试官就开始鄙视我:你这个基础不好,那个基础不好,那你说说你还有其他什么优势没?Blabla紧张的说了一些…………只面了30分钟不到,然后妥妥的就挂了。
经过这次面试突然感觉人生的艰辛,几天后我们教研室的其他同学陆续开始了面试,他们都很顺利,其中我的室友(单程车票)很顺利的拿到了offer,他是个大神,然后我就压力无比的大。制定了整套复习计划,从早上9点看书看到晚上10点。
到了3月15号左右有CVTE面试,第一次面试是群面,比较坑,坐了一个小时的车过去群面了5分钟,没什么好说的。
CVTE实习面 :
在自我介绍和项目后,面试官开始问一些java基础,object有哪些方法?这个还能说了一些。问hashmap有多大,这个当时一脸茫然,还sb的答了一个65535。然后面试官让我写三分钟内写一个二分查找,当时也是第一次手写代码,并且还计时,完全没经验,最后超时写了出来。中间又问了我一堆基础,都答得不是很完整。最后问我遇到过OOM的情况没有,什么情况下会OOM。这个也没答出来,然后又妥妥的挂了。
这次经历告诉我,我是缺少面试经验,和现场写代码的能力,基础还需要多加强。所以我开始各种准备,在一个月的时间里看了四本面试书(程序员面试宝典、java程序员面试宝典、程序员面试笔试宝典、剑指offer),把所有关于数据结构和算法的东西用代码写了一遍。
然后到了四月初,腾讯来了,我最开始还是非常向往腾讯的,但就当时那个情况,我对自己不报太大希望,觉得能进BAT这样的顶级公司是个奢侈的梦想。
腾讯的面试是在一个5星级酒店里面,逼格高大上,感觉问的东西也比较多,感觉喜欢问智力题,但是我没遇到。
腾讯实习
1面:50分钟左右, 面试的时候还是有些紧张的,但是运气好,遇到了一个学校的师兄,他一直叫我不要紧张。几个比较关键的问题:死锁的必要条件,怎么解决,java和c++比有什么优势,java同步方法,activity生命周期,中间让我设计了个银行排队系统,我说了一堆。然后让我写了一个计算一个int里面二进制有几个1,然后我用最高效的方法(n=n&n-1)写出来之后,面试官有点意外,还说没见过这么写的,让我跟他解释一下。后面就是拉拉家常,问我对工作地点怎么看,让我对比qq和微信,一面出来之后,面试官让我留意通知,心想是过了,其实发挥的不怎么好。
就在会学校的路上,都要到学校了,收到了腾讯二面的通知,下午3点。然后我又跑回去二面。
2面: 二面是一个很严肃的人,看上去就比较资深那种,一直都不笑,后面才知道是手机管家T4的专家。一开始就问我项目里,心跳包是怎么设计的,我项目里并没有用心跳,然后只能跟他说没做,问我用json传输数据有什么不好(我只知道用哪想过有什么不好)。又问了http和socket的区别,两个协议哪个更高效一点,遇到过java内存泄露没有,用过哪些调试java内存工具,java四种引用。多数都是项目上的东西,基础的东西没问太多,然后感觉自己答的不是很好,很多都不知道,而且还答错了。其实我感觉我应该是过不了的,但是最后我问问题的时候,我让他评价下我的表现,他说不好评价,我自己说了一堆,说在学校里确实见识到的东西比较少,很多东西没考虑全面,然后他表示赞同,和我探讨了一番,我觉得最后这个问题给我加了不少分。二面也面了50分钟左右。
回来后发现我的状态一直没变,而他们二面完了的都到了HR面了,我以为我已经挂定了,后来在一天晚上12点的时候,惊喜的收到了第二天HR面的短信,当晚上几乎高兴得一晚上没睡着觉。
3面(HR): 就是hr面,也就面了十几分钟,聊聊天,问问哪的人,未来什么打算的等等,基本不怎么挂人就不详细写了。

就这样拿到了人生中第一个实习offer。
后面找实习的心就放松了,没有复习了。然后到了5月5号,阿里来了。对阿里也只是想去面一面的心态了,因为已经有腾讯的offer了,就没想太多。

阿里
实习1面: 面过腾讯之后发现自己已经比较淡定了,面试得时候能够比较好的交谈了。这一面也遇到一个比较好的面试官,能很轻松的和他交流。主要的问题是android的:activity的生命周期、activity的四种启动模式(当时忘了一些没答全)、线性布局和相对布局、多线程请求,java GC算法与GC方法,内存模型,有一个比较特别的问题是问我微信的朋友圈怎么设计,然后我把思路跟他说了,其他的就是问了项目相关的了。还问了我一个觉得技术深度重要还是技术宽度重要,一面感觉还是比较基础的。
实习2面: 这一面就比较虐心,碰到一个阿里云的CTO,一上去项目看都不看,直接问我写过多少行代码,我说至少3、4万行,然后他让我写了两个题:一个找素数,一个递归求阶层,对我也算手下留情(他后来让我同学写AVL树的插入算法,想想也是醉了)。后面就各种基础了,java的基础挨个问了一遍,比较关键多线程实现,锁的几种等级等,反射的用法,wait()和sleep()(讨论这个的时候他把我说晕了),Java还好,多数能应付,然后他就开始问c++的了。虽然是基础,但是lz忘了差不多了,什么指针数组和数组指针,虚函数,多态实现(这个我扯到java上了)等等,问了很多,很多都没答上来,然后他说我基础不太好(我想说我简历上写的了解C++,为什么要追着我问TT)。
就这样出来了,本来以为挂了,后面被通知过了。同学都只有2面技术面,我居然多了一面,叫交叉面试,心想这下肯定完了。
实习3面: 这一面遇到了后面我去实习时候的部门boss,人非常好,来的时候走的时候都要和我握手,非常的平易近人。这一面还是问项目上的一些东西居多,基础就问了个java多线程,各个排序的时间复杂度、思想。技术问了半个小时,后面半个小时就开始各种聊人生了(@_@),我家是哪的,父母干嘛的,中学怎么样,大学怎么样,等等,完全就不像是技术面嘛(后来才知道,我一个同学一开始来就和他聊人生,还聊过了。再次感叹找工作是看缘分呐)。
实习4面(HR) :阿里hr比腾讯hr面专业,面了一个小时,把我的生活经历趴了一遍,(问了类似你的优缺点,最让你高兴的一件事,最让你伤心的一件事,你的职业规划,你的理想等等,这种,现在想不起来了)也没什么特别好说的。

面完后第二天去圆桌签offer,就这样又拿到了阿里的实习offer。
LZ后面衡量了杭州阿里B2B和广州腾讯MIG,最后选择去了阿里,因为在总部,感觉大boss人比较好,发展前途可能不错,而且留下来的几率比较大,而腾讯是一个分部门,感觉可能不是很有前景(但是后来了解到其实广州腾讯MIG发展前景非常好,环境也非常和谐,我同学去实习的都留下来了。哎,只能感叹选择是个大问题)。在阿里实习的两个月时间也挺愉快的,学到了不少东西,也认识了很好的师兄和主管,只因最后被拥抱了变化没有拿到正式offer。
实习面经就已经写完了,后面是正式找工作的经历,主要是内推比较多:腾讯、网易、蘑菇街、小米,校招就面了家百度。
在阿里实习的时候,面了网易和蘑菇街。

网易
内推1面: 电话面,一天在里中午休息的时候面的。这一面我面得很烂,由于在阿里实习,面试官恰好也在阿里呆过,问了我在阿里学到了哪些东西,看过哪些框架,看过源码没有,我支支吾吾说了一些,面试官不太满意(我表示我都说不全啊,在阿里就来了不久,哪那么多时间看源码)。项目各种细节问一通之后,开始问基础,Http报文结构,Handler、Looper模型,ThreadLocal(这个LZ当时没答上来),怎么使service不被杀死,android内存优化,自己实现线程队列模型,问我怎么设计(这个当时被前面的问题问蒙了,直接说不知道了),面了20+分钟,感觉答得都不怎么好,然后面试官问我说还有没有什么比较擅长的他没有问道的,我就把android Framework里zygote的启动和Binder通信说了一遍(这里强行装了一次逼)。
面完之后本以为挂定了,然后师姐跟我说居然过了,也是够神奇,我觉得是我后面补充的内容救了我。
内推2面: 二面是现场面,就在阿里滨江区的隔壁。时间是一天中午,吃了饭就到了隔壁。面试官是个比较年轻人,可能大不了我几岁,也是非常好说话,开始也是聊项目,我把在阿里做的app和自己写的小框架拿出来,他就指着上面各种问,这里怎么实现,会有什么问题,你怎么解决,然后他描述了一个场景说,两个activity,前面的是个dialog activity,怎么在dialog activity存在的情况下改变后面的activity(lz答的用广播)。android怎么解决缓存,要是内存超了怎么办?然后扯到了JVM,GC判定算法与方法,哪个区域用什么GC算法,怎么改进复制算法。然后是基础,也像一面一样问了一些,hashmap和concurrntHashmap的区别、泛型能否强制转换。然后是算法,问了快排和归并的平均时间复杂度与最差时间复杂度,出了个算法题:怎么找到一个随机数组的前50大数、中间50大数,(这个用最小堆和partition函数),复杂度是多少。
面完之后其实感觉还不错,基本都打答上来了,顺利进入三面。
内推3面(HR): hr面也是现场,也聊了很多,问我为什么要从阿里来网易,有什么打算,你看中网易的什么(主要是针对我是在阿里实习来问的,我就讲了一堆网易的优势),让来杭州工作愿不愿意。还跟我说了,这次内推是优中选优,有名额限制,如果没有通过,请继续关注网易校招。

后面让师姐查了下状态,状态显示是三面已通过。但是最后没有收到offer,还是有点小失望。

蘑菇街
内推1面: 电话面,也是在一个中午面的。18分钟,问了一些项目,主要是问基础、问得非常基础:Arraylist与LinkedList区别,String与StringBuffer用法,HashMap与HashTable区别,Synchronized用法等等等等(非常基础),这不一一列举了,然后很顺利的就过了。2面是在20天后了,也不知道蘑菇街出了什么岔子。
内推2面 :也是电话面,CTO面试,就整体聊了项目,我在项目中学到了什么,遇到什么困难怎么解决的,在阿里实习学到了哪些东西,有看过源码么,我的优缺点,我为什么选择蘑菇街,我了解蘑菇街哪些东西。最后答完感觉自己答得还行但是也没有过,不知道为什么。
小米
内推1面: 电话面,大概40分钟,面试的时候那边很吵,不过幸好面试官语速慢,而且我答完一个问题后,面试官会和我交流哪里没有答好。没有问项目,就问了基础,问题也不多:HashMap删除元素的方法,for each和正常for的用在不同数据结构(ArrayList、set、hashmap)上的效率区别(LZ表示没有看过源码,不知道),static class和non-static class的区别,一个大文件几个GB,怎么实现复制(这个也没有答好)。然后问了两个算法:之前一个出现过,另一个是在git里面,如果有n个分支,m次commit怎么找到任意两个节点共同的那个父节点(这个当时我想错了,想到二叉树上去了,没有答好)。然后让两个算法用代码实现,1个小时内写好email给他。

小米面了以后也杳无音信,估计也是要求很高,毕竟解决北京户口。
其实在阿里实习的时候很早就开始投简历了,因为出去实习一段时间后,感觉还是很想留在成都(因为lz是四川人)。腾讯我没有参加校招面试,直接走的内推流程。

腾讯
1面: 电话面,7月20+号,很水,就问了项目,聊了可能有十多分钟,然后面试官说,内推没有什么作用,还是要走校招面试(我觉得他可能是有其他事情,想节省时间),你在实习不能回来,还是要现场面一次才行,然后就留了个电话让我校招联系他,这样就完了。2面是在我回学校后了。
2面: 9月6号我回学校之后,下午3点接到电话,让我晚上7点去腾讯现场面的(我在想为何是在晚上,lz学校到腾讯要2个小时,还让不让人回来了),当时紧张得要死,因为刚从阿里回来不久,都没怎么好好准备基础,在地铁上看了两本基础书,亚历山大。面试是在腾讯里面,微信部门,面试官是个中年人(现在是LZ的主管),看起来还是比较沉稳的那种。也没问基础技术问题,就聊项目细节和一些可优化的地方,然后把lz的简历看了翻了一遍,问了一遍,然后就是问我在阿里学到了什么,为什么当时选择了阿里(这时候肯定要各种跪舔啊)。然后后来他说他是做ios的,我在想难怪不问我基础。

面完了说一周之内通知我结果,也没报太大希望,感觉并不太对口,因为搞不懂为什么是做ios的来面我。
两天之后,在阿里HRG电话通知我拥抱变化之后,几乎同一时间,腾讯电话通知我拿到了成都offer,我只能感叹太巧了(大概这大半辈子的运气都花光了)。
后来校招开始后,只面了百度一家公司,百度确实比较重视基础与算法,看中技术。

百度
1面: 大概1个小时,又是个做ios的师兄面试我,自然就只能聊项目了,我给他展示了我做的app后,也问了些技术问题,缓存怎么做的,内存溢出怎么处理。然后两个算法题:把一个数组中奇数放前面,偶数放后面,这个要求写出来。另一个是3亿条IP中,怎么找到次数出现最多的5000条IP。最后问了是否愿意去北京,对于技术的看法。
2面: 50分钟,写个4个程序题:反转链表、冒泡排序、生产者消费者,这三个都还好写,很快的写出来了,还有一个题是在一组排序数中,给定一个数,返回最接近且不大于这个数的位置,要求时间在O(logn)(这个想了一会,用二分查找,然后特殊处理了一下),最后他看不懂,要我一步一步解释。花了好一整子,最后问了个java反射,就让我走了。百度果然是重视算法。
3面: 这一面应该是个技术高层,笼统的问了我一下项目的问题,然后问了几个基础:java反射机制;android动画有哪些,什么特点?TCP/IP层次架构,每层的作用与协议;TCP拥塞控制;滑动窗口是怎么设计的,有什么好处;android的布局都有哪些。问完这些之后,然后就是有点类似于HR的聊天了:如果这次面试过了你觉得是因为什么原因,没过呢?你觉得百度怎么样?你对技术路线什么打算?有些和前面重复的就不写了。然后他让我问他问题,我就连续问了5、6个问题,最后愉快的走了。

百度这两天给结果。

五、 写在最后关于选择
LZ当时实习的时候,杭州阿里和广州腾讯选择去了阿里,但是却因为拥抱变化没有留下来,相反这边在腾讯实习的同学却很顺利。但是也是因为没有去广州腾讯,最后我能留在成都腾讯。选择是一件非常重要的事情,它决定着你的未来,但是也有一点你得知道:塞翁失马焉知非福,现在看起来不太好的选择,不一定将来就好,未来有太多未知数。
心怀感恩
其实一路走来,我也是在成长,从最初的不自信,到了最后面试一切都比较冷静与沉着。我一直相信,机会是留给有准备的人,所以,请提早准备,越早越好。我很感激能有那么多人帮助我和肯定我,没有最初腾讯的肯定,我肯定不会走的这么顺利,所以我很感恩哪些让我通过的人,也感谢我们实验室的兄弟姐妹,给了我良好的学习成长环境,心怀感恩才能好运常在。

from:http://geek.csdn.net/news/detail/236930

把宇宙138亿年压缩到1年:看完怀疑人生

作者:Arif Babul  来源:把科学带回家

 

如果138亿年的宇宙历史压缩到一年,人类出现在哪个月?5月?9月?

 

著名科普作者、天文学家卡尔﹒萨根在《伊甸园的龙》中提出的宇宙年历,会让你惊掉下巴。

 

让我们一起来看一看,宇宙、地球和人类的大事件,都出现在什么时刻吧!

 

如果把138亿年的历史压缩到1年里,很明显时间加速了。在这个日历里,日历的每一秒相当于438年,日历上的一小时相当于158万年,日历上的一天相当于3780万年。

 

在这个宇宙年历里,一个人活到80岁,宇宙才过去了0.18秒。

1月1日

大爆炸

 

5月1日

银河系诞生

 

9月9日

太阳系诞生

 

9月14日

地球诞生

 

9月25日左右

地球产生第一个生命

 

10月2日

地球上已知最古老的岩石

 

10月9日

地球最古老的化石(细菌和蓝藻)

 

11月1日左右

有性生殖诞生(微生物)

 

11月12日

最古老的光合植物化石

 

11月15日

真核生物(具有细胞核核的第一批细胞)开始繁荣兴旺

 

12月14日

多细胞生物诞生

 

12月17日

寒武纪大爆发,显生宙古生代寒武纪开始

 

12月18日

海洋浮游生物出现;三叶虫繁荣的时代

 

12月19日

第一批鱼类;第一批脊椎动物

 

12月20日

第一批维管植物

 

12月21日

海洋动物登陆

 

12月22日

第一批两栖动物;第一批有翼昆虫

 

12月23日

第一批树;第一批爬行动物

 

12月24日

恐龙出现

 

12月26日

第一批哺乳动物

 

12月27日

第一批鸟

 

12月28日

第一批花;恐龙灭绝

 

12月29日

第一批灵长动物

 

12月30日

灵长目的额叶开始进化得更高级;

人科物种出现

 

下面所有这一切发生在12月31日这天!

下午1:30

原康修尔猿(Proconsul)和腊玛古猿(Ramapithecus),

它们可能是现代猿类和人类的共同祖先

 

晚上10:30

第一批人类

 

晚上11点

旧石器时代

 

晚上11:46

北京猿人学会使用火

 

晚上11:56

最近冰期的开始

 

晚上11:58

人类在澳大利亚登陆

 

晚上11:59

欧洲的洞穴绘画的年代

 

晚上11:59:20

人类进入农业社会

 

晚上11:59:35

新石器时代开始;

人类有了第一个城市

 

晚上11:59:50

苏美尔(美索不达米亚早期文明)、

埃勃拉(西亚古国)和埃及出现第一个朝代;

天文学开始发展

 

晚上11:59:51

字母表被发明;

人类历史上第一个帝国——美索不达米亚阿卡德帝国诞生

 

晚上11:59:52

巴比伦的汉谟拉比法典颁布;

古埃及中王国时期

 

晚上11:59:53

青铜时代;

古希腊迈锡尼文明;

特洛伊战争;

最古老的美洲文明之一奥尔梅克文明;

指南针发明

 

晚上11:59:54

铁器时代;

第一个亚述帝国;

以色列王国;

腓尼基人建立迦太基城

 

晚上11:59:55

印度阿育王的王朝;

中国秦代;

雅典黄金时期领导人伯里克利的年代;

佛诞

 

晚上11:59:56

欧氏几何;

阿基米德物理学;

托勒密天文学;

古罗马帝国诞生;

基督诞生

 

晚上11:59:57

印度人阿耶波多(Aryabhata)发明零和小数;

古罗马灭亡;

伊斯兰教和伊斯兰文明诞生

 

晚上11:59:58

玛雅文明;

中国宋代;

拜占庭帝国;

蒙古西征;

十字军东征

 

晚上11:59:59

欧洲文艺复兴;

欧洲大航海;

中国明朝郑和下西洋;

现代科学诞生

 

晚上11:59:59

第一次工业革命

 

我们所在的年代

爱因斯坦诞辰;

计算机的发明;

登陆月球;

网络的发明

下一年5月2日

太阳成为红巨星

 

下一年5月7日

太阳成为白矮星

 

在宇宙的年历中,孔子在12月31日午夜5.8秒前诞生,牛顿则在午夜0.76秒前横空出世;在午夜前的0.02秒时(按萨根成书时计算),我们才刚刚有了互联网;而到明年5月7日,太阳则会进入生命的晚年,成为白矮星。到那时,人类将何去何从呢?
from:http://www.360doc.com/content/17/0912/10/40167318_686443332.shtml