通宵看了大巴黎和OG的比赛之后状态就有点回不来了,虽然看完了SICP的第二章打算进入总结,萎靡的精神和今晚的比赛却不允许我这么做,就想起来把之前的读书的笔记整理一下,也算是一个调剂吧.下午很想搞点什么但是也不想变得无所事事.

这本书第一次知道是在看公正的公开课的时候,在讲到穆勒的时候就提到了这本《论自由》了,当时对这本书并没有很多的了解,只是从一句:”能够增加全社会福祉的就是高尚的行为和爱好”的总结中知道了这本书的大概,后来却发现完全不是这样.这本书算起来也是读了大概3遍了,从蜗牛读书看到了kindle上,作为一本”哲学”书,似乎就注定了它非常的难啃,但是3遍下来感觉还是有点收获的.

对这本书最好的名字还应该是严复先生的《群己界限论》,这也是为什么将它放在开头,论自由这个名字似乎更容易引起歧义,好像看了这本书就能获得”自由”一样,其实这本书更多的还是讲的是个体和群体的界限在哪里,群己界限论的翻译确实也是达到了信达雅的地步,但是翻译本是偏文言文所以还是放弃了,最后选择了孟凡礼的译本.在这个似乎不那么”自由”的时代也使得这本书的意义显得更加的深厚了.

在之前看柴静的《看见》的时候,有一句震撼人心的话铭记到了现在:

我想要宪法赋予我的那个世界

当时说是起鸡皮疙瘩也不为过,在看穆勒的这本《论自由》的时候,再想到这句话就更加令我难以忘怀:我们现在获得了那个宪法赋予我们的世界了吗?我们又该如何才能获得那个世界呢?我想这是个两方面的问题,政府和个人都需要努力,努力的去履行和遵守宪法.

摘抄批注

在一个基本权利问题未得根本解决的社会情况下,如何捍卫已经凸显出来的个人自由,尤其是思想言论的自由,从而保持这个民族的生命力,为个人自由留出向纵深拓展的足够的社会空间(这些东西正是穆勒所揭示出来的不同于洛克right的liberty的核心意涵所在)?在穆勒看来,最关键的就是限制政府权力,划定它的界限,他反对政府乃至社会的舆论一律,要求尊重个性自由,反对政府垄断工业、垄断人才(即使是通过全面公平的公务员考试遴选制度)。反观中国,穆勒所指陈的那些问题正可说是触目惊心,权力边界问题、政府垄断问题、言论空间问题……诉诸我们亲身的所见所感,比之十九世纪的英国,情况何其严重乃尔!

这是译者写的序,名字叫做为什么今天我们还要读论自由.确实,现在我们的情况相较当时的欧洲世界来讲也没有变好,可能是民族文化的不同,但是政府做大家长的方式放在现在确实还是存在很多问题的.情况何其严重乃尔!,而从这篇序写成到这篇总结开始,情况似乎也没有变好,这似乎使得对穆勒思想的了解变得更加重要了.

如果公路、铁路、银行、保险、大型股份公司、大学以及公共慈善事业等等,所有这些都成了政府的分支;又如果城市自治会和地方议事会,连同目前所有交付它们管理的事务,都成了中央行政系统的附属;如果所有这些不同事业的雇员都要由政府任命和支付薪酬,乃至终其一生每一升迁都需仰赖政府;那么,纵有再多的出版自由和民主的立法机关,都不足以使英国和其他国家变得真正自由,除了徒具自由之名而已。并且行政机器的构建越是科学有效,即其网罗最优秀人才来操纵这架机器的办法越是巧妙娴熟,其为患也就越大。

在这些文字中,我们仿佛看不到十九世纪的英国,而完全是我们当前的问题。穆勒所指陈的公共权力对言论自由和个性发展的限制,尤其是权力漫无边界的问题,何以在跨越了一百五十年之后,仍然让我们身受而感同?由此可见,一部真正伟大的著作,所谓的经典,固然是源于作者生存时代与地域的问题激发,但其思想价值完全可以超越它的时代和它的地域,而具有某种程度的普遍性或普世性意义。

仍然还是序言,当时看到这些序言的时候就感觉到了真正的经典是跨越时代和地域的,虽然跨越了国家和时代但是我们所面临和关心的仍旧相同.

社会所能合法施加于个人的权力的性质和限度。

可以说这是这本书所要阐述的核心,也就是群体和个人的界限,只有划定了这条界限并且遵守它,个人才能守护自己的那份”自由”.

让某些可称之为政治自由或政治权利的豁免权获得认可,统治者若侵犯这些自由或权利即被视为无道,一旦其真的有所侵犯,人们的个别抵制或普遍抗争就被认为是正当的。其二,且一般说来是比较晚近的做法,即宪政制衡的确立,使得统治权力某些重要措施的实施,要以得到群体或被认为是代表群体利益的某种团体的同意为必要条件。

这是封建时期统治者和群众划定的自由的边界,可以看到从封建时期到立宪时期,自由的边界是在变化的.这也是穆勒的目的,为新的政治运动找到合理的理论支持和方向.

然而,当一个幅员广阔的民主共和国最终雄踞地表,并且被视为世界民族之林最强大的成员之一时,民选的责任政府作为一个重大的既存事实,就成为观察和批评的对象。

