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)的光盘呢……

触摸板异常及用downgrade降级Udev

前几日私在推上发牢骚,曰“进来命途不顺,Arch升级愈升问题愈多”,计算机科学屠戮者大神反问:“此岂非生活之常态?”。其实真的不是生活的常态。也许是私当年用惯了kubuntu(呃……一不留神又黑了kubuntu啊,话说私过几天还要参加release party呢),觉得Arch简直是一个稳定得令人惊讶的系统。唯一的一次问题是源于私穷折腾时的操作失误。在此之前还真的没有找出任何的问题。

然而一次升级过后悲剧发生了。重启候发现触摸板无法使用,遂接上外接鼠标查找原因,计算机科学屠戮者大神说可能是内核的问题,然而私在本地未找到早先留下的包,作罢。后来开机时发现触摸板反映很怪,有时认不出,有时能认出,还有时会认成鼠标,查Xorg的Log,发现自己的EasyCamera(摄像头)被认成了触摸板,然后自然发生错误,于是触摸板的驱动就自动Unload了,没有挂载在正确的地方。去Arch的论坛找,发现貌似是新版本Udev(167-1)的问题,降级回去就可以了。

不过私依然没找到遗留的老版本的Udev包,难道真的要编译才能解决吗?后来看到Bug Report下有人提到可以用AUR里面的叫做“downgrade”的包(名字真直接)。下载后只需用downgrade xxx命令,就可以找到xxx软件的一些早先版本(Udev貌似保留了十多个早先版本),选择一个降级即可,操作非常傻瓜,避免了因误操作可能出现的各种问题,很适合私这样的初学者使用。

后记:

私降级后就把Udev放到升级忽略列表中了。然而今天升级之后发现有个叫做“initscripts”的包要求Udev版本高于167。Google之,发现和启动初始化有关(貌似是废话,嗯……因为细节私也没太看懂)。难道就是因为Udev和这个包的版本不匹配才出现的问题吗?一会可以试试看。

后记的后记:

果然跟此事有关。今日在Arch官网上找到了这句话:

We would like to remind everyone that initscripts expect all other packages (except for the kernel) to be up-to-date. This in particular includes udev, mdadm, dmraid and lvm.

于是升级一下就一切都好了。

Arch恢复

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

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

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

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

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

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++?

安装Arch的血泪史

首先特别感谢CS Slayer的帮助,让私的Arch之路顺利了许多。

由于实在无法承受kubuntu那问题连天的打包,再加上CS Slayer大神和woodliu仁兄的煽动(请原谅私用了这个词),私终于决定投身Arch linux的<del>大坑</del>怀抱。其实私曾经是尝试过装Arch的,而且是在虚拟机里装过之后才敢实装的。可惜装的时候因为无法识别网卡(似乎是这样,至少无法正确配置pppoe),中途放弃了。这次私用的是2010年12月打包的archboot,pppoe终于配置正确,可以使用了。

其实整个光盘(优盘)安装过程还蛮顺利的,由于有之前的经验,整个配置过程并没有受到阻碍。然而安装过后配置显卡驱动的时候就出了点问题。Arch把ATi的商业驱动移出了源,AUR又不能直接用pacman下载。后来CS Slayer仁兄给私了个有yaourt的源,装了yaourt之后下载了catalyst-hook(可自动编译内核),结果私再接着看wiki的catalyst文档之后,发现专门有个catalyst的源……

不过AUR里有很多宝藏,提前装上yaourt也蛮好。结果由于心急,装好KDE,没有测试就把kdm写进rc.conf了。于是乎一启动就黑屏,一启动就黑屏……而且是那种连背光都没有的黑屏,pkill X无效。没办法,只能盲操(那真是货真价实的盲操)进vi,搜索“DAEMONS”,移到下一行尾,再往前推算,去掉kdm和hal,最后写入,重启。之后wiki看了一遍又一遍,还是找不到解决问题的方法。

无奈之下,索性去找开源驱动。惊喜地看到Arch源里的开源驱动已经开始支持Radeon HD5000系了。于是兴冲冲地装上,运行startx,惊喜地看到漂亮的KDE登录界面,结果就在那个大大的K字时即将浮现时,惊讶地看到因为segmentation fault,X关闭……再仔细一看显卡支持列表,就是没有私这Mobility HD 5650(5600)。无奈之下,还得从商业驱动想办法。

