How to use Mantis with Eclipse

In order to view and edit Mantis Tasks directly from Eclipse or Flex Builder
you need to install the Mylyn Plugin for eclipse first:

http://www.eclipse.org/mylyn/

Then install the Mylyn – Mantis Connector:

http://mylyn-mantis.wiki.sourceforge.net/

To add your mantis repository click on Window->Other Views in Eclipse.
Select the Mylyn Folder and add task list and task repositories.

Then go to the task repository view, right click and choose to add a new repository.

Now the trick is to enter the right URL to your Mantis service file.
Its normally found under http://yourdomain.com/mantis/api/soap/mantisconnect.php (since mantis 1.1.0)

If that’s done you can add a query by choosing a project and a filter (needs to be set up on the mantis web interface first) .

Now you can view and change your mantis tasks in the task view.

Linux Maven的安装

1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.4-bin.tar.gz,下载可以使用wget命令;

2.进入下载文件夹,找到下载的文件,运行如下命令解压

tar -xvf apache-maven-3.0.4-bin.tar.gz

解压后的文件夹名为apache-maven-3.0.4

3.使用mv命令将apache-maven-3.0.4文件夹拷贝到自己指定的文件夹,比如/usr/local/下

mv -rf apache-maven-3.0.4 /usr/local/

4.配置环境变量,编辑/etc/profile文件,添加如下代码

MAVEN_HOME=/usr/local/apache-maven-3.0.4
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin

5.保存文件,并运行如下命令使环境变量生效

source /etc/profile

6.在控制台输入如下命令,如果能看到Maven相关版本信息,则说明Maven已经安装成功

mvn -v

 

ant build java generics,ANT编译泛型

用ant编译java项目的,报泛型错误,但eclipse却没有报错;报错如下:

ScopeUtil.java:185: type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds boolean,java.lang.Object

代码如下 : 

public static final boolean isSuperAdmin() {
   return getSession(key_SuperAdmin);
}

@SuppressWarnings(“unchecked”)
public static final <T> T getSession(String name) {
ActionContext actionContext = ActionContext.getContext();
Map<String, Object> session = actionContext.getSession();
return (T) session.get(name);
}

经过分析,发现isSuperAdmin返回是boolean而getSession,返回是Boolean,既返回对象与返回类型的区别,所以在ant编译时出错;

把代码改一下就可以了:

public static final boolean isSuperAdmin() {
Boolean superAdmin = getSession(key_SuperAdmin);
return superAdmin == true;
}

巧用zookeeper实现分布式并行计算

云计算的技术话题中少不了“分布式”,“并行计算” 这些个关键词,我们知道硬件扩展的条件(Scale-up)始终是有限制的,将计算分散到网络中更多机器的CPU上提供更高的计算性能(Scale-out),并在这基础上能将计算同时进行,那么总体计算瓶颈会减小,计算的性能会显著提高,也就是说将串行计算变为并行计算,将大量的计算在同一时间发生,,将任务分配到每一个处理器上。这里面需要一个重要的角色,分布式计算资源中的协调者。

有这样一个场景:系统中有大约100w的用户,每个用户平均有3个邮箱账号,每隔5分钟,每个邮箱账需要收取100封邮件,最多3亿份邮件需要下载到服务器中(不含附件和正文)。用20台机器划分计算的压力,从多个不同的网路出口进行访问外网,计算的压力得到缓解,那么每台机器的计算压力也不会很大了。

通过我们的讨论和以往的经验判断在这场景中可以实现并行计算,但我们还期望能对并行计算的节点进行动态的添加/删除,做到在线更新并行计算的数目并且不会影响计算单元中的其他计算节点,但是有4个问题需要解决,否则会出现一些严重的问题:
1.20台机器同时工作时,有一台机器down掉了,其他机器怎么进行接管计算任务,否则有些用户的业务不会被处理,造成用户服务终断。
2.随着用户数量增加,添加机器是可以解决计算的瓶颈,但需要重启所有计算节点,如果需要,那么将会造成整个系统的不可用。
3.用户数量增加或者减少,计算节点中的机器会出现有的机器资源使用率繁忙,有的却空闲,因为计算节点不知道彼此的运行负载状态。
4.怎么去通知每个节点彼此的负载状态,怎么保证通知每个计算节点方式的可靠性和实时性。

