分类目录归档:分享

独乐乐不如众乐乐。

那个充满激情的岁月

那些年,我们一些为了BBS(网上论坛)而疯狂。为此,曾经刷在线时间(类似QQ刷太阳等级),动手在服务器上写了一个程序。作为留念,现决定低调开源。

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <time.h>

#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>
//#include <iconv.h>

#define LOCKFILE "/var/run/bbs4gzhu.pid"

#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)


int                 lockfile;                  /* 锁文件的描述字 */
int 		    exit_flag = 0;


#define BUFFER_SIZE	409600
#define FORMHASH_SIZE	16
#define USERNAME_SIZE	128
#define PASSWORD_SIZE	128
#define SID_SIZE	64
#define AUTH_SIZE	128

int		    background = 0;
int 		    interval = 15;
char 		   *cookiepath = "";
char 		   username[USERNAME_SIZE] = "";
char 		   password[PASSWORD_SIZE] = "";
char		   *host = "bbs.gzhu.edu.cn";
short 		   port = 80;


static void
flock_reg ()
{
    char buf[16];
    struct flock fl;
    fl.l_start = 0;
    fl.l_whence = SEEK_SET;
    fl.l_len = 0;
    fl.l_type = F_WRLCK;
    fl.l_pid = getpid();
 
    //阻塞式的加锁
    if (fcntl (lockfile, F_SETLKW, &fl) < 0){
        perror ("fcntl_reg");
        exit(EXIT_FAILURE);
    }
 
    //把pid写入锁文件
    ftruncate (lockfile, 0);    
    sprintf (buf, "%ld", (long)getpid());
    write (lockfile, buf, strlen(buf) + 1);
}

void
daemon_init(void)
{
	pid_t	pid;
    	int     fd0;

	if ( (pid = fork()) < 0)
	    perror ("Fork");
	else if (pid != 0) {
        	fprintf(stdout, "bbs4gzhu&&Info: Forked background with PID: [%d]\n\n", pid);
		exit(EXIT_SUCCESS);
    	}
	setsid();	/* become session leader */
	chdir("/tmp");		/* change working directory */
	umask(0);		/* clear our file mode creation mask */
    flock_reg ();

    fd0 = open ("/dev/null", O_RDWR);
    dup2 (fd0, STDIN_FILENO);
    dup2 (fd0, STDERR_FILENO);
    dup2 (fd0, STDOUT_FILENO);
    close (fd0);
}


static int 
is_running()
{
    struct flock fl;
    fl.l_start = 0;
    fl.l_whence = SEEK_SET;
    fl.l_len = 0;
    fl.l_type = F_WRLCK;
 
    //尝试获得文件锁
    if (fcntl (lockfile, F_GETLK, &fl) < 0){
        perror ("fcntl_get");
        exit(EXIT_FAILURE);
    }

    if (exit_flag) {
        if (fl.l_type != F_UNLCK) {
            if ( kill (fl.l_pid, SIGINT) == -1 )
            perror("kill");
            fprintf (stdout, "bbs4gzhu&&Info: Kill Signal Sent to PID %d.\n", fl.l_pid);
        }
        else 
            fprintf (stderr, "bbs4gzhu&&Info: Program not running.\n");
        exit (EXIT_FAILURE);
    }


    //没有锁,则给文件加锁,否则返回锁着文件的进程pid
    if (fl.l_type == F_UNLCK) {
        flock_reg ();
        return 0;
    }

    return fl.l_pid;
}
static void
signal_interrupted (int signo)
{
    exit (EXIT_SUCCESS);
    exit_flag = 1;
    fprintf(stdout,"\nbbs4gzhu&&Info: Interrupted. \n");
}
static void show_usage()
{
	printf("auto online for bbs.gzhu.edu.cn \n\
options: \n \
	-b --background. run in background. mostly this is for service mode. \n\
	-e --exit. quit the running program in background \n\
	-i --interval value(in second). interval time between online request. default value is 15 seconds. \n\
	-h --help. show this usage message. \n\
	-c --cookiepath. specifies the file containing the cookies for online request. \n\
	-u --username. username for login in the bbs. \n\
	-p --password. md5 of the password, used for login in the bbs. \n\
	--host. host for auto online. default value is \"bbs.gzhu.edu.cn\" \n\
	--port. the port with site. default value is 80. \n");


}

