Blog

代理上的缓存控制属性

Content #

区分客户端上的缓存和代理上的缓存 #

“private”表示缓存只能在客户端保存,是用户“私有”的,不能放在代理上与别人共享。而“public”的意思就是缓存完全开放,谁都可以存,谁都可以用。

比如你登录论坛,返回的响应报文里用“Set-Cookie”添加了论坛 ID,这就属于私人数据,不能存在代理上。不然,别人访问代理获取了被缓存的响应就麻烦了。

区分缓存失效后的重新验证 #

即使用条件请求“Last-modified”和“ETag”,“must-revalidate”是只要过期就必须回源服务器验证,而新的“proxy-revalidate”只要求代理的缓存过期后必须验证,客户端不必回源,只验证到代理这个环节就行了。

代理上的缓存生存时间 #

“s-maxage”(s 是 share 的意思,注意 maxage 中间没有“-”),只限定在代理上能够存多久,而客户端仍然使用“max-age”。

代理专用属性“no-transform” #

代理有时候会对缓存下来的数据做一些优化,比如把图片生成 png、webp 等几种格式,方便今后的请求处理,而“no-transform”就会禁止这样做,不许“偷偷摸摸搞小动作”。

用“便利店冷柜”来举例 #

水果上贴着标签“private, max-age=5”。这就是说水果不能放进冷柜,必须直接给顾客,保鲜期 5 天,过期了还得去超市重新进货。

冻鱼上贴着标签“public, max-age=5, s-maxage=10”。这个的意思就是可以在冰柜里存 10 天,但顾客那里只能存 5 天,过期了可以来便利店取,只要在 10 天之内就不必再找超市。

排骨上贴着标签“max-age=30, proxy-revalidate, no-transform”。因为缓存默认是 public 的,那么它在便利店和顾客的冰箱里就都可以存 30 天,过期后便利店必须去超市进新货,而且不能擅自把“大排”改成“小排”。

Viewpoints #

From #

22 | 冷链周转:HTTP的缓存代理

sub:二分查找

使用二分查找的前提条件 #

  1. 顺序存储通过下标可得到关键字。
  2. 元素有序任取一个关键字,即可确定目标关键字是在它之后或是之后。
  3. 存在上下界

求中间点的位置 #

二分查找,求中间点的位置,有时会看到下面的代码:

int mid = left + (right - left) / 2;

为什么不直接写成:

int mid = (left + right) / 2;

第二种写法可能会出现相加后超出整形范围的情形,而第一种写法下不会出现越界。

循环条件 #

使用二分搜索时,使用start <= end作为循环条件与使用start < end作为循环条件有何区别?

如果要在循环内部返回匹配的数据,则用start <= end。如果要先退出循环,然后用start和end的值来返回结果,那么就用start < end。

left=mid+1和right=mid-1 #

若mid所指元素确定并非目标元素,则可使用:

left = mid + 1, right = mid - 1

numbers[mid] > numbers[right]

此时mid所指一定不是最小值,所以left可设为mid+1。

numbers[mid] < numbers[right]

此时mid所指可能是最小值,所以right要设为mid,而不能设为mid-1。

33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值

...

代理协议

Content #

通过“X-Forwarded-For”操作代理信息必须要解析 HTTP 报文头,这对于代理来说成本比较高,原本只需要简单地转发消息就好,而现在却必须要费力解析数据再修改数据,会降低代理的转发性能。

另一个问题是“X-Forwarded-For”等头必须要修改原始报文,而有些情况下是不允许甚至不可能的(比如使用 HTTPS 通信被加密)。

所以就出现了一个专门的“代理协议”(The PROXY protocol),它由知名的代理软件 HAProxy 所定义,也是一个“事实标准”,被广泛采用(注意并不是 RFC)。

“代理协议”有 v1 和 v2 两个版本,v1 和 HTTP 差不多,也是明文,而 v2 是二进制格式。今天只介绍比较好理解的 v1,它在 HTTP 报文前增加了一行 ASCII 码文本,相当于又多了一个头。

这一行文本其实非常简单,开头必须是“PROXY”五个大写字母,然后是“TCP4”或者“TCP6”,表示客户端的 IP 地址类型,再后面是请求方地址、应答方地址、请求方端口号、应答方端口号,最后用一个回车换行(\r\n)结束。

例如下面的这个例子,在 GET 请求行前多出了 PROXY 信息行,客户端的真实 IP 地址是“1.1.1.1”,端口号是 55555。

PROXY TCP4 1.1.1.1 2.2.2.2 55555 80\r\n
GET / HTTP/1.1\r\n
Host: www.xxx.com\r\n
\r\n

服务器看到这样的报文,只要解析第一行就可以拿到客户端地址,不需要再去理会后面的 HTTP 数据,省了很多事情。

