邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

置顶随笔 #

在过去的一年中。断断续续的使用了一些Grails。用他做了点东西。觉得不错,所以希望更多的人来了解他。使用他。所以录制了一点视频,和大家分享。视频会不定期持续更新!

第一集 Grails 开发环境准备

http://v.youku.com/v_show/id_XNjUxNjgxMjA4.html

 

第二集 配置使用 Grails Spring security

http://v.youku.com/v_show/id_XNjY2MDc4MDgw.html

 

第三集  Grails中数据库连接

http://v.youku.com/v_show/id_XNjk4NTM2NDgw.html

posted @ 2014-04-23 22:49 Jet Geng 阅读(2499) | 评论 (0)编辑 收藏

2014年4月23日 #

在过去的一年中。断断续续的使用了一些Grails。用他做了点东西。觉得不错,所以希望更多的人来了解他。使用他。所以录制了一点视频,和大家分享。视频会不定期持续更新!

第一集 Grails 开发环境准备

http://v.youku.com/v_show/id_XNjUxNjgxMjA4.html

 

第二集 配置使用 Grails Spring security

http://v.youku.com/v_show/id_XNjY2MDc4MDgw.html

 

第三集  Grails中数据库连接

http://v.youku.com/v_show/id_XNjk4NTM2NDgw.html

posted @ 2014-04-23 22:49 Jet Geng 阅读(2499) | 评论 (0)编辑 收藏

2013年5月31日 #

原起

EverNote 的强大已经无需多说。他自己有很好的客户端,不过那个只是对Windows和OS X。在linux下面就虾米菜了。就是Windows和OS X下面的客户端也存在一个致命的弱点:不支持 MarkDown
不过有好人做了一个工具 Geeknote 让我们可以在任何装有python的机器上使用Evernote。 更强大的是他可以使用任何编辑器编辑笔记,支持 MarkDown 。 有如此好处还等什么啊赶紧用起来。
个人在使用的时候发现原版有点点不舒服的地方,做了点点小改动放在了 GitHub。 具体是什么改动,先买个关子。

安装

直接从源码安装

  1. 使用 git clone git@github.com:jetgeng/geeknote.git 命令下载源码
  2. 进入 geeknote 目录。
  3. 运行 python geeknote.py login 登录evernote
  4. 通过 python geeknote.py create , python geeknote.py edit , python geeknote.py find 命令来创建,编辑和查询你的ervernote 中的笔记。
  5. 通过 python geeknote.py settings --editor vim 命令把编辑Evernote的编辑器设定成我最喜欢的vim。 当然你可以设定成你喜欢的。
  6. 这个时候你已经用上了GeekNote。 但是还会有点不爽。最起码我这个时候不爽。

不爽的地方

  1. 当我用python geeknote.py edit 命令使用vim打开我要编辑的笔记时,笔记居然没有把 MarkDown 语法给我高亮出来! 不爽!!
  2. 输入命令一定要带一个什么python 之类的太繁,而且我tab的时候也没有给我把命令补全!在命令行中没有自动补全,太不爽了!!

改之

让vim正确设定filetype

在 vim中一般是根据文件的后缀名来识别该文件是什么类型。然后为他加载相应的语法高亮,代码补全什么的。在没有改动前geeknote是为笔记创建的临时 文件时没有后缀的。只是随机的创建一个形如 tmpsNbc8k这样的文件。所以Vim无法识别他是何种文件,就无法为他加载对于的语法高亮之类的。

既然找到原因了就先看一下geeknote是否有什么地方可以设定,让他产生的临时文件有后缀。最后在editor.py文件中发现了这么一行代码: (tmpFileHandler, tmpFileName) = tempfile.mkstemp() 。 直接没有给任何后缀的想法。
那就加上吧。
我所做的动作就是这个,给他加上了一个文件后缀的设定。
通过python geeknote settings --suffix suffix 这样的命令来设定零时文件的后缀。这样语法高亮,代码补全就回来了。小爽一下!

命令行自动补全

这个其实geeknote已经想到了,而且已经做了。代码仓库中的那个 bash_completion/geeknote 文件就是干这个活的。 所以我只要把这个文件copy到 /etc/bash_completion.d/ 下就可以了。
但是copy进去后没有达到我想要的效果。没有自动补全。最后发现是geeknote配置的补全命令和我们执行的时候不一致。
下面要做的就是把它们搞一致了。
我的操作步骤如下:
1. chmod +x geeknote.py 给geeknote.py加上可执行权限。
2. 将geeknote.py所在路径加入到PATH中去。
3. 修改 /etc/bash_completion.d/geeknote 文件中的 geeknote 为geeknote.py 这个在我上面提到的github中可以找到。

