<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.3" -->
<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/"
	>

<channel>
	<title>沙漠之周的blog</title>
	<link>http://smzz.org/blog</link>
	<description>Free as in Freedom</description>
	<pubDate>Tue, 22 Jul 2008 14:26:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>
	<language>en</language>
			<item>
		<title>按计划行事</title>
		<link>http://smzz.org/blog/2008/07/22/develop-with-pleasure/</link>
		<comments>http://smzz.org/blog/2008/07/22/develop-with-pleasure/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 14:26:29 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>快乐开发 | developer</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/07/22/develop-with-pleasure/</guid>
		<description><![CDATA[随着时间的积累，以前大家的工作方式逐渐变得混乱，领导审时度势组织大家开了一次小会。本没有对这场中午的小会抱多大希望，但“develop with pleasure”的主题货真价实，听完之后犹如醍醐灌顶般恍然大悟，感觉以前没有头绪的事情一下子有了眉目。
对于维护上线的web项目，以往的做法是发现错误随时更正。这种松散的方式看起来很辛苦，但效率总是不高，而且还极易处于被动的地位。另外一种方式的好处就显而易见了，根据各种需求、计划、决策、反馈制定一个短期的版本计划，定期发布。根据该计划，线上的每次改动都将对应代码仓库里的一个版本，这样即便是某次发布时出现错误，也可以很容易恢复到稳定版本。除了版本发布操作，不再零散更新线上的文件。如果想灵活一些，还可以缩短计划中的开发周期。
以前没有仔细考虑过类似的问题，或许这只是项目管理中的冰山一角。其实很多事情都是相通的，就拿上文中的按计划发布版本来说，早在大学时班主任就曾多次向我们灌输计划、总结的重要性，当时可能也听了，只是没真正体会到它的重要性。
总之一句话：事前计划，事后总结。
就这。
btw，新增一个&#8221;快乐开发 &#124; developer&#8221;分类，今后用于存放类似问题。

]]></description>
			<content:encoded><![CDATA[<p>随着时间的积累，以前大家的工作方式逐渐变得混乱，领导审时度势组织大家开了一次小会。本没有对这场中午的小会抱多大希望，但“develop with pleasure”的主题货真价实，听完之后犹如醍醐灌顶般恍然大悟，感觉以前没有头绪的事情一下子有了眉目。</p>
<p>对于维护上线的web项目，以往的做法是发现错误随时更正。这种松散的方式看起来很辛苦，但效率总是不高，而且还极易处于被动的地位。另外一种方式的好处就显而易见了，根据各种需求、计划、决策、反馈制定一个短期的版本计划，定期发布。根据该计划，线上的每次改动都将对应代码仓库里的一个版本，这样即便是某次发布时出现错误，也可以很容易恢复到稳定版本。除了版本发布操作，不再零散更新线上的文件。如果想灵活一些，还可以缩短计划中的开发周期。</p>
<p>以前没有仔细考虑过类似的问题，或许这只是项目管理中的冰山一角。其实很多事情都是相通的，就拿上文中的按计划发布版本来说，早在大学时班主任就曾多次向我们灌输计划、总结的重要性，当时可能也听了，只是没真正体会到它的重要性。</p>
<p>总之一句话：事前计划，事后总结。<br />
就这。</p>
<p>btw，新增一个&#8221;快乐开发 | developer&#8221;分类，今后用于存放类似问题。
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/07/22/develop-with-pleasure/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Pure-FTPd配置笔记</title>
		<link>http://smzz.org/blog/2008/07/06/pure-ftpd-configure-note/</link>
		<comments>http://smzz.org/blog/2008/07/06/pure-ftpd-configure-note/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 02:08:44 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>Web服务 | LAMP</category>
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/07/06/pure-ftpd-configure-note/</guid>
		<description><![CDATA[以前曾用过Pure-FTPd提供的ftp服务，作为ftp的服务器端，其类似linux下useradd/usermod/passwd工具的用户管理方式，令人印象深刻。最近正好需要配置一台ftp服务器，当然首选这款有良好安全性口碑的Pure-FTPd。
基本需求是这样的：
    虚拟用户 - 也就是说提供的ftp用户在系统里并不存在
    权限 - 每个用户对自己目录拥有读写权限，但不允许访问其他目录
    虚拟目录 - 每个用户目录下面需要添加一个只读的公有目录
以下为配置过程：
1. 安装
当前最新版本为1.0.21，可从官方网站下载。
wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.21.tar.gz
tar zxvf pure-ftpd-1.0.21.tar.gz
cd pure-ftpd-1.0.21
./configure --prefix=/usr/local/stow/pure-ftpd-1.0.21 --with-puredb
make
sudo make install
其中，&#8211;with-puredb 选项代表虚拟用户支持
2. 创建用户
出于安全以及管理方便，我们让虚拟用户共享同一个系统用户。
首先，在系统中添加相应的用户和组，这里以ftpuser和ftpgroup为例：
/usr/sbin/groupadd ftpgroup
/usr/sbin/useradd -g ftpgroup -d /dev/null -s /etc ftpuser
创建虚拟用户的命令是这样的：
pure-pw useradd smzz -u ftpuser -d /home/ftpusers/smzz
其中， -u将虚拟用户 smzz 同系统用户 ftpuser 关联在一起。-d参数使 smzz 只能访问其 home 目录。而如果想让他访问整个文件系统，可以用 -D 选项。
此外，pure-pw [...]]]></description>
			<content:encoded><![CDATA[<p>以前曾用过Pure-FTPd提供的ftp服务，作为ftp的服务器端，其类似linux下<kbd>useradd</kbd>/<kbd>usermod</kbd>/<kbd>passwd</kbd>工具的用户管理方式，令人印象深刻。最近正好需要配置一台ftp服务器，当然首选这款有<a href="http://www.google.com/search?hl=en&#038;newwindow=1&#038;client=firefox-a&#038;rls=org.mozilla%3Aen-US%3Aofficial&#038;hs=RxJ&#038;q=pure-ftpd+%E5%AE%89%E5%85%A8&#038;btnG=Search" target="_blank">良好安全性口碑</a>的Pure-FTPd。</p>
<p>基本需求是这样的：<br />
    虚拟用户 - 也就是说提供的ftp用户在系统里并不存在<br />
    权限 - 每个用户对自己目录拥有读写权限，但不允许访问其他目录<br />
    虚拟目录 - 每个用户目录下面需要添加一个只读的公有目录</p>
<p>以下为配置过程：<br />
1. 安装<br />
当前最新版本为1.0.21，可从<a href="http://www.pureftpd.org/" target="_blank">官方网站</a>下载。<br />
<code>wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.21.tar.gz<br />
tar zxvf pure-ftpd-1.0.21.tar.gz<br />
cd pure-ftpd-1.0.21<br />
./configure --prefix=/usr/local/stow/pure-ftpd-1.0.21 --with-puredb<br />
make<br />
sudo make install</code></p>
<p>其中，<kbd>&#8211;with-puredb</kbd> 选项代表虚拟用户支持</p>
<p>2. 创建用户<br />
出于安全以及管理方便，我们让虚拟用户共享同一个系统用户。<br />
首先，在系统中添加相应的用户和组，这里以ftpuser和ftpgroup为例：<br />
<code>/usr/sbin/groupadd ftpgroup<br />
/usr/sbin/useradd -g ftpgroup -d /dev/null -s /etc ftpuser</code></p>
<p>创建虚拟用户的命令是这样的：<br />
<kbd>pure-pw useradd smzz -u ftpuser -d /home/ftpusers/smzz</kbd><br />
其中， -u将虚拟用户 smzz 同系统用户 ftpuser 关联在一起。-d参数使 smzz 只能访问其 home 目录。而如果想让他访问整个文件系统，可以用 -D 选项。</p>
<p>此外，<kbd>pure-pw useradd</kbd> 的选项还有：</p>
<dl>
<dt>-t 下载带宽限制</dt>
<dd>-T 上传带宽限制</dd>
<dt>-n 最大文件数目</dt>
<dd>-N 磁盘配额(单位M)</dd>
<dt>-q 上传速度限制</dt>
<dd>-Q 下载速度限制</dd>
<dt>-r 允许某些ip/网段的客户端访问</dt>
<dd>-R 拒绝某些ip/网段的客户端访问</dd>
<dt>-i 允许本地某些ip/网段访问(allow local host)</dt>
<dd>-I 拒绝本地某些ip/网段访问(deny local host)</dd>
<dt>-y 同时最大连接数目</dt>
<dt>-z 允许连接服务器的时间段，格式hhmm-hhmm，如 -z 0412-1618代表用户只能在凌晨4点12分至下午4点18分连接服务器</dt>
<dt>-f passwd_file</dt>
<dt>-F puredb_file</dt>
<dt>-m </dt>
</dl>
<p>2. 更改用户<br />
同 <kbd>pure-pw adduser</kbd> 唯一不同的是，使用 <kbd>pure-pw usermod</kbd> 不是创建一个用户，而是更改已经存在用户的某些属性。<br />
如果想禁用某些属性，可直接添加空值，比如<kbd>pure-pw usermod -n &#8216;&#8217;</kbd>代表不限制文件数目</p>
<p>3. 更改密码<br />
<kbd>pure-pw passwd smzz -m</kbd><br />
所有这些参数都有一个共同选项 -m ，它代表修改完毕之后不必重启Pure-FTPd以及重新生成puredb_file文件</p>
<p>此外，还有类似<kbd>userdel</kbd>命令的子选项<kbd>pure-pw userdel</kbd>。</p>
<p>4. 提交更改<br />
所有用户操作必须提交更改，方能生效。目前有两种形式<br />
 a) 通过<kbd>pure-pw mkdb</kbd>重新生成数据文件(/etc/pureftpd.pdb)<br />
 b) 用户操作时带上-m选项，比如 <kbd>pure-pw passwd smzz -m</kbd></p>
<p>5. 开启服务<br />
/usr/local/sbin/pure-ftpd -j -lpuredb:/etc/pureftpd.pdb &#038;<br />
其中，-j代表用户第一次登录将会创建自己的home目录，-l代表验证方式<br />
此外，匿名、配额、发呆设置、日志文件等选项均可通过相关参数在pure-ftpd启动时设置</p>
<p>6. 虚拟目录<br />
Pure-FTPd并不支持类似windows下ftp服务器那样的虚拟目录，但可以通过其他方式变相实现，比如<br />
<kbd>mount &#8211;bind /home/my_apps/lib /home/ftpusers/smzz/lib</kbd></p>
<p>todo:<br />
pure-ftpd的诸多参数</p>
<p>参考：<br />
    <kbd>man pure-ftpd</kbd><br />
    <kbd>man pure-pw</kbd><br />
    <a href="http://www.workgroup.cn/?q=node/66" target="_blank">pure-ftpd用户管理</a></p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/07/06/pure-ftpd-configure-note/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>晒晒我的空间</title>
		<link>http://smzz.org/blog/2008/06/11/show-smzz-blogs/</link>
		<comments>http://smzz.org/blog/2008/06/11/show-smzz-blogs/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 16:18:26 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>生活点滴 | Life</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/06/11/show-smzz-blogs/</guid>
		<description><![CDATA[都说狡兔三窟，其实我经常活动的地点远不止三个（大大地狡猾）。趁着这两天紧张工作一时停下来不知该做些什么，我决定晒晒这些空间们。

大学的班级网站
http://caoye012.org/zhouguoqiang/blog/
这里应该是我的主场
周家
http://zhoume.org/guoqiang/blog/
注册这个域名，是想提供给家里的兄弟姐妹们用的。本来想教育他们有空多接触点儿其他事物，别老是上qq。始料未及的是，曾几何时我都开通了自己的qq空间。信服力随时打了很多折扣。。。:(
qq空间
http://user.qzone.qq.com/16488112/
上面的地址是不是有暴露qq号码的嫌疑？随他去吧。关于qq空间，大家都比我熟，不多做解释。
沙漠之周的博客
http://smzz.org/blog/
名为博客，实际都快沦落成了我的工作笔记。可能十分枯燥，不喜者误入。
豆瓣
http://www.douban.com/people/smzz/
虽然最近读书越来越少。。。
del.icio.us(美味书签)
http://del.icio.us/smzz/
严格而言，这个书签算不上空间，但毕竟是个很不错的工具，干脆一块晒一下。btw，每每找房子的时候这个书签就摇身一变，成了我搜集房源的工具了&#8230; 有标签rent2006/2007/2008为证。

That&#8217;s all.
请大家对号入座。
对了，顺便借机做个广告，前段时间胡乱整理了一个关于俺们县城的网站枣乡内黄(http://neihuang.org/)。热烈欢迎诸位，尤其是枣乡游子们，多多光临！
(本文首发于沙漠之周@草业012)

]]></description>
			<content:encoded><![CDATA[<p>都说狡兔三窟，其实我经常活动的地点远不止三个（大大地狡猾）。趁着这两天紧张工作一时停下来不知该做些什么，我决定晒晒这些空间们。</p>
<dl>
<dt>大学的班级网站</dt>
<dd><a href="http://caoye012.org/zhouguoqiang/blog/" title="沙漠之周@草业012" target="_blank">http://caoye012.org/zhouguoqiang/blog/</a></dd>
<dd>这里应该是我的主场</dd>
<dt>周家</dt>
<dd><a href="http://zhoume.org/guoqiang/blog/" title="国强@周家" target="_blank">http://zhoume.org/guoqiang/blog/</a></dd>
<dd>注册这个域名，是想提供给家里的兄弟姐妹们用的。本来想教育他们有空多接触点儿其他事物，别老是上qq。始料未及的是，曾几何时我都开通了自己的qq空间。信服力随时打了很多折扣。。。:(</dd>
<dt>qq空间</dt>
<dd><a href="http://user.qzone.qq.com/16488112/" title="沙漠之周的qq空间" target="_blank">http://user.qzone.qq.com/16488112/</a></dd>
<dd>上面的地址是不是有暴露qq号码的嫌疑？随他去吧。关于qq空间，大家都比我熟，不多做解释。</dd>
<dt>沙漠之周的博客</dt>
<dd><a href="http://smzz.org/blog/" title="沙漠之周的博客" target="_blank">http://smzz.org/blog/</a></dd>
<dd>名为博客，实际都快沦落成了我的工作笔记。可能十分枯燥，不喜者误入。</dd>
<dt>豆瓣</dt>
<dd><a href="http://www.douban.com/people/smzz/" title="smzz@豆瓣" target="_blank">http://www.douban.com/people/smzz/</a></dd>
<dd>虽然最近读书越来越少。。。</dd>
<dt>del.icio.us(美味书签)</dt>
<dd><a href="http://del.icio.us/smzz/" target="_blank">http://del.icio.us/smzz/</a></dd>
<dd>严格而言，这个书签算不上空间，但毕竟是个很不错的工具，干脆一块晒一下。btw，每每找房子的时候这个书签就摇身一变，成了我搜集房源的工具了&#8230; 有标签rent2006/2007/2008为证。</dd>
</dl>
<p>That&#8217;s all.<br />
请大家对号入座。</p>
<p>对了，顺便借机做个广告，前段时间胡乱整理了一个关于俺们县城的网站<a href="http://neihuang.org/" target="_blank" title="枣乡内黄">枣乡内黄(http://neihuang.org/)</a>。热烈欢迎诸位，尤其是枣乡游子们，多多光临！</p>
<p>(本文首发于<a href="http://caoye012.org/node/832/" target="_blank">沙漠之周@草业012</a>)
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/06/11/show-smzz-blogs/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>根据搜索结果下载驱动之家某型号笔记本驱动程序</title>
		<link>http://smzz.org/blog/2008/06/06/download-drivers-by-shell/</link>
		<comments>http://smzz.org/blog/2008/06/06/download-drivers-by-shell/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 16:01:48 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/06/06/download-drivers-by-shell/</guid>
		<description><![CDATA[以Sony VGN-CR31这款为例，本脚本(实为命令集，笔者注)通过分析搜索页面、下载页面，最后将结果存放于相应文件(drivers_*.txt)中，同时并下载相应文件。详细见源文件：
#!/bin/bash

mkdir drivers
cd drivers/
echo > /tmp/zgq.txt
echo -n > drivers_url.txt
echo > drivers_id.txt
echo > drivers_title.txt

for i in $(seq 1 4); do
        curl http://drivers.mydrivers.com/drivers-1102-875-Sony/VGN-CR31/0-0-0-0/$i >> /tmp/zgq.txt
done

iconv -f gbk -t utf8 /tmp/zgq.txt > /tmp/zgq_1.txt

cat /tmp/zgq_1.txt &#124; grep '&#60;a href="/drivers/' &#124; awk -F'&#60;/a&#62;' '{print $1}' &#124; grep desc > /tmp/zgq.txt

cat /tmp/zgq.txt &#124; awk [...]]]></description>
			<content:encoded><![CDATA[<p>以Sony VGN-CR31这款为例，本脚本(实为命令集，笔者注)通过分析搜索页面、下载页面，最后将结果存放于相应文件(drivers_*.txt)中，同时并下载相应文件。详细见源文件：</p>
<pre>#!/bin/bash

mkdir drivers
cd drivers/
echo > /tmp/zgq.txt
echo -n > drivers_url.txt
echo > drivers_id.txt
echo > drivers_title.txt

for i in $(seq 1 4); do
        curl http://drivers.mydrivers.com/drivers-1102-875-Sony/VGN-CR31/0-0-0-0/$i >> /tmp/zgq.txt
done

iconv -f gbk -t utf8 /tmp/zgq.txt > /tmp/zgq_1.txt

cat /tmp/zgq_1.txt | grep '&lt;a href="/drivers/' | awk -F'&lt;/a&gt;' '{print $1}' | grep desc > /tmp/zgq.txt

cat /tmp/zgq.txt | awk -F/ '{print $3}' > drivers_id.txt
cat /tmp/zgq.txt | awk -F'>' '{print $3}' > drivers_title.txt

for i in `cat drivers_id.txt`; do
        curl http://drivers.mydrivers.com/download/$i > /tmp/zgq.txt 2>/dev/null
        cat /tmp/zgq.txt | grep dizhi | awk -F\" '{print $6}' | awk -F= '{print $3}' | head -n 1 >> drivers_url.txt
done

wget -i drivers_url.txt -N</pre>
<p><strong style="color:red;">注：本文章仅供学习研究之用，切勿用作非法用途，否则后果自负。</strong><br />
吃水不忘打井人，还是建议多点点人家的广告，如果有时间的话。:)
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/06/06/download-drivers-by-shell/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>通过grub4dos引导vista和linux的双系统</title>
		<link>http://smzz.org/blog/2008/06/05/boot-vista-and-linux-with-grub4dos/</link>
		<comments>http://smzz.org/blog/2008/06/05/boot-vista-and-linux-with-grub4dos/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 18:34:10 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>生活点滴 | Life</category>
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/06/05/boot-vista-and-linux-with-grub4dos/</guid>
		<description><![CDATA[机子里以前装的是Win XP和Linux双系统，出于追mm以及紧跟潮流的考虑，我重新格式化装有XP的C盘，并安装了Vista。双系统的引导成了问题，从网上搜索发现，grub4dos也在与时俱进，支持vista的引导。于是我决定通过在Vista下面安装groub4dos引导Linux。
根据grub4dos的教程，我先在命令提示符下运行
bcdedit /create /d &#8220;GRUB for DOS&#8221; /application bootsector
得到了一个类似{05d33150-3fde-11dc-a457-00021cf82fb0}的id字符串
紧接着运行如下命令，
	bcdedit /set {id} device boot
	bcdedit /set {id} path grldr.mbr
	bcdedit /displayorder {id} /addlast
其中，{id}就是先前得到的带花括号的id字符串。
然后，将GRLDR.MBR拷贝至Vista系统盘的根目录下，如C:\。同时，也将GRLDR和menu.lst拷到系统盘的根目录下(readme文件里说的是任意FAT16/FAT32/EXT2/NTFS分区的根目录下均可，不过我没来得及尝试)。
需要注意的是，C:\GRLDR文件本来就存在，任意改个名字即可。
然后修改Grub4dos的菜单文件(C:\menu.lst)和配置Windows的系统启动(系统属性 / 高级 / 启动故障和恢复)即可。
附上我的menu.lst文件内容，均可以正常启动：
color black/cyan yellow/cyan
timeout 30
default /default

title Windows Vista
find --set-root /bootmgr
chainloader /bootmgr

title Slackware 12.0
root (hd0,6)
kernel /boot/vmlinuz root=/dev/sda7 ro vga=791
与2k/xp不同的是，先进入grub4dos的界面，然后可进入Vista的引导界面。文件名等种种迹象标明，vista的启动管理器似乎是将grub4dos写在MBR里了。
Update:
某激活软件用的也是grub4dos，进行上面某一项设置的时候可能会导致无法激活。如果是多系统，建议通过Linux将Grub重新写在MBR，再通过Grub引导windows。不推荐使用grub4dos，感觉更混乱。
btw，通过live cd或硬盘进入linux，运行grub进入grub>提示符界面后，可通过如下命令恢复mbr:
grub>root (hd0,3) #指定linux分区所在位置
grub>setup  (hd0) #将grub装到/dev/hda的MBR区。
grub>quit #大功告成，退出grub界面
]]></description>
			<content:encoded><![CDATA[<p>机子里以前装的是Win XP和Linux双系统，出于追mm以及紧跟潮流的考虑，我重新格式化装有XP的C盘，并安装了Vista。双系统的引导成了问题，从网上搜索发现，grub4dos也在与时俱进，支持vista的引导。于是我决定通过在Vista下面安装groub4dos引导Linux。</p>
<p>根据grub4dos的教程，我先在命令提示符下运行<br />
<kbd>bcdedit /create /d &#8220;GRUB for DOS&#8221; /application bootsector</kbd><br />
得到了一个类似<kbd>{05d33150-3fde-11dc-a457-00021cf82fb0}</kbd>的id字符串<br />
紧接着运行如下命令，</p>
<pre>	bcdedit /set {id} device boot
	bcdedit /set {id} path grldr.mbr
	bcdedit /displayorder {id} /addlast</pre>
<p>其中，{id}就是先前得到的带花括号的id字符串。</p>
<p>然后，将GRLDR.MBR拷贝至Vista系统盘的根目录下，如C:\。同时，也将GRLDR和menu.lst拷到系统盘的根目录下(readme文件里说的是任意FAT16/FAT32/EXT2/NTFS分区的根目录下均可，不过我没来得及尝试)。</p>
<p>需要注意的是，C:\GRLDR文件本来就存在，任意改个名字即可。</p>
<p>然后修改Grub4dos的菜单文件(C:\menu.lst)和配置Windows的系统启动(系统属性 / 高级 / 启动故障和恢复)即可。</p>
<p>附上我的menu.lst文件内容，均可以正常启动：</p>
<pre>color black/cyan yellow/cyan
timeout 30
default /default

title Windows Vista
find --set-root /bootmgr
chainloader /bootmgr

title Slackware 12.0
root (hd0,6)
kernel /boot/vmlinuz root=/dev/sda7 ro vga=791</pre>
<p>与2k/xp不同的是，先进入grub4dos的界面，然后可进入Vista的引导界面。文件名等种种迹象标明，vista的启动管理器似乎是将grub4dos写在MBR里了。</p>
<p><strong>Update:</strong><br />
某激活软件用的也是grub4dos，进行上面某一项设置的时候可能会导致无法激活。如果是多系统，建议通过Linux将Grub重新写在MBR，再通过Grub引导windows。<del>不推荐使用grub4dos</del>，感觉更混乱。</p>
<p>btw，通过live cd或硬盘进入linux，运行grub进入grub>提示符界面后，可通过如下命令恢复mbr:</p>
<pre>grub>root (hd0,3) #指定linux分区所在位置
grub>setup  (hd0) #将grub装到/dev/hda的MBR区。
grub>quit #大功告成，退出grub界面</pre>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/06/05/boot-vista-and-linux-with-grub4dos/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Linux Shell学习笔记</title>
		<link>http://smzz.org/blog/2008/06/02/linux-shell-abc/</link>
		<comments>http://smzz.org/blog/2008/06/02/linux-shell-abc/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 14:44:43 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/06/02/linux-shell%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0/</guid>
		<description><![CDATA[年后准备的会议材料，一直没用上。本着共享的精神，拿出来晒晒吧。
Linux Shell ABC
0. 关于shell
0.1 常见的shell
    ---------------------------------------------
        shell               path            name
    ---------------------------------------------
    rc    [...]]]></description>
			<content:encoded><![CDATA[<p>年后准备的会议材料，一直没用上。本着共享的精神，拿出来晒晒吧。</p>
<pre>Linux Shell ABC
0. 关于shell
0.1 常见的shell
    ---------------------------------------------
        shell               path            name
    ---------------------------------------------
    rc                  /usr/bin/rc         rc
    Bourne shell        /usr/bin/sh         sh
    C shell             /usr/bin/csh        csh
    Bourne Again shell  /bin/bash           bash
    Z shell             /usr/local/bin/zsh  zsh
    Korn shell          /usr/bin/ksh        ksh
    TC shell            /usr/bin/tcshell    tcsh
0.2 shell的启动、更改和退出
    更换shell:
        输入相应的命令可更改
    退出:
        - 输入exit后按<enter>
        - 在空行上键入< ^D>
0.3 shell环境变量
    可通过set命令查看，常见的有：
    HOME
    HOSTNAME
    LANG
    LC_CTYPE
    MAIL
    PS1
    PATH
    PWD
    SHELL
    TERM
    UID
    MAIL
0.4 shell元字符
    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#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;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
    New Line    结束命令行
    Space       分隔命令行中的元素
    Tab         分隔命令行中的元素
    #           注释
    &#8221;           引用多字符，允许替换
    $           结束一行；间接引用shell变量         uid:&#8221;$UID&#8221;
    &#038;           让命令到后台执行                    command &#038;
    &#8216;           引用多字符                          &#8216;$UID&#8217;
    ( )         执行子shell中的命令列表
    *           匹配0个或多个字符                   ls /etc/p*sswd
    [ ]         插入通配符                          ls /etc/rc[0-6].d
    ^           开始一行以及否定符号
    `           命令替换                            NAME=`echo zgq`
    { }         在当前shell中执行命令列表
    |           创建命令之间的管道                  ls | wc -l
    ;           顺序执行命令                        date; sleep 1; date
    >           命令的重定向输出                    echo > /tmp/test.txt
    < 命令的重定向输入                    wc -l < /tmp/test.txt
    ?           通配符为单个字符                    ls /etc/pass??
    /           路径分隔符
               转义字符
    !           启动历史列表中指定的事件以及当前事件 !vi
    ~           home目录                            echo ~

0.5 Bash相关配置文件
    /etc/profile
        登录时的系统初始化文件
    ~/.bash_profile
        登录时用户专有的初始化文件
    ~/.bashrc
        登录以及每打开一个交互shell，用户专有的初始化文件
    ~/.bash_logout
        用户退出时执行的文件
    ~/.inputrc
        Individual readline initialization file 

1.运行Shell脚本
    - 增加文件可执行权限
        $ chmod +x script_file
    - 直接通过shell命令执行
        $ /bin/sh script_file
        $ /bin/bash script_file
    - 脚本文件开头指定shell
        #!/bin/bash
2. Shell变量及其相关命令
    - 可写环境变量
    - 只读环境变量
        环境变量    含义
        $0          程序名
        $1 - $9     第1-9个命令行参数的值
        $*          所有命令行参数的值
        $@          所有命令行参数的值(如果它被包含在引号中，如"$@"，
                    则每个参数也将各自被包含在引号中)
        $#          命令行参数的总数
        $$          当前的进程ID(PID)
        $?          上一条命令的退出状态(0 - 成功，其他输出 - 失败)
        $!          最近后台进程(在后台运行的最后一个进程)的进程ID
     - 相关命令
        - set
        - env(不如set命令完整)
    2.1 读写shell变量
        variable1=value1 [variable2=value2 ... variableN=valueN]
        注意:
            - 等号(=)前后没有空格，如果值中含有空格，须使用引号将这个值括起。
            - 多个赋值语句可写在一行，但必须用空格或分号分隔
        $ name=Guoqiang
        $ echo $name
        Guoqiang
        $ name='Zhou Guoqiang'
        $ echo $name
        Zhou Guoqiang

        $ my_uid='$UID'
        $ echo $my_uid
         $UID
        $ my_uid="$UID"
        $ echo $my_uid
        1000
    2.2 命令替换
        `command`
        $ echo now: `date`
        now: Sun Mar 23 17:44:36 CST 2008

        $ now="date: `date`"
        $ echo $now
        date: Sun Mar 23 17:45:45 CST 2008

        $ now='date: `date`'
        $ echo $now
        date: `date`
    2.3 导出环境变量
        命令export可以向后继shell进程传递变量的值
        export [name-list]
    2.4 重置变量
        unset [name-list]
    2.5 创建只读用户自定义变量
        readonly [name-list]
        类似PHP中的常量
        $ name=zgq gender=male
        $ readonly name gender
        $ echo $name $gender
        zgq male
        $ name=zhang3 gender=female
        bash: name: readonly variable
    2.6 读取标准输入
        read variable-list
3. 脚本参数传递
    - 9个参数($1 - $9)有时不够用
      可以使用shift命令将参数左移N个位置
        shift [N]
    - set [options] [argument-list]
      依次将各位置参数的值设为argument-list中指定的参数
      如果不带任何参数，set将显示所有shell变量以及他们当前的值
4. 注释与程序头
    #!/bin/bash
    #
    #
    #
5. 程序控制
    1. if-then-elif-else-fi语句
        if expiression
        then
            elif expression
            then
                ...
            else
                ...
        fi
      - expression可以使用test命令也可以使用括号
        if test $# -eq 0
        等价为:
        if [ $# -eq 0 ]
        (注意[和]前后的空格)
    2. for语句
        for variable [in argument-list]
        do
            command-list
        done

        如果没有提供argument-list，参数由命令行提供
    3. while语句
        while expression
        do
            command-list
        done

        如果死循环，就<^C>吧
    4. until语句
        until expiression
        do
            command-list
        done
    5. break和continue命令
    6. case语句
        case test-string in
            pattern1)
                command-list1
            ;;
            pattern2)
                command-list2
            ;;
            patternN)
                command-listN
            ;;
            *)
                end-command-list
            ;;
        esac

6. 常用命令集锦
    - 杀死firefox进程
      $ ps aux | grep firefox | grep -v grep |cut -c 9-15 |xargs kill -9
    - 将当前目录下php文件中的foo题换成bar
      $ sed *php -in-place -e&#8217;s/foo/bar/g&#8217;
    - 根据ip查看bbs.insenz.com的访问次数
      $ cat  bbs.insenz.com-access_log  | awk &#8216;{print $1}&#8217; | sort | uniq -c | sort -nr
    - 查看远程服务器的磁盘空间状况
      $ ssh zhouguoqiang@10.0.1.33 &#8216;df -h&#8217;
    - 查看svn副本中某两个目录下的代码总行数
      $  find src/ tests/ -type f | grep -v .svn | xargs wc -l | awk &#8216;{ sum += $1; } END { print sum; }&#8217;

6. 参考资料
    - Unix教程(第二版)
        http://www.douban.com/subject/1809210/
    - man bash, man test
</enter></pre>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/06/02/linux-shell-abc/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>搭建svn://模式的svn服务器</title>
		<link>http://smzz.org/blog/2008/06/01/config-svn-server-with-svn-protocol/</link>
		<comments>http://smzz.org/blog/2008/06/01/config-svn-server-with-svn-protocol/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 13:29:20 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/06/01/config-svn-server-with-svn-protocol/</guid>
		<description><![CDATA[svn可支持file:///、http://、https://、svn://、svn+ssh://等多种模式访问，其中file:///模式无须任何配置，http://和https://模式需要通过配置Subversion的Apache服务器的WebDAV协议实现。下面我们配置基于svn://模式的svn服务器。
1. 安装svn相关的软件
  一般linux发行版都自带，如果没有，可去官方下载安装。
2. 创建资源库
  svnadmin create /home/svnroot/repos
3. 运行svn服务
  svnserve -d -r /home/svnroot/repos
4. 授权
    编辑 /home/svnroot/repos/conf/svnserve.conf，去掉如下两行开头的#符号，以便禁止匿名用户的读写
    anon-access = none
    auth-access = write
    password-db = passwd
5. 添加svn用户
    编辑conf/passwd文件，可以明文形式添加密码：
    yourName = yourPasswd
6. 导入仓库
    为了便于以后维护，建议每个项目使用三个顶级目录(branches、tags和trunk):
 [...]]]></description>
			<content:encoded><![CDATA[<p>svn可支持file:///、http://、https://、svn://、svn+ssh://等多种模式访问，其中file:///模式无须任何配置，http://和https://模式需要通过配置Subversion的Apache服务器的WebDAV协议实现。下面我们配置基于svn://模式的svn服务器。</p>
<p>1. 安装svn相关的软件<br />
  一般linux发行版都自带，如果没有，可去官方下载安装。</p>
<p>2. 创建资源库<br />
  svnadmin create /home/svnroot/repos</p>
<p>3. 运行svn服务<br />
  svnserve -d -r /home/svnroot/repos</p>
<p>4. 授权<br />
    编辑 /home/svnroot/repos/conf/svnserve.conf，去掉如下两行开头的#符号，以便禁止匿名用户的读写<br />
    anon-access = none<br />
    auth-access = write<br />
    password-db = passwd</p>
<p>5. 添加svn用户<br />
    编辑conf/passwd文件，可以明文形式添加密码：<br />
    yourName = yourPasswd</p>
<p>6. 导入仓库<br />
    为了便于以后维护，建议每个项目使用三个顶级目录(branches、tags和trunk):<br />
    mkdir /tmp/myproject/{branches,tags,trunk} -p</p>
<p>    可以在本地通过file:///方式导入至仓库里:<br />
    svn import /tmp/myproject file:///home/svnroot/repos/myproject -m &#8220;initial import&#8221;</p>
<p>7. 检出项目<br />
    svn svn://192.168.1.118/myproject/trunk myproject<br />
    需要输入用户名密码</p>
<p>至此，完成了svn服务的基本配置。</p>
<p>参考资料：<br />
1. <a href="http://blog.chinaunix.net/u1/58855/showart.php?id=463032" target="_blank">svn服务端搭建</a><br />
2. <a href="http://www.subversion.org.cn/svnbook/1.2/svn.intro.quickstart.html" target="_blank">svn手册</a>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/06/01/config-svn-server-with-svn-protocol/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>vim远程修改文件产生的安全隐患</title>
		<link>http://smzz.org/blog/2008/05/25/vim-edit-remote-file-cause-security-problem/</link>
		<comments>http://smzz.org/blog/2008/05/25/vim-edit-remote-file-cause-security-problem/#comments</comments>
		<pubDate>Sat, 24 May 2008 16:41:40 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>Web服务 | LAMP</category>
		<guid isPermaLink="false">http://smzz.org/blog/2008/05/25/vim-edit-remote-file-cause-security-problem/</guid>
		<description><![CDATA[刚才无意中通过浏览器看到了wordpress配置文件里的信息了，现在想想仍心有余悸。
如果你像我一样，将vim作为首选编辑器；如果你也像我一样，有时候需要远程修改文件。那么，请注意了，通过vim远程修改文件，可能会产生~结尾的备份文件，由于服务器一般都无法解释~后缀文件，这将把代码泄露给客户端。如果巧好是某个配置文件，后果更是不堪设想。
解决方法：
1. 通过设置nobackup和nowritebackup参数，取消vim的自动保存功能
2. 让web服务器解释~后缀文件

]]></description>
			<content:encoded><![CDATA[<p>刚才无意中通过浏览器看到了wordpress配置文件里的信息了，现在想想仍心有余悸。</p>
<p>如果你像我一样，将vim作为首选编辑器；如果你也像我一样，有时候需要远程修改文件。那么，请注意了，通过vim远程修改文件，可能会产生~结尾的备份文件，由于服务器一般都无法解释~后缀文件，这将把代码泄露给客户端。如果巧好是某个配置文件，后果更是不堪设想。</p>
<p>解决方法：<br />
1. 通过设置nobackup和nowritebackup参数，取消vim的自动保存功能<br />
2. 让web服务器解释~后缀文件
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2008/05/25/vim-edit-remote-file-cause-security-problem/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>禁用Vim中鼠标点击时的虚拟选中模式(visual mode)</title>
		<link>http://smzz.org/blog/2007/12/14/disable-vim-automatic-visual-mode-using-mouse/</link>
		<comments>http://smzz.org/blog/2007/12/14/disable-vim-automatic-visual-mode-using-mouse/#comments</comments>
		<pubDate>Fri, 14 Dec 2007 13:15:54 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2007/12/14/disable-vim-automatic-visual-mode-using-mouse/</guid>
		<description><![CDATA[自从升级操作系统后，Vim相应也升级到了当时的最新版7.1。可是这个Vim7.1使用鼠标时会默认进入虚拟选中模式(visual mode)，就好像通过v选中的一样。搜索一下，有人碰到过这个问题，原来可以通过下面的方式禁用：
1.命令行
:set mouse-=a
2.添加:set mouse-=a至配置文件~/.vimrc
]]></description>
			<content:encoded><![CDATA[<p>自从<a href="http://www.slackware.com/announce/12.0.php" target="_blank">升级操作系统</a>后，Vim相应也升级到了当时的最新版7.1。可是这个Vim7.1使用鼠标时会默认进入虚拟选中模式(visual mode)，就好像通过v选中的一样。搜索一下，<a href="http://www.varesano.net/blog/fabio/disable+vim+automatic+visual+mode+using+mouse" target="_blank">有人碰到过这个问题</a>，原来可以通过下面的方式禁用：<br />
1.命令行<br />
<kbd>:set mouse-=a</kbd><br />
2.添加<kbd>:set mouse-=a</kbd>至配置文件~/.vimrc</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2007/12/14/disable-vim-automatic-visual-mode-using-mouse/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>都是\n惹的祸</title>
		<link>http://smzz.org/blog/2007/12/04/trouble-with-echo-newline/</link>
		<comments>http://smzz.org/blog/2007/12/04/trouble-with-echo-newline/#comments</comments>
		<pubDate>Tue, 04 Dec 2007 14:08:38 +0000</pubDate>
		<dc:creator>smzz</dc:creator>
		
	<category>黄嘴企鹅|linux</category>
		<guid isPermaLink="false">http://smzz.org/blog/2007/12/04/trouble-with-echo-newline/</guid>
		<description><![CDATA[昨天郁闷了半天。自从发现echo和wc命令的组合可以省去我数某个字符串的长度时，我就一直使用这个超级无敌的命令组合。但是echo 之后默认带换行(\n)有时也会带来意想不到的麻烦。
比如
echo 123456789 &#124; wc --chars
10
去掉echo后面默认带的换行符，就对了：
echo -n 123456789 &#124; wc --chars
9

]]></description>
			<content:encoded><![CDATA[<p>昨天郁闷了半天。自从发现echo和wc命令的组合可以省去我数某个字符串的长度时，我就一直使用这个超级无敌的命令组合。但是echo 之后默认带换行(\n)有时也会带来意想不到的麻烦。</p>
<p>比如<br />
<code>echo 123456789 | wc --chars</code><br />
10</p>
<p>去掉echo后面默认带的换行符，就对了：<br />
<code>echo -n 123456789 | wc --chars</code><br />
9
</p>
]]></content:encoded>
			<wfw:commentRSS>http://smzz.org/blog/2007/12/04/trouble-with-echo-newline/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
