<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[软件点滴]]></title>
<link>http://blog.pfan.cn/billgacsli</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[（转）Solaris&nbsp;RBAC系统简介]]></title>
		<link>http://blog.pfan.cn/billgacsli/44855.html</link>
		<description><![CDATA[Solaris RBAC（Role-Based Access Control）系统简介 
转自http://blogs.sun.com/maxzhen/entry/solaris_rbac_role_based_access
众所周知，Solaris的安全性是世界领先的。而Solaris的RBAC系统（基于角色的存取控制系统）则为其领先性提供了强大的技术保证。最近因为一个项目需要，我有幸接触了一下RBAC系统，发现其复杂性估计也是世界第一了（天下没有免费的午餐啊）。
记得那天需要做项目中有关安全方面的设计，由于自己安全方面的相关知识十分缺乏（只知道root能干所有的事情，non-root只能缩在自己的home目录里面，权限少的可怜），只得去咨询一位安全方面的资深工程师。原以为在他办公室门口几分钟就可以问清楚的问题，结果，硬是被他揪到一个会议室里面连讲带画图的说了两个小时。最后，他告诉我两条结论：第一，我们项目目前的模块设计无法保证安全，需要重新进行功能模块划分；第二，按照他以往的经验，如果我出门不马上把他给我讲的写下来，通常情况下，24小时后就基本上忘的差不多了。
现在已经过了n个24小时了，记忆已经模糊。我必须把我还记得的一些写出来，以免下次再去问同样的问题^_*。
RBAC系统和以往root包打天下的系统最大的不同就是定义了许多特权（privileges(5)）。我们可以把这些特权都集中在root身上（那就是和以前的系统一样了），也可以把他们分配给不同的用户（于是，普通用户也就可以拥有部分的特权了）。其实，在本质上，我们是把特权分配给在系统中运行的用户进程，使得他们可以通过系统调用来请求操作系统内核来完成程序运行需要的功能。
在一台机器上，操作系统内核是真正的主宰者，拥有权力执行任何指令。保证一台机器的安全，从某种意义上来说就是保证操作系统内核不被怀有恶意的用户程序（通过系统调用）滥用。在RBAC系统中，请求执行某个系统调用，要求该用户进程拥有相应的特权。如果不具备相应的特权，系统调用的执行将会失败。
例如，root用户可以改写任何其他用户拥有的文件，这是因为root用户拥有“file_dac_write”的特权。当write()系统调用被执行的时候，内核将检查用户进程是否有file_dac_write特权，从而决定是否完成这个写操作。如果我们将“]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2009-06-29 19:57:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)删除NIS]]></title>
		<link>http://blog.pfan.cn/billgacsli/44712.html</link>
		<description><![CDATA[删除NIS 
转自http://blog.chinaunix.net/u2/80598/showart_1687152.html 
1）停止NIS服务守护进程 # /usr/lib/netsvc/yp/ypsttop 
2）删除NIS域名 # domainname “” # rm /etc/defaultdomain 
3）更换/etc/nsswitch.conf文件 # cp /etc/nsswitch.files /etc/nsswitch.conf 
4）删除文件及目录 master server：/nis、/var/yp/domainname、/var/yp/*.time、/var/yp/binding/* slave server：/var/yp/domainname、/var/yp/*.time、/var/yp/binding/* client：/var/yp/binding/* # rm -r /nis # rm -r /var/yp/domainname # rm /var/yp/*.time # rm -r /var/yp/binding/* 
5）编辑/var/yp/aliases文件，删除包含NIS域名的一行 
6）编辑/etc/hosts文件，删除配置NIS时添加的主机相关信息 
7）重启 # sync # reboot
&nbsp;配置NIS的步骤见http://blog.chinaunix.net/u2/80598/showart_1671156.html]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2009-06-26 11:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（原创）按字节截取含有中文汉字的字符串]]></title>
		<link>http://blog.pfan.cn/billgacsli/36969.html</link>
		<description><![CDATA[　　Java中1个char类型的变量可存储任意编码的1个字符，如1个ASC码和或1个中文字符，例如：含有3个ASC和含有3个汉字字符的字符串长度是一样的：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1ac".length()==3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"你好a".length()=3;&nbsp;但上述两个字符串所占的byte是不一样的，前者是3，后者是5（1个汉字2byte）。 请编写函数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;leftStr(String&nbsp;source,&nbsp;int&nbsp;maxByteLen) 　　从source中取最大maxByteLen个byte的子串。当最后一个byte恰好为一个汉字的前半个字节时，舍弃此byte。例如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str="我LRW爱JAVA";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,1)=="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,2)=="我";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,4)=="我LR";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,11)=="我LRW";或者，当最后一个byte恰好为一个汉字的前半个字节时，补全汉字（多截取一个byte）。例如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str="我LRW爱JAVA";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,1)=="我";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,2)=="我";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,4)=="我LR";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leftStr(str,11)=="我LRW爱";]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-21 00:32:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（原创）正则判断时间]]></title>
		<link>http://blog.pfan.cn/billgacsli/36952.html</link>
		<description><![CDATA[　　刚刚学习正则，正则正是很好很强大的东西。
　　练习下，时间格式为“HH:mm:ss”或“HH:mm”，采用24小时制。
普通方法为，分离出小时、分钟、秒分别进行判断：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;boolean&nbsp;timeCheck(String&nbsp;time,&nbsp;String&nbsp;owner)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检查时间字符串time是否满足格式“HH:mm:ss”或“HH:mm”，若不满足显示相应消息，并返回false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(time.equals("")){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg&nbsp;=&nbsp;owner+"&nbsp;:&nbsp;"+"Time&nbsp;is&nbsp;EMPTY.";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDialog.showError(Controller.getMainFrame(),&nbsp;msg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;hours,&nbsp;minutes,&nbsp;seconds&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;st&nbsp;=&nbsp;new]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 23:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[庞涓和孙膑问题]]></title>
		<link>http://blog.pfan.cn/billgacsli/36950.html</link>
		<description><![CDATA[　　一日，鬼谷子在2--100这99个数字中选了2个数字，然后把它们的和告诉了庞涓，把积告诉了孙膑。当然，庞涓不知道积是多少，孙膑不知道和是多少。第二日，庞涓遇见孙膑，很傲慢的对孙膑说：“虽然我不知道这两个数是多少但是我肯定你也不知道。”孙膑立刻还击道：“本来我不知道的，但是现在我知道这两个数是多少了。”庞涓想了一 会，说道：“现在我也知道这两个数是多少了。” 　　求这2个数..]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 21:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（原创）JavaToHtml]]></title>
		<link>http://blog.pfan.cn/billgacsli/36752.html</link>
		<description><![CDATA[　　为了方便在blog中粘贴源代码，特意找了这方面的工具（本来琢磨自己写，可惜能力有限，再次受打击了~~~）
JavaToHtml开源，Eclipse Plugin
　　大家都知道读源代码很累，读乱七八糟的源代码那就想吐了，所以格式化源代码还是很有必要的，不信看看下面的例子。
格式化后的漂亮效果：
import&nbsp;java.util.Vector;public&nbsp;class&nbsp;Stack&lt;T&gt;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Vector&lt;T&gt;&nbsp;content;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stack()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content&nbsp;=&nbsp;new&nbsp;Vector&lt;T&gt;();&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;push(T&nbsp;t)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content.add(t);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T&nbsp;peek()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(content.size()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;content.get(content.size()&nbsp;-&]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 19:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（原创）JAVA只有值传递]]></title>
		<link>http://blog.pfan.cn/billgacsli/36710.html</link>
		<description><![CDATA[　　不明白怎么那么多人对JAVA中的参数传递有疑问，Think In Java中指出“JAVA中只有值传递”（见3rd Edition P78注释1）。我觉得记住这点挺重要的。
　　参数传递有“值传递”和“引用传递”之分，那么首先要弄清楚什么是“值传递”，什么是“引用传递”，其区分准则是什么？（参考http://hi.baidu.com/alljava/blog/item/6dddd4ca4f19be46f31fe765.html）
　　区分准则：形参和实参的关系。如果形参是实参的拷贝，则为值传递；否则，如果形参是实参的引用，则为引用传递。　　显然，引用传递，改变形参的值将会影响实参；而值传递改变形参的值不会影响实参。　　不能根据实参为引用就判定为引用传递，也就是要区分传递引用与引用传递。
　　引用传递是C++的特性（C#等其它后继语言可能也沿袭了），其典型例子如下：#include &lt;iostream&gt;
using namespace std;

//值传递
//形参是实参的拷贝
void swapByValueTranf(int a, int b){        cout&lt;&lt;"形参地址: a = "&lt;&lt;&amp;a&lt;&lt;", b = "&lt;&lt;&amp;b&lt;&lt;" | swapByValueTranf"&lt;&lt;endl;
    int t = a;
    a = b;
    b = t;
}

//引用传递
//形参是实参的引用
void swapByReferenceTranf(int &amp;a, int &amp;b){    cout&lt;&lt;"形参地址: a = "&lt;&lt;&amp;a&lt;&lt;", b = "&lt;&lt;&amp;b&lt;&lt;" | swapByReferenceTranf"&lt;&lt;endl;
    int t = a;
    a = b;
    b = t;
}
void swapWithNonSense(int* a, int* b){    cout&lt;&lt;"形参地址: a = "&lt;&lt;&amp;a&lt;&lt;", b = "&lt;&lt;]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-25 15:36:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）JAVA经典例子]]></title>
		<link>http://blog.pfan.cn/billgacsli/36676.html</link>
		<description><![CDATA[摘自http://topic.csdn.net/u/20080617/15/706679c5-e108-4ec0-801b-75728ad19fe6.html
1.一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口（抽象类）的用处
package&nbsp;com.softeem.demo;/**&nbsp;*@author&nbsp;leno&nbsp;*动物的接口&nbsp;*/interface&nbsp;Animal&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;eat(Food&nbsp;food);}/**&nbsp;*@author&nbsp;leno&nbsp;*一种动物类:猫&nbsp;*/class&nbsp;Cat&nbsp;implements&nbsp;Animal&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;eat(Food&nbsp;food)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("小猫吃"&nbsp;+&nbsp;food.getName());&nbsp;&nbsp;&nbsp;&nbsp;}}/**&nbsp;*@author&nbsp;leno&nbsp;*一种动物类:狗&nbsp;*/class&nbsp;Dog&nbsp;implements&nbsp;Animal&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;eat(Food&nbsp;food)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("小狗啃"&nbsp;+&nbsp;food.getName());&nbsp;&nbsp;&nbsp;&nbsp;}}/**&nbsp;*@author&nbsp;leno&nbsp;*食物抽象类&nbsp;*/abstract&nbsp;class&nbsp;Food&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;pro]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 19:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）我眼中的Java经典书籍]]></title>
		<link>http://blog.pfan.cn/billgacsli/36675.html</link>
		<description><![CDATA[摘自http://www.knowsky.com/364533.html
　　什么叫“经典书籍”呢？&nbsp;&nbsp;&nbsp;&nbsp; 以往我们说，“一流的公司定标准，二流的公司搞技术，&nbsp;三流的公司做服务，末流的公司卖产品”，其实这话并非全无道理。厌恶M$的人不少，但嘴上骂归骂，底下照样用Windows， 赌咒发誓不用的也未必不想暗地里钻研一下其中的技术，再狠点，干脆只看Linux的字符界面，连X都不用。 然而为啥不见哪位仁兄自己只玩自己弄的OS呢？M$和UNIX家族在OS上显然是具有语言霸权， OS搞到这份上基本上就是“标准”了，你愿意白手起家？呵呵～～～&nbsp;&nbsp;&nbsp;&nbsp; 说了这些废话，我无非想说的是，所谓Java的“经典书籍”，最好的就是Java的标准，也就是SUN的官方资料： From java.sun.comJavaTM 2 SDK, Standard Edition Documentation Version 1.4.2 [下载] JavaTM 2 Platform, Standard Edition, v 1.4.2 API Specification [下载] JavaTM 2 Platform Enterprise Edition, v 1.4 API Specification [下载] The Java Language Specification, Second Edition [下载] The JavaTM Virtual Machine Specification, Second Edition [下载] Java 2 Platform, Standard Edition, White Papers The Java Tutorial [下载] The J2EE 1.4 Tutorial [下载] The Swing Tutorial SUN官方系列推荐书目 Thinking in JavaJava 编程思想by BrUCe Eckel第一版京京工作室译本[下载]第二版候捷译本[下载（部分章节）]第三版原版[下载] [翻译（部分章节）][本书主页]书评： (2004-5-28) &nbsp;&nbsp;&nbsp;&nbsp; 说TIJ是“经典”想必不会有什么人反对，然而也许有人说这]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 04:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)了解Java密码扩展的基础]]></title>
		<link>http://blog.pfan.cn/billgacsli/36674.html</link>
		<description><![CDATA[摘自http://www.knowsky.com/362221.html
Java密码扩展（The&nbsp;Java&nbsp;Cryptography&nbsp;Extension），是JDK1.4的一个重要部分，基本上，他是由一些包构成的，这些包形成了一个框架并实现了一些加密，密钥生成算法和协议，消息认证码等算法，这篇文章将想你介绍JCE的安装和使用。&nbsp;&nbsp;&nbsp; 值得注重的是，尽管JCE是JDK1.4的核心包的一部分，我们将首先用JDK1.2及高一点的版本向你演示一下假如安装配置JCE（静态安装）。稍后，将向你介绍如何在不安装的情况下使用JCE（动态安装）。最后，将演示怎么生成密钥和密码，及假如进行基本的加密.解密。提供者是什么？&nbsp;&nbsp;&nbsp; 提供者是特定加密算法的实现者，有的提供者（提供的加密技术）是免费的，有的不免费，IBM,&nbsp;Bouncy&nbsp;Castle,&nbsp;和&nbsp;RSA都是一些（加密）提供者.在本文的后面，我们将考察一下来自Bouncy&nbsp;Castle的RSA算法。Sun&nbsp;也向大家说明了假如实现自己的提供者（需要符合jDK的一些约定）。静态安装&nbsp;&nbsp;&nbsp; 在安装和使用JCE之前，你需要从&nbsp;Sun&nbsp;Web&nbsp;site（这里是以暗中sun的提供者为例）.获得他的安装包，JCE有sun他自己的安全提供者-sunJCE，为了吧sunJCE静态的安装到默认的提供者列表中，你需要修改安全属性文件：&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&lt;java-home&gt;\jre\lib\security\java.security&nbsp;(Win32)&nbsp;&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&lt;java-home&gt;/jre/lib/security/java.security&nbsp;(UNIX)假如你把JDK安装在C:\jdk1.3,你需要编辑以下文件：C:\jdk1.3\jre\lib\security\java.security为了安装SunJCE，你需要在以上文件中加入：security.provider.n=com.sun.cr]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 20:08:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）使用MessageFormat控制输出]]></title>
		<link>http://blog.pfan.cn/billgacsli/36673.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165741.html
