Archive

Archive for May, 2007

[Linux]如果管道被接受方关闭

May 30th, 2007 Fwolf 2 comments

linux shell中的管道|是非常方便的功能,可以将一个程序的输出作为另外一个程序的输入,这样我们可以将多个命令“拼”在一起,省去了临时文件的繁琐。windows中也有类似的用法,比如dir |more,学过dos命令的应该都知道吧。

既然是管道,那么就有一个入口和一个出口,各自对应一个应用程序,正常的情况下,入口应用程序的输出应当被出口应用程序全部接受,但在一些特殊情况,出口应用程序会提前关闭管道,比如在查询svn的更新日志,只取前己行的时候:

$ svn log |head
------------------------------------------------------------------------
r137 | Fwolf | 2007-05-28 13:38:47 +0800 (Mon, 28 May 2007) | 4 lines

更新记录。。。

svn: Write error: Broken pipe

由于head只需要用到输入的前10行(默认行数,也可由用户指定),再接收剩下的输出也是多余,便提前关闭了管道,管道入口的应用程序svn发现之后,便报错退出了。在这个例子中,错误信息非常清楚,但不是所有应用程序都这样的,比如下面这个:

$ find . -name "*rc" |xargs -i cat {}|head -1
[Desktop]
xargs: cat: terminated by signal 13

错误信息似乎并不太好理解,实际上它的意思是:xargs发现它的子进程cat由于信号13被中止了。由于xargs本身属于循环操作,发现错误之后就停止了循环,这是其一;信号13是在cat试图向一个已关闭的pipe管道中写数据的时候,系统产生的,cat收到之后就停止了。类似于在cat输出的过程中,用户按下ctrl+c的效果。

如何避免这种问题呢?很简单,管道后面使用不会提前关闭管道的程序即可,尤其是结合xargs使用的时候,它发现出错就不继续了。比如要用到head可以这样:

$ cat file |head -1

虽然cat仍然会被signal 13关闭,但bash是不会报错的,所以也只能针对一个文件进行操作,即使是使用了通配符也只能head到第一个文件。如果要加上对文件的遍历,可以用到for:

$for file in .*rc;do cat $file |head -1;done

cat依然会被关闭,但是for不会理会它,继续循环。head也可以直接指定文件名,这样我们就可以抛开cat了:

$find . -name "*rc" |xargs -i head -n1 {}

个人认为这是一种最完美的解决方式,即可以用到find强大的搜索指令,还不会涉及到管道的问题。不过如果文件名没有什么特殊要求,还有一种更简单的方式:

$head -n1 .*rc

在head的参数中直接用通配符指定文件,呵呵。

参考:

Related posts

Categories: Linux Tags:

blog如何赚钱?

May 26th, 2007 Fwolf 1 comment

本来赚钱和盈利是两个概念,赚到钱了不一定就能够盈利,而盈利不见得就只有赚钱这一种方式。可是高调唱完了,blogger们还是会回到原点:从哪里补贴服务器费用?从哪里补贴所花费的时间和精力?写blog难道就只是一种娱乐么?难道除了自娱自乐或者是写写枪文,就没有其他方式么?

虽然keso比较反感付费话题,代表了一部分人的观点,可是别忘记了那后半句话“没有钱是万万不能的”,本来我们的口粮就不多,理想化的东西恐怕都要打折销售了。

原来的reviewme没赶上,现在的feedsky也没兴趣,倒是这个 Bloggerwave算是我的第一把,虽然没有太多特色,目前的赞助机会也比较少,但是要求不高,形式也简单,最方便的是直接付款到paypal,10块美刀好歹也够一个域名一年的费用了,干嘛不试试呢?

另外付费评论如何“写”也是个值得研究的话题,让你写什么就写什么那太笨了,但如果让你写产品,你就来个横向评测,让你写网站你就写写相关现象,我想不但起到了宣传的作用,对blog文章质量的影响也会减少一些。当然如果你本来是写IT的blog,非要去宣传谁家的苹果好卖,还是先三思的好。

