小技巧:让Win键在KDE中更有用(转载)

http://blog.gmsh.pp.ru/2009/08/tips-make-win-key-useful-in-kde/

从 Windows迁移到 Linux 上的用户,可能保持着按 WindowsKey(Windows键,标准键盘最下一行的那个视窗键)打开Windows开始菜单的习惯。但是在 某些 Linux 发行版上(比如笔者的openSUSE 11.1,KDE 4.3环境)上 WindowsKey 并没有绑定到 KickOff 菜单上。可以尝试在 KDE 控制中心 (KDE control panel)里面修改,而 KDE 的快捷键只允许非修饰键(Modifier Key)和 组合键,WindowsKey 恰恰是修饰键,直接绑定 WindowsKey 是不可行的。下面,笔者介绍一个技巧,使 WindowsKey 绑定到 KDE 4.3 的 KickOff 菜单上。这里用了更改键盘映射的方法。

详细过程请点击查看正文。

类型:LinuxApp,创建时间:Jan. 1, 2012, 8:45 p.m. 点击查看完整内容。。。
禁止python在运行的时候自动生成.pyc文件

有没有觉得,有时候python的.pyc文件很讨厌呢?虽然它们能加快加载速度,但是看见那一堆堆的文件,又不能放到SVN里,实在是很烦。

现在python2.6新增了一个特性,只要把环境变量PYTHONDONTWRITEBYTECODE设置为x,就不再会生成.pyc文件了。在windows下修改环境变量的方法是:右键点击“我的电脑” ->属性->高级->环境变量。在Linux下可以修改~/.profile

export PYTHONDONTWRITEBYTECODE=x
类型:Python,创建时间:Jan. 1, 2012, 2:40 p.m. 点击查看完整内容。。。
datetime和date类型与字符串之间的互转

不说什么,看代码:

#从sqlite3模块抄过来的东西,用于datetime,date到字符串之间的相互转换
def adapt_date(val):
    return val.isoformat()

def adapt_datetime(val):
    return val.isoformat(" ")

def convert_date(val):
    return datetime.date(*map(int, val.split("-")))

def convert_timestamp(val):
    datepart, timepart = val.split(" ")
    year, month, day = map(int, datepart.split("-"))
    timepart_full = timepart.split(".")
    hours, minutes, seconds = map(int, timepart_full[0].split(":"))
    if len(timepart_full) == 2:
        microseconds = int(timepart_full[1])
    else:
        microseconds = 0

    val = datetime.datetime(year, month, day, hours, \
            minutes, seconds, microseconds)
    return val
类型:Python,创建时间:Jan. 1, 2012, 2:33 p.m. 点击查看完整内容。。。
Python的XMLRPC简介及小技巧

我觉得,SimpleXMLRPCServer模块可以说是Python的招牌菜。

编写客户端提交数据到服务器处理是程序员最常碰到的几个问题之一。各种不同的语言对此都有相应的解决方案。比如Unix下,C程序员们可以用SUNRPC,Java程序员则使用RMI来处理。大多数语言还都可以使用Web Service或者ICE。它们的使用方法类似,编写一个接口定义文件,用一个工具处理并生成代码,加入到工程中,最后编译生成目标文件运行。有用过这类工具的朋友们,脑子里应该都会闪出一个字——烦!真的是谁用谁知道。

Python同样也提供了一个基于XMLRPC的解决方案,不过用法很简单:

  1. 首先,就像在编写普通的程序那样子编写服务器。
  2. 接着使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象。
  3. 最后,在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可。

本文介绍xmlrpc的基本用法以及几个注意事项。

类型:Python,创建时间:Jan. 1, 2012, 2:30 p.m. 点击查看完整内容。。。
Qt程序如何用PostMessage向一个窗口输入文字

写一些监控类程序的时候,有时候会要求某个条件满足的时候就向某个窗口 写入一堆文字。我首先想到的是PostMessage。对于文本框之类的控件,可以使用WM_SETTEXT这个消息。如果不是文本控件,只好使用WM_CHAR写入一个个的文字。 基本的用法是这样子的:

PostMessage(hwnd, WM_CHAR, c, 0);

如果编译的时候定义了UNICODE。那其中的c是文字的utf-16码(TCHAR)。Qt的QChar有个unicode()方法,可以取得utf-16内码。

QString s=tr("一段中文和Enlish Text");
foreach(QChar c, s)
    PostMessage(hwnd, WM_CHAR, c.unicode(), 0);
