Search This Blog

Python: test if a dictionary contains a specific key



def contains(dict, key):
return key in dict

dict={}
dict['a']=1
dict['b']=2
dict['c']=3

print(contains(dict, 'a')) # True
print(contains(dict, 'd')) # False

Python: delete a item from a list

  • remove the first matching element:
    if e in list:
    list.remove(e)
  • remove all occurrences:
    while e in list:
    list.remove(e)
  • EAFP style: remove the first occurrence:
    try:
    list.remove(e)
    except ValueError:
    # not in the list
    pass
  • EAFP style: remove all occurrences:

    while True:
    try:
    list.remove(e)
    except ValueError:
    break

EAFP

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

Python: del or assign None?


>>> x=1
>>> print x
1
>>> del x
>>> print x
Traceback (most recent call last):
File "", line 1, in
NameError: name 'x' is not defined

>>> x=1
>>> print x
1
>>> x=None
>>> print x
None

see also

Compile and install GNU-COBOL (formerly Open COBOL) on Mac OS X Yosemite

  1. Make sure you have xcode installed.
  2. Compile and install GNU MP Bignum Library.
  3. Compile and install Berkeley DB.
  4. Download GNU COBOL
  5. Compile and install:
    ./configure CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib --prefix=/usr/local
    
    make
    
    sudo make install
      

Compile and install Berkeley DB on Mac OS X Yosemite

  • Make sure you have xcode installed.
  • Download Berkeley DB from Oracle.
  • Compile and install:
    unzip db-6.1.19.zip
    cd db-6.1.19/build_unix
    ../dist/configure --disable-replication --prefix=/usr/local
    make
    sudo make install
      
  • To check where the files are located, run
    find /usr/local | grep db
    you should see something like below:
    /usr/local/lib/libdb-6.1.a
    /usr/local/lib/libdb-6.1.dylib
    /usr/local/lib/libdb-6.1.la
    /usr/local/lib/libdb-6.dylib
    /usr/local/lib/libdb.a
    /usr/local/lib/libdb.dylib
    /usr/local/include/db.h
    /usr/local/include/db_cxx.h
    

Compile and install GNU MP Bignum Library on Mac OS X Yosemite

  • Make sure you have xcode installed.
  • Excute the following commands to download, compile and install gmp 6.0.0 into /usr/local.
    cd /tmp; wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2; tar jxvf gmp-6.0.0a.tar.bz2; cd gmp-6.0.0
    
    ./configure --prefix=/usr/local
    
    make
    
    make check
    
    sudo make install
        
  • To check where the files are installed, run
    find /usr/local | grep gmp
    and you should see something like below:
    /usr/local/include/gmp.h
    /usr/local/include/gmpxx.h
    /usr/local/lib/libgmp.10.dylib
    /usr/local/lib/libgmp.a
    /usr/local/lib/libgmp.dylib
    /usr/local/lib/libgmp.la
    /usr/local/lib/libgmpxx.4.dylib
    /usr/local/lib/libgmpxx.a
    /usr/local/lib/libgmpxx.dylib
    /usr/local/lib/libgmpxx.la
    /usr/local/share/info/gmp.info
    /usr/local/share/info/gmp.info-1
    /usr/local/share/info/gmp.info-2

see also

synchronized method in python

Java code


class AClass {
private int count =0;

public synchronized inc(){
count++;
}

public synchronized dec(){
count--;
}
}

Python code


import threading

class AClass(object):
def __init__(self):
self.__count = 0;
self.__lock = threading.RLock()

def inc(self):
with self.__lock:
self.__count += 1

def dec(self):
with self.__lock:
self.__count -= 1


see also

synchronized static method in python

Java code


class AClass {
private static int _count = 0;

public static synchronized inc(){
_count ++;
}

public static synchronized dec(){
_count --;
}
}

Python code


import threading

class AClass(object):
__count = 0
__lock = threading.RLock()

@classmethod
def inc(cls):
with cls.__lock:
cls.__count += 1

@classmethod
def dec(cls):
with cls.__lock:
cls.__count -= 1

Generate index.html using tree command

  • To install:
    sudo apt-get install tree
  • To use:
    tree -H <base> -T <title> -o <output.html>
    for example:
    tree -H /maven -T "Mediaflux Maven Repository" -o index.html

X11 forwarding over ssh

ssh -XYC user@server xterm
The options are:
  1. X: enables x11 forwarding
  2. Y: enables trusted x11 forwarding
  3. C: compresses the communication
  4. xterm: can be substituted with other commands that are available on the server

X11 forwarding over multiple ssh hops

Suppose you do not have direct ssh access to server2. You can access server2 via server1 over ssh. (localhost => server1 => server2)
  1. In terminal 1:
    ssh server1 -L2200:server2:22
  2. In terminal 2:
    ssh localhost -XYC -p2200 xterm
    It will run xterm on server2 and displays back to localhost.

CUPS: Unknown Name and Withheld User in the job list

In the recent cups, the document file name and the user name are not displayed:

Solution

To display the job document file name and the user name:
  • Edit /etc/cups/cupsd.conf: change
    JobPrivateValues default
    to
    JobPrivateValues none
  • Restart cupsd:
    sudo /etc/init.d/cups restart

Redhat/CentOS: X11 forwarding request failed on channel 0

Was trying to forward xdisplay back to local computer from the remote a Redhat 6.5 server via SSH,
ssh -X user@remote-redhat-server
xterm
got the following error:
X11 forwarding request failed on channel 0

Solution:

  • Login the remote Redhat server via ssh:
    ssh user@remote-redhat-server
  • Enable X11 forwarding in /etc/ssh/sshd_config:
    sudo vi /etc/ssh/sshd_config
    X11Forwarding yes
    X11UseLocalhost no
  • Install xauthroity:
    sudo yum install xauth
  • Important: Reload ssh server:
    sudo /etc/init.d/ssh reload

VMWare Fusion 6: NAT port forwarding

  • Edit /Library/Preferences/VMware Fusion/vmnet8/nat.conf, in the [incomingtcp] section:
    [incomingtcp]
    # <external port>=<vm ip address>:<vm port>
    8080=192.168.58.130:8080
    
  • NOTE: You MUST restart VMVare Fusion to make it work. (Restarting only the VM will NOT reload the configuration).

李晓鹏:关于毛泽东的谣言与真相

作者:李晓鹏
来源:新浪微博


一、毛岸英之死
 
关于毛泽东的谣言很多,有一些层次很低的,我们就不用细说了。比如说什么他在全国各地为自己修建了很多行宫别墅。其实,大部分都是建国以前蒋介石就修好的,还有一些是接待国内外贵宾的宾馆。毛泽东不过去住过几天,就被说成是他的行宫别墅了。

这 些只要稍微认真的加以辨别一下,都比较容易搞清楚。但是有一些传言就没有那么容易辨别了。比如说,这第一个:毛泽东把他的儿子毛岸英送到朝鲜战场上去,是 为了让他去镀金的。增加点参加战争的资历,好为将来培养儿子接班做准备。但是想不到竟然牺牲了。有些人的话就说的很难听,说什么要感谢美国飞行员,把未来 的太子给炸死了。不然我们就没有邓小平的改革开放了,我们今天就是毛家王朝。

 
 

1.培养接班人的步骤问题

 

这种说法很难简单的去驳斥它,因为人已经死了,我们没办法验证说如果毛岸英活着会是什么样。

但 这个事情也不是完全没有线索。因为封建世袭制度被消灭以后,领袖人物要想培养儿子接班,就必须要一步一步的历练上来,不能直接封为“太子”就行了。不管你 是真共和还是假共和,面子总要装的。要培养他在军队的势力,在党内的势力,还要逐步的把他提拔到一个很接近领袖的位置上,这样领袖死了以后才能够顺利的接 班。

最 典型的就是蒋介石,他是让他的儿子蒋经国接班的。1937年蒋经国从苏联学习回国以后,首先就是到军队历练,1938年获封少将军衔,过了一年,就派到江 西去当赣南地区行政专员和保安司令,政权军权一把抓。然后逐步的提升为江西省防空司令、省委委员。1945年,又提拔到中央来,当三民主义青年团和青年军 的领导。这就是让他在青年团和青年军里边发掘人才,建立自己未来接班的政治和军事的班底。


 

蒋 经国的成长路线,明显是蒋介石精心安排的。党政军内各个方面都去历练,熬资历,再一步一步提拔,后来到了台湾以后,又当国防部主任、行政院副院长。最后当 上行政院院长,也就是相当于我们的国务院总理的职位。这样,就只等老蒋一死,他以总理的身份接这个国民党主席和总统的职位,那就顺理成章了。

如 果老毛也想要让儿子接班,他也要按照这个程序来。军队里边的历练,那是必不可少的。等毛岸英从朝鲜战场回来,有了军功,就好进一步提拔了。但毛岸英是 1945年12月从苏联回国的,距离他去朝鲜还有五年的时间。毛泽东在1943年延安整风之后已经成了党的最高领袖,毛泽东思想已经写进党章了。这个时候 儿子从国外回来,培养接班人那可是恰逢其时啊。要知道,蒋经国37年年底回国,仅仅过了几个月就当上少将了!

1945 年到1951年这六年里边,正好是中共的军队打的仗最多,打的最为顺风顺水的六年。国共内战1945年9月全面爆发,东北、华北、华中、西北……哪儿都在 打仗。还是跟国民党打,相对来说比较安全,因为国军的战斗力比较像豆腐渣。这个时候比如说,派毛岸英去东北给林彪当个参谋,那还不是很简单的事儿?当时已 经有了比较稳固的北满根据地,在司令部呆着还是比较安全的。

等 到辽沈战役结束以后,师部也比较安全了,就可以去当个师政委。再跟随东北野战军挥师南下,配一个能干的师长负责指挥,那个时候就像秋风扫落叶一样,肯定不 停地打胜仗,一口气把蒋介石赶到台湾去,不需要什么很强的军事才能,也不会有什么牺牲的危险。几场胜仗一打,就可以提拔上来当个纵队政委了。然后占领某个 地区,直接就从纵队政委改成地委书记,这不就党政军的资历都有了,一步一步上来了?

但 是,在这五年里,毛泽东啥军事任务也没有交给毛岸英去干,而是让他去学种地,参加农村的劳动。后来又参加搞土地改革,也没什么实权,主要就是做宣传、文秘 工作。建国以后,又去一家工厂当了党支部副书记。既不去军队,也不去政府。总之呢,就是完全没有要从党政军各方面来培养他的这个迹象。

 

2.艰难的抉择

 

1950 年朝鲜战争爆发的时候,反倒不是一个很好的去战场上熬资历的机会。 首先,这是解放军第一次到国外打仗,人生地不熟的,风险很大。解放战争的时候,共产党的群众基础很好,到哪个地方都有地下党组织和老百姓跟带路啊、通风报 信之类的。在朝鲜,那就是一个完全陌生的环境。

第 二,这是和世界第一强国作战。当时共产党的军队,打国民党是比较轻松的,但是打日本人的军队,就非常吃力。日军的装备好,而且单兵作战能力极强,而日军打 不过美军。美军战术素养很高,但最重要的是它们的装备火力非常的强。当时中国人民志愿军和美军在装备上,存在代差。就是说不是一个时代的,就好像当年鸦片 战争时期英军是热兵器,清军是冷兵器一样。中国这边还是传统步兵装备,也就是步枪机枪加数量可怜的火炮,而美军已经是海陆空立体作战了,空中有飞机、地上 有坦克和装甲车、海上有战舰。在人类战争史上,存在代差的两支军队交战,基本都是落后的一方惨败,很少例外。即使有少数的例外,也是落后的一方在自己的国 家抵抗侵略获得的胜利。比如这个埃塞俄比亚抵抗意大利的入侵。在没有主场优势的情况下,武器落后于对手一个时代的军队取胜的案例还从来没有出现过。

在这种情况下,把自己的儿子送上战场去“镀金”,可以说非常愚蠢。你要说把某个干部送上去锻炼锻炼还可以,因为万一牺牲了还可以再选。这个能接班的儿子可就这么一个,死了就没有了。

我 们说的彻底一点,我们站在毛泽东个人地位的角度考虑,为他培养儿子接班的大局考虑,最好的选择不是派毛岸英去朝鲜,而是根本就不要打这场战争。为什么?因 为当时毛泽东的领袖地位已经很巩固了,领导中国共产党取得了抗日战争和解放战争的胜利,统一全中国,这个功劳还不够大?中国历史上,从纯粹的草根底层出 身,白手起家,统一中国成为最高领袖的人只有三个,汉高祖刘邦、明太祖朱元璋,还有就是毛泽东。平均一千年才出一个。到了这个地步了,你还追求什么?朝鲜 战争打赢了,你还是最高领袖,没办法进步了。那万一要是打输了呢?

当 时中央高层除了毛泽东和彭德怀,其他人基本都反对出兵朝鲜。大家都觉得好不容易把国民党赶到海岛上去了,大陆统一了,打了这么多年仗,现在应该抓紧时间搞 建设。在这种情况下,你力排众议主张出兵,一旦打输了,领袖地位很有可能就要动摇了。大家都说不要打,你非要打,结果打输了,牺牲了几十万青壮年,把国家 经济搞垮了,那必须要有人为此承担责任啊!那你就要下台,或者说退居二线,至少也要取消你的最终决策权,以后大事儿小事都要大家投票决定,不能再听你一个 人的了。

所 以当时毛泽东是顶着巨大的压力做出这个决定的。自己关起门来想了七天,这才最后决定出兵朝鲜。这确实是一个非常艰难、风险非常大的决定。当时想让林彪带兵 去朝鲜,林彪说我去不了,我有病;然后又想让粟裕去,粟裕说,我也去不了,我也有病。当然他们是不是真的病到不能带兵,我们不去研究。反正两员大将都不 去,这就让毛泽东更难办了。但他还是坚持要出兵,就做了两个决定,首先是让彭德怀挂帅,解决主帅问题。第二,就是把自己的儿子送上战场,解决党内团结的问 题。

 
 

彭 德怀在红军时期和抗日战争时期战功很大,但在最后的这个解放战争里边表现并不突出,主要原因呢是因为他负责的西北战区不是主战场,没有指挥几十万人的大兵 团作战的机会。所以毛泽东这次派几十万大军入朝,首先想到的是指挥过辽沈战役和淮海战役的林彪和粟裕。选彭德怀是没办法了。用毛泽东的话来说,就是:“我 作为共产党的主席,不派自己的儿子去,又派谁的儿子去呢?”

  

