用vga_switcheroo在Linux下(开启KMS)彻底关闭某一可切换显卡的简单教程


私在早先时记载过自己一直为一个问题所扰,就是私配备双显卡的Ideapad Y460在BIOS中仅支持“可切换”(switchable)和“独立”(原文为discrete graphic)两种模式。而当使用可切换模式进入Linux后,虽然只有集成显卡在使用,但两个显卡都会同时耗电,导致温度很高。虽然用独立显卡+催化剂(Ati的商业驱动)可以获得不错的效果,但会有诸多麻烦事情,更何况这样一来集显的节能优势就消失了。

我曾在谷歌上粗略查找过很多彻底关闭独立显卡的方案,然而就目前我看到的中文解答来说,除了那个ubuntu关闭独显的脚本还靠谱外,基本都是不靠谱的答案。直到我最近从Arch的Wiki辗转到了ubuntu documentation才找到一个使用内核自带的vga_switcheroo关闭显卡的方案。在此记述一下。
声明:本文只是记述了最主要的内容,详细内容可以从这个页面中找到。

//

下面进入正题:

首先,vga_switcheroo是内核提供的组件,但有这一组件(或者说有下文提到的文件)并不代表其在您的机器上能够正常使用。此外根据某些用户提供的信息,vga_switcheroo仅当KMS开启状态下才可用,所以请首先装好显卡的开源驱动并保持KMS开启。

一、查看当前双显卡使用状态:

终端中输入:

cat /sys/kernel/debug/vgaswitcheroo/switch

这步是要读出/sys/kernel/debug/vgaswitcheroo/switch这一文件的信息。不出意外您可能会看到类似下面(但不完全相同)的内容:

0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0

其中“IGD”表示集成显卡,“DIS”表示独立显卡;加号(“+”)表示当前用作输出(或称“连接上”(connected))的显卡;“Pwr”代表正在供电,“Off”代表已关闭。如果看到两个显卡都显示“Pwr”,则说明都在消耗着电能。

二、暂时性的关闭某一显卡

注意:下面和内核的交互操作是通过操作/sys/kernel/debug/vgaswitcheroo/switch这个“虚拟文件”实现的,而这一文件每次开机会重新创建,所以您对其所做的修改都是暂时的,重启后会失效。

首先切换到root用户:

su

这步通常是必要的,不可用sudo取代(似乎是因为sudo如果不经设置,是没有“>”操作符权限的)。

打开所有的显卡:

echo ON > /sys/kernel/debug/vgaswitcheroo/switch

这步是给所有显卡加电,使其运行,但不改变当前输出的状态。

切换到集成显卡:

echo IGD > /sys/kernel/debug/vgaswitcheroo/switch

这步表示使用集成显卡作为输出(即“连接上”集成显卡)。同理,将其中的“IGD”换成“DIS”可使用独立显卡。

关闭未使用的显卡:

echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

最后可以再运行一下cat /sys/kernel/debug/vgaswitcheroo/switch,看一看自己的显卡状态。

三、永久性的关闭某一显卡

解决重启后失效的办法就是每次开机时都执行一遍需要的命令,而且越早执行越好。对于这个问题,不同的发行版有不同的解决方案。例如在我所用的Arch Linux中有一个/etc/rc.local文件,把需要开机执行的命令写进去即可。对于ubuntu,可以参考ubuntu documentation上的一个启动脚本。我没有尝试过加环境变量是否有用,但似乎也应该是可以的。

//

后记:3月14日帝都(室温约20度),开启acpi节能的情况下,我的Ideapad Y460使用集显,打字、浏览网页等操作,CPU温度不到37度,电池续航4小时以上,真是太舒爽了……

回味FAD 2011


题目中的这个FAD不是黄素腺嘌呤二核苷酸,而是Fedora Activaty Day。LinuxToy上呼吁参与者稍微写一些感想,我也觉得确有写一些东西的必要了,于是就把这篇短文写了出来。

