那天下午听到的一首歌

有些想法可能在脑海里已经思考过很多次,但是只要你不把他记录下来,那么在某个情境下你又会一遍又一遍萌生出同样的思考。某天下午,一首网易云的摇滚推荐,又把我带入了我万千思绪的其中一缕之中。那是一个不是很有名的乐队叫“烂漫无期乐队”,歌名叫做《我们应该在最高潮的时候死去》。其实为什么我会去听这首歌,就是因为这个歌名。在看到他的一瞬间,我就迅速思考了一遍。对啊,要是在最高潮的时候死去,那是多美好的事啊。

只要有0.01%那就是有

自某件事之后,我的情感好像变得越来越麻木了。有人跟我说过“时间会磨平一切”,也确实时间越长忘记的细节越多。也许是我信以为真了,我开始让自己变得麻木。如果你问我,你现在还在意吗?你还怨恨吗?我肯定可以胸有成竹的跟你说“我一点都不”。在99.9%的时间里,我都是真心的祝福每个人希望他们好。可是,某天深夜里情绪翻涌的时候,我还是能记起当时的感受。在这0.01%的时间里,我发现还是做不到一点怨恨都没有,然后就被情绪漩涡所淹没。就像我最喜欢的动漫《犬夜叉》里的白心上人,做了一辈子的圣人,在死前发现自己居然会有一丝的恐惧和后悔,然后就在黑暗之中出不来了。也许,麻木只是一种保护,只是我的麻木好像也伤害了其他人,他们又何尝不是另一个我呢……

我好像对不好的回忆更深刻

不知道是我基因写死还是后期养成,我对不好的回忆总是能身临其境。以至于每次我想起我的成长经历,我想到的都是各种悲伤、痛苦的瞬间。每次我这样想的时候,就会有人跟我说“你不要太夸张了,不要卖惨”,可是我真的是不由自主的会这样想。比如,我总能想起我妈不给我买零食、玩具的场景,我总能想起我爸贬低我的场景,我总能想起期待落空的场景。结果,随着时间的流逝,我回忆里不好的瞬间越来越多。

害怕回忆

每次跟我爸妈一起出去玩,我妈喜欢拍照,我总是下意识不想一起拍。在很早的时候我就想过,如果我爸妈不在了会是什么样的场景?我设身处地想了下,我会非常的伤心难过。可能从我有这个想法开始,我就开始下意识不想和我爸妈拍照了,我害怕日后去处理这些照片,我害怕看到这些照片会让我的回忆翻涌。原来,我的保护机制很早就开始有了……

人最大的烦恼,就是记性太好

我一直很羡慕那些获得没心没肺的人,好多事情好像他们可以很快就忘掉。这几年因为工作太累了,我感觉我的记忆已经没以前那么好了,但是对比别人好像还是好得出奇。甚至在工作中,我好像也总能记住更多的事。项目的大部分细节我看过都能记得大概,而有些人明明自己经手过却转头就忘了。可能是我自己如此,所以看到别人记忆力很差,我反而很受不了,所以某年的年度差评我就给了那位同事,理由就是“记忆力太差”。扯远了,其实这句话出自王家卫的《东邪西毒》。里面的欧阳锋因为放不下和自己大嫂的爱恨情仇,再也没有回过自己的家乡。黄药师带着他大嫂送的一坛酒,跟欧阳锋说:“不久前,我遇上一个人,送给我一坛酒,她说那叫‘醉生梦死’,喝了之后,可以叫你忘掉以前做过的任何事。我很奇怪,为什么会有这样的酒。她说人最大的烦恼,就是记性太好,如果什么都可以忘掉,以后的每一天将会是一个新的开始,那你说这有多开心。”而欧阳锋在结局得知这坛酒的来历和大嫂已经过世了后,说到:“其实‘醉生梦死’只不过是她跟我开的一一个玩笑,你越想知道自己是不是忘记的时候,你反而记得更清楚。我曾经听人说过,当你不能够再拥有,你唯一可以做的,就是令自己不要忘记。”然后欧阳锋就回到了家乡,重新开始。其实某些方面我跟欧阳锋很像,前面说的那么多究其原因其实都是我记性太好,而怎么解决好像也也说的很明白了……

人最大的烦恼,就是记性太好

昨天是夏至,我关注的微博博主又发了一条很有诗意的微博。

夏至微博

我的文采可没他这么好,不过我对他的文字总能够感同身受。不知不觉之中,今年感觉又过去了一大半。那么快,就来到了一年之中白天最长的一天。也就是意味着,今年往后的时间白天将会越来越短。不知道为什么,对这种消逝的东西总是有些伤感。或许,应该换个角度想想,是黑夜越来越长了。不过,好像大部分人都没那么喜欢孤独而漫长的黑夜吧……

好长时间没有写点文字了,可能是我越来越懒了吧。前阵子,我接连犯了几次错误。我想着一定要写下一些东西来反思和警醒自己,这可能是这篇文字能够写出来的动机之一。那么,是发生什么事呢?主要是有两件事。

第一件事,是我上班迟到了。那天我就如往常一样闹钟响了之后再睡一会儿,可是这一睡就睡到了九点多,直到快十点我才去上班。这是我工作以来迟到最久的一次,结果就是那个月工资扣了一千块钱。

第二件事,是我考试迟到了。我把时间预估得太紧凑了,没有把可能的意外时间等其他时间给预估进去。结果就是白白赶到考场,然后又回到家里,浪费了考试机会也浪费了报名费。

