星期一, 十一月 06, 2006

和内核一起做些事情:/proc

首先,我尝试搬抄一下使用/proc文件访问内核的方式。这个方式在以前的书本上写要注册一个proc_dir_entry结构体的内容,然后注册等。但是现在这些情况有所变化。如果只是向用户输出(也就是用户只读),那么只需要写一个读取的方法就好了,注册的方法很简单。

下面用代码说明:
static int procfile_read(char *buffer,
char **buffer_location,// Buffer
off_t offset, // current offset to read
int buffer_length,
int *eof,
int *data)
{
static char mybuffer[128];
static int readcount = 0;
int len;

if(offset > 0){
return 0;
}

readcount ++;
len = sprintf(mybuffer, "This is %d time to read me.\n", readcount);
*eof = 1;
return len;
}
代码主要来自这个实例,虽然是2.4内核的,可是效果在999之内还是不错的。
需要注意的是读取函数的参数发生了变化。不过,我的编译器还是一再提醒我注册时指针参数不匹配的问题,不知道指的是哪一个参数?

注册:
create_proc_read_entry("hello", 0, NULL, procfile_read, NULL);
注销:
remove_proc_entry("hello", NULL);
这里为了简单都采用了默认的参数,直接放到了/proc/hello这个位置上。

采用文件名来操作的确比使用inode方便的多了。

星期四, 十一月 02, 2006

Linux 下驱动程序的开发简单入门步骤

2.6内核的初学者笔记

第一步,下载一个内核源代码并编译安装。
这里需要注意的问题是需要将自己根目录所在的硬盘的驱动和文件系统的驱动全部直接编译到内核中。
否则在启动的时候会出现问题,在装入根目录的阶段停止不前。
建议是第一次宁可多选择一些,如SICI和ATA-2(并口硬盘),以及SATA等直接编译进系统。
而Ext2和Ext3也同样处理。
注意不要将grub菜单中原来系统的启动内核项目取消,也不要急着删除原来的旧内核和模块文件。
如果menu.lst中对原内核和驱动的引用为没有版本号的连接文件,如/boot/vmlinux等,
请改为绝对的文件名。因为一会儿安装新内核的时候这些连接会改变。
这样可以防止万一新的内核不能启动的情况下还可以恢复使用。
此外,优化内核的编译设定,这也算是一种乐趣。
千万不要忙着删除内核代码,这里是很大的文档宝库。

第二,参照书本些一个最为简单的模块。
就是能在进入和退出内核的时候显示两条日志即可。比如:


#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int hello_init(void)
{
printk(KERN_ALERT "Hello, linux kernel module\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, I've created a linux kernel module sucessfully\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jason Xing <xsinuz<at>someone.at.prv<");

建议是最好能按照Linux内核的传统代码风格编写。这个可以在内核中找到很多demo。
注意代码和2.4的不同,比如必须自己注册入口和出口方法。

第三,编译这个模块。
请仔细了解本版本下内核编译的方法。有用的资料依然是内核中那些已经存在的Makefile。
可以照着写一个:

obj-m := hello-1.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

之所以能写的如此简单是由于Kbuild的帮助。

然后执行make编译:

make
make -C /lib/modules/2.6.18/build SUBDIRS=/home/jason/projects/test/kernel-dev/hello1 modules
make[1]: Entering directory `/usr/src/linux-2.6.18'
CC [M] /home/jason/projects/test/kernel-dev/hello1/hello-1.o
Building modules, stage 2.
MODPOST
CC /home/jason/projects/test/kernel-dev/hello1/hello-1.mod.o
LD [M] /home/jason/projects/test/kernel-dev/hello1/hello-1.ko
make[1]: Leaving directory `/usr/src/linux-2.6.18'


得到了内核模块文件 hello-1.ko!

第四,测试。
这里需要知道三个命令:lsmod,insmod, rmmod。从名字上也大体应该知道他们的作用了。
不过这个简单的模块并不能用显示出来。
在插入内核后我们可以通过dmesg看到我们写入的第一条信息。卸除后可以看到第二条信息。
注意:这里需要管理员权限才可一对内核操作。


第五,下一步。
买一本《Linux内核驱动开发》也许是必要的。不过有点贵,而且是英文的,真的要考虑一下。

----
参考文献

星期三, 十月 25, 2006



这里列出了PIC单片机重的一些常用程序和方法

1. 关于org的使用例子:

在这个例子中用了两次org伪指令,ORG 0 和 ORG 1FFH, 前者是程序开始的地方。
而后者的位置是芯片复位的位置。

ORG 0 ; 程序从零地址开始
MAIN:
;..............
GOTO MAIN ; 主循环
;-----------------------------
ORG 1FFH
GOTO MAIN
;-----------------------------
END ;程序结束


2. BCD码转换

;--方法 1--
;----------------------------------------------------------
; Function: 转换为BCD码显示和存储
;----------------------------------------------------------
BCD2:
MOVLW 8;
MOVWF COUNT_BIT ;循环左移计数器置8
CLRF BCD_BUF1 ;清除缓冲器
MOVF DISPLAY_NUM,W
MOVWF BCD_BUF2
LOOP1:
RLF BCD_BUF2,1 ;二进制数转换成BCD码(以便显示)
RLF BCD_BUF1,1
DECFSZ COUNT_BIT,1 ;左移8次
GOTO ADJUST
MOVF BCD_BUF1,W
MOVWF DISPBUF
MOVF DISPBUF,W
RETURN
ADJUST:
MOVLW 3 ;二进制转BCD的调整
ADDWF BCD_BUF1,W ;每次移位后都检查低四位LSD+3是否大于7
MOVWF BCD_SUM
BTFSC BCD_SUM,3
MOVWF BCD_BUF1
MOVLW 30H
ADDWF BCD_BUF1,W ;如果是则再加3,否则不加。
MOVWF BCD_SUM
BTFSC BCD_SUM,7
MOVWF BCD_BUF1 ;接着再将高四位MSD作相同处理
GOTO LOOP1

;--方法 2--
;----------------------------------------------------------
; Function: 8位二进制数转换成2位BCD码
; 转换为两个BCD码:BCD_MSD,BCD_LSD
;----------------------------------------------------------
BIN2BCD:
CLRF BCD_MSD
MOVWF BCD_LSD
GETENTH:
MOVLW 10
SUBWF BCD_LSD,0
BTFSS STATUS,C
GOTO OVER
MOVWF BCD_LSD
INCF BCD_MSD,1
GOTO GETENTH
OVER:
RETURN

3. 延时函数


;--- 所用的临时变量----
DELAYH EQU 023H
DELAYL EQU 024H
;----------------------------------------------------------
; Function: 延时
;----------------------------------------------------------
DELAY:
MOVLW 0FFH
MOVWF DELAYH
DELAY_LOOP:
MOVLW 0FFH
MOVWF DELAYL
DELAY_LOOP1:
NOP
DECFSZ DELAYL
GOTO DELAY_LOOP1
DECFSZ DELAYH
GOTO DELAY_LOOP
RETURN


4. 中断处理程序的设计


【一】 ;中断的入口地址
ORG 0004H
GOTO INTSERVE

然后在INTSERVE地址写入判断中断入口的代码:
INTSERVE: MOVWF W_TEMP ;保存寄存器
SWAPF STATUS,W ;注意使用SWAPF指令,才不会影响Z标志位。
BCF STATUS,RP0
MOVWF STATUS_TEMP
这样W,STATUS分别保存到W_TEMP,STATUS_TEMP两个地方了。

【二】 ;中断的出口处理:恢复W,STATUS两个寄存器
;所有的中断处理结束后都必须这样处理。
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,1
SWAPF W_TEMP,W
RETFIE ;中断返回

【三】 ;中断的判断中断源,分别进入特定的处理程序
BTFSC PIR1,ADIF ;A/D转换中断
GOTO ADINTSERV
BTFSC PIR1,RCIF ;串口接收中断
GOTO RCINTSERV
BTFSC PIR1,TMR2IF ;定时器2中断
GOTO TIMER2SERV
GOTO RETFIEO ;直接到中断的出口处理

【四】 ;特定中断的处理
TIMER2SERV ;定时器2的中断处理
BCF PIR1,TMR2IF ;清除中断标志位
……
GOTO RETFIEO ;直接到中断的出口处理



5. A/D转换的程序设计


【一】各个寄存器的使用

ADRESH : A/D转换结果高字节
ADRESL : A/D转换结果低字节
ADCON0 : 控制A/D操作
ADCON1 : 控制A/D引脚

(1)ADCON0 地址:1FH
Bit7 Bit0
+-------+-------+------+------+------+------------+----+------+
| ADCS1 | ADCS0 | CHS2 | CHS1 | CHS0 | GO/DONE- | -- | ADON |
+-------+-------+------+------+------+------------+----+------+
__________/ | |
| | +-在工作或者被关闭
| +--1:正在进行A/D转换
+---A/D时钟选择,00,01,10分别表示2,8,32分频,或者11用内部RC振荡器

CHS2, CHS1,CHS0用来选择模拟通道

(2)ADCON1 地址:9FH
Bit7 Bit0
+-------+-----+-----+-----+-------+-------+-------+-------+
| ADFM | --- | --- | --- | PCFG3 | PCFG2 | PCFG1 | PCFG0 |
+-------+-----+-----+-----+-------+-------+-------+-------+
| ______________________/
| |
| +-端口配置
++- 1:右移,ADRESH高六位读作零
+- 0:左移,ADRESL低六位读作零

(3)ADRESH(地址:1EH),ADRESL(地址:9EH)

(4)TRISA : PORTA的方向寄存器设置
选择好A/D端口号后,必须在A/D转换开始之前设置号TRISA,
使得A/D输入通道为输入态。

【二】当A/D转换结束
A/D转换完成了以后,10位的A/D结果存放在ADRESH,ADRESL,同时GO/DONE-将被清零。
而且,A/D转换中断标志位ADIF位将被置一。

【三】实现A/D转换的步骤
1)设置A/D转换模块
a、对模拟引脚、基准电压、数字I/O(ADCON1)进行设置
b、选择A/D输入通道 ADCON0
c、选择A/D转换时钟 ADCON0
d、打开A/D转换模块 ADCON0
2)如果需要A/D转换中断功能,设置A/D中断
a、对A/D转换完成标志位ADIF清零。
b、对A/D转换中断使能位ADIE置一。
c、对PEIE位置一。
d、对全局中断使能位GIE置一。
3)所需等待采样时间
4)对GO/DONE-置一,启动A/D转换。
5)等待A/D转换完成,有两种方法:
a、软件查询GO/DONE-位的状态是否为1
b、等待A/D转换完成的中断。
6)读入A/D结果 ADRESH,ADRESL。如果为中断处理就清除ADIF位。



