小编Chr*_*s B的帖子

为什么JUnit不提供assertNotEquals方法?

有人知道为什么JUnit 4提供assertEquals(foo,bar)但不提供assertNotEqual(foo,bar)方法吗?

它提供assertNotSame(对应assertSame)和assertFalse(对应assertTrue),所以看起来很奇怪他们没有打扰包括assertNotEqual.

顺便说一句,我知道JUnit-addons提供了我正在寻找的方法.我只是出于好奇而问.

java junit assert

421
推荐指数
6
解决办法
16万
查看次数

Gradle - 排除配置的依赖关系,但不包括继承配置

使用Gradle 1.0里程碑8.

我的项目使用slf4j + Logback进行日志记录,所以我想阻止log4j上的任何传递deps污染我的类路径.因此,我添加了一个全局排除,如下所示:

configurations {
    all*.exclude group: "log4j", module: "log4j"
}
Run Code Online (Sandbox Code Playgroud)

但是,我使用的是一个测试库(hadoop-minicluster),它对log4j有运行时依赖性,所以我现在需要为我的测试运行时允许一个log4j依赖项.我尝试添加对log4j的直接依赖:

testRuntime group: "log4j", name: "log4j", version: "1.2.15"
Run Code Online (Sandbox Code Playgroud)

并编辑我的排除代码(有点黑客):