就这样折腾了好几天。后来想到由于私装的是catalyst-hook,ATI Catalyst那篇Wiki私是从hook那里开始看的,可能前面还是遗漏了什么,于是乎从头看看吧。后来发现了很不起眼的一句……

“And add nomodeset to your kernel line in /boot/grub/menu.lst”

于是乎就是这样,问题解决了。

之后终于进了图形界面,下一步是汉化、安装输入法。结果fcitx输入法始终无效。没办法,暂且搁置,先把locale搞定。结果fcitx居然能用了。跟CS Slayer仁兄一说,才知道现在/.bashrc在图形下已经不管用了。而fcitx在zh_CN-UTF8上不用设置环境变量即可使用。

至此……基本上私的Arch已经可以用了。不过私没有装KDE4.6 RC2,反正正式版再过几天就正式发布了。另外还有无线、图形化网络连接没有搞定,不过也无伤大雅了。

嗯,算是历经艰辛投奔成功了吧……

信手闲话:最近的生活/I, KDE/HTC Hero/phonon后端

好久没更新网志了……因为最近还是比较忙的。除了考前老师比较慌张(因为讲不完课)之外,私还得被医预那帮行政老师(这个词好,嗯……)玩弄于股掌之间。他们一边说着“课余生活不要耽误了学习”,一边给我等安排这样那样的鬼扯“风采展示”一类的东西。私又悲催,被团支书卖了,于是就成了现在这样子。本来期中数学就糟糕透顶,本想期末多花点功夫在其上的……

//

前不久CS Slayer仁兄和心之所在仁兄“心血来潮”(此为CS Slayer仁兄原话),成立了个专门关注KDE软件/软件集的网站“I, KDE”。特别值得一题的是用的theme,是从CS Slayer仁兄的Air主题脱胎出来的,比他自己网志上用的那个效果更好,只是Banner还相对简陋。私本想给它们做一个新Banner,还想写点贺文之类的,可惜实在时间无多,只得等到假期了。当然可能假期之前他们就会换掉那个。关于文章,私本以为两个人搞的站点不会太频繁地更新,后来发现私过于想当然,该站点更新频率之高着实令人讶异。看来以后看KDE新闻不用去别的地方了……

//

最近得到了HTC Hero。是某个爱捣鼓手机的亲戚给私的(请不要误认为我家很有钱)。记得私有一段时间还很迷恋这款手机来着,虽然HTC又出了不少新机,现在得到Hero也觉得蛮激动。感觉这款手机的系统有些超越了其硬件,虽然操作上还算不错,但看着它跑着还是有点吃力的。让私有点奇怪的是为什么播放音乐的时候再浏览网页就明显更加吃力。难道播放个音乐需要很多硬件资源么?另外据Google的介绍,Android2.3在图形方面会更强,不过私实在不知道装上之后能否跑得动了。总体来讲还是很好。

//

原先私这里的Amarok播放特定音乐总会挂掉,出错提示是段错误(segmentation fault)。以前一直在Amarok上找原因(在私这里Amarok Debug包还找不到,不知道为什么),一直没想过是因为后端。今日听取CS Slayer仁兄的建议,下了个gstreamer后端,把xine换下来,结果居然一切正常了,实在让人很囧……

使用wallproxy in GAE翻墙成功,在此留念……

wordpress居然整体域名被封,这官逼民反啊……本尊自认为没发什么特别反动的文章啊。

在自己的GAE帐号上搭建了个wallproxy,运行的时候提示了一句AppConfigNotFoundError,不过实验证明还是生效了的。

一天1G的流量,个人觉得完全够用……

Google万岁……

kubuntu升级KDE,悲剧了……

今天私打开升级管理器,发现KDE方面有一堆升级,估计是kubuntu有啥大动作。于是乎欣喜异常,想都没想就点了升级。升级的时候说要删除旧的软件包,私以为既然要升级了,删了就删了吧。结果悲剧出现——重启后KDM消失不见,GDM不可选KDE桌面环境。进Gnome,reconfigure KDM,发现KDM居然提示没有被安装。此时私有种不祥的预感,于是乎apt-get install KDM,得到提示:

