宜兴自驾&踏青

每年春天都会和艾威PMP学友会的同学们出去踏青,美其名曰“压力管理”,其实也就是从腐败到入门级的户外活动。
今年在启波同学的提议下决定自驾去宜兴竹海徒步&露营,论坛上发个贴,微信群里吼一声,很快就定下来有17个人/5辆车同行~

周五晚20:00,江桥收费站,集合点,只等到了3辆车,一辆表示只能去阳澄湖集合,另外一辆杯具地到了花桥,发现不是集合点。。。于是也只能去阳澄湖集合了。
在阳澄湖休息区,5辆车终于汇合,成为艾威PMP车友会的车队(虽然只有5辆车,俺选了7号,哈哈Open-mouthed smile),分配好手台,正式出发~
俺的7号车

晚23:00,顺利到达宜兴。

周六一早,开往竹海森林公园。在当地向导地带领下,光明正大地从山路进入,不用门票~
原生态的山路,没有台阶,全是在竹林里的小路,如果不跟着向导走,很容易找不到方向。原计划3个小时登上“黄塔顶”,但是2个小时之后,我们才爬了一个山头,剩下的路,是沿着山脊线上上下下地走到“黄塔顶”。
竹海徒步_1
竹海徒步_2

真正登顶已经是到下午了,终于“爬”到了苏南第一峰——黄塔顶。有些地方真是的“爬”上来的,相对来说难度是要大一点。
休整一番,拍拍照,时间不早了,俺们就不继续走原计划的罗岕村了,还是回去吧~
竹海徒步@黄塔顶

下山还是得跟着向导,可以走到竹海的景区里边,然后坐景区的交通车到出口。当我们坐交通车的时候,发现另外一队跟我们同时进山的人马,已经从罗岕村回来了,太厉害了!相比起来,我们真是个“腐败”的团队。。。
徒步线路通过RunKeeper记了,中间间断过几次,所以这是粗略的线路图竹海徒步_线路

周六晚上,露营露营!扎营点在”离墨山”,就是善卷洞所在的那座山的山顶。具体位置见我新建的foursqure的地点。往山顶的盘山路修得很好,走汽车没有任何问题,山顶上有一大片空地,还有水井,条件是相当不错的。旁边还有一个往更高处的台阶,走上台阶就是真正的山顶了,是看日出的最佳地点。

停好车,大家拿出了各式各样的装备,有正常的露营帐篷,有迪卡侬的公园帐篷,还有开着福特探险者,直接把后排放下变成床的~露营_帐篷

到了晚上,燃起篝火,点着露营灯,在月光的照耀下,围坐起来玩杀人游戏,这是真正地放下一切烦恼,释放压力,享受自然~
露营_篝火

之前特意查过日出的时间,06:12分,周日早上,我睡懒觉没爬起来。。。但是有不少同学真的5点多就起床,看日出了,还拍了很多精彩的照片!
露营_日出_1露营_日出_2

离开露营地之前,大家把车排成了人字形,留影一张~
露营_车队

按照计划,周日早上开车到安徽游太极洞。话说这太极洞的大部分应该还是在江苏境内,只是入口在安徽罢。
太极洞_1

上一次玩宜兴的洞,还是在小学的时候。现在终于又一次玩了一下洞,感觉跟小时候真是不同。小时候游洞,大家带着手电,吸血鬼的牙套,在黑漆漆的洞里吓人,很好玩;成年了再看宜兴的山洞,感叹大自然的鬼斧神工,顺便感叹和吐槽一下里面的“人造”设施——某些光线打上去,效果还蛮灵异的。。。
太极洞_2太极洞_3太极洞_4

游完洞,觅完食,车队就浩浩荡荡地开回上海了。值得一提的是,周日傍晚回上海,沪宁高速的江桥段一向很堵,所以可以走S26进上海,一点都不堵,只是G2 往S26拐的时候,路口相当复杂,而往上海方向的路口又很小,容易错过。俺们车队就不幸有一辆车走错了口子,只能在手台里说bye bye了 😀

最后,来张大合影。
大合影

Q.E.D

Share

记一次email code question

Amazon.com在中国招人,如果简历pass了,最开始会有一次email code question,就是约定好时间,通过email把一个问题发过来,然后在一定的时间之内把东西实现好发回给amazon。

第一次做这个code question,感觉比在电话/skype里直接写code要好很多,至少完全是自己在写code,没有外界的干扰。

