跟随,学习,进步

Azure DevOps团队如何使用功能开关实现3周迭代产品上线的

2019-03-19 14:18:05 周文洋

Azure DevOps团队如何使用功能开关实现3周迭代产品上线的

tags: DevOps,TFS,公司博客,微软研发云VSTS/TFS,软件工程


蚂蚁金服容器与服务创新组毕业生招聘

2019-03-19 07:35:18 宋净超

蚂蚁金服容器与服务创新组招聘优秀毕业生啦,欢迎致力于云原生微服务研发的同学投递简历。容器与服务创新组负责金融级云原生微服务基础设施的研发与创


Go 语言 for 和 range 的实现

2019-03-17 14:24:00 Draveness

循环是几乎所有编程语言都具有的控制结构,也是编程语言中常用的控制结构,Go 语言除了使用经典的『三段式』循环之外,还引入了另一个关键字 range 帮助我们快速遍历数组、哈希表以及 Channel 等元素。


打造高效的工作环境 – Shell 篇

2019-03-17 05:53:01 陈皓

注:本文由雷俊(Javaer/Emacser)和我一起编辑,所以文章版权归雷俊与我共同所有,转载者必需注明出处和我们两位作者。原文最早发于酷壳微信公众号,后来我... Read More Read More

tags: Unix/Linux,操作系统,杂项资源,编程工具,Linux,Programmer,Shell,程序员


普通人的网页配色方案

2019-03-16 12:51:36 阮一峰

网页需要配色。一种好看、易用、符合心意的配色,是很不容易的,尤其在没有设计师时。 一、Flat UI 色表 最简单的方法是,从一个给定的色表选择颜色。我以前就是这样,主要根据 Flat UI 的色表配色。 这个色表提供20种颜色(其实是10种,每种颜色有深和浅两个色调),对于简单的网页,基本够用了。实际效果可以参考 Flat UI 官网。 二、香港地铁色表 后来,我听说香港地铁的每个车站,颜色都不一样。比如,中环是红色。 金钟是蓝色,北角是橙色。 这就是有名的香港地铁配色,目前一共有87种颜色。 有人将这87种颜色,做成了色表,方便使用(源码)。 我觉得,这个色表非常漂亮,符合大多数人的审美,87种颜色也足够用了。 三、配色的经验法则 除了使用色表,有人还提出一种配色的经验法则,也很值得参考。 (1)网页的主题色 深颜色使用c、f、6、9这四个字符,组合生成 RGB 色值,比如紫罗兰色是9966ff,靛蓝是6666ff,红色是ff6666。 淡颜色使用a、b、c、d、e、f这六个字符,组合生成 RGB 色值。 (2)文字的颜色 文字最好不要使用全黑,而是使用深蓝色,可以从下面几种颜色挑。1a2a3a最深,2a3a4a次之,7a8a9a最浅。 (3)背景色、阴影色、边框色 背景色、阴影色、边框色都属于衬托,建议使用灰色,可以从aaaaa、bbbbbb、cccccc、dddddd这四个色值挑选。 (完) 文档信息 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 发表日期: 2019年3月16日


黑客攻防72小时

2019-03-15 17:38:20 Yisaer