static void 
init_arguments(int *argc, char ***argv)
{
    /* Option struct for progrm run arguments */
    static struct option long_options[] =
        {
        {"background",  no_argument,        &background,    'b'},       
        {"exit",      no_argument,  &exit_flag,              'e'},
        {"interval",         required_argument,  &interval,              'i'},
        {"help",         no_argument,  0,              'h'},
        {"cookiepath",         required_argument,  NULL,              'c'},
	{"username", required_argument, NULL, 'u'},
	{"password", required_argument, NULL, 'p'},
	{"host", required_argument, NULL, 2},
	{"port", required_argument, NULL, 1},
        {0, 0, 0, 0}
        };

    int c;
    while (1) {

        /* getopt_long stores the option index here. */
        int option_index = 0;
        c = getopt_long ((*argc), (*argv), "bei:hc:u:p:",
                        long_options, &option_index);
        if (c == -1)
            break;
        switch (c) {
            case 0:
               break;
            case 'b':
                background = 1;
                break;
            case 'e':
                exit_flag = 1;
                break;
	    case 'i':
                interval = atoi(optarg);
                break;
            case 'h':
                show_usage();
                exit(EXIT_SUCCESS);
                break;
	    case 'c':
		cookiepath = optarg;
		break;
	    case 'u':
		strncpy(username, optarg, USERNAME_SIZE);
		break;
	    case 'p':
		strncpy(password, optarg, PASSWORD_SIZE);
		break;
	    case 2:
		host = optarg;
		break;
	    case 1:
		port = atoi(optarg);
		break;
            case '?':               
                exit(EXIT_FAILURE);
                break;
            default:
                fprintf (stderr,"Unknown option character `\\x%x'.\n", c);
                exit(EXIT_FAILURE);
        }
    }
}

void PANIC(char *msg);
#define PANIC(msg)  {perror(msg); abort();}
int getitem(const char *str, char *buffer, const int size, const char *start, const char end);

int tcp_connect(const char *host, const short port);
struct sockaddr_in getaddr(const char *host, const short port);
void loadcookies(const char *filename, char *buffer, const int size);
int 
code_convert(char *from_charset, char *to_charset,
             char *inbuf, size_t inlen, char *outbuf, size_t outlen);

int parse_username(const char *str, char *buffer, const int size);
int parse_formhash(const char *str, char *buffer, const int size);
int parse_sid(const char *str, char *buffer, const int size);
int parse_auth(const char *str, char *buffer, const int size);
int parse_parse_cookies(const char *str, char *buffer, const int size);
int parse_welcome_msg(const char *str, char *buffer, const int size);
int parse_return_msg(const char *str, char *buffer, const int size);
int parse_error_msg(const char *str, char *buffer, const int size);

int login(const char *username, const char *password, char *cookies, const int size);
int send_request(const int sockfd, const char *url, const char *header, const char *data, char *buffer, const int size);
int check_http(const char *response, const int size);
int online(const char *cookies);
char *gettime();

int
main(int argc, char *argv[])
{
	int ins_pid;
	char cookies[BUFFER_SIZE];

	init_arguments(&argc, &argv);

	lockfile = open (LOCKFILE, O_RDWR | O_CREAT , LOCKMODE);
	if (lockfile < 0){
		perror ("Lockfile");
		exit(EXIT_FAILURE);
	}

	if ( (ins_pid = is_running()) ) {
		fprintf(stderr,"bbs4gzhu@@ERROR: Program already "
				    "running with PID %d\n", ins_pid);
		exit(EXIT_SUCCESS);
	}

	signal (SIGINT, signal_interrupted);
	signal (SIGTERM, signal_interrupted);

	bzero(cookies, sizeof(cookies));
	if(strlen(cookiepath) > 0) {
		loadcookies(cookiepath, cookies, sizeof(cookies));
		if(strlen(username) <= 0) {
			if(parse_username(cookies, username, sizeof(username)) <= 0) {
				if(parse_sid(cookies, username, sizeof(username)) <= 0) {
					strcpy(username, "unknown");
				}
			}
		}
	} else {
		if(strlen(username) <= 0) {
			strcpy(username, "nobody");
		}
	}

	printf("current username: %s \n", username);

	if(background)    daemon_init();

	while(1) {
		printf("%s logging...", gettime());
		fflush(stdout);
		if(!login(username, password, cookies, sizeof(cookies))) {
			sleep(interval);
			continue;
		}
		printf("\n");
		while(online(cookies)) {
			printf("%s online...\r", gettime()); fflush(stdout);
			sleep(interval);
		}
		printf("%s offline...it will auto retrying!\n", gettime());
	}

	return 0;
}/* ----------  end of function main  ---------- */
char *gettime()
{
	static char str[64];
	struct tm *local;
	time_t t;
	t = time(NULL);
	local=localtime(&t);
	sprintf(str, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec);
	return str;
}
int check_http(const char *response, const int size)
{
	char buffer[16];
	if(size <= 16) return 0;
	if(strstr(response, "HTTP/1.1 200 OK\r\n") == NULL) {
		strncpy(buffer, response, 15);
		buffer[15] = 0;
		printf("%s bad status:%s\n", username, buffer);
		return 0;
	}
	return 1;
}

