一个c语言小技巧,摘自minix fs

我说的小技巧就是最后的那句 err |= minix_sync_inode(inode);

真是懒的可以,Linus真是惜行如jing啊, 前面的错误检测和后面的都一并检查了,不过这里也有一个前提,就是 sync_mapping_buffers错误了,调用minix_sync_inode也不会导致更严重的问题。

学习学习。。。


int minix_sync_file(struct file * file,
struct dentry *dentry, int datasync)
{
struct inode *inode = dentry->d_inode;
int err;
err = sync_mapping_buffers(inode->i_mapping);
if (!(inode->i_state & I_DIRTY))
return err;
if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
return err;

err |= minix_sync_inode(inode);
return err ? -EIO : 0;
}
Posted in 生活 | Tagged , , | Leave a comment

About File system logging

This is a note @MIT OCW 6.824 Lecture 7:

The main point of a log is make complex operations atomic.

I.e. operations that involve many individule writes. You want all writes or none, even if a crash in the middle.

A "transaction" is multi-write operation that should be atomic. The logging system needs to know which set of write from a transication.

Re-do with checkpoint:

Most logs work like this, e.g. FSD,
allows much faster recovery: ca use on-disk data
write-ahead rule:

delay flushing dirty block from in-memory data cache until corresponding commit recore is on disk

Check point rules:

all data writes before check point must be stable on disk checkpoint may not advance beyond first uncommitted Begin

Recovery:

for each block mentioned in the log
find the last xaction that wrote that block
if committed: re-do
if not committed: un-do

Why is logging fast:

group commit -- batched log writes.
could delay flushing log -- may lost committed transactions but at least you have a prefix.

Single seek to implement a transaction.
maybe less if no intervening disk activity, or group commit

Write-behind of data allows batched/schedules.
one data block may reflect many transactions, i.e. create many files in a directory.
don't have to be so careful since the log is the real infomation.

Posted in 算法 | Tagged | Leave a comment

How can we avoid delete/create inconsistency?

This is a file system note: @MIT 6.824 2006 Lecture 6

Think this satiation,

unlink("f1");
create("f2");
Create happens to re-use the i-node freed by the unlink.
suppose only create write goes to disk, but none of the unlink's writes.

Crash.

After re-start, what does recovery see?

The file system looks correct! Nothing to fix!
But file f1 actually has file f2's contents!

Serious *undetected* inconsisency.

This is *not* a state the file system counld have been in if the crash had occured slightly earlier or later. And fsck did not notify the user there was an unfixable problem!

How can we avoid this delete/create inconsistency?

Observation: We only care about what's visible in the file system tree.

Goal: on-disk directory entry must always point to correct on-disk i-node.

Unlink Rule: remove dirent *on disk* before freeing i-node.

Create Rule: initialize new i-node *on disk* before creating directory entry.

In general, directory entry writes should be commit points.
Crash just before leves us with unused allocated i-node.
Crash just after is fine.

Posted in 算法 | Tagged | Leave a comment

real world FIND usage

from http://www.wagoneers.com/UNIX/FIND/find-usage.html

sudo find / -type f -name *.jpg -exec cp {} . \;

