现在的印度到底怎么样页游,一般用到什么样的技术,请系统的说明

谈谈页游市场现在是个什么样子
&&&&&&& 又到了一年一度的找工作季,今年有学弟来问我进游戏公司的事情,让我萌发了写这篇文的想法。掐指算来,自己进入游戏行业做网页游戏已经有快一年的时间了,作为一名不起眼的策划,我在这一年时间里自己对整个行业有了一些自己的观察和看法。其实在之前写的《这个世界没有你想象的那么简单》中,我已经和大家透露了一些当前页游行业的内幕,但今天我想详细和大家说说现在页游乃至整个游戏市场到底发展成了什么样子,解决一些大家长久以来存在的困惑。一、端游市场的危机&&&&&&& 端游,也就是客户端游戏,曾经是网络游戏市场中不可撼动的主力军。从《传奇》到《魔兽世界》的辉煌相信很多人都曾经见证过。然而现在,端游市场正在面临前所未有的冲击,端游的市场占有率在近几年严重下滑,不少业内人士甚至觉得去做端游现在无异于是自寻死路,那么究竟是什么导致了端游的市场危机呢。&&&&&&& 其实在《传奇》刚刚出现的时候,网络游戏在国内只是处于一个起步的阶段,当时在网吧里能够玩到的网络游戏真的可以用屈指可数来形容,因此不难想象当时为什么端游那么火爆,因为玩家根本就没有什么选择的余地,《传奇》作为时势造英雄的代表,在当时创造了一个传奇。&&&&&& 当后来许多人敏锐地发现网络游戏背后所隐藏的巨大市场后,市面上的端游开始越来越多,许多大大小小的公司都开始开发大型网络游戏,一时间游戏如雨后春笋般涌现在市面上。然而这种井喷式的研发肯定会带来良莠不齐的产品涌现,当玩家可以选择的产品变多了之后,肯定会对产品的质量,服务,还有性价比进行一个衡量。而在这个玩家对端游本身品质开始挑剔的时候,《魔兽世界》很适时地出现在了国内市场,以其精美的画面,宏大的故事背景以及有趣的玩法,丰富的玩家互动等等创造了另一个传奇。&&&&&&& 然而看看现在的《传奇》与《魔兽世界》,《传奇》在付费方式转变后完成沦为一个土豪砸钱的游戏,《魔兽世界》在《熊猫人之谜》资料片后显示出了前所未有的颓势,玩家数降到了历史新低。&&&&&&& 抛开这两款游戏现在的游戏环境不提,我们不得不承认现在端游市场最大的问题,是它们已经渐渐脱离现代人的生活节奏了。端游兴起的时候,是网吧最火爆的时候,当时家用宽带速度很慢,家用机的性能也有限,所以最忠实的网民基本都是泡网吧一族。无论他们的身份是什么,但他们都有着充足的时间,能够在网吧坐一下午,或者呆上一个通宵。要知道端游最显著的特点就是要求玩家用更长在线时间来获得游戏中更多的资源(包括等级,装备等等),因为最开始端游的收费模式就是点卡收费,所有人在游戏中都是公平的,你玩的时间越长,打的怪越多,你就可以越牛逼,至少等级比别人高出一截。&&&&&&& 这其实是网游最初让人沉迷的原因所在,因为现实中不存在这种付出与回报如此成正相关的世界。在现实中有的人轻松工作四个小时,能超过有些人辛苦工作十四个小时的收入,然而在游戏世界里,大家褪去了所有自己在现实中的所有身份与不平等,用时间来换取自己的成长,这不得不说是一个令人迷恋的乌托邦。然而后来游戏公司发现,这种经营模式并不能达到收益最大化,因为每个玩家的投入是有上限的,最多就是一天24小时乘以每个小时的点卡费用,你即使再有钱,在游戏里你也没处花,除非你用现金从别的玩家手里买账号或是装备,但是这些钱并没有落入游戏公司的腰包,全给国家贡献GDP,顺便缩小现实社会的贫富差距了。&&&&&&& 这是游戏公司最不愿意看到的场面,一个玩家把一把屠龙刀五万块卖个另一个玩家,他们一分钱拿不到,这个价格还只相当于十万个玩家一个小时给公司带来的收益。所以后来《传奇》改变了收费模式:全免收费。这个听起来很愚
分享这篇日志的人也喜欢
新主播,求支持,求关注
晚了一丢丢
不忘初心…
在你内心深处开一枪
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@vip.sina.com··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场第三方登录:165被浏览21,036分享邀请回答browserquest.mozilla.org项目代码: 415 条评论分享收藏感谢收起https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization
http://blog.csdn.net/buck84/article/details/8235159 (翻译)
render操作就是把上一帧画面清空,根据update操作设置的变量的值,重新把元素(比如英雄位置)画到画布canvas里.如何开发一个简单的HTML5 Canvas 2D小游戏,可以看看下面这个例子,非常适合入门:http://www.lostdecadegames.com/how-to-make-a-simple-html5-canvas-game/
http://www.cnblogs.com/Wayou/p/how-to-make-a-simple-html5-canvas-game.html (翻译)
285 条评论分享收藏感谢收起&h2&阶段一:SELECT & UPDATE&/h2&&a class=& wrap external& href=&http://link.zhihu.com/?target=https%3A//github.com/taowen/colorfour/tree/master/example/take1& target=&_blank& rel=&nofollow noreferrer&&https://github.com/taowen/colorfour/blob/master/example/take1/Transfer.go&/a&&p&SELECT 出来,判断余额,再进行 UPDATE。需要很强的数据库隔离级别来保证。&/p&&h2&阶段二:UPDATE WHERE&/h2&&a class=& external& href=&http://link.zhihu.com/?target=https%3A//github.com/taowen/colorfour/blob/master/example/take2/Transfer.go& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/taowen/color&/span&&span class=&invisible&&four/blob/master/example/take2/Transfer.go&/span&&span class=&ellipsis&&&/span&&/a&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&var updateAmountSql = sqlxx.Translate(
`UPDATE account SET amount=amount+:delta
WHERE account_id=:account_id AND amount+:delta & 0`)
&/code&&/pre&&/div&&p&UPDATE 的时候,添加 WHERE 条件,判断余额。仅仅依赖SQL的单条事务。&/p&&p&缺点是不支持幂等。无法做到转账两次,不重复发生。&/p&&h2&阶段三:INSERT EVENT & UPDATE&/h2&&a class=& external& href=&http://link.zhihu.com/?target=https%3A//github.com/taowen/colorfour/tree/master/example/take3& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/taowen/color&/span&&span class=&invisible&&four/tree/master/example/take3&/span&&span class=&ellipsis&&&/span&&/a&&p&除了更新balance之外,还额外INSERT一条event。通过数据库的主键不重复的特性,保证第二次操作的时候,可以知道钱已经扣过一次了,不需要操作第二次。利用数据库的事务来实现INSERT EVENT 和 UPDATE的同时成功。&/p&&p&这样解决了幂等的问题。但是缺点是收款方和付款方的账户需要在同一个数据库实例上。&/p&&h2&阶段四:分拆成两个独立的事务&/h2&&a class=& external& href=&http://link.zhihu.com/?target=https%3A//github.com/taowen/colorfour/tree/master/example/take4& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/taowen/color&/span&&span class=&invisible&&four/tree/master/example/take4&/span&&span class=&ellipsis&&&/span&&/a&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&package take4
&github.com/taowen/sqlxx&
&github.com/taowen/colorfour/tristate&
func Transfer(conn *sqlxx.Conn, referenceNumber, from, to string, amount int) *tristate.TriState {
result := updateBalance(conn, referenceNumber+&_&+from, from, -int64(amount))
if result.IsFailure() || result.IsUnknown() {
return result
result = updateBalance(conn, referenceNumber+&_&+to, to, int64(amount))
if result.IsSuccess() || result.IsUnknown() {
return result
rollbackResult := updateBalance(conn, referenceNumber+&_&+from+&_rollback&, from, int64(amount))
if rollbackResult.IsSuccess() {
return result
return rollbackResult
&/code&&/pre&&/div&&p&从from账户里扣钱,和加钱到to账户里。做成两个独立的数据库事务。由应用层来保证数据的最终一致性。当返回的结果是tristate(三态)里的unknown的时候,系统的数据处于不一致的状态。需要重试Transfer函数,来尝试把数据恢复到稳定的状态(success或者failure)。如果重试多次仍然失败,转给人工对账。&/p&&p&demo里面的自动重试功能没有实现。可以考虑使用disque设置延迟job的方式来重新调用自身,实现重试。&/p&&h2&阶段五:两阶段提交&/h2&&a class=& external& href=&http://link.zhihu.com/?target=https%3A//github.com/taowen/colorfour/tree/master/example/take5& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/taowen/color&/span&&span class=&invisible&&four/tree/master/example/take5&/span&&span class=&ellipsis&&&/span&&/a&&p&前一个实现的缺陷是钱直接加到可使用的账户上的。如果这部分钱被立即使用了,然后又有数据的回滚,则会导致账户余额变成负数。为了避免事务处理过程中的钱被其他事务使用掉,需要把这部分钱冻结到独立的账户。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&package take5
&github.com/taowen/sqlxx&
&github.com/taowen/colorfour/tristate&
type Action func() *tristate.TriState
type Step struct {
Description string
func executeStepsEventually(steps []Step) *tristate.TriState {
executedSteps := []Step{}
var result *tristate.TriState
for _, step := range steps {
fmt.Println(fmt.Sprintf(&apply %s&, step.Description))
result = step.Apply()
if result.IsUnknown() {
fmt.Println(&unknown failure: quit&)
return result
if result.IsFailure() {
fmt.Println(&faield: start to rollback&)
executedSteps = append(executedSteps, step)
if result.IsSuccess() {
fmt.Println(&all success&)
return result
for i := len(executedSteps) - 1; i &= 0; i-- {
fmt.Println(fmt.Sprintf(&rollback %s&, executedSteps[i].Description))
rollbackResult := executedSteps[i].Rollback()
if rollbackResult.IsFailure() || rollbackResult.IsUnknown() {
fmt.Println(&failed to rollback: quit&)
return rollbackResult
fmt.Println(&all rolled back&)
return result
func Transfer(conn *sqlxx.Conn, referenceNumber, from, to string, amount int) *tristate.TriState {
return executeStepsEventually([]Step{
{fmt.Sprintf(&transfer %v from %v to %v&, amount, from, from+&_staging&),
func() *tristate.TriState {
return directTransfer(conn, referenceNumber, from, from+&_staging&, amount)
}, func() *tristate.TriState {
return directTransfer(conn, referenceNumber+&_rollback&, from+&_staging&, from, amount)
{fmt.Sprintf(&transfer %v from %v to %v&, amount, from+&_staging&, to+&_staging&),
func() *tristate.TriState {
return directTransfer(conn, referenceNumber, from+&_staging&, to+&_staging&, amount)
}, func() *tristate.TriState {
return directTransfer(conn, referenceNumber+&_rollback&, to+&_staging&, from+&_staging&, amount)
{fmt.Sprintf(&transfer %v from %v to %v&, amount, to+&_staging&, to),
func() *tristate.TriState {
return directTransfer(conn, referenceNumber, to+&_staging&, to, amount)
}, func() *tristate.TriState {
return directTransfer(conn, referenceNumber+&_rollback&, to, to+&_staging&, amount)
func directTransfer(conn *sqlxx.Conn, referenceNumber, from, to string, amount int) *tristate.TriState {
return executeStepsEventually([]Step{
{fmt.Sprintf(&subtract %v from %v&, amount, from),
func() *tristate.TriState {
return updateBalance(conn, referenceNumber+&_&+from, from, -int64(amount))
}, func() *tristate.TriState {
return updateBalance(conn, referenceNumber+&_&+from+&_rollback&, from, int64(amount))
{fmt.Sprintf(&add %v to %v&, amount, to),
func() *tristate.TriState {
return updateBalance(conn, referenceNumber+&_&+to, to, int64(amount))
}, func() *tristate.TriState {
return updateBalance(conn, referenceNumber+&_&+to+&_rollback&, to, -int64(amount))
&/code&&/pre&&/div&&p&冻结是通过从acc1转给acc1_staging这个特殊账号来实现的。所以对于 balance 和 balance_update_event 都没有做修改(没有引入frozen_amount或者记录2pc status这样的字段)。&/p&&p&对于转账失败的情况,钱会原路退回&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&apply transfer 100 from acc1 to acc1_staging
apply subtract 100 from acc1
apply add 100 to acc1_staging
all success
apply transfer 100 from acc1_staging to acc2_staging
apply subtract 100 from acc1_staging
apply add 100 to acc2_staging
all success
apply transfer 100 from acc2_staging to acc2
apply subtract 100 from acc2_staging
apply add 100 to acc2
faield: start to rollback
rollback subtract 100 from acc2_staging
all rolled back
faield: start to rollback
rollback transfer 100 from acc1_staging to acc2_staging
apply subtract 100 from acc2_staging
apply add 100 to acc1_staging
all success
rollback transfer 100 from acc1 to acc1_staging
apply subtract 100 from acc1_staging
apply add 100 to acc1
all success
all rolled back
&/code&&/pre&&/div&&h2&阶段六:热点账户&/h2&&p&当一个账户下的交易特别频繁,amount字段会被频繁读写。这就产生了锁。对于这样的热点账户,我们需要把余额和流水记录到多个子账户下,避免所有的交易去争抢一个锁。&/p&&ol&&li&先查询子账户余额,计算转账计划(从哪些子账户转到哪些子账户)&/li&&li&执行转账计划&/li&&li&如果失败,尝试重新查询子账户余额,计算新的转账计划&/li&&li&执行转账计划&/li&&li&如果失败,放弃&/li&&/ol&
阶段一:SELECT & UPDATESELECT 出来,判断余额,再进行 UPDATE。需要很强的数据库隔离级别来保证。阶段二:UPDATE WHEREvar updateAmountSql = sqlxx.Tran…
&figure&&img src=&https://pic1.zhimg.com/v2-de0ad5a21_b.jpg& data-rawwidth=&1619& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1619& data-original=&https://pic1.zhimg.com/v2-de0ad5a21_r.jpg&&&/figure&前两天读了一篇文章,讲一个创业公司招收第一位数据科学家的虚构故事,充满雷坑,让人读起来妙趣横生。在数据方面工作两年,感觉深有同感,因为原文是英文,在这里简单翻译,与大家分享。有能力的还是读原文:来自 &a class=& wrap external& href=&http://link.zhihu.com/?target=https%3A//hackernoon.com/%40mrogati& target=&_blank& rel=&nofollow noreferrer&&Monica Rogati&/a& 的 &a href=&http://link.zhihu.com/?target=https%3A//hackernoon.com/how-not-to-hire-your-first-data-scientist-34f0f56f81ae& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How not to hire your first data scientist - Hacker Noon&/a&&p&以下是正文:&/p&&p&你,是一个创业公司的创始人。你内心深处深深地了解,为了跟上创业的潮流,需要搞一搞“大数据计划”(甚至“人工智能计划”)。你的投资者和客户都在跟你不停地谈论机器学习(甚至深度学习)。你已经意识到,这不是一个为什么要做的问题,而是一个何时完成的问题。&/p&&p&所以,你打算招聘你的第一位数据科学家,一个应届生(毕竟有工作经验的极难招聘,并且太贵)。这人有博士学位(所以你还可以在跟客户和投资人谈话的不经意间提提“我们有巨牛的博士在搞算法”)。博士们对于即将开始完成的机器学习项目充满了兴奋!当然,你也是!你觉得一切都会顺风顺水。&/p&&p&你的数据科学家开始他的工作了,准备好收集公司的数据,并且建立模型,这一切正如你期待的那样。在学校的时候,这些博士生使用的都是已经整理好、沿用了多年的数据。他们当然知道现在情况不一样了,需要自己准备数据了,但这完全不是问题。你的公司已经有长达一年的日志数据存在 S3 上,可以拿来当做数据源,进行挖掘和训练模型。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-907b870ab19b5ad9aa06b91edd6252af_b.jpg& data-rawwidth=&800& data-rawheight=&573& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-907b870ab19b5ad9aa06b91edd6252af_r.jpg&&&/figure&(图)如何思考数据科学的韦恩图&/p&&p&然而……你的公司完全没有为数据分析准备的基础软件架构,所以一切都得从零做起。你的数据科学家正在试着安装各种与公司技术栈不太统一的工具和软件。此时此刻,为了解决任何一个数据分析上的需求,都需要重新解析一遍日志文件。你的工程师团队对于数据的获取有些担心,特别是对于让他直接获取生产环境上的业务数据,于是提供了一份业务数据的线下备份。&/p&&br&&p&&i&啊哈&/i&,你对着你的数据科学家说,&i&你现在已经有了你要的所有数据啦!&/i&&/p&&p&但是……那份线下存储的业务数据备份,当然,并不是按照适合数据分析的格式所存储的,甚至想要与日志文件一一对应起来都不容易。不少数据看起来并没有什么意义,或者丢失了几周的,唯一有图表的数据都是与运维相关的。因为缺乏基础架构,甚至连最简单的查询,都似乎永远跑不完。&/p&&h1&每个人都很沮丧&/h1&&p&你的数据科学家,当然是希望把时间花在做机器学习的算法上,毕竟他们之前大部分的学习时间都在思考这些优雅的算法,以及发表论文。他们也知道,肯定需要花费一些额外的时间,来收集和清洗数据。但他们从来没有意料到会如此艰难,数据难以理解、杂乱、有缺失,甚至获取不到。他们也从来没有意料到他们要花如此多的时间来开会,或者在 Slack 上询问,数据是如何收集的,那些 json 数据中具体的含义是什么。他们也没有意料到整个公司似乎对于数据毫不关心,没有人意识到每一次的重构可能都会带来数据的改变,导致业务数据中月与月的比较发生不匹配。科学家们也没有意料到,从来不会有人,把用户点击时所看到的所有选择,而不仅仅是点击的那一项,都存入日志,更不用说点击时的 UI 设计,所以一整年的数据并不能直接当做模型的训练数据。&/p&&p&你招聘了一个数据科学家,期待他来做机器学习。他们已经被警告过需要花费80%的时间来清洗数据,但这个现在看起来也不太现实了,实际上,他们80%的时间都花在了乞求,乞求合适的数据可以被创建、获取、移动到合适的位置、或者获得解释。剩下20%的时间,都在游说公司的人员使用更加适合数据分析的工具,建立更适合数据获取的安全政策和软件基础架构,亦或者试着找一份新的工作。&/p&&p&你的工程师团队也很沮丧。他们不得不从他们正常工作的时间中抽出额外的时间,来协助坐在旁边的新来的科学家,完成大量吃力不讨好工作,并且认为这些数据科学家什么都没完成,却还不断地抱怨数据仍然不够好。&/p&&p&你,作为公司的创始人,更加沮丧。已经两个月了,这位数据科学家甚至连一个像样的数据表盘都没有做出来,更不用说大家都更期待更炫酷的机器学习了。并且,这些数据科学家们似乎也不太能够融进公司的文化中,还使得所有人的工作进展都慢了不少。内心深处,你已经开始觉得机器学习可能只是一种骗人的噱头,人工智能也只是一种毫无产出的短期狂热。&/p&&p&当然,你也只是在自己内心深处这么想一想。在面对你的客户和投资人时,你依然大谈特谈你的人工智能计划,以及你超级聪明的博士数据科学家正兴奋地做着炫酷的机器学习……&/p&&p&如果你想了解如何避免这样的情形,Quora 上有一个问题应该有所帮助:&a href=&http://link.zhihu.com/?target=https%3A//www.quora.com/What-are-the-challenges-of-building-a-data-team-at-a-startup& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What are the challenges of building a data team at a startup?&/a&&/p&&h2&一点感想&/h2&&p&文章写得非常现实,每一个中小型公司里的数据科学家,不论是做数据分析,还是机器学习建模,都需要面临大量的数据基础设施建设问题。格式良好、适合分析的数据不会从天而降,而需要与大量的部门合作,中间一定会经历大量的挫折,但基础设施的建设过程不可能省去,对于一个数据驱动的公司必须要跨过这个坑。&/p&&p&之前有个问题讨论 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Kaggle 的比赛在 Machine Learning 领域中属于什么地位?&/a& 我提到,事实上单做机器学习的实验本身,比如像 Kaggle 中的问题一样,已经是非常明确的任务了。但是为了达到这一步,还有大量的其他任务需要完成,而我们大量的时间其实都花在了完成其他那些琐碎的事情上。甚至为了让我们设计的功能能够上线,我们还需要反反复复组织活动给大家普及 AI 的知识,组织 Data Science Lunch 之类的活动,正如我在 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&做底层 AI 框架和做上层 AI 应用,哪个对自己的学术水平(或综合能力)促进更大?&/a& 中详细描述的。&/p&&p&互联网创业公司如何从零开始建立第一个专门负责数据的团队?会面临什么样的挑战?有哪些坑可以避免?有哪些是核心职能?哪些工具适合使用?需要招收什么样的人员?欢迎大家移步这个问题充分讨论:&a href=&https://www.zhihu.com/question/& class=&internal&&互联网创业公司如何建立数据团队? - 知乎&/a&&/p&&p&----&/p&&p&&a href=&http://www.zhihu.com/people/e0b5a47e282b0cc705bf& data-hash=&e0b5a47e282b0cc705bf& class=&member_mention& data-editable=&true& data-title=&@陈然& data-hovercard=&p$b$e0b5a47e282b0cc705bf&&@陈然&/a&
前两天读了一篇文章,讲一个创业公司招收第一位数据科学家的虚构故事,充满雷坑,让人读起来妙趣横生。在数据方面工作两年,感觉深有同感,因为原文是英文,在这里简单翻译,与大家分享。有能力的还是读原文:来自
&figure&&img src=&https://pic3.zhimg.com/v2-4aafe3db564ab134a8d86eb_b.jpg& data-rawwidth=&520& data-rawheight=&220& class=&origin_image zh-lightbox-thumb& width=&520& data-original=&https://pic3.zhimg.com/v2-4aafe3db564ab134a8d86eb_r.jpg&&&/figure&&h1&导语&br&&/h1&&blockquote&&p&做数据科学一般需要用到类似XGBOOST、TensorFlow之类的库,这些库在win下不是那么好安装的,但是很多人又需要它们,那怎么办呢,最简单的就是用docker的方式,不仅具备一个linux虚拟环境,还可以同时使用windows。&/p&&p&它其实是一个相当易用的软件,本文不教太多命令,因为我也不会,只会讲几个基本命令。本文就讲讲如何在win10下如何安装使用docker&/p&&/blockquote&&h2&一:docker是什么?&/h2&&p&docker是什么,官方说这叫容器,但确实难以理解,入门的把它理解为轻量级虚拟机就好&/p&&h2&二:为什么要用docker?&/h2&&ul&&li&&p&一些使用windows系统的用户在安装python库、tensorflow、xgboost等时经常遇到安装不了或者编译问题等&/p&&/li&&li&&p&不用研究如何安装linux,直接在win下获得linux环境,使用强大的linux shell&/p&&/li&&li&&p&解决python环境污染问题&/p&&/li&&li&&p&方便保持各种包及库为最新状态,从手动更新变成docker镜像市场更新&/p&&/li&&li&&p&方便结果复现,你只要指定相同的镜像版本,那么每一台机子运行环境都是一样的,不会出现把程序发给别人了,但是别人无法运行的问题。&/p&&/li&&/ul&&h2&三:docker 的简单入门教程&/h2&&h3&1. 下载安装docker&/h3&&p&首先当然是去官网下载啦,进入&a href=&https://link.zhihu.com/?target=http%3A//www.docker.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker&/a&,点击图上的图标,我们可以看出如果用win10那么你必须要安装专业版或者旗舰版,家庭版的win10只能悲剧去和win7一样安装就docker toolbox啦,这里就不展开讲了。默认你是win10专业版,如果你不是,那么你就变身吧……&figure&&img src=&https://pic3.zhimg.com/v2-771bdc7de5bd86bf9bab_b.jpg& data-rawheight=&893& data-rawwidth=&1690& class=&origin_image zh-lightbox-thumb& width=&1690& data-original=&https://pic3.zhimg.com/v2-771bdc7de5bd86bf9bab_r.jpg&&&/figure&&/p&&h3&2. 下载安装docker&/h3&&p&
这个一般就是不停的点下一步下一步,过…&/p&&p&
如果有提示,可能是需要你开启hyper-v或者进BIOS里开启虚拟化,跟着提示来走即可&/p&&h3&3. 启动docker&/h3&&p&&figure&&img src=&https://pic2.zhimg.com/v2-dc85c17ef22fbcc9ed03942a_b.jpg& data-rawheight=&137& data-rawwidth=&121& class=&content_image& width=&121&&&/figure&双击这个图标就运行起来了,右下角如图&figure&&img src=&https://pic1.zhimg.com/v2-7dd1b5ee58_b.jpg& data-rawheight=&64& data-rawwidth=&187& class=&content_image& width=&187&&&/figure&&/p&&h3&4. 拉取镜像&/h3&&p&
按win+r并输入cmd后回车,打开cmd后输入以下命令拉取kaggle官方制作的一个镜像,里面封装好了xgboost、anaconda、tensorflow等常用的库及软件,而且kaggle还会不断的更新,省的自己来update。docker市场还有各种镜像,比如mysql、ubuntu等,随你挑选。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker pull kaggle/python
&/code&&/pre&&/div&&p&要下载几个G,安心等吧,如果下不了那么就去&a href=&https://link.zhihu.com/?target=https%3A//www.daocloud.io/mirror%23accelerator-doc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&daocloud&/a& 注册个账号弄个加速吧。&br&&/p&&h3&5. 建立一个文件夹来交换文件&/h3&&p&
此处我们在D盘建立一个kaggle文件夹来与虚拟机交互文件,继续在cmd中输入下面的命令进入d盘,然后新建一个文件夹叫做kaggle&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cd /d d:
mkdir kaggle
&/code&&/pre&&/div&&p&那么我们的需要交互的文件夹的就钦定位“D:/kaggle”了,以后在linux中就可以直接访问win下的kaggle文件夹了&/p&&h3&6.修改docker设置&/h3&&p&在docker图标上右键,选择settings。在advanced中可以多分配一些资源给docker;在shared drives中选择D盘,点击apply,需要输入win10账号密码,等待docker重启完成。&figure&&img src=&https://pic3.zhimg.com/v2-ef1ee5ca759bb6_b.jpg& data-rawheight=&814& data-rawwidth=&1249& class=&origin_image zh-lightbox-thumb& width=&1249& data-original=&https://pic3.zhimg.com/v2-ef1ee5ca759bb6_r.jpg&&&/figure&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ef6ebe5f36_b.jpg& data-rawheight=&814& data-rawwidth=&1249& class=&origin_image zh-lightbox-thumb& width=&1249& data-original=&https://pic2.zhimg.com/v2-ef6ebe5f36_r.jpg&&&/figure&&h3&7. 运行镜像&/h3&&p&然后从镜像创建一个容器来运行,继续输入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run --name kaggle
-v D:/kaggle:/tmp/working/kaggle
-w=/tmp/working -p
-it kaggle/python
jupyter notebook --no-browser --ip=&0.0.0.0& --notebook-dir=/tmp/working
&/code&&/pre&&/div&&figure&&img src=&https://pic4.zhimg.com/v2-ab1a23dddebdb4dd5b745754fdf91f85_b.jpg& data-rawheight=&77& data-rawwidth=&1333& class=&origin_image zh-lightbox-thumb& width=&1333& data-original=&https://pic4.zhimg.com/v2-ab1a23dddebdb4dd5b745754fdf91f85_r.jpg&&&/figure&&p&运行后结果如图,如果没有报错就代表成功了。简单解释一下
—name kaggle 代表我们给它起名叫kaggle;同时指定一个交换目录,把win下的d:/kaggle 映射到linux下的/tmp/working/目录;端口号都设置为8888;-d 代表在后台运行
;jupyter notebook —no-browser 代表不用浏览器的方式运行notebook,因为我们用win10下的浏览器。&/p&&h3&8. 进入容器找到token&/h3&&p&现在notebook有一个安全验证,需要得到token才能使用,我们继续输入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker exec -it kaggle bash
&/code&&/pre&&/div&&p&这样就进入linux的bash了,你可以随意输入一些shell命令,比如apt,ls,pip等等,&/p&&p&此次我们输入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&jupyter notebook list
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-08dbe4d013c_b.jpg& data-rawheight=&107& data-rawwidth=&1108& class=&origin_image zh-lightbox-thumb& width=&1108& data-original=&https://pic3.zhimg.com/v2-08dbe4d013c_r.jpg&&&/figure&&p&将token= 后面的一串字符“512bc…..4ed0”复制出来,获取token后输入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&exit
&/code&&/pre&&/div&&p&退出bash&/p&&h3&9. 运行notebook&/h3&&p&这个时候可以使用jupyter notebook了,浏览器中输入地址&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&localhost:8888
&/code&&/pre&&/div&&p&访问的就是是docker里的notebook,黏贴我们刚才复制得到的token;接着新建一个notebook,然后测试一下导入库是否成功&/p&&figure&&img src=&https://pic1.zhimg.com/v2-6bb9be99ca689d492f648a_b.jpg& data-rawheight=&571& data-rawwidth=&852& class=&origin_image zh-lightbox-thumb& width=&852& data-original=&https://pic1.zhimg.com/v2-6bb9be99ca689d492f648a_r.jpg&&&/figure&&p&完美~~~&/p&&h3&10. 停止容器&/h3&&p&如果我们不用了,可以停止容器&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker stop kaggle
&/code&&/pre&&/div&&h3&11.重新启用容器&/h3&&p&我们如果要运行之前的容器只需输入&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker start kaggle
&/code&&/pre&&/div&&p&也就是只要第一次完成了,之后就只要11-12步骤就可以启用关闭容器了,是不是非常简单。&/p&&h3&12.更新docker(可选)&/h3&&p&如果kaggle更新了镜像,只需要&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker pull kaggle/python
&/code&&/pre&&/div&&p&就可以用到他们提供的最新包了,当然这样的话就需要重新执行8-10步骤了,并且用docker rmi xxx 来移除掉过时的镜像。&/p&&h2&PS&/h2&&p&1.在win10专业版 v1607+docker V1.13.1下测试通过&/p&&p&2.部分C盘较小的人,可以在第7步的advanced标签下修改存放镜像的位置&/p&&p&3.本文采用markdown here渲染完成,有点丑&/p&&p&4.建议用kitmateic来管理容器,非常直观漂亮&figure&&img src=&https://pic2.zhimg.com/v2-fdc7420aee147fdf89166_b.jpg& data-rawheight=&801& data-rawwidth=&1326& class=&origin_image zh-lightbox-thumb& width=&1326& data-original=&https://pic2.zhimg.com/v2-fdc7420aee147fdf89166_r.jpg&&&/figure&&/p&&br&
导语 做数据科学一般需要用到类似XGBOOST、TensorFlow之类的库,这些库在win下不是那么好安装的,但是很多人又需要它们,那怎么办呢,最简单的就是用docker的方式,不仅具备一个linux虚拟环境,还可以同时使用windows。它其实是一个相当易用的软件,本文不…
&figure&&img src=&https://pic1.zhimg.com/v2-cabb19feb7cd_b.jpg& data-rawwidth=&526& data-rawheight=&348& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&https://pic1.zhimg.com/v2-cabb19feb7cd_r.jpg&&&/figure&&p&听了这么多年民谣,我有一种感觉,就是很多歌都似曾相识,但是仔细一想,又哪一首都想不起来,为了搞清楚这群流浪在祖国大地的现代游吟诗人们都在唱些什么,我做了一些数据分析的工作。&/p&&p&我选取了大约30个覆盖从程序员,朋克,基佬到女权主义者,中国大妈,穆斯林的能够覆盖所有人群的民谣歌手和乐队,包括李志,夭十三,赵雷,宋冬野,周云蓬,逃跑计划等等,为了设立参照,我还取了一些其他风格的乐队,比如老一些的汪峰,窦唯,朴树和新一些的低苦艾,谢天笑,反光镜,草东等等。&/p&&h2&第一步:写爬虫&/h2&&p&我首先写了一个爬虫,它可以根据歌手或乐队的名字来自动抓取这个歌手的所有歌,为了保证平衡,我最多只抓取前50首歌,老实说,大多数歌手被人熟知的歌并不会超过这个数字。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-375b450e06ec49088a86f_b.jpg& data-rawwidth=&759& data-rawheight=&522& class=&origin_image zh-lightbox-thumb& width=&759& data-original=&https://pic4.zhimg.com/v2-375b450e06ec49088a86f_r.jpg&&&/figure&&br&&p&这样,我得到了小一百个装满歌词的文件,鼠标滑过就能感觉到从里面溢出来的文艺气息,我感觉一阵忧郁袭来,为了写接下来的代码,我吹掉了一瓶可乐。&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-6cce4e4fd20e1da7b26c61309deaaff1_b.jpg& data-rawwidth=&514& data-rawheight=&410& class=&origin_image zh-lightbox-thumb& width=&514& data-original=&https://pic2.zhimg.com/v2-6cce4e4fd20e1da7b26c61309deaaff1_r.jpg&&&/figure&&br&&p&接下来,我开始了对这些歌词(约42万字)的分析。&/p&&h2&第二步:情绪分析&/h2&&p&首先是情绪分析,通过对这些歌词的自然语言处理,我知道了不同歌手们吟唱的到底是开心还是不开心的事情:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-48afb5caae63ae5bfc6dbf_b.jpg& data-rawwidth=&758& data-rawheight=&311& class=&origin_image zh-lightbox-thumb& width=&758& data-original=&https://pic2.zhimg.com/v2-48afb5caae63ae5bfc6dbf_r.jpg&&&/figure&&br&&p&数值的分布比较平均,但大致可以看得出有三个分类,一类是特别开心的,例如郝云。但是我一开始也不太懂,为什么丢火车的情绪也这么高,后来听了几遍他们的歌,发现他们虽然唱腔惨兮兮的,但是歌词还是充满正能量的,丢火车乐队歌词中出现次数最多的三个词分别是「永远」「晚安」「倔强」,这些都是正面情绪的词。第二类则是比较忧伤的,以我们熟悉的逼哥为代表,他们的歌词中充斥着孤独,沉默,泪水等词语。虽不暴力,但是多少有一些黑暗。&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-e87dfd7d41_b.jpg& data-rawwidth=&522& data-rawheight=&203& class=&origin_image zh-lightbox-thumb& width=&522& data-original=&https://pic2.zhimg.com/v2-e87dfd7d41_r.jpg&&&/figure&&br&&p&第三类则以赵雷为代表,比较平静,就像一个朋友给你讲故事,不疾不徐,娓娓道来,里面也有开心,也有难过,但总体情绪趋于中值。这也许解释了为什么赵雷这么晚才火起来的原因——平淡的情绪较难快速给人以强烈的冲击。但无论如何,好的音乐总会被人们发掘。&/p&&p&基于某种趣味,我又分析了一下其他风格的音乐的情绪:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-465d4c1d874ee653ccba_b.jpg& data-rawwidth=&720& data-rawheight=&291& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic1.zhimg.com/v2-465d4c1d874ee653ccba_r.jpg&&&/figure&&br&&p&民谣的情绪很丰富,而摇滚的情绪则大多是负面的,人们说,没有愤怒就没有摇滚,这话至少在歌词的情绪上是正确的。&/p&&br&&p&民谣歌手最喜欢什么季节?通过对歌词的分析,这个问题也可以解决:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-1f8b821daa3ef4a5da12d1_b.jpg& data-rawwidth=&674& data-rawheight=&379& class=&origin_image zh-lightbox-thumb& width=&674& data-original=&https://pic1.zhimg.com/v2-1f8b821daa3ef4a5da12d1_r.jpg&&&/figure&&br&&p&其中,春天出现了81次,冬天出现了74次,夏天和秋天各出现了70和47次。由此可见,最受欢迎的是春天和冬天,最不受欢迎的是秋天。但我个人觉得秋天挺好的,秋高气爽,菜价便宜。&/p&&br&&p&同样的,我也分析了歌手们最喜欢的城市,结果如下:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b036f512fed2ced29aa8de307d229970_b.jpg& data-rawwidth=&676& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&676& data-original=&https://pic3.zhimg.com/v2-b036f512fed2ced29aa8de307d229970_r.jpg&&&/figure&&br&&p&可以看得出,北方城市完全战胜了南方城市,成了在歌词中被唱的最多的地方,特别是北京,一共出现了81次。说到一线城市,人们会说北上广深,但是在民谣的世界里,北京绝对是不可撼动的存在。南方城市只有成都勉强露了几个照面。作为一个成都人,我对此还挺高兴的。&/p&&br&&p&难以理解的是,虽然北方城市大获全胜,但是歌手们却更多的念叨着「南方」而不是「北方」,「南方」比「北方」多出现了大约5.7%&/p&&figure&&img src=&https://pic3.zhimg.com/v2-842aee01a4a5b8c3ab739c0b20751c58_b.jpg& data-rawwidth=&642& data-rawheight=&237& class=&origin_image zh-lightbox-thumb& width=&642& data-original=&https://pic3.zhimg.com/v2-842aee01a4a5b8c3ab739c0b20751c58_r.jpg&&&/figure&&br&&p&另一个我感兴趣的问题是,民谣歌手们是在向前看还是向后看,是往未来寄托希望,还是缅怀过去?&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-37a8acfd3e5_b.jpg& data-rawwidth=&671& data-rawheight=&326& class=&origin_image zh-lightbox-thumb& width=&671& data-original=&https://pic1.zhimg.com/v2-37a8acfd3e5_r.jpg&&&/figure&&br&&br&&p&看得出,民谣歌手是在往前看的,至少是活在当下的,「明天」这个词在歌词中出现的次数最多,接着是「今天」和「昨天」,而「前天」和「后天」则几乎可以忽略不计,这也是可以理解的,比如说「我拿青春赌明天」,这听上去很美好,如果要说「我拿青春赌后天」乃至于「我拿青春赌下个月5号」,这听上去就像一个赌徒发疯了。&/p&&p&在我的统计中,出现最多的几个意象是:再见,姑娘,夜空,孤独,快乐。&/p&&p&如果把民谣拟人化,那应该是一个喜欢南方的北京小伙子,觉得世界很操蛋,但骂归骂,到底是对生活有希望的,憧憬着明天,在春天感到快乐,在冬天感到孤独,没有女朋友,但有几个纠缠不清的前女友,经常和她们见面,见面的地方可能是成都,昆明,南京,上海,武汉。。。。。&/p&&p&最后推荐一下我珍藏多年的汽缸汪汪乐队,虽然他们只出了半首歌,但依然非常不错。哈哈。&/p&&p&-------------------------------------------------&/p&&p&喜欢好的就关注,持续更新。&/p&&p&作者:超级王登科&br&&/p&&p&个人公众号:「超级王登科」(ID:superwdk)&br&&/p&&p&出处:&a href=&https://link.zhihu.com/?target=https%3A//ask.hellobi.com/blog/spuerwdk& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&超级王登科博客专栏&/a&&/p&&p&&b&最近很多人私信问我问题,平常知乎评论看到不多,如果没有及时回复,大家也可以加小编微信:tszhihu,进知乎大数据分析挖掘交流群,可以跟各位老师互相交流。谢谢。&/b&&/p&
听了这么多年民谣,我有一种感觉,就是很多歌都似曾相识,但是仔细一想,又哪一首都想不起来,为了搞清楚这群流浪在祖国大地的现代游吟诗人们都在唱些什么,我做了一些数据分析的工作。我选取了大约30个覆盖从程序员,朋克,基佬到女权主义者,中国大妈,穆…
&figure&&img src=&https://pic3.zhimg.com/v2-1e89c0a4b5d6d36eece7_b.jpg& data-rawwidth=&1024& data-rawheight=&582& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic3.zhimg.com/v2-1e89c0a4b5d6d36eece7_r.jpg&&&/figure&&p&作者介绍&br&&/p&&br&&p&七夜,Python中文社区专栏作者,信息安全研究人员,比较擅长网络安全、逆向工程、Python爬虫开发、Python Web开发。&br&&/p&&ul&&li&博客园:&a href=&http://link.zhihu.com/?target=http%3A//cnblogs.com/qiyeboy/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cnblogs.com/qiyeboy/&/span&&span class=&invisible&&&/span&&/a&&/li&&li&CSDN:&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/qiye_/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/qiye_/&/span&&span class=&invisible&&&/span&&/a&&br&&/li&&li&Github:&a href=&http://link.zhihu.com/?target=https%3A//github.com/qiyeboy/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/qiyeboy/&/span&&span class=&invisible&&&/span&&/a&&br&&/li&&li&知乎ID:七夜&/li&&/ul&&h2&开源IP代理池&/h2&&p&继上一篇&a href=&https://zhuanlan.zhihu.com/p/?refer=zimei& class=&internal&&突破反爬虫的利器——开源IP代理池&/a&之后,大家在github,我的公众号和博客上提出了很多建议。经过两周时间的努力,基本完成了开源IP代理池IPProxyPool的重构任务,业余时间基本上都花在上面了。&/p&&p&IPProxyPool相对于之前的版本完成了哪些提升呢?主要包括一下几个方面:&br&&/p&&ol&&li&使用多进程+协程的方式,将爬取和验证的效率提高了50倍以上,可以在几分钟之内获取所有的有效IP &br&&/li&&li&使用web.py作为API服务器,重构HTTP接口 &br&&/li&&li&增加Mysql,MongoDB等数据库的适配 &br&&/li&&li&支持python3 &br&&/li&&li&增加了三个代理网站 &br&&/li&&li&增加评分机制,评比稳定的ip &br&&/li&&/ol&&p&大家如果感兴趣,可以到github上clone &a href=&http://link.zhihu.com/?target=https%3A//github.com/qiyeboy/IPProxyPool& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IPProxyPool源码&/a&,已经503 star了。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-e882d36ee19b3a9cb7e3fc_b.jpg& data-rawwidth=&999& data-rawheight=&515& class=&origin_image zh-lightbox-thumb& width=&999& data-original=&https://pic3.zhimg.com/v2-e882d36ee19b3a9cb7e3fc_r.jpg&&&/figure&下面说明一下使用方法:&/p&&h2&项目依赖&/h2&&h4&Ubuntu,debian&/h4&&p&&br&1.安装sqlite数据库(一般系统内置): apt-get install sqlite3 &br&2.安装requests,chardet,web.py,gevent: pip install requests chardet web.py sqlalchemy gevent &br&3.安装lxml: apt-get install python-lxml &br&注意:&/p&&ul&&li&python3下的是pip3&/li&&li&有时候使用的gevent版本过低会出现自动退出情况,请使用pip install gevent --upgrade更新)&/li&&li&在python3中安装web.py,不能使用pip,直接下载py3版本的&a href=&http://link.zhihu.com/?target=https%3A//codeload.github.com/webpy/webpy/zip/py3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&源码&/a&进行安装&/li&&/ul&&h4&Windows&/h4&&p&1.下载&a href=&http://link.zhihu.com/?target=http%3A//www.sqlite.org/download.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&sqlite&/a&,路径添加到环境变量 &br&2.安装requests,chardet,web.py,gevent: pip install requests chardet web.py sqlalchemy gevent &br&3.安装lxml: pip install lxml或者下载&a href=&http://link.zhihu.com/?target=https%3A//pypi.python.org/pypi/lxml/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&lxml windows版&/a&&br&注意:&/p&&ul&&li&python3下的是pip3&/li&&li&有时候使用的gevent版本过低会出现自动退出情况,请使用pip install gevent --upgrade更新)&/li&&li&在python3中安装web.py,不能使用pip,直接下载py3版本的&a href=&http://link.zhihu.com/?target=https%3A//codeload.github.com/webpy/webpy/zip/py3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&源码&/a&进行安装&/li&&/ul&&h4&扩展说明&/h4&&p&本项目默认数据库是sqlite,但是采用sqlalchemy的ORM模型,通过预留接口可以拓展使用MySQL,MongoDB等数据库。 配置方法: &br&1.MySQL配置&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&第一步:首先安装MySQL数据库并启动
第二步:安装MySQLdb或者pymysql(推荐)
第三步:在config.py文件中配置DB_CONFIG。如果安装的是MySQLdb模块,配置如下:
DB_CONFIG={
'DB_CONNECT_TYPE':'sqlalchemy',
'DB_CONNECT_STRING' = 'mysql+mysqldb://root:root@localhost/proxy?charset=utf8'
如果安装的是pymysql模块,配置如下:
DB_CONFIG={
'DB_CONNECT_TYPE':'sqlalchemy',
'DB_CONNECT_STRING' = 'mysql+pymysql://root:root@localhost/proxy?charset=utf8'
&/code&&/pre&&/div&&p&sqlalchemy下的DB_CONNECT_STRING参考&a href=&http://link.zhihu.com/?target=http%3A//docs.sqlalchemy.org/en/latest/core/engines.html%23supported-databases& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&支持数据库&/a&,理论上使用这种配置方式不只是适配MySQL,sqlalchemy支持的数据库都可以,但是仅仅测试过MySQL。 &br&2.MongoDB配置&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&第一步:首先安装MongoDB数据库并启动
第二步:安装pymongo模块
第三步:在config.py文件中配置DB_CONFIG。配置类似如下:
DB_CONFIG={
'DB_CONNECT_TYPE':'pymongo',
'DB_CONNECT_STRING' = 'mongodb://localhost:27017/'
&/code&&/pre&&/div&&p&由于sqlalchemy并不支持MongoDB,因此额外添加了pymongo模式,DB_CONNECT_STRING参考pymongo的连接字符串。&/p&注意&p&如果大家想拓展其他数据库,可以直接继承db下ISqlHelper类,实现其中的方法,具体实现参考我的代码,然后在DataStore中导入类即可。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&try:
if DB_CONFIG['DB_CONNECT_TYPE'] == 'pymongo':
from db.MongoHelper import MongoHelper as SqlHelper
from db.SqlHelper import SqlHelper as SqlHelper
sqlhelper = SqlHelper()
sqlhelper.init_db()
except Exception,e:
raise Con_DB_Fail
&/code&&/pre&&/div&&p&有感兴趣的朋友,可以将Redis的实现方式添加进来。&/p&&h2&如何使用&/h2&&p&将项目目录clone到当前文件夹&/p&&p&$ git clone&/p&&p&切换工程目录&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&$ cd IPProxyPool
$ cd IPProxyPool_py2 或者 cd IPProxyPool_py3
&/code&&/pre&&/div&&p&运行脚本&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&python IPProxy.py
&/code&&/pre&&/div&&p&成功运行后,打印信息&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&IPProxyPool-----&&&&&&&&beginning
http://0.0.0.0:8000/
IPProxyPool-----&&&&&&&&db exists ip:0
IPProxyPool-----&&&&&&&&now ip num & MINNUM,start crawling...
IPProxyPool-----&&&&&&&&Success ip num :134,Fail ip num:7882
&/code&&/pre&&/div&&h2&API 使用方法&/h2&&h4&第一种模式&/h4&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&GET /
&/code&&/pre&&/div&&p&这种模式用于查询代理ip数据,同时加入评分机制,返回数据的顺序是按照评分由高到低,速度由快到慢制定的。&/p&&h4&参数&/h4&&figure&&img src=&https://pic1.zhimg.com/v2-034fa64ec4c95ce25b14aa_b.jpg& data-rawwidth=&319& data-rawheight=&232& class=&content_image& width=&319&&&/figure&&h4&例子&/h4&IPProxys默认端口为8000,端口可以在config.py中配置。如果是在本机上测试:&p&1.获取5个ip地址在中国的高匿代理:&a href=&http://link.zhihu.com/?target=http%3A//127.0.0.1%3A8000/%3Ftypes%3D0%26count%3D5%26country%3D%25E4%25B8%25AD%25E5%259B%25BD& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://127.0.0.1:8000/?types=0&count=5&country=中国&/a&&br&2.响应为JSON格式,按照评分由高到低,响应速度由高到低的顺序,返回数据: &br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[[&122.226.189.55&, 138, 10], [&183.61.236.54&, 3128, 10], [&61.132.241.109&, 808, 10], [&183.61.236.53&, 3128, 10], [&122.227.246.102&, 808, 10]]
&/code&&/pre&&/div&&p&&br&以[&122.226.189.55&, 138, 10]为例,第一个元素是ip,第二个元素是port,第三个元素是分值score。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import requests
import json
r = requests.get('http://127.0.0.1:8000/?types=0&count=5&country=中国')
ip_ports = json.loads(r.text)
print ip_ports
ip = ip_ports[0][0]
port = ip_ports[0][1]
'http':'http://%s:%s'%(ip,port),
'https':'http://%s:%s'%(ip,port)
r = requests.get('http://ip.chinaz.com/',proxies=proxies)
r.encoding='utf-8'
print r.text
&/code&&/pre&&/div&&h4&第二种模式&/h4&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&GET /delete
&/code&&/pre&&/div&&p&这种模式用于方便用户根据自己的需求删除代理ip数据&/p&&h4&参数&/h4&&figure&&img src=&https://pic2.zhimg.com/v2-34ed78f18d_b.jpg& data-rawwidth=&317& data-rawheight=&307& class=&content_image& width=&317&&&/figure&&p&大家可以根据指定以上一种或几种方式删除数据。&/p&&h4&例子&/h4&如果是在本机上测试:&p&1.删除ip为120.92.3.127的代理:&a href=&http://link.zhihu.com/?target=http%3A//127.0.0.1%3A8000/delete%3Fip%3D120.92.3.127& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&127.0.0.1:8000/delete?&/span&&span class=&invisible&&ip=120.92.3.127&/span&&span class=&ellipsis&&&/span&&/a&&br&2.响应为JSON格式,返回删除的结果为成功,失败或者返回删除的个数,类似如下的效果:&/p&&p&[&deleteNum&, &ok&]或者[&deleteNum&, 1]&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&requests&/span&
&span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&requests&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s1&&'http://127.0.0.1:8000/delete?ip=120.92.3.127'&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span& &span class=&n&&r&/span&&span class=&o&&.&/span&&span class=&n&&text&/span&
&/code&&/pre&&/div&&p&以上就是重构后的IPProxyPool,两周的辛苦没有白费,当然还有不足,之后会陆续添加智能选择代理的功能。&/p&
作者介绍 七夜,Python中文社区专栏作者,信息安全研究人员,比较擅长网络安全、逆向工程、Python爬虫开发、Python Web开发。 博客园:CSDN: Github: 知乎ID:七夜开源IP…
&figure&&img src=&https://pic1.zhimg.com/v2-9577a7cfc8b41732d4bbee0ece92421a_b.jpg& data-rawwidth=&492& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&492& data-original=&https://pic1.zhimg.com/v2-9577a7cfc8b41732d4bbee0ece92421a_r.jpg&&&/figure&&h2&先附上地址:&/h2&&p&在线地址: &a href=&https://link.zhihu.com/?target=http%3A//fiora.suisuijiang.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&fiora.suisuijiang.com&/a&&/p&&p&源码地址: &a href=&https://link.zhihu.com/?target=https%3A//github.com/yinxin630/fiora& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&github.com/yinxin630/fiora&/a&&/p&&p&(注: 请使用pc端现代浏览器访问, 移动端版本只测试chrome和safari能用, )&br&&/p&&h2&大致的技术栈:&/h2&&p&后端使用 koa 提供一个简易的 http 服务器, 并将所有路由定位到入口 index.html 处理. 使用 &a href=&https://link.zhihu.com/?target=http%3A//socket.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&socket.io&/a& 前后端通讯, 后端 API 采用类似 Restful 风格的自定义格式接口, 数据库是 MongoDB, 使用 bluebird 和 generator 处理异步, 用户认证采用 jwt token 的方式.&/p&&p&前端基于 react 框架, 资源大部分在 cdn 上(背景图打包进了 js 里), 使用 immutable 和 redux 处理数据, react-router 提供路由, 未使用第三方 UI 库, 页面样式均使用 sass 编写.&/p&&h2&功能:&/h2&&ul&&li&创建用户, 创建群组, 加入群组, 私聊, 群聊&/li&&li&文本, 图片(粘贴发送), 代码, url 等多种类型消息, 还有炸弹 /系统消息 / 翔 / 精灵球等多种恶搞消息&/li&&li&消息桌面通知, 声音提醒, 通知开关&/li&&li&用户信息修改, 头像修改, 表情收藏, 群公告修改&/li&&li&消息内容过滤, 消息长度限制, 消息发送频率限制&/li&&li&提供第三方消息的实现接口, 使用中间件系统修改原消息体, 针对消息体自定义渲染逻辑, 恶搞消息即依此实现&/li&&/ul&&h2&截图:&/h2&&figure&&img src=&https://pic4.zhimg.com/v2-1ef414ee_b.jpg& data-rawwidth=&1022& data-rawheight=&787& class=&origin_image zh-lightbox-thumb& width=&1022& data-original=&https://pic4.zhimg.com/v2-1ef414ee_r.jpg&&&/figure&&h2&关于Fiora的前世今生:&/h2&&p&这个项目是我一直坚持在做的, 现在这版是重写的第三版. 查看下commit历史, 第一版创建于15年11月4号, 距今一年过去了. 当时我刚开始学习html, css, js以及node, 就想着写个什么小玩意来练练手, 觉得聊天室是一个很容易让自己和用户参与进来的东西, 于是决定搞个小聊天室玩玩.&/p&&p&最初的时候, 我使用简单的html和css构建了界面, 使用jquery来处理dom事件和页面交互, 并使用node + &a href=&https://link.zhihu.com/?target=http%3A//socket.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&socket.io&/span&&span class=&invisible&&&/span&&/a&来搞定后端通讯. 程序跑了起来并且能用, 但是所有js代码都堆积在一个文件内了, 包括dom事件, 页面逻辑以及后端交互部分, 并且当时react框架十分热门, 我也抽时间学习了一下, 用react重构了项目, 仅仅使用了react, 没有redux, 没有react-router, 甚至没有webpack. 于是自然而然的, 我碰到了一些坑, 我去查询react的相关内容, 了解到redux等工具能解决我的痛点, 于是把这些工具库学习了一下, 并且决定重写这个项目.&/p&&p&日我开启了第二版的新坑, 这次我分割了项目把前后端分别创建了一个仓库. 前端继续使用react栈, 加上redux, webpack等库, 重写设计了UI页面, 并使用了AmuzeUI React的组件(后续换成了阿里的antd), 后端使用了sails框架(实习公司用的这个), 因为它封装了&a href=&https://link.zhihu.com/?target=http%3A//socket.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&socket.io&/span&&span class=&invisible&&&/span&&/a&并且具备实用的数据库操作. 在这个基础上, 我渐渐的拓展着功能, 因为公司(换了一家实习)把前端切换到react技术栈, 我对react的使用越来越熟练, 深入, 了解了react的最佳实践. 由于技术栈上, 功能上, UI上, 代码结构上等各种各样的问题, 我于是决定把项目再重写一遍.&/p&&p&7月31号, 我又一次重开了坑.. 这次合并了前后端放在同一仓库, 并且mobile web和react-native app端也都放了进去, 以便直接复用除UI部分的代码. 重新设计了UI, 去掉了第三方组件, 全部自己来写, css方面改用sass, 前端除了原来的react, redux, react-router, webpack, 又加上了immutable, 用上了es7的装饰器语法, 加上了pureRender优化. 后端换用koa框架, 结合sockt.io, 用jwt token做了用户验证, 乱七八糟的一大堆东西, 就不一一细谈了.&/p&&p&这一年来, 我从不会html成长为一个合格的小前端, 收获颇丰, 没有了刚开始实习时候的迷茫(最初做的java实习). 关于这个项目有什么想聊的, 欢迎进来交流哦.
&/p&&p&感谢&a href=&https://www.zhihu.com/people/0777aab9ca26e85e98be10& data-hash=&0777aab9ca26e85e98be10& class=&member_mention& data-title=&@blackmiaool& data-editable=&true& data-hovercard=&p$b$0777aab9ca26e85e98be10&&@blackmiaool&/a&为fiora提交的代码, 顺便推荐下他的图片爆炸效果jq插件(&a href=&https://link.zhihu.com/?target=https%3A//github.com/blackmiaool/jquery-image-explode& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/blackmiaool/&/span&&span class=&invisible&&jquery-image-explode&/span&&span class=&ellipsis&&&/span&&/a&)&/p&
先附上地址:在线地址: 源码地址: (注: 请使用pc端现代浏览器访问, 移动端版本只测试chrome和safari能用, ) 大致的技术栈:后端使用 koa 提供一个简易的 http 服务器, 并将所有路由定位到入口 index.html 处…
&p&本文已发表在《程序员》杂志2016年10月期。&/p&&p&如果在使用App时遇到闪退,你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼,因为崩溃可能意味着用户流失、营收下滑。为了降低崩溃率,进而提升App质量,App开发团队需要实时地监控App异常。一旦发现严重问题,及时进行热修复,从而把损失降到最低。App异常监控平台,就是将这个方法服务化。&/p&&h2&低成本&/h2&&p&小型创业团队一般会选择第三方平台提供的异常监控服务。但中型以上规模的团队,往往会因为不想把核心数据共享给第三方平台,而选择独立开发。造轮子,首先要考虑的就是成本问题。我们选择了站在开源巨人的肩膀上,如图1所示。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-541a0a724f8b43aba988cc_b.jpg& data-rawwidth=&800& data-rawheight=&106& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-541a0a724f8b43aba988cc_r.jpg&&&/figure&&br&&h4&Spark Streaming&/h4&&p&每天来自客户端和服务器的大量异常信息,会源源不断的上报到异常平台的Kafka中,因此我们面临的是一个大规模流式数据处理问题。美团点评数据平台提供了Storm和Spark Streaming两种流式计算解决方案。我们主要考虑到团队之前在Spark批处理方面有较多积累,使用Spark Streaming成本较低,就选择了后者。&/p&&h4&Elasticsearch&/h4&&p&Elasticsearch(后文简称ES),是一个开源搜索引擎。不过在监控平台中,我们是当做“数据库”来使用的。为了降低展示层的接入成本,我们还使用了另一个开源项目ES SQL提供类SQL查询。ES的运维成本,相对 SQL on HBase方案也要低很多。整个项目开发只用了不到700行代码,开发维护成本还是非常低的。那如此“简单”的系统,可用性可以保证吗?&/p&&h2&高可用&/h2&&p&Spark Streaming + Kafka的组合,提供了“Exactly Once”保证:异常数据经过流式处理后,保证结果数据中(注:并不能保证处理过程中),每条异常最多出现一次,且最少出现一次。保证Exactly Once是实现24/7的高可用服务最困难的地方。在实际生产中会出现很多情况,对Exactly Once的保证提出挑战:&/p&&h4&异常重启&/h4&&p&Spark提供了Checkpoint功能,可以让程序再次启动时,从上一次异常退出的位置,重新开始计算。这就保证了即使发生异常情况,也可以实现每条数据至少写一次HDFS。再覆写相同的HDFS文件就保证了Exactly Once(注:并不是所有业务场景都允许覆写)。写ES的结果也一样可以保证Exactly Once。你可以把ES的索引,就当成HDFS文件一样来用:新建、删除、移动、覆写。&br&作为一个24/7运行的程序,在实际生产中,异常是很常见的,需要有这样的容错机制。但是否遇到所有异常,都要立刻挂掉再重启呢?显然不是,甚至在一些场景下,你即使重启了,还是会继续挂掉。我们的解决思路是:尽可能把异常包住,让异常发生时,暂时不影响服务。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fa91f0edf_b.jpg& data-rawwidth=&434& data-rawheight=&239& class=&origin_image zh-lightbox-thumb& width=&434& data-original=&https://pic4.zhimg.com/v2-fa91f0edf_r.jpg&&&/figure&&p&如图2所示,包住异常,并不意味可以忽略它,必须把异常收集到Spark Driver端,接入监控(报警)系统,人工判断问题的严重性,确定修复的优先级。&br&为了更好地掌控Spark Streaming服务的状态,我们还单独开发了一个作业调度(重启)工具。美团点评数据平台安全认证的有效期是7天,一般离线的批处理作业很少会运行超过这个时间,但Spark Streaming作业就不同了,它需要一直保持运行,所以作业只要超过7天就会出现异常。因为没有找到优雅的解决方案,只好粗暴地利用调度工具,每周重启刷新安全认证,来保证服务的稳定。&/p&&h4&升级重导&/h4&&p&Spark提供了2种读取Kafka的模式:“Receiver-based Approach”和“Direct Approach”。使用Receiver模式,在极端情况下会出现Receiver OOM问题。&br&使用Direct模式可以避免这个问题。我们使用的就是这种Low-level模式,但在一些情况下需要我们自己维护Kafka Offset:&br&升级代码:开启Checkpoint后,如果想改动代码,需要清空之前的Checkpoint目录后再启动,否则改动可能不会生效。但当这样做了之后,就会发现另一个问题——程序“忘记”上次读到了哪个位置,因为存储在Checkpoint中的Offset信息也一同被清空了。这种情况下,需要自己用ZooKeeper维护Kafka的Offset。&br&重导数据:重导数据的场景也是,当希望从之前的某一个时间点开始重新开始计算的时候,显然也需要自己维护时间和Offset的映射关系。&br&自己维护Offset的成本并不高,所以看起来Checkpoint功能很鸡肋。其实可以有一些特殊用法的,例如,因为Python不需要编译,所以如果使用的是PySpark,可以把主要业务逻辑写在提交脚本的外边,再使用Import调用。这样升级主要业务逻辑代码时,只要重启一下程序即可。网上有不少团队分享过升级代码的“黑科技”,这里不再展开。&br&实现24/7监控服务,我们不仅要解决纯稳定性问题,还要解决延迟问题。&/p&&h2&低延迟&/h2&&p&App异常监控,需要保证数据延迟在分钟级。&br&虽然Spark Streaming有着强大的分布式计算能力,但要满足用户角度的低延迟,可不是单纯的能计算完这么简单。&/p&&h4&输入问题&/h4&&p&iOS App崩溃时,会生成Crash Log,但其内容是一堆十六进制的内存地址,对开发者来说就是“天书”。只有经过“符号化”的Crash Log,开发者才能看懂。因为符号化需要在Mac环境下进行,而我们的Mac集群资源有限,不能符号化全部Crash Log。即使做了去重等优化,符号化后的数据流还是有延迟。每条异常信息中,包含N维数据,如果不做符号化只能拿到其中的M维。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a66d96c5aa5a22fe7313237_b.jpg& data-rawwidth=&801& data-rawheight=&421& class=&origin_image zh-lightbox-thumb& width=&801& data-original=&https://pic2.zhimg.com/v2-a66d96c5aa5a22fe7313237_r.jpg&&&/figure&&p&如图3所示,我们将数据源分为符号化数据流、未符号化数据流,可以看出两个数据流的相对延迟时间T较稳定。如果直接使用符号化后的数据流,那么全部N维数据都会延迟时间T。为了降低用户角度的延迟,我们根据经验加大了时间窗口:先存储未符号化的M维数据,等到拿到对应的符号化数据后,再覆写全部N维数据,这样就只有N-M维数据延迟时间T了。&/p&&h4&输出问题&/h4&&p&如果Spark Streaming计算结果只是写入HDFS,很难遇到什么性能问题。但你如果想写入ES,问题就来了。因为ES的写入速度大概是每秒1万行,只靠增加Spark Streaming的计算能力,很难突破这个瓶颈。&br&异常数据源的特点是数据量的波峰波谷相差巨大。由于我们使用了 Direct 模式,不会因为数据量暴涨而挂掉,但这样的“稳定”从用户角度看没有任何意义:短时间内,数据延迟会越来越大,暴增后新出现的异常无法及时报出来。为了解决这个问题,我们制定了一套服务降级方案。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-5ec3d330c92dd51747e6_b.jpg& data-rawwidth=&783& data-rawheight=&305& class=&origin_image zh-lightbox-thumb& width=&783& data-original=&https://pic3.zhimg.com/v2-5ec3d330c92dd51747e6_r.jpg&&&/figure&&p&如图4所示,我们根据写ES的实际瓶颈K,对每个周期处理的全部数据N使用水塘抽样(比例K/N),保证始终不超过瓶颈。并在空闲时刻使用Spark批处理,将N-K部分从HDFS补写到ES。既然写ES这么慢,那我们为什么还要用ES呢?&/p&&h2&高性能&/h2&&p&开发者需要在监控平台上分析异常。实际分析场景可以抽象描述为:“实时 秒级 明细 聚合” 数据查询。&br&我们团队在使用的OLAP解决方案可以分为4种,它们各有各的优势:&/p&&ul&&li&SQL on HBase方案,例如:Phoenix、Kylin。我们团队从2015年Q1开始,陆续在SEM、SEO生产环境中使用Phoenix、Kylin至今。Phoenix算是一个“全能选手”,但更适合业务模式较固定的场景;Kylin是一个很不错的OLAP产品,但它的问题是不能很好支持实时查询和明细查询,因为它需要离线预聚合。另外,基于其他NoSQL的方案,基本大同小异,如果选择HBase,建议团队在HBase运维方面有一定积累。&/li&&li&SQL on HDFS方案,例如:Presto、Spark SQL。这两个产品,因为只能做到亚秒级查询,我们平时多用在数据挖掘的场景中。&/li&&li&时序数据库方案,例如:Druid、OpenTSDB。OpenTSDB是我们旧版App异常监控系统使用过的方案,更适合做系统指标监控。&/li&&li&搜索引擎方案,代表项目有ES。相对上面的3种方案,基于倒排索引的ES非常适合异常分析的场景,可以满足:实时、秒级、明细、聚合,全部4种需求。&/li&&/ul&&p&ES在实际使用中的表现如何呢?&/p&&h4&明细查询&/h4&&p&支持明显查询,算是ES的主要特色,但因为是基于倒排索引的,明细查询的结果最多只能取到10000条。在异常分析中,使用明细查询的场景,其实就是追查异常Case,根据条件返回前100条就能满足需求了。例如:已知某设备出现了Crash,直接搜索这个设备的DeviceId就可以看到这个设备最近的异常数据。我们在生产环境中做到了95%的明细查询场景1秒内返回。&/p&&h4&聚合查询&/h4&&p&面对爆炸的异常信息,一味追求全是不现实,也是没必要的。开发者需要能快速发现关键问题。&br&因此平台需要支持多维度聚合查询,例如按模块版本机型城市等分类聚合,如图5所示。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b08ba471cca9ce1a0aad10f_b.jpg& data-rawwidth=&793& data-rawheight=&391& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&https://pic1.zhimg.com/v2-b08ba471cca9ce1a0aad10f_r.jpg&&&/figure&&p&不用做优化,ES聚合查询的性能就已经可以满足需求。因此,我们只做了一些小的使用改进,例如:很多异常数据在各个维度的值都是相同的,做预聚合可以提高一些场景下的查询速度。开发者更关心最近48小时发生的异常,分离冷热数据,自动清理历史数据也有助于提升性能。最终在生产环境中,做到了90%的聚合查询场景1秒内返回。&/p&&h2&可扩展&/h2&&p&异常平台不止要监控App Crash,还要监控服务端的异常、性能等。不同业务的数据维度是不同的,相同业务的数据维度也会不断的变化,如果每次新增业务或维度都需要修改代码,那整套系统的升级维护成本就会很高。&/p&&h4&维度&/h4&&p&为了增强平台的可扩展性,我们做了全平台联动的动态维度扩展:如果App开发人员在日志中新增了一个“城市”维度,那么他不需要联系监控平台做项目排期,立刻就可以在平台中查询“城市”维度的聚合数据。只需要制定好数据收集、数据处理、数据展示之间的交互协议,做到动态维度扩展就很轻松了。需要注意的是,ES中需要聚合的维度,Index要设置为“not_analyzed”。&br&想要支持动态字段扩展,还要使用动态模板,样例如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&{
&mappings&: {
&es_type_name&: {
&dynamic_templates&: [
&template_1&: {
&match&: &*log*&,
&match_mapping_type&: &string&,
&mapping&: {
&type&: &string&
&template_2&: {
&match&: &*&,
&match_mapping_type&: &string&,
&mapping&: {
&type&: &string&,
&index&: &not_analyzed&
&/code&&/pre&&/div&&h4&资源&/h4&&p&美团点评数据平台提供了Kafka、Spark、ES的集群,整套技术栈在资源上也是分布式可扩展的。&br&线上集群使用的版本:&/p&&ul&&li&kafka-0.8.2.0&/li&&li&spark-1.5.2&/li&&li&elasticsearch-2.1.1&/li&&/ul&&br&&p&&strong&不想错过技术博客更新?想给文章评论、和作者互动?第一时间获取技术沙龙信息?&/strong&&/p&&p&&strong&请关注我们的官方微信公众号“美团点评技术团队”。&/strong&&/p&
本文已发表在《程序员》杂志2016年10月期。如果在使用App时遇到闪退,你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼,因为崩溃可能意味着用户流失、营收下滑。为了降低崩溃率,进而提升App质量,App开发团队需要实时…
&p&前阵子在自学Python,可是平常用不到的话语法什么的就好容易忘啊,一个劲的print又没多大成就感,于是了解了requests、bs4、openpyxl、Scrapy...这些python库,对拉勾网上面的职位信息进行爬取。&/p&&p&&b&这是部分职位.....&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/1e04bae8dd4af74e290a3f8ed2a1e7f2_b.png& data-rawwidth=&423& data-rawheight=&577& class=&origin_image zh-lightbox-thumb& width=&423& data-original=&https://pic3.zhimg.com/1e04bae8dd4af74e290a3f8ed2a1e7f2_r.png&&&/figure&&br&&br&&p&&b&这是爬下来的数据...&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/aec060b314b7fc48f84aaba_b.png& data-rawwidth=&882& data-rawheight=&588& class=&origin_image zh-lightbox-thumb& width=&882& data-original=&https://pic3.zhimg.com/aec060b314b7fc48f84aaba_r.png&&&/figure&&br&&br&&br&&figure&&img src=&https://pic1.zhimg.com/e85d6efa6d85e68f926958_b.png& data-rawwidth=&668& data-rawheight=&617& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&https://pic1.zhimg.com/e85d6efa6d85e68f926958_r.png&&&/figure&&br&&br&&p&&b&这是生成的Excel...&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/315a112d9cdedd654925_b.png& data-rawwidth=&631& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&https://pic2.zhimg.com/315a112d9cdedd654925_r.png&&&/figure&&br&&br&&figure&&img src=&https://pic1.zhimg.com/f6c8cd8e809b39fffd570_b.png& data-rawwidth=&1361& data-rawheight=&517& class=&origin_image zh-lightbox-thumb& width=&1361& data-original=&https://pic1.zhimg.com/f6c8cd8e809b39fffd570_r.png&&&/figure&&br&&p&&b&前方是数据分析报告,多图预警!!
-------------------------------------------------------start--------------------------------------------------------&/b&&/p&&br&&figure&&img src=&https://pic2.zhimg.com/a0c42bc6bd7c305c85821_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/a0c42bc6bd7c305c85821_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/a3eae5e02d03a84f450bd03cac5bade2_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/a3eae5e02d03a84f450bd03cac5bade2_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/0f4d1a5a864d40c9c9c8_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/0f4d1a5a864d40c9c9c8_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/fef9c270ea_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/fef9c270ea_r.jpg&&&/figure&&br&&figure&&img src=&https://pic2.zhimg.com/ac283be5_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/ac283be5_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/f89ca5a008f8ad84a1ac2_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/f89ca5a008f8ad84a1ac2_r.jpg&&&/figure&&br&&figure&&img src=&https://pic2.zhimg.com/e3bf0ca75b050db4efe65_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/e3bf0ca75b050db4efe65_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/a02aa7fb8366_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/a02aa7fb8366_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/85b930c6aff823a3b8ee_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/85b930c6aff823a3b8ee_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/9c2e99674bcb59e0ff54ca0a3fbe4142_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/9c2e99674bcb59e0ff54ca0a3fbe4142_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/6dedc13210ade66ae9de2fe50ffc537c_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/6dedc13210ade66ae9de2fe50ffc537c_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/af2d70a4eebe461df2f504_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/af2d70a4eebe461df2f504_r.jpg&&&/figure&&br&&figure&&img src=&https://pic4.zhimg.com/d5fb8f40e54887d2ccb3_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic4.zhimg.com/d5fb8f40e54887d2ccb3_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/6ea06ad7dd376f51eb09cba_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/6ea06ad7dd376f51eb09cba_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/d73cee72cffccb1ff3bf566cc9a8a2e0_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/d73cee72cffccb1ff3bf566cc9a8a2e0_r.jpg&&&/figure&&br&&figure&&img src=&https://pic4.zhimg.com/afd328aef6a7b7c999697_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic4.zhimg.com/afd328aef6a7b7c999697_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/a731b6a00e1f21d3e6bae6_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/a731b6a00e1f21d3e6bae6_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/41c8dd1d8f56b3ea811ec129ce380ac8_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/41c8dd1d8f56b3ea811ec129ce380ac8_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/270f430f2bc6b9ba7796_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/270f430f2bc6b9ba7796_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/ecd53f18_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/ecd53f18_r.jpg&&&/figure&&br&&figure&&img src=&https://pic2.zhimg.com/d84a12a9a593dc6c5eb5d_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/d84a12a9a593dc6c5eb5d_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/02b3da21ff701ea6232ac_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/02b3da21ff701ea6232ac_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/87c33b55fbc70cb92caa0d110d8be674_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/87c33b55fbc70cb92caa0d110d8be674_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/3e57dfaad860b15a504bc558_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/3e57dfaad860b15a504bc558_r.jpg&&&/figure&&br&&figure&&img src=&https://pic1.zhimg.com/cdad0fcfe748_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/cdad0fcfe748_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/11cef1dee058e274491dcaf23a8

我要回帖

更多关于 现在跑滴滴到底怎么样 的文章

 

随机推荐