void loadcookies(const char *filename, char *buffer, const int size)
{
	int bytes_read;
	FILE *fd = fopen(filename, "r");
	if(fd == NULL) {
		PANIC("loadcookies");
	}
	bytes_read = fread(buffer, 1, size, fd);
	buffer[bytes_read - 1] = 0;
	
	while(bytes_read--) {
		if(buffer[bytes_read] == '\r') buffer[bytes_read] = ' ';
		if(buffer[bytes_read] == '\n') buffer[bytes_read] = ' ';
	}
	
	fclose(fd);
}

int send_request(const int sockfd, const char *url, const char *header, const char *data, char *buffer, const int size) 
{
	int bytes_read = 0;
	char request_buffer[BUFFER_SIZE];
	if(data != NULL) {
		sprintf(request_buffer, "POST %s HTTP/1.1\r\nHost: %s:%d\r\nReferer: http://%s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n%s\r\n\r\n%s", url, host, port, host, strlen(data), header, data);
	} else {
		sprintf(request_buffer, "GET %s HTTP/1.1\r\nHost: %s:%d\r\nReferer: http://%s\r\n%s\r\n", url, host, port, host, header);
	}

	//printf("%s\n", request_buffer);

	/* 发送数据 */
	send(sockfd, request_buffer, strlen(request_buffer), 0);

	/* 接收缓存 */
	bzero(buffer, sizeof(size));

	/* 接收 */
	bytes_read = recv(sockfd, buffer, size, 0);

	//printf("%s\n", buffer);

	return bytes_read;
}

int login(const char *username, const char *password, char *cookies, const int size) 
{
	int sockfd;
	int bytes_read;
	char buffer[BUFFER_SIZE];
	char header[BUFFER_SIZE];
	char formhash[FORMHASH_SIZE];
	char formdata[BUFFER_SIZE];
	char sid[SID_SIZE];
	char auth[AUTH_SIZE];
	char msg[BUFFER_SIZE];

	/* 先获取登录页面 */
	sockfd = tcp_connect(host, port);
	bytes_read = send_request(sockfd, "/logging.php?action=login&inajax=1", "", NULL, buffer, sizeof(buffer));	
	close(sockfd);
	if(check_http(buffer, bytes_read) == 0) return 0;
//	printf("%s\n", buffer);
	
	/* 若被列入黑名单,则等待3分钟后再试 */
	if(strlen(strstr(buffer, "\r\n\r\n")+4) <= 120) {//这个值一般在99左右。
		bytes_read = parse_error_msg(buffer, msg, sizeof(msg));
		if(bytes_read > 0 && strstr(msg, "\n") == NULL) {
			printf("Error:%s . Try 15m later..\r", msg);	
		} else {
			printf("Error:unknown. Try 3 minute later..\r", msg);
		}
		fflush(stdout);
		sleep(3*60);
		return 0;
	}
	/* 解析formhash */
	bytes_read = parse_formhash(buffer, formhash, sizeof(formhash));
	if(bytes_read <= 0) return 0;

	/* 解析SID */
	bytes_read = parse_sid(buffer, sid, sizeof(sid));
	if(bytes_read <= 0) return 0;

	strcat(cookies, "hLR_sid=");	strcat(cookies, sid);	strcat(cookies, ";");

	/* 构造header */
	sprintf(header, "Cookie: %s\r\n", cookies);

	/* 构造登录表单 */
	sprintf(formdata, "formhash=%s&loginfield=username&username=%s&password=%s&questionid=0&answer=&cookietime=2592000", formhash, username, password);

//	printf("%s %s\n", header, formdata);
	
	/* 提交登录请求 */
	sockfd = tcp_connect(host, port);
	bytes_read = send_request(sockfd, "/logging.php?action=login&loginsubmit=yes&inajax=1", header, formdata, buffer, sizeof(buffer));
	close(sockfd);
	if(check_http(buffer, bytes_read) == 0) return 0;

	/* 解析欢迎消息 */
	bytes_read = parse_welcome_msg(buffer, msg, sizeof(msg));
	if(bytes_read <= 0)  {
		/* 解析登录返回信息 */
		bytes_read = parse_return_msg(buffer, msg, sizeof(msg));
		if(bytes_read > 0) printf("Failed Info:%s\r", msg);
		return 0;
	}
	printf("Login Info:%s\r", msg);
	fflush(stdout);

	/* 解析auth */
	bytes_read = parse_auth(buffer, auth, sizeof(auth));
	if(bytes_read <= 0) return 0;	
	strcat(cookies, "hLR_auth=");	strcat(cookies, auth);	strcat(cookies, ";");

	/* 有效时间 */
	strcat(cookies, "hLR_cookietime=2592000;");

	return strlen(cookies);
}

int online(const char *cookies)
{
	int sockfd;
	int bytes_read;
	char buffer[BUFFER_SIZE];
	char header[BUFFER_SIZE];

	/* 构造header */
	sprintf(header, "Cookie: %s\r\n", cookies);

	/* 刷新页面保持在线 */
	sockfd = tcp_connect(host, port);
	bytes_read = send_request(sockfd, "/search.php", header, NULL, buffer, sizeof(buffer));	
	close(sockfd);
	if(check_http(buffer, bytes_read) == 0) return 0;
	
	/* 检测用户凭据是否到期 */
	if(strstr(buffer, "logging.php?action=logout") == NULL) return 0;

	return 1;
}

