高性能 Nginx HTTPS 调优 – 如何为 HTTPS 提速 30%

为什么要优化 Ngin HTTPS 延迟Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer)、反向代理 (Reverse Proxy),以及网关 (Gateway) 等等。一个配置得当的 Nginx 服务器单机应该可以期望承受住 ...
继续阅读 »
为什么要优化 Ngin HTTPS 延迟

Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer)、反向代理 (Reverse Proxy),以及网关 (Gateway) 等等。一个配置得当的 Nginx 服务器单机应该可以期望承受住 50K 到 80K 左右每秒的请求,同时将 CPU 负载在可控范围内。

但在很多时候,负载并不是需要首要优化的重点。比如对于卡拉搜索来说,我们希望用户在每次击键的时候,可以体验即时搜索的感觉,也就是说,每个搜索请求必须在 100ms – 200ms 的时间内端对端地返回给用户,才能让用户搜索时没有“卡顿”和“加载”。因此,对于我们来说,优化请求延迟才是最重要的优化方向。

这篇文章中,我们先介绍 Nginx 中的 TLS 设置有哪些与请求延迟可能相关,如何调整才能最大化加速。然后我们用优化卡拉搜索 Nginx 服务器的实例来分享如何调整 Nginx TLS/SSL 设置,为首次搜索的用户提速 30% 左右。我们会详细讨论每一步我们做了一些什么优化,优化的动机和效果。希望可以对其它遇到类似问题的同学提供帮助。

照例,本文的 Nginx 设置文件放置于 github,欢迎直接使用: 高性能 Nginx HTTPS 调优

TLS 握手和延迟

很多时候开发者会认为:如果不是绝对在意性能,那么了解底层和更细节的优化没有必要。这句话在很多时候是恰当的,因为很多时候复杂的底层逻辑必须包起来,才能让更高层的应用开发复杂度可控。比如说,如果你就只需要开发一个 APP 或者网站,可能并没有必要关注汇编细节,关注编译器如何优化你的代码——毕竟在苹果或者安卓上很多优化在底层就做好了。

那么,了解底层的 TLS 和应用层的 Nginx 延迟优化有什么关系呢?

答案是多数情况下,优化网络延迟其实是在尝试减少用户和服务器之间的数据传输次数,也就是所谓的 roundtrip。由于物理限制,北京到云南的光速传播差不多就是要跑 20 来毫秒,如果你不小心让数据必须多次往返于北京和云南之间,那么必然延迟就上去了。

因此如果你需要优化请求延迟,那么了解一点底层网络的上下文则会大有裨益,很多时候甚至是你是否可以轻松理解一个优化的关键。本文中我们不深入讨论太多 TCP 或者 TLS 机制的细节,如果有兴趣的话请参考 High Performance Browser Networking 一书。

举个例子,下图中展示了如果你的服务启用了 HTTPS,在开始传输任何数据之前的数据传输情况。

微信图片_20210222152252.png

可以看到,在你的用户拿到他需要的数据前,底层的数据包就已经在用户和你的服务器之间跑了 3 个来回。

假设每次来回需要 28 毫秒的话,用户已经等了 224 毫秒之后才开始接收数据。

同时这个 28 毫秒其实是非常乐观的假设,在国内电信、联通和移动以及各种复杂的网络状况下,用户与服务器之间的延迟更不可控。另一方面,通常一个网页需要数十个请求,这些请求不一定可以全部并行,因此几十乘以 224 毫秒,页面打开可能就是数秒之后了。

所以,原则上如果可能的话,我们需要尽量减少用户和服务器之间的往返程 (roundtrip),在下文的设置中,对于每个设置我们会讨论为什么这个设置有可能帮助减少往返程。

Nginx 中的 TLS 设置

那么在 Nginx 设置中,怎样调整参数会减少延迟呢?

开启 HTTP/2

HTTP/2 标准是从 Google 的 SPDY 上进行的改进,比起 HTTP 1.1 提升了不少性能,尤其是需要并行多个请求的时候可以显著减少延迟。在现在的网络上,一个网页平均需要请求几十次,而在 HTTP 1.1 时代浏览器能做的就是多开几个连接(通常是 6 个)进行并行请求,而 HTTP 2 中可以在一个连接中进行并行请求。HTTP 2 原生支持多个并行请求,因此大大减少了顺序执行的请求的往返程,可以首要考虑开启。

如果你想自己看一下 HTTP 1.1 和 HTTP 2.0 的速度差异,可以试一下我的网络测试下来 HTTP/2 比 HTTP 1.1 快了 66%。

在 Nginx 中开启 HTTP 2.0 非常简单,只需要增加一个 http2 标志即可listen 443 ssl;# 改为listen 443 ssl http2;

如果你担心你的用户用的是旧的客户端,比如 Python 的 requests,暂时还不支持 HTTP 2 的话,那么其实不用担心。如果用户的客户端不支持 HTTP 2,那么连接会自动降级为 HTTP 1.1,保持了后向兼容。因此,所有使用旧 Client 的用户,仍然不受影响,而新的客户端则可以享受 HTTP/2 的新特性。

