Browsed by
分类:Unix/Linux

如何学好C语言

如何学好C语言

有人在酷壳的留言版上询问下面的问题

keep_walker :
今天晚上我看到这篇文章。
http://programmers.stackexchange.com/questions/62502/small-c-projects

我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!

我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:

  1. 虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
  2. 大量的封装好的类库也屏蔽了很多实现细节。

一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。

下面是我给这位朋友的一些建议:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (123 人打了分,平均分: 4.86 )
Loading...
纯文本配置还是注册表

纯文本配置还是注册表

我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的创新。在网上又看到有人在争论为什么用注册表而不是纯文本,所以,写下这篇文章。

引入注册表所谓的原因

首先,让我们来看一下为什么微软觉得要使用注册表而不是ini文件,下面是一些其列出来的ini方面的毛病:

  • ini文件不支持Unicode
  • ini文件的安全权限不够
  • ini文件在多进程下存取会有问题
  • 如果一个进程锁上了这个文件,另一个进程就无法获得,只能出错。
  • ini文件只能包含字符串,无法使用二进制
  • 解析ini文件相对来说性能比较慢,第一次读写都需要把整个文件读入内存,然后再写回去。
  • ini文件最大只有32K
  • ini文件的默认目录在Windows系统目录下,只能这个目录只能Windows管理员才能访问
  • ini只能包含了两层,对于多层不支持。
  • 把ini文件放在中央服务器上管理很困难。

而微软说,注册表可以完美地解决这些问题。居然微软只说到了ini文件,但我觉得不单单是ini,所有的以纯文本方式保存配置文件的方法都会出现上述这样的问题。

我的观点

那么,当你在看到这些言论时,你是怎么想的?你有没有经过自己的独立思考?还是你觉得注册表完美地解决了所有的一切?下面是我的一些观点:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (20 人打了分,平均分: 4.35 )
Loading...
chmod -x chmod的N种解法

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);
}

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (6 人打了分,平均分: 4.83 )
Loading...
一些非常有意思的杂项资源

一些非常有意思的杂项资源

下面是一些最近在互联网上看到的一些各式各样的资源和文章,当然,都是英文社区的,本来想每一个写一篇文章,但是觉得一篇文章一句话真没劲,所以,把这些东西合并写成一篇文章,这样有利于减轻本站的负载,也有利于节省网络带宽,同样,也就节省了能力和电力,因此也就很环保,很低碳。呵呵。

  • 说到这些很酷很炫的东西,大家一定会想到使用Flash,不过,目前的Flash正在受到HTML5的强力挑战,目前,对于HTML5的展示网站很多,让我们看到了HTML5完全可以做出Flash的样子,比如前些天本站说到的这个演示,还有给大家展示的纯HTML5的小游戏,不过,那些都是一些演示和展示罢了。今天在网上看到一个更强大的HTML5游戏,相当有可玩性,大家不妨一去试玩:http://www.phoboslab.org/biolab/

  • HTML5 可以应用的还不只是游戏,这不,有文章指出,用VexFlow还可以很轻松地在网页上发布乐谱。而这个网页还可以让你制作Hi-PoP音乐。

Rendered music

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (9 人打了分,平均分: 3.89 )
Loading...
使用grep恢复被删文件内容

使用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/sda1,就是硬盘设备,
  • > results.txt,就是把结果重定向到results.txt文件中。

如果你幸运的话,你就可以看到被恢复的内容了。这正是Unix的简单哲学(详见《Unix传奇下篇》)—— 所有的设备都是文件

当然,我还是建议你把root用户的rm的命令用alias换成别一个脚本,那个脚本会帮你把删除的文件放到某个地方。

好烂啊有点差凑合看看还不错很精彩 (14 人打了分,平均分: 4.43 )
Loading...
计算机编程简史图

计算机编程简史图

这个图片太经典了,本来想翻译的,后来觉得这么经典的图片可能早已被人翻译了,简单的Google一下,果然有人翻译了。那我就把英文版和中文版都转过来吧。我们可以看到,其中很大一部分人都和Unix有着不解之缘(参见《Unix传奇上篇Unix传奇下篇》)

什么也不说了,直接上图(图片比较大,单击图片看大图)


计算机编程简史图(英文版)

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (16 人打了分,平均分: 4.44 )
Loading...
telnet的一个Bug

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++,第一次见。(在terminal.cc中间居然出现了几个class)
  • 变量命名很不直观,大量的old, tmp, c1, c2, s1, s2, s3 等学校里用的变量名,只有作者自己知道是什么意思。函数命令的风格也不一致,编程风格也很不一致,基本没有编程规范。

的确很不易读。不管怎么样,很欣赏在man page中把源码的易读性列为BUG的这种作法。

好烂啊有点差凑合看看还不错很精彩 (7 人打了分,平均分: 4.00 )
Loading...
Unix传奇(上篇)

Unix传奇(上篇)

【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】


了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 

Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。在技术更新如此迅速的计算机世界的今天,Unix始终保持它那神圣的光环,它那曲折和令人叹息的历史,以及由它引发的思想变革,对当今计算机文化造成的深远影响,这40年所产生的人和事,让它成为了一个传奇,不能不让人为之惊叹。

这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世界文化最具代表性的,它对整个计算机世界文化的影响也是最巨大,最深远的。他给人带来的不单单的对过去的回味,更为我们带来了计算机世界的新思潮。

了解这段的历史的人,才能体会计算机世界变迁过程中的是是非非,才能了解计算机世界中的文化,从而才能参与到整个计算机革命的大潮中。希望这段历史,这篇文章能让你感受到计算机世界那强力的脉搏,从而让你踏上这条令人充满激情的道路。

上篇

  • Unix起源
  • Unix分裂
  • Unix的法律纠纷
  • GNU开源组织
  • Linux横空出世
  • Linux今天的领袖

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (21 人打了分,平均分: 4.76 )
Loading...
Unix传奇(下篇)

Unix传奇(下篇)

【本文曾于2007年3月于我在CSDN上的BLOG发布,现在我把其搬到酷壳来,一来是觉得这段历史相当传奇,值得大家再看看,二来也和我在酷壳上发布的一些文章相互链接。】


<<<<   Unix传奇(上篇)
Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。由它引发的思想变革,对当今计算机文化造成的深远影响。这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算机世界文化最具代表性的,它对整个计算机世界文化的影响也是最巨大,最深远的。他给人带来的不单单的对过去的回味,更为我们带来了计算机世界的新思潮。

下篇

  • Unix与黑客文化
  • Unix的历史教训
  • Unix 家族谱
  • Unix的特点
  • Unix的影响和哲学
  • Unix痛恨者手册

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (40 人打了分,平均分: 4.80 )
Loading...
Go语言源码的一个改动

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”

spell it with an e

 

这是一个很著名的典故,要知道这个典故,你需要知道两件事,一个是Ken Thompson的经典语录,一个是Unix的系统调用。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (13 人打了分,平均分: 4.38 )
Loading...