我收到的问题是,amazon定义了一个类以及它的接口和说明,要在一个小时之内实现这个类。主要是要定义好数据结构,其中大多数方法很简单,只有两个接口需要涉及到算法,也不算太难。最难的是需要在一个小时之内实现。。。

我的情况是:
一个小时的时候写好了除最后一个接口外的实现,最后一个函数已经想好怎么写了,但还没写完;
先发了个邮件把当前的工作发了过去,估计要被刷;不过既然已经写了,索性多花点时间把它做好——
一个小时10分钟的时候,最后那个函数也写完了,但是完全没有测过; 那就继续写UT吧——
一个小时40分钟的时候,写了几个基本的UT,至少能测到所有的函数,其间发现两个code的bug,修掉了。

也就是说,我花了100分钟的时间完成了amazon要求在60分钟之内实现好的东西。
p.s. amazon还要求在每个接口上document它的时间/空间复杂度,这个也没时间写,但是这个倒是不难。

总之,说明写code的速度还不够快;
但是,总觉得要在60分钟之内搞定它,也没太大意义,真的实现好一个类/接口,一般应该这么做吧:
实现功能;
写UT测试功能,保证功能正常(或者UT先写);
优化实现(比如说时间/空间复杂度)。
还是蛮花时间的。

Anyway,只是记录一下这次code question。

Share

临时解决Firefox扩展autoproxy的“可代理资源列表”不能用的问题

在天朝,用Firefox又翻墙的基本上都知道autoproxy(“福”)这么一个神器,用它配合各种翻墙软件(比如说GoAgent),可以做到对于国内的网站直连,对于需翻墙的网页用代理,效率很高。

更方便的是它是根据URL的规则来代理,所以一个网页里的其它资源(比如JPG,js,css等)都可以通过这个规则来决定是否被代理,效率更高。

不过这也带来一个问题,如果把一个被墙的网站加入代理列表,然后打开这个网站,这个时候往往出现这种情况:浏览器能打开一部分网页(比如header)但是接下来就不停地loading中,打不开完整的网页,比如stackoverflow,在load的过程中会调用 https://cdn.sstatic.net/Js/full-anon.en.js,这个被墙了,于是整个stackoverflow还是几乎打不开。
autoproxy issue on stackoverflow

于是autoproxy提供了一个“可代理资源列表” (Proxyable items),网页里的所有元素都可以设置是否使用代理(当然也是根据URL)。很实用的功能。
然而不知道从哪个版本的Firefox开始这个功能就坏了,打开来永远显示”No proxyable items”。如上图。
在忍了一段时间之后,决定自己看一下。

以前从来没搞过FF的扩展,只能试着看看了。
1) 从github上clone了一份源码,“编译”(其实是打包),生成了xpi;
2) 用 `firefox -ProfileManager` 启动FF,新建一个debug的profile(以防影响平时的使用),添加扩展,然后打开console log;
3) 发现在request.js的184行出了null exception:

getAllLocations: function(results, hadOutdated)
{
  let now = Date.now();

  // Accessing wnd.frames will flush outstanding content policy requests in Gecko 1.9.0/1.9.1.
  // Access it now to make sure we return the correct result even if more nodes are added here.
  let wnd = getReferencee(this.window);
  let frames = wnd.frames;
  ...
}

很明显是getReferencee()返回了null导致的。再看这个函数

function getReferencee(/**nsIWeakReference*/ weakRef) /**nsISupports*/
{
  try {
    return weakRef.QueryReferent(Ci.nsISupports);
  } catch (e) {
    return null;
  }
}

没太看明白,但估计是FF升级到某个版本之后就不能用这样的函数了。

尝试野蛮一点,让它直接return 原来的object:

function getReferencee(/**nsIWeakReference*/ weakRef) /**nsISupports*/
{
  return weakRef;
}

再测试,居然就好了!
autoproxy issue fixed on stackoverflow

为了能用这个功能,临时就改成这样吧,可能会有crash或者memory leak,但是至少目前work正常,呵呵。有空的时候再研究到底怎么回事。

p.s. 如果有懂FF的extension的童鞋,请告知原因或者直接fix~
p.p.s. 在github上Fork了一份,建了个branch issue_proxyableitems在上面改了。生成的xpi放在了这儿,对此功能有无比需求的童鞋可以直接下载了用 🙂

Share

用homeshick管理dotfiles

