博客

  • 在Pune

    在Pune

    到Pune已经一周了,今天难得有一天周六休息,感觉特别惬意。

    在Pune的办公室条件特别好,也可能是刚刚建成,人不多的原因吧。

    上几张图先

    办公室

    茶水

    滑板

    办公室

    吃的东西的话各种酱。。。不过一般的快餐和饭还是有的,基本可以将就一下。

    交通是比较坑的,出行基本靠电动三轮车,还是可以打表的那种。…

  • libGDX中的手势识别

    看到群里面很多人在自己做手势识别的东西,其实Libgdx提供了一个GestureDetector来专门处理这个问题。

    常用的情况有以下几种:

    • touchDown 用户触碰屏幕
    • longPress 用户长按屏幕
    • tap 快速触碰
    • pan 平移
    • zoom 双指的缩放行为

    很明显,GestureDetector是事件驱动的。使用的时候需要实现一个GestureListener,然后将其作为参数传入GestureDetector。

    publicclass GListener implements GestureListener{
    
    @Override
    publicbooleantouchDown(float x,float y,int pointer,int button) {
    
    returnfalse;
    }
    
    @Override
    publicbooleantap(float x,float y,int count,int button) {
    
    returnfalse;
    }
    
    @Override
    publicbooleanlongPress(float x,float 
  • 升级Hexo

    今天把Hexo从2.5.7升级到2.7.1了。之前由于一点问题一直没有升级,今天才看到2.6以后Hexo把render从核心剥离了,需要单独安装才行。

    npminstall hexo-renderer-ejs --save
    npminstall hexo-renderer-stylus--save
    npminstall hexo-renderer-marked--save

    这样就可以使用了。

    另外,公司发了Mac,但是我在Mac上死活运行不起,还是换成ubuntu才行了。不知道具体是什么问题,暂时不管了。…

  • libGDX的多语言和国际化

    Android自身提供了多语言解决方案,但是使用Libgdx开发游戏的时候应该尽量避免使用平台特殊的代码。
    如果使用Android提供的方案那么在桌面的调试就有困难,使用Libgdx自身提供的是最方便的。
    Libgdx目前已经Locale来解决这个问题。

    简介

    从技术上将多语言国际化是指在开发设计上能够实现增加对语言的支持而不需要大规模修改代码。国际化主要解决游戏和应用在不同语言区域的适应性问题。
    Libgdx提供了一套解决方案,以I18NBundle类为中心。
    宏观来看它的操作和Android原生解决方案类似,也是后缀语言代码来处理的。

    结构

    语言文件时一个个独立的配置文件,其名称是由基本名称加上语言代码组成。比如游戏superjump它的语言文件如下:

    • superjump
    • superjump_de
    • superjump_en_GB
    • superjump_fr_CA_VAR1

    一定确保拥有一个默认配置,即superjump.properties,而其他的语言文件根据自身的需要增加吧。
    语言文件的格式很随意,使用键值方式组合,比如:

    gameName=SuperJump
    newMission={0}, you have a new mission. Reach level {1}.
    highScoreTime=High score achievedon {0,date}at {0,time}

    语言文件本身支持按序号赋值和按名称赋值。
    而中文化的语言文件可以写做:

    gameName=超级跳跳人
    newMission={0},,你有一个新任务,完成管卡{1}。
    highScoreTime=最高分为{0,time},获得时间{0,date} 。

    替换规则使用的是java.text.MessageFormat

  • Pmd静态分析和OnlyOneReturn问题

    Pmd是一款静态代码分析工具,可以分析处理一些简单的问题。

    和Gradle也可以结合在一起用,运行gradle check就会运行pmdMain和pmdTest。

    Pmd的分析基于RuleSet,即预设的规则,我一不留神开了Controversial Rules,然后就是一堆Error。

    Pmd和RuleSet

    Pmd的分析基于RuleSet,而每一个Rule都是由一个Java文件定义的,一般继承自 AbstractRule。

    比如TooManyFields就继承了AbstractRule,然后在规则中判断了field数量,阈值DEFAULT_MAXFIELDS是15。

    publicclass TooManyFields extends AbstractRule {
    privatestaticfinalint DEFAULT_MAXFIELDS =15;
    ...
    }

    而常用的规则有

    • basic
    • naming
    • unusedcode
    • design
    • imports
    • junit
    • string
    • braces
    • codesize

    就我个人而言,我觉得unusedcode和imports基本是不需要的了,现在的IDE可以解决这两个问题。

    而basic包含了一些基本的,比如catch不为空,同时复写hashcode和equals等等,codesize检测过长的类和方法提示你重构。

    Controversial Rules

    因为新的项目我是重新配置的pmd,所以随手开了Controversial …

  • 利用Packr打包Libgdx游戏到PC端

    平时最常用的是Java语言,写出的Java程序一般用Gradle Application插件打包一下。这样就有不同平台的启动文件,基本也算不错的解决方案。

    但这样求用户本身有Java环境,而且这个条件不一定能够满足,还需要自己打包一下环境。

    因为Libgdx框架做出来的东西也有这个需求,所以它专门提供了一个packr工具来解决这个问题。

    命令行直接操作

    packr提供一个with-dependencies包,可以直接运行,在命令行使用即可。

    java -jar packr-1.0-SNAPSHOT-jar-with-dependencies.jar 
    -platform mac 
    -jdk"openjdk-1.7.0-u45-unofficial-icedtea-2.4.3-macosx-x86_64-image.zip" 
    -executable myapp 
    -appjar myapp.jar 
    -mainclass"com/my/app/MainClass" 
    -vmargs"-Xmx1G" 
    -resources pom.xml;src/main/resources 
    -minimizejretrue 
    -outdir out

    因为打包一般针对不同的平台,所以platform的选项为windows,linux或者mac。

    jdk最后指定本地文件,当然网络地址也可以。

    executable是可以执行文件的名称,不包含后缀。

    appjar是你打包好的jar文件,mainclass是启动主类。

    如果需要的话可以通过vmargs指定vm参数,比如-Xms512m -Xmx1024m

    minimizejre可以缩小一点暂用空间。

    Json配置

    如果自动打包的话Json配置稍微好一下,比拼解好看多了。

    {
    "platform":"linux",
    "jdk":"/Users/badlogic/Downloads/openjdk-1.7.0-u45-unofficial-icedtea-2.4.3-linux-x86_64-image.zip",
    "executable":"superjump",
    
  • Libgdx内存管理和对象池

    Libgdx是跨平台的,而一般为了开发方便我们是在PC端调试,同时周期性地在Android平台测试。

    通常而言,PC端的性能远高于Android平台,特别是对于模拟器而言,所以内存和效率开销是一个需要重点注意的问题。

    游戏也是一种重资源应用。图片、音效、动画等等都会占用相当客观的内存,但同时它们又是被JAVA的GC所管理的,而有时候这不是很好的选择。

    可以手动释放的资源

    Libgdx中定义了Disposable接口,实现了该接口的所有类都可以在生命周期结束时手动控制。

    以BitmapFont为例,它使用Batch进行绘制,而所有文字都缓存于BitmapFontCache中。那么在声明周期结束时需要手动释放掉它所用的资源。

    publicvoiddispose () {
    if (ownsTexture) {
    for (int i =0; i < regions.length; i++)
    regions[i].getTexture().dispose();
    }
    }

    其他常用的实现了Disposable接口的类有

    • AssetManager
    • Bitmap
    • BitmapFont
    • BitmapFontCache
    • DecalBatch
    • ETC1Data
    • Mesh
    • FrameBuffer
    • Pixmap
    • PixmapPacker
    • ShaderProgram
    • Skin
    • Texture
    • Stage
    • TextureAtlas
    • TileMapRenderer
  • hexo发布问题

    自从博客园迁移出来我一直使用的hexo,优点什么就不用多说了,方便快捷,markdown语法支持,生成静态博客对空间要求低。

    经过一段时间的使用还是有些感触,比如在发布上。

    发布站点

    因为hexo是静态博客,当你的博客中博文较多时页面就比较多了。每添加一个新的tag就会多出一个页面,这样的情况下用ftp部署就会比较慢。

    我使用的godaddy的空间,它默认支持ssh,所以我用git hook建立了一个git仓库来部署,时间上节约了不少,但是这样对环境就有了依赖,没法做到处处书写的享受。

    因为hexo需要nodejs支持,而git部署的时候也有公钥密钥的问题(当然你可以输账号和密码),还有一点就是你需要保有你原有的所有post文件。

    我平时在我的笔记本上写东西,回家一般不带它,回家写点东西只能等用笔记本的时候在发布了,感觉不是很方便,隐隐约约有点想换到wordpress的冲动了,但想想以后估计会换一个其他空间,还是静态博客适应性最好。

    安装一个ubuntu在u盘上

    我尝试过安装一个u盘版本的ubuntu,在其上配置一个相应的环境,这样可以行但是总觉得有点慢。也尝试了使用vargant+chef的模式去启动虚拟机发布,但这样也需要环境依赖。毕竟安装一个virtualbox也是多简单的事情。

    独立运行的环境

    我现在的想法是有一个便携式的hexo。因为nodejs的运行环境本身是可以做成绿色版的,然后每次启动一个脚本写入环境变量再启动环境就可以了,这样就可以保证随时都有一个hexo书写环境,不过git发布的话还是需要导入密匙。

    反思

    总的来说hexo还是一个相当方便的东西,而且作者的维护很迅速,新的功能需求也跟进很快,赞一个!

    最近在考虑用七牛最图床,不知道靠谱和方便不……

  • 从Grunt迁移到Gulp

    Grunt是js的自动构建工具,使用很方便,自从接触以后一直在使用。

    Gulp是一个新的构建工具,和Grunt的区别没有深入研究,目前只觉得有一个管道流。不过Grunt也会支持流了,应该差不多。

    碰巧看到Hexo也将构建工具从Grunt换到Gulp了,很是好奇,所以用了一个小项目来试试Gulp的好处。

    环境和配置文件

    Grunt有一个Grunt-Cli,而Gulp直接安装Gulp就行了。

    npm install -g gulp

    而Grunt的配置文件叫Gruntfile.js,而Gulp是gulpfile.js

    插件的支持方面来看只要是一般的项目需要的还是有的,如果需求比较小众可能还是需要使用Grunt。

    迁移工作

    这里以hexo-migrator-cnblogs为例子,原来的Gruntfile如下:

    'use strict';
    
    module.exports =function (grunt) {
    require('time-grunt')(grunt);
    require('load-grunt-tasks')(grunt);
    
    grunt.initConfig({
    mochaTest: {
    test: {
    options: {
    reporter:'spec'
    },
    src: ['test/**/*.js']
    }
    },
    
  • 从Matlab到R

    本文无意讨论R和Matlab哪个好用,只是自己换语言时候的一点体会。

    在很长时间里都使用的Matlab,两年前尝试过换到Python,但由于种种原因没有成功。

    原来的Matlab是搞活动的时候买的正版,包含的包已不多,但是平时的使用也足够了。这几天整理了一下电脑,准备升级Matlab,然后发现问题来了。
    一是找不到当时购买的许可,二是不清楚当时买的许可能不能用在更新版本上。加之最近在学习Coursera上的The Data Scientist’s Toolbox课程,想想干脆换到R算了。

    整个过程蛮顺利的,本文是一个小记。

    下载和安装

    Matlab是一体化的,安装以后自带IDE。R的话除了安装R以外再安装Rstudio作为IDE使用,总大小80M左右。

    因为R和Rstudio都是开源的,所以许可什么的问题就不存在。

    安装好以后直接启动就可以了。

    常用语法的转化

    R是不兼容Matlab的语法的,所以需要了解一下二者的对应关系。

    最主要的参考是R for MATLAB users,它对比了常用语句。

    简单的语句还好,普通的帮助也能够正常使用,比如help(plot)

    Matlab中常用两句话clearclc,前者情况当前工作区的变量,后者清屏。这两个语句都不能在R中使用。

    R提供了rm方法来删除当前工作区变量

    rm (..., list = character(), pos = -1,
    envir