老实说,作为一个学医的,平时就不算太闲,最近更是相当繁忙的一段时期,本不应该抽空去FAD这样的“没用”的东西。然而我实在是很想找一段小小的空闲,暂时忘却一下现实的重压,寻找一点或许是虚假的、稍纵即逝的快慰。因而虽然里面的多数东西我都听得半懂不懂,却仍旧挺高兴,挺感动。见到了 @CSSlayer 仁兄以及在各种虚拟空间神交已久的诸君,觉得难得有一天如此开心。

 

可惜的是我的抒情功底实在太差,所以无论我如何安排,下面的记叙总还是免不了流水帐:

上午的内容我不想再赘述了,就在我写这篇网志的时候,我看到CSSlayer仁兄的FAD回忆网志写好了,可以点击这里去参考他的。对我等来说,下午的内容才是重点,也是真正的FAD内容。

本次FAD 11是和开源软件周合办的,所以下午的小会同时有多个内容并行。按照CSSlayer仁兄的说法,我所在的那个屋子是个Geek聚集地。是不是Geek我不清楚,不过大家基本上都是开源软件的爱好者。虽然专攻不同的领域,但也算是志同道合,相当愉快。不过就内容而言我只记了个大概,具体内容则是忘得差不多了。 @Tiansworld 和 @黑日白月 (Tommy He)兄讲翻译的时候提到了Qt Linguist,是我刚好想学一学的;CSSlayer仁兄讲的是plasmoid开发,这东西讲不了啥实质性内容,只是介绍了一些概况和参考,不过让我印象深刻的是貌似每次不论讲了啥,都能吸引点人去玩玩KDE,看来广告/代言真的是很重要的; @jcome 仁兄讲的是一个2D动画制作软件,大概是想找Flash替代品的人的福音,但说实在我已经多年不玩动画制作了;最后 @alick 仁兄关于TeX Live的演讲我也听了一些,因为我一直想研究下TeX但一直没有时间。另外还见到了Calligra的开发者之一—— @yue ,他居然平时用Qt Creator(据本人说是因为KDevelop打开大工程太慢,跑不动),虽然没聊几句话,但都很愉快。

结束的时候发纪念品。对于纪念品这东西,其实我还是蛮在意的,倒不是贪那点小便宜,只是为留个念想。最后拿到了一张fedora15 64bit的光盘,心想以后大概还能恢复系统用。

也许是因为来得相对早,我很幸运地拿到了中午的饭票,吃了顿比格批萨。虽然没有像有一次同校聚会那样暴饮暴食,不过也算是吃得相当满意了。晚上去了个小地方,虽然作为一个学医的,我对那些触目惊心的卫生细节表示有些难以接受,然而最后还是吃了不少东西。另外晚上去吃饭的时候跟若干同道边走边聊,了解到大家都有尝试各发行版的辛酸史。吃饭的时候也跟他们聊了聊闲话,还是蛮轻松的。

另外还有个小插曲,CSSlayer仁兄把耳机落在了会场,结果他手机恰好没电,于是乎他本来都回到学校了,又折返回来拿了耳机,后来我跟他一起离开了吃饭的地点。

 

基本就是这样了吧……引用某人的一句话:“如果我有什么忘了说的,就当我没说好了。”……

这个假期


假期将尽,接下来是繁忙的基础课年,之后又有更多的实验、实习,恐怕连假期都很难过上,因而这个假期大概是私最自在的一个。然而回顾这个假期,很多既定的目标终究没有实现,不能不说还是有所遗憾。

这个假期究竟做了什么有意义的事呢?继续学习了C语言,也学了点C++的基础思想,这是不假。然而生产力显然还没有真正构成。一门语言也不是用假期里的一点点空闲时间就能熟练掌握的,更莫提数据结构与算法了。本想在学过C++基本思想后再学一些Qt,然后给fcitx写个皮肤浏览器,算是为开源界做些贡献,然而最终却连fcitx读取皮肤配置文件的API都没有搞懂,到现在整个程序仍旧基本是与csslayer大神会面时由他所写的半成品。大概唯一能用的成果就是用C重写的会员卡管理程序,当然黑乎乎的文本界面加麻烦的操作方式,大概也没多少人愿意用。

