dream

一个菜鸟程序员的成长历程

0%

Amdahl定律

Gene Amdal,计算领域的早期先锋之一,对提升系统某一部分性能所带来的效果做出了简单却有见地的观察。

这个观察被称为Amdahl定律。该定律的主要思想是,当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

若系统执行某应用程序需要时间为Told。假设系统某部分执行所需时间与该时间的比例为a,而该部分性能提升比例为k。即该部分初始所需执行时间为aTold,现在所需时间为(aTold)/k。因此,总的执行时间应为:

Tnew = (1 - a)Told + (aTold)/k = Told [(1 - a) + a/k]

由此,可以计算加速比 S = Told / Tnew

S = 1 / [(1 - a) + a/k]

例子

考虑这样一种情况,系统的某个部分初始耗时比例为60%(a = 0.6),其加速比例因子为3,也就是性能提升了300%。则我们可以获得的整体系统加速比为:

1 / [(1 - 0.6) + 0.6 / 3] = 1 / (0.4 + 0.2) = 1 / 0.6 = 1.66666666 约等于 1.67倍

可以看到虽然我们优化的部分提升了3倍性能,但是整体性能只提升了1.67倍。

虽然我们对系统的一个主要部分做了重大改进,但是获得的加速比却明显小于这部分的加速比。这就是Amdahl定律的主要观点–要想显著加速整个系统,必须提升系统中相当大的部分的速度

练习题1.1

假设你要把土豆从爱达荷州送到明尼苏达州,全程2500公里。在限速范围内,你估计平均速度为100公里/小时,整个行程需要25个小时。

A:新闻说蒙大拿州取消了限速,这使得行程有1500公里速度可以达到150公里/小时,那么加速比是多少?

答:根据题目可知:

1
2
3
4
5
6
7
a = 1500 / 2500 = 0.6 k = 1.5 求S

公式 S = 1 / [(1 - a) + a/k] 代入:

S = 1 / (0.4 + 0.4)
S = 1 / 0.8
S = 1.25

加速比是 1.25倍

B:你可以购买道具,想让加速比达到1.67倍,那么你必须以多快的速度通过蒙大拿州?

答:根据题目可知:

1
2
3
4
5
6
7
8
S = 1.67 a = 0.6 求k

1.67 = 1 / (0.4 + 0.6 / k)
1.67 * (0.4 + 0.6 / k) = 1
0.668 + 1.002 / k = 1
1.002 / k = 0.332
k = 1.002 / 0.332
k = 3.02

也就是蒙大拿州的速度必须达到 100 * 3.02 = 302公里/小时才行。

练习题1.2

公司说下个版本的软件性能将提升2倍。这个任务分配给你,你已经确认只有80%的系统可以进行改进,那么,这部分需要改进多少才可以达到要求?

根据题目可以知道:

1
2
3
4
5
6
7
8
9
10
11
a = 0.8, S = 2,求k

公式 S = 1 / [(1 - a) + a/k] 代入:
2 = 1/ [(1 - 0.8) + 0.8/k]
2 = 1 / (0.2 + 0.8 / k)
2 (0.2 + 0.8 / k) = 1
0.4 + 1.6 / k = 1
1.6 / k = 0.6
1.6 = 0.6k
16 / 6 = k
k = 2.67

所以我们需要改进这部分至少2.67倍才能达到要求。

计算机系统漫游

计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。。虽然系统的 具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有 相似的硬件和软件组件,它们又执行着相似的功能。

第一个c程序

一般第一个程序都是输出hello world,这里我们使用c语言输出一个hello world。后面在来讲这里面都发生了什么。

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
printf("hello world\n");
return 0;
}

最终程序都会被转成2进制代码,一般都根据ASCII码来转换,下图是上面的代码根据ASCII码转换成的二进制代码。

coursera

程序被翻译成不同格式

计算机最后能执行的是二进制文件,所以需要把c文件转换成二进制文件,这是经过几个步骤的转换,而不是一次性转换成的。当然了,我们使用gcc编译的时候他是一下子执行了所有步骤的。

分为4个阶段

  • hello.c 经过 预处理器(cpp) 输出 hello.i (修改了的源程序)
  • hello.i 经过 编译器(ccl) 输出 hello.s (汇编程序)
  • hello.s 经过 汇编器(as) 输出 hello.o (可重定位目标程序)
  • hello.o 和 引入的其他库的文件 经过 连接器(ld) 输出 hello.exe (可执行程序)

预处理阶段

预处理器根据以字符#开头的命令,修改原始的c程序。把你引入的文件插入到原始文件中。生成新的hello.i文件。

编译阶段

编译器把hello.i这个c程序文件编译成汇编程序文件。生成新的hello.s文件。

汇编阶段

汇编器把hello.s这个汇编程序翻译成机器语言指令,把这些指令打包成可重定位目标程序。生成新的hello.o文件,它包含的17个字节是函数main的指令编码。

链接阶段

我们的c程序调用了别的函数,调用了printf这个输出函数,这个函数是标准c库里面的函数,这个函数存在于printf.o这个预先编译好的文件里面,而我们要把这两个文件合并到一起,链接器就负责这种合并。最后得到一个可执行程序 hello.exe

系统的硬件组成

总线

总线贯穿整个计算机系统,负责在各个部件之间传递数据。通常总线被设计成传送定长的字节块,也就是字(word)。字中的字节数是一个基本的系统参数,现在大多数机器都是8个字节(64)位的了,4个字节(32)位的机器已经很少见了。

I/O设备

I/O(输入/输出)设备是系统和外部连接的通道。下图包括四个I/O设备。分别是

  • 作为用户输入的键盘
  • 作为用户输入的鼠标
  • 作为用户输出的显示器
  • 存储数据和程序的磁盘
    最开始,可执行程序就是存储在磁盘上面的。

每个I/O设备都通过适配器或者控制器和I/O总线相连。控制器和适配器的区别主要在于封装方式上面。控制器是I/O设备本身或者系统的主印制电路板(通常称作主板)上的芯片组。而适配器是一块插在主板插槽上的卡

主存

主存是一个临时存储设备,在处理器执行程序时,用来存放数据。

从物理上来说,主存是一组动态随机存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址,这些地址是从零开始的

处理器

中央处理单元(CPU),简称处理器。是解释或执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备或寄存器,称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条指令。

从电脑开机开始,PC就指向一条指令,执行指令后执行下一条指令,不断运行。

这样的简单操作不多,都围绕着主存,寄存器文件和算术/逻辑运算单元(ALU)进行。下面是一些简单操作的例子。

  • 加载:从主存复制一个字节到寄存器。
  • 存储:从寄存器复制一个字节到主存。以覆盖原来的值。
  • 操作:把两个寄存器的内容复制到ALU做运算,将结果存在一个寄存器中。
  • 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,覆盖PC原来的值。

coursera

运行hello程序

程序通过shell进行执行。

./hello

这个时候系统把这个字符通过键盘逐一读入寄存器,然后再放入主存。

