IT牛人博客聚合网站 发现IT技术最优秀的内容, 寻找IT技术的价值 http://www.udpwork.com/ zh_CN http://www.udpwork.com/about hourly 1 Mon, 18 Jun 2018 15:30:57 +0800 <![CDATA[iOS Workflow 分享 - Create QR Code]]> http://www.udpwork.com/item/16907.html http://www.udpwork.com/item/16907.html#reviews Sat, 16 Jun 2018 09:00:13 +0800 Cat Chen http://www.udpwork.com/item/16907.html Workflow: Create QR Code

上次我分享了一个Scan QR Code的 Workflow,这次我分享一个正好相反的。如果我要分享一个 URL(或者是一段非常短的文本)给别人,我就可以用这个 Workflow 来生成 QR Code 图片然后发送给别人。

如果你还没有安装Workflow,你可以先去免费下载安装上。然后打开Create QR Code并点击「GET WORKFLOW」,这个 Workflow 就会被自动导入到你的 Workflow 中去,之后你在分享菜单中就可以调用 Workflow 生成 QR Code 图片了。

原理

这是一个超级简单的 Workflow,我们只需要调用「Generate QR Code」这个 action 就能把字符串转为 QR Code 图片。我在分享 QR Code 图片前还加了一个「Quick Look」的 action,让我检查一下这个 QR Code。接着我们就可以把图片分享出去了。

Workflow: Create QR Code

我觉得这个 Workflow 虽然做了它该做的事情,但其实还有很大的优化空间。通常我们需要的不是简单地分享一个 QR Code 图片,而是把 QR Code 嵌入到一张更复杂的图片里去。Workflow 有一定的图片处理功能,需要的话肯定是可以把 QR Code 嵌入到我们挑选的另外一张(或一组)图片里去。

订阅

我之后还会分享更多 Workflow,不想错过的话欢迎通过邮件RSS/Atom订阅我的博客。

]]>
Workflow: Create QR Code

上次我分享了一个Scan QR Code的 Workflow,这次我分享一个正好相反的。如果我要分享一个 URL(或者是一段非常短的文本)给别人,我就可以用这个 Workflow 来生成 QR Code 图片然后发送给别人。

如果你还没有安装Workflow,你可以先去免费下载安装上。然后打开Create QR Code并点击「GET WORKFLOW」,这个 Workflow 就会被自动导入到你的 Workflow 中去,之后你在分享菜单中就可以调用 Workflow 生成 QR Code 图片了。

原理

这是一个超级简单的 Workflow,我们只需要调用「Generate QR Code」这个 action 就能把字符串转为 QR Code 图片。我在分享 QR Code 图片前还加了一个「Quick Look」的 action,让我检查一下这个 QR Code。接着我们就可以把图片分享出去了。

Workflow: Create QR Code

我觉得这个 Workflow 虽然做了它该做的事情,但其实还有很大的优化空间。通常我们需要的不是简单地分享一个 QR Code 图片,而是把 QR Code 嵌入到一张更复杂的图片里去。Workflow 有一定的图片处理功能,需要的话肯定是可以把 QR Code 嵌入到我们挑选的另外一张(或一组)图片里去。

订阅

我之后还会分享更多 Workflow,不想错过的话欢迎通过邮件RSS/Atom订阅我的博客。

]]>
0
<![CDATA[CGO 文章整理]]> http://www.udpwork.com/item/16906.html http://www.udpwork.com/item/16906.html#reviews Fri, 15 Jun 2018 10:53:14 +0800 鸟窝 http://www.udpwork.com/item/16906.html 虽然CGO属于不太常用的技术,但是偶尔在一些场景中还是会用到的,本文搜集了一些CGO的文章, 方便大家学习和参考。

官方文章

相关文章

辅助工具

CGO应用

]]>
虽然CGO属于不太常用的技术,但是偶尔在一些场景中还是会用到的,本文搜集了一些CGO的文章, 方便大家学习和参考。

官方文章

相关文章

辅助工具

CGO应用

]]>
0
<![CDATA[每周分享第 9 期]]> http://www.udpwork.com/item/16905.html http://www.udpwork.com/item/16905.html#reviews Thu, 14 Jun 2018 14:01:28 +0800 阮一峰 http://www.udpwork.com/item/16905.html 这里记录过去一周,我看到的值得分享的东西,每周五发布。

这个周末是端午节,我要陪家人旅行,所以提前一天发布,祝大家端午节快乐。

(题图:星愿公园,上海,2017)

一个网友看了我的新书《未来世界的幸存者》,留言说:"现在已经是未来了,大多数人不知道而已"。这也是我的感受,普通人不知道现在的技术先进到什么地步,很多神话般的功能都已经做到了。

举例来说,我看到一个消息,麻省理工学院发明了一种远程充电技术,可以隔空用无线电波给微型电子设备充电。他们做了一个实验,把传感器埋入一头猪的体内,大约皮下10公分的地方,然后相隔一米发送无线电波,居然就把传感器驱动起来了!

这意味着微型电子设备从此不需要电池了,可以做得很小(比米粒还小),从而能够植入人体,使用的时候,发送电波就行了。以前做不到,是因为无线电波携带的能量非常微弱,又不知道设备的具体位置,没法用来充电。新技术克服了这些难点。

一旦人体可以植入电子设备,不再有充电的难题,那会带来怎样的变革?我的想象力都不够了......以后可能不再需要身份证了,每个人的体内植入私钥,检查身份的时候,一发信号,返回一个私钥签名的证书,只要跟公钥匹配,立刻就验明正身。

新闻

1、飞行800公里的无人驾驶送货飞机

美国一家名叫 Volans-i 的创业公司,开发了一种时速300公里、续航800公里的无人驾驶飞机,主要用来送货,可以负重9公斤。官网介绍是向工厂,医院,建筑工地和海上船舶提供重型零件和设备。

可以想象,收发室以后可以设在楼顶。也没有快递员,无人飞机直接就把货送过来了。

2、桌面 PWA

刚刚发布的 Chrome 67 提供了桌面 PWA 功能,也就是说,可以把网页变成桌面应用,能够离线使用,并且 Windows 和 Mac 都支持。上面图片里的媒体播放器,实际上是一个网页。有了它,Electron 的使用场景大大缩减,可能只剩下读写本地文件。

3、世界最长的航班

新加坡到纽约的航班是世界上最长的航班,连续飞行18小时45分钟。今年10月,新加坡航空公司将重启这条航线。

它会世界上首次使用超远程飞机空客 A350-900 ULR。这种飞机的特点就是很节省燃料,整架飞机使用碳纤维制成,比传统的铝质材料轻,并且只有两台发动机,而不是传统的四台发动机。同时,它最多只能搭载161位乘客,这一方面为了减轻负重,另一方面也是为了提供稍大的座位,毕竟要坐上18个小时。

据说,主要就是因为新飞机省油,才使得这种超远程航线有利可图。

4、CSS 漏洞泄漏用户信息

最近爆出的CSS漏洞窃取用户信息,令人叹为观止。黑客诱导用户访问一个恶意网页,里面嵌入 iframe 加载用户 facebook 主页。然后用一个单像素图片,逐一放在 iframe 的每个像素上面,再使用 mix-blend-mode 的 CSS 设置,根据渲染时间差异,算出原始像素的颜色,20秒可以拿到用户名。

5、以太坊的交易量超过比特币

目前,以太坊的交易量已经占到所有加密货币交易的一半。很多人认为,比特币的地位将越来越衰弱,被其他加密货币取代。

6、Node 创始人否定 Node

Nodejs 的创始人 Ryan Dahl 一共做过两次关于 JS 的公开演讲。 一次是2009年宣布 Node 项目诞生,另一次是九年后的昨天,演讲题目是《Node 的设计失误》。

这个演讲的内容非常火爆,基本上把 Node 全部否定了,认为 libuv 和 npm(包括 package.json)都是设计错误,怪不得 JS 圈里面没人作声。他觉得,Node 已经无药可救了,所以动手写了一个新项目 deno(这个名字是 node 的拆分,表示 node 重组)。

7、史上最大 ICO

据英国《金融时报》网站6月2日报道,通过所谓的首次代币发行(ICO),总部位于开曼群岛的Block.one公司提供EOS代币,换取另一种加密货币以太币。据区块链咨询公司"新魔力"公司提供的数据,以6月1日的兑换率计算,这次发行筹集到了41.5亿美元。Block.one拒绝提供正式交易数据。报道称,为了规避监管障碍,在该公司于1日结束的ICO中,美国公民被禁止参与。

不管加密货币能不能成为真正的货币,只要能够推动金融改革,让投融资变得更加互联网化,它就成功了。

8、微软宣布Visual Studio 2019

微软在宣布收购 GitHub 几天后表示,未来几个月里面,就会发布 Visual Studio 2019。

5月份的 Build 2018 开发者大会上,微软展示了两个新的 Visual Studio 功能:IntelliCode 和 Live Share。前者使用 AI 提供改进代码质量和工作效率的智能建议,后者可让开发人员与团队成员进行实时协作,这些团队成员可以直接从 Visual Studio 和 Visual Studio Code 进行协同编辑和调试。

免费 Python 课程

本期《每周分享》很高兴得到路飞学城www.luffycity.com)的赞助。他们成立于2017年,是老男孩教育的在线教育品牌。

Python 是现在最热门的语言,路飞学城有两门课程,帮助大家学习这门语言。如果你是新手,不知道怎么入门,希望有人能够领一下路,那么可以考虑《Python 开发7天入门特训营》。这门课帮助大家掌握 Python 的基本用法,具备简单的开发能力。

-2869085325200077407.jpg

如果你有 Python 基础,想要用爬虫来做一些有趣的事情,比如:

  • 爬取知乎热门文章并对指定回答批量刷赞
  • 爬取微博热门话题评论并分类分析
  • 爬取58同城批量获取客户的租房需求、联系方式
  • 破解业内通用的图片&滑动验证码
  • 如何应对网站反爬虫策略

《Python爬虫实战集训营》课程就能满足你的需求。该课程从爬虫开发入手,旨在提高学员的 Python 实战能力,在源码级别深度剖析流行的爬虫框架,研究如何提高爬虫性能,并包含防爬策略的解决方法。

4779557561561238374.jpg

最重要的事情放在最后说,上面这两门课程都是免费的! 缴纳99元保证金即可参与,只要完成3次作业和参与直播,提交学习笔记,就可以退还保证金,还可获得《Python全栈开发实战》及内部教材书籍,视频课程、定制文化衫等作为奖励。另外,还会有1对1的导师逐行批改你的代码、讲师3次直播答疑,还有班主任组队小伙伴共同学习。

这两门课都只有 200 个名额,点击这里加入课程的 QQ 群。跟客服说看了阮一峰博客,还可以获得50元课程代金券。

教程

1、[文章]数码照相机如何工作(英文)

本文介绍数码相机 CMOS 芯片的感光原理,彩色的光线是如何变成数字信号的。

2、[游戏]while True: learn()

一个帮助玩家学习人工智能的游戏。你扮演一个人工智能专家,在游戏的引导下解决各种问题。

3、[文章]初学者在 Linux 上安装比特币完整节点指南(2018年版)(英文)

这篇文章教你如何在没有任何 Linux 经验的情况下,全新安装Kubuntu 18.04系统,并在这个系统安装比特币完整节点,加入比特币网络。

4、[视频]计算机科学速成课(英文中字)

志愿者从 Youtube 搬到 B 站的40集视频教程。

5、[仓库]awesome-ruby-china(中文)

Ruby China 论坛的精华贴整理。

6、[PDF]相关系数与余弦相似性(英文)

上面是相关系数的计算公式,这是统计学的基础公式。我一直不知道它是怎么推导出来的,为什么这个公式就能断定两个矢量的相关性,我读过的教科书都不解释这一点。

这里有一篇论文,给出相关系数的十三种解释,但都写得不太容易理解。后来,我又读到了标题里面的那篇论文,指出相关系数就是两个矢量的余弦相似性,所以完全相关是+1或-1,完全不相关是0,一下子就看懂了。

7、[PPT]Docker and Go(英文)

2013年的时候,Docker 团队介绍他们为什么使用 Go 语言写 Docker。

8、[文章]编写 Markdown 解析器(英文)

一组三个部分的系列文章,介绍如何从零开始写一个 Markdown 解析器。作者是用 Ruby 语言实现,但是一些基本知识的介绍跟语言无关,写得挺好的。

资源

1、机器人数据库

Robots   The Old Robots Web Site.png | center | 340x363

这个数据库收集人类历史上生产的各种型号的机器人。

2、[电子书]应用加密法的研究生教材(英文)

这是开源教材,介绍密钥加密的知识。因为是研究生教材,内容不容易。

工具

1、Drawpile

多人实时协同作画的桌面应用。

2、wired-elements

一个有手绘效果的网页组件库。但是,真正特别之处在于它的底层是 Web components,让我们看到了除了React/Vue之外,还有其他的路。

3、black

Python 语言的格式要求特别高,因为它通过缩进判断语法区块。现在有了这个工具,就可以自动化格式化 Python 代码,所以你不用担心写出风格一团糟的代码。

4、sucrase

一个新的 JavaScript 转码器,号称比 Babel 快20倍。

5、deck.gl

Uber 开源的基于地图的数据可视化框架。

6、抖音机器人

作者用 Python + ADB 做的 Bot。它会自动打开 APP 对视频截图,然后请求腾讯的人脸识别 API,当颜值大于门限值BEAUTY_THRESHOLD时,点赞并关注,接着翻到下一页,重复进行该过程。

文摘

1、自媒体创业泡沫消亡史

2012年8月,微信公众号平台诞生。产品经理回忆,当时根本没有布局战略。但是,公众号的发展超乎想象,上线短短数年,就成为国内最大的内容生产和内容分发平台,一个个暴富传奇在公众号平台上诞生。

可是,五年后的今天,公众号的风口似乎已经过去。根据新榜发布的《2017年中国微信500强年报》,公众号整体平均阅读数下降了24%。内容同质化、用户审美疲劳、短视频来势凶猛,自媒体野蛮掘金的时代结束了。

龙泉2014年做"什么值得吃"时,只是一个人凭兴趣一周写两篇,2017年他成立了公司,投入了3个人做新号"马达厨房",图文质量比最初做"什么值得吃"时好得多,但却怎么也做不起来。

胡辛束也面临同样的困境。她们的粉丝数始终无法突破60万,到了2017年,阅读量也开始下滑,拿融资时日均阅读可以达到七八万,年底时头条阅读量仅两三万。

"基本上没有免费的流量可言,再起来的要么就是花钱,要么就是内容实在优质,能够靠文章自然涨粉的非常少,互推也基本上没有效果,因为号实在太多了。"情感大号"入江之鲸"的创始人鲸鱼表示。

2、孙正义:巨变即将到来,感觉睡觉都是浪费时间

2017年7月20日,软银集团董事长孙正义在东京的 SoftBank World 大会的演讲。

他称,这一次的信息革命,会带来一个没人能想象的世界。对于这种巨大的变革,他实在太兴奋,忙到觉得睡觉都是浪费时间。软银把所有的钱都投在新技术上面,他说金额比其他VC的投资总额还要多。

接下来,他就介绍几个他认为最重要的技术领域。

3、压缩空气储存能量(英文)

能量的储存一直是难题。电池技术无法储存大量的能量,而且成本高昂。这篇文章提出,我们可以考虑使用压缩空气来储存能量。

目前,全球99%以上的电力储存都是由抽水蓄能电站完成,在电力富余的时候,将水从较低水库抽到较高水库。但它需要两个垂直分开的大型水体和一个或两个水坝的合适地理位置。它也会淹没大片土地。大多数能够建造的水电站都已经投入使用,这意味着进一步发展的可能性很小。

压缩空气储能被认为是可再生能源电网的重要组成部分,因为它可以大规模储存风力涡轮机和太阳能电池板的剩余电量。相比电池,更可持续,具有更长的预期寿命,更低的生命周期成本,技术简单性和低维护成本。

目前,全世界只有两座大型空气压缩储存工厂:一座在德国,一座建于1979年,另一座在美国,建于1991年。这主要因为压缩空气储能和释放能量时,会有一半的能量损失。抽水蓄能电池的充/放电效率为70-85%,化学电池达到65-90%,但现有压缩空气的工厂,储能效率仅为50%左右。这是因为压缩到高压时,空气温度升高,导致能量变为热量,散发到大气中。

新奇

1、触摸屏笔记本

华硕最新笔记本的触摸板,是一块触摸屏。为什么没有人早点想到这个点子?

每周图片

1、七年前的微信评价

还记得短信流行的年代吗?上面是七年前微信刚刚问世时,用户对它的评价。很多人没有意识到,技术改变的不是产品,而是我们。

2、谷歌总部的大型壁画

第一张图是 G Suite 办公套件,第二张图是谷歌云。

3、学不动了

Node 创始人 ry 发了一个新项目 deno,它是基于 V8 引擎的 TypeScript 运行时(Node 是 JavaScript 运行时)。 结果,一个中国网友跑去,写了上面的留言。 ​​​

本周金句

Mixmax 公司写了一篇文章。他们原先使用 npm 管理 JavaScript 模块,觉得不好就改成了 yarn,后来觉得还是不好,又改回了 npm。

网友的评论:"这就是我喜欢JavaScript的地方:你总是有活要忙。"

欢迎订阅

这个专栏每周五发布,同步更新在我的个人网站微信公众号语雀

微信搜索"阮一峰的网络日志 "或者扫描二维码,即可订阅。

image | left

(完)

文档信息

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

这个周末是端午节,我要陪家人旅行,所以提前一天发布,祝大家端午节快乐。

(题图:星愿公园,上海,2017)

一个网友看了我的新书《未来世界的幸存者》,留言说:"现在已经是未来了,大多数人不知道而已"。这也是我的感受,普通人不知道现在的技术先进到什么地步,很多神话般的功能都已经做到了。

举例来说,我看到一个消息,麻省理工学院发明了一种远程充电技术,可以隔空用无线电波给微型电子设备充电。他们做了一个实验,把传感器埋入一头猪的体内,大约皮下10公分的地方,然后相隔一米发送无线电波,居然就把传感器驱动起来了!

这意味着微型电子设备从此不需要电池了,可以做得很小(比米粒还小),从而能够植入人体,使用的时候,发送电波就行了。以前做不到,是因为无线电波携带的能量非常微弱,又不知道设备的具体位置,没法用来充电。新技术克服了这些难点。

一旦人体可以植入电子设备,不再有充电的难题,那会带来怎样的变革?我的想象力都不够了......以后可能不再需要身份证了,每个人的体内植入私钥,检查身份的时候,一发信号,返回一个私钥签名的证书,只要跟公钥匹配,立刻就验明正身。

新闻

1、飞行800公里的无人驾驶送货飞机

美国一家名叫 Volans-i 的创业公司,开发了一种时速300公里、续航800公里的无人驾驶飞机,主要用来送货,可以负重9公斤。官网介绍是向工厂,医院,建筑工地和海上船舶提供重型零件和设备。

可以想象,收发室以后可以设在楼顶。也没有快递员,无人飞机直接就把货送过来了。

2、桌面 PWA

刚刚发布的 Chrome 67 提供了桌面 PWA 功能,也就是说,可以把网页变成桌面应用,能够离线使用,并且 Windows 和 Mac 都支持。上面图片里的媒体播放器,实际上是一个网页。有了它,Electron 的使用场景大大缩减,可能只剩下读写本地文件。

3、世界最长的航班

新加坡到纽约的航班是世界上最长的航班,连续飞行18小时45分钟。今年10月,新加坡航空公司将重启这条航线。

它会世界上首次使用超远程飞机空客 A350-900 ULR。这种飞机的特点就是很节省燃料,整架飞机使用碳纤维制成,比传统的铝质材料轻,并且只有两台发动机,而不是传统的四台发动机。同时,它最多只能搭载161位乘客,这一方面为了减轻负重,另一方面也是为了提供稍大的座位,毕竟要坐上18个小时。

据说,主要就是因为新飞机省油,才使得这种超远程航线有利可图。

4、CSS 漏洞泄漏用户信息

最近爆出的CSS漏洞窃取用户信息,令人叹为观止。黑客诱导用户访问一个恶意网页,里面嵌入 iframe 加载用户 facebook 主页。然后用一个单像素图片,逐一放在 iframe 的每个像素上面,再使用 mix-blend-mode 的 CSS 设置,根据渲染时间差异,算出原始像素的颜色,20秒可以拿到用户名。

5、以太坊的交易量超过比特币

目前,以太坊的交易量已经占到所有加密货币交易的一半。很多人认为,比特币的地位将越来越衰弱,被其他加密货币取代。

6、Node 创始人否定 Node

Nodejs 的创始人 Ryan Dahl 一共做过两次关于 JS 的公开演讲。 一次是2009年宣布 Node 项目诞生,另一次是九年后的昨天,演讲题目是《Node 的设计失误》。

这个演讲的内容非常火爆,基本上把 Node 全部否定了,认为 libuv 和 npm(包括 package.json)都是设计错误,怪不得 JS 圈里面没人作声。他觉得,Node 已经无药可救了,所以动手写了一个新项目 deno(这个名字是 node 的拆分,表示 node 重组)。

7、史上最大 ICO

据英国《金融时报》网站6月2日报道,通过所谓的首次代币发行(ICO),总部位于开曼群岛的Block.one公司提供EOS代币,换取另一种加密货币以太币。据区块链咨询公司"新魔力"公司提供的数据,以6月1日的兑换率计算,这次发行筹集到了41.5亿美元。Block.one拒绝提供正式交易数据。报道称,为了规避监管障碍,在该公司于1日结束的ICO中,美国公民被禁止参与。

不管加密货币能不能成为真正的货币,只要能够推动金融改革,让投融资变得更加互联网化,它就成功了。

8、微软宣布Visual Studio 2019

微软在宣布收购 GitHub 几天后表示,未来几个月里面,就会发布 Visual Studio 2019。

5月份的 Build 2018 开发者大会上,微软展示了两个新的 Visual Studio 功能:IntelliCode 和 Live Share。前者使用 AI 提供改进代码质量和工作效率的智能建议,后者可让开发人员与团队成员进行实时协作,这些团队成员可以直接从 Visual Studio 和 Visual Studio Code 进行协同编辑和调试。

免费 Python 课程

本期《每周分享》很高兴得到路飞学城www.luffycity.com)的赞助。他们成立于2017年,是老男孩教育的在线教育品牌。

Python 是现在最热门的语言,路飞学城有两门课程,帮助大家学习这门语言。如果你是新手,不知道怎么入门,希望有人能够领一下路,那么可以考虑《Python 开发7天入门特训营》。这门课帮助大家掌握 Python 的基本用法,具备简单的开发能力。

-2869085325200077407.jpg

如果你有 Python 基础,想要用爬虫来做一些有趣的事情,比如:

  • 爬取知乎热门文章并对指定回答批量刷赞
  • 爬取微博热门话题评论并分类分析
  • 爬取58同城批量获取客户的租房需求、联系方式
  • 破解业内通用的图片&滑动验证码
  • 如何应对网站反爬虫策略

《Python爬虫实战集训营》课程就能满足你的需求。该课程从爬虫开发入手,旨在提高学员的 Python 实战能力,在源码级别深度剖析流行的爬虫框架,研究如何提高爬虫性能,并包含防爬策略的解决方法。

4779557561561238374.jpg

最重要的事情放在最后说,上面这两门课程都是免费的! 缴纳99元保证金即可参与,只要完成3次作业和参与直播,提交学习笔记,就可以退还保证金,还可获得《Python全栈开发实战》及内部教材书籍,视频课程、定制文化衫等作为奖励。另外,还会有1对1的导师逐行批改你的代码、讲师3次直播答疑,还有班主任组队小伙伴共同学习。

这两门课都只有 200 个名额,点击这里加入课程的 QQ 群。跟客服说看了阮一峰博客,还可以获得50元课程代金券。

教程

1、[文章]数码照相机如何工作(英文)

本文介绍数码相机 CMOS 芯片的感光原理,彩色的光线是如何变成数字信号的。

2、[游戏]while True: learn()

一个帮助玩家学习人工智能的游戏。你扮演一个人工智能专家,在游戏的引导下解决各种问题。

3、[文章]初学者在 Linux 上安装比特币完整节点指南(2018年版)(英文)

这篇文章教你如何在没有任何 Linux 经验的情况下,全新安装Kubuntu 18.04系统,并在这个系统安装比特币完整节点,加入比特币网络。

4、[视频]计算机科学速成课(英文中字)

志愿者从 Youtube 搬到 B 站的40集视频教程。

5、[仓库]awesome-ruby-china(中文)

Ruby China 论坛的精华贴整理。

6、[PDF]相关系数与余弦相似性(英文)

上面是相关系数的计算公式,这是统计学的基础公式。我一直不知道它是怎么推导出来的,为什么这个公式就能断定两个矢量的相关性,我读过的教科书都不解释这一点。

这里有一篇论文,给出相关系数的十三种解释,但都写得不太容易理解。后来,我又读到了标题里面的那篇论文,指出相关系数就是两个矢量的余弦相似性,所以完全相关是+1或-1,完全不相关是0,一下子就看懂了。

