欲望与生活

古时犬儒主义的第欧根尼,常常是光着脚,半裸着身子,模样像个乞丐,住在一个破桶里。这样的生活出自于他的选择,他希望摆脱繁文缛节和奢侈享乐,像狗一样悠闲自在就好。现代人大概很难理解那样的生活,因为我们既不会像梭罗,拿起斧子,冲进山里,建造出自然主义的屋子,也不可能像炸弹客,企图按自己所想,炸裂工业社会。

大多数人都知道佛陀的故事:释迦牟尼是个王子。其父为他建造春、夏、冬三座宫殿,使他不知疾病和死亡,令他享尽肉体的欢愉。王子一次出行后,知晓生老病死,极为震撼,因此参禅悟道。今人少有实践的机会,对于生活的想象,仅止步于视听之娱。即便不是每个人都有那样的爸爸,也不是每个人都有那样的智慧。一个人却也会对放牛娃那种人生——放牛卖牛赚钱娶媳妇养娃放牛,嗤之以鼻。

又有什么资格呢?我们的生活,无非是从一个水泥盒子到另一个水泥盒子,我们人生最大的愿望,就是耗尽大半辈子拥有自己的水泥盒子,盒子外面要放个带轮盒子,盒子中央要放个金属盒子,去接收它的洗礼,再努力往返于其他水泥盒子,这样就能换取更大更好的盒子。大家喜欢围坐在金属盒子前面,互相讨论谁的盒子更实惠,谁的盒子更有品,谁谁谁又购买好多盒子。邻居家是这样,亲戚朋友家是这样,有什么不对呢?

佛学认为要放下自我,才能抛弃执念,到达彼岸。可我们今天连自我都难以分辨,随身带的手机,里面每一个APP,都是欲望的入口,都是比贪嗔痴更为复杂的集合。现代人的欲望,可以在烦躁的闹铃中消散,也可以在斑驳的朋友圈中升起,坐在电影院建立起对美好生活的想象,下楼就能买到各式各样的生活。购物广场不是纯粹的商品交易中心,而是向人们兜售价值观的现代教堂。在他们的模式里,爱情不外乎一颗恒久远的钻石,一次马尔代夫的旅游,生活可以简化成一台豪车,一栋靠湖的花园洋房。年轻人轻奢,女性值得更好,中年人应享受精英品质,连宠物狗都可以纵享关爱啊!

我不是反对工业和消费主义,只是反对不经过选择的生活。人生本来就没有意义,又有什么必要去反对别人的生活方式呢。如果可以把人的规律找出来,好比光传播规律,可以等价于光总是沿着最短的路径传播,也许人的存在目的也能被发掘出来。然而人存在大部分时间不过是在狩猎、进食和交配,可供参考的历史不过万年,进入工业社会也才两百年。人存在的法则同其他生物一样,无非是维持自己作为负熵体的存在,吸收能量,增大地球的熵。硬要说有什么目的,就是可劲造,把能量消耗掉,繁衍无数后代,创造更多产品,殖民其他星球,开发更多能源。这和放牛娃的故事又有什么分别呢?宇宙无非是一场熵增游戏,迟早都会完蛋。

人始终活在共同体的想象之中。在部落中听从酋长的命令,可以集体狩猎饱餐。在宗族下信奉牛鬼蛇神,对长者言听计从,是为了收获粮食,稳定婚配。现代不再需要之前落后的组织型态,只需要社会契约,陌生人之间就能马上展开协作,这样的局势和工业化一同将人们撕成原子态。于是,垄断巨头和政府,为世界提供了这样那样的观念,只要接受观念的人足够多,钻石就可以卖出高价,豪车别墅的生活依然会受到追捧,人开车行在路口,即便没人也依然遵循着红灯停的规则。我们需要的,只是在这些欲望和规则之下,看见真正的自己,和自己想要的生活。

如何避免成为一个暴君

思维决定情绪。

每个人都会在人生的某个时刻成为一个暴君,无论是对于自己还对于他人。原因在于过往的经历造成了当下的思维模式,当你在遭遇什么的时候,大脑会在瞬间给出评价,接着情绪漫过全身,大脑后知后觉地给出理由和评价。

