<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8.4" -->
<rss version="0.92">
<channel>
	<title>Write More Bits</title>
	<link>http://blog.morebits.org</link>
	<description>Just another personal weblog</description>
	<lastBuildDate>Tue, 25 May 2010 09:12:45 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>Sending patches through your GMail account with Git</title>
		<description>Configuring git send-email to use Gmail SMTP

If you dont have the command git-send-email command then install it using apt-get install git-send-email

Then, add the correct configuration variables with the following:

$ git config --global sendemail.smtpserver smtp.gmail.com
$ git config --global sendemail.smtpserverport 587
$ git config --global sendemail.smtpencryption tls
$ git config --global sendemail.smtpuser your_email@gmail.com

Now it’s ...</description>
		<link>http://blog.morebits.org/?p=169#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>热烈庆祝struggleyb同学通过硕士论文答辩</title>
		<description>感谢老师，感谢同学，谢谢！

[caption id="attachment_161" align="aligncenter" width="200" caption="海报"][/caption]
[caption id="attachment_153" align="aligncenter" width="300" caption="答辩"][/caption]
[caption id="attachment_152" align="aligncenter" width="300" caption="决议"][/caption]
[caption id="attachment_167" align="aligncenter" width="300" caption="合影"][/caption]
 </description>
		<link>http://blog.morebits.org/?p=154#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>两个你可能不知道的scm命令</title>
		<description>bisect和blame，两个命令一般都是在出现bug的时候使用。

git bisect (hg, svn支持)

发现本来挺好的程序，合并别人的修改之后，居然出现了bug，这个时候，我们有两种方法去除bug：


调试最终程序，尝试直接找到问题所在。
如果是程序崩溃、空指针等这些明显问题，还好办，如果是复杂逻辑问题，那得花费大量时间了...


在合并来的多个commit中，逐个搜索，找到出引入bug的commit，之后通过commit的修改内容定位bug代码
这样子，将问题定位到一个commit，可以从commit的修改本身着手，从而能够很大程度上简化bug查找过程


如何定位来自对方的哪个commit造成了bug？(当然，bug可能在对方的代码中并不存在，是合并后代码共同作用的结果。)如何找出是哪个commit造成的合并结果，也是同样麻烦。
学计算机的人都知道二分搜索，加快查找速度，git bisect做的正是此事。(注意这个命令的名字，非常贴切: bisect=BInary SEarch CommiT)通过使用bisect start 设置好二分的界限，之后bisect将本地代码的状态滚动到中间的某个commit，之后，我们验证当前代码库是否有bug存在，使用bisect good/bad标志当前commit。bisect接收到指令之后，会继续在剩下的区间进行二分查找。
这命令我本身也没有使用过，第一见到其描述是在《Beautiful Code》中的一章，之后在git、hg和svn中都发现了类似的东西。感觉在处理较大规模、开发并行度较高、提交比较频繁的项目中，处理bug，可能有用。



git blame (hg, svn支持)

当你明确知道某个bug来自某行代码的时候，想知道这行代码是谁写的，然后找到该人去泄愤一下，blame正是泄愤证据的最有利提供者。blame明确输出，某行代码是某人在某个commit中写的。这命令名字取的非常到位，找到谁是可以blame的人，哈哈



 </description>
		<link>http://blog.morebits.org/?p=147#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>CGI和FastCGI的性能区别</title>
		<description>首先介绍一下我机器的配置：

byang@byang-desktop:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Pentium(R) 4 CPU ...</description>
		<link>http://blog.morebits.org/?p=139#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>GPA计算</title>
		<description>找工作时候，很多外企需要学生添写GPA，好不容易找到了一个很好的计算GPA的软件，放在自己blog希望将来谁需要可以直接过来下载。

并且，附上自己的GPA，以免将来重复计算：
本科：3.7
硕士：3.6

话说，这两个分数可是用软件“改进GPA4.0算法”计算的来的，咱分数不是特别高的，还是改进算法算出来的GPA看着舒心  ^_^ </description>
		<link>http://blog.morebits.org/?p=132#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>%iowait并不能反应磁盘瓶颈</title>
		<description>iowait实际测量的是cpu时间：
%iowait = (cpu idle time)/(all cpu time)

这个文章说的很明白，高速cpu会造成很高的iowait值，但这并不代表磁盘是系统的瓶颈。唯一能说明磁盘是系统瓶颈的方法，就是很高的read/write时间，一般来说超过20ms，就代表了不太正常的磁盘性能。为什么是20ms呢？一般来说，一次读写就是一次寻到+一次旋转延迟+数据传输的时间。由于，现代硬盘数据传输就是几微秒或者几十微秒的事情，远远小于寻道时间2~20ms和旋转延迟4~8ms，所以只计算这两个时间就差不多了，也就是15~20ms。只要大于20ms，就必须考虑是否交给磁盘读写的次数太多，导致磁盘性能降低了。

