<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://chenwar.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>ruby写的生日问题</title>
        <author>chenwar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenwar.javaeye.com">chenwar</a>&nbsp;
          链接：<a href="http://chenwar.javaeye.com/blog/210704" style="color:red;">http://chenwar.javaeye.com/blog/210704</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          才学ruby三天，写了个生日概率问题，和理论结果不同，暂时不知道错在何处？ <img src="/images/smiles/icon_cry.gif"/><br />问题：n个人中有两个人生日相同的概率是多少？<br />#生日问题<br />arr = Array.new<br />a=0<br />b=1<br />person_num = 20  # 人数<br />loopnum =0 <br />num=0   #记录person_num内生日相同的次数<br />sum=50000  #循环次数<br /> while loopnum&lt;sum <br /> while a&lt;person_num  and b==1<br />   <br />     arr[arr.size] = rand(365) #365内的随机数<br />     <br />    for i in 0..arr.size<br />      <br />      if arr[i]==arr.last and i!=(arr.size-1) <br />        # if i&lt;person_num  #person_num人数内相同时<br />          <br />              num+=1<br />           <br />         #end        <br />      b = 0<br />       break      <br />      end<br />    end <br />    a+=1<br />   end #end of a<br />      loopnum+=1<br />      a=0   <br />       arr.clear    #清空数组  <br />       b=1  <br /> end #end of loopnum <br />  puts   person_num.to_s + "个人生日相同的概率是"+(Float(num*100)/Float(sum)).to_s+"%"
          <br/>
          <span style="color:red;">
            <a href="http://chenwar.javaeye.com/blog/210704#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Wed, 02 Jul 2008 16:59:26 +0800</pubDate>
        <link>http://chenwar.javaeye.com/blog/210704</link>
        <guid>http://chenwar.javaeye.com/blog/210704</guid>
      </item>
      <item>
        <title>学习一种缓存方法(转)</title>
        <author>chenwar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenwar.javaeye.com">chenwar</a>&nbsp;
          链接：<a href="http://chenwar.javaeye.com/blog/195162" style="color:red;">http://chenwar.javaeye.com/blog/195162</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CacheManager类<br />使用一个HashMap来缓存从数据库中查询出的Object,并提供获取，存放，清除的方法<br />//---------------------------------------------------------<br />// Application: Company Applcation<br />// Author     : Cao guangxin<br />// File       : CacheManager.java<br />//<br />// Copyright 2006 RelationInfo Software<br />// Writed at Wed Apr 12 08:58:55 CST 2006<br />// writed by Eclipse SDK<br />// Visit http://www.37signals.cn<br />//---------------------------------------------------------<br /><br />package net.cn37signals.company.util;<br /><br />import java.util.Comparator;<br />import java.util.Date;<br />import java.util.HashMap;<br />import java.util.Iterator;<br />import java.util.Map;<br />import java.util.TreeMap;<br /><br />class CostComparator implements Comparator {<br />	public int compare(Object o1, Object o2) {<br />		return ((Double) o1).compareTo((Double) o2);<br />	}<br /><br />	public boolean equals(Object o) {<br />		return super.equals(o);<br />	}<br />}<br /><br />public class CacheManager {<br />	//三种清除cache时的排序策略<br />	public static int LRU = 0;<br /><br />	public static int LFU = 1;<br /><br />	public static int MIX = 2;<br />  <br />    //使用一个HashMap来存储Object<br />	private HashMap cacheHashMap = new HashMap();<br /><br />	private int CACHE_CAPACITY = 100;<br /><br />	private int TRESHOLD = 90;<br /><br />	private int purgeAlgorithm;<br /><br />	private long hitCount = 0;<br /><br />	private long missCount = 0;<br /><br />	public CacheManager(int purgeAlgorithm, int cacheCapacity, int treshold) {<br />		this.purgeAlgorithm = purgeAlgorithm;<br />		CACHE_CAPACITY = cacheCapacity;<br />		TRESHOLD = treshold;<br />	}<br /><br />	public CacheManager(int purgeAlgorithm) {<br />		this.purgeAlgorithm = purgeAlgorithm;<br />	}<br /><br />	/**<br />	*根据字符串identifier从cacheHashMap容器中获取cachedObject对象<br />	*如果cacheHashMap中没有identifier键，或cachedObject已经过时，则返回null,<br />	*同时missCount值加1<br />	*否则获取对应的cachedObject对象，并使hitCount加1<br />	*/<br />	public synchronized Object getCache(String identifier) {<br />		CachedObject cachedObject = (CachedObject) cacheHashMap.get(identifier);<br />		Object obj = null;<br /><br />		if (cachedObject == null) {<br />			missCount++;<br />		} else if (cachedObject.isExpired()) {<br />			cacheHashMap.remove(identifier);<br />			missCount++;<br />		} else {<br />			cachedObject.incNumAccess();<br />			cachedObject.setLastAccessTime(new Date());<br />			hitCount++;<br />			obj = cachedObject.getObject();<br />		}<br />		return obj;<br />	}<br /><br />	public synchronized void invalidate(String identifier) {<br />		cacheHashMap.remove(identifier);<br />	}<br /><br />	public long getHitCount() {<br />		return hitCount;<br />	}<br /><br />	public long getMissCount() {<br />		return missCount;<br />	}<br /><br />	public long getCurrentCacheSize() {<br />		return cacheHashMap.size();<br />	}<br /><br />	public synchronized void putCache(Object object, String id,<br />			int minutesToLive) {<br />		CachedObject cachedObject = new CachedObject(object, id, minutesToLive);<br />		if (cacheHashMap.size() == CACHE_CAPACITY) {<br />			sweep();<br />		}<br />		cacheHashMap.put(id, cachedObject);<br />	}<br /><br />/**<br />*cacheHashMap容器的整理<br />*先将超时的cachedObject清除，<br />*当cachedObject数量大于TRESHOLD时，将访问频率小（次数小）的cachedObject清除<br />*/<br />	public synchronized void sweep() {<br />		TreeMap costTreeMap = new TreeMap(new CostComparator());<br />		for (Iterator i = cacheHashMap.entrySet().iterator(); i.hasNext();) {<br />			Map.Entry entry = (Map.Entry) i.next();<br />			CachedObject cachedObject = (CachedObject) entry.getValue();<br />			if (cachedObject.isExpired()) {<br />				cacheHashMap.remove(entry.getKey());<br />			} else {<br />				double cost = 0.0;<br />				switch (purgeAlgorithm) {<br />				case 0:<br />					cost = cachedObject.getLFUCost();<br />					break;<br />				case 1:<br />					cost = cachedObject.getLRUCost();<br />					break;<br />				default:<br />					cost = cachedObject.getMixCost();<br />				}<br />				costTreeMap.put(new Double(cost), entry.getKey());<br />			}<br />		}<br /><br />		// delete to treshold<br />		for (int i = cacheHashMap.size(); i > TRESHOLD; i--) {<br />			Object kk = costTreeMap.firstKey();<br />			Object k = costTreeMap.get(kk);<br />			cacheHashMap.remove(k);<br />			costTreeMap.remove(kk);<br />		}<br />	}<br /><br />	public void clearCache() {<br />		hitCount = 0;<br />		missCount = 0;<br />		cacheHashMap.clear();<br />	}<br /><br />	/**<br />	*将字符数组生成形如:"keys1/keys2/keys3"的字符串<br />	*/<br />	public static String createKey(String[] keys) {<br />		StringBuffer newKey = new StringBuffer("");<br />		for (int i = 0; i &lt; keys.length; i++)<br />			newKey.append(keys[i]).append("/");<br />		return newKey.toString();<br />	}<br />}<br /><br />//==============================<br />DAOCacheManager类<br />持有一个静态的CacheManager类对象，提供对其的操作方法<br />业务方法都要通过他来使用cacheManager<br />//---------------------------------------------------------<br />// Application: Company Applcation<br />// Author     : Cao guangxin<br />// File       : DAOCacheManager.java<br />//<br />// Copyright 2006 RelationInfo Software<br />// Writed at Wed Apr 12 08:58:55 CST 2006<br />// writed by Eclipse SDK<br />// Visit http://www.37signals.cn<br />//---------------------------------------------------------<br /><br />package net.cn37signals.company.dao;<br /><br />import java.text.MessageFormat;<br /><br />import net.cn37signals.company.util.CacheManager;<br /><br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br /><br />public class DAOCacheManager {<br />  private static Log log = LogFactory.getFactory().getInstance("DAOCacheManager");<br />  //cacheManager是静态的，供多个线程公用<br />  private static CacheManager cacheManager = new CacheManager(CacheManager.MIX);<br /><br />  /**<br />  *从cache中获取对象<br />  */<br />  public static Object getCache(String identifier) {<br />    if (log.isInfoEnabled()) {<br />      Object[] o = {new Long(cacheManager.getHitCount()), new Long(cacheManager.getMissCount())};<br />      log.info(MessageFormat.format(" [DAOCacheManager] getCache: {0} hits, {1} misses", o));<br />    }<br />    return cacheManager.getCache(identifier);<br />  }<br /><br />  /**<br />  *将对象放入cache中<br />  */<br />  public static void putCache(Object object, String id, int minutesToLive) {<br />    if (log.isInfoEnabled()) {<br />      log.info(" [DAOCacheManager] putCache");<br />    }<br />    cacheManager.putCache(object, id, minutesToLive);<br />  }<br /><br />  public static void invalidate(String id) {<br />    cacheManager.invalidate(id);<br />  }<br /><br />}<br />//=====================<br />CachedObject类<br />对要放入cache的对象进行包装<br />//---------------------------------------------------------<br />// Application: Company Applcation<br />// Author     : Cao guangxin<br />// File       : CachedObject.java<br />//<br />// Copyright 2006 RelationInfo Software<br />// Writed at Wed Apr 12 08:58:55 CST 2006<br />// writed by Eclipse SDK<br />// Visit http://www.37signals.cn<br />//---------------------------------------------------------<br /><br />package net.cn37signals.company.util;<br /><br />import java.util.Calendar;<br />import java.util.Date;<br />import java.util.List;<br /><br />public class CachedObject {<br /><br />  public Object object = null;<br />  private Date dateofExpiration = null;<br />  private String identifier = null;<br />  private Date lastAccessTime = new Date();<br />  private long numAccess = 1;<br />  private int size;<br /><br />  // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br /><br />  public CachedObject(Object obj, String id, int minutesToLive) {<br />    this.object = obj;<br />    this.identifier = id;<br /><br />    size = objectSize(obj);<br />    lastAccessTime = new Date();<br />    // minutesToLive of 0 means it lives on indefinitely.<br />    if (minutesToLive != 0) {<br />      Calendar cal = Calendar.getInstance();<br />      cal.setTime(lastAccessTime);<br />      cal.add(cal.MINUTE, minutesToLive);<br />      dateofExpiration = cal.getTime();<br />    }<br />  }<br /><br />  public void setLastAccessTime(Date lastAccessTime) {<br />    this.lastAccessTime = lastAccessTime;<br />  }<br /><br />  public boolean isExpired() {<br />    // Remember if the minutes to live is zero then it lives forever!<br />    if (dateofExpiration != null && dateofExpiration.before(new Date())) {<br />      return true;<br />    }<br />    return false;<br />  }<br /><br />  public String getIdentifier() {<br />    return identifier;<br />  }<br /><br />  public Object getObject() {<br />    return object;<br />  }<br /><br />  public Date getDateofExpiration() {<br />    return (this.dateofExpiration);<br />  }<br /><br />  public Date getLastAccessTime() {<br />    return (this.lastAccessTime);<br />  }<br /><br />  public long getNumAccess() {<br />    return (this.numAccess);<br />  }<br /><br />  public long getSize() {<br />    return (this.size);<br />  }<br /><br />  public double getMixCost() {<br />    long milis = new Date().getTime() - lastAccessTime.getTime();<br />    if(milis == 0) {<br />      milis = 1;<br />    }<br />    return (double)numAccess / (double)milis / (double)size;<br />  }<br /><br />  public double getLRUCost() {<br />    long milis = new Date().getTime() - lastAccessTime.getTime();<br />    if(milis == 0) {<br />      milis = 1;<br />    }<br />    return 1.0/(double)milis;<br />  }<br /><br />  public double getLFUCost() {<br />    return (double) numAccess;<br />  }<br /><br />  public void incNumAccess() {<br />    numAccess++;<br />  }<br /><br />  public boolean equals(Object o2) {<br />    try {<br />      String key2 = ((CachedObject) o2).getIdentifier();<br />      return identifier.equals(key2);<br />    } catch (Exception e) {<br />      return false;<br />    }<br />  }<br /><br />  private static int objectSize(Object o) {<br />    try {<br />      int size = ((List) o).size();<br />      return size + 1;<br />    } catch (Exception e) {<br />      return 1;<br />    }<br />  }<br /><br />}<br />//==============================<br />使用方法<br />public List list(int offset, int limit) throws SQLException {<br />    String[] objKeys = {"Users", "list", String.valueOf(offset), String.valueOf(limit)};<br />    String objKey = CacheManager.createKey(objKeys);<br />    ArrayList list = (ArrayList) DAOCacheManager.getCache(objKey);<br />	//如果cache的hashmap中有，直接取出，没有则从数据库中查询，并放入hashmap中<br />    if (list != null)<br />      return list;<br />//--<br />//从数据库中查询(略)<br />//--<br />//将查询结果放入cache<br />DAOCacheManager.putCache(list, objKey, 1);<br />    return list;<br />  }
          <br/>
          <span style="color:red;">
            <a href="http://chenwar.javaeye.com/blog/195162#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Wed, 21 May 2008 11:26:04 +0800</pubDate>
        <link>http://chenwar.javaeye.com/blog/195162</link>
        <guid>http://chenwar.javaeye.com/blog/195162</guid>
      </item>
      <item>
        <title>mysql中文问题</title>
        <author>chenwar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenwar.javaeye.com">chenwar</a>&nbsp;
          链接：<a href="http://chenwar.javaeye.com/blog/195105" style="color:red;">http://chenwar.javaeye.com/blog/195105</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          mysql-connector-java-3.1.12-bin.jar<br />jdk1.5.0_06<br /><br />java内部使用unicode,mysql使用iso-8859-1<br />如果在程序中添加转换编码较为麻烦，我试图用以下方法<br /><br />在C:\WINDOWS\my.ini文件中加入一句<br />default-character-set=gbk<br />“gbk”为小写<br /><br />连接字符串改为：<br />connection = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=root&password=&useUnicode=true&characterEncoding=GBK" ); <br /><br />在MySQL-Front工具中将所有表，字段的字符集都改为gb2312或gbk<br /><br />.......<br /><br />jsp页面输入中文，提交，成功！！--->吃饭
          <br/>
          <span style="color:red;">
            <a href="http://chenwar.javaeye.com/blog/195105#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 10:11:45 +0800</pubDate>
        <link>http://chenwar.javaeye.com/blog/195105</link>
        <guid>http://chenwar.javaeye.com/blog/195105</guid>
      </item>
  </channel>
</rss>