[阅读]不要轻易屈服

来源: 你不是个天生的失败者

1965年,一位名为马丁•塞里格曼(Martin Seligman)的科学家开始了电击狗的实验。
他试图扩展巴甫洛夫——这可是个能够让狗在听到铃铛响的时候分泌唾液的家伙——的研究范围。塞里格曼想把研究引向另外一个方向,当他摇铃的时候提供给狗的不是食物而是电击。为了让它们保持不动,他在实验的过程中用狗项圈限制了它们的活动。

在狗被建立了条件反射之后,塞里格曼把它们放进一个大箱子里,这个大箱子里有一个低矮的栅栏将它一分为二。实验者设想如果他们摇铃(并不电击),狗将会跳过栅栏以逃脱电击,但结果它并没有这么做。它只是坐在那里做好被电击的准备。于是他们决定试试铃响后电击。结果狗仍然只是坐在那里并且承受了电击。当他们把一只之前从来未被电击的狗放在盒子里,然后电击它——结果它跃过了栅栏。

文章提到了“习得性无助”,我们常常在接连不断的失败后,开始习惯失败,并且放弃挣扎,放弃自己的权利,开始逃避问题,我们会相信事实已经如此,并且不会因为我们所做的有任何改变,我们感到无助,孤独,却不知道其实是我们自己放弃了掌握自己命运的机会。

那么究竟该怎么做?一个很简单的道理,不要轻易屈服。

不轻易屈服,要慢慢学会掌握自己的节奏,做一些自己喜欢做的事情,给自己考虑多一些选择,多相信自己一些。

要明白你绝不是天生的失败者,也许没有那么聪明,但是也不至于这么脆弱。别轻易放弃,整理好自己的思绪,在拼搏一把。

标签为 , , , , | 留下评论

[ZZ]Picasa在linux下不能启动的解决办法

Google推出了很多Linux下的服务,下午的时候装上Picasa发现不能用,以为是Fedora15有很大的调整,没有折腾。
晚上Google了一下,发现解决办法:

安装wine后,sudo cp /usr/bin/wine-preloader /opt/google/picasa/3.0/wine/bin/wine-preloader

此外还有:

sysctl -w vm.mmap_min_addr=0 并且在rc.local 里面设置为启动变量 的方法,不过感觉比较凶险没试。

原文:http://www.heqq.info/2011/05/picasalinux.html

发表在 照片 | 标签为 , , , | 留下评论

APUE习题2.3 —— sysconf 的使用和调整

守护进程在运行后常做的一件事情是关闭当前所有打开的文件。代码如:

#include 

