月份彙整: 2009 年 5 月

趙紫陽談中國應如何改變 [转载自明报]

由1980年到六四前,鄧小平多次說反對自由化,但另一邊廂又常說需要政治改革。

我相信鄧小平對現存政治制度是有不滿的。他對政治改革是真誠的。但他心中的改革,並非政治民主化和現代化,而是某種行政改革,只涉及一些具體規管、組織、方法學和總體政治操守。鄧認為改革的前提,是維持共黨一黨專政,改革的目標是鞏固一黨專政。他反對任何削弱這方面的改革。

鄧小平只倡行政改革

根據鄧小平對政治改革的定義,首要是黨政分家,解決共產黨能如何更好地領導國家的問題,其次是下放權力,解決中央與地方關係問題。第三是裁減行政部門,提高效率。所以在他眼中,政治改革與反對自由化沒有矛盾,兩者可並存。鄧小平尤其反對多黨民主、三權分立和西方議會民主體制。

1987年,他跟南斯拉夫來賓談到中國政治改革時曾說﹕「資產階段民主,只是一種給那些壟斷資本的人的民主……社會主義國家的一大優勢,是一旦作出決定,就能即時執行,不受限制,不像議會民主過程那麼複雜,光說不做。這方面我們的效率較高,這是我們的強項,必須保持。」

在一眾黨元老中,鄧小平總是經常站出來,強調獨裁專制的手段,他常提醒那是很有用的工具。汲取過斯大林和毛澤東晚年歲月的教訓,以及個人在文革的經歷,鄧小平顯然並非不知社會主義政治體制的缺點,所以他常提到廣大黨內民主,但另一邊廂,鄧堅持共產黨統治地位不容挑戰,更欣賞高度集權和專制,相信這些應保留。所以他所謂的民主、所主張的撤除領導特權地位,以及清洗封建影響,都不可能實現。它們不過是空話。

「鄧多次警告我勿接受三權分立」

相比下,胡耀邦毫無疑問是追求民主的。儘管他未能想出一套具體的社會主義民主模式,我相信若他能繼續領導黨和國家,他能推動中國政治改革,朝民主化和現代化發展。

當1978年十一屆三中全會時,我的心全都放在經濟改革,完全沒理政治改革問題。但在1986至1989年的歲月,我漸漸覺得也許黨的執政地位毋須改變,但必須改變管治方式,要容讓不同社會組織更多的政治參與,以法治取代人治。但在十三大報告時,鄧小平多次警告我不得受西方三權分立所影響,報告中絕不可有分毫觸及這些想法。但我覺得若不推動政治改革,經濟改革在持續深化上,將陷入重重困難。要解決貪污等問題,關鍵是透明度和民主監督,包括傳媒和輿論的監督,以及獨立的司法。

西方議會民主是最佳選擇

及至1989年下台後,我對中國政治改革又有更新的理解。我們的社會主義民主太表面,只是由小撮人甚至一人統治。20世紀存在過多種政治體制(例如君主專制、法西斯主義、無產階級專制等),但只有西方議會民主顯示出最強的生命力。這是現有最好的選擇。基於中國的國情現實,我們需要一段相對甚長的(政治制度)過渡,亞洲其他地區的經驗值得我們留意,例如台灣和韓國成功逐步從舊制度邁向民主議會制,是正面的經驗,可讓我們借鑑。在中國,為了較暢順的過渡, 我們需讓共產黨的執政地位多維持一段時間,同時逐步改變黨的統治方式,這可能仍是正確的做法。過渡時間要多長,必須視乎社會發展,但關鍵是黨領導必須堅守此信念,那就能巧妙地因應情勢變,逐步推動。

如果最終的目標是議會民主,執政黨必須實現兩個突破。一是容許其他政黨以及自由媒體的存在。這可以逐步發生,但一定要追求。第二個突破是在黨內有民主,就是黨內需要實行民主程序,並使用民主手段去將自己改革……不同的意見都可以存在,而不同的派系亦應合法存在。」正如孫中山所說﹕「民主潮流浩浩蕩蕩,順之者昌,逆之者亡。」我相信現是時候認真處理這問題。

-趙紫陽談中國應如何改變

介绍一下Bucket Sort

排序算法是大家刚学编程的时候一定要学的算法,冒泡算法(bubble sort),快速排序(quick sort)等等相信大家耳熟能详。我下面要介绍的bucket sort其实大家应该也学过,不过最近刚刚帮别人交了一份作业,勾起了不少回忆,所以顺便在这里发出来。下面的算法有几个限制:所排序的一定要是正整数,至于整数的大小和个数都是可以修改的。