这个时候在新开一个控制台,输入 geeknote.py tab 可以自动补全了。小爽一下!

posted @ 2013-05-31 22:57 Jet Geng 阅读(8294) | 评论 (1)编辑 收藏

2011年7月22日 #


Gemini测试小工具

作 者: Jet Geng
日 期: 2011-07-22

概述

Blueprint 起步中我们已经成功的通过 Blueprint 容器创建了一个POJO。我们只是通过log的方式查看到我们的POJO已经被创建了。无法深入的去了解容器内部Bean的运行状态和行为。 所以才有必要创建一个Gemini控制台这样的程序。这个控制台最初的需求是:

  • 能够动态查看特定的Bean是否被创建。
  • 能够动态的获取特定的Bean。
  • 能够检查特定Bean的行为是否正确。

解决方案

为了解决以上的问题。我做了一个小工具。 这个小工具的目的让客户的动态脚本能在最终的目标环境中运行。使用方式如下:
  1. 从 git://github.com/jetgeng/OSGi.git 下载 org.gunn.gemini.consoleorg.codehaus.groovy 这两个项目。
  2. 并把这两项目加入到你的TargetPlatform中。
  3. 使用 invokegv 来运行groovy脚本。
    1. 直接在命令行输入脚本。例如: invokegv print act.getBean(''myPOJO'')
    2. 通过输入Groovy文件。例如: invokegv file:///Users/Puer/.../script.groovy

注解

在Groovy脚本中有一个内建的变量 act , 他又一个叫做 getBean 的方法。通过这个方法你可以获得当前 OSGi 平台中所有的BlueprintContainer中的组件。他的输入参数时Bean或Service的id。 如果是使用Groovy文件的形式,注意文件的url格式。他是通过如下的正则表达式 file:\\/{2}(\\/[:\\w\\.]+)+ 进行验证的。并且路径中暂时不支持中文。

这个周末(23或24日)完成一个简单的录屏,来演示这个小工具的使用。

posted @ 2011-07-22 01:01 Jet Geng 阅读(3122) | 评论 (0)编辑 收藏

2011年7月10日 #

1 概述
Blueprint 使用手记 Jet Geng
July 10, 2011
Blueprint 是 OSGi Service Platform Enterprise Specification 标准的一 部分。很多最佳实践中也都推荐在应用程序中使用他。最近在项目中用他 来发布和应用服务。感觉效果不错。所以就有了这篇使用手记!欢迎各位 看官拍砖!
2 配置环境
我们在前期找到了两个 Blueprint 的实现:一个是 Apache 的 aries,另 外一个就是 Eclipse 的 Gemini。最后选择了 Gemini。做出这样的决定出于 两点考虑:
• Blueprint的标准就是由Spring提出。
• Gemini的初始代码由Srping所捐献。 下面我就简单介绍一下环境的配置过程:
• 从http://eclipse.org/gemini/ 下载 Gemini 的合适的版本。我们 采用的是 1.0.0M1。并解压到路径 A
• 从http://static.springsource.org/downloads/nightly/milestone-download. php下载 spring-osgi-2.0.0.M1-with-dependencies。并解压到路径 B。 他里面包括了 Gemini 所依赖的 bundle。说白了也就是 SpringFrame- work。
• Eclipse 中新建一个 Target Platform。把上述的路径 A和 B 加入到新 建的 Target Platform 中去。
• 选择新建的 Target Platform 为当前活动的 Platform。 3 启航
个人理解 Gemini 就是 OSGi 世界中的 IOC。既然是一个 IOC 框架,那 我们就从创建一个 Bean 开始吧!

3.1    创建一个 Bean 首先我们来看一下我们要存入 Container 中的 POJO。
Listing 1: POJOWillInContainer.java
package org.gunn.gemini.demo;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**
* This pojo will create by blueprint container * 
@author Jet Geng * */
public class POJOWillInContainer { private Logger logger =
}
LoggerFactory.getLogger(POJOWillInContainer.
class); private String name ;
private String age;
public void setName(String name) { logger.info("the new name is:" + name); this.name = name;
}
public void setAge(String age) { logger.info("the new age value is:" + age); this.age = age;
}

