不积跬步无以至千里


  • Home

  • Tags

  • Archives

矩阵的几何意义

Posted on 2019-02-19

变换transform

变换指的是,把一些数据,如点方向矢量颜色等通过一定方式进行转换的过程。

线性变换

保留矢量加和标量乘的变换,满足$f(x)+f(y)=f(x+y)$ 和 $kf(x)=f(kx)​$

#####缩放

旋转
错切
镜像
正交投影

平移变换

平移变换不满足线性变换

仿射变换

3x3矩阵不能表示平移操作,所以扩展到了4x4矩阵,成为齐次坐标空间homogeneous space,当使用4x4矩阵对一个点进行变换时,平移,缩放,旋转都会施加于该点,但如果对于一个方向矢量,平移的效果就会被忽略。

齐次坐标

齐次坐标 是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易于进行仿射(线性)几何变换。

  • 普通坐标到齐次坐标
    如果是一个点(1,4,7),则变为(1,4,7,1)
    如果是一个向量(x,y,z),则变为(x, y, z, 0)

  • 齐次坐标转换成普通坐标时

    如果是(x,y,z,1),则知道它是个点,变成(x,y,z)
    如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

  • 对于一个普通坐标的点P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。因此,如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量

    由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

  • 在unity中 可用在剪裁空间中 使得w有特殊含义

  • 齐次坐标使得平移变换可以用矩阵进行,正如fshill jr所说的仿射变换更加方便

坐标空间

模型空间
世界空间
观察空间

是摄像机空间,以摄像机为原点属于右手坐标系,+x指向右边+y指向上方+z指向摄像机的后方即unity世界坐标系的-z方向,这符合openGL

剪裁空间

clip space 也被称为齐次剪裁空间,用于变换的矩阵叫做剪裁矩阵clip matrix 或者投影矩阵projection matrix
视椎体是空间的一个区域有六个剪裁平面组成,分透视投影和正交投影
近剪裁平面和远剪裁平面
透视投影的视椎体是一个金字塔形,侧面的4个剪裁平面将会在摄像机处相交
正交投影的视椎体是一个长方体
如果直接使用视椎体定义的空间进行剪裁,那么不同的视椎体需要不同的处理过程,而且对于透视投影的视椎体来说,想要判断一个顶点是否处在一个金字塔内部是比较麻烦的。因此需要用一种更加通用的、方便的、和整洁的方式进行裁剪工作,这种方式就是通过一投影矩阵把顶点转换到一个裁剪空间中。
投影矩阵有两个目的:

  • 为投影做准备。经过投影矩阵的变换后,顶点的w分量将会具有特殊的意义

  • 对xyz分量进行缩放。经过投影矩阵的缩放后,我们可以直接使用w分量作为一个范围值,如果xyz都在这个范围内就说明这个顶点在剪裁空间中。点的w分量是1,矢量的w是0

    推导起来比较麻烦但是推导出来的投影矩阵的第四个w分量将有更加丰富的含义-w<x<w -w<y<w -w<z<w

屏幕空间

屏幕空间是一个二维空间,那么怎么把顶点从剪裁空间投影到屏幕空间中,来生成对应的2D坐标呢:

  • 需要进行标准齐次除法(homogeneous division)

    齐次除法也叫透视除法,是用齐次坐标系的w分量去除x,y,z分量。在openGL中得到的坐标叫做归一化的设备坐标normalized device coordinates(NDC),经过这一步可以将顶点坐标从齐次裁剪坐标空间转换到NDC中。经过透视投影变换后的裁剪空间,经过齐次除法后会变换到一个立方体内。每个分量范围都是[-1,1]

  • 屏幕映射

    可以根据变换后的x和y坐标来映射输出窗口的对应像素坐标。z分量用于深度缓冲

    总结:从剪裁空间到屏幕空间,首先进行齐次除法 把裁剪空间的坐标投影到 标准归一化设备坐标系中NDC,然后再映射到屏幕空间中 xy分量映射到屏幕的像素,z分量用于深度缓冲。

    ​ 顶点从模型空间转换到屏幕空间的过程

