<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8.4" -->
<rss version="0.92">
<channel>
	<title>老韩</title>
	<link>http://www.handaoliang.com</link>
	<description>沉迷于玩技术是病，被技术玩得沉迷是命。</description>
	<lastBuildDate>Thu, 02 Sep 2010 17:49:42 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>让iPhone跑得更快，对iPhone进行系统盘瘦身</title>
		<description>iPhone有一个Fonts文件夹，是放在系统盘下的，占据了90多M的磁盘空间。对于像Fonts这种不经常替换的文件，完全可以移到别的磁盘，以节约系统盘有限的空间。下面，我们就通过SSH来连接到iPhone，对iPhone进行一次小小的系统盘瘦身。

先看一下fonts文件夹的大小，94M：

handaoliang-iphone:/System/Library/Fonts root# du -lh
94M     .


再看磁盘空间，发现系统盘已经被占用了89%：

handaoliang-iphone:~ root# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/disk0s1          750M  654M   89M  89% /
devfs   ...</description>
		<link>http://www.handaoliang.com/article_115.html</link>
			</item>
	<item>
		<title>iOS4下安装最新的MyWi4.6.2</title>
		<description>　　MyWi不用我介绍了吧？它可以让你的iPhone成为一个Wifi热点，如果你有一个iPhone以及3G卡，那么使用这个软件即可实现其它设备通过iPhone wifi热点来共享3G带宽上网。

　　网上流传的大部分教程都是过期的，装完之后根本不能打开，一启动就退出。找了半天，终于在国外的一个论坛找到一个贴子。

　　直接翻译过来吧：

　　1、通过Cydia安装当前版本的Rockapp，并且创建一个Rock ID。
　　2、通过Rock来安装MyWi以及My3G的试用版本，装完了打开他们，确认获得试用License。
　　3、使用iPhoneBrowser或者类似的程序（译者注：我用的是SSH直接登录到命令行，Tar一个包出来就可以了），备份：/var/mobile/library/ryp folder
　　4、删除Rockapp－－同时会将MyWi和My3G一起删除。
　　5、通过Cydia安装ElPelle源的MyWi4.6.2以及My3G的No Rock版本。（译者注：Elepelle源通过Source添加：http:/elpelle6.com/repo）；
　　6、恢复/var/mobile/library/ryp文件夹。
　　7、退出SSH，再打开MyWi，就可以用了。

　　以上步骤亲自实验通过，并且使用iPad成功连接上网。可以开启11个通道，有iPhone WiFi的同学，可以省一笔买华为E5的银子了。

　　1. Installed current version of Rockapp via Cydia, create new account
　　2. Installed current trial versions of MyWi and My3G, open each to confirm trial license
　　3. Using iPhonebrowser (or similar program), backup the /var/mobile/library/ryp folder
　　4. Delete Rockapp (dependencies i.e. MyWi and My3G will be removed too)
　　5. ...</description>
		<link>http://www.handaoliang.com/article_114.html</link>
			</item>
	<item>
		<title>Mailman2.1.9系统的一些BUG修复</title>
		<description>1、邮件列表归档中文乱码问题。

　　A.错误描述：如果客户端发送的邮件编码为GB2312编码，则当把邮件归档时，会出现信体为乱码的现象。

　　B.问题分析：经过对邮件原文的分析，邮件本身没有问题，信头上也有编码信息，比如我发送的测试信信体为：


------=_NextPart_000_0180_01CB096D.0DEF1A50
Content-Type: text/plain;
    charset="gb2312"
Content-Transfer-Encoding: base64

1eLKx9K7t+K3otfUT3V0bG9va7XEsuLK1NPKvP6jrNPKvP6x4MLrzqqjukdCMjMxMg0KDQpUaGlz
IGlzIGEgdGVzdCBtYWlsIHNlbmRlZCBieSBPVVRMT09LLCBhbmQgaXShr3MgZW5jb2RpbmcgYnkg
R0IyMzEyLi4NCg0KIA0KDQpIYW5kYW9saWFuZw0KDQq6q7XAwcENCg0K

------=_NextPart_000_0180_01CB096D.0DEF1A50

　　经过对信体进行Base64解码，发现信体信息正常，编码正常。这就跟踪到问题可能出现在解码的模块。经过读代码发现，Mailman是调用pipermail进行解码的，据此跟踪到信体的解解码在HyperArch.py模块的Article类里完成。

