一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Backend

Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

一、Unity3D平台简介   Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、Windows Phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac 和Windows的网页浏览。它的网页播放器也被Mac widgets所支持。   据不完全统计,目前国内有80%的Android、Iphone手机游戏使用Unity3D进行开发,比如著名的手机游戏《神庙逃亡》就是使用Unity3D开发的,也有《纵横时空》、《将魂三国》、《争锋online》、《萌战记》、《绝代双骄》、《蒸汽之城》、《星际陆战队》、《新仙剑奇侠传Online》、《武士复仇2》、《UDog》等上百款网页游戏都是使用Unity3d开发。 当然,Unity3D不仅只限于游戏行业,在虚拟现实、工程模拟、3D设计等应用方面也有着广泛的应用,国内使用Unity3D进行虚拟仿真教学平台、房地产3维展示等项目开发的公司非常多,比如绿地地产、保利地产、中海地产、招商地产等大型的房地产公司的三维数字楼盘展示系统很多都是使用Unity3D进行开发。比如《Miya家装》、《飞思翼家装设计》、《状元府楼盘展示》等等。 赤果果的数据->国内53.1%的人使用Unity3D进行游戏开发,有80%的手机游戏使用Unity3D开发,跨多平台(IOS、Android、Windows Phone、Windows、Flash、XBOX360、PS3、Wii等)游戏引擎,可以开发2D、2.5D、3D游戏。appstore手机上有1500+款用Unity3D开发的游戏,而Unity3D语言就有C#(还有JavaScript,但不是原生的JavaScript)。 因此,对于我们.NET程序员,如果说Mono让我们进入了跨平台服务器的Web开发时代,Unity3D则让我们赶上了移动手游开发的浪潮,不至于掉队甚至错过这波浪潮。我又想起园子里的一位大牛—张善友先生写的一篇博文的标题:现在是C#程序员最好的时代。是啊,感谢开源社区的大牛们,我们拥抱着Mono,还迎来了Unity3D。 二、Unity3D IDE简介 Unity(http://unity3d.com/)提供了免费的下载,目前最新版本是4.3.4f3,安装包大概1个G左右。目前提供了收费的专业版和免费的版本以及30天的试用版,一般我们学习者使用免费版足矣。当然,在大天朝各种破解补丁、注册机是可以找到的,不过涉及到版权问题这里不进行讨论,请自行百度或Google搜索。下载完成后,即可安装,安装步凑就是各种下一步(Next),中途会提示你是否需要安装几个组件:Examples、Web Player以及Mono Developer,一般都全选上,当然也可以不选。Mono Developer是个好东西(但是智能性上赶不上强大的VS),推荐装上。   安装完成并且注册(或者破解)之后,你就可以进入以下所示的界面了。恭喜你,你已经进入Unity3D的学习征途,当然,还仅仅是第一步。这里需要提示一下:在新建Unity3D项目的时候,一定要放在非中文命名的路径中!另外,每次在创建新项目的时候,Unity3D都会自己重启一下,这是正常现象哈,不要以为你的Unity3D安装没成功。 三、第一个Unity3D程序-Hello Cube! (1)在模型对象区域中的Hierarchy中Create一个Cube立方体,在Inspector中修改它的Position XYZ均设置为0; (2)Unity3D场景默认是木有光照源的,因此需要在Hierarchy中Create一个Directional light(平行光); (3)修改Main Camera(摄像机看到的就是屏幕看到的)的Position为(0,1,-5),这样看起来清楚一点; (4)在项目资源管理器中Create一个C# Script,命名为CubeControl。创建完成之后,双击该脚本文件,自动进入MonoDeveloper(默认是MonoDeveloper,当然我们也可以使用Visual Studio作为默认编辑器)。 (5)在MonoDeveloper中,写入以下代码。这个代码主要是判断用户的按键操作,如果是上、下、左、右操作,则对指定的对象进行指定方向的翻看。(主要写在Update方法中,程序的每一帧都会调用Update方法,1秒默认30帧)  View Code (6)将保存后的CubeControl通过鼠标拖动到模型对象区Hierarchy中的Cube上进行脚本绑定。绑定脚本和对象之后,在Cube的属性中会看到下图所示。*PS:脚本需要对应到一个具体的游戏对象才有意义!   (7)现在可以预览一下我们的第一个程序了,点击如下图所示的播放按钮,即可进入模拟器看到效果。这时,我们通过按下键盘中的上、下、左、右键,Cube立方体会随着我们的按键翻转。怎样?麻雀虽小,但是五脏俱全吧,我们的第一个Unity3D程序—Hello Cube就完成了。 (8)接下来,如果按照正式项目的步凑的话就轮到发布程序了。这里我们可以体验一下Unity3D强大的跨平台能力,我们这个Demo可以发布为各种主流类型操作系统兼容的应用程序。通过点击File-Build Settings,即可进入如下图所示的发布设置窗口界面。查看Platform列表,里边囊括了几乎目前所有的操作平台,也就是说我们可以实现一次开发,多平台运行,爽哉! (9)这里我们做个测试,发布一个Windows平台的典型exe程序和一个Web平台的Flash程序来体验一下。(我的笔记本没有安装Android模拟器,更不要说Mac模拟器了,所以,你懂的) (10)足够细心的你相信已经发现这个Cube立方体的棱角有锯齿,这是因为在默认环境下,抗锯齿这个属性是设为Disabled(禁用)的。因此,我们可以点击Edit→Project Settings→Quality,将Anti Aliasing这个属性选为2x Multi Sampling(可选值为2x Multi Sampling、4x Multi Sampling以及8x Multi Sampling,值越大越平滑,但是会占用更多的系统资源,开发调试阶段一般选择为Disabled,当然,如果你的机器足够好,选择4x或8x也是一个不错的选择)。  四、原谅我是“外貌”协会—酷炫场景导入 相信大家都玩过很多游戏,对于游戏中那些宏大逼真的游戏场景应该是历历在目。所以,对于我们这种对于游戏场景外貌要求比较高的“玩家”(不过,我很少玩网络游戏,目前一直在玩的只有Pro Evolution Soccer实况足球),上面那个一点场景都木有的游戏对我们来说没有一点吸引力!因此,对于外貌协会的挑剔客观,Unity3D支持3Ds Max的FBX模型文件直接导入,为我们的游戏“整容”,一秒变白富美! (1)从网上下载一个FBX模型文件;(这个网上很多,请自行百度或Google。我这里使用的是一个希腊圣殿的场景FBX文件,下载地址见本文底部。)另外,这里需要提醒一下:如果下载下来的FBX文件以中文命名,请将其改为英文命名,并且最好不要有空格。例如,我这里将其原文件名“希腊圣殿”改为TempleScene。 (2)将下载的FBX模型文件拖动到Unity3D中的资源管理器区域中,完成后在资源管理器中会出现该模型文件图标; (3)将上图中带有播放按钮的TempleScene.FBX文件拖动到Scene(游戏场景视图)中,于是一秒变为希腊圣殿的场景! (4)这时我们稍微调整一下Main Camera和Cube的Position就可以浏览一下在圣殿场景下的Hello Cube程序了。 (5)但是我们发现,虽然立方体可以随着我们的键盘方向操作翻转,但是场景一直停在一个固定的角度。于是乎,我们想让场景也随着立方体的翻转而转动,我们该怎么来做呢?这就涉及到我们刚刚所写的CubeControl脚本了,在Unity3D中脚本是需要和对象绑定才能正确运行的。因此,我们只需要把CubeControl和刚刚导入的这个圣殿的场景对象绑定一下即可。所以,这里从资源管理器区域中把CubeControl拖动到TempleScene处就OK了。最后,可以通过查看TempleScene的属性观察是否绑定上了脚本,如下图所示。 (6)最后,通过点击播放按钮在模拟视图中可以查看。这下,只要我们按下键盘上的方向键,场景和立方体会一起转动,爽吧! PS:一般游戏公司里边会有这么几类角色:主程(主程序员)、主美(主美工师)以及策划、测试和客服。There is no doubt that 我们的目标是主程,精通一门开发语言,熟悉游戏脚本与服务端开发,对什么HTTP协议、Socket通讯等原理都懂一些,还了解一些常用的架构和设计模式,能够熟练操作SQL语言与数据库交互。但是,我们也不是神,不能啥都学啥都会,游戏场景设计这块是主美的饭碗,所以我们只需要将美工设计好的场景模型加入游戏中,我们为游戏对象写脚本,写交互代码让游戏真正动起来即可! 五、小结 Unity3D是一个强大的游戏引擎平台,我们可以很方便地在其上编写一些简单的游戏程序。通过和美工的配合,我们完全可以开发出很酷炫的游戏。而且更为重要的是: 1.Unity3D可以基于Mono实现跨平台,可以一次开发,多处运行; 2.Unity3D可以使用C#编写脚本,众多的.NET程序员们可以快速学习上手,赶上手机游戏的浪潮尾巴; 后面我们会继续初探Unity3D,实现一个地球围绕太阳转的Demo、为游戏添加地形、理解一下物理引擎、GUI,最后实现一个简单的打箱子游戏来结束这次初探之旅。另外,本人就一苦逼的计算机专业学生,写博文没多久,最近兴趣起来了,就写的多了一点,内容如有错误敬请谅解。博客内容借助于以下的参考文献资料,站在巨人的肩膀上,我们可以看得更远,在此,谢谢这些巨人们! 参考文献与资料 (1)百度Unity3D百科:http://baike.baidu.com/link?url=jB3DpXJ9OQ39FEJB8qLEDfkMZL_dVBw2AFVPTICOACW6POmxt7EWaIAhhgiAre5mIfHRfxv5uGT82s_vLL2zPK (2)传智播客Unity3D公开课:http://net.itcast.cn/subject/Unity3D/index.html […]

龙生   31 Mar 2019
View Details

构建和运行WebGL项目

当你建立  WebGL项目,Unity创建一个包含以下文件的文件夹: 一个index.html的该浏览器可以浏览文件加载您的内容。 一个TemplateData文件夹(默认模板建立时)包含构建标识,装载酒吧和其他模板资产 。构建模板文件夹通常用于在加载时自定义构建的外观。有关详细信息,请参阅WebGL模板上的“用户手册”页面。 一个build文件夹包含您所产生构建输出文件。 在构建文件夹包含以下文件(MyProject的文件名代表项目的名称)。 一个UnityLoader.js包含要加载的网页的统一内容所需的代码JavaScript文件。 一个MyProject.json JSON文件,包含有关构建的所有必要信息。在实例化构建时,此JSON文件的URL作为Unity Loader的参数提供。JSON文件包含所有其他构建文件的URL,这些URL可以是绝对的或相对于JSON文件的位置。JSON可能包含其他模块参数,例如初始屏幕样式或内存堆的初始大小。 一个MyProject.asm.framework.unityweb包含asm.js运行和JavaScript的插件文件。 一个MyProject.asm.code.unityweb文件,其中包含播放器的asm.js模块。 一个MyProject.asm.memory.unityweb包含的二进制映像文件来初始化您的播放器的堆内存。 一个MyProject.data.unityweb包含资产数据和文件的场景 。 Build文件夹中的* .unityweb文件的内容可以使用gzip,brotli进行压缩,也可以不压缩,具体取决于发布设置。有关更多信息,请参阅有关部署压缩版本的文档 您可以通过打开index.html文件直接在大多数浏览器中查看WebGL播放器。但是,出于安全考虑,Chrome会对从本地文件网址打开的脚本施加限制,因此此技术在Chrome中无法使用。要解决Chrome的限制,请使用Unity的Build&Run命令(文件 > 构建和运行); 然后,该文件临时托管在本地Web服务器中,并从本地主机URL打开。或者,您可以使用--allow-file-access-from-files命令行选项运行Chrome,该选项允许它从本地文件URL加载内容。这在PC上是必需的,以允许执行构建。 在某些服务器上,您需要明确地使.unityweb文件可访问,因为服务器需要将这些文件提供给客户端。 建立玩家选项 通过“ 构建设置”对话框访问WebGL选项。(菜单:文件 > 构建设置…)。在对话框中,选择WebGL 从平台列表,然后选择播放器设置…。 开发构建 检查开发构建时 复选框,Unity生成一个开发版本,它具有Profiler支持和一个开发控制台,可以查看错误。此外,开发版本不会压缩内容(即内容不会缩小); 它们以人类可读的形式维护JavaScript,保留了函数名称,因此您可以获得有用的错误堆栈跟踪。但请注意,这意味着开发构建非常庞大,而且分布太大。 使用预先构建的引擎 只有选中了“ 开发构建”复选框后,才会显示此选项。使用“ 构建设置”对话框中的“ 使用预构建引擎”选项可加快开发期间的构建迭代时间。启用此选项后,Unity仅重建托管代码,然后与预构建Unity引擎动态链接,因此项目重建速度提高约30-40%。请注意,此类构建仅适用于开发目的,因为它始终生成未提取的引擎代码。由于动态链接开销,此类构建的性能比正常构建慢。 Autoconnect Profiler 只有选中“ 开发构建”复选框后,才能启用此选项。检查Autoconnect Profiler选项以分析Unity WebGL内容。对于WebGL,无法连接的Profiler 正在运行的构建与其他平台一样,因此您必须使用此选项将内容连接到编辑器。这是因为Profiler连接是使用WebGL上的WebSockets处理的,但Web浏览器仅允许来自内容的传出连接。 播放器设置 WebGL在播放器设置中有一些其他选项(菜单:编辑 ^ gt; 项目设置 ,然后选择播放器类别)。 其他设置 剥离引擎代码 打开“ 其他设置”以访问“ 剥离引擎代码”选项。默认情况下会选中此选项以启用WebGL的代码剥离。选中此选项后,Unity不会包含您不使用的任何类的代码。例如,如果您不使用任何物理组件或功能,则整个物理引擎 ,从您的构建中删除。有关详细信息,请参阅下面的“剥离”部分。 发布设置 内存大小 打开发布设置以访问“ 内存大小”字段。在这里,您可以指定内容应为其堆分配多少内存(以MB为单位)。如果此值太低,则会出现“内存不足”错误消息。这意味着您加载的内容和场景无法适应可用内存。但是,如果此值太高,则您的内容可能无法在某些浏览器或某些计算机上加载,因为浏览器可能没有足够的可用内存来分配请求的堆大小。此值将写入TOTAL_MEMORY生成的.json文件中指定的属性,因此,如果要在不重建项目的情况下试验此设置,可以编辑.json文件或提供更新TOTAL_MEMORYvalue作为附加的WebGL实例化参数。有关更多详细信息,请参阅WebGL内存使用的用户手册页面。 启用例外 打开发布设置以访问“ 启用例外”。Enable Exceptions允许您指定在运行时如何处理意外的代码行为(通常被视为错误)。它有以下选项: 无:如果您不需要任何异常支持,请选择此选项。这提供了最佳性能和最小构建。使用此选项,抛出的任何异常都会导致您的内容因该设置中的错误而停止。 仅显式抛出异常(默认):选择此选项以捕获从脚本中的throw语句显式指定的异常并确保调用块。请注意,选择此选项会使脚本生成的JavaScript代码越来越慢; 如果脚本是项目的主要瓶颈,这可能只是一个问题。 finally 完全没有堆栈跟踪:选择此选项可捕获: 从throw脚本中的语句显式指定的异常(与“ 仅显式抛出的异常”选项中的相同) 空引用 Out of Bounds Array访问 Full With Stacktrace:此选项与上面的选项类似,但它也捕获堆栈跟踪。Unity通过在代码中嵌入对它们的检查来生成这些异常,因此该选项会降低性能并增加浏览器内存使用量。仅用于调试,并始终在64位浏览器中进行测试。 选择“ 发布设置”以访问“ 数据缓存”。选择此选项可启用播放器数据的自动本地缓存。此选项将资产存储设置为浏览器的IndexedDB数据库中的本地缓存,以便在后续的内容运行中不必再次下载资产。请注意,不同的浏览器在允许IndexedDB存储方面有不同的规则; 浏览器可能会要求用户存储数据的权限,并且您的构建可能超出浏览器定义的大小限制。 分配规模 在发布WebGL时,重要的是要保持较低的构建大小,以便用户在内容开始之前获得合理的下载时间。有关减少资产大小的一般提示,请参阅有关减少构建文件大小的文档。 WebGL特有的提示和技巧 指定Crunch纹理压缩 纹理导入器中所有压缩纹理的信息,格式。 不要部署开发版本; 它们不会被压缩或缩小,因此文件大小要大得多。 打开播放器设置(菜单:编辑 > 项目设置,然后选择播放器类别),如果构建中不需要例外,请打开“ 发布设置”面板并将“ 启用例外”设置为“ 无”。 打开播放器设置(菜单:编辑 > 项目设置,然后选择播放器类别),打开其他设置面板,并启用脱机引擎代码以确保高效构建。 使用第三方托管dll时要小心,因为它们可能包含大量依赖项,因此会显着增加生成的代码大小。 如果您进行发布版本,Unity将根据在WebGL 播放器设置的“ 发布设置”面板中选择的“ 压缩格式 ” 压缩构建输出文件。 有关这些选项的详细信息,以及如何使用它们发布构建,请参阅有关部署压缩构建的文档。 AssetBundles 由于您的所有资产数据都需要在内容启动之前预先下载,因此您应该考虑将资产从主数据文件中移出到AssetBundles中。这样,您可以为内容创建一个小型加载器场景,可以快速加载。然后,当用户继续浏览您的内容时,它会按需动态加载资产。AssetBundles还有助于资产数据内存管理:您可以通过调用AssetBundle.Unload从内存中卸载您不再需要的资产的资产数据。 在WebGL平台上使用AssetBundle时需要考虑一些注意事项: 当您在AssetBundle中使用未在主构建中使用的类类型时,Unity可能会从构建中剥离这些类的代码。尝试从AssetBundle加载资产时,这可能会导致失败。使用BuildPlayerOptions.assetBundleManifestPath来修复它,或者参见下面的剥离部分,了解其他选项。 WebGL不支持线程,但http下载仅在下载完成后才可用。因此,Unity WebGL构建需要在下载完成时解压缩主线程上的AssetBundle数据,阻塞主线程。为避免这种中断,LZMA AssetBundle压缩不适用于WebGL上的AssetBundle。AssetBundles使用LZ4进行压缩,可以按需非常高效地进行解压缩。如果您需要比LZ4更小的压缩大小,则可以将Web服务器配置为在AssetBundles上使用gzip或Brotli压缩(在LZ4压缩之上)。有关如何执行此操作的详细信息,请参阅有关部署压缩版本的文档。 WebGL使用来自浏览器的IndexedDB API支持使用WWW.LoadFromCacheOrDownload进行AssetBundle缓存,以在用户的​​计算机上实现缓存。请注意,IndexedDB可能对某些浏览器的支持有限,并且浏览器可能会请求用户授权将数据存储在磁盘上。有关更多信息,请参阅WebGL浏览器兼容性文档。 剥 Unity默认从构建中删除所有未使用的代码。您可以通过播放器设置(菜单:编辑 > 项目设置,然后选择播放器类别)更改此设置:选择其他设置面板以访问剥离引擎代码选项。最好在启用剥离的情况下构建。 通过代码剥离,Unity会扫描您的项目以查找所使用的任何UnityObject类(通过在脚本代码中引用,或者在场景中的序列化数据中引用)。然后它从构建中删除任何没有使用其类的Unity子系统。这使得您的构建代码更少,从而导致更少的下载和更少的代码进行解析(因此代码运行速度更快,占用的内存更少)。 代码剥离的问题 如果代码剥离剥离了实际需要的代码,则代码剥离可能会导致项目出现问题。当您在运行时加载AssetBundles时,可能会出现这种情况,该类包含未包含在主构建中的类,因此已从项目中删除。发生这种情况时,浏览器的JavaScript控制台中会显示错误消息(可能会出现更多错误)。例如: Could not […]

龙生   31 Mar 2019
View Details

Unity3D

Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。 外文名 unity3d 分    类 游戏引擎、游戏开发工具 开发公司 Unity Technologies 支持的维度 3D,2D 编程语言 C#(JS以及Boo已被放弃支持)   from:https://baike.baidu.com/item/Unity3D

龙生   31 Mar 2019
View Details

使用cloudflare加速你的网站隐藏你的网站IP

前言 cloudflare 是一家国外的 CDN 加速服务商,还是很有名气的。提供免费和付费的加速和网站保护服务。以前推荐过的百度云加速的国外节点就是和 cloudflare 合作使用的 cloudflare 的节点。 cloudflare 提供了不同类型的套餐,即使是免费用户,cloudflare 提供的功能也是很全面的。 对于访客来自于国外的网站很不错;对于访客来自于国内的网站加速效果有限,有些甚至会变慢,不过其安全防护功能也很不错。 添加网站 官网: www.cloudflare.com 使用邮箱注册,注册完后自动进入添加网站界面。 添加网站分为四步:添加网站域名、添加DNS记录、选择方案、更新域名服务器。 Paste_Image.png 1.添加网站 填入自己的主域名(不带 www 的),“Scan DNS Records”。 2.添加DNS记录 添加完成后会自动扫描 DNS 记录,等待完成,“Continue”。 下面会列出所有扫描到的 DNS 记录。黄色云朵表示该解析通过 CDN 访问,灰色云朵表示不通过 CDN 访问,点击云朵可以切换状态。 这里建议全部调为黄色云朵走 CDN 访问,隐藏网站真实 IP 地址。全站通过 CDN 访问可以有效防止网站真实IP泄漏,保护原站安全。 记录简单的话可以直接按默认条目;如果没有扫描出来原记录或要手动添加,建议至少添加 @ 和 www 两条指向原网站 IP 的 A 记录,TTL 默认。 Paste_Image.png 3.选择方案 选择适合自己的方案,一般小站博客免费方案就够了。当然,有更高需求的可按需选择付费方案。 Paste_Image.png 4.更新域名服务器 右侧是新的域名服务器。进入域名管理面板,更改域名服务器为新的。 Paste_Image.png 域名服务器更改成功后会收到邮件提示。“Continue”,完成。 Paste_Image.png from:https://www.jianshu.com/p/95a8f8e28649 最后成功以后,你 ping 你的域名 则发现其返回的IP地址已经不是真实IP了!例如:

  摘录自:http://www.freebuf.com/articles/web/41533.html 大部分通过CloudFlare保护的网站都有一个direct-xxx(xxx对应网站域名)的子站,通过这个子站我们可以获得该网站的真是IP。例如这里我随便找个网站,我们手工测试一下: 我们不做DDOS,没必要去较真网站的真实IP是什么,但如果渗透过程中需要从Web入手,而暂时又找不到可利用的漏洞,需要通过其他弱智的方式来进行入侵,如各种C段的渗透等,那样真实的网站IP就显得比较重要了。OK,先ping一下,看看, 141.101.122.201,美国。 试试刚才说的那个方法 蛋疼了,被CloudFlare隐藏的那是相当的深了,这果然是特殊照顾的客户啊。这里就不得不祭出神站了,提到一个比较叼的网站,www.crimeflare.com,网站有个DomainSearchBox,可以对CloudFlare客户网站进行真实IP查询。这个估计是哪个哥们跟CloudFlare网站过不去建立的吧。 果断发现真实IP,147开头,香港大学的,具体地址就不透露了,免得顺丰快递上门服务。如何验证真实性呢,最简单的办法就是修改本地的Host文件,真实的IP对应与之对应的域名即可。但是验证了一下,发现不对,这只是曾经用过的一台服务器IP地址,应该是这鸟网站扛不住的时候CF帮忙搬家了,这里只能呵呵一下。看了下C段,全是香港大学的机器,没啥兴趣,搞来意义不大,就不浪费时间了。然后各种抓包分析,后来还是没突破,最终拿到了个CDN的小工具,类似于核总写的CDN终结者一样吧(某大牛,具体名字就不方便透露了),配和工具倒腾了会,竟然还真让我找到了一个在美国的IP地址(54.xxx.xxx.xx),查一下地址看看。 验证后果然为真实服务器,果然是AWS地址上,也验证了之前所有的想法,原来躲在了在亚马逊云上面,又是用的EC2产品,对ec2不太了解,注册了个aws看了看,对于EC2这种产品没有0Day是基本直接渗透没希望的。   from: https://www.cnblogs.com/bonelee/p/8670660.html

龙生   27 Mar 2019
View Details

nginx 优化(突破十万并发)

一般来说nginx 配置文件中对优化比较有作用的为以下几项: worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一 个进程分配到多个cpu。 worker_rlimit_nofile 102400; 这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。 use epoll; 使用epoll 的I/O 模型 worker_connections 102400; 每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。 keepalive_timeout 60; keepalive 超时时间。 client_header_buffer_size 4k; 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求 头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE 取得。 open_file_cache max=102400 inactive=20s; 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; 这个是指多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 1; open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。 关于内核参数的优化: net.ipv4.tcp_max_tw_buckets = 6000 timewait 的数量,默认是180000。 net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围。 net.ipv4.tcp_tw_recycle = 1 启用timewait 快速回收。 net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接。 […]

龙生   27 Mar 2019
View Details

PHP函数内访问全局变量

$stringVarGlo="global variant";//全局变量   textGlobalVariant1(); //方法一使用$GLOBALS["全局变量名"] echo $stringVarGlo,"<br/>";   textGlobalVariant2();  //方法二使用global 变量名声明引入; echo $stringVarGlo,"<br/>";   function textGlobalVariant1(){ $varGlob="textGlobalVariant1"; $GLOBALS["stringVarGlo"].=$varGlob;           //使用$GLOBALS["全局变量名"] }   function textGlobalVariant2(){ global    $stringVarGlo; //使用global 变量名声明引入; $varGlob="textGlobalVariant2"; $stringVarGlo.=$varGlob; }   输出 global varianttextGlobalVariant1 global varianttextGlobalVariant1textGlobalVariant2 ——————— 作者:岁月绵长 来源:CSDN 原文:https://blog.csdn.net/s1e1s/article/details/46833307 版权声明:本文为博主原创文章,转载请附上博文链接!