这个时候问题就来了:为什么在解放战争的时候毛泽东没有这样想?

因为那个时候党内意见很一致,仗打的比较顺,派自己儿子去参军,就有培养接班人的嫌疑。只有到了朝鲜战争,为了说服党内同志团结起来支持入朝作战,为了鼓舞志愿军的士气,他才决定让毛岸英入朝作战。

注 意,这个决定不会是毛岸英主动请战的,而是毛泽东自己的决定。因为毛岸英入朝的时间是在援朝战争爆发之前。是和派彭德怀入朝同时做出来的决定。当时关于是 否参战的争论拖了很久,党内没有一致意见。一直到10月份,美军都已经快打倒鸭绿江边了,形势非常危险了,再不做出决定就来不及了。

10 月4号,彭德怀还在西北地区主持规划建设大会,根本没有出国打仗的准备。突然接到通知让他去北京开会,会开到一半就走了。当天下午到了北京,毛泽东就找他 谈朝鲜战争问题。彭德怀当时没有表态,回去想了一晚上,才来告诉毛泽东:我赞成你的决定。也就是说10月5号才最终定下来出兵朝鲜。

根 据聂荣臻的回忆,毛泽东是10月6号告诉他让毛岸英去给彭德怀当俄语翻译。10月19号,彭德怀就带着一个秘书和两个警卫员秘密进入朝鲜;10月23号, 彭德怀的第一批司令部成员进入朝鲜跟他回合。而毛岸英就在10月23号入朝的这第一批人中间。整个过程都是高度保密的。直到11月2号,志愿军已经跟美军 交上了火以后,国内才发表声明支持志愿军入朝作战,开始进行公开的政治宣传。

也 就是说,毛岸英决定入朝的决定,是在抗美援朝战争爆发之前就做出了。在这么紧张和高度机密的战争节奏中,不会出现在工厂里工作的毛岸英听说朝鲜战争爆发, 然后主动要求去参战的情况。毛泽东也不会有这个闲心来考虑说,诶,这次打朝鲜是个好机会,可以让我们家岸英去捞点资历,回来以后好提拔他做官接我的班。就 算要考虑,那也应该是这段最紧张最惊险的时间过去了再说。因为早在10月9号,毛岸英入朝前半个月,斯大林就通知毛泽东说,我们的空军还没有准备好,暂时 不能给你们进入朝鲜提供掩护,大概要再过两到三个月才能准备好。如果说真的要去熬资历、去镀金,那可以等两三个月以后有了苏联空军保护之后再去嘛,那不是 安全得多了?

实 际上,就在10月22号晚上进入朝鲜的路上,跟毛岸英同一批入朝的人中间,39军司令部参谋处长何凌登,就在汽车上被美军飞机的子弹打中牺牲了。所以那是 极端危险的,由于美军具有绝对的空中优势和强大的空中打击力量,任何人,包括彭德怀在内,只要一踏入朝鲜,就随时有生命危险,不会因为你是当参谋还是当翻 译而有所区别、不会因为你是主席的儿子还是农民的儿子而有所区别。入朝之后一个月,毛岸英就牺牲了,死于美军的空袭。

  

回 顾这段历史,我们有理由相信,毛泽东派毛岸英入朝作战,绝不是为了把他培养成接班人,而是在顶着党内大多数反对意见,做出抗美援朝的、关乎国运的这么一个 重大战略决策的时刻,面对美国这么强大的对手,为了取得党内高层的支持,激励志愿军战士的士气,让全党全军团结起来不惜一切代价争取战争胜利,主动做出的 这么一个决定。这是一个伟大的决定,一个富有献身精神的决定。绝不是为了镀金,国家主席的儿子冒这么大危险去镀金,还就是个俄文翻译,不值得。

你 看蒋经国,回国三个月就封为少将,还不用去前线,在后方当上几年保安司令,就晋升为中将了,这才叫镀金,这才叫培养接班人。从朝鲜战争之前毛泽东对毛岸英 的安排来看,也没有要培养他接班的意思。在横扫国民党残兵败将的时候,他没有派自己的儿子去抢功劳,而把功劳留给大家;在大部分人都认为这个仗打不赢的时 候,在粟裕林彪这样的虎将都称病不出的时候,他派自己的儿子顶着美军的飞机上了战场。所以说,那些所谓的要感谢美国飞行员、感谢蛋炒饭之类的话,都是非常 荒谬的。

以上就是我想要澄清的第一个谣言。 接下来我们来说第二个。这第二个可比第一个要复杂得多了。 


二、《红太阳是怎么升起的》?

 

 1.整人与用人

 

这个传言是说毛泽东这个人,为了个人的权力不择手段,搞党内斗争的时候心狠手辣、反复无常。这一类传言的登峰造极之作,就是高华的那本名著《红太阳是怎样升起的》。讲的就是说在延安整风当中,毛泽东以这个很阴暗的心理、用了很多很不光明的手段来整人。作者高华在书里边说:

“毛泽东发动整风运动的根本目的是彻底肃清国际派在中共的影响,打击和争取以周恩来为代表的'经验主义'者的力量,用自己的思想改造中央,进而确立毛个人在中共党内的绝对统治地位。”


 

为了证明这个观点,作者列举了很多证据。我们举一个:延安整风结束以后召开的党的第七次全国代表大会。他就说:你们看,通过延安整风,毛泽东大权在握,七大的人事安排就体现了毛泽东要独揽大权的这么一个目的。

但是我仔细一看七大的中央委员名单,好像这个高华说的不完全对嘛!国际派的代表人物王明、博古、张闻天这些人,都还在中央委员会里边呀?他们还是中央委员,没有被迫害啊!于是《红太阳》的作者就说,这些人已经被剥夺了实权了,只是挂一个空头的名额,其实是被整了。

我 们再一看,那延安整风里边表现最积极、被作者认为是毛泽东最信任的康生,他的社会部部长的职位被撤销了,没有保留任何实际职位,就是一个空头委员,这是怎 么回事?于是作者又说,这是因为康生整风得罪的人太多,毛泽东不得不把他拿下来,显示康生干的坏事与自己无关,这叫丢车保帅。

然后,再来看中央委员里边被提拔的人,刘少奇、彭真这些人被提拔上来了。作者就说,你看,这就是毛泽东重用私人,把最先提出毛泽东思想和最先喊毛主席万岁的人大力提拔了。这是任人唯亲。这听起来好像也有点道理。

但 是我们一看,周恩来也被提拔上来了。周恩来可不是毛泽东的嫡系,而是威望很高的中共元老,以前还当过毛泽东的领导,当了好多年。在中央苏区把毛泽东打倒的 时候,他也是站在博古王明那一边的。就在一年前,周恩来还跟王明一起在南方局搞统一战线,合作的还挺好。那这又怎么解释呢?这个《红太阳》的作者又说啊, 这是因为毛泽东需要显示自己的公正、宽大。为了掩盖自己的权力野心,故意树的这么一个典型。

这样的解释,我认为就有点牵强了。对不对?客观的说,《红太阳是怎样升起的》这本书,对历史细节的考证啊,非常的详实,不是凭空造谣。这书里面说的事情呢,基本都是真的,但关键是什么?关键就是他去解释这些事情,所用的逻辑有问题。

实际上他举的这些个例子,我们用相反的立场和逻辑来解释,也完全解释的通。

我 们完全可以说,王明、博古这些整风的主要对象被批判了以后,还保留了中央委员的位置。这说明,毛心胸宽广,政治斗争只是为了贯彻政治路线,不是为了整人。 周恩来这样的人呢,以前跟王明博古他们一起犯过错误,但是已经改正了。所以只要做一下检讨,跟以前的错误划清界限,还要继续重用。这说明毛任人唯贤,不计 前嫌,还是心胸宽广。反之,像康生这样的人,虽然对毛忠心耿耿、言听计从,但在整风过程中犯了很大的错误、制造了很多冤案,所以要坚决拿下。这说明毛泽东 这个人公正无私,不姑息养奸,不包庇纵容自己的亲信。

我们这样来分析,也是通的,也很有道理。所以事情是同样的事情,我们用不同的立场、不同的逻辑去分析,就可以得到两种相反的意见。我们应该相信哪一个呢?

有一些很细节的问题,我们没有时间去很详细的讨论。但是我觉得有一点,我们要分析评价一个历史人物,必须要把他放到具体的历史环境当中去。为了澄清《红太阳是怎样升起的》这本书的里边那种不尊重事实的立场和逻辑,我们必须对延安整风的来龙去脉做一个整体的把握。

 

2.艰难创业

 

首 先,中国共产党在成立之初,它本质上不是一个独立的政党,而是共产国际的中国支部。它是在共产国际的支持下建立起来的,在思想上、组织上都要服从共产国际 的领导。一方面,共产国际从苏联对中共进行遥控指挥,直接下命令;另一方面,共产国际又从苏联派一些人过来,直接当中共的领导人。这些从苏联派过来的人 呢,他们的权力来源是共产国际,对苏联言听计从,而且从思想上也认为苏联的那一套模式就是搞社会主义的标准,什么东西都要学习苏联。这些人呢,可以称之为 “国际派”。他们的代表,就是王明和博古。王明的身份是共产国际的中国代表,长期在苏联对中共进行遥控指挥;博古是王明的同志,被派回中国当领导,负责执 行王明的路线。

还有一批人,是中国本土成长起来的,这些人对中国的情况很了解,能力也很强。这些人就是“本土派”,其中最典型的代表就是毛泽东。

还 有一批人,是“中间派”。他们也去苏联学习过,但是回国以后长期在一线工作,接触了很多的实际情况,思想上其实已经本土化了。比较典型的代表,就是周恩来 和邓小平。他们原来是在欧洲留学,接触过很多资本主义的东西,思想已经比较成熟了再去的苏联,不是王明博古那种没有被“污染”过的。像这个邓小平回国以 后,先在上海干一些党务,基本上是跟着国际派走的。但是大革命失败以后,他去广西搞百色起义,慢慢的发现这个本土派的毛泽东在井冈山搞得很好,就跟着毛泽 东走了,后来还被国际派打成了“毛派头子”。

这 种情况,就好像我们现在,一家美国的跨国公司跑到中国来开了一家分公司,独立法人,中方这边也有一些股份,但是美方控股,高管都要从美国那边派过来。王明 博古这些人,就好像土生土长的美国人,已经彻底西化了,受到美国总部的重用;周恩来邓小平这些人,就是外派留学生,被派到了美国总部进行过短期培训,然后 再回国担任要职;毛泽东呢,就代表中方股东,为革命出了本钱的,但是股份比较少,没有发言权。

那 个时候的苏联,就好比一个大财团。共产国际,就好像是它设立的一家风险投资公司,或者说小微企业孵化器,专门在世界各国搞风投、支持新的共产党创业。中共 这个共产国际控股的中外合资企业,由于有财大气粗的苏联在后面砸钱,刚开始发展的很快,很短的时间内就从几十个人发展到了好几万人。

 

但 是发展到了一定规模以后,就出问题了。这跟我们企业创业也是一样,刚开始你比较小,没人理你,你自己自生自灭。等你规模搞大了,大家就把你当成竞争对手 了,要跟你打价格战、要挖你的人才、在媒体上曝光你的负面新闻等等。当然那是革命战争时期,竞争对手的手段就比较直接了。国民党在蒋介石的带领下,发动了 “四一二”反革命政变,开始大规模屠杀共产党人。这个时候,本土派和国际派就出现了分裂。本土派的代表毛泽东带着军队上山打游击去了,国际派还在上海这样 的大城市死守。

最 后的结果,本土派在农村的根据地站住了脚跟,国际派在上海被国民党搞得没办法生存了,只能全部搬家到了毛泽东创建的江西革命根据地来。就好像我们现在有的 企业,为了面子,跑到这个上海的陆家嘴、北京的CBD去租用最好的办公楼,但是这些地方写字楼的租金贵啊,风光了几年之后交不起房租了。然后大家一看: 诶,江西分公司的毛经理搞得还不错,圈了一块地在搞建设,虽然还都是些毛坯房,但好歹是有独立产权的,比较安稳,所以总部就干脆搬到江西办公去了。

总 部这些人到了江西以后,还梦想着当年在CBD里边的好日子,天天想着要去围攻大城市、要搞正规军作战,说起来还有理论支持,就是学习俄国的十月革命,直接 就去攻打圣彼得堡,然后就成功了。这跟毛泽东“农村包围城市”的思路起了冲突。总部这帮人就仗着自己是领导,还有投资方兼大股东共产国际的支持,把毛泽东 给免职了,自己直接指挥军队作战。结果几场仗打下来,把江西根据地的这点本钱也给打没了。没办法,只有变卖家产,跑路,打算跑到湖南去投奔亲友,找二六军 团去。

而且总部这帮人,心还忒狠,因为毛泽东当时有病,行动不太方便,他们就觉得这家伙反正不听话,带着还是个累赘,所以干脆把他留在江西,不带他去湖南了。

关 键时刻,蒋介石帮了一个大忙。因为蒋介石这个人,比国际派那帮人识货,很早就看出来,上海那些马克思主义书呆子对他没有任何威胁,反倒是在江西农村闹革命 的这些泥腿子威胁更大。所以天天在报纸上喊打喊杀,要坚决消灭朱毛红军。搞得包括全国各地的红军、地下党在内的大部分人,都以为朱德和毛泽东就是中共最高 领袖。博古王明这些人大家都没听说过。这个时候,以周恩来为代表的中间派就站了出来,坚决要求把毛泽东带上,因为要是留在江西,被国民党抓住了或者杀掉 了,对士气影响太大。这是中间派第一次站出来支持本土派。其实这也说明,经历了从大革命到现在的各种失败,中间派已经开始动摇了,虽然在组织上还听国际派 的指挥,在心理上已经开始倾向于本土派了。

 

长 征开始以后,红军的逃跑路线很快就被蒋介石识破了,在西进路上布下重兵。国际派那帮人确实是缺乏实战经验。有点本钱的时候就天天琢磨着怎么去攻打大城市, 这叫“左倾冒险主义”;打输了开溜,马上就慌了,一根筋就想着赶紧到了湖南就安全了,一路狂奔,这叫“右倾逃跑主义”。在路上被蒋介石各种围追堵截,眼看 就要全军覆没了。这个时候中间派终于坐不住了,在遵义会议上,跟本土派的人联合起来,逼迫国际派把红军的指挥权交了出来。其实在那种情况下,毛泽东站出 来,率领红军搞兵变,把国际派那些人抓起来也是做得到的。因为输的实在是太惨了,你们这帮人在上海把自己的总部丢掉了,跑到江西来又把我们的根据地搞丢 了,现在三万红军战士血染湘江,军队里边的那种愤怒是可想而知的。如果毛泽东是个野心家,直接煽动军队搞哗变夺权,一下子就可以彻底解决问题,后边就没有 延安整风那些事儿了。

