Monthly Archives: May 2009

Gentoo 中文化历程之locale

gentoo的中文化一直是gentoo新手的遇到的一个特别头痛的问题,比如说,桌面的中文化,中文输入法的安装,amarok中文乱码,挂载分区的乱码,等等。
其中的一些基本问题我已经在我的博客中总结了:

http://zhongbeyond.blog.sohu.com/114005695.html   

下面我总结一下中文locale的设定:
1.
先修改locale.gen文件
#gedit /etc/locale.gen   

代码:
en_US  ISO-8859-1
en_US.UTF-8  UTF-8
zh_CN  GB18030
zh_CN.GBK  GBK
zh_CN.GB2312  GB2312
zh_CN.UTF-8  UTF-8

保存执行locale-gen:

#locale-gen  

2.建立 /etc/env.d/02locale
#gedit /etc/env.d/02locale  
 
在文本中输入:  
LANG=”zh_CN.GBK”
LC_CTYPE=”zh_CN.GBK”
LC_NUMERIC=”zh_CN.GBK”
LC_TIME=”zh_CN.GBK”
LC_COLLATE=”zh_CN.GBK”
LC_MONETARY=”zh_CN.GBK”
LC_MESSAGES=”zh_CN.GBK”
LC_PAPER=”zh_CN.GBK”
LC_NAME=”zh_CN.GBK”
LC_ADDRESS=”zh_CN.GBK”
LC_TELEPHONE=”zh_CN.GBK”
LC_MEASUREMENT=”zh_CN.GBK”
LC_IDENTIFICATION=”zh_CN.GBK”

保存后执行:
#env-update && source /etc/profile 

如果要安装scim输入法的话,你还需要建立: /etc/env.d/100i18n 文件。
#gedit /etc/env.d/100i18n

输入:
LANG=en_US.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″  

保存后执行:
#env-update && source /etc/profile

参考资料:
这个链接是官方的UTF-8指南:
http://www.gentoo.org/doc/zh_cn/utf-8.xml?style=printable  

这个链接是官方的本地化指南:
http://www.gentoo.org/doc/zh_cn/guide-localization.xml?style=printable 

init:no more processes left in this runlevel

我冲动之下,想更新gentoo 系统,步骤如下:

$ sudo emerge --sync
$ sudo emerge -avuDN world
$ sudo revdep-rebuild # app-portage/gentoolkit 包的一个工具。

可是,更新之后就出现了一个这样的问题,shutdown -h now和reboot命令出现问题了,关机和重启之后,总是会出现这样的问题:
init:no more processes left in this runlevel,
然后就一直停在这个地方。我当然不知道怎么回事,首先当然是google了。找到了这么一个帖子:

http://bugs.gentoo.org/show_bug.cgi?id=252632 
我大致看了一下,看不太明白,但是我里面有一行给我印象很深刻: 

emerge -pv udev openrc sysvinit。我按照这个命令试试,下载的软件信息里面右

 * Messages for package sys-fs/udev-141:

 * 
 * Updating persistent-net rules file
 *                                   
 * restarting udevd now.             
 *                                   
 * persistent-net does assigning fixed names to network devices.
 * If you have problems with the persistent-net rules,          
 * just delete the rules file                                   
 *      rm /etc/udev/rules.d/70-persistent-net.rules            
 * and then reboot.                                             
 *                                                              
 * This may however number your devices in a different way than they are now.                                                                     
 *                                                                       
 * If you build an initramfs including udev, then please                 
 * make sure that the /sbin/udevadm binary gets included,                
 * and your scripts changed to use it,as it replaces the                 
 * old helper apps udevinfo, udevtrigger, ...                            
 *                                                                       
 * mount options for directory /dev are no longer                        
 * set in /etc/udev/udev.conf, but in /etc/fstab                         
 * as for other directories.                                             
 *                                                                       
 * For more information on udev on Gentoo, writing udev rules, and       
 *          fixing known issues visit:                                   
 *          http://www.gentoo.org/doc/en/udev-guide.xml                  

 * Messages for package sys-apps/openrc-0.4.3-r2:

 * /etc/conf.d/rc is no longer used for configuration.
 * Please migrate your settings to /etc/rc.conf as applicable
 * and delete /etc/conf.d/rc
 * You should now update all files in /etc, using etc-update
 * or equivalent before restarting any services or this host.
 *
 * Please read the migration guide available at:
 * http://www.gentoo.org/doc/en/openrc-migration.xml
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

 * GNU info directory index is up-to-date.

 * IMPORTANT: 28 config files in '/etc' need updating.

 * IMPORTANT: 1 config files in '/usr/share/config' need updating.
 * See the CONFIGURATION FILES section of the emerge
 * man page to learn how to update config files.

 * IMPORTANT: 1 news items need reading for repository 'kde4-experimental'.
 * Use eselect news to read news items. 