星期一, 十月 02, 2006

OS说:要更多并发,于是有了多线程

这里我将说明一下自己在使用pthread遇到的一些问题,顺便作为这里长期空白的补丁。

先做一个广告好了。我的系统是ubuntu6.06 Dapper Drake,相信现在使用这个发行版本的用户数量是最为庞大的。而且由于Debian的强大支持,这个系统在安装和使用中都是非常适合入门,以及拥有相当Linux知识的人士使用。不过默认情况下是没有gcc和make这些东西的,只有一个链接器ld被安装。所以,之前请安装它们两个软件。(用sudo执行apt-get install gcc make 即可。)不过如果你需要边听着mp3边工作的话,请自己搜索一下让rhythmbox支持它的方法吧。

网络知识资源:pthread入门 这是我强力推荐的站点。
IBM的developerWorks的thread专栏 下面也有很多关于Linux的线程问题的讨论,用心挖掘会了解很多有益的东西的。
当然,如果手边有一本像样的pthread书籍的话那就更加完美了。

现在可以创建你的C文件,并include像是unistd.h, stdio.h, 当然还有pthread.h这些文件。

如何创建线程?
只用这一句即可:
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
不过里面的参数却要说明一下。
首先是thread1这个参数,它是pthread_t类型的,作为返回值告诉我们创建的这个线程编号。而print_message_function和message1则是线程函数和它的入参了。返回值表示成功与否。

然后呢?
当然是线程开始工作。但是主线程,也就是创建它的那个线程该怎么办呢?它的使命结束了吗?
我们可以在创建一个线程后结束自己,然后看看会怎么样。
int main()
{
pthread_t threadid;
int ret;

ret = pthread_create( &threadid, NULL,
print_message_function, (void*)msgarg);
//pthread_join(threadid, NULL);
printf("I, the father process(%d) is exitting..\n", getpid());
exit(0);
}

void *print_message_function( void *ptr )
{
sleep(5);
puts((const char*) ptr);
return NULL;
}
结果就是完全看不到线程输出的信息,查看进程表的结果也同样说明了这个问题。主线程的结束将终结所有子线程。
这和在网络上看到一些言论不太一样,据报道有人在主线程先于子线程结束的情况下发现整个进程变成了“僵尸”
不过这里没有发现这种情况。

但是一般意义上,子线程的退出应该是可以预料的,比如使用一个全局的符号或者消息来通知它们。而不是如此粗暴的关闭程序,这样我们无法全面释放任务线程所占用的资源,这时候就需要在上面一段中被注释的那一行代码了--使用pthread_join来等待创建的线程结束。
(关于资源的占用和释放的主题请关注pthread_cleanup_push和pthread_cleanup_pop的相关内容。)

(待续……)

星期二, 八月 22, 2006

Grigory Perelman获得菲尔兹奖

Grigory Perelman对解决庞加莱猜想做出了绝对性的工作,而他超凡的个性更是让人佩服的五体投地。相比与国内浮躁的学术界,他的确可以称作一代大师。

反观国内在号称中国人解决了该猜想时那种可笑的举动,是不是会被很多人在此时偷偷耻笑呢?
记者就此问题请教数学家杨乐。这位数学家说,如果按百分之百划分,那么美国数学家汉密尔顿的贡献在50%以上,提出解决这一猜想要领的俄罗斯数学家佩雷尔 曼的贡献在25%左右。“中国科学家的贡献,包括丘成桐、朱熹平、曹怀东等,在30%左右。”杨乐说,在这样一个世纪性、世界性的重大难题中,中国人能发 挥三成的作用,绝非易事,是很大的贡献。
--《东方早报》
对庞加莱猜想的证明作出不可磨灭贡献的另一位数学家是俄罗斯的佩雷尔曼。佩雷尔曼一直致力于微分几何与代数拓扑的研究。2003年,他公布了一个研究报告,声称证明了由瑟斯顿在25年前提出的有关三维流形的“几何化猜想”,而庞加莱猜想正是后者的一个特例。

  虽然佩雷尔曼勾勒出了庞加莱猜想的证明要领,但他的整个论证过程尚存不少漏洞,距离真正破解尚待时日。

  为庞加莱猜想“封顶”的最后冲刺历史地落在了中国数学家的肩上。……