《红 太阳是怎样升起的》这个书里边有个说法,就是毛泽东这个人很阴险,在党和军队中间搞两面派。对党内,就说枪杆子里面出政权,用军权来夺取党权;在军内,就 说党指挥枪,用自己在党内的地位来压制那些军头。这个分析也是属于我们前面说的,用错误的逻辑来归纳正确的事实。毛泽东坚持党指挥枪是真的,而用军权来夺 取党权呢,只是借这个势,绝对不会坐实。毛泽东终其一生,都从来没有动用过军队来解决党内的政治对手。不管是在江西、在长征路上、延安整风、还是后来的文 化大革命,都是如此。在江西,党中央让他交出军权他就交出军权,连续交了三次;在长征路上,眼睁睁的看着跟自己一起上井冈山的红军战士白白牺牲,他还是坚 持要搞党内斗争。这是他作为共产党人的政治原则,不是什么两面派,什么野心家。

我 们做个对比:后来中央红军和四方面军会合以后,中央这边还没让张国焘交出兵权呢,也没让他的军队去打仗牺牲,他就坐不住了,仅仅是在北上还是南下的路线上 有了分歧,张就要发动兵变来逮捕毛泽东张闻天这些人,然后自立中央。这才叫用军权来夺取党权,这才能叫两面派。我们可以想象,如果当年国际派这帮人,不是 跑到毛泽东的地盘,而是跑到张国焘的地盘去指手画脚,还要他把军权交出来,那会是一个什么结果?

所 以中共内部那么多牛人猛人,为什么大家都服毛泽东?除了他指挥打仗厉害、制定战略厉害,很重要的一点,就是通过这些事情让大家看到,毛泽东这个人是确实把 革命事业而不是个人的权力地位放在第一位的。自己创建的军队,在自己的打出来的地盘里边,一群把地盘搞丢了的“上级”跑过来,让他上他就上,让他下他就 下,就这么搞了三次。有几个人能做得到?

最 神奇的是有一次,上海那个朝不保夕的中央开了个会,要罢免击败了蒋介石十几万军队的毛泽东,派了个职位很低的特派员过来传达命令,在路上走了一个多月,连 个书面文件都没有带,还把口信传错了,说要开除毛的党籍。毛泽东就马上卸任,交出党内军内一切权力,赋闲去了。这就叫共产党员的组织纪律性。这种人来当领 导,大家才会服你;你下的命令,大家也会坚决执行,这叫以身作则。

 

3.摆平山头

所 以遵义会议的结果,本土派重新掌握军权是必然的,不可阻挡的。但是由于毛泽东的妥协,国际派只是交出了军权。党内一把手张闻天还是国际派。中间派的周恩来 被授予军事行动的最高决策权,毛泽东复出,成为周恩来的副手。由于周恩来不懂军事,而且也比较谦让,所以实际指挥权仍然归毛泽东。打了几次胜仗以后,毛泽 东才成了军委主席,周恩来成了副主席,二人调换了一下位置,把这个关系理顺了。

毛 泽东掌权以后,最终成功带领红军走到了陕北,并且站稳了脚跟。树立起了巨大的威信,通过这样的胜利,慢慢的成为了中共实际上的一把手。但是这个一把手的地 位不是很稳固,甚至不是很明显。最高领袖名义上还是张闻天,虽然他比较支持毛泽东,本人也没有争权的野心。但他背后的国际派在苏联的支持下仍然非常强大, 特别是1938年共产国际代表王明回国以后,奉斯大林的直接指示,对共产党的抗日政策进行干预,要求“一切服从统一战线、一切经过统一战线”,要共产党服 从国民党的领导,放弃在抗日统一战线中的领导权。

有 了苏联的支持,王明就对中央最高领导层进行改组,把自己从苏联带回来的康生和陈云两个人塞进了中央书记处。这样中央书记处就变成了王明、毛泽东、张闻天、 康生、陈云这么一个组合,国际派占了4个席位。本土派只有一个军权在握、实在干不掉的毛泽东。中间派因为曾经“倒戈”而受到惩罚,周恩来被踢出了中央书记 处,一个位置也没有了。

所 以《红太阳》一书的作者拿七大的人事安排来说事,说毛泽东任人唯亲,挑选对自己“臣服”的人进入领导班子,还找了那么多理由。我们跟王明比一下就知道了, 毛泽东在七大的人事安排简直就是“和稀泥”:中央五大书记里面,中间派(周恩来)、国际派(任弼时)、本土派中的解放区(毛泽东)和白区(刘少奇)各个山 头的代表全都有。还有一个朱德,以前是国民党的将军,去过欧洲,去过苏联,周恩来介绍入的党,在井冈山跟毛泽东一起干革命,把毛泽东赶下台的事儿他也有 份,长征途中又被安排去张国焘的四方面军工作,跟各方面都有些渊源,德高望重、脾气又好,但是又不代表某个具体的派系势力,因而成为各派力量的缓冲和调解 人。

对比王明和毛泽东所搭配的两份名单,我们就知道什么叫“不怕不识货,就怕货比货”。你要从完美无缺的角度来挑剔毛的用人,怎么说都有毛病;但你要是跟同时期的其它政治领袖比,你就会发现若论大公无私、任人唯贤、不计前嫌这些品质,真没人比得过毛。

王 明当权,就专用国际派;蒋介石当权,就专用黄埔军校的嫡系;只有毛泽东当权,不管什么派别、什么山头的人,只要能干的、服从党的政治路线的,全都上。在军 队里也是,解放战争期间东北司令林彪算是毛的嫡系,西北司令彭德怀是独立性很强的无派别人士,中原战区司令刘伯承是国际派,毛泽东在井冈山被整下去以后, 在前线指挥反围剿的就是他,彭德怀大骂“崽卖爷田不心疼”也是骂的刘伯承;华东战区司令陈毅是中间派,跟周恩来邓小平他们一起留学法国回来的,算是周的铁 杆,但华东战区的实际指挥是粟裕,是长征开始后留在南方的游击队将领,刘少奇提拔上来的;华北战区是聂荣臻,在欧洲和黄埔军校期间都是周恩来的老部下。

所 以,在毛泽东的领导下,中央的五大书记、军队的五大主力战将,是各个山头都有。为什么延安整风后的共产党这么团结?不说是确立了毛泽东的领袖地位,有了领 袖就号令统一了。国民党老蒋的领袖地位早确立了,号令也统一,问题是大家都阳奉阴违,打起仗来都是各顾各。所以问题的关键不是共产党有没有领袖,而是毛泽 东这个领袖起到了什么作用?

他 的作用除了制定战略,很重要的就是能够超越派系,公正对待党内军内的各种力量,没有偏私。所以共产党的军队就特别抱团,一方有难、八方支援;国民党的军队 就是“友军有难,不动如山”。孟良崮战役,黄埔4期毕业生张灵甫率领的精锐74师快被围歼了,蒋介石天天发电报命令周边部队增援,除了黄伯韬的25师,其 它部队全都睁一只眼闭一只眼。这个25师为什么要拼死相救呢?因为师长黄伯韬不是黄埔的嫡系,却得到了蒋介石的重用,所以他就特别感恩,没有门户之见,真 的有为党国尽忠的决心。后来打淮海战役,三大兵团的统帅,只有黄伯韬不是黄埔嫡系,也只有他一个人最后战死沙场,另外两个黄埔出身的杜聿明和黄维都当了俘 虏。后来蒋介石在黄伯韬的追悼会上还说,“如果我手下的将领都像黄伯韬这样,怎么会打不过共军?”他始终没有意识到:如果他对待各个非黄埔系的将领都像对 待黄伯韬一样,他手下的将领才可能都跟黄伯韬一样。

 

—— 前面扯得有点远了,我们还是接着王明回国来说。他改组中央书记处的人事安排,私心太重太明显,把本土派打压了不说,把中间派也彻底得罪了。而且他所执行的 这种对国民党过分妥协的政策,随着国民党军队在正面战场的节节败退而失败了。但是王明背后有苏联的支持,大家暂时也拿他没办法。直到1941年苏德战争爆 发,苏联必须用全部精力投入对纳粹德国的作战,没有精力顾及中国了。毛泽东才抓住机会开始反击,发动了延安整风。

 

三、中国共产党的“独立运动”
延安整风有四个层面,《红太阳是怎么样升起的》这本书只是片面放大了第二个层面。它的第一个层面是公开宣传的“整风”,反“三风”:“反对主观主义以整顿学风,反对宗派主义以整顿党风,反对党八股以整顿文风”。

 

第二个层面是“整人”:本土派要打击国际派,团结中间派,夺取领导权。

 

第三个层面是“整军”,也就是纠正国际派和中间派奉行的“一切服从统一战线”的政治路线,确保中共对已经编入国民党军队序列的八路军、新四军的绝对领导,在抗战中发展壮大自己的军事实力。

当 时党内高层有一大批人,包括周恩来在内,觉得一切要以抗日为重,军队要服从国民党中央政府的统一指挥。但是毛泽东脑子还比较清醒,首先是蒋介石指挥打仗水 平不行,正面战场抵抗不住日本的进攻,把中共这点本钱拿去打正面的阵地战,很快就会拼光的,国民党也很乐意这么做;其次是蒋介石随时有可能放弃抗战,以牺 牲部分国土为代价换来和日本人联合剿灭共军,东三省就是前车之鉴。在这种情况下,在统一战线中,中共的军队要独立作战,按照自己制定的游击战加运动战的方 针来打,配合国民党的正面战场,但不是服从他们的调遣。双方是合作关系,不是上下级关系。要对抗战以后才加入八路军和新四军的新兵加强思想教育,服从党的 绝对领导,不能把国民党当上级。

 

此外,延安整风还有第四个层面,这个层面才是最根本的,是“整党”。

要通过整风和整人,在组织上、思想上、路线方针上彻底摆脱苏联的控制,实现中共的完全独立,最终完成从“共产国际中国支部”向一个完全属于中国的无产阶级政党的过度。

这 第四个层面是至关重要的,如果整风只进行到第二个、第三个层面,把国际派打倒了、把“一切服从统一战线”的路线否定了就完。但是在党内那种把苏联当成上 级,把苏联对马克思主义的理解当成是权威解释,把来自苏联的指示当成是代表全世界无产阶级利益的决定。那么就算这次打倒了王明,过几年党内如果再出现路线 斗争,苏联又可以派个“钦差大臣”过来充当最终仲裁者。

 

而 且,苏联这次派王明来干涉抗日统一战线的问题,跟以前的干涉有本质区别。以前的干涉出现错误,是因为苏联的共产主义领袖们不了解中国的国情,是认识上出现 了偏差,但他们跟中国共产党是站在一条战线上的,是为了中国共产党好,是好心办坏事。而这一次的干涉,是因为欧洲战场局势紧张,斯大林希望拉拢蒋介石政府 抗日,解除日本在东北对苏联的威胁。为了达到这个目标,他不惜牺牲中国共产党的利益,让中国共产党向国民党交出军权。也就是说,所谓世界无产阶级的最高领 袖斯大林,在苏联的国家利益和其它国家的无产阶级利益之间出现矛盾的时候,选择了前者。我们不能说斯大林这样的选择是错的,但这肯定是中国共产党不能接受 的。

 

《红 太阳是怎样升起的》这本书里面对这个事实轻描淡写,说是王明这个人能力不足,不能从苏联要到军事援助,所以毛泽东利用这种不满来攻击王明。这是很肤浅的。 这不是王明个人能力的问题,而是斯大林的重大战略选择。抗战开始以后,苏联竟然大规模向国民党援助军火,而只向共产党提供各种马克思主义的书籍。中共内部 戏称为,“军火给了资产阶级,书籍给了无产阶级”。在这样的情况下开展的整风运动,本质上就是一场中国共产党的独立运动,表面上是本土派向国际派夺权,实 际上是中国共产党人向苏联夺权。前者只需要高层斗争就能实现,后者则必须全面整党,所有党员都要接受这种思想意识的改造。

 

但 是,这第三个和四个层面又不能挑明了说,因为只是追求独立,不是彻底退出统一战线,更不是要跟苏联决裂。日本人还是要打的,苏联的社会主义老大哥地位我们 还是要承认的,以后需要帮忙的地方还很多。要给苏联,给斯大林留够面子,总不能直接说斯大林同志背叛了世界无产阶级吧。

所以,延安整风在表面上,说是整顿党风文风,看起来像是简单的思想教育工作。实际上,有两条线在暗中展开:

一是全面号召大家要承认“马克思主义中国化”的成果毛泽东思想,承认本土派的代表毛泽东在革命中的领袖地位,对以前的错误路线进行全面的批判和清算。让大家充分理解:苏联的指示、苏联式的社会主义道路不能盲目相信,更不能当成最高权威;

另 一个,就是要严格审查抗战以来到延安或者参加八路军、新四军的人员。这些人哪些是冲着共产主义来的,哪些是冲着抗日来的,哪些是国民党的特务,要搞清楚。 因为那个时候国共合作抗日嘛,很多人到延安来或者加入八路军,不是说我信仰共产主义,而是说我要参加抗战。这些人共产党也欢迎,但是具体态度要搞清楚,以 后跟国民党开战了才能区分什么样的人是可以依靠的。此外,由于共产党合法化了,很多以前被国民党抓起来关在监狱里的共产党员也给放出来了。这些人当中有谁 是坚持斗争的,哪些是屈服认输的,哪些是变节投降的,都必须要搞清楚。这个工程非常浩大,当时又没有个人档案管理系统,身份证户口本也都没有,只能是你自 己写材料,再加上各方面的人给你写证明,互相对照看看有没有撒谎……这中间出现很多差错,很多人觉得自己很无辜,受了很大的委屈,是不可避免的。

《红 太阳是怎样升起的》的作者,就利用这种延安整风的口号和实际做法的差异,大量考证了那些被冤枉的案件,然后扣到毛泽东头上:你看你,口头喊的是整顿学风文 风,实际上大搞个人崇拜,对不相信你个人崇拜的人搞政治审查、政治迫害。你要想掌权我们理解,那打倒王明这些人就可以了嘛,为什么还要批倒斗臭,把下边的 人也搞这么惨?