几乎人的所有消极情绪都是不合逻辑的。认知科学告诉我们,当我们消极时,一般有十种扭曲地认知方式:

  1. 非此即彼:有一点不完美就认为彻底失败。比如:“高考失败我还有什么前途。”事实是前途并不只有高考才能成就。
  2. 以偏概全:发生了一件消极的事,就认为不好的事情会接踵而至。比如:表白被异性拒绝,比如:“我可能永远都是单身狗了,谁会喜欢我,看来是孤独终老了”,而事实是只是一个人拒绝你,并不能代表什么,地球上那么多人,难道还找不到一个对象。
  3. 心理过滤:单独拿出一件消极事件的细节,反复回味,最后整个世界都暗淡无光。比如:有同学嘲笑自己的梳妆打扮,结果就想“人本性都是残酷无情的”,完全忽略自己过去几个月,那么多人都没人对她残酷无情。
  4. 否定正面思考:拒绝正面体验,坚持暗示自己“它们不算”,给自己的成就泼冷水,有悖于现实体验。比如:考试考了第一,坚持认为自己是走运;别人夸自己好看,却始终认为“这只是因为他们比较友善”;这样你将早遭受巨大的痛苦,无法欣赏美好的事物。
  5. 妄下结论:喜欢用消极的理解方式下结论,即便没有明确的事实。
    1. 读心术:发现别人的行为不如意,就认为是针对自己,懒得去查证。
    2. 先知错误:觉得事情会越来越糟,并深信不疑,认为它就是板上钉钉的事实。
  6. 放大和缩小:对于自己的错误和他人的优点等,会夸大它们的重要性,但对于你的优点和他人的缺点等,会不理智地将它们缩小,把他们看得微不足道,“双目镜把戏”。
  7. 情绪化推理:认为只要有负面情绪,就足以证明事实非常糟糕,因为自己在想“我感觉得出来,所以肯定就是真的”。比如:拖延,你一想到还有那么多事要做,“一想到就烦得要死,看来是做不完了”,然后你就真的没做,事实上,慢慢来总可以做完。
  8. “应该”句式:习惯于用“我应该做这个”和“我不应该做那个”来鞭策自己,好像需要被皮鞭抽打才能好好干活一样。“必须”和“应当”也产生同样的抵触效果,这样的句式带来的就是内疚,当你把这个句式强加于其他人的时候,你会产生愤怒/沮丧/仇恨。
  9. 乱贴标签:树立一个完全负面的自我形象,极端的以偏概全。比如投十个篮球,最后一个不中,就开始想“我根本不适合打篮球”,而不会说“我这一球失手了”。你应该把自己想象成一条河流,其中思维、情绪、行为在里面翻腾,而不是一座雕像。你从来不会因为自己天天吃饭而认为自己只会吃饭,这样太幼稚了。
  10. 罪责归己:“内疚之母”,某些外界消极事物你根本不需要负责,却把他们归咎为自己的错误。本质上是有很强的控制欲。比如:孩子总是调皮惹祸,母亲就想“我肯定是个糟糕的妈妈”。事实是,很多情况下,我们只能影响事物,而不能控制事物。

将这十大认知扭曲记得滚瓜烂熟,并且记得在大脑做出下意识判断地时候,及时纠正错误(最好写下来)。相信我,这会让你终身受益。


2018年过去了一大半,我学到的一件重要的事就是,人最宝贵的品质一定包括了管理情绪的能力。

好人的门槛

有人在火车站猛然倒下,一脸上冒汗的黑汉子冲过来,大手搓搓想做心脏复苏术。如果你就在现场, 如果你是个好人,你就应该拉住他。理性告诉我们,应该问他是不是白大褂或者急救员,有没有相关资质,如果不是,踹飞他。

但是大多数人在寻常事物中却失去了这种觉悟。看见有雷锋现身,我们第一反应是在心中涌起暖流,默默夸赞,少有人会阴戳戳地反问:你有资格吗?因为做好事大概是一件少见的事情,人人都怕打击到一颗良善之心,怕世上老太变多,彭宇变少。因此一厢情愿觉得做好事是不需要门槛的,它最好不需要,要不然还怎么维持一个世界和平人人和睦的幻想。

作为一个坏人,我有义务打破这种幻想。有几个坏人会觉得自己在做坏事?日军进犯认为自己是建立大东亚共荣圈,将东亚从殖民统治中解放。恐怖主义觉得哈里发国必然降临,杀死异教徒是在遵守预言。纳粹分子直到希特勒自杀,还觉得自己在维护德意志民族的尊严……大晚上说那么大的事情,怕要吓坏小孩子。

