From unknown Wed Jun 18 23:09:12 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#61701 <61701@debbugs.gnu.org> To: bug#61701 <61701@debbugs.gnu.org> Subject: Status: [PATCH] doc: Propose new cookbook section for reproducible research. Reply-To: bug#61701 <61701@debbugs.gnu.org> Date: Thu, 19 Jun 2025 06:09:12 +0000 retitle 61701 [PATCH] doc: Propose new cookbook section for reproducible re= search. reassign 61701 guix-patches submitter 61701 kyle severity 61701 normal tag 61701 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 22 00:17:44 2023 Received: (at submit) by debbugs.gnu.org; 22 Feb 2023 05:17:44 +0000 Received: from localhost ([127.0.0.1]:57816 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUhVf-0001XA-NT for submit@debbugs.gnu.org; Wed, 22 Feb 2023 00:17:44 -0500 Received: from lists.gnu.org ([209.51.188.17]:32940) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUhVb-0001X0-KT for submit@debbugs.gnu.org; Wed, 22 Feb 2023 00:17:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pUhVb-0006G2-9b for guix-patches@gnu.org; Wed, 22 Feb 2023 00:17:39 -0500 Received: from mout01.posteo.de ([185.67.36.65]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pUhVY-0003ce-V3 for guix-patches@gnu.org; Wed, 22 Feb 2023 00:17:39 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 1BE4824048F for ; Wed, 22 Feb 2023 06:17:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1677043053; bh=88EFeGbzQ6Sr6/OkhBheV0lRPMic1IKI8vQsygcOa5o=; h=From:To:Cc:Subject:Date:From; b=mxV+WGQsz6aYGodHcud8PYJ9aD52pcqq2Hk1G9in6UVMpAN1KLW/O1lYBEIE4R9td 9gY/6biA0rRQvPfk9BZIt5oHsk/xbmnBQO59sVx094zQQfw5HWZl+I+XftQNOCGb4z WAtU9vUFzscEe7nSL0/SYTl7ocnNc5ZwwIOya0tBOFbIxoXddfUhZgmt2OCRMweEPv 2jKkOqEfjWABEwyE1JeJN7dNSSxex+1Fb7Nzxx408hoLDKOXHfJcybXCO3LIkQDCR7 HjRZnjC+PlEsYUQiZQ18JIZXlrGEHWyUtAYfoWUZ4N4K6PkwQComxCBudBeORh5X8j Oq+Zpltxb9QrQ== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4PM4Cv60TZz9rxD; Wed, 22 Feb 2023 06:17:31 +0100 (CET) From: kyle To: guix-patches@gnu.org Subject: [PATCH] doc: Propose new cookbook section for reproducible research. Date: Wed, 22 Feb 2023 05:17:29 +0000 Message-Id: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=185.67.36.65; envelope-from=kyle@posteo.net; helo=mout01.posteo.de X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit Cc: Kyle Andrews X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) From: Kyle Andrews The intent was to cover the most common cases where R and python using researchers could rapidly achieve the benefits of reproducibility. --- doc/guix-cookbook.texi | 174 +++++++++++++++++++++++++++++++++++ guix/build-system/python.scm | 1 + 2 files changed, 175 insertions(+) diff --git a/doc/guix-cookbook.texi b/doc/guix-cookbook.texi index b9fb916f4a..8a10bcbec7 100644 --- a/doc/guix-cookbook.texi +++ b/doc/guix-cookbook.texi @@ -114,6 +114,7 @@ Top Environment management +* Reproducible Research in Practice:: Write manifests to create reproducible environments. * Guix environment via direnv:: Setup Guix environment with direnv Installing Guix on a Cluster @@ -3538,9 +3539,182 @@ Environment management demonstrate such utilities. @menu +* Reproducible Research in Practice:: Write manifests to create reproducible environments * Guix environment via direnv:: Setup Guix environment with direnv @end menu +@node Reproducible Research in Practice +@section Common scientific software environments + +Many researchers write applied scientific software supported by a +mixture of more generic tools developed by teams written within the R +and Python ecosystems and supporting shell utilities. Even researchers +who predominantly stick to using just R or just python often have to use +both R and python at the same time when collaborating with others. This +tutorial covers strategies for creating manifests to handle such +situations. + +Widely used R packages are hosted on CRAN, which employs a strict test +suite backed by continuous integration infrastructure for the latest R +version. A positive result of this rigid discipline is that most R +packages from the same period of time will interoperate well together +when used with a particular R version. This means there is a clear +low-complexity target for achieving a reproducible environment. + +Writing a manifest for packaging R code alone requires only minimal +knowledge of the Guix infrastructure. This stub should work for most +cases involving the R packages already in Guix. + +@example +(use-modules + (gnu packages cran) + (gnu packages statistics)) + +(packages->manifest + (list r r-tidyverse)) + +R packages are defined predominantly inside of gnu/packages/cran.scm and +gnu/packages/statistics.scm files under a guix source repository. + +This manifest can be run with the basic guix shell command: + +@example +guix shell --manifest=manifest.scm --container +@end example + +Please remember at the end to pin your channels so that others in the +future know how to recover your exact Guix environment. + +@example +guix describe --format=channels > channels.scm +@end example + +This can be done with Guix time machine: + +@example +guix time-machine --channels=channels.scm \ + -- guix shell --manifest=manifest.scm --container +@end example + +In contrast, the python scientific ecosystem is far less +standardized. There is no effort made to integrate all python packages +together. While there is a latest python version, it is less often less +dominantly used for various reasons such as the fact that python tends +to be employed with much larger teams than R is. This makes packaging up +reproducible python environments much more difficult. Adding R together +with python as a mixture complicates things still further. However, we +have to be mindful of the goals of reproducible research. + +If reproducibility becomes an end in itself and not a catlyst towards +faster discovery, then Guix will be a non-starter for scientists. Their +goal is to develop useful understanding about particular aspects of the +world. + +Thankfully, three common scenarios cover the vast majority of +needs. These are: + +@itemize +@item +combining standard package definitions with custom package definitions +@item +combining package definitions from the current revision with other revisions +@item +combining package variants which need a modified build-system +@end itemize + +In the rest of the tutorial we develop a manifest which tackles all +three of these common issues. The hope is that if you see the hardest +possible common situation as being readily solvable without writing +thousands of lines of code, researchers will clearly see it as worth the +effort which will not pose a significant detour from the main line of +their research. + +@example +(use-modules + (guix packages) + (guix download) + (guix licenses) + (guix profiles) + (gnu packages) + (gnu packages cran) + (guix inferior) + (guix channels) + (guix build-system python)) + +;; guix import pypi APTED +(define python-apted + (package + (name "python-apted") + (version "1.0.3") + (source (origin + (method url-fetch) + (uri (pypi-uri "apted" version)) + (sha256 + (base32 + "1sawf6s5c64fgnliwy5w5yxliq2fc215m6alisl7yiflwa0m3ymy")))) + (build-system python-build-system) + (home-page "https://github.com/JoaoFelipe/apted") + (synopsis "APTED algorithm for the Tree Edit Distance") + (description "APTED algorithm for the Tree Edit Distance") + (license expat))) + +(define last-guix-with-python-3.6 + (list + (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (commit + "d66146073def03d1a3d61607bc6b77997284904b")))) + +(define connection-to-last-guix-with-python-3.6 + (inferior-for-channels last-guix-with-python-3.6)) + +(define first car) + +(define python-3.6 + (first + (lookup-inferior-packages + connection-to-last-guix-with-python-3.6 "python"))) + +(define python3.6-numpy + (first + (lookup-inferior-packages + connection-to-last-guix-with-python-3.6 "python-numpy"))) + +(define included-packages + (list r r-reticulate)) + +(define inferior-packages + (list python-3.6 python3.6-numpy)) + +(define package-with-python-3.6 + (package-with-explicit-python python-3.6 + "python-" "python3.6-" 'python3-variant)) + +(define custom-variant-packages + (list (package-with-python-3.6 python-apted))) + +(concatenate-manifest + (map packages->manifest + (list + included-packages + inferior-packages + custom-variant-packages))) +@end example + +This should produce a profile with the latest R and an older python +3.6. These should be able to interoperate with code like: + +@example +library(reticulate) +use_python("python") +apted = import("apted") +t1 = '{a{b}{c}}' +t2 = '{a{b{d}}}' +metric = apted$APTED(t1, t2) +distance = metric$compute_edit_distance() +@end example + @node Guix environment via direnv @section Guix environment via direnv diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm index c8f04b2298..d4aaab906d 100644 --- a/guix/build-system/python.scm +++ b/guix/build-system/python.scm @@ -36,6 +36,7 @@ (define-module (guix build-system python) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%python-build-system-modules + package-with-explicit-python package-with-python2 strip-python2-variant default-python -- 2.37.2 From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 22 05:53:17 2023 Received: (at 61701) by debbugs.gnu.org; 22 Feb 2023 10:53:17 +0000 Received: from localhost ([127.0.0.1]:58111 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUmkP-0001sD-7K for submit@debbugs.gnu.org; Wed, 22 Feb 2023 05:53:17 -0500 Received: from mail-wm1-f53.google.com ([209.85.128.53]:36857) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUmkN-0001rz-2M for 61701@debbugs.gnu.org; Wed, 22 Feb 2023 05:53:15 -0500 Received: by mail-wm1-f53.google.com with SMTP id l2-20020a05600c1d0200b003e1f6dff952so5870572wms.1 for <61701@debbugs.gnu.org>; Wed, 22 Feb 2023 02:53:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1677063189; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:from:to:cc:subject:date:message-id :reply-to; bh=vJk8FE+jvLwcAgq1J9sI7tEPIx7FX8zWJpbfGO+WpHM=; b=D8U6HgGYy2lJWLA3iYAPymc3jK1815TjZ/2TFMDONQcqFC/fFK/udSq2SYpOuy5KIe Z0UbhlYs+q2qCao3cOuoCPwa84Ts1urr6rsy8IzdWkAHnAMNq/ruL+ejVPXZXxdkXXSu xQsoiQXIi+edWskRhM0giyrBlwTOuXWHhmyh1KENYxaaS3rVk/y1/Wkcq231ZGn1Kxzw uugDeQU1ImGHGp5hsWQsAzV+jCW0O/42iCp9GeZUhehsR5oI6EQFmbY4hP2EupOqwDs4 ukG1vKiL758JcVpqm4PKDZEQZluJ490Q+OQtmkUUUqNxMQVVsehI+0r87VDUXsoXoDs2 IREQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677063189; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vJk8FE+jvLwcAgq1J9sI7tEPIx7FX8zWJpbfGO+WpHM=; b=wl7eftAVd5YKG7u1MgWgxpKdufep6BFYYUv0xA4VZB5owSvNp1m/et+Ou5N/PC8xqF WJoHCsrBJR0zBc2BDnKUUTPuZCp+lRaxHGyhmvh1nK3GuFB4a9RXFHVzbEp/VNvz56MM WaIxzyAiokVKC7zmbIX1GPkwe0LNQqNDp1U90+g6PzLb5gG03a3uYt6Rk7210NMHrzQH zkQzmLUTgtvmTJ8omtyMo06eznGC0FCXUkaVBSnZnyYAGKSM59hr37IxFqCKLjHB5UGA irzavNcBLTUW5ZXu09/NlUEAwpqmm5AW6ofFLBWkVqa6PYQLfF2LdPqsaSw5jCDNPpIk j/sA== X-Gm-Message-State: AO0yUKX8G5wAX0qHcHwzaOX0y59cn7JGvyfOd62WuL+UxQ6ogyfztp0C 2x8SatVCIxGjUuPSi8z0pio= X-Google-Smtp-Source: AK7set+ECNNv4zNr+NgRzNHduZPFtYBglQ70ivYLRkPYrZ7uQIeLoukt3RQh+XUblefHEyNUb5IdEg== X-Received: by 2002:a05:600c:1d1a:b0:3e0:b1:c12d with SMTP id l26-20020a05600c1d1a00b003e000b1c12dmr7415799wms.1.1677063188609; Wed, 22 Feb 2023 02:53:08 -0800 (PST) Received: from lili ([2a01:e0a:59b:9120:65d2:2476:f637:db1e]) by smtp.gmail.com with ESMTPSA id k16-20020a7bc410000000b003e21f959453sm2155612wmi.32.2023.02.22.02.53.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Feb 2023 02:53:08 -0800 (PST) From: Simon Tournier To: kyle , 61701@debbugs.gnu.org Subject: Re: [bug#61701] [PATCH] doc: Propose new cookbook section for reproducible research. In-Reply-To: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> References: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> Date: Wed, 22 Feb 2023 11:52:43 +0100 Message-ID: <86h6vet1j8.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 61701 Cc: Kyle Andrews X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi, Cool! Nice! My suggestions could be dropped, I mean they are just suggestions. :-) On Wed, 22 Feb 2023 at 05:17, kyle wrote: > +Writing a manifest for packaging R code alone requires only minimal > +knowledge of the Guix infrastructure. This stub should work for most > +cases involving the R packages already in Guix. > + > +@example > +(use-modules > + (gnu packages cran) > + (gnu packages statistics)) > + > +(packages->manifest > + (list r r-tidyverse)) Missing @end example, no? > +R packages are defined predominantly inside of gnu/packages/cran.scm and > +gnu/packages/statistics.scm files under a guix source repository. When presenting Guix, usually I start with: guix shell r r-tidyverse then guix shell r r-tidyverse --export-manifest --8<---------------cut here---------------start------------->8--- ;; What follows is a "manifest" equivalent to the command line you gave. ;; You can store it in a file that you may then pass to any 'guix' command ;; that accepts a '--manifest' (or '-m') option. (specifications->manifest (list "r" "r-tidyverse")) --8<---------------cut here---------------end--------------->8--- which demystifies the =E2=80=9Cmanifest=E2=80=9D. Then, I go via: guix show r to point the location and explains why (gnu packages statistics). So then, people connect the dots between the command line invocation and the manifest: --8<---------------cut here---------------start------------->8--- (use-modules (gnu packages cran) (gnu packages statistics)) (packages->manifest (list r r-tidyverse)) --8<---------------cut here---------------end--------------->8--- Based on that, I introduce modules and why (guix licenses) for examples. > +This manifest can be run with the basic guix shell command: > + > +@example > +guix shell --manifest=3Dmanifest.scm --container > +@end example Do you need =E2=80=99container=E2=80=99? If yes, I should set the scenario= before: We want to run X and Y inside a container, because we want to be sure that we described all we need to run the analysis. Well, something like that. > +Please remember at the end to pin your channels so that others in the > +future know how to recover your exact Guix environment. > + > +@example > +guix describe --format=3Dchannels > channels.scm > +@end example > + > +This can be done with Guix time machine: > + > +@example > +guix time-machine --channels=3Dchannels.scm \ > + -- guix shell --manifest=3Dmanifest.scm --container > +@end example No, the correct is: guix time-machine --channels=3Dchannels.scm \ -- shell --manifest=3Dmanifest.scm --container without the extra =E2=80=99guix=E2=80=99. > +In contrast, the python scientific ecosystem is far less > +standardized. There is no effort made to integrate all python packages > +together. While there is a latest python version, it is less often less > +dominantly used for various reasons such as the fact that python tends > +to be employed with much larger teams than R is. This makes packaging up > +reproducible python environments much more difficult. Adding R together > +with python as a mixture complicates things still further. However, we > +have to be mindful of the goals of reproducible research. > + > +If reproducibility becomes an end in itself and not a catlyst towards > +faster discovery, then Guix will be a non-starter for scientists. Their > +goal is to develop useful understanding about particular aspects of the > +world. Cool paragraph! > +Thankfully, three common scenarios cover the vast majority of > +needs. These are: > + > +@itemize > +@item > +combining standard package definitions with custom package definitions > +@item > +combining package definitions from the current revision with other revis= ions > +@item > +combining package variants which need a modified build-system > +@end itemize > + > +In the rest of the tutorial we develop a manifest which tackles all > +three of these common issues. The hope is that if you see the hardest > +possible common situation as being readily solvable without writing > +thousands of lines of code, researchers will clearly see it as worth the > +effort which will not pose a significant detour from the main line of > +their research. > + > +@example > +(use-modules > + (guix packages) > + (guix download) > + (guix licenses) > + (guix profiles) Before jumping to that, I would add a paragraph after the first manifest explaining that other modules can be used, for instance the module (guix licenses) provides all the licenses known by Guix. Well, something like that. > + (gnu packages) > + (gnu packages cran) > + (guix inferior) > + (guix channels) > + (guix build-system python)) > + > +;; guix import pypi APTED I would add a sentence before this manifest point to the documentation of =E2=80=9Cguix import=E2=80=9D and explaining with one sentence that it a= llows to extract information from PyPI and generates a recipe for Guix. > +(define python-apted > + (package > + (name "python-apted") > + (version "1.0.3") > + (source (origin > + (method url-fetch) > + (uri (pypi-uri "apted" version)) > + (sha256 > + (base32 > + "1sawf6s5c64fgnliwy5w5yxliq2fc215m6alisl7yiflwa0m3ymy")))) > + (build-system python-build-system) > + (home-page "https://github.com/JoaoFelipe/apted") > + (synopsis "APTED algorithm for the Tree Edit Distance") > + (description "APTED algorithm for the Tree Edit Distance") > + (license expat))) > + > +(define last-guix-with-python-3.6 > + (list > + (channel > + (name 'guix) > + (url "https://git.savannah.gnu.org/git/guix.git") > + (commit > + "d66146073def03d1a3d61607bc6b77997284904b")))) > + > +(define connection-to-last-guix-with-python-3.6 > + (inferior-for-channels last-guix-with-python-3.6)) Why do you need an inferior? Is it to avoid the =E2=80=9Cguix time-machine= =E2=80=9D? Ah, no the answer below. :-) > +(define first car) > + > +(define python-3.6 > + (first > + (lookup-inferior-packages > + connection-to-last-guix-with-python-3.6 "python"))) > + > +(define python3.6-numpy > + (first > + (lookup-inferior-packages > + connection-to-last-guix-with-python-3.6 "python-numpy"))) > + > +(define included-packages > + (list r r-reticulate)) > +=20 > +(define inferior-packages > + (list python-3.6 python3.6-numpy)) > + > +(define package-with-python-3.6 > + (package-with-explicit-python python-3.6 > + "python-" "python3.6-" 'python3-variant)) > +=20 > +(define custom-variant-packages > + (list (package-with-python-3.6 python-apted))) > + > +(concatenate-manifest > + (map packages->manifest > + (list > + included-packages > + inferior-packages > + custom-variant-packages))) While this is cool, I would not recommend it as some practise. This kind of mix can lead to various annoyances, IMHO. First, it will scale poorly if you add more inferiors. Second, the probability that the resulting computational environment works well decreases. Anyway, the example is cool! :-) > +@end example > + > +This should produce a profile with the latest R and an older python > +3.6. These should be able to interoperate with code like: > + > +@example > +library(reticulate) > +use_python("python") > +apted =3D import("apted") > +t1 =3D '{a{b}{c}}' > +t2 =3D '{a{b{d}}}' > +metric =3D apted$APTED(t1, t2) > +distance =3D metric$compute_edit_distance() > +@end example This example is cool! > diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm > index c8f04b2298..d4aaab906d 100644 > --- a/guix/build-system/python.scm > +++ b/guix/build-system/python.scm > @@ -36,6 +36,7 @@ (define-module (guix build-system python) > #:use-module (srfi srfi-1) > #:use-module (srfi srfi-26) > #:export (%python-build-system-modules > + package-with-explicit-python > package-with-python2 > strip-python2-variant > default-python Maybe this could be a separated patch. Cheers, simon From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 22 18:29:46 2023 Received: (at 61701) by debbugs.gnu.org; 22 Feb 2023 23:29:46 +0000 Received: from localhost ([127.0.0.1]:60659 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUyYU-0002ED-66 for submit@debbugs.gnu.org; Wed, 22 Feb 2023 18:29:46 -0500 Received: from mout02.posteo.de ([185.67.36.66]:58897) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pUyYQ-0002Dx-3N for 61701@debbugs.gnu.org; Wed, 22 Feb 2023 18:29:45 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id AF72F2405EC for <61701@debbugs.gnu.org>; Thu, 23 Feb 2023 00:29:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1677108575; bh=oPX0RbyxQuk9ZYjrDpvfEPJgk5DF/fNfdzSEA/m7248=; h=From:To:Cc:Subject:Date:From; b=MgNdXe0G5jd368qwERCDonAH0vBtRgI8FXLiwtvMRQ58bEiZug50gGfzsMeqoQ3lf 2pQXjik6F/8wbCcP84WBCPbZAOW8bLtwvTeXbC8G4zRaQ2Mnvca3kGQF9yF9wVKWmy Y9mUQYTXuaXk8/PlUTHKWbUwNxlm2ZGPCF17Z/9fAyrezKV2XHVPIJXcqVp1qDDB4j ZuRH3egjtJh+hPCfv1rRT8n6YpqYtyulWmSmMbm9jnsbZNAeIuNGCbnLe/di00nJmz VKclpjmWr/ZE6ZJSDoicWZ66glw9C6vy+2Y9WxfqrPncgQocafTTMNmz9pKHSY/WMx P+oklgwXSwfXQ== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4PMXRv6qsJz6tmB; Thu, 23 Feb 2023 00:29:30 +0100 (CET) References: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> <86h6vet1j8.fsf@gmail.com> From: Kyle Andrews To: Simon Tournier Subject: Re: [bug#61701] [PATCH] doc: Propose new cookbook section for reproducible research. Date: Wed, 22 Feb 2023 23:21:02 +0000 In-reply-to: <86h6vet1j8.fsf@gmail.com> Message-ID: <87a615wa7b.fsf@posteo.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 61701 Cc: 61701@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Simon Tournier writes: >> +(define python-apted >> + (package >> + (name "python-apted") >> + (version "1.0.3") >> + (source (origin >> + (method url-fetch) >> + (uri (pypi-uri "apted" version)) >> + (sha256 >> + (base32 >> + "1sawf6s5c64fgnliwy5w5yxliq2fc215m6alisl7yiflwa0m3ymy")))) >> + (build-system python-build-system) >> + (home-page "https://github.com/JoaoFelipe/apted") >> + (synopsis "APTED algorithm for the Tree Edit Distance") >> + (description "APTED algorithm for the Tree Edit Distance") >> + (license expat))) >> + >> +(define last-guix-with-python-3.6 >> + (list >> + (channel >> + (name 'guix) >> + (url "https://git.savannah.gnu.org/git/guix.git") >> + (commit >> + "d66146073def03d1a3d61607bc6b77997284904b")))) >> + >> +(define connection-to-last-guix-with-python-3.6 >> + (inferior-for-channels last-guix-with-python-3.6)) > > Why do you need an inferior? Is it to avoid the =E2=80=9Cguix time-machi= ne=E2=80=9D? > Ah, no the answer below. :-) > >> +(define first car) >> + >> +(define python-3.6 >> + (first >> + (lookup-inferior-packages >> + connection-to-last-guix-with-python-3.6 "python"))) >> + >> +(define python3.6-numpy >> + (first >> + (lookup-inferior-packages >> + connection-to-last-guix-with-python-3.6 "python-numpy"))) >> + >> +(define included-packages >> + (list r r-reticulate)) >> +=20 >> +(define inferior-packages >> + (list python-3.6 python3.6-numpy)) >> + >> +(define package-with-python-3.6 >> + (package-with-explicit-python python-3.6 >> + "python-" "python3.6-" 'python3-variant)) >> +=20 >> +(define custom-variant-packages >> + (list (package-with-python-3.6 python-apted))) >> + >> +(concatenate-manifest >> + (map packages->manifest >> + (list >> + included-packages >> + inferior-packages >> + custom-variant-packages))) > > While this is cool, I would not recommend it as some practise. This > kind of mix can lead to various annoyances, IMHO. First, it will scale > poorly if you add more inferiors. Second, the probability that the > resulting computational environment works well decreases. After experiencing the resulting compile time, I agree. I just don't know the best way to get a working python variant. I experimented today with: ``` (use-modules (guix profiles) (guix packages) (gnu packages) (ice-9 regex) (gnu packages python) (guix base32)) (define (origin-nix-hash source) (bytevector->nix-base32-string (content-hash-value (origin-hash source)))) (define-public (change-source source new-uri new-hash new-patches) (origin (inherit source) (uri new-uri) (sha256 (base32 new-hash)) (patches new-patches))) (define (python-distribution-uri version) (string-append "https://www.python.org/ftp/python/" version "/Python-" version ".tar.xz")) (define-public python-3.6.8 (define v "3.6.8") (package (inherit python-3) (version v) (source (change-source (package-source python-3.9) (python-distribution-uri v) "14qi6n5gpcjnwy165wi9hkfcmbadc95ny6bxxldknxwmx50n4i1m" (filter=20 (lambda (patch) (not (string-match "fix-tests|hurd" patch))) (origin-patches (package-source python-3.9))))))) (packages->manifest (list python-3.6.8)) ``` However, I ran into issues applying patches which I don't yet understand how to deal with. It would be really cool if Guix had a command which showed the state at each step in the process of creating a store object. Whatever the workflow and tacit knowledge you use to debug these things, I don't grasp it yet. >> diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm >> index c8f04b2298..d4aaab906d 100644 >> --- a/guix/build-system/python.scm >> +++ b/guix/build-system/python.scm >> @@ -36,6 +36,7 @@ (define-module (guix build-system python) >> #:use-module (srfi srfi-1) >> #:use-module (srfi srfi-26) >> #:export (%python-build-system-modules >> + package-with-explicit-python >> package-with-python2 >> strip-python2-variant >> default-python > > Maybe this could be a separated patch. That's a good idea. I suppose I could wrap it a bit with e.g. package-with-python3-variant. From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 28 09:44:04 2023 Received: (at 61701) by debbugs.gnu.org; 28 Feb 2023 14:44:04 +0000 Received: from localhost ([127.0.0.1]:50034 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pX1D1-0001cn-Mt for submit@debbugs.gnu.org; Tue, 28 Feb 2023 09:44:04 -0500 Received: from mail-wr1-f49.google.com ([209.85.221.49]:39855) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pX1Ct-0001bM-0P for 61701@debbugs.gnu.org; Tue, 28 Feb 2023 09:43:55 -0500 Received: by mail-wr1-f49.google.com with SMTP id g3so1136218wri.6 for <61701@debbugs.gnu.org>; Tue, 28 Feb 2023 06:43:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1677595429; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:from:to:cc:subject:date:message-id :reply-to; bh=+VvxhF9QZ+02ZSrF3SQE/NPV9K+E+k0NUVoFPX5c1po=; b=lr+EaW2RwzSOidf2TYdl65mTPPoYLP5oa8s64MI2SVHDhSFSpIKMmvDplbK8lwS2pQ QB+mBsNJLRCH54V/cqXI+4QbUiOWXJT/PUsTh0vgarKv0bWKJtGFMEsH2Dl5aqMlM7qu Y84DvDtExm3UayBU4YdGRgxh1pzVqKsUuYpeQNbPswB4vWoLQgUc2Hw4pZh6C6utSyog w3O+L5ZXJV/KBfEe+BRE+bmC5Y5hypfOPrYpQpQEwe4+WHDdCNYQpu4LSuFlE4sfHQ9T Y8ssg15bkbzWHnTdkX07qsks0/DGa/5c4mE9scBW6XyHj0MvrvSfeDBTVk7ALBsDgJr9 0N9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677595429; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+VvxhF9QZ+02ZSrF3SQE/NPV9K+E+k0NUVoFPX5c1po=; b=rm49hGJoMLQKGKGvIKwQrVlV3JPDYp+D22JkNcGdGWc13ocl7/wSRoD6LY2G2PYHUD mukM/iSR3xbgz+BSAeQPzbdzLq/VbGXSV7flDH6OPwCwNLQBdw2ZNph7tcd1jQgp5c9b XZQQVN5T+LYC0SGwrq0PTfk2zHkBYv03tsLAt5143IYKerfVSEyAd+FlrcZZxnCM6f9A P+nEgGAA2akiGYD2rUtFW8weqXN/jwXlX2d0n+uwcXwkR6YV7TyZcv/L4qLnEPEz7H6p CCKBk3b1Pfqe6PuJGmTqt8eoJlnN/1b4SKCH3Sq5Vyp4IbeVIqLOraDVBJ0kpFdTCc4S QAWQ== X-Gm-Message-State: AO0yUKVjofDGi1CiPMPihk3qVGgfM2Bk/q2bK+Z9NIntuvu9LfjEBAoz si42R/L05W5lu/Q1UhYfFrDTuLvu4TY= X-Google-Smtp-Source: AK7set/8BNG5k8/eLvOjK/87cnudZ49w1rOswjYMAp5K+QG8YZc08+HIbnpx9nuzN7ro2zonK2sdJQ== X-Received: by 2002:a05:6000:104d:b0:2c9:d574:3c55 with SMTP id c13-20020a056000104d00b002c9d5743c55mr1572194wrx.5.1677595429331; Tue, 28 Feb 2023 06:43:49 -0800 (PST) Received: from pfiuh07 ([193.48.40.241]) by smtp.gmail.com with ESMTPSA id v16-20020a5d4a50000000b002c5526234d2sm10139606wrs.8.2023.02.28.06.43.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 06:43:49 -0800 (PST) From: Simon Tournier To: Kyle Andrews Subject: Re: [bug#61701] [PATCH] doc: Propose new cookbook section for reproducible research. In-Reply-To: <87a615wa7b.fsf@posteo.net> References: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> <86h6vet1j8.fsf@gmail.com> <87a615wa7b.fsf@posteo.net> Date: Tue, 28 Feb 2023 15:16:16 +0100 Message-ID: <87k001j2of.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 61701 Cc: 61701@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi, On mer., 22 f=C3=A9vr. 2023 at 23:21, Kyle Andrews wrote: > However, I ran into issues applying patches which I don't yet understand > how to deal with. It would be really cool if Guix had a command which > showed the state at each step in the process of creating a store > object. Whatever the workflow and tacit knowledge you use to debug these > things, I don't grasp it yet. Well, it appears to me expected that patches from 3.9 does not apply =E2=80= =99as is=E2=80=99 to 3.6; or even the recipe itself. For instance, commit a1454169e0 introduces Python 3.7.0 and the last Python 3.6 series was 3.6.5. The change reads, --8<---------------cut here---------------start------------->8--- - `(modify-phases ,phases - (add-after 'unpack 'patch-timestamp-for-pyc-files [...] 40 lines - ;; FIXME: Without this phase we have close to 2000 files that + `(modify-phases ,phases + ;; Unset SOURCE_DATE_EPOCH while running the test-suite and set = it + ;; again afterwards. See . + (add-before 'check 'unset-SOURCE_DATE_EPOCH + (lambda _ (unsetenv "SOURCE_DATE_EPOCH") #t)) + (add-after 'check 'reset-SOURCE_DATE_EPOCH + (lambda _ (setenv "SOURCE_DATE_EPOCH" "1") #t)) + ;; FIXME: Without this phase we have close to 400 files that ;; differ across different builds of this package. With this p= hase - ;; there are about 500 files left that differ. + ;; there are 44 files left that differ. --8<---------------cut here---------------end--------------->8--- Then 3.8.0 with commit af6a9fc276 requires these patches, --8<---------------cut here---------------start------------->8--- + (patches (search-patches + "python-3.8-search-paths.patch" + "python-3-fix-tests.patch" + "python-3.8-fix-tests.patch" + "python-3-deterministic-build-info.patch")) --8<---------------cut here---------------end--------------->8--- and so on. I understand the issue, on one hand inferior is appealing but expensive if you have many and on the other hand, a simple switch of origins does not work out of the box. That=E2=80=99s why we have the guix-past channel [1]. :-) It maintains older versions of some packages with the current Guix. I think it is the place to define the matrix of Python versions; at least the ones you want. Well, if your aim is to have the matrix of Python versions all working with Guix, you cannot cut the boring task to define all the entries of this matrix =E2=80=93 package transformation has some limitation= s. :-) You could start by extracting the recipe of Python 3.6.5 from commit d66146073d (father of a1454169e0 updating to 3.7) and add it to the guix-past channel. Well, we seem far from a =E2=80=9Ccookbook section for reproducible researc= h.=E2=80=9D :-) 1: Cheers, simon From debbugs-submit-bounces@debbugs.gnu.org Thu Mar 02 13:30:55 2023 Received: (at 61701) by debbugs.gnu.org; 2 Mar 2023 18:30:55 +0000 Received: from localhost ([127.0.0.1]:58368 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pXnhe-0003J8-Ow for submit@debbugs.gnu.org; Thu, 02 Mar 2023 13:30:55 -0500 Received: from eggs.gnu.org ([209.51.188.92]:45010) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pXnhb-0002yh-Cw for 61701@debbugs.gnu.org; Thu, 02 Mar 2023 13:30:53 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXnhV-0007NT-KT; Thu, 02 Mar 2023 13:30:45 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:In-Reply-To:Date:References:Subject:To: From; bh=EiTcdzw1yM6HapnvbiOe1NZmQswr+plAmOmjWo0sdfc=; b=CxIThfzaZrzZZ8o5EKzV ceT6wix/+nklKkh+RTye1fgUDsHMhsuKXC9JXlRRwzLpiD4kW1x4G2bxAZBCcRFsFN56tChyeYxhJ RuzoLU0VI/sSjEp5uuMlFDNQPD6+yhQEdWwySVKfnuavA0N4to6sweV3s+9x25Yq4dftEJLZJ2hLx bhj1/BUCIOepoVOupk3a5h/5Q8Fe9Ni+ZhI202/LjEUuo5yhY3sMhwFnEtdB7Kkqgc60KiX5I7cnA V7qt5iDJtqv7Wb9Zeu2bKHvc0lzTmeVl/u/s0v8UtfERsj46+XgiJ/nsANZp/s8KLEYQOnbrHhky/ h8j3rf2x4aoxsg==; Received: from 91-160-117-201.subs.proxad.net ([91.160.117.201] helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXnhU-0007Jh-Ar; Thu, 02 Mar 2023 13:30:45 -0500 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: kyle Subject: Re: bug#61701: [PATCH] doc: Propose new cookbook section for reproducible research. References: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> Date: Thu, 02 Mar 2023 19:30:41 +0100 In-Reply-To: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> (kyle@posteo.net's message of "Wed, 22 Feb 2023 05:17:29 +0000") Message-ID: <878rgf3t0u.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 61701 Cc: 61701@debbugs.gnu.org, Simon Tournier X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi Kyle, kyle skribis: > From: Kyle Andrews > > The intent was to cover the most common cases where R and python using > researchers could rapidly achieve the benefits of reproducibility. That=E2=80=99s a great idea! Overall it looks nice to me. I would suggest reducing the scope a little bit by taking inferiors and the Python 3.6 bit out=E2=80=94these thi= ngs could be discussed in a separate section. Inline comments follow: > +@node Reproducible Research in Practice > +@section Common scientific software environments I=E2=80=99d use the same title for both. > +Many researchers write applied scientific software supported by a Maybe s/researchers/scientists/ to be more inclusive (that would include research software engineers, for instance; I=E2=80=99m one of them, hence t= hat comment. ;-)) > +mixture of more generic tools developed by teams written within the R > +and Python ecosystems and supporting shell utilities. Even researchers s/written within =E2=80=A6 utilities./written in R, Python, and shell./ > +who predominantly stick to using just R or just python often have to use > +both R and python at the same time when collaborating with others. This Make sure to always capitalize =E2=80=9CPython=E2=80=9D (and similarly for = other proper names). > +@example > +(use-modules > + (gnu packages cran) > + (gnu packages statistics)) > + > +(packages->manifest > + (list r r-tidyverse)) > + There=E2=80=99s a missing @end here. For Scheme code, please use @lisp =E2=80=A6 @end lisp instead. That enable syntax highlighting. > +R packages are defined predominantly inside of gnu/packages/cran.scm and > +gnu/packages/statistics.scm files under a guix source repository. Please use @file for file names=E2=80=A6 > +This manifest can be run with the basic guix shell command: =E2=80=A6 and @command{guix shell} here. > +@example > +guix shell --manifest=3Dmanifest.scm --container > +@end example > + > +Please remember at the end to pin your channels so that others in the > +future know how to recover your exact Guix environment. > + > +@example > +guix describe --format=3Dchannels > channels.scm > +@end example > + > +This can be done with Guix time machine: > + > +@example > +guix time-machine --channels=3Dchannels.scm \ > + -- guix shell --manifest=3Dmanifest.scm --container > +@end example Remove =E2=80=98guix=E2=80=99 after the double dash. Here I=E2=80=99d recommend including cross-references to the relevant secti= ons of the manual: =E2=80=9CWriting Manifests=E2=80=9D and =E2=80=9CReplicating= Guix=E2=80=9D. > +If reproducibility becomes an end in itself and not a catlyst towards > +faster discovery, then Guix will be a non-starter for scientists. Their > +goal is to develop useful understanding about particular aspects of the > +world. I don=E2=80=99t fully understand this paragraph. I tend to think that=20 > +Thankfully, three common scenarios cover the vast majority of > +needs. These are: > > +@itemize > +@item > +combining standard package definitions with custom package definitions > +@item > +combining package definitions from the current revision with other revis= ions > +@item > +combining package variants which need a modified build-system > +@end itemize Like Simon, I=E2=80=99d suggest leaving out the second part (inferiors), an= d also avoiding the Python=C2=A03.6 example, both of which make things immediately more complicated. We can keep the rest of the example though, if possible. WDYT? Thanks for your work! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 14 12:24:54 2023 Received: (at 61701) by debbugs.gnu.org; 14 Sep 2023 16:24:54 +0000 Received: from localhost ([127.0.0.1]:40968 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qgp9C-00081K-6L for submit@debbugs.gnu.org; Thu, 14 Sep 2023 12:24:54 -0400 Received: from mail3-relais-sop.national.inria.fr ([192.134.164.104]:41826) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qgp99-000812-PA for 61701@debbugs.gnu.org; Thu, 14 Sep 2023 12:24:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:cc:subject:references:date:in-reply-to: message-id:mime-version:content-transfer-encoding; bh=bqvuumbxuWMjbXcodAwBA0Toh69LxoyHDpJ14wI90wY=; b=P82LwoWej6Vjhrz9Desee2Stni3d7QxQ4I4VzgHE8U2F2pqdF/5ZMrrF O6r0geYa/323TbRpeJ8rAYNhsOoGp+E89NAqXOLKICgIBxs3q6pQaXQZE t541YYOMakRu6pcdNdDdMuxm3gJZbBr2tX09k4sy1AI06OfdFo5nIpkp2 8=; Authentication-Results: mail3-relais-sop.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=ludovic.courtes@inria.fr; dmarc=fail (p=none dis=none) d=inria.fr X-IronPort-AV: E=Sophos;i="6.02,146,1688421600"; d="scan'208";a="65989413" Received: from 91-160-117-201.subs.proxad.net (HELO ribbon) ([91.160.117.201]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Sep 2023 18:24:40 +0200 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: kyle Subject: Re: bug#61701: [PATCH] doc: Propose new cookbook section for reproducible research. References: <3ffea5b37541a6f3409299f3e8e6200bc1c9aef6.1677043049.git.kyle@posteo.net> <878rgf3t0u.fsf@gnu.org> Date: Thu, 14 Sep 2023 18:24:38 +0200 In-Reply-To: <878rgf3t0u.fsf@gnu.org> ("Ludovic =?utf-8?Q?Court=C3=A8s=22'?= =?utf-8?Q?s?= message of "Thu, 02 Mar 2023 19:30:41 +0100") Message-ID: <875y4c90zd.fsf_-_@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 61701 Cc: 61701@debbugs.gnu.org, Simon Tournier X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello kyle, I haven=E2=80=99t heard from you since your submission at , but I=E2=80=99d like to propose someth= ing different: turning into a section of the Cookbook. I think it=E2=80=99s quite generic and mat= ches the most common use case in research. If that sounds reasonable to you, I=E2=80=99ll work on converting it to Tex= info. Ludo=E2=80=99.