7、[PPT]Docker and Go(英文)

2013年的时候,Docker 团队介绍他们为什么使用 Go 语言写 Docker。

8、[文章]编写 Markdown 解析器(英文)

一组三个部分的系列文章,介绍如何从零开始写一个 Markdown 解析器。作者是用 Ruby 语言实现,但是一些基本知识的介绍跟语言无关,写得挺好的。

资源

1、机器人数据库

Robots   The Old Robots Web Site.png | center | 340x363

这个数据库收集人类历史上生产的各种型号的机器人。

2、[电子书]应用加密法的研究生教材(英文)

这是开源教材,介绍密钥加密的知识。因为是研究生教材,内容不容易。

工具

1、Drawpile

多人实时协同作画的桌面应用。

2、wired-elements

一个有手绘效果的网页组件库。但是,真正特别之处在于它的底层是 Web components,让我们看到了除了React/Vue之外,还有其他的路。

3、black

Python 语言的格式要求特别高,因为它通过缩进判断语法区块。现在有了这个工具,就可以自动化格式化 Python 代码,所以你不用担心写出风格一团糟的代码。

4、sucrase

一个新的 JavaScript 转码器,号称比 Babel 快20倍。

5、deck.gl

Uber 开源的基于地图的数据可视化框架。

6、抖音机器人

作者用 Python + ADB 做的 Bot。它会自动打开 APP 对视频截图,然后请求腾讯的人脸识别 API,当颜值大于门限值BEAUTY_THRESHOLD时,点赞并关注,接着翻到下一页,重复进行该过程。

文摘

1、自媒体创业泡沫消亡史

2012年8月,微信公众号平台诞生。产品经理回忆,当时根本没有布局战略。但是,公众号的发展超乎想象,上线短短数年,就成为国内最大的内容生产和内容分发平台,一个个暴富传奇在公众号平台上诞生。

可是,五年后的今天,公众号的风口似乎已经过去。根据新榜发布的《2017年中国微信500强年报》,公众号整体平均阅读数下降了24%。内容同质化、用户审美疲劳、短视频来势凶猛,自媒体野蛮掘金的时代结束了。

龙泉2014年做"什么值得吃"时,只是一个人凭兴趣一周写两篇,2017年他成立了公司,投入了3个人做新号"马达厨房",图文质量比最初做"什么值得吃"时好得多,但却怎么也做不起来。

胡辛束也面临同样的困境。她们的粉丝数始终无法突破60万,到了2017年,阅读量也开始下滑,拿融资时日均阅读可以达到七八万,年底时头条阅读量仅两三万。

"基本上没有免费的流量可言,再起来的要么就是花钱,要么就是内容实在优质,能够靠文章自然涨粉的非常少,互推也基本上没有效果,因为号实在太多了。"情感大号"入江之鲸"的创始人鲸鱼表示。

2、孙正义:巨变即将到来,感觉睡觉都是浪费时间

2017年7月20日,软银集团董事长孙正义在东京的 SoftBank World 大会的演讲。

他称,这一次的信息革命,会带来一个没人能想象的世界。对于这种巨大的变革,他实在太兴奋,忙到觉得睡觉都是浪费时间。软银把所有的钱都投在新技术上面,他说金额比其他VC的投资总额还要多。

接下来,他就介绍几个他认为最重要的技术领域。

3、压缩空气储存能量(英文)

能量的储存一直是难题。电池技术无法储存大量的能量,而且成本高昂。这篇文章提出,我们可以考虑使用压缩空气来储存能量。

目前,全球99%以上的电力储存都是由抽水蓄能电站完成,在电力富余的时候,将水从较低水库抽到较高水库。但它需要两个垂直分开的大型水体和一个或两个水坝的合适地理位置。它也会淹没大片土地。大多数能够建造的水电站都已经投入使用,这意味着进一步发展的可能性很小。

压缩空气储能被认为是可再生能源电网的重要组成部分,因为它可以大规模储存风力涡轮机和太阳能电池板的剩余电量。相比电池,更可持续,具有更长的预期寿命,更低的生命周期成本,技术简单性和低维护成本。

目前,全世界只有两座大型空气压缩储存工厂:一座在德国,一座建于1979年,另一座在美国,建于1991年。这主要因为压缩空气储能和释放能量时,会有一半的能量损失。抽水蓄能电池的充/放电效率为70-85%,化学电池达到65-90%,但现有压缩空气的工厂,储能效率仅为50%左右。这是因为压缩到高压时,空气温度升高,导致能量变为热量,散发到大气中。

新奇

1、触摸屏笔记本

华硕最新笔记本的触摸板,是一块触摸屏。为什么没有人早点想到这个点子?

每周图片

1、七年前的微信评价

还记得短信流行的年代吗?上面是七年前微信刚刚问世时,用户对它的评价。很多人没有意识到,技术改变的不是产品,而是我们。

2、谷歌总部的大型壁画

第一张图是 G Suite 办公套件,第二张图是谷歌云。

3、学不动了

Node 创始人 ry 发了一个新项目 deno,它是基于 V8 引擎的 TypeScript 运行时(Node 是 JavaScript 运行时)。 结果,一个中国网友跑去,写了上面的留言。 ​​​

本周金句

Mixmax 公司写了一篇文章。他们原先使用 npm 管理 JavaScript 模块,觉得不好就改成了 yarn,后来觉得还是不好,又改回了 npm。

网友的评论:"这就是我喜欢JavaScript的地方:你总是有活要忙。"

欢迎订阅

这个专栏每周五发布,同步更新在我的个人网站微信公众号语雀

微信搜索"阮一峰的网络日志 "或者扫描二维码,即可订阅。

image | left

(完)

文档信息

]]>
0
<![CDATA[修复 Django migration 时遇到的问题]]> http://www.udpwork.com/item/16904.html http://www.udpwork.com/item/16904.html#reviews Wed, 13 Jun 2018 22:52:27 +0800 图拉鼎 http://www.udpwork.com/item/16904.html 今天想给自己的 Blog 加点功能,顺便补上测试,然而第一步在创建测试数据库就过不了,我就尝试解决这个问题。

在跑 ./manage.py test 时,先会创建一个测试用的数据库,这时我遇到了一个问题:

ValueError: Related model 'telegrambot.User' cannot be resolved

这个错误是指,相关的 Model telegrambot.User 无法解析,这是怎么回事?

然后因为 ./manage.py test 根本没有打印出其他有用的信息,我也不知道是发生在哪里的错误,这时我想到了一个办法,就是尝试手动建立一个数据库,叫 test,然后进行 migration:

./manage.py migrate --database test

一跑,终于有详细的输出,定位到了具体出错的那个 Migration。原来是我的一个 App 的 Model 依赖了 telegrambot.User,但是找不到。这是什么原因?

我尝试在 settings.py 的 INSTALLED_APPS 把 telegrambot 的顺序调到前面来,也没有用。于是只好启用 StackoverFlow。

原来是我的那个 App 的 Migration 的 dependencies 没有依赖 telegrambot,于是自然不会去找了。

于是把原来的,加了一行 dependency,再尝试 ./manage.py test,问题解决。

class Migration(migrations.Migration):

    dependencies = [
+        ('telegrambot', '0001_initial'),
        ('powernews', '0004_applenews'),
    ]

总结:有些命令行工具执行出错时,不会有太多有用的输出信息,这时就可以尝试手动去执行一些操作。

本站架设于Linode 东京机房

]]>
今天想给自己的 Blog 加点功能,顺便补上测试,然而第一步在创建测试数据库就过不了,我就尝试解决这个问题。

在跑 ./manage.py test 时,先会创建一个测试用的数据库,这时我遇到了一个问题:

ValueError: Related model 'telegrambot.User' cannot be resolved

这个错误是指,相关的 Model telegrambot.User 无法解析,这是怎么回事?

然后因为 ./manage.py test 根本没有打印出其他有用的信息,我也不知道是发生在哪里的错误,这时我想到了一个办法,就是尝试手动建立一个数据库,叫 test,然后进行 migration:

./manage.py migrate --database test

一跑,终于有详细的输出,定位到了具体出错的那个 Migration。原来是我的一个 App 的 Model 依赖了 telegrambot.User,但是找不到。这是什么原因?

我尝试在 settings.py 的 INSTALLED_APPS 把 telegrambot 的顺序调到前面来,也没有用。于是只好启用 StackoverFlow。

原来是我的那个 App 的 Migration 的 dependencies 没有依赖 telegrambot,于是自然不会去找了。

于是把原来的,加了一行 dependency,再尝试 ./manage.py test,问题解决。

class Migration(migrations.Migration):

    dependencies = [
+        ('telegrambot', '0001_initial'),
        ('powernews', '0004_applenews'),
    ]

总结:有些命令行工具执行出错时,不会有太多有用的输出信息,这时就可以尝试手动去执行一些操作。

本站架设于Linode 东京机房

]]>
0
<![CDATA[WWDC 2018 见闻]]> http://www.udpwork.com/item/16903.html http://www.udpwork.com/item/16903.html#reviews Wed, 13 Jun 2018 18:24:53 +0800 bang http://www.udpwork.com/item/16903.html 第一次去美国参加WWDC,说说见闻。

Keynote

未标题-1今年WWDC亮点较少,感觉一般,点也比较散,是各种小点拼凑,没看到主旋律主方向。

AR占了很大篇幅,是本次WWDC的主角,会场专门有块地方去让参会者玩使用了 ARKit2 新特性多人游戏的《Swift Shot》,现场玩了下,感觉一般般,一种不会火的既视感。苹果大力发展 AR,有意作为下一个大的技术点和平台,猜想应该会有硬件上的配合,现在用 iPad/iPhone 玩 AR 着实别扭,AR 还是需要眼镜的配合才能自然用起来,期待苹果的眼镜。这次 AR 支持的图像跟踪、场景保存和真实光反射,据了解效果确实不错,做 AR 的人都会挺兴奋。

AI 有不小的更新,新的 Create ML 可以更简单地训练 CoreML 模型,以前都是使用其他框架训练后再转换模型跑在 CoreML 上,或者用 Turi Create 去开发。苹果面向开发者的 AI 策略上,走的是傻瓜式路线,不需要懂 AI 相关技术和算法,按规则拖拽就可以使用,只提供有限的常用的几种应用场景,像图像分类,文本分类,特征预测。用迁移学习的方式,在系统内置训练好的模型,用户只需训练最后一层,导致模型很小,很符合移动端应用的场。IDE做得非常好,真是零基础一分钟上手,但问题是无法跨平台,如果 Android 也要用就没辙了,只能用其他框架训练后转换。

iOS12的特性,感觉亮点是防沉迷防打扰,跟微信4.2发布时的“是时候放下手机,跟朋友面对面”这个口号有点像。统计APP使用时间,限制单个APP使用时长,对我来说是很有需求的功能,但对于大众来说不一定,很少人会去限制自己。倒是家长控制这个功能应该会比较受欢迎,人们不喜欢限制自己,但对于限制孩子是喜闻乐见的。新增的各种 notification 的特性确实解决了各种手机打扰的问题,也强调APP不要以拉活为目的去推送消息,而是给用户带来便利和有用信息的目的去推,这些特性是以用户价值为中心去做的。

在美国电视上看到三星S9的广告,肆无忌惮讽刺老 iPhone 慢的问题,加上之前的电池门,导致 iOS12 十分重视针对低端机器的性能优化,性能优化是 iOS12 最早提到的一个点,sharesheet,keyboard打开速度翻倍这些感觉不值一提,比较黑科技的一点是,iOS12可以结合硬件,在APP启动瞬间提高CPU的性能(超频?),提升打开速度,再快速降下去省电,这真是软硬件一体的公司才能做到的优化。

Mac 系统的升级,大篇幅讲黑夜模式,呃可能有需求的人很兴奋,实现工程可能也比较大,但感官上觉得只是个小特性。对开发者来说亮点是将在明年 支持使用部分UIKit的组件去开发mac应用,这样iOS应用就可以低成本迁移到mac了。这是个大工程,目前苹果官方的股票、新闻等 APP 上就尝试用这种方式开发 mac 应用,一套代码服务iOS/iPad/Mac,用内部业务先趟坑,趟得差不多再推出,难怪今年这些APP会大更新,基础的更新需要业务的配合。

其他特性 Animoji,FaceTime,照片,siri shortcut等就不说了,各个Session的细节网上各种翻译文章陆续推出,我也不凑热闹了。

Lab

未标题-2

实际上除了第一天的总结性 keynote 必须朝圣式地在现场听,其他的 Session 分享其实完全没必要在现场,后续自行在网上听是一样的,还可以快进重复自由自在。Session 结束后也没有提问环节,所有的交流都在 lab。所以现场参加 WWDC 的重点只有两个:lab上与苹果员工面对面交流,以及认识其他开发者。我也尝试去lab问了些问题。

审核

有机会面对 AppStore 审核人员,自然要问下 hotpatch 相关的事情。

Lab 上得到的回复并不那么让人满意,主要在重复一点:不能绕过审核。但绕过审核这一点实在很难说清楚,只要有网络,一个请求字段就能改变所有功能绕过审核,没办法说某个技术能不能绕过审核,感觉她自己都绕不过来了。

在另一个较高层的会议上,提到 hotpatch 时得到很感性的答复:We don’t like it。总体听下来感觉,即使 hotpatch 在中国是个强力的需求,但苹果并没有意愿花大精力去满足中国开发者这样的需求,JSPatch 这种权限过大的方案触及安全底线,他们没法去一个个检查是否有做好安全措施,没法检查有没有审核后私自动态调用私有 API,最简单的做法就是一刀切,会一直切下去。

苹果不拒绝动态更新,只要更新的内容跟审核时的内容没有大出入,不是为了绕过审核去做动态更新就可以接受。对于各种新的动态化方案像 RN / Flutter 他们会去评估这些技术有没有风险,会不会被滥用,观察线上 APP 都用它们来做什么,再决定审核措施。

其他一些点:

  1. 审核人员会根据情况对APP进行延迟审核的惩罚,目测是针对故意违反规则或连续违规的 APP。延迟的时间长度没有期限,内部怎么定的时间不透露。
  2. 审核时会横向跟同个账号的其他 APP 做参考,看是否其他 APP 也有违反规则的行为,综合审查。
  3. 一般非常恶劣的情况才会直接对一个 APP 下架,至少会提前一两天通知,一般不用担心审核不通过会影响线上版本。

在 facebook 交流时问了他们怎么应对需要 hotfix 的情况,他们是直接更新版本,若特别紧急的话,有专门对接苹果公司的人可以得到快速审核响应。

TestFlight

我们在公司内部做了 iOS 灰度系统,通过自己的邮箱去收集所有的 TestFlight 的邀请码,再在 APP 内直接给用户使用,做到用户不需要离开 APP 不需要填邮箱就可以参与内测,可以回收邀请码,充分利用 1w 个邀请码。这个最早是QQ邮箱的idea,我们把这个过程自动化了做成系统,所有APP都可以使用,并实现了突破1w个邀请码的限制,后续可以再详细介绍。

这个东西一直没有对外是因为不了解苹果对这种做法的看法,这次在 lab 上问了相关人员,得到的答复是这样做是没有问题的,虽然不推荐,但是是完全允许的。另外因为我们系统请求量大,他们也注意到了,也开始考虑到了中国用户不喜欢用 email,TestFlight 原生满足不了需求,于是他们推出了TestFlight Public Link,可以不需要用户提供 email,直接打开链接就可以匿名参加内测,这个是个很好的改变。不过还没有给出具体上线时间,只是说 This summer。

iTunesConnect (改名 AppStore Connect) 这次开放了不少API,之前做灰度系统很多 API 都是自行在网站上抓包看请求去拿到,没有标准接口,经常有接口更改的风险,这次完善后持续集成会更好了,还支持了linux,不需要搞台mac机器去跑部署了。

Technique lab

跟同事一起去 technique lab 问动态库加载小概率失败的问题,现场上 github 看 dlopen 的源码,得出结论是内存不足,可能是 APP 体积过大导致,没有明确的原因,并喷了一下我们100多M的体积太大了,他们不认为一个 APP 需要做到这么大,我说 FB 更大,他说 FB 是个 bad case 不应该拿来对比,直接喷 FB 的做法非常糟糕,感觉这些专注底层库的哥们对外界业务需求不太了解。

花絮

未标题-3

  1. WWDC 提供的午餐很黑暗,尤其是第一天的汉堡,是我吃过最难吃的,又冷又硬,令人发指。后面几天有鱼排什么的还好接受点,虽然都是冷的。
  2. WWDC 周四有 bash,一个户外聚会和演唱会,效果非常赞,这次演出请了挺有名的 Panic! At The Disco 乐队,很擅长调动气氛,摇滚得很,全场很high,差不多算是 WWDC 的闭幕式了。不过有点尴尬的是因为加州九点才天黑,演唱会全程在阳光下进行,夜生活真是跟加州无关。
  3. 硅谷在残障人士的支持上做得很好,WWDC 都能看到盲人参加,lab 上也有坐轮椅的员工解答问题,看到不止一个。
  4. 苹果的 lab 里有听过年纪较大的程序员在解答问题,目测至少50+,工作就是写代码,据了解是苹果这样的公司才会比较多,像 FB Google 这种主要还是年轻人。
]]>
第一次去美国参加WWDC,说说见闻。

Keynote

未标题-1今年WWDC亮点较少,感觉一般,点也比较散,是各种小点拼凑,没看到主旋律主方向。

AR占了很大篇幅,是本次WWDC的主角,会场专门有块地方去让参会者玩使用了 ARKit2 新特性多人游戏的《Swift Shot》,现场玩了下,感觉一般般,一种不会火的既视感。苹果大力发展 AR,有意作为下一个大的技术点和平台,猜想应该会有硬件上的配合,现在用 iPad/iPhone 玩 AR 着实别扭,AR 还是需要眼镜的配合才能自然用起来,期待苹果的眼镜。这次 AR 支持的图像跟踪、场景保存和真实光反射,据了解效果确实不错,做 AR 的人都会挺兴奋。

AI 有不小的更新,新的 Create ML 可以更简单地训练 CoreML 模型,以前都是使用其他框架训练后再转换模型跑在 CoreML 上,或者用 Turi Create 去开发。苹果面向开发者的 AI 策略上,走的是傻瓜式路线,不需要懂 AI 相关技术和算法,按规则拖拽就可以使用,只提供有限的常用的几种应用场景,像图像分类,文本分类,特征预测。用迁移学习的方式,在系统内置训练好的模型,用户只需训练最后一层,导致模型很小,很符合移动端应用的场。IDE做得非常好,真是零基础一分钟上手,但问题是无法跨平台,如果 Android 也要用就没辙了,只能用其他框架训练后转换。

iOS12的特性,感觉亮点是防沉迷防打扰,跟微信4.2发布时的“是时候放下手机,跟朋友面对面”这个口号有点像。统计APP使用时间,限制单个APP使用时长,对我来说是很有需求的功能,但对于大众来说不一定,很少人会去限制自己。倒是家长控制这个功能应该会比较受欢迎,人们不喜欢限制自己,但对于限制孩子是喜闻乐见的。新增的各种 notification 的特性确实解决了各种手机打扰的问题,也强调APP不要以拉活为目的去推送消息,而是给用户带来便利和有用信息的目的去推,这些特性是以用户价值为中心去做的。

在美国电视上看到三星S9的广告,肆无忌惮讽刺老 iPhone 慢的问题,加上之前的电池门,导致 iOS12 十分重视针对低端机器的性能优化,性能优化是 iOS12 最早提到的一个点,sharesheet,keyboard打开速度翻倍这些感觉不值一提,比较黑科技的一点是,iOS12可以结合硬件,在APP启动瞬间提高CPU的性能(超频?),提升打开速度,再快速降下去省电,这真是软硬件一体的公司才能做到的优化。

Mac 系统的升级,大篇幅讲黑夜模式,呃可能有需求的人很兴奋,实现工程可能也比较大,但感官上觉得只是个小特性。对开发者来说亮点是将在明年 支持使用部分UIKit的组件去开发mac应用,这样iOS应用就可以低成本迁移到mac了。这是个大工程,目前苹果官方的股票、新闻等 APP 上就尝试用这种方式开发 mac 应用,一套代码服务iOS/iPad/Mac,用内部业务先趟坑,趟得差不多再推出,难怪今年这些APP会大更新,基础的更新需要业务的配合。

其他特性 Animoji,FaceTime,照片,siri shortcut等就不说了,各个Session的细节网上各种翻译文章陆续推出,我也不凑热闹了。

Lab

未标题-2

实际上除了第一天的总结性 keynote 必须朝圣式地在现场听,其他的 Session 分享其实完全没必要在现场,后续自行在网上听是一样的,还可以快进重复自由自在。Session 结束后也没有提问环节,所有的交流都在 lab。所以现场参加 WWDC 的重点只有两个:lab上与苹果员工面对面交流,以及认识其他开发者。我也尝试去lab问了些问题。

审核

有机会面对 AppStore 审核人员,自然要问下 hotpatch 相关的事情。

Lab 上得到的回复并不那么让人满意,主要在重复一点:不能绕过审核。但绕过审核这一点实在很难说清楚,只要有网络,一个请求字段就能改变所有功能绕过审核,没办法说某个技术能不能绕过审核,感觉她自己都绕不过来了。

在另一个较高层的会议上,提到 hotpatch 时得到很感性的答复:We don’t like it。总体听下来感觉,即使 hotpatch 在中国是个强力的需求,但苹果并没有意愿花大精力去满足中国开发者这样的需求,JSPatch 这种权限过大的方案触及安全底线,他们没法去一个个检查是否有做好安全措施,没法检查有没有审核后私自动态调用私有 API,最简单的做法就是一刀切,会一直切下去。

苹果不拒绝动态更新,只要更新的内容跟审核时的内容没有大出入,不是为了绕过审核去做动态更新就可以接受。对于各种新的动态化方案像 RN / Flutter 他们会去评估这些技术有没有风险,会不会被滥用,观察线上 APP 都用它们来做什么,再决定审核措施。

其他一些点:

  1. 审核人员会根据情况对APP进行延迟审核的惩罚,目测是针对故意违反规则或连续违规的 APP。延迟的时间长度没有期限,内部怎么定的时间不透露。
  2. 审核时会横向跟同个账号的其他 APP 做参考,看是否其他 APP 也有违反规则的行为,综合审查。
  3. 一般非常恶劣的情况才会直接对一个 APP 下架,至少会提前一两天通知,一般不用担心审核不通过会影响线上版本。

在 facebook 交流时问了他们怎么应对需要 hotfix 的情况,他们是直接更新版本,若特别紧急的话,有专门对接苹果公司的人可以得到快速审核响应。

TestFlight

我们在公司内部做了 iOS 灰度系统,通过自己的邮箱去收集所有的 TestFlight 的邀请码,再在 APP 内直接给用户使用,做到用户不需要离开 APP 不需要填邮箱就可以参与内测,可以回收邀请码,充分利用 1w 个邀请码。这个最早是QQ邮箱的idea,我们把这个过程自动化了做成系统,所有APP都可以使用,并实现了突破1w个邀请码的限制,后续可以再详细介绍。

这个东西一直没有对外是因为不了解苹果对这种做法的看法,这次在 lab 上问了相关人员,得到的答复是这样做是没有问题的,虽然不推荐,但是是完全允许的。另外因为我们系统请求量大,他们也注意到了,也开始考虑到了中国用户不喜欢用 email,TestFlight 原生满足不了需求,于是他们推出了TestFlight Public Link,可以不需要用户提供 email,直接打开链接就可以匿名参加内测,这个是个很好的改变。不过还没有给出具体上线时间,只是说 This summer。

iTunesConnect (改名 AppStore Connect) 这次开放了不少API,之前做灰度系统很多 API 都是自行在网站上抓包看请求去拿到,没有标准接口,经常有接口更改的风险,这次完善后持续集成会更好了,还支持了linux,不需要搞台mac机器去跑部署了。

Technique lab

跟同事一起去 technique lab 问动态库加载小概率失败的问题,现场上 github 看 dlopen 的源码,得出结论是内存不足,可能是 APP 体积过大导致,没有明确的原因,并喷了一下我们100多M的体积太大了,他们不认为一个 APP 需要做到这么大,我说 FB 更大,他说 FB 是个 bad case 不应该拿来对比,直接喷 FB 的做法非常糟糕,感觉这些专注底层库的哥们对外界业务需求不太了解。

花絮

