Arrays.binarySearch()

Arrays.binarySearch() Arrays.binarySearch();的用法。 public static int binarySearch(Object[] a,Object key) 使用二分搜索法来搜索指定数组,以获得指定对象。在进行此调用之前, 必须根据元素的自然顺序对数组进行升序排序 (通过 sort(Object[]) 方 法 ) 。如果没有对数组进行排序,则结果是不确定的。 (如果数组包 含不可相互比较的元素 (例如,字符串和整数) ,则无法 根据其元素的自 然顺序对数组进行排序,因此结果是不确定的。) 如果数组包含多个等于 指定对象的元素,则无法保证找到的是哪一个。 参数: a - 要搜索的数组 key - 要搜索的值 返回: 如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1) 。插入点 被定义为将键插入数组的那一点: 即第一 个大于此键的 元素索引,如果数组中的所有元素都小于指定的键,则为 a.length。注意 ,这保证了当且仅当此键被找到时,返回的值将 >= 0。 否则返回 (-(插入点) - 1)这句话要注意: 要是查询的的值小于数组里面 的最小值那么结果(-(0)-1结果就是-1),如果查询的 值大于数组里面的 最大值。那么结果就是(-(它的索引值)-1结果就是-(1+索引值)) 抛出: ClassCastException - 如果搜索的键不能与数组的元素进行比较。

2012-10-16 · 1 min · 57 words · -

out of the box

out of the box out of the box: “Out of box"用于描述某种不确定的事件。常常作为副词来形容某种观点的不确定性。据说这个词同20世纪早期的英国数学家亨利?恩斯特?杜德耐解答一个著名数学谜语的思路相关。题目要求用四条直线连接平面上三乘三分布的九个点,要求一笔连成,也就是在画线的时候笔不能离开纸面。解决这个数学问题的关键在于要克服传统的在三乘三边界内画点的思想,如果将线连接到边界之外,那么问题可以迎刃而解,这样就产生了"Out of box"这个词。相应的,将思维受限这种情况称为"boxed-in”。在IT领域,节奏变化很快,因此每个人都在寻找"Out of box"的思维方式,尝试创新。 用"In the box"表示某种确定的事情。比如,最近有一篇文章讨论了MP3以及盗版音乐的关系,其中引用了一位业内人士的话表示: “主流唱片公司很少关心互联网上的发展,他们的思维就是’Inside the box’"。 “Out of the box”(开箱即用)也用作"off the shelf” (现货供应) 的同义词,其含义是指能够满足一定需求的、已经作好了的软件、硬件或两者的结合形式。如不采用,就需要投入专门的人力物力来开发。 out-of-the-box具有"创造性的,独特性,思维不合常规"的意思,但在计算机术语里又可以指"从盒子里拿出来直接可以使用的,也就是即开即用"的意思。“out-of-the-box” is similar to “off-the-shelf”, usually referinng to software/hardware which can be used as is, not requiring extra customisation or add-on components.

2012-10-15 · 1 min · 51 words · -

多普勒效应

多普勒效应 多普勒效应是为纪念奥地利物理学家及数学家克里斯琴·约翰·多普勒 (Christian Johann Doppler) 而命名的,他于1842年首先提出了这一理论,主要内容为: 物体辐射的波长因为波源和观测者的相对运动而产生变化。在运动的波源前面,波被压缩,波长变得较短,频率变得较高 (蓝移_blue shift_) ;当运动在波源后面时,会产生相反的效应。波长变得较长,频率变得较低 (红移_red shift_) ;波源的速度越高,所产生的效应越大。根据波红 (蓝) 移的程度,可以计算出波源循着观测方向运动的速度。 恒星光谱线的位移显示恒星循着观测方向运动的速度,除非波源的速度非常接近光速,否则多普勒位移的程度一般都很小。所有波动现象都存在多普勒效应. 1842年奥地利一位名叫多普勒的数学家、物理学家。一天,他正路过铁路交叉处,恰逢一列火车从他身旁驰过,他发现火车从远而近时汽笛声变响,音调变尖,而火车从近而远时汽笛声变弱,音调变低。他对这个物理现象感到极大兴趣,并进行了研究。发现这是由于振源与观察者之间存在着相对运动,使观察者听到的声音频率不同于振源频率的现象。这就是频移现象。因为,声源相对于观测者在运动时,观测者所听到的声音会发生变化。当声源离观测者而去时,声波的波长增加,音调变得低沉,当声源接近观测者时,声波的波长减小,音调就变高。音调的变化同声源与观测者间的相对速度和声速的比值有关。这一比值越大,改变就越显著,后人把它称为"多普勒效应"。