类型:C++ & Qt4,创建时间:Jan. 1, 2012, 2:12 p.m. 点击查看完整内容。。。
Python的__del__()方法

简而言之,__del__方法相当于其它语言里的析构函数。不过,由于Python的一些特性,在使用__del__需要注意一些问题:

  1. 因为垃圾收集机制处理循环引用(A使用B,B又使用了A)的时候总不尽如人意。 所以__del__并不总是会被调用。

  2. __del__可能在Python退出的时候被调用。此时很多变量都已经被释放, 所以__del__对外部的依赖要尽可能的小。

  3. __del__函数内不能引入新的模块。

  4. Python提供了try/finally这样的语法,一些资源释放的东西,最好还是放在finally块内解决,而不是放到__del__方法内。

类型:Python,创建时间:Jan. 1, 2012, 12:31 p.m. 点击查看完整内容。。。
最讨厌Python 2.x的编码问题了

本粗人在写程序的时候习惯这样子:

print "中文"

显然,这个写法是不具可移植性的。因为,在windows下默认编码是gbk,在很多linux下面默认编码是utf-8。如果源代码的编码是gbk,在windows下可以工作得很好,如果源代码是utf-8,在windows下会打印出一堆乱码。好一点的作法是

print u"中文"

这样的话,在不论源代码的编码是什么,也不论操作系统是什么,都可以打印出正确的字符。可是如果这样子就麻烦了:

name=third_party_module.get_system_username()
print u"你好,%s"%name

third_party_module.get_system_username()返回一个当前登录的用户真实名字。但是他返回的到底是什么编码的我们不知道。因为unicode()函数默认使用当前系统的默认编码。倘若name的编码与当前系统默认的一样,一切OK。如果不一样,问题就麻烦了。幸好返回时使用的一般是当前系统默认编码。

最麻烦的:

name=third_party_module.get_system_username()
client_socket.send(name)

字符串被发送到网络上,到达运行着不同操作系统的远程主机上。远程的主机怎么知道这是什么编码呢?最近经常遇到这样的问题,实在很郁闷。

类型:Python,创建时间:Jan. 1, 2012, 12:29 p.m. 点击查看完整内容。。。
八十后的我们为何不结婚(转载)

一挚友发现,致所有徘徊在围城门口的朋友 80后早期的我们,按理说现在也老大不小了,搁在解放前这个年纪孩子都满地跑了。看着身边也有不少同龄人结婚生子了,可大部分还都踌躇着,恩,一提结婚 就抽搐!为什么我们还死皮赖脸的拽着青春的尾巴不结婚呢?让我好好想想。

我想,首先,心态问题。在以前,结婚根本就不是个事儿,一到岁数找个差不多的就办了,那时候大家都一穷二白,干脆利索,也没人在乎爱多爱少的。可现在这人 类进化得越来越把自己当回事儿了,什么人品、家世、长相、工作、学历、前途、甚至业余爱好没有一样不琢磨的,反复研究,深入探讨,仔细对比,辗转反侧…… 眼看着就把简单问题复杂化,两人问题扩大化!结果越琢磨越糊涂,这婚就结不了了!结婚嘛,俩人搭伙过日子,本来多简单一事,硬让我们弄得比制造航天飞机还 罗嗦。追其原因,我觉得是我们对结婚的目的不纯粹了,总想通过婚姻得到一些其他的附加价值。例如房子、车子、还有未来的好日子。当你想通过一张纸来得到一 辈子的东西,是有点难。

类型:随感,创建时间:Jan. 1, 2012, 12:24 p.m. 点击查看完整内容。。。
Linux下如何挂载一个ISO文件

挂载一个iso文件的方法:

mount /root/CentOS.iso /mnt/centos -t iso9660 -o loop=/dev/loop1

其中/root/CentOS.iso是iso文件的路径。/mnt/centos是挂载到的目录。-t iso9660指明了ISO文件的文件系统格式。-o loop=/dev/loop1指明了使用哪个loopback文件。如果/dev/loop1已经被使用了,可以使用其它的loopback文件,/dev/loop2这样子。

