智慧彩系列挂机软件挂机软件 到什么程度能学习Ae呢

首先想到的不应该是Michael Collins吗……&br&&br&Michael Collins (Columbia), Jason Eisner (JHU), David Yarowsky (JHU)三位师兄弟(David & Michael & Jason)均师承于Upenn的Mitchell Marcus教授,也就是著名的Penn Treebank的作者。这三位是NLP界公认的大神,研究领域各有侧重。collins/eisner对NLP结构学习领域贡献极大,yarowsky早年研究词义消歧,是著名的yarowsky algorithm的作者,后来做了很多跨语言学习的开创性工作。&br&&br&Michael Collins的学生中著名的有Terry Koo (Google), Percy Liang (Stanford), Luke Zettlemoyer (UW);Jason Eisner的得意弟子当首推Noah Smith (CMU-&UW);David Yarowsky似乎没有什么特别杰出的学生。&br&&br&Stanford NLP掌门Chris Manning,以《统计自然语言处理基础》一书以及Stanford NLP (toolkit) 而闻名。Dan Jurafsky,著有《语音与语言处理》一书,具有深厚的语言学背景。稍微提一下Manning的学生Richard Socher,近几年声名鹊起,在dl4nlp领域风头一时无两,属年轻一代翘楚。&br&&br&UCBerkeley的Dan Klein,早些年在无指导学习领域建树颇多。Percy Liang也是他的学生。&br&UIUC的Dan Roth,Chengxiang Zhai (偏IR);MIT的Regina Barzilay;哦,当然还有Brown大学的Eugene Charniak大神(Charniak parser),Brown大学也可算是没落的贵族了,和UPenn有点儿相似。&br&&br&欧洲方面,Joakim Nivre (Uppsala University),代表工作是基于转移的依存句法分析。Philipp Koehn,著名机器翻译开源系统Moses作者,14年加入JHU。&br&&br&当然,在工业界也是NLP群星璀璨。Google有Fernando Pereira坐镇,此外还有Ryan McDonald,Slav Petrov等句法分析领域绕不开的名字;而最近Michael Collins也加入了Google;IBM则有Kenneth Church;提一嘴Tomas Mikolov (Facebook)吧,word2vec作者,虽然他严格意义上并不属于NLP核心圈子,但是不得不说,近两年acl/emnlp近半数文章都给他贡献了citation,能做到这种程度的人极少。&br&&br&以上我提到的人都是对NLP领域有重要基础性贡献并经过时间考验的(citation超过或者接近1W),除了以上提到的,还有很多非常优秀的学者,比如Kevin Knight,Daniel Marcu, Mark Johnson,Eduard Hovy,Chris Callison-Burch,年轻一代的David Chiang,Hal Daume III等。&br&&br&暂时想到的就这些人,水平有限,抛砖引玉。相对而言,虽然华人学者近几年在ACL/EMNLP等顶级会议上占据越来越重要的地位,但是对NLP领域具有重要基础性贡献的学者相对还是很少的。
首先想到的不应该是Michael Collins吗…… Michael Collins (Columbia), Jason Eisner (JHU), David Yarowsky (JHU)三位师兄弟(David & Michael & Jason)均师承于Upenn的Mitchell Marcus教授,也就是著名的Penn Treebank的作者。这三位是NLP界公认的大神…
&figure&&img src=&https://pic4.zhimg.com/v2-dc3c95b40e86b79a78f06db_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic4.zhimg.com/v2-dc3c95b40e86b79a78f06db_r.jpg&&&/figure&&p&想整理一篇关于书籍的资源很久了,毕竟做一名程序员,就要做好保持学习的准备,主要是技术更新太快,不学就会被淘汰。&/p&&p&所以废话不多说了,我把我收集的关于书籍的资源整理出来,&b&大概分为三个部分:&/b&&/p&&ul&&li&&b&1)可以下载或者看书籍的地方&/b&:可以下载书籍或者查找书籍的网站;&br&&/li&&li&&b&2)一些推荐书籍的文章&/b&:网友推荐的书籍;&br&&/li&&li&&b&3)Awesome 系列&/b&:里面有很多资源和书籍推荐;&/li&&/ul&&p&&b&一、可以下载或者查看书籍的地方:&/b&&br&&/p&&p&下面是一些可以找到书籍的网站或者文章,其中有免费的电子书籍可以下载,英文版书籍偏多。&br&&/p&&p&1、&a href=&https://link.zhihu.com/?target=http%3A//www.it-ebooks.info/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&it-ebooks&/a&:可以下载IT电子书籍的网站(英文);&/p&&br&&p&2、&a href=&https://link.zhihu.com/?target=http%3A//www.allitebooks.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&allitebooks&/a&:各种各样的IT电子书籍都可以找到(英文);&/p&&p&3、&a href=&https://link.zhihu.com/?target=http%3A//bookzz.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&bookzz&/a&:有各种各样的书籍,当然也包括编程类的,可以找到免费的书籍(英文);&/p&&p&4、&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/questions/2145& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&100本免费IT电子书&/a&:包括C、C++、JavaScript、JAVA、Perl、Python、Ruby、PHP等等的免费IT电子书籍(英文);&/p&&p&5、&a href=&https://link.zhihu.com/?target=http%3A//www.oreilly.com/programming/free/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&oreilly Free Programming Ebooks&/a&:ORielly 的免费电子书,有需要的童鞋可以免费下载(英文)。&br&&/p&&p&6、&a href=&https://link.zhihu.com/?target=https%3A//github.com/vhf/free-programming-books/blob/master/free-programming-books.md& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&free-programming-books&/a&:免费的编程书籍索引(英文);&br&&/p&&p&7、&a href=&https://link.zhihu.com/?target=https%3A//www.gitbook.com/explore%3Flang%3Dall& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&gitbook&/a&:gitbook上有很多书籍,可以看看(英文、中文);&br&&/p&&p&8、&a href=&https://link.zhihu.com/?target=http%3A//www.ituring.com.cn/book/ebook%3Fsort%3Dfree& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图灵社区&/a&:图灵教育下电子书,可以在线阅读,有免费的也有付费的(中文);&/p&&p&9、&a href=&https://link.zhihu.com/?target=https%3A//github.com/justjavac/free-programming-books-zh_CN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&免费的编程中文书籍索引&/a&:免费的编程书籍索引(中文);&/p&&p&10、&a href=&https://link.zhihu.com/?target=https%3A//github.com/jobbole/awesome-programming-books& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&经典编程书籍大全&/a&:100+ 经典技术书籍推荐列表(中文);&/p&&p&知乎网友提醒补充:&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.wowebook.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wowebook&/a&:可以下载电子书籍(英文);&知乎网友:alevui42&&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//www1.qdfuns.com/feres.php%3Fdo%3Dpicture%26listtype%3Dbook& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&QDFuns&/a&:里面也能下载一些书籍资源;&br&&/p&&br&&p&&b&二、一些推荐书籍的文章:&/b&&/p&&p&下面是广大的网友总结的或者翻译的一些推荐阅读书籍,可以选择自己需要或者感兴趣的进行阅读。&/p&&ol&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/64e4b63c0db7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C/C++后台工程师书单&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.codeceo.com/article/10-best-csharp-books.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&推荐10本C#编程的最佳书籍&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/questions/2538& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&11本Java程序员必读的书&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/codefollower/My-Blog/issues/1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&想通过自学成为一个有良好计算机专业素养的Java程序员要读哪些书?&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/5b98ad8d7b26& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&关于Linux,你该读哪些书&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/questions/2056& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&我的后端开发书架2015&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.codeceo.com/article/20-docs-guides-for-web-dev-8.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&为前端开发者准备的文档和指南&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//medium.mybridge.co/the-most-useful-free-ebooks-for-web-developers-f%23.nne5ucskh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&17本高质量免费的WEB开发书籍&/a&(英文)&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/josephmisiti/awesome-machine-learning& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&机器学习/统计/数据挖掘免费开源书列表&/a&(英文)&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/fd487ebcc770& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&成为一名优秀的Developer的书单&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/e1e10b85c77a& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&10本IT书籍推荐,总有一款适合你&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/f93b5f2e5804& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&编程书单推荐:知名程序员的书架&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/c94f2169644c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&互联网大佬推荐的34本必读书&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//bestprogrammingbooks.com/updated-100-influential-stackoverflow-programming-books/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stackoverflow评出的100种最有影响力的编程书籍最新版本列表&/a&(英文)&/li&&/ol&&p&&b&=& &/b&关于书籍的说明:可能很多小伙伴看到是英文的书籍就不想看了,其实啊,很多英文书籍都有相应的翻译中文版,因此啊,找到适合自己的书籍之后去买中文版的书籍就行了~&br&&/p&&p&&b&三、Awesome系列:&/b&&br&&/p&&p&Awesome系列,里面都推荐了很多资源或者书籍,可以看看。不过我整理的都是英文版的,当然也可以找到相应的中文版,这个就自己去找咯~&/p&&ol&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/aleksandar-todorovic/awesome-c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-c&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/akullpp/awesome-java& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-java&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/vinta/awesome-python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-python&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/sorrycc/awesome-javascript& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-javascript&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/aleksandar-todorovic/awesome-linux& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-linux&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/alebcay/awesome-shell& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-shell&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//shlomi-noach.github.io/awesome-mysql/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-mysql/&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/veggiemonk/awesome-docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-docker&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/avelino/awesome-go& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-go&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/sindresorhus/awesome-nodejs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-nodejs&/a&&br&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/vsouza/awesome-ios& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-ios&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/JStumpp/awesome-android& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-android&/a&&/li&&/ol&&p&上面只列出了部分awesome,如果你想查看更多可以点击下面的链接:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/sindresorhus/awesome& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/bayandin/awesome-awesomeness& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&awesome-awesomeness&/a&&br&&/li&&/ul&&br&&p&以上就是我整理的关于书籍的一些资源,非常希望你也可以把你知道的一些相关资源发送给我,我随时添加进文章,我们共同学习呀~&br&&/p&&p&最后:编程学习要看书,而且要保持看书学习的状态,但是不能光看不动手,所以一定要多动手编程。&/p&
想整理一篇关于书籍的资源很久了,毕竟做一名程序员,就要做好保持学习的准备,主要是技术更新太快,不学就会被淘汰。所以废话不多说了,我把我收集的关于书籍的资源整理出来,大概分为三个部分:1)可以下载或者看书籍的地方:可以下载书籍或者查找书籍的…
&h1&前言&/h1&&p&“分布式队列编程”是一个系列文,之前我们已经发布了《分布式队列编程模型、实战》,主要剖析了分布式队列编程模型的需求来源、定义、结构以及其变化多样性;根据作者在新美大实际工作经验,给出了队列式编程在分布式环境下的一些具体应用。本文将重点阐述工程师运用分布式队列编程构架的时候,在生产者、分布式队列以及消费者这三个环节的注意点以及优化建议。&/p&&p&确定采用分布式队列编程模型之后,主体架构就算完成了,但工程师的工作还远远未结束。天下事必做于细,细节是一个不错的架构向一个优秀的系统进阶的关键因素。优化篇选取了作者以及其同事在运用分布式队列编程模型架构时所碰到的典型问题和解决方案。这里些问题出现的频率较高,如果你经验不够,很可能会“踩坑”。希望通过这些讲解,帮助读者降低分布式队列编程模型的使用门槛。本文将对分布式队列编程模型的三种角色:生产者(Producer),分布式队列(Queue),消费者(Consumer)分别进行优化讨论。&/p&&h1&生产者优化&/h1&&p&在分布式队列编程中,生产者往往并非真正的生产源头,只是整个数据流中的一个节点,这种生产者的操作是处理-转发(Process-Forward)模式。&/p&&p&这种模式给工程师们带来的第一个问题是吞吐量问题。这种模式下运行的生产者,一边接收上游的数据,一边将处理完的数据发送给下游。本质上,它是一个非常经典的数学问题,其抽象模型是一些没有盖子的水箱,每个水箱接收来自上一个水箱的水,进行处理之后,再将水发送到下一个水箱。工程师需要预测水源的流量、每个环节水箱的处理能力、水龙头的排水速度,最终目的是避免水溢出水箱,或者尽可能地减小溢出事件的概率。实际上流式编程框架以及其开发者花了大量的精力去处理和优化这个问题。下文的缓存优化和批量写入优化都是针对该问题的解决方案。&/p&&p&第二个需要考虑的问题是持久化。由于各种原因,系统总是会宕机。如果信息比较敏感,例如计费信息、火车票订单信息等,工程师们需要考虑系统宕机所带来的损失,找到让损失最小化的解决方案。持久化优化重点解决这一类问题。&/p&&h2&缓存优化&/h2&&p&处于“处理-转发”模式下运行的生产者往往被设计成请求驱动型的服务,即每个请求都会触发一个处理线程,线程处理完后将结果写入分布式队列。如果由于某种原因队列服务不可用,或者性能恶化,随着新请求的到来,生产者的处理线程就会产生堆积。这可能会导致如下两个问题:&/p&&ul&&li&系统可用性降低。由于每个线程都需要一定的内存开销,线程过多会使系统内存耗尽,甚至可能产生雪崩效应导致最终完全不可用。&/li&&li&信息丢失。为了避免系统崩溃,工程师可能会给请求驱动型服务设置一个处理线程池,设置最大处理线程数量。这是一种典型的降级策略,目的是为了系统崩溃。但是,后续的请求会因为没有处理线程而被迫阻塞,最终可能产生信息丢失。例如:对于广告计费采集,如果采集系统因为线程耗尽而不接收客户端的计费行为,这些计费行为就会丢失。&/li&&/ul&&p&缓解这类问题的思路来自于CAP理论,即通过降低一致性来提高可用性。生产者接收线程在收到请求之后第一时间不去处理,直接将请求缓存在内存中(牺牲一致性),而在后台启动多个处理线程从缓存中读取请求、进行处理并写入分布式队列。与线程所占用的内存开销相比,大部分的请求所占内存几乎可以忽略。通过在接收请求和处理请求之间增加一层内存缓存,可以大大提高系统的处理吞吐量和可扩展性。这个方案本质上是一个内存生产者消费者模型。&/p&&h2&批量写入优化&/h2&&p&如果生产者的请求过大,写分布式队列可能成为性能瓶颈,有如下几个因素:&/p&&ul&&li&队列自身性能不高。&/li&&li&分布式队列编程模型往往被应用在跨机房的系统里面,跨机房的网络开销往往容易成为系统瓶颈。&/li&&li&消息确认机制往往会大大降低队列的吞吐量以及响应时间。&/li&&/ul&&p&如果在处理请求和写队列之间添加一层缓存,消息写入程序批量将消息写入队列,可以大大提高系统的吞吐量。原因如下:&/p&&ul&&li&批量写队列可以大大减少生产者和分布式队列的交互次数和消息传输量。特别是对于高吞吐小载荷的消息实体,批量写可以显著降低网络传输量。&/li&&li&对于需要确认机制的消息,确认机制往往会大大降低队列的吞吐量以及响应时间,某些高敏感的消息需要多个消息中间件代理同时确认,这近一步恶化性能。在生产者的应用层将多条消息批量组合成一个消息体,消息中间件就只需要对批量消息进行一次确认,这可能会数量级的提高消息传输性能。&/li&&/ul&&h2&持久化优化&/h2&&p&通过添加缓存,消费者服务的吞吐量和可用性都得到了提升。但缓存引入了一个新问题——内存数据丢失。对于敏感数据,工程师需要考虑如下两个潜在问题:&/p&&ul&&li&如果内存中存在未处理完的请求,而某些原因导致生产者服务宕机,内存数据就会丢失而可能无法恢复。&/li&&li&如果分布式队列长时间不可用,随着请求数量的不断增加,最终系统内存可能会耗尽而崩溃,内存的消息也可能丢失。&/li&&/ul&&p&所以缓存中的数据需要定期被持久化到磁盘等持久层设备中,典型的持久化触发策略主要有两种:&/p&&ul&&li&定期触发,即每隔一段时间进行一次持久化。&/li&&li&定量触发,即每当缓存中的请求数量达到一定阈值后进行持久化。&br&是否需要持久化优化,以及持久化策略应该由请求数据的敏感度、请求量、持久化性能等因素共同决定。&/li&&/ul&&h1&中间件选型&/h1&&p&分布式队列不等同于各种开源的或者收费的消息中间件,甚至在一些场景下完全不需要使用消息中间件。但是,消息中间件产生的目的就是解决消息传递问题,这为分布式队列编程架构提供了很多的便利。在实际工作中,工程师们应该将成熟的消息中间件作为队列的首要备选方案。&br&本小节对消息中间件的功能、模型进行阐述,并给出一些消息中间件选型、部署的具体建议。&/p&&h2&中间件的功能&/h2&&p&明白一个系统的每个具体功能是设计和架构一个系统的基础。典型的消息中间件主要包含如下几个功能:&/p&&ul&&li&消息接收&/li&&li&消息分发&/li&&li&消息存储&/li&&li&消息读取&/li&&/ul&&h2&概念模型&/h2&&p&抽象的消息中间件模型包含如下几个角色:&/p&&ul&&li&发送者和接收者客户端(Sender/Receiver Client),在具体实施过程中,它们一般以库的形式嵌入到应用程序代码中。&/li&&li&代理服务器(Broker Server),它们是与客户端代码直接交互的服务端代码。&/li&&li&消息交换机(Exchanger),接收到的消息一般需要通过消息交换机(Exchanger)分发到具体的消息队列中。&/li&&li&消息队列,一般是一块内存数据结构或持久化数据。&br&概念模型如下图:&br&&figure&&img src=&https://pic4.zhimg.com/dbbcc30d6411c4aaa5f073f_b.png& data-rawwidth=&1157& data-rawheight=&249& class=&origin_image zh-lightbox-thumb& width=&1157& data-original=&https://pic4.zhimg.com/dbbcc30d6411c4aaa5f073f_r.jpg&&&/figure&为了提高分发性能,很多消息中间件把消息代理服务器的拓扑图发送到发送者和接收者客户端(Sender/Receiver Client),如此一来,发送源可以直接进行消息分发。&/li&&/ul&&h2&选型标准&/h2&&p&要完整的描述消息中间件各个方面非常困难,大部分良好的消息中间件都有完善的文档,这些文档的长度远远超过本文的总长度。但如下几个标准是工程师们在进行消息中间件选型时经常需要考虑和权衡的。&/p&&h3&性能&/h3&&p&性能主要有两个方面需要考虑:吞吐量(Throughput)和响应时间(Latency)。&br&不同的消息队列中间件的吞吐量和响应时间相差甚远,在选型时可以去网上查看一些性能对比报告。&br&对于同一种中间件,不同的配置方式也会影响性能。主要有如下几方面的配置:&/p&&ul&&li&是否需要确认机制,即写入队列后,或从队列读取后,是否需要进行确认。确认机制对响应时间的影响往往很大。&/li&&li&能否批处理,即消息能否批量读取或者写入。批量操作可以大大减少应用程序与消息中间件的交互次数和消息传递量,大大提高吞吐量。&/li&&li&能否进行分区(Partition)。将某一主题消息队列进行分区,同一主题消息可以有多台机器并行处理。这不仅仅能影响消息中间件的吞吐量,还决定着消息中间件是否具备良好的可伸缩性(Scalability)。&/li&&li&是否需要进行持久化。将消息进行持久化往往会同时影响吞吐量和响应时间。&/li&&/ul&&h3&可靠性&/h3&&p&可靠性主要包含:可用性、持久化、确认机制等。&br&高可用性的消息中间件应该具备如下特征:&/p&&ul&&li&消息中间件代理服务器(Broker)具有主从备份。即当一台代理服务宕机之后,备用服务器能接管相关的服务。&/li&&li&消息中间件中缓存的消息是否有备份、并持久化。&br&根据CAP理论,高可用、高一致性以及网络分裂不可兼得。根据作者的观察,大部分的消息中间件在面临网络分裂的情况下下,都很难保证数据的一致性以及可用性。 很多消息中间件都会提供一些可配置策略,让使用者在可用性和一致性之间做权衡。&/li&&/ul&&p&高可靠的消息中间件应该确保从发送者接收到的消息不会丢失。中间件代理服务器的宕机并不是小概率事件,所以保存在内存中的消息很容易发生丢失。大部分的消息中间件都依赖于消息的持久化去降低消息丢失损失,即将接收到的消息写入磁盘。即使提供持久化,仍有两个问题需要考虑:&/p&&ul&&li&磁盘损坏问题。长时间来看,磁盘出问题的概率仍然存在。&/li&&li&性能问题。与操作内存相比,磁盘I/O的操作性能要慢几个数量级。频繁持久化不仅会增加响应时间,也会降低吞吐量。&br&解决这两个问题的一个解决方案就是:多机确认,定期持久化。即消息被缓存在多台机器的内存中,只有每台机器都确认收到消息,才跟发送者确认(很多消息中间件都会提供相应的配置选项,让用户设置最少需要多少台机器接收到消息)。由于多台独立机器同时出故障的概率遵循乘法法则,指数级降低,这会大大提高消息中间件的可靠性。&/li&&/ul&&p&确认机制本质上是通讯的握手机制(Handshaking)。如果没有该机制,消息在传输过程中丢失将不会被发现。高敏感的消息要求选取具备确认机制的消息中间件。当然如果没有接收到消息中间件确认完成的指令,应用程序需要决定如何处理。典型的做法有两个:&/p&&ul&&li&多次重试。&/li&&li&暂存到本地磁盘或其它持久化媒介。&/li&&/ul&&h3&客户端接口所支持语言&/h3&&p&采用现存消息中间件就意味着避免重复造轮子。如果某个消息中间件未能提供对应语言的客户端接口,则意味着极大的成本和兼容性问题。&/p&&h3&投递策略(Delivery policies)&/h3&&p&投递策略指的是一个消息会被发送几次。主要包含三种策略:最多一次(At most Once )、最少一次(At least Once)、仅有一次(Exactly Once)。&br&在实际应用中,只考虑消息中间件的投递策略并不能保证业务的投递策略,因为接收者在确认收到消息和处理完消息并持久化之间存在一个时间窗口。例如,即使消息中间件保证仅有一次(Exactly Once),如果接收者先确认消息,在持久化之前宕机,则该消息并未被处理。从应用的角度,这就是最多一次(At most Once)。反之,接收者先处理消息并完成持久化,但在确认之前宕机,消息就要被再次发送,这就是最少一次(At least Once)。 如果消息投递策略非常重要,应用程序自身也需要仔细设计。&/p&&h1&消费者优化&/h1&&p&消费者是分布式队列编程中真正的数据处理方,数据处理方最常见的挑战包括:有序性、串行化(Serializability)、频次控制、完整性和一致性等。&/p&&h2&挑战&/h2&&h3&有序性&/h3&&p&在很多场景下,如何保证队列信息的有序处理是一个棘手的问题。如下图,假定分布式队列保证请求严格有序,请求ri2和ri1都是针对同一数据记录的不同状态,ri2的状态比ri1的状态新。T1、T2、T3和T4代表各个操作发生的时间,并且 T1 & T2 & T3 & T4(&&&代表早于)。&br&采用多消费者架构,这两条记录被两个消费者(Consumer1和Consumer2)处理后更新到数据库里面。Consumer1虽然先读取ri1但是却后写入数据库,这就导致,新的状态被老的状态覆盖,所以多消费者不保证数据的有序性。&br&&/p&&figure&&img src=&https://pic2.zhimg.com/d9b73cae177cbf02e020d_b.png& data-rawwidth=&472& data-rawheight=&231& class=&origin_image zh-lightbox-thumb& width=&472& data-original=&https://pic2.zhimg.com/d9b73cae177cbf02e020d_r.jpg&&&/figure&&h3&串行化&/h3&&p&很多场景下,串行化是数据处理的一个基本需求,这是保证数据完整性、可恢复性、事务原子性等的基础。为了在并行计算系统里实现串行化,一系列的相关理论和实践算法被提出。对于分布式队列编程架构,要在在多台消费者实现串行化非常复杂,无异于重复造轮子。&/p&&h3&频次控制&/h3&&p&有时候,消费者的消费频次需要被控制,可能的原因包括:&/p&&ul&&li&费用问题。如果每次消费所引起的操作都需要收费,而同一个请求消息在队列中保存多份,不进行频次控制,就会导致无谓的浪费。&/li&&li&性能问题。每次消费可能会引起对其他服务的调用,被调用服务希望对调用量有所控制,对同一个请求消息的多次访问就需要有所控制。&/li&&/ul&&h3&完整性和一致性&/h3&&p&完整性和一致性是所有多线程和多进程的代码都面临的问题。在多线程或者多进程的系统中考虑完整性和一致性往往会大大地增加代码的复杂度和系统出错的概率。&/p&&h2&单例服务优化&/h2&&p&几乎所有串行化理论真正解决的问题只有一个:性能。 所以,在性能允许的前提下,对于消费者角色,建议采用单实例部署。通过单实例部署,有序性、串行化、完整性和一致性问题自动获得了解决。另外,单实例部署的消费者拥有全部所需信息,它可以在频次控制上采取很多优化策略。&/p&&p&天下没有免费的午餐。同样,单实例部署并非没有代价,它意味着系统可用性的降低,很多时候,这是无法接受的。解决可用性问题的最直接的思路就是冗余(Redundancy)。最常用的冗余方案是Master-slave架构,不过大部分的Master-slave架构都是Active/active模式,即主从服务器都提供服务。例如,数据库的Master-slave架构就是主从服务器都提供读服务,只有主服务器提供写服务。大部分基于负载均衡设计的Master-slave集群中,主服务器和从服务器同时提供相同的服务。这显然不满足单例服务优化需求。有序性和串行化需要Active/passive架构,即在某一时刻只有主实例提供服务,其他的从服务等待主实例失效。这是典型的领导人选举架构,即只有获得领导权的实例才能充当实际消费者,其他实例都在等待下一次选举。采用领导人选举的Active/passive架构可以大大缓解纯粹的单实例部署所带来的可用性问题。&/p&&p&令人遗憾的是,除非工程师们自己在消费者实例里面实现Paxos等算法,并在每次消息处理之前都执行领导人选举。否则,理论上讲,没有方法可以保障在同一个时刻只有一个领导者。而对每个消息都执行一次领导人选举,显然性能不可行。实际工作中,最容易出现的问题时机发生在领导人交接过程中,即前任领导人实例变成辅助实例,新部署实例开始承担领导人角色。为了平稳过渡,这两者之间需要有一定的通讯机制,但是,无论是网络分区(Network partition)还是原领导人服务崩溃都会使这种通讯机制变的不可能。&/p&&p&对于完整性和一致性要求很高的系统,我们需要在选举制度和交接制度这两块进行优化。&/p&&h3&领导人选举架构&/h3&&p&典型的领导人选举算法有Paxos、ZAB( ZooKeeper Atomic Broadcast protocol)。为了避免重复造轮子,建议采用ZooKeeper的分布式锁来实现领导人选举。典型的ZooKeeper实现算法如下(摘自参考资料[4]):&/p&&p&&em&Let ELECTION be a path of choice of the application. To volunteer to be a leader:&/em&&/p&&p&&em&1.Create znode z with path &ELECTION/guid-n_& with both SEQUENCE and EPHEMERAL&/em&&br&&em&2.Let C be the children of &ELECTION&, and i be the &/em&&br&&em&3.Watch for changes on &ELECTION/guid-n_j&, where j is the largest sequence number such that j & i and n_j is a znode in C;&/em&&/p&&p&&em&Upon receiving a notification of znode deletion:&/em&&/p&&p&&em&1.Let C be the new set of children of ELECTION;&/em&&br&&em&2.If z is the smallest node in C, then exec&/em&&br&&em&3.Otherwise, watch for changes on &ELECTION/guid-n_j&, where j is the largest sequence number such that j & i and n_j is a znode in C;&/em&&/p&&h3&领导人交接架构&/h3&&p&领导人选举的整个过程发生在ZooKeeper集群中,各个消费者实例在这场选举中只充当被告知者角色(Learner)。领导人选举算法,只能保证最终只有一个Leader被选举出来,并不保障被告知者对Leader的理解是完全一致的。本质上,上文的架构里,选举的结果是作为令牌(Token)传递给消费者实例,消费者将自身的ID与令牌进行对比,如果相等,则开始执行消费操作。所以当发生领导人换届的情况,不同的Learner获知新Leader的时间并不同。例如,前任Leader如果因为网络问题与ZooKeeper集群断开,前任Leader只能在超时后才能判断自己是否不再承担Leader角色了,而新的Leader可能在这之前已经产生。另一方面,即使前任Leader和新Leader同时接收到新Leader选举结果,某些业务的完整性要求迫使前任Leader仍然完成当前未完成的工作。以上的讲解非常抽象,生活中却给了一些更加具体的例子。众所周知,美国总统候选人在选举结束后并不直接担任美国总统,从选举到最终承担总统角色需要一个过渡期。对于新当选Leader的候选人而言,过渡期间称之为加冕阶段(Inauguration)。对于即将卸任的Leader,过渡期称为交接阶段(HandOver)。所以一个基于领导人选举的消费者从加冕到卸任经历三个阶段:Inauguration、Execution、HandOver。在加冕阶段,新领导需要进行一些初始化操作。Execution阶段是真正的队列消息处理阶段。在交接阶段,前任领导需要进行一些清理操作。&/p&&p&类似的,为了解决领导人交接问题,所有的消费者从代码实现的角度都需要实现类似ILeaderCareer接口。这个接口包含三个方发inaugurate(),handOver()和execute()。某个部署实例(Learner)在得知自己承担领导人角色后,需要调用inaugurate()方法,进行加冕。主要的消费逻辑通过不停的执行execute()实现,当确认自己不再承担领导人之后,执行handOver()进行交接。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public interface ILeaderCareer {
public void inaugurate();
public void handOver();
public boolean execute();
&/code&&/pre&&/div&&p&如果承担领导人角色的消费者,在执行execute()阶段得知自己将要下台,根据消息处理的原子性,该领导人可以决定是否提前终止操作。如果整个消息处理是一个原子性事务,直接终止该操作可以快速实现领导人换届。否则,前任领导必须完成当前消息处理后,才进入交接阶段。这意味着新的领导人,在inaugurate()阶段需要进行一定时间的等待。&/p&&h2&排重优化&/h2&&p&频次控制是一个经典问题。对于分布式队列编程架构,相同请求重复出现在队列的情况并不少见。如果相同请求在队列中重复太多,排重优化就显得很必要。分布式缓存更新是一个典型例子,所有请求都被发送到队列中用于缓存更新。如果请求符合典型的高斯分布,在一段时间内会出现大量重复的请求,而同时多线程更新同一请求缓存显然没有太大的意义。&br&排重优化是一个算法,其本质是基于状态机的编程,整个讲解通过模型、构思和实施三个步骤完成。&/p&&h3&模型&/h3&&p&进行排重优化的前提是大量重复的请求。在模型这一小节,我们首先阐述重复度模型、以及不同重复度所导致的消费模型,最后基于这两个模型去讲解排重状态机。&/p&&h4&重复度模型&/h4&&p&首先我们给出最小重复长度的概念。同一请求最小重复长度:同一请求在队列中的重复出现的最小间距。例如,请求ri第一次出现在位置3,第二次出现在10,最小重复长度等于7。&br&是否需要进行排重优化取决于队列中请求的重复度。由于不同请求之间并不存在重复的问题,不失一般性,这里的模型只考了单个请求的重复度,重复度分为三个类:无重复、稀疏重复、高重复。&br&无重复:在整个请求过程,没有任何一个请求出现一次以上。&br&稀疏重复:主要的请求最小重复长度大于消费队列长度。&br&高重复:大量请求最小重复长度小于消费队列长度。&br&对于不同的重复度,会有不同的消费模型。&/p&&h4&无重复消费模型&/h4&&p&在整个队列处理过程中,所有的请求都不相同,如下图:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/eea06af9e0edd1557382e_b.png& data-rawwidth=&485& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic3.zhimg.com/eea06af9e0edd1557382e_r.jpg&&&/figure&&h4&稀疏重复消费模型&/h4&&p&当同一请求最小重复长度大于消费者队列长度,如下图。假定有3个消费者,Consumer1将会处理r1,Consumer2将会处理r2,Consumer3将会处理r3,如果每个请求处理的时间严格相等,Consumer1在处理完r1之后,接着处理r4,Consumer2将会处理r2之后会处理r1。虽然r1被再次处理,但是任何时刻,只有这一个消费者在处理r1,不会出现多个消费者同时处理同一请求的场景。&br&&/p&&figure&&img src=&https://pic2.zhimg.com/60a4438bed1ea9ea7d5a1d5_b.png& data-rawwidth=&529& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&https://pic2.zhimg.com/60a4438bed1ea9ea7d5a1d5_r.jpg&&&/figure&&h4&高重复消费模型&/h4&&p&如下图,仍然假定有3个消费者,队列中前面4个请求都是r1,它会同时被3个消费者线程处理:&/p&&p&&figure&&img src=&https://pic1.zhimg.com/90ca600f2f849b93a23778_b.png& data-rawwidth=&485& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic1.zhimg.com/90ca600f2f849b93a23778_r.jpg&&&/figure&显然,对于无重复和稀疏重复的分布式队列,排重优化并不会带来额外的好处。排重优化所针对的对象是高重复消费模型,特别是对于并行处理消费者比较多的情况,重复处理同一请求,资源消耗极大。&/p&&h4&排重状态机&/h4&&p&排重优化的主要对象是高重复的队列,多个消费者线程或进程同时处理同一个幂等请求只会浪费计算资源并延迟其他待请求处理。所以,排重状态机的一个目标是处理唯一性,即:同一时刻,同一个请求只有一个消费者处理。如果消费者获取一条请求消息,但发现其他消费者正在处理该消息,则当前消费者应该处于等待状态。如果对同一请求,有一个消费者在处理,一个消费者在等待,而同一请求再次被消费者读取,再次等待则没有意义。所以,状态机的第二个目标是等待唯一性,即:同一时刻,同一个请求最多只有一个消费者处于等待状态。总上述,状态机的目标是:处理唯一性和等待唯一性。我们把正在处理的请求称为头部请求,正在等待的请求称为尾部请求。&br&由于状态机的处理单元是请求,所以需要针对每一个请求建立一个排重状态机。基于以上要求,我们设计的排重状态机包含4个状态Init,Process,Block,Decline。各个状态之间转化过程如下图:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/caca39e212c8af5adf00b1_b.png& data-rawwidth=&302& data-rawheight=&351& class=&content_image& width=&302&&&/figure&&ol&&li&状态机创建时处于Init状态。&/li&&li&对Init状态进行Enqueue操作,即接收一个请求,开始处理(称为头部请求),状态机进入Process状态。&/li&&li&状态机处于Process状态,表明当前有消费者正在处理头部请求。此时,如果进行Dequeue操作,即头部请求处理完成,返回Init状态。如果进行Enqueue操作,即另一个消费者准备处理同一个请求,状态机进入Block状态(该请求称为尾部请求)。&/li&&li&状态机处于Block状态,表明头部请求正在处理,尾部请求处于阻塞状态。此时,进行Dequeue操作,即头部请求处理完成,返回Process状态,并且尾部请求变成头部请求,原尾部请求消费者结束阻塞状态,开始处理。进行Enqueue操作,表明一个新的消费者准备处理同一个请求,状态机进入Decline状态。&/li&&li&状态机进入Decline状态,根据等待唯一性目标,处理最新请求的消费者将被抛弃该消息,状态机自动转换回Block状态。&/li&&/ol&&h3&构思&/h3&&p&状态机描述的是针对单个请求操作所引起状态变化,排重优化需要解决队列中所有请求的排重问题,需要对所有请求的状态机进行管理。这里只考虑单虚拟机内部对所有请求状态机的管理,对于跨虚拟机的管理可以采用类似的方法。对于多状态机管理主要包含三个方面:一致性问题、完整性问题和请求缓存驱逐问题。&/p&&h4&一致性问题&/h4&&p&一致性在这里要求同一请求的不同消费者只会操作一个状态机。由于每个请求都产生一个状态机,系统将会包含大量的状态机。为了兼顾性能和一致性,我们采用ConcurrentHashMap保存所有的状态机。用ConcurrentHashMap而不是对整个状态机队列进行加锁,可以提高并行处理能力,使得系统可以同时操作不同状态机。为了避免处理同一请求的多消费者线程同时对ConcurrentHashMap进行插入所导致状态机不一致问题,我们利用了ConcurrentHashMap的putIfAbsent()方法。代码方案如下,key2Status用于存储所有的状态机。消费者在处理请求之前,从状态机队列中读取排重状态机TrafficAutomate。如果没有找到,则创建一个新的状态机,并通过putIfAbsent()方法插入到状态机队列中。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&private ConcurrentHashMap&T, TrafficAutomate& key2Status = new ConcurrentHashMap();
TrafficAutomate trafficAutomate = key2Status.get(key);
if(trafficAutomate == null)
trafficAutomate = new TrafficAutomate();
TrafficAutomate oldAutomate = key2Status.putIfAbsent(key, trafficAutomate);
if(oldAutomate != null)
trafficAutomate = oldA
&/code&&/pre&&/div&&h4&完整性问题&/h4&&p&完整性要求保障状态机Init,Process,Block,Decline四种状态正确、状态之间的转换也正确。由于状态机的操作非常轻量级,兼顾完整性和降低代码复杂度,我们对状态机的所有方法进行加锁。&/p&&h4&请求缓存驱逐问题(Cache Eviction)&/h4&&p&如果不同请求的数量太多,内存永久保存所有请求的状态机的内存开销太大。所以,某些状态机需要在恰当的时候被驱逐出内存。这里有两个思路:&/p&&ul&&li&当状态机返回Init状态时,清除出队列。&/li&&li&启动一个后台线程,定时扫描状态机队列,采用LRU等标准缓存清除机制。&/li&&/ul&&h4&标识问题&/h4&&p&每个请求对应于一个状态机,不同的状态机采用不同的请求进行识别。&br&对于同一状态机的不同消费者,在单虚拟机方案中,我们采用线程id进行标识。&/p&&h3&实施&/h3&&p&排重优化的主要功能都是通过排重状态机(TrafficAutomate)和状态机队列(QueueCoordinator)来实施的。排重状态机描述的是针对单个请求的排重问题,状态机队列解决所有请求状态机的排重问题。&/p&&h4&状态机实施(TrafficAutomate)&/h4&&p&根据状态机模型,其主要操作为enQueue和deQueue,其状态由头部请求和尾部请求的状态共同决定,所以需要定义两个变量为head和tail,用于表示头部请求和尾部请求。为了确保多线程操作下状态机的完整性(Integraty),所有的操作都将加上锁。&/p&enQueue操作&p&当一个消费者执行enQueue操作时:如果此时尾部请求不为空,根据等待唯一性要求,返回DECLINE,当前消费者应该抛弃该请求;如果头部请求为空,返回ACCPET,当前消费者应该立刻处理该消息;否则,返回BLOCK,该消费者应该等待,并不停的查看状态机的状态,一直到头部请求处理完成。enQueue代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&synchronized ActionEnum enQueue(long id)
if(tail != INIT_QUEUE_ID)
return DECLINE;
if(head == INIT_QUEUE_ID)
return ACCEPT;
return BLOCK;
&/code&&/pre&&/div&deQueue操作&p&对于deQueue操作,首先将尾部请求赋值给头部请求,并将尾部请求置为无效。deQueue代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&synchronized boolean deQueue(long id)
tail = INIT_QUEUE_ID;
&/code&&/pre&&/div&&h4&状态机队列实施(QueueCoordinator)&/h4&接口定义&p&状态机队列集中管理所有请求的排重状态机,所以其操作和单个状态机一样,即enQueue和deQueuqe接口。这两个接口的实现需要识别特定请求的状态机,所以它们的入参应该是请求。为了兼容不同类型的请求消息,我们采用了Java泛型编程。接口定义如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public interface QueueCoordinator&T& {
public boolean enQueue(T key);
public void deQueue(T key);
&/code&&/pre&&/div&enQueue操作&p&enQueue操作过程如下:&br&首先,根据传入的请求key值,获取状态机, 如果不存在则创建一个新的状态机,并保存在ConcurrentHashMap中。&br&接下来,获取线程id作为该消费者的唯一标识,并对对应状态机进行enQueue操作。&br&如果状态机返回值为ACCEPT或者DECLINE,返回业务层处理代码,ACCEPT意味着业务层需要处理该消息,DECLINE表示业务层可以抛弃当前消息。如果状态机返回值为Block,则该线程保持等待状态。&br&异常处理。在某些情况下,头部请求线程可能由于异常,未能对状态机进行deQueue操作(作为组件提供方,不能假定所有的规范被使用方实施)。为了避免处于阻塞状态的消费者无期限地等待,建议对状态机设置安全超时时限。超过了一定时间后,状态机强制清空头部请求,返回到业务层,业务层开始处理该请求。&br&代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public boolean enQueue(T key) {
_loggingStastic();
TrafficAutomate trafficAutomate = key2Status.get(key);
if(trafficAutomate == null)
trafficAutomate = new TrafficAutomate();
TrafficAutomate oldAutomate = key2Status.putIfAbsent(key, trafficAutomate);
if(oldAutomate != null)
trafficAutomate = oldA
long threadId = Thread.currentThread().getId();
ActionEnum action = trafficAutomate.enQueue(threadId);
if(action == DECLINE)
else if (action == ACCEPT)
//Blocking status means some other thread are working on this key, so just wait till timeout
long start = System.currentTimeMillis();
long span = 0;
_nonExceptionSleep(NAP_TIME_IN_MILL);
if(trafficAutomate.isHead(threadId))
span = System.currentTimeMillis() -
}while(span &= timeout);
//remove head so that it won't block the queue for too long
trafficAutomate.evictHeadByForce(threadId);
&/code&&/pre&&/div&deQueue操作&p&deQueue操作首先从ConcurrentHashMap获取改请求所对应的状态机,接着获取该线程的线程id,对状态机进行deQueue操作。&br&enQueue代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public void deQueue(T key) {
TrafficAutomate trafficAutomate = key2Status.get(key);
if(trafficAutomate == null)
logger.error(&key {} doesn't exist &, key);
long threadId = Thread.currentThread().getId();
trafficAutomate.deQueue(threadId);
&/code&&/pre&&/div&&h4&源代码&/h4&&p&完整源代码可以在&a href=&http://link.zhihu.com/?target=https%3A//github.com/dinglau2008/QueueCoordinator/tree/master/src& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&QueueCoordinator&/a&获取。&/p&&h1&参考资料&/h1&&p&[1] Rabbit MQ, &a href=&http://link.zhihu.com/?target=https%3A//www.rabbitmq.com/ha.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Highly Available Queues&/a&.&br&[2] IBM Knowledge Center, &a href=&http://link.zhihu.com/?target=https%3A//www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.pro.doc/q002620_.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introduction to message queuing&/a&.&br&[3] Wikipedia, &a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Serializability& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Serializability&/a&.&br&[4] Hadoop, &a href=&http://link.zhihu.com/?target=https%3A//zookeeper.apache.org/doc/trunk/recipes.html%23sc_leaderElection& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZooKeeper Recipes and Solutions&/a&.&br&[5] &a href=&http://link.zhihu.com/?target=http%3A//kafka.apache.org/documentation.html%23introduction& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Apache Kafka&/a&.&br&[6] Lamport L, &a href=&http://link.zhihu.com/?target=http%3A//research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Paxos Made Simple&/a&.&/p&
前言“分布式队列编程”是一个系列文,之前我们已经发布了《分布式队列编程模型、实战》,主要剖析了分布式队列编程模型的需求来源、定义、结构以及其变化多样性;根据作者在新美大实际工作经验,给出了队列式编程在分布式环境下的一些具体应用。本文将重点…
作为一个文科妹子,我在看过几乎所有热门 github 教程之后依旧一头雾水,在近半年的摸索中终于明白啦~新年初,把自己纯小白的学习经验分享一下吧!&br&&br&&b&#什么是 Github ?&br&&/b&必须要放这张图了!!!&br&&figure&&img src=&https://pic2.zhimg.com/50/7c9d63fb_b.jpg& data-rawwidth=&600& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/50/7c9d63fb_r.jpg&&&/figure&(图片来源&a href=&https://www.zhihu.com/question//answer/& class=&internal&&GitHub 是怎样的一个存在? - Deep Reader 的回答&/a&)&br&&blockquote&&p&Git 是由 Linux 之父 Linus Tovalds 为了更好地管理linux内核开发而创立的分布式版本控制/软件配置管理软件。&/p&&/blockquote&好吧,我相信看到这里你已经晕了,这也是我一开始看那些所谓经典教程的感受。写这些教程的人都是几年以上的程序员呀,他们往往直接就告诉你所有命令的含义或者整个体系。&br&&blockquote&专家盲点(expert blind spot)就是对一个事物知道的越多,就越发不记得“不知道这个事”的情形。&/blockquote&&br&&b&简单来说,Git 是一个管理你的「代码的历史记录」的工具。&br&&/b&&figure&&img src=&https://pic2.zhimg.com/50/cd910ad32ac_b.jpg& data-rawwidth=&214& data-rawheight=&164& class=&content_image& width=&214&&&/figure&我不是程序员为什么要学这个啊啊啊!又不要管理代码们!&br&&br&别急,虽然 github 学习门槛高,一会你就知道为什么人人都应该会这个啦!&br&&br&----------------------------&br&&b&学习步骤&/b&&br&&br&##注册安装&br&去官网注册一个账号(这个你应该会,恩就不放链接了)&br&然后,下载一个&a href=&//link.zhihu.com/?target=https%3A//desktop.github.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub Desktop&/a& mac客户端是最方便的啦!(命令行什么的真的是会越来越晕!先别管他们!)&br&&br&假设33(珊姗就是我啦)、小四和你三个人一起写一本小说(澄清一下,并没有黑任何人的意思,恩!),暂且叫做...《梦里花落爱吃土时代》&br&--&br&图(脑补)&br&--&br&(⊙v⊙)嗯!终于可以正式开始了!&br&&br&&b&#step1:创建新项目&/b&&br&我们三个人在不同的城市要远程共同写一本书,要有一个漂亮的笔记本吧?&br&&figure&&img src=&https://pic2.zhimg.com/50/fa17ad198ae_b.jpg& data-rawwidth=&895& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&895& data-original=&https://pic2.zhimg.com/50/fa17ad198ae_r.jpg&&&/figure&&br&「repositories」就是你的笔记本们。你只需知道 Repository 是个放项目的地方就行。有时候会出现 Repositories,是多个 Repository 的意思。&br&&br&**fork**&br&如果你不想新建一个笔记本,看到小四之前写过一个好到炸裂的文章,想把他的直接全部偷过来,修改修改就成你自己的文章了,这应该怎么办呢?&br&github 还提供了一个很赞的功能叫做 fork ,你只需要点击这个神奇的按钮,就可以把他的「笔记本」变成你自己的啦!任意修改都可以哦~&br&&figure&&img src=&https://pic1.zhimg.com/50/ed6d6fdc68fbfa829997b_b.jpg& data-rawwidth=&808& data-rawheight=&201& class=&origin_image zh-lightbox-thumb& width=&808& data-original=&https://pic1.zhimg.com/50/ed6d6fdc68fbfa829997b_r.jpg&&&/figure&&br&&br&&b&#step2:把「笔记本」克隆到本地&/b&&br&「笔记本」在云端,你要把它摘下来放到自己的电脑上写小说才方便呀,在这里我们叫「clone」是不是很形象?步骤如图:&br&&figure&&img src=&https://pic3.zhimg.com/50/b5d537f10af3_b.jpg& data-rawwidth=&838& data-rawheight=&309& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic3.zhimg.com/50/b5d537f10af3_r.jpg&&&/figure&或者是直接去我们的客户端&br&&figure&&img src=&https://pic3.zhimg.com/50/cde6dbb8be6_b.jpg& data-rawwidth=&1112& data-rawheight=&773& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&https://pic3.zhimg.com/50/cde6dbb8be6_r.jpg&&&/figure&&br&&b&#step3:可以开始写作啦!&/b&&br&你的笔记本里已经自动有一个文档了,这个时候让我们回到网页版[微笑脸]&br&你只需要在 web 端点开这个README.md可以开始在里面写你的小说了。&br&&figure&&img src=&https://pic2.zhimg.com/50/5cff90f3bd0cd5e400bcc637_b.jpg& data-rawwidth=&1024& data-rawheight=&335& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic2.zhimg.com/50/5cff90f3bd0cd5e400bcc637_r.jpg&&&/figure&或者直接点开刚刚 clone 到电脑上的文件夹直接在里面写。&br&ps:需要注意的是,文本支持 markdown 格式,可以先参考这个&a href=&//link.zhihu.com/?target=http%3A//www.jianshu.com/p/q81RER& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&献给写作者的 Markdown 新手指南&/a&。&br&&br&&b&#step4:上传你写的小说&/b&&br&在本地写完之后你要上传到云端让我和小四都能看见你写出什么幺蛾子了吧?&br&回到客户端,你发现有变化!!!&br&&figure&&img src=&https://pic4.zhimg.com/50/2e2d2a0da9ef8005ee01f_b.jpg& data-rawwidth=&517& data-rawheight=&542& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&https://pic4.zhimg.com/50/2e2d2a0da9ef8005ee01f_r.jpg&&&/figure&没错,在你头像旁边给你这次提交内容起一个名字,以后如果再次寻找的时候会很方便。然后点下面的 Commit to master,还有右上角的 Sync 就好啦!&br&&br&&b&#step5:回退到之前的版本&/b&&br&夜深人静的时候,我趁着你们都在睡觉把小说的结局偷偷地改成女主死掉了!&br&你醒来觉得我这结局改的也太悲伤了,完全不能接受!结局必须要和之前那样王子公主幸福的生活在一起的 happy ending!&br&问题又来了,怎么退回到我修改结局之前的 happy ending?&br&&br&还是刚刚那个客户端,选择History 然后点击小齿轮,选择潇洒地点 roll back to this commit!&br&你又回到happy ending的状态啦!!&br&&figure&&img src=&https://pic3.zhimg.com/50/e2b413faf67ea77b36c93_b.jpg& data-rawwidth=&301& data-rawheight=&223& class=&content_image& width=&301&&&/figure&&br&&b&#step6:&/b&&br&小四写了一章华丽无比的番外,你要更新本地的小说和他写的保持一致怎么办?&br&git pull&br&&figure&&img src=&https://pic2.zhimg.com/50/f5c5c0b43d1f9f7ab27267fbcc16d9fd_b.jpg& data-rawwidth=&279& data-rawheight=&354& class=&content_image& width=&279&&&/figure&&br&-----------&br&好了,知道这些基本操作入门应该够了,我们来回顾一下(不要嫌弃我的画工啊喂!)&br&&figure&&img src=&https://pic1.zhimg.com/50/6c22d708defbc7df2240b_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/50/6c22d708defbc7df2240b_r.jpg&&&/figure&&br&入门初期迅速得到一些正反馈对于学习一门新技能来说实在是太重要了!尤其是编程这么炫酷的事情!&br&所以先不要管什么复杂的 issue 呀 wiki 呀乱七八糟的操作,按照上面的一步一步来,如果遇到什么问题 google 之,一般都会解决的。&br&&br&有一个段子不就是说,当你遇到问题去找最高级的工程师,他们一般都会直接 google 吗?而且自带的帮助手册也是解决问题的好办法,比如你要新建一个 branch=》&a href=&//link.zhihu.com/?target=https%3A//github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Create a new branch with git and manage branches · Kunena/Kunena-Forum Wiki · GitHub&/a&&br&&br&&b&这种遇到问题先自己尝试解决的小技巧,也是我自从学编程以来最大的收获。&/b&&br&&br&------------------------&br&&br&&b&#除了写代码你还可以用 github 做什么?&br&&/b&&br&回到文章开头,我又不是程序猿不用写代码玩这个干啥?&br&&br&你有没有碰到过团队里几个人共同协作写一个文档的时候?或者说需要反复修改的东西?比如最简单的写论文,用 word 保存一个一个版本 e-mail 给 boss?下次再找上次修改了什么地方简直要死啊有木有!!!&br&&br&相信你看了我的远程协作写小说的例子应该已经明白了, github 说白了就是一个「版本控制工具」。我们所谓的「回退」到历史记录,随时查看更改了什么地方,利用这个功能可以做的事情简直太多啦!&br&&br&就像 github 其中一位创始人[Chris](&a href=&//link.zhihu.com/?target=https%3A//github.com/defunkt& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&defunkt (Chris Wanstrath) · GitHub&/a&)也详细描述了[GitHub初创的前因后果](&a href=&//link.zhihu.com/?target=https%3A//gist.github.com/67060& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Startup Riot 2009 Keynote 路 GitHub&/a&),他说道:&br&&blockquote&&p&Do whatever you want.&/p&&/blockquote&所以不是程序猿可以用这个来做什么呢?&br&&b&1、写书&br&&/b&和 33 一起写小说的例子,还记得吧?几个人你一章我一章共同修改一本书,或是几个出版社的编辑对新书进行校对,利用这个神器就可以随时看到哪里出现了问题和更改。如果想自己写书的话 gitbook 也是不错的选择(又是一个坑。。)&br&&br&&b&2、写文档神器&br&&/b&身为科研狗、产品狗、射鸡湿的你,是不是经常写文档?一个成熟的文档可能会有好几个版本,需要不断地迭代,然后不断提交给老板看哪里需要修改。在不同版本间自如切换就要用到git branch和git rebase了。&br&想想看,用 git 的分支管理不比拷贝粘贴更方便吗?&br&&br&&b&3、健身&br&&/b&有个哥们为了激励自己健身把每日计划都放上去了,还可以邀请其他人一起来相互监督!(我才不会说我自己也开了一个呢哈哈哈)&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/hoosin/EveryDaySport& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hoosin/EveryDaySport · GitHub&/a&&br&&br&&b&4、找男票&br&&/b&没错,看这个项目!利用众包的形式一起罗列男友条件的 list 然后试图自己开发出一个男票233333&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/YixuanFranco/YourBoyfriend& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&YixuanFranco/YourBoyfriend · GitHub&/a&&br&有人评论问我用这个找到男票了吗?&br&统一回复:&br&并!没!有!&br&&br&&b&5、用GitHub搭建博客、个人网站或者公司官网&/b&&p&一个有自己域名的独立博客,是不是很帅?!&/p&&p&GitHub本身提供免费的托管服务,又提供了贴心的 Pages 功能,可以绑定你自己的域名,免费、高效、不限流量,做一个个人页面绰绰有余。&/p&&p&Jekyll 的教程和我自己的博客会稍后放出。。(先给自己挖个坑)&/p&&br&&p&&b&6、用GitHub协作翻译&/b&&/p&&p&苹果官方发布的各种官方手册,比如最近开源的 Swift &a href=&//link.zhihu.com/?target=https%3A//github.com/numbbbbb/the-swift-programming-language-in-chinese& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&numbbbbb/the-swift-programming-language-in-chinese · GitHub&/a& 就是国内一个自发组织起来的团队,30多个人用9天时间即将翻译和校对工作全部完成,他们每人都还有自己的事情,上班、上线、创业,这么大的工作量在以往简直是不可能完成的任务!&/p&&br&&p&&b&7、项目管理&/b&&/p&&p&GitHub最初是为了开发的管理而生,当然也就具备了项目管理的潜质,特别是与开发密切联系的项目中,它的优势尽显。比如这篇文章介绍了如何使用GitHub结合 Trello 等其它工具进行项目管理:&a href=&//link.zhihu.com/?target=http%3A//xiaocong.github.io/blog//team-collaboration-with-github/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用GitHub进行团队合作&/a&。当然,GitHub还是很偏重开发的管理,一般的项目管理还是适合使用 wortile 之类的产品。&/p&&br&&b&7、政府文件?&/b&&br&之前看到一个知乎回答说:日本政府把宪法放上去了,德国政府也做过类似的事:German Federal Law Now on GitHub。除了德日之外,英美在 GitHub 上也有很多公众服务:英国政府多达 10 页的项目目录:&a href=&//link.zhihu.com/?target=https%3A//github.com/alphagov& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Government Digital Service · GitHub&/a& 其中很多是政府项目的源代码或者设计原则之类。芝加哥的公开地理信息:Forking your CityNew York Open City: City of New York 路 &br&(原谅我找不到这个回答了,欢迎补充)&br&&br&&b&8、科研项目及数据&br&&/b&较早的&a href=&//link.zhihu.com/?target=http%3A//arxiv.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&arXiv&/a&、&a href=&//link.zhihu.com/?target=http%3A//plos.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PLoS&/a&之外,较有气象的可以推荐&a href=&//link.zhihu.com/?target=http%3A//mendeley.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mendeley&/a&、&a href=&//link.zhihu.com/?target=http%3A//www.doaj.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&开放期刊目录&/a&&br&教育方面:&br&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//openstudy.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenStudy&/a&:一个社会性学习网络,通过互助来更好地学习,主题涉及到计算机、数学、写作等。&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//openhatch.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&openhatch&/a&: 通过练习、任务等帮助新手更好地进入开源社区&/li&&/ul&&b&9、个人简历&br&&/b&&p&GitHub上的代码无法造假,也容易通过你关注的项目来了解你的知识面的宽度与深度。现在越来越多知名公司活跃在GitHub,发布开源库并招募各类人才,例如:&a href=&//link.zhihu.com/?target=https%3A//github.com/facebook& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Facebook&/a&、&a href=&//link.zhihu.com/?target=https%3A//github.com/twitter& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Twitter&/a&、&a href=&//link.zhihu.com/?target=https%3A//github.com/yahoo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Yahoo&/a& ...&/p&&p&开始有了第三方网站提供基于GitHub的人才招聘服务,例如:&/p&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//githire.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHire&/a&:通过它,可以找出你所在地区的程序员。&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.gitalytics.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gitalytics.com&/a&:通过它,能评估某位程序员在GitHub、LinkedIn、StackOverflow、hackernews等多个网站的影响力。&/li&&/ul&甚至专门有一个项目就是自动根据你的 GtiHub 公开项目创建个人简历:&br&&a href=&http://www.zhihu.com/question//answer/& class=&internal&&我们可以使用 Git 以及 GitHub 做哪些事情? - Kane Blueriver 的回答&/a&&br&&br&&b&10、设计资源库(重点来了!!!)&br&&/b&做 ppt 不知道到哪里去找高质量美图?&br&最近半年初入设计圈,收集了不少 bookmark 想在年底来一个总结。 于是自己创建了这个Design- Resource List 项目,旨在让更多的设计师找资源变得有章可循。&br&&br& 先更新一部分,大概还有200多个还没放过来。。(吐血) 所以,欢迎大家也推荐自己收藏的资源,加入这个项目并一起持续更新么么哒 :)&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/timmy3131/design-resource& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&timmy3131/design-resource · GitHub&/a&&br&&br&11、&a href=&//link.zhihu.com/?target=https%3A//github.com/explore& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Explore · GitHub&/a& 更多好玩的内容等你自己发现哦&br&&a href=&https://www.zhihu.com/question/& class=&internal&&你在 GitHub 上看到过的最有意思的项目是什么? - 调查类问题&/a&&br&&br&-------------------------------------&br&&b&#更多高阶教程:&/b&&br&&b&如果你已经不满足于上面的基础知识了,欢迎探索更高级的玩法!&br&&/b&1、&a href=&//link.zhihu.com/?target=https%3A//gitcafe.com/GitCafe& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitCafe&/a& / &a href=&//link.zhihu.com/?target=https%3A//gitcafe.com/GitCafe/Help& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Help&/a&&br&2、[git简明指南](&a href=&//link.zhihu.com/?target=http%3A//rogerdudler.github.io/git-guide/index.zh.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&git - the simple guide&/a&)墙裂推荐!漫画的形式很形象(恩我承认比我画的好看多了)&br&&p&3、在线交互学习 github 的网站&a href=&//link.zhihu.com/?target=http%3A//pcottle.github.io/learnGitBranching/%3FNODEMO& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Learn Git Branching&/a& 这个也很好玩~&/p&&p&4、[GitHub自身的官方博客](&a href=&//link.zhihu.com/?target=https%3A//github.com/blog& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The GitHub Blog · GitHub&/a&)&/p&5、&a href=&//link.zhihu.com/?target=http%3A//danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&git-flow 备忘清单&/a&&br&&br&&b&入门书籍推荐:&br&&/b&&a href=&//link.zhihu.com/?target=http%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub入门与实践 (豆瓣)&/a&比较基础&br&&a href=&//link.zhihu.com/?target=http%3A//book.douban.com/subject/3420144/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Pro Git (豆瓣)&/a& 更高级的教程,很全面!&br&&br&对了对了,还有阳志平老师的两篇非常全面的旧文(这么称呼好生疏啊2333)&br&&a href=&//link.zhihu.com/?target=http%3A//www.yangzhiping.com/tech/github.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何高效利用GitHub&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.yangzhiping.com/tech/git.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Git与Github入门资料&/a&&br&&br&------------------------&br&( ⊙ o ⊙ )啊!知乎居然还不支持 markdown 心好累。。&br&&br&祝大家新年快乐。&br&ps:有朋友问我真的用 github 来写小说吗?&br&o(╯□╰)o只是举例子啊!方便大家理解而已...&br&还是会写一点点代码的(*/ω\*)&br&&br&欢迎各位程序员哥哥们纠错呀,别忘了点赞赞赞!!!!!
作为一个文科妹子,我在看过几乎所有热门 github 教程之后依旧一头雾水,在近半年的摸索中终于明白啦~新年初,把自己纯小白的学习经验分享一下吧! #什么是 Github ? 必须要放这张图了!!! (图片来源) …
&b&广义上的情调——&/b&&br&&b&我个人认为的“会玩”,分为两个极端。&/b&&br&用故事说话。&br&&br&&b&1.玩自己/别人没玩过的&/b&&br&&br&&br&我曾经的讲师。&br&大约四五十岁的中年汉子。&br&他说他曾在意大利跟英文很蹩脚的陌生意大利妹子喝咖啡聊天聊一两个小时。&br&他说它曾到外蒙拜访朋友,天气冷得吓人,他的朋友就让他妻子跟我讲师一起睡以取暖。(虽说游牧民族对男女之别的概念没有那么保守,但是我完全查不到有相关的风俗资料,所以这件事还是有所保留的)&br&&br&他讲的课是ethics,但是问到宗教、哲学、艺术、音乐、历史、建筑、经济、风俗、礼仪、IT等等的问题,他都能滔滔不绝讲出个所以然来。其他我不清楚的领域我不知道是现编吹牛还是真实,但是在我平时有研究的哲学、文学、艺术、历史方面,我看得出来是有真实的底蕴。&br&&br&&b&保持旺盛的好奇心,不断触碰自己未曾接触的领域,培养出自己的知识面,这样的“玩”非常有情趣。&/b&&br&再直观一点的话,与人聊天时,丰富的经历与广阔的知识面透露出的“逼格”,就是我所认为的其中一种情调。&br&&br&关于如何培养,就如上面所说。知乎就是这样一个好玩的平台,总有许多你不知道的有趣的事情,而他们阐述的方式又不是教科书那般生硬。稍微推荐几个。&br&&a href=&http://www.zhihu.com/question/& class=&internal&&「保险」到底保险吗?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&艺术史上,肖像画家和模特之间有过什么趣事吗?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&各种花的花语是怎么来的?起源是什么?有什么依据?怎么得到大家的认同的?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&国内有哪些尚未被过度开发的景点值得一去?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&为什么日本历史上的一些有实权天皇和有实力的大名会剃度当和尚呢?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&古代打仗的阵型真的有那么重要吗?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&冰屋是如何建造的?&/a&&br&&br&&br&&b&2.玩自己/别人玩过的&/b&&br&&b&从重复无聊的日常中以及常见的娱乐中找出不一样的玩法。&/b&&br&好处是比上一点提到的要轻松,不用去认真看什么资料。也更加通俗,跟朋友更玩得起来。&br&&br&我朋友跟我去唱K时经常玩法就是……&br&把普通话歌词用粤语唱出来&br&把粤语歌词用普通话唱出来&br&把中文歌词即时翻译用英文唱出来&br&把英文歌词即时翻译用中文唱出来&br&把中文歌词即时翻译用文言文唱出来(读中文的最常做)&br&把英文即时翻译用拉丁文唱出来(这活我的朋友里就只有一个读神学的能干得出来了)&br&中-日,日-中,英-日,日-英也有不少死宅做得出来……&br&&br&我妹妹发微博只挑22:22这个时间发其余时间一概不发不转,一直等有人发现让她可以很骄傲而傻蠢地回一段“哈哈哈哈哈哈哈哈哈”。不过她一般的社交软件/网站就Facebook跟Whatsapp,微博的关注者除了我还有她几个同样不怎么玩微博的同学之外其余都是僵尸粉,估计她这个愿望暂时还是没法实现了。至于可能是唯一发现者的我………………怎么会让她如愿!&br&&br&我中学时的有一位班主任是个刚毕业的姑娘。&br&她教的是中文,而刚好起码当时在中文这科我还是有点自信自称学霸的,所以有点特别对待有些私下联络聊天。&br&有一次她告诉我,在这苦逼的男校里,她一个姑娘家总是觉得格格不入,也就几个相熟的女老师感觉能调剂一下。&br&于是她经常娱乐的方式是把别人的姓跟另一个人的名混起来变成女名——当然是没有恶意的。&br&这时候一些特别的姓就经常被“拿来主义”了……我就经常中枪。&br&不少同学变成了:吴香雨、郭香、张思香 等等等等……&br&&br&在无聊中找有趣,就是一种情趣。&br&&a href=&http://www.zhihu.com/question//answer/& class=&internal&&「石头剪子布」游戏还有其它变种吗?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&肯德基、麦当劳有哪些奇葩的下架产品?&/a&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&最好的寿司,味道能好到什么程度?&/a&&br&&br&&b&至于如何培养,请看这个&/b&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&如何把无聊变为有趣?&/a&&br&&br&&b&还有就是多想象,多发散思维,多头脑风暴,多想些没意义的事情。&/b&&br&把得到答案的途径(网络、书籍、导师等等)放到最后,先结合自己的常识做没有任何限制的想象,等已经腻了这一个想法或者已经有了一些结论才去进行“获取答案”。&br&&br&我得强烈推荐一本书《苏菲的世界》,书里很多时候会引导你去想一些问题。&br&挺久以前,被书里一个问题触动了另一个问题。&br&开始的时候我在想:时间到底是什么?&br&我知道网上一搜肯定有很多不同学派不同学说不同人说的不同答案。&br&但是自己想象的过程会十分有趣。&br&我想我们的人生是不是就像电影一样早就被预设好了,而电影不过就是快速翻阅一堆静止的图片,我们就是在看着一部电影,这部电影按照每秒100帧播放,而每一帧就是一毫秒。所谓的时间就是一秒=看了100帧图片。要是我们直接翻阅后面或前面的“图片”是不是就感觉时间穿越了呢,所以我们会有即视感,会有记忆犹新,因为那些发生过或者好像发生过的事情可能就是上几“秒”我们才刚看过的东西。&br&然后想这些图片是怎么来的呢,我们是不是真的像我们以为的这样活着,还是只是被某些存在困在某个小黑屋里往我的脑子灌输这些图片。我们在活动,还是我们看着这些“图片”以为我们在活动。&br&这个稚嫩而漏洞百出的思路至今仍然不时想起。&br&&br&&br&&b&狭义上的情调——狭义上高端洋气冷艳高贵壕无人性孤寂清冷型的浪漫情调。&/b&&br&&b&玩得深入、玩得专业。&/b&&br&这就需要一定的累积了。&br&当你深入了解一样东西(一般在享受方面)的文化,举手投足都是自然不生硬的,别人看来这就是一种情调。在礼仪学深入研究,方方面面做得得体无可挑剔,顺手拈来就是一段典故,让对方感受到你这种“气场”,就是这般高端洋气的浪漫情调。&br&不过首先你要有深入的学习。&br&像这样&br&&a href=&http://www.zhihu.com/question/& class=&internal&&如何读解葡萄酒瓶外面标签纸上面的文字?&/a&&br&这样&br&&a href=&http://www.zhihu.com/question/& class=&internal&&雪茄适合在大街上抽么?&/a&&br&还有这样&br&&a href=&http://www.zhihu.com/question/& class=&internal&&关于品酒,如何入门,如何进阶?相关的专业标准是如何的?&/a&&br&&br&&br&&b&不过很多时候,外人看起来的孤寂清冷高端情调。对他们自己来说只是再正常不过的另一个每一天而已。&/b&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&在现实里做深夜食堂存在可能性吗?必备条件有哪些?&/a&
广义上的情调—— 我个人认为的“会玩”,分为两个极端。 用故事说话。 1.玩自己/别人没玩过的 我曾经的讲师。 大约四五十岁的中年汉子。 他说他曾在意大利跟英文很蹩脚的陌生意大利妹子喝咖啡聊天聊一两个小时。 他说它曾到外蒙拜访朋友,天气冷得吓人,他…
谢 &a data-hash=&030bf5e6ac5& href=&//www.zhihu.com/people/030bf5e6ac5& class=&member_mention& data-editable=&true& data-title=&@王豖& data-tip=&p$b$030bf5e6ac5& data-hovercard=&p$b$030bf5e6ac5&&@王豖&/a&邀。&br&&br&答主我并非科班出身的专业主持,但拥有两年以上的主持经验,大大小小不同类型的演出活动也接了不下百场,相信我提出的建议,对于第一次做主持的题主来说,应该是够用的了。&br&那么废话不多说,接下来我就为题主介绍一下《主持的基本修养》。&br&正文开始。&br&&br&&br&&br&&b&一. 服装&/b&&br&&br&正所谓“工欲善其事,必先利其器”,做为一个主持人,最基本的也是第一要义就是:&br&&br&&b&首先你要穿得像个主持。&/b&&br&&br&这是已有的答案中经常被忽略的一个方面,却也恰恰是最不能忽视的。在舞台演出的过程中,服装会呈现给观众一个直观的第一印象。一个没有正确着装的主持人一登台,还没有开口说话,观众直觉上就会觉得别扭:他怎么一点都不像主持?&br&好了,尚未开战,先输一阵。&br&&br&为什么我会如此絮絮叨叨地强调主持服装的重要性呢?因为我本人有过亲身的经历。&br&&br&那是在一个风和日暖草长莺飞的下午,我接到电话,要去为某手机品牌做主持。当时电话里并没有说明是什么样的活动,而之前我主持过的这个品牌的活动也只是路边小型得不能再小的外场演出。于是,年少轻狂的我就非常随意地前往了。&br&具体随意到了什么程度呢?随意到我只穿了一件白色的polo衫。&br&而到了现场我才发现,我要主持的,是该手机品牌的新机发布活动的外场。&br&当时,我的负责人见到我后的眼神是这样的:&br&&figure&&img src=&https://pic2.zhimg.com/50/35eb7a2bc854f4a7be0ceb_b.jpg& data-rawwidth=&271& data-rawheight=&200& class=&content_image& width=&271&&&/figure&我相信他心中一定有千万只草泥马狂奔而过.......&br&而我也意识到自己犯了大错。在当天的活动中,我用尽浑身解数,尽可能地通过丰富语言、调动气氛等各种方式来进行弥补,还免费献唱了两首歌。&br&当然,最后的结果还是好的,主办方对活动效果比较满意。据说当时公司某领导恰好从现场经过,觉得这个主持还是不错的,于是,该品牌之后的每一次活动,都是指定要我去主持。&br&这只是我成功化险为夷的一个例子,那些比较惨痛的我就不说了......都是血的教训啊......&br&&br&好了,言归正传。现场有几百人,同时校长和院领导也会出席,算是比较正式的场合了。那么主持人的着装应该是怎样呢?&br&题主在补充说明中提到自己是男生。男生在服装方面相对比较简单,非正式的小型的活动,衬衣即可。大型的正式的演出,如没有特殊要求(比如古装主题),正装就可以了。&br&当然,正装也是有讲究的。&br&除了日常穿着西装的一些基本要求外,登台主持时最重要的就是颜色的选择了。这里要提到三种经常出现的错误选择。&br&第一种最为常见,这也是大学生容易犯的一个错误,只要是较为正式的场合,就穿一身黑西装白衬衣。类似于这样的搭配:&br&&figure&&img src=&https://pic1.zhimg.com/50/7d6e23f1abe_b.jpg& data-rawwidth=&352& data-rawheight=&356& class=&content_image& width=&352&&&/figure&穿成这样上舞台,你确定不是推销房产的或者卖保险的走错片场了?&br&&br&&br&第二种则反其道而行之。黑色显得太沉重,那么选择鲜艳明快的亮色,舞台效果应该更好吧?&br&在他们眼中,彩色西装的舞台效果是这样的:&br&&figure&&img src=&https://pic4.zhimg.com/50/e983ca2bf34c47f3aae306_b.jpg& data-rawwidth=&400& data-rawheight=&600& class=&content_image& width=&400&&&/figure&&br&但实际上,效果是这样的:&br&&figure&&img src=&https://pic2.zhimg.com/50/03a84dba678ef5bb09ced_b.jpg& data-rawwidth=&507& data-rawheight=&528& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic2.zhimg.com/50/03a84dba678ef5bb09ced_r.jpg&&&/figure&&br&选择鲜艳的水果色的还算比较少见,比较常见的选择是第三种,白色。&br&这种选择属于第二种的加强版,极端的亮色。选择白色的人认为,白色既不会像黑色那样显得沉闷,同时又能够不失庄重。&br&在他们眼中,白色的效果是这样的:&figure&&img }

我要回帖

更多关于 如何使用ae 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信