这两件事是连着发生的,在我从考场回家的路上,我坐在地铁上就一直在想,事情怎么会发展成这个样子。如果一件事可能是偶然,连着发生就是自己可能有问题了。当时的情绪很低落,特别是从考场回家路上,有一种什么事都做不好的无力感。不过好在回到家睡了一大觉后,感觉好了很多。因为我觉得一昧的自责失落是没有用处的,只会让自己变得更糟糕。重要的是我从中学到了什么,以后又要怎么做。从对这两件事的思考中得出,我主要犯了下面两个错误。

第一个错误,是我太相信自己。就比如上班迟到这件事,我的闹钟一直以来基本都是设置一个,因为我再睡一会儿基本都能很快醒来。我太过相信自己的这个技能,最终导致睡过了头。其实这就像写代码,你基本肯定你的代码绝对不会出问题,所以不用做任何的错误处理。但是,你能保证这段代码在往后的日子里不会被修改,不会因为其他部分的修改导致这部分代码语义发生变化吗?因此,做好兜底才是最稳的。以此类推,我能保证我每次都能睡一会儿醒来吗?确实,可能我之前很少失手。但是,我在变老。或者,某天我很晚睡。那么,总有失手的那一天。还有考试迟到这件事,太过相信自己对时间的判断。没去过考场踩过点,你怎么确定自己可以很快地找到考场。没走过这条路线,你怎么确定那个时间点路上会不会塞车,你怎么确定那天的车准不准时。所有的这些,都是太过相信自己。

第二个错误,是我自制力差。就如熬夜这件事吧,每次想着要开始早睡,但是每次都没有成功。每次想着下次考试就好好复习,每次都没有好好复习。还有好多好多类似的事情……

那么怎么去解决这些问题呢?首先,做什么事最好都要有兜底,比如后面我立马加了个兜底的闹钟,这个闹钟在之后真的叫醒我好几次。然后,做一些对时间敏感的重要的事情一定要预估好时间,后面对这些事情要多预估三十分钟以上。至于自制力,这个得长期的改善了。最近好久没运动了,先重新运动起来吧。

夏至过去了,直射点从北回归线一路向南,大概是七月一号左右会到达广州附近。到那天的十二点多如果天气不错,可以下楼看看,看看自己的影子是不是完全和自己重合在一起,那可是你和他最契合的一刻呢……

(附一个昨天在黄埔有轨电车2号线拍的车窗外的视频)

这篇文章大约写于十年前,一直保存在家里的一部小米平板上,特地叫我姐姐复制发给我,以下是稍微做了一点修改的原文。

世间万物终会逝去,记忆也会渐渐忘却,所以必须记录下来,要不然什么都忘了。

小时候清明节的最深刻的就是爷爷奶奶那间房子,那个房子基本只在清明节才会回去住。

最早有印象是我大概五六岁的时候,那时的爷爷奶奶还很健康,他们会提前好几天回到湖东为清明节做各种准备。因为我还太小,所以他们不给我跟着去过纸,我就只能在家里陪着爷爷奶奶。他们在扫墓的时候我在干嘛已经忘了,但是有一个场景记忆很深刻,就是我醒来发现他们都去过纸了,然后我就边拉屎边哭。还有一个非常温暖的回忆片段,就是有一次我在门口趴在铁门上哭,有一群比我大的小孩路过,她们看见我在哭就拿了很多零食给我,现在想起来都还是觉得感谢她们。可惜时间太久远了,要是能找到她们我一定好好跟她们交个朋友!

后来我长大到差不多八九岁,我就能跟着去过纸了。那时的爷爷奶奶也还算健康,我们过纸到中途时他们会搭车过来跟我们一起,其实最主要的应该是过来看看我的伯伯的墓。

年年的扫墓我都回去,只是感觉越来越没那么期待,不过我始终还是期待的,只因那是我的家乡,那是湖东!

还有一些有意思的记忆顺便写出来,一个就是这间房子的装扮,可能是小时候没见过世面,我一直觉得那是很豪华的房子,感觉上也很温馨,气味上似乎也很特殊。正是由于这份感情,后面他被租给别人时我都非常的不愿(最后被卖掉了)。第二个就是一道在这个房子里吃的一道菜的回忆,就是腊肠炒蛋。第三个就是这间房子有个房间是我们专用的,在那个房间睡的记忆也很深刻。很安静,墙上有个电箱闪着光,外面不时会传来有人经过的声音,一大早奶奶在准备东西的声音,现在回想起来还是很温馨的感觉。第四个就是房子里的一些物件,有一辆很精致小车模型,还有一尊关公像,一些吹气玩具,还有一个鸟用嘴夹牙签的牙签盒,如今有些东西都不见了。第五个就是爷爷奶奶看的电视,戏剧和西游记。第六个就是我以前经常带些东西放在我住的房间里,比如不知道从哪拿的一个玩具车和吃方便面送的硬塑料板拼的车,然而这些东西我也找不到了,多想找回这些童年回忆啊……

今年过纸拍的大葱
(今年过纸拍的大葱)

家乡野外的风景
(家乡野外的风景)

这篇文章发出去的时候就是我的农历生日啦!先祝自己生日快乐,然后趁我有点记忆,回忆一下我对生日这个东西的记忆~