1
2
3
4
5
graph LR
A[模型空间]-->|模型变换|B[世界空间]
B-->|观察变换|C[观察空间]
C-->|投影矩阵|D[裁剪空间]
D-->|齐次除法和屏幕映射|E[屏幕空间]

unity shader 线性代数

Posted on 2019-02-18
坐标系

模型空间和世界空间使用的坐标系:左手坐标系。 右侧right 上侧up 前侧forward分别对应了x y z轴正方向。
观察空间里的坐标系:是右手坐标系。以摄像机为原点坐标系,摄像机前向是z轴负方向,与模型空间正好相反。

点

点是n纬空间的一个位置,没有大小没有宽度
$$
P = (P_x, P_y) \sqrt(56) \vec{a}\sum{a}\prod{x}\prod_{n=1}^{99}{x_n}\sin{x}
$$

矢量Vector也叫向量
标量
模
方向

标量只有模没有方向,向量既有模又有方向
点是没有大小的一个位置,矢量是一个有模和方向的但没有位置的的量。
矢量描述的是位置偏移

矢量的模

$$
|v| = \sqrt(v_x^2+v_y^2+v_z^2)
$$

$$
|(1,2,3)| = \sqrt(1^2 + 2^2 + 3^2)=\sqrt(1+4+9)=\sqrt(14)
$$

#####单位矢量

指的是模为1的矢量,也叫被归一化的矢量normalized vector,归一化过程normalization
$\vec(v)=v/|v|$,v是非零矢量

矢量的点积

点积描述的是两个矢量的方向是否一致,$a·b=(a_x, a_y, a_z) · (b_x, b_y, b_z))=a_xb_x+a_yb_y+a_zb_z$
两个矢量的点积等于他们之间夹角的余弦值$\theta=arcos(\vec(a), \vec(b))$
夹角小于90度方向一致,夹角等于90度方向垂直,夹角大于90度方向相反

#####矢量的叉乘,外积

$a \times b=(a_x, a_y, a_z)\times(b_x, b_y, b_z) = (a_yb_z-a_zb_y, a_xb_z-a_zb_x, a_xb_y-a_yb_x)$

$|a \times b| = |a||b|sin\theta$

几何意义:计算垂直于一个平面、三角形的矢量,可用于判断三角面的朝向

矩阵

$$
M = \begin{bmatrix}
m_{11} & m_{12} & m_{13}\
m_{21} & m_{22} & m_{23}\
m_{31} & m_{32} & m_{33}
\end{bmatrix} \tag{4}
$$

M_{ij}表示这个元素在矩阵M的第i行,第j列

行矩阵

只有一行的矩阵 $ \begin{bmatrix} 1 & 2 & 3 \end{bmatrix}​$

列矩阵

只有一列的矩阵 $ \begin{Bmatrix} 1 \ 2 \ 3 \end{Bmatrix}$

方块矩阵

行数和列数相等的矩阵

对角矩阵

如果一个矩阵除了对角元素崴的所有元素都为0,那么这个矩阵就叫做对角矩阵

单位矩阵

任何矩阵和它相乘的结果还是原来的矩阵 $MI=IM=M​$, 那么这个矩阵就是单位矩阵跟标量中的1一个意思

转置矩阵

原来矩阵的第i行变成新矩阵的第i列,而第j列变成新矩阵的第j行$M_{ij}^T = M_{ji}​$

  • 矩阵转置的转置等于原矩阵 $(M^T)^T=M$

  • 矩阵串接的转置等于反向串接各个矩阵的转置$(AB)^T=B^TA^T$

逆矩阵

