问题标签 [binary-reproducibility]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
283 浏览

java - 如何将 Procyon 反编译器与 Diffoscope 一起使用

我在 Ubuntu Bionic 上运行 Diffoscope,当我打开调试日志 ( --debug) 时,我注意到许多这样的行(每个.class文件一个JAR):

我安装了软件包procyon-decompiler,但错误仍然存​​在。如何使 Diffoscope 与 Procyon 一起使用?我找不到有关此集成的任何文档!

0 投票
1 回答
41 浏览

.net - 重复构建之间的 Assembly.Evidence 是否一致?

我知道从相同源代码重复构建程序集会产生差异很小的二进制文件:http: //blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html

  • MVID:识别PE的GUID,它为编译器1生成的每个PE新生成。
  • PDB ID:识别 PDB 匹配 PDB 的 GUID,在每次构建时新生成。
  • 日期/时间戳:自每个构建计算的纪元以来的秒数。

这对Assembly.Evidence意味着什么?重复构建(来自相同的源代码)之间是否一致?

特别是,Assembly.Evidence.OfType<Hash>。哈希是如何计算的?它取决于上面的变量吗?对我来说,理想情况下,哈希将取决于程序集的其余部分,不包括变化的标识符。

0 投票
1 回答
383 浏览

python - 加载包但是已经加载了同名的包

我有同一个 Python 包的两个版本。我需要从当前版本的子包中的模块中调用旧版本包中的函数(过去复制了自己)

我现在在哪里:

旧版本:

我需要导入<HERE>“旧”f并运行它。

理想情况下

  • 该函数f应该在旧包中生存,而不需要对包的新版本一无所知
  • 新包中的模块应该调用它,让它过上它的生活,得到结果然后完全忘记旧包的存在(所以在让f她做她的事情之后调用“import package.subpackage2”应该运行“new”版本)
  • 这样做不应该非常复杂

基本思想是通过保存我用于某些任务的代码以及输出数据,然后能够运行其中的一部分来提高可重复性。

遗憾的是,我明白这对 Python 3 来说不是一项简单的任务,所以我准备接受某种妥协。我准备接受,例如在运行旧代码后,“新”代码中f(x)的名称package将绑定到旧代码。

编辑

我尝试了两种使用importlib. 这个想法是创建一个对象mod然后做f = getattr(mod, "f"),但它不起作用

  1. 更改sys.path['.../past/package/subpackage']然后调用importlib.import_module('package.subpackage.module') . 问题是即使更改了,它也会在“现在”中加载一个sys.path,可能是因为名称package已经在sys.modules
  2. spec = importlib.util.spec_from_file_location("module", "path..to..past..module.py")) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) 在这种情况下,相对导入 ( from . import module2.py) 将不起作用,并给出错误“尝试了没有已知父包的相对导入”
0 投票
1 回答
504 浏览

java - 为重复构建 Gradle 相同的校验和