未标题-3

  1. WWDC 提供的午餐很黑暗,尤其是第一天的汉堡,是我吃过最难吃的,又冷又硬,令人发指。后面几天有鱼排什么的还好接受点,虽然都是冷的。
  2. WWDC 周四有 bash,一个户外聚会和演唱会,效果非常赞,这次演出请了挺有名的 Panic! At The Disco 乐队,很擅长调动气氛,摇滚得很,全场很high,差不多算是 WWDC 的闭幕式了。不过有点尴尬的是因为加州九点才天黑,演唱会全程在阳光下进行,夜生活真是跟加州无关。
  3. 硅谷在残障人士的支持上做得很好,WWDC 都能看到盲人参加,lab 上也有坐轮椅的员工解答问题,看到不止一个。
  4. 苹果的 lab 里有听过年纪较大的程序员在解答问题,目测至少50+,工作就是写代码,据了解是苹果这样的公司才会比较多,像 FB Google 这种主要还是年轻人。
]]>
0
<![CDATA[炮打TCP – 关于一而再再而三的粘包拆包问题的大字报]]> http://www.udpwork.com/item/16902.html http://www.udpwork.com/item/16902.html#reviews Wed, 13 Jun 2018 15:05:11 +0800 ideawu http://www.udpwork.com/item/16902.html TCP 所谓的粘包和拆包问题,是技术圈里最奇葩的问题之一!

一而再,再而三,就跟傻逼的中国球迷支持中国足球队一样,前赴后继。有时候同一个人多次在犯同一个错误,有时候是前脚一个犯错了后脚又来一个还犯同样的错。即使是最优秀的程序员,也会在这个问题上面栽跟头,思维甚至很难转过弯,很久才能意识到自己的错误。而低水平的程序员就更不用说了,很多人到死都没有理解这个错误并解决掉,只是逃掉了而已。

我们固然可以认为原因是某些人学艺不精,但那么多的人,其中包括无数的优秀程序员在 TCP 粘包和拆包问题在犯错误,难道我们不能说,这其实是 TCP 自身的原因吗?

在我看来,这个问题的出现,原因就在于 TCP 协议是有原罪的 -- 也就是 TCP 协议所谓的“流式”协议。所以,我要炮轰 TCP!

经过几十年的验证,除了几数几个网络协议会用到 TCP 所谓的流式特性之外,没有任何应用协议使用流式特性。我们必须承认,所有的应用层协议都是基于报文的协议,而不是流式协议。而某些名字中带有”流(Stream)"字样的协议,如 RTP,流媒体等,其本质是无数小体积的报文按顺序拼接而成,根本就和 TCP 的流式没有任何关系!

那么我们就可以确定,数据的本质是报文,流数据是某类报文数据的一种伪称。事实,TCP 的流就是基于 IP 报文的。

因为“流”是一个伪抽象的概念,所以流式协议是违反人的天性和事物的内在逻辑的。万物的本质是报文。这因为如此,”流”所引出的粘包拆包问题,就必然会一而再,再而三,大量地出现。

炮轰之后,我们要怎么解决问题呢?

由于 TCP 协议已经成为事实上的基础,所以淘汰掉 TCP 是不可想象的。我们要做的是,找到正确的编程代码,解决粘包拆包问题。经过无数人的探索,以及无数人一次又一次重复的愚蠢错误的反证,我发现了解决 TCP 粘包和拆包问题只有一条路径,没有第二条!我断言,所有和我的解决方案不同的代码,都是错误的。

彻底解决 TCP 粘包和拆包问题的代码架构如下:

char tmp[];
Buffer buffer;
// 网络循环:必须在一个循环中读取网络,因为网络数据是源源不断的。
while(1){
    // 从TCP流中读取不定长度的一段流数据,不能保证读到的数据是你期望的长度
    tcp.read(tmp);
    // 将这段流数据和之前收到的流数据拼接到一起
    buffer.append(tmp);
    // 解析循环:必须在一个循环中解析报文,应对所谓的粘包
    while(1){
        // 尝试解析报文
        msg = parse(buffer);
        if(!msg){
            // 报文还没有准备好,糟糕,我们遇到拆包了!跳出解析循环,继续读网络。
            break;
        }
        // 将解析过的报文对应的流数据清除
        buffer.remove(msg.length);
        // 业务处理
        process(msg);
    }
}

这段代码是终极地解决 TCP 粘包和拆包问题的代码!

这段代码之所以正确,是因为它包含了两个循环:网络循环和解析循环。

网络循环用于从 TCP socket 中读取流式数据,每一次读取到的数据的长度是不可预期,也就是,读取到的数据长短不一,无法保证,这就是所谓“流式”引出的问题。

而解析循环的功能是从拼接后流数据中,尝试解析出多个报文。注意,是多个报文,不是一个。因为所谓的粘包问题存在,所以可能是多个,而不是一个。如果解析不成功,那说明是遇到了拆包问题,我们继续读网络数据。

你只需要死记硬背上面的正确代码即可。不死记硬背也一样,最终你还是要得出和我相同的结论写出和我一样的代码。那么,何不现在就死记硬背呢?

最后,附上经典的错误代码:

tcp.read(tmp, HEADER_LEN);
header = parse_header(tmp);
tcp.read(tmp, header.body_len);
body = parse(tmp);

这样的代码当然是错误的,这么简单代码怎么可能是对的?如果对了,TCP 还是 TCP 吗?

如果你认为本文有用,请关注这个 GitHub 项目:https://github.com/ideawu/FUCK_TCP让更多人一起炮打 TCP!

该项目还提供了模拟粘包和拆包的代码,你如果不信邪,可以写一个自己的 client 试试。

Related posts:

  1. 关于TCP粘包和拆包的终极解答
  2. 经典的 TCP socket 读取报文错误
  3. 通过 HTTP POST 发送二进制数据
  4. 在Linux进行IO的正确姿势
  5. 使用 Channel 进行可靠传输
]]>
TCP 所谓的粘包和拆包问题,是技术圈里最奇葩的问题之一!

一而再,再而三,就跟傻逼的中国球迷支持中国足球队一样,前赴后继。有时候同一个人多次在犯同一个错误,有时候是前脚一个犯错了后脚又来一个还犯同样的错。即使是最优秀的程序员,也会在这个问题上面栽跟头,思维甚至很难转过弯,很久才能意识到自己的错误。而低水平的程序员就更不用说了,很多人到死都没有理解这个错误并解决掉,只是逃掉了而已。

我们固然可以认为原因是某些人学艺不精,但那么多的人,其中包括无数的优秀程序员在 TCP 粘包和拆包问题在犯错误,难道我们不能说,这其实是 TCP 自身的原因吗?

在我看来,这个问题的出现,原因就在于 TCP 协议是有原罪的 -- 也就是 TCP 协议所谓的“流式”协议。所以,我要炮轰 TCP!

经过几十年的验证,除了几数几个网络协议会用到 TCP 所谓的流式特性之外,没有任何应用协议使用流式特性。我们必须承认,所有的应用层协议都是基于报文的协议,而不是流式协议。而某些名字中带有”流(Stream)"字样的协议,如 RTP,流媒体等,其本质是无数小体积的报文按顺序拼接而成,根本就和 TCP 的流式没有任何关系!

那么我们就可以确定,数据的本质是报文,流数据是某类报文数据的一种伪称。事实,TCP 的流就是基于 IP 报文的。

因为“流”是一个伪抽象的概念,所以流式协议是违反人的天性和事物的内在逻辑的。万物的本质是报文。这因为如此,”流”所引出的粘包拆包问题,就必然会一而再,再而三,大量地出现。

炮轰之后,我们要怎么解决问题呢?

由于 TCP 协议已经成为事实上的基础,所以淘汰掉 TCP 是不可想象的。我们要做的是,找到正确的编程代码,解决粘包拆包问题。经过无数人的探索,以及无数人一次又一次重复的愚蠢错误的反证,我发现了解决 TCP 粘包和拆包问题只有一条路径,没有第二条!我断言,所有和我的解决方案不同的代码,都是错误的。

彻底解决 TCP 粘包和拆包问题的代码架构如下:

char tmp[];
Buffer buffer;
// 网络循环:必须在一个循环中读取网络,因为网络数据是源源不断的。
while(1){
    // 从TCP流中读取不定长度的一段流数据,不能保证读到的数据是你期望的长度
    tcp.read(tmp);
    // 将这段流数据和之前收到的流数据拼接到一起
    buffer.append(tmp);
    // 解析循环:必须在一个循环中解析报文,应对所谓的粘包
    while(1){
        // 尝试解析报文
        msg = parse(buffer);
        if(!msg){
            // 报文还没有准备好,糟糕,我们遇到拆包了!跳出解析循环,继续读网络。
            break;
        }
        // 将解析过的报文对应的流数据清除
        buffer.remove(msg.length);
        // 业务处理
        process(msg);
    }
}

这段代码是终极地解决 TCP 粘包和拆包问题的代码!

这段代码之所以正确,是因为它包含了两个循环:网络循环和解析循环。

网络循环用于从 TCP socket 中读取流式数据,每一次读取到的数据的长度是不可预期,也就是,读取到的数据长短不一,无法保证,这就是所谓“流式”引出的问题。

而解析循环的功能是从拼接后流数据中,尝试解析出多个报文。注意,是多个报文,不是一个。因为所谓的粘包问题存在,所以可能是多个,而不是一个。如果解析不成功,那说明是遇到了拆包问题,我们继续读网络数据。

你只需要死记硬背上面的正确代码即可。不死记硬背也一样,最终你还是要得出和我相同的结论写出和我一样的代码。那么,何不现在就死记硬背呢?

最后,附上经典的错误代码:

tcp.read(tmp, HEADER_LEN);
header = parse_header(tmp);
tcp.read(tmp, header.body_len);
body = parse(tmp);

这样的代码当然是错误的,这么简单代码怎么可能是对的?如果对了,TCP 还是 TCP 吗?

如果你认为本文有用,请关注这个 GitHub 项目:https://github.com/ideawu/FUCK_TCP让更多人一起炮打 TCP!

该项目还提供了模拟粘包和拆包的代码,你如果不信邪,可以写一个自己的 client 试试。

Related posts:

  1. 关于TCP粘包和拆包的终极解答
  2. 经典的 TCP socket 读取报文错误
  3. 通过 HTTP POST 发送二进制数据
  4. 在Linux进行IO的正确姿势
  5. 使用 Channel 进行可靠传输
]]>
0
<![CDATA[我卸载了航旅纵横,只因它搞抖机灵式公关]]> http://www.udpwork.com/item/16901.html http://www.udpwork.com/item/16901.html#reviews Tue, 12 Jun 2018 16:23:00 +0800 魏武挥 http://www.udpwork.com/item/16901.html 航旅这次产品上的这些设计,包括几个部分,不要混在一起说:

第一个部分,所谓私信。航旅辩称有人有需求,想私信别人换个位置啥的。即便是成立,恐怕也是众多私信内容中的一种。有没有可能出现性骚扰私信?航旅至少提供了一个操作的路径,而这种路径是完全可以避免的(这和公交车碰到猥琐大叔不同)。你为什么要默认开放私信呢?

第二个部分,个人主页的标签和热力图展示。这个和私信没什么关系,也没见到航旅有什么辩护。一个用户完全有可能在不知情的情况下,不知道给多少人看过ta的飞行热力图。这张图还可以放大,可以看到你不太经常但的确去过的几个城市。我不知道航旅这种设计处于什么必要。按照楼下有位同学的回答,我引用一下:

按照最高人民法院、最高人民检察院《关于办理侵犯公民个人信息刑事案件适用法律若干问题的解释》第一条规定,“公民个人信息”是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息,包括姓名、身份证件号码、通信通讯联系方式、住址、账号密码、财产状况、行踪轨迹等。
可以说,“行踪轨迹”确实是属于用户个人信息范畴之内,而且也是办理侵犯公民个人信息罪的重要对象。
在这个基础之上,航旅纵横记录了用户的出行轨迹,确实是收集了用户的个人信息,而对于这些个人信息如何使用,应该征得用户的同意。

第三个部分,选座信息,你的选座可以为其他人可见。这当然也是行踪轨迹的一部分。不再赘述。

第四个部分,关于用户的个人主页上的标签和热力图,你是不是一定要和ta同班机选座时才看得到?答案是否。航旅有一个查询航班的功能,点开那个航班,你会看到航班点评。有些热门线路的点评者相当多,点一下头像,就可以看到ta的标签和热力图。

现在来说说其他的。

航旅是一个带有“数据垄断”性质的公司——按照我朋友风端的说法。它这个数据垄断在哪里呢?就是其实它拥有你全部的本国航班的飞行数据(春秋例外)。你要做的事情其实就是一个激活而不是提交。你一旦激活(具体做法就是提交身份证并审核通过,之后航班信息会源源不断。你还可以提交护照/港澳台通行证之类,飞国外/其他地区的航班,也有可能会自动出现),数据就显示在你的界面上。你不激活,不显示,但不等于它没有。

风端的比喻是,公安局的确拥有我大量的数据,现在有一家公司,从公安局那里拿到你的全部数据,你要做的事情其实就是一个激活。

这种公司,获得数据的难度非常低。得来容易,处置起来就有点随心所欲,考虑是相当马虎的。

我是一个航旅的重度用户,已经累积了七十多万公里的里程,号称打败了多少多少用户云云。航旅大部分功能都是做的不错的,我没有什么意见。所以一开始,我并不觉得这件事有多糟糕,可以理解为是一次设计失误。我内心深处希望他们能够撤回这次的这些功能设计,至少做到默认都是关闭的。也就算了。

故而,我那篇文章其实是很客气的,至于“露水炮中介”,我文中也写明的,属于有点开玩笑性质。

但航旅的那封声明——我是写完推送后才看到的——真的把我激怒了。这种抖机灵公关至少对我而言,只有反向作用。

我的另外一位朋友馒头店大师这么说:

自以为是的抖机灵。光把默认选择为“开放”而不是“关闭”就很无耻了。其他很多理由都经不起一驳,包括自己选出来的留言也有很多伪需求。还如果不满意就来应聘产品经理,一副“你行你上”的嘴脸。这不是“暖暖哒”,是脑子发烧了。

我已经卸载了航旅纵横,除非它进行一个正确的道歉。这个正确包括:

1、承认错误,设计失当,隐私部分考虑不周全;

2、撤回功能,至少做到默认关闭,谁喜欢坐个飞机都要social都要显摆(热力图)麻烦谁自己打开去

3、承认昨日的声明不诚恳。

我知道我卸载航旅纵横,它依然在未来可以拥有我的飞行数据,因为那个激活动作是不可逆的。这非常操蛋,我也无能为力。我只能尽我自己最大的可能去表明态度。

 

—— 首发 悟空问答 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

我卸载了航旅纵横,只因它搞抖机灵式公关最先出现在扯氮集

]]>
航旅这次产品上的这些设计,包括几个部分,不要混在一起说:

第一个部分,所谓私信。航旅辩称有人有需求,想私信别人换个位置啥的。即便是成立,恐怕也是众多私信内容中的一种。有没有可能出现性骚扰私信?航旅至少提供了一个操作的路径,而这种路径是完全可以避免的(这和公交车碰到猥琐大叔不同)。你为什么要默认开放私信呢?

第二个部分,个人主页的标签和热力图展示。这个和私信没什么关系,也没见到航旅有什么辩护。一个用户完全有可能在不知情的情况下,不知道给多少人看过ta的飞行热力图。这张图还可以放大,可以看到你不太经常但的确去过的几个城市。我不知道航旅这种设计处于什么必要。按照楼下有位同学的回答,我引用一下:

按照最高人民法院、最高人民检察院《关于办理侵犯公民个人信息刑事案件适用法律若干问题的解释》第一条规定,“公民个人信息”是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息,包括姓名、身份证件号码、通信通讯联系方式、住址、账号密码、财产状况、行踪轨迹等。
可以说,“行踪轨迹”确实是属于用户个人信息范畴之内,而且也是办理侵犯公民个人信息罪的重要对象。
在这个基础之上,航旅纵横记录了用户的出行轨迹,确实是收集了用户的个人信息,而对于这些个人信息如何使用,应该征得用户的同意。

第三个部分,选座信息,你的选座可以为其他人可见。这当然也是行踪轨迹的一部分。不再赘述。

第四个部分,关于用户的个人主页上的标签和热力图,你是不是一定要和ta同班机选座时才看得到?答案是否。航旅有一个查询航班的功能,点开那个航班,你会看到航班点评。有些热门线路的点评者相当多,点一下头像,就可以看到ta的标签和热力图。

现在来说说其他的。

航旅是一个带有“数据垄断”性质的公司——按照我朋友风端的说法。它这个数据垄断在哪里呢?就是其实它拥有你全部的本国航班的飞行数据(春秋例外)。你要做的事情其实就是一个激活而不是提交。你一旦激活(具体做法就是提交身份证并审核通过,之后航班信息会源源不断。你还可以提交护照/港澳台通行证之类,飞国外/其他地区的航班,也有可能会自动出现),数据就显示在你的界面上。你不激活,不显示,但不等于它没有。

风端的比喻是,公安局的确拥有我大量的数据,现在有一家公司,从公安局那里拿到你的全部数据,你要做的事情其实就是一个激活。

这种公司,获得数据的难度非常低。得来容易,处置起来就有点随心所欲,考虑是相当马虎的。

我是一个航旅的重度用户,已经累积了七十多万公里的里程,号称打败了多少多少用户云云。航旅大部分功能都是做的不错的,我没有什么意见。所以一开始,我并不觉得这件事有多糟糕,可以理解为是一次设计失误。我内心深处希望他们能够撤回这次的这些功能设计,至少做到默认都是关闭的。也就算了。

故而,我那篇文章其实是很客气的,至于“露水炮中介”,我文中也写明的,属于有点开玩笑性质。

但航旅的那封声明——我是写完推送后才看到的——真的把我激怒了。这种抖机灵公关至少对我而言,只有反向作用。

我的另外一位朋友馒头店大师这么说:

自以为是的抖机灵。光把默认选择为“开放”而不是“关闭”就很无耻了。其他很多理由都经不起一驳,包括自己选出来的留言也有很多伪需求。还如果不满意就来应聘产品经理,一副“你行你上”的嘴脸。这不是“暖暖哒”,是脑子发烧了。

我已经卸载了航旅纵横,除非它进行一个正确的道歉。这个正确包括:

1、承认错误,设计失当,隐私部分考虑不周全;

2、撤回功能,至少做到默认关闭,谁喜欢坐个飞机都要social都要显摆(热力图)麻烦谁自己打开去

3、承认昨日的声明不诚恳。

我知道我卸载航旅纵横,它依然在未来可以拥有我的飞行数据,因为那个激活动作是不可逆的。这非常操蛋,我也无能为力。我只能尽我自己最大的可能去表明态度。

 

—— 首发 悟空问答 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

我卸载了航旅纵横,只因它搞抖机灵式公关最先出现在扯氮集

]]>
0
<![CDATA[航旅纵横这次大概要做一个露水炮中介?]]> http://www.udpwork.com/item/16898.html http://www.udpwork.com/item/16898.html#reviews Tue, 12 Jun 2018 14:12:01 +0800 魏武挥 http://www.udpwork.com/item/16898.html

最近有一次出差安排,故而再次打开航旅纵横选择座位。

然后我就惊讶地发现,航旅纵横提供了一个….类似露水炮般的中介功能。

这句话有点开玩笑。

但航旅纵横未经我许可,向他人展示我的隐私数据,是板上钉钉的。

这里存在一定风险,望周知。

 

本来我打算一张一张截图来告诉各位到底发生了什么,这里可能会涉及我个人的一些飞行信息,也就顾不得了。

后来我发现南方都市报援引公号航空物语的署名小雨的一篇文章,也讲了这个事,那我就省事了。

航旅纵横,正在把你的私密信息暴露给陌生人!

该文说到的情况:

1、你在选座的时候可以看到其他人的选座信息;

2、点击这个人的ID,可以来到这个人的个人主页;

3、主页上有可能会展示出类似“70后”、“金牛座”、“偏好东航”、“过道派”、“上海”这些标签;

4、主页上还必定展示一张热力图,能够显示你经常去什么城市。热力图可以放大,能够展示出你不那么经常但的确也去过那么几次的城市;

5、有一个私信按钮,你可以和这个人聊天;

6、以上情况属实。

不过关于文中说找不到如何关闭自己的信息这一点,我倒是找到了。

用户其实是可以关闭自己的所谓轨迹图和标签的,也可以关闭私信功能。

路径是这样的:

个人中心——第一栏自己的头像栏——然后就会看到“我的标签”和“我的热力图”,可以关闭。

航旅纵横这次大概要做一个露水炮中介?

但这不影响对航旅纵横“泄露用户信息”的指控。

 

首先,你的选座信息是向他人开放的,别人知道这个ID选择了那个位置,还可以点击这个ID来到你的个人主页。

其次,你个人主页上的标签和热力图是默认开放的,也就是说,在未经用户许可的情况下,该用户这部分信息向他人开放了。

再次,很有可能这种开放还是不知情的。

最后,航旅纵横提供了一个会被私信的通道——私信默认也是开放的。

而我出于好奇又琢磨了一下,似乎航旅并没有建立一个所谓好友的设计机制。

于是,我才会得出这样有点开玩笑的结论:航旅是想做露水炮的皮条中介么?

 

这些向他人开放的信息敏感么?

不得不说,对于大部分人来说,可能也不算太敏感。热力图并不是那张你自己可以看到的飞行轨迹图,是有一点抽象的。

标签上泄露了什么星座,喜欢坐过道还是靠窗,诸如此类,算特别敏感么?

好像也谈不上。

但你舒服么?

至少我不舒服。

尤其是这个默认开放的私信通道,让我更不舒服。

我即便和认识的人一块坐飞机,都懒得和别人聊天。什么狗屁选座还要社交。。。

李彦宏在年头公开说:

中国人对隐私问题的态度更加开放,相对来说也没那么敏感。如果他们可以用隐私换取便利、安全或者效率,在很多情况下他们就愿意这么做。

引来一波群嘲。

我当时写了一篇文章,大实话未必等于是正确的话,何况未必是实话,文中有这样的话:

理论上讲,一个会涉及到用户私隐的公司,就应该按照这个用户群体中最敏感的人那些标准(比如我),而不是按照最不敏感的人的标准(比如门口那个保安)。

这个道理,似乎中国很多互联网公司的产品设计人员不明白。

 

航旅纵横的背后,是中国民航信息网络股份有限公司,而这家公司,按照那位小雨的说法:

中航信是中国民航的唯一数据服务公司,所有中国的航空公司(春秋航空除外)都使用中航信的离港、订座系统服务,你删了APP也无法删除你的注册信息。

是不是唯一我不知道,但它的确掌握了除春秋航空外所有国内航空公司的飞行信息。我用过飞常准,感觉它的信息有时候比飞常准更准确(飞常准有时候会漏掉我的国内航班)。

可以这么说,除非我飞春秋航空,我的飞行信息全部交给了这样一家公司。

今天它搞一个什么选座社交,天晓得明天它还会搞什么泄露我更多的信息。

它的产品经理乃至管理高层团队毫无隐私的观念,缺乏对隐私的认知。

还能信任它么?

 

滴滴顺风车,司机乘客互评且为他人能看见,背后的逻辑,我是想得明白的。

顺风嘛,我是帮忙性质的顺带赚点小钱,司机当然可以挑客。所以要了解别的司机眼中这个乘客啥样的,也不能说毫无必要。

只是如何了解,这个可以改进。顺风车现在选用标签式而不是填空式,可能解决方式更好。

但我真得死活想不出,这个选座社交的出发点在哪里。如果谁坐个飞机都那么寂寞非要社交,就应该设计成默认关闭,谁爱用谁用去。

有可能,就是设计人员脑子进水了。

也有可能,它真想做一个露水炮皮条客?

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

航旅纵横这次大概要做一个露水炮中介?最先出现在扯氮集

]]>

最近有一次出差安排,故而再次打开航旅纵横选择座位。

然后我就惊讶地发现,航旅纵横提供了一个….类似露水炮般的中介功能。

这句话有点开玩笑。

但航旅纵横未经我许可,向他人展示我的隐私数据,是板上钉钉的。

这里存在一定风险,望周知。

 

本来我打算一张一张截图来告诉各位到底发生了什么,这里可能会涉及我个人的一些飞行信息,也就顾不得了。

后来我发现南方都市报援引公号航空物语的署名小雨的一篇文章,也讲了这个事,那我就省事了。

航旅纵横,正在把你的私密信息暴露给陌生人!

该文说到的情况:

1、你在选座的时候可以看到其他人的选座信息;

2、点击这个人的ID,可以来到这个人的个人主页;

3、主页上有可能会展示出类似“70后”、“金牛座”、“偏好东航”、“过道派”、“上海”这些标签;

4、主页上还必定展示一张热力图,能够显示你经常去什么城市。热力图可以放大,能够展示出你不那么经常但的确也去过那么几次的城市;

5、有一个私信按钮,你可以和这个人聊天;

6、以上情况属实。

不过关于文中说找不到如何关闭自己的信息这一点,我倒是找到了。

用户其实是可以关闭自己的所谓轨迹图和标签的,也可以关闭私信功能。

路径是这样的:

个人中心——第一栏自己的头像栏——然后就会看到“我的标签”和“我的热力图”,可以关闭。

航旅纵横这次大概要做一个露水炮中介?

但这不影响对航旅纵横“泄露用户信息”的指控。

 

首先,你的选座信息是向他人开放的,别人知道这个ID选择了那个位置,还可以点击这个ID来到你的个人主页。