幼年时期的记忆已经越来越模糊了,已经不记得在我很小的时候是怎么过生日的,或许没有什么特别的过过。记忆中最早会在生日那天做的事就是,我妈会在早上煮蛋,吃一颗蛋就算是特别的仪式了。然后我应该会跟我爸妈说我想要什么东西或者要钱吧,已经记不清了。依稀还记得,有一次我跟我爸要跳珠玩具。就是那种一个圆盘上面有很多洞洞组成六角星,然后玩的规则是把玻璃珠放在洞洞上,全部珠子跳到对方的家里就算赢。结果我爸晚上回来忘记买了,我哭得很伤心,不过后面应该还是补买给我了。不知道为什么,对这种别人答应我我等了很久最后没有完成的事情我会非常的伤心,我的记忆中有很多这种瞬间。

跳棋

大概到接近初中时期,生日那天的仪式就多了一个小蛋糕。可能是家里条件好了一点点,我爸妈会给10块钱去买蛋糕。我就会拿着10块钱跟我二姐去蛋糕店买那种巴掌蛋糕,我还记得一般都是在哪买的,一般是贸易城下面的蛋糕店或者是玉印那的麦香村。我当时应该还是挺期待这个蛋糕的,买到后就会放在冰箱里,等到晚上点根小蜡烛许个愿,然后就开心的吃蛋糕。

大概到了高中时期,好像又回到了吃鸡蛋的阶段。可能是我二姐去外地读书了,也可能是我那时懒得去做这件事了。

大学时期,emmm真的老了,居然也记不太清。应该是分成两种情况吧,因为我的生日在农历七月末,一般就在开学前后。所以要不就算是暑假在家过,要不就是在学校过。在学校的话,基本就是延续我家传统吃个蛋然后这天吃好一点。在家的话,应该又会去买个小蛋糕了,只不过现在可能涨价到20块钱了。为啥又会买小蛋糕了,可能是我二姐回家里工作了吧哈哈。除此以外,我家里人应该开始发红包给我了。

工作后,前两年的生日都是跟我当时的女朋友过的。我还记得第一年的礼物是DIY盲盒,第二年的礼物是精心布置的冰箱,里面有蛋糕和吃的,还有一件T恤。这应该是我最大的生日蛋糕,礼物也是我收过最有心意的礼物了。不管怎么样谢谢当时的她吧,虽然每次那天都会吵架,这里就不说太多了哈哈。

去年,我又开始一个人过生日了。我还记得那天我在公司食堂吃了蛋,在公司面馆吃了面,晚上下班买了个抹茶小蛋糕吃。

博客

突然想起一件趣事,应该是我小学时,有一次我生日前在找家里的一个小游戏机没找到。然后我二姐帮我找到了,在我睡着的时候,她用绳子把游戏机绑起来吊在我床上,就在我眼前吊着。结果我半夜醒来时看见一个黑影在我眼前,吓得我不敢睁眼冷汗直流,最后没办法了鼓起勇气定睛一看,原来是游戏机。可恶,差点在生日那天被吓死阿!

老式游戏机

再说一下我对别人生日记忆深刻的瞬间。首先是我大姐,她很早就有大蛋糕吃了,都是别人送的。然后是我小时候的邻居程程,应该是我最早吃过的大蛋糕。还有我妈同事的儿子生日经常会邀请我们,很隆重。还有我和二姐给我妈和奶奶过过几次生日,特别是给奶奶过那几次,是我记忆中不多的后期她开心的瞬间。

对了,我记忆中好像以前有几个女孩子会特别记得我生日,然后踩点祝我生日快乐,谢谢你们,虽然现在都没了,有的可能已经结婚了哈哈。

经常有人说了解这个世界,最近我觉得世界是了解不了的,其实了解的都是你自己,那就最后祝我过完生日可以越来越了解自己吧!

最近玩《黑神话·悟空》真心觉得这游戏做得挺好,我个人可能更看重他的剧情部分,故事讲得真挺好的。这好像从我喜欢的一些游戏也能看出,比如我很喜欢《迷画之塔》三部曲,那故事讲得真的很让人能带入进去。这几天我通关了第一章,然后也打了一部分第二章的内容。第一章结尾的动画短片真的很好看,结合上前面打Boss把动画里的角色都了解(打死~)过一遍了,真的很让人沉浸其中。写下这段文字只是想记录记录我的胡思乱想,这胡思乱想是有个时间线的。

迷画之塔

打完第一章后,当我还沉浸在第一章的故事中时,第二章开头的陕北说书又把我给震撼到了。我个人认为这太TM摇滚了吧,这节奏、这Real的语言、这腔调,简直就是中式摇滚。之前听谭维维的《华阴老腔》和看《活着》电影时里的秦腔时我就这样觉得,原来老秦人才是最早的滚人。

陕北说书

回到正题,正是这段陕北说书让我印象深刻,所以今天上班时打开了网易云,打开了黑神话音乐精选,《黄风起兮》就是游戏里听到的陕北说书。在我听了几遍后,看到了第一章结尾动画的BGM《看见》,这首也好听,歌词也很贴近剧情,应该是量身定制的吧。歌词里写到“色与空,弹指间。贪嗔痴,看见。”是阿,就如黑熊精问菩萨:“出家人尘缘已断,金海尽干,长老他为何偏偏放不下一件衣裳?”我觉得是因为金池长老还没有放下色相,在他看到袈裟的一弹指间他就破了色相了。其实从长老和黑熊精利益交换来看,从一开始就有了贪欲吧。所以为什么放不下一件袈裟呢?大概是长老根本没有得道吧。

黑熊精

再次回到正题,正当我想得起劲时,觉得这歌里面的诵经声很好听,所以就搜了经文来听听。听到《金刚般若波罗蜜经》时,觉得很好听阿,所以我就听了几个小时的金刚经。里面有这么几句我觉得挺好,而且又跟前面金池长老的剧情挺贴合的。