先不说那么多专业名词,白话来说我们需要的是:1记录状态,2事件通知 ,3可靠稳定的中央调度器,4易上手、管理简单。
采用Zookeeper完全可以解决我们的问题,分布式计算中的协调员,观察者,分布式锁  都可以作为zookeeper的关键词,在系统中利用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁等功能,利用这些特色在分布式计算中发挥重要的作用。

zookeeper的服务器端是采用Java编写,而zookeeper的客户端不仅可以支持java还可以支持C语言的客户端,在zookeeper服务端可以创建一个树状的Key/Vaule 存在着父子节点之间的关系。

Zookeeper允许多个Client对一个或多个ZNode数据进行监控,当ZNode有变化时能够通知到监控这个ZNode的各个Client,所有监听这个节点的成员都会知道了,Zookeeper使用Watcher察觉事件信息,当客户端接收到事件信息,比如连接超时,节点数据改变,子节点改变,可以调用相应的行为来处理业务逻辑。相反,如果zookeeper客户端对服务端的znode不关注,不Watcher,那么发生任何变化zookeeper的客户端都不会收到事件通知。

zookeeper中znode的数据模型
data model

每次zookeeper客户端与服务器端连接后都会创建一个session ID 给客户端,客户端将会定期心跳协议到服务器端验证这个连接的有效性。如果由于某种原因,客户端无法发送心跳到服务器,将导致服务器验证过期的会话,会话ID将变为无效。客户持有的连接/对象将不可用,因此应用程序必须创建一个新的客户对象。如果zookeeper客户端连接到服务器没有任何响应,首先客户端会作抛出的异常并且被捕获,清除当前与Server相关的网络资源和连接会话,然后客户端逐个尝试配置列表中Server的连接地址,选择可用的服务器继续进行工作。

上述Zookeeper客户端和服务器端的关系又是一个典型的“观察者”模式,客户端关注自己关心的对象(znode),一旦发送变化就立刻通知。在《Head First设计模式》中有这样的一张图来表达 观察者模式的。
“观察者”模式
如图所示,此系统中的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板,再来看看百度百科对“观察者”模式的解释:http://baike.baidu.com/view/1854779.htm

通过对Zookeeper的了解,实现我们系统中需要的Failure detection和Load detection 功能,只需要在每个计算的节点中实现zookeeper客户端程序,计算节点关注zookeeper服务器上znode节点变化。可以在zookeeper服务器的znode上创建一个根节点/clusterA,下面根据计算节点机器名创建对应的子节点,子节点中的value就是这台计算节点的ip地址。
如:/clusterA/node1,/clusterA/node2,/clusterA/nodeN,这些节点都是临时节点(EPHEMERAL),一旦连接断开,创建的节点自动会被删除,关注/clusterA这个根节点/clusterA的机器都会知道现在哪台机器离开计算单元了,并且获知现在有多少个计算节点在这个计算单元中。
如果有新的计算节点添加,在程序运行的第一步将会到zookeeper服务器上的/clusterA 的znode上创建一个子节点/clusterA/nodeZ,这样关注 /clusterA这个znode的机器都会知道现在多了一个计算节点。
通过zookeeper客户端API中的getChildren()方法对应的数据类型是java.util.List,其返回/clusterA下面的机器列表,这样还能判断出自己在这个列表中排行位置,通过列表中排行位置可以对应用户列表中的数目,这样就知道自己去获得需要计算总数中的几分之分。
例如:有100w用户,20个节点时,每个节点处理5w用户进行同时计算,node3计算节点承载用户总数中10w-15w用户之间的计算压力,有200w用户,20个节点时,每个节点处理10w个用户的业务进行同时计算,node3计算节点承载用户总数中30w-40w用户的计算压力,以此类推。
这样一来无论计算节点的数目发生变化还是,需要计算的数目发生变化,都可以保证计算压力的平均分载。

