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

26十/102

Compiz 0.9.2 发布

在使用 ++ 重写,而又沉寂了一段时间之后, 开发小组发布了新的 0.9.2 版本,虽然仍然是实验性的版本,不过根据作者所言,这个版本已经可以用于日常应用。在 下安装新版 Compiz 的方法见这里

这个版本修复了大量的 BUG,并且带来了一些新的特性:

  • 新的 MultiAnim 类,帮助在动画中创建窗口图像的多个拷贝
  • 查看最小化窗口的实时预览(实验性的)
  • 重写了“群组(Group)”插件
  • 缩放(Scale)插件的自然(Natural)模式
  • 简化阴影在装饰器(Decorator)中的存储

此外,计划中的 0.9.4 具有如下特性:

  • (通过 MPX 和 UTouch)支持多点触摸和多点输入
  • 动画框架,允许插件轻易地创建动画,或者使用其他插件提供的动画
  • 将插件编译进核心,大幅提高速度

PS:此版本发现了一些 BUG,稍后会发布 0.9.2.1 版本。

PS2:Ubuntu 11.04 将使用 Unity 作为 Shell,而 Unity 的窗口管理器则将由 Mutter 换成 Compiz,也就是说 Compiz 得到了来自 Canonical 的支持!事实上,至少 Compiz 的开发者之一 smspillaz 已经被 Canonical 雇用了……为 Compiz 光明的未来喝彩吧!

相关链接: 原文 详细更新列表 源代码下载

标签: 2 评论
3十/1010

Arch Linux 下 Android 源码下载与编译

最近工程实践的老师让我把 环境搭建起来,并且将界面换成黑白的,算是一个考验,这里就记录一下具体的做法。

Android 源码以前没有注意过,一直以为是 管理,看了一下文档,才知道 Google 在 上面又加了一个叫做 repo 的工具,用来管理大量的 仓库。

repo 这个工具在 里面有,叫做“repo-git”,首先要把这个工具安好。

按照官网的下载说明,安装下面几个包:gperf sdl esound wxgtk valgrind,当然 base-devel 这个 group 也肯定都要装的了。64 位系统还要装 lib32-readline 和一些其他 32 位包,不过因为我装了 wine,所以所有依赖包都已经装好了。

官网说只能用 jdk5,不过我克服万难从 AUR 上安装好老掉牙没人管的 jdk5 之后,编译时提示我 jdk 版本不对,请使用 jdk6 ……同学们引以为戒,官网说明已经过时了。安装好 jdk 后重启一下系统更新环境变量,当然你也可以:

$ source /etc/profile

然后随便建个目录,比如我是 ~/Workspace/mydroid,进入这个目录后:

$ repo init -u git://android.git.kernel.org/platform/manifest.git

这是获得最新的 git stable 源码,或者你仅仅想要 Android 2.2.1,那么:

$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2.1_r1

其实就是 git branch 的封装,manifest 是一个 git 的仓库目录,里面就一个 xml 文件,记录了各个仓库的信息,repo 根据这些信息来 clone 源码。

这条命令会问你的名字和 E-mail,其实就是 ~/.gitconfig 中的信息,如果你以前常用 git,直接回车即可。

下面就是同步源代码了:

$ repo sync

Android 的源代码大约有 2G,在我令人发指的网络环境下,同步了 2 天才完事,所以速度在 200K 以下的同学就不要凑热闹了,找个地方画圈圈吧……

这个过程中就是一堆的 git clone、git rebase,如果中断了,会从第一个开始慢慢扫描,直到之前中断的那个仓库,按照 git clone 不支持断点续传的习性,这个被中断的项目会被重新 clone。要知道,Google 这个脑残最恶名昭彰的一点就是把二进制文件往 git 里面放了,第 252 个仓库 prebuild 就是这么个地方,700M,我就在这里中断过……

闲话少说,下面是两个针对 Linux 的 Fix,一个是 Make,目前 testing 中的 make 是 3.82 版本,这个版本在编译 Android 的时候开始会出错,见这个帖子,所以要降级成 core/make,也就是 3.81。

另外,如果用的是 64 位系统,那么要安装 multilib 源中的 gcc-multilib,否则会出现 libgcc.a 不兼容的错误。

全部完成之后,直接执行 make 就可以编译源代码了,当然 Makefile 有很多规则,比如只想编译计算器这个程序,make Calculator 即可。

最后就是用模拟器执行啦,建个脚本执行即可:

#!/bin/bash
export ANDROID_PRODUCT_OUT=~/Workspace/mydroid/out/target/product/generic
# PATH for Android emulator
export PATH=$PATH:~/Workspace/mydroid/out/host/linux-x86/bin
export ANDROID_JAVA_HOME=$JAVA_HOME
# start the emulator with debug info
emulator -debug-init

