在Linux下安装字体

国内很多Linux高手很不厚道。给人介绍一个功能的时候非要用一大堆的命令去做,有时还要修改配置文件。比如安装字体就是一个很典型的例子。

在Linux下安装字体其实是再简单不过的事了。在KDE3和KDE4安装一个TrueType字体都只需要在字体文件上按鼠标右键。在动作里选择“安装字体”。然后KDE会问你是安装到系统目录里还是个人目录里。家用电脑一般无所谓,就安装到系统目录里吧。输入密码就OK了。

类型:LinuxApp,创建时间:Dec. 31, 2011, 5:06 p.m. 点击查看完整内容。。。
中国足球(转载)

老杜(LD教练)问上帝:中国男足什么时候能拿出线阿

上帝看了看老杜严肃地说:我看这届就行

老杜(LD教练)惊叹:你TMD拿我找乐吧

上帝怒吼到:是你TMD先拿我找乐的

类型:随感,创建时间:Dec. 31, 2011, 5:05 p.m. 点击查看完整内容。。。
运行linux的脚本老是出现": No such file or directory"错误

我一直对字符界面有抵触感,即使会用vim,我的linux脚本(python/bash script)一般都是在windows下写完调试好,然后传到linux上的。

不过写好的linux脚本传到linux上运行的时候却经常报这样的错:

$ cat fish.py
#!/usr/bin/env python

print "fish"
$ chmod u+x fish.py
$ ./fish.py
: No such file or directory

找不到文件?可是无论怎么修改脚本,都没办法解决。找不到文件,那应该是第一行的env命令有问题啰?真是让人让人摸不着脑袋,到底是为什么呢?

类型:LinuxApp,创建时间:Dec. 31, 2011, 5:04 p.m. 点击查看完整内容。。。
从linux qq不支持声音和视频说起

今天腾讯公司发布了qq的linux版本。这应该是linux世界的一个胜利,因为很多人不喜欢用linux是因为qq没办法在linux上面运行。经常看到有些人说qq有啥好用的。唉,真是想不通那些人为什么就想不明白这个世界除了他还有别的人么。

qq的linux版本只支持最少的功能。我还没有去用,但是确定视频和音频的功能是没有的。可能是因为开发时间不够吧。不过也让我想起一件事:linux下根本没有音频和视频的标准API,而且各个发行版还喜欢搞自己的配置,腾讯就算真的想做,它做得来吗?据我所知,linux下声音的API就不下三种,视频不大清楚。

今天刚好想下载一下picasa,也就是google的那个看图软件。发现了一件让人心酸的事。在picasa的安装说明里,居然是用命令行的。我想google也不想这样,这个世界上会用命令行的计算机用户可真少。google可不想开发一个只有一点点人用的软件。就算有一百万人用,它投入的成本每个人可能都要好几美元了,而且还基本上赚不回来。最终的原因还是因为linux的发行版太多了,而每个发行版安装软件的方法还各不一样。

希望在有生之年可以看到桌面linux统一为一个标准的版本。

类型:随感,创建时间:Dec. 31, 2011, 4:54 p.m. 点击查看完整内容。。。
Python, Qt, Java的字符编码

首先定义只在本文中出现的两个基础概念:

  • 字节组。每8个位(bit)是为一个字节,多个字节成为一个字节组。
  • 文字串。现实语言的最小单位称为文字。一个英文字母就是一个文字,一个汉字也是一个文字,一个空格也是文字。

这两个概念是我生造的,主要是为了避免和现有的一大堆术语混起来。

文字串不能理解成字符串。倒是像圆这样的数学概念,比较抽象一些,只存在于头脑里。可以把文字串写在纸上,也可以记在计算机里,还可以读出来。字节组就是文字串在计算机中的表现形式。想一想,在纸上圆可以用一个公式来表达,也可以用一个图形来表达,还可以用文字描述它。文字串也一样,可以表述为多种字节组。众所周知,计算机只能处理数字,所以为了描述文字,最简单的方法就是把文字列出来,每个文字用一个数字表示。不同的国家有不同的方法来做这件事,比如美国人和英国人只有字母,还有一些符号,总共排了256个文字,叫做ascii码。中国的文字就比较多了 ,那个康熙大字典据说有40万,所以中国人排了gb2312标准,big5,gbk、还有gb18030,里面包含的文字总数各不相同。

  • 把文字串表述成字节组的方法就叫做字符编码。

