Compiz 0.9.2 发布
在使用 C++ 重写,而又沉寂了一段时间之后,Compiz 开发小组发布了新的 Compiz 0.9.2 版本,虽然仍然是实验性的版本,不过根据作者所言,这个版本已经可以用于日常应用。在 Arch 下安装新版 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 光明的未来喝彩吧!
Arch Linux 下 Android 源码下载与编译
最近工程实践的老师让我把 Android 环境搭建起来,并且将界面换成黑白的,算是一个考验,这里就记录一下具体的做法。
Android 源码以前没有注意过,一直以为是 git 管理,看了一下文档,才知道 Google 在 git 上面又加了一个叫做 repo 的工具,用来管理大量的 git 仓库。
repo 这个工具在 AUR 里面有,叫做“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,我就在这里中断过……
闲话少说,下面是两个针对 Arch 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
最后是几张模拟器的图片,是我改成黑白之后的:
学生用户 Dropbox 容量翻倍!
Dropbox 现在在搞活动了,看到推上还没有人说,赶紧告诉大家。
Dropbox 现在正在针对学生用户(准确说是 .edu 用户)开展活动,只要收封邮件激活一下,就可以将现有的容量翻倍(最多到 18G),而邀请他人所获得的容量也会翻倍(500M/用户,最多获得 16G)。
本人有学校分配的 .edu 邮箱,很容易就获得了超大容量,大家也赶快上吧~
活动页面:https://www.dropbox.com/edu
另外,还没有 Dropbox 的同学赶快申请一个吧,我已经受到 Dropbox 很多好处了,以前系统误操作格式化掉,很容易就从网上恢复回来,另外,不同机器之间迁移、朋友间共享文件也变得很方便。从我的邀请链接进入,可以额外获得 250 M 流量哦!
使用 dbus-python 建立单实例进程
D-Bus 是 Linux 系统上广泛应用的消息总线,是 Linux 桌面程序常用的消息通信机制之一,熟悉 Linux 编程的同学可能对它已经很熟悉了,不过对于我来说,看了好长时间文档才算有点收获,赶紧记录下来。
大家知道 #yaner 得是个单实例(Single Instance)程序(不知道的同学赶紧知道),之前这种单实例的特性是由网上抄来的一段代码,用 Socket 的唯一地址实现的。功能虽然实现了,不过想要进一步扩展就比较难了,好吧,相比于 D-Bus,Socket 我更是一窍不通。
为什么要扩展呢?大家知道,作为一个下载器,是要支持浏览器滴,可是怎么支持浏览器呢?当然是浏览器来调用下载器的命令行。这样就要求,下载器是单实例程序的同时,运行其他实例的时候,不仅要提示用户已经有一个实例运行,还要从命令行接收参数,传输给之前存在的实例,这就需要进程间通信了。
下面就是一段简单的用 D-Bus 实现的单实例类,继承这个类的类都将获得单实例特性。目前它还没有通信相关的代码,将在后面加入。
import dbus import dbus.service import dbus.mainloop.glib class SingleInstanceAppMixin: "Single Instance Application" def __init__(self, bus_name): dbus.mainloop.glib.DBusGMainLoop(set_as_default = True) self.bus = dbus.SessionBus() try: self.bus_name = dbus.service.BusName(bus_name, self.bus, allow_replacement = False, replace_existing = True, do_not_queue = True) except dbus.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 才看出来问题所在……
加快 git clone 速度的方法
呵呵,不知道我是不是火星了,git clone 原来可以不全部克隆的,而是可以只克隆当前的 commit,使用下面的命令即可:
git clone git://... --depth 1
也就是指定克隆深度为 1。
当然,通过这样克隆的代码就不能进行管理、提交什么的了。
学校的网络不知为何把 git 封了,只好用 proxychains 代理进行克隆,速度慢死,有了这个命令,安装个软件就快多了~
人生苦短,我用 Genie
这篇文章已经酝酿很久了,不过一直没时间没心情写。今天到学校开始学日语了,又看到 WowUbuntu 介绍的日语 50 音图测试软件 Kanatest 在 Arch 的 AUR 里面找不到,所以干脆自己写一个,顺便补上这篇文章。
进入正题,开发一个 Linux 下的软件,你选择的编程语言是什么呢?我想大多数人会选择 C 或者 Python 吧。像上面说的 50 音图测试软件,用 C 开发有些大材小用了,用 Python 呢,要是涉及运算的时候速度又不尽人意。
那么用什么呢?Google 的 Go 语言?库还不完善呢。Vala?有些人会想到这个 GNOME 的项目了,确实,Vala 对于熟悉 C# 的朋友可能十分顺手,可是对于更加喜欢 Python 的朋友,或许就不是那么友好了。
好的,我们的主角登场了,Genie!
既然你知道 Vala,或许你也知道,它只是对 C 语言的一个包装,运行效率与 C 相差无几。Genie 语言就是 Vala 的同胞弟弟,它也是对 C 语言的包装和翻译,能够实现 Vala 的所有特性,甚至“编译器”都是相同的——valac!唯一不同的是,Genie 是以 Boo、Python 等脚本语言为蓝本,语法上更加灵活、简洁,如果你学过 Python,Genie 的入门将十分之快!
来看看我写的这个简单的 50 音图背诵软件吧,功能很简单,就是将日语的平假名随机闪现,相信有 GTK+ 基础的朋友很容易就可以看懂。
/* 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 的指南、官方代码示例。
用 Blender 制作的杯具
关心 Linux 桌面的朋友可能都已经知道 TX 兄的 iBentu 网站上线了,第一篇文章就是 kevin 的 Blender 教程,教大家制作杯具……
看得出来,kevin 的视频做得很用心,加上很让人惊艳的声线,这样的教程确实很值的一看。:)
看看我的作品吧:
好吧,我承认自己做得很渣,虽然多次请教 kevin,最后还是做成了这样……不过杯具就要有悲剧的样嘛~^_^
期待 kevin 的下一次视频教程……另外请大家支持 iBentu 网站~
GtkApplication – GTK+ 3 中的 Application 支持
GTK+ 3 在紧锣密鼓的开发之中,虽然说 3.0 版本相对于 GTK+ 2 在编程方面的改变并不大,不过仍然有些改变是和 GTK+ 使用者密切相关的,比如新加入的 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。
Arch 中抢先体验 Compiz++
LDCN 曾经介绍过 Compiz 将用 C++ 重写,不过之后 GNOME-Shell 的大热几乎让我们忘记了 Compiz++ 这么回事,再加上 Compiz 开发者匮乏,开发进度缓慢的一贯印象,除了少数如我一般的 Compiz 死忠,似乎很少有人关心 Compiz 怎么样了。
无论如何,Compiz 的开发者们还是在默默地为了理想中的窗口管理器努力着,如今 Compiz++ 已经接近可用状态, Arch 论坛上也有人放出了 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
在 Virtualbox 中安装 Mac OS X
关注 Virtualbox 的同学可能已经知道,Virtualbox 3.2 版本中已经加入了 Mac OS X Guest 系统的支持,也就是说,我们可以在其他系统上通过 Virtualbox 虚拟它、体验它了!
我个人以前也在真机上折腾过所谓的“黑苹果”,不过由于我的台式机 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。最好不要选其他的了,否则不保证能安装成功,经验之谈。
最后,就是漫长的安装过程了,大概要一小时或者更长(我用的是动态扩展的磁盘空间)。
安装过程到此为止,重启后经过简单的设置,就可以进入桌面了。
在 Virtualbox 中虚拟的 Mac OS X 还没有虚拟 XP 那么流畅,CPU 占用率也一直很高,不过还差强人意,各种特效能够运行起来,足以让人体验一下传说中苹果系统的风采了。
也许是习惯了各种仿苹果系统的 Dock、动画之类的,Mac OS X 并没有十分的惊艳的感觉。不过通过简单的试用,我还是能够体验到 Mac OS X 背后那种深厚的文化底蕴,虽然动画效果没有 Compiz 绚丽多姿、功能强大,不过整体的协调感、界面的一致性,这都是 GNOME 乃至 KDE、Windows 7 都模仿不来的,这或许就是传说中的“简约不简单”吧。







