debian6.0修改Grub2支持高分辨率console

以前配置grub1的方法是修改/etc/grub.conf,而grub2则是修改/etc/grub.d/里面的脚本。里面的脚本过于深奥,我稍微查看了一下,改分辨率的方法是修改/etc/default/grub的内容:

在GRUB_CMDLINE_LINUX里面增加内核参数:

GRUB_CMDLINE_LINUX="vga=792"

注意要注释掉:

# GRUB_TERMINAL=console

默认这一行是注释掉的,不然vga就没用了。

做完调用grub-mkconfig -o /boot/grub/grub.cfg刷新一下配置。

类型:LinuxApp,创建时间:Jan. 1, 2012, 6:53 p.m. 点击查看完整内容。。。
Python的类、对象,以及classmethod的意义

先看一下这两行代码:

>>> class Fish:pass
>>> f=Fish()

f就是Fish类的实例,它是一个对象(object),很明显吧。 Fish是类,它也是一个对象(object),如果你以前学的是C++或者Java,可能会难以理解。 不管怎么样,在Python内部,它们都用一个PyObject结构体表示,你可以修改对象的属性, 调用它们的方法。

类与实例两种对象有什么区别呢,下面的代码运行于python 3.1版本:

>>> Fish.isAnimal=True
>>> print(f.isAnimal)
True

我们定义Fish是一种动物,显然f更是一种动物了。

>>> f.name="老鱼"
>>> print(Fish.name)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Fish' has no attribute 'name'

我们定义f这条鱼的名字是"老鱼"。这时候,Fish并不会自动拥有名字这个属性,总不能说 鱼都是叫“老鱼”吧。

类的实例可能比较好理解,但是类居然可以有属性,可能有些C++/Java程序员难以理解。

使用classmethod修饰的函数第一个参数是类对象。平时它没什么用,只有继承关系比较复 杂的时候才能派上用场。我以前学classmethod的时候写过一段代码:详情请点击查看正文。

类型:Python,创建时间:Jan. 1, 2012, 6:46 p.m. 点击查看完整内容。。。
打造自己习惯的Python命令行环境

使用过一段时间的Python之后,大多数朋友可能已经发现自己经常使用的是Python某一部分的功能。比如习惯拿Python来当计算器的朋友,最喜欢的是运行Python的命令行之后就打一个:

from __future__ import division
from math import *

每次运行之后都要输入这些命令不免麻烦,幸好Python开发者早就替我们考虑好这个问题了。可以通过设置"PYTHONSTARTUP"这个环境变量让Python命令行每次运行后都自动做这些事。

比如,我们可以编写一个名为startup.py的文件,它的内容是:

from __future__ import division
from math import *

假设将它保存到H:\Documents\myconfig\startup.py。然后设置环境变量PYTHONSTARTUP=H:\Documents\myconfig\startup.py。下次运行Python命令行之后,输入sqrt(2)试试。

类型:Python,创建时间:Jan. 1, 2012, 6:33 p.m. 点击查看完整内容。。。
怎么样将VMWare默认的Ctrl+Alt快捷键改为右Alt键

习惯使用Virtual Box然后改用VMWare的朋友可能会对它默认的右Alt快捷键印象深刻,特别是对安装Linux虚拟机的朋友来说更是如此。比如,在Linux下,经常要按Ctrl+Alt+Fn来切换控制台,Virtual Box直接按下此组合键即可,而VMWare则需按Ctrl+Alt+Space,然后放开Space按Fn才有效。如果直接设定为不区分左右的Alt键也不行,菜单命令和Emacs快捷键都会失效。

那,能不能让VMWare跟Virtual Box一样呢?直接使用VMWare的首选项对话框目前是不行的,只能配置使用Alt键或者Ctrl键,不能配置左右。后来通过Google,我发现了一种修改VMWare配置文件的方法。原来,VMWare并非不支持此功能,而是隐藏起来了。

首先要找到VMWare的配置文件。它位于C:\Document and Settings\username\Application Data\VMWare\preferences.ini

类型:随感,创建时间:Jan. 1, 2012, 6:28 p.m. 点击查看完整内容。。。
在Windows下使用KDE的Phase样式

KDE的Phase样式是我最喜欢的样式之一。我觉得它看起来非常稳重、简洁,很适合作为日常工作的默认样式。原来以为它只能工作在KDE环境,直到半年前看KDE代码的时候才发现它原来是一个Qt样式,因此,开发Windows软件的时候完全也可以使用它。

在Windows下编译Phase样式很简单,只要把Phase的三个文件复制过来,假定放在D:\phase下。然后编写这么一个工程文件:

#phase.pro
TEMPLATE = lib
CONFIG += plugin
HEADERS += bitmaps.h phasestyle.h
SOURCES += phasestyle.cpp