若菩萨有我相,人相,众生相,寿者相,皆非菩萨。
凡以色拜我,以音声求我,是人行邪道,不能见如来。
凡所有相皆为虚妄,若见诸相非相,则见如来。
一切有为法,如梦幻泡影,如露亦如电,应作如是观。

长老为相所困,因此得不了道。这里就不对经文做什么解释了,因为只有自己去理解才叫经,如果尽信别人的解释那就不是经。不过这最后一句,也太哲学了吧,多少人能做到如此呢。

最近有人说我虚伪,这件事我也思考了挺久。首先,应该没有人不存在虚伪吧,我说过很多次我目前对事物的看法就是没有绝对的东西,所以每个人都应该有虚伪只是程度不同。再者,什么是虚伪?把他拆成两半来看,虚伪是虚假和伪装。我想了很久我们一直以来交流中我有说了很多虚假的话和做了什么伪装的事吗?当然肯定是有的,就如我前面说到的,但是程度大吗?并没有,我自认为我的言行和我所想基本都是一致的。最后,如果要说虚伪的程度,似乎对方更胜一筹,因为每次骂我前一定是夸我,每次说坏话前一定是好话,还有各种矛盾的行为,这是不是更虚伪呢?

胡思乱想写出来就变成了胡言乱语,但是至少把所想记录下来了,有时候做比想更重要!

前言

一直都知道家乡有个音乐家,做过中央音乐学院的首任院长名字叫马思聪。但是之前一直停留在知道有这么个人的程度。直到某个秋天的下午,我心血来潮的想听听这位家乡著名音乐家的曲子。在公司打着代码的我,打开网易云搜索马思聪,播放最热门的《思乡曲》。很难解释当时这个小提琴曲带给我多大的震撼。在我听到音乐的瞬间,我马上想起我在陆丰电视台看过的一个视频,标题大概是“陆丰风光”,他的背景音乐就是用的这首《思乡曲》。我不知道我是因为想起我童年孤独的对着这个十几分钟的纯风光片看重复看几十分钟的悲伤,还是因为觉得把一首名字叫做思乡曲的曲子配在一个在家乡的风光片这件事太浪漫了,还是因为我身在异乡被这首曲子传达的感情感动了,反正我确确实实被震撼到了。那天过后,我就想着一定要为马院长写篇文章。

简介

马思聪

我要把每一个音符献给祖国。——马思聪

1912年5月7日,马思聪作为马家的第五个儿子,出生在广东省海丰县幼石街上的一座深宅大院里,小名艾。马思聪的父亲马育航同广东的风云人物陈炯明是总角之交,后来当上了广东省的财政厅长,这才得以维持9个儿女的一大家的生活。马思聪的父母都不懂音乐,但广东的戏剧之乡海陆丰所独有的地方戏剧音乐深深地影响着童年的马思聪。

1923年,11岁的马思聪终于实现了他的梦想,随大哥来到法国,开始了他的音乐生涯。先后就学于南锡音乐学院、巴黎音乐学院学习小提琴 。

1929年初,马思聪因家境突变回国。在香港、广州、上海等地演出,被誉为“音乐神童”。

后1930年再次赴法,向毕能蓬(Binembaum)学作曲。

1931年,广东省政府官费资助,马思聪再次赴法留学,第二年归国,任中国第一所现代“私立音乐学院”院长,主要在广州、香港、上海、南京、北平等地从事演出。同时,又先后在广州音乐院、中央大学教育学院音乐系任教。

1932年马思聪与他的女弟子王慕理结婚。

1937年抗日战争爆发后,多年转辗于华南、西南各地坚持从事频繁的演出,并先后任中山大学教授、中华交响乐团指挥、贵阳艺术馆馆长等职。

1945年抗战胜利后,先后担任台湾交响乐团指挥、广州艺术音乐系主任、上海中华音乐学校校长、香港中华音乐院院长等。

1950年后任中央音乐学院首任院长,并兼任中国音乐家协会副主席,《音乐创作》主编等职。

由于文革原因,1967年1月经香港出走,赴美国定居,从事作曲、教学工作。

1971年7月,美国总统安全事务助理基辛格从北京返回美国,周恩来托其向马思聪转达:“我平生有两件事深感遗憾,其中之一就是马思聪50多岁离乡背井去美国,我很难过。”

1987年5月20日于美国费城逝世。

2007年12月14日,马思聪异国辞世20年后骨灰归葬中国广州,同日《马思聪全集》在广州艺博院举行首发式。[1]

评价

对于马院长,最有争议的点在于文革这段”叛国投敌“的经历,还有后续马院长和台湾密切的联系上。先表达一下我对文革的看法,我个人其实是非常理解文革的精神的。但是这件事得分为理想和现实,其实我一直有表达过我对事物的看法,就是任何事物没有绝对。无产阶级里也有坏人,资产阶级里也有好人,什么是无产阶级,什么是资产阶级,什么是好人,什么是坏人,没有人能完全说得清和确定。这场革命在理想里是完美的,但是在现实中避免不了是一场灾难。话再说回来,马院长就是这场灾难的受害者,国家始终是对他有亏欠的。1971年7月,美国总统安全事务助理基辛格从北京返回美国,周恩来托其向马思聪转达:“我平生有两件事深感遗憾,其中之一就是马思聪50多岁离乡背井去美国,我很难过。”[1]至于后期马院长跟台湾的联系,很难准确的评判这件事。我个人感觉最后马院长一直没有回到大陆,除了对文革经历的恐惧,还有就是跟台湾的联系密切导致。在网上也找到了一篇对马院长没回大陆做解释的文章,作者是《思乡曲———马思聪传》的作者。[2]