2012-10-15 · 1 min · 17 words · -

VTune

VTune 英特尔VTune™ 性能分析器 英特尔VTune™ 性能分析器可通过图形用户界面轻松优化应用性能,而且无需重新编译。它独立于编译器和语言,因此可与 C、C++、Fortran、C#、Java、.NET 等等†一起使用。与只提供调用图分析或一组有限的采样事件的产品不同,VTune 分析器可通过一组丰富的适用于所有最新英特尔® 处理器的调试事件同时实现上述两种功能。 开发出在运行 Microsoft Windows Vista*、Windows* XP 或 Windows Server* 的最新 64 位多核系统上运行如飞的软件。无需重新编译,并且只需极低的开销 (不到 5%) ,便可以确定性能瓶颈。使用图形界面与强大的 Visual Studio* 与 .NET 集成功能来分析结果。快速探查源代码,确定存在问题的代码行。 优化多核性能 内含英特尔线程档案器!对应用进行线程处理后并没有达到您预期的效果?英特尔线程档案器可帮助您调试多线程代码,从而在当今的多核处理器上取得最佳性能。 英特尔VTune™ 性能分析器 Linux* 版是完全基于 Linux 的解决方案,无论是在单核系统上还是在多核系统上,要使您的软件以最快速度运行,该解决方案都是不可或缺的。无需重新编译,也无需通过超级计算机系统在手持设备上链接,它便能分析应用程序。它功能强大,可处理大型应用程序 (源代码超过 1 GB) ,并支持多核多处理器以及使用最新英特尔处理器的 NuMA 系统。

2012-10-15 · 1 min · 42 words · -

GNU profiler

GNU profiler 各种软件对于性能的需求可能会有很大的区别,但是很多应用程序都有非常严格的性能需求,这一点并不奇怪。电影播放器就是一个很好的例子: 如果一个电影播放器只能以所需要速度的 75% 来播放电影,那么它几乎就没什么用处了。 其他应用程序 (例如视频编码) 如果是耗时非常长的操作,最好以 “批处理” 任务的方式运行,此时启动一个作业,让其一直运行,然后我们就可以去干别的事情了。尽管这些类型的应用程序没有这种硬性性能指标的限制,但是提高速度仍然会带来很多好处,例如可以在给定的时间内可以对更多电影进行编码,在同样的时间内可以以更高的品质进行编码。 通常,除了最简单的应用程序之外,对于其他应用程序来说,性能越好,这个应用程序的用处就越大,也就会越流行。由于这个原因,性能考虑是 (也应该是) 很多应用程序开发人员脑袋中的第一根弦。 不幸的是,很多尝试让应用程序速度更快的努力都白费了,因为开发人员通常都是对自己的软件进行一些_小型的优化_,而没有去研究程序在更大的范围内是如何操作的。例如,我们可能会花费大量的时间来让某个特定函数的运行速度达到原来的两倍,这一点非常不错,但是如果这个函数很少被调用 (例如打开文件) ,那么将这个函数的执行时间从 200ms 减少到 100ms,对于整个软件的总体执行时间来说并不会有太大的影响。 有效地利用您的时间的方法是,尽量优化软件中被频繁调用的部分。例如,假设应用程序花了 50% 的时间在字符串处理函数上,如果可以对这些函数进行优化,提高 10% 的效率,那么应用程序的总体执行时间就会改进 5%。 因此,如果希望能够有效地对程序进行优化,那么精确地了解时间在应用程序中是如何花费的,以及_真实的输入数据_,这一点非常重要。这种行为就称为_代码剖析 (code profiling) _。本文将简要介绍 GNU 编译器工具包所提供的一种剖析工具,它的名字让人可以产生无限遐想,叫 GNU profiler (gprof) 。

