PhilipMat

TIL: Getting VS Code running on (fresh) Linux Mint v22.3

The first step of Visual Studio Code install is deceptively simple: download the .deb file, double-click to open.

Trying to log into accounts causes a notification/error:

You’re running in a GNOME environment but the OS keyring is not available for encryption. Ensure you have gnome-keyring or another libsecret compatible implementation installed and running.

The keyring troubleshooting page provides some clues but it’s a bit clumsy to figure it out.

  1. Problem 1: libsecret is not installed on a fresh Linux Mint v22.3.
    Solution: install with apt install libsecret-1-0 libsecret-1-dev libsecret-tools (not sure all of them are required).
  2. A bit buried in the docs is this bit: “and ensure the default keyring (usually referred to as Login keyring) is unlocked”.
    Problem 2: there was no “Login” password keyring visible in Seahorse (the keyring manager).
    Solution: First, it’s very possible a restart (of gnome-keyring) after installing libsecret might have auto-fixed this issue, but I went ahead to try to create that and failed: the UI was not showing the new keyring, so restart was in the cards anyway.
    After restarting the computer, I was able to create the new Login password keyring and Visual Studio Code worked without any issues. It didn’t even require the --password-store="gnome-keyring" argument or startup setting.

Also thanks to this SO answer and this one too.

TIL: Setting up Claude Code with Azure Foundry models

Claude has documentation on this, but I find the Azure Foundry’s documentation more useful because the instructions are more up-to-date with their UI (currently changing once more).

The one thing I wasn’t so comfortable with is setting the keys and all in env vars. If any process has access to the environment, it can extricate these values, even by mistake, and that’s not desirable.

Luckily, the ~/.claude/settings.json file support settings these, so here’s my example:

{
  "env": {
    "CLAUDE_CODE_USE_FOUNDRY": 1,
    "ANTHROPIC_FOUNDRY_BASE_URL": " https://<project-name>-resource.services.ai.azure.com/anthropic",
    "ANTHROPIC_FOUNDRY_API_KEY": "<key>",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-6"
  }
}

Couple of notes:

  1. You can set either ANTHROPIC_FOUNDRY_RESOURCE or ANTHROPIC_FOUNDRY_BASE_URL. It’s a bit confusing because you create a project, say named foo-bar in Foundry, but the resource name is foo-bar-resource.
    At the end of the day copying the URL from the Foundry site seemed more straightforward.
  2. I think it’s advisable to set names of the models deployed explicitly, hence ANTHROPIC_DEFAULT_SONNET_MODEL because Claude Code may have different defaults.
    I got this message on my first run: “The model claude-sonnet-4-5 is not available on your foundry deployment. Try /model to switch to claude-sonnet-4, or ask your admin to enable this model.”, and, fair enough, I had claude-sonnet-4-6 deployed.
Tags: til, ai, azure, llm, security

TIL: Pairing a Logitech K380 keyboard on Linux Mint

The Bluetooth Manager in Linux Mint 22.3 detects the Logitech K380 keyboard, but doesn’t display the pairing code, or doesn’t display it for long enough (supposedly 10 seconds, but I didn’t see it at all).

There are two approaches:

  1. The script from ValeriaRoyal/logitech-k380-bluetooth-linux-fix is the simplest version. Scans for the code and gives you 60 seconds to enter it.
    I didn’t try this one, but if I were to do it again it would be my first option.

  2. From this StackExchange answer – using bluetoothctl, which comes installed on Linux Mint.

For the latter, the steps are:

$ bluetoothctl
Agent registered

[some prompt]# agent on
Agent is already registered

[some prompt]# scan on
Discovery started
....

Pay attention in the output for the input-keyboard line and get its MAC address. Then turn the scan off and pair the device:

[some prompt]# scan off
Discovery stopped
[some prompt]# trust <mac address>
...
[some prompt]# pair <mac address>
pair <mac address>
Attempting to pair with <mac address>
[CHG] Device <mac address> Connected: yes
[Keyboard K380]# [agent] Passkey: 987123

Enter the passkey it displays on your keyboard and it should be working!

"The machine didn't take your craft. You gave it up." -- David Abram

It’s a bit of a long essay by David Abram in which he argues that LLMs shifted where problems are solved, much the way we shifted to high-level languages or compiler.

I have been doing this for years, and the hardest parts of the job were never about typing out code. I have always struggled most with understanding systems, debugging things that made no sense, designing architectures that wouldn’t collapse under heavy load, and making decisions that would save months of pain later.

None of these problems can be solved LLMs. They can suggest code, help with boilerplate, sometimes can act as a sounding board. But they don’t understand the system, they don’t carry context in their “minds”, and they certianly [sic] don’t know why a decision is right or wrong.

I think that’s a solid argument.
However, at another level, code is a measurable output, while knowledge is not.

I have seen product owners/managers being mistaken about their level of “understanding the system” and think that with the help of an AI agent that “understanding” is trivial to transfer into some output (code).

And the most importantly, they don’t choose. That part is still yours. The real work of software development, the part that makes someone valuable, is knowing what should exist in the first place, and why.

Also fully agree with this, though I didn’t quite see it bare in practice in any environment. If that were true in the workforce, we would see a lot higher value assigned to long-timers who might have that knowledge, but are not interested in climbing up the ladder.
Based on my personal experience, “seniority” is more closely associated with demonstrating forward-looking coding and architectural skills rather than knowledge of the existing systems (and the choices made to get there); those tend to be mere by-products or “nice to haves”.

If you reduce yourself to “the one who types code,” then yes, you should feel obsolete. But don’t fool yourself any further: typing code that was never the essence of the craft.

This is a long standing argument that the “code” is an incidental side-product of software development; the main goal is satisfying product requirements. (And, cynically but no less true, in enterprise environments is about making your boss look good.)

The real danger is that people stop thinking. The actual trap is engineers letting the tool carry the cognitive load they were meant to build – The abdication of reason from within.

I’d argue that we see is a real transfer of “work” from engineers to product builders, the latter which (might) over-estimate their knowledge, and conclude they have no need of the former.

To take it one step further: if the decisions that built a system are encoded in some documentation – including product decision, architectural decisions, etc – and and LLM can look at those and the resulted code and explain “everything”, then where do the engineers David describes fit in?

Removing the menu icons in macOS Tahoe

Saw this advice from multiple sources, most pointing to @stroughtonsmith:

defaults write -g NSMenuEnableActionImages -bool NO followed by a computer restart results in the menu icons being hidden, except for when apps specifically overwrite this settings.

It even preserves the couple of instances you do want icons, like for window zoom/resize.

Firefox, for example, keeps icons for the Bookmarks menu entries. Finder keeps the icons for the specific locations under the Go menu.
iTerm2 doesn’t seem to be observing this setting as of v3.6.9, but a fix is in the works.

As Daring Fireball observes, Safari needs 26.4 to observe this preference.

Tags: til, macos, mac, terminal