维京勇士北风造正文2018年的10月,某个我吃完午饭在园区里面慢悠悠散步回公司的星期二中午,企业微信里面突然收到一条来自主管的消息。大意是在我们业务的后台用户中心看到我们的CTO一连注册了好几个用户,感觉到非常奇怪。让我回来看看线上环境是不是出什么代码BUG了,他则去联系CTO了解情况。回到电脑前,我看了下之前那几个非常诡异的账号,之所以被主观认为是CTO注册的,是因为这些账号的用户名都是用我们CTO的真名来注册的。而主管他也和CTO确认完毕,那些号并不是CTO自己注册的。“也许是有人恶作剧吧”,当时我们都是这么认为的,然而就在这时,这个后台的系统显示此时注册的数量逐渐变的越来越快,而且注册用的用户名都是用的我们的CTO的名字,而邮箱则是用了一串明显随机出来的字符串。看着日志看板里快速跳出的一行行注册日志,我意识到了刚刚诡异的账号注册只是一个试探,而我们现在则是遭受到了真正的恶意的API调用攻击。此时遭受攻击的服务是我们业务中的账户服务,而我恰巧是这个服务的Owner。看着自己负责服务的注册接口被恶意刷接口调用,我心里贼气。然而这些恶意注册的账号都有一个非常明显的特点,就是不知道为什么他在填写用户名的时候都是用了我们CTO的真名,所以对于我们来说要鉴别出这些恶意请求非常容易,那就是将这些在注册请求中,所有用户名是那个名字的请求全部拒绝掉即可。想好对策后,我立即打开项目后写了相应的针对代码然后直接推送到线上。4分钟,从写代码到推送到代码仓库经历CICD到最后线上版本滚动更新的整个总共花了4分钟。线上服务版本更新后,这些恶意的请求果然都在日志中记录被拒绝了,我们暂时有了喘息的机会。1234567{ "email": "random@random.com", "username": "fixed_name", "password" : "random", "locale": "en_US", .....}此时的我们面临了一个问题与一个难题。问题在于,作为一个在当时还处于创业期的业务,本身用户与平台侧并没有任何较高的价值,攻击者为什么要对我们进行大量的刷用户注册的攻击,他的意图到底在哪里?如果我们不能搞明白攻击者的真正目的,那么我们将永远处于被动的节奏。难题在于,我们之前上的新的线上版本只是一个专门针对刚刚攻击者的一个版本,等到那个恶意攻击者察觉到以后被针对以后,他只要随便更换一下规则我们就会又立即处于被攻击的状态,我们必须尽快的找到一个彻底的防御方法。就在我们思考与寻找上述的答案时,后台系统的用户增长数又开始了诡异的增长。我们知道,攻击者发现我们开始针对他了,在他简单将注册的脚本中用户名的值改为随机生成后,他的攻击对我们又开始生效。在我们彻底搞清这两个问题前,我们首先需要为自己争取时间,在不影响用户正常使用的情况下,我们必须要将那些恶意请求的特征找出来,然后拒绝掉。 在后台的数据系统内,我们看到这些恶意的注册请求,虽然在请求内容中有着随机的数据,但是请求IP却都是来自同一个IP,而这个IP是新加坡的某个云服务商的IP。很明显,这名恶意攻击者将自己的注册脚本放在了某个云服务器中来进行攻击。就在我想要在服务端BAN了这个IP时,我的主管突然拉住我说,“等等,别让他知道我们发现了”。 这一拉瞬间让我冷静了下来,当时作为一个刚刚毕业三个月的我来说,第一次遇到自己负责的服务在线上直面的恶意攻击,让我从发现开始到现在变得焦躁不安,而焦躁与愤怒正是在对抗时最致命的弱点。 当务之急是在保证网站、数据安全的情况下搞明白攻击者的动机与寻找到长期有效的防御手段,所以我们的防御手段不能让攻击者意识到我们又一次针对他了,从而使他麻痹,为我们争取到尽可能长的时间,即使用蜜罐手段。 我猜测攻击者之所以之前能如此快的意识到自己被针对了,肯定是对恶意请求的HTTP返回值进行了记录,当发现自己的所有请求都被拒绝时,从而更改了脚本。那么此时此刻我的蜜罐手段则非常简单,我在接口对这个注册IP进行特判,对于恶意注册者的IP,我并不会让代码走到数据库层面的逻辑,而只是在接口层稍微等待了1-2秒后,将伪造好的假数据返回给他,让他成功的进行一次HTTP请求。这里的精髓在于,我故意在这里加入了停顿1-2秒的逻辑,从而让这个请求看上去真的好像作为一个正常请求一样被处理了。我快速编写好这个蜜罐后,推送上了生产环境。一分钟、十分钟、一小时过去了,攻击者果然如预想中的一样并没有察觉到这个蜜罐的悄然上线。对于敌人的第二轮攻击,我们暂且挡住了。12345678{ "email": "random@random.com", "username": "fixed_name", "password" : "random", "locale": "en_US", .....}with a fixed IP当攻击暂且消停后,我们开始琢磨上文提到的一个问题和一个难题,对于敌人的动机我们都觉得非常奇怪,为什么要对一个还没有面向公众的业务进行攻击,无法理解能得到什么价值。所以我们决定先解决上文所提到的难题,即找到并立即上线一个长期有效的防御手段。由于之前敌人的攻击都是用同一个IP来进行攻击的,所以一个非常明显的手段就是进行IP限制,即对于同一个IP在同一时刻时能进行的连接进行绝对数量上的限定。由于我们在架构上使用Kubernetes配合Nginx作为流量的负载均衡,所以通过Ingress Anootation就能非常简单的做到在NGINX层进行IP层面的限制。12345678910apiVersion: extensions/v1beta1kind: Ingressmetadata: name: ingress-rules namespace: default annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/limit-connections: '10' nginx.ingress.kubernetes.io/limit-rps: '1'然后这只是在对于同一个IP而言,我们非常清楚当攻击者在使用IP池的情况下,我们的IP限制的策略同样也会被攻破。所以防御的关键手段在于如何在服务端甄别出这个请求究竟是正常人发的请求,还是某个API脚本所发的请求。这一点我相信大家都在日常的APP和网站的注册流程中都会遇到,即注册后会先进行一波手机号验证、邮件验证,或者是输入或滑动一些验证码,来达到人机甄别的目的。这个流程其实我在早期账户服务的构建中向我的主管提出过,然后我的主管否决了这个提案。原因在于对于一个处于创业期的项目而言,我们需要尽可能的降低获客成本,提升用户的注册率,当我们在注册过程中加入任何一个验证流程时,都会成为一个漏斗,从而将部分用户从漏斗中筛出去,降低了我们的注册率。所以对于一个早期业务而言,提高用户注册率的优先级高于各种复杂的验证流程去保证安全。对于这个说法我认为确实是有道理的,但也确实造成了我们目前遭受攻击的局面。万幸的是自从蜜罐上线后,攻击者也一直未能发现,从而给了我们喘息的机会。从中午受到攻击,到思考对策上线防御版本,一转眼的时间就到下班时间了,我和主管对了一下晚上盯防生产环境日志的安排,就先撤了。敌在暗我在明,我们的服务放在公网上能被他攻击,但我并不知道他是谁、在哪。 敌在明我在暗,我能在后台看到他的每一个请求内容,从而抓出特征,但他并不能意识到我们的服务发生了哪些变化。星期三的中午,就在我思考该如何彻底解决这个问题时,我的主管从会议室里出来急冲冲的问我,“我们的用户体系是否和国内主站是不是打通的?”“对呀,账号密码共通的” “坏了”,他说道:“那个黑客盯上的不是我们,而是国内业务。” 到这里我才如梦初醒,明白了那个攻击者的真正动机。十月初的时候,研发部决定用中台化的能力来对接所有前台业务,我们作为一个扩展海外的前台业务,则是接入了国内的用户中台,而这块的接入也正是我负责的。当时我想当然的将我们自己的国外业务的用户名密码原封不动的接入国内用户中台。虽然我们作为一个早期的创业业务并没有任何价值,但是我们的国内业务则是有着丰富的数据和方案,可以说是我们的核心资产与价值,而国内的业务在接口安全这块也做了非常多的防御与检测工作,可以说是严防死守。而由于我们业务在不做任何变动的情况下接入了用户中台,等同于在我们业务中注册的用户也能无缝访问登录国内业务。而由于国内的业务在防御这一侧做了相当多的工作,所以注册一个账号并进行爬虫的代价是极大的,所以至今为止击溃了无数的爬虫攻击者。而我们这里,则相当于无意中开了一个小口子,让攻击者能以极低的成本在我们这里注册账号,然后拿着这些账号凭证对我们的国内业务进行自杀式爬虫,这么做的结果必然会在拿到一点数据以后被我们国内防御策略封号,但是对于攻击者来说他并不怜惜这些账号,因为他可以通过我们取之不竭。而事实上,我们的国内业务也确实发现遭受了爬虫的攻击,而负责国内业务的大佬们从这些爬虫账号看出是在我们这里注册的账号,从而找到了我的主管。 一方面这个漏洞是因为我的疏忽而起,另一方面攻击者的隔山打牛确实很秀,让我有那么一瞬间感觉自己被晃得眼睛疼。我快速更改了接入用户中台的方式,从而断开了国内外的用户体系,然后推送上线。知道了攻击者的意图后,我们开始联系国内主站一起进行对之前攻击者的僵尸账号进行封禁,从而让之前攻击者在我们这边注册的账号在主站那边也提前封禁掉,不让他用爬虫再继续爬我们的数据。在解决了第一个问题后,赶紧上线一个稳定的防御手段则是至关重要。这个时候主管找到了国外一个专门用来判断一个请求是真实用户还是机器行为的免费SAAS服务,简单的说就是你只要将请求中的用户数据比如邮箱啊、用户名啊这些内容以及请求的IP这些数据发送给他,他就会返回给你一个分数,分数越高则越接近人类,分数越低则越接近机器。于是我立马就调试了一波在注册流程中接入了这个SAAS服务,然后在内网中进行了测试,同时我也将这个版本推送到生产环境,去观察当这个SAAS服务面对生产者的恶意请求时所给出的分数。 令人沮丧的是,这个SAAS服务的表现并不令人满意,对于一些真正的人为操作请求,他给出了一个低分,而对于线上生产环境发生的真实恶意注册请求,他又给出了高分。很明显这个SAAS服务并不能帮助我们。雪上加霜的是,我们发现后台的数据系统上,注册数又开始出现诡异的增长了。很明显,黑客又一次发现了我们的伎俩,并更改了脚本。 “他这次是来真的了,”主管说到:“你看这些请求,用的全是真实手机号和163的邮箱,每个请求的IP都不一样了。” “也就是说他这是为了伪装成真实的用户,把自己的肉鸡邮箱和IP池给拿出来了?” “我想是的。” 情况对我们说一下子严峻了起来。12345678{ "email": "telephone@163.com", "username": "random_username", "password" : "random", "locale": "zh_CN", .....}with a RANDOM IP之前我们之所以能快速的在服务端给恶意请求下蜜罐,是因为他的请求中有一个或多个非常明显的特征将他与真实的用户请求区别开来。但是当他这次对于每个恶意请求,都进行精心的构造,伪装成一个真实的用户请求时,我们该在如何代码层面去彻底区分他与真实用户的区别呢?就在我们组在为这一点愁眉苦脸时,坐我旁边的前端开发凑了过来,看着这个恶意注册请求内容说,“这个locale属性有问题呀。” “啥问题?”,我问他,毕竟他的这个邮箱用的是网易的163邮箱,所以locale属性是zh_CN也很正常。”他这个locale属性太规范了,我的代码逻辑里面locale当时随手敲的,所以并没有遵守locale规范。” 听到这个,当时我们整个组都笑尿了,没想到黑客他把自己每个请求都精心伪装成真实用户,甚至连locale的值都遵守协议规范,结果我们自己的前端在开发的时候并没有care这个规范,导致了这个点致命的、难以察觉的特征。我迅速针对这个特征做了新版蜜罐推送到生产环境。再一次,我们为自己争取到了时间。而主管经过调研,发现Google的Recaptcha服务非常适合我们的场景。然而和我对接的前端开发明天才在公司,所以我们只能在明天才能将接入了recaptcha的版本推送到线上。不得不说,这个特征选取的真的非常刁钻。自从上线后,攻击者那边就一直处于未察觉的状态。星期三的晚上我们平安的度过去了。周四中午,我看着生产环境的日志,发现攻击者的注册脚本停止了。“他在思考”,我想道,这个攻击者一定在思考为什么自己伪装的如此像的请求会被进入蜜罐处理,而他肯定也会在我们网站上正常注册,然后他就会发现正常注册的用户就能正常使用,而他的注册脚本则会进入蜜罐。而在这里我犯了一个错误,这是一场我和攻击者的博弈,但是这场博弈并未结束,攻击者正在整理他的牌思考如何破局,而我此时则对我下的这个蜜罐过于自信,而并没有紧急和前端开发对接调试recaptcha的上线。攻击者长时间的沉默让我们之前紧张的氛围变得稍微了轻松了起来,而我也从下午开始与前端开发不紧不慢的开发、调试、对接。非常不巧的是,今天的CICD机器出现了一点问题,导致每次应用打包时拉取maven倚赖变得异常缓慢,原本2-3分钟就能结束的CICD环节,则变成了20-30分钟。晚上7点的时候,就在我还在调试对接repcptcha的请求时,用户注册数又开始了诡异的增长。“坏了,他又发现了”,我心里一惊,那个黑客最终还是发现了locale的秘密,再一次的对我们展开了攻击。而此时我们这边rechpcha的对接工作并没有做完,在我和google服务器的通信中,总是会出现一个通信失败导致验证失败,外加每次CICD上线新版本服务又在今天出现异常的网络拉取问题,使得耗时非常长,让我变得非常急躁。 我在代码里增加了大量的log信息来帮助我查看究竟是哪里出了问题,但怎么都发现不了问题。我知道目前的状态非常糟糕,而且生产环境正在遭受攻击,而越是紧急的情况下我越是需要冷静。于是深吸一口气,从10倒数到1,平静了一下。这么一做确实很有效,我很快发现自己在于google通信时在构造url阶段时居然不小心错失了一个符号,从而导致通信失败。在我迅速解决这个问题后,立即将新版本推送到生产环境。晚上9点,新版本服务recptcha功能上线,而攻击者的请求也因为recptcha的验证被抵御住。至此,前文提到的两个问题终于彻底解决,我也如释重负的下班了。周五中午,我们通过后台的数据系统将攻击者的恶意注册的僵尸账号整理起来,联合国内业务一起封禁了这些用户,让恶意攻击者之前的那些账户彻底报废。历经72小时,我们与这个攻击者的攻防拉锯也终于告一段落了。总结后来,我们在组里聊起这段往事时,感叹道这个黑客真的非常专业。首先他的攻击手段非常巧妙,他真正的攻击对象是我们国内业务的数据,但是国内业务严防死守,使得攻击的代价非常高。在国际业务对接用户中心以后,他敏锐的发现了国际业务与国内业务在账号体系上打通了,从而通过攻击国际业务的方式来攻击国内业务,实在是一招非常高明的隔山打牛。另一方面,他在伪造真实用户请求时,所用的手机号也都是真实用户的手机号,所以我相当怀疑他当时用的邮箱则是真实存在的邮箱,即他拥有了极大数量的邮箱池与IP池来躲过各种防御和限制。另一方面,在我用蜜罐与他的攻防拉锯中,他也一直步步紧逼,不断的见招拆招,逼迫我赶紧想出下一个对策。对于这次攻击,我事后总结时,对自己的检讨在于对情绪的控制。在上文中提到,我的焦躁与轻敌让我没有在第一时刻给出正确、冷静的对策,从而减少对我们的损失。不过后来我和主管One on One聊到这件事的时候,他也安慰我说这种事情碰到过一次后才能成长,以后就能成熟应对了。后来为了应对以后更多的爬虫、攻击者时,我做了不少平台层基于K8S和ISTIO的监控、报警、防御、主动逐出的机制。这块以后有空整理吧。