按照这个逻辑,那毛泽东当然是个坏人,是个大阴谋家、权力狂。但是延安整风实际上要同时完成两大战略任务:

第一,让中国共产党彻底摆脱苏联的控制,成为一个独立的本土化政党;

第二,保证共产党在抗日统一战线中的独立性,为即将到来的国共战争做好组织上思想上的准备。

这是一个非常残酷的时代,每天都有成千上万人在战场上死去,还有更多的普通百姓“辗转死于沟壑”。毛泽东和他的同事们所要做的事,是扭转乾坤。从这个角度来看,则毛泽东发动这场整风运动,对党员干部进行思想改造和审查,其严厉程度并不过分。


四、毛泽东的忏悔                       

就 在苏德战争爆发和延安整风之前,苏联刚刚进行了一轮类似的“整风运动”。它的目的,也是在于对苏联共产党建党的各种路线方针进行总清算,统一政治路线。在 这场被称为“大肃反”的运动中,最高领袖斯大林采取了非常冷酷无情的手法来镇压党内反对派:领导十月革命的29名中央委员和候补委员中,有15人被处决, 党的“第十七次全国代表大会”(1934年)选出的71名中央委员中,除了基洛夫被暗杀外,只有19人活下来,其余均被处决或自杀。在中层和底层中间被处 决的人数更多。

所 以我还是说:“不怕不识货,就怕货比货”,斯大林这种做法,才叫“树立自己在党内的绝对统治地位。”毛泽东这种让大家参加学习班、写思想汇报、开会批斗的 方式,离建立绝对统治地位还远得很。你要用我们今天在和平时期、法制建设比较完善的标准去评价老毛的这些做法,那肯定是问题多多。但要是跟共产党的最高领 袖斯大林比较一下,毛泽东这么做简直就是宅心仁厚、菩萨心肠,用思想改造来取代“肉体消灭”,这是一个很大的进步。

 

1.痛苦的肃反

 

中 国共产党在国际派当权的时期,受苏联的影响,也喜欢在党内军内搞肃反。那时候生存环境很艰难,国民党特务渗透的很厉害,一不小心就会被连窝端了,所以通过 各种严刑逼供等手段审查特务,制造了很多冤案,杀错了很多人。这样的肃反活动是什么时候终止的呢?就是在毛泽东掌权以后。

也 就是从延安整风运动开始,一直到毛泽东去世,中共内部再也没有搞过成批杀人的肃反运动。包括文化大革命这种空前规模的政治运动,也没有因为政治问题杀掉一 个党内的中高层。有一些像张志新、遇罗克这样的人确实是被冤杀了,但他们只是普通党员,死刑命令不需要经过毛泽东批准。这是他控制不了的。凡是需要毛批准 的、涉及政治问题的死刑申请,全部都被他否决了。从延安整风提出“一个不杀”的口号开始,毛泽东把这个“党内斗争不杀人”的原则坚持了一辈子。新中国的开 国元勋们,没有一个死于处决或者事实上的处决(比如关起来不给饭吃饿死或者被殴打致死等)。

毛 泽东为什么要有这样的坚持?有一个很大的原因就是吸取了红军时期肃反扩大化的教训。那个时候在国际派的领导下,所有的革命根据地都在搞肃反:邓发的闽西、 贺龙和夏曦的二方面军、张国焘的四方面军,也包括毛泽东的江西根据地,都搞的很厉害,都犯了严重的扩大化的错误。有些根本就是无中生有,成千上万的红军战 士被冤杀。

最 扯的是邓发在闽西搞的反对“社会民主党”的肃反,是因为苏联那边在搞这个,国际派那帮人就学着苏联开始干。你想在福建的大山里头,手机电视电话广播报纸全 都没有,只有几台电报供领导人跟中央联络,怎么会有人受到东欧那边的“社会民主党”的渗透?谁知道第二国际的主张跟第三国际的主张有啥区别?但就这样,邓 发领导的闽西肃反也杀了好几千“社会民主党人”。

这 个时期毛泽东也曾经头脑发热,犯了很严重的错误。但是像《红太阳是怎样升起的》这本书里面,把主要责任归结到毛泽东头上,也是不对的。如果其它根据地都没 有肃反,唯独毛泽东的江西在搞肃反,这样说当然可以。但实际上是所有的根据地都在搞肃反,且大部分都搞的比江西还厉害,这就不能说是毛泽东的主要责任了。

 

2.“一个不杀”

 

在 党的七大上,毛已经完全掌权以后,他就说:“肃反,走了极痛苦的道路。反革命应当反对,党未成熟时,在这个问题上走了弯路,犯了错误。”他用了“极痛苦” 这个词来描写当年的肃反,这是党和红军的痛苦,也是他自己的痛苦。他反思这种痛苦和错误的方式,就是下定决心,绝对不能再让滥杀人的肃反运动重现。《红太 阳是怎样升起的》这本书里边说啊,毛泽东在延安整风里面忍着没有杀人,是因为苏联的干涉,是收到季米特洛夫反对整风扩大化的电报以后才被迫收敛的。但问题 是毛泽东“一个不杀”的指示是在收到季米特洛夫电报之前就下达的。作者也承认这一点,只好说:毛泽东说这样的话,只是为了显示自己宽大,实际上整风扩大化 的势头根本没有终止,毛泽东也不想终止,是收到电报以后才被迫将假话变成实际行动的。

这种逻辑很难去辩驳它:反正好话都是虚伪的,好事都被被迫的。怎么反驳?

不过我们还是可以来看一下,等中共统一中国、打赢了抗美援朝、斯大林都死了的情况下,谁也不用怕的毛泽东是不是继续这么说、这么做?还是说终于露出獠牙,老子要大开杀戒了,谁也管不住我了?

1956年4月26日,在政治局扩大会议上,毛泽东做了著名的《论十大关系》的讲话,里面专门提到了如何处置反革命:

 

“机关、学校、部队里面清查反革命,要坚持在延安开始的一条,就是一个不杀,大部不捉。……

什 么样的人不杀呢?胡风、潘汉年、饶漱石这样的人不杀,连被俘的战犯宣统皇帝、康泽这样的人也不杀。不杀他们,不是没有可杀之罪,而是杀了不利。这样的人杀 了一个,第二个第三个就要来比,许多人头就要落地。这是第一条。第二条,可能杀错人。一颗脑袋落地,历史证明是接不起来的,也不像韭菜那样,割了一次还可 以长起来,割错了,想改正错误也没有办法……

但是,要不要立条法律,讲机关里的反革命一个不杀呢?这是我们的内部政策,不用宣布,实际上尽量做到就是了。假使有人丢个炸弹,把这个屋子里的人都炸死了,或者一半,或者三分之一,你说杀不杀?那就一定要杀。

机关肃反实行一个不杀的方针,不妨碍我们对反革命分子采取严肃态度。但是,可以保证不犯无法挽回的错误,犯了错误也有改正的机会,可以稳定很多人,可以避免党内同志之间互不信任。……这样做,对人民事业,对国际影响,都有好处。”

 

把前面这些话,跟毛泽东在七大上的讲话对照起来,我们就可以看得出,他对红军时期肃反问题的反省是很真诚、很深刻的。

胡 风、潘汉年、饶漱石这些人都是毛泽东亲定的反革命分子,也都是老党员。但是他坚决不准杀掉这些人,一方面是要留有余地,避免杀错;另一方面是他很明白“上 行下效”的道理:上头一开始杀人,下面就会蜂拥而上,跟着杀掉一大批人。所以制止政治斗争乱杀人的方式,就是对上面的这些反革命头子,一个不杀。像胡风、 潘汉年、饶漱石这些人,如果杀了,下面那些跟他们有牵连的人,很多就会跟着被杀掉。那些小人物是毛泽东顾不过来的,不可能一个一个的去审查该不该杀。如果 “首恶分子”都留着不杀,下边受牵连的人就没有道理要杀掉了。

此 外,毛泽东还认识到一个道理:“犯了错误也有改正的机会,可以稳定很多人,可以避免党内同志之间互不信任”。不管是批斗也好、撤职查办也罢,只要不杀头, 很多人还是有勇气说真话的。不杀人,就始终给人保留了希望,只要你坚持的东西真是真理,将来总有翻盘的一天。这样,党内斗争就可以控制在比较理性的范围 内。

这 种理性化的处置方式,使得中国最终走上了跟苏联完全不同的发展道路。文化大革命期间,有很多很多人被冤枉了、受到了政治迫害。但是呢,大部分人,只要身体 比较好、心理没有想不开自杀的,都成功熬过了文革,等到了平反昭雪的一天。所以中国的改革开放为什么那么顺利,因为这个社会的精英阶层只是被暂时打倒了, 没有像斯大林的肃反一样直接从肉体上消灭。只要路线方针一走上正轨,这些人马上就可以出来工作,整个社会没有出现严重的人才断层。在各行各业,马上就涌现 出一大批经验丰富的高级人才。被冤枉的人肯定不会喜欢文革,但大部分跟文革也没有带血的仇恨,既然已经结束了、平反了,“四人帮”也抓起来判刑了,大家也 就可以接受邓小平提出“团结一致朝前看”的思想,一起搞建设,而不是去清算以前的事情,没有像斯大林死后那样,出现“匈牙利事件”等社会动乱。

如 果毛泽东像斯大林一样,把反对他的高级干部都杀掉了,那么等到1990年前后东欧剧变、苏联解体的时候,没有邓小平、陈云、王震这些老革命镇着,党内军内 掌权的都是一些没有经历过长期考验的新人,中国很有可能就跟东欧、跟苏联一样,陷入严重的社会动荡,甚至出现内战,新疆西藏这些地方有可能就分裂出去,我 们今天就像南斯拉夫、乌克兰、俄罗斯一样。谁要还说什么中国崛起、世界第二大经济强国之类的,恐怕就像神经病说梦话一样了。

 

五、杀与不杀之间
 

话 又说回来,真正心慈手软的人肯定当不了革命领袖。毛泽东的“一个不杀”是仅限于政治斗争范围内,对于武装起来的敌人,他消灭起来是毫不手软的。还有就是有 血债的,也就是毛泽东说的“往屋子里丢炸弹”的反革命,该杀还是要杀。比如建国后的镇压反革命,很多地方的“东霸天”、“南霸天”这种黑社会、会道门头子 就狠狠的杀了一批。

 

对此,崇新岳先生在他的天涯博文《高岗事件的来龙去脉》里面归纳了一条,我觉得归纳的非常好,就是说只要你是出于“为公”的心,不论犯了多大的错误,毛泽东都不杀。但是如果是出于个人的私欲,他是毫不手软的。

最 典型的就是刘青山、张子善,这是两个为国家立下汗马功劳的高级干部,他们并非毛的反对派,但是贪污了公款,毛泽东毫不犹豫的下令枪决,谁求情也通不过。像 邓小平这种横跨党(当过总书记)政(当过副总理)军(当过大兵团政委、淮海战役前敌总指挥)的实权人物,跟老毛明显不是一条心的,竟然一不杀头二不坐牢三 不开除党籍,毛泽东还特别关照保护他的人身安全,只要他表现出一点悔改的意思,很快又提拔上来重用,原因是“人才难得”。两相对比,就可以看出毛在用人和 杀人方面的这种气度。

 

还有一个很经典的对比。就是毛泽东和蒋介石在处理手下的功臣杀人案上所采取的截然不同的态度。

1935年,蒋介石的爱将、黄埔嫡系张灵甫因为怀疑妻子不忠而将其枪杀,此事震动全国。蒋介石下令严惩,关了一年之后法院判了死刑,但是蒋介石又宣布念其有功于党国,不予执行。等到抗战开始以后,便以国家急需人才、将功赎罪为由把张灵甫给放了出来,官复原职,继续当将军。

张 灵甫杀妻案两年后的1937年,红军将领黄克功——他在长征途中为毛泽东的四渡赤水和攻克娄山关两次最得意的战役立下过大功——因为女朋友刘茜要跟他分 手,不忍其忿,将刘枪杀。此事也在延安引起轰动。黄克功给毛泽东写信,承认了罪行,要求上战场将功赎罪,表示想死在战场上。毛泽东最终决定将其公审并处 决,并且在宣判的时候委托审判长雷经先公开宣读了他写的一封信:

 

“雷经天同志:

你及黄克功的信均收阅。

黄克功过去的斗争历史是光荣的,今天处以极刑,我及党中央的同志都是为之惋惜的。

但他犯了不容赦免的大罪,一个共产党员、红军干部而有如此卑鄙的,残忍的,失掉党的立场的,失掉革命立场的,失掉人的立场的行为,如赦免他,便无以教育党,无以教育红军,无以教育革命,根据党与红军的纪律,处他以极刑。

正因为黄克功不同于一个普通人,正因为他是一个多年的共产党员,正因为他是一个多年的红军,所以不能不这样办。共产党与红军,对于自己的党员与红军成员不能不执行比一般平民更加严格的纪律。

当此国家危急革命紧张之时,黄克功卑鄙无耻残忍自私至如此程度,他之处死,是他自己的行为决定的。一切共产党员,一切红军指战员,一切革命分子,都要以黄克功为前车之鉴。

请你在公审会上,当着黄克功及到会群众,除宣布法庭判决外,并宣布我这封信。对刘茜同志之家属,应给以安慰与体恤。

毛泽东

1937年10月10日”

 

——这样一封信,今天读起来,仍然有一种让人感动的感觉。蒋介石为什么会以绝对优势之兵力而完败于毛?从这封信里面,可以找到答案。

                                                                                                       

此 外,毛泽东从上井冈山开始,就自创了一条很变态的规定,叫做:“优待俘虏”。这个东西也是共产主义运动和中国历史上没有过的,就是老毛自创的。简单来说, 就是对于被俘的敌人,不准打骂虐待。普通的士兵,愿意加入我军的,就加入,不愿意加入的,就地遣散,而且还要给他们发钱,当作回家的路费。至于他是回去再 加入国民党,还是真的回家,我们不管。那种回去继续参军,下次又被俘虏的,怎么办?不管被俘多少次,一律继续发钱遣散。

被 俘的高级军官属于战犯,不放,但是也要优待,一个不杀。从红军时期到解放战争结束二十多年里,毛泽东指挥的军队俘虏了无数国军将领,但被枪毙的只有一个张 辉瓒。这家伙在“围剿”期间烧杀抢掠,杀了很多根据地的老百姓,民愤极大。被俘虏以后,毛泽东和朱德还商量说张辉瓒这个人是正规军事科班出身,可以让他当 个教员,给我们上课讲讲军事知识。但是命令还没有传达下去,前线的指战员,在愤怒的士兵和群众的压力之下,就已经把张辉瓒给枪决了。所以实际上毛泽东对于 敌军将领,也是跟对待政治对手一样,是坚持“一个不杀”的。

