最近不少用户使用阿里云提供的测试用例出现了被删除了用户目录下的所有文件,项目地址是:
https://github.com/aliyun/aliyun-cli
aliyun-cli/cli/completion_installer_test.go Lines 87 to 99 in 550ccb6
执行测试如果执行到这个用例,就会把本地的 会删除 |

是的,你看到的是一个类似于rm * -rf的操作,目前该问题已经在6小时之前修复了,不过对于已经使用此脚本测试的技术而言已经造成了严重的线上事故。
从github上不小心看到了一些有意思的评论:

目前了解到 这部分测试代码是在添加 autocompletion 功能的时候编写的。编写这段代码的同学自身的环境中没有 .bashrc、. zshrc 文件,没有意识到这个问题。而这部分代码除了在编写这段代码的同学环境中运行外,主要执行环境是 GitHub Actions 等 CI 环境中,因此一直没能发现问题。
因为这部分是测试代码,并没有想到有人去亲自执行该代码。由于最终交付的是 binary 文件,这部分测试代码对最终用户并没有实际影响。当前相关 PR 已经合并解决该问题。从这个结果上我们看到code review的重要性。本文不再引出codereview重要性,如何codereview的话题,只聊聊本次事故的前因后果,以及历史上还有哪些比较著名的因计算机代码bug导致的严重事故:
1.海湾战争爱国者反导弹系统失效事故

第一次海湾战争,一枚伊拉克发射的飞毛腿导弹准确击中美帝的宰赫兰基地炸死28个美国士兵,炸伤100多人,美帝伤亡很大。
按理讲,美帝那时候有反导系统,不应该拦不住导弹,为啥没拦住呢?
后来经过仔细调查,由于一个简单的计算机bug,使基地的爱国者反导弹系统失效,未能在空中拦截飞毛腿导弹。
当时,负责防卫该基地的爱国者反导弹系统经连续工作了100个小时,每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是这个失效悲剧的根源。爱国者反导弹系统的时钟寄存器设计为24位,因而时间的精度也只限于24位的精度。在长时间的工作后,这个微小的精度误差渐渐放大。在工作了100小时后,系统时间的延迟是三分之一秒。
对一般人人来说,0.33秒是微不足道的。但是对一个需要跟踪并摧毁一枚空中飞弹的雷达系统来说,这是灾难性的——侯赛因飞毛腿导弹空速达4.2马赫(每秒1.5公里),这个”微不足道的”0.33秒相当于大约600米的误差。
在宰赫兰导弹事件中,雷达在空中发现了导弹,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导弹并没有发射。
2.欧洲Ariane5运载火箭爆炸事故

1996年, 欧洲 Ariane 5运载火箭,在起飞37秒之后, 爆炸。事故的罪魁祸首是短短的一段代码。
在Ariane 5的软件中,有一部分代码是直接来自它的前辈Ariane 4。由于Ariane 4当时非常成功,所以大家觉得这样做没什么问题,根据新的参数稍微修改一下代码就好了。问题是,修改并不完全。有一行代码需要将64位浮点数转换成16位整数,他们认为不会出现什么问题,所以没有进行修改。也没有测试这段代码。
就是这行代码,因为Ariane 5比前辈Ariane 4强力得多,于是在Ariane 4上没有问题的这行代码,在Ariane 5上发生了溢出错误:那个64位的浮点数代表的数值超出了16位整数可以表达的范围。在出错后,备用代码系统被启动,其中包含着同样的一行代码。结果就是整个系统被锁死了。更为讽刺的是,这行代码所在的函数,对于Ariane 5来说是不必要的。
3.百事可乐420亿美元的bug
1992年5月,百事在菲律宾进行了一次促销活动。该公司告诉客户,如果他们买了一瓶百事可乐,并在瓶盖的底部发现了349号,那么,他们可以赢得100万比索(约等于100万美元)。不幸的是, 由于软件的错误,80万个瓶盖都被错刷成了349,相当于要多支付420亿美元的奖金。这导致一些人将百事公司告上法庭,控诉其支付奖金,而最终百事公司支付了数百万美元的赔偿金,但也使得公司损失惨重。
bug是互联网公司避之不及的事情,但如同墨菲法则一样,该发生的自然会发生。但凡是互联网公司没有经历过bug,是不可能的。
应对bug,要有预案和不定期演练,就像消防练习一样,不发生是好事,而一旦发生,必定会是一次大考。怎样能做到泰山崩于前而面不改色心不跳,迅速制定出合理有效的解决方案,是衡量公司负责人是否称职的一项标准。
4.神曲《江南style》的YouTube之殇

