1.go-iptables功能与源码详解
2.2021 开源驾驶仿真平台测评
3.华为自研编程语言“仓颉”火上热搜,狗头狗英文编程还香吗?
4.UE4-Slate源码学习(一)slate初探
go-iptables功能与源码详解
介绍iptables之前我们先搬出他的系统父亲netfilter,netfilter是源码基于 Linux 2.4.x或更新的内核,提供了一系列报文处理的代码能力(过滤+改包+连接跟踪),具体来讲可以包含以下几个功能:
其实说白了,狗头狗netfilter就是系统最佳控制仿真源码操作系统实现了网络防火墙的能力(连接跟踪+过滤+改包),而iptables就是源码用户态操作内核中防火墙能力的命令行工具,位于用户空间。代码快问快答,狗头狗为啥计算机系统需要内核态和用户态(狗头)。系统
既然netfilter是源码对报文进行处理,那么我们就应该先了解一下内核是代码如何进行收发包的,发生报文大致流程如下:
netfilter框架就是狗头狗作用于网络层中,在一些关键的系统报文收发处理路径上,加一些hook点,源码可以认为是一个个检查点,有的在主机外报文进入的位置(PREROUTING ),有的在经过路由发觉要进入本机用户态处理之前(INPUT ),有的在用户态处理完成后发出的地方(OUTPUT ),有的在报文经过路由并且发觉不是本机决定转发走的位置(FOWARD ),有的在路由转发之后出口的位置(POSTROUTING ),每个检查点有不同的规则集合,这些规则会有一定的优先级顺序,如果报文达到匹配条件(五元组之类的)且优先级最高的规则(序号越小优先级越高),内核会执行规则对应的动作,比如说拒绝,放行,记录日志,丢弃。
最后总结如下图所示,里面包含了netfilter框架中,报文在网络层先后经过的一些hook点:
报文转发视角:
iptables命令行工具管理视角:
规则种类:
流入本机路径:
经过本机路径:
流出本机路径:
由上一章节我们已经知道了iptables是用户态的命令行工具,目的就是为了方便我们在各个检查点增删改查不同种类的规则,命令的格式大致如下,简单理解就是针对具体的哪些流(五元组+某些特定协议还会有更细分的匹配条件,比如说只针对tcp syn报文)进行怎样的动作(端口ip转换或者阻拦放行):
2.1 最基本的增删改查
增删改查的命令,我们以最常用的filter规则为例,就是最基本的防火墙过滤功能,实验环境我先准备了一个centos7的docker跑起来(docker好啊,实验完了直接删掉,不伤害本机),并通过iptables配置一些命令,然后通过主机向该docker发生ping包,测试增删改查的filter规则是否生效。
1.查询
如果有规则会把他的序号显示出来,后面插入或者删除可以用 iptables -nvL -t filter --line
可以看出filter规则可以挂载在INPUT,FORWARD,OUTPUT检查点上,并且兜底的规则都是ACCEPT,也就是没有匹配到其他规则就全部放行,这个兜底规则是可以修改的。 我们通过ifconfig查看出docker的ip,然后主机去ping一波:
然后再去查一下,税控软件源码会发现 packets, bytes ---> 对应规则匹配到的报文的个数/字节数:
2. 新增+删除 新增一条拒绝的报文,我们直接把docker0网关ip给禁了,这样就无法通过主机ping通docker容器了(如果有疑问,下面有解答,会涉及docker的一些小姿势): iptables -I INPUT -s ..0.1 -j DROP (-I不指定序号的话就是头插) iptables -t filter -D INPUT 1
可见已经生效了,拦截了ping包,随后我删除了这条规则,又能够ping通了
3. 修改 通过-R可以进行规则修改,但能修改的部分比较少,只能改action,所以我的建议是先通过编号删除规则,再在原编号位置添加一条规则。
4. 持久化 当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。
再使用service iptables save命令保存iptables规则
5. 自定义链 我们可以创建自己的规则集,这样统一管理会非常方便,比如说,我现在要创建一系列的web服务相关的规则集,但我查询一波INPUT链一看,妈哎,条规则,这条规则有针对mail服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,我这看一遍下来头都大了,所以就产生了一个非常合理的需求,就是我能不能创建自己的规则集,然后让这些检查点引用,答案是可以的: iptables -t filter -N MY_WEB
iptables -t filter -I INPUT -p tcp --dport -j MY_WEB
这就相当于tcp目的端口的报文会被送入到MY_WEB规则集中进行匹配了,后面有陆续新规则进行增删时,完全可以只针对MY_WEB进行维护。 还有不少命令,详见这位大佬的总结:
回过头来,讲一个关于docker的小知识点,就是容器和如何通过主机通讯的?
这就是veth-pair技术,一端连接彼此,一端连接协议栈,evth—pair 充当一个桥梁,连接各种虚拟网络设备的。
我们在容器内和主机敲一下ifconfig:
看到了吧,容器内的eth0和主机的vetha9就是成对出现的,然后各个主机的虚拟网卡通过docker0互联,也实现了容器间的通信,大致如下:
我们抓个包看一哈:
可以看出都是通过docker0网关转发的:
最后引用一波 朱老板总结的常用套路,作为本章结尾:
1、上升通道下跌源码规则的顺序非常重要。
如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。
2、当规则中有多个匹配条件时,条件之间默认存在“与”的关系。
如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。
3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。
4、当IPTABLES所在主机作为网络防火墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。
5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
3. go-iptables安装
go-iptables是组件库,直接一波import " github.com/coreos/go-ip...",然后go mod tidy一番,就准备兴致冲冲的跑一波自带的测试用例集,没想到上来就是4个error:
这还了得,我直接去go-iptables的仓库issue上瞅瞅有没有同道中人,果然发现一个类似问题:
虽然都是test failures,但是错的原因是不一样的,但是看他的版本是1.8的,所以我怀疑是我的iptables的版本太老了,一个iptables -v看一眼:
直接用yum update好像不能升级,yum search也没看到最新版本,看来只能下载iptables源码自己编译了,一套连招先打出来:
不出意外的话,那就得出点意外了:
那就继续下载源码安装吧,然后发现libmnl 又依赖libnftnl ,所以直接一波大招,netfilter全家桶全安装:
Finally,买线指标源码再跑一次测试用例就成功了,下面就可以愉快的阅读源码了:
4. 如何使用go-iptables
5. go-iptables源码分析
关键结构体IPTables
初始化函数func New(opts ...option) (*IPTables, error) ,流程如下:
几个重要函数的实现:
其他好像也米有什么,这里面就主要介绍一下,他的命令行执行是怎么实现的:
6. Reference
开源驾驶仿真平台测评
终于,在沉迷论文之外,我开始上手生疏了快一年的实验和代码。一个萌新,空降驾驶决策方向,除了真车以外,最大的吸引力必然来自驾驶仿真器了。想想吧,每天的工作仿佛像是在给GTA V写合法外挂,心不心动?因此,尽管学长们安利了CARLA,但是,既然电脑装得下,我还是决定要把近几年新出的仿真器全试一试,再决定用最好的那个。
作为一个贫穷的研究人员,我心目中理想的驾驶仿真器是这样的(优先度排列):
描绘出理想的模样,就该开始找候选人了。《年自动驾驶仿真蓝皮书》基本把现有的驾驶仿真器都列举了一遍,经过快速的检查,首先排除以下商业仿真平台:
CarSim, CarMaker, Cognata, rFpro, VTD, AAI, TAD Sim (腾讯,未找到开放网址), Metamotor (年被收购), GaiA, Sim-One, PanoSim, Parallel Domain (这个的demo是真的好看), CarCraft (Waymo内部使用,不对外开放), VI-WorldSim, PTV Vissim
许愿一个大佬测评以上软件,如果大家众筹让我测评也不是不可以(手动狗头)。
顺带一体,所有基于GTA V的仿真器似乎在几年前已经被R星叫停了,考虑到版权因素,应该在有发表需求的研究里是不能用了(但私底下谁不想拿它玩一玩呢)。
在剔除了海量精美的付费软件之后,清单上剩余的免费/开源仿真器就屈指可数了。
接下来,将从应用场景,用户体验,安装难易度等方面对这些软件进行测评,部分仿真器提供视频展示(流量预警)
测试环境:Ubuntu . + CUDA .2 + NVIDIA Driver ..
硬件配置:i9-X CPU + GB RAM + RTX Super GPU (8GB)
警告 CARLA
仿真器简介:Carla是一个开源的驾驶仿真器,由C++ 和虚幻引擎构成。通常适用于驾驶决策仿真任务。可输出的数据模态包括图像,激光雷达,雷达,语义,GPS,IMU等,可自由配置。
安装指南: CARLA Simulator
Carla官方的安装文档已经非常成熟了,如果只是运行仿真器,下载可运行程序就够了。想自己折腾的反射大师查看源码就从源码开始编译,我写文章的时候0.9.还不够稳定,推荐0.9.,无脑跟教程走只会遇到一个bug。就是make build的时候libboost目前调用的是1..0版本:
首先,你需要手动下载boost-1..0的压缩包;其次,如果你在编译过程中遇到了什么字符相关的库找不到的报错,可能是因为boost-1..0某些版本中这个悲伤的bug导致的,就是自定义的函数命名和默认C语言库起了冲突(大致是这个原理,具体细节还请放过一个三年没写C的孩子)。处理方法要参考 这里,解压boost-1..0,将自定义的string.h 和调用这个库的所有地方改成其他名字,然后再打包,扔到/Build 下面;最后,记得在/Util/BuildTools/setup.sh 的对应行进行修改,以防build过程中自动删了你改过的包。
如果是走Linux Build路线又想要可直接运行的./CarlaUE4.sh,在make launch成功后跑一下make package就行了。这一个细节不知道为什么官方文档上写得不是特别清楚,可能是他们觉得太简单,我们可以自行领悟吧。
用户体验:
在体验完一圈驾驶仿真器之后,看到CARLA我真是感动得泪流满面,简直是出走后四处碰壁的游子回到了温暖的家。经典果然还是经典,CARLA的动力学仿真确实是所有仿真器中最正常的,天气系统和NPC的行为也非常正常,应该是一直在优化的。基本上驾驶决策常用的数据模态都有提供(事件相机和红外相机没有,这是AirSim的独门绝技),获取也很方便,总之一句话,赞美CARLA。
仿真器展示:
SUMO
仿真器简介:SUMO 全称 Simulation of Urban MObility,是一个开源的驾驶仿真器,主要用于交通流仿真,也可用于车间通讯仿真、验证交通模型等任务。
安装指南:sudo apt-get install sumo sumo-doc sumo-tools
仿真器部分功能展示:
最开始,看到这个软件简陋的界面时,我以为大概没什么好说的,然而,很快,我看到了前人的SUMO使用心得。对不起,是我头抬得太高了。
SUMO仿真文档_妈妈说不要造轮子-CSDN博客
SUMO使用技巧_妈妈说不要造轮子-CSDN博客
由于SUMO的仿真任务和我没有太大关联,而且仿真大程度上依赖于用户自己导入的数据,而我手头暂时没有,所以就放一张从 OpenStreetMap导入到SUMO的地图吧~
看起来很简陋?放大地图后,每个路口的细节都标注得一清二楚。我开始心动了。
而从年开始,CARLA开始支持和SUMMO,VISSIM 联合仿真。我觉得自己好了,自己行了,下一期测评就它吧(如果没有教程的话可以考虑写一版了)。
MATLAB - 自动驾驶工具包 & RoadRunner
码着,过两周有空再写。计划要用RoadRunner和CARLA快乐联动,不过好像地图太大会导入事故,反正卫星先放着。
LGSVL
仿真器简介:这是由LG公司基于Unity开发的驾驶仿真器。适用于驾驶决策任务。输出的数据模态包括图像,激光雷达,雷达,语义,GPS,IMU等,可以通过json文件自由配置。
安装指南: Installation procedure - SVL Simulator
确认配置符合要求之后,直接下载即可。Linux下记得右键性质,允许程序运行。
用户体验:
从可视化交互界面来说,LGSVL是做的最好的。一键变天,一键加传感器,包括上传代码,全部可以在网页界面完成。但是呢,车的动力学着实有点迷惑,您的车是完全没有摩擦力的吗?按下前进键之后,即使松开,地面也仿佛没有摩擦力一般,车辆会一直保持匀速前进。但是如果想用这个仿真器来做模仿学习,录入数据大概会很痛苦。点云的仿真很有问题,肉眼可见的有误差。npc也是非常迷惑,比如,骑自行车的人比开车的还快;过马路的时候只要绿灯了,npc车辆就直接从npc附近碾过去。而目前还没有提供改npc的接口。此外,目前提供的地图还太少了。如果再过几年,可能会成长成一个厉害的仿真平台,目前只能持观望态度了。
Apollo
仿真器简介:由百度-阿波罗开发的驾驶仿真平台。少数既可以在线仿真,也可以自己电脑安装运行的仿真器。适用于驾驶规划仿真,路径预测等任务。
安装流程:
用户体验:
革命尚未成功,同志仍需努力。离成为一款成熟的仿真器,Apollo还有很长时间要走。官方提供的场景比较少,大型地图屈指可数,文档支持也不够完善。封装得比较严实,不过改地图,放npc的自由设置空间还是有的。再过几年,还是有潜力成长成一个优秀的仿真器的。
仿真器展示:
AirSim
仿真器简介:由微软开发的仿真器,基于虚幻引擎。主要面向无人机仿真,也提供了驾驶仿真的接口。适用于驾驶决策仿真任务。输出的数据模态包括GPS,IMU,RGB图像,深度图,语义分割,红外相机,事件相机,点云(需要额外配置)。
安装指南: Welcome to AirSim
用户体验:
这款仿真器更适合Windows系统用户。Github上提供的地图适用于驾驶仿真的寥寥无几,而虽然AirSim可以从 Unreal Engine Market中获取更多可用于自动驾驶的地图,其中绝大多数都只兼容Windows,最终导致在Linux中适用于自动驾驶任务的只有一款非洲大草原。
仿真器展示 启动任意地图都会加载setting.json 文件的配置,子窗口的内容需要按0 才会显示。
SUMMIT
论文: SUMMIT: A Simulator for Urban Driving in Massive Mixed Traffic
适用任务:驾驶决策仿真
输出数据:RGB图像,点云,深度图,语义分割,碰撞判定等,CARLA有的它都有。
安装指南: Ubuntu .安装基于CARLA的SUMMIT无人驾驶仿真平台
不建议在.上安装,可能会因为clang版本出现大问题。Ubuntu ./.挺好的。
用户体验:
在测评开始之前,我期望值最高的一款仿真器就是SUMMIT,按照论文所宣称的,这是“CARLA的改进版“,”能够模拟更为复杂的交通情况“,”利用SUMO轻松导入世界地图“。而实际情况呢?这款软件很大程度上照搬了CARLA 0.9.8,对应了两年前的UE4.,这一前置条件已然导致了虚幻引擎在现有的Ubuntu上闪退概率更高。而在我千辛万苦装上之后,原创的demo程序一个也跑不起来,根据写得奇烂无比的官方文档——我第一次看到民间教程能比官方写得更详细靠谱的,只能模模糊糊猜它的地图导入方法——依旧繁琐复杂。最终,不祥的预感在我查到了论文的发表时间时达到了顶峰,年ICRA accept,大概从投稿之后,作者就没有再积极地维护过整个路径,最新的更新(.)只是改了改依赖的SUMO版本和PythonAPI中的小细节。可以看出,作者根本没有随着引擎更新和CARLA更新进度改进仿真器的动力。对于任何试图长期使用这款仿真器的人来说,这都是一个危险的信号。
Udacity
Term 1 - 车道保持;Term 2 - 轨迹定位 & 追踪;Term 3 - 高速场景下的轨迹规划。
适用任务:驾驶决策任务体验与教学
安装指南:
如果顺利的话,会看到这样的界面,选择分辨率和画质,然后就能开始仿真了。
用户体验:
作为一款和在线课程绑定的驾驶仿真平台,Udacity的优点和缺点都很明显:安装最为方便快捷,几乎对电脑配置没有要求。另一方面,场景少得可怜,动力学模拟差到悲伤。只适合用于了解自动驾驶决策模型的设计原理和流程,无法实际应用。
此外,Udacity有一个致命问题,它在Ubuntu下并不稳定。我是并行安装所有平台的,结果刚打开最先安装好的Udacity,它就快乐地崩了,电脑重启,我+GB的内容全部得重新下载(╯-_-)╯╧╧
TORCS
适用任务:驾驶决策任务体验与教学
仿真器简介:TORCS本职是一款游戏,但是优秀的前辈们通过各种蛇皮操作,让它同样可以应用于驾驶仿真中。最开始,我对TORCS非常嫌弃,这都年了,怎么还有人会用这种分辨率的软件。但是,考虑到现实中,很多本科生是买不起显卡的,而这是为数不多不需要显卡就能跑的仿真器,还拥有过相当大的用户基数和多样的地图库,所以,对于特定人群来说,这个仿真器恐怕还是无可替代的。
安装流程: Ubuntu.搭建 TORCS无人驾驶训练 开发环境
gcc版本如果太高会编译失败,我用gcc-5过了,注意,Ubuntu .不支持低于gcc-7的版本。
仿真器展示:
华为自研编程语言“仓颉”火上热搜,英文编程还香吗?
华为自研编程语言“仓颉”火上热搜,英文编程还香吗?下面就我们来针对这个问题进行一番探讨,希望这些内容能够帮到有需要的朋友们。备受关注的华为自研编程语言「仓颉」,又火上热搜榜了。华为自研编程语言「仓颉」火上热搜榜,内测组员辟谣:并不是中文编程。此次是由于「仓颉」宣布启动了内测,现阶段己经有一部分开发人员取得源码。不久前,华为编程语言实验室公布了一份“新语言表达使用报考-”问卷调查,宣布征选一小批开发人员对「仓颉」编程语言开展小范畴检测。
从问卷调查内容看来,开发人员们必须填好Gitee首页、岗位和企业等信息内容,随后等候电子邮件通告。如今,伴随着大量关键点被表露出去,以前针对「仓颉」猜想的一些传闻,也拥有清晰的回答。英文名字Cangjie,并不是中文编程。
实际上,早在上年月,华为官方网就确立表露过“将公布自研洪蒙编程语言”。对于此事,华为消费者业务软件部首席总裁龚体表明,它将“为洪蒙绿色生态基础建设补上最终一环”。与此同时,华为也早已注册申请了“华为仓颉”、“仓颉语言表达”等商标logo,归类包含仪器设备、设计方案科学研究等,而一部分“仓颉”商标logo则仍在商标驳回复审、申请注册的环节。
这儿见到华为还申请注册了一个叫“仓杰”的商标logo,现阶段也早已根据申请办理,伴随着内测的打开,一部分开发人员在取得「仓颉」的源码后,也对先前满天飞的揣测和传闻开展了一些回复。其一,「仓颉」的英文名字便是Cangjie,而不是先前传言的“char”。那时候华为被曝产品研发「仓颉」后,知乎问答就发出过这门编程语言英文名字是“char”的信息:现阶段这一传言早已被辟谣。
其二,「仓颉」并不是中文编程,也不会有所说的“套壳”。据知乎问答一位匿名用户表明,感受后发觉「仓颉」编程语言“跟汉语一点儿关联没有”,英语的语法相近go+java。实际上,如今顺手一搜或是能找到一大堆有关「仓颉」是中文编程的谣言。
其三,往往仍在内测,是由于包含精英团队和内测组员都仍在改善编码。嗯,问便是仍在修bug(手动狗头)。但实际上,大伙儿最惊讶的或是「仓颉」这门编程语言到底长啥样。实际上,先前华为编程语言实验室负责人、南京大学冯新宇专家教授,早已设立过一门有关《编程语言的设计和实现》的课程内容,现阶段华为官方网已释放B站短视频。
在专题讲座一开始,冯专家教授就表露了自身现阶段开展的一些工作中。从总体上,学术研究上的分析主要包含PL基础理论及运用等,而工业生产层面的科学研究,则主要是领着华为编程语言实验室开展工业生产编程语言的设计方案和完成。
在冯新宇专家教授得出的教学课件中可以看到,现阶段的编程语言种类关键可以分成下列几类,在其中重点提及了服务平台型语言表达:像C#、Go、Swift这种开源系统编程语言,也全是由像Google、微软和iPhone那样的企业自身资金投入去做的,为此操控语言表达的工艺演变对策和方位。但华为「仓颉」到底是一门如何的语言表达,现阶段也有待官方网宣布公布信息内容。
UE4-Slate源码学习(一)slate初探
什么是Slate,它与UMG有何不同?
把这个问题交给AI吧。/手动狗头
Slate的创建是通过FGenericApplicationMessageHandler完成的。
FSlateApplication实现了此接口,并定义了处理硬件输入和输出的接口,用于与用户交互。在实现中,大部分函数都是虚函数,由FSlateApplication负责重写。这样,在不同的平台上,可以通过此接口调用到Slate中的事件触发。