K.I.S.S. – 简单哲学 Linux, Freedom, Arch, Python, Gtk+, C … Keep It Simple, Stupid!

30四/090

使用 gitk 跟踪 git 项目源代码

看源代码是学习编程最快、最有效的方法之一,在 Linux 开源的大环境下,研究源代码就更加容易了。面对一个大一点的项目,我们可能无从下手,那么,何不从其雏形阶段开始研究呢?
我现在就在研究 Tualatrix 兄的 ubuntu-tweak 的源代码,以前 -tweak 托管于 Google Code 的时候,Google Code 对各版本差异分析得很清楚,然而转向 github 之后,限于网速,看起来很不方便。
有什么跟踪本地 项目源代码的工具呢?diff 显然不是最好的方法,尤其涉及到文件移位之类的问题时。
Tualatrix 兄用的是 gitg,可是我用起来总是感觉缺点什么的样子,而且经常会莫名其妙的崩溃。偶然看 git 官方文档时,认识了 ,似乎是官方提供的工具,用起来真是越来越顺手。
先看一下两个软件的对比图:

gitg.pnggitk.png

gitk 基于 tk/tcl,所以用之前要安装这两个包,由于是官方软件,安装 git 时就会自动安装,不必另行安装。

从图中可以看出,基于 Gtk+ 的 界面更加漂亮,代码差异的彩色背景更加显眼,相比之下,基于 tk 的 gitk 显然简陋许多,大概 的作者也就是想写个 gitk 的 Gtk+ 版本吧。
不过,仔细看的话,就可以看出很多不同来,比如,中间的横条空间,gitg 是用作显示 Commit 的详情,这显然是浪费了宝贵的屏幕空间,尤其对于宽屏用户来说。

相对地,gitk 虽然中间的空间也用了,不过放置的却是实用的搜索功能。千万不要小看这个搜索条,它不但可以搜索 Headline、Comments、Author、Committer,还可以搜索哪些 Commit 对某些文件进行了修改,并且支持正则表达式、大小写匹配。

再来看一下 diff 功能,gitk 也比 gitg 强上很多,不但可以选择查看差异、新版、旧版的代码,还支持忽略空白符,设定 diff 周边行数。不要小看这个功能,在查看源代码的时候,这个功能对于理解上下文是很重要的。

如果这么强大的差异功能你还不满意,或者觉得视野空间太小的话,还可以右击文件,选择 External diff 来调用 meld 查看,当然前提是你安装了 meld。

右击文件,还可以对该文件加上高亮,这样标记已经读懂的文件比较方便。

通过这些介绍,可以看出,相比 gitg,gitk 更加成熟,功能更加强大。

默认启动 gitk 是打开 master 分支,如果想要查看其他分支,使用 gitk 分支名 即可,比如:

gitk origin

gitk 的命令行还有很多用法,详见 git 相关文档。

其实,gitk 只是 git gui 中的一个小工具,在命令行输入:

git gui

可以发现更多功能,当然,有些功能就不如终端下方便了。下面是 git gui 的效果:

git-gui.png

29四/096

让 Arch Linux 也使用 Ubuntu 9.04 的新通知机制

看到 TualatriX 兄在 Gentoo 下使用 Ubuntu 的新通知机制 notify-osd,心里很痒啊,在 下能不能用呢?
首先想到的是看看 TX 兄是怎么改的,不过没用过 Gentoo,Ebuild 也看不出所以然来,想自己改是不可能了。
Google 一下吧,"arch linux ",晕,发现 AUR 里面已经有了,还不止一个……

[iven@~]$ yaourt 
1 aur/banshee- 1.4.3-3 (15)
    Patched banshee version for 
2 aur/gajim- 0.12.1-1 (2)
    Jabber client written in PyGTK
3 aur/-mount- 0.8-2 (11)
    GNOME mount program
4 aur/gnome-power-manager- 2.24.4-5 (Out of Date) (18)
    Session daemon that makes it easy to manage your laptop or desktop system.
5 aur/libnetworkmanager- 0.7.1-1 (5)
    The Network Manager Library
6 aur/networkmanager- 0.7.1-1 (5)
    Network Management daemon
7 aur/nm-applet- 0.7.1-1 (3)
    GNOME frontends to NetWorkmanager
