<?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>StephenChan&#039;s Tech Space &#187; Tools</title>
	<atom:link href="http://blog.endlesscode.com/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.endlesscode.com</link>
	<description>Stay Hungry. Stay Foolish.</description>
	<lastBuildDate>Tue, 25 Oct 2011 01:15:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>zz Kerberos简介</title>
		<link>http://blog.endlesscode.com/2010/04/25/kerberos-intro/</link>
		<comments>http://blog.endlesscode.com/2010/04/25/kerberos-intro/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 06:03:04 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=659</guid>
		<description><![CDATA[Kerberos协议： Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务，即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥，使得该协议具有相当的安全性。 条件 先来看看Kerberos协议的前提条件： 如下图所示，Client与KDC， KDC与Service 在协议工作前已经有了各自的共享密钥，并且由于协议中的消息无法穿透防火墙，这些条件就限制了Kerberos协议往往用于一个组织的内部， 使其应用场景不同于X.509 PKI。 过程 Kerberos协议分为两个部分： 1 . Client向KDC发送自己的身份信息，KDC从Ticket Granting Service得到TGT(ticket-granting ticket)， 并用协议开始前Client与KDC之间的密钥将TGT加密回复给Client。 此时只有真正的Client才能利用它与KDC之间的密钥将加密后的TGT解密，从而获得TGT。 （此过程避免了Client直接向KDC发送密码，以求通过验证的不安全方式） 2. Client利用之前获得的TGT向KDC请求其他Service的Ticket，从而通过其他Service的身份鉴别。 Kerberos协议的重点在于第二部分，简介如下： 1． Client将之前获得TGT和要请求的服务信息(服务名等)发送给KDC，KDC中的Ticket Granting Service将为Client和Service之间生成一个Session Key用于Service对Client的身份鉴别。然后KDC将这个Session Key和用户名，用户地址（IP），服务名，有效期, 时间戳一起包装成一个Ticket(这些信息最终用于Service对Client的身份鉴别)发送给Service， 不过Kerberos协议并没有直接将Ticket发送给Service，而是通过Client转发给Service.所以有了第二步。 2． 此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的，不能让Client看到，所以KDC用协议开始前KDC与Service之间的密钥将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个秘密(KDC在第一步为它们创建的Session Key)， KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。 &#8230; <a href="http://blog.endlesscode.com/2010/04/25/kerberos-intro/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><span>Kerberos</span><span>协议：</span></p>
<p><span>Kerberos</span><span>协议主要用于计算机网络的身份鉴别</span><span>(Authentication), </span><span>其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据</span><span>(ticket-granting ticket)</span><span>访问多个服务，即</span><span>SSO(Single Sign On)</span><span>。由于在每个</span><span>Client</span><span>和</span><span>Service</span><span>之间建立了共享密钥，使得该协议具有相当的安全性。</p>
<p><strong style="font-size: 18pt;">条件</strong></span></p>
<p><span>先来看看</span><span>Kerberos</span><span>协议的前提条件：</span></p>
<p><span>如下图所示，</span><span>Client</span><span>与</span><span>KDC</span><span>，</span><span> KDC</span><span>与</span><span>Service </span><span>在协议工作前已经有了各自的共享密钥，并且由于协议中的消息无法穿透防火墙，这些条件就限制了</span><span>Kerberos</span><span>协议往往用于一个组织的内部，</span> <span>使其应用场景不同于</span><span>X.509 PKI</span><span>。</span></p>
<p><img class="aligncenter size-full wp-image-657" title="kerberos1" src="http://blog.endlesscode.com/wp-content/uploads/2010/04/kerberos1.jpeg" alt="kerberos1" width="487" height="471" /></p>
<p><span><strong style="font-size: 18pt;"><span id="more-659"></span>过程</strong></p>
<p>Kerberos</span><span>协议分为两个部分：</span></p>
<p><span>1 . Client</span><span>向</span><span>KDC</span><span>发送自己的身份信息，</span><span>KDC</span><span>从</span><span>Ticket Granting Service</span><span>得到</span><span>TGT(ticket-granting ticket)</span><span>，</span> <span>并用协议开始前</span><span>Client</span><span>与</span><span>KDC</span><span>之间的密钥将</span><span>TGT</span><span>加密回复给</span><span>Client</span><span>。</span></p>
<p><span>此时只有真正的</span><span>Client</span><span>才能利用它与</span><span>KDC</span><span>之间的密钥将加密后的</span><span>TGT</span><span>解密，从而获得</span><span>TGT</span><span>。</span></p>
<p><span>（此过程避免了</span><span>Client</span><span>直接向</span><span>KDC</span><span>发送密码，以求通过验证的不安全方式）</span></p>
<p><span>2. Client</span><span>利用之前获得的</span><span>TGT</span><span>向</span><span>KDC</span><span>请求其他</span><span>Service</span><span>的</span><span>Ticket</span><span>，从而通过其他</span><span>Service</span><span>的身份鉴别。</span></p>
<p><span>Kerberos</span><span>协议的重点在于第二部分，简介如下：</span></p>
<p><img class="aligncenter size-full wp-image-658" title="kerberos2" src="http://blog.endlesscode.com/wp-content/uploads/2010/04/kerberos2.jpeg" alt="kerberos2" width="547" height="391" /></p>
<p><span><span>1．<span> </span></span></span><span>Client</span><span>将之前获得</span><span>TGT</span><span>和要请求的服务信息</span><span>(</span><span>服务名等</span><span>)</span><span>发送给</span><span>KDC</span><span>，</span><span>KDC中的<span>Ticket Granting Service</span></span><span>将为</span><span>Client</span><span>和</span><span>Service</span><span>之间生成一个</span><span>Session Key</span><span>用于</span><span>Service</span><span>对</span><span>Client</span><span>的身份鉴别。然后</span><span>KDC</span><span>将这个</span><span>Session Key</span><span>和用户名，用户地址（</span><span>IP</span><span>），服务名，有效期</span><span>, </span><span>时间戳一起包装成一个</span><span>Ticket(</span><span>这些信息最终用于</span><span>Service</span><span>对</span><span>Client</span><span>的身份鉴别</span><span>)</span><span>发送给</span><span>Service</span><span>，</span> <span>不过</span><span>Kerberos</span><span>协议并没有直接将</span><span>Ticket</span><span>发送给</span><span>Service</span><span>，而是通过</span><span>Client</span><span>转发给</span><span>Service.</span><span>所以有了第二步。</span></p>
<p><span><span>2．<span> </span></span></span><span>此时</span><span>KDC</span><span>将刚才的</span><span>Ticket转发</span><span>给</span><span>Client</span><span>。由于这个</span><span>Ticket</span><span>是要给</span><span>Service</span><span>的，不能让</span><span>Client</span><span>看到，所以</span><span>KDC</span><span>用协议开始前</span><span>KDC</span><span>与</span><span>Service</span><span>之间的密钥将</span><span>Ticket</span><span>加密后再发送给</span><span>Client</span><span>。同时为了让</span><span>Client</span><span>和</span><span>Service</span><span>之间共享那个秘密</span><span>(KDC</span><span>在第一步为它们创建的</span><span>Session Key)</span><span>，</span><span> KDC</span><span>用</span><span>Client</span><span>与它之间的密钥将</span><span>Session Key</span><span>加密随加密的</span><span>Ticket</span><span>一起返回给</span><span>Client</span><span>。</span></p>
<p><span><span>3．<span> </span></span></span><span>为了完成</span><span>Ticket</span><span>的传递，</span><span>Client</span><span>将刚才收到的</span><span>Ticket</span><span>转发到</span><span>Service. </span><span>由于</span><span>Client</span><span>不知道</span><span>KDC</span><span>与</span><span>Service</span><span>之间的密钥，所以它无法算改Ticket中的信息。同时</span><span>Client</span><span>将收到的</span><span>Session Key</span><span>解密出来，然后将自己的用户名，用户地址（</span><span>IP</span><span>）打包成</span><span>Authenticator</span><span>用</span><span>Session Key</span><span>加密也发送给</span><span>Service</span><span>。</span></p>
<p><span><span>4．<span> </span></span></span><span>Service </span><span>收到</span><span>Ticket</span><span>后利用它与</span><span>KDC</span><span>之间的密钥将</span><span>Ticket</span><span>中的信息解密出来，从而获得</span><span>Session Key</span><span>和用户名，用户地址（</span><span>IP</span><span>），服务名，有效期。然后再用</span><span>Session Key</span><span>将</span><span>Authenticator</span><span>解密从而获得用户名，用户地址（</span><span>IP</span><span>）将其与之前</span><span>Ticket</span><span>中解密出来的用户名，用户地址（</span><span>IP</span><span>）做比较从而验证</span><span>Client</span><span>的身份。</span></p>
<p><span><span>5．<span> </span></span></span><span>如果</span><span>Service</span><span>有返回结果，将其返回给</span><span>Client</span><span>。</span></p>
<p><strong style="font-size: 18pt;">总结</strong></p>
<p><span>概括起来说</span><span>Kerberos</span><span>协议主要做了两件事</span></p>
<p><span><span>1．<span> </span></span></span><span>Ticket</span><span>的安全传递。</span></p>
<p><span><span>2．<span> </span></span></span><span>Session Key</span><span>的安全发布。</span></p>
<p><span>再加上时间戳的使用就很大程度上的保证了用户鉴别的安全性。并且利用</span><span>Session Key，在通过鉴别之后</span><span>Client</span><span>和</span><span>Service</span><span>之间传递的消息也可以获得</span><span>Confidentiality(机密性), Integrity(完整性)</span><span>的保证。不过由于没有使用非对称密钥自然也就无法具有抗否认性，这也限制了它的应用。不过相对而言它比</span><span>X.509 PKI</span><span>的身份鉴别方式实施起来要简单多了。</span></p>
<p><span>推荐资料：</span></p>
<p><span><a href="http://blog.joycode.com/peon/articles/18657.aspx" target="_blank">Kerberos<span><span>的原理</span></span></a></span></p>
<p><span><a href="http://www.isi.edu/gost/publications/kerberos-neuman-tso.html" target="_blank">Kerberos: An <strong><span>Authentication</span></strong><span> </span><strong><span>Service</span></strong><span> </span><strong><span>for</span></strong><span> </span><strong><span>Computer</span></strong><span> </span><strong><span>Networks</span></strong></a></span></p>
<h3><span><span>转载来源：</span></span>http://idior.cnblogs.com/archive/2006/03/20/354027.html</h3>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/04/25/kerberos-intro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh的使用</title>
		<link>http://blog.endlesscode.com/2010/03/27/usage-of-ssh/</link>
		<comments>http://blog.endlesscode.com/2010/03/27/usage-of-ssh/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 05:41:08 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=618</guid>
		<description><![CDATA[主要记录一下地址缩写和保持长连接，具体的使用和配置参数可以&#8221;man ssh&#8221;、&#8221;man ssh_config&#8221;了解得到。 服务器地址缩写 要登陆一台地址为endlesscode.com，用户名为stephenchan，连接的端口为9527的服务器，需运行以下命令： ssh stephenchan@endlesscode.com -p 9527 每次都要打这么长的一句命令是件麻烦的事，不过ssh提供地址缩写的功能，可以直接&#8221;ssh myserver&#8221;就可以了，只要在ssh的配置文件(~/.ssh/config)中，添加以下内容： Host myserver #缩写的地址，在命令行中使用ssh myserver登陆 HostName 192.168.23.202 #服务器的地址 Port 32200 #ssh的端口 User stephenchan #use name Protocol 2 #协议版本，可选 ForwardAgent yes #自动调用登陆管理器，可选 Compression yes #压缩传输，可选 以上的配置是针对一个服务器登陆的配置，也可以在配置文件中以同样的形式配置多台服务器，彼此间不冲突。 保持长连接 默认的ssh不会保持长会话连接，也就是会话过了一段时间后可能会自动断开连接，网上很多文章都说在ssh server端配置成为长连接，但实际上在ssh client端也可以做到。 在上面的ssh的配置文件中增加ServerAliveInterval参数，可以通过man &#8230; <a href="http://blog.endlesscode.com/2010/03/27/usage-of-ssh/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>主要记录一下地址缩写和保持长连接，具体的使用和配置参数可以&#8221;man ssh&#8221;、&#8221;man ssh_config&#8221;了解得到。</p>
<h3>服务器地址缩写</h3>
<p>要登陆一台地址为endlesscode.com，用户名为stephenchan，连接的端口为9527的服务器，需运行以下命令：</p>
<pre class="brush:shell">ssh stephenchan@endlesscode.com -p 9527</pre>
<p>每次都要打这么长的一句命令是件麻烦的事，不过ssh提供地址缩写的功能，可以直接&#8221;ssh myserver&#8221;就可以了，只要在ssh的配置文件(~/.ssh/config)中，添加以下内容：</p>
<pre class="brush:shell">Host myserver                          #缩写的地址，在命令行中使用ssh myserver登陆
HostName 192.168.23.202      #服务器的地址
Port 32200                              #ssh的端口
User stephenchan                    #use name
Protocol 2                                #协议版本，可选
ForwardAgent yes                    #自动调用登陆管理器，可选
Compression yes                      #压缩传输，可选</pre>
<p>以上的配置是针对一个服务器登陆的配置，也可以在配置文件中以同样的形式配置多台服务器，彼此间不冲突。<span id="more-618"></span></p>
<h3>保持长连接</h3>
<p>默认的ssh不会保持长会话连接，也就是会话过了一段时间后可能会自动断开连接，网上很多文章都说在ssh server端配置成为长连接，但实际上在ssh client端也可以做到。</p>
<p>在上面的ssh的配置文件中增加ServerAliveInterval参数，可以通过man ssh_config找到这个参数的相关说明：</p>
<pre class="brush:plain">Sets a timeout interval in seconds after which if no data has been received from the server, ssh(1) will send a message through the encrypted channel to request a response from the server.  The default is 0, indicating that these messages will not be sent to the server, or 300 if the BatchMode option is set.  This option applies to protocol version 2 only.  ProtocolKeepAlives and SetupTimeOut are Debian-specific compatibil‐ity aliases for this option.</pre>
<p>还有一个相关的参数是：ServerAliveCountMax，其说明如下：</p>
<pre class="brush:plain">Sets the number of server alive messages (see below) which may be sent without ssh(1) receiving any messages back from the server.  If this threshold is reached while server alive messages are being sent, ssh will disconnect from the server, terminating the session.
The default value is 3.  If, for example, ServerAliveInterval (see below) is set to 15 and ServerAliveCountMax is left at the default, if the server becomes unresponsive, ssh will disconnect after approximately 45 seconds.  This option applies to protocol version 2 only.</pre>
<p>结合两个参数设置如下：</p>
<pre class="brush:shell">Host myserver                          #缩写的地址，在命令行中使用ssh myserver登陆
HostName 192.168.23.202      #服务器的地址
Port 32200                              #ssh的端口
User stephenchan                    #use name
Protocol 2                                #协议版本，可选
ForwardAgent yes                    #自动调用登陆管理器，可选
Compression yes                      #压缩传输，可选
ServerAliveCountMax 20
ServerAliveInterval 240</pre>
<p>这些配置参数，使用sftp和scp等命令也是有效的，比如：sftp myserver就可以登陆到myserver的ftp上了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/03/27/usage-of-ssh/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>zz 各种工具之正则表达式语法比较</title>
		<link>http://blog.endlesscode.com/2010/03/15/regex-diff-of-some-tools/</link>
		<comments>http://blog.endlesscode.com/2010/03/15/regex-diff-of-some-tools/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:42:42 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=373</guid>
		<description><![CDATA[在各种常用的工具中， 正则表达式如此的相似却又不同。 下表列出了一些常用的正则表达式，以及其不同之处。 项目总多，遗漏必有不少，请各位看官不吝指出。 以perl的正则为基准，不同的用法以粉红色标出。 grep 2.5.1 egrep 2.5.1 sed 3.02 sed 4.07 awk 3.1.1 perl 5.8.0 vim 6.1 JavaScript ?? 转义 \ \ \ \ \ \ \ 行头 ^ ^ ^ ^ ^ ^ ^ 行尾 $ $ &#8230; <a href="http://blog.endlesscode.com/2010/03/15/regex-diff-of-some-tools/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在各种常用的工具中，<br />
正则表达式如此的相似却又不同。<br />
下表列出了一些常用的正则表达式，以及其不同之处。<br />
项目总多，遗漏必有不少，请各位看官不吝指出。<br />
以perl的正则为基准，不同的用法以粉红色标出。</p>
<table border="1">
<tbody>
<tr>
<td style="font-weight: bold; color: white; background-color: darkgreen;"></td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">grep 2.5.1</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">egrep 2.5.1</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">sed 3.02<br />
sed 4.07</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">awk 3.1.1</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">perl 5.8.0</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">vim 6.1</td>
<td style="font-weight: bold; color: white; background-color: darkgreen;">JavaScript ??</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">转义</td>
<td>\</td>
<td>\</td>
<td>\</td>
<td>\</td>
<td style="background-color: lightyellow;">\</td>
<td>\</td>
<td>\</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">行头</td>
<td>^</td>
<td>^</td>
<td>^</td>
<td>^</td>
<td style="background-color: lightyellow;">^</td>
<td>^</td>
<td>^</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">行尾</td>
<td>$</td>
<td>$</td>
<td>$</td>
<td>$</td>
<td style="background-color: lightyellow;">$</td>
<td>$</td>
<td>$</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">n个 {n} {m,n} {m,} {,n}</td>
<td style="background-color: pink;">\{n\}</td>
<td>{n}</td>
<td style="background-color: pink;">\{n\}</td>
<td style="background-color: pink;">{n}或\{n\} 仅定义 &#8211;posix 或 &#8211;re-interval有效(要表达}和{,得用\\{和\\} 没有定义&#8211;posix或&#8211;re-interval时,不能用{n}的语法, \}\{和}{同义</td>
<td style="background-color: lightyellow;">{n}</td>
<td style="background-color: pink;">\{n\}</td>
<td>{n}</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">{0,}</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td style="background-color: pink;">*或\*, (要表达*,得用\\*)</td>
<td style="background-color: lightyellow;">*</td>
<td>*</td>
<td>*</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">{1,}</td>
<td style="background-color: pink;">\+</td>
<td>+</td>
<td style="background-color: pink;">\+</td>
<td style="background-color: pink;">+或\+, (要表达+, 得用\\+)</td>
<td style="background-color: lightyellow;">+</td>
<td style="background-color: pink;">\+</td>
<td>+</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">{0,1}</td>
<td style="background-color: pink;">\?</td>
<td>?</td>
<td style="background-color: pink;">\?</td>
<td style="background-color: pink;">?或\?, (要表达?, 得用\\?)</td>
<td style="background-color: lightyellow;">?</td>
<td style="background-color: pink;">\?</td>
<td>?</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">任意字符</td>
<td style="background-color: pink;">.</td>
<td style="background-color: pink;">.</td>
<td style="background-color: pink;">.</td>
<td style="background-color: pink;">. 含\n.</td>
<td style="background-color: lightyellow;">. /s修饰后则含\n</td>
<td style="background-color: pink;">. 除\n</td>
<td style="background-color: pink;">. 除\n</td>
</tr>
<p><span id="more-373"></span></p>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">(pat) 匹配并获结果</td>
<td style="background-color: pink;">\(pat\)</td>
<td>(pat)</td>
<td style="background-color: pink;">\(pat\)</td>
<td style="background-color: pink;">(pat)或\(pat\) (要表达括号,用\\( \\) )</td>
<td style="background-color: lightyellow;">(pat)</td>
<td style="background-color: pink;">\(pat\)</td>
<td>(pat)</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">(?:pat) 匹配但不获结果</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">(?:pat)</td>
<td style="background-color: pink;">不支持</td>
<td>(?:pat)</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">(?=pat) 等于预查</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">(?=pat)</td>
<td style="background-color: pink;">不支持</td>
<td>(?=pat)</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">(?!pat) 不等预查</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">(?!pat)</td>
<td style="background-color: pink;">不支持</td>
<td>(?!pat)</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">| 或</td>
<td style="background-color: pink;">\|</td>
<td>|</td>
<td style="background-color: pink;">\|</td>
<td style="background-color: pink;">|或\| (要表达|,得用\\|)</td>
<td style="background-color: lightyellow;">|</td>
<td style="background-color: pink;">\|</td>
<td>|</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">其中任意字符</td>
<td>[xyz]</td>
<td>[xyz]</td>
<td>[xyz]</td>
<td>[xyz]</td>
<td style="background-color: lightyellow;">[xyz]</td>
<td>[xyz]</td>
<td>[xyz]</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[.ch.] [=ch=]</td>
<td>不支持</td>
<td>不支持</td>
<td style="background-color: pink;">[.ch.]</td>
<td>不支持</td>
<td style="background-color: lightyellow;">不支持</td>
<td>不支持</td>
<td>不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">单词边界 \b</td>
<td>\b</td>
<td>\b</td>
<td>\b</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\b</td>
<td style="background-color: pink;">不支持</td>
<td>\b</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">非单词边界 \B</td>
<td>\B</td>
<td>\B</td>
<td>\B</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\B</td>
<td style="background-color: pink;">不支持</td>
<td>\B</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">单词左右边界 &lt;&gt;</td>
<td style="background-color: pink;">\&lt; \&gt;</td>
<td style="background-color: pink;">\&lt; \&gt;</td>
<td style="background-color: pink;">\&lt; \&gt;</td>
<td style="background-color: pink;">不支持 (&gt;&lt;和\&gt;\&lt;和\\&gt;\\&lt;同义</td>
<td style="background-color: lightyellow;">不支持(&gt;&lt;和\&gt;\&lt;同义</td>
<td style="background-color: pink;">\&lt; \&gt;</td>
<td>不支持(&gt;&lt;和\&gt;\&lt;同义</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">控制字符 /cx</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td>\cx</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\cx</td>
<td style="background-color: pink;">不支持</td>
<td>\cx</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">数字\d</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\d</td>
<td>\d</td>
<td>\d</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">非数字\D</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\D</td>
<td>\D</td>
<td>\D</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">换页 \f</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">高版本支持</td>
<td>\f</td>
<td style="background-color: lightyellow;">\f</td>
<td style="background-color: pink;">另义 \f表示文件名字符</td>
<td>\f</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">换行 \n</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td>\n</td>
<td style="background-color: lightyellow;">\n</td>
<td>\n</td>
<td>\n</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">回车 \r</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td>\r</td>
<td>\r</td>
<td style="background-color: lightyellow;">\r</td>
<td>\r</td>
<td>\r</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">空白 \s</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\s</td>
<td>\s</td>
<td>\s</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">非空白 \S</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\S</td>
<td>\S</td>
<td>\S</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">制表符 \t</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">高版本支持</td>
<td>\t</td>
<td style="background-color: lightyellow;">\t</td>
<td>\t</td>
<td>\t</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">垂直制表符 \v</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">高版本支持</td>
<td>\v</td>
<td style="background-color: lightyellow;">\v</td>
<td style="background-color: pink;">另义 \v表示very magic</td>
<td>\v</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">单词字符 \w [A-Za-z0-9_]</td>
<td>\w</td>
<td>\w</td>
<td>\w</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\w</td>
<td>\w</td>
<td>\w</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">非单词字符 \W [^A-Za-z0-9]</td>
<td>\W</td>
<td>\W</td>
<td>\W</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: lightyellow;">\W</td>
<td>\W</td>
<td>\W</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">\xn 16进制</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">高版本支持</td>
<td>\xn</td>
<td style="background-color: lightyellow;">\xn</td>
<td style="background-color: pink;">另义 \x表示[0-9A-Za-z]</td>
<td>\xn</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">\n 八进制</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td style="background-color: pink;">不支持</td>
<td>\n</td>
<td style="background-color: lightyellow;">\n</td>
<td style="background-color: pink;">不支持</td>
<td>\n</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">\n 后向引用</td>
<td>\n</td>
<td>\n</td>
<td>\n</td>
<td style="background-color: pink;">\n 仅取结果可用</td>
<td style="background-color: lightyellow;">\n</td>
<td style="background-color: pink;">\n 仅取结果可用</td>
<td>\n</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:alnum:] 字母和数字</td>
<td>[:alnum:]</td>
<td>[:alnum:]</td>
<td>[:alnum:]</td>
<td>[:alnum:]</td>
<td style="background-color: lightyellow;">[:alnum:]</td>
<td>[:alnum:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:alpha:] 字母</td>
<td>[:alpha:]</td>
<td>[:alpha:]</td>
<td>[:alpha:]</td>
<td>[:alpha:]</td>
<td style="background-color: lightyellow;">[:alpha:]</td>
<td>[:alpha:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:cntrl:] 控制字符</td>
<td>[:cntrl:]</td>
<td>[:cntrl:]</td>
<td>[:cntrl:]</td>
<td>[:cntrl:]</td>
<td style="background-color: lightyellow;">[:cntrl:]</td>
<td>[:cntrl:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:digit:] 数字</td>
<td>[:digit:]</td>
<td>[:digit:]</td>
<td>[:digit:]</td>
<td>[:digit:]</td>
<td style="background-color: lightyellow;">[:digit:]</td>
<td>[:digit:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:graph:] 可打印字符（不含空格）</td>
<td>[:graph:]</td>
<td>[:graph:]</td>
<td>[:graph:]</td>
<td>[:graph:]</td>
<td style="background-color: lightyellow;">[:graph:]</td>
<td>[:graph:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:lower:] 小写</td>
<td>[:lower:]</td>
<td>[:lower:]</td>
<td>[:lower:]</td>
<td>[:lower:]</td>
<td style="background-color: lightyellow;">[:lower:]</td>
<td>[:lower:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:print:] 可打印字符（含空格）</td>
<td>[:print:]</td>
<td>[:print:]</td>
<td>[:print:]</td>
<td>[:print:]</td>
<td style="background-color: lightyellow;">[:print:]</td>
<td>[:print:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:punct:] 标点</td>
<td>[:punct:]</td>
<td>[:punct:]</td>
<td>[:punct:]</td>
<td>[:punct:]</td>
<td style="background-color: lightyellow;">[:punct:]</td>
<td>[:punct:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:space:] 空格</td>
<td>[:space:]</td>
<td>[:space:]</td>
<td>[:space:]</td>
<td>[:space:]</td>
<td style="background-color: lightyellow;">[:space:]</td>
<td>[:space:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:upper:] 大写字母</td>
<td>[:upper:]</td>
<td>[:upper:]</td>
<td>[:upper:]</td>
<td>[:upper:]</td>
<td style="background-color: lightyellow;">[:upper:]</td>
<td>[:upper:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:xdigit:] 16进制数字</td>
<td>[:xdigit:]</td>
<td>[:xdigit:]</td>
<td>[:xdigit:]</td>
<td>[:xdigit:]</td>
<td style="background-color: lightyellow;">[:xdigit:]</td>
<td>[:xdigit:]</td>
<td style="background-color: pink;">不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:return:]</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td style="background-color: lightyellow;">不支持</td>
<td style="background-color: pink;">[:return:]</td>
<td>不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:tab:]</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td style="background-color: lightyellow;">不支持</td>
<td style="background-color: pink;">[:tab:]</td>
<td>不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:escape:]</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td style="background-color: lightyellow;">不支持</td>
<td style="background-color: pink;">[:escape:]</td>
<td>不支持</td>
</tr>
<tr>
<td style="font-weight: bold; color: white; background-color: green;">[:backspace:]</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td>不支持</td>
<td style="background-color: lightyellow;">不支持</td>
<td style="background-color: pink;">[:backspace:]</td>
<td>不支持</td>
</tr>
</tbody>
</table>
<h3>转载来源：http://blog.chinaunix.net/u/634/showart.php?id=2466</h3>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/03/15/regex-diff-of-some-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装bochs</title>
		<link>http://blog.endlesscode.com/2010/03/06/bochs-installation/</link>
		<comments>http://blog.endlesscode.com/2010/03/06/bochs-installation/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 08:07:04 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=367</guid>
		<description><![CDATA[在KarmicKoala上使用apt-get的方式安装bochs是没有调试功能的，需要进行手动的方式进行安装并设置&#8221;&#8211;enable-debugger &#8211;enable-disasm&#8221;两个参数，以手动安装先后出现了两个问题： ERROR: X windows gui was selected, but X windows libraries were not found.&#8221; ERROR: pkg-config was not found, or unable to access the gtk+-2.0 package. 于是google了一下，将下面的库都安装了就成功装上bochs了： apt-get install build-essential apt-get install libwxgtk2.6-0 apt-get install libwxgtk2.6-dev wx2.6-headers wx-common apt-get &#8230; <a href="http://blog.endlesscode.com/2010/03/06/bochs-installation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在KarmicKoala上使用apt-get的方式安装bochs是没有调试功能的，需要进行手动的方式进行安装并设置&#8221;&#8211;enable-debugger &#8211;enable-disasm&#8221;两个参数，以手动安装先后出现了两个问题：</p>
<ol>
<li>ERROR: X windows gui was selected, but X windows libraries were not found.&#8221;</li>
<li>ERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.</li>
</ol>
<p>于是google了一下，将下面的库都安装了就成功装上bochs了：</p>
<p>apt-get install build-essential<br />
apt-get install libwxgtk2.6-0<br />
apt-get install libwxgtk2.6-dev wx2.6-headers wx-common<br />
apt-get install libx11-dev<br />
apt-get install libxmu-dev<br />
apt-get install libxmuu-dev<br />
apt-get install xserver-xorg-dev<br />
apt-get install xorg-dev<br />
apt-get install libgtk2.0-dev</p>
<p>没有详细去了解为什么要装这些库，可能是因为调试的功能需要用到一些X window和gtk的开发包吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/03/06/bochs-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moinmoin</title>
		<link>http://blog.endlesscode.com/2010/01/26/moinmoin/</link>
		<comments>http://blog.endlesscode.com/2010/01/26/moinmoin/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 14:40:48 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=193</guid>
		<description><![CDATA[一、简介 Moinmoin是一个高级，易用，可扩展的Wiki引擎，并且拥有比较大的用户群。Moinmoin是由Python编写的开源Wiki，详细的介绍请参考http://moinmo.in/ 二、安装 Moinmoin有多种服务器配置方式，下面描述Moinmoin使用FastCGI的安装流程。 从http://moinmo.in/下载Moinmoin的安装包(示例使用的是1.8.5版 本)，并解压出来，会看到有”setup.py”,”/wiki”,”/MoinMoin”等文件和目录。在Moinmoin中创建一个wiki实际是创 建了一个wiki的实例，也就是说对于一些静态的文件，如js,css,html等静态的内容，会被所有的wiki实例所共用，而每个wiki所特有的是 该wiki实例的数据文件和相关的配置文件等。把安装包解压之后，在解压的目录下运行”python setup.py install”把Moinmoin的库安装到本机的Python库中。 在解压出来的内容中，有一个wiki的目录，这个目录的内容就是Moinmoin的wiki所包含的所有文件了，其子目录如下： data: 包含了wiki page和user data，只有Moinmoin才能访问; underlay: 包含了Moinmoin默认的帮助页面和模板，只有Moinmoin才能访问; htdocs: 包括了Moinmoin的静态支持文件，如js和css，Web服务器需要有权限访问此目录; server: Moinmoin的一些示例启动文件; config: Moinmoin的一些示例配置文件。 新建一个目录存放wiki的data和underlay目录的文件(mkdir mywiki)，然后把data和underlay两个目录拷到新创建的目录中(mywiki)。至于htdocs，存放的位置随意，但要保证Web服务器可以访问。 在mywiki目录新建一个目录用于存放Moinmoin的起动脚本(mkdir cgi-bin)，并把server目录中的moin.cgi拷贝到cgi-bin目录，同时也把config目录中的wikiconfig.py文件拷 贝到mywiki的目录下，操作之后mywiki的目录结构如下： -/mywiki &#8211;/cgi-bin/moin.cgi &#8211;/data/ &#8211;/underlay/ &#8211;wikiconfig.py 设置目录的权限。先从apache的配置文件中找到apache运行的用户和用户组(nobody,nogroup)，然后执行下列命令(其实这个主要保证apache有rwx即可)： chown –R nobody.nogroup mywiki    #拥有者更新为apache的用户和其用户组 chmod &#8230; <a href="http://blog.endlesscode.com/2010/01/26/moinmoin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>一、简介</h3>
<p>Moinmoin是一个高级，易用，可扩展的Wiki引擎，并且拥有比较大的用户群。Moinmoin是由Python编写的开源Wiki，详细的介绍请参考<a href="http://moinmo.in/">http://moinmo.in/</a></p>
<h3 id="section-1">二、安装</h3>
<p>Moinmoin有多种服务器配置方式，下面描述Moinmoin使用FastCGI的安装流程。</p>
<ol>
<li> 从<a href="http://moinmo.in/">http://moinmo.in/</a>下载Moinmoin的安装包(示例使用的是<strong>1.8.5</strong>版 本)，并解压出来，会看到有”setup.py”,”/wiki”,”/MoinMoin”等文件和目录。在Moinmoin中创建一个wiki实际是创 建了一个wiki的实例，也就是说对于一些静态的文件，如js,css,html等静态的内容，会被所有的wiki实例所共用，而每个wiki所特有的是 该wiki实例的数据文件和相关的配置文件等。把安装包解压之后，在解压的目录下运行”python setup.py install”把Moinmoin的库安装到本机的Python库中。</li>
<li>在解压出来的内容中，有一个wiki的目录，这个目录的内容就是Moinmoin的wiki所包含的所有文件了，其子目录如下：
<ul>
<li>data: 包含了wiki page和user data，只有Moinmoin才能访问;</li>
<li>underlay: 包含了Moinmoin默认的帮助页面和模板，只有Moinmoin才能访问;</li>
<li>htdocs: 包括了Moinmoin的静态支持文件，如js和css，Web服务器需要有权限访问此目录;</li>
<li>server: Moinmoin的一些示例启动文件;</li>
<li>config: Moinmoin的一些示例配置文件。</li>
</ul>
<p>新建一个目录存放wiki的data和underlay目录的文件(mkdir mywiki)，然后把data和underlay两个目录拷到新创建的目录中(mywiki)。至于htdocs，存放的位置随意，但要保证Web服务器可以访问。</li>
<li>在mywiki目录新建一个目录用于存放Moinmoin的起动脚本(mkdir cgi-bin)，并把server目录中的moin.cgi拷贝到cgi-bin目录，同时也把config目录中的wikiconfig.py文件拷 贝到mywiki的目录下，操作之后mywiki的目录结构如下：<br />
-/mywiki<br />
&#8211;/cgi-bin/moin.cgi<br />
&#8211;/data/<br />
&#8211;/underlay/<br />
&#8211;wikiconfig.py<span id="more-193"></span></li>
<li>设置目录的权限。先从apache的配置文件中找到apache运行的用户和用户组(nobody,nogroup)，然后执行下列命令(其实这个主要保证apache有rwx即可)：
<ul>
<li>chown –R nobody.nogroup mywiki    #拥有者更新为apache的用户和其用户组</li>
<li>chmod –R ug+rwX mywiki        #nobody和nogroup可读可写</li>
<li>chmod –R o-rwx mywiki            #其他人则拒绝访问</li>
</ul>
</li>
<li>在apache的配置文件为mywiki进行相关的访问配置，在配置的设置中要注意添加两个指令为：
<ul>
<li>Alias /moin_static185/ /path/to/moin/htdocs/    #静态文件路径，前面的moin_static185是随每个版本不同的，185则是当前的版本号(1.8.5)</li>
<li>ScriptAlias / /path/to/mywiki/cgi-bin/moin.cgi/    #所有的请求传递给moin.cgi处理，注意moin.cgi后面的斜杆不能忽略</li>
</ul>
</li>
<li>对mywiki目录的相关文件进行配置。首先需要在cgi-bin目录的moin.cgi文件中加上” sys.path.insert(0, &#8216;/path/to/mywiki/&#8217;)”让python能够在搜寻路径中找到wikiconfig.py文件。接着就配置mywiki目录下的 wikiconfig.py文件，把data_dir的值赋予data目录的绝对路径，把data_underlay_dir赋予underlay目录的 绝对路径，把url_prefix_static赋予”/moin_static185”，这是设置静态文件的url过滤，”185”是版本号。 wikconfig.py的默认编码是iso-8859-1的，可根据需要转换成utf-8。</li>
</ol>
<p>通过以上的安装和配置，就可以通过浏览器对Moinmoin的wiki进行访问了。</p>
<p>Moinmoin的帮助文档HelpContents这个页面上，直接在浏览器输入已经搭建好的Moinmoin的wiki，<a href="http://mywiki.url/HelpContents">http://mywiki.url/HelpContents</a>就可以访问</p>
<h3 id="section-0">三、基本配置</h3>
<p>基本的配置可参考<a href="http://mywiki.url/HelpOnConfiguration">http://mywiki.url/HelpOnConfiguration</a>页面上关于wikiconfig.py的介绍，较为普通和常用的有：</p>
<ul>
<li>sitename：设置wiki的名字，这个一般会在页面的banner上显示的；</li>
<li>logo_string：wiki的logo，也是会在banner上显示的，注意这里是img标签的内容；</li>
<li>page_front_page：首页的地址，如果赋值为&#8221;首页&#8221;，则通过&#8221;<a href="http://mywiki.url/">http://mywiki.url/</a>首页&#8221;可以访问wiki的一级域名；</li>
<li>theme_default：默认的主题；</li>
<li>editor_default：默认的编辑器类型，包括gui和text；</li>
<li>language_default：用户界面和内容的默认语言，默认为en，可改成zh；</li>
<li>language_ignore_browser：是否忽略用户浏览器的语言设置；</li>
<li>page_iconbar：页面的操作栏，包括edit, print等等；</li>
<li>navi_bar：页面默认的导航栏，包括了最新更新、搜索、帮助等等；</li>
<li>……</li>
</ul>
<p>除了上面较为基本的设置，还有很多关于header和footer以及其他更为细致的设置，具体可参考HelpOnConfiguration页面。</p>
<h3 id="section-1">四、权限管理</h3>
<p>Moinmoin主要是通过访问控制列表的方式来管理每个页面的操作权限，具体介绍在<strong><a href="http://mywiki.url/HelpOnAccessControlLists">http://mywiki.url/HelpOnAccessControlLists</a></strong>。Moinmoin没有专门用来管理页面和权限的后台，所有都是配置文件和页面来进行管理和设置的。但是Moinmoin的ACL提供非常灵活的权限设置管理。</p>
<p>在wiki的安装目录下的wikiconfig.py文件中，有一个superuser的属性设置，这个属性是List类型，以unicode的字符串 类型记录着管理员的用户名和群组，也就是说wiki的后台管理员就是通过设置superuser（属于Trusted群组）属性来设定的。<br />
Moinmoin通过在wikiconfig.py的<strong>acl_rights_before</strong>、<strong>acl_rights_after</strong>、<strong>acl_rights_default</strong>和在页面上设置<strong>ACL</strong>来设定访问者的对页面的操作权限。在wikiconfig.py设置示例如下：<br />
acl_rights_before = u&#8221;admin:read,write,delete,revert,admin All:read&#8221;<br />
acl_rights_after=u&#8221;admin:read,write,delete,revert,admin All:read&#8221;<br />
格式为user/group:read,write,delete…的方式对用户和组进行权限管理。同时，可以在每个页面的顶部添加&#8221;#acl SomeUser:read,write All:read&#8221;的方式对页面进行特别的配置。单个页面的权限检测流程为acl_rights_before-&gt;页面ACL（如果页面不存在 ACL，但检测acl_rights_default，否则跳过acl_rights_default）-&gt;acl_rights_after。当 检测流程找到了第一个可以确定访问者是否拥有当前能够操作的权限时，则停止检测并直接应用首次检测到的权限设置。</p>
<p>由于添加管理员需要在wikiconfig.py中设置，也意味着每次更改管理员都需要重启Web服务器，那么有没有更方便的方法呢？答案就是群组，Group。关于设置Group的页面在<a href="http://mywiki.url/HelpOnAccessControlLists#Groups">http://mywiki.url/HelpOnAccessControlLists#Groups</a>。简单地说，要创建一个AdminGroup，先创建一个AdminGroup地址的页面，然后在该页面上添加AdminGroup的成员就可以了。这样就可以通过AdminGroup这样的方式来灵活管理admin了。</p>
<p>假如有这样的一个需求，只有AdminGroup的人才能阅读和操作页面，其他的所有人都不能阅读。那么只要在wikiconfig.py上设置：<br />
acl_rights_before=u&#8221;AdminGroup:read,write,delete,revert,admin&#8221;<br />
acl_rights_default=u&#8221;All:&#8221;<br />
如果其他人有阅读的权限，只要设置acl_rights_default=u&#8221;All:read&#8221;就好了。</p>
<h3 id="section-2">五、主题管理</h3>
<p>官方<a href="http://moinmo.in/ThemeMarket">http://moinmo.in/ThemeMarket</a>提供了一些主题包下载，要注意版本是否匹配。把主题下载下来并解压后的目录结构如下：<br />
-themename/<br />
&#8211;css/<br />
&#8211;img/<br />
&#8211;themename.py</p>
<p>把themename整个目录拷到静态文件的共享目录htdocs下，然后再把themename.py移到data/plugin/theme，注意 data目录是wiki实例的目录下(mywiki/data)。最后在wikiconfig.py上设置 theme_default=themename就可以了，要注意themename目录包含的所有文件都有权限让Web服务器访问。</p>
<h3 id="section-3">六、其他</h3>
<p>Moinmoin提供了一些宏可以嵌入到编辑器中提供一些其他的系统和页面的信息，具体可参考<a href="http://moinmo.in/HelpOnMacros">http://moinmo.in/HelpOnMacros</a>。</p>
<p>对于gui的编辑器，在google的chrome浏览器下提交内容会出现异常，用IE和FF均正常。gui所能提供的格式比较有限，具体可参考<a href="http://moinmo.in/HelpOnEditing">http://moinmo.in/HelpOnEditing</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/01/26/moinmoin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Graphviz</title>
		<link>http://blog.endlesscode.com/2010/01/26/graphviz/</link>
		<comments>http://blog.endlesscode.com/2010/01/26/graphviz/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 14:20:23 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.endlesscode.com/?p=186</guid>
		<description><![CDATA[Graphviz是一个可以根据简单的描述语句生成图形的工具。这是AT&#38;T Research的开源项目，其官方网站为http://www.graphviz.org， 官方网站提供了一些样图(http://www.graphviz.org/Gallery.php)。Graphviz可以在多平台下使用，包括 Linux，Windows, Max OS等等，如果觉得在非Windows下用Visio麻烦，那么Graphviz绝对是一个不错的选择。Graphviz的主要特性如下： 支持多种输出格式：http://www.graphviz.org/doc/info/output.html 可定制图形属性：http://www.graphviz.org/doc/info/attrs.html 可定制结点形状：http://www.graphviz.org/doc/info/shapes.html 可定制箭头形式：http://www.graphviz.org/doc/info/arrows.html 自行控制图形颜色：http://www.graphviz.org/doc/info/colors.html 下载在这里(http://www.graphviz.org/Download.php)，选择合适的系统和版本，在Ubuntu下也可以通过apt-get的方式安装(apt-get install graphviz)，一般的源都有提供。安装完成之后可以通过控制台命令来进行图形生成。 示例 一、代码如下，保存成1.dot文件： digraph G { a-&#62;b[dir=both color="red"] } 运行 dot 1.dot -Tpng -o 1.png 得到的图像1.png为： 二、代码如下，保存成2.dot文件： digraph G { rankdir=LR; node [fontname="yahei.ttf"]; edge [fontname="yahei.ttf"]; "火星"-&#62;"金星"[label="宇宙飞船"]; "金星"-&#62;"水星"[label="步行"]; &#8230; <a href="http://blog.endlesscode.com/2010/01/26/graphviz/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Graphviz是一个可以根据简单的描述语句生成图形的工具。这是AT&amp;T Research的开源项目，其官方网站为<a href="http://www.graphviz.org/">http://www.graphviz.org</a>， 官方网站提供了一些样图(http://www.graphviz.org/Gallery.php)。Graphviz可以在多平台下使用，包括 Linux，Windows, Max OS等等，如果觉得在非Windows下用Visio麻烦，那么Graphviz绝对是一个不错的选择。Graphviz的主要特性如下：</p>
<ul>
<li>支持多种输出格式：<a href="http://www.graphviz.org/doc/info/output.html">http://www.graphviz.org/doc/info/output.html</a></li>
<li>可定制图形属性：<a href="http://www.graphviz.org/doc/info/attrs.html">http://www.graphviz.org/doc/info/attrs.html</a></li>
<li>可定制结点形状：<a href="http://www.graphviz.org/doc/info/shapes.html">http://www.graphviz.org/doc/info/shapes.html</a></li>
<li>可定制箭头形式：<a href="http://www.graphviz.org/doc/info/arrows.html">http://www.graphviz.org/doc/info/arrows.html</a></li>
<li>自行控制图形颜色：<a href="http://www.graphviz.org/doc/info/colors.html">http://www.graphviz.org/doc/info/colors.html</a></li>
</ul>
<p>下载在这里(<a href="http://www.graphviz.org/Download.php">http://www.graphviz.org/Download.php</a>)，选择合适的系统和版本，在Ubuntu下也可以通过apt-get的方式安装(apt-get install graphviz)，一般的源都有提供。安装完成之后可以通过控制台命令来进行图形生成。<br />
<span id="more-186"></span></p>
<h2>示例</h2>
<p>一、代码如下，保存成1.dot文件：</p>
<pre class="brush:plain">digraph G {
a-&gt;b[dir=both color="red"]
}</pre>
<p>运行</p>
<pre class="brush:plain">dot 1.dot -Tpng -o 1.png</pre>
<p>得到的图像1.png为：</p>
<p><img class="alignnone size-full wp-image-183" title="34" src="http://blog.endlesscode.com/wp-content/uploads/2010/01/34.png" alt="34" width="83" height="160" /></p>
<p>二、代码如下，保存成2.dot文件：</p>
<pre class="brush:plain">digraph G {

rankdir=LR;
node [fontname="yahei.ttf"];
edge [fontname="yahei.ttf"];

"火星"-&gt;"金星"[label="宇宙飞船"];
"金星"-&gt;"水星"[label="步行"];
"水星"-&gt;"地球"[label="被流放"];
}</pre>
<p>运行命令</p>
<pre class="brush:plain">dot 2.dot -Tpng -o 2.png</pre>
<p>生成如下：</p>
<p><img class="alignnone size-full wp-image-184" title="36" src="http://blog.endlesscode.com/wp-content/uploads/2010/01/36.png" alt="36" width="672" height="61" /></p>
<p>三、代码如下，保存成3.dot文件：</p>
<pre class="brush:plain">digraph G {
node [fontname="yahei.ttf"];
edge [fontname="yahei.ttf"];

meet [shape=box,label="邂逅"];
admire [shape=box,label="爱慕"];
chase [shape=diamond,label="追求表白"];
love [shape=box,label="爱恋"];
sad [shape=box,label="痛苦"];
persist [shape=diamond,label="修成正果"];
godlike [shape=box,label="成仙"];

meet-&gt;admire;
admire-&gt;chase;
chase-&gt;love[label="成功"];
chase-&gt;sad[label="失败"];
love-&gt;persist;
persist-&gt;sad[label="分开"];
persist-&gt;godlike[label="坚持"];
}</pre>
<p>运行</p>
<pre class="brush:plain">dot 3.dot -Tpng -o 3.png</pre>
<p>生成图形如下：</p>
<p><img class="alignnone size-full wp-image-187" title="37" src="http://blog.endlesscode.com/wp-content/uploads/2010/01/371.png" alt="37" width="217" height="629" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.endlesscode.com/2010/01/26/graphviz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

