Wednesday, May 13, 2009


* 2009 La Casa della Musica, Parma, Italy - Website, A/V Streams & Slides

LAC (Linux Audio Conference) is held annually and this year it was in Italy in April, and from its papers and slides, it can be observed that frugal may be the next right direction.

Sunday, May 10, 2009

之前写过一篇 Blog
这里,能找到这个系列又多了一个
  1. Karmic Koala (命运的树袋熊) 9.10 Released in October 2009
最近又发现了一系列有意思的名字,就是 Linux 内核的发布代号:

这个代号隐藏于 每一内核发布的 Makefile 文件中,第5行是

git show v2.6.30-rc5:Makefile |head -n5
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 30
EXTRAVERSION = -rc5
NAME = Vindictive Armadillo


其中 Vindictive Armadillo (怀恨的犰狳) 就是了。

倒推过来是
  1. v2.6.30 Vindictive Armadillo (怀恨的犰狳) (Not Released Yet)
  2. v2.6.29 Temporary Tasmanian Devil (临时的 Tasmanian 恶魔)
  3. v2.6.28 Erotic Pickled Herring ()
  4. v2.6.27 Rotary Wombat ()
  5. v2.6.26 Rotary Wombat
  6. v2.6.25 Funky Weasel is Jiggy wit it
  7. v2.6.24 Arr Matey! A Hairy Bilge Rat!
  8. v2.6.23 Arr Matey! A Hairy Bilge Rat!
  9. v2.6.22 Holy Dancing Manatees, Batman!
  10. v2.6.21 Nocturnal Monster Puppy
  11. v2.6.20 Homicidal Dwarf Hamster
  12. v2.6.19 Avast! A bilge rat!
  13. v2.6.18 Avast! A bilge rat!
  14. v2.6.17 Crazed Snow-Weasel
  15. v2.6.16 Sliding Snow Leopard
  16. v2.6.15 Sliding Snow Leopard
  17. v2.6.14 Affluent Albatross
  18. v2.6.13 Woozy Numbat
  19. v2.6.12 Woozy Numbat
  20. v2.6.11 Woozy Numbat

Thursday, May 07, 2009

A simple way with curl to post code snippet to ubuntu paste:


$ curl -v -d 'poster=chengrq&syntax=python' --data-urlencode 'content@/home/gektop/bin/diff-filter' http://paste.ubuntu.com
* About to connect() to paste.ubuntu.com port 80 (#0)
* Trying 91.189.90.174... connected
* Connected to paste.ubuntu.com (91.189.90.174) port 80 (#0)
> POST / HTTP/1.1
> User-Agent: curl/7.18.2 (x86_64-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8j zlib/1.2.3
> Host: paste.ubuntu.com
> Accept: */*
> Content-Length: 3002
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 302 Found
< Date: Fri, 08 May 2009 01:29:08 GMT
< Server: Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2 mod_ssl/2.2.8 OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
< Location: /166435/
< Content-Length: 0
< Content-Type: text/html; charset=utf-8
<
* Connection #0 to host paste.ubuntu.com left intact
* Closing connection #0

I need a diff (or patch) manipulation utility, but unfortunately I have not found one, then I wrote one, of course, it's in Python.



#!/usr/bin/python

import sys, os

# Usage: diff-filter [-v] path1 path2 ...
# <INPUT >OUTPUT
if len(sys.argv) <= 1:

print "Usage: %s [-v] path1 path2 ... <INPUT" % \
os.path.basename(sys.argv[0])

sys.exit(1)

# some global variables
inChunk = True

strip = 1
matched = False
buffer = ''

invert = False

# to invert the filter
if sys.argv[1] == '-v':

invert = True
del sys.argv[1]

# the main filter
while True:
line = sys.stdin.readline()

if not line:
break

if line.startswith("--- ") or \
line.startswith("diff") or \
line.startswith("Binary") or \
line.startswith("Index"):

matched = False
inChunk = False

if line.startswith("diff") or \
line.startswith("Binary") or \
line.startswith("Index"):

buffer += line
continue
else:
path = line.split()[1]

slash = path.find('/')
path = path[slash+1:]

for arg in sys.argv[1:]:
if path.startswith(arg):

matched = True
break
else:
matched = False

if invert:
matched = not matched
if not matched:

buffer = ''

if inChunk:
print line,

if matched:
if buffer:
print buffer,

buffer = ''
print line,


It also can be reached by the ubuntu paste service:



http://paste.ubuntu.com/166435/

Application field: if you have a big diff generated by "diff -R", and want to split it according to some seperate path or components, you can use this. Happy hacking!

Sunday, March 29, 2009

Albert H. Einstein

When I was a fairly precious young man, the nothingness of the hopes and strivings that chases most men restlessly through life came to my consciousness with considerable vitality.
Moreover I soon discovered the cruelty of that chase, which in those years was much more carefully covered up by hypocrisy and glitterings words than is the case today.
By the mere existence of the stomach everyone was condemned to participate in that chase.

To the great Albert.

Monday, January 19, 2009

登记 gnupg 公钥

PGP/GPG 公钥和私钥对是很多场合都要求的认证机制,

PGP/GPG public key (not an SSH key)


既然如此,那就做一个吧:

安装一个最新版本的 gnupg:

$ emerge =app-crypt/gnupg-2.0.9-r1
$ gpg --gen-key


此过程一系列问题,姓名、电邮、Comment,最后生成的ID的形式是:



"Name (Comment) "


做好了之后,就传到服务器上去吧,当然传送的是公钥了,私钥是不以任何方式泄漏的;

$ gpg --list-keys
$ gpg --export --armor
$ gpg --keyserver hkp://keys.gnupg.net --keyserver-options debug --send-keys f9b0925b
$ gpg --keyserver hkp://keys.gnupg.net --keyserver-options debug --send-keys f9b0925b
gpg: sending key F9B0925B to hkp server keys.gnupg.net
gpgkeys: curl version = libcurl/7.18.2 OpenSSL/0.9.8j zlib/1.2.3
* About to connect() to keys.gnupg.net port 11371 (#0)
* Trying 86.59.21.34... * Timeout
* Trying 129.128.98.22... * connected
* Connected to keys.gnupg.net (129.128.98.22) port 11371 (#0)
> POST /pks/add HTTP/1.1
Host: keys.gnupg.net:11371
Accept: */*
Content-Length: 1956
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: sks_www/1.0.10
< Content-type: text/html; charset=UTF-8
<
* Closing connection #0


http://www.kernel.org/faq/#account

缺省传送的是 hkp://keys.gnupg.net 服务器,在 ~/.gnupg/gpg.conf 文件中,也提示了其它传送方式,包括发送邮件的形式;因为上面这样的传送有时会失败,如 "86.59.21.34... * Timeout" 。

这个 hkp 访问协议从上面的传送过程也可以看出来,实际上就是一个在非标准端口运行的 http 服务器,提交的过程实际就是 http 表单的提交,既然知道了它在使用 11371 端口号,当然也可以使用浏览器来访问了,如:

http://keys.gnupg.net:11371/pks/lookup?search=0xf9b0925b

Sunday, January 18, 2009

Saturday, January 10, 2009

黄油文件系统(Btrfs)与南瓜文件系统(Squashfs)

黄油文件系统(Btrfs)是Linux下一代文件系统,具有很多先进的文件系统特性,在2008年9月份的内核峰会上已讨论决定在2.6.29合并入主流内核,现在正是2.6.29的rc开放时期(为期两周),linus在昨天刚刚把它合并进去了~

http://lkml.org/lkml/2008/12/31/85

使用Btrfs的方法详见wiki站点:

http://btrfs.wiki.kernel.org/index.php/Main_Page

可以这么评价吧:
1. Solaris曾经有最后两根救命稻草是DTrace探测工具和ZFS文件系统,现在在Linux上有了带utrace内核的Systemtap和Btrfs文件系统,Solaris操作系统再也没有任何优势了,

另外,在这个页面还包含了很多Btrfs的许多创意想法,有已实现和正在实现的,包括在文件系统层次的RAID5,6:

http://btrfs.wiki.kernel.org/index.php/Project_ideas

南瓜文件系统(Squashfs)可能就更熟悉了,它采用gzip或lamz(更高压缩率)来制作只读的映像文件,常见于各发行版的LiveCD光盘中,也在今天早上(UTC时间1月9日凌晨)刚刚合并入主流内核(linus的mainstream内核)

http://marc.info/?l=linux-kernel&m=123153961726343&w=2

关于Squashfs的合并之路,倒不是一帆风顺的:
1. 其作者 Phillip Lougher 在这个线索中提到,在过去的数个月(据我观察有两三年了)中,他不停地接到用户的抱怨说为什么Squashfs停止了开发,于是在六个月前, Phillip 辞掉工作,专职为 Squashfs 开发,直到前不久,在与 Andrew Morton 的一次讨论中, Andrew 觉得可以合并进入 linux-next-for-2.6.31 的分支,但这个过程仍然很漫长,(根据3个月的规则,还至少需要七八个月)。 Phillip 已经6个月没有工作,对此已尽乎绝望,希望能尽快合并入主流,可以重新去找份工作,挣点钱。
2. 接下来的回复中,有两种观点;一种常规的观点是文件系统不是一般的驱动程序,是不能贸然合并的,这是传统的观点; Andrew 也是基于此观点认为 Squashfs 还需要在 linux-next 中观察个半年。反对的观点来自 Alan Cox ,说很多发行版的 LiveCD 已经在用 Squashfs 很多年了,还有什么样的大规模测试比这更能说明问题?
3. 终于, Andrew 同意现在就合并吧!我们终于有了一个以蔬菜命名的文件系统了~
4. 调侃继续:
蔬菜总比 FAT (肥胖) 好吧~
我喜欢南瓜(Squash)胜过于黄油(Butter)~

http://thread.gmane.org/gmane.linux.file-systems/28733/focus=28881

http://marc.info/?l=linux-kernel&m=123153961726343&w=2

Thursday, January 01, 2009

Vim, Bram Moolenaar, 乌干达

From: /usr/share/vim/vim72/doc/uganda.txt

Kibaale Children's Centre  *kcc* *Kibaale*  *charity*


Kibaale(乌干达地名)儿童中心位于非洲东部、靠近Tanzania(坦桑尼亚),在乌干达南部的一个小镇Kibaale。这个地区以Rakai区而闻名。居民大多是农民。尽管人们很穷,食物仍然是足够的。但是这个地区正承受着比世界上任何地方都更严重的AIDS灾难。也有人说它就是起源于这里。据统计有10~30%的乌干达人受到了HIV的感染。因为父母死亡,那里有很多孤儿。在这个地区有大约6万名儿童失去了一位或两位双亲,尽管总人口只有35万。并且这个数字还在持续增长。

这些儿童需要很多帮助。KCC正在努力工作以提供对食物、医疗和教育的需求。食物和医疗是为了让他们保持健康,教育是让他们将来能够自己照顾自己。KCC以基督的名义工作,但援助是提供给任何宗教的儿童。

解决这个地区问题的关键在于教育。这在过去的 Idi Amin 总统在位的数年以及接下来的内战中一直被忽略着。现在政府又重新稳定了,儿童和父母们都必须学习怎样照顾他们自己和怎样避免被感染。那里也为病人和饥饿的人们提供帮助,但它的主要目的是教会人们如何避免生病和怎样种植健康的食物。

大部分孤儿都住在大家庭里。由叔叔或大一点的姐姐来照顾。因为这样的家庭很大,而收入很低,对一个孤儿来说能得到健康的食物就已经很幸运了。而衣服、医疗和教育是已经超出他们能力所能及的。为了帮助这些有需要的孩子们,我们设置了一个专项赞助计划。可以经济上收养一个小孩。仅仅数美元每月就可以让KCC维持对这个小孩所采取的必要措施,就是保持健康和上学,其它对这个孤儿和支持他的家庭所必需的将由KCC来完成。

在直接帮助这名孤儿的同时,他们成长的环境也需要改善。KCC帮助当地学校提高他们的教学方法。在这个中心有一个示范学校来做教师培训。在那里培训保健员,宣传卫生教育,并且鼓励家庭建立好的厕所。我(Bram)帮助建立了一个水泥板生产基地。这些水泥板用于建造好的厕所,并且都以低于成本价出售。

这个项目还包括一个小的疹所,给孩子和他们的家庭提供医疗帮助。当有需要时,还提供到医院的交通。免疫计划也在实施,以应对传染病的发生(这里麻疹和霍乱一直是个问题)。

1994至1995年夏天我花了一整年时间在这个中心,以志愿者的身份工作。我帮助扩展这个中心,和在城市供水方面工作。我了解到KCC所提供的帮助确实有作用。当我回到荷兰时,我想要继续支持KCC。为了这个,我正在募捐基金和组织赞助计划。请考虑以下可能:

1. 赞助一名小孩上小学,17欧元每月(或更多)
2. 赞助一名小孩上中学,25欧元每月(或更多)
3. 赞助一个疹所,任何数额每月或每季度
4. 单笔捐款

相比于其它儿童赞助组织来说,这此数额都是很低的。这是因为这些钱都是直接到这个中心去了。机构本身的运作费用保持在低于5%。这是个小机构并且依赖于志愿者来运作,因此是可以做到的。如果你想赞助一名小孩,你应该想好需要至少保持一年。

怎样知道你的钱花在了正确的地方呢?首先,你可以得到我作为VIM的作者的个人保证。我信任在这个中心工作的人们,我在私下里了解这里的每一个人。更进一步说,这个中心也被 World Vision, Save the Child Fund 和 International Child Fund 这些组织所共同赞助和监管。我们大约每年对这个中心进行造访和检查一次进度(使用我们自己的钱)。我个人在 1996, 1998, 2000, 2001, 和 2003 年都分别访问过这个中心。访问报告都在ICCF的网站上有。

如果你有更多的疑问,请发电邮给我:

这个中心的地址是:

Kibaale Children's Centre
p.o. box 1658
Masaka, Uganda, East Africa

汇款方法:

USA: ...

Canada: ...

Holland: ...

Germany: ...

World: ...

Europe: ...

Credit Card: 请使用PayPal汇款至 ...
Others: 请汇款至这个银行帐号, ... 请以欧元或美元的形式电汇或邮寄支票,最小额度是70美元,(我的银行帐号不能接受小于70美元的外国支票,致歉)
邮寄支票地址: ...

请尽量使用欧元汇款以减少汇率损失。

这个地址长期有效。


原文在线地址:

http://vim.cybermirror.org/runtime/doc/uganda.txt

http://www.vim.org/htmldoc/uganda.html


Google地图搜索KCC所在位置(东非):

http://maps.google.com/?q=Masaka,+Uganda,+East+Africa

荷兰ICCF组织网站,

http://iccf-holland.org/

上有每年财务报告都可以下载,最近一期是2007年的:

The financial report for 2007 is available (PDF).

http://iccf-holland.org/jaar2007.pdf

2007年中所有捐款总额是47,688欧元,其中持续赞助是20,802欧元,单笔捐款26,633欧元,利息253。

2007年的花费中只有0.4%是用于管理和运作费用。在2006年的费用比较高是因为花在了一个合法的程序以把 iccf.nl 域名要回来。2007的主要费用花在银行取出外国支票上。

这份文件中还提到了,从2001至2007年,捐款收入在稳步增长,从2001年的2万多至2007年的接近5万欧元。

基金是以每次大笔的形式直接转往乌干达,这样以减少银行手续费。

在2008年1月份有91名儿童被赞助收养。比前一年多了6名。捐款的月收入是大约1300欧元。还有很多赞助者是每年支付的。希望在2008年至少能收到同样多的捐款。

而单笔捐款是完全偶然的,也无法预知2008年的情况。

此财务报告由 Adiswil 制作于 2008-02-16 。

KCF has made a newsletter with various information: fall2007.pdf (PDF)

http://iccf-holland.org/newsletter/fall2007.pdf

Friday, December 12, 2008

和平、友爱与火箭! (HP首席技术专家的基于ARM板的开源飞行高度记录软件开发实记) (From: OLS2008论文集)

Subject: 和平、友爱与火箭! (HP首席技术专家的基于ARM板的开源飞行高度记录软件开发实记) (From: OLS2008论文集)

http://ols.fedoraproject.org/OLS/Reprints-2008/

Bdale Garbee Peace, Love, and Rockets!

http://ols.fedoraproject.org/OLS/Reprints-2008/garbee-reprint.pdf

作者 Bdale Garbee 是 HP 的开源和Linux首席技术专家,同时是一位模型火箭飞行爱好者,

他和他的儿子很喜欢制作和飞行各种各样的模型火箭,但是当他们想要一款电子高度计用于探测火箭实飞高度时,却发现市面上现有的产品都是功能很有限,且依赖于专有的软件来配置和解析出数据,这个令人很不爽!

这篇论文描述了他们如何制作开放的硬件和软件来满足自己对于高度的好奇心,现场演示文件中包含有更详细的更强动力的火箭设计计划,并包含了照片和视频材料。

这些材料应该是任何对开放的小型嵌入式设备好奇的人们都感兴趣的。
硬件是基于ARM的,以 "TAPR Open Hardware" 协议开放,
并且完全是基于开源的设计工具实现的。
软件是以GNU工具链和很多开源库在 FreeRTOS 上实现的。

有兴趣的同学们可以读这篇论文。

Thursday, November 13, 2008

你知道 Intrepid Ibex (勇敢的巨角羊) 操作系统 (Ubuntu 8.10) 吗?




"勇敢的巨角羊"这个名字很有意思,看一下最近一系列Ubuntu发行用过的名字:
  1. Intrepid Ibex (勇敢的巨角羊) (Ubuntu 8.10)
  2. Hardy Heron (坚忍的苍鹭) (Ubuntu 8.04)
  3. Gusty Gibbon (强风中的长臂猿) (Ubuntu 7.10)
  4. Feisty Fawn (精神饱满的幼鹿) (Ubuntu 7.04)
  5. Edgy Eft (急躁不安的小蜥蜴) (Ubuntu 6.10)
  6. Dapper Drake (衣冠楚楚的公鸭) (Ubuntu 6.06)
  7. Breezy Badger (微风下的獾) (Ubuntu 5.10)
  8. Hoary HedgeHog (灰白的刺猬) (Ubuntu 5.04)
  9. Warty Warthog (长疣的非洲野猪) (Ubuntu 4.10)
再看下一个半年的发行名称
  1. Jaunty Jackalope (轻松愉悦的狐狼?) (Ubuntu 9.04?)
注意这些名字都有一个"形容词定语+动物名词" (Adjective Animal) 的定式;这个命名模式起源于Mark与 Robert Collins 在关于 Sydney 的一个名为 Funky Ferry (渡口) 的一个 joke 时的对话,"那么,我们要多久才发行第一个版本呢?还有点晕,最多六个月吧。六个月?那不足以做出一个精良的系统啊。那我们先做一个"长疣猪"的发行吧。"

所有发行代号(CodeName)都可以在这个wiki页面查到:

https://wiki.ubuntu.com/DevelopmentCodeNames

另外,有个神秘的版本 Grumpy Groundhog (性情暴躁的土拨鼠) 一直存在于Ubuntu开发人员的心中,其实它本来很有可能作为第一个发行的命名,但它在第一次投票中落选了;并由此带来了更为长久的生命力,因为 Grumpy Groundhog 被作为了永远的 unstable (类似于debian的sid)

另外, Ubuntu 9.10 发行的 CodeName 也正在征集中,从这个帖子来看,很有可能的结果是 Killer Komodo (杀手级巨蜥) 因为这个名字符合命名模式中的下一个起始字母K,现在很受欢迎

http://ubuntuforums.org/showthread.php?t=915595

当然,你永远都可以从 Ubuntu 创意集 (http://brainstorm.ubuntu.com) 提出自己的想法或者为你支持的想法投票, Ubuntu 开发者会从这里寻找最受欢迎的创意并去努力实现它。

Saturday, October 25, 2008

Talk some more about working efficiency on Terminal

Do you know how long compiling a kernel on different hardware with different configs will take?

$ time make -C /usr/src/linux-2.6.27/ -j5

1. that would take 25 minutes on my personal PC with 1 2.9GHz P4 and 512M RAM, 5400rpm IDE disk, a moderate configuration for desktop peripherals;
2. that would take 10 minutes on a Dell 2950 Server, which has dual core 3.0Gx2, 2GB RAM, 7200rpm SATA disk, a minimal config for this type of hardware;
3. that would take 5 minutes if distcc configured on 2 Dell 2950 machines, and compiled with "-j13";

Do you know how long compiling a software package will take on different hardware?

$ time { ./configure --prefix=/usr && make; }

and then:

$ make install DESTDIR=$PWD/dest

from LFS book, you could know the time in unit of SBU,



Use "time" to time it, anywhere the command will last longer than 1 second.

Saturday, October 18, 2008

记录EndUserSummit上的三次全场爆笑

1、在开篇JimZemlin的 Welcome to the Summit 演讲中

Jim说到现在全球有很多企业在使用和关注Linux的发展,其中碰到很多问题,其实是EndUser与Developers之间缺乏足够的互相了解:对EndUser方面是不了解已经有了什么功能;对Developers方面的介绍是说:"$700 billion lines of code every year" (每年产生7千亿行代码),但不是每行都有效的,或者不知道哪一种是最好的,EndUser常常对此感到无所适从;

七千亿啊,全场爆笑;

2、在RicWheeler主持的FileSystem的Track中


他们在讲述Ext4和Btrfs(发音BetterFS),但在这两个具体的文件系统之前,Ted谈到KernelPeople为Filesystem遇到的挑战的应对是设计了NGFS(NextGernerationFileSystem)的概念,针对块设备的变化,(SSD的出现,多设备应用等),在NGFS中都有相应针对的设计,而ext4是当前NGFS的一个snapshot,BtrFS是最接近NGFS设计的一个;

此时,我向ChirsMason(BtrFS的主要开发者也是维护者)提了一个问题,“Ted说ext4可以用在他的Laptop上,不知BtrFS是否可以用在Laptop上?”全场爆笑。Chirs回复说:“当然可以。在我的Laptop已经用了很久了;其实你提得对,我应该也这么宣布一下,这是一个很好的Marketing机会。”回头想想,我提的这个问题好弱的呀。

3、在Cocktail上

其实就是上面第一天的内容,看James和Jonathan还有两位银行界人士共四人的照片,后来我也加入进去谈话了,我问了James一些块设备方面的问题,后来James发现我不像是EndUser更像是Developer,问我知不知道LinuxPlumbersConference,我说我知道,我本来想参加那个会议的,但美国大使馆(USEmbassy)给签证的速度太慢了,导致我错过了那个会议,我的一个朋友(当时一个Google的人为我感到惋惜时说的)说它是"Such an enept bureaucracy",James说“它从来都是 Such an enept bureaucracy”;

"Such an enept bureaucracy"(一个无能的官僚机构),全场爆笑啊。


实际上西方人士大都很幽默,全场爆笑的次数当然也不只这三次,这里只将印象最深刻的三次记录下来。

Wednesday, October 15, 2008

十月,纽约的EndUserSummit(第二天)

第二天的内容更多,首先是主题演讲,Jonathan还是再一次给大家讲述内核社区的工作原理,

这是会议现场,


接下来都是同时进行的很多个Track,这部分我没有拍很多照片,因为我也在里面发言,忙着交流去了,大家直接看主办方的安排就知道有什么内容了,

https://www.linuxfoundation.org/events/enduser/program

这次问过主办方LinuxFoundation,会后会把相关的Presentation文件,和主办方的专业级相机拍的一些照片发布出来,请大家关注主办方的网站吧,

http://www.linuxfoundation.org/

在机场时间不多了,马上要去登机,其它有趣的照片回去再整理吧.

Monday, October 13, 2008

十月,纽约的EndUserSummit


九点,会议在DesmondTutuCenter如期举行,地点是在一个Refectory(餐厅),说是餐厅,我觉得更像一间教堂,

第一个主题演讲的是LinuxFoundation的执行主席Zemlin讲述在Linux平台上,Developers与EndUsers缺少沟通,以至于开发者对用户需求不够了解,或者用户不了解最新开发的功能等,有必要举办一个开发者与EndUser沟通的会议,

第二个主题演讲是Wikinomics的作者,讲述大规模协作如何改变了世界,

接下来是一个Panel讨论,参与Panel的有FifthThird银行的CIO,美国航空的首席架师,纽约股票交易所的ChiefArchitect,还有AIG副总等人物一起来谈应用Linux的开始,以及应用过程所碰到的各种问题,希望Linux做到的哪些功能,等等,台下有一些Subsystem的维护者(也就是开发者)分别给出了回复;

片刻休息之后,是三个主要Vendor(发行商)的总裁或副总来讨论作为Vendor如何协调Developers与EndUsers之间的关系,有Novell,Redhat,和Ubuntu,

午餐后,另一个Panel讨论EndUser观点如何参与进Developers的开发流程,

再一场是Ted讲述了你所不知道的ext3和最新的ext4的特性,ChirsMason讲述BtrFS,这个是最接近NGFS(NextGeneartionFS)概念的了,特性非常多,cool,预计在2.6.29进入mainline;

接下来分为五个Track同时进行,我穿插去听了两个,FileSystem方面还是讨论各文件系统,有一个Administrator(作为EndUser)就说为什么现在的内核用dd将一个块设备上的ext3写到另一个块设备上就挂载不了了,他说记得以前的内核是可以的,Ted和Crhis和James一起回复了关于UUID的问题,

PerformanceTuning的Track中讨论了UDP的延迟,内存资源的合理使用,内存管理的改进,等等,

一小段总结之后到了5点,准时结束,到达附近一个公园举行露天的Cocktail酒会,大家一边喝点饮料吃点东西,一边在谈着Business或者Troubleshooting;我下午看了Rosedt的RT-linux的演示,太cool了,晚上继续听了一些关于RT-patches的改进,我问有什么Benefits,回复很简单,就是
"Better User Experience",除了timer之外的每个IRQ都有单独的内核线程执行,实时的内核用起来就是非常流畅,桌面开上数百个应用程序也不会互相影响导致有停顿的现象,只要内存足够给这些应用程序;

JamesBottomley和JonathanCorbet与两位来自银行的人士在交流,你认出来了吗?


不过太困了,不到7点结束,我就返回了.

Tuesday, September 30, 2008

再说find action,提高终端下的工作效率

再说find的action,是个很有用的工具,

对于查看目录下的所有文件,普通人常用的是ls,不带任何参数的ls,碰到有子目录的情况,就cd到子目录里面,进去只为敲个ls,再又cd回来,因为当前还是主要工作目录,需要查看哪个目录时就cd到哪儿去;进阶一点的人会用ls后接目录参数,可是ls还是只能列出一个目录,对于需要同时查看多个目录的情况可以用"ls -R",可是它只列出了文件名,没有全路径,对于下一步的最大可能是cat或调用编辑器,有了全路径才是最有用的;

试试这个: "find -ls"

一次将目录下所有文件都以ls方式列表出来,可以是递归的方式看到所有文件的"ls -l"方式的结果,并且有了全路径,可以用鼠标双击全选中,再敲中键(就是鼠标滚轮)便会粘贴出来,C-A定位光标到达行首,加上个cat或者vim,阅读或者是编辑,一切操作都是连贯的;

在Shell应用中,对/proc/sys/或/sys/下的查看常常既有列表还需要阅读变量内容,以前的做法是:

find /proc/sys/vm -type f -ls -exec cat {} \;

或者需要监视这个变量值的变化情况,加上个watch,每隔1s重读一次:

watch -n1 'find /proc/sys/vm -type f -printf "%p\t" -exec cat {} \;'

find是一个简单而强大的工具,绝不只是如名称一般只有"查找"文件的功用,它的参数有两个基本类型:


  1. test是一个条件判断,如查按文件名查找使用"-name ...";

  2. action是对找到的文件的一个动作,如缺省的-print是打印全路径名,-ls是模拟ls方式列表;



缺省的action只有ls,printf等,(printf另有强大的功能),而-exec扩展方式可以后接程序执行,如上面的-exec cat读出文件内容,

但是-exec cat实在太常用了,今日作了一个patch,在find-4.5.2上面加上-cat这个action,这样上面的监视命令就可以简化为:

find /proc/sys/vm -cat



Download as text

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
---
find/defs.h | 1 +
find/parser.c | 22 ++++++++++++++++++++++
find/pred.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
find/tree.c | 1 +
4 files changed, 76 insertions(+)

Index: findutils-4.5.2/find/defs.h
===================================================================
--- findutils-4.5.2.orig/find/defs.h
+++ findutils-4.5.2/find/defs.h
@@ -411,6 +411,7 @@ PREDICATEFUNCTION pred_cnewer;
PREDICATEFUNCTION pred_comma;
PREDICATEFUNCTION pred_ctime;
PREDICATEFUNCTION pred_delete;
+PREDICATEFUNCTION pred_cat;
PREDICATEFUNCTION pred_empty;
PREDICATEFUNCTION pred_exec;
PREDICATEFUNCTION pred_execdir;
Index: findutils-4.5.2/find/parser.c
===================================================================
--- findutils-4.5.2.orig/find/parser.c
+++ findutils-4.5.2/find/parser.c
@@ -91,6 +91,7 @@ static boolean parse_cnewer PARAM
static boolean parse_comma PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_daystart PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_delete PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+static boolean parse_cat PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_d PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_depth PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_empty PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
@@ -253,6 +254,7 @@ static struct parser_table const parse_t
{ARG_TEST, "ctime", parse_time, pred_ctime}, /* POSIX */
PARSE_POSOPT ("daystart", daystart), /* GNU */
PARSE_ACTION ("delete", delete), /* GNU, Mac OS, FreeBSD */
+ PARSE_ACTION ("cat", cat), /* GNU */
PARSE_OPTION ("d", d), /* Mac OS X, FreeBSD, NetBSD, OpenBSD, but deprecated in favour of -depth */
PARSE_OPTION ("depth", depth), /* POSIX */
PARSE_TEST ("empty", empty), /* GNU */
@@ -801,6 +803,26 @@ parse_delete (const struct parser_table*
}

static boolean
+parse_cat (const struct parser_table* entry, char *argv[], int *arg_ptr)
+{
+ struct predicate *our_pred;
+ (void) argv;
+ (void) arg_ptr;
+
+ our_pred = insert_primary (entry);
+ our_pred->side_effects = our_pred->no_default_print = true;
+ our_pred->need_stat = our_pred->need_type = false;
+ our_pred->est_success_rate = 1.0f;
+ open_stdout(&our_pred->args.printf_vec);
+
+#ifdef DEBUG
+ fprintf(stderr, "%s(%s:%d) called.\n", __func__, __FILE__, __LINE__);
+#endif
+
+ return true;
+}
+
+static boolean
parse_depth (const struct parser_table* entry, char **argv, int *arg_ptr)
{
(void) entry;
Index: findutils-4.5.2/find/pred.c
===================================================================
--- findutils-4.5.2.orig/find/pred.c
+++ findutils-4.5.2/find/pred.c
@@ -445,6 +445,58 @@ pred_delete (const char *pathname, struc
}

boolean
+pred_cat (const char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)
+{
+ FILE * stream = pred_ptr->args.printf_vec.stream;
+ FILE * input_stream;
+ char buf[BUFSIZ];
+ int fd;
+ size_t read_len;
+
+ (void) pred_ptr;
+ (void) stat_buf;
+
+#ifdef DEBUG
+ fprintf(stderr, "%s(%s:%d) called.\n", __func__, __FILE__, __LINE__);
+#endif
+
+ if ((fd = openat(state.cwd_dir_fd, state.rel_pathname, O_RDONLY
+#if defined O_LARGEFILE
+ |O_LARGEFILE
+#endif
+ )) <>
+ {
+ error (0, errno, "%s", safely_quote_err_filename(0, pathname));
+ state.exit_status = 1;
+ return false;
+ }
+
+ input_stream = fdopen(fd, "r");
+ if (input_stream == NULL)
+ {
+ error (0, errno, "%s", safely_quote_err_filename(0, pathname));
+ state.exit_status = 1;
+ return false;
+ }
+
+ while ((read_len = fread(buf, 1, sizeof buf, input_stream)) > 0)
+ {
+#ifdef DEBUG
+ fprintf(stderr, "%s(%s:%d): read_len = %d, stream = %p\n",
+ __func__, __FILE__, __LINE__, read_len, stream);
+#endif
+ fwrite(buf, 1, read_len, stream);
+
+ if (read_len <>
+ break;
+ }
+
+ fclose(input_stream);
+
+ return true;
+}
+
+boolean
pred_empty (const char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)
{
(void) pathname;
Index: findutils-4.5.2/find/tree.c
===================================================================
--- findutils-4.5.2.orig/find/tree.c
+++ findutils-4.5.2/find/tree.c
@@ -906,6 +906,7 @@ static struct pred_cost_lookup costlooku
{ pred_comma , NeedsNothing, },
{ pred_ctime , NeedsStatInfo, },
{ pred_delete , NeedsSyncDiskHit },
+ { pred_cat , NeedsNothing },
{ pred_empty , NeedsStatInfo },
{ pred_exec , NeedsEventualExec },
{ pred_execdir , NeedsEventualExec },



Download as text


参看这个帖子来个实用的:查看文件链接,回复find命令的人是我:有人需要一些shell功能,想到了用python去写,想法不错,却没想到的是,那一段的python代码只对应了一行find命令。

Monday, September 22, 2008

KS2008与LPC2008刚结束

著名黑客GregKroahHartman在这个会上对Ubuntu幕后的Canonical公司的不贡献进行了猛烈的批评:

Canonical的内核开发者在过去三年,从2.6.19到2.6.27-rc5之间,只向内核提交了约100个补丁!(与我在过去两年内做的差不多~)

作为对比,Greg也同样列出了各大Distro的数据:

RedHat排名第二,Novell排名第五,Mandriva是第45,Canonical是第81,

而社区发行版中,Debian和Gentoo分别排名第41和第49,

其实,早在上半年JonathonCorbet就以LWN文章提出了对Canonical的批评,但这次Greg的这次更猛烈的批评则是第一次将问题的严重性推向聚光灯下:

  1. Kernel Log: The second day of Kernel Summit 2008; criticism of Ubuntu at the opening of the Linux Plumbers Conference
  2. Linux Plumbers Conference 2008 Keynote

说到这个排名,可能有人对更为神秘的第一名感兴趣,那么,这个神秘的能够超越RedHat的第一名究竟是谁呢?

那就是我们伟大的Amateurs(业余爱好者)!Kernel的发展自始至现在仍然保持着平民化的Amateurs为主导的发展!