特工355(Agent 355)

特工355(1780年后去世)是美国革命期间女性间谍的代名,是库尔珀组(Culper Ring)的一部分。 特工355是美国的第一批间谍之一,真实身份未知。355这个数字是库尔珀组中的加密系统用来表示“女士”的数字。

生平

在库尔珀组的公文中,唯一直接提及特工355的是亚伯拉罕·伍德赫尔乔治·华盛顿将军的信。伍德赫尔形容她是“对这封信有帮助的人”。

特工355的真实身份仍然未知,但有关她的一些事实似乎很清楚。作为间谍,她在美国独立战争期间与美国爱国者(或称美国辉格党,革命党)合作。她本会被伍德赫尔招募进间谍组。355这个代码表明她可能具有“某种程度的社会突出性”。她可能生活在纽约市,并且在某些时候与约翰·安德烈少校贝内迪克特·阿诺德有过接触。 一个可能是特工355的人是伍德赫尔的邻居安娜·斯特朗(Anna Strong)。另一个说法是,特工355可能是罗伯特汤森事实上的妻子。有传说表明汤森爱上了特工355。约翰·伯克和安德里亚·梅耶尔通过间接证据证明她可能与约翰·安德烈少校和本杰明·塔尔马奇关系密切,从而保护伍德赫尔不被指控为间谍,这为355参与间谍活动提出了不同的理由。特工355的其他可能候选人包括Sarah Horton Townsend和Elizabeth Burgin。

偶尔也有一些说法,说根本没有特工355,355仅仅代指一名知道有用信息的女人,并没有与特工组正式关联。代码355仅仅表示“一个女人”,而不是一个女性特工。

探员355被认为是揭露阿诺德和逮捕少校约翰·安德烈的主要角色,后者在纽约塔潘被绞死。她可能是一个著名的保皇派(或称托利党)家庭的成员,这个家庭背景使她很容易接近英国指挥官。

1780年,本尼迪克特·阿诺德(Benedict Arnold)前往保皇派那里,这时特工355被逮捕。她被囚禁在泽西号军舰上,这是一艘监狱船,在那里她可能生下了一个名叫小罗伯特·汤森的男孩。她后来死在监狱船上。然而,亚历山大·罗斯不同意这种说法,他说“女性没有被关在监狱船上”,“没有任何出生的记录”。这强化了355号特工可能是安娜·斯特朗的观点,因为她的丈夫塞拉·斯特朗被囚禁在泽西岛,她应该可以给丈夫带食物。她出现在船上使人们传言特工355被囚禁在那里。

在流行文化中

特工355已经成为通俗小说的一部分。她是《Y:世上最后一个男人》中一个主要角色。她也是现代间谍355的灵感来源,并收录在《刺客信条3》的游戏内历史事实数据库中,她的信息对于帮助主角发现要捕获的英国阴谋至关重要。

在电视剧《逆转奇兵》(Turn: Washington’s Spies)中,特工355是一位名叫阿比盖尔(Abigail)的前奴隶,安娜·斯特朗曾是她的主人。英国军队在安娜·斯特朗入狱后没收了他的财产。虽然名义上阿比盖尔是自由的,但她被迫为约翰·安德烈工作。阿比盖尔把她在安德烈家中无意中听到消息藏在给儿子的礼物中,这个儿子被迫留下交给安娜照顾。剧中,特工355由伊达拉·维克托扮演。

阅读更多

How to enable AV1 support?

AV1 is a product of the Alliance for Open Media (AOM). AOM was founded in September 2015 by Google, Mozilla, Cisco, Microsoft, Netflix, Amazon, and Intel to create the next generation video codec for the Internet. Recently, Youtube is working on AV1 support. we can set AV1 as preference encodes at Youtube!

How to try it?

You can open the url, https://www.youtube.com/testtube. If your browser support AV1, it show like that:   You can set your AV1 preference. If your browser doesn’t support AV1, the pages looks like this: But, you can try to enable AV1 support: For Firefox, open about:config?filter=media.av1.enabled, search media.av1.enabled, set it to true: Now, try it again. For Chrome-like, open chrome://flags/#enable-av1-decoder, set Enable AV1 video decoding. to Enabled. And try again.

