How to set proxy_next_upstream? and why?

You can add proxy_next_upstream in http, server, location context:

There is something to notice:

  • You should add error, timeout, invalid_header since the upstream didn’t receive this request.
  • You can add http_502, http_503, http_504 because upstream meet network issue.
  • Don’t add http_500 because there is error in application, retries will cause other server is down.(And developer should fix this error, not load balancer)

Continue reading How to set proxy_next_upstream? and why?

How to use Theano? (with OpenCL)

I have a MacBook Pro with AMD display card, so I want Theano use OpenCL.

First, create virtualenv and activate it:

Install some dependencies for Theano and OpenCL:

those dependencies isn’t in setup.py of Theano (or pygpu).

Install Theano (latest development version, so far, 0.8.2 doesn’t support OpenCL):

If github is temporary unavailable, try my personal csdn mirror(CSDN CODE can sync github repo conveniently):

Next step is installing gpuarray for supporting OpenCL:

Now, Theano can use OpenCL to accelerate computing.


We can use Theano’s check1.py to check that OpenCL is available:

Performance:

  • Only use CPU (1.662902 s)

  • CPU over OpenCL (1.057008 s)

  • Intel GPU over OpenCL (0.554572 s)

  • AMD GPU over OpenCL (0.470640 s)


If you using stable(0.8.2) Theano, you will meet this error when you try to use OpenCL:

so, you’d better install development version of Theano.

APT Hash sum mismatch

工作当中遇到此问题,然后偶尔看见此文。

此文是 APT Hash sum mismatch 的翻译。

TL;DR

APT 仓库能够提供未压缩和压缩过的文件格式。常用的几个的压缩格式是 gzip, bzip 和lzma。

apt 的 Bug 在处理lzma文件(.xz)读写的时候会偶尔报告“Hash sum mismatch”错误。

本文提供一种变通方式,另外,在特定版本的 apt 中,该bug已经被修复。

使用如下系统的用户应该升级到系统提供的最新的 apt 版本:

  • Ubuntu Trusty (14.04) 及更新的版本
  • Debian Jessie (8) 及更新的版本

更早系统的用户应该升级系统或者使用如下的变通方法。

目前,我们决定关闭 packagecloud 的所有仓库中对 lzma 格式的支持。元数据仍然能够以 gzip, bzip 以及未压缩的格式来获取。packagecloud 仓库的所有者们并不需要做任何事情。

Hash sum mismatch 变通方法

用户可以通过两种方法强制 apt 不使用 lzma 格式的元数据。

第一种办法就是运行 apt-get 的时候添加额外的命令行参数:

(注意:如果你偏向于使用 bzipped 格式,你也可以指定参数为“bz2”)

或者,你可以在全局的 apt 设置中指定这个选项,这样你就不必每次运行 apt 的时候输入这些。

步骤如下:

  1. 创建 /etc/apt/apt.conf.d/99compression-workaround 文件
  2. 添加这些文本到文件中: Acquire::CompressionTypes::Order:: "gz";

现在,apt-get update 会首先尝试 gzip 格式的元数据。

Hash sum mismatch 在新的 apt 版本中被修复

这个 aptbug 在2014年3月21日被修复(git 提交为c4b113e650dbdbb4c5c9c6f36437c94db6b214d9)

这个修复包含在 apt 1.0以及更新的版本中,apt 1.0在如下系统中可用:

  • Ubuntu Trusty (14.04) 及更新的版本
  • Debian Jessie (8) 及更新的版本

如果你在如上系统中看到了这个错误,你应该确认是是否运行着最新的 apt 。

“Hash sum mismatch”到底意味着什么?

顶级的文件包含着仓库其他部分文件的散列值,这是 apt 仓库的组织元数据的方式。

“Hash sum mismatch”错误提示用户: apt 下载的文件的散列值和元数据中的散列值不匹配。

不幸的是,因为 apt 中的 bug,以 lzma 格式(.xz文件)压缩过的元数据会偶尔下载或(在某些情况下)解压错误,造成文件损坏。

结果,损坏的文件的校验值会导致 apt 产生“Hash sum mismatch”错误。

结论

apt 在处理 lzma 格式中一个不幸的错误 导致了臭名昭著的“Hash sum mismatch”错误,加之散列值会被校验,造成了另最终用户困惑的局面。

Ubuntu Trusty 和 Debian Jessies(或者更新的系统)的用户建议升级到系统中最新的 apt 版本。其他用户建议使用上文提供的变通方法来避免食用 lzma 格式的元数据。

packagecloud 的 APT 仓库作者们不需要做任何事情。我们已经完全关闭了 lzma 格式的元数据,仓库用户并不会被此 bug 影响。

strace 速查表

此文是 strace cheat sheet 的翻译。

TL;DR

strace 可以追踪系统调用、信号,在调试中,它还是收集上下文环境的非常好的工具。

此速查表将会展示一些技巧来说明 strace 的使用方法、如何过滤输出,并且介绍了一些 strace 的实用参数。