龙生   24 Mar 2019
View Details

RabbitMQ消息持久化

目录 一、前言 二、队列持久化   2.1 查看存在的队列和消息数量   2.2 持久化队列 三、消息持久化 四、总结 一、前言 如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。 二、队列持久化   2.1 查看存在的队列和消息数量 在windows环境下,在rabbitmq的安装目录/sbin下,通过rabbitmqctl.bat list_queues查看  这边启动了两个producer,分别生成两个队列hello 和 hello1,并且他们都有一个消息存在 重启rabbitmq,模拟故障 可以看到重启后两个队列都消失了   2.2 持久化队列 我们就hello队列持久化 在声明队列名称时,持久化队列,生产端和消费端都要 1 channel.queue_declare(queue=’hello', durable=True) 我们重复上面的操作,但是给hello队列做持久化,而hello1不做,并重启rabbitmq 可以看到重启后,hello队列还在,hello1队列消失了,但是原本hello中的一条消息也没有保存下来。所以在这边我们仅仅做到了消息队列的持久化,还没有做消息持久化。 三、消息持久化 我们刚才实现了在rabbitmq崩溃的情况下,就队列本身保存下来,重启后队列还在。接下来我们要将消息也保存下来,即消息的持久化 1 2 3 4 5 6 7 8 9 channel.basic_publish(exchange=",                       routing_key=’hello',                       body=’hello',                       properties=pika.BasicProperties(                           delivery_mode=2,  # make message persistent                       )) # 增加properties,这个properties 就是消费端 callback函数中的properties # delivery_mode = 2  持久化消息 生产端生成一个消息,并重启rabbitmq 可以看到,经过队列和消息持久化后的hello, 在重启的情况下,队列和消息都存在,没有消失。 消费端再重启后也能正常接收 四、总结 队列持久化需要在声明队列时添加参数 durable=True,这样在rabbitmq崩溃时也能保存队列 仅仅使用durable=True ,只能持久化队列,不能持久化消息 消息持久化需要在消息生成时,添加参数 properties=pika.BasicProperties(delivery_mode=2)   from: https://www.cnblogs.com/bigberg/p/8195622.html#_label3

龙生   24 Mar 2019
View Details

Elasticsearch-基础介绍及索引原理分析

最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elasticsearch感兴趣/想了解的同学有所帮助。 同时也希望有发现内容不正确或者有疑问的地方,望指明,一起探讨,学习,进步。 介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作: 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 实时分析的分布式搜索引擎。 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 基本概念 先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:

  用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。这里有一份简易的将Elasticsearch和关系型数据术语对照表:

  一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:

  更新,查询也是类似这样的操作,具体操作手册可以参见Elasticsearch权威指南 索引 Elasticsearch最关键的就是提供强大的索引能力了,其实InfoQ的这篇时间序列数据库的秘密(2)——索引写的非常好,我这里也是围绕这篇结合自己的理解进一步梳理下,也希望可以帮助大家更好的理解这篇文章。 Elasticsearch索引的精髓: 一切设计都是为了提高搜索的性能 另一层意思:为了提高搜索的性能,难免会牺牲某些其他方面,比如插入/更新,否则其他数据库不用混了。前面看到往Elasticsearch里插入一条记录,其实就是直接PUT一个json的对象,这个对象有多个fields,比如上面例子中的name, sex, age, about, interests,那么在插入这些数据到Elasticsearch的同时,Elasticsearch还默默1的为这些字段建立索引--倒排索引,因为Elasticsearch最核心功能是搜索。 Elasticsearch是如何做到快速索引的 InfoQ那篇文章里说Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快,为什么呢? 什么是B-Tree索引? 上大学读书时老师教过我们,二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构: 为了提高查询的效率,减少磁盘寻道次数,将多个值作为一个数组通过连续区间存放,一次寻道读取多个数据,同时也降低树的高度。 什么是倒排索引? 继续上面的例子,假设有这么几条数据(为了简单,去掉about, interests这两个field):

  ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下: Name:

  Age:

  Sex:

  Posting List Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, 24, Female这些叫term,而[1,2]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。 看到这里,不要认为就结束了,精彩的部分才刚开始… 通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,爱回答问题的小明马上就举手回答:我知道,id是1,2的同学。但是,如果这里有上千万的记录呢?如果是想通过name来查找呢? Term Dictionary Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢? Term Index B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树: 这棵树不会包含所有的term,它包含的是term的一些前缀。通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。 所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term […]

龙生   24 Mar 2019
View Details

官网生成带Zero的Abp出现Default language is not defined!的错误

官网生成的ABP + module zero出现Default language is not defined!的错误,原因是数据库没有language数据,而不是缺少language.xml资源文件,所以先创建数据库就好了。   解决方法: 1.选择Web项目作为起始项目。 2.打开程序包管理控制台,选择“EntityFramework”项目作为默认项目,然后运行EF的’Update-Database’命令。该命令会创建数据库。 3.运行该应用,默认的用户名是’admin’,密码是’123qwe’。 在执行第2步时遇到了如下错误: Update-Database : 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重试。 原因可能是EntityFramework没有安装,Install-Package EntityFramework就好了。什么?还是不行?全部重新生成再重新打开vs试试吧!   参考:Module-Zero之启动模板   from: https://blog.csdn.net/klo220/article/details/51138582

龙生   24 Mar 2019
View Details

基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。 ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate   ABP 的由来 “DRY——避免重复代码”是一个优秀的开发者在开发软件时所具备的最重要的思想之一。我们在开发企业WEB应用程序时都有一些类似的需求,例如:都需要登录页面、用户/角色管理、权限验证、数据有效性验证、多语言/本地化等等。一个高品质的大型软件都会运用一些最佳实践,例如分层体系结构、领域驱动设计、依赖注入等。我们也可能会采用ORM、数据库迁移(Database Migrations)、日志记录(Logging)等工具。 从零开始创建一个企业应用程序是一件繁琐的事,因为需要重复做很多常见的基础工作。许多公司都在开发自己的应用程序框架来重用于不同的项目,然后在框架的基础上开发一些新的功能。但并不是每个公司都有这样的实力。假如我们可以分享的更多,也许可以避免每个公司或每个项目的重复编写类似的代码。作者之所以把项目命名为“ASP.NET Boilerplate”,就是希望它能成为开发一般企业WEB应用的新起点,直接把ABP作为项目模板。   ABP是什么? ABP是为新的现代Web应用程序使用最佳实践和使用最流行工具的一个起点。可作为一般用途的应用程序的基础框架或项目模板。它的功能包括: 服务器端: 基于最新的.NET技术 (目前是ASP.NET MVC 5、Web API 2、C# 5.0,在ASP.NET 5正式发布后会升级) 实现领域驱动设计(实体、仓储、领域服务、领域事件、应用服务、数据传输对象,工作单元等等) 实现分层体系结构(领域层,应用层,展现层和基础设施层) 提供了一个基础架构来开发可重用可配置的模块 集成一些最流行的开源框架/库,也许有些是你正在使用的。 提供了一个基础架构让我们很方便地使用依赖注入(使用Castle Windsor作为依赖注入的容器) 提供Repository仓储模式支持不同的ORM(已实现Entity Framework 、NHibernate、MangoDb和内存数据库) 支持并实现数据库迁移(EF 的 Code first) 模块化开发(每个模块有独立的EF DbContext,可单独指定数据库) 包括一个简单的和灵活的多语言/本地化系统 包括一个 EventBus来实现服务器端全局的领域事件 统一的异常处理(应用层几乎不需要处理自己写异常处理代码) 数据有效性验证(Asp.NET MVC只能做到Action方法的参数验证,ABP实现了Application层方法的参数有效性验证) 通过Application Services自动创建Web Api层(不需要写ApiController层了) 提供基类和帮助类让我们方便地实现一些常见的任务 使用“约定优于配置原则”   客户端: Bootstrap、Less、AngularJs、jQuery、Modernizr和其他JS库: jQuery.validate、jQuery.form、jQuery.blockUI、json2等 为单页面应用程序(AngularJs、Durandaljs)和多页面应用程序(Bootstrap+Jquery)提供了项目模板。 自动创建Javascript 的代理层来更方便使用Web Api 封装一些Javascript 函数,更方便地使用ajax、消息框、通知组件、忙状态的遮罩层等等   除ABP框架项目以外,还开发了名叫“Zero”的模块,实现了以下功能: 身份验证与授权管理(通过ASP.NET Identity实现的) 用户&角色管理 系统设置存取管理(系统级、租户级、用户级,作用范围自动管理) 审计日志(自动记录每一次接口的调用者和参数)   ABP不是什么? ABP 提供了一个应用程序开发模型用于最佳实践。它拥有基础类、接口和工具使我们容易建立起可维护的大规模的应用程序。 然而: 它不是RAD工具之一,RAD工具的目的是无需编码创建应用程序。相反,ABP提供了一种编码的最佳实践。 它不是一个代码生成工具。在运行时虽然它有一些特性构建动态代码,但它不能生成代码。 它不是一个一体化的框架。相反,它使用流行的工具/库来完成特定的任务(例如用EF做ORM,用Log4Net做日志记录,使得Castle Windsor作为赖注入容器, AngularJs 用于SPA 框架)。   就我使用了ABP几个月的经验来看,虽然ABP不是RAD,但是用它开发项目绝对比传统三层架构要快很多。 虽然ABP不是代码生成工具,但因为有了它,使我们项目的代码更简洁规范,这有利于使用代码生成工具。 我自己使用VS2013的Scaffolder+T4开发的代码生成器,可根据领域对象的UML类图自动生成全部前后端代码和数据库,简单的CURD模块几乎不需要编写代码,有复杂业务逻辑的模块主要补充领域层代码即可。这样就能把时间多花在领域模型的设计上,减少写代码的时间。   下面通过原作者的“简单任务系统”例子,演示如何运用ABP开发项目 从模板创建空的web应用程序 […]

龙生   24 Mar 2019
View Details
1 115 116 117 280