08 Feb 2026
Planet Debian
Colin Watson: Free software activity in January 2026

About 80% of my Debian contributions this month were sponsored by Freexian, as well as one direct donation via GitHub Sponsors (thanks!). If you appreciate this sort of work and are at a company that uses Debian, have a look to see whether you can pay for any of Freexian's services; as well as the direct benefits, that revenue stream helps to keep Debian development sustainable for me and several other lovely people.
You can also support my work directly via Liberapay or GitHub Sponsors.
Python packaging
New upstream versions:
- django-macaddress (fixing use of
pkg_resources) - fsspec (fixing a build failure with Python 3.14)
- ipyparallel
- pycodestyle
- pyflakes (fixing a build failure with Python 3.14)
- pyroma
- pytest-golden (fixing a regression that broke markdown-callouts, which I reported upstream)
- pytest-runner
- python-auditwheel
- python-b2sdk (fixing a build failure with Python 3.14)
- python-certifi
- python-django-imagekit (fixing a build failure with Python 3.14)
- python-flake8 (fixing a build failure with a new pyflakes version)
- python-ibm-cloud-sdk-core (contributed supporting fix upstream)
- python-openapi-core (fixing a build failure with Python 3.14)
- python-pdoc (fixing a build failure with Python 3.14)
- python-pyfunceble
- python-pytest-run-parallel
- python-pytokens
- python-weblogo (fixing use of
pkg_resources) - python-wheezy.template
- smart-open
- sphinx-togglebutton
- sqlobject
- supervisor (fixing use of
pkg_resources) - vcr.py (fixing a build failure with Python 3.14)
- zope.interface (including a fix for a Python 3.14 failure in python-klein, which I contributed upstream)
- zope.testrunner (fixing a build failure with Python 3.14)
Fixes for Python 3.14:
- pdfposter (contributed upstream)
- pexpect
- poetry
- pyhamcrest
- pylint-gitlab
- python-astor
- python-easydev (contributed upstream)
- python-forbiddenfruit
- python-ibm-cloud-sdk-core
- python-iniparse
- python-libusb1
- python-marshmallow-dataclass (contributed upstream)
- python-marshmallow (NMU)
- python-opentracing
- python-opt-einsum-fx
- python-spdx-tools
- python-stopit
- rich (NMU, also requiring an NMU of textual)
- scikit-build-core
- seqdiag
- uncertainties
- yarsync (contributed upstream, along with a supporting fix)
Fixes for pytest 9:
Porting away from the deprecated pkg_resources:
- beaker
- coreapi
- cppy (no-change rebuild to remove a spurious dependency)
- depthcharge-tools (contributed upstream)
- errbot
- gajim-antispam (removed unused dependency)
- gajim-lengthnotifier (removed unused dependency)
- gajim-openpgp (removed unused dependency)
- gajim-pgp (removed unused dependency)
- gajim-triggers (removed unused dependency)
- grapefruit
- impacket (contributed upstream)
- jupyter-packaging (no-change rebuild to remove a spurious dependency)
- khal
- pipenv (no-change rebuild to remove a spurious dependency)
- pyroma
- pytest-runner
- pytest-tornado
- python-airr
- python-aptly
- python-docxcompose
- python-hatch-mypyc (no-change rebuild to remove a spurious dependency)
- python-pyfunceble
- python-stopit
- python-ttfautohint-py (removed unused dependency)
- setuptools-scm (no-change rebuild to remove a spurious dependency)
- slimit (removed unused dependency)
- sphinx-togglebutton
- topplot (contributed upstream)
- valinor
Other build/test failures:
- audioop-lts: FTBFS: ValueError: major component is required
- basemap: Tries to access Internet during build
- celery: FTBFS: FAILED t/unit/backends/test_mongodb.py::test_MongoBackend::test_store_result (contributed upstream)
- django-allauth: FTBFS: AttributeError: module 'fido2.features' has no attribute 'webauthn_json_mapping'
- django-tastypie
- m2crypto: FTBFS on armhf: AssertionError: 64 != 32
- magicgui
- pytest-mypy-testing
- python-asttokens
- python-distutils-extra: FTBFS: dpkg-buildpackage: error: debian/rules binary subprocess failed with exit status 2
- python-django-extensions: FTBFS: FAILED tests/templatetags/test_highlighting.py::HighlightTagTests::test_should_highlight_python_syntax_with_name
- python-gmpy2: FTBFS: ModuleNotFoundError: No module named 'gmpy2'
- python-jpype: FTBFS on i386, armhf: test/jpypetest/test_buffer.py:394: TypeError (contributed upstream)
- python-maturin: Upcoming target-lexicon update
- traitlets (contributed upstream)
- unattended-upgrades: FTBFS: F824
global logged_msgsis unused: name is never assigned in scope (NMU)
I investigated several more build failures and suggested removing the packages in question:
Other bugs:
Other bits and pieces
Alejandro Colomar reported that man(1) ignored the MANWIDTH environment variable in some circumstances. I investigated this and fixed it upstream.
I contributed an ubuntu-dev-tools patch to stop recommending sudo.
I added forky support to the images used in Salsa CI pipelines.
I began working on getting a release candidate of groff 1.24.0 into experimental, though haven't finished that yet.
I worked on some lower-priority security updates for OpenSSH.
Code reviews
- netcfg: Support SSIDs with /, write correct wifi to /etc/network/interfaces (merged and uploaded)
- openssh: [INTL:zh] Chinese debconf templates translations (merged)
- pymongo (sponsored upload for Aryan Karamtoth)
- python-streamz (sponsored upload for Aryan Karamtoth)
- smart-open: Please make the build reproducible (fixed in a different way)
- uvloop: FTBFS on riscv64 with Python 3.14 as supported (uploaded)
08 Feb 2026 7:30pm GMT
Dirk Eddelbuettel: chronometre: A new package (pair) demo for R and Python

