Fork me on GitHub


在MyEclipse项目中不能打开birt报表的解决方法

由于业务要求,需要在利用MyEclipse中开发的Web项目中添加Birt报表统计功能,新建完一个 report.rptdesign 文件后双击该文件出现如下错误:

3. [译]多线程的成本

本文翻译自Java Concurrency / Multithreading Costs

从一个单线程程序切换为多线程程序在给我们带来好处的同时也会产生一些额外的成本,不要因为会使用多线程就将一个程序变为多线程实现。在准备使用多线程时,我们应该有一个清楚的认识:使用多线程带来的好处大于其成本,当有不确定时,我们应该尝试度量应用程序的性能和响应性来决定是否采用多线程,而不是靠猜来决定。

2. [译]多线程的优点

本文翻译自Java Concurrency / Multithreading Benefits

尽管多线程给程序实现带来了挑战,但由于多线程的一些优点我们仍然在使用它,其中的一些优点如下:

  • 更好的资源利用
  • 在某些场景可以简化程序设计
  • 提高程序响应

1. [译]Java多线程与并发教程

本文翻译自Java Concurrency / Multithreading Tutorial

最开始一台电脑只有单个CPU,只能一次运行一个任务,之后出现的多任务处理则意味着计算机在同一时间可以处理多个程序(也可以称之为任务或进程),虽然它们并不是真正的并发。由于单个CPU被不同的程序共用,操作系统需要在程序运行过程中不停地切换CPU,在短暂的执行一个程序后就立即切换到下一个程序。

多任务处理给软件开发人员提出了新的挑战,程序不能再假定拥有CPU所有的可用时间、内存和其它计算机资源,一个好的程序应该及时释放所有不需要使用的资源,以便其它程序可以使用它们。 之后出现的多线程则意味着可以在同一个程序里面执行多个线程,每一个执行的线程可以被认为是CPU在执行当前程序,当在同一个程序里面执行多个线程时,看起来像是拥有多个CPU在执行该程序。

在Intellij IDEA中引用Golang本地包

在学习Golang时,自己最开始用的是eclpse中的goclipse插件来进行Golang编程,但其对Golang的支持不是太好,如代码格式化、自动导入引用包等都无法直接在eclipse中使用,并且其自动提示功能也没有像Java那么强,于是转用Intellij IDEA安装Golang插件来替代使用,安装完插件后的Intellij IDEAGolang的支持在各方面都很令人满意,唯独引入本地包的支持不太好用。经过一阵摸索自己找出了解决方案,先记录下。

计算两个平行于坐标轴的矩形相交的面积

之前面试时遇到一个算法题: 假定两个矩形各条边都是平行于坐标轴,已知k、l、m、n分别为其中一个矩形左下角和右上角x轴、y轴坐标,p、q、r、s分别为另一个矩形的左下角和右上角x轴、y轴坐标,求这两个矩形的总面积,当矩形相交时要减去相交的面积。 此题利用常规的枚举法很复杂,但利用排除法和归纳法却能很快解决,故先记录下。

在iframe嵌套的html5中播放视频时全屏显示和取消音量调整

由于项目需要,最近使用了在html5中播放视频的功能,期间遇到了几个坑,先简单记录下。

mybatis batch insert exception的解决方法