这个超级简单的一个 POJO,我们如何通过 Gemini 来创建他呢?我们通过 一个简单的配置文件。具体如下。
Listing 2: pojoconfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    
<bean id="myPOJO" class="org.gunn.gemini.demo.POJOWillInContainer" >
        
<property name="name" value="JetGeng"/>
        
<property name="age" value="32"/>
    
</bean>
</blueprint>

用过 spring 的兄弟,第一眼就能看明白这个配置文件说的是什么。其实就 是创建了一个 bean。到这里,我们所需要做的工作其实就已经完成了。下 面就可以通过 Debug 来启动了。
3.2    运行 Blueprint 容器 首先把 pojoconfig.xml 文件放到 project path/OSGi INF/blueprint 目录
下。或者在 MANiFEST.MF 文件中通过如下语句进行指定。 Blueprint-Bundle: config/account-data-context.xml, config/osgi-*.xml
更多内容参考http://www.eclipse.org/gemini/blueprint/documentation/ reference/1.0.0.RC1/html/app-deploy.html中的 8.2 Blueprint Manifest Configuration Comparison。好了,我们可以启动我们的应用程序了。为了 能够让 blueprint 顺利的跑起来,我们必须要把 blueprint 相关 bundle 以及 他所依赖的 bundle 都加入到运行时中。 按照上图配置后,点击运行。我们
Figure 1: Debug 配置

将在控制台得到如下内容。

控制台中的黑色行显示我们的 POJO 已经被 BlueprintContainer 创建

了,并且设定了相关属性。
.
这个部分的全部代码已经放到了 git://github.com/jetgeng/OSGi.git 中了。 感兴趣的筒子可以 down 下来玩玩。
posted @ 2011-07-10 11:06 Jet Geng 阅读(5029) | 评论 (4)编辑 收藏

2010年8月11日 #

用Graphviz显示树

缘起

前几天不知道那根筋搭错,又拿出了大学时候买的一本讲算法的书翻了起来。想起当年学习Tree的时候,看着数据结构凭空去想那颗倒着的树。那个叫做苦啊。所以就像有没有什么办法让Tree自己画出这样的结构图出来。

动手

既然想到了,就动手做把。因为以前用Graphviz画过一点mindmap,类图之类的小东西。让我一下子就想到了,我只要能从Tree结构中方便的输出成一个能绘制出对应树结构的Graphviz脚本就可以。这应该是代价最小的做法。 呵呵,废话不多说了。看看的Tree的代码吧!

 @Override
    
public String toString() {
        StringBuffer strValue 
= new StringBuffer();
        StringBuffer rout 
=  new StringBuffer("{rank=same ");
        
        
if(getLeftTree()  != null ) {
            strValue.append(root).append(ARROW).append( getLeftTree().getTreeNode()).append(
";\r").
                        append( getLeftTree());
            rout.append(getLeftTree().getTreeNode() ).append(ARROW).append(EXTEND).append(root);
      
        }
        
        strValue.append(EXTEND).append(root).append(
"[label=\"\",width=.1,style=invis];\r");
        strValue.append(root).append(ARROW).append(EXTEND).append(root).append(
"[style=invis];\r");
     
        
if(getRightTree() != null) {
            strValue.append(root).append(ARROW).append( getRightTree().getTreeNode()).append(
";\r").
            append( getRightTree());
       
            rout.append(ARROW).append(getRightTree().getTreeNode());
        }
        strValue.append(rout).append(
" [style=invis] } ;\r");
        
return strValue.toString();
    }

产生脚本的动作全部在这里完成了。我通过如下代码创建了一颗树

       ITree<Integer> tree = new TreeImpl<Integer>(6);   
        tree.addNode(
3);
        tree.addNode(
16);
        tree.addNode(
5);
        tree.addNode(
4);
        tree.addNode(
2);
        tree.addNode(
10);
        tree.addNode(
30);

最后得到的一副如下的图

呵呵,这样的话就可以随时查看树的结构了,我们所需要做的只是把object toString一下就可以。

附上一些文件

演示的录屏文件

完整的代码 

posted @ 2010-08-11 12:59 Jet Geng 阅读(3807) | 评论 (1)编辑 收藏