呵呵,看我加蓝色的那些字体,就是那些信息就了我,虽然我还不知道怎么回事,但,使用google的信心已决~~呵呵,不知道google对我有多重要~~

感悟《数据结构与算法分析(C++描述)》中的一些超经典递归函数

在这里,我想感悟一下关于数据结构方面的经典著作《数据结构与算法分析(C++描述)》中的两个经典的递归函数。  

 

一、AVL树中的插入操作 

基本思想:由于AVL树是一种平衡树(每个节点的左右子树高度差不超过1),所以每进行一次插入操作,就有可能破坏AVL树的性质。当破坏性质之后就要进行相应的调整,调整的内容在这里我就不赘述了。

下面是作者:Mark Allen Weiss写的关于AVL树的插入函数: 

1.树节点的定义:

struct AVLNode
{
 T element;
 AVLNode* left; //左子树
 AVLNode* right; //右子树
 int height; //节点高度(节点的高度:节点的高度是指该节点到一片树叶的最长的路径长。)
 
 AVLNode(const T& eIn,AVLNode* lt = NULL,AVLNode* rt = NULL,int h = 0)
        :element(eIn),left(lt),right(rt),height(h) { }
};  

 

2.插入函数

/*x 是需要插入的数据项; t是子树的根;插入之后更新子树的根。*/
void insert(const T& x,AVLNode* & t)
{
     if(t == NULL)
        t = new AVLNode(x,NULL,NULL);//空节点
     else if(x < t -> element) //向左插入节点
     {
         insert(x,t -> left);

         if(height(t -> left) – height(t -> right) == 2) //如果破坏了AVL树的性质,进行相应调整
         {
              if(x < t -> left -> element)//向左儿子的左子树进行插入
                  rotateWithChild(t); //进行一次左单旋转
              else
                  doubleWithLeftChild(t);//进行一次左双旋转 
          }
     } 
     else if(x > t -> element) //向右插入节点
     {
          insert(x,t -> right);
         
          if(height(t -> right) – height(left) == 2) //破坏了AVL树性质
          {
              if(t -> right -> element < x) //向右儿子的右子树进行一次插入
                  rotateWithRightChild(t); //进行一次右单旋转
              else
                  doubleWithRightChild(t);//进行一次右双旋转 
          }
     }
     else //该树中已经存在该节点   
         ;      

    //更新节点高度 
     t -> height = max(height(t -> left),height(t -> right)) + 1;  

其他函数: 

(1)int max(int lhs,int rhs) //计算高度

{

     return lhs > rhs ?: rhs;

(2)int height(AVLNode* t) const //返回及节点的高度  

{

     return t == NULL ? -1:t -> height;

}   

(3)void rotateWithLeftChild(AVLNode* & k) //进行一次左单旋转

{

       AVLNode* k1 = k -> left;  

       k -> left = k1 -> right;

       k1 -> right = k;

       k -> height = max(height(k -> left),height(k -> right)) + 1;//更新根的高度   

       k1 -> height = max(height(k1 -> left),k2 -> height) + 1;//更新新根的高度

       k = k1; //新的根

(4)void doubleWithLeftChild(AVLNode* k) //进行左双旋转 

{

      rotateWithRightChild(k -> left);//先对左儿子进行一次右单旋转

      rotateWithLeftChild(k -> right);//再旋转根节点

}   

剩余的那两个旋转和这两个旋转函数是对称的,这里就不多说了。

 

请注意插入函数最后我弄成蓝色的那行代码。

     我们一般都会这么想:在插入之后判断是否还平衡,如果不平衡的话,我们就进行相应的调整。我们会编写这样的一个函数:

int calculateHeight(AVLNode* t)。 这个函数是递归的,递归的计算节点的高度。如果出现不平衡的情况,则进行相应的调整。可是,如果这样的话,就会增加一些递归的开销,实在没有必要。

     但是这个作者另辟蹊径,他不是编写递归函数,而是在递归的过程中完成,在弹栈的过程中完成了这个工作。在弹栈的过程中,首先判断在压栈的过程中经过的那些节点的左右子树的高度差,如果发现左右子树高度差超过了1,那么进行相应的调整;之后再更新节点的高度。

天才的作者,看来他对递归的过程了如指掌了:压栈,出栈~~在出栈的过程中更新节点的高度,好经典!!

 

二、左式堆的合并函数

思想:递归的合并小堆的右子堆和大堆。 以下是作者写的两个合并函数:

1.LeftistNode* merge(LefttistNode* h1,LeftistNode* h2) //合并两个子堆

{

    if(h1 == NULL)

        return h2;

    if(h2 == NULL)

        return h1;

    if(h1 -> element < h2 -> element)

        return merge1(h1,h2);//merge1函数假设第一个参数是小堆 

    else

        return merge1(h1,h2);

}      

2.//下面的这个函数假设第一个参数是小堆。

 LeftistNode* merge1(LeftistNode* h1,LeftistNode* h2)

{

      if(h1 -> left == NULL)

          h1 -> left = h2;//处理单个节点的情况,此时h1的右子树早已为空,为什么呢??呵呵~~  

      else

      {

          h1 -> right = merge(h1 -> right,h2);

          if(h1 -> left -> npl < h1 -> right -> npl)

               swapChildren(h1);//交换左右子树

        

       //风格的又一体现

         h1 -> npl = h1 -> right -> npl + 1;

       }

       return h1;

}   

说这本书是经典之作,一点都不夸张,代码写得好美!!他试图给我们养成一种思维习惯!!

家驹,beyond

   初识家驹,初识beyond,是在初二的时候。一次偶然的机会,我借了同学一盘Beyond的磁带回家听,当时听了几遍,觉得调子很好听,特别是《海阔天空》,《光辉岁月》,《真的爱你》。《海阔天空》给我一种很开阔的感觉;《光辉岁月》和《真的爱你》给我一种很轻快的感觉。

   一次在电视上看见有人点播beyond的《光辉岁月》和《岁月无声》。里面家驹赤膊的弹吉他的样子给我留下的印象好深刻,当时就感觉好亲切:自己喜欢的歌曲居然有人点播。感觉家驹弹吉他的样子真的好帅气,每一个动作透露出来的尽是一种自信,一种征服听众的感觉。我开始关注家驹,关注beyond,听不懂那些歌词我会想向邻居一位会粤语的哥们提问,终于,我慢慢的听懂了一些歌曲:《海阔天空》,《光辉岁月》~~

   终于,我再也不愿意把那盘磁带还给我同学,我用2块钱买下了那盒磁带。红色的色调,它静静地跟我度过了7个春秋,现在它依然完好地保存在我的盒子中。

   到了高中,很幸运,我遇到了一位也喜欢听beyond歌曲的老乡,他了解beyond的东西比我还多。我经常跟他聊beyond,想他学习一些关于beyond的知识,我也经常到新知图书城翻阅一些关于beyond的资料。

   一件小事,一些经历,一秒,一分,一年,足以改变一个人,更何况是三年。三年的高中改变了我,我开始变得成熟,我开始变得稳健,我开始变得自信,我开始变得开朗,我开始变得沉着。高一刚进宏志班的时候,我顿时感觉到我一无是处,我不断地提问自己:我的优越感哪去了?想当年我也是全校第一名,现在怎么会变成倒数了?我行吗??一遍一遍的提问始终找不到答案。

   我依然清晰地记得,高中的第一次期中考,我考了全班第26名(当时班里面有50名同学),全校几百名以后。理科给我的打击好大,我的数学没有及格,物理刚过六十分,化学差强人意。我顿时感觉压力从天而降:怎么这么多的强人?他们真的好难被打败。

   我需要发泄,发泄心中的不满,发泄心中的怨气,发泄心中的不平衡。我开始学会写信,写信给初中同学,写信给小学同学,告诉他们我们这个班竞争压力很大,自己很受委屈;他们当然会一如既往的鼓励我。但是他们毕竟在远方啊,怎么可能随时听我心中的那份苦楚呢?于是,这个时候,我总是会情不自禁的想起那盒红色的磁带:beyond《光辉岁月》。每次晚上睡觉之前,我总是习惯性地把那盒磁带放进我的复读机,一遍又一遍地听。

   高三这年是我心事最多的一年:家,分数,奖学金考试,英才班,年级排名~~每周一次的小测验,每月一次的月考,每三月一次的省统考,我无不为这些考试绞尽脑汁。我会为我的马虎而自责,我会为我的物理而无奈,我会期待我的数学出现奇迹,我会烦英语。每一次考试之前我都会对自己说:下次要考好。但是我还是会紧张,因为我自卑。这个时候,又是那盒《光辉岁月》救了我。每一次考试之前,我都会重复地播放《不再犹豫》,因为那样,我会获得无穷的动力,我会自信。但是面对分数,我更多的是无奈。晚上我会一个人到楼下的树林下一个散步,一个人静静的想,期待早些下课,因为我要回宿舍,我要听歌,我要听beyond的歌曲。

   高三的时候,我多了一个习惯:睡觉之间听那盒磁带,静静地听。

 

听《光辉岁月》: 

   听家驹对黑人领袖曼德拉总统的赞美。每个人心中都有这样或者那样的偶像和喜欢的人,从他的歌声中,我知道,我应该学习他们的哪些方面,那激昂的调子会让我兴奋得睡不着觉;我会联想他弹吉他的样子,他身上透露出的那种自信试图征服现场的每一位观众,包括钟一钧,他的忠实听众。每次我总是情不自禁的哼那段哨子,心情顿时开阔不少;而他那经典的“我爱你”手势,早已铭记在我的心田。

 

听《不再犹豫》:

   高中每次考试之前,我总是习惯性的听《不再犹豫》。“达到理想不太易”,我理解,要实现心中的理想真的不太容易,幸亏有beyond,有家驹,我不然我总是以为随便随便就可以成功,天上总是会掉馅饼,总是想不劳而获。

   于是,我不再急躁,一步一步地提高,慢慢地做好每一步:数学不好,我可以做好多的题目,终于,我也可以考上120分;英语不好,我可以背单词,我可以读英语,我可以做完型填空,呵呵,原来我也可以考及格的。

 

 

听《海阔天空》:

   我会为家驹身上那种开阔的胸襟所折服,我会为2003年北京beyond的那份不放弃的精神而感动得泪水直流。如果说家驹在《海阔天空》中说“跌倒了不要紧”,那么2003年的beyond已经是一种升华:家驹走了,他们还能走下去吗?

   很多家驹迷一直被这个问题所困扰;但是这次他们证明了,他们行,虽然家驹走了,但是他们还要开演唱会,开世界巡回演唱会,以此来实现家驹心中的那个未实现的梦想。 我呢?告诉自己说:再来一次。

 

 

听《午夜怨曲》:

  当初,家驹帮别人弹吉他,但是家驹很不小心,把别人的吉他弦给拨断了,那人对家驹说:你永远也不会弹吉他。可是,家驹真的不服气,因为他从来都是那么好胜,他鄙视那些看不起他的人。于是,他不断地练习,直到手指都夹出血为止。正如这首歌里面所写的那样:“再次听到昨日的冷嘲”,“冷笑变作故事的作者”,他总是那么上进,或许,我这方面性格或多或少受这首歌曲的影响。 

 

听《再见理想》:

 

   在唱这首歌之前,他讲了这么一些话:“我们Beyond在这几年间经历了很多东西~~从我们没有机会直至有机会,一路在改变,我们有开心有不开心,但是都不要紧,我们Beyond会永远夹Band夹到我们的手指不会弹为止,坚持我们乐队之前的信念,希望大家的想法跟我们的一样。一首很旧很旧的歌,这首歌讲出了我们在早期时间一些玩音乐的感觉~~一种孤独与落寞的感觉。” 

创办这个乐队的辛酸和落寞都写在这首歌曲里面了,大家都说:一些事情只有自己经历过了才知道。真的,那种孤独和落寞只有beyond才能体会得到:“独坐在路边街头,冷风吹醒,慢慢地伴着我的孤影”,“只想将吉他紧抱,诉出辛酸”。

 

 

听《谁伴我闯荡》:

   每次我听这首歌曲,我的眼里总是擒满了泪水,好想哭。前奏把内心的那种孤独感和落寞感表达得淋漓尽致。

   每次我感到孤独,寂寞和浮躁的时候,我总是要听这首歌。大一的时候,虽然目标很明确:编程.但是累的时候总是会很浮躁,很不自信:我这样能找到工作吗?我这样会不会变成一个孤僻的一个人?我会不会找不到老婆?我的视力会不会急剧下降?这样努力,我为的是什么?我值得这样做吗?

   带着一系列的问题,我只能在这首歌中找到答案。原来家驹也跟我一样有这样的感觉:“前路是哪方?谁伴我闯荡?”,“沿路没有指引,若我走上又是狭巷。”。但是他终于还是想通了:“只有淡忘”,“只有顽强”。

   听歌的时候,我总是联想,联想到那些在冰天雪地里面卖冰糖葫芦的人;联想到我家乡那些“脸朝黄土背朝天”的亲戚们;联想到那些吃了上顿没下顿的人们~~~于是,我对自己说:如果你都这样了想了,他们呢?

   我终于想通了,我不累,我是在为以后的生活奋斗啊,“只有淡忘”,“只有顽强”。

 

 

听《真的爱你》:

   我知道,我要理解母亲的一言一行;我要做个孝顺的孩子,不让母亲受苦受累;我要学会珍惜。

 

   家驹之于我,beyond之于我,已经是一种精神象征,我的生活中不可能少了家驹和beyond的歌声,即使在未来。