leadscloud

Google SEO|外贸营销推广

转载这篇文章,内容不重要,就是记录下,都说2018是经济下行最严重的一年,虽然之前一直感受不到,但看到这么多文章,联想到自身,还是有点感受的,这两天在 v2ex 看到一篇文章,一个员工请假没一级领导批了,二级领导没有批,在网上发帖吐槽,CTO还回复,当然肯定都是骂 CTO的,生活不易,2018尤其是。 https://www.v2ex.com/t/522131

相信这个冬天,大家都看到了各种被cai和别名为『优化调整』的新闻。自从我发表《终于,这个冬天,我也被cai了》文章后,很多媒体和记者,每天都在加我微信,表示想做一些访谈,关于被cai人员的生活实录。当然我没有应允,一个是没有这么多时间,二个是公号就是对外的窗口,有什么想聊的,或者分享的,也会第一时间在公号同步,不想聊的,自然也不会再陈述。事情总是有聚集效应,很多被cai或优化的老铁,都被聚集到了我周围。一方面,大家处境一样,有共同点。二方面,可以彼此勉励下。索性这次就自己做了一次访谈实录,在征求他们同意后,我以实录方式,向大家还原被cai人员后的生活状态。为保证部分隐私,实录中访谈人均为化名。

人物一:小A

被cai时间:12中旬

年龄:24

那天我正在外面,手机上弹出几条消息,说的是:鱼哥,我刚刚被谈话了,然后进入了被cai名单中。赔偿是N+1,这个月就要签字走人了。目前有没有工作机会推荐?我说:先别慌,工作不要立马去找。先多准备准备。不然机会很容易浪费。小A在深圳,之前也是线下见过的。本科毕业2年了,在一家小公司做Android开发。老家是湖北的。女票是进公司后下手的。不过他们关系公开后,女票换了家公司,所以这次还好不是两人被cai,小A表示目前也是打算年后看机会的,现在相当于加速了他被动出去找工作。突然被抱出公司,被cai那几天很焦虑,虽然没有房贷、还有其他压力,但是感觉总是不太爽。我说,你这还年轻,出去分分钟找一份工作了,先好好准备,后面再投简历。最近一段时间,他都是在复习和准备。元旦后会开始尝试接触一些工作机会。小A表示女票还有家里人目前给他全力支持。他也有自信找一份好工作,毕竟也是打算年后换工作的。

人物二:大B哥

被cai时间:12上旬

年龄:37

相比于其他被cai的老铁而言,大B哥属于年纪稍大的。工作有10多年了,过去实际履历都是很不错,都是在大厂一线开发,后面36岁时,开始转向小公司做了一个小leader。当然这家公司已经过了C轮了。商业模式上其实算比较成熟。他过去是肩负一个全新的项目负责人,包括搭建团队,开发迭代产品。从去年11月开始到18年3月,几乎都是在招人,自己肩负一些开发工作。到12月,产品已经迭代了6个版本。眼看产品一天一天都在变好,相信过不久就可以给公司盈利。大B哥每次和我聊天,都老是让我帮他多推荐点人,项目缺人。并说公司靠谱,有前途,现金流充沛。他以后也不打算换工作,就把这个产品做好、做大、做强就行。是哇,愿景总是美好的,突然,12月上旬,公司宣布不再战略支持他这个项目了,因为快1年了,给公司带来收益不是太明显,管理层决定砍掉这个项目。并开始让大B哥通知他的下属这次优化调整。公司会按法律进行赔偿,大B哥说他当时第一个想到就是那个昨天刚入职的下属,好不容易把他从别的大厂挖角过来胡,今天让他去通知,这对他来说,有点说不出口,于是问,cai员计划是怎样的,HR告知他,是整个业务线都砍掉。也包括他自己。这对大B来说,有点接受不了,当场就反驳说:为什么不等到明年初再做这个决定?HR表示,这个是管理层做的决定,我们也不是太清楚。然后大B哥,去问他的领导,他领导说,互联网公司看的是盈利能力,短期无法盈利,就无法去讲故事忽悠投资人的钱,就无法拿到下一个风投。大B哥说,盈利从来不是一蹴而就的哇,然后负责人告诉他,公司老板就是靠投机主义者起家的,现在钱不好赚,只有节衣缩食才能过冬。这时大B内心一阵心寒,他想起了那个高大伟岸的老板,开会时总是说,兄弟们,我们有的是钱,我们会加大这个战略项目的投入。你们辛苦点,平时没事多加点班。年底了,给大家多发奖金。大B哥曾连续加班3个月,后来病倒了,在医院病床上还在完成关键模块开发。如今,老板一句话,所有努力付诸东流。大B哥说,他那时真有点想不开和想不通。说好的一起越快的玩耍呢。大B哥在这个年龄被cai,相比其他人来说,要挺的压力更大。比如他的房贷,老婆是全职太太,还有两个老人。因为年龄越大,机会越少,要求越高。这一点他是明白的。不过他说他这个年纪,还好认识很多人,人脉相比技能更重要,朋友得知他的情况后,很快就有联系到他,确实有些团队还缺一些负责人,加上他口碑不错,直接和老板聊好后。最近已经入职了某公司,可以说,也是有惊无险。

人物三:小C

被cai时间:12下旬

年龄:25

