BRT链接线

新闻讨论BRT链接线的取舍。当初开通BRT链接线,主要是为了培养BRT的客流,事前的论证结果肯定也是亏本的,明眼人一看就知道。刷卡3毛钱,投币5毛钱,油钱都收不回来。
链接线我只坐过一次,在集美坐的,应该是大年初二的早上,基本是坐专车。除了上下班高峰,我想链接线平时肯定坐都坐不满。
一个城市的快速交通,BRT也好,地铁或者轻轨也好,要真正发挥其优势,必须要形成网状结构,并建设好换乘体系。如北京上海广州现阶段地铁网络。南京只有一条线,我虽然就住在地铁沿线,但去很多地方,比如山西路、大桥南路、紫金山、龙江,首选只能是公交。预计要等地铁3号线的通车,地铁才能真正发挥其优势。
正如541说过的,BRT其实是场赌博,所以ZF要尽其所有保证其运营。现在BRT客流还不错,原有的链接线改成普通公交线并适当延伸,也是不错的选择。

IE6设置Image.src的bug

这个问题我现在也没彻底搞懂。网站有一块需要建立一个Image对象,设置好src属性,onerror和onload属性,然后把Image添加为div的子元素,交给浏览器去请求图片并渲染(请看p.s.)。用其他浏览器都很正常,但用IE6浏览器访问,虽然能得到图片,但服务器的日志里会报错,第一个Exception是Connection reset by peer,第二个是多次调用response.getOutputStream()或getJspWriter()。
上了调试器,发现一次图片的调用,服务器会在入口函数的断点停留两次,说明浏览器发出了两次请求。用Fiddler看各次请求的内容,居然再也无法重现错误了。换用HttpWatch,终于重现了错误。每次图片的调用都会有两个请求,第一个请求发出后马上被掐掉(Aborted),然后接着发出第二个请求。这解释了为什么会抛Connection reset by peer的异常。第二个异常的原因,估计是当浏览器的reset请求到达服务器时,服务器的代码已经完成了生成图片的工作,并把图片塞进了response,这个时候抛来一个异常,被forward到error.jsp,于是乎二次调用了getJspWriter,报错。
网上搜了搜这个问题,有少许提到这个bug。我的解决方法很简单,就是在image append到div之后,再设置src属性。经测试解决了IE6的Aborted问题,其他浏览器,如IE7,FF3和Chrome都没什么影响。
p.s. 后来看到玉伯的博客,发现Image对象在设置了src对象以后就马上请求图片,并不等到被添加到DOM上再请求,因为Image本来就是用来做图像预加载的。所以原本的代码就有一些错误,应该先设置onerror和onload属性后,再设置src才有意义。
p.s.2 这里是一篇描述了IE中Aborted的文章,推翻了不少本文的无妄猜测。
p.s.3 经我第三次的测试,发现IE6中如果先设置image.src在appendChild,会出现Aborted问题,相反顺序则没有问题。

简单比较Apache+Tomcat的mod_jk和mod_proxy方法

这几天服务上线。由于80端口还需要blog和wiki两个服务,所以把80给了Apache管理,然后再通过apache连接后面8080的Tomcat。
Apache+Tomcat主要有三种办法实现: mod_jk, mod_proxy和ajp_proxy。mod_jk是比较专门针对Tomcat的方法,通过AJP协议连接Tomcat,mod_proxy不止可以连接Tomcat,只要是HTTP应用都可以进行反向代理。ajp_proxy不是很清楚,具体参见这里
我前后碰到过三种不同的配置环境。第一次是搭建试验服务的时候,服务搭建在一台内网机器上,通过外网机器的8080端口映射内网的80端口进行访问。由于可对外暴露的端口只有被映射的一个80端口,自然把Apache推了上去。使用mod_proxy进行反向代理配置。后来上面要求搭建两个运行实例,于是开了两份Tomcat,配了两份的proxy。一个在18080,一个在28080。

