<?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>科技博</title>
	<atom:link href="http://kejibo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://kejibo.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Dec 2011 13:39:21 +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>chrome安装插件时显示Package is invalid: &#8216;CRX_SIGNATURE_VERIFICATION_FAILED&#8217;问题的解决方法。</title>
		<link>http://kejibo.com/chrome-extension-package-is-invalid-crx_signaturature_verification_faile/</link>
		<comments>http://kejibo.com/chrome-extension-package-is-invalid-crx_signaturature_verification_faile/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 01:12:17 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
				<category><![CDATA[使用技巧]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://kejibo.com/?p=10702</guid>
		<description><![CDATA[Google Reader G+化改版后，颜色更单一，更刺眼了，对于重度使用者来说这非常伤眼睛，而今天正好发现出了一个 Reeder for Chrome 的插件。当然不能错过了。这其实只是GR的皮肤，原GR的功能都是完整的。 但是进入网站安装的时候发现提示 原以为可能是新出的插件不适合老版本chrome使用，于是将浏览器升级chrome 16 beta（也正好想体验一下它的多用户功能）。但是重试后发现问题还是一样。 搜索一翻后在code.google上找到问题的原因居然是没有清缓存引起的，于是清缓存，安装一切正常。]]></description>
			<content:encoded><![CDATA[<p>Google Reader G+化改版后，颜色更单一，更刺眼了，对于重度使用者来说这非常伤眼睛，而今天正好发现出了一个 <a href="http://reederforchrome.tumblr.com/" title="Reeder for Chrome">Reeder for Chrome</a> 的插件。当然不能错过了。这其实只是GR的皮肤，原GR的功能都是完整的。</p>
<p>但是进入网站安装的时候发现提示<br />
<a href="http://kejibo.com/wp-content/uploads/2011/11/chrome-crx_signaturature_verification_failed.jpg"><img src="http://kejibo.com/wp-content/uploads/2011/11/chrome-crx_signaturature_verification_failed-300x40.jpg" alt="" title="chrome-crx_signaturature_verification_failed" class="alignnone size-medium wp-image-10703" /></a></p>
<p>原以为可能是新出的插件不适合老版本chrome使用，于是将浏览器升级chrome 16 beta（也正好想体验一下它的多用户功能）。但是重试后发现问题还是一样。</p>
<p>搜索一翻后在code.google上找到问题的原因居然是没有清缓存引起的，于是清缓存，安装一切正常。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/chrome-extension-package-is-invalid-crx_signaturature_verification_faile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>typecho转换到wordpress</title>
		<link>http://kejibo.com/typecho2wordpress/</link>
		<comments>http://kejibo.com/typecho2wordpress/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 07:16:45 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[typecho]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://kejibo.com/?p=10691</guid>
		<description><![CDATA[typecho快一年多没有更新过了，虽然使用感觉还算不错，不过还是经不住wordpress庞大插件库的诱惑，因为博客本来就没有多少流量，所以也不担心负载的问题，所以就把博客转换到wordpress了。特此做一记录。 使用的转换程序都是网上找的。 转换程序适合：typecho0.8 (10.8.15)到wordpress3.03版本。 typecho2wordpress WordPress.v3.0.3.Incl.Simp.Chinese.Pack.v1-wpcng 可转换内容： 1、博客 2、附件 3、评论 4、分类 5、标签 转换步骤： 1、在原typecho博客的主机上安装wordpress3.03版本。 2、上传typecho2wordpress转换程序，开始转换。 3、转换完后，将原typecho里面的 /usr/uploads下面的附件放到 wordpress的 /wp-content/uploads 里面。 转换后残留问题： 1、打开wordpress的媒体库，看不到图片，这是因为转换程序将附件记录的里面 post_status 没有设置成 inherit.将 post_type为attachment的posts的post_status属性改为 inherit。 2、博客文章里面的图片及附件链接没有更新，比如typecho附件的图地址为/attachment/id 图片地址为 /usr/uploads/*** 需要更新为wordpress的 /wp-content/uploads/*** 于花了一点时间稍微修改了一下转换程序： typecho2wordpress-kejibo 使用前请自行备份数据库，如果造成任何损失，本人概不负责！ 成功转换到 wordpress3.03后，通过wordpress后台自动更新到wodpress最新版本3.21完全没有问题。]]></description>
			<content:encoded><![CDATA[<p>typecho快一年多没有更新过了，虽然使用感觉还算不错，不过还是经不住wordpress庞大插件库的诱惑，因为博客本来就没有多少流量，所以也不担心负载的问题，所以就把博客转换到wordpress了。特此做一记录。<br />
使用的转换程序都是网上找的。<br />
转换程序适合：typecho0.8 (10.8.15)到wordpress3.03版本。<br />
<a href='http://kejibo.com/wp-content/uploads/2011/10/typecho2wordpress.zip'>typecho2wordpress</a><br />
<a href='http://kejibo.com/wp-content/uploads/2011/10/WordPress.v3.0.3.Incl_.Simp_.Chinese.Pack_.v1-wpcng.zip'>WordPress.v3.0.3.Incl.Simp.Chinese.Pack.v1-wpcng</a><br />
可转换内容：<br />
1、博客<br />
2、附件<br />
3、评论<br />
4、分类<br />
5、标签<br />
转换步骤：<br />
1、在原typecho博客的主机上安装wordpress3.03版本。<br />
2、上传typecho2wordpress转换程序，开始转换。<br />
3、转换完后，将原typecho里面的 /usr/uploads下面的附件放到 wordpress的 /wp-content/uploads 里面。</p>
<p>转换后残留问题：<br />
1、打开wordpress的媒体库，看不到图片，这是因为转换程序将附件记录的里面 post_status 没有设置成 inherit.将 post_type为attachment的posts的post_status属性改为 inherit。<br />
2、博客文章里面的图片及附件链接没有更新，比如typecho附件的图地址为/attachment/id 图片地址为 /usr/uploads/*** 需要更新为wordpress的 /wp-content/uploads/***</p>
<p>于花了一点时间稍微修改了一下转换程序：<br />
<a href='http://kejibo.com/wp-content/uploads/2011/10/typecho2wordpress-kejibo.7z'>typecho2wordpress-kejibo</a><br />
使用前请自行备份数据库，如果造成任何损失，本人概不负责！<br />
成功转换到 wordpress3.03后，通过wordpress后台自动更新到wodpress最新版本3.21完全没有问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/typecho2wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XZ压缩最新压缩率之王</title>
		<link>http://kejibo.com/xz-compresser/</link>
		<comments>http://kejibo.com/xz-compresser/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 15:19:34 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
				<category><![CDATA[tar.xz创建]]></category>
		<category><![CDATA[tar.xz解压]]></category>
		<category><![CDATA[xz压缩]]></category>
		<category><![CDATA[xz解压缩]]></category>
		<category><![CDATA[压缩]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[xz这个压缩可能很多都很陌生，不过您可知道xz是绝大数linux默认就带的一个压缩工具。 之前xz使用一直很少，所以几乎没有什么提起。 我是在下载phpmyadmin的时候看到这种压缩格式的，phpmyadmin压缩包xz格式的居然比7z还要小，这引起我的兴趣。 最新一段时间会经常听到xz被采用的声音，像是最新的archlinux某些东西就使用xz压缩。不过xz也有一个坏处就是压缩时间比较长，比7z压缩时间还长一些。不过压缩是一次性的，所以可以忽略。 xz压缩文件方法或命令 xz -z 要压缩的文件 如果要保留被压缩的文件加上参数 -k ，如果要设置压缩率加入参数 -0 到 -9调节压缩率。如果不设置，默认压缩等级是6. xz解压文件方法或命令 xz -d 要解压的文件 同样使用 -k 参数来保留被解压缩的文件。 创建或解压tar.xz文件的方法 习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar.xz也会想用单一命令搞定解压或压缩。其实不行 tar里面没有征对xz格式的参数比如 z是针对 gzip，j是针对 bzip2。 创建tar.xz文件：只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先，然后使用 &#8230; <a href="http://kejibo.com/xz-compresser/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
	xz这个压缩可能很多都很陌生，不过您可知道xz是绝大数linux默认就带的一个压缩工具。
</p>
<p>
	之前xz使用一直很少，所以几乎没有什么提起。
</p>
<p>
	我是在下载phpmyadmin的时候看到这种压缩格式的，phpmyadmin压缩包xz格式的居然比7z还要小，这引起我的兴趣。
</p>
<p>
	最新一段时间会经常听到xz被采用的声音，像是最新的archlinux某些东西就使用xz压缩。不过xz也有一个坏处就是压缩时间比较长，比7z压缩时间还长一些。不过压缩是一次性的，所以可以忽略。
</p>
<h3>
	xz压缩文件方法或命令<br />
</h3>
<p>
	xz -z 要压缩的文件
</p>
<p>
	如果要保留被压缩的文件加上参数 -k ，如果要设置压缩率加入参数 -0 到 -9调节压缩率。如果不设置，默认压缩等级是6.
</p>
<h3>
	xz解压文件方法或命令<br />
</h3>
<p>
	xz -d 要解压的文件
</p>
<p>
	同样使用 -k 参数来保留被解压缩的文件。
</p>
<h3>
	创建或解压tar.xz文件的方法<br />
</h3>
<p>
	习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar.xz也会想用单一命令搞定解压或压缩。其实不行 tar里面没有征对xz格式的参数比如 z是针对 gzip，j是针对 bzip2。
</p>
<p>
	创建tar.xz文件：只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先，然后使用 xz -z xxx.tar 来将 xxx.tar压缩成为 xxx.tar.xz
</p>
<p>
	解压tar.xz文件：先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后，再用 tar xvf xxx.tar来解包。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/xz-compresser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>oauth2开放认证协议原理及案例分析</title>
		<link>http://kejibo.com/oauth2/</link>
		<comments>http://kejibo.com/oauth2/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 10:58:02 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
				<category><![CDATA[oauth2]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[之前翻译过一篇 OAuth认证协议原理分析及使用方法 ，虽然 OAuth2还没有正式发布，但是国内外的OAuth2的采用情况几乎要完全替代掉OAuth1.1了。像淘宝、腾讯、人人网、百度开放平台就已经采用Oauth2，新浪微博也发来邮件说是要很快上马OAuth2，彻底替换掉OAuth1.1。目前OAuth2到了 v20草稿阶段 ，最新的版本是 2011年7月25号发布的，协议变化还是很快的，所以看到国内的一些已经实现的实例，再比照官方的 oauth2，会有些出入的。 为何要 OAuth2来替换OAuth1.1？ 一、OAuth2大大简化了认证流程，OAuth1版本，我都感觉有些流程设计不是为安全性而存在，有些东西很难想一个理由，他们为何要弄得如此复杂。复杂可能是增加安全性的一个要素，但是也极大增加了开发者的开发难度。 二、增加了对多种不同方式的认证，原来的认证只能直接或间接通过浏览器，现在有专门的标准来给客户端程序、移动应用、浏览器应用提供认证的方法。 OAuth2的四种角色 resource owner资源所有者：比如twitter用户，他在twitter的数据就是资源，他自己就是这些资源的所有者。 resource server资源服务器：保存资源的服务器，别人要访问受限制的资源就要出示 Access Token（访问另牌）。 client客户端：一个经过授权后，可以代表资源所有者访问资源服务器上受限制资源的一方。比如 开发者开发的应用。 authorization server授权服务器：对 资源所有者进行认证，认证通过后，向 客户端发放 Access Token（访问另牌）。 OAuth2取得Access Token的四种方式 一、Authorization Code授权码方式：这种是推荐使用的，也是最安全的，也是替换OAuth1.1的一种授权方式。 流程： 1、引导用户访问授权服务器，比如地址： GET /authorize?response_type=code&#038;client_id=s6BhdRkqt3&#038;state=xyz &#038;redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com ，其中response_type &#8230; <a href="http://kejibo.com/oauth2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
	之前翻译过一篇 <a href="OAuth认证协议原理分析及使用方法"><br />
		OAuth认证协议原理分析及使用方法<br />
	</a>，虽然 OAuth2还没有正式发布，但是国内外的OAuth2的采用情况几乎要完全替代掉OAuth1.1了。像淘宝、腾讯、人人网、百度开放平台就已经采用Oauth2，新浪微博也发来邮件说是要很快上马OAuth2，彻底替换掉OAuth1.1。目前OAuth2到了<a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-20"><br />
		v20草稿阶段<br />
	</a>，最新的版本是 2011年7月25号发布的，协议变化还是很快的，所以看到国内的一些已经实现的实例，再比照官方的 oauth2，会有些出入的。
</p>
<h3>
	为何要 OAuth2来替换OAuth1.1？<br />
</h3>
<ul>
<li>
		一、OAuth2大大简化了认证流程，OAuth1版本，我都感觉有些流程设计不是为安全性而存在，有些东西很难想一个理由，他们为何要弄得如此复杂。复杂可能是增加安全性的一个要素，但是也极大增加了开发者的开发难度。
	</li>
<li>
		二、增加了对多种不同方式的认证，原来的认证只能直接或间接通过浏览器，现在有专门的标准来给客户端程序、移动应用、浏览器应用提供认证的方法。
	</li>
</ul>
<h3>
	OAuth2的四种角色<br />
</h3>
<ul>
<li>
		resource owner资源所有者：比如twitter用户，他在twitter的数据就是资源，他自己就是这些资源的所有者。
	</li>
<li>
		resource server资源服务器：保存资源的服务器，别人要访问受限制的资源就要出示 Access Token（访问另牌）。
	</li>
<li>
		client客户端：一个经过授权后，可以代表资源所有者访问资源服务器上受限制资源的一方。比如 开发者开发的应用。
	</li>
<li>
		authorization server授权服务器：对 资源所有者进行认证，认证通过后，向 客户端发放 Access Token（访问另牌）。
	</li>
</ul>
<h3>
	OAuth2取得Access Token的四种方式<br />
</h3>
<ul>
<li>
		一、Authorization Code授权码方式：这种是推荐使用的，也是最安全的，也是替换OAuth1.1的一种授权方式。<br />
流程：<br />
1、引导用户访问授权服务器，比如地址： </p>
<pre class="brush: c">
    GET /authorize?response_type=code&#038;client_id=s6BhdRkqt3&#038;state=xyz
        &#038;redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com
</pre>
<p>  ，其中response_type 值固定为 code，client_id就是客户端申请开发者的时候取得的 appkey，state是一个可选参数，可以用于保存客户端在引导用户转向前的一些状态，当回到 redirect_uri的时候会原封不动的传回来，redirect_uri是当用户确认授权应用访问的时候跳转回来的地址。<br />
2，用户同意授权后跳转回来的的地址如：</p>
<pre class="brush: c">
     HTTP/1.1 302 Found
     Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
               &#038;state=xyz
</pre>
<p>               &#038;state=xyz ，其中 code就是 Authorization Code，state就是上面所说的可选参数。<br />
3，使用取得的 Authorization Code去换取Access Token：</p>
<pre class="brush: c">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8

     =authorization_code&#038;code=SplxlOBeZQQYbYS6WxSbIA
     &#038;redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
</pre>
<p>其中 Authorization是由Client id(app key)及Client password(app secret)组合成的 http basic 验证字符串，grant_type必须为 authorization_code，code是上一步取得的 Authorization Code，redirect_uri是完成后跳转回来的网址。<br />
如果Client不能发送 Authorization信息，则可以使用下面的方式，/token这个地址必须是 https连接的，不然就有泄露 client secret的可能性：</p>
<pre class="brush: c">
     POST /token HTTP/1.1
     Host: server.example.com
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8

     grant_type=refresh_token&#038;refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
     &#038;client_id=s6BhdRkqt3&#038;client_secret=7Fjfp0ZBr1KtDRbnfVdmIw
</pre>
<p>成功的话返回的信息为：</p>
<pre class="brush: c">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }
</pre>
</li>
<li>
		二、Implicit Grant隐式授权：相比授权码授权，隐式授权少了第一步的取Authorization Code的过程，而且不会返回 refresh_token。主要用于无服务器端的应用，比如 浏览器插件。隐式授权不包含Client授权，它的授权依赖于 资源所有者及注册应用时候所填写的redirection URI（跳转地址）。因为Access token是附着在 redirect_uri 上面被返回的，所以这个 Access token就可能会暴露给 资源所有者或者设置内的其它方（对资源所有者来说，可以看到redirect_uri，对其它方来说，可以通过监测浏览器的地址变化来得到 Access token）。<br />
流程<br />
一、引导用户访问一个专门的授权页面，如</p>
<pre class="brush: c">
    GET /authorize?response_type=token&#038;client_id=s6BhdRkqt3&#038;state=xyz
        &#038;redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com
</pre>
<p>这里的 response_type为 token，client_id为appkey。可以看到这里取Access token的过程中并没有像 第一种方式那样传入 client_secret。因为如果你传入 client_secret，其实就是相当于告诉用户，你应用的app secret了。<br />
二、在成功授权后，跳转回到 redirect_uri所定义的网址</p>
<pre class="brush: c">
     HTTP/1.1 302 Found
     Location: http://example.com/rd#access_token=2YotnFZFEjr1zCsicMWpAA
               &#038;state=xyz&#038;token_type=example&#038;expires_in=3600
</pre>
<p>，这样应用就可以通过取地址中的 fragment部分来取得 access token。
	</li>
<li>
		三、Resource Owner Password Credentials资源所有者密码证书授权：这种验证主要用于资源所有者对Client有极高的信任度的情况，比如操作系统或高权限程序。只有在不能使用其它授权方式的情况下才使用这种方式。<br />
流程：<br />
一、提交信息到取 token页面</p>
<pre class="brush: c">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8

     grant_type=password&#038;username=johndoe&#038;password=A3ddj3w
</pre>
<p>这里的 Authorization是 client_id为username，client_secret为password的http basic验证码。grant_type必须为 password，username为用户名，password为用户密码。<br />
取得的结果如下：</p>
<pre class="brush: c">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }
</pre>
<p>Q:为何要这种这么不安全的方式？<br />
A:取代原来原始的 username，password的授权方式，而且不需要 client保存用户的密码，client只要保存access token就可以。主要用于客户端程序。
	</li>
<li>
		四、Client Credentials客户端证书授权：这种情况下 Client使用自己的 client证书（如 client_id及client_secret组成的 http basic验证码）来获取 access token，只能用于信任的client。<br />
流程：<br />
一、提交参数取 access token</p>
<pre class="brush: c">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded;charset=UTF-8

     grant_type=client_credentials
</pre>
<p>其中 Authorization是client_id及client_secret组成的 http basic验证串。grant_type必须为client_credentials，<br />
返回如下：</p>
<pre class="brush: c">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "example_parameter":"example_value"
     }
</pre>
</li>
</ul>
<h3>
	国内一些oauth2案例分析<br />
</h3>
<p>
	标准的 oauth2中，使用 access token来向资源服务器发出请求，取得资源。这里的资源服务器需要使用 https协议，否则access token极可能被其它方获取。比如</p>
<pre class="brush: c">
     GET /resource/1 HTTP/1.1
     Host: example.com
     Authorization: Bearer 7Fjfp0ZBr1KtDRbnfVdmIw
</pre>
<p><a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-20#ref-I-D.ietf-oauth-v2-bearer"><br />
	bearer是指 token类型<br />
</a>，后面的字符串就是access token。还有一种 <a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-20#ref-I-D.ietf-oauth-v2-http-mac"><br />
	mac类型的 token（目前v20版本的草稿里还没有文档）<br />
</a>，如：</p>
<pre class="brush: c">
     GET /resource/1 HTTP/1.1
     Host: example.com
     Authorization: MAC id="h480djs93hd8",
                        nonce="274312:dj83hs9s",
                        mac="kDZvddkndxvhGRXZhvuDjEWhGeE="
</pre>
<p>，因为 https速度相较http慢，而且并非所有服务器或客户都支持https，所以国内一些网站采用一种http也可访问资源的方式。
</p>
<p>
	<a href="http://open.taobao.com/dev/index.php/OAuth2.0%E7%94%A8%E6%88%B7%E9%AA%8C%E8%AF%81%E6%8E%88%E6%9D%83%E6%8E%A5%E5%85%A5%E6%B5%81%E7%A8%8B"><br />
		淘宝开放平台的方式<br />
	</a>：应用通过用户授权获取的AccessToken的值即等同于Sessionkey，应用凭借AccessToken调用taobao API即可。查看淘宝SDK，可以看到 其使用应用的app_secret作用密码钥来进行签名，参数里面包含了 这个Sessionkey，这样淘宝在收到这个请求的时候，根据 app_id来判断是哪个应用，根本sessionkey的值来判断是哪个用户，如果不传这个 sessionkey就用 app_id查得app_id所属的淘宝用户就行了。也就是说 sessionkey必须配合 这个 client自己的授权资料appkey appsrecet来访问资源。
</p>
<p>
	<a href="http://dev.baidu.com/wiki/connect/index.php?title=Open_API_2.0_%E6%96%87%E6%A1%A3"><br />
		百度开放平台方式<br />
	</a>、<a href="http://wiki.dev.renren.com/wiki/Friends.areFriends"><br />
		人人网方式<br />
	</a>、还有腾讯也类似：在返回 access token的同时返回 sessionKey及sessionSecret。如：</p>
<pre class="brush: c">
{
    "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
    "expires_in": 86400,
    "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
    "scope": "basic email",
    "session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=",
    "session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6",
}
</pre>
<p>在调用资源API的时候，如下：</p>
<pre class="brush: c">
GET /rest/2.0/passport/users/getInfo?session_key=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A%3D&#038;timestamp=2011-06-21+17%3A18%3A09&#038;format=json&#038;uid=67411167&#038;sign=d24dd357a95a2579c410b3a92495f009 HTTP/1.1
Host: api.example.com
</pre>
<p>这里参数里面的 session_key，传给服务器后，用户查询 session_secret，sign使用session_secret作为密钥来加密的。可以看到这里调用的时候没有使用 client_id或client_secret信息，所以对于任何获取</p>
<pre class="brush: c">
    "session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=",
    "session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6",
</pre>
<p>的一方都可以调用到API。降低系统耦合度。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/oauth2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Golang跟C语言一样没有C++所特有引用参数概念</title>
		<link>http://kejibo.com/golang-no-reference-parameter/</link>
		<comments>http://kejibo.com/golang-no-reference-parameter/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 22:52:52 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[看一下C++的引用参数： #include void test(int &#038;x) //引用参数 { x = 99; } int main() { int a = 1; test(a); printf("%c", a); return 0; } 纯C中如果想实现这种函数内对外部传入参数值的修改，只能这样： #include void test(int* x) //指针参数 { *x = 99; } int main() { int a &#8230; <a href="http://kejibo.com/golang-no-reference-parameter/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
看一下C++的引用参数：</p>
<pre class="brush: c">
#include <stdio.h>

void test(int &#038;x)  //引用参数
{
    x = 99;
}

int main()
{
    int a = 1;
    test(a);
    printf("%c", a);
    return 0;
}
</pre>
</p>
<p>
纯C中如果想实现这种函数内对外部传入参数值的修改，只能这样：</p>
<pre class="brush: c">
#include <stdio.h>

void test(int* x)   //指针参数
{
    *x = 99;
}

int main()
{
    int a = 1;
    test(&#038;a);
    printf("%c", a);
    return 0;
}
</pre>
</p>
<p>
Go语言也像C一样，没有引用参数的概念：</p>
<pre class="brush: c">
package main

func test(x *int) {  //指针参数
	*x = 99
}

func main() {
	a := 1
	test(&#038;a)
	println(a)
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/golang-no-reference-parameter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Golang使用swig包装C/C++程序为Go包 For Windows</title>
		<link>http://kejibo.com/golang-swig-c-cpp/</link>
		<comments>http://kejibo.com/golang-swig-c-cpp/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 19:41:06 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[swig不能直接使用官方的程序，而必须打一个patch 后才能使用。svn下载swig源代码后（看版本号应该是2.0.5了），打上 swig_go_windows2.patch 这个patch。至于怎么打patch，请自行Google之。 swig的编译也是比较折腾的。因为他依赖 yodl2man yodl2html这东西，而这东西又依赖 icmake，不过后来发现这东西不要也行，虽然 swig在 make install的时候没有完全结束，但是生成的东西，已经够用了。 把C写的库包装为 GO包。 首先需要准备两个文件 test.i test.c $ cat test.c #include double MyVar = 3.0; int Fact(int n) { if (n]]></description>
			<content:encoded><![CDATA[<p>
	swig不能直接使用官方的程序，而必须打一个patch 后才能使用。svn下载swig源代码后（看版本号应该是2.0.5了），打上 <a href="https://groups.google.com/forum/?hl=en#!searchin/golang-nuts/swig/golang-nuts/9L0U4Q7AtyE/eUGqwDHOPUgJ"><br />
		swig_go_windows2.patch<br />
	</a> 这个patch。至于怎么打patch，请自行Google之。
</p>
<p>
	swig的编译也是比较折腾的。因为他依赖 yodl2man yodl2html这东西，而这东西又依赖 icmake，不过后来发现这东西不要也行，虽然 swig在 make install的时候没有完全结束，但是生成的东西，已经够用了。
</p>
<p>
	把C写的库包装为 GO包。
</p>
<p>
	首先需要准备两个文件 test.i test.c
</p>
<pre class="brush: c">
$ cat test.c
#include <time.h>
double MyVar = 3.0;

int Fact(int n) {
    if (n <= 1) return 1;
    else return n * Fact(n-1);
}

int MyMod(int x, int y) {
    return (x % y);
}

char *GetTime() {
    time_t ltime;
    time(&#038;ltime);
    return ctime(&#038;ltime);
}

$ cat test.i
%module test
%{
    extern double MyVar;
    extern int Fact(int n);
    extern int MyMod(int x, int y);
    extern char *GetTime();
%}

extern double MyVar;
extern int Fact(int n);
extern int MyMod(int x, int y);
extern char *GetTime();
</pre>
<p>
	需要注意的是 C中的如果要想在Go中可以调用 ，首字母必须要 大写。开始 swig
</p>
<pre class="brush: c">
//初始
$ ls
test.i test.c
//使用swig生成需要的文件
$ swig -go -windows test.i
$ ls
test.c  test.go  test.i  test_dllmain.cxx  test_gc.c  test_wrap.c
//分别编译 test.c test_wrap.c test_dllmain.cxx 为目标文件 *.o
$ gcc -c test.c test_wrap.c test_dllmain.cxx
//将上一步编译的结果链接成一个动态链接库
$ gcc -shared test.o test_wrap.o test_dllmain.o -o test.dll
//编译 test.go
$ 8g test.go
//编译 test_gc.c
$ 8c -I "go的pkg目录" test_gc.c
//将test.8 test_gc.8 打包成go库，就是一个静态库，相当于gcc里面使用 ar 命令打包一样。
$ gopack grc test.a test.8 test_gc.8
</pre>
<p>
	至此万事俱备了。写个go 程序来试试。
</p>
<pre class="brush: c">
$ cat main.go
package main

import "./test"
import "fmt"

func main() {
    println(test.Fact(5))
    //println(test.MyVar)   //不能直接调用必须使用 getter setter来调用如下
    test.SetMyVar(99)      //来设置 MyVar的值
    fmt.Printf("%f
", test.GetMyVar())   //取得刚设置的值。
    println(test.MyMod(10, 3))
    println(test.GetTime())
}

$ 8g main.go
$ 8l main.8
$ ./8.out.exe
120
1
Thu Jun 23 04:06:40 2011
</pre>
<p>
	现在把 test.dll改名，看看这个程序是不是真调用 了这个动态链接库。
</p>
<p>
	如果要在其它地方使用只需要 test.a 及 test.dll 两个文件 。。test.a就是go的库，这是魔法所在，就是这样东西负责调用 C里面的函数。。因为Go是静态编译，所以编译好的Go程序就不需要 test.a这东西了，只要test.dll带上就行了。。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/golang-swig-c-cpp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>编译好的Go-GTK包及相关gtk依赖 for Windows</title>
		<link>http://kejibo.com/go-gtk-windows-binary/</link>
		<comments>http://kejibo.com/go-gtk-windows-binary/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 18:02:39 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
				<category><![CDATA[在线应用]]></category>
		<category><![CDATA[Go-GTK]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[到gtk官方下载 打包好的 windows gtk bundle all-in-one包。解压后 把在本站下载的 gtk+-bundle_2.22.1.7z 解压覆盖到里面，其实只是解决 gtksourceview及libxml2的依赖。 把 go-gtk.7z 解压放到你的 go pkg库目录下。 注：本人使用的是 mingw环境。 8g version weekly.2011-06-16 8787 go-gtk 最新git下载的 revision：1193a0044982261ccf04805ff36e11002d368ad7 go-gtk.7z gtk+-bundle_2.22.1.7z 更新go 8g version release.r59 9087编译的版本：go-gtk-r59.tar.xz]]></description>
			<content:encoded><![CDATA[<p><a title="go-gtk.png" href="http://kejibo.com/wp-content/uploads/2011/06/1134658381.png"><img src="http://kejibo.com/wp-content/uploads/2011/06/1134658381.png" alt="go-gtk.png" /></a></p>
<p>到gtk官方下载 打包好的 windows gtk bundle all-in-one包。解压后 把在本站下载的 gtk+-bundle_2.22.1.7z 解压覆盖到里面，其实只是解决 gtksourceview及libxml2的依赖。</p>
<p>把 go-gtk.7z 解压放到你的 go pkg库目录下。</p>
<p>注：本人使用的是 mingw环境。<br />
8g version weekly.2011-06-16 8787<br />
go-gtk 最新git下载的 revision：1193a0044982261ccf04805ff36e11002d368ad7</p>
<p><a title="go-gtk.7z" href="http://kejibo.com/wp-content/uploads/2011/06/1184513864.7z">go-gtk.7z</a></p>
<p><a title="gtk+-bundle_2.22.1.7z" href="http://kejibo.com/wp-content/uploads/2011/06/3993601277.7z">gtk+-bundle_2.22.1.7z</a></p>
<p>更新go 8g version release.r59 9087编译的版本：<a title="go-gtk-r59.tar.xz" href="http://kejibo.com/wp-content/uploads/2011/08/1968650078.xz">go-gtk-r59.tar.xz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/go-gtk-windows-binary/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Golang Go语言 container/ring闭环数据结构的使用方法</title>
		<link>http://kejibo.com/golang-container-ring/</link>
		<comments>http://kejibo.com/golang-container-ring/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 20:49:49 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[//引入包 import "container/ring" //创建闭环，这里创建10个元素的闭环 r := ring.New(10) //给闭环中的元素附值 for i := 1; i]]></description>
			<content:encoded><![CDATA[<pre class="brush: c">
//引入包
import "container/ring"
//创建闭环，这里创建10个元素的闭环
r := ring.New(10)
//给闭环中的元素附值
for i := 1; i <= r.Len(); i++ {
    r.Value = i
    r = r.Next()
}
//循环打印闭环元素的值，这里的操作方法很像javascript
r.Do(func(p interface{}){
    println(p)
})
//当前元素就是
// r
//当前元素的值就是
// r.Value       //这里是 1
//取得当前元素之后的第5个元素
r5 := r.Move(5)    //这里是 6
//链接 当前元素r与r5，相当于删除了r跟r5之间的元素，使 r.Next() == r5
rl := r.Link(r5)  //这样 r环里有 1 6 7 8 9 10
                    //rl 环路里有  2 3 4 5 

//把rl环加回到 r环原来的位置
//要确保r的当前位置是 1，rl的当前位置为2
rf := r.Link(rl)
//这样 r就变回了 1 2 3 4 5 6 7 8 9 10
//rf则是 从 rl.Next()开始环，内容则与 r的一样。
//6 7 8 9 10 1 2 3 4 5
另外做过一次 Do()循环操作后 闭环的当前位置不变。
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/golang-container-ring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Golang Go语言插入排序</title>
		<link>http://kejibo.com/golang-insert-sort/</link>
		<comments>http://kejibo.com/golang-insert-sort/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 20:48:15 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[package main //插入排序 func main() { a := []int{5, 4, 3, 2, 1} for i := 1; i < len(a); i++ { temp := a[i] j := i - 1 for j >= 0 &#038;&#038; a[j] > temp { a[j &#8230; <a href="http://kejibo.com/golang-insert-sort/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<pre class="brush: c">
package main 

//插入排序
func main() {
    a := []int{5, 4, 3, 2, 1}
    for i := 1; i < len(a); i++ {
        temp := a[i]
        j := i - 1
        for j >= 0 &#038;&#038; a[j] > temp {
            a[j + 1] = a[j]
            j--
        }
        a[j + 1] = temp
    }
    for _, v := range a {
        println(v)
    }
}
</pre>
<p>
	原理就是依顺找到每个元素在己排充部分中自己的位置，并插入。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/golang-insert-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Golang Go语言希尔排序</title>
		<link>http://kejibo.com/golang-shell-sort/</link>
		<comments>http://kejibo.com/golang-shell-sort/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 20:47:00 +0000</pubDate>
		<dc:creator>kejibo</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[package main //希尔排序 func main() { a := []int{5, 4, 3, 2, 1} gap := 0 for gap * 3 + 1 < len(a) { gap = gap * 3 + 1 } for gap > 0 { //分段 for &#8230; <a href="http://kejibo.com/golang-shell-sort/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<pre class="brush: c">
package main  

//希尔排序
func main() {
    a := []int{5, 4, 3, 2, 1}
    gap := 0
    for gap * 3 + 1 < len(a) {
    gap = gap * 3 + 1
    }
    for gap > 0 {  //分段 

        for i := gap; i < len(a); i++ {   //对分段进行插入排序
            temp := a[i]
            j := i - gap
            for j >= 0 &#038;&#038; a[j] > temp {
                a[j + gap] = a[j]
                j -= gap
            }
            a[j + gap] = temp
        }
        gap = (gap - 1) / 3 

    }
    for _, v := range a {
        println(v)
    }
}
</pre>
<p>
	希尔排序就是分段了的插入排序。最大限度地提高每次对比后元素移动的距离。gap = gap * 3 + 1分隔数由实验取得。如 1 4 13之类。反顺减小到 1。</p>
]]></content:encoded>
			<wfw:commentRss>http://kejibo.com/golang-shell-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  kejibo.com/feed/ ) in 0.28393 seconds, on Feb 22nd, 2012 at 7:22 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 22nd, 2012 at 8:22 pm UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  kejibo.com/feed/ ) in 0.00038 seconds, on Feb 22nd, 2012 at 7:45 pm UTC. -->