人们开始察觉所谓的“自治政府”与“人民自我治理权”等名词并不能反映事情的真实状态。行使权力的“人民”和权力所施对象的人民并不总是同一的;所谓的“自治政府”也不是每个人自己治理自己的政府,而是每个人受所有其他人治理的政府。而且,人民的意志实际上只是大多数人的意志,或者是人民中最活跃的一部分人的意志;而所谓大多数又或者只是使他们自己成功地被接受为大多数的那些人而已;结果就是,人们也会要求压迫总体中的一部分人。

但是深思之士已经察觉到,当社会本身就是暴君时,即当社会集体凌驾于组成它的各别个体之上时,暴政的实施就并不限于借助政治机构之手而行的各种措施。

仅仅防范各级官府的暴政是不够的,还需防范优势意见和大众情感的暴政

这应该就是”多数人的暴政”的表现吧,在《论美国的民主》这本书中作者也提到了美国最大的敌人就是多数人暴政.在今天网络发达之后,多数人的暴政似乎更容易形成更大的力量,在黑镜第三季最后一集也是对这个问题做了一次很好的演示:网络投票杀死民众最讨厌的人.很讽刺但是也很现实.

集体意见对于个人独立的合法干涉是有一个限度的。发现这一限度并维护其不受侵蚀,对于使人类事务进至良善之境来说,正像防范政治上的专制一样,是不可或缺的。

在防止人们对人类相互强加的行为准则发生任何疑问上,习俗的效力可说是更加彻底

只能说在中国这样的关系社会中,这样的问题会更加的突出和激化,习俗,舆论,家规,族训,最可怕的谋杀永远是无声的.

无论哪一国家,只要存在着一个上流阶级,这个国家的道德原则大部分就会源自这一上流阶级的阶级利益和阶级优越感。

社会的好恶,或社会中强势群体的好恶,就这样成为实际决定社会规则的主要依据

这看上去很不合理,但是现实就是这么发生的,所谓道德观也就是大部分人所认同的东西而已,我们说人们拼命维护自己的权利是因为这个权利使得他有利可图,而使得最多数人获得利益的认同,也就变成了法律和习俗.想要从这个层面不侵犯某些人的自由,才是最难做到的.

有些人无论何时看到一利当兴,又或一弊当革,便很自然地希望政府有所承揽;而有些人则宁可忍受几乎一切社会苦痛,也不愿意在要受政府控制的人类利益部门中,再增添一个新的项目。

大家长式的管理模式和这段话的对应不能再贴切了.

人们若要干涉群体中任何个体的行动自由,无论干涉出自个人还是出自集体,其唯一正当的目的乃是保障自我不受伤害。

违背其意志而不失正当地施之于文明社会任何成员的权力,唯一的目的也仅仅是防止其伤害他人。他本人的利益,不论是身体的还是精神的,都不能成为对他施以强制的充分理由。

在仅仅关涉他自己的那一部分,他的独立性照理说来就是绝对的。对于他自己,对于其身体和心灵,个人就是最高主权者。

这本书的核心应该就是在这了,但是到现在为止,做自己心灵的主宰又何谈容易.

因为我把功利视为一切伦理问题上的最终归宿。但这里的功利是最广义上的,是基于做为不断进步之物的人的长远利益而言的

这也是被公正的公开课攻击的一个论点,社会效益最大化的功利主义看上去很合理,但是这过程中伤害到的个人的自由和利益,在某些情境之下却是个人难以接受的.这也是政治不断进步的原因吧.

首先是人类内在的意识领域的自由:它要求最广义的良心自由,思想和情感自由,对举凡实践、思想、科学、道德、宗教等所有事物的意见和态度的绝对自由。

要求品味和志趣自由:自由地根据自己的特性规划生活,做自己喜欢做的事并愿意承受一切可能的后果;只要我们的行为不伤及他人就不受人们干涉,即使在他人看来我们所行是愚蠢的、乖张的或错误

个人自由可以推出在同样限制内的个人联合的自由:人们可以在不伤害他人的任何目的下自由联合,但参加联合的人必须是成年人,并且不受强迫和欺骗。

唯一名副其实的自由,是以我们自己的方式追求我们自身之善的自由,只要我们没有企图剥夺别人的这种自由,也不去阻止他们追求自由的努力。

自由,自由,自由,只有看到了真正的自由才会对其产生向往,才会努力.

可以这样说,如果一个立法或行政机关,不与民众利益相一致,而欲将意见指示给民众,并且规定哪些见解或言论才是允许人们听到的,其势不可行,肯定是无需争辩而后已了。

其势不可行,不可行,不做过多的评价了

以符合公众意见来使用强迫,跟违反公众意见来使用它同样是有害的,甚或是更有害的。

公众有时候也不知道自己真的需要什么,而统治者要是只看这些东西做决策,最后只能失败告终,更何况所谓的公众意见的采纳是真的采纳还是因为臭味相投也是很难说的.

但是禁止一种意见的表达,其独有的罪恶之处在于,它是对包括当代人与后代人在内的全人类的剥夺;并且这种剥夺对那些不同意这种意见的人,比对持有这种意见的人甚至更大。

对我们所持的意见,给予反驳与质难的完全自由,是我们有理由为了行动的目的而认定它正确的先决条件

我们要想确保某一信条至为正确无误,除了长期延请整个世界来求证其诬枉之外,别无任何保证可以依赖。

科学是只可证伪的,那么所谓的真理也是,只有不同的声音越多,才能使得真理得到打磨和锤炼而变得更加坚固.