不过代理协议并不支持“X-Forwarded-For”的链式地址形式,所以拿到客户端地址后再如何处理就需要代理服务器与后端自行约定。

Viewpoints #

From #

21 | 良心中间商:HTTP的代理服务

X-Forwarded-For和X-Real-IP

Content #

服务器的 IP 地址应该是保密的,关系到企业的内网安全,所以一般不会让客户端知道。不过反过来,通常服务器需要知道客户端的真实 IP 地址,方便做访问控制、用户画像、统计分析。

可惜的是 HTTP 标准里并没有为此定义头字段,但已经出现了很多“事实上的标准”,最常用的两个头字段是“X-Forwarded-For”和“X-Real-IP”。

“X-Forwarded-For”的字面意思是“为谁而转发”,形式上和“Via”差不多,也是每经过一个代理节点就会在字段里追加一个信息。但“Via”追加的是代理主机名(或者域名),而“X-Forwarded-For”追加的是请求方的 IP 地址。所以,在字段里最左边的 IP 地址就是客户端的地址。

“X-Real-IP”是另一种获取客户端真实 IP 的手段,它的作用很简单,就是记录客户端 IP 地址,没有中间的代理信息,相当于是“X-Forwarded-For”的简化版。如果客户端和源服务器之间只有一个代理,那么这两个字段的值就是相同的。

Viewpoints #

From #

21 | 良心中间商:HTTP的代理服务

用AVFilter将视频上半部分镜像到下半部分

Content #

滤镜处理将输入的视频切割成了两部分流,一部分流抛给crop滤镜与vflip滤镜处理模块进行操作,另一部分保持原样,当crop滤镜与vflip滤镜处理操作完成之后,将流合并到原有的overlay图层中,并显示在最上面一层,输出新的视频。对应的命令行如下:

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

生成的视频结果是保留视频的上半部分,同时上半部分会镜像到视频的下半部分,二者合成之后作为输出视频。

Filter规则如下:● 相同的Filter线性链之间用逗号分隔● 不同的Filter线性链之间用分号分隔

在以上示例中,crop与vflip使用的是同一个滤镜处理的线性链,split滤镜和 overlay滤镜使用的是另外一个线性链,一个线性链与另一个线性链汇合时是通过方括号“[]”括起来的标签进行标示的。在这个例子中,两个流处理后是通过 [main]与[flip]进行关联汇合的。

split滤镜将分割后的视频流的第二部分打上标签[tmp],通过crop滤镜对该部分流进行处理,然后进行纵坐标调换操作,打上标签[flip],然后将[main]标签与 [flip]标签进行合并,[flip]标签的视频流从视频的左边最中间的位置开始显示,这样就出现了镜像效果。

From #

FFmpeg从入门到精通

文化迷失

Content #

“文化迷失”,其典型特征是寒门学子升入名校之后,场域的剧烈转换造成了内在自我的冲突,继而引发了行动目标和策略的迷失。“文化迷失”障碍使得进入精英大学的寒门学子对自己感到迷茫和困惑,弄不清楚当下的自己“是谁”“想要什么”“该干什么”。它极大地削弱了寒门学子使用文化工具去树立目标、达成目标的行动力和能动性,使得他们很多时候仅仅停留在茫然的观望状态。

随着习性不断地调和自身与场域之间的矛盾,一方面需要维持与旧系统的连贯性,另一方面又需要发展新的倾向以适应新环境,于是产生了布迪厄所预言的“习性裂化”。一方面,寒门学子已经脱离原来生长的环境,接触了许多新鲜的观念和事物,与原本熟悉的自我逐渐拉开了差距;另一方面,其在名校新获得的身份和自我认知又不断被原先的自我和社会关系所干扰,以至于自我认同时刻处于一种不稳定或撕裂状态,个体因自己的出身陷入自卑感与羞耻感当中,甚至将自我分裂成多个部分。对中国高校低阶层大学生的研究不约而同地确认了自我的撕裂与认同多重化。另一方面,因为不了解精英大学和劳动力市场中的“游戏规则”,寒门学子往往不清楚如何做才能为自己的发展赢得优势,也不倾向于对外寻求帮助。

拉鲁及其学生认为,掌握学校这样的正式组织如何运转的“文化知识”,以及向教师寻求理所当然的帮助,是塑造学校教育不平等的关键点。“文化迷失”不仅对寒门学子的自尊心和自信心意味着釜底抽薪,还不利于其在当前白热化的竞争中抢占先机、获得成功。价值感的混乱和无规划的投入很容易导致“直觉依赖者”在毕业前夕迷失无从,陷入无准备状态。寒门学子应对自我认同危机的策略常常是固守自己熟悉的学业成功,而放弃自己所不熟悉的课外社会性活动,然而这种做法却容易让他们在未经仔细省察自身真正的志趣就匆忙踏上直升研究生或博士的学术道路,虽有助于纾解一时之困,长远来看却不利于其职业发展。

