A new package RcppFarmHash is now on CRAN in an inaugural version 0.0.1.
RcppFarmHash wraps the Google FarmHash family of hash functions (written by Geoff Pike and contributors) that are used for example by Google BigQuery for the FARM_FINGERPRINT.
The package was prepared and uploaded yesterday afternoon, and to my surprise already on CRAN this (early) morning when I got up. So here is another #ThankYouCRAN for very smoothing operations.
The very brief NEWS entry follows:
Changes in version 0.0.1 (2021-07-25)
Initial version and CRAN upload
If you like this or other open-source work I do, you can now sponsor me at GitHub.
The fourteenth release of littler as a CRAN package just landed, following in the now fifteen year history (!!) as a package started by Jeff in 2006, and joined by me a few weeks later.
littler is the first command-line interface for R as it predates Rscript. It allows for piping as well for shebang scripting via #!, uses command-line arguments more consistently and still starts faster. It also always loaded the methods package which Rscript only started to do in recent years.
littler lives on Linux and Unix, has its difficulties on macOS due to yet-another-braindeadedness there (who ever thought case-insensitive filesystems as a default were a good idea?) and simply does not exist on Windows (yet the build system could be extended see RInside for an existence proof, and volunteers are welcome!). See the FAQ vignette on how to add it to your PATH.
A few examples are highlighted at the Github repo, as well as in the examples vignette.
This release brings two new example scripts and command wrappers (compiledDeps.r, silenceTwitterAccount.r), along with extensions, corrections, or polish for a number a of other examples as detailed in the NEWS file entry below.
Changes in littler version 0.3.13 (2021-07-24)
Changes in examples
New script compiledDeps.r to show which dependencies are compiled
New script silenceTwitterAccount.r wrapping rtweet
The -c or --code option for installRSPM.r was corrected
The kitten.r script now passes options bunny and puppy on to the pkgKitten::kitten() call; new options to call the Arma and Eigen variants were added
The getRStudioDesktop.r and getRStudioServer.r scripts were updated for a change in rvest
Two typos in the tt.r help message were correct (Aaron Wolen in #86)
The message in cranIncoming.r was corrected.
Changes in package
Added Continuous Integration runner via run.sh from r-ci.
Two vignettes got two extra vignette attributes.
The mkdocs-material documentation input was moved.
The basic unit tests were slightly refactored and updated.
My CRANberries provides a comparison to the previous release. Full details for the littler release are provided as usual at the ChangeLog page, and now also on the new package docs website. The code is available via the GitHub repo, from tarballs and now of course also from its CRAN page and via install.packages("littler"). Binary packages are available directly in Debian as well as soon via Ubuntu binaries at CRAN thanks to the tireless Michael Rutter.
Comments and suggestions are welcome at the GitHub repo.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
Two weeks ago, I had the pleasure to play with Foremans Kerberos integration and iron out a few long standing kinks.
It all started with a user reminding us that Kerberos authentication is broken when Foreman is deployed on CentOS 8, as there is no more mod_auth_kerb available. Given mod_auth_kerb hasn't seen a release since 2013, this is quite understandable. Thankfully, there is a replacement available, mod_auth_gssapi. Even better, it's available in CentOS 7 and 8 and in Debian and Ubuntu too!
So I quickly whipped up a PR to completely replace mod_auth_kerb with mod_auth_gssapi in our installer and successfully tested that it still works in CentOS 7 (even if upgrading from a mod_auth_kerb installation) and CentOS 8.
Yay, the issue at hand seemed fixed. But just writing a post about that would've been boring, huh?
Well, and then I dared to test the same on Debian
Turns out, our installer was using the wrong path to the Apache configuration and the wrong username Apache runs under while trying to setup Kerberos, so it could not have ever worked. Luckily Ewoud and I were able to fix that too. And yet the installer was still unable to fetch the keytab from my FreeIPA server
Let's dig deeper! To fetch the keytab, the installer does roughly this:
Well, yeah, the principal looks kinda weird (no realm) and the interwebs say for "kinit: Cannot determine realm for host":
Kerberos cannot determine the realm name for the host. (Well, duh, that's what it said?!)
Make sure that there is a default realm name, or that the domain name mappings are set up in the Kerberos configuration file (krb5.conf)
And guess what, all of these are perfectly set by ipa-client-install when joining the realm
But there must be something, right? Looking at the principal in the error, it's missing both the domain of the host and the realm.
I was pretty sure that my DNS and config was right, but what about gethostname(2)?
# hostname
foreman
Bingo! Let's see what happens if we force that to be an FQDN?
# hostname foreman.example.com
# kinit -k
NO ERRORS! NICE!
We're doing science here, right? And I still have the CentOS 8 box I had for the previous round of tests.
What happens if we set that to have a shortname? Nothing. It keeps working fine.
And what about CentOS 7? VMs are cheap. Well, that breaks like on Debian, if we force the hostname to be short. Interesting.
Is it a version difference between the systems?
Debian 10 has krb5 1.17-3+deb10u1
CentOS 7 has krb5 1.15.1-50.el7
CentOS 8 has krb5 1.18.2-8.el8
So, something changed in 1.18?
Looking at the krb5 1.18 changelog the following entry jumps at one:
Expand single-component hostnames in host-based principal names when DNS canonicalization is not used, adding the system's first DNS search path as a suffix.
Given Debian 11 has krb5 1.18.3-5 (well, testing has, so lets pretend bullseye will too), we can retry the experiment there, and it shows that it works with both, short and full hostname.
So yeah, it seems krb5 "does the right thing" since 1.18, and before that gethostname(2)must return an FQDN.
I've documented that for our users and can now sleep a bit better. At least, it wasn't DNS, right?!
Btw, freeipa won't be in bulsseye, which makes me a bit sad, as that means that Foreman won't be able to automatically join FreeIPA realms if deployed on Debian 11.
Via my work on the media-types package,
I wanted to know which packages were using the media type
application/x-xcf,
which apparently is not correct (#991158).
The https://codesearch.debian.net site gives the answer. (Thanks!)
Moreover, one can create a user
key, for command-line remote
access; here is an example below (the file dcs-apikeyHeader-plessy.txt
contains x-dcs-apikey: followed by my access key).
curl -X GET "https://codesearch.debian.net/api/v1/searchperpackage?query=application/x-xcf&match_mode=literal" -H @dcs-apikeyHeader-plessy.txt > result.json
The result is serialised in JSON. Here is how I transformed it to make a
list of email addresses that I could easily paste in mutt.
I feel like I haven t had a lot to say about open source or, in general, tech for a while. From another perspective, I have a whole lot of heady things to say about open source and technology and writing about it seems like a questionable use of time when I have so much other writing and reading and job hunting to do. I will briefly share the two ideas I am obsessed with at the moment, and then try to write more about them later.
The Defensible-Charitable-Beneficent Trichotamy
I will just jokingly ha ha no but seriously maybe jk suggest calling this the de Blanc-West Theory, considering it s heavily based on ideas from Ben West.
Actions fall into one of the following categories:
Defensible: When an action is defensible, it is permissible, acceptable, or okay. We might not like it, but you can explain why you had to do it and we can t really object. This could also be considered the bare minimum.
Charitable: A charitable action is better than a defensible action in that it produces more good, and it goes above and beyond the minimum.
Beneficent: This is a genuinely good action that produces good. It is admirable.
I love J.J. Thomson example of Henry Fonda for this. For a full explanation see section three at this web site. For a summary: imagine that you re sick and the only thing that can cure you is Henry Fonda s cool touch on your fevered brow. It is Defensible for Henry Fonda to do nothing he doesn t owe you anything in particular. It is Charitable for, say if Henry Fonda happened to be in the room, to walk across it and touch your forehead. It is Beneficent for Henry Fonda to re-corporealize back into this life and travel to your bedside to sooth your strange illness. P.S. Henry Fonda died in 1982.
I don t think these ideas are particularly new, but it s important to think about what we re doing with technology and its design: are our decisions defensible, charitable, or beneficent? Which should they be? Why?
The Offsetting Harm-Ameliorating Harm-Doing Good Trichotamy
I ve been doing some research and writing around carbon credits. I owe a lot of thanks to Philip Withnall and Adam Lerner for talking with me through these ideas. Extrapolating from action and policy recommendations, I suggest the following trichotamy:
Offsetting harm is attempting to look at the damage you ve done and try to make up for it in some capacity. In the context of, e.g., air travel, this would be purchasing carbon credits.
Ameliorating harm is about addressing the particular harm you ve done. Instead of carbon credits, you would be supporting carbon capture technologies or perhaps giving to or otherwise supporting groups and ecosystems that are being harmed by your air travel.
Doing Good is Doing Good. This would be like not traveling by air and choosing to still help the harm being caused by carbon emissions.
These ideas are also likely not particularly new, but thinking about technology in this context is also useful, especially as we consider technology in the context of climate change.
I realised this week that my recent efforts to improve how Consfigurator makes
the fork(2) system call have also created a way to install executables to
remote systems which will execute arbitrary Common Lisp code. Distributing
precompiled programs using free software implementations of the Common Lisp
standard tends to be more of a hassle than with a lot of other high level
programming languages. Executables will often be hundreds of megabytes in
size even if your codebase is just a few megabytes, because the whole
interactive Common Lisp environment gets bundled along with your program s
code. Commercial Common Lisp implementations manage to do better, as I
understand it, by knowing how to shake out unused code paths. Consfigurator s
new mechanism uploads only changed source code, which might only be kilobytes
in size, and updates the executable on the remote system. So it should be
useful for deploying Common Lisp-powered web services, and the like.
Here s how it works. When you use Consfigurator you define an ASDF system
analagous to a Python package or Perl distribution called your consfig .
This defines HOST objects to represent the machines that you ll use
Consfigurator to manage, and any custom properties, functions those properties
call, etc.. An ASDF system can depend upon other systems; for example, every
consfig depends upon Consfigurator itself. When you execute Consfigurator
deployments, Consfigurator uploads the source code of any ASDF systems that
have changed since you last deployed this host, starts up Lisp on the remote
machine, and loads up all the systems. Now the remote Lisp image is in a
similarly clean state to when you ve just started up Lisp on your laptop and
loaded up the libraries you re going to use. Only then are the actual
deployment instructions are sent on stdin.
What I ve done this week is insert an extra step for the remote Lisp image in
between loading up all the ASDF systems and reading the deployment from stdin:
the image calls fork(2) and establishes a pipe to communicate with the child
process. The child process can be sent Lisp forms to evaluate, but for each
Lisp form it receives it will actually fork again, and have its child
process evaluate the form. Thus, going into the deployment, the original
remote Lisp image has the capability to have arbitrary Lisp forms evaluated in
a context in which all that has happened is that a statically defined set of
ASDF systems has been loaded the child processes never see the full
deployment instructions sent on stdin. Further, the child process responsible
for actually evaluating the Lisp form received from the first process first
forks off another child process and sets up its own control pipe, such that it
too has the capacbility to have arbitrary Lisp forms evaluated in a cleanly
loaded context, no matter what else it might put in its memory in the
meantime. (Things are set up such that the child processes responsible for
actually evaluating the Lisp forms never see the Lisp forms received for
evaluation by other child processes, either.)
So suppose now we have an ASDF system :com.silentflame.cool-web-service,
and there is a function (start-server PORT) which we should call to start
listening for connections. Then we can make our consfig depend upon that ASDF
system, and do something like this:
CONSFIG> (deploy-these ((:ssh :user "root") :sbcl) server.example.org
;; Set up Apache to proxy requests to our service.
(apache:https-vhost ...)
;; Now apply a property to dump the image.
(image-dumped "/usr/local/bin/cool-web-service"
'(cool-web-service:start-server 1234)))
Consfigurator will: SSH to server.example.org; upload all the ASDF source for
your consfig and its dependencies; compile and load that code into a remote
SBCL process; call fork(2) and set up the control pipe; receive the
applications of APACHE:HTTPS-VHOST and IMAGE-DUMPED shown above from your
laptop, on stdin; apply the APACHE:HTTPS-VHOST property to ensure that Apache
is proxying connections to port 1234; send a request into the control pipe to
have the child process fork again and dump an executable which, when started,
will evaluate the form (cool-web-service:start-server 1234). And that
form will get evaluated in a pristine Lisp image, where the only meaningful
things that have happened is that some ASDF systems have been loaded and a
single fork(2) has taken place. You d probably need to add some other
properties to add some mechanism for actually invoking
/usr/local/bin/cool-web-service and restarting it when the executable is
updated.
(Background: The primary reason why Consfigurator s remote Lisp images need to
call fork(2) is that they need to do things like setuid from root to other
accounts and enter chroots without getting stuck in those contexts.
Previously we forked right before entering such contexts, but that meant that
Consfigurator deployments could never be multithreaded, because it might later
be necessary to fork, and you can t usually do that once you ve got more than
one thread running. So now we fork before doing anything else, so that the
parent can then go multithreaded if desired, but can still execute
subdeployments in contexts like chroots by sending Lisp forms to evaluate in
those contexts into the control pipe.)
I d like to shed some light at the process of Authentication since it s a fundamental building block in creating secure tools that need to communicate with other actors over the network. When tools and/or users interact with one another e.g., through a web browser both ends of the interactions need a way to make sure, they re communicating with the right party. Some bad actor might for example create a web page that looks like your bank s online banking portal.
I'm creating a program that uses the web browser for its user interface, and
I'm reasonably sure I'm not the first person doing this.
Normally such a problem would listen to a port on localhost, and tell the
browser to connect to it. Bonus points for
listening to a randomly allocated free port,
so that one does not need to involve some amount of luck to get the program
started.
However, using a local port still means that any user on the local machine can
connect to it, which is generally a security issue.
A possible solution would be to use AF_UNIX Unix Domain Sockets, which are
supported by various web servers, but as far as I understand not currently by
browsers. I checked Firefox and Chrome,
and they currently seem to fail to even acknowledge the use case.
I'm reasonably sure I'm not the first person doing this, and yes, it's intended
as an understatement.
So, dear Lazyweb, is there a way to securely use a browser as a UI for a
user's program, without exposing access to the backend to other users in the
system?
Access token in the URL
Emanuele Di Giacomo suggests to add an access
token to the URL that gets passed to the browser.
This would work to protect access on localhost: even if the application cannot
use HTTPS, other users cannot see packets that go through the local interface,
so both the access token and the session cookie that one could send afterwards
would be protected.
Network namespaces
I thought about isolating server and browser in a private network namespace
with something like unshare(1), but it seems to require root.
Johannes Schauer Marin Rodrigues wrote to correct that:
It's possible to unshare the network namespace by first unsharing the user
namespace and thus becoming root which is possible without being root since
#898446 got fixed.
For example you can run this as the normal user:
lxc-usernsexec -- lxc-unshare -s NETWORK -- ip addr
If you don't want to depend on lxc, you can write a wrapper in Perl or Python.
I have a Perl implementation of that in mmdebstrap.
Firewalling
Martin Schuster wrote to suggest another option:
I had the same issue. My approach was "weird", but worked:
Block /outgoing/ connections to the port, unless the uid is correct.
That might be counter-intuitive, but of course all connections
/to/ localhost will be done /from/ localhost also.
Something like:
iptables -A OUTPUT -p tcp -d localhost --dport 8123 -m owner --uid-owner joe -j ACCEPTiptables -A OUTPUT -p tcp -d localhost --dport 8123 -j REJECT
If you have been involved in Debian packaging at all in the last few years, you
are probably aware that autopkgtest is now an important piece of the Debian
release process. Back in 2018, the automated testing migration process started
considering autopkgtest test results as part of its decision
making.
Since them, this process has received several improvements. For example, during
the bullseye freeze, non-key packages with a non-trivial
autopkgtest test suite could migrate automatically to testing without their
maintainers needing to open unblock requests, provided there was no regression
in theirs autopkgtest (or those from their reverse dependencies).
Since 2014 when ci.debian.net was first introduced, we have seen an
amazing increase in the number of packages in Debian that can be automatically
tested. We went from around 100 to 15,000 today. This means not only happier
maintainers because their packages get to testing faster, but also improved
quality assurance for Debian as a whole.
However, the growth rate seems to be decreasing. Maybe the low hanging fruit
have all been picked, or maybe we just need to help more people jump in the
automated testing bandwagon.
With that said, we would like to encourage and help more maintainers to add
autopkgtest to their packages. To that effect, I just created the
autopkgtest-help repository on salsa, where we will take
help requests from maintainers working on autopkgtest for their packages.
If you want help, please go ahead and create an issue in there.
To quote the repository README:
Valid requests:
"I want to add autopkgtest to package X. X is a tool that [...] and it works
by [...]. How should I approach testing it?"
It's OK if you have no idea where to start. But at least try to describe your
package, what it does and how it works so we can try to help you.
"I started writing autopkgtest for X, here is my current work in progress
[link]. But I encountered problem Y. How to I move forward?"
If you already have an autopkgtest but is having trouble making it work as
you think it should, you can also ask here.
Invalid requests:
"Please write autopkgtest for my package X for me".
As with anything else in free software, please show appreciation for other
people's time, and do your own research first. If you pose your question with
enough details (see above) and make it interesting, it may be that whoever
answers will write at least a basic structure for you, but as the maintainer
you are still the expert in the package and what tests are relevant.
If you ask your question soon, you might get your answer recorded in video: we
are going to have a DebConf21 talk next month, where we I and
Paul Gevers (elbrus) will answer a few autopkgtest questions in video for
posterity.
Now, if you have experience enabling autopkgtest for you own packages, please
consider watching that repository there to help us help our fellow maintainers.
Bought BEHRINGER U-PHORIA 2-Channel UMC202HD.
My previous Q1002US mixer seemed to have unreliable right channel bus and was getting worried.
MIDAS preamp, simple to use. Connect it to Linux box and it works as a USB audio device with two channel of input. It has two inputs and hence it will probably look like a stereo recording. If I connect my XM8500 it turns out to be on the left channel, for example.
Looking at the waveforms, the noise floor is lower than Q1002US and I love it so far.
Used my hack yesterday to confirm its behavior.
Despite my best efforts, I often end up with a lot of branches in my git
repositories, many of which need cleaning up, but even so, may which don't.
Two git configuration tweaks make the output of git branch much more
useful for me.
Motivational example, default git behaviour:
The default sort order is alphabetical, but that's never useful for the
repositories I work in. The age of the branch is generally more useful.
This particular example isn't that long, but often the number of branches
can fill the screen. git can be configured to use columns for branch
listings, which I think generally improves readability.
git config --global branch.sort authordate
git config --global column.branch auto
Github recently announced Copilot, a machine learning system that makes suggestions for you when you're writing code. It's apparently trained on all public code hosted on Github, which means there's a lot of free software in its training set. Github assert that the output of Copilot belongs to the user, although they admit that it may occasionally produce output that is identical to content from the training set.
Unsurprisingly, this has led to a number of questions along the lines of "If Copilot embeds code that is identical to GPLed training data, is my code now GPLed?". This is extremely understandable, but the underlying issue is actually more general than that. Even code under permissive licenses like BSD requires retention of copyright notices and disclaimers, and failing to include them is just as much a copyright violation as incorporating GPLed code into a work and not abiding by the terms of the GPL is.
But free software licenses only have power to the extent that copyright permits them to. If your code isn't a derived work of GPLed material, you have no obligation to follow the terms of the GPL. Github clearly believe that Copilot's output doesn't count as a derived work as far as US copyright law goes, and as a result the licenses on the training data don't apply to the output. Some people have interpreted this as an attack on free software - Copilot may insert code that's either identical or extremely similar to GPLed code, and claim that there are no license obligations created as a result, effectively allowing the laundering of GPLed code into proprietary software.
I'm completely unqualified to hold a strong opinion on whether Github's legal position is justifiable or not, and right now I'm also not interested in thinking about it too much. What I think is more interesting is what the impact of either position has on free software. Do we benefit more from a future where the output of Copilot (or similar projects) is considered a derived work of the training data, or one where it isn't? Having been involved in a bunch of GPL enforcement activities, it's very easy to think of this as something that weakens the GPL and, as a result, weakens free software. That was my initial reaction, but that's shifted over the past few days.
Let's look at the GNU manifesto, specifically this section:
The fact that the easiest way to copy a program is from one neighbor to another, the fact that a program has both source code and object code which are distinct, and the fact that a program is used rather than read and enjoyed, combine to create a situation in which a person who enforces a copyright is harming society as a whole both materially and spiritually; in which a person should not do so regardless of whether the law enables him to.
The GPL makes use of copyright law to ensure that GPLed work can't be taken from the commons. Anyone who produces a derived work of GPLed code is obliged to provide that work under the same terms. If software weren't copyrightable, the GPL would have no power. But this is the outcome Stallman wanted! The GPL doesn't exist because copyright is good, it exists because software being copyrightable is what enables the concept of proprietary software in the first place.
The powers that the GPL uses to enforce sharing of code are used by the authors of proprietary software to reduce that sharing. They attempt to forbid us from examining their code to determine how it works - they argue that anyone who does so is tainted, unable to contribute similar code to free software projects in case they produce a derived work of the original. Broadly speaking, the further the definition of a derived work reaches, the greater the power of proprietary software authors. If Oracle's argument that APIs are copyrightable had prevailed, it would have been disastrous for free software. If the Apple look and feel suit had established that Microsoft infringed Apple's copyright, we might be living in a future where we had no free software desktop environments.
When we argue for an interpretation of copyright law that enhances the power of the GPL, we're also enhancing the power of giant corporations with a lot of lawyers on hand. So let's look at this another way. If Github's interpretation of copyright law holds, we can train a model on proprietary code and extract concepts without having to worry about being tainted. The proprietary code itself won't enter the commons, but the ideas it embodies will. No more worries about whether you're literally copying the code that implements an algorithm you want to duplicate - simply start typing and let the model remove the risk for you.
There's a reasonable counter argument about equality here. How much GPL-influenced code is going to end up in proprietary projects when compared to the reverse? It's not an easy question to answer, but we should bear in mind that the majority of public repositories on Github aren't under an open source license. Copilot is already claiming to give us access to the concepts embodied in those repositories. Do these provide more value than is given up? I honestly don't know how to measure that. But what I do know is that free software was founded in a belief that software shouldn't be constrained by copyright, and our default stance shouldn't be to argue against the idea that copyright is weaker than we imagined.
(Edit: this post by Julia Reda makes some of the same arguments, but spends some more time focusing on a legal analysis of why having copyright cover the output of Copilot would be a problem)
This is not only the Year of the Ox, but also the year of Debian 11, code-named
bullseye. The release lies ahead, full freeze starts this week.
A good opportunity to take a look at what is new in bullseye.
In this post new programs and new software versions related to
XMPP, also known as Jabber are presented.
XMPP exists since 1999, and has a diverse and active developers community. It is a
universal communication protocol, used for instant messaging, IoT, WebRTC, and social
applications.
You probably will encounter some oxen in this post.
biboumi, XMPP gateway to connect to IRC servers: 8.3 9.0
The biggest change for users is SASL support: A new field in the Configure ad-hoc
command lets you set a password that will be used to authenticate to the nick service,
instead of using the cumbersome NickServ method.
Many more changes are listed in the changelog.
Dino, modern XMPP client: 0.0.git20181129 0.2.0
Dino in Debian 10 was practically a technology preview. In Debian 11 it is already a
fully usable client, supporting OMEMO encryption, file upload, image preview, message
correction and many more features in a clean and beautiful user interface.
ejabberd, the extensible realtime platform: 18.12.1 21.01.
Probably the most important improvement for end-users is
XEP-0215 support to facilitate modern WebRTC-style audio/video calls.
ejabberd also integrates more nicely with systemd (e.g., the watchdog feature if
supported, now). Apart from that, a new configuration validator was introduced, which
brings a more flexible (but mostly backwards-compatible) syntax. Also, error reporting
in case of misconfiguration should be way more helpful, now. As a new authentication
backend, JSON Web Tokens (JWT) can be used. In addition to the XMPP and SIP support,
ejabberd now includes a full-blown MQTT server. A large number of smaller features has
been added, performance was improved in many ways, and several bugs were fixed.
See the long list of changes.
Gajim, a GTK+-based Jabber client: 1.1.2 1.3.1
The new Debian release brings many improvements. Gajim s network code has been
completely rewritten, which leads to faster connections, better recovery from network
loss, and less network related hiccups. Customizing Gajim is now easier than ever.
Thanks to the new settings backend and a completely reworked Preferences window, you
can adapt Gajim to your needs in just a few seconds.
Good for newcomers: account creation is now a lot easier with Gajim s new assistant.
The new Profile window gives you many options to tell people more about yourself. You
can now easily crop your own profile picture before updating it.
Group chats actions have been reorganized. It s now easier to send invitations or
change your nickname for example. Gajim also received support for chat markers, which
enables you to see how far your contact followed the conversation. But this is by far
not everything the new release brings. There are many new and helpful features, such
as pasting images from your clipboard directly into the chat or playing voice messages
directly from the chat window.
Read more about the new Gajim release in Debian 11 here.
Furthermore, three more Gajim plugins are now in Debian: gajim-lengthnotifier,
gajim-openpgp for OX (XEP-0373: OpenPGP for XMPP) and gajim-syntaxhighlight.
NEW Kaidan Simple and user-friendly Jabber/XMPP client 0.7.0
Kaidan is a simple, user-friendly and modern XMPP chat client. The user interface
makes use of Kirigami and QtQuick, while the back-end of Kaidan is entirely written in
C++ using Qt and the Qt-based XMPP library QXmpp. Kaidan runs on mobile and desktop
systems including Linux, Windows, macOS, Android, Plasma Mobile and Ubuntu Touch.
mcabber, small Jabber (XMPP) console client: 1.1.0 1.1.2
A theme for 256 color terminals is now included, the handling of carbon message copies
has been improved, and various minor issues have been fixed.
Poezio, Console-based XMPP client: 0.12.1 0.13.1
This new release brings many improvements, such as Message Archive (XEP-0313) support,
initial support for OMEMO (XEP-0384) through a plugin, HTTP File Upload support,
Consitent Color Generation (XEP-0392), and plenty of internal changes and bug fixes.
Not all changes in 0.13 and 0.13.1 can be listed, see the CHANGELOG
for a more extensive summary.
Profanity, the console based XMPP client: 0.6.0 0.10.0
We can not list all changes which have been done,
but here are some highlights.
Support of OMEMO Encryption (XEP-0384). Consistent Color Generation (XEP-0392),
be aware of the changes in the command to standardize the names of commands. A
clipboard feature has been added. Highlight unread messages with a different
color in /wins. Keyboard switch to select the next window with unread messages
with alt + a. Support for Last Message Correction (XEP-0308), Allow UTF-8
symbols as OMEMO/OTR/PGP indicator char. Add option to open avatars directly
(XEP-0084). Add option to define a theme at startup and some changes to improve
themes. Add possibility to easily open URLs. Add experimental OX (XEP-0373,
XEP-0374) support. Add OMEMO media sharing support, ...
There is also a Profanity light package in Debian now, the
best option for systems with tight limits on resources.
Prosody, the lightweight extensible XMPP server: 0.11.2 0.11.9
Upgrading to the latest stable release of Prosody brings a whole load of
improvements in the stability, usability and performance departments. It especially
improves the performance of websockets, and PEP performance for users with many
contacts. It includes interoperability improvements for a range of clients.
Psi, Qt-based XMPP client: 1.3 1.5
The new version contains important bug fixes.
salutatoi, multi-frontends, multi-purposes communication tool: 0.7.0a4 0.8.0~hg3453
This version is now fully running on Python 3, and has full OMEMO support (one2one,
groups and files). The CLI frontend (jp) has among new commands a "jp file get" one
which is comparable to wget with OMEMO support. A file sharing component is included,
with HTTP Upload and Jingle support. For a list of other improvements, please consult
the changelog.
Note, that the upstream project has been renamed to "Libervia".
NEW sms4you, Personal gateway connecting SMS to XMPP or email 0.0.7
It runs with a GSM device over ModemManager and uses a lightweight
XMPP server or a single email account to handle communication in both directions.
NEW xmppc, XMPP Command Line Client 0.1.0
xmppc is a new command line tool for XMPP. It supports some
basic features of XMPP (request your roster, bookmarks, OMEMO Devices and
fingerprints). You can send messages with both legacy PGP (XEP-0027) and the
new OX (XEP-0373: OpenPGP for XMPP).
That's all for now. Enjoy Debian 11 bullseye and Happy Chatting!
How are you meant to write about an unfinished emancipation? Bodies of Light is a 2014 book by Glasgow-born Sarah Moss on the stirrings of women's suffrage in an arty clique in nineteenth-century England. Set in the intellectually smoggy cities of Manchester and London, we follow the studious and intelligent Alethia 'Ally' Moberly, who is struggling to gain the acceptance of herself, her mother and the General Medical Council.
'Alethia' may be the Greek goddess of truth, but our Ally is really searching for wisdom. Her strengths are her patience and bookish learning, and she acquires Latin as soon as she learns male doctors will use it to keep women away from the operating theatre. In fact, Ally's acquisition of language becomes a recurring leitmotif: replaying a suggestive dream involving a love interest, for instance, Ally thinks of 'dark, tumbling dreams for which she has a perfectly adequate vocabulary'. There are very few moments of sensuality in the book, and pairing it with Ally's understated wit achieves a wonderful effect.
The amount we learn about a character is adapted for effect as well. There are few psychological insights about Ally's sister, for example, and she thus becomes a fey, mysterious and almost Pre-Raphaelite figure below the surface of a lake to match the artistic movement being portrayed. By contrast, we get almost the complete origin story of Ally's mother, Elizabeth, who also constitutes of those rare birds in literature: an entirely plausible Christian religious zealot. Nothing Ally does is ever enough for her, but unlike most modern portrayals of this dynamic, neither of them are aware of what is going, and it is conveyed in a way that is chillingly... benevolent. This was brought home in the annual 'birthday letters' that Elizabeth writes to her daughter:
Last year's letter said that Ally was nervous, emotional and easily swayed, and that she should not allow her behaviour to be guided by feeling but remember always to assert her reason. Mamma would help her with early hours, plain food and plenty of exercise. Ally looks at the letter, plump in its cream envelope. She hopes Mamma wrote it before scolding her yesterday.
The book makes the implicit argument that it is a far more robust argument against pervasive oppression to portray a character in, say, 'a comfortable house, a kind husband and a healthy child', yet they are nonetheless still deeply miserable, for reasons they can't quite put their finger on. And when we see Elizabeth perpetuating some generational trauma with her own children, it is telling that is pattern is not short-circuited by an improvement in their material conditions. Rather, it is arrested only by a kind of political consciousness in Ally's case, the education in a school. In fact, if there is a real hero in Bodies of Light, it is the very concept of female education.
There's genuine shading to the book's ideological villains, despite finding their apotheosis in the jibes about 'plump Tories'. These remarks first stuck out to me as cheap thrills by the author; easy and inexpensive potshots that are unbecoming of the pages around them. But they soon prove themselves to be moments of much-needed humour. Indeed, when passages like this are read in their proper context, the proclamations made by sundry Victorian worthies start to serve as deadpan satire:
We have much evidence that the great majority of your male colleagues regard you as an aberration against nature, a disgusting, unsexed creature and a danger to the public.
Funny as these remarks might be, however, these moments have a subtler and more profound purpose as well. Historical biography always has the risk of allowing readers to believe that the 'issue' has already been solved hence, perhaps, the enduring appeal of science fiction. But Moss providing these snippets from newspapers 150 years ago should make a clear connection to a near-identical moral panic today.
On the other hand, setting your morality tale in the past has the advantage that you can show that progress is possible. And it can also demonstrate how that progress might come about as well. This book makes the argument for collective action and generally repudiates individualisation through ever-fallible martyrs. Ally always needs 'allies' not only does she rarely work alone, but she is helped in some way by almost everyone around her. This even includes her rather problematic mother, forestalling any simplistic proportioning of blame. (It might be ironic that Bodies of Light came out in 2014, the very same year that Sophia Amoruso popularised the term 'girl boss'.) Early on, Ally's schoolteacher is coded as the primary positive influence on her, but Ally's aunt later inherits this decisive role, continuing Ally's education on cultural issues and what appears to be the Victorian version of 'self-care'. Both the aunt and the schoolteacher are, of course, surrogate mother figures.
After Ally arrives in the cut-throat capital, you often get the impression you are being shown discussions where each of the characters embodies a different school of thought within first-wave feminism. This can often be a fairly tedious device in fiction, the sort of thing you would find in a Sally Rooney novel, Pilgrim's Progress or some other ponderously polemical tract. Yet when Ally appears to 'win' an argument, it is only in the sense that the narrator continues to follow her, implicitly and lightly endorsing her point. Perhaps if I knew my history better, I might be able to associate names with the book's positions, but perhaps it is better (at least for the fiction-reading experience...) that I don't, as the baggage of real-world personalities can often get in the way. I'm reminded here of Regina King's One Night in Miami... (2020), where caricatures of Malcolm X, Muhammad Ali, Jim Brown and Sam Cooke awkwardly replay various arguments within an analogous emancipatory struggle.
Yet none of the above will be the first thing a reader will notice. Each chapter begins with a description of an imaginary painting, providing a title and a date alongside a brief critical exegesis. The artworks serve a different purpose in each chapter: a puzzle to be unlocked, a fear to be confirmed, an unsolved enigma. The inclusion of (artificial) provenances is interesting as well, not simply because they add colour and detail to the chapter to come, but because their very inclusion feels reflective of how we see art today.
Orphelia (1852) by Sir John Everett Millais.
To continue the question this piece began, how should an author conclude a story about an as-yet-unfinished struggle for emancipation? How can they? Moss' approach dares you to believe the ending is saccharine or formulaic, but what else was she meant to turn in yet another tale of struggle and suffering? After all, Thomas Hardy has already written Tess of the d'Urbervilles. All the same, it still feels slightly unsatisfying to end merely with Ally's muted, uncelebrated success.
Nevertheless, I suspect many readers will dislike the introduction of a husband in the final pages, taking it as a betrayal of the preceding chapters. Yet Moss denies us from seeing the resolution as a Disney-style happy ending. True, Ally's husband turns out to be a rather dashing lighthouse builder, but isn't it Ally herself who is lighting the way in their relationship, warning other women away from running aground on the rocks of mental illness? And Tom feels more of a reflection of Ally's newly acquired self-acceptance instead of that missing piece she needed all along. We learn at one point that Tom's 'importance to her is frightening' this is hardly something a Disney princess would say.
In fact, it is easy to argue that a heroic ending for Ally might have been an even more egregious betrayal. The evil of saints is that you can never live up to them, for the concept of a 'saint' embodies an unreachable ideal that no human can begin to copy. By being taken as unimpeachable and uncorrectable as well, saints preclude novel political action, and are therefore undoubtedly agents of reaction. Appreciating historical figures as the (flawed) people that they really were is the first step if you wish to continue or adapt their political ideas.
I had acquired Bodies of Light after enjoying Moss' Summerwater (2020), which had the dubious honour of being touted as the 'first lockdown novel', despite it being finished before Covid-19. There are countless ways one might contrast the two, so I will limit myself to the sole observation that the strengths of one are perhaps the weaknesses of the other. It's not that Bodies of Light ends with a whimper, of course, as it quietly succeeds in concert with Ally. But by contrast, the tighter arc of Summerwater (which is set during a single day, switches protagonist between chapters, features a closed-off community, etc.) can reach a higher high with its handful of narrative artifices. Summerwater is perhaps like Phil Collins' solo career: 'more satisfying, in a narrower way.'
A new minor release of drat arrived on CRAN overnight. This is a minor update relative to the 0.2.0 release in April. This release will now create an empty file index.html in the top-level (when initRepo() is called), and check for presence of such a file when adding files to a repo (via insertPackage()). This helps to avoid getting 404 results when (perfectly valid) drat repos are checking by accessing the top-level URL, as for example CRAN does when testing if an Additional_repositoiries is reachable. The step-by-step vignette had already suggested creating one by hand, this is now done programmatically (and one is present in the repo suggsted to fork from too).
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code. See below for a few custom reference examples.
Because for once it really is as your mother told you: Friends don t let friends install random git commit snapshots. Properly rolled-up releases it is. Just how CRAN shows us: a model that has demonstrated for two-plus decades how to do this. And you can too: drat is easy to use, documented by six vignettes and just works.
The NEWS file summarises the release as follows:
Changes in drat version 0.2.1 (2021-07-09)
Two internal functions now have a note in their documentation stating them as not exported (Dirk in response to #123)
Repositories created by initRepo now have an placeholder index.html to not trigger a curl check at CRAN (Dirk)
Adding to a repository now checks for a top-level index.html and displays a message if missing (Dirk)
The DratStepByStep.Rmd vignette mentions the added index.html file
The Rcpp team is pleased to announce release 1.0.7 of Rcpp which arrived at CRAN earlier today, and will be uploaded to Debian shortly. Windows and macOS builds should appear at CRAN in the next few days. This release continues with the six-months cycle started with release 1.0.5 last July. As a reminder, interim dev or rc releases will alwasys be available in the Rcpp drat repo; this cycle there were seven (!!). These rolling release tend to work just as well, and are also fully tested against all reverse-dependencies.
Rcpp has become the most popular way of enhancing R with C or C++ code. As of today, 2323 packages on CRAN depend on Rcpp for making analytical code go faster and further, along with 227 in BioConductor.
This release contains a change which Luke Tierney urged us to make a good year ago in #1081) (and which we had looked at earlier in #382). Implementing the change in a regular update proved a little tricky, and my initial branch lay dormant until I aki revived it, and finished the transition (which we then did in two PRs). The change concerns how Rcpp grows internal objects, and the new approach (thanks to the hint by Luke) closer to what R does guaranteeing linear behaviour. It turns out that we overlooked one aspect (of coping with Modules built under earlier Rcpp releases) so the initial upload to CRAN on Saturday revealed that we needed a small adjustment that we made for the final release. This version should now be more performant, and rest on a stable API. Based on the reverse depends checks by both us and CRAN (using the updated version), we expect no issues with existing code. However, it something does act up a fresh compilation of the packages using Rcpp may help.
We also made a few other minor changes in the API such as silencing a silly compiler warning, ensuring global Rcout and Rcerr objects, adding support for a new Rcpp::message() call, completing a switch to uint32_t instead of unsigned int and including the cfloat header (which relates to STRICT_R_HEADERS discussed below). Similarly, the Rcpp Attributes feature was enhanced by coping better with packages with a dot in their name and their for per-package include files, along with support for more quiet compilation if desired.
As some Rcpp users may have seen, we plan to enable STRICT_R_HEADERS by the next release (expected in January 2022). A long issue tick #1158 is laying the ground work. Maintainers of 81 packages which are affected and need a small change (such as for example switching from PI to M_PI); of these 56 have already responded. We plan to be in touch in the fall. Adding the cfloat header is one help in this transition (as the corresponding C header was pulled in when STRICT_R_HEADERS is not defined) as it ensures DBL_EPSILON and alike are defined.
Last but not least this is also the first relase in which we welcome I aki as a new member of the Rcpp Core team. Yay!
The NEWS file entries follow summarizing the nine key PRs in this release.
Changes in Rcpp release version 1.0.7 (2021-07-06)
Changes in Rcpp API:
Refactored Rcpp_PreserveObject and Rcpp_ReleaseObject which are now O(1) (Dirk and I aki in #1133 and #1135 fixing #382 and #1081).
A spuriously assigned variable was removed (Dirk in #1138 fixing #1137).
Global Rcout and Rcerr objects are supported via a compiler directive (I aki in #1139 fixing #928)
Add support for Rcpp::message (Dirk in #1146 fixing #1145).
The uint32_t type is used throughout instead of unsigned int (Dirk in #1153 fixing #1152).
The cfloat header for floating point limits is now included (Dirk in #1162 fixing #1161).
Changes in Rcpp Attributes:
Packages with dots in their name can now have per-package include files (Dirk in #1132 fixing #1129).
New argument echo to quieten optional evaluation in sourceCpp (Dirk in #1138 fixing #1126).
Forthcoming Changes in Rcpp API:
Starting with Rcpp 1.0.8 anticipated in January 2022, STRICT_R_HEADERS will be enabled by default, see #1126.
Continuing with #newinbullseye. One package that isn t new but its tools are used by many of us is util-linux, providing many essential system utilities. There is util-linux v2.33.1 in Debian/buster and util-linux v2.36.1 in Debian/bullseye, and as usual there are many new features and options available.
I don t want to replicate the release notes provided by upstream, instead make sure to check out the Release highlights sections in the following release notes:
Tools that have been taken over from / moved to other packages
Debian s util-linux source package provides new binary packages: eject (and eject-udeb) and bsdextrautils. The util-linux implementation of /usr/bin/eject is used now, replacing the one previously provided by the eject source package.
Overall, from a util-linux perspective the following shifts took place:
col, colcrt, colrm, column: moved from binary package bsdmainutils to bsdextrautils
eject: moved to binary package eject
hd: moved from binary package bsdmainutils to bsdextrautils
hexdump: moved from binary package bsdmainutils to bsdextrautils
look: moved from binary package bsdmainutils to bsdextrautils
ul: moved from binary package bsdmainutils to bsdextrautils
write(.ul): moved from binary package bsdmainutils (named bsd-write) to bsdextrautils
Deprecated / removed tools
Tools that are no longer shipped as of Debian/bullseye:
/usr/bin/rename.ul (rename files): use e.g. rename package instead, see #926637 for details regarding the removal
/usr/bin/volname (return volume name for a device formatted with an ISO-9660 file system): use blkid -s LABEL -o value $filename instead
/usr/lib/eject/dmcrypt-get-device: no replacement available
New tools
Debian s bsdutils package (which is provided by the util-linux source package) provides a new tool from util-linux:
scriptlive: re-execute stdin log by a shell in PTY session
The new tools lsirq + irqtop (to monitor kernel interrupts) sadly didn t make it into util-linux s packaging of Debian/bullseye (as without per-CPU data they do not seem mature at this time). The new hardlink tool (to consolidate duplicate files via hardlinks) won t be shipped, as there s an existing hardlink package already.
New features/options
agetty + getty:
--show-issue display issue file and exit
blkdiscard:
--force disable all checking
blkid:
-D, --no-part-details don't print info from partition table
blkzone:
Commands:
open Open a range of zones.
close Close a range of zones.
finish Set a range of zones to Full.
Options:
-f, --force enforce on block devices used by the system
cfdisk:
--lock[=<mode>] use exclusive device lock (yes, no or nonblock)
dmesg:
--noescape don't escape unprintable character
-W, --follow-new wait and print only new messages
fdisk:
-x, --list-details like --list but with more details
-n, --noauto-pt don't create default partition table on empty devices
--lock[=<mode>] use exclusive device lock (yes, no or nonblock)
fstrim:
-I, --listed-in <list> trim filesystems listed in specified files
--quiet-unsupported suppress error messages if trim unsupported
lsblk:
Options:
-E, --dedup <column> de-duplicate output by <column>
(for example 'lsblk --dedup WWN' to de-duplicate devices by WWN number, e.g. multi-path devices)
-M, --merge group parents of sub-trees (usable for RAIDs, Multi-path)
see http://karelzak.blogspot.com/2018/11/lsblk-merge.html
New output columns:
FSVER filesystem version
PARTTYPENAME partition type name
DAX dax-capable device
lscpu:
Options:
-B, --bytes print sizes in bytes rather than in human readable format
-C, --caches[=<list>] info about caches in extended readable format
--output-all print all available columns for -e, -p or -C
Available output columns for -C:
ALL-SIZE size of all system caches
LEVEL cache level
NAME cache name
ONE-SIZE size of one cache
TYPE cache type
WAYS ways of associativity
ALLOC-POLICY allocation policy
WRITE-POLICY write policy
PHY-LINE number of physical cache line per cache t
SETS number of sets in the cache; set lines has the same cache index
COHERENCY-SIZE minimum amount of data in bytes transferred from memory to cache
lslogins:
--lastlog <path> set an alternate path for lastlog
lsns:
-t, --type time namespace type time is also supported now (next to mnt, net, ipc, user, pid, uts, cgroup)
mkswap:
--lock[=<mode>] use exclusive device lock (yes, no or nonblock)
more:
Options:
-n, --lines <number> the number of lines per screenful
New long options (in addition to the listed equivalent short options):
--silent - equivalent to -d
--logical - equivalent to -f
--no-pause - equivalent to -l
--print-over - equivalent to -c
--clean-print - equivalent to -p
--squeeze - equivalent to -s
--plain - equivalent to -u
mount:
Options:
--target-prefix <path> specifies path use for all mountpoints
Source:
ID=<id> specifies device by udev hardware ID
mountpoint:
--nofollow do not follow symlink
nsenter:
-T, --time[=<file>] enter time namespace
script:
-I, --log-in <file> log stdin to file
-O, --log-out <file> log stdout to file (default)
-B, --log-io <file> log stdin and stdout to file
-T, --log-timing <file> log timing information to file
-m, --logging-format <name> force to 'classic' or 'advanced' format
-E, --echo <when> echo input (auto, always or never)
sfdisk:
--disk-id <dev> [<str>] print or change disk label ID (UUID)
--relocate <oper> <dev> move partition header
--move-use-fsync use fsync after each write when move data
--lock[=<mode>] use exclusive device lock (yes, no or nonblock)
unshare:
-T, --time[=<file>] unshare time namespace
--map-user=<uid> <name> map current user to uid (implies --user)
--map-group=<gid> <name> map current group to gid (implies --user)
-c, --map-current-user map current user to itself (implies --user)
--keep-caps retain capabilities granted in user namespaces
-R, --root=<dir> run the command with root directory set to <dir>
-w, --wd=<dir> change working directory to <dir>
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--monotonic <offset> set clock monotonic offset (seconds) in time namespaces
--boottime <offset> set clock boottime offset (seconds) in time namespaces
wipefs:
--lock[=<mode>] use exclusive device lock (yes, no or nonblock)
Although I'm about 5 months early and we're in the middle of a terrible heat
wave where I live, I've just finished building my new winter bicycle!
I've been riding all year round for about 8 years now and the winters in
Montreal are harsh enough that a second winter-ready bicycle is required to
have a fun and safe cold season.
I'm saying "new bicycle" because a few months ago I totaled the frame of my
previous winter bike. As you can see in the picture below (please disregard the
salt crust), I broke the seat tube at the lug.
I didn't notice it at first and while riding I kept hearing a "bang bang" sound
coming from the frame when going over bumps. To my horror, I eventually
realised the sound was coming from the seat tube hitting the bottom bracket
shell!
I'm sad to see this Lejeune French frame go, but it was probably
built in the 70's or the early 80's: it had a good life. Another great example
of how a high quality steel frame can last a lifetime.
Sparing no expense, I decided to replace it by a brand new Surly
Cross-Check frameset. Surly is known for making great bike frames
and the Cross-Check is a very versatile model. I'll finally be able to fit my
Schwalbe Marathon Winter Plus tires at the front and the back
with full length mud guards!!! Hard to ask for more.
Summer has just started and I'm already looking forward to winter :)
This blog post is about my observations of some of the plants in my home garden.
While still a n00b on the subject, these notes are my observations and experiences over days, weeks and months. Thankfully, with the capability to take frequent pictures, it has been easy to do an assessment and generate a report of some of these amazing behaviors of plants, in an easy timeline order; all thanks to the EXIF data embedded.
This has very helpfully allowed me to record my, otherwise minor observations, into great detail; and make some sense out of it by correlating the data over time.
It is an emotional experience. You see, plants are amazing. When I sow a sapling, water it, feed it, watch it grow, prune it, medicate it, and what not; I build up affection towards it.
Though, at the same time, to me it is a strict relationship, not too attached; as in it doesn t hurt to uproot a plant if there is a good reason. But still, I find some sort of association to it.
With plants around, it feels I have a lot of lives around me. All prospering, communicating, sharing. And communicate they do. What is needed is just the right language to observe and absorb their signals and decipher what they are trying to say.
Devastation
How in this world, when you are caring for your plants, can it transform:
From This
Healthy Mulberry Plant
Healthy Mulberry Plant
Healthy Bael Plant
To This
Dead Mulberry Plant
Very Sick Bael Plant
With emotions involved, this can be an unpleasant experience.
Bael is a dear plant to me. The plant as a whole has religious values (Shiva). As well, its fruits have lots of health benefits, especially for the intestines. Its leaves have a lot of medicinal properties.
When I planted the Bael, there were a lot of emotions that went along.
On the other hand, the Mulberry is something I put in with a lot of enthusiasm. Mulberries are now rare to find, especially in urban locations. For one, they have a very short shelf life; But more than that, the way lifestyles are heading towards, I was always worried if my children would ever have a day to see and taste these fruits.
The mulberry that I planted, yielded twice; once very soon when I had planted and second, before it died. Infact, it died while during its second yield phase.
It was quite saddening to see that happen. It made me wonder why it happened. I had been caring for the plants fairly well. Watering them timely, feeding them the right amount of nutrients. They were getting a good amount of sun.
But still their health was deteriorating. And then the demise of the Mulberry. Many thoughts hit my mind.
I consulted the claimed experts in the domain, the maali, the gardener. I got a very vague answer; there must be termites in the soil. It didn t make much sense to me. I mean if there are termites they d hit day one. They won t sleep for months and just wake up one fine day and start attacking the roots of particular plants; not all.
I wasn t convinced with the termite theory; But still, give the expert the blind hand, I went with his word.
When my mulberry was dead, I dug its roots. Looking for proof, to see if there were any termites, I uprooted it. But I couldn t find any trace of termites. And the plant next to it was perfectly healthy and blossoming. So I was convinced that it wasn t the termite but something else.
But else what ? I still didn t have an answer to that.
Thinking
The Corona pandemic had embraced and there was a lot to worry, and worry not any, if you change the perspective. With plants around in my home, and our close engagement with them, and the helplessness that I felt after seeking help from the experts, it was time again; to build up some knowledge on the subject.
But how ? How do you go about a subject you have not much clue about ? A subject which has always been around in the surrounding but very seldom have I dedicated focused thought to it. To be honest, the initial thought of diving on the subject made me clueless. I had no idea where to begin with. But, so, as has been my past history, I chose to take it as a curiosity.
I gathered some books, skimmed through a couple of pages. Majority of the books I got hold of were about DIYs and How to do Home Gardening types. It was a decent introduction to a novice but my topic of curiosity was different.
Thankfully, with the Internet, and YouTube in particular, a lot of good stuff is available as documentary videos. While going through some, I came across a video which mentioned about carnivore plants. Like, for example, this one.
Carnivore Plant
This got me thinking that there could be a possibility of something similar, that did the fate to my Mulberry plant. But who did it ? And how to dive further on this suspicion ? And most of all, if that thought of possibility was actually the reality. Or was I just hitting in the dark ?
Beginning
To put some perspective, here s how it started. When we moved into our home, the gardener put in a couple of plants stock, as part of the property handover. Now, I don t exactly recollect the name of the plants that came in stock, neither English nor Hindi; But at my neighbor s place, the plant is still there.
Here are some of the pictures of this beauty. But don t just go by the looks as looks can be deceiving
Dominating Plant
Dominating Plant
Dominating Plant
We hadn t put any serious thought about the plants we were offered by the gardener. After all, we never had ever thought of any mishap either.
Plants we planted
Apart from what was offered by the builder/gardener as part of the property handover, in over the next 6 months of we moving in, I planted 3 tree type plants.
Mulberry
Bael
Rudraksha
The Mulberry, as I have described so far, died a tragic death.
Bael, on the other hand, fought hard. But very little did we know that the plant was struggling the fight. Our impression was that we must have been given a bad breed of the plant. Or maybe the termite theory had some truth.
For the Rudraksha plant, the growth was slow. This was the very first time I had seen a Rudraksha plant, so I had no clue of what its growth rate could be, and what to expect out of it. I wasn t sure if the local climate suited the plant. A quick search showed no objections to the plant in the local climate, but that was it. So my theory has been to put in the plant, and observe.
Here s what my Rudraksha plant looked like during the initial days/weeks of its settlement
Rudraksha Plant
The Hint
Days passed and so on. Not much had progressed in gathering information. The plant s health was usual; deteriorating at a slow pace.
On day, thinking of the documentaries I had been watching, it hit my mind about the plant behavior.
Plants can be Carnivores.
Plants can be Aggressive.
Plants can be Invaders.
Plants can be Territorial.
There are many plants where their aggression can be witnessed with bare human eyes. Like creepers. Some of them are good at spreading tentacles, grabbing onto other plants' stems and branches and spread above it. This was my hint from the documentaries. That s one of the many ways plants set their dominance. That is what hit my mind that if plants are aggressive on the out, underneath the soil, they should be having similar behavior.
I mean, what we see as humans is just a part of the actual plant. More than half of the actual plant is usually underneath the soil, in most plants.
So there s a high chance to get more information out, if you dig the soil and look the roots.
The Digging
As I mentioned earlier, I do establish bindings, emotions and attachments. But not much usually comes in the way to curiosity.
To dig further on the theory that the problem was elsewhere, with within the plants ecosystem, we needed to pick on another subject - the plant.
And the plant we chose was the plant which was planted in the initial offering to us, when we moved into our home. It was the same plant breed which was neighboring all our newly planted trees: Rudraksha, Mulberry and Bael.
If you look closely into the pictures above of these plants, you ll notice the stem of another plant, the Territorial Dominator, is close-by to these 3 plants. That s because the gardener put in a good number of them to get his action item complete.
So we chose to dig and uproot one of those plant to start with. Now, while they may look gentle on the outside, with nice red colored tiny flowers, these plants were giants underneath. Their roots were huge. It took some sweat shredding to single-handedly remove them.
Dominating Plant Uprooted
Dominating Plant Uprooted
Dominating Plant Uprooted
Dominating Plant Uprooted
Today is brighter
Bael
I ll let the pictures do the initial talking today.
Healthy Bael
Healthy Bael
Healthy Bael
Healthy Bael
Healthy Bael
The above ones are pictures of the same Bael plant, which had struggled to live, for almost 14 months. Back then, this plant was starved of its resources. It was dying a slow death out of starvation. After we uprooted the other dominant species, the Bael has recovered and has regained its charm.
In the pictures above of the Bael plant, you can clearly mark out the difference in its stem. The dark colored one is from its months of struggle, while the bright green is from now where it is well nourished and regained its health.
Mulberry
As for the Mulberry, I couldn t save it. But I later managed to get another one. But it turns out I didn t take good, full length pictures of the new mulberry when I planted. The only picture I have is this:
Second Mulberry Plant
I recollect when I brought it home, it was around 1 - 1.5 feet in length.
This is where I have it today: Majestically standing, 12 feet and counting
Second Mulberry Plant 7 feet tall
Rudraksha
Then:
Rudraksha Plant
And now:
I feel quite happy about
Rudraksha Plant
Rudraksha Plant
Rudraksha Plant
All these plants are on the very same soil with the very same care taker. What has changed is my experience and learning.
Plant Co-Existence
Plant co-existence is a difficult topic. My knowledge on plants is very limited in general, and co-existence is something tricky, unexplored, at times invisible (when underneath the soil). So it is a difficult topic. So far, what I ve learnt is purely observations, experiences and hints from the documentaries.
There surely are many many plants that co-exist very well. A good example is my Bael plant itself, which is healthily co-sharing its space with 2 other Croton plants. Same goes for the Rudraksha, which has a close-by neighbor in an Adenium and an Allamanda.
The plant world is mesmerizing. How they behave, communicate and many many more signs. There s so much to observe, learn, explore and document. I hope to have more such observations and experiences to share
Since I joined the Debian Python Team, I have had a lot of fun working on
different QA issues. Although I'm still a Perl illiterate1, I've for
example contributed to a few Lintian tags.
There are multiple ways to make mass QA changes to team-managed packages.
Projects like the Debian Janitor are more than fantastic: they make
for a robust, thorough and automated way to fix QA issues in the archive and I
don't have enough good words to describe the amazing work of Jelmer Vernooij on
the toolsuite the Janitor uses.
But with robustness comes complexity. The Janitor is currently based on 10
different subtools (silver-platter, ognibuild, lintian-brush, ...) and if
you want to use it to fix a bug, you first need to make sure there's a Lintian
tag that flags the issue you're working on. Then you need to write a
lintian-brush fixer to fix said issue. Sadly, sometimes writing a new
Lintian tag to flag a trivial changes is not the appropriate course of action
and only creates clutter.
All this to say until now, I was a missing a "quick and somewhat dirty2"
way to make simple one-off changes to a bunch of packages. 200 lines of Python
later, I'm happy to report I have a simple way to replace
the old Clojure Team email in d/control by the new one for all of our
packages. Even better, although this script doesn't aim to be a versatile tool
like the Janitor is, most of the functions can be reused for other similar
one-off scripts.
Many thanks to Felix Lechner showing me the very handy Lintian Query JSON
interface!
I don't really enjoy coding in Perl, but it makes up so much of the
current Debian infrastructure that I wish I did. I keep telling myself I
should buy an "Introduction to Perl" book...
A quick and dirty way to make those changes would've been to write
a shell script, but one of my 2021 resolution is to use Python for all my
scripting needs.