结语

听过一句话,”时代的一小粒灰尘,散落到个人的头上,就是足以压垮人的一座大山。“用在生活在那个动荡年代的人身上最适合不过了。不管如何从音乐造诣上来说,马院长无疑是一位优秀的音乐家。我上网找了很久那个陆丰风光的视频都没有找到,我相信做这个视频的人一定是个浪漫的人。某种意义上,这个视频就像是带着马院长游历故乡一样。最后,马院长的墓就在广州白云山,有机会一定过去悼念。

参考资料

  1. 马思聪 - 百度百科
  2. 马思聪为什么没有回来?- 搜狐新闻

前言

有时候回顾历史,对于历史中出现的人物,我们总是以现代的角度去评判他。其实,任何的历史人物和事件都应该站在当时的时代背景和不同的角色角度去看待。曾经听一位历史老师说过:“看待一个人物,可以从当时其他的大人物对他的评价和行动来做参考,可能会更客观”。我觉得很有道理,至少当时的人跟这个人物是同处一个时代。甚至不同的角色如朋友、对手的评价可以做到对这个人物的描绘更加完整。对一个事物的评价,有时候很难脱离立场影响。有段时间我读了一些些儒家的经典,很多人说儒家是“虚伪的道义”甚至于是“统治者的工具”,其实我个人认为这也是脱离时代背景的。跑题了,铺垫了这么久其实这篇文章我就是想介绍一下我家乡一个近代的人物——陈炯明,我个人认为他是一个“好人”。这里为什么好人要用双引号呢?首先我不知道,对“好人”的定义应该是什么,由于政见问题,对于统一派的国共两党来说,这个“背叛”了孙中山的人肯定算不上“好人”,这里我说他是个“好人”只是从我个人对“好人”的感受来说的。

介绍

陈炯明

陈炯明(1878年1月13日—1933年9月22日),汉族,幼名捷,字赞三,又字月楼、竞存。广东海丰县白町乡人。粤系军事将领,中华民国时期军政代表人物之一。

1887年入县学,后在惠州读书,1898年考中秀才。1905年和1908年先后毕业于海丰师范学堂、广东法政学堂。早期思想激进,敢做敢为。1911年10月武昌起义爆发后,在香港召集同志准备东江起义,被推举为起义军总司令,旋与邓铿赴归善(今惠阳区)组织起义。11月6日,在淡水起义,打响东江起义的第一枪。二次革命中,宣布广东独立,二次革命失败后流亡南洋。1916年在惠州附近成立了广东共和军总司令部,任总司令,参加护国。袁世凯死后,交出兵权,北上晋见段祺瑞、黎元洪,获“定威将军”称号。1917年随孙中山南下护法,率亲军组成援闽粤军。1918年1月,兼任惠潮梅军务督办,率部入闽。1919年10月任国民党广东支部长,反对孙中山北伐,鼓吹联省自治。后因反对北伐,且以辞职相威胁,被免去内政部长、广东省长和粤军总司令职,保留陆军部长。1922年6月指使所部叛变,炮轰孙中山驻地后回任粤军总司令。

1924年1月4日,孙中山通电讨陈。陈炯明通电下野,退居香港,残部退往东江一带,后经广州国民政府两次东征,被彻底消灭。1925年10月10日,美洲致公堂改组为中国致公党,推举陈炯明为总理,唐继尧为副总理。1933年9月22日,病逝于香港。

评价

《上海新申报》对陈炯明评论:“陈氏为人刚毅果敢沉默寡言,其私人道德,可为南北权要之模范”。

章太炎也赞誉陈“清操绝于时人,于广中弥不可得”。

孙中山曾坦言陈炯明“不好女色,不要舒服,吃苦俭朴,我也不如”。

上面是我在网上找了一些名人等第三方对陈炯明的评价,具体出处是否真实这里我没去考证。由于后期“背叛”孙中山,所以后期双方在舆论上互相抹黑是习以为常的事情,以至于我们回看历史会有很多“噪音”。信息传播就是这样,先不管如“胜利者书写历史”这种情况,就算是一篇客观的报道也可能因为转述、叙述而失真。上面几个评价,可以看出陈炯明其人应该是一个私人品德方面非常优秀的人。可能有人会拿他“背叛”孙中山来说事,我个人是觉得这种政见方面的东西需要分出对错是很难说的。有人说他在炮击总统府前有漏风“何时何地进行炮击”,要不然孙中山是跑不掉的。我个人觉得是非常有可能的,从后面他自己的表述来看他也没有想置孙中山于死地的想法。我个人对私人品德方面能坚持恪守的人是非常敬佩的,这可能也是我对他有“好”的评价的重要原因。

在我找到的一些陈炯明管理过的地区对他的一些记录里,有我对他是“好人”的第二个重要原因。如果是上面的第一个原因是因为“德”,这第二个原因就是“仁”。他的施政是偏向改善民生的,尽管我也有看到一些报道说他在惠州海丰期间剥削百姓的报道,但是我不确定那是不是跟我上面说过的一样是失真的“噪音”。我现在就在广州工作,陈炯明留下的遗产“骑楼”、“一德路”等富有远见的建设还在发挥作用,推动教育、禁毒禁赌在现在看来都仍然富有建设性。很多人说这些“仁”是目光短浅的,要成大事就要有所牺牲等等,我个人持中立态度,可能我个人还是更倾向这种小“仁”。