根据某资料,我等来年需要学习的必修课程有:解剖、组胚、人体生理、生化、免疫、细胞生物、医学遗传、微生物、寄生虫、预防医学、神经生物、病理、药理。在这种状况下似乎也很难再继续研究编程了。然而csslayer大神也提到过,人的精力是有限的,很多时候能做成一两件想做的事就很幸福了。那么私根据自己的愿望选择了学医,大概也会是幸福的吧……

其实私本来还想多写些东西,然而有时又觉得这种想法实在是种完美主义,更何况长篇大论没有人愿意看,那么就这样结束吧……

用C语言重写的会员卡管理程序,欢迎Linux众测试


终于重写完毕了,不过Bug肯定很多,欢迎诸君测试。由于未在Windows下调试,且有磁盘读写的相关代码,若有热心的Windows用户想通过源代码编译还请自行删除可能产生的垃圾文件。

Linux用户可用的二进制程序:

https://skydrive.live.com/?cid=D40A6A1CE1A272AC&id=D40A6A1CE1A272AC%21507&sc=documents

源代码在此,欢迎给出指导:

http://github.com/ukyoi/cardmanage

我不太会用github,所以有些混乱,还请原谅。

最近的动作


好久没码字了。主要原因仍旧是太懒,觉得码字太耽误时间,但其实在互联网上闲逛也很耗时间,每天似乎没做什么事就流逝掉了。

当然,也不是什么事都没做。最近在把私曾经那个用Python写的代码再用C重写一遍……私承认这个想法有点蛋疼,但是这么做还是有一定原因的。首要原因是私的目标是未来使用Qt图形库,写这个文本的会员卡程序只是练练手。PyQt虽然有文档,但私找到的教程都不是很系统也不很容易理解。原生Qt是使用C++的,有详细的官方文档,所以私打算先涉及C/C++,然后把原生Qt学会,再学PyQt这样的语言绑定。所以私并非放弃Python,而是暂时先搁置一下而已。

然而直到开始写,才直到用C写程序是有多么困难。私会员卡管理程序的第一版只有180行python代码。而现在写了200+行C代码,只实现了不到一半的功能。当然也有其他的原因,第一版的程序流程控制有很大问题,误操作之后要从主菜单重新选过,非常麻烦,而现在私在写的时候会尽量考虑到误操作之后怎么处理的问题。然而总体来说,C语言的头文件、声明以及表示代码段的括号等等都是很占地方的。

而且……啃C语言的教材也是相当困难的事情……大概我在这方面没什么天赋吧……

Ubuntu 11.04 Release Party


由于谷歌地图给的车站位置不是很准,所以迟到了若干分钟。具体的困难就不说了……

算了还是说一说吧……首先我参考了两条路线,但是谷歌地图给的位置不准,于是乎只找到了一条线的站牌。由于和同学一道吃饭,吃完饭就点晚了,本来就很着急,结果等车时我眼睁睁地看着三辆我没找到站牌的那路车先后驶过,自己要等的不见一辆。我寻思这样不行,得找到那一路公交车的站牌。就在我走了一站地之后,我刚才一直在等的车出现了……

不过到得还不算太晚,看到了计算机科学屠戮者大神。让人觉得幸运又诡异的是第一排居然还有座,于是我当仁不让……

下面开始记录内容:

第一位基本没听到,听到的主要是他没少黑Unity——其实不算黑,因为本来Unity问题就很多——此外貌似他也不咋喜欢Gnome3,至少不喜欢现在的Gnome3。并且一定不认为“用户的言论毫不足虑”。大概是因为讲得不是很有趣,底下非常非常乱……但其实我觉得内容倒还有点意思。

第二位是苏大神的“一个菜鸟的爬行轨迹”,从他的演讲内容来看显然不是个菜鸟,因为他居然曾经直接把OpenFetion的代码翻出来然后“翻译”了。讲的内容主要是跟他相关的翻译问题。吐槽点甚多,而且居然好多我都知道……另外貌似这是“山东口音”?