捡点朴素的事情来讲,一群女生在路边喂野猫,太阳当空照,野猫懒洋洋,女生特好看,网友狂点赞,说那么心地善良的小姐姐真是人美心美呢。多么和谐温馨的画面,让人不忍心拆穿。好心是一回事,好事却是另一回事。

仔细回想一下高中生物知识,一个地方对于猫的承载力有限,同时,野猫的繁殖能力很强。那么,喂猫的人会随着猫的数量而上升吗?显然不会。那么他们的后代怎么办?抱着这种恐怖想法,去搜索一番就会知道如下情况:

1.长时间喂养野猫,野猫会发胖,会依赖人,会失去应有的戒备,这让猫贩子有机可乘。

2.野猫如果依赖这个地盘,就会放弃其他地盘,如果有一天没人喂食,它就要和其他猫争夺一番。

3.猫的后代不断增多,容易饿死,造成更多悲剧。

为了解决这些问题,好人必须做出更好的决定,把野猫带回家,做好绝育,给它取一个温暖的名字,就已经相当圆满了。

在更为广大的视角中,我们会发现这件事情不是想象中那么简单,野猫一部分可能来自于自然,但大多数来自人类的遗弃。于是好人开始创立宠物救助中心,建立领养制度,接纳野猫,交给值得托付的人。这样,第一个好人就有一个新渠道做好事了。

如果侥幸拥有了更多专业知识,我们会知道野猫的泛滥,本身就是人的原因。人只觉得猫可爱,于是把他们带到亚欧大陆。受人偏爱,下仔能力强,适应性又好,可谓天时地利人和,猫一气之下破坏了生态平衡。猫捕猎鸟类,但大多数时候是为了玩,于是数量庞大的野鸟消失,还形成了一份长长的灭绝物种名单。本质上人出自于对猫颜值的青睐,伤害了鸟类。即便是现在,野猫在城市找不到足够的食物,同样会捕食鸟类。于是好人开始调查研究,写出数据报告,吸引更多注意力,跟爱猫者做出对抗。这样,总体上好人变得更多。

什么是门槛?这就是门槛。一个好人只是让自己沉浸在升华的氛围中,吃瓜群众致力于赞叹善心,会不会真的出现乌托邦?当好人容易,是因为道德评价不需要理性的参与。需要理解,很多事不是去商店买面包那么简单,更何况猫不适合吃淀粉。需要理解,不是目的正确,就能带来纯种的善事。有时候,贪官奸,清官要更奸。需要理解,好和坏并不存在一条完美的本初子午线。

当鱼钩横贯手指,本能要求人立即拉出鱼钩,倒刺会刮伤手指,从而留下更大的伤口。而正确的做法是,让鱼钩穿透手指,然后剪断鱼线,这样伤口更小,愈合更快。有时候事情就是这样,以为自己做了好事,其实是做了感觉好的事。

所以,每次我做好事之后,都会拔掉一根腿毛,确认自己跨过门槛。终于有一天,腿毛光光。


人似乎分为好人和坏人。好人睡得好一些,而坏人似乎能更好地享受醒着的时间。——伍迪·艾伦

Python超简单入门

Python入门非常简单,精通却很难,不过我只需要其中某个功能而已。现学现用,下面代码方便快速回忆:

# coding: utf-8 
# 井号是单行注释
# 数据类型、控制结构、功能、I/O文件
''' 
多行注释是三个单引号 
'''

import os #引入外部库的语句
from math import cos 

#动态类型语言
s = 0   
s = "shit" 

'''Python自带数据结构'''

#list是一种有序的集合,可以随时添加和删除其中的元素。
names = ['Michael', 'Bob', 'Tracy']    
names[-1] = "Jake"   #Tracy
names.pop(0)    #删除Michael
names.insert(1, "Jack")
names.sort()    #排序
L = ["隋辨", 20, 125.5] #不同的数据类型
#嵌套 len(sheet) = 4    sheet[2][1] = 5
sheet = [1, 2, [3, 5], 4]   

#tuple一旦初始化就不能修改
classmates = ('Michael', 'Bob', 'Tracy')
tmp = ()    #定义空tuple
t1 = (5)    #定义变量t1 = 1
t2 = (5,)    #定义只有1个元素的tuple
t3 = (1, 2, [3, 4]) #由于list可变所以tuple看上去可变
t3[2][0] = 4

#dict,在C++叫map
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d["Bob"])  #75
print('Bob' in d)   #判断key是否存在
#key必须是不可变对象,如list就不可以作为key