--《光明日报》

一些新闻文章被翻译成英文放在网上。在那些文 章里,两位中国数学家的成就得到强调,而佩雷尔曼的功绩则以不够显著的方式被提及。新华通讯社2006年6月21日的一篇文稿里,佩雷尔曼的名字甚至根本 没有出现。媒体报道是从丘成桐于2006年6月3日在北京召开新闻发布会开始的,当时丘成桐宣布了曹怀东和朱熹平的工作。丘成桐说他的话被某些媒体错误地 引用了,故对那些话不负责任……
--中科院的新闻
狂热的时代有一次到来了吗?立此存据!

星期二, 七月 25, 2006

基于Lex工具的HTTP协议的分析

www.krugle.com上面搜索HTTP协议处理的代码,发现可以借鉴别人的地方很多。
比如这个叫做YAFFA的FTP软件中关于HTTP协议处理部分的代码很有意思。


首先看看简单的,如何从服务器上读取一行。
这个函数中他使用了一个叫做
httplex的函数,然后按照它返回的状态进行文法分析。
Lintyp HTTParser::read_line(Response **output)
{
Lintyp retdat = NOTYPE;

int val;
val = httplex();
while(val != CRLF)
{
// cout << "Val: "<< lastval = val;
if(retdat == NOTYPE)
{
switch(val)
{
case STATUS_HTTP:
*output = new StatusLine();
retdat = STATUS_LINE;
break;
case EH_CNT_LENGTH:
*output = new ContentLength();
retdat = CONTENT_LENGTH;
break;
case GH_TRFENC:
*output = new TransferEncoding();
retdat = TRANSFER_ENCODING;
break;
case EH_CNT_TYPE:
*output = new ContentType();
retdat = CONTENT_TYPE;
break;
case EH_CNT_ENCODING:
*output = new ContentEncoding();
retdat = CONTENT_ENCODING;
break;
default:
retdat = ANYTYPE;
break;
}
}
if(retdat == ANYTYPE)
val = httplex();
else
val = CRLF;
}
if(lastval == CRLF && val == CRLF)
{
retdat = MESSAGE_BODY;
}
lastval = val;

return retdat;
}
很显然,httplex就是一个Lex词法分析工具。这也是我所梦寐以求的方法——用Lex和Yacc实现协议的语法分析和处理,这样就可以大大简化程序中对于烦琐的协议进行分析的过程,可以专心处理内容。
将状态和内容生成一些专用的对象返回,如ContentLenght、ConthentTyep等等,这样协议内容就脱离了文本转换为对象方式了。

下面就是对应的Lex文件,而状态定义在httplexer.h中用枚举定义在同一个命名空间HTTPLexer_space中。
%{
#include "httplexer.h"
using namespace HTTPLexer_space;
%}
%option yylineno
%option noyywrap
delim [ \t]
cre [\r]
lfe [\n]
crlf {cre}{lfe}
sp [ ]
slash [/]
colon [:]
scolon [;]
equal [=]
coma [,]
ws {delim}+
letter [A-Za-z.\"\\\-\(\)\<\>\*\&\+\~]
digit [0-9]
number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)?
token ({letter}|{digit})*
%%
{ws} {return(SP);}
{slash} {return(SLASH);}
{colon} {return(COLON);}
{scolon} {return(SEMI_COLON);}
{coma} {return(COMA);}
{crlf} {return(CRLF);}
{equal} {return(EQUAL);}
"HTTP" {return(STATUS_HTTP);}
"Cache-Control" {return(GH_CCONT);}
"Connection" {return(GH_CONNECTION);}
"Date" {return(GH_DATE);}
"Pragma" {return(GH_PRAGMA);}
"Trailer" {return(GH_TRAILER);}
"Transfer-Encoding" {return(GH_TRFENC);}
"UPGRADE" {return(GH_UPGRADE);}
"Via" {return(GH_VIA);}
"Warning" {return(GH_WARNING);}
"Accept-Ranges" {return(RH_ARANGES);}
"Age" {return(RH_AGE);}
"ETag" {return(RH_ETAG);}
"Location" {return(RH_LOCATION);}
"Proxy-Authenticate" {return(RH_PRXAUTH);}
"Retry-After" {return(RH_RETRYA);}
"Server" {return(RH_SERVER);}
"Vary" {return(RH_VARY);}
"WWW-Authenticate" {return(RH_WWWAUTH);}
"Allow" {return(EH_ALLOW);}
"Content-Encoding" {return(EH_CNT_ENCODING);}
"Content-Language" {return(EH_CNT_LANGUAGE);}
"Content-Length" {return(EH_CNT_LENGTH);}
"Content-Location" {return(EH_CNT_LOCATION);}
"Content-MD5" {return(EH_CNT_MD5);}
"Content-Range" {return(EH_CNT_RANGE);}
"Content-Type" {return(EH_CNT_TYPE);}
"Expires" {return(EH_EXPIRES);}
"Last-Modified" {return(EH_LASTMOD);}
{number} {return(NUMBER);}
{token} {return(TOKEN);}
%%
void http_set_parser(const char *str, int nr) {
YY_BUFFER_STATE ybst;
ybst = yy_scan_bytes(str, nr);
yy_switch_to_buffer(ybst);
}
void http_reset_parser(void) {
yy_delete_buffer(YY_CURRENT_BUFFER);
}


可见对于这种文法简单的协议,使用成熟的工具和相当的方法,实现还是非常简单的。

再看看如何使用这个按行读取的方法并处理这些对象呢?
// Read a respons from the server.
void HTTP::get_response(void)
{
HTTParser parser(fcin);
ResponseCoupler *a;
response_list.clear();
Lintyp lintp = NOTYPE;
while(lintp != MESSAGE_BODY)
{
a = new ResponseCoupler();
try {
lintp = a->type = parser.read_line(&(a->response));
}
catch(StandardException *a)
{
cout << *a->getErrMsg() << "\n";
throw new protoerr("HTTP: Failed to read response.", NONFATAL_EXCEPTION);
}
response_list.push_back(a);
}
}
是读取正文之前的内容,分析后放入队列中保存。使用的时候如此简单,如果你不太介意效率的问题,那么这个真是一种惹人喜欢的方法。

星期六, 六月 10, 2006

整理我在cnblog上的日志文件的脚本


#!d:/apps/perl/bin/perl
#
# 整理我在cnblog上的日志文件的脚本。
# 下载这些使用的是wget,按照catalog_2006.html这样每年的文件列表进行二级深度
# 镜像,就可以得到所有的文件爱女了。然后按照标题整理一下即刻。
#
# 需要在这个目录下建立一个blogs的目录存放生成的文件。

open(BLOGS, "dir *.html /b|") || die("$!");
while(<BLOGS>){
if (not /^[0-9]+\.html/) {
next
}
crab_blog($_);
}
close(BLOGS);


sub crab_blog{
my $filename = shift;
my ($title, $content);

open(FILE, "$filename") || die("blog open $!");

my($begin_content) = 0;
while(<FILE>){
if (/<title>(.*)<\/title>/) {
$title = $1;
next;
}
if (/<div class=\"entity\">/) {
$begin_content = 1;
next;
}
if (/<p class=\"diaryFoot\">/) {
$begin_content = 0;
last;
}
if ($begin_content){
$content .= $_;
}
}
close(FILE);

$title =~ s/--叶泉-自由随笔//;

$filename = $title;
$filename =~ s/\\\/\*\.<>\?/_/g;
open(FILE, ">blogs/$filename.html") || die("blog write $!");
print FILE <<EOPF;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>$title</title>
</head>
<body>
EOPF
;
print FILE $content;
print FILE <<EOPF;
</body>
</html>
EOPF
;
close(FILE);
};