From #

金榜题名之后

文化脱嵌

Content #

典型特征是寒门学子进入精英大学后,体会到对周遭物理环境和社会文化环境的全面疏离。如布迪厄所言,习性如果突兀地进入一个与自身不配合的场域,会产生一种如同鱼离了水的感觉。低阶层大学生往往发觉自己的外貌、穿着、口音、姿态、生活习惯等诸多原本习以为常的方面,与精英大学里“正确的”或“默认的”做法迥然不同,因此他们既难以理解新环境对自己的角色期待,又感到自己在新的环境是个异类,与原先的社群也难以维持固有的联系。

一个直接的例子是寒门学子不知如何使用大都市庞杂的道路交通工具和公共服务设施,譬如智能导航、自助购票等。大学当中的大部分人早已适应了使用电脑、手机和互联网传达信息、解决问题,而刚刚从中学进入大学的寒门学子可能并不知道如何操作电脑、查收邮件、在线选课等。当被访者向我讲述这些窘境时,他们害羞和尴尬的表情说明了称为新群体中的“少数人”给他们带来的羞耻感和心理压力。一位女生在讲述自己因为不懂得飞机舱位布局这样的“常识”而闹了笑话时,甚至禁不住开始哭泣。除了对物理空间感到陌生和恐惧,更大的挑战是难以融入精英大学的人际互动环境。因为精英大学的生源目前仍以来自优势家境的学生为主,寒门学子在其中容易感到孤独和被拒斥。正如大成“语码处理器”的比喻,寒门学子的“处理器”仿佛出了故障,难以对大学里老师和同学发出的信号进行解码。他们不知道如何融入同学圈子,也读不懂任课教授对优秀学生的期待,更没意识到自己并不了解大学里的游戏规则(特别是非制度性的那些)。文化上的隔阂使得他们往往对新同学和新老师敬而远之,转而与背景相似的老乡或高中同学抱团取暖,而这却强烈局限了他们社会交往的范围,不利于社会支持体系的建立和“文化工具箱”的迭代升级。另一方面,寒门学子还不得不面临与原先的社群相脱离的问题。空间上的隔绝和新身份的获得,都对他们维系与以往的亲人和朋友的关系造成了障碍。数位被访者向我提起过,上大学以后和原先的朋友疏远了,家人也并不能理解他们遇到的很多新困难。总之,因为实现了向精英高等教育的流动,他们仿佛被“移植”到了一个陌生的地方,文化上或多或少的水土不服总是不可避免。

“文化脱嵌”带来的困扰大部分是短期的。虽然一段时间内(大部分是入学初期)感觉强烈,但“常识”的欠缺和社交上的孤立感大多会随着寒门学子在校时间的累积而逐渐消弭。老乡、室友和辅导员在这个过程中往往起了重要的陪伴作用。多数被访者在入校一学期或一年之后,就会感到状态更平稳了一些。恐惧感和孤立感渐趋消散,取而代之的是一个新社会环境中正在形成的新身份。从本研究被访者的情况看,跨越“文化脱嵌”障碍的过程在个案之间存在差异。如果寒门学子入学后发现同宿舍或同班有不少和自己背景差不多的同学,并交到了投缘的朋友,克服“文化脱嵌”障碍的难度会减小许多,过程也会相对更短。而如果恰巧被分配到一个背景差异悬殊的小环境,“文化脱嵌”障碍则会更加彰显。另外,校园的学生文化似乎也是一个影响因素。

拿南方大学和北方大学举例来说,南方大学的学生文化相对比较松散,班集体和学院集体对个人的组织程度都很弱,学生的社交圈子几乎全以个人为单位组织,对集体的归属感整体偏弱,学生身在其中容易有更强烈的“文化脱嵌”感;而北方大学的校园文化环境则更加中心化,学生对班集体和院集体的归属感普遍比较强,个体也很容易被整合进集体组织的活动中去,这种较为中心化的秩序容易使个体对组织和集体迅速产生新的归属感和认同感,从而缓解“文化脱嵌”带来的不适。总体而言,南方大学的被访者表达出了比北方大学被访者更强烈的“文化脱嵌”感。

From #

金榜题名之后

四种类型的毕业出路获得机制

Content #

在学校-工作转换的具体语境下,学生能在生涯选择上享有多大程度的自由,取决于两个要素: 1)内化的价值观念是否驱动了自洽的、明晰的目标; 2)学生作为理性行动者使用文化工具达成目标的能力,使用文化工具来达成目标的能力与阶层有着系统性的联系。

From #

金榜题名之后