Monthly Archives: January 2014

记一次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