最后是几张模拟器的图片,是我改成黑白之后的:

android-locked.png

android-main.png

android-browser.png

android-calculator.png

3十/106

学生用户 Dropbox 容量翻倍!

现在在搞活动了,看到推上还没有人说,赶紧告诉大家。

Dropbox 现在正在针对学生用户(准确说是 .edu 用户)开展活动,只要收封邮件激活一下,就可以将现有的容量翻倍(最多到 18G),而邀请他人所获得的容量也会翻倍(500M/用户,最多获得 16G)。

本人有学校分配的 .edu 邮箱,很容易就获得了超大容量,大家也赶快上吧~

dropbox_size.png

活动页面:https://www.dropbox.com/edu

另外,还没有 Dropbox 的同学赶快申请一个吧,我已经受到 Dropbox 很多好处了,以前系统误操作格式化掉,很容易就从网上恢复回来,另外,不同机器之间迁移、朋友间共享文件也变得很方便。从我的邀请链接进入,可以额外获得 250 M 流量哦!

标签: 6 评论
23九/100

使用 dbus-python 建立单实例进程

D-Bus 是 Linux 系统上广泛应用的消息总线,是 Linux 桌面程序常用的消息通信机制之一,熟悉 Linux 编程的同学可能对它已经很熟悉了,不过对于我来说,看了好长时间文档才算有点收获,赶紧记录下来。

大家知道 # 得是个单实例(Single Instance)程序(不知道的同学赶紧知道),之前这种单实例的特性是由网上抄来的一段代码,用 Socket 的唯一地址实现的。功能虽然实现了,不过想要进一步扩展就比较难了,好吧,相比于 D-Bus,Socket 我更是一窍不通。

为什么要扩展呢?大家知道,作为一个下载器,是要支持浏览器滴,可是怎么支持浏览器呢?当然是浏览器来调用下载器的命令行。这样就要求,下载器是单实例程序的同时,运行其他实例的时候,不仅要提示用户已经有一个实例运行,还要从命令行接收参数,传输给之前存在的实例,这就需要进程间通信了。

下面就是一段简单的用 D-Bus 实现的单实例类,继承这个类的类都将获得单实例特性。目前它还没有通信相关的代码,将在后面加入。

import 
import .service
import .mainloop.glib

class SingleInstanceAppMixin:
    "Single Instance Application"

    def __init__(self, bus_name):
        .mainloop.glib.DBusGMainLoop(set_as_default = True)
        self.bus = .SessionBus()
        try:
            self.bus_name = .service.BusName(bus_name,
                    self.bus, allow_replacement = False, replace_existing = True, do_not_queue = True)
        except .exceptions.NameExistsException:
            print "Another instance is already running."
            self.on_instance_exists()

    def on_instance_exists(self):
        """
        This method is called when an instance of the program already
        exists. It may be overwritten by subclasses.
        """
        import sys
        sys.exit(0)

代码很简单,主要原理就是利用 D-Bus 中 BusName 的唯一性,其中 BusName 的三个 Bool 型常量的设置分别表示不允许被替换、尝试替换同名 Bus、存在同名时不加入队列,这样就可以保证存在同名 Bus 的时候出现异常了。

需要注意的是 self.bus_name 将其返回结果加上引用,免得执行完函数之后销毁掉了,在调试的时候在这里卡了半天,用 vimdiff 才看出来问题所在……

19九/102

加快 git clone 速度的方法

呵呵,不知道我是不是火星了, clone 原来可以不全部克隆的,而是可以只克隆当前的 commit,使用下面的命令即可:

git clone git://... --depth 1

也就是指定克隆深度为 1。
当然,通过这样克隆的代码就不能进行管理、提交什么的了。
学校的网络不知为何把 git 封了,只好用 proxychains 代理进行克隆,速度慢死,有了这个命令,安装个软件就快多了~

标签: 2 评论
2八/1015

人生苦短,我用 Genie

这篇文章已经酝酿很久了,不过一直没时间没心情写。今天到学校开始学日语了,又看到 WowUbuntu 介绍的日语 50 音图测试软件 Kanatest 里面找不到,所以干脆自己写一个,顺便补上这篇文章。

进入正题,开发一个 Linux 下的软件,你选择的编程语言是什么呢?我想大多数人会选择 或者 吧。像上面说的 50 音图测试软件,用 C 开发有些大材小用了,用 呢,要是涉及运算的时候速度又不尽人意。

