24

又开学了…
这学期虽说课少了很多,但事却多了不少…
提交各种关乎以后前途的表格、考试、面试…
Dalvik依旧固执地suspend在那里,让我恨不得直接在每次JAVA程序运行结束后手动把它kill掉…
E680的Android计划直接一个月没碰…
唯一欣慰的就是终于借备用机的机会入了一个BB,虽说是最低端的8700(7xxx:被无情地忽视了T.T…),不过还是被BB的全键盘和系统折服了,经过这半个多月的试用,目前主要感觉到BB的几个优势:一个类似于Android的系统框架,以JVM为核心,并提供系统核心功能API;提供完善的Development Environment和开发手册,这在现在的几大系统里似乎已经是惯例了,但一瞥见桌边放的E680,不经还是内牛满面,居然被MOTO这个自私而NC的家伙蒙骗了这么久…
得益于BB强大的开发环境,这个月还干了一件不务正业的事…
在BB上一直没找到一个很好的gtalk客户端,不是太贵就是太大,或者操作没有充分针对BB的全键盘进行优化,唯一一个感觉很满意的gmail+gtalk在7天试用期满后,被shapeservice客服无情地告知他们已经不提供这个“古董”了,要我去买IM+,40刀…抢钱啊…最后,毅然决定还是自己动手丰衣足食,利用JDE搞一个自己的GTALK。目前已经从一个开源项目JXA开始着手做了,当前状态是可以在BB上提供简单的收发信息,但是很简陋。计划这两天趁没事赶紧先搞一个可用的开发版本公布出去先,一方面好找人帮忙测试,还可以拉大牛一直开发 XD
不废话了,赶紧再写点去…

31

近期任务计划

前段时间因为实验室工作任务较重,加上一个课程项目要做,没有时间更新。然后又回家一周多,又光顾玩了……
近期将继续android移植方面的工作,另外打算顺便试试将android移植到我的E680i上,不过这样就得先搞个备用机。
今天初步搭建了一个交叉环境,下了openezx项目和一位前辈的a1200的android移植过程以及相应补丁等。试着编了一下内核,通过usb_boot方式启动,pass了。但是挂载NFS作为ROOTFS出了问题,就找了个闲置的SD卡,先把rootfs放在上面,启动成功。不过最后还是没法进入android桌面,在启动过程挂掉了@@……目前推測主要原因是内存太小,主进程被内核的LOW MEMORY KILLER干掉了
后面工作先要进入android桌面,看看硬件驱动是否完善;下一步,由于这个采用的android版本太老,考虑将更新版本的跑起来,不过不知E680i能否坚持住……
如果能顺利进入android桌面,我会单独把过程写下来。附前辈的android on e680视频
[http://player.youku.com/player.php/sid/XMTE2MDUxMTky/v.swf#swf]

14

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
Find the sum of all the even-valued terms in the sequence which do not exceed four million.

这道题也很水,所以不多说了…

#!/usr/bin/env python

sum = 0
num1 = 0
num2 = 1
while num2 <= 4000000:
    print num2
    if num2 % 2 == 0:
        sum += num2
    temp = num2
    num2 = num1+num2
    num1 = temp
print sum
14

使用Arch Linux近半年,实在是越来越喜欢这个轻量级的发行版,尤其是它的软件包制作以及管理机制让人感觉很是方便。基础的pacman的功能就不说了,大体和debian系的apt-get类似,功能也很强大,主要用于安装二进制包。今天主要说说Arch灵活而强大的软件包制作机制——makepkg。
makepkg是一种基于脚本的软件包制作工具,其脚本格式除了固定的区域划分格式以外,主要脚本部分以shell脚本方式执行,所以说对大多数人来说上手很方便。

makepkg基于脚本的自动化工作方式

使用makepkg制作软件包时,最核心的文件就是PKGBUILD,就是上面说的软件包制作脚本。只要我们得到一个正确的脚本,只要在脚本所在目录执行makepkg命令,它就能自动从网上或本地获取制作软件包所需的资源(如源代码或现成的二进制包),自动检查软件包依赖关系是否满足,然后进行编译/加工,得到可以直接用pacman进行安装的pkg格式软件包。需要注意的是Arch Linux的所有二进制软件包就是基于makepkg制作的。

makepkg的安装&配置

要开始使用makepkg,先执行下列命令进行安装[code=bash]pacman -Sy base-devel
[/code]然后根据你的机子配置,修改“/etc/makepkg.conf”设置,使得编译出来的软件包更加适合你的硬件配置。其中主要的配置项包括GCC的FLAG设置,可以根据你的CPU来选择一个架构相关的优化选项(如-march=core2);包建立环境设置;软件包默认安装位置设置…不过如果你不熟悉完全可以不管它,默认设置已经可以有很不错的效果了。

makepkg的使用

然后就可以利用makepkg建立自己的软件包了。这里以AURArchLinux User-community Repository,后面会介绍)上的linux-fetion客户端(一个开源的跨平台飞信客户端)为例说明makepkg的使用过程。

  1. 首先到这里下载linux-fetion的PKGBUILD脚本
  2. 在PKGBUILD脚本所在目录执行makepkg,你就能看到makepkg开始自动下载linux-fetion的源码,并开始编译,编译完成后还会自动打成PKG包
  3. 执行完毕后,如果没有出错,当前目录下应该出现了一个.pkg.tar.gz为后缀的文件,这个文件就是刚刚创建的软件包了,执行pacman -U ***.pkg.tar.gz即可安装

