ryouの杂七杂八
网页查看源代码
view-source(ctrl+u):是未经过js修饰的,和请求到的代码是一样的;
检查:是经过加载过部分js的代码,是展现给用户真正的源码;
Network标签页:preserve log()、disable cache(防止本地取数据),Doc-->Response也是源码
H.264(MP4)编码原理
H.264解码:I帧(关键帧)、P帧、B帧,YUV色彩模型,差值算法
H.264编码使用I帧、P帧和B帧进行压缩,通过预测、残差编码和量化等步骤实现高效编码。视频文件的元数据如分辨率和时长存储在MOV盒子中,可通过部分下载获取。编码过程中采用YUV色彩模型和差值算法优化,最终使用哈夫曼编码进行压缩。
P2P下载
P2P下载是一种分布式下载技术,它通过对等网络连接多个用户,让用户之间共享下载任务,从而节省了服务器的带宽资源。
P2P下载的优点是节省了服务器的带宽资源,提高了下载速度,同时也减少了服务器的负载,提高了下载的可靠性。
P2P下载的缺点是用户的下载流量可能会受限,用户的下载质量也可能会受到影响。
P2P下载的实现方式有两种,一种是基于BitTorrent协议的P2P下载,另一种是基于HTTP协议的P2P下载。
其中BitTorrent也就是俗称的BT,是一种基于tracker服务器的点对点文件共享协议,它通过tracker服务器来管理文件分发,用户只需要下载BT客户端,并向tracker服务器注册自己的下载任务,tracker服务器会将用户的请求分配给其他用户,用户之间通过P2P网络进行文件共享。
BT的缺点:1.仍旧依赖于服务器;
2.滋养了某些吸血鬼行为,如迅雷,只下载不上传
应运而生:磁力链接、PT
磁力链接:每个用户变成tracker服务器,利用了DHT网络技术(找tracker)
PT:在BT基础上增加规则,限制用户在特定圈子内下载,通过积分机制鼓励上传,避免吸血行为,确保上传下载数据平衡。
编程语言的分类
大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言。
编译型语言:很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java。
这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。
运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点。
但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。例如,在C++里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。
解释型语言:也称为脚本语言,例如awk、Perl、Python、Ruby与Shell。
这类语言不需要预先编译,而是在运行程序时,解释器逐行读取源代码(source code)并执行。
使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;缺点是它们的效率通常不如编译型语言。
数学思维
Mathematics is the art of giving the same names to different things.
I+P+P^2+P^3+⋯=(I-P)^(-1)
数列?级数?向量?行列式?泰勒展开?算子代数!
这是一个链接
域名后缀小常识
.com:国际通用,商业组织
.net:国际通用,网络服务
.cn:中国域名,中国企业互联网
.org:国际域名,非盈利
.top:国际域名,可以用于任何组织和个人
了解VPN
Virtual Private Network
将专用网络延伸到公共网络上,使用户能够在共享或公共网络上发送和接收数据,就像他们的计算设备直接连接到专用网络上一样。
举例:两个物理距离很远的局域网互相传输信息,直接拉物理专线很费钱,用互联网(Internet)又不安全,而VPN安全可靠。
不同的分类:1.租用运营商————MPLS VPN;企业自建————IPSec VPN、L2TP VPN、SSL VPN等。
2.远程访问VPN(出差员工拨号接入):L2TP VPN、SSL VPN;局域网之间(两个公司异地机构):MPLS VPN、IPSec VPN等。
。。。。。。
Elastic Search(ES)
一个开源的搜索引擎,是数据和应用之间的中间层
倒排索引(Inverted Index):分词+字典序 (term dictionary)+二分查找
但是term dictionary的数据量很大,不能放在内存里,放在磁盘里,而磁盘的查询速度很慢
优化磁盘搜索:目录树(trem Index)
Segment:最小的搜索单元,组成:Inverted Index + Term Index + Stored Fields(存放文档原始信息) + Doc Values(一种列式存储结构)
由于Segment一改全改,就不允许改,直接生成新的Segment,当Segment过多,就进行合并
于是我们得到了一个搜索库:Lucene
再通过一系列的优化,如分片等,最终形成一个高性能、高扩展性、高可用、支持持久化的分布式搜索引擎:ES
ps: 各个语言都有通过http对ES的接口
GiB和GB的区别
GiB:giga binary byte(缩写为gibibyte),与MiB和KiB的换算为1024
GB:giga byte,与MB和KB的换算为1000,是十进制
1GB = 1000*1000*1000 byte = 1000*1000*1000/(1024*1024*1024) GiB = 0.9313225746154785GiB
所以,一个64GB的硬盘只有59.6GiB(因为是外存,没有严格要求)
cmd,powershell,shell,bash的区别
cmd:命令行解释器,是DOS系统的命令行环境,是DOS命令的集合,是Windows系统的默认命令行解释器。
powershell:微软推出的基于.NET Framework的命令行解释器,是Windows系统的默认命令行解释器。
shell:命令行接口,是一种命令行解释器,它是操作系统提供的用户接口,用户通过它可以与操作系统进行交互。
bash:Bourne Again Shell,是一种Unix shell和命令语言,是Linux系统的默认命令行解释器。
cmd指令集
>: 重定向,将命令的输出重定向到文件或其他命令
>>: 追加重定向,将命令的输出追加到文件末尾
|: 管道,将命令的输出作为另一个命令的输入
dir:显示当前目录下的文件和文件夹
mkdir:创建目录
rmdir:删除目录
copy:复制文件或文件夹
move:移动文件或文件夹
del:删除文件或文件夹
type:显示文件内容
set:设置环境变量
start:打开文件或程序
tasklist:显示当前运行的进程
ping:测试网络连接
netstat:显示网络连接信息
arp:显示网络连接信息
systeminfo:显示系统信息
shutdown:关闭或重启系统
windows(也有unix)的命令行工具
man: 显示命令的帮助信息, 系统指令一般在第二章,如:man 2 stat
winget: 微软推出的包管理器,可以安装windows应用
CODE: 打开vscode
notepad:打开notepad
$env:path:查看环境变量
ps: 可以查看进程
ctrl-c和ctrl-z的区别:ctrl-c是终止当前命令(sigint),ctrl-z是暂停(挂起)当前命令(sigtstp), 直到收到sigcont信号才恢复,即fg命令(linux)
strace:查看系统调用, e.g: strace -e trace=write,read ps
stat: 查看文件信息
ssh
ssh: secure shell,是一种不对称加密的网络传输协议,用于在不安全的网络中进行安全的远程登录。
生成密钥:ssh-keygen -t rsa -b 4096 -C "ryou"
.pub:公钥,由本人公开,用于加密和验证签名,是给别人用的。当该用户发送文件时,用私钥签名,别人用他给的公钥解密,可以保证该信息是由他发送的。即数字签名。
git
git init:初始化一个git仓库
git clone --depth 1 xxx.git:克隆一个仓库,只下载最近一次提交
git status:查看仓库状态,确认有无没有track的子模块
git submodules add xxx.git:添加子模块
git submodules update --init --recursive:更新子模块
git config --global user.name "ryou":设置用户名
git config --global user.email "xxx@xxx.xxx":设置邮箱
git checkout -b xxx:创建分支
文件后缀
.d:汇编文件
.o:目标文件,编译生成的文件
.a:静态库文件,存放多个目标文件的集合
.so:动态库文件,运行时链接库
.dll:动态链接库,运行时链接库
.text:代码段,存放指令
.data:数据段,存放初始化的全局变量和静态变量
.bss:未初始化的全局变量和静态变量
.symtab:符号表,存放符号和符号的相关信息
.rel.text:重定位表,存放重定位信息
.rodata:只读数据段,存放只读数据
.elf: 可执行文件,包含了代码段、数据段、符号表、重定位表等
.bin:二进制文件,可以直接执行
gdb
退出:quit、ctrl+d
命令行 (mainly gcc)
objdump -d xxx.o:反汇编
objdump -d xxx.o > xxx.d:不打印直接写入文件
gdb xxx:调试程序
汇编:gcc -S test.cpp
-Og:优化等级,-O1最快,-O3最慢,-Os最小化代码大小
-o xxx:指定输出文件名
-lstdc++:链接c++标准库,-lxxx:链接xxx库,(g++会自动链接标准库)
-I.xxx:在当前目录查找任何include文件
-WL,--wrap,xxx:重命名函数,使得程序可以调用到原来的函数
-Wall:显示所有警告信息
gcc -o test test.c -lm:链接math.h库
gcc -o test test.c -I/usr/include/xxx:指定头文件目录
gcc -o test test.c -L/usr/lib/xxx:指定库文件目录
gcc -o test test.c -Wl,-rpath=/usr/lib/xxx:指定运行时链接目录
gcc -o test test.c -static:静态链接
gcc -o test test.c -shared:动态链接
全栈工具&历史
npm:node package manager,和node.js捆绑在一起的包管理器,(可不是普通的插件)
yarn:Facebook推出的包管理器,速度快,安全性高
commonJS:javaScript的模块化规范,nodeJs成熟的模块化就是在此基础上实现的
JS的发展:随着Ajxa的出现,JS开始爆火,但是出现了全局变量污染的严重问题
commonJS的出现不仅解决了全局变量污染、数据保护,还解决了模块之间依赖关系的维护
Jquery:一个轻量级的js库,可以简化DOM操作,提高开发效率
ES6:ECMAScript 6,是JavaScript的最新版本,引入了let、const、class、模板字符串、箭头函数、Promise等新特性
Babel:一个JavaScript编译器,可以将ES6代码编译成ES5代码,使得浏览器可以识别
Webpack:一个模块打包器,可以将模块按照依赖关系进行静态分析,然后将这些模块打包成一个文件
typescript:微软推出的JavaScript超集,可以编译成纯JavaScript,增加了类型系统,提高了代码的可维护性,type = 类型
简单来说:typescript(.ts)是增加类型检测的JavaScript
Hasura with GraphQL:一个开源的GraphQL API服务,可以快速搭建GraphQL API服务:
GraphQL:一种相比较于古老的SQL更为直观的查询语言,其表示对象的结构类似于json
React:源于Facebook内部项目,用于快速构建用户界面的JS库
docker:基于go语言的云开源项目,主要是bulid、ship、run,通过src、环境、第三方依赖等打包成一个可运行的镜像,然后在任何地方依据镜像生成容器,之后就可以运行了
作用:避免提供源码但环境不同配置不同等兼容问题,轻松实现跨平台跨服务器的运行,简化了从开发、调试到生成的迁移问题
Linux
usr: Unix System Resource,系统资源,包含命令、工具、库、文档等
/bin: 系统命令,如ls、cat、mkdir等
/usr/bin: 二进制文件主要储存位置,大部分用户程序
/usr/local/bin: 本地命令, 由管理员安装的可执行文件
/sbin:
/lib:
usr/lib:
/etc: 系统配置文件, 从网络到身份验证服务
/home: 用户目录,每个用户都有一个自己的目录
/root: 管理员专属的目录
/var: 系统变量,如日志、缓存、打印机等
/run:运行时变量,系统启动后生成
/proc、/sys:虚拟文件系统,提供完整的系统可观察性,/proc提供系统内核信息,/sys提供系统硬件信息
编程思想
面向对象:Object-Oriented Programming,OOP,是一种编程范式,是一种抽象程度很高的编程方法,将对象作为程序的基本单元,通过封装、继承、多态等特性来实现代码的重用、灵活性和可扩展性。
KISS原则:Keep It Simple and Stupid,简单即是美德,KISS原则是指在设计软件时,应当尽量保持简单,而不追求过度的复杂性。
LIFO原则:Last In First Out,后进先出,是一种数据结构原则,它规定了数据容器中元素的顺序,先进入容器的元素,最后一个被删除。
文本流原则:Text Stream,文本流原则是指程序的输入输出都是以字符流的形式进行的,程序不直接操作磁盘文件,而是通过标准输入、输出、错误流进行输入输出。
开发
项目经理和产品经理:产品经理负责产品的需求分析、设计、规划、开发、测试、发布等工作,项目经理则负责项目的管理、协调、分配、监督等工作。
UI设计师:界面效果图
架构师:整体架构设计,技术选型
开发工程师:代码实现
测试工程师:编写测试用例,输出测试报告
运维工程师:软件环境搭建、项目上线
拓扑
拓扑: topology,意思是"形态、结构",拓扑学是研究拓扑结构的学科,是数学的一个分支。
拓扑排序:Topological Sorting,是一种对有向图进行排序的方法,其目的是将图中所有的顶点排成一个线性序列,使得图中任意两个顶点之间都存在一条有向边。
连分数
最简连分数:圆周率、欧拉常数、根号2、
最简连分数表示:a=[a0;a1,a2,a3...]