在利用 MyBatis 进行多条数据插入时,为了提高性能我们可能会使用批量插入的功能来实现。示例代码如下:

  • SQL配置文件:

    <insert id="addAuthorityRoleBatch" parameterType="List">
        INSERT INTO system_authority_role(role_id,authority_id)
          VALUES
          <foreach collection="list" item="authRole" separator=",">
            (#{authRole.roleId},#{authRole.authorityId})
          </foreach>
      </insert>
    

利用SpringMVC下载大文件

文件的上传和下载是Web系统中的一个很普通的功能,实现的方式也有很多种,如利用 java.io 下面的各种IO类自己实现,或者利用 Commons IO 包中的 FileUtilsIOUtils 类中封装好的方法直接调用。由于目前我所开发的系统采用了 SpringMVC 来作为项目的MVC实现,所以很自然的采用 SpringMVC内置的API进行文件的下载,但在实际使用过程中发现其对大文件的下载支持不太好,现把解决方案记录如下:

利用Spring和JUnit对数据库操作进行单元测试

在进行Java程序开发时,我们偶尔会被要求使用JUnit进行单元测试来确保我们所写的程序逻辑是正确的。一个良好的单元测试应该具备 覆盖度高,可重复执行,单一性 等特点。本文主要关注可重复执行 ,在Web开发中,大部分方法都会使数据库的记录发生变化,为了能够重复执行,必须利用数据库事务 来进行 回滚 从而达到重复执行的目的。最原始的方法是利用 java.sql.Connection 类的 commit()rollback() 方法来在每个单元测试方法中手动的进行提交或回滚,此种方式使得单元测试代码嵌入了与实际业务逻辑无关的数据库操作事务控制代码。利用SpringJUnit通过注解的方式我们可以很容易的对单元测试中的数据库操作进行事务控制。

利用Spring Security动态的改变权限

利用 Spring Security 来管理我们的web程序时,通常需要在UserDetailsService 接口中的 loadUserByUsername 方法中来初始化权限信息,但 UserDetailsService 一般用于登录验证,这也意味着用户的权限在登录过程中就会被计算出来。通常情况下由于用户的权限很少发生变化,在登录过程中计算出用户权限是合理的,但有些情况下,我们需要在中途来动态的改变用户的权限,此时我们可以利用 Spring Security 提供的API来实现。

在Spring中利用Mock对HttpServletRequest进行单元测试

编写单元测试时的注意事项

根据软件开发过程中的TDD 理论,在我们编写自己的代码时,要尽量使得该代码能够进行单元测试。为了能够使得代码可以进行单元测试,我们在给接口或方法传入参数时要尽量传入简单参数,避免传入 HttpServletRequest , ServletContext 等和web上下文相关的复杂对象。但仍有部分情况下基于代码简洁性和可维护性的考虑,我们需要传入 HttpServletRequest 对象,此时对此类方法进行JUnit单元测试时会较为困难,本文介绍一种在Spring中通过Mock来模拟HttpServletRequest 对象进行JUnit单元测试的方法。

Mediawiki添加回到顶部的方法

Mediawiki维基百科系统所采用的框架,适合于需要快速搭建知识分享的场合。采用Mediawiki生成的知识共享平台和维基百科的操作与使用类似,都支持采用Markdown语法来编辑。在有些时候,某些词条的内容很长,使得浏览器出现了滚动条,如果能仿照微博等网站添加一个回到顶部的功能,将会给我们的使用带来很大的便利,本文介绍一种实现方法:

[译] Java Volatile 关键字详解

本文翻译自 Java Volatile Keyword

Java关键字volatile用于将一个Java变量标记为 在主内中存储 ,更准确的解释为:每次读取一个volatile变量时将从电脑的主内存中读取而不是从CPU缓存中读取,每次对一个volatile变量进行写操作时,将会写入到主内存中而不是写入到CPU缓存中。

事实上,从Java5之后,volatile关键字不仅仅可以用来确保volatile变量是写入到主内存和从主内存读取数据,我会在下面的章节进行详细的介绍:

Cannot run program "mysqldump": CreateProcess error=2, The system cannot find the file specified

项目中用到了MySQL数据库的备份功能,通过调用Java程序中的Runtime来执行mysqldump命令自动的生成相关的MySQL数据库文件以供恢复之用。相关的代码如下:

Runtime runtime = Runtime.getRuntime();
String mysqlCmd = "mysqldump" + " -u" + username + " -p" + password + 
           "  -h " + databaseAddress + " " +databaseName;
Process process = runtime.exec(mysqlCmd);

但是在客户那里实际使用时,有时候会出现在cmd中MySQL命令可以正常识别但是程序不能正常执行的情况,报错信息如下:

利用Github Pages和基于Go的Hugo搭建个人博客

一直以来都想拥有一个属于自己的博客,前段时间在学习Go ,于是利用HugoGithub Pages 搭建了一个简易的个人博客,先简单记录下。