2012年,一首来自韩国的神曲《江南style》火遍了全球,神曲一出,谁与争锋。在YouTube上,《江南style》同样也是异常的火爆,播放量蹭蹭的上涨,直接突破了YouTube最先设定的播放量上限阈值。
YouTube最初的播放量上限设定值为32位整数,也即21,4748,3647。的出现打破了这一数值,造成了YouTube上《江南style》的播放崩溃。针对这一问题,YouTube也及时的做出调整。将播放量的上限由32位整数改为了64位整数。
如今的《江南style》在YouTube上的播放量早已突破40亿,但是突破上限也只是理论上的可能了。
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong
我们正在使用Vagrant进行部署,我们最终希望将此集群部署在Rackspace上。vagrant-rackspace插件是一个自然的选择,但它有一些错误,这些错误未包含在最新的0.1.1版本中(notablythatvagrantprovisiondoesn'twork)。我已经在我的personalfork中解决了这个问题通过合并其他人的工作来对存储库进行改造。是否可以从github安装vagrant插件?显而易见的事情没有奏效:[unix]$vagrantplugininstallvagrant-rackspace--plugin-sourcehttps://github.com
执行rvmlist后,我得到以下输出:rvmrubiesgems[missingbin/ruby]=*ruby-2.0.0-p645[x86_64]ruby-2.1.6[x86_64]ruby-2.2.1[x86_64]gems[missingbin/ruby]是什么意思?gems是某种系统gemset吗?它不是我创建的,我不知道我是否可以或应该删除它。 最佳答案 在我跑完之后:rvmfix-permissions然后我能够卸载具有[缺少bin/ruby]的版本。 关于ruby-如何修复
我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere
我每次打开终端时都会收到这个错误:警告:PATH设置为RVMruby但未设置GEM_HOME和/或GEM_PATH,请参阅:https://github.com/wayneeseguin/rvm/issues/3212这是在我最近安装zsh(oh-my-zsh)后开始发生的我不知道如何设置GEM_HOME和/或GEM_PATH的路径。 最佳答案 我也面临同样的问题,更改.zshrc中的以下行,exportPATH="/usr/local/heroku/bin:.........."到exportPATH="$PATH:/usr/
当我尝试创建一个github问题时,它给出消息未找到回复。以及如何发送身份验证header。因为创建问题需要用户登录或验证curl-XPOST-i-d'{"title":"my-new-repo","body":"mynewissuedescription"}'https://api.github.com/repos/barterli/barter.li/issuesHTTP/1.1404NotFoundServer:GitHub.comDate:Wed,19Feb201407:11:33GMTContent-Type:application/json;charset=utf-8Sta
我有一个依赖于另一个gem的gem(在RubyGems上可用)。那个依赖的gem有一个我最近修复的错误。不幸的是,那个依赖的gem几乎已经死了;它已经很多年没有更新了,而且所有者不再在GitHub上活跃,根本,更不用说提交这个gem了,所以我不希望我的补丁会被接受——肯定不会很快。鉴于此,处理此依赖gem的补丁版本的最佳方法是什么?我是否将它fork并上传一个新的gem(使用新名称)到RubyGems,并依赖它?我是否以某种方式将我的固定版本与我自己的gem打包在一起? 最佳答案 首先,检查有问题的gem的许可证(以及您的代码的许可
我想通过github操作在gem上运行rspec(称之为priv_gem_a)。priv_gem_a依赖于私有(private)存储库中的另一个gem(称之为priv_gem_b)。但是,由于权限无效,我无法捆绑安装priv_gem_b。错误:Fetchinggemmetadatafromhttps://rubygems.org/..........Fetchinggit@github.com:myorg/priv_gem_bHostkeyverificationfailed.fatal:Couldnotreadfromremoterepository.Pleasemakesureyo