8 aur/ 0.9.12-1 (25)
    daemon that displays passive pop-up notifications
9 aur/-bzr 311-1 [312-1 installed] (45)
    Canonical's on-screen notification display agent, implementing the FreeDesktop.org notification specification with semi-transparent click-through bubbles.
10 aur/pidgin-libnotify- 0.14-2 (25)
    Patched pidgin-libnotify version for 

可以看到,不但有 notify-osd,还有 bzr 版的,还有针对 pidgin 各种应用的 hack 版。
我不用 pidgin,所以直接安 notify-osd-bzr,这个包与 notification-daemon 和 notify-osd 冲突,我没有安 notify-osd,所以应该先:

yaourt -Rd notification-daemon

然后:

yaourt -S notify-osd-bzr

最后注销一下即可。
下面是骨头兄 的效果(Arch 里面没有 gnome-osd,怨念……):

screenshot_002.png

呵呵,Arch 还是群众力量大啊,AUR 这个平台简直神了!

28四/091

Virtualbox 2.2.2 发布

开源虚拟机软件 昨天(2009-04-27)发布了一个新版本 2.2.2。这是一个维护版本,也是 Sun 被收购以来 推出的第一个新版本。
该版本修正了一些与新版 X.Org 相关的问题、鼠标的检测问题、剪贴板的相关问题、旧版本的 D-Bus 检测问题、可以使客户机系统崩溃的一些 BUG 等等,同时重写了网络设置对话框。
推荐大家更新。
Changelog:http://www.virtualbox.org/wiki/Changelog
下载地址:http://www.virtualbox.org/wiki/Downloads

27四/092

关于 C++ 中模板类(Template Class)在多文件中的问题

最近 ++ 学到模板类了,老师要做一个模板类的题目。
一直以来我们都是保持着类声明和类实现分别写在头文件和 CPP 文件中这个不错的习惯,这次也没有例外,然而这次问题却出来了。
先是在 G++ 中提示:

