<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>pippo25</title>
    <description></description>
    <link>http://pippo25.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>当数据库中的文件超过4G</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/189033" style="color:red;">http://pippo25.javaeye.com/blog/189033</a>&nbsp;
          发表时间: 2008年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DB: SQL Server 2000<br />OS: windows server 2003<br />   前几天测试部提一个问题单：在进行压力测试的时候，应用程序抛出异常。大体如下：<br />未能为数据库 'testdb' 中的对象 'content_info' 分配空间，因为文件 'PRIMARY' 已满。at net.sourceforge.jtds.jdbc.JtdsStatement.executeBatch(JtdsStatement.java:944) at xx.xx.jtds.BatchOperate.process(BatchOperate.java:45)。显然提示的是分配的空间已满，查看存放文件的磁盘空间还有相当的空余，但是发现数据文件（.dat）已经接近4G，查看文件系统，是fat32，在fat32下单个文件最大值是不能超过4G的，问题就出在这里了，如果是nfs肯定就不会出现问题了。<br />   在sql server2000中对于数据文件和事务日志文件一般建议是分开存放的，如下在建立数据库的时候是可以选择存放位置的但是一旦建立成功将不能修改。<br /><img src="http://pippo25.javaeye.com/upload/picture/pic/13351/1086823f-4877-3530-9ad9-4f38c53ba47c.jpg" /><br /><img src="http://pippo25.javaeye.com/upload/picture/pic/13439/c7b6bd32-d791-3ef5-a8cd-c80b50127212.jpg" /><br />在图中可以看出对于文件可以有两种方式：<br />  1.自增长，这种好处是不需要人工干预，文件会根据设置伴随插入的数据变大。缺点就是由于受文件系统的制约单个文件达到文件系统可以管理的单个文件的最大值后，将不能在增长，这样应用程序会出出错。<br />  2.设置限制文件的大小，可以设置最大为2G，那么在fat32文件系统下就不会出现文件系统不能支持的大文件了，但是这样的缺点就是，需要创建多个文件每个文件指定能增长的到的最大值 （因为sql server不会在一个文件达到最大值后自动创建新的文件，这个需要人工巡检）。<br /><br />可以编写一个小程序尝试一下（设置数据库数据文件大小为2M，当所有数据文件大小都达到最大值后，必然报错）<br />如：（数据库驱动使用的jtds，sql server一定要升级到SP3以上哦，不然报不能建立连接，jtds要求SP3）<br /><pre name="code" class="java">public class BatchOperate 
{

	public static void main(String[] args) 
	{
		Connection conn;
		Statement stmt;
		String sql = null;
		try 
		{
			Class.forName("net.sourceforge.jtds.jdbc.Driver");
			Enumeration drivers = DriverManager.getDrivers();
			while(drivers.hasMoreElements())
			{
				System.out.println(drivers.nextElement().getClass().getName());
			}
			System.out.println(DriverManager.getDriver("jdbc:jtds:sqlserver"));
			conn = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.1.101:1433/testdb", "sa", "sa");
			stmt = conn.createStatement();
			for(int i = 0; i &lt; 1000000; i++)
			{
				sql = "insert into content_info values(" + i + 
		            ",'pippo25pippo25','ftp://192.168.1.5/media/1.wmv'," +
				    "'pippo25pippo25','pippo25pippo25',0,0,0)";
				stmt.addBatch(sql);
				if(i % 1000 == 0)
				{
					stmt.clearBatch();
				}
				stmt.executeBatch();
			}
			stmt.close();
			conn.close();
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		} 
		catch (ClassNotFoundException e) 
		{
			e.printStackTrace();
		}
	}
}</pre><br />  哪种方式更好，就取决于实际使用中的文件系统了。<br /><br />  说到这里简单阐述一下几种文件系统：<br />  文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构；即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区，或文件系统种类。因此，可以说"我有2个文件系统"意思是他有2个分区，一个存文件，或他用 "扩展文件系统"，意思是文件系统的种类。<br />  文件系统是操作系统与驱动器之间的接口，当操作系统请求从硬盘里读取一个文件时，会请求相应的文件系统（FAT 16/32/NTFS）打开文件。扇区是磁盘最小的物理存储单元，但由于操作系统无法对数目众多的扇区进行寻址，所以操作系统就将相邻的扇区组合在一起，形成一个簇，然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然，簇是操作系统所使用的逻辑概念，而非磁盘的物理特性。 <br /><br />  为了更好地管理磁盘空间和更高效地从硬盘读取数据，操作系统规定一个簇中只能放置一个文件的内容，因此文件所占用的空间，只能是簇的整数倍；而如果文件实际大小小于一簇，它也要占一簇的空间。所以，一般情况下文件所占空间要略大于文件的实际大小，只有在少数情况下，即文件的实际大小恰好是簇的整数倍时，文件的实际大小才会与所占空间完全一致。<br />  为什么fat32只能单个文件大小不会超过4G?<br />  硬盘在没有进行格式化之前是不可以使用的，格式化就是要给他一个文件系统。FAT32文件系统管理一个文件需要FDT(File Directory Table)和FAt(File Allocation Table)两个表合作才能完成，首先在FDT表中会记录文件的创建时间、大小、文件名称、文件的第一FAT表项等等，每一个表项大小为32bit，注意喽使用32bit存储文件大小，这就是文件最大值是2^32（4G）大小了，终于知道为什么文件有4G的限制了。那么FAT表呢，FAT32顾名思义，每一个表项32bit，每一个表项对应磁盘卷上的每一个簇，这就是说表项数目=簇数目=磁盘卷大小/簇大小。这样文件存放的时候首先由FDT表存储文件第一簇占用的FAT表项的地址，这样就可以根据FDT表查找到了FAT表中的相应表项目，FAT表项存储文件存放下一个簇的表象地址，这样形成一个存储连，当到达文件末尾的时候在FAT最后一个表象中表示出来。<br />大体图像如下：<br /><img src="http://pippo25.javaeye.com/upload/picture/pic/13437/118288e5-c50d-36a3-8802-7bd438ef1c35.jpg" /><br />FAT表的下面代表表项地址，上面一行是表象中的内容记录的时下一个表象的地址，这样形成存储链
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/189033#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Sat, 03 May 2008 11:33:34 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/189033</link>
        <guid>http://pippo25.javaeye.com/blog/189033</guid>
      </item>
      <item>
        <title>简要描述wsdl</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/188914" style="color:red;">http://pippo25.javaeye.com/blog/188914</a>&nbsp;
          发表时间: 2008年05月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用webservice也已经有一段时间了，现在比较清闲，书写一下自己的心得。<br />  wsdl（Web Service Description Language）,描述怎样提供网络服务，包括与什么协议进行绑定、参数类型、校验（schema）、访问入口等等。 <br />   wsdl的元素类型如下：<br />   type、message、operation porttype(这四个元素是抽象的，只是定义一种描述)<br />   service binding port是具体的实现<br />   之间的依赖关系如下（图使用ppt作的，比较丑^_^）<br /><img src=" http://pippo25.javaeye.com/upload/picture/pic/13369/9b057d82-49f9-3a7a-9a19-f346068d1fbe.jpg " /><br />1.types：分为imapleType 和 complesType两种，如：<pre name="code" class="java">&lt;element name="add">
    &lt;complexType>
     &lt;sequence>
      &lt;element name="x" type="xsd:int"/>
      &lt;element name="y" type="xsd:int"/>
     &lt;/sequence>
    &lt;/complexType>
   &lt;/element></pre><br />2.Message：描述消息，使用types类型定义的参数组成消息<br />如：<pre name="code" class="java">&lt;wsdl:message name="addRequest">

      &lt;wsdl:part element="impl:add" name="parameters"/>

   &lt;/wsdl:message></pre><br />3.Operation:描述操作。使用message描述的参数。定义了一个访问入口的 请求/响应消息对。<br /> 如：<pre name="code" class="java">&lt;wsdl:operation name="subtract">

         &lt;wsdl:input message="impl:subtractRequest" name="subtractRequest"/>

         &lt;wsdl:output message="impl:subtractResponse" name="subtractResponse"/>

      &lt;/wsdl:operation></pre><br />4.porttype：定义了所有操作的集合，由operation组成。<br />如：<pre name="code" class="java">&lt;wsdl:portType name="EngineImpl">

      &lt;wsdl:operation name="add">

         &lt;wsdl:input message="impl:addRequest" name="addRequest"/>

         &lt;wsdl:output message="impl:addResponse" name="addResponse"/>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="subtract">

         &lt;wsdl:input message="impl:subtractRequest" name="subtractRequest"/>

         &lt;wsdl:output message="impl:subtractResponse" name="subtractResponse"/>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="divide">

         &lt;wsdl:input message="impl:divideRequest" name="divideRequest"/>

         &lt;wsdl:output message="impl:divideResponse" name="divideResponse"/>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="multiply">

         &lt;wsdl:input message="impl:multiplyRequest" name="multiplyRequest"/>

         &lt;wsdl:output message="impl:multiplyResponse" name="multiplyResponse"/>

      &lt;/wsdl:operation>

   &lt;/wsdl:portType></pre><br />上面的四个元素只是描述，没有涉及到真正的服务实现方式。<br />5.Service：相关服务访问点的集合。<br />6.Binding:结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定，从这一层次开始，描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定，也可以将PortType与MIME/SMTP相绑定等。<br />如：<pre name="code" class="java">&lt;wsdl:binding name="EngineImplSoapBinding" type="impl:EngineImpl">

      &lt;wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      &lt;wsdl:operation name="add">

         &lt;wsdlsoap:operation soapAction=""/>

         &lt;wsdl:input name="addRequest">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:input>

         &lt;wsdl:output name="addResponse">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:output>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="subtract">

         &lt;wsdlsoap:operation soapAction=""/>

         &lt;wsdl:input name="subtractRequest">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:input>

         &lt;wsdl:output name="subtractResponse">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:output>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="divide">

         &lt;wsdlsoap:operation soapAction=""/>

         &lt;wsdl:input name="divideRequest">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:input>

         &lt;wsdl:output name="divideResponse">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:output>

      &lt;/wsdl:operation>

      &lt;wsdl:operation name="multiply">

         &lt;wsdlsoap:operation soapAction=""/>

         &lt;wsdl:input name="multiplyRequest">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:input>

         &lt;wsdl:output name="multiplyResponse">

            &lt;wsdlsoap:body use="literal"/>

         &lt;/wsdl:output>

      &lt;/wsdl:operation>

   &lt;/wsdl:binding></pre><br />7.port:Port描述的是一个服务访问入口的部署细节，包括通过哪个Web地址(URL)来访问，应当使用怎样的消息调用模式来访问等。其中消息调用模式则是使用Binding结构来表示。<br />如：<pre name="code" class="java">&lt;wsdl:port binding="impl:EngineImplSoapBinding" name="EngineImpl">

         &lt;wsdlsoap:address location="http://localhost:8010/WebService/services/EngineImpl"/>

      &lt;/wsdl:port></pre><br /><br />一个WSDL中，definition是整个文档的根元素，一个文档中可能存在多个Service元素，service是服务的入口点。 Service 中可能有多个port，每个port对应一个PortType，PortType可能对应一组operation
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/188914#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 02 May 2008 20:50:16 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/188914</link>
        <guid>http://pippo25.javaeye.com/blog/188914</guid>
      </item>
      <item>
        <title>主管低估了我的能力？应该不是</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/159709" style="color:red;">http://pippo25.javaeye.com/blog/159709</a>&nbsp;
          发表时间: 2008年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚刚做完一个新的项目，最让我感到自豪的是由我来主导完成的，而且做的还不错，得到了一个不错的结果；现在又回到了原来的部门，现在工作的重心又不在我这边了，现在的工作并没有放在我这边，倒是维护工作比较多，所以感觉比较郁闷。<br />    昨天沟通绩效，主管问我，如果怎样怎样抽走什么什么人，我能不能把什么搞定，其实我现在对这些已经很有信心了，而且非常自信自己的编程技术，那为什么做两个项目，在两个不同的部门得到的信任好像是不一样的，感觉到了很大的落差，直接的感觉是主管低估了我的能力，感觉自己不受重视，心理比较难过，最大的感受是，大不了离职啊。<br />    但是仔细想想，好像是我想错了，主管应该不会低估任何人，但是前提是我们要表现出来，让主管看到，首先要给他你能胜任的信心，我想了一下，为什么再上一个项目挥发会的如鱼得水，现在好像虎落平阳，应该是这样的，在新的项目中什么都是全新的，我很兴奋，更多的再投入，把自己的想法全部是现在项目中，得到了极大的满足感、成就感，这样让我更加积极的投入进去，表现了很大的热情，但是回到现在，我们都是几个人负责一个模块，这样让自己始终不是很上心，感觉做好了也不是自己的成就，什么都要现成的，不参与更多的讨论，只想做好眼前的事情，这样的想法让我在项目组是不能生存的，曾经想换个环境，但是想想，现在做不好，难道换个环境就能好吗？<br />    不错换个环境什么都是新的，新的起点，新的心情，新的挑战，也许有一个新的未来，但是做好现在，努力表现，改变现在的局面好像更有挑战性，会让自己更有成就感，更重要的是要保存男人的自尊心，要像一个男人一样的离开。<br />    现在感觉技术是不难掌握的，现在人的素质应该体现在怎样能快速掌握一项新的技术，做事效率有多高，遇到问题分析问题解决问题的能力。不是什么做过了才会，应该是想办法利用现在的资源解决遇到的困难，这些事情说是很容易的，努力下次再写博客的时候，自己这方面的能力有所改观。<br />    不知道朋友们，你们在项目组顺心吗？感觉到了别人的重视吗？是不是也有感觉低估了自己的能力，如果是这样，感觉最大的问题应该是自己表现出来什么，是什么让领导这样认为，能有勇气选择程序员，相信我们都是适合这一行的，遇到问题不要认为自己不适合这样各行业，更不要认为自己搞不定，仔细想想，用的东西真的高深吗？<br />    当别人不认可自己的时候，多想想自己做了什么吧！现在不要动不动就像离职，因为这样可能会形成思维惯性，成为一种习惯！<br />    刚刚毕业一年，以后的路很长，很感谢现在的企业，努力吧，相信未来是美好的，如果那天真不想做了，就去行动，但是在做的时候，就把它做好，不要想其它的，如果想而不做，会破坏自己的心情，浪费自己的时间，作几年技术吧，应为我还深深爱着编程！<br />    祝福所有程序员，2008年大发展！
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/159709#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Jan 2008 12:48:55 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/159709</link>
        <guid>http://pippo25.javaeye.com/blog/159709</guid>
      </item>
      <item>
        <title>很基础但是现在才知道的问题</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/131587" style="color:red;">http://pippo25.javaeye.com/blog/131587</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<p><font face="Arial">1.java中的applet小程序是怎么运行在浏览器中的？</font></p>