为 什么?因为战场上杀人,跟政治斗争中整人一样,都是实现政治路线的必要手段。我们跟敌人交战,双方都是为了让自己相信的政治路线得到执行,都是“为公”。 这跟那种当地方恶霸,为了自己的利益欺压甚至杀害普通百姓的“东霸天”、“南霸天”不是一个性质。后者是为私,在镇反运动中就统统杀掉了,杀起这些人来, 毛泽东是眼睛都不会眨一下;前者是为公,杀的人数量比前者还多,但是被我们抓住了就一个不杀,不报复。像后来淮海战役里面被俘的黄埔将领杜聿明,他指挥的 军队杀死的共产党人,哪个地方恶霸比得上?但被抓以后坐了几年牢,建国后没多久就给放了出来,还当了政协委员,后来还当上了政协常委,单论级别的话,比他 在国民党那边还要高,活到了1981年,老毛死了他都还没死。这种公私分明的气度,古往今来,有几个领袖能够做得到?这个政策我之所以叫它“变态”,是因 为它违背人性——喜欢报复的人性。毛泽东能够克服这种战场上的仇恨,公正对待自己最大的敌人,让人不得不服。

 

跟 斯大林比,毛泽东知道什么样的人不该杀、不能杀;跟蒋介石比,毛泽东懂得什么样的人应该杀、必须杀。不是当老好人,也不是滥杀无辜,而是把这个公与私、宽 和严分得很清楚、很让人信服。像这个罗瑞卿大将,是毛泽东的亲信,但是在文革的时候,毛泽东亲手把他打倒了。他觉得很冤枉,愤而跳楼自杀,摔断了腿。毛泽 东听说了,也不说要调查一下有没有冤情,而是很不屑一顾的说罗瑞卿这个人没出息,这么点事儿就自杀。后来在文革里面罗还被关进了监狱。但是当他听到毛泽东 去世的消息,竟然伤心得流泪,不顾病体带着妻子、拄着拐棍去向毛主席像鞠躬。这不是说罗瑞卿这个人有受虐倾向,或者觉得自己被整得好、整的对,而是因为他 在毛泽东身边工作时间长,知道毛泽东这个人不管是提拔你还是整你,是整错了还是整对了,他都是出于公心,不是私仇。

 

 

六、斗争与团结之间

把关于毛岸英和延安整风的谣言分析清楚了,我们来总结一下,说这个毛泽东为什么能成为中国历史上一千年才出一个的领袖人物。

所有原因当中,最重要的是能够制定正确的战略,能把队伍带到正确的方向上去,在战场上打赢敌人。这方面的东西我党一直在大力宣传,我就不多说了。

 

除此以外,我觉得至少还可以提取出三条。

 

首先,领袖人物做事情要以身作则。

毛泽东在井冈山三上三下,受了天大的委屈,也要服从党的决定,所以他的军队纪律严明;毛泽东敢把自己唯一健康的儿子送到最危险的战场上去,并且真的牺牲在那里,所以他的军队在朝鲜视死如归。花言巧语说多了没用,关键看你自己在关键时刻怎么做,下面的人都是睁着眼睛看的。

在 大革命失败、共产党人惨遭屠杀的时候,没有当过一天兵、没有上过一次战场毛泽东就敢带着部队造反。再看王明,一见大革命失败,呆在中国有被杀头的危险,他 就溜回苏联去了。等到老毛他们这些人九死一生走完长征到了陕北,开打抗日战争了,跟国民党建立统一战线了,他这才坐着飞机到延安来争夺领导权了。两相对 比,高下立判。像王明这样的人,你再聪明、水平再高,大家怎么会服你的领导?

 

第二,要摆平山头,而不是打压山头

毛泽东在七大人事安排的时候专门就山头问题讲过一段话:“山头,它是一个客观存在着的东西,不能简单地宣布取消了事;我们的原则应该是承认山头,削弱山头,最后再消灭山头。”

削 弱和消灭山头的前提,是承认和照顾山头。一个团队在创业成长的过程中,不同时期加入进来的、不同背景的人……总会形成不同的山头。不能简单的把这些东西视 为“小团体主义”,一味的打压。解决的关键是公平对待,而且还要适当的照顾平衡,对于比较弱势的山头,要略微有点优待。让各个山头的人都感觉到:领导是公 正的,这个团体里面,并不需要依靠自己这个山头来升官或者自保。慢慢的这些山头就会消失。

如 果领袖人物自己独占山头,专用自己的嫡系,那么其它的山头不仅不会消失,还会加强,因为其它山头的人看到了:只要没有进入嫡系的范围,就是没有希望获得领 袖认可的。所以,山头内部的人必须团结起来争权夺利,有共同的困难也不要管,首先是要保住自己这个山头的利益。这样,最后必然导致这个团队四分五裂。蒋介 石就是前车之鉴。

 

第三,要团结,更要斗争,要以斗争来促进团结。

 

斗争哲学是毛泽东思想里面一个特别有意思的地方。因为老有人说嘛,说中国人就喜欢中庸之道。毛泽东就说,这是胡说八道,中国人就是好斗。

老 毛这个人就特别好斗,不像周恩来这么热爱和平。在他看来呢,斗争是人类进步的必要手段。任何一个国家、一个团队,如果老是搞一团和气,那这个团队肯定没有 活力、没法进步。外表看起来啥问题都没有,其实里面不知道隐藏了多少危险,说不定哪天就爆发了。所以毛泽东的哲学就是要主动挑起斗争,大家要不停的批评和 自我批评,在矛盾爆发之前先把矛盾挑明,犯了路线错误的就要打倒,就要开会批斗。只有经过了充分的斗争,把矛盾问题都摆出来说清楚了,才能真正实现团结。 所以说,斗争是团结的前提。

毛泽东的高明之处在于,他坚决把这种斗争限定在理性的范围内。所以不能采用极端手段来搞斗争,比如大规模杀人。这里面的平衡非常难以把握:斗争过于温和了,人人都能过关,起不到效果;斗争过于激烈了,有可能导致非理性的仇恨。

比 如说延安整风,一方面必须要整,不能不整,否则中共在思想上永远摆脱不了苏联的控制;另一方面,当时日本人占据了大半个中国,国民党也随时准备伺机消灭共 产党,斗争的太狠了,万一引起党的分裂,那问题就严重了,就是生死存亡的危机了。毛泽东就好像一个走钢丝的高手一样,极为小心的维持着这种斗争与团结的平 衡,这里面体现出来的领导艺术,是非常高超的。在如此激烈的战争环境下,在完全不耽误对外作战的情况下,竟然完成了对共产党的一次脱胎换骨般的内部整顿。

以 前我老是有个疑问,因为看了很多不严谨的所谓“历史研究”,觉得这个共产党高层天天斗争那么激烈,为什么越斗争越厉害,最后连美帝都给打赢了?国民党那帮 人为啥就越斗争战斗力越烂呢?这个东西不科学啊!哪有一个团队的高层领导忙于内斗而下面的人能够不断取得一个又一个胜利的?你看太平天国不就是亡于内讧 吗?共产党为什么没有亡于内讧呢?要是中共和毛泽东的历史真的像高华袁腾飞啊这些人讲的那样,中共早就灭亡了,对不对?

后来我才明白这是啥原因。“以斗争促团结”这个东西,实在是高明到了极点的领导艺术,只有兼具完美人格和极高智慧的人才能做得到。

 

七、庸俗与真相之间
 

我看过很多质疑毛泽东政治品质的文章,但是书读得越来越多之后,我才发现这些东西实在是矛盾百出。包括像高华、余英时这些看起来像很严谨的学者的著作,但仔细深入的辨析的结果,发现竟没有一条是站得住脚的。像余英时描写毛泽东上井冈山,说:

“毛泽东利用其与流氓打交道的手法,是相当成功的,他满口仁义道德,哄得袁王两人贴贴服服。王佐是一个头脑简单的土匪,袁文才又有浓厚的个人英雄主义思想,三个一拍即合,大块肉大碗酒的结拜为弟兄。”

这 段话实际上就是说,老毛也是半个流氓,所以才能忽悠土匪。整篇文章余英时都忽略了一点(我觉得是故意的,作为一个研究这方面的学者,不可能不知道一些基本 的事实),那就是:袁文才在见到毛泽东之前就已经加入了中国共产党。他和王佐在毛泽东发动秋收起义几乎同时发动了宁冈农民暴动,从国民党监狱里面救出了一 批在当地搞农民运动的共产党,然后退守井冈山。当时二人的身份是中共宁冈县委下面的军事干部。他们以前当过土匪,身上也有匪气,但早已被中共收编了,并不 是等到毛泽东带队伍来井冈山的时候被毛的“满口仁义道德”忽悠的。

余英时还是个学者,尚且如此,网络上那些各种关于毛的谣言传言,其荒谬之处就更为不堪了。

 

我 以前是学经济学的,没怎么花功夫来考究有关于中国改革开放以前的历史细节。关于毛泽东的知识,很多都来自于网络文章。但是从2008年金融危机爆发以后, 我发现以前学习的那些西方经济学的东西,问题实在是太多了。去欧洲和美国学习了一段时间之后,发现更是如此。认真反思的结果,就是中国经济的成就和问题, 都不能用西方的那一套框架来分析。不把中国社会主义的根基搞清楚,就没办法解释中国过去三十多年的经济奇迹。要搞清楚中国的社会主义的根基,就没办法避开 毛泽东。

2012 年8月,我历时四年完成的《中国崛起的经济学分析》这本书写完了也出版了。当时有了一种自满的心理,觉得改革开放这三十多年的脉络,已经基本被我说清楚 了。谁要是搞不清楚,看完了这本书,也就清楚了。但是对于改革开放之前的历史,我还是一知半解,面上的政策变动都知道,但这些政策怎么来的,为什么会有那 么多反复,却完全搞不清楚。所以,这才花时间来认真的读一些关于毛泽东的历史资料。

看 得越多,越发现网上那些东西实在太不靠谱。特别是针对个人道德品质的问题,几乎是清一色的阴谋论。我觉得这是很糟糕的,我们就不说政治意识形态的影响了, 就是对普通人的人生观价值观也很不好。这种庸俗的历史分析,会让大家觉得:哦,原来我之所以没有成为领袖人物,主要原因是我心理不够阴暗、权力欲不够强 盛、搞阴谋诡计水平不够高、整人的时候不够心狠手辣……

实 际上,真实的历史应该给那些不甘于平庸的人们这样的启迪:我们之所以没有成为一个团队中令人信服的领袖人物,是因为我们面对诱惑的时候难以抵抗、面对困难 的时候不够勇敢、面对危险的时候不能够身先士卒、面对私情和公利的抉择的时候犹豫不决;在需要斗争的时候抹不开情面、需要团结的时候意气用事,需要平衡山 头的时候任人唯亲……

 

毛 泽东就是这样一面镜子,这种一千年才出一个的伟大人物,可以照出我们普通人的弱点和缺点。平庸的人不愿意承认,对待这位新中国的国父,就像小姑娘们看《甄 嬛传》一样,只要有足够多惊险刺激的争权夺利的故事就好了。很多谣言,正好迎合了大众的心理,因而得以大行其道。我今天要辟这些个谣,讲清楚:毛泽东这个 人,近代中国一百多年的战乱和屈辱,那么多英雄人物抛头颅洒热血,最后由他出来终结这一切,并不是偶然的。他取得的功劳和地位,当之无愧。作为一个政治军 事领袖,不能说他永远英明正确,但是作为一个以复兴中国为使命的人,他在人格上是基本完美无缺的。

—— 当然了,这个结论要想站得住脚呢,还有一个很大的问题需要去回答,那就是他发动文化大革命到底是为什么?毛泽东在文化大革命期间的所作所为,能不能说是人 格上没有问题呢?我觉得是没问题的。但我们前面已经讲得够长了,要再讲一下文革又不知道还要讲多久,所以呢我们就此打住。以后如果有机会,我们前面讲的故 事还可以继续。大家如果想继续往下看呢,就请关注我的新浪微博@李晓鹏1982,或者微信公众号鹏友圈1982,注意这个鹏不是朋友的朋,而是旁边多了一个鸟,大鹏鸟的鹏。好,我们这次就讲到这里。谢谢大家。

Enable SSD TRIM on Mac OS X Yosemite

I. enable TRIM

  1. Backup the file before patching:
    sudo cp /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage.original
  2. [Yosemite only] Disable driver signature check by setting boot-args:
    sudo nvram boot-args="kext-dev-mode=1"
  3. [Yosemite only] Reboot after setting boot-args:
    sudo shutdown -r now
  4. Patch [Yosemite 10.10, Mavericks 10.9.5, 10.9.4] driver:
    sudo perl -pi -e 's|(^\x00{1,20})[^\x00]{9}(\x00{1,20}\x54)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
    # for Mavericks and Mountain Lion from 10.8.3 to 10.9.3 
    #sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00{1,20})[^\x00]{9}(\x00{1,20}\x54)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
     
    # for Mountain Lion from 10.8.1 to 10.8.2 and Lion 10.7.5
    #sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00{1,20})[^\x00]{9}(\x00{1,20}\x4D)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
     
    # for Mountain Lion 10.8.0 and Lion 10.7.4 BELOW
    #sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00{1,20})[^\x00]{9}(\x00{1,20}\x51)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
  5. [Yosemite only] Rebuild kext cache (take a while):
    sudo kextcache -m /System/Library/Caches/com.apple.kext.caches/Startup/Extensions.mkext /System/Library/Extensions
    It will display the message like below:
    kext-dev-mode allowing invalid signature -67061 0xFFFFFFFFFFFEFA0B for kext IOAHCIBlockStorage.kext
    It is fine.
  6. Now it is time to reboot:
    sudo touch /System/Library/Extensions/
    sudo shutdown -r now





II. Recovering from stop sign on boot screen