strace PTRACE_TRACEME EPERM (Operation not permitted)

你应该以 root 身份来运行 strace。如果你以 root 用户运行,也得到这个提示,这说明在你的系统中,strace 不允许附加到进程上。

你可以修改 /proc 中的设置,来开启 strace 附加到进程的功能:

为了让这个修改永久生效,请首先检查你的系统有没有 /etc/sysctl.d/10-ptrace.conf  文件。

如果你的系统有这个文件,修改该文件:

如果你的系统没有这个文件:

  1. 打开 /etc/sysctl.conf 文件
  2. 找到设置 kernel.yama.ptrace_scope
  3. 如果该设置存在,将其修改为 0
  4. 如果不存在,添加一行 kernel.yama.ptrace_scope = 0

strace pid

strace 一个运行中的进程

strace 一个运行中的进程和线程

strace 一个运行中的进程并且输出字符串

此命令会输出每一个字符串的前 80 个字符。

strace 一个程序

strace 一个程序

strace ./program

strace 一个程序和线程

strace 一个程序并且输出字符串

此命令会输出每一个字符串的前 80 个字符。

strace futex

使用 strace 的时候,经常会看到很多 futex 系统调用,比如:

futex`系统调用被很多线程库广泛使用,比如 libpthread ,用来实现更高层次的锁原语,比如 mutexes(互斥器)、semaphore(信号量)等。

过滤掉 futex 调用

如果你的程序使用了大量的 futex 调用,而且你也不希望看到它们,你可以:

使用 grep 过滤掉 futex 调用:

或者,追踪一些你真正关注的系统调用。比如,追踪此程序和其线程调用的 open、read和write调用:

其他有用的选项

strace 有很多实用的选项。一些常用的选项如下:

  • -f 追踪创建的线程和子进程。许多程序会派生出额外的进程或者线程来完成一些工作,所以此选项很有用。
  • -T 输出系统调用花费的时间。当你需要确认特定的系统调用是否花费了很多时间的时候,此选项会有帮助。
  • -t 在每行输出当前时间(没有日期)。
  • -s [size] 每个字符串输出 size 个字符。如果程序在写入文件描述符,此选项会有帮助。
  • -c 输出系统调用次数、系统调用花费的时间的直方图。
  • -e trace=open,close 仅仅追踪 open 和 close 系统调用。

如果需要查看全部的命令行参数,请查看 strace 的文档。

总结

在 Linux 上调试的时候, strace 是必不可少的工具。当你需要了解一个程序在做什么的时候,你应该使用 strace。作为防御式调试的第一条命令,strace 是收集程序上下文信息的不错的方法。

strace 接收许多命令行参数,读者最好阅读 strace 文档来了解全部参数。

《一日重生》

人生总是有很多不如意。

查理在失意许久之后,决定自杀,来结束这些痛苦。意外之中,他的母亲出现了,他和他母亲度过了一天。

这一天看起来是平常的一天,去给别人理发,给塞尔玛小姐化妆等。在平淡的叙事中,加上查理自己的回忆,查理看到了很多小时候被遗忘、被忽略的事情。

确实,查理一心只想追求父爱,忽略了母爱;等到母亲去世之后才知道母爱的珍贵,此后人生的曲折,只能自己一个人去面对。

遗憾的是,查理面对的,仅仅是母亲的灵魂,唯一能改变的,只能是自己。

那天晚上,母亲带着他去见了父亲的第一任妻子,她说出了“原谅”这个词。

过去的恩怨,我们没有机会去讨回、去复仇,现在能做的,也就只有原谅,要原谅的,不是别人,恰恰是自己。


 

查理是幸运的,他还有机会去重新经历一遍,了解过去、了解自我。

对于我们,就像书中母亲说的一样:

回到过去,比你想象的要难。

Violet?Purple?

这两个单词都是紫色的意思。突然想到这个有什么区别,所以查了下,还真有。

Violet得名于紫罗兰(紫罗兰的英文也是violet),是一种真正的颜色,有自己的波长(380–450 nm)

而Purple则是蓝色和红色的混合色。相比Violet,Purple更偏向于贵族的意味。


这是violet:

 

Violet

这是purple:

purple


references:

Violet (color)

Purple

PHP 7.0中,目前不能定义函数的返回类型为null或者void

TL;DR:

  • 在PHP 7.0下,不要将函数的返回值声明为null或者void,在PHP7.1下可以。
  • 目前函数返回值不可被声明为nullable。

引子

今天有开发同学遇到了定义返回值为null的函数无法被load的问题:

Cannot use ‘App\null’ as class name as it is reserved

追查发现,是因为函数的返回值被声明为了null。

追查

首先,看看返回值到底能不能声明为null:

在RFC PHP RFC: Return Type Declarations 中的Future Work中说:

Allow functions to declare that they do not return anything at all (void in Java and C)

这说明此RFC并不支持声明返回值为null或者void!

但是 PHP RFC: Void Return Type 则表示支持void表示没有任何返回值,但是不允许用null来声明!(还给了原因)

此RFC会在PHP 7.1中实现,所以目前在PHP 7.0中还不能使用。

PS:经过实验,PHP7.0中,声明返回值为void可以通过语法检查,但是无论怎么返回都会报错(无论是直接return还是不返回):

Return value of App\User::func() must be an instance of void, none returned

更远一点,关于声明返回值为nullable的问题,现在还在草稿阶段,还有很长的路要走:PHP RFC: Declaring Nullable Types

PS

RFC:Return Type Declarations中的Future Work中有:

Improve runtime performance by doing type analysis.

所以目前声明类型更多的是考虑方便开发,借此提升性能仅仅是在下一步计划中而已。

OS X下Python开发环境搭建

Python解释器

首先,要安装python。(虽然OS X自带python,但是显然更新到最新版是更好的选择)个人推荐使用brew:

pip

pip是python的包管理工具,用来从PyPI中下载并安装Python包。

虽然python包里面自带了pip,但是版本太老了,每次pip install的时候总会提示有新版本,所以索性升级系统级别的pip:

同时,由于PyPI官方速度太慢,建议设置PyPI镜像 (对了USTC的PyPI源没有tsinghua的快):

virtualenv/venv

很多Python包仅仅是在开发的时候用,把这些包安装到系统级别是完全没有必要的,遑论有的项目的依赖是冲突的。virtualenv就很好的解决了这个问题,每一个项目有自己的virtualenv,即有自己的解释器、有自己的包目录/sites-packages。在python3中,官方自带了venv模块,有同样的功能。

对于python2,我们需要自己安装virtualenv(这种基础工具还是直接安装到系统目录比较好):

Hello, world!

延伸话题:requirements.txt、setup.py、setup.py install、setup.py develop、unittest、unittest.mock。


哎,我怎么会写出这么一篇水文呢。

《三打白骨精》观后感

电影讲了一个唐僧师徒三人度化白骨精的故事。

看完了电影之后,我立马就有两个问题:

  • 为什么孙悟空最后服了唐僧?
  • 为什么唐僧一定要度白骨精?

孙悟空一心只想斩妖除魔、取得真经。然而唐僧看得更远,取得真经是为了度化人性。

国王为了缓解血咒,采集婴儿血并嫁祸给白骨精,确实可恶。白骨精一心想吃唐僧肉,想永世为妖,理应受罚。

唐僧师徒面对的确实是这两个反面角色。孙悟空的想法很简单,作恶之人就应该承担恶果,杀了这两人了事。但实际上,电影到最后也没有杀了这两人,为何?

唐僧看到他真正的对手:国王的贪念和白骨精的执念。

你灭了国王、也会有其他的国王,你灭了白骨精、也会有其他的白骨精。人世间的贪嗔痴,并不会因为孙悟空多挥了两下棒子就搞定,何况孙悟空自己的执念也不浅。

唐僧并不是去消灭问题,而是自己俯下身去解决问题:白骨精执念太深,便舍生为其化去执念。

P.S. 于生活中,确实也应该多思考如何化解问题,而不仅仅是消灭眼前的问题。

开始使用Docker(在OS X下)

如果你想在OS X上尝试Docker,但是又觉得安装虚拟机什么的太麻烦了,那么你可以考虑下Docker Toolbox

安装Docker Toolbox

虽然官方提供了下载链接,但是我依然决定使用Homebrew Cask来安装Docker Toolbox:

当然,如果下载特别慢的话,可以使用ProxyChains-NG来代理下。

安装结束后,VritualBox也被当作依赖安装了。(但是我推荐再安装virtualbox-extension-pack:

创建虚拟机

接下来就要为所有的docker容器创建一个虚拟机了:

表示使用VirtualBox来创建虚拟机; 表示使用192.168.125.1/24网段(默认使用的是192.168.99.1/24网段,但是和newifi的默认网段重复了)。

可以添加 来使用daocloud的registry mirror。

第一个docker命令

首先执行如下命令配置好docker依赖的环境变量:

接下来,执行docker命令的时候就会直接获取虚拟机里面的docker信息了。

比如:

docker info

如何访问容器

如果我们使用了虚拟机,那么该如何访问其中的容器呢?

比如我们运行nginx容器:

那么我们应该如何访问这个nginx容器呢?

首先,我们通过docker ps命令知道这个容器的80端口被映射到了32770端口,然后通过docker-machine ip default得知虚拟机ip:

container info

然后,就可以直接通过这个ip和这个端口访问了,比如

volume映射

volume

可以看到,直接使用-v参数将本地mac上的文件夹映射到docker中也是可以的。

后来具体查了下,是OS X上的/Users目录通过vboxfs挂载到虚拟机的/Users目录中,然后在容器创建的时候再挂载到容器内部。

Kitematic

你也可以通过Kitematic来管理容器:

Screen Shot Kitematic

左侧为容器列表,右侧为推荐的image。