京东风格的移动端Vue组件库NutUI2.0来啦

2019-03-15 05:54:19 开元

NutUI 是一套来自京东用户体验设计部(JDC)前端开发部的移动端 Vue 组件库,NutUI 1.0 版本于 2018 年发布。据不完全统计,目前在京东至少有30多个 web 项目正在使用 NutUI。 经过一段时间紧锣密鼓的开发,近期,我们正式发布了 NutUI 的 2.0 版。NutUI 2.0 定位于一个京东风格的移动端精品组件库,并不是 NutUI 1.x 的简单升级版。 (扫描/长按识别二维码可以体验 NutUI 2.0 的组件示例) NutUI 官网同步进行了改版,也欢迎大家访问 https://nutui.jd.com ( PC 端)。 我们来看看 NutUI 2.0 有哪些重要的新特性。 京东APP 7.0 视觉风格 NutUI 2.0 的组件在开发时参考了京东APP 7.0 视觉规范,统一了视觉风格和动效。 如果与你需要的风格有差异,可以通过增加一个自定义 class 来调整样式。如果差异较大,可以替换掉整个组件的默认样式文件,既可达到修改样式的目的,又能减少被覆盖的冗余代码。 定制主题 NutUI 2.0 支持自定义组件库整体主题风格。通过在项目中重置一些样式变量的值,可轻而易举的实现组件换肤。 按需加载 NutUI 1.x 的按需加载是通过自定义构建的方式来实现的,虽可满足需求,但是让用户每次都进 node_modules […]

tags: 前端开发


每周分享第 47 期