我的废话:
1.根据节点数对应用户数算出百分比之后进行计算分载,貌似我们通常的分页查询,只不过将每页的分页结果同时显示在N多个显示器上输出,希望这样比喻能让您更好的理解。
2.在计算的中间有新的用户数量增加,将会通知每个计算节点 下次轮询时需要重新统计用户数量,因为用户所有用户的数据分块拿走以后放入本地的静态hashmap(缓存),没有发生变化就从本地加载,操作数据库发生变化后,通知zookeeper的znode节点 每个计算节点重新从数据库中加载一次。
3.在并行计算中时间同步也是一个需要注意的地方,如果每台机器上的时间不一致会导致潜在的隐患,可以找些工具通过时间服务器同步每台机器上的当前时间和时区。
4.使用zookeeper对计算节点的状态管理只是zookeeper实现的一部分,zookeeper还可以对外提供分组,配置管理,命名空间等服务等,这里只是做了一个抛砖引玉的作用。

对于zookeeper的可靠性和性能而言,有足够的机器那么稳定性就会越高,但是性能会降低,因为ZooKeeper在运行时全部的数据都会加载到内存中,集群中每一台服务器都包含全量的数据,每个节点实时保持数据的同步。因此整个集群中Follower数量越多,整个集群写入的性能越差。后来zookeeper Server为了避免这个问题,可以将ZooKeeper集群中部分服务器指定为Observer。

MOVE 开发模式

MVC模式在编程中的应用,是一个很了不起的主意。“数据模型(Model)”可以封装与应用程序的业务逻辑相关的数据及对数据的处理方法;“视图层(View)”能够实现数据有目的的显示;“控制器(Controller)”能够在不同层面间起到组织作用,对应用程序的流程进行控制。

不过,可能你在使用这种三层架构模式的过程中会逐渐迷惑。因为有很多代码你不知道把它放哪,就只好把它放到控制层,最后发现在控制层中塞了太多的代码。

LinkedIn的软件工程师Conrad Irwin也遇到同样的问题,于是他开始使用另一种模式:MOVE,即Models(模型)、Operations(操作)、Views(视图)、Events(事件)。

近日Conrad Irwin在个人博客上分享了关于这种模式的一些观点。

概述

Irwin结合上图对MOVE模式先作了简单定义:

  • Models,封装该应用程序中知道的一切;
  • Operations,封装该应用程序要做的一切;
  • Views,帮助用户与应用程序完成交互;
  • Events,用于安全地连接所有这些组件。

为了避免意大利面条式的代码,图中标示出了对哪种类型的对象进行操作是允许的。例如,视图允许监听由模型产生的事件;操作允许修改模型,但模型不应涉及视图或操作。

Models(模型)

这里以一个“User”对象为原型,它至少应用有一个Email地址,也可能有用户名和电话号码。

在一个MOVE模式的Models中只包装知识。这意味着除了Get和Set功能,它们可以包含检查用户密码是否正确这样的方法,但不会包含把密码保存到数据库或传递给外部API这样的功能,因为后面这些工作将由Operations来完成。

Operations(操作)

对应用程序来说,一个常见的操作是用户登陆。这实际上是由两个子操作组成:首先从用户那里获得邮件地址和密码,然后从数据库载入“user”模型并检查密码是否匹配。

Operations是MOVE模式中的行动者。它负责修改模型,在正确的时间显示正确的视图,以及响应由用户交互引发的事件。在一个分解良好的应用程序中,每个子操作都可以独立运行。

采用这种方式的操作有一点很令人振奋,即程序启动后,整个应用本身就可以被当作一个Operations。它会根据需要生成尽可能多的子操作,其中每个子操作都并行地运行。当所有子操作都完成时,程序也便退出。

Views(视图)

登陆页面即是一个视图,它负责显示一些文本框给用户。当用户点击“登陆”按钮时,视图将产生一个“loginAttempt”事件,其中包含用户输入的用户名和密码。

