2010年 01月 的归档
最近
最近,也快有半个月没有更新博客了,为了证明我还存在于这个网络世界里,也得出来冒个泡了。
那到底这半个月我干嘛去了呢?其实,最近我请了婚假,一来是要完成老家的喜酒;二来是为了好好休息休息,度个蜜月。
所以,从1.14开始,我就回到老家了,发现老家在短短半年的时间里,已经变了一个样子了:屋顶盖上瓦了、外墙贴上瓷砖了、围墙重新做过了、墙也重新刷了一遍、大大小小的门也都基本上换掉了。不过,和房子一起变化的还有我爸妈的面容,变得更憔悴了,头上的白发也明显了不少,看得出这段时间他们的辛苦劳作,真的要谢谢他们。
老家的婚宴是在1.16,农历腊月初二,话说这个日子貌似挺好,只在我村里就还有好几对也是这个日子办酒。当天天气也算不错,虽然没有很大的阳光,但是温度不低,老婆穿起婚纱也不觉得非常冷,算是老天给的好礼了吧。这天,很多亲朋好友都来了,大家也都比较尽兴。
接下来几天,我带着老丈人等几人,把我老家附近好玩的地方都转了一圈,每天也跑得比较累,所以,虽然家里也有宽带和wifi,但是也没啥心思上网了,即使上来,也只是东看看西看看,没有静下心来写点东西,呵呵。
然后,到了昨天,就开始了我们的蜜月旅行:昨天早上还在老家,中午赶到杭州,直接去了机场,傍晚就飞到了三亚,真快。发现这边好热好舒服啊,感觉和浙江的夏末秋初的天气差不多(当然,没那么闷),中午大概能到30度,早晚稍微凉快些,空气质量很不错,潮潮的,总觉得有海的气息。
今天,去了一趟天涯海角,感觉还是不错的,捡捡贝壳,在沙滩上随便走走,都觉得很惬意。哦,对了,还发现这边的很多贝壳里面,都有寄居蟹,哈哈,很好玩哦,各种各样不一样的贝壳里,都可能有同一种寄居蟹呢。
明天去哪玩还没想好,恩,为了明天能更有精力,得早点睡了,哈哈。
windows和linux的软件安装过程对比
本文是我看了可能吧的诱导性虚假下载链接不完全评测的一些感想,是写给windows用户的,linuxer请自觉忽略,呵呵。
下面通过一个表格来对比windows和linux的软件安装过程:
linux | windows |
sudo apt-get install XXX 或者 sudo emerge XXX |
搜索: 打开baidu(也许部分是用谷歌的,估计马上也没得用了)?输入XXX,挨个找,找到XX软件站 |
下载: 或许,你已经通过搜索找到了一个软件下载站了,现在,你点开这个站,就会发生诱导性虚假下载链接不完全评测所描述的一幕,你必须凭借你多年的上网经验(说上网经验是好听的,其实就是就是被骗的经验),分辨真假。 |
|
安装: 也许你一不小心就下到病毒了,哦,可能你买了杀毒软件,一扫描,确认无毒。就开始安装了,然后安装过程中的每一步(一般都有很多个“下一步”吧?)你都得小心了,因为可能会有安装XX工具栏的选项隐藏在安装界面,默认勾着,需要你点掉呢。还有其他的陷阱不一一叙述。 |
|
最后,也许你历尽千辛万苦,终于装好了,一打开,却发现是XXX汉化版,试用n天,请输入注册码;或者干脆在使用过程中弹出广告。 |
呵呵,写着写着,发现自己不是写这类评论文章的料,还是算了。不过,本来也不算什么评论,只是我看了那文章的一点点感想而已,希望不要有太多的口水。
自动化下载网盘的文件
今天,我给大家介绍两款自动化的网盘下载工具,用于自动下载Megaupload、Rapidshare等网盘的文件。
首先是有图形界面的FreeRapid,这是采用java编写的,所以可以跨平台使用,而且有比较良好的图形界面和多语言支持,改下设置,就可以出来中文界面,所以使用非常方便,也很容易上手,适合普通用户使用。
而且,FreeRapid还有个好处是支持的网盘网站非常的多,国外的大大小小的网盘站点几乎都能搞定。对各网站的支持还是以插件的形式出现的,也就是说,即使你的网盘站点的下载方式有变化,或者有新的网盘站点出现,FreeRapid也能很轻松地升级,以适应这个变化。事实上,在使用FreeRapid的过程中,也确实经常会看到有插件要更新的。
好了,大致说完了FreeRapid,这个的优点,刚说了,就是易用,因为有GUI嘛,不过,某些时候这样正是它的缺点所在(哲学中,矛盾性的普遍性得到了很好的验证,哈哈。),如果我的机器没有X怎么办呢?呵呵,不用着急,我们还有Plowshare。
Plowshare已经默认包含在了gentoo或者arch的官方源里了,可以直接emerge或者yaourt,但是ubuntu源里,却还未包含,所以使用ubuntu的朋友需要自己下载deb包或者源码进行安装了。
这个的Plowshare比起FreeRapid来,支持的站点稍微少些,不过人家是bash脚本,不用拖个jre也不用X,还是很不错的,而且,它不止支持下载,其实还是支持上传的,哈。
使用起来也不烦,一般情况下只需要
plowdown URL |
就好了,更详细的使用说明──比如支持某些站点的用户名、密码之类的──可以看官方说明。
再说一句,这个也是模块化支持多站点的哦,而且作者还提供API,鼓励大家都去写模块呢。
怎么样,方便吧?
充分利用磁盘空间,打开ext文件系统的保留区块
今天,吼吼来找我说,他的硬盘,有个分区一共有234G,但是只用了222G,就报满了,无法继续使用了。
其实这个问题,我不久前刚看过一下,只要你仔细看 mkfs.ext3 的man page,就可以知道原因了,其中有这么一句:
-m reserved-blocks-percentage Specify the percentage of the filesystem blocks reserved for the super-user. This avoids fragmentation, and allows root-owned daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. The default percentage is 5%. |
也就是说,ext文件系统,包括ext2、ext3、ext4都会默认预留5%的磁盘空间,留给root用户维护系统或者记录系统关键日志的时候使用,这也就是导致普通用户无法使用部分磁盘空间的原因了。
我个人觉得,这个选项用在根分区或者/var之类的分区,还是有一定的必要性的。但是如果是/home、/opt或者干脆是/data之类的数据分区,就显得有点多此一举了。而且,现在的磁盘空间越来越大,5%往往会有10多G,都可以存一部高清了。这么多空间浪费了,是不是太可惜了呢?
于是,就去找相关资料,看能可否在不格式化的情况下改变保留区块的大小。
吼吼找到了这个,比我想像得还要简单,甚至都不需要umount分区,就可以进行修改。
具体操作过程如下,已经加了详细注释:
#之前的保留区有 732463 块 lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count" Reserved block count: 732463 #已用空间+可用空间 和 总空间 相比,还少了近3个G lily@LLY:~$ df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda7 57677500 47662588 7085060 88% /home #调整: lily@LLY:~$ sudo tune2fs -r 25600 /dev/sda7 tune2fs 1.41.9 (22-Aug-2009) Setting reserved blocks count to 25600 #再来看看空间,哈哈 lily@LLY:~$ df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda7 57677500 47662584 9912516 83% /home #确认调整成功 lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count" Reserved block count: 25600 |
看到了吧?就一眨眼的功夫,我就多了3G多的空间,哈哈。而且我还不是直接完全去掉保留区块呢,也留了百多兆以防不时之需呢,呵呵。
算了一下,吼吼那个3.4T的磁盘阵列,省出来的空间居然比我的整个硬盘都大。嗨。。。
用“函数属性”来避免C中格式化字符串时可能存在的错误
为了说明这个问题,先来看下这个简单的C程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <stdarg.h> void writeLogInfo(const char *sFormat, ...){ char sOutBuffer[4196]; va_list lvalist; va_start(lvalist, sFormat); vsnprintf(sOutBuffer, sizeof(sOutBuffer)-2, sFormat, lvalist); va_end(lvalist); printf("log: %s\n", sOutBuffer); } int main(){ writeLogInfo("int=%s", 123); return 0; } |
这程序用gcc编译,即使是用 -Wall 打开所有的警告,也是不会有任何报错的。
但是执行结果是什么呢?由于 writeLogInfo 的是一个参数里指定的是 %s ,而第二个参数确是整型数字 123。所以程序义无反顾地出现了“段错误”而崩溃掉。这种问题在项目代码超过万行以后,要debug起来,也是会浪费很多时间的。
有的人会发现,如果把main里的writeLogInfo直接换成printf,那么在编译的时候,gcc会报一个警告:“警告:格式‘%s’需要类型‘char *’,但实参 2 的类型为‘int’”(Gcc4.x默认就会报,Gcc3.x要加 -Wall 选项才报),如果我们自己的定义的writeLogInfo函数也能有这个警告,那么这种bug将在编译的时候就可以完美解决了。
那么具体怎么实现呢?先来看下面这段代码,功能是和上面的完全一样的,连错误都一样,呵呵:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdarg.h> #ifndef __GNUC__ # define __attribute__(x) /*NOTHING*/ #endif void writeLogInfo(const char *sFormat, ...){ char sOutBuffer[4196]; va_list lvalist; va_start(lvalist, sFormat); vsnprintf(sOutBuffer, sizeof(sOutBuffer)-2, sFormat, lvalist); va_end(lvalist); printf("log: %s\n", sOutBuffer); } void writeLogInfo(const char *sFormat, ...) __attribute__((format(printf,1,2))); int main(){ writeLogInfo("int=%s", 123); return 0; } |
当你尝试用gcc编译这个文件的时候,你就可以看到警告了,哈哈。
可以看到,这里的关键就是“__attribute__((format(printf,1,2)))” ,这句话的作用就是告诉编译器,前面这个函数呢,参数类型是类似printf的,格式化字符串在参数的第1个位置,扩展参数从第2个位置开始,然后编译器就明白了~
然后,上面的4~6行呢,是为了兼容非Gcc的编译器而加的,这样其他的编译器就会直接无视整个 __attribute__ 了,这样至少不会报错。
其实,这个检查格式化字串的功能(format),只是“函数属性”的一个而已,另外还有许多有用又有意思的属性,比如函数的别名啊(alias),是否已经过时啊(deprecated),等等~要了解这些用法的话,建议去看看官方文档。