#set
set1 = set([1, 2, 3])   #利用list作为输入
set2 = set([2, 3, 4])
set1.add(4) #添加
set1.remove(1)  #删除
set1 & set2 #2, 3
set1 | set2 #1, 2, 3, 4



'''循环'''
#range(5)相当于[0, 1, 2, 3, 4]
a = 0
for x in range(5):
    a = a + 1
    print(x)
#利用list循环
for name in names:
    print(name)
while(True):
    a = a - 1
    if(a % 2 == 0):
        break

#判断
if a < 0:
    print("负数")
elif a == 0:
    print("零")
else:
    print("正数")

if s:
    print("s是非零数值、非空字符串或非空list")

#输出
print("%.2f" %a)    #类C的输出方法
print("hhh" * 10)   #重复十个hhh
print('{0}成绩提升了{1:.1f}%'.format('小明', 17.125))   #正宗输出方法

#函数
def my_power(x, n = 0):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
print(my_power(2, 10))

#定义一个什么事也不做的空函数
def nop():
    pass    

#返回多个值其实就是返回一个tuple
def mul_return():
    return 1, 2, 3

平静就好

当年自习课,初中班主任面容严肃地把我们叫出来,说:你们是不是早恋了,你们这样要不得啊,你们能为对方的人生负责吗……毕业5年了,他老人家的音容笑貌还时不时地能吓我一跳。他上作文课常说人未必有才,但要有德。

我很感谢他。快高考的时候,我脱离学校一个多月,在朋友家自学,认为这样更加有效。读书、做习题、看视频课,呆在一个屋子里,多么可怕的生活,整个人就在一种焦虑的阴影中,某个黑色网页不知道怎么从贴吧跳了出来——高考xxxx,说的是借助什么高科技设备作弊,稳上xx学校。那一刻,我心动了,像挂在悬崖边上的人看见了蜂蜜。要有德,就没有作弊。

上次暑假,因为朋友的推荐,我去浙大上了暑校。作为一个一百本学生,我主要是去长见识的,课程是请了国外业界的泰斗,和大多数课程一样是用英文授课,你会看见学生挤挤攘攘在前排用电脑做笔记,会发现他们中午吃完饭就占座,在那里睡觉。看不清啊,肯定要早点去,不早就抢不到位置,前排是抢不到的,这辈子就都抢不到的,中间也一样,只有坐在摄像机的后面才能勉强维持学习的样子。我还在兢兢业业敲机器码,有人昨晚熬到两点写完了,有人写了反汇编用C语言写完,有人直接上课一小时就交了。

我那时候刚转专业到计算机,怀疑我是不是入错行了。在我校,一般后排才是宝座,如果上英语课,你会发现老师假装在讲,学生假装在听。如果不是要点名,我宁愿翘课学习。我庆幸我没作弊,万一上了xx学校,又怎么活得下来?

既然有比较,就会有审美,就会有高下。一个中人,在这种审美中必败,那又从哪里找到自己的安心呢?在金字塔上,也许塔尖的沙粒才会轻松。要是认为自己在比较级的世界,那么最高级的才有幸福。我们都知道,那全然不可能。一个人面对自我就像暴君,那么压榨自我也是迟早的事情了。我因此焦虑了,大概是从5个月前开始头痛。原因是坚持一个比赛,需要每天写代码到十点半。前三个月在误诊,后两个月我手拿五张医院卡,挂号排队拍ct,已然轻车熟路。

不知道是不是我以前没写英语作业,把数学本交上去凑数,接着趁机写完英语的缘故,这肯定是报应!Oh my gosh,我以我0.06吨的体重的发誓,我再也不敢了,希望能够平静下来。

按照心理学的观点,我应该接纳自己,鼓励自己,在我二十年的生活中坚持:

吃饭睡觉上厕所 —— 20年

上网 —— 从五年级去网吧玩QQ宠物记起,10年

看书 —— 从自己去书店偷看漫画,被老师误以为是热爱看书还送了读书劵记起,12年

这是一个多么单纯的青年,优点之多罄竹难书。这让我开始感谢班主任,他老人家说过要老老实实做人,平平淡淡做事。前者我是做不到了,今天起平静处事。

最后,我要写一句和全文没有半毛钱关系的话。我不晓得为什么我要那么写。但是这么写看起来,好像很高级的样子——一位大妈跳着广场舞,语重心长地说:小伙子啊,