不同于小A和大B哥那样,小C可能没这么幸运了,他是国内某大厂被优化掉的一波。今年的应届刚毕业,上班还不到一年。他正是属于技术积累期,如今被cai后,他处于很被动。毕业以来,以为可以安安稳稳呆个几年。他说,他平时经常水群,口头说的最多的是,我厂这个很强,我厂那个很强,我厂就是牛逼,等等。他说,他曾经引以为豪的公司,现在对应届生也开闸刀,有点心寒。被cai的不只他一个应届生,过去在别人夸他在某厂时,他总是有很强的优越感。是啊,对于刚出社会的学生,加入大厂的确是一件引以为豪的事情。我告诉小C,我们这种工作有一定年限的人,实际上并不会care这些东西,大厂也好,小公司也罢,都是自己硬,才是最好的背书。我之前也面试一些大厂的,技术越厉害,其实和公司关联度越小。技术不是厉害,反而需要更多公司xx项目来衬托他。厉害的人,一定不是公司塑造的。当然离不开公司平台支持,这个毋庸置疑。小C说,自己目前有点不知所措。出来就是社招了,不是他过去那样参加应届生秋招和春招的身份。项目经验也不是很多。重新找工作,没有底。我说,你先梳理下自己知识,然后查漏补缺。也先多准备准备,过年还有30多天了,实在不行,明年上来再找。他担心明年上来,和他一样优化或者被cai的人会很多,同样岗位,面临竞争更激烈,想在年前敲定岗位。我举了个例子,今年房价这么高,每天还有那么多人在不动产中心交易。你是刚需,管他涨也好,跌也罢,有钱,就应该果断入手哇,没有什么可犹豫的。工作这个也是,岗位总是有的,多和少。你也是要有所储备,不然就是机会很多,一个也抓不住。所以当下,应该静下来总结总结。小C说,天越来越冷,一个人住在出租屋里,出门吃饭都懒的吃。买了一些馒头,将就啃着。我和小C说,我14年在北京连续啃馒头几个月,住几个人合租上下铺。最后不也找到工作了。小C表示,没有告知家里人,主要不想让家里人为自己担心,毕竟这么大的人了。最近很多公司快开年会了,小C电话告诉家里人说,他马上要参加他们公司的年会,到时人超级多,规模非常大,还有很多盛宴,到时发照片給看。他和我表示,自己也想感受一下大厂的年会氛围,毕竟工作第一年。如今只能在开年会那天,去朋友圈盗几张前同事发的图了。因为他说,在父母眼里,他是家里的骄傲。

人物四:D哥

被cai时间:12中旬

年龄:30

D哥是在从传统行业半路转到开发上来的。在27岁时,参加了某马训练营培训,那时某马培训真是一个火热,出去人人都找到工作,个个薪资上w。所以D哥也这时参与到为期4个月培训中了,虽然学费1w多,但是老师说了,出去毕业分分钟就拿这么多工资,D哥说自己在传统行业,也就4000多块钱,长期干下去,即便当了小领导,也就6000-7000,所以他转型做IT。主要还是因为IT收入高。D哥是个能吃苦的人。他说自己在参加某马训练营资格考试时,每天学基础学到晚上2点多,白天早上起来继续学习。后来通过了某马训练营入学资格。在为期4个月学习时,他表示自己过去这么多年,都没有那么努力过,我理解,也许当一个人确实想改变自己时,再大的困难也会克服。后面4个月结束后,确实像某马宣传那样大家都找到了待遇不错的工作,当然班里部分同学是用假经验找到的,后面大家都真正工作后,就有了真实工作经验。但是也有不少人因为学历造假被公司直接开除也有,主要是部分公司必须要本科以上文凭,不得已,有些同学为了进去,但是却只有专科文凭,所以才弄了个假本科证。D哥说自己比较老实,去面试就直说自己半路转行的,学习和积累近一年,优点就是能抗压,学习能力强。当然大部分公司对于他这个说法,还是不感冒的,毕竟企业招人是干活的,尽量找的是有较多经验的人。但是他说,有一家初创公司接纳了他,他猜主要他对工资要求不是太高,为人比较老实和靠谱。初创公司前期也是摸石头过河。虽然没有班里其他人薪资高,但D哥很满足,毕竟这是转型的第一步。7800的月薪,让他已经对互联网充满信心。过了1年,他跳槽去一家中型企业了,因为觉得人总是要一步一步改变,这是我在D哥身上看到的。但是中型企业今年也过得很艰难。加上各方面对D哥的综合评价,虽然他努力,但是一些东西确实产出有限。在cai员指标名单中,自然也就有了他。当然他也直言不讳说,有部分原因也是职场潜规则导致。巴拉巴拉一堆。他目前表示,暂时先不找工作,先回家好好过个年。因为还要完成和对象结婚摆酒的喜事,要操办,明年过完年,再好好准备。摆酒的事情大于工作。D哥表示,工作过完年应该能找到,我都30岁了,娶媳妇生娃是头等大事。对于D哥,一路吃过苦、受过挫折过来的,尽管被cai了,我相信他内心早已经埋下韧性的种子。

听完了实录,很多人可能会思考,不同的人,不同经历,状态、看法,采取方式都是不同。我想这也许是构成了我们多彩的世界吧~

去年今日,婚姻大事。今日已经又回到上海了,岁月流转,感觉时间越来越快了。毕竟不是孤身一人在上海了,有亲爱的老婆在身边,即使再远,也有守望的人。

三天假期,去了南京二天,一天逛了上海。节日的气氛不是很浓了,但月亮还是那么远。


南京总统府如此之小,又如此之大,可以装的下整个政府系统。


明孝陵,的确可以称得上中国最大的还保存较好的陵墓,其实地面上的建筑也只有石头保存的较好,你能看到的任何一颗树都不会超过100年。


中山陵比孝陵的位置要高,连里面的石碑也要特意高过孝陵,以后任何人的墓也不能超过它。


南京博物院,里面有丰富的文物展示,比我去过的任何博物馆都多,即使是在北京也没见这么多过。

二天的时间看的匆匆忙忙,但避过了十一的人流高峰,终于是到了这个一直想来的城市。



上海的繁华还是挺美的。

目前来说,随着html5的兴起,大部分网站已经可以抛弃jQuery了,但仍有部分行业是离不开它的,主要为了兼容IE浏览器,有很多的jQuery插件也导致它不太可能立即消失。

但对于大部分网站来说,不使用jQuery一样可以做到同样的效果,原生的JS目前已经可以和jQuery一样方便了。