其次,你个人主页上的标签和热力图是默认开放的,也就是说,在未经用户许可的情况下,该用户这部分信息向他人开放了。

再次,很有可能这种开放还是不知情的。

最后,航旅纵横提供了一个会被私信的通道——私信默认也是开放的。

而我出于好奇又琢磨了一下,似乎航旅并没有建立一个所谓好友的设计机制。

于是,我才会得出这样有点开玩笑的结论:航旅是想做露水炮的皮条中介么?

 

这些向他人开放的信息敏感么?

不得不说,对于大部分人来说,可能也不算太敏感。热力图并不是那张你自己可以看到的飞行轨迹图,是有一点抽象的。

标签上泄露了什么星座,喜欢坐过道还是靠窗,诸如此类,算特别敏感么?

好像也谈不上。

但你舒服么?

至少我不舒服。

尤其是这个默认开放的私信通道,让我更不舒服。

我即便和认识的人一块坐飞机,都懒得和别人聊天。什么狗屁选座还要社交。。。

李彦宏在年头公开说:

中国人对隐私问题的态度更加开放,相对来说也没那么敏感。如果他们可以用隐私换取便利、安全或者效率,在很多情况下他们就愿意这么做。

引来一波群嘲。

我当时写了一篇文章,大实话未必等于是正确的话,何况未必是实话,文中有这样的话:

理论上讲,一个会涉及到用户私隐的公司,就应该按照这个用户群体中最敏感的人那些标准(比如我),而不是按照最不敏感的人的标准(比如门口那个保安)。

这个道理,似乎中国很多互联网公司的产品设计人员不明白。

 

航旅纵横的背后,是中国民航信息网络股份有限公司,而这家公司,按照那位小雨的说法:

中航信是中国民航的唯一数据服务公司,所有中国的航空公司(春秋航空除外)都使用中航信的离港、订座系统服务,你删了APP也无法删除你的注册信息。

是不是唯一我不知道,但它的确掌握了除春秋航空外所有国内航空公司的飞行信息。我用过飞常准,感觉它的信息有时候比飞常准更准确(飞常准有时候会漏掉我的国内航班)。

可以这么说,除非我飞春秋航空,我的飞行信息全部交给了这样一家公司。

今天它搞一个什么选座社交,天晓得明天它还会搞什么泄露我更多的信息。

它的产品经理乃至管理高层团队毫无隐私的观念,缺乏对隐私的认知。

还能信任它么?

 

滴滴顺风车,司机乘客互评且为他人能看见,背后的逻辑,我是想得明白的。

顺风嘛,我是帮忙性质的顺带赚点小钱,司机当然可以挑客。所以要了解别的司机眼中这个乘客啥样的,也不能说毫无必要。

只是如何了解,这个可以改进。顺风车现在选用标签式而不是填空式,可能解决方式更好。

但我真得死活想不出,这个选座社交的出发点在哪里。如果谁坐个飞机都那么寂寞非要社交,就应该设计成默认关闭,谁爱用谁用去。

有可能,就是设计人员脑子进水了。

也有可能,它真想做一个露水炮皮条客?

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

航旅纵横这次大概要做一个露水炮中介?最先出现在扯氮集

]]>
0
<![CDATA[并非扯淡180611]]> http://www.udpwork.com/item/16899.html http://www.udpwork.com/item/16899.html#reviews Tue, 12 Jun 2018 14:10:50 +0800 魏武挥 http://www.udpwork.com/item/16899.html 今日份并非扯淡

“头腾大战”的核心是公共利益

公号:新闻实验室;作者:方可成

标题我并不同意,因为这不是核心。头疼大战的核心当然是今日头条与腾讯的商业利益争夺。

但正如我在头疼大战,一场短视频刺刀见红的白刃战中所写的,这场大战倒是带出两个真问题。其中一个问题就是方可成这篇文章提及的。

关于我的地盘我做主这件事,方可成这篇探讨得更理性。网络中立原则主要针对美国运营商,后者也是企业,也没到任一运营商已经垄断全美市场。网络中立原则其中提到不得进行价格歧视,运营商要求价格歧视有木有道理呢?其实也得有他们道理的。多用多付费(单价更高)在很多场合都看得到,凭啥我运营商不可以。网络中立原则还提到了服务接入问题。

像微信这种,当然现在还不能叫运营商(英文叫ISP,在中国腾讯只能叫ICP,但在欧洲,这种平台也叫ISP,所以全球不统一有争议)但要不要它也网络中立一下呢?毕竟“基础设施服务商”这几个字你当年也是标榜过的。你占了基础这个底层买卖,要不要尽中立这个义务呢?这是很复杂的辩题,不是几句煽情话和我的地盘我做主那么简单的。说起来,网络中立原则美国人好像也是吵了有年头的,并不是几篇文章的事儿,当下在川普执掌美国大权的情况下,的确在去年被废弃。

方可成这篇文章过于理性,毫无情感色彩,所以访问量目前8000都不到。

头疼大战另外引发的一个真问题是这样的,我在刷屏里这么说:

公号航通社的作者书航在他的文章电头,没作者,低级错误:“新华网批腾讯”为何如此奇怪?里提及了如何识别正宗官媒的一些原则。

但即便出处很正宗,的确是官媒,商业公司又何尝不会利用标题来干点路人皆知的事呢?

同一个出处,同一篇文章,标题修改,真可谓煞费苦心。

裂变!裂变!这里有一份完整的微信流量“薅羊毛”指南

公号:阿辩论  作者:辩手李慕阳

算是一份如何搞一个营销活动然后刷屏的指南。

小结得还是蛮好的,我就不多说什么了,可以点击过去看。

访问目前刚刚过一万,一周前的文章,所以我觉得还是覆盖不够。好东西应该给更多人看到不是。

2018新媒体运营观察报告:运营使不上力?那是你姿势不对丨【芒种·报告】

公号:腾讯媒体研究院  作者:腾讯媒体研究院&新榜

没什么,我就是觉得PPT做得蛮好看的。

游戏策划:为什么我的儿子不沉迷游戏?

公号:岛上十点   作者:乔治王

作者声称自己是专业的其资深的搞游戏策划,如果属实,那么,游戏的确就是想勾引你上瘾的——这一点游戏从业者确认了。

不过,作者还是声称,如果家庭能够起到好的引导作用,那么,孩子上瘾的可能性就不是那么大了。

但这件事的纠结之处在于,今天的白领阶层,早就不再是朝九晚五。实际情况是,他们可能压根没空。

做父母真不容易。

读完我就这么一个感慨。

两万字长文深度揭秘 Amazon 千亿营收的增长黑客策略

公号:增长官研究院    作者:Sumo

其实这样的文章,应该是老外写的,所谓的原创“1k”应该是“译者”。本文原标题是How Amazon Generates $136 Billion In Sales

我这里先说一个八卦。

百度魏则西事件之后,曾经非常小范围地邀请过几个KOL去和李彦宏当面交流。李彦宏在承认对关键词广告的审核需要加强力度之余,还叹了一个审核难度实在太大的苦经:你们知道光京东一家就在百度上买了多少关键词么?***个!(***表示一个非常惊人的数字,我就不透露了)

在这篇文章里,你们也会看到,亚马逊是如何投放谷歌的。

这篇文章讲的道理是值得借鉴的,但一定要结合实际情况借鉴。因为亚马逊在中国,实在是做得太糟糕了。

亚马逊中国之惑

公号:财经天下周刊  作者:谭文琦

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

在“刷屏”app(或者服务号刷屏pro)中,我还间或会对一些文章有些絮絮叨叨的看法,欢迎扫描二维码免费使用刷屏

并非扯淡180611最先出现在扯氮集

]]>
今日份并非扯淡

“头腾大战”的核心是公共利益

公号:新闻实验室;作者:方可成

标题我并不同意,因为这不是核心。头疼大战的核心当然是今日头条与腾讯的商业利益争夺。

但正如我在头疼大战,一场短视频刺刀见红的白刃战中所写的,这场大战倒是带出两个真问题。其中一个问题就是方可成这篇文章提及的。

关于我的地盘我做主这件事,方可成这篇探讨得更理性。网络中立原则主要针对美国运营商,后者也是企业,也没到任一运营商已经垄断全美市场。网络中立原则其中提到不得进行价格歧视,运营商要求价格歧视有木有道理呢?其实也得有他们道理的。多用多付费(单价更高)在很多场合都看得到,凭啥我运营商不可以。网络中立原则还提到了服务接入问题。

像微信这种,当然现在还不能叫运营商(英文叫ISP,在中国腾讯只能叫ICP,但在欧洲,这种平台也叫ISP,所以全球不统一有争议)但要不要它也网络中立一下呢?毕竟“基础设施服务商”这几个字你当年也是标榜过的。你占了基础这个底层买卖,要不要尽中立这个义务呢?这是很复杂的辩题,不是几句煽情话和我的地盘我做主那么简单的。说起来,网络中立原则美国人好像也是吵了有年头的,并不是几篇文章的事儿,当下在川普执掌美国大权的情况下,的确在去年被废弃。

方可成这篇文章过于理性,毫无情感色彩,所以访问量目前8000都不到。

头疼大战另外引发的一个真问题是这样的,我在刷屏里这么说:

公号航通社的作者书航在他的文章电头,没作者,低级错误:“新华网批腾讯”为何如此奇怪?里提及了如何识别正宗官媒的一些原则。

但即便出处很正宗,的确是官媒,商业公司又何尝不会利用标题来干点路人皆知的事呢?

同一个出处,同一篇文章,标题修改,真可谓煞费苦心。

裂变!裂变!这里有一份完整的微信流量“薅羊毛”指南

公号:阿辩论  作者:辩手李慕阳

算是一份如何搞一个营销活动然后刷屏的指南。

小结得还是蛮好的,我就不多说什么了,可以点击过去看。

访问目前刚刚过一万,一周前的文章,所以我觉得还是覆盖不够。好东西应该给更多人看到不是。

2018新媒体运营观察报告:运营使不上力?那是你姿势不对丨【芒种·报告】

公号:腾讯媒体研究院  作者:腾讯媒体研究院&新榜

没什么,我就是觉得PPT做得蛮好看的。

游戏策划:为什么我的儿子不沉迷游戏?

公号:岛上十点   作者:乔治王

作者声称自己是专业的其资深的搞游戏策划,如果属实,那么,游戏的确就是想勾引你上瘾的——这一点游戏从业者确认了。

不过,作者还是声称,如果家庭能够起到好的引导作用,那么,孩子上瘾的可能性就不是那么大了。

但这件事的纠结之处在于,今天的白领阶层,早就不再是朝九晚五。实际情况是,他们可能压根没空。

做父母真不容易。

读完我就这么一个感慨。

两万字长文深度揭秘 Amazon 千亿营收的增长黑客策略

公号:增长官研究院    作者:Sumo

其实这样的文章,应该是老外写的,所谓的原创“1k”应该是“译者”。本文原标题是How Amazon Generates $136 Billion In Sales

我这里先说一个八卦。

百度魏则西事件之后,曾经非常小范围地邀请过几个KOL去和李彦宏当面交流。李彦宏在承认对关键词广告的审核需要加强力度之余,还叹了一个审核难度实在太大的苦经:你们知道光京东一家就在百度上买了多少关键词么?***个!(***表示一个非常惊人的数字,我就不透露了)

在这篇文章里,你们也会看到,亚马逊是如何投放谷歌的。

这篇文章讲的道理是值得借鉴的,但一定要结合实际情况借鉴。因为亚马逊在中国,实在是做得太糟糕了。

亚马逊中国之惑

公号:财经天下周刊  作者:谭文琦

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人

在“刷屏”app(或者服务号刷屏pro)中,我还间或会对一些文章有些絮絮叨叨的看法,欢迎扫描二维码免费使用刷屏

并非扯淡180611最先出现在扯氮集

]]>
0
<![CDATA[特征定义表单]]> http://www.udpwork.com/item/16897.html http://www.udpwork.com/item/16897.html#reviews Mon, 11 Jun 2018 20:48:25 +0800 hizhou http://www.udpwork.com/item/16897.html A.1  特征定义表单

名称:<标准的特征名称>

同义词:<名称> [FROM <源名称>]

可以定义一个或多个同义词,并且可以可选地包括每个名称的来源。

描述:
<特征的文字描述>
包含<要素名称> [{可选 | 替代}]

这些信息显示了功能的层次结构,并且可以用图形表示。

资源:
<信息源>

此信息用于生成功能目录。
此处包括从中派生出该特征的信息源(例如,标准,教科书,现有系统)。

类型:{编译时 | 加载时 | 运行时 }

[与互斥:<特征名称>]

[强制使用:<特征名称>]

]]>
A.1  特征定义表单

名称:<标准的特征名称>

同义词:<名称> [FROM <源名称>]

可以定义一个或多个同义词,并且可以可选地包括每个名称的来源。

描述:
<特征的文字描述>
包含<要素名称> [{可选 | 替代}]

这些信息显示了功能的层次结构,并且可以用图形表示。

资源:
<信息源>

此信息用于生成功能目录。
此处包括从中派生出该特征的信息源(例如,标准,教科书,现有系统)。

类型:{编译时 | 加载时 | 运行时 }

[与互斥:<特征名称>]

[强制使用:<特征名称>]

]]>
0
<![CDATA[公关圈需要一个崔永元]]> http://www.udpwork.com/item/16896.html http://www.udpwork.com/item/16896.html#reviews Mon, 11 Jun 2018 18:47:36 +0800 魏武挥 http://www.udpwork.com/item/16896.html

和某厂的公关喝咖啡。

算是熟悉的一个人,加之是私下聊天,所以聊得比较开。

说起和竞对(竞争对手)的口水互喷,也是一脸无奈。

我说你怎么知道那个稿子是竞对买来的黑稿呢?她说我有证据啊。

合同?这种事不太会有合同吧。走账凭证?你拿到竞对买黑稿的走账凭证?我难以想象。

不过自家买了黑稿,自家心里总是有数的。

这位公关并不想打公关战,这事挺没劲的,劳心劳力不说,其实效果也就那么回事。

但对手要打,我也只好咬牙奉陪不是。

我没和她竞对公关喝咖啡,但我想,她的对手大概也是这么想的。

你抡我一拳,我只好踢回你一脚。你都拿起刀了,我也只好操起板斧了不是。

典型的囚徒困境。

 

几年前,我说公关不是那么重要时,第一财经看热闹不嫌事儿大,还专门组织了一场我和姐夫李就公关到底重要不重要的电视辩论。

姐夫李那一方,有三个队友。

其中一个是哲基的王虎。

王虎当时发言,有两个point,我印象深刻,至今记得。

1、我不主张公关战;

2、我不主张转危为机。

第二个观点,与本文关系不大,这里稍稍解释一下:有错误就认错,不要想着什么法儿在舆论上把坏事变好事——请注意在舆论上这三个字。我蛮同意王虎这个看法的。通常这样干,就是抖着机灵耍着把戏自以为是自作聪明地秀着智商。

第一个观点。或许可以反映公关从业者的想法,至少是一种态度。

王虎是乙方,乙方至少在台面上,都不主张打公关战。

 

公关战很没劲。

写文章分析公关战的打法,就更没劲了。

拼命吹捧自己那不叫公关战,既然叫了个“战”字,总是要攻击一下对手。

一打公关战,负面稿——有时候就叫黑稿——是必选项,规定动作。

外围吃瓜看热闹,搞观察搞分析的,压根就不晓得这些规定动作是怎么操作的,最多也就是听了一嘴。

A公司告诉你那篇文章是竞对B公司买的,你就信?

当最基本的出发点是暧昧不清的时候,你分析得头头是道的,是不是有一种莫名的喜剧感?

有些分析文章,还喜欢用这样的话:先不说这个事谁对谁错,我就分析一下双方打法孰高孰低。

相当多的公关行为,其效果很难评估,居然在边上看着,刷几篇文章,听一些来路不清的说法,就能断言高低了,也是牛逼。

 

媒体人去分析一家公司的公关行为,都挺没劲的——我也干过回头看看特没劲的事。

比如联想那档子事,我看到过很多自媒体写文章说联想柳传志那个危机公关行为如何如何。

柳传志什么人?

说他一句商业传奇不为过,如果想做柳黑,也可以用“老狐狸”来形容。

为什么这么说呢?

联想当年做了什么业绩都是第二位的,你去翻翻当年那些想把企业转制的,都什么下场就明白了。

所以老狐狸不懂的事,你懂?

还有一些说公司公关不行的行为,实质上是站这个公司竞对的队。这本身就是一种套路。大家都不是傻子。

我可没说黑稿。

因为我也没实锤证据不是。

但我说一句没劲,主观意思表达,还是可以的。

 

我有理由推想,大部分公关从业者都不喜欢公关战。

有一小撮例外,这些人通常都是想在老板面前刷存在感,证明自己还挺牛逼的。

黑稿满天飞,除了靠这个赚钱吃饭的媒体或自媒体,谁乐意看到。

所以,我和我这位公关朋友咖啡喝着喝着,冒出了这么一句话:

大概,公关圈也需要一个一抽屉买稿凭证的崔永元吧。

我做不来这样的人,所以我对崔永元这一波diss,到目前为止,总体是站他的。

好吧,我有点“送死你去”的意思。

实在是小老百姓一个,发点牢骚罢了。

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人。

公关圈需要一个崔永元最先出现在扯氮集

]]>

和某厂的公关喝咖啡。

算是熟悉的一个人,加之是私下聊天,所以聊得比较开。

说起和竞对(竞争对手)的口水互喷,也是一脸无奈。

我说你怎么知道那个稿子是竞对买来的黑稿呢?她说我有证据啊。

合同?这种事不太会有合同吧。走账凭证?你拿到竞对买黑稿的走账凭证?我难以想象。

不过自家买了黑稿,自家心里总是有数的。

这位公关并不想打公关战,这事挺没劲的,劳心劳力不说,其实效果也就那么回事。

但对手要打,我也只好咬牙奉陪不是。

我没和她竞对公关喝咖啡,但我想,她的对手大概也是这么想的。

你抡我一拳,我只好踢回你一脚。你都拿起刀了,我也只好操起板斧了不是。

典型的囚徒困境。

 

几年前,我说公关不是那么重要时,第一财经看热闹不嫌事儿大,还专门组织了一场我和姐夫李就公关到底重要不重要的电视辩论。

姐夫李那一方,有三个队友。

其中一个是哲基的王虎。

王虎当时发言,有两个point,我印象深刻,至今记得。

1、我不主张公关战;

2、我不主张转危为机。

第二个观点,与本文关系不大,这里稍稍解释一下:有错误就认错,不要想着什么法儿在舆论上把坏事变好事——请注意在舆论上这三个字。我蛮同意王虎这个看法的。通常这样干,就是抖着机灵耍着把戏自以为是自作聪明地秀着智商。

第一个观点。或许可以反映公关从业者的想法,至少是一种态度。

王虎是乙方,乙方至少在台面上,都不主张打公关战。

 

公关战很没劲。

写文章分析公关战的打法,就更没劲了。

拼命吹捧自己那不叫公关战,既然叫了个“战”字,总是要攻击一下对手。

一打公关战,负面稿——有时候就叫黑稿——是必选项,规定动作。

外围吃瓜看热闹,搞观察搞分析的,压根就不晓得这些规定动作是怎么操作的,最多也就是听了一嘴。

A公司告诉你那篇文章是竞对B公司买的,你就信?

当最基本的出发点是暧昧不清的时候,你分析得头头是道的,是不是有一种莫名的喜剧感?

有些分析文章,还喜欢用这样的话:先不说这个事谁对谁错,我就分析一下双方打法孰高孰低。

相当多的公关行为,其效果很难评估,居然在边上看着,刷几篇文章,听一些来路不清的说法,就能断言高低了,也是牛逼。

 

媒体人去分析一家公司的公关行为,都挺没劲的——我也干过回头看看特没劲的事。

比如联想那档子事,我看到过很多自媒体写文章说联想柳传志那个危机公关行为如何如何。

柳传志什么人?

说他一句商业传奇不为过,如果想做柳黑,也可以用“老狐狸”来形容。

为什么这么说呢?

联想当年做了什么业绩都是第二位的,你去翻翻当年那些想把企业转制的,都什么下场就明白了。

所以老狐狸不懂的事,你懂?

还有一些说公司公关不行的行为,实质上是站这个公司竞对的队。这本身就是一种套路。大家都不是傻子。

我可没说黑稿。

因为我也没实锤证据不是。

但我说一句没劲,主观意思表达,还是可以的。

 

我有理由推想,大部分公关从业者都不喜欢公关战。

有一小撮例外,这些人通常都是想在老板面前刷存在感,证明自己还挺牛逼的。

黑稿满天飞,除了靠这个赚钱吃饭的媒体或自媒体,谁乐意看到。

所以,我和我这位公关朋友咖啡喝着喝着,冒出了这么一句话:

大概,公关圈也需要一个一抽屉买稿凭证的崔永元吧。

我做不来这样的人,所以我对崔永元这一波diss,到目前为止,总体是站他的。

好吧,我有点“送死你去”的意思。

实在是小老百姓一个,发点牢骚罢了。

 

—— 首发 扯氮集 ——

作者执教于上海交通大学媒体与传播学院,天奇创投基金管理合伙人。

公关圈需要一个崔永元最先出现在扯氮集

]]>
0
<![CDATA[为 Nginx 启用带请求消耗时间的 access log]]> http://www.udpwork.com/item/16900.html http://www.udpwork.com/item/16900.html#reviews Mon, 11 Jun 2018 17:30:06 +0800 图拉鼎 http://www.udpwork.com/item/16900.html 我是用 Nginx 作为 Proxy 来跑 Web Server 的,最近想做一件事情,就是 Profile 一下我的 Web Server 的运行状况,其中一个基本的点就是:性能。在参考了一些资料后,我打算先从 Web Server 的请求时间做起来。

默认情况下,Nginx 的 access log 是不会显示请求时间(request time)的,这需要我们给它的配置文件自定义一下 log format。

编辑 /etc/nginx/nginx.conf,在 http 那块配置里面,加上如下代码:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  ' 
                                                 '"$request" $status $body_bytes_sent '
                                                 '"$http_referer" "$http_user_agent" $request_time';

然后,在具体的 nginx server 配置里的 access_log 后面,加上一句 timed_combined 即可:

access_log /path/to/access.log timed_combined;

这样,在 access_log 的最后一行,就会出现 0.xxx (单位秒)的数据出现,代表 Nginx 从收到客户端请求、到发送完响应的整个时间,叫request_time

于是这里会有一个问题冒出来,如果 Nginx 本身接受用户请求花了比较久的时间,比如用户 POST 比较大的文件数据,那么少说得好几秒吧,这时 request_time 就反应不了后端 Upstream 的运行情况了。所以这里建议再同时启用一个:upstream_response_time

这个 upstream_response_time 很明白,就是在 Nginx 接受完 client 的请求后,再和 upstream server 请求的过程,这个指标才能真正反应 upstream server 的响应情况,虽然通常它的值会和 request_time 一样,但是也强烈建议加上。

所以新的 log_format 如下:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  ' 
                                                 '"$request" $status $body_bytes_sent '
                                                 '"$http_referer" "$http_user_agent" $request_time $upstream_response_time';

加好以后,来软启动一下 Nginx,以下 tip 复制自 Nginx 官网Log Rotation

$ mv access.log access.log.0
$ kill -USR1 `cat master.nginx.pid`
$ sleep 1
$ gzip access.log.0    # do something with access.log.0

最后,等新的 access.log 产生以后,过个一段时间,你就可以用来分析 Web Server 的性能了。

本站架设于Linode 东京机房

]]>
我是用 Nginx 作为 Proxy 来跑 Web Server 的,最近想做一件事情,就是 Profile 一下我的 Web Server 的运行状况,其中一个基本的点就是:性能。在参考了一些资料后,我打算先从 Web Server 的请求时间做起来。

默认情况下,Nginx 的 access log 是不会显示请求时间(request time)的,这需要我们给它的配置文件自定义一下 log format。

编辑 /etc/nginx/nginx.conf,在 http 那块配置里面,加上如下代码:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  ' 
                                                 '"$request" $status $body_bytes_sent '
                                                 '"$http_referer" "$http_user_agent" $request_time';

然后,在具体的 nginx server 配置里的 access_log 后面,加上一句 timed_combined 即可:

access_log /path/to/access.log timed_combined;

这样,在 access_log 的最后一行,就会出现 0.xxx (单位秒)的数据出现,代表 Nginx 从收到客户端请求、到发送完响应的整个时间,叫request_time

于是这里会有一个问题冒出来,如果 Nginx 本身接受用户请求花了比较久的时间,比如用户 POST 比较大的文件数据,那么少说得好几秒吧,这时 request_time 就反应不了后端 Upstream 的运行情况了。所以这里建议再同时启用一个:upstream_response_time

这个 upstream_response_time 很明白,就是在 Nginx 接受完 client 的请求后,再和 upstream server 请求的过程,这个指标才能真正反应 upstream server 的响应情况,虽然通常它的值会和 request_time 一样,但是也强烈建议加上。