ProxyPass /app http://localhost:18080/app
ProxyPassReverse /app http://localhost:18080/app
ProxyPass /app2 http://localhost:28080/app2
ProxyPassReverse /app2 http://localhost:28080/app2
第二次的环境并不是Apache+Tomcat,而是IIS+Tomcat。对IIS的不熟悉让我一段时间之内挠破了头。IIS上我没有找到比较实用的mod_proxy组件,特别是使用ISAPI的mod_proxy。而另外一个重大变化在需求上,这次要求服务支持SaaS,而我们服务的SaaS通过访问的域名来区别不同的租户。比如通过abc.example.com和def.example.com访问的用户,虽然使用的是同一个应用,但是却在不同的租户空间内进行操作。
可行的办法是使用ISAPI Rewrite。ISAPI Rewrite事实上是提供Proxy功能的,但那是收费版本。免费的Lite版本只有URL Rewrite的功能。我只好彻底放弃了Proxy的打算,对用户做重定向。比如访问http://abc.example.com的用户将被重定向到http://abc.exmaple.com:8080/app。对于wiki和blog这些访问,在配置文件中当作例外处理。以下是配置文件:
RewriteCond %{HTTP:Host} example\.com$
RewriteCond %{HTTP:Host} !www\.example\.com$
RewriteCond %{HTTP:Host} !wiki\.example\.com$
RewriteCond %{HTTP:Host} !blog\.example\.com$
RewriteRule app/(.*) http://%{HTTP:Host}\:8080/app/$1 [NC,R=301]
RewriteCond %{HTTP:Host} example\.com$
RewriteCond %{HTTP:Host} !www\.example\.com$
RewriteCond %{HTTP:Host} !wiki\.example\.com$
RewriteCond %{HTTP:Host} !blog\.example\.com$
RewriteRule (.*) http://%{HTTP:Host}\:8080/app [NC,R=301]
RewriteCond %{HTTP:Host} www\.example\.com$
RewriteRule ^/$ http://%{HTTP:Host}/app/index.htm [NC,R=301]
RewriteCond %{HTTP:Host} wiki\.example\.com$
RewriteRule ^/(.*)$ http://www.example.com/wiki/$1
RewriteCond %{HTTP:Host} blog\.example\.com$
RewriteRule ^/(.*)$ http://www.example.com/blog/$1
第三次,经过争取,服务器的80端口让位于Apache。当我打算切回第一次的mod_proxy配置时,却发现一个致命的问题:Request里Host的内容已经被mod_proxy修改成了配置文件里的localhost,没有反映用户真实请求里的abc.example.com或者def.example.com。况且系统还要求支持实时添加租户,即在不重启系统的情况下增加新的*.example.com的访问。
mod_proxy虽然能对后台任何的HTTP服务做反向代理,却把泛域名访问给挡在了门边。另外我也终于明白了为什么试验服务器上的Tomcat访问日志里,来源都是127.0.0.1——因为来源都是Apache这个代理。
mod_jk的配置里,虽然仍然需要输入Tomcat的Host,但是似乎AJP协议的保留了前台访问的域名(后台程序通过request.getServerName()获得)。而客户端的IP地址也被成功的记录下来。有兴趣的同学们可以参见AJP 1.3的协议参考。mod_jk的配置就不贴出来了,具体可以看开头介绍proxy_ajp的那个链接

ebay实习 笔经+面经