当我们按下回车,这个时候系统开始执行hello的内容,把hello world从磁盘读入主存。利用直接存储器存取技术(DMA),可以直接从磁盘读入主存,而不需要经过寄存器。

把程序内容读入主存后,开始执行main函数的内容,把hello world从主存复制到寄存器,最后显示在屏幕上面。

高速缓存

这个运行过程说明程序多次在主存和寄存器之间复制移动代码。这些重复操作如果能变得更快,那么整个程序就能变得更快。这就是高速缓存的作用。

根据机械原理,较大的设备比较小的设备速度慢,而快速设备的造价也远高于低速设备。比如,磁盘的容量可以比主存大1000倍,但是主存的速度可能比磁盘大1000万倍。同样的,寄存器比主存的速度也要更快。

针对这些速度的差异,系统的设计者采用了高速缓存设备,作为暂时的集结区域,存放处理器近期可能会需要的信息。系统有L1,L2,L3三级缓存。L1最快最小,L3最慢最大,

计算机网络和因特网

什么是因特网

什么是因特网?回答这个问题有两种方式:其一,从具体构成上看:可以分成基本硬件软件组件。其二,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。

因特网是网络的网络,是通信技术计算机技术紧密结合的产物。是互连的自治的

  • 自治:无主从关系
  • 互连:互联互通

具体构成描述

因特网是世界范围的计算机网络。互联了世界的计算机网络。在之前计算设备多是电脑,发展到现在,加入了手机,电视,平板,汽车等设备。这些都被称为主机(host)端系统(end system)

端系统通过通信链路分组交换机连接到一起。通信链路由同抽电缆铜线,光纤等物理媒体组成。不同物理媒体的传输速率不同,传输速率以(比特/秒度量)。

端系统要发送的时候,把发送信息分段,每段和首部字节包裹到一起称为一个分组,把分组通过网络从发送端系统发送到接收端系统。

分组交换机分成路由器链路层交换机。路由器用于网络核心,链路层交换机用于接入网。

端系统通过因特网服务提供商ISP接入,包括家庭ISP,公司ISP等。每个ISP由多个分组交换机和多个通信链路组成。

  • 从范围分:局域网,城域网,广域网
  • 从拓扑结构分:星型,主线型,树形,网状。
  • 从交换网络分:电路交换,报文交换,分组交换。

协议

协议控制着网络之间计算机的通信。不同的协议完成不同的通信任务。

协议的三要素:

  • 语法:数据与控制信息的结构和格式
  • 语义:需要发出何种控制信息,完成何种动作何种响应。差错控制
  • 时序:事件顺序,速度匹配

问问题

当你发出你好的时候,发送了一条请求报文。当对方回复你好,你有什么事吗的时候,回复了一条响应报文。

这时候你问问题你知道天安门在哪里吗。发送了一条请求报文。对方回复天安门在这里呀,......。回复了一条响应报文。

网络边缘

我们的手机,电视,智能设备这些端系统联网,都处于网络边缘。端系统也叫做主机,可以分成客户端和服务端。

接入网

接入网是链接网络边缘的端系统到边缘路由器的物理链路。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。

网络核心

网络核心是网络之网络,无数的路由器和交换机相互连接在一起。

三种交换方式:

  • 电路交换,建立连接-通信-释放链接,独占信道,不应对突发性。不用的时候浪费。通过多路复用技术来实现共享物理链路。
  • 报文交换,发送整个报文。 时间 M/R * h h是跳步数。发送时间长,和跳步数成正比,并且随着报文越大,路由器存储也需要越大。
  • 分组交换,报文切成一个个分组,一个分组过一个路由器的时间是 L/R 。整个报文的时间是 M/R + nL/R ,n是路由器数量。

多路复用技术:

  • 频分多路复用(FDM)根据不同的频率划分
  • 时分多路复用(TDM)根据不同的时间划分
  • 波分多路复用(WDM)根据不同的波划分
  • 码分多路复用(CDM)每个手机分配码片,通过码片加密传输,再解密。用于手机网络。

分组交换

报文:包含从源主机到目的主机传输的任何东西。源主机将长报文划分为较小的一个个分组。分组通过通信链路和分组交换机(路由器和链路层交换机)传送。

分组以最大传输速率传输。

1
2
传输时间 = 分组长度 / 传输速率
传输时间 = L / R

例子

一个报文大小7.5Mbps。一个分组1500bits。总共有5000个分组。传输速率R = 1.5Mbps。会经过3段链路,2个路由器。

报文交换时间 = M / R = 7.5 / 1.5 = 5s 3段链路总共就是 5 * 3 = 15s。

分组交换时间 = L / R = 1500 / (1.5 * 106) = 0.001s
5000个分组就是 5000 * 0.001s = 5s,再加上2个路由器,总共是 5.002s

分组交换公式:M/R + nL/R n=路由器数量
报文交换公式:hM/R h=链路数量(跳步数)

计算机网络的性能

速率数据率或称数据传输速率比特率。单位时间(秒)传输信息(比特)量。

  • b/s(bps)
  • kb/s(kbps)
  • Mb/s(Mb/s)
  • Gb/s(Gb/s)
  • k = 103, M = 106, G = 109

带宽原本指信号具有的频带宽度,即最高频率与最低频率之差,单位是赫兹(HZ)。
网络的带宽通常是数字信道所能传输的最高数据率,单位b/s。

延迟/时延

分组交换为什么会丢包和时延?

1
2
路由器的缓存队列满了,在接到分组就会丢弃,产生丢包。
分组进行排队的时间延迟。

dproc :节点处理延迟

  • 差错检测
  • 确定输出链路
  • 通常 < msec

dqueue:排队延迟,在路由器里面排队

  • 等待输出链路可用
  • 取决于路由器拥塞程度
  • a:平均分组到达速率
  • La/R流量强度 = 0 平均排队延迟很小
  • La/R = 1平均排队延迟很大
  • La/R > 1超出服务能力

dtrans:传输延迟

  • L:分组长度(bits)
  • R:链路带宽(bps)
  • dtrans = L/R

dprop:传播延迟

  • d:物理链路长度
  • s:信号传播速度(2 * 108 m/sec)
  • dprop = d/s

时延带宽积

1
2
3
时延带宽积 = 传播时延 * 带宽
= d<sub>prop</sub> * R(btis)
= 以比特为单位的链路长度,也就是链路里面有多少个比特

分组丢失 丢包

  • 队列缓存容量有限,队列满了
  • 分组到达已满队列将丢弃
  • 丢弃分组可能由前序节点或源重发(也可能不重发)

丢包率 = 丢包数 / 已发分组总数

吞吐量/率

吞吐量表示在发送端与接收端之间传送数据速率(b/s)
即时吞吐量是给定时刻的速率
平均吞吐量是一段时间的平均速率

1
吞吐量取较小的一段链路的带宽吞吐量。

计算机网络的体系结构

