Showing posts with label HACK. Show all posts
Showing posts with label HACK. Show all posts

Sunday, September 19, 2010

那些与彩蛋有关的事情

原文发表于「桃源」: http://linux.cuit.edu.cn/?p=1006

前几天@liancheng同学在Twitter上传说中GCC有一个关于#pragma的彩蛋, 大致是说Stallman同学对#pragma很有意见, 因此在GCC中埋了一个彩蛋, 只要发现#pragma就会蹦出俄罗斯方块. 这个很有意思的八卦让我想要一探究竟, 经过一番查找, 这个彩蛋的确是存在的, 不过不是蹦出俄罗斯方块, 根据Wikipedia上一篇文章的介绍, GCC会试图依次启动Hack, Rogue, 以及Emacs中的Towers of Hanoi (汉诺塔), Hack和Rogue都曾经在「桃源」的另一篇文章[经典游戏推荐: NetHack]中提及. 不过这个彩蛋现在已经不存在了, Stallman同学曾经在接受采访时谈到 (请在采访稿中搜索"Easter eggs"), 这个彩蛋其实是针对C标准开的一个玩笑, 后来由于某种原因被移除. 幸运的是, GCC的古老代码依然存在, 下面是从GCC 1.21中提取出来的"遗体":
/* This was a fun hack, but #pragma seems to start to be useful.
   By failing to recognize it, we pass it through unchanged to cc1.  */

/*
 * the behavior of the #pragma directive is implementation defined.
 * this implementation defines it as follows.
 */
do_pragma ()
{
  close (0);
  if (open ("/dev/tty", O_RDONLY) != 0)
    goto nope;
  close (1);
  if (open ("/dev/tty", O_WRONLY) != 1)
    goto nope;
  execl ("/usr/games/hack", "#pragma", 0);
  execl ("/usr/games/rogue", "#pragma", 0);
  execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
  execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
nope:
  fatal ("You are in a maze of twisty compiler features, all different");
}

关于#pragma彩蛋的故事结束了, 但彩蛋本身就像一个充满魔力的物体, 一直是Geek间津津乐道的话题. Linux中的彩蛋不胜枚举, LinuxTOY有一篇文章大概介绍了其中的一小部分. 还有著名的Google Reader中的Konami Code彩蛋. xkcd的命令行版unixkcd更是隐藏了大量彩蛋, 其中就包括Konami Code. 还有一个颇有意思的彩蛋, 在Emacs中按下"M-x butterfly C-M-c"即可, 这个彩蛋的由来是因为xkcd上曾经有一篇漫画 (这篇漫画很有趣, 推荐大家看看, Linux程序员定会泪牛满面, lol) 虚构了Emacs中有这么一个彩蛋, 于是开发Emacs的那群家伙就真的在Emacs 23.1中加入了这个彩蛋...

彩蛋是程序员创造的独一无二的标志, 也许是为了好玩, 也许是为了吐槽, 也许是为了方便调试, 总之彩蛋给这个世界带来了一个值得纪念的回忆. 如果你还知道什么有趣或者有意义的彩蛋, 欢迎分享, :)

For LaN

Thursday, December 17, 2009

/\13y3$-|-

其实我一直认为搞计算机的, 特别是那种顶级黑客, 骨子里都是有一种狂放不羁, 玩世不恭的态度的, 带着一些Hacker特有的幽默. 让我们来欣赏其中的一些吧.

0xDEADBEEF: 乍一看, 这只是一个普通的十六进制数, 但你再仔细看看那几个十六进制字母, 是否恍然大悟? 不要小看这样一个数字, 它可是有特殊用途的. 在早期的IBM RS/6000系列电脑里, 如果在内存中新分配了一块地址, 那这块地址中就全部使用"0xDEADBEEF"填充, 这样做可以很好地防止"heisenbug" (这个有趣的bug后面还会讲到) 的出现. 类似于这样的用法还有很多, 统称"Hexspeak", 也就是用十六进制来表示英语单词, 仅有的六个字母肯定不够用, 于是又用数字"0"来表示"O", "1"表示"I" (i的大写形式), "5"表示"S", "6"或者"9"表示"G"或者"g". 这种通过替换英文字母来表示的行为在网上很是流行, 术语叫做"leet", Google也有一个全部使用leet字母显示的神秘主页, 欢迎围观. 有关"0xDEADBEEF"的更多信息可以阅读Raymond的介绍.

heisenbug: 这名字很眼熟对吧? 其实从前有一个量子物理学家叫做Heisenberg... 噢, 这群人居然都敢开物理学家的玩笑了. 其实不然, 这个名字主要还是源于Heisenberg Uncertainty Principle (海森堡测不准原理), 这不禁让我想到高中时马老那闪烁着智慧光芒的眼镜. "heisenbug"用于描述那些当你试图去了解、探查时莫名消失或者改变的计算机软件bug, 在C语言中, 十有八九"heisenbug"都是由于未初始化的变量引起的.