2019-03-15 03:06:03 阮一峰

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 如果你长期看这个周刊,可能知道我的观点:人工智能将导致大量失业,因为算法将取代大部分白领工作。 很多人不同意,认为未来不会有大量失业,因为新的工作岗位可以容纳就业。但是,到底什么岗位可以让大部分人就业呢?没人说得出来。有一点是显然的,这种岗位不可能是程序员、工程师、算法专家,因为大部分人达不到岗位要求,就像你没法让大部分人学会《高等数学》一样。 前一段时间,我读完了一本书《未来地图》,作者是 O'Reilly 出版社的老板。他也同意,人工智能会让很多人失业。但是他说不担心,因为大家会去干别的工作。他举了一个例子,未来大家会拍视频,你拍我看,我拍你看,所以无数人当"视频主""直播主",以拍视频为生。 这看上去说得通,现在不就已经有很多这样的人了,甚至有人天天直播吃饭,靠打赏赚钱。英语里面有一个专门的词 Mukbang,来自韩语的音译,指的就是这种吃吃喝喝的直播。你去百度搜一下图片,就知道 Mukbang 有多流行了。 但是我还是疑惑,如果将来的工作都是拍这种视频,那有多大的意思呢?卡辛斯基曾经提到过这种情况。未来生产力大发展,物质极大丰富,人类无所事事,只能"把时间花在互相擦皮鞋上面,或者用出租车带着彼此到处瞎转,互相为对方做手工艺品,互相给对方端盘子等等。"说实话,我看不出来,大家互相拍视频,直播吃饭、购物、打游戏,跟互相擦皮鞋,有什么本质的不同。 新闻 1、A380 停产 空中客车公司宣布,2021年将停产 A380 客机。A380 是世界上最大的客机,最多可以搭载853个乘客(全部是经济舱的情况),2005年首飞。当时的预测是,航空公司需要大量超大型飞机,才能在主要机场枢纽之间搭载乘客。 但是,事实并非如此,航空公司的兴趣转向了更轻、更省油的客机。空中客车公司本来预计可以卖出1200架 A380,但实际只卖出了234架。而且,航空公司还在削减订单,因此空中客车作出了停产的决定。 2、JP 摩根币 美国投资银行 JP 摩根推出了自己的数字货币"JPM 币"。这种币是有美元支持的,保持一对一的兑换关系,每发行一个 JMP 币,就需要一美元的准备金。 这种币主要供大企业使用,结算在 JP 摩根自己开发的 Quorum 区块链上进行,主要好处是允许企业在互联网上进行近乎实时的转账,而无需在后台移动法定货币(比如美元)。通常,法定货币的转账需要三到五个工作日。 3、德国军队的可悲现状 德军曾是地球上战斗力最强的军队之一,但是二战后,盟国解除了德国的武装,只允许保留防御性的国防军。德国媒体最近报道,德军的现状非常可悲:人员和物资都短缺,战斗机不能飞行,潜艇无法航行。 报道说,今天的德军更像一个消防队。上个月,部队被派去铲除巴伐利亚州屋顶上的雪。最近一次北约任务中,450名德国士兵由于缺乏无线电设备,不得不在民用手机上通信。2018年末,德军68架直升机和136架战斗机中,只有不到30%可以飞行。飞行员由于长期得不到上天的机会,都变得忧郁了。 4、苹果公司2018年打分 一位美国记者邀请55位专业人士,对苹果公司2018年各个产品线打分。不出所料,得分最高、最令人满意的产品是苹果手表,得分最低、最让人失望的产品是苹果 TV。 5、谷歌协查抢劫案 去年10月,美国明尼苏达州发生了一起抢劫案,为了找到嫌疑人,法官要求谷歌公司提交,案发时手机定位出现在附近区域的所有用户,估计会涉及到上万居民。上图中,白色区域是案发地点,红色区域是法官要求提供信息的区域。 6、喷气式客机的最高速度 2月19日,一架从伦敦到洛杉矶的波音787客机,遭遇了高空气流,在顺风情况下,飞出了每小时1289公里的速度,创造了喷气式客机飞行速度的世界纪录。此前的纪录是1249公里,正常的飞行速度大约是每小时900公里。 这个速度看上去超过了音速(每小时1224公里),但实际上没有。因为这个速度是相对于地面测算的,而飞机在高空气流中,相对于周围的气流,移动速度并没有特别快。喷气式客机是无法超音速飞行的,因为设计时就没有考虑这种可能。 7、写字机器人 《钱江晚报》报道,哈尔滨市的张女士发现,初三的女儿在网上买了一台"写字机器人",它不仅可以模仿孩子的笔迹抄课文、抄生字,还能画手抄报,女儿的语文作业就是机器人帮着写的。她一怒之下摔碎了"机器人",还骂了女儿一顿。 据网店客服介绍,"写字机器人"实为一组杆状的电子金属套件,只需简单组装、下载软件,让机器人识别使用者的笔迹,导入需要书写的文字内容,再在前端安置一支笔,它就能在纸上模仿使用者笔迹书写指定内容,书写速度比较快,每分钟40个字左右,连笔字更快。 8、世界最高的木建筑 2019年3月,挪威小镇 Brumunddal 即将完工一幢18层的木结构大楼,高达80多米,是世界上最高的木结构建筑。该楼将开设写字楼、酒店和公寓。 该楼完全采用胶合板,为了保证承重,采用了特殊的技术,保证了胶合板的坚固耐用。使用木材作为主要建筑材料,也能缩短施工时间和成本,与现浇混凝土相比,木材可以将施工时间减少一半。另外,木材比混凝土轻,也有利于减少地基的施工。 9、一句话新闻 全世界的汽车种类十年前大约是超过50个品牌和350个车型。十年间,随着 Saab、Scion、Mercury 和 Pontiac 等品牌的消失,以及厂商精简车型,汽车种类估计减少了20%以上。 特斯拉公司宣布以3.5万美元的低价,出售 Model 3 车型。由于这个价格太低,为了盈利,特斯拉宣布将关闭线下门店,以节省成本,只能网上购车。这意味着,顾客无法试车。 亚马逊公司为了解决假货问题,准备给予正牌厂商直接下架假货的权力。只要在平台上发现假货,正牌厂商可以不必通过亚马逊官方,直接让对方下架。 Firefox 推出 Firefox send 服务,允许用户上传文件,可以加密,也可以自由下载,最长可以保存7天。 美国一家创业公司准备检查古代信封上面的邮票,提取前人的 DNA,以建立完整的人类 DNA 数据库,因为以前人们往往使用唾液来粘邮票。 文章 1、Amazon Lambda 的通俗解释(英文) 本文使用最简单的语言解释 Lambda 服务,如果你不知道它是什么,可以看看。当然不涉及细节。 2、Chrome 浏览器支持跳转到指定文字(英文) Chrome 将支持跳转到指定文字,而不需要锚点。做法是 URL 里面设置 #targetText=hello%20world ,然后就会跳转到网页的第一个hello world的地方。 3、AltaVista 的历史(英文) AltaVista 是谷歌之前最大的搜索引擎,本文回顾了它的兴起和没落。 4、Windows 10 新版本可以直接访问 Linux 文件(英文) 下一次2019年春季的 Windows 10 更新,将允许 Windows 的文件资源管理器,直接访问和编辑 Linux 文件,不过必须是 Windows Subsystem for Linux(WSL)里面的文件。 5、如何获取全球航班的实时位置?(英文) 很多应用可以显示全球航班的实时信息(上图),这是怎么做到的?原来每架民用客机都配备了一个特殊设备,发送自身的各种数据,使用 1090MHz 未加密的无线电频率,因此个人可以接收到这些数据。 6、你可能不需要单页应用(SPA)(英文) 作者认为,网站做成单页应用的这种趋势,有滥用的嫌疑。他提出,大多数情况应该使用传统网页,只有那些强调实时响应、富交互、状态分享的场景,才应该使用单页应用。 7、Python NumPy 实例教程(英文) NumPy(Numerical Python 的缩写)是一个开源 Python 库,用于进行科学计算。这篇是详细教程,通过大量实例介绍这个库的用法。 8、自学计算机科学(英文) 本文给出自学计算机科学所需阅读的书单,有中译。(@baibm 投稿) 9、BeOS 如何输给 NeXT(英文) 1996年,陷入困境的苹果公司决定从外部购买一个操作系统,当时有两个候选者:BeOS 和 NeXT。最后,他们选择了 NeXT,让乔布斯重新回到苹果。本文作者是 BeOS 的开发者,谈了当时的情况。 10、成为亿万富翁的工程师(英文) 79岁的 Herbert Wertheim 拥有大约23亿美元的财富,是美国少数白手起家的亿万富翁。他没有创办过任何企业,纯粹靠投资股票致富。他以前是工程师,靠阅读专利选择投资目标。本文是他的故事。 工具 1、Mermaid 在线作图 Mermaid 是一个网页作图的 JS 库,该页面可以实时编辑预览 Mermaid 图形。 2、wechat-format 微信公号编辑器,可以把 Markdown 代码转为微信公号格式。(@Y024 投稿) 3、gita git 命令只能用于一个库,而这个工具可以一条命令管理多个 git 仓库。 4、My Brand New Logo 你提供产品的描述,该网站会自动生成 Logo 图案。 5、LitElement Polymer 项目推出的一个 JS 基类库,基于这个基类,可以方便快速地创建 Web 组件。 6、FlightGear 开源的飞行模拟器,可在 Linux,MacOS 和 Windows 上运行。 7、send Mozilla 的文件上传服务 send.firefox.com 的源码,基于 Nodejs。(@roojay520 投稿) 8、Iconfu 一个可以在线定制、修改图标的网站。 9、声音地图 该网站将不同情绪对应的声音,画成一幅地图。鼠标移到每个点上,都会听到声音,比如包含了50%的敬爱、33%的同情、17%满意的声音。 10、Volt 跨平台的桌面应用,将一些常用服务(比如 Gmail、Slack、Twitter、Facebook 等)聚合在一起。 11、theme-ad Hexo 的开源博客主题,针对大屏进行过优化。(@dongyuanxin 投稿) 12、Skype for Web 微软发布新版 Skype for Web,可以在浏览器直接拨打世界各地的电话,不用安装应用程序。 资源 1、我爱 Ruby(英文) Ruby 语言的开源入门电子书。 2、魔方数学(PDF) 麻省理工学院的课程材料,介绍魔方里面包含的数学。 3、前端开发技术日报 每日分享互联网上的前端技术、前端资讯。(@kujian 投稿) 4、sicp-py-zh 加州大学伯克利分校的 SICP 的 Python 版教程中译。(@Ming-Lei 投稿) 5、GitNews 该网站实时显示 GitHub 趋势、HackerNews 和 Reddit 里面出现的热门代码仓库。 6、Go by Example 通过示例学习 Go 语言的教程。 7、AntzOS 一个用于实验和教学目的的操作系统,从零开始实现。(@CasterWx 投稿) 本周图片 1、最贵的飞机头等舱 新加坡飞纽约的 A380 飞机头等舱机票是世界最贵的机票,大约1.84万美元一张。它不仅提供平躺的床,还提供带滑动门的封闭式私人小屋,并使新加坡航空公司成为第一家也是唯一一家拥有双人床的商业航空公司。 上图是头等舱分成一间间小舱房。下图是每间小舱房的内景。 如果是双人乘坐,相邻舱房之间的隔断墙可以降下。 两间相邻舱房的床可以合并,形成一张双人床。 2、胡佛水坝的雕塑 美国胡佛水坝的西侧有两座巨型青铜雕塑,1931年大坝建设时同期施工。 下面是纪念碑广场的全景。 纪念碑广场的地面上有一个标记,写着公元14,000年。 它的含义是,地球的自转轴一直在变化。根据计算,到了12000年之后,也就是公元14000年,此地的上空将正对着现在的北极星。 3、书轮 中世纪时,欧洲的书籍都是使用羊皮纸,导致每一本书都非常重。因此,有人发明了一种叫做"书轮"(bookwheel)的机器,一次可以放多本书,如果想换一本书看,就摇动把手,想看的书就会上升到眼前。 上图是德国下萨克森州 Herzog August 图书馆1625年制造的书轮。目前,全世界只保留下来14个书轮。 新奇 1、带轮子的行李箱 很难相信,行李箱上带有四个轮子,上个世纪60年代才发明出来,1972年才有人申请专利。带有两个轮子的行李箱,发明得更晚,1991年才申请专利。 文摘 1、鸽子塔 农业需要氮肥和磷肥。古代往往采用两个方法,解决肥料问题。一个方法是作物轮作,一期种植固氮作物,另一期种植排氮作物。另一个方法是利用鸡、鸭、鹅的粪便,为田地添加鸟粪。牛粪也可以用,但是通常缺乏磷。 古代波斯(今天的伊朗)的鸽子塔,就是氮磷问题优雅的解决方案之一。波斯人为数千只野鸽建造一座城堡,放置在田野中间。鸽子的粪便都积累在城堡底部,城堡主人每年铲起一次,卖给附近的农民。今天,依然存在的大多数鸽子塔都年久失修,现存最古老的一座建于16世纪,但是人们认为鸽子塔在1000多年前就已经存在了。 鸽子塔的基本设计很简单,其主要结构为圆锥形,由泥砖制成。一座鸽子塔可以容纳多达10,000只鸽子。塔的最顶端有洞,让鸽子随意出入。这些洞也被设计为蛇无法进入,蛇是该地区鸽子的主要天敌。 鸽子与鸡或鸭不同,极少需要维护。只要提供水和住所,它们就会来,也不需要管理它们。你还可以吃鸽子并收获鸽子蛋,尽管伊朗的农民基本不吃这些东西,部分原因在于伊斯兰文化中鸽子的重要地位。最重要的是,鸽子塔技术极低,不需要什么技术和设备,只需要砖块和铲子来收集粪便,每隔几百年维护一次就行了。 2、健身并不会带来健康 人类作为一个物种,正变得越来越久坐。 数十万年前,原始人的运动水平远高于我们今天的水平。从觅食、寻水到狩猎、建造避难所、制造工具等各种工作,人类不得不运动。 到了一百年前,人类的运动已经大大减少,但是购物、擦地板、做家具、手工洗涤这些事情仍然需要运动。后来,人类不断发明新东西,越来越不需要自己动手。扫地机器人让我们不用扫地,洗碗机让我们不用洗碗,网络购物让我们不用去商店,语音控制甚至让我们不用站起身开电灯。 人类的工作性质也发生了变化。以前,大多数工作岗位是体力劳动,现在则是办公室工作。1841年的英国人口普查表明,当时有0.1%的劳动力从事行政或办公室工作。1891年,这个数字增加了20倍,变成2%。今天,美国一项调查估计,86%的劳动力从事久坐工作。 运动的减少使得人类的骨骼变薄,肌肉变弱,出现很多健康问题。根据世界卫生组织的数据,心脏病和中风每年导致大约1700万人死亡。许多人意识到,需要减少久坐,增加运动,这导致健身变得非常流行,成为了一种时尚。 问题是,你需要的是长期的、持续的运动增加,而不是间歇性、高强度的健身。即使你每天都去健身房,但只要不去健身房的时候,你还是在久坐,就依然有问题。真正健康的运动模式,要求你在一天中持续地燃烧卡路里,而不是短暂的爆发式燃烧卡路里。 对于人体而言,固定的运动时间依然不是最佳方式,虽然有运动总是比没有运动好。只要你依然存在久坐,就还是会引发很多问题。我们真正需要的是,体育活动与日常生活结合在一起,这样才能摆脱久坐。地球上,最健康、寿命最长的一些地区的人们,从来没有去过健身房。很多百岁老人以前每天都要走几英里。 另外,站立式办公只比久坐好一点,但也没有好到哪里去。它的升级版是跑步机办公桌,旨在让人在运动中办公,但是并不实用。一把不太舒服的办公椅可能是一种有效的策略,使得你很难做到长时间不动。 总之,经常去健身,但是其他时间久坐,这仍然会对身体造成伤害。长时间的、持续的、低强度或中等强度的活动,似乎会产生最佳结果。过度的高强度活动反而会推动新陈代谢和细胞更新,可能加速衰老过程。 本周金句 1、 中国正在变成一个高工资的低增长经济体。 -- 《世界经济的糟糕状态》 2、 如果没有完成项目,你再忙碌,也无法掩饰没有成效。 -- Jack Bruce Simpson 3、 技术本身并不重要,公司只是希望工程师团队不知疲倦地应用最新的流行技术,做出很炫的东西。 -- James Beswick 4、 自动化和云服务已经改变了后端开发,RDS 使得数据库管理员几乎是多余的,服务器管理员被虚拟化了,QA / QE 已经被 TDD、CI / CD替代。 采用云服务的大型公司,正在将他们的后端工程师,转型为云架构师或服务扩展工程师。 -- James Beswick 5、 只有一个场景,区块链是很好的解决方案,也是唯一的解决方案:交易各方互不信任,无法使用合同和法律制度。换句话说,就是违法的事情。其他场景,数据库和各方之间的合同是更好的解决方案。 -- 《区块链的流行场景,已经为什么它们不起作用》 欢迎订阅 这个专栏每周五发布,同步更新在我的个人网站、微信公众号和语雀。 微信搜索"阮一峰的网络日志"或者扫描二维码,即可订阅。 (完) 文档信息 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 发表日期: 2019年3月15日