如何确认你的网站或者 API 开启了 HTTP 2

在 Chrome 中打开开发者工具,点开 Protocol 之后在所有的请求中都可以看到请求用的协议了。如果 protocol 这列的值是 h2 的话,那么用的就是 HTTP 2 了

调整 Cipher 优先级

尽量挑选更新更快的 Cipher,有助于减少延迟:# 手动启用 cipher 列表ssl_prefer_server_ciphers on;  # prefer a list of ciphers to prevent old and slow ciphersssl_ciphers ‘EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH’;

启用 OCSP Stapling

在国内这可能是对使用 Let’s Encrypt 证书的服务或网站影响最大的延迟优化了。如果不启用 OCSP Stapling 的话,在用户连接你的服务器的时候,有时候需要去验证证书。而因为一些不可知的原因(这个就不说穿了)Let’s Encrypt 的验证服务器并不是非常通畅,因此可以造成有时候数秒甚至十几秒延迟的问题,这个问题在 iOS 设备上特别严重

解决这个问题的方法有两个:

  1. 不使用 Let’s Encrypt,可以尝试替换为阿里云提供的免费 DV 证书

  2. 开启 OCSP Stapling

开启了 OCSP Stapling 的话,跑到证书验证这一步可以省略掉。省掉一个 roundtrip,特别是网络状况不可控的 roundtrip,可能可以将你的延迟大大减少。

在 Nginx 中启用 OCSP Stapling 也非常简单,只需要设置:ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/full_chain.pem;

如何检测 OCSP Stapling 是否已经开启?

可以通过以下命令openssl s_client -connect test.kalasearch.cn:443 -servername kalasearch.cn -status -tlsextdebug < /dev/null 2>&1 | grep -i “OCSP response”

来测试。如果结果为OCSP response: OCSP Response Data:     OCSP Response Status: successful (0x0)     Response Type: Basic OCSP Response

则表明已经开启。参考 HTTPS 在 iPhone 上慢的问题 一文

调整 ssl_buffer_size

sslbuffersize 控制在发送数据时的 buffer 大小,默认设置是 16k。这个值越小,则延迟越小,而添加的报头之类会使 overhead 会变大,反之则延迟越大,overhead 越小。

因此如果你的服务是 REST API或者网站的话,将这个值调小可以减小延迟和 TTFB,但如果你的服务器是用来传输大文件的,那么可以维持 16k。关于这个值的讨论和更通用的 TLS Record Size 的讨论,可以参考:Best value for nginx’s sslbuffersize option

如果是网站或者 REST API,建议值为 4k,但是这个值的最佳取值显然会因为数据的不同而不一样,因此请尝试 2 – 16k 间不同的值。在 Nginx 中调整这个值也非常容易ssl_buffer_size 4k;

启用 SSL Session 缓存

启用 SSL Session 缓存可以大大减少 TLS 的反复验证,减少 TLS 握手的 roundtrip。虽然 session 缓存会占用一定内存,但是用 1M 的内存就可以缓存 4000 个连接,可以说是非常非常划算的。同时,对于绝大多数网站和服务,要达到 4000 个同时连接本身就需要非常非常大的用户基数,因此可以放心开启。

这里 ssl_session_cache 设置为使用 50M 内存,以及 4 小时的连接超时关闭时间 ssl_session_timeout# Enable SSL cache to speed up for return visitorsssl_session_cache   shared:SSL:50m; # speed up first time. 1m ~= 4000 connectionsssl_session_timeout 4h;

卡拉搜索如何减少 30% 的请求延迟

卡拉搜索是国内的 Algolia,致力于帮助开发者快速搭建即时搜索功能(instant search),做国内最快最易用的搜索即服务。

开发者接入后,所有搜索请求通过卡拉 API 即可直接返回给终端用户。为了让用户有即时搜索的体验,我们需要在用户每次击键后极短的时间内(通常是 100ms 到 200ms)将结果返回给用户。因此每次搜索需要可以达到 50 毫秒以内的引擎处理时间和 200 毫秒以内的端对端时间。

我们用豆瓣电影的数据做了一个电影搜索的 Demo,如果感兴趣的话欢迎体验一下即时搜索,尝试一下搜索“无间道”或者“大话西游”体验一下速度和相关度:https://movies-demo.kalasearch.cn/

对于每个请求只有 100 到 200 毫秒的延迟预算,我们必须把每一步的延迟都考虑在内。

简化一下,每个搜索请求需要经历的延迟有

总延迟 = 用户请求到达服务器(T1) + 反代处理(Nginx T2) + 数据中心延迟(T3) + 服务器处理 (卡拉引擎 T4) + 用户请求返回(T3+T1)

在上述延迟中,T1 只与用户与服务器的物理距离相关,而 T3 非常小(参考Jeff Dean Numbe)可以忽略不计。

所以我们能控制的大致只有 T2 和 T4,即 Nginx 服务器的处理时间和卡拉的引擎处理时间。

Nginx 在这里作为反向代理,处理一些安全、流量控制和 TLS 的逻辑,而卡拉的引擎则是一个在 Lucene 基础上的倒排引擎。