[code:c#]
#include
#include 

#define MAX_INT 65536
#define MAX_NO_INPUT 1000

struct bucket{
 int data;
 bucket* next;
};

void addToBucket(struct bucket *head[],int value)
{
 bucket* current;

 if (head[value] == NULL)
 {
  head[value] = (bucket*)malloc(sizeof(bucket));
  head[value]->data = value;
  head[value]->next = NULL;
 }
 else
 {
  current = head[value];
  while (current->next != NULL)
   current = current->next;
  current->next = (bucket*)malloc(sizeof(bucket));
  current->next->data = value;
  current->next->next = NULL;
 }
}
void printOut(bucket* head[],int size)
{
 int i=0;
 bucket *current;
 FILE *fp;

 fp = fopen("output.txt","w");

 for (i=size-1;i>=0;i--)
 {
  if (head[i] == NULL)
   continue;
  current = head[i];
  while(current != NULL)
  {
   fprintf(fp,"%d\n",current->data);
   current = current->next;
  }
 }
 fclose(fp);
}
int main()
{
 bucket* head[MAX_INT] = {NULL};
 int unsorted[MAX_NO_INPUT];
 FILE *fp;
 int i=0;

 //read in a file
 if ((fp = fopen("input.txt","r"))==NULL)
 {
  printf("Cannot open file");
  exit(0);
 }

 i=0;
 while (fscanf(fp,"%i\n",&unsorted[i])!=EOF && i< MAX_NO_INPUT)
  i++;
 fclose(fp);

 int length = i;
 i = 0;
 for (i=0;i

[/code]

以上的算法时间复杂度是O(n)。算是比较快速的排序算法,不过就跟所有算法一样,其实都是时间和空间上的取舍。它的空间复杂度相当大,尤其是在整数上限很大的情况下,更是占用了不少内存。所以,大家还是要按情况使用。

浅说C#里的指针用法

C#是一种高级语言,他其中一个特性就是Managed code的概念。整个C#的程序都是在.NET runtime里运行的,这个设计能够有效防止程序员一些错误的编程,有效提高了程序的稳定性。但如果我们有时候真的需要直接操作内存,或者想写一些高效的代码,是不是就没办法了呢?实际上,C#并没有完全去掉对指针和底层memory操作的支持。可是如果要想使用指针的话,就必须使用unsafe这个关键字。unsafe可以使用在一个方法上:

[code:c#]

unsafe int GetSomeNumber()
{
  //code that can use pointers
}

[/code]

当然,你也可以使用unsafe将真个类包起来:

[code:c#]

unsafe class MyClass
{
}

[/code]

同样的,也可以将类中的某个属性标记为unsafe

[code:c#]

class MyClass
{
  unsafe int* pX;
}

[/code]

或者你可以只将代码中的某一段包起来

[code:c#]

void MyMethod()
{
  //code that doesn't use pointers
  unsafe
  {
  }
}

[/code]

可是对于方法内部的本地变量,是不可以标识为unsafe的:

[code:c#]

int MyMethod()
{
  unsafe int *pX;   //WRONG
}

[/code]

如果想在方法内部使用一个指针性的本地变量的话,就要将该方法标识为unsafe或者在unsafe block内部声明该变量。最后,你只要在project properties里面的Build页面把allow unsafe code选项勾上就可以了。C#中关于指针的语法和C/C++差不多,在这里就不再详述了。唯一区别是在声明指针变量上面,C++是int *px, *py;而C#是int* px,py;在C#中*是跟随类型而不是跟随变量名的。

类成员的指针

在C#中,指向类的指针是不允许的。因为C#的garbage collector并没有维护指针的信息,指针指向的内存有可能在程序运行的时候被回收,造成意想不到的后果。可是我们有没有办法将指针指向类中的变量呢?比如我们有一个如下的类:

[code:c#]

class MyClass
{
  public long x;
  public float F;
}
MyClass myObject = new MyClass();
long* p: = &(myObject.X);
float* pF = &(myObject.F);

[/code]

如果你尝试编译以上代码的话你就会发现编译器会返回一个编译错误。原因就是因为在C#中,类是放在heap上的,garbage collector有可能随时将一个类移到新的地方,使得本来的指针指向了一个错误的位置。要解决这个问题,就要使用fixed关键字。将以上代码做以下的修改:

[code:c#]

MyClass myObject = new MyClass();
fixed(long* pL = &(myObject.X))
{
  //do something
}

[/code]

使用了fixed关键字,garbage collector就不会将该类移动到别处。fixed关键字还可以有以下用法:

[code:c#]

fixed(long *pL = &(myObject.X))
fixed(float *pF = &(myObject.F))
{
}

[/code]

或者

[code:c#]

fixed(long * pX=&(myObject.X), px2=&(myObject2.X))
{
}

[/code]

终于完成了

从注册域名,到完成这个网站前后花了大概5天。终于建了第一个自己的网站,嘿嘿。这个网页是用BlogEngine.NET来建立的。它是个很优秀的开源项目,代码基本看不懂。不过没关系,我相信我的编程水平会慢慢提高的。