本文是为ZDNet翻译的系列文章之一，原文已经发表在ZDNet网站Printf&nbsp;是很多C语言程序员喜欢的工具，当他们转而使用Java时他们非常的失望。Java有一个替代的方法但是那个方法和C语言的printf()&nbsp;&nbsp;函数的原理不一样。&nbsp;　　幸运的是，早期的Java库的开发者认识到创建一个更合适Java的工具而不是一个printf&nbsp;函数。&nbsp;　　java.text.MessageFormat&nbsp;允许开发者输出文本中的变量的格式。它是一个强大的类，就像下面的例子展示的那样：&nbsp;String&nbsp;message&nbsp;=&nbsp;"Once&nbsp;upon&nbsp;a&nbsp;time&nbsp;({1,date},&nbsp;around&nbsp;about&nbsp;{1,time,short}),&nbsp;there&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"was&nbsp;a&nbsp;humble&nbsp;developer&nbsp;named&nbsp;Geppetto&nbsp;who&nbsp;slaved&nbsp;for&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"{0,number,integer}&nbsp;days&nbsp;with&nbsp;{2,number,percent}&nbsp;complete&nbsp;user&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"requirements.&nbsp;";Object[]&nbsp;variables&nbsp;=&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;new&nbsp;Integer(4),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 20:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)String.getBytes()方法中的中文编码问题]]></title>
		<link>http://blog.pfan.cn/billgacsli/36672.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165753.html
