<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>Qr's blog</title>
<link>http://blogger.org.cn/blog/blog.asp?name=Qr</link>
<description>Qr的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[IHttpModule、IHttpHandler访问Session异常解决之道]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49578</link>
<author>Qr</author>
<pubDate>2010/8/17 1:14:04</pubDate>
<description><![CDATA[<A></A>
<P>Asp.net实际应用中，我们经常会用IHttpModule进行身份认证或权限分配，所以，会读取Session中的用户ID，如：<BR>HttpApplication ha = (HttpApplication)sender;<BR>if(ha.Context.Session["userid"] == null || (string)ha.Context.Session["userid"] == ""){...}</P>
<P>最近迷上了IHttpHandler，后台程序全部IHttpHandler化。在引入IHttpModule进行身份认证前，文件上传、下载和删除都很正常，加入IHttpModule进行身份认证后，这些功能全部无效了。</P>
<P>错误信息如下：</P>
<P>未将对象引用设置到对象的实例。 <BR>说明: 执行当前 Web 请求期间，出现未处理的异常。请检查堆栈跟踪信息，以了解有关该错误以及代码中导致错误的出处的详细信息。 </P>
<P>异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。</P>
<P>源错误: </P>
<P>执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。&nbsp; </P>
<P>堆栈跟踪: </P>
<P><BR>[NullReferenceException: 未将对象引用设置到对象的实例。]<BR>&nbsp;&nbsp; MyHttpModule.AuthenticModule.context_PreRequestHandlerExecute(Object sender, EventArgs e) +693<BR>&nbsp;&nbsp; System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92<BR>&nbsp;&nbsp; System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +64</P>
<P>&nbsp;</P>
<P><BR>--------------------------------------------------------------------------------<BR>版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42 </P>
<P><BR>正在郁闷之时，突然想起要在IHttpHandler中访问Session，在实现IHttpHandler的同时，也要实现IRequiresSessionState接口，其命名空间为：System.Web.SessionState。</P>
<P>简单修改ashx如下，便可以解决IHttpModule进行身份认证遇到IHttpHandler访问Session异常错误的问题了。</P>
<P>&lt;%@ WebHandler Language="C#" Class="Handler" %&gt;<BR>using System;<BR>using System.IO;<BR>using System.Web;<BR><STRONG><EM>using System.Web.SessionState;</EM></STRONG></P>
<P>public partial class Handler : IHttpHandler,<STRONG><EM>IRequiresSessionState</EM></STRONG><BR>{<BR>&nbsp;public void ProcessRequest (HttpContext context) {...}</P>
<P>&nbsp;public bool IsReusable {<BR>&nbsp;&nbsp;get {<BR>&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>笔记一下，免得以后再遇到类似问题时找不着北。</P>
<P>注意：无论ashx中有无Session访问相关代码，因为IHttpModule进行身份认证或权限分配时，读取了Session，故必须在ashx中同时实现IHttpHandler和IRequiresSessionState接口。<A></A></P>]]></description>
</item><item>
<title><![CDATA[javascript动态合并JSON DATA]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49533</link>
<author>Qr</author>
<pubDate>2010/8/10 22:38:03</pubDate>
<description><![CDATA[<STRONG><EM>javascript动态合并JSON DATA<BR></EM></STRONG><BR>Author:Qr,http://Qr.blogger.org.cn<BR>Date:2010/08/10 
<P>&nbsp;<BR><STRONG><EM>method:josn.newkey=josninc.key</EM></STRONG> <BR><BR>示例： <BR>1、公共地址簿(json.ashx?meth=address.xml): <BR>{<SPAN style="COLOR: #990000">"root"</SPAN>:{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group0"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"001"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"张三"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|2"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"002"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"李四"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|2|3"</SPAN>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;], <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group1"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"003"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"王五"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|3"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"004"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"赵六"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|2|3"</SPAN>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;] <BR>}} <BR><BR>2、个人地址簿(json.ashx?meth=addressinc.xml): <BR>{<SPAN style="COLOR: #990000">"root"</SPAN>:{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group2"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"001"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"张三"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"003"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"王五"</SPAN>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;] <BR>}} <BR><BR><BR>3、script using jQuery: <BR><SPAN style="COLOR: blue">var</SPAN> deptjson = <SPAN style="COLOR: blue">null</SPAN>; <BR>$(<SPAN style="COLOR: blue">function</SPAN>(){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #ff8000">type</SPAN>:<SPAN style="COLOR: #990000">'post'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:<SPAN style="COLOR: #990000">'json.ashx?meth=address.xml'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:<SPAN style="COLOR: #990000">'json'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:<SPAN style="COLOR: blue">function</SPAN>(<SPAN style="COLOR: #ff8000">data</SPAN>, <SPAN style="COLOR: #ff8000">status</SPAN>){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deptjson = <SPAN style="COLOR: #ff8000">data</SPAN>.root; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #008080">//alert(jsonToString(deptjson)); </SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:<SPAN style="COLOR: blue">function</SPAN>(<SPAN style="COLOR: #ff8000">data</SPAN>, <SPAN style="COLOR: #ff8000">status</SPAN>, e){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #ff8000">alert</SPAN>(<SPAN style="COLOR: #990000">"err"</SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;}); <BR>}); <BR>$(<SPAN style="COLOR: blue">function</SPAN>(){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #ff8000">type</SPAN>:<SPAN style="COLOR: #990000">'post'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:<SPAN style="COLOR: #990000">'json.ashx?meth=addressinc.xml'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:<SPAN style="COLOR: #990000">'json'</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:<SPAN style="COLOR: blue">function</SPAN>(<SPAN style="COLOR: #ff8000">data</SPAN>, <SPAN style="COLOR: #ff8000">status</SPAN>){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deptjson.group2 = <SPAN style="COLOR: #ff8000">data</SPAN>.root.group2; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #008080">//alert(jsonToString(deptjson)); </SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:<SPAN style="COLOR: blue">function</SPAN>(<SPAN style="COLOR: #ff8000">data</SPAN>, <SPAN style="COLOR: #ff8000">status</SPAN>, e){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #ff8000">alert</SPAN>(<SPAN style="COLOR: #990000">"err"</SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;}); <BR>}); <BR><BR>4、result: <BR>{<SPAN style="COLOR: #990000">"root"</SPAN>:{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group0"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"001"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"张三"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|2"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"002"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"李四"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|2|3"</SPAN>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;], <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group1"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"003"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"王五"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|3"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"004"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"赵六"</SPAN>,<SPAN style="COLOR: #990000">"type"</SPAN>:<SPAN style="COLOR: #990000">"0|1|2|3"</SPAN>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;], <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: #990000">"group2"</SPAN>:[ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"001"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"张三"</SPAN>}, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<SPAN style="COLOR: #990000">"id"</SPAN>:<SPAN style="COLOR: #990000">"003"</SPAN>,<SPAN style="COLOR: #990000">"name"</SPAN>:<SPAN style="COLOR: #990000">"王五"</SPAN>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;] <BR>}}</P>
<P>原文链接：<A href="http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49533">http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49533</A><A href="http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49533"></A></P>]]></description>
</item><item>
<title><![CDATA[How to convert XML to JSON in ASP.NET C#]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=49363</link>
<author>Qr</author>
<pubDate>2010/7/16 0:06:30</pubDate>
<description><![CDATA[
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><!-- Page heading -->
<P class=gap>&nbsp;</P>
<H1>How to convert XML to JSON in ASP.NET C#</H1><!-- Page content start -->Last modified: 18 July 2006.&nbsp;&nbsp; Any comments or suggestions - <A href="http://www.phdcc.com/xml2json.htm#comments">please fill in form below</A>. Chris Cant.<BR>No download provided - cut and paste to try out. The following code is provided as-is without any warranty of any kind. 
<LI>Code to convert XML to JSON in ASP.NET C# 
<LI>Example of how to insert JSON code into a page when the page is generated 
<LI>Please acknowledge PHD Computer Consultants Ltd (PHDCC) if you use this code 
<P></P>
<DIV style="FLOAT: right" width="130" height="610">
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-8506256322678700";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "B4D0DC";
google_color_bg = "ECF8FF";
google_color_link = "0000CC";
google_color_url = "008000";
google_color_text = "6F6F6F";
//--></SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></SCRIPT>

<SCRIPT src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></SCRIPT>

<SCRIPT>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</SCRIPT>
<INS style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; VISIBILITY: visible; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 120px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; POSITION: relative; HEIGHT: 600px; BORDER-BOTTOM-STYLE: none"><INS style="PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; VISIBILITY: visible; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 120px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; POSITION: relative; HEIGHT: 600px; BORDER-BOTTOM-STYLE: none"></INS></INS></DIV><!--++++++++++++++++++++++++++++++++++++++++++++++++++-->
<H2>Introduction</H2>
<P><A href="http://www.json.org/" target=_blank><ACRONYM title="JavaScript Object Notation">JSON</ACRONYM></A> is a lightweight data-interchange format. It is particularly useful because it can be 'decoded' easily by web page JavaScript into object form. </P>
<P><ACRONYM title="Asynchronous JAvaScript and XML">AJAX</ACRONYM>-based web pages use XmlHttpRequest to receive data from a server in response to a user action. While the returned data is normally in XML format, it can also be returned in JSON string format and processed more easily in JavaScript. </P>
<P>Many applications may store information in XML format. However they may want to send data to a client using JSON. To achieve this, they must convert their XML data into JSON format. The ASP.NET C# code below does this job. </P>
<H2>Code Description</H2>The code provides a method <CODE>private static string XmlToJSON(XmlDocument xmlDoc)</CODE> that converts an XmlDocument into a JSON string. The code iterates through each XML element, its attributes and children, creating the corresponding JSON objects. 
<UL>
<LI>The code never generates number or boolean values. 
<LI>The XML documentElement is always reported as member:object even if it could be shortened by the following rules. 
<LI>Element attributes are converted into member "attr_name":"attr_value". <CODE>
<TABLE style="BORDER-RIGHT: orange 1px dotted; BORDER-TOP: orange 1px dotted; BORDER-LEFT: orange 1px dotted; BORDER-BOTTOM: orange 1px dotted">
<TBODY>
<TR>
<TH bgColor=pink>XML</TH>
<TH>JSON</TH></TR>
<TR>
<TD bgColor=pink>&lt;xx yy='nn'&gt;&lt;/xx&gt;</TD>
<TD>{ "xx": {"yy":"nn"} }</TD></TR>
<TR>
<TD bgColor=pink>&lt;xx yy=''&gt;&lt;/xx&gt;</TD>
<TD>{ "xx": {"yy":""} }</TD></TR></TBODY></TABLE></CODE>
<LI>Element children with no attributes, children or text are converted into member "child_name":null <CODE>
<TABLE style="BORDER-RIGHT: orange 1px dotted; BORDER-TOP: orange 1px dotted; BORDER-LEFT: orange 1px dotted; BORDER-BOTTOM: orange 1px dotted">
<TBODY>
<TR>
<TH bgColor=pink>XML</TH>
<TH>JSON</TH></TR>
<TR>
<TD bgColor=pink>&lt;xx/&gt;</TD>
<TD>{ "xx":null }</TD></TR></TBODY></TABLE></CODE>
<LI>Element children with no attributes or children but contain text are converted into "child_name":"child_text" <CODE>
<TABLE style="BORDER-RIGHT: orange 1px dotted; BORDER-TOP: orange 1px dotted; BORDER-LEFT: orange 1px dotted; BORDER-BOTTOM: orange 1px dotted">
<TBODY>
<TR>
<TH bgColor=pink>XML</TH>
<TH>JSON</TH></TR>
<TR>
<TD bgColor=pink>&lt;xx&gt;yyy&lt;/xx&gt;</TD>
<TD>{ "xx":"yyy" }</TD></TR></TBODY></TABLE></CODE>
<LI>Other element attributes and children are converted into "child_name":object or an array "child_name":[elements] as appropriate, with element text converted into a member with name "value" <CODE>
<TABLE style="BORDER-RIGHT: orange 1px dotted; BORDER-TOP: orange 1px dotted; BORDER-LEFT: orange 1px dotted; BORDER-BOTTOM: orange 1px dotted">
<TBODY>
<TR>
<TH bgColor=pink>XML</TH>
<TH>JSON</TH></TR>
<TR>
<TD bgColor=pink>&lt;xx yy='nn'&gt;&lt;mm&gt;zzz&lt;/mm&gt;&lt;/xx&gt;</TD>
<TD>{ "xx": {"yy":"nn", "mm":"zzz"} }</TD></TR>
<TR>
<TD bgColor=pink>&lt;xx yy='nn'&gt;&lt;mm&gt;zzz&lt;/mm&gt;&lt;mm&gt;aaa&lt;/mm&gt;&lt;/xx&gt;</TD>
<TD>{ "xx": {"yy":"nn", "mm": [ "zzz", "aaa" ] } }</TD></TR>
<TR>
<TD bgColor=pink>&lt;xx&gt;&lt;mm&gt;zzz&lt;/mm&gt;some text&lt;/xx&gt;</TD>
<TD>{ "xx": {"mm":"zzz", "value":"some text"} }</TD></TR>
<TR>
<TD bgColor=pink>&lt;xx value='yyy'&gt;some text&lt;mm&gt;zzz&lt;/mm&gt;more text&lt;/xx&gt;</TD>
<TD>{ "xx": {"mm":"zzz", "value": [ "yyy", "some text", "more text" ] } }</TD></TR></TBODY></TABLE></CODE>
<LI>Characters are made safe for conversion into JSON. Note that this does not protect your JavaScript from attack if any of the source XML comes from an unsafe source, eg user input. <CODE>
<TABLE style="BORDER-RIGHT: orange 1px dotted; BORDER-TOP: orange 1px dotted; BORDER-LEFT: orange 1px dotted; BORDER-BOTTOM: orange 1px dotted">
<TBODY>
<TR>
<TH bgColor=pink>XML</TH>
<TH>JSON</TH></TR>
<TR>
<TD bgColor=pink>&lt;aa&gt;/z'z"z\yyy&lt;aa&gt;&lt;</TD>
<TD>{"aa": "\/z\u0027z\"z\\yyy" }</TD></TR></TBODY></TABLE></CODE></LI></UL>
<P>In some special circumstances, such as in the <A href="http://www.phdcc.com/xml2json.htm#using">example below</A>, you may need to escape the backslash characters again, eg: </P>
<DIV class=dottedSection><CODE>string JSON = XmlToJSON(doc);<BR>JSON = JSON.Replace(@"\", @"\\");</CODE> </DIV>
<P>Note that there may be security implications for web pages using unchecked XML contents. </P>
<H2>Example</H2>The examples on this page come from my <A href="http://www.spacebrowse.com/" target=_blank>Space Browse</A> site. 
<P>XML Input:</P>
<DIV class=dottedSection><PRE>&lt;space name="Cake Collage"&gt;
&lt;frame&gt;
  &lt;photo img="cakecollage1.jpg" /&gt;
  &lt;text string="Browse my cake space" /&gt;
  &lt;rule type="F" img="cakecollage9.jpg" x="150" y="0" w="300" h="250" /&gt;
  &lt;rule type="F" img="cakecollage2.jpg" x="0" y="0" w="150" h="220" /&gt;
&lt;/frame&gt;
&lt;frame&gt;
  &lt;photo img="cakecollage2.jpg" /&gt;
  &lt;rule type="B" img="cakecollage1.jpg" /&gt;
  &lt;rule type="L" img="cakecollage3.jpg" /&gt;
&lt;/frame&gt;
&lt;/space&gt;
</PRE></DIV>
<P>JSON Output (re-formatted):</P>
<DIV class=dottedSection><PRE>{ "space":
  { "name": "Cake Collage",
    "frame": [ {"photo": { "img": "cakecollage1.jpg" },
                "rule": [ { "type": "F",
                            "img": "cakecollage9.jpg",
                            "x": "150",
                            "y": "0",
                            "w": "300",
                            "h": "250"
                          }, 
                          { "type": "F",
                            "img": "cakecollage2.jpg",
                            "x": "0",  
                            "y": "0",  
                            "w": "150",  
                            "h": "220" 
                          }
                        ],
                "text": { "string": "Browse my cake space" }
               },
               {"photo": { "img": "cakecollage2.jpg" },
                "rule": [ { "type": "B", "img": "cakecollage1.jpg" },
                          { "type": "L",  "img": "cakecollage3.jpg" }
                        ]
               }
             ]
  }
}
</PRE></DIV>
<P>Once the JSON has been converted into a JavaScript object, eg called <CODE>space_DOM</CODE>, the following objects are available:</P>
<UL>
<LI>space_DOM.space.name 
<LI>space_DOM.space.frame.length 
<LI>space_DOM.space.frame[0].text.string 
<LI>space_DOM.space.frame[0].rule[0].type </LI></UL>
<P>Your JavaScript code should be flexible to cope with members not existing, members existing as a single value, or members existing as an array. I find it useful to have a JavaScript function <CODE>ObjectToArray</CODE> which converts all these cases into an Array of length 0, 1 or greater. </P>
<DIV class=dottedSection><PRE>function ObjectToArray( obj)
{
    if( !obj) return new Array();
    if( !obj.length) return new Array(obj);
    return obj;
}

space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);
</PRE></DIV>
<H2>XmlToJSON C# code</H2>You may wish to use some of the updates suggsted in the comments below. 
<DIV class=dottedSection><PRE>private static string XmlToJSON(XmlDocument xmlDoc)
{
    StringBuilder sbJSON = new StringBuilder();
    sbJSON.Append("{ ");
    XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);
    sbJSON.Append("}");
    return sbJSON.ToString();
}

//  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
{
    if (showNodeName)
        sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
    sbJSON.Append("{");
    // Build a sorted list of key-value pairs
    //  where   key is case-sensitive nodeName
    //          value is an ArrayList of string or XmlElement
    //  so that we know whether the nodeName is an array or not.
    SortedList childNodeNames = new SortedList();

    //  Add in all node attributes
    if( node.Attributes!=null)
        foreach (XmlAttribute attr in node.Attributes)
            StoreChildNode(childNodeNames,attr.Name,attr.InnerText);

    //  Add in all nodes
    foreach (XmlNode cnode in node.ChildNodes)
    {
        if (cnode is XmlText)
            StoreChildNode(childNodeNames, "value", cnode.InnerText);
        else if (cnode is XmlElement)
            StoreChildNode(childNodeNames, cnode.Name, cnode);
    }

    // Now output all stored info
    foreach (string childname in childNodeNames.Keys)
    {
        ArrayList alChild = (ArrayList)childNodeNames[childname];
        if (alChild.Count == 1)
            OutputNode(childname, alChild[0], sbJSON, true);
        else
        {
            sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
            foreach (object Child in alChild)
                OutputNode(childname, Child, sbJSON, false);
            sbJSON.Remove(sbJSON.Length - 2, 2);
            sbJSON.Append(" ], ");
        }
    }
    sbJSON.Remove(sbJSON.Length - 2, 2);
    sbJSON.Append(" }");
}

//  StoreChildNode: Store data associated with each nodeName
//                  so that we know whether the nodeName is an array or not.
private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
{
	// Pre-process contraction of XmlElement-s
    if (nodeValue is XmlElement)
    {
        // Convert  &lt;aa&gt;&lt;/aa&gt; into "aa":null
        //          &lt;aa&gt;xx&lt;/aa&gt; into "aa":"xx"
        XmlNode cnode = (XmlNode)nodeValue;
        if( cnode.Attributes.Count == 0)
        {
            XmlNodeList children = cnode.ChildNodes;
            if( children.Count==0)
                nodeValue = null;
            else if (children.Count == 1 &amp;&amp; (children[0] is XmlText))
                nodeValue = ((XmlText)(children[0])).InnerText;
        }
    }
    // Add nodeValue to ArrayList associated with each nodeName
    // If nodeName doesn't exist then add it
    object oValuesAL = childNodeNames[nodeName];
    ArrayList ValuesAL;
    if (oValuesAL == null)
    {
        ValuesAL = new ArrayList();
        childNodeNames[nodeName] = ValuesAL;
    }
    else
        ValuesAL = (ArrayList)oValuesAL;
    ValuesAL.Add(nodeValue);
}

private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
{
    if (alChild == null)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
        sbJSON.Append("null");
    }
    else if (alChild is string)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
        string sChild = (string)alChild;
        sChild = sChild.Trim();
        sbJSON.Append("\"" + SafeJSON(sChild) + "\"");
    }
    else
        XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
    sbJSON.Append(", ");
}

// Make a string safe for JSON
private static string SafeJSON(string sIn)
{
    StringBuilder sbOut = new StringBuilder(sIn.Length);
    foreach (char ch in sIn)
    {
        if (Char.IsControl(ch) || ch == '\'')
        {
            int ich = (int)ch;
            sbOut.Append(@"\u" + ich.ToString("x4"));
            continue;
        }
        else if (ch == '\"' || ch == '\\' || ch == '/')
        {
            sbOut.Append('\\');
        }
        sbOut.Append(ch);
    }
    return sbOut.ToString();
}
</PRE></DIV><A name=using></A>
<H2>Using XmlToJSON</H2>
<P>The following code shows how to use XmlToJSON() when an ASP.NET 2 page loads. It then uses the ASP.NET2 ClientScriptManager to insert code containing the JSON string into the web page. See the following section for an example of JavaScript <CODE>space_processJSON()</CODE>. </P>
<DIV class=dottedSection><PRE>protected void Page_Load(object sender, EventArgs e)
{
    XmlDocument doc = new XmlDocument();
    try
    {
        string path = Server.MapPath(".");
        doc.Load(path+"whatever.xml");
    }
    catch (Exception ex)
    {
        lblError.Text = ex.ToString();
        return;
    }

    // Convert XML to a JSON string
    string JSON = XmlToJSON(doc);
    
    // Replace \ with \\ because string is being decoded twice
    JSON = JSON.Replace(@"\", @"\\");
    
    // Insert code to process JSON at end of page
    ClientScriptManager cs = Page.ClientScript;
    cs.RegisterStartupScript(GetType(), "SpaceJSON", "space_processJSON('" + JSON + "');", true);
}
</PRE></DIV>
<H2>Client-side code</H2>
<DIV class=dottedSection><PRE>&lt;script src="space/json.js" type="text/javascript"&gt;&lt;/script&gt;

&lt;script type="text/javascript"&gt;
function space_processJSON( JSON)
{
    space_DOM = JSON.parseJSON();
    if( !space_DOM)
    {
        alert("JSON decode error");
        return;
    }
    space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);
    space_frameCount = space_DOM.space.frame.length;
    .. or whatever
}
&lt;/script&gt;
</PRE></DIV></LI></TD></TR></TBODY></TABLE>原文出自：<A href="http://www.phdcc.com/xml2json.htm">http://www.phdcc.com/xml2json.htm</A>]]></description>
</item><item>
<title><![CDATA[批处理更新WinRAR自解压文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=48847</link>
<author>Qr</author>
<pubDate>2010/5/5 20:23:08</pubDate>
<description><![CDATA[
<P>随着网络用户的增加，使用内网电子邮件服务的内网用户也越来越多，指导安装邮件客户端和更新地址簿就成了经常性的工作。为了减少客户端安装的工作量，偶一次性将前期所有用户全部配置好，并制作成自解压文件，上传到FTP上。如果用户需要重新安装邮件客户端，只须登录FTP下载对应的自解压包，双击安装即可。但后来增加的用户，其邮箱地址在最新的地址簿中，前期配置并制作的客户端自解压包中还使用旧的地址簿。由于担心病毒感染，客户端自解压包被锁定了，实在不方便往里更新文件。好在WinRAR支持命令行，批处理在这里就可以大显身手了。 </P>
<P>@<span style="color:blue">echo</span> <span style="color:#FF8000">off</span>&amp;<span style="color:blue">setlocal</span> <span style="color:#FF8000">enabledelayedexpansion</span>
<br/><span style="color:#008080">:: Qr,http://Qr.blogger.org.cn
</span><br/><span style="color:#008080">:: 2010/05/05
</span><br/><span style="color:blue">cls</span>
<br/><span style="color:blue">set</span> tmpforder=临时文件夹
<br/><span style="color:blue">rd</span> /s /q <span style="color:#ff1493">%tmpforder%</span> &amp; <span style="color:blue">md</span> <span style="color:#ff1493">%tmpforder%</span>&gt;<span style="color:#FF8000">nul</span>
<br/><span style="color:blue">set</span> fname=dept.txt
<br/><span style="color:blue">cd</span>.&gt;<span style="color:#ff1493">%fname%</span>
<br/><span style="color:blue">for</span> %%i in (*.exe) <span style="color:#FF8000">do</span> (
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">set</span> fn=%%i
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">for</span> /d %%j in (!fn!) <span style="color:#FF8000">do</span> <span style="color:blue">echo</span> %%j &gt;&gt; <span style="color:#ff1493">%fname%</span>
<br/>)
<br/>
<br/><span style="color:blue">for</span> /f %%i in (!fname!) <span style="color:#FF8000">do</span> (
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">set</span> str=%%i
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">set</span> str=!str<span style="color:#008080">:~0,-4!
</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">rd</span> /s /q mail
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">echo</span> 正在解压自解压包： {%%i}&amp;<span style="color:blue">echo</span>.
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#990000">"C:\Program Files\WinRAR\RAR.exe"</span> x -o+ -y <span style="color:#990000">"%%i"</span>&gt;<span style="color:#FF8000">nul</span>
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">echo</span> 正在替换 {!str!} 的地址簿...&amp;<span style="color:blue">echo</span>.
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">copy</span> /y address mail\address
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">echo</span>.
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">echo</span> 正在重建 {!str!} 自解压包...&amp;<span style="color:blue">echo</span>.
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#990000">"C:\Program Files\WinRAR\WinRAR.exe"</span> a -as -k -r -sfx -zremarks.txt <span style="color:#990000">"!tmpforder!\!str!"</span> mail
<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:blue">echo</span> ***********************************&amp;<span style="color:blue">echo</span>.
<br/>)
<br/><span style="color:blue">echo</span>.&amp;<span style="color:blue">echo</span>.&amp;<span style="color:blue">echo</span> 压缩包处理完毕！
<br/><span style="color:blue">pause</span>
<P></P>
<P><SPAN style="COLOR: blue"></SPAN>简单解释一下以上代码：</P>
<P>第一个for循环输出当前目录下所有的自解压文件（后缀为exe）；</P>
<P>第二个for循环依次解压客户端自解压文件，并更新地址簿文件，然后重新打包生成客户端自解压包。</P>
<P>软件下载站点有多少个是提供原创下载的，不都是从别人的站点上DOWN下来，更新自己的下载点信息后重新打包上传到自己的站点上供用户下载吗？！这个东西可以用得上，虽然功能上还需要提升，不过对于自己来说，简单的应用足以，而且可以灵活的改变，满足不同情况下的需要，何必专门上网搜哪些“专业”的工具？！下来了还不一定好用，还是那句话，自己动手，丰衣足食。</P>]]></description>
</item><item>
<title><![CDATA[实战跨网段共享非网络打印机]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=48817</link>
<author>Qr</author>
<pubDate>2010/4/29 18:43:46</pubDate>
<description><![CDATA[<P>实战跨网段共享非网络打印机</P>
<P>单位里多台计算机分布在各个办公室，但只有一台打印机，其它的打印机都接在内网的计算机，除非刻盘，不能通过U盘复制过去打印。为了解决打印难的问题，打印机共享是最好的办法。</P>
<P>同网段的计算机，建立共享就可以轻松把问题解决，可是跨网段就不好办了。此前网络改造已将所有终端用户中IP改用A类地址，而原来提供邮件服务的服务器IP仍使用C类地址，这台服务器偶尔也有文件要打印机，干脆就一起调整吧，没想到跨网段共享非网络打印机还真是问题多多。这里，总结一下跨网段共享非网络打印机的经验教训，同大家分享。</P>
<P>先说一下网络结构：服务器（Windows OS）使用C类地址，在192.168.100.0网段，IP为192.168.100.100/24；办公网络计算机使用A类地址，在10.10.10.0网段，接打印机的计算机（打印服务器，XP系统）IP为10.10.10.5/24；两个网段（分属不同的VLAN）的计算机通过三层交换机互访，网关都在三层交换机上。</P>
<P>搜索网络查阅跨网段共享打印机相关问题，均称在hosts文件中增加打印服务器IP地址及计算机名，即可实现跨网段共享打印机，实际应用，不敢确认此方案可行，因为偶按此作法，非但无法共享打印机，在服务器的网络邻居里除了自己，找不任何一个“邻居”。偿试了网络上提供的很多方法，都没有成功，而且，10.10.10.0网段上有台同OS版本的服务器按常规操作很轻松就创建好共享打印机服务了，所以，偶只能怀疑是该服务器的问题，比如服务项、网络协议等，具体什么原因一时难以确定，必竟相互PING IP能通，PING计算机名也通，说明两台机子的网络协议安装正确，NetBIOS解析也正常，安装的防火墙也没有阻碍网络连接，对于从该服务器上着手，偶已经找不到其它方案了，几天下来都没有任何进展。</P>
<P>该不会是打印服务器的问题吧？可同网段内的计算机都可以正常共享打印机，包括一台同OS版本的服务器。在打印服务器随便浏览，无意间发现该计算机的本地连接启用了 windows 防火墙，而网络上的资料都明确指出，windows 防火墙不防碍共享打印机，谁知道呢，网络上资料，难免以面盖全。随手关闭 windows 防火墙，再建立跨网段共享打印机，成功了，原因居然是打印服务器上启用了 windows 防火墙。把hosts恢复为原始状态，丝毫不影响打印机共享。不过操作上有些变化，具体步骤如下：</P>
<P>1、按照常规方法配置好打印机共享（这一步网络上有太多资料，不再重复）；</P>
<P>2、右键单击Windows服务器的“网上邻居”，选择“搜索计算机”，输入打印服务器（连接打印机计算机）的IP地址，搜索，片刻后即可看到共享打印机；</P>
<P>3、开始-&gt;设置-&gt;打印机和传真，打开打印机窗口，鼠标左键单击共享打印机图标，拖动其到打印机窗口松开，共享打印机连接创建完成。</P>
<P>注：此法还不能将打印服务器添加到跨网段服务器的网上邻居中，所以通过添加打印机的方法似乎无效，并提示无法连接到打印机。另，如果在三层交换机上配置了禁止VLAN互访，那就没办法了。</P>
<P>本文针对本人在实际配置过程中遇到的问题，并非普遍作法，仅供交流参考。<A></A></P>]]></description>
</item><item>
<title><![CDATA[一点收获]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=48419</link>
<author>Qr</author>
<pubDate>2010/3/16 21:42:57</pubDate>
<description><![CDATA[<A></A>
<P><A>我的老领导有句口头禅，不能</A>因为有人有不同意见，就什么工作都不做了。正因为这句话，无论单位同事意见如何，做何评估，有何风险，老领导全然不顾，按照自己的想法去做，直到退居二线，同事对其功过仍然是褒贬不一。</P>
<P>对于本次网络改造，他的拧劲让我感受到拧的好处了。因为在我到本单位上班前，网络已经建设完成，但是由于是使用普通交换机，而且网络结构非常不合理，所以，管理维护工作非常辛苦。经过努力，网络扩容改造得到上级的批准，经费很快落实。作为管理技术人员，我当然从方便管理、功能齐全、效益明显的角度去考虑网络的建设。老领导虽不懂技术，但懂得技术在网络建设和管理维护中的重要意义，当然这有我多年网络管理维护的经验总结和他负责本部门工作积累下来的经验教训。所以，在网络扩容改造这件事上，无论我提出什么要求，他都满足我。但是，他的副职却不理解网络改造经费为何如此之高，特别是交换机的价钱，因此，在不同的场合，他经常在我面前质疑网络扩容改造的必要。</P>
<P>另外，新录用的网络管理技术员已经半年多了，对于网络管理维护还是一知半解，更不会积极主动去做事，说得最多的是，不熟悉局域网的结构，所以遇到网络故障就无所适从。晕。</P>
<P>新领导上任后，对于网络改造也抓得比较紧，但是从其他部门过来，也不是很熟悉本部门的工作，特别是网络方面。借此机会，我向新领导提议，组织开展一个网络技术培训业务，让部门同事都对网络及管理维护有所了解。新领导非常支持我这一想法，但副职却有不同想法，因此计划几乎要落空了。如果这个培训会开不成，以后网络管理维护的责任始终由我一个人承担，那怎么可能，技术员又不只我一个，活却是我一个人干。特别是网络改造完成了，那些所谓领导都不明白改造的意义和好处。想到这，我当然有点心凉。今天恰好没事，趁着领导都在，也没给领导思考的机会，我索性提出组织开展网络技术业务培训会，新领导应允。</P>
<P>局域网管理维护是我部门一个比较重的业务，领导也不敢轻视，终于让所有人围在会议室听我的培训课了。在培训过程中，恰好有两个部门打电话申告网络故障，我没有离开会议室，直接通过培训用的本本现场解决问题，足不出户，立刻指出一台电脑不存在网络故障，而是操作不正确。另一台电脑被怀疑是网线松脱，电话通知对方稍作处理，电脑联网立即恢复正常……会议室里两位女同事啧啧称奇，两个领导也绝没想到技术员足不出户居然能立刻解决远端电脑故障，一脸不可思议的表情（我甚至怀疑他们会不会认为我找托儿，呵呵）。本来打算半个小时，最多一个小时的业务培训，由于大家参与的热情非常高，在我没有讲义也没有准备的情况下，培训持续了两个小时。效果非常好，特别是解决了那个副职的疑问，让他了解了引用三层、二层交换机的对于局域网管理维护的好处和效益，新来的技术员也了解了新网络的结构和基本的管理维护技能。下午，再接到网络故障申告时，新同事懂得主动去解决问题了，想必是看到与我的差距了吧：）</P>
<P>我不敢说将来会怎样，至少今天算是一个小胜利吧。如果我不坚持，那么这个培训会肯定开不成，大家就有推拖责任的借口了。老领导那句口头禅，虽然我不完全赞同，但是道理还是有的。有些事情，只有没有坏处，或者就有利于工作的更好开展，该坚持的还的坚持，做到问心无愧就是了。</P>]]></description>
</item><item>
<title><![CDATA[最近比较累]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=48415</link>
<author>Qr</author>
<pubDate>2010/3/15 23:55:39</pubDate>
<description><![CDATA[<P>元旦之后就没时间去驾校练车，因为网络干线改造完成后，就马不停蹄地将主机从旧的网络调整到新网络中。节前两个星期，向领导建议，抽调两个人和我搭档，争取网络节前调整完毕。建议被领导否决了，三到四天才做一天工，看这进度，心累比体力劳动还累……</P>
<P>由于设备全部换新，对于设备的应用，适应还得有个过程，偏偏上面的领导喜欢通过电子邮件联系工作，网络不正常肯定挨骂。部门领导面子上过不去，就想拿我示问，可是不给我人手赶工，我当然也不会给部门领导面子。心里不痛快也没办法，赶紧联系厂家解决，技术上又没个商量的，一个人在机房里摸索，还是累……</P>
<P>网络改造多多少少会影响到正常的宽带上网，很多用户都不理解我们的工作。改造前用户过载就抱怨网速慢，真要改造了，又抱怨影响宽带上网，这些人，就这德行。抱怨的电话打不停，解释工作实在累……</P>
<P>网络改造还没完成，老泰山查出了肝Ca，现代医术已经无能为力了，只好回乡下老家休养；老母亲血压高，心脏不好，送到附属医院住院，我这边又是儿子又是女婿，两头跑，人累心更累……好在过两天老母亲就要出院了。</P>
<P>本月12日，调整配置完两间重要的办公室电脑后，网络改造终于告一段落了，至少不会影响到老用户正常的上网需求了，也就没什么压力了。不过工作去留的事又让我难以决定：有个单位来挖人，冲着我来的，因为他们在本地找不到一个象我一样精通网络管理组建和软件开发应用的人。比较两个单位，各有优势，所以，难以取舍。</P>
<P>Qr的近况……用一个字代替：累！</P>]]></description>
</item><item>
<title><![CDATA[Qr祝大家虎年春节快乐！]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=48176</link>
<author>Qr</author>
<pubDate>2010/2/13 10:07:26</pubDate>
<description><![CDATA[<P>Qr最近两个月比较忙，没有时间经常上网更新博客，光顾各位博友的博客更少了。非常感谢大家还记得Qr，到本博踩踩。</P>
<P><A>虎年春节到了，Qr</A>祝大家新春愉快，虎年吉祥！</P>]]></description>
</item><item>
<title><![CDATA[犯了一个程序员的超低级错误]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47633</link>
<author>Qr</author>
<pubDate>2009/11/30 14:29:24</pubDate>
<description><![CDATA[<A></A>
<P><A>近段时间，单位一直在</A>进行网络改造，由于改造规划的大方案是我定的，骨干网络建成后的内部的规划和配置也是由我进行，这样一来，我就可以把自己对网络建设和管理规的想法付诸于实际了，这是一个很令自己兴奋的事情。</P>
<P>但是，光有规划没有管理不行，所以现在我又把自己从一个网络管理员的身份抽出来，作为一个程序员开发一些配套的管理工具和软件。其中一个小工具就是自动检测分析和配置计算机网络连接属性的工具。写这个工具的目的是，当我这个身兼多职的网络管理员不能及时处理电脑联网故障时，稍懂一些“三角猫功夫”的同事可以拿一张网络管理工具盘去检测配置网络联接，解决一些简单的网络故障。</P>
<P>网络管理用得最多的，应该是命令行提示符，而自己也稍懂一点DOS批处理编程，于是就决定用批处理来写这个工具。代码到不长，但是一个超低级的错误，却害得我煞费苦心去调试代码，花了一个晚上调试都没通过。</P>
<P>早上去上班，打开笔记本再调试代码，一段一段用ECHO去跟踪调试，这才发现变量重名导致变量冲突了。规范的命名一般是不会出现变量重名的，只是不知道怎么会大意到出现这样的低级错误呢？为了认清CALL传参时，各参数容易识别，两次CALL同一LABEL时，分别使用大写变量名和小写变量名，但批处理是不区分大小写的，而且这个问题我还是很清楚的。原来是我喜欢在记事本上写JAVASCRIPT，也常用记事来写XML解决论坛上网友的问题，而JAVASCRIPT和XML严格区分大小写，所以，这段时间写代码写糊涂了，不加思索就应用于批处理。</P>
<P>问题总算是顺利解决了，可是这超低级的错误，却害得我白白浪费了一个晚上的时间去调试代码，得不偿失。经过这一次教训，再次调试代码时，我一定会留心变量的问题，不能只关心代码和语法正确与否。</P>
<P>从编程问题回到现实世界，我们在探究这个社会的同时，应该留意细节的问题，要不然对这个社会的认识就不全面，很容易在工作生活和学习过程中陷入误区而不能自拔。</P>
<P>P.S:后面这段显得有点夸张，同前面严重脱节，不过，今天在办公室里发生了一件不愉快的事情，似乎和上面的低级错误有相似之处，所以，我可以接受这个脱节，主要是提醒自己小心从事。</P>]]></description>
</item><item>
<title><![CDATA[陌生的老同学]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47580</link>
<author>Qr</author>
<pubDate>2009/11/25 15:26:14</pubDate>
<description><![CDATA[<A></A>
<P>由于设备采购的问题，网络改造的进度一拖再拖，直到昨天，设备基本到位，负责网络布线的公司才过来熔接光纤。既要配合他们工作，又要和电信部门的技术员商量网络建设的问题，忙得不可开交。</P>
<P>今天休息在家，布线工程也在继续。中午时分头儿临时拉上我去说明新增加的那条光缆的走线，也是这个时候我才得知负责这次光纤熔接的工头姓韦。</P>
<P>其实昨天就觉得韦姓小工头很眼熟，头上隐现的白发和稍稍胖的体态显得这个人比较成熟稳重，沧桑感比较强，应该不是我这般年纪的人。可今天指路的过程中，得知他姓韦，还有他那身形体态和言谈都很象我一个小学的同学，特别是说话的时候，下唇右侧外翻这个印象非常深刻，二者的形象几乎重叠在一块。刹那间的冲动让我顾不上礼节打断他们两人之的工作谈话问道：“你是不是韦某某？”</P>
<P>对方也很诧异：“是啊，你是谁？我真的想不起来了。”</P>
<P>我赶紧回答：“我是某某，咱们可是小学同班同学，班主任是苏某某。”</P>
<P>……</P>
<P>简单几句对话之后，内容又回到工作上来。必竟17年不曾谋面也没有音讯了，其实，大家心里都明白，即便是多年同窗，17年的岁月和经历已经足够冲淡了老同学这层关系。只是想起当年一起上下学，大家都玩得很开心，况且我们俩关系还不错，特别是大家相互学习对方方言的时候，很多同学都把粗口当好的东西教我们，韦冬瓜（他的绰号）都一一帮我纠正。还有，他还吹得一口好叶笛，这本事至今让我羡慕不已。</P>
<P>也许是性格、兴趣爱好等问题，上小学时我的朋友就比较少，中学大学时期倒是结交了不少朋友，但如今多是天南地北，况且那个时期似乎我所在的班级都谈不上团结友爱，同学聚会最终成为几个小团体的聚会，都无法坚持下去，加之时间空间的分隔，对于我来说，所谓老同学，大都需要加上一个定语——陌生的。</P>
<P>无论是老同学变得陌生，还是朋友变成陌路，都不必太过于感慨。如果一定要感慨，那只能感慨社会的发展，大家都在为生计而奔波，为家庭而忙碌，必竟大家都是这个大社会里平凡的一员。</P>]]></description>
</item><item>
<title><![CDATA[身边的7080后一代]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47540</link>
<author>Qr</author>
<pubDate>2009/11/18 23:31:57</pubDate>
<description><![CDATA[身为70后的我，不会因为自己属于70后，就觉得80后无论如何都比不上70后。身边有几位80后，工作态度非常认真，成绩很显著，有时候我都觉得自己心底里佩服他们几个。而身边的70后，除了工作态度认真，成绩显著，更多几分稳重且干劲十足，能力足够强而不忘保持一份谦虚。相比起来，我更喜欢和70后的搭档，但也不排除优秀的80后。
<P>记得刚参加工作的时候，有个同事一起分过来，还是一个小区里住的，高中的时候骑车上下学认识的，工作后成了同事和朋友。虽说是70后，但和80后一起成长，难免被人当作80后一代。工作任劳任怨，只是很粗心，经常错漏百出，其它就不说了，每月一次报表几乎都被我枪毙。不是我不够朋友，一式两份的报表都有两份不一致的低级错误，甚至数字之间没有逻辑关系，只能发回重做。</P>
<P>后来，我离开了那个单位。走之前，在我们之间的私聊中，我再三叮嘱他不要接我的位置，因为他不适合做统计工作。半年后，他跟我说领导安排他接替了我的空缺。一年半后，我从一份文件中得知他们部门因为统计数字严重不真实被通报。此时他已离开那个部门三个月，然而我清楚问题的根本所在，虽然主要过错不是他，但因为领导要求做假时，他不会平衡历史遗留问题，导致这个数据偏差越来越大，最终问题暴露出来。其实我早就知道这个问题迟早要曝光，所以当我有机会时，赶紧离开这个位置，我不愿做假报表，更不想当领导的替罪羊。可是我的叮嘱比不上领导的压力，他最终接了这个空缺。</P>
<P>还好，事发前，他离开了那个部门。可是，到了新部门，他的日子也不好过，本级领导骂，上级领导批。如今是见本级领导陪笑脸，遇上级领导能躲就躲。每次见到我就摇头，叹气没前途……</P>
<P>除此之外，我的多数70后朋友就不简单了。精力旺盛，能力超强，都是岗位上的业务骨干和技术尖兵，少数人已经开始走向领导岗位。也许是70后一代经历得更多，所以在经济高速发展的环境下，更懂得珍惜眼前所拥有的，所以他们在今天似乎显得更突出。</P>
<P>同我一样，他们对身边的80后意见非常大。也许是独生子女一代，千般娇贵万般宠爱聚一身，80后一代在更多情况下，显得精神萎迷，能力平平，工作上从不会积极主动，得过且过，而且非常计较个人得失……</P>
<P>前两天，在路上遇到一个高中同学，没事闲聊几句。他在某党政办从事办公室工作的，笔杆子不错，有不错的文字材料组织能力，资料收集经验比较丰富，是块从事办公室工作的材料。除了聊高中的同学，他最多的是抱怨身边的80后，工作不积极，脾气倒不小，工作上没经验还不听劝，动作奇慢还错漏百出。说多了不听，报告领导最多就是得到新手要好好带这样的话……</P>
<P>写到这倒让我想起前两天在本地一个论坛上贴出当地某党政办印发的一个文件，落款日期居然是“2009年9月39日”！9月份有39日吗？如果说是粗心还可以说得过去，可是抬头已经明确了发文范围，为什么在末尾的抄送单位处重列抬头的受文单位名称？这样的低级错误都能发生，还有拟搞、校对、审核的人呢？原来党政办里都组织部门精挑细选的80后选调生。你还别不信，我们当地县区级党委、政府办公室那批80后的办公室人员不外乎就是这个档次，即不懂礼貌又不懂业务。这个可是党委、政府直接对外的窗口啊……</P>
<P>同学的抱怨我有同样的深切体会。领导跑北京要回了个80后，多年来我独挡一面非常辛苦，如今盼来一个帮手，希望自己不再那么操劳，没想到盼来的是更多失望。</P>
<P>从报到至今日满4个整月，80后帮手始终没有进入状态，虽说是科班出身，却没有发挥应有的作用。不懂可以学，不会可以问，可他偏就是这种不懂不会也不学不问的人。简单的计算机故障不愿修，复杂的网络更谈不上管理，什么都等人叫要人催，上班就上网，下班按时走人，工作是难得一见积极主动，不管眼前的人是否需要帮助，领导不安排就坐在那里不动。记得有一次，次日有个技术保障服务，只有他一个人在岗，而领导没有指定谁负责技术保障，他居然不知所措，在办公室里大声问“领导走了也不安排，明天那个技术保障谁负责？”的话，典型的四肢发达头脑简单。</P>
<P>记得他刚来不久，因为设备太多且经常变动，不及时记录恐怕万一出现故障无法及时恢复。那时，我在机房里画设备连接图，他出现在我面前问我在忙什么，我解释之后提醒他有时间多熟悉机房里各种设备的功用和连接等网络管理技术人员应该掌握的基本技能，可没想到他不但不去熟悉，就连笔记本和投影仪连接后如何把电脑上的信号切换到投影仪、投影如何调整才能在屏幕投出满屏等本可以在说明书上找到答案的问题都要打电话来问我。</P>
<P>还有一次，我去接他的班，他跟我反映某部门电脑重装系统后他去设IP也上不了网，并要求我有时间去看一下。真是没大没小，我心里憋气啊。不是因为他要求我去解决他解决不了的问题，而是整个网络因为中心机房到各部门的接口问题导致所有电脑无法联网这样的大问题他都没有发现，纯粹就盯着那台需重设IP的电脑。哎，基本的网络管理知识都不具备，指望不上哦。</P>
<P>还有更让人不舒服的。这些天我们在进行网络改造，我把自己的想法变成了一张拓朴结构图。他来接班时，我递给他算是征求一下他这位协助我管理网络的技术人员的意见，免得哪天在领导面前说我没有同他商量过网络建设的问题。没想到，得到的是这样一句话：我对网络和交换机都不是很熟悉，网络的事以后你多操心。什么话？！这要是从领导的嘴里出来还说领导关心和鼓励，可这是一个晚辈的嘴里说出来，是对前辈要求，像人话吗？！</P>
<P>对于这个帮手，我已经不指望了。不过，既然他的岗位定职为网络管理，无论他能力高低，那么今后我的公休就有保障了。</P>
<P>我不敢给70后和80后定位，实际上我也不配给70后和80后定位。不过，说实在，我身边的70后和80后，完全可以使用“70后”和“80后”这两种说法来定义这两代人的差别……</P>]]></description>
</item><item>
<title><![CDATA[人善被犬欺]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47204</link>
<author>Qr</author>
<pubDate>2009/10/10 21:56:30</pubDate>
<description><![CDATA[<A></A>
<P>自九月中下旬起，用IE浏览网页时经常被恶意广告骚扰，打开5到10个页面就会出现一次，启用阻止弹出窗口也没有用，hosts文件也正常。</P>
<P>广告弹出太频繁了，规律就被找出来了，原来恶意广告都源自同一IP：116.11.253.181。在hosts文件加入此IP也不能屏蔽源自该IP的广告，于是找来360设置网页防火墙屏蔽该IP，没想到，本来广告页面显示30秒后会跳转到欲浏览的页面，这样一来，网页打不开了，只能刷新页面。</P>
<P>上网查该IP，居然同样的问题在很多电信宽带用户中频现？TNND，原来是电信恶意广告。都是电信劫持我们的DNS，当浏览器提交访问请求时，电信广告服务器会记下我们的访问请求，然后将访问请求修改为广告页面地址，显示一定时长后再跳转到实际请求访问的页面。强制性广告，电信真TMD黑。（SORRY，粗口有点多，对于电信的流氓行为，实在忍心无可忍）</P>
<P>实在忍心无可忍，今天中午11点半，打了10000投诉。那小姑娘问我重装系统了没有，居然以电脑中木马为由为电信劫持DNS，推送恶意广告找台阶下，气得我差点狂吼她。</P>
<P>我没给她再做解释的机会，直接告诉她我是专业网络管理人士，并把该IP与已知电信其它IP作了一翻说明，她才同意找技术人员解决。</P>
<P>挂电话前，我用很认真的口吻问她要她的工号，然后告诉她：“你们的大客户部X总经理过几天会来跟我谈业务，你们不赶紧给我解决，我会当你们X总的面投诉你们，给她难堪！”</P>
<P>中午1点钟后，上网似乎再没发现恶意广告页面了，难道这招真这么灵验？！不得而知，观察再说。</P>
<P>晚8点前，10000号来电，说是我今天的投诉他们已经处理，但不承认广告源IP不是电信的，同时要我留心观察，有问题再打10000号。我问对方是什么时候处理的，答说是：晚7点。</P>
<P>晚7点？广告源IP不是电信的？鬼才信。一经投诉，午后网络恢复正常，不再出现恶意广告页面。不用说，都知道电信在撒谎，电信在强奸民意。</P>
<P>人善被犬欺，做人不能太老实了，面对侵犯我们权益的事，该出手时还得出手。<A></A></P>]]></description>
</item><item>
<title><![CDATA[[原创作品]XSLT电影字幕转换代码（SRT2SUB）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47159</link>
<author>Qr</author>
<pubDate>2009/9/30 21:23:09</pubDate>
<description><![CDATA[<A></A>
<P><SPAN style="COLOR: blue">SRT字幕要完好，每条字幕间隔一空行，多不行，本次代码没有进行针对性处理。</SPAN></P>
<P><SPAN style="COLOR: blue">支持时间轴校正（提前或延时）和帧速率转换。</SPAN></P>
<P><SPAN style="COLOR: blue"><SPAN style="COLOR: blue">准备工作：SRT转换为如下XML格式</SPAN></SPAN></P>
<P><SPAN style="COLOR: blue">&lt;?xml</SPAN> <SPAN style="COLOR: red">version</SPAN>="1.0" <SPAN style="COLOR: red">encoding</SPAN>="gb2312"<SPAN style="COLOR: blue">?&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;root</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>SRT 字幕 <BR><SPAN style="COLOR: blue">&lt;/root</SPAN><SPAN style="COLOR: blue">&gt;</SPAN></P>
<P><SPAN style="COLOR: blue">转换代码：</SPAN></P>
<P><SPAN style="COLOR: blue">&lt;?xml</SPAN> <SPAN style="COLOR: red">version</SPAN>="1.0" <SPAN style="COLOR: red">encoding</SPAN>="gb2312"<SPAN style="COLOR: blue">?&gt;<BR><SPAN style="COLOR: #006600">&lt;!--原创：Qr，<A href="http://qr.blogger.org.cn/">http://Qr.blogger.org.cn</A>--&gt;<BR></SPAN></SPAN><SPAN style="COLOR: #006600">&lt;!--时间：2009/08/20--&gt;</SPAN> <BR><SPAN style="COLOR: #006600">&lt;!--功能：转换SRT字幕为SUB字幕--&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:stylesheet</SPAN> <SPAN style="COLOR: red">version</SPAN>="1.0" <SPAN style="COLOR: red">xmlns:xsl</SPAN>="http://www.w3.org/1999/XSL/Transform"<SPAN style="COLOR: blue">&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:output</SPAN> <SPAN style="COLOR: red">method</SPAN>="text" <SPAN style="COLOR: red">version</SPAN>="1.0" <SPAN style="COLOR: red">encoding</SPAN>="gb2312" <SPAN style="COLOR: red">indent</SPAN>="yes"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><SPAN style="COLOR: #006600">&lt;!--sub实际上是文本文件，故取method="text"--&gt;</SPAN> <BR><BR><SPAN style="COLOR: #006600">&lt;!--提前(-)或延后(+)时间，不调整帧速率须设tofps=60--&gt;</SPAN><SPAN style="COLOR: #006600">&lt;!--ms以毫秒为单位，1s=1000ms--&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="ms" <SPAN style="COLOR: red">select</SPAN>="0"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR><SPAN style="COLOR: #006600">&lt;!--调整帧速率以达到提前或延迟字幕请修改此值为电影的实际帧速率，默认为60。不调整时间须设ms=0--&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="tofps" <SPAN style="COLOR: red">select</SPAN>="60"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR><SPAN style="COLOR: #006600">&lt;!--电影的实际帧速率，根据实际设此值--&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="fps" <SPAN style="COLOR: red">select</SPAN>="23.976"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="br" <SPAN style="COLOR: red">select</SPAN>="'&amp;#x0A;'"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN> <SPAN style="COLOR: red">match</SPAN>="/"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr" <SPAN style="COLOR: red">select</SPAN>="." <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:param</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="cache" <SPAN style="COLOR: red">select</SPAN>="substring-before($srtstr,'&amp;#x0A;&amp;#x0A;')"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:if</SPAN> <SPAN style="COLOR: red">test</SPAN>="string-length($cache) <SPAN style="COLOR: blue">&amp;gt;</SPAN> 1"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="transform"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="transform" <SPAN style="COLOR: red">select</SPAN>="$cache" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:if</SPAN> <SPAN style="COLOR: red">test</SPAN>="contains($srtstr,'&amp;#x0A;&amp;#x0A;')"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="srtstr" <SPAN style="COLOR: red">select</SPAN>="substring-after($srtstr,'&amp;#x0A;&amp;#x0A;')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:if</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:if</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN> <SPAN style="COLOR: red">name</SPAN>="transform"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:param</SPAN> <SPAN style="COLOR: red">name</SPAN>="transform"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="current" <SPAN style="COLOR: red">select</SPAN>="substring-after($transform,'&amp;#x0A;')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="tmp" <SPAN style="COLOR: red">select</SPAN>="substring-before($current,'&amp;#x0A;')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="timefix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="time" <SPAN style="COLOR: red">select</SPAN>="substring-before($tmp,' ')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="timefix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="time" <SPAN style="COLOR: red">select</SPAN>="substring-after($tmp,'<SPAN style="COLOR: blue">&amp;gt;</SPAN> ')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="subfix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="temp" <SPAN style="COLOR: red">select</SPAN>="substring-after($current,'&amp;#x0A;')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:value-of</SPAN> <SPAN style="COLOR: red">select</SPAN>="$br"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN> <SPAN style="COLOR: red">name</SPAN>="timefix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:param</SPAN> <SPAN style="COLOR: red">name</SPAN>="time"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="h" <SPAN style="COLOR: red">select</SPAN>="substring($time,1,2)"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="m" <SPAN style="COLOR: red">select</SPAN>="substring($time,4,2)"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="s" <SPAN style="COLOR: red">select</SPAN>="substring($time,7,2)"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="u" <SPAN style="COLOR: red">select</SPAN>="substring($time,10)"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:variable</SPAN> <SPAN style="COLOR: red">name</SPAN>="msbac" <SPAN style="COLOR: red">select</SPAN>="(($h * 3600 + $m * 60 + $s) * 1000 + $u + $ms) * ($tofps div 60) div 1000"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN>{<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:value-of</SPAN> <SPAN style="COLOR: red">select</SPAN>="round($msbac * $fps)"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN>}<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN> <SPAN style="COLOR: red">name</SPAN>="subfix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:param</SPAN> <SPAN style="COLOR: red">name</SPAN>="temp"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:choose</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:when</SPAN> <SPAN style="COLOR: red">test</SPAN>="contains($temp,'&amp;#x0A;')"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:value-of</SPAN> <SPAN style="COLOR: red">select</SPAN>="substring-before($temp,'&amp;#x0A;')"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN>|<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:text</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN> <SPAN style="COLOR: red">name</SPAN>="subfix"<SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:with-param</SPAN> <SPAN style="COLOR: red">name</SPAN>="temp" <SPAN style="COLOR: red">select</SPAN>="substring-after($temp,'&amp;#x0A;')" <SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:call-template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:when</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:otherwise</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;</SPAN><SPAN style="COLOR: #50af98">xsl:value-of</SPAN> <SPAN style="COLOR: red">select</SPAN>="$temp"<SPAN style="COLOR: blue">/&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:otherwise</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:choose</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:template</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR><BR><SPAN style="COLOR: blue">&lt;/</SPAN><SPAN style="COLOR: #50af98">xsl:stylesheet</SPAN><SPAN style="COLOR: blue">&gt;</SPAN> <BR></P>]]></description>
</item><item>
<title><![CDATA[郁闷的带薪年假]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=47135</link>
<author>Qr</author>
<pubDate>2009/9/22 18:18:02</pubDate>
<description><![CDATA[<P>新来了一个帮手，协同偶一起负责技术工作，所以，领导不会因为没有技术管理人员的问题而拒批我休带薪年假了。趁着国庆节前，旅游市场还没完全火起来，各项工作也暂时比较轻松的时机，我适时向领导提出请公休假的问题。开始还担心领导不同意，准备了不同情景下的应对策略，没想到的是，领导欣然同意，态度完全出乎我意料之外。</P>
<P>《职工带薪年休假条例》第三条已经明确规定了不同工作时间所享受的休假时间，具体为：职工累计工作已满1年不满10年的，年休假5天；已满10年不满20年的，年休假10天；已满20年的，年休假15天。然而，中国的文化博大精深，不同的人对第三条内容的理解却大不相同，也是全国各地都在争议的问题，即条例中规定的时限是工龄？是工作年限？还是其它？</P>
<P>因为一时搞不清楚，问了单位同事，即便已经休过带薪年假的，也都说不清楚，所以我也不好向领导提出休息多少天，而让领导去审批。领导也不好作主，就请示上级部门，上级部门领导回应说按工龄，问我工龄几何？我回答工资卡上写着10年，上级部门领导说如此即可休10天，单位领导也表态说允许我休10天。于是向领导提出次周一开始公休，领导应允。</P>
<P>没想到身体有恙，误了出门时间，休了5天后，周六才出门。在省城玩了两天后准备去往目的地，就在周一的上午接到单位领导打来的电话说同事对我的公休时长有不同意见，因为我的工龄未满10年，要我赶紧回单位上班。晕。</P>
<P>休假之前，我问了多人，却没有人能告诉我，我应该享受多少天带薪年假，待我出门不在办公室，那些人都变得聪明了，就都能计算我的工龄和休假时日了。工资卡上写明我的工龄，能否安排休假和休多少天也报批过本级和上级部门的领导。现如今却让那些人议得单位领导顶不住压力，让我的带薪年假变得如此之郁闷。难道我得罪了谁？工作上我也能做到团结互助，生活上也能关心体谅他们的困难替他们顶班，我是如此热情的给他们建议，帮他们修改电脑配置单和维护维修电脑。我怎么啦……</P>
<P>挂电话前，领导问我出门的情况，我把前因后果也告知领导，领导也很同情我的处境，于是决定让我继续休假。因为工作上的原因，我多年没有享受公休假，也没有享受到300%的工资补偿。按《条例》第五条之规定：单位因生产、工作特点确有必要跨年度安排职工年休假的，可以跨1个年度安排。如果领导允许，我再休5天也没问题。无论领导如何劝说，但是我拒绝了，因为我不想给领导压力，也不想给那此“无事生非”的人留下口舌。</P>
<P>回到家后，上网细细查了一下，年休假工龄如何计算终于有了标准，南京晨报刊出了国家人力资源和社会保障部对工龄计算问题作了详细的解释，职工享受年休假的工龄计算应包含其他单位的工作年限。近按照这个标准计算，我的工龄是达到了，但工作年限还差一些，所以，按照标准，我的确还不能享受10天带薪年假，只是上级部门却按工龄而不是按工作年限休假，所以也批我休10天假了。领导错批假期并不是我想多休息的理由，只是单位那些人有意见，应该在我提出公休的时候讨论这个问题，如果讨论出结果，我会执行，只是想不到他们居然人前一套人后一套，唉……害人之心不可有，防人之心不可无啊！</P>
<P>周二上午，我按时出现在办公室，除了单位领导，没一个跟我打招呼，我也没跟领导以外的任何一个打招呼，我只想让自己平静而不去触碰那根弦，径直进入机房想看看装修的情况，发现内容装修一新就往回去了小会议室小坐。因为脚趾头磨了点皮，很疼，走起路来有点跛，领导关心地跟了进来，了解我的情况，顺便聊了此次公休的问题，然后谈了一个多小时的工作，让我回家休息休养。</P>
<P>有了一个帮手，终于可以自由休假了，没想到此次带薪年假，却如此之郁闷……<A></A></P>]]></description>
</item><item>
<title><![CDATA[自制交换机百兆以太口测试工具]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46974</link>
<author>Qr</author>
<pubDate>2009/8/31 22:56:53</pubDate>
<description><![CDATA[<A></A>
<P>在网络管理过程中，经常需要测试交换机以太口是否正常。通常的作法是笔记本电脑＋网线或测线仪＋网线模式，除此之处，还有更轻便的模式或方法吗？下面介绍一种方便实用的自制工具。</P>
<P>一、材料和工具：<BR>1、RJ-45水晶头一颗；<BR>2、超五类网线一小段；<BR>3、水晶钳（网线钳）一把；</P>
<P>二、做法：<BR>用水晶钳剪取40MM网线，抽出其中一对线匀直后对折，从对折处往线头方向15MM处剪平线头，分别短接RJ-45水晶头的1、3和2、6脚（如下所示），用水晶钳钳死固定，自制交换机百兆以太口测试工具制作完成。</P>
<P>1　2　3　4　5　6　7　8<BR>\　\　/　　　　/<BR>&nbsp;\　\/　　　　/<BR>　\_/\_____/</P>
<P>细心的朋友已经看出来，测试工具的线序和直通线一样，1、2脚为数据输出，3、6脚为数据输出，将1、3和2、6脚短接后形成一个环路。所以，测试工具制作实际上可以按直通线先压制一头，另一头将橙白和绿白，橙和绿四线两两断接即可。</P>
<P>小提示：T568B线序 <BR>　1　　2　3　4 　5 　6 　7　 8 <BR>橙白 橙 绿白 蓝 蓝白 绿 棕白 棕</P>
<P>三、使用方法：<BR>交换机通过电后，用自制交换机百兆以太口测试工具依次接入交换机各以太口。<BR>以太口指示灯亮，说明端口正常；<BR>以太口指示灯灭，说明端口损坏。</P>
<P><BR>有了这样一个轻便的测试工具，即便交换机在高处，也不用担心测线仪等工具从梯子上摔下来砸坏了。</P>
<P>Qr，8/31/2009</P>]]></description>
</item><item>
<title><![CDATA[正则表达式在WORD替换功能中的应用（续三）（笔记）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46947</link>
<author>Qr</author>
<pubDate>2009/8/28 9:13:03</pubDate>
<description><![CDATA[<A></A>
<P>经常遇到这种情况，在网络在发现一篇好的文章或资料，想复制下来，却因页面屏蔽了鼠标右键……</P>
<P>如果你不会取消右键屏蔽功能，没关系，教你一招实用的：鼠标依次单击IE菜单的\查看\--&gt;\源文件\，记事本会打开页面的源代码，找到你要复制的内容，CTRL+C就可以了。</P>
<P>当然了，如果你觉得不便从大量的文字代码中剥离和复制的关键内容，那我们可以请WORD来帮忙。</P>
<P>1、按CTRL+A，CTRL+C将记事本中的文字代码全部复制到剪切板中，打开WORD，按CTRL+V粘贴到新文档中；</P>
<P>2、CTRL+H打开“查找和替换”对话框；</P>
<P>3、在“查找内容”文本框中输入分别输入：<BR>\&lt;title*\&gt;*\&lt;\/title\&gt;　　　　　　　　　//除去title标记和网页标题<BR>\&lt;style*\&gt;*\&lt;\/style\&gt;　　　　　　　　　//除去style标记和CSS样式<BR>\&lt;script*\&gt;*\&lt;\/script\&gt;　　　　　　　　　//除去script标记和脚本<BR>\&lt;\!\-\-*\-\-\&gt;　　　　　　　　　//除去注释代码<BR>\&lt;*\&gt;　　　　　　　　　//除去HTML标记代码</P>
<P>4、在“替换为”文本框中处留白；</P>
<P>5、鼠标单击“高级”，勾选“使用通配符”前的复选框；</P>
<P>6、单击按钮“全部替换”。</P>
<P>这样，大部分的无用文字代码已经被替换一空，从中再剥离和复制的关键内容就轻松多了。</P>
<P>当然了，网络上有很多工具可以方便的从繁杂的HTML代码中剥离出有用的文字，大家可以搜索下载。本笔记纯粹介绍和运用WORD中的正则替换功能，老鸟大可不必用此笨拙之法。<A></A></P>]]></description>
</item><item>
<title><![CDATA[正则表达式在WORD替换功能中的应用（续二）（笔记）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46946</link>
<author>Qr</author>
<pubDate>2009/8/28 7:54:35</pubDate>
<description><![CDATA[<P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">正则匹配中文字符：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">[!a-zA-Z1-9 `~\!\@#$%^^\&amp;\*\(\)\-=_+\[\]\{\}\\|;:'",.\&lt;\&gt;/\?^13^9]</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">正则说明：</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">[!]：WORD<SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">正则中</SPAN>表示非，去掉其中的“!”，结果反之；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">\：字符转义；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">^^：WORD<SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">正则中</SPAN>表示字符“^”，此处用法等同“\”；</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">^13：回车符</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">^9：制表符</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">P.S：由于WORD中很多空白字符如分页符等，采用了“^”开头的格式，没有能一一验证，故此处只收录了回车、制表两符。另，一些键盘上没有的字符也未能一一收录。</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">正则匹配中文语句：</SPAN></SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">&lt;[!a-zA-Z1-9 `~\!\@#$%^^\&amp;\*\(\)\-=_+\[\]\{\}\\|;:'",.\&lt;\&gt;/\?^13^9]*&gt;</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">P.S：本句代码可以<FONT face=宋体>匹配中文语句，但不知为什么，中文标点符号被排除，而前一句是可以匹配中文标点符号的。待解……</FONT></SPAN></P>]]></description>
</item><item>
<title><![CDATA[正则表达式在WORD替换功能中的应用（续一）（笔记）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46940</link>
<author>Qr</author>
<pubDate>2009/8/27 20:25:12</pubDate>
<description><![CDATA[今天下午整理了一些华为交换机的配置命令，准备打印出来备用。为了方便区分命令和提示符，打算把提示符统一设定为蓝色粗Gulim体，正则又帮了大忙，备忘于此。 
<P>超级终端下华为交换机命令格式为：</P>
<P>&lt;提示符&gt;命令</P>
<P>[提示符]命令</P>
<P>P.S:“&lt;&gt;”和“[]”是提示符的标识。</P>
<P>正则替换的实现：</P>
<P>1、CTRL+H打开“查找和替换”对话框；</P>
<P>2、在“查找内容”文本框中输入“\&lt;*\&gt;”或“\[*\]”；</P>
<P>3、在“替换为”文本框中处输入“^&amp;”（表示查找到的内容）；</P>
<P>4、鼠标单击“高级”，勾选“使用通配符”前的复选框；</P>
<P>5、单击鼠标将光标定位到“替换为”文本框（此步非常重要），单击底部的/格式/字体/，打开“替换字体”对话框，将字体改为“Gulim”字体/字形改为“加粗”/字体颜色改为蓝色，确定；</P>
<P>6、单击按钮“全部替换”，替换完毕。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[正则表达式在WORD替换功能中的应用（笔记）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46886</link>
<author>Qr</author>
<pubDate>2009/8/19 23:33:24</pubDate>
<description><![CDATA[<P>最近自己修改整理了一张WIPXP PE盘，尽管PE盘维护系统基本已经够用，但还是担心特殊情况下还需要DOS的辅助，于是从网络上搜集下载了几十个DOS工具映象。文件是rar格式的压缩文件，解压后，发现所有的映象文件均以E文命名，且都有一个中文的父文件夹，相当一部分的文件夹名末尾居然还是“.IMG”或“.IMA”，这样的目录结构几乎让人受不了。最终决定把映象文件集中到一个文件夹中，然后新建一个文本文件，将所有映象文件名一一罗列其中，并将各映象文件父文件夹的中文名作为映象文件说明。想法有了，关键就是要去实现。</P>
<P>运行命令行提示符，切换到映象文件存放的目录，输出如下命令并回车：TREE/F &gt; README.TXT</P>
<P>一个名为README.TXT的文件生成，内容（截取部分）如下：</P>
<P><BR>***********************************<BR>文件夹 PATH 列表<BR>卷序列号码为 000004CB B817:A1D9<BR>C:.<BR>│&nbsp; <BR>├─BIOS升级修改维护工具镜像BIOS<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIOS.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DiskGenius(DiskMan)镜像DISKGEN229<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DISKGEN229.IMA<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DM英文版镜像DM957<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM957.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS中文版镜像DOSCN.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOSCN.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS启动盘镜像cdrom-1218.ima<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdrom-1218.ima<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS启动盘镜像（支持SCSI设备）SCSI<BR>│&nbsp;&nbsp;&nbsp;&nbsp; SCSI.IMG<BR>***********************************</P>
<P><BR>文件目录结构完整呈现在我们眼前，但这不是我们想要的格式。怎么才能转换成我们想要的格式呢？不同的人有不同的做法，既然本文标题为《正则表达式在WORD替换功能中的应用》，那我们就在WORD中用正则表达式来处理。工具是有了，关键是如何实现？</P>
<P>首先，用WORD打开README.TXT这个文件，把开头部分多余的内容删除掉，得到如下文本：</P>
<P><BR>***********************************<BR>├─BIOS升级修改维护工具镜像BIOS<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIOS.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DiskGenius(DiskMan)镜像DISKGEN229<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DISKGEN229.IMA<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DM英文版镜像DM957<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM957.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS中文版镜像DOSCN.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOSCN.IMG<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS启动盘镜像cdrom-1218.ima<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdrom-1218.ima<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>├─DOS启动盘镜像（支持SCSI设备）SCSI<BR>│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCSI.IMG<BR>***********************************</P>
<P><BR>打开“查找和替换”对话框，先按正常的方法替换掉其中的空格，然后，<BR>在“查找内容”处输入：(├*^13)(│*^13)(│^13)<BR>正则说明：查找以“├”开头，以“│”加一个换行符为末尾的字符串，实际上就是匹配“├”开头的三行内容;<BR>在“替换为”处输入：\2\1^13<BR>正则说明：替换为“查找内容”中正则表达式第2个括号匹配的内容＋第1个括号匹配的内容，并在其后加一换行；<BR>单击“高级”按钮，勾选“使用通配符”这个选项，单击“全部替换”，执行结果如下：</P>
<P><BR>***********************************<BR>│BIOS.IMG<BR>├─BIOS升级修改维护工具镜像BIOS</P>
<P>│DISKGEN229.IMA<BR>├─DiskGenius(DiskMan)镜像DISKGEN229</P>
<P>│DM957.IMG<BR>├─DM英文版镜像DM957</P>
<P>│DOSCN.IMG<BR>├─DOS中文版镜像DOSCN.IMG</P>
<P>│cdrom-1218.ima<BR>├─DOS启动盘镜像cdrom-1218.ima</P>
<P>│SCSI.IMG<BR>├─DOS启动盘镜像（支持SCSI设备）SCSI<BR>***********************************</P>
<P><BR>用正则替换删除掉中文说明中末尾为“.im?”、“.IM?”的字符串：<BR>“查找内容”：(├)(*)(.im)(?)^13^13　并　(├)(*)(.IM)(?)^13^13<BR>正则说明：查找以“├”开头，“.im?”或“.IM?”结尾加两个换行符的字符串<BR>“替换为”：\1\2^13^13<BR>正则说明：保留“查找内容”中前两个前两个括号匹配的内容，末尾加两个换行符</P>
<P>***********************************<BR>│BIOS.IMG<BR>├─BIOS升级修改维护工具镜像BIOS</P>
<P>│DISKGEN229.IMA<BR>├─DiskGenius(DiskMan)镜像DISKGEN229</P>
<P>│DM957.IMG<BR>├─DM英文版镜像DM957</P>
<P>│DOSCN.IMG<BR>├─DOS中文版镜像DOSCN</P>
<P>│cdrom-1218.ima<BR>├─DOS启动盘镜像cdrom-1218</P>
<P>│SCSI.IMG<BR>├─DOS启动盘镜像（支持SCSI设备）SCSI<BR>***********************************</P>
<P><BR>用替换的方法（不用正则），去掉全部“│”<BR>用替换的方法（不用正则），将“^p├─”替换为“：”<BR>结果如下：</P>
<P><BR>***********************************<BR>BIOS.IMG：BIOS升级修改维护工具镜像BIOS</P>
<P>DISKGEN229.IMA：DiskGenius(DiskMan)镜像DISKGEN229</P>
<P>DM957.IMG：DM英文版镜像DM957</P>
<P>DOSCN.IMG：DOS中文版镜像DOSCN</P>
<P>cdrom-1218.ima：DOS启动盘镜像cdrom-1218</P>
<P>SCSI.IMG：DOS启动盘镜像（支持SCSI设备）SCSI<BR>***********************************</P>
<P>正则表达式在WORD替换功能在网络上还是能搜到相关的资源的，但是几乎找不到正则表达式中换行符的应用，本文就侧重介绍了WORD正则替换功能中换行符的应用。</P>
<P>今天搬办公室，很累，没有心情细述，纯粹笔记式记录，只为备忘，不为求精，要想读懂，还请直接按笔记进行实例操作。<A></A></P>]]></description>
</item><item>
<title><![CDATA[应对ViewUrl检测历史上网记录的补充说明]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=Qr&amp;id=46834</link>
<author>Qr</author>
<pubDate>2009/8/12 17:32:04</pubDate>
<description><![CDATA[<P>本月初写的那篇博文提到的应对ViewUrl检测历史上网记录的方法实为隐藏分区，因为ViewUrl无法识别隐藏分区，因此无法检测到历史上网记录。因为方法比较笨，只对老鸟有效，况且并不是什么好的办法，实际测试存在一定风险，同时有可能瞒不过老鸟的法眼。</P>
<P>除此之外，还有什么方法能逃过ViewUrl的检测吗？答案时肯定的。这里我不给出实际做法和所使用的工具和软件，只简单介绍：</P>
<P>上网记录主要记录在名为“index.dat”的文件中，具体路径为“C:\Documents and Settings\用户名\Local Settings\History\History.IE5”及其子目录，彻底删除它，近期的上网记录就消失了。在这里，“主要”和“彻底清除”两个词语值得大家注意一下。“主要”说明History.IE5中的记录是不完全的，而“彻底删除”表明简单的删除名为“index.dat”的文件是不够的，因为即便高格硬盘都无法逃过ViewUrl的检测，说明ViewUrl具备一定的数据恢复功能。</P>
<P>简而言之，用工具或软件彻底清除残留上硬盘上的与上网记录有关的文件，是应对ViewUrl检测历史上网记录的根本原理。</P>
<P>看到这里，各位不要骂我，网上很多同样的答案都被否决了，我这算什么？实际上，一是他们测试的时候，相关文件没有完全删除，二是数据删除得不够彻底，三是方法或环境不对。</P>
<P>看了以上说明，各位应该有底了吧，祝大家好运。</P>
<P>经过本人测试，上网记录可以被彻底删除，ViewUrl的检测结果三项全无（删除后不做任何操作，直接检测的结果）。根据硬盘C分区大小，保守估计，清理一台计算机的上网记录，平均不超过1个小时。正常情况下，C分区为20G，15分钟可搞掂。<A></A></P>]]></description>
</item>
</channel>
</rss>