Kevin Zhang

36 posts

centos7 mini 安装virtualbox

这篇文章主要针对linux纯命令行环境下安装windows的需求。 安装Virtualbox 下载 rpm 安装扩展工具包 vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack 创建虚拟机 VBoxManage createvm --name "Windows XP" --ostype WindowsXP --register 配置虚拟机,以下命令也可以合并到一行完成 vboxmanage modifyvm win2003 --ostype Windows10 配置系统类型,如果不是win10 32位可以通过vboxmanage list ostypes查找下 vboxmanage modifyvm win10 --memory 2048

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

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

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</id> <url>https://hub.spigotmc.org/nexus/content/

嵌入式

行人识别位置过滤总结

数据统计 数据统计工作是为了获得行人位置的分布区间。统计方法为计算不同高度下的行人ROI上边界和下边界距离假设的水平线的距离。 通过在DetectModule输出结果的部分插入以下代码实现统计: if (roi->height < 200) { count[1][roi->height >> 2] += (240 - roi->y - DST_START_COL); //此处统计上边界距离水平线距离 count[0][roi->height >> 2]++; for (int i = 0; i < 50; i+

嵌入式

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

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

嵌入式

行人识别算法的系统设计

模块化设计 行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 单一职责原则 **定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 **实现:**对系统功能模块化,每个模块只负责自己的功能。 里氏替换原则 **定义:**如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化。 **实现:**定义存储函数接口的结构体,在结构体中定义函数接口。不同的模块提供一个构造函数,在构造函数中申明接口实现并返回该结构体。针对不同的实现只需要将结构体中的函数接口指向不同的实现,上层模块的调用不会有感知。 依赖倒置原则

笔记

前端开发知识总结

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

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的路由都放到某个子路径下面有助于简化后台重定向时的匹配复杂度。 默认页面的处理 正常访问网址是默认地址是登录页面。 凡是带APP的子路径的地址,默认返回Angular2的数据,否则重定向到首页。

数据库

Mongodb 的索引管理

为了提高数据库的存储效率,需要为常用的检索字段添加索引,这里做一下整理: 创建索引 创建普通索引 db.collection.ensureIndex({"KEY":1}) 这里就为collection中KEY字段添加了増序的索引,改成-1就是降序。 创建唯一索引 db.collection.ensureIndex({"KEY":1},{"unique":true}) 这里增加了{"unique":true},唯一性索引和mysql中的概念相同。 创建稀疏索引 db.collection.ensureIndex({"KEY":1},{"sparse":true}

服务器

Mongodb 用户安全策略配置

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

嵌入式

DSP开发技巧

DSP侧如何统计具体函数运行时间? TI DSPC64x+内核有一个64位的硬件定时器(Time Stamp Counter),它的频率和CPU频率一致。 最简单的办法是使用TSC的低32位TSCL。注意在DM644x中,TSCH用于ARM。 #include void main (){ … TSCL=0; … t1=TSCL; my_code_to_benchmark(); t2=TSCL; printf(“# cycles == %d\n”, (t2-t1)); } 来源:http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=61575

使用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 ENV USER root RUN apt-get update && \ apt-get install -y

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,提取一些公用的内容,把这种方案的特点发挥到极致。 对于页面中绑定的事件等操作,可以不用写上一串选择器,因为绑定是运行时实时生效,不会因为页面切换导致绑定到其它class上面去了。 view层函数的结构 在写view层方法的时候,我习惯于写上init和load两个方法,其中init负责初始化事件监听,load负责加载和渲染页面,

嵌入式

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

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

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

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

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

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

Ghost博客忘记密码处理

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

嵌入式

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时也可以流程的执行。 但是,加入PRD触发的频率大于视频输入帧率的时候,vpfe无法及时提供视频帧,导致FVID_exchange失败。由于文档中并没有提失败时的算法内部处理流程,因此我们按照文档中说明的FVID_exchange是FVID_queue和FVID_dequeuer的集合,将这个方法结构,且不对异常进行处理。

笔记

高级数据库复习整理

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

服务器

使用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 -i eth1 -p gre -j ACCEPT 重启防火墙 firewall-cmd --reload 来源贴吧:http:

竞赛

微软2016年“编程之美”复赛题目翻译

Microsoft Academic Graph (MAG) is a large heterogeneous graph containing entities such as authors, papers, journals, conferences and relations between them. Microsoft provides Academic Knowledge API for this contest. The Entity attributes are defined here. MAG是一个大型异构图,包含有作者、论文、期刊、会议以及他们之间的关系等实体信息。M$为这是比赛提供学术知识API。其中实体属性的定义如下: Participants

皖ICP备13007154号-1