2012-10-15 · 1 min · 36 words · -

阿贝尔群

阿贝尔群 阿贝尔群 (Abelian Group) ,又称交换群或加群,是这样一类群 (G, *): 对任意 a,b 属于 G,满足 a * b = b * a。阿贝尔群以挪威数学家尼尔斯·阿贝尔命名。由阿贝尔群分解定理, 任何阿贝尔群可以分解成一些整数群和剩余类群的直和, 这个分解是唯一的, 其中分解出来的整数群的个数称为阿贝尔群的秩。 比阿贝尔群更广泛的概念是模的概念 记号方式 可换群有两个传统的记号方式. - 加法及乘法.

2012-10-10 · 1 min · 26 words · -

JAVA 浅复制与深复制/深克隆/深拷贝

JAVA 浅复制与深复制/深克隆/深拷贝 1.浅复制与深复制概念 ⑴浅复制 (浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 ⑵深复制 (深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone () 方法满足: ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象 ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样 ③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。 ⑵Java中对象的克隆 ①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 ②在派生类中覆盖基类的clone()方法,并声明为public。 ③在派生类的clone()方法中,调用super.clone()。 ④在派生类中实现Cloneable接口。 请看如下代码: class Student implements Cloneable { String name; int age; Student(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=(Student)super.clone();//Object中的clone()识别出你要复制的是哪一个对象。 } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } public static void main(String[] args) { Student s1=new Student("zhangsan",18); Student s2=(Student)s1.clone(); s2.name="lisi"; s2.age=20; System.out.println("name="+s1.name+","+"age="+s1.age);//修改学生2后,不影响学生1的值。 } } 说明: ...

2012-10-09 · 2 min · 369 words · -

webkit

webkit WebKit 是一个开源的浏览器引擎,与之相对应的引擎有Gecko (Mozilla Firefox 等使用) 和Trident (也称MSHTML,IE 使用) 。同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 前身是 KDE 小组的 KHTML,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 Gecko 和 KHTML 后,仍然选择了后者,就因为它拥有清晰的源码结构、极快的渲染速度。Apple将 KHTML 发扬光大,推出了装备 KHTML 改进型 WebKit 引擎的浏览器 Safari。 WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎,均是从KDE的KHTML及KJS引擎衍生而来,它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。 WebKit的优势在于高效稳定,兼容性好,且源码结构清晰,易于维护。 尽管Webkit内核是个非常好的网页解析机制,但是由于以往微软把IE捆绑在Windows里(同样的Webkit内核的Safari捆绑在Apple产品里,Google Chrome捆绑在Google产品里),导致许多网站都是按照IE来架设的,很多网站不兼容Webkit内核,比如登录界面、网银等网页均不可使用Webkit内核。目前几乎所有网站和网银已经逐渐支持WebKit,未来可能将取代IE内核的浏览器。 WebKit 内核在手机上的应用也十分广泛,例如 Google 的手机 Android、 Apple 的 iPhone, Nokia’s Series 60 browser 等所使用的 Browser 内核引擎,都是基于 WebKit。 WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这个框架来开发的。WebKit 还支持移动设备和手机,包括iPhone和Android手机都是使用WebKit做为浏览器的核心。 ...

2012-10-09 · 1 min · 176 words · -

浏览器加载和渲染网页的过程

浏览器加载和渲染网页的过程 关于网页加载和渲染的过程,在网络上的讨论并不多。可能是因为这个过程比较复杂,而且浏览器执行的速度太快,目前还没有发现什么比较好的工具可以清楚的看到浏览器解析网页的每一个过程。通过firedug和httpWatch可以看到浏览器的http请求,但是对于浏览器如何paint和flow处理html元素,我们仍然是不得而知。“flow"这个词借鉴于reflow,表示浏览器第一次加载网页的过程。在网络上搜索了一下,学习如下。 关于浏览器加载网页过程的有趣视频 可以参见: http://www.aoao.org.cn/blog/2008/05/reflow/ (形象化的reflow) 。这个视频展现了网页加载的过程,看着比较有趣。要是可以更加形象化,就更好了,可以帮助我们书写更好的提高网页加载速度的代码。 浏览器内核 不同的浏览器内核,对于网页的解析过程肯定也不尽相同。http://www.mac52ipod.cn/post/Trident-Gecko-WebKit-Presto.php 一文对各种浏览器的页面渲染引擎进行了简介。目前主要有基于 (1) Trident页面渲染引擎 –> IE系列浏览器; (2) Gecko页面渲染引擎 –> Mozilla Firefox; (3) KHTML页面渲染引擎或WebKit框架 –> Safafi和Google Chrome; (4) Presto页面渲染引擎 –> Opera 详细的介绍可以参见原文。 浏览器解析网页的过程 http://hi.baidu.com/seosky/blog/item/78d3394c130f86ffd72afc56.html 浏览器加载和渲染原理分析一文中通过一定的方法,推断了浏览器加载解析网页的顺序大致如下: IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的; 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成 (并不是说所有相关联的元素都已经下载完) ; 在下载过程中,如果遇到某一标签是嵌入文件,并且文件是具有语义解释性的 (例如: JS脚本,CSS样式) ,那么此时IE的下载过程会启用单独连接进行下载,并且在下载后进行解析,解析 (JS、CSS中如有重定义,后定义函数将覆盖前定义函数) 过程中,停止页面所有往下元素的下载; 样式表文件比较特殊,在其下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素 (含以前已经渲染的) 重新进行样式渲染。并以此方式一直渲染下去,直到整个页面渲染完成。 当然这是一个推断的过程。 借助Google PageSpeed和Yahoo YSlow分析网页加载 通过这两个工具,测试网页加载过程,可以得到一些提高网页加载速度的建议。使用Google PageSpeed对Google首页进行分析,可以得到建议: (1) 压缩javascript和CSS; (2) 合并外部javascript和CSS; (3) 减少DNS寻址时间;这条与将图片分散到不同的域名存储这条折中处理; (4) 使用缓存; (5) 尽量避免CSS表达式; (6) 为图片增加宽度和高度属性; (7) 将css放在网页头部,合理放置js的位置。 同时,利用YSlow对google首页进行分析,我们也可以得到一些改进的建议。这些建议差不太多,就不在详细说明。 合理使用这两个工具,优化我们的网页,提高网页加载速度,增强用户体验。 我自己的误解 过去一直以为,一个容器如果没有读到自己的结束标签,那么这个容器就不会在浏览器中显示出来。今天测试了下,却发现浏览器在读到一个容器的开始标签的时候,就可以显示该容器了。关于浏览器如何一个一个的paint HTML中的元素,如果flow它们,这个过程还需要进一步了解。当然,也可以不管过程,只看加载的结果,通过pagespeed和Yslow来优化自己的网页。个人在做布局的时候,还是会秉承一条原则: 尽量让一个父容器小一些! 参考文献 ...

2012-10-08 · 1 min · 86 words · -

DOM, BOM

DOM, BOM BOM 浏览器对象模型 提供了独立于内容而与浏览器窗口进行交互的对象。描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的支持,IE还扩展了BOM,加入了ActiveXObject类,可以通过js脚本实例化ActiveX对象等等) 文档结构图 BOM由以一系列相关的对象组成。下图展示了基本的BOM体系结构。 BOM中的对象 Window对象: 是整个BOM的核心,所有对象和集合都以某种方式回接到window对象。Window对象表示整个浏览器窗口,但不必表示其中包含的内容。 Document对象: 实际上是window对象的属性。这个对象的独特之处是唯一一个既属于BOM又属于DOM的对象。从BOM角度看,document对象由一系列集合构成,这些集合可以访问文档的各个部分。 Location对象: 它是window对象和document对象的属性。Location对象表示载入窗口的URL,此外它还可以解析URI. Navigator对象: Navigator包含大量Web浏览器相关的信息。各种浏览器支持该对象的属性和方法不尽相同。 Screen对象: 通过其可以获取用户屏幕相关的信息 DOM 文档对象模型 DOM是针对XML的基于树的API。描述了处理网页内容的方法和接口,是HTML和XML的API,DOM把整个页面规划成由节点层级构成的文档。 DOM本身是与语言无关的API,它并不与Java,JavaScript或其他语言绑定。 特定语言的DOM 针对XHTML和HTML的DOM。这个DOM定义了一个HTMLDocument和HTMLElement做为这种实现的基础。 其他的包括SVG的DOM 对于DOM的支持 各种浏览器对于DOM的支持不一样。 Mozila支持最好,几乎所有的DOM Level 2以及部分DOM Level 3。在 Opera和Safrai支持所有的DOM Level1和大部分DOM Level2。 IE,支持大部分的DOM Level 1。 DOM 的各种 Level DOM Level 1 包括 DOM Core 和 DOM HTML。前者提供了基于XML的文档结构图。后者添加了一些HTML专用的对象和方法,从而扩展了DOM Core. DOM Level 2 引入几个新模块: DOM视图,事件,样式,遍历和范围 DOM Level 3 引入了以统一的方式载入和保存文档的方法。DOM Core被扩展支持所有的XML1.0的特性 http://titan.iteye.com/blog/60389 DOM 事件 onblur="hanshu(this)" 获得焦点: onfocus="hanshu(this)"

2012-10-08 · 1 min · 67 words · -

java Delegate

java Delegate 委派,也可以叫做委托,从字面上来理解的话,应该是委托其他类做事情而自己不做或者只做一部分工作;而回调,就是调用自己的方法。 在 java 中,这两种机制很类似,你姑且可以认为它们就是一码事。 java 中,实现委派和回调都是通过接口来实现的。下面举个小例子吧! 该例子是这样的 (只是一个例子) : ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派 (或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。 总之,Rocket不做具体的事情。看实例代码: IRocketDelegate.java源码 public interface IRocketDelegate { public abstract long startAtTime(); public abstract long endAtTime(); public abstract void sendDidFail(); } 共有三个方法,分别是用于计算 Rocket 发射时间、计算 Rocket 发射完毕的时间以及发送是否失败的。 Rocket.java源码 public class Rocket { IRocketDelegate delegate = null; public Rocket(IRocketDelegate delegate) { this.delegate = delegate; } private long getRocketStartTime() { long startTime = delegate.startAtTime(); return startTime; } private long getRocketEndTime() { long endTime = delegate.endAtTime(); return endTime; } public boolean isOk() { // 超时0.1秒为失败 if (getRocketEndTime() - getRocketStartTime() >= 100) { delegate.sendDidFail(); return false; } return true; } } 在这个类中,声明一个 IRocketDelegate 接口对象,使用该对象调用接口的方法。我们知道,接口不可以直接实例化,换句话说,实例化接口必须实现接口的所有方法。 ...

2012-10-08 · 2 min · 302 words · -

里氏代换原则

里氏代换原则 里氏代换原则 (Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对"开-闭"原则的补充。实现"开-闭"原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。LSP讲的是基类和子类的关系。只有当这种关系存在时,里氏代换关系才存在。如果两个具体的类A,B之间的关系违反了LSP的设计,(假设是从B到A的继承关系)那么根据具体的情况可以在下面的两种重构方案中选择一种。 –创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为移动到C中来解决问题。 –从B到A的继承关系改为委派关系。 为了说明,我们先用第一种方法来看一个例子,第二种办法在另外一个原则中说明。我们就看那个著名的长方形和正方形的例子。对于长方形的类,如果它的长宽相等,那么它就是一个正方形,因此,长方形类的对象中有一些正方形的对象。对于一个正方形的类,它的方法有个setSide和getSide,它不是长方形的子类,和长方形也不会符合LSP。 eg: 长方形类: public class Rectangle{ … setWidth(int width){ this.width=width; } setHeight(int height){ this.height=height } } 正方形类: public class Square{ … setWidth(int width){ this.width=width; this. height=width; } setHeight(int height){ this.setWidth(height); } } 例子中改变边长的函数: public void resize(Rectangle r){ while(r.getHeight()<=r.getWidth){ r.setHeight(r.getWidth+1); } } 那么,如果让正方形当做是长方形的子类,会出现什么情况呢?我们让正方形从长方形继承,然后在它的内部设置width等于height,这样,只要width或者height被赋值,那么width和height会被同时赋值,这样就保证了正方形类中,width和height总是相等的.现在我们假设有个客户类,其中有个方法,规则是这样的,测试传入的长方形的宽度是否大于高度,如果满足就停止下来,否则就增加宽度的值。现在我们来看,如果传入的是基类长方形,这个运行的很好。根据LSP,我们把基类替换成它的子类,结果应该也是一样的,但是因为正方形类的width和height会同时赋值,这个方法没有结束的时候,条件总是不满足,也就是说,替换成子类后,程序的行为发生了变化,它不满足LSP。 那么我们用第一种方案进行重构,我们构造一个抽象的四边形类,把长方形和正方形共同的行为放到这个四边形类里面,让长方形和正方形都是它的子类,问题就OK了。对于长方形和正方形,取width和height是它们共同的行为,但是给width和height赋值,两者行为不同,因此,这个抽象的四边形的类只有取值方法,没有赋值方法。上面的例子中那个方法只会适用于不同的子类,LSP也就不会被破坏。在进行设计的时候,我们尽量从抽象类继承,而不是从具体类继承。如果从继承等级树来看,所有叶子节点应当是具体类,而所有的树枝节点应当是抽象类或者接口。当然这个只是一个一般性的指导原则,使用的时候还要具体情况具体分析。

2012-10-08 · 1 min · 53 words · -

戴森球

戴森球 戴森球[1]是一种设想中的巨型人造结构,由弗里曼·戴森先生提出。这样一个"球体"是由环绕太阳的卫星所构成,完全包围恒星并且获得其绝大多数或全部的能量输出。戴森认为这样的结构是在宇宙中长期存在并且能源需求不断上升的文明的逻辑必然,并且他建议搜寻这样的人造天体结构以便找到外星超级文明。 从那时起,各种各样的设计,包括建造人工天体或一系列这样的结构以便包围太阳,便不断地由一些狂想的工程学家或科幻小说所提出,并冠以"戴森球"之名。这些后续的设想没有仅仅在从太阳能收集站上止步-许多工程设计还包括建设人类殖民地和工业基地。 http://baike.baidu.com/view/468337.htm

2012-10-08 · 1 min · 4 words · -

图像二值化

图像二值化 就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。 将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。 所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

2012-09-30 · 1 min · 4 words · -

java ocr tesseract

java ocr tesseract http://ykf.iteye.com/blog/212431

2012-09-30 · 1 min · 4 words · -

OCR之 Tesseract

OCR之 Tesseract http://www.cnblogs.com/brooks-dotnet/archive/2010/10/05/1844203.html 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。OCR技术非常专业,一般多是印刷、打印行业的从业人员使用,可以快速的将纸质资料转换为电子资料。关于中文OCR,目前国内水平较高的有清华文通、汉王、尚书,其产品各有千秋,价格不菲。国外OCR发展较早,像一些大公司,如IBM、微软、HP等,即使没有推出单独的OCR产品,但是他们的研发团队早已掌握核心技术,将OCR功能植入了自身的软件系统。对于我们程序员来说,一般用不到那么高级的,主要在开发中能够集成基本的OCR功能就可以了。这两天我查找了很多免费OCR软件、类库,特地整理一下,今天首先来谈谈Tesseract,下一次将讨论下Onenote 2010中的OCR API实现。可以在这里查看OCR技术的发展简史。 测试代码下载 转载请注明出处: http://www.cnblogs.com/brooks-dotnet/archive/2010/10/05/1844203.html 1、Tesseract概述 Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。 数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。 Tesseract目前已作为开源项目发布在Google Project,其项目主页在这里查看,其最新版本3.0已经支持中文OCR,并提供了一个命令行工具。本次我们来测试一下Tesseract 3.0,由于命令行对最终用户不太友好,我用WPF简单封装了一下,就可以方便的进行中文OCR了。

2012-09-30 · 1 min · 17 words · -

java取整和四舍五入

java取整和四舍五入 Math.round Math.round(-1.1): -1 Math.round(-1.5): -1 Math.round(-1.6): -2 Math.round(0.1): 0 Math.round(0.5): 1 Math.round(0.6): 1 Math.round(1.1): 1 Math.round(1.5): 2 Math.round(1.6): 2 round 方法,我们通常会说这个方法表示"四舍五入",但是当参数为负数时,就不太好理解。 所以也有以下形式 即将原来的数字加上0.5后再向下取整。 Math.round(x) = Math.floor(x + 0.5) import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public static void main(String[] args){ double i=2, j=2.1, k=2.5, m=2.9; System.out.println(“舍掉小数取整:Math.floor(2)=” + (int)Math.floor(i)); System.out.println(“舍掉小数取整:Math.floor(2.1)=” + (int)Math.floor(j)); System.out.println(“舍掉小数取整:Math.floor(2.5)=” + (int)Math.floor(k)); ...

2012-09-30 · 2 min · 287 words · -

Java Image与BufferedImage

Java Image 与 BufferedImage Image是一个抽象类,BufferedImage是Image的实现。Image和BufferedImage的主要作用就是将一副图片加载到内存中。 Java将一副图片加载到内存中的方法是: String imgPath = “C://demo.jpg”; BufferedImage image = ImageIO.read(new FileInputStream(imgPath)); 该方法可以获得图片的详细信息,例如: 获得图片的宽度: image.getWidth(null);图片只有加载内存中才能对图片进行进一步的处理。 还有一个方法 String imgPath = "C://demo.jpg"; Image imageToolkit.getDefaultToolkit().getImage(imgPath); 但该方法不能把图片加载到内存中,仅仅是得到图片,所以也就不能获得图片的信息,图片的长宽信息都无法拿到。 文章地址: http://javapub.iteye.com/blog/683944

2012-09-30 · 1 min · 28 words · -

短信验证码

短信验证码 短信验证码有效期2分钟 验证码 6 位纯数字 每个手机号60秒内只能发一次短信验证码, 前后端都要做验证 同一个手机号在同一时间可以有多个有效的验证码 验证码不记录到日志 验证码使用后作废 (使用后作废,不太友好,如果有其它信息填写错误得等1分钟再重新取验证码) 验证码至多可以使用3次,无论是否匹配都作废,防止暴力攻击 (一个手机号验证三次之后, 作废关联的验证码) java 识别验证码 http://blog.csdn.net/problc/article/details/5800093 https://www.cnblogs.com/guokun/p/11042903.html https://insights.thoughtworks.cn/sms-authentication-login-api/

2012-09-30 · 1 min · 19 words · -

Map, Dictionary

Map, Dictionary Dictionary Dictionary 是 Hashtable 的抽象父类,在 java.util包下,他的子类有 Hashtable, Properties. 它的主要作用是用于记录 键到值的一一对应关系。没错,从数学的概念上讲,这种映射关系就是一对一的。也就是说,一个key最多只能找到一个value. 如果给出一个 Dictionary 的子类对象和一个 key, 就可以查找有没有包含相关的元素。需要注意的是:任何非空(non-null)的对象才能用作 key 和 value. 通常,类的实现应使用 equals 方法来确定两个键是否相同。 注意:此类已过时。 新的实现应实现 Map 接口,而不是扩展此类。 Map 接口 Map 是一个接口,还是看图: Map 是一个将 keys 映射到 values 的对象。一个 map 对象不能包含重复的 keys. 每一个 key 最多只能映射到一个对象。 Map 这个接口是为了取代 Dictionary 这个抽象类的,更直白的说,就是拿一个接口去取代之前抽象类。 three collection views Map 接口提供了三套查看方法来查看map所包含的内容。 查看它所包含的所有 keys (view as a set of keys) 查看它所包含的所有 values(view as collection of values) 查看它所包含的键-值映射。(view as a set of key-value mappings) ...

2012-09-27 · 1 min · 78 words · -