<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>秘密小黑屋 &#187; java</title>
	<atom:link href="http://www.fhand.com/blog/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fhand.com/blog</link>
	<description>David&#039;s black room</description>
	<lastBuildDate>Wed, 23 Nov 2011 05:10:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>jQuery work with CKEditor</title>
		<link>http://www.fhand.com/blog/archives/498.html</link>
		<comments>http://www.fhand.com/blog/archives/498.html#comments</comments>
		<pubDate>Thu, 29 Sep 2011 03:13:10 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[技术收集]]></category>
		<category><![CDATA[ckeditor]]></category>
		<category><![CDATA[ckeditor取值]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery input 清空]]></category>
		<category><![CDATA[清空]]></category>
		<category><![CDATA[表单清空]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=498</guid>
		<description><![CDATA[最近忙于搞一个后台，开始只使用jQuery的ThickBox 组件，结果后台一工作发现杂七杂八的特殊符号得一一过滤，要不然就会影响界面的显示。一怒之下，引入富文本编辑器，直接使用了工程中原来就有的ckeditor,关于ckeditor的种种配置就不再讲述了，简单的很，手册可以参考这儿。 获取textarea对象 &#60;textarea id=”content” style=”width: 512px; height: 40px;” name=”content” rows=”5&#8243; cols=”50&#8243;&#62;cftea&#60;/textarea&#62; 对textarea操作的时候，直接使用jQuery的$(“#editorid”).val(“设置新的值”)不起作用，最后用下面的语句搞定 CKEDITOR.instances.content.setData&#40;&#34;秘密小黑屋&#34;&#41;; // content 就是前面 CKEDITOR.replace 的第一个参数值 或者使用 var editor = CKEDITOR.replace&#40;&#34;content&#34;&#41;; editor.setData&#40;&#34;秘密小黑屋&#34;&#41;; 获取值，可以使用 alert&#40;CKEDITOR.instances.content.getData&#40;&#41;&#41;; // content 就是前面 CKEDITOR.replace 的第一个参数值 或者 var editor = CKEDITOR.replace&#40;&#34;content&#34;&#41;; alert&#40;editor.getData&#40;&#41;&#41;; 直接使用jQuery的模式也起作用 alert&#40;$&#40;&#34;#content&#34;&#41;.val&#40;&#41;&#41;; 另外，jQuery的表单清空，多个不同项目的时候可以使用下面的组合： $&#40;':input','#myform'&#41; //所有input,传入form表单的id .not&#40;':button, :submit, :reset, :hidden'&#41; //除去这些按钮的操作 .val&#40;''&#41; //值清空 .removeAttr&#40;'checked'&#41; //去掉checkbox的选择 .removeAttr&#40;'selected'&#41;; //去掉select box的选择]]></description>
			<content:encoded><![CDATA[<p>最近忙于搞一个后台，开始只使用jQuery的ThickBox 组件，结果后台一工作发现杂七杂八的特殊符号得一一过滤，要不然就会影响界面的显示。一怒之下，引入富文本编辑器，直接使用了工程中原来就有的ckeditor,关于ckeditor的种种配置就不再讲述了，简单的很，<a title="ckeditor docs" href="http://docs.cksource.com/" target="_blank">手册可以参考</a>这儿。<br />
获取textarea对象<br />
&lt;textarea id=”content” style=”width: 512px; height: 40px;” name=”content” rows=”5&#8243; cols=”50&#8243;&gt;cftea&lt;/textarea&gt;</p>
<p>对textarea操作的时候，直接使用jQuery的$(“#editorid”).val(“设置新的值”)不起作用，最后用下面的语句搞定</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">CKEDITOR.<span style="color: #660066;">instances</span>.<span style="color: #660066;">content</span>.<span style="color: #660066;">setData</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;秘密小黑屋&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// content 就是前面 CKEDITOR.replace 的第一个参数值</span></pre></div></div>

<p>或者使用</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> editor <span style="color: #339933;">=</span> CKEDITOR.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;content&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
editor.<span style="color: #660066;">setData</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;秘密小黑屋&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>获取值，可以使用</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>CKEDITOR.<span style="color: #660066;">instances</span>.<span style="color: #660066;">content</span>.<span style="color: #660066;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// content 就是前面 CKEDITOR.replace 的第一个参数值</span></pre></div></div>

<p>或者</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> editor <span style="color: #339933;">=</span> CKEDITOR.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;content&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>editor.<span style="color: #660066;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>直接使用jQuery的模式也起作用</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#content&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>另外，jQuery的表单清空，多个不同项目的时候可以使用下面的组合：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">           $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':input'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'#myform'</span><span style="color: #009900;">&#41;</span>                    <span style="color: #006600; font-style: italic;">//所有input,传入form表单的id</span>
                 .<span style="color: #660066;">not</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':button, :submit, :reset, :hidden'</span><span style="color: #009900;">&#41;</span>   <span style="color: #006600; font-style: italic;">//除去这些按钮的操作</span>
		 .<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span>                                    <span style="color: #006600; font-style: italic;">//值清空</span>
		 .<span style="color: #660066;">removeAttr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'checked'</span><span style="color: #009900;">&#41;</span>             <span style="color: #006600; font-style: italic;">//去掉checkbox的选择</span>
		 .<span style="color: #660066;">removeAttr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selected'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>           <span style="color: #006600; font-style: italic;">//去掉select box的选择</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/498.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>org.springframework.dao.IncorrectResultSizeDataAccessException</title>
		<link>http://www.fhand.com/blog/archives/454.html</link>
		<comments>http://www.fhand.com/blog/archives/454.html#comments</comments>
		<pubDate>Tue, 06 Sep 2011 07:22:49 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[技术收集]]></category>
		<category><![CDATA[IncorrectResultSizeDataAccessException]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[limit]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[resin]]></category>
		<category><![CDATA[优化mysql]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=454</guid>
		<description><![CDATA[今天在写一个游戏接口的时候，以为数据库中就一条记录，想当然的写下了 select appid, code, name, url from hall_games where code=:code 测试机上一运行就出现这个异常。 org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 0 or 1, actual 8: com.xiaonei.in.dao.LoginUserDAO#getHallGameInfo &#8230; 于是查看文档。 Data access exception thrown when a result was not of the expected size, for example when expecting a single row but getting 0 or more than 1 rows。 当期望返回的结果记录是1时，如果返回值为0或者>1会抛此异常。于是修改sql,当需要一条数据的时候，还是老实加上limit 1比较好。 select [...]]]></description>
			<content:encoded><![CDATA[<p>今天在写一个游戏接口的时候，以为数据库中就一条记录，想当然的写下了</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">select</span> appid<span style="color: #000033;">,</span> code<span style="color: #000033;">,</span> name<span style="color: #000033;">,</span> url <span style="color: #990099; font-weight: bold;">from</span> hall_games <span style="color: #990099; font-weight: bold;">where</span> code<span style="color: #CC0099;">=</span>:code</pre></div></div>

<p>测试机上一运行就出现这个异常。<br />
org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 0 or 1, actual 8: com.xiaonei.in.dao.LoginUserDAO#getHallGameInfo<br />
&#8230;<br />
于是查看文档。<br />
Data access exception thrown when a result was not of the expected size, for example when expecting a single row but getting 0 or more than 1 rows。<br />
当期望返回的结果记录是1时，如果返回值为0或者>1会抛此异常。于是修改sql,当需要一条数据的时候，还是老实加上limit 1比较好。</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">select</span> appid<span style="color: #000033;">,</span> code<span style="color: #000033;">,</span> name<span style="color: #000033;">,</span> url <span style="color: #990099; font-weight: bold;">from</span> hall_games <span style="color: #990099; font-weight: bold;">where</span> code<span style="color: #CC0099;">=</span>:code <span style="color: #990099; font-weight: bold;">limit</span> <span style="color: #008080;">1</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/454.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HttpClient模拟操作https网站</title>
		<link>http://www.fhand.com/blog/archives/417.html</link>
		<comments>http://www.fhand.com/blog/archives/417.html#comments</comments>
		<pubDate>Fri, 05 Aug 2011 10:22:16 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[技术收集]]></category>
		<category><![CDATA[httpclient]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[httpwatch]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[spider]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[模拟请求]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=417</guid>
		<description><![CDATA[在日常工作中，我们常常需要抓取一些网站的信息为自己所用，比如自动抓取天气预报啊，抓取sina的股票数据，某些图片网站的美图等等，这就需要spider出场了，其实每种语言都有自己的写法，比如在Linux下，第一眼想到的就是wget,这是个强大的工具，可以递归地抓取网站，有windows下的版本，在本文章中还是说下Java的方式，那就是著名的开源软件HttpClient,在使用HttpClient的时候，我们需要知道网站的运行方式，可能在中间跳转了好几次，为了看到这些信息，我们还需要一点工具，Firefox的话直接中Httpfox就可以了，在IE下可以使用Httpwatch,官方下载地址是这个http://www.httpwatch.com，具体的使用很简单，不会的可以参考这个:http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html。 完事具备了，我们来看看怎么使用Httpclient public static HttpMethod loginXN&#40;&#41; throws IOException &#123; PostMethod post = new PostMethod&#40;&#34;http://passport.renren.com/PLogin.do&#34;&#41;; NameValuePair user = new NameValuePair&#40;&#34;email&#34;, &#34;zhangsan@hotmail.com&#34;&#41;; NameValuePair pwd = new NameValuePair&#40;&#34;password&#34;, &#34;12345&#34;&#41;; NameValuePair domain = new NameValuePair&#40;&#34;domain&#34;, &#34;renren.com&#34;&#41;; post.setRequestBody&#40;new NameValuePair&#91;&#93; &#123; user, pwd, domain&#125;&#41;; return post; &#125; 如果是https的请求，略微麻烦一点，需要使用SSLProtocolSocketFactory，在new HttpClient实例的时候，需要指定一下。 public static String httpGet&#40;String url,Header header&#41; &#123; Protocol myhttps = new Protocol&#40;&#34;https&#34;, [...]]]></description>
			<content:encoded><![CDATA[<p>在日常工作中，我们常常需要抓取一些网站的信息为自己所用，比如自动抓取天气预报啊，抓取sina的股票数据，某些图片网站的美图等等，这就需要spider出场了，其实每种语言都有自己的写法，比如在Linux下，第一眼想到的就是wget,这是个强大的工具，可以递归地抓取网站，有windows下的版本，在本文章中还是说下Java的方式，那就是著名的开源软件HttpClient,在使用<strong>HttpClient</strong>的时候，我们需要知道网站的运行方式，可能在中间跳转了好几次，为了看到这些信息，我们还需要一点工具，Firefox的话直接中Httpfox就可以了，在IE下可以使用<strong>Httpwatch</strong>,官方下载地址是这个<a href="http://www.httpwatch.com" target="_blank">http://www.httpwatch.com</a>，具体的使用很简单，不会的可以参考这个:<a href="http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html" target="blank" title="HttpWatch工具简介及使用技巧">http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html</a>。<br />
完事具备了，我们来看看怎么使用Httpclient</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> HttpMethod loginXN<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
                PostMethod post <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PostMethod<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://passport.renren.com/PLogin.do&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">NameValuePair</span> user <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">NameValuePair</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;email&quot;</span>,
				<span style="color: #0000ff;">&quot;zhangsan@hotmail.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">NameValuePair</span> pwd <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">NameValuePair</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;password&quot;</span>, <span style="color: #0000ff;">&quot;12345&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">NameValuePair</span> domain <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">NameValuePair</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;domain&quot;</span>, <span style="color: #0000ff;">&quot;renren.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		post.<span style="color: #006633;">setRequestBody</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">NameValuePair</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> user, pwd, domain<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> post<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>如果是https的请求，略微麻烦一点，需要使用SSLProtocolSocketFactory，在new HttpClient实例的时候，需要指定一下。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> httpGet<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url,Header header<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Protocol myhttps <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Protocol<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;https&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> SSLProtocolSocketFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">443</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> result <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        HttpClient httpClient <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HttpClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        GetMethod getMethod <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GetMethod<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        getMethod.<span style="color: #006633;">getParams</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span>HttpMethodParams.<span style="color: #006633;">RETRY_HANDLER</span>,
                <span style="color: #000000; font-weight: bold;">new</span> DefaultHttpMethodRetryHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> statusCode <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//默认代码Connection refused</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            httpClient.<span style="color: #006633;">getHostConfiguration</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setHost</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;passport.dudusp.com&quot;</span>,<span style="color: #cc66cc;">443</span>,myhttps<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            getMethod.<span style="color: #006633;">addRequestHeader</span><span style="color: #009900;">&#40;</span>header<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>            
            statusCode <span style="color: #339933;">=</span> httpClient.<span style="color: #006633;">executeMethod</span><span style="color: #009900;">&#40;</span>getMethod<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//执行getMethod</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>statusCode <span style="color: #339933;">==</span> HttpStatus.<span style="color: #006633;">SC_OK</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                result <span style="color: #339933;">=</span> getMethod.<span style="color: #006633;">getResponseBodyAsString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            log.<span style="color: #006633;">info</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
            getMethod.<span style="color: #006633;">releaseConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//释放连接</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> result<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/417.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>公司的passport验证原理</title>
		<link>http://www.fhand.com/blog/archives/415.html</link>
		<comments>http://www.fhand.com/blog/archives/415.html#comments</comments>
		<pubDate>Thu, 04 Aug 2011 11:08:35 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术收集]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[passport]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[权限验证]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=415</guid>
		<description><![CDATA[最近为了安全考虑，出了套验证机制。passport处理未登录用户的过程大致为： 1.用户访问应用服务器A 2.如果用户未登录A，自动重定向到passport服务器 3.passport验证登录成功后，返回验证票 4.应用服务器A使用验证票到passport服务器进行二次验证 5.passport二次验证成功后，返回用户名 根据上述处理过程，passport的使用方法为： 1.passport的请求地址为：passport.no.xxxx.com； 2.应用服务器请求passport页面时，需提供forward跳转参数； 3.passport接收请求，验证正确的情况下，返回验证票(ticket参数)； 4.应用服务器二次验证的过程为： 1）构造HTTP REFERER请求头； 2）携带HTTP REFERER请求头，远程读取passport.no.xxxx.com/verify.php?t=$ticket(该$ticket为 passport返回的ticket)地址的内容； 3）如果passport验证成功，返回用户名，否则返回空串。 passport的使用示例如下（以MM系统为例http://mm.renren.com/index.php）： 1.MM请求访问passport的地址：https://passport.no.xxxx.com/login.php?forward=http://mm.renren.com/index.php 2.passport验证成功后，将地址重定向到http://mm.renren.com/index.php/index.php?ticket=nscr3omh80rn367h5pu0dq76u0 3.MM系统处理passport验证票($ticket参数)的过程为： function auth_check_valid&#40;$ticket&#41;&#123; if&#40;$ticket == &#34;&#34;&#41; return false; &#160; $opts=array&#40; 'http'=&#62;array&#40; 'header'=&#62;&#34;Referer :&#34;.$_SERVER&#91;'REQUEST_URI'&#93; &#41; &#41;; &#160; $context = stream_context_create&#40;$opts&#41;;//构造HTTP REFERER头 $url = &#34;https://passport.no.xxxx.com/verify.php?t=&#34;.$ticket; $user_id = file_get_contents&#40;$url,false,$context&#41;;//二次验证，远程请求用户名 return $user_id;//返回登录用户名，需进行后续判断是否为空串 &#125; 在接下来的文章中，我们会进一步讲解如果使用程序模拟登录验证系统，该怎么处理。]]></description>
			<content:encoded><![CDATA[<p>最近为了安全考虑，出了套验证机制。passport处理未登录用户的过程大致为：<br />
   1.用户访问应用服务器A<br />
   2.如果用户未登录A，自动重定向到passport服务器<br />
   3.passport验证登录成功后，返回验证票<br />
   4.应用服务器A使用验证票到passport服务器进行二次验证<br />
   5.passport二次验证成功后，返回用户名   </p>
<p>根据上述处理过程，passport的使用方法为：<br />
   1.passport的请求地址为：passport.no.xxxx.com；<br />
   2.应用服务器请求passport页面时，需提供forward跳转参数；<br />
   3.passport接收请求，验证正确的情况下，返回验证票(ticket参数)；<br />
   4.应用服务器二次验证的过程为：<br />
       1）构造HTTP REFERER请求头；<br />
       2）携带HTTP REFERER请求头，远程读取passport.no.xxxx.com/verify.php?t=$ticket(该$ticket为 passport返回的ticket)地址的内容；<br />
       3）如果passport验证成功，返回用户名，否则返回空串。</p>
<p>passport的使用示例如下（以MM系统为例http://mm.renren.com/index.php）：<br />
   1.MM请求访问passport的地址：https://passport.no.xxxx.com/login.php?forward=http://mm.renren.com/index.php<br />
   2.passport验证成功后，将地址重定向到http://mm.renren.com/index.php/index.php?ticket=nscr3omh80rn367h5pu0dq76u0<br />
   3.MM系统处理passport验证票($ticket参数)的过程为：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">   <span style="color: #000000; font-weight: bold;">function</span> auth_check_valid<span style="color: #009900;">&#40;</span><span style="color: #000088;">$ticket</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ticket</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
           <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
       <span style="color: #000088;">$opts</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
           <span style="color: #0000ff;">'http'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
               <span style="color: #0000ff;">'header'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;Referer :&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span>
           <span style="color: #009900;">&#41;</span>
       <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
       <span style="color: #000088;">$context</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stream_context_create</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$opts</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//构造HTTP REFERER头   </span>
       <span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;https://passport.no.xxxx.com/verify.php?t=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$ticket</span><span style="color: #339933;">;</span>
       <span style="color: #000088;">$user_id</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span><span style="color: #000088;">$context</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//二次验证，远程请求用户名       </span>
       <span style="color: #b1b100;">return</span> <span style="color: #000088;">$user_id</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//返回登录用户名，需进行后续判断是否为空串</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>在接下来的文章中，我们会进一步讲解如果使用程序模拟登录验证系统，该怎么处理。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/415.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use jpype in python scripts</title>
		<link>http://www.fhand.com/blog/archives/384.html</link>
		<comments>http://www.fhand.com/blog/archives/384.html#comments</comments>
		<pubDate>Wed, 20 Jul 2011 07:16:10 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[技术收集]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java exception]]></category>
		<category><![CDATA[jpype]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python access java]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=384</guid>
		<description><![CDATA[JPype is an effort to allow python programs full access to java class libraries. This is achieved not through re-implementing Python, as Jython/JPython has done, but rather through interfacing at the native level in both Virtual Machines. JPype是一个高效的python库，它允许python程序和java类互通。它并非是一个重新实现的Python,就像Jython和JPython那样，而是通过在虚拟机native层面上实现。 Eventually, it should be possible to replace Java with python in many, though not all, situations. JSP, [...]]]></description>
			<content:encoded><![CDATA[<p>JPype is an effort to allow python programs full access to java class libraries. This is achieved not through re-implementing Python, as Jython/JPython has done, but rather through interfacing at the native level in both Virtual Machines.<br />
JPype是一个高效的python库，它允许python程序和java类互通。它并非是一个重新实现的Python,就像Jython和JPython那样，而是通过在虚拟机native层面上实现。<br />
Eventually, it should be possible to replace Java with python in many, though not all, situations. JSP, Servlets, RMI servers and IDE plugins are all good candidates.<br />
实际上，它应该可以在许多的场景下使用python来替换Java，当然了并非所有的都能替换。像 JSP, Servlets, RMI servers and IDE plugins都是很好的替换对象。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;强行分割一下吧&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
最近学习写一些用来处理日志log的python脚本，但是到连接到线上数据库的时候出现了点小小的麻烦，因为众所周知,renren的代码是java的，连接数据库都被java做了封装，不能显示的看到具体那台数据库【实际上开发者也无需关心，我们只需要一个配置文件，具体指向什么地方，后面是一台机器还是多台，都不在操心。】就想找到一个python能直接访问java程序的解决方案，翻来翻去就找到JPype了，它的源码好久没更新，不过最近更新了一下，最新的版本是0.5.4.1，可以<a href="http://jpype.sourceforge.net/" target="_blank">通过这个链接下载</a>。<br />
安装很简单，直接直接python setup.py install就可以了（安装过程中显示的warning可以不必理会）。用于测试是否安装成功的Hello World代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> jpype <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
startJVM<span style="color: black;">&#40;</span>getDefaultJVMPath<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
java.<span style="color: black;">lang</span>.<span style="color: black;">System</span>.<span style="color: black;">out</span>.<span style="color: black;">println</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hello world&quot;</span><span style="color: black;">&#41;</span>
shutdownJVM<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>运行结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>root<span style="color: #339933;">@</span>SJSWT45<span style="color: #339933;">-</span><span style="color: #cc66cc;">26</span> wei<span style="color: #009900;">&#93;</span><span style="color: #666666; font-style: italic;"># python testp2j.py
</span>hello world
JVM activity report     <span style="color: #339933;">:</span>
        classes loaded       <span style="color: #339933;">:</span> <span style="color: #cc66cc;">30</span>
JVM has been shutdown</pre></div></div>

<h2 style="margin-top: 0px;">2.  启动JVM</h2>
<p>依靠<span style="color: blue;">startJVM</span>这个函数来完成，一个使用的例子是这样的：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">vmPath <span style="color: #339933;">=</span> jpype<span style="color: #339933;">.</span>getDefaultJVMPath<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
jpype<span style="color: #339933;">.</span>startJVM<span style="color: #009900;">&#40;</span>vmPath<span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;-Xms32m&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;-Xmx256m&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;-mx256m&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;-Djava.class.path=/home/some-lib.jar:&quot;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p><span style="color: blue;">startJVM</span>的第一个参数是JVM库所在的路径（和JAVA_HOME不是一回事儿），通常可以用<span style="color: blue;">jpype.getDefaultJVMPath()</span>来自动获取系统默认JVM的路径。如果系统中安装了多个JDK，希望从中选择一个，则可以手动注明这个路径。比如Mac OSX下可以写成<span style="color: blue;">“/System/Library/<span>Frameworks/JavaVM</span>.framework/Libraries/libjvm_compat.dylib”</span>。</p>
<p>剩下的都是发送给JVM的启动参数，每个逗号见是一个参数。因为这里是不支持带空格的参数写法的，所以例子里特意把<span style="color: blue;">classpath</span>参数写成了<span style="color: blue;">-Djava.class.path=&#8230;</span>的形式。注意这里需要手工保证参数的正确性，jpype是不会对错误的参数给出提示的，它的反应很简单，就是在后面用到这个JVM的时候报一些怎么也想不明白的错误……所以，使用jpype遇到任何问题，首先检查传给<span style="color: blue;">startJVM</span>的各参数正确性。</p>
<h2 style="margin-top: 0px;">3.  如何调用一个Java函数</h2>
<p>主要靠<span style="color: blue;"><span>JPackage</span></span>语句来实现，比如</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Document <span style="color: #339933;">=</span> jpype<span style="color: #339933;">.</span>JPackage<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'org'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>w3c<span style="color: #339933;">.</span>dom<span style="color: #339933;">.</span>Document</pre></div></div>

<p>可以把Java里面的org.w3c.dom.Document映射给Python里面的Document变量。<br />
java和javax两个包不需要以这种方式来调用，直接类似<span style="color: blue;">jpype.java.lang.System.out.println()</span>这样就可以了。</p>
<p>有时候我们会遇到类似<span style="color: blue;">“<span>TypeError</span>: Package org.w3c.dom.Document is not Callable”</span>这样的错误。通常这时用到的Java指令在jar里面，而这个jar没有被正确导入，所以JVM找不到它。也就是说，遇到这种错误时，要去检查<span style="color: blue;">startJVM</span>函数中的<span style="color: blue;">-Djava.class.path=</span>参数的设置，通常都是因为这里的路径写错了造成的。</p>
<h2 style="margin-top: 0px;">4.  如果捕捉Java异常</h2>
<p>可以在Python里使用<span style="color: blue;"> <span>jpype.JavaException</span></span>指代所有的Java异常，比如像下面这样：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">import jpype
jpype<span style="color: #339933;">.</span>startJVM<span style="color: #009900;">&#40;</span>jpype<span style="color: #339933;">.</span>getDefaultJVMPath<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
try<span style="color: #339933;">:</span>
    jpype<span style="color: #339933;">.</span>java<span style="color: #339933;">.</span>lang<span style="color: #339933;">.</span>Integer<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;x1&quot;</span><span style="color: #009900;">&#41;</span>
except jpype<span style="color: #339933;">.</span>JavaException<span style="color: #339933;">,</span> ex<span style="color: #339933;">:</span>
    <span style="color: #b1b100;">print</span> ex<span style="color: #339933;">.</span>javaClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> ex<span style="color: #339933;">.</span>message<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">print</span> ex<span style="color: #339933;">.</span>stacktrace<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>    
jpype<span style="color: #339933;">.</span>shutdownJVM<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>如果要捕获特定的Java异常呢，则需要用到<span style="color: blue;"><span>jpype.JException</span></span>，比如像下面这样捕获的就是java.<span>lang.NumberFormatException</span>：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">import jpype
jpype<span style="color: #339933;">.</span>startJVM<span style="color: #009900;">&#40;</span>jpype<span style="color: #339933;">.</span>getDefaultJVMPath<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
try<span style="color: #339933;">:</span>
    jpype<span style="color: #339933;">.</span>java<span style="color: #339933;">.</span>lang<span style="color: #339933;">.</span>Integer<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;x1&quot;</span><span style="color: #009900;">&#41;</span>
except jpype<span style="color: #339933;">.</span>JException<span style="color: #009900;">&#40;</span>jpype<span style="color: #339933;">.</span>java<span style="color: #339933;">.</span>lang<span style="color: #339933;">.</span>NumberFormatException<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> ex<span style="color: #339933;">:</span>
    <span style="color: #b1b100;">print</span> ex<span style="color: #339933;">.</span>javaClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> ex<span style="color: #339933;">.</span>message<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">print</span> ex<span style="color: #339933;">.</span>stacktrace<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>    
jpype<span style="color: #339933;">.</span>shutdownJVM<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<h2 style="margin-top: 0px;">5.  如何处理Java的函数多态</h2>
<p>Java里面是允许参数格式不同的多个同名函数的，Python里面则不允许。这样在通过jpype调用Java api里面的函数时，有时会因为参数的类型乱掉而报错。那么怎么能调用到Java里面的特定函数呢？没办法，做强制类型转换吧。</p>
<p>比如<span style="color: blue;">jpype.java.lang.System.out.println(1)</span>实际会调用<span style="color: blue;">println(int)</span>，那么如果我们想调用<span style="color: blue;">println(byte)%，则可以写成</span><span style="color: blue;">jpype.java.lang.System.out.println(<span>JByte</span>(1))</span>这样。。</p>
<h2 style="margin-top: 0px;">6.  如何重启JVM</h2>
<p>jpype提供的<span style="color: blue;">shutdownJVM()</span>方法实际调用的是JNI接口的unload实现，但是Sun对unload的实现有点问题，造成的结果就是jpype调用<span style="color: blue;">shutdownJVM()</span>以后就没法再<span style="color: blue;">startJVM()</span>了（会报错）。什么？您问关掉JVM干嘛还要重新开启它，这个折腾个什么劲？答案很简单：因为有时在未知的黑暗角落隐藏着邪恶的源头——内存泄露。。</p>
<p>既然jpype没法重启JVM，那么只好把jpype放到processing里面来用，需要重启时，就杀掉当前进 程，重新启动一个新进程好了。。（processing安装很简单，Python 2.6官方发行版已经带了，之前的版本则可以easy_install  processing）</p>
<p>下面给出一个processing下用jpype的例子：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> jpype
<span style="color: #ff7700;font-weight:bold;">import</span> processing
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> java_loop<span style="color: black;">&#40;</span>pipe, <span style="color: #008000;">id</span><span style="color: black;">&#41;</span>:
    jpype.<span style="color: black;">startJVM</span><span style="color: black;">&#40;</span>jpype.<span style="color: black;">getDefaultJVMPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
        jpype.<span style="color: black;">java</span>.<span style="color: black;">lang</span>.<span style="color: black;">System</span>.<span style="color: black;">out</span>.<span style="color: black;">println</span><span style="color: black;">&#40;</span>pipe.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' '</span> + <span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
        pipe.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
head1, head2 = processing.<span style="color: black;">Pipe</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
p = processing.<span style="color: black;">Process</span><span style="color: black;">&#40;</span>target = java_loop, args = <span style="color: black;">&#91;</span>head2, <span style="color: #483d8b;">'(JVM 1)'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
p.<span style="color: black;">setDaemon</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
p.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
head1.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Hello message from&quot;</span><span style="color: black;">&#41;</span>
head1.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
p.<span style="color: black;">terminate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
head1, head2 = processing.<span style="color: black;">Pipe</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
p = processing.<span style="color: black;">Process</span><span style="color: black;">&#40;</span>target = java_loop, args = <span style="color: black;">&#91;</span>head2, <span style="color: #483d8b;">'(JVM 2)'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
p.<span style="color: black;">setDaemon</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
p.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
head1.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Hello message from&quot;</span><span style="color: black;">&#41;</span>
head1.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>这里用到的<span style="color: blue;">pipe.recv()</span>要小心，一旦阻塞可能会与twisted之类的框架产生冲突。一个可能的解决办法是在<span style="color: blue;">recv()</span>之前用<span style="color: blue;">pipe.poll()</span>函数检测一下管道里面是否有待接收数据，如果没有就等一会重新<span style="color: blue;">poll()</span>就是了。[<span style="color: blue;">poll()</span>自称是非阻塞的，因为它只阻塞当前线程；而<span style="color: blue;">recv()</span>则会阻塞当前进程，于是twisted就不干了] </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/384.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>很茫然也很兴奋</title>
		<link>http://www.fhand.com/blog/archives/113.html</link>
		<comments>http://www.fhand.com/blog/archives/113.html#comments</comments>
		<pubDate>Fri, 29 Oct 2010 08:41:01 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[技术收集]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHPRPC]]></category>
		<category><![CDATA[远程通讯]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=113</guid>
		<description><![CDATA[进一步搞好学习，持续攻坚英语，业务上学习C++和PHPRPC]]></description>
			<content:encoded><![CDATA[<p>     写代码时间久了，总是感觉接触面越来越窄，到现在估计只剩下Java还能写点东西了，PHP算作业余时间搞的，好在是弱语言类型的，每次都是现学现卖。一口气写下来，在本地debug也快，出现错误就地改正就是了，尝试过用框架，结果都是半途而废了，估计水平也就这样子了，自己搞点小玩意儿还是可以的，帮朋友做几个个人网站也行。<br />
      近半年来，总算是有点目标，学习还是马马虎虎的，最近公司的事情好多啊，只能见缝插针的学习点，感觉提高的也不快，任何事情总得动手才行。<br />
     淘宝客的一堆东西基本上快研究透彻了，想到了几个点子，准备抽时间给实现了。<br />
     剩下的学习任务很很重，搞下PHPRPC，丢掉的C++想尽可能的给捡回来，搞好英语。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/113.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习memcached的安装和java通讯</title>
		<link>http://www.fhand.com/blog/archives/108.html</link>
		<comments>http://www.fhand.com/blog/archives/108.html#comments</comments>
		<pubDate>Thu, 30 Sep 2010 08:17:56 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[技术收集]]></category>
		<category><![CDATA[cannot open shared object file]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[libevent]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=108</guid>
		<description><![CDATA[memcache需要libevent进行网络的通讯才能正常工作，所以安装memcache之前需要首先安装libevent. libevent可以从这儿下载，memcache需要从google code下载。 现在万事具备，开始安装的基本过程，如下所示： #yum install gcc //确认gcc已经安装，可以gcc -v确认 #wget http://monkey.org/~provos/libevent-1.4.5-stable.tar.gz //下载最新的稳定版本 #tar xvzf libevent-1.4.4-stable.tar.gz //解压缩 #cd libevent-1.4.4-stable #./configure -prefix=/usr/local/libevent //开始编译 #make #make install 接着安装memcache. #cd /home/mysoft/ #tar -zxvf memcached-1.4.5.tar.gz #cd memcached-1.5.0 #./configure --prefix=/usr/local/memcached --with-libevent=/usr/ #make #make install #ls -al /usr/local/memcached/bin //验证安装 如果没有问题，现在就可以正常启动memcached了，命令如下： /usr/local/memcached/bin/memcached -d -m 100 -u root -l 192.168.1.101 -p 11211 -c 256 [...]]]></description>
			<content:encoded><![CDATA[<p>         memcache需要libevent进行网络的通讯才能正常工作，所以安装memcache之前需要首先安装libevent. libevent可以从<a href="http://www.monkey.org/~provos/libevent/">这儿</a>下载，memcache需要从<a href="http://code.google.com/p/spymemcached/downloads/list">google code</a>下载。<br />
         现在万事具备，开始安装的基本过程，如下所示：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#yum install gcc  //确认gcc已经安装，可以gcc -v确认
</span>
<span style="color: #666666; font-style: italic;">#wget http://monkey.org/~provos/libevent-1.4.5-stable.tar.gz  //下载最新的稳定版本
</span><span style="color: #666666; font-style: italic;">#tar xvzf libevent-1.4.4-stable.tar.gz  //解压缩
</span><span style="color: #666666; font-style: italic;">#cd libevent-1.4.4-stable 
</span><span style="color: #666666; font-style: italic;">#./configure -prefix=/usr/local/libevent //开始编译
</span><span style="color: #666666; font-style: italic;">#make
</span><span style="color: #666666; font-style: italic;">#make install</span></pre></div></div>

<p>接着安装memcache.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#cd /home/mysoft/
</span><span style="color: #666666; font-style: italic;">#tar -zxvf  memcached-1.4.5.tar.gz
</span><span style="color: #666666; font-style: italic;">#cd  memcached-1.5.0
</span><span style="color: #666666; font-style: italic;">#./configure --prefix=/usr/local/memcached --with-libevent=/usr/
</span><span style="color: #666666; font-style: italic;">#make #make install
</span><span style="color: #666666; font-style: italic;">#ls -al /usr/local/memcached/bin //验证安装</span></pre></div></div>

<p>如果没有问题，现在就可以正常启动memcached了，命令如下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>local<span style="color: #339933;">/</span>memcached<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>memcached <span style="color: #339933;">-</span>d <span style="color: #339933;">-</span>m <span style="color: #cc66cc;">100</span> <span style="color: #339933;">-</span>u root <span style="color: #339933;">-</span>l 192<span style="color: #339933;">.</span>168<span style="color: #339933;">.</span>1<span style="color: #339933;">.</span>101 <span style="color: #339933;">-</span>p <span style="color: #cc66cc;">11211</span> <span style="color: #339933;">-</span>c <span style="color: #cc66cc;">256</span> <span style="color: #339933;">-</span>P <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>memcached<span style="color: #339933;">.</span>pid</pre></div></div>

<p>-d选项是启动一个守护进程，<br />
-m是分配给Memcache使用的内存数量，单位是MB，我这里是100MB，<br />
-u是运行Memcache的用户，我这里是root，<br />
-l是监听的服务器IP地址，如果有多个地址的话，我这里指定了服务器的IP地址192.168.1.100，<br />
-p是设置Memcache监听的端口，我这里设置了11211，最好是1024以上的端口，我们这里统一使用11211-c选项是最大运行的并发连接数，默认是1024，我这里设置了256，按照自己服务器的负载量来设定。<br />
-P是设置保存Memcache的pid文件，我这里是保存在/tmp/memcached.pid<br />
常见的启动失败信息有：<br />
AA.启动时找不到libevent库<br />
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory </p>
<p>解决办法1：将libevent库所在路径加入LIBRARY_PATH,在/etc/profile中加入<br />
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/libevent/lib</p>
<p>解决办法2：<br />
ln -s /libevent安装路径/libevent/lib/libevent-1.3b.so.1 /usr/lib/libevent-1.3c.so.1<br />
详细的处理过程如下：<br />
>locate libevent-1.4.so.2<br />
libevent-1.4.so: /usr/local/lib/libevent-1.4.so.2</p>
<p>> ldd /usr/local/bin/memcached<br />
        linux-gate.so.1 =>  (0xb7fa4000)<br />
        <strong>libevent-1.4.so.2 => not found</strong><br />
        libpthread.so.0 => /lib/libpthread.so.0 (0x0086e000)<br />
        libc.so.6 => /lib/libc.so.6 (0x006f7000)<br />
        /lib/ld-linux.so.2 (0x006d9000)</p>
<p>> LD_DEBUG=libs ./memcached -v<br />
找到默认路径 /usr/lib/<br />
>ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2</p>
<p>>ldd /usr/local/bin/memcached<br />
        linux-gate.so.1 =>  (0xb7ffd000)<br />
        libevent-1.4.so.2 => /usr/lib/libevent-1.4.so.2 (0xb7fdc000)<br />
        libpthread.so.0 => /lib/libpthread.so.0 (0x0086e000)<br />
        libc.so.6 => /lib/libc.so.6 (0x006f7000)<br />
        libnsl.so.1 => /lib/libnsl.so.1 (0x009f8000)<br />
        librt.so.1 => /lib/librt.so.1 (0&#215;00887000)<br />
        libresolv.so.2 => /lib/libresolv.so.2 (0x00b29000)<br />
        /lib/ld-linux.so.2 (0x006d9000)<br />
收工<br />
AB.第二个可能的问题是编译memcache期间出现的，解决方案可以参考<a href="http://kb.cnblogs.com/a/1501326/">这儿</a><br />
或者 在./configure 时加入参数–build=i686-pc-linux-gnu<br />
AC.如果客户端连接不上，可能是服务器防火墙的原因，选择关闭或者增加相应的iptables文件如下:<br />
#永久性生效，重启后不会复原<br />
开启： chkconfig iptables on<br />
关闭： chkconfig iptables off<br />
#即时生效，重启后复原<br />
开启： service iptables start<br />
关闭： service iptables stop<br />
#修改/etc/sysconfig/iptables文件，<br />
添加-A RH-Firewall-1-INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 11211 -j ACCEPT</p>
<p>使用的方式可以有很多种，常见的语言api通过官方网站都能找到，比如php的参考<a href="http://pecl.php.net/package/memcached">这儿</a>，需要memcached<a href="http://code.google.com/p/memcached/wiki/PHPClientComparison">插件</a><br />
Java的可以选择这个<a href="http://code.google.com/p/spymemcached/">spymemcached</a>或者<a href="http://www.whalin.com/memcached">java memcached</a>，其他语言的可以从<a href="http://code.google.com/p/memcached/wiki/Clients">这个列表</a>中查找。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/108.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>commons lang组件之自动生成toString()内容</title>
		<link>http://www.fhand.com/blog/archives/83.html</link>
		<comments>http://www.fhand.com/blog/archives/83.html#comments</comments>
		<pubDate>Fri, 30 Oct 2009 04:35:07 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[toString]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=83</guid>
		<description><![CDATA[问题 希望能自动生成toString()方法 解决方案 使用Commons Lang的ReflectionToStringBuilder或ToStringBuiler,配合ToStringBuilder可生成toString()方法 .下面的代码显示了如何使用反射生成器(reflection builder)生成toString()方法. import org.apache.commons.lang.builder.ReflectionToStringBuilder; public String toString(){ return ReflectionToStringBuilder.toString(this); } 让toString()的内容与不断变化的类保持一致,是一项让人心烦又容易遗忘的工作.Commons Lang带有一个非常易用的工具类, 通过反射自动完成这件麻烦事.ToStringBuilder类及其派生类ReflectionToStringBuilder能把原本臃肿的toString()方法 浓缩成一行.更重要的是ReflectionToStringBuilder反映了对象模型未来的变化趋势. 在有限的时间和预算条件下,面对含有上百个实体的对象模型,要保证toString()方法能实时更新几乎就是天方夜谭.如果你的类 拥有含义明确的toString()方法,在诊断程序时将会受益非浅.通过使用ReflectionToStringBuilder类,能确保输出是正确的. 依靠开发者手动维护toString()方法会很不可靠.]]></description>
			<content:encoded><![CDATA[<p>问题</p>
<p>  希望能自动生成toString()方法</p>
<p>解决方案</p>
<p>  使用Commons Lang的ReflectionToStringBuilder或ToStringBuiler,配合ToStringBuilder可生成toString()方法<br />
  .下面的代码显示了如何使用反射生成器(reflection builder)生成toString()方法.</p>
<p>  import org.apache.commons.lang.builder.ReflectionToStringBuilder;</p>
<p>  public String toString(){<br />
    return ReflectionToStringBuilder.toString(this);<br />
  }</p>
<p>  让toString()的内容与不断变化的类保持一致,是一项让人心烦又容易遗忘的工作.Commons Lang带有一个非常易用的工具类,<br />
  通过反射自动完成这件麻烦事.ToStringBuilder类及其派生类ReflectionToStringBuilder能把原本臃肿的toString()方法<br />
  浓缩成一行.更重要的是ReflectionToStringBuilder反映了对象模型未来的变化趋势.</p>
<p>  在有限的时间和预算条件下,面对含有上百个实体的对象模型,要保证toString()方法能实时更新几乎就是天方夜谭.如果你的类<br />
  拥有含义明确的toString()方法,在诊断程序时将会受益非浅.通过使用ReflectionToStringBuilder类,能确保输出是正确的.<br />
  依靠开发者手动维护toString()方法会很不可靠.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/83.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>native2ascii工具使用</title>
		<link>http://www.fhand.com/blog/archives/81.html</link>
		<comments>http://www.fhand.com/blog/archives/81.html#comments</comments>
		<pubDate>Wed, 14 Oct 2009 03:32:10 +0000</pubDate>
		<dc:creator>weige</dc:creator>
				<category><![CDATA[技术收集]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[native2ascii]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=81</guid>
		<description><![CDATA[在做Java开发的时候，常常会出现一些乱码，或者无法正确识别或读取的文件，比如常见的validator验证用的消息资源（properties）文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode，而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为 java正确识别的编码问题就解决了。 1、native2ascii简介： native2ascii是sun java sdk提供的一个工具。用来将别的文本类文件（比如*.txt,*.ini,*.properties,*.java等等）编码转为Unicode编码。为什么要进行转码，原因在于程序的国际化。Unicode编码的定义：Unicode（统一码、万国码、单一码）是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发，1994年正式公布。随着计算机工作能力的增强，Unicode也在面世以来的十多年里得到普及。 2、获取native2ascii： 安装了jdk后，假如你是在windows上安装，那么在jdk的安装目录下，会有一个bin目录，其中native2ascii.exe正是。 3、native2ascii的命令行的命名格式： native2ascii -[options] [inputfile [outputfile]] 说明： -[options]：表示命令开关，有两个选项可供选择 -reverse：将Unicode编码转为本地或者指定编码，不指定编码情况下，将转为本地编码。 -encoding encoding_name：转换为指定编码，encoding_name为编码名称。 [inputfile [outputfile]] inputfile：表示输入文件全名。 outputfile：输出文件名。如果缺少此参数，将输出到控制台。 4、最佳实践： 首先将JDK的bin目录加入系统变量path。在盘下建立一个test目录，在test目录里建立一个zh.txt文件，文件内容为：“熔岩”，打开“命令行提示符”，并进入C:test目录下。下面就可以按照说明一步一步来操作，注意观察其中编码的变化。 A：将zh.txt转换为Unicode编码，输出文件到u.txt native2ascii zh.txt u.txt 打开u.txt，内容为“u7194u5ca9”。 B：将zh.txt转换为Unicode编码，输出到控制台 C:test>native2ascii zh.txt u7194u5ca9 可以看到，控制台输出了“u7194u5ca9”。 C：将zh.txt转换为ISO8859-1编码，输出文件到i.txt native2ascii -encoding ISO8859-1 zh.txt i.txt 打开i.txt文件，内容为“u00c8u00dbu00d1u00d2”。 D：将u.txt转换为本地编码，输出到文件u_nv.txt native2ascii -reverse u.txt u_nv.txt 打开u_nv.txt文件，内容为“熔岩”。 E：将u.txt转换为本地编码，输出到控制台 C:test>native2ascii -reverse u.txt 熔岩 可以看到，控制台输出了“熔岩”。 F：将i.txt转换为本地编码，输出到i_nv.txt native2ascii [...]]]></description>
			<content:encoded><![CDATA[<p>在做Java开发的时候，常常会出现一些乱码，或者无法正确识别或读取的文件，比如常见的validator验证用的消息资源（properties）文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode，而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为 java正确识别的编码问题就解决了。</p>
<p>1、native2ascii简介：<br />
    native2ascii是sun java sdk提供的一个工具。用来将别的文本类文件（比如*.txt,*.ini,*.properties,*.java等等）编码转为Unicode编码。为什么要进行转码，原因在于程序的国际化。Unicode编码的定义：Unicode（统一码、万国码、单一码）是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发，1994年正式公布。随着计算机工作能力的增强，Unicode也在面世以来的十多年里得到普及。<br />
2、获取native2ascii：<br />
      安装了jdk后，假如你是在windows上安装，那么在jdk的安装目录下，会有一个bin目录，其中native2ascii.exe正是。</p>
<p>3、native2ascii的命令行的命名格式：<br />
native2ascii -[options] [inputfile [outputfile]]</p>
<p>说明：<br />
-[options]：表示命令开关，有两个选项可供选择<br />
-reverse：将Unicode编码转为本地或者指定编码，不指定编码情况下，将转为本地编码。<br />
-encoding encoding_name：转换为指定编码，encoding_name为编码名称。</p>
<p>[inputfile [outputfile]]<br />
inputfile：表示输入文件全名。<br />
outputfile：输出文件名。如果缺少此参数，将输出到控制台。</p>
<p>4、最佳实践：<span id="more-81"></span><br />
     首先将JDK的bin目录加入系统变量path。在盘下建立一个test目录，在test目录里建立一个zh.txt文件，文件内容为：“熔岩”，打开“命令行提示符”，并进入C:test目录下。下面就可以按照说明一步一步来操作，注意观察其中编码的变化。</p>
<p>A：将zh.txt转换为Unicode编码，输出文件到u.txt<br />
native2ascii zh.txt u.txt<br />
打开u.txt，内容为“u7194u5ca9”。</p>
<p>B：将zh.txt转换为Unicode编码，输出到控制台<br />
C:test>native2ascii zh.txt<br />
u7194u5ca9<br />
可以看到，控制台输出了“u7194u5ca9”。</p>
<p>C：将zh.txt转换为ISO8859-1编码，输出文件到i.txt<br />
native2ascii -encoding ISO8859-1 zh.txt i.txt<br />
打开i.txt文件，内容为“u00c8u00dbu00d1u00d2”。</p>
<p>D：将u.txt转换为本地编码，输出到文件u_nv.txt<br />
native2ascii -reverse u.txt u_nv.txt<br />
打开u_nv.txt文件，内容为“熔岩”。</p>
<p>E：将u.txt转换为本地编码，输出到控制台<br />
C:test>native2ascii -reverse u.txt<br />
熔岩<br />
可以看到，控制台输出了“熔岩”。</p>
<p>F：将i.txt转换为本地编码，输出到i_nv.txt<br />
native2ascii -reverse i.txt i_nv.txt<br />
打开i_nv.txt文件，内容为“u00c8u00dbu00d1u00d2”。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。</p>
<p>G：将i.txt转换为GBK编码，输出到i_gbk.txt<br />
native2ascii -reverse -encoding GBK i.txt i_gbk.txt<br />
打开i_gbk.txt文件，内容为“u00c8u00dbu00d1u00d2”。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。</p>
<p>H：将u_nv.txt转码到本地编码GBK，输出到控制台<br />
C:test>native2ascii -reverse -encoding ISO8859-1 i.txt<br />
熔岩<br />
从这个结果看，目标达到到了，编码i.txt为ISO8859-1，转为本地编码后内容为“熔岩”。从这里应该意识到，native2ascii -reverse命令中-encoding指定的编码为源文件的编码格式。而在native2ascii 命令中-encoding指定的编码为（生成的）目标文件的编码格式。这一点非常的重要！切记！！</p>
<p>继续探索，新建文件12a.txt，内容“12axyz”。看看纯字母数字的编码又如何。</p>
<p>I：将纯字母数字的文本文件12a.txt转换为Unicode编码<br />
native2ascii 12a.txt 12a_nv.txt<br />
打开12a_nv.txt文件，内容为“12axyz”。<br />
继续测试，转为ISO8859-1编码看看<br />
C:test>native2ascii -encoding ISO8859-1 12a.txt<br />
12axyz<br />
结果还是没有转码。</p>
<p>从结果可以得出结论：对于纯数字和字母的文本类型文件（只有ASCII码），转码前后的内容是一样的。</p>
<p>5、总结：<br />
     native2ascii是一个非常的好转码工具，并且转码是可逆的！而其真正的含义并非本地编码——>转码为ASCII码，而是一个通用的文本文件编码转换工具。在做编码转换的时候有两类指定编码的情形，分别指输出文件编码和输入文件编码，具体可以看看最佳实践部分。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/81.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>漫谈一下网站的转化率与注册</title>
		<link>http://www.fhand.com/blog/archives/481.html</link>
		<comments>http://www.fhand.com/blog/archives/481.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 17:23:39 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[技术收集]]></category>
		<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[用户转化]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[网站注册]]></category>
		<category><![CDATA[转化率]]></category>

		<guid isPermaLink="false">http://www.fhand.com/blog/?p=481</guid>
		<description><![CDATA[用户转化率，可以说是任何一个信息填写类网站的灵魂，这儿的信息可以是用户由访客变成真实用户，也可以是一些增值类业务用户手机号码验证码确认码的输入，等等的。面对同一个产品，一个精心设计的网站，1000个IP可能会带来10个有效的转换，而不注重转换率的页面，1000个IP可能产生不了一个有效用户。 1、做到真正以客户为中心的网站设计，产品、美工、技术等不能代表客户，当一个站点页面，一个业务流程设计好以后，有条件的话，最好的方法，是选择针对性的客户进行试用并提出意见：自己的观点，只代表你自己的认识，并不能代表客户的感受。如果做不到这点，就要用数据来说话，通过把不同风格，甚至文字提示信息的修改，都要测试一段时间，用数据来做对比，然后慢慢调优，这种改动不易过大，整版风格的改变，一般情况下对用户的转化率没有多大的帮助，而且数据的返回结果往往会对业务人员产生错误的指导方向。一个不错的创意，可能就因为一点的瑕疵，而被抛弃，这种应该尽可能的避免。 2、用户的体验。个人感觉用户的体验是最最重要的，在没有十足把握的情况下，不要修改网站既有的体验流程。要考虑到老用户的使用感受。一个很明显的例子，就是本来很早的时候我是用msn来写日记的，但是自从某次改版之后，变得十分的“恶心”，偌大的广告，巨慢无比的页面载入速度，结果可想而之，就是我另寻它山了。这种情况下，建议搞一种新版和旧版可以来回切换的功能比较好，习惯了老格局，老模式的用户可以继续使用。新用户可以引导着使用新的流程。对于内容提供方来说，最起码的就要保证页面在主流浏览器，主流分辨率下页面布局效果都要保持一致。实际上，就是IE(70%+) 和 Firefox(20%)，其中ie中主要是ie7(45%)和ie6(25%)，这部分主要由切页面的美工来保证效果，技术人员一般是不会去顾及的，笔者有两台机器，恰好一个是ie7，一个是用ie6,在做的几个页面中发现或多或少的都会有表格，文本域对不齐的情况发生。 3、现在来看下用户注册过程中的三个困扰： a, 用户不知道给了你他们的个人信息，换回来什么好处 [注册后，输入邮箱密码导入用户] b, 信息受挑战，要求填写太少，太多或不正确的信息 c，用户还没有建立信任，更不知道注册后会有什么的预期效果 个人之见，在需要用户转化的着陆页中，减少用户可选择点击的选项，减少用户对内容选择作决定，尽量减化流程。如果确实需要提供第二个选项，可将它放在网页的下端位置，防止用户从注册界面中分散注意力，因此通过减少干扰选项来提高网站的转化率。 但是，光秃秃的业务转化流程，显然效果也好不到哪儿去。用户在注册时，应该能看到我注册能干嘛，我为啥要输入详细的个人资料。这是一个冲突，这中间的，文字图片，应该摆放多少，摆放在哪儿？应该还是靠上面1的数据来说了算比较好，呵呵。]]></description>
			<content:encoded><![CDATA[<p>   用户转化率，可以说是任何一个信息填写类网站的灵魂，这儿的信息可以是用户由访客变成真实用户，也可以是一些增值类业务用户手机号码验证码确认码的输入，等等的。面对同一个产品，一个精心设计的网站，1000个IP可能会带来10个有效的转换，而不注重转换率的页面，1000个IP可能产生不了一个有效用户。 </p>
<p>1、做到真正以客户为中心的网站设计，产品、美工、技术等不能代表客户，当一个站点页面，一个业务流程设计好以后，有条件的话，最好的方法，是选择针对性的客户进行试用并提出意见：自己的观点，只代表你自己的认识，并不能代表客户的感受。如果做不到这点，就要用数据来说话，通过把不同风格，甚至文字提示信息的修改，都要测试一段时间，用数据来做对比，然后慢慢调优，这种改动不易过大，整版风格的改变，一般情况下对用户的转化率没有多大的帮助，而且数据的返回结果往往会对业务人员产生错误的指导方向。一个不错的创意，可能就因为一点的瑕疵，而被抛弃，这种应该尽可能的避免。 </p>
<p>2、用户的体验。个人感觉用户的体验是最最重要的，在没有十足把握的情况下，不要修改网站既有的体验流程。要考虑到老用户的使用感受。一个很明显的例子，就是本来很早的时候我是用msn来写日记的，但是自从某次改版之后，变得十分的“恶心”，偌大的广告，巨慢无比的页面载入速度，结果可想而之，就是我另寻它山了。这种情况下，建议搞一种新版和旧版可以来回切换的功能比较好，习惯了老格局，老模式的用户可以继续使用。新用户可以引导着使用新的流程。对于内容提供方来说，最起码的就要保证页面在主流浏览器，主流分辨率下页面布局效果都要保持一致。实际上，就是IE(70%+) 和 Firefox(20%)，其中ie中主要是ie7(45%)和ie6(25%)，这部分主要由切页面的美工来保证效果，技术人员一般是不会去顾及的，笔者有两台机器，恰好一个是ie7，一个是用ie6,在做的几个页面中发现或多或少的都会有表格，文本域对不齐的情况发生。 </p>
<p>3、现在来看下用户注册过程中的三个困扰： </p>
<p>a, 用户不知道给了你他们的个人信息，换回来什么好处  [注册后，输入邮箱密码导入用户]<br />
b, 信息受挑战，要求填写太少，太多或不正确的信息<br />
c，用户还没有建立信任，更不知道注册后会有什么的预期效果</p>
<p>个人之见，在需要用户转化的着陆页中，减少用户可选择点击的选项，减少用户对内容选择作决定，尽量减化流程。如果确实需要提供第二个选项，可将它放在网页的下端位置，防止用户从注册界面中分散注意力，因此通过减少干扰选项来提高网站的转化率。 但是，光秃秃的业务转化流程，显然效果也好不到哪儿去。用户在注册时，应该能看到我注册能干嘛，我为啥要输入详细的个人资料。这是一个冲突，这中间的，文字图片，应该摆放多少，摆放在哪儿？应该还是靠上面1的数据来说了算比较好，呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fhand.com/blog/archives/481.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