接下来Qt程序编译标准步骤:

h:\phase> qmake
h:\phase> mingw32-make release

编译成功后,可以在h:\phase\release下找到phase.dll文件,复制到Qt的$QTDIR\plugins\styles目录后就可以使用Phase样式了。

类型:C++ & Qt4,创建时间:Jan. 1, 2012, 6:01 p.m. 点击查看完整内容。。。
PyQt里让文本编辑器自动滚动

前两天看txt小说的时候,手头找不到小说阅读器,就顺手写了一个。主要功能是让文字自动滚动。原理超简单,让QTextBrowser的滚动条每隔一段时间往下拉一点就可以了。好了,上代码:

vb=self.textBrowser.verticalScrollBar()
if vb.value()>=vb.maximum():
    return
vb.setValue(vb.value() + 2)

据我试验,QPlainTextEdit滚动条拉动时以行为单位,每次滚动只能下拉一行。用QTextEditQTextBrowser不会有这个问题。

类型:Python,C++ & Qt4,创建时间:Jan. 1, 2012, 5:54 p.m. 点击查看完整内容。。。
中国式女权是伪女权,本质是要求不劳而获–非诚勿扰(转载)

现在的女人有个特点就是人生观的取舍带有非常浓重的功利色彩,既封建又现代,既大男人主义又女权主义。

1,结婚之前,她们要这要那,要房子要车子要票子,还要求男人得能干会赚钱,而自己能力如何无所谓(结婚以后也要求男人挣钱养家,而自己的收入自己留下来 做零花)。这实际上是继承了封建社会男尊女卑的传统,想把自己像一个富家大小姐那样风风光光的嫁出去,然后对方像养阔太太一样把自己养起来,而且对方既然 要求自己“做对方家“的人,是把自己“拿“走了,那么对方当然还得付给自己家一大笔彩礼。就好像买卖东西一样,这本质上是延续封建社会的传统。

2,结婚以后,又反过来了,放下了封建主义的幌子,开始挥动女权主义的大棒。她们嫁到了男家,却三天两头往娘家跑,往外跑忙自己赚钱,赚了钱也不供给家 用,而是留着自己零花;也不肯干家务,在家务上开始要求男女平等,甚至干脆把家里的家务都推给男方,声称自己是女性应该多受照顾,那些要求女性包办家务的 行为是老封建。离婚的时候,继续所谓女权思想,要求男方把房子车子孩子票子都给自己,声称这是现代社会出于所谓的“两性公平“地考虑。

这可真是怪了!她们到底奉行封建男权思想,还是奉行女权主义?

类型:随感,创建时间:Jan. 1, 2012, 5:50 p.m. 点击查看完整内容。。。
窗口最小化后隐藏

通常最小化的窗口会在任务栏上显示一个按钮。当用户按一下这个按钮,窗口就还原了。这是一个被大多数桌面环境,比如Windows,KDE,GNOME所采用的普遍设计。不过,因为任务栏通常只是桌面边上一小行,容纳不了很多按钮,用户通常希望把那些不常用的程序隐藏起来,只在通知栏显示一个小图标,要使用的时候再点击那个小图标恢复窗口。这种作法最典型的例子是QQ和Winamp。

最基本的思路是拦截窗口的最小化事件:

void MyWindow::changeEvent(QEvent* event)
{
    if(event->type()==QEvent::WindowStateChange)
    {
        if(windowState() & Qt::WindowMinimized)
        {
            QTimer::singleShot(0, this, SLOT(hide())); //修改这一行
            mSystemTrayIcon->show();
        }
    QMainWindow::changeEvent(event);
}
类型:C++ & Qt4,创建时间:Jan. 1, 2012, 5:49 p.m. 点击查看完整内容。。。
编写兼容Python2.6与Python3.0的程序

简而言之,在所有的py文件头加上:

# -*- coding:utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import
try:
    str=unicode
except NameError:
    pass

然后按照py3k的方式写程序。对于某些被重命令的库要处理一下。比如

try:
    import xmlrpclib as xrc
except ImportError:
    import xmlrpc.client as xrc

open()别用了,改用io.open()

其它的细微差别,多读一下py3k的"what's new"基本上搞定

类型:Python,创建时间:Jan. 1, 2012, 5:32 p.m. 点击查看完整内容。。。
编译Python源代码

在日常生活中,Python代码一般是不编译的,几个py文件复制来就能用。再加上脚本语言的名头,有些不太了解Python的朋友就以为Python没有编译这个过程。其实,虽然Python是脚本语言,但它与Java和C#一样,只能执行字节码。只是Python将编译过程隐藏起来,不大明显而已。今天这篇笔记详细记述一下Python的编译过程以及一些技巧:

  1. "优化"编译后的字节码。
  2. 禁止生成".pyc"文件。
  3. "反编译"Python字节码。
类型:Python,创建时间:Jan. 1, 2012, 5:05 p.m. 点击查看完整内容。。。
一个判断密码强度的函数
def judgePasswordStrength(password):
    strengthLength = max(0, len(password) - 5)
    from string import ascii_lowercase, ascii_uppercase, digits, punctuation
    flags = [bool(set(password) & set(s)) \
            for s in [ascii_lowercase, ascii_uppercase, digits, punctuation]]
    return min(flags.count(True), strengthLength)
类型:Python,创建时间:Jan. 1, 2012, 4:55 p.m. 点击查看完整内容。。。
(翻译)为什么Python的字符串是不可变对象

翻译自http://effbot.org/pyfaq/why-are-python-strings-immutable.htm

不可变对象是指一旦生成后不能被改变的对象。他经常与可变对象相提并论。比如Python的tuplelist,它们的行为有点类似。但是可以list对象内添加新的元素。而tuple则不可以。Python的字符串被设计成不可变对象有几个优点。

首先,可以提高性能。假定字符串是不可变对象,意味着字符串具有确定而不可变的存储需求,解释器可以为它分配一段固定的内存。这也是为什么要分为tuplelist两种类型的原因之一。让字符串成为不可变对象还可以让解释器重用该对象。比如,CPython在实现中预先申请了所有的单字节节符,并且,如果字符串运算后的结果与运算前相同,就会返回运算前的字符串(*)。

另外,在Python里,字符串就像数字一样,被认为是表示思想的最基本的材料。在Python里,没有任何方法可以把数字8变成其它东西,同样,也没有办法把"eight"这个字符串变成其它东西。

另外,使用不可变数据结构(immutable data structures),比如字符串,元组,强调了一种无副作用的编程方式。采用这种编程方式所编写的函数接收输入的参数,进行运算,然后返回一个容纳结果的新对象。而不是修改输入的参数,使它变成运算结果。当然了,有时候必须做一些有副作用的操作,比如修改对象的状态。这种事最好仔细考虑一番,因为无副作用的编程哲学能够让你的代码更加模块化,使其独立于其它代码。

类型:Python,创建时间:Jan. 1, 2012, 4:50 p.m. 点击查看完整内容。。。
Qt窗口的删除、析构

Qt内关于窗口的删除是一个复杂的事情。接下来详细地讲一讲。

当我们创建一个窗口时,如果这个窗口是一个顶级窗口,准确地说是w.windowFlags().testFlag(Qt.Window) is True的窗口,Qt会自动附加一个Qt.WA_QuitOnClose属性。它的意思是,窗口被关闭了,qApp.lastWindowClose信号会被触发。

默认情况下,qApp接收到此信号后会退出程序,这个行为相当于在初始化程序时:

qApp.lastWindowClosed.connect(qApp.quit)

要修改这个默认行为,可以设置QApplicationquitOnLastWindowClosed属性,比如:

qApp.setQuitOnLastWindowClosed(False)

通常,用户可以点击窗口的关闭按钮关闭窗口,或者当系统关闭的时候,窗口也会被关闭。我们可以通过重载窗口的closeEvent()函数控制关闭动作,比如询问用户要不要保存文档,或者只是最小化窗口。下面是一个例子:

def closeEvent(self, event):
    if self.maybeSave():
        self.saveSettings():
        event.accept()
    else:
        event.ignore()

我们也可以在菜单里设置一个退出命令,点击它的时候调用窗口的close()函数即是关闭窗口。

关闭窗口之后,通过我们还要手动销毁这个窗口,释放它所占用的内存。对此Qt提供了一个简便的办法,只要将窗口的Qt.WA_DeleteOnClose属性设置为true,Qt会自动帮我们销毁这个窗口。

类型:Python,C++ & Qt4,创建时间:Jan. 1, 2012, 4:42 p.m. 点击查看完整内容。。。
猜猜这人是谁(转载)

有一个男人,他19岁娶了18岁的女友、

24岁時和只有18岁的秘书交往并結婚

28岁见到1岁的女嬰,开始光源氏计划、

在31岁到日本旅行认识一名15岁的女仆,

隔年认识10岁的萝莉,

在日本旅行期间就周旋于女仆和萝莉之间,

38岁和萝莉結婚、39岁回到中國,

49岁光源氏计划成功,把22岁的小妹妹带回家,

后來活到59岁死亡。

请问这人生的贏家是哪个历史人物?

类型:随感,创建时间:Jan. 1, 2012, 4:37 p.m. 点击查看完整内容。。。
异端,去死吧(转载)

一个人走过海旁,看见另一个人想跳海自杀。

他走上前去劝说「先生,不要跳下去!」

那人问道:「为甚么?」

他说:「生命是美好的嘛!你是无神论者还是有宗教信仰?」

那人答:「我有宗教信仰。」

「佛教、道教、回教还是基督教?」

「基督教」

「罗马天主教还是新教?」

「新教」

「我也是新教呢!圣公会还是浸信会?」

「浸信会」

「太好啦!我也是浸信会,你是Baptist Church of God还是Baptist Church of the

Lord? 」

「Baptist Church of God. 」

「真是太奇妙啦!我也是,那你是原教旨的Baptist Church of God还是改革派的?」

「改革派的」

「1879年的改革派还是1915年的?」

「1915年的改革派。」

那人朝他屁股一脚把他踢进海里:「异端!去死吧!」

类型:LinuxApp,随感,创建时间:Jan. 1, 2012, 4:36 p.m. 点击查看完整内容。。。
使用M2Crypto加密数据

本文是一个M2Crypto的基础教程。介绍了如何使用M2Crypto完成以下任务:

  1. 如何使用MD5、SHA1等消息散列算法。
  2. 使用对称加密算法加密数据。
  3. 生成RSA密钥
  4. 生成DSA密钥
  5. 载入DSA密钥与RSA密钥
  6. RSA类型的操作——使用RSA加密、解密、签名、认证;保存RSA密钥
  7. 一个小型的CA,电子证书。

研究M2Crypto时参考了OpenSSL的源代码,因此本文对学习OpenSSL的同学或许也有些参考意义。

类型:Python,创建时间:Jan. 1, 2012, 4:35 p.m. 点击查看完整内容。。。
聊聊Pyhon的encodings

本文讨论python各种奇形怪状的编码:

  • base64
  • bz2
  • hex
  • idna
  • punycode
  • quopri
  • raw_unicode_escape
  • rot_13
  • string_escape
  • undefined
  • unicode_internal
  • utf_8_sig
  • uu
  • zlib
类型:Python,创建时间:Jan. 1, 2012, 9:15 p.m. 点击查看完整内容。。。
使用QToolBox时,pyuic4的一个编译错误

有时候QtDesigner生成的窗口如果包含QToolBox,使用pyuic4编译的时候会出错。经过调查,我发现主要是因为QtDesigner在创建QToolBox的页时会自动生成页面的名字。可能是因为翻译的问题,页面的名字是中文的(page变成)。页面的名字会编译成python的变量名。在python3k之前,使用中文作为python的变量名显然是不合适的。所以会提示错误。

如果发现pyuic4发生错误,可以试着加入调试选项:pyuic4 -d main.ui。 可以解决很多像QToolBox那样的错误。

类型:Python,C++ & Qt4,创建时间:Jan. 1, 2012, 2:54 p.m. 点击查看完整内容。。。
使用Qt实现从资源管理器中拖动文件到应用程序的功能

我是EditPlus和FileZilla的用户。这两个软件都支持文件拖拽。我们可以从资源管理器中拖动一个文件到EditPlus的窗口,EditPlus就会自动打开这个文件。或者拖到FileZilla的远程窗口内,FileZilla就会自动将文件上传到服务器。我经常希望自己的软件也支持拖动的操作。

作为基本功能,大多数操作系统都各自定义了拖放所需的通信协议。Qt对此做了一个很好的封装。基本的流程是:当用户从其它应用程序拖动文件、文本、图像等到Qt程序时,Qt会自动产生一个DrapEnterEvent,应用程序可以判断数据是不是可以处理的。如果能处理,就反馈给Qt,这样的话,用户就会看到一个接受拖放的标识。待用户放开鼠标时,Qt再产生一个DropEvent。最后应用程序从事件中取出数据进行处理。

那么应用程序如何判断程序是否可以处理拖放的数据呢?很简单,数据中包含了MIME类型。MIME类型是一个用于标识二进制数据类型的Internet标准。很多朋友可能习惯通过文件的扩展名来判断数据类型,但是扩展名只有短短的几个字符,常常有歧义。通常,如果应用程序要处理文本,就判断MIME类型是不是"text/palin",如果要处理JPEG图像,就判断MIME类型是不是"image/jpeg",等等。同一段数据通常包含多种MIME类型,比如拖动富文本时,数据中可能包含纯文本、HTML文本、图像。应用程序可以选择处理所支持的数据格式。

具体如何处理从资源管理器拖动的文件呢 ?请点击查看正文。

类型:Python,C++ & Qt4,创建时间:Jan. 1, 2012, 8:52 p.m. 点击查看完整内容。。。
小技巧:让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. 点击查看完整内容。。。