Both R and Python make it reasonably easy to work with compiled extensions. But how to access objects in one environment from the other and share state or (non-trivial) objects remains trickier. Recently (and while r-forge was 'resting' so we opened GitHub Discussions) a question was asked concerning R and Python object pointer exchange.
This lead to a pretty decent discussion including arrow interchange demos (pretty ideal if dealing with data.frame-alike objects), but once the focus is on more 'library-specific' objects from a given (C or C++, say) library it is less clear what to do, or how involved it may get.
R has external pointers, and these make it feasible to instantiate the same object in Python. To demonstrate, I created a pair of (minimal) packages wrapping a lovely (small) class from the excellent spdlog library by Gabi Melman, and more specifically in an adapted-for-R version (to avoid some R CMD check nags) in my RcppSpdlog package. It is essentially a nicer/fancier C++ version of the tic() and tic() timing scheme. When an object is instantiated, it 'starts the clock' and when we accessing it later it prints the time elapsed in microsecond resolution. In Modern C++ this takes little more than keeping an internal chrono object.
Which makes for a nice, small, yet specific object to pass to Python. So the R side of the package pair instantiates such an object, and accesses its address. For different reasons, sending a 'raw' pointer across does not work so well, but a string with the address printed works fabulously (and is a paradigm used around other packages so we did not invent this). Over on the Python side of the package pair, we then take this string representation and pass it to a little bit of pybind11 code to instantiate a new object. This can of course also expose functionality such as the 'show time elapsed' feature, either formatted or just numerically, of interest here.
And that is all that there is! Now this can be done from R as well thanks to reticulate as the demo() (also shown on the package README.md) shows:
> library(chronometre)
> demo("chronometre", ask=FALSE)
demo(chronometre)
---- ~~~~~~~~~~~
> #!/usr/bin/env r
>
> stopifnot("Demo requires 'reticulate'" = requireNamespace("reticulate", quietly=TRUE))
> stopifnot("Demo requires 'RcppSpdlog'" = requireNamespace("RcppSpdlog", quietly=TRUE))
> stopifnot("Demo requires 'xptr'" = requireNamespace("xptr", quietly=TRUE))
> library(reticulate)
> ## reticulate and Python in general these days really want a venv so we will use one,
> ## the default value is a location used locally; if needed create one
> ## check for existing virtualenv to use, or else set one up
> venvdir <- Sys.getenv("CHRONOMETRE_VENV", "/opt/venv/chronometre")
> if (dir.exists(venvdir)) {
+ > use_virtualenv(venvdir, required = TRUE)
+ > } else {
+ > ## create a virtual environment, but make it temporary
+ > Sys.setenv(RETICULATE_VIRTUALENV_ROOT=tempdir())
+ > virtualenv_create("r-reticulate-env")
+ > virtualenv_install("r-reticulate-env", packages = c("chronometre"))
+ > use_virtualenv("r-reticulate-env", required = TRUE)
+ > }
> sw <- RcppSpdlog::get_stopwatch() # we use a C++ struct as example
> Sys.sleep(0.5) # imagine doing some code here
> print(sw) # stopwatch shows elapsed time
0.501220
> xptr::is_xptr(sw) # this is an external pointer in R
[1] TRUE
> xptr::xptr_address(sw) # get address, format is "0x...."
[1] "0x58adb5918510"
> sw2 <- xptr::new_xptr(xptr::xptr_address(sw)) # cloned (!!) but unclassed
> attr(sw2, "class") <- c("stopwatch", "externalptr") # class it .. and then use it!
> print(sw2) # `xptr` allows us close and use
0.501597
> sw3 <- ch$Stopwatch( xptr::xptr_address(sw) ) # new Python object via string ctor
> print(sw3$elapsed()) # shows output via Python I/O
datetime.timedelta(microseconds=502013)
> cat(sw3$count(), "\n") # shows double
0.502657
> print(sw) # object still works in R
0.502721
> The same object, instantiated in R is used in Python and thereafter again in R. While this object here is minimal in features, the concept of passing a pointer is universal. We could use it for any interesting object that R can access and Python too can instantiate. Obviously, there be dragons as we pass pointers so one may want to ascertain that headers from corresponding compatible versions are used etc but principle is unaffected and should just work.
Both parts of this pair of packages are now at the corresponding repositories: PyPI and CRAN. As I commonly do here on package (change) announcements, I include the (minimal so far) set of high-level changes for the R package.
Changes in version 0.0.2 (2026-02-05)
Removed replaced unconditional virtualenv use in demo given preceding conditional block
Updated README.md with badges and an updated demo
Changes in version 0.0.1 (2026-01-25)
- Initial version and CRAN upload
Questions, suggestions, bug reports, … are welcome at either the (now awoken from the R-Forge slumber) Rcpp mailing list or the newer Rcpp Discussions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub.
08 Feb 2026 5:11pm GMT
Vincent Bernat: Fragments of an adolescent web
I have unearthed a few old articles typed during my adolescence, between 1996 and 1998. Unremarkable at the time, these pages now compose, three decades later, the chronicle of a vanished era.1
The word "blog" does not exist yet. Wikipedia remains to come. Google has not been born. AltaVista reigns over searches, while already struggling to embrace the nascent immensity of the web2. To meet someone, you had to agree in advance and prepare your route on paper maps. 🗺️
The web is taking off. The CSS specification has just emerged, HTML tables still serve for page layout. Cookies and advertising banners are making their appearance. Pages are adorned with music and videos, forcing browsers to arm themselves with plugins. Netscape Navigator sits on 86% of the territory, but Windows 95 now bundles Internet Explorer to quickly catch up. Facing this offensive, Netscape opensource its browser.
France falls behind. Outside universities, Internet access remains expensive and laborious. Minitel still reigns, offering phone directory, train tickets, remote shopping. This was not yet possible with the Internet: buying a CD online was a pipe dream. Encryption suffers from inappropriate regulation: the DES algorithm is capped at 40 bits and cracked in a few seconds.
These pages bear the trace of the web's adolescence. Thirty years have passed. The same battles continue: data selling, advertising, monopolies.
-
Most articles linked here are not translated from French to English. ↩︎
-
I recently noticed that Google no longer fully indexes my blog. For example, it is no longer possible to find the article on lanĉo. I assume this is a consequence of the explosion of AI-generated content or a change in priorities for Google. ↩︎
08 Feb 2026 2:51pm GMT