实体:表示任何可发送或接收信息的硬件或软件。
协议:控制两个对等实体通信的规则的集合,协议是“水平的”。
实体需要使用下层服务,对上层提供服务,遵循本层协议,实现本层功能。服务是“垂直的”
下层实现对上层服务是“透明”的

OSI7层结构

从功能上描述网络结构:分层结构

  • 应用层 http https ftp 报文
  • 表示层
  • 会话层
  • 传输层 tcp upd 报文段
  • 网络层 ip 数据报
  • 数据链路层 mac 帧
  • 物理层

每层进行数据封装,增加头信息,也就是控制信息

  • 地址:发送和接收
  • 差错检测编码:差错检测或纠正
  • 协议控制:附加信息,优先级,服务质量,安全控制
    构造协议数据单元(PDU)
物理层功能
  • 接口特性
  • 比特编码
  • 数据率
  • 比特同步
    • 时钟同步
  • 传输模式
    • 单工 只能单向通信
    • 半双工 可以双向通信,但只能交替进行
    • 全双工
数据链路层

物理链路直接相连的两个节点之间的数据传输。

第一章课后复习题

  1. “主机”和“端系统”之间有什么不同?列举几种不同类型的端系统。web服务器是一种端系统吗?

没什么不同,主机即端系统。
手机是端系统,ipad是端系统,智能音箱是端系统。
web服务器也是一种端系统。

  1. “协议”一词常被用于描述外交关系。维基百科是怎样描述外交协议的。

直接去维基百科看

  1. 标准对于协议为什么重要?

如果都使用不同的协议,那么就没法交互了。所以需要标准来统一协议。

  1. 列出6种接入技术,将它们分为住宅接入,公司接入或广域无线网络接入。

同轴电缆 住宅接入
混合光纤同轴电缆(HFC)住宅接入
FTTH 住宅接入,公司接入
双绞线 住宅接入
WIFI 住宅接入,公司接入,广域无线网络接入
4G 广域无线网络接入

  1. HFC传输速率在用户间是专用的还是共享的?在下行HFC信道中,可能出现碰撞吗?为什么?

共享的。
不会,在下行信道,所有的分组从头到尾有同一个源发出,因此不会发生冲突。

  1. 以太LAN的传输速率是多少

用户10Mbps,100Mbps,服务器1Gbps,10Gbps

  1. 能够运行以太网的一些物理媒体是什么?

同轴电缆,光纤,双绞铜线

  1. 拨号调制解调器,HFC,DSL和FTTH都用于住宅接入,对于这些技术中的每一种,给出传输速率的范围,并讨论有关带宽是共享的还是专用的

拨号是专用的
HFC,DSL,FTTH都是用户共享的

  1. 假定在发送主机和接收主机间只有一台分组交换机。发送主机和交换机间以及交换机和接收主机间的传输速率分别是R1和R2。假设该交换机使用存储转发分组交换方式,发送一个长度为L的分组的端到端总时延是什么?(忽略排队时延,传播时延和节点处理时延)

从发送主机到交换机的传输时延是 L/R1
从交换机到接受主机的传输时延是 L/R2
端到端总时延 = L/R1 + L/R2

  1. 与分组交换网络相比,电路交换网络有哪些优点?在电路交换网络中,TDM比FDM有哪些优势?

电路交换网络独占带宽,速率更加稳定,建立好链接好只需要传输数据,不需要拥塞控制,流量控制,丢包等问题。

FDM是划分频率,TDM是划分时隙。发生丢失数据的话,TDM只会丢失一个时隙的数据,而FDM可能是大部分。

  1. 假定用户共享一条2Mbps链路。同时假定当每个用户传输时连续以1Mbps传输,但每个用户仅传输20%的时间。
    a. 当使用电路交换时,能够支持多少用户?
    b. 作为该题的遗留问题,假定使用分组交换。为什么如果两个或更少的用户同时传输的话,在链路前面基本没有排队时延?为什么如果3个用户同时传输的话,将会有排队时延?
    c. 求出某指定用户正在传输的概率。
    d. 假定现在有3个用户。求出在任何给定时间,所有3个用户在同时传输的概率。求出队列增长的时间比率。

a: 电路交换可以支持两个用户。
b: 因为两个用户每个用户1Mbps传输速率,两个刚好2Mbps占满了链路,当3个的时候,对于交换机来说输入速率就变成了3Mbps,而输出还是2Mbps,所以会产生排队。
C: 20%
d: 0.2 * 0.2 * 0.2 = 0.008

  1. 为什么在等级结构相同级别的两个ISP通常互相对等?某IXP是如何挣钱的?

因为互相对等可以直接连接,节省从上层ISP的时间和钱。
IXP通过流量对ISP收费

  1. 某些内容提供商构建了自己的网络。描述谷歌的网络。内容提供商构建这些网络的动机是什么?

绕过顶层ISP,直接和接入ISP互联,减少向顶层ISP的付费,并且可以对网络有更多的控制和操作。

  1. 考虑从某源主机跨越一条固定路由向某目的主机发送一分组。列出端到端时延组成部分。这些时延中的哪些是固定的,哪些是变化的?

总时延 = 节点处理时延 + 排队时延 + 传输时延 + 传播时延
变化的是节点处理时延 + 排队时延
固定的是传输时延 + 传播时延

  1. 访问在配套Web网站上有关传输时延与传播时延的Java小程序。在可用速率、传播时延和可用的分组长度之中找出一种组合,使得该分组的第一个比特到达接收方之前发送方结束了传输。找出另一种组合,使得发送方完成传输之前,该分组的第一个比特到达了接收方。

传输时延 < 传播时延的时候,传输完了第一个比特还没有到达接收方。
传输时延 > 传播时延的时候,传播完了还没传输完,也就是第一个比特到达接收方还在传输。

  1. 一个长度为1000字节的分组经距离2500km的链路传播,传播速率为2.5x10^8m/s并且传输速率为2Mbps,它需要多长时间?更为一般地,一个长度为L的分组经距离为d的链路传播,传输速率为s并且传播速率为Rbps,它需要用多长时间?该时延与传输速率相关吗?

传输时延 = 1000 / 2000000 = 0.0005s
传播时延 = 2500 / 250000 = 0.01s
需要 0.0105s 忽略节点处理时延和传播时延
L/s + d/Rbps
相关

  1. 假定主机A要向主机B发送一个大文件。从主机A到主机B的路径上有3段链路,其速率分别为R1 = 500kbps,R2 = 2Mbps,R3 = 1Mbps。
    a. 假定该网络中没有其他流量,该文件传送的吞吐量是多少?
    b. 假定该文件为4MB。传输该文件到主机B大致需要多长时间?
    c. 重复(a)和(b),只是这时R2减小到100kbps。

a: 吞吐量取决于最小的速率也就是500kbps。
b: 4000 * 8 / 500 = 64s
c: 吞吐量 = 100kbps 传输时间 = 4000 * 8 / 100 = 320s

  1. 假定端系统A要向端系统B发送一个大文件。在一个非常高的层次上,描述端系统怎样从该文件生成分组。当这些分组之一到达某分组交换机时,该交换机使用分组中的什么信息来决定将该分组转发到哪一条路上?因特网中的分组交换为什么可以与驱车从一个城市到另一个城市并沿途询问方向相类比?