第三位……嗯……首先更正一下上文的一处。事实是除了苏神那个充满山东腔的演讲不是很混乱以外,后面的演讲都很混乱,甚至包括人都走了一大半的下半场报告。第三位是叫做Levin的研究生(大神?),OpenFetion的发起人,很让人无语的是演示居然是全英文的(当然是用汉语讲的),而更让人无语的是苏神吐槽的时候就提到OpenFetion把汉字直接写进代码以至于给本地化带来了大量问题……
主要讲了他自己开发OpenFetion的过程,以及OpenFetion的一些技术细节。OpenFetion居然是用反编译得到的飞信协议的代码,不知道中国移动会不会告他……

第四位……计算机科学屠戮者大神……KDE4.6终于上场了……一开始居然让我们看到了启动列表……乃居然没在本地装kubuntu……
演示居然也用的英文(难道这是当今的趋势?)……不过显然要好看得多,因为图多,当然更重要因为KDE4漂亮……也许更重要的是有魔法少女小圆的壁纸?让我很搞不懂的是大家为啥对ACG如此敏感……当然也有人对屏幕右下角的照片很敏感。
首先浏览了KDE的历史……我是从4.2开始用的,看着很有一种熟悉的感觉啊……从休息时候的聊天来说貌似还算卖成功了。不过我个人认为从讲解的过程来说基本还是幻灯较多,实际演示较少……并且最后把KDE弄成类Unity界面的时候因为屏幕显示的原因,左面一列没有显示出来。其实KDE的效果应该用更多动态的效果来展示……当然还有krunner这样低调绽放(quietly brilliant)的组件……
当然我个人觉得最后这演讲是整个release party里面最好玩的。和第一个讲Unity的对比来看算是丰富得多了。因为Unity本身也没什么可讲的。而KDE众多的功能、软件绝对不是一时半刻能说完的。

课间休息……

下半场……貌似主题是Bug回报。一个是讲了一些中文ubuntu的问题,一个是怂恿人们积极、高水平地回报Bug,甚至还给我们演示了一下如何用调试代码来查kernel的Bug,不过我怀疑此人逻辑有点问题,前面说报Bug态度不能太差,后面又说在邮件列表舌战很有趣……

//

最后……其实我的化学书还没啃完,英语网测还有好多没做,英语单词还没背。不过有这样一个参加的机会实在是很难得啊,于是乎还是来了。怎么说呢……算是不虚此行吧,至少还索取了个10.04(居然不是11.04)的光盘呢……

Arch恢复


首先感谢计算机科学屠戮者大神,在私的PC上大大地展现了一番bash功力。当然他自己未必觉得如此,但私看得却是眼花缭乱得很……

其实不能挂载的症结就是私grub配置不知怎地(反正绝不是私搞的),挂载root分区那行里的“ro”莫名其妙地变成了“rw”,以至于root被挂载为读写模式,而Arch自检的时候要求挂载为只读模式,于是就出现问题了。

而这个问题说到根上,都是源于私换驱动的时候用了“pacman -Rns catalyst”的命令,以至于pacman把其依赖——xserver卸掉了,于是乎装了啥驱动也不管用了。

另外其实原先私fstab还有个问题,就是swap挂载写了两遍,所以每次启动会提示swap挂载有误,这次也一并解决了。另外还对系统进行不少小调整,在此不一一赘述。

总之很感谢计算机科学屠戮者大神,不过私想到以后如果再有这样的问题,凭自己这样的能力,大概是解决不了的吧。还是得再研究再学习啊。

Arch挂了……


仔细看了看私以前的日志,发现自己是在1月22日装好的Arch linux。今日——4月16日彻底挂掉。三个月才挂掉,在私用Linux的历史上也还算比较长了,想到这里实在让人哭笑不得。也许只是因为Arch难掌握,所以在胡搞的时候稍稍用了点心吧……

故事是这样的。某日升级的时候发现Catalyst 11.3不支持xorg 1.10以后版本,但Arch的软件源里已经有1.10了,导致无法更新。于是私就打算换开源驱动试试。其实私在开源驱动和Catalyst之间换已经许多次了,都没有出现什么问题。结果这次不知怎么就无法启动X了。私以为是驱动只兼容xorg 1.10,于是就做了一次系统更新,仍旧是没有用。