Now, test it at Youtube

Open Youtube AV1 Beta Launch Playlist, play it. Right click video, open Stats for Nerds. And if Codecsis something like av01.***. You are in!

阅读更多

扇贝单词的一些缺点

最近一段时间,我成为了扇贝单词的重度用户。过去的60天,我给扇贝提了20条建议。

但,客观来讲扇贝还是有很多缺点,所以记在这儿,供各位参考。

  1. Web和app功能不一致
    1. 比如app有听词模式,web没有
    2. 比如web可以编辑释义,app不能
    3. 比如web可以添加例句,app不能
  2. Web的释义和app释义不一致,官方回复是app是新版,而web正在改版
  3. 释义不准确,比如有的缺少释义、有的没有释义(我很好奇,没有释义的单词是怎么录入的?)
  4. 单词读音展示问题
    1. 有的单词是美音和英音读音不一致,然后我点击美音,它把两个读音都读出来了……
    2. 有的单词是,不同读音对应不同含义,扇贝根本没有标记出来读音和含义的对应关系
  5. 网页背单词,在Firefox上,快捷键没法使用

我当前在背考研单词。等当前词本结束之后,我会尝试下其他背单词软件的。

阅读更多

cherry-pick到底应该怎么翻译?

git当中的cherry-pick命令,翻译成中文叫什么名字呢? GitLab给出了答案

// gitlab.po
msgid “ChangeTypeAction|Cherry-pick”
msgstr “优选”

这个是不是听起来怪怪的? cherry-pick的中文意思是“择优挑选”,比如

They seem to cherry-pick the loss leaders and discount items in the supermarkets and discount stores, relying on smaller retailers for everything else. 因为他们会选择超市和打折店里的特价商品和和打折商品,而其他所有的东西都是从小商贩那里获得。

当然,也要注意的是,写作论文的时候,只挑选那些好的数据写在文章中,这种行为也可以叫cherry-pick,比如:

Be careful not to ‘cherry-pick‘ data: don’t choose just what you like, or what supports your objective. 注意别“优选”数据:别选择一些只是您喜欢的,或者支持您的目标的。

所以从常用语义上来讲,优选这个翻译也不算太差。 但由于“优选”这个词在中国被用烂了,多用在电商等领域,如果我们开发的时候来一句“请将aaa提交优选到B分支”,完全不能理解啊。 个人觉得,翻译成“拾取”会比较好,比如“请将aaa提交拾取到B分支”就顺口好多。


另外,也可以看看GitLab对其他git术语的翻译: Revert 还原,Issue 议题等。

阅读更多

Use pty as ansible connection

Well, sometimes, we can only use pty to access machines. For example, Jump Server only allowed use ssh pty to type command, get the result. But, how can I deploy application via ansible?


There are two good news:

  1. pexpect can interactive with the ssh session.
  2. ansible can use custom connection plugin.

Let’s try it

Let’s start at directory ansible-pty Firstly, we should create a connection plugin. Put those code to ansible-pty/plugins/pty.:

import base64
import re

import pexpect
from ansible.plugins.connection import ConnectionBase
from ansible.utils.display import Display

display = Display()

class Connection(ConnectionBase):
transport = ‘pty’
_mark = “=” * 10

阅读更多

推荐下目前在用的云存储厂商又拍云

最近在做一个 https://packagist.org 的镜像,所以需要一个CDN来做国内加速。国内比较适合的也就七牛和又拍云了。

作为CDN

后来比较了下,发现七牛仅仅是做存储,它会忽略用户设置的超时时间(Cache-Control 字段)。而又拍云则会遵守源站的缓存设置。 比如我如果设置我的url缓存为5min,那又拍云就只会保留缓存5min。 在这一点上,又拍云就做的非常好,可以选择存储模式,也可以选择CDN模式。当然,更重要的一点是有免费额度。相比七牛的免费额度来讲,确实比较宽裕。 比如,我的这个项目,源站是在我的vps上,接受http访问。那我只需要将空间的回源设置如图即可:

支持SSL/TLS

