<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en-US.UTF-8">
	<title>a gift from the gods.</title>
	<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php" />
	<modified>2008-07-06T16:47:12Z</modified>
	<author>
		<name>crown.hg</name>
	</author>
	<copyright>Copyright 2008, crown.hg</copyright>
	<generator url="http://www.sourceforge.net/projects/sphpblog" version="0.5.1">SPHPBLOG</generator>
	<entry>
		<title>Apache2你可能没注意到的一些常见错误修正</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080630-235520" />
		<content type="text/html" mode="escaped"><![CDATA[问题：<br />干静的APACHE环境，新加截mod_php libphp5.so后，得到如下输出：<br />[notice] caught SIGTERM, shutting down<br />解决方法：<br />安装libxml2包，如sudo pacman -S libxml2<br /><br />问题：<br />加截mod_ssl.so后，得到如下输出：<br />[warn] Init: Session Cache is not configured [hit: SSLSessionCache]<br />解决方法：<br />增加如下配置，<br />SSLSessionCache &quot;shmcb:/var/run/ssl_scache(512000)&quot;<br />或<br />SSLSessionCache &quot;dbm:/var/run/ssl_scache&quot;]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080630-235520</id>
		<issued>2008-06-30T00:00:00Z</issued>
		<modified>2008-06-30T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Python-2.5.2-idlelib patch</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080505-145951" />
		<content type="text/html" mode="escaped"><![CDATA[<pre><br />Python 2.5.2 (r252:60911, Feb 23 2008, 21:20:32) <br />[GCC 4.2.3] on linux2<br />Type &quot;copyright&quot;, &quot;credits&quot; or &quot;license()&quot; for more information.<br /><br />    ****************************************************************<br />    Personal firewall software may warn about the connection IDLE<br />    makes to its subprocess using this computer&#039;s internal loopback<br />    interface.  This connection is not visible on any external<br />    interface and no data is sent to or received from the Internet.<br />    ****************************************************************<br />    <br />IDLE 1.2.2  <br />&gt;&gt;&gt; import os<br />&gt;&gt;&gt; os.    &lt;--- pressing tab should give you the available<br />options for that module/library.<br />The error in the console is as follows:<br /><br />Exception in Tkinter callback<br /><br />Traceback (most recent call last):<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1403, in __call__<br />    return self.func(*args)<br />  File &quot;/usr/lib/python2.5/idlelib/AutoCompleteWindow.py&quot;, line 217, in<br />winconfig_event<br />    x, y, cx, cy = self.widget.bbox(self.startindex)<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 2833, in bbox<br />    self.tk.call((self._w, &#039;bbox&#039;) + args)) or None<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1030, in _getints<br />    return tuple(map(getint, self.tk.splitlist(string)))<br />ValueError: invalid literal for int() with base 10: &#039;(63,&#039;<br />Exception in Tkinter callback<br />Traceback (most recent call last):<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1403, in __call__<br />    return self.func(*args)<br />  File &quot;/usr/lib/python2.5/idlelib/AutoCompleteWindow.py&quot;, line 217, in<br />winconfig_event<br />    x, y, cx, cy = self.widget.bbox(self.startindex)<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 2833, in bbox<br />    self.tk.call((self._w, &#039;bbox&#039;) + args)) or None<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1030, in _getints<br />    return tuple(map(getint, self.tk.splitlist(string)))<br />ValueError: invalid literal for int() with base 10: &#039;(63,&#039;<br />Exception in Tkinter callback<br />Traceback (most recent call last):<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1403, in __call__<br />    return self.func(*args)<br />  File &quot;/usr/lib/python2.5/idlelib/AutoCompleteWindow.py&quot;, line 217, in<br />winconfig_event<br />    x, y, cx, cy = self.widget.bbox(self.startindex)<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 2833, in bbox<br />    self.tk.call((self._w, &#039;bbox&#039;) + args)) or None<br />  File &quot;/usr/lib/python2.5/lib-tk/Tkinter.py&quot;, line 1030, in _getints<br />    return tuple(map(getint, self.tk.splitlist(string)))<br />ValueError: invalid literal for int() with base 10: &#039;(63,&#039;<br /></pre><br />Python-2.5.2-idlelib patch<br /><pre><br />--- Lib/idlelib/WidgetRedirector.py.orig	2008-04-23 23:39:57.000000000 -0700<br />+++ Lib/idlelib/WidgetRedirector.py	2008-04-23 23:46:55.000000000 -0700<br />@@ -53,7 +53,13 @@<br />             if m:<br />                 return m(*args)<br />             else:<br />-                return self.tk.call((self.orig, cmd) + args)<br />+                #return self.tk.call((self.orig, cmd) + args)<br />+                r = self.tk.call((self.orig, cmd) + args)<br />+                if isinstance(r, tuple):<br />+                    # convert to string ourselves so we get a Tcl list<br />+                    # that can be converted back into a tuple<br />+                    r = &#039; &#039;.join(map(str, r))<br />+                return r<br />         except TclError:<br />             return &quot;&quot;<br /></pre>]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080505-145951</id>
		<issued>2008-05-05T00:00:00Z</issued>
		<modified>2008-05-05T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Arch linux系统Broadcom bcm43系列无线网卡轻松安装</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080501-001904" />
		<content type="text/html" mode="escaped"><![CDATA[linux kernel 2.6.24及其后的版本已包含了bcm43xx driver.<br />安装方法如下：<br />1、sudo pacman -S b43-fwcutter<br />2、wget <a href="http://downloads.openwrt.org/sources/broadcom-wl-4.80.53.0.tar.bz2" target="_blank" >http://downloads.openwrt.org/sources/br ... .0.tar.bz2</a><br />3、tar jxvf broadcom-wl-4.80.53.0.tar.bz2<br />4、sudo mkdir /lib/firmware<br />5、b43-fwcutter -w &quot;/lib/firmware/&quot; wl_apsta.o<br />6、编辑/etc/rc.conf添加b43到modules部分<br /><br />附：无线网卡的管理推荐用netcfg2。<br /><br />参考内容：<br />ArchWiki::Wireless Setup <a href="http://wiki.archlinux.org/index.php/Wireless_Setup#b43" target="_blank" >http://wiki.archlinux.org/index.php/Wireless_Setup#b43</a><br />ArchWiki::Network Profiles <a href="http://wiki.archlinux.org/index.php/Network_Profiles" target="_blank" >http://wiki.archlinux.org/index.php/Network_Profiles</a>]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080501-001904</id>
		<issued>2008-04-30T00:00:00Z</issued>
		<modified>2008-04-30T00:00:00Z</modified>
	</entry>
	<entry>
		<title>ARCHLINUX 2008.04-rc硬盘安装</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080427-095007" />
		<content type="text/html" mode="escaped"><![CDATA[自2007.08版装机后，一直一来都是升级更新，ARCHLINUX的升级更新也相当稳定，但电脑用的时间长了，文件堆放的也越来越杂乱，许多不错的软件，因暂时需要而安装，安装后又不经常使用，长期沉睡在硬盘上，久而久之硬盘慢慢变小，追求完美的我又能怎样容忍它这样下去呢！<br />ARCHLINUX 2008.04-rc版ISO放出时，就第一时间下载了它。说真的2008.04-rc的安装版硬盘不太友好，很多朋友都在INIT BOOT时因不能挂截CDROM而失败。但我们不能因为失败而止步不前，失败则是成功的开始。现在我们来用另类方法安装它吧。<br /><br />思路如下:用2008.03的ISO来安装2008.04-rc，因为只是需要2008.03 ISO的引导文件，所以可以下载2008.03-03的FTP安装ISO文件，才30M左右，几分钟就下载完成。2008.04-rc是已下好的。<br /><br />开始安装：<br />1、用7ZIP，RAR或其它解ISO的工具解压2008.03ISO中的isolinux文件夹下的vmlinuz和initrd.img 到本地硬盘上。如本机的D:\arch\文件夹下，本机的D盘为(hd0,4)<br /><br />2、假设你想我一样现用的已是双系统啦（如果你没有GRUB引导管理器请参阅相关GRUB FOR DOS相关文章，网上大把大把的），在ＧＲＵＢ引导界面时按Ｃ键进入ＧＲＵＢ命令行，键入：<br /><pre><code><br />kernel (hd0,4)/arch/vmlinuz<br />initrd (hd0,4)/arch/initrd.img<br />boot<br /></code></pre><br /><br />3、现在已正常引导并通过，出现安装界面，这里选ＣＤＲＯＭ作来安装源。（？这不是ＦＴＰ的ＩＳＯ吗？为什么要选ＣＤＲＯＭ作为安装源呢？你不是下载了２００８.０４－RC的ＩＳＯ吗，你要重新下载一遍ＢＡＳＥ软件包吗，如果你带宽高，时间多，有而心等，随便你啦。）<br />在选了ＣＤＲＯＭ作为安装源后，先不要按回车进行下一步。现在按ＡＬＴ＋Ｆ２进入另一个终端，用ＭＯＵＮＴ挂截ＩＳＯ。<br /><br />本人对比过２００８.０３的ＩＳＯ和２００８.０４的ＩＳＯ文件组织可不一样的，那么我们以现在需要的方式挂截ＩＳＯ，<br />２００８.０３的ＩＳＯ的源文件是直接MOUNT到/src下面的，若你用２００８.０４－ＲＣ的ＩＳＯ，它的源文件是在/addons/core-pkgs/目录下的。所以这里我们分两步走，第一步mount 2008.04-rc的iso到一个非/src的文件夹下，如/mnt/iso/，然后再ln /mnt/iso/addons/core-pkgs/ 到 /src/core文件夹下即可。命令如下：<br /><pre></code><br />mkdir /mnt/iso/<br />mkdir /src/core/<br />mount -t iso9660 -o loop /dev/hda5/arch/arch-core-rc4.iso /mnt/iso/<br />ln -s /mnt/iso/addons/core-pkgs/ /src/core/<br /></code></pre><br />然后按ＡＬＴ＋Ｆ１回到安装界面，开始下一步吧。<br /><br />４、下一步安装，这里就不再多讲啦，网上搜搜一大把，先可以参考本ＢＬＯＧ的<a href="http://www.kw-gift.com/blog/index.php?entry=entry071014-171752" target="_blank" >Archlinux 2007.08-2 (Don&#039;t Panic) 轻松安装</a>。]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080427-095007</id>
		<issued>2008-04-27T00:00:00Z</issued>
		<modified>2008-04-27T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Check to see if a script was run as root</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080421-134144" />
		<content type="text/html" mode="escaped"><![CDATA[If you need to make sure a script is run as root, add the following to the start of the script:<br /><pre><code><br />  if [[ $UID -ne 0 ]]; then<br />    echo &quot;$0 must be run as root&quot;<br />    exit 1<br />  fi<br /></code></pre>]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080421-134144</id>
		<issued>2008-04-21T00:00:00Z</issued>
		<modified>2008-04-21T00:00:00Z</modified>
	</entry>
	<entry>
		<title>OpenTTD 0.6.0新功能介绍之驾车经路站</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080419-095440" />
		<content type="text/html" mode="escaped"><![CDATA[OpenTTD 0.6.0 New features:drive through road stops<br />OpenTTD 0.6.0 新功能之驾车经路站即公路两傍的车站和货场<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />OpenTTD5.x版中公路建设中的货场和车站都只有4种类型，这4种类型在建造时都要占用公路旁的一块空地，当城镇在高迅发展时，公路两旁的建筑容易连在一起发展，旧版的路侧车站和货场易隔断城镇建筑的连续发展，而且极期不美化，新版新增的两种车站和货场都在建在公路线上，省了建筑用地，且造价一样。有点类似现在的公交站，和公路临时货点。：）<br />附图为一个水陆两运截图，用的就是新型的车站和货场。<br /><a href="javascript:openpopup('http://www.kw-gift.com/blog/images/openttd_0_6_0_new_1.jpg',802,625,false);"><img src="http://www.kw-gift.com/blog/images/openttd_0_6_0_new_1.jpg" width="500" height="390" border="0" alt="" /></a>]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080419-095440</id>
		<issued>2008-04-19T00:00:00Z</issued>
		<modified>2008-04-19T00:00:00Z</modified>
	</entry>
	<entry>
		<title>MySQL5.1改变Procedure的Definer.</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080410-151238" />
		<content type="text/html" mode="escaped"><![CDATA[Q:<br /><code><br />mysql&gt;CALL pr_test;<br />ERROR 1449(HY000):There is no &#039;user&#039;@&#039;192.168.1.111&#039; registered<br /><code><br />A:<br /><code><br />mysql&gt;UPDATE `mysql`.`proc` p SET definer=&#039;admin@localhost&#039; WHERE definer=&#039;user@192.168.1.111&#039;;<br />Query OK,...<br /><code>]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080410-151238</id>
		<issued>2008-04-10T00:00:00Z</issued>
		<modified>2008-04-10T00:00:00Z</modified>
	</entry>
	<entry>
		<title>OpenTTD 0.6.0正式版发布</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080402-133722" />
		<content type="text/html" mode="escaped"><![CDATA[OpenTTD 0.6.0<br />Tuesday, April 1st 2008 00:02 GMT<br />------------------------------------------------------------------------<br />Finally the release of OpenTTD 0.6.0 has come. It brings you, amongst other things:<br /><br />    * newhouses<br />    * newindustries<br />    * signals and diagonal tracks under bridges<br />    * trams<br />    * autoslope<br />    * oneway roads<br />    * half tile slopes<br />    * drive through road stops<br />    * group management of vehicles<br /><br />OpenTTD 0.6.0正式版发布，新特性如下：<br />    *新房子<br />    *新产业<br />    *信号和对角线铁轨下的桥梁<br />    *电车<br />    *自动斜坡<br />    *单向道路<br />    *半瓦斜坡<br />    *驾车经路站<br />    *集团化管理的车辆<br /><br />中文字体设置<br /><code><br />vim ~/.openttd/openttd.cfg<br /></code><br />找到并修改<br /><code><br />small_font = AR PL ShanHeiSun Uni<br />medium_font = AR PL ShanHeiSun Uni<br />large_font = AR PL ShanHeiSun Uni<br />small_size = 10<br />medium_size = 12<br />large_size = 16<br /></code><br /><br />中文截图：<br /><img src="http://www.kw-gift.com/blog/images/openttd_0_6_0_zh.jpg" width="500" height="393" border="0" alt="" id="img_float_left" /><br />]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080402-133722</id>
		<issued>2008-04-02T00:00:00Z</issued>
		<modified>2008-04-02T00:00:00Z</modified>
	</entry>
	<entry>
		<title>PyMOTW: collections</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080325-215432" />
		<content type="text/html" mode="escaped"><![CDATA[The collections module includes container data types beyond the builtin types list and dict.<br /><br />Module: collections<br />Purpose: Container data types.<br />Python Version: 2.4 and later<br /><br />Deque:<br /><br />A double-ended queue, or &quot;deque&quot;, supports adding and removing elements from either end. The more commonly used stacks and queues are degenerate forms of deques, where the inputs and outputs are restricted to a single end.<br /><br />Since deques are a type of sequence container, they support some of the same operations that lists support, such as examining the contents with __getitem__(), determining length, and removing elements from the middle by matching identity.<br /><code><br />import collections<br /><br />d = collections.deque(&#039;abcdefg&#039;)<br />print &#039;Deque:&#039;, d<br />print &#039;Length:&#039;, len(d)<br />print &#039;Left end:&#039;, d[0]<br />print &#039;Right end:&#039;, d[-1]<br /><br />d.remove(&#039;c&#039;)<br />print &#039;remove(c):&#039;, d<br /></code><br />$ python collections_deque.py<br />Deque: deque([&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;])<br />Length: 7<br />Left end: a<br />Right end: g<br />remove(c): deque([&#039;a&#039;, &#039;b&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;])<br /><br /><br />A deque can be populated from either end, termed &quot;left&quot; and &quot;right&quot; in the Python implementation.<br /><code><br />import collections<br /><br /># Add to the right<br />d = collections.deque()<br />d.extend(&#039;abcdefg&#039;)<br />print &#039;extend    :&#039;, d<br />d.append(&#039;h&#039;)<br />print &#039;append    :&#039;, d<br /><br /># Add to the left<br />d = collections.deque()<br />d.extendleft(&#039;abcdefg&#039;)<br />print &#039;extendleft:&#039;, d<br />d.appendleft(&#039;h&#039;)<br />print &#039;appendleft:&#039;, d<br /></code><br /><br />Notice that extendleft() iterates over its input and performs the equivalent of an appendleft() for each item. The end result is the deque contains the input sequence in reverse order.<br /><br /><pre><br />$ python collections_deque_populating.py<br />extend    : deque([&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;])<br />append    : deque([&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;, &#039;h&#039;])<br />extendleft: deque([&#039;g&#039;, &#039;f&#039;, &#039;e&#039;, &#039;d&#039;, &#039;c&#039;, &#039;b&#039;, &#039;a&#039;])<br />appendleft: deque([&#039;h&#039;, &#039;g&#039;, &#039;f&#039;, &#039;e&#039;, &#039;d&#039;, &#039;c&#039;, &#039;b&#039;, &#039;a&#039;])<br /></pre><br /><br />Similarly, the elements of the deque can be consumed from both or either end, depending on the algorithm you&#039;re applying.<br /><pre><code><br />import collections<br /><br />print &#039;From the right:&#039;<br />d = collections.deque(&#039;abcdefg&#039;)<br />while True:<br />    try:<br />        print d.pop()<br />    except IndexError:<br />        break<br /><br />print &#039;From the left:&#039;<br />d = collections.deque(&#039;abcdefg&#039;)<br />while True:<br />    try:<br />        print d.popleft()<br />    except IndexError:<br />        break<br /><br /></code><br />$ python collections_deque_consuming.py<br />From the right:<br />g<br />f<br />e<br />d<br />c<br />b<br />a<br />From the left:<br />a<br />b<br />c<br />d<br />e<br />f<br />g<br /></pre><br /><br />Since deques are thread-safe, you can even consume the contents from both ends at the same time in separate threads.<br /><pre><code><br />import collections<br />import threading<br />import time<br /><br />candle = collections.deque(xrange(11))<br /><br />def burn(direction, nextSource):<br />    while True:<br />        try:<br />            next = nextSource()<br />        except IndexError:<br />            break<br />        else:<br />            print &#039;%8s: %s&#039; % (direction, next)<br />            time.sleep(0.1)<br />    print &#039;%8s done&#039; % direction<br />    return<br /><br />left = threading.Thread(target=burn, args=(&#039;Left&#039;, candle.popleft))<br />right = threading.Thread(target=burn, args=(&#039;Right&#039;, candle.pop))<br /><br />left.start()<br />right.start()<br /><br />left.join()<br />right.join()<br /></code><br /><br />$ python collections_deque_both_ends.py<br />    Left: 0<br />   Right: 10<br />    Left: 1<br />   Right: 9<br />    Left: 2<br />   Right: 8<br />    Left: 3<br />   Right: 7<br />    Left: 4<br />   Right: 6<br />    Left: 5<br />   Right done<br />    Left done<br /></pre><br /><br />Another useful capability of the deque is to rotate it in either direction, to skip over some item(s).<br /><code><br />import collections<br /><br />d = collections.deque(xrange(10))<br />print &#039;Normal        :&#039;, d<br /><br />d = collections.deque(xrange(10))<br />d.rotate(2)<br />print &#039;Right rotation:&#039;, d<br /><br />d = collections.deque(xrange(10))<br />d.rotate(-2)<br />print &#039;Left rotation :&#039;, d<br /></code><br /><br />Rotating the deque to the right (using a positive rotation) takes items from the right end and moves them to the left end. Rotating to the left (with a negative value) takes items from the left end and moves them to the right end. It may help to visualize the items in the deque as being engraved along the edge of a dial.<br /><br /><pre><br />$ python collections_deque_rotate.py<br />Normal        : deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])<br />Right rotation: deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])<br />Left rotation : deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])<br /></pre><br /><br />defaultdict:<br /><br />The standard dictionary includes the method setdefault() for retrieving a value and establishing a default if the value does not exist. By contrast, defaultdict lets you specify the default up front when it is initialized.<br /><pre><code><br />import collections<br /><br />def default_factory():<br />    return &#039;default value&#039;<br /><br />d = collections.defaultdict(default_factory, foo=&#039;bar&#039;)<br />print d<br />print d[&#039;foo&#039;]<br />print d[&#039;bar&#039;]<br /></code><br />$ python collections_defaultdict.py<br />defaultdict(&lt;function default_factory at 0x7ca70&gt;, {&#039;foo&#039;: &#039;bar&#039;})<br />bar<br />default value<br /></pre><br /><br /><br />This works well as long as it is appropriate for all keys to use that same default. It can be especially useful if the default is a type used for aggregating or accumulating values, such as a list, set, or even integer. The standard library documentation includes several examples of using defaultdict this way.<br /><br />References:<br />
<br /><br /><a href="http://en.wikipedia.org/wiki/Deque">Wikipedia: Deque</a><br /><a href="http://docs.python.org/lib/deque-recipes.html">Deque Recipes</a><br /><a href="http://docs.python.org/lib/defaultdict-examples.html">defaultdict examples</a><br /><a href="http://jtauber.com/blog/2008/02/27/evolution_of_default_dictionaries_in_python/">James Tauber: Evolution of Default Dictionaries in Python</a><br /><a href="http://www.doughellmann.com/projects/PyMOTW/">Python Module of the Week Home</a><br /><a href="http://www.doughellmann.com/downloads/PyMOTW-1.46.tar.gz">Download Sample Code</a><br />
<br />]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080325-215432</id>
		<issued>2008-03-25T00:00:00Z</issued>
		<modified>2008-03-25T00:00:00Z</modified>
	</entry>
	<entry>
		<title>[原创]Archlinux环境下Openssh-chroot的安装</title>
		<link rel="alternate" type="text/html" href="http://www.kw-gift.com/blog/index.php?entry=entry080325-143837" />
		<content type="text/html" mode="escaped"><![CDATA[1、sudo pacman -Sy openssh-chroot<br />下载并安装打过chroot补丁包的openssh，安装过程中提示你找不到screen和irss文件，你可以在安装前先行安装screen包和irssi包，也可以不用理会它。<br />2、sudo chroot_create /home/chroot<br />在/home/chroot目录下生成chroot。<br />3、sudo vi /etc/fstab<br />在fstab文件中增加如下一行:none /home/chroot/dev/pts devpts defaults 0 0<br />4、sudo cp -R /etc/profile.d /etc/security /home/chroot/etc/<br />现有的chroot_create脚本少复制/etc/profile.d/和/etc/security/两个文件夹，/etc/security/没复制的情况下，将导至无法远程登录。<br />5、sudo chroot_adduser account /home/chroot/<br />添加新帐户account到/home/chroot/目录下。<br />作完上述1-5步，一个基本的openshh-chroot环境就安装完成并增加了一个新用户。]]></content>
		<id>http://www.kw-gift.com/blog/index.php?entry=entry080325-143837</id>
		<issued>2008-03-25T00:00:00Z</issued>
		<modified>2008-03-25T00:00:00Z</modified>
	</entry>
</feed>
