首页 文章 精选 留言 我的

精选列表

搜索[安装向导],共10027篇文章
优秀的个人博客,低调大师

网页重定向导致防火墙NAT失效问题

某地政府部门A与部门B之间需要建立连接,部门A需要访问部门B的某网站,在部门A与部门B之间使用防火墙进行隔离并使用目的NAT功能。 如图,防火墙左边为部门A,右边为部门B,防火墙由于没有规划互联地址,使用终端网段内一地址作为接口地址,并用此地址作为目的NAT使用。终端访问151接口地址,经过NAT转换后,转为访问部门B服务器。 防火墙配置完成后,测试PING正常,远程桌面正常,但是WEB访问不通。检查防火墙配置未发现问题,在 部门B网络内访问WEB服务正常。将终端的网关由254改为151后,WEB访问正常,但显示网页的IP地址是B部门服务器的真实地址。 在终端上进行抓包,发现服务器返回的报文内,有重定向的信息,告诉终端访问网页的实际地址。 结果终端不再访问防火墙接口地址,而是直接访问真实地址。核心交换机上并没有此条路由,所以不会通,而将网关指定在防火墙上则不需要路由了,可以访问。此问题无法从网络层面进行解决,只能交给WEB维护人员修改。并不是所有网站都有此种情况,具体何种网站会使用到此技术,本人并不十分了解。大家可以试试,在网页里直接访问www.baidu.com,实际弹出的却是https的页面。 上述问题,由于防火墙的配置并没有十分严格的做安全策略控制访问,反而帮助了问题的排查定位,否则即使将网关设置为防火墙的接口地址也是不会通的。在实际中,我们还是希望将防火墙的安全策略进行严格配置,只放行需要通过的流量,但为了排错需要,可以临时使用全放行的策略进行排查,在排查完成后一定要关闭此策略。 最后关于抓包,其实并不是非要把TCP/IP这样的理论书看的多深入才能去看,只要敢于去看,多查查资料,都是可以看出一些东西的。

优秀的个人博客,低调大师

【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)