星期二, 五月 16, 2006

Ajax来了

我对这个新的技术本来是没有什么想法的。原因是很早以前写JavaScript的时候一定会伴随着IE左下角黄色的感叹号的网页总是不是那么让人感到放心。后来Google的缘故开始看了看Ajax的介绍,就是异步方式的HTTP请求,JS处理DOM的系统。我总是对Js的编写存在疑虑,一是如何调试,而且现在的Ajax还牵扯到前后台两部分同时进行分析和设计的问题。二是兼容的问题,浏览器太多了,鬼也就见多了,总不能像C编写程序一样到处都是#ifdef-#else-#endif的奇怪语法。
最早的时候先找到了SAjax,这是一个PHP(还有其他语言)的一个简单的Ajax框架,将Ajax调用便成类似异步RPC的方式进行。然后看见了DOJO,一个庞大内容也无比丰富的纯Js库,包含非常强大的组件,但是不包括服务器端。网上最推荐的是Prototype,比较DOJO它的工作非常的底层,但是对Js语言来说却是一个非常伟大的进步,大大改善了Js薄弱的面对对象开发能力。唯一的问题就是文档的缺乏和组织上的不明确,让我这样的入门者实在是找不到东南西北,所以到现在还在摸索中。
为什么要使用Ajax呢?难道就是模仿Google?这个肯定不是原因。我看这个是受同学实际需要的启发:如何让网站增进客户的互动能力,从而得到更多客户的信息,或者让客户得到我们更多的信息。这对於变化万千的市场需求波动是非常有力的工具。以往留言簿和评论这样的措施解决了一些问题,但是对于客户的要求还是过高。直白、及时、响应、变化的面对面交流是柜台服务的特点也是网络销售需要学习的。别忘了中国有多少人会使用Email呢?我怀疑有没有两千万。
但是Ajax的缺陷也一一暴露出来。特别是开发的时候需要框架上设计有前瞻性,可实施性。调试需要的时间很长,而且问题很难在简单的Alpha测试中全部体现。逻辑和代码覆盖测试也很难进行。这一切和缺少适当的Js调试、测试工具有一定的关系。运行中,由于Js请求往往要求及时快速,所以对服务器的要求很高。比如GMail中鼠标移动中需要经常性的发出请求。而且以GET发出的XMLHTTPRequest对log的占用很高,几天的运行就会有很大的日志文件,对服务器日志分析工作的压力也是蛮大的。

星期一, 五月 01, 2006

移植uC/OS-II到DSP(TMS320LF2407)

主要的问题就是如何知道堆栈的变化情况。
  1. C函数调用前后的堆栈变化 。(看看编译后的汇编就知道了)
  2. 中断中堆栈的变化,特别是C编写中断程序时的情况。(看看I$$SAVE 和 I$$REST )
  3. 一个刚开始运行,但是还没有进入的C函数堆栈情况。(编一个用汇编调用C的例子看看)
只要知道了这些就可以进行移植的工作了。

其实来,主要的难点时对OS实现原理的理解。比如什么时候发生调度,调度的时候需要那些工作。这一部分主要在OSCtxSw()实现的软件中断,和定时器中断中调用的OSIntExit()->OSIntCtxSw()的过程中发生。而OSIntCtxSw和OSCtxSw的不同在DSP上只有栈顶位置的不同。所以,问题都归咎到了堆栈的处理上了。没有办法,只有汇编重要部分的代码,看看到底压入了什么内容,计算好距离即可。


这里先说一说DSP初始化堆栈的情况,也就是最前面说的第三种堆栈情况-当中断发生在写入了参数也调用了CALL,但是还没有执行这个C函数的那一刻,堆栈到底有什么内容。这就是函数OSTaskStkInit需要处理的内容了。
// -- 模拟C函数运行时堆栈的情况 --
*stk++ = (UWORD)pdata; // 入口参数
*stk++ = (UWORD)c_int0; // 旧PC

// -- CPU寄存器内容备份 --
*stk++ = (UWORD)0x2000; // ST1
*stk++ = (UWORD)0x2200; // ST0
*stk++ = (UWORD)0x0000; // 累加器ACC高16位
*stk++ = (UWORD)0x0000; // 累加器ACC低16位
*stk++ = (UWORD)0x0000; // 乘法寄存器高16位
*stk++ = (UWORD)0x0000; // 乘法寄存器低16位
*stk++ = (UWORD)0x0000; // 临时寄存器TREG

*stk++ = (UWORD)ptos + 4; // AR0
*stk++ = (UWORD)0x0000; // AR2
*stk++ = (UWORD)0x0000; // AR3
*stk++ = (UWORD)0x0000; // AR4
*stk++ = (UWORD)0x0000; // AR5
*stk++ = (UWORD)0x0000; // AR6
*stk++ = (UWORD)0x0000; // AR7

// -- 硬件堆栈备份--
*stk++ = (UWORD)task; // 中断返回地址 = 任务其始地址
*stk++ = (UWORD)c_int0;
*stk++ = (UWORD)c_int0;
*stk++ = (UWORD)c_int0;
*stk++ = (UWORD)c_int0;
*stk++ = (UWORD)c_int0;
*stk++ = (UWORD)c_int0;
这里完成第三种堆栈情况的仿真工作,此时stk就是这个任务需要的AR1(SP)数值。(这里面的c_int0是调试种为了防止堆栈错误写的C语言入口,便于在出错的时候系统重新初始化。)

剩下的任务就非常简单了,只需要看着那本RMB$79的书,完全按照要求编写OSCtxSw函数即可。值得注意的就是保存和返回任务我们需要使用“CALL I$$SAVE”和“B I$$REST”来实现。而OSIntCtxSw的实现则更加简单,只需要参照你的定时器中断函数调用时栈顶到I$$SAVE调用后栈顶之间的距离,用AR1减去这个值,然后跳入到OSCtxSw在“CALL I$$SAVE”之后的内容即可。

接下来的事情就是编写你的C语言主函数和任务等等东西了。非常的简单,不过定时器的周期需要按照OS_TICKS_PER_SEC的设定设置好。然后顺序调用
OSTimeTick(); // uC/OS的系统定时
OSIntEnter();
OSIntExit(); // OSIntCtxSw包含enable()调用
这三个函数即可。
值得注意的地方是:OSIntExit()将直接从中断处理中通过I$$REST进入到优先级最高、准备好的任务中,所以之后的代码不会被执行。

其他的就和x86平台上没有什么区别了。不过这里你只能通过一些二极管什么的显示一下活动的任务,比较惨吧!

星期日, 四月 16, 2006

用Perl和SQLite做一个简单的Wiki

说到语言的精妙,我想到只有Perl。
说到数据库的小巧,我想到的只有SQlite。

如此美好的组合,再加上WIki这个奇思妙想的设计,就组成了我这个周末的一个活动:用Per语言作为CGI方式运行,以SQLite3作为数据库,建立一个小巧可人的Wiki服务器程序。到底做什么用途呢,我还真的没有想好,只是大体上实现了一些最最基本的功能。


默认的首页是名叫Welcome的页面。



像其他页面一样,你可以编辑它,然后保存。这样你的起始页面就改变了。




文章列表将分页显示数据库中所有的内容