如果一个方阵M,它的逆矩阵$M^{-1}$ 来表示,如果$MM^{-1}= M^{-1}M=I$
则说明这个矩阵是可逆的(invertible)是非奇异的(nonsingular),如果一个矩阵没有对应的逆矩阵,则说明他是不可逆的(noninvertible)或者是奇异的singular
如何判断一个矩阵是否是可逆的呢?简单的来说就是一个矩阵的行列式(determinant)不为0
特性:

  • 逆矩阵的逆矩阵是原矩阵本身

  • 单位矩阵的逆矩阵是它本身

  • 转置矩阵的逆矩阵是逆矩阵的转置${(M^T)}^{-1}=(M^{-1})^T)$

  • 矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵$(AB)^{-1}=B^{-1}A^{-1}$

几何意义是允许变换的反向变换

正交矩阵

如果一个方阵M和它的转置矩阵$M^T$相乘的乘积为单位矩阵的话,那么说明这个矩阵是正交的(orthogonal)
$$
MM^T=M^TM=I
$$
如果一个矩阵是正交的那么它的转置矩阵和逆矩阵是一样的也就是 $M^T=M^{-1}$

几何意义:在进行反向变换时候需要逆矩阵,而逆矩阵非常难求,所以如果是正交矩阵的话那么他的逆矩阵求解就非常简单了就是他的转置矩阵。

如何判断是否有正交矩阵呢:

  • 矩阵的每一行是单位矢量,因为只有单位矢量与自己的点积才是1
  • 矩阵的每一行c1 c2 c3互相垂直,因为只有这样他们之间互相点积才等于0

Unity Shader基础

Posted on 2019-02-18
Shader和材质

Shader必须赋值给材质球Material才能达到效果,材质球比如有shader才能显示出效果。
Unity可以创建的Shader有四种:

  1. Standard Surface Shader
    包含标准光照模型的表面着色器模板

  2. Unlit Shader
    不包含光照但包含雾效的基本的顶点片元着色器

  3. Image Effect Shader
    实现各种屏幕后处理效果的一个基本模板

  4. Compute Shader
    利用GPU的并行性来进行一些与常规渲染流水线无关的计算

ShaderLab语言

UnityShader都是使用ShaderLab来编写的,其语法Syntax如下:

  1. shader名称
    Shader “Custom/Myshader”

  2. SubShader
    至少包含一个SubShader
    有可选标签[Tags]和状态[RenderSetup]和通道Pass,Pass定义了一次完整的渲染流程,如果 pass数量多渲染性能下降

    • 渲染状态
      用于设置显卡的各种状态比如是否开启混合、深度测试,是否开启混合模式,是否开启深度写入
| 状态名称 | 设置指令                                                     | 解释                               |
| -------- | ------------------------------------------------------------ | ---------------------------------- |
| Cull     | Cull Back \| Front \|Off                                     | 设置剔除模式:剔除背面,正面,关闭 |
| ZTest    | ZTest Less Greater \| LEqual \| GEqual \| NotEqual \| Always | 设置深度测试时使用的函数           |
| ZWrite   | ZWrite On \| Off                                             | 开启/关闭深度写入                  |
| Blend    | Blend SrcFactor DstFactor                                    | 开启并设置混合模式                 |
  • 标签
    标签就是一些键值对(Key/Value Pair)是字符串类型,这是SubShader和渲染引擎之间的沟通桥梁,它用来告诉unity的渲染引擎希望怎样和何时来渲染这个对象。格式是Tags { “TagName1” = “Value1” “TagName2” = “Value2”}
