在KDE下用GVim,一直有个很怪的问题,就是最大化几乎是无效的,最大化之后可以看到右边和下边都各有一条细缝。有人说可能是GVim规定要整数的行和列,也有人说是GVim和KWin都想管理窗口,然后冲突了。

有一种比较简单的解决方法,右击GVim标题,选择Advanced,选择Fullscreen即可。

设置后效果如图所示:

这种方法效果总体较好,但是却有个很严重的缺陷。ALT+TAB看不到窗口切换的效果,这在窗口切换时是很不方便的。

这是Gvim官方的Wiki中的教程:http://vim.wikia.com/wiki/Automatically_maximizing_gvim_in_KDE

设置界面:

按照这个做法的话,也有个很大的问题,就是如果用GVim打开一个其他窗口,比如查找和替换,那个就会变成这样:

显然对GVim主窗口的设置影响到了对话框。

经过多次研究,后来发现一种办法,可以完美解决这个问题而没有这样那样的副作用。首先,和Wiki中一样,进入KWin设置界面。

选择Detach Window Properties按钮,在GVim主窗口任意位置点击一下。

看到如下界面,选择Use whole window class(specific window)。

保持Window Extra中只有Normal Window一项被选中。

这里还是和Wiki中一样的设置方法,在我电脑上,GVim大小为1280x775。

设置后效果如下,可以看到,已经最大化了。

搜索对话框还是和原来一样大小。

下面说下如何修改和删除已经设置过的KWin的规则,之前以为KWin的规则都保存在~/.kde/share/config/kwinrulesrc中,只要编辑这个文件就可以修改KWin的规则,其实是不对的,因为设置完之后再次启动GVim的话,~/.kde/share/config/kwinrulesrc会回滚到原来的设置,不知道这是什么情况。如果要修改或删除已经设置过的KWin的规则,可以启动Window Rules,启动方法如图:

在这个框口中编辑即可,编辑完后不要忘记点击Apply按钮,否则编辑还是无效的。

 

为《Linux内核源码分析》期末考试准备的文章。本来想直接贴出来,但是感觉效果不理想,还是存放在PDF里罢。
 
下载

仅仅是期末考试之后的娱乐节目而已,我们都知道软盘和FAT文件系统已经淘汰N个世纪了。

首先,想必如今没有人家中还在使用软盘,大部分电脑也已经不再附带软驱了,我的本本就是。所以这里的软盘是虚拟出来的。

[bachue@localhost ~]$ dd if=/dev/zero of=floppy.img bs=1024 count=1440
1440+0 records in
1440+0 records out
1474560 bytes (1.5 MB) copied, 0.0217136 s, 67.9 MB/s
[bachue@localhost ~]$ mkfs.vfat floppy.img
mkfs.vfat 3.0.9 (31 Jan 2010)

用dd创建一个1440×1024字节,即1.44MB的虚拟磁盘,按照vfat文件系统进行格式化,就可以模拟出软盘了。

然后使用虚拟机,这里使用的是VMware Player,具有挂载虚拟软盘的功能,据我所知,另一个带有此功能的是微软的虚拟机VPC,而开源界用的较多的VirtualBox,我没有找到这个功能。

在虚拟机中挂载软盘。毫无疑问,使用Linux自己的挂载功能是完全可以的,但是使用Windows,更有实战的味道。(搞笑,谁这年头还会拿个软盘来让你恢复?)

挂载成功。

随便写点神马吧。。表太和谐就行。

文件写入完毕

假设现在出现误操作,删了文件

表痛哭流涕,回Linux修复去。

继续阅读

Fedora 14下编译安装chmsee 1.3.0

2011年2月26日 11:38

chm文件全名是Microsoft Compiled HTML Help,看名字也猜得出是微软的格式,Windows操作系统自带它的阅读器,chm普遍用于帮助文件和电子书,但在国内,他的应用范围更广,几乎很多在线文档本地化后都采用这个格式。一般做技术的不可能不接触它,但是一般Linux发行版本不自带chm的阅读器,只能安装软件,chmsee就是我所用过最好的chm阅读器了,他还是一款国产软件,我猜之所以看不到比他更好地国外软件,也许是因为中国人更有需求吧。

项目地址:http://code.google.com/p/chmsee/

但是Fedora 14的chmsee包有点奇怪,只有1.1.0版本,没有最新的1.3.0版本。1.1.0的Bug很厉害,影响了正常使用,最新版本则修复了这些Bug。但是Fedora 14没有chmsee最新版本,我在网上也没有搜索到适合Fedora的RPM包,惟一的OpenSUSE的RPM包使用yum localinstall安装仍有不能解决的依赖关系,这使得我们不得不用源码来编译安装了。