为了让我的域名支持SSL/TLS,我只需在云拍云上花费0元购买Let’s Encrypt的SSL证书,然后补全信息即可。 如图: 我绑定了又拍云,然后又拍云直接向Let’s Encrypt申请DV证书,绑定到域名就行。 相比其他服务商,需要手动上传服务器证书,确实方便了很多。而且自己手动申请的Let’s Encrypt证书,需要每90天更新一次,所以还是直接交给又拍云比较方便。

云存储

和云存储厂商一样,又拍云也提供了对象存储服务。 基本的文件操作都是支持的。当然,也必须支持断点续传,对于上传大文件来说,这个尤其方便。 还可以给文件添加各种自定义的元数据,比如我可以给文件设置x-upyun-meta-sha512: 123456,可以参考https://docs.upyun.com/api/rest_api/#metadata。 但是这儿也有一些坑: 比如,获取文件信息: MD5算法确实有很严重的漏洞,容易产生重复的哈希值。建议又拍云下一版换成sha512算法。 还有,如果我设置了自定义元数据,比如x-upyun-meta-sha512: 123456,那我只能通过下载文件接口来获取这个元数据,通过获取文件信息接口反而没有自定义的元数据,这一点很不方便。

文件拉取

做镜像的过程中,很重要的一个点就是文件拉取。 比如,我要代理laravel的下载地址:https://github.com/laravel/framework/archive/v5.5.13.zip,我只需要将url拉取到又拍云上对应的地址就好。 但是,由于要使用回调,在调试的时候很不方便,所以目前我用的比较少。 建议又拍云在拉取文件的时候,给拉取任务一个id,然后客户端根据这个id查询拉取状态,会方便开发。

又拍云重度用户

阅读更多

Cannot install MySQL-python at macOS 10.13 Beta

Round #1

Complete output from command python setup.py egg_info:
sh: mysql_config: command not found

Solution

brew install mysql

or

brew reinstall mysql

Round #2

clang -bundle -undefined dynamic_lookup ****/_mysql.o -L/usr/local/Cellar/mysql/5.7.18_1/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.12-x86_64-2.7/_mysql.so
ld: library not found for -lssl

Solution

brew install openssl
export LDFLAGS=”-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib”
pip install mysql-python

阅读更多

[译]输入系统如何工作——指针输入

翻译自 How input works – pointer input。 在上一篇博文中,我讨论了键盘输入。这篇博文将会讨论指针设备——多被称为鼠标。就像本系列文章一样,本文仅仅讨论了KWin/Wayland上面的情形。

不同的硬件类型

有好几种不同的设备被识别为指针设备。有轨迹球这样的传统鼠标,也有在笔记本上的触摸板。此外,还有可绝对定位的设备,比如触摸屏。 在libinput中,对于不同的设备,有很多不同的选项可供配置。比如指针加速等其他选项。我们正在开发Wayland的触摸板配置模块,看起来会合并到Plasma 5.9中。像第一篇博文描述的,一旦设备创建,一系列配置选项会被立马设置。

指针运动

指针设备生成不同种类的事件,其中一种就是指针运动事件。通常来说,有两种指针运动事件:绝对运动和相对运动。大多数设备,比如鼠标,产生相对运动事件,所以我们在本文中只关注相对运动事件。

确定新的位置

相对运动是一组带x和y坐标的距离向量,它描述了指针位置该如何移动。 所以,一旦事件从KWin队列中读取出来,需要确定新的指针位置。这并不单单是最后的指针位置再加上一个运动向量。这会导致指针离开可视区域。 相反,指针运动得验证和约束。我们确保光标不会离开可视区域,并且还要遵守应用程序窗口对指针的约束。 这是KWin在Plasma 5.9中支持的新协议。它允许Wayland窗口将指针锁定到某个位置或将指针限制在某个区域。在第一种情况下,指针根本不移动,在第二种情况下,只允许指针在窗口的特定区域移动。

处理新的位置

即使在光标被限定的情况下,不需要移动鼠标指针,事件也会得到进一步处理。即使光标不移动,应用程序也可能对相对运动感兴趣,并对其做出反应。 像键盘的情况一样,为了进一步处理,会生成QMouseEvent并发送到KWin的输入过滤器。指针运动可能在KWin内部处理,例如:指针位置超出了当前的屏幕边缘。或者通过KWayland将指针运动转发到窗口。