在这样一种状态下,人们所能看到的,不是些庸见的附会者,就是些真理的趋时者,他们对所有问题的论证都是为了取悦听众,而不是自己深所信服的东西。

那些不愿趋时附会的人,则通过窄化他们的思想和兴趣,以便能在原则范围之内不致犯险地说出,也就是说将话题缩小到琐碎的实践问题上

为了让普通人能够获致他们所能达到的精神高度,思想自由同样甚至更为必不可少。

当一个社会没有获得过自由的时候,讲求所谓的真正的自由,便会使得自由也沦为一个工具,取悦听众,不深信服可以说是虾仁猪心了.而社会的大环境也会导致自由这个生态圈的多样性的变化.

一旦自权威方面得到某种信条,就想当然地认为,允许对其提出质疑只会有害无益。只要他们得势,就几乎不可能允许对公认意见提出明智而审思式的反驳,从而使它受到的反对只可能是鲁莽而无知式的

对于某一事物,若有人仅了解自己一方,则他对此事物可说是知之甚少。其虽持之有故、言之成理,甚至好像坚不可摧,但是如果对他来说,相反一方的理由也同样牢不可破,甚至他连对方的理由是什么都不知道,那他身处两种意见之间,必然找不到一个如何选择的根据。

如果要求答复的东西已被禁止,又何从答起呢?又如果反对意见根本没有机会表明已做之答复不能令其满意之处,又何以知道它是令人满意的呢?

但是,事实却是,自由讨论的缺失,不仅使意见的依据被人遗忘,就连意见本身的意思也常常被人抛诸脑后了。

清晰的概念和鲜活的信仰不见了,剩下的仅仅是几句死记硬背下来的陈言腐语;或者其意幸而有所保存,也仅剩皮毛而已,其精华则早已亡失尽去。

信仰仿佛总是在心灵之外,结成硬壳并使心灵僵化,以抵挡一切诉诸人性中更高尚部分的其他影响;它不能容忍任何新鲜而生动的信念进入,以此来展现它的力量,但它自身除把门放哨致令心灵空虚之外,对人的意识或心灵可说是毫无用处。

当前的风气是贬低否定性的逻辑,因它仅指出理论中的弱点和方法上的错误,而不确立肯定性的真理。

除非意见者或出于被人逼迫,或出于自己主动,而业已经历了与敌手激烈争辩所必然要求于他的精神过程,否则任何人的意见都当不起真知实见的称号。

当没有调查就没有发言权也变成了一句套话之后,当所谓的真理已经许久没有经历锤炼之后,当其变成陈言腐语之后,它甚至连找对手的资格都没有了,因为它早已忘记了战斗为何物,变成了当年屠龙的勇士屠杀的那条巨龙了.

在人类心灵未臻完善的状态下,真理的利益需要意见的纷歧。

片面真理之间的激烈冲突并不可怕,可怕的是以半截真理相镇压以致万马齐喑;只要人们还被迫兼听各方,情况就总有希望;而一旦人们只偏重一方,错误就会固化成偏见,而真理自身也由于被夸大变成谬误而不复具有真理的效用。

一、即便某一意见被压制而至于沉默,但其实我们未必真的不知道,那个意见有可能是正确的。拒绝承认此点就是认定我们自己一贯无错。

二、即使被压制的意见是错误的,它也可能包含并且通常确实包含部分真理;而由于在任何主题上,普遍或通行的意见难得是或从来不曾是全部真理,只有通过与反面意见的碰撞,余下的部分真理才有机会得以补足。

三、纵然公认意见不仅正确而且是全部真理,除非它允许并确实经受了极其有力而又最为认真的挑战,否则大多数接受它的人抱持的仅仅是一项成见,对其所以然的理性根据毫无理解或体认。

四、信条本身的意义也将变得岌岌可危,其可能由隐晦而至于消失,对人的身心言行将不复有积极影响的能力:最终,由于信仰仅仅剩下形式,非但无益于为人增福,而且还因破坏了根基,从而妨碍了任何真实而又诚挚的信念自人类理性或个人体验中生长出来。

我们需要对真理和信条的考验和挑战,而现在它似乎早已固化到寸步难行的地步了.万马齐喑究可哀.就像自然界一样,环境越恶劣,生物的多样性就越差,而环境也会因为缺少多样性而陷入恶性循环.

如果一个人将自身生活计划的选择,全部委诸世人或自己的生活圈子,则无需赋予他任何其他能力,只要有猿猴一般的模仿力就足够了。

我们离猿猴,又还差几分呢?

心灵本身也向束缚低头:乃至寻乐自娱,首先想到的也是要从俗合流;他们乐于混迹于人群之中;即便有所选择,也是在诸多众人惯行之事之间选择而已;独特的品味,反常的行为,在他们恰如犯罪一样避之唯恐不及。开始只是搁置自己的本性而不用,最终至于根本没有了可以遵循的本性,因为他们身上为人类所独具的性能已经枯萎乃至衰竭了:他们已无能力再生出强烈的愿望与固有的快乐,而且一般也丧失了根于自身或可以归之于他们自身的意见与情感。

要想让人类成为值得瞩望的尊贵美好之物,不能消磨一切个人所独具的殊才异禀使之泯然于众,而只能在无损于他人的权利和利益的范围内使之得到培育与发扬

只要个性在其之下还能得以存在,即便是专制也还没有产生它最坏的恶果;而凡是摧毁人之个性的,却都可以称之为暴政,无论它以什么名目出现,也无论它宣称执行的是上帝的意志还是人民的命令。