2010年5月30日 #

近来想了解一下关于网站建设方面的内容。自然而然的就找到了Drupal这个东西。刚开始没有发现他是多么的强大。抱着试试看的态度,

搭建了一个环境跑跑看。看完之后惊呼强大!他的强大来源于他的高度的可扩展,丰富的模块,主题。让你可以不写一行代码构建出一个不错的网站来。 看到这么强大的东西,就禁不住好奇往里看。于是找到了一些资料特与大家共享: 书籍:

  •  Using Drupal
  • Drupal 6 Attachment Views
  • Pro Drupal Development 悄悄的说一声,这几本书在itpub上都有下载。

视频:

还有两个很不错的网站。

上面提供了很多高质量的教学视频。让我这个初学者很快对drupal有个直观和深入的了解。

youtube.com上也有很多视频,有梯子的童鞋可以过去看看!

posted @ 2010-05-30 23:44 Jet Geng 阅读(1652) | 评论 (0)编辑 收藏

2010年5月14日 #


文中提到的代码castexception_src
编译好了包括不同的版本org.gunn.castexception.supplier插件文件为castexception_bin
posted @ 2010-05-14 19:15 Jet Geng 阅读(2667) | 评论 (6)编辑 收藏

2009年11月26日 #

问题

这两天在写一个小东西。这个小东西是一个大东西的一部分。其实也就是其中的一两个类。而这个大东西需要部署到一个特定的环境中去运行。所以有一堆的限制条 件,比如什么配置文件啊,包名,版本之类的什么东西。稍微有点差错就没有办法运行。需要正确得到这些东西需要一个很庞大且冗长的构建过程。而我写的也就是 两三个类,所以最直接的方式就是把我写的java 文件编译或的class 文件直接复制到jar文件中。 完成这样工作有好几中方式,最直接的方式就是纯手工打造


GraphViz image

PS: 这种方式费时费力,需要在不同的窗体间进行切换。例如我现在就在Eclipse、WinRaR和Windows资源管理器间切换。

解决过程

如何避免这个过程呢,尽量不用人来参与其中。这个肯定就是让一个小程序来把这几个动作连接起来。而且还要能够方便变动。比如我现在不想往a.jar 里面copy了。我想向b.jar 中复制了。所以就想到了脚本。对让脚本来完成这样的事情。第一反应想到的是ant

Ant 我的主角

  Ant 是 何须人,就不用我多说了。其实我了解也不多,只是知道这个小蚂蚁蛮力超大。下面就着手解决问题。第一反应就是找到一个直接copy的任务,把 fileset中的文件复制到jar文件中。但是遗憾的是我没有能够找到这样一个Task.这个时候我的思维陷入了困境。下面该怎么办?

困境

没有现成的东西,没有现成的能一步完成的东西?如何是好? 我是程序员,所以我我自己可以写一个task来满足这样的需求啊。对啊,我可以自己写的!正当我为这个想法兴奋不已时,正卷起袖子准备“大干”的时候。突然想起某人说过 不要重新造轮子! 。所以就追问了我自己一句: 角处会有什么呢?

我的拐角

既然Ant有蛮力,我可否利用一下他的蛮力呢?通过如下的这么一个流程来达到我的目的。


GraphViz image

这里用了一个temp文件夹作为中转,先解压,copy需要的文件,最后jar一下获得最后的更新好的jar。 最终获得了如下的build.xml

<target name="prepare">
                
<mkdir dir="${temp_dir}"/>
        
</target>
        
        
<target name="build" depends="prepare">
                
<echo message="unzip">Uzip Jar file</echo>
                
<unjar dest="${temp_dir}" src="${comp_plugin}/${contain_plugin}">
                
</unjar>
                
<copy todir="${temp_dir}">
                        
<fileset dir="./bin">
                                
                        
</fileset>
                
</copy>
                
<jar update="true"
                        destfile
="c:/${contain_plugin}" 
                        basedir
="${temp_dir}" >
                
</jar>
        
</target>
  

调整的过程

看上去,所有问题都解决了。但是偏偏在使用的时候遇到了小问题。我的jar包是要在osgi环境下工作的。所以特别依赖MANIFEST.MF文件。偏偏jar 这个任务默认情况下会生成一个默认的MANIFEST.MF文件。如果任由他胡来的话,就全虾米了。所以要稍微调整一下。