空中换引擎——博时基金数字化转型之路

2019-03-14 03:20:13 厉晓明

leansoft团队和博时基金软件研发团队一起,利用微软DevOps研发解决方案平台Team Foundation Server配合Docker容器化技术,在需求管理,配置管理,持续集成 和自动化,自动化测试和部署等方面都进行了探索。帮助博时团队找到了一条空中换引擎的数字化转型之路。

tags: 案例


解读《2018保险用户大调研》

2019-03-13 07:08:25 CDCer

2018年是保险行业的变革之年。行业的监管环境越来越严,各保险公司纷纷转型求变,或拓展新兴产品,或应用科技赋能行业,不断地满足国民的保险需求。3月,银监会和保监会合并,对内,保险行业监管加强,推动行业回归初心,保障本源;对外,保险行业成为金 ...

tags: 未分类


你真的了解用户吗?

2019-03-11 02:33:46 李强

要设计出符合用户心意,最大限度满足用户需求的产品,需要对用户做全面细致的了解,绘制出精准的用户画像,才能开发出高满意度的产品。用户画像不是针对单个用户,而是对整个用户群体进行共性特征的提取,也就是给用户“打标签”。用户画像针对目标用户的真实特征进行勾勒,从而形成目标客户的综合原型。

tags: 软件工程


谈 Golang 中的字符串和字节数组

2019-03-11 01:34:00 Draveness

字符串是 Go 语言中最常用的基础数据类型之一,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间,我们也可以将它理解成一个由字符组成的数组,Go 语言中另外一个与字符串关系非常密切的类型就是字节(Byte)了,相信各位读者也都非常了解,这里也就不展开介绍。


捐献Istio Handbook给ServiceMesher社区

2019-03-10 08:55:11 Jimmy Song