一个民族可能会在一个相当时期的进步之后,陷入停滞:然则停滞始于何时?必是在其不再拥有独立之个性的时候。

个性,心灵,自由只有在这时才显得异常的珍贵.

如果要等到人类生活几乎被简化成一个统一的模式才去反抗,那么一切背离模式的做法都会被视作离经叛道,甚至被视为怪诞荒谬、有违人性。一旦人类日久不见歧异,则很快就会变得连想都想不到还有歧异这回事存在。

这才是最可怕的事

为保卫社会及其成员免遭外侵及内乱,人人都须(在某种公平的原则下)共同分担此项必须的力役与牺牲。

只要个人行为的任何部分有损他人利益,社会对此就有了裁夺的正当权力,而这种干涉是否能够提高社会的总体福利也要成为公开讨论的话题。

唯有在那些人们相互关涉的行为上,才有必要让一般规则在大多数情况下都得到遵守,以使人们知道他们必须面对的后果是什么;但在每个人只关系自身的行为上,他的个体自主性就有权得到自由运用。

虽然任何人的个性都不应该被压抑,但我们还是有权通过各种方式表达我们对他们的反感,这是我们自己个性的表现。

界限很难划定,而且社会也不可避免的会侵犯一些自由,这时候我们需要的是公平和不同意见的表达,而不是压抑和强制.

众所周知,在很多工业部门中,工人都是巧者少而拙者多,拙劣工人凭其多数权坚决主张,他们应当获得跟熟练工人一样多的工资,并且还不允许通过计件法或是其他什么方式,让任何人以其所有而他人所无的熟练技巧或勤劳挣得更多的工资。他们还使用道德惩罚,有时竟直接变为人身惩罚,来阻止熟练雇工与工厂雇主采取多劳多得的薪酬原则。

邪恶的资本主义思想

第一,只要个人行为仅关一己利害而与他人无干,个人就无需对社会负责。如果有人觉得有必要维护自身利益,不妨对其进行忠告、规诫、劝导乃至回避,社会能够正当地对其行为表达厌恶与责难的措施,仅此而已。第二,对于其任何有损他人利益的行为,个人都应对社会负责,并且如果社会觉得为了自身安全必须施予某种惩处,则行事者还应受到社会舆论或法律的惩罚。

对自由的划定的一个严格的表达,在现在看来仍然是很好的观点.

自由原则不允许一个人有不要自由的自由,而允许一个人让渡自己的自由,也不是真正的自由。

放弃自由并不是一种自由,当这个时候,社会就可以进行干涉了.(ex:自杀并不是一种自由,而是违背自由的做法)

试看那些没有地方自治的充分基础而勉行政治自由的国家,其政治自由也总是昙花一现转瞬即逝,就可以证明此言不虚。

此言不虚

不必要地增加政府权力乃是一种极大的祸患,这是限制政府干涉的最有力的一个理由。对政府已经执掌之职能的每一项追加,都会将其影响人们希望和恐惧的作用散布得更广,还会将公众中本来的活跃进取之士,越来越多地转变为政府的逢迎者,或者转变为志在执政的某些政党的逢迎者。

而社会中的其余人等无论追求什么,都唯有仰承他们的意旨:普通民众在一切要做的事情上都望其指导和命令;而有能力有抱负者则赖其谋求个人的升进。于是,谋求进入这个官僚阶层,并且一经进入便谋求步步高升,就成为人们进取的唯一目标。

在这种体制之下,不仅无缘进入其内的外部公众,由于缺乏实际的体验,无资格批评或制止这一官僚机构的运作模式,而且,纵然由专制政体的意外事故或民主政体的自然运作,偶尔将一个或几个有着改革意愿的统治者推上权力顶峰,也休想能让任何有悖于官僚集团利益的改革得以实施。

在那些有着更为先进的文明且有着更多反叛精神的国家里,民众既已习惯于指望国家为他们做好每一件事,或至少如不问明国家允许他们自行做哪些事以及应该如何去做,就不动手为自己做任何事情,那他们自然就会把一切临到自己头上的灾祸都视为国家的责任,并且一旦灾祸超过他们的忍耐限度,他们就会起来反抗政府,掀起所谓的革命

然而,在各种事务都要由官府包揽的地方,任何为官府所决意反对的事情都根本不可能做成。此类国家的体制,不过就是将通国的能人才士,都组织进一个纪律森严的团体,以此来统御其余人众;其组织本身愈是完善,其从社会各界吸纳和规训最优秀人才的做法愈是成功,其对包括官府成员在内的所有人众的束缚就愈是彻底。因为统治者自己也成为其自身组织和纪律的奴隶,就像被统治者是统治者的奴隶一样。一位中国高官,跟最卑微的农夫一样,同为专制统治的工具和奴才。

万历十五年到现在,似乎仍旧逃不出这个规律啊

在不违效率的前提下,尽最大限度地让权力分散;同时由一个集散中枢尽最大可能地让信息得到收集和传播。例如在地方行政系统中,就应该像新英格兰各州(新英格兰包括缅因、新罕布什尔、佛蒙特、马萨诸塞、康涅狄格、罗得岛六个州。——译者注)那样,在种种不宜由直接相关者自己处理的事务上,分门别类地设立地方机构,并分别充以由地方选任的官员;除此之外,还应该在每一类地方事务部门之上,设立一名总督,作为全州政府的一个机构。

