生成javadoc时报“编码 GBK 的不可映射字符”错误的解决办法
如果源文件编码使用了utf-8编码,那么生成的文档可会有乱码,解决办法如下:
Generate javadoc时, 在对话框”Extra Javadoc options” 的文本框里面加上
-encoding UTF-8 -charset UTF-8
如果源文件编码使用了utf-8编码,那么生成的文档可会有乱码,解决办法如下:
Generate javadoc时, 在对话框”Extra Javadoc options” 的文本框里面加上
-encoding UTF-8 -charset UTF-8
数学之美ing…
===================读过…===================
effective java
《深入java虚拟机》
《我们老了花什么》
Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。
1 Overview
Bloom filter最早由 Burton Howard Bloom提出,是一种用于判断成员是否存在于某个集合中的数据结构。 Bloom filter的判断基于概率论:
Bloom filter通常被实现为一个包含 m 位的位数组(bit array),所有位的初始值都为0。 Bloom filter支持以下两种类型的操作:
如果query的结果为真(即positive),那么实际上存在以下两种可能性:
传统的Bloom filter 不支持从集合中删除成员。对于每个添加到Bloom filter中的成员,实际上将其位数组中的 k位设置为1。尽管将这些位重置为0可以保证从Bloom filter中删除该成员,但是这样做的副作用是可能会影响某些其它成员,因为其它成员也可能被映射到这些被重置为0的位中的一位或者多位, 从而最终导致false negatives。对于Bloom filter而言,false negatives是不被允许的。 Counting Bloom filter由于采用了计数,因此支持remove操作。
Bloom filter 使用的 k 个index functions,有时也被称为hash functions,它们通常被假定为彼此独立,返回值在可能的取值范围内均匀分布(这是以下一系列数学证明的基础)。
2 The Math
Bloom filter的基本概念并不复杂,接下来分析一下query操作对某个未被添加的成员返回positive(即false positive)的概率:
假设p是位数组中某一位为1的概率, 那么false positive的概率是 pk 。如果n是已经添加到Bloom filter中的成员个数,那么 p = 1 – (1 – 1/m)nk,经过一系列推导得到 p ≈ ( 1 – e-kn/m ) k , 当 k = m / n * ln2 时(ln 即 loge),p为最小值。 例如当k = 8, m/n = 10时, false positive的理论值为0.00846。以下是段计算false positive的实例代码:
对于某些应用而言,false positive的概率已经是一个足够好的判断Bloom filter准确性的指标,Peter C.Dillinger 和 Panagiotis Manolios 在其Bloom Filters in Probablistic Verfification的论文中指出,对于query过程中的不确定性, state omission 是一个更合适的指标。建议感兴趣的读者阅读该论文,顺便也可以复习一下相关的数学知识。
有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法。 可以采用在WEB-INF/web.xml中添加一个监听程序(ServletContextListener配置项),步骤如下:
1) 增加一个监听程序 MyServletContextListener.java,实现javax.servlet.ServletContextListener接口
package test.startup;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener
{
public void contextDestroyed(ServletContextEvent arg0)
{
}
public void contextInitialized(ServletContextEvent arg0)
{
System.out.println("加载业务字典");
try
{
com.eos.common.dict.DictMap.loadData();
}
catch(Exception e)
{
System.out.println("加载业务字典失败!");
e.printStackTrace();
}
}
}
2) 配置监听器web.xml:
<listener>
<listener-class>test.startup.MyServletContextListener</listener-class>
</listener>
注意:应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。注册一个监听程序涉及在 web.xml的web-app元素内放置一个listener元素。虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web- app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用 web.xml DTD的2.3或以后版本,而不是2.2版本,如下:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
...
</web-app>
软件开发是非常令人兴奋的工作,经过多年的工作,你不仅可以得到相应的报酬(随着工作经验增长)还会有其他晋升的机会。大多数人只关心保持头浮出水面。但这并不是我们所要追求的目标,那仅仅是我们在学校或者孩童时代的梦想?
为了赚更多的钱,大多数人还会找额外的工作并且不太关注编程以外的东西。没有时间休息、没有时间和家人朋友小聚、除了工作还是工作。因此导致压力越来越大,对生活的不满足感油然而生。
其实我们只要稍微调整一下时间管理原则,会让生活变得更好,会让我们的生活和工作都很成功,并且还会促进软件和Web开发事业的发展。
设定目标:长期和短期
想要生活变的更好,首先应该知道该怎么做才会更好?下个星期、下个季度、未来两年甚至未来20年,你会在哪里(如果你很年轻,必须决定你想要什么?确定你的追求所在!)。
善待计划,勇于执行计划
拿破仑曾说过:“只有合理的去计划,才能达到令人满意的结果!”请不要忽视该原则和投资计划。请记住,混乱是没有计划的。另外和大家分享一句古典引文:“有时我坐下来思考,仅仅只是坐着思考”,通常,这种现象会浪费很多时间。如果你发现自己处于混乱的状态,那么可以换个事情做做,转移一下焦点,比如站在窗前看看外面或者放松放松双眼。
如果不能计划,只能跟踪
如果你现在不能计划任何事情,别担心,以后再做。仅仅跟踪你所做的:上一篇论文、excel表格或者使用一个任务管理软件。每两小时更新一次列表或者每天结束时更新。这样有助于你找到相同的中断时间或者重复的事情,以后你就可以进行很好的规划。即使一个星期追踪一次,也可以给你的生活带来些光明。
看一下你的时间日记并且试着发现并非需要真正去做的事情,一些事情可能由其他人做更好;工作,更加快速有效;行动,占用他人时间等等。
你可以下载一个简单的时间跟踪模板。
把所有要做的事情列入清单
有时候,我们会觉得无所事事,可是过一会,会突然记起(或者管理人员提醒)一些重要的任务要马上完成,其非常急促和重要。避免这种事情的唯一方法就是把将要完成的事情列一个清单,无论什么时候,只要有新的任务,就在清单上面记下。如果你不能及时进入电脑或者忘记,你可以从头写一下或者借助媒体工具(比如随身携带的手机,在上面记下来),最后把它列入主清单中。
对每个任务进行时间评估,确定完成期限。这样会避免在最后一刻才去做。
调整优先级
德鲁克格言说:“做正确的事情并不重要,重要的是做正确的事”。在软件和Web开发工作中,常常会为了某个任务花费大量的时间,结果只产生很小的价值或者毫无价值。例如写一个正则表达式来拆分coma-delimited数组或写一个CORBA应用程序来访问远程服务器上的两个方法。没有上面灵丹妙药可以杀死优先级案例,但可以提供一些技术给大家:
● 首先可以去问客户或者经理给任务进行适当的优先级排序。但事先要想到:并不是每个客户都会立即回答。
● 如果客户依赖于某件事,要先做。
● 对于两个任务的轻重缓急情况是一样的,那么难度较大且自己不太喜欢的放前(为什么不把自己喜欢并且感兴趣的优先呢?)
● 当切实可行时可以委托
推崇代表
如果有人可以成为你工作中的一部分,请不要犹豫与他分享工作。分享目标而不是程序,承担责任和问责制。对一个任务进行清晰的描述并且提供一个“如何测试”的例子。
下面这些规则可以帮助决定是否可以委托:
● 他(她)会做的更好更快,如果是,毫无疑问,委托他(她)来做。
● 如果你有更重要的任务需要去做,如果可以提交一个任务给别人。如果是,可以!
● 在没有你帮助的情况下,他(她)能够完成。例如你不在办公室?
● 当然,你可以把你的工作委托给你的老板,但是不要滥用。
在一个多项目环境中,整个团队工作很难去平等地分配给每个成员。有人不得不做更多的工作。使用Goldrat的约束理论:“直到最慢的那个成员完成工作,项目才结束”,这样将永远无法完成工作。因此在一个团队里面应该推崇代表团成员,而不仅仅是从经理到开发人员。这个过程只能是在一个开诚布公的团队里面才有效,比如XP团队和敏捷开发团队。
完美并不是比好还好
在编码时,准时完成比设想一个更好地解决方案更重要!先让这个工作完成,以后你可以慢慢补充更好的元素进去。做你最好的:“在第一时间正确完成”。不要节约编码约定和代码质量。纯代码反而会增加以后的维护时间。考虑一下单元测试,它可以帮助你在开发中提高质量和加快速度。
对困难的任务进行拆分
人们通常会绕过那些困难重重的任务。但是如果把那些困难的任务拆分成许多个块,不久你会注意到,那些可管理的并且完整的块,已经解决啦!一个非常有用的方法是给每项任务添加“如何测试”笔记。把这个设置成一个个小目标,来帮助任务的完成。如果每项任务都可以自动化测试,相对于重复测试来说,将会节约很多时间。
找出你所浪费的时间
人是社会性动物,我们每天至少要花1小时的时间来处理来自同事、朋友、亲人之间的问题。他们可能会帮你或者让你速度放缓。有些人可能会通过电话、短信息或者邮件直接与你联系。这样就会导致时间中断。6-9分钟的中断通常需要额外4-5分钟即可恢复,如果连续中断5次,将要1个小时的时间。想想如何减少这种中断次数呢?唯一的方法是找到可替代的时间来补充中断的时间,一旦你获得了整个画面,你就会知道哪些是需要保存。
有计划的放松和娱乐
牛津大学人体新陈代谢教授Keith Frayn在电视上讲过:“任何人在只有水没有其他食物的情况下,都可以存活60天”,但是如果缺乏睡眠,将会降低很多。1964年,一个高中生Randy Gardner试图打破吉尼斯最长记录260小时,Stanley Coren把Randy每天的状况记录下来,第二天眼睛难以集中,第四天产生幻觉,最后一天口齿不清,注意力跨度短。
熟话说:“身体是革命的本钱”。不要指望在疲劳的情况有较高的生产力。睡眠可以让我们的大脑更清醒的思考。充实的计划并不需要节约睡眠。
开发人员每天在一个固定的电脑面前至少要坐8个小时,这样会产生情感或者生理上疾病。我们暴露的一个器官——眼睛,整天在显示器前监视很长时间,如果不进行防护,我们的视力也会得到破坏。减少对眼睛的伤害有很多办法,在搜索引擎里面输入“训练眼睛”,会出来很多结果,找一个适合你的,在晚餐前或者一天中的其他时间来锻炼。
勇于向你同事,朋友寻求帮助
几乎IT项目多少都会涉及风险问题,这些风险可能是隐藏起来的,也可能在项目初期就会发现。开发人员发现风险后要马上处理解决,即使很小。这样最少需要几天或者几个星期的时间。为了避免这种时间浪费,可以找同事或朋友帮忙或者请他们给出建议。下面举这样一个例子:客户需要给给应用程序提供额外的安全性,在进可能的夹缝中去实现。一方面保护从服务器端下载的组件并且在没有重写硬盘的情况下加载这个DLL应用程序。经过两个小时的研究,我都没有发现任何有帮助的信息。我暂停了一会并且向一朋友寻求帮助,他给了我一个网址和教程,上面正是我寻找和想要解决的问题案例。
奖励自己
每个人都希望自己的工作能够得到肯定和回报,特别是完成一件事情以后。有时候一个小小的奖励,可以激发我们更多的工作欲望。在自己完成一个任务或者一部分工作后,承诺给自己一个奖励,例如让自己看一部有趣的电影,一旦你开发完一个新页面或者新功能,你可以奖励自己吃些糖果或者其他的东西。
结论
这个时间管理技巧仅仅是一个通向美好生活的起点,每天遵循这些原则可以帮助你事业成功、身体健康和获得更多的福利。
细节决定成败。往往人们会忽略一些小而重要的细节。帮助自己实现梦想,避免混乱,有计划的去管理时间,助你成功健康。
原文:Time Management Tips for Developers
在我平时所见到的程序员中,如果纯以编码能力来看,个人觉得可以分为五类,依次是:
1. 拷贝型
拷贝型选手就是传说中的“代码拷贝员”了,他们对实现功能几乎没有思路,所作的事情就是从网上或是之前其他团队成员写的代码中拷贝出片段,然后放到项目中,如果运行项目出现了期望结果,则表示任务完成。
这类人只会改代码,却不会写代码。他们大多对编程毫无兴趣,只是希望以此糊口而已。
2. 新手型
当产品有功能需求时,由于经验有限,程序员并不完全知道要如何实现这个功能,需要通过学习、寻找资料等方式来解决问题。
这种情况下的编码过程,程序员的主要目标是“完成功能”,那么很难有多余的心思去考虑边界条件、性能、可读性、可扩展性、编码规范等问题,因此代码bug可能较多,稳定性不高。常常会发生开发花费1个月,改bug却要改上好几个月的事情。
3. 学习型
这类程序员对所在领域的语言已经比较了解,对于一般功能可以有较为清晰的实现思路,给出需求时可以通过自己的思路来实现,并且会一定程度上考虑边界条件和性能问题。但仅此而已,他们对可读性和可扩展性考虑很少,也没有项目级别的考虑,主要是希望通过实现代码来练手或是学习。
这类程序员最大的表现在于喜欢“创造代码”,即使有现成的实现,他们也希望自己来实现一套,以达到“学习”的目的。他们不喜欢复用别人的代码,看见项目中别人实现了相类似的功能,他们会以“需求不同”的借口来自己重新实现一套。这类人一般来说对技术有着较为浓厚的兴趣,希望能够通过项目来进行学习。
从项目的角度来说,这种做法最大的麻烦在于开发周期可能较长(相比直接使用现成的实现),并且会使得项目代码膨胀,影响未来的维护。但这类程序员由于有兴趣,如果好好培养或许会成为明天的牛人。
4. 实现型
这类程序员一般有较为丰富的经验,由于写得太多,因此不再追求“创造代码”来进行学习,同时对所在领域可能涉及的很多第三方框架或是工具都比较熟悉,当接受到产品需求时,对功能实现方案已经了然于胸,因此他们可以快速的实现需求,并且对边界、性能都有一定程度的考虑。因为能够快速实现需求功能,经常会被团队评价为“牛人”。但他们一般仅仅停留在“完成功能”级别上,对代码的可读性、可扩展性、编码规范等考虑较少,对项目总体把握也较少(例如控制项目膨胀、方便部署等架构级别的东西)。
这类程序员最大的表现在于喜欢“开发项目”,却不喜欢“维护项目”。他们产出的代码最大的问题就是维护较为困难,可能过上几个月回头看自己的代码都会晕头转向。因此即使是自己写的代码,仍然不愿意维护,一般会苦了后来人。
因为接口设计的缺乏,当需求变更时,发现代码要改的东西太多,然后抱怨需求变化,却很少认为是自己的代码问题。这样的项目如果经过长时间的变更维护,最终会变得难以维护(一般表现在需求变更响应时间越来越长)甚至无法维护,最终要么是半死不活,要么是被推倒重来。
5. 架构型
这类程序员比实现型更进一步,他们经验丰富,对相关框架和工具等都很熟悉,“完成功能”“稳定性”“性能”这些已经不再是他们的追求,更优美的代码、更合理的架构才是目标。
这类程序员代码设计大多建立在对需求的详细了解和对需求变更的预测上——可扩展性较好;代码细节也尽量多的考虑边界情况、性能——稳定高效;代码命名和注释都恰到好处——可读性较高;同时在开发过程中他们会不断重构,对代码做减法——保证项目可持续发展;等等
但由于考虑问题较多,单从“实现功能”阶段来看,完成速度不一定会比“实现型”要快。只是到了项目中后期优势才会慢慢体现出来
分类实现方式(主要还是基于词频统计,但具体实现做了优化): 1.定义一套自己的分类,例如取一淘分类 但有一个原则最终子类只表示一类商品,不会表示多个分类, 例如:手机、保护套、mp3、单反相机,不会有手机通信这种分类,便于以后分词 使用用 2.这些分类词要放到分词词库中,用该词库对网页分词,防止出现将手机套分为手机和套这种分词 3.基于分类词对网页进行词频统计,词频最高的分类词即为网页的分类 3.1 统计中需要处理的问题: 等价词(手机套、保护套、手机壳等) 页面中有(title)、页面描述(description)、关键词 (keywords)、超链接文本、纯文本等 。这些属性都可能包含分类信息,但权重是不同的; 前期可以使用title、keyword、description和标题进行统计 例如:对商品“ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋)” 进行统计 <meta name="description" content="ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋), 品牌: ESK, ESK, ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋)<br>1.专业保护您的iphone,完美贴合使您的iphone 看起来更完美·<br>2.ESK501是采用进口材料,镭射工艺制程,完美的产品让您的爱机更加美观<br><br/><img src='http://g-ec4.images-amazon.com/images/G/28/hardline-asin/20120423-BQNP-01.jpg'><br><br/..." /> <meta name="title" content="ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋)-小家电-卓越亚马逊" /> <meta name="keywords" content="卓越,亚马逊,卓越亚马逊,卓越网,joyo,amazon,joyo amazon,小家电,ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋),ESK" /> <title>ESK 苹果 iPhone4/iPhone4s 浮雕 个性超薄 手机壳 保护外套 (天堂小屋)-小家电-卓越亚马逊</title> 最后统计的词频是手机壳,则这个商品的分类就是手机壳 4.建立分析样本,前期做的词频统计的结果都是通过人工看的方式来评价结果,正确的做法 应该是对已知样本来进行统计,在已知样本上来统计结果的正确率,根据正确率来调整或决 定使用不使用该算法。 例如:我们已经按照自己的分类规则对100个网页打好标签,然后用自己的统计方法对这些网站分类, 如果有N个网页分类正确,则我们的正确率就是N/100。
1每篇文章都讲述了一个故事。 假设你是一个创业者,这个故事就是你的创业计划,你如何利用搭乘电梯的短暂时间给一位风险投资家讲述你的故事?换句话说,你的“电梯陈述”(elevator pitch)是什么? 这个故事讲的不是你做了什么,而是你要展示什么。有没有新的想法,新的见解,它们为什么有趣、重要? 为什么别人会对你的故事感兴趣?发现了普遍的真理,触及了热点话题,让人吃惊,还是有出人意料的结果? 了解你的故事! 2按照自顶向下的顺序写作 计算机科学家(以及大多数人)以这种方式思考问题 先陈述宽泛的主题或想法,然后再进入细节。一定要交代背景! 即使进入了细节,也要自顶向下来写! 3Introduction:至关重要,已经程式化 如果读者没有被介绍部分打动,文章就失败了 结构: 第1段:写作动机:很宽泛,问题领域是什么,为什么重要? 第2段:缩小范围:你具体考虑的问题是什么? 第3段:“In the paper, we ….”:最重要的一段,写出你的电梯陈述 第4段:和其它研究结果相比,有怎样的不同/更好/相关之处? 第5段:“The remainder of this paper is structured as follows” 4掌握文章写作的基本知识 段 = 一些相关话题的句子的有序集合 每段头一句:为这一段设定背景;有可能起到承上启下的作用 段落中的句子应该扣住主题,按照逻辑关系进行陈述 不要在描述性的文字里混合不同的时态 只有一句的段落:慎用! 5将自己摆在读者的位置 Less is more:花些时间写得更简练 读者不应该花费太多精力去理解你的故事、背景、结果 需要一些路标性的文字让读者知道故事进行到哪里了以及相关的背景。 Good: “e.g., Having seen that … let us next develop a model for …. Let Z be ….” Bad: “Let Z be” 了解读者知道什么,不知道什么,想要什么,不想要什么。文章是为读者写的,不是为你自己。 一页又一页密密麻麻的文字会让人读起来索然无味 避免使用难以辨认的字体和太小的页边距 利用图表在文字间开辟一些空白区域 是否有足够的信息(包括背景知识)让读者理解你所写的 没有人拥有和你一样多的背景知识 没有人能读懂你的心思 有没有未定义的术语/符号? 6没有人对这个话题和你一样感兴趣 所以你最好表现得很有兴趣 告诉读者为什么他们应该对你的故事感兴趣 别逼读者读你文章中的40幅图 考虑一下你想用图传递的主要信息 不可能探讨整个参数空间 别逼读者读满篇的方程式 将很长的推导或证明放在附录中,只在正文部分提供摘要 7谨慎地陈述结果 清晰地说明假设(见8) 对实验/仿真的描述:需要足够的信息来重现实验以及相关描述 仿真/测量:你的结果的统计学性质 试验结果有代表性吗?还是说只是为了达到你的目的而进行的一个特殊用例 8不要夸大你的结果,也不要太保守 夸大型错误(如果只是针对一个/很少/有限的用例做出的结果): “We show that X is prevalent in the Internet” “We show that X is better than Y” 保守型错误:没有认识到你的工作引申出来的意义 如果结果不引人注意,读者就没有兴趣 “rock the world” 9学习写作的艺术 高超的写作技巧可以让你拥有“不公平的优势” 写作技巧关系到你的文章能不能发表在顶级的期刊上 强烈推荐: The Elements of Style, W. Strunk, E.B. White, Macmillan Publishing, 1979 Writing for Computer Science: The Art of Effective Communication, Justin Sobel, Springer 1997. 你认为谁是你们领域最会写作的:学习他们的风格 10. 写作需要花费一定时间 给自己一些时间来构思、写作、审查、修改文章 让别人阅读/审查你的文章然后给你反馈 了解读者的视角 找一个好的文章写手或者编辑评价你的写作 如果你在最后期限的三天前才开始动笔,而这时实验结果还正在生成,那你的文章根本没有希望完成