<?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>IdeaForge</title>
	<atom:link href="http://blog.anbutu.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.anbutu.com</link>
	<description>From zero to hero</description>
	<lastBuildDate>Fri, 07 Oct 2011 11:35:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>IconFlow：让应用程序图标流动起来</title>
		<link>http://blog.anbutu.com/ios/mobilesubstrate-plugin-iconflow</link>
		<comments>http://blog.anbutu.com/ios/mobilesubstrate-plugin-iconflow#comments</comments>
		<pubDate>Wed, 24 Aug 2011 13:51:07 +0000</pubDate>
		<dc:creator>liwei</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://blog.anbutu.com/?p=279</guid>
		<description><![CDATA[IconFlow 是一个能够记录应用程序使用次数，并根据你的使用次数自动将图标自动进行排序的插件，它会将你最常用的应用程序排列在最前面。 安装方法： 首先你的iphone需要已经越狱 将 IconFlow 下载到你的iphone中，通过 dpkg 进行安装 可以在Settings中选择是否开启“即时排序”和选择图标文件夹的排序规则。 TODO: 页内排序 重置使用次数统计数据 手工置顶某些图标置顶]]></description>
			<content:encoded><![CDATA[<p>IconFlow 是一个能够记录应用程序使用次数，并根据你的使用次数自动将图标自动进行排序的插件，它会将你最常用的应用程序排列在最前面。</p>
<p>安装方法：</p>
<ol>
<li>首先你的iphone需要已经越狱</li>
<li>将 <a title="IconFlow.deb" href="http://blog.anbutu.com/wp-content/uploads/2011/08/com.anbutu.iconflow_0.0.1-14_iphoneos-arm.deb" target="_blank">IconFlow</a> 下载到你的iphone中，通过 dpkg 进行安装</li>
</ol>
<div>可以在Settings中选择是否开启“即时排序”和选择图标文件夹的排序规则。</div>
<div>TODO:</div>
<div>
<ul>
<li>页内排序</li>
<li>重置使用次数统计数据</li>
<li>手工置顶某些图标置顶</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.anbutu.com/ios/mobilesubstrate-plugin-iconflow/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用 Nginx 搭建 Twitter API 反向代理</title>
		<link>http://blog.anbutu.com/uncategorized/twitter-api-proxy-with-nginx</link>
		<comments>http://blog.anbutu.com/uncategorized/twitter-api-proxy-with-nginx#comments</comments>
		<pubDate>Tue, 16 Aug 2011 00:50:10 +0000</pubDate>
		<dc:creator>liwei</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.anbutu.com/?p=271</guid>
		<description><![CDATA[简单的说，就是伪造一个 api.twitter.com 出来，然后修改 hosts 文件，将 api.twitter.com 指到我们搭建的反向代理上。由于需要走 https 连接，还需要我们伪造一个 api.twitter.com 的证书。 1. 首先，伪造一个 api.twitter.com 的证书 1.1 创建 CA 的私钥 openssl genrsa -out ca.key 4096 1.2 创建 CA 证书 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt 1.3 创建服务器私钥 &#8230; <a href="http://blog.anbutu.com/uncategorized/twitter-api-proxy-with-nginx">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>简单的说，就是伪造一个 api.twitter.com 出来，然后修改 hosts 文件，将 api.twitter.com 指到我们搭建的反向代理上。由于需要走 https 连接，还需要我们伪造一个 api.twitter.com 的证书。</p>
<p>1. 首先，伪造一个 api.twitter.com 的证书<br />
1.1 创建 CA 的私钥</p>
<pre>openssl genrsa -out ca.key 4096</pre>
<p>1.2 创建 CA 证书</p>
<pre>openssl req -new -x509 -days 3650 -key ca.key -out ca.crt</pre>
<p>1.3 创建服务器私钥</p>
<pre>openssl genrsa -out server.key 4096</pre>
<p>1.4 创建服务器证书签名请求（注意 Common Name 填 <strong>api.twitter.com</strong>)</p>
<pre>openssl req -new -key server.key -out server.csr</pre>
<p>1.5 用 CA 证书签名</p>
<pre>openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt</pre>
<p>这样，一个伪造的证书就创建好了，下面把 server.crt 和 server.key 复制到 /etc/nginx/ssl 里面（或者其他的路径，只要跟配置文件里面一致就可以了）</p>
<p>2. 配置反向代理（注意 server_name 填 api.twitter.com）</p>
<pre>    server {
        listen       443;
        server_name  api.twitter.com;
        charset utf-8;

        access_log  /var/log/nginx/t.anbutu.com.access.log  main;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        location / {
            proxy_pass https://api.twitter.com:443;
            proxy_set_header Host $host;
        }
    }</pre>
<p>3. 修改 hosts 文件，将 api.twitter.com 指到我们代理的IP上</p>
<pre>205.185.127.127 api.twitter.com</pre>
<p>4. 导入 CA 证书<br />
这时候直接访问 api.twitter.com 还是不行的，因为我们是伪造的证书，肯定会报证书错误的，还需要将我们的 CA 证书(ca.crt) 设为可信。其他平台就不说了，简单说一下 iphone 上如何导入证书。苹果官方有一个 iPhone Configuration Utility 的软件，可以用来导入证书。其实这里还有一个更简单的办法，把你的证书放在网上，然后用 iphone 上的 Safari 访问一下证书的 URL，就可以将这个证书导入了。证书导入以后，由这个 CA 签署的所有证书就都变为可信了。</p>
<p>关于自签证书，可以参考：http://log.dongsheng.org/2009/09/07/https-certificate/</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.anbutu.com/uncategorized/twitter-api-proxy-with-nginx/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Snow Leopard 中快速切换Python版本</title>
		<link>http://blog.anbutu.com/python/snow-leopard-switch-python-version</link>
		<comments>http://blog.anbutu.com/python/snow-leopard-switch-python-version#comments</comments>
		<pubDate>Wed, 15 Jun 2011 14:17:39 +0000</pubDate>
		<dc:creator>liwei</dc:creator>
				<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.anbutu.com/?p=266</guid>
		<description><![CDATA[Snow Leopard 中自带了 2.5和2.6两个版本的Python，可以通过更改配置自动切换： defaults write com.apple.versioner.python Version 2.5 或者 defaults write com.apple.versioner.python Version 2.6]]></description>
			<content:encoded><![CDATA[<p>Snow Leopard 中自带了 2.5和2.6两个版本的Python，可以通过更改配置自动切换：</p>
<p>defaults write com.apple.versioner.python Version 2.5<br />
或者<br />
defaults write com.apple.versioner.python Version 2.6</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.anbutu.com/python/snow-leopard-switch-python-version/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用于检测敏感词的 PHP 扩展</title>
		<link>http://blog.anbutu.com/php/php-ext-trie-filter</link>
		<comments>http://blog.anbutu.com/php/php-ext-trie-filter#comments</comments>
		<pubDate>Mon, 27 Sep 2010 01:33:24 +0000</pubDate>
		<dc:creator>liwei</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[filter]]></category>

		<guid isPermaLink="false">http://blog.anbutu.com/?p=252</guid>
		<description><![CDATA[敏感词过滤是我朝程序员必须具备的一种特殊技能，随着敏感词越来越多，是时候写个扩展来快速的进行敏感词检测了 使用说明 1. 安装 libdatrie tar zxf libdatrie-0.2.4.tar.gz cd libdatrie-0.2.4 ./configure &#8211;prefix=/usr/local make make install 2. 安装 trie_filter 扩展 tar zxf trie_filter-1.0.0.tar.gz cd trie_filter-1.0.0 phpize ./configure &#8211;with-php-config=/path/to/php-config make make install 记得修改你的 php.ini 文件，启用 trie_filter 扩展。extension=trie_filter.so 3. 生成词典预处理工具（dpp.c 在 trie_filter-1.0.0 里面） &#8230; <a href="http://blog.anbutu.com/php/php-ext-trie-filter">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>敏感词过滤是我朝程序员必须具备的一种特殊技能，随着敏感词越来越多，是时候写个扩展来快速的进行敏感词检测了<br />
<strong> 使用说明</strong></p>
<p>1. 安装 libdatrie<br />
tar zxf libdatrie-0.2.4.tar.gz<br />
cd libdatrie-0.2.4<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
make install</p>
<p>2. 安装 trie_filter 扩展<br />
tar zxf trie_filter-1.0.0.tar.gz<br />
cd trie_filter-1.0.0<br />
phpize<br />
./configure &#8211;with-php-config=/path/to/php-config<br />
make<br />
make install<br />
记得修改你的 php.ini 文件，启用 trie_filter 扩展。extension=trie_filter.so</p>
<p>3. 生成词典预处理工具（dpp.c 在 trie_filter-1.0.0 里面）<br />
gcc -O dpp dpp.c -ldatrie</p>
<p>4. 生成敏感词词典<br />
首先你需要把需要检测的敏感词写入到一个文本文件中，每行一个敏感词，然后使用上一步生成的 dpp 程序处理这个文本文件来生成词典<br />
./dpp  txt_file_path   dict_file_path</p>
<p>5. 使用扩展<br />
扩展接口很简单，只有两个函数：<br />
1) trie_filter_load($path_to_dict)<br />
用来载入词典，成功返回一个 Trie_Filter 资源句柄，失败返回 NULL<br />
2) trie_filter_search($trie, $text)<br />
用来检测一段文本中是否含有词典中定义的敏感词，$trie 是上一个函数返回的 Trie Filter 句柄，$text 是欲检测的文本<br />
如果检测到敏感词则返回一个数组，数组第一个元素指出检测到的敏感词在 $text 中的偏移量，第二个元素指出该敏感词的长度(bytes)<br />
如果没有检测到敏感词，则返回一个空数组</p>
<p><strong>扩展的速度怎么样</strong></p>
<p>一个字，很快！扩展的检测算法基于 Double Array Trie Tree，查找单一关键字的时间复杂度为 O(1)，查找整段文本的时间复杂度为 O(n)，n 为文本的长度，而且检测的速度不会因为敏感词的增加而降低。</p>
<p><strong>注意事项</strong></p>
<p>1. 扩展把词典和要检测的文本都当做平凡的字节流处理，因此可以无视字符集的问题。但需要注意的是词典的编码需要和检测文本的编码一致，例如词典为 UTF-8 编码而你需要检测的文本为 GBK 编码，这就要求你在调用 trie_filter_search() 函数之前通过 iconv 或者 mb_xxx 函数转换一下编码<br />
2. 目前只在 linux + php-5.2 环境下测试通过，不支持 windows，也没有支持的计划</p>
<p><em>欢迎大家测试使用，提出建议</em></p>
<p><em><a href="http://blog.anbutu.com/wp-content/uploads/2010/09/trie_filter-1.0.0.tar.gz">trie_filter-1.0.0.tar</a></em></p>
<p><em><a href="http://blog.anbutu.com/wp-content/uploads/2010/09/libdatrie-0.2.4.tar.gz">libdatrie-0.2.4.tar</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.anbutu.com/php/php-ext-trie-filter/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于 gzip, deflate, zlib, LZ77</title>
		<link>http://blog.anbutu.com/misc/about-gzip-deflate-zlib-lz77</link>
		<comments>http://blog.anbutu.com/misc/about-gzip-deflate-zlib-lz77#comments</comments>
		<pubDate>Fri, 25 Jun 2010 12:40:19 +0000</pubDate>
		<dc:creator>liwei</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[gzcompress]]></category>
		<category><![CDATA[gzdeflate]]></category>
		<category><![CDATA[gzencode]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[lz77]]></category>
		<category><![CDATA[zlib]]></category>

		<guid isPermaLink="false">http://blog.anbutu.com/?p=238</guid>
		<description><![CDATA[LZ77: 是一种基于字典的无损数据压缩算法（还有 LZ78, LZW 等） deflate: 也是一种数据压缩算法，实际上就是先用 LZ77 压缩，然后用霍夫曼编码压缩 gzip: 是一种文件结构，也可以算一种压缩格式，通过 defalte 算法压缩数据，然后加上文件头和CRC校验 zlib: 是一个提供了 deflate, zlib, gzip 压缩方法的函数库；也是一种压缩格式（用 deflate 压缩数据，然后加上 zlib 头和 CRC 校验） PHP 中的 zlib 扩展提供了对以上压缩格式的支持，其中的函数和压缩格式的对应关系如下： gzdeflate, gzinflate 对应 deflate gzcompress, gzuncompress 对应 zlib 格式压缩 gzencode, gzdecode &#8230; <a href="http://blog.anbutu.com/misc/about-gzip-deflate-zlib-lz77">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>LZ77</strong>: 是一种基于字典的无损数据压缩算法（还有 LZ78, LZW 等）</p>
<p><strong>deflate</strong>: 也是一种数据压缩算法，实际上就是先用 LZ77 压缩，然后用霍夫曼编码压缩</p>
<p><strong>gzip</strong>: 是一种文件结构，也可以算一种压缩格式，通过 defalte 算法压缩数据，然后加上文件头和CRC校验</p>
<p><strong>zlib</strong>: 是一个提供了 deflate, zlib, gzip 压缩方法的函数库；也是一种压缩格式（用 deflate 压缩数据，然后加上 zlib 头和 CRC 校验）</p>
<p><strong>PHP 中的 zlib 扩展提供了对以上压缩格式的支持，其中的函数和压缩格式的对应关系如下：</strong></p>
<p>gzdeflate, gzinflate 对应 deflate</p>
<p>gzcompress, gzuncompress 对应 zlib 格式压缩</p>
<p>gzencode, gzdecode 对应 gzip 格式压缩</p>
<p><strong>Python 中的 zlib 模块也提供了上述压缩格式的支持，不过接口很“隐晦”：</strong></p>
<p>zlib.compress  对数据进行 zlib 格式压缩，好像压缩的时候只支持这一种格式，不过你可以通过把压缩后的数据去掉两字节 zlib 头和末尾 4 字节的 CRC 校验得到 deflate 格式的压缩数据（zlib_compressed[2:-4]）；对于 gzip 压缩格式可以通过 gzip 模块得到。</p>
<p>zlib.decompress(string[,wbits[,bufsize]]) 解压更折腾，压缩格式是通过 wbits 参数控制的：</p>
<ul>
<li>[8, 15]：解压 zlib 格式的数据</li>
<li>[-8, -15]：解压 deflate 格式数据</li>
<li>[16, 30]：解压 gzip 格式数据</li>
</ul>
<p><strong>另外，对于 Apache 的页面压缩：</strong></p>
<p>Content-Encoding: gzip 对应 gzip 格式压缩</p>
<p>Cotent-Encoding: deflate 对应  deflate 压缩</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.anbutu.com/misc/about-gzip-deflate-zlib-lz77/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