我09年接触jQuery到现在也差不多快10年了,看着前端日新月异的变化,中间也错失了很多,在这缤纷变化的世界里,有时一旦不愿意接受变化,就会慢慢的被淘汰。很多3-5年的技术人员,还是一直用着jQuery,对于新的技术没有积极去学习尝试,导致离主流技术越来越远,自己的竞争力也在下降。

最近看到一篇关于jQuery的文章,jQuery的确过时了,虽然一时也不会死掉,但我们要看到这种趋势。

Polyfill.io

自动化的 JavaScript Polyfill 服务

Polyfill 可以为旧浏览器提供和标准 API 一样的功能。比如你想要 IE 浏览器实现 Promise 和 fetch 功能,你需要手动引入 es6-promise、whatwg-fetch。而通过 Polyfill.io,你只需要引入一个 JS 文件。

1
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>

Polyfill.io 通过分析请求头信息中的 UserAgent 实现自动加载浏览器所需的 polyfills。

Polyfill.io 有一份默认功能列表,包括了最常见的 polyfills:document.querySelector、Element.classList、ES5 新增的 Array 方法、Date.now、ES6 中的 Object.assign、Promise 等。

你也可以通过传递 features 参数来自定义功能列表:

1
2
3
4
<!-- 加载 Promise&fetch -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Promise,fetch"></script>
<!-- 加载所有 ES5&ES6 新特性 -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=es5,es6"></script>

Polyfill.io 还提供了其他 API,具体请查阅官方文档:

以下是原文:

免责声明
本文是仓促之作,从构思到成文不足半天。文中没有提到很多优秀的库和框架,提前在此致歉,因为没时间搜集整理。但这不代表笔者对这些库和框架没有敬意。实际上,包括jQuery在内,我的敬意是给这些名字背后整个社区和贡献者的,当然包括库和框架的最初编写者,比如John Resig。
另外,时间所限,本文粗略、不严谨,甚至可能不客观地描绘了前端技术的发展脉络。对前端发展走向的这个判断,仅代表本人自己的主观认知,并非业界共识,恳请广大读者了解。千万不要以本文观点作为评价前端技术发展的依据。谢谢!

作者:奇舞周刊
链接:https://juejin.im/post/5b5af8565188251b186bcfcb
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Github抛弃jQuery

2018年7月25日,Mislav Marohnić发了一条推文,宣布GitHub.com前端已经彻底删除了jQuery(下图)。而且,还自问自答地解释(低调炫耀),删除jQuery之后也没用其他框架,而是全部依赖原生API。