类型:LinuxApp,创建时间:Jan. 1, 2012, 12:22 p.m. 点击查看完整内容。。。
几个KDE4使用技巧
  1. 如果觉得KDE太难看了,然后你的英语水平还行的话,试试把语言改成英文。方法是在系统配置(system settings)里修改"地区与语言(Regional & Language)"。加US English语言,地区则保持为China。我还设了Bitstream字体,觉得显示好看多了。

  2. 很多朋友不习惯KDE默认的单击行为。我记得以前WIN98也可以改成单击,结果是没什么人用。这个也可以在系统配置里修改。找到"键盘与鼠标(Keyboard & Mouse)",鼠标配置可以修改。

  3. 拜KIO组件所赐,在Konqueror可以查看各种命令的说明文件。不信,试试在Konqueror里输入man:ls就可以看到ls命令的使用说明了。格式很简单,man:后面加上命令名。实际上由于KDE4引入了KIO,大多数KDE4组件都可以 如同硬盘文件一样对待FTP、SFTP、HTTP上的文件。

  4. ssh是Linux下面提供远程终端的工具,在windows使用putty或者SecureCRT之类的终端软件可以连接到Linux进行操作。ssh还提供了sftp协议,在windows下可以使用filezilla或者winscp等工具访问linux的文件系统。使用方法跟ftp一模一样。KDE4的dolphin和konqueror已经内置了对sftp的支持,只要在地址里输入sftp://romotehostip就可以访问sftp了。

  5. 使用konqueror的时候,很多中国人很讨厌使用ctrl+space打开输入法的时候konqueror显示出一堆狗皮膏药。konqueror称它们为"access key",按ctrl键之后显示出来,用户只要再按一下对应的按键,就可以跳到对应的链接去了。在KDE4.2之前,去掉这个功能得修改配置文件,现在不用,在konqueror的配置对应框里找到"网页浏览(Web Browsing)",最后一个选项"启用Access Key"一项去掉即可。

类型:LinuxApp,创建时间:Jan. 1, 2012, 12:19 p.m. 点击查看完整内容。。。
在Linux安装配置unixODBC

ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。微软公司在1993年以DLL集的方式发布了世界上第一个ODBC产品,现在成为了微软开放服务结构(WOSA,Windows Open Services Architecture)中,有关数据库的一个组成部分。微软的ODBC产品其实就是一个ODBC的驱动管理器,提供一个ODBC应用程序到某种ODBC驱动的接口。在UNIX系统上,有两个开源的ODBC驱动管理器,unixODBC和iODBC。

在Linux下,ODBC可以让一个软件本身不必花费太多的精力而支持多种数据库系统。开源的SIP服务器Asterisk就是这样一个例子。本文就是配置Asterisk服务器的产物,纪录了我将一个MySQL数据库配置为ODBC数据源的详细过程。

类型:LinuxApp,创建时间:Jan. 1, 2012, 12:16 p.m. 点击查看完整内容。。。
使用eclipse远程调试tomcat

相信很多J2EE的开发者都是在Windows上面开发程序,然后把程序上传到Linux下运行的吧。可是有时候在自己机器上运行的好好的程序,放到服务器下就出错了。单单看出错信息也推断不出是哪里的问题。这时候试试用Java的JPDA远程调试程序,一定可以让你很满意。

tomcat服务器已经内置了JPDA支持,只要用:

catalina.sh jpda start

这条命令启动tomcat,它就会监听8000端口,等待调试器的连接。要注意不能使用startup.sh脚本。tomcat会使用 JPDA_ADDRESS这个环境变量的值。比如想监听8017端口:

export JPDA_ADDRESS=8017
catalina.sh jpda start

接着,选一个自己喜欢的调试器,基本上现在主流的如Eclipse、NetBean都可以。我主要使用Eclipse,操作只要三步:

  1. 选择“Run”菜单里的“Open Debug Dialog”。
  2. 在对话框里找到“Remote Java Application”。 右键菜单选择“New”创建一个配置。
  3. 新创建的配置的Project选择服务器上的工程。HostPort分别填写你服务器的IP和JPDA的端口,默认是8000,或者$JPDA_ADDRESS

现在就可以像本机调试一样, 设置断点和跟踪调试了。

类型:Java,创建时间:Jan. 1, 2012, 11:52 a.m. 点击查看完整内容。。。
Qt的signal/slot机制原理

signal/slot在底层会使用三种方式传递消息。参见QObject::connect()方法:

bool QObject::connect (const QObject * sender,
        const char *signal, const QObject *receiver,
        const char *method,
        Qt::ConnectionType type = Qt::AutoCompatConnection)

最后一个参数是就是传递消息的方式了,有四个取值:

  • Qt::DirectConnection
  • Qt::QueuedConnection
  • Qt::BlockingQueuedConnection
  • Qt::AutoConnection

有关这几种类型的详细信息请点击查看正文。