find . -type f -size +10000 -exec ls -al {} \;
find . -atime +1 -type f -exec mv {} TMP \; # mv files older then 1 day to dir TMP
find . -name "-F" -exec rm {} \; # a script error created a file called -F
find . -exec grep -i "vds admin" {} \;
find . \! -name "*.Z" -exec compress -f {} \;
find . -type f \! -name "*.Z" \! -name ".comment" -print | tee -a /tmp/list
find . -name *.ini
find . -exec chmod 775 {} \;
find . -user xuser1 -exec chown -R user2 {} \;
find . -name ebtcom*
find . -name mkbook
find . -exec grep PW0 {} \;
find . -exec grep -i "pw0" {} \;
find . -atime +6
find . -atime +6 -exec ll | more
find . -atime +6 -exec ll | more \;
find . -atime +6 -exec ll \;
find . -atime +6 -exec ls \;
find . -atime +30 -exec ls \;
find . -atime +30 -exec ls \; | wc -l
find . -name auth*
find . -exec grep -i plotme10 {};
find . -exec grep -i plotme10 {} \;
find . -ls -exec grep 'PLOT_FORMAT 22' {} \;
find . -print -exec grep 'PLOT_FORMAT 22' {} \;
find . -print -exec grep 'PLOT_FORMAT' {} \;
find . -print -exec grep 'PLOT_FORMAT' {} \;
find ./machbook -exec chown 184 {} \;
find . \! -name '*.Z' -exec compress {} \;
find . \! -name "*.Z" -exec compress -f {} \;
find /raid/03c/ecn -xdev -type f -print
find /raid/03c/ecn -xdev -path -type f -print
find / -name .ssh* -print | tee -a ssh-stuff
find . -name "*font*"
find . -name hpmcad*
find . -name *fnt*
find . -name hp_mcad* -print
find . -grep Pld {} \;
find . -exec grep Pld {} \;
find . -exec grep Pld {} \;
find . -exec grep PENWIDTH {} \; | more
find . -name config.pro
find . -name config.pro
find /raid -type d ".local_sd_customize" -print
find /raid -type d -name ".local_sd_customize" -print
find /raid -type d -name ".local_sd_customize" -ok cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;
find /raid -type d -name ".local_sd_customize" -exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;
find . -name xeroxrelease
find . -exec grep xeroxrelease {} \;
find . -name xeroxrelease
find . -name xeroxrelease* -print 2>/dev/null
find . -name "*release*" 2>/dev/null
find / -name "*xerox*" 2>/dev/null
find . -exec grep -i xeroxrelease {} \;
find . -print -exec grep -i xeroxrelease {} \;
find . -print -exec grep -i xeroxrelease {} \; > xeroxrel.lis
find . -exec grep -i xeroxrel {} \;
find . -print -exec grep -i xeroxrel {} \;
find . -print -exec grep -i xeroxrel {} \; | more
find /raid/03c/inwork -xdev -type f -print >> /raid/04d/user_scripts/prt_list.tmp
find . -exec grep '31.53' {} \;
find . -ls -exec grep "31/.53" {} \; > this.lis
find . -print -exec grep "31/.53" {} \; > this.lis
find . -print -exec grep 31.53 {} \; > this.lis
find . -exec grep -i pen {} /;
find . -exec grep -i pen {} \;
find . -print -exec grep -i pen {} \; | more
find . -exec grep -i pen {} \;
find . -atime +6 -exec ll | more \;
find . -atime +6 -exec ll \;
find . -atime +6 -exec ls \;
find . -atime +30 -exec ls \;
find . -atime +30 -exec ls \; | wc -l
find . \! -name '*.Z' -exec compress -f {} \;
find . -name 'cache*' -depth -exec rm {} \;
find . -name 'cache*' -depth -print | tee -a /tmp/cachefiles
find . -name 'cache[0-9][0-9]*' -depth -print | tee -a /tmp/cachefiles
find . -name 'hp_catfile' 'hp_catlock' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_catfile' -name 'hp_catlock' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_cat*' -depth -print | tee -a /tmp/hp.cats
find . -name 'hp_cat[fl]*' -depth -print | tee -a /tmp/hp.cats
find /raid -name 'hp_cat[fl]*' -depth -print
find . \! -name '*.Z' -exec compress -f {} \;
find . -name '*' -exec compress -f {} \;
find . -xdev -name "wshp1*" -print
find . -xdev -name "wagoneer*" -print
find . -name "xcmd" -depth -print
find /usr/contrib/src -name "xcmd" -depth -print
find /raid -type d -name ".local_sd_customize" -exec ls {} \;
find /raid -type d -name ".local_sd_customize" \
-exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;

Posted in 生活 | Leave a comment

All about container_of

对一个这个宏的不理解导致了几个晚上的熬夜。写代码的时候一定不能迷糊阿!

这个是Linux kernel里面的宏, 作用大概如下, 现在你有一个

struct big{
struct small sname_in_big;
int some_else
};
struct small{}

然后有一个函数, 传入参数只有一个*small, 比如

void some_func(struct small *s);

