根据时间排序,分为面试前、面试时、面试后。
面试前
找到你去的公司(明确你的目标)
准备简历
书写简历
投递简历方式
内推
Boss 直聘
公司招聘官网
准备自我介绍(背熟,根据工作时间渐进式介绍你自己,一定要时刻保持自信的口吻讲述)
复习将要面试的点
了解公司背景业务
了解该岗位(后面面试时会问,需要你反问面试官)
面试时
按重要程度,出现频率排序。
推荐这个频道,看他最受欢迎几个面试的视频。
Boss 面需要引导他谈论的内容,以及你表述内容的主题应该必须包括四大块内容。
还有一个简历的问题,关于书写简历,可以参考[这个](https://github.com/young1lin/notes/blob/master/Prepare for Interview/Java_工程师_张三_zh.md)。
可以去以下途径了解公司,了解方向,包括公司主营业务、你要做的业务的方向内容、公司信用信息。
令人心动的 Offer
对我而言,有意义的工作是指一项我能全身心投入的使命;有意义的人际关系是指我既深深地关心对方,对方也深深地关心我。
我发现,我能够成功的唯一途径将是:
1.找到与我观点不同的最聪明的人,以便自己能够努力理解他们的推理。
2.知道自己在什么时候不能有明确的意见,不急于下结论。
3.逐步归纳永恒和普适的原则,对其进行测试,将其系统化。
4.通过平衡风险来保持较大的回报,并降低下行波动。
我逐渐认识到,股价反映了人们的预期,所以当实际结果比预期好时,股价上涨;当实际结果比预期差时,股价下跌。而大多数人会因为近期的经验而产生偏见。
通过市场交易赚钱是很困难的。对此,才华横溢的交易者和投资家伯纳德·巴鲁克形象地说道:“如果你已经做好准备放弃一切其他东西,像医科学生研究解剖一样仔细地研究市场的整个历史和背景,并研究所有主要上市公司——如果你能做到上述的一切,同时你还拥有赌博者的镇定、洞察者的第六感和狮子的勇气,你才有可能抓住一丝机会。”
我了解到,如果你以勤奋和有创造性的方式工作,你几乎可以得到你想要的任何东西,但你不可能同时得到所有东西。成熟意味着你可以放弃一些好的选择,从而追求更好的选择。
就我们一致同意的相处规范而言,最重要的一条是,我们需要做三件事:
1.把我们的真实想法摆在桌面上;
2.存在经过深思熟虑的分歧,但人们愿意在相互了解的过程中更改观点;
3.如果分歧依然存在,拥有一种大家一致同意的决策方式(如投票或者拥有清晰的权威),以便我们能够不带怨气地把分歧留在身后。
管理的资金太多有可能损害业绩,原因是太大的规模会影响市场走向,导致建仓和平仓的成本很高。在2010年实现超过40%的收益率后,我们不得不考虑向客户退回很多资金,尽管他们其实希望将更多的钱交由我们管理。我们一直谨慎地让自己不要变得过大,以免竭泽而渔。
在我看来,人生由三个阶段组成:在第一个阶段,我们依赖其他人,我们学习;在第二个阶段,其他人依赖我们,我们工作;在第三个阶段,当其他人不再依赖我们、我们也不必再工作时,我们就可以自由地体验生活了。
王岐山:有能力的人居安思危。安然无忧的是愚人。假如冲突能在变得尖锐之前被解决的话,世界上就不会有英雄了。
做到头脑极度开放、极度透明
人在尝试理解任何东西(经济、市场、天气等)时,都可以从两种视角出发:
1.自上而下:努力找到这些东西背后的唯一驱动法则或规律。例如,在理解市场时,人可以研究影响所有经济和市场的普适法则,如供求关系;在理解物种时,人可以集中了解基因密码是如何对所有物种发生作用的。金字塔原理,结构化思维。
2.自下而上:研究每种具体情况及其背后的法则或规律,例如,小麦市场独特的法则或规律,或者使鸭子区别于其他物种的基因序列。
痛苦+反思=进步
如果你能养成一种习惯,面对精神痛苦时能够自动地反思痛苦而不是躲避痛苦,你将能够快速地学习和进化
生活中的大多数东西都不过是“同类情况的重演”。
但大多数人缺乏勇气克服自身弱点,也缺乏勇气做出这一改变所要求的不容易做出的抉择。归根到底,这可以总结为以下5项抉择:1.不要混淆你的愿望和事实。
2.不要为自身形象担心,只需关心能不能实现你的目标。
3.不要过于重视直接结果而忽视后续、再后续的结果。
4.不要让痛苦妨碍进步。
5.不要把不好的结果归咎于任何人,从自己身上找原因。
在我看来,个人进化过程(即我在上一条描述的循环)通过5个不同的步骤发生。如果你能把那5件事都做好,你几乎肯定可以成功。这五步大概是:
1.有明确的目标。
2.找到阻碍你实现这些目标的问题,并且不容忍问题。
3.准确诊断问题,找到问题的根源。
4.规划可以解决问题的方案。
5.做一切必要的事来践行这些方案,实现成果。
影响合理决策的两个最大的障碍是你的自我意识和思维盲点。
如果你对自己掌握的知识和擅长的事情过于自豪,你学到的东西就会变少,决策质量就会变低,也将难以充分发挥自己的潜力。
习惯本质上是惯性,一种继续把你一直做的事情做下去(或者继续不做你一直不做的事情)的强烈倾向。研究显示,如果你能坚持某种行为约18个月,你就会形成一种几乎要永远做下去的强烈倾向。
在桥水,我们讨论过设计好的量化指标需要4个步骤:
(1)了解公司的目标是什么;
(2)了解达成目标的程序(你的机器,包括人和设计);
(3)找到程序中最适合量化的关键部分,以便了解机器如何运作以达成目标;
(4)研究如何在关键指标上发挥杠杆效用,以便调整程序、改变结果。在这方面,我们鼓励员工在使用流程图、程序手册的同时,开发适用于我们自己的指标。
常言道:“对于无法计量的事物,你肯定也管不好。
温斯顿·丘吉尔所说:“给公众以虚假的期望,而期望又很快破灭,这是最糟糕的领导方式。
坚持对话的逻辑性。
要记住,情绪化容易阻碍人们正确地看待现实。
如果有人问你一个问题,你要首先想想你自己是否合适回答这个问题。如果你觉得自己回答的可信度不强,就不应该对此发表意见,更不要与人分享你的观点。
区别于苍白的抱怨和有助于改进工作的诉求。
源自于电影概论
八大艺术的分类来源已不可考,但有两个明显的现象是:
八大艺术包含:
基本上,一部电影会经历三个阶段:制作(production)、发行(distribution)及放映(exhibition)。后面的数字化的售卖,是比较靠后的了,比如 DVD 版,放到各大视频平台售卖之类的。
大部分的电影生产过程会经过四个主要的阶段,和上面的 MOOC 的对应了起来。
这些阶段可能会相互重叠。后面会介绍,好莱坞的 “制片人中心制” 来详细介绍制片人这一角色,这里只是做个大概的介绍。总的来说,这四个阶段会产生几十种专业的分工。
核心人物
制片主要负责财务及组织上的工作。如果是独立制片,则要去发掘拍片计划,并说服制片公司或赞助者出资,也可能雇佣制片人去整合项目计划。在编剧的过程中,制片还要照顾整个拍片计划、筹募资金、安排人事等。在拍摄及剪辑期间,制片往往是编导和出资者之间的桥梁。在电影完成后,制片通常还要安排发行、宣传、营销、以及监督成本的回收。单一制片或许可以接管所有这些工作,但一般不会这么做。
剧本的完成会经历几个阶段。
有的电影,可能会有好几个编剧一起编写,或者制片直接换编剧写剧本,例如《异形:普罗米修斯》,其实换了好几个编剧。如果直拍呢货导演不满意某一个作者的剧本,可以雇其他做和加以修改。
核心人物
这个阶段,导演其实是核心人物,当然制片也很重要。
核心人物
后期制作(postproduction)
将理论批评与创作批评结合,文本批评与审美批评结合,从叙事学、作者等层面较为全面的讲授电影理论的相关内容。
分别以好莱坞电影工业和中国电影产业为核心,介绍电影 “制作” “发行” “放映” 等环节在工业、产业体系中的发展与特点。
通常称电影的拍摄为摄影(photography),电视的拍摄为摄像。
摄影即用光来描绘和表现。
魔术时刻
是指日落前后约半小时左右,此时天空变成深蓝色或者红色(蓝移和红移),但是仍然可以清楚地照映出大地上景物的轮廓,此时所能够形成的电影画面效果,就仿佛是从天空架设了灯光照射到地面上。
空间光线的明暗变化,来进行叙事空间的转换
电影常常使用不同的时间光的变化,表示时间的流逝,从而形成光的时间引导功能。
电影中的 “光” 可以分为 “高调光” 和 “低调光”。
以 “高调光” 为主进行拍摄的影片中,往往场景的亮度充足,光影反差较小。因而多用于喜剧片、音乐歌舞片等情绪比较积极的电影类型中。
例如大话西游,光线充足,人和物体都基本没有光影反差。
以 “低调光” 为主拍摄的电影中,往往场景的亮度不足,光影反差也比较大。因此多用于黑色电影、犯罪片及类似风格电影。
例如《教父》
通过光影的反差来表现人物与环境之间的冲突,人物之间的冲突或是人物自身的冲突等。
根据电影中光的方向可分为
主光是最重要的光源,它会直接影响到电影画面的色温和亮度等,因此也常常被称为造型光或是基调光。
对于同一场戏中的各个镜头而言,不论景别怎样变化,也不论实际拍摄的时间和地点有何不同,“主光” 的方位必须是统一的,而不能随意变化。
在电影拍摄时,主光一般位于主体事物的斜前方。其主要作用是呈现电影画面中事物的基本面貌。
背光又称轮廓光,在进行电影拍摄时,一般处于主体事物的后上方,背光的主要作用是区分电影画面中的主体与背景,勾画被摄对象的轮廓并突出主体,从而使电影画面的影调层次更加富于变化,增加画面的美感。
补光又称辅助光,辅助光的光源可以是柔和的散光灯,也可以是反光板,在电影拍摄时,一般处于主体事物的正前方,且靠近摄影机的位置。
主要作用是弥补主光的不足,照亮主光所不能照亮的侧面,控制画面中亮处和暗处之间的层次与反差,从而显示阴影部分的质感。即 “补光” 是帮助 “主光” 完成形象塑造的光线。
“补光” 不能强于 “主光”,也不能干扰 “主光”。
这三种光的方式,被称作三点布光法,也是好莱坞最经典的布光原则。作为一种最简单且最为常见的布光方法,三点布光可以满足基本的电影拍摄要求。同时很多复杂的电影布光方法,也都源于三点布光。
”三点布光“ 是构成电影布光的基石。
色彩在电影中最初是作为一种虚构的视觉呈现,用来展示梦幻的感受,从而彰显出电影所独有的视觉表现手法。
是指可以通过画面中的不同色彩来辨识事物。
绿色的草地是春天的象征,金色的麦田代表着丰收,人体覆盖着白布则意味着死亡。
是指通过色彩在电影画面中的面积大小及其亮度的不同,所形成的艺术效果。
“色彩的情绪功能” 与 “光对电影情绪和氛围的影响” 相仿。鲜艳明亮的色彩和 ”高调光“ 类似,多用于喜剧片、青春片、音乐歌舞片等类型的电影中。
暗淡阴沉的色彩也与 “低调光” 类似,多用于黑帮片、侦探片等类型的电影中。
红色对于人们的视觉来说,是一种刺激的颜色,它既能够激活生命力和激情,又能让人变得焦虑。同时红色也象征着权力,它既可以赋予好人权力,也可以赋予坏人权力,这取决于故事的需要。
黑客帝国中的红蓝药丸,《天能》中的红蓝门,正时间和反时间。
黄色除了是热情与火热的象征,电影中的黄色也是一种矛盾的颜色,既可以提供线索,也可以进行警示。
同时,黄色作为太阳的颜色,还能够让人们感受到强烈的生命能量。
blue 忧伤
忧伤能使人思考。
蓝色离知性最近,离感性最远。
灰蓝色是色谱中最难引发欲望的颜色,绿蓝色显得更为活泼有激情。
靓丽的蓝色可以代表广阔的天空,灰暗的蓝色则是压抑的象征。
既代表希望生存与希望,也代表死亡与危险。尤其是在战争题材电影中,绿色作为分裂色的特点得到了最充分的诠释与应用。
绿色是自然界常见的颜色,它的涵义也是丰富多元的。尤其是绿色作为矛盾色在电影场景中的恰当使用,就既可以增强画面的视觉冲击,又能够引发人们对色彩更多的思考。
在电影中,紫色作为一种虚无缥缈的颜色,紫色往往与非物质联系,预示着某人某事要发生变化或者是变异等。也就是说,电影中的紫色大多有着消失和逝去的意思。
暗示幻想的破灭。
“电影构图”,是指为了表现一定的思想情感或意境氛围,在电影的空间范围内运用审美的心理形象,符号的位置关系等,而组成具有说服力的艺术整体。
电影画面构图借鉴了许多绘画构图的表现手法,然而两者最大的差异,就是绘画构图的边框是丰富多元的,可以根据具体的画面内容和创作者的艺术理念进行不同形状的边框设计。
《我不是潘金莲》,这个在刚开始看的时候,很奇怪,电影不能全部覆盖屏幕。
采用了圆形画幅的边框设计,并以圆形和正方形交替出现的画面构图,来表现中国文化中的方圆理念。
天圆地方,铜钱也是这个概念。
电影画面包括
主体并不一定要在画面的正中间,例如《大话西游》的至尊宝。《布达佩斯大饭店》是以绝对对称的画面构成。
这里也借鉴了,黄金分割率的概念。
电影画面中的顶部、底部或是左侧、右侧等边缘,往往是观众最容易忽视的区域。如果画面中的人物处于这些区域,一般是导演想故意造成某种隐喻,旨在暗示人物的软弱无力或无足轻重。
《黄土地》画面中,都是在这些区域。
电影画面中的地平线具有烘托主体,加强视觉冲击和平衡画面的作用。
处于画面下方的地平线则可以产生一种辽阔感,形成较强的主管视觉效果。
处于电影画面上方的地平线,则能够产生一种纵深感,形成较强的宏观视觉效果。
“空白” 作为画面的重要组成部分,在具体电影画面中往往体现为“留白”。
还有大全景、大特写、中远景、中近景等
“景别” 是指由于摄影机与被摄物体之间的距离不同,从而形成被摄物体在电影画面中的大小不同。电影中的景别主要有 “全景” ”中景“ ”近景“ ”特写“ 这四种最基本的类型,以及由这四种基本类型所延伸出的多元景别。
全景
“全景” 是指人物的全身或场景的全貌都在电影画面中。其主要作用就是交代环境。
电影开场的全景镜头也可以称作 “建构镜头”。例如《阿甘正传》就是以全景镜头开始的。
特点:既能够完整呈现人物的形体动作,又能够清楚的展示人物与环境之间的关系。
中景
“中景” 是指人物的大半身,即膝盖以上都在电影画面中。通常所说的 “膝上髋下” 镜头就是中景镜头。其主要作用是不仅可以让观众看清楚画面中人物的表情,而且有利于展示人物的形体动作。
特点:能够有效增强画面的纵深感,表现出相应的环境与氛围,同时可以通过镜头的组接,平稳的叙述剧情。
近景
“近景” 是指人物的胸部以上,或者是物体的局部在电影画面中。主要作用是传达人物的内心世界,因此就成为刻画人物性格最有力的景别。
特写
“特写” 是指人物肩膀以上的头像或物体,动作的细节占据整个电影画面,环境和背景淡化。其主要作用是强调造型的渗透力,或形成某种心理暗示。
特点:能够表现人物细微的情绪变化,使观众在视觉和心理上都能够收到较强的感染。
“景深” 是指电影画面所能够表现的前后左右的距离,即一个画面内部所反映的空间大小。
“大景深” 是指电影画面纵深的清晰范围大(都是清晰的)。
“小景深” 是指电影画面纵深的清晰范围小(突出主体,虚化陪体/环境/空白)。
影响景深的因素:
摄影机镜头的光圈、焦距等。
焦距越短,景深越大;焦距越长,景深就越小。
“角度”,就是指电影镜头的拍摄角度,通常包括 “平视角度” “仰视角度” “俯视角度“ 三种。
一般体现人物强弱关系,会用仰视角度拍摄强势的人,用俯视角度拍摄弱势的人。更具体的,可以参考博然讲电影的 “让子弹飞” 的拉片。
“平视角度”,是指摄影机处于人眼等高的位置。
为了达到某种特殊的艺术效果,使用压低“平视角度”的高度,以儿童或者小动物的视角进行拍摄。
“俯视角度”,是指摄影机处于视线的上方,即形成 “往下看” 的视觉效果。
特点:使景物的层次分明,并且容易形成压迫感。
凸显弱势
“仰视角度” ,是指摄影机处于视线的下方,即形成 “抬眼看” 的视觉效果。
仰视角度常常用来表现主体的力量感。
如果是表现正面角色,则会有称赞、赞颂之意。
如果是表现反面角色,则通常会形成一种威胁感或者是压迫感。
镜头的角度决定了电影的视点,镜头的运动则是电影的视觉呈现能够丰富多样充分彰显电影艺术表现力的重要因素。
升、降、甩(基本没人用了)这几个是《电影批评》中补充的。
“推” 是指沿摄影机光轴方向向前移动的接近式拍摄,其特点是电影画面由大景别连续过渡变小。
主要作用:突出电影画面中心和细节,并强化视觉冲击。
“拉” 是指沿摄影机光轴方向向后移动的远离式拍摄;其特点是指画面的范围越来越大,被摄体也由单一变为多元。
主要作用:让观众在看清主体的基础上,扩大所呈现的空间以便使更多的信息入画,从而有利于观众了解主体与环境,局部与整体的关系。
“摇”,是指摄影机的位置不动,只是角度变化;可以是 “左右摇” 或者是 “上下摇”,也可以是 “斜摇” 或者是 “旋转摇”。其特点是改变拍摄角度或拍摄对象,自由度和灵活性较强。
主要作用:介绍环境,突出人物的行动目的和意义。
”移“ 是指摄影机沿水平的各个方向移动并同时进行拍摄。其特点是镜头的方向不变,而只是移动摄影机。
主要是通过铺设轨道来实现移。
主要作用:展示空间,因为它能够产生巡视的视觉效果,同时还可以把一些事物连接起来从而表现复杂的空间环境。
“跟” 是指摄影机始终跟随被摄主体进行拍摄。其特点是运动着的主体始终在电影画面中,从而可以连续且详尽的表现其活动情形。
长镜头?手持摄像机?
主要作用:能突出运动中的主体,又能交代运动的方向、速度和周围环境等。
推、拉、摇、移、跟这五种形式在电影的具体拍摄中,往往都是根据导演的叙事目的或者是艺术表现的需要等而混合交替地使用。
《视听》
我们孕育于声音之中,诞生于视觉世界。
电影孕育于视觉世界,诞生于声音之中。
声音出现之后,电影才真正成为视听合一的艺术。
声音作为进入电影的最后一个至关重要的元素,对电影艺术的成熟和完善有着决定性的作用。
从物理学的角度来看,声音有三个基本特性
🈯️声音频率的高低。
音调高:轻、短、细
音调低: 重、长、粗
儿童声音的音调要比成人的音调高,女性声音的音调要比男性声音的音调高。
也称 “音品”,是指声音的特质和色彩。
每一个人,每一种乐器和所有能够发出声音的物体的音色都不相同。
也称 “音量”。指人耳对听到声音大小、强弱的主观臆断感受。
人们把对声音的感受量化为可以监测的指标,单位为 “分贝”(DB)。
电影中,通过不同音高来变现不同叙事情景或是人物心理等。
即指人的声音。
电影中的 “人声” 分为 “对白” 和 “旁白”。
“对白” 也称 “台词”,是指两人或多人之间的对话。
“旁白” 则是指由电影画面外的人声对故事情节,人物心理等进行叙述或抒情议论,以传递更为丰富的信息。
也称 “声效”,是指由声音所制造的听觉效果。
电影的 “音效” 包括 “环境音效” 和 “动作音效”。
“环境音效” 指电影中自然环境的声音;
“动作音效” 则是指人物动作或者物体所发出来的声音。
“音乐” 作为电影声音的重要组成部分,是诠释影片的一把钥匙,好的音乐甚至可以助力一部影片的成功。
”电影音乐“ 可分为 ”电影乐曲“ 和 “电影歌曲”。
电影乐曲
“主题音乐” 往往是一段完整的音乐,其能够表达一定的思想,感情和主题,同时能够贯穿剧情并统一电影风格,是电影的核心音乐。
如《阿甘正传》的主题音乐 “在风中飘” (FORREST GUMP)。
也称 “配乐” 或是 “伴乐”,是指在电影中作为背景衬托的音乐。
作用:增强影片的情感表达,让观众有身临其境的感受。
指在一部电影中反复出现,表现主题思想或者概括影片基本内容的歌曲。
如《亲爱的》结尾主题曲 “亲爱的小孩”。
指穿插在电影中的短小乐曲,具有贯穿剧情的作用。
总结
电影音乐具有确立场景、突出感情色彩、增强故事流畅感、强化影片高潮的作用。
信息功能
指通过声音传达特定影片或故事信息。
内部引导功能
声音的内部引导功能,指声音在电影中对人物内心及情绪等的表现。
电影声音的处理原则
声音层次
声音透视
音桥
画外声音
声音蒙太奇
首先,要根据声音在电影画面中的重要程度来处理声音的层次。
处理好 “对白” “音乐” “音效” 之间的关系。
如在人物对话中音乐的声音不要超过人声等。
其次,在进行电影声音处理时还要主要声音透视的问题。
“声音透视”,是指电影画面中相应的声音呈现要符合日常生活中,人们对声音的普遍感知经验。
例如,人物靠近或远离时,声音要相应变大或者变小。
进行电影声音处理时的一个特殊的手段:建立 “音桥”。
有源声音
指声音与电影画面中的一个声源互相联系。
无源声音
某种声音的声源没有出现在电影画面中,那就是 “无源声音”。
“音桥” 即利用声音与画面中声源的关系形成镜头之间的连续性,从而使声音具有一种 “桥梁” 的功能。
电影的声音处理还要注意 “画外声音” 的运用。
“画外声音” 是指声源没有出现在电影画面中的声音。
“画外声音” 可以使电影画面得以延伸。与音桥类似,可以表达出更多的信息。
“声音蒙太奇” 即声音的剪辑。
通过声音的排列或是组合表现特定的情感,产生更多的意义。
一部电影的创作过程,大致要经历
完成 剧作、导演、表演、拍摄、剪辑等。完成时间也从几个月到几年不等。
电影的最小单位:镜头
镜头 —— 场 —— 情节段落 —— 剧本。
即我们日常最容易接触到的电影剧本类型。
作为电影创作的第一步,由编剧完成。
“电影文学剧本” 要以 “场” 为单位进行写作。
要明确标出每一场的 “场次” 及相应的 “场景”。
具体文字表述,则与小说的语言比较接近,即要写出故事的详细发生发展过程和人物对话等。
也称 “导演台本”,是在电影开始拍摄之前,由导演根据 “电影文学剧本” 创作完成。
“电影分镜头剧本” 要以 “镜头” 为单位进行写作。
不仅要详细标明 “第几场” 的 “第几个镜头”,而且要明确写出每一个镜头的 “景别”。
《罗生门》第一个镜头讲解。
也称 “镜头记录本”,是在电影拍摄结束之后,由场记完成。
有两种
改编是电影剧本的一个重要来源,根据相关数据全世界每年至少有一半的电影剧本都是改编而来的。
总体来看,电影剧本的改编,主要有
指电影改编保留原作的故事和人物,力求忠实于原著的内容。
特点:将抽象的文字转化为具象的视听语言。
指将原著中最精彩的部分,或是相对完整的一段,提炼后进行改编创作。
从其中抽出来一部分,删除多余的线索和人物,化繁就简的进行电影剧本创作。
因为电影的时长有限,很多鸿篇巨制的文学作品不可能在 2 个小时左右的电影中完全呈现。
如根据经典革命小说《林海雪原》截取了精彩片段,改编成了《智取威虎山》。
指将原本独立的两个或多个故事整合,从而形成一个新的作品。
《罗生门》就是将日本作家芥川龙之介的两部小说《罗生门》和《筱竹丛中》进行复合。
《皮绳上的魂》也是融合藏族作家扎西达娃的两部小说,《西藏,系在皮绳结上的魂》和《去拉萨的路上》
仅保留原作的人物关系活基本的故事框架,而进行新的剧本创作。
《满城尽带黄金甲》就是取意自曹禺先生的经典话剧《雷雨》,只是将故事的背景改为五代十国,而人物设置和人物关系则与《雷雨》如出一辙。
指对原作进行彻头彻尾的改编,虽然有的仍然是用原作的名字,或是使用原作中人物的名字,但故事内容已经面目全非。
《大话西游》这种系列,就是对西游的彻底的颠覆。
导演:电影的 “总工程师”
导演需要参与的阶段
前期筹备
中期拍摄
后期剪辑
首先就是对一部电影进行最初的构思,即在开拍之前形成自己的想法,并与编剧沟通修改剧本。
建立剧组,即通常所说的 “建组”。
通常会选用与自己有过合作的工作人员,旨在减少磨合的时间、提高工作效率。 如:王家卫与摄影师杜可风,侯孝贤与摄影师李屏宾。
演员的挑选工作,根据影片中的角色设置和相关的剧情需要,挑选那些符合电影中的人物气质或是有过类似人物演出经验的演员。当然,某些导演也会经常会与某位演员合作,例如冯小刚的喜剧片中总会有葛优。宁浩的喜剧片中也总有黄渤的身影。
中期拍摄是一部电影创作过程中持续时间最长的时期。
导演在中期拍摄阶段身兼数职,是电影拍摄工作的主要组织者。指导摄影机前的演员表演,指导摄影、美术、录音等。
与剪辑师一起进行影片的后期剪辑。即在剪辑师将素材按照 “分镜头剧本“ 进行 ”粗剪“ 的基础上,由导演参与进行 ”精剪“,并在历经多次的反复修改之后,最终完成一部电影的创作。
后期剪辑师导演一次再次创作的过程。 因为可以根据所拍摄的素材和新的思考,对影片内容进行适当的调整。
目前全世界有两大表演艺术体系。
还有观点将中国戏曲的表演艺术体系,即梅兰芳演剧体系列为世界上第三种表演艺术体系,指一种高度程式化的表演。
斯塔尼斯拉夫斯基表演体系
也称 “体验派”,创立者是苏联人斯塔尼夫拉夫斯基。
其核心观点就是要求演员 “化身为角色”,并 “要有真正的情感体验”。
《演员的自我修养》是真的有这本书,而且还是斯塔尼斯拉夫斯基写的。在全世界都影响非常的深远。
*布莱希特表演体系 *
也称 “间离派”,创立者是德国人贝托尔特·布莱希特。
核心观点:要求演员与角色保持一定的距离,演员要高于角色、驾驭角色,要表现剧中的人物而不是融入人物之中。
一部电影会有数量不等的演员参与演出,少则几个多则成百上千。
演员的分类,大致可以分为
电影的发展之初,是借鉴了戏剧的表演手法,随着电影的发展成熟,其表演也与戏剧产生了明显的差异。
绝大部分电影都要求演员的表演要真实自然,同时随着现代科技发展出现的愈发细致入微的特写镜头等,更加要求演员的表演要真实自然。
戏剧表演是 “演员的艺术”,因为导演的所有构思都要由演员来完成。
电影演员的表演,则更多的被掌握在导演的镜头语言中。
一方面因为电影演员面对的不是观众而是摄影机,于是就打破了舞台的封闭,另一方面蒙太奇等电影语言,也促成电影表演突破时空的限制。
电影演员对作品具有不可支配性,同时表演过程还具有被迫中断性。
在戏剧表演中,演员是主导,因为戏剧作品要依靠演员在舞台上的一气呵成;
电影演员则需要根据实际情况在摄影机前不断的重复表演,并且随时可能被迫中断。
拍摄:电影语言的实现 。
电影拍摄是以 “场” 为单位进行的,发生在同一场景中的要集中拍摄。以一部90分钟的电影为例,一般会有一百多“场”。如果把重复的场景合并计算,一部电影大概要拍摄三十至五六十场不等。
一部电影的拍摄顺序,是先拍外景再拍内景。
因为室外的天气复杂多变的,并且拍外景的时候,可以顺便搭内景。
电影的拍摄顺序并不是按照故事的发生,发展过程,也不是按照电影剧本的顺序,而是遵循 “先外景后内景” 的拍摄原则。
电影的拍摄还有几种非常规的方式
是指完全按照故事的发展顺序进行电影拍摄。
受制于演员的档期、天气的变化、场地的租用等限制。
指导演在没有剧本的情况下进行电影拍摄。
《重庆森林》《堕落天使》等都是无剧本的情况下拍摄完成的。
偷拍在电影创作中并不十分常用。
也有导演采用偷拍的方式,以实现电影场景的真实与原生态。
如张艺谋的《秋菊打官司》。
是电影拍摄过程中非常重要的一项工作。
主要人物是在电影拍摄的同时,记录现场的一些注意事项;
电影画面相关信息。
如道具摆设人物站位等。
演员的服装配饰。
人物对话的改动。
一般来说,一部电影要经历三次创作过程。
第一次
是编剧编写剧本,即以文字塑造电影的视听形象。
第二次
是导演执导拍摄,是用摄影机把文字幻化为影像,并以胶片或者数字的形式进行保存。
第三次
剪辑师剪辑素材,是让电影真正成为可以放映的影像。
剪辑的过程一般来说分为下面几步:
一部 90 分钟的电影,往往会拍摄几百甚至上千个镜头。 而所有的素材累积在一起,至少也有十多个小时,因此,剪辑工作的第一步就是对镜头进行选择。
结合之前所选择的镜头,根据剧本制定剪辑方案,从而完成剪辑工作的蓝本。
也称 “粗剪”,是指根据 “分镜头剧本” 完成剪辑初稿,形成电影的雏形,即一个没有特效和音乐的版本。
复剪是在初剪基础之上进行的更为精细的剪辑,进而使影片逐渐定型。
即在复剪基础上的再次查漏补缺。
主要就是调整、增加镜头或者片段,最终完成一部可供放映的电影。
也是导演和剪辑师在影片创作过程中的最后冲刺。
原为法国建筑学名词,意为 “组装、装配 ”。
指把电影所要讲述的故事分为若干个场景拍摄,然后再进行组接,从而形成一个具有逻辑顺序的艺术整体。
在电影刚刚出现时,还没有剪辑的概念。
当时的一个镜头就是一部电影,时间长度大约在一分钟左右。
电影引入了许多戏剧的创作理念,剪辑也是针对没有景别转换的固定取景。
电影摆脱了戏剧观念的束缚,成为一门真正独立的艺术。
首次使用了分镜头。
让摄影机运动起来。
首创了叙事蒙太奇。
故事时间:指电影中所讲述的故事的实际发生时间。
可能是一天、一年,或者是许多年。
电影时间:是指电影讲述这个故事所需要的时间。
即电影的时长,一般 “电影时间” 都在 2 小时左右。
《敦刻尔克》天上一天,地上一年。
“故事时间” 和 “电影时间” 有下列三种关系:
第一种:故事时间 > 电影时间。最常见
第二种:故事时间 < 电影时间。《罗拉快跑》
第三种:故事时间 = 电影时间。非常少见,例如《正午》
任何一部电影都离不开剪辑,是剪辑形成了电影的戏剧冲突,强化了电影的艺术表现。
电影类型片
“类型片” 是指按照不同类型的规定而生产出来的影片。作为好莱坞大制作厂标准化生产的产物,“类型片” 以 “制片厂制度” 为基础,以追求经济利益最大化为目的。
类型片有三个最基础的元素
公式化的情节
定型化的人物
图解式的视觉形象
在世界百余年的发展历程中,主要形成了
等电影类型。
“音乐歌舞片” 是指以音乐舞蹈作为一部影片的观看中心,音乐和舞蹈共同进入叙事并成为叙事核心的电影类型。
也是好莱坞历史最悠久,特征最明确的类型片。
第一种电影的叙事时空完全舞台化。
人物和故事情节等都处于虚构的环境中。
如
《雨中曲》《西区故事》《红磨坊》等。
第二种是影片有着较为写实的叙事时空,音乐歌曲是主人公的表演展示。
歌舞表演与电影叙事之间有着较为明晰的界限,音乐歌舞只是构成电影叙事的一部分。
《红菱艳》《名扬四海》等。
第三种是上述两种模式的并存。
既有随性而起的歌舞表演作为电影叙事的一部分,又有明确的歌舞表演段落。
《音乐之声》
音乐歌舞片的 “黄金时代”。
特点:“后台” 歌舞片
以 后台 矮星故事为核心,主要讲述年轻女孩成名的故事。
代表作品是 1933 年的《第四十二街》
该片表现了正统爵士、踢踏舞的节奏韵律和动作美感,成为音乐歌舞片 “黄金时代” 的标志。
音乐歌舞片之所以在上世纪 30 年代的好莱坞迎来黄金时代,主要有几方面原因:
当时美国社会刚刚经历过前所未有的经济大萧条,社会矛盾激化,而音乐歌舞片中的歌舞升平,则能够为观众提供高质量的娱乐。
1930 年著名的 “海斯法典“ 颁布后,电影中性和暴力的内容受到严格限制,于是音乐歌舞片的数量便开始剧增。
特点:
受第二次世界大战的影响,观众对音乐歌舞片的兴趣降低,影片的数量也随之减少。
呈现出以乐观叙事为主的特点。
代表作
《一个美国人在巴黎》《雨中曲》
进入 60 年代之后,由于电视强烈冲击,好莱坞为了留住电影观众,便投入更高的成本拍摄场面豪华、明星云集的音乐歌舞巨片,于是一批根据百老汇歌舞剧改编的影片便应运而生。
如《窈窕淑女》《音乐之声》《西区故事》
背景:
西方社会的大变革时期:“嬉皮士运动” 的影响不断蔓延,“迪斯科” 也风靡全世界。
特点:
“青春派” 音乐歌舞片便在这一时期开始繁荣;更加突出镜头的跳跃与连接。
代表作 1982 年的《迷墙》
真人动画的超现实音乐歌舞片。
特点:
类型杂糅、风格多样。
《舞出一片天》以芭蕾和嘻哈,演绎白人和黑人之间的爱情故事。还有《红磨坊》《芝加哥》等反映美国社会问题的音乐歌舞片。
“西部片” 是指以美国西部拓荒为背景,以美国西部的荒野、小镇、牛仔和马尾主要视觉场景,反映文明与蛮荒、个人与社会、本民族与异域文明之间冲突的影片。
作为美国文化的典型代表,西部片产生于美国并主要在美国拍摄。其故事大多来源于美国西部文学或相关历史事件。作为典型的电影类型片西部片具有明确的类型片三要素:
西部片的情节几乎都是警察、牛仔等孤胆英雄对抗印第安人、匪徒等恶势力,并最终取得胜利。
正面人物:牛仔、淑女
反面人物:亡命歹徒、印第安人
中间人物
山谷、沙漠、荒凉的小镇或印第安营地,是西部片不变的外景;
简陋的驿站、酒馆、小木屋则是西部片不变的内景。
左轮手枪、马匹、皮裤、牛仔帽等也是西部片反复出现的道具。
西部片色彩和画面构图特点:
大量使用黄色调。
画面构图风格粗狂,多使用广角镜头,并讲究地平线的使用。
“通心粉西部片”
特点:
印第安人的形象销声匿迹。
美国西部片往往在影片中大量呈现雄伟壮丽的美国西部自然风光,且以全景和远景镜头居多。
相比之下,意大利西部片由于大多没有在美国拍摄,因此就较少呈现自然景观。
多以变焦镜头和景深镜头为主,同时大量使用特写镜头。
还有配乐方面
美国西部片习惯使用传统的管弦交响乐,旨在呈现一种磅礴的气势,并使影片具有一定的史诗气概。
也有的使用民谣风格的插曲,旨在给影片增加一种忧郁的气质。
意大利西部片的配乐则更为强烈,极富抒情性和感染力。
美国西部片代表作《荒野大镖客》《黄昏双镖客》《黄金三镖客》
意大利西部片代表作《姜戈》
暴力美学《被解救的姜戈》
20世纪 30 -60 年代
《关山飞渡》改编自莫泊桑的《羊脂球》
《红河》
20 世纪 60-70 年代
日薄西山了
《安邦定国志》、《小巨人》
《狼城脂粉侠》、《虎豹小霸王》
20 世纪 70-80年代
被遗忘
《天堂之门》
20 世纪 90 年代
重现辉煌
1990 年,由科斯特纳自导自演的《与狼共舞》,以一种正确的态度面对历史,并为印第安人正名,该片获得奥斯卡 7 项大奖。
《不可饶恕》
21 世纪之后的西部片
特点:传统的西部片的类型元素减少、新类型元素不断增加的特点。
《狂风沙》
以展示自己国家西部独特的历史文化、讲述西部故事为主要特征,具有鲜明的地域特色。
美国西部片的主体几乎都是征服于占领,而中国的西部片的主题则是发展与进步。
美国西部片的主角大多是英雄,而中国的西部片的主角则多为生活在西部的普通人,影片也主要关注个体的生命际遇。
美国西部片属于商业类型片,中国西部片则属于现实主义电影。
集中出现在新时期以后。
主要类型有四
《大红灯笼高高挂》
《可可西里》(巡山队)
《三枪拍案惊奇》(是真的无聊)
《无人区》《一个勺子》
所谓喜剧片,是指以产生笑的效果为特征的电影类型。
特点:
多元的 “笑”。
有的讽刺丑恶落后,有的歌颂光明美好。
其目的都是为了让观众在笑中得到愉悦,或是在笑中获得启发。
主要类型
《一夜风流》《罗马假日》
都是通过误会、巧合等演绎出令人难忘的浪漫爱情故事。
《风月俏佳人》《西雅图未眠夜》《四个婚礼和一个葬礼》
《北京遇上西雅图》(?????深受观众喜爱吗?)
“讽刺喜剧”,是指以尖锐的讽刺和嘲笑,揭露、抨击现实中不好的事物。
喜剧外表下潜藏着的讽刺,则是对社对人生更深层思考。
《淘金记》《摩登时代》
《驴得水》(确实是近代国内的上乘之作)
“闹剧” 往往采用大量的插科打诨,具有荒唐意外的情节,人物形象也是高度夸张或是十分滑稽。
《憨豆先生》囧系列电影
虽然喜剧味道不是很浓,但却会让人感到温馨,同时能够反映某些社会现实。即让观众在发出会心笑声的同时进行思考。
《甲方乙方》《私人订制》针砭(bīan)时弊
1997 年过去了,我很想它。
地主家也没有余粮了啊。
启斯东电影公司。
《启斯东警察》
特点:
具备较为强烈的社会意识,强调电影的戏剧结构和文化品位。
刘别谦《少奶奶的扇子》
特点:
强调两性意识和现实感。
《热情似火》
特点:
强烈的个性化
《安妮·霍尔》《发条橙》。。。
《毕业生》、《斯卡布罗集市》《寂静之声》
特点:
更加符合时代发展和社会语境。
现存最早的一部中国电影:1922 年 “明星电影公司” 出品的喜剧片《劳工之爱情》。
特点:
呈现出抨击社会黑暗,批判封建礼教,追求个性解放和婚恋自由的主题。
《月老离婚》《四月里底蔷薇处处开》《呆中福》
《五朵金花》《今天我休息》
《大李、小李和老李》《锦上添花》《魔术师的奇遇》
“武侠片” 又称 “功夫片” 或者 “武术片”,是指以中国功夫和武侠传奇为主要表现对象的电影类型。
作为唯一一种由中国首创,并主要由中国拍摄的电影类型,武侠片以其独有的艺术魅力和娱乐风格。在中国电影发展史中具有无法取代的历史地位和现实意义。
”动作片“ 是指以人或机械的动作为主要形式,表现基本的社会价值观,满足大众相关审美需求的电影类型。
《极速飞车》《速度与激情》等。也就是说 “动作片” 包括 “武侠片”,“武侠片” 是一种以人的动作为主的 “动作片”。
1925 年由 “天一电影公司” 出品的 《女侠李飞飞》 是我国第一部武侠片。
还创造了一个行当:武术指导。
二 武侠片关键词:“武术指导”
几乎所有的电影行当都是由外国人创立的:制片、编剧、导演、摄影、美术、服装、道具等。
代表人物:刘家良、袁和平 、程小东。
《杀死比尔》袁和平
《忍者神龟》刘家良
“武术指导” 也称 “动作指导” 或 ”武术设计“。
神怪传奇类武侠片的历史最为悠久,其以我国民间的神圣武侠文学为原型,且主要依赖特技技术。
1982 年的《火烧红莲寺》
《倩女幽魂》《青蛇》
人物传记类武侠片与我国历史上的多位武术家密切相关。
《方世玉》《霍元甲》《黄飞鸿》
在百余年的历史上,截至目前共拍摄了 105 部 “黄飞鸿电影”,创造了世界电影史的一个记录。
《叶问》《一代宗师》(念念不忘,必有回响)
古装刀剑类武侠片繁荣于 20 世纪 60 年代,并形成了中国武侠电影的第二次创作高潮。
《独臂刀》《碧血剑》
《龙门客栈》《大醉侠》《侠女》
功夫技击类武侠片是最接近中国功夫的武侠电影类型,其特点是以真功夫折服观众,并强调武侠和武德。
李小龙
《唐山大兄》《精武门》《龙争虎斗》《猛龙过江》
20 世纪 70 年代,随着中国电影的商业化发展,最具商业价值的喜剧元素开始进入武侠片,并形成了将喜剧夸张表演与武打动作结合的谐趣喜剧类武侠片。
成龙
《蛇形刁手》《醉拳》
是在电影技术发展的前提下,以虚拟数字技术为特征,以虚构故事为内容的武侠电影类型。
《蜀山:新蜀山剑侠》《蜀山传》
最早出自于中国古典戏曲《界牌关》。后来被武侠片借用,其中以张彻的 “阳刚电影” 为主要代表。
《大刺客》
(暴力美学)
《侠女》《白发魔女传》《青蛇》《卧虎藏龙》
《十面埋伏》不是也是么。
《英雄》对竹林大战进行了改造,“胡杨林大战”。
吊威亚来实现。
“威亚”,即英文单词 “钢丝” 的音译。“飞檐走壁” 和 “凌波微步” 都采用 “吊威亚” 的方式,只是通过不同的落点来形成不同的视觉效果。
客栈大战作为一种极具中国文化特色的电影场景,体现了武侠电影创作对中国传统戏曲空间表现手法的借鉴,即突出空间的舞台化。
《大醉侠》《龙门客栈》《卧虎藏龙》
由于早期的 “武术指导” 多为 “龙虎武师”,于是就促成了舞狮与武侠电影创作的结合。
体现了武侠片对中国传统文化的借鉴与汲取,从而彰显出中国武侠电影的民族文化气质。
认识影片物质形态,提示影片价值要点;
呈现电影知识系统,辅助未来创作改进;
促进影人与社会互动,提升观众审美能力。
如 安德烈·巴赞
能够运用专业知识、审美经验和批判意识打开观众视野。
如何获得专业素养。
解读电影视听语言与叙事形式的本文分析是非常重要的一种批评方法。
重点:探讨电影的造型、运动性与节奏。
镜头的内部元素:
都具有造型的功能。
运动又有:
《修女艾达》
黑白色彩赋予影像一种理性,让观众思考艾达的选择。
在构图上,艾达往往处于画框右侧或左侧底部,这是在表明人物尚未摆脱历史与现实的束缚。
“阴阳脸” 高反差布光象征她在宗教和尘世之间犹豫徘徊。绝大部分镜头是固定镜头,这是在象征表达艾达还没有确定自己的未来。但在电影的结尾,当艾达确定了自我追求后,电影是一个运动的长镜头结束故事,电影由此展现出一个修女自我意识的觉醒。
内部节奏
由多种因素综合而成,如事件和情节的安排,以及场面调度。
外部节奏
主要指向镜头的剪接。它受到镜头的长度和幅度两个元素影响,长度指镜头时长以及镜头所表现内容的时间延续感,幅度则指的景别。
1966 年《一个男人和一个女人》《这个杀手不太冷》
《这个杀手不太冷》在杀手出场的时候,用了 19 个镜头,这 19 个镜头全部都是特写镜头固定镜头,并且每个镜头的时长都比较短,从而营造人物的神秘和迅捷。
关注一个男人如何走出童年暴力与战争所带来的心理创伤。
电影片名出来之前,电影开始的这个部分,安排了三场戏。
跳接:
跳接指的是两个镜头内的主体相同,而摄影机距离及角度上差距不大,当两个镜头连接在一起时,在银幕上便会明显地跳一下。
喜剧之王在向柳飘飘表白,也是用的跳接, 用了两个周星驰的特写镜头,来表明主人公忐忑不安的心理。
时间上追溯到 1948 年 3 月 30 日。地域上追溯到法国。
摄影机——自来水笔:新先锋派的诞生。
它意味着电影必将逐渐挣脱纯视觉形象、绝画面、直观故事和具体表象的束缚,成为与文字语言一样灵活、一样精妙的写作手段。
—— 阿斯特吕克
《糟糕的相遇》
后来女演员又主演了《一个男人和一个女人》
巴赞《论作者策略》
其实一个导演的作品时参差不齐的,比如导演奥逊威尔斯,他的《公民凯恩》开启了美国电影的新时代,《阿卡丁先生》只是一部二流作品。
按时间排序
王家卫电影的秘密就在他的名字当中,家与卫有着先锋前卫的影像,注重日常生活细节的叙事,从而给人以奇异而熟悉的感觉。
《阿飞正传》
拒绝与逃离,沉迷与顿悟。
《春光乍泄》
跳接
《花样年华》
《2046》
用不同的背景音乐来配合人物出镜。
越轴,预示不好的场景。关于越轴,在《电影批评》中有介绍。
天台的镜头。带花的和不带花的,表现得不一样。
安德烈·巴赞把类型电影称为一种寻找内容的形式, 可以从以下三个维度来理解。
类型电影一般具有
《侠骨柔情》
淡化类型惯例,放大现实生活经验从非写实转向写实,这是很多反类型电影的一种创作方法。
1994 年《这个杀手不太冷》的饰演的风尘女子的角色,麦温。当时是导演吕克贝松的女友,后来自己也成为了导演。《青少年警队》就是她的作品。
正如巴赞所指出的:
电影好比女引座员拿着的小手电筒,那摇曳的灯光像闪烁不定的彗星,划过我们醒着做梦的黑夜,那是银幕周围向四面扩展的漫无边际的空间
普罗普《民间故事形态学》
对民间故事的叙事功能进行研究,提炼出七种行动范畴和六个叙事单元。
格雷马斯则提出六个动素和一个意义矩阵。
《第五元素》《功夫熊猫》《银河护卫队》都可以按照这个理论来解读。
《罗生门》举例
受到普罗普的影响,神话学家坎贝尔在他的著作《千面英雄》 对神话传统进行了分析,得出了一种叙事模式。
一个从平凡世界召唤出来,并踏上冒险旅程的英雄,他进入到一个既有盟友也有敌人并且充满磨难的世界,最后英雄要到达一个隐秘的洞穴,这样一个接受终极考验的场所,胜利之后英雄回归到发生改变的日常生活中。
很多电影都是这样的一个叙事。
例如《王牌特工·特工学院》
特工电影分为两类:
一、非写实的戏剧情节
007《谍影重重》系列
二、类型片融入大量现实经验,毫无高科技与绚丽的动作。
英国 70 年代《义普克雷斯档案》。
母题
电影里任何有意义且重复出现的元素。
母题可能是物品、颜色、地点、声音,也可以是打光法或摄影机的位置。
欧洲先锋派电影运动是指上世界 20 年代出现在欧洲的一次实验电影运动,其以法国和德国为中心,同时涉及意大利、英国、法国等多个欧洲国家。
欧洲先锋派电影运动的发展阶段
第一先锋派电影
即印象主义阶段,主要以 “法国印象主义电影” 为代表,从 1917 年到 1929 年贯穿 “欧洲先锋派电影运动” 的始终。
印象主义
设法忘掉你前面的物体,准确地画下你所观察到的颜色和形状,直到达到你最初的印象为止
——莫奈
第二先锋派电影
即超现实主义阶段,主要以 20 年代的 “法国超现实主义电影” 和 “德国表现主义电影” 为核心。
第三先锋派电影
即记录电影阶段,主要活跃于 1927 年至 1930 年间,指由卡瓦尔康所创立的 “记录电影流派”,以他在 1926 年拍摄的记录电影《只有几小时》为标志。
出现于 20 世纪 20 年代,与当时的科技发展、文化思潮、社会背景,以及电影自身的变革需求等紧密相关。
从第一次世界大战结束到 1929 年资本主义世界爆发的大规模的经济危机之前,欧洲国家经历了一段相对稳定的和平发展时期,这一时期的科技进步,为电影的发展奠定了良好的物质基础。
摄影机、胶片、灯光设备等都取得了长足的进步。
第一次世界大战在欧洲思潮文化界引发了巨大的反应,人们开始怀疑甚至否定以往的社会观念和精神文明成果,于是现代主义思潮在 19 世纪末快速发展。
以弗洛伊德的精神分析学说影响最大,其间接促成表现主义电影和超现实主义电影的出现。
工业革命使现代机械逐渐取代了人在社会生产中的地位,人们越来越深的感受到工业化的压抑与制约,因此追求个人化的表达,也就成为了一种新的社会发展趋势。
第一次世界大战之后,欧洲大多数国家的电影市场都被好莱坞占据,欧洲电影在艺术上几乎停滞,并呈现出较为严重的商业化倾向。
卡努杜与 “第七艺术”。
可以说,欧洲先锋派电影运动在一定程度而言,就是努力将电影发展为一门独立艺术的探索与实践。
第一先锋派是指以法国为中心的 “印象主义电影”。
“印象主义” 最早出现于绘画,由法国画家莫奈的《日出印象》为代表的绘画流派。
“印象主义” 绘画主张以色调的分离、色彩的闪烁等手法来表现对大自然的主观印象,反对当时思想保守、题材僵化和手法老旧的学院派绘画,提倡革新与突破。
法学电影史学家朗格卢瓦首先在电影中使用 “印象主义” 一词。
德吕克、杜拉克、莱皮埃、冈斯为代表的电影流派。
“印象主义电影” 认为,电影作为艺术家表达自我的情感场所,要描写人物的内心细微变化。
1919 年德吕克和杜拉克联合创作的电影《西班牙的节日》
“印象主义电影” 的导演们在创作实践中积极使用各种新的摄影技巧,旨在以新的摄影手段表现人物的心理状态。
代表作 1922 年冈丝拍摄的电影《车轮》
“印象主义电影” 的导演们在创作实践中积极使用各种新的摄影技巧,旨在以新的摄影手段表现人物的心理状态。
1927 年,冈丝的《拿破仑》就使用了最新的摄影机镜头和宽格画面。
以 “印象主义电影” 为核心的 “第一先锋派”,在电影的心理表现、摄影镜头的运用、后期剪辑等方面的探索和实践,极大丰富了电影的表现能力,这些创新也成为了当时法国电影与好莱坞抗衡的手段。
1924 年德吕克去世后,“印象主义电影” 开始逐渐解体:其中一部分人转向拍摄商业电影,另一部分则选择与商业电影彻底决裂的先锋派道路。
到 1929 年,“印象主义电影” 基本停止创作。
主要特点
超现实主义
相关概念
立体主义
最早出现于绘画领域,其特点是反对传统的写实主义,注重形式,强调表现人对外界事物的主观印象和感受。
先有作品而后进行理论归纳。
纯电影
抽象电影
未来主义
先有理论的提出,然后由理论指导创作实践。
出现于 1909 年的 “未来主义”,反对传统的艺术主张,强化运动之美和速度之美。
1916 年,“未来主义电影宣言” 发表,提出电影要发挥能动性,超越对现实的简单机械复制。
达达主义
兴起于第一次世界大战时期的瑞士,最早也是出现在绘画和文学领域,后来被引入到电影中。
以婴儿的发音为命名,直接表达了旨在婴儿呀呀学语期间对周围事物的纯生理反应,进而指出文艺创作应该像婴儿学说话那样,排除思想干扰,只是表现感官的印象 。
总体看来,“立体主义” 和 “未来主义” 反对传统艺术的观点,“达达主义” 对传统艺术观念的颠覆,都与 “先锋派电影” 有着内在的一致性。
“纯电影” 反对叙事,主张将电影从其它艺术的束缚中解放出来,强调通过剪辑凸显电影画面的节奏感,即让画面压倒电影中的其它元素,主宰一切并单独起作用。
如莱谢尔在 1923 年的《机器的舞蹈》
《纯电影的五分钟》
“抽象电影” 作为一种追求最纯粹的电影形式的先锋电影,深受抽象主义绘画的影响,强调为形式而形式,为艺术而艺术;认为电影不仅是视觉节奏的艺术,还应该是光的艺术。
1921 年 《车轮》 1924 年 《对角线交响乐》,
1921 年《第二十一号节奏》1926 年《电影习作》等。
杜拉克
1928 年《958 号唱片》1929 年《阿拉伯花饰》。
深受 “达达主义” 影响的 “达达主义电影”,继承和发展了 “未来主义电影” 的创作特点。
1923 年《回归理性》
1924 年 《幕间休息》
促进了法国超现实主义电影的出现。
兴起于 20 世纪 20 年代,主要是将绘画和文学中的 “超现实主义” 创作方法用于电影。
经典作品,主要有达利的《记忆的永恒》、《内战的预感》等。
秉承超现实主义文学家安德烈·布列松的相关理论主张:强调真实的无理性行为、梦幻的重要意义,以及不协调的形象所产生的情绪力量等。
深受弗洛伊德精神分析学说的影响,以探索对人物意识的表现为重点。
开山之作,杜拉克在 1927 年拍摄的《贝壳与僧侣》
布努埃尔 1928 年 《一条安达鲁狗》
后来的电影研究者有关变态心理和无理性行为等的呈现,都归结为 “超现实主义” 在电影中的具体体现。
《爱德华大夫》《眩晕》《西北偏北》《群鸟》等。总体来说 ”法国超现实主义电影“ 不再像之前的 “纯电影” 和 “抽象电影” 那样,过分关注物体的线条与图形,也不再具有过于强烈的节奏感,而是转为关注人物的内心深处。
时间:1919-1926 年
特点:将文学、戏剧和绘画中的表现主义手法用于电影创作,电影布景呈现出失真和变形的状态。
罗伯特·维内在 1919 年拍摄的影片 《卡里加里博士》
欧洲先锋派电影运动中的 “第三先锋派”,是一个记录电影流派。
其创作深受苏联电影眼睛派导演维尔托夫的两部影片《电影真理报》《电影眼睛》的影响和启发,在创作中拜托了之前先锋派电影对现实的逃避,而更多去关注现实生活。
第三先锋派创作出了一批被称为 “城市交响乐” 的纪实电影。
《柏林:城市交响曲》 《雨》《持摄影机的人》《尼斯印象》
拉不孔在 1928 年拍摄影片的 《贫民窟》,这部电影开创了反应社会问题的记录电影的创作先河。
“纪录片教父” 格里尔逊在 1929 年拍摄的纪实电影片《漂网渔船》,也是 “第三先锋派” 的代表作品。
三个阶段的共同点
不以商业盈利为目的,不以讲述故事为宗旨;
以探索无声电影的纯粹视觉表现和美学特征为主要使命。
背景
20 世纪 20 年代末,在资本主义世界全面爆发经济危机的社会背景下,同时伴随着有声电影的发明与普及。“欧洲先锋派电影运动” 逐渐走向终结。
影响
“印象主义电影” 对电影光线的处理和对电影影调的整体把握,以及对各种运动镜头的探索与实践,尤其是高速摄影和低速摄影的发明等,一直被沿用至今。
“表现主义电影” 中的场面调度和灯光、场景布置的方法等,也深刻的影响了后来的电影创作,尤其是恐怖电影和黑色电影受其影响最为深刻。
除了在电影视觉表现方面的探索和实践,“欧洲先锋派电影运动” 还提供了一种新的用电影观察世界的方法,提出了电影与世界、与社会发生联系的新的可能。
“苏联蒙太奇电影学派”,形成于 20 世纪 20 年代中期的苏联,以库里肖夫、爱森斯坦、普多夫金等人为主要代表。
致力于探索新的电影表现手段以表现新时代的革命电影艺术。
通过对 “蒙太奇” 的实验和研究,“苏联蒙太奇学派” 创立了 “电影蒙太奇” 的系列理论,并将理论运用于电影的创作实践。
《战舰波将金号》《母亲》
“苏联蒙太奇学派” 出现于 20 世界 20 年代的苏联的原因:
新生的苏维埃政权为 “蒙太奇学派” 奠定了意思形态的基础。
好莱坞的 ‘平行蒙太奇“ 仅仅是将电影片段进行组接,只具有叙事学意义;而苏联电影则将蒙太奇变为具有比拟隐喻、双关等意味的概念,从而以 ”影像的革命“ 同步苏联 ”革命的影像“。 ——爱森斯坦
20 年代盛极一时的俄国形式主义思潮也为 “蒙太奇学派” 提供了方法论。
先锋派意识,马雅可夫斯基的未来派诗歌,康定斯基的未来派绘画。
当时电影创作的物质匮乏也在客观上促使苏联电影人对残存电影胶片进行更为细致、微观的探索。
对电影胶片再次剪辑。
“苏联蒙太奇学派” 对电影蒙太奇技巧的全面运用,使苏联电影在当时拥有了最为强劲的节奏感和冲击力,并影响了后来的好莱坞商业电影拍摄,尤其是动作片中快速、凌厉的画面剪辑。
著名电影史学家大卫·波德维尔曾经利用统计学原理分析指出
20 世纪 20 年代 的苏联电影通常包含 600 到 2000 个镜头,镜头的平均长度为 2 到 4秒。
1919 年到 1928 年间的好莱坞电影,所包含的镜头数量则是 500 到 1000 之间,镜头的平均长度为 5 到 6 秒。
1967 年的《邦妮与克莱德》的镜头的平均长度为 3.8 秒。
”苏联蒙太奇学派“ 对电影蒙太奇类型的探索,至今仍然是许多电影创作的灵感来源。
维尔托夫所拍摄的《持摄影机的人》。
库里肖夫、维尔托夫、爱森斯坦、普多夫金。
库里肖夫不仅是苏联电影导演和电影理论家,作为一名老师,他还培养了爱森斯坦、普多夫金等苏联蒙太奇学派中坚力量。
关键字:男演员、面无表情、特写镜头。与一盆汤、一口安放死者的棺材、和一个小女孩三个不同的镜头剪辑在一起。
结论:
造成观众情绪反应的不是单个镜头的内容,而是画面剪辑的结果。
《持摄影机的人》
将统一天内苏联几个不同城市的场景剪辑在一起,从而形成一部展示苏维埃政权城市生活和电影眼睛巨大力量的纪实影片。
电影眼睛理论:
库里肖夫的土地,继承并发展了老师对电影镜头组接的研究,并指出
1925 年《战舰波将金号》
观念:
通过电影画面的剪接能够形成丰富的影像元素,并具有强烈的理性隐喻。
《辛德勒的名单》在这部电影的结尾手工染色的红旗🚩得到启发,红色衣服的小女孩。
电影镜头之间的组接是产生意义叠加的手段,每一个镜头就像是建筑物的每一块砖头,整合起来就能够构成一个有机整体。
即 “镜头 A + 镜头 B”组合生成的是 “镜头 AB” 意义的加成。
蒙太奇是要为电影叙事服务的,并将其分为
五种类型;并强调蒙太奇不仅能够表现戏剧冲突,而且具有抒情的特性,从而拓展了蒙太奇对电影主题的表现。
高尔基的小说改编的电影《母亲》鉴赏。
20世纪四五十年代,意大利新现实主义电影是第二次世界大战结束后最重要的电影现象。作为继欧洲先锋派电影运动之后,世界电影史上第二次大规模的电影运动,意大利新现实主义电影运动在多维度多层次都构成了新的电影现象与电影文化 。
当时的意大利电影人有感于二战后严峻的社会现实,就拍摄了一批具有进步意义的纪实影片。电影创作者们将摄影机搬到城市的大街小巷。以贫穷、失业、犯罪等社会问题为切入点,将普通人的生活呈现在大银幕上,反映战争带给人们的伤害,从而表达反法西斯战争的主题。
从 1945 年到 50 年代奠定了 “新现实主义电影” 的创作风格,影响深远。
为了与好莱坞电影相抗衡,抢占本土市场,建立意大利的民族电影工业,也是为了发挥电影的意识形态宣传功能。
1934 年创办了威尼斯电影节。
1937 年建立了罗马电影城,不仅是世界上最大的电影制片厂之一,而且至今还在意大利电影的发展中发挥着重要作用。
第二次世界大战之前,意大利已经发展成为欧洲的电影大国。
纪实风格的盛行。
电影的叙事,拍摄技巧日趋成熟。
意大利电影人提出 “把摄影机扛到大街上去” 的口号,以纪实性的手法进行电影拍摄。
《罗马十一时》
《偷自行车的人》
“意大利新现实主义电影“ 的镜头语言特点也比较突出,其普遍采用长镜头作为表现真实空间的一种手段,同时几乎每个长镜头都能够成为相对完整的一段。
实景拍摄能够实现一种电影化的真实空间表现,同时也避免了舞台观念的戏剧用光。采用非职业演员的做法既是对明星制的否定,也更为突出了电影的真实性。
还惯以去戏剧化的结构进行叙事,即不使用倒叙闪回等复杂的叙事手法,只是按照自然的时间顺序展开故事。从而形成情节松散,结局开放的特点。
还有方言的使用。例如 CIAO 有很多意思,在《我的天才女友》剧中,经常用到,意大利语,有是你好或者再见的意思。
三位大师
通常认为 1945 年拍摄的影片《罗马,不设防的城市》,是 “意大利新现实主义电影” 的开山之作,也是罗西里尼 “战争三部曲” 的第一部。
另外两部是 1946 年的《战火》(被称为欧洲版的《公民凯恩》)1938 年的《德意志零年》
描述的二战时期,意大利地下反抗组织和法西斯斗争的故事。
从《罗马,不设防的城市》开始,“意大利新现实主义电影运动” 就开始形成比较明确的纪实风格与现实主义特点,以及精妙的电影叙事技巧与英雄神话结合的创作思路。
1948 年拍摄的电影《偷自行车的人》是 “意大利新现实主义电影” 的经典之作,也是世界电影史上十大不朽影片之一,该片集中代表了新现实主义电影的美学特征。
也深刻影响了我国第六代电影导演王小帅的创作《十七岁的单车》
《孩子们注视着我们》、《擦鞋童》 、《温别尔托·D》等。
1942 年编剧并导演的电影处女作《沉沦》,而被称为新现实主义之父。《沉沦》改编自詹姆斯凯恩斯的侦探小说《邮差只按两次铃》,影片通过对社会中下层百姓的关注和对意大利贫苦生活的展示,成为意大利新现实主义电影运动蓬勃开展的前奏。
1948 年编导的《大地在波动》。
《大地在波动》是 “意大利新现实主义电影运动” 的重要代表作品,维斯康蒂也正是凭借这部影片,成为与罗西里尼和德·西卡齐名的 “意大利新现实主义电影” 的三位大师之一。
《罗马十一时》、《橄榄树下无和平》
“意大利新现实主义电影运动” 的出现与发展,首先是建立在作为当时时代任务的基础之上,因此当战争逐渐远去,社会主要矛盾随之转移、变化后,即 “意大利新现实主义电影运动” 进入 20 世纪 50 年代,便开始逐渐走向衰落。
另一个原因是其美学基础在时代变革语境下的变化。客观而言,意大利电影的美学基础,并不是新现实主义的朴素风格和严肃,恰恰相反其美学基础是深受意大利即兴喜剧和歌剧影响的电影,宏大浮夸的史诗巨片以及庸俗的电影情节剧等。
“意大利新现实主义电影运动” 的影响力不容小觑,尤其是作为电影纪实美学的成功典范,“意大利新现实主义电影” 彰显了电影作为大众传播媒介的使命和意义。
是世界电影史上继 20 世纪 20 年代的欧洲先锋派电影运动,40 年代的意大利新现实主义电影运动之后,第三大规模的电影运动。
20 世纪 50 年代末至 60 年代初,在法国突然涌现出由一些不知名的年轻人竞相拍摄电影的现象,人们将其称为 “法国新浪潮电影运动”。
深受意大利新现实主义电影纪实风格的影响,尤其是对社会现实和对普通人的关注等,作为第二次世界大战之后全世界规模最大,影响最深的电影运动。法国新浪潮电影运动在短短几年的时间里,在思潮崛起的法国掀起了汹涌澎湃的电影浪潮,并形成了三个影响深远的创作团体。
第一个团体:
是以《电影手册》杂志为阵地,由资深影评人领衔的 “《电影手册》” 派。
第二个团体:
是居住在巴黎塞纳河左岸的职业电影导演,以及一些其他领域的文艺工作者转向拍摄电影的 “左岸派”。
第三个团体:
是以直接记录手法为基本特征进行电影创作的 “真实电影派”。
(一)战争的影响和好莱坞电影的冲击
第二次世界大战结束后,战争的破坏和好莱坞的大量倾销,使法国电影深入重重危机之中。面对这样的状况,同时为了对抗好莱坞电影,法国电影人提出发扬 “优质电影传统” 的口号。
一方面将大量的名著改编为电影,另一方面讲究高成本制作,在电影中强调布景的华丽和陈设的精美,同时推崇明星制。这样拍摄出来的电影,虽然在一定程度上挽救了濒临崩溃的法国电影业,但是僵化的创作模式也使电影丧失了原创价值。以及法国诗意现实主义所特有的清新写实传统。
(二)西方人文主义思潮的蔓延
(三)“法国电影资料馆” 对 “新浪潮电影运动” 的出现起到了决定性的作用
1936 年成立的法国电影资料馆。
再次讲解《罗生门》。
罗生门是日本京都罗城的城门,后来通常被借指人世与地狱之界门,事实与假象之别。
我甚至听说过住在罗生门这儿的鬼,因为害怕人类的凶残而逃走。——《罗生门》电影
背景很重要,《罗生门》是日本作家芥川龙之介1915年创作的短篇小说,情节取材于日本古典故事集《今昔物语》百度百科。那时的日本,资本主义高速蓬勃发展,同时又是一个天灾人祸的乱世。社会动荡,经济萧条,民不聊生,处于京都的罗生门附近都已经是格外的荒凉来自知乎。
你让一个极度贫穷的人,去遵守道德,以及触及了人的利益时,你让他去维持本性,这是很难的。
已经看完罗生门,其实就是一故事,经由了三个人讲述,每个人都美化了自己的行为,最后一个人讲出的事情的真正过程。人心是这样,尤其是在所谓的鬼附身,由死人讲出的话,更是荒唐。和尚代表着一种圣母的存在吧,开始就像太宰治一样,对人充满了失望,太宰治失望的是自己,和尚失望的是他人。就是摆烂,不做行动,懦弱,但怀着一颗 “善良” 的心。
倒数第二场镜头,樵夫那笑容,有点诡异,我觉得应该是后面会把这小孩给卖了,和卖匕首一样。
最后一个镜头是拍到了罗生门那块牌匾,点个电影名字吧。
是法国新浪潮电影运动中,最重要的一个团体。其代表人物有阿斯特吕克、巴赞、特吕弗、戈达尔等。
1948 年第 144 期的《法国银幕》杂志上,发表了《新先锋派的诞生:摄影机——自来水笔》一文,提出摄影机——自来水笔的观点。
指出电影已经成为一种拥有自己的语言、可以自由表达思想情感的工具;正如作家用笔写作一样,电影导演可以用摄影机 “写作” 并表达个人意念。
“摄影机——自来水笔” 成为了 “法国新浪潮电影运动” 的理论先驱。
我的补充(源自《电影批评》):
法国著名的电影理论家、当代电影理论的奠基人克里斯蒂安·麦茨精当的论断:并非由于电影是一种语言,它才讲述了如此精彩的故事;而是由于它讲述了如此精彩的故事,才使自己成为了一种语言。
意大利著名电影导演、理论家帕索里尼在他的电影论文《诗的电影》一文中指出:电影本质上是一种新语言。他认为电影使用的是某种 “表情符号系统”,这一副好系统先于语法而存在,因为 “世界上没有一部形象词典”。以为电影导演必须首先创造他所需的词汇,即选取他的拍摄对象,将其创造为自己的形象符号,尔后方才进入美的创造。
电影语言不通于自然语言。
1951 年法国著名的《电影手册》杂志创办,巴赞在第一期杂志上刊文提出,电影是现实的渐近线的观点,并指出杂志社要以挖掘和扶持电影作者为己任。这些使得《电影手册》很快声名鹊起。巴赞也成为了杂志的核心人而无,还被誉为 “法国新浪潮电影运动” 的精神之父。
时任《电影手册》杂志编辑的特吕弗发表了《法国电影的某种倾向》一文,他在文章中。
1958 年,特吕弗拍摄了短片《顽童》,该片和电影《通往绞刑架的电梯》《漂亮的吉尔塞》 等都成为了法国新浪潮电影运动的先声之作。
1959 年特吕弗拍摄的影片《四百下》获得戛纳国际电影节的最佳导演奖,为法国电影赢得了荣誉,也成为 “新浪潮电影运动” 的标志性作品。
在 1960 年拍摄的影片《筋疲力尽》可以说是石破天惊。
这部影片从 20 世纪 40 年代的美国黑帮片中吸取灵感,从内容到形式都毫无规律可循,随意的拍摄方式完全无视好莱坞电影的经典模式,然而却开启了一个更为自由和个人化的电影创作路径。尤其是戈达尔的电影美学观念,还为场面调度与蒙太奇学派的对立,找到了一条新的出路。以至于法国电影资料馆馆长朗格卢瓦都心悦诚服的认为电影史可分为戈达尔之前和戈达尔之后。
在《电影手册》派创作繁荣的同时,当时生活在巴黎的另外一批电影艺术家,还拍摄出了多部与传统电影叙事技巧大相径庭的影片。由于这些人都居住在巴黎塞纳河的左岸,因而得名左岸派。
下面内容来自维基百科。
在法国巴黎地区,左岸(法语:La Rive Gauche,法语发音:[la ʁiv ɡoʃ])指流经市区的塞纳河南岸地区,塞纳河北岸地区则称右岸。“左岸”具有文化和意识形态意味,并衍生出左岸公社、左岸文化、左岸咖啡等词汇,以及房地产广告中也常用左岸彰显文化品味。
使用情况
在法国,自东向西流动的塞纳河穿过首都巴黎,将巴黎分隔为左右两边。塞纳河以北称为右岸,有许多的精品店及大宾馆。在塞纳河以南的部分称之为左岸。在这里有许多的学院及文化教育机构,以年轻人居多消费也较便宜。拉丁区即是位于左岸。
如图塞纳河南岸即为左岸
巴黎左岸包含了巴黎的六个区:
塞纳河畔,左岸的咖啡?
代表人物有阿伦·雷乃、阿涅斯·瓦尔达、玛格丽特·杜拉斯等。其实左岸派并没有形成一个学派或是团体,他们只是有着长久的友谊,艺术趣味也比较相投,并且在创作上经常互相帮助的一群艺术家。
1959 年《广岛之恋》与特吕弗的《四百下》同时出现在戛纳国际电影节上,虽然只是一部参展影片,但在当时的影响力却非常大。并成为法国新浪潮电影运动的重要代表作品,这不影片根据法国女作家玛格丽特·杜拉斯的同名小说改编。讲述一位法国女演员与日本建筑师之间的爱情故事。阿仑·雷乃在影片中没有正面描写战争的残酷,也摒弃了传统的线性叙事,而是将战争隐藏在爱情故事的背后,在剪辑上也是打破过去、现在、未来的时空界限,以无技巧闪回3的叙事结构淡化了故事的时间界限。
电影《广岛之恋》既具有创作者的独特风格,又带有浓厚的文学气息,被称为是 “西方电影史上从传统时期进入现代时期的一部划时代的作品”。
阿仑·雷乃尝试以无连贯性的情节和意识流的时空跳跃,作为电影表达自我观念的方式。并在 1961 年拍摄出影片《去年在马里昂巴德》,这部充满文学味道的电影,依然是通过拼贴的电影语言,探索真实与虚幻之间的关系,并试图从潜意识层面表现主人公的行为举止。同时,这部现代主义的电影文本还由于电影语言过于晦涩,也被后人不断的解读。
“法国新浪潮电影运动” 的另一个创作团队,“左岸派” 所创作的电影往往被称作 “作家电影”。
具体来说,有以下几方面的特点:
除了上述两种派系,还出现了以现实主义题材见长的真实电影。
“真实电影” 作为一种源于纪录片写实主义的电影类型,在 “法国新浪潮电影运动” 时期,秉承了 “苏联蒙太奇学派” 代表人物维尔托夫的 “电影眼睛理论”,主张摄影机是记录社会生活的眼睛,要摒弃拍摄者的主观认知,从而让表现世界的真实本质。
“真实电影” 继承了 “《电影手册》 派” 即兴创作,周期短、投入低、使用非职业演员等特点。
不同的是,“真实电影” 对现实主义题材的表现要比 “《电影手册》派” 更为彻底。
“真实电影” 还为故事片创作提供了最大限度保持真实性的参考。
如电影《四百下》中对街景的处理,就借鉴了真实电影的创作手法。
“法国新浪潮电影运动” 在 1961-1962 年间达到辉煌之后便迅速衰落。
1962 年底《电影手册》杂志还出版了 “新浪潮专号”,对 “法国新浪潮电影” 进行总结。
拍摄方面
以外景为主,很少在摄影棚内拍摄;外景也多为实景,以凸显电影的真实感。
推崇巴赞的 “摄影机本体论”,即注重电影的照相功能,在实景拍摄中也是利用的自然光、进行肩扛跟拍这种与新闻片拍摄类似的手法。
电影剪辑方面
以镜头直接切换和跳接的方式,取代了原本复杂的快速剪辑,从而淡化了蒙太奇的时空转换功能,有效控制了电影的长度和节奏。
电影产业方面
致力于推动 “导演中心制” 的形成,从而促成新一代法国电影人的崛起。
对欧洲的影响
在欧洲,“新现实主义” 的诞生地意大利,在 “法国新浪潮电影运动” 的鼓舞下,迅速崛起了一批青年导演。如贝托鲁奇、帕索里尼等。
波兰、捷克、匈牙利等东欧国家也受到影响,电影制作风格开始比之前更为简化。
处于战后重建阶段的德国也深受其影响,一批德国青年导演在1962 年发表了著名 “奥伯豪宣言”,开始了 “德国新电影运动”。
对亚洲的影响
首先受到冲击的是日本。在其影响下,以大岛渚和吉田重为代表的日本电影人,先是在 “松竹电影公司” 内部掀起了一场革命,随即扩展到整个日本的电影业。
大岛渚在 1960 年拍摄的影片《日本之夜与雾》 直接套用了法国电影《夜雨雾》的名字。
吉田喜重(吉田喜重,又名吉田喜重)的代表作品《不务正业的人》也是完全借鉴戈达尔《精疲力尽》的电影语言,以表现迷失中的日本青年。
同时,我过第五代、第六代电影导演的创作,也在一定程度上受到法国新浪潮电影运动的影响。
日本电影作为亚洲电影重要切独特的一支,以别具风格的民族美学特征和对电影艺术多样化的贡献,在世界影坛中有着不可忽视的地位。
早在 19 世纪末开始独立拍摄电影时,日本就将 “电影” 改名为 “映画“,从而使电影一开始就具有明确的民族文化特征。
一定程度而言,日本电影并没有真正经历无声片时代。因为伴随着电影在日本出现的,还有一种叫做辩士的职业。
辩士:
指电影的旁白者,其主要的工作是朗诵电影的对白、讲解电影故事;有时甚至还会为了配合某位 “辩士” 的讲解而调整电影的放映。
“辩士” 作为世界电影史上的一种独特现象,是深受日本戏剧影响的结果。
日本传统的 “能乐”、“歌舞伎”、“偶人净琉璃” 等,其表演和演唱分别都由专人担任,同时还有专人负责评述剧情,即视觉和声音的表演分工明确,这种手法被借用到电影中,就出现了辩士。
默片与 “辩士” 的组合,其实就是日本戏剧 “声画分离” 模式的延伸,因此日本观众对此十分熟悉切适应。 这种艺术形式,本质上暗合了布莱希特的间离派理论。
我想起了一部电影《默片解说员》,算是喜剧吧。
20 世纪 30 年代,有声片的出现使日本电影呈现出全新的面貌:
(一)“辩士” 遭遇到了淘汰
(二)日本出现了有声片的创作高潮
松竹、日活、东宝等电影公司都争先恐后的创作有声片。沟口健二、小津安二郎等在无声片时代就具有一定影响力的导演,也都积极投入有声片的创作。还有后来的黑泽明也在 40 年代初进入了日本影坛。在第二次世界大战之前的几年,日本已经发展成为了世界电影大国。第二次世界大战结束的最初几年,作为战败国的日本被美国控制,直到 1951 年美国从日本撤离后,日本电影才又开始重新开始独立发展。
不仅有黑泽明、市川昆等老牌电影导演继续活跃在影坛,他们勇于尝试新技术,寻找电影表现的突破,甚至还为了寻求资金将目光投向国外,邀请外国制片商投资。而且还有今村昌平、大岛渚、新藤兼人、筱田正浩等二战期间涌现出的新导演。他们也以多样化的创作丰富了日本电影的艺术表现。
战后的日本经济在美国扶植下逐渐恢复,科技进步也非常迅猛,这就给电影的发展带来了良好的契机。于是,在现代特技效果流行的背景下,日本出现了以视觉奇观为核心的商业动作大片创作热潮。
东宝:1954 年 《哥斯拉》(教程上这里应该有出入)
哥斯拉(ゴジラ Gojira ?,英語:Godzilla),為日本東寶株式會社製作的怪獸,日本影史上最悠久,世界影史上公認最經典最有名的怪獸角色。
最早的哥斯拉是一部受到美國《金剛》影響的怪獸電影,描述受到輻射污染的海域中出現一隻身高達50公尺的怪獸哥吉拉。哥吉拉後來成為日本類似電影、動畫、漫畫的怪獸原型,對於日本動漫作品的怪獸形象有非常深遠的影響。
怪兽片从此也成为日本最具特色的电影类型。
老牌的电影公司还在不断寻求能够留住观众的电影类型。
如松竹公司就拍摄了寅次郎的故事系列电影,并从 1969 年到 1995 年间连续拍摄了 48 部,创造了世界电影史上,由同一个演员主演系列电影的数量之最。
此外,那些富有神秘色彩的日式惊悚片,想象力丰富且制作精良的动画片等,也都逐渐成为了极具日本特色的电影类型片。
《你的名字》的鉴赏
日本电影人物众多,创作风格也各有千秋,而在国际上影响力最大的,是三位殿堂级的人物。
小津安二郎
最能代表日本电影民族特色的导演;
宁静、悠远的美学风格;
被视为真正的古典主义。
大多聚聚焦普通日本人的日常生活状态,尤其擅长对家庭成员之间的关系进行细致入微的描写,故事常以传统日本家庭在现代化进程中受到的冲击为主要矛盾。
第一种,表现父母与儿女之间的关系。
大多是描写儿女婚姻问题所引发的情感波澜,而在实质上反映日本传统价值观中的亲情和责任问题。
代表作品如
《晚春》
《彼岸花》(推荐)
《麦秋》
《秋刀鱼之味》(推荐)
第二种,是表现就在社会转型过程中,随着传统大家庭的解体,儿女对父母绝对服从观念的淡化所引发的关系变化,于是年轻人变得以自我为中心,年迈父母常常陷入孤独和失落,因此影片大多充满淡淡的忧伤和凄凉。
代表作品
《东京物语》
《浮草》
《小早川家之秋》
第三种,是表现夫妻之间的情感矛盾。
尽管影片中的夫妻由于各种原因产生不和,但都以彼此原谅、婚姻和家庭也都得到维护为结局,即完全符合东方文化中 ”相濡以沫” 的婚恋观。
代表作品如
《早春》
《茶泡饭之味》等
这些影片大都以顺序的方式叙事,很少有闪回等时空变化,而旨在以最自然的方式将故事娓娓道来;同时台词也极其散淡平实,达到了一种 “言有尽而意无穷” 的效果。
无论是战前还是战后,小津安二郎的电影都远离政治风云,只是通过对现实生活和市井人物的细腻描绘,即为质朴的表现出日本社会在 20 世纪的变化。尤其是传统观念与现代观念的碰撞与融合。
《东京物语》鉴赏
首先,他惯用于使用低角度的机位,以 30 度的左右的仰视角度拍摄人物。因为这个角度既符合日本席地而坐的习惯,也体现出日本民族讲究礼仪的谦恭态度。
其次,小津安二郎偏爱使用静止的长镜头,拒绝戏剧化的蒙太奇和复杂运动镜头。
在拍摄人物对话时,多以正面为主,并直接切换,不刻意制造剪辑点,一切以平实为基调。
场景多为室内,即传统的日本民居,并巧妙利用室内门窗或家具的线条来展示电影画面构图的美感。
《秋刀鱼之味》鉴赏。
作为古典主义大师,其电影的最大价值就是对日本传统文化内涵的准确表达,而非流于表面的符号堆砌。可以说,是小津安二郎让日本电影发出了最民族的声音。
黑泽明的电影具有较强的现代性,同时电影的形式和内容,也都更具创新和国际视野。甚至开创了世界影坛的风气之先。
在电影选材方面,黑泽明涉猎较广,从古装时代剧到社会问题剧,甚至先锋实验性质的电影都有创作。
1990 年,80 岁的黑泽明获得了第 62 届奥斯卡终身成就奖。成为第一位获得该奖项的亚洲电影人。也是在这一年,黑泽明自编自导了一部极具先锋实验性的影片《梦》。
该片以
太阳雨
桃园
风雪
隧道
乌鸦
红色富士山
垂泪的魔鬼
水车之村
八个梦贯穿了几乎人类社会的所有主题,同时黑泽明还对不同梦境中的不同场景,配合了不同的色彩。
黑泽明的电影时而呈现出强烈的运动感,时而又尝试极具抽象意味的长镜头,种种变化使其影响风格与传统的日本电影有了很大的区别。黑泽明对电影视听语言的探索超越了国界,启发了全世界许多导演的灵感。
如星球大战系列电影就深受其影响。
黑泽明电影虽然与日本歌舞伎的叙事传统相距较远,但却更符合西方戏剧的精神内涵:表现个人对命运的挣扎与反抗。
黑泽明的多部电影都改编自西方名著,如
黑泽明的电影还渗透着西方的 “现代性” 思想。
电影《罗生门》就通过几位当事人对同一件事情的不同叙述,表现出人对世界认识的相对性及所谓真相的不可知。
这种结论与伯格曼,费里尼等欧洲现代主义电影作者所传达的理念有很多相似之处。
黑泽明还拍摄了多部反映社会现实问题的影片。
如《生之欲》《八月狂想曲》等。
这些影片具有高度概念化的抽象意味,除了少数流露出悲观的情绪之外,大多是以慈悲和宽容的胜利告终。这种价值观具有一定的国际视野,也是黑泽明被世界影坛推崇的原因之一。
黑泽明电影虽然与纯粹的日本电影有所不同,但又绝不是对西方电影的简单模仿。
20 世纪 90 年代,北野武的横空登场震动了平静许久的日本影坛。其特立独行的影响风格,别具一格的剪辑手法,虽然让评论一时哑然,但都不得不认可他的才华与创造力。
《菊次郎的夏天》里面的坏大叔,就是北野武。
多用蓝色作为多部电影的基调,以表现人物的特殊心理状态,并成为了他独特的个人标志。
北野武特别热衷于表现暴力,同时这种暴力又都是突如其来的发生,不带有任何美化和温情的处理;在处理打斗动作时,电影画面往往突然定格,以突出动作的震撼力。
北野武的电影镜头经常也是随心所欲的移动,跟随主人公漫无目的的闲逛。
有时甚至还会在一系列的连续动作中突然切换到另一个画面。
与此同时,绘画、文字、照片等也都经常随意出现在北野武电影画面中,被用来构成叙事。
在北野武的电影中看不到日本传统歌舞伎表演的影子,但是随处可见驾轻就熟的黑色幽默与尖锐深刻的讽刺。
北野武电影中的人物往往是孤独与茫然的,故事中也很少有人道主义的精神胜利,主人公看待世界的眼也常常是冷酷、悲观的。如《菊次郎的夏天》
北野武的电影还有着明确的当代日本文化体现。
虽然游戏式的拼贴掩盖了那些外在的日本电影特征,但对情感的收敛表达,对死亡的迷恋,以及日本传统文化符号,深受日本漫画影响的电影桥段等,都能够让观众联想到混杂了多种文化基因的当代日本文化。
特点:“唯美与残酷” 的相伴而生。
这种矛盾既体现在单独的影像文本中,也体现在导演的个人创作中。
如女性电影大师沟口健二的多部影片
《西鹤一代女》《雨月物语》《近松物语》总是将美好的主人公残忍的推向不幸,而似乎只有在施虐和折磨中,才能凸显出主人公的外表美和人性美。
日本受自然条件等影响,地震等灾害频发,于是那些美好的事物很容易在瞬间被毁灭。正如日本电影中频繁出现的樱花的象征意义。瞬间的绚烂和霎那的凋谢。
《你的名字》鉴赏
也正是这种绝望之美,使日本电影中的唯美总是与残酷相伴,尤其是在爱情片中,电影创作者往往在用尽笔墨刻画男女主人公的情感之后,总会有突如其来的离别或是死亡,这一模式在电影中多次出现。
如《伊豆的舞女》《雪国》《失乐园》等。
特点:“含蓄与直露” 并存的情感表达。
日本导演总是通过对男女主人公表情神态的准确把握,巧妙的通过镜头设计来含蓄的传达人物情感。与含蓄的情感表达相对,日本电影并不忌讳对暴力的直接呈现,尤其是在武士题材的电影中,暴力元素已经深深扎根。如北野武的代表作《座头市》等。
与世界其他国家的电影相比,日本电影的抒情性非常强烈,十分重视自然景物在电影中的作用,如四季的更迭,气象的变化等都在电影中得到了充分的体现。
许多日本电影直接以自然景物或四时季节命名,如《浮草》《麦秋》《八月狂想》《那年夏天,宁静的海》《细雪》等。
与中国的古装片类似,日本电影还从本国文学作品文学和民族剧中吸收了很多素材,“古装时代剧” 作为日本一种长盛不衰的电影类型,其服装、道具、台词、表演等都具有浓重的民族文化特色。
究其原因,虽然日本的生活方式已经相当西化,但日本人的行为举止却保留了很多传统特色,如鞠躬、点头、跪坐等;这些程式化的繁琐礼节深刻影响着日本电影在世界影坛的形象,并成为日本电影名族性的基本表现。
《战国英豪》《椿十三郎》
1896 年,“电影之父” 卢米埃尔兄弟派几名技师来远东地区放映电影并拍摄一些风光素材,第一站便到了香港。
随后,美国人在上海创办的亚细亚影戏公司也来到香港。1909 年拍摄的由香港那人梁少坡导演并主演的故事片《偷烧鸭》,开启了香港本土电影的制作历史,同时,也开启了“警匪片” 的制作历史。
1913 年出现了完全由香港人创作、香港公司出品的第一部影片《庄子试妻》是香港电影史的正式开端。
黎民伟编剧并主演,由黎北海主导。
香港电影的各个时期
出现了一批实力雄厚的电影制片机构:长城、凤凰、邵氏、中联、电懋等。
代表性导演:朱石麟、李翰祥等以及一批艺术水准颇高的电影佳作。如
《一板之隔》《貂蝉》《江山美人》《故园春梦》 这些作品大多取材于历史,且常与戏曲等传统艺术形式相结合,体现出一种华丽精致的戏剧式风格。
四十年代作为亚洲四小龙的香港,经济空前繁荣,成为极具规模的现代商业都市,西方文化观念经由各种传播媒介,大量涌入香港人的视野,逐渐被香港大众,尤其是新一代香港人所接受。香江文化和西方文化的碰撞,触发了香港新浪潮运动。
一大批热爱电影的年轻人在国外接受了正规的电影教育。
就读伦敦电影学院的严浩,就读于美国德州大学奥斯丁分校电影专业的徐克,就读于南加州大学电影专业的方育平等,谭家明也曾于1975年被派往美国旧金山进修电影制作,他们把在海外学到的先进的电影理念和新颖的叙事技巧引入香港本土电影题材。创作出一批令人耳目一新的影片,开创了香港电影前所未有的新局面,这成为新浪潮电影运动强有力的思想支柱和人才保障。
电视机构对创作人才的锤炼
方育平、徐克、严浩、谭家明、许鞍华等曾在电视机构担任编导,一方面通过电视剧、电视电影等创作技巧,另一方面广泛而深入地了解香港当代社会的形态和心态,为新浪潮电影运动的到来作了艺术和题材上的准备。
电影杂志《电影双周刊》的摇旗呐喊,也是新浪潮电影运动得以兴起的重要推手。
该杂志,通过对年轻电影人及其作品的评介鼓励,促进了社会各界对新浪潮电影运动的关注和认同。 该杂志海创办了香港电影金像奖。第一届到第四届的最佳影片奖,全部由新浪潮电影运动的作品包揽。
分别是《父子情》《投奔怒海》《半边人》《似水流年》,这对新浪潮电影运动的其他年轻导演,无疑是巨大的鼓舞 。
在以上几个原因的推动下,香港新浪潮电影运动应运而生,并成为当代香港电影史上最重要、最具国际影响力的电影革新运动。
1978 年,“无线” 电视台的严浩和余允抗与电影导演陈欣健合组 “影力公司”,拍摄了被公认为 “新浪潮” 电影运动开山之作的《茄哩啡》。
茄哩啡是粤语俗是“跑龙套”,kelefe是广东话的说法。
小人物,误打误撞变大明星,喜剧方式呈现。
《夜车》《公子娇》《似水流年》成为香港新浪潮电影运动的代表人物。
在 1981 年执导的《父子情》,1983 年执导的 《半边人》 分别夺得香港电影金像奖第一届、第三届最佳影片奖,同时也是香港新浪潮电影运动的代表作品。
《父子情》一改传统香港电影华丽精致的戏剧式风格,代之以自然平实的叙事和清新恬淡的影像风格,在娓娓道来的凡人琐事中,展现香港平民生活的真实质感,体现出法国新浪潮电影运动的影响。
1979 年到1980 年,徐克拍摄了《蝶变》、《地狱无门》、《第一类型危险》三部风格奇诡的影片,成为新浪潮电影中最特别的代表作。
这三部影片表面上都有一个商业类型片的外壳,但在叙事及拍摄手法上却是对类型片的颠覆。
《蝶变》刻画了一个混乱的武林世界,颠覆了香港传统武侠片中的侠义江湖。
《地狱无门》则刻画了一个“吃人”的世界,充满当时对当代香港社会的影射和隐喻。令人不免想到鲁迅先生的狂人日记。
1979 年《疯劫》,用创新的艺术手法,讲述了一桩扑朔迷离的杀人案件。其中,大量使用的自然光效,心里化叙事手段等现代电影技巧,赋予传统惊悚类型片一个全新的面貌。并传达出导演对当代香港社会女性出镜的思考。
之后,相继执导了《撞到正》、《胡越的故事》、《投奔怒海》等经典影片。
除了以上代表人物以外,章国明、谭家明、冼杞然、翁维铨、于仁泰 、卓伯棠等年轻(当时年轻)导演们也推出了新作,他们的作品迅速在香港影坛掀起了一股奔涌的浪潮。以新颖独特的艺术成就,影响着香港电影的整体创作态势。
题材选择
“新浪潮” 电影与传统商业电影逃避现实的态度不同,而是选择直面香港社会现实问题,注重对香港本土风貌的展示,注重对个人经验和集体回忆的书写,也关注女性命运,对国家、民族、海外华人等重大议题也并不回避,在思想内容上极大提升了香港电影的内在品质。
电影类型
“新浪潮” 电影打破了此前香港电影的类型藩篱,大胆地对不同的类型元素进行重新组合,翻新了一些旧有的类型片,创造了一些新的类型片,使香港电影呈现出类型丰富、形式多元的新格局。
艺术风格
新浪潮电影导演特别重视电影叙事模式的革新和电影语言的重建,他们把从西方现代电影中学习来的新浪潮电影叙事手法和视听语言技巧完美地融入本土题材,创造出与传统商业电影迥然不同的艺术新风格。
香港 “新浪潮” 电影运动从整体上提高了香港电影的思想性和艺术性,带动了香港本土电影的复兴,提供了艺术与美学上的新观念,客观上完成了从粤语片传统的伦理套路到现代电影关于人性、生命、社会等普世价值观的过渡。
同时,也为香港电影业输入了大量的人才,并促成了电影机构的新兴和调整,改善了香港的影视文化环境,堪称香港电影史上最重要的一次电影革新运动。
这两大事件标志着台湾电影陷入低谷期,亟(jí)待新的血液。
1965 年创刊的《剧场》杂志,1917 年创刊的《影响》杂志,都曾用大量的篇幅介绍欧洲电影,为 80 年代台湾电影的出现奠定了理论基础和人才基础。
1979 年第 16 届金马奖开始增加国际影展部分,不但使青年电影人获得更多接触欧洲电影的机会,而且还培养了一批高素质的观众。
20 世纪 60 年代是台湾商业电影的黄金年代。吸引了很多年轻人到欧美国家攻读电影专业,如就读于美国加州大学的电影科的杨德昌,就读于美国纽约州雪城大学电影研究所的柯一正,就读于美国哥伦比亚影艺学院系的万仁等。他们在七十年代学成归来,为台湾电影带来新的观念和方法。
在六、七十年代进入电影界、曾追随过健康写实主义电影导演的本土新生代,如陈坤厚、侯孝贤、张毅等,也组成了新的电影创作阵营。他们经过台湾媒体对欧洲电影的评介,以及金马奖国际影展对新电影的知识,技巧的普及,与海外归来的新导演在电影创作理念的沟通上毫无隔阂。
1983 年,“中影” 公司大胆起用年轻作家小野、吴念真组成 “二人小组” 负责选报题材,并审核或参与别人创作的题材。使战后成长的一代,第一次有机会进入电影体制的决策层,对新电影的产生和发展也起到重要作用。
1980 年 10 月,在金马奖活动期间,台湾 “新闻局” 在电影图书馆举办了 “香港新锐导演作品观摩座谈” 活动,邀请徐克、谭家明、许鞍华、严浩、梁普智等 7 位 “新浪潮“ 导演携作品参加,与台湾影人进行交流,大大鼓舞了年轻电影人。
1982 年夏,杨德昌、柯一正、陶德辰、张毅联合执导了四段式集锦片《光阴的故事》成为新电影的滥觞之作。四个短片分别为《小龙头》《指望》《跳蛙》《报上名来》,通过讲述四个人生不同阶段的故事,表现人的成长,人际关系的演变,和过去三十年里台湾社会形态的变迁。这部影片奠定了新电影运动的基本特色。
低成本的投资
“成长与历史” 的主题
写实清新的影像风格
1983 年,曾壮祥、侯孝贤、万仁联合执导了三段式集锦片《儿子的大玩偶》,成为新电影运动的另一部代表作品 。三个短片分别涉及三个主题,
《小琪的那顶帽子》
以美丽女孩小琪帽子下丑陋的疤痕影射台湾经济繁荣的背后遭受到来自日本的经济侵略。
《儿子的大玩偶》
通过男青年坤树为电影院做活动广告人的故事,展现台湾从农业社会向工业社会转型之际小人物艰难谋生境遇。
《苹果的滋味》
则以一个充满荒诞感的故事展示了朝鲜战争爆发之后台湾对美国经济援助的依赖以及这种依赖对普通台湾人心理的影响。
在台湾新电影运动中的诸多代表人物之中,有以侯孝贤和杨德昌成就最高,影响最大,堪称运动的两大旗手。他们分别从乡村和城市两个角度,记录了台湾社会的沧桑巨变。
侯孝贤生于广东,1948 年移居台湾。1972 年毕业于台湾 “国立艺专” 影剧科。
他的创作以乡土台湾为起点,对于台湾自身的 “根性” 和历史性发出追问,是 “台湾意识” 强烈外现的重要历史标尺,被称为 “记忆与乡土的书写者”。
代表作有:书写个人成长记忆的 《冬冬的假期》《童年往事》对于乡村文明与现代都市文明进行比较的《风柜来的人》、《恋恋风尘》(推荐)、《尼罗河女儿》。构筑族群历史记忆的《悲情城市》、《戏梦人生》、《好男好女》等。
其中《悲情城市》以 二·二八事件为背景,讲述了台湾林氏兄弟四人的遭遇和生活,获得威尼斯电影节最佳影片金狮奖。
滥觞,是一个汉语词语,读音为làn shāng,本谓江河发源之处水极浅小,仅能浮起酒杯, [1] 后比喻事物的起源和发端。 [2] 出自《孔子家语·三恕》:“夫江始出于岷山,其源可以滥觞。”
杨德昌出生于 1947 年,逝世于 2007 年。大学期间学习控制工程,后到美国学习电脑并获得硕士学位,1981 年回到台湾。
代表作品
八十年代《海滩的一天》《青梅竹马》《恐怖分子》
九十年代《独立时代》《麻将》《一一》
杨德昌的电影大多立足于都市,聚焦于现代人物质生活丰富和精神空虚的矛盾、人性的 “异化” 之痛和疏离之悲等主题。
他试图通过电影戳破现代人伪善的面具,发掘那些纯粹天真的东西,因此被称为 “现代都市文明的省思者”。
拍摄于 1991 年,被称为台北三部曲前传的《牯岭街少年杀人事件》,代表杨德昌电影事业的高峰。这部影片改编自 20 世纪 60 年代初的一起真实杀人事件。讲述了家世良好,学习优秀,性格温顺的乖乖仔小四,因为爱上了社会关系复杂的女孩小明,因此陷入到鱼龙混杂的帮派斗争之中。最终沦为杀人凶手的故事,表面上来看这只是一部少年犯罪的影片,但实质上揭示的却是台湾经济起飞时期,社会的动荡、政治的残酷、人性的异化。最终获得金马奖最佳影片和最佳原创剧本两个重量级奖项。
台湾新电影运动在追求电影的思想性和艺术性时,却忽略了电影的大众性、娱乐性、商业性和观赏性。导致台湾观众对于本土电影的反感甚至厌恶,转而投向好莱坞大片的怀抱。这种情况不仅导致了新电影运动在80年代中后期逐渐衰微,而且导致了观众对本土电影失去信心。
自 1985 年起,台湾产量与发行量较多的电影公司产量不断萎缩,本土电影的票房一路下滑,所以有批评者认为 “新电影运动害惨了台湾电影”。
1998 年,台湾电影产量不到 20 部。2006 年台湾电影的市场占有率仅有 1.62%,而美国好莱坞电影则占据了 95% 以上的电影票房。
台湾新电影运动以其鲜明的内容和形式特色在华语电影史上写下浓重一笔。
在题材上,台湾新电影运动不再像言情片和武侠片那样逃避现实,而是努力从日常生活细节或事既有的文学传统中寻找素材,以无比诚恳的态度为当代台湾人的历史、生活及心境塑像。
《儿子的大玩偶》鉴赏
在形式上,不强调完整的戏剧结构和情节,善于用散文方式结构剧情,注重用声、光、影像来表达内涵,通过平凡普通的生活细节和场景片断抒发情感,表现出一种清淡、雅致的艺术风格,给观众留下充分的思索空间。
主要体现在
《童年往事》鉴赏(推荐)
片断:整体中的一部分,零星而不完整。如:「对于老家,仅剩片断模糊的记忆。」也作「片段」。
台湾新电影运动与大陆的第五代影像革命、香港新浪潮电影运动并称当代华语电影史上最重要的三次电影革新运动。
所谓电影工业,是指 “制片”,“发行”,“放映” 的工业体系。
电影产业则不仅拥有经济属性,而且拥有社会文化属性。
世界电影工业形成了以美国好莱坞为中心,印度宝莱坞和你离日亚的尼莱坞等为中间梯队的格局。
好莱坞电影工业的发展主要经历了 20 世纪三四十年代的 “经典好莱坞时期” 和六七十年代的 “新好莱坞时期”。
虽然这两个阶段的电影工业有着不同的发展背景,亦呈现出不同的面貌。但在制作、发行、放映三个环节都有这强烈的好莱坞电影工业风格。从而不仅称为美国社会经济的重要支柱,而且深刻影响着其他国家的电影生产。
地理学上的好莱坞诞生于 1908 年初,当时导演弗兰西斯鲍格斯为拍摄电影《基督山伯爵》和摄影师来到洛杉矶郊外的这个荒凉村落,建立了第一座摄影棚。当时出售这块土地的人随口命名为其好莱坞。
1905 年,美国第一家专门放映电影的剧院在宾夕法尼亚州的匹斯堡开张,因其入场费只需一枚五分的镍币而得名 “镍币影院”。
凭借着低廉的价格,镍币电影院开创的早期电影放映模式大获成功。并推动美国电影放映业的快速发展。直到 1910 年,镍币影院才被更大更豪华的电影放映厅逐渐取代。
1908 年,美国第一个电影 “托拉斯” 组织,爱迪生的 “电影专利公司” 成立,该公司由美国爱迪生公司(就是那个搞发明的爱迪生,排挤特斯拉的那位)和沃格拉夫公司等七家公司和法国的百带梅里爱两家公司联合组成。
“电影专利公司” 从各种电影技术发明者那里取得了 16 项专利权,获得了电影胶片唯一生厂商 “柯达公司” 的专卖权。
关键还在于,电影专利公司还借助法律对相关行业进行控制与垄断。
同时,该公司在 1910 年成立了专门负责发行的通用影片公司,从而全面控制了美国的电影业。
“电影专利公司” 这种将制片、发行、放映通过合并、兼并或是购买股权、签署协议等方式集中在一起的垂直整合方式,有效的形成了一种 “纵向垄断”。
夺笋啊。
然而,这种垄断却引发了美国独立制片商和发行商的极大愤恨。而当时的好莱坞不仅拥有四季宜人的气候,价格低廉的劳动力和复杂奇特的地形等。关键是,远离纽约和芝加哥又临近墨西哥边境,即电影专利公司一旦提出诉讼,他们很快就可以逃离美国。
在这样的背景下,众多电影公司便纷纷涌进好莱坞。
“电影专利公司” 从 1912 年开始丧失在美国电影市场的优势,直到 1917 年彻底消失。究其原因:
后面好莱坞的八大电影公司,最初都是从放映业开始逐渐扩大影响力和控制范围。
1913 年,卡尔·莱默尔在好莱坞建立 “环球影城”,标志着好莱坞电影从 “手工作坊” 转变为 “工业化生产”;随后影响遍及全世界的 “八大电影公司” 逐渐形成。这八大电影公司包括 “五大” 和 “三小”。三小。。。。
五大
派拉蒙(山峰)
华纳兄弟(WB)
米高梅(🦁️狮子头的那个)
福克斯(20th 的那个)
雷电华(在1930年代和1940年代,雷电华出品了许多著名影片,如《公民凯恩》《美人计》《白雪公主》《风云人物》《金刚》等。1950年代开始衰退,逐渐退出了电影界,最终转向了电视方面的发展。)
这五家公司不仅控制了制片业,而且拥有最具吸引力和最高票房的影院。它们在美国各大城市争夺观众,并划分了各自的影院势力范围。
三小
是指制片和发行规模都比五大公司要小的。
在 20 世纪 30 年代,好莱坞遭遇经济危机时,摩根和洛克菲勒两大财团,控制了除华纳兄弟之外的七家定影公司,也正是由于两大财团的介入,使得八大公司之间的关系盘根错节,即根本不可能展开真正意义上的竞争,也不可能彻底垄断市场 。于是在互惠互利的情景下,八大公司逐渐形成了,制片、发行、放映的横向联合。
总体来说,由于这种严密的 “纵向垄断” 与 “横向联合”,使得好莱坞在 20 世纪三四十年代不仅包揽了美国电影 90% 的产量,而且有效排挤了独立制片公司和外国电影公司,其产量占据当时全世界的 60%。
20 世纪 20 至 50 年代,大制作片厂制度在好莱坞逐渐形成,其囊括了流水线的生产方式、制片人中心制、明星制度、学徒式的人才培养机制,和以海斯法典为核心的审查机制等基本要素。
关于海斯法典的,上面提到过,1930 年颁布的。
电影制作守则(Motion Picture Production Code)是1930年至1960年适用于美国电影的行业道德规范,由于时任美国电影制片人与发行人协会主席为威尔·海斯,该守则又被称为“海斯法典”(Hays Code)。在海斯的领导下,美国电影制片人 与发行人协会,即后来的美国电影协会于1930年采纳了该守则并从1934年开始严格执行。该守则详细说明了在美国面向公众,什么样的电影可以接受,什么样的电影不可接受。1968年,电影制作守则被美国电影分级制度代替。
大制片厂的最大特点是流水线(Pipeline)的生产方式。1908 年美国人福特开创性以流水线生产方式,通过组装配件进行汽车生产,从而极大降低了成本,也使大规模的批量生产成为可能,被誉为现代大机器生产的代表。
1913 年,美国独立制片人兼导演托马斯·英斯意识到这种生产方式的价值,便建立了类似的电影生产模式,从此 “流水线的生产方式” 就成为了好莱坞电影工业的标志。
随后,在好莱坞的鼎盛时期,这种方式不断成熟。从而既保证了片源的丰富与稳定,又催生了电影类型片的出现。在这种流水线的生产方式中,导演对电影的整体把控权被剥夺了,取而代之的是强化了制片人的控制权,即形成了制片人中心制。
制片人中心制
“制片人中心制“ 突出了制片人在实现电影商业价值过程中的关键性作用,因为制片人可以根据电影的市场状况,随时更换演职人员,甚至还可以任意更改剧情。
好莱坞制片人中心制的经典案例,就是在 1939 年拍摄电影《乱世佳人》时,制片人塞尔兹尼可就曾经先后撤换了三、四位导演。在制片人中心制下,制片人不仅可以撤换导演,也可以随意更换演员。因为大制片厂制度中的演员是获得电影票房、赢得商业利益的重要保证。于是这就意味着制片人既可以发现和捧红某个明星,也可以在一夜之间毁掉某个明星,即形成了好莱坞独有的明星制度。
明星制度
好莱坞的 ”明星制度“ 有两个方面含义:
一是 ”明星签约制“,指通过签订合约使用明星隶属于某个制片公司,而当时明星的签约年限一般都在七年以上,因此明星往往就成为了某个公司的财产。
二是指大制片公司在进行某些重要的电影创作及宣传时都要围绕明星展开,而旨在使明星成为电影的品牌。
特点
“大制片厂制度” 下的好莱坞以 “学徒制” 作为培养电影人才的主要模式。从本质上来看,这种人才培养机制只是教会这些人如何快速融入好莱坞的 “大制片厂制度”,其同时促成了好莱坞电影类型片产生与繁荣。
“学徒式的人才培养机制” 很容易造成电影人创造力的枯竭,因此好莱坞总是想方设法从欧洲和其他国家挖掘成熟的导演,或是成名的演员等,以补充自身人才培养的缺陷,从而既能够保证好莱坞电影工业的延续,又能够使电影创作不断获得新的灵感与资源。
好莱坞大制片厂生产的电影,在上世纪三十至六十年代深受《海斯法典》为核心的审查机制的影响。
海斯法典
是美国在 1930 年颁布的限制电影内容的审查法规;该法规由时任 “美国电影制片人和发行人协会” 主席的威尔·海斯执行,所以被称作 “海斯法典”。
《海斯法典》主要有 3 项基本原则和 12 大项禁止的内容。如遵守禁酒令、不得宣扬烧酒、不可详细描述谋杀、盗窃、抢劫的方法等。
著名的《海斯法典》案例,就是希区柯克在 1946 年拍摄电影《美人计》时,鉴于法典规定吻戏不能超过三秒,于是就让男女演员吻三秒停一下再吻。最后电影中的加里格兰特就抱着英格丽褒曼,连续并间断的吻了两分半钟。
《海斯法典》在当时对美国电影的影响极大,从 1930 年到 1960 年的每一部影片都要严格遵守其规定。
1966 年伊丽莎白·泰勒主演的《灵欲春宵》上映,这部获得 13 项奥斯卡提名的影片由于有大量的粗口,第一次明确标出:“18 岁以下观众需要父母陪同观看”。
以《灵欲春宵》这部电影为节点,《海斯法典》在 1966 年正式废除,取而代之的是美国 “电影分级制度”,从此美国电影翻开了全新的一页。
值得一题的是,好莱坞大制片厂制度还引进了观众学研究。
20 世纪 40 年代,由于海外市场的丧失等原因,好莱坞电影的整体市场份额有所下降,为了继续保持对电影市场的控制优势,好莱坞的大制片公司便引入了观众学研究。最早进行电影观众学研究的关键人物是乔治·盖洛普。
盖洛普在 1938 年底到 1939 年初针对电影《乱世佳人》的观看兴趣分析中,发现了一个问题,很多人都读过《乱世佳人》的小说,但其中绝大部分都没有打算去观看这部改编电影,同时还有约三分之二的人不知道影片主角的扮演者是费雯丽 。基于观众调查的情况,盖洛普告诉这部电影的制片人,一方面要把《乱世佳人》拍成彩色片,另一方面要将宣传重点放在女主角费雯丽身上。也正是得益于盖洛普的观众学研究,《乱世佳人》才创造出了世界电影史上的票房奇迹和艺术奇迹。
上述这些大制片厂的特点,共同促成了好莱坞电影类型片的出现与繁荣。其实,好莱坞大部分类型片在上世界 20 年代末就已经初具规模,到 30、40 年代更是占据了统治地位。
当时最经典的类型片有:
关键在于好莱坞还采用热潮更替的方式进行电影类型片的生产,即在观众厌烦了某一种类型之后,会及时更换为另一种类型,如此周转不息的反复轮换,从而保证好莱坞电影一直都是观众的观看热点。
大制片厂制度下的好莱坞电影工业,在发行发面针对国内市场和国外市场采用了不同的策略,以保证其电影发行的长盛不衰。针对国内的电影发行,好莱坞首先以垄断的方式打击独立制片商和外国电影势力。
当时好莱坞八大电影公司主要有三种方式操纵电影发行:“成批订片” “盲目订片” 和签订有利于发行商的租片合同。
是指放映商要想购买某部由大明星主演的影片,就必须同时购买一部由一般演员主演的影片。即使明知道这些电影会亏本,但为了获得明星主演电影的发行权,就不得按照制片公司的要求去批量购买。
最早出现于 1916 年的派拉蒙公司,后来发展为好莱坞的一种电影发行惯例。尤其是大制片公司都会利用明星的影响力,强制搭售一般的影片。
要求放映商在没有看到电影之前,就必须签订放映合同。
“成批订片” 和 “盲目订片” 作为好莱坞 “大制片厂制度” 的产物,能够有效保证制片这个最不稳定、风险最大的行业获得稳定的收入,刺激制片公司将更多的精力用于制片而不是发行和放映,从而保证 “大制片厂制度” 的稳定运行与经济效益。
然而这种一揽子交易也在相当程度上损害了独立放映商的利益,同时也限制了外国电影进入美国。
针对国外的电影发行,早在第一次世界大战期间,好莱坞就以低价销售的策略,轻而易举的占领了外国市场。
指好莱坞大制片公司通过海外代理机构,以低于竞争对手的价格将电影租给当地放映商,从而控制其它国家电影发行的策略。
为了保护本土电影市场,20 世纪 20 年代的欧洲不断开展抵抗好莱坞电影的运动。
好莱坞当然不会示弱。
一、美国政府对其全力支持,不仅帮助好莱坞制定合理的出口政策,还通过贸易谈判等为电影出口进行辩护。
二、”八大电影公司“ 也通过设立办事处等进行国外的电影发行,并以投资的方式控制其它国家的电影企业。
三、美国民众也抵制外国电影的进入。
1922 年德国表现主义电影的经典之作《卡里加里波士》在洛杉矶举行首映时,美国民众就因为担心电影市场落入德国手中,而展开了强烈的抗议活动。关键在于,好莱坞还不断挖走其它国家的优秀电影人才。
如对德国电影人才的引进,20 年代中期,弗里兹·朗、刘别谦等优秀的德国电影人相继离开德国去了好莱坞。到 30 年代,更多的欧洲电影人为躲避法西斯的迫害纷纷前往好莱坞,这样虽然给好莱坞带来了全新的艺术理念和创作资源,但是确使本国的优秀电影人才流失,从而不再可能与好莱坞形成竞争。
除了在制片和发行发面特点鲜明。
好莱坞 “大制片厂制度” 中的 “放映” 也形成了自己独特的方式,主要有 “映轮——映区——轮空” 和 “双片放映 ”。
映轮——映区——轮空,是指在一部电影拍摄完成之后,首先以较高的票价在地段和设施都比较好的 “首轮影院” 放映,一般来说这次首轮这次放映的收入最多。然后在相隔一段时间之后,再进行影片的 “第二轮放映”,而影院的豪华程度、所处的地段和电影票价也都比首轮放映时要低,同时收入也会相应减少。首轮放映和第二轮放映之间的时间间隔期,就被称为 “轮空”。
事实证明,好莱坞大制片厂制度的这种 “映轮——映区——轮空” 机制,非常有效的控制了电影的放映业,同时成功排斥了独立制片和外国电影。当然也不可避免的损害的广大电影观众的利益。
双片放映,是指每次都放映两部影片:第一部是正片,即通常所说的 “A 级片”,第二部是 “加片”,即 “B 级片”。
一般来说,“加片” 既有大制片公司生产的影片,也会有独立制片公司生产的影片,但是这些电影在制作成本和质量等方面都无法与正片相比,而采用 “双片放映” 的目的,就在于招揽观众和加速大制片公司的资金周转。
值得一提的是,B 级片在相当程度上为电影新人提供了机会,也为电影的艺术创新留下了难得的空间。因为 B 级片没有 A 级片那么严格,很多难以获得 “A 级片” 拍摄资格的青年电影导演,就可以利用拍摄 “B 级片” 的机会,充分发挥自己的才能;同时 “B 级片” 导演也拥有更多的创作自主权,因此可以在电影的创作中进行创新。
事实证明,后来的新好莱坞电影的出现,就与 昆汀·塔伦蒂诺、蒂姆·伯顿等当时一大批 B 级片导演的努力密不可分。
总体来说,大制片厂制度下的制片、发行、放映都成了好莱坞的电影工业体系,从而保证了好莱坞电影的稳定生产与在世界范围的影响力。
从稳定繁荣到动荡不安。
经典好莱坞电影繁荣的三四十年代,是美国社会的平稳上升期,而六七十年代的美国社会各方面矛盾激化:不仅有第二次世界大战带给人们的心理创伤,而且战后的冷战格局,以及美国奴隶制的历史遗留问题等,都使人们出现了强烈的危机感。
1963 年 “肯尼迪遇刺” 和同年爆发 “越南战争” 为直接导火索,美国国内开始了大规模的 “反战游行” 和 “民权运动”。
在文化领域,青年一代的反传统狂潮。如嬉皮士运动,迷恋摇滚乐等也一发不可收拾。在这样的背景下,经典好莱坞电影那种单一闭合的叙事表达,已经不能够满足人们的观影需要,于是便激发了新好莱坞的出现。
其次,二十世纪美国的娱乐形式也经历了从电影主宰到电视分流的发展过程。1905 年的第一家镍币影院出现后,电影很快就取代马戏团、歌剧院等成为最大的娱乐业。随后八大电影公司通过在制作、发行、放映环节的扩张,在三四十年代达到顶峰。
然而从六七十年代开始,电视成为了美国人最主要的娱乐方式。同时电影的观众群体也发生了变化。
由于电影以更加通俗大众的方式分流了普通平民阶层的大量观众,那些文化层次较高、收入也较高的人们就成为主要的电影观众,而这些观众都有着一定的反思意识和社会文化参与意识,于是他们期待在电影中看到更多的社会批判内容。
另一方面,二战后的生育高峰使 12 至 29 岁的青年人成为新的电影观众群体,并且占到观影总人数的 90%。作为在电视机前长大的一代,他们惯于用眼睛思维,而要想将吸引这部分受众,就必须进行电影语言的创新。
经典好莱坞电影的制作、发行、放映完全被八大电影公司垄断;后来美国最高法院判定了八大电影公司的垄断行为,于是它们便放弃了这三个环节中利润最低的放映,同时开始重视利润更大的发行:每年除了制作十几到几十部数量不等的影片之外,也开始自主发行独立生产的影片——这实际上为 “独立制片” 的兴起和电影人摆脱大制片厂制度提供了机会。
文化转型:从美国中心 到 “欧洲旨趣” 。
第二次世界大战结束之后,欧洲电影开始复兴,并且形成了与好莱坞风格迥异的文化表现与艺术特征,而 “意大利新现实主义电影运动” “法国新浪潮电影运动” 等都深深吸引并影响了好莱坞的年轻电影人,于是他们便邀请欧洲电影到美国讲学、交流电影的创作经验。
1967 年的两部影片 《邦尼和克莱德》、《毕业生》为标志,美国正式进入 “新好莱坞电影” 的发展时期。
其中 《邦尼和克莱德》由舞台和电视出身的导演 阿瑟·佩恩 执导。故事取材于 30 年代美国一对银行抢劫犯的真实经历。他们的犯罪行为被影片呈现为个人反抗社会的壮举。因为电影工作者希望通过这雌雄大盗,进行一种批判性的社会反思。
影片的类型属于传统的 “强盗片”,但又明显受到 “法国新浪潮电影”,尤其是戈达尔的影响。这部影片的出现在当时引起了全世界的关注:美国《时代周刊》称其是 “美国新浪潮电影” 的化身;英国《女王》杂志称 “1967 年是《邦尼和克莱德》年”。
相比于《邦尼和克莱德》的传奇色彩,麦克尼·科尔斯执导的《毕业生》(是的,就是那个逃婚后坐到公交上,迷茫眼神的那个),则将目光投向当代美国青年人的生活。准确把握了青年人初入社会时的迷茫,受到青年观众的普遍喜爱与共鸣,同时还留下了《斯卡布罗集市》、《寂静之声》等传唱至今的经典电影歌曲。
随后,新好莱坞电影便开始快速发展,相继出现了
等经典之作。
其中电影《逍遥骑士》受到战后垮掉一代的代表人物,杰克·凯鲁亚克的名作《在路上》的影响。以公路片的形式讲述了两个嬉皮士的漫游经历,影片有着明显的纪实风格,从中可以窥见上世纪六七十年代,美国光怪陆离的社会图景,以及青年一代的梦想迷惑和反抗。
嬉皮士和朋克相关的内容,甚至可以看看窺探未來:全面瞭解賽博朋克Cyberpunk【就知道玩遊戲31】
新好莱坞对世界电影发展的最大贡献,就是出现了一批至今仍然活跃在影坛,颇具实力与影响力的导演。这些导演在 20 世纪六七十年代,刚刚迈出大学校门后不久,就有了独立拍摄电影的机会,并在当时形成了影响力极大的青年导演群。
这个青年导演群的主要成员有:弗朗西斯·科波拉、马丁·斯科塞斯、乔治·卢卡斯、史蒂芬·斯皮尔伯格等。
新好莱坞青年导演群的领军人物,非弗朗西斯·科波拉莫属。
“教父” 系列电影,是传统类型片中的 “黑帮片” 与导演个人风格完美结合的典范之作。
《教父》根据马里奥·普佐的小说改编,以美国黑手党柯里昂家族三代人的生活为主线,突破了传统黑帮片以犯罪故事为主的叙事陈规,而是深入人物内心深处,反映他们置身多重人生角色矛盾旋涡中的艰难抉择。影片不仅有着严谨的叙事结构和鲜明的人物形象,而且具有深厚的历史感和悲剧感。
此后,科波拉创作的《对话》、《现代启示录》等影片,都愈发远离了经典好莱坞的类型片原则,而更为突出和强调个性化色彩。
新好莱坞青年导演群的重要人物之一,马丁·斯科塞斯在 1973 年拍摄的《穷街陋巷》是他电影生涯中的第一部重要作品,影片通过对意大利移民后裔在曼哈顿下东区艰难生活的细致描绘,体现出明显的导演个人风格,而这种个人风格在他 1976 年拍摄的另一部电影片《出租车司机》中得到了进一步的延续与发展。关键在于影片《出租车司机》还以强烈的悲剧气息,展示了越战后美国社会的迷茫,并将斯科塞斯推向了大师级电影导演的行列。
此后,马丁·斯科塞斯还导演了《愤怒的公牛》、《基督最后的诱惑》、《纽约黑帮》、《无间道风云》等影片。
与其他青年导演相比,乔治·卢卡斯有着更为多重的身份。
客观而言,乔治·卢卡斯对电影类型片的兴趣比较单一,并主要集中在拍摄科幻片上,而他创作的唯一一部非科幻电影《美国风情画》,作为其在新好莱坞时期的代表作品,讲述上世纪 60 年代几位刚步出高中校园的加州少年,即将因为不同的人生选择而各自发展,通过详细描绘他们在小城一夜间的经历,反映出越战前夕美国青年人的思想感情等。其中大量运用了 50 年代的流行摇滚音乐,从而使影片充满了浓厚的怀旧气息 。
后来成为了世界电影史上最具影响力的导演之一,他在新好莱坞时期拍摄了职业生涯中的第一部成功的作品——1974 年的《大白鲨》。作为一部恐怖片,《大白鲨》展示了斯皮尔伯格对观众心理的卓越把握能力,以及对电影节奏的准确掌控。
斯皮尔伯格是 “青年导演群” 中最具类型意识、题材选择也是最为广泛的导演。后来拍摄了科幻片《E.T》《人工智能》等,还富有开创性的将科幻片与恐怖片融合创作出《侏罗纪公园》以及寻宝冒险片的经典之作——印第安纳·琼斯系列。
斯皮尔伯格在上世纪 80 年代之后拍摄的《辛德勒的名单》、《拯救大兵瑞恩》、《慕尼黑惨案》等影片都展示了他对历史对人生思考的深度和广度,体现出其将类型片的商业元素与导演的个人风格结合的高超能力。
与其说新好莱坞是对经典好莱坞的革命,是新与旧之间的对抗,不如说是好莱坞是在尊重经典好莱坞基础之上的丰富发展与重组进步。
客观而言,新好莱坞继承了经典好莱坞的生产方式和类型片的工业传统,同时借鉴并融合了欧洲电影的艺术表现,从而给美国电影带来了深远的变化,并呈现出新的特点,主要体现在 “类型意识的突破” “作者风格的确立” 和 “镜语体系的革新” 三个方面。
将电影类型片带入了一个新的时代,经典好莱坞时期的电影类型片是狭义的,每种类型自成体系结构闭合,且类型之间也少有交叉。
20 世纪六七十年代,美国社会充满了激烈的矛盾冲突与文化碰撞,经典好莱坞类型片那种稳定、闭合的结构便开始与观众的观影期待之间产生距离。于是,新好莱坞不再以单一的类型模式进行创作,而是将各种类型作为电影元素进行使用,从而促成了 “类型融合” “超类型” “反类型” 等的出现。
“法国新浪潮电影运动” 提出的 “电影作者” 观点在新好莱坞时期被引入美国,主要用于反抗标准化的电影制作;同时法国《电影手册》杂志还评选出了在好莱坞商业体制内创作,但并不随波逐流,具有鲜明导演个人风格的 “电影作者”。
如奥逊·威尔斯、希区柯克、霍华德·霍克斯、约翰·福特等。记住这几个导演,都是顶级导演,如果看过《电影艺术:形式与风格》的话,里面会经常提到。
一方面,新好莱坞电影抛弃了经典好莱坞搭镜拍摄的习惯,采用实景拍摄,从而增加了影片的真实性;
另一方面,新好莱坞电影打破了经典好莱坞电影线性叙事的闭合结构,对故事情节进行一种非戏剧化的处理。
此外,在人物设置上,新好莱坞电影偏好以充满反抗意识、但寻找不到出路的成长中的青年人为主角,着力刻画他们复杂的内心世界和面对现实时的迷惘与无奈,注重对人物个性的展现。
好莱坞的扩张极大促进了美国电影工业的发展,并确立了其在世界影坛的霸主地位。
据相关统计,从上世纪 90 年代开始,好莱坞每年约有一半的电影票房都来自海外市场,而相比之下,外国电影在美国市场份额却不足 10%,其实各国对好莱坞称霸都充满了焦虑,一些国家的电影人还行动起来抵制好莱坞。如在 1995 年 12 月 28 日,即世界电影诞生 100 周年的纪念日,法国影星阿兰德龙就在巴黎协和广场进行了一次反抗好莱坞的行为艺术,将一盒好莱坞电影的拷贝当众销毁,从而发出法国作为世界电影诞生地的一声怒吼。1998 年韩国国民导演林泽权也和许多韩国电影人一起,开展了声势浩大的光头运动,抗议美国在韩国自由放映电影,并以胜利告终。
虽然这些运动体现出各国电影人对本民族电影的热情与坚守,但是到目前为止,好莱坞的霸主地位始终没有动摇。
置身当前的时代语境,好莱坞电影工业呈现出 “电影创作兼收并蓄” “数字技术主导世界” “电影工业发展全球化” 的特点。
好莱坞自建立之初就十分重视吸收利用其它国家的电影资源,如直接聘用国外知名导演到好莱坞拍摄电影。德国导演刘别谦, 英国导演希区柯克都是在好莱坞实现的事业巅峰。同时还对其它国家的优秀电影作品进行改编再创作。如重拍了日本电影《谈谈情跳跳舞》《午夜凶铃》香港电影《无间道》(有内鬼,终止交易!!)等。好莱坞还选取其它国家的典型时代事件,或是民族色彩强烈的神话传说,作为基本素材进行电影创作。如拍摄了《埃及艳后》《特洛伊》《花木兰》《指环王》等。关于指环王的详细解析,可以看青蛙刀圣的解说视频。
此外,好莱坞还吸收其它国家最具民族特色的文化元素,将其与各种类型片融合,创作出具有多元文化背景的电影作品。如将中国功夫融入好莱坞动作片的《杀死比尔》《功夫熊猫》等。还有今年的《Raya and the Last Dragon》中文名《寻龙传说》,公式化的情节、定型化的人物、图解式的视觉形象。这就是类型片,上面说过了。说实话,这个电影对东南亚文化理解只是浮于表面的,只是各个文化的堆砌,大杂烩,我是不会买账的,浪费我在腾讯视频上买这电影的钱。如果你希望从这电影中感悟什么,获得什么,你将会浪费 108 分钟。
全球化时代好莱坞电影工业的第二个特点是 “数字技术主导世界”。从 2005 年以来,约 80% 以上的好莱坞电影都是通过数字技术制作画面,同时几乎所有的电影声音也都是由数字处理的。尤其是《侏罗纪公园》中逼真的恐龙,《终结者》中的液态机器人,还有《泰坦尼克号》中规模巨大的灾难场景等,可以说好莱坞的数字技术的发展令其它国家望尘莫及。
全球化能够带给电影更多的投资和跨国产权,从而有效分担电影拍摄日益攀升的成本与相应的投资风险。除了充分吸纳各国的资金,与主要经济大国进行电影生产的合作,好莱坞各大电影公司还纷纷在其它国家建立子公司。
2003 年中国电影产业发展的初期,美国华纳电影公司就以参股 49% 的方式与上海永乐电影城合作。
2004 年华纳再次与广州金逸合作,投资建设具有世界一流水准的多厅影院。
总体来说,如今的美国好莱坞继承着经典好莱坞确立的类型片传统,发扬着新好莱坞对电影观念和工业体制不断改革的优势,同时利用最先进的数字技术,并牢牢把握着全球化的时代特点,继续占据着世界影坛的霸主地位。
1993 年中国电影拉开了全面改革的大幕,随后在港片合作片中分账制度被引入内地,于是从 1994 年起,我国开始了以分账大片的形式,引进世界各地的优秀影片。进入新世纪以后,以 2001 年我国加入世界贸易组织为契机,中国电影改革十年之后的 2003 年,真正开始了产业化发展,并在当下呈现出新生态与新格局,成为社会文化生活的重要组成部分。
上世纪 80 年代我国改革开放之初的电影产业,是在新中国学习苏联电影的基础上发展而来的。
特点:
“生产 ” 与 “发行、放映” 的政企合一。
生产:电影生产以指令性的计划指标进行;
发行、放映:发行放映实行从中央到地方的垂直管理体制。
中央——“中国电影发行放映公司”
地方——“电影发行放映公司”
这种模式在计划经济年代保证了电影的经济效益,也保证了电影能够在全国放映,但是中影公司作为唯一拥有独立电影发行权的公司,全国所有制片厂生产的电影,都要交给中影公司统购统销,这种行政性和非市场化的电影产业机制,经过计划经济年代的辉煌之后,其弊端随着改革开放的深入而逐渐显现。
弊端:
1993 年 1 月 5 日,时国家广电电影局颁布了《关于当前深化电影行业机制改革的若干意见》,旨在改变之前计划经济下电影的统购统销,调整制片、发行、放映经济效益分配不合理的状况。
然而,新的问题出现了,尽管中影公司的垄断经营被打破了,但是各个省级电影发行放映公司,却依然在自己的行政区域内独家经营,垄断发行。这样意味着,过去制片厂只需要面对中影这一家垄断经营者,而现在则要面对全国 32 家地方垄断经营者。
1994 年 8 月 1 日电影局再次下发文件:《关于进一步深化电影行业机制改革的通知》,明确指出拥有电影发行权的机构,可以直接向除 11 个老少边穷省区之外的 21 个省区各级发行单位,直接进行电影发行。
这些文件的出台,使电影的经营自主权在政策方面得到了认可。
1994 年的 “全国电影发行放映工作会议” 提出:每年要引进十部 “基本反映世界优秀文明成果和基本表现当代电影艺术、技术成就的影片”,即开始了引进电影 “大片” 的时代。
当你就有一批好莱坞和香港大片,以分账的形式进入内地影院。其中有哈利森·福特主演的《亡命天涯》,作为引进的首部分账大片,以 2500 万的票房成绩创造了内地第一个票房奇迹。
1995 年,引进十部大片的工作有条不紊的进行着,虽然当年只引进了八部影片,但部部都是经典。
《红番区》
也是成龙打入美国主流电影市场的里程碑。1995 年 1 月 31 日在内地上映后,很快就以 3500 万的成绩,刷新了内地的电影票房记录。
《红番区》给内地观众带来了 “贺岁片” 的概念,甚至改变了一直以来春节期间电影院放假关门的状况。
《真实的谎言》
导演:詹姆斯·卡梅隆
主演:阿诺·施瓦辛格
影片从隐藏身份的 FBI 特工与妻子琐碎的家庭矛盾入手,在不断的误会和意外下展开正邪的对抗 。作为施瓦辛格的硬汉动作片的巅峰之作,该片场面宏大,气度非凡,且不乏喜剧元素。
《狮子王》
类型:动画电影
荣誉:奥斯卡 “最佳配乐
奥斯卡 “最佳原创歌曲”
影片的脱胎于哈姆雷特,除了波澜壮阔的情节和成功的人物形象塑造,还有获得奥斯卡最佳配乐、最佳原创歌曲等多首经典电影歌曲。
《阿甘正传》
主演:汤姆·汉克斯
特点:电脑特效的运用
荣誉:奥斯卡 “最佳影片奖”
影片讲述了一个智商只有 75 的低能儿不断奔跑的故事,将真伪历史杂糅于一体,其中对电脑特效的运用堪称经典,这部电影还打败了《肖生克的救赎》获得当年奥斯卡最佳影片奖。
《廊桥遗梦》
这部改编自同名爱情小说的电影,讲述了一段艳而不淫、哀而不伤、既宣泄了激情又照顾了道德的浪漫邂逅。
《勇敢者的游戏》
类型:奇幻家庭喜剧
主演:罗宾·威廉斯
特点:电脑特效
影片对电脑特效的运用深受《侏罗纪公园》的影响,同时阖家欢乐的定位也非常讨巧。
《纽约大劫案》
主演:布鲁斯·威利斯
警察形象被评为 “电影史上最棒的警察”。
《玩具总动员》
是为皮克斯动画打下江山的首功之臣,这也是全世界第一部完全使用电脑技术的动画电影。
玩 3 也是我认为这个系列电影的 “最终章”,玩 4 只是给了一些 “惊喜”。
十部大片的引进在活跃中国电影市场的同时,也促使中影公司和各级发行放映公司的改革,并在实行现代企业制度、扩大经营规模、实现院线制等方面都进行了有益的探索。于是中国电影市场终于在 90 年代中期开始复兴,并且也吸引了境内外的大量资金,从而为中国电影的全面产业化发展奠定了必要的基础。
加入 WTO 后,我国引进电影大片的数量由 10 部增加到 20 部。同时为了限制美国电影的市场占有率,还在 2004 年明确规定引进的这 20 部电影中,必须有 6 部是非美国生产的影片。
2012 年,引进大片的数量由 20 部增加至 34 部,其票房分成比例也由 13% 调调整到 25%。
最新的引进进口大片的 “配额制度” 谈判,也从 2017 年就已经展开。
2002 年张艺谋导演的影片《英雄》上映,标志着中国大片时代的到来,伴随而来的还有内地电影市场近十年低靡的终结。
影片《英雄》讲述战国末期三大刺客欲杀秦王的故事,其从筹备策划到拍摄制作,再到宣传发行都采用了不同于以往的市场化模式,最后《英雄》也以内地票房 2.5 亿元的成绩,创造了国产电影的票房神话。
随后,张艺谋还拍摄了《十面埋伏》《满城尽带黄金甲》《金陵十三钗》等电影大片,也都票房成绩斐然。2004 年的《十面埋伏》,以《英雄》所开创的 “大明星、大投资、大宣传、高回报“ 模式,让中国电影大片走向了品牌化的时代,从而掀开了中国电影产业发展的新篇章。
同时,这部电影还与当年王家卫的《2046》冯小刚的《天下无贼》周星驰的《功夫》一起,引发了新世纪中国电影市场的一次高潮。
中国电影在 2002 年开启大片时代的同时,也开始了电影的院线制改革。
概念:
电影院线简称 “院线”,是指以影院为依托,以资本和供片为纽带,由一个电影发行主体和若干影院组成的电影发行,放映的经营机制。
特点:
对旗下影院实现统一排片、统一经营、统一管理。
2002 年我国有 35 条院线正式挂牌营业,这 35 条院线共有影院 1019 座,银幕 1834 块,而在十年后的 2012 年,中国电影院线的银幕数量就已经达到了 13118 块,从 2012 年至今更是发展迅猛,银幕数量也呈爆发式增长。2017 年的银幕总数已经达到了 50776 块,稳居世界第一。
从 2004 年《关于加快电影产业发展的若干意见》提出 “深化院线制改革” 之后,这种 “统一品牌、统一供片、统一经营、统一管理” 的院线制,就成为了中国电影发行放映的主要方式。而改革后的电影院线,也彻底摆脱了事业单位的属性,成为身份明晰的市场主体。
目前我国形成了以十大院线为核心,各省级院线为补充的发展格局。同时全国大多影院都在十大院线的旗下,这十大院线包括:
与 2002 年院线制改革同时进行的,还有影院的建设与改造,主要是多厅化和数字化。
我国第一家五星级影院:“北京华星影城” 也在 2002 年 7 月 12 日盛大开业。
随后上海永乐影城、广州中华广场电影城、深圳新南国影城等多家五星级影城,也纷纷在各大城市出现。
在此时期,中国电影产业发展呈现出了一些新的特点
从 2003 年中国电影开始产业化发展以来,电影市场一直就保持着较大幅度的增长。
以 2008 年为例,在当年总额 40 多亿的票房成绩中,国产电影就贡献了 25 亿多元,超过总数的 60%。
《长江七号》《画皮》《功夫之王》《大灌篮》《赤壁》《非诚勿扰》《梅兰芳》等 8 部影片的票房总额就接近 20 亿。
其中吴宇森导演的《赤壁》,国内票房收入:3亿多元,全球票房收入: 7 亿元人民币
同时 2008 年上映的国产电影中,有约一半以上都由民营资本参与了投资,关键是之前根本不会考虑对电影行业贷款的银行,也从 2008 年开始将注意力投向中国电影产业。如《画皮》《非诚勿扰》等影片,就是以 “版权抵押” 的方式向银行贷款,从而拓宽了我国电影的融资渠道。
自中国电影开始全面产业化发展以来,产量和票房的持续增长已经成为了一种常态化的状态。
中国电影进入产业化时代以来,许多中小成本电影也另辟蹊径,以关注社会现实问题的题材优势异军突起。许多影片还取得了出人意料的票房成绩。
2011 年改编自鲍鲸鲸同名人气小说的 《失恋 33 天》就以 1400 万的投资获得了 3.5 亿元的票房收入,成为中国电影产业发展过程中,中小成本电影异军突起的典型案例。这部影片以亲切不失幽默的方式,讲述了女主角从遭遇失恋到走出心理阴霾的 33 天,作为我国内地首部为光棍节量身打造的治愈系爱情电影,在 2011 年 11 月 8 日上映后 4 天后,票房就突破了亿元大关。
2010 年中国电影的全年票房首次突破百亿元大关。随后,亿元电影俱乐部的会员不断增加,其中不仅有商业大片,还有很多中小成本的电影也开始拥有过亿的票房。
如 2012 年的贺岁片《人在囧途之泰囧》,总投资不足 8000 万,票房收入 12.6 亿元。
2013 年票房排行前十的电影《致我们终将逝去的青春》《北京遇上西雅图》《中国合伙人》(陈可辛导演)等,单片投资都没有过亿,但都轻而易举的获得了过亿的票房收入。
2010 年 1 月 21 日,国务院办公厅颁布 “关于促进电影产业繁荣发展的指导意见”,明确指出中国电影产业在 2010 年的发展重点:是大力繁荣创作生产、积极培育新型企业、加强数字影院和电影院线的建设。于是,3D 和 IMAX 就成为了我国数字影院发展的核心。
2009 年詹姆斯·卡梅隆执导的《阿凡达》作为第一部在我国上映的数字票房赶超胶片票房的影片,不仅展示了 3D 带给了中国电影产业的变化,而且反映出中国电影市场的巨大容量与需求。
2012 年,“巨幕数字放映系统” 在我国正式开始运营,从而打破了美国电影 IMAX 格式的垄断。此后,我国 3D 数字和 IMAX 巨幕放映设备的普及率不断提高,国产 3D 和 IMAX 电影的制作水平也在不断攀升。仅在 2012 年,就有 12 部国产 3D 电影上映,同时还有《十二生肖》《一九二四》等影片尝试以 IMAX 格式与观众见面。
可以说得益于中国电影的全面发展,中国电影产业呈现出蓬勃向上的态势。
2013 年至今的中国电影产业不断发展成熟,并在制片发行放映等环节,呈现出更具时代性的特点。
首先要强调的是,中国电影产业的发展正是得益于国家相关政策的保障,上世纪 90 年代中国电影开始市场化改革之初,正是依赖当时的政策才能够有条不紊的展开。
在如今产业化发展的新阶段,以 2016 年 11月 7 日颁布的《中华人民共和国电影产业促进法》为代表,这些政策的出台都对我国电影产业的健康发展、电影市场化的规范与完善等起到了基础性的制度保障。
中国电影产业整体都深受互联网的冲击,电影制片业在这样的背景下,逐渐形成了传统电影公司、互联网电影公司,以及与互联网公司合作的众多中小型电影公司并立的格局。
”传统电影公司“ 主要以 “中影” “华谊” “光线“ ”博纳” “万达” 等为代表。
“互联网电影公司” 主要以 “阿里” “腾讯” “爱奇艺” 等为代表。这些公司都是近年活跃在中国电影制片业中的主力。
互联网不仅深刻的影响着电影制片,而且在相当程度上颠覆了传统的电影发行,长期以来,我国电影发行都只是依靠推广宣传扩大营销的覆盖范围。但这种方式的弊端,大城市进行宣传相对容易,在数量庞大的中小城市则相对比较困难。
“互联网+” 电影:充分利用互联网无处不在覆盖范围与影响力,在中小城市实现比较充分的营销渗透。甚至近年的中国电影中还出现了一种被称为自来水的现象。
“自来水”,意为 “自发而来的水军”,最早出现于 2015 年的电影 《西游记之大圣归来》。
当初,影片上映时,有数万名网友自发形成了自来水,为这部国产电影摇旗呐喊,给影片带来了高口碑和高票房。该票最高单日票房为 4000 万,即打破了国产动画电影的单日票房记录,最终总票房也高达 9.56 亿元,是我国票房最高的动画电影(在当时是,《哪吒》改变了这个,是 50亿)。
近年中国电影的放映情况来说,呈现出观看电影成为常态,电影放映高峰频繁出现的特点。
一方面,看电影已经成为国人的一种日常行为与消费习惯。
另一方面,目前中国电影放映的高峰期不仅有传统的 “贺岁档”,全绝大部分时间的放映都比较稳定,同时春节、国庆等假期在家庭观影的推动下,也已经成为电影消费的集中爆发期。
暑假期间还由于大量学生的观影群体,使得每年七八月份亦成为电影放映的高峰。
2018 年 “暑期档” 我国电影总票房就高达 173.8 亿元,超越 2017 年同期,票房超过了 10 亿。
其中《一出好戏》《巨齿鲨》《侏罗纪世界2》等口碑较好的影片,票房都超过了 10 亿。
而《我不是药神》和《西虹市首富》两部影片的票房,则分别高达 30.98 亿和 25.19 亿。
总体来说,中国电影产业在近年的发展中,以 “武侠片” “喜剧片” “爱情片” 等传统优势类型片为主,同时兼顾更为多元的类型电影创作,旨在促进中国电影的全面健康发展。
尤其是长期以来受编剧水平和技术能力限制,一直都是进口片的主场的魔幻、奇幻、科幻的 “三幻” 类型影片,从 2014 年开始整体爆发,其中以 “三体” 为代表的中国科幻电影的横空出世,标志着中国电影产业发展的新高度。
当然,这些只是课程的一部分,更多的自己去搜,自己动手。
《电影艺术:形式与风格》——必看
《认识电影》
《电影批评》——戴锦华(北京大学教授,博士生导师,Bilibili 也有很多她的课,微信读书上也有她的书,我买的是纸质版的)
《电影语言的语法》
《让子弹飞》拉片——拉片的是位导演,也可以看看他的其它作品
会持续更新的
明确一个基本事实,电影≠故事片。进行电影批评,需要你大量的阅片,以及相应书籍的观看,以及导演的部分背景,才能更好的进行电影批评/鉴赏。
例如《你好,李焕英》是贾玲自导自演的一部电影,其中冯巩是贾玲的师傅,客串了一下,活跃下气氛(我想死你们了)。其中 1980年的《庐山恋》是“文革”后中国首部爱情为主题的电影,并且出现了当时罕见的吻戏,符合当时的剧情设定。你现在去庐山,那里应该还有在放,我去过庐山两次了。该片其实很大程度上和《夏洛特烦恼》类似,整体采用的高调光(往上搜高调光),喜剧片常用,没有做大的改变,整体内容和这个电影差不太多。也是贾玲作为导演的第一部作品,沿用已有成熟的框架,是最好也是最稳妥的选择。影片事件其实可以再丰富些,让部分事件紧凑些。影片做得朴实无华,但真挚真诚。
没看过这两部电影的,可以在不忙的时候偶尔看看。
国内的一些资源足够了,Youtube 上也是有更多资源的,等你自己搜。
]]>Youtube 看不了评论,一直在转圈圈。
清除 Youtube 所有 Cookie,退出谷歌浏览器,再进。
如果还是不行,看看是不是无痕模式下可以看评论,如果可以,把所有插件关了,再重启浏览器。油猴的插件部分有问题。
搜索 重置设置
,重设浏览器,彻底退出谷歌浏览器,再重新登录 Youtube,评论即可看到了。
我玩了比较久的云顶之弈,也“间接开发”过阵容,就是 S3 最火热的 6 暗星羊刀水银泽拉斯。最快两天从水晶之痕没有段位到超凡大师(后面排到人比较慢,不愿玩,而且段位提升只是把数的堆积)。我也是美服以及艾欧尼亚两个赛季超凡大师,最高到一区前 200 名左右吧,3 月 26 日左右(具体几号真忘了)早上8 点斗鱼、卷子的第一把,和南波儿的两个小弟的7点多到8点那一把的录播视频为证。
只要你时间够,上个王者不成问题。后面比较喜欢玩 PBE(测试服),提前感受版本,厄加特的大招开始是没有写明无视复活甲的,也是我向官方报告的 “bug”,后面官方改了技能说明,之前的英文介绍里面没有 GA(Guardian Angel)。其他的大家都知道的 bug,我也不愿向官方反馈。
第三个,仅需两天(一天16个小时左右),50 多把即可从零上超凡大师,多的 8 把左右是打的维护赛。
玩游戏也是要学习的,也是要动脑子的,只有不断进步,不断精进,才能更好去玩游戏。其他的下棋类的游戏,我也玩过,其实 TFT 大多都是抄 Dota 自走棋的,做得越来越像了,只不过简化了而已。
这里主要讲些基础按键,以及鼠标操作“抢”英雄,抢装备。
D 牌,换下一轮牌。D 一次需要 2 金币,具体几费英雄概率,看右下角
升级,在左下角有对应的当前经验以及升级所需经验。一次升级需要 4 金币,一级对应着可以上一人口,8 级代表至少可以上 8 人口。3-2 和 4-1 是一些快节奏的上人口搜排阵容时间。例如法师,3-2 升 6,D 牌,4-1 升7 D牌,靠质量和血量赢,这就意味着 2 阶段不能乱升级,最大化保留经济。
鼠标光标对准某个英雄后,再按 E 可以卖出该英雄。
按住,可以选择秀表情。
查看对手动态。1 表示前驱召唤师,即右下角小地图你的前驱召唤师,继续按,继续是前驱召唤师的前驱召唤师,以此类推,3 则相反。后面有高级教程展示如果使用按键,来达到逆转游戏战果的玩法。
可以打开 ESC 查看对应按键。
对于老手,可以不开,没必要。在 Esc 按键【控制】那里,打开移动预测。配合按键移动,你可以设置 B 键来和鼠标右键配合一起使用,再加上移动预测,开局 1-1 没人抢得过你。
点击对应头像可以查看其他召唤师的具体阵容摆放。
左键点击场上英雄,按 3 或 1 切换视角,即可实时躲掉对方灵风、射线等功能装备影响。
不要给单件装备!!!除非你全部都二星英雄了,并且有思路,替换阵容,在哪个阶段替换该英雄。
为了让游戏更加 “公平”。TFT 在每局 1阶段的三回合都会至少保证你有 3 件散件(当然也有可能爆钱 +2件),这 3 件包含了选秀的一件。
公平,公平,还是他妈的公平。—— 《让子弹飞》
一个阵容的核心英雄(Champion) 往往有着一至多件核心装备,才能完美地发挥它的作用。根据核心装备,从 3 阶段确定大致阵容方向,临时变换阵容,往往会付出惨痛的代价。
例如
阿卡丽的蓝 BUFF + 火炮 + 无尽;
卡特的科技枪;
莫甘娜的鬼书;
奥拉夫的火炮 +飓风;
霞的巨人杀手 + 正义之手 + 饮血剑。
非核心装备,属于可替换的类型。
例如
任何英雄都可以装备,并且前中期有着不错的表现。一般这种装备是用来过渡的,并且后期【能用】。
例如
顾名思义,是为了实现一些功能的装备。例如将地方关键性英雄 “移出” 当前对局 5 秒。其实一句话可以概括,恶心对面的装备。
这里说的是,纯前期装备。
有些装备前期很强势,后期伤害不高。例如日炎、灵风(是的,前期合灵风也是可以的,摆得好,可以让地方关键性英雄无法输出,进而赢下当前回合),离子火花。
不同赛季,有不同打法。云顶越来越偏快节奏,所以,如果你想在前期连胜,你必须从三个散件中合成一个成装,才有可能打出连胜(当然卡的质量也十分重要)。如果你不确定是玩什么阵容,2 阶段可以暂时不给装备,但是为了稳住血量,你必须在 3 阶段给出至少 1-2 件成装,来确定你的阵容。
当然,前期的连胜不代表你能吃鸡,或者前四。这种前期合高质量怪,给成装的【保血量打法】,只有在打比赛和赛季初的时候适用。有些时候,经济和运气决定了你的排名。
如果你想前期连胜,又不想太早确定阵容,那么【通用装备】的合成就是你的不二选择,例如【离子火花】、【日炎】等。3-3 必须确定几个大概的阵容方向,当然,如果你血量很高,经济很好,还可以再推迟几回合确定阵容。
【云顶是以装备为核心的游戏】。质量固然重要,合适的装备,能让质量卡提升不止一倍的战力。当然,有一种情况例外,你的质量很高,运气很好,牌很糊,装备随便给都有分。
一个良好的阵容,必定有这三种英雄,每种至少一个。这是必然的,取长补短,每个英雄擅长的位置不同。任何极化的阵容,都将被版本所制裁。并且一个良好的阵容,总是有人很有用,有些英雄表现很一般,这是无法避免的。
上面的介绍,在这个赛季稍微改了点。
下面是 4.0 版本推荐阵容,可以看看各自对应的。来自 https://lol.qq.com/tft/#/index
每个阵容,都有一些核心英雄。
例如 6 三国中的卡特,6 天神中的狼人,忍刺中的阿卡丽。他们基本都属于输出型英雄,很少有坦克/功能型英雄能够担任核心英雄。
核心英雄的三大特征。
所有核心英雄,必须满足其中两个及以上条件。
在一个终极阵容成型之前,一定有装备需要别人去穿戴,不然血量会掉得非常快。每个版本会尽量控制不让出现特别突出的阵容,让每个阵容都有上场的可能。
每个版本都有些其特定的非常强势的阵容,这是必然的。不然也不会说更新版本了。T0 阵容,根据装备和来的英雄来尽量往着方面来靠。这是上分的一个小技巧。
故名思义,这种阵容比较难吃鸡,但是能靠着前期的质量和血量来🐶个烂分的阵容。例如一代版本一代神,代代版本玩法师,法师永远是你烂分的不二选择。前提是比较多的基础牌和合适的装备。
云顶之弈会每回合固定给你发 5 块
能连胜就连胜,连败也可以,不过 5 连败和 4 连败进野怪,前者是 6 块起步,后者是 4 块,还不 2 阶段理财的利息。合理的权衡血量和金币。
看情况的,不一定这么绝对。
在下面的对位中有介绍,根据不同的赛季,对位规则是会变换的。但总的规则是不会变的,还是为了公平,你不会想 2-1 碰弱的,3-1 碰非常强的,2 阶段和 3 阶段碰到人完全不一样吧?这样会导致一种情况,如果碰到的人全部不一样,眉笔会一直输,直到 3 阶段结束,只剩一丝血。
还是为了公平,每个阶段碰到的人,位置变换不会太大。只会抽选其中两个回合换人。
这是规则,看你上一回合扣血的多少,决定了你先出来,还是后出来。
一个简单的判别,就是你的正对面是血量低还是高的,如果是低的,你就先出来。最新的版本已经改了这个 “Bug” 了,你可以直接看排名来判断自己什么时候 “出圈”。
云顶对位机制只有两套,从 S1 到现在。现在已经变了,需要你自己玩几把摸索,就那个排法。
第一套
2-1,2-3,2-6,和 3-1,3-3,3-6 对位是相同的,也就是遇到的玩家是一样的。那么 2-2,2-5 和 3-3,3-5 遇到的玩家是不同的。
如下图所示。
视情况而定,之后详细介绍。
相同英雄,在卡池里的数量。
英雄费用 | 数量 |
---|---|
1 | 29 |
2 | 22 |
3 | 16 |
4 | 12 |
5 | 10 |
这里的数量是指本局游戏,所有玩家可见这个英雄的情况。
也就是说场上“最多”
当然,这有例外,如果你的妮蔻之助非常多,也是可以变出来的。以前是场上没有该英雄了,用了妮蔻也会弹出来,现在更人性化一点,防止“栽种” 卡别人牌,导致英雄一直三星不了。
一般我是不推荐这种事情的,比较 “缺德”,但是高分局必须这样,尽可能让对手难受,让自己“舒服”。外服并不是和和气气的,也有 Fu@k 别人的,上来一顿问候的,高端局也有的。
生活就是这样,这很正常。我们在成长的过程中习得的一个责任就是,在别人使我们的生活变得更艰难前,我们不得不使他们的生活更加艰难。
—— 那不勒斯四部曲第一部《我的天才女友》p21
左键选中英雄,按 1,3 切换核心英雄站位,一般该技巧用于后期决战部分。
https://101.qq.com/?ADTAG=cooperation.glzx.web
https://tftactics.gg/tierlist/team-comps
https://app.mobalytics.gg/tft/set5/team-comps
https://www.leagueofgraphs.com/tft/comps/master
设计师推特—— Mortdog
如果觉得版本变动很烂,你知道该怎么做。
说白了,上分就是根据版本变动,利用信息差,来实现轻松上分,到了版本更新后的中期,就靠运气+运营+掌握的阵容的数量。
只有不停的练习,不停的重复这些阵容,你才能融会贯通,任何学习也是如此,重复才是真神,当然重复的过程中也需要思考,需要跳脱当前思维的局限性,从更宏大的视角审视自己走过的路/玩过的对局。一定要边玩,边校正自己。
只有永远在路上的人,才不会迷茫,走得更远。引申至《拿破仑》
一开始就知道自己要去往何方的人,往往走不远 ——《拿破仑》
]]>有趣,但无用的知识系列。
由 Ron Rivest, Adi Shamir, and Leonard Adleman 三位的姓首字母写的。
爪哇岛,岛上盛产咖啡;美国人有多爱喝咖啡,看英国人有多爱喝茶一样,波士顿倾茶事件,彻底惹怒了大英帝国(以前的称呼)。看看《硅谷》这部剧就知道了,咖啡 = 命,没有咖啡机的公司,不去。《Cloud Native Java》Josh Long 写的,书封面有几种意思,
这个鸟是蓝耳翠鸟(Alcedo menintiong)濒危野生动物,希望能唤起大家对动物的保护之心。当然,《高性能 MySQL》也是一样。
这个鸟在 Java island(爪哇岛)上生存。
鸟在天上飞,飞向云端的意思。迎合了云原生的概念,鸟就寓意为 Java,Cloud 就是云,如鱼得水,如鸟入天空。
具体的可以看他的视频 https://www.youtube.com/watch?v=Z5q-CXbvM1E&t=307s 他自己介绍的。
关于爪哇岛的,在印尼还是比较发达的,而且上面有华人,而且不准看中文,我是在《枪炮、病菌与钢铁》中看到的,一本不错的书籍,还有《自私的基因》。
《高性能 MySQL》
《设计数据密集型应用》
《机器学习实战》
等等,大部分书籍都是以濒危物种作为封面的,主要一方面是呼吁大家珍惜动物,这些动物对世界很重要。
具体可以看 animals.oreilly.com 网站查看。
Snowflake 没有一片雪花是相同的。
在 20 世纪 80 年代中期,Fred Brooks 发表了著名的论文《没有银弹:软件工程的本质性与附属性工作》。在介绍中,他将软件项目比作狼人。
“我们熟悉的软件项目都有这样的特点(至少在非技术经理看来是这样的),通常是无辜而直接的,但是它却有可能成为一个错过进度、挥霍预算并且产品有缺陷的怪物。因此,我们听到了迫切需要银弹的呼声,希望能让软件成本像计算机硬件成本那样迅速下降”。
他认为,由于软件开发的本质,在软件开发中没有银弹。这本身就是一项内在复杂的努力。在 20 世纪 80 年代,大多数软件都运行在单台只有单核处理器的机器上,互联网还处于早期发展阶段,智能手机也还属于遥远的未来,没有人听说过虚拟化或云计算。Brooks 写的主要是技术复杂性,现在我们更加意识到软件开发中所涉及的社会、心理和商业过程的复杂性。
在古老的传说里。狼人是不死的。想要杀死狼人有几种方法:
当然现实中是没有狼人的。但现实中确实有银弹这个东西。而其意义也类似于能杀死狼人的最好办法。现实中的狼人可以是一个棘手的项目,或者一件不可能的事。而“银弹”就是指能解决这些事的方法,或者技术手段。
《没有银弹》主张并断言在未来的十年之内(从1986年文章发表后开始计算),不会有任何单一的软件工程上的突破,能够让程序设计的生产力得到一个数量级的提升。不过,作者认为这个假设现在已不再成立。
假设软件开发的总工作量为 10,其中,本质性工作占掉 1,附属性工作占掉 9,那么改善附属性工作,将之消除,就可以把软件工作量减轻到 1(因为附属性工作变成 0),此时我们可以说,软件工作开发的轻松程度提升了一个数量级(因为由 10 进步到 1,差 10 倍)。
古代人认为狼人、吸血鬼怕银器,故有银制十字架,银弹等物件。
淘宝最初是买来的,采用的 LAMP(Linux+Apache+MySQL+PHP)架构
了解淘宝历史的人都知道淘宝是在2003年5月10日上线的,2003年4月7日到5月10日,这之间只有一个月时间。要是你在这个团队里,你怎么做?不是“抄一个来”,我们的答案是——“买一个来”。
当时我们是从一个美国人那里买来的一个网站系统,这个系统的名字叫做PHPAuction(其官方网站http∶//www.phpauction. net,Auction即是拍卖的意思,这个名字很直白,一眼就可看出这个系统是用什么语言做的、用途是什么),PHPAuction有好几个版本,我们买的是最高版的,功能比较多,而且最重要的是对方提供了源代码。最高的版本比较贵,花了我们差不多2000美元(貌似现在降价了,只要946美元,在他们的网站上有明码标价的信息)。买来之后不是直接就能用的,需要很多本地化的修改,例如,修改一些数据类型,增加后台管理的功能,页面模板改得漂亮一点,页眉和页脚加上自己的站点简介等。其中最有技术含量的是对数据库进行了一个修改,原来是从一个数据库进行所有的读写操作,现在把它拆分成一个主库、两个从库,并且读写分离。
在古希腊神话中,于雅典的北边,有一个地方,住着一条龙形巨蟒,叫皮同(Python)。这宙斯的儿子阿波罗(Apollo)和 Python 有点个人恩怨,他就来到此地,用弓箭射杀了巨蟒。后来,阿波罗在此地德尔菲建立了他的神社,即【阿波罗神殿】。
阿波罗还从巨蟒那,抢来一女祭司,这女的就是 Oracle。阿波罗的神谕者:皮提亚(Pythia)。
Oracle 是个职位名称,神可以通过他们向凡间传达旨意或者话语,就是神谕者。在古希腊神话里,有很多的神谕者(几乎为男性),宙斯有宙斯神谕者,而阿波罗的神谕是最著名的一位,她的出场率非常高,而这个神谕换了一个又一个,每个必须是女的。她坐在神社的一个三角凳上,地面有裂缝,缝里面冒出的是火山熔岩产生的烟,也有说是巨蟒(Python)尸体腐烂后生成的烟,吸了这些烟,神谕会进入一种神志恍惚的状态。这被认为是阿波罗占据神谕,借用她的身体说话的时候。
在古希腊历史里,就有各路人,远道而来拜访德尔菲的神谕,咨询大大小小的事情。关于爱情、婚姻、人生,关于战争、未来决策等,说白了大家就是让这个神谕给个【预言、忠告】。神谕有时候会给出直白的预言,有时候就爱讲谜语。听者得自己开窍,破解谜语。经典例子如下:
吕底亚的一个国王,曾找德尔菲的神谕咨询:我该不该攻打波斯帝国。神谕说:“If you cross the river, a great empire will be destroyed” 如果你跨河(进攻)一个帝国将会被毁灭。这国王就把预言中的帝国理解成波斯帝国,于是就攻打,最后被灭的是他自己的帝国。
在德尔菲阿波罗神殿的石柱、石块上可以看到很多刻下的话语,这些话语被叫做德尔菲的箴言。其中最著名的是刻在入口处的三句。
其中,认识你自己在哲学家苏格拉底出现前,就刻在上面了,而它也是苏格拉底最经典的格言之一。
认识自己的无知,是最大的智慧——苏格拉底
The Delphic Oracle said I was the wisest of all the Greeks. It is because that I alone, of all the Greeks, know that I know nothing.
德尔菲的神谕者说我是最聪明智慧的希腊人、那是因为全希腊只有一个人知道,我一无所知。
古希腊文学可以说是西方文明的源头,如果你看过《我的天才女友》四部曲,可以看到身为意大利人的爱莲娜,高中需要学希腊文学,分还要求不低。莉拉自学希腊语,还能指点爱莲娜。
《黑客帝国》主角,尼奥(Neo) 命名,与密码学中的密码无关。
为什么 1999 年那么多好电影呢?因为大导演都在憋大招,给 2000 年贺岁,不是以前导演牛逼,是你现在只能看到牛逼的导演的作品了。
1999 年上映的巨作,包括以下。
当然 1994 年也是,大导演都在也发大招了,因为从“现代电影之父”卢米埃尔兄弟发明电影和电影放映机到1994年刚好是世界电影百岁诞辰,所以这一年所有电影人都卯足了劲为这个诞辰献上大礼。
C-3PO Star Wars(星球大战)
]]>如果你可以看 Youtube 视频,我建议你直接看这个系列,不用看我写的。还有,墙带来的正面效果其实远远大于负面效果,首先如果没有墙的保护,国内的互联网企业,没有一个能成为大企业。大家都有 Gmail 谁用其他邮箱?Google 全家桶完全秒杀国内所有企业,欧洲没有墙,你听过欧洲有哪些互联网巨头吗?不仅是对一些无知的人一些保护,避免受到境外势力例如 大纪元 这种,国内很多人很容易被煽动,成了别人的傀儡。最重要的其实还是保护本土科技企业,留有一定时间追赶 Google 这样的超级大公司。
简单介绍原理。这里忽略网络传输层,默认是 TCP/IP,也忽略域名污染等等其他内容。
如果你了解过 Nginx 肯定会听到无数的 “反向代理”,而 VPN 就是正向代理。两者最大区别,就是一个不知道最终访问的是哪个服务器,一个是知道要访问哪个,但是需要借个道。
代理代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是”SOCKet Secure”的缩写[注 1]。
当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。
这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。
根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。
Session 就是会话层,在应用层(Application)下面,所以 SOCKS5 能代理 HTTP 请求,而 HTTP 不能代理 SOCKS5 的内容,从上往下就是依次加各自的协议头部。通过传输层(Transport)传到另一台机器上,再以此解头部。所以更低层的协议,更加快速,一般的游戏就是到会话层,你如果搞了只在 HTTP 层代理的工具,不能加速的。
SSR 又称酸酸乳,小飞机。客户端是下面这个样子的图标,你应该看图就知道为什么叫小飞机了吧。
下面是 Wikipedia 的解释。
Shadowsocks(简称SS)是一种基于Socks5代理方式的加密传输协议,也可以指实现这个协议的各种开发包。目前包使用Python、C、C++、C#、Go语言、Rust等编程语言开发,大部分主要实现(iOS平台的除外)采用Apache许可证、GPL、MIT许可证等多种自由软件许可协议开放源代码。Shadowsocks分为服务器端和客户端,在使用之前,需要先将服务器端程序部署到服务器上面,然后通过客户端连接并创建本地代理。
一般是由 Python 写的,启动也比较简单,前人已经帮大家写好很多东西了,按照安装步骤来。只需要简单的配置 + 简单的命令 systemctl shadowsocks start
这种就能启动客户端了。检查防火墙端口开放,检查服务器厂商端口开放,一般就能用客户端输入些参数直连了。就是正向代理而已。
这里有个坑,需要修改他的 python 源代码,碰到的时候谷歌/Bing 搜一下就行了。
这个一般是通过白名单的模式,对你访问的非白名单的网站进行代理。比如 bilibili 这种网站,就不会走代理,当然如果你开启了全局代理,所有的请求都会走代理服务器再去你访问的网站,绕一大圈,所以这个慎重开。
V2Ray 可同时开启多个协议支持,包括Socks、HTTP、Shadowsocks、VMess、Trojan和VLESS等。每个协议可单独设置传输载体,比如TCP、mKCP和WebSocket等。
配置比较麻烦不建议自己搭服务器用。
需要安装 Nginx,伪装成正常网站,需要申请个域名。
一般是有一键安装的脚本,可以直接装 Nginx 和 Trojan,这个会伪装成一个“旅游”网站什么的,你的香港的服务器或者其他能访问的服务器会变成一个网站,直接浏览器访问的话。客户端有很多,ClashX 比较好。但是还是不建议自己买服务器搭,又贵又慢。
使用 Go 写的,全平台的,支持多个协议的代理客户端。某些厂商就是根据这个来定制化开发他们自己的客户端,并且能加密。
所谓的机场,其实就是多个服务器部署了酸酸乳服务端。你可以列出该列表,可以通过自定义规则,例如超时多少切换下一个节点,是否开启负载均衡。
其实就是避免单点,以免一个服务器被封了 IP 之类的,导致不能科学上网了。
由专门的机构来做这件事,不然你一个个买服务器,太贵了。
一般给你的,是多次 Base64 编码后的一串字符串。
用树莓派/不用的电脑安装 OpenWrt 作为绕过封锁的软路由,设置对应的网关,以及机场地址,一样可以翻出去。这个就是个OpenWrt是适合于嵌入式设备的一个Linux发行版。
其实还是用到了机场。梅林路由器。
Github,如果访问不了,可以访问它的镜像网站,有很多镜像网站。
如果国内把 Github 封了(事实上以前封过一段时间),那真的不用开发了。Gitee 圈子太小了,国内大多是业务开发,基础设施,框架很少。用爱发电这种事,大家都坚持不久的。
]]>皮尔逊相关系数(Pearson correlation coefficient)也称皮尔逊积矩相关系数(Pearson product-moment correlation coefficient),是一种线性相关系数。皮尔森相关系数是用来反映两个变量线性相关程度的统计量。
其中相关系数用 r 表示,n为样本量,分别为两个变量的观测值和均值。r 描述的是两个变量间线性相关强弱的程度。r 的绝对值越大、表明相关性越强。可以简单理解相关系数r为分别对x和y基于自身总体标准化后计算空间向量的余弦夹角。
这里的 1/n-1 可以约掉,所以是更下面的图。
475 版本,不是 5 以上容器的版本,也不是 6 版本的 Kubernetes 上。如果报错,可以去具体 Spark SQL 的日志里面去看什么错误。
Model 和 Evaluator 的关系。来源于
Mode 各个阶段对应的 Evaluator 方法调用。
Evaluator 各个阶段下处理 MapReduce 的流程
1 | package me.young1lin.hive; |
将上面的类打成 jar 包。可以用 maven 打包(非 shade 方式),名称在 <build> 标签里写 <finalName>这里是你的 jar 的最终名称</finalName
名称可以自定义,也可以我取的名字 custom_function_tools.jar。也可以用Build -> Build Artifacts
.
1 | hadoop fs -put custom_function_tools.jar /tmp |
hadoop fs -put custom_function_tools.jar[这里是你打包好的 jar 包] /tmp[这里是你要传到 HDFS 的文件夹路径] 。
如果没有 tmp 文件夹,则执行以下命令
1 | hadoop fs -mkdir /tmp |
我这边想用里面的 ORC 表来使用事务,但是没用,至少 TDH 的没用,之前也测过,在 Spark SQL 的日志上看了,有日志,但没有回滚。
1 | create table linear( |
1 | insert into table linear value('1',5,9); |
可以创建临时函数方便测试,重启后就没的那种,也可以创建永久函数。
1 | create TEMPORARY FUNCTION regression as 'me.young1lin.hive.LinearRegressionUDAF' using JAR 'hdfs:///tmp/custom_function_tools.jar' |
这里的 hdfs:///tmp/custom_function_tools.jar
是三个 / ,名称是你刚上传的 jar 的名称。
前两个 /
和 hdfs:表示的是协议,最后一个 /
表示根路径,可以加具体的 IP 地址或者域名,因为这个是在同一个集群里面的,所以我这边不用加。
1 | create PERMANENT FUNCTION regression as 'me.young1lin.hive.LinearRegressionUDAF' using JAR 'hdfs:///tmp/custom_function_tools.jar' |
1 | select regression(l.x,xx.xbar,l.y,xx.ybar)from linear l,(select avg(x) as xbar,avg(y) ybar from linear) as xx; |
查询返回的以下结果。当然你可以 group by 其中一个字段,得出不同的结果,当 x 或者 y 存在相同的数值时,就有了不同效果。
如图所示
]]>Data Block 是 HBase 中文件读取的最小单元。Data Block中主要存储用户的KeyValue数据,而KeyValue结构是HBase存储的核心。HBase中所有数据都是以KeyValue结构存储在HBase中。
KeyValue由4个部分构成,分别为Key Length、Value Length、Key和Value。其中,Key Length和Value Length是两个固定长度的数值,Value是用户写入的实际数据,Key是一个复合结构,由多个部分构成:Rowkey、Column Family、Column Qualif ier、TimeStamp以及KeyType。其中,KeyType有四种类型,分别是Put、Delete、DeleteColumn和DeleteFamily。
HBase中数据在最底层是以KeyValue的形式存储的,其中Key是一个比较复杂的复合结构。
这也是HBase系统在表结构设计时经常强调Rowkey、Column Family以及ColumnQualif ier尽可能设置短的根本原因。列族一般情况下设置为 1 个。
——《HBase 原理与实战》
类似桶排序规则。
<user_id><业务字段>
高频查询的越靠前
]]>仅供本人面试前准备,其他人还是别看了,没意义。有很多我缩写,省去了很多易理解的部分。
我尽量找别人已经总结过的东西,而不是自己写,无意义,面试的八股文罢了。都是靠努力就能实现的东西。
底层基于数组实现
创建 ArrayList 如果不指定大小,会先创建一个大小为 0 的 Object[ ] 数组 ,
第一次添加数据时,会扩容成 ArrayList 的 默认大小 default_capacity:10**;**
创建时如果指定大小,直接创建指定大小的Object[ ]数组
add()
elementData = Arrays.copyOf(elementData, newCapacity);
总结来说,AraayList的get方法效率非常高,直接返回对应下标值,add方法和remove方法,效率就有点低了,需要考虑数组扩容和数组拷贝的问题**。**
所以ArrayList比较适用于插入操作较少,不是很频繁插入的场景。
LinkedList 底层是基双向链表实现的
LinkedList的每条数据都会被封装成 Node
1 | private static class Node<E> { |
用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下 不保证访问者公平的访问队列,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当 队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入 元素,先阻塞的消费者线程,可以先从队列里获取元素。通常情况下为了保证公平性会降低吞吐 量。我们可以使用以下代码创建一个公平的阻塞队列:
1 | ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true); |
基于链表的阻塞队列,同 ArrayListBlockingQueue 类似,此队列按照先进先出(FIFO)的原则对 元素进行排序。而 LinkedBlockingQueue 之所以能够高效的处理并发数据,还因为其对于生产者 端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费 者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。
LinkedBlockingQueue 会默认一个类似无限大小的容量(Integer.MAX_VALUE)。
1.7分段数组+单向链表
1.8其中抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized
来保证并发安全性。
https://www.jianshu.com/p/aa017a3ddc40
从字节码层面上看,枚举仅仅是一个继承于 java.lang.Enum 的类、自动生成了 values 和 valueOf 方法的普通 Java 类而已。
// 不想自己画,原图片在 https://www.cnblogs.com/wuzhenzhao/p/12346515.html
程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里面(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释工作时就是通过改变这个计数器的值来选去下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要以来这个计数器来完成。
与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
Java虚拟机栈中还有着局部变量表部分,局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、doublle)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和 returnAddress 类型(指向了一条字节码指令的地址)。
其中 64 位长度的 long 和 double 类型的数据会占用 2 个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需要的内存空间是完全确定的,在方法运行期间不会改变局部变量表的大小。
在 Java 虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过 Java 虚拟机规范中也允许固定长度的虚拟机栈)如果扩展是无法申请到足够的内存,就会抛出OOME异常。OutOfMemoryError 后文就简称为 OOME 了。
本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由的实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出 StackOverflowError 和 OOME 异常。
Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点Java虚拟机规范的描述是:所有的对象实例以及数组都要在堆上分配,JIT,逃逸分析,栈上创建对象。
分代回收,新生代(from+to+Eden,1:1:8)+老年代。从内存分配的角度来看,线程共享Java堆中可能划分出多个线程私有的分配缓冲区。
逻辑上连续内存空间。
方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器后的代码等数据。又名非堆(Non-Heap),1.7 用永久代(Permanent Generation)实现方法区,1.8 更名为 Meta Space。1.7 及以前的版本的项目容易报 Permanent Generation OOM,1.6 默认 82M,1.7 默认 128M,当类和静态变量一多就容易报错,解决办法是加大这块内存地址。
运行时常量池(Runtime Pool)是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)。
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范定义中的内存区域。但那是这部分内存也被频繁地使用,而且也可能异常能导致OOME异常出现,
你引用我,我引用你,你我都是空对象。就会导致这个引用计数回收不了, Python 就是用的引用计数。
第一次标记
如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记。
第二次标记
经过第一次标记后的对象,根据 此对象是否有必要执行finalize()方法 进行筛选,随后会由收集器对F-Queue中的对象进行第二次小规模的标记。具体如下:
经过第一次标记后的对象,根据 此对象是否有必要执行finalize()方法 进行筛选。被判定为确实有必要执行finalize()方法的对象将会被放置在一个名为F-Queue的队列之中。
假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机将这两种情况都视为“没有必要执行”。
稍后会由一条由虚拟机自动建立的、低调度优先级的 Finalizer线程 去执行F-Queue中对象的finalize()方法。
finalize()方法是对象逃脱死亡命运的最后一次机会,稍后收集器将对F-Queue中的对象进行 第二次小规模的标记。如果对象在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,那在第二次标记时它将被移出 “即将回收” 的集合;如果对象这时候还没有逃脱,那基本上它就真的要被回收了。
这种自救的机会只有一次,因为对象的finalize()方法最多只会被系统调用一次。
分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清 除阶段回收被标记的对象所占用的空间,容易产生内存碎片。
按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。消耗内存多,但是没有内存碎片产生,用于新生代对象创建。
标记后不是清理对象,而是将存活对象移向内存的一端,然后清除端边界外的对象。
和指针碰撞不同
根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃 圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
目前大部分 JVM 的 GC 对于新生代都采取 Copying 算法,因为新生代中每次垃圾回收都要 回收大部分对象,即要复制的操作比较少,但通常并不是按照 1:1 来划分新生代。一般将新生代 划分为一块较大的 Eden 空间和两个较小的 Survivor 空间(From Space, To Space),每次使用 Eden 空间和其中的一块 Survivor 空间,当进行回收时,将该两块空间中还存活的对象复制到另 一块 Survivor 空间中。
而老年代因为每次只回收少量对象,因而采用 Mark-Compact 算法。
把一个对象赋给一个引用变量,这个引用变量就是一个强引 用。当一个对象被强引用变量引用时
软引用需要用 SoftReference 类来实现,对于只有软引用的对象来说,当系统内存足够时它 不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。
弱引用需要用 WeakReference 类来实现,它比软引用的生存期更短,对于只有弱引用的对象 来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。
虚引用需要 PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。虚 引用的主要作用是跟踪对象被垃圾回收的状态。
Safepoint 可以用在不同地方,比如GC、Deoptimization,在Hotspot VM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。
从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停暂停所以活动线程,但是线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待GC结束。
https://www.jianshu.com/p/c79c5e02ebe6
指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
指发生在老年代的 GC,出现了 Major GC,经常会伴随着至少一次的 Minor GC(但非绝对的,在 Parallel Scavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程)。Major GC 的速度一般会比 Minor GC 慢 10 倍以上。
JVM 系列文章之 Full GC 和 Minor GC
from区 to区,反复横跳,进入老年代
设置参数,可让创建对象时,直接进入old区。
如果对象在 Eden 区出生并经过第一次 Minor GC 后仍然存活,并且能够被 Surviror 容纳的话,将被一定到 Survivor 空间中,并且对象年龄设为 1。对象在 Survivor 中每“熬”过一次 Minor GC,年龄+1,默认到 15 就晋升到老年代。但并不是永远要求对象年龄必须达到那个参数,如果在 Survivor 空间中相同年龄所有对象的大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。
-XX:MaxTenuringThreshold=15 CMS里面默认是6。
大多数情况下,对象优先在 Eden 区中分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC。
虚拟机提供了一个-XX:PretenureSizeThreshold
参数,不同垃圾收集器默认值不同,直接在 Eden 区。大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区(from
区to
区)之间发生大量的内存复制。不同分代,采用不同垃圾回收算法,young 区采用的是复制清除算法,如果是大对象,就得不偿失了。
注意:PretenureSizeThreshold
参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合,可以考虑ParNew加CMS的收集器组合。
一个简单的方法,在 Spring Boot项目中写个 循环依赖类(需要特殊处理,在我的 github 上的一个项目中有),然后用 类层次 类去引用,再Debug,就能看见 栈溢出信息,和 from to区的信息。
反复横跳,大于 15 次,晋升为老年代对象。
在发生 Minor GC 之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果是,Minor GC 确保安全。看 HandlePromotionFailure 是否允许担保失败。如果允许,会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次 Minor GC,尽管这次 Minor GC 有风险,如果小于或者配置的不允许,那么就改成一次 Full GC。
-Xms -Xmx 设置成一样 。例如 -Xms2048M -Xmx2048M
-XX:USEBAISEDLOCKED=FALSE 关闭偏向锁。JDK 1.6引入新概念,在线程竞争不激烈时引入,偏向锁,轻量级锁。支持锁的升级和降级,但并发比较大的环境下,关掉这个是好的选择。在对象头中标出,00,01,10,11,两位标出是什么状态。
年轻代:-XX:+UseParNewGC。
老年代:-XX:+UseConcMarkSweepGC。
-XX:-DoEscapeAnalysis
: 表示关闭逃逸分析 从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis。逃逸分析是让某些朝生夕死的对象,在栈上创建对象,随着栈的消亡而消亡。
频繁触发 Full GC ,如果使用的是 G1,可以加上 -XX:+PrintAdaptiveSizePolicy 参数,查看到底是谁引发的
更多见 https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html。比如你用的是 Azkaban,这种朝生夕死的任务执行的项目,它默认的配置是很简单的,也是很坑的。我的建议是把下面的调整到 5、5。当然,这个我也只是简单测了,改成这样后,就没有之前的 OOM 问题了。更好的比例,需要你一遍遍调。
-XX:NewRatio=n | Ratio of new/old generation sizes. The default value is 2. |
---|---|
-XX:SurvivorRatio=n | Ratio of eden/survivor space size. The default value is 8. |
https://www.cnblogs.com/straybirds/p/8513870.html
什么时候加载,虚拟机规范没强制要求,这点虚拟机自己发挥,但是初始化阶段,虚拟机规范严格规定了有且仅有 5 种情况必须立即对类进行初始化。
Bootstrap ClassLoader(C++ 实现,负责将存放在 <JAVA_HOME>\lib
目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的仅按照文件名识别,例如 rt.jar 名字不符合也不会加载。加载到虚拟机的内存中。返回 null 就能用这个加载器加载)
Extension ClassLoader(Java 实现负责加载 <JAVA_HOME>\lib\ext
目录中的,或者被 java.ext.dirs 系统变量所指定的路径中的所有类库,开发者可以直接用)
Application ClassLoader(Java 实现 一般情况下,这个就是默认的类加载器)
自定义 ClassLoader
自己覆盖 loadClass 。OSGi 给“高速奔跑的汽车换轮胎”。还有公司要求会这个。。。。
局部变量表
动态连接
方法返回地址
操作数栈
方法调用
解析
分派
动态类型语言支持
这个就是方法调用就是压栈,舍弃当前栈帧就是返回上一个方法。Debug 的 drop frame。
程序源码 -> 语法解析 -> 单词流 -> 语法解析 -> 抽象语法树
二选一
-> 指令流 -> 解释器 -> 解释执行
-> 优化器 -> 中间代码 -> 生成器 -> 目标代码
例如
1 | String a = "Foo" + "Bar"; |
注解处理
自动拆装箱
锁消除(编译时就把“傻瓜式加锁“代码给去掉,没必要加锁的,就不加)
JIT —— Just In Time,当调用频率到一定值时,开启即时编译,跳过 class,直接生成对应汇编,运行汇编文件。很多其他语言也有这个高级 feature。
方法内联 —— 我感觉是借鉴 cpp,直接把两段方法合并成一个方法。
逃逸分析 —— 栈上创建对象
https://zhuanlan.zhihu.com/p/29881777
无非就是搞了个抽象,具体实现,不同虚拟机不同的来。
volatile 是 Java 提供的轻量级同步机制
MESI 协议是一个基于失效的缓存一致性协议,是支持回写(write-back)缓存的最常用协议。也称作伊利诺伊协议 (Illinois protocol,因为是在伊利诺伊大学厄巴纳-香槟分校被发明的[1])。与写通过(write through)缓存相比,回写缓冲能节约大量带宽。总是有“脏”(dirty)状态表示缓存中的数据与主存中不同。MESI协议要求在缓存不命中(miss)且数据块在另一个缓存时,允许缓存到缓存的数据复制。与MSI协议相比,MESI协议减少了主存的事务数量。这极大改善了性能。[2]
JMM(Java Memory Model)本身是一种抽象的概念,并不真实存在,它描述的一组规则或规范,通过这组规范定义了程序中各个变量(含实例字段,静态字段和构成数组对象的元素)的访问方式。
JMM关于同步的规定:
更多https://blog.csdn.net/t894690230/article/details/50588129
https://juejin.im/post/5ae6d309518825673123fd0e
https://en.wikipedia.org/wiki/Happened-before
自旋锁的定义:当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。
自旋锁的原理比较简单,如果持有锁的线程能在短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞状态,它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取,这样就避免了用户进程和内核切换的消耗。
因为自旋锁避免了操作系统进程调度和线程切换,所以自旋锁通常适用在时间比较短的情况下。由于这个原因,操作系统的内核经常使用自旋锁。但是,如果长时间上锁的话,自旋锁会非常耗费性能,它阻止了其他线程的运行和调度。线程持有锁的时间越长,则持有该锁的线程将被 OS(Operating System) 调度程序中断的风险越大。如果发生中断情况,那么其他线程将保持旋转状态(反复尝试获取锁),而持有该锁的线程并不打算释放锁,这样导致的是结果是无限期推迟,直到持有锁的线程可以完成并释放它为止。
解决上面这种情况一个很好的方式是给自旋锁设定一个自旋时间,等时间一到立即释放自旋锁。自旋锁的目的是占着CPU资源不进行释放,等到获取锁立即进行处理。但是如何去选择自旋时间呢?如果自旋执行时间太长,会有大量的线程处于自旋状态占用 CPU 资源,进而会影响整体系统的性能。因此自旋的周期选的额外重要!JDK在1.6 引入了适应性自旋锁,适应性自旋锁意味着自旋时间不是固定的了,而是由前一次在同一个锁上的自旋时间以及锁拥有的状态来决定,基本认为一个线程上下文切换的时间是最佳的一个时间。
Jdk1.6 锁的升级与降级,自旋锁->偏向锁->轻量级锁->重量级锁(操作系统内核的 mutex lock)
在加锁和内存上提供的语义与内置锁相同,此外它还提供了可定时、可中断、可轮询、公平性,以及实现非块结构的加锁。只要在需要这些高级的功能时,用 ReentrantLock,否则还是应该优先使用 synchronized。
synchronized 比 ReetrantLock 还有个优点:在线程转储中能给出在哪些调用帧获得了哪些锁,并能够检测和识别发生死锁的线程。JVM 并不知道哪些线程持有 ReetrantLock,因此在调试使用 ReetrantLock 的线程的问题时,将起不到帮助作用。
https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Multithread/ThreadLocal.md
Spring MVC 中,RequestHolder 使用 ThreadLocal 进行 HttpServletRequest 进行缓存。还有事务,AopProxyHolder、MyBatis 的 PageHelper 这种,都是根据当前线程的变量来确定的。
https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Multithread/AQS.md
Doug Lea 设计的,CountDownLatch、ReentrantLock 都继承这个类,是 Java 最低层级的同步机制。
AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器。
AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
volatile 变量 + 双向队列。
只有一个线程能执行,如 ReentrantLock。又可分为公平锁和非公平锁,ReentrantLock 同时支持两种锁,下面以 ReentrantLock 对这两种锁的定义做介绍:
多个线程可同时执行,如 Semaphore/CountDownLatch。Semaphore、CountDownLatCh、 CyclicBarrier、ReadWriteLock 我们都会在后面讲到。
ReentrantReadWriteLock 可以看成是组合式,因为 ReentrantReadWriteLock 也就是读写锁允许多个线程同时对某一资源进行读。
不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只需要实现共享资源 state 的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS 已经在上层已经帮我们实现好了。
https://time.geekbang.org/column/article/92524
Fork/Join 是一个并行计算的框架,主要就是用来支持分治任务模型的,这个计算框架里的 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。这两部分的关系类似于 ThreadPoolExecutor 和 Runnable 的关系,都可以理解为提交任务到线程池,只不过分治任务有自己独特类型 ForkJoinTask。
ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。ForkJoinTask 有两个子类——RecursiveAction 和 RecursiveTask,通过名字你就应该能知道,它们都是用递归的方式来处理分治任务的。这两个子类都定义了抽象方法 compute(),不过区别是 RecursiveAction 定义的 compute() 没有返回值,而 RecursiveTask 定义的 compute() 方法是有返回值的。这两个子类也是抽象类,在使用的时候,需要你定义子类去扩展。
Fork/Join 并行计算的核心组件是 ForkJoinPool。ForkJoinPool 本质上也是一个生产者 - 消费者的实现,但是更加智。ThreadPoolExecutor 内部只有一个任务队列,而 ForkJoinPool 内部有多个任务队列,当我们通过 ForkJoinPool 的 invoke() 或者 submit() 方法提交任务时,ForkJoinPool 根据一定的路由规则把任务提交到一个任务队列中,如果任务在执行过程中会创建出子任务,那么子任务会提交到工作线程对应的任务队列中。
如果工作线程对应的任务队列空了,是不是就没活儿干了呢?不是的,ForkJoinPool 支持一种叫做“任务窃取”的机制,如果工作线程空闲了,那它可以“窃取”其他工作任务队列里的任务,例如下图中,线程 T2 对应的任务队列已经空了,它可以“窃取”线程 T1 对应的任务队列的任务。如此一来,所有的工作线程都不会闲下来了。ForkJoinPool 中的任务队列采用的是双端队列,工作线程正常获取任务和“窃取任务”分别是从任务队列不同的端消费,这样能避免很多不必要的数据竞争。我们这里介绍的仅仅是简化后的原理,ForkJoinPool 的实现远比我们这里介绍的复杂
Fork/Join 并行计算框架主要解决的是分治任务。分治的核心思想是“分而治之”:将一个大的任务拆分成小的子任务去解决,然后再把子任务的结果聚合起来从而得到最终结果。这个过程非常类似于大数据处理中的 MapReduce,所以你可以把 Fork/Join 看作单机版的 MapReduce。
Fork/Join 并行计算框架的核心组件是 ForkJoinPool。ForkJoinPool 支持任务窃取机制,能够让所有线程的工作量基本均衡,不会出现有的线程很忙,而有的线程很闲的状况,所以性能很好。Java 1.8 提供的 Stream API 里面并行流也是以 ForkJoinPool 为基础的。不过需要你注意的是,默认情况下所有的并行流计算都共享一个 ForkJoinPool,这个共享的 ForkJoinPool 默认的线程数是 CPU 的核数;如果所有的并行流计算都是 CPU 密集型计算的话,完全没有问题,但是如果存在 I/O 密集型的并行流计算,那么很可能会因为一个很慢的 I/O 计算而拖慢整个系统的性能。所以建议用不同的 ForkJoinPool 执行不同类型的计算任务。
一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。线程 A 有🔒 1,我还想获取🔒 2,但是另一个线程 B 持有🔒 2,两个线程都不释放锁,等着对方释放锁,就会导致死锁。一般死锁了,只能重启。
互斥,共享资源 X 和 Y 只能被一个线程占用;
占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
不可抢占,其他线程不能强行抢占线程 T1 占有的资源;
循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。
破坏其中一个,就可以成功避免死锁的发生。
全称是 Compare And Swap,即“比较并交换。
CAS 指令包含 3 个参数:共享变量的内存地址 A、用于比较的值 B 和共享变量的新值 C;并且只有当内存中地址 A 处的值等于 B 时,才能将内存中地址 A 处的值更新为新值 C。作为一条 CPU 指令,CAS 指令本身是能够保证原子性的。
ABA 问题,加版本号。
1 | public final boolean compareAndSet(int expect, int update) { |
1 | UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) |
1 | > What I'm a bit uncertain about here is which barriers we need and which are optimal as it seems to be a bit different for different ARM versions, maybe somebody can enlighten me? Also I'm not sure how hotspot checks ARM version to make the appropriate decision. |
1 | /** |
corePoolSize —— 线程池的目标大小,即在没有任务执行时线程池的大小,并且只有在工作队列满了的情况下才会创建超过这个数量的线程。在 ThreadPoolExecutor 初期,线程并不会立即启动,而是等到有任务提交时才会启动,除非调用 prestartAllThreads。
maximumPoolSize —— 线程池最大值。 the maximum number of threads to allow in the pool。
keepAliveTime —— 当线程数超过核心线程数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。 when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
unit —— 上面的时间单位the time unit for the {@code keepAliveTime} argument
workQueue —— 任务队列,这个是提交的任务队列,如果提交的任务大于最大线程数了,会优先放到这个任务队列中。 the queue to use for holding tasks before they are executed. This queue will hold only the {@code Runnable} tasks submitted by the {@code execute} method.
threadFactory —— 利用 ThreadFactory#newThread 来创建 Thread,这里可以对 Thread 进行命名。the factory to use when the executor creates a new thread.
handler —— 执行不了了,wokerqueue 都塞不下了,就执行拒绝策略。可以自定义,用来重试任务,默认是直接丢掉。JDK 提供了 4 种。the handler to use when execution is blocked because the thread bounds and queue capacities are reached
ThreadPoolExecutor 允许提供一个 Blocking Queue 来保存等待执行的任务。
public LinkedBlockingQueue() { this(Integer.MAX_VALUE);}
无界队列将不会执行拒绝策略,当然如果你的线程数大于了 Integer.MAX_VALUE 还是会执行的,前提是你到达这么多。一般情况就 OOM 了。所以《阿里巴巴 Java 开发规范》中不使用 Executors 创建线城池。
AbortPolicy:中止策略是默认的饱和策略,该策略将抛出未检查的 RejectedExecutionException 调用者可以捕获这个异常,然后根据需求编写自己的处理代码。
DiscardPolicy:当新提交的任务无法保存到队列中等待执行时,抛弃策略会悄悄抛弃该任务。
CallerRunsPolicy:调用者运行(Caller-Runs)策略实现了一种调节机制,该策略既不会抛弃任务,也不会抛弃异常,而是将某些任务回退到调用者,从而降低新任务的流量。它不会在线程池的某个线程中执行新提交的任务,而是在一个调用了 execute 的线程中执行该任务。
DiscardOldestPolicy:抛弃最旧的(Discard-Oldest)策略则会抛弃下一个将被执行的任务,然后尝试重新提交新的任务。如果工作队列是一个优先队列,那么”抛弃最旧的“策略将导致抛弃优先级最高的任务,因此最好不要将“抛弃最旧的”饱和策略和优先级队列放在一起使用。
对于非常大的或者无界的线程池,可以通过使用 SynchronousQueue 来避免任务排队,以及直接将任务从生产者移交给工作者线程。SynchronousQueque 不是一个真正的队列,而是一种在线程之间进行移交的机制。要将一个元素放入 SynchronousQueue 中,必须有另一个线程正在等待接受这个元素。如果没有线程正在等待,并且线程池的当前大小小于最大值,那么 ThreadPoolExecutor 将创建一个新的线程,否则根据饱和策略,这个任务将被拒绝。
许多情况下都需要使用定制的线程工厂方法。
例如,为线程池中的线程制定一个 UncaughtExceptionHandler,或者实例化一个定制的 Thread 类用于执行调试信息的记录。线程优先级(其实执行的时候优先级只是个参考),或者守护状态(也不建议),最常用的其实就是取个名字。
Pivatol 团队就封装了个 NamedThreadFactory,简单的封装,简单的应用。
1 | package io.micrometer.core.instrument.util; |
SpringBoot 相关的监控解决方案从 SpringBoot 2.0开始全面更改为Micrometer,不过要知道 Micrometer 与 Spring 属于同门,都是Pivotal旗下的产品。
beforeExecute
afterExecutor
terminated
添加日志、计时、监视或统计信息收集的功能。无论任务是从 run 中正常返回,还是抛出一个异常而返回,afterExecute 都会被调用。如果是一个 Error 就不会。如果 beforeExecute 抛出一个 RuntimeException,那么任务将不被执行,并且 afterExecute 也不会被调用。
在线程池完成关闭操作时调用 terminated,也就是在所有任务都已经完成并且所有工作者线程也已经关闭后。terminated 可以用来释放Executor 在其生命周期里分配的各种资源,此外还可以执行发送通知、记录日志或者收集 finalize 统计信息等操作。
IBM
引入虚拟 IP,keepalived
基于 XML、Properties 配置
XMLBeanDefinitionReader#loadBeanDefinitions(String resourceUrl);
BeanDefinitionReader 的实现类 AbstractBeanDefinitionReader,而 AbstractBeanDefinitionReader 有三个实现类。分别对应 XML、Properties、Groovy 文件读取方式。现在都不推荐用这几个。
1 | package org.springframework.beans.factory.support; |
基于 注解 配置
就是配置 @Compment、 @Bean 等注解来实现,@Service 和 @Repository 里面有加 @Compment 只是为了让代码分层更清晰而已。
基于 Spring API 配置
DefaultListableBeanFactory 实现了 BeanRegistry 接口,其中 registerBeanDefinition 方法就是在配置。
1 | public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {} |
一般是这个 GenericBeanDefinition 类,不管你是什么类,在我这,都叫 BeanDefinition ,而且在后面会有个 Merge 过程,将所有 BeanDefinition 再次转换成 RootBeanDefinition
然后命名为 mbd 进行各种操作。
面向资源 BeanDefinition 解析(里面有各种 Load 方法)
面向注解 BeanDefinition 解析
1 | // 这个类没有子类,也不继承 Resource ,就是纯粹的解析注解的 BeanDefitionReader |
这里你都用 Java API 方式配置了,一定有 BeanDefition 配置了。
DefaultListableBeanFactory 实现了 BeanDefinitionRegistry 。它还有其他的实现类,关于 XML 、注解、Groovy、Reactive(响应式的,Josh Long 在 19年推特上有置顶 《Reactive Spring》)、还有其他的 GenericApplicationContext。
1 | public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { |
1 | public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory { |
一般的 BeanDefinition 是从 GenericBeanDefinition 转换成 RootBeanDefinition。子的 BeanDeifinition 去合并(merge)父的 BeanDefinition 相关配置。
1 | //在 AbstractBeanFactory 中,执行依赖查找的时候,doGetBean 会执行 |
至此 BeanDefinition 变成 Class 的操作已经结束。一般情况下,就是利用 加载 BeanFactory 的ClassLoader来加载,只是多了个 Java 安全的校验加载。
主要是下面这个接口,在Spring 5前面有个Adpter类,就是和 WebMvcConfigurerAdapter 一样,为了适配之后的类。继承这个接口,实现 postProcessBeforeInstantiation 方法,就可以对 Bean 实例化前进行操作。增强事务功能就是对这个方法进行了改造。
1 | public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { |
实例化就是上面的 doCreateBean 方法。
1 | // AbstractAutowireCapableBeanFactory |
构造器注入,是按照类型注入。也可以通过 @Qualifier指定
1 | // InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation |
也就是为保证 postProcessAfterInitialization 方法一定
执行,其实有两处互斥的地方调用了该方法。
populateBean 就是属性赋值阶段
1 | // AbstractAutowireCapableBeanFactory |
按顺序执行
在执行 populateBean 方法之后,执行
1 | // 3 |
BeanPostProcessor#postProcessBeforeInitialization
依次往下执行
注解 @Postconstructor
接口 InitializingBean
元信息配置 @Bean(init-method=”init”)
BeanPostProcessor#postProcessAfterInitialization
SmartInitializingSingleton#afterSingletonsInstantiated
适合 ApplicationContext 中回调
DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
执行次序依次往下执行
来源于 https://juejin.cn/post/6844903608224333838#heading-9
人家是专门做面试方向的,可以关注公众号,支持一下 Java Guide,只是讲了最基本的 Java 面试题,还不错。
所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。
Spring并不直接管理事务,而是提供了多种事务管理器 ,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 Spring事务管理器的接口是: org.springframework.transaction.PlatformTransactionManager ,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
PlatformTransactionManager接口中定义了三个方法:
1 | Public interface PlatformTransactionManager()...{ |
Spring中PlatformTransactionManager根据不同持久层框架所对应的接口实现类,几个比较常见的如下图所示
事务管理器接口 PlatformTransactionManager 通过 getTransaction(TransactionDefinition definition) 方法来得到一个事务,这个方法里面的参数是 TransactionDefinition类 ,这个类就定义了一些基本的事务属性。
那么什么是事务属性呢?
事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。事务属性包含了5个方面。
TransactionDefinition接口中定义了5个方法以及一些表示事务属性的常量比如隔离级别、传播行为等等的常量。
我下面只是列出了TransactionDefinition接口中的方法而没有给出接口中定义的常量,该接口中的常量信息会在后面依次介绍到。
1 | public interface TransactionDefinition { |
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致一下的问题。
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复度和幻读区别:
不可重复读的重点是修改,幻读的重点在于新增或者删除。
例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。
例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
支持当前事务的情况:
不支持当前事务的情况:
其他情况:
这里需要指出的是,前面的六种事务传播行为是 Spring 从 EJB 中引入的,他们共享相同的概念。而 PROPAGATION_NESTED 是 Spring 所特有的。以 PROPAGATION_NESTED 启动的事务内嵌于外部事务中(如果存在外部事务的话),此时,内嵌事务并不是一个独立的事务,它依赖于外部事务的存在,只有通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交。如果熟悉 JDBC 中的保存点(SavePoint)的概念,那嵌套事务就很容易理解了,其实嵌套的子事务就是保存点的一个应用,一个事务中可以包括多个保存点,每一个嵌套子事务。另外,外部事务的回滚也会导致嵌套子事务的回滚。
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、 JMS 资源,以及自定义的事务性资源等等。如果确定只对事务性资源进行只读操作,那么我们可以将事务标志为只读的,以提高事务处理的性能。在 TransactionDefinition 中以 boolean 类型来表示该事务是否只读。
这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的)。 但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
TransactionStatus 接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息.
PlatformTransactionManager.getTransaction(…) 方法返回一个 TransactionStatus 对象。返回的TransactionStatus 对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务)。
TransactionStatus接口接口内容如下:
1 | public interface TransactionStatus{ |
首先,这只能作用于方法层级上面,字段层级不行。Spring AOP 离开了 IoC 容器,就没有所谓的 AOP,具体的是在 Bean 实例化前,实现了 SmartInstantiationAwareBeanPostProcessor 的 AbstractAdvisorAutoProxyCreator 3个实现类来搞的。AnnotationAwareAspectJAutoProxyCreator、DefaultAdvisorAutoProxyCreator、InfrastructureAdvisorAutoProxyCreator。
Java 的 Proxy 或者 CGLIB(ASM)动态代理,实现 AOP,做方法前后等增强。各种 Advisor 增强。
前者是必须有接口,用实现同一个接口的生成类替换原来的类。后者是生成其子类,来增强原有类,所以 final 方法会被代理失效。
https://juejin.im/post/5bf4fc84f265da611b57f906
一个是接口,一个做它的子类,对原有类型进行提升
Proxy.newInstance
本质上是实现一个子类,去提升该类的方法。所以不要将类或方法设置成 final 类型的,类设置了会报错,作为不了他的子类,方法设置成 final,只能 invoke 不能增强该方法 。
1 | import org.springframework.cglib.proxy.Enhancer; |
其实还是基于 ASM 来做的。
Ljava.lang.String
这种,直接生成 class 文件,织入 [Ljava.lang.String 这种代码,来在虚拟机内部动态生成 class 文件。
首先 prototype 不让循环依赖
其次是构造器注入依赖,必须提供无参构造器,让 bean 能够实例化,如果没有,那也会报错。
最终,Spring 会先实例化对象,将对象放入 earlySingletonObjects 中,如果循环依赖开始,优先查找 earlySingletonObjects。
1 | public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { |
所有面试题
https://blog.csdn.net/ThinkWon/article/details/104391081
handlerMapping -> handler ->
其实看 DispatherServlet#doService 方法就行了。所谓的图,不懂的人,还是看不懂的,看源代码就知道了。
前置知识是 MethodHandler
其实 Spring Cloud Alibaba 开源,是为了更好的卖自家的云产品,例如 RocketMQ,大厂没有什么真正开源,就是为了钱罢了,用爱发电这种事,大家都比较难做。
Spring Cloud 服务注册、服务发现几个抽象。
DiscoveryClient、ServiceInstance
租约机制。
Eureka 实现了 AP。任何 Server 都是主 Server,Server 与 Server 之间同步需要时间,可能会出现不一致的情况。Consistency
Nacos 实现了两种 AP,CP 模式,需要哪种可以指定。
前者使用 HTTP 协议,更为通用,适合不是那么注重性能的场景或者需要跨语言的场景。
虽然 Dubbo 协议也支持,但不是支持所有语言。
Sentinel 除了熔断限流,还有分布式应用监控的功能
我选择 Confluent Kafka
挺好用,隔离机制,以及发布信息等做的挺好,就是要配置 MySQL,启动三个不同的 jar,内部实现是 Eureka + http long polling 长连接。
基于 PerpetualCache 的 HashMap 本地缓存, 其存储作用域为 Session, 当 Session flush 或 close 之后, 该 Session 中的所有 Cache 就 将清空, 默认打开一级缓存。
与一级缓存其机制相同, 默认也是采用 PerpetualCache, HashMap 存储, 不同在于其存储作用域为 Mapper(Namespace), 并且可自定义存储源, 如 Ehcache。 默认不打开二级缓存, 要开启二级缓存, 使用二级缓存属性类需要实 现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置
就是跨 SqlSession 的缓存,生产上不建议开启。
简单工厂模式又叫静态方法模式。
补充:根据输入参数,或调用不同静态方法创建不同类型实例。
注意事项
1 | public class Singleton{ |
将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。
https://time.geekbang.org/column/article/199674
我们把类的必填属性放到构造函数中,强制创建对象的时候就设置。如果必填的属性有很多,把这些必填属性都放到构造函数中设置,那构造函数就又会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些必填属性是否已经填写的逻辑就无处安放了。
如果类的属性之间有一定的依赖关系或者约束条件,我们继续使用构造函数配合 set() 方法的设计思路,那这些依赖关系或约束条件的校验逻辑就无处安放了。
如果我们希望创建不可变对象,也就是说,对象在创建好之后,就不能再修改内部的属性值,要实现这个功能,我们就不能在类中暴露 set() 方法。构造函数配合 set() 方法来设置属性值的方式就不适用了
另外,MyBatis 也有 SqlSessionFactoryBuilder 来构建 SqlSessionFactory(虽然也可以用 Java Bean 的方式)。
1 | public final class BeanDefinitionBuilder { |
https://blog.csdn.net/baiye_xing/article/details/76427717
来源于这个大佬的 https://www.processon.com/view/link/5f27c4e17d9c0835d3a35995
词法解析 -> 如果开启了缓存(5.7后默认关闭),如果没有修改内容,则返回结果 -> 词法解析生成树 -> 调用 innodb ->
读未提交 Read Uncommitted
读已提交 Read Committed
可重复读 Repeatable Read
串行化 Serializable
分别解决了事务执行的不同情况。
这些是事务型数据库设计的基本概念
两年前使用 PL/SQL 对慢 SQL 的解释查询计划小优化。其实还有其他的 SQL 优化,没展示出来,项目后期帮其他组员重构优化代码和 SQL。
https://yq.aliyun.com/articles/687976?spm=a2c4e.11155435.0.0.5f4633120ERia8
还有 like ‘%xx%’, like ‘xx%’, like ‘%xx’
我把其他组员的第一个改成了第二个,因为第二个能用到索引。这也是优化 SQL 的一个小技巧。
具体原因,是因为根据 ASCII 比对的,比对成了就返回。有前缀索引内味了。
百度开源的,基于 MySQL 以及 RocksDB 实现的分布式数据库。通过 Partition Region 的概念实现,理论上没有存储瓶颈。
有点像 TiDB,也被人说是 C++ 版本的 TiDB。
这个 RocksDB 也被用于 Pika 中,是一种高效的且大容量的 NoSQL 数据库。
阿里开源的数据库。
Redis 是一个主要由 Salvatore Sanfilippo(Antirez)开发的开源内粗数据结构存储器。因为其丰富的数据类型结构的值,可以被用作缓存、数据库、分布式锁和消息队列等1
Redis 包含了 5 种的基本数据类型
String
Hash
List
Set
SortedSet
和四个特殊的数据类型
注意,这个 5 种的基本数据类型不代表它的具体实现。它的具体实现是根据值的大小,而不同的。下面有个图2,
可以看出来,除了它的表面上的对应的实现,还有压缩列表这个数据结构(ZipList),在它的值到达一定阈值时,会自动转换为其表面的实现。
其实可以这么记,String 就是 Simple Dynamic String,Set 是哈希表和整数数组,List 、SortedList 和 Hash 在一定阈值后变成其对应实现。List -> 双向链表,Hash -> 哈希表,SortedSet -> 跳表.
下面是 Redis 6.0.5 的 redis.conf 的配置及其注释(可以跳过不看)。
1 | ############################### ADVANCED CONFIG ############################### |
下面我讲下对应的数据类型及其数据结构实现
为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。
一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。所以,我们常说,一个哈希表是由多个哈希桶组成的,每个哈希桶中保存了键值对数据。
哈希桶中的元素保存的并不是值本身,而是指向具体值的指针。指针你懂我意思吧,就是个内存地址,并不是实际内容。这个其实就是 HashMap,讲这个,就顺便复习下 HashMap 的东西。tips:这里的 *key 其实是 c++ 里面的声明变量的方式。和 Java 里面的 String s 这种类似
这里其实 Java 里面的本来应该常用哈希表(HashTable)的,这里的哈希表和 Java HashMap 实现是差不多的。后者是双向链表(过一定阈值)转红黑树。
哈希冲突就是 12%6 = 0,24%6 = 0,或者两个不同的键算出了同样的哈希值。单单靠计算哈希值然后取模的方式,不同的键值肯定会存在一样的取模后的值。所以哈希表里面就会用往下加 。但是这个往下加也有个限度,它会一个个加,加到 10w 个,那就要往下找 10w 次,对本来是 O(1) 查找速度的数据结构肯定接受不了。在 Java 的 HashMap 中,如果单个链表长度过长,则会进行扩容,在其中进行 rehash 。
为了解决那么多的节点可能出现在哈希表的一个下标下,那么就需要 rehash 来重新调整哈希表的大小,即数组大小。
为了使 rehash 操作更高效,Redis 默认使用了两个全局哈希表:哈希表 1 和哈希表 2。一开始,当你刚插入数据时,默认使用哈希表 1,此时的哈希表 2 并没有被分配空间。随着数据逐步增多,Redis 开始执行 rehash,这个过程分为三步[3]:
到此,我们就可以从哈希表 1 切换到哈希表 2,用增大的哈希表 2 保存更多数据,而原来的哈希表 1 留作下一次 rehash 扩容备用。
这个过程看似简单,但是第二步涉及大量的数据拷贝,如果一次性把哈希表 1 中的数据都迁移完,会造成 Redis 线程阻塞,无法服务其他请求。此时,Redis 就无法快速访问数据了。为了避免这个问题,Redis 采用了渐进式 rehash。
简单来说就是在第二步拷贝数据时,Redis 仍然正常处理客户端请求,每处理一个请求时,从哈希表 1 中的第一个索引位置开始,顺带着将这个索引位置上的所有 entries 拷贝到哈希表 2 中;等处理下一个请求时,再顺带拷贝哈希表 1 中的下一个索引位置的 entries。如下图所示:
压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。
压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。和数组不同的是,压缩列表在表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数;压缩列表在表尾还有一个 zlend,表示列表结束。
在压缩列表中,如果我们要查找定位第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,就没有这么高效了,只能逐个查找,此时的复杂度就是 O(N) 了。
下面不是重点可以跳过
属性 | 类型 | 长度 | 用途 |
---|---|---|---|
zlbytes | unit32_t | 4字节 | 记录整个压缩列表占用的内存字节数;在对压缩列表进行内存重分配,或者计算 zlend 的位置时使用。 |
zltail | unit32_t | 4字节 | 记录压缩列表表尾节点距离压缩列表的起始地址有多少字节:通过这个偏移量,程序无需遍历压缩列表就可以确定表尾节点的地址。 |
zllen | unit16_t | 2字节 | 记录了压缩列表包含的节点数量:当这个属性的值小于 UINT16_MAX(65535)时,这个属性的值就是压缩力表包含节点的数量;等于时,节点的真实数量需要遍历整个压缩列表才能计算得出。(所以压缩列表节点数不宜过大) |
entryX | 列表节点 | 不确定 | 压缩列表包含的各个节点,节点的长度由节点保存的内容决定 |
zlend | unit8_t | 1字节 | 特殊值 0xFF (十进制 255),用于标记和压缩列表的末端 |
下面是一个压缩列表的样例[4]
压缩列表节点数不宜过大!!!
跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位。
跳跃表(SkipList)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
跳跃表支持平均 O(logN)、最坏 O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。
在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。
和链表、字典等数据结构被广泛地应用在Redis内部不同,Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。
下面是演示跳表找一个节点。以此类推,三级索引,N 级索引。当数据量很大时,跳表的查找复杂度就是 O(logN)。
更为详细的跳表介绍(可以不看)
还有,为什么选择跳表而不是平衡树,看这个解释(可以跳过不看)
名称 | 时间复杂度 |
---|---|
哈希表 | O(1) |
跳表 | O(logN) |
双向链表 | O(N) |
压缩列表 | O(N) |
整数列表 | O(N) |
不同操作的复杂度集合类型的操作类型很多,有读写单个集合元素的,例如 HGET、HSET,也有操作多个元素的,例如 SADD,还有对整个集合进行遍历操作的,例如 SMEMBERS。这么多操作,它们的复杂度也各不相同。而复杂度的高低又是我们选择集合类型的重要依据。
《Redis 使用手册》
所谓的单线程,其实是指 Redis 对读和写键值的时候是单线程操作(这里就会导致某个命令如果执行耗时过长,会导致 Redis 实例卡住),和传统的 Socket 单线程 accept 接收不同。Redis 采用了 select/epoll IO多路复用的方式,将所有到达的 TCP 请求,进行了汇总到事件队列中,然后由 Redis 主线程一条条执行命令。
所谓单线程,是指网络 IO 和键值对读写是由一个线程来完成的。用于集群数据同步、持久化(save/bgsave)、异步删除都是由其他线程来完成的。
默认为关闭,需手动设置开启
即使开启了多线程,Redis 对读和写键值的时候,还是单线程了,只不过是多线程接受消息。
一主多从,客观下线
// TODO 判断过程
16384个哈希槽,CRC16
Codis
// TODO 分配哈希槽命令
一主多从,RDB 同步
replica buf,以及对应的 log
// TODO 同步步骤
利用 taskset 将主线程进行绑核操作。
lscpu 查看 cpu 是不是 numa 架构,来进行 CPU 绑核操作。华为的 OpenGuass 数据库也是利用了这个绑核操作,在数据库启动的时候就会自动绑核做极致优化。
数据的容器,具体方法,里面有读指针和写指针等。
入站管道。
少了两步骤,调用的操作系统的复制方法。
少了用户态的参与。
https://zhuanlan.zhihu.com/p/78869158
使用复杂的协议,进行拆包。
前序:根左右
中序:左根右
后序:左右根
1 | public class Node{ |
1 | public List<Integer> preorderTraversal(TreeNode root) { |
1 | public int maxDepth(TreeNode root) { |
1 | public void sort(int[] arr) { |
单体 -> SOA -> 微服务 -> Serveless
下一代架构,Serveless
ACL示例:MySQL,MongoDB,HBase 都是以 ACL 作为权限控制思想,MySQL 在赋予用户权限时,有个 acl_users 数组进行存储 all_user 信息(不仅在 mysql.user 这个表里加数据)。
RBAC示例:常见的权限系统,在 人员 1<–>n 角色 1<–>n 权限。
https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
阮一峰大佬的云冲印的例子。
其实现 Spring Security Oauth2
参考 TiDB,或者 GFS 升级版 Colossus(套娃)。
基础:将 Hash 函数的值域空间组织成一个圆环,计算出对应的 key 的 hash 值在环上对应的区间。
进阶:对每个节点进行计算多个 Hash 值,引入虚拟节点,虚拟节点映射到真实节点。
https://www.infoq.cn/article/7cBOXVbB6B5V0BJh6Rfx
https://juejin.im/post/5b849878e51d4538c77a974a
进程内缓存Guava cache 、Ecache,也可以使用其提供的同步机制同步多个进程间缓存。
// TODO《深入分布式缓存》
https://www.tomorrow.wiki/archives/334
page cache。最好不要改,redis 利用 page cache 做了优化,改大了影响性能。
// TODO 详细解释 page cache
可以将用户的 token 作为键值,使用 登陆 -> UUID -> token -> token为键,用户信息为值 ,将用户信息放入 Memcached/Redis集群之中。
对用户 token/id 采用 Hash 取模的方式,将用户 session 强行绑定在固定机器上,就不用跨实例共享 session 了(也叫粘性 Session,缺点很明显,动态扩容,会导致大量 Session 失效)。
ACK机制,三次握手,四次挥手
无连接协议即用户数据报协议(UDP),通常在性能至关重要并且能够容忍一定的数据包丢失的情况下。用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据报的通信协议,位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被规范。典型网络上的众多使用UDP协议的关键应用在一定程度上是相似的。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验字段。
UDP适用于不需要或在程序中执行错误检查和纠正的应用,它避免了协议栈中此类处理的开销。对时间有较高要求的应用程序通常使用UDP,因为丢弃数据包比等待或重传导致延迟更可取。
由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。某些应用程序(如TFTP)可能会根据需要在应用程序层中添加基本的可靠性机制。[1]
一些应用程序不太需要可靠性机制,甚至可能因为引入可靠性机制而降低性能,所以它们使用UDP这种缺乏可靠性的协议。流媒体,实时多人游戏和IP语音(VoIP)是经常使用UDP的应用程序。 在这些特定应用中,丢包通常不是重大问题。如果应用程序需要高度可靠性,则可以使用诸如TCP之类的协议。
例如,在VoIP中延迟和抖动是主要问题。如果使用TCP,那么任何数据包丢失或错误都将导致抖动,因为TCP在请求及重传丢失数据时不向应用程序提供后续数据。如果使用UDP,那么应用程序则需要提供必要的握手,例如实时确认已收到的消息。
由于UDP缺乏拥塞控制,所以需要基于网络的机制来减少因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送端无法检测拥塞,所以像使用包队列和丢弃技术的路由器之类的网络基础设备会被用于降低UDP过大流量。数据拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制,来减小这个潜在的问题。
许多关键的互联网应用程序使用UDP[2],包括:
流媒体、在线游戏流量通常使用UDP传输。 实时视频流和音频流应用程序旨在处理偶尔丢失、错误的数据包,因此只会发生质量轻微下降,而避免了重传数据包带来的高延迟。 由于TCP和UDP都在同一网络上运行,因此一些企业发现来自这些实时应用程序的UDP流量影响了使用TCP的应用程序的性能,例如销售、会计和数据库系统。 当TCP检测到数据包丢失时,它将限制其数据速率使用率。由于实时和业务应用程序对企业都很重要,因此一些人认为开发服务质量解决方案至关重要。[3]
TCP 是面向连接的传输,管理了两个端点之间的连接的建立,在连接的生命周期内的有序和可靠的消息传输,以及最后,连接的有序终止。相比之下,在类似于 UDP 这样的无连接协议中,并没有持久化连接的概念,并且每个消息(一个 UDP 数据报)都是一个单独的传输单元。
UDP 没有 TCP 的纠错机制,其中每个节点都将确认它们所接收到的包,而没有被确认的包会被发送方重新传输。
UDP 提供了向多个接收者发送消息的额外传输模式
单播——发送消息给一个由唯一地址所标识的单一网络目的地。
多播——传输到一个预定义的主机组。
广播——传输到网络(或者子网)上的所有主机。
理清调用链路、流量控制、慢调用降级。
为避免单个服务实例宕机导致服务雪崩,通常有集群管理或服务熔断机制,可以两个一起用。Dubbo 服务设置里面手动设置阈值。
对服务实例设置白名单机制,对不同服务进行分级处理,优先处理等级高的服务请求。我觉得可以把调用失败的请求,转到 mq 上,由一群专门用于处理调用失败请求的服务,进行定时执行从 mq 尝试拉取失败请求,进行重试。
如果服务消费者 A、B、C 都依赖服务提供者 D,如果前面做了服务分级,则可以在实例负载超过警戒水位线,进行关闭对低优先级的请求。
提前做好扩容方案。
Sentinel 都符合了这些要求(应急预案不含)。本质上都是舍车保帅,保证能用的服务不挂,保证优先级高的服务能用,提前准备应对方案。
volatile,synchronized
JUC
强一致性
要求无论数据的更新操作是在哪个副本上执行,之后所有的读操作都要能够获取到更新的最新数据。
弱一致性
系统的某个数据被更新后,后续对该数据的读取操作到的可能是更新前的值,也可能是更新后的值。全部用户完全读取到更新后的数据需要经过一段时间,这段时间称为“不一致性窗口”
最终一致性
最终一致性是弱一致性的特殊形式,这种情况下系统保证用户最终能够读取到某个操作对系统的更新,“不一致窗口”的时间依赖于网络的延迟、系统的负载和副本的个数。
通过简单加机器,简单的配置就能实现更高吞吐量,那这就是易扩展。
https://time.geekbang.org/column/article/40743
减库存一般有三种
下单减库存可以通过数据库事务控制,但是下了单不一定付款。
付款减库存,如果并发比较高,可能出现买家下单后付不了款的情况,因为商品已经被其他人买走了。
预扣库存,买家下单后,库存为其保留一定时间(如10分钟),超过这个时间,库存将会自动释放,释放后其他买家可以继续购买(有点锁的味道)。在买家付款前,系统会校验订单的库存是否还有保留,如果没有保留,则再次尝试预扣;如果库存不足(预扣失败),则不允许继续付款,如果预扣成功,则完成付款并实际地去减库存。
对商品剩余数量的查询,可以使用缓存 Ecache/Guava Cache 进行本地缓存返回。
应用层做排队。按照商品维度设置队列顺序执行,这样能减少同一台机器对数据库同一行记录进行操作的并发度,同时也能控制单个商品占用数据库连接的数量,防止热点商品占用太多的数据库连接。
数据库层做排队。阿里的数据库团队开发了针对这种 MySQL 的 InnoDB 层上的补丁程序(patch),可以在数据库层上对单行记录做到并发排队。
HTTP Header gzip
从数据库开始使用缓存(不建议) -> 不建议使用 MyBatis 的二级缓存,进程内缓存 Guava cache,Ecache -> 跨进程缓存 (Redis ,对值结构;要求复杂点的系统不推荐Memcached)-> 静态资源缓存(CDN)
分析 dump 日志,合理设置启动参数,Xms 设置为机器内存的 65% - 70%。
其实硬件性能提升是所有优化里面,能最简单,最大的优化。生产上都是 Nginx + F5 来提升单体应用。
// TODO 把 19 年如何解决 CPU 使用率飙升的命令写出来
Arthas
使用Hadoop 进行数据分析。
Storm 是 2011 年 Twitter 开源的一个实时的分布式流式处理系统,有点类似于 Hadoop 提供的大数据解决方案,但是它要处理的对象是没有终点的数据流(也叫无界数据流),而非 Hadoop 的 MapReduce 那样的批处理系统。
过程往往是从 OLTP 库中,以及日志系统中,提取和清洗(数据清洗可以用 Kafka Stream)所需要的数据到 OLAP 系统(所在的银行当前系统就是这样的)。构建在 hive 平台,然后在 OLAP 系统上进行多维度复杂的数据分析和汇总操作,利用这些数据构建数据报表,进行前端展示。我们做的是每天全量同步。使用的 Sqoop,没用 DataX 。
使用 sqoop
使用 MySQL 主从机制,通过伪装成从库进行 binlog —> Kafka (任意 MQ) —> 其他库
算是备忘录模式的体现,全量和增量。
Zookeeper
是一个开源的分布式协调服务软件,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步操作。最终,将简单易用的接口和性能高效,功能稳定的系统提供给用户。
分布式应用程序可以基于 Zookeeper
实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
Zookeeper 保证了分布式一致性特性:
Zookeeper
提供了一个多层级的节点命名空间(节点称为 znode
)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。Zookeeper
为了保证高吞吐和低延迟,在内存中维护了这个树状目录结构,这种特性使得 Zookeeper
不能用于存放大的数据,每个节点的存放数据上限为 1M。
ZAB
协议是为分布式协调服务 Zookeeper
专门设计的一种支持崩溃恢复的原子广播协议。
ZAB
协议包括两种基本的模式:崩溃恢复和消息广播。
当整个Zookeeper
集群刚刚启动或者 Leader
服务器宕机、重启或者网络故障导致不存在过半的服务器与Leader
服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式,首先选举产生新的Leader
服务器,然后集群中Follower
服务器开始与新的Leader
服务器进行数据同步,当集群中超过半数及其与该 Leader
服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader
服务器开始接收客户端的事务请求生成事务提案进行事务请求处理。
PERSISTENT
:持久节点,除非手动删除,否则节点一直存在于Zookeeper
上
EPHEMERAL
:临时节点 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与Zookeeper
连接断开不宜一定会话失效),那么这个客户端创建的所有临时节点都会被移除。Kafka
集群就是基于临时节点。
PERSISTENT_SEQUENTIAL
:持久顺序节点 基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字
EPHEMERAL_SEQUENTIAL
:临时顺序节点 基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由副节点维护的自增整型数字。
Zookeeper允许客户端向服务端的某个Znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据Watcher通知状态和事件类型做出业务上的改变。
工作机制:
客户端注册watcher
服务端处理watcher
客户端回调watcher
Watcher特性总结:
一次性
无论是服务端还是客户端,一旦一个Watcher被触发,Zookeeper都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,不然对于更新非常频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大。
客户端串行执行
客户端Watcher回调的过程是一个串行同步的过程。
轻量
Watcher通知非常简单,只会告诉客户端发生了事件,而不会说明事件的具体内容。
客户端向服务端注册Watcher的时候,并不会把客户端真实的Watcher对象实体传递到服务端,仅仅是在客户端请求中使用boolean类型属性进行了标记。
watcher event异步发送watcher的通知事件从server发送到client是异步的,这就存在一个问题,不同的客户端和服务器之间通过socket进行通信,由于网络延迟或其他因素导致客户端在不通的时刻监听到事件,由于Zookeeper本身提供了ordering guarantee,即客户端监听事件后,才会感知它所监视znode发生了变化。所以我们使用Zookeeper不能期望能够监控到节点每次的变化。Zookeeper只能保证最终的一致性,而无法保证强一致性。
注册watcher getData、exists、getChildren
触发watcher create、delete、setData
当一个客户端连接到一个新的服务器上时,watch将会被以任意会话事件触发。当与一个服务器失去连接的时候,是无法接收到watch的。而当client重新连接时,如果需要的话,所有先前注册过的watch,都会被重新注册。通常这是完全透明的。只有在一个特殊情况下,watch 可能会丢失:对于一个未创建的znode的exist watch,如果在客户端断开连接期间被创建了,并且随后在客户端连接上之前又删除了,这种情况下,这个watch事件可能会被丢失。
Topic
Broker
Partition
Producer
Consumer
Leader Replica
Follower Replica
Rebalance
Consumer Offset
Consumer Group
Cordinator
Cotroller
Interceptor
Kafka 处理的主要对象。
主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
向主题发布消息的客户端应用程序。
订阅这些主题消息的客户端应用程序就被称为消费者。
指的是多个消费者实例共同组成一个组来消费一个主题。该组主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。消费者组提升了消费者端的吞吐量。
一个 Kafka 集群由一个至多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。
备份机制
领导者副本,对外提供服务。
追随者副本,不对外提供服务,不能与外界进行交互。对 Leader 副本同步有延迟。
协调者
比如 MongoDB 和 Elasticsearch 中的 Sharding、HBase 中的 Region,其实它们都是相同的原理,只是 Partitioning 是最标准的名称。
生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。如你所见,Kafka 的分区编号是从 0 开始的,如果 Topic 有 100 个分区,那么它们的分区号就是从 0 到 99。
一个有序不变的消息队列,每个主题下可以有多个分区。
副本是在分区这个层级定义的,每个分区下可以配置若干个副本,其中只能有一个领导者副本和 N-1 个追随者副本。生产者向分区写入消息,每条消息在分区中的位置信息有Offset 的数据来表征。分区的位移总是从 0 开始。
消费者组里面的所有消费者实例不仅“瓜分”订阅主题的数据,它们还能彼此协助,假如组内的某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Faild 实例之前负责的分区转移给其他或者消费者。这就是 Rebalance,这个有很多 Bug。
每个消费者在消费消息的过程中必然需要有个字段记录它当前消费到了分区的哪个位置上。
Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的 Broker 管理起来,此时就使用到了Zookeeper。在 Zookeeper 上会有一个专门用来进行Broker服务器列表记录的节点:
/brokers/ids
每个Broker在启动时,都会到Zookeeper上进行注册,即到/brokers/ids下创建属于自己的节点,如/brokers/ids/[0…N]。
Kafka使用了全局唯一的数字来指代每个Broker服务器,不同的Broker必须使用不同的Broker ID进行注册,创建完节点后,每个Broker就会将自己的IP地址和端口信息记录到该节点中去。其中,Broker创建的节点类型是临时节点,一旦Broker宕机,则对应的临时节点也会被自动删除。
1 leader
0 不管
-1 所有
和大家的零拷贝技术一样,少了用户态的参与。
只有 Leader 副本才供外界读写,Follower 副本只是作为冗余,怕 Leader 副本 down 掉数据全部丢失。
Follower 副本定期向 Leader 拉取数据。
Kafka 默认不使用压缩,合理使用压缩,可以减少带宽使用。
GZIP、Snappy 、LZ4、Zstandard 算法(简写为 zstd)
在 Producer 端和 Broker 端设置相同(或者 Broker 端不改 compression.type 参数,默认为 producer 端的压缩方法)。
在吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;
而在压缩比方面,zstd > LZ4 > GZIP > Snappy。
高水位的作用在 Kafka 中,高水位的作用主要有 2 个。
它依靠一个名为 LSO(Log Stable Offset)的位移值来判断事务型消费者的可见性。
与 Leader 副本保持同步。判断的条件有两个。
Leader Epoch
消费者消费消息是需要一定时间的,为了防止推送过多消息给 Consumer 端,导致 Consumer 挂掉,让 Consumer 按需来自己 pull 消息。
https://blog.csdn.net/yangqian201175/article/details/51462413
《Lucene in action》
primary shard, replica shard,cordinating
Aggregation
TermLevel
支持多种类型查询,返回对应 score
docker pull docker.elastic.co/logstash/logstash:7.1.0
中文环境设置 I18N_LOCALE=zh-CN
Hadoop 分布式文件系统。NameNode + DataNode,NameNode 只存 metadata,实际文件存在各个 DataNode。
是的,它只是个文件系统,虽然一切皆文件。
MapReduce 是一种处理海量数据的并行编程模型和计算框架,用于对大规模数据集进行并行计算。
MapReduce 一个任务的运行需要由 JobTracker 和 TaskTracker 两类空志节点的配合来完成,JobTracker 将 Mappers 和 Reducers 分配给空闲的 TaskTracker 后,有TaskTracker 来执行这些任务。MapReduce 框架尽量在那些存储数据的节点(如 DataNode)上来执行计算任务,采用移动计算而非移动数据的思想,减少数据在网络中传输,以此来提高计算效率。同时 JobTracker 也负责任务的容错管理,如果某个 TaskTracker 发生故障,JobTracker 会重新进行任务调度。
将 SQL 解释成 MapReduce 任务。
Hive是早期将高级查询语言SQL引入Hadoop平台的引擎之一,早期的Hive服务器进程被称作Hiveserver1;Hiveserver1既不支持处理并行的多个连接,又不支持访问授权控制;后来这两个问题在Hiveserver2上被解决,Hiveserver2能够使用grant/revoke语句来限制用户对数据库、表、视图的访问权限,行列权限的控制是通过生成视图来实现的;但Hiveserver2的授权管理体系被认为存在问题,那就是任何通过认证登陆的用户都能够为自己增加对任何资源的访问权限。也就是说Hiveserver2提供的不是一种安全的授权体系,Hiveserver2的授权体系是为防止正常用户误操作而提供保障机制;不是为保护敏感数据的安全性而设计的。然而这些更多的是某些公司的说辞,事实上Hiveserver2自身的安全体系也在逐步完善,上述问题也在快速修复中。
从 Hive 连接中可以看出用的是 Hiveserver2
beeline -u jdbc:hive2://olap1:10000/ –maxWidth=1000
从 WEB 开发到离线数仓,一个用多中间件 CRUD 开发,到另一个用 SQL 开发。换个地方 CRUD 而已
UDF,UDAF,UDTF。脱敏函数(UDF),聚合函数(UDAF 自定义count,sum),UDTF
UDF 一进一出,实现 UDF 接口,编写evaluate方法,例如可用作脱敏函数,对数据进行脱敏。
1 | class SimpleUDFExample extends UDF{ |
UDAF 多进一出,实现 AbstractGenericUDAFResolver,可用作实现自定义聚合函数。下面是求两个列的线性方程的相关系数。
看另一篇文章。
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌 BigTable 的开源实现,主要用来存储非结构化和半结构化的松散数据,运行在 HDFS 之上。设计 RowKey 尽量将数据均地分布在各个 Region 上,并且 RowKey 为等长,用于拼接 RowKey 的列必须是确定长度的值,高频词往前提,同样查询频率的,辨识度高,更短的列往前提。等长是因为桶排序。
没有特殊要求,一个列族就可以满足大部分要求,多个列族会影响性能,实际生产中,都是一个列族,多个列族会有问题,具体的看《HBase 原理与实战》这本书。
拼接 Rowkey 是按照特定需求来做的,不能乱拼。
星环增强了 HBase 变成了 HyperBase。查询更方便,千亿数据,查询秒返回。支持普通单表查询,多表查询慢,聚合操作更慢。聚合操作使用以下部件实现。支持更为丰富的值类型,例如 JSON 存储。
不过还是只是支持 PB 级别数据罢了,再大就不太行了。
聚合操作。
Spark SQL 也可以将 SQL 转换成 MR 任务,星环的 Inceptor 就整合了 Spark。Hive-on-spark,将 Hive 的 MR 任务转换成 Spark 的 job。
流式处理中间件。还是写 SQL。
符合事件驱动架构设计。
Kafka Streaming 也可以,但前者大公司都在用。做个 CRUD boy 他不香吗?
Cloudera Data Hub,Transwarp Data Hub 一站式大数据平台
Transwarp Data Hub 对标的国外的 CDH,其实也用到了 CDH 开源的代码,我看到安装包里面有 CDH 的东西,并且他们封装的 Elasticsearch Transport 的 SDK,打包有问题。
Online analytical processing 联机分析处理
OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
OLAP由三个基本的分析操作组成:上卷(roll-up)、钻取(drill-down)、切片(slicing)和切块(dicing)。上卷涉及可以在一个或多个维度中累积和计算的数据的聚合。例如,所有的销售办事处汇总到销售部门,以预测销售趋势。相比之下,钻取是一种允许用户浏览详细信息的技术。例如,用户可以查看组成一个地区销售额的单个产品的销售额。切片和切块是说,用户可以从OLAP多维数据集中取出(切片)一组特定的数据,并从不同的角度查看(切块)切片
https://zh.wikipedia.org/wiki/%E7%B7%9A%E4%B8%8A%E5%88%86%E6%9E%90%E8%99%95%E7%90%86
联机事务处理(OLTP, Online transaction processing)是指透过信息系统、电脑网络及数据库,以在线交易的方式处理一般即时性的作业资料,和更早期传统数据库系统大量批量的作业方式并不相同。OLTP通常被运用于自动化的资料处理工作,如订单输入、金融业务…等反复性的日常性交易活动。 和其相对的是属于决策分析层次的联机分析处理(OLAP)。
《大型分布式网站架构·设计与实践》中只是一笔带过一些概念,没有 JMS 实际代码,然后用 ActiveMQ & JMS 的标题。
Java Message Service 是一组 Java 应用程序接口,它提供消息的创建、发送、接收、读取等一系列的服务。
JMS 定义了一组公共应用程序接口和相应的语法,是一种通用的 API。
它定义了五种消息类型,如下。
Message Type | Body Contains |
---|---|
TextMessage | A java.lang.String object (for example, the contents of an XML file). |
MapMessage | A set of name-value pairs, with names as String objects and values as primitive types in the Java programming language. The entries can be accessed sequentially by enumerator or randomly by name. The order of the entries is undefined. |
BytesMessage | A stream of uninterpreted bytes. This message type is for literally encoding a body to match an existing message format. |
StreamMessage | A stream of primitive values in the Java programming language, filled and read sequentially. |
ObjectMessage | A Serializable object in the Java programming language. |
Message | Nothing. Composed of header fields and properties only. This message type is useful when a message body is not required. |
Connection
Statement
ResultSet
DriverManager.getDriver(url);
数据源
连接池相关
ResultSet 扩展
分布式扩展
上面三个都是接口。
java.sql.Wrapper
java.sql.Connection
java.sql.Statement
java.sql.PrepareStatement
java.sql.CallableStatement
java.sql.DatabaseMetaData
java.sql.ParameterMetaData
java.sql.ResultSet
java.sql.ResultSetMetaData
这些接口都继承了java.sql.Wrapper接口,里面有两个方法
1 | /** |
JNDI(Java Naming and Directory Interface,Java命名和目录接口)为应用程序提供了一种通过网络访问远程服务的方式。
servlet-class
mapping
load-up
JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。
参考 https://www.ibm.com/developerworks/cn/java/j2ee/
十二要素程序的核心思想
十二要素程序的实践
代码库 | 一份版本控制下的基准代码库,多份部署 |
---|---|
依赖 | 显示声明和隔离依赖关系 |
配置 | 在环境中存储配置 |
后端服务 | 把后端服务当作附加资源 |
构建、发布、运行 | 严格分离构建和运行阶段 |
进程 | 将应用程序作为一个或多个无状态进程执行 |
端口绑定 | 通过端口绑定暴露服务 |
并发 | 通过进程模型进行扩展 |
易处理 | 通过快速启动和正常关机来最大限度地提高健壮性 |
开发/生产环境一致 | 尽可能保持开发、预发布和生产环境的配置一致 |
日志 | 将日志视为事件流 |
管理进程 | 将管理任务作为一次性进程运行 |
Pivotal 团队 12 年发布的云原生平台,完美实现了云原生的十二要素。Cloud Foundry 创始人之一,Chris Richardson,也是 《微服务架构设计模式》的作者。你想要了解微服务,这本书大量图解,帮你了解。
构建 Dockerfile,参考我的 evaluation 库
1 | docker build |
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
K3s 国产的轻量级的 K8s。
用树莓派搭建 K3s
Kubernetes 是一个 Docker 编排框架。Docker 编排框架将运行 Docker 的一组计算机视为资源池。你只需要告诉 Docker 编排框架运行你的服务的 N 个实例,它就会自动把其余的事情搞定。
有三个主要功能:
Kubernetes 在一组机器上运行。下图显示了 Kubernetes 集群的架构。Kubernetes 集群中的计算机角色分为主节点和普通节点(也称为节点)集群通常只有很少的几个主节点(可能只有一个)和很多普通节点。主节点负责管理集群。Kubernetes 的普通节点称为 “工作节点”,它会运行一个或多个 Pod。Pod 是 Kubernetes 的部署单元,由一组容器组成。
Kubenetes 集群由管理集群的主节点和运行服务的普通节点组成。开发人员和部署流水线通过 API 服务器与 Kubernetes 交互,API 服务器与主节点上运行的其他集群管理软件一起运行。应用程序容器在节点上运行,每个节点运行一个 Kubelet (它管理应用程序容器),以及一个 Kube-proxy (它将应用程序请求路由到 Pod),可以直接使用代理,也可以通过配置 Linux 内核中内置的 iptable 路由规则间接地完成路由工作。
普通节点运行多个组件,包括以下内容:
定义一个部署(Deployment)对象。最简单的方法是编写 YAML 文件。
1 | apiVersion: extensions/v1beta1 |
接下来是部署 Service(这里的服务发现组件),K8s 自带的。
部署 API Gateway。大同小异,同上。
K8s 将对 Pod 进行滚动升级。
1 | kubectl rollout undo deployment ftgo-restaurant-service |
这些内容都是一些概念,并不是实际的实现,尤其是 Serverless 截止 2021 年初还没有标准的规范,我 Amazon 可以说我 Lambda 是标准的,我 Spring Boot + Azure 也可以说是 Serverless,我 Serverless X 也可以说是这个。某一次的技术沙龙直播,我问这个腾讯相关的人员,说各有优缺点。
下面的图层描绘了不同抽象层次上的云服务类型。
功能即服务是一类云计算服务,它提供了一个平台,允许客户开发,运行和管理应用程序功能,而无需构建和维护通常与开发和启动应用程序相关的基础结构的复杂性。按照此模型构建应用程序是实现“无服务器”体系结构的一种方法,通常在构建微服务应用程序时使用。
Function as a service (FaaS) is a category of cloud computing services that provides a platform allowing customers to develop, run, and manage application functionalities without the complexity of building and maintaining the infrastructure typically associated with developing and launching an app.[1] Building an application following this model is one way of achieving a “serverless“ architecture, and is typically used when building microservices applications.
软件即服务Software as a Service,亦可称为“按需即用软件”(即“一经要求,即可使用”)软件即服务,它是一种软件交付模式。在这种交付模式中,软件仅需通过网络,不须经过传统的安装步骤即可使用,软件及其相关的数据集中托管于云端服务。用户通常使用精简客户端,一般即经由网页浏览器来访问、访问软件即服务。SaaS 最大的特色在于软件本身并没有被下载到用户的硬盘,而是存储在提供商的云端或者服务器。对比传统软件需要花钱购买,下载。软件即服务只需要用户租用软件,在线使用,不但大大减少了用户购买风险, 也无需下载软件本身,无设备要求的限制。
平台即服务,是一种云计算服务,提供运算平台与解决方案服务。在云计算的典型层级中,PaaS层介于软件即服务与基础设施即服务之间。
PaaS提供用户将云端基础设施部署与创建至客户端,或者借此获得使用编程语言、程序库与服务。用户不需要管理与控制云端基础设施(包含网络、服务器、操作系统或存储),但需要控制上层的应用程序部署与应用托管的环境。[1]
PaaS 将软件研发的平台做为一种服务,以软件即服务(SaaS)模式交付给用户。因此,PaaS也是SaaS模式的一种应用。但是,PaaS的出现可以加快SaaS的发展,尤其是加快SaaS应用的开发速度。
PaaS 提供软件部署平台(runtime),抽象掉了硬件和操作系统细节,可以无缝地扩展(scaling)。开发者只需要关注自己的业务逻辑,不需要关注底层。下面这些都属于 PaaS。
K8s + Docker 也就相当于 PaaS 的实现。
基础设施为服务。
云原生开发最终演化方向。
无服务化,冷启动应用,按需分配服务,适合边缘业务。
下下一代项目架构,目前只是 AWS 提供了 Lambda 来实现,在英文版的 InfoQ 上,有人把 Spring Boot + Azure = Serverless。
其实还没有非常明确的定义 Serverless 的规范,任何厂商都可以说他们的才是正统的 Serverless 服务器。
SPI(Service Provider Interface)是 JDK 内置的一种服务提供发现机制。SPI 是一种动态替换发现的机制。 SPI 典型的实现为 JDBC。
划分子域,子域内构建事件风暴。
infrastructure
repository
service
entity
可用表格,可用链表存储。
DockerDesktop
1 | ,"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"] |
1 | { |
打开 Terminal 进入 Users/YourName目录下,复制粘贴进去
1 | cd .docker |
重启docker
,镜像生效
如果 docker
点 prefrence
一直在更新状态,检查一下daemon.json
文件是否格式正确
别问我什么是代理,问就是不知道
我的本地代理端口是10080,你要是服务器的话,
http://[ ip address]:[port]
像这样
二选一,别两个都写,或者打开
terminal
,
export ALL_PROXY=socks5://127.0.0.1:10080;
export http_proxy=socks5://127.0.0.1:10080;
export https_proxy=socks5://127.0.0.1:10080;
,
FROM 你的服务器后,加上,Docker Compose 建议下一种方法。
1 | ENV http_proxy <HTTP_PROXY> |
1 | export http_proxy="<HTTPS_PROXY>" |
]]>https://www.jianshu.com/p/419eaf4425a6
http://pangguoming.com/blog/architecture/docker-configuration-file-daemon.json
折叠播放列表 ≡ ⬇️
我用虚拟机里面的
Win10
演示
GitHub
账号注册地址Git
下载地址NodeJs
下载地址Visual Studio Code
来编辑文件下载地址(这个是为了让你更好得编辑yml
文件,防止格式不正确,如果你有其他的,可以用其他的编辑器)上面的 3 个应用可以直接下载,等会再安装
如果你有github
账号,直接从第六步开始
输入账号/邮箱/密码。账号必须唯一
这一步是验证你是不是人机,图像没出来的话,请等一等,或者刷新一下。
不用管往下拉
Complete SignUp
到这里验证一下邮箱。你可以登陆你刚才注册用的邮箱,看下邮件,点击邮件里面的验证
Verify Email
。
Create a repository
你的用户名叫什么,就
[用户名].github.io
一定要叫这个名字。像下面这样,还有记得点初始化一个README
文件。很重要!!!!
创建好后就是下面这种情况
访问一下看行不行,正常情况都能访问。(如果你是之前创建的
Github
账号是要去settings
里面设置配置pages
,现在创建了这个名字的Repository
资料库就行了)。
双击安装包,一直点
next
,要注意勾选Additional icons
就行。安装好后,桌面有个左上角的图标的快捷方式,就算安装成功了。
下载好后双击安装的
NodeJs.msi
文件,一直点击next,accept
,next
直到完成。
安装完成后,按
win+R
键,输入cmd
。再输入node -v
或者npm -v
,如果有版本号输出,那就是安装好了。
一直点下一步就行了,记得点一个创建桌面快捷方式。安装好后有个快捷方式
输入并执行以下命令,一条一条复制粘贴按回车。
1 | npm config set registry https://registry.npm.taobao.org |
在浏览器中输入
localhost:4000
会看到以下页面
返回之前的命令行窗口,按
ctrl+c
输入Y
。确定你在Desktop/blog/
文件夹下时,输入以下命令。
1 | git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly |
将下面的
/hexo-butterfly-auxiliary-folder/_data
文件夹剪切到/blog/source
文件夹下。如图所示。
双击
VS Code
快捷键,然后在里面打开文件夹,操作如下
更改
/blog/_config.yml
文件中的theme
,将landscape
改成butterfly
。操作如下。
到这一步就完事了,在
blog
文件夹下输入下面的命令可以在本地跑了
1
2
3 hexo g
hexo s
在
/blog
下的_config.yml
里面可以改
在/blog 下面执行
hexo new page tags
,找到对应文件夹下面的index.md
文件,在下面的文件上加上type: "tags"
在
/blog
下面执行hexo new page categories
和上面的操作一样,找到/blog/categories/
文件夹下面的index.md
文件,在下面的文件上加上type: "categories"
。这里个tags
改成categories
就行了。
aside
这里可以改公告内容,侧边栏在哪边显示等等
avatar:
img: /img/yinyang.png
effect: false # 这个是是否旋转你的头像,默认是false
img
是图片路径,在/blog /themes/butterfly/source/img
下。粘贴自己想上传的头像,把这里的路径改一下,就可以了。我建议改成去图床获取头像,减少页面加载时。例如 img: https://i.loli.net/2020/08/15/cAenSihrD4CI3p9.png
subtitle
的sub
defual_top_img
图片中介绍
搜索
cover
这个是默认的文章封面,第二张图是文章中如何更改封面,第三张图是封面展示
ClickShowText
三选一,我建议是第三个
footer_custom_text
改成你想要展示的内容
添加 QQ
音乐列表,以及如何获得音乐 ID
和音乐列表 ID
。
QQ
音乐F12
,点到控制台顶部network
disstid: "7652784085"
这就是歌单 id,songlist
下是该歌单下所有歌曲信息(里面有很多重复的请求,外表光鲜亮丽,,网页版 QQ 音乐已经烂了,很多无用的请求虽然只有几 ms)。更多设置,请参考
可以通过两种方式,
hexo new
‘’这是一片文章’’
直接在blog/source/_posts
/中创建 md
文件,其实就是文本文件,你只要改后缀名就行了
文章头部有以下信息
1 | --- |
同样的,在
/blog
文件夹下,进行输入命令。通过Git bash
来操作,双击桌面的Git bash
。
1 | cd Desktop/blog |
到你的
github
下面的xxxx.github.io repository
下面,按步骤点击
添加
deploy key
更改
/blog
下面的_config.yml
文件。按照图中内容输出
在
Git bash
里面输入。执行完下面三个命令,会让你输入用户名和密码,输你自己的Github
的用户名和密码
1 | hexo clean |
一分钟左右,甚至马上你就可以访问
xxxxx.github.io
这个xxxx
是你的用户名
在
Teminal
中/blog
文件夹下输入下面命令
1 | hexo new "这是一篇文章" |
可以在
hexo g
之后,执行hexo s
,来在本地运行,访问localhost:4000
先审视一遍文章。
超过
1M
的图片,我建议压缩一下
我推荐
Typora
。下了腾讯管家的,可以在它的软件管家下载这个软件,或者如果你有更好用的
MarkDown
编辑器推荐的话,欢迎留言。
在source
文件夹下,新增 CNAME
文件,填上你的域名。具体操作,参考这里。我翻了几十篇博客,找到这个适合的。域名购买以及 CDN
选择,参考那篇文章。可以用免费的域名(不推荐,除非你只是拿来玩一玩的),也可以买 me
结尾的域名,具体购买,知乎上有域名购买推荐,例如这篇
]]>
Jackson
里面有个转字符串为Java
对象的方法,传进去的是
大概像下面这样
1 | public void batchInsertRecords(String str){ |
关于隐式转换,不只是 Java 的拆装箱,范型,在其他地方也有,如SQL
,select * from t where id = 1
;select * from t where id ='1'
完全是两个东西,一个会不走索引,一个走一级(主键)索引
在JDK1.5
前,范型(Java这里只是个语法糖/伪范型,每个编程语言都会去实现它)没有出来的时候,像ArrayList
里面提供的就是Object
返回。没有return (E) elementData[index]
这里面是没有E的,是Object
类型。能够在编译时检查类型错误,利用get()
方法取出的对象也不再是Objec
t引用,编译器可以认识此类型。
1 | public static void main(String[] args) { |
很多人可能说,我怎么可会犯这种错误。当你指定类型不明确时,进行强转,就会出现这个问题。
HBase Scan PageFilter 设置的返回数据量和实际返回的数据量不同。低版本的 Scan 没有 setLimit 方法。
1 | Scan scan = new Scan(); |
上面很大可能返回大于 200 条记录。
HBase 里 Filter 状态全部都是 Region 内有效的,也就是说,Scan 一旦从一个 Region 切换到另一个 Region,之前那个 Filter 的内部状态就无效了,新 Region 内用的其实是一个全新的 Filter。具体到这个问题,就是 PageFilter 内部计数器从一个 Region 切换到另一个 Region,计数器已经被清 0。——来自《HBase 原理与实践》
“大数据”是指传统数据处理应用软件时,不足以处理的大的或者复杂的数据集的术语。
大数据是个抽象的概念,和虚拟机一样,具体实现各有不同。每个语言的实现都是不一样的,这里讲的是 Java 相关的,应用相对来说很广的大数据组件。要了解结构化/非结构化/半结构化数据、数据挖掘相关的内容,可自行搜索其他的,这里只讲部分。
大数据又称海量数据。所有的大数据相关的中间件都离不开下面三个问题。
什么上卷,下钻,slice,dice,那是 OLAP 里面的内容,Wikipedia 里面把这个搞在一起了,虽然事实上两者经常混在一起。
GFS 登场,不要跟我说什么 RAID,不停加磁盘也是有限制的。
文件就是字节序列,仅此而已——《深入理解计算机系统》
Google File System 是 Google 发表的论文,提出了这个概念,Google 内部有实现了这个理论文件系统。Hadoop 内部实现叫 HDFS(Hadoop Distrubuted File System),其实就是加强版的文件系统。
下面是 HDFS 的总体架构图,主要是分两块
什么是元信息?
元信息是关于信息的信息,用于描述信息的结构、语义、用途和用法等。[^1]:
我认为是最小单元信息,精简的不能再精简的那种信息,相当于句柄。
这里的 NameNode 就是部署在一台服务器上,上面保存了元(必要的)信息。例如在 HDFS 中的文件路径,文件权限信息,文件具体在哪几个 DataNode 上的信息。比如我一个存在 HDFS 上一个文件,路径是 /tmp/shaluan/aorui.log,它是一个日志文件,我通过客户端传上去的。然后元信息就有[^2]:
NameNode 也是有主备(这里是主备,不是主从)的,保证 HDFS 高可用。
实际保存的文件的组件。可以看作一个 NameNode 部署在一个服务器上。
数据你看上去是 TB 级别的,其实里面被分成了很多个文件块。可能是 1 GB 一个文件块,每次读取文件的时候,就读那一小块。
而且一份数据不是单独保存在一个 DataNode 的,会进行冗余,保存在多个 DataNode 上,防止一个 DataNode 挂了,然后丢失数据的情况。多个 DataNode 同时挂掉的概率不大,不考虑这种情况。
DataNode 配合上 RAID,这样数据丢失的概率大大降低了。
MapReduce 登场,MapReduce 既是一种编程模型,在 Hadoop 里面的实现也叫 MapReduce。
这个理解起来比较费劲,就是 映射 > 归纳。你可以看作是一条 SQL 执行过程中,执行 SQL 语法解析树的过程。Reduce 就是规约,减少的意思,其实就是类似 Group By 操作,如果你看懂了我之前写的 UDAF 文章,那个类,理解起来就比较轻松了。
可以在多个机器上,采用并行的方式,进行高效的计算。
下面就是 Mapreduce 的过程,分词 -> 映射 -> 分组 -> 归纳(减少)
实际在需要编写 Mapper 类和 Redue 类来操作数据。
详细的内容可以参考这个。
BigTable 登场。 BigTable是一种压缩的、高性能的、高可扩展性的,基于Google文件系统(Google File System,GFS)的数据存储系统,用于存储大规模结构化数据,适用于云端计算。[^3]:
高效插入数据,不支持删除数据,只能根据时间戳来更新数据的 NoSQL 数据库。
下面是 HBase 🐳的表结构,一个字段只有时间戳、RowKey(关系数据库中的 id)和 col(关系数据库中的字段,什么 deleted,create_date这种)。然后映射表(实际取数据的表,映射成行式数据库)就是根据实际的 rowkey 和 col(字段)映射出来易于理解的关系型数据库类型的表。注意这个 ps 下的 ps 的1234 和 5678,他这个 t16 比 t02 晚,所以取最新的数据。HBase 不会删数据,只会取最新的数据。
在实际生产中,一般也就一个列族,RowKey 等长,不是特别长的 RowKey 等等设计,原因可以看《HBase 原理与实战》这本书。
这么多东西,全是一主多从的架构方式,让谁管理?Zookeeper 就登场了。
Zookeeper(动物管理员)为什么叫动物管理员,和上面的 HBase(🐳)Hadoop(🐘)以及下面的 Hive(🐝)Pig(🐷)有关。全是动物 logo,管理这些动物信息,能不叫 Zookeeper 吗。
用于管理主从信息,以及主从选举,如果从节点掉了,剔除从节点,保证高可用的中间件。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。[^4]:
当然 Zookeeper 也是一主多从架构。一个 Leader 多个 follower。
也是以文件形式保存信息的,一切皆文件。例如 /ids/broker/olap01,然后这个节点保存了很多信息,什么时间,ip 地址都可以塞进去。
主要分两种节点,细分是 4 种。
第一个永久保存的,第二个客户端连接的时候有,session 断了就没了。
其实很多组件的一部分都是在一台机器上的,比如 Zookeeper 的一个 follower 在服务器 A 上,HDFS 的 DataNode 也在,HBase 的 HMaster 也在。计算机资源(cpu 算力,内存容量等等)是有限的,所以要通过一个组件来调度这些组件合理的利用服务器资源。
哦,每次我要统计的时候,我都要写 Mapper 和 Reducer 函数,累不累?那些数学好,编程一般的,怎么做数据分析?有没有更简单的方式来搞?
Hive 和 Spark SQL 登场了。
Apache Hive是一个建立在Hadoop架构之上的数据仓库。它能够提供数据的精炼,查询和分析。[^5]:
上面的解释太官方了,其实就是你写 SQL,Hive 帮你把 SQL 转换成对应 MapReduce 任务,让你更方便查数据而已。
和一般规范的 SQL 没差,就是 insert into table(这里要加个 table 关键字)tableName,还有 UDAF 中不能嵌套其他方法,例如 select myudaf(avg(x),avg(y)) from xxtable group by x;
Hive 上不存数据,数据存在 HDFS 上,有比较多的数据格式存储。例如存成 Text、CSV、ORC、Holodesk等。数据是像下面这样存的。
employee.txt 这里面就以换行作为分隔符,也有用 \t 作为分隔符,分离成数据的。结合上面的 MapReduce 图就能看懂了。也可以用 | 作为分隔符,怎么舒服怎么来。
1 | 1,Alice |
1 | DROP TABLE IF EXISTS employee; |
Id | Name |
---|---|
2 | Bob |
1 | Alice |
下面是 Hive 的 JDBC URL。Hive2 协议解决了 Hive 协议的一些bug,所以现在用 Hive2 协议。
1 | jdbc:hive2://127.0.0.1:10000/xxx --maxWidth=1000 |
Pig是一个基于Apache Hadoop的大规模数据分析平台,它提供的 SQL-LIKE 语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig 为复杂的海量数据并行计算提供了一个简单的操作和编程接口,使用者可以透过Python或者JavaScript编写Java,之后再重新转写。
和 Hive 功能差不多,就是把特定的语言转换成 MapReduce 运算,只是不是用 SQL 这种语言。
也是 SQL,简化开发,上面的 Hive 只能是说作为离线数据,进行批处理。这两个组件,前者是 TDH 内置的流处理组件,后者 Flink 是阿里等大型企业推荐并提交源码的流处理组件。
有界流数据。
利用 Sqoop 可以做定时任务,每天在业务低谷期,从线上关系型数据库中抽取数据到 HDFS,可以用做离线数据分析等。
你可以把 Sqoop 想象成抽水机,数据(水)在不同数据库(水源)中,抽到 HDFS 中,然后 Hive 可以从 HDFS “导入”数据。
下面是 Sqoop 的一个用法。
1 | sqoop import --append --connect jdbc:mysql://localhost:3306/mall --username root --password 123456 --target-dir /long/sqoop --m 1 --table goods --fields-terminated-by '\t'; |
无界流数据。
比如 SlipStream (TDH 内的组件)就是创建表的时候绑定 Kafka 的某个 Topic,源源不断的从该 Topic 读取数据。避免上游数据量过大,消费不过来,从而需要反压机制(这个在另一篇介绍数据仓库的文章会提到)。
TDH 很多银行在用,对标的是国外知名的 CDH,就是贡献那个有 Cloudera Kafka 的。
可以求线性回归方程相关系数,来确定两个字段的相关值,进而做一系列的数据分析。
像下面这样,搜索量和票房的关系。
S 赛的 KI 上校(就是肯德基那个),是通过大量的离线数据(过去的大量玩家的比赛记录)分析 + 实时数据分析(当场比赛数据) => 推导出胜负曲线。狭义的数据分析分三块,现状分析、原因分析、预测分析,S 赛的 KI 上校就是先现状分析 –> 原因分析 –> 预测分析。
Cloudera Data Hub
Transwarp Data Hub
TDC
Transwarp Data Cloud
数据科学家是一个全新的工种,能够将企业的数据和技术转化为企业的商业价值。随着数据学的进展,越来越多的实际工作将会直接针对数据进行,这将使人类认识数据,从而认识自然和行为。Deep Learning、Machine Learning。
营销部门经常使用预测分析预测用户行为或锁定目标用户。预测分析开发者有些场景看上有有些类似数据科学家,即在企业历史数据的基础上通过假设来测试阈值并预测未来的表现。
这是你们以为的大数据开发。
为方便企业决策,出于分析性报告和决策支持的目的而创建的数据仓库研究岗位是一种所有类型数据的战略集合。为企业提供业务智能服务,指导业务流程改进和监视时间、成本、质量和控制。
报表 + 多维度数据库联机查询。做报表的。
数据安全这一职位,主要负责企业内部大型服务器、存储、数据安全管理工作,并对网络、信息安全项目进行规划、设计和实施。成都加米谷大数据培训机构,专注于大数据人才培养。
说白了,大数据运维 + 安全管理员。一站式大数据平台就是降低大数据运维和应用难度的,例如 CDH、TDH、阿里的飞天大数据平台。
企业要提高数据质量必须考虑进行数据管理,并需要为此设立数据管家职位,这一职位的人员需要能够利用各种技术工具汇集企业周围的大量数据,并将数据清洗和规范化,将数据导入数据仓库中,成为一个可用的版本。
下面是用 Kafka Streams 这种类型的做数据清洗和规范化大概的图。有三个系统,每个系统往不同的 topic 发消息,格式不同,然后数据清洗应用根据不同 Topic 设置不同规则,对数据进行清洗和规范化。当然这个数据清洗还可以做聚合运算等操作,将信息重新梳理,然后发给其他 Topic。
注:Kafka Streams 是一个非常非常非常基础的内容,很多东西你做不到配置即用,编写 SQL 就能跑起来这种境地,所以不建议在生产上直接使用 Kafka Streams 。
大数据重新激发了主数据管理的热潮。充分开发利用企业数据并支持决策需要非常专业的技能。信息架构师必须了解如何定义和存档关键元素,确保以最有效的方式进行数据管理和利用。信息架构师的关键技能包括主数据管理、业务知识和数据建模等。
数据中台构建。
OLAP在线联机分析开发者,负责将数据从关系型或非关系型数据源中抽取出来建立模型,然后创建数据访问的用户界面,提供高性能的预定义查询功能。
我这边就是和这个相关的,也和下面的研发沾点边,因为 HBase 和 Hive 没有提供健全的 HTTP 接口查询。目前只支持单表查询,以及 HBase 单表查询,并且采用 Fail-fast 原则,采用 FutureTask,必须在 6s 内返回结果,不至于一个查询拖垮整个链路调用,不至于其他系统调用我们的 Dubbo 服务出现问题。当然也解决了部分的 Spring boot data HBase 相关调用缓慢的问题。有点中间件的味道
或者直接开发一套解决大数据内容的中间件,用 Solr 或者 Elasticsearch 增强 HBase 这种。
可视化开发就是在可视化工具提供的图形用户界面上,通过操作界面元素,有可视化开发工具自动生成相关应用软件,轻松跨越多个资源和层次连接所有数据。过去,数据可视化属于商业智能开发者类别,但是随着Hadoop的崛起,数据可视化已经成了一项独立的专业技能和岗位。
光有 Hadoop 可不行,还需要可视化的内容,去更加方便操作里面的组件。[^6]:
GFS升级版
[3]:BigTable 维基百科
[4]:Zookeeper 维基百科
]]>[5]: Hive 维基百科
请购买实体书籍,支持作者、翻译以及出版社
1 | public static Boolean valueOf(boolean b){ |
静态工厂方法与设计模式中的工厂方法模式不同。并不能直接对应设计模式的工厂方法。
优势
BigInteger.probablePrime(int bitLength,Random rnd)
)Integer.MAX_VALUE = 0x7fffffff
(享元Flyweight
模式)真正的享元模式如下,Integer
中有个私有静态类,叫IntergeCache
Java8
允许接口中含有静态方法,Java9
允许接口中有私有的静态方法,但是静态域和静态成员变量仍然需要是公有的。1 | public static Integer valueOf(int i) { |
缺点
BeanDefinitionBuiler
就是将静态工厂方法
和 构建器
模式结合的案例。
JavaBean
模式(不推荐,当然我觉得不包括 POJO
类)
Builder
模式(lombok
提供了@Builder
注解,可以偷懒,但是就不要注解了,可以在顶部菜单栏Refactor
使用 delomok
生成相应代码)
1 | // 样例 |
如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是一种不错的选择
Singleton
属性如果要阻止反射实例化单例类,可以在被要求创建第二个实例的时候,抛出异常。
1 | /** |
单元素的枚举类型经常成为实现Singleton
的最佳方法。当然如果Singleton
必须扩展一个超类,而不是扩展Enum
的时候,则不宜使用这个方法。
下面是 Spring Boot 2.0 引入的单例类。具体执行顺序如下
SpringApplication#run --> SpringApplication#prepareEnvironment --> SpringApplication#configureEnvironment --> ApplicationConversionService#getSharedInstance
也是使用 DCL 思想(我觉得应该从 Stackoverflow 上面复制的)。
1 | public class ApplicationConversionService extends FormattingConversionService { |
像这种工具类就私有构造器。使用 final 防止继承,使用私有构造器防止实例化(开安全后防止反射实例化)。
1 | public final class DateUtil{ |
例如 spring.core 中的 String 工具类。
1 | public abstract class StringUtils { |
通过依赖注入而非手动 new 对象,降低类于类之间的耦合度。而且应该尽量是基于接口而非实现来注入,这样更适合*经常变更的类*,或者模块。当然,不是 Service 都需要写接口,除非你真的很需要,例如 SOA 程序、微服务程序,需要提供给外部 SDK。像 Spring Cloud 所有模块,以及 Spring 所定义的所有抽象一样,定义了统一的接口,引用的都是接口,而非实现类,Spring 统一的 Caching 等接口也是如此。
静态工具类和Singleton
类不适合于需要引用底层资源的类。
关于解耦,右侧有更多解释。细数软件架构中的解耦
集中化配置,根据服务动态解析 IP 也算是解耦的方式。
当创建一个新的实例时,就将该资源传到构造器中
依赖注入(Dependency Injection
)
类似的内容,在进程间的 Broker 消息模式也有体现。
关于构造器注入好,还是 Setter
注入好,个人认为是前者好。Spring
作者也推荐前者,因为这样能判断你是不是传了非空、非法的参数。
如果想更深入了解如何实现循环依赖,在构造器注入如何实现,可以看看 ObjectProvider,以及 Spring Boot MyBatis 的内容,那个比较简单。
Spring
中单例的对象,并不一定是全局唯一的,它是 每个ClassLoader
中唯一的,static
对象也是。所以插件 Spring Dev Tool 让项目重启,只需要新的 ClassLoader 加载这些内容。这里有个小知识点,就是分级处理。和 JVM 的分代处理其实是差不多的,就是将部分不变的类用固定的 ClassLoader 加载,项目中可变的类用新的 ClassLoader 加载,这样就实现每次代码变更,不用全部重新加载的功能了。当然,这里是简化了实现细节,内部实现没有这么简单。
1 | // DON'T DO THIS面试经常问到这个,傻瓜才会这么写 |
适配器是指这样一个对象:它把功能委托给一个后备的对象(backing object
),从而为后备对象提供一个可以代替的接口。
WebMvcConfigurerAdapter
这是个适配器,一般用于配置web
的一些配置,如拦截器Interceptor
,JSONformatter
等,不过在Java8
出来接口中声明 default
方法后,这个类就被声明 @Deprecated
。
优先使用基础类型而不是装箱基本类型,要当心无意识的自动装箱。(当然,实际生产中,除非你用于科学计算,一般都用包装类,例如 long 和 Long,小写的 l 容易看成大写 i 避免歧义)。
1 | // 不推荐下面的写法,会让系统无意义得创建很多Long类型对象。 |
1 | public class Stack{ |
内存泄漏的另一个常见来源是缓存。用WeakHashMap
代表缓存。只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,WeakHashMap
才有用处。
第三个常见来源是监听器和其他回调。可以借助 Heap
剖析工具(Heap Profiler
)发现内存泄漏问题。
finalizer
方法,和Java9
的cleaner
方法1 | public class Room implements AutoCloseable{ |
1 | // 正例 |
equals
方法?如果类具有自己特有的“逻辑相等”(logical equality
)概念,而且超类还没有equals
。这通常属于”值类“(Value class
),值类仅仅是表示一个表示值的类,例如Integer
或String
。
1 | String foo = new String("str"); |
equals方法实现了等价关系(equivalence relation
)
放心,在《算法》Java 版本的这本书上也有介绍,这只是个基本的概念而已。
– 所有前提是 对于任何非null
的引用值x
reflexive
):x.equals(x)
必须为true
symmetric
):如果x.equals(y)==true,必定y.equals(x);前提是两个非nulltransitive
):x.equals(y)==true
,y.equals(z)==true
,z.equals(x)==true
;consistent
):当x.equals(y)==true
时,只要在比较操作在对象中所用的信息没有被修改,多次调用,都是true
。null
的引用值x
,x.equals(null)==true;
里氏替换原则(Liskov substitution principle
)认为,一个类型的任何重要属性也将适用于它的子类型,因此为该类型编写的任何方法,在它的子类型上也应该同样运行得很好。
1 |
|
equals
方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用,hashCode
方法必须始终放回同一个值。在一个应用程序与另一个程序的执行过程中,执行hashCode方法所返回的值可以不一致。equals
调用相等,hashCode
一定相等equals
调用不相等,hashCode
可以一样。例如String
的hashCode
1 | public int hashCode(){ |
这是 HashMap
的实际的put
方法,里面通过
1 | // 如果你是 new HashMap()创建的对象,默认这里的 resize() 大小是 16,DEFAULT_INITIAL_CAPACITY = 1 << 4 //aka 16 |
下面是Spring
中的抽象Bean
定义类重写的hashCode()
和toString()
方法,重写toString()
让我们能更好的debug
以及了解这个类属性。String
的hashCode
是以31为优选乘子,选择相邻的质数也是ok
的,但是31 = (2<<5) -1
,可以被JVM
优化。
不建议用 Lombok
以及AutoValue
。代码是简洁了,维护起来很麻烦。
当然你要用,要注意用@Slf4j
,而不是@Log4j
,SpringBoot
默认使用Logback
,你指定了Log4j
,就会有冲突,你换成其他日志输出框架,那就有问题。Slf4j
有桥接包,屏蔽了这些内容,让你可以LoggerFactory.getLogger(xxx.class)
,而不用明确指定是哪个日志输出框架。
那Spring
和其他框架是怎么输出日志的呢,就是用 apache.logging
包下的protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory.LogFactory.getLog(this.getClass());
里面的getLog
方法,再来了LogAdpter.createLog()
这个 LogAdpter
里面就是去找slf4j
或者log4j
内容,当然你用Spring Boot
默认的 logback
就用Slf4j
再来个桥接包。
1 | final class LogAdapter { |
下面是解析 Spring
中AbstractBeanDefinition
的 toString()
方法。
1 | public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable { |
不可变的类永远都不应该提供clone
方法
实际上clone
方法就是另一个构造器,必须确保它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件(invariant
)。
Cloneable
架构与引用可变对象的final域的正常用法是不相兼容的。
HashMap.Entry
被加强了,它支持一个“深拷贝”deepCopy()
;
1 |
|
Java Shallow clone
Shallow clone is default implementation in Java. In overridden clone
method, if you are not cloning all the object types (not primitives(原生类型), then you are making a shallow copy.
Java Deep Copy
In the deep copy, we create a clone which is independent of original object and making changes in the cloned object should not affect original object.
1 | public interface Comparable<T>{ |
返回值规范
1 | this < t => -1, |
遵循下面几个规范
强烈建议x 比 y == 0
,x.equals(y) => true
,若违反了这个条件,都应该明确说明。
1 | BigDecimal foo = new BigDecimal("1.0"); |
在ocmpareTo方法中使用关系操作符 < 和 > 是非常繁琐的,而且容易出错,因此不建议使用
HashSet 会两个都存,TreeSet 只会存一个,因为利用了compareTo() 方法。
实现 Comparable 接口,有助于在有序集合中更好的排序。
区分一个组件设计得好不好,唯一重要的因素在于,它对外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。设计良好的组件会隐藏所有的实现细节,把API
与实现清晰地隔离开来。然后组件之间通过API
通信,一个模块不需要知道其他模块的内部工作情况。这个概念被称为信息隐藏(information hiding
)/封装(encapsulation
),是软件设计的基本原则之一。
例如Spring Boot 2.0
后的版本的Spring Boot
,直接在https://start.spring.io
直接生成就完事了,不像以前写一个Web
应用先要Servlet
容器(Tomcat/Jetty/Weblogic
等),再实现javax.servlet.http.HttpServlet
重写它的doGet/doPost
方法,甚至是service
方法(不建议这么做,有关内容自己谷歌 Http Code 304
),然后在 web.xml
文件中添加这么一坨东西。
1 | // Import required java libraries |
1 | <servlet> |
当然这些东西不算完,还要放进Servlet
容器中启动,最终返回信息。
而Spring Boot
只需要简单几行代码的配置,就能启动一个web
应用。
信息隐藏之所以重要,是因为
decouple
),使得这些组件可以独立地开发、测试、优化、使用、理解和修改。尽可能地使每个类或者成员不被外界访问
并且一个包级私有的顶层类(或者接口)只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个累的私有嵌套类(内部类)。像下面这样
1 | public class HashMap<K,V> extends AbstractMap<K,V> |
1 | public class ArrayList<E> extends AbstractList<E> |
公有类的实例域决不能是公有的,包含公有可变域的类通常并不是线程安全的。
虽然 ClassPathXmlApplicationContext 封装做的很好,但是学习起来比较费劲。
善用final
、加上final
的静态工厂,享元模式。BigDecimal.ZERO
,Integer
的自动拆装箱里面的CacheInteger
类。
我觉得更优的翻译应该叫组合优于继承。当然,不是所有情况下都要用组合。《UNIX 编程艺术》中也提到,善用组合。
下面是 Spring
基石 GenericApplicationContext
中的源码,其中 DefaultListableBeanFactory
才是真正的容器。这个叫组合模式,两者都实现了同一个接口(BeanFactory
),这里的 DefaultListableBeanFactory
可以是一个至多个,然后依次调用,直到返回结果为止。
1 | public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry{ |
用内含的方式实现,例如JFinal
中的Record
对象,内含了一个HashMap
对象,来实现一些操作。万物(单条数据)皆为Record
。
Spring 中 ApplicationContext 类型的对象就是内涵了个 BeanFactory,其实就是 DefaultListableBeanFactory,也就是所谓的 IoC (Inversion of Control)容器。
类必须精心挑选的受保护的(protected
)方法,提供适当的钩子(hook
),一边进入其内部工作中。
因为要符合里氏替换原则,之后开发的人,并不清楚你现在的类是什么意思。
类是单继承,接口可以多实现,多接口可以实现不同业务需求,由于1.8
后可以用default
修饰接口方法,实现和抽象类一样的效果,又可以有实体方法,又有待子类实现的抽象方法。
Netty 中的 ChannelInboundHandler 就是个很好的例子。
多个接口方法同名,实现类报错
1 | interface A{ |
接口是高度抽象的结果,而抽象类
慎用 default 去修饰接口方法
BeanFactory 接口定义了最基本的容器功能。
常量接口模式是对接口的不良使用
1 | public interface XXXConstants{ |
java.io.ObjectStreamConstants
是个反例
如果要去定义常量
要么在类内部定义,想 Integer.MAX_VALUE
,BigDecimal.ZERO
等等
要么用枚举实现,像我自定义的状态信息
接口应该用来定义类型。
字面意思。
像这种 AbstractApplicationContext
继承自 DefaultResourceLoader
,拥有了资源加载的能力,像 EventObject 这种就是标记类,你可以加上,也可以不加,但是这是约定俗称的事件对象的类。
著名的标签接口(tagging interface)java.util.EventListener
、java.lang.Serializable
。注意这里是接口,平常项目开发也是会自己定义标记接口的,里面没有任何方法(行为),仅起到标记作用。这个是约定俗称的内容,你不遵守,等待的就是报错(例如 Java 序列化没有实现 Serializable 接口,就会报错)。
1 | /** |
Builder
Map.Entry
public
修饰与文件名相同的类)1 | public class A{ |
这样有歧义,编译不给过,分开存。如果一定要放一起,就放在顶级类内部做静态成员类。
翻译版本有误,SINCE Java 5, generics have been a part of the language
. 翻译版本少了个 s 变成了 generic。因为 Think in Java 英文版中, generics 才是代表泛型。
1 | // 别这样使用,报黄线是结果,原因是没有确定类型,那么就是任何类型都可以存入,如果存错了东西,取出来强制转换的时候,会报错。编译时给不了提示。 |
List
和 List<Object>
是有区别的,后者明确告诉该容器接受所有任意类型对象。
必须在类文字(class literal
)中使用原生态类型
1 | private static final Logger log = LoggerFactory.getLogger(User.class); |
/uncheck/
⬆️尽量不要编译后出现这个(其实就是@SuppreWarnings("unchecked")
),除非可以证明引起警告的代码是类型安全的,用 /uncheck/ 或者 @SuppreWarnings("unchecked")
来禁止警告。尽可能在小的范围使用这个注解,像 synchronized
以及catch Exception
一样,尽可能精准,细粒度去做。这样好调试啊。
书上讲的 ArrayList.toArray(T[] a)
方法,在 JDK1.8
中,源码是把去警告的注解放在方法上的,和他推荐的不一样。当然还是按照作者推荐的,这样让后人更容易懂你写的代码,尽量别写出祖传代码.
1 | "unchecked") ( |
除非写游戏类的,用二维数组表示坐标什么的,科学计算用基础类型。
1 | // 编译不报错,运行报错 |
范型数组不存在,编译不通过。
列表帮你做好了动态扩容,类型转换等操作。
1 | // 以前写 BaseDao 这种类时写的反射方法,也是 ORM 框架中会用到的方法。 |
像上面这种
善用通配符,E Element
,T type
表示具体的类型,K V key Value
,? 不确定什么类型
JDK1.7
引入@SafeVarargs
放在方法上,消除使用范型方法警告
API
的灵活性1 | List<T extends Record> list; |
《阿里巴巴 Java 开发规范》中也明确指出了,少用甚至不用可变参数,这是个语法糖。
1 | public void foo(List<String>... stringLists); |
如果真的方法是安全的,对于每一个带有范型可变参数或者参数化类型的方法,都要用@SafeVarargs
进行注解.
以前写的手动分页的类。,List<E> Set<E> Map<K,V>
1 | public class Page<E>{ |
Java
的枚举本质上是int
值。《深入理解 Java 虚拟机》
介绍了枚举类其实是隐式继承了 java.lang.Enum
这个类,所以枚举不能继承其他类,只能实现接口。
Java enums can extend java.lang.Enum class implicitly(隐含的), so enum types cannot extend another class.
1 | public class SomeThingStatus{ |
根据枚举所作用的范围,尽可能贴合实际使用范围来定义枚举类该在类私有/包级私有/顶层类(top-level class
)/顶层类的成员类。
策略模式枚举
trategy enum
1 | public enum PayrollDay{ |
每当需要一组固定的常量,并且在编译时就知道其成员的时候,就应该使用枚举。如菜单的选项、操作代码以及命令行标记等。
策略模式 如 org.springframework.core.io.Resource
责任链模式,例如 Handler Interceptor,Filter 。如下所示:
DispatcherServlet 中的 service 方法,经过一些校验和一些参数设置,最终会调用这个方法,如果你懂了这个方法,Spring MVC 一般的情况都能 Hold 住了。
1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
实例域 ONE(1),TWO(2)
让你用 OR
位运算将几个常量合并到一个集合中,称作位域(bit field
)
Set set = EnumSet.of(ONE,TWO);
麻烦,平时用不到
1 | public interface Foo{ |
1 | .class) (rollbackFor = Exception |
保证写的代码,在编译时能检查得出来到底有没有重写 父类/接口 的方法。
Spring 中的所有事件,默认继承 EventObject 这个也算是“接口”,一个不成文的规定。
1 | /** |
接口只有一个待实现方法时,可以转换成Lambda
写法。如下
1 | public interface SayHelloInterface{ |
还有 Comparable<T>
就是很好用 Lambda 写法的例子,而不是用匿名类去写。
如果 Lambda 没有名称和文档,并且有很多行,那就不要用。
1 | System.out::println |
方法引用详情见 《Java 8 实战》
接口 | 函数签名 | 范例 |
---|---|---|
UnaryOperator | T apply(T t) | String::toLowerCase |
BinaryOperator | T apply(T t1,T t2) | BigInteger::add |
Predicate | boolean test(T t) | Collection::isEmpty |
Function<T,R> | R apply(T t) | Arrays::asList |
Supplier | T get() | Instant::now |
Consumer | void accept(T t) | System.out::println,Iterable |
1 | default void forEach(Consumer<? super T> action) { |
@FunctionalInterface
这个注解有三个目的,
必须使用这个注解对自己编写的函数接口进行标注。
不建议使用 Stream 来进行 SQL 查询之类的操作。
过度地使用函数式编程,会导致代码可读性变差,强调不要滥用
1 | // 方法尽量是个动词,方法是行为/动作 |
对于参数类型可以被不可信任方子类化的参数,请不要使用 clone 方法进行保护性拷贝。
代码整洁之道
对于参数类型,优先使用接口而不是具体实现类。
1 | public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { |
boolean 参数,优先使用两个元素的枚举类型。
不要在重载方法中使用范型,或者继承关系类型。如
1 | getAll(List<?> list); |
需要调用哪个重载方法是在编译时作出决定的。
对于重载方法的选择是静态的,而对于被覆盖的方法的选择则是动态的。
可变参数其实是个语法糖
每次调用可变参数方法都会导致一次数组分配和初始化。有性能问题。可以适当的利用重载方法,替代可变参数方法。当然方法参数超过3个,就一起用可变参数,具体方法参数内容可以参考《代码整洁之道》。
最理想的参数数量是零,其次是一,再次是二,尽量避免三。有足够特殊的理由才能用三个以上参数(阿里巴巴Java开发手册:相同参数类型,相同业务含义,才可以使用 Java 的可变参数,可变参数放在最后,尽量不用可变参数,避免使用 Object)。
1 | public byte[] getDigestKeyGen(String content){ |
1 | // DefaultListableBeanFactory |
常用的方法 Optional.ofNullable(result)
,返回一个Optional(null)
或者 Optional
的包装对象的。
Optional<T> 类代表的是一个不可变的容器,它可以存放单个非 null 的 T 引用,或者什么内容都没有。
永远不要通过返回 Optional 的方法返回 null,因为它彻底违背了 optional(可选的) 的本意。
容器类型含集合
、映射
、Stream
、数组
和optional
,都不应该被包装在 optional 中。
永远不要返回基本包装类型的 optional 。已经提供了 OptionalInt
,OptionalDouble
,OptionalLong
等。
永远都不适合用 optional 作为键、值,或者集合或做数组中的元素。
尽量不要将 Optional 用作返回值以外的任何其他用途。
用了 Optional,你就必须在调用方,做相应的判断,因为如果使用 Optional.ofNullable(obj)
它有最差返回 private static final Optional<?> EMPTY = new Optional<>();
《代码整洁之道》—— 最好的注释是方法本身(见名知意、简短 不超过 50 行
、方法参数最好不要超过 3 个、少用可变参数)。
当然这是一种比较极端的说法,好的 API 应该至少写出 what why how,这个方法是什么,为什么这么实现,以及如何使用。
1 | // interface BeanFactory |
使用{@literal}
忽略尖括号等需要转义的内容。如 {@literal r < 1}
只在需要用到变量的前一步,去声明变量。
下面是AutowiredAnnotationBeanPostProcessor
覆盖SmartInstantiationAwareBeanPostProcessor
的方法。
具体执行步骤 AbstractAutowireCapaleBeanFactory#doCreateBean
-> AbstractAutowireCapaleBeanFactory#createBeanInstance
-> AbstractAutowireCapaleBeanFactory#determineConstructorsFromBeanPostProcessors
-> SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
->AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
在属性填充之前,创建 beanWrapper。
1 |
|
for
循环优先于 while
循环
简洁、灵活、预防出错(当然在里面删除元素又进行遍历,是不行的)
不要在 foreach(增强 for 循环) 里面进行删除集合内部元素的操作。如果必要,请使用迭代器。
什么时候不该用 foreach
解构过滤:就是上面的情况,使用 Collection#removeIf。
转换:就是要明确知道要替换的元素在哪几位的时候,予以替换的时候。
平行迭代:多层迭代,例如排序算法
正确的在遍历时删除元素
1 | public void filter(List<User> users){ |
从 Java7 开始该使用 ThreadLocalRandom 而不是 Random
熟悉 java.lang、java.util、java.io及其子包中的内容。子包包括但不限于 java.util.concurrent,java.util.regex。
float、double 适合科学计算。
使用 BigDecimal、Joda Money 进行金额计算。
JavaScript
1 | // js |
Java
1 | double a = 0.1; |
基本类型比包装类型更省内存,性能更高。当然,业务对性能要求不是非常高的,可以用装箱的类型。
自动拆装箱会带来一些隐藏的问题,在《阿里巴巴 Java 开发手册》中介绍,统一使用装箱类型。
如果基本类型和装箱基本类型混合使用,装箱基本类型则会自动拆箱。
自动拆装箱本质上是为了简化开发,添加此类语法糖。
1 | // 编译时优化,自动装箱 |
不适合代替枚举类型的值、聚合类型、能力表(capabilities)。
ThreadLocal 如果用 String 作为 Key,那将是全局共享的,不妥。
1 | // 聚合类型 |
1kb = 1024 byte = 1024 * 8 bit
数据类型 | 名称 | 长度 | 备注 |
byte | 字节型 | 8bit | 表示数据范围:-128~127 |
short | 短整型 | 16bit | |
char | 字符型 | 16bit | |
int | 整型 | 32bit | |
long | 长整型 | 8 byte | |
float | 单精度浮点型 | 4 byte | 精度:7-8位 |
double | 双精度浮点型 | 8 byte | |
boolean | 布尔型 | true/false | 实际用 byte 存储,0 为 false,1 为 true |
选择合适的类型,能使得占用内存更小。
当然,为防止伪共享,提高 CPU 执行效率,如果使用 volatile 关键字禁止 CPU 缓存,如果需要提升代码性能,需要额外填充其他对象。
如果一个对象包含线程局部变量且尺寸小于 64byte,就有可能发生伪共享。在Java7之前,一般通过对象填充的方式来避免伪共享问题:
1 | // java7 以前 |
需要给JVM加上启动项参数:
-XX:-RestrictContended
Hotspot虚拟机文档 “oops/oop.hp”有对Markword字段的定义
1 | 64 bits: |
1 | class Fruit extends Object { |
Object 对象,Markword 8 个字节,kclass 4 个字节, 加起来 12 个字节,加上 4 个字节的对齐填充,占用的空间是 16 个字节。
Fruit 对象, Markword 8 个字节,kclass 4 个字节,还有个 size 成员变量,int类型占 4 个字节,加起来是 16 个字节,不需要对齐填充
缓存行非64字节宽的处理器。如P6系列和奔腾处理器,它们的L1和L2高速缓存行是32个字节宽。
共享变量不会被频繁地写。因为使用追加字节的方式需要处理器读取更多的字节到高速缓冲区,这本身就会带来一定的性能消耗,如果共享变量不被频繁写的话,锁的几率也非常小,就没必要通过追加字节的方式来避免相互锁定。
避免在循环使用 +
拼接字符串
1 | for(int i = 0;i < 1000;i++){ |
1 | List<User> list = new ArrayList<>(); |
更加灵活。
实际碰到的。
1 |
|
当我需要按照构造器传入的 size 来截取 List,因为我客户端需要根据 pageSize 来获取指定 size 或小于该大小的数据。
1 |
|
我只是需要个 JSON 数组,我并不需要 ArrayList 的特殊的方法,这样就是严重耦合的代码。
这个改成下面的,是不是更好点?
1 |
|
Spring 中大量使用接口来引用,而非具体实现类。代码尽量使用依赖注入接口类型,实现实际类与调用类解耦。
如果没有合适的接口,就用类层次结构中提供了必要功能的最小的具体类来引用对象。
即如果要使用ArrayList.trimToSize()
就声明为 ArrayList
引用,这是一种编程习惯,只用你用到的,只提供你想给外部调用的,不是全部,是部分(部分可以是全部)。
Spring 中是采用的流水线的思维方式,将各个阶段,抽象了出来,每个阶段都有其对应的接口抽象。
每个阶段的抽象。
每个阶段中的前置后置处理抽象
AbstractApplicationContext#invokeBeanFactoryPostProcessors
中找到答案,打断点,自己慢慢看,就知道 @Component 是在这里的哪一步解析的了,启动一个随便什么的 Spring Boot 项目,即可查看具体内容)AbstractAdvisorAutoProxyCreator
和 AOP 相关,就在这一步,对要拦截的 Bean 进行拦截,然后代理,这里会有 Pattern 正则来匹配的过程,@Transaction 也是在这一步做的)详情见
Spring BeanProcessor
InitializingBean 和 DisposableBean,它们也可以用 @PostConstruct 和 @PreDestroy 代替,当然,两者一起也是可以的,具体执行顺序。
@PostConstruct
InitializingBean
自定义初始化方法
@PreDestroy 标注方法
实现 DisposableBean 接口的 destroy() 方法
自定义销毁方法 (destroy-mehod)
Spring MVC Interceptor
给定了模版类,调用模版类的模版方法。
如果使用反射机制
native method 是与平台相关的,破坏了 Java 的移植性,如非必须情况,要避免使用本地方法。
可能的必要情况
不等同于不要持续重构代码
怪罪于 StringBuilder sb = new StringBuilder(100); 命名为 sb 的人,是真的 SB。本来就是局部变量用于拼接字符串的,没有很大的实际意义。
有些现代工具(MyBatis)依赖 Beans 命名惯例,setter getter,从数据库中取出值后,赋值需要调用 setter 类型方法。
不要将异常作为普通的控制流。
1 | // 可恢复情况 |
可以适当将 try catch 块重构为 if else 块。
类越精简,加载类的速度越快,优先使用专家级的定义的异常。加粗表示更为高频使用的,如
IndexOfBoundsException
NullPointException
IllegalArgumentException
IllegalStateException*
IllegalAccessException
ConcurrentModificationException
UnsupportedOperationException
更高层的实现应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常。
如果在 MyBatis 中,写 resultType 写成不存在的类,会先抛出 ClassNotFoundException,然后层层抛出,到 Spring 创建 Bean 的步骤中。最终由 Servlet 容器捕获,然后停止启动项目。可以自己手动试试。
1 | // AbstractAutowireCapableBeanFactory |
异常链(exception chaining),如果低层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。Spring 就是这样。
实际 WEB 开发也是不要将异常捕获,尽量将异常向上抛出,最终由 容器/框架 *进行 *捕获/抛出。编写自定义含 @ExceptionHandler的类,进行捕获异常。
如下:
1 |
|
注意⚠️
这里必须使用 ResponseEntity,不要自定义的什么乱七八糟的返回,没有必要再套一层,HTTP 早就想到了,不要像下面这样返回!!多此一举,如果这么做,多半不了解 HTTP 的一些细节内容,前人早就帮你想好了。
1 | { |
这样做,只会徒增前端的负担。
永远不要声明一个公有方法直接 “throws Exception”。无法让调用者判断该如何解决并捕获该异常。
有个例外,就是 main 方法,它可以被安全地声明抛出 Exception,因为它只通过虚拟机调用。
还有就是 Spring Boot 的 CommandRunner,ApplicationRunner 以及 Spring 的 InitializingBean。注意这里的 @throws 需要你写清楚,像下面那样。如何写,在我的另一个我在公司分享的【代码规范】文章里面有讲解、翻译。
1 | public interface InitializingBean { |
为了捕获失败,异常的细节信息应该包含“对该异常由贡献”的所有参数和域的值。
以下是 Spring 启动创建 Bean 时失败,抛出异常的堆栈异常信息。PS:就是上面说的 MyBatis 改了 resultType 的异常。这里就是按层级抛出异常的案例。注意:Spring 是以流水线(Pipeline)的形式来处理的 Bean,看过卓别林的《摩登时代》里面就有他在拧螺丝,是流水线上的一环,也是一个阶段的处理者。流水线是福特提出的,并且作用于福特汽车的生产,极大得提高了生产力。在软件行业同样适用,如果你懂了 Spring 是流水线的处理思想(没什么书上提到流水线和 Spring 的关系),你就懂了大半的 Spring,其他的注解解析,派生等等内容都不难。思想很重要,每个人都需要拥有多个学科的知识,例如达芬奇是画家、科学家、发明家。这个观念在查理·芒格的《穷查理宝典》中反复被提及,值得一看的书籍。
1 | org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'callEvaluationController' defined in file [/IdeaProjects/evaluation/target/classes/cn/luckyray/evaluation/api/CallEvaluationController.class]: Unsatisfied dependency expressed through constructor parameter 0; |
不要在细节消息中包含密码、密钥以及类似的信息。输出异常消息日志时,或者正常日志时,一定要对敏感信息(用户名密码,用户名等等信息)进行脱敏操作。
一般而言,失败的方法调用应该使对象保持在被调用之前的状态。
使用 JDBC 操作数据库进行增/删/改时,出现失败的情况,应该进行事务回滚。
分布式系统中的 GET 操作即使失败,也要保持幂等性。
// TODO Spring Cloud 的中就是这么 GET 默认为幂等的,会一直调用,直到你没出错为止。这个就需要提到 HATEOS 以及 RESTful 的一些约定的一些内容。
空的 catch 块会使异常达不到应有的目的。
如果选择忽略异常,catch 块中应该包含一条注释,说明情况,并将异常变量命名成 ignored
1 | try{ |
不要使用 Thread#stop 方法。
除非读和写操作都被同步,否则无法保证同步能起作用。
避免线程不安全的条件,可以有,避免共享,没有共享就没有伤害,使用 Synchronized/volatile/Atomic 类保证线程安全。
使用 JUC 容器,如CopyOnWriteArrayList。
// TODO 死锁代码
不要用 Executors 创建线程池,里面具体实现有无界队列,Integer.MAX_VALUE 等坑人的定义。无界队列会一直堆积请求,直到OOM,应该使用 ArrayBlockingQueue 这种有界队列。使用 Guava 中 ThreadFactoryBuilder 创建 ThreadFactory,而不是继承原生的(不仅麻烦,而且很多东西其实是重复的,就是为了给线程加个名字和其他一些自定义的内容),也可以用 Spring 的。
1 | private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() |
ForkJoinTask。// TODO 《Java 并发编程的艺术》解释,以及代码。Redis 子线程 Fork 父线程,进行集群同步。
并发的 Stream 是在 Fork Join 池上编写的。
对于间歇式的定时,始终应该优先使用 System.nanoTime 而不是 System.currentTimeMillis
// TODO Spring 同步机制代码补充
始终应该使用 wait 循环模式来调用 wait 方法,永远不要在循环之外调用 wait 方法。
一般情况下,优先使用 notifyAll 方法。// 极客时间《并发编程》代码补充
一个类为了可被多个线程安全地使用,必须在文档中清楚地说明它所支持的线程安全性级别。
使用类内部私有锁对象。lock 域应该始终声明为 final。// TODO Spring 中也是这么做的
1 | private final Object lock = new Object(); |
Lazy Initialization 是指延迟到需要域的值时才将它初始化的行为。Spring Boot 中有 @Lazy 标注是否延迟初始化,如果标记了,则将会该 Bean 进行延迟初始化,只有在其他类真正使用时,进行初始化。
大多数情况下,非延迟初始化优先于延迟初始化。
如果初始化耗时长,那我们最好不要等到真正要用它的时候,才去执行这个耗时长的初始化过程,这会影响到系统的性能(比如,在响应客户端接口请求的时候,做这个初始化操作,会导致此请求的响应时间变长,甚至超时)
除非绝对必要,否则就不要这么做。
如果处于性能的考虑而需要对静态域使用延迟初始化,就使用 Lazy Initiazlization Holder Class 模式
1 | public class Singleton{ |
如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双重检查模式(Double-Check Idiom)
1 | public class Singleton{ |
Spring 中使用单例注册表(Bean 容器)控制 Bean 的单例。
有时可能需要延迟初始化一个可以接受重复初始化的实例域。可以使用单重检查模式(Single-Check Idiom)
1 | private volatile FieldType field; |
任何依赖于线程调度器来达到正确性或者性能要求的程序,很有可能都是不可移植的
如果一个程序不能工作,是因为某些线程无法像其他线程那样获得足够的 CPU 时间片,那么,不要企图调用 Thread.yield 来 “修正” 该程序。
线程优先级时 Java 平台上最不可移植的特征了。设置了优先级,不代表一定会按优先级执行,而是“看情况”。
如果使用 Java 自带的反序列化,以下层次非常高的结构,会导致系统反序列化时占用大量资源。使用 JSON 代替 Java 中的序列化。
1 | static byte[] bomb(){ |
BigInteger、Instant 等值类应该实现 Serializable 接口,大多数的集合类也应该如此。代表活动实体的类,如线程池,一般不应该实现 Seriallizable 接口。
内部类不该实现 Serializable。
跨语言的 Socket 通信,是自己实现序列化机制,包括 Redis,是以纯文本格式,换行的方式分隔操作符。
transient 表示该字段不能被序列化,当然实现了 // TODO 实现某个接口后,在方法中写明了字段,也是可以序列化的。
当一个对象被反序列化的时候,对于客户端不应该拥有的对象引用,如果哪个域包含了这样的对象引用,必须做保护性拷贝。
// TODO 不太理解
使用静态内部类,代理外部类序列化内容,以及反序列化。
// TODO 代码
]]>