下面是一幅陈炯明的书法,刚好内容是讲共产主义。首先字我个人认为非常好看,再者内容我个人也觉得写得很好。俗话说字如其人,全篇写得工整端正,章也盖得端端正正,可以看出是一个很有原则行事端正的人,当然这只是我的个人的猜测。

陈炯明书法

陈炯明后来避居香港。“九一八”事变后,日本人企图拉他下水,他则反过来要求日人归还东北三省。日人拉拢不成,仍赠他8万元支票,陈炯明在支票上打叉退还。其后,他派代表参与将美洲洪门致公堂改组为中国致公党,与中国共产党合作抗日,直至今日都是参政党之一。

这是流传的陈炯明在抗战期间的故事,有趣的是致公党确实是现在中国最大民主党派之一。日本收买一事广为传播不知真假,还有其中与共产党合作抗日一句也同样不知真假,因为在百度百科里提到到了:1931年“九一八”事变后,他发表《敬告国人书》,说:“目前心腹大患,尤非较轻于日寇,共产党遍布南方各省,随时皆可乘机爆发。”他还向国民党建议“宁(南京政府)任外交,收复失地,粤任剿共,巩固后方”,和当时蒋介石的“攘外必先安内”互相呼应,这似乎有点矛盾。我不是学者不可能全部去查证,从我个人感觉来说,我觉得拒绝日本人大概率是真的。做过同样的事的还有另一个有名的“军阀”——吴佩孚,此人我也是非常敬佩的,这里军阀的引号我解释我个人理解,本身军阀的定义就宽泛,如果军阀统一了中国或者军阀加入胜利者的军队成为将军那么就好像又不算军阀了。在我们的潜意识中军阀这个词汇好像就是一个贬义词,实际上我个人认为只是一种状态,就比如在某些时刻孙中山、蒋介石看起来不也是一个“军阀”?又跑题了,总而言之这里是我认为陈炯明是“好人”的又一点,就是“爱国爱家”。

结语

最近看朴树的采访,他说他不相信语言更相信音乐的表达。我觉得很有道理,语言、文字终究只是一种把你的想法表达出来的工具,既然是工具就不可能作出完美的诠释。以上的想法更多是我带入我自己,去尝试理解陈炯明而写出的,终究也只能是我个人想法。世界万物是非对错很难说清,世界本身就是一个混沌的状态,取决于你怎么去看而已。五条人有一首《陈先生》,短短三句话用三种语言概括了陈炯明的一生,旋律也很好听,推荐大家听一下。

参考资料

陈炯明 - 百度百科

陈炯明在漳州 - 漳州人民政府

民国军事家陈炯明私德为孙中山赞誉,书法当代罕见 - 搜狐网

前言

前阵子有个网关项目选型了Spring Cloud Gateway,由于需要进行API签名校验,项目组里又有很多老接口都是multipart/form-data请求类型的,所以就要咋子Spring Cloud Gateway中获取multipart/form-data请求类型的参数用于API签名。这其中走了不少坑,顺便给要做网关项目的人一个忠告……

先看看有没有现成的方法可以调用

相信看到这篇文章的人都对Spring Cloud Gateway有所了解,这里就不过多介绍了。过滤器的过滤方法的参数如下所示:

1
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);

ServerWebExchange类里有这么一个方法:

1
2
3
4
5
6
7
8
9
10
/**
* Return the parts of a multipart request if the Content-Type is
* {@code "multipart/form-data"} or an empty map otherwise.
* <p><strong>Note:</strong> calling this method causes the request body to
* be read and parsed in full and the resulting {@code MultiValueMap} is
* cached so that this method is safe to call more than once.
* <p><strong>Note:</strong>the {@linkplain Part#content() contents} of each
* part is not cached, and can only be read once.
*/
Mono<MultiValueMap<String, Part>> getMultipartData();

这不是得来全不费工夫?没怎么简单,由于网关只是一个中间层,参数是要向下传递的,而请求的body只能被读取一次(这一点在注释中也有体现),因此如果使用了这个方法将导致body丢失导致报错。

看看度娘有没有好方法

在百度一番搜索中,最终找到一个Github项目:https://github.com/xurui8691413/sping-cloud-gateway-read-multipart-filter 。其中关键代码已经被原作者删除了,可以自行查看提交记录。代码是可以成功获取到multipart/form-data请求类型参数的,但是会有内存泄漏问题而且调用到太多WebFlux的底层API了,不太优雅。
这里简单提下为何会有内存泄漏问题,以下是部分关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return exchange.getRequest().getBody().collectList().flatMap(dataBuffers -> {
byte[] totalBytes = dataBuffers.stream().map(dataBuffer -> {
try {
byte[] bytes = IOUtils.toByteArray(dataBuffer.asInputStream());
logger.info(new String(bytes));
return bytes;
} catch (IOException e) {
throw new RuntimeException(e);
}
}).reduce(this::addBytes).get();
ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return Flux.just(buffer(totalBytes));
}
};
Mono<MultiValueMap<String, Part>> multiValueMapMono = repackageMultipartData(decorator, codecConfigurer);
return multiValueMapMono.flatMap(part->{
System.out.println(((FormFieldPart) part.getFirst("param")).value());
return chain.filter(exchange.mutate().request(decorator).build());
});
});

}

这里可以看见他为了可以重复读取请求body重写了exchange类下的request对象的getBody()方法,这样每次读取body都会构造一份新的DataBuffer对象,问题就出在这个DataBuffer是使用堆外内存创建的,在用后需要release掉,而框架会在请求的最后去release请求的body,如果你调用过多次这个重写过的getBody()方法,框架只会帮你release掉最后一次调用的DataBuffer对象。