<jar update="true"
                        destfile
="c:/${contain_plugin}" 
                        basedir
="${temp_dir}" 
                        manifest
="${temp_dir}/META-INF/MANIFEST.MF">
</jar>
 

这样就可以了。大功告成!!

posted @ 2009-11-26 18:07 Jet Geng 阅读(2429) | 评论 (3)编辑 收藏

2009年11月7日 #

在我们创建领域模型前,我们有必要了解一下我们的模型用来表达什么内容。 所以我就先解释一下在这个系列文章中要实现应用。 假设Eclipse组织邀请你编写一个让他们管理贡献者和项目的应用程序。

我们需要创建一个模型来表达客户提供的信息。他们有可能如下图。

让我们进一步的看看这个模型。

Fundation

fundation是这个模型的根,他拥有两个列表属性。

projects: 像EMF,Techonlogy,Platform这样的顶级项目。
persons: 参加一个或多个项目的人。
Project

Eclipse项目拥有很多属性,比如项目开始和结束时间、项目的主页的url等等。下面列出我们最感兴趣的。

subprojects: 一个项目可以拥有多个子项目。子项目本身也可以拥有多个子项目。
parent: 项目有一个父亲(除了顶级项目外)。这就意味着项目和子项目(project-subproject)的关系是一个双向的关系。
projectleads 一个项目有多个项目领导人。
committers 一个项目可以拥有多个贡献者。
CommitterShip

当一个用户成为一个项目的贡献者(Committer)时,这就建立了一个committership。他拥有一个开始时间和结束时间。另外我们还要记录下下面的属性。

project: 和committership相关的项目。项目和committership是一个双向的关系。
person: 参加项目的人。
Person

贡献者或项目领导人的信息。我们关系的信息如下:

committerships: 用于保存和人相关的所有的committerships.这说明人和committership是一个双向关系。

下面这张类图给出了关于上面模型的全貌。

正如你所看到的,我把许多关系设成了双向关系。 As you noticed I modeled many of the relations as bidirectional relations. 这个并不是严格要求所有地方都要这样,因为有的地方可以通过eComtainer来获取他的父亲。就像project-subproject一样。 但是包含关系(containment relationship)在使用databinding的情况下就不太合适了。因为从子到父亲时没有对应feature,只能通过调用eContainer()方法来获得。 EMF提供了一个编辑器来创建你的Ecore-Model并把它保存成XMI格式。我们可以用它来创建测试数据。下图就是一个例子。

posted @ 2009-11-07 22:41 Jet Geng 阅读(2031) | 评论 (0)编辑 收藏

1.译序

在学习EMF-Databinding的时候发现了Tom Schindl的博客。他的博客中有一个关于EMF Databinding的专题。感觉很不多。想尝试着翻译一下。 那么Tom Schindl是何许人也?他是JFace项目的一个Contributor,在2007年Eclipse Zone 就曾经采访过他。 所以称他为EMF Databinding的专家一点也不过分。

Note

原文为路径为http://tomsondev.bestsolution.at/2009/06/06/galileo-improved-emf-databinding-support/

2. 原文

我很高兴的宣布在Eclipse-Galileo中EMF-2.5已经开始支持新的Eclipse-Databinding API了。荣誉归Matthew Hall,他审查我的代码,帮我整理支撑部分并且整理文档(详细内容在bug 262160 中)

几周前我成为了EMF项目的捐献者,现在我负责Databinding对EMF的支持模块。我将尽力修正API中的问题,回答Newsgroup中的问题。

请允许我在介绍这个API的优点以及如何使用它之前声明一点:这个API还处于过渡期,他可能会有一些细微的变化。不过我们将会详细说明变化的部分。

我将用一个系列文章来展现这个新的EMF-Databinding:

第一部分:创建领域模型
第二部分:介绍新的Properties API
第三部分:用EMF-Databinding绑定到TreeViewer
第四部分:在master-detail模式中使用Properties API
第五部分:用EMF-Databinding绑定到TableViewer
第六部分:Write your own Property for unsupport Widget-Types
第七部分:Make the storage system plugable

为了让你快速进入EMF-Databinding中,我在前几天做了一个例子。

所有代码都是基于EPL协议,你可以在从Eclipse-CVS 处获得。

posted @ 2009-11-07 22:39 Jet Geng 阅读(2034) | 评论 (0)编辑 收藏