<?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/technical/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>每周技术分享 -1 screen</title>
		<link>http://www.onlymarshall.com/2011/04/09/weekly-technical-screen/</link>
		<comments>http://www.onlymarshall.com/2011/04/09/weekly-technical-screen/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 15:56:46 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[screen]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=746</guid>
		<description><![CDATA[总觉得应该找到一个方式把一些技术方面的东西记录下来，想不到什么特别的方式，就暂且放blog里把。 这是开篇，虽然加了每周这个限定，但也不一定每周都能更新，算是一个期望吧。内容可长可短。 上班一年来，我现在每天离不开，以前却不知道的工具非screen莫属了。对于不在本地编写编译代码的人而言，肯定是会需要很多终端窗口的，一个写代码，一个查代码，一个编译代码是跑不掉的。另外，代码还有很多branch，还有需要dump调试窗口等等，一个占用一个windows窗口，不仅太占空间，就是一个个打开也很麻烦。一开始打算用putty manager，但用了用觉得不太顺手。后来同事推荐了大名鼎鼎的screen实现上面的功能。 screen也算是一个老牌程序了，大部分linux服务器上应该默认都有的。screen等于在服务器端管理了终端窗口，这带来另外一个好处是即使putty断线了（比如关机、断网），服务器的session也不会终端，只需要重新attach上去就可以了，省去了很多麻烦。而各个终端也支持自己命名，切换也有各种快速切换方式。另外外观也可以通过自定义.screenrc文件来配置。本来一个服务器我最多开3-4个终端，现在上了screen，我经常在服务器上上15+的终端，而遇到需要重启关机的时候，直接把putty关闭，看都不看，因为我知道服务器端保留了所有的终端信息。除非碰到服务器重启等特殊情况，这些终端我基本都一直放着，这样一到公司就可以很快进入工作。 另外screen还提供了服务器终端共享的功能，具体使用可以看screen的manual。这应该算是终端界的桌面共享吧？这个功能我倒是没有用过，有次我mentor在给美国的同事解释代码的时候，一边就着电话，一边就着screen共享session，挺实用的。]]></description>
			<content:encoded><![CDATA[<p>总觉得应该找到一个方式把一些技术方面的东西记录下来，想不到什么特别的方式，就暂且放blog里把。</p>
<p>这是开篇，虽然加了每周这个限定，但也不一定每周都能更新，算是一个期望吧。内容可长可短。</p>
<p>上班一年来，我现在每天离不开，以前却不知道的工具非screen莫属了。对于不在本地编写编译代码的人而言，肯定是会需要很多终端窗口的，一个写代码，一个查代码，一个编译代码是跑不掉的。另外，代码还有很多branch，还有需要dump调试窗口等等，一个占用一个windows窗口，不仅太占空间，就是一个个打开也很麻烦。一开始打算用putty manager，但用了用觉得不太顺手。后来同事推荐了大名鼎鼎的screen实现上面的功能。</p>
<p>screen也算是一个老牌程序了，大部分linux服务器上应该默认都有的。screen等于在服务器端管理了终端窗口，这带来另外一个好处是即使putty断线了（比如关机、断网），服务器的session也不会终端，只需要重新attach上去就可以了，省去了很多麻烦。而各个终端也支持自己命名，切换也有各种快速切换方式。另外外观也可以通过自定义.screenrc文件来配置。本来一个服务器我最多开3-4个终端，现在上了screen，我经常在服务器上上15+的终端，而遇到需要重启关机的时候，直接把putty关闭，看都不看，因为我知道服务器端保留了所有的终端信息。除非碰到服务器重启等特殊情况，这些终端我基本都一直放着，这样一到公司就可以很快进入工作。</p>
<p>另外screen还提供了服务器终端共享的功能，具体使用可以看screen的manual。这应该算是终端界的桌面共享吧？这个功能我倒是没有用过，有次我mentor在给美国的同事解释代码的时候，一边就着电话，一边就着screen共享session，挺实用的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2011/04/09/weekly-technical-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过weather.com.cn获取全国天气数据</title>
		<link>http://www.onlymarshall.com/2010/01/19/access-weather-data-by-weathercomcn/</link>
		<comments>http://www.onlymarshall.com/2010/01/19/access-weather-data-by-weathercomcn/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 08:43:45 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=712</guid>
		<description><![CDATA[获得天气数据： 访问http://m.weather.com.cn/data/101020100.html，其中1010200100是城市的id（上海），返回JSON格式的天气数据，示例如下： {&#8220;weatherinfo&#8221;:{&#8220;city&#8221;:&#8221;上海&#8221;,&#8221;city_en&#8221;:&#8221;shanghai&#8221;,&#8221;date_y&#8221;:&#8221;2009年12月24日&#8221;,&#8221;date&#8221;:&#8221;十一月初九&#8221;,&#8221;week&#8221;:&#8221;星期四&#8221;, &#8220;fchh&#8221;:&#8221;08&#8243;,&#8221;cityid&#8221;:&#8221;101020100&#8243;,&#8221;temp1&#8243;:&#8221;14℃~6℃&#8221;,&#8221;temp2&#8243;:&#8221;9℃~3℃&#8221;,&#8221;temp3&#8243;:&#8221;6℃~2℃&#8221;, &#8220;temp4&#8243;:&#8221;5℃~1℃&#8221;,&#8221;temp5&#8243;:&#8221;7℃~4℃&#8221;,&#8221;tempF1&#8243;:&#8221;57.2℉~42.8℉&#8221;,&#8221;tempF2&#8243;:&#8221;48.2℉~37.4℉&#8221;,&#8221;tempF3&#8243;:&#8221;42.8℉~35.6℉&#8221;,&#8221;tempF4&#8243;:&#8221;41℉~33.8℉&#8221;,&#8221;tempF5&#8243;:&#8221;44.6℉~39.2℉&#8221;,&#8221;weather1&#8243;:&#8221;多云转小雨&#8221;,&#8221;weather2&#8243;:&#8221;小雨转多云&#8221;,&#8221;weather3&#8243;:&#8221;多云转小雨&#8221;,&#8221;weather4&#8243;:&#8221;阴转多云&#8221;,&#8221;weather5&#8243;:&#8221;多云&#8221;,&#8221;img1&#8243;:&#8221;1&#8243;,&#8221;img2&#8243;:&#8221;7&#8243;,&#8221;img3&#8243;:&#8221;7&#8243;,&#8221;img4&#8243;:&#8221;1&#8243;,&#8221;img5&#8243;:&#8221;1&#8243;,&#8221;img6&#8243;:&#8221;7&#8243;,&#8221;img7&#8243;:&#8221;2&#8243;,&#8221;img8&#8243;:&#8221;1&#8243;,&#8221;img9&#8243;:&#8221;1&#8243;,&#8221;img10&#8243;:&#8221;99&#8243;,&#8221;img_single&#8221;:&#8221;1&#8243;,&#8221;img_title1&#8243;:&#8221;多云&#8221;,&#8221;img_title2&#8243;:&#8221;小雨&#8221;,&#8221;img_title3&#8243;:&#8221;小雨&#8221;,&#8221;img_title4&#8243;:&#8221;多云&#8221;,&#8221;img_title5&#8243;:&#8221;多云&#8221;,&#8221;img_title6&#8243;:&#8221;小雨&#8221;,&#8221;img_title7&#8243;:&#8221;阴&#8221;,&#8221;img_title8&#8243;:&#8221;多云&#8221;,&#8221;img_title9&#8243;:&#8221;多云&#8221;,&#8221;img_title10&#8243;:&#8221;多云&#8221;,&#8221;img_title_single&#8221;:&#8221;多云&#8221;,&#8221;wind1&#8243;:&#8221;东北风转北风3-4级&#8221;,&#8221;wind2&#8243;:&#8221;北风4-5级&#8221;,&#8221;wind3&#8243;:&#8221;北风转东北风4-5级&#8221;,&#8221;wind4&#8243;:&#8221;东北风4-5级转北风3-4级&#8221;,&#8221;wind5&#8243;:&#8221;西南风3-4级&#8221;,&#8221;fl1&#8243;:&#8221;3-4级&#8221;,&#8221;fl2&#8243;:&#8221;4-5级&#8221;,&#8221;fl3&#8243;:&#8221;4-5级&#8221;,&#8221;fl4&#8243;:&#8221;4-5级转3-4级&#8221;,&#8221;fl5&#8243;:&#8221;3-4级&#8221;,&#8221;index&#8221;:&#8221;舒适&#8221;,&#8221;index_d&#8221;:&#8221;建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。&#8221;,&#8221;index48&#8243;:&#8221;凉&#8221;,&#8221;index48_d&#8221;:&#8221;天气凉，建议着厚外套加毛衣等春秋服装。年老体弱者宜着大衣、呢外套加羊毛衫。&#8221;,&#8221;index_uv&#8221;:&#8221;最弱&#8221;,&#8221;index48_uv&#8221;:&#8221;最弱&#8221;,&#8221;index_xc&#8221;:&#8221;不宜&#8221;,&#8221;index_tr&#8221;:&#8221;很适宜&#8221;,&#8221;index_co&#8221;:&#8221;较舒适&#8221;}} 城市id获取方式（一次性工作）： 1. 访问http://m.weather.com.cn/data5/city.xml?level=0，（后面level参数可省略）得到一级列表（省、直辖市、自治区），结果用逗号隔开，id和城市名称使用竖线“&#124;”隔开；结果示例如下： 01&#124;北京,02&#124;上海,03&#124;天津,04&#124;重庆,05&#124;黑龙江,06&#124;吉林,07&#124;辽宁,08&#124;内蒙古,09&#124;河北,10&#124;山西,11&#124;陕西,12&#124;山东,13&#124;新疆,14&#124;西藏,15&#124;青海,16&#124;甘肃,17&#124;宁夏&#8230;(以下省略） 2. 访问http://m.weather.com.cn/data5/city02.xml?level=1，（后面level参数可省略）得到二级列表。其中02是一级省市的id，结果格式和上一层相同，示例如下（上海和黑龙江）： 0201&#124;上海 0501&#124;哈尔滨,0502&#124;齐齐哈尔,0503&#124;牡丹江,0504&#124;佳木斯,0505&#124;绥化,0506&#124;黑河,0507&#124;大兴安岭,0508&#124;伊春,0509&#124;大庆,0510&#124;七台河,0511&#124;鸡西,0512&#124;鹤岗,0513&#124;双鸭山 3. 访问http://m.weather.com.cn/data5/city0201.xml?level=2，（后面level参数可省略）得到三级列表。0201是地级市的id，示例如下（上海）： 020101&#124;上海,020102&#124;闵行,020103&#124;宝山,020104&#124;嘉定,020105&#124;南汇,020106&#124;金山,020107&#124;青浦,020108&#124;松江,020109&#124;奉贤,020110&#124;崇明,020111&#124;徐家汇,020112&#124;浦东 4. 访问http://m.weather.com.cn/data5/city020101.xml?level=3，（后面level参数可省略）得到最后一级的id，020101是区域的id，示例如下（上海市区）： 020101&#124;101020100 后面的数字就是获得天气数据需要的城市id，以http://m.weather.com.cn/data/{id}.html格式访问即可得出天气结果。 参考： chrome天气插件：http://code.google.com/p/chinaweather/，使用Javascript编写]]></description>
			<content:encoded><![CDATA[<div><strong>获得天气数据：</strong></div>
<div>访问<a href="http://m.weather.com.cn/data/101020100.html" target="_blank">http://m.weather.com.cn/data/101020100.html</a>，其中1010200100是城市的id（上海），返回JSON格式的天气数据，示例如下：</div>
<div></div>
<div><span>{&#8220;weatherinfo&#8221;:{&#8220;city&#8221;:&#8221;上海&#8221;,&#8221;city_en&#8221;:&#8221;shanghai&#8221;,&#8221;date_y&#8221;:&#8221;2009年12月24日&#8221;,&#8221;date&#8221;:&#8221;十一月初九&#8221;,&#8221;week&#8221;:&#8221;星期四&#8221;, &#8220;fchh&#8221;:&#8221;08&#8243;,&#8221;cityid&#8221;:&#8221;101020100&#8243;,&#8221;temp1&#8243;:&#8221;14℃~6℃&#8221;,&#8221;temp2&#8243;:&#8221;9℃~3℃&#8221;,&#8221;temp3&#8243;:&#8221;6℃~2℃&#8221;, &#8220;temp4&#8243;:&#8221;5℃~1℃&#8221;,&#8221;temp5&#8243;:&#8221;7℃~4℃&#8221;,&#8221;tempF1&#8243;:&#8221;57.2℉~42.8℉&#8221;,&#8221;tempF2&#8243;:&#8221;48.2℉~37.4℉&#8221;,&#8221;tempF3&#8243;:&#8221;42.8℉~35.6℉&#8221;,&#8221;tempF4&#8243;:&#8221;41℉~33.8℉&#8221;,&#8221;tempF5&#8243;:&#8221;44.6℉~39.2℉&#8221;,&#8221;weather1&#8243;:&#8221;多云转小雨&#8221;,&#8221;weather2&#8243;:&#8221;小雨转多云&#8221;,&#8221;weather3&#8243;:&#8221;多云转小雨&#8221;,&#8221;weather4&#8243;:&#8221;阴转多云&#8221;,&#8221;weather5&#8243;:&#8221;多云&#8221;,&#8221;img1&#8243;:&#8221;1&#8243;,&#8221;img2&#8243;:&#8221;7&#8243;,&#8221;img3&#8243;:&#8221;7&#8243;,&#8221;img4&#8243;:&#8221;1&#8243;,&#8221;img5&#8243;:&#8221;1&#8243;,&#8221;img6&#8243;:&#8221;7&#8243;,&#8221;img7&#8243;:&#8221;2&#8243;,&#8221;img8&#8243;:&#8221;1&#8243;,&#8221;img9&#8243;:&#8221;1&#8243;,&#8221;img10&#8243;:&#8221;99&#8243;,&#8221;img_single&#8221;:&#8221;1&#8243;,&#8221;img_title1&#8243;:&#8221;多云&#8221;,&#8221;img_title2&#8243;:&#8221;小雨&#8221;,&#8221;img_title3&#8243;:&#8221;小雨&#8221;,&#8221;img_title4&#8243;:&#8221;多云&#8221;,&#8221;img_title5&#8243;:&#8221;多云&#8221;,&#8221;img_title6&#8243;:&#8221;小雨&#8221;,&#8221;img_title7&#8243;:&#8221;阴&#8221;,&#8221;img_title8&#8243;:&#8221;多云&#8221;,&#8221;img_title9&#8243;:&#8221;多云&#8221;,&#8221;img_title10&#8243;:&#8221;多云&#8221;,&#8221;img_title_single&#8221;:&#8221;多云&#8221;,&#8221;wind1&#8243;:&#8221;东北风转北风3-4级&#8221;,&#8221;wind2&#8243;:&#8221;北风4-5级&#8221;,&#8221;wind3&#8243;:&#8221;北风转东北风4-5级&#8221;,&#8221;wind4&#8243;:&#8221;东北风4-5级转北风3-4级&#8221;,&#8221;wind5&#8243;:&#8221;西南风3-4级&#8221;,&#8221;fl1&#8243;:&#8221;3-4级&#8221;,&#8221;fl2&#8243;:&#8221;4-5级&#8221;,&#8221;fl3&#8243;:&#8221;4-5级&#8221;,&#8221;fl4&#8243;:&#8221;4-5级转3-4级&#8221;,&#8221;fl5&#8243;:&#8221;3-4级&#8221;,&#8221;index&#8221;:&#8221;舒适&#8221;,&#8221;index_d&#8221;:&#8221;建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。&#8221;,&#8221;index48&#8243;:&#8221;凉&#8221;,&#8221;index48_d&#8221;:&#8221;天气凉，建议着厚外套加毛衣等春秋服装。年老体弱者宜着大衣、呢外套加羊毛衫。&#8221;,&#8221;index_uv&#8221;:&#8221;最弱&#8221;,&#8221;index48_uv&#8221;:&#8221;最弱&#8221;,&#8221;index_xc&#8221;:&#8221;不宜&#8221;,&#8221;index_tr&#8221;:&#8221;很适宜&#8221;,&#8221;index_co&#8221;:&#8221;较舒适&#8221;}}</span></div>
<div></div>
<div><strong>城市id获取方式（一次性工作）：</strong></div>
<div>1. 访问<a href="http://m.weather.com.cn/data5/city.xml?level=0" target="_blank">http://m.weather.com.cn/data5/city.xml?level=0</a>，（后面level参数可省略）得到一级列表（省、直辖市、自治区），结果用逗号隔开，id和城市名称使用竖线“|”隔开；结果示例如下：</div>
<div><span></p>
<table border="0">
<tbody>
<tr>
<td></td>
<td>01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,12|山东,13|新疆,14|西藏,15|青海,16|甘肃,17|宁夏&#8230;(以下省略）</td>
</tr>
</tbody>
</table>
<p></span></div>
<div>2. 访问<a href="http://m.weather.com.cn/data5/city02.xml?level=1" target="_blank">http://m.weather.com.cn/data5/city02.xml?level=1</a>，（后面level参数可省略）得到二级列表。其中02是一级省市的id，结果格式和上一层相同，示例如下（上海和黑龙江）：</div>
<div><span>0201|上海</span></div>
<div><span style="font-family: monospace;"><span>0501|哈尔滨,0502|齐齐哈尔,0503|牡丹江,0504|佳木斯,0505|绥化,0506|黑河,0507|大兴安岭,0508|伊春,0509|大庆,0510|七台河,0511|鸡西,0512|鹤岗,0513|双鸭山</span></span></div>
<div><span style="font-family: monospace;"><span><br />
</span></span>3. 访问<a href="http://m.weather.com.cn/data5/city0201.xml?level=2" target="_blank">http://m.weather.com.cn/data5/city0201.xml?level=2</a>，（后面level参数可省略）得到三级列表。0201是地级市的id，示例如下（上海）：</div>
<div><span></p>
<table border="0">
<tbody>
<tr>
<td></td>
<td>020101|上海,020102|闵行,020103|宝山,020104|嘉定,020105|南汇,020106|金山,020107|青浦,020108|松江,020109|奉贤,020110|崇明,020111|徐家汇,020112|浦东</td>
</tr>
</tbody>
</table>
<p></span></div>
<div>4. 访问<a href="http://m.weather.com.cn/data5/city020101.xml?level=3" target="_blank">http://m.weather.com.cn/data5/city020101.xml?level=3</a>，（后面level参数可省略）得到最后一级的id，020101是区域的id，示例如下（上海市区）：</div>
<div><span>020101|101020100</span></div>
<div><span>后面的数字就是<span>获得天气数据需要的城市id，以<a href="http://m.weather.com.cn/data/%7Bid%7D.html" target="_blank">http://m.weather.com.cn/data/{id}.html</a>格式访问即可得出天气结果。</span></span></div>
<div></div>
<div>参考：</div>
<div>chrome天气插件：<a href="http://code.google.com/p/chinaweather/" target="_blank">http://code.google.com/p/chinaweather/</a>，使用Javascript编写</div>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2010/01/19/access-weather-data-by-weathercomcn/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>短地址还原api</title>
		<link>http://www.onlymarshall.com/2009/12/31/untrim-api/</link>
		<comments>http://www.onlymarshall.com/2009/12/31/untrim-api/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 07:33:38 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=697</guid>
		<description><![CDATA[由于众所周知的原因，一些短地址服务不能访问，如bit.ly。如果在不翻Wall的情况下，有些网站提供这种还原服务，如http://untr.im，因此可以利用这个网站的api实现bit.ly解析。 如果使用Javascript代码访问，可以用下面的代码(untrim函数)： function untrim(url){ var current = location.href; var base_url = "http://untr.im/api/ajax/api" var xmlHttpReq; var result; xmlHttpReq = new XMLHttpRequest(); xmlHttpReq.onreadystatechange = function(){ if(xmlHttpReq.readyState == 4){ result = xmlHttpReq.responseText; }else{ //alert(xmlHttpReq.readyState); } }; xmlHttpReq.open("POST", base_url, false); xmlHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttpReq.send("url="+url); return getUrl(result); } function getUrl(url){ if(url.indexOf("&#60;a href=") == url.lastIndexOf("&#60;a href=")){ return ""; } url = url.substr(url.lastIndexOf("&#60;a [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">由于众所周知的原因，一些短地址服务不能访问，如bit.ly。如果在不翻Wall的情况下，有些网站提供这种还原服务，如http://untr.im，因此可以利用这个网站的api实现bit.ly解析。</span></p>
<pre>
<div>
<pre>如果使用Javascript代码访问，可以用下面的代码(untrim函数)：</pre>
<pre>        function untrim(url){
		var current = location.href;
		var base_url = "http://untr.im/api/ajax/api"
		var xmlHttpReq;
		var result;
		xmlHttpReq = new XMLHttpRequest();
		xmlHttpReq.onreadystatechange = function(){
			if(xmlHttpReq.readyState == 4){
				result = xmlHttpReq.responseText;
			}else{
				//alert(xmlHttpReq.readyState);
			}
		};
		xmlHttpReq.open("POST", base_url, false);
		xmlHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttpReq.send("url="+url);
		return getUrl(result);
	}

	function getUrl(url){
		if(url.indexOf("&lt;a href=") == url.lastIndexOf("&lt;a href=")){
			return "";
		}
		url = url.substr(url.lastIndexOf("&lt;a href=") + 9);
		url = url.substr(0, url.indexOf('"'));
		return url;
	}</pre>
<pre>还有<a href="http://leechael.posterous.com/url-untrim-api">这里</a>（似乎需要翻墙）也有所介绍。</pre>
<pre>另外如果是命令行，可以通过<a href="http://www.commandlinefu.com/commands/view/3775/get-full-url-via-httpuntr.imapiajaxapi">这个方法获得</a>。</pre>
</div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/12/31/untrim-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>百度在线笔试</title>
		<link>http://www.onlymarshall.com/2009/11/26/baidu-online-test/</link>
		<comments>http://www.onlymarshall.com/2009/11/26/baidu-online-test/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 16:23:43 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[求职]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=684</guid>
		<description><![CDATA[上上周百度又让我参加了一轮在线笔试。今天忽然在桌面上看到于是就贴出来。 第一部分、算法与程序设计 1．在一棵一般的二叉树中找到指定的元素，如果有重复出现的元素，要求元素为深度最深的任何一个。指定元素找不到时返回EMPTY_NODE，请用C语言实现，相关数据结构与函数声明如下： struct Node { int iValue; int id; Node *pLeft; Node *pRight; }; const Node EMPTY_NODE = {0, 0, NULL, NULL}; Node findDeepest(Node *pRoot, int iWanted); //pRoot为根节点，wanted为指定元素的iValue 2．一个单词字典库，单词个数约为10万，每个单词长度不超过16，单词都是由小写字母组成，同时给出16个小写字母，请设计一种高效算法来找到用这些给出字母拼出一个字典中最大长度的单词。给出的16个字母每个字母最多使用一次，也可以不使用。存在多解的时候给出任意一个最优答案就行。 例如：给出adeenrstuvxyzuki可以拼出adventures 请详细描述你的算法思路（如需要，可给出代码\伪代码来辅助描述），并分析其时间复杂度。最后请分析下你的算法以及数据结构的优缺点，存在哪些可改进的地方。 第二部分、系统设计题 1.       有200亿条数据，每条数据的大小在1K~1M不等，每条数据有一个唯一的u_int64的id。 请设计一个读取数据系统，能根据id获取数据。要求： A.        内存有限制，16G B.        尽可能利用内存资源 C.        尽可能高效的获取数据 D. [...]]]></description>
			<content:encoded><![CDATA[<p>上上周百度又让我参加了一轮在线笔试。今天忽然在桌面上看到于是就贴出来。</p>
<p>第一部分、算法与程序设计</p>
<p>1．在一棵一般的二叉树中找到指定的元素，如果有重复出现的元素，要求元素为深度最深的任何一个。指定元素找不到时返回EMPTY_NODE，请用C语言实现，相关数据结构与函数声明如下：</p>
<p>struct Node</p>
<p>{</p>
<p>int iValue;</p>
<p>int id;</p>
<p>Node *pLeft;</p>
<p>Node *pRight;</p>
<p>};</p>
<p>const Node EMPTY_NODE = {0, 0, NULL, NULL};</p>
<p>Node findDeepest(Node *pRoot, int iWanted); //pRoot为根节点，wanted为指定元素的iValue</p>
<p>2．一个单词字典库，单词个数约为10万，每个单词长度不超过16，单词都是由小写字母组成，同时给出16个小写字母，请设计一种高效算法来找到用这些给出字母拼出一个字典中最大长度的单词。给出的16个字母每个字母最多使用一次，也可以不使用。存在多解的时候给出任意一个最优答案就行。</p>
<p>例如：给出adeenrstuvxyzuki可以拼出adventures</p>
<p>请详细描述你的算法思路（如需要，可给出代码\伪代码来辅助描述），并分析其时间复杂度。最后请分析下你的算法以及数据结构的优缺点，存在哪些可改进的地方。</p>
<p>第二部分、系统设计题</p>
<p>1.       有200亿条数据，每条数据的大小在1K~1M不等，每条数据有一个唯一的u_int64的id。</p>
<p>请设计一个读取数据系统，能根据id获取数据。要求：</p>
<p>A.        内存有限制，16G</p>
<p>B.        尽可能利用内存资源</p>
<p>C.        尽可能高效的获取数据</p>
<p>D.        可以利用磁盘，磁盘容量不受限制</p>
<p>2.       C2C网站的商品子系统，包括的关系数据有 分类、属性、商品。</p>
<p>一个商品只能属于一个分类，不同的分类有不同的属性（多个），每个属性有多个候选属性值，其中分类、属性、属性值的更新频率较低。</p>
<p>一个商品的属性，是所属分类的属性，属性值是候选属性值中的一个或多个。</p>
<p>例如：</p>
<p>分类：衣服</p>
<p>属性：尺寸、颜色</p>
<p>尺寸的候选属性值：S/M/L/XL/XXL/XXXL</p>
<p>颜色的候选属性值：黑/白/红/黄/蓝</p>
<p>商品：衣服A，尺寸S，颜色黑</p>
<p>另外，商品还有卖家、价格等其它信息</p>
<p>请设计商品子系统的存储结构或数据库结构。要求：</p>
<p>A.        能够正确维护分类、属性、商品之间的关系数据</p>
<p>B.        尽量减少冗余</p>
<p>C.        考虑数据的增、删、改、查操作，效率尽可能高</p>
<p>D.        能够按照卖家查询出其发布的所有商品</p>
<p><strong>==============问题和解答的分割线======================</strong></p>
<p>1111111111111111111111111111111111111111111111111111111111111111111111111111</p>
<p>Node findDeepest(Node *pRoot, int iWanted); //pRoot为根节点，wanted为指定元素的iValue</p>
<p>{</p>
<p><span> </span>return findDeepestWithDepth(pRoot, iWanted, 1);</p>
<p>}</p>
<p>Node findDeepestWithDepth(Node *pRoot, int iWanted, int depth)</p>
<p>{</p>
<p><span> </span>static int maxDepth = 1;</p>
<p><span> </span>static Node deepestNode = EMPTY_NODE;</p>
<p><span> </span>if(pRoot != null)</p>
<p><span> </span>{</p>
<p><span> </span>Node l = findDeepestWithDepth(pRoot-&gt;pLeft, iWanted, depth+1);</p>
<p><span> </span>Node r = findDeepestWithDepth(pRoot-&gt;pRight, iWanted, depth+1);</p>
<p><span> </span>if(isEmpty(l) &amp;&amp; isEmpty(r))</p>
<p><span> </span>{</p>
<p><span> </span>if(maxDepth &lt; depth)</p>
<p><span> </span>{</p>
<p><span> </span>maxDepth = depth;</p>
<p><span> </span>node = *pRoot;</p>
<p><span> </span>return *pRoot;</p>
<p><span> </span>}</p>
<p><span> </span>else</p>
<p><span> </span>{</p>
<p><span> </span>return deepestNode;</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>else</p>
<p><span> </span>{</p>
<p><span> </span>return deepestNode;</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>else</p>
<p><span> </span>{</p>
<p><span> </span>return EMPTY_NODE;</p>
<p><span> </span>}</p>
<p>}</p>
<p>bool isEmpty(Node node)</p>
<p>{</p>
<p><span> </span>return node.iValue == 0 &amp;&amp; node.id == 0 &amp;&amp; node.pLeft == NULL &amp;&amp; node.pRight == NULL;</p>
<p>}</p>
<p>2222222222222222222222222222222222222222222222222222222222222222222222222</p>
<p>1. 对字典中每一个单词进行遍历，计算出每个单词每个字母的个数和单词的长度</p>
<p>2. 针对每个单词里每个字母(a-z)的个数和单词的长度建立索引，类似数据库的一张表，表一共有28个列（加上一个隐含的rowid），包括单词内容（1列），26个字母每个字母的个数（26列）和单词的长度</p>
<p>3. 搜索时，对给定的字符串进行相同的统计，计算出每个字母的个数。根据统计结果去搜索个数小于给定字符串字母的单词的rowid，最多16次搜索，搜索后对结果进行交集（思想类似： select word from words where a &lt;= 1 and b &lt;= 1 and d &lt;= 2 and &#8230;)</p>
<p>4. 对最后的交集根据长度，得出最长的单词的rowid，最终得出单词</p>
<p>时间复杂度: 16次搜索，每次为O(log n)，最多15次的交集运算，复杂度为O(logn * logn)，最后寻找最大值可以忽略，所以时间复杂度为O(logn*logn)</p>
<p>改进：提高索引效率，如联合索引</p>
<p>33333333333333333333333333333333333333333333333333333333333333333333333333</p>
<p>1. 内存中使用二叉搜索树进行索引，每个节点占用16字节（2个指针+1个id），可放10亿个节点，则底层节点有5亿个。底层节点左右为空，8个字节用来表示记录在磁盘的存储位置</p>
<p>2. 磁盘存储分为5亿块，每个块里有40条记录</p>
<p>3. 块分为块头索引和块内容。块头索引按id顺序排列，包括了该块的id，起始位置和长度。块头大小为40*(8+8+4)=800字节</p>
<p>4. 每次通过id访问数据，首先查找二叉搜索树，经过29次内存比较得到索引块，再载入索引块头，使用二分搜索得到内容的起始位置和长度，最终得到内容。一共35次左右内存访问和2次磁盘访问</p>
<p>44444444444444444444444444444444444444444444444444444444444444444444444444444</p>
<p>商品表 <span> </span>product: <span> </span>id, name, seller, price, category</p>
<p>分类表 <span> </span>category: <span> </span>id, name</p>
<p>属性表<span> </span>attribute: <span> </span>id, name, category_id, type</p>
<p>属性候选值表<span> </span>attribute_value: <span> </span>id, attribute_id, value</p>
<p>商品属性表<span> </span>product_value:<span> </span>product_id, attribute_value_id</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/11/26/baidu-online-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenJDK6 build小记(Ubuntu 9.10)</title>
		<link>http://www.onlymarshall.com/2009/11/16/notes-about-building-openjdk6/</link>
		<comments>http://www.onlymarshall.com/2009/11/16/notes-about-building-openjdk6/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 10:28:08 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[OpenJDK]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=681</guid>
		<description><![CDATA[之前在twitter上喊喊要研究JVM，今天算是迈出了第一步，从源代码编译openjdk。openjdk现在有6和7两个版本下载，现在7还在milestone 6的阶段，也暂时没什么需要尝试的新特性，另外openjdk6的代码大小只有openjdk7的一半（近50M对114M）,于是选择了openjdk6来进行构建。另外，jdk6提供官方下载，这样也方便了和官方版本进行对比。 事实上，根据官方的描述，openjdk6的代码是基于jdk7 b20和jdk6的update的，openjdk7的代码是基于jdk7 b10，很奇怪的代码来源。因为sun是在jdk6开发的晚期才宣布java的开源，于是先开源了java7成为openjdk7，然后再发布了jdk6之后才重新整理代码，从jdk7 b20里剔除了java7特性的代码，发布了openjdk6。现在jdk7的概念等同于openjdk7，但jdk6却和openjdk6不是一个东西。 openjdk的主页的左边栏有众多的链接，主要分为Groups和Projects，似乎是有一些工作组从事不同的项目。不少栏目里都有很多有用的资料，有兴趣的可以看看。其中有一个Build的工作组，负责构建工作，里面有关于构建的官方指南。 代码的下载可以用Mecurial来下，也可以下打好的bundle，应该大部分人会选择后者，Mecurial毕竟还是小众的版本配置工具，需要python。 代码构建的过程基本是按照官方指南一步步来的。我的构建环境是虚拟机中的Ubuntu 9.10（BS一下自己，硬盘上就有早就装好的Ubuntu 8.10，只是因为懒得离开Windows）。除了Linux平台，openjdk6还支持在Solaris和Windows上的构建。Linux使用gcc(4.2)编译，Windows使用VS2003（也有2005成功的例子，。而openjdk7的构建文档直接要求VS2008）。GNU make是构建工具，所以Windows下还需要cygwin。 构建的依赖在ubuntu下很简单，用下面的语句搞定。在9.10下需要下载很多东西，最大的是llvm的binary和开发包，不知是用来做编译还是虚拟机的。 sudo aptitude build-dep openjdk-6 另外需要安装openjdk6当作bootstrap jdk，还需要libmotif开发包 sudo aptitude install openjdk-6-jdk libmotif-dev 接着，设置一下环境变量 export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk 然后直接在源代码的目录下运行: make all 就开始构建openjdk6了。昨天我没好好看文档，自己去设定了motif, binary plugs, freetype的环境。还在错误的目录下运行了make，因为在子目录下make是部分构建，所以一直报错，找不到ALT_JDK_IMPORT_PATH。最后也还是自己折腾好了，但不知道是ubuntu早就下好了依赖，还是自己设置好的。 构建完成后，可以自己运行代码目录下build/linux-i586/bin下的可执行程序，比如java 这个时候版本号成了 ./java -version openjdk version &#8220;1.6.0-internal&#8221; OpenJDK Runtime Environment (build 1.6.0-internal-marshall_15_nov_2009_21_53-b00) OpenJDK Client VM (build 14.0-b16, mixed mode) 对比原有的信息： [...]]]></description>
			<content:encoded><![CDATA[<p>之前在twitter上喊喊要研究JVM，今天算是迈出了第一步，从源代码编译<a href="http://openjdk.java.net/">openjdk</a>。openjdk现在有6和7两个版本下载，现在7还在milestone 6的阶段，也暂时没什么需要尝试的新特性，另外openjdk6的代码大小只有openjdk7的一半（近50M对114M）,于是选择了openjdk6来进行构建。另外，jdk6提供官方下载，这样也方便了和官方版本进行对比。</p>
<p>事实上，<a href="http://openjdk.java.net/projects/jdk6/">根据官方的描述</a>，openjdk6的代码是基于jdk7 b20和jdk6的update的，openjdk7的代码是基于jdk7 b10，很奇怪的代码来源。因为sun是在jdk6开发的晚期才宣布java的开源，于是先开源了java7成为openjdk7，然后再发布了jdk6之后才重新整理代码，从jdk7 b20里剔除了java7特性的代码，发布了openjdk6。现在jdk7的概念等同于openjdk7，但jdk6却和openjdk6不是一个东西。</p>
<p>openjdk的主页的左边栏有众多的链接，主要分为Groups和Projects，似乎是有一些工作组从事不同的项目。不少栏目里都有很多有用的资料，有兴趣的可以看看。其中有一个Build的工作组，负责构建工作，里面有<a href="http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html">关于构建的官方指南</a>。</p>
<p>代码的下载可以用Mecurial来下，也可以下打好的bundle，应该大部分人会选择后者，Mecurial毕竟还是小众的版本配置工具，需要python。</p>
<p>代码构建的过程基本是按照<a href="http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html">官方指南</a>一步步来的。我的构建环境是虚拟机中的Ubuntu 9.10（BS一下自己，硬盘上就有早就装好的Ubuntu 8.10，只是因为懒得离开Windows）。除了Linux平台，openjdk6还支持在Solaris和Windows上的构建。Linux使用gcc(4.2)编译，Windows使用VS2003（也有<a href="http://leejingbo.javaeye.com/blog/35318">2005成功的例子</a>，。而openjdk7的构建文档直接要求VS2008）。GNU make是构建工具，所以Windows下还需要cygwin。</p>
<p>构建的依赖在ubuntu下很简单，用下面的语句搞定。在9.10下需要下载很多东西，最大的是llvm的binary和开发包，不知是用来做编译还是虚拟机的。</p>
<blockquote><p>sudo aptitude build-dep openjdk-6</p></blockquote>
<p>另外需要安装openjdk6当作bootstrap jdk，还需要libmotif开发包</p>
<blockquote><p>sudo aptitude install openjdk-6-jdk libmotif-dev</p></blockquote>
<p>接着，设置一下环境变量</p>
<blockquote><p>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk</p></blockquote>
<p>然后直接在源代码的目录下运行:</p>
<blockquote><p>make all</p></blockquote>
<p>就开始构建openjdk6了。昨天我没好好看文档，自己去<a href="http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html#linux">设定了motif, binary plugs, freetype的环境</a>。还在错误的目录下运行了make，因为在子目录下make是部分构建，所以一直报错，找不到<a href="http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html#ALT_JDK_IMPORT_PATH">ALT_JDK_IMPORT_PATH</a>。最后也还是自己折腾好了，但不知道是ubuntu早就下好了依赖，还是自己设置好的。</p>
<p>构建完成后，可以自己运行代码目录下build/linux-i586/bin下的可执行程序，比如java</p>
<p>这个时候版本号成了</p>
<blockquote><p>./java -version</p>
<p>openjdk version &#8220;1.6.0-internal&#8221;</p>
<p>OpenJDK Runtime Environment (build 1.6.0-internal-marshall_15_nov_2009_21_53-b00)</p>
<p>OpenJDK Client VM (build 14.0-b16, mixed mode)</p></blockquote>
<p>对比原有的信息：</p>
<blockquote><p>java -version</p>
<p><span style="background-color: #ffffff;">java version &#8220;1.6.0_0&#8243;</span></p>
<p>OpenJDK Runtime Environment (IcedTea6 1.6.1) (6b16-1.6.1-3ubuntu1)</p>
<p>OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)</p></blockquote>
<div>另：在我分配了512M内存的ubuntu上，编译时间大致为1个小时。构建有警告提示内存太少，会影响速度。明天放到非虚拟的ubuntu下跑试试看。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/11/16/notes-about-building-openjdk6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>支付宝面试总结(2009.10.12)</title>
		<link>http://www.onlymarshall.com/2009/10/12/alipay-interview-summary-20091012/</link>
		<comments>http://www.onlymarshall.com/2009/10/12/alipay-interview-summary-20091012/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 06:38:09 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[求职]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=673</guid>
		<description><![CDATA[10号晚上的宣讲+笔试，笔试笔得一般，程序题做错了，没想到用递归，还有记得做错的是一道网络题，问会话层(Session)是OSI里的第几层，我忘了展示层(Presentation)，于是选了第六层光荣的错了。 11号一早通知9点面试，我起床洗漱吃早饭，然后又接到一个电话说是12号早上9点，于是只好上床继续睡觉。 面试前打印了几份简历，进去咖啡馆之后填了表格就开始面了。中间省略过程数百字。。。直接开始总结几个答的不好的问题，因为一面就挂了。 Spring的事务有几种方式？ 题目到现在也不是很明白，我觉得大概的解答应该是声明式事务处理的几种方式（1.0时代的parentTemplate、2.0时代的AOP代理和@Transational），另外加上编程式事务处理，直接上TransactionTemplate和PlatformTransactionManager。 Spring Bean加载有几种方式？ 我回答了启动时加载，现在看来有点答非所问。加载bean默认为即时加载，另外也可以设置延迟加载。加载可以为单例、每次一个实例、request、session、global-session。 Spring Bean有几个设置属性？ 我只想起来scope，应该想起来auto-wire, init-method, destroy-method一时都忘了。另外还有lazy-init,  factory-bean, factory-method。 Collections.sort()对参数的要求？ 这个是最不应该答错的题目。我只想起来sort的集合必须实现List接口，却忘了最重要的sort的对象必须实现Comparable接口。 描述一个LRU的HashMap。 这题一开始楞没听明白，老想着HashMap不是链式连接冲突的entry的么，怎么会size不够。磨叽了半天，搞了一个堆出来计数，面试官也不满意。 后来想想其实用个链表把Entry链接起来就可以了，正好在网上搜到了使用LinkedHashMap实现LRU Cache的做法，在这里描述一下内部实现： 扩展HashMap.Entry，使Entry间使用双链表连起来； get的时候，把该Entry移到链表的尾部； put的时候，把Entry放到链表的头部； 如果规模超标，则把链表头部的Entry抛弃； 项目里使用的设计模式。 我拿了资源安排里，封装两种安排算法到两个实现同一个接口的类的例子，说这是策略模式，面试官有些不认同。后来回头想想，项目里还有其他的模式： Singleton，Facade自不必说； Strategy有一个更好的例子，使用PROBE的A、B、C、D四种方法进行时间和规模的估算。另外还有两个Factory来负责生成相应的计算方法实例。 Decorator模式，封装了MultiTenantSessionFactory，持有一个SessionFactory对象，也实现了SessionFactory接口。 大概就想起来这些问题。一开始的自我介绍忘记介绍做过的项目了，这可能是悲剧的来源吧。]]></description>
			<content:encoded><![CDATA[<p>10号晚上的宣讲+笔试，笔试笔得一般，程序题做错了，没想到用递归，还有记得做错的是一道网络题，问会话层(Session)是OSI里的第几层，我忘了展示层(Presentation)，于是选了第六层光荣的错了。</p>
<p>11号一早通知9点面试，我起床洗漱吃早饭，然后又接到一个电话说是12号早上9点，于是只好上床继续睡觉。</p>
<p>面试前打印了几份简历，进去咖啡馆之后填了表格就开始面了。中间省略过程数百字。。。直接开始总结几个答的不好的问题，因为一面就挂了。</p>
<p><strong>Spring的事务有几种方式？</strong></p>
<p>题目到现在也不是很明白，我觉得大概的解答应该是声明式事务处理的几种方式（1.0时代的parentTemplate、2.0时代的AOP代理和@Transational），另外加上编程式事务处理，直接上TransactionTemplate和PlatformTransactionManager。</p>
<p><strong>Spring Bean加载有几种方式？</strong></p>
<p>我回答了启动时加载，现在看来有点答非所问。加载bean默认为即时加载，另外也可以设置延迟加载。加载可以为单例、每次一个实例、request、session、global-session。</p>
<p><strong>Spring Bean有几个设置属性？</strong></p>
<p>我只想起来scope，应该想起来auto-wire, init-method, destroy-method一时都忘了。另外还有lazy-init,  factory-bean, factory-method。</p>
<p><strong>Collections.sort()对参数的要求？</strong></p>
<p>这个是最不应该答错的题目。我只想起来sort的集合必须实现List接口，却忘了最重要的sort的对象必须实现Comparable接口。</p>
<p><strong>描述一个LRU的HashMap。</strong></p>
<p>这题一开始楞没听明白，老想着HashMap不是链式连接冲突的entry的么，怎么会size不够。磨叽了半天，搞了一个堆出来计数，面试官也不满意。</p>
<p>后来想想其实用个链表把Entry链接起来就可以了，正好在网上搜到了使用<a href="http://bluepopopo.javaeye.com/blog/180236">LinkedHashMap实现LRU Cache的做法</a>，在这里描述一下内部实现：</p>
<ol>
<li>扩展HashMap.Entry，使Entry间使用双链表连起来；</li>
<li>get的时候，把该Entry移到链表的尾部；</li>
<li>put的时候，把Entry放到链表的头部；</li>
<li>如果规模超标，则把链表头部的Entry抛弃；</li>
</ol>
<p><strong>项目里使用的设计模式。</strong></p>
<p>我拿了资源安排里，封装两种安排算法到两个实现同一个接口的类的例子，说这是策略模式，面试官有些不认同。后来回头想想，项目里还有其他的模式：</p>
<ul>
<li>Singleton，Facade自不必说；</li>
<li>Strategy有一个更好的例子，使用PROBE的A、B、C、D四种方法进行时间和规模的估算。另外还有两个Factory来负责生成相应的计算方法实例。</li>
<li>Decorator模式，封装了MultiTenantSessionFactory，持有一个SessionFactory对象，也实现了SessionFactory接口。</li>
</ul>
<p>大概就想起来这些问题。一开始的自我介绍忘记介绍做过的项目了，这可能是悲剧的来源吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/10/12/alipay-interview-summary-20091012/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>使用正则表达式过滤不包含某子字符串的单词</title>
		<link>http://www.onlymarshall.com/2009/09/30/filter-substring-in-a-word-using-regular-expression/</link>
		<comments>http://www.onlymarshall.com/2009/09/30/filter-substring-in-a-word-using-regular-expression/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 03:09:33 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=668</guid>
		<description><![CDATA[昨天在学院版上看到有人发帖问，标题里的内容就是帖子里问题的核心。举个例子来说，就是给一堆单词，匹配所有不包含某字符串的单词。比如要求剔除aa，那么对于单词aab, abc, abca, abaac，就匹配abc, abca。 问题似乎很简单，但我从来没用过逆向匹配。有限状态自动机很容易就可以画出来，但怎么转化成正则表达式倒是忘得一干二净。最后google了半天，发现一个博客给出了正确答案（目前能想到的都验证通过）：\b((?!aa)\w)+\b 这个表达式挺不好理解的。(?! pattern)是负向预查(negative look ahead)，放在\w前面显然不是和\w进行组合。需要把表达式拆开来看，比如\b(?!aa)\w(?!aa)\w(?!aa)\w\b，这么来看就比较好理解了。首先不可以以aa开头，然后每个单个字符后都不能跟aa，直到结尾。这么就基本把aa给堵死了。 另外，如果支持negative look behind的话（Javascript不支持），应该也可以写作\b(\w(?&#60;!aa))+\b。]]></description>
			<content:encoded><![CDATA[<p>昨天在学院版上看到有人发帖问，标题里的内容就是帖子里问题的核心。举个例子来说，就是给一堆单词，匹配所有不包含某字符串的单词。比如要求剔除aa，那么对于单词aab, abc, abca, abaac，就匹配abc, abca。</p>
<p>问题似乎很简单，但我从来没用过逆向匹配。有限状态自动机很容易就可以画出来，但怎么转化成正则表达式倒是忘得一干二净。最后google了半天，发现<a href="http://www.cnblogs.com/deerchao/archive/2009/03/25/651411.html">一个博客给出了正确答案</a>（目前能想到的都验证通过）：\b((?!aa)\w)+\b</p>
<p>这个表达式挺不好理解的。(?! pattern)是负向预查(negative look ahead)，放在\w前面显然不是和\w进行组合。需要把表达式拆开来看，比如\b(?!aa)\w(?!aa)\w(?!aa)\w\b，这么来看就比较好理解了。首先不可以以aa开头，然后每个单个字符后都不能跟aa，直到结尾。这么就基本把aa给堵死了。</p>
<p>另外，如果支持negative look behind的话（Javascript不支持），应该也可以写作\b(\w(?&lt;!aa))+\b。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/09/30/filter-substring-in-a-word-using-regular-expression/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>远程opensusue无法使用home, end</title>
		<link>http://www.onlymarshall.com/2009/09/23/home-end-issues-in-opensuse-termina/</link>
		<comments>http://www.onlymarshall.com/2009/09/23/home-end-issues-in-opensuse-termina/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 05:28:56 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[opensusue]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=665</guid>
		<description><![CDATA[用了opensusue当服务器两个月，碰到一个小麻烦的问题就是使用putty SSH登录上后，BASH里无法使用HOME和END进行行首和行尾的定位。原本以为是putty的问题（以前用的都是Secure Shell），今天正好想到这个问题google了一把，发现是opensusue的问题，参见这里。 我用的是opensusue10，配置文件都是/etc/inputrc，但行数有些不同，我的是90-91行，把下面的代码注掉就OK了： #&#8221;\e[1~&#8221;:       history-search-backward #&#8221;\e[4~&#8221;:       set-mark]]></description>
			<content:encoded><![CDATA[<p>用了opensusue当服务器两个月，碰到一个小麻烦的问题就是使用putty SSH登录上后，BASH里无法使用HOME和END进行行首和行尾的定位。原本以为是putty的问题（以前用的都是Secure Shell），今天正好想到这个问题google了一把，发现是opensusue的问题，<a href="http://www.thingy-ma-jig.co.uk/blog/12-12-2008/opensuse-110-windows-putty-ssh-no-home-key">参见这里</a>。</p>
<p>我用的是opensusue10，配置文件都是/etc/inputrc，但行数有些不同，我的是90-91行，把下面的代码注掉就OK了：</p>
<blockquote><p>#&#8221;\e[1~&#8221;:       history-search-backward</p>
<p>#&#8221;\e[4~&#8221;:       set-mark</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/09/23/home-end-issues-in-opensuse-termina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat启动地址解析错误</title>
		<link>http://www.onlymarshall.com/2009/09/16/tomcat-startup-address-resolving-erro/</link>
		<comments>http://www.onlymarshall.com/2009/09/16/tomcat-startup-address-resolving-erro/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:22:18 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=663</guid>
		<description><![CDATA[贴log： SEVERE: Protocol handler pause failed java.net.UnknownHostException: NEOSTA: NEOSTA at java.net.InetAddress.getLocalHost(InetAddress.java:1474) at org.apache.jk.common.ChannelSocket.unLockSocket(ChannelSocket.java:484) at org.apache.jk.common.ChannelSocket.pause(ChannelSocket.java:283) at org.apache.jk.server.JkMain.pause(JkMain.java:681) at org.apache.jk.server.JkCoyoteHandler.pause(JkCoyoteHandler.java:153) at org.apache.catalina.connector.Connector.pause(Connector.java:1073) at org.apache.catalina.core.StandardService.stop(StandardService.java:563) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:744) at org.apache.catalina.startup.Catalina.stop(Catalina.java:628) at org.apache.catalina.startup.Catalina$CatalinaShutdownHook.run(Catalina.java:671) 关键词：UnknownHostException， JK 原因在google的第一个，虽然上面说的是AIX，但也适用于普通Linux：RHEL5原装的GCJ太山寨了，记得在启动tomcat前要指定JAVA_HOME。]]></description>
			<content:encoded><![CDATA[<p>贴log：</p>
<p>SEVERE: Protocol handler pause failed<br />
java.net.UnknownHostException: NEOSTA: NEOSTA<br />
at java.net.InetAddress.getLocalHost(InetAddress.java:1474)<br />
at org.apache.jk.common.ChannelSocket.unLockSocket(ChannelSocket.java:484)<br />
at org.apache.jk.common.ChannelSocket.pause(ChannelSocket.java:283)<br />
at org.apache.jk.server.JkMain.pause(JkMain.java:681)<br />
at org.apache.jk.server.JkCoyoteHandler.pause(JkCoyoteHandler.java:153)<br />
at org.apache.catalina.connector.Connector.pause(Connector.java:1073)<br />
at org.apache.catalina.core.StandardService.stop(StandardService.java:563)<br />
at org.apache.catalina.core.StandardServer.stop(StandardServer.java:744)<br />
at org.apache.catalina.startup.Catalina.stop(Catalina.java:628)<br />
at org.apache.catalina.startup.Catalina$CatalinaShutdownHook.run(Catalina.java:671)</p>
<p>关键词：UnknownHostException， JK</p>
<p>原因在google的第一个，虽然上面说的是AIX，但也适用于普通Linux：RHEL5原装的GCJ太山寨了，记得在启动tomcat前要指定JAVA_HOME。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/09/16/tomcat-startup-address-resolving-erro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个人人（校内）应用的想法</title>
		<link>http://www.onlymarshall.com/2009/09/11/an-idea-about-renren-apps/</link>
		<comments>http://www.onlymarshall.com/2009/09/11/an-idea-about-renren-apps/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 06:59:20 +0000</pubDate>
		<dc:creator>marshall</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[求职]]></category>
		<category><![CDATA[校内]]></category>

		<guid isPermaLink="false">http://www.onlymarshall.com/?p=657</guid>
		<description><![CDATA[一个星期前坐车时想到的。应用的功能很简单，就是帮助求职人群找到笔友、面友。 添加应用的用户可以创建一个活动，比如参加宣讲会、笔试、面试，并对这个活动添加评论（如笔经、面经）。其他人也可以添加评论形成互动。 搜索是一个比较重要的功能，相对于BBS上发帖寻同路人的行为，更有效率。 开发上，可以使用appspot进行部署，但appspot经常会被墙，或者是自己出了问题。自己Host的话要考虑流量和服务器的负载。 营收上可以在上面放adsense，虽然没几个钱。 只是个想法，暂时没什么时间实现，看这个周末有没有空搭一个架子出来。校内的文档很糟糕，支离破碎的。如果有人看到这个想法并打算尝试的话，自便。我也希望看到这个应用的上线。现在校内上关于求职的应用几乎没有。]]></description>
			<content:encoded><![CDATA[<p>一个星期前坐车时想到的。应用的功能很简单，就是帮助求职人群找到笔友、面友。</p>
<p>添加应用的用户可以创建一个活动，比如参加宣讲会、笔试、面试，并对这个活动添加评论（如笔经、面经）。其他人也可以添加评论形成互动。</p>
<p>搜索是一个比较重要的功能，相对于BBS上发帖寻同路人的行为，更有效率。</p>
<p>开发上，可以使用appspot进行部署，但appspot经常会被墙，或者是自己出了问题。自己Host的话要考虑流量和服务器的负载。</p>
<p>营收上可以在上面放adsense，虽然没几个钱。</p>
<p>只是个想法，暂时没什么时间实现，看这个周末有没有空搭一个架子出来。校内的文档很糟糕，支离破碎的。如果有人看到这个想法并打算尝试的话，自便。我也希望看到这个应用的上线。现在校内上关于求职的应用几乎没有。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onlymarshall.com/2009/09/11/an-idea-about-renren-apps/feed/</wfw:commentRss>
		<slash:comments>1</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 />

