挑战密室逃脱攻略图解scene9

内容安全考虑,非对称加密交换密钥(RSA/DH),然后对称加密(RC4/RC5)进行通信。即使盘路监听了,也无法获取你的通信内容。如果嫌弃 RSA太庞大,不想上 openssl/polarssl的话,可以用 DH算法,上64位整数,实现一个64位整数的快速 PowMod,参考 Russian Peasant multiplication 和 Right-to-left binary method 来实现快速运算,大质数事先固定(免去沉重的质数生成计算),每秒钟计算上几十万次密钥交换应该不是大问题。
内容安全考虑,非对称加密交换密钥(RSA/DH),然后对称加密(RC4/RC5)进行通信。即使盘路监听了,也无法获取你的通信内容。如果嫌弃 RSA太庞大,不想上 openssl/polarssl的话,可以用 DH算法,上64位整数,实现一个64位整数的快速 PowMod,参考 Russian P…
&blockquote&&p&“世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。”&/p&&p&
----王安石《游褒禅山记》&/p&&/blockquote&前三章,前三章是个什么概念呢?大概就是为了后面的内容打基础吧!你正要步入SICP中最神奇的领域,如果你因为读完前三章“没有什么感觉”,那么就亏大发了!&br&&br&&img src=&/2ef2cff9ee581eab55e86b5_b.jpg& data-rawwidth=&640& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/2ef2cff9ee581eab55e86b5_r.jpg&&&br&About Me&br&&a href=&///?target=https%3A///DeathKing/Learning-SICP& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SICP公开课&i class=&icon-external&&&/i&&/a&中文化组织者及主要译者,Learning-SICP群主,最近正以SICP书后习题为基础,发布一些小&a href=&///?target=http%3A//deathking.github.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Quiz&i class=&icon-external&&&/i&&/a&。&br&&br&&blockquote&&b&TL; DR&/b&&br&&b&Q: &/b&SICP是讲Scheme或Lisp么?&br&&b&A:&/b& #f.&br&&b&Q:&/b& SICP是讲软件工程么?&br&&b&A: &/b&部分,但并非全部。主要是模块化和黑盒抽象,计算机中两大主要基本思想。SICP关心的是:“当系统复杂度爆炸时(或者在此之前),我们如何通过有效的方法和手段去控制系统的复杂度?”&br&&b&Q:&/b& SICP是讲编译原理么?&br&&b&A:&/b& 部分,另外,如同书名说描述的那样,SICP中的“编译”都是“解释”,这种解释的行为,无外乎就是用一种机器的计算行为去模拟另一种机器。&/blockquote&&br&如果笼统地概括SICP全书的主题,那么不外乎“&b&抽象&/b&”二字。SICP全书不过五章,其中有三章的标题就直接带有“抽象”这个字眼,其余两章则是暗含了“抽象”这个主题,不妨让我们来看下这五章的名称:&br&&br&&ol&&li&&b&构造过程抽象&/b&(Building Abstractions with Procedures)&br&&/li&&li&&b&构造数据抽象&/b&(Building Abstractions with Data)&/li&&li&&b&模块化、对象和状态&/b&(Modularity, Objects, and State)&/li&&li&&b&元语言抽象&/b&(Meta-Linguistic Abstraction)&br&&/li&&li&&b&寄存器机器里的计算&/b&(Register Machine' Model of Control)&br&&/li&&/ol&&br&那我们为什么要去建立抽象呢?很简单:&b&控制复杂度&/b&。正如两位作者在第一版前言里面写的那样:&br&&br&&blockquote&……其次,我们相信,在这一层次的课程里,最基本的材料并不是特定程序设计语言的语法,不是有效计算某种功能的巧妙算法,也不是算法的数学分析或者计算的本质基础,而是一些能够用于&b&控制大型软件系统的智力复杂性的技术&/b&。&br&……他们应该掌握了&b&控制大型系统中的复杂性&/b&的主要技术……他们应该知道在什么时候哪些东西不需要去读,哪些东西不需要去理解……&br&……我们在适当的时候隐藏起一些细节,通过创建抽象去控制复杂性。我们通过建立约定的界面,以便能以一种“混合与匹配”的方式组合起一些标准的、已经很好理解的片段,去控制复杂性。我们通过建立一些新的语言去描述各种设计,每种语言强调设计中一个特定方面并降低其他方面的重要性,以&b&控制复杂度&/b&。&/blockquote&&br&实际上,即时是看似非常简单的前三章,也有蕴含着非常深刻的思想:&br&&br&&ol&&li&牛顿迭代法求平方根,不但介绍了如何通过不断迭代来改进猜测,用于求取某数的平方根,这种数学意义上的&b&计算方法&/b&,同时也介绍了&b&高阶函数&/b&在程序设计中的应用。&/li&&li&对递归的深入讨论,纠正了我们对于递归效率低下的错误认知。实际上,尾递归优化可以使尾递归调用在常量空间内做迭代计算。(William Clinger博士在&a href=&///?target=http%3A///v_show/id_XNjY0ODkxNjky.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Compiler Optimization for Symbolic Languages&i class=&icon-external&&&/i&&/a&中引征Guy Steel的话:“并不是函数调用造成压栈,是参数求值造成压栈。”)&/li&&li&在对高阶过程的讨论中,观察到了计算过程有很多重复的模式,于是提出了&b&“提取公共模式”&/b&这种思想,这也是设计模式里面模板方法的根本理论基础。&/li&&li&在数据抽象的讨论中,介绍了如何将基本元素构造成复杂元素,如何做&b&通用算术(Generic Arithmetic)&/b&及&b&类型分派&/b&,如何构造抽象屏障。当你接触到&b&邱奇数&/b&后,你会惊异于竟然“数据也可以是过程”。甚至你认为通过cons构造出来的序对,应该是某种数据结构,但它其实只是一个过程(见练习2.4)!&/li&&li&在第三章的讨论中,深入研究了&b&赋值&/b&所带来的问题,&b&并发&/b&带来的问题,并且研究了一个非常有用的、具有&b&惰性&/b&的数据结构:“&b&流&/b&”。&/li&&li&第三章是承前启后的,在第一章中引入了求值的&b&代换模型&/b&,而在这一章中正式引入求值的&b&环境模型&/b&,为第四章创建元语言解释器打下基础。第二,由于引入了赋值,第三章额外强调黑盒化,因此可以看到很多面向对象技术的雏形,如&b&消息传递&/b&。&/li&&/ol&&br&上面只是粗略的概括了一下前三章的部分内容,如果你要深入挖掘,你会发现前三章蕴含了更多的财富。当你爬过了前三章,你会发现一片新的天地。如果说前三章侧重于&b&“软件工程”&/b&,那么说四、五章在讲&b&“编译原理”&/b&,似乎也不为过。&br&&br&&blockquote&&p&有一种非常强有力的设计策略,特别适合用于构造那类模拟真实物理系统的程序,那就是基于被模拟系统的结构去设计程序的结构。对于有关的物理系统里的每个对象,我们构造起一个与之对应的计算对象;对该系统里的每种活动,我们在自己的计算系统里定义一种符号操作。采用这一策略时的希望是,
在需要针对系统中的新对象或者新活动扩充对应的计算模型时,我们能够不必
对程序做全面的修改,而只需要加入与这些对象或者动作相对应的新的符号对象。如果我们在系统的组织方面做得很成功,那么在需要添加新特征或者排除旧东西里的错误时,就只需要在系统里的一些小局部中工作。 &/p&&/blockquote&&br&作者在第四章伊始就以简明而独到的语言描述了为什么我们要创建元语言抽象。在第四章中,也是SICP最为闪光熠熠的一章,显示介绍了如何用Lisp来模拟一台Lisp求值器。在这一章中,或者说就在4.1节,作者描述了如何用Scheme创建一个简易的Scheme核心解释器,一旦你了解了Scheme的求值原理,像&b&词法闭包&/b&、&b&代码即数据&/b&、&b&邱奇数&/b&等一些列听起来很“玄乎”的概念也就豁然开了了!第四章的后面扩展了Lisp的求值规则,作者把他们称作“Scheme变形”,引入了&b&amb(非确定性计算)&/b&和&b&惰性求值&/b&。最后还介绍了如何用Scheme来模拟一种逻辑程序设计的语言。&br&&br&&blockquote&求值器决定了一个程序设计语言中各种表达式的意义,而它本身也不过就是另一个程序。&br&&/blockquote&&br&一旦认识到这点,你就会发现,所有“解释”或“编译”的行为,无外乎就是&b&“用一种机器”去模拟“另一种机器的行为”&/b&,比如用DFA通过(NFA的)子集构造去模拟NFA[谢 &a data-hash=&cf205dceb97c3f80b84ad& href=&///people/cf205dceb97c3f80b84ad& class=&member_mention& data-editable=&true& data-title=&@吕子熏& data-tip=&p$b$cf205dceb97c3f80b84ad&&@吕子熏&/a& 兄提醒,修改了措辞]。有了这个思想,于是就有了第五章:寄存器机器里的计算。&br&&br&SICP在书中介绍了许多有趣的系统:约束传播、编译器与求值器的互联、废料收集、类型的层次系统、延时求值等。SICP是一本奇书,细细评味,你一定能发现之中的醇香。&br&&br&祝愿你能早日突破层层括号的束缚,找到住在计算机内的神灵。
“世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。” ----王安石《游褒禅山记》前三章,前三章是个什么概念呢?大概就是为了后面的内容打基础吧!你正要步入SICP中最神奇的领域,如果你因为读完前三章“没有什么感觉”,那么…
以我的经验很多时候都是真心是策划水平问题,因为我接触过不少靠谱的高级策划设计的东西一开始就很成体系,其实程序不是反感策划改需求,是反感笨策划,设计的东西各种yy不成体系,然后动不动就推翻自己。牛b的策划给你的需求基本一看漏洞就很少,然后和程序对一下完善一下。后面难免要改要完善,但是更改理由有理有据,程序一看哦却是有道理我也没想到那就该吧。&br&
所以不能一概而论,笨策划那就不断提高自己,同时贵在有自知之明,有的笨策划很虚心,会和程序请教讨论,有修改也是各种好言好语给你交朋友,这种所谓伸手不打笑脸人,就当帮朋友了;有的策划很笨还自以为是,明明能力有限还案子里连程序流程图都敢瞎画,跩的二五八万,这种绝对拍死不给好脸的。&br&
综上所述,要么有能力智商高;要么会交流情商高。两样都不沾的混的苦就认命吧。
以我的经验很多时候都是真心是策划水平问题,因为我接触过不少靠谱的高级策划设计的东西一开始就很成体系,其实程序不是反感策划改需求,是反感笨策划,设计的东西各种yy不成体系,然后动不动就推翻自己。牛b的策划给你的需求基本一看漏洞就很少,然后和程…
给你说几个 inline 无法代替宏的地方:&br&&br&1. 循环展开:&br&&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&c1&&// loop unroll double&/span&
&span class=&cp&&#define LOOP_UNROLL_DOUBLE(action, actionx2, width) do { \&/span&
&span class=&cp&&
unsigned long __width = (unsigned long)(width); \&/span&
&span class=&cp&&
unsigned long __increment = __width && 2; \&/span&
&span class=&cp&&
for (; __increment & 0; __increment--) { \&/span&
&span class=&cp&&
actionx2; \&/span&
&span class=&cp&&
actionx2; \&/span&
&span class=&cp&&
} \&/span&
&span class=&cp&&
switch (__width & 3) { \&/span&
&span class=&cp&&
case 2: actionx2; \&/span&
&span class=&cp&&
case 3: actionx2; \&/span&
&span class=&cp&&
case 1: \&/span&
&span class=&cp&&
} \&/span&
&span class=&cp&& } while (0)&/span&
&span class=&c1&&// loop unroll quatro&/span&
&span class=&cp&&#define LOOP_UNROLL_QUATRO(action, actionx2, actionx4, width) do { \&/span&
&span class=&cp&&
unsigned long __width = (unsigned long)(width); \&/span&
&span class=&cp&&
unsigned long __increment = __width && 2; \&/span&
&span class=&cp&&
for (; __increment & 0; __increment--) { \&/span&
&span class=&cp&&
actionx4; \&/span&
&span class=&cp&&
} \&/span&
&span class=&cp&&
switch (__width & 3) { \&/span&
&span class=&cp&&
case 2: actionx2; \&/span&
&span class=&cp&&
case 3: actionx2; \&/span&
&span class=&cp&&
case 1: \&/span&
&span class=&cp&&
} \&/span&
&span class=&cp&& } while (0)&/span&
&/code&&/pre&&/div&假设你需要高速循环做一个事情,那么展开循环可以极大的减少CPU分支,并且充分利用CPU流水线的并行效果,比如你开发一个 FIR滤波器来处理信号,那么你的代码如果从 for (...) { .... } 变成循环展开的话,可以这么写:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&n&&LOOP_UNROLL_DOUBLE&/span&&span class=&p&&(&/span&
&span class=&p&&{&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&n&&src&/span&&span class=&o&&++&/span&&span class=&p&&;&/span&
&span class=&c1&&// do something with x and h and output to y&/span&
&span class=&o&&*&/span&&span class=&n&&dst&/span&&span class=&o&&++&/span& &span class=&o&&=&/span& &span class=&n&&y&/span&&span class=&p&&;&/span&
&span class=&p&&},&/span&
&span class=&p&&{&/span&
&span class=&n&&x1&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&n&&src&/span&&span class=&o&&++&/span&&span class=&p&&;&/span&
&span class=&n&&x2&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&n&&src&/span&&span class=&o&&++&/span&&span class=&p&&;&/span&
&span class=&c1&&// do something with x1 and h and output to y1&/span&
&span class=&c1&&// do something with x2 and h and output to y2&/span&
&span class=&o&&*&/span&&span class=&n&&dst&/span&&span class=&o&&++&/span& &span class=&o&&=&/span& &span class=&n&&y1&/span&&span class=&p&&;&/span&
&span class=&o&&*&/span&&span class=&n&&dst&/span&&span class=&o&&++&/span& &span class=&o&&=&/span& &span class=&n&&y2&/span&&span class=&p&&;&/span&
&span class=&p&&},&/span&
&span class=&n&&nsamples&/span&&span class=&p&&,&/span&
&span class=&p&&);&/span&
&/code&&/pre&&/div&如此写法将每个循环只计算一个 sample,变为每个循环同时计算两个sample,分开写代码,也能更好的利用 SIMD去加速同时多个 sample的计算过程,这就是利用循环展开来优化性能的用法,直接传 &{...}& 里面的运行代码给宏,宏不变,但是每处使用LOOP_UNROLL的地方 &{.. } & 中的代码都是不同的,inline是代替不了的,你总不至于传个函数指针过去吧,这时性能优化方面情况。&br&&br&2. 函数组装:&br&&br&想象一下,你写图形图像的代码,现在你需要给像素合成实现 SRC_ATOP, SRC_OVER, SRC_IN, SRC_OUT, DST_ATOP, DST_OVER, DST_IN, DST_OUT, XOR, PLUS, ALLANON, TINT, DIFF, DARKEN, LIGHTEN, SCREEN, OVERLAY 等等 二十种像素合成的方法,你如果不用宏,那么你需要写多少个函数?20多个看起来类似的函数,你不得写疯了么?此时用函数指针其实是很浪费性能的事情,那么该如何写呢?你可以规定一系列用来计算composite的方法,接受两组 RGBA,生成新的,比如:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cm&&/* compositing */&/span&
&span class=&cp&&#define IBLEND_COMPOSITE(sr, sg, sb, sa, dr, dg, db, da, FS, FD) do { \&/span&
&span class=&cp&&
(dr) = _ipixel_mullut[(FS)][(sr)] + _ipixel_mullut[(FD)][(dr)]; \&/span&
&span class=&cp&&
(dg) = _ipixel_mullut[(FS)][(sg)] + _ipixel_mullut[(FD)][(dg)]; \&/span&
&span class=&cp&&
(db) = _ipixel_mullut[(FS)][(sb)] + _ipixel_mullut[(FD)][(db)]; \&/span&
&span class=&cp&&
(da) = _ipixel_mullut[(FS)][(sa)] + _ipixel_mullut[(FD)][(da)]; \&/span&
&span class=&cp&& } while (0)&/span&
&span class=&cm&&/* premultiply: src over */&/span&
&span class=&cp&&#define IBLEND_OP_SRC_OVER(sr, sg, sb, sa, dr, dg, db, da) do { \&/span&
&span class=&cp&&
IUINT32 FD = 255 - (sa); \&/span&
&span class=&cp&&
IBLEND_COMPOSITE(sr, sg, sb, sa, dr, dg, db, da, 255, FD); \&/span&
&span class=&cp&& } while (0)&/span&
&span class=&cm&&/* premultiply: dst atop */&/span&
&span class=&cp&&#define IBLEND_OP_DST_ATOP(sr, sg, sb, sa, dr, dg, db, da) do { \&/span&
&span class=&cp&&
IUINT32 FS = 255 - (da); \&/span&
&span class=&cp&&
IUINT32 FD = (sa); \&/span&
&span class=&cp&&
IBLEND_COMPOSITE(sr, sg, sb, sa, dr, dg, db, da, FS, FD); \&/span&
&span class=&cp&& } while (0)&/span&
&span class=&cm&&/* premultiply: dst in */&/span&
&span class=&cp&&#define IBLEND_OP_DST_IN(sr, sg, sb, sa, dr, dg, db, da) do { \&/span&
&span class=&cp&&
IUINT32 FD = (sa); \&/span&
&span class=&cp&&
IBLEND_COMPOSITE(sr, sg, sb, sa, dr, dg, db, da, 0, FD); \&/span&
&span class=&cp&& } while (0)&/span&
&/code&&/pre&&/div&然后用 #连接各种方法和格式,生成不同的函数,比如:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cp&&#define IPIXEL_COMPOSITE_FN(name, opname) \&/span&
&span class=&cp&&static void ipixel_comp_##name(IUINT32 *dst, const IUINT32 *src, int w)\&/span&
&span class=&cp&&{ \&/span&
&span class=&cp&& IUINT32 sr, sg, sb, sa, dr, dg, db, \&/span&
&span class=&cp&& for (; w & 0; dst++, src++, w--) { \&/span&
&span class=&cp&&
_ipixel_load_card(src, sr, sg, sb, sa); \&/span&
&span class=&cp&&
_ipixel_load_card(dst, dr, dg, db, da); \&/span&
&span class=&cp&&
IBLEND_OP_##opname(sr, sg, sb, sa, dr, dg, db, da); \&/span&
&span class=&cp&&
dst[0] = IRGBA_TO_A8R8G8B8(dr, dg, db, da); \&/span&
&span class=&cp&& } \&/span&
&span class=&cp&&}&/span&
&/code&&/pre&&/div&然后开始生成我们的各种合成函数:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_xor&/span&&span class=&p&&,&/span& &span class=&n&&XOR&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_plus&/span&&span class=&p&&,&/span& &span class=&n&&PLUS&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_src_atop&/span&&span class=&p&&,&/span& &span class=&n&&SRC_ATOP&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_src_in&/span&&span class=&p&&,&/span& &span class=&n&&SRC_IN&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_src_out&/span&&span class=&p&&,&/span& &span class=&n&&SRC_OUT&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_src_over&/span&&span class=&p&&,&/span& &span class=&n&&SRC_OVER&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_dst_atop&/span&&span class=&p&&,&/span& &span class=&n&&DST_ATOP&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_dst_in&/span&&span class=&p&&,&/span& &span class=&n&&DST_IN&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_dst_out&/span&&span class=&p&&,&/span& &span class=&n&&DST_OUT&/span&&span class=&p&&);&/span&
&span class=&n&&IPIXEL_COMPOSITE_PREMUL&/span&&span class=&p&&(&/span&&span class=&n&&pre_dst_over&/span&&span class=&p&&,&/span& &span class=&n&&DST_OVER&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&这样你相当于定义了:&br&&div class=&highlight&&&pre&&code class=&language-text&&ipixel_comp_pre_xor (...)
ipixel_comp_pre_plus (...)
ipixel_comp_dst_over (...)
&/code&&/pre&&/div&等好几个函数了,并且这些函数都是被你 “组装” 出来的,你并没有使用函数指针,也没有笨重的去写20多个函数。进一步如果你写图形图像你会发现你需要面对多种设备的像素格式,从 A8R8G8B8, A8B8G8R8 到 A1R5G5B5 , 主流需要处理的像素格式都有10多种。&br&&br&那么你可以把 “从不同格式读取 r,g,b,a”, 以及 “将 r,g,b,a组装成任意格式”,展开成很多个宏,然后不管你在这些像素格式里面做转换还是要做一些其他处理,你都可以用任意的 “像素读写” 宏 + “像素计算” 宏 组装成一个个具体需要的函数。&br&&br&所以用宏来解决性能问题,并且简化自己的程序设计往往能起到 inline不能起的作用,甚至能完成很多 template 所不能完成的任务。&br&&br&3. 数据结构和算法:&br&&br&具体可以参考 Linux Kernel的 include/linux/list.h:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&p&&{&/span&
&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&o&&*&/span&&span class=&n&&next&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&prev&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&span class=&cp&&#define INIT_LIST_HEAD(ptr) do { \&/span&
&span class=&cp&& (ptr)-&next = (ptr); (ptr)-&prev = (ptr); \&/span&
&span class=&cp&&} while (0)&/span&
&span class=&cm&&/*&/span&
&span class=&cm&& * Insert a new entry between two known consecutive entries. &/span&
&span class=&cm&& *&/span&
&span class=&cm&& * This is only for internal list manipulation where we know&/span&
&span class=&cm&& * the prev/next entries already!&/span&
&span class=&cm&& */&/span&
&span class=&k&&static&/span& &span class=&n&&__inline__&/span& &span class=&kt&&void&/span& &span class=&nf&&__list_add&/span&&span class=&p&&(&/span&&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&o&&*&/span& &span class=&n&&new&/span&&span class=&p&&,&/span&
&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&o&&*&/span& &span class=&n&&prev&/span&&span class=&p&&,&/span&
&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&o&&*&/span& &span class=&n&&next&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&next&/span&&span class=&o&&-&&/span&&span class=&n&&prev&/span& &span class=&o&&=&/span& &span class=&n&&new&/span&&span class=&p&&;&/span&
&span class=&n&&new&/span&&span class=&o&&-&&/span&&span class=&n&&next&/span& &span class=&o&&=&/span& &span class=&n&&next&/span&&span class=&p&&;&/span&
&span class=&n&&new&/span&&span class=&o&&-&&/span&&span class=&n&&prev&/span& &span class=&o&&=&/span& &span class=&n&&prev&/span&&span class=&p&&;&/span&
&span class=&n&&prev&/span&&span class=&o&&-&&/span&&span class=&n&&next&/span& &span class=&o&&=&/span& &span class=&n&&new&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&这里定义了一个 LIST,kernel中,能用 inline的地方都用了,但是有些地方用不了,比如,你有一个结构体 (netfilter 部分):&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&k&&struct&/span& &span class=&n&&nf_hook_ops&/span&
&span class=&p&&{&/span&
&span class=&k&&struct&/span& &span class=&n&&list_head&/span& &span class=&n&&list&/span&&span class=&p&&;&/span&
&span class=&cm&&/* User fills in from here down. */&/span&
&span class=&n&&nf_hookfn&/span& &span class=&o&&*&/span&&span class=&n&&hook&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&pf&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&hooknum&/span&&span class=&p&&;&/span&
&span class=&cm&&/* Hooks are ordered in ascending priority. */&/span&
&span class=&kt&&int&/span& &span class=&n&&priority&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&然后你有一个链表,记录着很多 nf_hook_ops,你取到了其中一个节点的指针,其实是指向结构体的 &list这个成员的,你需要得到对应结构体的指针,那么你可以用下面的 list 的宏:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cm&&/**&/span&
&span class=&cm&& * list_entry - get the struct for this entry&/span&
&span class=&cm&& * @ptr: the &struct list_head pointer.&/span&
&span class=&cm&& * @type: the type of the struct this is embedded in.&/span&
&span class=&cm&& * @member: the name of the list_struct within the struct.&/span&
&span class=&cm&& */&/span&
&span class=&cp&&#define list_entry(ptr, type, member) \&/span&
&span class=&cp&& ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)-&member)))&/span&
&/code&&/pre&&/div&比如,list_entry(ptr, struct nf_hook_ops, list) 就能根据节点指针,和在某个 struct里面的位置,取到某个节点对应的 struct的指针了。这个做法,用 inline也是没法做的。&br&&br&同样的应用,在 Kernel中,还有红黑树 rbtree.h,rbtree.c中的实现,和 list很类似,大量的宏应用。Linux 用基础的宏实现的 list, rbtree等基础数据结构,用起来是相当方便的,有些地方比 std::list, std::map 都方便多了,比 STL性能高的同时,避免象模版一样为每种类型生成不同的代码,让你的二进制程序变得很臃肿。&br&&br&比如你在做题的时候,用上了这样的数据结构,你程序会比用 stl容器的代码更高效和精简,同时你不知道目标平台 STL是怎么实现的,你无法控制,明明我在这个平台写着很快的代码,为何换个平台又慢了,为了追求究极性能,这样重新定义数据结构,其实是可以理解的。&br&&br&4. 其他 inline 无法代替宏的地方&br&&ul&&li&针对不同平台特性(比如整数是32还是64,lsb还是msb)写出的优化代码。&br&&/li&&li&泛型的模拟&br&&/li&&li&小型高频重复的代码片&br&&/li&&li&硬件操作的定义&/li&&/ul&等等,很多情况,inline或者 template还是无法把宏给代替了,所以很多开源项目的代码里面,大量的出现各种宏,主要是出于这些方面的考虑。&br&&br&-----------
给你说几个 inline 无法代替宏的地方:1. 循环展开:// loop unroll double
#define LOOP_UNROLL_DOUBLE(action, actionx2, width) do { \
unsigned long __width = (unsigned long)(width); \
unsigned long __increment = __width && 2; \
for (; _…
谢邀&br&&br&界面的本质是美术设计和用户体验,本身相当易变,需要不断调优,拼界面这事最好由设计人员全职负责并积极改进。而美术资源和布局之外,仍然有大量的逻辑是需要程序员完成的,无论是通用控件,还是具体业务逻辑。&br&&br&说说我了解的实际情况,经历有限,主要举完美的例子:&br&&br&&b&1. 引擎组提供统一UI编辑器&/b&&br&完美本部的端游基本都是用Angelica引擎开发,从完美世界一直到笑傲江湖。引擎含有UI系统,包括一个所见即所得编辑器,由公司引擎部维护,基本上是所有项目兼容的。一个项目有1~2名UI策划,负责拼界面。编辑器以游戏面板为单位编辑,每个面板对应一个xml,支持固定布局的界面,支持特效,在编辑器里面就可以看见界面效果。&br&&br&&ul&&li&局限&br&&/li&&/ul&Angelica编辑器仅提供基本控件,项目需要自己定义诸如物品格的逻辑。&br&&ul&&li&兼容性&br&&/li&&/ul&引擎部会不定时增加新功能,例如“变色文字”之类。各项目组会不定时去取更新的引擎版本。&br&&ul&&li&需求&br&&/li&&/ul&为保证兼容性,底层需求只能往引擎部提交,等待更新。&i&当然,据我们老大说,也有胆大的项目组硬改,然后硬是反提交到了引擎部。&/i&&br&&br&&br&&b&2. 自己实现UI编辑器&/b&&br&页游和手游时代,有些项目组自行实现了UI编辑器。举其中一个为例:&br&&ul&&li&编辑器是专门写的C#独立程序。游戏本身是Cocos2D-X。&br&&/li&&li&编辑器研发时间约一个人4周:两周框架,两周基本控件。不过呢,这么做一定是有后续修改的。&br&&/li&&li&编辑器是固定布局的。&br&&/li&&/ul&对于很多项目来说,自制UI编辑器是一个很好的方案,也是推荐方案。编辑器对策划非常友好,易学易用,因为他限制了输入的可能性,没有冗余选项,每个控件直接对应一个明确的功能。另一方面,他特别适合性能优化,因为他对资源的规格、输入输出和预处理有最精确的控制力。不过动手前,需要熟悉UI架构,能说清楚编辑器的功能和结构。&br&&blockquote&我想详细解释一下优化。页游时代,我们项目的UI是用Flash直接制作的,连带问题就是,各个界面的资源不能共享。同时期使用编辑器的项目,已经是使用3D引擎渲染界面,使用共享九宫格,无论是下载速度还是显示性能都有天然优势。&/blockquote&&br&&b&3. 直接使用引擎自带的UI系统&/b&&br&大部分Unity项目,都是由策划人员直接使用NGUI制作UI的。好的系统往往提供更强的功能。例如,NGUI支持自适应纵宽比的动态布局,这是上面提及的自研编辑器所不支持的。美术可以自由添加任何引擎支持的资源。程序和TA可以提供小脚本,让设计人员来直接定义动画效果。但是完全自由组合的系统,对策划/美术的技术要求高,容易引入bug,不易控制性能,资源稳定性差。&br&&br&我们的项目,有一份面向策划的图文文档,20页左右,说明界面的基本概念,全部的控件和自定义控件,以及常见的错误。&br&&br&新UI策划的上手大致是这样的:&br&&ul&&li&看NGUI的视频教程,并亲自动手做一次,大致1~2周时间&br&&/li&&li&看项目的UI文档&br&&/li&&li&直接上手拼界面&br&&/li&&/ul&之后就是在工作的各种bug中刷经验了。由于UI和引擎完全混在一起,又不可能完全解释所有情况,还有麻烦的潜规则,所以“正确地做界面”是要经验积累的。老带新的情况下,新人可以平滑过渡到工作输出。但是如果整个团队从零开始的话,相当需要突出的个人能力,可能需要3个月以上的磨合。&br&&br&&b&工作流程:&/b&&br&系统策划首先提供系统需求,参考图,以及建议的ui框图。&br&&br&ui策划一方面提供比例准确的框图,交美术制作。框图要细,需呈现的文字、图标要全,有时候美术做完效果图加一行字,就破坏了布局的美感,运气不好的时候还得做大调整。美术拿到框图制作正式界面,包括效果图和素材。素材按风格分素材集,会复用。&br&&br&另一方面,ui策划制作比例准确的策划版界面,程序完成逻辑,完成验收,很多时候会发现有用户体验问题,也是在这个阶段修改。我们推荐这个版本尽量完成细节,包括文字颜色、选中态、切换动画等。所有和布局、动画相关的东西,都尽量提供机制,能让策划/美术自己调整。&br&&br&当美术提供正式界面后,ui策划替换资源,这时候里程碑往往要截止了。运气好的话,不会有代码改动,但很多时候还是有结构修改。&br&&br&程序需要掌握工程细节。比较困难的部分,例如有交互的动画、需要目前尚缺少的控件逻辑时,需要多方讨论,程序提方案。特别困难的动画,有时候策划会给出参考游戏,用Flash/Unity 做一些动态演示。用户体验特别难,或者技术特别难的情况下,方案可能多次修改,需要有心理准备。&br&&br&&br&其他:&br&&ul&&li&我们有一位主美,之前在的手游公司,是由程序拼界面的,性能很好。界面完全九宫格化,大致应当类似于设置Style就能换素材。&br&&/li&&li&灵游坊梁其伟《小团队,大制作》(&a href=&///?target=http%3A//.cn/141& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&.cn/2014/04&/span&&span class=&invisible&&/157141&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)表示他们采用了不同的模式,员工倾向于多面手,一人兼任美术、策划、程序中的数职,提出想法同时也负责实施。&br&&/li&&li&14年曾跟人讨论,界面脚本化的情况下,由策划写界面业务逻辑的可行性&i&(这样程序猿就再也不用干活了!)&/i&。大多数人反对。但有人表示有一个未上线的项目,其ui由两位脚本策划负责,且合作较愉快。&/li&&/ul&
谢邀界面的本质是美术设计和用户体验,本身相当易变,需要不断调优,拼界面这事最好由设计人员全职负责并积极改进。而美术资源和布局之外,仍然有大量的逻辑是需要程序员完成的,无论是通用控件,还是具体业务逻辑。说说我了解的实际情况,经历有限,主要举…
&a data-hash=&bda2c703adda& href=&///people/bda2c703adda& class=&member_mention& data-editable=&true& data-title=&@阅千人而惜知己& data-tip=&p$b$bda2c703adda&&@阅千人而惜知己&/a&
看了一下wiki,好像有点概念,与您探讨,求点评!&br&&br&-- 对以下函数做defunctionalization变换&br&&br&data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Show)&br&&br&tree1 = Node (Node (Leaf 1) (Leaf 2)) (Node (Leaf 3) (Leaf 4))&br&&br&cons :: a -& [a] -& [a]&br&cons x xs = x : xs&br&&br&-- 函数做参数的高阶函数
&br&o :: (b -& c) -& (a -& b) -& a -& c&br&o f g x = f (g x)&br&&br&-- 函数作为返回值的高阶函数&br&walk :: Tree t -& ([t] -& [t])&br&walk (Leaf x)
= cons x&br&walk (Node t1 t2) = o (walk t1) (walk t2)&br&&br&&br&flatten :: Tree t -& [t]&br&flatten t = walk t []&br&&br&ftt1 = flatten tree1&br&&br&-- [1,2,3,4]&br&&br&&br&&br&---- 以下是上面函数的defunctionalization变换 ----&br&&br&&br&-- 用数据结构Lam来表示原来高阶函数应用,&br&-- LamCons 对应 cons&br&-- LamO 对应 o&br&&br&-- PS:在实践当中,这个数据结构用汇编语言来表示&br&data Lam a = LamCons a | LamO (Lam a) (Lam a) deriving (Show)&br&&br&&br&-- apply类似解释器,解释上面那个数据结构Lam&br&&br&-- PS:在实践中,apply可能就是cpu本身……&br&apply :: Lam a -& [a] -& [a]&br&apply (LamCons x)
xs = x : xs&br&apply (LamO f1 f2) xs = apply f1 (apply f2 xs)&br&&br&&br&-- 构造LamCons
&br&cons_def :: a -& Lam a&br&cons_def x
= LamCons x&br&&br&&br&-- 构造LamO&br&o_def :: Lam a -& Lam a -& Lam a&br&o_def f1 f2 = LamO f1 f2&br&&br&&br&-- 构造一个与Tree对应的apply数据结构&br&-- 原来返回函数,现在返回Lam t数据结构&br&&br&walk_def :: Tree t -& Lam t&br&walk_def (Leaf x)
= cons_def x&br&walk_def (Node t1 t2) = o_def (walk_def t1) (walk_def t2)&br&&br&&br&walk_deft1 = walk_def tree1&br&-- LamO (LamO (LamCons 1) (LamCons 2)) (LamO (LamCons 3) (LamCons 4))&br&&br&&br&-- &br&&br&flatten_def :: Tree t -& [t]&br&flatten_def t = apply (walk_def t) []&br&&br&&br&总结:&br&&br&把高阶函数变换成(编译)一个数据结构,然后用一个apply函数来解释此数据结构&br&&br&目的是让有高阶函数抽象的语言用无高阶函数抽象或者模拟起来很难的语言(比如C或者汇编)来执行
看了一下wiki,好像有点概念,与您探讨,求点评!-- 对以下函数做defunctionalization变换data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Show)tree1 = Node (Node (Leaf 1) (Leaf 2)) (Node (Leaf 3) (Leaf 4))cons :: a -& [a…
假设你现在有一个函数
f (x) = a + x &br&&br&这个函数是不完整的,比如 f (1) = a + 1 你还差一个问题: a 是多少?&br&&br&有两个方法回答这个问题&br&&br&第一种叫“动态作用域”,a的值决定于函数&b&调用时&/b&上下文中a的值,比如&br&&br&a = 1;&br&v=f(1) ; 这里v为2&br&&br&动态作用域的问题是,函数每一次调用相同的参数未必返回相同的值,其返回值还取决于上下文的某些值&br&&br&第二种是“词法作用域”,a的值取决于函数&b&定义时&/b&上下文中的值&br&&br&g (a) = lambda (x) a + x;&br&f = g(2)&br&&br&这里函数g返回一个和上面函数f形式一样函数,a在此处为2,那么执行&br&&br&a = 1;&br&v=f(1) ;这里v为3&br&&br&因为f要“记住”自己定义时a的值为2,所以实现时&br&&br&&b& f (x) = a + x 和 a = 2 被打包在一块,被称为“闭包”,&/b&意思是它是完整独立的,仅仅依靠调用时参数求值,不再依赖调用时的上下文&br&&br&晕,写完以后才发现我也写了不少...
假设你现在有一个函数 f (x) = a + x 这个函数是不完整的,比如 f (1) = a + 1 你还差一个问题: a 是多少?有两个方法回答这个问题第一种叫“动态作用域”,a的值决定于函数调用时上下文中a的值,比如a = 1;v=f(1) ; 这里v为2动态作用域的问题是,函数每…
haskell是一个比较庞大的体系,要说条件的话,最好先看《计算机程序的构造与解释》,这样学习曲线相比较平缓&br&&br&推荐5本haskell入门的书&br&&br&&a data-hash=&bda2c703adda& href=&///people/bda2c703adda& class=&member_mention& data-tip=&p$b$bda2c703adda&&@阅千人而惜知己&/a&
写的《haskell函数式编程入门》 用这本书入门真的很好,写得比较详细,很多语言特性背后的内涵都有讲解,可以帮你节省不少时间,内容也比较新。要说缺点的话,我个人感觉写得有点简略&br&&br&《趣学指南》也是一本入门好书,但这本书写得清楚明白是因为它本来就简单,信息量不大。光看这本书能学到的东西很少&br&&br&《real world haskell》很经典,很全面,但是成书时间有点早,很多示例程序已经运行不了,有基础以后可以再补上&br&&br&《beginning haskell》 主要是教你使用各种haskell的标准库,内容很新,写得也比较简略&br&&br&《haskell 并行与并发》 好书但主题比较窄,就算不用haskell,只是想了解并行和并发也可以看看,挺有意思的&br&&br&上面五本书建议前两本为一组,后三本为一组,按顺序看下来。要说我有什么经验,就是学习一定要跟着高手从简单到抽象,系统且有条理地学,这是一条没那么痛苦的道路
haskell是一个比较庞大的体系,要说条件的话,最好先看《计算机程序的构造与解释》,这样学习曲线相比较平缓推荐5本haskell入门的书 写的《haskell函数式编程入门》 用这本书入门真的很好,写得比较详细,很多语言特性背后的内涵都有讲解,…
这个员工对你有一些怨气,但是不要冲动。立马开除她未必是最好的选择,只会让大家会觉得你是个粗鲁的老板(当然如果你刻意保持的就是这种印象,也是合理的,就当我没说)。&br&&br&这种问题题主会来提问,可能是个年轻的老板,抑或是位温和的女士?如果这位助理还在,您不妨平心静气邀她谈话,告诉她,如果她认为三千不体现她的能力水平,那么下个月立刻给她涨到六千甚至更多——前提是请她这个月全力以赴展现出自己的水准,因为任何一个有胸襟的老板不会计较每一次员工的抱怨,而更看重抱怨中隐含的人才激励空间。&br&&br&如果她表现出色,恭喜你用很少的钱就获得了一位人才的忠诚,以及公司上下对你人格魅力的承认;如果她表现依然糟糕,你可以平静地告诉她你对她实际工作能力的评价,并维持之前薪水的标准。这样大家也不会有任何对你的闲话。&br&&br&作为曾经的职场爆烈青年、今天的温和中年大叔,我想说:各位年轻的盆友,不要沉浸在高票答案的情绪里,那种想法对你自己没有长远的帮助。老板有好有坏,但商业的逻辑注定了先展示能力后议价是最让双方愉悦、职业利益也最长久的方案。最好的思路,是把你和老板的利益统一起来,而不是寻求劳资对立。这一点不管你是打工还是创业都成立。
这个员工对你有一些怨气,但是不要冲动。立马开除她未必是最好的选择,只会让大家会觉得你是个粗鲁的老板(当然如果你刻意保持的就是这种印象,也是合理的,就当我没说)。这种问题题主会来提问,可能是个年轻的老板,抑或是位温和的女士?如果这位助理还在…
-&br&&br&我先抛个砖。&br&&br&复旦的片子是全方位的差,基本上每一个环节都是由天赋值仅适合做婚礼录像的人做的。如果对视听语言真有点悟性,绝对不至于抄都不知道怎么抄。&br&&br&&b&长短没有概念。&/b&&br&&br&大学的宣传片大概可以类比为电影预告片,一到两分钟为宜,超过三分钟的话,你最好有精彩得不得了的内容——比如本身就是一个情节跌宕起伏扣人心弦的微电影,否则没多少人愿意听你絮絮叨叨那么久。&br&&br&东京大学的宣传片正片时长两分钟,在观众就要产生倦意(或者刚产生倦意)的时候掀起了高潮,结束了内容。&br&&br&复旦大学的宣传片正片时长四分钟,这说明制作者对产品内容有爆棚的自信。其实选择制作四分钟时长是有原因的,答案晚点揭晓。&br&&br&&b&文本不会提炼。&/b&&br&&br&这是最核心的问题。复旦宣传片的制作者虽然发现东大宣传片制作精良,但完全没领悟到原版的精髓究竟是什么,所以抄了半天光抄了个壳。&br&&br&创作视听内容最元始的要素就是反差。特别是短小的作品,更仰仗画面内容的反差。东大宣传片使用太空服的亮点在哪?不在于展示了太空服,而在于表现了太空服与周围环境的冲突。&br&&br&太空服的面罩上反射出来的景色应该是什么样的?当然是各种太空里的景象了。&br&&br&&img src=&/38dd32ae52d35c90dd9b79_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/38dd32ae52d35c90dd9b79_r.jpg&&&br&太空服有一个极大的特点就是,作为一件臃肿的工作服,如果不是在太空中不得不穿,没有人会穿着它走来走去。只要一有机会,宇航员也会马上脱下太空服。&br&&br&&img src=&/cd983af1dfcb7e977e86c9_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/cd983af1dfcb7e977e86c9_r.jpg&&&br&但是在东大宣传片中出现了怎样的奇特景象?太空服头盔上反射出来的景色,是日本的夜市——一个根本不用穿太空服的地方。&br&&br&&img src=&/aea94bac39eb33b_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/aea94bac39eb33b_r.jpg&&&br&这就是反差。这就是它一下抓住眼球的地方。&br&&br&再看复旦大学这一身轻便的制服——&br&&br&&img src=&/a4ec39ccb2cf419cc66bf1a0_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/a4ec39ccb2cf419cc66bf1a0_r.jpg&&&br&这就是一个摩托车手到处闲逛的感觉啊。反差在哪儿呢?&br&&br&不过,这是一个摩托车手吗?我们再仔细看看。&br&&br&先看看东大的宇航员。&b&注意面罩的颜色和打光&/b&:&br&&br&&img src=&/31b6100713bcc2daba2fcf_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/31b6100713bcc2daba2fcf_r.jpg&&&img src=&/ba690aa63df295e2b7af4a0e67db7a00_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/ba690aa63df295e2b7af4a0e67db7a00_r.jpg&&&img src=&/cceca_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/cceca_r.jpg&&&img src=&/02f84afcfb55a23f51b9a8_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/02f84afcfb55a23f51b9a8_r.jpg&&&img src=&/11ee077e9d848c8deff251_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/11ee077e9d848c8deff251_r.jpg&&&br&然后再来看看复旦的:&br&&br&&img src=&/d0c19f914bed17f1d69eb0b_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/d0c19f914bed17f1d69eb0b_r.jpg&&&br&这是幽灵还是杀手?&br&&br&&img src=&/896a4f05acea65a711ec_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/896a4f05acea65a711ec_r.jpg&&&img src=&/def85d6c8eb1ac31342abb_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/def85d6c8eb1ac31342abb_r.jpg&&&img src=&/0872cca0b7a822c68fe92fc390e18344_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/0872cca0b7a822c68fe92fc390e18344_r.jpg&&&img src=&/edfd495375_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/edfd495375_r.jpg&&&img src=&/cacfeb105b4abf62a3b12f_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/cacfeb105b4abf62a3b12f_r.jpg&&&br&这故事怎么看都是这样的(请留意——我并没有加恐怖或悬疑音效):&br&&br&&a class=&video-box& href=&///?target=http%3A///programs/view/YumLPCGN__A/& target=&_blank&&
&img class=&thumbnail& src=&/0db937303bccdfbb3fc90cea/p_2.jpg&&&span class=&content&&
&span class=&title&&复旦风云&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&/programs/view/YumLPCGN__A/&/span&
&/a&&br&国外的朋友去油管看:&a href=&///?target=https%3A///watch%3Fv%3DSkwbQsWSbeM%26feature%3Dyoutu.be& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/watch?&/span&&span class=&invisible&&v=SkwbQsWSbeM&feature=youtu.be&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&这个视频在优酷上传无法通过审核,理由是「涉嫌垃圾广告、恶意推广」。看来复旦的公关做得还是可以的。&br&&br&好了,还是来看片子吧。没有提炼的文本出现在这个长达四分钟的视频里的各个角落,呈现出来的很多内容都是初学者思维的体现。比如,如果要拍一个宣传大学的视频,你第一个想到的画面会是什么样的?&br&&br&老师讲课,学生听讲。&br&&br&&img src=&/e4edfd66f11_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/e4edfd66f11_r.jpg&&&br&编剧的基础课必然会教这一点:针对一个问题,脑海里冒出的第一个解决方案要想方设法推翻掉。所以东大的宣传片里只短短地出现了一次上课内容(注意构图和色彩的艺术安排),而且避免了老师的出镜——免落窠臼:&br&&br&&img src=&/9f653c2e0d43da90b849_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/9f653c2e0d43da90b849_r.jpg&&&br&而复旦的视频里则是各种小学生思路:&br&&br&&img src=&/e4edfd66f11_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/e4edfd66f11_r.jpg&&&br&&img src=&/147d435b0edd7_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/147d435b0edd7_r.jpg&&&br&&img src=&/22cab49b712d0bc1fbb7fcd7e38e6a16_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/22cab49b712d0bc1fbb7fcd7e38e6a16_r.jpg&&&br&&img src=&/57d69ef2cba65aaef98c2f3_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/57d69ef2cba65aaef98c2f3_r.jpg&&&br&而且,这摄影水平,我这摄影盲看了都着急啊。看看人家原版的摄影:&br&&br&&img src=&/e5bbe41bc5bcf64bbc54099dfb9dac71_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/e5bbe41bc5bcf64bbc54099dfb9dac71_r.jpg&&&br&&img src=&/7af132f599d79debb363_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/7af132f599d79debb363_r.jpg&&&br&&img src=&/b264e2c682f02e6d955403b_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/b264e2c682f02e6d955403b_r.jpg&&&br&&img src=&/81f7a503d4dc46aa32db7f52c151e202_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/81f7a503d4dc46aa32db7f52c151e202_r.jpg&&&br&&img src=&/db05a216a86cccfa78bc869f0b3a1e76_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/db05a216a86cccfa78bc869f0b3a1e76_r.jpg&&&br&&img src=&/f30f1c95c8d326d9ff578c5e0a4687f1_b.jpg& data-rawwidth=&672& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&/f30f1c95c8d326d9ff578c5e0a4687f1_r.jpg&&&br&复旦宣传片里呢?各种廉价的过曝,各种没有逻辑的布光。&br&&br&&img src=&/9a9b245db8c5e12539f97_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/9a9b245db8c5e12539f97_r.jpg&&&img src=&/6bb4fcf6d0dc82dbcdbc7ae3_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/6bb4fcf6d0dc82dbcdbc7ae3_r.jpg&&&br&下面这个镜头的布光是什么思路?画面内容要表达的是什么?导演真的能给出个解释吗?&br&&br&&img src=&/d0cc7eadfa278_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/d0cc7eadfa278_r.jpg&&&br&&b&镜头胡乱运动,剪辑毫无乐感。&/b&&br&&br&东大版的镜头运动有条不紊、错落有致,推拉摇移跟升降,每一个移动的镜头都摸准了表现的对象,增强了画面的美感,同时为剪辑服务,使单个镜头的运动与剪辑的互动抑扬顿锉,情理暗合。静中蓄动,动中有静。要展示手就跟着手走,要展开卷幅就顺着展开的方向走。有时静静地跟着主角旅行,有时兴奋地跟着人物舞蹈。展示弓道:一个人物的中景,一个人物的特写,一个箭靶中箭的特写。中规中矩。片尾的镜头对着朝阳上摇,字幕浮现:「MOST OF OUR STUDENTS REACH HIGH PLACES」。&br&&br&复旦版呢?一开场假装危机出现。镜头在仪表盘上横移,忽然顿住——还以为这一顿有什么含义呢,结果没有。这问题更多在于剪辑师的责任,因为画面的流动被打断是因为剪辑师没有剪掉该剪掉的部分。但摄影师的问题马上就出来了。假装飞机颠簸的镜头运动敢再假一点吗?飞机颠簸起来会是「一、二、三,休息一下,再来,一、二、三」这样的节奏吗?摄影师明显在迟疑,举棋不定,并不清楚这个镜头应该怎样拍。当然,导演也逃不了干系。飞机都颠簸成这样了,画面里的两名飞行员还风雨不动安如山,连胳膊肘都没晃动过一厘米。这种渣调度相信是多年婚礼视频的拍摄经验——就是不用调度。&br&&br&导演没有任何清晰的表达意图,并不知道自己要拍的是什么。大抵就是「我们有轨道,就拍几个轨道镜头吧;我们还有摇臂,来几个摇臂镜头吧」——就像拍婚礼,「总之动一动画面就好看一些」。本来无辜的推拉摇移正好又凑上一些廉价的布光和无序的构图,于是全面沦陷了。荒唐的是,到了动作场景(跳舞、太极),镜头又不动了,剪辑也没有了。&br&&br&&b&声音毫无主见。&/b&&br&&br&配音又是复旦宣传片创作者稀里糊涂的又一力证。他们显然没明白日本原版里那个广播音旁白在片中是什么意义——最后取下头盔,声音变正常,从太空人视角换为普通人视角,又契合那一句「That's when I realized the ending was just a new beginning」。复旦的旁白从头到尾就是这样一段听不清的配音(我估计他们也不希望你听清),没有任何层次和意义上的发展,完全不知所谓。&br&&br&配乐就更不用说了。《地心引力》的片尾曲交版权费了吗?人家《地心引力》是说宇航员的啊,抄东大不要抄到这么入戏吧,好歹抄个《壮志凌云》啊!&br&&br&对了,这宣传片为什么要制作四分钟这么长?答案是,因为《地心引力》的片尾曲砍掉前面相对静音的部分之后就这么长。&br&&br&-&br&&br&为什么我们连抄都只能抄出个皮毛?&br&&br&这好像是我们见过的很多事情的缩影。&br&&br&-&br&&br&update:大家不要黑复旦的学生。我认识的复旦毕业生没有谁为这件事辩护。复旦是所好学校,那里的学生姿势水平还是很高的。单就「没能识破抄袭」这件事来说,复旦的领导也没有过错——反正换成我,如果没人主动给我看东大的视频,我也看不出来是抄袭。&br&&br&-&br&&br&&img src=&/2becadc_b.jpg& data-rawwidth=&258& data-rawheight=&258& class=&content_image& width=&258&&&b&另一个李弱可&/b&&br&微信公众号 anotherroclee
-我先抛个砖。复旦的片子是全方位的差,基本上每一个环节都是由天赋值仅适合做婚礼录像的人做的。如果对视听语言真有点悟性,绝对不至于抄都不知道怎么抄。长短没有概念。大学的宣传片大概可以类比为电影预告片,一到两分钟为宜,超过三分钟的话,你最好有…
已有帐号?
无法登录?
社交帐号登录
27358 人关注
1311 个回答
5589 人关注
500 个回答
1950 人关注
936 个回答
19108 人关注
747 个回答
462 人关注
255 个回答

我要回帖

更多关于 挑战密室逃脱 的文章

 

随机推荐