跟随,学习,进步

Go 语言 Channel 实现原理精要

2019-03-23 07:06:00 Draveness

Go 语言中的管道 Channel 是一个非常有趣的数据结构,作为语言中一种核心的数据类型,多个 Goroutine 在进行通信时就会使用 Channel 作为中间的通信方式,我们在一节中要介绍的就是 Golang 中 Channel 的实现原理。


社会经济地位(SES):一个比收入更好的用户分类指标

2019-03-22 09:56:11 CDCer

经济水平是公认重要的用户分类指标。本文探索了科研领域受到广泛认可的“社会经济地位”SES在商业上的应用。并主要以CDC与微保联合发布的《2018年互联网保险年度报告》数据证明了SES用于商业研究的价值。

tags: 未分类


每周分享第 48 期

2019-03-22 03:09:06 阮一峰

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 上图是世界最著名的程序员之一:Bill Joy。 四十年前,他20岁出头,在加州大学柏克利分校读研究生,是 Unix 系统 BSD 版本的主要作者之一。因为找不到合适的编辑器,他用一个周末,在 ex 命令的基础上创造了 Vi 编辑器。Unix 系统的 TCP/IP 协议也是他实现的。 28岁时,他与其他人一起创建 Sun 系统公司,担任首席科学家,参与发明了 Java 语言。2003年,49岁时,他从 Sun 公司离职,改为从事风险投资。但是,他不投互联网公司,只投绿色能源,尤其是新型电池。原因是电动汽车大规模推广以后,地球上所有的锂元素制造电池都不够,必须找到新种类的电池。 我觉得,他的人生非常令人羡慕。不是因为取得的成就,而是因为每个人生阶段,他都在干不一样的事情:年轻时是程序员,中年时是科学家,老年时是新能源企业家。美国总统特朗普也是这种情况:年轻时是房地产商,中年时变成电视明星(《学徒》一口气拍了十季),老年时变成了总统。人生就好像一次旅行,不同时期能够从事不同的领域,就好像看到了不同的风景,体验了不一样的人生。 时代在变化,人生的可能性比任何时候都要多,真的没必要,一种职业干到老,多么单调的人生。实际上也不太可能,有人统计2002年的中国500大企业,三分之二以上已经消失或没落了。这么大的公司都撑不久,何况个人呢?我们在规划自己的人生时,应该有这种预见:总有一天,可能是每隔七年,我就会彻底离开现在的领域,在一个不一样的地方,干着自己感兴趣(理想的情况)或者不感兴趣(不理想的情况)的事情。 新闻 1、汽水税 2014年,美国加州伯克利市宣布开征"汽水税",希望降低人们对含糖饮料的消费,因为大量喝含糖饮料会导致肥胖和糖尿病。 四年后,有一项研究发现,2014~2017年期间,该市的汽水销售量减少了52%。2014年之前,伯克利的居民每天平均喝1.25次含糖饮料。2014年之后,每天平均喝0.5次。同一时期,周边城市的汽水消费量则没有明显变化。 2、世界最大的蜜蜂 印度尼西亚北部的一个小岛上,生活着一种世界最大的蜜蜂 Megachile pluto,比普通蜜蜂大四倍。上次人们看到这种蜜蜂,还是在1981年。 2018年3月,一只雌性的此类蜜蜂的新标本,出现在拍卖网站上,以9100美元的价格成交。几个月后,第二个标本出现,售价为4,150美元。科学家非常担忧,一方面印尼的热带雨林正在快速消失,另一方面这么高的拍卖价格,将会加速这种蜜蜂的灭亡。 2019年1月,一支由美国、澳大利亚、加拿大科学家组成的团队,前往寻找这种蜜蜂。在一个小岛上搜寻五天后,终于在离开前一天,他们发现了这种蜜蜂的活体。科学家希望印尼政府对此采取保护措施。 3、仍在使用的寻呼机 上个世纪80年代,手机普及之前,寻呼机曾被广泛使用,目前已经淘汰了。但是,医疗行业仍在使用寻呼机,单单是英国,还有13万台寻呼机在使用中。医疗行业的许多人认为,寻呼机快速可靠,尤其在紧急情况下有重要作用。 相比手机,寻呼机的优点有:(1)医院的手机信号和 Wi-Fi 信号覆盖范围不完整,往往有死角;(2)手机可能会干扰医院设备;(3)寻呼机功能单一,因此更便捷可靠。 4、ARM 芯片的 Mac 有迹象表明,苹果公司可能会在2020年,将 Mac 电脑的 CPU 芯片从 Intel 的 x86 改为 ARM 芯片,主要目的是让 iPhone、iPad 和 Mac 可以运行同一个应用程序。Mac 以前也改过 CPU 芯片,当时是从摩托罗拉的 PowerPC 芯片改成英特尔。 5、转基因蚊子 意大利的一个实验室已经培养出了转基因蚊子。这种蚊子的嘴巴类似于雄蚊子的嘴巴,所以不能咬人,因此无法传播病菌。此外,这种蚊子的生殖器官变形,这意味着它们不能产卵。这些基因改变会传给下一代,这意味着有可能让蚊子灭绝。 实验室还在评估,这种技术是否安全有效。如果确认的话,有朝一日可能会在疟疾盛行的非洲村庄,把它们释放出来,目标是最终让所有的雌蚊子都受到感染。 6、维珍银河的第一位太空乘客 2月22日,英国太空飞机公司维珍银河(Virgin Galactic),搭载了第一位太空乘客,进行了试飞。飞机飞到距离地面90公里的太空,然后安全返回。该公司计划开展太空观光,让游客在太空观看地球,并且体验失重,据称目前已经有600多人报名。 这次的乘客是一名叫做 Beth Moses 的女性,在维珍银河担任太空乘客的培训老师。与她一起上天的还有两名飞行员。下图是飞行过程的示意图。 7、机器人菩萨 2月23日,日本京都的高台寺公开展示了一个机器人菩萨 Kannon,它象征日本的怜悯之神,造价90万美元。该机器人身高1米95,会念《心经》,进行佛教布道。 该机器人内部安装了 Android 系统,它是世界上第一个受到信徒崇拜的机器人。它的左眼安装了一个摄像头,可以移动头部,手臂和躯干。 8、一句话新闻 Gali.com 这个网站每天至少有5000次访问,并且收到几百万封邮件,原因是人们把 gmail 拼错了。 最新研究发现,周末补睡也无法弥补平时缺乏睡眠对健康造成的影响。 特斯拉公司发布新的超级充电桩,充电5分钟可以行驶120公里,使得用户平均减少充电时间50%。 互联网是1989年3月12日由 Tim Berners-Lee 发明的,三十周年纪念日来临之际,谷歌发布了一个纪念 Doodle。 文章 1、异步编程是什么?(英文) 一组系列文章,从操作系统的高度,较为通俗地介绍如何认识异步编程。 2、行内 JS 脚本的堵塞效应(英文) 网页加载 JS 脚本时,允许异步加载脚本(即加上 async 属性),但是行内脚本可以堵塞异步脚本,本文介绍解决方法。 3、Unix 文本操作命令介绍(英文) Unix 命令行有许多操作文本的命令,本文逐一介绍。 4、Python 数据类型简介(英文) 初学者的基础知识文章,介绍和列举 Python 的数据类型。 5、正则表达式为什么不能解析 HTML 网页?(英文) 正则表达式最多只能解析网页的片段,而不可能写出一个基于它的 HTML 解析器。 6、Go 语言编程风格的最佳实践(英文) 作者谈了一些建议,如何编写可维护的 Go 语言代码。 7、橙色的历史(英文) 欧洲人直到16世纪才开始使用这种颜色。橙色象征着生育和富饶,上图是1895年的油画,反映了穿着橙色长袍的青年女性。 8、Beacon:暗网的搜索引擎(英文) 暗网必须在加密条件下才能访问。Beacon 是一个暗网的搜索引擎,允许在正常网络中搜索暗网的信息,该工具目前还没有正式推出,本文只是介绍。 9、网站扩展的图说教程(英文) 本片使用多张图片,通俗地解释如何拓展网站服务,承受更大的访问量。 10、Flexbox 详解(中文) 详细介绍 CSS 的 Flexbox 布局,配有大量图片说明。(@veedrin 投稿) 11、React Router 为什么发布5.0版?(英文) 如果你记不住脱字符( ^ )的作用,下面这起事故会让你记住。react-router 先发了4.4版,但是一个核心衍生库(react-router-dom)的4.3版,依赖错误地写成 "react-router": "^4.3.1" ,与4.4版不兼容导致报错。最后团队决定,撤销4.4版,改发5.0版。 工具 1、github-history 该工具提供一个用户友好的界面,查看某个文件在 GitHub 上面的编辑历史。 2、swc 一个使用 Rust 语言写的 JS 转码器,可以取代 Babel,将 ES6/TS/JSX 代码转成 ES5 代码。 3、miniC-hosting 运行在浏览器里面的 C 语言虚拟机。 4、Search Icons Visually 图标搜索引擎。你上传一个图标,它就返回一系列相似的图标。 5、gitignore.io 生成 gitignore 文件的网站。 6、DeskGap 生成跨平台(Win & Mac)桌面应用的工具,类似 Electron,但是使用了系统内置的 WebView。 7、TLDR 小程序 TLDR 项目移植到小程序,微信查看 Linux 命令。(@zqb-all 投稿) 8、WireGuard for macOS WireGuard 的 Mac 客户端。 9、Sloth Mac 系统的桌面应用,显示当前所有正在运行的进程、打开的文件和系统连接(socket),基本上就是 lsof 命令的图形界面。 10、Marp 跨平台的桌面工具,将 Markdown 文档转成幻灯片。 11、COI - Chat Over IMAP(英文) IMAP 电子邮件协议可以实时推送邮件,COI 就是基于这一点实现的一个聊天协议。通过它的客户端,可以达到聊天效果,但实际是互相发送 Email。 12、coderplanets 小众语言的社区,可以建立各种主题的子社区。CodePlantes 是开源的,服务端使用 Elixir 语言编写。(@mydearxym 投稿) 资源 1、Tracker 服务器列表 BT 下载需要有稳定的 Tracker 服务,该网站收集可用的 Tracker 服务器列表。另外还有一个 GitHub 仓库 ,也是做类似的事情。 2、Treeographer 该网站收集各种著名树木的历史。 3、Our World in Data 该网站收集一些世界性问题的数据,比如人口、健康、食物、能源等等。 4、互动式线性代数教程 基于网页的线性代数教程,有各种互动式图形。 5、Grokking Deep Learning 深度学习入门教材的在线阅读。 6、Marc Andreessen 创业文集 Marc Andreessen 是 Netscape 浏览器创始人,现在是硅谷著名的风险投资家,本书收集了他关于创业的文章。 7、中国独立 iOS 和 macOS 开发者的作品 该仓库收集个人开发者提交的作品。(@Y024 投稿) 8、GeoFS GeoFS是一个免费的在线飞行模拟器,包含全球的真实景色。你只需要一个网页浏览器就能运行它。(@JeremiahZhang 投稿) 文摘 1、微出行的意义 去年,美国开始流行共享电动滑板车和自行车。很多人把它们看作玩具或者一种时尚风潮,但是我认为,这种微出行比自动驾驶的意义更重大。 微出行比汽车出行更清洁、更安全。除了非常便宜,它们将空间和能源的使用效率提升了一个数量级,而且马上就可以部署它们,不用等待新技术普及。这些特点会改变游戏规则,汽车公司花费数十亿美元追求同样的效果,微出行轻松就达到了。 (1)清洁 交通运输占温室气体排放量的28%。微出行可以承担2英里以下的大部分出行,占城市出行的40%,不排放任何温室气体。 更重要的是,它提高了能源效率。汽车内燃机的效率仅为35%,即只有35%的能量可以用于行进,其余部分都是热能损耗。然后,35%的能量里面,只有5%用于移动乘客 - 另外95%用于移动汽车本身。因此,汽车的整体效率为0.05 * 0.35 = 1.75%。这意味着每加仑汽油,只有2盎司用于移动乘客,其余的要么在高温下丢失,要么用来移动你的车。 相比之下,电动滑板车的能源效率是85%,由于它本身重量约为30磅,所以整体能量的70%可以用于移动乘客。这比汽车提高了4000%。 (2)空间 微出行更节省空间。下图是60个人的出行方式,左边是他们全部驾驶汽车占据的空间,右边是他们步行、骑自行车、乘公共汽车占据的空间。 下图是哥本哈根的一所学校,停放汽车和停放自行车的对比。同样的空间,只能停放七八辆汽车,如果改成自行车,可以停放100多辆。 电动滑板车还允许骑车者彼此之间保持较短的安全距离。这两个因素相结合,将导致交通流量增加10倍。 (3)安全 如果城市交通40%变成自行车和电动滑板车,全世界每年可以少死几十万人。 (4)城市面貌 一座充满自行车的城市,远远比充满汽车的城市更适合居住。下图是30年前和现在的丹麦街道的对比,该国大力推广自行车取代汽车。 这些变化不仅仅对城市风貌有影响,还对当地经济产生影响:它增加了客流量和当地企业的收入。这反过来提升了社区的房地产价值。 汽车是将你隔离在车厢里,汽车行业的创新都是使得这个隔离尽可能有效:更好的噪音隔离,更好的防震动,更好的扬声器......微出行是相反的。当你骑滑板车时,你并不与周围空间隔离。驾驶汽车非常无聊,这就是为什么我们要尝试自动化驾驶。骑自行车很有趣 - 当它是电动时更是如此! 我觉得有趣的是,美国人访问欧洲后,歌颂欧洲很迷人,有热闹的街道,然后回到美国,继续建造汽车城市。 我最喜欢的例子是洛杉矶,用约翰列侬的话说,它只是一个"停车场,你可以在那里购买一个去旧金山的汉堡包。"洛杉矶的停车场面积是曼哈顿的四倍多,这个城市很像一个巨大的停车场。 一个外人来到美国城市,感觉就像一个二等公民。因为这些城市明显地是为汽车设计的,不是为行人设计的。走在城里,缺乏视觉多样性,使得行走很无聊,根本无法长时间闲逛,而且长时间在高楼的阴影里也不健康。 (5)成本 微出行的成本远远低于汽车。今天最便宜的交通选择是公共交通,但是仍然存在"最后一英里"的问题,公共汽车到不了许多地点,微出行可以弥补这个缺陷。 本周图片 1、重访 Lena 相隔46年之后,著名的 Lena 重拍了一张当年姿势的照片。那时她21岁,现在67岁。 2、太空殖民的概念图 1970年代,美国宇航局委托物理学家,绘制太空殖民的概念图,1万人左右的太空殖民点可能是什么样子。下面就是当时绘制的一些想象图。 本周金句 1、 云计算领域对于学习者几乎没有进入障碍,只需要一点天生的好奇心。所有云服务都有免费层,优秀的文档,示例项目等,Kubernetes 是免费和开源的。 技术很有趣,你边玩边学,就会得到一份工作。 -- HN 读者留言 2、 如果你每月在 AWS 花费10万美元,亚马逊会向你提供折扣。如果你一个月的花费超过100万美元,他们将不再理会你。因为他们知道你已经被锁在他们的服务里面,去不了别的地方。 -- 《Lambda 和 无服务器将锁定你》 3、 如果你跟风险投资家说,你的项目将使得他们三年内获得3倍的回报,他们可能根本不会进行投资。每年50%的回报率不值得他们花时间。 这是因为所有风投项目如果有1/3提供3倍的回报,其余的都失败了,那么这个风投基金将一无所获。 -- 《我们未能建立一个10亿美元的公司》 4、 我的80多岁的阿姨说,她没有太大困难适应新事物,但是她无法适应旧东西的消失。 -- 《纽约人》杂志 5、 目前,智能手机的平均尺寸是5.5英寸。苹果手机选择更大的屏幕,可能不是一个好主意。因为统计显示,女性拥有 iPhone 的可能性比男性高,而女性的手比男性小。 -- 英国《卫报》 欢迎订阅 这个专栏每周五发布,同步更新在我的个人网站、微信公众号和语雀。 微信搜索"阮一峰的网络日志"或者扫描二维码,即可订阅。 (完) 文档信息 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证) 发表日期: 2019年3月22日


为什么我从 Git Flow 开发模式切换到了 Trunk Based 开发模式?

2019-03-21 16:42:05 周文洋

为什么我从 Git Flow 开发模式切换到了 Trunk Based 开发模式?

tags: DevOps,Git,软件工程


深入了解Azure DevOps团队的开发部署方式

2019-03-21 04:58:24 周文洋

Azure DevOps团队如何使用 "基于主干的分支策略" 来实现Azure DevOps产品的持续快速交付

tags: DevOps,TFS,微软研发云VSTS/TFS,软件工程


写在 Istio 1.1发布时

2019-03-19 23:44:44 宋净超

下面这段是发布说明,来自 Istio 官方博客 https://istio.io/zh/blog/2019/announcing-1.1/,是我翻译的。 Istio


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 的实现原理;哈希表是除了数组之外,最常见的数据结构,几乎所有的语言都会有数组和哈希表这两种集合元素,有的语言将数组实现成列表,有的语言将哈希表称作结构体或者字典,但是它们其实就是两种设计集合元素的思路,数组用于表示一个元素的序列,而哈希表示的是键值对之间映射关系,只是不同语言的叫法和实现稍微有些不同。