类型:C++ & Qt4,创建时间:Jan. 1, 2012, 11:49 a.m. 点击查看完整内容。。。
有时候人就是懒

3月份的时候写了一个记帐本给自己用。它可以按时间列出帐目,并且统计一周、一月的开销,一直在用着。不过,它的时间列表没有按照先后顺序排。“反正凑合着用吧”,一直用到今天,终于看不过去,加了一行排序语句,花了一分钟时间。唉,我太懒了!

类型:随感,创建时间:Jan. 1, 2012, 11:39 a.m. 点击查看完整内容。。。
Windows Server 2003安装Vmware Server 2.0时碰到xxx.msi was rejected by digital signature policy

在Windows Server 2003上安装Vmware Server 2.0时碰到一个问题。当安装程序开始运行后,弹出一个提示,说xxx.msi was rejected by digital signature policy。在Vmware的网站上指出这是Windows Server 2003的一个BUG,还给出了一个链接,其中说明:

"当计算机没有足够的连续内存可供 Windows Server 2003 或 Windows XP 用于验证是否对 .msi 包或 .msp 包正确进行了签名时将出现此问题。"

解决方法请点击查看正文。

类型:随感,创建时间:Jan. 1, 2012, 11:38 a.m. 点击查看完整内容。。。
为什么使用SecureCRT或者putty通过ssh登录Linux主机很慢呢

相信很多使用Linux的朋友都会在Windows下使用putty之类的工具登录Linux主机。大家有没有发现,输入密码之后还要过很久才会显示命令提示符。这是不是因为Linux的服务器太糟糕性能太低才会这样呢?其实这是因为OpenSSH在用户登录的时候验证IP。OpenSSH会根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。如果你的网络里没有DNS服务器,或者你的主机名是随便捏造的,花的时间就比较多。

安全和方便有时候两个不得不选一个。我比较希望OpenSSH帮我把等待的时候省起来。方法是修改/etc/ssh/sshd_config文件,添加(或者修改)一行:

UseDNS no

重启一下sshd服务器就可以解决了。

service ssh restart
类型:LinuxApp,创建时间:Dec. 31, 2011, 5:39 p.m. 点击查看完整内容。。。
在Windows Server 2003下运行Rise Of Nations

搜索一下网上的一些文章,都说Windows Server 2003下不能运行Rise Of Nations。只要一启动就会跳出“Gathering Exception…”之类的错误。经过三四年的努力,今年终于在一个外国人的论坛上找到解决办法。据说这是因为微软认为没人在Windows Server 2003上玩游戏,所以把DirectMusic的部分组件禁用掉了,无论你再怎么升级Windows Server 2003都没有用。唯一的办法就是自己手动把DirectMusic组件装上去。详情请听说:

  1. 首先下载最新的DirectX来安装,比如我下载了一个directx_nov2008_redist.exe。这主要是为了避免新安装的DirectMusic组件不兼容系统的其它组件。

  2. 安装完之后,把directx_nov2008_redist.exe(用WinRar,因为它其实就是一个自动解压的压缩包)解压缩到一个目录里,找到里面的dxnt.cab包。接着继续把dxnt.cab解压缩到另一个目录里(姑且名为t:\dxnt吧)。

  3. t:\dxnt目录里找到这几个dll文件,把它们复制到c:\windows\system32下:

    • 文件列表见正文。
  4. 右键点击dmusic.inf,选择“安装”命令。

现在试着启动Rise Of Nations看看?

类型:随感,创建时间:Dec. 31, 2011, 5:36 p.m. 点击查看完整内容。。。
MySQL在初始化权限表时报duplicated key ‘localhost-’错的原因

最近做了一个脚本能够自动将我们在程序以及相应的配置文件、附加库等安装到Linux。平常手动操作的话要半天时间,现在只要十分钟了。而且还大大减少了错误的可能性。这让我十分满意。

可惜这两天碰到一个错误,在脚本安装MySQL的那一步出现了错误。仔细考虑安装MySQL的步骤哪里出错了。首先脚本将从官方网站下载的MySQL解压到/usr/local/project/mysql下。然后根据MySQL安装指南的命令添加mysql用户和组、改变文件的属主以及读写权限,接着运行MySQL的初始化脚本。最后改变data目录的权限。仔细一看,发现只有运行初始化脚本的那个步骤报了错误,其它几个步骤都有达到命令所要求的目的。