<p><font face="Arial">以前一直以为是客户端装有jre或者安装了插件，现在明白了，原来使用浏览器中自带的虚拟机，但是由于IE对于java支持不完全，如果要确保良好运行还是需要安装jre的，javaPlug-in软件就是使applet程序运行在sun的jre中而不是浏览器自带的虚拟机中。</font></p>
<p><font face="Arial">2.jre版本管理</font></p>
<p><font face="Arial">java的解决办法是每一个软件自带一套jre版本，比如oracle等软件都会同时安装jre的，如果在同一台机器上安装多个带有jre的软件，那么机器上就存在多个jre版本了，应用程序怎么查找到属于自己的jre呢?&nbsp; </font></p>
<p><font face="Arial">操作系统寻找JRE的方式如下： </font></p>
<p><font face="Arial">先找当前目录下有没有JRE <br />
再找父目录下有没有JRE <br />
接着在PATH路径中找JRE <br />
注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最常用的是在PATH路径中找JRE，一般情况下，自己的程序运行之前都会先在批处理文件里面临时设置PATH，把自己用的JRE放到PATH路径最前面，所以肯定会运行自己带的JRE，不会造成版本混乱。 </font></p>
<p><font face="Arial">3.jre类库查找方法</font></p>
<p><font face="Arial">jre中的 JRE\lib\rt.jar这个jar包，包含了所有的java 2平台标准的类库， JRE中由ClassLoader负责查找和加载程序引用到的类库，基础类库ClassLoader会到rt.jar中自动加载，其它的类库，ClassLoader在环境变量CLASSPATH指定的路径中搜索，按照先来先到的原则，放在CLASSPATH前面的类库先被搜到，Java程序启动之前建议先把PATH和CLASSPATH环境变量设好，OS通过PATH来找JRE，确定基础类库rt.jar的位置，JRE的ClassLoader通过CLASSPATH找其它类库。</font></p>
<p><font face="Arial">4.Java的虚拟机启动和加载类库 </font></p>
<p><font face="Arial">在Console执行java.exe xxx命令以后，如前所述的寻找JRE，OS找到JRE目录，根据java.exe的传递参数，选择加载Server版的jvm.dll还是Client版的jvm.dll，然后加载jvm.dll，把控制权交给jvm.dll。 </font></p>
<p><font face="Arial">接下来，jvm.dll进行初始化，分配内存等等动作，然后在CLASSPATH路径中寻找class，找到class以后，寻找class中的程序入口点Main函数，然后从Main函数执行程序，在执行过程中，使用ClassLoader动态加载一系列引用到的类。当调用到native方法时，jvm.dll告诉OS在JRE\bin目录下寻找某某DLL文件，调入内存，于是实现了JNI调用。 </font></p>
<p><font face="Arial"></font>&nbsp;</p>
<p><font face="Arial"></font>&nbsp;</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/131587#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 13 Oct 2007 00:09:45 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/131587</link>
        <guid>http://pippo25.javaeye.com/blog/131587</guid>
      </item>
      <item>
        <title>上帝恩赐的爱情</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/129340" style="color:red;">http://pippo25.javaeye.com/blog/129340</a>&nbsp;
          发表时间: 2007年10月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;程序员的生活是枯燥的，除了上班，还要时时关注技术的发展，在学习中不断的成长；但是程序员的生活又是充实的，因为总会在不断的完成项目中得到自我满足；也许程序员在踏入工作岗位之前如果没有得到自己的爱情，就会让自己的感情生活一段时间是空白的，因为我们总喜欢乐此不疲的生活在程序带来的快乐中，忘却了生活的烦恼和缤纷绚丽......</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在想来我是那么的幸运，我在入职一年后终于得到了自己的爱情生活而且很有信心把这份感情酝酿出结果，想象几天前发生的一切就像电影的情节一样，那么巧合，所以我认为是上帝恩赐的爱情....</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007年3月我见了一个我最好朋友的学妹，她是那么的清纯，一点都没有这个城市的印记，在我看来深圳的女孩子都是那么追求完美的物质生活，这个城市有更多的老夫少妻，当然我不鄙夷这些事情，每一个人都会有自己的生活哲学，都会有自己的轨迹，这也是城市色彩吧，因为有了这些生活中的现象才不至于那么单调，空泛；要做的只是适应这些，漠视这些，而不是品头论足，更不是吃不到葡萄就说葡萄是酸的。但是她改变了我的想法，我多么想能和她在一起，但是想想现在自己的生活状态，有什么能力把爱说出口啊，我选择了沉默，这一沉默就接近半年，这边年时间我们只联系过一次，我更加投入到工作中，只有在这里我才能得到认可，得到满足，当然这更是一种逃避，一种懦弱的表现......</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007年9月16号，领导通知我当天要去南京出差，我和另一个同事预定了当晚飞往南京的航班，时间是晚上8：50，我们6：30 前往机场，但是就在机场门口我突然间发现自己忘记携带身份证，这下宣布我今晚不能走了，心里好烦，不断埋怨自己太过粗心，只好预定明天早上的航班前往南京，就这样我自己悻悻的坐上巴士回到家中，我在上网的时候，收到了一个骚扰电话，以往这种情况我是不会理的，但是这一次也许太郁闷了，就回了一下短信，也就是这个举动改变了许多事情，这个短信让我留住了我这一生最重要的人，留住了心中的那个女孩，因为事后听她说她要去北京了，可能这一去就不会再回来了，她就是想看一下我这个电话号码有没有在用，当晚的结果是她没有走.....</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二天，我离开深圳前往南京了，我们每天晚上都会发短信，这一切压抑了许久，终于迸发了，不怎么发短信的我，也可以把短信写到八九十个字，而且从来没有那么期盼短信的到来，我在南京呆了9天，这9天中，我们终于在一起了，终于我得到了想要的爱情，但是心里总感觉像是在做梦，怕自己做了一个美梦，在这九天里，天天期盼回到深圳，希望当面得到肯定的答案，感觉只有这样才能让自己安心，可能是让幸福击晕了头脑......</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007年9月26号回到深圳后，我就迫不及待的去找她，心中无限的激动......</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们真的在一起了，她为了我放弃了许多，现在更让我感到了一种责任，一种要好好照顾她的责任；更让我感到了一种安静，一种不要在漂泊的安静；更让我感到了一种渴望，一种永远向上的渴望。以前是工作填补了我的生活空白，现在我的生活更加聚焦了，自己更知道怎么生活了，知道怎么合理花销了，她几天就改变了我许多的想法........</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在回忆一下，如果那天没有忘记带上身份证，我就会去南京了，也就是那段时间她不可能打通我的电话了，她就会去北京了，当天我们就会天南海北了，我的生活也就像以往的轨迹一样，错乱而有序的进行着......</p>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/129340#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Sat, 06 Oct 2007 13:55:14 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/129340</link>
        <guid>http://pippo25.javaeye.com/blog/129340</guid>
      </item>
      <item>
        <title>什么是程序员？程序员应该具备什么样的特质？</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/111299" style="color:red;">http://pippo25.javaeye.com/blog/111299</a>&nbsp;
          发表时间: 2007年08月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面试的时候，曾把应聘第一职位写为软件工程师、第二职位写为程序员，面试官问&ldquo;程序员与软件工程师有什么区别&rdquo;，我顿时无语。做程序员已经有一年了，现在知道了应该做什么，这是我最大的幸运，这也是自己心慰的地方，但是我有时候就怀疑自己适不适合做一个程序员，对自己的职业规划产生彷徨。我感觉程序员首先要具有追求完美的性格，看到不符合规范的代码就要去更改，去让自己的代码更加漂亮，当然这是有代价的，比如牺牲自己的休息时间，但是现在对于我来讲，我感觉自己缺少这种追求完美的精神，当然也不是对自己的代码只要能运行不出大问题，要求这么简单，但是总感觉在骨子里面缺少这种永远追求完美的精神。</p>