String.getBytes()的问题String的getBytes()方法是得到一个字串的字节数组，这是众所周知的。但特别要注意的是，本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点，你会发现在一个平台上运行良好的系统，放到另外一台机器后会产生意想不到的问题。比如下面的程序，


class&nbsp;TestCharset&nbsp; 
{ 

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;TestCharset().execute(); 
&nbsp;&nbsp;&nbsp;&nbsp;} 

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;execute()&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;"Hello!你好！"; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bytes&nbsp;=&nbsp;s.getBytes(); 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("bytes&nbsp;lenght&nbsp;is:"&nbsp;+&nbsp;bytes.length); 


&nbsp;&nbsp;&nbsp;&nbsp;} 

} 在一个中文WindowsXP系统下，运行时，结果为：bytes&nbsp;leng]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 04:29:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)Java中浮点数的输出形式及可能引起的问题]]></title>
		<link>http://blog.pfan.cn/billgacsli/36671.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165759.html
近来在项目中使用到了一个数据库SQL语句，这个SQL语句是动态生成的，类似下面的方式：


&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;quantity&nbsp;=&nbsp;...; 
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;"&nbsp;+&nbsp;tableName&nbsp;+&nbsp;"&nbsp;(id,&nbsp;name,&nbsp;quantity)&nbsp;VALUES("&nbsp; 
+&nbsp;id&nbsp;+&nbsp;",'"&nbsp;+&nbsp;name&nbsp;+&nbsp;"',"&nbsp;+&nbsp;quantity&nbsp;+&nbsp;")"; &nbsp;&nbsp;&nbsp;&nbsp;系统正常运行1年多了，突然近段时间系统出错。由于生产环境缺乏充分的调试信息，所以，调试非常困难。经过艰苦的追踪和调试输出，发现问题出现在Double型的quantity的字符串表示上。因为近期系统中quantity遇到了一个比较大的值（大于了10的7次方），而Double型的quantity这儿解析为了类似“1.153E7”的科学计数法形式，虽然大部分的SQL兼容的驱动器基本都认识这种科学计数法形式的数字表示形式，但还是有一些不支持（是否SQL规范中有规定我不清楚，欢迎大家求证）。对于一些不支持这种数字表示形式的驱动器，问题就出来了，它会把它当成一个非法的数字从而报错。在Java中浮点数包括基本型float、double，以及对象包装类型的Float和Double，对于这些浮点数的输出，不管是显式地还是隐式地调用toString()得到它的表示字串，输出格式都是按照如下规则进行的：&#61548;&nbsp;&nbsp;&nbsp;&nbsp; 

如果绝对值大于0.001、小于10000000，那么就以常规的小数形式表示。&#61548;&nbsp;&nbsp;&nbsp;&nbsp; 
如果在上述范围之外，则使用科学计数法表示。即类似于]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 04:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）Hashtable和HashMap]]></title>
		<link>http://blog.pfan.cn/billgacsli/36670.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165770.html