搜索是按照标题进行Like方式检索得到的文章列表。











好像已经可以用了吧,而且代码非常的简单,主要就用了CGI和DBI::SQLite模块模块。
不过现在存在的问题在编码的处理上。我全部使用UTF-8编码来写作,可是在投递中文的时候就会在个别中文字符上出现问题。比如“程序”的“程”字,就会变成“?‹”。可能在Perl编码设置和运作方式上我还存在一些问题。不知到怎么办了。

星期四, 四月 06, 2006


My firstly finished Sudoku . Posted by Picasa

星期日, 四月 02, 2006

PostgrSQL 数据库C语言中嵌入SQL

/*
** PostgrSQL 数据库 C语言中 嵌入SQL
**
** 使用ECPG程序对此进行编译得到C语言文件,然后再用-lecpg编译连接
** 得到可执行程序。运行的时候需要libecpg.dll文件和libpq.dll等其他库。
** comerr32.dll, krb5_32.dll, libpgtypes.dll, pthreadGC2.dll
*/
#include
#include
EXEC SQL INCLUDE SQLCA;

#define TEST_NO_SQL_ERROR (sqlca.sqlstate[0]=='0' && sqlca.sqlstate[1]=='0' && sqlca.sqlstate[2]=='0' && sqlca.sqlstate[3]=='0' && sqlca.sqlstate[4]=='0')
#define TEST_SQL_ERROR (!TEST_NO_SQL_ERROR)

int main(){
/* 变量的声明 */
EXEC SQL BEGIN DECLARE SECTION;
int nAge;
varchar vcName[80];
EXEC SQL END DECLARE SECTION;

/* 连接数据库 */
EXEC SQL CONNECT TO mydb@localhost USER test;
if (TEST_SQL_ERROR){
puts("连接数据库: Failed!");
puts(sqlca.sqlerrm.sqlerrmc);
exit(-1);
}
puts("连接数据库:OK!");

/* 使用游标来读取多个数据 */
EXEC SQL BEGIN;
EXEC SQL DECLARE CURPP CURSOR FOR select name, age from tb_people;
EXEC SQL OPEN CURPP;
while(TEST_NO_SQL_ERROR){
EXEC SQL FETCH NEXT FROM CURPP INTO :vcName, :nAge;
if (TEST_NO_SQL_ERROR){
printf("%s is %d old.\n", vcName.arr, nAge);
}else{
puts(sqlca.sqlerrm.sqlerrmc);
break;
}
}
EXEC SQL CLOSE CURPP;
EXEC SQL COMMIT;

/* 断开连接 */
EXEC SQL DISCONNECT;

return 0;
}

星期五, 二月 24, 2006

Django入门:一个留言簿(一)

Django时下真是名声在外了,连我这个几乎不怎么开发Web,没有使用过任何WWW Framework的小人物都对这种中间件相当的向往。limodou的学习记录是我比较喜欢去的一个地方。可惜limodou写那个记录的Django版本比较老,我常常发现不能找到自己需要import的包在哪里。所以如果想跟随当前,还是去人家Django官方的文档看看。
说起来,Django就是对Web开发中最常见而且比较烦琐的一些环节进行了包装。比如:数据库的对象操作,HTTP协议的处理,网页的模板化处理等。而Django对一些常见的操作也进行了包装,比如增加、修改、列出一组数据集合。并且提供了强大的网站管理工具。按照文档上面的入门例子,用户需要编写的代码实在是非常的少。

一个Django工程的建立和运行都需要执行它的一个管理脚本:
开启一个工程,并建立相关的目录和必须的文件:
django-admin.py startproject myproject
初始化数据库
django-admin.py init
等等,可以参看没有任何参数时候脚本报告的帮助清单。

开启一个工程之后就要开始建立数据库的结构了。可能在你还没有对你的这个程序有一个完全的认识之前就要建立数据库的确是非常让人难受的事情。还好我们还有可以重新建立数据结构的机会。数据对象在这里叫做meta。放在你工程的/apps/<程序>/models/目录下面。
比如下面的一段代码:

# -*- coding: utf-8 -*-
from django.core import meta

class Admin(meta.Model):
"管理员账号"
name = meta.CharField(maxlength = 64)
password = meta.CharField(maxlength = 16)

def __repr__(self):
return self.name

class META:
admin = meta.Admin(
fields = (
('用户名', {'fields': ('name',)}),
('身份确认', {'fields': ('password',)}),
),
)
上面建立了一个数据对象描述了一个管理员所需要保存的资料。__repr__函数用于在显示这个对象的时候有一种比较直接明了的显示。而内部类META,则用于Django内部的管理界面。

写好了所有的数据描述。执行
django-admin.py install guestbook
在你配置的数据库中就可以发现你描述的数据已经变成了具体的表,存在了数据库中了。

-------
下面给出留言簿具体的数据部分:guestbook.py
# -*- coding: utf-8 -*-
from django.core import meta

class Admin(meta.Model):
"管理员账号"
name = meta.CharField(maxlength = 64)
password = meta.CharField(maxlength = 16)

def __repr__(self):
return self.name

class META:
admin = meta.Admin(
fields = (
('用户名', {'fields': ('name',)}),
('身份确认', {'fields': ('password',)}),
),
)

class Message(meta.Model):
"一个留言记录的数据库记录"
subject = meta.CharField(maxlength = 256)
name = meta.CharField(maxlength = 64)
email = meta.EmailField(blank = True)
pub_date = meta.DateTimeField('date published')
content = meta.TextField(maxlength = 4096)
from_addr= meta.IPAddressField()
reply = meta.TextField(maxlength = 4096, blank = True)

def is_replied(self):
return not (len(self.reply) == 0)

is_replied.short_description = '已经回复?'
subject.short_description = '主题'

def __repr__(self):
return self.name + " said: " + self.subject

class META:
admin = meta.Admin(
fields = (
(None, {'fields': ('subject', 'name', 'pub_date')}),
('内容', {'fields': ('content', 'email', 'from_addr'), 'classes': 'collapse'}),
('回复', {'fields':('reply',), 'classes': 'collapse'}),
),
list_display = ('subject', 'pub_date', 'is_replied'),
list_filter = ['pub_date'],
search_fields = ['subject', 'content'],
)





星期四, 二月 23, 2006


A mind map demo Posted by Picasa

A make-up ad Posted by Picasa

使用Picasa2上传的一个图片


使用Picasa2上传的一个图片(发现这个东西支持中文实在是问题!) Posted by Picasa

星期四, 二月 16, 2006

水果的药用价值

摘抄老中医对各种水果的评价。他的大体结构是:“名称 总体评价 秉性/适宜体质 主要成份及功效 小食谱”。

苹果 “一日一苹果,  医生远离我”
脾胃虚寒型的慢性腹泻需用锡纸包裹、煨熟吃 “含最多果糖、有机酸、果胶、微量元素  

  1. 果胶:属于可溶性纤维,促进胆固醇代谢、降低胆固醇水平、促进脂肪排出;  
  2. 微量元素:钾扩张血管、有利高血压患者;锌缺乏会引致血糖代谢紊乱与性功能下降。  
  3. 可条理肠胃:纤维物有助排泄;对腹泻也有收敛作用。  
  4. 苹果皮+数片姜煮水:可止呕吐。  
  5. 可减梨之寒,强化润肺润胃。“ 秋季润肺糖水:苹果/梨数个+1两百合+石斛15克+南北杏9克