If you stuck on the grey boot screen with a stop sign, here’s how you get back into OS X:
  1. Boot into recovery mode by holding CMD+R during boot
  2. If your volume was encrypted with FileVault, open Disk Utility and unlock/mount your drive
  3. Open the Terminal and run the command:
    nvram boot-args
    If it shows “kext-dev-mode=1″, you can skip to Step 5. If it says “error getting variable”, continue with Step 4.
  4. Run the command:
    nvram boot-args=kext-dev-mode=1
  5. Reboot back in to Recovery Mode again.
  6. Run these commands, replacing Your Disk Name with the name of your Mac disk (partition). You can type ls /Volumes to get a list of volumes. Note the quotes around the disk path and that there should be no / before System.
    cd "/Volumes/Your Disk Name"
    touch System/Library/Extensions
    kextcache -prelinked-kernel System/Library/Caches/com.apple.kext.caches/Startup/kernelcache -K System/Library/Kernels/kernel System/Library/Extensions 
    
  7. Wait until it finishes (can take as long as 5-10 minutes, don’t abort it) and reboot.
You should now be back in OS X with Trim enabled.




III. Revert back to original driver (TRIM will be disabled)

  1. Boot into recovery mode by holding CMD+R during boot.
  2. If your volume was encrypted with FileVault, open Disk Utility and unlock/mount your drive
  3. Open the Terminal and run the following commands: (Note: the quotes around the disk path and that there should be no / before System, except for the first part of the cp command.)
    nvram -d boot-args
    cd "/Volumes/Your Disk name"
    rm -rf System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
    cp -r /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage.original System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
    
    chown -R root:wheel System/Library/Extensions
    chmod -R 755 System/Library/Extensions
    touch System/Library/Extensions
    kextcache -prelinked-kernel System/Library/Caches/com.apple.kext.caches/Startup/kernelcache -K System/Library/Kernels/kernel System/Library/Extensions
  4. Wait until it finishes (can take as long as 5-10 minutes, don’t abort it) and reboot.
You should now be back in OS X with Trim disabled.




see also

Enable Java Applet in Safari browser 7 and 8 on Mac OS X (Mavericks and Yosemite)

  1. Make sure you have the latest Java installed, click here. In the test page, clicked on the words "Inactive Plug-In" to start the applet.
  2. Go to the web page contains Java applet.
  3. When you see a dialog box asking "Do you want to trust the website "xxx.org"?", click Trust to allow the plug-in to run. This is only requested once, but it will be requested for each website.
  4. If the applet is self-signed, you need to explicitly allow the website in "Java Control Panel":
    • Open System Preferences, then click Java, then click reopen Java Control Panel



    • In Java control panel, activate Security tab, tick Enable Java content in browser, set security level to high, the click Edit site list... to add exception site

    • Click Add button then enter the site address. Note: the protocol is required. And the port number need to specified if it is not the standard port for the protocol.

  5. If the Java applet reads/writes local files, it will not work. Because Safari blocks file i/o by default. You need to do the following to allow it:
    • In Sarafi, open Safari menu, then select Preferences..., in the dialog, select Security, allow Internet plug-ins, then click Website settings...
    • In the left column of the new dialog window, select Java; In the right column site list, select the website, click the drop-down menu button, then select Run in unsafe mode.

see also

Change cpu scaling governor in Linux

There are following modes can be choose from:
  • performance keeps the CPU at the highest possible frequency
  • powersave keeps the CPU at the lowest possible frequency
  • userspace exports the available frequency information to the user level (through the /sys file system) and permits user-space control of the CPU frequency
  • ondemand scales the CPU frequencies according to the CPU usage (like does the userspace frequency scaling daemons, but in kernel)
  • conservative acts like the ondemand but increases frequency step by step
Mine defaults to userspace, to change to powersave mode:
echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

A script to disable and enable intel cpu turbo boost on Linux

I have a Thinkpad T410 laptop with i5 cpu. The computer turns off when compiling GWT code because of cpu overheating. The cpu temperature increases to 100 degrees in about 3 minutes even if I set the fan speed to maximum 5000rpm.

So I looked for resolution and found disabling turbo boost can help.
  1. First, you need to install msr-tools:
    sudo apt-get install msr-tools
  2. To disable turbo boost on all your cpu cores:
    sudo wrmsr -pi 0x1a0 0x4000850089
    where i is the cpu core number, e.g. 0, 1, 2, 3..., you can get those number by running
    cat /proc/cpuinfo | grep processor
    .
    Note: you need to run the wrmsr command for each cpu core.
  3. To re-enable turbo boost on all your cpu cores:
    sudo wrmsr -pi 0x1a0 0x850089
    where i is the cpu core number, e.g. 0, 1, 2, 3..., you can get those number by running
    cat /proc/cpuinfo | grep processor
    .
    Note: you need to run the wrmsr command for each cpu core.
After disabling turbo boost, I am able to complete my GWT compilation altough the temperature still goes as high as 90 degrees.

A script to disable/enable turbo boost

The following script can be used to turn off/on turbo boost:
#!/bin/bash

if [[ -z $(which rdmsr) ]]; then
    echo "msr-tools is not installed. Run 'sudo apt-get install msr-tools' to install it." >&2
    exit 1
fi

if [[ ! -z $1 && $1 != "enable" && $1 != "disable" ]]; then
    echo "Invalid argument: $1" >&2
    echo ""
    echo "Usage: $(basename $0) [disable|enable]"
    exit 1
fi

cores=$(cat /proc/cpuinfo | grep processor | awk '{print $3}')
for core in $cores; do
    if [[ $1 == "disable" ]]; then
        sudo wrmsr -p${core} 0x1a0 0x4000850089
    fi
    if [[ $1 == "enable" ]]; then
        sudo wrmsr -p${core} 0x1a0 0x850089
    fi
    state=$(sudo rdmsr -p${core} 0x1a0 -f 38:38)
    if [[ $state -eq 1 ]]; then
        echo "core ${core}: disabled"
    else
        echo "core ${core}: enabled"
    fi
done

Usage:
You can copy the above script and save it into a file named turbo-boost then set it to be executable:
sudo chmod +x turbo-boost
you can then use it to disable/enable turbo boost:
  • turbo-boost disable
  • turbo-boost enable


See also

echo with color in shell script

  • The colour codes:
    Black        0;30     Dark Gray     1;30
    Blue         0;34     Light Blue    1;34
    Green        0;32     Light Green   1;32
    Cyan         0;36     Light Cyan    1;36
    Red          0;31     Light Red     1;31
    Purple       0;35     Light Purple  1;35
    Brown/Orange 0;33     Yellow        1;33
    Light Gray   0;37     White         1;37
  • Example:
    RED='\033[0;31m'
    NO_COLOR='\033[0m'
    echo -e "${RED}Hello World${NO_COLOR}"
    

See also

grep to exclude lines with specific strings

grep with -v (invert) option will exclude the match lines in the output:
cat country.txt | grep -v "United States"

Tabs in bash script

echo with -e option will enable special characters:
echo -e "Name:\tJhon"

Python: check if file or directory exists

  • os.path.exists to check if file or directory exists.
    import os
    os.path.exists('/tmp/1.txt')
    os.path.exists('/tmp')
  • os.path.isfile to check if file exists.
    import os
    os.path.isfile('/tmp/1.txt')

Python: Get file absolute path

Use os.path.abspath function:
import os
os.path.abspath('abc/abc.txt')

Clear history of QuickTime Player on Mac OS X

  • To clear recent items, File>Open Recent>Clear Menu
  • To prevent the history from being created, run the following commands in Terminal:
    defaults write com.apple.QuickTimePlayerX NSRecentDocumentsLimit 0
    defaults delete com.apple.QuickTimePlayerX.LSSharedFileList RecentDocuments
    defaults write com.apple.QuickTimePlayerX.LSSharedFileList RecentDocuments -dict-add MaxAmount 0
    

Clear history of MplayerX for Mac

Open Terminal and type the following command:
defaults delete org.niltsh.MPlayerX.LSSharedFileList RecentDocuments
To prevent history from being created:
defaults write org.niltsh.MPlayerX NSRecentDocumentsLimit 0

Python: get the index of a char in a string

find and index method are available. The difference is that find returns -1 when what you're looking for isn't found, index throws an exception.
s='abc'
print(s.index('b')) # 1
print(s.find('b')) # 1
print(s.find('d')) # -1
print(s.index('d')) # exception

Python: string types in 2.x and 3.x

  • In Python 2.x, basestring is the base class for both str and unicode, while types.StringType is str. If you want to check if something is a string, use basestring. If you want to check if something is a ascii (bytestring), use str and forget about types.
  • Since Python 3.x, types not longer has StringType; str is always unicode. basestring no longer exists.

python: return inside with block

if returns value inside with statement, will the file be closed eventually?
The answer is YES

with open('myfile.txt') as f:
return [line for line in f if len(line)>80]

Ubuntu: system wide proxy settings

  • edit /etc/bash.bashrc
    export http_proxy=http://192.168.1.100:8000/
    export https_proxy=http://192.168.1.100:8000/
    export ftp_proxy=http://192.168.1.100:8000/
    export no_proxy=localhost,127.0.0.0/8,192.168.0.0/16,*.somedomain.org,172.23.65.*

python: iterables and iterators

A class with __iter__() method or __getitem__() method is iterable. The __iter__() method returns an iterator. A iterator object has a next() method (or __next__() method in python 3.0).

class Iterator(object):
def next(self):
pass

class Iterable(object):
def __iter__(self):
return Iterator()

see also

python: len() function and __len__() method

len is a function to get the length of a collection. It works by calling an object's __len__ method.

class AClass(object):
def __init__(self):
self._list = [1,2,3]

def __len__(self):
return len(self._list)

a=AClass()
print(a.__len__()) # 3
print(len(a)) # 3

python: call another static method


class AClass(object):
def __init__(self):
pass

@staticmethod
def a():
AClass.b()

@staticmethod
def b():
pass

see also

Install thinkfan fan control utility on Lenovo thinkpad laptops

I.Installation

  1. Install thinkfan from repository:
    sudo apt-get install thinkfan
  2. Enable fan control in thinkpad_acpi module configuration:
    sudo echo "options thinkpad_acpi fan_control=1" > /etc/modprobe.d/thinkpad_acpi.conf
  3. Reload thinkpad_acpi module:
    sudo rmmod thinkpad_acpi; sudo modprobe thinkpad_acpi
  4. Set to start thinkfan automatically at boot time:
    sudo vi /etc/defaults/thinkfan
    START=yes

II.Customization

  1. Install lm-sensors:
    sudo apt-get install lm-sensors
  2. To check the temperatures of the sensors:
    sensors
  3. To modify the thinkfan fan control settings:
    sudo vi /etc/thinkfan.conf

VIM: show column number

  • Option 1:
    set laststatus=2
    set statusline+=%F\ row\:%l\ col\:%c
  • Option 2:
    set ruler

Eclipse 4.4 Luna on Mac OS 10.9.5: Eclipse.app is not supported on this type of mac

I have recently installed Mac OS 10.9.5 update. After update, I found Eclipse.app failed to start, it pops up a window with message: "It is not supported on this type of Mac."

The solution is:

  1. Find your java home:
    /usr/libexec/java_home -V
    , you can see the java home like below:
    Matching Java Virtual Machines (1):
        1.8.0_20, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home
    
    /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home
  2. Edit file: /Applications/eclipse/Eclipse.app/Contents/Info.plist, and insert the follow line:
    <string>-vm</string><string>/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/bin/java</string>
    to the proper location.
  3. Now you can try to click the Eclipse.app icon, if it pops up another error message: "Eclipse is damaged and can’t be opened. You should move it to Trash.", you will need to run the following command to fix:
    xattr -d com.apple.quarantine /Applications/eclipse/Eclipse.app/
  4. Note: you can run the following command to check directory attributes:
    xattr /Applications/eclipse/Eclipse.app/

see also

Clonezilla: shutting down caused by "critical temperature"

When running clonezilla on a i3 laptop, it shut down because of high cpu temperature. The solution for this is below:
  • While getting into the clonezilla wizard, and before starting the cloning process, Alt+F2 open another terminal:
  • Run the command
    cpufreq-into
    you will see the output like below:
    analyzing CPU 0:
      driver: acpi-cpufreq
      CPUs which run at the same hardware frequency: 0
      CPUs which need to have their frequency coordinated by software: 0
      maximum transition latency: 10.0 us.
      hardware limits: 933 MHz - 2.13 GHz
      available frequency steps: 2.13 GHz, 2.00 GHz, 1.87 GHz, 1.73 GHz, 1.60 GHz, 1.47GHz, 1.33GHz, 1.20 GHz, 1.07 GHz, 933 MHz
  • Run the follow command:
    sudo cpufreq-set -c 0 -f 1.60GHz
    to throttle the cpu speed to 1.6GHz.
  • Alt+F1 to switch back to clonezilla terminal, and start the clone process



See also

Eclipse for Windows: Could not open/create prefs root node Software\JavaSoft\Prefs

When compiling a project cloned from git repository, got the following warning:
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Solution:

  • Run regedit
  • Locate key HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs
  • Right click the icon then select Permissions...
  • Give full control to users

Change directory ownership recursively on Windows 7

Open Command Prompt as Administrator:
takeown /f "C:\Path\To|Folder" /t /d y
icacls "C:\Path\To|Folder" /grant wilson:F /t /q

See also

Create a bootable Window 7 installer usb disk on Debian 7

  1. You need to the Windows 7 ISO image file ready. e.g. Win7.ISO
  2. You need to install p7zip-full to extract the ISO image.
    sudo apt-get install p7zip-full
  3. You need to install ms-sys
  4. Plugin your USB disk and check its device name.
    sudo blkid
  5. Make a NTFS partition on the USB drive by using cfdisk, or gparted and apply boot flag to it.
  6. Format the USB partition,
    sudo mkfs.ntfs -n WIN7 /dev/sdX1
  7. Mount the partition by pulling off and re-plug in the USB drive or run
    mount /dev/sdX1 /media/USB
  8. Extract the ISO image to the mounted partition:
    cd /media/USB; 7z x /path/to/Win7.iso
  9. Run ms-sys to install the Window 7 boot sector:
    ms-sys -7 /dev/sdX
    Note: you need to install the boot sector to the USB drive's MBR, so you should use /dev/sdX NOT /dev/sdX1

See also

Remove grub boot sector from a partition

I accidentally installed grub boot sector onto partition /dev/sdc1 instead of /dev/sdc, which is wrong. To remove the boot sector from partition /dev/sdc1:
sudo dd if=/dev/sdc1 of=sdc1.bootsector bs=512 count=1
sduo dd if=/dev/zero of=/dev/sdc1 bs=512 count=1
The file sdc1.bootsector is a backup in case anything go wrong.