作者的文章以AIX系统为例，使用其工具filemon来检测磁盘每次读写平均耗时。在Linux下，可以通过iostat命令还查看磁盘性能。其中的svctm一项，反应了磁盘的负载情况，如果该项大于15ms，并且util%接近100%，那就说明，磁盘现在是整个系统性能的瓶颈了...
 </description>
		<link>http://blog.morebits.org/?p=125#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>南开大学本科生选课系统，研究生选课系统</title>
		<description>非常无奈，每次都要搜索才能找到这两个重要的东西，记录在此。
南开大学本科生选课系统: http://222.30.32.10
南开大学研究生选课系统: http://202.113.28.116 </description>
		<link>http://blog.morebits.org/?p=123#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>单词选择问题</title>
		<description>从n个单词中选最大数量的单词（cardinalality of subset of these n words)放到k行中，每行长度为L，但是单词的顺序不能变。知道每个单词的长度l_{i}。 设计一个算法，要求复杂度和L 无关。

乍一看，如果将每行长度L看作背包问题的容量，每个单词的长度看作物品的重量，每个单词的value都是1，貌似排列每一行都是一个背包问题。但是，一个所有物品value都为1的背包问题，已经不再是一个NPC问题了。可以用贪心算法解决，呵呵...而这一点正是，这个题目的关键...
将所有单词按照顺序编号1－n，当计算前k个单词放在一行最多能放多少个的时候，可以通过一个贪心遍历完成：

如果当前行剩余的长度能存放当前单词，则放下；
如果不能，则
     找到当前行最长的单词和当前单词比较，留下较短的

我们可以通过使用最大堆来保存已放在当前行的元素的长度，来加快程序寻找最长单词的过程。有了在O(n*lgn)时间能完成的，放置一行单词的算法之后，我们可以在此基础上，作动态规划，完成这个题目。


dp(k,n) = Max(for every j, 1 </description>
		<link>http://blog.morebits.org/?p=107#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>获取Shell最后一个参数</title>
		<description>在水木上看到这个帖子，本来觉得自己看过一遍Bash的manual已经对bash相当的了解了，没想到还有很多细节被忽略了，看来看manual和reference的时候，一定得相当的细心并且耐心才行啊...

说正事，如何显示shell脚本的最后一个参数呢？

$#这个bash内置变量记录了脚本接受到的参数个数，那么${$#}就应该可以显示最后一个参数了，可惜中括号里面是一个变量，bash作变量替换的时候，只进行一次扫描，那么上面的语法就被bash理解成了${name#substitute}这种语法了.

byang@byang-desktop:~$ echo $#
0
byang@byang-desktop:~$ echo $0
bash
byang@byang-desktop:~$ echo ${$#}
9033
byang@byang-desktop:~$ echo $$
9033
byang@byang-desktop:~$ echo ${$%}
9033
byang@byang-desktop:~$

如果要用如上方法，显示最后一个参数，那就只能让bash作两次变量替换，对，用eval。

byang@byang-desktop:~$ eval echo \${$#}
bash
byang@byang-desktop:~$ 

或者，使用bash提供的间接变量替换

byang@byang-desktop:~$ echo ${!#}
bash
byang@byang-desktop:~$

bash中以${!name}形式出现的变量替换，就是间接替换。bash首先，计算$name的值，并用它的值来替换中括号里面的值，再作一次变量替换。
这个语法，在bash的manual的一个小小的段落里面，真不明白这么重要的语法bash manual为什么不详细介绍一下。如果你在看bash manual的话，关于这种语法的介绍在3.5.3 Shell Parameter Expansion一节的第四段，或者可以打开bash manual，搜索indirect expansion，整个manual仅此一处，好好看看，别漏过去，呵呵... </description>
		<link>http://blog.morebits.org/?p=103#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
	<item>
		<title>浏览器简史</title>
		<description>在cnBeta上看到了这幅图片，感慨万千啊...
[caption id="attachment_99" align="alignleft" width="550" caption="浏览器简史"][/caption]

早在我接触电脑之前，Netscape就已经战败消失了，而Mozilla项目也早已开始...
05年开始使用Firefox，那个时候的Firefox还真的很年轻啊...
一直认为Firefox比Safari岁数大，没想到是反过来了...
早在96年，Opera浏览器就诞生了，并且应用在了无限设备上...

以前，在网络上和书本上都看过关于那场浏览器大战的介绍，今天，看来又要亲眼见证一次新的浏览器大战了，n年之后，也可以给年轻人讲述一下了... ^_^ </description>
		<link>http://blog.morebits.org/?p=98#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
			</item>
</channel>
</rss>