木瓜 万寿果
味甘、性平、微寒 “蛋白分解酵素。  

  1. 所含酵素近似人体生长素,多吃保持青春。  
  2. 蛋白酵素有助分解蛋白质和淀粉质,对消化系统大有裨益。  
  3. 助消化之余能消暑解渴、润肺止咳,对感冒咳痰、便秘、慢气管炎有帮助。
  • 熟木瓜+柿饼煎服,可治气喘性咳唆  
  • 熟木瓜去皮+蒸熟+蜜糖,治肺燥咳嗽  
  • 生木瓜缴汁或晒干研粉,可驱虫。  
  • 木瓜煮鱼尾或猪蹄,促进乳汁分泌。
西瓜
“性质寒凉”  
胃寒、孕妇、身体略燥热底子寒虚之人不宜。  
强壮实热之人适宜。
不慎吃多了见晕作闷,可含一片生姜解救。

“  百果之宗  清热佳品“
“性质带寒”  
体质虚寒、寒咳者不宜生吃,必须隔水蒸、或放汤、或与药材清炖。  

  • 天鹅梨、香梨、贡梨偏凉;皮粗的沙梨和进口啤梨更寒凉。 吃多了咽喉痛
  • 南北杏、梨(带寒)+银耳(偏凉)煮糖水,治声沙口干。但较适合本身带实热、或虚火需要清热之人。  
  • 南北杏、梨(带寒)+川贝母9克煮糖水,强补肺气。  
  • 南北杏、梨(带寒)+百合煮糖水,养阴安神。
芒果 “不宜多食 有药用价值”
性平味甘、解渴生津。  
性质带湿毒、有皮肤病或肿瘤、避免进食(湿疹/流脓/妇科病/水肿/脚气--湿者再进食芒果会加重)  
未熟的可能治过敏  哮喘禁忌。
少数的富含蛋白质水果之一,多吃易饱。  

  1. 益眼、润泽皮肤。  
  2. 解毒消滞、降压。  
  3. 止呕,治晕船浪。孕妇作呕。“
猕猴桃(奇异果)
防癌有道“ 咳嗽时进食可能会加重病情。

  1. 维生素C比苹果高20-80倍,比柑橘高5-10倍,这种抗氧化物可有效阻止致癌物质亚硝酸安在人体内形成。  
  2. 调中下气。滋补强身、清热利尿、清胃润燥。  
  3. 治内热心烦、防治坏血病、高血压、心血管病、癌症等。  
  4. 对于医治消化道癌症和肺癌别有一手。

菠萝 “生津和胃“

“性质湿热。气管或支气管敏感的病人戒食。

浸盐水让部分有机酸分解,减少其毒。

  1. 富含纤维,能刺激肠道。具收敛作用,酌量不会腹泻可帮助止泻。  
  2. 健脾胃、固元气。菠萝脘在胃中分解蛋白质、帮助消化。  
  3. 吃后感到喉部不适就是过敏症状、需喝一杯淡盐水稀释致敏成分。

榴莲 虚寒进补用 性质热而滞  

  • 癌症或康复者、皮肤病或阴虚肝热者戒口  
  • 体质虚寒者吃可壮阳助火。  
  • 产后虚寒者可做补品。

吃过量可立即吃几个山竹化解

荔枝 “惹火尤物 壮阳“

  • 实热阴虚火旺者(皮肤病、口干舌燥、失眠)不宜吃。  
  • 痛风、糖尿病者不宜多吃。  
  • 体质平和或虚寒者可饱享。

吃过量者,吃性寒的西瓜或喝一碗荷叶冬瓜水

柠檬 “女性水果”

胃病者不宜柠檬茶。

  1. 柠檬汁+暖水+盐=祛痰功效、比橙和橘强。  
  2. 感冒初期:柠檬+蜜糖冲水=舒缓喉痛/减少喉咙干涸不适  
  3. 可安胎[宜母子]、美颜、去斑、防止色素沉着、改善子宫前倾、子宫韧带松垂甚至闭经  
  4. 清柠可降血压胆固醇、改善心血管。

龙眼 “滋补非人人宜吃“

  • 内热、痰火不应多吃。
  • 痛风者吃过量引发关节肿痛。  
  • 本身带热哮喘者吃引发肺热咳嗽  
  • 燥热、皮肤病、胃胀不宜多吃。

晒干后养血安神、对于心血不足(无端心跳、易倦者)失眠者有很大疗效。

无花果 “健康大使 可治溃疡”

果肉含钙、磷、镁、铜、锰、锌、硼多种必须矿物质和微量元素。  

  1. 主清利咽喉、开胸膈、清痰化滞  
  2. 五痔肿痛、煎汤频熏之、取效
  3. 加速伤口复原、对消化道溃疡有疗效。
  4. 医治痔疮出血、对大肠癌有辅助作用。
  5. 含抗氧化物、抗衰老。
  6. 含果胶和纤维、吸附肠道内有毒物质,有排毒作用。
  7. 与苹果一样,双向调节肠胃,脾虚泻滞吃可止泻;便秘吃润肠通便。
  8. 培干磨粉有助胃溃疡愈合。“

葡萄 “补血固肾冠军  强壮体质“

性质较樱桃平和,肺虚咳嗽、胎动不安、肾炎患者特别适合吃葡萄或葡萄汁补身。

皮和果肉、核都很有益,所含维E、B12、P、C对心脏甚有利。

水蜜桃 补血养颜

性温/  多吃会令人体内热过盛、胃胀胸闷

  1. 含丰富铁质、增加人体血红蛋白数量。
  2. 含较多脂肪和蛋白质
  3. 桃肉美颜
  4. 桃仁活血化淤、平喘止咳,但过量和行经期间不宜。
  5. 桃树流出来得树胶是一味糖尿妙药,可强壮滋补、调节血糖水平。
  6. 桃花可煮水洗面、沐浴、饮用。
  7. 桃子榨汁+淘米水洗面润泽肌肤。

星期三, 二月 08, 2006

知识分子关于中国经济的一些言论

房地产是否有泡沫?什么叫小康,小康概念要拥有两套房,应该鼓励中国人购买两套房,在家住一套,出去休假时住另一套。房价涨得快是正常现象,说明居民的收入多了。以前投资的房产升值了,是好事。   ——厉以宁(北京大学光华管理学院院长,全国政协经济委员会副主任)

      如果有机会向总理建言,我一定要说“三个不要轻言”,不要轻言经济过热,不要轻言房地产泡沫,也不要轻言人民币升值。中国现代化的标志是北大教授拥有轿车和别墅。       ——萧灼基(北京大学经济学院教授)

      保守地说,今后10年,中国的大城市,无论是上海、北京还是南京,房价要涨3倍;大胆地说,10年房价要涨5倍以上。       ——王建(国家发展改革委员会中国宏观经济学会研究员、常务副秘书长)

      说房地产炒过头,那是胡话。       ——李扬(中国社会科学院金融研究所所长)
      注:欧美的百姓用收入的30%购买房产,中国百姓却要付出70%。整个2004年,内地商品房平均销售价格同比上涨14.4%,涨幅比上年提高10.6%个百分点,其中商品住宅价格上涨15.2%。萧灼基并没有别墅,王建、李扬说此话时是2005年1月,不到半年,房价应声而落。       