Hashtable和HashMapHashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的，HashMap是Java&nbsp;1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的，而HashMap的方法不是。这就意味着，虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable，但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法，它创建一个线程安全的Map对象，并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时，你不能切断Hashtable中的同步（比如在一个单线程的应用程序中），而且同步增加了很多处理费用。第三点不同是，只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key，但任意数量的条目可以是空的value。这就是说，如果在表中没有发现搜索键，或者如果发现了搜索键，但它是一个空的值，那么get()将返回null。如果有必要，用containKey()方法来区别这两种情况。一些资料建议，当需要同步时，用Hashtable，反之用HashMap。但是，因为在需要时，HashMap可以被同步，HashMap的功能比Hashtable的功能更多，而且它不是基于一个陈旧的类的，所以有人认为，在各种情况下，HashMap都优先于Hashtable。]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 04:14:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）JAVA中正则表达式的应用－java.util.regex篇]]></title>
		<link>http://blog.pfan.cn/billgacsli/36669.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165734.html
现在JDK1.4里终于有了自己的正则表达式API包，JAVA程序员可以免去找第三方提供的正则表达式库的周折了，我们现在就马上来了解一下这个SUN提供的迟来恩物-&nbsp;-对我来说确实如此。&nbsp;1.简介：&nbsp;&nbsp;java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。&nbsp;它包括两个类：Pattern和Matcher&nbsp;Pattern&nbsp;一个Pattern是一个正则表达式经编译后的表现模式。&nbsp;&nbsp;Matcher&nbsp;一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。&nbsp;首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。&nbsp;以下我们就分别来看看这两个类：&nbsp;2.Pattern类:&nbsp;&nbsp;Pattern的方法如下：&nbsp;static&nbsp;Pattern&nbsp;compile(String&nbsp;regex)&nbsp;将给定的正则表达式编译并赋予给Pattern类&nbsp;&nbsp;static&nbsp;Pattern&nbsp;compile(String&nbsp;regex,&nbsp;int&nbsp;flags)&nbsp;同上，但增加flag参数的指定，可选的flag参数包括：CASE&nbsp;INSENSITIVE,MULTILINE,DOTALL,UNICODE&nbsp;CASE，&nbsp;CANON&nbsp;EQ&nbsp;&nbsp;int&nbsp;flags()&nbsp;返回当前Pattern的匹配flag参数.&nbsp;&nbsp;Matcher&nbsp;matcher(CharSequence&nbsp;input)&nbsp;生成一个给定命名的Matcher对象&nbsp;&nbsp;static&nbsp;boolean&nbsp;matches(String&]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 04:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）java.util包]]></title>
		<link>http://blog.pfan.cn/billgacsli/36668.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165807.html