从上面的步骤可以看出makepkg制作软件包的过程非常简单。更重要的是,以软件包的形式进行软件安装,在很大程度上方便了后期对软件进行更新和卸载。另外,结合后面介绍的工具,你可以轻松安装&管理大量丰富的软件。

ABS

前面提到Arch Linux中的所有软件包都是利用makepkg工具制作成pkg安装包,那么哪里能找到这些软件包的PKGBUILD脚本呢?这就要提到ABS(the Arch Build System)。ᗜABS是一个类似于BSD的ports(ports-like)的源代码级软件管理系统。利用ABS,我们可以方便地获取Arch官方提供的软件包的PKGBUILD,并根据我们自己的需要进行软件包的定制或修改,然后再利用makepkg打包为pkg软件包。所以ABS使得我们自行定制预安装软件包的过程变得更加方便,尤其在内核等核心组件方面。

安装和配置ABS

要使用ABS,先使用pacman进行安装。以root权限执行[code=bash]pacman -Syu[/code]

安装完毕后,我们先修改一下/etc/abs.conf,其中主要设置”REPOS=(core extra !community !testing)”这一项,即分别选择是否同步core,extra,community,testing软件仓库。这里根据自己需要修改的软件包所属分支,自行设置。!testing表示不同步testing软件仓库。

同步ABS的PKGBUILD脚本

上面的配置完成后,先以root权限执行[code=bash]abs[/code]执行完毕后,我们可以看到“/var/abs”目录下出现了我们所需要的PKGBUILD脚本以及一些必须的配置文件。按照官方推荐做法,我们先建立“/var/abs/local”目录,并赋予非root用户对于该目录的完全访问权限(以便于以非root用户建立软件包,以非root身份运行makepkg是一个有助于安全的好习惯)。然后我们需要定制哪个软件包时,就可以在这个local目录下进行。

