嗯..! 2016 年 11 月 共 24 篇日志。 继续努力。

Maven 项目使用 Tomcat 插件自定义 context.xml 有更新!

Java 界的三大 IDE,IntelliJ Idea,Eclipse,Netbeans,如今暂且决定用 IntelliJ Idea,因为成功部署了公司及私人项目。 本文可能莫名其妙的嵌入了不少样式,这是为了测试新版 Markdown 的效果 😁 说起来,D 大一直强推的 Netbeans,用了一段时间,对于 Symphony 来说没有任何问题,但对于公司项目的话,由于 JNDI 的设置写在了 Tocmat 的 context.xml 中,一直没有找到解决办法,也就无法将 Netbeans 用在公司项目,加之上周出现了莫名其妙的错误,彻底无法使用了。 Netbeans 有几点确实比 Eclipse 好,然而发现这几个小点儿在 Idea 中也存在,看来Idea 排名第二,NB 排名第三,也不是没有道理的。 是时候跟 Eclipse 说 bye bye 了 ~ (可惜了今年刚学会的不少快捷键 orz) 我使用的是 Community 版,没有 JavaEE 支持,不过想来现在大部分项目都是 maven(自从会导入 maven 项目了,就开始鄙视并抵制非 maven 项目 😂 ),使用 Tomcat Maven plugin 就可以免于....

阅读全文 »

通过Latke-Demo对Latke工作流程的初步分析 有更新!

Latke 代码看到 IoC 包后就彻底懵逼了,从已看过的几段代码来看,都是各种 set、get,变量名称含义抽象,不知所云。由此感到单纯的读代码恐怕无法理解 IoC 包的实现逻辑了。于是决定运行一下 demo,来跟踪一下代码。以下是 latke-demo 项目从请求发起到响应结束时经过的代码段(层级关系可能不太正确,但是大致流程就是如此) 虽然还没有完全明白,但是跟踪下来感觉颇有收获,待慢慢补充细节 1. DispatcherServlet.service //以此作为起点。此处是最原始的 servlet,配置在 web.xml 中,再细节的方面,暂时可以当做黑盒了。 //不得不说,jsp+servlet 作为基础,当年没有好好学是个错误。(垃圾讲师误人啊……) protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { //HTTPRequestContext,Latke 封装,没有定义构造器 final HTTPRequ....

阅读全文 »

Latke Code View - IOC.annotated

org.b3log.latke.ioc.annotated.AbstractAnnotatedCallableImpl
org.b3log.latke.ioc.annotated.AnnotatedConstructorImpl
org.b3log.latke.ioc.annotated.AnnotatedFieldImpl
org.b3log.latke.ioc.annotated.AnnotatedMethodImpl
org.b3log.latke.ioc.annotated.AnnotatedParameterImpl
org.b3log.latke.ioc.annotated.AnnotatedTypeImpl

阅读全文 »

【XML】《XML实用教程》笔记 有更新!

XML 是 eXtensible Markup Language 的缩写,称之为可扩展标记语言。 符合 W3C 制定的基本语法规则的 XML 文件称为规范的 XML 文件,规范的 XML 文件如果再符合额外的一些约束就称之为有效的 XML 文件。 一个规范的 XML 文件应当满足如下语法规则: XML 文件用“XML 声明”开始。 XML 文件有且仅有一个根标记 XML 的非根标记都必须封装在根标记中。 非空标记必须由“开始标记”与“结束标记”构成。 XML 文件的标记必须形成树形结构,即标记不允许出现交叉。 空标记没有“开始标记”和“结束标记” XML 声明 一个规范的 XML 文件应当以 XML 声明作为文件的第 1 行,在其前面不能有空白、其他处理指令或注释。如: 还可以添加属性:standalone,指为 yes 或 no,表明 XML 文件是否是完全自包含的,即是否引用了外部“实体”。 标记 一个标记包含的内容由两部分构成:文本数据部分和子标记部分。一个标记包含的文本数据部分可以有普通字符、CDATA 段和实体引用。 根标记:每个 XML 文件有且仅有一个根标记,其他标记都必须封装在根标记中。 空标记:即不包含子标记或文本内容的标记,如:....

阅读全文 »

Spring基础篇 - Spring In Action读书笔记 有更新!