Related posts

Categories: Blog, Internet Tags:

gnuplot的一些资料

May 21st, 2007 Fwolf 1 comment

从来没有接触过科学计算的东东,不过由于工作需要,想画一套统计图,觉得应该有些开源的好用的工具,于是误打误撞找到了gnuplot,研究了半天,无功而返,但找到了很多有用的资料。

最早是在IBM开发者上了解到有这么个东东的:Linux 上的数据可视化工具,这篇文章同时还提到了GNU Octave。

地圖/統計圖/3d 函數圖/實驗報告圖 — Gnuplot 純畫圖里有使用gnuplot画图的几个例子,包括一个使用数据文件的.

Gnuplot 導讀

https://dirty.csie.org/mt/archives/000355.html,这里还提到了一个叫R的软件,似乎也不错。

GNUPLOT使用手册

在gnuplot里使用中文标注,有人转了一篇在这里,有人回复说“Or simply use the psfrag package.”,也许指的是在tex中的应用吧。相对于gnuplot,其实只要set font "/path_to_your_ttf_file就可以识别中文了。

用 Perl/Tk 实现数据可视化,其中对各类绘图工具有个小的概括:

对于简单的 x-y 平面图,gnuplot 经常是第一选择。对更复杂的问题来说,您可以使用 xmgrace 或者其他的绘制工具。

轻轻松松画柱状图(bar graph),文中提到的bargraph.pl简化了gnuplot的使用,只能生成条形图,可以生成gnuplot、eps、fig、pdf、png等多种格式,不过要使用的话,除了安装gnuplot之外,还需要fig2dev(安装另外一个绘图程序xfig后就有了)。

gnuplot 让您的数据可视化,文中还提到:

gnuplot 与 GNU plotutils组合格外好用;另请参阅 plotutils documentation

另外还看到了一个关于python绘图的讨论:问一下,python有生成饼图,柱状图等的库么,里面有人说pychart画图看起来也不错,可惜我python刚开始接触,也作罢了。

关键是以前从来没有接触过此类东西,加上资料又少,所以要花费大量时间学习才能够完成工作目标,所以我已经决定采用jpgraph,用我更熟悉的php5来作了。顺便给两个jpgraph的入门例子:

Related posts

Categories: Tools Tags:

300 / 300死士 / 300斯巴达勇士

May 21st, 2007 Fwolf No comments

在欣赏这部精彩影片之前,我已经看过它的前辈——上世纪60年代拍摄的The 300 Spartans / 三百斯巴达勇士 / 三百侍卫,相比较之下,我甚至觉得旧版的比新版的要更胜一筹。

为什么会这么说呢?因为新版展示的是神话故事,而旧版演绎的才更“历史”一些。难道不是么?看看影片中的那头狼,国王爬的那座山和神庙中的人,不穿衣服跳舞的占卜女,以及后来的波斯王和他的手下,通片看下来,除了眼球大呼过瘾之外,大脑中回想的仍然是旧版300讲述的故事。

片子的摄影令人叫绝,不仅仅是因为有优秀的编剧和改编自同样风格的漫画而已,我感觉,这部电影的大部分镜头,暂停,截图,就是一部讲述史诗的油画,加上后面的战斗场面,静态美+动态美+暴力美的天合之作。所以,比Troy / 木马屠城 / 特洛伊更像史诗,不像历史。