Bohr bug: 这同样是来自于物理学, 不过这次是原子物理. "Bohr bug"是"heisenbug"的反义词, 这种bug很稳定, 不会到处乱跑, 不过通常也隐藏得比较深, 不容易被发现, 典型的是"缓冲区溢出".

schroedinbug: 还是物理学, 我几乎怀疑计算机学是否是由物理学家开创的. 这个bug源于著名的量子物理学实验: Schrödinger's cat (薛定谔的猫), 具体内容我就不细说了, 详情参见《The Big Bang Theory》第一季17集由Dr. Sheldon带来的权威解释, :) "schroedinbug"是一个神奇的bug, 它只会在你查看源代码或者在特定条件下运行程序时才会出现, 真够纠结的, 但这种bug的的确确是存在的.

还有很多这样的非常规bug, Wikipedia上有详细介绍. 无论怎样, Hacker绝对是这个世界上很有趣的一群动物之一.

Thursday, March 5, 2009

typeof, ISO C, GCC, 没有空格的代码, 奇怪的比赛

这个故事的起源是Matrix67博客上的一篇文章, 一个叫做Time Limit Exceeded的创意编程比赛有一道很有意思的题: Compile Error, 这道题不允许代码中出现空格. 一个最简单的问题就是像 int a; 中的空格如何避免, Matrix67的文章中提到可以用typeof解决. 昨天Ray提醒我这个typeof在C语言里没见过, 然后我就一直想啊, 这个typeof是个什么东西啊. 查了一下才知道, 原来typeof不是标准C/C++中的关键字, 目前GCC提供了对typeof的支持, 这里有详细的解释, 里面有一个绝妙的例子, 可以在C中实现类似C++中Template的功能. 这是Wikipedia上关于typeof的解释: http://en.wikipedia.org/wiki/Typeof, 在C#、JS中也有这个关键字, 不过细节上有差别.

好了, 弄清了typeof的来龙去脉以后, 再回到那个编程比赛上. 现在我们就有了一种方法来避免空格了:
typeof(int)a;
本来以为这个已经够难想到的了, 不过又发现了一个更简单, 且很好理解的方法:
int(a);

没想到一个typeof引申了这么多东西出来, 真是神奇~

Tuesday, February 10, 2009

有趣的Linux知识问答

The Linux Pub Quiz

总的来说, 我是不及格的, 呵呵~ 不过看看还是很有意思的, 那句对Linus的调侃把我雷到了 XD

Sunday, February 8, 2009

关于cnBeta的RSS小技巧

看过cnBeta的RSS新闻的同学就会知道, 默认情况下每个新闻都只会显示摘要, 只有打开原始链接才能看到完整内容. 当然, 如果我是在电脑上阅读的话, 是不大会介意这种事情的, 一来可以看到cnBeta上精辟的评论, 二来还能给别人增加点点击率. 不过这种情况到了手机上就很不方便了, 每次打开一个新闻链接都只能先看摘要, 然后才能看完整内容, 这样不仅浪费了时间, 而且也浪费了手机上宝贵的流量 (虽然我每个月的流量都用不完 - -||)

今天上网查找某问题时, 无意间发现了和我一样看不惯这种只显示摘要行为的某人, 于是本着共享的精神, 借鉴过来并张贴到博客上. 这里是用的另一个RSS地址: http://feeds.feedburner.com/cnbeta_full, 而不是首页上的http://www.cnbeta.com/backend.php, 订阅第一个的话看到的就是全文显示的了, 不过更新速度会稍微慢一点.

Saturday, February 7, 2009

alist

$ echo SSBsb3ZlIHlvdSA0ZXZlciwgTGFuLgo= | base64 -d

Saturday, December 27, 2008

好玩的终端Google

goosh.org
前几天发现了一个好玩的网站, 它提供Google的搜索服务, 也许你会说这没什么, 随便哪里都有. 但这个网站可不一样, 它是纯命令行的搜索. 网页模拟成了终端, 而你需要输入相应的命令. 偶尔用用还是很有趣的.

Thursday, December 4, 2008

有趣的屏幕反色现象~

反色

偶然发现的, Super+M使整个屏幕反色, Super+N使当前窗口反色.

Monday, November 10, 2008

参加三叶草Linux方向考核的一些总结

这标题好像有点正式, 其实也就是上个星期的事情, joy给我们出了几道题, 做为进入三叶草的一个考核. 虽然题不多, 而且难度也不是很大, 不过还是有一些值得写下来的东西.