Install ms-sys on Debian

  1. Download ms-sys from http://ms-sys.sourceforge.net/#Download.
  2. Install required packages:
    sudo apt-get install build-essential gettext
    
  3. Extract the source, and compile, then install:
    cd /tmp; tar zxvf ~/Downloads/ms-sys-2.4.0.tar.gz; 
    cd /tmp/ms-sys-2.4.0
    make
    sudo make install
    

NOTE:

  • You need to install build-essential package to install the compilers.
  • You need to install gettext package to fix the error msgfmt: command not found

Javascript: remove an element from an array

var e = { 'name':'John West' };
var array = [];
array.push(e);

# remove element from the array
var idx = array.indexOf(e);
array.splice(idx, 1);

javac: include a directory into classpath

On Unix platform:
javac -cp /opt/eclipse/plugins/*:/myproject/lib/* MyClass.java
On Windows platform:
javac -cp "c:/eclipse/plugins/*:d:/myproject/lib/*" MyClass.java

see also

PostgreSQL: make a copy of an existing database (includes tables and all records)

If the source database is owned by another user, you must login as super user, then run the command in psql:
CREATE new_db WITH TEMPLATE old_db OWNER src_db_owner
or run the command in terminal:
createdb -O src_db_owner -T src_db new_db

You may get errors if the source database is in use:
ERROR:  source database "src_db" is being accessed by other users
You can kill all the connections to the source databse:
SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'src_db' AND procpid <> pg_backend_pid();
then run the command
CREATE new_db WITH TEMPLATE src_db OWNER src_db_owner

Python: int to hex string


print(hex(255))
Result:

'0xff'

hex(255)[2:]
Result:

'ff'

Python: generates crc32 and adler32 checksum for big files


import zlib
import sys
import urllib2

def __zlib_csum(url, func):
if isinstance(url, basestring if sys.version_info[0] < 3 else str):
url = urllib2.Request(url)
f = urllib2.urlopen(url)
csum = None
try:
chunk = f.read(1024)
if len(chunk)>0:
csum = func(chunk)
while True:
chunk = f.read(1024)
if len(chunk)>0:
csum = func(chunk, csum)
else:
break
finally:
f.close()
if csum is not None:
csum = csum & 0xffffffff
return csum


def crc32(url):
return __zlib_csum(url, zlib.crc32)

def adler32(url):
return __zlib_csum(url, zlib.adler32)

if __name__ == '__main__':
print(hex(crc32('file:/tmp/111.zip')))
print(hex(adler32('file:/tmp/111.zip')))

Eclipse: remove Java comments

  • remove all /** ... ... */ comments:


    Regular Expression: /\*(?s:(?!\*/).)*\*/
  • remove all /* ... ... */ comments:


    Regular Expression: /\*\*(?s:(?!\*/).)*\*/

see also

Python: read and write binary files


def copy(if_path, of_path):
with open(if_path, 'rb') as in_file, open(of_path, 'wb') as out_file:
while True:
chunk = in_file.read(1024)
if chunk:
out_file.write(chunk)
out_file.flush()
else:
break

Python: mutable byte array as buffer

bytearray function can be used to make a mutable byte array as buffer:

import struct
buffer = bytearray(8)
buffer[0]=1
buffer[1]=1
struct.pack_into('>ih', buffer, 2, 100, 200)
# to convert the array to str
print(bytes(buffer))

see also

python: join lists


list1 = ['a', 'b']
list2 = ['c', 'd']

list3 = list1 + list2

Python: encode integers to byte string


import struct
def int_to_bytes(value, size, big_endian=False):
bs = []
for i in range(size):
offset = i * 8
b = chr((value & (0xff << offset)) >> offset)
if big_endian:
bs.insert(0, b)
else:
bs.append(b)
return b''.join(bs)

def int32_to_bytes(value, big_endian=False):
return int_to_bytes(value, 4, big_endian)

def int64_to_bytes(value, big_endian=False):
return int_to_bytes(value, 8, big_endian)

if __name__ == '__main__':
# the two commands below do the same
print(repr(int64_to_bytes(65536, big_endian=True)))
print(repr(struct.pack('>Q', 65536)))

see also

python: print a string as hex bytes



':'.join(x.encode('hex') for x in 'Hello World!')



Executes in python CLI:

>>> ':'.join(x.encode('hex') for x in 'Hello World!')
'48:65:6c:6c:6f:20:57:6f:72:6c:64:21'

join binary strings in Python




b''.join(['abc', '\x01\x02\x03', 'efg'])




Execute it in python cli:

>>> b''.join(['abc', '\x01\x02\x03', 'efg'])
'abc\x01\x02\x03efg'

Python: get the length of a utf-8 encoded string


len(s.encode('utf-8'))

北美票房上亿的经典电影排名(截止2009年)[奥斯卡获奖影片]

年份片名北美票房(亿美元)点评
2008《黑暗骑士》5.33奥斯卡最佳男配角最佳影响效果
2008《WALL-E》2.24奥斯卡最佳动画长片
2007《料理鼠王》2.06奥斯卡最佳动画长片
2006《快乐大脚》1.98奥斯卡最佳动画长片
2004《超人总动员》2.61奥斯卡最佳动画长片
2003《指环王3》 3.77奥斯卡11项大奖包括最佳影片、剧本、导演
2003《海底总动员》3.40奥斯卡最佳动画长片
2002《指环王前两部曲》6.55奥斯卡6项大奖
200i《怪物史莱克》 2.68奥斯卡最佳动画长片
2001《美丽心灵》 1.71奥斯卡最佳影片导演剧本
2000《角斗士)》1.88奥斯卡最佳影片导演剧本影帝
1997《泰坦尼克号》6.01奥斯卡11项大奖包括最佳影片、剧本、导演
1997《尽善尽美》1.48奥斯卡影帝影后
1994《阿甘正传》3.30奥斯卡8项大奖包括最佳影片、影帝、导演、剧本

北美票房上亿的经典电影排名(截止2009年)[魔幻片]

年份片名北美票房(亿美元)
2009《哈利波特导混血王子》2.90
2008《暮光之城》1.91
2008《纳尼亚传奇2》1.42
2007《加勒比海盗3》3.09
2007《哈利波特-凤凰社》2.92
2007《斯巴达三百勇士》2.11
2006《加勒比海盗2》4.23
2006《博物馆奇妙夜》2.51
2005《内尼亚传奇》2.92
2005《哈利波特-火焰杯》2.90
2004《哈利波特-司兹卡班的囚徒》2.50
2004《北极特块车》1.63
2004《范海辛》1.20
2004《雷蒙斯尼奇的不幸历险》1.19
2003《指环王3》3.77
2003《加勒上七海盗》3.05
2002《指环王2》3.42
2002《哈利波特导密室》2.62
2001《哈利波特导魔法石》3.18
2001《指环王》3.15
2001《木乃俘归来》2.02
1999《木乃俘》1.55
1995《逃出魔幻纪》1.00

北美票房上亿的经典电影排名(截止2009年)[喜剧片]

年份片名北美票房(亿美元)点评
2009《宿醉》2.62票房神话人看了就服了
2009《下段结婚》1.49 
2009《百货战警》1.41难得的温馨
2008《功夫熊猫》2.15 
2008《马达加斯加2》1.80 
2008《特务行不行》1.35 
2007《怪物史莱克3》3.23 
2007《艾尔文与拢栗鼠》2.17 
2007《辛普森一家》1.83 
2007《一夜肚大》1.49 
2007《尖峰时刻3》 1.40 
2006《波拉特》1.29 
2006《博物馆奇妙夜》2.51 
2006《冰河世纪2》1.95 
2006《决乐大脚》1.98 
2005《婚礼傲客》2.09 
2005《神勇奶爸》1.13 
2005《新抢钱夫妻》1.10 
2005《四十岁老处男》1.09 
2005《马达加斯加》1.94 
2004《怪物史莱克2》4.41 
2004《登鱼黑帮》1.61恶搞黑帮电影
2004《初恋五+次》1.21 
2004《拜见岳父2》2.79 
2003《冒牌夭神》2.43某些经典笑段笑到我生活不能自理
2003《儿女一箩筐》1.39 
2003《气味相投》1.36 
2003《爱到屋倒房塌》1.33 
2003《非常小特务3》1.12 
2002《我的希腊婚礼》2.41 
2002《逍遥法外》1.65 
2002《圣诞决乐再疯狂》1.39 
2002《王牌大贱谍3》2.13 
2001《怪物史莱克》2.68 
2001《美国派2》1.45 
2001《怪医社德利2》1.13 
2001《公主日记》1.08 
2000《圣诞怪杰》2.60 
2000《男人百分百》1.83 
2000《拜见岳父》1.66 
2000《惊神尖笑》1.57无敌的恶搞作品
2000《肥佬教授2》1.23 
2000《卧底肥妈》1.18 
1999《王牌大贱谍2》2.06 
1999《冒牌老爸》1.63 
1999《落跑新娘》1.52 
1999《精灵鼠小弟》1.4史上第一部真人结合动画?
1999《新娘百分百》1.16 
1999《老大靠边闪》1.07 
1999《美国派》1.03 
1998《我为玛丽狂》1.76 
1998《呆呆向前冲》1.61 
1998《怪医社德利》1.44 
1998《轰天炮4》1.30难得的喜剧系列部部叫座
1998《尖峰a寸刻》1.41 
1998《淘气小兵兵》1.00 
1997《大话王》1.81 
1997《真的想嫉你》1.27 
1996《肥佬教;受》1.29 
1996《大婆俱乐部》1.05小孩很可爱哈
1995《逃出魔幻纪》1.00 
1995《鬼马小精灵》1.00 
1994《今年圣诞大事件》1.45 
1994《阿呆与阿瓜》 1.27 
1994《变相怪杰》1.19 
1993《肥妈先生》2.19 
1992《小鬼当家2》1.74 
1992《轰天炮3》1.45 
1992《修女也疯狂》1.40 
1992《护花倾情》1.22 
1992《粉红联盟》1.08 
1990《小鬼当家》2.86 
1990《至尊神探》1.04 
1989《轰天炮2》1.47 
1989《豆T小精灵》1.31 
1989《回到未来2》1.18 
1989《捉鬼蠢交死)2》1.12 
1989《小美人鱼》1.12 
1984《妙探出更》2.35 
1984《捉鬼敢死队》2.29鬼鬼都走可爱路线~异形女王主演哦

HTML5/Javascript to access local files system?

Short answer is: No. In April 2014, it was announced on public-webapps that the Filesystem API spec should be considered dead. Other browsers have showed little interest in implementing it.

Java: save a BufferedImage to PNG or JPG using Image IO

public static void saveAsPNG(BufferedImage img, File f) {

    ImageIO.write(img, "PNG", f);

}

public static void saveAsJPG(BufferedImage img, File f) {

    ImageIO.write(img, "JPG", f);

}

Upgrade existing Eclipse standard/classic to J2EE

go to the Help menu, choose Install New Software, and while Working With All Available Sites, choose the features you want from the Web, XML, Java EE and OSGi Enterprise Development category. If unsure, pick both the Eclipse Java EE Developer Tools and JST Server Adapters Extensions and proceed, allowing it to select dependencies for you.

For those certain that they only want to install selected parts of WTP, the Eclipse XML Editors and Tools selection is exactly as named while the Eclipse Web Developer Tools builds on that with HTML, CSS, and JavaScript tools, and supports deployable "static" web projects. The Eclipse Java Web Developer Tools adds support for JSP files (but not Java Servlets), and complete support for "dynamic" web projects requires the full Eclipse Java EE Developer Tools Feature.

See also

Ubuntu: Some index files failed to download

Symptom:
When running sudo apt-get update got the following error:
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/precise-backports/universe/i18n/Index  No Hash entry in Release file /var/lib/apt/lists/partial/archive.ubuntu.com_ubuntu_dists_precise-backports_universe_i18n_Index

E: Some index files failed to download. They have been ignored, or old ones used instead.

Solution:
sudo rm -rf /var/lib/apt/lists/partial/archive.ubuntu.com_ubuntu_dists_precise-backports_universe_i18n_Index
sudo apt-get update

Java: tuples (pairs, triplets)

public class Pair<X, Y> { 
  public final X x; 
  public final Y y; 
  public Pair(X x, Y y) { 
    this.x = x; 
    this.y = y; 
  } 
}

//    Unit<A> 
//    Pair<A,B> 
//    Triplet<A,B,C> 
//    Quartet<A,B,C,D> 
//    Quintet<A,B,C,D,E> 
//    Sextet<A,B,C,D,E,F> 
//    Septet<A,B,C,D,E,F,G> 
//    Octet<A,B,C,D,E,F,G,H> 
//    Ennead<A,B,C,D,E,F,G,H,I> 
//    Decade<A,B,C,D,E,F,G,H,I,J>  

see also

Java: create a new file also its parent directories as required

File file = new File("/tmp/a/b/c/1.txt");
file.getParentFile().mkdirs();
file.createNewFile();

Show apt-get (dpkg) history

/var/log/apt/history.log is the log file for apt-get install/remove: for example I want to find the command that I installed okular package:
cat /var/log/apt/history.log | grep Install | grep okular
This is useful if you want to find all the packages that were included automatically when you install a particular package. So that you can remove them all.

If the package was installed using dpkg command, you can find the log in /var/log/dpkg.log
cat /var/log/dpkg.log | grep adobereader