用户能够看到的内容,以及能感受到的互动都由视图提供支持。它们会以一种用户能理解的形式呈现应用反馈,同时还能将简单的用户交互转换成有意义的事件。更重要的是视图不会直接改变模型,它们只是向Operations发起事件,然后通过监听等待由模型发起的事件。

Events(事件)

当用户登陆时,视图会发起“loginAttempt”事件。在登陆操作完成后,“currentUser”模型会发起一个事件通知应用登陆状态已改变。

事件监听让MOVE(及MVC)实现控制反转,允许模型更新视图。这是一种强大的抽象技巧,允许组件互不干扰地耦合在一起。

为什么是现在?

当然,Conrad Irwin并不想被人认为自己是在暗示MVC模式很差,这种大型应用程序架构在过去的几十年里确实非常成功。不过几十年后的今天,新的编程技术已经变得越来越流行,所以你也会在使用过程中逐渐产生一些疑惑。

MVC模式确实很了不起,但它毕竟是几十年前为老的技术而设计。MOVE模式是在其基础上的升级,让你可以更好地利用当前已有的新工具。

monitoring your javaEE application : javamelody

Screenshots

The goal of JavaMelody is to monitor Java or Java EE application servers in QA and production environments. It is not a tool to simulate requests from users, it is a tool to measure and calculate statistics on real operation of an application depending on the usage of the application by users.

JavaMelody is opensource (LGPL) and production ready: in production in an application of 25 person years. JavaMelody is easy to integrate in most applications and is lightweight (no profiling and no database).

JavaMelody is mainly based on statistics of requests and on evolution charts.

It allows to improve applications in QA and production and helps to:

  • give facts about the average response times and number of executions
  • make decisions when trends are bad, before problems become too serious
  • optimize based on the more limiting response times
  • find the root causes of response times
  • verify the real improvement after optimizations

It includes summary charts showing the evolution over time of the following indicators:

  • Number of executions, mean execution times and percentage of errors of http requests, sql requests, jsp pages or methods of business façades (if EJB3, Spring or Guice)
  • Java memory
  • Java CPU
  • Number of user sessions
  • Number of jdbc connections

These charts can be viewed on the current day, week, month, year or custom period.

JavaMelody includes statistics of predefined counters (currently http requests, sql requests, jsp pages and methods of business façades if EJB3, Spring or Guice) with, for each counter :

  • A summary indicating the overall number of executions, the average execution time, the cpu time and the percentage of errors.
  • And the percentage of time spent in the requests for which the average time exceeds a configurable threshold.
  • And the complete list of requests, aggregated without dynamic parameters with, for each, the number of executions, the mean execution time, the mean cpu time, the percentage of errors and an evolution chart of execution time over time.
  • Furthermore, each http request indicates the size of the flow response, the mean number of sql executions and the mean sql time.

It also includes statistics on http errors, on warnings and errors in logs, on data caches if ehcache and on batch jobs if quartz.

An optional and independent collect server may be used if necessary to unload the application of storage management, and of report generation and to centralize the data of clustered applications or of several applications.

 

Site : http://code.google.com/p/javamelody/

Android多线程断点续传下载文件类设计

对于Android平台,很多网友可能考虑开发一个软件商店,对于Android平台上如何实现断点续传操作呢? 这里给大家一些思路和原理的介绍,同时在Android手机上要考虑的一些事情。

1. 流量控制,获取运营商的接入方式,比如说使用移动网络接入,尽可能的提示用户切换WiFi或提示,限制下载的流量以节省话费。

2. 屏幕锁控制,屏幕锁屏后导致应用会被挂起,当然Android提供了PowerManager.WakeLock来控制。

3. 对于断点续传,这要追溯到Http 1.1的特性了,主要是获取文件大小,如果这个无法读取的话,那么就无法断点续传了只能使用chunked模式了,当然获取远程服务器上文件的大小可以通过Http的响应头查找Content-Length。

