小编jqn*_*qno的帖子

Clojure中的并发笛卡尔积算法

seq在Clojure中是否有一个很好的算法来同时计算三个笛卡尔积?

我正在Clojure开展一个小型业余爱好项目,主要是作为学习语言及其并发功能的一种手段.在我的项目中,我需要计算三个笛卡尔乘积seq(并对结果做一些事情).

我找到了cartesian-product函数clojure.contrib.combinatorics,效果很好.然而,笛卡尔积的计算结果证明是该程序的瓶颈.因此,我想同时进行计算.

现在,对于该map功能,有一个方便的pmap替代方案,神奇地使事物并发.哪个很酷:).不幸的是,这样的事情不存在cartesian-product.我查看了源代码,但我找不到一个简单的方法来让它自己并发.

此外,我尝试使用自己实现的算法map,但我想我的算法技能不再像过去那样.我设法拿出了两个丑陋的东西seq,但是三个绝对是一座太过分的桥梁.

那么,有没有人知道一个已经并发的算法,或者我可以自己并行化的算法?


编辑

换句话说,我真正想要实现的是实现与此Java代码类似的东西:

for (ClassA a : someExpensiveComputation()) {
    for (ClassB b : someOtherExpensiveComputation()) {
        for (ClassC c : andAnotherOne()) {
            // Do something interesting with a, b and c
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

algorithm parallel-processing concurrency clojure cartesian-product

7
推荐指数
1
解决办法
1484
查看次数

子项目SBT内存不足

我们在CircleCI上使用SBT 0.13和Java 8 JVM来构建一个包含多个子项目的Play应用程序.我们偶尔会在CircleCI上出现内存问题,因为它超过了4 GB的内存使用量而中断了我们的构建.

昨天,我在构建中添加了一个新子项目,现在几乎所有构建都因内存不足问题而失败.看起来添加子项目也会增加用于构建的内存量.

我已经尝试了几种方法来减少内存负载:

  • 加入_JAVA_OPTIONS: "-Xms512m -Xmx2048"circle.yml对所描述的CircleCI的文档页面.(我从日志中注意到JVM确实接受了这个设置.)
  • -mem参数添加到SBT调用.
  • 添加concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)到SBT文件的顶部,以确保至少一次不使用所有内存.

所有这些措施似乎都有所帮助,但我还没有找到解决这个问题的最终方法.

我还能做些什么来控制SBT的内存使用?

编辑:我们的项目有5个子项目,大约有14000行Scala代码(以及我们继承的21000行Java代码).在使用FindBugs执行静态分析时,通常会(但不总是)发生内存不足:我们将其与FindSecurityBugs插件结合使用以查找安全问题.

scala out-of-memory sbt

7
推荐指数
1
解决办法
1007
查看次数

在MSBuild中生成版本号

我们有一个带有WiX安装程序和MSBuild构建脚本的C#解决方案.我们正在从SVN迁移到Git.

作为我们版本号的第四部分,我们希望每个构建都能提升.到目前为止,我们已经使用了SVN版本号.MSBuild脚本定义了一个ProductVersion属性,其中包含SVN修订版号作为构建版本的四个数字的最后一个.但是,我们不能再使用它,因为我们将不再使用SVN.

我一直试图找到SVN版本号的替代品,但我无法弄清楚要使用什么.

  • Jenkins提供了我可以使用的内部版本号,但我不想将我们的版本控制系统与Jenkins联系起来.

  • Jenkins还提供了时间戳,但它不符合Microsoft的版本号限制:它是字母数字且有点长,而版本中的第4个数字应该是0到65535之间的整数.

  • 我们可以将AssemblyVersion设置为1.0.*并让.NET填写其余部分.这适用于我们的程序集,但我找不到将其注入WiX的方法.我们可以在构建之后从其中一个程序<MSBuild>集中获取它,但我们的MSBuild脚本使用该任务立即构建整个解决方案,因此我们陷入了需要运行的Catch-22,<MSBuild>因此它可以编译一个程序集我们可以用来获取生成的版本号,但是为了运行<MSBuild>,我们首先需要一个已编译的程序集,以便我们可以从中获取生成的版本号.

  • 我可以在MSBuild文件中添加一个单独的Target来编译某些东西(任何东西)并从中获取版本号,然后对该<MSBuild>任务进行实际调用.但那只是感觉不对.

同样,我并不关心数字是什么,只要它随着每次构建而增加.基于时间戳的东西会很好.有任何想法吗?

.net versioning msbuild wix

6
推荐指数
1
解决办法
9904
查看次数

Scala indexOf接受一切

我把它写成了一个REPL:

case class Thingy(s: String)
val things = List(Thingy("x"), Thingy("y"))
things.indexOf("x")
Run Code Online (Sandbox Code Playgroud)

那回来了-1.但我本来以为它不会编译,因为它"x"是a String,而不是a Thingy.事实上,事实证明你投入的类型并不重要indexOf:

things.indexOf(42)
things.indexOf(java.time.LocalDate.now())
Run Code Online (Sandbox Code Playgroud)

这些都返回-1.

indexOf 有这个签名:

def indexOf[B >: A](elem: B): Int
Run Code Online (Sandbox Code Playgroud)

我认为>:手段B应该是超类型A,但这些类都不是我的案例类的超类型Thingy.

我在这里错过了什么?

scala

6
推荐指数
1
解决办法
160
查看次数

Constructor.newInstance替换Scala对象

我正在用Jackson调试反序列化问题,其中object似乎替换了Scala 实例。我设法将问题深入到以下代码:

object WaitWhat extends App {

  object XX

  val x1 = XX

  // Notice: no assignment!
  XX.getClass.getConstructor().newInstance()

  val x2 = XX

  println(x1)
  println(x2)
}
Run Code Online (Sandbox Code Playgroud)

输出为:

WaitWhat$XX$@5315b42e
WaitWhat$XX$@2ef9b8bc
Run Code Online (Sandbox Code Playgroud)

(当然,实际的哈希码每次运行都会更改。)

IntelliJ的调试器还指示x1x2确实是不同的实例,尽管的结果newInstance被完全忽略了。

我本来希望没有行动,或者某种例外。实际的对象实例怎么可能被此调用替换

reflection scala

6
推荐指数
1
解决办法
67
查看次数

Java记录构造函数通过反射不可见

我正在使用 Java 15 的新记录功能,以及它如何与反射交互。我遇到了一些奇怪的行为,有时我可以通过反射访问记录的构造函数,有时则不能。例如,给定以下 Java 文件:

Recording.java

public class Recording {
    public static void main(String[] args) {
        System.out.println("Constructors: " + MainRecord.class.getConstructors().length);
        System.out.println("Methods: " + MainRecord.class.getDeclaredMethods().length);
    }

    record MainRecord(int i, String s) {}
}
Run Code Online (Sandbox Code Playgroud)

其行为如下:

? javac --enable-preview --release 15 Recording.java
Note: Recording.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
? java --enable-preview Recording
Constructors: 0
Methods: 5
Run Code Online (Sandbox Code Playgroud)

换句话说,对 的调用getConstructors()没有找到任何构造函数(而对 getDeclaredMethods() 的调用确实找到了方法)。我不明白为什么不,因为构造函数确实存在:

? javap Recording\$MainRecord
Compiled from "Recording.java"
final class Recording$MainRecord extends java.lang.Record {
  Recording$MainRecord(int, …
Run Code Online (Sandbox Code Playgroud)

java reflection java-15

6
推荐指数
1
解决办法
408
查看次数

'YZ'类型中不存在类型'X'

我们的团队最近已从Visual Studio 2008/.NET3.5迁移到Visual Studio 2010/.NET4.0.现在,VS2010给了我一个奇怪的错误信息.它可以通过以下程序重现:

using System;

namespace Some.Main
{
}

namespace SomeLib
{
    interface Some
    {
    }
}

namespace ConsoleApplication1
{
    using Some.Main;
    using SomeLib;

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Press enter to continue");
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这在VS2008中运行得很好,但在VS2010中我收到以下错误消息:

"SomeLib.Some"类型中不存在类型名称"Main"

有趣的是,如果我点击"构建解决方案",该程序构建得很好,我甚至可以毫无问题地执行它.它只是Visual Studio,似乎有这个代码的问题.

不幸的是,我正在研究一个大型遗留应用程序,我不能(轻松地)更改这些名称空间的名称.

我想知道如何解决这个错误,我也很好奇是什么导致它.

.net c# compiler-errors .net-4.0

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

Drools:获取 3 个最近的事件

我正在从事一个小型 Drools 项目,因为我想了解有关使用规则引擎的更多信息。我有一个名为的类Event,它具有以下字段:

  • String tag; 可以是任何字符串的标签。
  • long millis;一个时间戳。(实际上,这是从LocalDate同样在Event. 中的 JodaTime字段转换而来的。)
  • int value; 我想要推理的值。

Event在我的知识库中插入了数百个实例,现在我想获取标记为"OK". 我想出了以下代码,该代码有效:

rule "Three most recent events tagged with 'OK'"
when
    $e1 : Event( tag == "OK",
                 $millis1 : millis )
    $e2 : Event( tag == "OK",
                 millis < $millis1, $millis2 : millis )
    $e3 : Event( tag == "OK",
                 millis < $millis2, $millis3 : millis )

    not Event( tag == "OK",
               millis > $millis1 ) …
Run Code Online (Sandbox Code Playgroud)

java drools

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

sonar-project.properties 中的 Glob

我正在开发一个大型遗留项目,并试图从 SonarQube 开始对其进行组件化。我正在配置一个多模块项目sonar-project.properties。这很好用。但是,我在精确识别源文件夹时遇到问题。

不幸的是,我们的模块在文件系统中没有整齐地分开。项目被分成许多Eclipse项目,几个Eclipse项目一起组成一个模块。当然,我可以列举所有的项目,但是这非常麻烦,因为项目很多。这是我们的目录结构的(简化)版本:

projects/
    moduleAsubmodule1/
        src/
            com/mycompany/moduleA/submodule1/
    moduleAsubmodule2/
        src/
            com/mycompany/moduleA/submodule2/
    moduleBsubmodule1/
        src/
            com/mycompany/moduleB/submodule1/
    moduleBsubmodule2/
        src/
            com/mycompany/moduleB/submodule2/
    moduleBsubmodule3/
        src/
            com/mycompany/moduleB/submodule3/
Run Code Online (Sandbox Code Playgroud)

想象一下更多的模块和子模块,其中项目名称被连接起来,但包名称被很好地划分,使得区分这些模块和子模块变得更容易。

moduleA.sonar.projectBaseDir=.
moduleA.sonar.sources=projects/**/src/com/mycompany/moduleA/**/*
moduleA.sonar.test=projects/**/*.test/src/com/mycompany/moduleA/**/*
Run Code Online (Sandbox Code Playgroud)

根据文档,这应该可以排除。但是,我收到以下错误消息:

16:10:44 ERROR: Unable to execute Sonar
16:10:44 ERROR: Caused by: The folder 'projects/**/src/com/mycompany/mymodule/**/*' does not exist for 'XXX:XXX:mymodule' (base directory = D:\XxxSonar\.)
Run Code Online (Sandbox Code Playgroud)

所以我猜 glob 不适用于来源?如果确实如此,我该怎么办?

我们使用SonarQube 4.1.2。

java glob sonarqube

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

SimpleDateFormat 成功或抛出取决于年份数

ddMMyy我正在使用遗留代码,尝试使用与输入并不真正匹配的格式字符串来解析包含通常用零填充的可选时间组件的日期。本着真正的遗留代码的精神,没有人费心去清理它,因为它意外地做了它应该做的事情。但到了 2023 年,情况就不再如此了。

这是代码的(大大简化的)版本:

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class WeirdDateFormat {
    public static void main(String...args) throws ParseException {
        var df = new SimpleDateFormat("ddMMyy");
        df.setLenient(false);

        System.out.println(df.parse("09012023000000000"));
        System.out.println(df.parse("09012022000000000"));
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印:

Mon Jan 09 00:00:00 CET 70403584
Exception in thread "main" java.text.ParseException: Unparseable date: "09012022000000000"
    at java.base/java.text.DateFormat.parse(DateFormat.java:399)
    at WeirdDateFormat.main(WeirdDateFormat.java:10)
Run Code Online (Sandbox Code Playgroud)

换句话说,第一个日期(2023 年 1 月 9 日)解析良好,但给出了年份为 70403584 的日期。第二个日期(2022 年 1 月 9 日)无法解析并引发异常。

(如果我们将 lenient 设置为true,则第二个日期不会抛出异常,但最终会出现在 239492593 年。)

这里发生了什么?为什么有时解析失败,有时解析失败?这些奇怪的年份数字从何而来?

(在运行 Java 8 的生产环境中发现了该问题,但 Java 17 上的行为是相同的。)

编辑是的,我知道,我知道,我必须修复遗留代码。不用一直告诉我,你在向唱诗班布道!不幸的是,我的代码的大幅简化版本并没有向您展示代码库中还 …

java simpledateformat

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