<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OnlyLonely &#38; Marshall's &#187; 导入</title>
	<atom:link href="http://www.onlymarshall.com/category/imported-items/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.onlymarshall.com</link>
	<description>小白和小黑</description>
	<lastBuildDate>Mon, 23 Apr 2012 15:58:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>雇主见面日。。。</title>
		<link>http://www.onlymarshall.com/2009/04/29/employer-meeting-day/</link>
		<comments>http://www.onlymarshall.com/2009/04/29/employer-meeting-day/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 22:36:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[求职]]></category>
		<category><![CDATA[ACCA]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=92</guid>
		<description><![CDATA[本来只打算考一次免费的BULATS，那个ACCA的比赛居然让我去雇主见面日。。。要是到会场看到一群正装革履跃跃欲试的叔叔阿姨们，我就直接匿了。。。]]></description>
			<content:encoded><![CDATA[<p>本来只打算考一次免费的BULATS，那个ACCA的比赛居然让我去雇主见面日。。。要是到会场看到一群正装革履跃跃欲试的叔叔阿姨们，我就直接匿了。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/29/employer-meeting-day/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用JMeter进行压力测试</title>
		<link>http://www.onlymarshall.com/2009/04/25/using-jemer-for-load-test/</link>
		<comments>http://www.onlymarshall.com/2009/04/25/using-jemer-for-load-test/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 18:36:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=93</guid>
		<description><![CDATA[JMeter是一款优秀的开源压力测试工具。网上有不少介绍的文章，比如DeveloperWorks上有一篇。不过脚本的制作比较麻烦，自己手动输入参数比较不实际。cnblog上有一测试达人在这里介绍了一个免费工具Badboy，可以录制在IE上的操作并导出JMeter脚本。Badboy本身是一个Web自动化测试工具。不足的是，一些Badboy录制的动作JMeter并不支持，比如多窗口操作。在导出jmx文件的时候Badboy会提示不能导出的内容。Badboy也有一些不够智能的地方，比如写死了服务器地址，而不是创建一个默认的HTTP访问器。 一开始使用JMeter进行压力测试完全是冲着JMeter的Cookie Manager功能去的。如果使用简单的工具，比如apache自带的ab工具，则要想方设法绕过应用程序的登录机制。使用Cookie Manager虽然不需要配置，但要注意的是，要把发来初始cookie的地址给包括进来。我测试的系统在/login.do这里发放cookie，但我直接访问/acegi_login登录，结果就丢掉了cookie，导致后续步骤失败。]]></description>
			<content:encoded><![CDATA[<p><a href="http://jakarta.apache.org/jmeter">JMeter</a>是一款优秀的开源压力测试工具。网上有不少介绍的文章，比如DeveloperWorks上有<a href="http://www.ibm.com/developerworks/cn/opensource/os-pressiontest/">一篇</a>。不过脚本的制作比较麻烦，自己手动输入参数比较不实际。cnblog上有一测试达人在<a href="http://www.cnblogs.com/jackei/archive/2006/11/10/557160.html">这里</a>介绍了一个免费工具Badboy，可以录制在IE上的操作并导出JMeter脚本。Badboy本身是一个Web自动化测试工具。不足的是，一些Badboy录制的动作JMeter并不支持，比如多窗口操作。在导出jmx文件的时候Badboy会提示不能导出的内容。Badboy也有一些不够智能的地方，比如写死了服务器地址，而不是创建一个默认的HTTP访问器。</p>
<p>一开始使用JMeter进行压力测试完全是冲着JMeter的Cookie Manager功能去的。如果使用简单的工具，比如apache自带的ab工具，则要想方设法绕过应用程序的登录机制。使用Cookie Manager虽然不需要配置，但要注意的是，要把发来初始cookie的地址给包括进来。我测试的系统在/login.do这里发放cookie，但我直接访问/acegi_login登录，结果就丢掉了cookie，导致后续步骤失败。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/25/using-jemer-for-load-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你出生日的照片</title>
		<link>http://www.onlymarshall.com/2009/04/25/%e4%bd%a0%e5%87%ba%e7%94%9f%e6%97%a5%e7%9a%84%e7%85%a7%e7%89%87/</link>
		<comments>http://www.onlymarshall.com/2009/04/25/%e4%bd%a0%e5%87%ba%e7%94%9f%e6%97%a5%e7%9a%84%e7%85%a7%e7%89%87/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 14:26:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=94</guid>
		<description><![CDATA[在百合十大上看到的，挺有意思的。转载如下： 这个人—— 　　从1979到1997。18年。pola相机。每天一张照片。 　　第一张是1979年3月31日，最后一张是1997年10月25日。后头的就没了。 　　因为，1997年10月25日那天，拍照片那人死在病床上。 他的朋友把他生前拍的照片整理了出来，放在网上。 　　网址http://photooftheday.hughcrawford.com 18年都在里面。 下面这张是我出生日的照片，居然是比萨斜塔：]]></description>
			<content:encoded><![CDATA[<p>在百合十大上看到的，挺有意思的。转载如下：</p>

<a href='http://www.onlymarshall.com/2009/04/25/%e4%bd%a0%e5%87%ba%e7%94%9f%e6%97%a5%e7%9a%84%e7%85%a7%e7%89%87/8681818bb588eb5e9f2fb4641/' title='8681818bb588eb5e9f2fb4641'><img width="150" height="150" src="http://www.onlymarshall.com/wp/wp-content/uploads/2009/04/8681818bb588eb5e9f2fb4641-150x150.jpg" class="attachment-thumbnail" alt="8681818bb588eb5e9f2fb4641" title="8681818bb588eb5e9f2fb4641" /></a>

<pre>这个人——
　　从1979到1997。18年。pola相机。每天一张照片。
　　第一张是1979年3月31日，最后一张是1997年10月25日。后头的就没了。
　　因为，1997年10月25日那天，拍照片那人死在病床上。
    他的朋友把他生前拍的照片整理了出来，放在网上。
　　网址<a href="http://photooftheday.hughcrawford.com">http://photooftheday.hughcrawford.com</a>
    18年都在里面。</pre>
<p>下面这张是我出生日的照片，居然是比萨斜塔：</p>
<p><img src="http://hughcrawford.smugmug.com/photos/300435907_y8p2r-L.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/25/%e4%bd%a0%e5%87%ba%e7%94%9f%e6%97%a5%e7%9a%84%e7%85%a7%e7%89%87/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>国家地理的新节目：Megastructures/Megafactories</title>
		<link>http://www.onlymarshall.com/2009/04/23/ngc-meagstructures/</link>
		<comments>http://www.onlymarshall.com/2009/04/23/ngc-meagstructures/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 19:31:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[NGC]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=95</guid>
		<description><![CDATA[    虽然标题上说是新节目，不过估计也开播一两年了。主要都是从emule上拖的，地址在这里。主要介绍了一些大型工程产品的制作过程。对engineering有爱的同学可以看看。最近看了以下几集：     M1A2埃布拉姆斯坦克。M1现在已经不生产了，纪录片里拍的是M1的翻新和改进过程，比如把M1A1翻新成M1A2。令人印象深刻的莫过于重量，特别是M1厚重的装甲。另一个让人感兴趣的东西是库存的零件，放在一个巨大的仓库里，所有的零件的存取都通过机器人操作。     Apache直升机。感觉阿帕奇的生存设计就是冗余。两台发动机，一台1800马力。两个电子吊舱，两套配线，典型一个有重生技能的牛头人。出乎意料的是，阿帕奇的生产装配是全手工的，几乎没有引入机器人进行装配，还有就是邮箱居然是橡胶的。     弗吉尼亚级攻击型核潜艇。美国海军的当家宝贝，藏着掖着没说啥具体的东西。主要就是一些训练的内容和一笔带过的制造工艺。     C-5银河运输机。C-5的制造也是很早以前的事了，大概在上世纪80年代，所以纪录片讲述的主要是C-5的使用和保养。虽然C-5已经很大了，最大起飞重量有近400吨，可是它上面还有老毛子的近乎变态的An-124和An-225。这一集拍的是一架C-5搭载M1的强化装甲去伊拉克的故事，和M1坦克那集倒是有呼应。夜晚空中加油那段拍得很不错。     卡特彼勒巨型卡车。大家经常看到在施工场所里的重型设备上的CAT，指的就是卡特彼勒毛毛虫（CATerpiller）。直到这次金融危机前，我还一直以为CAT是某个日本的重工集团，类似三菱或者川崎。卡特彼勒本来是生产拖拉机的，由于在田野里的样子像毛毛虫，这个名字就保留了下来。这集里说的巨型卡车，就像大家在电视上看到三峡大坝施工场地里跑的那种巨型装卸卡车，车轮子就有两人高，整个车大概有3层楼高。这么大型的车辆，由于无法进行整车运送，所以都是把装配好的主要大件，比如车架、轮子、驾驶室、装卸斗用火车分别运到施工场地（片子里是加拿大的油砂产地），再进行组装。全车150吨，马力惊人。制造过程中使用了大量的自动焊接，牛B的是，焊接处的结构强度比铸造部分的结构强度还要大。。。     UPS高速递送。只介绍了UPS美国国内的业务。所有的邮件，除了目的地是本地附近地区的以外，全都空运送到美国中部Kentucky的一个镇上进行redistribution（不知道我有没有理解对，不过片子里似乎就是这样的）。邮件分为大中小三种类型进行分拣，大量的人工+更大量的自动化分拣。不知国内的那些快递公司，包括EMS，何时能达到如此业务水平。     宝马Z4跑车。主要讲了Z4的组装过程。Z4的发动机居然是用铝和镁组成的，气缸内壁用铝，外面用镁，整个V6的发动机气缸只有30公斤。为了减重，MS进气道用的是塑料。]]></description>
			<content:encoded><![CDATA[<p>    虽然标题上说是新节目，不过估计也开播一两年了。主要都是从emule上拖的，地址在<a href="http://www.verycd.com/topics/336698/">这里</a>。主要介绍了一些大型工程产品的制作过程。对engineering有爱的同学可以看看。最近看了以下几集： </p>
<p>    <strong>M1A2埃布拉姆斯坦克。</strong>M1现在已经不生产了，纪录片里拍的是M1的翻新和改进过程，比如把M1A1翻新成M1A2。令人印象深刻的莫过于重量，特别是M1厚重的装甲。另一个让人感兴趣的东西是库存的零件，放在一个巨大的仓库里，所有的零件的存取都通过机器人操作。 </p>
<p>    <strong>Apache直升机。</strong>感觉阿帕奇的生存设计就是冗余。两台发动机，一台1800马力。两个电子吊舱，两套配线，典型一个有重生技能的牛头人。出乎意料的是，阿帕奇的生产装配是全手工的，几乎没有引入机器人进行装配，还有就是邮箱居然是橡胶的。 </p>
<p>    <strong>弗吉尼亚级攻击型核潜艇。</strong>美国海军的当家宝贝，藏着掖着没说啥具体的东西。主要就是一些训练的内容和一笔带过的制造工艺。 </p>
<p>    <strong>C-5银河运输机。</strong>C-5的制造也是很早以前的事了，大概在上世纪80年代，所以纪录片讲述的主要是C-5的使用和保养。虽然C-5已经很大了，最大起飞重量有近400吨，可是它上面还有老毛子的近乎变态的An-124和An-225。这一集拍的是一架C-5搭载M1的强化装甲去伊拉克的故事，和M1坦克那集倒是有呼应。夜晚空中加油那段拍得很不错。 </p>
<p>    <strong>卡特彼勒巨型卡车。</strong>大家经常看到在施工场所里的重型设备上的CAT，指的就是卡特彼勒毛毛虫（CATerpiller）。直到这次金融危机前，我还一直以为CAT是某个日本的重工集团，类似三菱或者川崎。卡特彼勒本来是生产拖拉机的，由于在田野里的样子像毛毛虫，这个名字就保留了下来。这集里说的巨型卡车，就像大家在电视上看到三峡大坝施工场地里跑的那种巨型装卸卡车，车轮子就有两人高，整个车大概有3层楼高。这么大型的车辆，由于无法进行整车运送，所以都是把装配好的主要大件，比如车架、轮子、驾驶室、装卸斗用火车分别运到施工场地（片子里是加拿大的油砂产地），再进行组装。全车150吨，马力惊人。制造过程中使用了大量的自动焊接，牛B的是，焊接处的结构强度比铸造部分的结构强度还要大。。。 </p>
<p>    <strong>UPS高速递送。</strong>只介绍了UPS美国国内的业务。所有的邮件，除了目的地是本地附近地区的以外，全都空运送到美国中部Kentucky的一个镇上进行redistribution（不知道我有没有理解对，不过片子里似乎就是这样的）。邮件分为大中小三种类型进行分拣，大量的人工+更大量的自动化分拣。不知国内的那些快递公司，包括EMS，何时能达到如此业务水平。 </p>
<p>    <strong>宝马Z4跑车。</strong>主要讲了Z4的组装过程。Z4的发动机居然是用铝和镁组成的，气缸内壁用铝，外面用镁，整个V6的发动机气缸只有30公斤。为了减重，MS进气道用的是塑料。  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/23/ngc-meagstructures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SHL</title>
		<link>http://www.onlymarshall.com/2009/04/11/shl/</link>
		<comments>http://www.onlymarshall.com/2009/04/11/shl/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 22:46:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[求职]]></category>
		<category><![CDATA[SHL]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=96</guid>
		<description><![CDATA[    今天去考了ACCA那个比赛的初试，考了一次SHL玩玩。算是我第三次正式考SHL了吧，第一次是去年的ACCA比赛，第二次是年初的UBS，都挂了。囧     不过更囧的是今天去考试的路上。考试在南审，我差不多算好时间骑车出门，没想到到清凉门的时候前轮的挡泥板居然由于年久失修，掉下来了。要是全部掉下来就算了，我直接摔垃圾桶走人，只掉了一个螺丝，结果导致挡泥板直接卡在了前轮上，不能骑了。前面离南审还有1公里多的路，还有10多分钟就要进场了，又没公交车直达，而且我还不知道考试地点的具体位置（只知道教室门牌和楼宇的大概位置）。。。还好急中生智硬是把挡泥板拗弯，架在以前车篮的残骸上，居然又能骑了。     仍然提前赶到考场（还好提前留了10分钟），入场，顺利答完题目。SHL这个东东的确是能够训练的考试，去年这个时候考这个的时候，我只做了大概18题不到；今天之前做了点准备，在考官喊停笔前半分钟正好做完。看到周围有很多人没做完，想起了去年这个时候的我，信心满满去考试却被打击得不行。     下半年找工作，应该还会碰上一些SHL。不过IT的笔试更主要还是考专业上的知识，算法、数据结构还有语言吧。    p.s. 要是过了这一轮，就可以免费考一次博思，嗯，主要是冲着这个去的。     p.s. 最近写文档。。恨APIS九个洞。。。]]></description>
			<content:encoded><![CDATA[<p>    今天去考了ACCA那个比赛的初试，考了一次SHL玩玩。算是我第三次正式考SHL了吧，第一次是去年的ACCA比赛，第二次是年初的UBS，都挂了。囧 </p>
<p>    不过更囧的是今天去考试的路上。考试在南审，我差不多算好时间骑车出门，没想到到清凉门的时候前轮的挡泥板居然由于年久失修，掉下来了。要是全部掉下来就算了，我直接摔垃圾桶走人，只掉了一个螺丝，结果导致挡泥板直接卡在了前轮上，不能骑了。前面离南审还有1公里多的路，还有10多分钟就要进场了，又没公交车直达，而且我还不知道考试地点的具体位置（只知道教室门牌和楼宇的大概位置）。。。还好急中生智硬是把挡泥板拗弯，架在以前车篮的残骸上，居然又能骑了。 </p>
<p>    仍然提前赶到考场（还好提前留了10分钟），入场，顺利答完题目。SHL这个东东的确是能够训练的考试，去年这个时候考这个的时候，我只做了大概18题不到；今天之前做了点准备，在考官喊停笔前半分钟正好做完。看到周围有很多人没做完，想起了去年这个时候的我，信心满满去考试却被打击得不行。 </p>
<p>    下半年找工作，应该还会碰上一些SHL。不过IT的笔试更主要还是考专业上的知识，算法、数据结构还有语言吧。 </p>
<p>   p.s. 要是过了这一轮，就可以免费考一次博思，嗯，主要是冲着这个去的。 </p>
<p>    p.s. 最近写文档。。恨APIS九个洞。。。  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/11/shl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>雨乌线运转小记</title>
		<link>http://www.onlymarshall.com/2009/04/10/bus-travel-of-wuyu/</link>
		<comments>http://www.onlymarshall.com/2009/04/10/bus-travel-of-wuyu/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 22:16:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[游玩]]></category>
		<category><![CDATA[交通]]></category>
		<category><![CDATA[公交]]></category>
		<category><![CDATA[运转]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=97</guid>
		<description><![CDATA[乌江和安徽一江之隔。两地各辖一个乌江镇。乌江桥东为浦口，西为安徽和县。项羽当年在此自刎。 起点，科苑宾馆，浦葛线 要坐的雨乌 612，来的时候坐的这部车，从江浦到乌江 车内图，全车大概50个位子，包括加座(就像校车的加座，要翻下来坐过道上) 路过桥林 这镇上还有电影院 京沪高铁，H型柱子，城际是Y型的柱子   从这里离开宁乌路，上三桥   大奔用来运货了，车牌还挺牛B，苏A ST001，三桥收费站 终点，雨花区议会山 雨花台纪念馆 雨花台纪念碑 雨花台群雕   一早鼓扬到开发区，3元 吃过午饭后 浦葛到浦六路，1元 汉江到江浦，1.5元 612到乌江，3元 雨乌到雨花台南门，5元 26到丹凤街，1.2元 全程约110公里，14.7元]]></description>
			<content:encoded><![CDATA[<p>乌江和安徽一江之隔。两地各辖一个乌江镇。乌江桥东为浦口，西为安徽和县。项羽当年在此自刎。 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mz9WZcmjI2l7ipbwMAM-7YKDRyQl8zSGz3lmVKSue-1yDmOyGyUNNZJYfiH0xCQ2Z0cDAx3QfqyGo-hdqqODmjG45t7VOYQuiUUGiMU0RlKrR4H7art7yTQQEdGHss9ud4BBwhZ7C6iMa4Yj2Dosurw/20090409155[2].jpg" rel="WLPP"><img title="20090409155" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090409155" src="https://ivsrkw.blu.livefilestore.com/y1m07rH0AM89oN1rMaSjsDfbyf0hrjrzvtqZ_4PQ0YDqcTkMr5AWRw8Ml9nDGZVV96TLsWGcODCGkF3WdsDU0ua_6LAM8mQIWv-glCkpzr4W5JcOGSgDbiXIO-34QLQ6qYbnSC_Mk3Q0StYvGipOl4vpA/20090409155_thumb.jpg" width="244" border="0" /></a> </p>
<p>起点，科苑宾馆，浦葛线 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mfpRgVQuFlxnXFzz9Tbb8M-ifuuO9Z1HnECfQEr7Q9D-YDvSXbCKRf4rtABPuIyjeKgSEL6j-WmtKC67NfZGCGlMs_-moX8qqMkX1PUcV4gmNtybfcmUG4z5ix7Ad8m72cvG0X5AeFyvZPJl5DYLfcQ/20090410160[2].jpg" rel="WLPP"><img title="20090410160" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410160" src="https://ivsrkw.blu.livefilestore.com/y1mMXDvhgjMOnWu6V2wTJ1mMbABlI2TM5rHeo_D5FWVzmpADq2Jd_n37BcqbG30cp6_GXJ08sT56Wb2phRNEowYBg7UKnGULvWqgUsWLIb9VCwxZCt_sWEn-PXnztitp_jNlufytRlOqyXTb4aNJto0Ng/20090410160_thumb.jpg" width="244" border="0" /></a> </p>
<p>要坐的雨乌 </p>
</p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1m8GN1SIB80X50N5PDEX445su6J_x0I4af3BItM1V82v22uValRkmCtgUMfWIcdIvvJwLfpFrQ0DGseCWpNPMvuDcippi59SZ8dYkKAcHK2RaOM3CRboupqVfUe9klEW-TQQx8sCr_W_CsPhCRQ9aZ6Q/20090410158[2].jpg" rel="WLPP"><img title="20090410158" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410158" src="https://ivsrkw.blu.livefilestore.com/y1m9qa8JhD8RFTXGs6LRLNj8bz9rcbq5GX-hbAE6TphZOv9vdqBkb2wIGD38tkXgziUOUgGplTn24NVaqZmyQ1WYsBRZ4ReIbRPr1zamy8nrQUm1X2exqrjV44tUXLdsK5hTfhUOJxQEhL98icoCsVx0Q/20090410158_thumb.jpg" width="244" border="0" /></a> </p>
<p>612，来的时候坐的这部车，从江浦到乌江 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mEszQesFqv259vysZSnETxbO88cKD9RMTcTmSucCCkGy9spHwiWndyobFJYaAbDvoSd-PgLp11Ur0lU6gQAtwplRwGzx68W7cMcvWmjzSHoSrqdF-fPs32HFuINnP9_35lLWPXALm5-qc-pto3fhGRg/20090410162[2].jpg" rel="WLPP"><img title="20090410162" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410162" src="https://ivsrkw.blu.livefilestore.com/y1m5RE31bkr_mp1FkRFKbM15jXq9pWJVo0IGkOUgOIIfwTAFLdsBqKEKe6sfwqHZVV2co7gp2YxilMfemN8x1I30Q9SLKiSj57UgpAuZBqFAH5nbWX4MRcDJM0u1iDoL4OKnx5tGyS02bhGkCmddQzKTg/20090410162_thumb.jpg" width="244" border="0" /></a> </p>
</p>
<p>车内图，全车大概50个位子，包括加座(就像校车的加座，要翻下来坐过道上) </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mZfyYaHvp2NbM1HQncUnRp8uTVY5f3IbJOkCKW_qpj6659fsQKQFdYRuhQqzaeSgdXM0SORDjxzDp_5Gbi9LFJWQhZ6EBBsTG5nGs23pffjvDbUC1C-fSdkfvl8ObyiHh1xT8ljQWYRJlSsDJDci5lQ/20090410(007)[2].jpg" rel="WLPP"><img title="20090410(007)" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410(007)" src="https://ivsrkw.blu.livefilestore.com/y1mUSsk4a12bRL6U_7Z2OADe-MSI1GczHrsVpT0Wrja1QdM07Adz9dCjLRnbmvVKmD0zBJGCf3mjsAzDpEwH-KYxsXTixjo3N1mpZIesFpxmbRDGgs7gNwjLQjJlmCjXfpuoPF-ECYiInRlNE8D7SMi4w/20090410(007)_thumb.jpg" width="244" border="0" /></a> </p>
<p>路过桥林 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mdu72THyVZO3UE4TGF2litvxORNWlK_5hGN6e9NLnWhgmBpco5pVdUepewB8pOWfeyaRhTFV8Dt6-8WH_ZV4rhHym9PJ54dWOEtyp-MzScMH1IQ-j2LjS_0xJ49A63KdEbMNbWCPPKTi3xt-O2mb5AQ/20090410(008)[2].jpg" rel="WLPP"><img title="20090410(008)" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410(008)" src="https://ivsrkw.blu.livefilestore.com/y1mFxNvNXbm_P7vi7lJu25H6JVbMyQWQG70eF8YqrXOru4ykgMx-_QlHziGcYrBA7hOR0JzD85azv2iKxHj8L6uMdzmHfXk2iq1rZZMwKS1CTcUG0NyRoJQT_IMipg_85uxs95S7n0x-j2nUCqRfUfjzw/20090410(008)_thumb.jpg" width="244" border="0" /></a> </p>
<p>这镇上还有电影院 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mKle_f1UQD4YyO-anYZfaXsGDPWGkXAqEIk9m2MgIQnCQ8Vzkgl2jtC9TWUIvrYAMiCdk_jZoB0GglXfcIm0w0b-6Ro2I3I_-nRRH9phQCWOAgSsM4q3R3DyvPL8ZdjGi2em5XkyCfz1-mZNRw44BZA/20090410(010)[2].jpg" rel="WLPP"><img title="20090410(010)" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410(010)" src="https://ivsrkw.blu.livefilestore.com/y1m4iAgHU2X206A5fY3oSGEMa4e_FxtwZOLd_BCYU_WHTd7WHgI3y7p8Ok6zOtIT9gEQjxoKcDiJQeYU-vqVtITK-wM944gRgxjg0ZarMP8um8DMbNXhOmOLOKDlAf8c90xqhOjweRJqka0g5bkkTtMUg/20090410(010)_thumb.jpg" width="244" border="0" /></a> </p>
<p>京沪高铁，H型柱子，城际是Y型的柱子 </p>
</p>
<p>  </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mHcErG-H2Nm9Wm1aTZbi6R3l2IQGVPcWWuOQp8Zm5tARM519qchZtbAsv9MSlDvTf5dM8cEi1lumILJtqK963HDPt6QRc2A-Q2JmlvGPFvoFl_c7YRWGx9Dnhefn-II19usqKGUW0Hs6Fb2gbKu4OXQ/20090410(011)[2].jpg" rel="WLPP"><img title="20090410(011)" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410(011)" src="https://ivsrkw.blu.livefilestore.com/y1myzK47nt2bvnngUQPFTlXhnApqUkeKHYkKGSbwHs7DMaBf0dBc23iXi67cuB_9Odm-ssdYWFBmlTMWuxVVFfA33X4P94R84_tvU94ii6vC2xZug5p5ZnkcqDtboJogkKYjhGtolIzcSFVqpgWn15WRg/20090410(011)_thumb.jpg" width="244" border="0" /></a> </p>
<p>从这里离开宁乌路，上三桥 </p>
<p>  </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1m9LMpd_9MWC6ZhBZMmLxmMLObIYGcUO18XD_WvVkTsjLdRvqYlXzrbGeccCierIZha7bWybAi62jXB1-r5VrCaRN-uJU473hJcsqy4mS39iuupcCIZcm8GbjqJMQksiJWOTdkC0Ilvmee8ovj9RPtcA/20090410(017)[2].jpg" rel="WLPP"><img title="20090410(017)" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410(017)" src="https://ivsrkw.blu.livefilestore.com/y1mcaQR-nfNLShfOnV0-pXx-h4jxh-K4gqOqC6gegbNCDFWQTygbzM3oJ6vlz1aPyuPc0De_5pa1D5QiZ2JWadaH31oipw7R6FE3TjJiNgZKcypgOKYeVzsGzALOu8v7AO4iVvO4VDP8Z-bHRPprv-Pbg/20090410(017)_thumb.jpg" width="244" border="0" /></a> </p>
<p>大奔用来运货了，车牌还挺牛B，苏A ST001，三桥收费站 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mXw481gY1oQaFBr7Ka1sDuVmUomYkgLrUlxmIbezacGnsfZROkqZlGrVQDxH80aatSiASW5YrJfCBQwtNdSdIFqvcwr7408soqnk_MzdJYUvkJsCz3A6hcQDtiqe-xXT51yKdCKGEWvkbEkCto618-w/20090410163[2].jpg" rel="WLPP"><img title="20090410163" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410163" src="https://ivsrkw.blu.livefilestore.com/y1mPfPsF1_GVWUTCbnERV5imaoqD1lCLDqdMkPSJp9vDnA2yYEP0JAzKze8FnkR2FD7H60pyVKOKCA4R9Go4mIacvmThCbX8jUVgK04rKCo_OFwfEy1kzIFQJr5932yoRouMV5UcSPtLQ9u0T-Cc2O58w/20090410163_thumb.jpg" width="244" border="0" /></a> </p>
<p>终点，雨花区议会山 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1m1yONjWVuOWyM0TPXUqPFoUrhQWc11tKFoemlg6dvPfTI5_TyVflJJtkZvlXz52LCvsRDTZ23vYy2nllY-SUSAwhx9pU3RVRWvZjaMheXmpp8_-6uibnvSdYE_HVUm2zFPQ_q_DOYTIu0ZkkL6R9YjA/20090410164[2].jpg" rel="WLPP"><img title="20090410164" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410164" src="https://ivsrkw.blu.livefilestore.com/y1m9O_W-6JBaHbq7SQPGrcWZ_cH057F_0juyzUF0bbv_ymtzdYuQJyxIXRKOCzB05oizESJHXEkSSuAszWPFxxMtd3B1xUU0axgWqhyQzFpuRix6UHrT58cQuWiJJzqbY44PFAAF3wOb7Q6wtdQhzp8TA/20090410164_thumb.jpg" width="244" border="0" /></a> </p>
</p>
</p>
<p>雨花台纪念馆 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1mLDZnJMJbn9hS143W7jwB3XouWYgZbbd-Ink8mlfhLuCB6FErGmQWHwW7FJ96aFvpW5V2VOZT4xjy5c8gaEZmfZVt5Xv0qfMZsESl0WYdBYuA-cNEFMjb3SmnQRxI7DHySDNmE5H4jjQkhFL65ZsSbQ/20090410166[2].jpg" rel="WLPP"><img title="20090410166" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="244" alt="20090410166" src="https://ivsrkw.blu.livefilestore.com/y1mHL7sE_AnbukcrylPilKZzAq8zfV8Q2_YMxSq2MFg0TDDA1PkbcEUJbMghRwDFBuOn8P9QjEL2_gpaj7IRQMddRQiDG_Hzob1zwGBTmCYTqO1uYYcBbl2_hXz8huP3dpj6aMdVMUkhzFT-dZGFKUV0g/20090410166_thumb.jpg" width="184" border="0" /></a> </p>
<p>雨花台纪念碑 </p>
<p><a href="https://ivsrkw.blu.livefilestore.com/y1meMWTioatRTubB4V57jPktKALH_hS_iYkM4bnYrtNzRx-ZTrfNPrapHoXg3ar9C8PrqK2ysqkySk4YdKcFtl0faVwWx_vjaGXYcSCRw08-IEb5kXaKGXaIpZU4OQ-ZhmLm_kz63wIIOF5nrMid2ruZw/20090410167[2].jpg" rel="WLPP"><img title="20090410167" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px" height="184" alt="20090410167" src="https://ivsrkw.blu.livefilestore.com/y1mTnkm1AyLSGGTut3XgWh5onB7h3wS3gxtD3OsFsCqUHvwE_BR0IHPuY5BUMyDeQL1Y44xlbqG5f0cSiXB8GRhcUlmPfiH31CPU4lGtyXlZTsKcz_XUVH6LvvafTU0KnLmQbUDaRrT0y0094ib3c89KA/20090410167_thumb.jpg" width="244" border="0" /></a> </p>
<p>雨花台群雕 </p>
<p>  </p>
<p>一早鼓扬到开发区，3元 </p>
<p>吃过午饭后 </p>
<p>浦葛到浦六路，1元 </p>
<p>汉江到江浦，1.5元  </p>
<p>612到乌江，3元 </p>
<p>雨乌到雨花台南门，5元  </p>
<p>26到丹凤街，1.2元 </p>
<p>全程约110公里，14.7元  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/10/bus-travel-of-wuyu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>家门口似乎要通BRT了</title>
		<link>http://www.onlymarshall.com/2009/04/02/brt-at-home/</link>
		<comments>http://www.onlymarshall.com/2009/04/02/brt-at-home/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 12:58:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[厦门]]></category>
		<category><![CDATA[BRT]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=98</guid>
		<description><![CDATA[    虽然家就住在国道旁，可每次去岛内也算麻烦，因为家门口不设站，基本靠和司机打招呼或者招手停车。今天看到一则BRT新闻“BRT成功大道专线站点设置确定 岛内外共设19站”： 东南快报讯（记者 林晓琪）BRT成功大道专线从厦港出发，经过成功大道、厦门大桥，延伸至集美灌口，全长30.6公里，岛内和岛外各设9个和10个站，共19个站。 　　昨日，记者从有关部门获悉，BRT成功大道线岛内9个站点分别为：厦港枢纽站、文曾路站、谊爱路站、吕岭路站、仙岳路站、金湖路站、安兜站、机场大道站、联检站；岛外10个站点为：航海学院站、园博苑站、杏林村站、厦门十中站、内茂立交站、杏北新城站、中亚城站、厦工机械站、灌口镇政府站、灌口枢纽站。     看来附近房价有上升的空间。。。]]></description>
			<content:encoded><![CDATA[<p>    虽然家就住在国道旁，可每次去岛内也算麻烦，因为家门口不设站，基本靠和司机打招呼或者招手停车。今天看到一则BRT新闻“BRT成功大道专线站点设置确定 岛内外共设19站”：<br />
<blockquote>
<p>东南快报讯（记者 林晓琪）BRT成功大道专线从厦港出发，经过成功大道、厦门大桥，延伸至集美灌口，全长30.6公里，岛内和岛外各设9个和10个站，共19个站。  </p>
<p>　　昨日，记者从有关部门获悉，BRT成功大道线岛内9个站点分别为：厦港枢纽站、文曾路站、谊爱路站、吕岭路站、仙岳路站、金湖路站、安兜站、机场大道站、联检站；岛外10个站点为：航海学院站、园博苑站、杏林村站、<strong><u>厦门十中站</u></strong>、内茂立交站、杏北新城站、中亚城站、厦工机械站、灌口镇政府站、灌口枢纽站。</p>
</blockquote>
<p>    看来附近房价有上升的空间。。。  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/04/02/brt-at-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>投了GE的Summer</title>
		<link>http://www.onlymarshall.com/2009/03/28/ge-summer-intern/</link>
		<comments>http://www.onlymarshall.com/2009/03/28/ge-summer-intern/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:40:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[求职]]></category>
		<category><![CDATA[实习]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=99</guid>
		<description><![CDATA[    学校用Bras很慢，直接上到远程服务器上网申。居然没有OQ，改了改大摩的cover letter，半个小时搞定。GE的网申系统的牛B之处在于，可以从你提交的CV里取出你的Work Experience（虽然他把我的Education Background给当成了Work Exp了）。其他问题也不多。     上次的微软估计没戏了，过了一个半月了；大摩上次说还没有计划开始。     P.S. 博客最近都是“阳春白雪”的stuff，搞点“下里巴人”的。嗯，突然想起了高中的生物老头郑家骥郑老师，课上突然冒出这一句把大伙儿雷得不行。]]></description>
			<content:encoded><![CDATA[<p>    学校用Bras很慢，直接上到远程服务器上网申。居然没有OQ，改了改大摩的cover letter，半个小时搞定。GE的网申系统的牛B之处在于，可以从你提交的CV里取出你的Work Experience（虽然他把我的Education Background给当成了Work Exp了）。其他问题也不多。 </p>
<p>    上次的微软估计没戏了，过了一个半月了；大摩上次说还没有计划开始。 </p>
<p>    P.S. 博客最近都是“阳春白雪”的stuff，搞点“下里巴人”的。嗯，突然想起了高中的生物老头郑家骥郑老师，课上突然冒出这一句把大伙儿雷得不行。  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/03/28/ge-summer-intern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium, Eclipse, Junit折腾记</title>
		<link>http://www.onlymarshall.com/2009/03/24/selenium-eclipse-junit-zheteng/</link>
		<comments>http://www.onlymarshall.com/2009/03/24/selenium-eclipse-junit-zheteng/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 22:40:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Junit]]></category>
		<category><![CDATA[Selenium]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=100</guid>
		<description><![CDATA[    很早以前就想搞自动化Web功能测试，知道了Selenium，看了些文档，但当真正到开发项目的关头，测试总是草草而过，跑完一遍手工的拉倒，回归测试更是无从谈起。前几天终于痛下决心写起使用Selenium的Web自动测试代码。     先扯扯Selenium（字面上是“硒”的意思）。当初出来的时候结结实实把我震撼了一回。原来搞Web自动化测试基本上走的是GUI的那条老路（当然可能也是我当年孤陋寡闻），而这种GUI自动测试工具往往是功能强大的私有软件（比如WinRunner），另外对Web这种多变的测试元素用起来也是很别扭。Selenium另辟蹊径，从JS入手调用浏览器，同时允许通过跨平台的代码调用。从API就可以看出来这个东西的直观易用： 1: selenium.windowMaximize(); 2: selenium.click(&#34;link=信息系统&#34;); 3: selenium.waitForPageToLoad(&#34;30000&#34;); 4: selenium.click(&#34;//a[contains(@href, 'projects.do?method:view&#38;project.id=1')]&#34;); 5: selenium.waitForPageToLoad(&#34;30000&#34;);     另外，Selenium还提供了一个Firefox插件-Selenium IDE，用于录制用户的操作（虽然部分动作无法录制）。录制的动作可以直接导出成HTML/Java/Ruby/C#/PHP等格式的代码，配合提供的SeleneseTestCase，当作JUnit的TestCase使用。     不过这折腾就折腾在这TestCase上。Selenium的开发提供的SeleneseTestCase是Junit3风格的，放在JUnit4底下跑，JUnit4的Annotation功能就用不起来了（这点经我浏览代码查证）。Selenium要启动浏览器，如果用不上@BeforeClass的话，每次启动都初始化一下Selenium，开个IE或者Firefox，这个测试的效率可吃不消（也有比较麻烦的Workaround，但总觉得不是很好）。而甩开SeleneseTestCase的话，又舍不得那个在测试没有通过的时候自动截屏的功能。于是开始Google，兼看Junit4的源代码。     最后终于在这里找到了方案。但问题又来了：Eclipse自带的Junit 4.3还没有这个方案需要的类（JUnit4ClassRunner ）！自己手动把原来的Library移除换上Junit 4.5，又发现这个类才用了一个版本就Deprecated了。于是换上了新类(BlockJUnit4ClassRunner)。     接下去的工作就是用上Decorator模式，把原来SeleneseTestCase的代码给移到新的BaseTestCase上。期间还遇上了一些Override的问题。上代码： SeleniumTestListner类，用于拦截异常的抛出 1: public class SeleniumTestListener extends RunListener { 2: private SeleneseTestCaseAdapter stca; 3: @Override 4: public void testFailure(Failure failure) throws Exception{ 5: Selenium selenium = stca.getSeleniumTestBase().getSelenium(); 6: if(!stca.isCaptureScreenShotOnFailure()){ [...]]]></description>
			<content:encoded><![CDATA[<p>    很早以前就想搞自动化Web功能测试，知道了Selenium，看了些文档，但当真正到开发项目的关头，测试总是草草而过，跑完一遍手工的拉倒，回归测试更是无从谈起。前几天终于痛下决心写起使用Selenium的Web自动测试代码。 </p>
<p>    先扯扯Selenium（字面上是“硒”的意思）。当初出来的时候结结实实把我震撼了一回。原来搞Web自动化测试基本上走的是GUI的那条老路（当然可能也是我当年孤陋寡闻），而这种GUI自动测试工具往往是功能强大的私有软件（比如WinRunner），另外对Web这种多变的测试元素用起来也是很别扭。Selenium另辟蹊径，从JS入手调用浏览器，同时允许通过跨平台的代码调用。从API就可以看出来这个东西的直观易用：
<div>
<pre><span>   1:  </span>selenium.windowMaximize();</pre>
<pre><span>   2:  </span>selenium.click(<span>&quot;link=信息系统&quot;</span>);</pre>
<pre><span>   3:  </span>selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
<pre><span>   4:  </span>selenium.click(<span>&quot;//a[contains(@href, 'projects.do?method:view&amp;project.id=1')]&quot;</span>);</pre>
<pre><span>   5:  </span>selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
</div>
<p>    另外，Selenium还提供了一个Firefox插件-Selenium IDE，用于录制用户的操作（虽然部分动作无法录制）。录制的动作可以直接导出成HTML/Java/Ruby/C#/PHP等格式的代码，配合提供的SeleneseTestCase，当作JUnit的TestCase使用。
</p>
<p>    不过这折腾就折腾在这TestCase上。Selenium的开发提供的SeleneseTestCase是Junit3风格的，放在JUnit4底下跑，JUnit4的Annotation功能就用不起来了（这点经我浏览代码查证）。Selenium要启动浏览器，如果用不上@BeforeClass的话，每次启动都初始化一下Selenium，开个IE或者Firefox，这个测试的效率可吃不消（也有比较麻烦的<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-junit4/section4.html">Workaround</a>，但总觉得不是很好）。而甩开SeleneseTestCase的话，又舍不得那个在测试没有通过的时候自动截屏的功能。于是开始Google，兼看Junit4的源代码。
</p>
<p>    最后终于在<a href="http://rockhoppertech.com/blogs/archives/45">这里</a>找到了方案。但问题又来了：Eclipse自带的Junit 4.3还没有这个方案需要的类（JUnit4ClassRunner ）！自己手动把原来的Library移除换上Junit 4.5，又发现这个类才用了一个版本就Deprecated了。于是换上了新类(BlockJUnit4ClassRunner)。
</p>
<p>    接下去的工作就是用上Decorator模式，把原来SeleneseTestCase的代码给移到新的BaseTestCase上。期间还遇上了一些Override的问题。上代码：
</p>
<p>SeleniumTestListner类，用于拦截异常的抛出</p>
<div>
<pre><span>   1:  </span><span>public</span> <span>class</span> SeleniumTestListener extends RunListener {</pre>
<pre><span>   2:  </span> <span>private</span> SeleneseTestCaseAdapter stca;</pre>
<pre><span>   3:  </span>    @Override</pre>
<pre><span>   4:  </span> <span>public</span> <span>void</span> testFailure(Failure failure) throws Exception{</pre>
<pre><span>   5:  </span>        Selenium selenium = stca.getSeleniumTestBase().getSelenium();</pre>
<pre><span>   6:  </span> <span>if</span>(!stca.isCaptureScreenShotOnFailure()){</pre>
<pre><span>   7:  </span> <span>return</span>;</pre>
<pre><span>   8:  </span>        }</pre>
<pre><span>   9:  </span> <span>if</span> (selenium != <span>null</span>) {</pre>
<pre><span>  10:  </span>            String filename = failure.getDescription().getDisplayName() + <span>&quot;.png&quot;</span>;</pre>
<pre><span>  11:  </span> <span>try</span> {</pre>
<pre><span>  12:  </span>                selenium.captureScreenshot(filename);</pre>
<pre><span>  13:  </span>                System.err.println(<span>&quot;Saved screenshot &quot;</span> + filename);</pre>
<pre><span>  14:  </span>            } <span>catch</span> (Exception e) {</pre>
<pre><span>  15:  </span>                System.err.println(<span>&quot;Couldn't save screenshot &quot;</span> + filename + <span>&quot;: &quot;</span> + e.getMessage());</pre>
<pre><span>  16:  </span>                e.printStackTrace();</pre>
<pre><span>  17:  </span>            }</pre>
<pre><span>  18:  </span>        }</pre>
<pre><span>  19:  </span> </pre>
<pre><span>  20:  </span>    }</pre>
<pre><span>  21:  </span> </pre>
<pre><span>  22:  </span> <span>public</span> <span>void</span> setSeleneseTestCaseAdapter(SeleneseTestCaseAdapter stca){</pre>
<pre><span>  23:  </span> <span>this</span>.stca = stca;</pre>
<pre><span>  24:  </span>    }</pre>
<pre><span>  25:  </span>}</pre>
<pre> </pre>
<pre>SeleniumTestRunner类：加入SeleniumTestListener监听器，得到Test实例并注入监听器</pre>
</div>
<p><div>
<pre><span>   1:  </span><span>public</span> <span>class</span> SeleniumTestRunner extends BlockJUnit4ClassRunner  {</pre>
<pre><span>   2:  </span> <span>private</span> SeleniumTestListener stl;</pre>
<pre><span>   3:  </span> <span>public</span> SeleniumTestRunner(Class&lt;?&gt; c) throws Exception{</pre>
<pre><span>   4:  </span>        super(c);</pre>
<pre><span>   5:  </span>        stl = <span>new</span> SeleniumTestListener();</pre>
<pre><span>   6:  </span>    }</pre>
<pre><span>   7:  </span> </pre>
<pre><span>   8:  </span>    @Override</pre>
<pre><span>   9:  </span> <span>public</span> <span>void</span> run(RunNotifier rn){</pre>
<pre><span>  10:  </span>        rn.addListener(stl);</pre>
<pre><span>  11:  </span>        super.run(rn);</pre>
<pre><span>  12:  </span>    }</pre>
<pre><span>  13:  </span> </pre>
<pre><span>  14:  </span> <span>/**</span></pre>
<pre><span>  15:  </span><span>     * Copy from BlockJUnit4ClassRunner.methodBlock(FrameworkMethod method)</span></pre>
<pre><span>  16:  </span><span>     * to get tested instance</span></pre>
<pre><span>  17:  </span><span>     * @author Marshall</span></pre>
<pre><span>  18:  </span><span>     */</span></pre>
<pre><span>  19:  </span>    @Override</pre>
<pre><span>  20:  </span> <span>protected</span> Statement methodBlock(FrameworkMethod method) {</pre>
<pre><span>  21:  </span>        Object test;</pre>
<pre><span>  22:  </span> <span>try</span> {</pre>
<pre><span>  23:  </span>            test= <span>new</span> ReflectiveCallable() {</pre>
<pre><span>  24:  </span>                @Override</pre>
<pre><span>  25:  </span> <span>protected</span> Object runReflectiveCall() throws Throwable {</pre>
<pre><span>  26:  </span> <span>return</span> createTest();</pre>
<pre><span>  27:  </span>                }</pre>
<pre><span>  28:  </span>            }.run();</pre>
<pre><span>  29:  </span>        } <span>catch</span> (Throwable e) {</pre>
<pre><span>  30:  </span> <span>return</span> <span>new</span> Fail(e);</pre>
<pre><span>  31:  </span>        }</pre>
<pre><span>  32:  </span> </pre>
<pre><span>  33:  </span> <span>//Marshall added</span></pre>
<pre><span>  34:  </span>        stl.setSeleneseTestCaseAdapter((SeleneseTestCaseAdapter)test);</pre>
<pre><span>  35:  </span> </pre>
<pre><span>  36:  </span>        Statement statement= methodInvoker(method, test);</pre>
<pre><span>  37:  </span>        statement= possiblyExpectingExceptions(method, test, statement);</pre>
<pre><span>  38:  </span>        statement= withPotentialTimeout(method, test, statement);</pre>
<pre><span>  39:  </span>        statement= withBefores(method, test, statement);</pre>
<pre><span>  40:  </span>        statement= withAfters(method, test, statement);</pre>
<pre><span>  41:  </span> <span>return</span> statement;</pre>
<pre><span>  42:  </span>    }</pre>
<pre><span>  43:  </span>}</pre>
</div>
<p>SeleniumTestCaseAdapter, 打上了@RunWith。所有的TestCase都继承这个Adapter。但这个Adapter并不继承JUnit的TestCase类</p>
<div>
<pre><span>   1:  </span><span>/**</span></pre>
<pre><span>   2:  </span><span> * Decorator pattern which makes this class have the same capability as the</span></pre>
<pre><span>   3:  </span><span> * SeleneseTestCase class had provided. Copy a lot of source code from the </span></pre>
<pre><span>   4:  </span><span> * decorated class.</span></pre>
<pre><span>   5:  </span><span> * @author Marshall</span></pre>
<pre><span>   6:  </span><span> */</span></pre>
<pre><span>   7:  </span>@RunWith(SeleniumTestRunner.<span>class</span>)</pre>
<pre><span>   8:  </span><span>public</span> <span>class</span> SeleneseTestCaseAdapter {</pre>
<pre><span>   9:  </span> <span>private</span> <span>static</span> SeleniumTestBase stb = <span>new</span> SeleniumTestBase();</pre>
<pre><span>  10:  </span> <span>private</span> boolean isCaptureScreenShotOnFailure = <span>false</span>;</pre>
<pre><span>  11:  </span> </pre>
<pre><span>  12:  </span> <span>/** Use this object to run all of your selenium tests */</span></pre>
<pre><span>  13:  </span> <span>protected</span> <span>static</span> Selenium selenium;</pre>
<pre><span>  14:  </span> </pre>
<pre><span>  15:  </span>    @BeforeClass</pre>
<pre><span>  16:  </span> <span>public</span> <span>static</span> <span>void</span> setUpSelenium() throws Exception{</pre>
<pre><span>  17:  </span>        stb.setUp(<span>&quot;http://127.0.0.1:8080/&quot;</span>, <span>&quot;*iexplore&quot;</span>);</pre>
<pre><span>  18:  </span>        selenium = stb.getSelenium();</pre>
<pre><span>  19:  </span>    }</pre>
<pre><span>  20:  </span> </pre>
<pre><span>  21:  </span>    @AfterClass</pre>
<pre><span>  22:  </span> <span>public</span> <span>static</span> <span>void</span> tearDownSelenium() throws Exception{</pre>
<pre><span>  23:  </span>        stb.tearDown();</pre>
<pre><span>  24:  </span>    }</pre>
<pre><span>  25:  </span> </pre>
<pre><span>  26:  </span>   ......</pre>
<pre><span>  27:  </span>}</pre>
</div>
<p>样例测试类：</p>
<div>
<pre><span>   1:  </span><span>public</span> <span>class</span> TestRiskRepo extends SeleneseTestCaseAdapter {</pre>
<pre><span>   2:  </span> <span>public</span> TestRiskRepo(){</pre>
<pre><span>   3:  </span>        setCaptureScreenShotOnFailure(<span>true</span>);</pre>
<pre><span>   4:  </span>    }</pre>
<pre><span>   5:  </span>    @Before</pre>
<pre><span>   6:  </span> <span>public</span> <span>void</span> set() throws Exception {</pre>
<pre><span>   7:  </span>        selenium.open(<span>&quot;/apis/login.do&quot;</span>);</pre>
<pre><span>   8:  </span>        selenium.type(<span>&quot;j_username&quot;</span>, <span>&quot;marshall&quot;</span>);</pre>
<pre><span>   9:  </span>        selenium.type(<span>&quot;j_password&quot;</span>, <span>&quot;xxxx&quot;</span>);</pre>
<pre><span>  10:  </span>        selenium.click(<span>&quot;//input[@value='登录']&quot;</span>);</pre>
<pre><span>  11:  </span>        selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
<pre><span>  12:  </span>    }</pre>
<pre><span>  13:  </span> </pre>
<pre><span>  14:  </span>    @Test</pre>
<pre><span>  15:  </span> <span>public</span> <span>void</span> repo() throws Exception {</pre>
<pre><span>  16:  </span>        selenium.windowMaximize();</pre>
<pre><span>  17:  </span>        selenium.click(<span>&quot;link=信息系统&quot;</span>);</pre>
<pre><span>  18:  </span>        selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
<pre><span>  19:  </span>        selenium.click(<span>&quot;//a[contains(@href, 'projects.do?method:view&amp;project.id=1')]&quot;</span>);</pre>
<pre><span>  20:  </span>        selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
<pre><span>  21:  </span>        verifyTrue(selenium.isTextPresent(<span>&quot;xxx&quot;</span>));</pre>
<pre><span>  22:  </span>        selenium.click(<span>&quot;link=组织风险库&quot;</span>);</pre>
<pre><span>  23:  </span>        selenium.waitForPageToLoad(<span>&quot;30000&quot;</span>);</pre>
<pre><span>  24:  </span>        verifyEquals(<span>&quot;组织风险库 | APIS&quot;</span>, selenium.getTitle());</pre>
<pre><span>  25:  </span>        verifyTrue(selenium.isTextPresent(<span>&quot;可能性&quot;</span>));</pre>
<pre><span>  26:  </span>        verifyFalse(selenium.isVisible(<span>&quot;//button[contains(text(), '搜索')]&quot;</span>));</pre>
<pre><span>  27:  </span>        selenium.click(<span>&quot;css=.x-tool&quot;</span>);</pre>
<pre><span>  28:  </span>        verifyTrue(selenium.isVisible(<span>&quot;//button[contains(text(), '搜索')]&quot;</span>));</pre>
<pre><span>  29:  </span>    }</pre>
<pre><span>  30:  </span> </pre>
<pre><span>  31:  </span>}</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/03/24/selenium-eclipse-junit-zheteng/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多数据库SaaS尝试</title>
		<link>http://www.onlymarshall.com/2009/03/18/saas-on-multi-database/</link>
		<comments>http://www.onlymarshall.com/2009/03/18/saas-on-multi-database/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 21:03:00 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Space导入]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[SaaS]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=101</guid>
		<description><![CDATA[    手上的APIS要上SaaS，其实就是ASP(Application Service Provider)。要求一份程序，一或多份数据库跑服务。设计的时候参考了阿里软件人写的《互联网时代的软件革命-SaaS架构设计》。这本书从广度上覆盖了做SaaS的很多内容，但深度却显不足，很多地方只是浅尝辄止，一笔带过。     虽然如此，作为算是这个领域的第一本入门书，还是有一些参考价值的。比如，定义了SaaS四个成熟度模型：定制开发、可配置、高性能的多租户架构、可伸缩的多租户架构；APIS只有一个运行实例，但租户数量不会很多，短期内不会超过50，所以算入第3级，高性能的多租户架构。     在数据库设计上，这本书对SaaS应用，提供了四个可选方案。独立数据库、共享数据库+隔离数据架构(Schema)、共享数据库+共享数据架构(Schema)。由于采用了MySQL，没有schema的概念，所以去掉了中间的选项。虽然技术人员有上高精尖技术的冲动，不过鉴于我们的用户数不会很多，用户和用户之间也完全隔离，采用了第一种方案。而这种方案，对开发其他功能完全没有任何影响，算是非常unobstructive（中文不好翻译，一般叫“无侵入”）的方案。只要在入口的Filter留个ThreadLocal标志，最底层的SessionFactory做个拦截，功能上算是搞定了。大概就是事先准备好几个SessionFactory，然后哪个用户上来了就给谁相应的SessionFactory。     但革命的道路是曲折的，过程是漫长的。虽然前期通过阅读Spring代码做过一些技术调查，但Spring+Hibernate这对组合的复杂性还是折腾我老半天。Spring对Hibernate支持很好，几乎是全方位的，这也造成了我要到处扩展用到的Spring支持类。本来只打算对LocalSessionFactoryBean动手，却忘了spring大部分的Bean都是singleton，但又舍不得换成prototype后的性能下降，于是抡起袖子又扩展了BasicDataSource(DBCP)、HibernateTemplate、HibernateDaoSupport、HibernateTransactionManager。好不容易有点眉目，开始从配置的租户数据库载入数据，却屡屡抛session提前关闭的异常。而且诡异的是，这个异常出现的概率约为75%，而一旦我用Debug跟进去后，反而基本不抛异常了。这让我异常胸闷，要知道这种问题十有八九是并发的原因，这问题找起来很头大，往往陷入Spring+Hibernate的汪洋大海。     接下来几天感冒发烧，好好休息了一阵子，思路却打开了。从网上重新搜出一堆资料。这个是Stack Overflow的一个问答，几个回答都比较靠谱；这个是通过HotSwappableTargetSource提供的DataSource动态替换；这个是Spring开发人员利用AbstractRoutingDataSource提供对DataSource的路由。权衡再三，决定使用AbstractRoutingDataSource。只扩展了两个类就成功实现功能，不抛异常。全局一个SessionFactory，后面几个DataSource轮流上。     但问题又来了。二级缓存这个东西和SessionFactory绑定，多个DataSource要求要多个Cache，因为各个租户之间的数据主键很可能重复。我试图搜寻通过改造SessionFactory的CacheProvider来搞定，但未果，SessionFactory的Cache埋得有点深。    最后，参考了这篇和这篇，用一个简单的Decorator，退回了多SessionFactory，虽然代码不是很好看，但再无异常。今天收工。]]></description>
			<content:encoded><![CDATA[<p>    手上的APIS要上SaaS，其实就是ASP(Application Service Provider)。要求一份程序，一或多份数据库跑服务。设计的时候参考了阿里软件人写的《<a href="http://www.douban.com/subject/3290016/">互联网时代的软件革命-SaaS架构设计</a>》。这本书从广度上覆盖了做SaaS的很多内容，但深度却显不足，很多地方只是浅尝辄止，一笔带过。 </p>
<p>    虽然如此，作为算是这个领域的第一本入门书，还是有一些参考价值的。比如，定义了SaaS四个成熟度模型：定制开发、可配置、高性能的多租户架构、可伸缩的多租户架构；APIS只有一个运行实例，但租户数量不会很多，短期内不会超过50，所以算入第3级，高性能的多租户架构。 </p>
<p>    在数据库设计上，这本书对SaaS应用，提供了四个可选方案。独立数据库、共享数据库+隔离数据架构(Schema)、共享数据库+共享数据架构(Schema)。由于采用了MySQL，<a href="http://forums.mysql.com/read.php?39,137564,137629#msg-137629">没有schema的概念</a>，所以去掉了中间的选项。虽然技术人员有上高精尖技术的冲动，不过鉴于我们的用户数不会很多，用户和用户之间也完全隔离，采用了第一种方案。而这种方案，对开发其他功能完全没有任何影响，算是非常unobstructive（中文不好翻译，一般叫“无侵入”）的方案。只要在入口的Filter留个ThreadLocal标志，最底层的SessionFactory做个拦截，功能上算是搞定了。大概就是事先准备好几个SessionFactory，然后哪个用户上来了就给谁相应的SessionFactory。 </p>
<p>    但革命的道路是曲折的，过程是漫长的。虽然前期通过阅读Spring代码做过一些技术调查，但Spring+Hibernate这对组合的复杂性还是折腾我老半天。Spring对Hibernate支持很好，几乎是全方位的，这也造成了我要到处扩展用到的Spring支持类。本来只打算对LocalSessionFactoryBean动手，却忘了spring大部分的Bean都是singleton，但又舍不得换成prototype后的性能下降，于是抡起袖子又扩展了BasicDataSource(DBCP)、HibernateTemplate、HibernateDaoSupport、HibernateTransactionManager。好不容易有点眉目，开始从配置的租户数据库载入数据，却屡屡抛session提前关闭的异常。而且诡异的是，这个异常出现的概率约为75%，而一旦我用Debug跟进去后，反而基本不抛异常了。这让我异常胸闷，要知道这种问题十有八九是并发的原因，这问题找起来很头大，往往陷入Spring+Hibernate的汪洋大海。 </p>
<p>    接下来几天感冒发烧，好好休息了一阵子，思路却打开了。从网上重新搜出一堆资料。<a href="http://stackoverflow.com/questions/120007/multiple-session-factories-under-spring-hibernate">这个</a>是Stack Overflow的一个问答，几个回答都比较靠谱；<a href="http://www.jroller.com/mert/entry/multiple_db_with_single_sessionfactory">这个</a>是通过HotSwappableTargetSource提供的DataSource动态替换；<a href="http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/">这个</a>是Spring开发人员利用AbstractRoutingDataSource提供对DataSource的路由。权衡再三，决定使用AbstractRoutingDataSource。只扩展了两个类就成功实现功能，不抛异常。全局一个SessionFactory，后面几个DataSource轮流上。 </p>
<p>    但问题又来了。二级缓存这个东西和SessionFactory绑定，多个DataSource要求要多个Cache，因为各个租户之间的数据主键很可能重复。我试图搜寻通过改造SessionFactory的CacheProvider来搞定，但未果，SessionFactory的Cache埋得有点深。 </p>
<p>   最后，参考了<a href="http://fangang.javaeye.com/blog/72486">这篇</a>和<a href="http://fangang.javaeye.com/blog/91667">这篇</a>，用一个简单的Decorator，退回了多SessionFactory，虽然代码不是很好看，但再无异常。今天收工。  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/03/18/saas-on-multi-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<br />
<b>Warning</b>:  fsockopen() has been disabled for security reasons in <b>/home/onlymars/public_html/wp/wp-includes/class-snoopy.php</b> on line <b>1148</b><br />

