<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>综合技术论坛最新讨论 - JavaEye</title>
    <description>数据库、算法、C/C++、Erlang/FP、PHP/Linux<br/>
圈子: 
<a href="http://cpp-circle.group.javaeye.com/" target="_blank">C++语言</a>
<a href="http://onlypython.group.javaeye.com/" target="_blank">Python</a>
<a href="http://dlang.group.javaeye.com/" target="_blank">D语言</a>
<a href="http://phpers.group.javaeye.com/" target="_blank">PHP</a>
<a href="http://wfp.group.javaeye.com/" target="_blank">函数式编程</a>
<a href="http://database.group.javaeye.com/" target="_blank">数据库</a>
<a href="http://ubuntu.group.javaeye.com/" target="_blank">Ubuntu</a> - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>Bash编程学习笔记（二）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yuanyao.javaeye.com">yuanyao</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/253397" style="color:red;">http://www.javaeye.com/topic/253397</a>&nbsp;
          发表时间: 2008年10月16日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">读写Shell变量</span><br /><br />命令替代操作符及其描述<br /><br />$variable	得到一个变量的值,如果没有被初始化则为Null	没有被初始化返回NULL<br />${variable}	得到一个变量的值,如果没有被初始化则为Null,通常在其他的东西要添加到变量值的时候使用	同上<br />${variable:-string}	得到一个变量的值,如果这个变量没有被定义则返回一个确定的值	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; variable存在而且不是空值的时候返回变量的值,否在那返回null<br />${variable:=string}	得到一个变量没有被定义则把一个已知的值赋给它并返回这个值	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; variable存在不是空值的时候返回值,否则string赋给variable,返回string<br />${variable:?string}	如果变量没有被定义则显示一条消息	variable存在而且不是空值的时候,返回变量的值,否则显示字符串variable,并在其后显示message<br />${variable:+string}	测试一个变量存在与否	variable存在而且不是空值的时候返回string,否则返回null<br /><br /><br /><pre name="code" class="java">yaoyuan-desktop$echo $name

yaoyuan-desktop$name=yaoyuan
yaoyuan-desktop$echo $name
yaoyuan
yaoyuan-desktop$echo $place

yaoyuan-desktop$echo ${name:-John} ${place:-Portland}
yaoyuan Portland
yaoyuan-desktop$echo ${place?"Not defined"}
bash: place: Not defined
yaoyuan-desktop$echo ${name:+"Not defined"}
Not defined
yaoyuan-desktop$echo ${place:+"Not defined"}

yaoyuan-desktop$echo ${place:="San Francisro"}
San Francisro
yaoyuan-desktop$echo ${name:-John} ${place:-Portland}
yaoyuan San Francisro
</pre><br /><br /><br /><span style="color: red">'',"",*,\的使用</span><br /><br /><pre name="code" class="java">yaoyuan-desktop$name=yaoyuan
yaoyuan-desktop$echo $name
yaoyuan
yaoyuan-desktop$name=yao yuan
bash: yuan：找不到命令
yaoyuan-desktop$echo $name
yaoyuan
yaoyuan-desktop$name=yaoyuan*
yaoyuan-desktop$echo $name
yaoyuan
yaoyuan-desktop$name=yaoyuan
yaoyuan-desktop$echo $name
yaoyuan
yaoyuan-desktop$echo "$name"
yaoyuan*
yaoyuan-desktop$echo "Is Not Hello World! "
Is Not Hello World! 
yaoyuan-desktop$echo '$name'
$name
yaoyuan-desktop$echo '$name'
$name</pre><br /><br /><br /><br /><span style="color: red">Shell命令替换</span><br /><br /><span style="color: brown">$(command)</span><br /><br /><pre name="code" class="java">yaoyuan-desktop$command=pwd
yaoyuan-desktop$echo "The value of command is: $command."
The value of command is: pwd.
yaoyuan-desktop$command=$(pwd)
yaoyuan-desktop$echo "The value of command is: $command."
The value of command is: /home/yaoyuan.
</pre><br /><span style="color: red">命令替换适用于任何命令</span><br /><br /><pre name="code" class="java">yaoyuan-desktop$echo "The date and time is $(date)."
The date and time is 2008年 10月 12日 星期日 01:41:28 CST.</pre><br /><br /><br /><span style="color: red">创建只读的用户自定义的变量</span><br /><br />declare -r [name-list]<br />typeset -r [name-list]<br />readonly [name-list]<br /><br />用于阻止对name-list中列出的变量赋新值<br /><br /><pre name="code" class="java">yaoyuan@yaoyuan-desktop:~/ScriptFile$ declare -r name=Yao place=Yuan
yaoyuan@yaoyuan-desktop:~/ScriptFile$ echo $name $place
Yao Yuan

yaoyuan@yaoyuan-desktop:~/ScriptFile$ name=Yuan
bash: name: 只读变量
yaoyuan@yaoyuan-desktop:~/ScriptFile$ place="YaoYuan"
bash: place: 只读变量</pre><br /><br /><span style="color: red">只读变量的值不能重设</span><br /><pre name="code" class="java">
yaoyuan@yaoyuan-desktop:~/ScriptFile$ unset name
bash: unset: name：无法重置：只读的 variable
yaoyuan@yaoyuan-desktop:~/ScriptFile$ unset place
bash: unset: place：无法重置：只读的 variable
</pre><br /><br /><span style="color: red">从标准输入设备读入</span><br /><br />read [options][variable-list]<br /><br />用于从标准输入设备读入一行，把读入的词赋给在variable-list中的变量<br /><br /><pre name="code" class="java">yaoyuan@yaoyuan-desktop:~/ScriptFile$ cat read_demo
#! /bin/bash
echo -n "Enter input: "
read line
echo "You entered: $line"
echo -n "Enter another line: "
read word1 word2 word3
echo "The first word is: $word1"
echo "The second word is : $word2"
echo "The rest of the line is: $word3"
exit 0
yaoyuan@yaoyuan-desktop:~/ScriptFile$ ./read_demo
Enter input: yaoyuan
You entered: yaoyuan
Enter another line: hello shell, I love you
The first word is: hello
The second word is : shell,
The rest of the line is: I love you</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/253397" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 16 Oct 2008 03:46:29 +0800</pubDate>
        <link>http://www.javaeye.com/topic/253397</link>
        <guid>http://www.javaeye.com/topic/253397</guid>
      </item>
          <item>
        <title>一个复杂的SQL语句优化的疑惑</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yingwu.javaeye.com">yingwuhahahaha</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/253203" style="color:red;">http://www.javaeye.com/topic/253203</a>&nbsp;
          发表时间: 2008年10月15日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>背景:两个表workacacdata.movementdata.</p>
<p>movementdata中为日期提供过滤,及db_id提供过滤(此表中db_id是主键,唯一)</p>
<p>workacacdata中存在三种数据(此表中db_id不唯一,引用自上表)</p>
<p>A类型</p>
<p>&nbsp;&nbsp;&nbsp; recordkind的顺序为</p>
<p>&nbsp;&nbsp; A101 -&gt;其他-&gt;A110&nbsp;&nbsp; 或者&nbsp;&nbsp;&nbsp; A101-&gt;其他(不包括A110)</p>
<p>B类型&nbsp;&nbsp; A110-&gt;A101-&gt;其他-&gt;A110</p>
<p>C类型 &nbsp; A110-&gt;A101-&gt;其他 &nbsp; </p>
<p>&nbsp;</p>
<p>数据的db_id相同代表数据属于同一组,每一组数据只属于一种类型A或B或C</p>
<p>&nbsp;</p>
<p>相同db_id的一组数据 用record_id来表示它插入的顺序</p>
<p>&nbsp;</p>
<p>所以</p>
<p>对A类数据来说</p>
<p>&nbsp;</p>
<p>record_kind=A101的数据的record_id肯定小于和它同组的record_kind=A110的数据的record_id</p>
<p>&nbsp;</p>
<p>以此类推</p>
<p>B类型数据:必存在两个record_kind=A110 的和一个record_kind=A101的数据,且 record_kind=A101的数据的record_id在三者record_id中排序居中</p>
<p>&nbsp;</p>
<p>C........</p>
<p>&nbsp;</p>
<p>要求:</p>
<p>取出所有A类型数据的开始日期</p>
<pre name="code" class="sql">delivery_start_date</pre>
<p>&nbsp;</p>
<p>&nbsp;看起来超复杂,感觉做了很多次的重复查询.</p>
<p>于是修改之:</p>
<p>&nbsp;</p>
<p>&nbsp;结果却不尽如人意,修改后的语句怎么看执行的查询数也不多啊,可用SQLServer自带的性能分析工具一测,优化后的反而更慢.</p>
<p>尤其在日期条件发生变化后.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>修改后的语句read指数明显减少,但cpu指数明显增加</p>
<p>&nbsp;</p>
<p>难道是我测试的表不够大???</p>
<p>workacacdata表1400条</p>
<p>movementdata表80条</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>原sql语句:</p>
<pre name="code" class="sql">select distinct( convert(char(10),delivery_start_date,112)  ) as selectdate 
from movementdata  