所以新的 log_format 如下:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  ' 
                                                 '"$request" $status $body_bytes_sent '
                                                 '"$http_referer" "$http_user_agent" $request_time $upstream_response_time';

加好以后,来软启动一下 Nginx,以下 tip 复制自 Nginx 官网Log Rotation

$ mv access.log access.log.0
$ kill -USR1 `cat master.nginx.pid`
$ sleep 1
$ gzip access.log.0    # do something with access.log.0

最后,等新的 access.log 产生以后,过个一段时间,你就可以用来分析 Web Server 的性能了。

本站架设于Linode 东京机房

]]>
0
<![CDATA[猜想:为什么 QR Code 在中日韩如此流行]]> http://www.udpwork.com/item/16895.html http://www.udpwork.com/item/16895.html#reviews Mon, 11 Jun 2018 15:23:00 +0800 Cat Chen http://www.udpwork.com/item/16895.html 为什么 QR Code 在中日韩的流行程度比在欧美地区高得多?我觉得要理解这个问题必须先理解 QR Code 本身解决的是什么问题。

难题 1:输入法

我觉得 QR Code 解决的第一个大问题源自中日韩对输入法的依赖。假设你刚刚认识了新的朋友,要加对方微信或 Facebook,这时候你如何找到对方呢?你可以问「你叫什么啊」,然后搜索对应的名字或 ID。(有些平台的用户更多选择使用真名,而另外一些则主要使用 ID,不同人的选择也不一样。)如果是中文名的话,你很可能就需要问对方具体是哪几个字,因为同音字太常见了,接着你需要正确地使用输入法输入这几个字,然后才能找到你要加的人。用英文的话,常见名字如果不是变体的话美国人一般都能拼出来,不需要问怎么拼。英文键盘直接输入就能进行搜索,不需要使用输入法。

中日韩输入成本之高,使得使用 QR Code 有明显优势。打开摄像头然后扫描对方屏幕其实并不快,如果好像英文那样听完自然能拼写正确,QR Code 并没有优势。但是需要区分同音字和使用输入法这两件事情使得 QR Code 的使用成本比输入中日韩要低。

当然,所有这些输入方式都在不停地得到改进,所以这并不一定是永恒不变的。中文输入法变得越来越智能,整词整句识别和模糊拼音提高了输入效率。中文搜索也在变得越来越智能,即使有个别错别字也能找到正确的结果。类似的改进在英文中同样出现了,而且不会比中文差。QR Code 扫描的性能也在得到提升,摄像头启动的速度和识别 QR Code 的速度都在变得越来越快。最终是否会出现一种输入方式能够超过 QR Code,这很难说。(我觉得语音有可能成为超越 QR Code 的输入方式。假设我对着你的手机说出我的名字就能让你搜索到我,这个过程比扫描 QR Code 还要快。)

难题 2:连接实体物品

QR Code 解决的第二大问题是如何连接那些没有具体名字的实体物品。一台打印机,甚至是一瓶水,在系统上都可以分配一个唯一 ID 给它,但让人输入这个唯一 ID 就不那么方便了。

人们想过用不同的方法来解决这个问题:

  • 蓝牙 :这需要双方都有蓝牙芯片,要求每一瓶水上都有蓝牙芯片是不可能的,因为成本太高了。而且蓝牙的搜索范围太广,很容易搜索到周边的物品。
  • NFC :这解决了蓝牙搜索方位太广的问题,成本也稍微低一些,而且其中一方不需要主动供电,等待扫描就可以了。这其实能够解决一部分问题,但因为 Apple 一直拒绝在 iOS 设备上加入 NFC API 而难以得到推广。
  • QR Code :这是成本最低的方案,任何人都可以拿一张纸打印个 QR Code,或者在设备屏幕上显示 QR Code。因为现在的设备都用摄像头,并且提供 API 允许任何人调用,不会出现好像 Apple 拒绝开放 NFC API 这样的障碍。

我们可以看到 QR Code 虽然是制作成本最低的方案,但不是使用起来最便捷的。NFC 的便利性可以比 QR Code 更好,但是因为 iOS 上的限制导致无法进一步普及,大家被迫使用 QR Code。如果有一天 Apple 开放 NFC API,NFC 有可能能够迅速普及开来。

跟输入法一样,解决这个问题的技术手段也在不停地进步。如果有一天设备的视觉识别能力足够好,QR Code 就不需要存在了,应用直接识别摄像头看到的实体物品就可以了。就算退一步来看,如果存在一种人手写写画画就能实现的 QR Code,例如说用我的笔迹写我的名字就能识别到是我,那也有可能能取代 QR Code。

总结

QR Code 解决的是标识输入(identification input)的问题。当我在应用内需要正确输入一个人(添加好友)、一家商店(支付)或一张优惠券(打折)的标识时,QR Code 是其中一种解决方案。其他替代解决方案的成本都更高,在中日韩尤其高,所以 QR Code 在中日韩迅速流行起来。

这意味着什么?

  1. 如果出现新的技术,能够使得标识输入的成本进一步降低,明显低于现在 QR Code 的成本,新技术可以逐步取代 QR Code。(Apple 开放 NFC API 也属于这种情况。)
  2. 如果新技术一直不出现,QR Code 是会逐渐在欧美和其他地区流行起来的,因为 QR Code 在某些应用场景还是比其他方案有优势,只是没有在中日韩那么明显而已。

最后,如果你喜欢我的文章的话,欢迎通过邮件RSS/Atom订阅我的博客。

]]>
为什么 QR Code 在中日韩的流行程度比在欧美地区高得多?我觉得要理解这个问题必须先理解 QR Code 本身解决的是什么问题。

难题 1:输入法

我觉得 QR Code 解决的第一个大问题源自中日韩对输入法的依赖。假设你刚刚认识了新的朋友,要加对方微信或 Facebook,这时候你如何找到对方呢?你可以问「你叫什么啊」,然后搜索对应的名字或 ID。(有些平台的用户更多选择使用真名,而另外一些则主要使用 ID,不同人的选择也不一样。)如果是中文名的话,你很可能就需要问对方具体是哪几个字,因为同音字太常见了,接着你需要正确地使用输入法输入这几个字,然后才能找到你要加的人。用英文的话,常见名字如果不是变体的话美国人一般都能拼出来,不需要问怎么拼。英文键盘直接输入就能进行搜索,不需要使用输入法。

中日韩输入成本之高,使得使用 QR Code 有明显优势。打开摄像头然后扫描对方屏幕其实并不快,如果好像英文那样听完自然能拼写正确,QR Code 并没有优势。但是需要区分同音字和使用输入法这两件事情使得 QR Code 的使用成本比输入中日韩要低。

当然,所有这些输入方式都在不停地得到改进,所以这并不一定是永恒不变的。中文输入法变得越来越智能,整词整句识别和模糊拼音提高了输入效率。中文搜索也在变得越来越智能,即使有个别错别字也能找到正确的结果。类似的改进在英文中同样出现了,而且不会比中文差。QR Code 扫描的性能也在得到提升,摄像头启动的速度和识别 QR Code 的速度都在变得越来越快。最终是否会出现一种输入方式能够超过 QR Code,这很难说。(我觉得语音有可能成为超越 QR Code 的输入方式。假设我对着你的手机说出我的名字就能让你搜索到我,这个过程比扫描 QR Code 还要快。)

难题 2:连接实体物品

QR Code 解决的第二大问题是如何连接那些没有具体名字的实体物品。一台打印机,甚至是一瓶水,在系统上都可以分配一个唯一 ID 给它,但让人输入这个唯一 ID 就不那么方便了。

人们想过用不同的方法来解决这个问题:

  • 蓝牙 :这需要双方都有蓝牙芯片,要求每一瓶水上都有蓝牙芯片是不可能的,因为成本太高了。而且蓝牙的搜索范围太广,很容易搜索到周边的物品。
  • NFC :这解决了蓝牙搜索方位太广的问题,成本也稍微低一些,而且其中一方不需要主动供电,等待扫描就可以了。这其实能够解决一部分问题,但因为 Apple 一直拒绝在 iOS 设备上加入 NFC API 而难以得到推广。
  • QR Code :这是成本最低的方案,任何人都可以拿一张纸打印个 QR Code,或者在设备屏幕上显示 QR Code。因为现在的设备都用摄像头,并且提供 API 允许任何人调用,不会出现好像 Apple 拒绝开放 NFC API 这样的障碍。

我们可以看到 QR Code 虽然是制作成本最低的方案,但不是使用起来最便捷的。NFC 的便利性可以比 QR Code 更好,但是因为 iOS 上的限制导致无法进一步普及,大家被迫使用 QR Code。如果有一天 Apple 开放 NFC API,NFC 有可能能够迅速普及开来。

跟输入法一样,解决这个问题的技术手段也在不停地进步。如果有一天设备的视觉识别能力足够好,QR Code 就不需要存在了,应用直接识别摄像头看到的实体物品就可以了。就算退一步来看,如果存在一种人手写写画画就能实现的 QR Code,例如说用我的笔迹写我的名字就能识别到是我,那也有可能能取代 QR Code。

总结

QR Code 解决的是标识输入(identification input)的问题。当我在应用内需要正确输入一个人(添加好友)、一家商店(支付)或一张优惠券(打折)的标识时,QR Code 是其中一种解决方案。其他替代解决方案的成本都更高,在中日韩尤其高,所以 QR Code 在中日韩迅速流行起来。

这意味着什么?

  1. 如果出现新的技术,能够使得标识输入的成本进一步降低,明显低于现在 QR Code 的成本,新技术可以逐步取代 QR Code。(Apple 开放 NFC API 也属于这种情况。)
  2. 如果新技术一直不出现,QR Code 是会逐渐在欧美和其他地区流行起来的,因为 QR Code 在某些应用场景还是比其他方案有优势,只是没有在中日韩那么明显而已。

最后,如果你喜欢我的文章的话,欢迎通过邮件RSS/Atom订阅我的博客。

]]>
0
<![CDATA[iOS Workflow 分享 - Scan QR Code]]> http://www.udpwork.com/item/16894.html http://www.udpwork.com/item/16894.html#reviews Mon, 11 Jun 2018 14:19:08 +0800 Cat Chen http://www.udpwork.com/item/16894.html Workflow: Scan Code

很多时候我们无意识地用微信扫描一个 QR Code,然后无论打开的是什么我们用就是了。我经常会好奇到底 QR Code 编码的是什么信息,到底是一个 ID 呢,还是一个 URL(可能是 deeplink)呢,还是一个 JSON 呢。所以我做了这个简单的 Workflow,先把 QR Code 的纯文本内容显示出来,然后再让我选择使用哪个 app 来接收这个字符串。如果这个字符串是 URL,Workflow 会提示我用浏览器打开,我也可以用 Opener 来打开 deeplink。

如果你还没有安装Workflow,你可以先去免费下载安装上。然后打开Scan QR Code并点击「GET WORKFLOW」,这个 Workflow 就会被自动导入到你的 Workflow 中去,然后你就可以调用它来扫描 QR Code 了。

此外顺便推荐一下上面提到那个叫做Opener的 app。它做的事情很简单,你给它一个网站的 URL,如果那个网站有对应的 app 的话,它会尝试通过 deeplink 在 app 里面打开这个 URL 对应的内容。举个例子,我在 Mobile Safari 上打开了一个知乎的问题,然后我可以把这个网页的 URL 发送给 Opener 让它帮我打开知乎 app 且在知乎 app 内打开同一个问题。

原理

这个 Workflow 最重要的 action 是第一步,利用「Scan QR/Bar Code」把 QR Code 扫描出来。这一个 action 会返回 QR Code 本后编码的字符串,然后我们把它存到Content变量中去。

Workflow: Scan Code

接下来「Get URLs from Input」这个 action 可以把Content中看似 URL 的内容提取出来,因此如果Content是 URL 我们就会得到 URL 否则就没有内容。为了验证 URL 提取成功,检查提出出来的内容包含://,如果有的话那就一定是 URL 了,否则就是非 URL 的文本。

对于 URL,我提供 5 个操作的选项;对于非 URL,只有其中的 2 个。然后下面是根据用户作出的选择,执行 5 个操作之一:

  1. 打开(仅限 URL):使用 iOS 系统方式打开这个 URL。如果这是个 deeplink 或者 Universal Link,那就会在对应的 app 中打开。
  2. 在 Chrome 中打开(仅限 URL):因为我用 Chrome for iOS 而非 Mobile Safari,所以我会对普通网页使用这个选项。
  3. 在 Opener 中打开(仅限 URL):如果我想尝试用这个网页对应的 app 打开的话。我在 Opener 中设置了如果找不到对应的 app 就默认提示我用 Chrome 打开。
  4. 复制:复制字符串。
  5. 分享:调用系统的分享功能。

订阅

我之后还会分享更多 Workflow,不想错过的话欢迎通过邮件RSS/Atom订阅我的博客。

]]>
Workflow: Scan Code

很多时候我们无意识地用微信扫描一个 QR Code,然后无论打开的是什么我们用就是了。我经常会好奇到底 QR Code 编码的是什么信息,到底是一个 ID 呢,还是一个 URL(可能是 deeplink)呢,还是一个 JSON 呢。所以我做了这个简单的 Workflow,先把 QR Code 的纯文本内容显示出来,然后再让我选择使用哪个 app 来接收这个字符串。如果这个字符串是 URL,Workflow 会提示我用浏览器打开,我也可以用 Opener 来打开 deeplink。

如果你还没有安装Workflow,你可以先去免费下载安装上。然后打开Scan QR Code并点击「GET WORKFLOW」,这个 Workflow 就会被自动导入到你的 Workflow 中去,然后你就可以调用它来扫描 QR Code 了。

此外顺便推荐一下上面提到那个叫做Opener的 app。它做的事情很简单,你给它一个网站的 URL,如果那个网站有对应的 app 的话,它会尝试通过 deeplink 在 app 里面打开这个 URL 对应的内容。举个例子,我在 Mobile Safari 上打开了一个知乎的问题,然后我可以把这个网页的 URL 发送给 Opener 让它帮我打开知乎 app 且在知乎 app 内打开同一个问题。

原理

这个 Workflow 最重要的 action 是第一步,利用「Scan QR/Bar Code」把 QR Code 扫描出来。这一个 action 会返回 QR Code 本后编码的字符串,然后我们把它存到Content变量中去。

Workflow: Scan Code

接下来「Get URLs from Input」这个 action 可以把Content中看似 URL 的内容提取出来,因此如果Content是 URL 我们就会得到 URL 否则就没有内容。为了验证 URL 提取成功,检查提出出来的内容包含://,如果有的话那就一定是 URL 了,否则就是非 URL 的文本。

对于 URL,我提供 5 个操作的选项;对于非 URL,只有其中的 2 个。然后下面是根据用户作出的选择,执行 5 个操作之一:

  1. 打开(仅限 URL):使用 iOS 系统方式打开这个 URL。如果这是个 deeplink 或者 Universal Link,那就会在对应的 app 中打开。
  2. 在 Chrome 中打开(仅限 URL):因为我用 Chrome for iOS 而非 Mobile Safari,所以我会对普通网页使用这个选项。
  3. 在 Opener 中打开(仅限 URL):如果我想尝试用这个网页对应的 app 打开的话。我在 Opener 中设置了如果找不到对应的 app 就默认提示我用 Chrome 打开。
  4. 复制:复制字符串。
  5. 分享:调用系统的分享功能。

订阅

我之后还会分享更多 Workflow,不想错过的话欢迎通过邮件RSS/Atom订阅我的博客。

]]>
0
<![CDATA[为什么云计算服务是亚马逊先做出来?]]> http://www.udpwork.com/item/16893.html http://www.udpwork.com/item/16893.html#reviews Mon, 11 Jun 2018 11:25:43 +0800 四火 http://www.udpwork.com/item/16893.html Image result for aws google cloud azure最近看了一个知乎的帖子,大家讨论为什么是Amazon先把云计算服务做出来,而不是Google。类似的问题我遇到过好几次了,之前还在亚马逊的时候,我觉得利益相关等等原因,自己不太适合回答这个问题;而现在,又看到各路人马大神已经把这个问题从各个角度分析得底朝天了,于是觉得似乎又没有太大必要了。不过现在,回头看到这个帖子的时候,我还想再从我的视角总结总结,不只是为什么Amazon先把云服务做出来,还有为什么现在它可以一路领先。虽然说Google也是云服务的三驾马车之一(另两驾是Amazon和微软),但如今许多方面它都和另两驾还有不少的差距。我记得刚加入Oracle的时候,但凡听说我从Amazon来,就理所当然地assume我来自AWS,足见其在业界AWS的影响力之巨。而事实上,Amazon的范畴远比AWS大,而且AWS也是这些年才火起来的。

首先,最本质的一点,是深入到公司DNA中务实的文化,而DNA的形成发展,来自于残酷的发展环境。简单而不准确地说,Google是精英文化,而Amazon是实用文化。Google的广告业务太赚钱了,搜索引擎的广告是互联网最著名的印钞机。多数情况下,这当然是好事,但是当一个业务太赚钱了以后,公司就没法体会到生存的压力,公司老大就没法在互联网泡沫的谷底时顶着巨大压力和骨干员工说“我不在乎股价”而成为美谈。国内的百度就是一个一定程度上非常糟糕的例子。

Amazon的压力很大,而且传统零售业的利润率,是远远无法和Google的广告相比的。眼看着零售业的空间慢慢蚕食殆尽,Amazon迫切需要新的业务增长点,因此从一定意义上说,这是残酷的环境逼出来的。如今,我们看到Amazon讲frugal,Amazon讲deliver,甚至都有不少人抱怨在公司里洗脑了,过度强调leadership了,而这其实都是源于公司的DNA。

扯远一点,讲到务实的文化,突然想起了我前一家公司——华为。从公司层面上说,它就如同是中国的亚马逊一般成功,而它的务实,我觉得可以用我在新员工培训的时候听到的这样一些话来概括,比如“小改进,大奖励”,说的是,别给公司大的事情说三道四,着眼手头的小事情,改进了工作就有回报;还有一句是,“领先一小步是优势,领先一大步是烈士”,说的也是做实用的创新。事实上我并不认同这些说法,但是依然,它们是务实文化很好的佐证。

其次,有了文化的铺垫,依然不是所有人都可以玩云服务的,在最开始的时候,Amazon搞得开,搞得快。需要有软硬资源上的前提:

疯狂的迭代和发布。Google对于学术菁英以及工程艺术的追求,无其它公司可出其右。Amazon就看起来“土”很多,比如说,代码质量如何?难说追求完美。但是其迭代的能力简直可以说“令人发指”。Amazon几乎不会花上漫长的时间做设计,做架构,我们看到的,都是大量不完美的,甚至存在着明显缺陷的产品,然后开始丧心病狂的迭代。哪怕到现在,打开AWS console上面的服务列表,我想多数人都难以说知道全部的service都是做什么的,我记得最快的时候,每几天就有新的AWS service发布。即便是非AWS的内部产品也是如此,我记得在Amazon工作的时候,内部的工具多而且新,花在这些东西上的学习成本着实可不低,而且,每年工程师都要投票淘汰那些不好用的工具。

大众工程师基础。这是很少人提及的一点,似乎凡是说到IT企业,都谈效率,谈自动化,谈机器替代人力。当然正确,可是要做到这些事情,实在不是——至少当今这个阶段不是——几个或者几十个呼风唤雨的工程师可以搞得定的。而众所周知电商的原因,Amazon工程师资源明显比较富足。许多方面Amazon的面试bar没有Google高,薪酬和工作环境通常也会和Google有一些差距,但是,无论是招人还是晋升,都接近实战。我把这些工程师叫做“大众工程师”,不是所谓的菁英,但也绝不是庸才,他们是真正是生力军。在疯狂扩张的时期,Amazon也可以保持招聘的效率和强度。直到现在,很多人都知道的一件事情,是Amazon薪资中的base,有着明确的上限,因此报酬要靠股票来弥补,而且股票都是按照年份递增发放,最大限度地把员工和公司的利益绑在一起。

丰富的硬件资源。这一点很多人也提到过,做电商的,而且做那么大的电商,哪个国家没有个疯狂的消费季呢?如同中国国内的双十一,美国的圣诞-元旦期间,以及后来大力经营的prime day,都需要大量的计算资源。而消费季以外,这些资源放着又是浪费,因此云服务的催生是自然而然的过程。

再回过头来看这三点,可见虽然说互联网公司那么多,甚至还有不少已经触及了云服务的边界,比如网格计算,比如私有大规模计算或者存储集群,却都没有真正发展起来,也不足为奇了。第二、三点把几乎所有中小公司全部过滤掉了,而第一点又把许多大公司都过滤掉了。

最后,我想强调一点,在云服务萌芽以后,需要保持亲民才能持续发展。

我想这与许多公司的策略是不同的,大公司当然是云服务的大客户,比如Microsoft有非常广泛的和不同潜在大客户合作的背景和建立起来的关系,在我来到Oracle以后我又见识到了极度aggressive的销售团队。但是Amazon的商业策略是完全不同的,这和他们的电商背景有关,小客户一直在它们的核心目标客户群之中。因为Amazon做零售,卖十几块甚至几块钱的东西,因此云服务的定位,特别是定价,就是从低端路线开始的。我在Amazon上面买东西,退款,这方面的体验,起码在北美完全无人能及。

我有个朋友,在国内做云服务,他和我讲过,他们比较过成本和定价的关系,发现如果他们采用和Amazon类似的定价策略,实在是没法赚钱。我不知道在最开始的时候Amazon云服务在美国的开始阶段是不是赚钱,但是我知道在Amazon进军中国的开始阶段,被中国的付费习惯和fraud折腾得非常痛苦。既然提到此,在这里扯一句题外话,北美的很多商业模式照搬到中国国内,是很难成功的,我们已经见过太多这样失败的例子,虽说似乎所有人都觊觎中国这样一条大肥鱼,Amazon自己的电商,收购卓越网以后,建库房、做物流,刚开始还可以称之为“眼光长远”,但终究也抵不过利润上的冷清,在国内如今不断走低,网站却慢慢地、悄悄地“淘宝化”,这方面也许我以后可以另开篇幅专门谈谈。

文末,我想思考和预测一下如今的云服务三驾马车的未来。我不觉得Google有能力去和微软以及Amazon竞争。Google依然会很成功,依然是小众和精尖的代名词,但是对于将如此遍及生活的云服务——我只能说DNA层面的东西是很难改变的,它很难做到像微软和Amazon那样再多条战线上面如此亲民。起码在北美,你可以不断地骂微软的东西臃肿而没有品位,可以不住地抗议Amazon对传统零售劳动力岗位的摧残,但是你还是不断地,不断地,不断地使用微软和Amazon的各种产品和服务……

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

]]>
Image result for aws google cloud azure最近看了一个知乎的帖子,大家讨论为什么是Amazon先把云计算服务做出来,而不是Google。类似的问题我遇到过好几次了,之前还在亚马逊的时候,我觉得利益相关等等原因,自己不太适合回答这个问题;而现在,又看到各路人马大神已经把这个问题从各个角度分析得底朝天了,于是觉得似乎又没有太大必要了。不过现在,回头看到这个帖子的时候,我还想再从我的视角总结总结,不只是为什么Amazon先把云服务做出来,还有为什么现在它可以一路领先。虽然说Google也是云服务的三驾马车之一(另两驾是Amazon和微软),但如今许多方面它都和另两驾还有不少的差距。我记得刚加入Oracle的时候,但凡听说我从Amazon来,就理所当然地assume我来自AWS,足见其在业界AWS的影响力之巨。而事实上,Amazon的范畴远比AWS大,而且AWS也是这些年才火起来的。

首先,最本质的一点,是深入到公司DNA中务实的文化,而DNA的形成发展,来自于残酷的发展环境。简单而不准确地说,Google是精英文化,而Amazon是实用文化。Google的广告业务太赚钱了,搜索引擎的广告是互联网最著名的印钞机。多数情况下,这当然是好事,但是当一个业务太赚钱了以后,公司就没法体会到生存的压力,公司老大就没法在互联网泡沫的谷底时顶着巨大压力和骨干员工说“我不在乎股价”而成为美谈。国内的百度就是一个一定程度上非常糟糕的例子。

Amazon的压力很大,而且传统零售业的利润率,是远远无法和Google的广告相比的。眼看着零售业的空间慢慢蚕食殆尽,Amazon迫切需要新的业务增长点,因此从一定意义上说,这是残酷的环境逼出来的。如今,我们看到Amazon讲frugal,Amazon讲deliver,甚至都有不少人抱怨在公司里洗脑了,过度强调leadership了,而这其实都是源于公司的DNA。

扯远一点,讲到务实的文化,突然想起了我前一家公司——华为。从公司层面上说,它就如同是中国的亚马逊一般成功,而它的务实,我觉得可以用我在新员工培训的时候听到的这样一些话来概括,比如“小改进,大奖励”,说的是,别给公司大的事情说三道四,着眼手头的小事情,改进了工作就有回报;还有一句是,“领先一小步是优势,领先一大步是烈士”,说的也是做实用的创新。事实上我并不认同这些说法,但是依然,它们是务实文化很好的佐证。

