0x00a3068b指令引用的0x00a3068b内存不能为read

&p&半年多前看到这个问题,当时刚开始教女友写前端;半年后又看到这个问题,女友已找到较满意的工作,半年来感触良多,所以打算将这些日子的学习路径和方法写下来,希望能提供一个与 &a data-hash=&23e93ee9e6a0b836b713c0d0b8df2c27& href=&//www.zhihu.com/people/23e93ee9e6a0b836b713c0d0b8df2c27& class=&member_mention& data-editable=&true& data-title=&@yanyiwu& data-hovercard=&p$b$23e93ee9e6a0b836b713c0d0b8df2c27&&@yanyiwu&/a& 的答案不太一样的视角,帮助到有同样需求的人吧。&br&&br&背景:&br&女友14年本科毕业,学的是商科,大学里一点编程都没接触过,毕业后也从事与编程无关的工作,工作了一年多觉得工作不合适自己,想换一份持续学习、有挑战的工作;与此同时在我的耳濡目染下渐渐对写程序产生了兴趣,于是我们就做了大胆的决定,转程序媛吧。&br&&br&我目前还是上海交通大学计算机系研二的学生,虽然未来的职业规划不是前端方向,但学生时期做过许多项目,教她前端入门完全没有问题,与此同时还需要帮她自底向上构建计算机基础知识,这一点对所有方向的程序员来说都至关重要。&br&&br&关于技术选型,我们没有多想直接选了Web前端,一来是因为效果容易展现保持学习的成就感,二来是因为NodeJS的存在可以很容易学一些后端知识。&br&&br&在学习方法上,我们分了好几条线路同时学习:&br&&br&线一:HTML/CSS/JavaScript&br&这是一条入门和打基础的线。&br&&/p&&ol&&li&我们看的第一本书:《Head First HTML and CSS》,这是本非常基础的书,适合初学者作为第一本书。&/li&&li&之后做的第二件事:完成了codecademy(强烈推荐这个网站,计算机入门的好资源)上的JavaScript教程,并做了课后配套的几个网站项目。&/li&&li&看的第二本书:《JavaScript DOM编程艺术》,这也是本入门好书,讲了一个网站从简单到复杂是怎么一部部完成的,力荐。&/li&&li&看的第三本书:《Head First HTML5》这本书同样写得深入浅出,在讲JavaScript和DOM的时候与第二本书有一点点的重复,可以看看不同的书是如何讲解JavaScript的。&/li&&li&之后开始学JQuery,跟着&a href=&//link.zhihu.com/?target=http%3A//try.jquery.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&try.jquery.com&/span&&span class=&invisible&&&/span&&/a&走一遍就可以在项目里用了。女友表示学了原生JS再学JQuery实在太简单了。&/li&&li&然后看《JavaScript高级程序设计》,这本书很厚,女友表示没看完,只有在查具体的知识点才去翻阅。&/li&&/ol&&br&线二:计算机科学导论&br&我挑了两门赞誉度比较高的Introduction to Computer Science课给她上:&br&&ul&&li&&a href=&//link.zhihu.com/?target=https%3A//www.udacity.com/course/intro-to-computer-science--cs101& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intro to Computer Science&/a&(udacity的CS101)&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/course/cs101& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Computer Science 101&/a&(Coursera的CS101)&/li&&/ul&我记得其中一门是介绍计算机组成结构的、另一门是介绍一个搜索引擎的结构,这两门课是给新手准备的。&br&这两门课学完可能对前端学习没有什么即时的效果,但从长远来看是绝对需要上的一门课。之后的某个学习阶段很有可能把这些知识结构上零散的点连接起来,形成自己的知识图谱。&br&&br&线三:算法与数据结构&br&这条线也非常重要,是所有不同方向程序员所相交的部分。&br&&ol&&li&我们看的第一本书:《程序员的数学》,写得很入门,非常好。&/li&&li&接下来是可汗学院的算法课:&a href=&//link.zhihu.com/?target=https%3A//www.khanacademy.org/computing/computer-science/algorithms& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&khanacademy.org/computi&/span&&span class=&invisible&&ng/computer-science/algorithms&/span&&span class=&ellipsis&&&/span&&/a&,这门课非常有意思,我记得讲了许多排序算法,通俗易懂,有一天晚上她学完一节课开始和我讨论一些排序算法的优劣,我就知道这门课还是很有价值的。&/li&&li&之后,开始上coursera的算法,教材是那本著名的算法第四版&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/course/algs4partI& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coursera - Free Online Courses From Top Universities&/a&,这门课有点难度,Java写课后作业,女友学得较吃力。&/li&&li&学算法的同时穿插着刷Leetcode,一开始easy题做一晚上都做不出,再后来easy题很快就有思路然后花半小时多才实现出来,再后来medium的题在和我讨论下也能勉强做出来,一步步进步就好,初学者学算法急不得。&/li&&/ol&&br&线四:工具的使用&br&编辑器(atom、vim),linux命令行(git...)&br&linux命令行是自己手把手教的(cd、rm、mkdir......等基础命令),先调出个“黑框框”,然后在里面输入一些命令,输出一些结果,交互式的教学让女友学得非常快。&br&然后要学git了,推荐codecademy上的git教程,通俗易懂。学完git后就把之前的项目全用git管理起来,推到github上面,也顺便熟悉了github这类仓库服务的使用流程。&br&女友问有了atom为什么要学vim,我说万一哪一天你要到登录到另一台服务器上改代码,没有图形界面只能用vim,她好像明白了,但是到现在依然只会用vim的2个command:i、:wq...&br&&br&线五:计算机基础的学习(这是条长线)&br&基础课主要体现在以下几个领域:操作系统、数据库、组成原理与体系结构、编译原理、计算机网络。目前这些课我都没有教过她,觉得没有到时候,理解不了。其中,计算机网络可能是我们下一阶段要学的内容,毕竟和前端还能扯上一些关系,容易理解一些。&br&&br&线六:项目&br&做项目和看书一样重要,我们一直保持一个时间段至少有1个项目在写。&br&&ol&&li&我们写的第一个项目的灵感是来源于 &a data-hash=&766aad6e4cc2dd0fbfc12& href=&//www.zhihu.com/people/766aad6e4cc2dd0fbfc12& class=&member_mention& data-editable=&true& data-title=&@Jasin Yip& data-hovercard=&p$b$766aad6e4cc2dd0fbfc12&&@Jasin Yip&/a&的回答&a href=&https://www.zhihu.com/question//answer/& class=&internal&&更新 Javascript 初学者如何思考才可以把脑中的东西转换成代码写出来? - Jasin Yip 的回答&/a&。该回答中的井字棋有许多改进的地方,于是我们的第一个项目就是把它完善。看懂代码后在此基础上美化UI、增加了平均判定、悔棋、还实现了一个最简单的AI,等等。这个项目对她意义非常重大,经历了是从接手别人代码、修改、开发、调试、简单部署的整个过程。&br&&/li&&li&跟着codecadamy上的课程把课后项目做一遍。&/li&&li&接下来我们模仿了知乎的登录/注册页面、首页,写了一个仿知乎的静态页面。我们就以现知乎网页为设计稿,根据这个模板写出了它对应的效果。这个项目提升了她从一个图片设计稿到完成网站原型的能力,顺便增加了一些CSS框架(Bootstrap)的使用经验。&/li&&li&做了若干个前端项目后,是时候有必要让她学习一下后端到底在干什么,于是我们用Express框架搭了一个最简单的网站,她当时JS已经比较熟,所以写起Node来上手也非常快,我们完成了一个“信息存储”的网站,很简单,在客户端A输入一段文字,获取KEY,在客户端B输入KEY,可以把文字拿回来。后端其实就存一个kv数据,但这个简单的网站把前后端都串起来了,从前端发送AJAX,到服务器收到HTTP包解析,拿到结果,错误处理,然后再把JSON数据发回去的过程。我打算之后增加“kv持久化”功能来向她介绍数据库的概念。&/li&&li&还做了其余很多练手小项目,不一一列举了。&/li&&/ol&&br&线七:前端工程化&br&前端这几年变化实在太快了,不在贵圈的人完全跟不上节奏。&br&但仔细想想还好嘛,本质的东西其实是不变的,后来加的东西都是为了工程化。&br&reactjs,gulp,webpack这些东西目前还在学习中,我自己也在学习,否则就跟不上她的节奏了。&br&&br&最后:&br&上述多条线我们前后一共历时半年多一点,女友从一个什么都不会的小白,成长到一个能根据需求完成基本功能的初级开发者、能讨论算法、有基本的计算机素养,现在想来也是不容易。后来投简历面试,投了一家创业公司,没想到从技术面到HR面都非常顺利,就顺理成章的入职了,觉得我们运气非常好。公司不加班、技术氛围和leader都不错、团队很年轻,她比较满意,那我也很开心。&br&&br&感想:&br&&ol&&li&把技术的东西用通俗易懂的话讲出来很重要。比如和她解释AJAX的时候有个同步/异步的概念,我和她说,我们用微波炉加热东西,加热两分钟,这两分钟你可以就一直盯着微波炉看,其它什么事都不做(同步),没人会这么干对吧?所有人都是去洗个手/刷个微博/上个厕所(异步)...然后听到微波炉发出“叮”的一声(数据到达事件),提醒你去拿东西吃(执行回调函数),所以从这个意义上讲,异步才是正常的东西,同步都是反人类啊。&/li&&li&努力会有回报。虽然这句话听起来很鸡汤,但是很多时候它是对的,特别是当你还有一个正确方向的时候。&/li&&/ol&希望对看到这里的朋友有所帮助。
半年多前看到这个问题,当时刚开始教女友写前端;半年后又看到这个问题,女友已找到较满意的工作,半年来感触良多,所以打算将这些日子的学习路径和方法写下来,希望能提供一个与
的答案不太一样的视角,帮助到有同样需求的人吧。 背景: 女友14年…
高票答案回答的非常全面,我写了篇关于&b&找工作&/b&刷题的文章。&br&希望对题主有帮助。&br&&br&(转载,求带上公众号二维码。。。。)&br&&br&&a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzI3MDA0ODk4MA%3D%3D%26mid%3Didx%3D1%26sn%3Dab0b1ff93ba7d%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&刷题也就这么点地方&/a&&br&&br&1Leetcode&p&鼎鼎大名的Leetcode,据不完全统计在上面被刷过的题可以围绕地球三圈。(没说赤道哈,就是这么严谨。)总之,很多国内外的码农在上面刷题。难度从easy到hard都有,而且覆盖面极广。现在还增加了数据库和shell,相匹配的论坛也可以多看看。很锻炼和国外码农沟通的能力,对于以后去混Github也有好处。&/p&&br&&p&特点:各种语言支持很广泛,题型覆盖很广,测试数据集较弱。&/p&&br&2Codility&p&同样一家著名的国外刷题网站。和Leetcode不同,它是专门帮各大软件公司笔试用的,只是副业提供了一些面试题和挑战。但即使是训练模式都非常经典,很值得一做。而且测试数据集提供的非常完善,总能让你有想不到的边界情况。&a href=&//link.zhihu.com/?target=https%3A//codility.com/programmers/lessons/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Take our free programming lessons&/a&&/p&&br&&p&特点:很接近面试题的风格,训练模式也基本够用。&/p&&br&3Lintcode&p&可以称作中文版本的Leetcode,个人感觉最高难度比Leetcode高一些。这两个类似的网站,可以配套来刷。每个刷一遍,也能保持新鲜感。&/p&&br&&p&特点:中文支持很好,和Leetcode有一部分题类似,可以和九章算法课程配合使用。&/p&&br&4Hihocoder&br&&p&来自于原北京大学POJ开发团队,网站一直在进步。最早是微软的在线笔试网站,现在网易也使用它进行在线笔试。题目侧重于较难题目,风格很像ACM比赛,要自己注意数据集的输入输出。&/p&&br&&p&特点:每周一道算法题极难又有趣,可以用来扩展面试题思路。而且是网易、微软的在线笔试网站,有机会需要多练习。&/p&&br&5CC150&p&这不是网站,这是一本书。全称Cracking the coding interview,是国外找工作的神书,而且的确写的很好。里面除了算法题,还有计算机基础知识等内容,很不错。适合想去外企的人仔细阅读,而且最新版已经比150题多了。总之,外企必备!&/p&&br&&p&特点:外企必备!外企必备!外企必备!想去外企的人,多看看书的配套答案也是好的&/p&&br&&br&&br&结论:&br&&br&&p&最后,经过公众号作者小分队的讨论,根据不同方向的工作,我们&strong&建议&/strong&按照以下方式刷题:&/p&国企、银行、科研单位&p&Leetcode简单、中等难度最好刷一遍,有时间再过一遍思路。&/p&创业公司&p&Leetcode全部难度上机刷一遍,然后把不会的题纸上在重新写一下。&/p&国内互联网&p&Leetcode全部难度上机刷一遍,纸上再写一遍。同时尽量涉及难度较高的平台(Codility),或者多去几家公司面试,以赛代练。&/p&国内外企&p&Leetcode至少全难度刷一遍,CC150纸上写一遍。想提高Microsoft/Google等在线笔试通过率的,多去玩玩Hihocoder等在线笔试平台。&/p&外企总部&p&Leetcode困难程度烂熟于心,尽量达到ACM入门标准,甚至稍高一点比较有把握。&/p&&br&&br&&p&最后欢迎大家关注我们的公众号。 看一群在IT圈混的人的碎碎念。&/p&&br&&p&&a href=&//link.zhihu.com/?target=http%3A//weixin.qq.com/r/AjkgODLEgm-9rXZb92wQ& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weixin.qq.com/r/AjkgODL&/span&&span class=&invisible&&Egm-9rXZb92wQ&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&br&&br&(转载,求带上公众号二维码。。。。)
高票答案回答的非常全面,我写了篇关于找工作刷题的文章。 希望对题主有帮助。 (转载,求带上公众号二维码。。。。)
1Leetcode鼎鼎大名的Leetcode,据不完全统计在上面被刷过的题可以围绕地球三圈。(没说赤道哈,就是这么严谨。)总…
&p&&b&&/b&&/p&&p&收藏6654,点赞才1649。。。&/p&&p&阿菇心里苦啊。。。收藏同时点个赞呗TvT&/p&&br&&p&优质的计算机课程很多,这里以个人学习经验为根据,分平台来细说,选了两家英文,两家中文的。如无具体说明,课程均为免费。&/p&&br&&p&&b&英文&/b&&/p&&p&&b&一、Coursera&/b&&b&:&/b&&br&&/p&&p&&b&1&/b&&b&、《编译原理》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/course/compilers& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&coursera.org/course/com&/span&&span class=&invisible&&pilers&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&名声在外的课程,内容讲得很清楚,但作为毫无计算基础的一个文科生我学到后面有点吃力,最后我是没学完。相反,有理工科背景的朋友们评价说,课程性价比简直爆表,最后都作出了一个完整的编译器,分分钟虐翻文科生,汗。。。建议有基础的理工科同学去修读。&/p&&p&&b&2&/b&&b&、《机器学习》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/learn/machine-learning& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&coursera.org/learn/mach&/span&&span class=&invisible&&ine-learning&/span&&span class=&ellipsis&&&/span&&/a&&/p&&figure&&img src=&https://pic2.zhimg.com/50/620a1fbc91a60fdc566e4_b.jpg& data-rawwidth=&634& data-rawheight=&230& class=&origin_image zh-lightbox-thumb& width=&634& data-original=&https://pic2.zhimg.com/50/620a1fbc91a60fdc566e4_r.jpg&&&/figure&&br&&p&Coursera创始人的课程,老师也是机器学习这方面的大牛,对想要了解和初步掌握机器学习的人来说是不二的选择。课程配有需要动手做的实践作业,学习的孩纸最好有MATLAB基础。这门课的难度得辩证着来看,计算机专业的同学觉得是浅尝辄止,深度不够,而如果只有文科学习背景的可能会有点吃力。&/p&&p&&b&3&/b&&b&、《编程语言》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/course/proglang& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coursera - Free Online Courses From Top Universities&/a&&/p&&p&一门在函数式编程里的神级课程!一般学校里应该很少学到这块专业的内容,理论实践相结合,难易增加程度在可控范围内。印象深刻的是各种经典变成范式的比较,分分钟让你认清高下优劣,知道自己从前写代码的缺陷。老师也是又耐心又好玩,为了让学生记住编写规则不惜牺牲自己的形象。&/p&&br&&p&&b&二、Udacity&/b&:&/p&&p&请注意,使用Udacity时请保持&b&良好的&/b&网络环境&/p&&p&&b&1&/b&&b&、《人工智能》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.udacity.com/course/intro-to-artificial-intelligence--cs271& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&udacity.com/course/intr&/span&&span class=&invisible&&o-to-artificial-intelligence--cs271&/span&&span class=&ellipsis&&&/span&&/a&&/p&&figure&&img src=&https://pic3.zhimg.com/50/d8dfbbc573babcb89aea_b.jpg& data-rawwidth=&779& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&779& data-original=&https://pic3.zhimg.com/50/d8dfbbc573babcb89aea_r.jpg&&&/figure&&p&Udacity创始人的课程,同样来自斯坦福大学,和《机器学习》之于Coursera一样,是U家招牌。据说,Sebastian
Thrun在开设这门课程并取得成功后,就离开了斯坦福,创办了Udacity,而现在,Udacity在IT互联网领域表现远超Coursera,估值也比Coursera高出一截,也能算是里程碑式的课程了。&/p&&p&2、《计算机程序设计:编程原理》&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.udacity.com/course/design-of-computer-programs--cs212& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&udacity.com/course/desi&/span&&span class=&invisible&&gn-of-computer-programs--cs212&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&来自Google大牛Peter Norvig的课程,现在已经有10万多学生在同时学习这门课程,也是个大热门。学习这门课程前,需要有一定编程经验,初入门者有难度。Google之前,他还在NASA Ames研究中心工作过。&/p&&br&&p&&b&--------------------------------------我是中文/英文分割线-----------------------------------------------&/b&&/p&&br&&p&&b&中文&/b&&/p&&p&&b&一、网易云课堂:&/b&&/p&&p&&b&1&/b&&b&、翁恺老师的计算机课程&/b&&/p&&p&《HTML5入门》&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//study.163.com/course/courseMain.htm%3FcourseId%3D171001& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HTML5入门 - 网易云课堂&/a&&/p&&p&《JavaScript》&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//study.163.com/course/introduction/195001.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript - 网易云课堂&/a&&/p&&p&《面向对象程序设计-C++》&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//study.163.com/course/introduction/271005.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&面向对象程序设计-C++&/a&&/p&&p&翁恺老师是浙大计算机学院的老师,是国内最早从事在线教育的老师。本身在课堂上因为讲课循循善诱,讲课经验丰富,受到很多学生的喜爱,在线授课的时候,也不会出现新人教师面部表情僵硬等诡异的场景,节奏把握得很好。而且他的声音也很好听,会给上课加了很多分。现在云课堂上开的课程,基本选修人数都是上万的,所有课程加起来,同时选修课程的人数都该超过20万了,确实有一手。&/p&&p&&b&2&/b&&b&、大学计算机专业课程体系&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//study.163.com/curricula/cs.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大学计算机专业&/a&&/p&&figure&&img src=&https://pic3.zhimg.com/50/dcb7205daaa6a9c06182bbbc_b.jpg& data-rawwidth=&883& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&https://pic3.zhimg.com/50/dcb7205daaa6a9c06182bbbc_r.jpg&&&/figure&&p&这门课程最大的优点是体系性强。就如同他的标题写的一样,这个课程涵盖了计算机专业从大一到大四的所有课程,学完这些课程就能由浅入深全面掌握大学计算机技能,而且授课老师都是行业中比较优秀的老师,授课水平也不错,适合入门学习,也可以在期末复习时用于恶补。&/p&&p&&b&3&/b&&b&、《C/C++黑客编程项目实战课程》&/b&&/p&&p&前两门课都属于理论性比较强的,而这门课则是以实用性见长。整个课堂风格轻松愉快,而且每个理论的讲解中都伴有相应的实践案例作支撑,细致易。懂最后三分之一的课时全都是与C++相关的游戏项目的开发制作,对想提升实际操作能力的人帮助很大。&/p&&br&&p&&b&二、中国大学MOOC:&/b&&/p&&p&&b&1&/b&&b&、《大学计算机基础》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.icourse163.org/course/nudt-17003%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大学计算机基础&/a&&/p&&p&主要以大一计算机课程难度的内容来安排,属于入门级、零基础向的课程,只要认真听课、按时完成作业,即使是计算机小白,软妹子也能学会。对于第一次在线学习计算机的童鞋来说,可以帮助自己树立信心,让你亲近MOOC。&br&&b&2&/b&&b&、《程序设计基础》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.icourse163.org/course/hit-56001%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序设计基础_中国大学MOOC(慕课)&/a&&/p&&p&老牌名校哈工大开设的MOOC课程,主要讲解基础编程内容。为了降低课程难度,在设计课程时,特意把“程序设计”这块内容拆成两门课程:《程序设计基础》,《C语言程序设计精髓》,《程序设计基础》作为基础入门课程,亲民性高,同样适合零基础入门。&/p&&p&&b&3&/b&&b&、《数据结构》&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.icourse163.org/course/zju-93001%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构_中国大学MOOC(慕课)&/a&&/p&&br&&figure&&img src=&https://pic2.zhimg.com/50/f70ccbc17f5e8b7d50215c5_b.jpg& data-rawwidth=&731& data-rawheight=&458& class=&origin_image zh-lightbox-thumb& width=&731& data-original=&https://pic2.zhimg.com/50/f70ccbc17f5e8b7d50215c5_r.jpg&&&/figure&&br&这门课需要有一定编程语言的基础,它的授课老师是被同学称为“姥姥”的陈越老师,也是计算机课程中比较少见的女老师,不仅讲课很棒,而且对学生的问题有求必应,十分热情,不少学生在浙大选不到她的课程就跑到中国大学MOOC来选,也是令人称奇。
收藏6654,点赞才1649。。。阿菇心里苦啊。。。收藏同时点个赞呗TvT 优质的计算机课程很多,这里以个人学习经验为根据,分平台来细说,选了两家英文,两家中文的。如无具体说明,课程均为免费。 英文一、Coursera: 1、《编译原理》…
&b&&i&Update &/i&&/b& : &b&更新Python客户端,修复由于斗鱼网页版面修改带来的小问题,直接开启海量弹幕模式&/b&&b&(请大家不要问我为什么端午节这一天为什么闲着没事更新代码,这个真的和情人节是同一个原因)&/b&&b&.
&a href=&//link.zhihu.com/?target=https%3A//github.com/twocucao/danmu.fm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - twocucao/danmu.fm: douyutv danmu 斗鱼TV 弹幕助手&/a&&/b&&br&&br&Update
: &b&更新Python客户端,增加直播视频的Live获取,以及Mac平台下面的Mplayer的视频播放.代码均放在Github上面. &a href=&//link.zhihu.com/?target=https%3A//github.com/twocucao/danmu.fm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - twocucao/danmu.fm: douyutv danmu 斗鱼TV 弹幕助手&/a&&/b&&br&Update
: &b&更新Python和Ruby客户端(请大家不要问我为什么情人节这一天为什么闲着没事更新代码)&/b&&br&&br&&br&由于zhihu没有法子贴动态图,那只好移步到我的博客一看了.(看博客之前记得点赞╮(╯_╰)╭)&br&&br&&a href=&//link.zhihu.com/?target=http%3A//www.jianshu.com/p/0f& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python程序员如何优雅的看斗鱼TV&/a&&br&&br&===================优雅的看斗鱼TV的分割线==================================&br&&br&&b&&blockquote&-1.如果不想看长文,直接使用.则在安装好Python3或者Ruby2.0以上版本.&/blockquote&&/b&&br&&div class=&highlight&&&pre&&code class=&language-bash&&&span class=&c&&#安装Python客户端&/span&
pip3 install danmu.fm
&span class=&c&&# 比如主播的直播间&/span&
danmu.fm http://www.douyutv.com/16789
&span class=&c&&#或者&/span&
danmu.fm 16789
&span class=&c&&#安装Ruby客户端&/span&
gem install danmu
&span class=&c&&#使用&/span&
danmu douyu &span class=&o&&[&/span&room_id/url&span class=&o&&]&/span&
&span class=&c&&#比如&/span&
danmu douyu qiuri
danmu douyu http://www.douyutv.com/13861
&/code&&/pre&&/div&就可以看到如下结果咯&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/a60affc874f5_b.jpg& data-rawwidth=&1240& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic4.zhimg.com/50/a60affc874f5_r.jpg&&&/figure&&br&&br&0.前言&br&&p&前几天(寒假前咯)闲着无聊,看到舍友们都在看斗鱼TV,虽然我对那些网络游戏都不是非常感兴趣,但是我突然间想到,如果我可以获取上面的弹幕内容,不就有点意思了么?&/p&1.分析阶段&p&如果我想要抓取网页上面的东西,无非就是两种方法&/p&&ol&&li&使用浏览器,手工(自己点击)或者非手工(使用JS脚本),存取我想要的东西。&/li&&li&编写HTTP客户端(斗鱼无HTTPS通讯)&/li&&/ol&&p&第一种方法是万能的,但显然是不行的, 原因如下:&/p&&ul&&li&手动保存实在是不可行,程序员不为也。&/li&&li&浏览器与本地交互有限,换而言之,也就是即使我抓取了对应的弹幕,我也没有办法解决持久化的问题。&/li&&li&假设你选择的是Chrome或者firefox浏览器,也不是不能实现持久化,但这需要写扩展,Chrome扩展没有写过,也不是很感兴趣。&/li&&/ul&&p&第二种方法显然是一个正常的程序员的做法。&/p&&p&语言选用Ruby&/p&&p&写一个客户端,也就是写一个小爬虫,使用的场景:&/p&&blockquote&&p&用户在终端执行命令&/p&&/blockquote&&div class=&highlight&&&pre&&code class=&language-bash&&gem install danmu
danmu douyu &span class=&o&&[&/span&room_id/url&span class=&o&&]&/span&
&span class=&c&&#比如&/span&
danmu douyu qiuri
danmu douyu http://www.douyutv.com/13861
&/code&&/pre&&/div&&p&然后就可以在终端欣赏弹幕咯.&/p&&br&&figure&&img src=&https://pic4.zhimg.com/50/a60affc874f5_b.jpg& data-rawwidth=&1240& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic4.zhimg.com/50/a60affc874f5_r.jpg&&&/figure&&br&&br&&p&回想一下抓取网站的方法&/p&&p&四步走:请求网页(原始数据) - 提取数据(提纯数据) - 保存数据 - 分析数据&/p&&p&很显然,只要解决了请求网页,其他的也就无非解析和SQL语句什么的。&/p&1.1.斗鱼TV弹幕抓取的思路确定&p&如果是像我上面说的那么简单,也就不必再写一篇文章。毕竟,网页小爬虫没有什么技术含量。分布式爬虫才有。&/p&&p&通常情况下的网页小爬虫无非要解决如下问题:&/p&&p&请求,如果对方有一定策略的反爬虫,那需要反反爬虫。比如,&/p&&ul&&li&header带上host,带上refer,带上其他&/li&&li&需要验证,那就申请用户名和密码,然后登陆&/li&&li&如果在登录时期有防跨站机制,那就先获取一次登录页面,然后解析出token,带上对应的token然后登陆。&/li&&li&在程序中加入Log,并且存到本地。防止出现各种各样的反爬虫机制ban掉了程序,从而方便进行下一步防反爬虫对策。&/li&&/ul&&p&并且,由于请求响应机制的存在,通常情况下,每一个请求对应一个响应,如果出错了,要么超时,要么有状态码,所以普通的web爬虫也相对而言比较容易些。&/p&&p&那么,斗鱼TV的站点是不是这样子的就能够容易爬取呢?&/p&&p&你猜到了,答案是“不是”。&/p&&p&由于弹幕具有实时性,就决定了斗鱼TV的弹幕无法通过保存完整指定时间端弹幕的XML(比如BILIBILI的一个视频弹幕是存在一段xml中的)或者Json数据来显示弹幕。要不然的话,那主播操作很出色的时候,观众的弹幕岂不是无法实时显示了么?&/p&&p&那么,肯定就是WebSocket了,于是,我一如既往的打开F12,查看网络流量。&/p&&blockquote&&p&正如你想到的那样,没有任何的弹幕流量来往。一个WebSocket的消息都没有。&/p&&/blockquote&&p&那么,消息肯定是有的,但是消息并不是通过HTTP协议或者WebSocket协议传输的,那么问题会出在哪呢?&/p&&p&分析前端的代码,找出获取弹幕的JS代码,苦于代码太多,找了很久没有找到。那也就是执行逻辑可能在flash里面。&/p&&p&于是祭出大杀器WireShark,抓一下流量。终于看到弹幕的样子了。&/p&&p&是这样的。&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/d8db6ae40bd5ed5f00405_b.jpg& data-rawwidth=&1240& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic4.zhimg.com/50/d8db6ae40bd5ed5f00405_r.jpg&&&/figure&&br&&p&原来使用的是Flash的Socket功能。&/p&&p&那么,我们只需要模拟Socket的每一条消息就好了.&/p&&p&多分析几组数据,但还是对发送消息内容缺乏把握,特别是在用户认证,用户接收弹幕这一块。在搜索引擎上搜索了一阵,发现知乎上有个帖子,读完终于解了我的疑惑。&/p&&p&地址为: &a href=&https://www.zhihu.com/question/& class=&internal&&如何获取斗鱼直播间的弹幕信息? - Python&/a&&/p&&p&在此基础上,省略若干消息分析过程。&/p&&p&总结后得出斗鱼TV网站的服务器分布。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/50/e982addbe4eb9fb_b.jpg& data-rawwidth=&511& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&511& data-original=&https://pic2.zhimg.com/50/e982addbe4eb9fb_r.jpg&&&/figure&&br&&br&1.2.房间信息和弹幕认证服务器获取&p&首先我们拿随便一个主播房间来说,比如,qiuri&/p&&p&Ta的房间链接分为两种&/p&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//www.douyutv.com/qiuri& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&直播互动赢点卡 暴雪游戏闹新春&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.douyutv.com/id%255D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.douyutv.com/id]&/a&[房间&/li&&/ul&&p&对这个主播房间页面请求,正常,所有的有用信息都不是放在HTML中渲染出来,而是有一条放在HTML中内置的JS脚本中,这是为了减少服务器渲染HTML的压力?可是渲染放在JS里面不也一样需要渲染?(不明白)总之,就是程序先加载没有具体数据填充页面,然后JS更新数据。&/p&&p&内置的两段JS脚本,JS脚本中有两个变量,该变量很容易转换成JSON数据,也就是两段JSON数据,一个是关于主播的个人信息,另一个是关于弹幕认证服务器的列表(该列表中的任意一个服务器均可以认证,但每一次请求主播页面得到的认证服务器列表都不一样)&/p&&br&&figure&&img src=&https://pic2.zhimg.com/50/3f5baec4a4266_b.jpg& data-rawwidth=&792& data-rawheight=&477& class=&origin_image zh-lightbox-thumb& width=&792& data-original=&https://pic2.zhimg.com/50/3f5baec4a4266_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/50/cf55c1e0af1_b.jpg& data-rawwidth=&1240& data-rawheight=&700& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic3.zhimg.com/50/cf55c1e0af1_r.jpg&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/50/b2fb908ea39cf_b.jpg& data-rawwidth=&729& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&729& data-original=&https://pic3.zhimg.com/50/b2fb908ea39cf_r.jpg&&&/figure&&br&&br&&p&通过这步,我们就拿到了主播的信息以及弹幕服务器的认证地址,端口。&/p&1.3.发送Socket消息的流程简介&p&我们通过抓包,分析那一大坨数据包,可以确定以下通过以下的流程便可以获取弹幕消息。(分析过程比较繁琐)&/p&&p&首先建立两个Socket。一个用于认证(&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a&),另一个用户获取弹幕(&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_client& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_client&/a&)。&/p&&ul&&li&步骤1: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a& 发送消息登陆,获取消息1解析出匿名用户的用户名,再获取消息2解析出gid&/li&&li&步骤2: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a& 发送qrl消息,获取两个没有什么用的消息&/li&&li&步骤3: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a& 发送keeplive消息&/li&&li&步骤4: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a& 发送伪登陆消息(所有匿名用户都一样只需要输入步骤一中用户名就行了,因为认证已经在上面做过了)&/li&&li&步骤5: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a& 发送join_group消息需要步骤一中国的gid&/li&&li&步骤6: &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a& 不断的recv消息就可以获取弹幕消息了&/li&&/ul&&p&后面会详细解释&/p&2.1.消息Socket消息格式以及发送一条消息&p&既然是发消息,那么每条消息总是有些格式的。&/p&&p&斗鱼的消息格式大致如下:&/p&&br&&figure&&img src=&https://pic4.zhimg.com/50/51d5ca85bbfa9f4b36d49111_b.jpg& data-rawwidth=&1240& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic4.zhimg.com/50/51d5ca85bbfa9f4b36d49111_r.jpg&&&/figure&&br&&br&&p&每一条消息并遵循下面的格式:&/p&&p&1.通信协议长度,后四个部分的长度,四个字节&br&2.第二部分与第一部分一样&br&3.请求代码,发送给斗鱼的话,内容为0xb1,0x02, 斗鱼返回的代码为0xb2,0x02&br&4.发送内容&br&5.末尾字节&/p&&div class=&highlight&&&pre&&code class=&language-rb&&&span class=&c1&&# -*- encoding : utf-8 -*-&/span&
&span class=&k&&class&/span& &span class=&nc&&Message&/span&
&span class=&c1&&# 向斗鱼发送的消息&/span&
&span class=&c1&&# 1.通信协议长度,后四个部分的长度,四个字节&/span&
&span class=&c1&&# 2.第二部分与第一部分一样&/span&
&span class=&c1&&# 3.请求代码,发送给斗鱼的话,内容为0xb1,0x02, 斗鱼返回的代码为0xb2,0x02&/span&
&span class=&c1&&# 4.发送内容&/span&
&span class=&c1&&# 5.末尾字节&/span&
&span class=&c1&&#pack('c*')是字节数组转字符串的一种诡异的转化方式&/span&
&span class=&k&&def&/span& &span class=&nf&&initialize&/span&&span class=&p&&(&/span&&span class=&n&&content&/span&&span class=&p&&)&/span&
&span class=&vi&&@length&/span& &span class=&o&&=&/span& &span class=&o&&[&/span&&span class=&n&&content&/span&&span class=&o&&.&/span&&span class=&n&&size&/span& &span class=&o&&+&/span& &span class=&mi&&9&/span&&span class=&p&&,&/span&&span class=&mh&&0x00&/span&&span class=&p&&,&/span&&span class=&mh&&0x00&/span&&span class=&p&&,&/span&&span class=&mh&&0x00&/span&&span class=&o&&].&/span&&span class=&n&&pack&/span&&span class=&p&&(&/span&&span class=&s1&&'c*'&/span&&span class=&p&&)&/span&
&span class=&vi&&@code&/span& &span class=&o&&=&/span& &span class=&vi&&@length&/span&&span class=&o&&.&/span&&span class=&n&&dup&/span&
&span class=&vi&&@magic&/span& &span class=&o&&=&/span& &span class=&o&&[&/span&&span class=&mh&&0xb1&/span&&span class=&p&&,&/span&&span class=&mh&&0x02&/span&&span class=&p&&,&/span&&span class=&mh&&0x00&/span&&span class=&p&&,&/span&&span class=&mh&&0x00&/span&&span class=&o&&].&/span&&span class=&n&&pack&/span&&span class=&p&&(&/span&&span class=&s1&&'c*'&/span&&span class=&p&&)&/span&
&span class=&vi&&@content&/span&
&span class=&o&&=&/span& &span class=&n&&content&/span&
&span class=&vi&&@end&/span& &span class=&o&&=&/span& &span class=&o&&[&/span&&span class=&mh&&0x00&/span&&span class=&o&&].&/span&&span class=&n&&pack&/span&&span class=&p&&(&/span&&span class=&s1&&'c*'&/span&&span class=&p&&)&/span&
&span class=&k&&end&/span&
&span class=&k&&def&/span& &span class=&nf&&to_s&/span&
&span class=&vi&&@length&/span& &span class=&o&&+&/span& &span class=&vi&&@code&/span& &span class=&o&&+&/span& &span class=&vi&&@magic&/span& &span class=&o&&+&/span& &span class=&vi&&@content&/span& &span class=&o&&+&/span& &span class=&vi&&@end&/span&
&span class=&k&&end&/span&
&span class=&k&&end&/span&
&/code&&/pre&&/div&&p&经过封装,我们仅仅关注那些可见的字符串,也就是Content部分就可以了。&br&content部分,也就是发送消息的内容,在文章后面将会详解。&/p&&p&开启两个Socket,一个用户认证,另一个用于弹幕的获取。&/p&&p&用于用户弹幕认证的,是2.1中所说的认证服务器列表中任意一个。挑选出来一组ip和端口&/p&&blockquote&&p&&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a& = TCPSocket.new &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/auth_dst_ip& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@auth_dst_ip&/a&,&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/auth_dst_port& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@auth_dst_port&/a&&/p&&/blockquote&&p&用户获取弹幕的只要为&/p&&div class=&highlight&&&pre&&code class=&language-text&&danmu.douyutv.com:8601
danmu.douyutv.com:8602
danmu.douyutv.com:12601
danmu.douyutv.com:12602
&/code&&/pre&&/div&&p&四组域名:端口均可以作为如下的DANMU_SERVER和PORT&/p&&blockquote&&p&&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a& = TCPSocket.new DANMU_SERVER,DANMU_PORT&/p&&/blockquote&&p&发送一条消息只需如此&/p&&div class=&highlight&&&pre&&code class=&language-text&&
data = &type@=loginreq/username@=&+@username+&/password@=3456/roomid@=& + @room_id.to_s + &/&
all_data = message(data)
@danmu_socket.write all_data
&/code&&/pre&&/div&&p&把需要传输的字符串放进去就好了.&/p&&p&接下来,我们需处理上面说的六个步骤&/p&2.2.发送消息详细流程之步骤一&p&发送消息内容为:&/p&&blockquote&&p&type@=loginreq/username@=/ct@=0/password@=/roomid@=156277/devid@=DF9E6B39F8D8A2E928BB7C/rt@=/vk@=4fc6e613fc650aed6c8a619/ver@=/&/p&&/blockquote&&p&我们需要注意的内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-rb&&&span class=&n&&type&/span& &span class=&err&&表示消息的类型登陆消息为&/span&&span class=&n&&loginreq&/span&
&span class=&n&&username&/span& &span class=&err&&不需要,请求登陆以后系统会自动的返回对应的游客账号。&/span&
&span class=&n&&ct&/span& &span class=&err&&不清楚什么意思,默认为&/span&&span class=&mi&&0&/span&&span class=&err&&并无影响&/span&
&span class=&n&&password&/span& &span class=&err&&不需要&/span&
&span class=&n&&roomid&/span& &span class=&err&&房间的&/span&&span class=&nb&&id&/span&
&span class=&n&&devid&/span& &span class=&err&&为设备标识,无所谓,所以我们使用随机的&/span&&span class=&no&&UUID&/span&&span class=&err&&生成&/span&
&span class=&n&&rt&/span& &span class=&err&&应该是&/span&&span class=&n&&runtime&/span&&span class=&err&&吧,时间戳&/span&
&span class=&n&&vk&/span& &span class=&err&&为时间戳&/span&&span class=&o&&+&/span&&span class=&s2&&&7oE9nPEG9xXV69phU31FYCLUagKeYtsF&&/span&&span class=&o&&+&/span&&span class=&n&&devid&/span&&span class=&err&&的字符串拼接结果的&/span&&span class=&no&&MD5&/span&&span class=&err&&值(这个是参考了一篇文章,关于这一处我也不大明白怎么探究出来的)&/span&
&span class=&n&&ver&/span& &span class=&err&&默认&/span&
&/code&&/pre&&/div&&p&通过这一步,我们可以获取两条消息,并从消息中使用正则表达式获取对应的用户名以及gid&/p&&div class=&highlight&&&pre&&code class=&language-rb&&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&span class=&vi&&@username&/span&&span class=&o&&=&/span& &span class=&n&&str&/span&&span class=&o&&[&/span&&span class=&sr&&/\/username@=(.+)\/nickname/&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&]&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&span class=&vi&&@gid&/span& &span class=&o&&=&/span& &span class=&n&&str&/span&&span class=&o&&[&/span&&span class=&sr&&/\/gid@=(\d+)\//&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&]&/span&
&/code&&/pre&&/div&2.3.发送消息详细流程之步骤二&p&发送的消息内容为&/p&&blockquote&&p&&type@=qrl/rid@=& + &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/room_id& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@room_id&/a&.to_s + &/&&/p&&/blockquote&&p&无需多说,类型为qrl,rid为roomid,直接发送这条消息就好。返回的两条消息也没有什么价值。&/p&&div class=&highlight&&&pre&&code class=&language-rb&&
&span class=&n&&data&/span&
&span class=&o&&=&/span& &span class=&s2&&&type@=qrl/rid@=&&/span& &span class=&o&&+&/span& &span class=&vi&&@room_id&/span&&span class=&o&&.&/span&&span class=&n&&to_s&/span& &span class=&o&&+&/span& &span class=&s2&&&/&&/span&
&span class=&n&&msg&/span& &span class=&o&&=&/span& &span class=&n&&message&/span&&span class=&p&&(&/span&&span class=&n&&data&/span&&span class=&p&&)&/span&
&span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&write&/span& &span class=&n&&msg&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&2.4.发送消息详细流程之步骤三&p&发送的消息内容为&/p&&blockquote&&p&&type@=keeplive/tick@=& + timestamp + &/vbw@=0/k@=19beba41da8ac2b4c7895a66cab81e23/&&/p&&/blockquote&&p&直接发送。无太大意义。&/p&&div class=&highlight&&&pre&&code class=&language-rb&&
&span class=&n&&data&/span& &span class=&o&&=&/span& &span class=&s2&&&type@=keeplive/tick@=&&/span& &span class=&o&&+&/span& &span class=&n&&timestamp&/span& &span class=&o&&+&/span& &span class=&s2&&&/vbw@=0/k@=19beba41da8ac2b4c7895a66cab81e23/&&/span&
&span class=&n&&msg&/span& &span class=&o&&=&/span& &span class=&n&&message&/span&&span class=&p&&(&/span&&span class=&n&&data&/span&&span class=&p&&)&/span&
&span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&write&/span& &span class=&n&&msg&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_auth_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&前三步,也就是2.2-2.3-2.4三步骤,也就是使用&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_auth_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_auth_socket&/a& 完成获取username和gid的重要步骤。获取这两个字段以后,也就完成了它存在的使命。&/p&&p&接下来的就是&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a&获取弹幕的时候了!&/p&2.5.发送消息详细流程之步骤四&p&消息内容为:&type@=loginreq/username@=&+&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/username& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@username&/a&+&/password@=3456/roomid@=& +&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/room_id& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@room_id&/a&.to_s + &/&&/p&&p&和上面2.2中略有不同。但是,需要注意的是&/p&&div class=&highlight&&&pre&&code class=&language-text&&
username 为2.2中所得到的username
password 的值得变化
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-rb&&
&span class=&n&&data&/span& &span class=&o&&=&/span& &span class=&s2&&&type@=loginreq/username@=&&/span&&span class=&o&&+&/span&&span class=&vi&&@username&/span&&span class=&o&&+&/span&&span class=&s2&&&/password@=3456/roomid@=&&/span& &span class=&o&&+&/span& &span class=&vi&&@room_id&/span&&span class=&o&&.&/span&&span class=&n&&to_s&/span& &span class=&o&&+&/span& &span class=&s2&&&/&&/span&
&span class=&n&&all_data&/span& &span class=&o&&=&/span& &span class=&n&&message&/span&&span class=&p&&(&/span&&span class=&n&&data&/span&&span class=&p&&)&/span&
&span class=&vi&&@danmu_socket&/span&&span class=&o&&.&/span&&span class=&n&&write&/span& &span class=&n&&all_data&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&vi&&@danmu_socket&/span&&span class=&o&&.&/span&&span class=&n&&recv&/span&&span class=&p&&(&/span&&span class=&mi&&4000&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&2.6.发送消息详细流程之步骤五&p&接下来就是完成认证的最后一步了,join_group的消息内容为&/p&&blockquote&&p&&type@=joingroup/rid@=& + &a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/room_id& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@room_id&/a&.to_s + &/gid@=&+&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/gid& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@gid&/a&+&/&&/p&&/blockquote&&p&gid为2.2中所得到的gid。&/p&&div class=&highlight&&&pre&&code class=&language-rb&&
&span class=&n&&data&/span&
&span class=&o&&=&/span& &span class=&s2&&&type@=joingroup/rid@=&&/span& &span class=&o&&+&/span& &span class=&vi&&@room_id&/span&&span class=&o&&.&/span&&span class=&n&&to_s&/span& &span class=&o&&+&/span& &span class=&s2&&&/gid@=&&/span&&span class=&o&&+&/span&&span class=&vi&&@gid&/span&&span class=&o&&+&/span&&span class=&s2&&&/&&/span&
&span class=&n&&msg&/span& &span class=&o&&=&/span& &span class=&n&&message&/span&&span class=&p&&(&/span&&span class=&n&&data&/span&&span class=&p&&)&/span&
&span class=&vi&&@danmu_socket&/span&&span class=&o&&.&/span&&span class=&n&&write&/span& &span class=&n&&msg&/span&
&/code&&/pre&&/div&2.7.发送消息详细流程之步骤六&p&获取弹幕,并且打印出来。&/p&&div class=&highlight&&&pre&&code class=&language-text&&
danmu_data = @danmu_socket.recv(4000)
type = danmu_data[danmu_data.index(&type@=&)..-3]
puts type.gsub('sui','').gsub('@S','/').gsub('@A=',':').gsub('@=',':').split('/')
&/code&&/pre&&/div&&p&后三步,则是&a href=&//link.zhihu.com/?target=https%3A//ruby-china.org/danmu_socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@danmu_socket&/a& 获取弹幕的步骤。&/p&&p&于是,通过这些步骤,就可以完成了简单的danmu的核心代码,接下来的步骤就是完善,重构这些代码了。&/p&总结痛点一,至今还没有解决rtmp地址的获取&p&找了很久没有办法解决rtmp地址的自动获取:&/p&&p&路径如下&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.douyutv.com/swf_api/room/Fcdn%3D%26nofan%3Dyes%26_t%3Dsign%3D3b2efb130cb25a85e621f477f95c7341& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&douyutv.com/swf_api/roo&/span&&span class=&invisible&&m/301712?cdn=&nofan=yes&_t=&sign=3b2efb130cb25a85e621f477f95c7341&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&这一处的请求不是XHR,也就是不是JS脚本通过XMLHttpRequest异步加载;那么,八成是flash通过http协议获取的。我估计八成执行逻辑应该是在flash之中。也就不方便获取其中的sign值.故,暂时无法解析rtmp视频流地址了&/p&效果图和代码&p&效果图:&/p&我擦,居然不能传输gif图片.&br&请移步到这里查看吧.&br&&br&&a href=&//link.zhihu.com/?target=http%3A//www.jianshu.com/p/efe& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&记一次斗鱼TV弹幕爬虫经历(Ruby版本)&/a&&br&&br&&p&代码的地址为:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//github.com/twocucao/danmu& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - twocucao/danmu: douyutv弹幕助手&/a&&/p&&p&技术浅薄,还请轻拍。&/p&参考链接&p&PS:如果有问题可以在下方留言或者发送email到给我。&/p&
: 更新Python客户端,修复由于斗鱼网页版面修改带来的小问题,直接开启海量弹幕模式(请大家不要问我为什么端午节这一天为什么闲着没事更新代码,这个真的和情人节是同一个原因).
当我大概搞清楚了一句 “Hello world!”是怎么出现在屏幕上的时候&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&printf(&Hello world!&);
&/code&&/pre&&/div&&br&printf 是一个C runtime的函数,“Hello world!& 是一个常量字符串,编码是ASCII的'\0'结尾的,传递给printf的是const char * 类型的指针,指针通过push指令压栈,通过call指令调用函数。&br&&br&printf会把这个字符串写入一个叫
stdout的抽象文件句柄,而这个文件句柄会被console接管。&br&&br&当console从stdout读取这个字符串后,会把他写入console的缓冲区,根据当前光标位置决定字符的位置&br&&br&console的会根据缓冲来刷新屏幕显示&br&&br&显示字符的时候需要根据当前字体设置,用”Hello world!&的每个字符的Unicode值去计算字体内对应的字符索引,根据索引获取字模。&br&&br&根据字模来绘制字符图形,用当前字体颜色填充,做字体边缘平滑,生成包含字符的RGB32位图&br&&br&把RGB32位图复制到console窗口对应的frame buffer&br&&br&操作系统的图形引擎把窗口的frame buffer渲染到屏幕对应的显存内的frame buffer&br&&br&显卡根据显存buffer 生成信号给显示器,显示器根据信号调整屏幕上每个像素的颜色和亮度。&br&&br&终于可以看到“Hello world!”了&br&&br&注:这只是个粗略过程,中间省略了不少于10万字。
当我大概搞清楚了一句 “Hello world!”是怎么出现在屏幕上的时候 printf("Hello world!");
printf 是一个C runtime的函数,“Hello world!" 是一个常量字符串,编码是ASCII的'\0'结尾的,传递给printf的是const char * 类型的指针,指针通过push指令压栈…
在咨询公司、VC/PE/Hedge Fund等基金混迹多年,一直靠着Excel的各种技巧安身立命和升职加薪。可能是因为程序员出身的原因,在学会以上各个答案提到的装逼炫酷图表、快捷键和一些略复杂的函数(VLookup等)之外,总是希望从更深的层次去探索Excel及各类Office软件,直到遇到了数组函数和VBA编程。这些技能一旦掌握能将工作效率提高数倍甚至是十倍以上,然而周围却很少有人掌握。如果对这些技能感兴趣,可以关注这个活动:&a href=&http://zhuanlan.zhihu.com/hemingke/& class=&internal&&粉丝回馈:程序让你更性感 - 数据冰山 - 知乎专栏&/a&。&br&&br&数组函数和VBA编程,简直就是为程序员而生的,数组函数充满了数据库的思维,而VBA本身就是彻头彻尾的编程,再加之各种接口,能够将Office各套软件以及OS下的各种功能完美结合在一起。因为Excel+VBA是图灵完备的,最后辅以Excel简单高效的数据呈现界面,所以在我的心目中,Excel+数组函数+VBA,简直就是网页前端+客户端+后台程序+数据库。感觉学会了这些,某种意义上就是成为了Full Stack Developer(全栈工程师),各互联网公司梦寐以求想招到的人。&br&&br&&b&一、数组函数&/b&&br&数组函数往往会和Index、Indirect及Address等地址相关和数据块相关的函数搭配使用,如果不考虑效率的话,基本可以替代各种SQL语句了。&br&&br&&u&&i&数组函数之案例1:计算某类产品的总价值&/i&&/u&&br&计算AA产品的总价值,替代select sum(产品数量x产品单价) from ... where 产品编号=‘AA’&br&{=SUM(IF(($B$4:$B$8=&AA&),($C$4:$C$8)*($D$4:$D$8),0))}&br&&figure&&img src=&https://pic1.zhimg.com/50/fb9ae818db7b85f65751_b.jpg& data-rawwidth=&304& data-rawheight=&152& class=&content_image& width=&304&&&/figure&&br&如果没有数组函数,使用sumif等函数也会很复杂。&br&&br&&u&&i&数组函数之案例2:挑选不重复的值并计算总和&/i&&/u&&br&左边的白色区域是原始数据,右边的彩色区域使用了数组函数的输出区域。数组函数实现了两大功能:&br&&ul&&li&黄色区域:将不重复的name+month筛选出来。&/li&&li&蓝色区域:替代了select sum(tot) from ... group by name, month,将name+month对应的tot进行加总&br&&/li&&/ul&如果没有数组函数,只能使用Pivot Table等复杂方式,不仅程序开销很大,而且还不够灵活。&br&&figure&&img src=&https://pic3.zhimg.com/50/d11d826daeb_b.jpg& data-rawwidth=&681& data-rawheight=&633& class=&origin_image zh-lightbox-thumb& width=&681& data-original=&https://pic3.zhimg.com/50/d11d826daeb_r.jpg&&&/figure&&br&&u&&i&数组函数之案例3:&/i&&/u&&br&这是一个帮助某国际家用电器厂商预测中国各家电品类市场潜力及规模的项目,从年。一般的Excel函数只能解决两维的问题,而这次客户提出了这个变态的n维需求,需要精确到年份、电器品类、渠道类型、用户高中低端以及城市级别共5个维度来查看市场规模及潜力。简单说就是利用下面这个表格随时查看指定维度下的某年份的市场潜力及规模。&br&&figure&&img src=&https://pic3.zhimg.com/50/bbdc_b.jpg& data-rawwidth=&518& data-rawheight=&526& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&https://pic3.zhimg.com/50/bbdc_r.jpg&&&/figure&&br&&br&通过使用数组函数建模轻松实现如下功能,只要在指定的区域内选择相关值,就能计算值所需的市场规模及潜力,等于使用了SQL语句:select * from table where 条件1=A1 and 条件2=A2 and 条件3=A3……(共5个条件)&br&&figure&&img src=&https://pic3.zhimg.com/50/adfb2a50a8bfd98a2fb3551b1ceea8dc_b.jpg& data-rawwidth=&521& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&521& data-original=&https://pic3.zhimg.com/50/adfb2a50a8bfd98a2fb3551b1ceea8dc_r.jpg&&&/figure&&br&复杂的数组函数编码如下&br&&div class=&highlight&&&pre&&code class=&language-text&&=SUM(((Summary_Market!$S$71:$S$308=$A7)+(Summary_Market!$S$71:$S$308=$V7)+(Summary_Market!$S$71:$S$308=$AA7)+($A7=&&)&0)*((Summary_Market!$T$71:$T$308=$B7)+(Summary_Market!$T$71:$T$308=$W7)+(Summary_Market!$T$71:$T$308=$AB7)+($B7=&&)&0)*((Summary_Market!$U$71:$U$308=$C7)+(Summary_Market!$U$71:$U$308=$X7)+(Summary_Market!$U$71:$U$308=$AC7)+($C7=&&)&0)*((Summary_Market!$V$71:$V$308=$D7)+(Summary_Market!$V$71:$V$308=$Y7)+(Summary_Market!$V$71:$V$308=$AD7)+($D7=&&)&0)*(Summary_Market!BB$71:BB$308))
&/code&&/pre&&/div&&br&整个模型的界面及复杂的数组函数如下图,左边部分的界面其实就是图形化的SQL语句。这个模型被该客户及我们咨询公司使用了不下5年,部分依赖于其超强的灵活性。&br&&figure&&img src=&https://pic4.zhimg.com/50/10ee3695_b.jpg& data-rawwidth=&1879& data-rawheight=&899& class=&origin_image zh-lightbox-thumb& width=&1879& data-original=&https://pic4.zhimg.com/50/10ee3695_r.jpg&&&/figure&&br&&br&&br&&b&二、VBA编程&/b&&br&首先不要被“编程”二字吓跑,因为VBA不会编程也可以进行,通过录制宏的方式就可以搞定。分享一些学习VBA的小技巧(一些学习VBA的小技巧在这个回答里:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&Excel VBA 如何快速学习? - 何明科的回答&/a&),录制宏的诀窍见下图。&br&&figure&&img src=&https://pic1.zhimg.com/50/9d4d1edab9a_b.jpg& data-rawwidth=&723& data-rawheight=&497& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&https://pic1.zhimg.com/50/9d4d1edab9a_r.jpg&&&/figure&&br&如果真要升级成为VBA编程达人,还是需要自己学习和自己编写VBA程序。下面列举若干自己亲手编写的若干Excel+VBA项目。&br&&br&&i&&u&VBA编程之案例1:自动打印&/u&&/i&&br&刚进职场的新人,只要爸爸不是李刚,基本都做过影帝影后(影=印,各种复印打印的体力劳动)。特别是咨询投行服务行业,在某次给客户的大汇报或者大忽悠会议之前,花数小时或者整晚来打印数个文件,并不是天方夜谭。而且这件事情是对着同样一堆不断修改的文件,会经常不断重复发生。&br&&br&我加入BCG的第一个项目,就是帮助某大型企业从上到下设计KPI体系并实施。从上到下涉及到几十个部门,大概有100多张的KPI表格需要完成,这些KPI表格分布在各个Excel文件里。我们4个咨询顾问的任务:&br&&ul&&li&设定好KPI的基本格式,然后每个顾问负责几个部门,在Excel里不断修改KPI表格,打印出来后去各个当事人及其领导那里讨论并修改&/li&&li&每周把所有的Excel文件中的KPI表格归集在一起,按顺序分部门打印出来,并需要多份,找负责该项目的HR头儿汇报进度和情况&/li&&/ul&&br&这里面有个费时费力的环节,每周需要在多个Excel文件中找出目标Worksheet,然后选定合适的区域作为输出的表格,按照一定的格式和一定的顺序,打印出这100多张表格。之前我们全是凭借人力,每周由一个Analyst把所有最新的Excel文件收集在一起,然后挨个打开文件选中合适的Worksheet,选中区域设置好格式进行打印。每进行一次,几乎耗费一两个小时,还不能保证不出错。&br&&br&于是写下了我的第一个VBA程序,而且基本上是宏录制之后来改的,没有使用参考书及搜索引擎,全靠F1和自动提示,所以贴出来特别纪念一下。实现的功能就是将上述的人肉实现的功能全部自动化。按下一个妞,就慢慢等着打印机按顺序出结果吧。&br&&figure&&img src=&https://pic4.zhimg.com/50/e7cd68bf4a6f60b935a05f5_b.jpg& data-rawwidth=&676& data-rawheight=&424& class=&origin_image zh-lightbox-thumb& width=&676& data-original=&https://pic4.zhimg.com/50/e7cd68bf4a6f60b935a05f5_r.jpg&&&/figure&后来这个程序的升级版是:调度多台打印机,进一步提高效率,以及将打印机卡纸造成队列错误的概率降到极小的范围内。&br&&br&&i&&u&VBA编程之案例2:制作复杂的矩阵式分析图表&/u&&/i&&br&下图是研究各个车型之间的用户相互转换关系,因为要将一维的转化率向量,变成两维的矩阵,所以使用了如下的复杂公式。&br&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&o&&=&/span&&span class=&k&&IF&/span&&span class=&p&&(&/span&&span class=&n&&ISERROR&/span&&span class=&p&&(&/span&&span class=&n&&OFFSET&/span&&span class=&p&&(&/span&&span class=&err&&$&/span&&span class=&n&&C$&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&MATCH&/span&&span class=&p&&(&/span&&span class=&n&&CONCATENATE&/span&&span class=&p&&(&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&),&/span&&span class=&s&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&COLUMN&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&)),&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&600&/span&&span class=&p&&,&/span&&span class=&k&&FALSE&/span&&span class=&p&&),&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&n&&OFFSET&/span&&span class=&p&&(&/span&&span class=&err&&$&/span&&span class=&n&&C$&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&MATCH&/span&&span class=&p&&(&/span&&span class=&n&&CONCATENATE&/span&&span class=&p&&(&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&),&/span&&span class=&s&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&)),&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&600&/span&&span class=&p&&,&/span&&span class=&k&&FALSE&/span&&span class=&p&&),&/span&&span class=&mi&&0&/span&&span class=&p&&)),&/span&&span class=&s&&&&&/span&&span class=&p&&,&/span&&span class=&n&&OFFSET&/span&&span class=&p&&(&/span&&span class=&err&&$&/span&&span class=&n&&C$&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&MATCH&/span&&span class=&p&&(&/span&&span class=&n&&CONCATENATE&/span&&span class=&p&&(&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&),&/span&&span class=&s&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&COLUMN&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&)),&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&600&/span&&span class=&p&&,&/span&&span class=&k&&FALSE&/span&&span class=&p&&),&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&n&&OFFSET&/span&&span class=&p&&(&/span&&span class=&err&&$&/span&&span class=&n&&C$&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&MATCH&/span&&span class=&p&&(&/span&&span class=&n&&CONCATENATE&/span&&span class=&p&&(&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&),&/span&&span class=&s&&&-&&/span&&span class=&p&&,&/span&&span class=&n&&ROW&/span&&span class=&p&&(&/span&&span class=&n&&A4&/span&&span class=&p&&)),&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&&span class=&err&&$&/span&&span class=&n&&D$&/span&&span class=&mi&&600&/span&&span class=&p&&,&/span&&span class=&k&&FALSE&/span&&span class=&p&&),&/span&&span class=&mi&&0&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&br&同时为了用颜色的深浅来表示转化率的大小关系而便于比较,使用了VBA对下面的矩阵进行着色。当然有人肯定会说可以使用条件化格式,但是使用VBA保持了最高灵活度和效率。&br&&figure&&img src=&https://pic4.zhimg.com/50/8ebdaec24f_b.jpg& data-rawwidth=&1695& data-rawheight=&680& class=&origin_image zh-lightbox-thumb& width=&1695& data-original=&https://pic4.zhimg.com/50/8ebdaec24f_r.jpg&&&/figure&&br&&br&&i&&u&VBA编程之案例3:&/u&&/i&&u&&i&管理分布的任务流,并将Excel表格输出到Powerpoint&/i&&/u&&br&这是协助某国际大型汽车制造厂完成新品牌及其新款车型上市,面临车型即将断档的窘境,该新车型的上市非常关键,不能错失时间节点。然而,新车型上市涉及到无数分支:制造、产品、市场、渠道、营销、公关、财务等等,同时还要协调欧洲的两个总部以及中国的两个分部。&br&&br&这次咨询的核心任务就是项目管理,总控整个大项目的进度,并每周向中国区的CEO汇报进度并发掘出易出现问题的关键节点以调配资源。我们4个咨询顾问分配下去各自负责几个部门或者项目分支,和团队一起规划流程、画甘特图、确认里程碑及时间点、安排负责人等等。当每天回到办公室大家将进度汇总在一起的时候发现了挑战及难点,每条任务线并不是独立发展的,而是各条任务线交织在一起并互相影响。&br&&ul&&li&某些核心人员在多个任务线出现。比如:负责预算的财务人员,几乎要出现在各条线中负责相关预算的审批环节&/li&&li&某些任务线的里程碑是其他任务线里程碑的必要条件而相互关联。比如:新车的下线时间影响发布会的时间,相关法规测试的通过又影响车辆的下线时间等等&/li&&/ul&&br&当任务线增多以及任务线之间的交叉越发频繁的时候,汇总的任务将会几何级数增加,这就是我们在项目过程中遇到的问题。于是我利用Excel+VBA完成了这个工作的自动化。主要实现的功能:&br&&ul&&li&自动将4个顾问手中分散的Excel文件汇集在一起形成一个大的总表,如下图&/li&&li&各顾问手中的表格是按照部门维度来划分的,汇总后需要按照不同的维度来输出不同类型的表格,比如:按任务线输出表格、按责任人输出表格、所有延误任务的表格、所有需要资源重点投入任务的表格等等&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/50/735d490e3ccd5ada806bc31_b.jpg& data-rawwidth=&921& data-rawheight=&663& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&https://pic2.zhimg.com/50/735d490e3ccd5ada806bc31_r.jpg&&&/figure&&br&在此基础之上,还要将上面提到的各种维度下的所有表格(大概有200多张),按要求格式粘贴到PPT中,每周提交给中国区的总部进行汇报和评估。密密麻麻的表格如下图。于是,我又写了一个程序将Excel中的表格输出到Powerpoint中,将一个秘书每次需要数小时才能完成的工作,简化成了一键发布,并可以在Excel中完成对PPT的更新。&br&&figure&&img src=&https://pic4.zhimg.com/50/532ae9df984_b.jpg& data-rawwidth=&1725& data-rawheight=&745& class=&origin_image zh-lightbox-thumb& width=&1725& data-original=&https://pic4.zhimg.com/50/532ae9df984_r.jpg&&&/figure&&br&这个项目的程序量不小,近似于写了一个迷你版的Microsoft Project来进行项目管理。&br&&figure&&img src=&https://pic1.zhimg.com/50/d327e4e90bd0f33adbffa_b.jpg& data-rawwidth=&1841& data-rawheight=&813& class=&origin_image zh-lightbox-thumb& width=&1841& data-original=&https://pic1.zhimg.com/50/d327e4e90bd0f33adbffa_r.jpg&&&/figure&&br&最后,下图中密密麻麻的PPT每周需要更新一次,每次都是快100张的工作量,然而基本上都是靠Excel来自动完成更新的。因为PPT的模版每次变化不大,我将这些模版记录下来,每周更新的时候只要根据Excel中最新的数据更改PPT中的数据即可。&br&&figure&&img src=&https://pic3.zhimg.com/50/14ce50e4e2fc80b04ac669d_b.jpg& data-rawwidth=&1709& data-rawheight=&757& class=&origin_image zh-lightbox-thumb& width=&1709& data-original=&https://pic3.zhimg.com/50/14ce50e4e2fc80b04ac669d_r.jpg&&&/figure&&br&&br&&i&&u&VBA编程之案例4:构建Financial Model并&/u&&/i&&u&&i&根据结果倒推假设&/i&&/u&&br&一般的Financial Model都是根据重重假设计算最终结果。而在为某顶级手机品牌服务的过程中,我们却遭遇了逆向的尴尬。本来是根据地面销售人员的一定服务水平,计算所需要的销售人员数量;结果在项目过程中,总部已经确定好了销售人数的Head Count,转而要求我们根据HC确定服务水平。然而,服务水平不是一个单变量,是由零售店的覆盖率、销售拜访频率、拜访中的服务深度等多重因素来决定的,同时还可以根据一线至无线城市来变化。&br&&br&于是只好再次寄出Excel+VBA法宝。先根据常规思路建立好Financial Model,得出HC的初步结果。然后写VBA程序,根据不同的情景、不同的优先级以及不同的权重来调节零售店的覆盖率、销售拜访频率、拜访中的服务深度等多因素,同时设定这几大因素的可接受范围,逐步逼近HC的预设值。&br&&figure&&img src=&https://pic3.zhimg.com/50/ccf31b455d7feed_b.jpg& data-rawwidth=&1229& data-rawheight=&709& class=&origin_image zh-lightbox-thumb& width=&1229& data-original=&https://pic3.zhimg.com/50/ccf31b455d7feed_r.jpg&&&/figure&&br&如果没有程序,以前基本是靠人工手动调节来凑结果,而且因为各种情景的不同,还需要多次调节。而通过程序,基本是自动完成,还可智能得设置优先级及权重,无需人工参与。&br&&br&&i&&u&VBA编程之案例5:海量下载Bloomberg数据并完成分析&/u&&/i&&br&通过Bloomberg的VBA API,海量下载数百只目标股票的tick data以及order book。&br&&figure&&img src=&https://pic3.zhimg.com/50/dc2c5a0e7d339fed7ab5979_b.jpg& data-rawwidth=&930& data-rawheight=&273& class=&origin_image zh-lightbox-thumb& width=&930& data-original=&https://pic3.zhimg.com/50/dc2c5a0e7d339fed7ab5979_r.jpg&&&/figure&&br&并根据实现构建好的数学模型,在后台完成计算,将上述的实时数据转化成每只股票实时的trading cost,实时展现在交易员最常用的Excel界面中,方便交易员评估当下的交易成本以便于优化交易策略。&br&&figure&&img src=&https://pic2.zhimg.com/50/c1ab8cb20657c8_b.jpg& data-rawwidth=&1205& data-rawheight=&222& class=&origin_image zh-lightbox-thumb& width=&1205& data-original=&https://pic2.zhimg.com/50/c1ab8cb20657c8_r.jpg&&&/figure&&br&&b&三、数组函数+VBA的项目:全栈项目&/b&&br&在项目中(&a href=&http://zhuanlan.zhihu.com/hemingke/& class=&internal&&RIO是如何席卷大江南北的? - 数据冰山 - 知乎专栏&/a&)对Excel的要求很综合。首先通过数组函数,对每年对RIO酒购买时刻的提及率按省进行统计。&br&&figure&&img src=&https://pic2.zhimg.com/50/fe7498eca6abf14ab2ff927_b.jpg& data-rawwidth=&1079& data-rawheight=&709& class=&origin_image zh-lightbox-thumb& width=&1079& data-original=&https://pic2.zhimg.com/50/fe7498eca6abf14ab2ff927_r.jpg&&&/figure&&br&其次,利用VBA程序,将上表中H列和I列的数据,按省份涂色到下图中的地图中。&br&&figure&&img src=&https://pic4.zhimg.com/50/b3d53b93fc_b.jpg& data-rawwidth=&594& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&https://pic4.zhimg.com/50/b3d53b93fc_r.jpg&&&/figure&(涂色部分来自于网上的一段程序,制作GIF动画的是自己完成的)&br&&br&最后,再次利用VBA编程以及调用外部程序(GIFSICLE),将一幅幅图表合成在一起生成GIF动画。&br&&figure&&img src=&https://pic1.zhimg.com/50/ab427bec6a_b.jpg& data-rawwidth=&1844& data-rawheight=&494& class=&origin_image zh-lightbox-thumb& width=&1844& data-original=&https://pic1.zhimg.com/50/ab427bec6a_r.jpg&&&/figure&&br&最后的彩蛋,还可以用VBA来画油画,零基础成为用美术作品把妹撩汉的艺术青年(&a href=&https://www.zhihu.com/question//answer/& class=&internal&&Excel 有什么奇技淫巧,让你相见恨晚? - 何明科的回答&/a&),下图把女神用Excel画成油画送给她。&br&&figure&&img src=&https://pic1.zhimg.com/50/ae03578effcf9a205d0ad3c267d9eaa6_b.jpg& class=&content_image&&&/figure&&br&————————————————————&br&更多文章关注我的专栏:&a href=&http://zhuanlan.zhihu.com/hemingke& class=&internal&&数据冰山 - 知乎专栏&/a&
在咨询公司、VC/PE/Hedge Fund等基金混迹多年,一直靠着Excel的各种技巧安身立命和升职加薪。可能是因为程序员出身的原因,在学会以上各个答案提到的装逼炫酷图表、快捷键和一些略复杂的函数(VLookup等)之外,总是希望从更深的层次去探索Excel及各类Offic…
四个字概括:&b&暴力美学&/b&&br&||多图预警&br&||更新完结&br&||本文文字属原创,图片来自网络&br&由于部分武器资料散佚众多或者仍然在原苏联地区现役,因此可获得的资料甚少,非常感谢提供有关资料的人士!楼主才疏学浅,水平有限,希望大家多多讨论,&b&欢迎指正批评建议以及提供资料&/b&&br&&b&||&/b&&b&导致暴力美学的原因:&/b&&br&&b&1.计划经济资源,人员优先配置&/b&&br&&b&2.好大喜功&/b&&br&&b&3.有些暴力美学的背后则是某些技术确实的迫不得已&/b&&br&&b&4.&/b&&b&苏联的军工机制,不亚于美国的竞争机制等方式,也使得苏联的工程师们富有创新精神和创造能力,以及丰富的想象力&/b&&br&&b&5.&/b&&b&比较完整的工业体&/b&&b&系&/b&&br&&b&6.&/b&&b&优秀的基础教育和高等教育,以此带来的大量的人才&/b&&br&&b&7.&/b&&b&相对尊重知识和知识分子&/b&&br&&b&8.&/b&&b&大毛的国民性格&/b&&br&&b&9.很多人认为苏联的军工产品可靠性不高,什么是可靠性高,单造一个精贵的东西可靠性是不高的,很多人不能预知或者极小概率事件都不好体现,大规模量产更改后的产品可靠性不是一般的高,如AK-47,Mi-8/17,T-72(当然以后期更改后的为主)&br&&/b&&br&&br&=================================================================&br&&b&目录:编号 苏联名称(北约代号,绰号等)&/b&&br&为什么要做目录呢——按Ctrl+F,搜索条目便可找到自己想浏览的条目,动用滚动条找到对应位置很繁琐的,目录编号系统应该不和本页面其他人重合。&br&1.战略武器&br&1#1.A602EN伊万(赫鲁晓夫氢弹)&br&1#2.DUGA-3远程警戒雷达(钢铁坟场)&br&1#3.R-36洲际导弹(SS-18撒旦)&br&1#4.RT-23洲际导弹(SS-24手术刀)&br&2.陆军&br&2#1.279工程&br&3.海军&br&3#1 战略核潜艇&br&3#2.1144型基洛夫级导弹巡洋舰&br&3#3.661型见血封喉级核潜艇(神父)&br&3#4.945型梭鱼级核潜艇(塞拉)&br&4.空军&br&4#1.MiG-25(狐蝠)&br&4#2里海怪物 地效飞行器&br&4#3.An-225(哥萨克)&br&4#4.Mi-26(光晕)V-12(信鸽)&br&5.太空&br&5#1. N-1火箭&br&&br&其他未入目录的武器欢迎讨论,酌情添加&br&================================================================&br&&b&正文&/b&&br&1#1.A602EN伊万(赫鲁晓夫氢弹,Tsar Bomba)&br&先举个栗子,小男孩的当量为1.7万吨TNT,大胖子是2万吨TNT。&br&你听说过1亿吨TNT当量的核武器吗,抱歉,没人去制造,虽然有人(赫鲁晓夫)想,但是,地球上实在没有地方去做实验了……&br&怎言轻易放弃,于是伊万出现了,史上最大当量的核武器(估计以后也不太会有了,除非为了摧毁近地小行星)——5000万吨TNT当量的氢弹&br&&figure&&img src=&https://pic4.zhimg.com/50/b47f67f23d_b.jpg& data-rawwidth=&1024& data-rawheight=&680& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic4.zhimg.com/50/b47f67f23d_r.jpg&&&/figure&这枚氢弹也没有做地面核爆炸,而是被Tu-95V带到10.5km的高空,在4.2km空中引爆这颗直径为2米、长约8米,重27吨的伊万——引用一句别人的话:“赫鲁晓夫亲自改变的、每隔上千万年才宠幸地球一次的概率和壮举。”&br&蘑菇云在1000km外可见,高达64km,云顶宽95km,云柱宽40km……造成100km以内所有物体三度烧伤,900km外窗户破碎&br&事后,大家逐渐

我要回帖

更多关于 0x41911ed0指令引用的 的文章

 

随机推荐