4. 获取上次文件的更改时间,对于断点续传来说比较有风险的就是 继续下载的文件和早期下载的在server上有变动,这将会导致续传时下载的文件版本和原始的不同,一般有两种解决方法,早期我们配置服务器时通过Last-Modified这个http header获取文件上次修改时间,不过本次Android开发网推荐使用更为强大的ETag,ETag一般用于解决同一个URL处理不同返回相应,比如Session认证,多国语言,以及部分黑帽的SEO中。具体的实现大家可以参考RFC文档。

5. 考虑服务器的3xx的返回,对于专业的下载文件服务器会考虑到负载平衡问题,这就涉及到重定向问题,处理重定向使用Android的Apache库处理比较好。

6. 至于多线程,这里CWJ提示大家可能存在独立的线程下载一个文件,和多个线程分块下载单个文件之分,其中后者需要考虑上次下载数据是否存在问题,同时如果服务器不支持文件大小获取,则无法通过分段下载数据,因为不知道如何分段,所以在chunked模式中,只能使用一个线程下载一个文件,而不是多个线程下载一个文件。

7. 下载后的数据效验,可以考虑CRC等方式,当然对于一般的传输只要逻辑不出现问题,基本上不会有偏差。

8. 考虑DRM问题,这个问题在国内用的比较少,而国外的受数字保护的音乐和视频,需要额外的获取证书等。

9. 重试次数,对于一个文件可能在本次网络传输中受到问题,尤其是移动网络,所以可以设置一定的重试次数,让任务单独的走下去。

10. 线程开发方式,这里如果你的Java基础比较好,推荐直接使用Java并发库API比较好,如果过去只做过Java开发使用Thread即可,如果Java技术不过关可以Android封装的AsyncTask。

原文地址:http://www.android123.com.cn/androidkaifa/932.html

每天写出好代码的5个建议

成为一个优秀的程序员和成为其他优秀的专业人员一样,需要尽可能多的做一些有质量的工作。有句很流行的话可以总结:做,正确做事,立马就做。(Do it. Do it right. Do it right now)

0. 将一天要做的事情列成清单

完成复杂活动(activity)的最好方法是将其拆分成简单的各项活动。每天早上,将你一天要完成的活动进行拆分,然后制定一个相应的日程安排表,这样能够帮助你:

  • 更好的理解这个活动。
  • 每天都有一个集中的目标。
  • 提高你的估计能力,几天之后,你会发现你能预测一天的工作量。

1. 一次只做一件事

集中于一项任务比同时做多项任务更多产,不同的研究已经证明这个观点,并且发布在不同的媒体上(例如CNN)。

集中精力工作25分钟,休息5到10分钟。你可以用诸如“番茄工作法”这种流行的技术来帮助你管理时间。还有工具能帮助你测量你花在各项不同任务上的时间,我最喜欢的是CoolTimer,这里也有10个不错的时间追踪应用程序

2. 正确做事

以下两个是考察事情是否正确完成的关键:

  • 要为解决方法感到到自豪,因为这不仅仅只是个普通的解决方法,这是个好的方法。遵循“软件质量金字塔”的原则
  • 解决方法至少要经过一次检查。在你的同事中,请一位你尊敬的优秀开发人员检查你的方法,并接受他的真诚建议。

3. 不要半途而废

众所周知,若仍有一个玻璃杯需要清洗,则不能说已经洗完了。粉刷墙壁或驱车前往某处这些事情上我们也认可同样的道理,但在软件开发上我们却不这么认为了。即便我们没有完成所有的单元测试,或者我们没有核实实现方式是否符合用户的需要,我们也说完成了任务。这是典型来自Hope Driven Development的行为,是非常有害的。

需求没有更改时,只有当你百分之百确认再也没有必要改善那个解决方法时,才能算完成任务。

4. 与其道歉,不如补救,而放弃最不可取。

如果你要花额外的时间来完成一些代码的测试,或者重构不可读的类,那么就去做,因为这是为将来投资时间。但是如果你在某件事上面卡住了或者将项目拖延的太久,那么寻找一个更容易的方案。它可能不如你目前正在实现的方案优雅,但至少你有方案。确保记录下来以应对这个项目将来的风险,并且有些东西需要重新审查。