我正在使用 gradle 构建一个 Java 项目,并希望将校验和文件与构建的工件一起发布。问题是重复构建会生成不同的校验和,而无需任何代码更改。花了一些时间追查这个问题,原因很明显:

  1. 生成的类文件获得创建时间的创建/修改时间戳(很棒的发现!!
  2. 此修改日期作为元数据添加到生成的 jar/zip 档案中,这会导致校验和差异

也就是说,实际上不可能在稍后的时间点重新构建将输出相同文件的某个版本。

我认为通过在创建后将工件的修改/创建日期更改为某个默认值来“修复”这个问题很容易。但这会导致档案中出现某种奇怪的元数据信息——类似的东西1970-01-01T00:00:00Z很明显,但乍一看仍然令人困惑。

有没有其他方法可以完全省略创建档案时的时间戳元数据。还是在创建档案后将其删除?

或者是否有任何其他方法可以使重复构建生成相同的工件?

我实际上想知道这种情况下的最佳做法是什么?!

0 投票
1 回答
125 浏览

r - 具有环境的可重现 saveRDS

我正在构建一个 R 包并使用data-rawdata存储一个预定义RxODE模型库。这很好用。

但是,生成的.rda文件在每一代都会更改。某些模型包含 R 环境,并且序列化似乎包含“创建时间”时间戳。这意味着每次data/重新生成目录时,所有文件都已更改...

是否有某种方法可以修改 R 环境的序列化以使其可重现?

0 投票
3 回答
388 浏览

java - 可以强制 Java 8 编译器创建可重现的类文件吗?

我的雇主有业务需要使 Java 构建逐字节可重复。我知道使 JAR 文件可重现的困难(由于归档顺序和时间戳),但此时我正在谈论类文件。

我在 Mac 和 Linux 上都使用 Java 8u65 构建了相同的代码。类文件是二进制不同的。两个类都反编译回相同的源;要查看差异需要 javap 反汇编程序。

源代码似乎是:

在一个构建中,结果是:

另一方面,它是:

匿名 lambda 的名称中包含不同的数字(lambda$restTemplate$15lambda$restTemplate$38)。

看来,当我在同一台主机上重建时,我得到了相同的字节。当主机不同时,数字会改变;两个 Linux 主机产生不同的字节。

是什么决定了这些数字?有没有办法强制每个编译在这个地方使用相同的数字,从而产生相同的类文件?还是 Java 8 类文件编译不确定?

0 投票
0 回答
704 浏览

tensorflow - 在 TensorFlow 中,有没有办法在会话级别设置种子?

我试图在运行会话时获得可重复的结果,但想在会话之间自由更改种子。像这样的东西:

如果我正确理解了 set_random_seed 页面,该方法似乎在图形级别设置种子,因此会话之间的结果将是相同的。事实上,根据该页面,似乎只能:

  • 使运行不可重现
  • 使单个操作可重现,而不会在会话之间更改(通过直接设置操作的种子)
  • 使所有操作可重现,不可能在会话之间更改(通过使用 set_random_seed)

我找不到任何方法来灵活更改种子而无需重建图形。任何指向正确解决方案的指针都将受到高度赞赏。

0 投票
1 回答
1698 浏览

.net - NuGet 锁定文件无法使用 --locked-mode 还原

Roslyn几年前给了我们deterministic构建版本。

并且通过添加NuGet 锁定文件,我们终于可以保证可重现的构建

我正在查看那些说我可以选择加入的文档

--use-lock-file Bootstraps use of lock file for a project. You can alternatively set RestorePackagesWithLockFile property in the project file

并且在恢复时需要一个锁定文件:

--locked-mode Enables locked mode for restore. This is useful in CI/CD scenarios where you would like to get the repeatable builds. This can be also by setting the RestoreLockedMode MSBuild property to true

我正在通过修改Directory.Build.propsrepo 的根目录来尝试它:

当我运行时dotnet restore,我看到lock生成的文件:

现在,如果我尝试恢复:dotnet restore --locked-mode,它会完全失败。输出摘要如下:

我一定是在这里完全错了。

PS:如果有人有兴趣看一下,我已经将更改推送到一个分支并在 GitHub 上打开了一个 PR 。

编辑:2021 年 1 月:1 年半后,我再次尝试使用 .NET 5 SDK,但仍然遇到问题: https ://github.com/getsentry/sentry-dotnet/pull/731

我试过DisableImplicitNuGetFallbackFolder没有成功。锁定文件似乎是平台相关的。

在 CI 中它可以正常工作macOSLinux但在Windows. 我在 Mac 上创建了锁定文件。我在 Windows 上拉了分支,它确实失败了:

我敢打赌它正在使用文件路径分隔符,例如/在计算哈希时,这就是失败的原因。

0 投票
0 回答
104 浏览

tensorflow - 具有 Tensorflow 背景的 Keras 可重现结果

我有自己的网络。但是每次我运行代码时它都会给我不同的输出。我正在使用 keras(带有 Tensorflow 后端),编写以下代码以实现可重复性。我的训练样本:280,验证样本#27,测试样本#21。

0 投票
1 回答
329 浏览

python - 为什么这段代码不能从我的 Keras LSTM 中获得重现性?

我尝试使用 StackExchange 上的各种资源和 Keras 提供的资源从我的 LSTM 中获得可重现的结果。我目前正在按以下顺序执行以下操作(并且失败)以确保可重复性:

  • 我设置了 PYTHONHASHSEED(通过魔法,你会看到我在 Jupyter 笔记本中工作)。

  • 我确保我只使用 CPU 而不是 GPU。

  • 我为可能引入任何随机化的 python 库设置了随机种子(numpy、python 随机模块、tensorflow)。

  • 我强制 TensorFlow 使用单线程。

  • 虽然您可能会注意到 RandomizedSearchCV 和 TimeSeriesSplit 在下面的代码中被导入,但我没有在生成结果时使用它们,因为我想到这可能会引入其他随机化陷阱。相反,我正在为我的数据运行一个训练集和一个测试集,由硬编码索引分解,并且只训练一个时期,以便更容易地隔离这种不需要的可变性的来源。

实施上述控制确实更好地限制了可变性,但尽管如此,我的 val_loss 在 2 个值之间摇摆不定,因此不是真正可重现的。我不知道为什么一次运行会给我一个值,而下一次运行会给我相同的值,或者另一个没有押韵或理由的值。有人可以告诉我我做错了什么吗?