在这个函数里面, 你想作这么一件事情, 想得到那个int some_else的值是多少, 而你的函数只有一个struct small* 的参数, 所以kernel里面就有这么一个函数可以帮你获得 struct big的指针。
就是container_of
在这个函数里面可以这样用:

 void some_func(struct small *s) {
struct big *b;
b = container_of (s, struct big, sname_in_big);
}

不过, 还有一个更重要的前提。 就是, 这个函数的参数的这个s,必须是struct big的一部分。 也就是说, 必须有这样一个步骤, struct big a; a.sname_in_big = some_small.
some_func(&a.sname_in_big);
才可以找到big的正确的地址。

这里的解释更详细:

http://www.kroah.com/log/linux/container_of.html

Posted in 生活 | 1 Comment

一个世纪前《纽约时报》对李鸿章的采访

一个世纪前《纽约时报》对李鸿章的采访

---------- Forwarded message ----------
From:
tombkeeper的和谐Blog

via hi.baidu.com on 9/23/09
一个世纪前《纽约时报》对李鸿章的采访
2009-09-24 08:58

离开在欧洲考察访问的最后一站英国后,大清帝国前直隶总督兼北洋大臣李鸿章乘"圣-路易斯"号邮轮于当地时间
1896年8月28日抵达美国纽约,开始对美国进行访问。李鸿章在美国受到了美国总统克利夫兰的接见,并和美国一些要员及群众见面,受到了"史无前例的礼遇"(《纽约时报》)。9月2日上午9时许,李鸿章在纽约华尔道夫饭店接受了记者的采访。

●美国记者:尊敬的阁下,您已经谈了我们很多事情,您能否告诉我们,什么是您认为我们做得不好的事的呢?

●李鸿章:我不想批评美国,我对美国政府给予我的接待毫无怨言,这些都是我所期待的。只是一件事让我吃惊或失望,那就是你们国家有形形色色的政党存在,而我只对其中一部分有所了解。其他政党会不会使国家出现混乱呢?你们的报纸能不能靠国家利益将各个政党联合起来呢?

●美国记者:那么阁下,您在这个国家的所见所闻中什么最使您最感兴趣呢?

●李鸿章:我对我在 美国见到的一切都很喜欢,所有事情都让我高兴。最使我感到惊讶的是20层或更高一些的摩天大楼,我在中国和欧洲从没见过这种高楼。这些楼看起来建得很牢
固,能抗任何狂风吧?但中国不能建这么高的楼房,因台风会很快把它吹倒,而且高层建筑若没有你们这样好的电梯配套也很不方便。

●美国记者:阁下,您赞成贵国的普通百姓都接受教育吗?

●李鸿章:我们的习惯是送所有男孩上学。我们有很好的学校,但只得付得起学费的富家子弟才能上学,穷人家的孩子没有机会上学。但是,我们现在还没有你们这么多的学校和学堂,我们计划将来在国内建立更多的学校。

●美国记者:阁下,您赞成妇女接受教育吗?

●李鸿章(停顿一会 儿):在我们清国,女孩在家中请女教师提供教育,所有有经济能力的家庭都会雇请女家庭教师。我们现在还没有女子就读的公立学校,也没有更高一级的教育机
构。这是由于我们的风俗习惯与你们(包括欧洲和美国)不同,也许我们应该学习你们的教育制度,并将最适合我们国情的那种引入国内,这确是我们所需要的。

●记者:总督阁下,您期待对现存的排华法案进行任何修改吗?

●李鸿章:我知道, 你们又将进行选举了,新政府必然会在施政上有些变化。因此,我不敢在修改法案前发表任何要求废除《格利法》的言帘卷西风论,我只是期望美国新闻界能助清国移民一臂
之力。我知道报纸在这个国家有很大的影响力,希望整个报界都能帮助清国侨民,呼吁废除排华法案,或至少对《格利法》进行较大修改。

●美国记者:阁下,您能说明选择经加拿大而非美国西部回国路线的理由吗?是不是您的同胞在我国西部一些地区没有受到善待?

●李鸿章:我有两个原因不愿经过美国西部各州。