configurations.findAll {!it.name.endsWith('testRuntime')}.each { conf ->
    conf.exclude group: "log4j", module: "log4j"
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.将排除添加到testCompile conf会自动将其添加到所有继承配置中,包括testRuntime.并且似乎这种排除优先于我添加的显式依赖.

看来这是Gradle的预期行为.来自文档:

如果为特定配置定义排除,则在解析此配置或任何继承配置时,将针对所有依赖项筛选排除的传递依赖关系.

那么还有其他方法可以实现我想要实现的目标吗?

思路:

  • 创建一个myTestRuntime不从testCompile扩展的新conf ,并将其用于我的测试类路径.
    • 但是我必须复制testCompile和myTestRuntime的所有依赖项.
  • 删除配置级排除项.对于除testRuntime之外的所有confs,循环依赖并手动删除log4j(或在log4j上添加dep-level排除).
    • 这甚至可能吗?Configuration.allDependencies是只读的.

dependencies gradle

18
推荐指数
2
解决办法
3万
查看次数

为什么64位JVM比32位JVM更快?

最近我一直在对我公司的数据库产品的写入性能做一些基准测试,我发现只需切换到64位JVM就可以实现20-30%的一致性能提升.

我不允许详细介绍我们的产品,但基本上它是一个面向列的数据库,针对存储日志进行了优化.该基准测试涉及为其提供几千兆字节的原始日志,并计算分析它们并将其作为结构化数据存储在数据库中所需的时间.CPU和I/O的处理非常繁重,但很难说它的比例是多少.

关于设置的一些注意事项:

Processor: Xeon E5640 2.66GHz (4 core) x 2
RAM: 24GB
Disk: 7200rpm, no RAID
OS: RHEL 6 64bit
Filesystem: Ext4
JVMs: 1.6.0_21 (32bit), 1.6.0_23 (64bit)
Max heap size (-Xmx): 512 MB (for both 32bit and 64bit JVMs)
Run Code Online (Sandbox Code Playgroud)

两个JVM的常量:

  • 相同的操作系统(64位RHEL)
  • 相同的硬件(64位CPU)
  • 最大堆大小固定为512 MB(因此速度增加不是由于64位JVM使用更大的堆)

为简单起见,我已经关闭了产品中的所有多线程选项,因此几乎所有处理都以单线程方式进行.(当我打开多线程时,当然系统变得更快,但32位和64位性能之间的比率保持不变.)

所以,我的问题是......为什么我在使用64位JVM时会看到20-30%的速度提升?以前有人见过类似的结果吗?

直到现在我的直觉如下:

  • 64位指针更大,因此L1和L2缓存更容易溢出,因此64位JVM上的性能更差.

  • JVM使用一些花哨的指针压缩技巧来尽可能地缓解上述问题.在Sun网站的详细信息在这里.

  • 在64位模式下运行时,允许JVM使用更多寄存器,这会略微加快速度.

鉴于以上三点,我预计64位性能会稍微慢一点,或大约等于32位JVM.

有任何想法吗?提前致谢.

编辑:澄清了有关基准环境的一些观点.

java performance 64-bit jvm

15
推荐指数
2
解决办法
1万
查看次数

使用akka-persistence的CQRS + Event Sourcing实现

我想使用akka-persistence事件采购功能,以便在我的新项目中实现CRQS +事件采购理念.问题是除了文档(http://doc.akka.io/docs/akka/snapshot/scala/persistence.html)之外,我找不到任何好的示例或指南如何处理它.该文档在解释体系结构的所有构建块(如处理器,视图,通道)方面非常出色,但没有解释如何将它们组合在一起.

所以问题是:如何在akka-persistence中将写模型与读模型连接起来?我想出了三个选择:

  • 直接连接Eventsourcedrocessor - > View,View直接从日志中接收所有事件.这似乎是最简单的解决方案,但我想知道我们是否可以使用这种方法在不同节点上分配处理器和视图.

  • Eventsourcedrocessor - > Channel - > View/normal Actor.与第一个选项有什么区别?如果这是正确的解决方案,为什么我们在akka-persistence构建块中有视图?我应该使用频道还是PersistentChannels?

  • Eventsourcedrocessor - >某种事件总线(例如context.system.eventStream) - > Views/Actors.

什么是最好的方法,为什么?

cqrs akka event-sourcing akka-persistence

12
推荐指数
1
解决办法
3195
查看次数

以编程方式检查字符串是否是Scala中的保留字

有没有一种简单的方法来实现以下功能?

即,在生成代码时决定是否需要使用反引号引用给定的文本.

def isReservedWord(text: String): Boolean

isReservedWord("type") // true
isReservedWord("foo")  // false
Run Code Online (Sandbox Code Playgroud)

当然,我可以根据语言规范末尾的Scala语法摘要维护一个关键字列表,并检查一下,但是有更好的方法吗?

scala reserved-words keyword

11
推荐指数
1
解决办法
447
查看次数

FindBugs 2.0中不推荐使用的注释

查看FindBugs 2.0中的注释列表,我发现其中很多都已被弃用.

其中一些(@CheckForNull,@NonNull等)已被弃用,因为它们具有等效的JSR-305注释.很高兴最终解决使用哪组注释的困境.

但是一些特定于FindBugs的注释,例如@DefaultAnnotation@DefaultAnnotationForFields,也已被弃用,我找不到任何解释,说明在他们的位置使用什么.我正在尝试迁移大量使用这些注释的代码库,而且我有点卡住了.

我看到JSR-305有@ParametersAreNonnullByDefault,我可以用它来替换一些实例@DefaultAnnotationForParameters,但这不会涵盖所有情况.

我在这里错过了一些大事吗?我应该使用某种设置文件或其他东西,而不是注释吗?

java annotations findbugs deprecated

8
推荐指数
1
解决办法
1916
查看次数

在编译时不知道密钥的情况下解码JSON值

假设我一直在使用这样的JSON:

{ "id": 123, "name": "aubergine" }
Run Code Online (Sandbox Code Playgroud)

通过将其解码为Scala case类,如下所示:

{ "id": 123, "name": "aubergine" }
Run Code Online (Sandbox Code Playgroud)

这与circe的泛型推导工作得很好:

case class Item(id: Long, name: String)
Run Code Online (Sandbox Code Playgroud)

现在假设我要向表示形式添加本地化信息:

{ "id": 123, "name": { "localized": { "en_US": "eggplant" } } }
Run Code Online (Sandbox Code Playgroud)

我不能直接通过泛型派生使用这样的案例类:

scala> import io.circe.generic.auto._, io.circe.jawn.decode
import io.circe.generic.auto._
import io.circe.jawn.decode

scala> decode[Item]("""{ "id": 123, "name": "aubergine" }""")
res1: Either[io.circe.Error,Item] = Right(Item(123,aubergine))
Run Code Online (Sandbox Code Playgroud)

…因为语言标签是键,而不是字段。如何做到这一点,最好不要增加太多样板?

json scala decoding circe generic-derivation

8
推荐指数
1
解决办法
380
查看次数

Scala:我可以将选项转换为varargs吗?

我有一个Option:

val myOption: Option[Int] = fooBar()
Run Code Online (Sandbox Code Playgroud)

还有一个采用varargs参数的方法:

def myMethod(a: String, b: Int*) = {...}
Run Code Online (Sandbox Code Playgroud)

有没有办法将该选项作为varargs参数传递给该方法?即如果选项Some(3)然后传递3,如果它None然后没有传递.

尝试scala的答案 :如何将扩展列表作为varargs传递给方法?我尝试显式输入参数:

myMethod("xyz", myOption: _*)
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨它需要一个Seq[Int].它似乎Option没有实现Seq,也没有预先隐式转换.

鉴于编译器需要a Seq,我当然可以通过myOption.toList: _*,但是有更好的方法吗?

scala variadic-functions option

5
推荐指数
1
解决办法
422
查看次数

将scala列表拆分为n个交错列表

鉴于List如此

List(1, 2, 3, 4, 5, 6, 7)
Run Code Online (Sandbox Code Playgroud)

将它分成n个子列表的最佳方法是什么,将项目以循环方式放入每个列表?

例如,如果n = 3,结果应该是

List(List(1, 4, 7), List(2, 5), List(3, 6))
Run Code Online (Sandbox Code Playgroud)

我认为集合API中会有一个方法来执行此操作,但我似乎无法找到它.

优雅单行的奖励积分;)

scala scala-collections

5
推荐指数
2
解决办法
1673
查看次数

我可以将Guava的AbstractExecutionThreadService用于需要中断的服务吗?

我有一项服务,我想将其作为Google Guava实施Service.

该服务基本上运行一个while (true)循环,在事件到达时处理它们BlockingQueue.这里提供简化的示例代码:

https://gist.github.com/3354249

问题是代码阻塞BlockingQueue#take(),因此停止服务的唯一方法是中断其线程.这可能是使用番石榴的AbstractExecutionThreadService吗?

当然,在这种情况下,我可以queue.take()使用轮询循环替换queue.poll(1, TimeUnit.SECONDS),从而消除了线程中断的需要.然而:

  • 出于性能和代码可读性的原因,我想避免这样做

  • 在其他情况下,无法避免线程中断,例如,如果在从a读取字节时阻止服务InputStream.

java service interrupt guava

5
推荐指数
2
解决办法
2290
查看次数

Mahout推荐器 - 为基于项目的推荐者添加基于内容的相似性

我有一个非常标准的Mahout基于项目的新闻文章推荐器(使用点击数据,因此首选项是布尔值):

DataModel dataModel = new ReloadFromJDBCDataModel(
        new PostgreSQLBooleanPrefJDBCDataModel(localDB, ...)
);
ItemSimilarity itemSimilarity = new TanimotoCoefficientSimilarity(dataModel);
ItemBasedRecommender recommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity);
Run Code Online (Sandbox Code Playgroud)

