扇贝单词的一些缺点

最近一段时间,我成为了扇贝单词的重度用户。过去的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将指针运动转发到窗口。

更新获取焦点的窗口

阅读更多

[译]为了更具有创造力,还是不要那么高效吧

本文为 To Get More Creative, Become Less Productive 的翻译。 高效和创造力之间存在着根本性的矛盾,在意识到这一点之前,管理者无法获取更多的创意。 高效的人们以一种系统化的方式来完成一系列必须完成的任务。他们以稳定的、可衡量的方式来完成目标。他们非常有效率、并且能够有效地利用自己的时间。 创造力——可不是这样的。 创造性的发展需要时间和空间。虽然我们可以系统地从事与创造力有关的活动,但是很难系统化创造力本身。特别是,创造力是知识的基础。 几乎所有的创意想法都涉及人们寻找现有知识的新用途——一些旧想法的新组合。James Dyson通过类比锯木厂发明了他的真空吸尘器。 Fiona Fairhurst通过研究鲨鱼皮肤设计了更快的泳装。 George de Mestral通过了解苍耳发明了魔术贴。 这意味着从他们需要创造力的开始,人们就需要时间来学习与他们的工作无关的东西,以便他们有广泛而深入的知识库。 此外,有创造力的企业很少涉及稳定和可衡量的进步。 相反,创造力包括尝试许多不同的可能性,以及在找到正确的解决方案之前努力尝试几个盲目的岔路。 但这些活动——建立一个知识库并探索它——需要时间。 很难简单地安排几个小时在这里和那里进行创造性的追求。相反,有些时候,需要花时间学习一个新的知识领域,或者与同事进行漫长的谈话,来理清楚一个新的想法。 所以很多创意活动可能看起来像是一个可疑的,直到突破来临。 许多公司想要他们的员工获得更多创造力,这其中的主要原因就是生产力和创造力之间的这种差异。 公司通常基于生产率来评估员工。 更重要的是,他们根据假设他们将雇佣高效的人来制定他们的招聘计划。 他们希望组织中的人员能够取得明显的进步。 他们致力于发展尽责的人——能够完成任务的人。 如果一个组织真正想要创造力,它必须开始招聘更多的人,而不是完成任务、仅仅让公司保持运作所需的那么点人。Google的20%的时间,即鼓励员工将20%的时间花在新想法上的行动,已经执行了很多时间了。对于如何在公司实施这项政策,已经有了很多的讨论,我的观点是,如果你要给每个人一个机会来发展他们的创造力,你需要多雇用10-20%的人。 当要开发一个新的想法的时候,管理者还需要为员工提供一些时间安排上的灵活性。 给予某人10-20%的自由时间来发展他们的创造力,这并不一定意味着他们每周将花费4-8小时来发展创造力。 相反,可能有几个星期,一些人专注于他们需要完成的任务,还有几个星期或者几天来验证一个“兔子洞”的想法。 但是,仅仅为员工提供创造性所需的时间和灵活性是不够的。 管理者必须奖励员工从事的、提供创造性解决方案的任务,如学习新事物,发展新技能,与同事广泛的对话,以及尝试不成功的想法。 发展创造力的管理工作是可行的,但是它需要那些对效率痴迷的管理者们放松对工作时间的约束。

阅读更多

《硅谷钢铁侠:埃隆·马斯克的冒险人生》

“我们想要会飞的汽车,而不是140个字符。”

  • 马斯克有自己的想法

他需要做的是,制定一个目标,然后尽力实现。 在SpaceX,他知道自己要造便宜的火箭,所以员工必须努力优化每个部件;在特斯拉,员工必须有最好的执行力。

“他(马斯克)总是说,让最基本的物理原理说话。” “我们首先要决定世界上最好的遮阳板是什么样子的,然后做得比那更好。”

  • 勇敢面对未知

虽然之前马斯克不知道如何发射火箭,但是在SpaceX开始之后,马斯克自学相关知识,甚至问员工问题。 但是这些未知都没有阻止马斯克去造火箭、生产电动汽车,相反,智能门把手和触屏操控系统是一次非常完美的反击。

  • 面对压力越挫越勇

三家公司多次遇到危机,财务危机之下,马斯克亲自审核支出,公关危机之中,马斯克自己写新闻稿来辩驳。 当然,马斯克出色的学习能力、完美的记忆力也是马斯克成功的条件,但这一点,我们没法学习到。


坚持自己的想法非常困难,但实现自己的想法对于个人来说非常重要,但是马斯克对于自己想法的固执、对于员工的苛责实在不是一个好的表达。自己的想法可能伴随着来自众人、来自传统的压力,但是新东西要是一开始就得到了旧世界的承认,那还是新东西吗?

“我告诉他,‘不只是那个家伙错了,我再重申一遍,你也错了。’” 即使在社交场合中,马斯克也可能会突然从餐桌前站起来,不做任何解释,径直走到外面去看星星,仅仅因为他不愿意跟傻瓜待在一起闲聊。

阅读更多

如何命名二进制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来搞定了。

阅读更多