报文-段-数据报-帧
使用目的ip地址和路由转发协议决定
路由转发协议使用了转发表,查询转发表和问路类似,一个路由器和一个城市类似

  1. 访问配套Web站点的排队和丢包Java小程序。最大发送速率和最小的传输速率是什么?对于这些速率,流量强度是多少?用这些速率运行该Java小程序并确定出现丢包要花费多长时间?然后第二次重复该实验,再次确定出现丢包花费多长时间。这些值有什么不同?为什么会有这种现象?

  1. 列出一个层次能执行的5个任务。这些任务中的一个(或两个)可能由两个(或更多)层次执行吗?

传输层 tcp协议:差错检测,分组重传,流量控制,拥塞控制,建立连接

可能,传输层有差错检测,网络层也有差错检测。

  1. 因特网协议栈中的5个层次有哪些?在这些层次中,每层的主要任务是什么?

应用层:完成自己的应用功能 http,icmp,ftp应用执行
传输层:完成端到端传输 tcp udp协议 确定源和目的端口号 进程传输
网络层:完成网络的端到端传输 IP协议 源和目的ip地址 主机传输
数据链路层:完成数据的端到端传输 MAC协议 到下一个节点的传输
物理层:完成比特流的端到端传输 实际物理传输

  1. 什么是应用层报文?什么是传输层报文段?什么是网络层数据报?什么是链路层帧?

应用层报文就是数据报文
传输层:增加源和目的端口号封装成段
网络层:增加源和目的ip地址,封装成数据报
链路层:增加MAC地址,封装成帧

  1. 路由器处理因特网协议栈中的哪些层次?链路层交换机处理的是哪些层次?主机处理的是哪些层次?

主机处理所有层次
路由器处理物理层,链路层,网络层三层
交换机处理物理层,链路层两层

  1. 病毒和蠕虫之间有什么不同?

病毒:需要用户交互才能感染设备
蠕虫:不需要用户交互

  1. 描述如何产生一个僵尸网络,以及僵尸网络是怎样被用于DDoS攻击的。

恶意软件控制网络设备产生僵尸网络
恶意软件控制僵尸网络不断攻击服务器,发送大量分组,创建大量链接,让正常请求被服务器忽略或拒绝。

  1. 假定Alice和Bob经计算机网络相互发送分组。假定Trudy将自己安置在网络中,使得她能够俘获由Alice发送的所有分组,并发送她希望给Bob的东西;她也能俘获Bob发送的所有分组,并发送她希望给Alice的东西。列出在这种情况下Trudy能够做的某些恶意的事情。

假扮成Alice或者Bob发送恶意软件
盗取Alice和Bob的信息

应用层

应用层协议原理

两种架构

  • C/S 客户-服务器架构
  • P2P 对等架构

P2P的自扩展性:尽管每个对等方都请求文件产生工作量,但每个对等方也向其他对等方分发文件增加系统服务能力。

未来P2P面临的三大挑战:

  • ISP友好。
    大多数ISP都是下载比上传快。但是P2P加大了上传流量,给ISP带来了压力。需要设计对ISP友好的P2P。
  • 安全性。
    因为高度分布和开放特性。给安全带来了挑战。
  • 激励
    未来P2P的成功也取决于说服用户自愿向应用提供带宽,存储和计算资源。这对激励设计带来挑战。

进程通信

实际通信的是计算机上面的进程。
通过IP地址确定一个主机。通过端口号确定一个进程。
计算机提供了一套socket套接字。

使用的运输层服务

看几个方面:

  • 可靠数据传输
  • 吞吐量 带宽敏感
  • 时延
  • 安全

因特网提供的运输服务

TCP

  • 建立连接
  • 可靠数据传输
  • 流量控制
  • 拥塞控制

UDP

轻量级,全部由应用层实现

应用层协议

  • 交换的报文类型, 例如请求报文和响应报文
  • 各种报文类型的语法,如报文的各个字段及这些字段是如何描述的。
  • 字段的语义,这些字段中包含的信息的含义。
  • 一个进程何时以及如何发送报文,对报文进行响应的规则。

Web和HTTP

HTTP的RFC文档

  • RFC 1945
  • RFC 2616

报文格式

请求报文

  • 请求行
  • 首部行
  • 空行
  • 请求体

响应报文

  • 状态行
  • 首部行
  • 响应体

HTTP本身是无状态的,通过cookie可以实现身份记录。

cookie技术有4个组件

  • HTTP响应报文中的一个cookie首部行
  • HTTP请求报文中的一个cookie首部行
  • 用户端系统有一个cookie文件
  • WEB站点的一个后端数据库

WEB缓存

WEB缓存器也叫代理服务器,它是能代表初始WEB服务器来满足HTTP请求的实体。WEB缓存服务器有自己的磁盘空间,保存最近请求过的对象的副本。

CDN就是一种WEB缓存。

条件GET方法

尽管高速缓存能快速响应,但是存储的副本可能是陈旧的,过期的。

HTTP协议有一种机制,允许缓存器证实它是最新的。这种机制就是条件GET方法

  • 请求报文使用GET方法
  • 请求报文中包含一个“if-Modified-Since”首部行,内容是上次服务器返回的最新修改时间

WEB服务器会检查如果没有修改就返回一个304状态码,缓存就知道还是最新的。

文件传输FTP

HTTP和FTP都是文件传输协议。(RFC959)

一些重要的区别,最显著的是FTP使用两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接

控制连接用于在俩主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及存放获取文件的命令。

数据连接用于实际发送一个文件。

因为FTP使用一个独立的控制连接,所以我们也称FTP的控制信息是带外传送的。

FTP首先在21端口建立一个控制连接
FTP的客户端通过控制连接发送用户标识和口令,命令。
FTP的服务端收到传输文件的命令后,建立数据连接用来传输文件。
每个数据连接传输一个文件后关闭。

FTP命令和回答

命令和回答都是以7比特的ASCII格式在控制连接上发送的。为了区分连续的命令,每个命令后跟回车换行符。

  • USER username: 用于向服务器发送用户标识
  • PASS password: 用于向服务器发送用户口令
  • LIST :用于请求服务器回送当前远程目录中的所有文件列表。该文件列表是一个数据连接发送的。
  • RETR filename: 用于从远程主机当前目录检索文件。该命令引起远程主机发起数据连接传输该文件到本地客户端。
  • STOR filename: 用于在远程主机当前目录存放文件。就是往远程主机传输文件。

一些典型回答:

  • 331 Username OK, Password required(用户名Ok,需要口令)
  • 125 Data connection already open: transfer starting (数据连接已经打开,开始传送)
  • 425 Can’t open data connection (无法打开数据连接)
  • 452 Error Writing File (写文件出错)

电子邮件