我看到项目网站上解释他没有发布二进制安装文件的原因是“Linux 的发行版太多了,还是只发布源码比较省事”,我不否认这种说法的正确性,但也不能否认源码编译安装对我这种Linux菜鸟而言确实非常困难。主要原因当然是缺乏库文件,而且一旦缺乏,我往往不知道该下载哪个包来解决,如果出现RPM包常见的依赖性地狱,更是让我绝望,所以,除非确实找不到二进制包并且需求这个软件,否则我绝对不会去编译源代码。

我看到他的项目文件讲了依赖如下:

cmake >= 2.6.4
gtk2 >= 2.18
xulrunner >= 1.9
chmlib
libxml2
libgcrypt
intltool
幸运的是,Yum库中这些软件全都有,不幸的是,安装了后连cmake都通不过,还是有大量库文件缺乏。后来猜测他的库文件可能不是放在这些可执行的程序中,而是放在devel包中,因此尝试安装了他们的devel包,结果竟然成功了(后来发现项目文件中说的很清楚:Before compiling, you need to check following libraries or their development packages already installed on your system.可惜我一开始没有注意),只要cmake一通过,就不会再有依赖性问题了,安装非常成功。下面复述下正确的依赖。
 
cmake
gtk2-devel
xulrunner-devel
chmlib-devel
libxml2-devel
libgcrypt-devel
intltool
版本方面不用担心,Yum库中的软件都符合要求。
 
软件截图:
 
 
可以看到中文乱码,这应该是1.3.0的一个Bug,chmsee采用内部默认的机制来识别编码,但有点问题,项目网站中已经有人提出,想必下一个版本即可修复。在此之前,可以手动修改文件编码为GB2312或是UTF-8,chmsee会缓存每一个曾经打开过的文件的编码设置。
chmsee的安装说明总体上还是很清楚的,至少按照他的说明来安装依赖后编译就不再出错,有些Linux软件就不是这样了,感觉依赖库根本没写全。我猜大概要好好学习下Linux下的编程才能清楚究竟该如何编译吧。如果大家有更好的技巧,请一定要告诉我,谢谢。

刚刚电子邮件收到的,共享下,方便大家下载。粗看了下,感觉这个版本主要就是在强化InnoDB。

点击下载

介绍

MySQL是当今在用的最值得信赖的开源数据库平台。基于其卓越的跨平台、应用程序栈以及瞩目 的性能、可靠性和易用性,现今,许多比较流行的,访问流量大的网站都选择使用MySQL数据库。现在MySQL Oracle提供了一个完整的LAMP(Linux、Apache、MySQL、PHP、Perl、Python 等)框架,基于LAMP,任何规模和志向的用户或客户均可利用现有的最佳技术解决方案和支持构建自己的应用程序和产品。MySQL 5.5 提供了一组专用功能集,在当今现代化、多功能处理硬件和软件以及中间件构架涌现的环境中,极大地提高了MySQL的性能、可扩展性、可用性。

MySQL 5.5融合了MySQL数据库和InnoDB存储引擎的优点,能够提供高性能的数据管理解决方案,包括:

  • InnoDB作为默认的数据库存储引擎
  • 提升了Windows系统下的系统性能和可扩展性
  • 改善性能和可扩展性,全面利用各平台现代多核构架的计算能力
  • 提高实用性
  • 提高易管理性和效率
  • 提高可用性
  • 改善检测与诊断性能

本白皮书介绍性的讲解了MySQL 5.5和InnoDB的一些增强性能,这些增强性能极大地提高了系统和MySQL的性能。下面,我们将详细介绍每一个关键的增强性能及其实现过程。

Google了很长时间,只知道Gwibber可以借用StatusNet和第三方API上推,但实际操作就发现,只能看推不能发推。至于如何解决这个问题,却说的不多。以至于不少人都在询问。其实Ubuntu中文论坛有个帖子说的很明白。地址:forum.ubuntu.com.cn/viewtopic.php?f=73&t=290640&p=2042552 ,按要求操作即可发推。

 

修改/usr/share/pyshared/gwibber/microblog/network.py

代码:
self.curl.setopt(pycurl.HTTPPOST, [(x, str(y)) for x,y in params.items()])

修改为

代码:
self.curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(params))

已可以发推。gtap version: 0.4
http://code.google.com/p/gtap/issues/detail?id=80

 

