问题标签 [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.
java - 如何将 Procyon 反编译器与 Diffoscope 一起使用
我在 Ubuntu Bionic 上运行 Diffoscope,当我打开调试日志 ( --debug
) 时,我注意到许多这样的行(每个.class
文件一个JAR
):
我安装了软件包procyon-decompiler
,但错误仍然存在。如何使 Diffoscope 与 Procyon 一起使用?我找不到有关此集成的任何文档!
.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>
。哈希是如何计算的?它取决于上面的变量吗?对我来说,理想情况下,哈希将取决于程序集的其余部分,不包括变化的标识符。
python - 加载包但是已经加载了同名的包
我有同一个 Python 包的两个版本。我需要从当前版本的子包中的模块中调用旧版本包中的函数(过去复制了自己)
我现在在哪里:
旧版本:
我需要导入<HERE>
“旧”f
并运行它。
理想情况下
- 该函数
f
应该在旧包中生存,而不需要对包的新版本一无所知 - 新包中的模块应该调用它,让它过上它的生活,得到结果然后完全忘记旧包的存在(所以在让
f
她做她的事情之后调用“import package.subpackage2”应该运行“new”版本) - 这样做不应该非常复杂
基本思想是通过保存我用于某些任务的代码以及输出数据,然后能够运行其中的一部分来提高可重复性。
遗憾的是,我明白这对 Python 3 来说不是一项简单的任务,所以我准备接受某种妥协。我准备接受,例如在运行旧代码后,“新”代码中f(x)
的名称package
将绑定到旧代码。
编辑
我尝试了两种使用importlib
. 这个想法是创建一个对象mod
然后做f = getattr(mod, "f")
,但它不起作用
- 更改
sys.path
为['.../past/package/subpackage']
然后调用importlib.import_module('package.subpackage.module')
. 问题是即使更改了,它也会在“现在”中加载一个sys.path
,可能是因为名称package
已经在sys.modules
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
) 将不起作用,并给出错误“尝试了没有已知父包的相对导入”
java - 为重复构建 Gradle 相同的校验和
我正在使用 gradle 构建一个 Java 项目,并希望将校验和文件与构建的工件一起发布。问题是重复构建会生成不同的校验和,而无需任何代码更改。花了一些时间追查这个问题,原因很明显:
- 生成的类文件获得创建时间的创建/修改时间戳(很棒的发现!!)
- 此修改日期作为元数据添加到生成的 jar/zip 档案中,这会导致校验和差异
也就是说,实际上不可能在稍后的时间点重新构建将输出相同文件的某个版本。
我认为通过在创建后将工件的修改/创建日期更改为某个默认值来“修复”这个问题很容易。但这会导致档案中出现某种奇怪的元数据信息——类似的东西1970-01-01T00:00:00Z
很明显,但乍一看仍然令人困惑。
有没有其他方法可以完全省略创建档案时的时间戳元数据。还是在创建档案后将其删除?
或者是否有任何其他方法可以使重复构建生成相同的工件?
我实际上想知道这种情况下的最佳做法是什么?!
r - 具有环境的可重现 saveRDS
我正在构建一个 R 包并使用data-raw
和data
存储一个预定义RxODE
模型库。这很好用。
但是,生成的.rda
文件在每一代都会更改。某些模型包含 R 环境,并且序列化似乎包含“创建时间”时间戳。这意味着每次data/
重新生成目录时,所有文件都已更改...
是否有某种方法可以修改 R 环境的序列化以使其可重现?
java - 可以强制 Java 8 编译器创建可重现的类文件吗?
我的雇主有业务需要使 Java 构建逐字节可重复。我知道使 JAR 文件可重现的困难(由于归档顺序和时间戳),但此时我正在谈论类文件。
我在 Mac 和 Linux 上都使用 Java 8u65 构建了相同的代码。类文件是二进制不同的。两个类都反编译回相同的源;要查看差异需要 javap 反汇编程序。
源代码似乎是:
在一个构建中,结果是:
另一方面,它是:
匿名 lambda 的名称中包含不同的数字(lambda$restTemplate$15
与lambda$restTemplate$38
)。
看来,当我在同一台主机上重建时,我得到了相同的字节。当主机不同时,数字会改变;两个 Linux 主机产生不同的字节。
是什么决定了这些数字?有没有办法强制每个编译在这个地方使用相同的数字,从而产生相同的类文件?还是 Java 8 类文件编译不确定?
tensorflow - 在 TensorFlow 中,有没有办法在会话级别设置种子?
我试图在运行会话时获得可重复的结果,但想在会话之间自由更改种子。像这样的东西:
如果我正确理解了 set_random_seed 页面,该方法似乎在图形级别设置种子,因此会话之间的结果将是相同的。事实上,根据该页面,似乎只能:
- 使运行不可重现
- 使单个操作可重现,而不会在会话之间更改(通过直接设置操作的种子)
- 使所有操作可重现,不可能在会话之间更改(通过使用 set_random_seed)
我找不到任何方法来灵活更改种子而无需重建图形。任何指向正确解决方案的指针都将受到高度赞赏。
.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.props
repo 的根目录来尝试它:
当我运行时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 中它可以正常工作macOS
,Linux
但在Windows
. 我在 Mac 上创建了锁定文件。我在 Windows 上拉了分支,它确实失败了:
我敢打赌它正在使用文件路径分隔符,例如/
在计算哈希时,这就是失败的原因。
tensorflow - 具有 Tensorflow 背景的 Keras 可重现结果
我有自己的网络。但是每次我运行代码时它都会给我不同的输出。我正在使用 keras(带有 Tensorflow 后端),编写以下代码以实现可重复性。我的训练样本:280,验证样本#27,测试样本#21。
python - 为什么这段代码不能从我的 Keras LSTM 中获得重现性?
我尝试使用 StackExchange 上的各种资源和 Keras 提供的资源从我的 LSTM 中获得可重现的结果。我目前正在按以下顺序执行以下操作(并且失败)以确保可重复性:
我设置了 PYTHONHASHSEED(通过魔法,你会看到我在 Jupyter 笔记本中工作)。
我确保我只使用 CPU 而不是 GPU。
我为可能引入任何随机化的 python 库设置了随机种子(numpy、python 随机模块、tensorflow)。
我强制 TensorFlow 使用单线程。
虽然您可能会注意到 RandomizedSearchCV 和 TimeSeriesSplit 在下面的代码中被导入,但我没有在生成结果时使用它们,因为我想到这可能会引入其他随机化陷阱。相反,我正在为我的数据运行一个训练集和一个测试集,由硬编码索引分解,并且只训练一个时期,以便更容易地隔离这种不需要的可变性的来源。
实施上述控制确实更好地限制了可变性,但尽管如此,我的 val_loss 在 2 个值之间摇摆不定,因此不是真正可重现的。我不知道为什么一次运行会给我一个值,而下一次运行会给我相同的值,或者另一个没有押韵或理由的值。有人可以告诉我我做错了什么吗?