一、 Spring 之旅 1. 简化 Java 开发 为了降低 Java 开发的复杂性,Spring 采取了以下 4 种关键策略: 基于 POJO 的轻量级和最小入侵性编程; 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码。 2. 依赖注入 通常,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。如下面的 Knight 类: package com.springinaction.knights; public class DaselRescuingKnight implements Knight{ private RescueDamselQuest quest; public DamselRescuingKnight(){//自己管理依赖对象 quest=new RescueDamselQuest(); } public void embarkOnQuest() throws QuestException{ quest.embark(); } } 耦合具有两面性。一方面,紧密耦合的代码难以测试,难以复用,....

阅读全文 »

Love2d 几何坦克大战 - 1

经过两天断断续续的代码,实现了单个坦克的基本行为,也就是移动,射击,效果如下 怎么样,看起来是不是有模有样? 而这个实现代码其实也非常简单,根据之前的教程,加上官方 wiki 的查询,以及群里大神的一两句指点就可以做出来啦~ 示例的完整代码托管在 GitHub 上,请戳链接 这里重点介绍部分代码(也就是根据大神指点查询 wiki 的部分) --画坦克躯干 love.graphics.origin() rotateGraph(centerX,centerY,Tank.bodyA); love.graphics.rectangle("line", bodyX, bodyY, bodyW, bodyH) --画坦克头部 love.graphics.origin() rotateGraph(centerX,centerY,Tank.headA) love.graphics.circle("line", centerX, centerY, Tank.headR, Tank.headS) love.graphics.rectangle("line",fireX,fireY,Tank.fireW,....

阅读全文 »

ETL 工具 - Kettle 的基本使用

最近做的项目用到了 ETL 工具 Kettle,这个工具相当好用,可以将各种类型数据作为数据流,经过处理后再生成各种类型的数据。正如其名“水壶”,将各个地方的水倒进水壶里,再用水壶倒入不同的容器。不过一来初学乍用,二来对此任务不是很感兴趣,研究的不是很深入,可能是以一种不科学的方法使用的,但观教程,常用的内容似乎也涉及到了,并且 Y 大说过,要善于总结,于是有了这篇,作为入门说明吧。 一、下载与安装 官网地址 大概 700~800M,下载好解压缩即可。当然,要求 JDK 环境(似乎有自带) 二、任务(.kjb)与转换(.ktr) Kettle 工具的主界面-作业 简单地说,一个转换就是一个 ETL 的过程,而作业则是多个转换、作业的集合,在作业中可以对转换或作业进行调度、定时任务等(据说定时不好用,可以通过其他方式,比如 Linux 的 crontab 命令,不过实际使用中,这个指令也不大好使,有待查看日志探明原因。) 我在实际过程中,写的流程不是很复杂,当数据抽取需要多步骤时,分成多个转换,在集合到一个作业里顺序摆放,然后执行即可,不放到作业里的话,要对多个转换依次执行命令,比较麻....

阅读全文 »

Latke Code View - Cron

org.b3log.latke.cron.Cron import org.b3log.latke.servlet.HTTPRequestMethod; import org.b3log.latke.urlfetch.HTTPRequest; import org.b3log.latke.urlfetch.URLFetchService; import org.b3log.latke.urlfetch.URLFetchServiceFactory; public final class Cron extends TimerTask { public static final int TEN = 10; public static final int SIXTY = 60; public static final int THOUSAND = 1000; private String url; private String description; private String schedule; private long period; public Cron(final String ....

阅读全文 »

Latke Code View - Cache 有更新!

未注明的引用均为 Java 内部包 所有 setter、getter、logger 等逻辑无关代码均忽略不计 忽略了一些常见注解 org.b3log.latke.cache.local.memory.AbstractMemoryCache import org.b3log.latke.cache.Cache; public abstract class AbstractMemoryCache<K extends Serializable, V extends Serializable> implements Cache<K, V> { private long maxCount = Long.MAX_VALUE; private long hitCount; private long missCount; private long putCount; private long cachedCount; protected final void hitCountInc() { hitCount++; } protected final void missCountInc....

阅读全文 »

Latke Code View - Latke.java

大致的代码结构: Java B3log cache,cron,event,image,intercept,ioc logging,mail,model,plugin,remote,repository service,servlet,taskqueue,thread,urlfetch,user,util Latkes.java Keys.java,Runtimetabase.java,RuntimeEnv.java,RuntimeMode.java JSON weborganic resources beans.xml Latkes.java 下面那一行涉及的代码基本没有逻辑,全是枚举或者常量值的定义,想来无可研究。 开始的字段定义继续忽略,首先是静态代码块(删去了 LOGGER): static { try { final InputStream resourceAsStream = Latkes.class.getResourceAsStream("/latke.properties"); if (null != resourceAsStream) { LATKEPROPS.l....

阅读全文 »

LoveExample-18 向指定的位置发射子弹

Long time no see~ 虽然可能本来看的人也不多吧 示例在视觉上其实很朴素,不过实现了定点射击的功能,这个功能感觉还是比较常用的。 大概思路就是,在 update 方法中,不断将获取到的鼠标位置(如果点击了话)放到表中,同时又不断的从表中取出存放的子弹信息进行绘制。 逻辑上并不难,但是有些 lua 语言本身的点。 代码如下: function love.load() SPEED = 250 StartPos = {x=250, y=250, width=50, height=50} --The starting point that the bullets are fired from, acts like the shooter. bullets={} --The table that contains all bullets. end function love.draw() --Sets the color to red and draws the "bullets". love.graphics.setColor(255, 0, 0) --This loops t....

阅读全文 »

LoveExample-17 使用特殊字体

这里只是英文字体,似乎对中文字体支持的不是很好 还好,按照我对它的用法,大概是写不了多少中文的 其实非剧情类的,一般的英文也没什么障碍了 -- Example: Using a truetype font function love.load() -- Create a new font with 32pt size and set it as default. local f = love.graphics.newFont("assets/Grundschrift-Normal.otf", 24) love.graphics.setFont(f) end text = [[ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incid....

阅读全文 »

LoveExample-15~16 图片旋转

平面旋转,也即 xy 旋转,本人自创的词儿 效果就是向月亮环绕地球的旋转,只不过不自转 -- Example: Rotating images angle = 0 function love.load() image = love.graphics.newImage("assets/love-ball.png") end function love.update(dt) angle = (angle + dt) % (2 * math.pi) --决定了图片的向心旋转 x, y = 400 + math.cos(angle)*100, 300 + math.sin(angle)*100 --决定了图片位置的旋转 end function love.draw() --image:图片本身 --x,y:图片位置坐标 --angle:图片旋转角度,加上这个参数,会在指定位置上旋转图片指定角度 love.graphics.draw(image, x, y,angle) end love 本身的 API 还是很好理解的,问题是在于数学函数的运用,用什么样的函数做出什么样的运动轨迹,很考验数学....

阅读全文 »

LoveExample-12~14 自定义鼠标、键盘控制位移

看到这段代码我是一脸蒙逼,我之前的推测竟然是打脸么? function love.load() -- Load the "cursor" (with default hot spot 0, 0) cursor = love.mouse.newCursor("assets/love-cursor.png") -- Set the cursor love.mouse.setCursor( cursor ) end 然而并不是—— function love.load() -- Load the "cursor" image = love.graphics.newImage("assets/love-ball.png") -- Hide the default mouse. love.mouse.setVisible(false) end function love.draw() -- Draw the "cursor" at the mouse position. love.graphics.draw(image, love.mouse.getX(), love.mouse.getY()....

阅读全文 »

LoveExample-11 Animation

这一节引用了外部库,没看懂,先占个位,再研究。。。 -- Example: Create and use an Animation require("animation") function newImagePO2(filename) local source = love.image.newImageData(filename) local w, h = source:getWidth(), source:getHeight() --math.ceil 返回不小于参数的最小整数 --math.pow(x,y)==x^y:x 的 y 次方 --math.log(x [, base]):返回以指定底的 x 的对数。 默认的 base 是 e (因此此函数返回 x 的自然对数)。 -- Find closest power-of-two. --local wp = math.pow(2, math.ceil(math.log(w)/math.log(2))) --local hp = math.pow(2, math.ceil(math.log(h)/math.log(2))) local wp....

阅读全文 »

LoveExample-5..10 设置指针可见性、获取输入键等

接下来的几篇 demo 都很简单,一片一片的写没什么意义,说起来之前三篇其实也可以合起来,事已至此,先这样吧 [5] 获取鼠标按键,代码本身就已经做了很好地说明了: function love.load() love.graphics.setFont(love.graphics.newFont(11)) end function love.draw() -- Left mouse button. if love.mouse.isDown(1) then love.graphics.print("Left mouse button is down", 50, 50) end -- Right mouse button. if love.mouse.isDown(2) then love.graphics.print("Right mouse button is down", 50, 100) end -- Middle mouse button. if love.mouse.isDown(3) then love.graphics.print("Middle mouse button ....

阅读全文 »

LoveExample-3 设置鼠标位置

次新代码并不多,加上已经很晚了,也就不再多说,看代码就好 -- Example: Setting the mouse position function love.load() love.graphics.setFont(love.graphics.newFont(11)) end function love.draw() love.graphics.print("Press a key to move the mouse to a random point", 50, 50) end -- Press a key to move the mouse to -- some random point. function love.keypressed(k) local x, y = math.random(0,800), math.random(0,600) love.mouse.setPosition(x, y) end 这个函数的意义,大概在于可以设置鼠标自动到某个按钮的位置上吧。

阅读全文 »