Netty 实现聊天功能

2015-03-01 Netty

Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。更多关于 Netty 的知识,可以参阅《Netty 4.x 用户指南》(https://github.com/waylau/netty-4-user-guide

下面,就基于 Netty 快速实现一个聊天小程序。

准备

  • JDK 7+
  • Maven 3.2.x
  • Netty 4.x
  • Eclipse 4.x


使用 Google Gmail 邮箱服务

2015-02-27 Gmail

总所周知,Google 的大部分服务在华已经被墙,其中也包括 Gmail 。为了收取 Gmail 的邮件,也是要进行一番折腾的。当然,你可以施展各种翻墙技能(文章最后会提供一堆的翻墙方法)。如果不想折腾,只是想收发 Gmail 的邮件,下面的方法更加简单

##修改 hosts

将如下内容加入hosts之后(位置一般在C:\Windows\System32\drivers\etc\hosts)。

173.194.65.108 imap.gmail.com 
173.194.65.108 pop.gmail.com 
173.194.193.108 smtp.gmail.com 

##使用第三方邮箱客户端收发邮件

可以使用 outlook,FOXMAIL 等客户端软件,设置的你 Gmail 邮箱账号,就能收发邮件了。

##附录:翻墙技能

##参考


Gradle 2.3 发布

2015-02-27 Gradle

2月16日,Gradle 团队发布了 2.3。可以在 http://gradle.org/downloads 进行下载。

此版本的 Gradle 带来了一些漂亮的新功能来管理依赖和 IDE 的支持,以及对一些核心插件的改进。

期待已久的特性–具有访问 metadata artifacts 的能力 如 ivy.xml 和 pom.xml ,这个 Gradle 提供相关依赖解决。使用 Artifact Query API,你现在可以直接访问这些原始 metadata artifacts。这将对于生成一个脱机存储库是非常有用的,可以用来检查文件的 metadata,以及更多。

对于 Gradle IDE 的支持在不断提高, Gradle 2.3 通过在 IDE 插件修复大量 bug 而带来增强的 Gradle 工具 API 。值得注意的是,这个版本通过 eclipse-wtp 插件 带来更好的集成的 Eclipse Web Tools Platform 。

一如既往,这个 Gradle 发布受益于大量的社会贡献。这些包括对 antlr的大幅增强,比较了应用插件和工具,以及许多错误修复和改进。

更多关于 Gradle 的知识,可以关注 https://github.com/waylau/Gradle-2-User-Guide, 这里提供了最新的 Gradle 的中文翻译。

##参考:


突破 URL 传值限制

2015-02-13 Web

##问题

window.location = url 方法 当传值url 太长时,服务器无法正常接收。

比如下面,当 rowsData 数据量过大时,服务器请求失败。

window.location='rest/files/excel/easyui-datagird?fileName=' + fileName + '&columns='+columns2+'&rowsData='+rowsData;

##原因

使用浏览器发送 GET 请求会受浏览器 URL 长度的限制。而 window.location.href 就是 GET 请求。



使用 Apache POI 处理 Microsoft Office 文档

2015-01-25 POI

##POI 概述

Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准(OOXML)和微软的OLE 2 Compound Document 格式(OLE2)。总之,你可以使用 Java 读写 MS Excel 文件。此外,您可以使用 Java 读取和写入 MS Word 和 MS PowerPoint 文件。Apache POI 是你的 Java Excel 解决方案(用于Excel 97-2008)。包含了一个完整的 API 用于移植其他 OOXML 和OLE2 格式。

OLE2 文件包括了 Microsoft Office 文件,比如 XLS, DOC, PPT 以及 MFC 的序列化 API 为基础的文件格式。项目提供 OLE2 Filesystem (POIFS)OLE2 Document Properties (HPSF) 等 API。

Office OpenXML Format 是 Microsoft Office 2007 和 2008 中新的基于 XML 的标准。包括 XLSX, DOCX 和 PPTX。该项目提供了一个低级别的 API 使用 openxml4j来支持 Open Packaging Conventions(开放打包约定)。

针对每个 现存的 MS Office 模块组件,试图提供一个共同的高级别 Java api 给 OLE2 和 OOXML 文档格式。Excel (SS=HSSF+XSSF) Word (HWPF+XWPF),PowerPoint (HSLF+XSLF),Outlook (HSMF), Visio (HDGF), TNEF (HMEF), 和 Publisher (HPBF).

该项目尽可能与其他项目合作提供此功能。比如:Cocoon提供 HSSF 的序列化;与Open Office.org合作处理 XLS 格式;和 Tika/ Lucene提供格式解释器。


调试异步加载页面中的js文件

2015-01-17 JavaScript

问题

在使用 EasyUI 时,采用了异步加载 div 页面的方式,来优化页面的性能。但是在浏览器 debug 时,发现 div 页面中的 js 文件是不可见的,即无法断点调试。

比如,我自己写了一个 entMgt 的模块 div页面,里面引用了 entMgt.js

但是 debug ,却见不到该 js 文件

解决

就是在需要调试的 js 文件顶部加一行代码:

//# sourceURL=entMgt.js

搞定

参考引用

  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Errors/Deprecated_source_map_pragma?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default


Spirng 4 、Hibernate 4 事务管理

2015-01-03 Spring Hibernate

建议将 Hibernate SessionFactory 交给 Spring 进行事务管理,在 applicationContext.xml 里面配置

<bean id="sessionFactory"
	class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	<!-- 数据源 -->
	<property name="dataSource" ref="dataSource" />

	<!-- hibernate的相关属性配置 -->
	<property name="hibernateProperties">
		<props>
		...
</bean>

<!-- 定义事务管理 -->
<bean id="transactionManager"
	class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
	<!-- 自动扫描实体对象 com.waylau.entity 的包结构中存放实体类 -->
	<property name="packagesToScan" value="com.waylau.entity" />
</bean>

使用 SessionFactory

@Autowired
private SessionFactory sessionFactory;
 
public Session getSession() {
    return sessionFactory.getCurrentSession();
}



在 Jersey 2 使用 Spring 4

2014-12-30 Spring Jersey

Jersey 提供对 Spring DI 的扩展。使得 Jersey 在使用 Spring bean 时 就像是 JAX-RS 的组件 (比如 资源和提供者) 并且允许 Spring 注入 Jersey 管理的组件中。比如:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.springframework.stereotype.Component;

@Component
@Path("/")
public class SomeResource {

    @Transactional
    @GET
    public void updateResource() {
        // ...
    }
}

详见《Jersey 2.x 用户指南》 Chapter 22. Spring DI 使用 Spring 注入



Maven 编码相关问题

2014-12-27 Maven

问题:

[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!

没有指定编码,只能按照平台的默认编码进行拷贝。

解决:

<project> 
    ... 
        <properties> 
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
        </properties> 
    ... 
</project>

Tomcat Maven Plugin使用

2014-12-26 Tomcat

Apache Tomcat 的 Maven 插件提供了 goal,实现将 Apache Tomcat servlet 容器整合进 WAR 项目。你可以通过 Apache Maven 运行 WAR 项目而无需部署 WAR 文件到 Apache Tomcat 的实例。


新的RBAC:基于资源的权限管理(Resource-Based Access Control)

2014-12-25 Shiro

本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的。同时将讨论一种更好的权限管理方式。

What is a Role? 什么是角色

当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列行为或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能“做”什么取决于与之关联的各个角色。

例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目组成员、产生项目报表等。

从这个意义上来说,角色更多的是一种行为的概念:它表示用户能在系统中进行的操作。



Activiti 5.17.0 发布

2014-12-19 Activiti

##Activiti 5.17.0

Activiti 5.17.0 发布 (2014-12-18),此版本值得关注的亮点:

  • 我们介绍了一个完全测试和全新的 Async executor (异步执行器),它取代旧的Job executor。新的异步执行程序使用更少的数据库查询来执行异步工作并拥有更好的性能。默认 Activiti 引擎仍然使用旧的工作执行者,所以你必须显式地选择的新的异步执行器通过在流程引擎配置设置 asyncExecutorEnabled 属性。更多细节可以查看的用户指南高级功能章节。
  • Activiti Modeler 完全修正,使用 Angular JS 实现。这是捐赠的Alfresco Activiti BPMN 编辑器,该编辑器的Alfresco Activiti Enterprise版本的一部分提供。新的 Angular JS Activiti Modeler 是 LGPL 许可。注意,一些对话框还没有移植到新的 Activiti Modeler 中,但你还会发现很多新的功能,包括 Mule 和 Camel 任务,能够给专用网关定义一个顺序流命令。真的很感激任何帮助和添加的新特性。
  • 用户指南修订了 AsciiDoc 的重写


用 GitHub、Markdown 和 GitBook 写开源书

2014-12-11 GitHub GitBook

之前一直是在 GitHub 上写开源书(见:http://www.waylau.com/books/)但,由于 GitHub 本身的目录结构并不一定符合阅读的习惯,而且没有提供 pdf , ePUB, MOBI 等格式的转换下载。很多同学也还是习惯离线看文档。GitBook 就是解决这一问题。

GitBook 让你在保持在 GitHub 的书写习惯外,稍加配置,就能自动发布到GitBook 上,形成界面漂亮的电子书了(支持 html, pdf , ePUB, MOBI 等)。


使用 GitBook 写开源书

2014-12-11 GitBook

GitBook 让你在保持 使用 Markdown 的书写习惯外,稍加配置,就能自动发布到 GitBook 上,形成界面漂亮的各种电子书了(支持 html, pdf , ePUB, MOBI 等)。

##Installation 安装

安装 Nodejs

gitbook 的安装需要 Nodejs,下载地址为 http://nodejs.cn/download/

安装 gitbook

gitbook 1.x 时执行:

$ npm install gitbook -g

而从 gitbook 2.x 开始,执行下面新的命令语句:

$ npm install gitbook-cli -g

##Usage 1 用法一 使用模板快速开始

https://github.com/waylau/gitbook 这是个快速开始 GitBook 的模板项目,根据项目的结构,稍作修改,就能生成自己的电子书。

###Checkout the repository 检出模板项目

$ git clone https://github.com/waylau/gitbook.git

执行 Maven 编译的 jar,找不到相关的 依赖的类--使用 maven-assembly-plugin 解决

2014-11-28 Maven

##问题:执行 jar 找不到依赖的类

用 Maven 编译完成后 ,生产了 ui-compressor-1.0.0.jar, 此时执行

java -cp target/ui-compressor-1.0.0.jar com.waylau.uicompressor.App

提示下面找不到依赖的包:

Exception in thread "main" java.lang.NoClassDefFoundError: org/mozilla/javascrip
t/ErrorReporter
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
        at java.lang.Class.getMethod0(Class.java:2685)
        at java.lang.Class.getMethod(Class.java:1620)
        at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:492)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:484)

Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.ErrorReporte
r
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 6 more





用 VPN Gate 翻墙科学上网

2014-11-19 Web

##VPN Gate 综述

VPN Gate 学术实验项目是一个在线服务,由日本国立筑波大学研究生院为学术研究目的运营。本研究的目的是推广 “全球分布式公共 VPN 中继服务器” 的知识。


中国行政区划的英文

2014-11-18 English

##中国行政区划(administrative division)

分为几个级别(government level/level);宪法(Constitution)规定了三个级别(de jure level),但实际上有五个级别(de facto level/practical level)——33个省级(province/province-level region/province-level division)、333个地区级(prefecture/prefecture-level region/prefecture-level division/second-level division)【非宪法区划】、2862个县级(county/county-level region/county-level division)、41636个乡级(township/township-level region/township-level division)及无数村级(village/village-level region/village-level division)【非宪法区划】行政区。各个级别又有不同名称,下面加以详细讨论【具体数字以2005年统计数据为准】。



最大化兼容 html5 视频

2014-11-11 HTML5

HTML5 在 web 页面使用 video 元素呈现视频。但 HTML5 视频并不是最终的解决方案,它不能在所有的浏览器工作。你知道 HTML5 视频真的在网上工作吗? 你担心 HMTL5 视频兼容性吗? 看看这篇文章的建议和解决方案如何最大化 HMTL5 视频兼容性。


嵌入视频到 html5 页面

2014-11-11 HTML5

HTML5 的到来之前,每个视频的播放都需要通过 web 浏览器中通过第三方浏览器插件。最初我们亲眼目睹 RealPlayer,接着是 Windows Media Player 和 QuickTime, 现在是 Flash,这是目前主导的插件,播放大量的网络视频。




Help & Manual 导航生成失败--解决

2014-10-27 Help

近期发现用 Help & Manual 5 来写帮助文档导航生成失败, 失败 后测试发现,将项目名称oem_0.9.2_help(2014.10.10) 改为 oem_0.9.2_help(2014.10.10) 就好了~

成功

判断是项目名称中文字符不支持造成的。


为毛Github的contributions贡献值不增长了

2014-10-18 Git

近期发现每天在 Github 做代码提交,但是 contributions 的面板(贡献图)上的绿点(即贡献值)却没有增长了。擦~ 有两个礼拜了。如下图 contributions 而且,同时发现以前的绿点也是稀稀拉拉的,遂感觉 contributions 可能被漏记了。看了下 Github 对于 contributions 的 说明更新时间是在昨天(2014-10-17),说明 contributions 的统计策略是经常改变的。

本文详细说明了如何contributions贡献值是如何统计的。同时参照最新的 contributions 的 说明(时间 2014-10-17),并且在以后会同步官网的更新,方便各位网友。

#哪些 contributions 贡献值会被统计

##Issues and pull requests 问题和请求

问题和请求将出现在您的贡献图上需满足下面这两个条件:

  • 他们开启的时间是在过去的一年。
  • 他们开启的时候是一个独立的存储库,不是 fork 来的库

##Commits 提交

提交将出现在您的贡献图上,如果它们满足所有以下条件:

  • 在过去的一年之内作出的提交。
  • 用于提交的电子邮件地址是与您 GitHub 帐户相关联。
  • 提交是在一个独立的库,不是 fork 来的库
  • 提交是在库的默认分支。

此外,至少其中一项必须为真:

  • 你是存中的合作者或拥有库的组织中的成员。
  • 你 fork 了库。
  • 你已经在存中打开一个拉请求或问题。
  • 你给库打了星星。

私人库的贡献只会显示给可以访问这些库的用户。这些贡献都不会呈现给无法访问这些库的用户。

#贡献不被计算在内的常见原因

##你还没在你 GitHub 配置文件中添加你本地 Git 提交的电子邮件

提交时必须采用已添加到您 GitHub 的配置文件,出现在你的贡献图上的电子邮件地址。您可以检查电子邮件通过将.patch 添加到用于提交 URL 后面,例如 https://github.com/octocat/octocat.github.io/commit/67c0afc1da354d8571f51b6f0af8f2794117fd10.patch :

From 67c0afc1da354d8571f51b6f0af8f2794117fd10 Mon Sep 17 00:00:00 2001 From: The Octocat Date: Sun, 27 Apr 2014 15:36:39 +0530 Subject: [PATCH] updated index for better welcome message

其中电子邮件的格式: 字段是在本地 git 的配置设置中设置的地址。在此示例中,用于提交的电子邮件地址是 [email protected]

如果没有被用于提交的电子邮件地址添加到您 GitHub 的配置文件,您必须将电子邮件地址添加到您的 GitHub.com 帐户或 GitHub 企业帐户。当您添加新的地址时,您的贡献图将自动重建。

一般的电子邮件地址——如 [email protected]——不能添加到 GitHub 帐户。如果您使用此类电子邮件为您的提交,提交将不被链接到 GitHub 配置文件并不会显示在您的贡献图。

##提交了一个非默认分支

提交只能是在默认分支 (通常master)被统计。如果你想在非默认分支中,希望他们能计入您的贡献,需要执行以下任一操作:

更改存库中的默认分支将更改它的所有库中的合作者。只能这样做,如果你想要新分支成为所有未来的请求和提交所针对的基础。

##在 fork 中做了提交

在一个 fork 作出的提交将不计入你的贡献。要使它们计数,必须执行下列操作之一:

  • 打开一个要更改合并到父资源库中的 pull 请求
  • 脱离 fork 并将在 GitHub.com 或 GitHub Enterprise中独立的库,分别联系 GitHub 的客服或您的站点管理员。

Java版本号处理-split 点号 split(".")

2014-09-24 Java

近期在做一个版本号的判断,在使用 Java split() 方法时,希望把版本号中的数字组成数组。很自然的,我用了 split(“.”) 来分割成数组,结果不行。

String v = "1.0.1";
String[] vs = v.split(".");

int len = vs.length;

for(int i = 0; i<len; i ++){
	System.out.println(vs[i]);
}

后查 API,得知 split 的参数是 String regex 代表的是一个正则表达式。如果是正则中的特殊字符,就不能了。点正好是一个特殊字符。如下方式解决:

String v = "1.0.1";
String[] vs = v.split("[.]");

int len = vs.length;

for(int i = 0; i<len; i ++){
	System.out.println(vs[i]);
}

HTML <label> 提升<input>用户体验

2014-09-17 HTML

如果没有 <label> 当然也能显示 <input> 的本文, 比如

<input type="radio" name="status" checked="true"  value="0"/>改造前
<input type="radio" name="status" value="2"/>改造后
<input type="checkbox" name="status1" value="3"/>www.waylau.com

点击组件上的文本不会有任何效果

改造前 改造后 www.waylau.com

但是,加上 <label> 后立马就不同了,可以点击文本来选中组件

<label><input type="radio" name="status2" checked="true"  value="0"/>改造前</label>
<label><input type="radio" name="status2" value="2"/>改造后</label>
<label><input type="checkbox" name="status3" value="3"/>www.waylau.com</label>


Way Lau

Software Engineer and Full Stack Developer, now work and live in Shenzhen, China. Detail

Donate

See the list of Donors.