举例说明吧,我需要修改transmission以打开IPV6支持,就可以这么做

  1. 先在/var/abs/local下建立一个transmission目录并进入该目录[code=bash]mkdir /var/abs/local/transmission & cd /var/abs/local/transmission[/code]
  2. 将ABS提供的transmission脚本复制过来[code=bash]cp -r /var/abs/extra/transmission-gtk/* .[/code]
  3. 打开PKGBUILD脚本,先查看其源代码下载地址,从该地址手动下载源码,在本地解包,并针对IPV6进行相应修改
  4. 修改PKGBUILD脚本,使得它直接使用上一步修改过的源码进行编译,而不是从网上重新下载源码
  5. 执行makepkg,编译&制作软件包
  6. 直接使用pacman将我们定制好的transmission更新到系统中

可以看到利用ABS配合makepkg可以非常方便的进行软件包定制。

AUR

虽然Arch Linux提供了一个很好用的软件包管理系统,但是我们使用的一些软件Arch 的官方软件仓库并没有提供,难道我们必须一个一个自己写PKGBUILD脚本吗?当然这也是一个方法,尤其对于那些牛人们来说,但是有了AUR,对于大多数人来说就有了更方便的方法。

AUR(the Arch User-Community Repository)是一个由用户社区自行维护的庞大的软件仓库,常用的软件基本都可以在这里找到相应的PKGBUILD脚本,方便地建立软件包,进行安装。其最大的特点就是开发性,你可以将自己写的某个软件包的PKGBUILD脚本上传,与他人共享,而他人对此脚本有什么意见,都可以直接向你提出,或提醒你脚本已过期等等。比如我上面举例提到的linux-fetion,就是利用AUR提供的PKGBUILD脚本。

AUR的站点是http://aur.archlinux.org/,你现在就可以根据自己需要去下载需要的PKGBUILD脚本,构建需要的软件包了。不过你也可以忍耐一下,看完下面对yaourt工具的介绍,你就可以用yaourt这一强大工具让这一过程更加自动化。

Yaourt

yaourt(Yet AnOther User Repository Tool)是一位大牛写的Arch软件包管理工具,提供了对pacman的封装,但最主要的功能就是使得从AUR构建软件包更加方便。

首先从这里下载yaourt的PKGBUILD脚本,按照一般的makepkg方法安装该软件包。

安装完成后,试试执行[code=bash]yaourt fetion[code]我们可以看到yaourt自动从AUR上搜索fetion关键字,找到相应Repo信息。我们可以按序号选择一个,yaourt就会自动下载PKGBUILD脚本,并提示你做需要的修改之后,即可自动构建、安装软件包。安装完成还会自动对软件包进行投票。总之,功能非常强大,你可以自己去探索探索。

参考来源

Arch Wiki:

http://wiki.archlinux.org/index.php/Makepkg

http://wiki.archlinux.org/index.php/ABS

http://wiki.archlinux.org/index.php/AUR

AUR

12

接触Python一年多了,但一直没有用它写过什么正经的东西。刚好这个暑假暂时没法回家,在学校也不是特别忙,就把之前觊觎已久的Project Eular翻出来,准备用Python扫一遍,就当作学习Python了。不过以我可怜的水平,不知道能坚持几道…

今天先扫一道超级水题,增强下信心吧……
Project Eular #1

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.

sum = 0
for num in range(3,1000,3):
    sum = sum+num
for num in range(5,1000,5):
    sum = sum+num
for num in range(15,1000,15):
    sum = sum-num
print sum
11

Chromium for Linux最近的开发进度相当快,很多方面都日趋完善,比如GTK原生主题支持,输入法支持,设置选项的完善等等。而前两天,更是进一步提供了对插件的支持,最主要的当然是flash了。

但是我按网上提供的说明,在/usr/lib/chromium-browser/plugins目录下建立flash插件的符号链接并没有起作用。后来我试着在chromium的安装目录下建立plugins目录,并建立符号链接,终于搞定了!

所以对于按网上说明没有成功开启的情况,不妨试试这个方法。

  1. 先找到chromium的安装目录(此目录中应包含locales,resources,themes等目录)
  2. 如果此目录中没有plugins目录,则手动建立(注意权限)[code=bash]mkdir plugins[/code],然后进入plugins文件夹[code]cd plugins[/code]
  3. 建立flash插件的符号链接,可以firefox等浏览器那里链过来,比如从firefox那里链的话,执行[code=bash]ln -s /usr/lib/mozilla/plugins/libflashplayer.so libflashplayer.so[/code]
  4. 重启chromium,先在地址栏输入about:plugins查看flash插件工作状态,正常的话就可以去看flash啦

效果如下图:

不过毕竟还在开发过程中,现在的flash支持问题很多,已知在某些情况下只有声音没有图像,并且我在试用中出现chrome进程僵死,只能手动kill chrome进程,另外可能会导致chromium的CPU占用率陡升(这其实是linux下flash的通病了-_-|||)。

Any way,近来chromium for linux的进步是大家有目共暏的,相信将chromium作为主浏览器的日子不会太远了~

09

注:此文是在patch-hosting-for-android-x86-support项目的基础上,将内核版本改为2.6.29而来
patch-hosting-for-android-x86-support项目主页:http://code.google.com/p/patch-hosting-for-android-x86-support/

主要步骤

  1. 按照patch-hosting-for-android-x86-support的Wiki页面中的BuildAndroidForX86Platform中说明步骤,先利用repo得到完整的android源码以及eee_701平台相关的编译脚本,但先不要开始编译。
  2. 利用git获得android的2.6.29版内核。执行[code]git clone git://android.git.kernel.org/kernel/common.git android-kernel-2.6.29[/code]建立本地的代码仓库。完成后,进入android-kernel-2.6.29目录,执行
    git checkout origin/android-2.6.29 -b android-kernel-2.6.29

    ,签出我们需要的内核源码

  3. 为内核打补丁。从patch-hosting-for-android-x86-support的下载页下载alarm.patch,在内核目录执行
    patch -Np1 < alarm.patch

    打上补丁

  4. 配置并编译2.6.29内核。从patch-hosting-for-android-x86-support项目的下载页下到kernel.config文件,放到刚刚获得的2.6.29版内核根目录,并重命名为.config。然后执行make menuconfig。这里主要需要打开android的staging driver功能。打开device drivers->staging drivers,然后关闭device drivers->Exclude Staging drivers from being built,这时最底下会出现Android菜单,进去把所有都选上(有些可能不需要,根据具体需要配置)。然后保存退出。进行编译
    make bzImage -j4

  5. 如果编译顺利,将arch/x86/boot/bzImage复制到前面获得的android源码目录中vendor/asus/eee_701/目录,并改名为kernel(覆盖原有的kernel文件)
  6. 剩下步骤与patch-hosting-for-android-x86-support的Wiki说明相同,最后可以做出一个vdi镜像用virtualbox跑跑试试。bless~
09

Original URL: http://yegle.net/2009/04/27/transmission-ipv6-support/

transmission是一个在linux下比较流行的bt客户端,gtk界面,支持daemon,并有方便的web前端和第三方的客户端。

transmission在大约1.50版的时候开始声明支持ipv6了,但是实际使用过程中却发现连接到byrbt的tracker时,服务端见到的ip是v4的ip,即使在/etc/hosts文件中指定了tracker的v6地址也一样。

google到了transmission的trac上有讨论这个问题(1,2)。似乎是transmission在对byrbt这样的v4/v6双栈的tracker时只解析v4地址,不解析v6地址。

trac里原文:

Brief explanation for posterity and those out of the loop: In libTransmission (pre-1.60?, that’s the plan anyway) “torrent” and “tracker” are used interchangeably. With the addition of IPv6 support, the two concepts need to be separated. This is a fairly major refactoring job. For 1.5x and in trunk currently, IPv6 DNS resolution in libcurl (the library we use for tracker communication) is disabled to prevent breakage of trackers with AAAA and A records on the same hostname (notably, TPB). For those of you coming here from #1937, the curl option to disable IPv6 “DNS resolution” apparently also causes curl to bail if given an explicit IPv6 tracker address (such as http://[::1]/announce), so that bug is the same as this one.

解决的办法很简单,修改源码里libtransmission/web.c,找到 curl_easy_setopt( easy, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );一行,将CURL_IPRESOLVE_V4修改为CURL_IPRESOLVE_V6,然后正常编译安装即可。如果同时需要使用v4的 tracker,可以把这部分修改成CURL_IPRESOLVE_WHATEVER。

实际使用效果甚好。原本都是做种很久后才有零星的ipv6的peer连接,现在连上tracker后不久就能得到ipv6的peer了

BTW,不知道为什么,transmissionbt.com也被墙了……万恶的GFW……