<?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>Martin Liu - Martin&#039;s Crazy World &#187; 点滴备忘</title>
	<atom:link href="http://www.martinliu.info/category/notes/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.martinliu.info</link>
	<description>Martin&#039;s Crazy World</description>
	<lastBuildDate>Mon, 21 Sep 2009 06:52:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ruby on Rails: 给Redmine做插件</title>
		<link>http://www.martinliu.info/2009/03/ruby-on-rails-%e7%bb%99redmine%e5%81%9a%e6%8f%92%e4%bb%b6/</link>
		<comments>http://www.martinliu.info/2009/03/ruby-on-rails-%e7%bb%99redmine%e5%81%9a%e6%8f%92%e4%bb%b6/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 15:54:49 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[点滴备忘]]></category>

		<guid isPermaLink="false">http://www.martinliu.info/?p=96</guid>
		<description><![CDATA[这段时间，有个跟合作公司一起做的项目，其间涉及到大量的Buglist交换。我们使用的跟踪系统是Redmine，简洁好用，但偏偏没有Bug导入功能，QA的同事只好手工操作，很是辛苦。
上周五我花了一个晚上的时间，Google来，Google去，最终找到了Piroli UENISHI做的Redmine CSV Importer。可惜这个Plugin只能导入由Redmine导出的CSV文件，并且不能处理自定义字段，还是不合用。
周六早上一醒来，发现天黑黑的，恐怕是随时都要下雨，心想今天不会有户外活动了，不如自己动手做一个Plugin吧。马上开工。
Redmine是基于Ruby on Rails的应用。以前在考察应用程序框架时，曾经看过37signals写的数篇介绍文章，还记得大概的架构。但一动手，立刻发现Ruby和Rails并不像想象中的那么容易上手。从头学肯定是小题大作了，要在这个周末做完，必须得想点速成的办法。
从以往的经验来看，速成需要借助工具，特别是集成得非常好的IDE。Google一下，嗯，最受推崇的工具是Aptana Studio，基于熟悉的Eclipse，大部分功能都支持Mac，下载来试试。
Aptana的确不错，导入Redmine的源代码，很快就跑起来了。继续看Redmine的Plugin制作教程，一步步做了一个新的插件，把大概要用到的东西熟悉了一下。其中有个2个地方花了不少时间：

Radio field与其他field的关联动作。没有框架时，肯定是自己写一个Javascript了，但我觉得RoR应该有自己的办法。最后搜到了CSDN上的一个帖子，也是说要用Javascript。一边乱翻RoR的API文档，一边正准备放弃，突然发现ActionView::Helpers::PrototypeHelper里面有个observe_field，解决问题。
Redmine下action间传递上传文件的名字或句柄。这个让我很挠头。本来RoR提供了ActionController::Flash，但Redmine居然把Flash Hash中的所有元素都当作需要显示的内容了。找来找去，没有更好的办法，还是自己用session来传递参数。

终于，经过充分利用周末里各种“见缝插针”的时间，0.1.0版出炉了。明天拿给同事们品评试用一番了。
4月1日补充：做好的plugin在这里发布，为了更多的Redmine用户能够用到这个插件，写成了英文版。
参考资料：

Redmine的Plugin制作教程
Ruby的API文档
Ruby on Rails的API文档

]]></description>
			<content:encoded><![CDATA[<p>这段时间，有个跟合作公司一起做的项目，其间涉及到大量的Buglist交换。我们使用的跟踪系统是Redmine，简洁好用，但偏偏没有Bug导入功能，QA的同事只好手工操作，很是辛苦。</p>
<p>上周五我花了一个晚上的时间，Google来，Google去，最终找到了Piroli UENISHI做的<a href="Redmine CSV Importer" target="_blank">Redmine CSV Importer</a>。可惜这个Plugin只能导入由Redmine导出的CSV文件，并且不能处理自定义字段，还是不合用。</p>
<p>周六早上一醒来，发现天黑黑的，恐怕是随时都要下雨，心想今天不会有户外活动了，不如自己动手做一个Plugin吧。马上开工。</p>
<p>Redmine是基于Ruby on Rails的应用。以前在考察应用程序框架时，曾经看过37signals写的数篇介绍文章，还记得大概的架构。但一动手，立刻发现Ruby和Rails并不像想象中的那么容易上手。从头学肯定是小题大作了，要在这个周末做完，必须得想点速成的办法。<span id="more-96"></span></p>
<p>从以往的经验来看，速成需要借助工具，特别是集成得非常好的IDE。Google一下，嗯，最受推崇的工具是<a href="http://www.aptana.com" target="_blank">Aptana Studio</a>，基于熟悉的Eclipse，大部分功能都支持Mac，下载来试试。</p>
<p>Aptana的确不错，导入Redmine的源代码，很快就跑起来了。继续看Redmine的<a href="http://www.redmine.org/wiki/redmine/Plugin_Tutorial" target="_blank">Plugin制作教程</a>，一步步做了一个新的插件，把大概要用到的东西熟悉了一下。其中有个2个地方花了不少时间：</p>
<ul>
<li>Radio field与其他field的关联动作。没有框架时，肯定是自己写一个Javascript了，但我觉得RoR应该有自己的办法。最后搜到了CSDN上的一个<a href="http://topic.csdn.net/t/20061124/13/5182448.html">帖子</a>，也是说要用Javascript。一边乱翻RoR的API文档，一边正准备放弃，突然发现<a href="http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html">ActionView::Helpers::PrototypeHelper</a>里面有个observe_field，解决问题。</li>
<li>Redmine下action间传递上传文件的名字或句柄。这个让我很挠头。本来RoR提供了ActionController::Flash，但Redmine居然把Flash Hash中的所有元素都当作需要显示的内容了。找来找去，没有更好的办法，还是自己用session来传递参数。</li>
</ul>
<p>终于，经过充分利用周末里各种“见缝插针”的时间，0.1.0版出炉了。明天拿给同事们品评试用一番了。</p>
<p>4月1日补充：做好的plugin在<a href="http://www.martinliu.info/2009/04/redmine_importer-redmine-csv-import-plugin/">这里</a>发布，为了更多的Redmine用户能够用到这个插件，写成了英文版。</p>
<p>参考资料：</p>
<ul>
<li>Redmine的<a href="http://www.redmine.org/wiki/redmine/Plugin_Tutorial" target="_blank">Plugin制作教程</a></li>
<li>Ruby的<a href="http://www.ruby-doc.org/docs/ProgrammingRuby/" target="_blank">API文档</a></li>
<li>Ruby on Rails的<a href="http://api.rubyonrails.org/" target="_blank">API文档</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.martinliu.info/2009/03/ruby-on-rails-%e7%bb%99redmine%e5%81%9a%e6%8f%92%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>超声波+机油，翻新T42嗡嗡作响的风扇</title>
		<link>http://www.martinliu.info/2006/11/%e8%b6%85%e5%a3%b0%e6%b3%a2%e6%9c%ba%e6%b2%b9%ef%bc%8c%e7%bf%bb%e6%96%b0t42%e5%97%a1%e5%97%a1%e4%bd%9c%e5%93%8d%e7%9a%84%e9%a3%8e%e6%89%87/</link>
		<comments>http://www.martinliu.info/2006/11/%e8%b6%85%e5%a3%b0%e6%b3%a2%e6%9c%ba%e6%b2%b9%ef%bc%8c%e7%bf%bb%e6%96%b0t42%e5%97%a1%e5%97%a1%e4%bd%9c%e5%93%8d%e7%9a%84%e9%a3%8e%e6%89%87/#comments</comments>
		<pubDate>Sat, 04 Nov 2006 15:51:11 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[点滴备忘]]></category>

		<guid isPermaLink="false">http://www.martinliu.info/?p=32</guid>
		<description><![CDATA[我的Thinkpad T42买了有1年半了，总体表现令人满意。可惜最近风扇噪音越来越大，嗡嗡作响的声音，从只是夜阑人静的时候才能听到，发展到现在白天也清晰非常，恶化得相当迅速。
根据以往处理散热风扇的经验，我判断这是灰尘在作祟。某黄道吉日的凌晨，拔下电池，拆下键盘，用USB吸尘器将风扇和散热器上的灰尘清理了一遍。风扇立马清静了，心满意足地关机睡觉。可惜好景不长，第三天下午便又听到了熟悉的嗡嗡声……原来这一招不灵。
然而噪音依旧继续恶化，使得我不得不再次将笔记本拆开，对风扇和散热器进行了更为彻底的吸尘。当然，意料之中的，第二天上午，噪音便回来了。看来必须祭出杀手锏。

其实杀手锏是在Google上搜到的“5元让你油尽灯枯的风扇起死回生”一片文章中提到的超声波清洗上油的办法。原文的目标是T40p，和我的T42有小小差别。
首先是拆机。Thinkpad是很好拆的，既不需要专用工具，也不需要记忆各个螺丝的位置（面板上已经标识清楚了），更不必担心掰坏塑料卡扣（因为T42 14&#8243;的掌托就没有用塑料卡扣）。但谨慎起见，还是从Google搜到了“T4X硬件维护手册”，以便按图索骥。
根据维护手册，卸下风扇前，必须卸下电池、硬盘、键盘和掌托。
将 T42反面放置，电池和硬盘很容易就卸下了，拆键盘时发现螺丝还有点紧（标称2.45牛·米），换了个更合适的螺丝刀，才把4颗3号螺丝搞定。随后是掌 托，幸好这几天没有剪指甲，不然那5块遮盖螺丝空的塑料片还真不容易弄下来。卸下4颗1号螺丝，1颗2号螺丝，2颗4号螺丝，就可以拆了。
将T42恢复正面放置，打开上盖，将键盘向屏幕方向推，然后从靠近掌托那一端往上一撬，键盘就出来了，拔下连线。掌托更容易，从靠近键盘那一端往上提，也应手而落，拔下连线。

现 在散热器就完全暴露在视线下了，下面开始直视下手术。散热器有3颗螺丝固定，根据经验人士的说法，需要循环渐进地松开这3颗螺丝，使得散热器不会因为应力 而压坏CPU。卸下3颗螺丝后，我便按照维护手册上的说明开始撬散热器。为了避免损伤散热器和CPU，我用了一张磁卡来切入散热器和CPU之间的缝隙，代 替了网上上说的使用平口螺丝刀。然而散热器靠近显示芯片的一端纹丝不动，很显然，显示芯片和散热器结合的相当紧，而手册上根本没有提到这一点。我有点迷惑 了，于是上Google到处搜索，但依然没有收获，前进还是后退，我犹豫了一会儿。
惯性往往是推动力，我继续向前。经过仔细的观察，我发现 显示芯片和散热器之间的粘合力可能是那一圈黑色发泡橡胶带来的。一不做二不休，我拿起平口螺丝刀，将这些黑色橡胶都刮去了。似乎松动了许多，然后我拿着螺 丝刀在缝隙处用力切入，呲的一声，散热器下来了。然而我用力过猛，螺丝刀划过ATI 9600几个字，似乎还划到了主板上！差点就眼前发黑了~~~那些贴片元件，随便碰到哪一个，都是麻烦事，这下如何是好？
然后又是一番仔细检查，这次还使用了聚光手电筒。10分钟之后，我略微放了放心，没有肉眼可见的损伤。莫非今天是拆机的黄道吉日？哈哈！
散热器拆下来后，抹去表面的浮灰和硅脂，放到了超声波清洗机中。我的清洗机是中国移动积分换的，35W的功率正好，不会损坏散热器的热管。清洗机里面已经倒满了今天在化学用品店（深圳市中园化工）买的1瓶分析纯无水乙醇。正反面各清洗3分钟后，风扇已经是相当的干净了！

接 下来的工作好办，电吹风吹干（不要过热，避免损坏电机和线路板），晾干30分钟，然后添加机油。添加机油虽然简单，却也有个小插曲。网上文章都建议用注射 器来添加机油，避免过量和污染。可我问遍了附近的药店和门诊部，都不卖注射器，似乎是禁售了？而且听闻要买注射器后，营业员的脸色都怪怪的……我怎么看都 不像精神药品爱好者吧~~~没办法，只好用滴管凑合。我把上次保养用剩的福特专用发动机机油翻来覆去地滴在了转轴的附近，大概用了1ml左右（过量溢出 了）。

擦净溢出的机油后，给CPU和显卡芯片涂上硅脂，原路装回。开机，正常；Windows XP，正常；风扇，咦，风扇呢？哈哈，象征风扇存在的嗡嗡声已经没有了，又恢复了刚买回来时的宁静。希望这次大动干戈的翻新工程能支撑的久一点……
（在搜寻解决方案的过程中，发现每个提出问题的T42用家都是在使用了1年半左右就出现了风扇故障，难道这是个设计缺陷？）
（另一个更英明的选择是换一个新风扇。但我心里打定的主意是，先自己DIY一下，失败了就换新风扇，因为以保修网络的效率而言，换新风扇就意味着有N天没有T42可用。）
]]></description>
			<content:encoded><![CDATA[<p>我的Thinkpad T42买了有1年半了，总体表现令人满意。可惜最近风扇噪音越来越大，嗡嗡作响的声音，从只是夜阑人静的时候才能听到，发展到现在白天也清晰非常，恶化得相当迅速。</p>
<p><span style="background-color: #faffff;">根据以往处理散热风扇的经验，我判断这是灰尘在作祟。某黄道吉日的凌晨，拔下电池，拆下键盘，用USB吸尘器将风扇和散热器上的灰尘清理了一遍。风扇立马清静了，心满意足地关机睡觉。可惜好景不长，第三天下午便又听到了熟悉的嗡嗡声……原来这一招不灵。</span></p>
<p><span style="background-color: #faffff;">然而噪音依旧继续恶化，使得我不得不再次将笔记本拆开，对风扇和散热器进行了更为彻底的吸尘。当然，意料之中的，第二天上午，噪音便回来了。看来必须祭出杀手锏。</span></p>
<p><span style="background-color: #faffff;"><span id="more-32"></span></span></p>
<p>其实杀手锏是在Google上搜到的“5元让你油尽灯枯的风扇起死回生”一片文章中提到的超声波清洗上油的办法。原文的目标是T40p，和我的T42有小小差别。</p>
<p>首先是拆机。Thinkpad是很好拆的，既不需要专用工具，也不需要记忆各个螺丝的位置（面板上已经标识清楚了），更不必担心掰坏塑料卡扣（因为T42 14&#8243;的掌托就没有用塑料卡扣）。但谨慎起见，还是从Google搜到了“T4X硬件维护手册”，以便按图索骥。</p>
<p>根据维护手册，卸下风扇前，必须卸下电池、硬盘、键盘和掌托。</p>
<p>将 T42反面放置，电池和硬盘很容易就卸下了，拆键盘时发现螺丝还有点紧（标称2.45牛·米），换了个更合适的螺丝刀，才把4颗3号螺丝搞定。随后是掌 托，幸好这几天没有剪指甲，不然那5块遮盖螺丝空的塑料片还真不容易弄下来。卸下4颗1号螺丝，1颗2号螺丝，2颗4号螺丝，就可以拆了。</p>
<p>将T42恢复正面放置，打开上盖，将键盘向屏幕方向推，然后从靠近掌托那一端往上一撬，键盘就出来了，拔下连线。掌托更容易，从靠近键盘那一端往上提，也应手而落，拔下连线。</p>
<p><img class="alignnone size-full wp-image-55" title="t42_under" src="http://www.martinliu.info/wp-content/uploads/2006/11/t42_under.jpg" alt="t42_under" width="420" height="315" /></p>
<p>现 在散热器就完全暴露在视线下了，下面开始直视下手术。散热器有3颗螺丝固定，根据经验人士的说法，需要循环渐进地松开这3颗螺丝，使得散热器不会因为应力 而压坏CPU。卸下3颗螺丝后，我便按照维护手册上的说明开始撬散热器。为了避免损伤散热器和CPU，我用了一张磁卡来切入散热器和CPU之间的缝隙，代 替了网上上说的使用平口螺丝刀。然而散热器靠近显示芯片的一端纹丝不动，很显然，显示芯片和散热器结合的相当紧，而手册上根本没有提到这一点。我有点迷惑 了，于是上Google到处搜索，但依然没有收获，前进还是后退，我犹豫了一会儿。</p>
<p>惯性往往是推动力，我继续向前。经过仔细的观察，我发现 显示芯片和散热器之间的粘合力可能是那一圈黑色发泡橡胶带来的。一不做二不休，我拿起平口螺丝刀，将这些黑色橡胶都刮去了。似乎松动了许多，然后我拿着螺 丝刀在缝隙处用力切入，呲的一声，散热器下来了。然而我用力过猛，螺丝刀划过ATI 9600几个字，似乎还划到了主板上！差点就眼前发黑了~~~那些贴片元件，随便碰到哪一个，都是麻烦事，这下如何是好？</p>
<p>然后又是一番仔细检查，这次还使用了聚光手电筒。10分钟之后，我略微放了放心，没有肉眼可见的损伤。莫非今天是拆机的黄道吉日？哈哈！</p>
<p>散热器拆下来后，抹去表面的浮灰和硅脂，放到了超声波清洗机中。我的清洗机是中国移动积分换的，35W的功率正好，不会损坏散热器的热管。清洗机里面已经倒满了今天在化学用品店（<a href="http://szsoso.com/userweb/content.asp?webid=10004&amp;id=1174">深圳市中园化工</a>）买的1瓶分析纯无水乙醇。正反面各清洗3分钟后，风扇已经是相当的干净了！</p>
<p><img class="alignnone size-full wp-image-56" title="t42_clean" src="http://www.martinliu.info/wp-content/uploads/2006/11/t42_clean.jpg" alt="t42_clean" width="420" height="322" /></p>
<p>接 下来的工作好办，电吹风吹干（不要过热，避免损坏电机和线路板），晾干30分钟，然后添加机油。添加机油虽然简单，却也有个小插曲。网上文章都建议用注射 器来添加机油，避免过量和污染。可我问遍了附近的药店和门诊部，都不卖注射器，似乎是禁售了？而且听闻要买注射器后，营业员的脸色都怪怪的……我怎么看都 不像精神药品爱好者吧~~~没办法，只好用滴管凑合。我把上次保养用剩的福特专用发动机机油翻来覆去地滴在了转轴的附近，大概用了1ml左右（过量溢出 了）。</p>
<p><img class="alignnone size-full wp-image-57" title="t42_burette" src="http://www.martinliu.info/wp-content/uploads/2006/11/t42_burette.jpg" alt="t42_burette" width="420" height="315" /></p>
<p>擦净溢出的机油后，给CPU和显卡芯片涂上硅脂，原路装回。开机，正常；Windows XP，正常；风扇，咦，风扇呢？哈哈，象征风扇存在的嗡嗡声已经没有了，又恢复了刚买回来时的宁静。希望这次大动干戈的翻新工程能支撑的久一点……</p>
<p>（在搜寻解决方案的过程中，发现每个提出问题的T42用家都是在使用了1年半左右就出现了风扇故障，难道这是个设计缺陷？）<br />
（另一个更英明的选择是换一个新风扇。但我心里打定的主意是，先自己DIY一下，失败了就换新风扇，因为以保修网络的效率而言，换新风扇就意味着有N天没有T42可用。）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martinliu.info/2006/11/%e8%b6%85%e5%a3%b0%e6%b3%a2%e6%9c%ba%e6%b2%b9%ef%bc%8c%e7%bf%bb%e6%96%b0t42%e5%97%a1%e5%97%a1%e4%bd%9c%e5%93%8d%e7%9a%84%e9%a3%8e%e6%89%87/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Windows常用桌面软件</title>
		<link>http://www.martinliu.info/2006/10/windows%e5%b8%b8%e7%94%a8%e6%a1%8c%e9%9d%a2%e8%bd%af%e4%bb%b6/</link>
		<comments>http://www.martinliu.info/2006/10/windows%e5%b8%b8%e7%94%a8%e6%a1%8c%e9%9d%a2%e8%bd%af%e4%bb%b6/#comments</comments>
		<pubDate>Tue, 10 Oct 2006 15:23:50 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[点滴备忘]]></category>

		<guid isPermaLink="false">http://www.martinliu.info/?p=25</guid>
		<description><![CDATA[昨天一不小心把Windows XP系统搞崩溃了，连系统还原都运行不了，我也没有最近的全磁盘备份，只好重新安装。
安装好基本系统后，边下载工具软件边安装，顺便把这些工具的名字记下来备忘。根据习惯，这些工具大部分都是Open Source的。


浏览器：Firefox
压缩软件：7-Zip
文本编辑器：Notepad++
下载管理器：FileZilla, FlashGet (Freeware, 非Open Source)
Firefox下载管理器插件：DownThemAll!
Email客户端：Thunderbird

]]></description>
			<content:encoded><![CDATA[<p>昨天一不小心把Windows XP系统搞崩溃了，连系统还原都运行不了，我也没有最近的全磁盘备份，只好重新安装。<br />
安装好基本系统后，边下载工具软件边安装，顺便把这些工具的名字记下来备忘。根据习惯，这些工具大部分都是Open Source的。</p>
<p><span id="more-25"></span></p>
<ul>
<li>浏览器：Firefox</li>
<li>压缩软件：7-Zip</li>
<li>文本编辑器：Notepad++</li>
<li>下载管理器：FileZilla, FlashGet (Freeware, 非Open Source)</li>
<li>Firefox下载管理器插件：DownThemAll!</li>
<li>Email客户端：Thunderbird</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.martinliu.info/2006/10/windows%e5%b8%b8%e7%94%a8%e6%a1%8c%e9%9d%a2%e8%bd%af%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Visual C++ 2005支持可变参数宏了</title>
		<link>http://www.martinliu.info/2006/06/microsoft-visual-c-2005%e6%94%af%e6%8c%81%e5%8f%af%e5%8f%98%e5%8f%82%e6%95%b0%e5%ae%8f%e4%ba%86/</link>
		<comments>http://www.martinliu.info/2006/06/microsoft-visual-c-2005%e6%94%af%e6%8c%81%e5%8f%af%e5%8f%98%e5%8f%82%e6%95%b0%e5%ae%8f%e4%ba%86/#comments</comments>
		<pubDate>Wed, 14 Jun 2006 14:56:05 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[点滴备忘]]></category>

		<guid isPermaLink="false">http://www.martinliu.info/?p=23</guid>
		<description><![CDATA[好容易有时间试用一下Microsoft Visual C++ 2005，突然想起之前特别关注的一个特性——可变参数宏(Variadic Macros)，于是赶紧写一段代码试试（按照C99规范）。
#define ERROR(fmt, &#8230;) printf(fmt, __VA_ARGS__)
ERROR(&#8220;Args: %d %d&#8221;, 1, 2);
果然可以支持！到Microsoft Visual Studio的文档中查看新增特性的介绍，的确是实现了，看来Visual C++的可移植兼容性又提高了。
]]></description>
			<content:encoded><![CDATA[<p>好容易有时间试用一下Microsoft Visual C++ 2005，突然想起之前特别关注的一个特性——可变参数宏(Variadic Macros)，于是赶紧写一段代码试试（按照C99规范）。</p>
<p><span style="color: #0000ff;">#define</span> ERROR(fmt, &#8230;) printf(fmt, __VA_ARGS__)<br />
ERROR(<span style="color: #ff0000;">&#8220;Args: %d %d&#8221;</span>, 1, 2);</p>
<p>果然可以支持！到Microsoft Visual Studio的文档中查看新增特性的介绍，的确是实现了，看来Visual C++的可移植兼容性又提高了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martinliu.info/2006/06/microsoft-visual-c-2005%e6%94%af%e6%8c%81%e5%8f%af%e5%8f%98%e5%8f%82%e6%95%b0%e5%ae%8f%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>hexdump的一个经典格式</title>
		<link>http://www.martinliu.info/2006/02/hexdump%e7%9a%84%e4%b8%80%e4%b8%aa%e7%bb%8f%e5%85%b8%e6%a0%bc%e5%bc%8f/</link>
		<comments>http://www.martinliu.info/2006/02/hexdump%e7%9a%84%e4%b8%80%e4%b8%aa%e7%bb%8f%e5%85%b8%e6%a0%bc%e5%bc%8f/#comments</comments>
		<pubDate>Fri, 10 Feb 2006 07:13:29 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[点滴备忘]]></category>

		<guid isPermaLink="false">http://www.martinliu.info/?p=16</guid>
		<description><![CDATA[好久不用hexdump，今天用起来，发现已经忘记Format String的写法了，边man边回忆。写出来留在这里备忘。
&#8220;%07.7_Axn&#8221;
&#8220;%07.7_ax? &#8221; 8/1 &#8220;%02X &#8221; &#8220;? &#8221; 8/1 &#8220;%02X &#8221; &#8221; &#8221;
16/1 &#8220;%_p&#8221; &#8220;n&#8221;
输出的格式形如：
0000000  30 0C 02 01 01 61 07 0A  01 00 04 00 04 00 30 0C  &#8230;.a&#8230;&#8230;..0.
0000010  02 01 02 65 07 0A 01 00  04 00 04 00       [...]]]></description>
			<content:encoded><![CDATA[<p>好久不用hexdump，今天用起来，发现已经忘记Format String的写法了，边man边回忆。写出来留在这里备忘。</p>
<p><span style="background-color: #faffff;">&#8220;%07.7_Axn&#8221;<br />
&#8220;%07.7_ax? &#8221; 8/1 &#8220;%02X &#8221; &#8220;? &#8221; 8/1 &#8220;%02X &#8221; &#8221; &#8221;<br />
16/1 &#8220;%_p&#8221; &#8220;n&#8221;</span></p>
<p><span style="background-color: #faffff;">输出的格式形如：</span></p>
<p><span style="background-color: #faffff; font-family: courier new,courier,monospace; font-size: xx-small;">0000000  30 0C 02 01 01 61 07 0A  01 00 04 00 04 00 30 0C  &#8230;.a&#8230;&#8230;..0.<br />
0000010  02 01 02 65 07 0A 01 00  04 00 04 00              &#8230;e&#8230;&#8230;..<br />
000001c</span></p>
<pre>hexdump -v -e '8/1 "0x%02x, "' -e '"\n"' datafile</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.martinliu.info/2006/02/hexdump%e7%9a%84%e4%b8%80%e4%b8%aa%e7%bb%8f%e5%85%b8%e6%a0%bc%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