其次,有了文化的铺垫,依然不是所有人都可以玩云服务的,在最开始的时候,Amazon搞得开,搞得快。需要有软硬资源上的前提:

疯狂的迭代和发布。Google对于学术菁英以及工程艺术的追求,无其它公司可出其右。Amazon就看起来“土”很多,比如说,代码质量如何?难说追求完美。但是其迭代的能力简直可以说“令人发指”。Amazon几乎不会花上漫长的时间做设计,做架构,我们看到的,都是大量不完美的,甚至存在着明显缺陷的产品,然后开始丧心病狂的迭代。哪怕到现在,打开AWS console上面的服务列表,我想多数人都难以说知道全部的service都是做什么的,我记得最快的时候,每几天就有新的AWS service发布。即便是非AWS的内部产品也是如此,我记得在Amazon工作的时候,内部的工具多而且新,花在这些东西上的学习成本着实可不低,而且,每年工程师都要投票淘汰那些不好用的工具。

大众工程师基础。这是很少人提及的一点,似乎凡是说到IT企业,都谈效率,谈自动化,谈机器替代人力。当然正确,可是要做到这些事情,实在不是——至少当今这个阶段不是——几个或者几十个呼风唤雨的工程师可以搞得定的。而众所周知电商的原因,Amazon工程师资源明显比较富足。许多方面Amazon的面试bar没有Google高,薪酬和工作环境通常也会和Google有一些差距,但是,无论是招人还是晋升,都接近实战。我把这些工程师叫做“大众工程师”,不是所谓的菁英,但也绝不是庸才,他们是真正是生力军。在疯狂扩张的时期,Amazon也可以保持招聘的效率和强度。直到现在,很多人都知道的一件事情,是Amazon薪资中的base,有着明确的上限,因此报酬要靠股票来弥补,而且股票都是按照年份递增发放,最大限度地把员工和公司的利益绑在一起。

丰富的硬件资源。这一点很多人也提到过,做电商的,而且做那么大的电商,哪个国家没有个疯狂的消费季呢?如同中国国内的双十一,美国的圣诞-元旦期间,以及后来大力经营的prime day,都需要大量的计算资源。而消费季以外,这些资源放着又是浪费,因此云服务的催生是自然而然的过程。

再回过头来看这三点,可见虽然说互联网公司那么多,甚至还有不少已经触及了云服务的边界,比如网格计算,比如私有大规模计算或者存储集群,却都没有真正发展起来,也不足为奇了。第二、三点把几乎所有中小公司全部过滤掉了,而第一点又把许多大公司都过滤掉了。

最后,我想强调一点,在云服务萌芽以后,需要保持亲民才能持续发展。

我想这与许多公司的策略是不同的,大公司当然是云服务的大客户,比如Microsoft有非常广泛的和不同潜在大客户合作的背景和建立起来的关系,在我来到Oracle以后我又见识到了极度aggressive的销售团队。但是Amazon的商业策略是完全不同的,这和他们的电商背景有关,小客户一直在它们的核心目标客户群之中。因为Amazon做零售,卖十几块甚至几块钱的东西,因此云服务的定位,特别是定价,就是从低端路线开始的。我在Amazon上面买东西,退款,这方面的体验,起码在北美完全无人能及。

我有个朋友,在国内做云服务,他和我讲过,他们比较过成本和定价的关系,发现如果他们采用和Amazon类似的定价策略,实在是没法赚钱。我不知道在最开始的时候Amazon云服务在美国的开始阶段是不是赚钱,但是我知道在Amazon进军中国的开始阶段,被中国的付费习惯和fraud折腾得非常痛苦。既然提到此,在这里扯一句题外话,北美的很多商业模式照搬到中国国内,是很难成功的,我们已经见过太多这样失败的例子,虽说似乎所有人都觊觎中国这样一条大肥鱼,Amazon自己的电商,收购卓越网以后,建库房、做物流,刚开始还可以称之为“眼光长远”,但终究也抵不过利润上的冷清,在国内如今不断走低,网站却慢慢地、悄悄地“淘宝化”,这方面也许我以后可以另开篇幅专门谈谈。

文末,我想思考和预测一下如今的云服务三驾马车的未来。我不觉得Google有能力去和微软以及Amazon竞争。Google依然会很成功,依然是小众和精尖的代名词,但是对于将如此遍及生活的云服务——我只能说DNA层面的东西是很难改变的,它很难做到像微软和Amazon那样再多条战线上面如此亲民。起码在北美,你可以不断地骂微软的东西臃肿而没有品位,可以不住地抗议Amazon对传统零售劳动力岗位的摧残,但是你还是不断地,不断地,不断地使用微软和Amazon的各种产品和服务……

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

]]>
0
<![CDATA[邀请链接(referral links)]]> http://www.udpwork.com/item/16892.html http://www.udpwork.com/item/16892.html#reviews Mon, 11 Jun 2018 01:00:02 +0800 Cat Chen http://www.udpwork.com/item/16892.html 中场休息,广告时间。以下是一些我的 referral links,如果你使用它们注册对应服务的话,那么你和我都能获得到一些好处。我会为每项服务做简单介绍,是否合适你还是要靠你自己去搜索别人的测评。

Wealthfront

Wealthfront 是一个 robo adviser,跟 Betterment 等服务相似。你把钱放进去,它帮你管理 portfolio,买进股票、债券等 ETF (Exchange-Traded Fund)。具体回报率跟你选择的风险等级相关,风险系数越高股票占 portfolio 的比例越大。

通过 Wealthfront 管理的资产,头 $10k 是免管理费的,之后是 0.25%。也就是说,如果有 $20k 资产在里面,头 $10k 免费然后之后的 $10k 每年收 $25($10k * 0.25%),然后分摊到 12 个月来收,每个月 $2 多。

如果你使用我的邀请链接的话:

  • 你得到的好处:免管理费资产额度增加 $5k,也就是说注册帐号就有 $15k 免管理费资产额度。
  • 我得到的好处:免管理费资产额度增加 $5k。

邀请链接:http://j.mp/catchen-wealthfront-invite

Acorns

如果你无法一次拿出 $500 存进 Wealthfront 进行投资,你可以选择通过 Acorns 慢慢一点一点存钱。Acorns 也是一个 robo adviser,但跟 Wealthfront 不一样的地方在于 Acorns 使用一些小技巧让你把零钱存下来。

在允许 Acorns 连接你的银行后,Acorns 会对你消费的「找零」进行统计,然后用作投资。例如说,你刷卡消费了 $12.45,Acorns 就会把这当作消费 $13 找零 $0.55,从你的银行转 $0.55 到你的投资账户。除此之外,Acorns 还跟一些商家有 cash back 的合作,通过 Acorns 在这些商家消费的话 cash back 也会进入投资账户。

如果你使用我的邀请链接的话:

  • 你得到的好处:获得 $5。
  • 我得到的好处:获得 $5。

邀请链接:https://chen.cat/acorns-invite

Stitch Fix

Stitch Fix 是一个帮你搭配衣服的服务。注册时它会让你填写众多衣服尺码和喜好的信息,多到简直让人想要放弃注册。然后它会根据这些信息帮你挑选 5 件单品并邮寄给你。(在它帮你挑选前,你可以留言说明一下有没有什么你特别想要的。)

在收到包裹后,你可以试穿然后决定 5 件中哪些你想要留下哪些你想要退回去。如果你 5 件都要了,全单 7.5 折;如果你 5 件都不要,你需要给 $20 的最低消费;否则你只需要对你要的那几件买单。我至今只下单过 3 个包裹,头两个我都只要了 1 件,第三个我想要 3 件,但发现全要的话打折之后更便宜,于是全要了。

如果你使用我的邀请链接的话:

  • 你得到的好处:$25,用于首次消费。
  • 我得到的好处:$25,用于下次消费。

邀请链接:http://chen.cat/catchen-stitchfix-invite

Chase Sapphire Reserve

Chase 最高端的旅行及饮食类信用卡:

  • 旅游和餐饮消费 3 倍积分。
  • 每年 $500 的旅游报销(自动 statement credit),可用于 Uber 甚至是 Uber Eats。
  • 免费附送 Priority Pass Select,可以免费使用全球上千个(美国 26 个)机场的贵宾室,持卡人可免费带两名同行旅客。(不能免费带同行旅客的 Priority Pass Prestige 价格为 $400 一年。)
  • 报销 Global Entry 或 TSA Precheck 费用。前者服务包含后者,费用分别是每 5 年 $100/$85。
  • 年费 $450。

如果你使用我的邀请链接的话:

  • 你得到的好处:没有。跟你自己申请开卡一样,头三个月消费满 $4k 就能获取 50k 点的开卡奖励。
  • 我得到的好处:获得 10k 点奖励。

https://chen.cat/chase-sapphire-reserve-invite–2018–06

]]>
中场休息,广告时间。以下是一些我的 referral links,如果你使用它们注册对应服务的话,那么你和我都能获得到一些好处。我会为每项服务做简单介绍,是否合适你还是要靠你自己去搜索别人的测评。

Wealthfront

Wealthfront 是一个 robo adviser,跟 Betterment 等服务相似。你把钱放进去,它帮你管理 portfolio,买进股票、债券等 ETF (Exchange-Traded Fund)。具体回报率跟你选择的风险等级相关,风险系数越高股票占 portfolio 的比例越大。

通过 Wealthfront 管理的资产,头 $10k 是免管理费的,之后是 0.25%。也就是说,如果有 $20k 资产在里面,头 $10k 免费然后之后的 $10k 每年收 $25($10k * 0.25%),然后分摊到 12 个月来收,每个月 $2 多。

如果你使用我的邀请链接的话:

  • 你得到的好处:免管理费资产额度增加 $5k,也就是说注册帐号就有 $15k 免管理费资产额度。
  • 我得到的好处:免管理费资产额度增加 $5k。

邀请链接:http://j.mp/catchen-wealthfront-invite

Acorns

如果你无法一次拿出 $500 存进 Wealthfront 进行投资,你可以选择通过 Acorns 慢慢一点一点存钱。Acorns 也是一个 robo adviser,但跟 Wealthfront 不一样的地方在于 Acorns 使用一些小技巧让你把零钱存下来。

在允许 Acorns 连接你的银行后,Acorns 会对你消费的「找零」进行统计,然后用作投资。例如说,你刷卡消费了 $12.45,Acorns 就会把这当作消费 $13 找零 $0.55,从你的银行转 $0.55 到你的投资账户。除此之外,Acorns 还跟一些商家有 cash back 的合作,通过 Acorns 在这些商家消费的话 cash back 也会进入投资账户。

如果你使用我的邀请链接的话:

  • 你得到的好处:获得 $5。
  • 我得到的好处:获得 $5。

邀请链接:https://chen.cat/acorns-invite

Stitch Fix

Stitch Fix 是一个帮你搭配衣服的服务。注册时它会让你填写众多衣服尺码和喜好的信息,多到简直让人想要放弃注册。然后它会根据这些信息帮你挑选 5 件单品并邮寄给你。(在它帮你挑选前,你可以留言说明一下有没有什么你特别想要的。)

在收到包裹后,你可以试穿然后决定 5 件中哪些你想要留下哪些你想要退回去。如果你 5 件都要了,全单 7.5 折;如果你 5 件都不要,你需要给 $20 的最低消费;否则你只需要对你要的那几件买单。我至今只下单过 3 个包裹,头两个我都只要了 1 件,第三个我想要 3 件,但发现全要的话打折之后更便宜,于是全要了。

如果你使用我的邀请链接的话:

  • 你得到的好处:$25,用于首次消费。
  • 我得到的好处:$25,用于下次消费。

邀请链接:http://chen.cat/catchen-stitchfix-invite

Chase Sapphire Reserve

Chase 最高端的旅行及饮食类信用卡:

  • 旅游和餐饮消费 3 倍积分。
  • 每年 $500 的旅游报销(自动 statement credit),可用于 Uber 甚至是 Uber Eats。
  • 免费附送 Priority Pass Select,可以免费使用全球上千个(美国 26 个)机场的贵宾室,持卡人可免费带两名同行旅客。(不能免费带同行旅客的 Priority Pass Prestige 价格为 $400 一年。)
  • 报销 Global Entry 或 TSA Precheck 费用。前者服务包含后者,费用分别是每 5 年 $100/$85。
  • 年费 $450。

如果你使用我的邀请链接的话:

  • 你得到的好处:没有。跟你自己申请开卡一样,头三个月消费满 $4k 就能获取 50k 点的开卡奖励。
  • 我得到的好处:获得 10k 点奖励。

https://chen.cat/chase-sapphire-reserve-invite–2018–06

]]>
0
<![CDATA[群星的汉化及官方中文版]]> http://www.udpwork.com/item/16891.html http://www.udpwork.com/item/16891.html#reviews Sun, 10 Jun 2018 22:28:19 +0800 云风 http://www.udpwork.com/item/16891.html 前段时间,Stellaris (群星)在 steam 上招到了大量差评。这款被短时间差评也不是第一次了,最猛烈的一次是因为 2.0 版改动太大,简直成了款新游戏,得罪了大量 100 小时游戏时间以上的老粉丝;我记得还有一次是因为涨价;似乎还有一次,原因不太记得了。

而这次,是因为有中国玩家用英文在官方论坛请求游戏加入官方中文,被客服不客气的回绝了。原本没官中就差评就是我朝玩家的时尚之一,而这次直接被官方怼回来,更是刺激了我朝玩家的 G 点,连那些平常不参加无官中就差评的玩家都爆了许多。

还是太年轻了。如果是 20 年前,我估计也会义愤填膺的。那年我朝南斯拉夫大使馆被炸,我还在网上乱吼过几句呢,谁没当过愤怒的少年呢?

这两天在一个小圈子里见人提起这事,因为我是群星两个用户最多的汉化 Mod 之一的主要维护者,所以就调侃了几句:

客服态度有毛用,能增强游戏性么?想当上帝,玩腾讯或网易的游戏就好了,每个月花一万,保证 VIP 客服 24 小时等着接你的电话,你提什么意见都能耐心听你讲,保证伺候的你舒舒服服的;这客服态度,真得能增强游戏体验呢。至于你买群星的那几十块钱(打折价),也就值得你写篇差评爽一下了,别说分担游戏研发成本,雇个耐心点的客服工资都不够。

上面的话是调侃,别当真。下面是我正经的观点:

在现在这个阶段,传统的游戏,除非有巨大的金主养着,不出官方中文才是正确的做法。对于中文(和其它语种)用户、最需要的是游戏引擎提供一个完善的多语言支持机制,和官方的 Mod 平台支持,而不是由官方雇人来进行中文化。而 P 社,正是走在这条正路上。

这背后的机理是:一个好的游戏,一定会有粉丝全心全意来翻译游戏的文本。而完善多语言支持,可以极大的降低这个技术门槛;官方的 Mod 平台则能让粉丝制作的汉化版本可以无障碍的在中文社区内推广。当然一切的前提是游戏足够优秀,吸引到足够忠实的粉丝,这和玩家的利益是一致的。

群星在 1.4 和 2.0 版分别短暂的泄露出正在制作的官方中文版,看起来是腾讯为了引进重磅游戏(推广 wegame 平台?)帮忙制作的。至于汉化质量,我相信适用过的同学都有体会。在 2.0 版刚上线的时候,为了让玩家能尽快享受到中文化待遇,我专门写了脚本比较抽取过 2.0 版外泄的官中文本。我的规则是这样的:

如果英文条目没有修改,我会引用之前自己做的翻译文本。如果英文条目有修改(或新增),在官中版本中找的到对应的条目,就引用官中版本;如果找不到,就暂时引用英文原文。然后我再逐步重新翻译新增/修改的英文条目(基本不保留官中文本)。

在这个逐步翻译替换的过程中,我们维护的汉化 Mod 为官中文本背了几天的锅,有两处驱逐舰被翻译成赶走舰,被玩家笑话。

为什么官中的质量不会太好?因为游戏的原创团队并没有以中文为母语的设计人员,这个事情必须外包。如果是腾讯经手此事,也不太可能包给个人,很可能是某个翻译公司接手。接这种活必须是以盈利为目的,可能翻译的人本身个人素质不错,但怎样又能要求他们在翻译之前先玩上 100 小时去熟悉游戏的上下文呢?(我在 steam 上有记录的群星游戏时间已有 593 小时了)

这么大的文本量,一个人来翻译时间肯定是赶不上发行日程的,假设是 3 到 5 人的小团队,那么 300~500 小时以上熟悉游戏的时间该不该发工资?

而且,P 社一贯的主要盈利手段是不断的在老 Title 上加新内容持续售卖(DLC)。每次新内容开发日程中,文本也持续在变更,汉化团队并不是开发核心,他们不可能实时跟踪文本的变化,必定是一个比较老的版本,等 DLC 正式发行的那一天,汉化的文本势必有一定的版本差异。除非 P 社愿意为了这么个中文版的完善推迟 DLC 的发布日,我想作为粉丝也不希望因为这个跳票吧?就算他们愿意也实际做不到啊,现在 P 社都已经迫不及待的先发 beta 版让玩家帮忙测试,稳定后再转正式版了。

ps. 我在做 2.0 的汉化 Mod 时就发现,官中的文本的文件组织方式和英文版截然不同,明显是从某个开发阶段抽取合并出来的文本交出去翻译的。和最终文本相比,漏掉了许多条目。

我在闲聊时谈到,如果我是被雇佣为了赚钱来为群星做汉化这个活的话。为了达到和现在相同的质量,我和参与过的朋友们的工作加起来,低于 50 万人民币,我是不会干的。这是我心目中为这个汉化项目付出的价值。为这个汉化项目,建立 github 仓库,时刻跟踪英文文本的变迁(坚持了两年);去 google wikipedia 推敲每个新造出来的名词的词源,找到原创者可能引用的科幻梗,然后讨论出合适的译法;根据实际游戏中遇到的上下文,进一步推敲和校对文本;最后再考虑一下总的文本量 40 万英文单词,一本长篇小说啊。

这种事,非粉丝不能干,价值是无法用外包费用衡量的。再说,腾讯这种财大气粗的金主,为了推广 wegame 平台引入一个重磅游戏,难道不肯花钱?能做到现在的泄露出来的这个程度的质量我认为已经是极限了,想获得和现在几个主流汉化 Mod 相当质量的话,我认为是花钱解决不了的事情。

现在的 steam workshop 提供汉化 Mod 的方式,我认为是解决优秀游戏的中文化最好的方案,也越来越多的被更多游戏采用。除非游戏想推出非 steam 平台版本,我觉得没有任何理由合并到游戏中成为所谓官方中文版本。现在群星就有两个主流 mod ,贴吧版本和我维护的版本,我认为都是花了很多心思在做的。玩家不喜欢某个版本的翻译风格,可以随时切换到另一个版本。在我维护的版本中,你发现翻译不对的地方,还可以立即在 github 反馈,大家讨论后通常都会接纳更有道理的译本。这种迭代频繁的游戏,你也总可以让中文文本跟着更新,和游戏主体一样,文本也是活的。

理论上,steam workshop 来维护中文的方式,还可以增进中文地区的正版率。如果是有官方中文的情况下,用正版盗版区别不太大;但是正版同步 workshop 实在是方便很多,从功利角度讲,为了 workshop 的便利而购买正版是个很吸引人的因素,远比虚无的尊重感来的实际。

本月前几天那个最敏感的日子,我转发了个敏感的数字(我知道具体数字是很有争议的,真的对这个问题有兴趣,wikipedia 是个很好的资料源头,不过就那一条,我只是想在特殊的日子唤起一下大家的记忆而已),原来的微博号毫无悬念的被消失了。

我不是自媒体,也不靠影响力转换成利益相关的东西,丢失了原来的粉丝没啥关系。虽然 twitter 什么的也可以继续玩,但少了一个吐槽的地方真的少了不少乐趣。所以,重新申请一个号从头开始玩吧。我还是原来的我,正经的长话题还是写在 blog 上,日常的随意吐槽,有个地方喷还是比较好。

欢迎老朋友关注我的新微博号:玩家云风https://weibo.com/playercloud

]]>
前段时间,Stellaris (群星)在 steam 上招到了大量差评。这款被短时间差评也不是第一次了,最猛烈的一次是因为 2.0 版改动太大,简直成了款新游戏,得罪了大量 100 小时游戏时间以上的老粉丝;我记得还有一次是因为涨价;似乎还有一次,原因不太记得了。

而这次,是因为有中国玩家用英文在官方论坛请求游戏加入官方中文,被客服不客气的回绝了。原本没官中就差评就是我朝玩家的时尚之一,而这次直接被官方怼回来,更是刺激了我朝玩家的 G 点,连那些平常不参加无官中就差评的玩家都爆了许多。

还是太年轻了。如果是 20 年前,我估计也会义愤填膺的。那年我朝南斯拉夫大使馆被炸,我还在网上乱吼过几句呢,谁没当过愤怒的少年呢?

这两天在一个小圈子里见人提起这事,因为我是群星两个用户最多的汉化 Mod 之一的主要维护者,所以就调侃了几句:

客服态度有毛用,能增强游戏性么?想当上帝,玩腾讯或网易的游戏就好了,每个月花一万,保证 VIP 客服 24 小时等着接你的电话,你提什么意见都能耐心听你讲,保证伺候的你舒舒服服的;这客服态度,真得能增强游戏体验呢。至于你买群星的那几十块钱(打折价),也就值得你写篇差评爽一下了,别说分担游戏研发成本,雇个耐心点的客服工资都不够。

上面的话是调侃,别当真。下面是我正经的观点:

在现在这个阶段,传统的游戏,除非有巨大的金主养着,不出官方中文才是正确的做法。对于中文(和其它语种)用户、最需要的是游戏引擎提供一个完善的多语言支持机制,和官方的 Mod 平台支持,而不是由官方雇人来进行中文化。而 P 社,正是走在这条正路上。

这背后的机理是:一个好的游戏,一定会有粉丝全心全意来翻译游戏的文本。而完善多语言支持,可以极大的降低这个技术门槛;官方的 Mod 平台则能让粉丝制作的汉化版本可以无障碍的在中文社区内推广。当然一切的前提是游戏足够优秀,吸引到足够忠实的粉丝,这和玩家的利益是一致的。

群星在 1.4 和 2.0 版分别短暂的泄露出正在制作的官方中文版,看起来是腾讯为了引进重磅游戏(推广 wegame 平台?)帮忙制作的。至于汉化质量,我相信适用过的同学都有体会。在 2.0 版刚上线的时候,为了让玩家能尽快享受到中文化待遇,我专门写了脚本比较抽取过 2.0 版外泄的官中文本。我的规则是这样的:

如果英文条目没有修改,我会引用之前自己做的翻译文本。如果英文条目有修改(或新增),在官中版本中找的到对应的条目,就引用官中版本;如果找不到,就暂时引用英文原文。然后我再逐步重新翻译新增/修改的英文条目(基本不保留官中文本)。

在这个逐步翻译替换的过程中,我们维护的汉化 Mod 为官中文本背了几天的锅,有两处驱逐舰被翻译成赶走舰,被玩家笑话。

为什么官中的质量不会太好?因为游戏的原创团队并没有以中文为母语的设计人员,这个事情必须外包。如果是腾讯经手此事,也不太可能包给个人,很可能是某个翻译公司接手。接这种活必须是以盈利为目的,可能翻译的人本身个人素质不错,但怎样又能要求他们在翻译之前先玩上 100 小时去熟悉游戏的上下文呢?(我在 steam 上有记录的群星游戏时间已有 593 小时了)

这么大的文本量,一个人来翻译时间肯定是赶不上发行日程的,假设是 3 到 5 人的小团队,那么 300~500 小时以上熟悉游戏的时间该不该发工资?

而且,P 社一贯的主要盈利手段是不断的在老 Title 上加新内容持续售卖(DLC)。每次新内容开发日程中,文本也持续在变更,汉化团队并不是开发核心,他们不可能实时跟踪文本的变化,必定是一个比较老的版本,等 DLC 正式发行的那一天,汉化的文本势必有一定的版本差异。除非 P 社愿意为了这么个中文版的完善推迟 DLC 的发布日,我想作为粉丝也不希望因为这个跳票吧?就算他们愿意也实际做不到啊,现在 P 社都已经迫不及待的先发 beta 版让玩家帮忙测试,稳定后再转正式版了。

ps. 我在做 2.0 的汉化 Mod 时就发现,官中的文本的文件组织方式和英文版截然不同,明显是从某个开发阶段抽取合并出来的文本交出去翻译的。和最终文本相比,漏掉了许多条目。

我在闲聊时谈到,如果我是被雇佣为了赚钱来为群星做汉化这个活的话。为了达到和现在相同的质量,我和参与过的朋友们的工作加起来,低于 50 万人民币,我是不会干的。这是我心目中为这个汉化项目付出的价值。为这个汉化项目,建立 github 仓库,时刻跟踪英文文本的变迁(坚持了两年);去 google wikipedia 推敲每个新造出来的名词的词源,找到原创者可能引用的科幻梗,然后讨论出合适的译法;根据实际游戏中遇到的上下文,进一步推敲和校对文本;最后再考虑一下总的文本量 40 万英文单词,一本长篇小说啊。