这人呐,就得爱自己。

 


从前有一人获罪于王,畏罪潜逃,国王命令一只虎追他,这个人惊慌之中,堕入枯井,身体在半空时他发现井底有凶恶的龙,吐出毒汁,旁边还有五条毒蛇。于是他抓住一把草不放,免于坠井。可偏巧此时有黑、白二只老鼠啃他手中的草,草就要被啃断;醉象在头上,时刻准备用鼻子袭击他。就在恐怖万状时,又有了新情况,他头顶上有一棵树,树上有蜂窝,蜂蜜滴滴答答落到这个人的口中,甘甜清爽,使他暂忘危险处境。

Tarjan算法(C语言实现)


//求割点
int dfs(int u, int fa)
{
    int lowu = pre[u] = ++dfs_clock;
    int child = 0;
    for(int i = 0; i < G[u].size(); i++)
    {
        int v = G[u][i];
        if(!pre[v])
        {
            child++;
            int lowv = dfs(v, u);
            lowu = min(lowu, lowv);
            //如果lowu==pre[v],光凭这一条u仍然是割点
            //>就更加了

            //lowv ,v及其后代能返回的最小祖先pre值,没有则返回自己 即lowv > pre[u] 则(u,v)是割边
            //而且还知道了u是割点
            if(lowv >= pre[u])
            {
                iscut[u] = true;
            }
        }
        else if(pre[v] < pre[u] && fa != v)//如果访问过就判断是不是后向边,
        {
            lowu = min(pre[v], lowu);
        }
    }
    //if(fa == -1 && child > 1) iscut[u] = true; 不这样判断是因为lowu一开始等于pre[u]
    if(fa < 0 && child == 1) iscut[u] = false;
    //如果是叶子结点,一开始是memset(iscut, 0, sizeof(iscut))

    low[u] = lowu;
    return lowu;
}



//求点双连通分量
struct Edge
{
    int u, v;
};

int pre[maxn], iscut[maxn], bccno[maxn], dfs_clock, bcc_cnt;//bccno记录每个点的bcc编号
vector  G[maxn], bcc[maxn];//bcc储存双连通分量的点
stack S;

int dfs(int u, int fa)
{
    int lowu = pre[u] = ++dfs_clock;
    int child = 0;
    for(int i = 0; i < G[u].size(); i++)
    {
        int v = G[u][i];
        Edge e = (Edge){u, v};
        /*栈中存储的是边而不是点!!!*/
        /*因为割顶明显不可能属于任何一个点双,所以割顶的bccno无意义。*/
        if(!pre[v])
        {
            S.push(e);//没有访问过的,就压栈,把沿途遍历到的边都加入栈(也就是第一次遍历所有的点)
            child++;
            int lowv = dfs(v, u);
            lowu = min(lowu, lowv);
            if(lowv >= pre[u])//必存在割点  若大于则还存在割边(u, v)
            {
                //若发现了一个割点,说明当前栈中已经保存了点双的所有边。
                iscut[u] = true;
                bcc_cnt++;//从1开始
                bcc[bcc_cnt].clear();//清空准备储存
                for(;;)
                {
                    Edge x = S.top(); S.pop();
                    if(bccno[x.u] != bcc_cnt)
                    {
                        bcc[bcc_cnt].push_back(x.u);//第bcc_cnt个连通分量有点加入
                        bccno[x.u] = bcc_cnt;
                    }
                    if(bccno[x.v] != bcc_cnt)
                    {
                        bcc[bcc_cnt].push_back(x.v);
                        bccno[x.v] = bcc_cnt;
                    }
                    if(x.u == u && x.v == v) break;
                }//把边集中涉及到的点全部取出来,把他们的bccno[]设置成当前的bcc_cnt
            }
        }
        else if(pre[v] < pre[u] && v != fa)//反向边
        {
            S.push(e);//也许割点v此时被push
            lowu = min(lowu, pre[v]);//反向边更新
        }
    }
    if( fa < 0 && child == 1)   iscut[u] = 0;
    return lowu;
}

void find_bcc(int n)
{
    memset(pre, 0, sizeof(pre));
    memset(iscut, 0, sizeof(iscut));
    memset(bccno, 0, sizeof(bccno));
    dfs_clock = bcc_cnt = 0;
    for(int i = 0; i < n; i++)
        if(!pre[i]) dfs(i, -1);//怕万一有些点是孤立的
}