第一,当我在清国北方港口城市担任高半夜凉初透官时,听到了很多加州清国侨民的抱怨。这些抱怨表明,清国人在那里未能获得
美国宪有暗香盈袖法赋予他们的权利,他们请求我帮助他们使他们的美国移民身份得到完全承认,并享受作为美国移民所应享有的权利。而你们的《格利法》不但不给予他们与
其他国家移民同等的权利,还拒绝保障他们合法的权益,因此我不希望经过以这种方式对待我同胞的地方,也不打算接受当地华人代表递交的要求保证他们在西部各
州权益的请愿信。

第二,当我还是一名优秀的水手时,就知道必须学会自己照顾自己。我比别人年纪要大好多岁,从温哥华回国的航程要比从旧金山出发更短些。我现在才知道,清国"皇后号"船体宽阔舒适,在太平洋的所有港口都难以找到如此之好的远洋客船。

排华法案是世界上最不公平的法案。所有的政治经济学家都承认,竞争促使全世界的市场迸发活力,而竞争既适用于商
品也适用于劳动力。我们知道,《格利法》是由于受到爱尔兰裔移民欲独霸加州劳工市场的影响,因为清国人是他们很强的竞争对手,所以他们想排除华人。如果我
们清国也抵东篱把酒黄昏后制你们的产品,拒绝购买美国商品,取消你们的产品销往清国的特许权,试问你们将作何感想呢?不要把我当成清国什么高半夜凉初透官,而要当成一名国际主义
者,不要把我当成达官贵人,而要当作清国或世界其他国家一名普通公民。请让我问问,你们把廉价的华人劳工逐出美国究竟能获得什么呢?廉价劳工意味着更便宜
的商品,顾客以低廉价格就能买到高质量的商品。

你们不是很为你们作为美国人自豪吗?你们的国家代表着世界上最高的现代文明,你们因你们的民瑞脑消金兽主和自由而自豪,但
你们的排华法案对华人来说是自由的吗?这不是自由!因为你们禁止使用廉价劳工生产的产品,不让他们在农场干活。你们专利局的统计数据表明,你们是世界上最
有创造力的人,你们发明的东西比任何其他国家的总和都多。在这方面,你们走在了欧洲的前面。因为你们不限制你们在制造业方面的发展,搞农业的人不限于搞农
业,他们还将农业、商业和工业结合了起来。你们不象英国,他们只是世界的作坊。你们致力于一切进步和发展的事业。在工艺技术和产品质量方面,你们也领先于
欧洲国家。但不幸的是,你们还竞争不过欧洲,因为你们的产品比他们的贵。这都是因为你们的劳动力太贵,以致生产的产品因价格太高而不能成功地与欧洲国家竞
争。劳动力太贵,是因为你们排除华工。这是你们的失误。如果让劳动力自由竞争,你们就能够获得廉价的劳力。华人比爱尔兰人和美国其他劳动阶半夜凉初透级都更勤俭,所
以其他族裔的劳工仇视华人。

我相信美国报界能帮助华人一臂之力,一取消排华法案。

●美国记者:美国资本在清国投资有什么出路吗?

●李鸿章:只有将货币、劳动力和土地都有机地结合起来,才会产生财富。清国政府非常高兴地欢迎任何资本到我国投资。我的好朋友格兰特将军曾对我说,你们必须要求欧美资本进入
清国以建立现代化的工业企业,帮助清国人民开发利用本国丰富的自然资源。但这些企业的管理权应掌握在清国政府手中。我们欢迎你们来华投资,资金和技工由你
们提供。但是,对于铁路、电讯等事物,要由我们自己控制。我们必须保护国家主权,不允许任何人危及我们的神圣权力。我将牢记格兰特将军的遗训,所有资本,
无论是美国的还是欧洲的,都可以自由来华投资。

●美国记者:阁下,您赞成将美国的或欧洲的报纸介绍到贵国吗?