邮件有三部分

  • 用户代理
  • 邮件服务器
  • 简单邮件传输协议

发送邮件过程

  • 发送方的用户代理 到 发送方的邮件服务器
  • 发送方的邮件服务器 到 接收方的邮件服务器
  • 接收方的邮件服务器 到 接收方的用户代理邮箱

SMTP

RFC 5321 给出了SMTP的定义。SMTP使用TCP协议。只能传输7比特的ASCII表示。

发送过程:

  • 客户端建立连接
  • S:220 hamburger.edu
  • C:HELO crepes.fr
  • S:250 Hello crepes.fr,pleased to meet you
  • C:MAIL FROM: alice@crepes.fr
  • S:250 alice@crepes.fr … sender ok
  • C:RCPT TO: bob@humburger.edu
  • S:250 bob@humburger.edu …. Recipient ok
  • C:DATA
  • S:354 Enter mail, end with “.” on a line by itself
  • C:Do you like ketchup?
  • C:How about you pickets?
  • C:.
  • S:250 Message accepted for delivery
  • C:QUIT
  • S:221 hamburger.edu closeing connection

和HTTP对比

HTTP 是一个拉协议,从服务器拉取数据。
SMTP 是一个推协议,往服务器推送邮件。

HTTP 可以任意表示
SMTP 只能7比特ASCII表示。

HTTP 每个对象一个响应
SMTP 一个邮件多个对象

SMTP典型的首部报文

FROM:
TO:
Subject:

获取邮件协议

POP3 和 IMAP

POP3

pop3分为3个阶段

  • 特许:用户代理发送用户名和口令(明文)
  • 事务处理:用户代理取回报文,做删除报文的标记,取消删除标记,获取邮件的统计信息。
  • 更新阶段:发生在客户端QUIT指令后,结束会话,删除那些标记的报文。

特许阶段有两个主要命令

  • user
  • pass

事务处理阶段有4个主要命令

  • list 列出邮件列表
  • retr id 读取邮件内容
  • delete 删除邮件
  • quit 退出

IMAP

imap比pop3更加复杂,增加了远程文件夹功能。imap支持用户读取报文的一部分,比如只读取首部,或多部分MIME的一部分。当宽度低的时候非常有用。

DNS

DNS使用UDP协议。

DNS完成域名和ip地址的转换。

域名分为

  • 根DNS服务器
  • 顶级DNS服务器 com,org,edu,cn
  • 权威DNS服务器

请求

迭代请求

  • 请求根服务器
  • 根服务器返回
  • 请求顶级服务器
  • 顶级服务器返回
  • 请求权威
  • 权威返回

递归请求

  • 请求根
  • 根请求顶级
  • 顶级请求权威
  • 权威返回顶级
  • 顶级返回根
  • 根返回

TCP套接字

遵守RFC协议文档的应用程序是“开放”的。不遵循RFC文档中的协议的应用程序是“专用”的。

UDP套接字

如何用AI打造一个爆款视频,涨粉1000+

引言

在数字化时代,视频内容已成为最有力的传播媒介之一,它以其直观和生动的特性吸引着全球观众的注意力。对于程序员和其他希望通过副业赚钱的群体来说,视频平台不仅提供了一个展示技能、分享知识和创造收入的绝佳机会,而且随着技术的进步,视频创作不再是专业人士的专利,普通用户也能通过简单的工具创作出高质量的视频内容。

AI技术的发展为视频创作带来了革命性的变化。AI不仅可以帮助自动化视频编辑过程,还能在内容创作、市场分析和用户互动等方面提供支持。对于目标画像中的程序员来说,AI技术的应用不仅能提高创作效率,还能帮助他们更好地理解观众需求,创作出更受欢迎的视频内容。

程序员通常具有强大的逻辑思维和问题解决能力,但在视频创作方面可能缺乏经验和技能。他们面临的挑战包括如何创作吸引人的内容、如何有效推广视频以及如何将视频转化为收入。此外,他们可能还需要在繁忙的工作之余找到时间来管理副业。本文将探讨如何利用AI技术帮助这一群体克服这些挑战,实现他们的目标。

AI如何帮助提升视频编辑效率?

  • 自动化视频编辑:
    AI能够自动识别视频中的关键帧、场景变换和语音内容,帮助自动剪辑视频,减少人工编辑的时间和精力。例如,通过AI分析音频波形和视频内容,可以自动将视频剪辑成用户设定的长度,自动匹配背景音乐的节奏。

  • 内容创意生成:
    AI可以基于已有的数据和趋势,生成创意内容建议,包括视频主题、故事板和视觉效果等。利用AI的生成性对抗网络(GANs),可以创建逼真的视频背景、人物。

  • 智能剪辑工具:
    如Filmora和Descript这样的工具,它们提供基于文本的编辑、自动转录、AI辅助编辑功能,如自动填充词删除、录音室音效增强、眼神接触校正和自动剪辑创建,简化编辑过程。

  • 一键包装和AI封面生成:
    一些AI工具允许用户一键添加字幕、特效、贴纸等,快速制作出具有综艺感的口播视频。同时,AI技术能智能分析视频内容,一键生成吸引眼球的视频封面。

  • 画质修复和AI消除:
    AI技术能高清修复渣糊画质的视频,提升视频的整体观感。同时,提供批量去除视频中的字幕和水印的功能,帮助用户获得干净的视频画面。

  • 视频转录和翻译:
    AI视频编辑工具如Descript,可以自动转录音频和视频文件,轻松添加字幕以提高可访问性和参与度。Vozo则是一款AI驱动的短视频工具,能够一键重写视频脚本并重新配音,保留原说话者的音色、语气和口型同步。

  • 智能分析和音频视频创作:
    一站式AI智能分析和音频视频创作神器可以大幅提高创作效率,例如通过智能分析技术,在视频中添加精准的视觉效果和动态元素。

  • 全自动的内容生成与剪辑:
    未来的AI技术将能够根据预设的风格和情感要求,自动生成并剪辑完整的视频内容,极大提升视频制作的效率。

通过这些方式,AI技术帮助视频编辑工作变得更加高效和精准,降低了专业技能的门槛,使得视频创作更加便捷和快速。这对于程序员和其他对AI感兴趣的创作者来说,是一个巨大的优势,他们可以利用自己的技术背景,结合AI工具,快速提升视频创作能力,实现内容的快速产出和传播。

理解目标受众

程序员的背景和技能

程序员,作为技术行业的中坚力量,通常具备扎实的编程技能和对新技术的敏感度。他们习惯于解决问题,并且能够快速适应和学习新工具。在视频创作领域,程序员可以利用他们的技术背景来掌握AI视频编辑工具,这为他们提供了一个独特的优势。他们对逻辑和结构化思维的倾向也有助于在视频内容的组织和叙事上做出清晰的规划。

副业赚钱的动机和目标

许多程序员寻求副业来增加收入,提高生活质量,或者是为了追求个人兴趣和激情。视频创作作为一个灵活的副业选择,允许他们在业余时间进行创作,同时也有可能带来可观的收益。他们的目标可能包括建立个人品牌、增加被动收入、提升专业技能或者仅仅是为了娱乐和创造性的表达。