美国的民主形式确实现在来看是很成功的,有很多值得借鉴的地方.

一切自由民族都应如是;而能够如是的民族也必是无往而不自由的;这样的人民,永远不会因任何人或任何团体能够控驭其中央政府,就甘心让自己受他们的奴役。也没有任何一个官僚机构能够指望,可以让这样的人民去做或遭受任何他们所不愿意的事。

总结

从长远来看,国家的价值,归根结底还是组成这个国家的个人的价值;一个国家为了在各项具体事务中使管理更加得心应手,或为了从这种具体实践中获取更多类似技能,而把国民智力拓展和精神提升的利益放在一旁;一个国家为了要使它的人民成为它手中更为驯服的工具,哪怕是为了有益的目的,而使人民渺小,终将会发现,弱小的国民毕竟不能成就任何伟业;它为了达到机器的完善而不惜牺牲一切,到头来却将一无所获,因为它缺少活力,那活力已然为了机器更加顺利地运转而宁可扼杀掉了。

就以最后一段摘录来作为总结吧.虽然穆勒的思想从现在来看已经有不合理的地方出现了(功利主义),但是在对国家和个人和社会的自由的边界的考量,以及为什么我们需要不同的意见和声音的阐述上,确实是跨越时代和地域的,多元化不止需要在民族,文化,生态上,也需要在政治上,只有锤炼,才能保持这把真理之剑的锋利,才能指导前进的方向.

而也只有看到了自由,才能正视现实,才能走在追寻真正的自由的路上而不会变得迷惘.以后还是会看一些哲学的书(最近在看《禅与摩托车维修艺术》),强化自己的思想工具和方法论.

蛰居许久之后也动了一次,在周末赶着高铁往返了一次家与杭州,也是趁着这个世界把西部世界的第二季给刷完了.当时西部世界被吹爆的时候没有去看,第一季也是在放假之前才看完的,可能是看过黑镜和银翼杀手的缘故在看第一季时反而没有那么多震撼.其中很多的主题也早已被讨论过了,论深度我觉得也是黑镜更胜一筹,唯一能够使我印象深刻的也就是这双轴的时间线在最后一集带来的惊喜吧.在那一刻还是发出了感叹,不过也仅此而已.似乎西部世界中没有更多新奇的观点来探讨,围绕的还是永恒的问题,机器人和人类.第二季更是讨论了自由意志,反而让我想到了之前看三分钟速成课哲学篇的时候,哲学家们对于自由和上帝的思考,不只是在机器人,在人身上也是一样:你认为的自由难道不是上帝给你安排好的吗?像这样的问题我会觉得很流氓,当然也有很多的哲学理论可以用来解释或者驳斥,而在这样的似乎涉及到本源的问题每个人也都看法不一,这也从一个角度说明哲学是源自生活用于生活的,当然有人相信决定论也有人不相信.回到第二季,在探讨所谓的机器人的自由意志的时候我只觉得节奏太慢了,而且搞得神乎其神,总是来一段一段的拗口的问题和反问,我不觉得这样能够使得一个问题变得更加深入,反而像黑镜一样,从一个点出发,体现出这个问题最尖锐的矛盾点,反而可以在很短的时间内让一个问题映入脑海而且得到很好的展示.可能是知识不够亦或是看的不够仔细,对西部世界第二季的感觉并不是很好,这种打乱时间轴的形式玩一次会感觉很不错,第二次就感觉是在故意打乱时间线想搞得你看不懂一样,慢节奏之下看的不是很爽,看完也没有能够发人深思的点,可能就是第二季的观剧感受了.

有一点还是很令我在意的,就是在于你作为一个”人”进入西部世界的时候,就像现在你进入一个游戏,你知道这是虚拟的,所以点下鼠标杀死一个NPC没有任何的负罪感,甚至有的话反而会被人觉得有病,因为我们都知道这是从屏幕映入你眼球的像素,但是在真的有足够的逼真度的时候,扣下扳机还会是这么简单的事情吗,当然现在也有很多人说游戏增加了青少年的暴力倾向,虽然我不这样认为,但是如果某一天真的分不清虚拟和现实的时候呢,每个人来到西部世界都是来发泄自己的欲望的,就是来玩游戏的,可能是我的双重标准,但是在一个如此真实的世界里进行如此真实的杀戮,还能算是游戏吗.但是现在在你自己游戏和听到别人说杀了他的时候,你会觉得这是杀戮吗?黑镜中也有这么一集,军队的战士被带上设备去猎杀怪物,其实这些怪物都是手无寸铁的平民,只是被虚拟现实设备转换成了怪物,当你拿起武器,射杀怪物的时候,和射杀平民的时候当然是不一样的.当然军队会觉得这样使得士兵没有杀人的负罪感,人人都觉得自己在杀死的是异形是怪物.但是当这一天真的来临,当人无法分清现实和虚拟,人和怪物的时候,我们的世界观和道德观又会被重组成什么样呢.

