作者: htynkn

  • android游戏开发框架libgdx的使用(二十一)—使用TTF字库支持中文

    android游戏开发框架libgdx的使用(二十一)—使用TTF字库支持中文

    好久没有更新这个系列的文章了。今天下午在群上讨论libgdx对中文的支持问题。本来Hiero做是最好的,但是LIbgdx的BitmapFont不支持多图,常用汉字3500个,是在做不到一张图上。

    libgdx很早之前就有ttf的支持了,不过那个时候有点问题。经测试新版本(0.96)完全支持,特地总结出来和大家分享。

    TTF字库

    TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式,应用范围非常广。

    如果是Windows操作系统,可以从Fonts文件夹中找到很多字库。也可以从网上下载。

    我推荐YaHei.Consolas字库,看着很爽,反正我的eclipse就是用的这个字库。

    gdx-setup-ui的使用

    从libgdx下载0.96版本,可以看到文件结构如下:

    libgdx-chinese-1

    强烈运行gdx-setup-ui.jar,这一个项目初始化工具。

    运行界面如下:

    libgdx-chinese-2

    项目名字,包名什么的按情况填写。在中间的Required配置中可以直接下载最新的稳定版本和Nightly版本。不过推荐选用本地的附件。

    libgdx-chinese-3

    不用解压,直接选择zip文件,它会自动抽取需要的文件。

    我使用的Eclipse,直接Import即可。

    libgdx-chinese-4

    我只生成了桌面项目,一般可以把Android和Web的一起生成了。

    注意一下,默认的Android项目对应的SDK是15,可以根据需要更改。有时候导入的项目会有红色感叹号,添加一个assets文件夹即可。

    libgdx-chinese-5

    其中back-libgdx项目是我们的核心,一切逻辑什么的都在这里实现。back-libgdx-XXX是对应的启动而已。

    libgdx使用TTF字库

    准备一个TTF字库改名为font.ttf复制到assets文件夹。从压缩包中找到gdx-stb-truetype-natives.jar和gdx-stb-truetype.jar。其中gdx-stb-truetype-natives.jar添加到桌面项目,gdx-stb-truetype.jar添加到核心项目中去。如图:

    libgdx-chinese-6

    现在来看看最关键的方法TrueTypeFontFactory.createBitmapFont。

    我们通过它创建一个支持ttf字库的BitmapFont出来。它需要一个FileHandle和要支持的文字。当然还有一些参数,具体意义可以参考API文档。

    也就是说我们需要使用TTF字库的哪些文字必须声明出来。不过问题也不到,3500常用汉字基本可以满足要求。网上还有一个常用500字,不过那个完全不够用。

    我这里随便写几个作为演示。

    publicstaticfinal String FONT_CHARACTERS ="世界人民爱好的美好中文支持再看看";

    然后使用初始化

    font = TrueTypeFontFactory.createBitmapFont(
    Gdx.files.internal("font.ttf"), FONT_CHARACTERS,12.5f,7.5f,
    1.0f, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    剩下的工作和使用Hiero一样的了。

    publicclass App implements ApplicationListener 
  • 基础工具–Guava-Libraries学习笔记(一)

    基础工具–Guava-Libraries学习笔记(一)

    什么是Guava-Libraries?

    Guava-Libraries是google对java的一个扩展,主要涵盖集合、缓存、并发、I/O、反射等等。

    它本来是Google内部所使用的一个类库,后来整理开源出来了。这套库的设计引入了很多新的理念,研究一下可能会使你对Java这门语言有新的认识和看法。

    地址:http://code.google.com/p/guava-libraries/

    这篇短文主要是关于Guava-Libraries基础工具,内容是我参考官方wiki和自己的使用体验结合而成。

    null的使用

    null在java中是一个很特殊的东西。它可以标识一个不确定的对象,比如

    Ojbect o =null

    同时在很多个集合中它代表key不存在,也可以代表值为null。

    null使用需要给外的小心,稍不注意就会出现很多问题。当然更多的时候只是单纯的觉得null不够优雅而已。

    Guava为我们提供了一个Optional的抽象类来解决这个问题。用类Present和Absent代表值存在和不存在。

    以下是一个例子:

    Optional possible = Optional.of(5);
    if (possible.isPresent()) {
    System.out.println(possible.get());
    }
    
    Optional absentValue = Optional. absent();
    if (absentValue.isPresent())
    System.out.println(absentValue.get());
    System.out.println(absentValue.or(-1));
    System.out.println(absentValue.orNull());
    System.out.println(absentValue.asSet());

    第一种是值存在的,第二种是值不存在的。执行效果如下:

    guava-1-1

    这里说明一下isPresent()方法是判断是否有值的。or方法是非null返回Optional的值,否则返回传入值。

    orNull()方法是非null返回Optional的值,否则返回null。

    我个人觉得or方法比较常用就是了。

    条件判断

  • java通过jna调用科大讯飞语音云实现语音识别功能

    java通过jna调用科大讯飞语音云实现语音识别功能

    说明:写本文时还没有提供java平台的,现在官方有java平台的sdk了,可以直接使用。本文已经没有太多实际意义了。

    语音识别技术

    语音识别就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令。语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术三个方面。说实话其中的技术比较多,要独立开发新的基本上不现实。所以自然把目光放到开源项目或者其他公司的API上面了。开源项目我尝试了SpeakRight和sphinx4,但是效果都是一般。AT&T的API老是申请不上,最后把目光放在科大讯飞上了。试用了一下,效果还行,但是它提供的Windows平台的API是C/C++的,我只懂点皮毛,所以稍微研究了一下通过Java调用它的语音云SDK。

    JNA

    java调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C另写一个共享库进行适配。而JNA是一个自动适配工具,通过它调用.dll只需要一个借口即可。

    官网:https://github.com/twall/jna/

    下载jna.jar即可。

    编写接口

    科大讯飞语音云主要提供语音合成和语音识别两个方面的东西,我主要使用语音识别这块的功能。

    建立接口QTSR,继承Library。

    将msc.dll等文件复制到项目根目录。

    jna-yuyinshibie-01

    加载msc.dll

    QTSR INSTANCE = (QTSR) Native.loadLibrary("msc", QTSR.class);

    然后来看一下msc.dll公开了哪些方法。首先是QISRInit,这是一个全局初始化函数。

    jna-yuyinshibie-02

    它的返回值为int,参数是const char。int还是java的int,但是char就对应的是java的String了。

    所以在QTSR中添加方法:

    publicintQISRInit(String configs);

    返回值在msp_errors.h中定义,等一下我们还是要弄在java里面去。

    继续看QISRInit函数,在官方文档中有调用示例:

    constchar* configs=“server_url=dev.voicecloud.cn, timeout=10000, vad_enable=true”;
    
    int ret = QISRInit( configs );
    
    if(MSP_SUCCESS 
  • 在win7上部署umbraco

    在win7上部署umbraco

    什么是umbraco

    Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据。 使用Umbraco ,设计师能创造出有效的XHTML标记模板和开发人员可以创建任何基于.Net的模块。主要特点包括:

    • 漂亮,友好的用户界面
    • 综合所见即所得编辑器
    • 支持编辑在Microsoft Word
    • 全部源代码可用(开放源代码)
    • 超级简单的模板引擎
    • 完全支持Web标准

    最近需要把一个asp的软件下载站点转移到asp.net,数据库最好用MSSQL。在网上Google一番以后决定试试umbraco,看着一大票的英文文档是在有些难受,还是先看看umbraco是什么样子的再研究文档。我的电脑是Win7的,装了MSSQL 2005 DEV和VS2010,没有IIS7。

    获取umbraco

    umbraco的官网是:http://www.umbraco.org/

    下载地址:http://www.umbraco.org/download

    还有一个中文的爱好者网站:http://www.umbracochina.com/

    这个中文网站提供了汉化包,针对4.7和4.X版本(是这么写着的),但是我不推荐用这个。因为文档毕竟没有汉化,汉化的界面虽然看着舒服,但是文档有些东西就对不上了。当然个人观点哈。

    umbraco-win7-1

    下载界面最上面的是针对Microsoft Web Platform Installer or WebMatrix的,没用过…

    点下面那个下到4.7.2的编译好的版本,直接解压到D盘去,在IIS中新建一个站点,然后访问…

    错误和解决

    访问直接报服务器错误:HTTP 错误 500.19 – Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。

    umbraco-win7-2

    看情况是缺少配置,我打开Web.config确实没有这个节点的配置。我比较好奇为什么这个有名的一个开源项目的配置有错误…难道是我无意中跳了步骤?

    不管了,参考一下标准配置将配置文件补全,在configSections节点中添加:

    <sectiongroupname="system.web.extensions"type="System.Web.Configuration.SystemWebExtensionsSectionGroup, 
  • Ormlite在一般java环境中操作Sqlite

    Ormlite在一般java环境中操作Sqlite

    简介

    最开始接触ormlite是在android的开发中,ormlite的简单便利让我印象深刻。

    这几天在研究顾客购物行为,需要使用到数据库,但是对于数据库的速度什么的要求不大,我首先想到的是Ormlite+Sqlite。

    实体类

    ormlite的官网http://ormlite.com/,最新版本4.41

    因为是在一般java环境中使用,所以不需要那个android包。

    ormlite-sqlite

    引入包以后建立modal,例如:Commodity.java。因为使用的sqlite,主键自增长,设置为

    @DatabaseField(generatedId =true)

    完整的代码如下:

    package com.cnblogs.htynkn.DataSpider.Modal;
    
    import com.j256.ormlite.field.DatabaseField;
    import com.j256.ormlite.table.DatabaseTable;
    
    /**
    *@author 夜明的孤行灯
    *@date 2012-6-29
    */
    
    @DatabaseTable(tableName ="Commodity")
    publicclass Commodity {
    @DatabaseField(generatedId =true)
    privateint id;
    @DatabaseField(columnName ="Name")
    private String name;
    @DatabaseField(columnName ="JdKey")
    
  • 基于LingPipe的文本倾向性分析–LingPipe学习笔记

    基于LingPipe的文本倾向性分析–LingPipe学习笔记

    文本倾向性分析

    文本倾向性分析(情感分析 )是将用户的观点分为“正面”和“负面”,有时候会多一个“中性”。文本倾向性分析一个比较直观的应用就是追踪用户对于一个事物的观点和偏好,比如分析豆瓣上一个电影的评论进行分析。正因为如此情感分析又被称为观点挖掘。

    LingPipe

    lingpipe 是alias公司开发的一款自然语言处理软件包,包括主题分类、句题检测、字符语言建模等十余个模块。而且文档完整,甚至每一个算法都有论文参考。更难能可贵的是它支持中文。

    官方地址:http://alias-i.com/lingpipe/

    下载地址:http://alias-i.com/lingpipe/web/download.html

    LingPipe分为两个大块,一块是LingPipe核心文件,另外一块是LingPipe的模型类。需要支持中文的话需要下载Chinese Word Segmentation模块。

    准备语料库

    语料库在语言学上意指大量的文本,通常经过整理,具有既定格式与标记。

    一般而言做情感分析有个很重要的步骤就是采集观点并进行整理,但由于应用场景不同,处理方法也不同。为了方便起见,这里使用已经处理好的语料库。Movie Review Data的polarity dataset v2.0,包含1000个正面的观点和1000个负面观点。当然这个是英文的哈。

    基本极性分析

    基本极性是指事物从样本来看所处的整体倾向,比如:一本书,用户对其的情感倾向是正面的,这样的断言就是一个基本极性断言。

    基本极性的分析直接使用LingPipi的DynamicLMClassifier即可。

    大致上来讲分为两步,第一步训练,第二步进行分析。

    新建一个类名为PolarityBasic。

    publicPolarityBasic(String basePath) {
    pDir =new File(basePath,"txt_sentoken");//获取语料集
    categories = pDir.list();//获取类别
    int nGram =4;
    classifer = DynamicLMClassifier.createNGramProcess(categories, 
  • RIpple-DOwn Rule算法和weka中Rider使用–数据挖掘学习和weka使用(五)

    RIpple-DOwn Rule算法和weka中Rider使用–数据挖掘学习和weka使用(五)

    RIpple-DOwn Rule算法简介

    RIpple-DOwn Rule算法(链波下降规则)是一种专家系统方法论,它是澳大利亚新南威尔士大学的Compton教授于1989年提出。它是一种用于知识表示和获取的方法。从某种意义上看RDR算法是CBR方法的一种扩展或者变形,RDR将规则引入CBR中,用规则来索引案例,以错误驱动机制来获取知识。

    RIpple-DOwn Rule算法是比较简单,有时候得出的结果不能让人满意,但是它是我最喜欢的一种算法,它通过否定规则来表示结果,非常适合人类理解。

    RIpple-DOwn Rule算法流程

    RIpple-DOwn Rule算法使用了二元决策树,区别于标准决策树,RDR用复合条款是来确定分支,同时这些条款不需要详尽涵盖所有情况,即可以有分类错误的情况,然后用错误的数据作为新整体再处理,以获得内部分支。

    为了方便说明,我们先看一个RDR的输出

    weka5_1

    这是一个医学诊断系统的涟波规则。

    我们还是以weather.arff的数据为例。

    weka5_2

    看一下我们的分类要求,要分成no和yes两类。

    no 的权重是5,yes的权重是9。

    由错误驱动生成第一条规则

    play = no

    很明显这条规则没有正确分类

    weka5_3

    总共14个样本,有9个被分类错了。

    再来生成内规则。

    生成过程就省略了…请参考本文最后的参考文献。第二条规则是

    Except (humidity <= 82.5) => play = yes

    序号为6的数据被错误分类为play了.最终的规则是

    play = no

               Except (humidity <= …

  • OneR算法和weka中OneR使用–数据挖掘学习和weka使用(四)

    OneR算法和weka中OneR使用–数据挖掘学习和weka使用(四)

    OneR算法简介

    OneR又称1-R,是1993出现的一种极为简单的分类算法模型,它可以产生一个单层的决策树。

    OneR算法是一个简单、廉价的方法,但是常常能够获得一个非常好的结果,用于描述数据中的结构。

    OneR算法的使用非常广泛,可以简单的得到一个对数据的概括性了解,有时候甚至可以直接获得结果。

    OneR算法实现

    OneR的思路很简单,建立一个只针对于单个属性进行测试的规则,并进行不同的分支。每个分支对应的不同属性值。

    分支的类就是原始数据(训练数据)在这个分支上出现最多的类。

     

    每一个属性都会产生一个不同的规则集,每条规则对应这个属性的每个值。对每个属性值的规则集的误差率进行评估,选择效果最好的一个即可。

    伪代码表述:

    对于每个属性

      对于这个属性的每个属性值,建立如下规则

        计算每个类别出现的频率

        找出出现最频繁的类别

        建立规则,将这个类别赋予这个属性值

      计算规则的误差率

    选择误差率最小的规则

     

    一个简单的例子,数据使用weka自带的weather数据集。

    weka4_1

    针对每个属性,一共有5个,其中最后一个是我们希望输出的结果,所以只有4个属性值。即outlook、temperature、humidity、windy。

    我们先计算outlook属性,它有3个属性值,sunny、rainy、overcast。

    weka4_2

    针对属性值sunny而言,一共有5条数据。

    weka4_3

    其中对应play为no的有3条、对应play为yes的有2条,为no的最频繁,所以给sunny赋值为no。

    同理对于rainy而言,有5条记录。

    weka4_4

    其中对应play为yes的有3条、对应play为no的有2条,为yes的最频繁,所以给rainy赋值为yes。

    同理计算overcast属性值,赋值为yes。

     

    然后计算误差率

    sunny—>no 中有3个分类正确,2个分类错误,误差0.4

    rainy—>yes 误差为0.4

    overcast—>yes 误差为0

    outlook总误差4/14…

  • android游戏开发框架libgdx的使用(二十)—资源预加载与AssetManager的使用

    本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

    好久没有写libgdx相关的东西了,主要是我不知道改写些什么了。

    最近收到了很多邮件,大多是关于资源加载的,特别是异步资源加载,还有什么Loading窗口的实现什么的,这篇博文就做个大致的回答吧。

    什么时候需要资源预加载

    资源预加载的目的很明确,提升用户体验。当然就开发者而言,比较好的预加载实现方式还可以方便管理。

    如果游戏很简单简单,资源很少很少,那么弄资源预加载就是费事,但是以下几种情况的话还是推荐使用:

    1.资源数量大

    音乐、图片、视频什么的,如果你的游戏这些东西太多,推荐使用

    2.部分资源反复使用

    有些资源会反复使用到,比如一些背景音乐,一些小图标

    Libgdx中的AssetManager

    AssetManager是libgdx提供的资源加载方案,demo中有个例子,详细的可以细致参考。

     

    AssetManager使用很简单,先实例化一个。

    AssetManager assetManager =new AssetManager();

    加载资源时需要制定资源位置和资源类型,目前支持Pixmaps、Textures、BitmapFonts、TextureAtlases、TiledAtlases、TileMapRenderers、Music、Sound这些类型的资源。

    使用方法:

    assetManager.load("data/img/bg.png", Texture.class);assetManager.load("data/font/chinese.fnt", BitmapFont.class);assetManager.load("data/music/op_head.ogg", Music.class);assetManager.load("data/pack/task1.pack", TextureAtlases.class);

    加载的时候还支持自定义参数,比如加载Texture时

    TextureParametertextureParameter = new TextureParameter();textureParameter.minFilter = TextureFilter.Linear;textureParameter.genMipMaps =true;manager.load("data/img/bg.png", Texture.class, textureParameter);

    大多数情况还是不用考虑自定义参数的。

     

    执行了Load方法其实只是将预加载的资源载入了队列,实质上并没有加载什么,使用Update方法才会加载资源。

    该方法有个返回值,当其为True时即加载完成,为False就表示还在加载。

    如果需要一个比较准确的返回,比如当前加载到百分之多少了以方便绘制进度条,可以使用getProgress方法,该方法返回一个0到1之间的数字。…

  • 数据预处理和weka.filters的使用–数据挖掘学习和weka使用(三)

    数据预处理和weka.filters的使用–数据挖掘学习和weka使用(三)

    上一篇介绍了arff格式,这是weka专有格式,一般情况需要我们从其他数据源抽取或者获得。weka支持从cvs转化,也可以从数据库中抽取,界面如下图

    weka3_1

    weka安装目录有一个data目录,里面有一些测试数据,可以用于测试和学习。

    导入了数据仅仅是一个开始,我们还需要对数据进行预处理。

    数据预处理(data preprocessing)

    数据预处理(data preprocessing)是指在主要的处理以前对数据进行的一些处理。

    现实世界中数据大体上都是不完整,不一致的脏数据,无法直接进行数据挖掘,或挖掘结果差强人意。

    为了提高数据挖掘的质量产生了数据预处理技术。

    数据预处理有多种方法:数据清理,数据集成,数据变换,数据归约等。这些数据处理技术在数据挖掘之前使用,大大提高了数据挖掘模式的质量,降低实际挖掘所需要的时间。

    数据清理是使用比较频繁的,主要有:

    (1)空缺值处理

    目前最常用的方法是使用最可能的值填充空缺值,比如可以用回归、贝叶斯形式化方法工具或判定树归纳等确定空缺值.这类方法依靠现有的数据信息来推测空缺值,使空缺值有更大的机会保持与其他属性之间的联系。

    还可以用一个全局常量替换空缺值、使用属性的平均值填充空缺值或将所有元组按某些属性分类,然后用同一类中属性的平均值填充空缺值.如果空缺值很多,这些方法可能误导挖掘结果。

    (2)噪声数据处理

    噪声是一个测量变量中的随机错误或偏差,包括错误的值或偏离期望的孤立点值。常用分箱、回归、计算机检查和人工检查结合、聚类等方法进行噪音处理。

     

    数据变化主要使用平滑聚集,数据概化,规范化等手段使数据换为较利于数据挖掘的格式。

     

    数据归约主要是为了压缩数据量,源数据可以用来得到数据集的归约表示,它接近于保持原数据的完整性,但数据量比原数据小得多.与非归约数据相比,在归约的数据上进行挖掘,所需的时间和内存资源更少,挖掘将更有效,并产生相同或几乎相同的分析结果。常用维归约、数据压缩、数值归约等方法实现。

    Weka.Filters

    weka.filters中包含了一些数据预处理的简单实现(其实已经够用了),主要分成两大类,监督过滤(UnsupervisedFilter)和非监督过滤(UnsupervisedFilter)。

    如果是使用GUI的话,点击Filter的Choose就可以选择

    weka3_2

    选择完成后点击选择的Filter本身就可以修改相关参数。

    weka3_3

    完成参数修正后点击Apply就Ok了。

    我平时使用的比较多的还是非监督过滤,下面介绍一些比较常见。

    先介绍weka.filters.unsupervised.attribute包下的,这是非监督方法对属性进行预处理。

    1.Add

    为数据库添加一个新的属性,新的属性将会包含所有缺失值。可选参数:

    attributeIndex:属性位置,从1开始算,last是最后一个,first是第一个

    attributeName:属性名称

    attributeType:属性类型,一般是4选1

    dateFormat:数据格式,参考ISO-8601

    nominalLabels:名义标签,多个值用逗号隔开

    2.AddExpression

    新增一个属性,该属性由现有属性通过设定的表达式计算得出。支持+, -, *, /, ^, …