更新获取焦点的窗口

阅读更多

如何命名二进制PHP扩展?

Python界有自己的文件名约定https://www.python.org/dev/peps/pep-0427/#file-name-convention,比如distribution-1.0-1-py27-none-any.whl一看就知道自己能不能用到这个whl包。 最近需要发布thrift_protocol扩展,故自己定下一个命名规范,在此记录之。 首先看看php如何判断扩展兼容与否,dl.c:172dl.c:182分别根据zend_api(比如20151012)和build_id(比如API20151012,NTS)来判断是否兼容。 所以我们用build_id+platform就可以表示ABI版本了,加上name和version就得出命名规范: {distribution}-{version}-{build_id}-{platform}.{so,dll} 比如: thrift_protocol-1.0-API20151012,NTS-linux_x86_64.so 遗憾的是,github会吞掉英文逗号,所以只能用英文句号替代了。 不过,phpize的时候能看到zend_api,无法看到build_id,算是一个不方便的地方,只能通过php -i | grep 'PHP Extension Build'来变通获取了。

阅读更多

将ngx_brotli编译成动态nginx模块

Brotli是google新出的一个压缩算法,据说比Zopfli的压缩率要高20–26%(Zopfli是google之前发布的一个和Deflate兼容的压缩算法)。 Chrome 49+、Firefox 44+以及Opera 36+都支持Brotli了,所以,是时候尝试一把了。 但是为了支持这个特性,自己编译部署nginx太麻烦了,nginx 1.9.11开始支持动态模块,所以也来尝试一把。

系统需求

sudo apt-get install autoconf libtool nginx-extras

本人测试环境ubuntu 14.04, ppa:nginx/stable, nginx/1.10.1

安装libbrotli

按照 libbrotli 的说明,依次执行如下命令安装

git clone https://github.com/bagder/libbrotli
./autogen.sh
./configure
make
sudo make install

为了让系统中使用到libbrotli的程序能够加载so文件,故创建软链:

sudo ln -s /usr/local/lib/libbrotlienc.so.1 /lib/libbrotlienc.so.1

准备源代码

下载nginx和ngx_brotli的源代码:

wget http://nginx.org/download/nginx-1.10.1.tar.gz
git clone https://github.com/google/ngx\_brotli

编辑ngx_brotli/config文件,在顶部添加一行

have=NGX_HTTP_HEADERS . auto/have

configure

在nginx源码目录执行

./configure \
–add-dynamic-module=../ngx_brotli/ \
–with-http_dav_module \
–with-http_realip_module \
–with-http_v2_module \
–with-threads \
–with-http_ssl_module \
–with-ipv6

并make,得到两个so文件:

$ find -name ngx_http_brotli*.so
./objs/ngx_http_brotli_static_module.so
./objs/ngx_http_brotli_filter_module.so

加载模块

/etc/nginx/nginx.conf文件中添加如下两行,使nginx加载模块:

load_module ‘/path/to/ngx_http_brotli_static_module.so’;
load_module ‘/path/to/ngx_http_brotli_filter_module.so’;

接下来在http段中添加如下两个配置:

brotli on;
brotli_static on;

再执行sudo nginx -t 看看有没有错误,如果没有错误的话那就成功了。 不过,brotli压缩算法只有在https连接中才能生效。

module “/path/to/ngx_http_brotli_static_module.so” is not binary compatible in nginx.conf

这个错误是由于module的signature和nginx的signature不匹配导致的,我的解决办法是,打印出这两个signature,逐位比对,并据此调整configure的参数。 参考 ngx_module.h 比如,第25位表示NGX_HTTP_V2定义与否,此时可以添加--with-http_v2_module来修正signature。 第22位表示NGX_THREADS定义与否,可以添加–with-threads来修正。 第8位和第9位与IPv6有关,只需添加–with-ipv6即可。 至于第30位,只能通过编辑ngx_brotli/config文件,添加have=NGX_HTTP_HEADERS . auto/have来搞定了。

阅读更多