看看官方文档

在过滤器篇章中,我们可以看见一个用于缓存请求body的过滤器:
https://docs.spring.io/spring-cloud-gateway/docs/3.1.4/reference/html/#the-cacherequestbody-gatewayfilter-factory
很可惜,他只能缓存简单的类型,而且只能指定一种类型,这对我们的网关而言,是远远不够的,因为我们支持多种的请求类型。但是请别急,我们看看他的实现。其中的关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
final ServerRequest serverRequest = ServerRequest
.create(exchange.mutate().request(serverHttpRequest).build(), messageReaders);
return serverRequest.bodyToMono((config.getBodyClass())).doOnNext(objectValue -> {
exchange.getAttributes().put(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR, objectValue);
}).then(Mono.defer(() -> {
ServerHttpRequest cachedRequest = exchange
.getAttribute(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
Assert.notNull(cachedRequest, "cache request shouldn't be null");
exchange.getAttributes().remove(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
return chain.filter(exchange.mutate().request(cachedRequest).build());
}));
});

ServerRequest的bodyToMono()方法是支持复杂类型的入参的,只要我们稍微改造一下就可以成功获取multipart/form-data请求类型参数。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.lucien.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.multipart.Part;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.server.HandlerStrategies;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.List;

import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR;

@Component
public class ReadRequestBodyFilter implements GatewayFilter {

private final List<HttpMessageReader<?>> defaultMessageReaders;

private ReadRequestBodyFilter() {
// 获取默认的messageReaders
defaultMessageReaders = HandlerStrategies.withDefaults().messageReaders();
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
URI requestUri = request.getURI();
String scheme = requestUri.getScheme();

// Record only http requests (including https)
if ((!"http".equals(scheme) && !"https".equals(scheme))) {
return chain.filter(exchange);
}

Object cachedBody = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);
if (cachedBody != null) {
return chain.filter(exchange);
}

return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
final ServerRequest serverRequest = ServerRequest
.create(exchange.mutate().request(serverHttpRequest).build(), defaultMessageReaders);
return serverRequest.bodyToMono(new ParameterizedTypeReference<MultiValueMap<String, Part>>() {
}).doOnNext(objectValue -> {
// 在这里做你想做的事情
exchange.getAttributes().put(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR, objectValue);
}).then(Mono.defer(() -> {
ServerHttpRequest cachedRequest = exchange
.getAttribute(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
Assert.notNull(cachedRequest, "cache request shouldn't be null");
exchange.getAttributes().remove(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
return chain.filter(exchange.mutate().request(cachedRequest).build());
}));
});
}

}

奇怪的线程挂起问题

当你以为大功告成时,在一定条件下下(可能是body大小大于一定数值)压测时发现压测一段时间后压测线程的请求都会hand住处于类似死锁的假死状态。关闭压测线程重新启动又可以正常请求然后一段时间后又进入假死状态,排查了很久无果后,只在Spring WebFlux的Github Issue里看到可能的原因:https://github.com/spring-projects/spring-framework/issues/28302 。虽然我并没有开启问题里提到的stream mode,但是感觉八九不离十是这个DefaultPartHttpMessageReader的问题,这个Reader就是专门解析multipart/form-data请求类型的,而且是后期Spring为了完全响应式而替换了原本的非响应式Reader的(如果你使用的版本没有使用DefaultPartHttpMessageReader则无需往下看了)。因此参试替换会原本的Reader进行压测,故障排除。最终代码:

由于DefaultPartHttpMessageReader替换了SynchronossPartHttpMessageReader,官方已经没有把依赖进行打包。需要添加以下依赖:

1
2
3
4
5
<dependency>
<groupId>org.synchronoss.cloud</groupId>
<artifactId>nio-multipart-parser</artifactId>
<version>1.1.0</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.lucien.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
import org.springframework.http.codec.multipart.Part;
import org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.Collections;
import java.util.List;

import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR;

@Component
public class ReadRequestBodyFilter implements GatewayFilter {

private final List<HttpMessageReader<?>> multipartMessageReaders;

private ReadRequestBodyFilter() {
SynchronossPartHttpMessageReader synchronossPartHttpMessageReader = new SynchronossPartHttpMessageReader();
// 这里需要设置为-1
synchronossPartHttpMessageReader.setMaxInMemorySize(-1);
multipartMessageReaders = Collections.singletonList(new MultipartHttpMessageReader(synchronossPartHttpMessageReader));
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
URI requestUri = request.getURI();
String scheme = requestUri.getScheme();

// Record only http requests (including https)
if ((!"http".equals(scheme) && !"https".equals(scheme))) {
return chain.filter(exchange);
}

Object cachedBody = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);
if (cachedBody != null) {
return chain.filter(exchange);
}

return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
final ServerRequest serverRequest = ServerRequest
.create(exchange.mutate().request(serverHttpRequest).build(), multipartMessageReaders);
return serverRequest.bodyToMono(new ParameterizedTypeReference<MultiValueMap<String, Part>>() {
}).doOnNext(objectValue -> {
// 在这里做你想做的事情
exchange.getAttributes().put(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR, objectValue);
}).then(Mono.defer(() -> {
ServerHttpRequest cachedRequest = exchange
.getAttribute(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
Assert.notNull(cachedRequest, "cache request shouldn't be null");
exchange.getAttributes().remove(CACHED_SERVER_HTTP_REQUEST_DECORATOR_ATTR);
return chain.filter(exchange.mutate().request(cachedRequest).build());
}));
});
}

}

