I remember going to the Pasadena Public Library as a kid (90s) and there were terminals everywhere for interfacing with the digital card catalog system. Pretty sure they were made by Digital/DEC. The black screens with orange glowing text were such a pleasure to play around with. I've been thinking it would be fun to have one of these in my house 24x7 to interface with a Home Assistant TUI.
I struggle to remember myself... but I found this earlier today:
"The years of 1995 and 1996 brought many technological improvements to the Library including the addition of InfoTrac SearchBank, a computerized magazine and newspaper index; ADVANCE, a new Unix-based online library catalog; public access to the Internet with terminals at all library locations;"
I can't believe that people are this blasé about their privacy. Once something like images of your home are in the cloud you no longer control them. We should be fiercely guarding our privacy and our ability to not be monitored.
I don't think you will ever see this normalized, because it's a really dumb idea.
You certainly can observe a correlation between a "corporate customer" and MDM/GPO and use that as a heuristic. But it's like relying on the color of the sky to determine temperature: "Is it grey? Well then it's obviously cold." It's a leaky abstraction.
Cool thing about DuckDB is it can be embedded. We have a data pipeline that produces a duckdb file and puts it on S3. The app periodically checks that assets etag and pulls it down when it changes. Most of our DB interactions use PSQL, but we have one module that leverages DuckDB and this file for reads. So it's definitely not all-or-nothing.
I have been meaning to explore Nim for a while because it feels like "golang, but python syntax and dev experience." I vibe coded a simple tool, tt, that allows me to track time to a central log from all my devices. Realllly simple:
$ tt stats
Time Tracking Stats
Total entries: 39
First entry: Oct 21, 2025 23:04
Last entry: Oct 30, 2025 18:29
Tracking since: 228h 34m
Days tracked: 5
$ tt "working on xyz today"
Logged at 11:38:44
$ tt today
Today (1 entries)
11:38:44 working on xyz today
The code is pretty damn ugly though, I feel like I am working with perl:
proc groupIntoThreads(entries: seq[Entry], threshold: Duration): seq[seq[Entry]] =
if entries.len == 0:
return @[]
var sorted = entries
sorted.sort(proc (a, b: Entry): int =
if a.timestamp < b.timestamp: -1
elif a.timestamp > b.timestamp: 1
else: 0
)
result = @[]
var currentThread = @[sorted[0]]
for i in 1..<sorted.len:
let gap = sorted[i].timestamp - sorted[i-1].timestamp
if gap > threshold:
result.add(currentThread)
currentThread = @[sorted[i]]
else:
currentThread.add(sorted[i])
if currentThread.len > 0:
result.add(currentThread)
What are the `@` characters for? Are they what makes it feel like Perl?
Because other than them I don’t think the equivalent Python code would look much different. Maybe more concise, e.g. you could replace the second section with something like `sorted = entries.sorted(key=lambda entry: entry.timestamp)`.
There are shorter options in Nim too, depending on your stylistic preferences
let sorted = entries.sorted(proc (a, b: Entry): int = cmp(a.timestamp, b.timestamp))
let sorted = entries.sorted((a, b) => cmp(a.timestamp, b.timestamp))
let sorted = entries.sortedByIt(it.timestamp)
I suppose you could change the whole proc to something like
proc groupIntoThreads(entries: seq[Entry], threshold: int): seq[seq[Entry]] =
let sorted = entries.sortedByIt(it.timestamp)
for i, entry in sorted:
if i == 0 or entry.timestamp - sorted[i - 1].timestamp > threshold:
result.add(@[sorted[i]])
else:
result[^1].add(sorted[i])
@[] is syntax for a "seq", which is similar to a C++ vector, ArrayList in Java/C#, or a python list. It's a heap-allocated array that automatically resizes.
In contrast with [], which is mostly identical to a C array: fixed size and lives on the stack.