由于使用的是StatusNet,协议不可能和Twitter的完全一致,不兼容似乎也正常。但是这么一改的话,我猜大约就不支持StatusNet自己了,仅仅是个猜测,我不懂Python。

Gwibber很不错,操作简单,使用便捷,而且还是系统自带,只是不支持Twitter的List功能,这点很遗憾。如果有的话,简直能和TweetDeck媲美了。

之前试着用PPA升级Gwibber至2.91,结果发现不知道为什么Gwibber不再支持Status了,只支持Twitter,Facebook和Identi.ca这三种服务了,赶紧删掉PPA重装。。

自由万岁,Twitter万岁!

Yum库配置简单方法

2010年12月04日 07:20

好久没写博客了,正如我之前所说,在考试。大学考试就是一堆理论考来考去,我不是一个善于高谈阔论的人,也不是一个擅长考试的人,考的很糟糕,可以说,学习越深入,我就越不擅长考试了。

最近用上了企鹅输入法fcitx 4.0,很棒的输入法,我自从使用Linux以来还没见过这么漂亮的Linux软件呢,只是他的词库不敢恭维,偶尔还会崩溃,但总比ibus强多了。
 
发现Linux上的Office最好的还是OpenOffice 3.2.1版本,虽然比起自带的OpenOffice 3.2只有0.0.1的提升,但是质量真的好很多,不太会死掉了,美观性也大幅增加。LibreOffice项目我当然是支持的,期待的,只是目前还在beta版本,稳定性和OpenOffice 3.2几乎没有差别,所以还没用。
 
Ubuntu Tweak是个很实用的Gnome配置软件,最近才发现。
 
Ubuntu的Gnome-panel版本太低,稳定性很糟糕,一直想升级,可惜不会。Gnome-panel几乎是Gnome桌面的操作系统中最不稳定的组件之一了,无论是在Ubuntu上,还是在Fedora上,都不稳定,GUI,作为一个系统的门面,这样不稳定真的很不好。
 
我们学校搞开源社区了,很高兴,开源的意义我从今年才开始深入认识,这么快也可以为之作贡献了。我们的首要任务是做个我们社区的门户网站,用PHP,在做这个网站之前,我们先做一个PHP框架,这个框架相当于社区的第一个产品,根据Deltamaster的分配,我的任务是Ajax模块,缓存模块和代码优化。
 
我年初帮助Deltamaster做过项目,但结果是以惨败告终的,非但没有做出贡献,反而还在添乱。事后我反思了很久,主要是急功冒进,对任务的认识不够深刻,对语言的思想掌握不够。后者现在已经没什么问题了,前者还在学习。一个程序员,操之过急地编码根本没有意义,画出几张UML图,统筹兼顾,和上面进一步明确任务和接口比这重要的多。
 
RHCE考试推迟到明年一月了,很好,这样时间充裕多了。
 
还有很多话想说,但是不能说了,本文的主题不得不开始了。
 
Yum库的配置网上很多,但在我看来,基本没说清楚,这就是撰文的目的。
 
配置Yum很简单,第一步,用户必须告诉Yum这个库的存在,因此必须在/etc/yum.repos.d中要么创建一个后缀名为repo的文件,要么在已有的repo文件上增加新Yum库的地址,具体写法完全可参考系统自带的文件的写法,以下是我实验库的文件内容:
 
[testyum]                                                   #yum库名字,必须唯一
name=Fedora Test Yum                           #yum库全名,不多解释
baseurl=file:///home/bachue/Downloads   #必须是一个文件夹的地址,可以是FTP,HTTP,当然也可以象我一样为本机地址
enabled=1                                                 #是否启用该库,为1为启用
metadata_expire=7d                                 #源数据过期时间,不多解释
gpgcheck=0                                              #是否检验gpg的key,我是实验库,不需要检验。

更多语法还是请参考已有的repo文件。

完事后,作为用户其实就没啥事了。而Yum库本身还是需要一定的配置,否则不能正常工作。

为什么要配置呢?不配置Yum怎么知道他的库里有哪些包呢?包的详细信息呢?怎么做分组呢?怎么知道包与包之间的依赖关系呢?正是因为不知道,所以要有个配置文件,其实准确的说是源文件,来告诉别人这个Yum库的若干国情。

Yum库的软件,作为实验我挑选了google-chrome-stable和linuxqq的rpm包,这两个软件都是闭源的,所以一定不会出现在官方的Yum库里。

