<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>时光印记</title>
	
	<link>http://www.colorfuldays.org</link>
	<description>Internet, Mac, Linux, Java, Music, Life, Travel and so on</description>
	<lastBuildDate>Sat, 19 May 2012 03:36:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/colorfuldays" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="colorfuldays" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>使用Simple-Spring-Memcached的demo示例</title>
		<link>http://www.colorfuldays.org/program/java/%e4%bd%bf%e7%94%a8simple-spring-memcached%e7%9a%84demo%e7%a4%ba%e4%be%8b/</link>
		<comments>http://www.colorfuldays.org/program/java/%e4%bd%bf%e7%94%a8simple-spring-memcached%e7%9a%84demo%e7%a4%ba%e4%be%8b/#comments</comments>
		<pubDate>Sat, 19 May 2012 03:36:44 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[ssm]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=855</guid>
		<description><![CDATA[今天一位兄弟看了之前介绍Simple-Spring-Memcached文章后，向我咨询如何使用Simple-Spring-Memcached的问题。在解答他的一些疑问后，觉得有必要写一篇文章介绍一下在自己的项目中如何配置Simple-Spring-Memcached。为了写这篇文章，尝试Simple-Spring-Memcached的一些新的配置，比如使用json序列化Java对象。 要使用Simple-Spring-Memcached首先需要确认使用哪种memcached客户端，在这里将使用XMemcached。第一步，将依赖jar导入项目中，推荐使用maven。具体的依赖可以参照SSM源码的pom.xml配置。具体步骤如下 1、创建一个maven项目，在pom.xml添加上Simple-Spring-Memcached的依赖，还有其它Spring,aop,Xmemcached等如下： &#60;dependency&#62; &#60;groupId&#62;com.googlecode.xmemcached&#60;/groupId&#62; &#60;artifactId&#62;xmemcached&#60;/artifactId&#62; &#60;version&#62;1.3.5&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#60;groupId&#62;com.google.guava&#60;/groupId&#62; &#60;artifactId&#62;guava&#60;/artifactId&#62; &#60;version&#62;r09&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#60;groupId&#62;com.google.code.simple-spring-memcached&#60;/groupId&#62; &#60;artifactId&#62;simple-spring-memcached&#60;/artifactId&#62; &#60;version&#62;2.0.0-SNAPSHOT&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#60;groupId&#62;org.codehaus.jackson&#60;/groupId&#62; &#60;artifactId&#62;jackson-mapper-asl&#60;/artifactId&#62; &#60;version&#62;1.9.3&#60;/version&#62; &#60;/dependency&#62; 2、在src/main/resources目录下增加spring的配置文件，其中一个为xmemcached的配置文件，一个为spring主配置文件。如下： context.xml &#60;?xml version="1.0" encoding="UTF-8"?&#62; &#60;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx &#8230;<p class="read-more"><a href="http://www.colorfuldays.org/program/java/%e4%bd%bf%e7%94%a8simple-spring-memcached%e7%9a%84demo%e7%a4%ba%e4%be%8b/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>今天一位兄弟看了之前介绍Simple-Spring-Memcached文章后，向我咨询如何使用Simple-Spring-Memcached的问题。在解答他的一些疑问后，觉得有必要写一篇文章介绍一下在自己的项目中如何配置Simple-Spring-Memcached。为了写这篇文章，尝试Simple-Spring-Memcached的一些新的配置，比如使用json序列化Java对象。</p>
<p>要使用Simple-Spring-Memcached首先需要确认使用哪种memcached客户端，在这里将使用XMemcached。第一步，将依赖jar导入项目中，推荐使用maven。具体的依赖可以参照SSM源码的pom.xml配置。具体步骤如下</p>
<p>1、创建一个maven项目，在pom.xml添加上Simple-Spring-Memcached的依赖，还有其它Spring,aop,Xmemcached等如下：</p>
<pre class="brush:xml">&lt;dependency&gt;
&lt;groupId&gt;com.googlecode.xmemcached&lt;/groupId&gt;
&lt;artifactId&gt;xmemcached&lt;/artifactId&gt;
&lt;version&gt;1.3.5&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;com.google.guava&lt;/groupId&gt;
&lt;artifactId&gt;guava&lt;/artifactId&gt;
&lt;version&gt;r09&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;com.google.code.simple-spring-memcached&lt;/groupId&gt;
&lt;artifactId&gt;simple-spring-memcached&lt;/artifactId&gt;
&lt;version&gt;2.0.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.codehaus.jackson&lt;/groupId&gt;
&lt;artifactId&gt;jackson-mapper-asl&lt;/artifactId&gt;
&lt;version&gt;1.9.3&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>2、在src/main/resources目录下增加spring的配置文件，其中一个为xmemcached的配置文件，一个为spring主配置文件。如下：</p>
<p>context.xml</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt;

&lt;import resource="simplesm-context.xml" /&gt;

&lt;aop:aspectj-autoproxy /&gt;
&lt;context:annotation-config /&gt;
&lt;context:component-scan base-package="com.google.code.ssm,org.colorfuldays.ssm" /&gt;

&lt;import resource="xmemcached.xml"/&gt;
&lt;/beans&gt;</pre>
<p>xmemcached.xml:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt;

&lt;aop:aspectj-autoproxy/&gt;

&lt;bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory"&gt;
&lt;property name="cacheClientFactory"&gt;
&lt;bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/&gt;
&lt;/property&gt;
&lt;property name="addressProvider"&gt;
&lt;bean class="com.google.code.ssm.config.DefaultAddressProvider"&gt;
&lt;property name="address" value="127.0.0.1:11211"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="configuration"&gt;
&lt;bean class="com.google.code.ssm.providers.CacheConfiguration"&gt;
&lt;property name="consistentHashing" value="true"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="cacheTranscoders"&gt;
&lt;map&gt;
&lt;entry key="org.colorfuldays.ssm.domain.UserDO" value-ref="jsonTranscoder"/&gt;
&lt;/map&gt;
&lt;/property&gt;
&lt;/bean&gt;

&lt;bean name="jsonTranscoder" class="com.google.code.ssm.transcoders.JsonTranscoder"&gt;
&lt;constructor-arg index="0" value="org.colorfuldays.ssm.domain.UserDO"/&gt;
&lt;constructor-arg index="1"&gt;
&lt;ref bean="JsonObjectMapper"/&gt;
&lt;/constructor-arg&gt;
&lt;constructor-arg index="2"&gt;
&lt;ref bean="longToStringTranscoder"/&gt;
&lt;/constructor-arg&gt;
&lt;/bean&gt;

&lt;bean name="longToStringTranscoder" class="com.google.code.ssm.transcoders.LongToStringTranscoder"/&gt;
&lt;bean name="JsonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/&gt;
&lt;/beans&gt;</pre>
<p>这两个配置文件与官方源码中提供的测试例子差别不大，只是多出了Transcoder的配置。在配置TransCoder时，要注意JsonTranscoder只能通过构造函数注入。cacheTranscoders的配置中需要注意其key为Class对象。</p>
<p>完成上述配置后，写个简单的例子测试。测试代码如下：<br />
TestNG测试类</p>
<pre class="brush:java">package org.colorfuldays.ssm.dao;

import junit.framework.Assert;
import org.codehaus.jackson.map.ObjectMapper;
import org.colorfuldays.ssm.domain.UserDO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 * User: huxing(huxing1985#gmail.com)
 * Date: 12-5-18
 * Time: 下午6:14
 */
@ContextConfiguration(locations = {"classpath:context.xml"})
public class UserDAOTest extends AbstractTestNGSpringContextTests {
    private static final Logger LOG = LoggerFactory.getLogger(UserDAOTest.class);
    @Resource
    UserDAO userDAO;
    UserDO orignUserDO;

    @BeforeTest
    public void before() {
        orignUserDO = new UserDO();
        orignUserDO.setId(1024l);
        orignUserDO.setName("Inzaghi");
        orignUserDO.setPassword("password");
    }

    @Test
    public void testGetUserById() throws Exception {
        UserDO userDO = userDAO.getUserById(1124);
        System.out.println(userDO);
        Assert.assertTrue(orignUserDO.equals(userDO));
    }

    @Test
    public void testUpdateUserDO() throws Exception {

    }
}</pre>
<p>DAOImpl类</p>
<pre class="brush:java">package org.colorfuldays.ssm.dao.impl;

import com.google.code.ssm.api.InvalidateSingleCache;
import com.google.code.ssm.api.ParameterValueKeyProvider;
import com.google.code.ssm.api.ReadThroughSingleCache;
import com.google.code.ssm.api.format.UseJson;
import org.colorfuldays.ssm.dao.UserDAO;
import org.colorfuldays.ssm.domain.UserDO;
import org.springframework.stereotype.Repository;

/**
 * Created by IntelliJ IDEA.
 * User: huxing(huxing1985#gmail.com)
 * Date: 12-5-18
 * Time: 下午5:50
 */
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
    @Override
    @UseJson // 以json格式序列化
    @ReadThroughSingleCache(namespace = "star",expiration = 30)
    public UserDO getUserById(@ParameterValueKeyProvider long id) {
        UserDO userDO = new UserDO();
        userDO.setId(1024l);
        userDO.setName("Inzaghi");
        userDO.setPassword("password");
        return userDO;
    }

    @Override
    public int updateUserDO(UserDO userDO) {
        return 0;
    }

    @InvalidateSingleCache(namespace = "star")
    public int deleteUser(@ParameterValueKeyProvider long userId) {
        return 0;
    }

}</pre>
<pre class="brush:java">package org.colorfuldays.ssm.domain;

import java.io.Serializable;

/**
 * Created by IntelliJ IDEA.
 * User: huxing(xing.hu@360hqb.com)
 * Date: 12-5-18
 * Time: 下午5:44
 */
public class UserDO implements Serializable{

    private static final long serialVersionUID = -9096141633317522945L;

    private String name;
    private Long id;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "UserDO{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof UserDO)) return false;

        UserDO userDO = (UserDO) o;

        if (id != null ? !id.equals(userDO.id) : userDO.id != null) return false;
        if (name != null ? !name.equals(userDO.name) : userDO.name != null) return false;
        if (password != null ? !password.equals(userDO.password) : userDO.password != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (id != null ? id.hashCode() : 0);
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}</pre>
<p>启动memcached后即可运行单元测试了。其中使用了@UseJson的注解指定使用json格式对对象做序列化。通过下面的方式可以看到对象存入memcached后结果如下：</p>
<pre class="brush:bash">star@star:simple-spring-memcached-read-only$ telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get star:1124
END
get star:1124
VALUE star:1124 8 50
{"name":"Inzaghi","id":1024,"password":"password"}
END</pre>
<p>如果不使用@UseJson注解，则存入Memcached的数据则是Java默认序列化的数据。<br />
测试代码在这里：<a title="ssm-demo" href="https://github.com/iamxhu/ssm-demo">https://github.com/iamxhu/ssm-demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/program/java/%e4%bd%bf%e7%94%a8simple-spring-memcached%e7%9a%84demo%e7%a4%ba%e4%be%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macbook Pro 换内存记</title>
		<link>http://www.colorfuldays.org/macosx/macbook-pro-%e6%8d%a2%e5%86%85%e5%ad%98%e8%ae%b0/</link>
		<comments>http://www.colorfuldays.org/macosx/macbook-pro-%e6%8d%a2%e5%86%85%e5%ad%98%e8%ae%b0/#comments</comments>
		<pubDate>Sat, 05 May 2012 08:54:44 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=849</guid>
		<description><![CDATA[最近在使用IDEA时发现本子跑得越来越慢，空闲内存长期只剩几十M，终于在五一时将升级到8G了。和上一次升级不同，这次升级是自己手工完成的。下面记录一下换内存的过程。 首先MC 990官方标识支持DDR3 1066mhz的内存，但是在咨询过一位换过内存的朋友时，他告诉我用1333mhz的内存也能用。于是在易讯换了两条金士顿DDR3 1333mhz的内存。 给换Mac换内存另外一个需要准备的工具是螺丝刀，Mac的螺丝钉比较特殊，我的MC990对应的十字螺丝需要用PH00规格的螺丝刀。所幸在家门口的五金店发现有买，而且还有很多其它的螺丝刀，于是花了30块买下一整套螺丝刀。 用螺丝刀将螺丝都取出后，就可以开始换内存了，这些按照苹果官方文档就行（在关于本机/更多信息/内存一档可以看到内存升级的链接）。打开后盖后，发现Mac里面还是挺脏的，特别是风扇那块，于是用一个刷子清理了一下。 换上新内存后，到了关键时刻了，按下电源按钮后，大约等了7，8秒种系统正常点亮，启动，进行系统查看了一下更新后内存信息。发现变成8G了，而且还直接以1333mhz在运行，完全出乎意料。下面是几张换内存时的图。 未拆时的样子 拆后后盖后的样子 装内存区域按照 换上一根新内存 全部换好后的样子 最后看一下系统中显示内存的情况]]></description>
			<content:encoded><![CDATA[<p>最近在使用IDEA时发现本子跑得越来越慢，空闲内存长期只剩几十M，终于在五一时将升级到8G了。和上一次升级不同，这次升级是自己手工完成的。下面记录一下换内存的过程。</p>
<p>首先MC 990官方标识支持DDR3 1066mhz的内存，但是在咨询过一位换过内存的朋友时，他告诉我用1333mhz的内存也能用。于是在易讯换了两条金士顿DDR3 1333mhz的内存。</p>
<p>给换Mac换内存另外一个需要准备的工具是螺丝刀，Mac的螺丝钉比较特殊，我的MC990对应的十字螺丝需要用PH00规格的螺丝刀。所幸在家门口的五金店发现有买，而且还有很多其它的螺丝刀，于是花了30块买下一整套螺丝刀。</p>
<p>用螺丝刀将螺丝都取出后，就可以开始换内存了，这些按照苹果官方文档就行（在关于本机/更多信息/内存一档可以看到内存升级的链接）。打开后盖后，发现Mac里面还是挺脏的，特别是风扇那块，于是用一个刷子清理了一下。</p>
<p>换上新内存后，到了关键时刻了，按下电源按钮后，大约等了7，8秒种系统正常点亮，启动，进行系统查看了一下更新后内存信息。发现变成8G了，而且还直接以1333mhz在运行，完全出乎意料。下面是几张换内存时的图。</p>
<p>未拆时的样子<br />
<a href="http://www.flickr.com/photos/iamxhu/7144332227/" title="IMG_0795 by iamxhu, on Flickr"><img src="http://farm8.staticflickr.com/7181/7144332227_d7394a86fb.jpg" width="500" height="374" alt="IMG_0795"/></a></p>
<p>拆后后盖后的样子<br />
<a href="http://www.flickr.com/photos/iamxhu/7144332651/" title="IMG_0797 by iamxhu, on Flickr"><img src="http://farm9.staticflickr.com/8150/7144332651_dda209d742.jpg" width="500" height="374" alt="IMG_0797"/></a></p>
<p>装内存区域按照<br />
<a href="http://www.flickr.com/photos/iamxhu/7144332981/" title="IMG_0798 by iamxhu, on Flickr"><img src="http://farm9.staticflickr.com/8027/7144332981_facd9e588e.jpg" width="500" height="374" alt="IMG_0798"/></a></p>
<p>换上一根新内存<br />
<a href="http://www.flickr.com/photos/iamxhu/6998247592/" title="IMG_0801 by iamxhu, on Flickr"><img src="http://farm9.staticflickr.com/8014/6998247592_6e0eaefdac.jpg" width="500" height="374" alt="IMG_0801"/></a></p>
<p>全部换好后的样子<br />
<a href="http://www.flickr.com/photos/iamxhu/6998247966/" title="IMG_0802 by iamxhu, on Flickr"><img src="http://farm6.staticflickr.com/5238/6998247966_c895dbfd3c.jpg" width="500" height="374" alt="IMG_0802"/></a></p>
<p>最后看一下系统中显示内存的情况<br />
<img src="http://www.colorfuldays.org/wp-content/uploads/2012/05/mem.png" alt="" title="mem" width="586" height="268" class="alignleft size-full wp-image-850" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/macosx/macbook-pro-%e6%8d%a2%e5%86%85%e5%ad%98%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Intellij IDEA阅读C++代码</title>
		<link>http://www.colorfuldays.org/macosx/%e4%bd%bf%e7%94%a8intellij-idea%e9%98%85%e8%af%bbc%e4%bb%a3%e7%a0%81/</link>
		<comments>http://www.colorfuldays.org/macosx/%e4%bd%bf%e7%94%a8intellij-idea%e9%98%85%e8%af%bbc%e4%bb%a3%e7%a0%81/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 12:37:34 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Intellij IDEA]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=846</guid>
		<description><![CDATA[最近一直在做一个C++的项目，其实主要的作用是阅读及修改代码。但是入手碰到一个严重问题：没有一款好的IDE。身为一名Java程序员，我已经明显被Intellij IDEA这种神器给惯坏了。虽然有5年Vim的使用经验，但是还从来没有将Vim作为主IDE来使用，在尝试配置了ctags，cscope后（始终没有在vim好配置cscope），然后觉得这货在作为IDE这件事上和Intellij IDEA差距太大。于是不得不退而求其次，找其它方案。 Eclipse CDT好像可以阅读C++代码，但是作为Intellij IDEA的踏实Fans，对Eclipse实在无爱，于是尝试着在Intellij IDEA的插件库中查找C++相关的插件，非常幸运地发现了一个C/C++插件。装上后，试了一下，开发Java源码时的那些快捷方法都还能用，顿时感到很欣慰。 Intellij IDEA装上C/C++插件后，需要先完成一些基本的全局配置。有如下几项配置 path to gcc (/usr/bin/gcc) path to gdb (/usr/bin/gdb) Defines Additional include directories  (配置IDEA类似LD_LIBRARY_PATH，在阅读代码时自动分析相关头的依赖，并能点进方法中) 除此之外在每一个项目中，还可以配置项目的include，对于多模块项目来说，这东西太重要。还有一些宏定义等的配置。]]></description>
			<content:encoded><![CDATA[<p>最近一直在做一个C++的项目，其实主要的作用是阅读及修改代码。但是入手碰到一个严重问题：没有一款好的IDE。身为一名Java程序员，我已经明显被Intellij IDEA这种神器给惯坏了。虽然有5年Vim的使用经验，但是还从来没有将Vim作为主IDE来使用，在尝试配置了ctags，cscope后（始终没有在vim好配置cscope），然后觉得这货在作为IDE这件事上和Intellij IDEA差距太大。于是不得不退而求其次，找其它方案。</p>
<p>Eclipse CDT好像可以阅读C++代码，但是作为Intellij IDEA的踏实Fans，对Eclipse实在无爱，于是尝试着在Intellij IDEA的插件库中查找C++相关的插件，非常幸运地发现了一个C/C++插件。装上后，试了一下，开发Java源码时的那些快捷方法都还能用，顿时感到很欣慰。</p>
<p>Intellij IDEA装上C/C++插件后，需要先完成一些基本的全局配置。有如下几项配置</p>
<ul>
<li><span class="Apple-style-span" style="line-height: 22px;">path to gcc (/usr/bin/gcc)</span></li>
<li><span class="Apple-style-span" style="line-height: 22px;">path to gdb (/usr/bin/gdb)</span></li>
<li><span class="Apple-style-span" style="line-height: 22px;">Defines</span></li>
<li><span class="Apple-style-span" style="line-height: 22px;">Additional include directories  (配置IDEA类似LD_LIBRARY_PATH，在阅读代码时自动分析相关头的依赖，并能点进方法中)</span></li>
</ul>
<p>除此之外在每一个项目中，还可以配置项目的include，对于多模块项目来说，这东西太重要。还有一些宏定义等的配置。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/macosx/%e4%bd%bf%e7%94%a8intellij-idea%e9%98%85%e8%af%bbc%e4%bb%a3%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac 安装cscope编译问题解决办法</title>
		<link>http://www.colorfuldays.org/linux/mac-%e5%ae%89%e8%a3%85cscope%e7%bc%96%e8%af%91%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/</link>
		<comments>http://www.colorfuldays.org/linux/mac-%e5%ae%89%e8%a3%85cscope%e7%bc%96%e8%af%91%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 15:32:03 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[cscope]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=842</guid>
		<description><![CDATA[今天晚上在Mac上安装cscope插件时，碰到一个编译问题。虽然最近在编译一个C++工程时也碰到不少编译的问题，但是对于今天碰到的这个问题，还是第一次碰到。具体情况如下： 在编译cscope-15.7a版本的代码，make这一步时抛出如下错误 In file included from build.c:50: /usr/include/ncurses.h:539:40: error: macro &#8220;cbreak&#8221; passed 1 arguments, but takes just 0 /usr/include/ncurses.h:564:44: error: macro &#8220;erasechar&#8221; passed 1 arguments, but takes just 0 /usr/include/ncurses.h:600:43: error: macro &#8220;killchar&#8221; passed 1 arguments, but takes just 0 &#8230;<p class="read-more"><a href="http://www.colorfuldays.org/linux/mac-%e5%ae%89%e8%a3%85cscope%e7%bc%96%e8%af%91%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>今天晚上在Mac上安装cscope插件时，碰到一个编译问题。虽然最近在编译一个C++工程时也碰到不少编译的问题，但是对于今天碰到的这个问题，还是第一次碰到。具体情况如下：</p>
<p>在编译cscope-15.7a版本的代码，make这一步时抛出如下错误</p>
<blockquote><p>In file included from build.c:50:<br />
/usr/include/ncurses.h:539:40: error: macro &#8220;cbreak&#8221; passed 1 arguments, but takes just 0<br />
/usr/include/ncurses.h:564:44: error: macro &#8220;erasechar&#8221; passed 1 arguments, but takes just 0<br />
/usr/include/ncurses.h:600:43: error: macro &#8220;killchar&#8221; passed 1 arguments, but takes just 0<br />
make[2]: *** [build.o] Error 1<br />
make[1]: *** [all-recursive] Error 1<br />
make: *** [all] Error 2</p></blockquote>
<p>于是grep一下cscope的源码，找到constants.h中含有这几个方法。代码如下:</p>
<blockquote><p>#if (BSD || V9) &amp;&amp; !__NetBSD__ &amp;&amp; !__FreeBSD__<br />
# define TERMINFO 0 /* no terminfo curses */<br />
#else<br />
# define TERMINFO 1<br />
#endif</p>
<p><span style="color: #0000ff;">#undef TERMINFO 0</span><br />
<span style="color: #0000ff;"> #define TERMINFO 1</span></p>
<p>#if !TERMINFO<br />
# ifndef KEY_BREAK<br />
# define KEY_BREAK 0400 /* easier to define than to add #if around the use */<br />
# endif<br />
# ifndef KEY_ENTER<br />
# define KEY_ENTER 0401<br />
# endif<br />
# ifndef KEY_BACKSPACE<br />
# define KEY_BACKSPACE 0402<br />
# endif</p>
<p># if !sun<br />
# define cbreak() crmode() /* name change */<br />
# endif</p>
<p># if UNIXPC<br />
# define erasechar() (_tty.c_cc[VERASE]) /* equivalent */<br />
# define killchar() (_tty.c_cc[VKILL]) /* equivalent */<br />
# else<br />
# define erasechar() (_tty.sg_erase) /* equivalent */<br />
# define killchar() (_tty.sg_kill) /* equivalent */<br />
# endif /* if UNIXPC */<br />
#endif /* if !TERMINFO */</p></blockquote>
<p>看这段代码，只要让TERMINFO为1，即可不使用这几个函数。于是加上上面蓝色的两行，即可通过编译。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/linux/mac-%e5%ae%89%e8%a3%85cscope%e7%bc%96%e8%af%91%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>gdb初试小结</title>
		<link>http://www.colorfuldays.org/linux/gdb%e5%88%9d%e8%af%95%e5%b0%8f%e7%bb%93/</link>
		<comments>http://www.colorfuldays.org/linux/gdb%e5%88%9d%e8%af%95%e5%b0%8f%e7%bb%93/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 14:25:56 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[gdb]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=838</guid>
		<description><![CDATA[最近在搞一个C++的工程，终于有机会使用神往已久的gcc gdb make等套件了。今天在让老大帮忙解决一个问题时，被手把手地教着怎么用gdb。作为命令行下的debug工具，真是让我大开眼界了。 下面总结一下今天调试过程中使用gdb的一些基础命令： == gdb == * 启动: gdb ./bin/nginx * 设置参数 set args -s reload * 运行程序 r (run) * 设置断点 ** 在代码行上设置断点 b xxx.cpp:117 (break) ** 在代码方法上设置断点 b star::PManager::load star 表示使用PManager时申明的namespace名称,PManager表示被调用的类，load 指调用的方法, 保证可以找到代码执行唯一的地方 如果某个函数被重载，也可以直接使用上述方法，gdb会自动关联到程序实际执行的那个函数。 * 查看断点信息 info &#8230;<p class="read-more"><a href="http://www.colorfuldays.org/linux/gdb%e5%88%9d%e8%af%95%e5%b0%8f%e7%bb%93/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>最近在搞一个C++的工程，终于有机会使用神往已久的gcc gdb make等套件了。今天在让老大帮忙解决一个问题时，被手把手地教着怎么用gdb。作为命令行下的debug工具，真是让我大开眼界了。 下面总结一下今天调试过程中使用gdb的一些基础命令：</p>
<p>== gdb ==</p>
<p>* 启动:<br />
gdb ./bin/nginx</p>
<p>* 设置参数<br />
set args -s reload</p>
<p>* 运行程序<br />
r (run)</p>
<p>* 设置断点<br />
** 在代码行上设置断点<br />
b xxx.cpp:117 (break)</p>
<p>** 在代码方法上设置断点<br />
b star::PManager::load<br />
star 表示使用PManager时申明的namespace名称,PManager表示被调用的类，load 指调用的方法, 保证可以找到代码执行唯一的地方<br />
如果某个函数被重载，也可以直接使用上述方法，gdb会自动关联到程序实际执行的那个函数。</p>
<p>* 查看断点信息<br />
info break</p>
<p>* 单条执行<br />
n (next)</p>
<p>* 执行到下一断点<br />
c (continue)</p>
<p>* 打印出程序中变量的值<br />
p (print)</p>
<p>* 自动显示变量<br />
display  field<br />
该功能类似于Intellij IDEA中的watch，每一步执行都会将这个指定变量打出，在debug 观察for循环中的某个值时，非常有用。</p>
<p>* 删除显示的变量<br />
delete display</p>
<p>* 查看函数棧<br />
bt</p>
<p>* 退出函数<br />
finish</p>
<p>* 退出GDB<br />
q</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/linux/gdb%e5%88%9d%e8%af%95%e5%b0%8f%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>升级至Intellij IDEA 11.1</title>
		<link>http://www.colorfuldays.org/program/java/%e5%8d%87%e7%ba%a7%e8%87%b3intellij-idea-11-1/</link>
		<comments>http://www.colorfuldays.org/program/java/%e5%8d%87%e7%ba%a7%e8%87%b3intellij-idea-11-1/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 10:38:26 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Intellij IDEA]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=836</guid>
		<description><![CDATA[上周打开IDEA写代码时，看到IDEA弹出的更新提示，于是便升级了。升级时在公司搞了半天没下载完，昨天在家里终于搞定了。 今天早上来公司后，发现一些问题了。 JRebel 插件居然不能用了，导致今天在修改代码，重启过程浪费N多时间。在失去的时间才知道JRebel的可贵啊，希望JRebel能快点升级解决与Intellij IDEA 11.1不兼容的问题。 至于Intellij IDEA11.1官方网站是提到的一些更新，在今天的使用过程在体会都不大。而且很多都针对ULTIMATE版，作为买不起正版，只能用社区版的屌丝，表示很伤心。今天体会最深的是 Project 面板中新增了“Scroll to Source” 和“Scroll from Source&#8221;的功能选项。在编辑代码时，跳到Project面板时，可以快速定位到文件了。 这次的升级带来的好处，比起JRebel不能用带来的不便，实在是太不值了，升级需谨慎啊！]]></description>
			<content:encoded><![CDATA[<p>上周打开IDEA写代码时，看到IDEA弹出的更新提示，于是便升级了。升级时在公司搞了半天没下载完，昨天在家里终于搞定了。<br />
今天早上来公司后，发现一些问题了。<br />
JRebel 插件居然不能用了，导致今天在修改代码，重启过程浪费N多时间。在失去的时间才知道JRebel的可贵啊，希望JRebel能快点升级解决与Intellij IDEA 11.1不兼容的问题。</p>
<p>至于Intellij IDEA11.1官方网站是提到的一些更新，在今天的使用过程在体会都不大。而且很多都针对ULTIMATE版，作为买不起正版，只能用社区版的屌丝，表示很伤心。今天体会最深的是 Project 面板中新增了“Scroll to Source” 和“Scroll from Source&#8221;的功能选项。在编辑代码时，跳到Project面板时，可以快速定位到文件了。</p>
<p>这次的升级带来的好处，比起JRebel不能用带来的不便，实在是太不值了，升级需谨慎啊！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/program/java/%e5%8d%87%e7%ba%a7%e8%87%b3intellij-idea-11-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple-Spring-Memcached代码阅读之BridgeMethod</title>
		<link>http://www.colorfuldays.org/program/java/bridgemethod%e7%9a%84%e4%bd%9c%e7%94%a8/</link>
		<comments>http://www.colorfuldays.org/program/java/bridgemethod%e7%9a%84%e4%bd%9c%e7%94%a8/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 03:35:41 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[BridgeMethod]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[simple-spring-memcached]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=831</guid>
		<description><![CDATA[最近在看Simple-Spring-Memcached源码中学到很多知识，其中就有这个Bridge Method。Bridge Method是个什么东东呢？其实它是Java在1.5版本加入范型特性时引入的一个策略。当一个方法使用范型时，在该类中会创建一个Bridge Method用来调用实际实现的方法。 如下面的示例所示： abstract class C { abstract T id(T x); } class D extends C { String id(String x) { return x; } } 上面这段代码在编译成.class时，在D中会增加一个方法： Object id(Object x) { return id((String) x); } 这个方法即是所谓的Bridge Method。如果此时直接使用如下调用c.id(new Object())时，则会抛出ClassCastException。 在使用Java反射机制时，需要特别注意BridgeMethod，因为此时拿到的Method对象的参数类型或返回值类型并不是实际调用方法的真实类型。在Simple-Spring-Memcached中就提供了两个注解(BridgeMethodMapping,BridgeMethodMappings)来解决这个问题，标示出范型T代表的真实类型。示例如下： &#8230;<p class="read-more"><a href="http://www.colorfuldays.org/program/java/bridgemethod%e7%9a%84%e4%bd%9c%e7%94%a8/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>最近在看Simple-Spring-Memcached源码中学到很多知识，其中就有这个Bridge Method。Bridge Method是个什么东东呢？其实它是Java在1.5版本加入范型特性时引入的一个策略。当一个方法使用范型时，在该类中会创建一个Bridge Method用来调用实际实现的方法。</p>
<p>如下面的示例所示：</p>
<p><code><br />
abstract class C {<br />
abstract T id(T x);<br />
}<br />
class D extends C {<br />
String id(String x) { return x; }<br />
}</code></p>
<p>上面这段代码在编译成.class时，在D中会增加一个方法：</p>
<p>Object id(Object x) { return id((String) x); }</p>
<p>这个方法即是所谓的Bridge Method。如果此时直接使用如下调用c.id(new Object())时，则会抛出ClassCastException。</p>
<p>在使用Java反射机制时，需要特别注意BridgeMethod，因为此时拿到的Method对象的参数类型或返回值类型并不是实际调用方法的真实类型。在Simple-Spring-Memcached中就提供了两个注解(BridgeMethodMapping,BridgeMethodMappings)来解决这个问题，标示出范型T代表的真实类型。示例如下：</p>
<pre>
     public interface Generic<k ,V> {
       void set(K key, V value);
       V get(K key);
       void put(K key, V value, boolean overwrite);
     }

    @BridgeMethodMappings({
        @BridgeMethodMapping(methodName="set",erasedParamTypes={Object.class, Object.class}, targetParamTypes={Number.class, String.class}),
        @BridgeMethodMapping(methodName="get",erasedParamTypes={Object.class}, targetParamTypes={Number.class}),
        @BridgeMethodMapping(methodName="put",erasedParamTypes={Object.class, Object.class, boolean.class}, targetParamTypes={Number.class, String.class, boolean.class})
    })
    public class SubGeneric implements Generic<number , String> {
     public void set(Number key, String value) {
     .....
     }

     public String get(Number key) {
     ....
     }

     public void put(Number key, String value, boolean overwrite) {
     ....
     }
 }
</number></k></pre>
<p>参考文献: Java Language Specification p490<br />
<a href="http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html">http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/program/java/bridgemethod%e7%9a%84%e4%bd%9c%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用SSM注解做缓存操作（一）</title>
		<link>http://www.colorfuldays.org/program/java/ssm_memcache/</link>
		<comments>http://www.colorfuldays.org/program/java/ssm_memcache/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 10:24:10 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[aop]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[ssm]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=827</guid>
		<description><![CDATA[之前自己写过一个通过注解和AOP来实现缓存的代码，最早的原型来自于在淘宝工作时的一个项目。当时这段代码写得比较差，之后重构时发现之前的功能实现有很大的局限。主要问题在于： key的生成规则 update 与 query 的参数不一样，如何让其生成一样的key 列表缓存如何定义key及失效 最近同事推荐了一个开源项目：Simple-Spring-Memcached（简称ssm），它也是一个通过Annatation与AOP来完成缓存数据操作的开源项目。仔细看了一下代码，基本上把我之前碰到的问题都解决了，而且MultiCache这一块的实现超出我的预期。该项目主要优点如下： 与Spring完善集成 支持两种Memcached Java Client (spymemcached,Xmemcached) 基于Annotation方式实现缓存操作，对代码侵入性小 annotation丰富，可以满足绝大部分需求 下面介绍一下其中各annotation的使用。ssm项目中的Annotation主要分成以下几类 SingleCache类 操作单个POJO的Cache数据，由ParameterValueKeyProvider和CacheKeyMethod来标识组装key MultiCache类 操作List型的Cache数据，由ParameterValueKeyProvider和CacheKeyMethod来标识组装key AssignCache类 指定key操作Cache数据，由annotation中的 assignedKey 指定key 各Annotation的详细说明 ReadThroughSingleCache 作用：读取Cache中数据，如果不存在，则将读取的数据存入Cache key生成规则：ParameterValueKeyProvider指定的参数，如果该参数对象中包含CacheKeyMethod注解的方法，则调用其方法，否则调用toString方法 代码示例： @ReadThroughSingleCache(namespace = "Alpha", expiration = 30) public String getDateString(@ParameterValueKeyProvider final String &#8230;<p class="read-more"><a href="http://www.colorfuldays.org/program/java/ssm_memcache/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<div>
<p>之前自己写过一个通过注解和AOP来实现缓存的代码，最早的原型来自于在淘宝工作时的一个项目。当时这段代码写得比较差，之后重构时发现之前的功能实现有很大的局限。主要问题在于：</p>
<ol>
<li><span class="Apple-style-span" style="line-height: 22px;">key的生成规则</span></li>
<li><span class="Apple-style-span" style="line-height: 22px;">update 与 query 的参数不一样，如何让其生成一样的key</span></li>
<li><span class="Apple-style-span" style="line-height: 22px;">列表缓存如何定义key及失效</span></li>
</ol>
<p>最近同事推荐了一个开源项目：Simple-Spring-Memcached（简称ssm），它也是一个通过Annatation与AOP来完成缓存数据操作的开源项目。仔细看了一下代码，基本上把我之前碰到的问题都解决了，而且MultiCache这一块的实现超出我的预期。该项目主要优点如下：</p>
<ol>
<li>与Spring完善集成</li>
<li>支持两种Memcached Java Client (spymemcached,Xmemcached)</li>
<li>基于Annotation方式实现缓存操作，对代码侵入性小</li>
<li>annotation丰富，可以满足绝大部分需求</li>
</ol>
<p>下面介绍一下其中各annotation的使用。ssm项目中的Annotation主要分成以下几类</p>
<ul>
<li>SingleCache类 操作单个POJO的Cache数据，由ParameterValueKeyProvider和CacheKeyMethod来标识组装key</li>
<li>MultiCache类 操作List型的Cache数据，由ParameterValueKeyProvider和CacheKeyMethod来标识组装key</li>
<li>AssignCache类 指定key操作Cache数据，由annotation中的 assignedKey 指定key</li>
</ul>
<p>各Annotation的详细说明</p>
<ul>
<li>ReadThroughSingleCache<br />
作用：读取Cache中数据，如果不存在，则将读取的数据存入Cache<br />
key生成规则：ParameterValueKeyProvider指定的参数，如果该参数对象中包含CacheKeyMethod注解的方法，则调用其方法，否则调用toString方法<br />
代码示例：</p>
<div>
<div>
<pre>    @ReadThroughSingleCache(namespace = "Alpha", expiration = 30)
    public String getDateString(@ParameterValueKeyProvider final String key) {
        final Date now = new Date();
        try {
            Thread.sleep(1500);
        } catch (InterruptedException ex) {
        }
        return now.toString() + ":" + now.getTime();
    }</pre>
</div>
</div>
</li>
</ul>
<ul>
<li>InvalidateSingleCache<br />
作用：失效Cache中的数据<br />
key生成规则：</p>
<ul>
<li>使用 ParameterValueKeyProvider注解时，与ReadThroughSingleCache一致</li>
<li>使用 ReturnValueKeyProvider 注解时，key为返回的对象的CacheKeyMethod或toString方法生成</li>
</ul>
</li>
</ul>
<div>
<div>
<pre>    @InvalidateSingleCache(namespace = "Charlie")
    public void updateRandomString(@ParameterValueKeyProvider final Long key) {
        // Nothing really to do here.
    }

    @InvalidateSingleCache(namespace = "Charlie")
    @ReturnValueKeyProvider
    public Long updateRandomStringAgain(final Long key) {
        return key;
    }</pre>
</div>
</div>
<ul>
<li>UpdateSingleCache<br />
作用：更新Cache中的数据<br />
key生成规则：ParameterValueKeyProvider指定<br />
ParameterDataUpdateContent：方法参数中的数据，作为更新缓存的数据<br />
ReturnDataUpdateContent：方法调用后生成的数据，作为更新缓存的数据<br />
注：上述两个注解，必须与Update*系列的注解一起使用</p>
<div>
<div>
<pre>    @UpdateSingleCache(namespace = "Alpha", expiration = 30)
    public void overrideDateString(final int trash, @ParameterValueKeyProvider final String key,
            @ParameterDataUpdateContent final String overrideData) {
    }

    @UpdateSingleCache(namespace = "Bravo", expiration = 300)
    @ReturnDataUpdateContent
    public String updateTimestampValue(@ParameterValueKeyProvider final Long key) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
        }
        final Long now = new Date().getTime();
        final String result = now.toString() + "-U-" + key.toString();
        return result;
    }</pre>
</div>
</div>
</li>
</ul>
<ul>
<li>ReadThroughAssignCache<br />
作用：读取Cache中数据，如果不存在，则将读取的数据存入Cache<br />
key生成规则： ReadThroughAssignCache 注解中的 assignedKey 字段指定</p>
<div>
<div>
<pre>    @ReadThroughAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
    public List&lt;String&gt; getAssignStrings() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
        }
        final List&lt;String&gt; results = new ArrayList&lt;String&gt;();
        final long extra = System.currentTimeMillis() % 20;
        final String base = System.currentTimeMillis() + "";
        for (int ix = 0; ix &lt; 20 + extra; ix++) {
            results.add(ix + "-" + base);
        }
        return results;
    }</pre>
</div>
</div>
</li>
</ul>
<ul>
<li>InvalidateAssignCache<br />
作用：失效缓存中指定key的数据<br />
key生成规则：assignedKey 字段指定</p>
<div>
<div>
<pre>    @InvalidateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo")
    public void invalidateAssignStrings() {
    }</pre>
</div>
</div>
</li>
<li>UpdateAssignCache<br />
作用：更新指定缓存<br />
key生成规则：assignedKey 字段指定</p>
<div>
<div>
<pre>    @UpdateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
    public void updateAssignStrings(int bubpkus, @ParameterDataUpdateContent final List&lt;String&gt; newData) {
    }</pre>
</div>
</div>
</li>
</ul>
</div>
<div id="labels-section"></div>
<div id="comments-section"></div>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/program/java/ssm_memcache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu访问Windows共享目录</title>
		<link>http://www.colorfuldays.org/linux/ubuntu%e8%ae%bf%e9%97%aewindows%e5%85%b1%e4%ba%ab%e7%9b%ae%e5%bd%95/</link>
		<comments>http://www.colorfuldays.org/linux/ubuntu%e8%ae%bf%e9%97%aewindows%e5%85%b1%e4%ba%ab%e7%9b%ae%e5%bd%95/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 09:33:32 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=825</guid>
		<description><![CDATA[今天碰到一个需求，需要在Linux命令行下访问Windows共享目录，简单Google了一下，解决问题。记录一下，备查。 1、安装Ubuntu支持smbfs的包 sudo apt-get install smbfs 2、创建一个目录，用于挂载Windows共享目录 sudo mkdir /mnt/smb 3、将Windows共享目录mount到/mnt/smb目录 sudo mount -t smbfs -o username=guest //192.168.10.34/tools /mnt/smb 其中username 为windows共享目录的访问用户 4、卸载Windows共享目录 sudo umount /mnt/smb]]></description>
			<content:encoded><![CDATA[<p>今天碰到一个需求，需要在Linux命令行下访问Windows共享目录，简单Google了一下，解决问题。记录一下，备查。</p>
<p>1、安装Ubuntu支持smbfs的包<br />
<code><br />
sudo apt-get install smbfs<br />
</code><br />
2、创建一个目录，用于挂载Windows共享目录<br />
<code><br />
sudo mkdir /mnt/smb<br />
</code><br />
3、将Windows共享目录mount到/mnt/smb目录<br />
<code><br />
sudo mount -t smbfs -o username=guest //192.168.10.34/tools /mnt/smb<br />
</code>其中username 为windows共享目录的访问用户<br />
4、卸载Windows共享目录<br />
<code><br />
sudo umount /mnt/smb<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/linux/ubuntu%e8%ae%bf%e9%97%aewindows%e5%85%b1%e4%ba%ab%e7%9b%ae%e5%bd%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从R型到L型思维的学习方法</title>
		<link>http://www.colorfuldays.org/life/reflection/from_l_to_/</link>
		<comments>http://www.colorfuldays.org/life/reflection/from_l_to_/#comments</comments>
		<pubDate>Sat, 10 Mar 2012 14:26:10 +0000</pubDate>
		<dc:creator>iamxhu</dc:creator>
				<category><![CDATA[Refection]]></category>

		<guid isPermaLink="false">http://www.colorfuldays.org/?p=816</guid>
		<description><![CDATA[今天下午和同事们一起去踢了场球，惨败而归。现在正在看《程序员的思维修炼》一书，正好读到其中“促成R型到L型转换”一节，忽然想起来踢球这件事。书中这一节中讲了个故事： 作者（Andy Hunt）第一次去攀岩时，教练在确定每个人的装备都没有问题后，让这些新人们开始攀岩。于是这些人就在岩石上胡乱爬了一会。半小时后，教练出现，开始讲课。因为之前已经有半小时的经验，所有教练讲解的更有意义。首先让我们经历了多感官的，亲身实践的情境，帮助我们有了初步了解。然后他再进行一次传统的、充满针对性的授课。 上面故事中作者自由攀岩用的是R型思维，因为它完全利用直觉，感觉去做事，而回到传统的授课时，这是L型 思维，在教如何攀岩时，会讲到各种情况下如何处理，它包含分析，逻辑判断等等。在这R-&#62;L的思维方式转变中，可以看到L型思维和R型思维在解决问题时是相辅相成的。 回到开篇的话题，我的踢球生涯始于高中，开始是一群同学拿个球就开始乱踢一通。完全按照自己的直觉踢，很少思考过具体应该怎么踢，也没有人教过应该怎么踢。在学习踢球这件事情上，我采用的是完全R型方式处理，现在来看，效果并不好，因为我踢得挺臭的。最近踢球时，才开始思考，在球场上，应该如何处理球，而不是跟球着跑。已经有通过L型思维来提高的欲望了，无奈现在没时间去学了。 因为这些，想起了另外一个话题，最近在学习C++，目前在看《Essential C++》一书，边看书时也把书中的一些代码自己写一遍，总体来讲，那些自己输入过的代码的知识点，记得比较深刻。看来《程序员的思维修炼》书中介绍的R型到L型思维方式的不断转换应用，是提高学习效率的重要方法。也无怪乎徐宥总结出自己敲完书中所有代码和章亦春的“眼到，手到，心到的抄书大法”都那么有效。]]></description>
			<content:encoded><![CDATA[<p>今天下午和同事们一起去踢了场球，惨败而归。现在正在看《程序员的思维修炼》一书，正好读到其中“促成R型到L型转换”一节，忽然想起来踢球这件事。书中这一节中讲了个故事：<br />
作者（Andy Hunt）第一次去攀岩时，教练在确定每个人的装备都没有问题后，让这些新人们开始攀岩。于是这些人就在岩石上胡乱爬了一会。半小时后，教练出现，开始讲课。因为之前已经有半小时的经验，所有教练讲解的更有意义。首先让我们经历了多感官的，亲身实践的情境，帮助我们有了初步了解。然后他再进行一次传统的、充满针对性的授课。</p>
<p>上面故事中作者自由攀岩用的是R型思维，因为它完全利用直觉，感觉去做事，而回到传统的授课时，这是L型 思维，在教如何攀岩时，会讲到各种情况下如何处理，它包含分析，逻辑判断等等。在这R-&gt;L的思维方式转变中，可以看到L型思维和R型思维在解决问题时是相辅相成的。</p>
<p>回到开篇的话题，我的踢球生涯始于高中，开始是一群同学拿个球就开始乱踢一通。完全按照自己的直觉踢，很少思考过具体应该怎么踢，也没有人教过应该怎么踢。在学习踢球这件事情上，我采用的是完全R型方式处理，现在来看，效果并不好，因为我踢得挺臭的。最近踢球时，才开始思考，在球场上，应该如何处理球，而不是跟球着跑。已经有通过L型思维来提高的欲望了，无奈现在没时间去学了。</p>
<p>因为这些，想起了另外一个话题，最近在学习C++，目前在看《Essential C++》一书，边看书时也把书中的一些代码自己写一遍，总体来讲，那些自己输入过的代码的知识点，记得比较深刻。看来《程序员的思维修炼》书中介绍的R型到L型思维方式的不断转换应用，是提高学习效率的重要方法。也无怪乎徐宥总结出自己敲完书中所有代码和章亦春的“眼到，手到，心到的抄书大法”都那么有效。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.colorfuldays.org/life/reflection/from_l_to_/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->

