一个空格引发的惨剧
你是否相信如果你的程序里没有检查一个变量会导致怎么系统瘫痪?无论你相不相信,这是我一个亲身经历过的案例,你可以在本站的程序员那些悲催的事儿中找到很多这样的事。这样的事昨天在发生,今天同样在发生。Unix40多年了,在这40年里,程序员发生过各种各样的的惨剧,但是大多数的事情一而再再而三的重演。
今天的你,可能在开发者各种各样NB的系统,你会相信你的一个空格也能导致系统瘫痪吗?也许你可能很难相信这个事。不过,再下面这个事将告诉你这个血淋淋的事实 —— 一个空格产生的bug可以让你的系统瘫痪。
bumblebee是一个开源项目,这个名字也就是变形金刚里的大黄蜂,这个项目是这样介绍自己的——
bumblebee is Optimus support for Linux, with real offloading, and not switchable graphics.. More important.. it works on Optimus Laptops without a graphical multiplexer..
Optimus 是NVIDIA的“优驰”技术,其可以将您 ...
GNU/Linux下有多少是GNU的?
一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》 – GNU/Linux下有多少是GNU的。他的这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析,其给了两个饼图。
第一个饼图如下,其指明了各种主流的开源项目组的分布情况。可见GNU只占了8%,当然,GNome也是GNU的,加起来也只有13%,只占整个分发包很少的比重。
第二个图,作者把GNU的部分拿了出来,再进行了分析:
在下面这个图中,我们可以看到主要是四大块——gcc, gdb, binutils 和 glibc,所以,作者说,这些东西都不是最终用户需要的,不是每一个用户都是需要搞开发的。所以,如果去除这些,再去除Gnome(这个桌面UI也不是很力),那么GNU的东西几乎没有了。
所以,作者以此来挑战Richard Stallman提到的 GNU/Linux的这个说法。好像更为好的说法应该叫——
GNU/KDE/java/xorg/Linux
我对这篇文章有下述一些感觉:
以代码行来衡量重要性,非常的不准 ...
在Web上运行Linux
一个叫Fabrice Bellard的程序员写了一段Javascript在Web浏览器中启动Linux(原网页,我把这个网页iframe在了下面),目前,你只能使用Firefox 4和Chrome 11运行这个Linux。这不是什么假的模仿Linux的东西,这是实实在在的运行一个Linux。这一举动还引起了很多很牛人的关注,包括Javascript的创建者Brendan Eich。
清除启动开始启动
随后,Fabrice Bellard发布了相关的技术说明:http://bellard.org/jslinux/tech.html,从这份文档中我们可以看到:
这个模似器完全由Javascript写成
CPU仿真器使用的是QEMU(接近于原古的486),为了装上Linux,其做了一些改动。
Javascript的终端本来可以使用termlib,但他还是自己写了一个,因为OS的按键和Web浏览器不一样(here)
Linux 使用了2.6.20内核,编译配置在这里,并做了一些小改动。
磁盘用的是Ram Disk,在启动的时候装载。其文件系统由Buildroot ...
Linux 2.6.39-rc3的一个插曲
2011年4月12日,Linux 2.6.39-rc3发布了,Linus Torvalds写了一个发布邮件,其中包含了一个长长的为这个版本做过贡献的人员名单,这个名单中有很多看上去应该是中国人的名字,我挺为他们感到骄傲的(不知道你是否还记得以前本站的”Linux是由谁写的“)。
不过,没过一会,发现了一个bug,经过大家的调查(2.6.38版没有发现这个问题),很快,找到了原因,是因为一个内存地址的问题,一个叫Yinghai Lu的人(看其名字应该是中国人,其邮件是@kernel.org)找到了原因—— radeon card使用了一个不正确的内存地址[0xa0000000 – 0xc000000]。Joerg Roedel跟贴说,这个地址超出了4GB的内存,然后他和Alex Deucher聊了一会,觉得不应该是这个问题,因为这个地址应该是GPU的,而不是系统内存的。
好像,Yinghai Lu没有理会他们说的不应该是这个问题,给出了个fix:
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/ape ...
纯文本配置还是注册表
我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:一,二),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的创新。在网上又看到有人在争论为什么用注册表而不是纯文本,所以,写下这篇文章。
目录
引入注册表所谓的原因
我的观点
纯文本配置文件的好处
真正的原因
引入注册表所谓的原因
首先,让我们来看一下为什么微软觉得要使用注册表而不是ini文件,下面是一些其列出来的ini方面的毛病:
ini文件不支持Unicode
ini文件的安全权限不够
ini文件在多进程下存取会有问题
如果一个进程锁上了这个文件,另一个进程就无法获得,只能出错。
ini文件只能包含字符串,无法使用二进制
解析ini文件相对来说性能比较慢,第一次读写都需要把整个文件读入内存,然后再写回去。
in ...
chmod -x chmod的N种解法
在SlidesShare.net上有这么一个幻灯片,其说了如下的一个面试题:
如果某天你的Unix/Linux系统上的chomd命令被某人去掉了x属性(执行属性),
那么,你如何恢复呢?
下面是一些答案:
1)重新安装。对于Debian的系统:
sudo apt-get install --reinstall coreutils
2)使用语言级的chmod。
Perl:perl-e ‘chmod 0755, “/bin/chmod”‘
Python:python -c “import os;os.chmod(‘/bin/chmod’, 0755)”
Node.js:require(“fs”).chmodSync(“/bin/chmod”, 0755);
C程序:
#include <sys/types.h>
#include<sys/stat.h>
void main()
{
chmod("/bin/chmod", 0000755);
}
3)使用已有的可执行文件。
$cat - > chmod.c
void main(){} ...
使用grep恢复被删文件内容
在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去。以前,看到同事在脚本中使用rm命令 —— rm {$App_Dir}/* 。因为脚本没有判断变量$App_Dir是否为空,结果,在一次用root操作的时候,整个操作系统一下就不见了,还好只是开发机。从此,我们大家都再也不敢使用rm命令了。
这里给大家介绍一个小技巧用来恢复一些被rm了的文件中的数据。我们知道,rm命令其实并不是真正的从物理上删除文件内容,只过不把文件的inode回收了,其实文件内容还在硬盘上。所以,如果你不小删除了什么比较重要的程序配置文件的时候,我们完全可以用grep命令在恢复,下面是一个恢复示例:
grep -a -B 50 -A 60 'some string in the file' /dev/sda1 > results.txt
说明:
关于grep的-a意为–binary-files=text,也就是把二进制文件当作文本文件。
-B和-A的选项就是这段字符串之前几行和之后几行。
/dev ...
计算机编程简史图
这个图片太经典了,本来想翻译的,后来觉得这么经典的图片可能早已被人翻译了,简单的Google一下,果然有人翻译了。那我就把英文版和中文版都转过来吧。我们可以看到,其中很大一部分人都和Unix有着不解之缘(参见《Unix传奇上篇,Unix传奇下篇》)
英文原版
中文翻译版
什么也不说了,直接上图(图片比较大,单击图片看大图)
计算机编程简史图(英文版)
计算机编程简史图(中文版)
telnet的一个Bug
下面这个链接是Linux分发包Ubuntu的关于Telnet命令的Man Page,
http://manpages.ubuntu.com/manpages/karmic/man1/telnet-ssl.1.html
打开这个Man Page,把页面拉到最后一行,你会看到下面这个BUG(“BUGS:源代码不易读!”)
The source code is not comprehensible.
Telnet的源代码在这里:http://packages.ubuntu.com/source/dapper/netkit-telnet,下载下来一看,还真是不易读,简单地看了一下代码,发现至少有这样一些问题:
空格和Tab键混用的缩进,导致很多代码在没有缩进。
大量的#if #else以及大量的各种预编译宏。以及一些怪异的宏。如:
#ifndef B19200
#define B19200 B9600
#endif
#ifndef B38400
#define B38400 B19200
#endif
什么叫在C中写C++,第一次见。 ...
Unix传奇(上篇)
【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】
了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。
Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。在技术更新如此迅速的计算机世界的今天,Unix始终保持它那神圣的光环,它那曲折和令人叹息的历史,以及由它引发的思想变革,对当今计算机文化造成的深远影响,这40年所产生的人和事,让它成为了一个传奇,不能不让人为之惊叹。
这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世 ...
Unix传奇(下篇)
【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】
<<<< Unix传奇(上篇)
Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。由它引发的思想变革,对当今计算机文化造成的深远影响。这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世界文化最具代表性的,它对整个计算机世界文化的影响也是最巨大,最深远的。他给人带来的不单单的对过去的回味,更为我们带来了计算机世界的新思潮。
下篇
Unix与黑客文化
Unix的历史教训
Unix 家族谱
Unix的特点
Unix的影响和哲学
Unix痛恨者手册
上篇
Unix起源
Unix分裂
Unix的法律纠纷
GNU开源组织
Linux横空出世
...
Go语言源码的一个改动
2009年11月11日,光棍节,Google发布了Go语言,马上,就有网友在http://code.google.com/p/go/上找到了一个Go语言包文件操作源码/src/pkg/os/file.go文件的一个最新改动。这个改动的作者就是那个大名鼎鼎的Unix之父Ken Thompson(看看人家,都这么老了,还在写程序,佩服佩服,真是顶级程序员啊——《程序员的八个级别》),而这个改动的Log Message如下所示(把屏抓下来,以免以后某日被放到墙外或是google.com数据丢失或是Google公司倒闭)
Spell it with an “e”
这是一个很著名的典故,要知道这个典故,你需要知道两件事,一个是Ken Thompson的经典语录,一个是Unix的系统调用。
关于Ken Thompson的经典语录,你可以在wikipdia上的Ken Thompson词条中找到,这个事情是这样的。
Ken Thompson was once asked what he would do differently if he were redesigning the ...
装完Ubuntu 9.10后要干的事
Ubuntu 9.10刚刚release,就有人在网上发表了贴子告诉大家在装完这个操作系统后,还需要去安装的一些开源免费软件,相当丰富。不过,这个贴子的链接被GFW干掉了,所以,你需要使用Tor的支持,或是使用Google Reader才能查看源文(RSS链接)。而这个贴子非常长,所以我无法作全文翻译,不过这个贴子的内容具有很强的指导意义,所以我在这里为大家总结一下该文所提到的那些诸多的东西。(关于那些如何翻墙的事情怎么做我就不多说了,网上有很多相关的文章,你自己搜索一下就可以找到)
目录
基本工作
受限软件
界面相关
桌面相关
音频/视频编辑器
多媒体Playback
网页浏览器
游戏
图片和发行物
文件分享
时间管理
沟通软件
安全和隐私
系统工具
基本工作
1)第一件事自然是下载那些Ubuntu的镜像站点表,以及更新操作系统的一些补丁。“系统”->“管理”-> “更新管理器”。
2)第二件事是设置文件目录共享。就是在文件夹上点右键,在菜单 ...
ldd 的一个安全问题
我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的,这就是这个命令的用处。可是,这个命令比你想像的要危险得多,也许很多黑客通过ldd的安全问题来攻击你的服务器。其实,ldd的安全问题存在很长的时间了,但居然没有被官方文档所记录来下,这听上去更加难以理解了。怎么?是不是听起来有点不可思议?下面,让我为你细细道来。
首先,我们先来了解一下,我们怎么来使用ldd的,请你看一下下面的几个命令:
(1) $ ldd /bin/grep
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7eca000)
/lib/ld-linux.so.2 (0xb801e000)
(2) $ LD_TRACE_LOADED_OBJECTS=1 /bin/grep
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 ...
[推荐]基于Mac的Port工具Fink
看到标题,读者朋友们肯定第一时间想到的MacPort 。
恩,那是一款非常棒的工具。 不过我更愿意推荐各位使用另外一款工具 Fink(http://www.finkproject.org/).
Fink 项目希望把 Unix 上各种开放源码软件带到 Darwin 和 Mac OS X 平台上。 我们通过修改 Unix 软件使得它可以在 Mac OS X 上编译和运行(“移植”),并提供一个方便的分发系统使得每个人都可以下载和使用它。 Fink 使用 Debian 中的象 dpkg 和 apt-get 等工具来提供强大的二进制软件包管理。 你可以随意选择是下载预编译好的二进制安装包或从源代码自己构建一切。
关于 Fink的安装 ,大部分用户可参见http://www.finkproject.org/download/index.php?phpLang=zh。
不过后面我主要想介绍我的安装方式,因为我的Mac 版本是10.6 64bit.所以还是有些差别。也许上述普通方法有效,但是我并未尝试。
安装步骤如下(感谢 http://sage.ucsc. ...
bash 函数级重定向
相信每一个人对于操作系统的重定向不会陌生了。就是>, >>, <, <<,关于重定向的基本知识我就不说了。这里主要讨论bash的重定向中的一个鲜为人知的东西,那就是bash脚本的函数也可以定义相关的重定向操作。这可不是命令级的重定向,这是函数级的重点向。这并不是一个新的东西,我只是想告诉大家一个已经存在了多年但却可能不被人常用的功能。
关于bash的这个函数级的重定向的语法其实很简单,你只需要在函数结尾时加上一些重定向的定义或指示符就可以了。下面是一个示例:
function mytest()
{
...
} < mytest.in > mytest.out 2> mytest.err
现在,只要是test被调用,那么,这个函数就会从mytest.in读入数据,并把输出重定向到mytest.out文件中,然后标准错误则输出到mytest.err文件中。是不是很简单?
因为函数级的重定向仅当在被函数调用的时候才会起作用,而且其也是脚本的一部分,所 ...
到处都是Unix的胎记
一说起Unix编程,不必多说,最著名的系统调用就是fork,pipe,exec,kill或是socket了(fork(2), execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))这些系统调用都像是Unix编程的胎记或签名一样,表明着它来自于Unix。
下面这篇文章,将向大家展示Unix下最经典的socket的编程例子——使用fork + socket来创建一个TCP/IP的服务程序。这个编程模式很简单,首先是创建Socket,然后把其绑定在某个IP和Port上上侦听连接,接下来的一般做法是使用一个fork创建一个client服务进程再加上一个死循环用于处理和client的交互。这个模式是Unix下最经典的Socket编程例子。
下面,让我们看看用C,Ruby,Python,Perl,PHP和Haskell来实现这一例子,你会发现这些例子中的Unix的胎记。如果你想知道这些例子中的技术细节,那么,向你推荐两本经典书——《Unix高级环境编程》和《Unix网络编程》。
目录
...
CentOS上php的问题及Selinux安全设置
最近有位站长在用我们WebIM客户端的时候,无法登录我们的WebIM服务器,十分惊讶。 在我们的用户里尚属首例,其实更惊讶的是我的CentOS也遇到了同样的问题。然后分析了这位站长的HttpResponse , Shamee :( 一样的OS.
搜了一下,发现的解决方法都是在代码上。 我想可能关键词有错误,因为我坚信我的问题肯定不在代码上,应该是来自OS本身的限制。于是重新debug了一下代码,报错 permission (13) connection。然后直接在洋人的邮件列表里搜了一下。
问题确定了 是SeLinux(http://zh.wikipedia.org/wiki/SELinux)安全策略的限制。
这下问题明了了,执行 /usr/sbin/setenforce 0就能迅速关闭SELINUX,或者vi /etc/selinux/config 把enforcing改成permissive 然后reboot.
但是我想了一下,就算安全级别为B1的Linux被攻击的可能小,但是总会有面对这种问题的时候,况且这种解决访问本身并不优雅。
于是想了下 把Apache脱离SeLinux ...
Alice梦游UNIX仙境
本文来源:http://www.pma.caltech.edu/Publications/alice.in.unix.land.html
(这是一篇1989年的文章)
Alice 正在在她的显示器上读着一些信息,她开会怀疑所有的事情并不是应该的那样。“程序太大了,而无法适应内存”,她读到。
“一个很奇怪的事情”,她说,“我所做的也就是在启动我的字处理程序会运行了14个TSR(terminate-and-stay-resident 常驻程序)。所有这些程序需要使用4M的内存,我希望我能使用超过640K以上的内存”。
就在那个时候,一个小的白色的顾问(一个非常白的顾问)跑过了房间。“哦,我的外套和领带”,他说到,“我要迟到了。并且是每小时150元。”Alice本想对他说点什么,他却跳到了Alice的显示器里并到在操作系统后面消失了。
Alice 从来没有见过有人可以跳到显示器里,并且肯定不是通过操作系统干。但是,曾有人告诉他,DOS这个操作系统是非常肤浅的。于是,她没有怎么犹豫,Alice也跳了进去。
Alice发现她自己在一个明亮的走廊里。她不知道要做什么,她开始向前走,走过了一 ...
8个实用而有趣Bash命令提示行
很多人都对过命令行提示的重要性不屑一顾,甚至是一点都不关心。但是我却一点都不这么认为,一个好的命令行提示可以改变你使用命令的方式。为此,我在internet上找到一些非常实用,优秀,并有趣的bash的命令行提示。下面我将我最喜欢使用的一些命令行提示罗列如下。
注意 – 要使用下面这些提示,你可以拷贝粘贴这些以”PS1″打头的内容到你的终端上,为了使你的改变永久生效,还要将这些内容粘贴到你使用用户的~/.bashrc文件中去。
1. 在成功执行的命令上增加一个笑脸符号
这个命令提示行可能是这个命令行提示列表中最有趣的一个,但是它也依然有使用的价值。这个提示的想法是基于当你命令被成功执行,你将会得到一个笑脸作为你的命令行提示,一旦的命令执行失败,命令行提示将会换成一个哭脸。
例子:
代码:
PS1=”\if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\[\u@\h:\w]\\$ “
2.更改失败命令的颜色
下面这个命令行提示是我最喜欢的 ...