那么用什么呢?Google 的 Go 语言?库还不完善呢。?有些人会想到这个 GNOME 的项目了,确实, 对于熟悉 C# 的朋友可能十分顺手,可是对于更加喜欢 Python 的朋友,或许就不是那么友好了。

好的,我们的主角登场了,

既然你知道 Vala,或许你也知道,它只是对 C 语言的一个包装,运行效率与 C 相差无几。Genie 语言就是 Vala 的同胞弟弟,它也是对 C 语言的包装和翻译,能够实现 Vala 的所有特性,甚至“编译器”都是相同的——valac!唯一不同的是,Genie 是以 Boo、Python 等脚本语言为蓝本,语法上更加灵活、简洁,如果你学过 Python,Genie 的入门将十分之快!

来看看我写的这个简单的 50 音图背诵软件吧,功能很简单,就是将日语的平假名随机闪现,相信有 + 基础的朋友很容易就可以看懂。

/* Build with valac --pkg gtk+-2.0 mykana.gs */
[indent=4]
uses
    Gtk

init
    Gtk.init(ref args)
    var window = new MainWindow()
    window.show_all()
    Gtk.main()

class MainWindow: Window
    label: Label
    const chars : array of string = {"あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "ち", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "や", "う", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん"}

    init
        title = "My Kana"
        window_position = WindowPosition.CENTER
        default_width = 250
        default_height = 250
        destroy.connect(Gtk.main_quit)
        label = new Label(null)
        add(label)
        Timeout.add_seconds(1, this.change_char)

    def change_char(): bool
        var i = Random.int_range(0, 46)
        var output = Markup.printf_escaped("%s", chars[i])
        label.set_markup(output)
        return true

可以看出,除了类型声明之外,从某种程度上讲,Genie 的语法甚至比 Python 更加简单。而且,通过使用 libgee,Genie 甚至可以使用等同于 Python 中的 list、dict 等类型,功能十分强大。Genie 与 Vala 共用 API,所以库的问题也不用担心。

不过,Genie 创造于 2008 年,年纪还很轻,文档还不够全。就如同 Vala 一样,Genie 的语法也在发展之中。如果你觉得这些都不是问题,那么赶快看看文档学习一下吧!

我觉得很不错的一些文档:官方指南来自 Puppy Linux 的指南官方代码示例

标签: , , , 15 评论
23七/108

用 Blender 制作的杯具

关心 Linux 桌面的朋友可能都已经知道 TX 兄的 iBentu 网站上线了,第一篇文章就是 kevin 的 教程,教大家制作杯具……

看得出来,kevin 的视频做得很用心,加上很让人惊艳的声线,这样的教程确实很值的一看。:)

看看我的作品吧:

blender-cup.png

好吧,我承认自己做得很渣,虽然多次请教 kevin,最后还是做成了这样……不过杯具就要有悲剧的样嘛~^_^

期待 kevin 的下一次视频教程……另外请大家支持 网站~

16七/109

GtkApplication – GTK+ 3 中的 Application 支持

+ 3 在紧锣密鼓的开发之中,虽然说 3.0 版本相对于 + 2 在编程方面的改变并不大,不过仍然有些改变是和 + 使用者密切相关的,比如新加入的 GtkApplication 类。

大家知道开始学习 GTK+ 的一个难点就是莫名其妙的 gtk_init()、gtk_main(),以及 quit、destroy 等信号的区别之类的,简单来说,一个 Hello World 程序的构建过程很让人困惑,感觉就像记住了一个模板,每次都要写一次。

GTK+ 3 为了解决这个问题,抽象出了 GtkApplication 这个类,那么一切都变得容易理解起来:gtk_init() 就是 GtkApplication 的构造函数,现在只需要调用 gtk_application_new() 就可以,gtk_main() 现在变成了 gtk_application_run(),意义很明显,而程序的退出也只需要连接 GtkApplication 类的 quit 信号即可。

GtkApplication 默认自带一个 GtkWindow,可以通过 gtk_application_get_window() 获得,因此一个新的 Hello World 看起来可能是这样:

#include <gtk/gtk.h>
int
main (int argc, char **argv)
{
  GtkApplication *app;
  GtkWindow *window;

  app = gtk_application_new ("org.gtk.Example", &argc, &argv);

  window = gtk_application_get_window (app);
  gtk_container_add (GTK_CONTAINER (window), gtk_label_new ("Hello world"));
  gtk_widget_show_all (GTK_WIDGET (window));

  gtk_application_run (app);

  return 0;
}

怎么样,是不是简单明了得多?

更多关于 GtkApplication 类的信息可以参照 GTK+ Reference Manual

标签: 9 评论
16七/109

Arch 中抢先体验 Compiz++

