按 ‘ infotech ’ 分类归档

网络出奇地慢,比地震后几天的恢复期还慢,不由得让人怀疑接好了海缆W1之后,财迷的网通立刻把所有的中美路由全指向它了。

回到家发现上不了国外的网,还以为大防火墙又在添砖加瓦。 跑到新浪上才知道,昨天20:26和20:34,台湾南部海域发生了7.2和6.7级地震,六条海底光缆不幸阵亡了。

删除Linux分区之后,Windows不能启动的问题

今天做了个危险的决定,把Linux从笔记本里删除了,理由是用得太少。 可是,删除了Linux的分区之后,GRUB就找不到存放系统启动选择信息的menu.lst,结果连XP也起不来了。 系统只显示了个GRUB>提示符。

小脸苍白地摸到了家,拿另一台机器到网上狂搜,终于Google出了解决方法:

GRUB> rootnoverify (hd0,0)
GRUB> makeactive
GRUB> chainloader +1
GRUB> boot

这个可以解决XP不能启动的问题,可是总不能每次启动都敲四行命令吧。

又仔细地读了读那个网页,找到了更好的方法:

把XP系统的恢复盘放到光驱里,从光驱启动。从系统给的选项里,按R键选择恢复系统。 当系统提问是修复还是完全恢复时,敲EXIT。系统提示

1: C:\WINDOWS
Which Windows Installation would you like to log onto 
(To cancel, press ENTER)?
---------------------------------------------------------------------

输入1。
在提示符下输入FIXMBR。

系统会显示一堆信息吓唬你,当它说现在的MBR不标准(the MBR is non standard)并问你是否继续时, 回答yes。重新回到提示符时,敲EXIT,系统将成功启动XP。

天价的免费编译器

月刚觉得在旧的Sun工作站上升级或许还不如买一台新的工作站省心省钱,让我帮着看一下国内的价格。

到网上一看,Blade 150的北京参考价是13500。打电话让华胜给个报价,包括基本系统和一个Forte C编译器。下午,报价传来了,基本的系统是13560,跟网上说的价格差不多;而Forte C的位置上写了个Sun Studio 10,开价26600!

到网上搜了搜,看这个软件是个什么东东,是否与Forte C等价或类似,却意外地发现,Sun Studio从11月开始,早已向用户免费提供。

哈哈哈!估计华胜也知道这个消息,就是想着蒙一个算一个。

幻灯

把放幻灯的程序写好了,自我感觉很好。Netscape太可恶了,渐隐效果实现那么麻烦,图像还不支持click事件, 这些且都不去说它,它竟然还把

<div id=”Parent”>
<div>Part 1</div>
<div>Part 2</div>
</div>

每两行之间的回车空白字符也算一个Parent的childNodes元素,害得我只好写成很难看的格式:

<div id=”Parent”><div>
Part 1
</div><div>
Part 2
</div></div>

二十四点

这是一个算二十四点的程序。从命令行输入四个数字,结果以后缀表达式输出。如:

$ calc24 8 8 3 3
8383/-/

即8/(3-8/3)。

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include	<math.h>

void	calc24(int, int, int, int);
double	calc(char *);

void	main(int argc, char *argv[])
{
	int	n[4];
	int	i, j, k, m;

	if (argc != 5) {
		printf("Usage: %s a b c d\n", argv[0]);
		return;
	}
	for (i = 0; i < 4; i++)
		if ((n[i] = atoi(argv[i+1])) < 1 || n[i] > 9) {
			printf("%s is not a valid input\n", argv[i+1]);
			return;
		}
	for (i = 0; i < 4; i++)
		for (j = 0; j < 4; j++) {
			if (j == i)
				continue;
			for (k = 0; k < 4; k++) {
				if (k == i || k == j)
					continue;
				for (m = 0; m < 4; m++) {
					if (m == i || m == j || m == k)
						continue;
					calc24(n[i], n[j], n[k], n[m]);
				}
			}
		}
}