Yum的配置文件有五个,必须放在Yum库的repodata文件夹下,其中有四个(他们是filelists.xml.gz  other.xml.gz  primary.xml.gz  repomd.xml)可以由一句命令createrepo(可能需要安装同名rpm包)自动生成,但最后一个文件比较难对付,第一,他不可能手写,打开就知道,多国语言,想必不可能有人懂这么多语言。第二,可以有命令来生成,和生成前四个文件的命令还是同一个,但他有个古怪的要求,必须有一个其他库的这个文件作为模板,才可以生成,说真的,玩这么多年电脑从没见过这种要求,如果你的电脑上或光盘里已经有Yum库(DVD版本的安装光盘几乎都有),并且有名字中带comps的那个xml配置文件(可能已经被gzip压缩),就可以用他,如果没有,用find命令全系统搜索,关键字是*comps*xml*,我的fedora就有这样一个文件。如果这样都没有找到,那么只能从其他电脑上找了,网上我Google过,没有发现人家把这个文件挂上来。

假设已经找到(不会找不到吧,DVD里真有),生成配置文件的整个命令如下:createrepo -g [该模板文件地址,注意后缀名是xml] [Yum库地址],在我的电脑上,这条命令是这样的,createrepo -g /var/cache/yum/i386/14/fedora/2d112e279cf18476b72e5b30f60c1aa55e0297e7a05f4d9891879ee83d298e11-comps-f14.xml /home/bachue/Downloads/。这条命令将自动在库文件下创建repodata文件夹,并创建好五个配置文件。这样,配置就算完成了。

如果要去试试这个库能否正常工作,一定不要忘了,Yum是有缓存的,如果不久前刚刚扫描过这个Yum库,就不会再去扫描一遍,但你其实已经改过他的配置,或是有新软件入库了,而Yum却不知道,以至于你的操作看上去就像没有生效,这样可能会让你以为Yum没有正常工作。我就出过这样的糗事。清除缓存的命令是yum clean all,一定不要忘了。

讲解完毕,是否很简单呢?

在没学RHCE以前,感觉deb包很强,毕竟不容易出现依赖性问题,学了RHCE,感觉rpm才是真的好,功能实在太强大了。

今天中华民国建国九十九周年和Ubuntu 10.10发布之日,可谓双喜临门。更巧合的是,二者都以自由作为自己的信仰。

文泉驿,是Linux下最著名的自由中文字体,对于他的微米黑字体,我更是爱不释手,所有的实验报告都坚决使用它,即使是要放到Windows下,我也会将文档转换成pdf格式,以极大程度的使用它。如果查看本博客的CSS代码,也可以发现,正文字体文泉驿微米黑排名第一,在其他博客里,我自己还真没见过第二个这么做的。

平日里我装Ubuntu的时候习惯使用纯英文版,一方面是认为Linux用中文没有意思,如果用终端更不方便,另一方面也是想创造点英语气氛,但是Ubuntu有一点很奇怪,如果安装纯英文的Ubuntu,那么中文就显示得不正常,字的大小粗细都很奇怪,尤其是在Google Chrome下,上Ubuntu中文论坛,尤其明显。当然不允许这种事情发生,所以我每次都把Chrome的每一种字体都显式的指定为文泉驿微米黑,有时,甚至把全系统的字体都指定为文泉驿微米黑,似乎不是什么好事,为了一个中文字体,放弃了所有的英文字体。所以我探索新的方法,终于找到了通过修改字体配置文件/etc/fonts/local.conf来把中文字体指定为文泉驿微米黑,而不改变英文字体的方法:

<fontconfig>
   <match target="pattern">
      <test qual="any" name="family">
         <string>serif</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>Ubuntu</string>
         <string>WenQuanYi Micro Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>Bitstream Vera Serif</string>
         <string>DejaVu Serif</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
   <match target="pattern">
      <test qual="any" name="family">
         <string>sans-serif</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>Ubuntu</string>
         <string>WenQuanYi Micro Hei</string>
         <string>Bitstream Vera Sans</string>
         <string>DejaVu Sans</string>
         <string>WenQuanYi Zen Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
   <match target="pattern">
      <test qual="any" name="family">
         <string>monospace</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>WenQuanYi Micro Hei Mono</string>
         <string>Bitstream Vera Sans Mono</string>
         <string>DejaVu Sans Mono</string>
         <string>WenQuanYi Zen Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
</fontconfig>

编辑/etc/fonts/local.conf,把上述XML复制进去即可。如果没有该文件,就创建一个。修改后无需重启,即时起效。