LDCN 曾经介绍过 将用 ++ 重写,不过之后 GNOME-Shell 的大热几乎让我们忘记了 Compiz++ 这么回事,再加上 Compiz 开发者匮乏,开发进度缓慢的一贯印象,除了少数如我一般的 Compiz 死忠,似乎很少有人关心 Compiz 怎么样了。
无论如何,Compiz 的开发者们还是在默默地为了理想中的窗口管理器努力着,如今 Compiz++ 已经接近可用状态, 论坛上也有人放出了 Compiz++ 系列的 PKGBUILD,如果你也是 Compiz 的粉丝之一的话,不妨抢先体验一下吧。
这几个包的名称和地址是:
compiz-core++
compiz-plugins-main++
compiz-plugins-extra++
compiz-plugins-unsupported++
libcompizconfig++
compizconfig-python++
ccsm++
emerald++ (可选)
emerald-themes++ (可选)

安装 Compiz++ 完全不会影响现有的 Compiz,因为它是安装在 /opt 下面的,配置文件的名字也会不同。安装完成上面的包,可以运行如下命令来配置 Compiz++:

/opt/compiz++/bin/ccsm++

开启 Compiz++(建议预先开启 fusion-icon,这样遇到什么问题,可以方便切换为原来的 metacity 或者 compiz):

/opt/compiz++/bin/compiz --replace ccp

如果遇到问题,试试:

/opt/compiz++/bin/compiz --replace move decor composite resize place opengl

还不行的话,把 opengl 去掉试试。
当然这只是一次 C++ 语言的重写,不要期望有大的功能上或者性能上的变化,也不要指望开发版的稳定性有多么好就是了。不过相信通过 C++ 的重写和重新架构,以后的 Compiz 开发会更加容易、更加顺畅,给我们带来更好的体验。

Arch 论坛上的讨论帖:http://bbs.archlinux.org/viewtopic.php?id=93786

标签: , , 9 评论
15七/1010

在 Virtualbox 中安装 Mac OS X

关注 的同学可能已经知道, 3.2 版本中已经加入了 Mac OS X Guest 系统的支持,也就是说,我们可以在其他系统上通过 虚拟它、体验它了!

我个人以前也在真机上折腾过所谓的“黑苹果”,不过由于我的台式机 CPU 都是 AMD 的,折腾来折腾去一直没有成功安装运行起来过,不过单单是它的安装界面,就不枉众人对它的美誉了。感谢郭嘉以及 Virtualbox 给了我这次宝贵的体验机会,我当然要好好珍惜啦。在 Lifehacker 这篇《How to Run Mac OS X in VirtualBox on Windows》的指引下,安装过程很是顺利。

这里简单说说要点:

首先,确定你的 CPU 支持虚拟化《How To Find Out If Your CPU Supports Hardware Virtualization (Intel VTx / AMD-v)

然后,下载一款黑苹果的 ISO,我用的是 Hazard 的 OSX86 Snow Leopard

接着,在 Virtualbox 3.2.6 或以上版本里面,创建一个虚拟机,目前 Virtualbox 3.2.6 中 CPU 只能选单核,内存自己定(我用 1G),不要选 EFI 选项,网卡要选 Intel PRO/1000 MT Desktop,声卡驱动见《Mac OS X guest sound support driver》。

插入光盘,启动虚拟机,开始时要按回车或者按 F8,不然会启动不了。格式化好磁盘,然后在安装时选自定义,注意选中最上面的所有更新,选中 Kernels 里面的 Legacy kernel,以及最下面的附加字体。对于 AMD 用户,要选中下面的“AMD”,对于 Intel 用户,则需要在 bootloaders 里面选中最新版本的 Chameleon。最好不要选其他的了,否则不保证能安装成功,经验之谈。

最后,就是漫长的安装过程了,大概要一小时或者更长(我用的是动态扩展的磁盘空间)。

安装过程到此为止,重启后经过简单的设置,就可以进入桌面了。

MacOSX_Virtualbox.png

在 Virtualbox 中虚拟的 Mac OS X 还没有虚拟 XP 那么流畅,CPU 占用率也一直很高,不过还差强人意,各种特效能够运行起来,足以让人体验一下传说中苹果系统的风采了。

也许是习惯了各种仿苹果系统的 Dock、动画之类的,Mac OS X 并没有十分的惊艳的感觉。不过通过简单的试用,我还是能够体验到 Mac OS X 背后那种深厚的文化底蕴,虽然动画效果没有 绚丽多姿、功能强大,不过整体的协调感、界面的一致性,这都是 GNOME 乃至 KDE、Windows 7 都模仿不来的,这或许就是传说中的“简约不简单”吧。