国有资产怎样改制?在改革过程中,国有资产的流失是必然的,不必大惊小怪。只要把企业财产经营权改为“法人财产权”,国有企业的一切难题就迎刃而解了。为了达到改革的目标,必须牺牲一代人,这一代人就是3000万老工人。8亿多农民和下岗工人是中国巨大的财富,没有他们的辛苦哪有少数人的享乐,他们的存在和维持现在的状态是很有必要的。中国应该用就业促进就业,因为有一批人就业了,赚了钱他马上会花掉,另外的人就有了赚钱的机会。       ——厉以宁

      许多国有资产是冰棍,不用也会自然消失的,只有运作起来才会产生效益。管理层收购国企,实现了产权和管理权合一的效果。即使是“零价格”甚至负价格转让,国家也不一定吃亏,因为很多国企都有很多的负债和职工负担,这就好比你带着女儿改嫁和你单身一个人改嫁时的谈判能力肯定是不一样的。       ——张维迎(北京大学光华管理学院副院长,北京大学网络经济研究中心主任和北京大学工商管理研究所所长)

      国有企业迟早要卖。既然如此,得先卖效益好的,不然,以后效益不好就没人要了。       ——樊纲(中国国民经济研究所所长,“京城四少”之一)

      不妨把这些公共财产看成无主之物,谁先把它拿来卖,这公共财产的产权就算他的。你如果正好当一家国有企业的厂长,就可以和主管部门合伙把这家工厂卖给有钱人,产权就变成私有了。       ——盛洪(北京天则经济研究所所长)

第一,应将属于ZF或者国有企业集团的上市公司的股票平均分发给中国的人民。这些股票大约价值每人4000元人民币。对于农村的家庭来说,这些钱相当于三年的收入。       
第二,大型国有企业(比如银行、铁路、电讯、水利和采矿公司)应该尽快上市。尤其是那些拥有采矿权的公司上市时应该包含采矿权,并且地方ZF不应该把这些采矿权出让给新的公司。上市后,这些公司可能价值每人1500元人民币。这是一个标准的农村家庭又一年的收入。       ——谢国忠(摩根士丹利亚太区首席经济学家)
      注:按照张、厉、樊、盛等人的“靓女先嫁论”、“冰棍论”、“烂苹果论”、“吐唾沫论”和“社会财富向精英倾斜论”,20多年来有数以万亿元计的国有资产流失,即全国男女老少平均每人至少被剥削去7000多元,3000万出生于1940-1950年代的工人下岗。很短时间内,将近90%的中小国企实现了私有化,或者说,流进了私人腰包。而谢国忠将国有资产全民平分的做法全世界绝无先例,也不可能有。

      腐败是否有理?既然掌握公共权力进行公益决策的人不肯轻易放弃和交出他们的权力,而改革又不能从其手中强夺,就只能通过腐败与贿赂的钱权交易的方法进行购买。改革要利用腐败和贿赂,以便减少权力转移和再分配的障碍。腐败和贿赂成为权力和利益转移及再分配的一个可行的途径和桥梁,是改革过程得以顺利进行的润滑剂,在这方面的花费,实际上是走向市场经济的买路钱,构成改革的成本费。       ——张曙光(北京天则经济研究所理事长)

      在公有制下,官员索取剩余可能是一个帕累托改进;因为它有利于降低监督成本,调动官员的积极性。私人产品腐败的存在,对社会、经济发展来说即使不是最好的,也是次优的。第二好的。反腐败力度在把握适当、要非常适度,如果力度把握不适当,间接带来的负效应也非常大。       ——张维迎

      以资产换特权,促进私有化。我曾对中央政府说,最好干脆给这些人一大笔钱,把这些权力买下来,叫他们以后再不要利用这些权力了。中国最上层没有什么贪污腐化,下面却有数不尽的贪污腐化。       ——张五常(香港大学教授)

      改革初始,只有权力没有市场……前半部分:权力创造市场……金融资本阶段在性质上是资本发展的最后阶段,只差一个国际化没有完成。至此中国体制转轨的任务可以说基本上完成了前半段──以权力创造市场;中国旧体制下积累的财富基本转移完毕,中央ZF直接能够控制的资源不多了……后半部分:权力退出市场;中国改革的前一半任务就算基本完成,应该开始后一半:权力退出市场,健全平等竞争的市场经济。       ——杨帆(中国社会科学院经济研究所研究员)
      注:根据中科院国情研究中心主任胡鞍钢教授的2002年的一篇论文统计(1999~2001年):党政机关一把手们每年从国库里盗走GDP的14.2%~14.9%,9875亿—12570亿元之间,是我国4亿多农民一年的纯收入(国家统计局公布的2002年农民人均纯收入为2476元),是2002年全国财政教育事业费支出2640亿元的近4倍!而根据经济合作与发展组织(OECD)的专家表示,普遍存在的严重腐败正成为中国社会不满的一个重要源头。

      中国的贫富差距大吗?中国的贫富差距还不够大,只有拉大差距,社会才能进步,和谐社会才能有希望。中国穷人为什么穷,因为他们都有仇富心理。我要为富人说话,不是为了讨好富人。今天有些人骂富人,好像是给穷人出气,其实他们是害了穷人。杀富济不了贫,穷人应该将富人看成自己的大哥,大哥穿新衣小弟穿旧衣,天经地义。将基尼系数农村城市分开计算,这样中国贫富分化就不严重了。农民有望进入社会中产者阶层。中国农民不要害怕当中产阶级。       ——厉以宁

      只要抓总量增加。不必管分配。发展到一定程度,一切问题都会解决。       ——张维迎
      农民大转移很快就可以实现。日本明治维新和台湾地区的历史可以佐证。       ——张五常

      “十一五”期间,中央提出建设社会主义新农村将有助于激活潜力巨大的农村消费,有助于解决可能出现的通货紧缩问题。农村的消费空间相当大。我国有三分之二的人口在农村,而它的消费水平却远远低于城市的消费水平。从具体指标看,例如一些消费品等,农村还有相当大的消费空间。使穷人收入增加的速度高于富人收入增加的速度,这样才能缩小贫富差距,解决各种社会问题,实现共同富裕。我国当前贫富差距的主要矛盾不在于富人太富,而在于穷人太穷。因为城里也出现了穷人,才有了收入分配不公。不应该有仇富心理。目前我国个税征收有很多漏洞,以至于一些富人并没有按章纳税。因此,我们要完善目前的征税体系,而不是说我们应该用征税的方式缩小贫富差距。       ——林毅夫(北京大学中国经济研究中心主任)

      我国虽然基尼系数已超过国际警戒线,但发生社会动荡的可能性甚微。       ——萧灼基
      注:过去20多年年均经济增长9.5%的中国,也是世界上贫富差距扩大速度最快的国家,联合国开发计划署的数据显示,中国目前的基尼系数达到了0.45(国际公认的基尼系数警戒线是0.4),接近“社会动乱的边缘”。

      中国是否应健全福利与社会保障制度?我建议取消所谓的养老保险失业保险工伤保险等等福利,目的是保持大家的工作热情和能力。       ——厉以宁

      历史上没有见过一个不令人反胃的社会福利制度。我们往往感到爱莫能助,不是不愿意出钱,而是拿出钱来不知会落在谁的手里。       ——张五常
      注:事实上,中国目前80%以上的劳动者没有基本养老保险,85%以上的城乡居民没有基本医疗保障,城乡困难群体没有制度化的社会救助,1.4亿老年人和6000多万残疾人以及亿万妇女儿童缺乏必要的社会福利。

      中国股市健康吗?中国股市很健康,早晚冲上三千点。       ——厉以宁
      我不相信股市会永远低迷,上半年不涨,下半年也会涨,今年不涨,明年也会涨。       ——萧灼基
      中国股市的历程犹如18世纪的英国股市一样,如果在没有信托责任的社会环境下,不如关闭算了。       ——吴敬琏(国务院发展研究中心研究员)
      注:事实上,股指2005年1月份很不幸地跌到了1200点下,考虑03/04年的大盘股上市,实际跌破700点。

      经济学家应为谁说话?企业的生存环境包括商业环境、政治环境以及舆论环境。前两种环境越来越好,而舆论环境已经到了1992年以来最不好的时候。最近在社会上、舆论界兴起了一股妖魔化、丑化整个中国企业家队伍之风。在这个网络时代,学者能独立于大众舆论才是最不容易的事。对一个真正的学者来讲,最难做到的不是你骂ZF、骂企业家,而是你敢不敢站在大众舆论的对立面,坚持自己的观点。       ——张维迎

      经济学家要有勇气顶住两方面的压力:一个是上面的压力,不做风派;一个是互联网的压力。       ——厉以宁

      我希望我的言论能够改变国家的改革方向。如果我失败的话,这不是我个人的失败,这是我们国家的失败。我是个伟大的思想家。我这一次一定要成功,如果我失败的话,那会给中国社会带来一个多么大的危害。       ——郎咸平(香港中文大学财务学讲座教授)

      经济学家就是为利益集团服务的。       ——樊纲
      注:有人把中国经济学家分十类:决策圈经济学人、“议会”经济学人、方案经济学人、讲坛经济学人、课题经济学人、绿卡经济学人、公司经济学人、民间经济学人、诸侯经济学人、报章经济学人。

      教育及医疗是否应产业化?中国目前为什么穷人上不起大学?是因为收费太低。一个真正好的体制,我可以收费高,但我花80%在奖学金上,穷人就上得起大学了。比如,让穷人一年出4000元,他也出不起。       ——张维迎
      注:从上世纪90年代医疗产业化后,中国医院收费以每年20%以上的速度持续增长,高于同期居民收入增加速度4倍以上。中国消费者协会2003年的一份统计报告指出,中国大概有50%的人生了病不敢去医院,其中主要的原因是药品价格过高。而根据官方统计,中国10年教育乱收费已达2000亿元人民币!

      不管外汇储备的多或少,只要经济搞得头头是道,外汇储备是可有可无的。有谁提及美国的外汇储备是多少?只有像香港、台湾那样的小经济,或那些不成气候的大经济,才要论什么外汇储备的。要记住,一个经济搞得强劲,自己发行的钞票就是储备;搞得一塌糊涂,什么储备也保不了。关于金融方面,应该是不需要数学的,这是制度的问题。制度跟数学没有关系。你看看香港起飞的时候,20世纪70年代的时候,那时银行家、金融家满街都是,没一个懂得数学的。       ——张五常

      我把堵车看成是一个城市繁荣的标志,是一件值得欣喜的事情。如果一个城市没有堵车,那它的经济也可能凋零衰败。(1998年特大)水灾刺激了需求,拉动增长,光水毁房屋就几百万间,所以水灾拉动中国经济增长1.35%。       ——刘伟(北京大学经济学院院长,“京城四少”之一)

      治穷先治懒、治懒必须逼、逼民先逼官。       ——钟朋荣(北京视野咨询中心主任,“京城四少”之一)

      把当年侵略中国的八国联军的八个国家找过来,这八个国家,每一个国家建一所学院,就建在圆明园的遗址上面,形成一所联合大学!就叫做圆明园大学或叫八国联合大学。简称八国联大。       ——王建国(北京大学中国国情研究中心副主任/北京大学国际MBA与案例教学中心主任/北大光华管理学院、新加坡国立大学经济学院教授、博导)