这种事,非粉丝不能干,价值是无法用外包费用衡量的。再说,腾讯这种财大气粗的金主,为了推广 wegame 平台引入一个重磅游戏,难道不肯花钱?能做到现在的泄露出来的这个程度的质量我认为已经是极限了,想获得和现在几个主流汉化 Mod 相当质量的话,我认为是花钱解决不了的事情。

现在的 steam workshop 提供汉化 Mod 的方式,我认为是解决优秀游戏的中文化最好的方案,也越来越多的被更多游戏采用。除非游戏想推出非 steam 平台版本,我觉得没有任何理由合并到游戏中成为所谓官方中文版本。现在群星就有两个主流 mod ,贴吧版本和我维护的版本,我认为都是花了很多心思在做的。玩家不喜欢某个版本的翻译风格,可以随时切换到另一个版本。在我维护的版本中,你发现翻译不对的地方,还可以立即在 github 反馈,大家讨论后通常都会接纳更有道理的译本。这种迭代频繁的游戏,你也总可以让中文文本跟着更新,和游戏主体一样,文本也是活的。

理论上,steam workshop 来维护中文的方式,还可以增进中文地区的正版率。如果是有官方中文的情况下,用正版盗版区别不太大;但是正版同步 workshop 实在是方便很多,从功利角度讲,为了 workshop 的便利而购买正版是个很吸引人的因素,远比虚无的尊重感来的实际。

本月前几天那个最敏感的日子,我转发了个敏感的数字(我知道具体数字是很有争议的,真的对这个问题有兴趣,wikipedia 是个很好的资料源头,不过就那一条,我只是想在特殊的日子唤起一下大家的记忆而已),原来的微博号毫无悬念的被消失了。

我不是自媒体,也不靠影响力转换成利益相关的东西,丢失了原来的粉丝没啥关系。虽然 twitter 什么的也可以继续玩,但少了一个吐槽的地方真的少了不少乐趣。所以,重新申请一个号从头开始玩吧。我还是原来的我,正经的长话题还是写在 blog 上,日常的随意吐槽,有个地方喷还是比较好。

欢迎老朋友关注我的新微博号:玩家云风https://weibo.com/playercloud

]]>
0
<![CDATA[解析一个简单的分布式事务Case]]> http://www.udpwork.com/item/16890.html http://www.udpwork.com/item/16890.html#reviews Fri, 08 Jun 2018 21:41:10 +0800 Felix021 http://www.udpwork.com/item/16890.html 注:这篇是3月初在公司内部平台上发布的,搬一份到 blog 存档。
===


我注意到过去几个月有些同学还在踩一个简单的分布式事务Case的坑,而这个坑我们在两年以前就已经有同学踩过了,这里简单解析一下这个case和合适的处理方案,供各位参考。

# 1. 踩过的坑

这个case有很多变种,先说说我们在 X 业务踩过的坑开始,大约是16年9月,核心业务需求是很简单的:在用户发起支付请求的时候,从用户的银行卡扣一笔钱。负责这个需求的同学是这么写的代码(去除其他业务逻辑的简化版):

$dbTrans = $db->beginTransaction();
try {
    $order = PayRequest::model()->newPayRequest(...); #在数据库中插入一条支付请求记录,状态为待支付
    //其他业务改动
    $result = PaySvr::pay($order->id, $order->amount); #请求PaySvr(或第三方支付通道)扣款
    if ($result['code'] == PaySvr::E_SUCCESS) {
        $order->setAsSucceeded();
    } else {
        $order->setAsPending();
    }
    $dbTrans->commit();
} catch (Exception $e) {
    $dbTrans->rollback();
}

乍一看好像是没有什么毛病,测试的case都顺利通过,也没有人去仔细review这一小段代码,于是就这么上线了。但问题很快就暴露出来,PaySvr在支付成功以后尝试回调,业务系统报错”订单不存在”。查询线上日志发现,这笔订单在请求第三方支付通道时网络超时,Curl抛了timeout异常,导致支付记录被回滚。有心的同学可以自己复现一下这个问题,观察BUG的发生过程。

代码修复起来倒是很简单,在请求PaySvr之前提交事务,将支付请求安全落库即可。
$dbTrans = $db->beginTransaction();
try {
    $order = PayRequest::model()->newPayRequest(...);
    $order->setAsPending();
    //其他业务改动
    $dbTrans->commit(); #先将支付请求落地
} catch (Exception $e) {
    $dbTrans->rollback();
}

#再请求PaySvr
$result = PaySvr::pay($order->id, $order->amount);

#根据PaySvr结果修改支付请求和其他业务记录的状态
$dbTrans = $db->beginTransaction();
try {
    if ($result['code'] == PaySvr::E_SUCCESS) {
        $order->setAsSucceeded();
        //其他业务改动
    } elseif ($result['code'] == PaySvr::E_FAIL) {
        $order->setAsFailed();
        //其他业务改动
    } else {
        //等待后续cron补单
    }
    $dbTrans->commit();
} catch (Exception $e) {
    $dbTrans->rollback();
}

把这个实现代入多个不同的业务下,还会衍生出更多问题,比如被动代扣业务,就可能因为重试导致用户被多次扣款,引起投诉(支付通道对投诉率的要求非常严格,甚至可能导致通道被关停);更严重的是放款业务,可能出现重复放款,给公司造成直接损失。据说某友商就是因为重复放款倒闭的,所以请各位同学在实现类似业务时特别注意,考虑周全。

# 2. 归纳总结

我们往后退一步再审视这个case,这段简单的代码涉及了两个系统:X 业务系统(本地数据库)、PaySvr(外部系统)。可以看得出这段代码的本意,是期望将当前系统的业务和外部系统的业务,合并到一个事务里面,要么一起成功提交,要么一起失败回滚,从而保持两个系统的一致性。

之所以没能达到预期,直接原因是,在失败(异常)回滚的时候,只回滚了本地事务,而没有回滚远端系统的状态变化。按这个思路去考虑,似乎只要加一个 PaySvr::rollbackRequest($order->id) 好像就可以解决问题。但仔细想想就会发现远没这么简单,从业务上来说,如果已经给用户付款了,那实际上就是要给用户退款,而往往这时候是掉单(支付请求结果未知),我们又无法直接给用户退款;更极端一点,如果这个rollback请求也超时了呢,那本地可以rollback吗?

这就是分布式事务棘手的地方了,只靠这样的逻辑是无法保证跨系统的一致性的。解决这个问题的方法是引入两段式提交(2 Phase Commit,常常简写为2PC),其基本逻辑是,在两个系统分别完成业务,然后再分别提交。

例如我们上面的解决方案,实际上就是2PC的一个实现:我们把业务需求作为一整个事务,它可以拆成两个子事务(第三方支付通道完成代扣,在业务系统记录支付请求成功并修改相应业务状态),每个子事务又分成两个阶段:第一阶段,是在本地先记录支付请求(状态为待确认),并向第三方支付发出代扣请求(结果不确定);第二阶段,在确认第三方代扣成功以后,修改本地支付请求的状态修改为成功,或者是代扣结果为失败,本地支付请求状态记为失败。两个阶段都完成,这个事务才是真的完成了。

# 3. Case变种

仔细思考我们曾经实现过的需求,可能会在很多看似不起眼的地方发现分布式事务,例如我们在存管匹配系统里面,就有这样一个Case。

由于与银行存管系统交互的延迟比较大,所以我们的匹配系统实现是异步的,匹配系统在撮合了资金和资产以后,会生成一条债权关系记录在本地,随后再发送到银行系统执行资金的划拨。为了提高执行的效率,我们希望在债权关系生成以后,尽快执行资金的划拨,因此我们会把资金划拨的指令通过LPush放进Redis的list里;List的另一端,那些使用BLPOP监听数据的worker会立刻被激活去执行。

如果没有仔细思考,代码可能会这么写:
#匹配系统
function matcher() {
    $dbTrans = $db->beginTransaction();
    try {
        foreach (matchCapitalAndProject() as $match_result) {
            list($capital_id, $project_id, $amount) = $match_result;
            $relation = Relation::model()->create($capital_id, $project_id, $amount);
            $redis->lPush($relation->id);
        }
        $dbTrans->commit();
    } catch (Exception $e) {
        $dbTrans->rollback();
    }
}

#Worker
function Worker() {
    while (true) {
        $id = $redis->brPop();
        $relation = Relation::model()->findByPk($id);
        if ($relation) {
            HengfengApi::invest($relation->capital_id, $relation->project_id, $amount);
        }
    }
}

在实际执行这段代码的时候,如果没有仔细测试(尤其是在有补单逻辑,捞出未执行成功的划拨指令再发送给银行),可能就不会发现,实际上有很多指令并不是马上被执行的,因为relation_id被送进list以后,worker马上就会读出来执行,但这时事务可能还没有提交。但这只是影响了业务的效率,还没有对业务的正确性产生影响。


为了修复这个问题,似乎可以这么做:把 [capital_id, project_id, amount] 发送到redis,worker直接取出执行,这样就不用从数据库读取relation,保证尽快将请求发送到银行。但如果因为某些原因,事务最终没有被提交呢?找银行rollback这些指令的执行,那就麻烦多了。

正确的做法是,在事务提交了以后,再lPush到Redis里:
[code] #匹配系统
function matcher() {
    $arr_relation = [];
    $dbTrans = $db->beginTransaction();
    try {
        foreach (matchCapitalAndProject() as $match_result) {
            list($capital_id, $project_id, $amount) = $match_result;
            $relation = Relation::model()->create($capital_id, $project_id, $amount);
            $arr_relation[] = $relation;
        }
        $dbTrans->commit();
    } catch (Exception $e) {
        $dbTrans->rollback();
    }
    foreach ($arr_relation as $relation) {
        $redis->lPush($relation->id);
    }
}
注:foreach要放到try-catch后面。


最后想补充一点,相信有很多同学知道这个Case,或者就算不知道也不会犯这样的错误,因此也许会觉得没必要专门揪出来这样分享 —— 但“知识的诅咒”就是这样,“我会的东西都是简单的”,然而对于没有踩过坑的同学来说,其实都是宝贵的经验;另一方面,有些别人觉得简单的问题、踩过的坑,也许自己是不知道的。所以,希望大家都能分享自己在工作学习中踩过的坑、解决过的问题,互相交流,互相提高。
]]>
注:这篇是3月初在公司内部平台上发布的,搬一份到 blog 存档。
===


我注意到过去几个月有些同学还在踩一个简单的分布式事务Case的坑,而这个坑我们在两年以前就已经有同学踩过了,这里简单解析一下这个case和合适的处理方案,供各位参考。

# 1. 踩过的坑

这个case有很多变种,先说说我们在 X 业务踩过的坑开始,大约是16年9月,核心业务需求是很简单的:在用户发起支付请求的时候,从用户的银行卡扣一笔钱。负责这个需求的同学是这么写的代码(去除其他业务逻辑的简化版):

$dbTrans = $db->beginTransaction();
try {
    $order = PayRequest::model()->newPayRequest(...); #在数据库中插入一条支付请求记录,状态为待支付
    //其他业务改动
    $result = PaySvr::pay($order->id, $order->amount); #请求PaySvr(或第三方支付通道)扣款
    if ($result['code'] == PaySvr::E_SUCCESS) {
        $order->setAsSucceeded();
    } else {
        $order->setAsPending();
    }
    $dbTrans->commit();
} catch (Exception $e) {
    $dbTrans->rollback();
}

乍一看好像是没有什么毛病,测试的case都顺利通过,也没有人去仔细review这一小段代码,于是就这么上线了。但问题很快就暴露出来,PaySvr在支付成功以后尝试回调,业务系统报错”订单不存在”。查询线上日志发现,这笔订单在请求第三方支付通道时网络超时,Curl抛了timeout异常,导致支付记录被回滚。有心的同学可以自己复现一下这个问题,观察BUG的发生过程。

代码修复起来倒是很简单,在请求PaySvr之前提交事务,将支付请求安全落库即可。
$dbTrans = $db->beginTransaction();
try {
    $order = PayRequest::model()->newPayRequest(...);
    $order->setAsPending();
    //其他业务改动
    $dbTrans->commit(); #先将支付请求落地
} catch (Exception $e) {
    $dbTrans->rollback();
}

#再请求PaySvr
$result = PaySvr::pay($order->id, $order->amount);

#根据PaySvr结果修改支付请求和其他业务记录的状态
$dbTrans = $db->beginTransaction();
try {
    if ($result['code'] == PaySvr::E_SUCCESS) {
        $order->setAsSucceeded();
        //其他业务改动
    } elseif ($result['code'] == PaySvr::E_FAIL) {
        $order->setAsFailed();
        //其他业务改动
    } else {
        //等待后续cron补单
    }
    $dbTrans->commit();
} catch (Exception $e) {
    $dbTrans->rollback();
}

把这个实现代入多个不同的业务下,还会衍生出更多问题,比如被动代扣业务,就可能因为重试导致用户被多次扣款,引起投诉(支付通道对投诉率的要求非常严格,甚至可能导致通道被关停);更严重的是放款业务,可能出现重复放款,给公司造成直接损失。据说某友商就是因为重复放款倒闭的,所以请各位同学在实现类似业务时特别注意,考虑周全。

# 2. 归纳总结

我们往后退一步再审视这个case,这段简单的代码涉及了两个系统:X 业务系统(本地数据库)、PaySvr(外部系统)。可以看得出这段代码的本意,是期望将当前系统的业务和外部系统的业务,合并到一个事务里面,要么一起成功提交,要么一起失败回滚,从而保持两个系统的一致性。

之所以没能达到预期,直接原因是,在失败(异常)回滚的时候,只回滚了本地事务,而没有回滚远端系统的状态变化。按这个思路去考虑,似乎只要加一个 PaySvr::rollbackRequest($order->id) 好像就可以解决问题。但仔细想想就会发现远没这么简单,从业务上来说,如果已经给用户付款了,那实际上就是要给用户退款,而往往这时候是掉单(支付请求结果未知),我们又无法直接给用户退款;更极端一点,如果这个rollback请求也超时了呢,那本地可以rollback吗?

这就是分布式事务棘手的地方了,只靠这样的逻辑是无法保证跨系统的一致性的。解决这个问题的方法是引入两段式提交(2 Phase Commit,常常简写为2PC),其基本逻辑是,在两个系统分别完成业务,然后再分别提交。

例如我们上面的解决方案,实际上就是2PC的一个实现:我们把业务需求作为一整个事务,它可以拆成两个子事务(第三方支付通道完成代扣,在业务系统记录支付请求成功并修改相应业务状态),每个子事务又分成两个阶段:第一阶段,是在本地先记录支付请求(状态为待确认),并向第三方支付发出代扣请求(结果不确定);第二阶段,在确认第三方代扣成功以后,修改本地支付请求的状态修改为成功,或者是代扣结果为失败,本地支付请求状态记为失败。两个阶段都完成,这个事务才是真的完成了。

# 3. Case变种

仔细思考我们曾经实现过的需求,可能会在很多看似不起眼的地方发现分布式事务,例如我们在存管匹配系统里面,就有这样一个Case。

由于与银行存管系统交互的延迟比较大,所以我们的匹配系统实现是异步的,匹配系统在撮合了资金和资产以后,会生成一条债权关系记录在本地,随后再发送到银行系统执行资金的划拨。为了提高执行的效率,我们希望在债权关系生成以后,尽快执行资金的划拨,因此我们会把资金划拨的指令通过LPush放进Redis的list里;List的另一端,那些使用BLPOP监听数据的worker会立刻被激活去执行。

如果没有仔细思考,代码可能会这么写:
#匹配系统
function matcher() {
    $dbTrans = $db->beginTransaction();
    try {
        foreach (matchCapitalAndProject() as $match_result) {
            list($capital_id, $project_id, $amount) = $match_result;
            $relation = Relation::model()->create($capital_id, $project_id, $amount);
            $redis->lPush($relation->id);
        }
        $dbTrans->commit();
    } catch (Exception $e) {
        $dbTrans->rollback();
    }
}

#Worker
function Worker() {
    while (true) {
        $id = $redis->brPop();
        $relation = Relation::model()->findByPk($id);
        if ($relation) {
            HengfengApi::invest($relation->capital_id, $relation->project_id, $amount);
        }
    }
}

在实际执行这段代码的时候,如果没有仔细测试(尤其是在有补单逻辑,捞出未执行成功的划拨指令再发送给银行),可能就不会发现,实际上有很多指令并不是马上被执行的,因为relation_id被送进list以后,worker马上就会读出来执行,但这时事务可能还没有提交。但这只是影响了业务的效率,还没有对业务的正确性产生影响。


为了修复这个问题,似乎可以这么做:把 [capital_id, project_id, amount] 发送到redis,worker直接取出执行,这样就不用从数据库读取relation,保证尽快将请求发送到银行。但如果因为某些原因,事务最终没有被提交呢?找银行rollback这些指令的执行,那就麻烦多了。

正确的做法是,在事务提交了以后,再lPush到Redis里:
[code] #匹配系统
function matcher() {
    $arr_relation = [];
    $dbTrans = $db->beginTransaction();
    try {
        foreach (matchCapitalAndProject() as $match_result) {
            list($capital_id, $project_id, $amount) = $match_result;
            $relation = Relation::model()->create($capital_id, $project_id, $amount);
            $arr_relation[] = $relation;
        }
        $dbTrans->commit();
    } catch (Exception $e) {
        $dbTrans->rollback();
    }
    foreach ($arr_relation as $relation) {
        $redis->lPush($relation->id);
    }
}
注:foreach要放到try-catch后面。


最后想补充一点,相信有很多同学知道这个Case,或者就算不知道也不会犯这样的错误,因此也许会觉得没必要专门揪出来这样分享 —— 但“知识的诅咒”就是这样,“我会的东西都是简单的”,然而对于没有踩过坑的同学来说,其实都是宝贵的经验;另一方面,有些别人觉得简单的问题、踩过的坑,也许自己是不知道的。所以,希望大家都能分享自己在工作学习中踩过的坑、解决过的问题,互相交流,互相提高。
]]>
0
<![CDATA[终于找回了Mac文件浏览器中目录前面的小三角]]> http://www.udpwork.com/item/16889.html http://www.udpwork.com/item/16889.html#reviews Fri, 08 Jun 2018 18:05:47 +0800 Luke Fan http://www.udpwork.com/item/16889.html 一直在用Mac电脑,很喜欢Mac文件浏览器(Find)里面的列表方式。每个目录前面有一个小三角,可以在同一个窗口中展开子目录的内容。

就像这样——

77094b36acaf2edd20199711841001e93801935a.png

不知道从哪一天开始,我的某个目录就突然变了样子。

变成了这样——

0b55b319ebc4b7454a7169eec6fc1e178b821564.png

目录前面的小三角消失了,先要看到子目录里面的内容,就必须要点击进去,用完了,再返回上一层,痛苦死了。

其他目录都还好,就只有某一个目录变成了这样。好神奇,完全没有发现任何设置上面的差异。改变样式、重启了很多次之后无果。

上网搜索,发现了有人询问同样的问题:https://zhidao.baidu.com/question/501117001003014604.html

而且,按照回复去处理,依然无效。仔细一看,回复后面是连续的7个

]]>
一直在用Mac电脑,很喜欢Mac文件浏览器(Find)里面的列表方式。每个目录前面有一个小三角,可以在同一个窗口中展开子目录的内容。

就像这样——

77094b36acaf2edd20199711841001e93801935a.png

不知道从哪一天开始,我的某个目录就突然变了样子。

变成了这样——

0b55b319ebc4b7454a7169eec6fc1e178b821564.png

目录前面的小三角消失了,先要看到子目录里面的内容,就必须要点击进去,用完了,再返回上一层,痛苦死了。

其他目录都还好,就只有某一个目录变成了这样。好神奇,完全没有发现任何设置上面的差异。改变样式、重启了很多次之后无果。

上网搜索,发现了有人询问同样的问题:https://zhidao.baidu.com/question/501117001003014604.html

而且,按照回复去处理,依然无效。仔细一看,回复后面是连续的7个

]]>
0
<![CDATA[每周分享第 8 期]]> http://www.udpwork.com/item/16888.html http://www.udpwork.com/item/16888.html#reviews Fri, 08 Jun 2018 13:45:50 +0800 阮一峰 http://www.udpwork.com/item/16888.html 这里记录过去一周,我看到的值得分享的东西,每周五发布。

(题图:烟台山历史保护区,烟台,2017。我小时候的商店都是这种样子。)

最近,日本厚生劳动省公布了正式的统计数据。2017年,日本全国一共出生了94.6万个新生儿,这是有史以来最低的数字,比上一年足足少了3万人。日本人看到这个统计,都吓死了。日本的总人口是1.27亿左右,每年全国的新生儿只有90几万,这意味着什么?

这么说吧,日本现在缺少新生儿、将来就会缺少青年、缺少劳动力,再远的未来就会缺少活人,住宅和街道都会变成一片片渺无人烟的鬼屋。日本这个民族很可能从此一蹶不振了,不要说发展,忙于应付老龄化和缺少劳动力都会来不及。

媒体采访日本年轻人,为什么不愿意生小孩?原因很简单,一个是穷,年轻人没有钱,自己消费都不够,哪来多余的钱养小孩;另一个是太麻烦,照顾小孩要牺牲很多个人自由,甚至人生规划。

日本人都很悲观,觉得这种趋势没法改变。我突然想到,也不是完全没有办法,既然人类不愿意生育,可以在实验室里生产人啊!人工授精、人工胚胎早就没有问题了,现在主要是代孕代育没法替代,还没有人造子宫这种技术。如果将来有人工环境替代子宫,让受精卵变成新生儿,那么人口下降就不存在了,想要多少人,实验室提供受精卵就可以了。我相信,这在技术上完全可以实现。

当然,这样会产生很多问题:这些小孩的父母是谁?谁负责养育他们?一个人没有祖先会怎样?......但是,如果国家缺少人口已经到了要亡国亡种的地步,那时还能有什么选择?何况,没有怀胎十月和分娩之苦,大多数女性一定会乐于支持这种方案。

新闻

1、日本82岁老奶奶开发 App

日本82岁的老奶奶 Masako Wakamiya 2017年初开始学习编程,现在已经开发了一款免费的 iOS 游戏Hinadan,专门面向老年日本人。该 App 在苹果商店获得获得近5颗星,全球下载量大约为53,000。

编程的门槛将来会越来越低。事实上,应用层面的编程(UI + 组件逻辑)是不难的,很容易学会。现在的潮流是教小孩编程,其实中老年人编程教育的市场更大。这也是一种娱乐,比打麻将好多了。当然,最大的问题是老年人没英语基础,这就没办法了。

2、无人帆船 Saildrones

每年春天,成千上万的大白鲨开始神秘的迁徙,从美国西海岸直奔太平洋深处。生物学家一直希望了解,这些鲨鱼在那里干什么。今年总算有答案了,这要归功于一对名叫 Saildrones 无人帆船。

这种无人帆船实际上是可以航行的自动机器人,尽管人类可以远程控制,但是大部分时间是自动航行。2018年三月中旬,它们带着传感器,摄像机和科学仪器,从旧金山开始为期三周的1,200英里的鲨鱼观察之行。到了4月初,它们抵达预定地点,接收到了带有声波发射器的37只鲨鱼的信号。它们标识鲨鱼的位置,然后来回航行,使用声呐查看它们正在做什么。通过卫星,再将图像和其他数据转回给斯坦福大学的海洋生物学家芭芭拉·布洛克。

就像陆地上有无人汽车一样,将来海洋上也都会是无人驾驶的船只。

3、3纳米的芯片

三星宣布可以生产3纳米的芯片了,但还没有具体的投产时间。现在最先进的骁龙845芯片是10纳米。这意味着,未来同样大小的芯片,能够容纳10倍以上的晶体管,那是不是说计算能力起码还能强10倍?

二三十年后,每个人随身携带的计算能力,恐怕相当于今天的一个机房。这意味着什么?

这里有一个组图链接,帮助大家了解芯片的制程到底是什么?

4、YeeLight 停止向欧洲用户提供服务

小米旗下的智能灯具品牌 Yeelight 近日宣布,由于无法满足 GDPR 的要求,将不再向欧洲用户提供服务。作为该品牌的中国用户,我立刻得出结论,它的服务器上一定保存着我所有开灯/关灯的记录......

网友评论:然后他们在某次发布会上骄傲的展示,我们的智能家居大数据显示,北上广深中xx人睡的最晚,xx人最喜欢x色灯光......这就是大数据的力量!

5、30年后,QBasic 依然是入门的儿童编程语言

作者想教7岁的孩子编程,尝试了各种语言之后,他发现30年前流行的 QBasic 依然是最好的选择。

我先教他第一行代码:PRINT "hello world"。

然后,我又教了几个命令:CLS,COLOR,PLAY,INPUT和IF。没有什么可以解释的:没有复杂性,没有尴尬的操作符,没有抽象的概念,没有需要阅读的文档,没有对象/类/方法的概念,没有框架安装,没有特别的关键字或括号。这是代码最纯粹的形式。