void	calc24(int a, int b, int c, int d)
{
	char	expr[10];
	char	*oper = "+-*/";
	int	i, j, k, m;

	for (i = 0; i < 4; i++)
		for (j = 0; j < 4; j++) {
			for (k = 0; k < 4; k++) {
				sprintf(expr, "%d%d%d%d%c%c%c", a, b, c, d, oper[i], oper[j], oper[k]);
				if (fabs(calc(expr) - 24) < 1.0E-3)
					puts(expr);
				sprintf(expr, "%d%d%d%c%d%c%c", a, b, c, oper[i], d, oper[j], oper[k]);
				if (fabs(calc(expr) - 24) < 1.0E-3)
					puts(expr);
				sprintf(expr, "%d%d%d%c%c%d%c", a, b, c, oper[i], oper[j], d, oper[k]);
				if (fabs(calc(expr) - 24) < 1.0E-3)
					puts(expr);
				sprintf(expr, "%d%d%c%d%d%c%c", a, b, oper[i], c, d, oper[j], oper[k]);
				if (fabs(calc(expr) - 24) < 1.0E-3)
					puts(expr);
				sprintf(expr, "%d%d%c%d%c%d%c", a, b, oper[i], c, oper[j], d, oper[k]);
				if (fabs(calc(expr) - 24) < 1.0E-3)
					puts(expr);
			}
		}
}

double	calc(char *expr)
{
	double	a, b, stack[4];
	int	top, i, n;

	n = strlen(expr);
	top = 0;
	for (i = 0; i < n; i++) {
		if (isdigit(expr[i])) {
			stack[top++] = expr[i] - '0';
			continue;
		}
		if (top < 2)
			return	9999;
		b = stack[--top];
		a = stack[--top];
		switch(expr[i]) {
		case '+':
			stack[top] = a + b;
			break;
		case '-':
			stack[top] = a - b;
			break;
		case '*':
			stack[top] = a * b;
			break;
		case '/':
			if (b == 0.0)
				return	9999;
			stack[top] = a / b;
			break;
		}
		top++;
	}
	if (top != 1)
		return	-9999;
	return	stack[0];
}

和Linux下棋

下了两个晚上,一盘也没赢,今天发了狠,上来把王前兵走了两格,对方跳马,我就把王前兵往前再推一格……

机器长考了五分钟后,旗钟倒下。但是还不肯认输,继续苦苦思索。 我又等了五分钟,等得好不耐烦,只好把窗口关了。

和Linux下棋

和Linux下棋

98%的人一小时也做不出来的题目

据说这是98%的人一小时也做不出来的题目。在网上看见,一时技痒,编了个程序来解,总算落到那2%里面了。哈哈。

请回答下面10个问题:

1、第一个答案是b的问题是哪一个?
(a)2;(b) 3;(c)4;(d)5;(e)6
2、唯一的连续两个具有相同答案的问题是:
(a)2,3;(b)3,4;(c)4,5;(d)5,6;(e)6,7
3、本问题答案和哪一个问题的答案相同?
(a)1;(b)2;(c)4;(d)7;(e)6
4、答案是a的问题的个数是:
(a)0;(b)1;(c)2;(d)3;(e)4
5、本问题答案和哪一个问题的答案相同?
(a)10;(b)9;(c)8;(d)7;(e)6
6、答案是a的问题的个数和答案是什么的问题的个数相同?
(a)b;(b)c;(c)d;(d)e;(e)以上都不是
7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
(a)4;(b)3;(c)2;(d)1;(e)0。(注:a和b相差一个字母)
8、答案是元音字母的问题的个数是:
(a)2;(b)3;(c)4;(d)5;(e)6。(注:a和e是元音字母)
9、答案是辅音字母的问题的个数是:
(a)质数;(b)阶乘数;(c)平方数;(d)立方数;(e)5的倍数
10、本问题的答案是:
(a)a;(b)b;(c)c;(d)d;(e)e

唯一的答案是CDEBEEDCBA,算法如下:

#include	<stdio.h>

int	a[10];

void	select(int n, int answer);

void	main()
{
	int	i;

	for (i = 'a'; i <= 'e'; i++)
		select(0, i);
}

