Russ Allbery: Review: Gideon the Ninth
| Series: | The Locked Tomb #1 |
| Publisher: | Tor |
| Copyright: | September 2019 |
| ISBN: | 1-250-31317-1 |
| Format: | Kindle |
| Pages: | 448 |
| Series: | The Locked Tomb #1 |
| Publisher: | Tor |
| Copyright: | September 2019 |
| ISBN: | 1-250-31317-1 |
| Format: | Kindle |
| Pages: | 448 |
Last night, Lars, Mark, and I discussed Jeremy Kun's The communicative value
of using Git well post. While a lot of our discussion was spawned by
the article, we did go off-piste a little, and I hope that my notes below will
enlighten you all as to a bit of how we see revision control these days. It
was remarkably pleasant to read an article where the comments section wasn't a
cesspool of horror, so if this posting encourages you to go and read the
article, don't stop when you reach the bottom -- the comments are good and
useful too.
bzr) but
how over time we came to appreciate Git for what it is. For Mark this was less
painful because he came to Git early enough that there was little more than the
fundamental data model, without much of the porcelain which now exists.
One point which we all, though Mark in particular, felt was worth considering
was that of distinguishing between published and unpublished changes. The
article touches on it a little, but one of the benefits of the workflow which
Jeremy espouses is that of using the revision control system as an integral
part of the review pipeline. This is perhaps done very well with Git based
workflows, but can be done with other VCSs.
With respect to the points Jeremy makes regarding making commits which are good
for reviewing, we had a general agreement that things were good and sensible,
to a point, but that some things were missed out on. For example, I raised
that commit messages often need to be more thorough than one-liners, but
Jeremy's examples (perhaps through expedience for the article?) were all pretty
trite one-liners which perhaps would have been entirely obvious from the commit
content. Jeremy makes the point that large changes are hard to review, and
Lars poined out that Greg Wilson did research in this area, and at
least one article mentions 200 lines as a maximum size of a
reviewable segment.
I had a brief warble at this point about how reviewing needs to be able to
consider the whole of the intended change (i.e. a diff from base to tip) not
just individual commits, which is also missing from Jeremy's article, but that
such a review does not need to necessarily be thorough and detailed since the
commit-by-commit review remains necessary. I use that high level diff as a way
to get a feel for the full shape of the intended change, a look at the end-game
if you will, before I read the story of how someone got to it. As an aside at
this point, I talked about how Jeremy included a 'style fixes' commit in his
example, but I loathe seeing such things and would much rather it was
either not in the series because it's unrelated to it; or else the style fixes
were folded into the commits they were related to.
We discussed how style rules, as well as commit-bisectability, and other rules
which may exist for a codebase, the adherence to which would form part of the
checks that a code reviewer may perform, are there to be held to when they
help the project, and to be broken when they are in the way of good
communication between humans.
In this, Lars talked about how revision control histories provide high level
valuable communication between developers. Communication between humans is
fraught with error and the rules are not always clear on what will work and
what won't, since this depends on the communicators, the context, etc. However
whatever communication rules are in place should be followed. We often say
that it takes two people to communicate information, but when you're writing
commit messages or arranging your commit history, the second party is often
nebulous "other" and so the code reviewer fulfils that role to concretise it
for the purpose of communication.
At this point, I wondered a little about what value there might be (if any) in
maintaining the metachanges (pull request info, mailing list discussions, etc)
for historical context of decision making. Mark suggested that this is useful
for design decisions etc but not for the style/correctness discussions which
often form a large section of review feedback. Maybe some of the metachange
tracking is done automatically by the review causing the augmentation of the
changes (e.g. by comments, or inclusion of design documentation changes) to
explain why changes are made.
We discussed how the "rebase always vs. rebase never" feeling flip-flopped in
us for many years until, as an example, what finally won Lars over was that he
wants the history of the project to tell the story, in the git commits, of how
the software has changed and evolved in an intentional manner. Lars said
that he doesn't care about the meanderings, but rather about a clear story
which can be followed and understood.
I described this as the switch from "the revision history is about what I did
to achieve the goal" to being more "the revision history is how I would hope
someone else would have done this". Mark further refined that to "The revision
history of a project tells the story of how the project, as a whole, chose to
perform its sequence of evolution."
We discussed how project history must necessarily then contain issue tracking,
mailing list discussions, wikis, etc. There are exist free software projects
where part of their history is forever lost because, for example, the project
moved from Sourceforge to Github, but made no effort (or was unable) to migrate
issues or somesuch. Linkages between changes and the issues they relate to
can easily be broken, though at least with mailing lists you can often rewrite
URLs if you have something consistent like a Message-Id.
We talked about how cover notes, pull request messages, etc. can thus also be
lost to some extent. Is this an argument to always use merges whose message
bodies contain those details, rather than always fast-forwarding? Or is it a
reason to encapsulate all those discussions into git objects which can be
forever associated with the changes in the DAG?
We then diverted into discussion of CI, testing every commit, and the benefits
and limitations of automated testing vs. manual testing; though I think that's
a little too off-piste for even this summary. We also talked about how commit
message audiences include software perhaps, with the recent movement toward
conventional commits and how, with respect to commit messages for
machine readability, it can become very complex/tricky to craft good commit
messages once there are multiple disparate audiences. For projects the size of
the Linux kernel this kind of thing would be nearly impossible, but for smaller
projects, perhaps there's value.
Finally, we all agreed that we liked the quote at the end of the article, and so
I'd like to close out by repeating it for you all...
Hal Abelson famously said:
Programs must be written for people to read, and only incidentally for machines to execute.Jeremy agrees, as do we, and extends that to the metacommit information as well.
Welcome to gambaru.de. Here is my monthly report (+ the first week in May) that covers what I have been doing for Debian. If you re interested in Java, Games and LTS topics, this might be interesting for you.
Debian Games
Playonlinux
The first proper video (following last week s announcement) is up for new T^4 series of video lightning talks with tips, tricks, tools, and toys. Today we just to a little enhancement for the shell enabled color output (if not already on by default).
The slides are available here. Next week we continue on shell customization by looking at the prompt. Also of note, a new repo at GitHub to support the series: use it to open issues for comments, criticism, suggestions, or feedback. If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
I was assigned 20 hours of work by Freexian's Debian LTS initiative,
and carried over 8.5 hours from March. I worked 26 hours this month,
so I will carry over 2.5 hours to May.
I sent a (belated)
request
for testing an update of the linux package to 3.16.82. I then
prepared and, after review, released Linux 3.16.83, including a
large number of security fixes. I rebased the linux package onto
that and will soon send out a request for testing. I also spent
some time working on a still-embargoed security issue.
I did not spend signficant time on any other LTS activities this
month, and unfortunately missed the contributor meeting.
| Publisher: | Penguin |
| Copyright: | 2020 |
| ISBN: | 0-525-56022-X |
| Format: | Kindle |
| Pages: | 249 |
A maintenance release of our (still small) ttdo package just arrived on CRAN. As introduced last fall, the ttdo package extends the most excellent (and very minimal / zero depends) unit testing package tinytest by Mark van der Loo with the very clever and well-done diffobj package by Brodie Gaslam to give us test results with visual diffs:
tinytest has an extension mechanism we use, and as tinytest was just upgraded to version 1.2.0 changing, among other nice extensions, one interface by allowing for a new error class argument, we had to rebuild as well in order to document the new argument.
The release was actually prepared three days ago when tinytest itself was updated, but we waited for the binaries at CRAN to be updated and rebuilt to take advantage of the fully automated submission and test process at CRAN.
The NEWS entry follow.
CRANberries provides the usual summary of changes to the previous version. Please use the GitHub repo and its issues for any questions. If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.Changes in ttdo version 0.0.5 (2020-05-06)
- Rebuilt under tinytest 1.2.0 to add support for
classargument in error-code test predicates
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
sip:657837644.522827@192.168.169.170Now if only jami would reduce its memory usage, I could even recommend this setup to others. :) As usual, if you use Bitcoin and want to show your support of my activities, please send Bitcoin donations to my address 15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b.
We had to cancel R/Finance 2020 due to what is happening all around us. But I plan to present the one-hour workshop I often give in the tutorial session preceding the first day but this time online!
To keep it simple, we will stick with the same day, and possibly the same time: Friday morning at 8:00am! So that makes Friday, June 5, at 08:00h Central time.
This YouTube! link should then provide the stream, I reckon there may also be a recording afterwards.
The talk / demo / presentation will be about an hour long, and material should be similar to the previous ones (of the same length) still available at the talks page (which also has longer talks all the way to the two-day workshops).
If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
The apt.postgresql.org repository has been extended
to cover the arm64 architecture.
We had occasionally received user request to add "arm" in the past, but it was
never really clear which kind of "arm" made sense to target for PostgreSQL. In
terms of Debian architectures, there's (at least) armel, armhf, and arm64.
Furthermore, Raspberry Pis are very popular (and indeed what most users seemed
to were asking about), but the raspbian "armhf" port is incompatible with the
Debian "armhf" port.
Now that most hardware has moved to 64-bit, it was becoming clear that "arm64"
was the way to go. Amit Khandekar made it happen that
HUAWEI Cloud Services
donated a arm64 build host with enough resources to build the arm64 packages
at the same speed as the existing amd64, i386, and ppc64el architectures.
A few days later, all the build jobs were done, including passing all
test-suites. Very few arm-specific issues were encountered which makes me
confident that arm64 is a solid architecture to run PostgreSQL on.
We are targeting Debian buster (stable), bullseye (testing), and sid
(unstable), and Ubuntu bionic (18.04) and focal (20.04). To use the arm64
archive, just add the normal sources.list entry:
deb https://apt.postgresql.org/pub/repos/apt buster-pgdg mainUbuntu focal At the same time, I've added the next Ubuntu LTS release to apt.postgresql.org: focal (20.04). It ships amd64, arm64, and ppc64el binaries.
deb https://apt.postgresql.org/pub/repos/apt focal-pgdg mainOld PostgreSQL versions Many PostgreSQL extensions are still supporting older server versions that are EOL. For testing these extension, server packages need to be available. I've built packages for PostgreSQL 9.2+ on all Debian distributions, and all Ubuntu LTS distributions. 9.1 will follow shortly. This means people can move to newer base distributions in their .travis.yml, .gitlab-ci.yml, and other CI files.
| Series: | Seraphina #1 |
| Publisher: | Ember |
| Copyright: | 2012 |
| ISBN: | 0-375-89658-9 |
| Format: | Kindle |
| Pages: | 360 |
For way too long now something I had meant to start was a little series about tips, tricks, tools, and toys. I had mentioned the idea a few times to a friend or two, and generally received a thumbs up or a go for it . But it takes a little to get over the humb and get going. And it turns out that last week s r^4 talk on upgrading to R 4.0.0 hit some latent demand as we are now at 1400 views on YouTube. Wowser.
So hence without further ado, let s kick off T^4. Similar in spirit to R^4, but broader in scope and going beyond R. The opening slides explaining what we plan to do are here, and the video link follows below:
With some luck we should have the first actual talk next week. See you then! If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
I realised this week that for some years I have been applying Inbox
Zero
indiscriminately to all e-mail that I receive, but this does not make
sense, and has some downsides.
My version of Inbox Zero works very well when applied to mail
addressed directly to me, and for mail to certain mailing lists, where
each post to the list might as well be addressed directly to me, in
addition to the list. However, I also receive by e-mail the following
things to which I now believe Inbox Zero should not be applied:
Continuing on the path towards all my stuff being managed by
Ansible, I ve figured out a method of managing the reverse
DNS entries for subnets on the Hetzner Dedicated Server.
There s a bunch of Ansible modules for handling Hetzner Cloud, but these servers
are managed in Robot which the Cloud API doesn t cover. Instead, you need to
use the Robot Webservice.
Ansible does have a module for doing pretty arbitrary things with web
APIs though,
so using that I ve got the following playbook figured out to keep the reverse
DNS entries in sync:
---
- hosts:
- vmhost_vm1
gather_facts: False
tasks:
- name: import hetzner webservice credentials
include_vars:
file: "hetzner_ws.yml"
- name: set rdns for hetzner hosts
block:
- name: get current rdns entry
uri:
user: " hetzner_ws_user "
password: " hetzner_ws_password "
url: "https://robot-ws.your-server.de/rdns/ vmip4 "
status_code: [200, 404]
register: rdns_result
- name: update incorrect rdns entry
uri:
user: " hetzner_ws_user "
password: " hetzner_ws_password "
url: "https://robot-ws.your-server.de/rdns/ vmip4 "
method: "POST"
body_format: form-urlencoded
body:
ptr: " inventory_hostname "
status_code: [200, 201]
when: '"rdns" not in rdns_result.json or inventory_hostname != rdns_result.json.rdns.ptr'
changed_when: True
delegate_to: localhostdelegate_to: localhost twice. The first
step looks up the current PTR record, and accepts success if it gives either
a 200 or 404 status code (it will be 404 if there is no existing pointer
record). The result of this is used to conditionally create/update the PTR
record in the next task.
If nothing needs to be done, nothing will be changed and the second task will
be skipped. If a change is needed, the second step is successful if either the
PTR record is updated (status 200) or created (status 201).
This was actually a lot easier than I thought it would be, and the uri module
looks to be really flexible, so I bet there are other things that I could
easily integrate into my Ansible playbooks.
ssh -R127.0.0.1:2222:127.0.0.1:22 server.example.com will forward localhost:2222 on server.example.com to port 22 of the machine the SSH connection originated from. But what happens if the connection dies? Adding a while true; do ; done around it might help, but I would really like not to reinvent the wheel here!
Thankfully, somebody already invented that particular wheel and OpenWRT comes with a sshtunnel package that takes care of setting up and keeping up such tunnels and documentation how to do so. Just install the sshtunnel package, edit /etc/config/sshtunnel to contain a server stanza with hostname, port and username and a tunnelR stanza referring said server plus the local and remote sides of the tunnel and you're good to go.
config server home
option user user
option hostname server.example.com
option port 22
config tunnelR local_ssh
option server home
option remoteaddress 127.0.0.1
option remoteport 2222
option localaddress 127.0.0.1
option localport 22
The only caveat is that sshtunnel needs the OpenSSH client binary (and the package correctly depends on it) and OpenWRT does not ship the ssh-keygen tool from OpenSSH but only the equivalent for Dropbear. As OpenSSH can't read Dropbear keys (and vice versa) you'll have to generate the key somewhere else and deploy it to the OpenWRT box and the target system.
Oh, and OpenWRT defaults to enabling password login via SSH, so please disable that if you expose the box to the Internet in any way!
Using the tunnel
After configuring and starting the service, you'll see the OpenWRT system logging in to the configured remote and opening the tunnel. For some reason that connection would not show up in the output of w -- probably because there was no shell started or something, but logs show it clearly.
Now it's just a matter of connecting to the newly open port and you're in. As the port is bound to 127.0.0.1, the connection is only possible from server.example.com or using it as a jump host via OpenSSH's ProxyJump option: ssh -J server.example.com -p 2222 root@localhost.
Additionally, you can forward a local port over the tunneled connection to create a tunnel for the OpenWRT webinterface: ssh -J server.example.com -p 2222 -L8080:localhost:80 root@localhost. Yes, that's a tunnel inside a tunnel, and all the network engineers will go brrr, but it works and you can access LuCi on http://localhost:8080 just fine.
If you don't want to type that every time, create an entry in your .ssh/config:
Host openwrt
ProxyJump server.example.com
HostName localhost
Port 2222
User root
LocalForward 8080 localhost:80
And we're done. Enjoy easy access to the newly deployed box and carry on.Next.