然后……私做了个极其错误的决定——开testing源。重启之后,mount出错,说继续的话会造成严重数据损失,其中的“will”和“severe”还有专门的着重号。私害怕甚,没有继续,于是只读挂载,要私手动修复问题。对私这Linux万年新手来说当然是搞不定的,于是现在就挂在那里。

其实私只要耐心等待一下,等Catalyst支持新xorg,问题可能就会很容易解决……还是太不谨慎啊……

DFS解迷宫的一些想法


写在前面:私不是程序员,也不是学信科的,也只是最近开始没事的时候翻翻C语言的书。因此阁下很可能会觉得下文所述的想法很原始或是阁下早已用过了。私在此只是记录一下自己的想法。

现阶段私学C语言用的书是宋劲杉的《Linux C编程一站式学习》,里面讲深度优先搜索的时候讲的是个走迷宫问题,用1表示墙,0表示路,从左上走到右下。代码如下:

#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5 

struct point { int row, col; } stack[512];
int top = 0;

void push(struct point p)
{
    stack[top++] = p;
}

struct point pop(void)
{
    return stack[--top];
}

int is_empty(void)
{
    return top == 0;
}

int maze[MAX_ROW][MAX_COL] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
};

void print_maze(void)
{
    int i, j;
    for (i = 0; i < MAX_ROW; i++) {
        for (j = 0; j < MAX_COL; j++)
            printf("%d ", maze[i][j]);
        putchar('\n');
    }
    printf("*********\n");
}

struct point predecessor[MAX_ROW][MAX_COL] = {
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
};

void visit(int row, int col, struct point pre)
{
    struct point visit_point = { row, col };
    maze[row][col] = 2;
    predecessor[row][col] = pre;
    push(visit_point);
}

int main(void)
{
    struct point p = { 0, 0 };

    maze[p.row][p.col] = 2;
    push(p);

    while (!is_empty()) {
        p = pop();
        if (p.row == MAX_ROW - 1  /* goal */
            && p.col == MAX_COL - 1)
            break;
        if (p.col+1 < MAX_COL     /* right */
            && maze[p.row][p.col+1] == 0)
            visit(p.row, p.col+1, p);
        if (p.row+1 < MAX_ROW     /* down */
            && maze[p.row+1][p.col] == 0)
            visit(p.row+1, p.col, p);
        if (p.col-1 >= 0          /* left */
            && maze[p.row][p.col-1] == 0)
            visit(p.row, p.col-1, p);
        if (p.row-1 >= 0          /* up */
            && maze[p.row-1][p.col] == 0)
            visit(p.row-1, p.col, p);
        print_maze();
    }
    if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
        printf("(%d, %d)\n", p.row, p.col);
        while (predecessor[p.row][p.col].row != -1) {
            p = predecessor[p.row][p.col];
            printf("(%d, %d)\n", p.row, p.col);
        }
    } else
        printf("No path!\n");

    return 0;
}

大概意思就是每次弹出一个栈,找到周围所有的合法步骤然后把它们栈压进栈区,下一轮时再弹出最后压入的栈,如果走入死路就再次弹栈,找另外一条可能路线,直到找到迷宫的解。如果栈空了就说明无路可走,打出“No path !”。
但是找到解之后就比较麻烦。如何输出路径呢?这段代码使用的方法是建立一个predecessor数组,用来表示每个点的前趋,然后从最后一个点顺藤摸瓜往前找,逐渐打印出来。但这个predecessor数组占用的空间很大,且只能从后向前找,不便于找到其中的某个特定步骤。怎么解决这一问题呢?作者宋劲杉出了一道思考题,还问读者能够想出几种方法,可见方法是不止一种的。

在正确理解这段代码之前,私一直认为栈区中至少应该存有正确路径走过的所有的点,后来才明白这个想法是有问题的。由于每个循环开始时栈顶已经弹出了,此时如果再在这一点继续向深处找,新压入的栈就会把刚才弹出的栈顶覆盖掉,这样找到最后整个栈中在极端情况下(例如整个迷宫都没有岔路)可能一个点也不剩。此外一个循环内是4个方向均会搜索,所以如果有岔路,就会压入多个点,但弹出时只会弹出一个点,所以栈中会残留错误道路的点。