下列软件包有未满足的依赖关系: kdm : 依赖: libkio5 (>= 4:4.5.3) 但是 4:4.5.2a-0ubuntu1~ppa2 正要被安装       依赖: libkworkspace4 (= 4:4.5.3-0ubuntu1~maverick1~ppa1) 但是 4:4.5.2-0ubuntu1~ppa1 正要被安装

4.5.3……赶紧上kubuntu官网,果不其然,kubuntu今日释出KDE4.5.3供更新。根据以往的经验,十之八九是ppa打包者没把包打全。sudo apt-get install kubuntu-desktop,发现plasma、window-manager等重大软件包已被删除且无法更新(当然同样是依赖问题)。

于是乎查launchpad的bug页面,果然发现……

https://bugs.edge.launchpad.net/kubuntu-ppa/+bug/670784

https://bugs.edge.launchpad.net/kubuntu-ppa/+bug/670788

都已经确认了。不过现在想用KDE咋办呢?删除ppa源,重新更新,结果居然提示说要4.51的库而我已经装了4.52了……于是乎遇到了一个两难的窘境:究竟是降级容易些,还是干脆等它们把缺失的包打好?

kubuntu啊kubuntu……

画外音:速速投奔Arch……

后记:很快就修复了,效率还是不错的。

合理设置KDE触控板,减少延迟

果然如CS Slayer仁兄所说,ATi商业驱动——催化剂10.10版使得2D效能有所提高,现在在我PC(显卡Mobility HD 5650)上窗口缩放、kick-off弹出等都流畅了很多,除了模糊还不敢随便开以外其它特效都状态良好。不过有一点让我不悦的是在KDE下似乎做什么都慢一排,按一个按钮貌似总要“卡”一下才能生效,来得非常不顺畅。以前一直以为是kwin或者催化剂驱动的关系,直到今天才发现原来另有原因。

故事是这样的:

我的笔电是Ideapad Y460,上面有触控板,所以也就好久没接鼠标了。由于今天做某个测试,而且不得不用windows,笔电上的触控板就不是那么得心应手了,于是乎接了鼠标。做完测试之后换到Linux下面玩,突然觉得所有的操作都似乎快了不少。最近又没有更新什么重要的东西,也没调什么设置,怎么会这样呢?最终想到了鼠标头上。鼠标搁一边,重新用触控板,发现果然是触控板的延迟。

打开以前没怎么关注过的触控板选项,发现居然都还是英文的,而且没有帮助文件。于是乎连试带蒙,蒙出了一些设置的意义。

touchpad设置

Max Tap Move:能够识别为拖曳的两次触碰最小距离。如果多次触碰距离太远就不会被识别为拖曳。
Single Tap Timeout:这个是最最重要的……单触碰超时。所有的单击都只有经过这段设置的时间之后(以认定不是双击、拖曳等)才会生效。
Click Time: 单击持续时间。也就是鼠标从“按下”到“弹起”的间隔时间。
Double Tap Time:可能是双击的持续时间,没有详细验证。

因此……导致按键有延迟的罪魁祸首就是Single Tap Timeout和Click Time。 如果想要最小化延迟,Single Tap Timeout应该设置到0,Click Time设置成1。不过如果设置得太小就不会识别出鼠标拖曳,所以对于喜欢用两次触碰代替鼠标拖曳的用户会有不便。我的建议是有经验的用户将其设置成75左右(已经相当快了),新手可以设置到100-125,总之在不影响使用的情况下越小越好。Click Time就无所谓了,一般设个个位数也可以正常使用。

设置了之后果然痛快了很多啊,非常舒畅。

fedora14倒计时,官网大换血。

fedora官网新界面

比以前漂亮了好多,恭喜贺喜啊……主页下面还有所谓“摄像头的功用”介绍,难道fedora开始逐渐重视桌面用户了么?

而且更重要的是,子页面有中文了!我瞬间不淡定了……

不过暂时还没看到传说中把KDE作为默认的fedora14。还有5天,慢慢期待吧。

//

另外……哪位知道如何在wordpress文章里添加一段javascript?