我们首先考虑的第一个可能性是:延迟是不是来自卡拉引擎呢?

在下图展示的 Grafana 仪表盘中,我们看到除了几个时不时的慢查询,搜索的 95% 服务器处理延迟小于 20 毫秒。对比同样的数据集上 benchmark 的 Elastic Search 引擎的 P95 搜索延迟则在 200 毫秒左右,所以排除了引擎速度慢的可能。

微信图片_20210222152318.png

而在阿里云监控中,我们设置了从全国各地向卡拉服务器发送搜索请求。我们终于发现 SSL 处理时间时常会超过 300 毫秒,也就是说在 T2 这一步,光处理 TLS 握手之类的事情,Nginx 已经用掉了我们所有的请求时间预算。

同时检查之后我们发现,在苹果设备上搜索速度格外慢,特别是第一次访问的设备。因此我们大致判断应该是因为我们使用的 Let’s Encrypt 证书的问题。

我们按照上文中的步骤对 Nginx 设置进行了调整,并将步骤总结出来写了这篇文章。在调整了 Nginx TLS 的设置后,SSL 时间从平均的 140ms 降低到了 110ms 左右(全国所有省份联通和移动测试点),同时苹果设备上首次访问慢的问题也消失了。

在调整过后,全国范围内测试的搜索延迟降低到了 150 毫秒左右。

微信图片_20210222152343.png

总结

调整 Nginx 中的 TLS 设置对于使用 HTTPS 的服务和网站延迟有非常大的影响。本文中总结了 Nginx 中与 TLS 相关的设置,详细讨论各个设置可能对延迟的影响,并给出了调整建议。之后我们会继续讨论 HTTP/2 对比 HTTP 1.x 有哪些具体改进,以及在 REST API 使用 HTTP/2 有哪些优缺点,请继续关注


收起阅读 »

人脸识别除了可以破案,还能制造冤案…

新年伊始,关心国外动态的同学一定清楚,现在全美最关心的可不是什么新冠疫情,而是全国各地到处在发生的各种歧视黑人的种族歧视游行,尤其是不断有白人警察恶意对待黑人群众的新闻爆出,犹如星星之火可以燎原,有愈演愈烈之势。这不,又有人翻出一起去年发生的案件,但这次被指责...
继续阅读 »

新年伊始,关心国外动态的同学一定清楚,现在全美最关心的可不是什么新冠疫情,而是全国各地到处在发生的各种歧视黑人的种族歧视游行,尤其是不断有白人警察恶意对待黑人群众的新闻爆出,犹如星星之火可以燎原,有愈演愈烈之势。

这不,又有人翻出一起去年发生的案件,但这次被指责的除了白人警察却牵扯上了人脸识别功能。究竟是怎么一回事呢?

案件发生在去年1月,在美国新泽西州伍德布里奇市的一个名为汉普顿的酒店,酒店人员向警方报案,声称有人在酒店礼品店偷了糖果和其他零食。待警方赶到后,嫌疑人提供了一张驾照作为身份证明。

可以清楚的看到,驾照上的人叫做Jamal Owens。警方随即通过驾照确认身份时发现,这份驾照是一份伪造的证件,正当他们想采取进一步措施时,这个Jamal Owens已经从酒店逃了出去,并且开走了一辆道奇,逃之夭夭。

微信图片_20210222151650.jpg

照理说,警方都见过嫌疑犯,应该不难抓获,但神奇的是,警方回去后直接用面部扫描软件扫描他们缴获的驾照(都知道是假的了为什么还要去以此为准),然后和FBI数据库中存档的嫌疑人照片进行比对,宣布找到了嫌疑犯!

看着像吗?反正DD是脸盲,一直分不清楚黑人兄弟的区别,在我看来,这和NBA一些球员也是很像,例如死神KD,就是那位愿意喝斯嘉丽洗澡水的杜兰特。

然后,号称全球最公正自由的国度的警察在没有校验指纹、没有检测DNA的情况下,仅仅依靠这个人脸识别结果,就对这个名为Nijeer Parks的可怜兄弟发布了逮捕令!

可怜这位Nijeer Parks压根都不知道那个酒店在哪,压根就不会开车,驾照都没有。就莫名其妙成了一个通缉犯。

通缉的罪名还不少,商店盗窃、伪造政府文件、拒捕、严重的武器攻击、离开事故现场等。

当Nijeer Parks知道这件事的时候,主动让他表哥带着他赶紧去了警局,试图解释清楚自己的身份,解释清楚这件事情。

结果,刚到警察局门口,还没等开口,他就直接被铐上手铐,被七八个白人警察同时审讯,无论他怎么解释,对方认准了他就是那个犯人,根本视他的解释为无物。直接将他扔进了监狱。。。

我就奇怪了,难道美帝的警察也和DD一样是脸盲?或者这哥们要是一个白人脸,他们还会不会这样轻易认错?

Nijeer Parks后来说,当时就有检察官跟他说:

如果乖乖认罪,作为交换条件,他将在监狱中服刑6年,直到他服完85%的刑期就可以提前释放,其中还有3年假释。