for (i = 0; i

我们希望使用POSIX.1的OPEN_MAX来提高代码可移植性, (OPEN_MAX 表示系统设置的能打开的最大文件数)

#include 

for (i = 0; i

但是有可能会出现系统未设置OPEN_MAX值的情况,sysconf会返回-1导致for循环根本不会运行,这里编写小程序。
PS: 根据书后习题,添加了当OPEN_MAX被系统缺省设置为LONG_MAX的情况,如果是那样的话,会浪费大量时间。

/* *
 *
 *	CHANGE CODE 2-4 IN APUE ACC FOR LONG_MAX RETURN BY SYSCONF
 *
 *	APUE TEST 2.3
 *
 *	MIUC 2011.06.26
 *
 * */

#include 
#include 
#include 
#include 

#ifdef OPEN_MAX
static long openmax = OPEN_MAX;
#else
static long openmax = 0;
#endif

#define OPEN_MAX_GUESS 256

long open_max(void)
{
	if (openmax == 0) {
		errno = 0;
		if ((openmax = sysconf(_SC_OPEN_MAX)) < 0) {
			if (errno == 0) 
				openmax = OPEN_MAX_GUESS;	/* it's indeterminate */
			else {
				printf("sysconf error for _SC_OPEN_MAX\n");
				return -1;
			}
		} else 
		if (openmax == LONG_MAX) openmax = OPEN_MAX_GUESS; /* LONG_MAX is too long , waste time */
	}
	return openmax;
}

int main()
{
	printf("openmax : %ld\n", open_max());
	return 0;
}

发表在 C, 编程 | 标签为 , , , , | 留下评论

此文章使用ScribeFire发布!

 ScribeFire是Firefox下的一款插件,用于博客文章的编写和发布。
 拥有自动上传图片的功能,在Linux使用比较方便。

 

标签为 , , | 留下评论

关于const pointer 的测试

睡前无聊看了下APUE的习题,测试下const pointer,详细信息看注释

#include 


int main()
{
	int a = 3;
	const int * b = &a;

	//	*b++;  compile access, run like *(b++)
	//	(*b)++ compile error ,  *b can not edit

	printf("%d\n", a);


	int c = 3;
	// int const * d = &c;  compile access, 'int const' like 'const int'

	int * const d = &c; 	

	//*d++;   //  compile error, d can't change

	printf("%d\n", c);


	int e[2] = {3, 4};

	const int * f = e;

	// f[0]++;   error, *f can not change
	
	// f[1]++;   error, *(f + 4u) can not change


	return 0;

}



发表在 C, 编程 | 标签为 , | 留下评论

【Gnome3 Extention weather】Gnome3 天气插件错误修正

今天闲来装上Gnome3的天气插件,遇到一些问题,这里简单写一些。
gnome-shell-extension-weather

1. 编译安装时遇到 Makefile 提示缺少符号,仔细查看config时候的输出,发现一个Error,安装Glib2-dev后正常
2. 安装插件后,可以在 /usr/share/gnome-shell/extension/下找到,或者在 ~/.local/share/. ooxxx 下面
3. 发现插件显示和yahoo正确的气温不符,仔细看了下js代码,找到GET 的url,发现yahoo 那边传过来的今天详细天气数据都错了。
4. 测试了下语法可行性,因为第二次调用forecast返回的今明天气是正确的,可以临时做以下操作:
A. 交换 刷新今日详细信息 和 刷新今明天气信息 的函数。
B. 在今明天气信息里做判断,预先填充部分今天天气信息。
C. 在今日详细里注释掉重复部分。

ctr+F2 r 重启gnome3 OK

标签为 , , , | 2条评论

[ZZ]清华博士王垠的退学申请

         从此我感觉到了什么叫做研究。这跟我小时候干的那些事情没有什么两样。你在身边发现一个 问题,想知道为什么。然后你就想去获得解决这个问题的知识。你去看书,你去问专家,你上网去搜索。如果没有发现答案,那么好啦,你就可以自己试图去发现为什么,这是最有趣的部分。知道了为什么,就想让这个东西有用处,对人们的生活产生好处。这就是研究。

                                                                                                                —— 文摘

经过深思熟虑,我决定放弃清华大学的博士学位。其中的原因,你们有兴趣的话可以看看下面的文章。这就是我的一生与中国教育的故事。一个用血和泪换来的教训。

清华梦的粉碎—写给清华大学的退学申请 2005.9.22

继续阅读

发表在 网络 | 标签为 , , | 留下评论

Eclipse下使用 Winpcap

1. 下载Winpcap开发包,在主页选择 Winpcap –> Dev…

2. 解压,方法一,对应文件直接复制到Eclipse使用的GCC编译器文件夹下,如MinGW\include\.. Lib文件同理

                 方法二,在Eclipse的编译选项里添加-i include.

3. 查看官方文档,在开发包的Doc里有,选择 Using WinPcap in your programs 查看文档信息。

4. 文档提示要添加preprocessor definitions,Project –> Pro… –> C/C++ Build –>Setting –> GCC C compiler –>symbols , 添加 WPCAP HAVE_REMOTE

5. 复制官方的第一个实例,编译运行。

 

—-  MinGW 下 Winpcap编译不通过的问题解释 —-

You can replace your localtime_s call with:

localtime_r(&local_tv_sec, &ltime);

(Note the swapped arguments.)

Also, replace your scanf_s call with scanf.

localtime_s() and scanf_s() are Microsoft-specific extensions, and are not available in MinGW

发表在 C, 编程 | 标签为 , , , | 留下评论

[推荐]Linux C编程一站式学习

虽然一直觉得”一站式”的称号有些过分,不过这篇文档作为 Linux操作手册 还是很好的。

《Linux下C编程入门》就是一片不错的PDF文档

标签为 , | 留下评论

[转载]可变参数宏

作者:Gavin Shaw(综合整理) 更新日期:2006-08-22
来源:upsdn.net

在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:
#define pr_debug(fmt,arg…) \
printk(KERN_DEBUG fmt,##arg)
用可变参数宏(variadic macros)传递可变参数表
你可能很熟悉在函数中使用可变参数表,如:

void printf(const char* format, …);

直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中。

C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数宏就像下面这个样子:

#define debug(…) printf(__VA_ARGS__)

缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。例如:

Debug(“Y = %d\n”, y);

而处理器会把宏的调用替换成:

printf(“Y = %d\n”, y);

因为debug()是一个可变参数宏,你能在每一次调用中传递不同数目的参数:

debug(“test”); //一个参数

可变参数宏不被ANSI/ISO C++ 所正式支持。因此,你应当检查你的编译器,看它是否支持这项技术。

用GCC和C99的可变参数宏, 更方便地打印调试信息

gcc的预处理提供的可变参数宏定义真是好用:

#ifdef DEBUG
#define dbgprint(format,args...) \
fprintf(stderr, format, ##args)
#else
#define dbgprint(format,args...)
#endif

如此定义之后,代码中就可以用dbgprint了,例如dbgprint("aaa %s", __FILE__);。感觉这个功能比较Cool  :em11:

下面是C99的方法:

#define dgbmsg(fmt,...) \
             printf(fmt,__VA_ARGS__)

新的C99规范支持了可变参数的宏

具体使用如下:

以下内容为程序代码:

#include <stdarg.h> #include <stdio.h>

#define LOGSTRINGS(fm, …) printf(fm,__VA_ARGS__)

int main() {      LOGSTRINGS("hello, %d ", 10);      return 0; }

但现在似乎只有gcc才支持。

可变参数的宏里的‘##’操作说明

带有可变参数的宏(Macros with a Variable Number of Arguments)

在1999年版本的ISO C 标准中,宏可以象函数一样,定义时可以带有可变参数。宏的语法和函数的语法类似。下面有个例子:

#define debug(format, …) fprintf (stderr, format, __VA_ARGS__)

这里,‘…’指可变参数。这类宏在被调用时,它(这里指‘…’)被表示成零个或多个符号,包括里面的逗号,一直到到右括弧结束为止。当被调用时,在宏体(macro body)中,那些符号序列集合将代替里面的__VA_ARGS__标识符。更多的信息可以参考CPP手册。

GCC始终支持复杂的宏,它使用一种不同的语法从而可以使你可以给可变参数一个名字,如同其它参数一样。例如下面的例子:

#define debug(format, args…) fprintf (stderr, format, args)

这和上面举的那个ISO C定义的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述。

GNU CPP还有两种更复杂的宏扩展,支持上面两种格式的定义格式。

在标准C里,你不能省略可变参数,但是你却可以给它传递一个空的参数。例如,下面的宏调用在ISO C里是非法的,因为字符串后面没有逗号:

debug ("A message")

GNU CPP在这种情况下可以让你完全的忽略可变参数。在上面的例子中,编译器仍然会有问题(complain),因为宏展开后,里面的字符串后面会有个多余的逗号。

为了解决这个问题,CPP使用一个特殊的‘##’操作。书写格式为:

#define debug(format, …) fprintf (stderr, format, ## __VA_ARGS__)

这里,如果可变参数被忽略或为空,‘##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。如果你在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。象其它的pasted macro参数一样,这些参数不是宏的扩展。

怎样写参数个数可变的宏

一种流行的技巧是用一个单独的用括弧括起来的的 “参数" 定义和调用宏, 参数在 宏扩展的时候成为类似 printf() 那样的函数的整个参数列表。

    #define DEBUG(args) (printf("DEBUG: "), printf args)

if(n != 0) DEBUG(("n is %d\n", n));

明显的缺陷是调用者必须记住使用一对额外的括弧。

gcc 有一个扩展可以让函数式的宏接受可变个数的参数。 但这不是标准。另一种 可能的解决方案是根据参数个数使用多个宏 (DEBUG1, DEBUG2, 等等), 或者用 逗号玩个这样的花招:

    #define DEBUG(args) (printf("DEBUG: "), printf(args))
#define _ ,

DEBUG("i = %d" _ i);

C99 引入了对参数个数可变的函数式宏的正式支持。在宏 “原型" 的末尾加上符号 … (就像在参数可变的函数定义中), 宏定义中的伪宏 __VA_ARGS__ 就会在调用是 替换成可变参数。

最后, 你总是可以使用真实的函数, 接受明确定义的可变参数

如果你需要替换宏, 使用一个 函数和一个非函数式宏, 如 #define printf myprintf。

发表在 C, 编程 | 标签为 , | 留下评论