初始化脚本的报错信息大概是duplicated key 'localhost-'。之后服务器就没有验证信息,无论使用任何方法都没办法登录(–skip-grant-tables不算)。经过查证,发现这是因为MySQL创建权限表时对于root用户会创建两条记录,一条是root@'localhost',另一条是root@hostname。其中的hostname如果跟localhost重名的话就会报这个错误。

所以这个错误就很好解决了。只要改一下主机名就OK了。。

类型:LinuxApp,创建时间:Dec. 31, 2011, 5:32 p.m. 点击查看完整内容。。。
统一KDE3和KDE4程序的外观

使用Linux的朋友应该都会注意到Linux程序的外观通常是不统一的。因为在Linux下面存在着各种各样的图形库。这些图形库由不同的社区维护,在十年之内统一他们估计是不可能的了。想要一个统一外观的Linux,最好的办法只能是尽量选择由使用同一种界面库的程序集合。

目前主流的界面库有三种:gtk2、qt3、qt4。很多Linux下的程序使用GTK2界面库。目前大多数的Linux发行版都使用了GNOME桌面作为默认桌面环境,简单地使用他们就能得到统一的界面了。

从Windows转换到Linux环境的朋友一般会觉得KDE桌面更顺手一些。而且,与GNOME桌面相比,KDE的对应程序功能更加强大,运行更加稳定。可惜,KDE底层界面库最近两年升级,形成了qt3和qt4两种版本。这两个版本使用了不同的配置文件,因为外观上不大一样。不过没关系,使用本文介绍的方法就可以统一他们的外观了。

首先要明白,KDE程序的外观由三部分组成:风格(Style)、颜色(Color)、字体(Font)。风格是指按钮、滚动条、菜单的绘制方法。在KDE的配置程序中,这三个部分都位于“观感(Apperance)”里。

那好,现在就开始动手配置KDE。分别运行KDE3和KDE4的配置程序kcontrolsystemsettings。选相同的风格、相同的颜色、选相同的字体。需要注意的是,KDE3和KDE4相同的风格不是很多,目前只有少数的几种,有些朋友可能就得忍痛割爱了,可能内置的这些风格不是很适合;另外选字体的时候要注意“圆整字体边角(ClearType)”的设置也要一样。我的选择是Plastique(塑料)风格+QtCurve颜色+10号宋体。最后的效果非常好。

上面应该很多朋友可以做到吧。不过还有一些不大容易注意到的,比如root用户的设置可能不大一样,当我们运行管理程序的时候就觉得很碍眼。不过这个也简单,分别运行下面两条命令:

kdesu kcontrol
kdesu systemsettings

就可以打开KDE3和KDE4的设置程序。修改他们跟普通用户的配置一样就OK了。

希望KDE4早日成熟,我们就不用这么麻烦了。

类型:LinuxApp,创建时间:Dec. 31, 2011, 5:27 p.m. 点击查看完整内容。。。
用Linux作NAT的简单例子

今天闹了一个笑话。我居然说启用IP_FORWARD之后就是NAT了。

很多有两台电脑的朋友应该都会想怎么样让自己的两台电脑都连上网。 如果其实有一台是WINDOWS的机器,应该是很简单的。只要保证直接连网的机器有两个网卡,然后做一个"Internet连接共享"就可以了。

Linux的机器就比较麻烦一些了。因为Linux下图形界面的工具基本太少。只能用命令来做。同样也是在直接连网的机器(称为Router吧,另一台机器则称为C吧)上安装两个网卡。配置好网络之后,分为三步(都需要root权限):

  1. 启用IP转发。方法是在Router里输入:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  2. 做个NAT。命令是:

    /sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.0.1.0/24 -o eth1 -j MASQUERADE
    

    这条命令比较复杂,/sbin/iptables -t nat -A POSTROUTING是固定的,说明这条命令是做NAT的。

    -s 192.168.1.0/24是指你的两条机器形成的内部网络的网络地址。也可以写成192.168.1.0/255.255.255.0。这两种写法是一样的,详细情况可以Google一下无类IP地址。

    -d 10.0.1.0/24则是外面网络的地址。如果写上这个,表示内部网络的机器只能访问10.0.1.0/24这个网段。通常就不必写了。

    -o eth1,表示凡是满足条件的数据包都转到第2个网络接口上。

    -j MASQUERADE是固定的。。

  3. 在机器C上把默认网关写成Router的IP。

类型:LinuxApp,创建时间:Dec. 31, 2011, 5:13 p.m. 点击查看完整内容。。。