一点忠告

如果不是专门做网关的部门,没有太多的时间对Spring Cloud Gateway进行学习,建议不要使用Spring Cloud Gateway。一开始选型时,没有考虑到Spring WebFlux响应式编程的复杂性,之前在掘金看见字节一篇介绍Zuul网关的文章里说道:“至于 Zuul1 和 Zuul2 的性能比对,Netflix 给出了一个比较模糊的数据,大致 Zuul2 的性能比 Zuul1 好20% 左右,这里的性能主要指每节点每秒处理的请求数。为什么说模糊呢?因为这个数据受实际测试环境,流量场景模式等众多因素影响,你很难复现这个测试数据。即便这个 20% 的性能提升是确实的,其实这个性能提升也并不大,和异步引入的复杂性相比,这 20% 的提升是否值得是个问题。” 这篇文章写得很好,感兴趣的可以去看看:https://juejin.cn/post/7140223037646831647 。总而言之,更好的选择应该是Zuul1(强如字节都选Zuul1),至少他是常见Servlet、Filter和阻塞模型,排查问题和开发上都会更加方便。

后续

今天闲来无事翻看Spring Framework的Github,居然发现上面提到的线程挂起问题似乎被修复了,只需要把Spring Web的版本升级到对应版本即可。Issue地址:https://github.com/spring-projects/spring-framework/issues/28963

Spring Cloud Gateway也修复了几个相关的内存泄漏问题,需要注意一下对业务有无影响,Issue地址:https://github.com/spring-cloud/spring-cloud-gateway/pull/2842https://github.com/spring-cloud/spring-cloud-gateway/pull/2838

前言

我是一个土生土长的陆丰人,我的爸妈也都是如此。我不知道我们祖祖辈辈在这里生活了多久,但是我知道这里永远是我的故乡。

家乡中的故乡——湖东

在陆丰中再细分我的故乡,那就是湖东。那是一个我呱呱坠地的地方,一个沿海小镇。湖东这个小镇确实是名副其实的海边小镇,一出门走几步就可以走到港口,港口里停满了木质的老式渔船。走在上面,可以看见渔获归来的渔民在码头上贩卖海货。晴天时走在上面,一排排的木架上面晒满了干货。一边是内港,一边是民房,很有海边小镇的风味。

码头
在我妈那里,经常能听到她怀孕期间在湖东的祖公厝(放祖宗牌位的屋子)里发生的各种事迹。什么闹鬼啊、没人来陪她啊、一推旯牙(一种蜘蛛)、我出月后的台风啊(据说我差点被命名台风)。不过自我出生出月后,我就去到陆丰的市区——东海镇生活。之后在我学步时可能也有回去住过一段时间,其余时间只有清明节和过年时回去了。

对于湖东,我有特别的情感,也不知道怎么解释,就是那种根在那的感觉。毕竟我的父母都是湖东人,我也是在那出生的,每次回去都有一种得到归属的感觉。还记得小时候回去是坐那种绿色的小巴,那时的路况也不好,一堆人挤在里面颠颠簸簸。不过每次回去我都是开心的,每次离开时则有一种不舍感。现在的湖东也一直在发展,从小巴变成大巴再变成电动的公交车还有环绕着小镇的风力发电的风车。湖东也在变成一个现代化的小镇,但是在我心里她永远是那个有海风的味道的海边小镇!

湖东前海

我成长的地方——东海

自我出生后我就到东海镇居住,我在这里读幼儿园、学前班、小学、初中和高中。我们在这里租了多次房子,最后也买了房,每个地方我都有不一样的记忆,这里我就不多说了。东海,这是一座繁华的小镇,特别的有烟火气息。

法留乌面
由于我从小在这长大,我的海陆丰话口音是一口东海腔。我从小学开始都是走着去上学的,所以也体会到了各种不一样的烟火气息。小学我在东风小学,附近就是龙山中学(这可能为我高中上龙山打下铺垫),门口就有一条东风美食街。各种烧烤、碗粿、虾粿,甚至一些外来的小吃也是最先出现在东风附近,不过我小时候太穷大多吃不起……学校一出门就是东河——东海的母亲河,端午节时我总是会在河边看龙舟,这些都是美好的记忆。初中在龙潭中学,去上学时经过玉照公园,早上去上学的我总能看见晨练的老人,那种感觉十分有朝气。高中时在龙山中学,那是一所具有近三百年历史的高中,甚至我的爷爷也是毕业于此,在那里我受到了文化的熏陶,各种红色故事就曾发生在校园里(这可能培养了我的爱国精神),四处都是文化的沉淀,记忆最深刻的是我晚修回家时,走在龙山脚下寂静无人的无光的巷子里,抬头看天上的星星,在紧张的晚修后 (我怎么好意思说得出口-_-||——2022年12月28日) 算得上是一种放松。
龙山中学

其实我读的那所东风小学也是有三百多年历史的,想起小学校歌里的歌词——“漯河波光闪闪”,又想起龙山的校歌歌词——“同学们努力前进,进向那革命的战场”,这一切都在诉说着这座小镇的历史文化,虽然现在并没有有巨大的发展,但是有朝一日她会恢复到与她历史中相符的地位。

结语

陆丰还有很多的小镇,碣石、甲子等等,每一座都有他独特的感觉和历史文化,以后我可能会发一下陆丰的山山水水,让你们更好的了解陆丰的美丽风景~

0%