| 标签类型             | 说明                                                         | 例子                                  |
| -------------------- | ------------------------------------------------------------ | ------------------------------------- |
| Queue                | 控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,也可以自定义渲染队列来控制渲染顺序.Backgroud1000 Geometry2000 AlphaTest 2450Transparent3000 Overlay | Tags { “Queue” = “Transparent”}       |
| RenderType           | 对着色器进行分类,例如这是一个不透明的着色器或者是一个透明着色器,可以用于着色器替换功能 | Tags{“RenderType” = “Opaque”}         |
| DisableBatching      | 指明是否对SubShader使用Unity的批处理功能                     | Tags{“DisableBatching” = “True”}      |
| ForceNoShadowCasting | 控制使用该SubShader的物体是否会投射阴影                      | Tags{“ForceNoShadowCasting” = “True”} |
| IgnoreProjector      | 使用该SubShader的物体将不会受Projector的影响,常用于半透明物体 | Tags{“IgnoreProjector” = “True”}      |
| CanUseSpriteAtlas    | 当SubShader用于精灵sprites时,将该标签设为False              | Tags{“CanUseSpriteAtlas” = “False”}   |
| PreviewType          | 指明材质面板将如何预览该材质,默认情况是下个材质球,可以通过把该标签设置为“Plane”,“SkyBox”来改变预览类型 | Tags{“PreviewType” = “Plane”}         |
  1. Pass

    • Pass标签类型
标签类型 说明 用法
LightMode 定义该通道在Unity的渲染流水线中的角色 Tags{“LightMode”=“ForwardBase”}
RequireOptions 用于指定当满足某些条件时才渲染该Pass,他的值是有空格分隔的字符串 Tags{“RequireOptions”=“SoftVegetation”}
其他 UsePass复用其他Pass GrabPass抓取屏幕并将结果存储在一张纹理中
  • pass语义块
    Pass{

    ​ Name “MyPass”

    ​ Tags{“LightMode”=“ForwardBase”}
    ​ UsePass “MyShader/SomePass”

    ​ }

  1. Fallback
    Fallback “name” Fallback Off 使用更低级的shader吧
  1. PropertyType属性类型和properties属性
属性类型 默认值的语法定义 例子
Int number _Int(“Int”, Int) = 2
Float number _Float(“Float”, Float) = 1.5
Range(min, max) number _Range(“Range”, Range(0.0, 5.0)) = 4.0
Color (number, number, number, number) _Color(“Color”, Color) = (1,1,1,1)
Vector (number, number, number, number) _Vector(“Vector”, Vector) = (1,2,3,1)
2D “defaulttexture” {} _2D(“2D”, 2D) = “ ” {}
Cube “defaulttexture” {} _Cube(“Cube”, Cube) = “white” {}
3D “defaulttexture” {} _3D(“3D”, 3D) = “black” {}

linux守护进程

Posted on 2019-02-13
介绍

“守护进程”(daemon)就是一类在后台运行的特殊进程,用于执行特定的系统任务,很多守护进程在系统引导时候启动并一直运行到系统关闭,也有一些在需要时候启动,完成任务后自动结束。

问题

一个简单的node server.js 一旦退出命令行窗口,这个应用就一起退出,无法访问了。那么如何才能让他一直运行呢?有以下办法:

办法一 &

$ node server.js &
只要在命令的尾部加上符号&,启动的进程就会成为”后台任务”。

办法二 sighup信号 disown

todo

办法三 nohup命令

nohup node server.js $

nodup命令做了三件事:
1.阻止sighup信号发到这个进程
2.关闭标准输入
3.重定向标准输出和标准错误到文件nohup.out

办法四 screen命令和tmux命令

终端复用器 terminal multiplexer :在同一个终端里,管理多个session典型的就是screen和tmux

screen用法

1
2
3
4
5
6
7
8
9
10
11
12
#新建一个session
$ screen
$ node server.js

$ screen -S name

# 切回指定 session
$ screen -r name
$ screen -r pid_number

# 列出所有 session
$ screen -ls

tmux用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 #Debian系和Ubuntu:
sudo apt install tmux
#Redhat系包括CentOS
yum install -y tmux
#在macOS上安装Tmux
brew install tmux
#启动新session:
$ tmux [new -s 会话名 -n 窗口名]

#恢复session:
$ tmux at [-t 会话名]

#列出所有sessions:
$ tmux ls

#重新命名会话sessions:
$ tmux rename -t oldName newName