当跨越了人和机器人的界限之后,是像攻壳机动队中那样,所有人都会变成电子脑,高性能的义肢,还是像银翼杀手中,创造更强的仿生人只为人类无穷的欲望.攻壳机动队中的我印象深刻的一点是:少校的手表,这是唯一在无数次的更换大脑和躯体之后,真实的东西,让自己觉得自己还是作为一个人真实存在而不是机器人的东西.这可以被认为是基石吗,或是像盗梦空间中一样每个人的一个标志,让你判断自己是否活着梦中的标志?西部世界也在讨论真实,西部世界是虚拟的我们要去真实的世界,也有人去了伊甸园,当你不知道的时候,现在就是真实,也有人在逃避真实,而谁又能说真实的世界不是庄周梦蝶呢(我觉得这是很流氓的辩驳方式,但是物质和精神的辩论一直都存在).在西部世界中拥有比人类更强的无限进化能力的机器人们,在攻壳机动队中全身义体化的人类们和机器人们,人类为了种种目的在变成机器人,机器人却总是会变得更有人性,我们似乎喜欢为了机器人的人性而喝彩,为人类的残忍而唾弃,我们缺少的到底是什么,我们不缺乏人性却喜欢从别的物种身上寻觅人性,在这条界限越来越近的时候,讨论也必然会变多,虽然与我们应该无缘.但这些讨论和思考可能也就是西部世界,黑镜,银翼杀手,攻壳机动队这类创造吸引人的地方吧.

有时间还是想看看哲学内容的书,可能再遇到这种本质性的问题的时候能有更好的思考吧.但是我觉得看剧还是要以爽为主,思维思考和博弈也是其中的一种,西部世界第二季我觉得不够好.

That’s all.

最近因为需要,自己尝试了一波日志收集系统的搭建,这一部分只是做离线分析使用的HBase的数据,Kafka的实时数据消费还没有尝试部署,主要流程是从Nginx服务器接收请求的方式打印日志,由Flume收集之后进入HBase,Hive提供一个SQL的接口功能.

数据格式方面url请求接收GET请求,数据为data=xxxxxx(前端JSON做的URL编码),字段视业务而定.

日志收集框架搭建流程

nginx+Lua收集上传日志并生成日志文件

Lua环境安装

  1. Lua官网下载Lua安装包,当前版本为LuaJIT-2.0.5.
  2. 解压安装包,cd进入目录
  3. make
  4. sudo make install
  5. 验证luajit安装:
    1
    luajit -vLuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/

OpenResty环境搭建

nginx采用OpenResty框架,可以在nginx嵌入使用Lua脚本

  1. 官网下载安装OpenResty,当前版本为openresty-1.13.6.1

  2. 安装依赖包(Ubuntu环境):

    1
    2
    apt-get install libreadline-dev libncurses5-dev libpcre3-dev \    
    libssl-dev perl make build-essential
  3. 解压安装包进入目录

  4. 进行编译配置:

    1
    2
    3
    4
    5
    6
    # 如下命令,OpenResty 将配置安装在 /opt/openresty 目录下(注意使用 root 用户),并激活luajit、http_iconv_module 并禁止 http_redis2_module 组件
    ./configure --prefix=/opt/openresty\
    --with-luajit\
    --without-http_redis2_module \
    #Guide给出的配置,具体配置按照需求来定
    --with-http_iconv_module
  5. 这一步出错基本都是依赖库的问题,查看控制台的报错信息并安装对应的依赖包.一般依赖库为:

    1. PCRE库:sudo apt-get install libpcre3 libpcre3-dev
    2. zlib库:sudo apt-get install zlib1g-dev
    3. openssl库(选配):sudo apt-get install openssl libssl-dev
  6. 正确执行configure之后会提示依赖pcre,zlib,openssl成功并且无报错信息

  7. 执行make&sudo make install

  8. 将nginx添加到PATH变量,在/etc/profile文件末添加export PATH=$PATH:/opt/openresty/nginx/sbin(视上面的安装路径而定),然后source /etc/profile更新环境变量,在终端里就可以使用nginx了.(可以使用ps -e |grep "nginx"看到进程,kill可能会用到)

配置OpenResty接受日志信息

  1. 首先要创建一个OpenResty项目文件夹,nginx启动的时候启动的就是该项目.
    1
    2
    # 这里文件夹按照Guide使用了test,实际按项目而定
    mkdir ~/openresty-test ~/openresty-test/logs/ ~/openresty-test/conf/
  2. 在~/openresty-test/conf/下创建一个nginx.conf文件,日志采集和写入日志文件的操作都在这里面完成,现在直接将Lua代码写入了配置文件中,为了更好的维护和可读性可以提取Lua脚本出来单独维护.配置文件中主要Lua代码:
    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
    # 前面还有配置信息,这里只是http配置
    http {
    server {
    #监听端口,若你的6699端口已经被占用,则需要修改
    listen 6699;
    # 采集url为/get
    location /get{
    content_by_lua_block{
    local msg = ""
    local arg = ngx.req.get_uri_args()
    for k,v in pairs(arg) do
    local cjson = require "cjson"
    -- 解析好的url参数序列化成JSON并拼接需要打成日志信息的格式
    -- 使用\0x01做分隔符(本来用\0x02做每串分割后来直接\n了))
    local json = cjson.decode(v) -- 用cjson直接decode
    msg = json.pid..string.char('0x01')..json.oid..string.char('0x01')
    ..json.eid..string.char('0x01')..json.epid.."\0x01"
    ..json.rand..string.char('0x01')..json.tid..string.char('0x01')
    -- 测试用打印信息
    ngx.say("pid:"..json.pid.." oid:"..json.oid.." eid:"..json.eid..
    " epid:"..json.epid.." rand:"..json.rand.." tid:"..json.tid)
    if (json.r5 ~= nil) then
    for key, value in pairs(json.r5) do
    msg = msg..key..":"..value..","
    -- 测试用打印信息
    ngx.say("key:"..key.." value:"..value)
    end
    end
    msg = msg.."\0x02\n"
    end
    -- 替换掉r5串里最后一个, 否则在HBase表中会多一个null的字段(也可以在Flume中的正则处理)
    msg = string.gsub(msg, ",\0x02", '')
    -- 测试用打印信息
    ngx.say(msg)
    -- 写入文件操作
    local file = io.open("/home/tang/openresty-test/lualog.txt","a+")
    file:write(msg)
    file:flush()
    file:close()
    }
    }
    }
    }
  3. 启动Nginx,命令为:nginx -p ~/openresty-test,向端口发送请求就会在项目文件夹下生成一个_lualog.txt_文件并已经记录了请求的信息.