显然,美国人的ascii码是不能表示中国文字的,因为它只能表示256个文字。虽然,中国的标准可以表示美国人的文字,但是却不能表示阿拉伯字符和其它一些像型文字。后来大家意识到这个问题是文化交流的障碍,于是就在一起制定了一个unicode标准。简而言之,unicode标准就是穷尽这个世界上所有的文字,给每个文字编一个数字。 和gb2312,gbk等一样,其实unicode也只是一种编码标准,只不过它能够表示所有的文字。从此,如果一个计算机系统想要支持多种语言文字,只要简单地支持unicode就可以了。在这种系统里,我们可以认为文字串就是unicocde字节组,unicode字节组就是文字串。

类型:Python,C++ & Qt4,Java,创建时间:Dec. 31, 2011, 4:52 p.m. 点击查看完整内容。。。
排骨汤的煮法

去年搬了新家,有了一个厨房,终于可以煮自己最喜欢的排骨汤喝了。把煮汤的方法记下来。

首先当然是选料了。虽然家里人没少教我怎么选猪肉,但是作为生活白痴,只能记住主要的两点了:一、用手摸肉,红嫩有韧性的会比较好一点,手也不会有生涩的感觉。二、用鼻子仔细闻一下,有异味的一定不能要。因为排骨汤中最有价值的是骨头的部分,所以还要注意有些不良商贩在排骨里附带了很多其它猪肉。据说,非常长的排骨是母猪的,比较不好吃,这个。。大家自己体会吧。排骨汤的另一个是白萝卜,我倒觉得它的选料更复杂,因为我经常选到花心大萝卜。

接下来就是把排骨洗干净,把白萝卜去皮切块放锅里。试了一下,好像用冷水会比较好吃一点。锅用电饭煲就可以了,也可以用炖锅。煮的时间要看你的锅的火力了。我的做法比较土一点,看汤够不够我喝,如果够的话就可以了。

接下来是最后一步,也是最重要的一步——放盐。 没有放盐的排骨汤一点味道都没有,相当难喝,但是放了盐之后的排骨汤相当美味,不知道是为什么。。没有经验的时候可以慢慢放,一次放一点,粗盐比较咸,每一次少一点,细盐比较淡,每次多一点,搅拌一下,让盐散开,喝一下,如果觉得不够美味,多半是盐放太少了。我喜欢喝淡一点的排骨汤,生活嘛,平平淡淡才是真。

每次煮完,都情不自禁地喊出"Perfect!"。汤美之余味,久之不绝,赞而志之,愿乐长至。

类型:随感,创建时间:Dec. 31, 2011, 10:02 a.m. 点击查看完整内容。。。
修改qt程序的图标(for windows)

最近经常在windows写qt程序。编译完的qt程序图标是windows默认的应用程序图标,不好看。于是就想给它换一个,找了一下qt的帮助文档,里面有提到这个问题。方法也挺简单的:

首先当然要有一个图标了,呵呵。把这个图标复制到程序的主目录下,姑且名字叫myicon.ico吧。没有?可以自己用vc画一个。然后编写一个icon.rc文件。里面只有一行文字:

IDI_ICON1               ICON                    "myicon.ico"

最后,在工程的pro文件里加入一行:

RC_FILE = icon.rc

qmakemake一下,就可以发现你的应用程序拥有漂亮的图标了。

顺便说一下,做WindowBlinds的那个公司有一个IconPackager,还一个叫做IconStudio的吧。可以用来管理和生成图标文件。 不过貌似要收钱的。。

类型:C++ & Qt4,创建时间:Dec. 31, 2011, 10 a.m. 点击查看完整内容。。。
mysql下管理用户的命令

安装完mysql默认的root用户虽然没有设置密码,但是只能在本机登录。如果linux系统本身已经足够安全,这也是一个不错的选择。我见过不少系统,为了操作方便,设置了一些非常简单的密码,这种简单的密码跟不设密码差不多了。

如果要改root用户的密码:首先进入mysql,然后运行

set PASSWORD FOR 'root'@'localhost' = PASSWORD('mypassword');