不到一个小时,我7岁的孩子不仅能写出他的第一个源文件,还能体验创建、编译和执行他自己的小程序带来的乐趣和快感。

我意识到,30多年来,我们一直未能为我们的孩子提供更好的产品。我们创造了更强大和更复杂的语言/框架/ IDE,但我们从来没有比 QBasic 更简单或更直接地获得编程的快感。

这里还有一篇《Basic 语言的历史介绍》

6、Firefox 浏览器支持 Web Components

Firefox 浏览器最新的Nightly测试版本已经支持 Web Components。这是 Chrome 浏览器5年前开始推广的一种新技术,现在除了 Edge 浏览器,其他主要浏览器都已经支持了。

Web Components 是浏览器原生的组件解决方案。如果你愿意对新技术下赌注,可以考虑它。

7、Facebook 不向40岁以上的访问者推送招聘广告

美国一个组织发现,Facebook 允许广告主指定受众的年龄范围,结果导致40岁以上的访问者看不到招聘广告,而美国法律明文禁止招聘的年龄歧视。就像上面的广告,只有25~36岁的人才能看到。

贝米钱包

本期《每周分享》很高兴得到了贝米钱包www.bmqb.com)的赞助。

贝米钱包,2014年12月成立于上海,是一家专业网络借贷信息中介平台,已获得源码资本A轮千万级融资,出资人包括王兴、张一鸣等互联网巨头高管。

bm1.png | center | 400x128

平台主打中短期优质投资服务,目前共有定存计划、分红计划两款产品。

  • 定存计划:中长期投资,历史年化收益率达10.5%以上。
  • 分红计划:15天锁定期,30天后可以支取,低到100元起投,历史平均年化收益率达10%。

bm2.png | center | 826x276

现在,贝米钱包推出了贝米战队活动。专门针对程序员群体,提供更高的收益。一个战队2~5人,所有队员均可邀请好友入队,成功组队投资,最高可获得2958元现金红包。活动到6月20日就结束了,扫描以下二维码了解更多!

bm3.png | center | 206x206

另外,贝米钱包承诺会将本次活动利润的 5% 捐赠给开源社区,包括 vuejs , webpack , element, vux, babel 等项目。

教程

1、[文章]深度学习在线课程比较(英文)

深度学习是目前很热名的主题,各大网校都有这方面的课程。这篇文章比较了美国三大教育平台的深度学习课程:Coursera、Udemy 和 Udacity。

2、[文章]前端人工智能?TensorFlow.js 学会游戏通关(中文)

作者使用 TensorFlow.js,让程序自动完成 Chrome 浏览器的内置小游戏"恐龙快跑"。

3、[课程]哈佛大学游戏开发课程(英文)

哈佛大学游戏开发课程 CS50,提供讲课视频、课程笔记、PPT 和作业等资料。

4、[文章]马尔可夫决策过程(英文)

如何利用马尔可夫链建立一个决策模型,文章较好懂。

5、[PDF]Awk 编程语言(英文)

awk 是 Unix 命令行处理文本的有用工具,这里是1988年出版的 awk 教程。Unix 命令行高度稳定,所以这本教材也没那么过时。

6、[仓库]JavaScript 算法与数据结构(中文)

这个仓库收集了30多种算法的 JavaScript 实现。

7、[教程]高性能矩阵乘法(英文)

矩阵乘法需要计算每一行与所有列的乘积之和,如果矩阵很大,乘法计算是非常耗时的。这篇文章讨论如何实现一个高性能的矩阵乘法算法。

8、[电子书]Python - 100天从新手到大师(中文)

一本针对初学者的 Python 教程。

资源

1、GitHub 替代品

微软收购了 GitHub,导致一部分开发者怀疑这个平台的独立性,从而迁移到其他平台。这里列出了十几个 GitHub 的替代品,以及各自的优缺点。

工具

1、CalVer

语义版本(SemVer)现在很流行,就是根据 API 的变动为版本编号。这个网址提出另一种编号方法:根据日历编号,版本号就是发布日期。很多软件已经在用了,最有名的就是 Ubuntu,它的版本格式是 yy.mm,比如 16.04。

2、Jadesktop

一个使用 HTML5、CSS、JavaScript 和 Python 开发 Linux 桌面应用的工具。对的,你不需要 Electron。

3、Asteriod OS

开源的手表操作系统。

4、AutoCAD 在线版

三月份的消息,今天才看到。AutoCAD 浏览器版上线了,跟桌面版基本一致,背后的技术是 Webassembly。

5、Winds 2.0

一个开源的桌面 RSS 阅读器。

6、self-driving-toy-car

一个开源的自动驾驶玩具车,在小车上面绑了一个树莓派和摄像头。

7、Chromely

Electron 的挑战者越来越多,这个是 .NET 框架包装的 Chrome 浏览器内核。你现在可以使用 .NET 开发类似 Electron 的桌面应用。

8、Cool Backgrounds

自动生成背景图片的工具网站,现在提供五种风格,每种都可以定制,看上去赏心悦目。

文摘

1、有史以来最复杂的软件(英文)

作者认为,Stuxnet 蠕虫病毒可能是有史以来最复杂的软件。

我们不知道 Stuxnet 的作者是谁,只知道大概是在2005年至2010年间编写的。

这种病毒藏在 U 盘上。当 U 盘插入 PC,它会自动运行,将自已复制到该 PC。它至少有三种自动运行的方法。如果某种方法行不通,就尝试另一种。其中的两种运行方法是全新的,使用了 Windows 的两个无人知晓的秘密 Bug。

一旦蠕虫进入 PC ,它会尝试获得该 PC 的管理员权限,使用的也是前面提到的那两个无人知道的秘密 Bug。然后,它把自己留下的痕迹全部清除,不让防病毒软件检测到它的存在,用户不会看到任何东西。这种蠕虫隐藏得很好,出现后一年多,没有任何一家安全公司发现它的存在。

它会秘密访问http://www.mypremierfutbol.comhttp://www.todaysfutbol.com这两个网站,告诉服务器已经成功侵入了一台新的 PC,然后从网站下载最新版本自行更新。

它会将自身复制到任何插入该 PC 的 U 盘。使用的 U 盘驱动程序由 Realtek 公司进行了数字签名,但是 Realtek 公司并不知道有这个签名。这意味着,蠕虫作者能够获取 Realtek 公司的最高密钥。

它利用两个 Windows 的 Bug ----一个涉及网络打印机,另一个涉及网络文件----将自己传播到局域网里面的其他计算机上。

直到这一步,它的真正任务还没有开始。

它在每一台计算机上寻找一种由西门子设计的用于大型工业机械自动化的控制软件。一旦发现这种软件,它会使用另一个以前未知的 Bug,将自身复制到工业控制器的驱动程序。然后,它会检查两家特定公司的工业电机,其中一家公司在伊朗,另一家在芬兰。它要搜索的特定电机称为变频驱动器,主要用于运行工业离心机,提纯多种化学品,比如铀。

由于蠕虫完全控制了离心机,因此它可以做任何事情,可以将离心机全部关闭,也可以将它们全部摧毁:只需设定以最大速度旋转离心机,直到它们全都像炸弹一样爆炸,杀死任何恰好站在附近的人。

但它没有这么做,一旦它控制了每台离心机......它就进入潜伏。一旦达到设定的时间,它就会悄悄地唤醒自己,锁住离心机,使得人类无法关闭这些机器。然后悄悄地,蠕虫开始旋转这些离心机,修改了安全参数,增加了一些气体压力......

此外,它还会在离心机正常运转的时候,偷录一段21秒的数据记录。当它控制离心机运行的时候,会一遍又一遍地播放这段数据记录。管理人员会看到,计算机屏幕上的所有离心机运行数据都很正常,但这其实是蠕虫让他们看的。

现在让我们想象一下,有一家工厂正在用离心机净化铀。电脑上的所有数字都表明离心机运行正常。但是,离心机正在悄悄地出问题,一个接一个地倒下,这使得铀产量一直下降。铀必须是纯净的。你的铀不够纯净,无法做任何有用的事情。

工厂的管理者根本找不到原因,离心机的数据是正常的。你永远不会知道,所有这些问题都是由一种计算机蠕虫引起的。这是一种历史上最狡猾和最聪明的计算机蠕虫,它由一些拥有无限资金和无限资源的令人难以置信的秘密团队编写,并且设计时只考虑一个目的:偷偷摧毁某个国家的核弹计划,并且不被发现。

2、设计系统将取代设计师

Facebook 和 Airbnb 设计系统的创造者@soopa认为,随着设计系统越来越成熟,未来对于设计师的需求将会减少。

我加入 Facebook 时,有18位设计师。一年之后,设计师超过40人,但产品工程部门已经超过1000人,产品管理接近200人。公司正受到设计部门增长缓慢的影响。我们着手解决这个问题的方法是,就是制定设计系统。

设计系统将取代今天我们所知的许多设计工作。UI 开发、流程和工具就像可互换的零件和工厂装配线,可以减少人员创建与以前相同的产品。今天的许多设计师必须将预先设计的组件组装在一起 - 这项任务将越来越自动化。

设计系统可以实现更快速的产品开发,从而使公司能够开发更多产品。设计系统使得每个产品需要更少的设计师。

每周图片

1、《迈登斯的中国摄影集》

1941年,美国《生活》(LIFE)杂志摄影师迈登斯( Carl Mydans)来到中国,拍摄中国人民的抗战。现在,他拍摄的3332张照片已经可以在互联网免费下载。

2、监视器上的燕子

网友拍到有一窝燕子在监视器上著巢,燕妈妈飞来喂食。

3、芬兰的图书馆

芬兰是一个热爱读书、有很多图书馆的国家。上面照片里面如此具有现代感的图书馆,建成于1927年,照片拍摄于1935年。

本周金句

1、

到了2050年,海洋里面的塑料垃圾的数量将超过鱼。(BBC

2、

如果你在很年轻的时候,就遭受到了失败,一定要把它当作老天送你的礼物。如果等到四十岁再失败,你会经受不起的。为什么年纪越大,走路越小心,因为越来越经不起跌倒了。(网友)

欢迎订阅

这个专栏每周五发布,同步更新在我的个人网站微信公众号语雀

微信搜索"阮一峰的网络日志 "或者扫描二维码,即可订阅。

image | left

(完)

文档信息

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

(题图:烟台山历史保护区,烟台,2017。我小时候的商店都是这种样子。)

最近,日本厚生劳动省公布了正式的统计数据。2017年,日本全国一共出生了94.6万个新生儿,这是有史以来最低的数字,比上一年足足少了3万人。日本人看到这个统计,都吓死了。日本的总人口是1.27亿左右,每年全国的新生儿只有90几万,这意味着什么?

这么说吧,日本现在缺少新生儿、将来就会缺少青年、缺少劳动力,再远的未来就会缺少活人,住宅和街道都会变成一片片渺无人烟的鬼屋。日本这个民族很可能从此一蹶不振了,不要说发展,忙于应付老龄化和缺少劳动力都会来不及。

媒体采访日本年轻人,为什么不愿意生小孩?原因很简单,一个是穷,年轻人没有钱,自己消费都不够,哪来多余的钱养小孩;另一个是太麻烦,照顾小孩要牺牲很多个人自由,甚至人生规划。

日本人都很悲观,觉得这种趋势没法改变。我突然想到,也不是完全没有办法,既然人类不愿意生育,可以在实验室里生产人啊!人工授精、人工胚胎早就没有问题了,现在主要是代孕代育没法替代,还没有人造子宫这种技术。如果将来有人工环境替代子宫,让受精卵变成新生儿,那么人口下降就不存在了,想要多少人,实验室提供受精卵就可以了。我相信,这在技术上完全可以实现。

当然,这样会产生很多问题:这些小孩的父母是谁?谁负责养育他们?一个人没有祖先会怎样?......但是,如果国家缺少人口已经到了要亡国亡种的地步,那时还能有什么选择?何况,没有怀胎十月和分娩之苦,大多数女性一定会乐于支持这种方案。

新闻

1、日本82岁老奶奶开发 App

日本82岁的老奶奶 Masako Wakamiya 2017年初开始学习编程,现在已经开发了一款免费的 iOS 游戏Hinadan,专门面向老年日本人。该 App 在苹果商店获得获得近5颗星,全球下载量大约为53,000。

编程的门槛将来会越来越低。事实上,应用层面的编程(UI + 组件逻辑)是不难的,很容易学会。现在的潮流是教小孩编程,其实中老年人编程教育的市场更大。这也是一种娱乐,比打麻将好多了。当然,最大的问题是老年人没英语基础,这就没办法了。

2、无人帆船 Saildrones

每年春天,成千上万的大白鲨开始神秘的迁徙,从美国西海岸直奔太平洋深处。生物学家一直希望了解,这些鲨鱼在那里干什么。今年总算有答案了,这要归功于一对名叫 Saildrones 无人帆船。

这种无人帆船实际上是可以航行的自动机器人,尽管人类可以远程控制,但是大部分时间是自动航行。2018年三月中旬,它们带着传感器,摄像机和科学仪器,从旧金山开始为期三周的1,200英里的鲨鱼观察之行。到了4月初,它们抵达预定地点,接收到了带有声波发射器的37只鲨鱼的信号。它们标识鲨鱼的位置,然后来回航行,使用声呐查看它们正在做什么。通过卫星,再将图像和其他数据转回给斯坦福大学的海洋生物学家芭芭拉·布洛克。

就像陆地上有无人汽车一样,将来海洋上也都会是无人驾驶的船只。

3、3纳米的芯片

三星宣布可以生产3纳米的芯片了,但还没有具体的投产时间。现在最先进的骁龙845芯片是10纳米。这意味着,未来同样大小的芯片,能够容纳10倍以上的晶体管,那是不是说计算能力起码还能强10倍?

二三十年后,每个人随身携带的计算能力,恐怕相当于今天的一个机房。这意味着什么?

这里有一个组图链接,帮助大家了解芯片的制程到底是什么?

4、YeeLight 停止向欧洲用户提供服务

小米旗下的智能灯具品牌 Yeelight 近日宣布,由于无法满足 GDPR 的要求,将不再向欧洲用户提供服务。作为该品牌的中国用户,我立刻得出结论,它的服务器上一定保存着我所有开灯/关灯的记录......

网友评论:然后他们在某次发布会上骄傲的展示,我们的智能家居大数据显示,北上广深中xx人睡的最晚,xx人最喜欢x色灯光......这就是大数据的力量!

5、30年后,QBasic 依然是入门的儿童编程语言

作者想教7岁的孩子编程,尝试了各种语言之后,他发现30年前流行的 QBasic 依然是最好的选择。

我先教他第一行代码:PRINT "hello world"。

然后,我又教了几个命令:CLS,COLOR,PLAY,INPUT和IF。没有什么可以解释的:没有复杂性,没有尴尬的操作符,没有抽象的概念,没有需要阅读的文档,没有对象/类/方法的概念,没有框架安装,没有特别的关键字或括号。这是代码最纯粹的形式。

不到一个小时,我7岁的孩子不仅能写出他的第一个源文件,还能体验创建、编译和执行他自己的小程序带来的乐趣和快感。

我意识到,30多年来,我们一直未能为我们的孩子提供更好的产品。我们创造了更强大和更复杂的语言/框架/ IDE,但我们从来没有比 QBasic 更简单或更直接地获得编程的快感。

这里还有一篇《Basic 语言的历史介绍》

6、Firefox 浏览器支持 Web Components

Firefox 浏览器最新的Nightly测试版本已经支持 Web Components。这是 Chrome 浏览器5年前开始推广的一种新技术,现在除了 Edge 浏览器,其他主要浏览器都已经支持了。

Web Components 是浏览器原生的组件解决方案。如果你愿意对新技术下赌注,可以考虑它。

7、Facebook 不向40岁以上的访问者推送招聘广告

美国一个组织发现,Facebook 允许广告主指定受众的年龄范围,结果导致40岁以上的访问者看不到招聘广告,而美国法律明文禁止招聘的年龄歧视。就像上面的广告,只有25~36岁的人才能看到。

贝米钱包

本期《每周分享》很高兴得到了贝米钱包www.bmqb.com)的赞助。

贝米钱包,2014年12月成立于上海,是一家专业网络借贷信息中介平台,已获得源码资本A轮千万级融资,出资人包括王兴、张一鸣等互联网巨头高管。

bm1.png | center | 400x128

平台主打中短期优质投资服务,目前共有定存计划、分红计划两款产品。

  • 定存计划:中长期投资,历史年化收益率达10.5%以上。
  • 分红计划:15天锁定期,30天后可以支取,低到100元起投,历史平均年化收益率达10%。

bm2.png | center | 826x276

现在,贝米钱包推出了贝米战队活动。专门针对程序员群体,提供更高的收益。一个战队2~5人,所有队员均可邀请好友入队,成功组队投资,最高可获得2958元现金红包。活动到6月20日就结束了,扫描以下二维码了解更多!

bm3.png | center | 206x206

另外,贝米钱包承诺会将本次活动利润的 5% 捐赠给开源社区,包括 vuejs , webpack , element, vux, babel 等项目。

教程

1、[文章]深度学习在线课程比较(英文)

深度学习是目前很热名的主题,各大网校都有这方面的课程。这篇文章比较了美国三大教育平台的深度学习课程:Coursera、Udemy 和 Udacity。

2、[文章]前端人工智能?TensorFlow.js 学会游戏通关(中文)

作者使用 TensorFlow.js,让程序自动完成 Chrome 浏览器的内置小游戏"恐龙快跑"。

3、[课程]哈佛大学游戏开发课程(英文)

哈佛大学游戏开发课程 CS50,提供讲课视频、课程笔记、PPT 和作业等资料。

4、[文章]马尔可夫决策过程(英文)

如何利用马尔可夫链建立一个决策模型,文章较好懂。

5、[PDF]Awk 编程语言(英文)

awk 是 Unix 命令行处理文本的有用工具,这里是1988年出版的 awk 教程。Unix 命令行高度稳定,所以这本教材也没那么过时。

6、[仓库]JavaScript 算法与数据结构(中文)

这个仓库收集了30多种算法的 JavaScript 实现。

7、[教程]高性能矩阵乘法(英文)

矩阵乘法需要计算每一行与所有列的乘积之和,如果矩阵很大,乘法计算是非常耗时的。这篇文章讨论如何实现一个高性能的矩阵乘法算法。

8、[电子书]Python - 100天从新手到大师(中文)

一本针对初学者的 Python 教程。

资源

1、GitHub 替代品

微软收购了 GitHub,导致一部分开发者怀疑这个平台的独立性,从而迁移到其他平台。这里列出了十几个 GitHub 的替代品,以及各自的优缺点。

工具

1、CalVer

语义版本(SemVer)现在很流行,就是根据 API 的变动为版本编号。这个网址提出另一种编号方法:根据日历编号,版本号就是发布日期。很多软件已经在用了,最有名的就是 Ubuntu,它的版本格式是 yy.mm,比如 16.04。

2、Jadesktop

一个使用 HTML5、CSS、JavaScript 和 Python 开发 Linux 桌面应用的工具。对的,你不需要 Electron。

3、Asteriod OS

开源的手表操作系统。

4、AutoCAD 在线版

三月份的消息,今天才看到。AutoCAD 浏览器版上线了,跟桌面版基本一致,背后的技术是 Webassembly。

5、Winds 2.0

一个开源的桌面 RSS 阅读器。

6、self-driving-toy-car

一个开源的自动驾驶玩具车,在小车上面绑了一个树莓派和摄像头。

7、Chromely

Electron 的挑战者越来越多,这个是 .NET 框架包装的 Chrome 浏览器内核。你现在可以使用 .NET 开发类似 Electron 的桌面应用。

8、Cool Backgrounds

自动生成背景图片的工具网站,现在提供五种风格,每种都可以定制,看上去赏心悦目。

文摘

1、有史以来最复杂的软件(英文)

作者认为,Stuxnet 蠕虫病毒可能是有史以来最复杂的软件。

我们不知道 Stuxnet 的作者是谁,只知道大概是在2005年至2010年间编写的。

这种病毒藏在 U 盘上。当 U 盘插入 PC,它会自动运行,将自已复制到该 PC。它至少有三种自动运行的方法。如果某种方法行不通,就尝试另一种。其中的两种运行方法是全新的,使用了 Windows 的两个无人知晓的秘密 Bug。

一旦蠕虫进入 PC ,它会尝试获得该 PC 的管理员权限,使用的也是前面提到的那两个无人知道的秘密 Bug。然后,它把自己留下的痕迹全部清除,不让防病毒软件检测到它的存在,用户不会看到任何东西。这种蠕虫隐藏得很好,出现后一年多,没有任何一家安全公司发现它的存在。

它会秘密访问http://www.mypremierfutbol.comhttp://www.todaysfutbol.com这两个网站,告诉服务器已经成功侵入了一台新的 PC,然后从网站下载最新版本自行更新。

它会将自身复制到任何插入该 PC 的 U 盘。使用的 U 盘驱动程序由 Realtek 公司进行了数字签名,但是 Realtek 公司并不知道有这个签名。这意味着,蠕虫作者能够获取 Realtek 公司的最高密钥。

它利用两个 Windows 的 Bug ----一个涉及网络打印机,另一个涉及网络文件----将自己传播到局域网里面的其他计算机上。

直到这一步,它的真正任务还没有开始。

它在每一台计算机上寻找一种由西门子设计的用于大型工业机械自动化的控制软件。一旦发现这种软件,它会使用另一个以前未知的 Bug,将自身复制到工业控制器的驱动程序。然后,它会检查两家特定公司的工业电机,其中一家公司在伊朗,另一家在芬兰。它要搜索的特定电机称为变频驱动器,主要用于运行工业离心机,提纯多种化学品,比如铀。

由于蠕虫完全控制了离心机,因此它可以做任何事情,可以将离心机全部关闭,也可以将它们全部摧毁:只需设定以最大速度旋转离心机,直到它们全都像炸弹一样爆炸,杀死任何恰好站在附近的人。

但它没有这么做,一旦它控制了每台离心机......它就进入潜伏。一旦达到设定的时间,它就会悄悄地唤醒自己,锁住离心机,使得人类无法关闭这些机器。然后悄悄地,蠕虫开始旋转这些离心机,修改了安全参数,增加了一些气体压力......

此外,它还会在离心机正常运转的时候,偷录一段21秒的数据记录。当它控制离心机运行的时候,会一遍又一遍地播放这段数据记录。管理人员会看到,计算机屏幕上的所有离心机运行数据都很正常,但这其实是蠕虫让他们看的。

现在让我们想象一下,有一家工厂正在用离心机净化铀。电脑上的所有数字都表明离心机运行正常。但是,离心机正在悄悄地出问题,一个接一个地倒下,这使得铀产量一直下降。铀必须是纯净的。你的铀不够纯净,无法做任何有用的事情。

工厂的管理者根本找不到原因,离心机的数据是正常的。你永远不会知道,所有这些问题都是由一种计算机蠕虫引起的。这是一种历史上最狡猾和最聪明的计算机蠕虫,它由一些拥有无限资金和无限资源的令人难以置信的秘密团队编写,并且设计时只考虑一个目的:偷偷摧毁某个国家的核弹计划,并且不被发现。

2、设计系统将取代设计师

Facebook 和 Airbnb 设计系统的创造者@soopa认为,随着设计系统越来越成熟,未来对于设计师的需求将会减少。

我加入 Facebook 时,有18位设计师。一年之后,设计师超过40人,但产品工程部门已经超过1000人,产品管理接近200人。公司正受到设计部门增长缓慢的影响。我们着手解决这个问题的方法是,就是制定设计系统。

设计系统将取代今天我们所知的许多设计工作。UI 开发、流程和工具就像可互换的零件和工厂装配线,可以减少人员创建与以前相同的产品。今天的许多设计师必须将预先设计的组件组装在一起 - 这项任务将越来越自动化。

设计系统可以实现更快速的产品开发,从而使公司能够开发更多产品。设计系统使得每个产品需要更少的设计师。

每周图片

1、《迈登斯的中国摄影集》

1941年,美国《生活》(LIFE)杂志摄影师迈登斯( Carl Mydans)来到中国,拍摄中国人民的抗战。现在,他拍摄的3332张照片已经可以在互联网免费下载。

2、监视器上的燕子

网友拍到有一窝燕子在监视器上著巢,燕妈妈飞来喂食。

3、芬兰的图书馆

芬兰是一个热爱读书、有很多图书馆的国家。上面照片里面如此具有现代感的图书馆,建成于1927年,照片拍摄于1935年。

本周金句

1、

到了2050年,海洋里面的塑料垃圾的数量将超过鱼。(BBC

2、

如果你在很年轻的时候,就遭受到了失败,一定要把它当作老天送你的礼物。如果等到四十岁再失败,你会经受不起的。为什么年纪越大,走路越小心,因为越来越经不起跌倒了。(网友)

欢迎订阅

这个专栏每周五发布,同步更新在我的个人网站微信公众号语雀

微信搜索"阮一峰的网络日志 "或者扫描二维码,即可订阅。

image | left

(完)

文档信息

]]>
0