很多人不知道,我和jQuery颇有渊源。大概11年前(2007年),因为“疯狂迷恋”jQuery,我在国内率先翻译了jQuery 1.1的文档。后来有同好基于我翻译的版本继续翻译了jQuery新版文档,还不忘记在“关于”中提到我(http://hemin.cn/jq/about.html):

居然称我为“国内jQuery的引路人”,惭愧。但在当时jQuery文档奇缺的情况下,我翻译的中文版应该是帮到了不少同学的。后来,我还翻译了Learning jQuery(《jQuery基础教程》)。
正因与jQuery的这个不解之缘,GitHub.com彻底抛弃jQuery的消息才触动我想了一些事。于是,决定写这篇小文,以飨读者(但愿有用,哈哈)。

jQuery的辉煌

jQuery最初诞生于2006年8月,作者是John Resig(https://zh.wikipedia.org/wiki/JQuery)。10多年前,网页开发者(当时还没有“前端”这个概念)深受浏览器不兼容性之苦。以jQuery为代表的一批JavaScript库/框架应运而生:

  • Dojo
  • jQuery
  • MooTools
  • Prototype
  • Yahoo! User Interface Library (YUI)
  • Script.aculo.us

这些库有的像jQuery一样是主打通用性,比如Dojo、Prototype;有的则走更专业化的路线,比如YUI(组件化)和Script.aculo.us(动画交互)。从通用功能看,这些库大都提供了如下特性:

  • 语法糖:链式调用、实用函数
  • 选择元素:基于各种标准选择符和库自定义的选择符,以及通过回调进行筛选
  • 操作DOM:创建和操作元素,乃至各种属性操作
  • 处理事件:ready事件及各种注册和触发事件的方法,乃至委托
  • 动画:基于animate的CSS属性动画,以及内置动画方法
  • Ajax:封装原生的XMLHttpRequest API,简化请求方法及回调处理

一批宣传和推广这些库和框架的书籍相继面世,迅速推动了这些库的采用。2010年出版的DOM Scripting, 2nd(《JavaScript DOM脚本编程艺术(第2版)》)就是其中之一。这本书专门有一个附录,介绍当时流行的库,主推jQuery。

当时jQuery官网的自我描述是这样的:

“a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.”

不错,正是这样。jQuery凭借其选择器方法、面向集合的链式调用、对事件和Ajax的完善支持、简单而强大的动效等独有优势,迅速风靡,成为几乎所有网站开发必备的JavaScript库,乃至开创了jQuery编程风格。

开发者选择jQuery的理由简单直接:

  • 跨浏览器
  • 简单高效
  • 稳定可靠
  • 插件丰富

2011年新版的“犀牛书”第6版——JavaScript: The Definitive Guide, 6th甚至拿出第19章整整64页篇幅隆重讲解了jQuery(“Chapter 19. The jQuery Library”)。

jQuery从此走向鼎盛和辉煌。后来,随着前端交互越来越重和移动应用的普及,jQuery UI、jQuery Mobile相继面世。

时至今日,jQuery仍然在支撑着数以千万计各种规模网站的运作——尽管聚光灯下已经不常看到她的身影。

历史的选择

最近10年,是“前端行业”有史以来发展最快的10年。

移动社交时代的到来不仅没有让桌面Web失色,反倒刺激了Web标准的迅猛改进。HTML5不仅带来了极大的向后兼容性,也带来了更丰富的原生DOM API。CSS从CSS3开始走上模块化的快车道,文本样式、排版布局、媒体查询,各种新模块让人目不暇接。

各大主流浏览器也在快速跟进,Firefox、Chrome、Opera、Safari、IE乃至Edge,都在积极重构甚至重写内核,争做支持Web标准的“楷模”。在这个大背景下,各大互联网公司不断调高兼容的IE版本号,从8到9到10,再到11。

当然,还有ECMAScript语言标准。自从划时代的ES6(ECMAScript 2015)发布之后,JavaScript终于真正开始摆脱“玩具”语言的尴尬境地。更重要的,从ES6起,ECMAScript也进入了快速迭代、每年发一版的节奏。ES7、ES8,以及ES9,每次都会给这门语言注入更强大的语言特性。

与此同时,Node.js和Babel等服务端运行时及转译工具的出现,也让前端工程化,以及向传统工业级软件开发最佳实践靠拢的速度日益加快。

2012年,笔者在图灵社区翻译过一篇文章“JavaScript宝座:七大框架论剑”(http://www.ituring.com.cn/article/8108)。当时的“七大框架”是:

  • Backbone
  • Knockout
  • Spine
  • CanJS
  • Ember
  • AngularJS
  • Batman
  • Meteor

后来,谷歌主打SPA(Single Page Application,单页应用)的Angular终于一枝独秀。不久,脸书推出的“在JS里写HTML一样优雅”的React则一路高歌猛进。最终,集各家所长且简单易用的Vue横空出世。

前端开发已经从后“刀耕火种”时代的“农业文明”,逐渐进化为以大规模、可扩展、规范化、自动化为特征的准“工业文明”。
俗话说:“皮之不存,毛将焉附。”随着时代变迁、技术进步,jQuery赖以存在的环境正逐渐消失。如前所述,新的环境催生了一批框架新秀。曾经辉煌的jQuery终于走到了可以华丽谢幕的时刻。

几句忠告

8年前,DOM Scripting, 2nd在推荐开发者使用前端库时,语重心长地说过下面这段话:

“开发中使用库当然没问题,但前提是不要仅仅只知道怎么使用,更要知道它的工作原理。如果不能超越这些库,那在这些库变成你的拐杖之时,你也会随之“残废”。在使用某个库之前,一定要花时间学习掌握JavaScript和DOM。我们从一开头就强调“知其所以然”的重要性,告诉大家不能满足于仅仅“知其然”。如果使用了库,却不晓得其背后原理,无论对自己还是对产品都将是有害的。”

2012年,从后端转前端不久的Ray Nicholus接手了一个跨浏览器文件上传库(https://github.com/FineUploader)的维护和开发工作。他的第一反应就是用jQuery重写这个库。然而,用户反对引入任何对其他库的依赖。结果他只能使用原生浏览器的API。那又怎样呢?他发现,原来放弃jQuery的写法比自己想象的要容易。

2014年,Ray发表了:“You Don’t Need jQuery!”系列博客(https://blog.garstasio.com/you-dont-need-jquery/)。2016年,他的著作Beyond jQuery (Apress,https://www.amazon.com/dp/1484222342/)出版。Ray建议,学习前端开发,本来应该是这个顺序:

  1. 学习JavaScript
  2. 学习Web API
  3. 学习jQuery(或其他框架/库)

但很多人实际上是从#3开始的,然后过了很久才开始#1和#2(甚至从来没想过#1和#2)。结果就是“只知其然,而不知其所以然”。

如今,时移世易,jQuery即将谢幕,新一代组件化开发框架粉墨登场。然而,“太阳底下没有新鲜事。”不管是使用Angular,还是React,抑或是Vue,还是要真正理解它们背后的工作原理。
(为避免广告嫌疑,我在这里就不着重推荐360导航前端的刘博文同学即将出版的《深入浅出Vue.js》一书了,哈哈哈~~,因为没有封面可以展示。)

尾声

jQuery作为第一代前端库的优秀代表,成就了今天Web的繁荣,也成就了一代Web开发者。作为“国内jQuery的引路人”(这个帽子是别人给的,我借用一下,哈哈),我个人对jQuery的感情是复杂的。既不希望它离开,又希望它早点离开。我想,这应该也是很多早期接触jQuery的前端开发者的心声吧。

作者:奇舞周刊
链接:https://juejin.im/post/5b5af8565188251b186bcfcb
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

函数和变量的声明总是会被解析器悄悄地被“提升”到方法体的最顶部

上面是javascript变量提升的概念。为了更好地理解“变量提升”,我们先来看一段代码:

1
2
3
4
(function (){
console.log(foo);
var foo = "Javascript";
})();

控制台输出:undefined 为什么输出了undefined,而没有报错呢?

原来javascript是函数作用域,解析器会在函数开头处自动去声明局部变量,局部变量都会被放在函数的入口处定义,所以上面的代码实际会被解释成:

1
2
3
4
5
(function (){
var foo;
console.log(foo);
foo = "Javascript";
})();

另外,需要注意Javascript中函数的两种声明方式存在的坑:

function fn(){} //函数声明式
var fn = function(){}; //函数表达式
对于函数声明式,解析器会确保在所有代码执行之前声明已经被解析。而对于函数表达式,与定义其它基本类型变量一样,逐句执行并解析。

我们再来举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 函数声明式 */
(function(){
fn();
function fn() {
console.log('来自函数声明式fn');
}
})();

/* 函数表达式 */
(function(){
fn();
var fn = function() {
console.log('来自函数表达式fn');
}
})();

控制台依次输出:

1
2
来自函数声明式fn
fn is not a function

可以看到,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前,而后者,则会报错。

所以在Javascript中,变量的声明会被提升,而变量的赋值则不会。而函数的声明与变量的声明是不一样的,函数的函数体也会被一起提升,但请使用函数声明的形式才能提升。

原文: http://liaokeyu.com/%E6%8A%80%E6%9C%AF/2016/10/18/javascript_hoisting_%E5%8F%98%E9%87%8F%E6%8F%90%E5%8D%87.html

匿名函数

匿名函数:就是没有函数名的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//普通函数 
function box() { //函数名是 box
return'Lee';
}


//匿名函数
function(){ //匿名函数,会报错
return'Lee';
}


//通过表达式自我执行
(functionbox() { //封装成表达式
alert('Lee');
})(); //()表示执行函数,并且传参


//把匿名函数赋值给变量
var box=function(){ //将匿名函数赋给变量
return'Lee';
};
alert(box()); //调用方式和函数调用相似


//函数里的匿名函数
function box() {
return function(){ //函数里的匿名函数,产生闭包
return'Lee';
}
}
alert(box()()); //调用匿名函数

闭包

闭包的英文单词是closure,这是JavaScript中非常重要的一部分知识,因为使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。

闭包的含义:闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕(这点涉及JavaScript作用域链)。

使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,可以避免使用全局变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
function a(){

var name='sun';

return function (){ //通过匿名函数返回 a() 局部变量
return name;
}
}
alert(a()()); //通过a()()来直接调用匿名函数返回值

var b=a();
alert(b()); //另一种调用匿名函数返回值

匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。

闭包的经典案例

通过全局变量来累加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var num=0;     //全局变量 
function a(){
num++; //模块级可以调用全局变量,进行累加
}

a(); //1
a(); //2 //执行函数,累加了
alert(num); //输出全局变量

//---------------------------------------------------------------

function a(){
var num=0;
num++;
return num;
}


alert(a()); //1
alert(a()); //1 //无法实现累加,因为局部变量又被初始化了

每次调用,变量num都会被初始化,所以每次调用都会返回1而不是累加。我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。

使用闭包进行累加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function a(){
var num=0;
return function(){
num++;
return num;
}
}

var b=a(); //获得函数

alert(b()); //1 //调用匿名函数
alert(b()); //2 //第二次调用匿名函数,实现累加


注意 闭包允许内层函数引用父函数中的变量,但是该变量是最终值

看下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* <body>
* <ul>
* <li>one</li>
* <li>two</li>
* <li>three</li>
* <li>one</li>
* </ul>
*/

var lists = document.getElementsByTagName('li');
for(var i = 0 , len = lists.length ; i < len ; i++){
lists[i].onmouseover = function(){
alert(i);
};
}

你会发现当鼠标移过每一个

  • 元素时,总是弹出4,而不是我们期待的元素下标。这是为什么呢?

    注意事项里已经讲了(最终值)。

    显然这种解释过于简单,当mouseover事件调用监听函数时,首先在匿名函数 (function(){ alert(i); }) 内部查找是否定义了 i,结果是没有定义;因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值);所以,最终每次弹出的都是4。

    解决方案一

    1
    2
    3
    4
    5
    6
    7
    8
    var lists = document.getElementsByTagName('li');
    for(var i = 0 , len = lists.length ; i < len ; i++){
    (function(index){
    lists[index].onmouseover = function(){
    alert(index);
    };
    })(i);
    }

    解决方案二

    1
    2
    3
    4
    5
    6
    7
    var lists = document.getElementsByTagName('li');
    for(var i = 0, len = lists.length; i < len; i++){
    lists[i].$$index = i; //通过在Dom元素上绑定$$index属性记录下标
    lists[i].onmouseover = function(){
    alert(this.$$index);
    };
    }

    解决方案三

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function eventListener(list, index){
    list.onmouseover = function(){
    alert(index);
    };
    }
    var lists = document.getElementsByTagName('li');
    for(var i = 0 , len = lists.length ; i < len ; i++){
    eventListener(lists[i] , i);
    }
  • 外贸营销留言板程序开源了!

    Github 地址:

    https://github.com/leadscloud/inquiry


    一个简单的留言板程序,在外贸网站运行测试多年没有任何问题。如果你的公司没有留言板程序,或者现在需要去找一个简单的留言板程序,这个很适合你。

    本人之前在矿山机械行业工作,给公司开发过留言板程序并且运行多年。 这几天我重新写了一个留言板程序,希望可以帮助广大做外贸的同行们。

    特点:

    1. 自动过滤垃圾留言信息
    2. 语言翻译功能集成
    3. 一键复制留言信息

    安装

    1. 把文件上传到服务器根目录
    2. 然后打开install.php, 例如: http://www.yourdomain.com/install.php
    3. 安装完毕会在content目录下生成一个数据库

    表单字段说明

    具体的字段设置你可以在系统根目录下的updata.php里查看。

    姓名与邮箱是必填的,其它都是非必须的。

    submit.html有一个示例文件

    1
    2
    <input type="hidden" name="from_company" value="YourName" />这个隐藏字段代表网站属于哪个牌子。
    <input type="hidden" name="referer" value="http://www.youwantedsite.com" />这个隐藏字段代表你强制把referer改为某个网站。

    字段:

    name email title content country phone address from_company

    config.php 配置文件

    下面是config里的内容。请修改DB_NAME,务必要以.php结尾,防止下载。BING_TRANSLATE_KEY Bing的翻译API,可以去注册一个。Akismet_API_Key 反垃圾服务,wordpress的反垃圾插件就是用它。根据此系统的域名,注册一个。有问题,再联系我,上次调试是没问题的。QQ:75504026

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    //database name
    define('DB_NAME','#inquiry_system.sqlite.php');
    //database prefix
    define('DB_PREFIX','wp');
    //bing translate api key
    //define('ACCOUNT_KEY', 'nujIh3e7l8Xs8CkP44xTHwu4Gaw0vV1xzaSgXZy'); 已废弃
    define('BING_TRANSLATE_KEY', '7724d07b364645asdfds8ca7dfsds49624');
    //Akismet API Key
    define('Akismet_API_Key','aaa7ab1s1df6e9');
    //system root
    define('BLOG_ROOT',dirname(__FILE__));
    ?>

    软件截图

    联系我

    QQ: 75504026

    Email: love4026@gmail.com

    Website: https://leadscloud.github.io

    更新

    2018-4-19

    • bing翻译使用最新版本,去除之前的翻译
    • 复制按钮使用原生的js即可,不用再使用flash技术了

    关键词

    留言板程序 简单留言板 外贸留言板 外贸营销 跨境电商留言板

    https://www.v2ex.com/t/456479
    最近在V2EX上看到有人问,你有技术焦虑吗,提到现在各种技术迭代非常快,很多新兴的技术没有时间去了解。

    下面有一个的回复可以代表技术的更新速度之快

    相比前端,这些都是事????
    reacr, preact, omi, nest,
    vue, nuxt,
    webpack3, webpack4, parcel,
    ng 全家桶,
    ts, es678, 各种 polyfill,
    scss/less/sass, cssnext, postcss, stylus.

    看到这些深有感触,我刚进入工作的时候那时候最多有个jQuery,现在前端和后端几乎没区别了。前端最开始只是html+css编写,现在是各种构建工具,而且一代比一代强,刚学会一个下一个新的工具又出来了。

    到了我这个年纪,不光有技术、学习上的焦虑,应该还有中年焦虑,这应该是很多人都曾有的,工作8年,看到很多人离开,我还在原地,很多事情让我觉得有时能力是一方面,但选择往往很重要,很多时候选择决定了你的位置。

    对于技术,有些是可以沉淀的,像技术原理、算法、数据结构这些,有些是更新变化很快,像前端的构建工具、CSS框架、JS框架。

    我们常去做那些可以沉淀的事情,焦虑可以避免很多。

    每个人到了一定年纪都会遇到那个年纪应该会出现的事情,比如离职、结婚、生育,不到那个阶段你根本体会不了什么感觉,生命是一步一步去体验经历的,焦虑也没有用,路总还是要跟着别人走一遍。

    只要你有前进的动力,就会有”焦虑“,只要不影响到自己的生活,焦虑还是有一定好处的。无论何时,不放弃学习,就不用害怕。

    Elasticsearch简介

    Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。

    它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。

    Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。

    但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。

    Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。

    当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:

    • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
    • 实时分析的分布式搜索引擎。
    • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

    这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。

    Elasticsearch的上手是非常简单的。它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,

    它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力。

    随着越学越深入,还可以利用Elasticsearch更多高级的功能,整个引擎可以很灵活地进行配置。可以根据自身需求来定制属于自己的Elasticsearch。

    使用案例:

    • 维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。
    • 英国卫报使用Elasticsearch来处理访客日志,以便能将公众对不同文章的反应实时地反馈给各位编辑。
    • StackOverflow将全文搜索与地理位置和相关信息进行结合,以提供more-like-this相关问题的展现。
    • GitHub使用Elasticsearch来检索超过1300亿行代码。
    • 每天,Goldman Sachs使用它来处理5TB数据的索引,还有很多投行使用它来分析股票市场的变动。

    但是Elasticsearch并不只是面向大型企业的,它还帮助了很多类似DataDog以及Klout的创业公司进行了功能的扩展。

    Elasticsearch的优缺点

    优点

    1. Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
    2. Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
    3. 处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
    4. Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
    5. 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。

    缺点

    1. 只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
    2. 还不够自动(不适合当前新的Index Warmup API)

    Solr简介

    Solr(读作“solar”)是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持。

    Solr是用Java编写、运行在Servlet容器(如 Apache Tomcat 或Jetty)的一个独立的全文搜索服务器。 Solr采用了 Lucene Java 搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。

    因为2010年 Apache Lucene 和 Apache Solr 项目合并,两个项目是由同一个Apache软件基金会开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。

    Solr的优缺点

    优点

    1. Solr有一个更大、更成熟的用户、开发和贡献者社区。
    2. 支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
    3. Solr比较成熟、稳定。
    4. 不考虑建索引的同时进行搜索,速度更快。

    缺点

    1. 建立索引时,搜索效率下降,实时索引搜索效率不高。

    Elasticsearch与Solr的比较

    当单纯的对已有数据进行搜索时,Solr更快。

    当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。

    随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。

    综上所述,Solr的架构不适合实时搜索的应用。

    实际生产环境测试

    下图为将搜索引擎从Solr转到Elasticsearch以后的平均查询速度有了50倍的提升。

    Elasticsearch 与 Solr 的比较总结

    • 二者安装都很简单;
    • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
    • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
    • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
    • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。

    Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。

    其他基于Lucene的开源搜索引擎解决方案

    • 直接使用 Lucene

      说明:Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作。

      优点:成熟的解决方案,有很多的成功案例。apache 顶级项目,正在持续快速的进步。庞大而活跃的开发社区,大量的开发人员。它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求;经过优化,可以支持 10亿+ 量级的搜索。

      缺点:需要额外的开发工作。所有的扩展,分布式,可靠性等都需要自己实现;非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善

    • Katta

      说明:基于 Lucene 的,支持分布式,可扩展,具有容错功能,准实时的搜索方案。

      优点:开箱即用,可以与 Hadoop 配合实现分布式。具备扩展和容错机制。

      缺点:只是搜索方案,建索引部分还是需要自己实现。在搜索功能上,只实现了最基本的需求。成功案例较少,项目的成熟度稍微差一些。因为需要支持分布式,对于一些复杂的查询需求,定制的难度会比较大。

    • Hadoop contrib/index

      说明:Map/Reduce 模式的,分布式建索引方案,可以跟 Katta 配合使用。

      优点:分布式建索引,具备可扩展性。

      缺点:只是建索引方案,不包括搜索实现。工作在批处理模式,对实时搜索的支持不佳。

    • LinkedIn 的开源方案

      说明:基于 Lucene 的一系列解决方案,包括 准实时搜索 zoie ,facet 搜索实现 bobo ,机器学习算法 decomposer ,摘要存储库 krati ,数据库模式包装 sensei 等等

      优点:经过验证的解决方案,支持分布式,可扩展,丰富的功能实现

      缺点:与 linkedin 公司的联系太紧密,可定制性比较差

    • Lucandra

      说明:基于 Lucene,索引存在 cassandra 数据库中

      优点:参考 cassandra 的优点

      缺点:参考 cassandra 的缺点。另外,这只是一个 demo,没有经过大量验证

    • HBasene

      说明:基于 Lucene,索引存在 HBase 数据库中

      优点:参考 HBase 的优点

      缺点:参考 HBase 的缺点。另外,在实现中,lucene terms 是存成行,但每个 term 对应的 posting lists 是以列的方式存储的。随着单个 term 的 posting lists 的增大,查询时的速度受到的影响会非常大

    原文: http://i.zhcy.tk/blog/elasticsearchyu-solr/

    今天来郑州公司迁移 Google AdWords API 系统,想在上海访问这边的内网,这边是没有固定 IP的,这边就用到了内网穿透利器ngrok 了,这个东西微信开发也会用到。

    ngrok官网的服务因为服务器在国外,所以不是很稳定,我们可以通过开源的代码自己搭建一个ngrok服务器。 下面是主要的操作步骤:

    准备环境

    安装golang及相关依赖

    1
    sudo apt-get install build-essential golang mercurial git

    先进入到自己想安装的目录,并从github clone ngrok的项目

    1
    2
    git clone https://github.com/tutumcloud/ngrok.git ngrok
    cd ngrok/

    通过以下命令生成并替换源码里默认的证书,注意域名xxxx.com修改为你自己的。

    1
    2
    3
    4
    5
    6
    7
    NGROK_DOMAIN="test.lanthy.com"
    openssl genrsa -out base.key 2048
    openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
    openssl genrsa -out server.key 2048
    openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
    openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
    cp base.pem assets/client/tls/ngrokroot.crt

    编译服务端

    1
    sudo make release-server

    如果一切正常,ngrok/bin 目录下应该有 ngrokd 文件

    通过以下命令启动服务:

    1
    2
    cd ngrok/
    sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="sub.lanthy.com" -httpAddr=":8081" -httpsAddr=":8082"

    其中httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。同时ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定)。

    这里如果你的服务器配置了iptables规则,需要对外开放使用到的端口,可以本地telnet相应的端口看是否可用,不可用可以通过以下的命令开启:

    1
    2
    3
    4
    5
    6
    /sbin/iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
    /sbin/iptables -I INPUT -p tcp --dport 8082 -j ACCEPT
    /sbin/iptables -I INPUT -p tcp --dport 4443 -j ACCEPT
    /etc/rc.d/init.d/iptables save
    /etc/rc.d/init.d/iptables restart
    /etc/init.d/iptables status

    接下来就是需要在自己的域名提供商那里做域名映射了,这里最好把域名泛解析到相应的服务器:

    *.lanthy.com

    然后启动后,通过浏览器访问 test.lanthy.com:8081 如果页面显示

        Tunnel test.lanthy.com:8081 not found
    

    表示启动成功,可以用客户端连接了。

    编译客户端

    编译linux客户端

    1
    make release-client

    编译后会在ngrok/bin 目录下有 ngrok 文件。

    编译Mac客户端

    1
    sudo GOOS=darwin GOARCH=amd64 make release-client

    编译后会在ngrok/bin/darwin_amd64 目录下有 ngrok 文件。

    编译windows客户端

    1
    sudo GOOS=windows GOARCH=amd64 make release-client

    编译后会在ngrok/bin/windows_amd64 目录下有 ngrok.exe 文件。

    运行测试客户端

    将以上的不同系统版本的客户端下载到相应系统后,同一目录新增配置文件ngrok.cfg:

    1
    2
    server_addr: test.lanthy.com:4443
    trust_host_root_certs: false

    Mac上执行客户端

    映射本地8080端口,自定义子域名test,通过终端执行以下命令:

    1
    ./ngrok -subdomain sub -config=ngrok.cfg 8080

    Windows上执行客户端:

    映射本地8090端口,自定义子域名test,通过DOS界面进入grok客户端的相应目录:

    1
    ngrok -config=ngrok.cfg -subdomain=sub 8080

    如果连接成功,会出现大概以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ngrok                                           (Ctrl+C to quit)

    Tunnel Status online
    Version 1.7/1.7
    Forwarding http://sub.test.lanthy.com:8081 -> 127.0.0.1:8080
    Forwarding https://sub.test.lanthy.com:8082 -> 127.0.0.1:8080
    Web Interface 127.0.0.1:4040

    # Conn 0
    Avg Conn Time 0.00ms

    这样你就就可以通过http://sub.test.lanthy.com:8081 访问内网 127.0.0.1:8080

    SSH 22端口映射

    1
    /root/ngrok/bin/ngrok -config=/root/ngrok/.ngrok -subdomain=test --proto=tcp 22
        使用tcp协议穿透,就不会分配2级域名,改为监控一个随机端口,如 test.lanthy.com:12389
    

    HTTP 80端口映射

    1
    /root/ngrok/bin/ngrok -config=/root/ngrok/.ngrok -subdomain="sub" 80

    后台运行

    1
    /root/ngrok/bin/ngrok -config=/root/ngrok/.ngrok -subdomain=sub --proto=tcp -log=stdout 22 > /dev/null &

    使用固定端口配置

    如果想一次性转发多个端口或者想指定远程的对应端口,需要完善ngrok.cfg

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    server_addr: ngrok.lanthy.com:4443
    trust_host_root_certs: false
    tunnels:
    ssh:
    remote_port: 1122
    proto:
    tcp: 22
    ss:
    emote_port: 8388
    proto:
    tcp: 8388
    ftp:
    remote_port: 20
    proto:
    tcp: 20
    ftp2:
    remote_port: 21
    proto:
    tcp: 21
    http:
    subdomain: www
    proto:
    http: 80
    https: 192.168.1.22:443

    使用方法:

    1
    /root/ngrok/bin/ngrok -config=/root/ngrok/.ngrok start http

    启动全部的是 start-all , 不过我这个版本没有这个功能。

    后台运行

    必须加上-log=stdout参数,否则是不行的

    1
    nohup /home/nflg/ngrok/ngrok -config=/home/nflg/ngrok/ngrok.cfg -log=stdout start ssh > /dev/null &

    参考链接:

    https://juejin.im/entry/58adb743b123db006730e691
    https://yii.im/posts/pretty-self-hosted-ngrokd/
    http://ngrok.cn/docs.html

    什么是比特币?

    什么是比特币?

    比特币 (bitcoin) 是一种数字货币。

        小知识:什么是比特(bit) ?
    
        bit 是计算机表示二进制的单位。
        例如:
        1bit 可以表示 0 或者 1 两种状态;
        2bit 可以表示 00/01/10/11 四种状态。
    
        所以,习惯上人们用比特来形容数字化相关的事物,例如:比特币
    

    既然比特币是一种数字货币,那么理解比特币之前,先要了解:什么是货币

    经济学上认为,货币本质上是一般等价物

    什么是一般等价物?

    考虑原始时代的经济:

    A 圈养了一头牛,B 纺织了一块布,为了满足彼此的需求,他们可以约定:

        一头牛 换 一匹布
    

    通过这种原始的物物交换实现了简单的价值流动

    但是,随着社会生产力的提高,这种模式已经不能适应经济发展的要求。

        小思考:为什么物物交换行不通?
    
        1、A 在安阳,B 在梅州,空间上没法物物交换;
        2、A 今天生产了商品甲,下个月才需要商品乙,时间上没法物物交换;
        3、参与市场的各方提供了成千上万的商品,效率上不接受物物交换。
    

    这个时候,需要一种各方都认可的一般等价物来衡量、转换和传递商品的价值,从而实现商品的高效自由流动。

        价值流动:商品 -> 一般等价物 -> 商品
    

    早期,人们使用贝壳来充当一般等价物,后来又使用金、银等贵金属,再发展出纸币,甚至到现在的移动支付。

        小思考:
    
        财、货、贵、贩、赚、账、赁,这些字有什么共同点?
    

    以 ¥人民币 为例,它是以国家信用为背书,充当价值媒介的一般等价物。具有价值尺度、流通手段、贮藏手段、支付手段等职能。

    所以,货币本质上是一般等价物。

    只要你能创造出一种东西:它满足充当一般等价物的条件,那么你就是创造了一种货币!

        小思考:充当一般等价物需要哪些条件?
    
        1、全体参与方认可;
        2、不可伪造;
        3、方便携带、分隔、可以长期保存;
        4、数量可控;
        ......
    

    比特币就是这样一种东西。

    比特币

    这是一个革命性的创举,它打破了古今中外的惯例:货币都由政府的中央银行负责发行,而且只能在特定国家或地区流通。

    要知道,往往只有改朝换代的时候有机会发行全新的货币,可谓百年难遇。现在比特币做到了,而且是全球性地发行和流通,前无古人!

    当前的货币体系

    政府通过国家信用和强制手段保证央行发行的货币被广泛认可和接受。

    例如,通过颁布法律和规章制度:《中华人民共和国中国人民银行法》、《中华人民共和国人民币管理条例》等。

    对于防止伪造,一方面通过技术手段提高纸币的伪造难度;另一方面通过法律手段打击制造、流通假币。

    截至目前,通过央行发行货币是全世界通用的做法,运行良好,但缺点明显。

    显而易见的问题,包括但不限于:

    1. 由于发行权掌握在中心化的央行手中,理论上存在货币超发的可能,从而导致通货膨胀,例如:委内瑞拉、津巴布韦等国家由于通货膨胀,货币体系近乎崩溃;

    2. 即使高压打击,依然无法避免假币出现,最薄弱的环节不在于印制技术,而在于流通中需要人去辨别,而人往往是不可靠的。

    比特币系统是如何运转的?

    2008 年,一个网名为中本聪 (Satoshi Nakamoto) 的人,发表了《比特币:一种点对点式的电子现金系统》的论文,由此掀开了比特币风靡全球的大幕。

        小链接:
    
        论文 PDF 版原文:https://bitcoin.org/bitcoin.pdf
    
        中文翻译: [比特币白皮书:一种点对点的电子现金系统](http://www.8btc.com/wiki/bitcoin-a-peer-to-peer-electronic-cash-system)
    

    由于思维定势,刚接触比特币概念的人,往往有一些认知的误区或盲区:

    1、比特币是不是和硬币或纸币一样有实体形式?
    2、比特币是数字货币,是不是和银行账户一样,在某个服务器的数据库里记录着我的账户下有多少余额?
    3、两个人之间怎么转账?是不是和传统的银行一样:A 的账户 -100,B 的账户 +100?
    4、比特币的数量有多少?最小分割单位是多少?
    5、没有中央银行,那么比特币是谁发行的?
    6、软件、音乐、文档等数字资产可以随便复制,为什么比特币不能拷贝?

    ……

    一大堆问题!是什么?!为什么?!

    当你开始思考这些问题的时候,那么恭喜你,你已经在思考如何设计一种货币系统了。

    真是激动人心,从来没有想过有一天自己也可以设计一套货币系统,而且可以在真实世界运行起来。

    更令人兴奋的是,你有机会参与价值的重新分配,就像淘金。

    接下来,开始揭秘比特币是如何运行的。

    阅读全文 »
    0%