giovannibajo1 | 4 years ago | on: Life is too short to depend on unstable software
giovannibajo1's comments
giovannibajo1 | 4 years ago | on: iOS 14.5 delivers Unlock iPhone with Apple Watch, new privacy controls, and more
giovannibajo1 | 5 years ago | on: Debian discusses vendoring again
I'm not sure how this is different from what I call vendoring, and I think this is indeed the solution.
In Go, there's "go mod vendor" which automatically creates a tree called "vendor" with a copy of all the sources needed to build the application, and from that moment on, building the application transparently uses the vendored copy of all dependencies.
In my ideal world, Debian would run "go mod vendor" and bundle the resulting tree a source DEB package (notice that the binary DEB package would still be "vendored" because go embraces static linking anyway).
If the Debian maintainer of that application wants to "beat upstream" at releasing security fixes, they will have a monitor on those dependencies' security updates, and then whenever they want, update the required dependencies, revendor and ship the security update.
What I totally disagree with is having "go-crc16" as a Debian package. I'm not even sure who would benefit from that, surely not Go developers that will install packages through the go package manager and decide and test their own dependencies without even knowing what Debian is shipping.
giovannibajo1 | 5 years ago | on: A review of endianness bugs in Qt, and how they were fixed
If you know you are reading aligned memory and you need to do it with a single word memory access, then you need to use intNN_t* and use htonl or similar functions to byteswap. There’s no way around it.
giovannibajo1 | 5 years ago | on: A review of endianness bugs in Qt, and how they were fixed
giovannibajo1 | 5 years ago | on: Git is too hard
Well, my pet peeve has always been git-tag. When I discuss about technical documentation, I actually use man git-tag as a reference of what NOT to do.
The summary (called NAME in manpages):
git-tag - Create, list, delete or verify a tag object signed with GPG
... which might make sense but is already confusing to a beginner because of its reference to GPG (are all tags signed with GPG?).But DESCRIPTION is actually the best:
Add a tag reference in refs/tags/, unless -d/-l/-v is given to delete, list or verify tags.
Unless -f is given, the named tag must not yet exist.
If one of -a, -s, or -u <keyid> is passed, the command creates a tag object, and requires a tag message.
Unless -m <msg> or -F <file> is given, an editor is started for the user to type in the tag message.
If -m <msg> or -F <file> is given and -a, -s, and -u <keyid> are absent, -a is implied.
Otherwise, a tag reference that points directly at the given object (i.e., a lightweight tag) is created.
A GnuPG signed tag object will be created when -s or -u <keyid> is used. When -u <keyid> is not used, the
committer identity for the current user is used to find the GnuPG key for signing. The configuration
variable gpg.program is used to specify custom GnuPG binary.
[... spoiler: it doesn't get any better]
So this should be a description that makes beginners understand git-tag.Instead, it is a sequence of unrelated sentences that merely describes functionalities in response to command line arguments, in a very convoluted way (I think "If -m <msg> or -F <file> is given and -a, -s, and -u <keyid> are absent, -a is implied" is a little gem).
This is how I would write it:
Create, view, and delete tags.
By default, it creates a new “lightweight” tag, which is simple a reference to the current commit (eg: “git tag v1.2”). If you specify “-a”, a “annotated” tag is created instead; an annotated tag is still a reference to the current commit, but also remembers the date in which it was created, who created it, and optionally saves a message associated to the tag (like a “commit” message for the tag).
Annotated tags can also be cryptographically signed with GnuPG, using “-s” instead of “-a”.
You can also tag a commit which is not the current head by simply specifying it on the command line (eg: “git tag v1.2 abcde1234”).
Use “git tag -l” to view the list of all tags.
Use “git tag -d” to delete a tag.
So I think git still has a long way to go with documentation.giovannibajo1 | 5 years ago | on: Epic’s decision to bypass Apple’s App Store policies was dishonest, says judge
giovannibajo1 | 5 years ago | on: Facebook warned it may stop operating its core app and Instagram in Europe
giovannibajo1 | 5 years ago | on: Moving your SSH port isn’t security by obscurity
giovannibajo1 | 5 years ago | on: Moving your SSH port isn’t security by obscurity
giovannibajo1 | 5 years ago | on: iOS 14 is available today
giovannibajo1 | 5 years ago | on: Apple Disabling 'Sign in with Apple' for Epic Games on September 11
giovannibajo1 | 5 years ago | on: Apple Disabling 'Sign in with Apple' for Epic Games on September 11
giovannibajo1 | 5 years ago | on: Epic vs. Apple: Order Granting in Part and Denying in Part Motion for TRO [pdf]
Since Epic has 2 different accounts, Apple could have terminated only one of them, leaving Unreal Engine intact. But Schiller’s declaration says that in these cases they have always terminated all accounts that are owned by the same company / conglomerate (I can easily see this is useful in some cases). So again I feel they were in a corner: they had to follow what they have always done, so that other companies couldn’t prove a ad-hoc enforcement of rules (termination rules, in this case).
giovannibajo1 | 5 years ago | on: The Absurd (Lack of) Support for Android Developers
It really sounds like Google is refusing to provide information, and just point to a specific rule which is too generic to really understand what it’s going on. That’s a pity. I hope you get some traction on HN to solve this
giovannibajo1 | 5 years ago | on: Apple responds to Epic Games lawsuit, says CEO asked for special treatment
giovannibajo1 | 5 years ago | on: Why Did Mozilla Remove XUL Add-Ons?
In the article, there are a couple of passes that mention “benchmarks” where Firefox was faster than Chrome. It sounds like those benchmarks, albeit I assume they were correct, were actually providing a distorted reality of what “fast” actually means, because I distinctly remember people (including myself) switching to Chrome in early days because it was simply objectively faster. It sounds like the existence of those benchmarks have had a net negative on Firefox: it provided a false confidence that the browser was “fast”, and possibly delayed the refactorings that eventually managed to really speed up Firefox again.
You mention that Chrome used “UX tricks” but I assume what this means is that Chrome developers were actually driven by more correct benchmarks: the ones that actually translate to a better experience for the end user.
Since I’m always intrigued by the topic of false benchmarking and how complex it is to do correct benchmarks that don’t fall into traps, I’d love to hear what those benchmarks you mention were measuring, and if you agree that they gave a false assurance to the Firefox team.
giovannibajo1 | 5 years ago | on: Can't you just right click?
giovannibajo1 | 5 years ago | on: Most “mandatory requirements” in corporations are imaginary
giovannibajo1 | 5 years ago | on: Laying the foundation for Rust’s future
This matches my experience. Obviously it's impossible to generalize without making mistakes, but I started to notice that projects that loudly talk about their use of SemVer often break compatibility. In other words, it seems like they think SemVer is a way to liberate them in breaking APIs because now they have a way to tell the world about it explicitly, and so nothing can go wrong.
Ecosystems that have adopted SemVer massively do not value backward compatibility (npm comes to mind), and their package managers often have to provide solvers for complex dependencies; users can get to a corner where they must upgrade something but they can't because it depends on something else that bumped the major version and now the interfacing code has to be rewritten.
Go is an ecosystem that values backward compatibility a lot. They are using SemVer as well now but on the other hand they say that modules shouldn't really bump major version that often, if at all (which in turns makes me question whether adopting SemVer has been a good idea, or a compromise that they had to take to concede something to the community subset that was pushing for a more standard package management solution).
I think Qt is a project that uses SemVer (before it was named so!) in the right way. They break major version every 8-10 years, and they struggle a lot to make sure not to do that often. In C++, it's not even easy because of include files and ABI, but they manage to keep the ABI stable across all minor version upgrades, so that you can upgrade a minor of Qt without even recompiling your software using it.