undefined reference to `Array::Array(int, int const*)'

移到 VC++ 6.0 后又提示:

ex_08_1.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ)ex_08_1.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(int,int const *)" (??0?$Array@H@@QAE@HPBH@Z)

到底是怎么回事呢?老师说是编译器的 BUG,我却觉得没那么简单。
搜索了一下,才发现,C++ 中模板类(或者叫“类模板”)的声明和实现和普通类是不同的,模板类的声明有两种模式:包含编译模式和分离编译模式。
包含编译模式就是把声明和实现写在同一个文件中;分离编译模式当然就是写在不同文件中,不过用这种形式的时候,要在类的声明前加上 export 关键字。
我在 G++ 上试了一下,出现:

警告:关键字‘export’未实现,将被忽略

汗一个……VC++ 上更不用说了……
C++ 真是个复杂的东西,还是写在一个文件里吧……

标签: 2 评论
26四/090

在 blogspot 中设定摘要功能

Blogspot 虽然很强大,可是默认支持的功能太少了,比如摘要,很常用的功能,可以在首页只显示博文的一部分,这样首页就可以显示更多的内容啦~可惜 Blogspot 默认不支持……
查了很多资料,还是没有找到比较完美的实现方法,我的博客现在使用的这种,原理是用 把多余的部分隐藏,也就是说,这样对于网页提速没有任何帮助。
网上有一种方法是修改帖子高度的,不过这样实现的效果虽然很整齐,但是有时会出现文字和图片显示一半的效果,个人不推荐这种方法。
下面说下我的做法(注意备份哦~):
1.熟练地进入后台,选择布局——修改HTML,在“扩展窗口小部件模板”前打勾。
2.找到这段代码:

<data:post.body>

修改为:

<b:if cond='data:.pageType == "item"'>
<style>.fullpost{display:inline;}</style>
<p><data:post.body/></p>
<b:else/>
<style>.fullpost{display:none;}</style>
<p><data:post.body/>
<br/>
<b:if cond='data:post.url'>
<a expr:href='data:post.url'><strong>Read More...</strong></a>
<b:else/>
<data:post.title/>
</b:if>
</p>
</b:if>

3.在设置——格式设置——帖子模板中,加入以下内容:

<span class="fullpost">
</span>

4.以后发布帖子的时候,在<span class="fullpost">和</span>之外写摘要部分,在其之间写全文部分即可。
参考:http://free123456.blogspot.com/2007/01/blogger.html

标签: , 没有评论
24四/090

使用 rdesktop 远程连接 windows 服务器

远程登录 ,大家可能首先想到 中的“终端服务客户端”,其实这个程序的学名叫做 tsclient,是 等一些终端程序的 Gtk+ 前端。
看到这里,很多人已经明白了,其实想要连接到 Windows 的远程登录,只需要 rdesktop 这个 300 多 KB 的小程序即可,在 Linux 下安装方法如下:

# pacman -S rdesktop

安装完成后,运行 rdesktop 就可以得到帮助。
常用的几个参数如下:

-u 用户名-p 密码-a 色深-g 分辨率-f 全屏-z 启用 rdp 压缩-D 隐藏窗口修饰-K 保持窗口管理器键绑定-T 窗口标题

例如,想要连接到 127.0.0.1,用户名为 user,密码为 pass,那么可以:

rdesktop -u user -p pass 127.0.0.1

如果想要进行压缩传输,色深 16 位,分辨率 1024*768,连接到 5900 端口,那么应该:

rdesktop -u user -p pass -a 16 -g 1024x768 -z 127.0.0.1:5900

如果想要全屏浏览(注意,如果此时服务器死机,网络中断之类的,只能通过其他 tty 来 kill 掉 rdesktop,没发现其他的解决办法),同时开启桌面特效,可以:

rdesktop -u user -p pass -a 16 -zfK 127.0.0.1:5900

这时按下 Ctrl+Alt+Button1,怎么样,服务器的 Windows 也有桌面立方体效果了?你还可以开动态模糊、雪花……呵呵,看你怎么玩了……
除了以上这些常用的,还可以用 -r 命令来重定向设备,比如我这里重定向声音设备用的是:

rdesktop -u user -p pass -a 16 -zfK 127.0.0.1:5900 -r sound:local:alsa

除了重定向声音,rdesktop 还支持重定向串口、并口、磁盘、打印机、剪贴板等,详见:

rdesktop --help

22四/092

快来参加 Gnome 3.0 官方社会调查

本调查旨在获取 2.x 用户的对未来Gnome的需求和当前的使用习惯等数据。这些数据主要由“ 可用性团队”来分析并以此来建立一个更棒的GNOME 3.0。

本调查期望:

* 了解 Gnome 用户的大概资料。
* 了解 Gnome 用户主要使用的各种设备以及它们与 Gnome 的兼容情况。
* 了解 Gnome 用户是否能在 Gnome当前的结构体系下进行顺利地导航(查找数据)。
* 了解 Gnome 用户对工作区的需求和他们在这方面碰到的困难。
* 了解 Gnome 用户在整个桌面环境范围的其他问题。

快去参与吧:http://bit.ly/9wlBT

标签: 2 评论
22四/091

Arch Linux 下 texlive 2008 的安装

最近忙里偷闲,想学学一直放在藏书阁里的 LATEX Notes,于是边看边装 texlive ……

pacman -S texlive-bin

先来个 hello world:

%hello_world.\documentclass{article}\begin{document}   Hello, World!\end{document}

生成 dvi 文件:

latex hello_world

很无情地给出错误:

Latex error: I can't find the format file `latex.fmt'!

查了半天,发现 texlive-core 才是正主,texlive-bin 只是它的一个依赖,汗……

pacman -S texlive-core

这下终于通过了……
这才明白 texlive 果然是个庞然大物,texlive-bin 就 16M 了,texlive-core 有 50 多M,又安个 texlive-cjk 又是 50M,真不知道 texlive-most 有多大……