本章介绍Java的实用工具类库java.util包。在这个包中，Java提供了一些实用的方法和数据结构。例如，Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间，提供随机数(Random)类产生各种类型的随机数，还提供了堆栈(Stack)、向量(Vector)&nbsp;、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。　　图1.1给出了java.util包的基本层次结构图。下面我们将具体介绍其中几个重要的类。　　　　　　　　　　　┌java.util.BitSet　　　　　　　　　　　│java.util.Calendar　　　　　　　　　　　│　　　　　　└java.util.GregorianCalendar　　　　　　　　　　　│java.util.Date　　　　　　　　　　　│java.util.Dictionary　　　　　　　　　　　│　　　　　　└java.util.Hashtable　　　　　　　　　　　│　　　　　　　　　　　　　└java.util.Properties　　　　　　　　　　　│java.util.EventObject　　　　　　　　　　　│java.util.ResourceBundle　　　　　　　┌普通类┤　　　　　　├java.util.ListResourceBundle　　　　　　　│　　　│　　　　　　└java.util.PropertyResourceBundle　　　　　　　│　　　│java.util.Local　　　　　　　│　　　│java.util.Observable　　　　　　　│　　　│java.util.Random　　　　　　　│　　　│java.util.StringTokenizer　　　　　　　│　　　│java.util.Vector　　　　　　　│　　　│　　　　　　└java.util.Stack　　Java.util┤　　　└java.util.TimeZone　　　　　　　│　　　　　　　　　　└java.util.SimpleTimeZone　　　　　　　│　　　┌java.util.En]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 20:53:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）JAVA正则表达式4种常用功能]]></title>
		<link>http://blog.pfan.cn/billgacsli/36667.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165801.html