但他认为一切都是托词,如果他接受审判,检察官会根据他以前的犯罪历史寻求20年或更长时间的判决。因为他曾因贩卖毒品而被定罪6年,但出狱后他已经决定改过自新,并且已经找到一份文员的工作,与未婚妻过着安稳的生活。

但警方仅仅依靠人脸识别就把他抓了起来,打破了他的宁静人生。为此,他决定开启他的上诉之旅!

Nijeer Parks及他的委托律师表示,警方用的人脸识别软件,主要依赖于数十亿张社交媒体照片来识别犯罪嫌疑人,新泽西州早已经禁止使用这种软件。据称已经有高级法院的法官开始向当地检察官办公室施压,要求他们在这个案件中拿出更多的证据,而不仅是人脸识别软件。

Nijeer Parks的遭遇的确让人忿忿不平。这件事时隔许久又在这个敏感时刻被人提起,一方面不由让人担心美国的整体社会环境,但是另一方面,也是因为警方过度依赖人脸识别软件导致。长久以来,人脸识别软件的批评人士一直认为,人脸识别技术暂时还无法可靠地识别嫌疑人,特别是识别颗粒状的监控照片。人脸识别技术开发商也曾多次警告,不要将其技术作为逮捕嫌犯的唯一依据,而仅仅作为辅助功能。

当然不仅仅是黑人,其实白人也被人脸识别软件坑过。

2014年,就曾有过一位名叫Steve Tally的白人财务顾问被诬告抢劫了两次银行。即使Tally有充分的不在场证据:他当时正在一家公司里上班并有人作证。警方仍以人脸识别结果为依旧把Tally关押了两个月,并在这期间打伤了他。

直到两个月后,Tally的辩护人拿出了他在公司上班的监控录像,Tally才得到释放!

那么人脸识别到底是否可以作为指控一个人的确切证据呢?

早在2009年,美国国家科学院就曾指出:就目前的技术水平,除了DNA测试外,没有任何其他法医证据方法可以可靠且始终如一地证明证据与特定个人或资料来源之间的联系。

简单的说,从技术角度来说,人们还无法从人脸识别上确定某个嫌疑人的唯一性!

人脸识别还存在另一个严重问题:

监控摄像头会压缩视频图像,导致用来区分嫌疑人的皮肤、静脉和痣等图案被去除、损坏或变形。最后导致识别结果不正确!

微信图片_20210222151629.jpg

尽管这几年人脸识别技术有了一定的发展,算法可以在几秒钟内搜索数百万张脸,对于具有规则照明和标准化姿势的图像,许多人脸识别系统的准确率的确超越了人类。但仍然没有一个算法可以保证100%的正确率。那在一些重要的部门,哪怕0.0001%的误差也是不可以接受的!

尤其现在各种移动金融支付的普及,越来越多的人开始使用人脸识别进行手机解锁、移动支付等一系列功能,万一识别出错或者资料泄露,都将对个人的人身与财产安全造成极大的危害。也许正因为如此人们对于人脸识别的态度越来越慎重。去年5月,旧金山出于安全与隐私的考虑,禁止政府使用人脸识别技术,成为全球第一个禁用人脸识别的城市。

国内目前来说,暂时还没有类似的新闻,唯一让我们欣慰的是,利用人脸识别技术,国内可是在张学友演唱会依靠人脸识别抓了几十个逃犯了!

来源于公众号“程序猿DD”


收起阅读 »

好用!目前用下来最溜的MacOS微信多开工具!

一个生活微信,一个工作微信是很多上班族的基本配置。但由于微信客户端在PC端上只能打开一个,这使得在上班时候就非常不便,一个号在PC端上登录,一个在手机上使用,但是上班时候又不能一直看手机,不然老板还以为你在玩呢。所以,对于打开多个微信客户端的需求就来了!查了一...
继续阅读 »

一个生活微信,一个工作微信是很多上班族的基本配置。

但由于微信客户端在PC端上只能打开一个,这使得在上班时候就非常不便,一个号在PC端上登录,一个在手机上使用,但是上班时候又不能一直看手机,不然老板还以为你在玩呢。

所以,对于打开多个微信客户端的需求就来了!

查了一下百度,有几个基本的多开方法,简单总结下大致有以下三类:

第一类:创建微信应用的副本,通过复刻多个微信应用来实现。

微信图片_20210222151152.jpg

第二类:使用下面命令实现

open /Applications/WeChat.app/Contents/MacOS/WeChat

优化下命令,这样可以关闭终端

nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &

上面的两类虽然都能实现,但都不那么方便,昨天小编发现了一个更好用的工具:WeChatTweak-macOS

先上一波效果:

微信图片_20210222151155-186x300.png

是不是很简洁?只需要在微信图标上右键,就能快速开启新的微信客户端!

有咩有觉得很好用呀?赶紧上车,开启微信多开之路吧!


收起阅读 »

想让进程后台运行,试试Linux的nohup命令,3分钟学会。

1.命令简介nohup 的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。将程序放到后台运行,一般有两种方式:(1)command &:...
继续阅读 »
1.命令简介