片中的壮汉,同时也是某人口中的“肉饼”,很养眼吧,但从另外一个角度上来分析,更显得不够真实。稍微有一些健美知识的人都知道,即使是奥林匹亚先生,非比赛的时候也是会略微看起来有点“胖”的,因为平时人体需要一定比例的脂肪来维持代谢,否则一饿就会昏过去,只有在要比赛的时候,才按计划减去脂肪,同时在比赛是全身涂上一种油,收缩脂肪,好露出肌肉的轮廓。另外,战士需要的是力量、技巧和耐力,真正优秀的战士能够领到健美冠军的不多。抛开肌肉男不说,人手一矛一盾一短剑一披风基本裸体的“装备”情况下,粮草在哪里?辎重在哪里?国王还能变出个苹果来,难道平时是挂在腰上么?长矛扔出去了,捡不回来怎么办?所以,壮汉只是为了更美观或者吸引更多的女性观众进影院的招牌而已。

再来说战术吧,片中斯巴达人大概用到了几种阵形:方阵、龟壳、楔型,但为了影片的视觉效果,真正表现阵形作用的镜头并不多,方阵阻挡了波斯人的冲锋,龟壳防弓箭,楔型对付骑兵,但更多的镜头是描写混战的,并不成阵形的斯巴达英雄在大刀阔斧的斩杀波斯人。如果你看过Alexander / 亚历山大大帝或者玩过游戏“罗马:全面战争”,就会知道真正的“阵”是什么样子的了。这一点在旧版300里体现的要更完善一些,至今我还记得斯巴达人对付波斯骑兵的镜头,不是用楔型阵,而是已盾盖身卧在地上,骑兵骑的马是有眼睛的动物,不会轻易踩人,就跳过去了,然后斯巴达人在起来迅速恢复队形阻拦后面的步兵,而身后失去速度优势的骑兵自然是长矛美餐。要知道那时候没有马蹬,骑兵的数量不仅少,而且作用仅仅是冲乱敌人的阵形而已。

最大的败笔,或者说是遗憾,就是对整个战役的前后背景作详细交待,不了解历史的观众只会知道,波斯敌人来了,议会不出兵,国王带着300号人就去了,然后战死,他们的精神极大得鼓舞了后来的士兵们。。。写史书的人知道了一定气得吐血,不过人家电影是要赚钱的嘛,并且名字是“300”而不是“温泉关战役”,要求就宽松些吧。

说了半天,好像一直在泼冷水,其实这部电影真的很好看的,其中或许就有抛弃了太多束缚的因素,我只是想让我们大呼过瘾之后,再仔细的思考一下,毕竟我们要永远记住的不是不死的神,而是会流血会牺牲的勇士、英雄。

在这个泛娱乐化的时代,如果只知道满足眼睛的欲望,恐怕Idiocracy / 蠢蛋进化论里讲述的那一天也不远了。

另外这么好的电影大陆不引进真是遗憾,不知道那帮人是怎么想的,同样血腥暴力的Troy / 木马屠城 / 特洛伊和魔戒等电影不都引进了么?不过也无所谓,会进电影院看电影的人有几个不会买D碟的?

Related posts

Categories: Movie Tags:

Rox-filer与linux回收站

May 19th, 2007 Fwolf 3 comments

使用环境:Ubuntu 7.04

Gnome自带的Nautilus,典型属于大而全的东西,而Xfce里面默认的Thunar要好一些,两者都有莫名其妙被关闭的经历,并且回收站还不在一个地方,Nautilus删除文件会移动到相应磁盘下的.Trash-用户名或者用户的$HOME/.Trash目录,而Thunar会把删除的文件移动到~/.local/share/Trash$目录下,还用files和info两个目录分别保存文件和信息。两个我都不太喜欢,决定换用小巧灵活的Rox-filer,唯一遗憾的是放弃了左边目录树的查看功能。

Rox不仅启动速度快,占用资源小,它的定制功能、文件选定等功能也非常灵活,比如Ubuntu中文 论坛eexpress提供的那个“选定文件按照目录名打包”脚本放在SendTo里面就非常好用,还有选定文件之后用Shift+!输入mv "$@" somewhere命令移动文件也是个非常不错的折衷方法。对于samfs和usb设备支持差了点,不过可以用Bookmark或者Ctrl+1(红警的编队快捷键)来弥补。