　　C.问题修正：在Article类里加入编码判断并进行转码：

if body and charset != Utils.GetCharSet(self._lang):
	# decode body
	try:
		#body = body.decode(charset)
		if charset == 'gb2312':
			body  =  body.decode(charset, 'ignore').encode(Utils.GetCharSet(self._lang))
		else:
			body = unicode(body, charset)
	except (UnicodeError, LookupError):
		body = None


2、邮件列表的List页面乱码问题：

　　A.问题描述：在Mailman2.1.9版本中，如果管理员后台设置了语言为中文，而系统又没有进行编码设置，那么Mailman邮件列表中文界面极有可能显示为乱码。

　　B.问题分析：通过查看网页源代码发现，此时的编码为“us-ascii”，这是默认的编码。再检查模板，发现模板的编码都是UTF-8，此时编码是混淆的。

　　C.修正：更改Default.py或者mm_cfg.py文件，把zh_CN编码改成：add_language('zh_CN', _('Chinese (China)'), 'utf-8')。

　　3、脚本change_pw无法找到列表错误。

　　A.错误描述：当邮件列表的名字有大小写字母时，会出现无法修改邮件列表的错误，例如：
当我在命令行下输入：./change_pw --listname=Mailman-dev-test --password=123456，此时可能出现：No such list "Mailman-dev-test"的错误。

　　B.问题分析：这是因为没有把所有字母转成小写的缘故，邮件列表在本地都存储为小写。如果没有转换，则Mailman/MailList.py模块第616会抛出：Errors.MMUnknownListError错误：

if not Utils.list_exists(self.internal_name()):
    raise Errors.MMUnknownListError

　　
　　C. 修正：在change_pw脚本的openlist方法中，将传入的listname转成小写：

listname = listname.lower().strip()
 </description>
		<link>http://www.handaoliang.com/article_111.html</link>
			</item>
	<item>
		<title>转换Putty ppk 文件到OpenSSH格式的Key文件</title>
		<description>出于安全的考虑，我的服务器SSH远程认证去掉了通过用户名＋密码模式的认证机制。转而使用Windows下的Puttygen生成的Key（以.ppk结尾）来验证登录，同时为了增强安全性，把SSH的端口配到了高端端口上。然而转到Mac平台下去之后，因其本身就带有Shell（Mac是基于FreeBSD进行的包装），所以本身也就有了SSH，用不上Putty了，但是因此所导致的问题是，我在Windows下的Key到了Mac平台上也就用不上了，在这种情况下，迫不得已，就只有去找转变认证机制的方法。

出于思维的习惯（人类避重就轻的惰性），一开始考虑的是把服务器改回使用用户名加密码的认证机制，但显然这不是一个明智的做法。于是就把眼光转向了转换ppk key的方向，基于这个想法，再想到解铃还得系铃人，所以目光自然又重新定位回了Putty这个开源的东东，下载下源码一读，发现它对Uninx的支持也还是很好的。那好，我只需要一个puttygen，编译无非是一点体力活。

以下是全过程：
1、下载Putty 0.6源代码并编译：

wget http://putty.very.rulez.org/latest/putty-0.60.tar.gz
tar xzvf putty-0.60.tar.gz
cd putty-0.60
configure –prefix=/opt/iApps/putty
make


嗯，不用讶异，接下来没有make install的过程，因为我们不需要真的把Putty安装到/opt/iApps/putty里，当你在Make的时候，Puttygen已经编译完成，这里在Configure写上一个prefix路径，只是想提醒你，如果想安装的话，最好指定一个目录，以便于管理。

那么接下来转换我们Windows下的Putty key：

putty-0.60/unix/puttygen my_ssh_key.ppk -O private-openssh -o my_openssh_key.ssh

顺利的生成my_openssh_key.ssh文件，此时就可以通过以下命令来进行登录了：