#关闭session:
$ tmux kill-session -t 会话名

#关闭整个tmux服务器:
$ tmux kill-server
办法五 Node工具

针对node有一些专门的启动工具::forever,nodemon 和 pm2。
forever 保证进程退出时,应用会自动重启。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 作为前台任务启动
$ forever server.js

# 作为服务进程启动
$ forever start app.js

# 停止服务进程
$ forever stop Id

# 重启服务进程
$ forever restart Id

# 监视当前目录的文件变动,一有变动就重启
$ forever -w server.js

# -m 参数指定最多重启次数
$ forever -m 5 server.js

# 列出所有进程
$ forever list

nodemon一般只在开发时使用,它最大的长处在于 watch 功能,一旦文件发生变化,就自动重启进程。

1
2
3
4
5
6
> # 默认监视当前目录的文件变化
> $ nodemon server.js
>
> # 监视指定文件的变化
> $ nodemon --watch app --watch libs server.js
>

pm2 的功能最强大,除了重启进程以外,还能实时收集日志和监控。

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
> # 启动应用
> $ pm2 start app.js
>
> # 指定同时起多少个进程(由CPU核心数决定),组成一个集群
> $ pm2 start app.js -i max
>
> # 列出所有任务
> $ pm2 list
>
> # 停止指定任务
> $ pm2 stop 0
>
> # 重启指定任务
> $ pm2 restart 0
>
> # 删除指定任务
> $ pm2 delete 0
>
> # 保存当前的所有任务,以后可以恢复
> $ pm2 save
>
> # 列出每个进程的统计数据
> $ pm2 monit
>
> # 查看所有日志
> $ pm2 logs
>
> # 导出数据
> $ pm2 dump
>
> # 重启所有进程
> $ pm2 kill
> $ pm2 resurect
>
> # 启动web界面 http://localhost:9615
> $ pm2 web
>
办法六 Systemd

为系统的启动和管理提供一套完整的解决方案,d就是守护daemon的意思,它守护整个系统,替代initd
优点是功能强大 缺点是体系庞大太复杂。

systemctl是主命令,用于管理系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

systemd-analyze命令用于查看启动耗时

1
2
3
4
5
6
7
8
9
10
11
# 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl命令用于查看当前主机的信息。

1
2
3
4
5
# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

unit管理

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
# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
参考网站

Tmux入门介绍
Linux 守护进程的启动方法
Systemd命令

hexo命令备忘

Posted on 2019-02-13

参考文档

官方网站
中文官方网站

常用命令

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
#Commands:
hexo server Start the server.
hexo clean Remove generated files and cache.
hexo config Get or set configurations.
hexo deploy Deploy your website.
hexo generate Generate static files.
hexo help Get help on a command.
hexo init Create a new Hexo folder.
hexo list List the information of the site
hexo migrate Migrate your site from other system to Hexo.
hexo new Create a new post.
hexo publish Moves a draft post from _drafts to _posts folder.
hexo render Render files with renderer plugins.
hexo version Display version information.
#Options
--config Specify config file instead of using _config.yml
--cwd Specify the CWD
--debug Display all verbose messages in the terminal
--draft Display draft posts
--safe Disable all plugins and scripts
--silent Hide output on console
#其他一些简写
hexo d -g
hexo g -d
hexo s

渲染流水线

Posted on 2019-02-11

阶段

  • 应用阶段

    1. 由cpu实现,准备好场景数据,摄像机位置,视椎体,场景模型,光源
    2. 粒度剔除将不可见物体剔除
    3. 设置渲染状态 材质 纹理 使用的shader
    4. 输出渲染图元(点线三角面等)
  • 几何阶段

    1. GPU完成
    2. 顶点着色器
    3. 和每个渲染图元打交道,逐顶点,逐多边形操作,把顶点坐标变换到屏幕空间中,再交给光栅器处理
    4. 输出屏幕空间的二维顶点坐标,每个顶点的深度值,着色信息等
  • 光栅化阶段

    1. 产生屏幕像素,渲染最终结果GPU上运行 决定哪些像素应该被绘制在屏幕上
    2. 需要对上一阶段得到的逐顶点数据纹理坐标颜色等进行插值然后再进行逐像素处理
    3. 三角形设置 三角形遍历 片元着色器