但是和Nautilus和Thunar相比,Rox除了缺少目录树之外,还没有回收站的功能,这年月谁能保证不删错一个文件啊,ext3分区的文件恢复又相对麻烦,怎么办?用libtrash喽,和Rox一样都在Ubuntu的源中可以直接安装,我当前使用的版本是2.4-1。

libtrash和其他的回收站处理不同,他直接作用于linux的底层,相当于是在libc上挂了一个钩子(hook),凡是系统要进行删除文件操作的时候,不管是用rm命令,还是php的unlink函数,都会用到底层的libc,也就逃不过libtrash的掌控,所以说使用起来非常放心、省心。

也正由于libtrash的底层性,所以最好不要启用root用户的回收站功能,因为root对系统的管理要涉及到很多文件修改,如果被libtrash拒绝将会导致无法预知的结果,所以,默认的配置文件/etc/libtrash.conf不要动,复制一份为$HOME/.libtrash,作用用户级的配置文件来使用,默认设置已经比较好用了,不过我还是按照自己的习惯修改了几个地方:

#TRASH_CAN = Trash
# 和Ubuntu默认回收站目录保持一致
TRASH_CAN = .Trash

#IGNORE_EXTENSIONS = o;log;aux
# Log文件还是要保留的
IGNORE_EXTENSIONS = o;aux

#TEMPORARY_DIRS = /tmp;/var
# /var目录下的日志文件也要保护起来
TEMPORARY_DIRS = /tmp

libtrash是通过LD_PRELOAD机制来启用的,所以需要修改.bashrc作相应的设置:

# libtrash setting
export LD_PRELOAD=/usr/lib/libtrash/libtrash.so.2.4
alias TrashOn='export TRASH_OFF=NO'
alias TrashOff='export TRASH_OFF=YES'
TrashOn

真正起作用的是第一句export,设置了这个环境变量之后,才真正的把钩子“挂上”,后面的alias是设置方便的开关命令,想像一下当你清空移动硬盘上的电影的时候,$HOME被塞满到爆的情况吧,这时候也许就要临时关闭回收站功能了,设置了TRASH_OFF=YES之后,删除的文件不会再被移动到回收站,而是真正的被系统删除。

除了TrashOff之外,配合Rox的SendTo机制,也许更方便一些,在~/.config/rox.sourceforge.net/SendTo目录创建一个脚本trm-Truely_Remove

#! /bin/bash
# 暂时关闭libtrash,永久删除指定文件

export TRASH_OFF=YES

# 遍历指定的文件进行处理
for I in "$@"
do
        rm -rf $I
done

export TRASH_OFF=NO

这样再有想直接删除的文件,在Rox中选定然后用Send to发送到这个脚本进行处理就可以了,不过一定要确定是真正不要了的文件哦。

还剩下唯一一个缺点,就是libtrash只能指定一个回收站目录,一般是在用户的HOME目录下,如果需要管理的文件不在$HOME下的比较多,比如我习惯使用的/big1, /big2等等,删除后的文件就全都存到$HOME这里来了,即使他们不在一个分区,而不是像Naulius那样每个分区一个回收站目录。所以回收站里的数据会增长的很快,不过也有办法解决,单独给这个目录分配一个分区喽,还不用考虑磁盘碎片的问题。

参考:

update @ 2007-05-19

按照上面的设置,从命令行启动的rox能够正常写入回收站,但从Xfce菜单上启动的就不行了,原因未知,不过可以自己写一个脚本中转一下:

#!/bin/bash
export LD_PRELOAD=/usr/lib/libtrash/libtrash.so.2.4
/usr/bin/rox

在默认的设置中,.Trash目录是受保护的,不管是用shell还是用rox进入这个目录,文件都无法删除,但是可以用上面讲到的那个SendTo...脚本来完成,这样反而觉得更安全些了呢。

Related posts

Categories: Linux, Tools Tags: