照着PDF做了个摇杆并实现了 摇杆控制角色行走, 在这里贴下代码做下笔记。
首先新建了一个VIEW 继承SurfaceView 实现相关接口
<pre name="code" class="java">
public class PlayerView extends MapView implements Callback,Runnable
more >>
分享个人经验见解
需要引入的头文件
#include "cocos2d.h"
#include "Box2D\Box2D.h"
#include <string>
创建物理世界
world = new b2World(b2Vec2(0,-10));
- bird = Sprite::create("bird0_0.png");
- bird->setName("bird");
- Size size = bird->getContentSize();
- b2BodyDef def;
- def.type = b2_dynamicBody;
- def.position = b2Vec2(screenSize.width / 4 / RATIO, screenSize.height / 2 / RATIO + 1);//鸟的位置
- b2PolygonShape shape;
- shape.SetAsBox(size.width/2/RATIO,size.height/2/RATIO); //碰撞体积?
- b2FixtureDef fixtureDef;
- fixtureDef.density = 1;
- fixtureDef.friction = 0.3;
- fixtureDef.shape = &shape;
- b2Body *body = world->CreateBody(&def);
- body->CreateFixture(&fixtureDef);
- addChild(bird);
- bird->setPosition(Point(def.position.x*RATIO, def.position.y*RATIO));//物理物体会自动往下掉 因此绑定物理物体的位置到sprite上 就形成了物理
- body->SetUserData(bird);//与sprite绑定
- this->body = body;
- void HelloWorld::bingSprite(){ //让物理盒子和精灵实时绑定来达到物理效果 物理盒子本身是看不到的
- Sprite *s;
- for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()){
- s = (Sprite*)b->GetUserData();
- if (b->GetUserData() && b->GetType() == b2_dynamicBody||b->GetType()==b2_kinematicBody){
- if (s != NULL){
- s->setPosition(b->GetPosition().x*RATIO, b->GetPosition().y*RATIO);//每次渲染都让sprite与box body保持位置绑定
- }
-
- }
- }
- }
more >>
pagehelper-sprng-boot-starter 和mybatis-plus-spring-boot-starter 同时引入启动时会报错,即使按网上的排出pagehelper-starter的mybatis包依旧报错,具体解决办法如下:
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper</artifactId>
- <version>5.1.10</version>
- </dependency>
- <!-- pagehelper 依赖 -->
- <dependency>
- <groupId>com.github.jsqlparser</groupId>
- <artifactId>jsqlparser</artifactId>
- <version>2.1</version>
- </dependency>
-
-
-
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>${mybatis-plus.version}</version>
- </dependency>
不要使用pagehelper-starter
然后手动添加pagehelper mybatis拦截器:
- package com.xh.sdk.springcloud.config;
-
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
- import com.baomidou.mybatisplus.core.MybatisConfiguration;
- import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
-
- @Configuration
- public class MyBatisPlusConfig {
-
- /*
- * 分页插件,自动识别数据库类型
- * 多租户,请参考官网【插件扩展】
- */
- @Bean
- public PaginationInterceptor paginationInterceptor() {
- return new PaginationInterceptor();
- }
-
-
- @Bean
- ConfigurationCustomizer mybatisConfigurationCustomizer() {
- return new ConfigurationCustomizer() {
- @Override
- public void customize(MybatisConfiguration configuration) {
- configuration.addInterceptor(new com.github.pagehelper.PageInterceptor());
- }
- };
- }
-
- }
在微服务架构下开发权限控制一般的做法是,独立开发一个专门用于鉴权的服务,其它服务每次请求接口时都调用鉴权服务鉴权,这样做的好处是,代码耦合低,权限控制功能好扩展,其坏处是每次鉴权都要请求鉴权服务,增加服务器资源消耗,因此我弄了一个简单的权限验证,能满足接口级别的验证,不通过专门的鉴权服务,而是每个服务自己去验证权限。
并非每个服务都需要验证权限,因此我们可以定义一个类似@EnableDiscoery 这样的注解开关来控制:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- @Documented
- @Import(AuthenticationInterceptor.class)
- public @interface EnableAuthentication {
-
- }
关键代码是@Import,当你在代码中使用了@EnableAuthentication 注解时,spring 会自动扫描并加载Import注解中的AuthenticationInterceptor类
more >>
突然发现自己以前常用的parent_id ,node_id这种简单直观的树形结构设计效率很低,数据量一大,就需要不停迭代寻找节点,于是这几天学习了新的数据结构(modified preorder tree traversal),在此做下笔记。
此数据结构的好处是查询非常快,当网站查询树形数据比修改多时使用此结构会比较好,一般用于电商网站的商品分类,查询仅仅需要判断left> ? right <?这样即可,缺点是修改节点表数据量大时很慢,而且操作复杂一点。
附最新更新: 左右值树形移动节点方法]
左右值数据结构网上教程很多,不再赘述,总结一下就是:要保持父节点右值比所有子节点的右值大,左节点左值比所有子结点左值小 。
直接上代码,上面有注释 ,说明了如何找子节点,如何找父节点、删除节点,同级平移,兄弟节点前插入等(基于postgreSQL数据库)。
- CREATE TABLE "public"."t_test" (
- "id" int4 NOT NULL DEFAULT nextval('"T_TEST_ID_seq"'::regclass),
- "name" varchar(255) COLLATE "pg_catalog"."default",
- "l" int4,
- "r" int4,
- "level" int4,
- "other" varchar(255) COLLATE "pg_catalog"."default",
- "status" int2 DEFAULT 0,
- PRIMARY KEY ("id")
- )
- ;
more >>
之前写过一遍比较粗略的jenkins + docker部署文章,这次有时间,认真的写一遍比较详细完整的jenkins +docker部署文章,由于有时间所以这次就多写一点吧,记录下我自己对docker的看法,以及它的作用,若有不对之处还请指出。
其实一般的小型项目是用不上也没有必要使用docker的,docker的作用是资源隔离以及快速部署,在项目比较小的时间我们完全可以手动上传jar/war 包到服务器上,并输入命令启动即可,但是,想像一下如果你用上了微服务,好几个团队开发,那么这些服务加起来可能有好几十个,这个时候再手动去部署,想想看你要做什么? 1、安装 JDK 2、配置环境变量 3、安装一些必要的软件如TOMCAT之类的 4、等等不止这些,有些服务甚至有可能要修改JDK配置。
每部署一台机器都要做如此多的操作是不是得烦死?如果是这种情况下,那么docker就可以派上用场了,我们可以直接把安装好各种软件以及配置的系统环境打包成一个docker镜像并保存在某个镜像中心,然后其它服务器只需几行命令就可以轻松使用打包好的环境并完成部署了,而且由于各个docker容器之间是隔离了,一台机器可以部署多种镜像也不会有影响。
最近网上看到很多老程序员们在谈论中年危机,仿佛看到了几年后的自己,我自认为自己也不属于那无可替代的1%,而且自己也确实感觉到了行情不好(如工资下降,面试变少等),感觉自己有可能以后会不再干程序员,希望留下来的文章能够帮到其他人吧,好了,下面开始正题。
最好将jenkins和docker安装在同一台服务器上,当然不是同一台服务器也可以,只不过要多一个步骤,docker安装步骤如下,以centOs为例:
卸载旧版本:
- sudo yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-engine
设置docker存储库:
- sudo yum install -y yum-utils \
- device-mapper-persistent-data \
- lvm2
- sudo yum-config-manager \
- --add-repo \
- https://download.docker.com/linux/centos/docker-ce.repo
安装docker:
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker:
sudo systemctl start docker
测试docker:
sudo docker run hello-world
看到打印hello world! 就表示成功了。
more >>在调用微信支付接口中遇到各种问题,真不知道是哪个人才写的接口文档,几个简单的接口调了好几天。
1、小程序获取code2Session时errcode出错时是会返回错误码,但正常时居然连这个字段都不返回了,说好的正常返回0呢?
2、小程序支付的时间戳参数,在调用小程序支付接口时需要后台生成签名,有个timeStamp参数,文档上写的是当前时间,注意这里有个坑,它要的是到秒级别的,如果用java直接System.currentTimeMillis() 是不行的!会提示签名错误!
正确做法是: System.currentTimeMillis() / 1000
3、小程序支付签名时key是要拼接的,文档上没有写明,示例上是写的了搞得不知道以哪个为准。
4、建议所有签名统一MD5,否则 不知道哪个地方默认了其它签名就会签名通不过
5、小程序支付,也就是交易类型是JSAPI的情况下是要传openId的,另外appId appkey sercrt mechId 等有一个不对应就会报签名失败,这点要注意。
6、微信支付demo里代码的一个大坑,其中有一段:
- public WXPay(){
-
- if(useSandBox){
- signType = MD5;
- }else{
- signType = HMACSHA256
- }
- }
注意这里一定要改下,改成统一的MD5 :
- public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
- this.config = config;
- this.notifyUrl = notifyUrl;
- this.autoReport = autoReport;
- this.useSandbox = useSandbox;
- if (useSandbox) {
- this.signType = SignType.MD5; // 沙箱环境
- }
- else {
- //TODO 默认用MD5
- this.signType = SignType.MD5;
- }
- this.wxPayRequest = new WXPayRequest(config);
- }
否则你会发现接收支付成功结果通知的时候怎么老是签名不通过,然后再发现换成HMACSHA256就通过了,看文档里明明写的是默认MD5, 问题就出现在这,demo代码 默认却是HMACSHA256 !
7、沙盒模式测试时报金额不正确,这个问题我自己也不记得在哪看到的了,总之微信文档上是没找到,其原因是沙盒模式测试的金额(total_fee)必须是固定的330 !
另外,沙盒模式下的付款码是不能付款的,不能付款也就是说没法测试接收支付结果通知,只能上正式用1分钱测。
最后记一下接收支付结果通知spring mvc 的接收方式代码:
- @RequestMapping(value="receiveResult",consumes = {MediaType.TEXT_XML_VALUE},produces = {MediaType.TEXT_XML_VALUE})
- public String receiveResult(@NotNull @RequestBody String xml){
- //TODO
- ....
-
- }
算是比较偷懒了,不怕麻烦的建议用实体类加注解 接收
上一章里我们已经配置好了jenkins,接下来配置maven项目插件,pom.xml如下:
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>dockerfile-maven-plugin</artifactId>
- <version>1.4.9</version>
- <!-- 运行mvn 打包命令时会自动打包镜像并推送 -->
- <executions>
- <execution>
- <id>default</id>
- <goals>
- <goal>build</goal>
- <!-- 推送 -->
- <goal>push</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <skip>${dockerfile.skip}</skip>
- <!-- docker连接地址 -->
- <dockerHost>http://http://192.168.2.55:2375/</dockerHost>
- <!-- 测试推送到docker hub的仓库 -->
- <repository>yourAccount/${project.artifactId}</repository>
-
- <username>yourAccount</username>
- <password>****</password>
- <!-- 从master/target目录build -->
- <buildDirectory>${session.executionRootDirectory}/target/</buildDirectory>
- <!-- push镜像需要在maven中配置镜像地址,目录测试服务器的maven路径是/root/.jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven-3.6.0/conf -->
- <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
- <!-- 这个是你要在dockerfile里使用的maven变量,在此处配置后可在dockerfile里使用该 变量 -->
- <buildArgs>
- <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
- <SERVER_PORT>${dockerfile.port}</SERVER_PORT>
- </buildArgs>
- </configuration>
- </plugin>
该插件能帮助我们完成:
1、自动构建docker镜像
2、自动将docker镜像推送到远程库
3、半自动启动docker容器
在你的项目根目录新建一个dockerfile文件(名字就叫dockerfile,没有后缀),编辑内容,配置以下:
- FROM java:8-jre-alpine
- #FROM 使用java环境镜像
- #设置挂载目录,使用项目名作为日志文件夹,所有项目的日志统一都是spring.log,因此使用文件夹区分
- VOLUME /usr/docker/logs
- ARG JAR_FILE
- #将该项目的JAR添加到镜像中
- ADD ${JAR_FILE} app.jar
- #RUN bash -c 'touch app.jar'
- #配置该项目要映射出去的端口,目前和项目配置文件中端口不一样是为了测试用,生产请修改为一致的端口,如需使用配置文件中的端口,把--server.port=删除,并将EXPOSE修改为项目配置文件对应的端口
- EXPOSE 8399
- #jar运行命令
- ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar","--spring.profiles.active=test","--server.port=8399"]
该文件可以看作是docker容器的运行配置,其中FROM JAVA:8 配置了java环境的docker镜像,该镜像的版本号是:8-jre-alpine,远程镜像可以从duckerhub搜索,如果仅仅是运行java代码的项目,那么java镜像足以。
PS:如果是结构的maven项目,那么每个maven子项目都需要一个dockerfile,运行maven打包命令时要跳过parent项目打包,因为parent是一个空项目仅仅是用于配置通用的pom.xml , pom.xml插件配置中有这么一段:
<skip>${dockerfile.skip}</skip> ,表示是否跳过打包,在所有的parent 项目的pom.xml中添加如下配置即可:
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <dockerfile.skip>true</dockerfile.skip>
- </properties>
这样打包插件就不会打包parent项目了。
more >>
最近又重新弄了一下jenkins,虽然之前也有弄过但是都是在本地服务器部署,而且记录的不够详细,因此这次将写下详细部署过程。
下载地址:https://jenkins.io/download/ ,选择下载war包

下载完成后用FTP上传到服务器上输入启动命令:nohup java -jar jenkins.war --httpPort=7070 > jenkins.out 2>&1 & ,后面参数是启动端口。
启动完成后浏览器打开http://ip:7070 进入jenkins操作页面,此时会出现一个页面要求你输入密码,此时回到linux控制台,输入tail -100f jenkins.out 查看启动日志,注意看日志,它会打印你的初始密码,复制初始密码并点下一步,后面的操作按提示来就可以了,可以安装推荐的插件也可以自己选,下面将进入JENKINS配置步骤。
点击jenkins 系统管理->插件管理 点击available(可选插件)选项卡 ,在右上角的搜索框搜索并安装如下几个插件:
1、Git plugin Git client plugin
4、Gitlab Hook Plugin(可选)
再次点击JENKINS的系统管理 -> 系统设置 ,找到Publish over SSH这一栏,如下图配置要发布到该服务器上的连接配置

参数说明:
name:可以随便起 hostname:连接IP地址 Remote Directory: 远程文件夹路径,发布的项目将会在此目录下
username:账号 password:密码 , 除了用账号密码连接外还可以通过private key连接,由于麻烦我在这选择了账号密码连接
more >>
实用nginx反向代理可实现 url转发, 如输入www.cc.com 直接转发到 127.0.0.1:8080/project/ 实用nginx 可直接输入url就可访问到tomcat的某目录下 端口号也可不用输入 很适合2个域名用同一台服务器的情况
下面是nginx的conf配置
首先在nginx.conf引入 配置文件include vhost.conf;
新建vhost.conf
1 | ## Basic reverse proxy server ## |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true