这条命令也可以用来更改其它用户的密码。从所周知,mysql的用户包含了两部分名字和主机名两部分。所以'root'@'%''root'@'localhost'是不一样的,mysql默认没有创建'root'@'%'这个用户。如果要更改其它用户的密码,只需要替换一下上述命令的用户名部分就可以了。

mysql使用create user命令来创建一个新用户,比如:

create user fish;

就创建了一个名为fish的新用户。使用drop user命令删除一个用户,比如:

drop user 'fish'@'%';

就删除了上面那个用户了。值得注意的是mysql认为单写fish就代表了'fish'@'%'

现在我们创建一个数据库:

create database mydatabase;

然后赋权限给fish这个用户。

grant all on mydatabase.* to fish;

all代表fish拥有该数据库的所有权限,当然,也可以细分权限,比如fish可以只拥有添加数据,而没有添加、删除表的权限。mysql还可以划分细至表的权限,详细的信息查看手册吧。

类型:LinuxApp,创建时间:Dec. 31, 2011, 9:57 a.m. 点击查看完整内容。。。
怎么给linux的网卡绑定多个IP

windows下给网卡添加多个IP是很容易的事,那linux下应该怎么做呢?不同的linux发行版有不同的做法。这两天刚好需要做这么一个东西,于是google了一下,在终端下,最普适的方法是使用ifconfig命令。

比如要给第一个以太网网卡绑定192.168.0.1/24这个IP ,192.168.0.1/24这种写法朋友们应该知道吧,24的意思是掩码是255.255.255.0,前24个位是掩码。一条命令搞定:

/sbin/ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0

这里面比较奇怪的是第一个参数eth0:1,据说这个叫虚拟设备?eth0是第一个以太网网卡,如果是第二个以太网网卡的话就是eth1,冒号后面是以0开始的数字,每个IP对应一个。

不过,唯一的问题是,启动系统之后配置的IP就丢了。

对于这个问题,如果是使用redhat的话, 终端下有一个很不错的setup命令。输入setup,选择网络配置,可以看到setup程序列出了所有的网卡,一般就是一个eth0eth1(如果双网卡的话)。我们可以新增一个设备,名为eth0:1,把IP地址和掩码填上去,下次启动就自动添加了这个IP了。想要立即生效的话就运行:

service network restart
类型:LinuxApp,创建时间:Dec. 31, 2011, 9:53 a.m. 点击查看完整内容。。。
一个定时器,用来做类似于crontab的工作

前几天写一个后台程序,定时查看一个URL的修改,本来想用crontab做的,后来想想就算了,因为python写起来更简单。于是我就实现了一个每小时(可配置)醒过来做一次操作的小小工具类。与threading的Timer不一样的是,它是单线程的。

本文包含一段小脚本可以模拟crontab,定时在某个时间执行操作。

类型:Python,创建时间:Dec. 31, 2011, 9:50 a.m. 点击查看完整内容。。。
应用python编写shell脚本

本文介绍使用python编写shell脚本所使用的模块与注意事项。主要是os, os.path, shutil。除了这三个模块,可以对文件以及文件夹之外,还有另外一些模块关注系统的其它方面,比如密码,帐户信息。

使用os.environ可以访问环境变量。使用sys.argv可以获得用户传入的参数。

类型:Python,创建时间:Dec. 30, 2011, 9:03 p.m. 点击查看完整内容。。。
俯卧撑
【 以下文字转载自 NewExpress 讨论区 】
发信人: xfh (加油中国), 信区: NewExpress
标  题: 强大的俯卧撑
发信站: 水木社区 (Wed Jul  2 01:06:21 2008), 站内

欧阳峰蹲下了身子。

欧阳峰伸长了脖子。

欧阳峰瞪圆了双眼。

欧阳峰四肢着地。

欧阳峰鼓起了腮班。

洪七很冷静。

洪七解下了葫芦。

洪七拧开了葫芦盖子。

洪七咕嘟咕嘟地喝了几口。

“动手吧。”

洪七声音平静。

....

类型:随感,创建时间:Dec. 30, 2011, 8:01 p.m. 点击查看完整内容。。。
screen程序使用初探

screen是用于在一个终端上模拟多个终端的linux程序。比如我们使用putty登录到linux,并且要运行多个程序。这时我们就可以使用screen程序。