void	select(int n, int answer)
{
	int	i;
	int	same, pos;
	int	asum, bsum, csum, dsum, esum;
	int	diff;

	a[n] = answer;
	if (n < 9) {
		for (i = 'a'; i <= 'e'; i++)
			select(n + 1, i);
		return;
	}
	/* 1 */
	for (i = 0; i < 6; i++)
		if (a[i] == 'b')
			break;
	if (i < 1 || i > 5 || a[0] != 'a' + i - 1)
		return;
	/* 2 */
	same = 0;
	pos = 0;
	for (i = 0; i < 9; i++)
		if (a[i] == a[i+1]) {
			if (same)
				return;
			same = 1;
			pos = i;
		}
	if (pos < 1 || pos > 5 || a[1] != 'a' + pos - 1)
		return;
	/* 3 */
	if (a[2] == 'a' && a[0] != a[2])
		return;
	if (a[2] == 'b' && a[1] != a[2])
		return;
	if (a[2] == 'c' && a[3] != a[2])
		return;
	if (a[2] == 'd' && a[6] != a[2])
		return;
	if (a[2] == 'e' && a[5] != a[2])
		return;
	/* 4 */
	asum = 0;
	bsum = 0;
	csum = 0;
	dsum = 0;
	esum = 0;
	for (i = 0; i < 10; i++) {
		switch (a[i]) {
		case 'a':
			asum++;
			break;
		case 'b':
			bsum++;
			break;
		case 'c':
			csum++;
			break;
		case 'd':
			dsum++;
			break;
		case 'e':
			esum++;
			break;
		}
	}
	if (asum != a[3] - 'a')
		return;
	/* 5 */
	if (a[9+'a'-a[4]] != a[4])
		return;
	/* 6 */
	if (asum == bsum && a[5] != 'a')
		return;
	if (asum == csum && a[5] != 'b')
		return;
	if (asum == dsum && a[5] != 'c')
		return;
	if (asum == esum && a[5] != 'd')
		return;
	if ((asum == bsum || asum == csum || asum == dsum) && a[5] == 'e')
		return;
	if ((bsum == csum || csum == dsum || dsum == esum ||
	    esum == bsum || esum == csum || bsum == dsum) && a[5] != 'e')
		return;
	/* 7 */
	diff = a[6] - a[7] > 0 ? a[6] - a[7] : a[7] - a[6];
	if (a[6] != 4 - diff + 'a')
		return;
	/* 8 */
	if (asum + esum < 2 || asum + esum > 6 || a[7] != 'a' + asum + esum - 2)
		return;
	/* 9 */
	switch (bsum + csum + dsum) {
	case 3:
	case 7:
		if (a[8] != 'a')
			return;
		break;
	case 4:
	case 9:
		if (a[8] != 'c')
			return;
		break;
	case 6:
		if (a[8] != 'b')
			return;
		break;
	case 8:
		if (a[8] != 'd')
			return;
		break;
	case 10:
		if (a[8] != 'e')
			return;
		break;
	default:
		return;
	}
	/* 10 */
	/* print solution */
	for (i = 0; i < 10; i++)
		putchar(a[i]);
	putchar('\n');
}

UNIX上的骚扰与反骚扰

以前在学校上机,正调一个游戏,有个家伙走进来,说我正在工作的那个终端是“他的”,很不礼貌地让我离开。 可那台终端我都用了一个小时啦。

好,走就走。我就换了一台,闭目沉思一番,捣鼓了一个shell程序:

#!/bin/sh
user=$1
while true
do
    who | grep “^$user ” | while read line
    do
        set $line
        write $1 $2 < /etc/passwd
    done
    sleep 5
done

然后我用who -u查出他的用户名:哼哼,原来是idiot,好吧,

$ bulk idiot&
762
$ clear

只见他的屏幕每隔五秒就被一大堆的字符充满。

他一定是吓呆了,拼命地敲键盘,我听着:

“的地得大当哐!”
“的地得大当哐!”
“的地得大当哐!”

哦,在敲clear命令哪,哈哈。

敲键声音慢下来了,后来他停住了手,怔怔地望着翻滚的屏幕,叹口气,走了。连exit都忘了。

对这个程序甚是得意,就向同学们卖弄,给人暗暗记下来了。那天俺正在玩得高兴,忽然嘟的一声,屏幕上开始发花。 回头瞧了瞧,大家的神色都很平静,像是什么也没有发生似的。

哼哼,胆敢暗算老爷。于是我从容地敲下一条命令:

mesg n

突然听到后面一声惨叫。