<p>&nbsp;&nbsp;&nbsp; 我使用的是java，很多人评论真正的程序员需要至少掌握两门语言，但是我现在还是没有精力也没有那个能力，现在只是想先把java掌握好了，在考虑其他的，我不知道各位同仁认为怎样是一个java高手，是拥有比较宽广的知识面，还是对jdk的深入熟悉，我曾给自己制定目标，要熟练掌握spring ，hibernate,struts,tomcat全面深入掌握，怎么是深入掌握呢？就是清晰的知道原理。也许自己写的太宽泛了，但是我现在发现工作好像对我们不要求这么多，我也明白什么都是靠自己学习，但是我现在不知道程序员初期的路因该是什么样子的，是慢慢一门一门的精通还是先宽泛的了解，再慢慢地深入，好象对于工作，后者更能适应，更能得到别人的好感，被人的认可，我们是在挣钱，不是搞研究，也不是在学问，这是不止一个对我说的话，但是我们是吃这碗饭的，我还是想知道为什么能这样，为什么那个样就不行，我想理论上能讲得通，实践上能通得过。</p>
<p>&nbsp;&nbsp;&nbsp; 我现在感觉能做好程序，最重要的还是基础，不需要多么华丽，因为华丽是锦上添花，是建立在基础上的，那么怎么才是高手呢？怎么才能在技术中游刃有余呢？我不知道有多少人喜欢看jdk源代码？有多少人能耐下心来把基础图书多读几遍，因为基础书籍显然对我们帮助不会比一些框架书籍帮助来的明显，我说的帮助是指得到别人的认可，因为职场也向商场一样谁先掌握了新技术谁就得到了先机，谁就能得到更高的薪水，这样得到机会后再深入掌握，这些人都是智者，都是勤奋的人，都会慢慢成功，因为对自己要求不一样，得到的也会不一样，我知道我只是一个菜鸟，我没有什么资格来讲这一些，但是一年来，我真的有些彷徨了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我有时间就喜欢翻翻基础书籍，想去理解一下JVM，现在的感觉是时间真的很少，好像很难把什么都看一遍，但是感觉每天都想在混沌中度过，看似很忙但是真正忙事情的时间又有多少呢？50%？还是更少！可怜的不是不知道怎么做，可怜的是不知道做什么，这段时间想了好多，不知道怎么去整理自己的学习阶段，更可悲的是，每天下班回来，却会慢慢懒惰下来，我没有逼迫自己，只是想让自己明白，人真正对己很有帮助的其实就是那么几年时间，也许环境宽松了，自己也就松下来了，比如上学的时间，鬼知道自己干了什么！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 不知道大家是否也有这样的阶段，不知道自己在做什么，不知道自己想要什么，希望大家介绍自己的成长经历，能帮我指点迷津，我不知道该怎么发展了，是应该深入还是应该拓展知识面，怎样能在有限的时间内间的两者！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 今天晚了，可能脑子不清楚了，这几天真的好颓废，有些话不应该是我这个菜鸟说的，更不是我能品头论足的，因为我还没有那种阅历！</p>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/111299#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 11 Aug 2007 23:48:00 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/111299</link>
        <guid>http://pippo25.javaeye.com/blog/111299</guid>
      </item>
      <item>
        <title>java中的TimeZone</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/103330" style="color:red;">http://pippo25.javaeye.com/blog/103330</a>&nbsp;
          发表时间: 2007年08月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于时间分为 本地挂钟时间 和 UTC时间，所谓的UTC时间就是指表示自从标准基准时间（称为&ldquo;历元（epoch）&rdquo;，即 1970 年 1 月 1 日 00:00:00 GMT）以来的指定毫秒数 ，毫无疑问这个时间所有计算机都是一样的。那么我们任务栏上的时间是怎么回事呢？那是OS会把计算机所在的当前时区加上，如：中国在东八区，就会在UTC时间上加上 8（小时）*60*60*1000作为本地挂钟时间（不考虑夏令时）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这篇文章主要是说明，为什么修改了&ldquo;系统时区&rdquo;，程序不能马上把打印时间切换到修改的时区，而是需要重新再次执行该程序的时候，才能生效（<font face="Arial"><a href="http://www.javaeye.com/post/338220">http://www.javaeye.com/post/338220</a></font>）。</p>
