还记得在您的第一台科学计算器上用逆波兰表示法奋斗的经历吗?W3Eval applet 无法让您可信赖的 HP-41 更易用,正如它的名称所暗示 ― 一个只能运行于 Web 的表达式求值程序。但它的确提供了一种方法 ― 人类更易于遵循的对表达式一步一步的求值。
W3Eval 的方法与传统计算器不同,却和人类的计算方式一致。当您用传统的计算器计算时,每输入一个新数,前一个数就看不到了。如果在输入一个长表达式中出了错,就得全部重来。有了 W3Eval,您就能看到参与计算的所有东西,还能轻松的编辑表达式。它独特的能力(一步一步的对表达式求值)非常容易实现,因为用户能看到求值的每一步,包括临时结果。
本文将让您从头至尾认识 W3Eval 功能性的要点;您将看到一些用于表达式求值的代码。不过,我们还是先看看表达式求值的经典算法,这样您就会明白 W3Eval 方法的差异究竟有多少。
表达式求值的经典算法编写代码对算术表达式求值的经典方法由 Donald Knuth 描述于 1962 年(请参阅 参考资料)。Knuth 将此概括为三个步骤:
对中缀表达式进行语法分析
中缀表达式到后缀表达式的转换
对 ...
我投资的两家公司的 CEO 性格迥异(在此权用 A 和 B 代替他们的姓名)。 A 有着近乎完美的资深职业经理人形象,他热忱外向,和蔼可亲,我从没见过他和任何人发生争执,认识他的人都喜欢他。每次董事会之前,他都会请董事们吃一顿可口的晚餐;他访问我上海的办公室时会给我的助理小姐带旧金山特产的巧克力。
B 则恰恰相反,他穿着随意,初次和他接触的人往往会觉得他内向而冷淡,说话极少寒暄,总是直入主题,有些人很不喜欢 B。和 B 聊天是很累的,因为常找不到共同的话题,间或被难堪的沉默所打断。B 有时显得固执,常和董事会发生争论。在 B 的公司开董事会总是吃盒饭工作餐,他也从不送任何人小礼物。
A 和 B 的业绩也是天壤之别的。在 A 领导公司的约三年里,该公司总计亏损一亿多美元,市值跌掉约 96%,A 最终被董事会炒鱿鱼。而 B 则在约四年里将其公司扭亏为盈,创造了一亿多美元的价值,最终成功卖掉。
怎么会出现这种奇怪的现象?难道不是大家都更喜欢 A ?难道 A 的缺点错误不是比 B 更少?难道 A 不 ...
“良言一句三冬暖,恶语伤人六月寒。”曾经有一篇十二句话的小文章——《说话的艺术》,受到很多人的推崇,有的人把它发到自己的博客上,有的物业公司把它作为温馨提示贴在电梯里,这已经成为不少人讲话时的艺术指南。
急事,慢慢地说。遇到急事,如果能沉下心思考,然后不急不躁地把事情说清楚,会给听者留下稳重、不冲动的印象,从而增加他人对你的信任度。
小事,幽默地说。尤其是一些善意的提醒,用句玩笑话讲出来,就不会让听者感觉生硬,他们不但会欣然接受你的提醒,还会增强彼此的亲密感。
没把握的事,谨慎地说。对那些自己没有把握的事情,如果你不说,别人会觉得你虚伪;如果你能措辞严谨地说出来,会让人感到你是个值得信任的人。
没发生的事,不要胡说。人们最讨厌无事生非的人,如果你从来不随便臆测或胡说没有的事,会让人觉得你为人成熟、有修养,是个做事认真、有责任感的人。
做不到的事,别乱说。俗话说“没有金刚钻,别揽瓷器活” ...
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970Siege是一款高性能的Http压力测试工具。Siege支持身份验证、cookies、http、https和ftp协议。安装Siege如果要支持https,需要先下载安装openssl, 下载地址:https://github.com/openssl/openssl1.开始安装opensslgit clone https://github.com/openssl/opensslcd openssl./config --prefix=/usr/local/opensslmakemake installopenssl version2.开始安装siege下载地址:http://download.joedog.org/siege/siege-4.0.4.tar.gztar zxvf siege-4.0.4.tar.gzcd siege ...
翻译自 deepakgaikwad。如需转载本文,请先参见文章末尾处的转载要求。
许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题。如果我们看一下性能问题背后的原因,会发现很多是由数据处理不当造成。数据处理在应用面对大数据量时是非常关键的。这里有一些实用的数据处理技巧可以帮助更好地提升Java应用程序性能。
减少数据传输在任何Java应用程序中,方法调用要么是为调用方完成某项任务,要么是对输入数据进行处理。这两个目标都需要在调用者和处理方法之间进行数据交换。关于最小化函数传入和输出的数据量有一个经验之谈:数据越小好处越多。比如越小的数据处理就越少,需要清理的对象越少,内存的占用也更少等等。程序设计应当努力减少不同方法、层次和应用程序之间,甚至组织之间的数据传递。通过下面将要讨论的源端数据处理可以达成这个目标。
延迟加载延迟数据加载是指直到实际需要最后一刻才从数据存储中获取数据。在面对重量级对象时这是非常有益的。例如有一个存储在数据库中的文件实体,文件包含blob以及与其他属性。blob大小可以从几KB到几十兆。中间层逻辑在显示文件内容之前都只依赖于其他属性。使用延迟加载可 ...
系统架构
未读切分是最基本,且最多变的思路之一,说基本,是因为在学习程序设计的第一天就应该知道,说多变,是因为在未来的很多年里,你会不停的应用这个方法来解决问题。不幸的是,切分这个思路并没有得到应有的重视。
大概是因为这个词比较土,说起来也比较普通,远不如并行,集群,负载平衡这些词听起来大。所以碰到一个问题的时候,往往被拿出来的解决方案会是以上3个大词之一,很少有人去认真的考虑切分问题。但事实上,这3个大词所需要的技术,其实也是建立在良好可切分的系统之上的。
最近碰到了2个项目,都是典型案例。
案例1 ,小公司,发展的不错。一台服务器眼看不够用了,于是就买了第二台,希望能做一个"负载均衡"系统。很多人大概认为负载均衡,是类似自来水一样的技术,只要打开笼头,清水就汩汩涌出。往往忘记了水龙头后面的水管和自来水公司。
一个服务器上放了很多个服务,是很难应用负载均衡这种技术的。必须先要把服务拆开,找到性能薄弱的点,对这个点进行负载均衡,才能得到比较好的效果。否则很可能用了80%的力气,但是只得到20%的结果。
案例2,某外企。之前我们给他们做过咨 ...
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”。
第1部分 ASCII,Unicode和UTF-8 介绍1. ASCII码
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中 ...
JDK release-wise multi-threading concepts根据JDK 1.x发行版,此初始发行版中仅提供了很少的类。具体来说,这些类/接口是:
12345java.lang.Threadjava.lang.ThreadGroupjava.lang.Runnablejava.lang.Processjava.lang.ThreadDeath
和一些异常类例如
123java.lang.IllegalMonitorStateExceptionjava.lang.IllegalStateExceptionjava.lang.IllegalThreadStateException。
它还没有几个同步的集合,例如java.util.Hashtable。
JDK 1.2和JDK 1.3没有与多线程相关的明显变化。(如果我错过任何事情,请纠正我)。
JDK 1.4中,几乎没有JVM级别更改,可以通过一次调用挂起/恢复多个线程。但是没有出现重大的API更改。
JDK 1.5是继JDK 1.x之后的第一个重要版本。它包括多个并发实用程序。Executor,se ...
1.Overview生成随机值是非常常见的任务。这就是Java提供java.util.Random类的原因。
但是,此类在多线程环境中表现不佳。
以简化的方式,在多线程环境中,Random性能不佳的原因是由于争用–假设多个线程共享同一个Random实例。
为了解决该限制,Java 在JDK 7中引入了java.util.concurrent.ThreadLocalRandom类–用于在多线程环境中生成随机数。
让我们看看ThreadLocalRandom是如何执行的以及如何在实际应用程序中使用它。
ThreadLocalRandom Over RandomThreadLocalRandom是ThreadLocal和Random类的组合,它们与当前线程隔离。因此,通过简单地避免对 Random实例的任何并发访问,它可以在多线程环境中实现更好的性能。
一个线程获得的随机数不受另一线程的影响,而java.util.Random则全局提供随机数。
另外,与Random 不同,ThreadLocalRandom不支持显式设置种子。相反,它将重写从Random继承的setSeed(long s ...
java并发教程
未读定义线程安全性出奇的棘手。快速的Google搜索会发现许多类似的“定义”:
线程安全代码是即使许多线程同时执行也可以运行的代码。如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的。并且还有更多类似的定义。
您是否不认为上述定义实际上并没有传达任何有意义的信息,甚至会增加一些混乱。尽管不能排除那样的定义,因为它们没有错。但是事实是它们没有提供任何实际帮助或观点。我们如何区分线程安全的类和不安全的类?我们什至“安全”是什么意思?
什么是线程安全的正确性?线程安全性的任何合理定义的核心是正确性的概念。因此,在了解线程安全性之前,我们应该首先了解“ correctness”。
正确性表示一个类符合其规范。
您将同意,良好的类规范将在任何给定时间具有有关类状态的所有信息,并且如果对它执行了某些操作,则它是后置条件。由于我们经常没有为类编写足够的规范,我们怎么可能知道它们是正确的?我们不能,但是一旦我们说服自己“ 代码可以工作 ” ,那也不会阻止我们继续使用它们。这种“代码置信度 ”与我们许多人接近正确性的程度差不多。
乐观地将“正确性”定义为可以识别的事物之后,我们 ...