Flume进行日志采集

安装Flume

  1. Java安装,略过.安装版本为1.8.

  2. 官网下载Flume,当前版本为apache-flume-1.8.0.

  3. 解压安装包

  4. 配置flume-ng环境变量,在/etc/profile中添加

    1
    2
    3
    export JAVA_HOME=/usr/local/jdk  # 自己的JDK目录,版本为1.8
    export FLUME_HOME=/opt/apache-flume-1.8.0-bin
    export FLUME_CLASSPATH=$FLUME_HOME/lib/*
  5. 配置flume-env.sh,暂时没有配置该sh文件,网上教程似乎也只是配置java路径

  6. 启动flume测试:

    1
    2
    3
    4
    5
    6
    # flume-ng version
    Flume 1.8.0
    Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
    Revision: 99f591994468633fc6f8701c5fc53e0214b6da4f
    Compiled by denes on Fri Sep 15 14:58:00 CEST 2017
    From source with checksum fbb44c8c8fb63a49be0a59e27316833d
  7. 重要在conf文件夹中配置Flume启动参数,source,sink,channels在这里配置,现在使用的hbase-flume.conf文件信息:

    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
    # 从文件读取实时消息,不做处理直接存储到Hbase
    agent.sources = logfile-source
    agent.channels = file-channel
    agent.sinks = hbase-sink

    # logfile-source配置
    agent.sources.logfile-source.type = exec
    # source源为Lua脚本中生成的日志文件lualog.txt
    agent.sources.logfile-source.command = tail -f /home/tang/openresty-test/lualog.txt
    agent.sources.logfile-source.checkperiodic = 10

    # defined channel,可以配置文件形式和内存形式,内存形式效率高但是出错会导致数据丢失,文件形式效率慢但是数据不会丢失
    agent.channels.file-channel.type = memory
    #设置channel的容量
    agent.channels.file-channel.capacity = 1000
    #设置sink每次从channel中拉取的event的数量
    agent.channels.file-channel.transactionCapacity = 100

    # sink 配置为 Hbase
    agent.sinks.hbase-sink.type = logger
    agent.sinks.hbase-sink.type = hbase
    # Habse表名和列族名
    agent.sinks.hbase-sink.table = table_log
    agent.sinks.hbase-sink.columnFamily = cf_info
    agent.sinks.hbase-sink.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer
    # 对nginx日志做分割,然后按列存储HBase,日志格式为...\0x01...\0x01... \0x01从日志文件复制一个过来 vscode好像不显示\0x02
    agent.sinks.hbase-sink.serializer.regex = (.*?)\0x01(.*?)\0x01(.*?)\0x01(.*?)\0x01(.*?)\0x01(.*?)\0x01(.*?)
    # 列族中每一个列的名称,注意:row key为自动生成
    agent.sinks.hbase-sink.serializer.colNames = pid,oid,eid,epid,rand,tid,r5

    # # 组合source、sink和channel
    agent.sources.logfile-source.channels = file-channel
    agent.sinks.hbase-sink.channel = file-channel
  8. 启动flume,cd到flume目录下:(还没有配置HBase时会报错,需要先在HBase中建表才行)

    1
    2
    3
    # flume-ng agent --name agent --conf ./conf/ --conf-file ./conf/hbase-flume.conf -Dflume.root.logger=DEBUG,console

    --name为配置文件中agent名 --conf为flume/conf文件夹 --conf-file为前面写的配置文件,现在以DEBUG模式向控制台打印调试信息

Hbase持久化日志信息,Hive提供数据库查询功能

安装HBase(当前都为单机环境)

安装Hadoop

安装HBase需要安装Hadoop,使用的是大数据学习系列的Hadoop和Hbase的搭建流程,博客中的流程可以走通,需要注意的是若在/root目录下创建Hadoop的一系列文件夹需要在root权限下执行全部操作,否则会导致没有权限报各种错误.或是将/root/hadoop文件夹分给当前用户组(现在采用这种方式).

现在采用的Hadoop版本为:hadoop-2.9.1,HBase版本为:hbase-1.2.6.1.

注意:Hadoop和HBase和Hive版本一定要匹配,不兼容会导致很多错误.

主要环境变量配置如下:(Hadoop安装路径在 ~ 下)
core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>        
<!-- 现在只是在单机情况下配置了Hadoop和HBase 集群配置文件需要修改 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 这是为了hive服务启动之后可以远程连接hive数据库的配置,
hadoop.proxyuser.{user.name}.hosts user.name为登陆服务器的用户名,现在没有任何安全配置 -->
<property>
<name>hadoop.proxyuser.tang.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.tang.groups</name>
<value>*</value>
</property>
</configuration>

hdfs-site.xml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>    
<!-- 在root文件夹下配置了Hadoop且不是root用户的话,一定要注意权限问题!! -->
<property>
<name>dfs.name.dir</name>
<value>/root/hadoop/dfs/name</value>
<description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/dfs/data</value>
<description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>need not permissions</description>
</property>
</configuration>

/etc/profile中配置

1
2
3
4
5
export HADOOP_HOME=/home/tang/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME

启动Hadoop

运行~/hadoop/sbin下的start-all.sh.启动之后使用jps可以看到下面的进程(保证NameNode和DataNode启动完成,没有进程的话需要查看log文件夹下的报错信息并解决错误):

1
2
3
4
5
6
# jsp
2243 NodeManager
1974 SecondaryNameNode
2278 Jps1642 NameNode
2123 ResourceManager
1790 DataNode

安装HBase

依旧使用大数据学习系列之二 ——- HBase环境搭建(单机)文章中的搭建过程.

hbase-site.xml配置信息:

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
<configuration>    
<!-- 存储目录 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
<description>The directory shared byregion servers.</description>
</property>
<!-- hbase的端口 -->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description>Property from ZooKeeper'sconfig zoo.cfg. The port at which the clients will connect. </description>
</property>
<!-- 超时时间 -->
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<!-- zookeeper 集群配置。如果是集群,则添加其它的主机地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/root/hbase/tmp</value>
</property>
<!-- false是单机模式,true是分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
</configuration>

启动HBase

运行hbase/bin下的start-hbase.sh,正确运行之后使用jps命令可以看到HMaster,且需要保证DataNode和NameNode没有死掉:

1
2
3
4
5
6
7
8
9
2243 NodeManager
4613 Jps
1974 SecondaryNameNode
2697 HMaster # 主要是HMaster
1642 NameNode
2123 ResourceManager
3515 Application
1790 DataNode
3071 RunJar

HBase建表

在hbase/bin目录下运行:./hbase shell进入shell终端

create 'table_log','cf_info'

就可以建表,指定表名和列族名.这时候运行flume-ng就可以将日志信息打入HBase了.
使用scan 'table_log'可以扫描HBase表看到数据.

安装Hive

参考大数据学习系列之四 ——- Hadoop+Hive环境搭建图文详解(单机)

安装Mysql后主要是权限的坑,授予远程连接权限之后要是不能访问,需要修改/etc/mysql/mysql.conf.d/mysqld.cnf将bind-address修改为0.0.0.0

Hive版本为:apache-hive-2.1.0.

hive-site.xml主要配置信息:

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
<configuration>
<!-- 注意注意:: 一定要把配置信息写在最下面!!!或者自己删掉xml下面重复的配置信息字段,否则覆盖之后配置信息不生效!!! 巨坑 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/root/hive/warehouse</value> </property>
<property>
<name>hive.exec.scratchdir</name>
<value>/root/hive</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value></value>
</property>
<property>
<!-- mysql的链接路径和驱动信息 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!-- mysql的用户名密码 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description> </description>
</property>
</configuration>

启动Hive和hivesrever2

运行hive/bin目录下的hiveserver2服务之后就可以远程连接hive数据库.网页端口为:10002

现在使用的远程连接工具为:SQuirrel SQL,安装教程Squirrel SQL Client连接hive安装部署,现在默认连接没有安全控制,可以直接访问Hive数据库.

主要是需要1.8的Java版本,10版本在程序启动是会有版本不匹配的坑,而新版的软件十分不稳定,安装1.8版本Java就没有问题.

Hive建表关联HBase

Hive优势在于Map等复杂的数据结构,在Hive配置成功之后可以直接建表关联HBase,SQL语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## r5为Map复杂数据类型,主键为Flume插入日志信息时自动生成
## SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf_info:pid,cf_info:oid,cf_info:eid,cf_info:epid,cf_info:rand,cf_info:tid,cf_info:r5")中需要保证Hive中的字段和HBase表中对应,现在HBase中只有一个列族cf_info.
## TBLPROPERTIES ("hbase.table.name" = "table_log"); 配置HBase中对应的表名.
create table loginfo(
key string,
pid string,
oid string,
eid string,
epid string,
rand string,
tid string,
r5 map<string,string> )
row format delimited fields terminated by "\t"
collection items terminated by ","
map keys terminated by ":"
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf_info:pid,cf_info:oid,cf_info:eid,cf_info:epid,cf_info:rand,cf_info:tid,cf_info:r5")
TBLPROPERTIES ("hbase.table.name" = "table_log");

完成

之后请求Nginx端口发送信息就可以在Hive中直接select到了.

总结(踩坑)

坑主要是出在各个框架之间的版本选择上,在安装之前一定一定一定要选好你的Hadoop+HBase+Hive版本保证互相兼容,剩下的就十分的简单了.还有在xml配置上要写在默认配置下面来覆盖原有的默认配置,Hive写了一堆默认配置而且是非注释状态,在连接Mysql的时候卡了好久.

不得不说Flume还是一个我十分喜欢的东西,非常的强大而且拓展性十分强悍,也看到了美团在其之上的改进的文章获益匪浅:基于Flume的美团日志收集系统(一)架构和设计基于Flume的美团日志收集系统(二)改进和优化.这次只是搭建和初步的尝试,后续的细节和改进会继续跟进.

0%