●李鸿章:中国办有 报纸,但遗憾的是中国的编辑们不愿将真莫道不消魂相告诉读者,他们不像你们的报纸讲真话,只讲真话。中国的编辑们在讲真话的时候十分吝啬,他们只讲部分的真实,而且
他们的报纸也没有你们报纸这么大的发行量。由于不能诚实地说明真莫道不消魂相,我们的报纸就失去了新闻本身的高贵价值,也就未能成为广泛传播文明的方式了。
________________________________
一个世纪,对个人来说差不多就是永远;而对人类社会的巨大惯性来说,百年时间所提供的摩擦力又是多么有限。
类别:网文收集 copy and paste 浏览(171) 评论 (3)

网友评论:
1
网友:underclass.h
2009-09-24 09:42 回复
我 只是以非常中立观点发表这个评论,其实末代中兴大臣,都有缺一个领袖.胡东篱把酒黄昏后适曾指出:中国形成一个领袖不容易,如果因张学良出现不幸,中国将倒退20年, 是"国家民族之罪人".不过这的确成就另一个领袖,只是,一将功成万骨枯,正好你所说,摩擦力是有限的,要改变的终究改变了,现在不比以往的时代差.

Posted in 生活 | Leave a comment

Google Picasa访问浏览的另类方法

[转自 http://www.hzhjun.cn/post/googlePicasa.html]

关于gg被和谐的事,相信很多人都晓得,但受祸的不止是gg,还有其用户。

前段时间突然找不到右上角的登录链接,着实郁闷了下,虽然我不常登录,但需要的时候却没了,后来才知道进入其他频道是可以登录的;再就是Picasa网络相册,前脚上传了照片,紧接着就不让看,莫名其妙的打不开链接。。。

好在网络上传出了一种方法,通过配置Hosts可以在本地查看,操作如下:

在C:\WINDOWS\system32\drivers\etc找到hosts文件,将下面内容复制粘贴:

203.208.39.104 picadaweb.google.com
203.208.39.104 lh1.ggpht.com
203.208.39.104 lh2.ggpht.com
203.208.39.104 lh3.ggpht.com
203.208.39.104 lh4.ggpht.com
203.208.39.104 lh5.ggpht.com
203.208.39.104 lh6.ggpht.com

保存后即可正常使用,不过只能在本地访问;欲知效果如何,那就赶快动手一试。。。

Posted in 生活 | Leave a comment

有一个误传甚广的故事

by Akkad on 07/09/09

有一个流传甚广的故事: 美国航天部门首次准备将宇航员送上太空,但他们很快接到报告,宇航员在失重状态下用圆珠笔、钢笔根本写不出字来。于是,他们用了10年时间,花费120亿 美圆,科学家们终于发明了一种新型圆珠笔。这种笔适用于失重状态、身体倒立、水中、任何平面物体,甚至在摄氏零下300度也能书写流利。 而俄罗斯人在太空中一直使用铅笔。”

这个故事想告诉人们,有时看上去很复杂的问题,其实有极简单的现成解决办法。这当然是很有教育意义的,可惜它是捏造出来的。总结一下这个故事的错误:
1,美国宇航员也用过铅笔。
2,铅笔并不适合太空中使用,尖头有危险,易燃,书写产生的石墨残渣容易进入宇航员的胸腔、眼睛,更容易使电子设备短路(石墨是良导体)。
3,太空笔是一家私人企业发明的,据说耗资一百多万美元。
4,这种太空笔不但能在失重的情况下使用,还能在极端温度下使用。
5,失重笔不但想出了用氮气产生压力,而且还改革了油墨和笔尖,使得这种笔不写的时候不漏油。
6,太空笔发明出来以后,无论是美国宇航局还是俄罗斯宇航局都购买了。
7,找不到零下300摄氏度这样的环境(开尔文0度达不到-300摄氏度),这个杜撰的故事本身就有科学错误。

早期的宇航员都使用铅笔,并不是因为接受了小学生的建议,而是因为钢笔、圆珠笔在失重条件下都无法使用,铅笔是惟一的选择。但是铅笔笔芯有时候会断,在失 重的环境中飘浮,会飘进鼻子、眼睛中,或飘进电器中引起短路,成了危险品。此外,铅笔的笔芯和木头在纯氧的环境中还会极易燃烧。 因发明了圆珠笔通用笔芯而发了大财的保罗·费舍尔,意识到宇航员使用安全、可靠的书写工具的迫切性,自掏腰包进行研制,花了两年时间和约两百万元费用后, 于1965年研制成了能在太空环境下使用的圆珠笔———太空笔。其原理很简单,采用密封式气压笔芯,上部充有氮气(氮气是不活跃气体,一般条件下不会助 燃),靠气体压力把油墨推向笔尖。经过严格的测试后,太空笔被美国宇航局采用。1967年12月,费舍尔以每枝2.95美元的价格把400枝太空笔卖给美 国宇航局。 1969年7月20日,太空笔跟随阿姆斯特朗和奥尔德林上了月球,并救了他们的命。阿姆斯特朗和奥尔德林在月球表面完成历史性漫步,回到登月舱准备离开 时,发现发动机的塑料手动开关被宇航服的背囊碰断,无法启动发动机向地面指挥中心求援。他们需要拨动开关中一个细小的金属条,为了减轻重量,他们已抛弃了 所有的工具。地面指挥中心的一名工程师灵机一动,建议他们用太空笔试试。奥尔德林掏出太空笔,缩回笔芯,用笔的中空尾端拨动了开关,成功地启动了登月舱的 发动机。 太空笔是全天候的圆珠笔,除了太空环境,还可在其他各种极端恶劣(如寒冷的高山上和深海底)的条件下使用,如油污、潮湿、粗糙、光滑的表面,并适用于各种 角度书写,使用寿命长达几十年,深受登山运动员、户外活动者、技工、士兵、警薄雾浓云愁永昼察的欢迎。目前在美国市场上8美元即可买到一枝最简单的费舍尔太空笔。

奇怪的是这个富有传奇色彩的太空笔却成了谣言的对象,备受嘲笑,成了愚蠢的象征。有人说美国人花巨资开发太空笔完全没有必要,不如像前苏联宇航员那样简单 地使用铅笔(实际上,前苏联宇航员后来也改用费舍尔太空笔)。还有人干脆说太空笔从来就没有研制出来过。直到最近,还有人在学术会议上把这个谣言进行添油 加醋,开发费用被他们夸大了5000倍: “‘为了研究在太空环境下圆珠笔能出水,竟使科学家花费了100亿美元,终了却毫无结果。最后得知,铅笔在太空环境下就能写出字。’11月3日,在中国农 业大学召开的‘2004年全国农林研究生教育发展论坛’上,一位专家将这则黑色幽默娓娓道来,各大学领佳节又重阳导和专家对‘研究要切合实际,尤其是以前沿研究为主 的研究生教育更是如此’的观点表示认同。”(《中国农大研究生教育创新性“学科群落”质高多产》,《中国教育报》2004年11月7日第1版) 《光明日报》也刊登过“美国科学家花费巨资研究太空笔居然没想到用铅笔”这样的笑话。 费舍尔太空笔中国市场上也买得到,叫“飞梭太空笔”,许多城市的百货大楼、礼品店均有销售,与会专家竟然没有一个人见过、听说过?“研究要切合实际”,说 得一点也不错,首先就要从自己做起。

Posted in design | 1 Comment

和谐的VirtualBox

混合

ubuntu, emacs,git, win xp, IE7, firefox, 飞信, 注意到这个截图里面有win的部分, 有ubuntu的部分, 并且是几乎无缝的, 这就是~~ 来自sun的VirtualBox 虚拟机, 真是太人性化了, 效率很好, 比KVM要高的多, 可惜了sun阿。可怜的sun阿。。。

Win下的google输入法是我最留恋的。 :D

最近这几天给team里面搭了svn, 因为svn 可以控制权限, 谁知道上司就把权限想的很死, 结果那个authz文件都快到100行了, SCM又不熟悉, 经常犯了错误就把我拉出来了。 真是手里拿着锤子,看什么都像钉子阿。。。

最近的生活很单调。

Posted in emacs, ubuntu | 1 Comment

Feel sad

Today is a sad day.

The someone  doesn't speak any words to me, I don't know what should  do.

And, with my stupid hand, I broken my new gotted develope Ben nanobook.

It's a sad day really.

Hope tomorrow is better.

Posted in 日常琐事 | Leave a comment