怎么修改呢?其实很容易。原来每个循环会从栈顶弹出一个栈,其实找到路径之后,完全可以把这一栈再压回去,比如这样:

int main(void)
{
    struct point p = { 0, 0 };

    maze[p.row][p.col] = 2;
    push(p);

    while (!is_empty()) {
        p = pop();
        if (p.row == MAX_ROW - 1  /* goal */
            && p.col == MAX_COL - 1)
            break;
        if (p.col+1 < MAX_COL     /* right */
            && maze[p.row][p.col+1] == 0) {
            top++;
            visit(p.row, p.col+1, p);
        } else if (p.row+1 < MAX_ROW     /* down */
            && maze[p.row+1][p.col] == 0) {
            top++;
            visit(p.row+1, p.col, p);
        } else if (p.col-1 >= 0          /* left */
            && maze[p.row][p.col-1] == 0) {
            top++;
            visit(p.row, p.col-1, p);
        } else if (p.row-1 >= 0          /* up */
            && maze[p.row-1][p.col] == 0) {
            top++;
            visit(p.row-1, p.col, p);
        }
        print_maze();
    }

    int i;
    if (!is_empty()) {
        for (i=0; i<top; i++)
            printf("(%d, %d)\n", stack[i]);
    } else
        printf("No path.\n");

    return 0;
}

如果找到了可用的路,由于有了top++,相当于仅仅是读取到栈顶的数据(而栈没有弹出),这样在搜索路径压栈的时候就不会把原来的栈顶覆盖掉,从而保证了栈中存在所有正确路径上的点。解决残留错误道路的点的问题也很容易,只需让一个循环内如果搜索到了一条可以深入的路径就停止(用else实现),否则再搜索下一条路径。如果找到死路栈会逐个弹出,直到岔路口,所以不用担心找不到正解。到最后如果迷宫存在解的话,栈中所保存的就是正确的路径。由于例子中的“栈”是一个数组(当然您可能会反驳说这个例子中stack[]并不是真正意义上的栈,“栈”在理论上应该只能访问顶端的元素,但那只是个形式问题),于是可以很容易地访问任何一步的点,输出的时候正着打反着打跳着打均可,程序中所有和predecessor有关的内容便可以删去了。

但是事实上这个办法在程序效率上是劣化而不是优化,首先虽然不需要predecessor了,但是栈空间消耗变得更大。原本栈空间的消耗和分岔路的多少有关,现在则是和路径的长度有关而与有多少岔路无关。那么栈空间的最小值应该是多大呢?私还没考虑好,但分配为整个迷宫的大小肯定是足够的。还有个问题是原来的方式由于覆盖了之前走过的路径,只保留岔路上其他方向的点,如果找到死路,弹栈后会直接跳到另外一个可能的岔路继续搜索,而修改后的方法如果找到死路,必须沿原路一步步跳回岔路口。再加上top++所用的时间,程序效率比原来要低,而且岔路越多越深入,效率上的差距越明显。

前几天看到个好玩的推,说“情人节我玩一天连连看,消灭一对是一对”。私寻思既然学了DFS和BFS,不如自己也写个文本连连看玩玩?再说吧。

另:为嘛我Tag里写C,wordpress会给自动补全成C++?

[翻译]KDE幕后——Nuno Pinheiro


原文是KDE官方对Nuno的一篇采访。私翻译后发到了ikde。ikde规则中有一句说如果没有特殊情况,就表示遵从CC-by-SA 2.5,所以转到这里也应该没啥问题了……

译者的话:
记得当初开始用KDE的时候(4.2,那时Air和Oxygen已经释出)就被其出色的美工所吸引。后来知道了Oxygen图标的作者叫Nuno,就一直相当崇拜此人。无意间在KDE主页上看到了Nuno的采访,看过后决定翻译出来放到本站。但由于本人E文功力实在太低,不少地方都是连蒙带猜翻译的,可能会有许多错误,望读者莫怪、高手指正。

原文链接:单击这里进入原文

正文:

KDE幕后——Nuno Pinheiro

