aboutsummaryrefslogtreecommitdiff
path: root/locale/pt/LC_MESSAGES/_articles
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2018-07-17-running-guix-on-nixos.po101
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2018-08-01-verifying-npm-ci-reproducibility.po169
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2018-12-21-using-youtube-dl-to-manage-youtube-subscriptions.po318
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2019-06-02-using-nixos-as-an-stateless-workstation.po196
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-08-10-guix-inside-sourcehut-builds-sr-ht-ci.po82
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-08-31-the-database-i-wish-i-had.po362
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-10-05-cargo2nix-dramatically-simpler-rust-in-nix.po57
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po248
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po416
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-10-20-how-not-to-interview-engineers.po476
10 files changed, 2425 insertions, 0 deletions
diff --git a/locale/pt/LC_MESSAGES/_articles/2018-07-17-running-guix-on-nixos.po b/locale/pt/LC_MESSAGES/_articles/2018-07-17-running-guix-on-nixos.po
new file mode 100644
index 0000000..ad29a0a
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2018-07-17-running-guix-on-nixos.po
@@ -0,0 +1,101 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Running Guix on NixOS\n"
+"date: 2018-07-17\n"
+"layout: post\n"
+"lang: en\n"
+"ref: running-guix-on-nixos"
+msgstr ""
+
+msgid ""
+"I wanted to run Guix on a NixOS machine. Even though the Guix manual "
+"explains how to do it [step by "
+"step](https://www.gnu.org/software/guix/manual/en/html_node/Binary-"
+"Installation.html#Binary-Installation), I needed a few extra ones to make it"
+" work properly."
+msgstr ""
+
+msgid ""
+"I couldn't just install GuixSD because my wireless network card doesn't have"
+" any free/libre drivers (yet)."
+msgstr ""
+
+msgid "Creating `guixbuilder` users"
+msgstr ""
+
+msgid ""
+"Guix requires you to create non-root users that will be used to perform the "
+"builds in the isolated environments."
+msgstr ""
+
+msgid ""
+"The [manual](https://www.gnu.org/software/guix/manual/en/html_node/Build-"
+"Environment-Setup.html#Build-Environment-Setup) already provides you with a "
+"ready to run (as root) command for creating the build users:"
+msgstr ""
+
+msgid ""
+"However, In my personal NixOS I have disabled "
+"[`users.mutableUsers`](https://nixos.org/nixos/manual/index.html#sec-user-"
+"management), which means that even if I run the above command it means that "
+"they'll be removed once I rebuild my OS:"
+msgstr ""
+
+msgid ""
+"Instead of enabling `users.mutableUsers` I could add the Guix users by "
+"adding them to my system configuration:"
+msgstr ""
+
+msgid ""
+"Here I used `fold` and the `//` operator to merge all of the configuration "
+"sets into a single `extraUsers` value."
+msgstr ""
+
+msgid "Creating the `systemd` service"
+msgstr ""
+
+msgid "One other thing missing was the `systemd` service."
+msgstr ""
+
+msgid ""
+"First I couldn't just copy the `.service` file to `/etc` since in NixOS that"
+" folder isn't writable. But also I wanted the service to be better "
+"integrated with the OS."
+msgstr ""
+
+msgid ""
+"That was a little easier than creating the users, all I had to do was "
+"translate the provided [`guix-"
+"daemon.service.in`](https://git.savannah.gnu.org/cgit/guix.git/tree/etc/guix-"
+"daemon.service.in?id=00c86a888488b16ce30634d3a3a9d871ed6734a2) configuration"
+" to an equivalent Nix expression"
+msgstr ""
+
+msgid "This sample `systemd` configuration file became:"
+msgstr ""
+
+msgid ""
+"There you go! After running `sudo nixos-rebuild switch` I could get Guix up "
+"and running:"
+msgstr ""
+
+msgid "Some improvements to this approach are:"
+msgstr ""
+
+msgid ""
+"looking into [NixOS modules](https://nixos.org/nixos/manual/index.html#sec-"
+"writing-modules) and trying to bundle everything together into a single "
+"logical unit;"
+msgstr ""
+
+msgid ""
+"[build Guix from "
+"source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html#Requirements)"
+" and share the Nix store and daemon with Guix."
+msgstr ""
+
+msgid "Happy Guix/Nix hacking!"
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2018-08-01-verifying-npm-ci-reproducibility.po b/locale/pt/LC_MESSAGES/_articles/2018-08-01-verifying-npm-ci-reproducibility.po
new file mode 100644
index 0000000..e1097b7
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2018-08-01-verifying-npm-ci-reproducibility.po
@@ -0,0 +1,169 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Verifying \"npm ci\" reproducibility\n"
+"date: 2018-08-01\n"
+"layout: post\n"
+"lang: en\n"
+"ref: verifying-npm-ci-reproducibility\n"
+"updated_at: 2019-05-22"
+msgstr ""
+
+msgid ""
+"When [npm@5](https://blog.npmjs.org/post/161081169345/v500) came bringing "
+"[package-locks](https://docs.npmjs.com/files/package-locks) with it, I was "
+"confused about the benefits it provided, since running `npm install` more "
+"than once could resolve all the dependencies again and yield yet another "
+"fresh `package-lock.json` file. The message saying \"you should add this "
+"file to version control\" left me hesitant on what to do[^package-lock-"
+"message](The)."
+msgstr ""
+
+msgid ""
+"However the [addition of `npm "
+"ci`](https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-"
+"more-reliable) filled this gap: it's a stricter variation of `npm install` "
+"which guarantees that \"[subsequent installs are able to generate identical "
+"trees](https://docs.npmjs.com/files/package-lock.json)\". But are they "
+"really identical? I could see that I didn't have the same problems of "
+"different installation outputs, but I didn't know for **sure** if it was "
+"really identical."
+msgstr ""
+
+msgid "Computing the hash of a directory's content"
+msgstr ""
+
+msgid ""
+"I quickly searched for a way to check for the hash signature of an entire "
+"directory tree, but I couldn't find one. I've made a poor man's [Merkle "
+"tree](https://en.wikipedia.org/wiki/Merkle_tree) implementation using "
+"`sha256sum` and a few piped commands at the terminal:"
+msgstr ""
+
+msgid "Going through it line by line:"
+msgstr ""
+
+msgid "#1 we define a Bash function called `merkle-tree`;"
+msgstr ""
+
+msgid ""
+"#2 it accepts a single argument: the directory to compute the merkle tree "
+"from. If nothing is given, it runs on the current directory (`.`);"
+msgstr ""
+
+msgid ""
+"#3 we go to the directory, so we don't get different prefixes in `find`'s "
+"output (like `../a/b`);"
+msgstr ""
+
+msgid ""
+"#4 we get all files from the directory tree. Since we're using `sha256sum` "
+"to compute the hash of the file contents, we need to filter out folders from"
+" it;"
+msgstr ""
+
+msgid ""
+"#5 we need to sort the output, since different file systems and `find` "
+"implementations may return files in different orders;"
+msgstr ""
+
+msgid ""
+"#6 we use `xargs` to compute the hash of each file individually through "
+"`sha256sum`. Since a file may contain spaces we need to escape it with "
+"quotes;"
+msgstr ""
+
+msgid ""
+"#7 we compute the hash of the combined hashes. Since `sha256sum` output is "
+"formatted like `<hash> <filename>`, it produces a different final hash if a "
+"file ever changes name without changing it's content;"
+msgstr ""
+
+msgid ""
+"#8 we get the final hash output, excluding the `<filename>` (which is `-` in"
+" this case, aka `stdin`)."
+msgstr ""
+
+msgid "Positive points:"
+msgstr ""
+
+msgid ""
+"ignore timestamp: running more than once on different installation yields "
+"the same hash;"
+msgstr ""
+
+msgid "the name of the file is included in the final hash computation."
+msgstr ""
+
+msgid "Limitations:"
+msgstr ""
+
+msgid "it ignores empty folders from the hash computation;"
+msgstr ""
+
+msgid ""
+"the implementation's only goal is to represent using a digest whether the "
+"content of a given directory is the same or not. Leaf presence checking is "
+"obviously missing from it."
+msgstr ""
+
+msgid "Testing locally with sample data"
+msgstr ""
+
+msgid "It seems to work for this simple test case."
+msgstr ""
+
+msgid "You can try copying and pasting it to verify the hash signatures."
+msgstr ""
+
+msgid "Using `merkle-tree` to check the output of `npm ci`"
+msgstr ""
+
+msgid "*I've done all of the following using Node.js v8.11.3 and npm@6.1.0.*"
+msgstr ""
+
+msgid ""
+"In this test case I'll take the main repo of "
+"[Lerna](https://lernajs.io/)[^lerna-package-lock]:"
+msgstr ""
+
+msgid "Good job `npm ci` :)"
+msgstr ""
+
+msgid ""
+"#6 and #9 take some time to run (21 seconds in my machine), but this "
+"specific use case isn't performance sensitive. The slowest step is computing"
+" the hash of each individual file."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid "`npm ci` really \"generates identical trees\"."
+msgstr ""
+
+msgid ""
+"I'm not aware of any other existing solution for verifying the hash "
+"signature of a directory. If you know any I'd [like to know](mailto:{{ "
+"site.author.email }})."
+msgstr ""
+
+msgid "*Edit*"
+msgstr ""
+
+msgid "2019/05/22: Fix spelling."
+msgstr ""
+
+msgid ""
+"[documentation](https://docs.npmjs.com/cli/install#description) claims `npm "
+"install` is driven by the existing `package-lock.json`, but that's actually "
+"[a little bit "
+"tricky](https://github.com/npm/npm/issues/17979#issuecomment-332701215)."
+msgstr ""
+
+msgid ""
+"[^lerna-package-lock]: Finding a big known repo that actually committed the "
+"`package-lock.json` file was harder than I expected."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2018-12-21-using-youtube-dl-to-manage-youtube-subscriptions.po b/locale/pt/LC_MESSAGES/_articles/2018-12-21-using-youtube-dl-to-manage-youtube-subscriptions.po
new file mode 100644
index 0000000..86f62ae
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2018-12-21-using-youtube-dl-to-manage-youtube-subscriptions.po
@@ -0,0 +1,318 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Using \"youtube-dl\" to manage YouTube subscriptions\n"
+"date: 2018-12-21\n"
+"layout: post\n"
+"lang: en\n"
+"ref: using-youtube-dl-to-manage-youtube-subscriptions"
+msgstr ""
+
+msgid ""
+"I've recently read the "
+"[announcement](https://www.reddit.com/r/DataHoarder/comments/9sg8q5/i_built_a_selfhosted_youtube_subscription_manager/)"
+" of a very nice [self-hosted YouTube subscription "
+"manager](https://github.com/chibicitiberiu/ytsm). I haven't used YouTube's "
+"built-in subscriptions for a while now, and haven't missed it at all. When I"
+" saw the announcement, I considered writing about the solution I've built on"
+" top of [youtube-dl](https://youtube-dl.org/)."
+msgstr ""
+
+msgid "Background: the problem with YouTube"
+msgstr ""
+
+msgid ""
+"In many ways, I agree with [André Staltz's view on data ownership and "
+"privacy](https://staltz.com/what-happens-when-you-block-internet-"
+"giants.html):"
+msgstr ""
+
+msgid ""
+"I started with the basic premise that \"I want to be in control of my "
+"data\". Sometimes that meant choosing when to interact with an internet "
+"giant and how much I feel like revealing to them. Most of times it meant not"
+" interacting with them at all. I don't want to let them be in full control "
+"of how much they can know about me. I don't want to be in autopilot mode. "
+"(...) Which leads us to YouTube. While I was able to find alternatives to "
+"Gmail (Fastmail), Calendar (Fastmail), Translate (Yandex Translate), *etc.* "
+"YouTube remains as the most indispensable Google-owned web service. It is "
+"really really hard to avoid consuming YouTube content. It was probably the "
+"smartest startup acquisition ever. My privacy-oriented alternative is to "
+"watch YouTube videos through Tor, which is technically feasible but not "
+"polite to use the Tor bandwidth for these purposes. I'm still scratching my "
+"head with this issue."
+msgstr ""
+
+msgid ""
+"Even though I don't use most alternative services he mentions, I do watch "
+"videos from YouTube. But I also feel uncomfortable logging in to YouTube "
+"with a Google account, watching videos, creating playlists and similar "
+"things."
+msgstr ""
+
+msgid ""
+"Using the mobile app is worse: you can't even block ads in there. You're in "
+"less control on what you share with YouTube and Google."
+msgstr ""
+
+msgid "youtube-dl"
+msgstr ""
+
+msgid ""
+"youtube-dl is a command-line tool for downloading videos, from YouTube and "
+"[many other sites](https://rg3.github.io/youtube-dl/supportedsites.html):"
+msgstr ""
+
+msgid ""
+"It can be used to download individual videos as showed above, but it also "
+"has some interesting flags that we can use:"
+msgstr ""
+
+msgid ""
+"`--output`: use a custom template to create the name of the downloaded file;"
+msgstr ""
+
+msgid ""
+"`--download-archive`: use a text file for recording and remembering which "
+"videos were already downloaded;"
+msgstr ""
+
+msgid ""
+"`--prefer-free-formats`: prefer free video formats, like `webm`, `ogv` and "
+"Matroska `mkv`;"
+msgstr ""
+
+msgid ""
+"`--playlist-end`: how many videos to download from a \"playlist\" (a "
+"channel, a user or an actual playlist);"
+msgstr ""
+
+msgid ""
+"`--write-description`: write the video description to a `.description` file,"
+" useful for accessing links and extra content."
+msgstr ""
+
+msgid "Putting it all together:"
+msgstr ""
+
+msgid ""
+"This will download the latest 20 videos from the selected channel, and write"
+" down the video IDs in the `youtube-dl-seen.conf` file. Running it "
+"immediately after one more time won't have any effect."
+msgstr ""
+
+msgid ""
+"If the channel posts one more video, running the same command again will "
+"download only the last video, since the other 19 were already downloaded."
+msgstr ""
+
+msgid ""
+"With this basic setup you have a minimal subscription system at work, and "
+"you can create some functions to help you manage that:"
+msgstr ""
+
+msgid ""
+"With these functions, you now can have a subscription fetching script to "
+"download the latest videos from your favorite channels:"
+msgstr ""
+
+msgid ""
+"Now, whenever you want to watch the latest videos, just run the above script"
+" and you'll get all of them in your local machine."
+msgstr ""
+
+msgid "Tradeoffs"
+msgstr ""
+
+msgid "I've made it for myself, with my use case in mind"
+msgstr ""
+
+msgid "Offline"
+msgstr ""
+
+msgid ""
+"My internet speed it somewhat reasonable[^internet-speed], but it is really "
+"unstable. Either at work or at home, it's not uncommon to loose internet "
+"access for 2 minutes 3~5 times every day, and stay completely offline for a "
+"couple of hours once every week."
+msgstr ""
+
+msgid ""
+"Working through the hassle of keeping a playlist on disk has payed off many,"
+" many times. Sometimes I even not notice when the connection drops for some "
+"minutes, because I'm watching a video and working on some document, all on "
+"my local computer."
+msgstr ""
+
+msgid ""
+"There's also no quality adjustment for YouTube's web player, I always pick "
+"the higher quality and it doesn't change during the video. For some types of"
+" content, like a podcast with some tiny visual resources, this doesn't "
+"change much. For other types of content, like a keynote presentation with "
+"text written on the slides, watching on 144p isn't really an option."
+msgstr ""
+
+msgid ""
+"If the internet connection drops during the video download, youtube-dl will "
+"resume from where it stopped."
+msgstr ""
+
+msgid ""
+"This is an offline first benefit that I really like, and works well for me."
+msgstr ""
+
+msgid "Sync the \"seen\" file"
+msgstr ""
+
+msgid ""
+"I already have a running instance of Nextcloud, so just dumping the "
+"`youtube-dl-seen.conf` file inside Nextcloud was a no-brainer."
+msgstr ""
+
+msgid ""
+"You could try putting it in a dedicated git repository, and wrap the script "
+"with an autocommit after every run. If you ever had a merge conflict, you'd "
+"simply accept all changes and then run:"
+msgstr ""
+
+msgid "to tidy up the file."
+msgstr ""
+
+msgid "Doesn't work on mobile"
+msgstr ""
+
+msgid ""
+"My primary device that I use everyday is my laptop, not my phone. It works "
+"well for me this way."
+msgstr ""
+
+msgid ""
+"Also, it's harder to add ad-blockers to mobile phones, and most mobile "
+"software still depends on Google's and Apple's blessing."
+msgstr ""
+
+msgid ""
+"If you wish, you can sync the videos to the SD card periodically, but that's"
+" a bit of extra manual work."
+msgstr ""
+
+msgid "The Good"
+msgstr ""
+
+msgid "Better privacy"
+msgstr ""
+
+msgid ""
+"We don't even have to configure the ad-blocker to keep ads and trackers "
+"away!"
+msgstr ""
+
+msgid ""
+"YouTube still has your IP address, so using a VPN is always a good idea. "
+"However, a timing analysis would be able to identify you (considering the "
+"current implementation)."
+msgstr ""
+
+msgid "No need to self-host"
+msgstr ""
+
+msgid "There's no host that needs maintenance. Everything runs locally."
+msgstr ""
+
+msgid ""
+"As long as you keep youtube-dl itself up to date and sync your \"seen\" "
+"file, there's little extra work to do."
+msgstr ""
+
+msgid "Track your subscriptions with git"
+msgstr ""
+
+msgid ""
+"After creating a `subscriptions.sh` executable that downloads all the "
+"videos, you can add it to git and use it to track metadata about your "
+"subscriptions."
+msgstr ""
+
+msgid "The Bad"
+msgstr ""
+
+msgid "Maximum playlist size is your disk size"
+msgstr ""
+
+msgid ""
+"This is a good thing for getting a realistic view on your actual \"watch "
+"later\" list. However I've run out of disk space many times, and now I need "
+"to be more aware of how much is left."
+msgstr ""
+
+msgid "The Ugly"
+msgstr ""
+
+msgid ""
+"We can only avoid all the bad parts of YouTube with youtube-dl as long as "
+"YouTube keeps the videos public and programmatically accessible. If YouTube "
+"ever blocks that we'd loose the ability to consume content this way, but "
+"also loose confidence on considering YouTube a healthy repository of videos "
+"on the internet."
+msgstr ""
+
+msgid "Going beyond"
+msgstr ""
+
+msgid ""
+"Since you're running everything locally, here are some possibilities to be "
+"explored:"
+msgstr ""
+
+msgid "A playlist that is too long for being downloaded all at once"
+msgstr ""
+
+msgid ""
+"You can wrap the `download_playlist` function (let's call the wrapper "
+"`inc_download`) and instead of passing it a fixed number to the `--playlist-"
+"end` parameter, you can store the `$n` in a folder (something like "
+"`$HOME/.yt-db/$PLAYLIST_ID`) and increment it by `$step` every time you run "
+"`inc_download`."
+msgstr ""
+
+msgid ""
+"This way you can incrementally download videos from a huge playlist without "
+"filling your disk with gigabytes of content all at once."
+msgstr ""
+
+msgid "Multiple computer scenario"
+msgstr ""
+
+msgid ""
+"The `download_playlist` function could be aware of the specific machine that"
+" it is running on and apply specific policies depending on the machine: "
+"always download everything; only download videos that aren't present "
+"anywhere else; *etc.*"
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"youtube-dl is a great tool to keep at hand. It covers a really large range "
+"of video websites and works robustly."
+msgstr ""
+
+msgid ""
+"Feel free to copy and modify this code, and [send me](mailto:{{ "
+"site.author.email }}) suggestions of improvements or related content."
+msgstr ""
+
+msgid "*Edit*"
+msgstr ""
+
+msgid "2019/05/22: Fix spelling."
+msgstr ""
+
+msgid ""
+"[^internet-speed]: Considering how expensive it is and the many ways it "
+"could be better, but also how much it has improved over the last years, I "
+"say it's reasonable."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2019-06-02-using-nixos-as-an-stateless-workstation.po b/locale/pt/LC_MESSAGES/_articles/2019-06-02-using-nixos-as-an-stateless-workstation.po
new file mode 100644
index 0000000..6aaef22
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2019-06-02-using-nixos-as-an-stateless-workstation.po
@@ -0,0 +1,196 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Using NixOS as an stateless workstation\n"
+"date: 2019-06-02\n"
+"layout: post\n"
+"lang: en\n"
+"ref: using-nixos-as-an-stateless-workstation"
+msgstr ""
+
+msgid ""
+"Last week[^last-week] I changed back to an old[^old-computer] Samsung "
+"laptop, and installed [NixOS](https://nixos.org/) on it."
+msgstr ""
+
+msgid ""
+"After using NixOS on another laptop for around two years, I wanted verify "
+"how reproducible was my desktop environment, and how far does NixOS actually"
+" can go on recreating my whole OS from my configuration files and personal "
+"data. I gravitated towards NixOS after trying (and failing) to create an "
+"`install.sh` script that would imperatively install and configure my whole "
+"OS using apt-get. When I found a GNU/Linux distribution that was built on "
+"top of the idea of declaratively specifying the whole OS I was automatically"
+" convinced[^convinced-by-declarative-aspect]."
+msgstr ""
+
+msgid ""
+"I was impressed. Even though I've been experiencing the benefits of Nix "
+"isolation daily, I always felt skeptical that something would be missing, "
+"because the devil is always on the details. But the result was much better "
+"than expected!"
+msgstr ""
+
+msgid "There were only 2 missing configurations:"
+msgstr ""
+
+msgid "tap-to-click on the touchpad wasn't enabled by default;"
+msgstr ""
+
+msgid ""
+"the default theme from the gnome-terminal is \"Black on white\" instead of "
+"\"White on black\"."
+msgstr ""
+
+msgid "That's all."
+msgstr ""
+
+msgid ""
+"I haven't checked if I can configure those in NixOS GNOME module, but I "
+"guess both are scriptable and could be set in a fictional `setup.sh` run."
+msgstr ""
+
+msgid "This makes me really happy, actually. More happy than I anticipated."
+msgstr ""
+
+msgid ""
+"Having such a powerful declarative OS makes me feel like my data is the "
+"really important stuff (as it should be), and I can interact with it on any "
+"workstation. All I need is an internet connection and a few hours to "
+"download everything. It feels like my physical workstation and the installed"
+" OS are serving me and my data, instead of me feeling as hostage to the "
+"specific OS configuration at the moment. Having a few backup copies of "
+"everything important extends such peacefulness."
+msgstr ""
+
+msgid ""
+"After this positive experience with recreating my OS from simple Nix "
+"expressions, I started to wonder how far I could go with this, and started "
+"considering other areas of improvements:"
+msgstr ""
+
+msgid "First run on a fresh NixOS installation"
+msgstr ""
+
+msgid ""
+"Right now the initial setup relies on non-declarative manual tasks, like "
+"decrypting some credentials, or manually downloading **this** git repository"
+" with specific configurations before **that** one."
+msgstr ""
+
+msgid ""
+"I wonder what some areas of improvements are on this topic, and if investing"
+" on it is worth it (both time-wise and happiness-wise)."
+msgstr ""
+
+msgid "Emacs"
+msgstr ""
+
+msgid ""
+"Right now I'm using the [Spacemacs](http://spacemacs.org/), which is a "
+"community package curation and configuration on top of "
+"[Emacs](https://www.gnu.org/software/emacs/)."
+msgstr ""
+
+msgid ""
+"Spacemacs does support the notion of "
+"[layers](http://spacemacs.org/doc/LAYERS.html), which you can declaratively "
+"specify and let Spacemacs do the rest."
+msgstr ""
+
+msgid ""
+"However this solution isn't nearly as robust as Nix: being purely "
+"functional, Nix does describe everything required to build a derivation, and"
+" knows how to do so. Spacemacs it closer to more traditional package "
+"managers: even though the layers list is declarative, the installation is "
+"still very much imperative. I've had trouble with Spacemacs not behaving the"
+" same on different computers, both with identical configurations, only "
+"brought to convergence back again after a `git clean -fdx` inside "
+"`~/.emacs.d/`."
+msgstr ""
+
+msgid ""
+"The ideal solution would be managing Emacs packages with Nix itself. After a"
+" quick search I did found that [there is support for Emacs packages in "
+"Nix](https://nixos.org/nixos/manual/index.html#module-services-emacs-adding-"
+"packages). So far I was only aware of [Guix support for Emacs "
+"packages](https://www.gnu.org/software/guix/manual/en/html_node/Application-"
+"Setup.html#Emacs-Packages)."
+msgstr ""
+
+msgid ""
+"This isn't a trivial change because Spacemacs does include extra curation "
+"and configuration on top of Emacs packages. I'm not sure the best way to "
+"improve this right now."
+msgstr ""
+
+msgid "myrepos"
+msgstr ""
+
+msgid ""
+"I'm using [myrepos](https://myrepos.branchable.com/) to manage all my git "
+"repositories, and the general rule I apply is to add any repository specific"
+" configuration in myrepos' `checkout` phase:"
+msgstr ""
+
+msgid ""
+"This way when I clone this repo again the email sending is already pre-"
+"configured."
+msgstr ""
+
+msgid ""
+"This works well enough, but the solution is too imperative, and my "
+"`checkout` phases tend to become brittle over time if not enough care is "
+"taken."
+msgstr ""
+
+msgid "GNU Stow"
+msgstr ""
+
+msgid ""
+"For my home profile and personal configuration I already have a few dozens "
+"of symlinks that I manage manually. This has worked so far, but the solution"
+" is sometimes fragile and [not declarative at "
+"all](https://git.sr.ht/~euandreh/dotfiles/tree/316939aa215181b1d22b69e94241eef757add98d/bash/symlinks.sh#L14-75)."
+" I wonder if something like [GNU Stow](https://www.gnu.org/software/stow/) "
+"can help me simplify this."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"I'm really satisfied with NixOS, and I intend to keep using it. If what I've"
+" said interests you, maybe try tinkering with the [Nix package "
+"manager](https://nixos.org/nix/) (not the whole NixOS) on your current "
+"distribution (it can live alongside any other package manager)."
+msgstr ""
+
+msgid ""
+"If you have experience with declarative Emacs package managements, GNU Stow "
+"or any similar tool, *etc.*, [I'd like some tips](mailto:{{ "
+"site.author.email }}). If you don't have any experience at all, I'd still "
+"love to hear from you."
+msgstr ""
+
+msgid ""
+"[^last-week]: \"Last week\" as of the start of this writing, so around the "
+"end of May 2019."
+msgstr ""
+
+msgid ""
+"[^old-computer]: I was using a 32GB RAM, i7 and 250GB SSD Samsung laptop. "
+"The switch was back to a 8GB RAM, i5 and 500GB HDD Dell laptop. The biggest "
+"difference I noticed was on faster memory, both RAM availability and the "
+"disk speed, but I had 250GB less local storage space."
+msgstr ""
+
+msgid ""
+"[^convinced-by-declarative-aspect]: The declarative configuration aspect is "
+"something that I now completely take for granted, and wouldn't consider "
+"using something which isn't declarative. A good metric to show this is me "
+"realising that I can't pinpoint the moment when I decided to switch to "
+"NixOS. It's like I had a distant past when this wasn't true."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-08-10-guix-inside-sourcehut-builds-sr-ht-ci.po b/locale/pt/LC_MESSAGES/_articles/2020-08-10-guix-inside-sourcehut-builds-sr-ht-ci.po
new file mode 100644
index 0000000..64bc417
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-08-10-guix-inside-sourcehut-builds-sr-ht-ci.po
@@ -0,0 +1,82 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Guix inside sourcehut builds.sr.ht CI\n"
+"date: 2020-08-10\n"
+"updated_at: 2020-08-19\n"
+"layout: post\n"
+"lang: en\n"
+"ref: guix-inside-sourcehut-builds-sr-ht-ci"
+msgstr ""
+
+msgid ""
+"After the release of the [NixOS images in "
+"builds.sr.ht](https://man.sr.ht/builds.sr.ht/compatibility.md#nixos) and "
+"much usage of it, I also started looking at [Guix](https://guix.gnu.org/) "
+"and wondered if I could get it on the awesome builds.sr.ht service."
+msgstr ""
+
+msgid ""
+"The Guix manual section on the [binary "
+"installation](https://guix.gnu.org/manual/en/guix.html#Binary-Installation) "
+"is very thorough, and even a [shell installer "
+"script](https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-"
+"install.sh) is provided, but it is built towards someone installing Guix on "
+"their personal computer, and relies heavily on interactive input."
+msgstr ""
+
+msgid ""
+"I developed the following set of scripts that I have been using for some "
+"time to run Guix tasks inside builds.sr.ht jobs. First, `install-guix.sh`:"
+msgstr ""
+
+msgid ""
+"Almost all of it is taken directly from the [binary "
+"installation](https://guix.gnu.org/manual/en/guix.html#Binary-Installation) "
+"section from the manual, with the interactive bits stripped out: after "
+"downloading and extracting the Guix tarball, we create some symlinks, add "
+"guixbuild users and authorize the `ci.guix.gnu.org.pub` signing key."
+msgstr ""
+
+msgid ""
+"After installing Guix, we perform a `guix pull` to update Guix inside "
+"`start-guix.sh`:"
+msgstr ""
+
+msgid ""
+"Then we can put it all together in a sample `.build.yml` configuration file "
+"I'm using myself:"
+msgstr ""
+
+msgid ""
+"We have to add the `guix-daemon` to `~/.buildenv` so it can be started on "
+"every following task run. Also, since we used `wget` inside `install-"
+"guix.sh`, we had to add it to the images package list."
+msgstr ""
+
+msgid ""
+"After the `install-guix` task, you can use Guix to build and test your "
+"project, or run any `guix environment --ad-hoc my-package -- my script` :)"
+msgstr ""
+
+msgid "Improvements"
+msgstr ""
+
+msgid ""
+"When I originally created this code I had a reason why to have both a `sudo`"
+" call for `sudo ./scripts/install-guix.sh` and `sudo` usages inside "
+"`install-guix.sh` itself. I couldn't figure out why (it feels like my past "
+"self was a bit smarter 😬), but it feels ugly now. If it is truly required I "
+"could add an explanation for it, or remove this entirely in favor of a more "
+"elegant solution."
+msgstr ""
+
+msgid ""
+"I could also contribute the Guix image upstream to builds.sr.ht, but there "
+"wasn't any build or smoke tests in the original "
+"[repository](https://git.sr.ht/~sircmpwn/builds.sr.ht), so I wasn't inclined"
+" to make something that just \"works on my machine\" or add a maintainence "
+"burden to the author. I didn't look at it again recently, though."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-08-31-the-database-i-wish-i-had.po b/locale/pt/LC_MESSAGES/_articles/2020-08-31-the-database-i-wish-i-had.po
new file mode 100644
index 0000000..58de095
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-08-31-the-database-i-wish-i-had.po
@@ -0,0 +1,362 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: The database I wish I had\n"
+"date: 2020-08-31\n"
+"updated_at: 2020-09-03\n"
+"layout: post\n"
+"lang: en\n"
+"ref: the-database-i-wish-i-had\n"
+"category: mediator"
+msgstr ""
+
+msgid ""
+"I watched the talk \"[Platform as a Reflection of Values: Joyent, Node.js "
+"and beyond](https://vimeo.com/230142234)\" by Bryan Cantrill, and I think he"
+" was able to put into words something I already felt for some time: if "
+"there's no piece of software out there that reflects your values, it's time "
+"for you to build that software[^talk-time]."
+msgstr ""
+
+msgid ""
+"[^talk-time]: At the very end, at time 29:49. When talking about the draft "
+"of this article with a friend, he noted that Bryan O'Sullivan (a different "
+"Bryan) says a similar thing on his talk \"[Running a startup on "
+"Haskell](https://www.youtube.com/watch?v=ZR3Jirqk6W8)\", at time 4:15."
+msgstr ""
+
+msgid ""
+"I kind of agree with what he said, because this is already happening to me. "
+"I long for a database with a certain set of values, and for a few years I "
+"was just waiting for someone to finally write it. After watching his talk, "
+"Bryan is saying to me: \"time to stop waiting, and start writing it "
+"yourself\"."
+msgstr ""
+
+msgid ""
+"So let me try to give an overview of such database, and go over its values."
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid ""
+"I want a database that allows me to create decentralized client-side "
+"applications that can sync data."
+msgstr ""
+
+msgid "The best one-line description I can give right now is:"
+msgstr ""
+
+msgid "It's sort of like PouchDB, Git, Datomic, SQLite and Mentat."
+msgstr ""
+
+msgid "A more descriptive version could be:"
+msgstr ""
+
+msgid "An embedded, immutable, syncable relational database."
+msgstr ""
+
+msgid "Let's go over what I mean by each of those aspects one by one."
+msgstr ""
+
+msgid "Embedded"
+msgstr ""
+
+msgid ""
+"I think the server-side database landscape is diverse and mature enough for "
+"my needs (even though I end up choosing SQLite most of the time), and what "
+"I'm after is a database to be embedded on client-side applications itself, "
+"be it desktop, browser, mobile, *etc.*"
+msgstr ""
+
+msgid ""
+"The purpose of such database is not to keep some local cache of data in case"
+" of lost connectivity: we have good solutions for that already. It should "
+"serve as the source of truth, and allow the application to work on top of "
+"it."
+msgstr ""
+
+msgid ""
+"[**SQLite**](https://sqlite.org/index.html) is a great example of that: it "
+"is a very powerful relational database that runs [almost "
+"anywhere](https://sqlite.org/whentouse.html). What I miss from it that "
+"SQLite doesn't provide is the ability to run it on the browser: even though "
+"you could compile it to WebAssembly, ~~it assumes a POSIX filesystem that "
+"would have to be emulated~~[^posix-sqlite]."
+msgstr ""
+
+msgid ""
+"[^posix-sqlite]: It was [pointed out to "
+"me](https://news.ycombinator.com/item?id=24338881) that SQLite doesn't "
+"assume the existence of a POSIX filesystem, as I wrongly stated. Thanks for "
+"the correction."
+msgstr ""
+
+msgid ""
+"[**PouchDB**](https://pouchdb.com/) is another great example: it's a full "
+"reimplementation of [CouchDB](https://couchdb.apache.org/) that targets "
+"JavaScript environments, mainly the browser and Node.js. However I want a "
+"tool that can be deployed anywhere, and not limit its applications to places"
+" that already have a JavaScript runtime environment, or force the developer "
+"to bundle a JavaScript runtime environment with their application. This is "
+"true for GTK+ applications, command line programs, Android apps, *etc.*"
+msgstr ""
+
+msgid ""
+"[**Mentat**](https://github.com/mozilla/mentat) was an interesting project, "
+"but its reliance on SQLite makes it inherit most of the downsides (and "
+"benefits too) of SQLite itself."
+msgstr ""
+
+msgid ""
+"Having such a requirement imposes a different approach to storage: we have "
+"to decouple the knowledge about the intricacies of storage from the usage of"
+" storage itself, so that a module (say query processing) can access storage "
+"through an API without needing to know about its implementation. This allows"
+" the database to target a POSIX filesystems storage API and an IndexedDB "
+"storage API, and make the rest of the code agnostic about storage. PouchDB "
+"has such mechanism (called [adapters](https://pouchdb.com/adapters.html)) "
+"and Datomic has them too (called [storage "
+"services](https://docs.datomic.com/on-prem/storage.html))."
+msgstr ""
+
+msgid ""
+"This would allow the database to adapt to where it is embedded: when "
+"targeting the browser the IndexedDB storage API would provide the "
+"persistence layer that the database requires, and similarly the POSIX "
+"filesystem storage API would provide the persistence layer when targeting "
+"POSIX systems (like desktops, mobile, *etc.*)."
+msgstr ""
+
+msgid ""
+"But there's also an extra restriction that comes from by being embedded: it "
+"needs to provide and embeddable artifact, most likely a binary library "
+"object that exposes a C compatible FFI, similar to [how SQLite "
+"does](https://www.sqlite.org/amalgamation.html). Bundling a full runtime "
+"environment is possible, but doesn't make it a compelling solution for "
+"embedding. This rules out most languages, and leaves us with C, Rust, Zig, "
+"and similar options that can target POSIX systems and WebAssembly."
+msgstr ""
+
+msgid "Immutable"
+msgstr ""
+
+msgid ""
+"Being immutable means that only new information is added, no in-place update"
+" ever happens, and nothing is ever deleted."
+msgstr ""
+
+msgid ""
+"Having an immutable database presents us with similar trade-offs found in "
+"persistent data structures, like lack of coordination when doing reads, "
+"caches being always coherent, and more usage of space."
+msgstr ""
+
+msgid ""
+"[**Datomic**](https://www.datomic.com/) is the go to database example of "
+"this: it will only add information (datoms) and allows you to query them in "
+"a multitude of ways. Stuart Halloway calls it \"accumulate-only\" over "
+"\"append-only\"[^accumulate-only](Video \"[Day of Datomic Part "
+"2](https://vimeo.com/116315075)\"):"
+msgstr ""
+
+msgid ""
+"It's accumulate-only, it is not append-only. So append-only, most people "
+"when they say that they're implying something physical about what happens."
+msgstr ""
+
+msgid "on Datomic's information model, at time 12:28."
+msgstr ""
+
+msgid ""
+"Also a database can be append-only and overwrite existing information with "
+"new information, by doing clean-ups of \"stale\" data. I prefer to adopt the"
+" \"accumulate-only\" naming and approach."
+msgstr ""
+
+msgid ""
+"[**Git**](https://git-scm.com/) is another example of this: new commits are "
+"always added on top of the previous data, and it grows by adding commits "
+"instead of replacing existing ones."
+msgstr ""
+
+msgid ""
+"Git repositories can only grow in size, and that is not only an acceptable "
+"condition, but also one of the reasons to use it."
+msgstr ""
+
+msgid ""
+"All this means that no in-place updates happens on data, and the database "
+"will be much more concerned about how compact and efficiently it stores data"
+" than how fast it does writes to disk. Being embedded, the storage "
+"limitation is either a) how much storage the device has or b) how much "
+"storage was designed for the application to consume. So even though the "
+"database could theoretically operate with hundreds of TBs, a browser page or"
+" mobile application wouldn't have access to this amount of storage. SQLite "
+"even [says](https://sqlite.org/limits.html) that it does support "
+"approximately 280 TBs of data, but those limits are untested."
+msgstr ""
+
+msgid ""
+"The upside of keeping everything is that you can have historical views of "
+"your data, which is very powerful. This also means that applications should "
+"turn this off when not relevant[^no-history]."
+msgstr ""
+
+msgid ""
+"[^no-history]: Similar to [Datomic's "
+"`:db/noHistory`](https://docs.datomic.com/cloud/best.html#nohistory-for-"
+"high-churn)."
+msgstr ""
+
+msgid "Syncable"
+msgstr ""
+
+msgid ""
+"This is a frequent topic when talking about offline-first solutions. When "
+"building applications that:"
+msgstr ""
+
+msgid "can fully work offline,"
+msgstr ""
+
+msgid "stores data,"
+msgstr ""
+
+msgid "propagates that data to other application instances,"
+msgstr ""
+
+msgid ""
+"then you'll need a conflict resolution strategy to handle all the situations"
+" where different application instances disagree. Those application instances"
+" could be a desktop and a browser version of the same application, or the "
+"same mobile app in different devices."
+msgstr ""
+
+msgid ""
+"A three-way merge seems to be the best approach, on top of which you could "
+"add application specific conflict resolution functions, like:"
+msgstr ""
+
+msgid "pick the change with higher timestamp;"
+msgstr ""
+
+msgid "if one change is a delete, pick it;"
+msgstr ""
+
+msgid "present the diff on the screen and allow the user to merge them."
+msgstr ""
+
+msgid ""
+"Some databases try to make this \"easy\", by choosing a strategy for you, "
+"but I've found that different applications require different conflict "
+"resolution strategies. Instead, the database should leave this up to the "
+"user to decide, and provide tools for them to do it."
+msgstr ""
+
+msgid ""
+"[**Three-way merges in version "
+"control**](https://en.wikipedia.org/wiki/Merge_(version_control)) are the "
+"best example, performing automatic merges when possible and asking the user "
+"to resolve conflicts when they appear."
+msgstr ""
+
+msgid ""
+"The unit of conflict for a version control system is a line of text. The "
+"database equivalent would probably be a single attribute, not a full entity "
+"or a full row."
+msgstr ""
+
+msgid ""
+"Making all the conflict resolution logic be local should allow the database "
+"to have encrypted remotes similar to how [git-remote-"
+"gcrypt](https://spwhitton.name/tech/code/git-remote-gcrypt/) adds this "
+"functionality to Git. This would enable users to sync the application data "
+"across devices using an untrusted intermediary."
+msgstr ""
+
+msgid "Relational"
+msgstr ""
+
+msgid "I want the power of relational queries on the client applications."
+msgstr ""
+
+msgid ""
+"Most of the arguments against traditional table-oriented relational "
+"databases are related to write performance, but those don't apply here. The "
+"bottlenecks for client applications usually aren't write throughput. Nobody "
+"is interested in differentiating between 1 MB/s or 10 MB/s when you're "
+"limited to 500 MB total."
+msgstr ""
+
+msgid ""
+"The relational model of the database could either be based on SQL and tables"
+" like in SQLite, or maybe [datalog](https://docs.datomic.com/on-"
+"prem/query.html) and [datoms](https://docs.datomic.com/cloud/whatis/data-"
+"model.html#datoms) like in Datomic."
+msgstr ""
+
+msgid "From aspects to values"
+msgstr ""
+
+msgid ""
+"Now let's try to translate the aspects above into values, as suggested by "
+"Bryan Cantrill."
+msgstr ""
+
+msgid "Portability"
+msgstr ""
+
+msgid ""
+"Being able to target so many different platforms is a bold goal, and the "
+"embedded nature of the database demands portability to be a core value."
+msgstr ""
+
+msgid "Integrity"
+msgstr ""
+
+msgid ""
+"When the local database becomes the source of truth of the application, it "
+"must provide consistency guarantees that enables applications to rely on it."
+msgstr ""
+
+msgid "Expressiveness"
+msgstr ""
+
+msgid ""
+"The database should empower applications to slice and dice the data in any "
+"way it wants to."
+msgstr ""
+
+msgid "Next steps"
+msgstr ""
+
+msgid ""
+"Since I can't find any database that fits these requirements, I've finally "
+"come to terms with doing it myself."
+msgstr ""
+
+msgid ""
+"It's probably going to take me a few years to do it, and making it portable "
+"between POSIX and IndexedDB will probably be the biggest challenge. I got "
+"myself a few books on databases to start."
+msgstr ""
+
+msgid "I wonder if I'll ever be able to get this done."
+msgstr ""
+
+msgid "External links"
+msgstr ""
+
+msgid ""
+"See discussions on "
+"[Reddit](https://www.reddit.com/r/programming/comments/ijwz5b/the_database_i_wish_i_had/),"
+" [lobsters](https://lobste.rs/s/m9vkg4/database_i_wish_i_had), "
+"[HN](https://news.ycombinator.com/item?id=24337244) and [a lengthy email "
+"exchange](https://lists.sr.ht/~euandreh/public-"
+"inbox/%3C010101744a592b75-1dce9281-f0b8-4226-9d50-fd2c7901fa72-000000%40us-"
+"west-2.amazonses.com%3E)."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-10-05-cargo2nix-dramatically-simpler-rust-in-nix.po b/locale/pt/LC_MESSAGES/_articles/2020-10-05-cargo2nix-dramatically-simpler-rust-in-nix.po
new file mode 100644
index 0000000..8c0231c
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-10-05-cargo2nix-dramatically-simpler-rust-in-nix.po
@@ -0,0 +1,57 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: \"cargo2nix: Dramatically simpler Rust in Nix\"\n"
+"date: 2020-10-05 2\n"
+"layout: post\n"
+"lang: en\n"
+"ref: cargo2nix-dramatically-simpler-rust-in-nix\n"
+"category: mediator"
+msgstr ""
+
+msgid ""
+"In the same vein of my earlier post on [swift2nix]({% link "
+"_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.md %}), I was "
+"able to quickly prototype a Rust and Cargo variation of it: "
+"[cargo2nix](https://git.euandreh.xyz/cargo2nix/about/)."
+msgstr ""
+
+msgid ""
+"The initial prototype is even smaller than swift2nix: it has only [37 lines "
+"of "
+"code](https://git.euandreh.xyz/cargo2nix/tree/default.nix?id=472dde8898296c8b6cffcbd10b3b2c3ba195846d)."
+msgstr ""
+
+msgid "Here's how to use it (snippet taken from the repo's README):"
+msgstr ""
+
+msgid ""
+"That `cargo test` part on line 20 is what I have been fighting with every "
+"\"\\*2nix\" available for Rust out there. I don't want to bash any of them. "
+"All I want is to have full control of what Cargo commands to run, and the "
+"\"*2nix\" tool should only setup the environment for me. Let me drive Cargo "
+"myself, no need to parameterize how the tool runs it for me, or even "
+"replicate its internal behaviour by calling the Rust compiler directly."
+msgstr ""
+
+msgid ""
+"Sure it doesn't support private registries or Git dependencies, but how much"
+" bigger does it has to be to support them? Also, it doesn't support those "
+"**yet**, there's no reason it can't be extended. I just haven't needed it "
+"yet, so I haven't added. Patches welcome."
+msgstr ""
+
+msgid ""
+"The layout of the `vendor/` directory is more explicit and public then what "
+"swift2nix does: it is whatever the command `cargo vendor` returns. However I"
+" haven't checked if the shape of the `.cargo-checksum.json` is specified, or"
+" internal to Cargo."
+msgstr ""
+
+msgid "Try out the demo (also taken from the repo's README):"
+msgstr ""
+
+msgid "Report back if you wish. Again, patches welcome."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po b/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
new file mode 100644
index 0000000..e9dbef6
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
@@ -0,0 +1,248 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: \"swift2nix: Run Swift inside Nix builds\"\n"
+"date: 2020-10-05 1\n"
+"layout: post\n"
+"lang: en\n"
+"ref: swift2nix-run-swift-inside-nix-builds\n"
+"category: mediator"
+msgstr ""
+
+msgid ""
+"While working on a Swift project, I didn't find any tool that would allow "
+"Swift to run inside [Nix](https://nixos.org/) builds. Even thought you *can*"
+" run Swift, the real problem arises when using the package manager. It has "
+"many of the same problems that other package managers have when trying to "
+"integrate with Nix, more on this below."
+msgstr ""
+
+msgid ""
+"I wrote a simple little tool called "
+"[swift2nix](https://git.euandreh.xyz/swift2nix/about/) that allows you trick"
+" Swift's package manager into assuming everything is set up. Here's the "
+"example from swift2nix's README file:"
+msgstr ""
+
+msgid ""
+"The key parts are lines 15~17: we just fake enough files inside `.build/` "
+"that Swift believes it has already downloaded and checked-out all "
+"dependencies, and just moves on to building them."
+msgstr ""
+
+msgid ""
+"I've worked on it just enough to make it usable for myself, so beware of "
+"unimplemented cases. Patches welcome."
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid ""
+"What swift2nix does is just provide you with the bare minimum that Swift "
+"requires, and readily get out of the way:"
+msgstr ""
+
+msgid ""
+"I explicitly did not want to generated a `Package.nix` file, since "
+"`Package.resolved` already exists and contains the required information;"
+msgstr ""
+
+msgid ""
+"I didn't want to have an \"easy\" interface right out of the gate, after "
+"fighting with \"*2nix\" tools that focus too much on that."
+msgstr ""
+
+msgid ""
+"The final [actual "
+"code](https://git.euandreh.xyz/swift2nix/tree/default.nix?id=2af83ffe43fac631a8297ffaa8be3ff93b2b9e7c)"
+" was so small (46 lines) that it made me think about package managers, "
+"\"*2nix\" tools and some problems with many of them."
+msgstr ""
+
+msgid "Problems with package managers"
+msgstr ""
+
+msgid ""
+"I'm going to talk about solely language package managers. Think npm and "
+"cargo, not apt-get."
+msgstr ""
+
+msgid ""
+"Package managers want to do too much, or assume too much, or just want to "
+"take control of the entire build of the dependencies."
+msgstr ""
+
+msgid ""
+"This is a recurrent problem in package managers, but I don't see it as an "
+"intrinsic one. There's nothing about a \"package manager\" that prevents it "
+"from *declaring* what it expects to encounter and in which format. The "
+"*declaring* part is important: it should be data, not code, otherwise you're"
+" back in the same problem, just like lockfiles are just data. Those work in "
+"any language, and tools can cooperate happily."
+msgstr ""
+
+msgid ""
+"There's no need for this declarative expectation to be standardized, or be "
+"made compatible across languages. That would lead to a poor format that no "
+"package manager really likes. Instead, If every package manager could say "
+"out loud what it wants to see exactly, than more tools like swift2nix could "
+"exist, and they would be more reliable."
+msgstr ""
+
+msgid ""
+"This could even work fully offline, and be simply a mapping from the "
+"lockfile (the `Package.resolved` in Swift's case) to the filesystem "
+"representation. For Swift, the `.build/dependencies-state.json` comes very "
+"close, but it is internal to the package manager."
+msgstr ""
+
+msgid ""
+"Even though this pain only exists when trying to use Swift inside Nix, it "
+"sheds light into this common implicit coupling that package managers have. "
+"They usually have fuzzy boundaries and tight coupling between:"
+msgstr ""
+
+msgid ""
+"resolving the dependency tree and using some heuristic to pick a package "
+"version;"
+msgstr ""
+
+msgid "generating a lockfile with the exact pinned versions;"
+msgstr ""
+
+msgid ""
+"downloading the dependencies present on the lockfile into some local cache;"
+msgstr ""
+
+msgid ""
+"arranging the dependencies from the cache in a meaningful way for itself "
+"inside the project;"
+msgstr ""
+
+msgid "work using the dependencies while *assuming* that step 4 was done."
+msgstr ""
+
+msgid ""
+"When you run `npm install` in a repository with no lockfile, it does 1~~4. "
+"If you do the same with `cargo build`, it does 1~~5. That's too much: many "
+"of those assumptions are implicit and internal to the package manager, and "
+"if you ever need to rearrange them, you're on your own. Even though you can "
+"perform some of those steps, you can't compose or rearrange them."
+msgstr ""
+
+msgid "Instead a much saner approach could be:"
+msgstr ""
+
+msgid "this stays the same;"
+msgstr ""
+
+msgid "this also stays the same;"
+msgstr ""
+
+msgid ""
+"be able to generate some JSON/TOML/edn which represents the local expected "
+"filesystem layout with dependencies (i.e. exposing what the package manager "
+"expects to find), let's call it `local-registry.json`;"
+msgstr ""
+
+msgid ""
+"if a `local-registry.json` was provided, do a build using that. Otherwise "
+"generate its own, by downloading the dependencies, arranging them, *etc.*"
+msgstr ""
+
+msgid ""
+"The point is just making what the package manager requires visible to the "
+"outside world via some declarative data. If this data wasn't provided, it "
+"can move on to doing its own automatic things."
+msgstr ""
+
+msgid ""
+"By making the expectation explicit and public, one can plug tools *à la "
+"carte* if desired, but doesn't prevent the default code path of doing things"
+" the exact same way they are now."
+msgstr ""
+
+msgid "Problems with \"*2nix\" tools"
+msgstr ""
+
+msgid "I have to admit: I'm unhappy with most of they."
+msgstr ""
+
+msgid ""
+"They conflate \"using Nix\" with \"replicating every command of the package "
+"manager inside Nix\"."
+msgstr ""
+
+msgid ""
+"The avoidance of an \"easy\" interface that I mentioned above comes from me "
+"fighting with some of the \"\\*2nix\" tools much like I have to fight with "
+"package managers: I don't want to offload all build responsibilities to the "
+"\"*2nix\" tool, I just want to let it download some of the dependencies and "
+"get out of the way. I want to stick with `npm test` or `cargo build`, and "
+"Nix should only provide the environment."
+msgstr ""
+
+msgid ""
+"This is something that [node2nix](https://github.com/svanderburg/node2nix) "
+"does right. It allows you to build the Node.js environment to satisfy NPM, "
+"and you can keep using NPM for everything else:"
+msgstr ""
+
+msgid ""
+"Its natural to want to put as much things into Nix as possible to benefit "
+"from Nix's advantages. Isn't that how NixOS itself was born?"
+msgstr ""
+
+msgid ""
+"But a \"*2nix\" tool should leverage Nix, not be coupled with it. The above "
+"example lets you run any arbitrary NPM command while profiting from "
+"isolation and reproducibility that Nix provides. It is even less brittle: "
+"any changes to how NPM runs some things will be future-compatible, since "
+"node2nix isn't trying to replicate what NPM does, or fiddling with NPM's "
+"internal."
+msgstr ""
+
+msgid ""
+"\\**A \"*2nix\" tool should build the environment, preferably from the "
+"lockfile directly and offload everything else to the package manager**. The "
+"rest is just nice-to-have."
+msgstr ""
+
+msgid ""
+"swift2nix itself could provide an \"easy\" interface, something that allows "
+"you to write:"
+msgstr ""
+
+msgid ""
+"The implementation of those would be obvious: create a new "
+"`pkgs.stdenv.mkDerivation` and call `swift build -c release` and `swift "
+"test` while using `swift2nix.env` under the hood."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"Package managers should provide exact dependencies via a data "
+"representation, i.e. lockfiles, and expose via another data representation "
+"how they expect those dependencies to appear on the filesystem, i.e. `local-"
+"registry.json`. This allows package managers to provide an API so that "
+"external tools can create mirrors, offline builds, other registries, "
+"isolated builds, *etc.*"
+msgstr ""
+
+msgid ""
+"\"\\*2nix\" tools should build simple functions that leverage that `local-"
+"registry.json`[^local-registry] data and offload all the rest back to the "
+"package manager itself. This allows the \"*2nix\" to not keep chasing the "
+"package manager evolution, always trying to duplicate its behaviour."
+msgstr ""
+
+msgid ""
+"[^local-registry]: This `local-registry.json` file doesn't have to be "
+"checked-in the repository at all. It could be always generated on the fly, "
+"much like how Swift's `dependencies-state.json` is."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po b/locale/pt/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po
new file mode 100644
index 0000000..ff9e23e
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po
@@ -0,0 +1,416 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: \"Feature flags: differences between backend, frontend and mobile\"\n"
+"date: 2020-10-19\n"
+"updated_at: 2020-11-03\n"
+"layout: post\n"
+"lang: en\n"
+"ref: feature-flags-differences-between-backend-frontend-and-mobile\n"
+"category: presentation"
+msgstr ""
+
+msgid ""
+"*This article is derived from a [presentation][presentation] on the same "
+"subject.*"
+msgstr ""
+
+msgid ""
+"When discussing about feature flags, I find that their costs and benefits "
+"are often well exposed and addressed. Online articles like \"[Feature Toggle"
+" (aka Feature Flags)][feature-flags-article]\" do a great job of explaining "
+"them in detail, giving great general guidance of how to apply techniques to "
+"adopt it."
+msgstr ""
+
+msgid ""
+"However the weight of those costs and benefits apply differently on backend,"
+" frontend or mobile, and those differences aren't covered. In fact, many of "
+"them stop making sense, or the decision of adopting a feature flag or not "
+"may change depending on the environment."
+msgstr ""
+
+msgid ""
+"In this article I try to make the distinction between environments and how "
+"feature flags apply to them, with some final best practices I've acquired "
+"when using them in production."
+msgstr ""
+
+msgid ""
+"[presentation]: {% link _slides/2020-10-19-rollout-feature-flag-experiment-"
+"operational-toggle.slides %} [feature-flags-article]: "
+"https://martinfowler.com/articles/feature-toggles.html"
+msgstr ""
+
+msgid "Why feature flags"
+msgstr ""
+
+msgid ""
+"Feature flags in general tend to be cited on the context of [continuous "
+"deployment](https://www.atlassian.com/continuous-"
+"delivery/principles/continuous-integration-vs-delivery-vs-deployment):"
+msgstr ""
+
+msgid "A: With continuous deployment, you deploy to production automatically"
+msgstr ""
+
+msgid "B: But how do I handle deployment failures, partial features, *etc.*?"
+msgstr ""
+
+msgid ""
+"A: With techniques like canary, monitoring and alarms, feature flags, *etc.*"
+msgstr ""
+
+msgid ""
+"Though adopting continuous deployment doesn't force you to use feature "
+"flags, it creates a demand for it. The inverse is also true: using feature "
+"flags on the code points you more obviously to continuous deployment. Take "
+"the following code sample for example, that we will reference later on the "
+"article:"
+msgstr ""
+
+msgid ""
+"While being developed, being tested for suitability or something similar, "
+"`notifyListeners()` may not be included in the code at once. So instead of "
+"keeping it on a separate, long-lived branch, a feature flag can decide when "
+"the new, partially implemented function will be called:"
+msgstr ""
+
+msgid ""
+"This allows your code to include `notifyListeners()`, and decide when to "
+"call it at runtime. For the price of extra things around the code, you get "
+"more dynamicity."
+msgstr ""
+
+msgid ""
+"So the fundamental question to ask yourself when considering adding a "
+"feature flag should be:"
+msgstr ""
+
+msgid "Am I willing to pay with code complexity to get dynamicity?"
+msgstr ""
+
+msgid ""
+"It is true that you can make the management of feature flags as "
+"straightforward as possible, but having no feature flags is simpler than "
+"having any. What you get in return is the ability to parameterize the "
+"behaviour of the application at runtime, without doing any code changes."
+msgstr ""
+
+msgid ""
+"Sometimes this added complexity may tilt the balance towards not using a "
+"feature flag, and sometimes the flexibility of changing behaviour at runtime"
+" is absolutely worth the added complexity. This can vary a lot by code base,"
+" feature, but fundamentally by environment: its much cheaper to deploy a new"
+" version of a service than to release a new version of an app."
+msgstr ""
+
+msgid ""
+"So the question of which environment is being targeted is key when reasoning"
+" about costs and benefits of feature flags."
+msgstr ""
+
+msgid "Control over the environment"
+msgstr ""
+
+msgid ""
+"The key differentiator that makes the trade-offs apply differently is how "
+"much control you have over the environment."
+msgstr ""
+
+msgid ""
+"When running a **backend** service, you usually are paying for the servers "
+"themselves, and can tweak them as you wish. This means you have full control"
+" do to code changes as you wish. Not only that, you decide when to do it, "
+"and for how long the transition will last."
+msgstr ""
+
+msgid ""
+"On the **frontend** you have less control: even though you can choose to "
+"make a new version available any time you wish, you can't force[^force] "
+"clients to immediately switch to the new version. That means that a) clients"
+" could skip upgrades at any time and b) you always have to keep backward and"
+" forward compatibility in mind."
+msgstr ""
+
+msgid ""
+"Even though I'm mentioning frontend directly, it applies to other "
+"environment with similar characteristics: desktop applications, command-line"
+" programs, *etc*."
+msgstr ""
+
+msgid ""
+"On **mobile** you have even less control: app stores need to allow your app "
+"to be updated, which could bite you when least desired. Theoretically you "
+"could make you APK available on third party stores like "
+"[F-Droid](https://f-droid.org/), or even make the APK itself available for "
+"direct download, which would give you the same characteristics of a frontend"
+" application, but that happens less often."
+msgstr ""
+
+msgid ""
+"On iOS you can't even do that. You have to get Apple's blessing on every "
+"single update. Even though we already know that is a [bad "
+"idea](http://www.paulgraham.com/apple.html) for over a decade now, there "
+"isn't a way around it. This is where you have the least control."
+msgstr ""
+
+msgid ""
+"In practice, the amount of control you have will change how much you value "
+"dynamicity: the less control you have, the more valuable it is. In other "
+"words, having a dynamic flag on the backend may or may not be worth it since"
+" you could always update the code immediately after, but on iOS it is "
+"basically always worth it."
+msgstr ""
+
+msgid ""
+"[^force]: Technically you could force a reload with JavaScript using "
+"`window.location.reload()`, but that not only is invasive and impolite, but "
+"also gives you the illusion that you have control over the client when you "
+"actually don't: clients with disabled JavaScript would be immune to such "
+"tactics."
+msgstr ""
+
+msgid "Rollout"
+msgstr ""
+
+msgid "A rollout is used to *roll out* a new version of software."
+msgstr ""
+
+msgid ""
+"They are usually short-lived, being relevant as long as the new code is "
+"being deployed. The most common rule is percentages."
+msgstr ""
+
+msgid ""
+"On the **backend**, it is common to find it on the deployment infrastructure"
+" itself, like canary servers, blue/green deployments, [a kubernetes "
+"deployment "
+"rollout](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-"
+"a-deployment), *etc*. You could do those manually, by having a dynamic "
+"control on the code itself, but rollbacks are cheap enough that people "
+"usually do a normal deployment and just give some extra attention to the "
+"metrics dashboard."
+msgstr ""
+
+msgid ""
+"Any time you see a blue/green deployment, there is a rollout happening: most"
+" likely a load balancer is starting to direct traffic to the new server, "
+"until reaching 100% of the traffic. Effectively, that is a rollout."
+msgstr ""
+
+msgid ""
+"On the **frontend**, you can selectively pick which user's will be able to "
+"download the new version of a page. You could use geographical region, IP, "
+"cookie or something similar to make this decision."
+msgstr ""
+
+msgid ""
+"CDN propagation delays and people not refreshing their web pages are also "
+"rollouts by themselves, since old and new versions of the software will "
+"coexist."
+msgstr ""
+
+msgid ""
+"On **mobile**, the Play Store allows you to perform fine-grained [staged "
+"rollouts](https://support.google.com/googleplay/android-"
+"developer/answer/6346149?hl=en), and the App Store allows you to perform "
+"limited [phased releases](https://help.apple.com/app-store-"
+"connect/#/dev3d65fcee1)."
+msgstr ""
+
+msgid ""
+"Both for Android and iOS, the user plays the role of making the download."
+msgstr ""
+
+msgid ""
+"In summary: since you control the servers on the backend, you can do "
+"rollouts at will, and those are often found automated away in base "
+"infrastructure. On the frontend and on mobile, there are ways to make new "
+"versions available, but users may not download them immediately, and many "
+"different versions of the software end up coexisting."
+msgstr ""
+
+msgid "Feature flag"
+msgstr ""
+
+msgid ""
+"A feature flag is a *flag* that tells the application on runtime to turn on "
+"or off a given *feature*. That means that the actual production code will "
+"have more than one possible code paths to go through, and that a new version"
+" of a feature coexists with the old version. The feature flag tells which "
+"part of the code to go through."
+msgstr ""
+
+msgid ""
+"They are usually medium-lived, being relevant as long as the new code is "
+"being developed. The most common rules are percentages, allow/deny lists, "
+"A/B groups and client version."
+msgstr ""
+
+msgid ""
+"On the **backend**, those are useful for things that have a long development"
+" cycle, or that needs to done by steps. Consider loading the feature flag "
+"rules in memory when the application starts, so that you avoid querying a "
+"database or an external service for applying a feature flag rule and avoid "
+"flakiness on the result due to intermittent network failures."
+msgstr ""
+
+msgid ""
+"Since on the **frontend** you don't control when to update the client "
+"software, you're left with applying the feature flag rule on the server, and"
+" exposing the value through an API for maximum dynamicity. This could be in "
+"the frontend code itself, and fallback to a \"just refresh the page\"/\"just"
+" update to the latest version\" strategy for less dynamic scenarios."
+msgstr ""
+
+msgid ""
+"On **mobile** you can't even rely on a \"just update to the latest version\""
+" strategy, since the code for the app could be updated to a new feature and "
+"be blocked on the store. Those cases aren't recurrent, but you should always"
+" assume the store will deny updates on critical moments so you don't find "
+"yourself with no cards to play. That means the only control you actually "
+"have is via the backend, by parameterizing the runtime of the application "
+"using the API. In practice, you should always have a feature flag to control"
+" any relevant piece of code. There is no such thing as \"too small code "
+"change for a feature flag\". What you should ask yourself is:"
+msgstr ""
+
+msgid ""
+"If the code I'm writing breaks and stays broken for around a month, do I "
+"care?"
+msgstr ""
+
+msgid ""
+"If you're doing an experimental screen, or something that will have a very "
+"small impact you might answer \"no\" to the above question. For everything "
+"else, the answer will be \"yes\": bug fixes, layout changes, refactoring, "
+"new screen, filesystem/database changes, *etc*."
+msgstr ""
+
+msgid "Experiment"
+msgstr ""
+
+msgid ""
+"An experiment is a feature flag where you care about analytical value of the"
+" flag, and how it might impact user's behaviour. A feature flag with "
+"analytics."
+msgstr ""
+
+msgid ""
+"They are also usually medium-lived, being relevant as long as the new code "
+"is being developed. The most common rule is A/B test."
+msgstr ""
+
+msgid ""
+"On the **backend**, an experiment rely on an analytical environment that "
+"will pick the A/B test groups and distributions, which means those can't be "
+"held in memory easily. That also means that you'll need a fallback value in "
+"case fetching the group for a given customer fails."
+msgstr ""
+
+msgid ""
+"On the **frontend** and on **mobile** they are no different from feature "
+"flags."
+msgstr ""
+
+msgid "Operational toggle"
+msgstr ""
+
+msgid ""
+"An operational toggle is like a system-level manual circuit breaker, where "
+"you turn on/off a feature, fail over the load to a different server, *etc*. "
+"They are useful switches to have during an incident."
+msgstr ""
+
+msgid ""
+"They are usually long-lived, being relevant as long as the code is in "
+"production. The most common rule is percentages."
+msgstr ""
+
+msgid ""
+"They can be feature flags that are promoted to operational toggles on the "
+"**backend**, or may be purposefully put in place preventively or after a "
+"postmortem analysis."
+msgstr ""
+
+msgid ""
+"On the **frontend** and on **mobile** they are similar to feature flags, "
+"where the \"feature\" is being turned on and off, and the client interprets "
+"this value to show if the \"feature\" is available or unavailable."
+msgstr ""
+
+msgid "Best practices"
+msgstr ""
+
+msgid "Prefer dynamic content"
+msgstr ""
+
+msgid ""
+"Even though feature flags give you more dynamicity, they're still somewhat "
+"manual: you have to create one for a specific feature and change it by hand."
+msgstr ""
+
+msgid ""
+"If you find yourself manually updating a feature flags every other day, or "
+"tweaking the percentages frequently, consider making it fully dynamic. Try "
+"using a dataset that is generated automatically, or computing the content on"
+" the fly."
+msgstr ""
+
+msgid ""
+"Say you have a configuration screen with a list of options and sub-options, "
+"and you're trying to find how to better structure this list. Instead of "
+"using a feature flag for switching between 3 and 5 options, make it fully "
+"dynamic. This way you'll be able to perform other tests that you didn't "
+"plan, and get more flexibility out of it."
+msgstr ""
+
+msgid "Use the client version to negotiate feature flags"
+msgstr ""
+
+msgid ""
+"After effectively finishing a feature, the old code that coexisted with the "
+"new one will be deleted, and all traces of the transition will vanish from "
+"the code base. However if you just remove the feature flags from the API, "
+"all of the old versions of clients that relied on that value to show the new"
+" feature will go downgrade to the old feature."
+msgstr ""
+
+msgid ""
+"This means that you should avoid deleting client-facing feature flags, and "
+"retire them instead: use the client version to decide when the feature is "
+"stable, and return `true` for every client with a version greater or equal "
+"to that. This way you can stop thinking about the feature flag, and you "
+"don't break or downgrade clients that didn't upgrade past the transition."
+msgstr ""
+
+msgid "Beware of many nested feature flags"
+msgstr ""
+
+msgid "Nested flags combine exponentially."
+msgstr ""
+
+msgid ""
+"Pick strategic entry points or transitions eligible for feature flags, and "
+"beware of their nesting."
+msgstr ""
+
+msgid "Include feature flags in the development workflow"
+msgstr ""
+
+msgid ""
+"Add feature flags to the list of things to think about during whiteboarding,"
+" and deleting/retiring a feature flags at the end of the development."
+msgstr ""
+
+msgid "Always rely on a feature flag on the app"
+msgstr ""
+
+msgid ""
+"Again, there is no such thing \"too small for a feature flag\". Too many "
+"feature flags is a good problem to have, not the opposite. Automate the "
+"process of creating a feature flag to lower its cost."
+msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-10-20-how-not-to-interview-engineers.po b/locale/pt/LC_MESSAGES/_articles/2020-10-20-how-not-to-interview-engineers.po
new file mode 100644
index 0000000..2dd6645
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_articles/2020-10-20-how-not-to-interview-engineers.po
@@ -0,0 +1,476 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: How not to interview engineers\n"
+"date: 2020-10-20\n"
+"updated_at: 2020-10-24\n"
+"layout: post\n"
+"lang: en\n"
+"ref: how-not-to-interview-engineers"
+msgstr ""
+
+msgid ""
+"This is a response to Slava's \"[How to interview "
+"engineers](https://defmacro.substack.com/p/how-to-interview-engineers)\" "
+"article. I initially thought it was a satire, [as have "
+"others](https://defmacro.substack.com/p/how-to-interview-"
+"engineers/comments#comment-599996), but he has [doubled down on "
+"it](https://twitter.com/spakhm/status/1315754730740617216):"
+msgstr ""
+
+msgid ""
+"(...) Some parts are slightly exaggerated for sure, but the essay isn't "
+"meant as a joke."
+msgstr ""
+
+msgid ""
+"That being true, he completely misses the point on how to improve hiring, "
+"and proposes a worse alternative on many aspects. It doesn't qualify as "
+"provocative, it is just wrong."
+msgstr ""
+
+msgid ""
+"I was comfortable taking it as a satire, and I would just ignore the whole "
+"thing if it wasn't (except for the technical memo part), but friends of mine"
+" considered it to be somewhat reasonable. This is a adapted version of parts"
+" of the discussions we had, risking becoming a gigantic showcase of [Poe's "
+"law](https://en.wikipedia.org/wiki/Poe%27s_law)."
+msgstr ""
+
+msgid ""
+"In this piece, I will argument against his view, and propose an alternative "
+"approach to improve hiring."
+msgstr ""
+
+msgid ""
+"It is common to find people saying how broken technical hiring is, as well "
+"put in words by a phrase on [this "
+"comment](https://news.ycombinator.com/item?id=24757511):"
+msgstr ""
+
+msgid ""
+"Everyone loves to read and write about how developer interviewing is flawed,"
+" but no one wants to go out on a limb and make suggestions about how to "
+"improve it."
+msgstr ""
+
+msgid ""
+"I guess Slava was trying to not fall on this trap, and make a suggestion on "
+"how to improve instead, which all went terribly wrong."
+msgstr ""
+
+msgid "What not to do"
+msgstr ""
+
+msgid "Time candidates"
+msgstr ""
+
+msgid ""
+"Timing the candidate shows up on the \"talent\" and \"judgment\" sections, "
+"and they are both bad ideas for the same reason: programming is not a "
+"performance."
+msgstr ""
+
+msgid ""
+"What do e-sports, musicians, actors and athletes have in common: performance"
+" psychologists."
+msgstr ""
+
+msgid ""
+"For a pianist, their state of mind during concerts is crucial: they not only"
+" must be able to deal with stage anxiety, but to become really successful "
+"they will have to learn how to exploit it. The time window of the concert is"
+" what people practice thousands of hours for, and it is what defines one's "
+"career, since how well all the practice went is irrelevant to the nature of "
+"the profession. Being able to leverage stage anxiety is an actual goal of "
+"them."
+msgstr ""
+
+msgid ""
+"That is also applicable to athletes, where the execution during a "
+"competition makes them sink or swim, regardless of how all the training was."
+msgstr ""
+
+msgid ""
+"The same cannot be said about composers, though. They are more like book "
+"writers, where the value is not on very few moments with high adrenaline, "
+"but on the aggregate over hours, days, weeks, months and years. A composer "
+"may have a deadline to finish a song in five weeks, but it doesn't really "
+"matter if it is done on a single night, every morning between 6 and 9, at "
+"the very last week, or any other way. No rigid time structure applies, only "
+"whatever fits best to the composer."
+msgstr ""
+
+msgid ""
+"Programming is more like composing than doing a concert, which is another "
+"way of saying that programming is not a performance. People don't practice "
+"algorithms for months to keep them at their fingertips, so that finally in a"
+" single afternoon they can sit down and write everything at once in a rigid "
+"4 hours window, and launch it immediately after."
+msgstr ""
+
+msgid ""
+"Instead software is built iteratively, by making small additions, than "
+"refactoring the implementation, fixing bugs, writing a lot at once, *etc*. "
+"all while they get a firmer grasp of the problem, stop to think about it, "
+"come up with new ideas, *etc*."
+msgstr ""
+
+msgid ""
+"Some specifically plan for including spaced pauses, and call it \"[Hammock "
+"Driven Development](https://www.youtube.com/watch?v=f84n5oFoZBc)\", which is"
+" just artist's \"creative idleness\" for hackers."
+msgstr ""
+
+msgid ""
+"Unless you're hiring for a live coding group, a competitive programming "
+"team, or a professional live demoer, timing the candidate that way is more "
+"harmful than useful. This type of timing doesn't find good programmers, it "
+"finds performant programmers, which isn't the same thing, and you'll end up "
+"with people who can do great work on small problems but who might be unable "
+"to deal with big problems, and loose those who can very well handle huge "
+"problems, slowly. If you are lucky you'll get performant people who can also"
+" handle big problems on the long term, but maybe not."
+msgstr ""
+
+msgid ""
+"An incident is the closest to a \"performance\" that it gets, and yet it is "
+"still dramatically different. Surely it is a high stress scenario, but while"
+" people are trying to find a root cause and solve the problem, only the "
+"downtime itself is visible to the exterior. It is like being part of the "
+"support staff backstage during a play: even though execution matters, you're"
+" still not on the spot. During an incident you're doing debugging in anger "
+"rather than live coding."
+msgstr ""
+
+msgid ""
+"Although giving a candidate the task to write a \"technical memo\" has "
+"potential to get a measure of the written communication skills of someone, "
+"doing so in a hard time window also misses the point for the same reasons."
+msgstr ""
+
+msgid "Pay attention to typing speed"
+msgstr ""
+
+msgid ""
+"Typing is speed in never the bottleneck of a programmer, no matter how great"
+" they are."
+msgstr ""
+
+msgid ""
+"As [Dijkstra "
+"said](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD05xx/EWD512.html):"
+msgstr ""
+
+msgid ""
+"But programming, when stripped of all its circumstantial irrelevancies, "
+"boils down to no more and no less than very effective thinking so as to "
+"avoid unmastered complexity, to very vigorous separation of your many "
+"different concerns."
+msgstr ""
+
+msgid "In other words, programming is not about typing, it is about thinking."
+msgstr ""
+
+msgid ""
+"Otherwise, the way to get those star programmers that can't type fast enough"
+" a huge productivity boost is to give them a touch typing course. If they "
+"are so productive with typing speed being a limitation, imagine what they "
+"could accomplish if they had razor sharp touch typing skills?"
+msgstr ""
+
+msgid ""
+"Also, why stop there? A good touch typist can do 90 WPM (words per minute), "
+"and a great one can do 120 WPM, but with a stenography keyboard they get to "
+"200 WPM+. That is double the productivity! Why not try [speech-to-"
+"text](https://www.youtube.com/watch?v=Mz3JeYfBTcY)? Make them all use "
+"[J](https://www.jsoftware.com/#/) so they all need to type less! How come "
+"nobody thought of that?"
+msgstr ""
+
+msgid ""
+"And if someone couldn't solve the programming puzzle in the given time "
+"window, but could come back in the following day with an implementation that"
+" is not only faster, but uses less memory, was simpler to understand and "
+"easier to read than anybody else? You'd be losing that person too."
+msgstr ""
+
+msgid "IQ"
+msgstr ""
+
+msgid ""
+"For \"building an extraordinary team at a hard technology startup\", "
+"intelligence is not the most important, [determination "
+"is](http://www.paulgraham.com/determination.html)."
+msgstr ""
+
+msgid ""
+"And talent isn't \"IQ specialized for engineers\". IQ itself isn't a measure"
+" of how intelligent someone is. Ever since Alfred Binet with Théodore Simon "
+"started to formalize what would become IQ tests years later, they already "
+"acknowledged limitations of the technique for measuring intelligence, which "
+"is [still true today](https://sci-"
+"hub.do/https://psycnet.apa.org/doiLanding?doi=10.1037%2F1076-8971.6.1.33)."
+msgstr ""
+
+msgid ""
+"So having a high IQ tells only how smart people are for a particular aspect "
+"of intelligence, which is not representative of programming. There are "
+"numerous aspects of programming that are covered by IQ measurement: how to "
+"name variables and functions, how to create models which are compatible with"
+" schema evolution, how to make the system dynamic for runtime "
+"parameterization without making it fragile, how to measure and observe "
+"performance and availability, how to pick between acquiring and paying "
+"technical debt, *etc*."
+msgstr ""
+
+msgid ""
+"Not to say about everything else that a programmer does that is not purely "
+"programming. Saying high IQ correlates with great programming is a stretch, "
+"at best."
+msgstr ""
+
+msgid "Ditch HR"
+msgstr ""
+
+msgid "Slava tangentially picks on HR, and I will digress on that a bit:"
+msgstr ""
+
+msgid ""
+"A good rule of thumb is that if a question could be asked by an intern in "
+"HR, it's a non-differential signaling question."
+msgstr ""
+
+msgid ""
+"Stretching it, this is a rather snobbish view of HR. Why is it that an "
+"intern in HR can't make signaling questions? Could the same be said of an "
+"intern in engineering?"
+msgstr ""
+
+msgid ""
+"In other words: is the question not signaling because the one asking is from"
+" HR, or because the one asking is an intern? If the latter, than he's just "
+"arguing that interns have no place in interviewing, but if the former than "
+"he was picking on HR."
+msgstr ""
+
+msgid ""
+"Extrapolating that, it is common to find people who don't value HR's work, "
+"and only see them as inferiors doing unpleasant work, and who aren't capable"
+" enough (or *smart* enough) to learn programming."
+msgstr ""
+
+msgid ""
+"This is equivalent to people who work primarily on backend, and see others "
+"working on frontend struggling and say: \"isn't it just building views and "
+"showing them on the browser? How could it possibly be that hard? I bet I "
+"could do it better, with 20% of code\". As you already know, the answer to "
+"it is \"well, why don't you go do it, then?\"."
+msgstr ""
+
+msgid ""
+"This sense of superiority ignores the fact that HR have actual professionals"
+" doing actual hard work, not unlike programmers. If HR is inferior and so "
+"easy, why not automate everything away and get rid of a whole department?"
+msgstr ""
+
+msgid ""
+"I don't attribute this world view to Slava, this is only an extrapolation of"
+" a snippet of the article."
+msgstr ""
+
+msgid "Draconian mistreating of candidates"
+msgstr ""
+
+msgid ""
+"If I found out that people employed theatrics in my interview so that I "
+"could feel I've \"earned the privilege to work at your company\", I would "
+"quit."
+msgstr ""
+
+msgid ""
+"If your moral compass is so broken that you are comfortable mistreating me "
+"while I'm a candidate, I immediately assume you will also mistreat me as an "
+"employee, and that the company is not a good place to work, as [evil begets "
+"stupidity](http://www.paulgraham.com/apple.html):"
+msgstr ""
+
+msgid ""
+"But the other reason programmers are fussy, I think, is that evil begets "
+"stupidity. An organization that wins by exercising power starts to lose the "
+"ability to win by doing better work. And it's not fun for a smart person to "
+"work in a place where the best ideas aren't the ones that win. I think the "
+"reason Google embraced \"Don't be evil\" so eagerly was not so much to "
+"impress the outside world as to inoculate themselves against arrogance."
+msgstr ""
+
+msgid ""
+"Paul Graham goes beyond \"don't be evil\" with a better motto: \"[be "
+"good](http://www.paulgraham.com/good.html)\"."
+msgstr ""
+
+msgid ""
+"Abusing the asymmetric nature of an interview to increase the chance that "
+"the candidate will accept the offer is, well, abusive. I doubt a solid team "
+"can actually be built on such poor foundations, surrounded by such evil "
+"measures."
+msgstr ""
+
+msgid ""
+"And if you really want to give engineers \"the measure of whoever they're "
+"going to be working with\", there are plenty of reasonable ways of doing it "
+"that don't include performing fake interviews."
+msgstr ""
+
+msgid "Personality tests"
+msgstr ""
+
+msgid ""
+"Personality tests around the world need to be a) translated, b) adapted and "
+"c) validated. Even though a given test may be applicable and useful in a "
+"country, this doesn't imply it will work for other countries."
+msgstr ""
+
+msgid ""
+"Not only tests usually come with translation guidelines, but also its "
+"applicability needs to be validated again after the translation and "
+"adaptation is done to see if the test still measures what it is supposed to."
+msgstr ""
+
+msgid ""
+"That is also true within the same language. If a test is shown to work in "
+"England, it may not work in New Zealand, in spite of both speaking english. "
+"The cultural context difference is influent to the point of invalidating a "
+"test and making it be no longer valid."
+msgstr ""
+
+msgid ""
+"Irregardless of the validity of the proposed \"big five\" personality test, "
+"saying \"just use attributes x, y and z this test and you'll be fine\" is a "
+"rough simplification, much like saying \"just use Raft for distributed "
+"systems, after all it has been proven to work\" shows he throws all of that "
+"background away."
+msgstr ""
+
+msgid ""
+"So much as applying personality tests themselves is not a trivial task, and "
+"psychologists do need special training to become able to effectively apply "
+"one."
+msgstr ""
+
+msgid "More cargo culting"
+msgstr ""
+
+msgid ""
+"He calls the ill-defined \"industry standard\" to be cargo-culting, but his "
+"proposal isn't sound enough to not become one."
+msgstr ""
+
+msgid ""
+"Even if the ideas were good, they aren't solid enough, or based on solid "
+"enough things to make them stand out by themselves. Why is it that talent, "
+"judgment and personality are required to determine the fitness of a good "
+"candidate? Why not 2, 5, or 20 things? Why those specific 3? Why is talent "
+"defined like that? Is it just because he found talent to be like that?"
+msgstr ""
+
+msgid ""
+"Isn't that definitionally also [cargo-"
+"culting](http://calteches.library.caltech.edu/51/2/CargoCult.htm)[^cargo-"
+"culting-archive]? Isn't he just repeating whatever he found to work form "
+"him, without understanding why?"
+msgstr ""
+
+msgid "What Feynman proposes is actually the opposite:"
+msgstr ""
+
+msgid ""
+"In summary, the idea is to try to give **all** of the information to help "
+"others to judge the value of your contribution; not just the information "
+"that leads to judgment in one particular direction or another."
+msgstr ""
+
+msgid ""
+"What Slava did was just another form of cargo culting, but this was one that"
+" he believed to work."
+msgstr ""
+
+msgid ""
+"[^cargo-culting-archive]: [Archived "
+"version](https://web.archive.org/web/20201003090303/http://calteches.library.caltech.edu/51/2/CargoCult.htm)."
+msgstr ""
+
+msgid "What to do"
+msgstr ""
+
+msgid ""
+"I will not give you a list of things that \"worked for me, thus they are "
+"correct\". I won't either critique the current \"industry standard\", nor "
+"what I've learned from interviewing engineers."
+msgstr ""
+
+msgid ""
+"Instead, I'd like to invite you to learn from history, and from what other "
+"professionals have to teach us."
+msgstr ""
+
+msgid ""
+"Programming isn't an odd profession, where everything about it is different "
+"from anything else. It is just another episode in the \"technology\" series,"
+" which has seasons since before recorded history. It may be an episode where"
+" things move a bit faster, but it is fundamentally the same."
+msgstr ""
+
+msgid ""
+"So here is the key idea: what people did *before* software engineering?"
+msgstr ""
+
+msgid ""
+"What hiring is like for engineers in other areas? Don't civil, electrical "
+"and other types of engineering exist for much, much longer than software "
+"engineering does? What have those centuries of accumulated experience "
+"thought the world about technical hiring?"
+msgstr ""
+
+msgid ""
+"What studies were performed on the different success rate of interviewing "
+"strategies? What have they done right and what have they done wrong?"
+msgstr ""
+
+msgid ""
+"What is the purpose of HR? Why do they even exist? Do we need them, and if "
+"so, what for? What is the value they bring, since everybody insist on "
+"building an HR department in their companies? Is the existence of HR another"
+" form of cargo culting?"
+msgstr ""
+
+msgid ""
+"What is industrial and organizational psychology? What is that field of "
+"study? What do they specialize in? What have they learned since the "
+"discipline appeared? What have they done right and wrong over history? Is is"
+" the current academic consensus on that area? What is a hot debate topic in "
+"academia on that area? What is the current bleeding edge of research? What "
+"can they teach us about hiring? What can they teach us about technical "
+"hiring?"
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"If all I've said makes me a \"no hire\" in the proposed framework, I'm "
+"really glad."
+msgstr ""
+
+msgid ""
+"This says less about my programming skills, and more about the employer's "
+"world view, and I hope not to be fooled into applying for a company that "
+"adopts this one."
+msgstr ""
+
+msgid ""
+"Claiming to be selecting \"extraordinary engineers\" isn't an excuse to "
+"reinvent the wheel, poorly."
+msgstr ""