我的世界游戏插件开发总结

在开发一个游戏插件时,有些东西是可以共用的,有些东西则是每个游戏单独有的。如何将这些内容区别开来,将共用的抽象成库,有助于提高以后的开发速度 可以共用的部分 一套更加完善的命令处理机制 bukkit自带的命令处理机制并不完美,需要写很多重复的代码,比如判断命令发送者的权限,是否是玩家等等,通过写一个代理来执行可以有效降低代码量。 在上一步的思路上,设计一套Annotation接口,把每个命令的要求通过Annotation配置,效率可以大大提升。 游戏初始化的逻辑 玩家排队的相关逻辑,如按顺序进入游戏、延迟传送等 一些游戏启动,监听加载的逻辑 游戏状态的控制 一个游戏从启动到结束的生命周期是类似的,由系统托管生命周期也有助于减少工作量 不可以共用的部分 每个游戏的逻辑 虽然很多游戏有相似之处,如:跑酷类型的游戏都是又一个点跑到另一个点,但是提取这种共用逻辑的价值不大,基本上没有重复使用的价值。

  • Akkz
2 min read
spigot

Spigot开发文档整理

由于Spigot插件在不断更新,很多已有的中文文档已经不再适用,因此编写这篇文档对Spigot的官方教程做整理和翻译。 这份文档是为具备Java基础的开发者准备的,一些关于项目创建的过程直接略过了,只整理开发插件的核心内容。 新建项目 新建一个Java或Maven项目 导入spigot-api和bukkit的jar包 这里可以在https://hub.spigotmc.org/nexus/#welcome中搜索spigot-api和bukkit,下载自己所开发版本对应的包,下载并拖到项目依赖中。 如果不想手动下载,可建一个Maven项目,加入下面的repositories依赖,再把搜索结果右下方的信息复制到Maven的配置文件中,更新一下即可。 <repositories> <repository> <id>spigot-repo<

  • Akkz
4 min read
嵌入式

红外行人识别系统标记方法

在行人识别的最后步骤,需要对识别出的行人进行标记。通常在实验阶段往往只是把ROI的框涂出来,但是在工程阶段,需要更加精细的标记方法以获得更好的用户体验。 经过总结,标记的ROI需要满足以下需求: 只标记人的身体部分,不填或少填无关的部分; 标记部分显示黄色,颜色深浅随着roi的置信度变化; 设计思路: 一般人体的亮度均大于背景,因此可以设置一个阈值,只标记高于阈值的像素,实现只标记人体部分。 我们红外图像只有亮度信息,对应到RGB色域中,RGB的值就是亮度的值。因此我们可以调高R和G的值来提高黄色的色度,降低B的值来增加颜色的深度。只要R和G的值一样且大于B就能获得理想的效果。 那么开始设计: 去除背景部分 经过测试,行人身体的亮度大都大于192,因此只标记亮度大于192的像素。 通过两个像素的均值确定需要填图的黄色色度 yy = (ptr[current + 1] + ptr[

  • Akkz
2 min read
嵌入式

行人识别算法的系统设计

模块化设计 行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 单一职责原则 **定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 **实现:**对系统功能模块化,每个模块只负责自己的功能。 里氏替换原则 **定义:**如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,

  • Akkz
2 min read
笔记

前端开发知识总结

总结分三大部分:html、css和javascript,每部分再分成两个子部分,分别是基础知识和记忆知识。 基础知识指前端开发必须会的东西,比如页面渲染方式、js基础语法等。 记忆知识指一些单纯背背就可以的知识,忘记的话可以查,但是免试官可能喜欢问(哭笑 Html相关 浏览器内核 [记忆知识] 浏览器内核又可以分为渲染引擎和js引擎两部分,后来js引擎越来越独立,内核也就更倾向于指渲染引擎本身的部分。目前常见的内核引擎有Trident、Gecko、Blink、Webkit四种。 Trident 微软开发的内核,从IE4一直用到现在IE11。因为有过一段时间比较牛逼,拖更了很久,导致其与W3C标准脱节,加上大量BUG和安全问题都没有解决,导致现在很多用户用IE是为了下载其它浏览器。现在Win10最新的Edge浏览器已经不用这个内核,而是用自己开发的edge内核。 Gecko

  • Akkz
9 min read
个人

个人简历

技能简介 具有前端项目的设计与开发能力,可以承担基于Express框架的后台应用和基于Backbone、Angular2前台应用的开发任务。具备分析客户需求并设计模块结构的能力,会使用Grunt实现自动化构建。 具备后台开发基础,已有SpringMVC和ThinkPHP开发应用的经验。 对UI设计具有自己的见解,熟练使用Photoshop软件,本科曾在校新闻中心工作,负责论坛管理、PPT设计、视频制作等。 算法基础扎实,本科阶段曾获“第五届蓝桥杯全国软件和信息技术专业人才大赛”总决赛二等奖。 网络基础较好,本科曾在校网络中心实习过两年,负责一号宿舍楼的网络维护。 相关项目 房大鳄APP[已上线] 时间:2016.05 - 2016.6 工作内容:设计并开发房大鳄移动端的应用程序。 技术路线:

  • Akkz
4 min read
web前端

Angular2 的路由总结

Angular2的路由不像backbone是url#route这种结构,使用的是html5的pushstate方法直接从url中获得路由,这就需要进行一定配置才可以使angular2运行。 base href的配置 代码:<base href="/"> base href的配置关系到路由的有效数据的选取 base href同样关系到该网页的js、css等数据的获取,因此不能乱设定。 后台的配置 Angular2的路由方式使得用户刷新页面时,后台默认返回404错误。 需要在后台配置一下,当用户访问的路径为Angular2应用的路径时,返回Angular2首页的数据。(或者只要是匹配不到的路径,直接返回Angular2首页的数据) 注意是后台直接返回数据即可,不是重定向。 子路由的配置 Angular2的路由允许空component,一些目录可以不用配置component。 如果把APP的路由都放到某个子路径下面有助于简化后台重定向时的匹配复杂度。

  • Akkz
1 min read
服务器

Mongodb 用户安全策略配置

在网络上运行的mongodb服务,用户配置是必不可少的,但是目前大部分配置用户角色的资料都比较旧,有些方法甚至已经被遗弃,因此这里做一下整理。 1. 配置管理员 确定数据库启动时没有添加-auth参数,启动数据库 在admin数据库下新建管理员用户 use admin db.createUser( { user: "username", pwd: "password", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) 这里userAdminAnyDatabase参数是申明用户管理员权限,也可以改成admin就拥有所有权限了。

  • Akkz
1 min read

使用Docker部署vncserver

有时候出门在外,需要修改一个bug却苦于没有开发环境,一个远程的开发机的重要性便凸现出来。 传统的配置vncserver的方式需要安装大量的软件包,对于系统整洁强迫症来说便难以忍受。使用Docker的方式把整个环境打包,需要时启动,不需要时remove掉,不仅可以保持服务器干净整洁,还可以实现工作环境的快速迁移。 部署流程 寻找一个基础的vncserver的docker镜像,我这里在GitHub上找到一个不错的镜像:https://github.com/queeno/docker-ubuntu-desktop。它配置很简单,就是基于Ubuntu:16.04,安装tightvncserver和相关的软件包,然后把xstartup配置文件和passwd密码文件复制到镜像中(默认密码是password)。 FROM ubuntu:16.04 ENV DEBIAN_FRONTEND noninteractive

  • Akkz
2 min read
web前端

PhoneGap(Cordova)开发总结

软件架构设计 软件架构可以借鉴MVC的方式,View层负责页面跳转和事件监听,Controller层负责业务逻辑处理,Dao层负责数据发送和接收。 页面跳转/刷新时事件的注册与取消注册 大部分页面需要根据后台数据生成html,这就用到了html的模板技术。当使用类似于template7这类模板引擎时,如何管理生成页面的事件就成为了一个问题。 目前我探索出来的方式是,使用jQuery的on方法,把事件挂载在当前页面的根节点上,这样不管页面内容如何刷新都不会影响到事件的监听。 貌似一些类似于backbone的前端框架可以帮忙解决事件的监听问题。 与服务端数据交互时的问题 Ajax刷新时需要给用户一个等待的反馈,请求结束后也需要给用户一个结果的反馈,由于不同模块反馈的内容不一样,因此如何实现一个公用的方案也需要考虑。 我的想法是,配置一个公用的存储反馈内容的json对象,调用dao层方法的时候把配置和该对象一起传进去,减少业务层逻辑的复杂程度。 id、class与css选择器使用的问题 有时候为了好看,在写css选择器的时候会写上一串限制的参数,如果对于一些经常复用的class这应该是个好方法,但是我发现用着用着就把class当id用了,很多定义的class只使用了一次。我觉得以后在开发前先大致设想好自己想使用的class,

  • Akkz
3 min read
嵌入式

DM6437上行人识别程序开发总结

最近完成了DSP平台上行人识别程序的框架设计与实现,这里总结一下开发过程中遇到的问题及解决方案: 1. BIOS配置文件修改生效问题 CCS3.3编译程序的方式有increase build和build all两种方式,通常情况下如果只有改了某个文件,可以选择increase build来提高算法的编译速度。但是如果修改了配置文件,则一定要选择build all,否则修改无法生效。 2. 周期函数、软中断的配置问题 在BIOS中配置周期函数和软中断的时候,要注意中断配置的名称和它调用的方法不能同名,如果同名的话会导致配置失效。 3. 不同中断函数之间变量共享方式 多个中断函数需要共享某些变量时,可以使用闭包的方式,避免全局变量的使用。即将这几个函数定义在一个.c文件中,使用static修饰共享的变量。 4. 模块复用性提高 上面闭包的方式可以使多个软中断函数共享变量,但是这种设计会降低模块的复用程度,

  • Akkz
2 min read

使用Docker+OSS部署大容量云盘

最近云盘开始普遍关闭,百度云的用户体验也越来越差。所以组建了自己的云服务系统,便于使用。 之前尝试过用Docker部署OwnCloud,使用非常方便,但是由于云服务器磁盘价格较贵,因此仅能作为常用文件的同步盘,无法应用于大量文件存储的场景。OSS相对相比云盘来说,存储价格要低很多,1T一年大概1000块左右,如果把OSS当做磁盘挂载到服务器上,再配合OwnCloud便可以以非常低廉的价格享用高质量的云存储服务。 初步设想 在ECS上安装Docker完成OwnCloud服务的部署 使用ossfs完成OSS虚拟磁盘的需求 使用阿里的免费证书实现Https加密 技术路线 docker实现OwnCloud的一键安装 docker-compose负责容器管理 ossfs实现将oss挂载到本地 supervisord来维护ossfs进程 搭建步骤 安装OSSFS - 这里可以参考阿里的[官方文档](https://github.com/aliyun/ossfs)

  • Akkz
4 min read

基于DM6437上开发的行人识别程序的结构分析

行人识别在未来辅助驾驶领域会发挥重要的作用,但是在嵌入式上实现时,必须面对处理器性能问题。因此需要对算法进行调整与优化,以适应于DM6437上运行。 行人识别算法类型的分析 通过总结行人识别的算法流程,可以分为两大类: 需要定时执行的算法,如视频帧的交换、路面识别算法。这类算法并不需要太多的计算量,但是对实时性较敏感,需要按时执行。 需要持续执行的算法,如行人识别算法。这类算法计算量较大,但是实时性要求较低,这类算法可配置让他在CPU空闲状态下持续运行。 行人识别算法框架设计 通过上面的分析可以看出,行人识别算法的执行依赖于底层的定时器,软中断和任务,但是直接针对算法配置这些功能并不是最佳选择。随着硬件价格不断下降和算法复杂性的增加,硬件平台就有更换的必要,如果算法太过于依赖底层平台,会给更换平台带来巨大的工作量。因此,需要通过服务层完成对底层平台的适配,为算法屏蔽底层的细节,以服务的逻辑为上层算法提供定时执行服务。 针对定时执行的算法,

  • Akkz
2 min read

Ghost博客忘记密码处理

如果账号被锁,且没有配置邮箱的话,就必须通过修改数据库的方式找回密码了。 步骤 找到ghost.db的位置,我的在/var/lib下面(用docker部署的)。 如果找不到的话,可以用find / -name "*.db"来找; 生产环境下数据库为'ghost.db',开发环境下数据库为'ghost-dev.db'。 安装sqlite3,并用sqllite打开数据库。 sqlite3 ghsot.db 查找账户并重置密码。 查看账户列表 select * from users; 修改密码 update

  • Akkz
1 min read
嵌入式

DM6437 使用PRD操作VPFE和VPBE时视频帧异常问题修复

为了将算法执行流程与视频流交换流程分开,需要使用PRD出发软中断,再执行算法或视频流交换操作。 但是在实践中发现,当视频流交换函数触发的时钟周期为50ms时,会随机出现部分视频帧为旧数据的问题,造成视频播放时内容回跳,非常影响显示效果。经过试验,排除了缓冲区过小,硬件计算性能等问题,最后将问题锁定在vpfe和vpbe时数据交换失败上,并解决。 原理说明 在解决问题前首先需要理解sdk中视频帧交换的过程,在DSP/BIOS VPFE Device Driver User's Guide中可以查到,vpfe和vpbe各有两个缓冲队列READY Queue和FREE Queue,它们会不断从READY队列中存入/取出数据,并放入FREE队列中。使用FVID_exchange可以将一个空的buffer加入READY队列并从FREE队列中取出一帧,这也是例子中所推荐的方法,在未使用PRD时也可以流程的执行。 但是,

  • Akkz
2 min read
笔记

高级数据库复习整理

数据 什么是数据? 数据是一系列对象及他们的属性的集合 属性指对象的特征 一个属性的集合描述一个对象 结构化数据和非结构化数据 结构化数据: 结构定义完整,具有数据模型,可以使用二维表表示 (传统的关系数据模型、行数据,存储于数据库) 非结构化数据: 没有很好的定义结构,不可以用数据模型或二维表表示 (类似XML、HTML之类,自描述,数据结构和内容混杂在一起) 半结构化数据: 部分定义良好,没有数据模型 (各种文档、图片、视频/音频等) 数据属性 属性分为数值型和符号型 属性和属性意义的关系 相同的属性可能有不同的意义 高度属性可以用英寸也可以用米衡量 不同的属性可能有相同的意义

  • Akkz
11 min read
服务器

使用Firewalld时,配置PPTPD的注意事项

因为最新的CentOS7用的已经是Firewalld了,由于该防火墙下策略配置与iptable-service有比较大的区别,因此在这里列一下: 完整的防火墙配置 添加masquerade firewall-cmd --add-masquerade firewall-cmd --permanent --add-masquerade firewall-cmd --query-masquerade 查看服务 firewall-cmd --list-services firewall-cmd --list-port 添加PPTP端口和GRE协议 firewall-cmd --permanent --zone=public --add-port=1723/tcp firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0

  • Akkz
1 min read

Subscribe to 咚咚咚的小极客

皖ICP备13007154号-1