JAVA正则表达式4种常用功能&nbsp;　　&nbsp;　　正则表达式在字符串处理上有着强大的功能，sun在jdk1.4加入了对它的支持&nbsp;　　　下面简单的说下它的4种常用功能：　　　　查询：　　以下是代码片段：String&nbsp;str="abc&nbsp;efg&nbsp;ABC";&nbsp;&nbsp;String&nbsp;regEx="a|f";&nbsp;//表示a或f&nbsp;&nbsp;Pattern&nbsp;p=Pattern.compile(regEx);&nbsp;Matcher&nbsp;m=p.matcher(str);&nbsp;&nbsp;boolean&nbsp;rs=m.find();&nbsp;　　　　如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern&nbsp;p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);　　　　提取：以下是代码片段：&nbsp; String&nbsp;regEx&nbsp;=&nbsp;".+\\(.+)$";String&nbsp;str&nbsp;=&nbsp;"c:\\dir1\\dir2\\name.txt";Pattern&nbsp;p&nbsp;=&nbsp;Pattern.compile(regEx);Matcher&nbsp;m&nbsp;=&nbsp;p.matcher(str);boolean&nbsp;rs&nbsp;=&nbsp;m.find();for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;m.groupCount();&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m.group(i));}　　　　以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount();　　　　分割：　　以下是代码片段：String&nbs]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 20:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)使用Java中的Date和Calendar类]]></title>
		<link>http://blog.pfan.cn/billgacsli/36666.html</link>
		<description><![CDATA[摘自http://www.chinaitpower.com/A200507/2005-07-24/165787.html
Java&nbsp;语言的Calendar(日历),Date(日期),&nbsp;和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.&nbsp;日期是商业逻辑计算一个关键的部分.&nbsp;所有的开发者都应该能够计算未来的日期,&nbsp;定制日期的显示格式,&nbsp;并将文本数据解析成日期对象.&nbsp;我们写了两篇文章,&nbsp;这是第一篇,&nbsp;我们将大概的学习日期,&nbsp;日期格式,&nbsp;日期的解析和日期的计算.我们将讨论下面的类:1、具体类(和抽象类相对)java.util.Date&nbsp;2、抽象类java.text.DateFormat&nbsp;和它的一个具体子类,java.text.SimpleDateFormat&nbsp;3、抽象类java.util.Calendar&nbsp;和它的一个具体子类,java.util.GregorianCalendar&nbsp;具体类可以被实例化,&nbsp;但是抽象类却不能.&nbsp;你首先必须实现抽象类的一个具体子类.Date&nbsp;类从Java&nbsp;开发包(JDK)&nbsp;1.0&nbsp;就开始进化,&nbsp;当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,&nbsp;比如说月,&nbsp;日,&nbsp;和年.&nbsp;这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,&nbsp;我们将在本文中进一步讨论它.&nbsp;这种改进旨在更好的处理日期数据的国际化格式.&nbsp;就象在JDK&nbsp;1.1中一样,&nbsp;Date&nbsp;类实际上只是一个包裹类,&nbsp;它包含的是一个长整型数据,&nbsp;表示的是从GMT(格林尼治标准时间)1970年,&nbsp;1&nbsp;月&nbsp;1日00:00:00这一刻之前或者是之后经历的毫秒数.一、创建一个日期对象r让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.&nbsp;这个时间通常被称为Java&nbsp;虚拟机(JVM)主机环境的系统时间.import&nbsp;java.]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-19 21:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[（转）Java&nbsp;Security&nbsp;Notes]]></title>
		<link>http://blog.pfan.cn/billgacsli/36665.html</link>
		<description><![CDATA[摘自 winnerineast 的 Blog 
(1)
The book I get is 2nd version, so it's still fresh even author released it in 2001.&nbsp;The book consists of 15 chapters&nbsp;each of which focuses on one of JAVA security topics. In the following days, I will share my study notes with you guys. First of all, I list the chapter list here (actually, you could find them around internet easily):Chapter 1, Java Application SecurityChapter 2, The Default SandboxChapter 3, Java Language SecurityChapter 4, The Security ManagerChapter 5, The Access ControllerChapter 6, Java Class LoaderChapter 7, Introduction to CryptographyChapter 8, Security ProvidorsChapter 9, Keys and CertificatesChapter 10, Key ManagementChapter 11, Message DigestsChapter 12, Digital SignaturesChapter 13, Cipher-Based EncryptionChapter 14, SSL and HTTPSChapter 15, Authentication and AuthorizationIf you review above titiles of chapters carefully and are familiar with JAVA Application anatomy, author presents his view along with JAVA topograph]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 03:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)Java安全]]></title>
		<link>http://blog.pfan.cn/billgacsli/36664.html</link>
		<description><![CDATA[　　如果要用Java来开发安全程序，坦白地说，第一步（在学习了Java之后）就是要阅读两本有关Java安全的教材，即Gong [1999]和McGraw [1999]（后一本特别要看第7.1节）。还应该看一下Sun发布的安全代码指南http://java.sun.com/security/seccodeguide.html。有一组描述Java安全模型的幻灯片可以从 http://www.dwheeler.com/javasec 免费获取。　　下面是基于Gong [1999]、McGraw [1999]和Sun的指南的若干关键要点：　　不要使用公共域或变量；把它们声明为私有的并提供访问函数以限制对它们的访问。　　除非有很好的理由，把方法都设为私有的（如果确实没这样做，说清楚其理由）。这些非私有的方法必须保护自己，因为它们可能会接收到受污染的数据（除非已经用其它方式对它们进行了保护）。　　避免使用静态域变量。这样的变量附着在类（而非类的实例）上，而类可以被其它类所定位。其结果就是静态域变量可以被其它类找到，因此很难保证它们的安全。　　永远不要把可变对象返回给潜在有恶意的代码（因为代码可能会改变它）。注意，数组是可变的（即使数组的内容不可变），所以不要返回一个含有敏感数据的内部数组的引用。　　永远不要直接保存用户给定的可变对象（包括对象的数组）。否则，用户可以把对象交给安全代码，让安全代码“检查”对象，并在安全代码试图使用数据时改变数据。应该在内部存储数组前复制它们，而且要小心（例如，警惕用户编写的复制例程）。　　不要依赖于初始化。有好几种方法给未初始化的对象分配内存。　　除非有很好的理由，应该使每件事都是确定的。如果某个类或方法不是确定的，攻击者就可以用某种危险而无法预知的方法来扩展它。注意，作为安全性的交换，这会带来可扩展性的丧失。　　不要在安全性上依赖包的范围。若干类，如java.lang，缺省是关闭的，而且某些Java虚拟机（JVM）会让你关闭其它包。否则，Java类是没有关闭的。因此，攻击者可以向包中引入一个新类，并用此新类来访问你以为保护了的信息。　　不要使用内部类。在内部类转换为字节代码时，内部类会转换为可以访问包中任意类的类。更糟的是，被封装类的私有域静悄悄地变成非私有的，允许内部类访问！　　最小化特权。如果可能，完全不要请求任何特殊的许可。McGraw更]]></description>
		<author><![CDATA[billgacsli]]></author>
		<pubDate>2008-07-13 03:05:00</pubDate>
		</item>
		</channel>
</rss>