Distribute Mediaflux libraries to maven using Mediaflux web server

  1. Install the libraries as artifacts to your local maven repository. And it will generate and save the artifacts to $HOME/.m2/repository/com/arcitecta directory
  2. Copy the artifacts from the local repsitory to ${MFLUX_HOME}/www/
    mkdir -p $MFLUX_HOME/www/maven-repository/com/arcitecta
    cp -r $HOME/.m2/repository/com/arcitecta/* $MFLUX_HOME/www/maven-repository/com/arcitecta/
  3. In aterm, run the following command to create a http processor (to link the web directory):
    http.processor.create :app maven-repository :type file :authentication < :domain www-public :user www-public > :url maven-repository :translate maven-repository
    if your mediaflux is configured use https on a non-standard port, you need to specify :encryption-required "true" :encryption-port "8443" e.g. 8443 is the https server port.
  4. You can now include the repository in your maven project's pom.xml or $HOME/.m2/settings.xml:
        <repositories>
    <repository>
    <id>mediaflux-libs</id>
    <name>mediaflux-libs</name>
    <url>https://mediaflux.your-domain.org:8443/maven-repository</url>
    <layout>default</layout>
    </repository>
    </repositories>
  5. Also in your maven project's pom.xml, add the mediaflux libraries/artifacts in dependencies:
        <dependencies>
    <dependency>
    <groupId>com.arcitecta</groupId>
    <artifactId>aplugin</artifactId>
    <version>3.9.011</version>
    </dependency>
    </dependencies>


see also

Include Mediaflux libraries into local maven repository


#!/bin/bash
export MFLUX_HOME=/opt/mflux
export MFLUX_VERSION=3.9.011

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/plugin/lib/aplugin.jar -DgroupId=com.arcitecta -DartifactId=aplugin -Dname=aplugin -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/java/mfclient.jar -DgroupId=com.arcitecta -DartifactId=mfclient -Dname=mfclient -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/gwt/mfclientgwt.jar -DgroupId=com.arcitecta -DartifactId=mfclientgwt -Dname=mfclientgwt -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/gwt/mfclientguigwt.jar -DgroupId=com.arcitecta -DartifactId=mfclientguigwt -Dname=mfclientguigwt -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true


see also

maven: include libraries into you local repository

#!/bin/bash
export MFLUX_HOME=/opt/mflux

export MFLUX_VERSION=3.9.011

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/plugin/lib/aplugin.jar -DgroupId=com.arcitecta -DartifactId=aplugin -Dname=aplugin -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/java/mfclient.jar -DgroupId=com.arcitecta -DartifactId=mfclient -Dname=mfclient -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/gwt/mfclientgwt.jar -DgroupId=com.arcitecta -DartifactId=mfclientgwt -Dname=mfclientgwt -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true

mvn install:install-file -Dfile=${MFLUX_HOME}/dev/client/gwt/mfclientguigwt.jar -DgroupId=com.arcitecta -DartifactId=mfclientguigwt -Dname=mfclientguigwt -Dversion=${MFLUX_VERSION} -Dpackaging=jar -DperformRelease=true -DcreateChecksum=true
After the above step, you can add dependency to your maven project's pom.xml:
    <dependencies>
        <dependency>
            <groupId>com.arcitecta</groupId>
            <artifactId>aplugin</artifactId>
            <version>3.9.011</version>
        </dependency>
    </dependencies>


see also

Configure http proxy for maven

Edit $HOME/.m2/settings.xml file:
vi ~/.m2/settings.xml
<settings>
  <proxies>
   <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.somewhere.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

Fix permissions after changing MySQL data directory

  • sudo vi /etc/apparmor.d/usr.sbin.mysqld
    /path/to/new_mysql_data_dir/ r,
    /path/to/new_mysql_data_dir/** rwk,
  • sudo chown -R mysql:mysql /path/to/new_mysql_data_dir/
  • sudo /etc/init.d/apparmor restart
    sudo /etc/init.d/mysql restart

PDF viewers on Linux

  1. evince
  2. acroread
  3. xpdf
  4. kpdf
  5. gv
  6. okular
  7. mupdf
    sudo apt-get install mupdf
  8. zathura
    sudo apt-get install zathura
  9. qpdfview
    sudo apt-add-repository ppa:b-eltzner/qpdfview
    sudo apt-get update
    sudo apt-get install qpdfview
  10. foxit

Enum in python

  • Before Python 3.4 (PEP 435),

    class Animal:
    DOG = 1
    CAT = 2

    x = Animal.DOG
    or

    class Animal:
    DOG, CAT = range(2)

    x = Animal.DOG
  • Since Python 3.4 (PEP 435),

    class Animal(Enum):
    DOG = 1
    CAT = 2

    x = Animal.DOG
    or equivalently:

    from enum import Enum

    Animal = Enum('Animal', 'DOG CAT')

    x = Animal.DOG

SSH tricks

  • 9 awesome ssh tricks
  • Use autossh for managing persistent sessions/tunnels which will restart upon network or local issues.
  • OpenSSH >=5.4 will allow you to add new port-forwardings in multiplexing mode. If you start a new slave session with port forward requests they will automatically be relayed and added to the master. You can also request the mux master set up forwards without requesting a new session using
    ssh -O forward -Rxx:yy:zz -Laa:bb:cc user@host
  • Rather than grovelling though /tmp to find a working agent (which could connect you to a malicious one!), you might instead want to start the agent at a known location (e.g. ~/.ssh/auth_sock) using
    ssh-agent -a /path/to/socket
  • sshuttle - transparent proxy server that forwards over ssh, now you can have a full-featured vpn with security implemented by ssh. https://github.com/apenwarr/sshuttle
  • "CompressionLevel" is ignored in SSH v2 and higher. Supposedly the default is ideal.
  • "Cipher" is ignored in SSH v2 and higher. Use "Ciphers" and put your favorite on the front of the list. Type man ssh to see what ciphers are on your system.
  • Use arcfour (rc4) encryption for higher performance and very low load but be sure to enable re-keying by hour or by data volume. Rebuild OpenSSL and OpenSSH to include it.
  • Type
    ssh -vvv user@example.com
    for really detailed debugging information. More "v" means more verbose.
  • Try using "keychain" to discover, reap, and re-use those ssh-agents littering your system.
  • For seamless but secure remote execution: generate a new ssh key (ssh-keygen) without a pass-phrase; put the id and id.pub files on each "client" machine; add the id.pub to the authorized_keys file under the username used for the "server" end. Here's the trick: Insert restrictions before the public key, but all on the one long line. So instead of "ssh-dss AAAAB3blahblahblah..." in the authorized_keys, use "no-port-forwarding,no-X11-forwarding,command="/the/specific/command",from="client1.ip.addr,*.other.clients" ssh-dss AAAAB3blahblahblah..."

Debian 7 Wheezy: install Chinese fonts

  1. Install Chinese fonts:
    sudo apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi00lp fonts-arphic-gbsn00lp ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp
    sudo apt-get install fonts-droid ttf-droid 
    sudo apt-get install ttf-wqy-zenhei ttf-wqy-microhei xfonts-wqy
    sudo apt-get install fonts-arphic-ukai ttf-arphic-ukai fonts-arphic-uming ttf-arphic-uming
    
  2. Font config:
    vi ~/.fonts.conf
    <?xmlversion='1.0'encoding='utf-8'?>
    <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
    <fontconfig>
    <!-- prefered fonts -->
    <alias>
        <family>serif</family>
        <prefer>
            <family>DejaVu Serif</family>
            <family>Bitstream Vera Serif</family>
            <family>Evermore Song</family>
            <family>WenQuanYi Bitmap Song</family>
            <family>AR PL UMing CN</family>
            <family>AR PL ShanHeiSun Uni</family>
            <family>Droid Sans Fallback</family>
            <family>WenQuanYi Micro Hei</family>
            <family>WenQuanYi Zen Hei</family>
        </prefer>
    </alias>
    <alias>
        <family>sans-serif</family>
        <prefer>
            <family>DejaVu Sans</family>
            <family>Bitstream Vera Sans</family>
            <family>Evermore Song</family>
            <family>Droid Sans Fallback</family>
            <family>WenQuanYi Micro Hei</family>
            <family>WenQuanYi Bitmap Song</family>
            <family>WenQuanYi Zen Hei</family>
            <family>AR PL UMing CN</family>
            <family>AR PL ShanHeiSun Uni</family>
        </prefer>
    </alias>
    <alias>
        <family>monospace</family>
        <prefer>
            <family>DejaVu Sans Mono</family>
            <family>Bitstream Vera Sans Mono</family>
            <family>Evermore Song</family>
            <family>WenQuanYi Micro Hei Mono</family>
            <family>WenQuanYi Zen Hei Mono</family>
            <family>Droid Sans Fallback</family>
            <family>WenQuanYi Bitmap Song</family>
            <family>AR PL UMing CN</family>
            <family>AR PL ShanHeiSun Uni</family>
        </prefer>
    </alias>
    <!-- Default Alias -->
    <alias>
        <family>DejaVu Sans</family>
        <default>
            <family>sans-serif</family>
        </default>
    </alias>
    <!-- Generic font families -->
    <match target="pattern">
        <test name="family" qual="any">
            <string>serif</string>
        </test>
        <edit binding="strong" mode="prepend" name="family">
            <string>DejaVu Serif</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" qual="any">
            <string>sans-serif</string>
        </test>
        <edit binding="strong" mode="prepend" name="family">
            <string>DejaVu Sans</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" qual="any">
            <string>monospace</string>
        </test>
        <edit binding="strong" mode="prepend" name="family">
            <string>DejaVu Sans Mono</string>
        </edit>
    </match>
    <!-- Anti-alias -->
    <match target="font">
        <edit name="embeddedbitmap">
            <bool>false</bool>
        </edit>
    </match>
    <!-- WenQuanYi Bitmap Song -->
    <selectfont>
        <acceptfont>
            <pattern>
                <patelt name="family">
                    <string>WenQuanYi Bitmap Song</string>
                </patelt>
            </pattern>
        </acceptfont>
    </selectfont>
    <match target="pattern">
        <test name="family" qual="any">
        <string>WenQuanYi Bitmap Song</string>
        </test>
        <test compare="less" name="pixelsize" qual="any">
            <double>12</double>
        </test>
        <edit mode="assign" name="family">
            <string>WenQuanYi Micro Hei</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" qual="any">
            <string>WenQuanYi Bitmap Song</string>
        </test>
        <test compare="more" name="pixelsize" qual="any">
            <double>16</double>
        </test>
        <edit mode="assign" name="family">
            <string>AR PL ShanHeiSun</string>
        </edit>
    </match>
    <!-- Alias -->
    <alias>
        <family>SimSun</family>
        <family>宋体</family>
        <accept>
            <family>LiHei Pro</family>
            <family>Evermore Song</family>
            <family>WenQuanYi Bitmap Song</family>
            <family>AR PL ShanHeiSun Uni</family>
        </accept>
        <default>
            <family>serif</family>
        </default>
    </alias>
    <alias>
        <family>SimHei</family>
        <family>黑体</family>
        <accept>
            <family>LiHei Pro</family>
            <family>WenQuanYi Micro Hei</family>
            <family>WenQuanYi Zen Hei</family>
        </accept>
        <default>
            <family>sans-serif</family>
        </default>
    </alias>
    <alias>
        <family>微软雅黑</family>
        <family>Microsoft YaHei</family>
        <accept>
            <family>LiHei Pro</family>
            <family>WenQuanYi Micro Hei</family>
            <family>WenQuanYi Zen Hei</family>
        </accept>
        <default>
            <family>sans-serif</family>
        </default>
    </alias>
    <!-- -->
    <match target="font">
        <edit mode="assign" name="rgba">
            <const>rgb</const>
        </edit>
    </match>
    <match target="font">
        <edit mode="assign" name="hinting">
            <bool>true</bool>
        </edit>
    </match>
    <match target="font">
        <edit mode="assign" name="hintstyle">
            <const>hintfull</const>
        </edit>
    </match>
    <match target="font">
        <edit mode="assign" name="antialias">
            <bool>true</bool>
        </edit>
    </match>
    </fontconfig>






If you just need basic chinese fonts. Just install the following:
sudo apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi00lp fonts-arphic-gbsn00lp ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp

apt-get install flashplugin-installer and ttf-mscorefonts-installer via proxy

My desktop has not direct internet access but goes through a proxy. It fails to install the packages like flashplugin-installer or ttf-mscorefonts-installer. There are 2 solutions:
  • edit /etc/wgetrc
    sudo vi /etc/wgetrc
    http_proxy = http://your-proxy.your.org:3128
    substitude the proxy address and the port 3128 with your proxy address and port number. Save the file then run
    sudo apt-get install flashplugin-installer ttf-mscorefonts-installer
  • or for one-off installation:
    sudo http_proxy=http://your-proxy.your.org:3128 apt-get install flashplugin-installer ttf-mscorefonts-installer

Debian Wheezy: Install Microsoft Office 2007 (via WINE)

  1. Install wine and winetricks:
    sudo apt-get install wine winetricks
  2. Download msxml3.msi from cnet.com.
  3. Move msxml3.msi to ~/.cache/winetricks/msxml3:
    mkdir -p ~/.cache/winetricks/msxml3; mv ~/Downloads/msxml3.msi ~/.cache/winetricks/msxml3/
  4. Install msxml3.msi:
    winetricks msxml3
  5. Locate the setup.exe file from the Microsoft Office 2007 installation media/directory and run it with wine:
    wine /path/to/MSOffice2007/setup.exe

Gnome 3 classic: How to remove a icon(launcher) from the panel







Solution:
Hold Alt key while mouse right-clicking on the icon, it should pop up menu with options to let your Move or Remove from the panel





add-apt-repository works through a http proxy







Solution:
export http_proxy=http://<proxy>:<port>
export https_proxy=http://<proxy>:<port>
sudo -E apt-add-repository <repository>





Ubuntu 13.10: No dropbox tray icon

Solution:
sudo apt-get install libappindicator1

中文智能手机相关资讯站点

Android Phone: temporarily avoiding poor connections and DHCP issues

Got a Huawei G526, it sometimes fails to connect to my wireless router(DynaLink RTA 1046VW) and displaying Temporarily avoiding poor connections and the WIFI signal strength is Excellent. I found:
  • Restart the wireless router can fix the issus most of the time.


However, it is very unconvenient that you have to restart the router every time when the problem occurs. And I do not think it is the problem of the wireless router because other devices connect to the router without problem. (Also I found the Android phone works without this problem on other wireless routers/networks. So it must be a compatibility issue between the andoird phone and my wireless router.)
Then I found how to disable Avoid poor connection:
  • Go to Settings
  • Turn on WIFI and get into WIFI
  • Touch Menu key then select Advanced
  • Uncheck Avoid poor connections

Now reconnect the WIFI, I got the WIFI status connected. However, I found I cannot actually connect to the internet because there is no IP address assigned. To check if the IP is assigned:
  • Go to Settings
  • Get into WIFI
  • Touch Menu key then select Advanced
  • See IP address

Why other devices can get DHCP working without problem but not this Android phone? I found it is an caching issue of the DHCP client on the Android phone. You can clear the DHCP cache and restart your WIFI to fix the issus if you have adb or root access.

However, not everyone can root the device or know to how to use adb. And every time the problem happens, you have to clear the cache. My solution is now using static IP instead of DHCP:
  • Go to Settings
  • Select the network and hover for the pop up menu
  • Select Modify network
  • Scroll down and check Show advanced options
  • Change IP settings from DHCP to Static
  • Set IP address to 192.168.1.10, change it according to your wireless router.
  • Set Gateway to 192.168.1.1, change it according to your wireless router.
  • Network prefix length: 24
  • DNS 1: 192.168.1.1, change it accoring to your wireless router.
  • Click Save button.