----
真是不知道这些话过几十年,再让当事人看看是怎么样一种情形。

星期一, 二月 06, 2006

1948中国官员学位

    中央银行总裁:刘攻芸----伦敦经济学院博士
    行政院长:翁文灏 -----比利时鲁文大学博士
    外交部长:王世杰----伦敦大学经济博士,巴黎大学法学博士
    驻美大使:胡适----哥伦比亚大学博士
      教育部长:朱家骅-----柏林大学博士
    司法部长:谢冠生----巴黎大学法学博士
    交通部长:俞大维——哈佛大学博士
    社会部长:谷正纲——柏林大学博士
    卫生部长:周诒春——耶鲁大学硕士
    粮食部长:关吉玉——柏林大学博士
    考试院长:张伯苓——哥伦比亚大学毕业,芝加哥大学名誉博士
    司法部长:王庞惠——耶鲁大学博士
    立法院长:孙科——哥伦比亚大学硕士
    最高法院院长:谢赢洲——巴黎大学法学博士
    上海市长:吴国桢——-普林斯顿大学博士

星期六, 二月 04, 2006

闲言碎语

“有些人能清楚听见自己心灵的声音,并按这个声音生活,这样的人,不是疯了,就是成了传说。”——《燃情岁月》(Legends of the Fall)

“人生自是有情痴 此事不关风和月” 前后文几句是什么?

“爆竹声中一岁除,春风送暖入屠苏” 屠苏到底什么?

  当我步入丛林
  因为我希望生活有意义
  我希望活得深刻
  吸取生命中的所有精华
  把非生命的一切都击溃
  以免当我生命终结
  却发现自己从未活过

I went to the woods
because I wanted to live deliberately,
I wanted to live deep and suck out all the marrow of life,
and not when I had come to die,
discover that I had not lived.
)——《Dead Poets Society》。

爱是种深藏在你心中的愿望,只有你自己才能明白。
爱是盲目的,是瞬间的永恒,是值得为之去死的信念。
还要经过时间的考验。
那种厌烦的情绪,还有心灵上的伤痛,并不是爱的过程所需要的,
但我却乐于接受。
——《完美盗贼》

“是时候播种泪水了” ——《伊甸樱桃》
正义就是欲望的最大满足——罗尔斯的《正义论》
亚当·斯密说:贪婪是一种善,因为推动这世界运转的不是爱,而是金钱。

布什总统曾向中国网民发表谈话。他说"人类千万年的历史,最为珍贵的不是令人炫目的科技,不是浩瀚的大师们的经典著作,而是实现了对统治者的驯服,实现了把他们关在笼子里的梦想。我现在就是站在笼子里向你们讲话。"

“从小便认识你”——《春田花花同学会》
“我根本体会不了你的痛苦。”——《东京巴比伦》

美国著名作家萧伯纳说:两个人在一起交换苹果,和两个人在一起交换思想是不一样的。两个人交换了苹果,每个人手上还是只有一个苹果;但是两个人交换了思想,每个人就同时有两个人的思想。

广告词
男人,要对自己狠一点!——柒牌男装
看尽天下A片,心中自然无码
人生就象一场旅行 不必在乎目的地 在乎的是沿途的风景和看风景的心情 带心灵去旅行——利群
心平常,自非凡 ——利朗休闲男装录语
   去爱吧,像不曾受过一次伤一样
   跳舞吧,像没有人欣赏一样
   唱歌吧,像没有任何人聆听一样
   干活吧,像不需要钱一样
   生活吧,像今天是末日一样
——《我的名字叫金三顺》中公交车站牌上的广告语


西塞山怀古

--刘禹锡


王浚楼船下益州,金陵王气黯然收。

千寻铁锁沉江底,一片降幡出石头。

人世几回伤往事,山形依旧枕寒流。

从今四海为家日,故垒萧萧芦荻秋。