对AI的兴趣和应用场景

程序员通常对AI技术有着浓厚的兴趣,他们可能会探索AI在视频创作中的应用,以提高效率和创造力。AI的应用场景在视频创作中非常广泛,从自动化剪辑到内容创意生成,再到视频推广和分析,AI技术都能提供强大的支持。程序员可以利用这些工具来减少重复性工作,专注于创意和策略规划。

不同短视频平台的受众

短视频平台众多,但是每个平台都有它的受众,有常用它的人群,这些人群有不同的喜好。根据我发视频的结果来看,也是同样的。

同样的一个视频,同样的标题和简介,同样的标签,他们的播放量都是有区别的。

我发了不同类型的视频,在这里给大家做个参考。这里仅仅是播放量的参考。

  • 抖音:技术类视频还可以。影视类视频也还可以。可爱治愈系视频和AI诗词视频比较惨淡。
  • 微信视频号:可爱治愈系视频最好。AI诗词类和技术类视频一般。
  • 小红书:影视类视频最好,可爱治愈系和技术类视频一般。
  • B站:技术类视频最好,其他视频一般。

总体而言微信视频号的流量最大,但是转化最好的是B站,小红书和抖音。

如果大家做的是技术类视频,那么推荐B站和抖音。

挑战

程序员在视频创作中可能会遇到以下技术挑战:

非线性编辑的复杂性:
视频编辑通常涉及非线性编辑系统(NLE),这对于习惯于线性编程思维的程序员来说可能是一个挑战。他们需要适应在时间线上进行剪辑、添加效果和调整音频等操作。

视频和音频同步:
确保视频和音频的精确同步是视频制作中的一个常见问题。程序员可能需要学习如何使用专业软件来处理音频和视频的同步问题。

视频格式和编码:
视频文件有多种格式和编码标准,程序员需要了解这些格式之间的区别以及如何转换它们,以确保视频在不同平台和设备上的兼容性。

色彩校正和分级:
视频的色彩校正和分级是一个专业领域,程序员可能需要学习如何调整色彩平衡、对比度和饱和度,以达到视觉上的吸引力。

特效和动画:
在视频中添加特效和动画可能需要使用复杂的软件和插件,程序员可能需要掌握这些工具的使用,以及如何编程实现自定义效果。

视频压缩和优化:
为了在保持视频质量的同时减少文件大小,程序员需要了解视频压缩技术,包括选择合适的编码器和设置压缩参数。

跨平台兼容性:
不同的社交媒体平台和视频分享网站可能有不同的视频规格要求,程序员需要确保他们的作品能够适应这些不同的平台。

版权和法律问题:
使用音乐、图片和其他版权材料时,程序员需要了解版权法律,避免侵犯他人版权,这可能需要额外的法律知识。

硬件性能要求:
高质量的视频编辑需要较强的硬件支持,程序员可能需要升级他们的计算机硬件,以满足视频编辑软件的性能要求。

用户界面和用户体验设计:
程序员可能习惯于编写代码,但在视频创作中,他们还需要关注用户界面(UI)和用户体验(UX)的设计,以确保视频内容对观众友好。

内容创意和叙事结构:
虽然程序员在技术实现方面可能很强,但内容创意和叙事结构的构建可能是他们的弱项,这需要他们开发新的思维模式和技能。

视频推广和SEO:
为了让视频获得更多的观看和分享,程序员需要学习视频推广和搜索引擎优化(SEO)的策略,以提高视频在搜索结果中的排名。

程序员在视频创作中遇到的技术挑战是多方面的,需要他们不断学习和适应。随着AI技术的发展,许多挑战可以通过智能工具和自动化流程来解决,这为程序员提供了新的解决方案和创作可能性。

AI工具准备

通过下面的工具,可以解决我们大部分的问题,但是还有一些问题需要我们自己来解决,比如上面的推广、剪辑、创意性、选题等。

想做AI视频,那么AI视频需要以下的一些步骤和对应的工具:

  • 剧本创作:可以使用Kimi或者豆包或者GPT都可以。
  • 分镜创作:同样的,Kimi或者豆包或者GPT都可以。
  • 图片生成:可以使用一些图片生成AI。包括可灵,即梦,midjourney等。
  • 影视生成:可以使用可灵,即梦,RunWay等。
  • 音频生成:可以使用ttsmaker,魔音工坊等。
  • 视频剪辑:即梦,IMovie, 剪映等。
  • 去除水印:腾讯智影。

AI技术在视频创作中的应用

AI技术在视频创作中的应用为程序员和其他创作者提供了强大的工具,以克服技术挑战并提升创作效率。以下是AI技术在视频创作中的一些关键应用:

视频内容生成

脚本编写:
AI可以辅助编写视频脚本,通过分析流行视频的内容和结构,提供创意点子和叙事框架。这不仅节省了时间,还能确保内容的吸引力和观众的参与度。

场景设计:
利用AI生成的场景设计工具,程序员可以快速创建视频背景和动画,无需手动绘制每一帧。AI可以根据视频主题自动推荐配色方案和设计风格,使视频更具视觉冲击力。

视频编辑和优化

视频剪辑:
AI视频编辑工具能够自动识别视频中的最佳时刻,如表情、动作和对话,自动剪辑视频,节省了大量的手动剪辑工作。这些工具还可以预测剪辑点,使视频流畅自然。

色彩校正:
AI可以分析视频的色彩分布,并自动调整色彩平衡、对比度和饱和度,以达到专业级别的视觉效果。这种智能色彩校正功能使得即使没有专业经验的程序员也能制作出高质量的视频。

音频处理:
AI技术可以自动分离和增强视频中的音频,消除背景噪音,增强人声,甚至自动添加背景音乐。这使得视频的音频质量得到提升,增强了观看体验。

视频发布和推广

关键词优化:
AI可以帮助分析视频内容和观众反馈,自动生成和优化视频标题、描述和标签,提高视频在搜索引擎中的排名,增加视频的曝光率。

社交媒体分析:
AI工具可以分析社交媒体趋势和用户行为,为视频发布提供最佳时间和策略建议。这些工具还可以预测哪些内容更有可能获得观众的喜爱,帮助程序员制定更有效的内容计划。

通过这些AI技术的应用,程序员可以更专注于创意和策略,而不是技术细节。AI技术不仅提高了视频创作的效率,还降低了进入视频创作领域的门槛,使得程序员能够利用自己的技术背景,快速适应并掌握视频创作的过程。

爆款视频的创作策略

确定视频主题和风格

市场调研与趋势分析:
利用AI工具进行市场调研,分析当前流行趋势和观众偏好。例如,通过分析社交媒体上的热门话题和视频,AI可以帮助确定哪些主题和风格更受欢迎。这有助于创作者选择能够引起共鸣和关注的题材。