此章节为正在创作的游戏开发书籍中的一部分,由于写书的缘故很久没有更新了,挺对不起大家的;那么今天放出书中的一部分,让大家先睹为快吧; 在Android系统的手机,有的根本没有实体的上下左右导航按键,所以很多游戏都会有利用Android手机都具有触屏的特性,制作360度摇杆来取代游戏方向键,这样不仅能使界面UI变得很美观,而且更加的方便操作; 下面先来看效果吧: 下面开始实现: 首先,肯定是绘制两个圆形,无可置疑;圆心点重合,为了区分 ,所以设置了不同颜色; 灰色:固定不动的摇杆背景(也意味着摇杆的活动范围); 红色:摇杆; 然后考虑:红色摇杆肯定跟随手指触屏的位置而移动,那么这个很easy啦,只要在触屏事件中处理,将获取的触屏XY坐标赋值与摇杆XY坐标即可;这个没问题;但是紧接着在思考一个问题: 一般情况下,我们不可能希望摇杆一直跟随手指位置,所以需要一个摇杆的活动区域,也就如同上图中的灰色区域,在灰色区域内摇杆可以随着用户的触屏位置移动,但是一旦用户触屏位置在活动区域之外,摇杆就不应该跑出灰色区域;所以具体实现步骤如下: 1) 得到通过摇杆的坐标与触屏点的坐标得到所形成的角度Angle 2) 根据Angle,以及已知所在圆的半径,算出摇杆所在灰色圆形上做圆周运动的当前X,Y坐标; 首先第一步: 算出摇杆坐标与触屏坐标形成的角度 我们肯定已知摇杆当前坐标,并且当用户触屏时的坐标也可以在触屏按键中得到,那么获取的方法就可以写成一个方法,方法如下: /*** *得到两点之间的弧度 */ publicdoublegetRad(floatpx1,floatpy1,floatpx2,floatpy2){ //得到两点X的距离 floatx=px2-px1; //得到两点Y的距离 floaty=py1-py2; //算出斜边长 floatxie=(float)Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); //得到这个角度的余弦值(通过三角函数中的定理:邻边/斜边=角度余弦值) floatcosAngle=x/xie; //通过反余弦定理获取到其角度的弧度 floatrad=(float)Math.acos(cosAngle); //注意:当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180 if(py2<py1){ rad=-rad; } returnrad; } 在Java中 Math类中的反余弦函数返回的不是角度是弧度,这一点要格外注意; 另外一点就是,因为三角函数角度范围是0~180度,所以反之应该是-0~-180度; 通过此函数获取到摇杆与用户触屏位置所形成的角度之后,我们就可以通过圆周公式来得到其摇杆的XY坐标了;方法如下: 01./** 02. * 03. * @param R 04. * 圆周运动的旋转点 05. * @param centerX 06. * 旋转点X 07. * @param centerY 08. * 旋转点Y 09. * @param rad 10. * 旋转的弧度 11. */ 12.public void getXY(float centerX, float centerY, float R, double rad) { 13. //获取圆周运动的X坐标 14. SmallRockerCircleX = (float) (R * Math.cos(rad)) + centerX; 15. //获取圆周运动的Y坐标 16. SmallRockerCircleY = (float) (R * Math.sin(rad)) + centerY; 17.} 圆周运动公式:通过三角函数定理得出: X坐标:所在圆的半径*角度的余弦值 Y坐标:所在圆形半径*角度的正弦值 圆周的大小,由所在圆的半径R的大小来决定; 通过以上的公式我们就可以让摇杆在灰色圆形上做圆周运动,当然除此之外我们还要注意三点: 1:做圆周运动的大小,应该跟灰色区域的半径相同; 2:触屏事件中应该首先判定用户触屏的位置是否在灰色区域中,如果不在,我们就应该获取摇杆与触屏点的角度然后获取摇杆应该在圆周运动上的XY坐标;如果在,就没有处理了,只要将摇杆位置随着用户点击位置就好了; 3:在触屏事件中,当用户手指离开屏幕后,应该让摇杆的位置恢复到初始的位置状态; 下面是整个项目的MySurfaceView中全部代码: packagecom.rp; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.view.SurfaceHolder; importandroid.view.SurfaceView; importandroid.view.SurfaceHolder.Callback; publicclassMySurfaceViewextendsSurfaceViewimplementsCallback,Runnable{ privateThreadth; privateSurfaceHoldersfh; privateCanvascanvas; privatePaintpaint; privatebooleanflag; //固定摇杆背景圆形的X,Y坐标以及半径 privateintRockerCircleX=100; privateintRockerCircleY=100; privateintRockerCircleR=50; //摇杆的X,Y坐标以及摇杆的半径 privatefloatSmallRockerCircleX=100; privatefloatSmallRockerCircleY=100; privatefloatSmallRockerCircleR=20; publicMySurfaceView(Contextcontext){ super(context); Log.v("Himi","MySurfaceView"); this.setKeepScreenOn(true); sfh=this.getHolder(); sfh.addCallback(this); paint=newPaint(); paint.setAntiAlias(true); setFocusable(true); setFocusableInTouchMode(true); } publicvoidsurfaceCreated(SurfaceHolderholder){ th=newThread(this); flag=true; th.start(); } /*** *得到两点之间的弧度 */ publicdoublegetRad(floatpx1,floatpy1,floatpx2,floatpy2){ //得到两点X的距离 floatx=px2-px1; //得到两点Y的距离 floaty=py1-py2; //算出斜边长 floatxie=(float)Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); //得到这个角度的余弦值(通过三角函数中的定理:邻边/斜边=角度余弦值) floatcosAngle=x/xie; //通过反余弦定理获取到其角度的弧度 floatrad=(float)Math.acos(cosAngle); //注意:当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180 if(py2<py1){ rad=-rad; } returnrad; } @Override publicbooleanonTouchEvent(MotionEventevent){ if(event.getAction()==MotionEvent.ACTION_DOWN|| event.getAction()==MotionEvent.ACTION_MOVE){ //当触屏区域不在活动范围内 if(Math.sqrt(Math.pow((RockerCircleX-(int)event.getX()),2) +Math.pow((RockerCircleY-(int)event.getY()),2))>=RockerCircleR){ //得到摇杆与触屏点所形成的角度 doubletempRad=getRad(RockerCircleX,RockerCircleY,event.getX(),event.getY()); //保证内部小圆运动的长度限制 getXY(RockerCircleX,RockerCircleY,RockerCircleR,tempRad); }else{//如果小球中心点小于活动区域则随着用户触屏点移动即可 SmallRockerCircleX=(int)event.getX(); SmallRockerCircleY=(int)event.getY(); } }elseif(event.getAction()==MotionEvent.ACTION_UP){ //当释放按键时摇杆要恢复摇杆的位置为初始位置 SmallRockerCircleX=100; SmallRockerCircleY=100; } returntrue; } /** * *@paramR *圆周运动的旋转点 *@paramcenterX *旋转点X *@paramcenterY *旋转点Y *@paramrad *旋转的弧度 */ publicvoidgetXY(floatcenterX,floatcenterY,floatR,doublerad){ //获取圆周运动的X坐标 SmallRockerCircleX=(float)(R*Math.cos(rad))+centerX; //获取圆周运动的Y坐标 SmallRockerCircleY=(float)(R*Math.sin(rad))+centerY; } publicvoiddraw(){ try{ canvas=sfh.lockCanvas(); canvas.drawColor(Color.WHITE); //设置透明度 paint.setColor(0x70000000); //绘制摇杆背景 canvas.drawCircle(RockerCircleX,RockerCircleY,RockerCircleR,paint); paint.setColor(0x70ff0000); //绘制摇杆 canvas.drawCircle(SmallRockerCircleX,SmallRockerCircleY, SmallRockerCircleR,paint); }catch(Exceptione){ //TODO:handleexception }finally{ try{ if(canvas!=null) sfh.unlockCanvasAndPost(canvas); }catch(Exceptione2){ } } } publicvoidrun(){ //TODOAuto-generatedmethodstub while(flag){ draw(); try{ Thread.sleep(50); }catch(Exceptionex){ } } } publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ Log.v("Himi","surfaceChanged"); } publicvoidsurfaceDestroyed(SurfaceHolderholder){ flag=false; Log.v("Himi","surfaceDestroyed"); } } 如果大家想美化摇杆,那就让你们的美工给出两张圆形图吧;还在等什么,立刻为你的游戏加上摇杆吧~娃哈哈 好啦,其实这里只是给大家介绍思路,具体的书中,我已经将此封装成了一个摇杆类,这样更加的OOP,至于如何封装,大家可以根据需要自由来设计;今天的博文写的可能不是很清晰,因为我现在脑子昏昏沉沉的 - - 。 从写书开始到现在,每天都3-4点睡觉,唉、不过值得高兴的是,如果没有特殊情况,6月底书籍就要交稿了,大家期待下吧;我也会继续努力这最后两个月的; 项目下载地址http://www.himigame.com/android-game/384.html 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606988,如需转载请自行联系原作者

优秀的个人博客,低调大师

windows安装jenkins(docker安装)

install DockerSystem Requirements: Windows 10 64bit: Pro, Enterprise or Education (Build 15063 or later).Virtualization is enabled in BIOS. Typically, virtualization is enabled by default. This is different from having Hyper-V enabled. For more detail see Virtualization must be enabled in Troubleshooting.CPU SLAT-capable feature.At least 4GB of RAM. download DockerCE for windows install jenkins用cmd命令窗口执行下述命令 docker run ^ --rm ^ -u root ^ -p 8080:8080 ^ -v jenkins-data:/var/jenkins_home ^ -v /var/run/docker.sock:/var/run/docker.sock ^ -v "%HOMEPATH%:/home ^ jenkinsci/blueocean #"%HOMEPATH%"为用户目录 执行完毕后访问 http://127.0.0.1:8080 提示需要通过日志访问密码 使用Maven构建流水线 -u root ^ --rm ^ -d ^ -p 8080:8080 ^ -p 50000:50000 ^ -v jenkins-data:/var/jenkins_home ^ -v /var/run/docker.sock:/var/run/docker.sock ^ jenkinsci/blueocean

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册