ssh root@172.16.1.99 -i my_openssh_key.ssh -p 9999

 </description>
		<link>http://www.handaoliang.com/article_106.html</link>
			</item>
	<item>
		<title>盛大在线游戏格子客开始封测</title>
		<description>　　格子客是我来到盛大创新院之后参与的第一个项目，这是一款新概念的在线游戏，首推“玩游戏！为乐趣更为奖品！”的全新概念！与其它传统游戏不同，它不是单纯依靠同质化的游戏乐趣吸引玩家，而是把丰富，刺激的“奖品”有机化的融入到游戏当中，玩游戏的同时不但可以体验到冒险的刺激，而且可以拿到奖品，这个奖品不是虚拟的，是实物的，比如：PSP、Ipod等。
　　2010年4月19日格子客开始邀请封测，如果你想体验一下这个游戏，可以找我要邀请码。要邀请码的同学请在回复中留下Email。：）















 </description>
		<link>http://www.handaoliang.com/article_100.html</link>
			</item>
	<item>
		<title>我的GVim配置</title>
		<description>　　工作中，我大部分时间都是和VIM打交道的，甚至Windows下的编程也开始完全用GVIM替代Editplus。这两天对自己的vimrc文件做了一下整理。同时给每一行的配置增加了注释。整理完成之后，好用多了，因为借鉴了很多网友的经验，所以本着分享的精神公布出来，希望有朋友能用上。
　　另外，我这份_vimrc配置使用的字体是：YaHei Mono，如果您没有此字体，可以到这里下载：（下载YaHei Mono字体）。下载后放到Windows文件夹下的fonts目录里即可。如果你不想用YaHei Mono字体，那么有一个替代方案就是用Courier_New字体，需要修改以下配置：


" 设置显示字体
if has("win32")
    " set guifont=Courier_New:h11:cANSI
    set guifont=YaHei\ Mono:h11
    "set guifontwide=Microsoft\ Yahei\ Monotype:h11
    "set guifont=YaHei\ Consolas\ Hybrid:h12
endif

将“set guifont=YaHei\ Mono:h11”注掉，同时把“set guifont=Courier_New:h11:cANSI”项打开即可。

以下是配置文件全部内容：

" ***************Vimrc files for GVim *************
" * CreateDate : Apr 20,2010
" * LastModified : Apr 20,2010

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" ...</description>
		<link>http://www.handaoliang.com/article_99.html</link>
			</item>
	<item>
		<title>我们的开源Twitter客户端：TinyTui2</title>
		<description>　　TinyTui是由印客网前技术总监老庄（表伟）发起的一个开源项目，后来由于共同的兴趣爱好，我和另外一个朋友felixding也加入到了这个团队当中。项目虽然不大，但却凝聚了我们不少心血，当然，做为后来者加入的我，贡献有限，主要还是前面两位牛人在开发。目前产品正在完善当中，不过已经基本上满足需求。

　　一、关于TinyTui2：
　　TinyTui2是一个基于Twitter API构建的Twitter客户端程序，目标是建立一个高可用性、高智能的代＿理平台，为墙内的互联网用户搭建起通往Twitter的桥梁。为了防止信息过载，我们在这个平台上加入了贝叶斯算法（bayesian，wiki:点这里），试图应用这个算法的自我学习机制，来过滤掉一些无意义的噪音，让用户能更有效Touch到目标信息。
　　TinyTui2为开源程序，基于GPL协议，可二次开发，当然，我们也要求二次开发人员须具备能忍受我们在代码间叽叽歪歪的废话而不疯掉的心理承受能力，除此没其它的要求。祝您好运，感谢祖国，感谢父母，感谢国民党，感谢功夫网，感谢你丫挺的。
　　项目主页：http://code.google.com/p/tinytui2/

　　二、我们的信念：
　　以佛主如来的名义，Fuck G＿F＿W 一万年。阿门。

　　三、系统安装：
　　1、将程序上传到你的WEB目录下，请保证域名指向的根目录是：apps
　　2、保证：cache目录及其子目录可写。
　　3、保证：libs/b8-0.4.4/etc/config_storage.php文件可写。
　　4、运行：http://youdomain.com/install
　　5、输入你的数据库账号及密码。点击安装。
　　6、安装成功之后，请删除apps目录下的install文件夹。

　　四、目录结构：
　　/----apps - WEB应用程序所在目录
　　  &#124;   &#124;
　　  &#124;   &#124;----install -- 系统安装文件
　　  &#124;   &#124;
　　  &#124;   &#124;----src -- 静态资源文件
 　　 &#124;
　　  &#124;--conf - 网站配置文件所在目录
　　  &#124;
 　　 &#124;--libs - 库文件，包括开源的库，b8和smarty
 　　 &#124;