最后赞美下Ubuntu 10.10的新字体"ubuntu",很漂亮。刚刚已经修改博客支持这个字体作为默认英文字体了。

参考文献:forum.ubuntu.org.cn/viewtopic.php?f=8&t=236013&start=0

关于C execlp函数的理解

2010年9月29日 19:05

execlp(從PATH 環境變量中查找文件並執行)

相關函數
fork,execl,execle,execv,execve,execvp
表頭文件 #include<unistd.h>
定義函數 int execlp(const char * file,const char * arg,……);
函數說明
execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到後便執行該文件,然後將第二個以後的參數當做該文件的argv[0]、argv[1]……,最後一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
參考execve()。
範例
	/* 執行ls -al /etc/passwd execlp()會依PATH 變量中的/bin找到/bin/ls */
#include<unistd.h>
main()
{
    execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
//執行
//-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

其实上面的描述很奇怪,如果能从PATH中找到第一个参数指定的文件,那何须第二个参数呢,没意义啊?

然后Google了下,看到了www.lslnet.com/linux/f/docs1/i34/big5260214.htm中别人同样的质疑。

这张帖子的楼主索性猜测:execlp函數在實際執行的時候根本沒有用到第二個參數。

说真的,这个猜测过于草率了。

楼下有一张回帖给出了一个反例:execlp("ls","flw","-?",(char *)0)。

应该是execlp("ls","flw","--help",(char *)0)吧,ls是Linux命令,-?是Windows的写法,不能同时运用,疑为他的笔误。这句语句在我电脑上的效果:

Usage: flw [OPTION]... [FILE]...

List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
 
自已在终端上永远试不出这个结果,因为明明调用的是ls命令,不可能显示出Usage: flw来。
再仔细看看上面关于这个函数的描述“然後將第二個以後的參數當做該文件的argv[0]、argv[1]……”
我猛然想到了以前说过main函数是可以传入参数的,我于是尝试了这样的代码:
	int main(int num_args,const char* args[])
{
	for(int i=0;i<num_args;++i)
	{
		std::cout << args[i] << std::endl;
	}
        return 0;
}

在终端而不是IDE里运行这个程序,运行的时候给他带点参数,结果自己打的命令出现的在args[0]的位置,后面的参数出现在了args[1],args[2],args[3]....的位置,可见C程序总会把你运行这个程序用的命令传入args[0]。这样这个问题就解开了。execlp第一个参数是让程序从PATH中找到指定程序运行,第二个参数将传入这个程序的args[0]。

execlp("ls","flw","--help",(char *)0)出现Usage: flw,是因为ls命令在显示帮助的时候会动用args[0],这么设计很正常,因为如果用户打错了命令,总希望用最接近他命令的方式指导他怎么做才对,直接使用他的命令是最方便的。平时args[0]几乎总是等于ls,这是因为ls在PATH中,没必要指示他的位置,但如果使用/bin/ls这样的命令,就可以看出来了。

安装Proftpd的几点总结

2010年9月18日 07:23

过去Proftpd总尽可能采用自动化安装+图形化使用的办法,偷懒,但是今天安装Proftpd我则采用了官方下载源码+自行编译+文本文件配置FTP,难度毫无疑问比之前大些,但也难不到哪里去。

安装方法详见《鸟哥的Linux私房菜》 linux.vbird.org/linux_server/0410proftpd.php 这里只总结一些鸟哥没有说的部分。

(话说这本书写得真好,通俗易懂,语言幽默,不愧是自由中国啊,令人神往。)

总结一:安装Proftpd出现如下错误:

tcpwrap.c:15:20: error: tcpd.h: No such file or directory

使用apt-get install libwrap0-dev即可。

总结二:中文问题,这个问题真的令人头疼,目前我也没有找到完全解决的办法,只能不断弱化这种错误

在鸟哥那句 ./configure --prefix=/usr/local/proftpd --enable-shadow --enable-autoshadow --with-modules=mod_ratio:mod_readme:mod_wrap 中再增加一个参数 --enable-nls

编译安装后,在proftpd.conf里增加一项:UseEncoding UTF-8 GBK,即可。

这么做的话,当从Windows的客户端或Linux的FTP服务器放入中文文件时他们互相访问都不会有问题,但这时使用Linux的客户端去访问Linux的FTP服务器,则文件名会有乱码(内容不会,似乎是Linux的FTP客户端编码和人家都不一样),不知道如何解决。

参考文献:

www.xpv.cn/home/vsftpdbianyicuowujiejuebanfa.html
blog.wu-boy.com/2010/07/07/2276/

继续阅读