首先了解了indent这个软件. 以前在桃源上看过joy写的介绍, 没用过, 这次题上有, 就去下来用了用. 只需要简单地配置一下就可以使用了, 不过只能用来缩进C语言, 这个范围有点窄了. 但某些地方还是要比我自己配置的在Vim和Emacs里的缩进要先进一点, 以后可以这两种方法结合着用. 配置参考了joy写的, 自己查了点也添了进去:
$ cat ~/.indent.pro
-bl        // Put braces on line after if, etc.
-bli0      // Indent braces n spacs.
-bls       // Put braces on the line after struct declaration lines.
-c32       // Put comments to the right of code in column n.
-cd32      // Put comments to the right of declarations in column n.
-cp32      // Put comments to the right of #else and #endif statements in column n.
-i4        // Set indentation level to n spaces.
-kr        // Use Kernighan & Ritchie coding style.
-nce       // Do not cuddle } and else.

然后根据joy的题的要求写了一个将Window$下的文本文件转换为Linux下的格式的脚本. 功能很简单, 不过有时候也挺实用的, 现在还只能处理单个文件, 准备以后加入批处理功能.

最后这个和这次的题没有多大关系, 只是因为上次看joy演示的时候很好奇那个在Emacs中自动添加文件头的东西. 于是先去网上找了下, 找到一个叫做template的插件. 虽然不是joy那个, 不过发现这个插件的好处就是可以自动帮我在tex文件的开头插入导言区, 这下可省事多了, 呵呵~ 然后问了joy, 知道了那个插件叫做auto-header.el. 最开始还下了一个错误的版本, 导致Emacs启动错误, 推荐大家在这里下载. 这个的配置参考猫猫的配置.
$ cat ~/.emacs
;; template
(require 'template)
(template-initialize)

;; auto-header.el
(require 'auto-header)
(setq header-full-name "Dreamseeker"
      header-email-address "gaochangjian<at>gmail<dot>com"
      header-copyright-notice "Copyleft (c) INF, Dreamseeker"
      header-update-on-save '(filename modified counter copyright)
      header-field-list '(filename
                          blank
                          description
                          blank
                          author
                          created
                          blank
                          modified_by
                          modified
                          blank
                          status
                          update
                          blank
                          copyright))
;; auto update the number of count
(global-set-key (kbd "s-h") (lambda ()
                              (interactive)
                              (if (header-exists-p)
                                  (header-update-count)
                                (header-make t))))

Thursday, October 30, 2008

Window$与Linux的启动速度不完全比较分析报告

今天和超哥谈到了电脑的启动速度问题, 于是回寝室就以我的这台电脑作为实验品试验了一下.

先说下系统环境: Linux是Arch, 2.6.27的内核, Window$是XP Professional SP3. 计算的标准是从计算机加电自检开始计时, 到完全进入图形界面, 并且可以正常开始工作. 下面就是我的计时结果:
Linux 42s
Window$ 1m8s

差别其实也不是很大, 本来以为Window$再怎么也得要个一两分钟, 差不多Window$到登录界面的时候就用了40s左右, 剩下的就是Window$独特的漫长的自启动程序的加载过程, 这个Linux下也有, 不过至少少了个杀毒软件的启动时间. 还好这机器被腐蚀得还不是很严重, 只有两三个启动程序.

Intel的那个6s启动的Netbook想想还是比较吓人的.

Sunday, September 14, 2008

强大的终端电影

昨天在Ubuntu社区上看到的, 以前貌似听说过这么一个东西, 不过没见过, 见到了以后感觉的确很震撼. 当然, 你得要了解 Star Wars Episode IV: A New Hope 才行, 不然要理解其中的剧情还是有一定难度的, 毕竟这属于抽象派的. 话说这个有谁看完过?
telnet towel.blinkenlights.nl
下面是一些截图:

20th Fox
这个20世纪福克斯的的确很搞, - -

StarWars
Star Wars!

C-3PO & R2-D2
R2-D2 & C-3PO

Thursday, July 17, 2008

Thursday, July 3, 2008

Game: Help 小明.

小明初学 C 语言,写了个程序,想打印 99 个 '#'. 程序如下:

int i, n=99; main() { for(i=0; i<n; i--) { printf("#"); } }

但是这个程序是错的.

Question 1: 请大家帮他改正, 但只允许 1) 删除一个字符 or 2) 增加一个字符 or 3) 改变一个字符
Question 2: 同样的限制条件, 使得只打印一个 '#'
Qeustion 3: 同样的限制条件, 打印 100 个 '#'


------------ DONT SPOIL THE FUN ---------------
---- 华丽的分界线, 请大家确保对上述每个问题思考 10 分钟再往下看 ----

















































































































































Question 4: 请大家用自己喜爱的 scripting language 编个程序来解决以上 3 问

Monday, June 30, 2008

呼叫转移

make

原来make也有呼叫转移的功能...

Thursday, June 26, 2008

彩蛋收集计划 II

Ubuntu
彩蛋-01

彩蛋-02

彩蛋-03
Alt+F2: free the fish

彩蛋-04
Alt+F2: gegls from outer space

彩蛋-05

彩蛋-06

彩蛋-11
apt-get --help

OpenOffice
彩蛋-07
彩蛋-08
在Calc的单元格中输入: =Game("StarWars")

Firefox
彩蛋-09

彩蛋-10