where (

delivery_start_date &gt;= '2008-04-24 00:00:00' and 

delivery_start_date &lt; '2008-07-26 00:00:00') and  
(
(
--选出A和B类型
		(db_id in  
			  (select db_id from  

				    (
				    select 
				    a.db_id, 
				    count(a.record_kind) as cnt 
				    from workacacdata a, workacacdata b,movementdata c 
				    where 
				    (upper(a.record_kind)='A110') and 
				    (upper(b.record_kind)='A201') and 
				    a.db_id=c.db_id and 
				    c.delivery_start_date &gt;= '2008-04-24 00:00:00' and 
				    c.delivery_start_date &lt; '2008-07-26 00:00:00' and 
				    a.db_id=b.db_id 
				    group by a.db_id
				    ) 

			  deliverytbl 
			  where (cnt=1)
			  )
		) and  

--选出A存在A110数据
		(db_id in  
				    (
				    select a.db_id as db_id 
				    from workacacdata a, workacacdata b,movementdata c 
				    where 
				    upper(a.record_kind)='A101' and 
				    upper(b.record_kind) = 'A110' and 
				    a.db_id=c.db_id and 
				    c.delivery_start_date &gt;= '2008-04-24 00:00:00'and 
				    c.delivery_start_date &lt; '2008-07-26 00:00:00' and 
				    a.db_id = b.db_id and 
				    a.record_id&lt;b.record_id
				    )
		)
) 
--选出不存在A110的A类型数据
or  	(    
        db_id in  
        	 		(
        	 		select distinct(db_id) 
        	 		from movementdata  
        	 		where 
        	 		delivery_start_date &gt;= '2008-04-24 00:00:00' and 
        	 		delivery_start_date &lt; '2008-07-26 00:00:00' and 
        	 		db_id not in 
       	 					(
      	 					select distinct(a.db_id) 
     	 					from workacacdata a,movementdata b  
        	 					where 
       	 					a.db_id=b.db_id and 
      	 					b.delivery_start_date &gt;= '2008-04-24 00:00:00' and 
     	 					b.delivery_start_date &lt; '2008-07-26 00:00:00'  and 
        	 					upper(a.record_kind)='A110'
        	 					)
    				)

       )
) 
order by selectdate </pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>修改后的语句:</p>
<pre name="code" class="sql">--选出所有不同的db_id,包括A.B.C
select distinct( convert(char(10),delivery_start_date,112)  )
	from workacacdata a,movementdata b 
	where
	b.delivery_start_date &gt;= '"+start_time+"' and 
	b.delivery_start_date &lt; '"+end_time+"'  and 
	upper(a.record_kind)='A101' and
	a.db_id=b.db_id and