int parse_error_msg(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "![CDATA[", ']');
}

int parse_username(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "uchome_loginuser=", ';');
}

int parse_formhash(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "name=\"formhash\" value=\"", '\"');
}

int parse_sid(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "hLR_sid=", ';');
}

int parse_auth(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "hLR_auth=", ';');
}

int parse_cookies(const char *str, char *buffer, const int size)
{
	return	getitem(str, buffer, size, "Set-Cookie: ", ';');	
}

int parse_welcome_msg(const char *str, char *buffer, const int size)
{
	return getitem(str, buffer, size, "$('messageleft').innerHTML = '", '\'');	
}


int parse_return_msg(const char *str, char *buffer, const int size)
{
	return getitem(str, buffer, size, "<em id=\"returnmessage\">", '<');	
}


int getitem(const char *str, char *buffer, const int size, const char *start, const char end)
{
	int i;
	char *p = strstr(str, start);
	if(p == NULL) return 0;

	for(i = 0, p+= strlen(start); p[i] &&  i < (size - 1); i++) {
		if(p[i] == end) break;
		buffer[i] = p[i];
	}
	buffer[i] = '\0';
	return i;
}



struct sockaddr_in getaddr(const char *host, const short port)
{
    struct sockaddr_in sin;
    struct hostent *hosts = NULL;

    bzero(&sin, sizeof(struct sockaddr_in));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    if(inet_addr(host) == INADDR_NONE) {
        hosts = gethostbyname(host);
	if(hosts != NULL) {
	    sin.sin_addr = *((struct in_addr*)hosts->h_addr);
	}
    } else {
	sin.sin_addr.s_addr = inet_addr(host);
    }
    return sin;
}

int
tcp_connect(const char *host, const short port)
{

    int     sockfd;
    struct sockaddr_in endpoint;

    endpoint = getaddr(host, port);
  
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) return 0;

    if (connect(sockfd, (struct sockaddr*)&endpoint, sizeof(struct sockaddr_in)) != 0) {
	close(sockfd); 
	return 0;
    }

    return (sockfd);
}

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  code_convert
 *  Description:  字符串编码转换
 * =====================================================================================
 */
int 
code_convert(char *from_charset, char *to_charset,
             char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
    memcpy(outbuf, inbuf, inlen < outlen ? inlen : outlen);
/*
    iconv_t cd;

    cd = iconv_open(to_charset,from_charset);

    if (cd==0) 
      return -1;
    memset(outbuf,0,outlen);

    if (iconv (cd, &inbuf, &inlen, &outbuf, &outlen)==-1) 
      return -1;
    iconv_close(cd);
*/
    return 0;
}


我和乌云