目标受众定位:
明确视频的目标受众,并根据受众的特点定制内容。AI可以帮助分析特定受众群体的行为和偏好,从而制作出更有针对性的视频内容。

内容差异化:
在众多视频中脱颖而出的关键在于差异化。AI可以帮助分析竞争对手的内容,找出差异化的切入点,如独特的视角、新颖的故事讲述方式或者创新的视频风格。

利用AI进行市场调研

关键词分析:
使用AI工具进行关键词分析,找出与视频主题相关的热门搜索词,这些关键词可以用于视频的标题、描述和标签,以提高视频在搜索引擎中的排名。

情感分析:
AI情感分析工具可以评估社交媒体上对特定话题的公众情绪,帮助创作者理解观众的情感反应,从而调整内容以更好地满足观众的情感需求。

竞品分析:
AI可以分析竞争对手的视频内容,提供关于他们成功元素的洞察,如视频长度、编辑风格、使用的音效等,从而为创作者提供灵感。

创作引人入胜的内容

故事叙述:
好的故事叙述是吸引观众的关键。AI可以帮助创作者构建引人入胜的叙事结构,通过分析成功的视频案例,提供故事发展的建议。

视觉效果优化:
AI工具可以提供关于视频视觉效果的优化建议,如色彩搭配、场景转换等,以增强视频的视觉冲击力。

互动性增强:
AI可以帮助创作者在视频中加入互动元素,如问答、投票等,以提高观众的参与度和互动性。

视频制作的技术细节

视频格式和编码选择:
根据目标平台和受众设备,AI可以建议最合适的视频格式和编码设置,以确保视频在不同设备上都能流畅播放。

音频优化:
AI音频分析工具可以帮助创作者优化音频质量,包括音量平衡、噪音消除和音质增强,以提供更好的听觉体验。

特效和动画:
AI驱动的特效和动画工具可以简化这些复杂元素的添加过程,使创作者能够快速实现创意视觉效果。

视频内容的优化和迭代

利用AI分析观众反馈

评论分析:
AI可以分析视频下的评论,识别出观众的正面和负面反馈,以及他们对视频内容的具体建议。这些数据可以帮助创作者了解观众的需求和期望,从而调整内容策略。

观看行为分析:
通过分析观众的观看行为,如观看完成率、跳过率和重复观看次数,AI可以提供关于视频哪些部分最吸引人、哪些部分需要改进的洞察。

情感识别:
利用AI的情感识别技术,可以从观众的面部表情和语音语调中分析出他们的情感反应,这对于理解观众的真实感受非常有用。

调整内容策略

内容优化:
根据AI分析的结果,创作者可以对视频内容进行优化,比如增强那些观众反应积极的内容元素,减少或修改那些反应消极的部分。

风格调整:
如果AI分析显示观众对某种风格或类型的视频更感兴趣,创作者可以调整自己的视频风格,以更好地吸引目标受众。

发布时间优化:
AI可以帮助分析不同发布时间对视频表现的影响,从而找到最佳的发布时间,以提高视频的曝光率和观看量。

持续优化视频质量

技术升级:
随着AI技术的进步,创作者可以利用最新的AI工具来提升视频质量,比如使用更先进的自动剪辑工具、更高质量的自动字幕生成器等。

创意迭代:
AI可以提供创意迭代的建议,比如通过分析流行趋势和观众反馈,帮助创作者不断更新和创新视频内容。

互动和社区建设:
AI可以帮助创作者设计更有效的观众互动策略,比如通过分析观众的互动数据来设计问答环节、投票和挑战等,以增强观众的参与感和社区归属感。

通过这些方法,创作者可以不断优化和迭代自己的视频内容,以适应不断变化的观众需求和市场趋势。这不仅有助于提升视频的吸引力和观看量,还能增强观众的忠诚度,为创作者带来长期的成功。

实战案例

首先准备上面的AI工具。开始实战,大胖橘的一天。

剧本制作

剧本制作我们使用豆包就可以。提示词如下。我们让豆包给出5份剧本,可以从里面选出自己想要的,如果没有的话就再让它生成一份。每个分镜是5s,因为大部分AI视频都是5s。

1
2
3
4
5
6
7
8
9
10
11
12
13
#背景:我是一个短视频爱好者。 
#角色:你是一个专业的影视导演。擅长制作电影镜头,分镜,每个分镜5s,请合理安排镜头和画面音频运镜方式。
#技能:
1. 根据用户输入的信息可以生成专业的影视剧本。
2. 根据剧本生成分镜,每一个分镜是5s
3. 合理安排分镜的画面音频和运镜。
4. 根据用户的需求继续完善剧本和镜头。
# 工作流:
1. 引导用户输入 角色,时间,地点,事件。
2.接收到信息以后开始生成剧本和分镜。
3.输出分镜内容,以表格形式,每一个分镜镜头是5s,还要包括运镜方式、画面、音频、音效。
4. 总共输出5份内容
5. 输出以后给出最佳实践

接下来我们给出一些信息。如下。

1
2
3
4
5
6
角色:可爱的大胖橘。
时间:早上,地点:家里。事件:起床洗漱准备出门。
时间:早上。地点:上班路上。事件:骑上心爱的小摩托上班。
时间:上午。地点:办公室。事件:上班。
时间:下午。地点:办公室。事件:做错事被老板骂。
时间:晚上。地点:卧室。事件:疲惫的躺在床上

接下来等待豆包给出剧本和分镜信息。

1

图片制作

接下来使用即梦AI来生成图片。

我们只需要把画面信息粘贴过去就可以了。比列选择9:16。模型可以自己对比,我选择的是图片2.1

1
大胖橘慵懒地窝在柔软的被窝里,眼睛慢慢睁开,伸着懒腰,被子被拱起.

生成内容如下:

2

接下来把每一个镜头都生成图片就可以了。

分镜制作

现在图片已经生成好了,接下来准备生成5s的分镜。同样用即梦AI就可以了。

  • 选择视频生成
  • 选择图片生视频
  • 上传图片
  • 选择视频模型:我用的默认的S2.0,也可以用其他的试试效果。

接下来生成每一个镜头就可以了。

音频制作

这里我使用的是ttsmaker音频生成。

把我们要生成的语音文字和停顿信息,速度选择好,然后点击生成就可以了。

我这里的文字和停顿。我选择的是1.1倍速,每个段落停顿时间200ms。声音我选择的是1518大鹏

1
2
3
4
5
6
7
大胖橘闹钟在床边响起,爪子从被窝伸出按掉闹钟。
走进浴室,打开淋浴喷头,水洒下来,开始享受。
洗漱完毕,在镜子前整理自己的仪表,左看看右看看。((⏱️=500))
走到门口鞋柜处,叼起钥匙,回头看一眼屋子。((⏱️=700))
骑着小摩托在路上,穿梭在车流中,旁边车辆呼啸而过。
坐在办公桌前,对着电脑屏幕愁眉苦脸,文档上满是修改标记。
晚上趴在卧室床上,四肢摊开,眼神空洞地望着天花板。