--排除B和C类型的	
a.db_id not in(
--选出B和C类型的
	select a.db_id as db_id
	from workacacdata a,movementdata b ,workacacdata c
	where
	b.delivery_start_date &gt;= '"+start_time+"' and 
	b.delivery_start_date &lt; '"+end_time+"'  and
	upper(a.record_kind)='A101' and
	a.db_id=b.db_id and
	upper(c.record_kind) = 'A110' and
	c.db_id=a.db_id and
	c.record_id&lt;a.record_id 
) 
</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/253203" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 15 Oct 2008 15:58:34 +0800</pubDate>
        <link>http://www.javaeye.com/topic/253203</link>
        <guid>http://www.javaeye.com/topic/253203</guid>
      </item>
          <item>
        <title>FlexDS 与 Spring Security 的完美结合</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://j2eefan.javaeye.com">j2eefan</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252998" style="color:red;">http://www.javaeye.com/topic/252998</a>&nbsp;
          发表时间: 2008年10月15日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一直在思考这个问题，网上也查了，资料也读了。放一个我自己写的SpringSecurityLoginCommand以备日后查阅。<br /><br />package flex.spring;<br /><br />import java.security.Principal;<br />import java.util.List;<br />import javax.servlet.ServletConfig;<br /><br />import flex.messaging.FlexContext;<br />import flex.messaging.security.LoginCommand;<br />import flex.messaging.security.SecurityException;<br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.springframework.security.Authentication;<br />import org.springframework.security.AuthenticationException;<br />import org.springframework.security.context.SecurityContext;<br />import org.springframework.security.context.SecurityContextHolder;<br />import org.springframework.security.context.SecurityContextImpl;<br />import org.springframework.security.providers.AuthenticationProvider;<br />import org.springframework.security.providers.UsernamePasswordAuthenticationToken;<br />import org.springframework.web.context.WebApplicationContext;<br />import org.springframework.web.context.support.WebApplicationContextUtils;<br /><br />/**<br /> * Custom implementation of BlazeDS LoginCommand which utilizes<br /> * Spring Security 2.0 framework underneath.<br /> * &lt;p/><br /> *<br /> * Date: Oct 14, 2008<br /> * Time: 12:33:46 PM<br /> */<br />public class SpringSecurityLoginCommand implements LoginCommand {<br />&nbsp; protected final Log log = LogFactory.getLog(getClass());<br /><br />&nbsp; public static final String AUTHENTICATION_PROVIDER_BEAN_NAME = "authenticationProvider";<br />&nbsp; public static final String SPRING_SECURITY_CONTEXT_KEY = "SPRING_SECURITY_CONTEXT";<br /><br />&nbsp; private final AuthenticationProvider provider;<br />&nbsp; private final boolean isPerClientAuthentication;<br /><br />&nbsp; public SpringSecurityLoginCommand() {<br />&nbsp;&nbsp;&nbsp; isPerClientAuthentication = FlexContext.isPerClientAuthentication();<br /><br />&nbsp;&nbsp;&nbsp; WebApplicationContext wac = WebApplicationContextUtils<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getWebApplicationContext(FlexContext.getServletContext());<br /><br />&nbsp;&nbsp;&nbsp; provider = (AuthenticationProvider) wac.getBean(AUTHENTICATION_PROVIDER_BEAN_NAME);<br />&nbsp;&nbsp;&nbsp; log.info("Spring Security Authentication Provider initialized - " + provider);<br />&nbsp; }<br /><br />&nbsp; public Principal doAuthentication(String username, Object credentials) {<br />&nbsp;&nbsp;&nbsp; SecurityContext securityContext;<br /><br />&nbsp;&nbsp;&nbsp; if (isPerClientAuthentication) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContext = (SecurityContext) FlexContext.getFlexClient()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getAttribute(SPRING_SECURITY_CONTEXT_KEY);<br /><br />&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContext = (SecurityContext) FlexContext.getFlexSession()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getAttribute(SPRING_SECURITY_CONTEXT_KEY);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; Authentication principal;<br /><br />&nbsp;&nbsp;&nbsp; if (securityContext == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UsernamePasswordAuthenticationToken token =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UsernamePasswordAuthenticationToken(username, credentials);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; principal = provider.authenticate(token);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContext = new SecurityContextImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContext.setAuthentication(principal);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isPerClientAuthentication) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlexContext.getFlexClient().setAttribute(SPRING_SECURITY_CONTEXT_KEY, securityContext);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlexContext.getFlexSession().setAttribute(SPRING_SECURITY_CONTEXT_KEY, securityContext);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (log.isDebugEnabled()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("[Login] Security Context was created.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AuthenticationException e) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SecurityException se = new SecurityException();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.setMessage(SecurityException.SERVER_AUTHENTICATION_CODE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.setRootCause(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw se;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; } else {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; principal = securityContext.getAuthentication();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("[" + username + "] was already authenticated previously.");<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; SecurityContextHolder.setContext(securityContext);<br /><br />&nbsp;&nbsp;&nbsp; return principal;<br />&nbsp; }<br /><br />&nbsp; public boolean logout(Principal principal) {<br />&nbsp;&nbsp;&nbsp; if (isPerClientAuthentication) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlexContext.getFlexClient().removeAttribute(SPRING_SECURITY_CONTEXT_KEY);<br />&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlexContext.getFlexSession().removeAttribute(SPRING_SECURITY_CONTEXT_KEY);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; SecurityContextHolder.getContext().setAuthentication(null);<br /><br />&nbsp;&nbsp;&nbsp; if (log.isDebugEnabled()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("[Logout] Security Context was removed.");<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; return true;<br />&nbsp; }<br /><br />&nbsp; public boolean doAuthorization(Principal principal, List list) {<br />&nbsp;&nbsp;&nbsp; // always return TRUE as the authorization is delegated to Spring Security.<br />&nbsp;&nbsp;&nbsp; return true;<br />&nbsp; }<br /><br />&nbsp; public void start(ServletConfig config) {<br />&nbsp;&nbsp;&nbsp; // noop<br />&nbsp; }<br /><br />&nbsp; public void stop() {<br />&nbsp;&nbsp;&nbsp; // noop<br />&nbsp; }<br />}<br /><br />services-config.xml------------------------------<br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?><br />&lt;services-config><br /><br />&nbsp;&nbsp;&nbsp; &lt;services><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;service-include file-path="remoting-config.xml" /><br />&nbsp;&nbsp;&nbsp; &lt;/services><br /><br />&nbsp;&nbsp;&nbsp; &lt;factories><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;factory id="spring" class="adobe.flex.sample.SpringFactory" /><br />&nbsp;&nbsp;&nbsp; &lt;/factories><br /><br />&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;login-command class="flex.spring.SpringSecurityLoginCommand" server="all"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;per-client-authentication>true&lt;/per-client-authentication><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/login-command><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security-constraint id="default"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;auth-method>Custom&lt;/auth-method><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security-constraint><br />&nbsp;&nbsp;&nbsp; &lt;/security><br /><br />&nbsp;&nbsp;&nbsp; &lt;channels><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="flex.messaging.endpoints.AMFEndpoint"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/channel-definition><br />&nbsp;&nbsp;&nbsp; &lt;/channels><br /><br />&nbsp;&nbsp;&nbsp; &lt;logging><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;target class="flex.messaging.log.ConsoleTarget" level="Info"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prefix>[BlazeDS] &lt;/prefix><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;includeDate>false&lt;/includeDate><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;includeTime>false&lt;/includeTime><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;includeLevel>true&lt;/includeLevel><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;includeCategory>true&lt;/includeCategory><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filters><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern>Endpoint.*&lt;/pattern><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern>Service.*&lt;/pattern><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pattern>Configuration&lt;/pattern><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filters><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/target><br />&nbsp;&nbsp;&nbsp; &lt;/logging><br /><br />&nbsp;&nbsp;&nbsp; &lt;system><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;redeploy><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;enabled>false&lt;/enabled><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/redeploy><br />&nbsp;&nbsp;&nbsp; &lt;/system><br /><br />&lt;/services-config><br /><br />remoting-config.xml-----------------------------<br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?><br />&lt;service id="remoting-service"<br />&nbsp;&nbsp;&nbsp; class="flex.messaging.services.RemotingService"><br /><br />&nbsp;&nbsp;&nbsp; &lt;adapters><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;adapter-definition id="java-object" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/><br />&nbsp;&nbsp;&nbsp; &lt;/adapters><br /><br />&nbsp;&nbsp;&nbsp; &lt;default-channels><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;channel ref="my-amf"/><br />&nbsp;&nbsp;&nbsp; &lt;/default-channels><br /><br />&nbsp;&nbsp;&nbsp; &lt;destination id="roles"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;factory>spring&lt;/factory><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;source>roles&lt;/source><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope>session&lt;/scope><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security-constraint ref="default" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/destination><br /><br />&lt;/service><br /><br />spring-config.xml------------------------------<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?><br /><br />&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/beans/spring-beans.xsd"><br /><br />&nbsp; &lt;bean id="authenticationProvider"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.providers.dao.DaoAuthenticationProvider"><br />&nbsp;&nbsp;&nbsp; &lt;property name="userDetailsService"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="org.springframework.security.userdetails.memory.InMemoryDaoImpl"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="userMap"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; david=password,ROLE_ADMIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alex=password,ROLE_USER<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/value><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean><br />&nbsp;&nbsp;&nbsp; &lt;/property><br />&nbsp; &lt;/bean><br /><br />&nbsp; &lt;bean id="hello" class="flex.spring.SecurityRoles" /><br /><br />&lt;/beans><br /><br />java ------------------------<br />package flex.spring;<br /><br />import org.springframework.security.Authentication;<br />import org.springframework.security.GrantedAuthority;<br />import org.springframework.security.context.SecurityContextHolder;<br /><br />public class SecurityRoles {<br /><br />&nbsp; public String allowedAuthorities() {<br />&nbsp;&nbsp;&nbsp; Authentication principal = SecurityContextHolder.getContext().getAuthentication();<br />&nbsp;&nbsp;&nbsp; StringBuilder result = new StringBuilder();<br />&nbsp;&nbsp;&nbsp; for (GrantedAuthority ga : principal.getAuthorities()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.append(",").append(ga.getAuthority());<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return result.substring(1);<br />&nbsp; }<br />}<br /><br />Flex Client---------------------------------------<br />&lt;?xml version="1.0" encoding="utf-8"?><br />&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="100%" height="100%"<br />	creationComplete="init()"><br /><br />&nbsp; &lt;mx:Script><br />&nbsp; 	&lt;![CDATA[<br />&nbsp; 		import mx.controls.Alert;<br />			import mx.messaging.config.ServerConfig;<br />			import mx.rpc.AsyncToken;<br />			import mx.rpc.AsyncResponder;<br />			import mx.rpc.events.FaultEvent;<br />			import mx.rpc.events.ResultEvent;<br />			import mx.messaging.ChannelSet;<br />			<br />			// Define a ChannelSet object.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var cs:ChannelSet;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define an AsyncToken object.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var token:AsyncToken;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Initialize ChannelSet object based on the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // destination of the RemoteObject component.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function init():void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cs == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs = ServerConfig.getChannelSet(remoteObject.destination);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />			// Login and handle authentication success or failure.<br />			private function ROLogin():void {<br /> 			&nbsp; // Make sure that the user is not already logged in.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cs.authenticated == false) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; token = cs.login("alex", "password");<br />&nbsp;&nbsp;&nbsp; 			// Add result and fault handlers.<br />		&nbsp;&nbsp;&nbsp; 	token.addResponder(new AsyncResponder(LoginResultEvent, LoginFaultEvent));<br />			&nbsp; }<br />			}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle successful login.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function LoginResultEvent(event:ResultEvent, token:Object=null):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(event.result) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "success":<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authenticatedCB.selected = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle login failure.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function LoginFaultEvent(event:FaultEvent, token:Object=null):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(event.fault.faultCode) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "Client.Authentication":<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authenticatedCB.selected = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Logout and handle success or failure.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function ROLogout():void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add result and fault handlers.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; token = cs.logout();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; token.addResponder(new AsyncResponder(LogoutResultEvent,LogoutFaultEvent));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle successful logout.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function LogoutResultEvent(event:ResultEvent, token:Object=null):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (event.result) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "success":<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authenticatedCB.selected = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle logout failure.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function LogoutFaultEvent(event:FaultEvent, token:Object=null):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alert.show("Logout failure: " + event.fault.faultString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle message recevied by RemoteObject component.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function resultHandler(event:ResultEvent):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ta.text += "Congratulations! You've got server response: "+ event.result + "\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle fault from RemoteObject component.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function faultHandler(event:FaultEvent):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ta.text += "Oops! Something wrong: " + event.fault + "\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; 	]]&gt;<br />&nbsp; &lt;/mx:Script><br /><br />&nbsp; &lt;mx:HBox height="45"><br />&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Login" click="ROLogin()"/><br />&nbsp;&nbsp;&nbsp; &lt;mx:Button label="What roles do I have?" enabled="{authenticatedCB.selected}"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; click="remoteObject.allowedAuthorities()"/><br />&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Logout" click="ROLogout()"/><br />&nbsp;&nbsp;&nbsp; &lt;mx:CheckBox id="authenticatedCB" label="Authenticated?" enabled="true"/><br />&nbsp; &lt;/mx:HBox><br /><br />&nbsp; &lt;mx:TextArea id="ta" width="100%" height="511"/><br />&nbsp; &lt;mx:RemoteObject id="remoteObject"<br />								&nbsp;&nbsp; destination="hello"<br />								&nbsp;&nbsp; result="resultHandler(event)"<br />								&nbsp;&nbsp; fault="faultHandler(event)"/><br /><br />&lt;/mx:Application><br /><br />The end-----------------------------------
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252998" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 15 Oct 2008 10:20:44 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252998</link>
        <guid>http://www.javaeye.com/topic/252998</guid>
      </item>
          <item>
        <title>自己动手安装turbogears -- 搭建基本Python web开发服务器环境</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vb2005xu.javaeye.com">vb2005xu</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252870" style="color:red;">http://www.javaeye.com/topic/252870</a>&nbsp;
          发表时间: 2008年10月14日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文是 [自己动手从源代码手动安装Python -- 搭建服务器Python 运行环境]的姊妹篇,<br />首先从 turbogears 下载安装脚本,由于python的跨平台特性,此文件在windows上和linux上运行都一样,很棒.<br /><br />上传至服务器后,改变其运行属性: chmod 744 getturbogears.py<br />运行它即可: python getturbogears.py<br />将会输出一下信息.<br /><br /><pre name="code" class="java">

TurboGears Installer
Beginning setuptools/EasyInstall installation and TurboGears download

Downloading http://cheeseshop.python.org/packages/2.5/s/setuptools/setuptools-0.6c8-py2.5.egg
Processing setuptools-0.6c8-py2.5.egg
Copying setuptools-0.6c8-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding setuptools 0.6c8 to easy-install.pth file
Installing easy_install script to /usr/python252/bin
Installing easy_install-2.5 script to /usr/python252/bin

Installed /usr/python252/lib/python2.5/site-packages/setuptools-0.6c8-py2.5.egg
Processing dependencies for setuptools==0.6c8
Finished processing dependencies for setuptools==0.6c8
Searching for TurboGears==1.0.7
Reading http://www.turbogears.org/download/
Reading http://pypi.python.org/simple/TurboGears/
Reading http://www.turbogears.org
Reading http://www.turbogears.org/download/filelist.html
Best match: TurboGears 1.0.7
Downloading http://files.turbogears.org/eggs/TurboGears-1.0.7-py2.5.egg
Processing TurboGears-1.0.7-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/TurboGears-1.0.7-py2.5.egg
Extracting TurboGears-1.0.7-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding TurboGears 1.0.7 to easy-install.pth file
Installing tg-admin script to /usr/python252/bin

Installed /usr/python252/lib/python2.5/site-packages/TurboGears-1.0.7-py2.5.egg
Reading http://files.turbogears.org/eggs/
Processing dependencies for TurboGears==1.0.7
Searching for TurboKid>=1.0.4
Reading http://pypi.python.org/simple/TurboKid/
Reading http://www.turbogears.org/docs/plugins/template.html
Reading http://www.turbogears.org/preview/download/
Reading http://docs.turbogears.org/TurboKid
Best match: TurboKid 1.0.4
Downloading http://files.turbogears.org/eggs/TurboKid-1.0.4-py2.5.egg
Processing TurboKid-1.0.4-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/TurboKid-1.0.4-py2.5.egg
Extracting TurboKid-1.0.4-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding TurboKid 1.0.4 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/TurboKid-1.0.4-py2.5.egg
Searching for TurboJson>=1.1.4,&lt;1.2
Reading http://pypi.python.org/simple/TurboJson/
Reading http://docs.turbogears.org/TurboJson
Best match: TurboJson 1.1.4
Downloading http://pypi.python.org/packages/2.5/T/TurboJson/TurboJson-1.1.4-py2.5.egg#md5=d7bb809e5a0e40ffcc0018854c2eaeb6
Processing TurboJson-1.1.4-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/TurboJson-1.1.4-py2.5.egg
Extracting TurboJson-1.1.4-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding TurboJson 1.1.4 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/TurboJson-1.1.4-py2.5.egg
Searching for TurboCheetah>=1.0
Reading http://pypi.python.org/simple/TurboCheetah/
Reading http://docs.turbogears.org/TurboCheetah
Best match: TurboCheetah 1.0
Downloading http://files.turbogears.org/eggs/TurboCheetah-1.0-py2.5.egg
Processing TurboCheetah-1.0-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/TurboCheetah-1.0-py2.5.egg
Extracting TurboCheetah-1.0-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding TurboCheetah 1.0 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/TurboCheetah-1.0-py2.5.egg
Searching for simplejson>=1.3
Reading http://pypi.python.org/simple/simplejson/
Reading http://undefined.org/python/#simplejson
Best match: simplejson 2.0.3
Downloading http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.3.tar.gz#md5=6da5d665c9e772ac65eae9b4ce6d737b
Processing simplejson-2.0.3.tar.gz
Running simplejson-2.0.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-zLI8TC/simplejson-2.0.3/egg-dist-tmp-7VReHx
Adding simplejson 2.0.3 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/simplejson-2.0.3-py2.5-linux-i686.egg
Searching for RuleDispatch>=0.5a0.dev-r2303
Reading http://pypi.python.org/simple/RuleDispatch/
Couldn't retrieve index page for 'RuleDispatch'
Scanning index of all packages (this may take a while)
Reading http://pypi.python.org/simple/
Best match: RuleDispatch 0.5a1.dev-r2506
Downloading http://files.turbogears.org/eggs/RuleDispatch-0.5a1.dev_r2506-py2.5-linux-i686.egg
Processing RuleDispatch-0.5a1.dev_r2506-py2.5-linux-i686.egg
Moving RuleDispatch-0.5a1.dev_r2506-py2.5-linux-i686.egg to /usr/python252/lib/python2.5/site-packages
Adding RuleDispatch 0.5a1.dev-r2506 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/RuleDispatch-0.5a1.dev_r2506-py2.5-linux-i686.egg
Searching for PasteScript>=1.6.2
Reading http://pypi.python.org/simple/PasteScript/
Reading http://pythonpaste.org/script/
Best match: PasteScript 1.6.3
Downloading http://pypi.python.org/packages/source/P/PasteScript/PasteScript-1.6.3.tar.gz#md5=d91ad7e03d07f94a3206fef13c18cf49
Processing PasteScript-1.6.3.tar.gz
Running PasteScript-1.6.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-kRaZlE/PasteScript-1.6.3/egg-dist-tmp-upq0Ok
Adding PasteScript 1.6.3 to easy-install.pth file
Installing paster script to /usr/python252/bin
Installing paster script to /usr/python252/bin

Installed /usr/python252/lib/python2.5/site-packages/PasteScript-1.6.3-py2.5.egg
Searching for FormEncode>=0.7.1
Reading http://pypi.python.org/simple/FormEncode/
Reading http://formencode.org
Reading http://formencode.sf.net
Best match: FormEncode 1.0.1
Downloading http://pypi.python.org/packages/2.5/F/FormEncode/FormEncode-1.0.1-py2.5.egg#md5=f9bee5c918efc078b8b5ad38f92b1138
Processing FormEncode-1.0.1-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/FormEncode-1.0.1-py2.5.egg
Extracting FormEncode-1.0.1-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding FormEncode 1.0.1 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/FormEncode-1.0.1-py2.5.egg
Searching for DecoratorTools>=1.4
Reading http://pypi.python.org/simple/DecoratorTools/
Reading http://peak.telecommunity.com/DevCenter/DecoratorTools
Best match: DecoratorTools 1.7
Downloading http://pypi.python.org/packages/2.5/D/DecoratorTools/DecoratorTools-1.7-py2.5.egg#md5=d205a59fc13405c8a2f1c355ee12a599
Processing DecoratorTools-1.7-py2.5.egg
Moving DecoratorTools-1.7-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding DecoratorTools 1.7 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/DecoratorTools-1.7-py2.5.egg
Searching for ConfigObj>=4.3.2
Reading http://pypi.python.org/simple/ConfigObj/
Reading http://www.voidspace.org.uk/python/configobj.html
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.0beta5.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.0b4.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.1.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.5.2.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.5.1.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.5.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.3.2.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.0b3.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.5.3.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.0b2.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.4.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.3.1.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.3.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.2.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.1.0.zip
Reading http://www.voidspace.org.uk/cgi-bin/voidspace/downman.py?file=configobj-4.0.2.zip
Best match: configobj 4.5.3
Downloading http://pypi.python.org/packages/2.5/C/ConfigObj/configobj-4.5.3-py2.5.egg#md5=5e9ff60f5b4909572dcf37d16e22c473
Processing configobj-4.5.3-py2.5.egg
Moving configobj-4.5.3-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding configobj 4.5.3 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/configobj-4.5.3-py2.5.egg
Searching for CherryPy>=2.3.0,&lt;3.0.0alpha
Reading http://pypi.python.org/simple/CherryPy/
Reading http://www.cherrypy.org
Reading http://download.cherrypy.org/cherrypy/2.3.0/
Reading http://download.cherrypy.org/cherrypy/3.0RC1/
Reading http://download.cherrypy.org/cherrypy/3.0.2/
Reading http://download.cherrypy.org/cherrypy/3.1beta/
Reading http://sourceforge.net/project/showfiles.php?group_id=56099
Reading http://trac.cherrypy.org/cgi-bin/trac.cgi/wiki/CherryPyDownload
Reading http://download.cherrypy.org/cherrypy/3.0.1/
Reading http://download.cherrypy.org/cherrypy/3.1.0/
Reading http://download.cherrypy.org/cherrypy/3.0.0/
Reading http://download.cherrypy.org/cherrypy/2.2.1/
Reading http://download.cherrypy.org/cherrypy/3.1.0beta3/
Reading http://download.cherrypy.org/cherrypy/3.1.0rc1/
Reading http://download.cherrypy.org/cherrypy/3.0.3/
Best match: CherryPy 2.3.0
Downloading http://download.cherrypy.org/cherrypy/2.3.0/CherryPy-2.3.0.zip
Processing CherryPy-2.3.0.zip
Running CherryPy-2.3.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-ms6mC6/CherryPy-2.3.0/egg-dist-tmp-rfLhVW
zip_safe flag not set; analyzing archive contents...
cherrypy.config: module references __file__
cherrypy.lib.autoreload: module references __file__
cherrypy.lib.covercp: module references __file__
cherrypy.lib.profiler: module references __file__
cherrypy.tutorial.tut09_files: module references __file__
cherrypy.tutorial.tut10_http_errors: module references __file__
cherrypy.test.benchmark: module references __file__
cherrypy.test.modpy: module references __file__
cherrypy.test.test: module references __file__
cherrypy.test.test_core: module references __file__
cherrypy.test.test_session_filter: module references __file__
cherrypy.test.test_static_filter: module references __file__
cherrypy.test.test_wsgiapp_filter: module references __file__
Adding CherryPy 2.3.0 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/CherryPy-2.3.0-py2.5.egg
Searching for kid>=0.9.6
Reading http://pypi.python.org/simple/kid/
Reading http://www.kid-templating.org/
Reading http://kid.lesscode.org/
Reading http://lesscode.org/projects/kid/
Reading http://kid-template.sourceforge.net/
Reading http://splice.sf.net/kid/
Reading http://prdownloads.sourceforge.net/splice/
Best match: kid 0.9.6
Downloading http://pypi.python.org/packages/2.5/k/kid/kid-0.9.6-py2.5.egg#md5=3fc089344a884e7fc954b239a32c649f
Processing kid-0.9.6-py2.5.egg
creating /usr/python252/lib/python2.5/site-packages/kid-0.9.6-py2.5.egg
Extracting kid-0.9.6-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding kid 0.9.6 to easy-install.pth file
Installing kidc script to /usr/python252/bin
Installing kid script to /usr/python252/bin

Installed /usr/python252/lib/python2.5/site-packages/kid-0.9.6-py2.5.egg
Searching for Cheetah>=2.0.1
Reading http://pypi.python.org/simple/Cheetah/
Reading http://www.CheetahTemplate.org/
Reading http://sourceforge.net/project/showfiles.php?group_id=28961
Best match: Cheetah 2.0.1
Downloading http://files.turbogears.org/eggs/Cheetah-2.0.1-py2.5-linux-i686.egg
Processing Cheetah-2.0.1-py2.5-linux-i686.egg
creating /usr/python252/lib/python2.5/site-packages/Cheetah-2.0.1-py2.5-linux-i686.egg
Extracting Cheetah-2.0.1-py2.5-linux-i686.egg to /usr/python252/lib/python2.5/site-packages
Adding Cheetah 2.0.1 to easy-install.pth file
Installing cheetah-compile script to /usr/python252/bin
Installing cheetah script to /usr/python252/bin

Installed /usr/python252/lib/python2.5/site-packages/Cheetah-2.0.1-py2.5-linux-i686.egg
Searching for Extremes>=1.1
Reading http://pypi.python.org/simple/Extremes/
Best match: Extremes 1.1
Downloading http://pypi.python.org/packages/2.5/E/Extremes/Extremes-1.1-py2.5.egg#md5=4015e2546295858558cca16faca5f34f
Processing Extremes-1.1-py2.5.egg
Moving Extremes-1.1-py2.5.egg to /usr/python252/lib/python2.5/site-packages
Adding Extremes 1.1 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/Extremes-1.1-py2.5.egg
Searching for PyProtocols>=1.0a0dev-r2302
Reading http://pypi.python.org/simple/PyProtocols/
Reading http://peak.telecommunity.com/PyProtocols.html
Reading http://peak.telecommunity.com/dist/
Best match: PyProtocols 1.0a0dev-r2302
Downloading http://files.turbogears.org/eggs/PyProtocols-1.0a0dev_r2302-py2.5-linux-i686.egg
Processing PyProtocols-1.0a0dev_r2302-py2.5-linux-i686.egg
Moving PyProtocols-1.0a0dev_r2302-py2.5-linux-i686.egg to /usr/python252/lib/python2.5/site-packages
Adding PyProtocols 1.0a0dev-r2302 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/PyProtocols-1.0a0dev_r2302-py2.5-linux-i686.egg
Searching for PasteDeploy
Reading http://pypi.python.org/simple/PasteDeploy/
Reading http://pythonpaste.org/deploy/
Reading http://pythonpaste.org/deploy/paste-deploy.html
Best match: PasteDeploy 1.3.2
Downloading http://pypi.python.org/packages/source/P/PasteDeploy/PasteDeploy-1.3.2.tar.gz#md5=877fcf3fa025a65147fbae87e1765b65
Processing PasteDeploy-1.3.2.tar.gz
Running PasteDeploy-1.3.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-SL6FQe/PasteDeploy-1.3.2/egg-dist-tmp-0ZwyIO
warning: no files found matching 'docs/*.html'
warning: no previously-included files found matching 'docs/rebuild'
Adding PasteDeploy 1.3.2 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/PasteDeploy-1.3.2-py2.5.egg
Searching for Paste>=1.3
Reading http://pypi.python.org/simple/Paste/
Reading http://pythonpaste.org
Best match: Paste 1.7.1
Downloading http://pypi.python.org/packages/source/P/Paste/Paste-1.7.1.tar.gz#md5=1c975cd645cd4aff86dab47c6d9059e1
Processing Paste-1.7.1.tar.gz
Running Paste-1.7.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-CY3Uka/Paste-1.7.1/egg-dist-tmp-0ay6jw
Adding Paste 1.7.1 to easy-install.pth file

Installed /usr/python252/lib/python2.5/site-packages/Paste-1.7.1-py2.5.egg
Finished processing dependencies for TurboGears==1.0.7

</pre><br /><br />至此说明安装基本成功,呵呵...
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252870" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 21:40:46 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252870</link>
        <guid>http://www.javaeye.com/topic/252870</guid>
      </item>
          <item>
        <title>MySQL数据库操作实战</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://touya.javaeye.com">touya</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251307" style="color:red;">http://www.javaeye.com/topic/251307</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天项目发布，要做数据移行，要实现的功能很变态，时间很紧迫，基本上是使出了全身解数，才能有快又准地完成工作，期间发现很多小技巧串联起来使用，效果的确非常好。<br /><br />武器：<br />1 mysqldump+mysql命令=>数据的导入导出，备份恢复<br /><br />2 perl命令行=>很多时候，你有一个想法，它就能只用一句话，帮你实现它，省得编写很多代码的麻烦<br /><br />3 shell命令=>组合拳，单独的命令谁都会，组合起来使用，需要一些经验的积累<br /><br />4 强大的编辑器支持UltraEdit/EmEdit等=>UltraEdit最专业，但不支持字符集转换；EmEdit支持字符集转换，且最新版有很多插件可供选择，基本够常见的操作了，对于WEB开发人员来说，常需要在GB2312、utf8或者其他国家语言euc-jp、shift-jis等等编码中转来转去，EmEdit的确是首选，特别赞的还有EmEdit的录制键盘动作并播放的功能<br /><br />常见组合：<br />1 数据移行时：<br />mysqldump --opt -t -h locahost -P 23236 -p mydb table -w "id>27000" > table.sql<br />>输入密码<br />OK , mydb中的表table中id大于27000的所有数据列的INSERT语句就保存到table.sql中了。-h、-P、-p就不多说了，--opt 是mysqldump的最常用组合选项，可以认为是加速语句；-t 则很有用，表示--no-create-info，就是你不需要建表语句，只需要数据（INSERT语句）；-w就是where条件，也非常有用，让你有选择的导出数据。其他常见选项有：-d ： 只需要建表语句，不需要insert语句；-c ：给每个insert语句加上列名（field），默认时，insert语句是“insert into `table` values (1),(2),(3);”，而加上-c后，就变成了“insert into table(id) values (1),(2),(3);”。有什么用？一会儿自会明白。<br /><br />如果表中数据非常多，导出insert语句就非常长（默认情况下，一个表的所有数据都在一个insert语句中，不换行），要查看这个文件常常引起死机，无论是linux下用vi，less查看，还是windows用EmEdit等编辑器，因为他们都是以行为单位load数据的，一行的数据过大就会内存占用过大，怎么办？<br /><br />你发现，只需要在EmEdit里查找“),(”这个字符串，将它替换为"),\n("，也就是加个换行，就行了，于是就这么做，结果发现——当数据量达到上万时，EmEdit就像数羊一样一个一个替换，等它换完，你都睡了一觉了！！<br /><br />怎么办呢？你当然知道写个脚本就行了，很容易，但是花的时间多，还需要测试，有简单办法吗？恩，那就轮到perl单命令行上场了：<br />perl -i.bak -pe 's/\),\(/\),\n\(/g' table.sql<br />OK，替换结束，且生成了一个备份文件table.sql.bak，如果你发现写错了，效果不对，还有救：）<br /><br />当然了，如果你会用sed、awk等强大的编辑工具，这个也是小case，这里就不多说了。<br /><br />2 数据导入<br />导出的数据经过处理，就要导入目标数据库，现在有一个表，字段非常多，其中主键为id，导入另一个数据库的相同表里，但是id不想直接插入，而是只要数据，id最好是自动生成的，跟在目标数据表最末一条数据之后即可，以免主键冲突。怎么搞呢？<br />这时候就能用上刚才说到的-c选项了，加了-c，导出的数据有field列，只需要把其中的id列都替换为空即可：）<br />这个替换过程，用EmEdit或上面说到的perl命令行都可以，只是速度的区别了。<br /><br />3 接上面的问题，老数据导入了新的表，生成了一串新的连续id，但和老数据完全不一样了，现在有其他几张表中使用了老数据的id作为外键，要把它们统一改为新的id。例如：<br />老数据中table.id=10010，有一个表table2.table=10010,是外键关系，要把这个table2.table改为新数据表中自动产生的那个id，就比如说是6041.现在手头上的数据只有老id列表，且知道插入新表中的id是自增的，每次加1，从6041开始，怎么快速修改 table2，table3中的相应外键呢？<br />一个文件：<br />10010<br />10201<br />11301<br />11499<br />……<br /><br />要替换成：<br />update table2 set table=6041 where id=10010;<br />update table2 set table=6042 where id=10201;<br />update table2 set table=6043 where id=11301;<br />update table2 set table=6044 where id=11499;<br />……<br /><br />我们可以这么组合手头的工具：<br />perl -i.bak -pe 'BEGIN {$x=6041} s/^(\d+)/update table2 set table=$x where id=$1;/ ; $x++' file.txt<br />OK，搞定<br />这个例子的特色其实就是perl命令行中的BEGIN的用法，有begin，当然有end，具体就自己查查文档吧：）<br /><br />4 还有EmEdit中的录制键盘动作并播放也很常用，毕竟写正则比较费脑子，用工具虽然处理速度慢一些，但是思考速度要快很多。今天碰到一件事，需要把服务器上某个目录中的bmp图片都转为jpg格式，也是要使用组合拳的，其中就用到了EmEdit的录制播放功能。<br />已知某目录下有N多bmp图片，通过convert命令可以转格式（安装Image::Magick模块即可）<br />怎么搞？<br />find ./ -name "*.bmp" > bmp.txt<br />先拿到文件列表再说。<br /><br />在EmEdit中打开该列表，一行行文件名。<br />你发现你想做的就是：<br />./dir1/dir2/file1.bmp<br />./dir1/dir2/file2.bmp<br />./dir1/dir2/file3.bmp<br />转变为：<br />convert ./dir1/dir2/file1.bmp ./dir1/dir2/file1.jpg<br />convert ./dir1/dir2/file2.bmp ./dir1/dir2/file2.jpg<br />convert ./dir1/dir2/file3.bmp ./dir1/dir2/file3.jpg<br /><br />这是一个非常有规律的动作，在行首，按shift+End（选择），ctrl+c（复制），End（到行尾），空格，ctrl+v（粘贴），backspace三次，输入jpg，HOME到行首，输入convert空格，下一行，HOME到行首<br />只要把这个操作序列记录下来，对每行都是一样操作，这时就可以使用EmEdit的录制+播放功能了，录制完成后，按F4快捷键，一爽到底~~yeah~~<br /><br />运行之后要删除原图：<br />在shell下：<br />find ./ -name "*.bmp" | xargs -n1 rm -f<br />(找到本目录下的bmp图片文件名列表，一个一个传给rm -f，删之，慎用)<br /><br />5 数据库恢复（从bin-log中恢复数据库也是一个非常重要的技巧），出现误操作或DB服务器不幸意外丢失数据时，常常要查bin-log来试图恢复数据，下次接着聊吧，累了……<br /><br />呵呵，乱写写，好像不只是数据库操作了，不过挺实在，欢迎各位拍砖吧
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251307" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 15:03:42 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251307</link>
        <guid>http://www.javaeye.com/topic/251307</guid>
      </item>
          <item>
        <title>贴一段遍历memcached缓存对象的小脚本</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robbin.javaeye.com">robbin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252345" style="color:red;">http://www.javaeye.com/topic/252345</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          memcached因为性能的缘故，没有提供遍历整个缓存当中对象的功能，不过memcached也提供了很多命令来监控memcached的状态，例如stats命令就有：<br /><br /><pre name="code" class="ruby">stats
stats reset
stats malloc
stats maps
stats sizes
stats slabs
stats items
stats cachedump slab_id limit_num
stats detail [on|off|dump]</pre><br /><br />不一一详细解释了，比较有价值的是stats items和stats cachedump，以及stats detail dump这几个命令，用前两条命令，实际上我们可以遍历整个memcached缓存(尽管效率低下)，后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。<br /><br />因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况，所以花了几十分钟用ruby写了一个小脚本，用来方便的统计缓存对象，此外它还可以让你方便的发送stats命令。用法很简单：<br /><br />1、统计memcached server当中的对象：<br /><br />./memcached.rb <br /><br />输出的结果大致是这样的：<br /><br /><pre name="code" class="java">Problem : 4564
GroupPost : 5643
User : 27133
Group : 144
...
Post : 44442
PostText : 255286
......
views : 36260
Forum : 27
Category : 15065</pre><br />可以告诉你每个对象缓存的确切数量，比方说PostText被缓存了25万个对象，页面被缓存了3.6万个。这个统计方法是根据Rails内置的Cache生成的key做的解析，也许你要根据自己的应用调整一下解析代码。<br /><br />2、统计memcached的对象和对象的大小<br /><br />./memcached.rb stats sizes<br /><br />3、监控memcached的缓存操作情况<br />./memcached.rb stats detail on<br />./memcached.rb stats detail dump<br />./memcached.rb stats detail off<br /><br />以下是该脚本的源代码，写的很粗糙。<br /><br /><pre name="code" class="ruby">#!/usr/bin/env ruby
require 'socket'

# stats
# stats reset
# stats malloc
# stats maps
# stats sizes
# stats slabs
# stats items
# stats cachedump slab_id limit_num
# stats detail [on|off|dump]

class Memcache
  class &lt;&lt; self
    def open(host, port)
      s = TCPSocket.open(host, port)
      yield s if block_given?
    ensure
      s.close if s
    end
  
    def command(command_string, s)
      s.send(command_string + "\r\n", 0)
      buff = []
      until ["END", "OK", "DELETE", "ERROR"].include?(line = s.gets.strip) do
        buff &lt;&lt; line 
      end
      buff
    end
  
    def exec(command_string, host = "javaeye", port = 11211)
      open(host, port) { |socket| command(command_string, socket).each {|line| puts line } }
    end
    
    def cache_stats(host = "javaeye", port = 11211)
      cache_objects = {}
      open(host, port) do |socket|
        slabs = []
        command("stats items", socket).each do |line|
          slab_id = line.split[1].split(":")[1].to_i
          slabs &lt;&lt; slab_id unless slabs.include?(slab_id)
        end
        slabs.each do |slab_id|
          puts "browse slab #{slab_id}..."
          command("stats cachedump #{slab_id} 0", socket).each do |item|
            key = item.split[1].split("/")[0].to_s
            cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 1
          end
        end
      end
      cache_objects.each_pair {|key, value| puts "#{key} : #{value}"}
    end
  end
end

if ARGV.size == 0
  Memcache.cache_stats
else
  Memcache.exec(ARGV.join(" "))
end
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252345" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 18:07:21 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252345</link>
        <guid>http://www.javaeye.com/topic/252345</guid>
      </item>
          <item>
        <title>django 1.0   .......</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://okcomputer.javaeye.com">okcomputer</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252248" style="color:red;">http://www.javaeye.com/topic/252248</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我下了个django1.0试了试然后执行:</p>
<pre name="code" class="python">&gt;&gt;&gt; from django.template import Template   
&gt;&gt;&gt; t = Template("My name is {{my_name}}.")   
&gt;&gt;&gt; print t  </pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>确出现下面错误信息:</p>
<pre name="code" class="python">&gt;&gt;&gt; t = Template("My name is {{my_name}}.")
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  File "C:\Python25\Lib\site-packages\django\template\__init__.py", line 164, in
 __init__
    if settings.TEMPLATE_DEBUG and origin is None:
  File "C:\Python25\Lib\site-packages\django\conf\__init__.py", line 28, in __ge
tattr__
    self._import_settings()
  File "C:\Python25\Lib\site-packages\django\conf\__init__.py", line 57, in _imp
ort_settings
    raise ImportError("Settings cannot be imported, because environment variable
 %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SE
TTINGS_MODULE is undefined.</pre>
<p>&nbsp;</p>
<p>是什么原因啊&nbsp; </p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252248" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 15:28:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252248</link>
        <guid>http://www.javaeye.com/topic/252248</guid>
      </item>
          <item>
        <title>应用服务器上django与数据库的问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://molinshow.javaeye.com">molinshow</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252047" style="color:red;">http://www.javaeye.com/topic/252047</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天使用了下django发现一个与python-mysql有关的问题。。安装python-mysql要求先安装mysql我使用的是leopard系统，如果不安装mysql的话py－mysql就会安装报错。。我的问题就是，在实际产品环境中，固然有应用服务和数据库同在一台服务器上的情况，那如果是应用服务(django项目)与数据库各一台服务器的话，应用服务器为了能够安装使用python-mysql岂不是也要安装个mysql才行呢
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252047" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 10:53:59 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252047</link>
        <guid>http://www.javaeye.com/topic/252047</guid>
      </item>
          <item>
        <title>安装Debain 4手记（1）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aiaiya.javaeye.com">aiaiya</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251851" style="color:red;">http://www.javaeye.com/topic/251851</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: green"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有人说redhat9同比当前的linux发行版，就好像win95和xp的区别。：）对比fedora、ubuntu、SUSE最后debian的发行版还是比较合适的，自己动手试试看。安装下来，很简单。就是firefox3的安装卡壳在gtk的升级，也罢。流水帐如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、下载netinst CD image，并刻盘。就别整硬盘安装了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址 http://cdimage.debian.org/debian-cd/4.0_r4a/i386/iso-cd/debian-40r4a-i386-netinst.iso<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、安装的过程一路回车。完成之后，需要将新添加的用户放入sudo组，首先进入su<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加文件的写权限 chmod u+w /etc/sudoers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑/etc/sudoers文件 找到这一 行："root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 撤销文件的写权限 chmod u-w /etc/sudoers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、为宽屏显示器调整分辨率<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先使用dpkg-reconfigure xserver-xfree86选中1440 900的分辨率，注销<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果出现不能全部显示的情况，就需要使用 xvidtune 手动调整(三星940bw与Geforce2gti组合就有这样的问题)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、调整字体<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有朋友已经讲的非常清楚了 http://www.linuxdiyf.com/viewarticle.php?id=75877<br />待续<br /></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251851" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Oct 2008 18:40:57 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251851</link>
        <guid>http://www.javaeye.com/topic/251851</guid>
      </item>
          <item>
        <title>Bash编程学习笔记（一）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yuanyao.javaeye.com">yuanyao</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251717" style="color:red;">http://www.javaeye.com/topic/251717</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">Shell变量及相关的命令</span><br />一个变量就是内存中被命名的一块存储空间.一个Shell变量的名字可以包含数字,字母和下划线,变量名的开头只准许是字母和下划线.变量名中的字母是大小写敏感的,变量名没有限制.<br />Shell可以是以下两种:Shell环境变量和用户定义变量.<br /><span style="color: blue">1.Shell环境变量</span><br />环境变量是用来定制Shell的运行环境,保证Shell命令的正常运行.所有环境变量会传递给Shell的子进程,这些变量大多数在/etc/profile文件中初始化,而/etc/profile是在用户登录的时候执行的,这个文件由系统管理员编写,用来为系统的所有用户建立一个通用的环境.可以在~/.profile文件中给部分或全部环境变量赋不同的值,它同样在登录的时候执行,或者在~/.bashrc,~/bash_login和~/.bash_profile中修改,它们在Bash启动的时候执行.<br /><br />一些重要的可修改的Bash环境变量<br /><br />BASH	Bash的完整路径名<br />CDPATH	包含cd命令要逐个查找的路径,cd命令在这些路径下查找 作为参数传递给它的目录名.如果CDPATH没有设置,cd命令则查找当前目录<br />EDITOR	在应用程序中使用的默认的编辑器<br />ENV	linux查找配置文件的路径<br />HISTFILE&nbsp; 存放历史记录的文件的路径名<br />HOME	用户的主目录名字<br />IFS	Bash用来分割命令行中参数的分割符号<br />MAIL	用户的主目录的命令<br />MAILCHECK&nbsp; Shell应该多久检查一次用户的系统邮箱,并在有新邮件的时候通知用户<br />PATH	包含用户检索路径的变量 --Shell依据这个变量在它指出的目录下面查找外部命令和程序<br />PPID	父进程的ID号<br />PS1	出现在命令行的主Shell提示符,通常被设置为$,但是这是可以修改的<br />PS2	出现在一个命令的第二行的二级Shell提示符号<br />PWD	很熟悉,当前工作目录的名字<br />TERM	用户的控制终端的类型<br /><br />一些重要的只读Bash环境变量<br /><br />$0	程序的名字<br />$1~$9	命令行参数1~9的值<br />$*	所有命令参数的值<br />$@	所有命令行参数的值<br />$#	记录了命令行参数的总个数<br />$$	当前进程的ID号<br />$?	最近一次命令的退出状态<br />$!	最近一次后台进程的ID号<br /><br /><br /><span style="color: blue">2.用户定义的变量</span><br />用户定义的变量在Shell脚本中用来作为临时的存储空间,他们的值在程序执行的过程中是可以改变的.这些变量可以设置为只读的,而且也可以被传递给定义它们的那个Shell脚本,不同于其他的编程语言,在Bash编程编程语言中,不需要定义并初始化一个Shell变量,一个没有被初始化的Shell变量自动地被初始化为一个空串.<br /><br /><br />set命令可以打印出目前所有的Shell变量.<br /><br />好了,来先写一个简单的Shell吧(为了避免自己写的脚本与系统命令重名,建议shell脚本以.sh结尾. 但自己写的脚本还是可能与系统自带的脚本重名, 建议命名前通过$ which Shellname.sh).<br /><br />vi一个hello.sh放在ScriptFile文件夹下<br /><pre name="code" class="java">$vi hello.sh</pre><br />文件内容:{<br />date<br />who<br />}<br /><pre name="code" class="java">$cd ScriptFile
$./hello.sh</pre><br />显示如下:<br /><pre name="code" class="java">yaoyuan@yaoyuan-desktop:~/ScriptFile$ ./hello.sh
yaoyuan  tty7         2008-10-11 21:09 (:0)
yaoyuan  pts/0        2008-10-11 22:47 (:0.0)</pre><br /><br /><span style="color: red">控制Shell提示符</span><br /><br />Bash允许很方便地控制Shell提示符,可以指定一个或多个特殊字符作为提示符变量(PS1,PS2等),以此可以显示不同的Shell提示符.<br /><br />一些有用的特殊字符及其描述<br /><br />\H	主机域名的全称<br />\T	时间,格式为hh:mm:ss,12小时格式<br />\d	日期,格式为"weekday month date"<br />\h	计算机的主机名的第一部分(第一个"."前面的部分)<br />\s	用户shell的名字<br />\t	时间,格式为hh:mm:ss,23小时<br />\u	当前用户的用户名<br />\v	Bash的版本号<br />\w	当前的工作目录<br /><br />来试一下<br /><br /><pre name="code" class="java">yaoyuan-desktop$PS1='\t$'
23:29:56$PS1='\s-\v$'
bash-3.2$PS1='\v$'
3.2$PS1='\H$'
yaoyuan-desktop$PS1='\s$'
bash$PS1='\H$'
yaoyuan-desktop$</pre><br /><br /><br /><span style="color: red">变量声明</span><br /><br />Bash并不要求声明变量,但是可以使用declare和typeset命令来声明变量,对它们进行初始化,并设定它们的属性.一个变量的属性规定了该变量可以被赋给的值的类型和该变量的范围.一个Bash变量默认是一个字符串,但是可以把一个变量定义为一个整型值.<br /><br />声明变量,初始化变量,设置它们的属性<br />declare[+-options][name[=value]]<br />typeset[+-options][name[=value]]<br /><br />-a	每一个"name"是一个数组<br />-f	每一个"name"是一个函数<br />-i	"name"是一个整数<br />-r	给每一个"name"标记上只读的属性<br />-x	表示每一个"name"都可以被子进程访问到<br /><br />再试试看:<br /><br /><pre name="code" class="java">yaoyuan-desktop$declare -i age=42
yaoyuan-desktop$echo $age
42</pre><br /><br /><pre name="code" class="java">yaoyuan-desktop$declare -rx OS=linux
yaoyuan-desktop$echo $OS
linux</pre><br /><br />使用name=value,改变一个变量的值<br /><pre name="code" class="java">yaoyuan-desktop$echo $age
42
yaoyuan-desktop$age=100
yaoyuan-desktop$echo $age
100
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251717" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Oct 2008 00:00:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251717</link>
        <guid>http://www.javaeye.com/topic/251717</guid>
      </item>
          <item>
        <title>关于一个算法设计问题，值得想想，大家来看看</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wansishuang.javaeye.com">wss71104307</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251709" style="color:red;">http://www.javaeye.com/topic/251709</a>&nbsp;
          发表时间: 2008年10月11日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果使用与<em><strong><span style="color: darkred">图</span></strong></em>相关的知识，设计算法来找出一段程序代码中：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)定义了但未被使用的变量; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)使用了但没有被定义的变量; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)其他与变量相关的错误<br /><br /><br />我的初步想法是：<br />&nbsp; <br />&nbsp;&nbsp; 1.定义一个变量类，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class Var<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 属性： name,type，isInit(是否初始化)，initVal(初始化值)，isUsed(是否被使用过);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法： 一些基本方法；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; 2.程序代码中每个声明的变量（new个Var）,作为图的一个结点，用<strong>邻接表</strong>来实现图。<br />&nbsp;&nbsp; 3.对使用的每个变量，对图进行搜索（BFS或者DFS)，来看是不是被定义过的。（根据Var的name和type判断）并改变isUsed属性。<br />&nbsp;&nbsp; 4.再对图遍历次，根据Var的isUsed属性看是否有定义了但没被使用的变量。<br />&nbsp;&nbsp; 5.可以增加些Var属性，来判断是否有重复定义，是否初始化错误之类的。（<span style="color: blue">解决问题3</span>）<br /><br /><br />请教各位JE上的大虾们，可以从下面几个方面但不限于谈谈自己看法（不用说的太复杂，说说思想就行)：<br />&nbsp;&nbsp;&nbsp; 1.对我的想法做出评价<br />&nbsp;&nbsp;&nbsp; 2.如果必须用图，有没有更好的实现办法<br />&nbsp;&nbsp;&nbsp; 3.不考虑用图，有没有更好的解决办法.(考虑O(n))<br />&nbsp;&nbsp;&nbsp; 4.具体的编译器是怎么实现的这些问题的
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251709" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 11 Oct 2008 23:06:43 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251709</link>
        <guid>http://www.javaeye.com/topic/251709</guid>
      </item>
          <item>
        <title>台式机上安装双系统(winXP+CentOS),从硬盘安装</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://touya.javaeye.com">touya</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251309" style="color:red;">http://www.javaeye.com/topic/251309</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在linux的操作系统很多，排名靠前的有乌班图啊、SUSE、大便（Debian）等等，不过这些排名是指桌名linux系统，也就是在和 windows一拼，而实际用作生产服务器的linux系统，还是CentOS比较稳定，且可以免费升级，好处多多，唯一需要的就是管理员你需要学习一把<br /><br />=======================================================<br /><br />　据DesktopLinux.com日前公布的调查报告显示，在过去的一年中，Linux在桌面市场的用户数量翻了一番。<br />^!}"I<br />　　报告显示，Ubuntu是最受欢迎的Linux版本，用户的选择比例高达30%。当然，这里所说的Ubuntu版还包括其姊妹版本Kubuntu、Xubuntu和Edubuntu。<br />　　此外，SUSE所占比例为21%，位居第二；其他Debian版本占14%，排名第三；Fedora/红帽位居第四，所占比例为9%；Gentoo比例为7%，排名第五。而其他Linux版本所占比例为18%。<br /><br />=======================================================<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 为了系统地学一把CentOS，决定从安装开始，折腾一把家里的台式机吧，反正硬盘300G，多的就是，嘿嘿<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准备工作：已经在C盘安装了WinXP，并用一键Ghost做好了备份，并且将备份文件copy到移动硬盘上，做好最坏打算，yeah~~<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后开始：<br />1 下载CentOS的安装盘，我的电脑是64位的，所以下载了x64版本的CentOS-4.7-x86_64-binDVD.iso<br />2 使用PQMagic分区工具在dos下做一个3G左右的FAT32分区（CentOS4.7只有2.5G，所以选择3G，如果是CentOS5.2，那就要5G了）和一个空闲分区，大小看你硬盘和喜好了，我给linux26G左右的空间<br />3 进入windows，将CentOS的映像文件放入刚才的FAT32分区中，并解压出两个文件（isolinux目录下的vmlinuz和 initrd.img），放在上述分区的根目录中备用（因为Grub不认ntfs，只能这么搞，如果你装WinXP的时候使用fat分区，随便放哪里都行）<br />4 下载GRUB4DOS，当前最新版0.4.3（http://sarovar.org/frs/?group_id=320），解压，取出其中的grldr文件（引导文件），放到系统盘根目录下，修改C:\boot.ini，最末尾添加一行：<br />c:\grldr=GRUB4DOS<br />注1：如果启动时根本没有选择菜单，说明timeout时间过短，设长一点吧<br />注2：boot.ini是系统文件，不能直接编辑，在命令行里用attrib修改其权限（attrib boot.ini -r -h -s），就能直接修改了，然后再恢复即可（attrib boot.ini +r +h +s）<br />5 重启系统，会出现GRUB4DOS的选项，选择后进入命令行，则输入：<br />grub>root (hd0,6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设置当前根目录位置，hd0是第一块硬盘，6是设备代号，一个一个尝试就行了，目标就是那个fat32分区，因为我系统上只有那一个fat分区，所以很容易确定<br />grub>kernel /vmlinuz<br />grub>initrd /initrd.img<br />grub>boot<br /><br />OK，下面进入CentOS的安装了，选择语言，选择安装文件源=>硬盘驱动器，选择CentOS映像所在的分区，之后就是CentOS安装本身的问题了，这里要提醒的只剩下分区问题：<br /><br />由于是安装双系统，怕把原来的分区搞坏，所以不敢用自动分区，还是手工分区吧，在那个空闲分区上操作，不断新建，挂载如下：<br />/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6000M<br />/home&nbsp;&nbsp;&nbsp;&nbsp; 3000M<br />/tmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1024M<br />/usr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6000M<br />/boot&nbsp;&nbsp;&nbsp;&nbsp; 100M<br />swap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1024M<br />/var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 剩下的所有<br /><br />稍微解释一下，boot目录是引导文件位置100M不变，根目录是系统文件位置，看你的CentOS有多大了，home目录是用户目录，如果是卖服务空间的话，这个目录应该安排为最大，否则就无所谓了，usr目录是安装软件目录，swap是虚拟内存，一般设为内存的两倍，但我的内存是2G，就设小一点了，var是web服务文件夹，由于经常做有用户上传文件的WEB应用，这个目录也就设为最大吧，当然，log文件一般也是/var/log目录中，如果你想限制log过大产生的危害，建议单独分一个区挂载/var/log(不过设置合理的logrotate可能更加有用，)<br /><br />OK，安装完毕！<br /><br />重启一看，现在的默认引导就由CentOS自带的GRUB控制了，如果你是一路回车安装的，那么可能默认引导CentOS，且不显示其他启动选项，这时需要修改/etc/grub.conf，将hiddenmenu注释掉，适当调整default值（0是第一个），重启即可生效。<br /><br />Try！and Have fun~~<br /><br />网上有人说linux系统最好安装在最后一个分区，我测试并没有这个问题，可能是手工分区的功劳吧，最后一个分区是一键Ghost使用的，懒得改了
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251309" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 15:06:09 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251309</link>
        <guid>http://www.javaeye.com/topic/251309</guid>
      </item>
      </channel>
</rss>