——————————————————————-
你可能对以下文章也感兴趣

各种语言的运行时刻性能消耗
我从PHP退役了
25款适用于开发人员的Firefox 4插件
Javascript:C语言和Self语言一夜情的产物
5本免费的Java电子书

——————————————————————-
译文出处:伯乐在线 – 职场博客 – 程序员
译文链接:http://www.jobbole.com/entry.php/971

原文:Alberto Gutierrez 翻译:敏捷翻译 – 唐瑭

如需转载,但请注明原文/译文出处、译文超链接和译者等信息,否则视为侵权,谢谢合作!

 

Java: Reading a pdf file from URL into Byte array/ByteBuffer in an applet.

I’m trying to figure out why this particular snippet of code isn’t working for me. I’ve got an applet which is supposed to read a .pdf and display it with a pdf-renderer library, but for some reason when I read in the .pdf files which sit on my server, they end up as being corrupt. I’ve tested it by writing the files back out again.

I’ve tried viewing the applet in both IE and Firefox and the corrupt files occur. Funny thing is, when I trying viewing the applet in Safari (for Windows), the file is actually fine! I understand the JVM might be different, but I am still lost. I’ve compiled in Java 1.5. JVMs are 1.6. The snippet which reads the file is below.

public static ByteBuffer getAsByteArray(URL url) throws IOException {
        ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();

        URLConnection connection = url.openConnection();
        int contentLength = connection.getContentLength();
        InputStream in = url.openStream();
        byte[] buf = new byte[512];
        int len;
        while (true) {
            len = in.read(buf);
            if (len == -1) {
                break;
            }
            tmpOut.write(buf, 0, len);
        }
        tmpOut.close();
        ByteBuffer bb = ByteBuffer.wrap(tmpOut.toByteArray(), 0,
                                        tmpOut.size());
        //Lines below used to test if file is corrupt
        //FileOutputStream fos = new FileOutputStream("C:\\abc.pdf");
        //fos.write(tmpOut.toByteArray());
        return bb;
}

I must be missing something, and I’ve been banging my head trying to figure it out. Any help is greatly appreciated. Thanks.

 


 

Edit: To further clarify my situation, the difference in the file before I read then with the snippet and after, is that the ones I output after reading are significantly smaller than they originally are. When opening them, they are not recognized as .pdf files. There are no exceptions being thrown that I ignore, and I have tried flushing to no avail.

This snippet works in Safari, meaning the files are read in it’s entirety, with no difference in size, and can be opened with any .pdf reader. In IE and Firefox, the files always end up being corrupted, consistently the same smaller size.

I monitored the len variable (when reading a 59kb file), hoping to see how many bytes get read in at each loop. In IE and Firefox, at 18kb, the in.read(buf) returns a -1 as if the file has ended. Safari does not do this.

I’ll keep at it, and I appreciate all the suggestions so far.

 

come from : http://stackoverflow.com/questions/637100/java-reading-a-pdf-file-from-url-into-byte-array-bytebuffer-in-an-applet

Matcher: groupCount()

/*
Group 0: 1
Group 1: 1
Group 2: null
Group 3: null
Group 0: 2
Group 1: 2
Group 2: null
Group 3: null
Group 0: 3
Group 1: 3
Group 2: null
Group 3: null
Group 0: 4.5
Group 1: 4.5
Group 2: .5
Group 3: null
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainClass {

public static void main(String[] av) {
String regEx = “[+|-]?(\\d+(\\.\\d*)?)|(\\.\\d+)”;
String str = “a b c d e 1 2 3 4.5 “;
Pattern pattern = Pattern.compile(regEx);
Matcher m = pattern.matcher(str);
while(m.find()) {
for(int i = 0; i<=m.groupCount() ; i++) {
System.out.println(“Group ” + i + “: ” + m.group(i)); // Group i substring
}
}
}

}