去年听说乌云( http://www.wooyun.com )关停了,一直到现在还是这个状态。现在有两个网站收录了一些乌云关停前的漏洞:http://cb.drops.wiki 以及 https://wooyun.shuimugan.com 最起码还能看到一些东西。当年,大概是2011年,上课老师讲过XSS攻击之后,我就折腾了半年,提交了一些漏洞,然后顺带写了篇论文。毕竟是曾经做过了一些事情,怕时间久远之后自己会忘记,故收录之。

 

其中有两个漏洞,我觉得有必要单独拿出来讲一下,一个是“腾讯将乌云列入黑名单”(http://cb.drops.wiki/bugs/wooyun-2011-03899.html ),另一个是"QQ2011会话密钥泄漏"(http://cb.drops.wiki/bugs/wooyun-2011-02953.html )。先说第一个,重点看评论,这也算是折射出了国内互联网安全之现状吧。特别是大量的中小企业,安全对于他们来说是一种累赘。钱花了,却看不到实际的效果。而大企业,则逐渐重视起来了,这当然是好事。再说第二个,与自己专业学习相结合的一个成果吧。数学在其中所起的作用是核心的。安全的核心,就是纯粹的数学问题。

 

最后,将收录自己提交过的漏洞。

04-05年学习总结

大家好,我叫YZX,今年大二了,是数学学院04级5班的一名平凡学生。在大一期间,我的大学生活过得还算可以。生活上,由于龙洞校区比较小,所以打开水、去饭堂都很方便。工作上,那时我担任了层长和学校社联网络资源部的部委,我自认为自己工作细心,所以层长做得比较好,但部委就一般了。最后说学习方面的总结。
在学习方面,我觉得有的前提就是要处理好生活、工作和学习的关系。这里所谓的“三角”关系,包括时间的安排和分配,事情重要性的定位和利益冲突的处理。
首先,学习方法要正确。这里所说的“正确”,是相对的,不是绝对的。但一般地,应该有,认真听讲,独立思考,按时按质完成作业。这些是共性,个性的也要有。就拿我来说吧,我比较少做笔记,虽说好记性不如烂笔头,但我是这样想的,笔记记多了就突出不了重点和难点。有的人学完了一本书,却写下了两本笔记,固然我很佩服他超强的做笔记能力,但我是不会这样做的。我的个性是少做笔记,多思考,多记忆。我从高中就有这个习惯,学习效果还不错,所以我就坚持了下来。
其次,学习时间要充足。除了正常的上课时间外,每天还要有不少于2个小时的课外学习时间(不包括学习课外书的时间)。做作业,复习,预习,是三步曲。做作业发现问题了,复习就有了针对;复习好了,就为预习打下了基础。我的安排大概是这样的:早上读书,以英语为主;中午休息,或者干些不怎么耗费精力的事情;下午运动,尽量释放自己;晚上学习,可兼顾课外书。这样算好象时间不够喔,没关系。事实上几乎每天我们的课都没排满,在上课时间里,而又没课的话,就可以自习了。这样一来,学课外书的时间还是比较多的。当然,如果你不想看那么多的杂书,也可以做点学生工作,锻炼自己的组织管理能力。
最后,学习精神要集中。有的人经常通宵,从理论的角度我是不赞成的,但只要你可以保证学习精神的状态,我觉得还是可以接受的,毕竟不少伟人都是整天不睡觉的。我对自己的要求是晚上11:30睡觉,6:30起床,中午休息45分钟。因人而异,但睡眠时间最好不少于6个小时,而且中午保证有不少于20分钟的休息。适当的运动可以提高人的精神状态,毕竟身体是革命的本钱。
完了,希望同学们好好学习,天天向上,多拿奖学金。

撰写于:2005-10-30 原文为根据学院要求撰写的学习总结

讲文化也需要文化

讲文化也需要文化

这也许是我上过的最好的选修课了。无论从老师的教,还是从我的学,来说都是最好的。以前上选修课带其他作业来做,觉得是老师在上面讲课妨碍了我做作业;现在带作业来做,觉得是自己影响了自己听课。其实,我之所以选这门课是由于有个忘记叫什么名字的师姐向我推荐的。在此之前,我记得在龙洞也听过老师您的讲座,感觉确实也不错,于是就选了这门课了。
谈了自己为什么选这门课之后也该说下自己对这门课的看法。总的来说,叫受益非浅。我是学理科的,从小就对自然科学很感兴趣。除了目前的专业外,我还不间断地看一些物理,化学,生物,地理,计算机等方面的书籍。但我还记得鲁迅曾经说过,我们不是单靠吃米饭长大的,因此上大学之后我就告诉自己要多看一下文科方面的书。作为基本的文化基础,我看过了小说,诗歌,散文,戏剧等方面的著作,如《童年》、《傲慢的偏见》、《鲁迅杂论》,《红楼梦》、《三国演义》、《茶馆》、《孟子》等。不过由于自己的文学基础差,而且时间上也不允许我话太多的时间去看,所以大多数的书都是一次过的,有的确实写地很好的部分就多读几遍,要是非常好的就背下来。后来我发现,原本很多应该在中学就阅读的名著都没读过,而且还有很多经典的作品更是没去碰过,如果真的一本本去看地话,根本就不可能看完,正如李敖说的那样,书由他来看,我们只要听李敖说就可以了。我想这种间接的取得知识的方法效率是最高的。因此我对这门课的总的看法是,冷东教授您看了很多书,我们听您讲课。
文化的东西很多,特别是将历史也算进去的话就更多了,这就要求我们在取得信息的时候要先加工才可以进入我们的大脑:一是辨真伪,二是提精髓。您说自己是搞历史的,我知道历史界有个考究学的分支,在考究的时候讲究的是“孤证不立”,就是说只有一条证据的不算事实,最起码要有其他证据来证明它,那么它才是比较可信的。所以我对于您所说的内容是当真的,毕竟如果还真要自己去考究的话就不知道要花多少时间和精力了。其次是要筛选精华。书那么多我们看不完,只挑重点的来看又会有所遗漏,那就要面面俱到,于是就要提炼了。可以我很大程度上我是冲着这点来上课的。正如我的题目说的讲文化也需要文化,没文化的人,即使摆在他面前有很多已经分门别类好了的书,也不可能将抽象的文化讲具体,讲清楚。而您讲得很生动具体,有很多是例子说明,想对比其他的课程,他们大部分都是理论的东西,听起来根本就没精神,更不用说主动来上课了。
具体地讲到本课程的教学内容,由于教学评估的原因,我连续有三个星期没来上课了,很是觉得遗憾。其中第一节我记得是讲文化概论,而且还有鸡蛋问题的讨论。某位同学说的,石头不是文化,但人在石头上写上字就是文化了。尽管很多人都认同,我还是有点不同的看法的。石头本来是没有任何内容的,有字在上面就可以说这石头是文化了吗?那么我们说《兰亭集序》是书法文化还是纸张文化呢?,虽然我们不否定纸张也有文化,但我想说明的是主次问题,本末的问题。所以写有字的石头的文化是字的文化,而不是石头文化。自然,如果对石头进行加工制造出石像,那石头本身是可以看作文化的。前面已经说了,我的文化基础差,故也只能凭自己的感觉说话了,权且当作是谬论吧。此后的课程好像还讲了男人和女人的文化。对于昭君,我想起了您所说的一个连长的故事,两者都是牺牲品,都是政治的牺牲品。确实现实在很多人失败之后都将原因归咎于女人,所谓的红颜祸水,说的就是这么一回事吧。在说到全国各地的男人的时候,我想很值得一提的是潮汕男人,他们做事都很有性格。与其相处小段时间后,发现好像有些不妥了,似乎有点自私,然而他们是很团结的,这个我也不多说了,总之就是性格很鲜明了。在学校的BBS上有一精华帖,专门讨论潮汕人的人文精神的,原由或者可以看作是某人发的一张批评潮汕人的帖子。好像有点跑题了!
据我观察得到的结论是,那些搞历史的人,或者是教授级别的人物总是阅历丰富的。如果说从这门课可以得到文化方面的知识的话,那么我得到的不仅仅是这些,起码我还学会了如何对待这些已知的文化,加深了我对“拿来主义”的认识。在接下来的几节课中,您将了几个关于负面文化方面的专题。前一段时间,影视界闹得沸沸扬扬的裸体艺术事件让人都糊涂了。使得我们不得不再次思考,到底什么是艺术?裸体就是艺术吗?我不够资格下什么定义,但最起码我的感觉告诉我,如果人人都叫好的高级艺术,应该不是艺术。对于欣赏人体艺术,首先欣赏者必须心正。心正而后意诚,这样我们看到的才是艺术美,而不是色情。从这个角度来说的话,我并不认为现在绝大部分人都懂得欣赏艺术,这和我国目前教育状况有密切的关系。所以我是坚决反对在公映的影片中包含太过裸露的艺术,至少现在是这样的。因此如何将这些艺术文化推广就很需要技巧了,这些技巧和扎实的文化功底是分不开的。这也再次让我感觉到“讲”文化也需要文化。
最后的两次课讲的是两性文化,就个人爱好来说我不太喜欢,倒是之前的吃人文化吸引人。这也许是因为我也像鲁迅先生那样从历史书中只能看到“吃人”两个字吧。说到吃人的几个原因中,有一个是饥饿。有一个记者想体验一下到底饥饿到吃人的感觉是怎么样的,我也试过一下,不过只是两天没吃东西而已,可就已经差不多要控制不住自己了,后来总算没事。这时我想到教科书上说人有两性:社会性和自然性。从吃人的故事可以看到,吃人是自然性中求生性的最好体现了。于是我想,难道人是披着羊皮的狼?这不也正好验证了现在流行的一句话“钱不是万能的,但没钱是万万不能的。”吗?感慨自己原来终究不过是个禽兽罢了。这也难怪社会的人民运动几乎都是那些“吃人”的人发起的。本不该发表些政治评论的,但也不得不说现在的社会改革,大多数连倡导人都自认是失败的,在吃人边缘的农民问题解决力度不够,反倒是少数的有钱人士拼命争取更好的福利,而更有钱的人则在一边不屑地说“我有能力我有钱,凭什么分给你?”。我记得改革开放的时候,邓小平说是,先让一部分人先富起来,再带动另一部分人富起来。如果把“带动”看作是道德问题的话,那么这跟资本主义国家有什么区别呢?如果不是的话,那么我就是凭这点要你分给我!先不要说在改革开放初期,就算是现在,仍然有已经富起来的人侵占还未富起来的人的命根——土地。为了响应党和国家的号召,他们将自己的东西拿出来支持那些人先富起来,可现在呢?什么都没有呢。除了吃人,还能怎么样?都是我个人看到的个别案例而已,就当是我以偏概全。
不觉,发现自己说了很多废话。很多人告诉我写文章不要看着字数,文化的东西不是用字数可以限制的,然而现在我还是没做到。最后,我对“文化论坛”的看法是,学到的不仅仅是文化,而且是讲文化的文化。至于说建议的话,我觉得可以讲些现代有的以前没有的文化专题,比如说网络文化,游戏文化,校园文化,企业文化等等。

撰写于:2006-11-27 原为选修课程大作业。

关于书的三四事

关于书的三四事

前言
今天去书展了,回来被告知论坛恢复正常了,上来逛逛,看到说书者甚多。于是,不忍也插上一两句,说上三四事。

一事 书的回忆
最早接触到的书应该是命书,就是算命先生用的那一套。可惜那时候尚未识字,自然读不懂太多,只是对于那些八卦和数字的有所了解。然后就是学前班,小学,初中,高中,大学,至今,如此下去地读书。今天本来想买本关于胡适的书,却未能如愿,因为书生不仅百无一用,而且书生是穷困潦倒的。看的书并不多,小学主要是以教科书为主,偶尔看看报纸,看看电视剧,也就是这样,对于书没什么特别的想法,顶多也就是看一些小人书《机器猫》、《老夫子》等。初中了,受到一些损友的影响,每天都去“三味书屋”借书看,就是武侠小说一类的。当然,还是其他的书,不过看得不多,只是随便翻翻,比如言情推理类的。高中,看的书开始多起来了。先是喜欢光顾《小小说》和《微型小说》,每个星期都是追着来看的。再有就是学校的图书馆,去的人不多,似乎成为了我的私人财产。还有去阅览室看杂志。大部分是一些很正规的中学生读物,比如《中学数学月刊》、《一千零一夜》、《鲁宾逊漂流记》、《故事会》等。只有《家》和《鲁迅全集》是比较怪异的,读了很长一段时间,都不得要领,至今已经将这两本书遗弃在地球的某个角落里了。还有《红楼梦》,那是因为参考教材上有节选,觉得有意思,曾经在这上面沉迷过一段时间,最终还好自拔了。
前面是一个阶段,读过的书没什么特别的,就只是胡乱的读,小孩子也不懂得其中的微言大义。还有受到哥哥的影响,对于诗歌的创作也有过一些兴趣,只是很淡很淡。每个月寄到家里的由岭南诗社出版的刊物,也只是偶尔看两眼。我与诗注定是无缘了。至于大学之后至今,算是对于之前的补偿,读的书比较杂乱,用电影《赤壁》里诸葛亮的话来说就是“略懂”。天文地理,历史政治,文学哲理,工程科学,都是浅尝辄止,泛泛看过一些书而已,在这里就不班门弄斧了。这个阶段的读书策略是广度与深度的结合。因为自己理科生,对于文科之类的书自然看得比较少,那就针对这个弱点,专门加强文科书籍的阅读。而理科方面,则就某个方向上的书籍作深度的阅读,这也算是对自己所学专业的负责吧。

二事 我的书
以前看过的书,因为多次搬迁的问题,早就遗失殆尽了,如今宿舍书架上只有几本书:《问卷调查技术与实例》、《Hard times》、《长江流域茶文化》、《风骚》、《中国性研究》、《古文观止》、《数学物理方程》以及一些教科书。今天去书展又买了几本回来。一本是《电脑报2009年合订本》(电脑报我从高中阶段就开始追了,每年都买合订本看,到现在大概有8年了吧),一本是《笔记小品》(买这本书是因为看中了其中的《阅微草堂笔记》,纯属好奇,觉得也挺有意思的),还有一本是袋口小书《诗经》和《中国典故故事》(就是用来解闷用的)。我们常说,书非借不能读。是的,我看过的大部分书都是借的。至于为什么不自己买书,原因前面已经说过了。我有一个别人的梦想,就是在小乡村里开个书店,自己做老板,把书介绍给别人的同时,自己又可以读到很多的书。书是读不完的。
小学时候因为暑假作业的日记事件,让我开始了写摘要报纸的习惯,可惜只坚持了3年,那些记录这一切的文摘小本子已经无法再与我相见了。到后来,又开始了写日志和日记,刚开始的时候也许只是为了和某人赌气,然后不知不觉就写了快4年了。我很羡慕那些从小学就坚持写日记到现在的人,我很佩服他们。

三事 书的疑问
看书总喜欢提些问题出来给自己思考,尽管最近并不一定能找到一个满足自己的答案。今天我就提一个吧,谁有兴趣的可以一起探讨一下。

引用:湖北教育出版社,《长江流域茶文化》,P12
有人主张,中国历史上那些制造边患的民族到了今天已经大多融入中华民族共同体内,因此中国历史上只有内战,而没有侵略,来自东方的南方的西方的敌人,其中包括倭和西方殖民主义统治者,是比较晚的事情。

对于这个观点,季羡林认为,这种说法不能成立;而李敖则是持这样的观点。
其实类似的疑问还有很多,学术的精神就是一种批判的精神,我希望大家读书的时候都可以带着怀疑去读书。最近关于曹操墓的真伪又开始闹了,这样很好,说明还是有人在做学术的,而不是和谐成一个声音了。

四事 书的形式
以前有人讨论过纸质书存在的必要性,结果我就不说了。我现在除了看一些可以翻的书,也会看一些声光化电的书。我不知道这样做对不对,我读书的目标只是为了多了解一些东西,而纸质书提供的资料室有限的,加上声音动画会好一些吧,最好还能去实地考察一番。于是,最近有了出游的计划,先去番禺,再去广州城区,等待时机成熟了再远行。听说武大的樱花是34月份开的,上次错过了,下一次机会会是什么时候呢?纸上得来终觉浅,亲自在樱花烂漫的小道上走一回,感觉一定和书上说的不一样。

后记
To 三变: 今天我看见《秦腔》了。
To Snake: 同样看过《梦里花落知多少》了,今天我看见《兄弟连》、《教父》、《诛仙》、《搜神记》和《狼图腾》了。
To 萧十二郎: 三毛我看过一点,据说后来自杀死掉了。我一开始竟然将这个三毛和《三毛从军记》里的三毛联系在一起了。我也去新华书店蹭书,发现看书的人多,买书的人寥寥无几,原来你也是看书的其中一员。不过因为书店是公家的,我们那边的阿姨一般都不理这事,只要不故意弄坏书就可以了。最后同意你对郭敬明的看法。

本来想和大家写些读后感交流的,就如萧十二郎说的那样,码字太辛苦了,如有机会大伙可以开了座谈会,一起聊聊自己看过的一些书,应该也是不错的。

撰写于:2010/8/24 2:08 原记于:bbs.gzhu.edu.cn

开篇语

新年即将到来。公众号抽筋,只能发表文字,我也是醉了。
首先,请允许我做个自我介绍。 我是来自西风路小学三年级2班的小学生,大家都叫我小萌,其实我一点都不萌。我希望和别人不一样,所以决定要修行。 修行,就是学习,就是锻炼,就是阅历。
接下来,这个公众号将会记录我的修行过程。比如今天我对某个问题的思考,或者是对某个现象的反思,或者是对某个观点的疑问,等等。
总之,三人行,必有我师。我想知道所有的事情,然后和大家分享。 大过年的,只能手机上码字,这种痛谁能理解。这也算是一种修行吧。

【删减版】思鸡思药思红包v2.0

前言:码过一次,没提交就丢失了,现重写,所以是v2.0。由于字数限制,所以是删减版。

过新年,对于大部分中国人来说,都是要吃鸡肉的。所谓无鸡不成宴,更何况是过年。然而小萌只能对着面前的药在纠结,到底喝不喝。因为根据习俗,年初一喝药是很不吉利的。不过今天我要说的是红包,缘由就是早上我是被手机里“红包来了”的提示声吵醒的。又由于传统的红包已经被人说烂了,所以今天我要说的是电子红包。不过今天我要说的是电子红包的公约。

1.发红包无论金额多少,应该附带上自己真诚的祝福语,切忌留空或者使用系统默认的祝福语;
2.发红包数量可以少于参与人数,如此可以活跃气氛;
3.发红包金额单人不宜太大,以50元以下为宜,当然1分钱也是爱;
4.收红包无论金额多少,都应该以适当的方式表达感谢;
5.遇到有明显指定收红包对象的,非被指定人员不得抢红包;
6.不得给小孩发红包,以示估计他们多关注周围的人,多进行现实的社交活动,从而健康成长;
7.不宜给老年人发红包,他们一般对电子红包不太了解或者比较抵触,这样达不到发红包的初衷;
8.非本人自愿,他人不得强迫或者暗示别人发红包;
9.严禁使用电子红包进行任何违法犯罪的事情,包括但不限于洗黑钱,赌博等;
10.任何本着互相尊重,平等协商的收发红包行为都是鼓励的。

总此十思,红包事业一定能蒸蒸日上,更上一层楼。今天你红包了吗?

一样的不一样,不一样的一样

好的,绕口令开始了:一样的不一样,不一样的一样。一样就是一样,不一样就是不一样。一样是一样,一样是不一样。到底是哪一样?
今天小萌跟大家讨论这个一样的不一样还有不一样的一样。举个栗子,今天跟大人们看电视,说地铁民警为了春运安全,舍小家为大家,很让人感动。类似的还有消防战士,护士姐姐,清洁工阿姨。我差点就流下泪水!突然,一个声音在耳边响起:劳动光荣,职业无分贵贱。那么我还应该被感动吗?
先说,不一样的一样。其实无论什么行业,都会有被人感动的。其实我们被感动的,是这些伟大的劳动者,而不是这些岗位。用心工作,你就可以感动人。比如,能知悉每个学生性格,因材施教的是好老师。打铃上课,打铃下课,这是职业教师。上课一本正经的胡说八道,下课正人君子的衣冠禽兽,这是滚蛋老师。又比如,望闻问切,耐心询问,对症开药,体贴病人,这是好医生。开单检查,看表说话,他问你答,开药神速,这是职业医生。不闻不问,见人开药,三分钟了事,下星期复诊,这是小医生。如此等等。不一样的岗位,一样的用心,就能感动人。
再说,一样的不一样。同样的平凡的劳动,但有些职业就不是那么为人所接受。比如男妇产科医生,男催乳师,当然,还有学生。作为一名小学生,我无法接受学生作为我的职业。只要还是学生,对社会的贡献就永远被人忽略。三好学生上不了感动中国。
我是西风路小学的一名小学生,谁和我一样,谁又和我不一样?