　　  &#124;--view - 模板所在目录
　　  &#124;
　　 ...</description>
		<link>http://www.handaoliang.com/article_96.html</link>
			</item>
	<item>
		<title>基于JSON格式数据的Ajax分页实现</title>
		<description>很早就想写一篇关于Ajax分页的文章，只是一直偷懒，拖到现在。有这个念头，是因为我看到现在大部分的WEB分页实现，都是在服务器端做，即便是有一些号称用Ajax实现的，也无非是从服务器端传一组HTML到前端来展示。从纯数据传输的角度来讲，这是相当不靠谱的事情，明明可以纯JSON传输的数据，为什么要附带上这么多冗余的HTML呢？因为既然是和页面相关的事情嘛，自然应该都交给前端去处理。

实现起来其实很简单，先实现分页逻辑：


//创建全局对象。
var handaoliang = {};
//设定命名空间。
handaoliang.func = {};
(function(){
    /**
     * 这里传入的数据里必须包含三个Key键：
     * allRecords - 所有记录数。
     * allPageNum - 所有页面数。
     * currentPage - 当前页。
     **/
    handaoliang.func.AjaxPage = ...</description>
		<link>http://www.handaoliang.com/article_94.html</link>
			</item>
	<item>
		<title>为Repoze.who开发的SSO插件</title>
		<description>　　在架设ClueMapper的过程当中，由于ClueMapper是基于repoze.who做为登录认证模块的，所以为了适应需求，对repoze.who做了不少的改造，比如之前说过的给repoze.who加上LDAP认证即是改进之一。当然，在后来使用的过当中，并没有完全依赖于LDAP的谁机制，而是使用了SSO认证机制，这是目前很多公司内部普遍使用的认证机制之一。

　　其实这是第一次尝试写Repoze.who的中间件，在写之前仔细看了一遍repoze.who的代码，发现了不少有意思的东西，比如中间件的机制，等回头有时间，可以专门写一篇repoze.who解读。当然这是题外话，现在要说的，是这个SSO插件。

　　代码很简单，由于现在我们使用的SSO认证仅仅基于HTTP协议，所以只用urllib2就够了。下面是代码：


# -*- coding: utf-8 -*-
"""
SSO Plugins for Repoze.who

Author: handaoliang 

Basic usage:

>>> from repoze.who.plugins import sso
>>> sso_auth = sso.SSOAuthenticatorPlugin(SSO_URI,SSO_ORG_ID,SSO_SUB_ID,REMOTE_ADDR)
>>> authenticators = [('sso_auth', sso_auth)]
>>> pam = middleware.PluggableAuthenticationMiddleware(
        authfilter,
        identifiers,
        authenticators,
  ...</description>
		<link>http://www.handaoliang.com/article_88.html</link>
			</item>
	<item>
		<title>取得某个文件夹下所有同类型文件</title>
		<description>PHP有一个模块叫做mime_magic，用来判断文件的类型非常有效。使用它的mime_content_type函数，结合递归可以很方便的把某一个文件夹下的所同类型文件找出来，比如我因为某种需求要取出某个文件夹下所有的纯文本文件，即是写了一小段代码来递归（代码片段见下文）。

当然，这里并不是展示什么技巧性的东西，只是介绍性的说明一下有这样一个模块。记得很多年前初学写程序时，是根据文件的后缀来判断文件类型的，显然这是一件多么不靠谱的事情，如果现在还有人这么干，我想是要被耻笑的吧？脚本语言讨人喜爱之处就是它总是为我们提供很多很实用的库，这大大降低了我们的开发成本以及提高了开发效率，虽然，也因此增加了选择成本。比如我们刚刚所说的判断文件类型，即有人建议用PECL的FileInfo库来做。

需要连带说明一下，在Python中对MIME类型的处理，也有内置的一个模块叫mimetypes，可以很方便的取得一个文件的类型。


>>> import mimetypes
>>> mimetypes.guess_type('/home/handaoliang/bodybg.jpg')
('image/jpeg', None)



PHP取得某文件夹下所有的纯文本文件：


#!/var/iapps/php/bin/php

 </description>
		<link>http://www.handaoliang.com/article_87.html</link>
			</item>
</channel>
</rss>