上周四和周五,ebay来学院招实习。这么个送上门来的机会自然不能错过,宿舍三人同行去笔试。之前问了点笔试的内容,说考了不少英语,还有些类似GRE的数学题(个人估计就是简单的SHL),还有就是数据结构。
宣讲会很热闹,我们到晚了,里面又很闷,只好在外面候着。见到一些小弟,纷纷问我怎么也来了。唉,人老大不小了还要和大三的DDMM们抢实习。
笔试的题目有些出乎我的意料之外。25题,全选择,30分钟完成。题目不是很难,但时间紧,典型是压力测试。多亏我有过SHL的一些经验,很快进入状态完成了前面8题逻辑,最后一题暂时没头绪,直接放过。中间是技术题,Java、C++、SQL,仍然有一两题不是很确定。但时间不容许我再仔细思考,直接上最后8题的阅读理解。做完阅读理解后回头看了看前面不确定的答案,等我刚填好所有的答案之后大概10多秒,HR就宣布考试结束。收走了试题册后,HR又出了题小作文,写了6、7句话就交了。
和舍友们回浦口校区吃了启明园,想起了上个学年偶尔在启明园的日子,特别是那段暑假留下来上课的时刻。吃饱了突然想去看看从未踏入的工作室新址,如果再不去的话,南大远走仙林以后再也没机会见一眼了。见到了王子龙和刘白光,还有一位DD素未谋面,难道是remember2015?回鼓楼的路上,我们三人陆续收到了明天面试的通知,痛苦的是8:15开始的面试6:30就得起床,郁闷的是居然把我的名字写错了,还错得很夸张。有消息说我笔试考了第一,不过怎么算,也错了3、4题吧。
第二天的面试分为两大轮,单面和群面,通过单面的才能进入群面,而单面又分为三轮,每一轮都有被淘汰的可能。笔试的淘汰率不高,大概只有50%,所以今天有90人参加面试,角逐只有个位数的实习岗位。
我是名单上的第一个,自然就第一个进了面试教室。第一个面我的估计是个一线开发人员,比较casual,一直让我不要紧张。除了我的项目,就是问一些比较泛的技术问题,还有一些通用的技术手段,比如Web性能调优的一些方法。最后简单问了点英语然后就送我进二面。二面估计是个项目经理,主要围绕项目来谈,也问了我的实习时间。三名应该就是CDC部门经理了(主要是前一天的宣讲到晚了,没看清楚,不然应该认得),要我用英文描述我的技术优势,并举个例子证明。我的回答没让他满意,重来了一次后,他说我简历上其实有很多可以谈的东西我都忽略了。不过他最终还是让我进了群面。
群面和想象的一样,一群人讨论一个Open Question。发挥一般,发言量低于平均水平,而发言也没什么突出的地方,主要随大流了。那个时候第一肚子很饿,6:40吃的早饭,12:40群面才开始,期间粒米未进;第二困,前一个晚上没睡好,折腾APIS到近1点,上床了也没睡安稳;第三,心情很复杂。负责任的说,我应该是所有参加面试的人中心情最复杂的一位。即使我拿到了Offer,能否成行也是未知数;第四,脑子里还在纠结APIS的一个服务配置问题,总想着把这个搞定,早上为了这个面试时小老板给我打了6个电话。综合上面的原因,群面中我基本上没怎么主动发言。
面试结束后倒是很轻松,回鼓楼宿舍睡觉。晚上还要赶赴上海,第二天的雇主见面日。。。
小结:以后面试要带吃的,前天晚上要睡好,排除其他干扰。要准备一些有关自己能力的一些材料,以免面试时磕磕巴巴。

饮鸩止渴的大学扩招

华尔街日报:中国大学扩招易 学生就业难 (需要注册,这里有转载版
面对当今严峻的就业形势,上面又祭起了扩招这面大旗。98年的扩招基本毁了本科教育,这些年来的研究生扩招(具体哪年开始不清楚了,但06年保研的时候正好碰上了 一轮保研名额增加)。现在中国高等教育也只剩下博士培养这块已经千疮百孔的遮羞布了。
虽然教育是一个国家的根本,可是高等教育扩招并不能掩盖教育投资严重不足的窘境。脱离国情的大学生比例造成了一方面工厂缺乏大量熟练技术工人招工难,另一方面大学生找不到工作就业难。而更多的大学生能否等同于更高的人口素质,这还要打上一个问号。
回到文章里的那个和我在一个城市,就读一个专业的大学生身上。90年前大学生慷慨激昂;90年后却是心灰意冷对社会绝望。很能理解他们的感受。
经常看到有言论批评大学生眼高手低不肯放下身段从基层做起。如果从微观的角度来说,一个人,或者几个人,读完大学四年,甚至是七年,找不到工作,那是个人奋斗问题;但如果从宏观的层面来看,很大一部分比例的大学生找不到工作,那就是Gov和社会的问题。

乔迁之喜

某人一股脑的写了那么多文章,搞得我看了好半天~ 既然某人搬个博客都这么亢奋,那我,做为熟人,一定要发篇blog恭喜一下。
孔子曰:名不正则言不顺,言不顺则事不成。所以首先要正名。既然only的名字在marshall前面,小白在小黑前面,那就证明,我好歹。。算半个主人吧,哈哈。其实我是想低调点的,可某人写了长篇累牍的blog都没提到我。。我实在忍不住了,只能“跳警”了。
话说我这个懒人基本不写blog的,现在工作了,不知道可不可以稍微勤快一点。。。争取争取。。。大家监督。。