Istio handbook 原是我创作的一本开源电子书(见 https://jimmysong.io/isito-handbook)在捐献给 ServiceMesher 社区之前已经撰写了8个月


理解 Golang 哈希表 Map 的原理

2019-03-09 03:09:00 Draveness

在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 — 哈希,也就是 Map 的实现原理;哈希表是除了数组之外,最常见的数据结构,几乎所有的语言都会有数组和哈希表这两种集合元素,有的语言将数组实现成列表,有的语言将哈希表称作结构体或者字典,但是它们其实就是两种设计集合元素的思路,数组用于表示一个元素的序列,而哈希表示的是键值对之间映射关系,只是不同语言的叫法和实现稍微有些不同。


每周分享第 46 期

2019-03-08 03:18:20 阮一峰

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 (题图:西子宾馆,杭州,2018) 现在,很多网站使用大数据算法,很精确地知道用户的喜好和立场,总是推荐感兴趣的新闻给你看,或者说只给你看想看的东西,比如今日头条和 Facebook。 久而久之,天天看到一大堆同类新闻,你会产生一种幻觉,以为自己的喜好和立场是主流,跟大多数人一致。但是实际上,这完全是假象,举例来说,算法发现你养狗,天天给你看小狗的新闻,搞得你以为到处都是爱狗人士,其实社会上不喜欢狗的人才是多数。 这就是推荐算法的一个副作用,不管你是多么少的少数,它都有办法满足你,让你产生幻觉,高估自己的份量。你明明是人群的1%,却误以为大多数人跟你一样,这样就容易做出错误判断。比如,你天天看到小狗的新闻,就决定做一款宠物相关的产品,进行创业。你以为自己的产品针对大众市场,感兴趣的人应该很多,其实响应者寥寥。 知道自己是少数派还是多数派,挺重要的。如果你是创业者,这就决定了你的产品定位和市场策略。如果涉及到政治,那就更重要了。我觉得,推荐算法以后不仅应该推荐用户感兴趣的内容,还应该告诉用户,你是不是少数派。 新闻 1、SpaceX 飞船即将载人 3月2日,美国宇航局采用 SpaceX 公司的飞船,向国际空间站运送货物。本次任务没有载人,但是放置了一个真人大小的假人,如果一切顺利,将在七月份的第二次任务时开始载人。SpaceX 公司的飞船可以乘坐四人,已经进行了16次试验飞行。 自从八年前,美国最后一艘航天飞机退役,美国就没有飞船可以前往国际空间站。美国政府的政策是,让民间公司(波音和 SpaceX)的飞船承担飞行任务,但是由于这些飞船一直没有造好,美国宇航员都是乘坐俄罗斯飞船前往国际空间站,每个座位需要向俄国支付8200万美元。 2、有感觉的假肢 最近,瑞典开展了假肢连接神经手术,这是世界第一例。医生为一名手截肢患者安装了假肢,里面的电极连接到前臂神经和肌肉,以提取信号控制假肢,并提供触觉。这使它成为历史上第一个临床的,可以灵巧控制和有感觉的假手。 传统的假手依靠放置在皮肤上的电极来从残肢肌肉中提取控制信号,仅允许几个大的运动(打开和关闭手掌)。通过在肌肉中植入电极,可以获得更丰富,更可靠的信息。这名患者一共植入了16个电极,以便新型假手进行更灵巧的控制。新型假手还能提供有限的感觉反馈。目前,该技术只能用于上肢,还不能用于下肢。 3、手机辐射 德国的一个手机实验室,测试手机辐射。辐射量最大的手机,几乎都是中国产的。该实验室认为低于0.60瓦/千克的辐射量的手机,可以接受。下图是辐射量最少的手机。 4、树莓派商店 树莓派在总部英国剑桥开设了一家专卖店,除了各种型号的树莓派以外,还提供纪念品和一些使用树莓派制作的作品。由于树莓派本身最贵的型号是35美元,估计这家商店的价格会非常亲民。 5、世界最长寿的野生鸟类 太平洋中途岛上的一只信天翁,是已知的世界最长寿的野生鸟类,已经68岁了。2018年11月29日,人们在岛上的巢穴里又看到了她,很快她生了一只鸟蛋,2019年2月初,小鸟孵化出来了。 这只信天翁是1956年,生物学家钱德勒·罗宾斯(Chandler Robbins)首先发现的,当时她刚刚发育成熟。信天翁每年只产一个鸟蛋,已知她迄今生下了至少31只雏鸟。 6、智能猫窝 百度公众号消息,百度大脑一位工程师晚兮,为流浪猫搭建的全球首个AI智能猫窝。目前,AI智能猫窝已经在小区里迎来了第一批猫咪入住。 流浪猫只需要"刷脸"就能进入猫窝,它能准确识别174种不同种类的猫咪,保证每一只猫咪自由出入。考虑到夜猫子们昼伏夜出的习性,采用了高清夜视智能摄像头,就算伸手不见五指的晚上,门禁系统也能照常为流浪猫们开门。入口处的摄像头还能识别出流浪猫是否患病,在第一时间通知志愿者,进行有效救助。同时,通过训练流浪猫打耳标图片,还能识别猫咪是否绝育。新风系统会实时监测和分析猫窝内的氧气、二氧化碳等气体浓度,时刻保持猫窝内的空气清新。 7、俄罗斯断开互联网 俄罗斯政府打算通过一部新的法律,要求俄罗斯互联网服务商确保,即使外国侵略者断开互联网网关,俄罗斯的网络也能继续运行。该法律草案于2018年12月在俄罗斯议会提出,其中还要求俄罗斯电信公司将所有互联网流量,重新路由到俄罗斯电信监管机构批准的交换机。 为了测试该法案是否可行,俄罗斯将进行一次测试,暂时断开外部互联网,测试网络流量可以全部留在俄罗斯国内,而不是在国际上进行路由。确切的测试日期尚未公布,但计划在2019年4月1日之前进行。 8、养羊除草 美国佛罗里达州的太阳能电厂,为了除去太阳能板下面的杂草,租了一群绵羊,让羊去把草吃干净。据说,这种方法的成本是传统方法的四分之一,比起化学除草,对环境更友好。该公司还在 Facebook 播出这些绵羊的实时视频。 9、一句话新闻 Linux 内核5.0版发布。 印度尼西亚与挪威达成协议,只要减少砍伐热带雨林,挪威政府就会向印尼政府支付奖金,总额10亿美元。印尼拥有世界第三大的热带雨林。 USB 3.2 标准即将发布,传输速率 20Gb/s。现行 USB 3.0 标准的传输速率为 5Gb/s。 Emoji 最新版本的更新,新增了一滴血的形象,代表月经。 教程 1、如何成为一个优秀工程师(英文) 作者谈了自己在 Stripe 公司担任 SRE (系统可靠性)工程师的经历。 2、计算机如何实现除法(英文) 对于计算机来说,加法和减法比乘法容易实现,而乘法又比除法容易实现。 3、从 Google Analytics 迁移到 Fathom(英文) 如何自己架设开源的 Fathom 服务,统计网站访问情况。 4、贝佐斯的秘密是如何泄漏的(英文) 亚马逊公司老板贝佐斯的婚外情,被媒体披露,让他陷入了麻烦。媒体如何得知贝佐斯的秘密呢?这篇文章认为,原因是黑客进入了他女友的邮箱,因为该邮箱的密码早就泄漏了。 5、如何计算月相(英文) 地球看到的月亮形状是不一样的,本文通过可视化图形,解释如何通过三角函数计算月相。 6、扼杀应用(英文) 马丁·福勒认为重写重要系统的较好做法,是逐步扼杀它,而不是一次性取代。 7、Chrome 的隐藏插件 Chrome 浏览器启动的时候,会加载一些系统插件,不会在插件页显示。这里介绍如何查看这些隐藏插件。 8、JPG 和 JPG2000 格式(英文) JPG2000 图像格式的介绍,也解释了 JPG 和 PNG 格式。 9、条形码如何工作?(英文) 怎么解读条形码,本文还给出了 Python 的扫码实现。 10、Java 开发人员调查结果 2018(英文) 一份针对全世界 Java 开发者的调查统计,有不少有趣的结果。上图是 IDE 的选择。 工具 1、revery 一个构建跨平台桌面应用的框架,跟 Flutter 的思路有点像,也是内置了自己的控件,保证了跨平台一致的体验。它使用 Reason 语言编写,使用 React + Redux。 2、MazeSolverGenerator 一个在 元素上绘制和解决迷宫的 JavaScript 库。 3、x-spreadsheet 一个基于 Canvas 的 JS 电子表格库。 4、Sane 一种配置文件格式,基于对 Yaml 和 Toml 格式的改进。 5、operationRecord 浏览器操作录屏工具,提供 Web 管理后台。(@asdjgfr 投稿) 6、Linux Crontab 生成器 通过 Web 界面生成 Crontab 配置。(@DoctorLai 投稿) 7、react-meme-generator 图片上加文字的在线工具,支持摄像头,可以制作表情包。(@ lijinke666 投稿) 8、algorithm-visualizer 一个直观的算法可视化工具,你可以自由选择自己想学习的算法,每个算法它都清晰描绘了其原理和运作过程。(@nivance 投稿) 9、api-document 一个 Java Spring 项目的文档处理器,可以自动生成文档。(@liuanxin 投稿) 10、xs 语言 国人开发的编程语言,目的是提高读写效率,减轻记忆语法负担。(@kulics 投稿) 11、双拼输入法练习 在线练习双拼输入法的网站,漂亮的键位图,支持多种双拼方案。这里还有一个同类网站。(@pad0van 投稿) 资源 1、Statistics Done Wrong 一本介绍统计学常见错误的书籍,可以在线阅读。 2、WOWA 一个收集免费音乐的网站,可以下载用来制作视频的背景音乐。该网站的目标是成为免费音乐的 Unsplash。 3、React 教程 一个入门教程,需要下载到本地运行。通过一个个练习和演示,帮助读者完成开发实际的 React 应用。 4、黑客工具课程 麻省理工学院的入门课程,介绍 Linux 系统使用者需要掌握的各种基本工具,适合刚入门的初级用户。 5、数据结构可视化 该网站收集各种数据结构,并将它们用可视化的形式表现出来。 6、计算机图形学教程(英文) 从数学基础开始教起的图形学教程,包含 C++ 源码。 7、GitHub Courses GitHub 官方的课程中心,教你如何使用该网站的一些功能。 8、人大代表的可视化 第十三届全国人民代表大会的代表数据可视化。(@jdk137 投稿) 文摘 1、订阅模式不适合报纸 现在,很多新闻机构、博客和播客,都采用订阅模式(subscription)获取收入。用户支付订阅费,换取每个月阅读网站的内容。 这种模式表面上看,对内容提供商很有意义。因为广告模式现在几乎赚不到钱,单单是谷歌和 Facebook 两家公司,就获取了美国60%以上的在线广告收入。订阅模型可以提供稳定的收入流,不依赖于流量。理论上,这可以激励更好的内容,因为内容提供商不必追逐点击了。 但是,这种模式对报纸的作用是两面刃。最适合订阅的是那些值得用户付费的东西,最好是在其他任何地方无法获得的东西。这种情况下,用户会愿意付钱。报纸的问题在于,它的作用是让人们知道一些他们必须知道的事情,报纸是大众媒体,必须有广泛的读者,才有意义。订阅模式消除了报纸的大众媒体属性,会让报纸变得没有意义。 订阅模式的第二个问题是,人们不会订阅所有的东西。你不能指望,人们订阅各种报纸,订了《纽约时报》,再去订《华盛顿邮报》,还有 Netflix、Hulu、HBO、ESPN 等等。用户一年能够订阅的服务是有限的,对于报社来说,怎么才能确保在那个拥挤的领域,分得一份羹呢?所以,订阅模式对整个行业并没有好处,用户订阅了一家媒体,势必就要排挤其他媒体。 2、订阅模式让我困扰 我为一些服务支付月费,比如 Netflix、亚马逊、有线电视、电子邮件、备份存储、软件、音乐、健身房会员......。但是,我的生活是"不定期"的,没法知道什么时候会去用这些服务。有些服务我很少使用,为它们支付月费,对我来说很不划算。 结婚时,我订阅了 Photoshop CC 为妻子制作一些图像效果。我就使用过一次,然后被困在一年的合约中,我忘记了到期时间,结果自动续约了另一年。我支付了2年的费用(约200英镑),但是只使用了一次。现在2年到了,我再想用就没法用了。 我有一个 IDE,每年使用3-4次,但我必须支付月费,并且保证至少购买满一年。在那之后,你所保存的东西,就没法用它打开了。 越来越多的服务正在转向这种模式,对于像我这样经常使用的人来说,没有替代模式。但是我也不想每周、每月、甚至每年都使用同样的东西。 我不介意这个模式用于某些我经常使用的东西。但是,我希望有另一种模式,我乐意为某些软件支付少量费用,因为我的使用量很少。一旦支付了费用,我就可以无限期地(在合理范围内)保留和使用我的文件。 对于内容服务来说,我觉得 Twitch / youtube / patreon 的订阅模式才是未来。你向平台支付月费,然后可以收看所有想看的内容。而不是订阅某几家报纸(你不关心上面90%的内容)。 新奇 1、芬兰语没有拼写检查 从来没有软件提供芬兰语的拼写检查。因为芬兰语单词的拼写变化实在太多,下面这些都是"狗"的正确拼写: koirasi, koirani, koiransa, koiramme, koiranne, koiraani, koiraasi, koiraansa, koiraamme, koiraanne, koirassani, koirassasi, koirassansa, koirassamme, koirassanne, koirastani, koirastasi, koirastansa, koirastamme, koirastanne, koirallani, koirallasi, koirallansa, koirallamme, koirallanne, koiranani, koiranasi, koiranansa, koiranamme, koirananne, koirakseni, koiraksesi, koiraksensa, koiraksemme, koiraksenne, koirattani, koirattasi, koirattansa, koirattamme, koirattanne, koirineni, koirinesi, koirinensa, koirinemme, koirinenne, koirakaan, koirankaan, koiraakaan, koirassakaan, koirastakaan, koiraankaan, koirallakaan, koiraltakaan, koirallekaan, koiranakaan, koiraksikaan, koirattakaan, koirineenkaan, koirinkaan, koirako, koiranko, koiraako, koirassako, koirastako, koiraanko, koirallako, koiraltako, koiralleko, koiranako, koiraksiko, koirattako, koirineenko, koirinko, koirasikaan, koiranikaan, koiransakaan, koirammekaan, koirannekaan, koiraanikaan, koiraasikaan, koiraansakaan, koiraammekaan, koiraannekaan, koirassanikaan, koirassasikaan, koirassansakaan, koirassammekaan, koirassannekaan, koirastanikaan, koirastasikaan, koirastansakaan, koirastammekaan, koirastannekaan, koirallanikaan, koirallasikaan, koirallansakaan, koirallammekaan, koirallannekaan, koirananikaan, koiranasikaan, koiranansakaan, koiranammekaan, koiranannekaan, koiraksenikaan, koiraksesikaan, koiraksensakaan, koiraksemmekaan, koiraksennekaan, koirattanikaan, koirattasikaan, koirattansakaan, koirattammekaan, koirattannekaan, koirinenikaan, koirinesikaan, koirinensakaan, koirinemmekaan, koirinennekaan, koirasiko, koiraniko, koiransako, koirammeko, koiranneko, koiraaniko, koiraasiko, koiraansako, koiraammeko, koiraanneko, koirassaniko, koirassasiko, koirassansako, koirassammeko, koirassanneko, koirastaniko, koirastasiko, koirastansako, koirastammeko, koirastanneko, koirallaniko, koirallasiko, koirallansako, koirallammeko, koirallanneko, koirananiko, koiranasiko, koiranansako, koiranammeko, koirananneko, koirakseniko, koiraksesiko, koiraksensako, koiraksemmeko, koiraksenneko, koirattaniko, koirattasiko, koirattansako, koirattammeko, koirattanneko, koirineniko, koirinesiko, koirinensako, koirinemmeko, koirinenneko, koirasikaanko, koiranikaanko, koiransakaanko, koirammekaanko, koirannekaanko, koiraanikaanko, koiraasikaanko, koiraansakaanko, koiraammekaanko, koiraannekaanko, koirassanikaanko, koirassasikaanko, koirassansakaanko, koirassammekaanko, koirassannekaanko, koirastanikaanko, koirastasikaanko, koirastansakaanko, koirastammekaanko, koirastannekaanko, koirallanikaanko, koirallasikaanko, koirallansakaanko, koirallammekaanko, koirallannekaanko, koirananikaanko, koiranasikaanko, koiranansakaanko, koiranammekaanko, koiranannekaanko, koiraksenikaanko, koiraksesikaanko, koiraksensakaanko, koiraksemmekaanko, koiraksennekaanko, koirattanikaanko, koirattasikaanko, koirattansakaanko, koirattammekaanko, koirattannekaanko, koirinenikaanko, koirinesikaanko, koirinensakaanko, koirinemmekaanko, koirinennekaanko, koirasikokaan, koiranikokaan, koiransakokaan, koirammekokaan, koirannekokaan, koiraanikokaan, koiraasikokaan, koiraansakokaan, koiraammekokaan, koiraannekokaan, koirassanikokaan, koirassasikokaan, koirassansakokaan, koirassammekokaan, koirassannekokaan, koirastanikokaan, koirastasikokaan, koirastansakokaan, koirastammekokaan, koirastannekokaan, koirallanikokaan, koirallasikokaan, koirallansakokaan, koirallammekokaan, koirallannekokaan, koirananikokaan, koiranasikokaan, koiranansakokaan, koiranammekokaan, koiranannekokaan, koiraksenikokaan, koiraksesikokaan, koiraksensakokaan, koiraksemmekokaan, koiraksennekokaan, koirattanikokaan, koirattasikokaan, koirattansakokaan, koirattammekokaan, koirattannekokaan, koirinenikokaan, koirinesikokaan, koirinensakokaan, koirinemmekokaan, koirinennekokaan 本周图片 1、推特总部 推特总部所在的旧金山 Art Deco 大楼,建于1937年,原来是一个家具市场。 下图是1937年建成时的大楼门厅。 推特目前租赁了这栋楼的三个楼层。下图在街角边可以看到推特的标志。 2、青金石:比金更珍贵的蓝色 欧洲最早的蓝色颜料,是从青金石提炼的。这种石头很少,导致蓝色是一种非常珍贵的颜色,只有一些重要的画作才可以使用这种颜色。直到1826年,人们才找到人工合成这种颜色的方法。 本周金句 1、 最好的教育是有趣的,学起来像娱乐。 -- David Perell 2、 人是沟通的动物。他不仅依赖于食物,也同样依赖于新闻、信息和娱乐。 -- 科幻小说家 阿瑟·C·克拉克 3、 特斯拉公司的真正目标,是大规模生产一种实惠的电动汽车,让大众使用。马斯克(特斯拉的老板)想要拯救世界,只生产富人才会购买的电动豪华跑车,不会阻止气候变暖,但是让每个人都使用电动汽车,就有可能做到。 特斯拉的使命是让人类从化石能源转为太阳能。 --《特斯拉放弃奢侈车型的背后》 4、 什么叫知识密集型企业?就是这家企业的大部分支出是工资。 -- 某网络财经节目 5、 当代社会让死亡变得不容易注意到。现在,大多数死亡发生在医院和养老院,而过去常常发生在家中,年轻人的死亡也比以前少见。当代人甚至连屠宰动物都很少看到,而直接吃处理好的食品。总之,大多数人对死亡没有第一手经验,死亡变成了一件无关的事情。 -- HN 读者留言 欢迎订阅 这个专栏每周五发布,同步更新在我的个人网站、微信公众号和语雀。 微信搜索"阮一峰的网络日志"或者扫描二维码,即可订阅。 (完) 文档信息 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 发表日期: 2019年3月 8日


每周分享第 46 期

2019-03-08 03:18:20 阮一峰

这里记录过去一周,我看到的值得分享的东西,每周五发布。...


#DevOps 的前世今生# 4. DevOps 的文化

2019-03-07 07:47:30 李强

虽然开发团队和运维团队使用的工具变了,然而事情却没有改变:我们仍然能看到”流程结合在一起,但工作目标仍然分离“的两个团队:运维团队仍然牢牢控制着环境,控制着上线标准和上线流程

tags: DevOps,软件工程


敏捷开发入门教程

2019-03-06 13:48:41 阮一峰

敏捷开发(agile development)是非常流行的软件开发方法。据统计,2018年90%的软件开发采用敏捷开发。 但是,到底什么是敏捷开发,能说清的人却不多。本文尝试用简洁易懂的语言,解释敏捷开发。 一、迭代开发 敏捷开发的核心是迭代开发(iterative development)。敏捷一定是采用迭代开发的方式。 那么什么是"迭代开发"呢?迭代的英文是 iterative,直译为"重复",迭代开发其实就是"重复开发"。 对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次"大开发";迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次"大开发"变成多次"小开发",每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。 举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨道。然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果 SpaceX 不采用迭代开发,它可能直到现在还无法上天。 迭代开发将一个大任务,分解成多次连续的开发,本质就是逐步改进。开发者先快速发布一个有效但不完美的最简版本,然后不断迭代。每一次迭代都包含规划、设计、编码、测试、评估五个步骤,不断改进产品,添加新功能。通过频繁的发布,以及跟踪对前一次迭代的反馈,最终接近较完善的产品形态。 二、增量开发 迭代开发只是要求将开发分成多个迭代,并没有回答一个重要的问题:怎么划分迭代,哪个任务在这个迭代,哪个任务在下个迭代?这时,一般采用"增量开发"(incremental development)划分迭代。 所谓"增量开发",指的是软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。 举例来说,房产公司开发一个10栋楼的小区。如果采用增量开发的模式,该公司第一个迭代就是交付一号楼,第二个迭代交付二号楼......每个迭代都是完成一栋完整的楼。而不是第一个迭代挖好10栋楼的地基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶...... 增量开发加上迭代开发,才算真正的敏捷开发。 三、敏捷开发的好处 3.1 早期交付 敏捷开发的第一个好处,就是早期交付,从而大大降低成本。 还是以上一节的房产公司为例,如果按照传统的"瀑布开发模式",先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。 敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。 3.2 降低风险 敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。 请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼? 对于软件项目来说,先有一个原型产品,了解市场的接受程度,往往是项目成功的关键。有一本书叫做《梦断代码》,副标题就是"20+个程序员,三年时间,4732个bug,100+万美元,最后失败的故事",这就是没有采用敏捷开发的结果。相反的,Instagram 最初是一个地理位置打卡 App,后来发现用户不怎么在乎地理位置,更喜欢上传照片,就改做照片上传软件,结果成了独角兽。 由于敏捷开发可以不断试错,找出对业务最重要的功能,然后通过迭代,调整软件方向。相比传统方式,大大增加了产品成功的可能性。如果市场需求不确定,或者你对该领域不熟悉,那么敏捷开发几乎是唯一可行的应对方式。 四、如何进行每一次迭代 虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。 具体来说,每次迭代都必须依次完成以下五个步骤。 需求分析(requirements analysis) 设计(design) 编码(coding) 测试(testing) 部署和评估(deployment / evaluation) 每个迭代大约持续2~6周。 五、敏捷开发的价值观 《敏捷软件开发宣言》里面提到四个价值观。 程序员的主观能动性,以及程序员之间的互动,优于既定流程和工具。 软件能够运行,优于详尽的文档。 跟客户的密切协作,优于合同和谈判。 能够响应变化,优于遵循计划。 六、十二条原则 该宣言还提出十二条敏捷开发的原则。 通过早期和持续交付有价值的软件,实现客户满意度。 欢迎不断变化的需求,即使是在项目开发的后期。要善于利用需求变更,帮助客户获得竞争优势。 不断交付可用的软件,周期通常是几周,越短越好。 项目过程中,业务人员与开发人员必须在一起工作。 项目必须围绕那些有内在动力的个人而建立,他们应该受到信任。 面对面交谈是最好的沟通方式。 可用性是衡量进度的主要指标。 提倡可持续的开发,保持稳定的进展速度。 不断关注技术是否优秀,设计是否良好。 简单性至关重要,尽最大可能减少不必要的工作。 最好的架构、要求和设计,来自团队内部自发的认识。 团队要定期反思如何更有效,并相应地进行调整。 七、参考链接 Iterative development: the secret to great product launches, Pavlo Zinchenko Agile software development, Wikipedia (完) 文档信息 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 发表日期: 2019年3月 6日


敏捷开发入门教程

2019-03-06 13:48:41 阮一峰

敏捷开发(agile development)是非常流行的软件开发方法。据统计,2018年90%的软件开发采用敏捷开发。...


#DevOps的前世今生# 3. DevOps 的目标和核心

2019-03-05 01:32:15 李强

在一个组织中,如果相关利益者的利益不一致,在既定流程的进行中一定会碰到诸多阻力。而在这一点上,首先做得就是把 Dev 和 Ops 的利益一致化,从而减少Ops对软件交付的阻力。

tags: DevOps