screen程序的主要特性:

  • 可以模拟多个终端,使用Ctrl+A,N 这样的快捷键方便地切换。
  • 可以把正在进行的工作保存起来,下次登录的时候恢复它们。我们称之为会话管理,每次进行的所有工作组成一个会话。
  • 在不同的终端复制和粘贴,不知道怎么用。。

本文简单介绍screen命令行的使用,以及操作。

类型:LinuxApp,创建时间:Dec. 31, 2011, 2 a.m. 点击查看完整内容。。。
在多线程编程的时候如何让子线程退出

虽然python下推荐使用多进程编程,但是在一些场合下,多线程编程还是方便一些。

最近就经常写一些关于网络方面的命令小程序,一个线程不断地从命令行得到用户的输入并且向网络发送一些东西,另外一个线程则从网络接收数据并打印在屏幕上。平常结束一个程序的办法是调用exit()函数,不过对于多线程的网络程序似乎却有点难办,因为除了一条sys.exit()语句外,还需要结束从网络接收数据的后台线程。

不幸的是python没有提供结束线程的接口,不能像java或者c#那样,使用thread.interrupt() 就可以让线程结束。更糟糕的是,python调用系统函数的时候会被阻塞在内核,除非阻塞被解除,这个线程不再继续执行python解释器的代码了,所以interrupt()理论上根本无法实现。那要怎么退出线程呢?我的解决办法是:

设置一个名为exiting的全局变量,从网络读数据的线程以它为循环条件。如果要让这个线程退出,只需要改变一下exiting的值,接着发送一些信息让线程退出阻塞。 调用线程的join函数可以等待线程退出。

类型:Python,创建时间:Dec. 31, 2011, 1:48 a.m. 点击查看完整内容。。。
传参数应该用哪种形式——值、引用、指针?

最近写C++程序经常郁闷传参数的时候应该传值、传引用还是传指针。

  • 传值 :int func(User u);
  • 传指针: int func(User* u);
  • 传引用: int func(User& u);

传值是传参数最常见的方法,相当简单,是C++的基础传参方法。如果参数是整形、字符等基础类型,用传值的方法是最快的,也是最简单的。它的缺陷是对于一些很大的对象,比如上面定义的User对象,使用传值方法时,内存开销比较大,会重新创建一个User对象。还有一个情况,如果User是多态的,这样传参数会出问题。因为C++会调用新创建的User对象的复制构造函数,而默认的复制构造函数只会把需要的属性复制到新对象里,引起所谓的切割现象。

在C++古生代,传指针是传值之外的唯一方法。与传值相比较,需要考虑内存管理的问题,在栈上分配的对象通常就不能传递指针,因为函数返回之后栈上的对象会被析构,这时的指针就会成为野指针,引用它会造成内存访问异常。即使对象是在堆上分配的,传指针里也同样要考虑分配错误等问题。不过,与传值相比,传指针对付大型对象和多态对象很有效,而且,使用指针形式传递的变量在运行过程中可以被修改。

传引用似乎结合了两者的优点。与传指针一样,传引用能很好地对付大型对象多态对象,而且相对于传指针,传引用通常是不需要考虑内存管理的问题,因为只能使用另一个已经初始化的变量来初始化引用。一切看起来似乎都很美好。不过优点往往也是缺点,引用类型的变量不适合作为类的属性,因为引用一旦初始化就不能改变其指向的对象。C++这种面向底层的语言真是让人很痛苦。

总结一下:

基础类型传值、普通的非多态的对象传引用,多态对象以及分配在堆上的对象传指针。

类型:C++ & Qt4,创建时间:Dec. 30, 2011, 7:43 p.m. 点击查看完整内容。。。
关于敏捷开发(转载)

敏捷开发的原则和优点

  • 快速、连续的交付
  • 频繁的交付
  • 工作软件
  • 适应
  • 亲密无间,日常协作
  • 积极主动、熟练人员
  • 自组织的团队
类型:随感,创建时间:Dec. 30, 2011, 7:37 p.m. 点击查看完整内容。。。
维护多个WebService API版本的方法

随着软件系统的不断发展,与其相配套的API也必定会发生着不断的变化。如何降低API变化对外部系统的影响是大多数软件系统都要面对的挑战。

