@Lenciel

update android sdk with shadowsocks proxy

博格坎普说,我们android项目的build挂了。

去Jenkins看了一下,日志里面的错误是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[android] $ /usr/local/share/gradle-1.11/bin/gradle clean build
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on the replacement for dynamic properties.
Deprecated dynamic property: "buildName" on "ProductFlavorDsl_Decorated{name=main, minSdkVersion=null, targetSdkVersion=null, renderscriptTargetApi=-1, renderscriptSupportMode=null, renderscriptNdkMode=null, versionCode=-1, versionName=null, applicationId=null, testApplicationId=null, testInstrumentationRunner=null, testHandleProfiling=null, testFunctionalTest=null, signingConfig=null, resConfig=null}", value: "1.0.97".

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugCompile'.
   > Could not find com.android.support:appcompat-v7:20.0.0.
     Required by:
         android:app:unspecified

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.s

这其实在天朝是蛮常见的现象,因为dl-ssl.google.com被封了,所以你总是会因为下面的错误无法更新Android的SDK:

1
Failed connect to dl-ssl.google.com:443;

Jenkins服务器配置代理

这里之所以选择shadowsocks,是因为可以用自己在Google的VM上配置的shadowsocks代理服务器(顺便广告一下,Google的VM在做活动,几乎是最高配的机器都不要钱,而且第一跳就在美帝,用来做代理非常爽)。

安装shadowsocks的pythohn client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ pip install shadowsocks

Downloading/unpacking shadowsocks
  Running setup.py egg_info for package shadowsocks

    warning: manifest_maker: MANIFEST.in, line 1: 'recursive-include' expects <dir> <pattern1> <pattern2> ...

Installing collected packages: shadowsocks
  Running setup.py install for shadowsocks

    warning: manifest_maker: MANIFEST.in, line 1: 'recursive-include' expects <dir> <pattern1> <pattern2> ...

    Installing sslocal script to /usr/local/bin
    Installing ssserver script to /usr/local/bin
Successfully installed shadowsocks
Cleaning up...

可以看到安装完之后有两个可执行文件,运行其中的sslocal就可以启动shadowsocks的客户端了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@palm4fun-core-1:~/install# sslocal -h
usage: sslocal [-h] -s SERVER_ADDR [-p SERVER_PORT]
               [-b LOCAL_ADDR] [-l LOCAL_PORT] -k PASSWORD [-m METHOD]
               [-t TIMEOUT] [-c CONFIG] [--fast-open] [-v] [-q]

optional arguments:
  -h, --help            show this help message and exit
  -s SERVER_ADDR        server address
  -p SERVER_PORT        server port, default: 8388
  -b LOCAL_ADDR         local binding address, default: 127.0.0.1
  -l LOCAL_PORT         local port, default: 1080
  -k PASSWORD           password
  -m METHOD             encryption method, default: aes-256-cfb
  -t TIMEOUT            timeout in seconds, default: 300
  -c CONFIG             path to config file
  --fast-open           use TCP_FASTOPEN, requires Linux 3.7+
  -v, -vv               verbose mode
  -q, -qq               quiet mode, only show warnings/errors

Online help: <https://github.com/clowwindy/shadowsocks>

最简单的办法就是新建一个配置文件:

~/.shadowconfig
1
2
3
4
5
6
7
8
{
    "server":"my_server_ip",
    "server_port":8388,
    "local_port":1080,
    "password":"barfoo!",
    "timeout":600,
    "method":"table"
}

记得在防火墙打开你配置的本地端口,然后运行下面的命令:

1
2
3
4
root@palm4fun-core-1:~/install# sslocal -c ~/.shadowconfig
INFO: loading config from /root/.shadowconfig
shadowsocks 2.1.0
2014-09-02 00:27:53 INFO     starting local at 127.0.0.1:1080

命令行更新android sdk

先配置java命令使用的代理,然后 从命令行更新android sdk。只需要到tools目录下面去跑(-u是不显示GUI,-s是指定不使用ssl链接):

1
2
$ export _JAVA_OPTIONS="-DsocksProxyHost=127.0.0.1"
$ android update sdk -u -s --all

注意socksProxyHost的默认端口就是1080,如果你使用了其他端口不能只配ip。

另外,--all是比较猛烈的选项(人家的硬盘就是大,人家的代理就是快嘛),你可以在命令行里面通过filter来安装你需要的东西。

When shit happens

运行起来之后更新非常慢,可以android命令报timeout,而代理那边打出日志:

1
2
3
4
2014-09-02 00:27:53 INFO     starting local at 127.0.0.1:1080
2014-09-02 00:28:04 INFO     connecting 74.125.237.1:80
2014-09-02 00:28:04 INFO     connecting 74.125.237.1:80
2014-09-02 00:28:04 INFO     connecting 74.125.237.1:80

因为本座平时上网也是在用Google VM上的这个代理,没理由这么慢。所以就怀疑那个74.125.237.1的地址是被谁在/etc/hosts里面给配了固定ip。打开一看果然有:

1
dl-ssl.google.com 74.125.237.1

估计是之前配置的基友搜索到了类似这样的文章。这也是为什么我从来不用也不推荐别人用修改hosts文件的方法来翻墙的原因:它们总是在过期。

Last but not the least, Fuck you, GFW.

careful to choose

一个朋友最近跟我说,想去把伤口结痂留下的疤痕用液氮处理一下。

这是我第一次听说除开激光这种“极热”之外,还可以在人的身上用这种“极冻”的方式祛疤。

不过,虽然是听起来非常激烈的方式,大概多少也得吃点儿苦头,但能顺利把身上的疤去掉,总是好的。

相比之下,心头的疤就没有那么容易弄掉了:8月28日,孙仲旭老师因为抑郁症自杀辞世的新闻曝出,着实让我心里面咯噔了一下。

这离Robin Williams抑郁而终不过两个多星期。

《1984》、《动物庄园》、《麦田里的守望者》和耶茨的很多小说,其实之前就看过。但后来因为看了孙仲旭老师翻译的《麦田里的守望者》,就把他其他的译作都翻来看了。

现在想来,从他翻译目标的选择来看,本身就是一个很不快乐的人吧。

当然,这很正常。

人虽然从出生开始,都无非是走在通向死亡的道路之上,但每个人经历的过程和心中的念想却大不相同。

有的人很幸运,出生在和谐的家庭,从小就完整地见证过快乐是什么,长大后也顺风顺水,对人生有自己明确的诉求。

而有的人,只见到过碎片一样的生活,自己从来不明白自己活着是需要什么,又能给别人提供什么。

不但如此,还会对那些把幸福或者是快乐挂在嘴边的人呲之以鼻:因为从心底质疑它们是否真的存在。

正是有《麦田里的守望者》这样的小说,正是有Robin Williams这样的演员,正是有孙仲旭老师这样的译者,才让后面这种人明白,自己不是什么奇奇怪怪的东西:原来还有很多人都这样活着,或者是这样活过。

而偏偏也是他们选择了自戕,仿佛在提醒大家:你看,就算知道有这么多人这样活着,我也不知道如何是好。

我想他们不是没有放胆让那些温暖的人走进自己内心,也感受过幸福和快乐。但要习得孤独与爱的要义实在是太难。更何况,抑郁并不仅仅是心理上的问题而已。

最后,摘一段献给孙仲旭老师,Wish you rest in peace:

“我知道他死了!你以为我不知道?但是我仍然可以喜欢他,行吗?就因为这人死了,你不可能马上不再喜欢他了,岂有此理 —— 特别当这个人比你认识的活人要好上一千倍时。”

《麦田里的守望者》