There's tons to be said about macrophotography, and I don't intend to cover much of anything here.
The higher your focal length, the more magnification you get, but the less of the image is in focus.
The more you open up your aperture, the more light gets in, but the less of the image is in focus.
The smaller the object, the more magnification you need, and the more light you need to get in.
Already at half-macro or 1÷2 magnification (on a 36✕24mm sensor, capturing a surface of 72✕48mm), you'll find that opening at f/4, the depth of field is rather narrow:
Things get wilder at 2.5✕ ultramacro (on a 36✕24mm sensor, capturing a surface of 14.4✕9.6mm) and f/4. For an object of relative depth (not very flat in the much narrower plane of focus), a couple of options are available:
Decreasing the aperture until diffraction becomes a problem, usually around f/11 to 1/16. To compensate for the loss of light, brighter environments and/or longer exposure times are required.
Focus stacking: combine many photographs taken with at different focus distances, or distances of the camera to the object (through movement of the camera and lens on a macro rail).
We do the latter here using Helicon Focus. Here are 80 frames shown at 5 frames per second:
And the picture they combine to form:
As magnification keeps increasing, photography gets harder: it requires extensive preparation including cleaning (very poorly done here), and working around vibrations through dozens and dozens, sometimes hundreds of frames.
The online version was built around my personal desire for remote play, and to turn my phone into a board at an instant's notice. It's functional for both. But…
It lacks bots. A shame given the game was solved by Guy L. Steele Jr. through a brute force search in 1998 and I have a copy of the solution, which produces an O(1) lookup database of position to outcome given optimal play.
It isn't inviting. I'm sure a lot could be done, and given the elegance of the game itself, it wouldn't be lipstick on a pig.
Physical version: needs distribution?
The original trademark, registration #519087, expired in 2021. I have no problem distributing the game under its original name, and my design is distinct enough.
The stocks for boards, pieces, and bags are living in my bedroom closet. I have yet to print rules, and some assembly is required, but it's otherwise ready.
You can write to preorders@teeko.cc, but I have no concrete plans to distribute it beyond hand-delivering it around me at the moment.
A bit further west from the rest, very much worth the walk. Great selection of premium teas served gongfu, delicious-looking desserts (never tried), a calm atmosphere, laptop-friendly.
Tetris got its post; time to cover my other favourite video game.
N++ is, in my opinion, the best platforming game ever made.
Launched under the Metanet Software umbrella, the third in a series of excellent games by Canadian duo Mare Sheppard and Raigan Burns, it features instant restarts upon failure, great physics, simple and elegant visuals, an addictive soundtrack, no scrolling, and pure determinism.
Once introduced to all the elements that can appear in a level, you can understand each new level through visual inspection before it starts. No surprises. Easy to learn but hard to master. Everybody will find their skills challenged here.
The level editor with online sharing complements thousands of levels of increasing difficulty, separated between solo, co-op and race categories, and only cleared by series of 5.
If you play one platformer in your life, make it N++.
Given how slow my CASIO PB-700 was at plotting graphs, around age 8, my parents upgraded me to the Sharp EL-9400 (manual).
It was a big step up for math, but barely programmable. I wanted a fast BASIC playground.
After a lot of starring in stores and begging, I received the dream machine: the TI-92 Plus (manual). It was a TI-89 in the body of a TI-92. Fantastic machine to code in BASIC and, as I discovered after breaking an arm, take notes in class.
Came with a powerful Symbolic Algebraic System and Cabri Géomètre (a brilliant app to construct geometry). Once I discovered how to transfer files from the Internet onto it, a lot of games followed.
It lasted quite a few years. When it finally gave up, I immediately replaced it with its successor, the TI Voyage 200 (manual), which I've kept to this day.
Smaller form factor but AAA batteries instead of AA, double the flash, a really minor revision.
In my adult life, having lost interest in calculators for anything but quick calculations on the go, and having embraced RPN to the point of implementing a postfix language for fun, I've acquired a HP Prime (manual).
Sadly, I don't care to get past the home screen anymore.
My first computer, or what I remember as such, is older than me. Passed down by my father, it was made by CASIO in Japan in 1983, the year System V launched.
200 × 88 × 23 mm, 4 KB of RAM, 4 lines of 20 characters or 32 lines of 160 pixels, with optional printers, tape, and RAM expansions I never saw.
Mine still works great today. And by great, I mean that plotting sin(x) and cos(x) across the screen in BASIC, highlights of my childhood, still takes mere minutes to complete.
After many years on an ever-growing zsh configuration, I switched to fish a few years ago.
While perfectly satisfied with my setup, I wanted something I could recommend to a beginner. fish's simplicity and modern defaults seem like a much better starting point if eschewing POSIX compatibility.
My configuration hasn't grown much since, but a few quality of life improvements have accumulated, so I figured it is worth sharing.
Installs on Apple Silicon macOS
Let's assume you're starting from scratch and want to adopt all my suggestions. Open Terminal.app and run the following:
$ /bin/bash -c"$(curl-fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ /opt/homebrew/bin/brew install aria2 bat delta direnv eza fish fzf keychain mise tig wezterm zoxide
$ chsh -s /opt/homebrew/bin/fish
~/.wezterm.lua
Most likely, you'll need to choose another font on line 3.
Unless, of course, you're interested in purchasing PragmataPro, a most excellent project I use nearly everywhere (eg my main site).
local wezterm = require 'wezterm'local config = wezterm.config_builder()
config.font = wezterm.font 'PragmataPro Liga'
config.font_size =14
config.hide_tab_bar_if_only_one_tab =true
config.native_macos_fullscreen_mode =true
config.pane_focus_follows_mouse =true
config.use_fancy_tab_bar =false
config.window_decorations ='RESIZE'
config.window_padding ={ left =0, right =0, top =0, bottom =0}return config
~/.config/fish/config.fish
I made it so it could be copied anywhere; none of the tools need to be installed, but they will be enabled if they are.
iftype-q /opt/homebrew/bin/brew; /opt/homebrew/bin/brew shellenv |source; end
iftype-q keychain; keychain --eval--quiet--inherit any |source; end
iftype-q direnv; direnv hook fish |source; end
iftype-q fzf; fzf --fish|source; end
iftype-q zoxide; zoxide init fish |source; end
iftype-q mise; mise activate fish |source; end
iftype-q caniuse; caniuse --completion-fish |source; end
The first line enables Homebrew on Apple Silicon macOS.
I don't need to be welcomed and invited to type help every time.
>set-U fish_greeting
~/.ssh/config extracts
I like my keys to be added to the agent automatically on first use, for host keys to be automatically accepted for new hosts, and to minimize bandwidth consumption.
With this configuration in place, git help config should open a page in your browser. I won't describe every detail, but a few essentials.
Only including 2 aliases, ss and sss, as everyone should know how status offers a compact output with -s and -b, and is sped up by -uno to avoid looking at the working tree in large repositories.
You should try tig for a quick view of your repository's history. lazygit does a lot more.
You can and should sign your commits with ssh (unless you prefer PGP).
Sci-fi animation inappropriate for children. Nothing short of my favourite piece of media for adults.
A visual masterpiece backing a captivating story, it will take your breath away.
I strongly recommend going in blind, then watching the Scavengers short included below. That said, teaser & trailer follow in case you need convincing.
Carrying their own roast and that of nearby Chulo, offering a variety of brewing methods and alternative drinks, they're a must-taste for any coffee lover visiting the city.
They also offer a great selection of vegan food, some gluten-free.
I visit almost daily, most often enjoy an oat milk flat white. I'm also partial to their dirty chaï, and would suggest espresso tonics if you're feeling adventurous.
I enjoy using my own domains — though I rent a few too many! One of them, rrier.fr was originally purchased solely so I could use pc@rrier.fr as my E-mail address.
Naturally, I wanted to also be known as @pc@rrier.fr on the Fediverse, as part of owning my online identity. Unfortunately, this turned out more challenging that I expected. Here are a few approaches I tried and what I learned along the way.
This let people search for @pc@rrier.fr and find an account. Unfortunately, that indirection would be resolved right there and then: they would then see and follow the mastodon.social account. I couldn't move providers smoothly, as the process to relocate an account disappears all previous content.
I wanted more control over where my content is hosted and stored authoritatively. Onto what seemed like the natural solution.
In my opinion, for a single customer, a server requires too much setup and maintenance work, and too many resources. I gave up a few steps into an installation when I realized the amount of memory my VPS would probably need, so I can't say much more.
I looked around, and found what I think is a better solution for my needs:
Setup was a breeze. Everything is lightweight and fast. I have minor complaints, notably lack of edit capability (already on the roadmap), but it's a fantastic piece of software.
It does, however, suffer from what appears to be limitations inherent to the design of the Fediverse:
My instance is federated with over 2000 other instances, but I don't see their content when looking up or following a hashtag. It only finds stuff that already appeared in the timeline of my lone user… Makes following hashtags pointless, something that I found super valuable when I was on a big instance.Edit: Unfortunately not supported by GoToSocial, relays are a solution to this problem. A tad cumbersome (either hashtag-specific and I need to administer their list whenever (un)following hashtags, or extreme overhead). Thanks Fedi Jedi for the tip!
I can't boost or reply to toots of people I don't already follow, unless they were boosted by the accounts my instance follows… Following them doesn't backfill their history on my instance, so the existing toot remains out of reach.Edit: Search the toot by URL in your client to reach it. Not intuitive to me, but simple. Thanks Aaron Parecki for the tip!
I'd love to learn that those issues can be addressed without protocol changes, or that such protocol changes are underway. In the meantime, I've learnt to live with those grievances.Edit: Not a great UX, but everything seems workable in the end.
Here's my desk, where I spend way too much time. Please pardon the total lack of cable management.
Probably the most obvious characteristic is the big display.
At 8K and 65 inches, the Samsung Neo QLED 8K QN900D takes most of the space on my 200⨉50cm desk. While far from perfect, with a surface equivalent to 4⨉4K or 16⨉1080p, it's fantastic for interacting with and keeping an eye on tons of windows at once.
The sound system is a pair of Focal Alpha 80 Evo studio monitors I adore, connected to a Mackie Mix5 mixing table which has caused me a lot of troubles but does the job of mixing the audio from 2 computers at once.
Mostly here and often off, running Linux and Windows 11, dog. The “workstation” yet not involved in my job much, it provides a powerful environment for gaming, streaming, music composition, etc. It sports a 7950X3D, RTX4090, plenty of RAM and storage for my needs.
Always on, headless, rabbit. A fairly low-power Framework mainboard connected over Thunderbolt to 4⨉8TB of SSD storage in a ThunderBay 4 mini, and the other 2 computers when present. It acts as a NAS, media server, download box, Docker host, and more.
deb http://us.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb http://extras.ubuntu.com/ubuntu trusty main
deb http://archive.canonical.com/ubuntu/ trusty partner
deb http://repos.azulsystems.com/ubuntu stable main
deb http://dl.google.com/linux/chrome/deb/ stable main
deb http://dl.google.com/linux/chrome-remote-desktop/deb/ stable main
deb http://linux.dropbox.com/ubuntu trusty main
deb http://downloads.hipchat.com/linux/apt stable main
deb http://repository.spotify.com stable non-free
deb http://archive.getdeb.net/ubuntu trusty-getdeb apps games
deb https://get.docker.io/ubuntu docker main
deb http://debian.sur5r.net/i3/ trusty universe
deb http://winswitch.org/ trusty main
deb http://debrepos.franzoni.eu/atom squeeze main
deb http://ppa.launchpad.net/webupd8team/sublime-text-3/ubuntu trusty main
deb http://ppa.launchpad.net/git-core/ppa/ubuntu trusty main
deb http://ppa.launchpad.net/nowrep/qupzilla/ubuntu trusty main
deb http://ppa.launchpad.net/noobslab/indicators/ubuntu trusty main
deb http://ppa.launchpad.net/mc3man/trusty-media/ubuntu trusty main
deb http://ppa.launchpad.net/hugegreenbug/cmt2/ubuntu trusty main
deb http://ppa.launchpad.net/modriscoll/nzbget/ubuntu trusty main
First apt-get update
apt-get update will complain about missing keys. To import them, use something like:
You should be verifying those PGP keys. [insert thought-through security blah blah everybody will ignore]
Configure the X session
As i3 maps quite a lot under its modifier, I use Mod4 (presented by i3 as “win” during the configuration assistant) but make it Right Alt instead of the Search key to avoid any conflicts. Sorry to users of non-US keyboards.
URxvt*foreground: white
URxvt*background: black
URxvt*cursorColor: red
Running VPNs
Make sure the resolvconf package isn’t installed so /etc/hosts will be correctly written, both in the crouton chroot and on the host (as crouton ties them together).
TUN devices get automatically destroyed by the network manager, shill, which will break OpenConnect, vpnc and OpenVPN. To disable this behaviour until the next boot:
I kept most of my personal configuration out of this document, but I’d be happy to explore more in future articles. Let me know what you’d like to see covered on Twitter!
If accesses are frequent and non-linear, performance remains reasonable as long as they are cached in memory. Then suddenly, some background job is triggered, a backup for example, and the data gets evicted from the page cache. Performance drops.
In many cases this is acceptable. The service throughput drops. In a request-reply model, requests get queued. But if latency is not critical, remains below the client timeout, and if the machine is dimensioned properly, data will be cached again, the service will catch up. The temporary slowdown was acceptable.
In other cases, this is catastrophic. Think high-frequency trading.
Here comes pcmad, the “Page Cache My Assets” daemon. It simply locks and unlocks files in memory as requested. When a file is locked, it won’t be evicted, whatever happens on the server. If the system runs out of memory, the oom-killer would be likely to kill this daemon first, so the upstart job and systemd unit indicate that killing pcmad should be avoided at all costs.
A simple and documented protocol, based on ØMQ and MessagePack, makes pcma easy to integrate with your existing services. For scripts, we also ship a client.
The project reached 0.2.0. It isn’t stabilized yet, so the protocol might not remain backward-compatible. However the code is simple and passed reviews, so feel free to give it a go!
On fedoraproject.org, the new prominent installation media with Fedora 15 is the live desktop, eg. Fedora-15-x86_64-Live-Desktop.iso.
Download it, boot it in VirtualBox. Gnome 3 will use the fallback mode. How do you start the installer? Well, turns out it is normally made prominent by a Gnome Shell extension (~/.local/share/gnome-shell/extensions/Installer@shell-extensions.fedoraproject.org/).
Did I mention that in fallback mode, which you can enjoy with most virtualization technologies, Gnome Shell is not running? Instead the installer ends up in the menu. Somehow it took me over 15 minutes to find it. Most people would be ashamed, I blog about it.
In case you wonder how to start the Fedora 15 installer in your virtual machine (SEO)… You can find it in Applications → System Tools → Install to Hard Drive. Alternatively, Alt+F2, liveinst. My bad for not partaking in the testing effort…
It makes me feel old and nerdy, but I love console-based installation processes.
I wanted a minimal, fullscreen clock I could run without X. In the longer term, I am thinking about a locking console “screensaver”; (more about that later). I ended up writing a small library (240 lines and counting) to render a 7-segment display in monospaced text at any “resolution”.
The end result adapts to the console size, instantaneously if resized. It lacks any options, if I'm bored again I might come back to it. It should be quite efficient, though more trivial optimizations are possible.
Older screenshots from various prototypes (the test program is available alongside the clock; as usual, I recommend sticking to the instructions in INSTALL at the root of the repo):
As a Technical Support Engineer at Red Hat, I got to read a lot of logs, error messages and code. One of my pain points was errnos.
They rely on magic numbers, which is perfectly understandable given their use cases (eg return values for system calls). But obviously, we're not going to be using magic numbers everywhere, hence they are defined as constants for the C preprocessor.
Numbers are not very user-friendly, so why not display them in a human-readable format when a human might want to read it? strerror comes to the rescue! Unfortunately, not every piece of code presenting errors to the user or administrator uses it. There are various reasons for that:
It is a libc function, and the Linux kernel didn't implement something similar (or most of us aren't aware of its existence);
The length of the (hexa)decimal representation of an integer is bound, whereas the strings it returns are not, which can make memory allocation for log messages trickier.
strerror strings are very readable; for example, it will turn ENOMEM into Cannot allocate memory under OSX. I will not lose too much of your time on the annoyances caused by weird usages of errnos, though I encountered quite a few already: they usually do not delay troubleshooting too much if you're not too trusting. For example ENOTDIR, represented by glibc's strerror as Not a directory, indicates when returned by keyctl_search(3) that one of the keyrings is a valid key that isn't a keyring.
The tricky part now? From a number or an strerror description in logs or an output, there is no trivial way to establish which constant to look for. What's more, C preprocessor constants are not available at runtime, you'd need the headers at hand, cpp, and your own list to go through as there isn't a standard one! For example, if you see 44, 0x2c or Channel number out of range, what should you git grep for in the affected software, libc and/or kernel? ECHRNG, of course!
I'd love to give you a simple table listing each errno constant, its representation in decimal and hexadecimal and its strerror description, but there are a few reasons why I can't:
Probably mostly for historical reasons, the association between constants and integer values is not common between operating systems; worse, they can also change between hardware architectures.
The strerror representation varies between systems, in particular depending on the libc being used.
Some operating systems use the same value for multiple constants. This is not a bug per se as long as no standard function can return those different constants for different reasons. On my systems, those are EDEADLK and EDEADLOCK under Linux, EAGAIN and EWOULDBLOCK under OSX.
However, this led to the creation of a simple command-line utility, errnos. Build and run it on the system you investigate, or a similar one (same operating system, same libc, same CPU architecture), and you will get something you can store and grep at will. It could also make an ironic wallpaper for your child's room, but don't blame me if they have nightmares of production systems going down.
For once, I used glib as I needed a hashtable of lists and couldn't be bothered implementing those for the millionth time in history (comp. sci. students who have to do so tonight, I share your frustration). There's a limited amount of magic involved in the build process, so please just clone the repository and stick to the build instructions unless you have time to lose.
The first column gives the number in its decimal representation, the second in hexadecimal. The third is either its strerror representation between double quotes or a preprocessor constant.
To close this article, here is the end of its output on my Mac:
$ errnos |tail
Stopped looking at 112899 0x63 "Not a STREAM"99 0x63 ENOSTR
100 0x64 "Protocol error"100 0x64 EPROTO
101 0x65 "STREAM ioctl timeout"101 0x65 ETIME
102 0x66 "Operation not supported on socket"102 0x66 EOPNOTSUPP
103 0x67 "Policy not found"103 0x67 ENOPOLICY
When you end up having to dictate Unix commands over the phone, you quickly learn from your colleagues that optimism doesn’t compensate your French accent. Turns out cancelling your lovefilm subscription triggers a similar problem.
The most common answer is to involve the NATO phonetic alphabet. Looking up a table pinned to your desk is tedious, getting fluent takes time. That’s where nato kicks in.
After this very useful piece of software (at least to some), let’s have a look at something stupid and useless (I won’t even bother trying to explain the silly reason I needed it). If you ever have a good, real-life reason to run superglob, please E-mail me right away, I’ll owe you the drink of your choice. The idea is to build a glob matching all the arguments provided, but as little more as possible (and we’re far from being clever here).
You want passwords that are identical with AZERTY, QWERTY and QWERTZ keyboards? And easier to type on a mobile phone (no uppercase)? Alternatively, with the characters you list and just those?
You don’t want to choose a number of characters, how many digits and special characters should appear (or any nonsensical policy when you know what you are doing), but rather would rely solely on the number of bits of entropy you’ll get?
Generated from /dev/random, as it’s a good source of entropy (under a recent Linux kernel at least).