无论是Ubuntu还是Fedora还是其它Linux发行版,用户的配置文件尤其是.bashrc总是一件很重要的事情,这关乎到“用户体验”。为了在不同的电脑上有相同一致的“体验”,比如说公司和家里的电脑,伟大的程序猿们想出了不少解决方案,其中homeshick是个不错的东东。用了一阵感觉良好,总结一下。

原理
homeshick把配置文件集中放在一起(~/.homesick/repos/<repos>),并用git来管理/同步/更新。
在$HOME目录下用symbol link把实际的配置文件link过来,比如说像这样:

.bashrc -> /home/<user>/.homesick/repos/dotfiles/home/.bashrc
.gitconfig -> /home/<user>/.homesick/repos/dotfiles/home/.gitconfig

安装
首先,你得有git, 最好还有github帐号,这样方便维护你自己的dotfiles。
然后:

git clone git://github.com/andsens/homeshick.git $HOME/.homesick/repos/homeshick
printf '\nsource "$HOME/.homesick/repos/homeshick/homeshick.sh"' >> $HOME/.bashrc
. ~/.bashrc

安装完毕

使用
如果想从头开始用自己的配置文件,可以生成一份自己的repo,见下面的命令和注释

homeshick generate <dotfiles>  # 生成一个repository
homeshick track <dotfiles> .bashrc  # 生成一个symlink,并把.bashrc添加到repo里
homeshick track <dotfiles> .xxx  # 其它你想添加的dotfile
homeshick cd <dotfiles> # cd到repo的文件夹
git add home # 添加到git
git commit -m "Initial commit, add .bashrc" # commit
git remote add origin [email protected]/<gitname>/<dotfiles> # 添加到github
git push -u origin master   # Push到github
cd - # 返回

如果在另外一台机器上想使用刚才添加过的dotfile,(比如说家里的机器,或者新安装了系统)
首先,按上面的步骤安装homeshick
然后:

homeshick clone <gituser>/<dotfiles> # clone github上的repo, 并自动生成symlink

搞定!

其它
Check dotfiles有没有更新

homeshick refresh

在文件夹里的dotfiles,比如说vim vundle,一般在 .vim/bundle/vundle

homeshick cd <dotfiles>
git submodule add https://github.com/gmarik/vundle.git home/.vim/bundle/vundle
homeshick link

Q.E.D.

Notes
1) Homeshick github: https://github.com/andsens/homeshick
2) 小心不要commit敏感信息,比如密码/API key,等等。要是真不小心commit到github了,参考这篇文章: https://help.github.com/articles/remove-sensitive-data

Share

2013国庆@嘉茂国际花鸟园

    这次国庆*又*很忙,几乎每天都是吃来吃去的,不过总算有那么一天,一大家子人去嘉茂国际花鸟园玩了。

    这个花鸟园位于江阴和无锡的中间,离家很近,开车过去也就20分钟的路程,比起无锡市的景点来要近多了,这点很不错~

    一近门是个大花圃,顶部透明的建筑,地上摆满了各种花花草草,连头顶上也垂着各种植物(抱歉我都不认得。。。);一些休闲的桌椅坐落其中,绝对是个环境优美的和朋友小聚的好去处!于是,我妈和我LP都很兴奋地拍了不少照片~
    tips: 门票50,老人小孩半价;网上订票40;但是如果去里面用餐就可以免费入园。如果真想省这个钱,可以找一帮散客假装一起去吃饭,入口处就让进了Open-mouthed smile

LP_1LP&ViewLP_2妈

    连着花圃的是三个园子。

    鸟园有着不少各类的观赏鸟,颜色鲜艳的金刚鹦鹉,高贵但是不开屏的孔雀,还有一些不记得名字的没见过的鸟类,也就瞎看看。不过其中有一个鹦鹉还真会吃瓜子,是真的剥开来吃瓜子肉的那种,厉害!
孔雀鹦鹉

    有着假山、池塘的是中间的园子,锦鲤,鸳鸯,黑天鹅,主要就是这些了吧。只有这个园子是露天的,在亭子里看看鱼,打打牌,这里最休闲了~
假山流水

    最后一个是莲花池,中间是有着很多五颜六色的莲花的池子,周围长着奇异的像是巨型牵花一样的树,感觉也不错的。池子里还有很大的叫不出名字的叶子,比较少见,不过在中国的池子里有这样造型的东西,就会有人扔硬币,即使是这样的叶子也不例外。。。
莲花叶子

    说实话,这个花鸟园花钱去有所不值,但是去吃个饭,看看园艺,打打牌,一家人休闲地小聚,倒是很不错的。
全家福

Share