点击开始转换,接着可以试听,然后下载文件到本地。

3

视频剪辑

当每一个镜头都制作好了以后,就可以通过视频剪辑工具,把镜头放到一起了。

4

把视频放到下面,把音频也放到下面。

5

添加自己喜欢的转场动画,然后点击导出就可以了。

去水印

接下来使用腾讯智影去掉视频里面的水印。

  • 选择智能抹除
  • 本地上传
  • 将水印框住: 注意绿色的是水印框。

6

点击确定,等待完成。接下来在下面的最近作品里面点击下载即可。

题目

一个好的题目可以让视频更加火爆,题目可以自己取也可以让AI帮你取。

比如我让豆包给我取一个。我输入的提示词:

1
2
3
赛道领域:可爱小猫治愈系视频 
产品类型:大胖橘猫的一天
目标用户画像:性别:不限,可根据不同性别定制化。年龄段:不限。地域:不限。职业:工作劳累的上班族和大学生,需要放松的人。收入:收入在5万-30万之间的。

豆包给我输出的。

7

从里面选择一个就可以了。

简介

简介也可以让AI生成。同样使用豆包。

输入提示词。

1
2
3
赛道领域:可爱小猫治愈系视频 
产品类型:大胖橘猫的一天
目标用户画像:性别:不限,可根据不同性别定制化。年龄段:不限。地域:不限。职业:工作劳累的上班族和大学生,需要放松的人。收入:收入在5万-30万之间的。

豆包给我输出的。

7

接下来就可以发出去啦

总结

首先要进行选择题目,选择短视频平台受众。

接下来利用AI生成剧本、分镜、图片、视频、音频。

然后通过剪辑软件进行合并成一个视频。

最后在去除水印。

还可以通过AI生成标题和简介。

就可以去发布啦!

设计模式之享元模式–共享内存来节省空间

享元模式是说共享单元,如果有一样的部分那么共享一个组件而不是复制,也就是传址不传值。

运用共享技术有效地支持大量细粒度的对象。

为什么要使用享元模式

享元模式体现在很多地方,比如后端共享一套代码给前端各个平台,很多接口都是同一个。

享元模式是复用性的体现,大量节省了空间。

比如棋牌游戏,棋子和牌都是一样的,那么他们就可以复用同一个。

五子棋游戏

五子棋只有黑子白子,虽然我们用到了很多,但是他们其实指向了同一个内存空间,只不过创建了很多对象而已。

象棋游戏

象棋也只有车马炮这些棋子,同样可以复用,不然如果你每个棋局重新创建,那么内存很容易溢出。

扑克牌游戏

扑克牌也只有123到大王这些固定的牌。

递归算法

很多递归算法也可以通过享元模式来优化,递归到最后其实有很多是重复的值,而如果每个重复的值都需要重新占用空间,那么造成了大量的空间浪费,这也是递归慢和容易内存溢出的原因之一。

享元模式其实很简单,就是有需要的时候把已经存在的东西拿出来复用。

比如可以通过数组存储,然后需要的时候直接复用就好了。

比如通过简单工厂来创建对象的时候,如果有很多请求过来访问这个工厂,那么工厂需要创建很多对象返回。

而如果通过数组存起来,那么只返回一个对象,就节省了空间。

当然了,享元模式共享的只能是可读对象,一定是不可修改的。

如果可以修改就会造成某个地方修改而其他地方不可用的bug。

设计模式之组合模式–树形结构的最佳实践

组合模式是部分组合成整体。

将对象组合成树形结构以表示’部分’-‘整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

为什么要使用组合模式

最常用到组合模式的应该就是树形结构了。

比如公司-部门的结构,文件夹-文件的结构。

首先有一个共同的父类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

/**
* 组合模式
* 组合抽象类
* 组合的部件和整体都继承这个抽象类,组合出这个抽象类的整体
*/
abstract class Component {

protected $name;

public function __construct($name) {
$this->name = $name;
}

/**
* 增加一个Component类型的对象
*/
public abstract function add(Component $component);

/**
* 删除一个Component类型的对象
*/
public abstract function remove(Component $component);

/**
* 展示结构
*/
public abstract function show(int $depth);

}

然后实现支节点和叶子节点两个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use Illuminate\Support\Arr;
/**
* 组合模式
* 组合的支节点,可以有子节点,字节的需要是Component类型
*/
class Composite extends Component {

private $arr = [];

/**
* 增加一个Component类型的对象
*/
public function add(Component $component){
$this->arr[] = $component;
}

/**
* 删除一个Component类型的对象
*/
public function remove(Component $component) {
Arr::where($this->arr, function ($value, $key) use ($component) {
if ($value == $component) {
unset($this->arr[$key]);
}
});

}

/**
* 展示结构
*/
public function show(int $depth) {
dump(str_repeat('-',$depth) . $this->name);
foreach ($this->arr as $k => $v) {
$v->show(2+$depth);
}
}

}

/**
* 组合模式
* 组合的叶子节点
* 叶子节点不能添加和移除字节点
*/
class Leaf extends Component {

/**
* 增加一个Component类型的对象
*/
public function add(Component $component){
return '';
}

/**
* 删除一个Component类型的对象
*/
public function remove(Component $component) {
return '';
}

/**
* 展示结构
*/
public function show(int $depth) {
dump(str_repeat('-',$depth) . $this->name);
}

}

客户端通过任意添加子节点的方式来完成组合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

$root = new Composite('root');
dump($root);
$a = new Composite('a');
$root->add($a);
dump($root);
$root->remove($a);
dump($root);
$root->add($a);
$ab = new Leaf('ab');
$a->add($ab);
$b = new Composite('b');
$root->add($b);
$root->show(0);

composite

代码放在了我的github上面。

设计模式之外观模式–抽象出高层接口更加易用

外观模式是套个壳子,隐藏细节。

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使子系统更加易用。

为什么要使用外观模式

外观模式是对底层的抽象,隐藏你不该知道的东西,暴露你应该知道的东西,更加符合迪米特法则接口隔离原则

外观模式的本质同样是套壳子,比如你有一个缓存系统。

这个缓存系统存入数据需要

  1. 加锁
  2. 存数据
  3. 释放锁

我们的客户端实现

1
2
3
4
5
6
7
8
9
10
11

//加锁
$lock = new lock;
$lock->lock();

//存入数据
$redis = new redis;
$redis->set();

//释放锁
$lock->unlock();

这只是比较简单的几步,有的可能会更加复杂,你需要调用多个接口。

这样的话可以使用外观模式封装一下这些细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/**
* 外观模式
* 外观的封装,对底层模块的封装
*/
class Facade {

/**
* 对存入缓存进行封装
*/
public function set() {
//加锁
$lock = new lock;
$lock->lock();

//存入数据
$redis = new redis;
$redis->set();

//释放锁
$lock->unlock();
}

}

使用外观的客户端

1
2
3

$facade = new Facade;
$facade->set();

其实外观就是封装的思想体现。

代码放在了我的github上面。