我正在尝试将基于内容的知识注入到推荐器中,因此我最强烈推荐的文章不仅在正常的协同过滤意义上是相似的,而且在他们共享许多常用术语的意义上也是相似的.

文章内容相似性(TF-IDF向量的余弦相似性)使用Mahout批次预先计算并从DB读取.但是,会有很多对没有相似性数据的文章.这有两个原因:

  • 文章内容相似性数据将比用户项目偏好的数据模型更新更少,因此在新文章计算其内容相似性之前将存在滞后.

  • 理想情况下,我想将所有内容相似性数据加载到内存中,因此我只会为每篇文章存储前20个相似度.

所以,对于一对给定的文章,我有:

  • 项目相似度(Tanimoto)0 <= s1 <= 1
  • 内容相似度(余弦值)0 <= s2 <= 1(可能为空)

在内容相似性不为空的情况下,我想使用其值来加权项目相似性,以便增强具有类似内容的文章.

我的问题是:

  • 尝试结合这些措施是合理的,还是我尝试疯狂的事情?
  • 将这两个值组合成一个相似度得分的合理公式是什么?
  • 这最好是作为一个习惯ItemSimilarity或作为一个Rescorer

recommendation-engine mahout mahout-recommender

4
推荐指数
1
解决办法
3351
查看次数