<p>JDK源代码中</p>
<font face="Arial">
<div class="code_title">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDefaultZone()&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>TimeZone&nbsp;tz&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;get&nbsp;the&nbsp;time&nbsp;zone&nbsp;ID&nbsp;from&nbsp;the&nbsp;system&nbsp;properties </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>String&nbsp;zoneID&nbsp;=&nbsp;(String)&nbsp;AccessController.doPrivileged( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;GetPropertyAction(</span><span class="string">&quot;user.timezone&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;if&nbsp;the&nbsp;time&nbsp;zone&nbsp;ID&nbsp;is&nbsp;not&nbsp;set&nbsp;(yet),&nbsp;perform&nbsp;the </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">//&nbsp;platform&nbsp;to&nbsp;Java&nbsp;time&nbsp;zone&nbsp;ID&nbsp;mapping. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(zoneID&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;zoneID.equals(</span><span class="string">&quot;&quot;</span><span>))&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;country&nbsp;=&nbsp;(String)&nbsp;AccessController.doPrivileged( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;GetPropertyAction(</span><span class="string">&quot;user.country&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;javaHome&nbsp;=&nbsp;(String)&nbsp;AccessController.doPrivileged( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;GetPropertyAction(</span><span class="string">&quot;java.home&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;zoneID&nbsp;=&nbsp;getSystemTimeZoneID(javaHome,&nbsp;country); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(zoneID&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoneID&nbsp;=&nbsp;GMT_ID; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(NullPointerException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;zoneID&nbsp;=&nbsp;GMT_ID; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">//&nbsp;Get&nbsp;the&nbsp;time&nbsp;zone&nbsp;for&nbsp;zoneID.&nbsp;But&nbsp;not&nbsp;fall&nbsp;back&nbsp;to </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&quot;GMT&quot;&nbsp;here. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>tz&nbsp;=&nbsp;getTimeZone(zoneID,&nbsp;</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(tz&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;If&nbsp;the&nbsp;given&nbsp;zone&nbsp;ID&nbsp;is&nbsp;unknown&nbsp;in&nbsp;Java,&nbsp;try&nbsp;to </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;get&nbsp;the&nbsp;GMT-offset-based&nbsp;time&nbsp;zone&nbsp;ID, </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;a.k.a.&nbsp;custom&nbsp;time&nbsp;zone&nbsp;ID&nbsp;(e.g.,&nbsp;&quot;GMT-08:00&quot;). </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;gmtOffsetID&nbsp;=&nbsp;getSystemGMTOffsetID(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(gmtOffsetID&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;zoneID&nbsp;=&nbsp;gmtOffsetID; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tz&nbsp;=&nbsp;getTimeZone(zoneID,&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">assert</span><span>&nbsp;tz&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">final</span><span>&nbsp;String&nbsp;id&nbsp;=&nbsp;zoneID; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>AccessController.doPrivileged(</span><span class="keyword">new</span><span>&nbsp;PrivilegedAction()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;run()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span class="string">&quot;user.timezone&quot;</span><span>,&nbsp;id); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>defaultZoneTL.set(tz); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>&nbsp;</p>
<p>显然这段代码的意思是：如果在系统变量中找不到设置的TimeZone就会设置新的，如果找到了就使用原来存在的，那为什么重新执行该程序就可以了呢？</p>
<p>&nbsp;&nbsp;&nbsp; 因为这里的系统指的是JRE而不是我们的OS，当执行一个程序的时候后，JVM会创建一个JVM实例，这个实例的生命周期就是这个进程的生命的周期，我们写入的系统变量都是些入了这个JVM实例，当然再次执行这个程序，又会创建一个新的JVM实例，原来写入的系统变量也就不存在了。</p>
<p>&nbsp;&nbsp;&nbsp; 这里介绍一下</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>String&nbsp;zoneID&nbsp;=&nbsp;(String)&nbsp;AccessController.doPrivileged( &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;GetPropertyAction(</span><span class="string">&quot;user.timezone&quot;</span><span>));&nbsp;&nbsp;</span> </li>
</ol>
</div>
这是一个特权处理（摘自<font face="Arial"><a href="http://ganzhi.bokee.com/1791837.html">http://ganzhi.bokee.com/1791837.html</a></font>）：
<p>来自不同的位置的代码可以由一个CodeSource对象描述其位置和签名证书。根据代码的CodeSource的不同，代码拥有不同的权限。例如所有Java SDK自带的代码都具有所有的权限，而Applet中的代码则具有非常受限的权限，用户编写的代码可以自己定制权限（通过SecurityManager）。<br />
当执行一段代码时，这段代码的StackTrace包含了从Main开始所有正在被调用而且没有结束的方法。在这个调用过程中，很有可能出现跨多个不同的CodeSource的调用序列。由于CodeSource不同，这些代码通常拥有不同的权限集。只有所有途经的CodeSource都具有对应的权限集合时，当前正在运行的代码才能存取某个Resource。<br />
而doPrivileged方法是对这个规则的一种补充。他类似于Unix中的setuid程序。Unix中的login程序必须访问password文件从而获得用户授权信息，但是用户不能随意的访问password文件。因此，login程序具有setuid位，它不管被哪个用户所调用，都具有root的权限。<br />
调用doPrivileged的方法不管其StackTrace中其他方法的权限，而仅仅根据当前方法的权限来判断用户是否能访问某个resource。也即可以规定用户只能用某种预定的方式来访问其本来不能访问的resource。<br />
使用doPrivileged方法和使用setuid位都有需要注意的地方，例如仅执行必要的操作。否则，可能带来安全上的问题。</p>
<p>对于</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">new</span><span>&nbsp;GetPropertyAction(</span><span class="string">&quot;user.timezone&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>就是&ldquo;利用需要取到值的系统变量名称创建GetPropertyAction对象&rdquo;，该对象的作用可以在特权处理中重新得到系统变量名称代表的变量值。</p>
<p>&nbsp;&nbsp;&nbsp; 这段代码是jdk1.4和1.5中的公共部分，在1.5中 增加了ThreadLocal保证不同线程逗留保留一份该时区系统属性的副本，保证同一个进程中的不同线程使用到<font face="Arial">TimeZone.getDefault()可以从ThreaLocal中直接取出！</font></p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/103330#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 11 Aug 2007 11:33:00 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/103330</link>
        <guid>http://pippo25.javaeye.com/blog/103330</guid>
      </item>
      <item>
        <title>java 类的生命周期</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/77006" style="color:red;">http://pippo25.javaeye.com/blog/77006</a>&nbsp;
          发表时间: 2007年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #003366;">好长的一段时间，对于类的生命周期十分模糊，现在经<span style="font-size: x-small;">过一段时间的学习，对</span>于类的生命周期的理解已经变得清晰，类的生命周期如下所示：</span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">&nbsp;<img src="../../../upload/picture/pic/5598/3242ce52-913b-4871-9e59-ceb819f5df64.bmp " alt="" /></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 类的装载就是通过类加载器把.class二进制文件转入jvm的方法区，并在堆区创建描述该类的java.lang.Class对象,用来封装数据。如果要获取这个Class对象可以通过实例的getClass()或者直接通过的类的静态方法.class。JVM规范允许预先加载，在预料到某个类要使用的时候就加载这个类，如果这个类不存在，也不会马上抛出异常，只有在程序主动使用这个类的时候才会抛出异常，如果这个类一直没有使用，那么就永远不会抛出异常。</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;<img src="../../../upload/picture/pic/5599/fe92e6a6-7d72-4317-a9fe-8d5b8a0ce50b.bmp " alt="" /></span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 对于验证是验证加载的二进制文件是否符合规范，如有没有继承final类等。</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 准备就是为静态成员分配内存空间，并设置默认值，byte short long flloat 都是0，对象类型为null，boolean类型为false.</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 解析就是对于编译型常量使用直接的内存地址代替变量，如final static int a = 10;但是对于在编译的时候不能得到具体值得变量不做变换，如final static int a = Math.random()。在完成上述工作后，就是对于静态变量的初始化。</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 对于静态变量的初始化时在主动使用的时候才会初始化他们。以下6种情况是主动使用</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 创建类的实例，途经包括：使用new 创建对象实例，clone等</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 使用反射方法</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 使用静态方法</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 使用类或者接口的静态变量，给静态变量赋值</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 创建子类</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 把类声明为启动类，如: java Test01</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp; 这时候会初始化类的静态变量，执行静态代码块</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp;我想主要说一下类的卸载：只有没有任何引用指向Class对象的时候，这时候才会卸载类，结束类的生命周期。在JVM中有三类加载器 根加载器，扩展加载器，系统加载器，JVM始终保持这几类加载器的引用，加载器会把其加载的类放在一个集合中，这样就保留着对于Class对象的引用（不可以操作JVM的加载器），所以由JVM的加载器加载的类是不会卸载的，如果要验证一个类是否可以卸载，可以自己创建一个类加载器(</span></span><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">继承ClassLoader) Loader，加在一个类Test,然后让loader的实例赋值为null，loader加载的Class对象也赋值为null；再次创建Loader的实例，并加载Test，这时候可以打印这两个Test的Class对象的哈希值（是不一样的），如一下代码(加载器MyclassLoader.java不给出了):</span></span></p>
<p><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
<div class="code_title">java 代码</div>
</span><span style="font-size: 13.5pt; font-family: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: x-small;">
<div class="dp-highlighter"><ol class="dp-j">
<li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MainTest01&nbsp; &nbsp;&nbsp;</span></span> </li>
<li><span>{ &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp; &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClassLoader&nbsp;loader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MyClassLoader();&nbsp; &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz&nbsp;=&nbsp;loader.findClass(</span><span class="string">"Test"</span><span>); &nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(clazz.hashCode()); &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MyClassLoader(); &nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz&nbsp;=loader.findClass(</span><span class="string">"Test"</span><span>); &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(clazz.hashCode()); &nbsp;&nbsp;</span> </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
<li class="alt"><span>&nbsp;&nbsp;</span> </li>
<li><span>} &nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;&nbsp; 如果注释掉第9句，那么会抛出类重复加载异常。</p>
</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/77006#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 May 2007 14:41:00 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/77006</link>
        <guid>http://pippo25.javaeye.com/blog/77006</guid>
      </item>
      <item>
        <title>存储过程中游标的使用</title>
        <author>pippo25</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pippo25.javaeye.com">pippo25</a>&nbsp;
          链接：<a href="http://pippo25.javaeye.com/blog/76509" style="color:red;">http://pippo25.javaeye.com/blog/76509</a>&nbsp;
          发表时间: 2007年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 游标分为动态游标与静态游标，在本文中只是讲述一下，我在使用动态游标的一点心得，至于游标定义使用具体操作在SQL server帮助中可以查询。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在创建一个游标，目的是为了读取基表A中的test字段的值并把该值插入到一个临时表temp中，在循环读取游标中的值并把插入到临时表的时候，这时候对基表有插入操作，那么新插入的纪录能不能动态的加入到游标中呢？能不能马上看到这种变化呢？</p>
<p>&nbsp;&nbsp; 存储过程：</p>
<p>&nbsp;</p>
<p><span style="font-family: Arial;">CREATE PROCEDURE TEST<br />&nbsp;AS<br />CREATE TABLE #TEMP<br />(<br />&nbsp;&nbsp;&nbsp; [TEST] [VARCHAR]<br />)</span></p>
<p><span style="font-family: Arial;">DECLARE T&nbsp; CURSOR&nbsp; FOR SELECT TEST FROM A ORDER BY TEST<br />DECLARE @NUM&nbsp; BIGINT<br />DECLARE @VARINT VARCHAR(50)<br />--一定要赋初值，不然在循环中@NUM的值不会改变<br />SELECT @NUM = 0<br />OPEN T<br />FETCH NEXT FROM T INTO @VARINT<br />WHILE @@FETCH_STATUS = 0<br />BEGIN<br />&nbsp;&nbsp;&nbsp; SELECT @NUM = @NUM+1<br />&nbsp;&nbsp;&nbsp; INSERT INTO #TEMP VALUES&nbsp; (@VARINT)<br />&nbsp;&nbsp;&nbsp; --在变量等于5的时候插入基表纪录，验证该纪录会不会插入临时表#tenp，从而验证该内容是否动态加入游标<br />&nbsp;&nbsp;&nbsp; IF(@NUM = 5)<br />&nbsp;&nbsp;&nbsp; INSERT INTO A VALUES('3')<br />&nbsp;&nbsp;&nbsp; FETCH NEXT FROM T INTO @VARINT<br />END<br />--释放游标<br />CLOSE T<br />DEALLOCATE T</span></p>
<p><span style="font-family: Arial;">SELECT * FROM #TEMP<br />GO<br /></span></p>
<p>&nbsp;&nbsp; 下面分一下几种情况具体分析：</p>
<p>1.在上面的存储过程中给游标存入结果集的SQL查询语句中要求按照test字段升序排列，游标指向第五条纪录的时候，插入一条纪录数值为3，肯定也已经加入到了游标的结果集，只是由于结果集是按照test升序排列的，游标指向的当前位置不会改变，所以对于新插入的3 这条纪录是不会加入到临时表中的</p>
<p>2 .如果修改上面存储过程的语句如下：</p>
<p>&nbsp;<span style="font-family: Arial;">DECLARE T&nbsp; CURSOR&nbsp; FOR SELECT TEST FROM A </span></p>
<p><span style="font-family: Arial;">去掉ORDER BY TEST，那么在执行存储过程后会看到新插入的3这条纪录，因为在没有排序的情况下，游标结果集是按照基表顺序来的，在没有定义基表的聚集索引的情况下，插入一条记录到基表，是插入到最后面，这种情况下，新插入的的记录也显示在游标结果集的最后面，那么这种情况下，循环中就可以把信插入基表中的3 这条记录插入到临时表，也就可以显示出来了</span></p>
<p>3.上面提到聚集索引，在对基表创建聚集索引后，将会影响基表的实际无力存储顺序，所以在这种情况下，如果<span style="font-family: Arial;">DECLARE T&nbsp; CURSOR&nbsp; FOR SELECT TEST FROM A语句或者<span style="font-family: Arial;">DECLARE T&nbsp; CURSOR&nbsp; FOR SELECT TEST FROM A ORDER BY TEST情况下都不会看到新插入的3这条记录，原因如2 所述</span></span></p>
<p>总之，在动态游标的情况下，基表变化后会马上影响到游标结果集，至于能不能马上读出这种变化，就要看具体的游标声明语句</p>
          <br/>
          <span style="color:red;">
            <a href="http://pippo25.javaeye.com/blog/76509#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 May 2007 11:56:13 +0800</pubDate>
        <link>http://pippo25.javaeye.com/blog/76509</link>
        <guid>http://pippo25.javaeye.com/blog/76509</guid>
      </item>
  </channel>
</rss>