以下是某高手解释 tex、latex 等的关系,转自这里

  • tex可理解为一个标准,如C/++标准,定义基本API;
  • LaTeX是对tex的扩展,封装了一些功能,以便于使用,就像Boost/ACE库之于C++一样;ConTeXt是TeX的另外一个封装库,级别跟LaTeX一样;最早的tex扩展应该是plain tex,现在仍然有很多人在使用;
  • pdftex, xetex可以看成是tex的编译器,就像gcc, icc之于C/C++;luatex是现在比较新的tex`编译器',而knuth tex是最早的tex编译器;当然不同的编译器可能有不同的扩展,如xetex对unicode的支持,luatex对内嵌lua脚本的扩展等等。
  • winedt是一个tex编辑器,跟notepad,vim,emacs一样,编辑器而已,只是对latex文件的语法、语义支持强一些;
  • miktex, texlive就像Visual C++,C++ Builder一样,提供了写tex/latex/context文档所需要的基本的和必要的工具,如tex编译器和常用的宏包,可以理解为集成开发环境;
  • ctex是基于miktex的二次开发,加入了一些中文配置(如CJK/CCT),方便了国内用户使用。如果非要打比方的话,可以理解为“支持中文的linux”。

标签: , 1个评论
21四/090

数字图像处理(四)——均值滤波

上次提到产生高斯噪声的算法,我们知道,椒盐噪声是可以通过中值滤波来修复的,高斯噪声也可以通过均值滤波来还原。
顾名思义,均值滤波也是构建一个 n*n 的模板,然后取其平均值来替代模板中间的值。这样做出的效果明显不如用中值滤波修复椒盐噪声的效果好,不过当 n 取很大值的时候,图片看起来像是高斯模糊,不知道是不是一个原理……
看效果,n=3 时:

gauss3.jpg

n=11 时:

gauss11.jpg

算法更加简单,有以前的基础不成问题:

    BmpPixmap &
BmpPixmap::mean_filter (int n)
{
    assert (n >= 3 && n % 2);

    int ii, jj, nn, sum [3];
    BmpPixmap *temp = new BmpPixmap (*this);
    for (i = n / 2; i < height - n / 2; i++) {
        for (j = n / 2; j < width - n / 2; j++) {
            for (nn = 0; nn < 3; nn++) {
                sum [nn] = 0;
            }
            /*-----------------------------------------------------------------------------
             *  Calculate the average of the model.
             *-----------------------------------------------------------------------------*/
            for (ii = i - n / 2, nn = 0; ii <= i + n / 2; ii++) {
                for (jj = j - n / 2; jj <= j + n / 2; jj++, nn++) {
                    sum [0] += pdata [ii][jj]->get_blue ();
                    sum [1] += pdata [ii][jj]->get_green ();
                    sum [2] += pdata [ii][jj]->get_red ();
                }
            }
            temp->pdata [i][j]->set (sum [0] / (n * n), sum [1] / (n * n), sum [2] / (n * n));
        }
    }
    return *temp;
}  /* -----  end of method BmpPixmap::mean_filter  ----- */

标签: , 没有评论
18四/090

数字图像处理(三)——高斯噪声

椒盐噪声相似,高斯噪声(gauss noise)也是数字图像的一个常见噪声,产生该噪声的算法也很简单。
上次说过,椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。
该噪声效果如下:

output.jpg

这个算法比较简单,需要注意,颜色值不要超出范围(0-255),不然效果很可怕……
代码如下:


    BmpPixmap &
BmpPixmap::gauss (int level)
{
    assert (level >= 0);

    BmpPixmap *temp = new BmpPixmap (*this);
    int k, rand_temp, pixel [3];
    /*-----------------------------------------------------------------------------
     *  Init the random seed with time.
     *-----------------------------------------------------------------------------*/
    srand (time (NULL));
    /*-----------------------------------------------------------------------------
     *  Salt & Pepper.
     *-----------------------------------------------------------------------------*/
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            rand_temp = rand () % level - level / 2;
            pixel [0] = temp->pdata [i][j]->get_blue () + rand_temp;
            pixel [1] = temp->pdata [i][j]->get_green () + rand_temp;
            pixel [2] = temp->pdata [i][j]->get_red () + rand_temp;
            for (k = 0; k < 3; k++) {
                if (pixel [k] < 0) {
                    pixel [k] = 0;
                } else if (pixel [k] > 255) {
                    pixel [k] = 255;
                }
            }
            temp->pdata [i][j]->set (pixel [0], pixel [1], pixel [2]);
        }
    }
    return *temp;
}  /* -----  end of method BmpPixmap::gauss  ----- */

标签: , 没有评论
   下一页