Nuno Marco Fernandes Pinheiro,他也称自己为图标和图形界面设计师、Oxygen主题协调人,KDE成员,自由战士,丈夫和追梦人(译者:dreamer,原谅我用了这个翻译,因为它音律上太匹配了)。

那么,Nuno,在您的工作和个人生活中,我提到的这些角色中哪些是最重要的,为什么?

这个……应该是追梦人,其实很难说您提到的哪个是最重要的,甚至可能扮演更多角色。做设计是一种奇异的融合。如果要我罗列要素的话,技术知识,许多日常产生想法会受到现实限制(译者:此处翻译可能有问题,盼高手指正);明白现实情况、基本的技术细节、屏幕工作的方式或是干脆问别人一些问题;实用主义,你今天要做今天能做的事情,你要努力让明天能做今天不能做的事情,让大家明白今天的局限,可能使将来不存在这种局限;梦想,我试着通过我的工作激励人们,设计许多价值观,并且我认为梦想对于为设计注入例如希望、爱和自由这样的积极的价值观是必不可少的(译者:此处可能也有问题)。

KDE SC 4.5已经发布。能对我们说一些其中您最得意的工作吗?

这个问题回答起来比较困难。我总是想做一些小玩意儿,或称图标 :) ,不过在干活的时候我发现最终需要设计的是KDE程序或段(segment)的工作,这就要求我去做其他的东西。即使到了本周末的时候我也不知道下周一会做些什么。 :) 在Qt主题Oxygen上我确实做了不少工作,并且是许多,我是说许多工作。其中最好的部分是些隐蔽的地方,比如把元件移动一个像素,让Oxygen的内阴影和发光变得真实且能和不同内容相搭配。图标的工作还在继续——我已经不知道做了多少。 :) 还有大量Plasma方面的工作。

要说我最得意的……可能并不局限于4.5,而是在项目上一路走来,比如Oxygen为社区所体验。如今设计者所看重的是整个KDE社区前进的过程,而不是最终的结果。

KDE未来之路会如何?我们会在体验初期版本的一系列新特性之后迎来一个稳定期吗?

其实,我来回答这些问题并不合适,这些未来方针之类的问题最好在一个满是KDE工作者们的会议室里提出来。令人惊奇的是不知为何,大家在一起工作得很和谐。这是一个巨大的社区——如今很多KDE的次级小组(sub-group)已经比1.x时代庞大得多了。我认为我们必须重点关注“精致”,这意味着代码的精致,程序互动与整合方面的精致,当然还有设计上的精致。从我个人来看我希望继续雕琢Oxygen的方方面面并且开始与个别程序,比如说Konqueror和k3b等的开发相协调。我也希望我能为Kontact做些工作。我们的资源是有限的,所以我们需要在某一时段做某一件事。4.6发布的时候大家会看到一套新的KDE壁纸(译者:Horos?)。我希望我们还能搞出一个新的KDM主题和飞溅动画(splash screen),并且新壁纸也通常会给KDE官网来一个小小的改造 :) 。所以没错,我们有好多工作呢。

您为KDE做些什么?除了做图标之外,您还有什么任务呢?

眼下我正在为Oxygen项目做些协调工作,为其方方面面做着努力,通过协调使最终的效果和谐统一。我也在尝试去营造一种友善的氛围,为开发者的心态和设计者的思考方式之间架起桥梁。

您为KDE打工有报酬吗?如果有,能否告诉我们谁是您的雇主?

我为KDAB(Klarälvdalens Datakonsult AB)工作。有时候有报酬,那就是当我有机会在日常工作时间做一些Kontact相关内容的时候。比如最近我在Kontact移动接口(mobile port)方面做了不少工作。KDAB也资助我的Akademy之旅,很不错 :) ,而最大的报偿是我有机会和许多KDE盟友和几位最好的Qt黑客共同工作 :) 。

好。那么让我们聊聊您的设计工具。

当我第一眼看到Oxygen图标的时候我想:“他肯定用了Adobe Illustrator”。告诉我们的读者您在设计时都用什么程序?