nohup 的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。

将程序放到后台运行,一般有两种方式:

(1)command &:后台运行,关掉终端会停止运行。

(2)nohup command & :后台运行,关掉终端也会继续运行。

注意: 

(1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录的 nohup.out 文件中。如果当前工作目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开用于追加,那么 command 参数指定的命令不可调用。

(2)如果标准错误未显示重定向,那么标准错误默认重定向到与标准输出相同的文件。

2.命令格式

nohup COMMAND [ARGS] nohup OPTION

3选项说明

–help 显示帮助信息并退出 –version  显示版本信息并退出

4.常用示例

(1)使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。nohup ./test.sh &

(2)标准输出与标准错误输出重定向。nohup ./test.sh > test.log 2>&1 &

注意: (1)2>&1 标识标准错误输出重定向等同于标准输出重定向,即标准错误输出也重定向到文件test.log;(2)& 命令是命令放在后台执行,需要放在命令的最后面。


收起阅读 »

X-Meetup丨『高质量、高并发的实时通信架构设计与探索』重庆站火热报名中……

中国互联网络信息中心(CNNIC)近日发布的第 47 次《中国互联网络发展状况统计报告》显示,截至 2020 年 12 月,我国网民规模达 9.89 亿。随着社会信息化水平持续提升及电子设备加速普及,手机网民规模持续增长,基本实现对全体网民的覆盖,庞大的手机网...
继续阅读 »

中国互联网络信息中心(CNNIC)近日发布的第 47 次《中国互联网络发展状况统计报告》显示,截至 2020 年 12 月,我国网民规模达 9.89 亿。随着社会信息化水平持续提升及电子设备加速普及,手机网民规模持续增长,基本实现对全体网民的覆盖,庞大的手机网民规模为各类移动应用开拓市场提供了基础。


社交娱乐、直播电商、在线教育、生活服务、智能硬件等领域保持高速增长,移动应用也得到更多发展机遇,用户规模不断提升。如何为亿级用户带来更加优质的沟通体验,在业务端更好地服务用户,成为许多公司面临的难题。迭代升级实时通信架构,向高质量、高并发方向升级成为最佳选择。

2021年3月20日
重庆市九龙坡区杨家坪
保利时代广场二楼车库咖啡
行业顶级通信架构师
为你带来
高质量、高并发的实时通信架构设计探索

活动详情见下图

↓↓↓


重庆站长图-带二维码.png

收起阅读 »

iOS推送:要支持戴口罩解锁了!网友看完:原来是骗我买iWatch…

IOS
疫情期间,大家都养成了出门戴口罩的习惯。戴口罩可以有效隔离病菌,但是对于一些需要Face ID 面部识别的app来说,每次需要把口罩拉上拉下的,也蛮不方便。就像iphone每次解锁就需要拉下口罩。然而,就在2月2号,苹果官方宣布iOS14.5测试版的更新,最大...
继续阅读 »

疫情期间,大家都养成了出门戴口罩的习惯。戴口罩可以有效隔离病菌,但是对于一些需要Face ID 面部识别的app来说,每次需要把口罩拉上拉下的,也蛮不方便。就像iphone每次解锁就需要拉下口罩。

然而,就在2月2号,苹果官方宣布iOS14.5测试版的更新,最大的卖点就是戴口罩解锁功能!

什么?戴着口罩也能解锁?真的这么黑科技?苹果不亏是国际大厂,技术总是领先一步!

且慢夸奖,让我们一起来看个究竟。

iOS14.5测试版属于测试版系统,需要用户安装描述文件才可以更新,更新文件的大小在4.5G,版本号是18E5140j微信图片_20210222150307.png更新好了之后,你会发现新增了一个解锁方式,通过 Apple Watch 解锁微信图片_20210222150313.png

什么?不是戴口罩解锁吗?怎么变成了Apple Watch 解锁?是这样的,如下图所见,除了本次升级的iOS14.5测试版,Apple Watch 也升级了一个测试版本watchOS 7.4 ,只要你的Apple Watch是三代以上的版本,并且安装了这个watchOS 7.4测试版,就可以在你的iPhone里面选择启用UNLOCK WITH APPLE WATCH选项。

然后,每次当你使用Face ID面部识别解锁iphone时,只要检测到你的Apple Watch就在附近,就能直接解锁了,这就是所谓的戴口罩解锁!

很多人会问这个Apple Watch就在附近到底要多近,至少插在口袋里的距离完全不成问题。

而且非常神奇的是,通过 Apple Watch 解锁 iPhone 这个功能是专门针对了戴口罩的情况,如果没有戴口罩反而是无法解锁的!无法解锁的!无法解锁的!重要的事情说三遍,这。。这外国人的脑回路咱也不懂也不好多说。

当然为了安全所见,Apple Watch 是只能用来解锁 iPhone,暂时还是无法直接代替面容支付一系列的功能,记住,仅仅可以解锁!

所以总结下来,为了能戴口罩解锁,我们必须去买一个Apple Watch?

那么问题来了,你会为了一个戴口罩解锁功能去买一个Apple Watch吗?

收起阅读 »

23种设计模式的通俗解释

01 工厂方法追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式:客户类和工厂类分开。消费...
继续阅读 »

01 工厂方法

追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式:客户类和工厂类分开。

消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

02 建造者模式

MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

03 抽象工厂

请 MM 去麦当劳吃汉堡,不同的 MM 有不同的口味,要每个都记住是一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说「要一个汉堡」,具体要什么样的汉堡呢,让 MM 直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

04 原型模式

跟 MM 用 QQ 聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要 copy 出来放到 QQ 里面就行了,这就是我的情话 prototype 了。(100 块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

05 单态模式

俺有 6 个漂亮的老婆,她们的老公都是我,我就是我们家里的老公 Sigleton,她们只要说道「老公」,都是指的同一个人,那就是我 (刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 “单一实例” 的需求时才可使用。

06 适配器模式

在朋友聚会上碰到了一个美女 Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友 kent 了,他作为我和 Sarah 之间的 Adapter,让我和 Sarah 可以相互交谈了 (也不知道他会不会耍我)

适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

07 桥梁模式

早上碰到 MM,要说早上好,晚上碰到 MM,要说晚上好;碰到 MM 穿了件新衣服,要说你的衣服好漂亮哦,碰到 MM 新做的发型,要说你的头发好漂亮哦。不要问我 “早上碰到 MM 新做了个发型怎么说” 这种问题,自己用 BRIDGE 组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合 / 聚合关系而不是继承关系,从而使两者可以独立的变化。

08 合成模式

Mary 今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件 T 恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T 恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”,MM 都会用 Composite 模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

09 装饰模式

Mary 过完轮到 Sarly 过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上 “最好的的礼物,就是爱你的 Fita”,再到街上礼品店买了个像框(卖礼品的 MM 也很漂亮哦),再找隔壁搞美术设计的 Mike 设计了一个漂亮的盒子装起来……,我们都是 Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10 门面模式

我有一个专业的 Nikon 相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但 MM 可不懂这些,教了半天也不会。幸好相机有 Facade 设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样 MM 也可以用这个相机给我拍张照片了。门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。

门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11 享元模式

每天跟 MM 发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上 MM 的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是 Flyweight,MM 的名字就是提取出来的外部特征,根据上下文情况使用。享元模式:FLYWEIGHT 在拳击比赛中指最轻量级。

享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。

将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

12 代理模式

跟 MM 在网上聊天,一开头总是 “hi, 你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?” 这些话,真烦人,写个程序做为我的 Proxy 吧,凡是接收到这些话都设置好了自己的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。

客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

13 责任链模式

晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的 MM 哎,找张纸条,写上 “Hi, 可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的 MM 把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14 命令模式

俺有一个 MM 家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个 COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送 COMMAND,就数你最小气,才请我吃面。”

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

15 解释器模式

俺有一个《泡 MM 真经》,上面有各种泡 MM 的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟 MM 约会时,只要做一个 Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。

在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

16 迭代模式

我爱上了 Mary,不顾一切的向她求婚。Mary:“想要我跟你结婚,得答应我的条件” 我:“什么条件我都答应,你说吧” Mary:“我看上了那个一克拉的钻石” 我:“我买,我买,还有吗?” Mary:“我看上了湖边的那栋别墅” 我:“我买,我买,还有吗?” Mary:“我看上那辆法拉利跑车” 我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”

迭代模式:迭代模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。

迭代模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17 调停者模式

四个 MM 打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就 OK 啦,俺得到了四个 MM 的电话。调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。

当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18 备忘录模式

同时跟几个 MM 聊天时,一定要记清楚刚才跟 MM 说了些什么话,不然 MM 发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个 MM 说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19 观察者模式

想知道咱们公司最新 MM 情报吗?加入公司的 MM 情报邮件组就行了,tom 负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20 状态模式

跟 MM 交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的 MM 就会说 “有事情啦”,对你不讨厌但还没喜欢上的 MM 就会说 “好啊,不过可以带上我同事么?”,已经喜欢上你的 MM 就会说 “几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把 MM 的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。

状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21 策略模式

跟不同类型的 MM 约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到 MM 的芳心,我的追 MM 锦囊中有好多 Strategy 哦。策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

22 模板方法模式

看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤 (Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦 (具体实现);

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23 访问者模式

情人节到了,要给每个 MM 送一束鲜花和一张卡片,可是每个 MM 送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下 Visitor,让花店老板根据 MM 的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。

访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

来源于公众号“程序猿DD”

收起阅读 »

阿里开源台柱 Ant Design 源码仓库被删了…

号外,号外,Ant Design 源码仓库被删除!在广大中国人民还在欢天喜地过新年的时候,Ant Design项目组成员一定是焦头烂额。因为就在2.15,也就是农历大年初四的时候,一位名叫Jeggy的用户首先在stackoverflow上发文表示Ant Des...
继续阅读 »

号外,号外,Ant Design 源码仓库被删除!

在广大中国人民还在欢天喜地过新年的时候,Ant Design项目组成员一定是焦头烂额。

因为就在2.15,也就是农历大年初四的时候,一位名叫Jeggy的用户首先在stackoverflow上发文表示Ant Design 项目在 GitHub 上的源码库地址发现无法访问的情况,疑似是被官方删除。(题外话,Jeggy用户真是醉心于学习的好孩子,大过年的还这么认真…)

微信图片_20210222144846.png

Ant Design源码库打开显示404,官方网站打不开,但是npm的包依旧可以下载使用。

Ant Design 官方立刻展开式调查,初步认定此次事件是受到黑客攻击导致。

同时官方还马上发表声明:

  • 1、事故原因我们正在调查(潜台词:吃瓜群众不要瞎猜猜)

  • 2、目前只修复了ant.design网站,关于Github源码库的修复工作要靠Github官方大佬帮忙了(潜台词:吃瓜群众就不要催我们了)

  • 3、这个事件不会影响Ant Design框架的用户,Github上Ant Design源码仓库的项目所有者没有发生变化,正在和Github官方一起恢复源码库。(潜台词:吃瓜群众好散了)

微信图片_20210222144907.png

Ant Design 是一套企业级 UI 设计语言和 React 组件库,在社区中拥有庞大的用户群体,深受用户喜爱。相信这一次事件也会影响不少用户的使用。

如果你现在在Ant Design新创建了一个临时的源码仓库,只有简短的一句话介绍:

antd repo disappear, we are contacting to GitHub.

关于事态的进一步发展,小编会第一时间跟进告诉大家。想知道后续进展的记得点个关注。

收起阅读 »

GitHub最最最火的开源爬虫工具箱,一爬就取

现在一般网站都有反爬虫机制,对于爱爬虫的朋友来说,想爬虫些数据,做下数据分析。是越来越难了。不过最近我们,发现一个超宝藏的爬虫工具箱。这个爬虫工具箱有多火呢?开源没几天就登上GitHub周榜第四,标星1.3K,累计分支 172 个。同时作者已经开源了所有的项目...
继续阅读 »

现在一般网站都有反爬虫机制,对于爱爬虫的朋友来说,想爬虫些数据,做下数据分析。是越来越难了。不过最近我们,发现一个超宝藏的爬虫工具箱。

这个爬虫工具箱有多火呢?

开源没几天就登上GitHub周榜第四,标星1.3K,累计分支 172 个。同时作者已经开源了所有的项目代码及使用文档,并且在B站上还有使用视频讲解。

在这样一个信息爆炸的时代,每个人都有很多个账号,账号一多就会出现这么一个情况:个人数据分散在各种各样的公司之间,就会形成数据孤岛,多维数据无法融合,这个项目可以帮你将多维数据进行融合并对个人数据进行分析,这样你就可以更直观、深入了解自己的信息。

InfoSpider 是一个集众多数据源于一身的爬虫工具箱,旨在安全快捷的帮助用户拿回自己的数据,工具代码开源,流程透明,并提供数据分析功能,基于用户数据生成图表文件。

微信图片_20210222145419.png

目前支持数据源包括GitHub、QQ邮箱、网易邮箱、阿里邮箱、新浪邮箱、Hotmail邮箱、Outlook邮箱、京东、淘宝、支付宝、中国移动、中国联通、中国电信、知乎、哔哩哔哩、网易云音乐、QQ好友、QQ群、生成朋友圈相册、浏览器浏览历史、12306、博客园、CSDN博客、开源中国博客、简书。

根据创建者介绍,InfoSpider 具有以下特性:

  • 安全可靠:本项目为开源项目,代码简洁,所有源码可见,本地运行,安全可靠。

  • 使用简单:提供 GUI 界面,只需点击所需获取的数据源并根据提示操作即可。

  • 结构清晰:本项目的所有数据源相互独立,可移植性高,所有爬虫脚本在项目的 Spiders 文件下。

  • 数据源丰富:本项目目前支持多达24+个数据源,持续更新。

  • 数据格式统一:爬取的所有数据都将存储为json格式,方便后期数据分析。

  • 个人数据丰富:本项目将尽可能多地为你爬取个人数据,后期数据处理可根据需要删减。

  • 数据分析:本项目提供个人数据的可视化分析,目前仅部分支持。

InfoSpider使用起来也非常简单,你只需要安装python3和Chrome浏览器,运行 python3 main.py,在打开的窗口点击数据源按钮, 根据提示选择数据保存路径,接着输入账号密码,就会自动爬取数据,根据下载的目录就可以查看爬下来的数据。

依赖安装

  • 安装python3和Chrome浏览器

  • 安装与Chrome浏览器相同版本的驱动

  • 安装依赖库 ./install_deps.sh (Windows下只需pip install -r requirements.txt)

工具运行

  • 进入 tools 目录

  • 运行 python3 main.py

  • 在打开的窗口点击数据源按钮, 根据提示选择数据保存路径

  • 弹出的浏览器输入用户密码后会自动开始爬取数据, 爬取完成浏览器会自动关闭

在对应的目录下可以查看下载下来的数据(xxx.json), 数据分析图表(xxx.html)

作者认为该项目的最大潜力在于能把多维数据进行融合并对个人数据进行分析,是个人数据效益最大化。

当然如果你想自己去练习和学习爬虫,作者也开源了所有的爬取代码,非常适合实战。


收起阅读 »

“智能”坐垫记录离座时间,是高科技福利还是又一个员工压榨机器?

带薪拉屎,听上去不太雅观,却是一个网络流行语,大抵是指工作想偷懒的时候,用上厕所为借口,带着手机把明明在5分钟内拉完的屎在公司花20分钟拉完。这个流行语的梗来自于日本,有一位日本网友曾在推特上发帖,意思是:建议大家每天尽量到公司排便,因为这样占用的是工作时间,...
继续阅读 »

带薪拉屎,听上去不太雅观,却是一个网络流行语,大抵是指工作想偷懒的时候,用上厕所为借口,带着手机把明明在5分钟内拉完的屎在公司花20分钟拉完。

这个流行语的梗来自于日本,有一位日本网友曾在推特上发帖,意思是:建议大家每天尽量到公司排便,因为这样占用的是工作时间,每天花10分钟的话,一年下来就是40小时,相当于积累了5天年假。

正所谓语不惊人死不休,这位日本友人据说成功的因为这句话把自己的工作丢了,但是千千万万的网友已经从他这句话取到了带薪拉屎的真谛!

不过古语有云,道高一尺魔高一丈,公司自然不会任由这种现象蔓延。

微信图片_20210222144506.png前有2018年网易在厕所装上了信号干扰器,用以减少员工”带薪拉屎”占据的时间,后又有快手在去年10月份被爆出安装厕所坑位计时器,以控制员工上厕所时间微信图片_20210222144510.png

当时快手的回应是:

园区内厕所位置有限,员工上厕所排队现象严重,但受楼体结构限制,楼内增加厕所坑位施工难度大。此次在一个厕所坑位安装了一个计时器,是为了测试每天卫生间使用次数和时间,便于判断需要增加的移动厕所坑位数量。

当然这种答案没法安抚那些感觉自己被压榨被逼死被无视人权的广大气愤员工。

一波未平一波又起,就在前几天,又有一家国内公司被爆出恶意监控员工工作时长,而且这一次直接被纽约时报报道到了国外,真是丢人丢大了。

那究竟是怎么一回事呢?

据悉,一家杭州电子公司的员工投诉,说前段时间自家老板很贴心的给每位员工发了一个坐垫,据说是一款最新黑科技的电子坐垫,可以链接到电脑端,记录使用者的心率、呼吸甚至坐姿是否正确,用来提醒员工关注自己的健康情况,乍看上去人畜无害,着实还让员工同志们感动一番,估计私底下有不少人还动了大丈夫遇到这样的伯乐老板,夫复何求的感慨。

但是美梦总有被打破回到现实的时候,该公司一位员工有一天突然被HR约谈,质问其为何每天上午10点到10点半不在岗位上? 这才让大家发现,这个所谓的健康坐垫其实是一个全天候的工作监控器啊!

只要用了这个坐垫,自己在什么时候不在工位上,不在工位多久,什么时候下班,等等等,都被后台监视的老板一目了然!是不是背后一凉,有种被人时刻监视的感觉!

对于这样的情况,国外一些自小习惯了人权教育的网友纷纷留言惊呼是不是违法,倒是国内一部分网友显得很淡定,觉得老板监控员工是很正常的,只不过这个方式比较新颖。(看来国内外的工作环境还真有点不一样,毕竟国内都习惯了996…)

而对于网友铺天盖地的讨伐声,这家杭州公司的回应是:

对未经许可“传播”参试者数据的人力资源经理发出警告

什么?意思是我做这个事没错?错在你这让别人知道了这个事?

没错,该公司的首席执行官张必勇为经理审查员工行踪的权利进行了辩护,认为是完全合理的一个事情。

“如果被测试的员工不在座位上,我们自然就无法采集数据了,”张必勇这样解释到,“这些引起争议的坐垫本来是为减少工作场所的疲劳,防止长时间坐在办公室里引起身体疼痛而设计的。通过坐垫上的传感器收集员工身体数据,用来监测他们的健康状况、改进产品技术,不是用来评估他们的工作表现的。这些数据可以通过显示在员工计算机或手机应用上的测量数据表格,提醒员工不要低头垂肩地坐在椅子上。”

呵呵,到底是不是用来评估工作表现的小编不敢妄下定论,但是已经有该公司的员工反馈有HR说因为他被查出来不在岗,涉嫌偷懒,要扣年度奖金。

这难道还不是一种赤裸裸的监视?威胁?难道不是用来评估工作表现?

当然最后,张必勇还说了一句自相矛盾自己打脸的话:

智能坐垫比公司用现有的追踪工作时间技术(如指纹打卡机)对员工更有好处,指纹打卡机“并没有什么健康辅助的功能”。

既然不是用来评估工作表现的,为什么要和指纹打卡机进行比对?这不就是现代版的此地无银三百两?真当观众都那么容易被洗脑?

来源于公众号“程序猿DD”

收起阅读 »