顶点着色器
片元着色器

输入:上一个阶段对顶点信息插值得到的结果
输出:一个或多个颜色值
根据顶点信息通过某些技术比如纹理采样等生成片元信息颜色值等

三角形设置

计算光栅化网格所需要的信息,通过顶点得到整个三角形对像素的覆盖情况,计算一个三角网格表示数据的过程是三角形设置

三角形遍历

判断三角网格覆盖了哪些像素,对应像素生成一个片元,片元状态(屏幕坐标,深度信息,顶点信息如法线纹理坐标等)是对3个顶点信息进行插值得到的。

逐片元操作

通过了所有测试后,新生成的片元才能和颜色缓冲区中已经存在的像素颜色进行混合,最后再写入到颜色缓冲区

1
2
3
4
5
graph LR
A[片元]-->B{模板测试}
B-->|测试通过|C{深度测试}
C-->|测试通过|D[混合]
D-->E[颜色缓冲区]

流程图

15万以内纯电动车比较

Posted on 2019-01-16

suv性质

车型 续航 轴距 价钱 情况
帝豪GSE 353 2700 13.58 续航低
北汽ex360 200 2519 9 续航低 车小
比亚迪元 300 2535 9.39 续航低 无车
瑞虎3xe 401 2555 9 碰头内饰差
荣威ei5 420 2670 13.88 后排不能抬头

typora用法

Posted on 2019-01-16

一修饰

1.加粗

这是一条神奇的粗线

2.斜体

3.下划线

4.删除线

删除这个记录

5.分割线




二版式

1大纲级别

一共有6级分别用######

2区块

这是个区块

里面还有一个区块

还有一个区块

3目录

[TOC]

三代码块

1
2
3
4
5
6
```
```
```
```
```
```

四列表

1.无序列表

  • libiao1
  • 列表2

1.1多级无序

  • 列表3
    • 鞋标
      • 列表
  • adsfasf

1.2任务列表

  • adfasdfad
  • 这里有个任务

2.有序列表

  1. 列表1
  2. 列表2
  3. 列表4
  4. 列表5

3.表格

车型 续航 轴距 价钱 情况
帝豪GSE 353 2700 13.58 续航低
北汽ex360 200 2519 9 续航低 车小
比亚迪元 300 2535 9.39 续航低 无车
瑞虎3xe 401 2555 9 碰头内饰差
荣威ei5 420 2670 13.88 后排不能抬头

五 链接

1.插入图片

搞笑图片

2.插入超链接

百度

流程图

1
2
3
4
5
6
7
graph LR
A[方型]-->B(圆形)
B-->C{条件a}
C-->|a=1| D[结果1]
C-->|b=1| E{asdf}
D-->E
F[横向流程图]

标准流程图

how to fix blog with github and hexo

Posted on 2018-06-14

##利用hexo如何搭建blog
参考网站http://blog.51cto.com/sihai/2070984

尴尬
各种网站
各种回味

这是一个图片

html5

Posted on 2018-06-01

###简介

在html5平台上,视频,音频,图像,动画以及同电脑的交互都被标准化。新特性:

  • 绘画增加了canvas元素
  • 用于媒介回放的video和audio元素
  • 对本地离线存储的更好的支持
  • 新的特殊元素,比如
    afafaf
    视频

##div division section 一片

<!DOCTYPE html>











your browser does not support html5 vidoe.






##拖放

<!DOCTYPE HTML>








请把 W3School 的图片拖放到矩形中:









123

Jiaq

21 posts
4 categories
16 tags
© 2019 Jiaq
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4