首先,最重要的是想象力 :D ,很多时候我整天都在想如何去做一个图标,既包括技术层面又包括内涵层面。然后有时我会在纸上按照创意画个草图来试验一下。最后我转到Inkscape上然后实现它。我不时也会用许多其他工具,比如Blender(3D透视研究)、GIMP(绘制矢量和点阵图)、Ksnapshot(做些测试)以及许多许多一时想不起来的工具。 :D

那么Karbon呢?还不够成熟吗?

是的。它需要更多的开发者。可惜了啊,其实我真的很喜欢它的界面并且它很有潜力。 :)

有的人感到很不满,因为在Ubuntu的新设计中使用了私有软件。您对此事怎么看?

真的吗? :) 我毫不在意,只要软件管用就行。我在用开源工具,但我并不想把它强加于人。随着KDE4.0发布出现的Oxygen带来了清新的气息,我们聊聊它吧。

整个小组中有多少人?

那得看情况。图标方面最近来说只有我,窗口风格方面有Hugo完成所有的代码工作,另外一个Nuno(Povoa)做些音效(顺便说,在弄一个新的呢),我们还有许多人在搞一些细节上的东西(这很重要)。这是个疯狂的班子,我们在一起很开心。

据说您在KMail的图标上花了大约5小时。您做一个图标大概要用多长时间?

那更得看情况。许多动作的图标能在20分钟内完成,但是程序图标可能要用8小时甚至更长时间。很难量化一个具体时间,特别是一个图标我可能会花上几周去琢磨,却用几分钟把它做出来。比如说一个Zanshin(一个KDE任务管理程序)的图标我考虑了很久,然后我有了一个不错的实现方法,但我草稿中的某一元素总是不完美,我暂时还没有移除它,不过未来我可能还会……不好说。

那么灵感方面呢?您是如何获得灵感的?

这个……这大概是最艰难的部分,而且还不止是灵感,还要考虑市场。很多图标同时也是软件的徽标(logo)。它们需要传递许多信息,还不能混乱。所以的确,我有时会花费大量时间来考虑图标,关注程序如何解决问题,向开发者咨询软件的核心价值等等。有时候一个灵感也没有。有时候人们会提出一个方案建议。只要最后工程完成我就会很高兴。 :)

假如我要做像您做的那么好的图标,我需要多长时间来达到这样完美的程度?三个月?半年?一年还是两年?

看情况。首先,技术是很重要的,了解真实的艺术加工的一些基本技巧会很有帮助(比如基本的绘画、素描);其次您需要有基本的绘画技巧,特别是画矢量图;您还需要学习一些关于图标的知识(这是个慢功夫,我还在学)。根据我个人的经验,如果您会使用矢量图程序,图标制作方面入门大概一到两年就足够了。

最近您展示了许多金融方面的图标。能告诉我们它们是为哪个程序设计的吗?

不能说太多。 :) 我只是做图标,程序开发者给我罗列了一些程序的行为(action),于是我就开始做了。如果我对某个行为有疑问的话就会去找开发者咨询,这样他可以帮助我更好地理解。我做好一个之后会给他看,如果我们都满意的话就开始做下一个。

我的新想法是未来更关注我做过的图标和界面改造。不幸的是我还有超过一千个图标需要完成并且几乎没有空闲时间。我无法完成它。我很想去完成,但……

另一话题:一些个人问题

您在闲暇时间都做些什么呢?

开源。 :) 我也喜欢去电影院,和内人一道享受时光。我还想去旅行,了解更多的地方,结识更多的人。

我们都很好奇您使用哪个发行版,能说说吗?

当然。我使用Mandriva,一直都是(从redhat 5.1开始),但我喜欢一切有KDE的发行版 :) ,我喜欢他们蓬勃发展。想想我们是共同成长的,对Kubuntu有好处的也会对OpenSUSE有好处。这是一个为同一目标而共同努力的事情。在不同的发行版之间,我所见的99%都是共同的……当然最终还会有不同的。但你必须承认这些不同!

在整个KDE访谈和作为管理者的时候您说要把您想象得“邪恶”一点。(译者:好吧我承认这里我自己翻译的内容自己都看不懂。)告诉我们的读者是怎么个邪恶法?

呵呵呵……有很多邪恶的小方法…… :) 例如说掌控一个让大家走在一起的计划,像Oxygen之类的。