在设计指令集、SDK或者API时,向后兼容可以说是最基本的道德,这已经被无法的例子所验证。不过随着软件系统功能的不断增加,维持原来的API往往是不可能的。两相权宜,只能选择有条件的向后兼容。通常的做法是保留原来的函数,然后增加新的函数。比如CreateWindow(String className),如果要新增了一个参数,名为style,那么我们可以再新增一个函数如CreateWindowEx(String className, String style)。显而易见,这种方法是最简便的,却可能不是最好的。利用高级语言的特性可以把它修改为具有默认参数的函数如:CreateWindow(String className, String style="default"),或者简单地再创建一个新的同名函数:CreateWindow(String className, String style)。虽然不能指定默认参数的值,但是Web Service支持前一种做法。

类型:Java,创建时间:Dec. 31, 2011, 1:33 a.m. 点击查看完整内容。。。
可重入函数

可重入函数的定义是:

  1. 不为连续的调用持有静态数据。
  2. 不返回指向静态数据的指针;所有数据都由函数的调用者提供。
  3. 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
  4. 绝不调用任何不可重入函数。

可重入函数有一个很好的性质——它的输出只决定于输入,非常方便进行单元测试。

可重入函数没有全局数据,在运行的时候不会产生竞争条件,只要配合map & reduce这样的高阶函数就可以做并发编程,完全不需要额外的开销。随着多核处理器的流行,这样的概念应该会越来越流行的。

类型:随感,创建时间:Dec. 30, 2011, 7:27 p.m. 点击查看完整内容。。。
配置iptables,把80端口转到8080

今天安装了一个tomcat服务器,不想让服务器直接以root用户运行,就配置了一个低权限的用户给它。但是,众所周知,在unix下,非root用户不能监听1024以上的端口号,这个tomcat服务器就没办法绑定在80端口下。

怎么办呢?有两种方案:

1、使用setuid或者sudo提升程序的权限。这个不好,跟直接用root一样的缺点。

2、把到80端口的服务请求都转到8080端口上。这个又分为两种方法。常见的方法是使用apache监听80端口,然后利用ajp转向把服务转到8080。这个办法有很多好处。比如对于一些静态或者php的url就可以直接由apache提供服务,而只把jsp的请求转到tomcat。这里不再详述。我使用的是第二种方法,利用iptables把80端口映射到8080。很简单,在root权限下运行一条命令:

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

现在就可以看到效果了。不过据说不能拿本机做试验,因为本机的PREROUTING不起效果。你可以拿别人的机器试一下。

大多数Linux发行版本有关于iptables的配置文件,比如基于Redhat的发行版一般有一个/etc/sysconfig/iptables这个文件。使用这条命令把当前的iptables配置写到这个文件里:

iptables-save > /etc/sysconfig/iptables

重新启动机器之后端口映射就仍然有效

类型:LinuxApp,创建时间:Dec. 30, 2011, 7:25 p.m. 点击查看完整内容。。。
对函数式编程的看法

最近函数式编程概念很火,似乎每个“现代化”的编程语言都要沾一下函数式编程,才能称之为现代化的编程语言。java打算在jdk7中加入闭包,.net则早已支持lambda语句。至于python,ruby,javascript等这些过程化的编程语言则争先恐后地加入了函数式编程的战团,各展优雅。可是,函数式编程真的那么重要吗?

这些过程化编程语言通常提供了一些高阶函数,以及对于闭包的支持。比如python提供了

  • map(function, sequence) -> list
  • filter(function,sequence) -> list
  • reduce(function,sequence) -> result

这些函数在现有的过程式语言环境中基本上都是类似的实现。可以说,不过是语法糖而已,函数式编程擅长的并行计算不可能在这种过程式的编程语言中自动地获得。这种函数式编程有什么意义?更好看还是更简洁?难道还有其它的理由吗?

闭包是具有闭合作用域的匿名函数。他带来的优点和缺点在很多文章中已经被详加探讨。基本上,闭包在大多数过程化的编程语言里被实现为匿名类。说实话,自从用过闭包之后,我就很自觉地将闭包的思想用于软件设计。不过,毕竟只是语法糖,有也可以,没有也不是很遗憾。如同前所述的高阶函数,我认为,它对现有的过程化编程语言改进不是很大。怪不得之前有人建议在Python 3000里去掉lambda

类型:Python,随感,创建时间:Dec. 30, 2011, 7:22 p.m. 点击查看完整内容。。。